From 4234059c82b41d199cc74961afcba5516be56d18 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 20 Oct 2025 20:20:02 +0000 Subject: [PATCH 1/2] Add screenshot generation to build process MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Install shot-scraper dependency in build.sh - Create generate_screenshots.py to capture 1024x768 0.9 quality JPEG screenshots - Screenshot filenames include SHA256 hash of HTML content (e.g., dot.{hash}.jpeg) - Skip screenshot generation if file with correct hash already exists - Update build_colophon.py to display screenshots floated right with max-width 50% - Screenshots saved in screenshots/ directory - Excludes index.html and colophon.html from screenshot generation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- build.sh | 5 ++- build_colophon.py | 46 +++++++++++++++++++++++ generate_screenshots.py | 83 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 1 deletion(-) create mode 100755 generate_screenshots.py diff --git a/build.sh b/build.sh index e2cf9bb..7b55acc 100755 --- a/build.sh +++ b/build.sh @@ -8,12 +8,15 @@ echo "=== Building tools.simonwillison.net for Cloudflare Pages ===" # Install Python dependencies echo "Installing Python dependencies..." -pip install --quiet markdown +pip install --quiet markdown shot-scraper # Run Python build scripts (but NOT write_docs.py which generates LLM descriptions) echo "Gathering links and metadata..." python gather_links.py +echo "Generating screenshots..." +python generate_screenshots.py + echo "Building colophon page..." python build_colophon.py diff --git a/build_colophon.py b/build_colophon.py index 0351e37..c759a71 100755 --- a/build_colophon.py +++ b/build_colophon.py @@ -5,6 +5,36 @@ import html from pathlib import Path import markdown +import hashlib + + +def get_file_hash(file_path): + """Calculate SHA256 hash of file content.""" + sha256_hash = hashlib.sha256() + with open(file_path, "rb") as f: + for byte_block in iter(lambda: f.read(4096), b""): + sha256_hash.update(byte_block) + return sha256_hash.hexdigest() + + +def get_screenshot_path(page_name): + """Get the screenshot path for a given HTML file.""" + # Check if the HTML file exists + html_path = Path(page_name) + if not html_path.exists(): + return None + + # Calculate the hash of the HTML file + file_hash = get_file_hash(html_path) + + # Build the expected screenshot path + screenshot_name = f"{html_path.stem}.{file_hash}.jpeg" + screenshot_path = Path("screenshots") / screenshot_name + + # Return the path if it exists, otherwise None + if screenshot_path.exists(): + return str(screenshot_path) + return None def format_commit_message(message): @@ -99,6 +129,15 @@ def get_most_recent_date(page_data): margin-bottom: 2rem; border-bottom: 1px solid #f0f0f0; padding-bottom: 1rem; + overflow: auto; + } + .tool-screenshot { + float: right; + max-width: 50%; + margin-left: 1rem; + margin-bottom: 1rem; + border: 1px solid #ddd; + border-radius: 4px; } .tool-name { font-weight: bold; @@ -210,9 +249,16 @@ def get_most_recent_date(page_data): commits = list(reversed(commits)) commit_count = len(commits) + # Get screenshot path if available + screenshot_path = get_screenshot_path(page_name) + screenshot_html = "" + if screenshot_path: + screenshot_html = f'Screenshot of {page_name.replace(' + # Modified tool heading with the new structure html_content += f"""
+ {screenshot_html}

# diff --git a/generate_screenshots.py b/generate_screenshots.py new file mode 100755 index 0000000..1a82a8c --- /dev/null +++ b/generate_screenshots.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Generate screenshots of all HTML tools using shot-scraper.""" +import hashlib +import subprocess +import sys +from pathlib import Path + + +def get_file_hash(file_path): + """Calculate SHA256 hash of file content.""" + sha256_hash = hashlib.sha256() + with open(file_path, "rb") as f: + for byte_block in iter(lambda: f.read(4096), b""): + sha256_hash.update(byte_block) + return sha256_hash.hexdigest() + + +def generate_screenshots(): + """Generate screenshots for all HTML tools.""" + # Create screenshots directory if it doesn't exist + screenshots_dir = Path("screenshots") + screenshots_dir.mkdir(exist_ok=True) + + # Find all HTML files except index.html and colophon.html + html_files = [ + f for f in Path(".").glob("*.html") + if f.name not in ["index.html", "colophon.html"] + ] + + print(f"Found {len(html_files)} HTML files to screenshot") + + # Check if shot-scraper is available + try: + subprocess.run( + ["shot-scraper", "--version"], + capture_output=True, + check=True + ) + except (subprocess.CalledProcessError, FileNotFoundError): + print("Error: shot-scraper is not installed or not available") + print("Install it with: pip install shot-scraper") + sys.exit(1) + + for html_file in sorted(html_files): + # Calculate hash of the file content + file_hash = get_file_hash(html_file) + + # Generate screenshot filename + screenshot_name = f"{html_file.stem}.{file_hash}.jpeg" + screenshot_path = screenshots_dir / screenshot_name + + # Skip if screenshot already exists + if screenshot_path.exists(): + print(f"Screenshot already exists: {screenshot_name}") + continue + + print(f"Generating screenshot for {html_file.name}...") + + # Generate the screenshot using shot-scraper + try: + subprocess.run( + [ + "shot-scraper", + str(html_file), + "--width", "1024", + "--height", "768", + "--quality", "90", + "--output", str(screenshot_path) + ], + check=True, + capture_output=True + ) + print(f" Created: {screenshot_name}") + except subprocess.CalledProcessError as e: + print(f" Error generating screenshot for {html_file.name}: {e}") + print(f" stdout: {e.stdout.decode()}") + print(f" stderr: {e.stderr.decode()}") + + print(f"\nScreenshot generation complete!") + + +if __name__ == "__main__": + generate_screenshots() From 8438a0e2dc384222524c9ff8ce29c08274f72631 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 21 Oct 2025 09:01:30 -0700 Subject: [PATCH 2/2] Sloccount uses WASM Perl now https://gistpreview.github.io/?0fc406a18e14a1f7d28bfff02a18eaaf#simonw/0fc406a18e14a1f7d28bfff02a18eaaf --- lib/README.md | 78 + lib/sloccount-perl.zip | Bin 0 -> 230459 bytes lib/webperl/LICENSE_artistic.txt | 158 + lib/webperl/LICENSE_gpl.txt | 281 + lib/webperl/emperl.data | 567811 ++++++++++++++++++++++++++++ lib/webperl/emperl.js | 1 + lib/webperl/emperl.wasm | Bin 0 -> 3734063 bytes lib/webperl/webperl.js | 388 + sloccount.html | 821 + 9 files changed, 569538 insertions(+) create mode 100644 lib/README.md create mode 100644 lib/sloccount-perl.zip create mode 100644 lib/webperl/LICENSE_artistic.txt create mode 100644 lib/webperl/LICENSE_gpl.txt create mode 100644 lib/webperl/emperl.data create mode 100644 lib/webperl/emperl.js create mode 100644 lib/webperl/emperl.wasm create mode 100644 lib/webperl/webperl.js create mode 100644 sloccount.html diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 0000000..a0a0ae6 --- /dev/null +++ b/lib/README.md @@ -0,0 +1,78 @@ +# Third-Party Libraries and Assets + +This directory contains third-party software components used in the SLOCCount web application. + +## WebPerl (v0.09-beta) + +**WebPerl** is a WebAssembly port of Perl 5, allowing Perl code to run in web browsers. + +- **Author**: Hauke Dämpfling (haukex@zero-g.net) +- **Institution**: Leibniz Institute of Freshwater Ecology and Inland Fisheries (IGB), Berlin, Germany +- **Copyright**: © 2018 Hauke Dämpfling +- **Source**: https://github.com/haukex/webperl +- **Website**: http://webperl.zero-g.net +- **Version**: v0.09-beta (prebuilt release from March 3, 2019) + +### License + +WebPerl is dual-licensed under the same terms as Perl 5 itself: + +- **GNU General Public License** (GPL) version 1 or later, OR +- **Artistic License** (which comes with Perl 5) + +You may choose either license. See `webperl/LICENSE_gpl.txt` and `webperl/LICENSE_artistic.txt` for full license texts. + +### Files Included + +- `webperl.js` - Main WebPerl loader +- `emperl.js` - Emscripten-compiled Perl JavaScript +- `emperl.wasm` - WebAssembly Perl binary +- `emperl.data` - Perl runtime data files +- `LICENSE_artistic.txt` - Artistic License text +- `LICENSE_gpl.txt` - GNU GPL text + +--- + +## SLOCCount + +**SLOCCount** (Source Lines of Code Count) is a suite of programs for counting physical source lines of code (SLOC) in large software systems. + +- **Original Author**: David A. Wheeler (dwheeler@dwheeler.com) +- **Maintainer**: Jeff Licquia +- **Copyright**: © 2001-2004 David A. Wheeler +- **Source**: https://github.com/licquia/sloccount +- **Commit Used**: `7220ff627334a8f646617fe0fa542d401fb5287e` + +### License + +SLOCCount is licensed under the **GNU General Public License version 2** (GPL-2.0). + +### Files Included + +- `sloccount-perl.zip` - Archive containing the Perl scripts from SLOCCount that implement the actual line counting algorithms + +The zip file includes various language-specific counting scripts (e.g., `python_count`, `c_count`, `perl_count`) and supporting utilities. + +--- + +## Attribution + +This SLOCCount web application makes use of: + +1. **WebPerl** for running Perl in the browser via WebAssembly +2. **SLOCCount Perl scripts** for accurate source line counting with comment filtering + +Both projects are used in accordance with their respective open-source licenses. No modifications have been made to the WebPerl runtime or SLOCCount scripts themselves. + +## Compliance Notes + +- WebPerl runtime files are distributed as-is from the official prebuilt v0.09-beta release +- SLOCCount scripts are loaded from the official repository commit `7220ff6` +- License files are preserved in their original locations +- This application is a web interface that uses these tools, not a modification of them + +## More Information + +- **WebPerl Documentation**: http://webperl.zero-g.net/using.html +- **SLOCCount Documentation**: https://github.com/licquia/sloccount/blob/master/README +- **COCOMO Cost Model**: The cost estimation feature uses the Basic COCOMO model as implemented in the original SLOCCount tool diff --git a/lib/sloccount-perl.zip b/lib/sloccount-perl.zip new file mode 100644 index 0000000000000000000000000000000000000000..b5981b2580f2534617c6520763f272bb54400a87 GIT binary patch literal 230459 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ç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

g$+9cMS`m0<-(25VlB~z(iIWC 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

$Can`phxyd^o;hHMLIfW3?2qc8@Nm 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 PQSj#+-YjSN5PHbJ@VNBU literal 0 HcmV?d00001 diff --git a/lib/webperl/LICENSE_artistic.txt b/lib/webperl/LICENSE_artistic.txt new file mode 100644 index 0000000..a37cee6 --- /dev/null +++ b/lib/webperl/LICENSE_artistic.txt @@ -0,0 +1,158 @@ +NAME + perlartistic - the Perl Artistic License + +SYNOPSIS + You can refer to this document in Pod via "L" + Or you can see this document by entering "perldoc perlartistic" + +DESCRIPTION + Perl is free software; you can redistribute it and/or modify it under + the terms of either: + + a) the GNU General Public License as published by the Free + Software Foundation; either version 1, or (at your option) any + later version, or + + b) the "Artistic License" which comes with this Kit. + + This is "The Artistic License". It's here so that modules, programs, + etc., that want to declare this as their distribution license can link + to it. + + For the GNU General Public License, see perlgpl. + +The "Artistic License" + Preamble + The intent of this document is to state the conditions under which a + Package may be copied, such that the Copyright Holder maintains some + semblance of artistic control over the development of the package, while + giving the users of the package the right to use and distribute the + Package in a more-or-less customary fashion, plus the right to make + reasonable modifications. + + Definitions + "Package" + refers to the collection of files distributed by the Copyright + Holder, and derivatives of that collection of files created through + textual modification. + + "Standard Version" + refers to such a Package if it has not been modified, or has been + modified in accordance with the wishes of the Copyright Holder as + specified below. + + "Copyright Holder" + is whoever is named in the copyright or copyrights for the package. + + "You" + is you, if you're thinking about copying or distributing this + Package. + + "Reasonable copying fee" + is whatever you can justify on the basis of media cost, duplication + charges, time of people involved, and so on. (You will not be + required to justify it to the Copyright Holder, but only to the + computing community at large as a market that must bear the fee.) + + "Freely Available" + means that no fee is charged for the item itself, though there may + be fees involved in handling the item. It also means that recipients + of the item may redistribute it under the same conditions they + received it. + + Conditions + 1. You may make and give away verbatim copies of the source form of the + Standard Version of this Package without restriction, provided that + you duplicate all of the original copyright notices and associated + disclaimers. + + 2. You may apply bug fixes, portability fixes and other modifications + derived from the Public Domain or from the Copyright Holder. A + Package modified in such a way shall still be considered the + Standard Version. + + 3. You may otherwise modify your copy of this Package in any way, + provided that you insert a prominent notice in each changed file + stating how and when you changed that file, and provided that you do + at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make + them Freely Available, such as by posting said modifications to + Usenet or an equivalent medium, or placing the modifications on + a major archive site such as uunet.uu.net, or by allowing the + Copyright Holder to include your modifications in the Standard + Version of the Package. + + b) use the modified Package only within your corporation or + organization. + + c) rename any non-standard executables so the names do not conflict + with standard executables, which must also be provided, and + provide a separate manual page for each non-standard executable + that clearly documents how it differs from the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + 4. You may distribute the programs of this Package in object code or + executable form, provided that you do at least ONE of the following: + + a) distribute a Standard Version of the executables and library + files, together with instructions (in the manual page or + equivalent) on where to get the Standard Version. + + b) accompany the distribution with the machine-readable source of + the Package with your modifications. + + c) give non-standard executables non-standard names, and clearly + document the differences in manual pages (or equivalent), + together with instructions on where to get the Standard Version. + + d) make other distribution arrangements with the Copyright Holder. + + 5. You may charge a reasonable copying fee for any distribution of this + Package. You may charge any fee you choose for support of this + Package. You may not charge a fee for this Package itself. However, + you may distribute this Package in aggregate with other (possibly + commercial) programs as part of a larger (possibly commercial) + software distribution provided that you do not advertise this + Package as a product of your own. You may embed this Package's + interpreter within an executable of yours (by linking); this shall + be construed as a mere form of aggregation, provided that the + complete Standard Version of the interpreter is so embedded. + + 6. The scripts and library files supplied as input to or produced as + output from the programs of this Package do not automatically fall + under the copyright of this Package, but belong to whoever generated + them, and may be sold commercially, and may be aggregated with this + Package. If such scripts or library files are aggregated with this + Package via the so-called "undump" or "unexec" methods of producing + a binary executable image, then distribution of such an image shall + neither be construed as a distribution of this Package nor shall it + fall under the restrictions of Paragraphs 3 and 4, provided that you + do not represent such an executable image as a Standard Version of + this Package. + + 7. C subroutines (or comparably compiled subroutines in other + languages) supplied by you and linked into this Package in order to + emulate subroutines and variables of the language defined by this + Package shall not be considered part of this Package, but are the + equivalent of input as in Paragraph 6, provided these subroutines do + not change the language in any way that would cause it to fail the + regression tests for the language. + + 8. Aggregation of this Package with a commercial distribution is always + permitted provided that the use of this Package is embedded; that + is, when no overt attempt is made to make this Package's interfaces + visible to the end user of the commercial distribution. Such use + shall not be construed as a distribution of this Package. + + 9. The name of the Copyright Holder may not be used to endorse or + promote products derived from this software without specific prior + written permission. + + 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED + WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + + The End + diff --git a/lib/webperl/LICENSE_gpl.txt b/lib/webperl/LICENSE_gpl.txt new file mode 100644 index 0000000..d29d956 --- /dev/null +++ b/lib/webperl/LICENSE_gpl.txt @@ -0,0 +1,281 @@ +NAME + perlgpl - the GNU General Public License, version 1 + +SYNOPSIS + You can refer to this document in Pod via "L" + Or you can see this document by entering "perldoc perlgpl" + +DESCRIPTION + Perl is free software; you can redistribute it and/or modify it under + the terms of either: + + a) the GNU General Public License as published by the Free + Software Foundation; either version 1, or (at your option) any + later version, or + + b) the "Artistic License" which comes with this Kit. + + This is the "GNU General Public License, version 1". It's here so that + modules, programs, etc., that want to declare this as their distribution + license can link to it. + + For the Perl Artistic License, see perlartistic. + +GNU GENERAL PUBLIC LICENSE + GNU GENERAL PUBLIC LICENSE + Version 1, February 1989 + + Copyright (C) 1989 Free Software Foundation, Inc. + 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The license agreements of most software companies try to keep users + at the mercy of those companies. By contrast, our General Public + License is intended to guarantee your freedom to share and change free + software--to make sure the software is free for all its users. The + General Public License applies to the Free Software Foundation's + software and to any other program whose authors commit to using it. + You can use it for your programs, too. + + When we speak of free software, we are referring to freedom, not + price. Specifically, the General Public License is designed to make + sure that you have the freedom to give away or sell copies of free + software, that you receive source code or can get it if you want it, + that you can change the software or use pieces of it in new free + programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid + anyone to deny you these rights or to ask you to surrender the rights. + These restrictions translate to certain responsibilities for you if you + distribute copies of the software, or if you modify it. + + For example, if you distribute copies of a such a program, whether + gratis or for a fee, you must give the recipients all the rights that + you have. You must make sure that they, too, receive or can get the + source code. And you must tell them their rights. + + We protect your rights with two steps: (1) copyright the software, + and (2) offer you this license which gives you legal permission to + copy, distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain + that everyone understands that there is no warranty for this free + software. If the software is modified by someone else and passed on, + we want its recipients to know that what they have is not the original, + so that any problems introduced by others will not reflect on the + original authors' reputations. + + The precise terms and conditions for copying, distribution and + modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any program or other work which + contains a notice placed by the copyright holder saying it may be + distributed under the terms of this General Public License. The + "Program", below, refers to any such program or work, and a "work based + on the Program" means either the Program or any work containing the + Program or a portion of it, either verbatim or with modifications. + Each licensee is addressed as "you". + + 1. You may copy and distribute verbatim copies of the Program's + 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 General Public License and to the absence of + any warranty; and give any other recipients of the Program a copy of + this General Public License along with the Program. You may charge a + fee for the physical act of transferring a copy. + + 2. You may modify your copy or copies of the Program or any portion + of it, and copy and distribute such modifications under the terms of + Paragraph 1 above, provided that you also do the following: + + a) cause the modified files to carry prominent notices stating that + you changed the files and the date of any change; and + + b) cause the whole of any work that you distribute or publish, that + in whole or in part contains the Program or any part thereof, + either with or without modifications, to be licensed at no charge + to all third parties under the terms of this General Public License + (except that you may choose to grant warranty protection to some or + all third parties, at your option). + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the simplest and most usual way, to print or + display an announcement including an appropriate copyright notice + and a notice that there is no warranty (or else, saying that you + provide a warranty) and that users may redistribute the program + under these conditions, and telling the user how to view a copy of + this General Public License. + + d) 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. + + Mere aggregation of another independent work with the Program (or its + derivative) on a volume of a storage or distribution medium does not + bring the other work under the scope of these terms. + + 3. You may copy and distribute the Program (or a portion or + derivative of it, under Paragraph 2) in object code or executable form + under the terms of Paragraphs 1 and 2 above provided that you also do + one of the following: + + a) accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Paragraphs 1 and 2 above; or, + + b) accompany it with a written offer, valid for at least three + years, to give any third party free (except for a nominal charge + for the cost of distribution) a complete machine-readable copy of + the corresponding source code, to be distributed under the terms of + Paragraphs 1 and 2 above; or, + + c) accompany it with the information you received as to where the + corresponding source code may be obtained. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form alone.) + + Source code for a work means the preferred form of the work for making + modifications to it. For an executable file, complete source code + means all the source code for all modules it contains; but, as a + special exception, it need not include source code for modules which + are standard libraries that accompany the operating system on which the + executable file runs, or for standard header files or definitions files + that accompany that operating system. + + 4. You may not copy, modify, sublicense, distribute or transfer the + Program except as expressly provided under this General Public License. + Any attempt otherwise to copy, modify, sublicense, distribute or + transfer the Program is void, and will automatically terminate your + rights to use the Program under this License. However, parties who + have received copies, or rights to use copies, from you under this + General Public License will not have their licenses terminated so long + as such parties remain in full compliance. + + 5. By copying, distributing or modifying the Program (or any work + based on the Program) you indicate your acceptance of this license to + do so, and all its terms and conditions. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program subject to + these terms and conditions. You may not impose any further + restrictions on the recipients' exercise of the rights granted herein. + + 7. The Free Software Foundation may publish revised and/or new + versions of the 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 Program + specifies a version number of the 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 Program does not specify a + version number of the license, you may choose any version ever + published by the Free Software Foundation. + + 8. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, 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 + + 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. + EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR + OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS + WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 10. 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 PROGRAM 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 + PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF + SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest + possible use to humanity, the best way to achieve this is to make it + free software which everyone can redistribute and change under these + terms. + + To do so, attach the following notices to the program. It is safest + to attach them to the start of each source file to most effectively + convey the exclusion of warranty; and each file should have at least + the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) 19yy + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 1, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA + 02110-1301 USA + + + Also add information on how to contact you by electronic and paper + mail. + + If the program is interactive, make it output a short notice like this + when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19xx name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type + 'show w'. This is free software, and you are welcome to + redistribute it under certain conditions; type 'show c' for + details. + + The hypothetical commands 'show w' and 'show c' should show the + appropriate parts of the General Public License. Of course, the + commands you use may be called something other than 'show w' and 'show + c'; they could even be mouse-clicks or menu items--whatever suits your + program. + + You should also get your employer (if you work as a programmer) or your + school, if any, to sign a "copyright disclaimer" for the program, if + necessary. Here a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program 'Gnomovision' (a program to direct compilers to make passes + at assemblers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + + That's all there is to it! + diff --git a/lib/webperl/emperl.data b/lib/webperl/emperl.data new file mode 100644 index 0000000..8db44a4 --- /dev/null +++ b/lib/webperl/emperl.data @@ -0,0 +1,567811 @@ +use warnings; +use 5.028; +use Test::More; + +=head1 SYNOPSIS + +Tests for F, to be run in the browser. + +=head1 Author, Copyright, and License + +B<< WebPerl - L >> + +Copyright (c) 2018 Hauke Daempfling (haukex@zero-g.net) +at the Leibniz Institute of Freshwater Ecology and Inland Fisheries (IGB), +Berlin, Germany, L + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl 5 itself: either the GNU General Public +License as published by the Free Software Foundation (either version 1, +or, at your option, any later version), or the "Artistic License" which +comes with Perl 5. + +This program is distributed in the hope that it will be useful, but +B; without even the implied warranty of +B. +See the licenses for details. + +You should have received a copy of the licenses along with this program. +If not, see L. + +=cut + +# A couple of debugging aides: +#$WebPerl::TRACE = 1; +#js('Perl.trace = true'); +#$Carp::Verbose = 1; # or: +#use Devel::StackTrace (); +#$SIG{__DIE__} = sub { die join '', shift, map {"\t".$_->as_string."\n"} +# Devel::StackTrace->new(skip_frames=>2)->frames }; + +BEGIN { use_ok('WebPerl', qw/ js encode_json sub1 /) } + +subtest 'basic js() tests' => sub { + is js(undef), undef, 'undef'; + is js(q{ undefined }), undef, 'undefined'; + is js(q{ true }), !0, 'true'; + is js(q{ false }), !1, 'false'; + is js(q{ 5 }), 5, 'number 1'; + is js(q{ 3.14159 }), 3.14159, 'number 2'; + is js(q{ 3.14159e6 }), 3.14159e6, 'number 3'; + is js(q{ 3.14159e60 }), 3.14159e60, 'number 4'; + is js(q{ "" }), "", 'string 1'; + is js(q{ "foo" }), "foo", 'string 2'; + is js(qq{"\0\\0\N{U+E4}\\u00E4"}), "\0\0\N{U+E4}\N{U+E4}", 'nuls and unicode'; #" +}; + +subtest 'basic function tests' => sub { + my $func = js(q{ (function (x,y) { return "x"+x+"y"+y+"z" }) }); + isa_ok $func, 'WebPerl::JSObject'; + is $func->("a","b"), "xaybz", 'func call'; + is js('(function (d) {return d})')->("\0\N{U+E4}\x{2665}"), + "\0\N{U+E4}\x{2665}", 'unicode passed as arg & rv'; + + my $pl = $func->toperl; + is ref $pl, 'CODE', 'toperl gives code ref'; + is $pl->('i','j'), 'xiyjz', 'code ref works'; + + is js( '('.js([qw/foo bar quz/])->jscode.')[1]' ), "bar", 'basic jscode test'; + ok js( '('.js('document')->jscode.')===('.js('document')->jscode.')' ), 'jscode equality test'; + ok !js( '('.js('document')->jscode.')===('.js('window')->jscode.')' ), 'jscode inequality test'; +}; + +subtest 'basic array test' => sub { + my $arr = js(q{ testarray = [3,1,4,1,5,9]; (testarray) }); + isa_ok $arr, 'WebPerl::JSObject'; + is_deeply [@$arr], [3,1,4,1,5,9], 'array values'; + $arr->[4] = 'x'; + is js('testarray[4]'), 'x', 'setting successful'; + + my $ref = $arr->arrayref; + is_deeply $ref, [3,1,4,1,'x',9], 'arrayref values'; + is ref $ref, 'ARRAY', 'arrayref gives arrayref'; + isa_ok tied(@$ref), 'WebPerl::JSObject::TiedArray'; + $ref->[5] = 'y'; + is js('testarray[5]'), 'y', 'setting successful 2'; + + my $plain = $arr->toperl; + is_deeply $plain, [3,1,4,1,'x','y'], 'toperl values'; + is ref $plain, 'ARRAY', 'toperl gives arrayref'; + ok !tied(@$plain), 'toperl result isn\'t tied'; +}; + +subtest 'basic object test' => sub { + my $obj = js(q{ ({ hello: "world!", foo : function () { return "foobar!" } }) }); + isa_ok $obj, 'WebPerl::JSObject'; + is_deeply [sort keys %$obj], ['foo','hello'], 'keys on object'; + is $obj->{hello}, "world!", 'simple object value'; + isa_ok $obj->{foo}, 'WebPerl::JSObject'; + is $obj->foo, 'foobar!', 'method call'; +}; + +subtest 'encode_json' => sub { + my $json = encode_json( { Hello=>"World!" } ); + my $jo = js( "($json)" ); + isa_ok $jo, 'WebPerl::JSObject', 'json'; + is $jo->{Hello}, 'World!', 'json object key/value'; +}; + +subtest 'advanced function tests' => sub { + js(' (function (cb) { cb("yup") }) ') + ->( sub1 { + is shift, "yup", "calling between JS<->Perl"; + } ); + my $passthru = + js(q{ (function (cb) { var rv = cb({hello:"world"}); return rv } ) }) + ->(sub { return shift }); + isa_ok $passthru, 'WebPerl::JSObject', 'passthru worked 1'; + is $passthru->{hello}, 'world', 'passthru worked 2'; +}; + +done_testing; + +note "All tests passed!" if Test::More->builder->is_passing; + +# -*- buffer-read-only: t -*- +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by regen/warnings.pl. +# Any changes made here will be lost! + +package warnings; + +our $VERSION = "1.42"; + +# Verify that we're called correctly so that warnings will work. +# Can't use Carp, since Carp uses us! +# String regexps because constant folding = smaller optree = less memory vs regexp literal +# see also strict.pm. +die sprintf "Incorrect use of pragma '%s' at %s line %d.\n", __PACKAGE__, +(caller)[1,2] + if __FILE__ !~ ( '(?x) \b '.__PACKAGE__.' \.pmc? \z' ) + && __FILE__ =~ ( '(?x) \b (?i:'.__PACKAGE__.') \.pmc? \z' ); + +our %Offsets = ( + # Warnings Categories added in Perl 5.008 + 'all' => 0, + 'closure' => 2, + 'deprecated' => 4, + 'exiting' => 6, + 'glob' => 8, + 'io' => 10, + 'closed' => 12, + 'exec' => 14, + 'layer' => 16, + 'newline' => 18, + 'pipe' => 20, + 'unopened' => 22, + 'misc' => 24, + 'numeric' => 26, + 'once' => 28, + 'overflow' => 30, + 'pack' => 32, + 'portable' => 34, + 'recursion' => 36, + 'redefine' => 38, + 'regexp' => 40, + 'severe' => 42, + 'debugging' => 44, + 'inplace' => 46, + 'internal' => 48, + 'malloc' => 50, + 'signal' => 52, + 'substr' => 54, + 'syntax' => 56, + 'ambiguous' => 58, + 'bareword' => 60, + 'digit' => 62, + 'parenthesis' => 64, + 'precedence' => 66, + 'printf' => 68, + 'prototype' => 70, + 'qw' => 72, + 'reserved' => 74, + 'semicolon' => 76, + 'taint' => 78, + 'threads' => 80, + 'uninitialized' => 82, + 'unpack' => 84, + 'untie' => 86, + 'utf8' => 88, + 'void' => 90, + + # Warnings Categories added in Perl 5.011 + 'imprecision' => 92, + 'illegalproto' => 94, + + # Warnings Categories added in Perl 5.013 + 'non_unicode' => 96, + 'nonchar' => 98, + 'surrogate' => 100, + + # Warnings Categories added in Perl 5.017 + 'experimental' => 102, + 'experimental::lexical_subs' => 104, + 'experimental::regex_sets' => 106, + 'experimental::smartmatch' => 108, + + # Warnings Categories added in Perl 5.019 + 'experimental::postderef' => 110, + 'experimental::signatures' => 112, + 'syscalls' => 114, + + # Warnings Categories added in Perl 5.021 + 'experimental::bitwise' => 116, + 'experimental::const_attr' => 118, + 'experimental::re_strict' => 120, + 'experimental::refaliasing' => 122, + 'experimental::win32_perlio' => 124, + 'locale' => 126, + 'missing' => 128, + 'redundant' => 130, + + # Warnings Categories added in Perl 5.025 + 'experimental::declared_refs' => 132, + + # Warnings Categories added in Perl 5.027 + 'experimental::alpha_assertions' => 134, + 'experimental::script_run' => 136, + 'shadow' => 138, +); + +our %Bits = ( + 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55", # [0..71] + 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29] + 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30] + 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] + 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] + 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] + 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] + 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] + 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x55\x51\x15\x50\x01", # [51..56,58..62,66..68] + 'experimental::alpha_assertions' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [67] + 'experimental::bitwise' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [58] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [59] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [66] + 'experimental::lexical_subs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00", # [52] + 'experimental::postderef' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [55] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [60] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [61] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [53] + 'experimental::script_run' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [68] + 'experimental::signatures' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [56] + 'experimental::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [54] + 'experimental::win32_perlio' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [62] + 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] + 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [47] + 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [46] + 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] + 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] + 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [5..11,57] + 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [63] + 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] + 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [64] + 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [48] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [49] + 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] + 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] + 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] + 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16] + 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32] + 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] + 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17] + 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33] + 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34] + 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35] + 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [36] + 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] + 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [65] + 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] + 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [37] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [38] + 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [69] + 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] + 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [50] + 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x40\x00\x00\x00\x00\x00\x00", # [28..38,47] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [57] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [39] + 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [40] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [41] + 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] + 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [42] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [43] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x15\x00\x00\x00\x00\x00", # [44,48..50] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00", # [45] +); + +our %DeadBits = ( + 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", # [0..71] + 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [29] + 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [30] + 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] + 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] + 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [22] + 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] + 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [31] + 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] + 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] + 'experimental' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xaa\xa2\x2a\xa0\x02", # [51..56,58..62,66..68] + 'experimental::alpha_assertions' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [67] + 'experimental::bitwise' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [58] + 'experimental::const_attr' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [59] + 'experimental::declared_refs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [66] + 'experimental::lexical_subs' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00", # [52] + 'experimental::postderef' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [55] + 'experimental::re_strict' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [60] + 'experimental::refaliasing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [61] + 'experimental::regex_sets' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [53] + 'experimental::script_run' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [68] + 'experimental::signatures' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [56] + 'experimental::smartmatch' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [54] + 'experimental::win32_perlio' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [62] + 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] + 'illegalproto' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [47] + 'imprecision' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [46] + 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [23] + 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [24] + 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [5..11,57] + 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] + 'locale' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [63] + 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [25] + 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [12] + 'missing' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [64] + 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] + 'non_unicode' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [48] + 'nonchar' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [49] + 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [13] + 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [14] + 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [15] + 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [16] + 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [32] + 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] + 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [17] + 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [33] + 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [34] + 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [35] + 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [36] + 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [18] + 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [19] + 'redundant' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [65] + 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [20] + 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [37] + 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [38] + 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [21..25] + 'shadow' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [69] + 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [26] + 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [27] + 'surrogate' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [50] + 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x80\x00\x00\x00\x00\x00\x00", # [28..38,47] + 'syscalls' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [57] + 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [39] + 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [40] + 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [41] + 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] + 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [42] + 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [43] + 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x2a\x00\x00\x00\x00\x00", # [44,48..50] + 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00", # [45] +); + +# These are used by various things, including our own tests +our $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; +our $DEFAULT = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x51\x55\x50\x01", # [2,4,22,23,25,52..56,58..63,66..68] +our $LAST_BIT = 140 ; +our $BYTES = 18 ; + +sub Croaker +{ + require Carp; # this initializes %CarpInternal + local $Carp::CarpInternal{'warnings'}; + delete $Carp::CarpInternal{'warnings'}; + Carp::croak(@_); +} + +sub _expand_bits { + my $bits = shift; + my $want_len = ($LAST_BIT + 7) >> 3; + my $len = length($bits); + if ($len != $want_len) { + if ($bits eq "") { + $bits = "\x00" x $want_len; + } elsif ($len > $want_len) { + substr $bits, $want_len, $len-$want_len, ""; + } else { + my $a = vec($bits, $Offsets{all} >> 1, 2); + $a |= $a << 2; + $a |= $a << 4; + $bits .= chr($a) x ($want_len - $len); + } + } + return $bits; +} + +sub _bits { + my $mask = shift ; + my $catmask ; + my $fatal = 0 ; + my $no_fatal = 0 ; + + $mask = _expand_bits($mask); + foreach my $word ( @_ ) { + if ($word eq 'FATAL') { + $fatal = 1; + $no_fatal = 0; + } + elsif ($word eq 'NONFATAL') { + $fatal = 0; + $no_fatal = 1; + } + elsif ($catmask = $Bits{$word}) { + $mask |= $catmask ; + $mask |= $DeadBits{$word} if $fatal ; + $mask = ~(~$mask | $DeadBits{$word}) if $no_fatal ; + } + else + { Croaker("Unknown warnings category '$word'")} + } + + return $mask ; +} + +sub bits +{ + # called from B::Deparse.pm + push @_, 'all' unless @_ ; + return _bits("", @_) ; +} + +sub import +{ + shift; + + my $mask = ${^WARNING_BITS} // ($^W ? $Bits{all} : $DEFAULT) ; + + # append 'all' when implied (empty import list or after a lone + # "FATAL" or "NONFATAL") + push @_, 'all' + if !@_ || (@_==1 && ($_[0] eq 'FATAL' || $_[0] eq 'NONFATAL')); + + ${^WARNING_BITS} = _bits($mask, @_); +} + +sub unimport +{ + shift; + + my $catmask ; + my $mask = ${^WARNING_BITS} // ($^W ? $Bits{all} : $DEFAULT) ; + + # append 'all' when implied (empty import list or after a lone "FATAL") + push @_, 'all' if !@_ || @_==1 && $_[0] eq 'FATAL'; + + $mask = _expand_bits($mask); + foreach my $word ( @_ ) { + if ($word eq 'FATAL') { + next; + } + elsif ($catmask = $Bits{$word}) { + $mask = ~(~$mask | $catmask | $DeadBits{$word}); + } + else + { Croaker("Unknown warnings category '$word'")} + } + + ${^WARNING_BITS} = $mask ; +} + +my %builtin_type; @builtin_type{qw(SCALAR ARRAY HASH CODE REF GLOB LVALUE Regexp)} = (); + +sub LEVEL () { 8 }; +sub MESSAGE () { 4 }; +sub FATAL () { 2 }; +sub NORMAL () { 1 }; + +sub __chk +{ + my $category ; + my $offset ; + my $isobj = 0 ; + my $wanted = shift; + my $has_message = $wanted & MESSAGE; + my $has_level = $wanted & LEVEL ; + + if ($has_level) { + if (@_ != ($has_message ? 3 : 2)) { + my $sub = (caller 1)[3]; + my $syntax = $has_message + ? "category, level, 'message'" + : 'category, level'; + Croaker("Usage: $sub($syntax)"); + } + } + elsif (not @_ == 1 || @_ == ($has_message ? 2 : 0)) { + my $sub = (caller 1)[3]; + my $syntax = $has_message ? "[category,] 'message'" : '[category]'; + Croaker("Usage: $sub($syntax)"); + } + + my $message = pop if $has_message; + + if (@_) { + # check the category supplied. + $category = shift ; + if (my $type = ref $category) { + Croaker("not an object") + if exists $builtin_type{$type}; + $category = $type; + $isobj = 1 ; + } + $offset = $Offsets{$category}; + Croaker("Unknown warnings category '$category'") + unless defined $offset; + } + else { + $category = (caller(1))[0] ; + $offset = $Offsets{$category}; + Croaker("package '$category' not registered for warnings") + unless defined $offset ; + } + + my $i; + + if ($isobj) { + my $pkg; + $i = 2; + while (do { { package DB; $pkg = (caller($i++))[0] } } ) { + last unless @DB::args && $DB::args[0] =~ /^$category=/ ; + } + $i -= 2 ; + } + elsif ($has_level) { + $i = 2 + shift; + } + else { + $i = _error_loc(); # see where Carp will allocate the error + } + + # Default to 0 if caller returns nothing. Default to $DEFAULT if it + # explicitly returns undef. + my(@callers_bitmask) = (caller($i))[9] ; + my $callers_bitmask = + @callers_bitmask ? $callers_bitmask[0] // $DEFAULT : 0 ; + length($callers_bitmask) > ($offset >> 3) or $offset = $Offsets{all}; + + my @results; + foreach my $type (FATAL, NORMAL) { + next unless $wanted & $type; + + push @results, vec($callers_bitmask, $offset + $type - 1, 1); + } + + # &enabled and &fatal_enabled + return $results[0] unless $has_message; + + # &warnif, and the category is neither enabled as warning nor as fatal + return if ($wanted & (NORMAL | FATAL | MESSAGE)) + == (NORMAL | FATAL | MESSAGE) + && !($results[0] || $results[1]); + + # If we have an explicit level, bypass Carp. + if ($has_level and @callers_bitmask) { + # logic copied from util.c:mess_sv + my $stuff = " at " . join " line ", (caller $i)[1,2]; + $stuff .= sprintf ", <%s> %s %d", + *${^LAST_FH}{NAME}, + ($/ eq "\n" ? "line" : "chunk"), $. + if $. && ${^LAST_FH}; + die "$message$stuff.\n" if $results[0]; + return warn "$message$stuff.\n"; + } + + require Carp; + Carp::croak($message) if $results[0]; + # will always get here for &warn. will only get here for &warnif if the + # category is enabled + Carp::carp($message); +} + +sub _mkMask +{ + my ($bit) = @_; + my $mask = ""; + + vec($mask, $bit, 1) = 1; + return $mask; +} + +sub register_categories +{ + my @names = @_; + + for my $name (@names) { + if (! defined $Bits{$name}) { + $Offsets{$name} = $LAST_BIT; + $Bits{$name} = _mkMask($LAST_BIT++); + $DeadBits{$name} = _mkMask($LAST_BIT++); + if (length($Bits{$name}) > length($Bits{all})) { + $Bits{all} .= "\x55"; + $DeadBits{all} .= "\xaa"; + } + } + } +} + +sub _error_loc { + require Carp; + goto &Carp::short_error_loc; # don't introduce another stack frame +} + +sub enabled +{ + return __chk(NORMAL, @_); +} + +sub fatal_enabled +{ + return __chk(FATAL, @_); +} + +sub warn +{ + return __chk(FATAL | MESSAGE, @_); +} + +sub warnif +{ + return __chk(NORMAL | FATAL | MESSAGE, @_); +} + +sub enabled_at_level +{ + return __chk(NORMAL | LEVEL, @_); +} + +sub fatal_enabled_at_level +{ + return __chk(FATAL | LEVEL, @_); +} + +sub warn_at_level +{ + return __chk(FATAL | MESSAGE | LEVEL, @_); +} + +sub warnif_at_level +{ + return __chk(NORMAL | FATAL | MESSAGE | LEVEL, @_); +} + +# These are not part of any public interface, so we can delete them to save +# space. +delete @warnings::{qw(NORMAL FATAL MESSAGE LEVEL)}; + +1; +__END__ + +# ex: set ro: +package DBM_Filter ; + +use strict; +use warnings; +our $VERSION = '0.06'; + +package Tie::Hash ; + +use strict; +use warnings; + +use Carp; + + +our %LayerStack = (); +our %origDESTROY = (); + +our %Filters = map { $_, undef } qw( + Fetch_Key + Fetch_Value + Store_Key + Store_Value + ); + +our %Options = map { $_, 1 } qw( + fetch + store + ); + +#sub Filter_Enable +#{ +#} +# +#sub Filter_Disable +#{ +#} + +sub Filtered +{ + my $this = shift; + return defined $LayerStack{$this} ; +} + +sub Filter_Pop +{ + my $this = shift; + my $stack = $LayerStack{$this} || return undef ; + my $filter = pop @{ $stack }; + + # remove the filter hooks if this is the last filter to pop + if ( @{ $stack } == 0 ) { + $this->filter_store_key ( undef ); + $this->filter_store_value( undef ); + $this->filter_fetch_key ( undef ); + $this->filter_fetch_value( undef ); + delete $LayerStack{$this}; + } + + return $filter; +} + +sub Filter_Key_Push +{ + &_do_Filter_Push; +} + +sub Filter_Value_Push +{ + &_do_Filter_Push; +} + + +sub Filter_Push +{ + &_do_Filter_Push; +} + +sub _do_Filter_Push +{ + my $this = shift; + my %callbacks = (); + my $caller = (caller(1))[3]; + $caller =~ s/^.*:://; + + croak "$caller: no parameters present" unless @_ ; + + if ( ! $Options{lc $_[0]} ) { + my $class = shift; + my @params = @_; + + # if $class already contains "::", don't prefix "DBM_Filter::" + $class = "DBM_Filter::$class" unless $class =~ /::/; + + no strict 'refs'; + # does the "DBM_Filter::$class" exist? + if ( ! %{ "${class}::"} ) { + # Nope, so try to load it. + eval " require $class ; " ; + croak "$caller: Cannot Load DBM Filter '$class': $@" if $@; + } + + my $fetch = *{ "${class}::Fetch" }{CODE}; + my $store = *{ "${class}::Store" }{CODE}; + my $filter = *{ "${class}::Filter" }{CODE}; + use strict 'refs'; + + my $count = defined($filter) + defined($store) + defined($fetch) ; + + if ( $count == 0 ) + { croak "$caller: No methods (Filter, Fetch or Store) found in class '$class'" } + elsif ( $count == 1 && ! defined $filter) { + my $need = defined($fetch) ? 'Store' : 'Fetch'; + croak "$caller: Missing method '$need' in class '$class'" ; + } + elsif ( $count >= 2 && defined $filter) + { croak "$caller: Can't mix Filter with Store and Fetch in class '$class'" } + + if (defined $filter) { + my $callbacks = &{ $filter }(@params); + croak "$caller: '${class}::Filter' did not return a hash reference" + unless ref $callbacks && ref $callbacks eq 'HASH'; + %callbacks = %{ $callbacks } ; + } + else { + $callbacks{Fetch} = $fetch; + $callbacks{Store} = $store; + } + } + else { + croak "$caller: not even params" unless @_ % 2 == 0; + %callbacks = @_; + } + + my %filters = %Filters ; + my @got = (); + while (my ($k, $v) = each %callbacks ) + { + my $key = $k; + $k = lc $k; + if ($k eq 'fetch') { + push @got, 'Fetch'; + if ($caller eq 'Filter_Push') + { $filters{Fetch_Key} = $filters{Fetch_Value} = $v } + elsif ($caller eq 'Filter_Key_Push') + { $filters{Fetch_Key} = $v } + elsif ($caller eq 'Filter_Value_Push') + { $filters{Fetch_Value} = $v } + } + elsif ($k eq 'store') { + push @got, 'Store'; + if ($caller eq 'Filter_Push') + { $filters{Store_Key} = $filters{Store_Value} = $v } + elsif ($caller eq 'Filter_Key_Push') + { $filters{Store_Key} = $v } + elsif ($caller eq 'Filter_Value_Push') + { $filters{Store_Value} = $v } + } + else + { croak "$caller: Unknown key '$key'" } + + croak "$caller: value associated with key '$key' is not a code reference" + unless ref $v && ref $v eq 'CODE'; + } + + if ( @got != 2 ) { + push @got, 'neither' if @got == 0 ; + croak "$caller: expected both Store & Fetch - got @got"; + } + + # remember the class + push @{ $LayerStack{$this} }, \%filters ; + + my $str_this = "$this" ; # Avoid a closure with $this in the subs below + + $this->filter_store_key ( sub { store_hook($str_this, 'Store_Key') }); + $this->filter_store_value( sub { store_hook($str_this, 'Store_Value') }); + $this->filter_fetch_key ( sub { fetch_hook($str_this, 'Fetch_Key') }); + $this->filter_fetch_value( sub { fetch_hook($str_this, 'Fetch_Value') }); + + # Hijack the callers DESTROY method + $this =~ /^(.*)=/; + my $type = $1 ; + no strict 'refs'; + if ( *{ "${type}::DESTROY" }{CODE} ne \&MyDESTROY ) + { + $origDESTROY{$type} = *{ "${type}::DESTROY" }{CODE}; + no warnings 'redefine'; + *{ "${type}::DESTROY" } = \&MyDESTROY ; + } +} + +sub store_hook +{ + my $this = shift ; + my $type = shift ; + foreach my $layer (@{ $LayerStack{$this} }) + { + &{ $layer->{$type} }() if defined $layer->{$type} ; + } +} + +sub fetch_hook +{ + my $this = shift ; + my $type = shift ; + foreach my $layer (reverse @{ $LayerStack{$this} }) + { + &{ $layer->{$type} }() if defined $layer->{$type} ; + } +} + +sub MyDESTROY +{ + my $this = shift ; + delete $LayerStack{$this} ; + + # call real DESTROY + $this =~ /^(.*)=/; + &{ $origDESTROY{$1} }($this); +} + +1; + +__END__ + +# Generated from XSLoader_pm.PL (resolved %Config::Config value) +# This file is unique for every OS + +package XSLoader; + +$VERSION = "0.30"; # remember to update version in POD! + +#use strict; + +package DynaLoader; + +# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. +# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB +boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && + !defined(&dl_error); +package XSLoader; + +sub load { + package DynaLoader; + + my ($caller, $modlibname) = caller(); + my $module = $caller; + + if (@_) { + $module = $_[0]; + } else { + $_[0] = $module; + } + + # work with static linking too + my $boots = "$module\::bootstrap"; + goto &$boots if defined &$boots; + + goto \&XSLoader::bootstrap_inherit unless $module and defined &dl_load_file; + + my @modparts = split(/::/,$module); + my $modfname = $modparts[-1]; + my $modfname_orig = $modfname; # For .bs file search + + # Some systems have restrictions on files names for DLL's etc. + # mod2fname returns appropriate file base name (typically truncated) + # It may also edit @modparts if required. + $modfname = &DynaLoader::mod2fname(\@modparts) if defined &DynaLoader::mod2fname; + + my $modpname = join('/',@modparts); + my $c = () = split(/::/,$caller,-1); + $modlibname =~ s,[\\/][^\\/]+$,, while $c--; # Q&D basename + # Does this look like a relative path? + if ($modlibname !~ m{^/}) { + # Someone may have a #line directive that changes the file name, or + # may be calling XSLoader::load from inside a string eval. We cer- + # tainly do not want to go loading some code that is not in @INC, + # as it could be untrusted. + # + # We could just fall back to DynaLoader here, but then the rest of + # this function would go untested in the perl core, since all @INC + # paths are relative during testing. That would be a time bomb + # waiting to happen, since bugs could be introduced into the code. + # + # So look through @INC to see if $modlibname is in it. A rela- + # tive $modlibname is not a common occurrence, so this block is + # not hot code. + FOUND: { + for (@INC) { + if ($_ eq $modlibname) { + last FOUND; + } + } + # Not found. Fall back to DynaLoader. + goto \&XSLoader::bootstrap_inherit; + } + } + my $file = "$modlibname/auto/$modpname/$modfname.none"; + +# print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug; + + # N.B. The .bs file does not following the naming convention used + # by mod2fname, so use the unedited version of the name. + + my $bs = "$modlibname/auto/$modpname/$modfname_orig.bs"; + + # This calls DynaLoader::bootstrap, which will load the .bs file if present + goto \&XSLoader::bootstrap_inherit if not -f $file or -s $bs; + + my $bootname = "boot_$module"; + $bootname =~ s/\W/_/g; + @DynaLoader::dl_require_symbols = ($bootname); + + my $boot_symbol_ref; + + # Many dynamic extension loading problems will appear to come from + # this section of code: XYZ failed at line 123 of DynaLoader.pm. + # Often these errors are actually occurring in the initialisation + # C code of the extension XS file. Perl reports the error as being + # in this perl code simply because this was the last perl code + # it executed. + + my $libref = dl_load_file($file, 0) or do { + require Carp; + Carp::croak("Can't load '$file' for module $module: " . dl_error()); + }; + push(@DynaLoader::dl_librefs,$libref); # record loaded object + + $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do { + require Carp; + Carp::croak("Can't find '$bootname' symbol in $file\n"); + }; + + push(@DynaLoader::dl_modules, $module); # record loaded module + + boot: + my $xs = dl_install_xsub($boots, $boot_symbol_ref, $file); + + # See comment block above + push(@DynaLoader::dl_shared_objects, $file); # record files loaded + return &$xs(@_); +} + +sub bootstrap_inherit { + require DynaLoader; + goto \&DynaLoader::bootstrap_inherit; +} + +1; + + +__END__ + +package bigrat; + +use 5.010; +use strict; +use warnings; + +our $VERSION = '0.49'; + +use Exporter; +our @ISA = qw( bigint ); +our @EXPORT_OK = qw( PI e bpi bexp hex oct ); +our @EXPORT = qw( inf NaN ); + +use overload; +use bigint (); + +############################################################################## + +BEGIN { + *inf = \&bigint::inf; + *NaN = \&bigint::NaN; + *hex = \&bigint::hex; + *oct = \&bigint::oct; +} + +# These are all alike, and thus faked by AUTOLOAD + +my @faked = qw/round_mode accuracy precision div_scale/; +our ($AUTOLOAD, $_lite); # _lite for testsuite + +sub AUTOLOAD { + my $name = $AUTOLOAD; + + $name =~ s/.*:://; # split package + no strict 'refs'; + foreach my $n (@faked) { + if ($n eq $name) { + *{"bigrat::$name"} = + sub { + my $self = shift; + no strict 'refs'; + if (defined $_[0]) { + Math::BigInt->$name($_[0]); + Math::BigFloat->$name($_[0]); + return Math::BigRat->$name($_[0]); + } + return Math::BigInt->$name(); + }; + return &$name; + } + } + + # delayed load of Carp and avoid recursion + require Carp; + Carp::croak ("Can't call bigrat\-\>$name, not a valid method"); +} + +sub unimport { + $^H{bigrat} = undef; # no longer in effect + overload::remove_constant('binary', '', 'float', '', 'integer'); +} + +sub in_effect { + my $level = shift || 0; + my $hinthash = (caller($level))[10]; + $hinthash->{bigrat}; +} + +############################################################################# + +sub import { + my $self = shift; + + # see also bignum->import() for additional comments + + $^H{bigrat} = 1; # we are in effect + + # for newer Perls always override hex() and oct() with a lexical version: + if ($] > 5.009004) { + bigint::_override(); + } + # some defaults + my $lib = ''; + my $lib_kind = 'try'; + my $upgrade = 'Math::BigFloat'; + + my @import = (':constant'); # drive it w/ constant + my @a = @_; + my $l = scalar @_; + my $j = 0; + my ($a, $p); + my ($ver, $trace); # version? trace? + for (my $i = 0; $i < $l ; $i++, $j++) { + if ($_[$i] eq 'upgrade') { + # this causes upgrading + $upgrade = $_[$i + 1]; # or undef to disable + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + } + elsif ($_[$i] =~ /^(l|lib|try|only)$/) { + # this causes a different low lib to take care... + $lib_kind = $1; + $lib_kind = 'lib' if $lib_kind eq 'l'; + $lib = $_[$i + 1] || ''; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } + elsif ($_[$i] =~ /^(a|accuracy)$/) { + $a = $_[$i + 1]; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } + elsif ($_[$i] =~ /^(p|precision)$/) { + $p = $_[$i + 1]; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } + elsif ($_[$i] =~ /^(v|version)$/) { + $ver = 1; + splice @a, $j, 1; + $j--; + } + elsif ($_[$i] =~ /^(t|trace)$/) { + $trace = 1; + splice @a, $j, 1; + $j--; + } + elsif ($_[$i] !~ /^(PI|e|bpi|bexp|hex|oct)\z/) { + die ("unknown option $_[$i]"); + } + } + my $class; + $_lite = 0; # using M::BI::L ? + if ($trace) { + require Math::BigInt::Trace; + $class = 'Math::BigInt::Trace'; + $upgrade = 'Math::BigFloat::Trace'; + } + else { + # see if we can find Math::BigInt::Lite + if (!defined $a && !defined $p) { # rounding won't work to well + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + if (eval { require Math::BigInt::Lite; 1 }) { + @import = (); # :constant in Lite, not MBI + Math::BigInt::Lite->import(':constant'); + $_lite = 1; # signal okay + } + } + require Math::BigInt if $_lite == 0; # not already loaded? + $class = 'Math::BigInt'; # regardless of MBIL or not + } + push @import, $lib_kind => $lib if $lib ne ''; + # Math::BigInt::Trace or plain Math::BigInt + $class->import(@import, upgrade => $upgrade); + + require Math::BigFloat; + Math::BigFloat->import(upgrade => 'Math::BigRat', ':constant'); + require Math::BigRat; + Math::BigRat->import(@import); + + bigrat->accuracy($a) if defined $a; + bigrat->precision($p) if defined $p; + if ($ver) { + print "bigrat\t\t\t v$VERSION\n"; + print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite; + print "Math::BigInt\t\t v$Math::BigInt::VERSION"; + my $config = Math::BigInt->config(); + print " lib => $config->{lib} v$config->{lib_version}\n"; + print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n"; + print "Math::BigRat\t\t v$Math::BigRat::VERSION\n"; + exit; + } + + # Take care of octal/hexadecimal constants + overload::constant binary => + sub { + bigint::_binary_constant(shift); + }; + + # if another big* was already loaded: + my ($package) = caller(); + + no strict 'refs'; + if (!defined *{"${package}::inf"}) { + $self->export_to_level(1, $self, @a); # export inf and NaN + } +} + +sub PI () { Math::BigFloat->new('3.141592653589793238462643383279502884197'); } +sub e () { Math::BigFloat->new('2.718281828459045235360287471352662497757'); } + +sub bpi ($) { + local $Math::BigFloat::upgrade; + Math::BigFloat->bpi(@_); +} + +sub bexp ($$) { + local $Math::BigFloat::upgrade; + my $x = Math::BigFloat->new($_[0]); + $x->bexp($_[1]); +} + +1; + +__END__ + +package Fatal; + +# ABSTRACT: Replace functions with equivalents which succeed or die + +use 5.008; # 5.8.x needed for autodie +use Carp; +use strict; +use warnings; +use Tie::RefHash; # To cache subroutine refs +use Config; +use Scalar::Util qw(set_prototype); + +use autodie::Util qw( + fill_protos + install_subs + make_core_trampoline + on_end_of_compile_scope +); + +use constant PERL510 => ( $] >= 5.010 ); + +use constant LEXICAL_TAG => q{:lexical}; +use constant VOID_TAG => q{:void}; +use constant INSIST_TAG => q{!}; + +# Keys for %Cached_fatalised_sub (used in 3rd level) +use constant CACHE_AUTODIE_LEAK_GUARD => 0; +use constant CACHE_FATAL_WRAPPER => 1; +use constant CACHE_FATAL_VOID => 2; + + +use constant ERROR_NOARGS => 'Cannot use lexical %s with no arguments'; +use constant ERROR_VOID_LEX => VOID_TAG.' cannot be used with lexical scope'; +use constant ERROR_LEX_FIRST => LEXICAL_TAG.' must be used as first argument'; +use constant ERROR_NO_LEX => "no %s can only start with ".LEXICAL_TAG; +use constant ERROR_BADNAME => "Bad subroutine name for %s: %s"; +use constant ERROR_NOTSUB => "%s is not a Perl subroutine"; +use constant ERROR_NOT_BUILT => "%s is neither a builtin, nor a Perl subroutine"; +use constant ERROR_NOHINTS => "No user hints defined for %s"; + +use constant ERROR_CANT_OVERRIDE => "Cannot make the non-overridable builtin %s fatal"; + +use constant ERROR_NO_IPC_SYS_SIMPLE => "IPC::System::Simple required for Fatalised/autodying system()"; + +use constant ERROR_IPC_SYS_SIMPLE_OLD => "IPC::System::Simple version %f required for Fatalised/autodying system(). We only have version %f"; + +use constant ERROR_AUTODIE_CONFLICT => q{"no autodie '%s'" is not allowed while "use Fatal '%s'" is in effect}; + +use constant ERROR_FATAL_CONFLICT => q{"use Fatal '%s'" is not allowed while "no autodie '%s'" is in effect}; + +use constant ERROR_58_HINTS => q{Non-subroutine %s hints for %s are not supported under Perl 5.8.x}; + +# Older versions of IPC::System::Simple don't support all the +# features we need. + +use constant MIN_IPC_SYS_SIMPLE_VER => 0.12; + +our $VERSION = '2.29'; # VERSION: Generated by DZP::OurPkg::Version + +our $Debug ||= 0; + +# EWOULDBLOCK values for systems that don't supply their own. +# Even though this is defined with our, that's to help our +# test code. Please don't rely upon this variable existing in +# the future. + +our %_EWOULDBLOCK = ( + MSWin32 => 33, +); + +$Carp::CarpInternal{'Fatal'} = 1; +$Carp::CarpInternal{'autodie'} = 1; +$Carp::CarpInternal{'autodie::exception'} = 1; + +# the linux parisc port has separate EAGAIN and EWOULDBLOCK, +# and the kernel returns EAGAIN +my $try_EAGAIN = ($^O eq 'linux' and $Config{archname} =~ /hppa|parisc/) ? 1 : 0; + +# We have some tags that can be passed in for use with import. +# These are all assumed to be CORE:: + +my %TAGS = ( + ':io' => [qw(:dbm :file :filesys :ipc :socket + read seek sysread syswrite sysseek )], + ':dbm' => [qw(dbmopen dbmclose)], + ':file' => [qw(open close flock sysopen fcntl binmode + ioctl truncate)], + ':filesys' => [qw(opendir closedir chdir link unlink rename mkdir + symlink rmdir readlink chmod chown utime)], + ':ipc' => [qw(:msg :semaphore :shm pipe kill)], + ':msg' => [qw(msgctl msgget msgrcv msgsnd)], + ':threads' => [qw(fork)], + ':semaphore'=>[qw(semctl semget semop)], + ':shm' => [qw(shmctl shmget shmread)], + ':system' => [qw(system exec)], + + # Can we use qw(getpeername getsockname)? What do they do on failure? + # TODO - Can socket return false? + ':socket' => [qw(accept bind connect getsockopt listen recv send + setsockopt shutdown socketpair)], + + # Our defaults don't include system(), because it depends upon + # an optional module, and it breaks the exotic form. + # + # This *may* change in the future. I'd love IPC::System::Simple + # to be a dependency rather than a recommendation, and hence for + # system() to be autodying by default. + + ':default' => [qw(:io :threads)], + + # Everything in v2.07 and before. This was :default less chmod and chown + ':v207' => [qw(:threads :dbm :socket read seek sysread + syswrite sysseek open close flock sysopen fcntl fileno + binmode ioctl truncate opendir closedir chdir link unlink + rename mkdir symlink rmdir readlink umask + :msg :semaphore :shm pipe)], + + # Chmod was added in 2.13 + ':v213' => [qw(:v207 chmod)], + + # chown, utime, kill were added in 2.14 + ':v214' => [qw(:v213 chown utime kill)], + + # umask was removed in 2.26 + ':v225' => [qw(:io :threads umask fileno)], + + # Version specific tags. These allow someone to specify + # use autodie qw(:1.994) and know exactly what they'll get. + + ':1.994' => [qw(:v207)], + ':1.995' => [qw(:v207)], + ':1.996' => [qw(:v207)], + ':1.997' => [qw(:v207)], + ':1.998' => [qw(:v207)], + ':1.999' => [qw(:v207)], + ':1.999_01' => [qw(:v207)], + ':2.00' => [qw(:v207)], + ':2.01' => [qw(:v207)], + ':2.02' => [qw(:v207)], + ':2.03' => [qw(:v207)], + ':2.04' => [qw(:v207)], + ':2.05' => [qw(:v207)], + ':2.06' => [qw(:v207)], + ':2.06_01' => [qw(:v207)], + ':2.07' => [qw(:v207)], # Last release without chmod + ':2.08' => [qw(:v213)], + ':2.09' => [qw(:v213)], + ':2.10' => [qw(:v213)], + ':2.11' => [qw(:v213)], + ':2.12' => [qw(:v213)], + ':2.13' => [qw(:v213)], # Last release without chown + ':2.14' => [qw(:v225)], + ':2.15' => [qw(:v225)], + ':2.16' => [qw(:v225)], + ':2.17' => [qw(:v225)], + ':2.18' => [qw(:v225)], + ':2.19' => [qw(:v225)], + ':2.20' => [qw(:v225)], + ':2.21' => [qw(:v225)], + ':2.22' => [qw(:v225)], + ':2.23' => [qw(:v225)], + ':2.24' => [qw(:v225)], + ':2.25' => [qw(:v225)], + ':2.26' => [qw(:default)], + ':2.27' => [qw(:default)], + ':2.28' => [qw(:default)], + ':2.29' => [qw(:default)], +); + + +{ + # Expand :all immediately by expanding and flattening all tags. + # _expand_tag is not really optimised for expanding the ":all" + # case (i.e. keys %TAGS, or values %TAGS for that matter), so we + # just do it here. + # + # NB: The %tag_cache/_expand_tag relies on $TAGS{':all'} being + # pre-expanded. + my %seen; + my @all = grep { + !/^:/ && !$seen{$_}++ + } map { @{$_} } values %TAGS; + $TAGS{':all'} = \@all; +} + +# This hash contains subroutines for which we should +# subroutine() // die() rather than subroutine() || die() + +my %Use_defined_or; + +# CORE::open returns undef on failure. It can legitimately return +# 0 on success, eg: open(my $fh, '-|') || exec(...); + +@Use_defined_or{qw( + CORE::fork + CORE::recv + CORE::send + CORE::open + CORE::fileno + CORE::read + CORE::readlink + CORE::sysread + CORE::syswrite + CORE::sysseek + CORE::umask +)} = (); + +# Some functions can return true because they changed *some* things, but +# not all of them. This is a list of offending functions, and how many +# items to subtract from @_ to determine the "success" value they return. + +my %Returns_num_things_changed = ( + 'CORE::chmod' => 1, + 'CORE::chown' => 2, + 'CORE::kill' => 1, # TODO: Could this return anything on negative args? + 'CORE::unlink' => 0, + 'CORE::utime' => 2, +); + +# Optional actions to take on the return value before returning it. + +my %Retval_action = ( + "CORE::open" => q{ + + # apply the open pragma from our caller + if( defined $retval && !( @_ >= 3 && $_[1] =~ /:/ )) { + # Get the caller's hint hash + my $hints = (caller 0)[10]; + + # Decide if we're reading or writing and apply the appropriate encoding + # These keys are undocumented. + # Match what PerlIO_context_layers() does. Read gets the read layer, + # everything else gets the write layer. + my $encoding = $_[1] =~ /^\+?>/ ? $hints->{"open>"} : $hints->{"open<"}; + + # Apply the encoding, if any. + if( $encoding ) { + binmode $_[0], $encoding; + } + } + +}, + "CORE::sysopen" => q{ + + # apply the open pragma from our caller + if( defined $retval ) { + # Get the caller's hint hash + my $hints = (caller 0)[10]; + + require Fcntl; + + # Decide if we're reading or writing and apply the appropriate encoding. + # Match what PerlIO_context_layers() does. Read gets the read layer, + # everything else gets the write layer. + my $open_read_only = !($_[2] ^ Fcntl::O_RDONLY()); + my $encoding = $open_read_only ? $hints->{"open<"} : $hints->{"open>"}; + + # Apply the encoding, if any. + if( $encoding ) { + binmode $_[0], $encoding; + } + } + +}, +); + +my %reusable_builtins; + +# "Wait!" I hear you cry, "truncate() and chdir() are not reuseable! They can +# take file and directory handles, which are package depedent." +# +# You would be correct, except that prototype() returns signatures which don't +# allow for passing of globs, and nobody's complained about that. You can +# still use \*FILEHANDLE, but that results in a reference coming through, +# and it's already pointing to the filehandle in the caller's packge, so +# it's all okay. + +@reusable_builtins{qw( + CORE::fork + CORE::kill + CORE::truncate + CORE::chdir + CORE::link + CORE::unlink + CORE::rename + CORE::mkdir + CORE::symlink + CORE::rmdir + CORE::readlink + CORE::umask + CORE::chmod + CORE::chown + CORE::utime + CORE::msgctl + CORE::msgget + CORE::msgrcv + CORE::msgsnd + CORE::semctl + CORE::semget + CORE::semop + CORE::shmctl + CORE::shmget + CORE::shmread + CORE::exec + CORE::system +)} = (); + +# Cached_fatalised_sub caches the various versions of our +# fatalised subs as they're produced. This means we don't +# have to build our own replacement of CORE::open and friends +# for every single package that wants to use them. + +my %Cached_fatalised_sub = (); + +# Every time we're called with package scope, we record the subroutine +# (including package or CORE::) in %Package_Fatal. This allows us +# to detect illegal combinations of autodie and Fatal, and makes sure +# we don't accidently make a Fatal function autodying (which isn't +# very useful). + +my %Package_Fatal = (); + +# The first time we're called with a user-sub, we cache it here. +# In the case of a "no autodie ..." we put back the cached copy. + +my %Original_user_sub = (); + +# Is_fatalised_sub simply records a big map of fatalised subroutine +# refs. It means we can avoid repeating work, or fatalising something +# we've already processed. + +my %Is_fatalised_sub = (); +tie %Is_fatalised_sub, 'Tie::RefHash'; + +# Our trampoline cache allows us to cache trampolines which are used to +# bounce leaked wrapped core subroutines to their actual core counterparts. + +my %Trampoline_cache; + +# A cache mapping "CORE::" to their prototype. Turns out that if +# you "use autodie;" enough times, this pays off. +my %CORE_prototype_cache; + +# We use our package in a few hash-keys. Having it in a scalar is +# convenient. The "guard $PACKAGE" string is used as a key when +# setting up lexical guards. + +my $PACKAGE = __PACKAGE__; +my $NO_PACKAGE = "no $PACKAGE"; # Used to detect 'no autodie' + +# Here's where all the magic happens when someone write 'use Fatal' +# or 'use autodie'. + +sub import { + my $class = shift(@_); + my @original_args = @_; + my $void = 0; + my $lexical = 0; + my $insist_hints = 0; + + my ($pkg, $filename) = caller(); + + @_ or return; # 'use Fatal' is a no-op. + + # If we see the :lexical flag, then _all_ arguments are + # changed lexically + + if ($_[0] eq LEXICAL_TAG) { + $lexical = 1; + shift @_; + + # It is currently an implementation detail that autodie is + # implemented as "use Fatal qw(:lexical ...)". For backwards + # compatibility, we allow it - but not without a warning. + # NB: Optimise for autodie as it is quite possibly the most + # freq. consumer of this case. + if ($class ne 'autodie' and not $class->isa('autodie')) { + if ($class eq 'Fatal') { + warnings::warnif( + 'deprecated', + '[deprecated] The "use Fatal qw(:lexical ...)" ' + . 'should be replaced by "use autodie qw(...)". ' + . 'Seen' # warnif appends " at <...>" + ); + } else { + warnings::warnif( + 'deprecated', + "[deprecated] The class/Package $class is a " + . 'subclass of Fatal and used the :lexical. ' + . 'If $class provides lexical error checking ' + . 'it should extend autodie instead of using :lexical. ' + . 'Seen' # warnif appends " at <...>" + ); + } + # "Promote" the call to autodie from here on. This is + # already mostly the case (e.g. use Fatal qw(:lexical ...) + # would throw autodie::exceptions on error rather than the + # Fatal errors. + $class = 'autodie'; + # This requires that autodie is in fact loaded; otherwise + # the "$class->X()" method calls below will explode. + require autodie; + # TODO, when autodie and Fatal are cleanly separated, we + # should go a "goto &autodie::import" here instead. + } + + # If we see no arguments and :lexical, we assume they + # wanted ':default'. + + if (@_ == 0) { + push(@_, ':default'); + } + + # Don't allow :lexical with :void, it's needlessly confusing. + if ( grep { $_ eq VOID_TAG } @_ ) { + croak(ERROR_VOID_LEX); + } + } + + if ( grep { $_ eq LEXICAL_TAG } @_ ) { + # If we see the lexical tag as the non-first argument, complain. + croak(ERROR_LEX_FIRST); + } + + my @fatalise_these = @_; + + # These subs will get unloaded at the end of lexical scope. + my %unload_later; + # These subs are to be installed into callers namespace. + my %install_subs; + + # Use _translate_import_args to expand tags for us. It will + # pass-through unknown tags (i.e. we have to manually handle + # VOID_TAG). + # + # NB: _translate_import_args re-orders everything for us, so + # we don't have to worry about stuff like: + # + # :default :void :io + # + # That will (correctly) translated into + # + # expand(:defaults-without-io) :void :io + # + # by _translate_import_args. + for my $func ($class->_translate_import_args(@fatalise_these)) { + + if ($func eq VOID_TAG) { + + # When we see :void, set the void flag. + $void = 1; + + } elsif ($func eq INSIST_TAG) { + + $insist_hints = 1; + + } else { + + # Otherwise, fatalise it. + + # Check to see if there's an insist flag at the front. + # If so, remove it, and insist we have hints for this sub. + my $insist_this = $insist_hints; + + if (substr($func, 0, 1) eq '!') { + $func = substr($func, 1); + $insist_this = 1; + } + + # We're going to make a subroutine fatalistic. + # However if we're being invoked with 'use Fatal qw(x)' + # and we've already been called with 'no autodie qw(x)' + # in the same scope, we consider this to be an error. + # Mixing Fatal and autodie effects was considered to be + # needlessly confusing on p5p. + + my $sub = $func; + $sub = "${pkg}::$sub" unless $sub =~ /::/; + + # If we're being called as Fatal, and we've previously + # had a 'no X' in scope for the subroutine, then complain + # bitterly. + + if (! $lexical and $^H{$NO_PACKAGE}{$sub}) { + croak(sprintf(ERROR_FATAL_CONFLICT, $func, $func)); + } + + # We're not being used in a confusing way, so make + # the sub fatal. Note that _make_fatal returns the + # old (original) version of the sub, or undef for + # built-ins. + + my $sub_ref = $class->_make_fatal( + $func, $pkg, $void, $lexical, $filename, + $insist_this, \%install_subs, + ); + + $Original_user_sub{$sub} ||= $sub_ref; + + # If we're making lexical changes, we need to arrange + # for them to be cleaned at the end of our scope, so + # record them here. + + $unload_later{$func} = $sub_ref if $lexical; + } + } + + install_subs($pkg, \%install_subs); + + if ($lexical) { + + # Dark magic to have autodie work under 5.8 + # Copied from namespace::clean, that copied it from + # autobox, that found it on an ancient scroll written + # in blood. + + # This magic bit causes %^H to be lexically scoped. + + $^H |= 0x020000; + + # Our package guard gets invoked when we leave our lexical + # scope. + + on_end_of_compile_scope(sub { + install_subs($pkg, \%unload_later); + }); + + # To allow others to determine when autodie was in scope, + # and with what arguments, we also set a %^H hint which + # is how we were called. + + # This feature should be considered EXPERIMENTAL, and + # may change without notice. Please e-mail pjf@cpan.org + # if you're actually using it. + + $^H{autodie} = "$PACKAGE @original_args"; + + } + + return; + +} + +sub unimport { + my $class = shift; + + # Calling "no Fatal" must start with ":lexical" + if ($_[0] ne LEXICAL_TAG) { + croak(sprintf(ERROR_NO_LEX,$class)); + } + + shift @_; # Remove :lexical + + my $pkg = (caller)[0]; + + # If we've been called with arguments, then the developer + # has explicitly stated 'no autodie qw(blah)', + # in which case, we disable Fatalistic behaviour for 'blah'. + + my @unimport_these = @_ ? @_ : ':all'; + my (%uninstall_subs, %reinstall_subs); + + for my $symbol ($class->_translate_import_args(@unimport_these)) { + + my $sub = $symbol; + $sub = "${pkg}::$sub" unless $sub =~ /::/; + + # If 'blah' was already enabled with Fatal (which has package + # scope) then, this is considered an error. + + if (exists $Package_Fatal{$sub}) { + croak(sprintf(ERROR_AUTODIE_CONFLICT,$symbol,$symbol)); + } + + # Record 'no autodie qw($sub)' as being in effect. + # This is to catch conflicting semantics elsewhere + # (eg, mixing Fatal with no autodie) + + $^H{$NO_PACKAGE}{$sub} = 1; + # Record the current sub to be reinstalled at end of scope + # and then restore the original (can be undef for "CORE::" + # subs) + $reinstall_subs{$symbol} = \&$sub; + $uninstall_subs{$symbol} = $Original_user_sub{$sub}; + + } + + install_subs($pkg, \%uninstall_subs); + on_end_of_compile_scope(sub { + install_subs($pkg, \%reinstall_subs); + }); + + return; + +} + +sub _translate_import_args { + my ($class, @args) = @_; + my @result; + my %seen; + + if (@args < 2) { + # Optimize for this case, as it is fairly common. (e.g. use + # autodie; or use autodie qw(:all); both trigger this). + return unless @args; + + # Not a (known) tag, pass through. + return @args unless exists($TAGS{$args[0]}); + + # Strip "CORE::" from all elements in the list as import and + # unimport does not handle the "CORE::" prefix too well. + # + # NB: we use substr as it is faster than s/^CORE::// and + # it does not change the elements. + return map { substr($_, 6) } @{ $class->_expand_tag($args[0]) }; + } + + # We want to translate + # + # :default :void :io + # + # into (pseudo-ish): + # + # expanded(:threads) :void expanded(:io) + # + # We accomplish this by "reverse, expand + filter, reverse". + for my $a (reverse(@args)) { + if (exists $TAGS{$a}) { + my $expanded = $class->_expand_tag($a); + push(@result, + # Remove duplicates after ... + grep { !$seen{$_}++ } + # we have stripped CORE:: (see above) + map { substr($_, 6) } + # We take the elements in reverse order + # (as @result be reversed later). + reverse(@{$expanded})); + } else { + # pass through - no filtering here for tags. + # + # The reason for not filtering tags cases like: + # + # ":default :void :io :void :threads" + # + # As we have reversed args, we see this as: + # + # ":threads :void :io :void* :default*" + # + # (Entries marked with "*" will be filtered out completely). When + # reversed again, this will be: + # + # ":io :void :threads" + # + # But we would rather want it to be: + # + # ":void :io :threads" or ":void :io :void :threads" + # + + my $letter = substr($a, 0, 1); + if ($letter ne ':' && $a ne INSIST_TAG) { + next if $seen{$a}++; + if ($letter eq '!' and $seen{substr($a, 1)}++) { + my $name = substr($a, 1); + # People are being silly and doing: + # + # use autodie qw(!a a); + # + # Enjoy this little O(n) clean up... + @result = grep { $_ ne $name } @result; + } + } + push @result, $a; + } + } + # Reverse the result to restore the input order + return reverse(@result); +} + + +# NB: Perl::Critic's dump-autodie-tag-contents depends upon this +# continuing to work. + +{ + # We assume that $TAGS{':all'} is pre-expanded and just fill it in + # from the beginning. + my %tag_cache = ( + 'all' => [map { "CORE::$_" } @{$TAGS{':all'}}], + ); + + # Expand a given tag (e.g. ":default") into a listref containing + # all sub names covered by that tag. Each sub is returned as + # "CORE::" (i.e. "CORE::open" rather than "open"). + # + # NB: the listref must not be modified. + sub _expand_tag { + my ($class, $tag) = @_; + + if (my $cached = $tag_cache{$tag}) { + return $cached; + } + + if (not exists $TAGS{$tag}) { + croak "Invalid exception class $tag"; + } + + my @to_process = @{$TAGS{$tag}}; + + # If the tag is basically an alias of another tag (like e.g. ":2.11"), + # then just share the resulting reference with the original content (so + # we only pay for an extra reference for the alias memory-wise). + if (@to_process == 1 && substr($to_process[0], 0, 1) eq ':') { + # We could do this for "non-tags" as well, but that only occurs + # once at the time of writing (":threads" => ["fork"]), so + # probably not worth it. + my $expanded = $class->_expand_tag($to_process[0]); + $tag_cache{$tag} = $expanded; + return $expanded; + } + + my %seen = (); + my @taglist = (); + + for my $item (@to_process) { + # substr is more efficient than m/^:/ for stuff like this, + # at the price of being a bit more verbose/low-level. + if (substr($item, 0, 1) eq ':') { + # Use recursion here to ensure we expand a tag at most once. + + my $expanded = $class->_expand_tag($item); + push @taglist, grep { !$seen{$_}++ } @{$expanded}; + } else { + my $subname = "CORE::$item"; + push @taglist, $subname + unless $seen{$subname}++; + } + } + + $tag_cache{$tag} = \@taglist; + + return \@taglist; + + } + +} + +# This is a backwards compatible version of _write_invocation. It's +# recommended you don't use it. + +sub write_invocation { + my ($core, $call, $name, $void, @args) = @_; + + return Fatal->_write_invocation( + $core, $call, $name, $void, + 0, # Lexical flag + undef, # Sub, unused in legacy mode + undef, # Subref, unused in legacy mode. + @args + ); +} + +# This version of _write_invocation is used internally. It's not +# recommended you call it from external code, as the interface WILL +# change in the future. + +sub _write_invocation { + + my ($class, $core, $call, $name, $void, $lexical, $sub, $sref, @argvs) = @_; + + if (@argvs == 1) { # No optional arguments + + my @argv = @{$argvs[0]}; + shift @argv; + + return $class->_one_invocation($core,$call,$name,$void,$sub,! $lexical, $sref, @argv); + + } else { + my $else = "\t"; + my (@out, @argv, $n); + while (@argvs) { + @argv = @{shift @argvs}; + $n = shift @argv; + + my $condition = "\@_ == $n"; + + if (@argv and $argv[-1] =~ /[#@]_/) { + # This argv ends with '@' in the prototype, so it matches + # any number of args >= the number of expressions in the + # argv. + $condition = "\@_ >= $n"; + } + + push @out, "${else}if ($condition) {\n"; + + $else = "\t} els"; + + push @out, $class->_one_invocation($core,$call,$name,$void,$sub,! $lexical, $sref, @argv); + } + push @out, qq[ + } + die "Internal error: $name(\@_): Do not expect to get ", scalar(\@_), " arguments"; + ]; + + return join '', @out; + } +} + + +# This is a slim interface to ensure backward compatibility with +# anyone doing very foolish things with old versions of Fatal. + +sub one_invocation { + my ($core, $call, $name, $void, @argv) = @_; + + return Fatal->_one_invocation( + $core, $call, $name, $void, + undef, # Sub. Unused in back-compat mode. + 1, # Back-compat flag + undef, # Subref, unused in back-compat mode. + @argv + ); + +} + +# This is the internal interface that generates code. +# NOTE: This interface WILL change in the future. Please do not +# call this subroutine directly. + +# TODO: Whatever's calling this code has already looked up hints. Pass +# them in, rather than look them up a second time. + +sub _one_invocation { + my ($class, $core, $call, $name, $void, $sub, $back_compat, $sref, @argv) = @_; + + + # If someone is calling us directly (a child class perhaps?) then + # they could try to mix void without enabling backwards + # compatibility. We just don't support this at all, so we gripe + # about it rather than doing something unwise. + + if ($void and not $back_compat) { + Carp::confess("Internal error: :void mode not supported with $class"); + } + + # @argv only contains the results of the in-built prototype + # function, and is therefore safe to interpolate in the + # code generators below. + + # TODO - The following clobbers context, but that's what the + # old Fatal did. Do we care? + + if ($back_compat) { + + # Use Fatal qw(system) will never be supported. It generated + # a compile-time error with legacy Fatal, and there's no reason + # to support it when autodie does a better job. + + if ($call eq 'CORE::system') { + return q{ + croak("UNIMPLEMENTED: use Fatal qw(system) not supported."); + }; + } + + local $" = ', '; + + if ($void) { + return qq/return (defined wantarray)?$call(@argv): + $call(@argv) || Carp::croak("Can't $name(\@_)/ . + ($core ? ': $!' : ', \$! is \"$!\"') . '")' + } else { + return qq{return $call(@argv) || Carp::croak("Can't $name(\@_)} . + ($core ? ': $!' : ', \$! is \"$!\"') . '")'; + } + } + + # The name of our original function is: + # $call if the function is CORE + # $sub if our function is non-CORE + + # The reason for this is that $call is what we're actually + # calling. For our core functions, this is always + # CORE::something. However for user-defined subs, we're about to + # replace whatever it is that we're calling; as such, we actually + # calling a subroutine ref. + + my $human_sub_name = $core ? $call : $sub; + + # Should we be testing to see if our result is defined, or + # just true? + + my $use_defined_or; + + my $hints; # All user-sub hints, including list hints. + + if ( $core ) { + + # Core hints are built into autodie. + + $use_defined_or = exists ( $Use_defined_or{$call} ); + + } + else { + + # User sub hints are looked up using autodie::hints, + # since users may wish to add their own hints. + + require autodie::hints; + + $hints = autodie::hints->get_hints_for( $sref ); + + # We'll look up the sub's fullname. This means we + # get better reports of where it came from in our + # error messages, rather than what imported it. + + $human_sub_name = autodie::hints->sub_fullname( $sref ); + + } + + # Checks for special core subs. + + if ($call eq 'CORE::system') { + + # Leverage IPC::System::Simple if we're making an autodying + # system. + + local $" = ", "; + + # We need to stash $@ into $E, rather than using + # local $@ for the whole sub. If we don't then + # any exceptions from internal errors in autodie/Fatal + # will mysteriously disappear before propagating + # upwards. + + return qq{ + my \$retval; + my \$E; + + + { + local \$@; + + eval { + \$retval = IPC::System::Simple::system(@argv); + }; + + \$E = \$@; + } + + if (\$E) { + + # TODO - This can't be overridden in child + # classes! + + die autodie::exception::system->new( + function => q{CORE::system}, args => [ @argv ], + message => "\$E", errno => \$!, + ); + } + + return \$retval; + }; + + } + + local $" = ', '; + + # If we're going to throw an exception, here's the code to use. + my $die = qq{ + die $class->throw( + function => q{$human_sub_name}, args => [ @argv ], + pragma => q{$class}, errno => \$!, + context => \$context, return => \$retval, + eval_error => \$@ + ) + }; + + if ($call eq 'CORE::flock') { + + # flock needs special treatment. When it fails with + # LOCK_UN and EWOULDBLOCK, then it's not really fatal, it just + # means we couldn't get the lock right now. + + require POSIX; # For POSIX::EWOULDBLOCK + + local $@; # Don't blat anyone else's $@. + + # Ensure that our vendor supports EWOULDBLOCK. If they + # don't (eg, Windows), then we use known values for its + # equivalent on other systems. + + my $EWOULDBLOCK = eval { POSIX::EWOULDBLOCK(); } + || $_EWOULDBLOCK{$^O} + || _autocroak("Internal error - can't overload flock - EWOULDBLOCK not defined on this system."); + my $EAGAIN = $EWOULDBLOCK; + if ($try_EAGAIN) { + $EAGAIN = eval { POSIX::EAGAIN(); } + || _autocroak("Internal error - can't overload flock - EAGAIN not defined on this system."); + } + + require Fcntl; # For Fcntl::LOCK_NB + + return qq{ + + my \$context = wantarray() ? "list" : "scalar"; + + # Try to flock. If successful, return it immediately. + + my \$retval = $call(@argv); + return \$retval if \$retval; + + # If we failed, but we're using LOCK_NB and + # returned EWOULDBLOCK, it's not a real error. + + if (\$_[1] & Fcntl::LOCK_NB() and + (\$! == $EWOULDBLOCK or + ($try_EAGAIN and \$! == $EAGAIN ))) { + return \$retval; + } + + # Otherwise, we failed. Die noisily. + + $die; + + }; + } + + if (exists $Returns_num_things_changed{$call}) { + + # Some things return the number of things changed (like + # chown, kill, chmod, etc). We only consider these successful + # if *all* the things are changed. + + return qq[ + my \$num_things = \@_ - $Returns_num_things_changed{$call}; + my \$retval = $call(@argv); + + if (\$retval != \$num_things) { + + # We need \$context to throw an exception. + # It's *always* set to scalar, because that's how + # autodie calls chown() above. + + my \$context = "scalar"; + $die; + } + + return \$retval; + ]; + } + + # AFAIK everything that can be given an unopned filehandle + # will fail if it tries to use it, so we don't really need + # the 'unopened' warning class here. Especially since they + # then report the wrong line number. + + # Other warnings are disabled because they produce excessive + # complaints from smart-match hints under 5.10.1. + + my $code = qq[ + no warnings qw(unopened uninitialized numeric); + no if \$\] >= 5.017011, warnings => "experimental::smartmatch"; + + if (wantarray) { + my \@results = $call(@argv); + my \$retval = \\\@results; + my \$context = "list"; + + ]; + + my $retval_action = $Retval_action{$call} || ''; + + if ( $hints and ( ref($hints->{list} ) || "" ) eq 'CODE' ) { + + # NB: Subroutine hints are passed as a full list. + # This differs from the 5.10.0 smart-match behaviour, + # but means that context unaware subroutines can use + # the same hints in both list and scalar context. + + $code .= qq{ + if ( \$hints->{list}->(\@results) ) { $die }; + }; + } + elsif ( PERL510 and $hints ) { + $code .= qq{ + if ( \@results ~~ \$hints->{list} ) { $die }; + }; + } + elsif ( $hints ) { + croak sprintf(ERROR_58_HINTS, 'list', $sub); + } + else { + $code .= qq{ + # An empty list, or a single undef is failure + if (! \@results or (\@results == 1 and ! defined \$results[0])) { + $die; + } + } + } + + # Tidy up the end of our wantarray call. + + $code .= qq[ + return \@results; + } + ]; + + + # Otherwise, we're in scalar context. + # We're never in a void context, since we have to look + # at the result. + + $code .= qq{ + my \$retval = $call(@argv); + my \$context = "scalar"; + }; + + if ( $hints and ( ref($hints->{scalar} ) || "" ) eq 'CODE' ) { + + # We always call code refs directly, since that always + # works in 5.8.x, and always works in 5.10.1 + + return $code .= qq{ + if ( \$hints->{scalar}->(\$retval) ) { $die }; + $retval_action + return \$retval; + }; + + } + elsif (PERL510 and $hints) { + return $code . qq{ + + if ( \$retval ~~ \$hints->{scalar} ) { $die }; + $retval_action + return \$retval; + }; + } + elsif ( $hints ) { + croak sprintf(ERROR_58_HINTS, 'scalar', $sub); + } + + return $code . + ( $use_defined_or ? qq{ + + $die if not defined \$retval; + $retval_action + return \$retval; + + } : qq{ + + $retval_action + return \$retval || $die; + + } ) ; + +} + +# This returns the old copy of the sub, so we can +# put it back at end of scope. + +# TODO : Check to make sure prototypes are restored correctly. + +# TODO: Taking a huge list of arguments is awful. Rewriting to +# take a hash would be lovely. + +# TODO - BACKCOMPAT - This is not yet compatible with 5.10.0 + +sub _make_fatal { + my($class, $sub, $pkg, $void, $lexical, $filename, $insist, $install_subs) = @_; + my($code, $sref, $proto, $core, $call, $hints, $cache, $cache_type); + my $ini = $sub; + my $name = $sub; + + + if (index($sub, '::') == -1) { + $sub = "${pkg}::$sub"; + if (substr($name, 0, 1) eq '&') { + $name = substr($name, 1); + } + } else { + $name =~ s/.*:://; + } + + + # Figure if we're using lexical or package semantics and + # twiddle the appropriate bits. + + if (not $lexical) { + $Package_Fatal{$sub} = 1; + } + + # TODO - We *should* be able to do skipping, since we know when + # we've lexicalised / unlexicalised a subroutine. + + + warn "# _make_fatal: sub=$sub pkg=$pkg name=$name void=$void\n" if $Debug; + croak(sprintf(ERROR_BADNAME, $class, $name)) unless $name =~ /^\w+$/; + + if (defined(&$sub)) { # user subroutine + + # NOTE: Previously we would localise $@ at this point, so + # the following calls to eval {} wouldn't interfere with anything + # that's already in $@. Unfortunately, it would also stop + # any of our croaks from triggering(!), which is even worse. + + # This could be something that we've fatalised that + # was in core. + + # Store the current sub in case we need to restore it. + $sref = \&$sub; + + if ( $Package_Fatal{$sub} and exists($CORE_prototype_cache{"CORE::$name"})) { + + # Something we previously made Fatal that was core. + # This is safe to replace with an autodying to core + # version. + + $core = 1; + $call = "CORE::$name"; + $proto = $CORE_prototype_cache{$call}; + + # We return our $sref from this subroutine later + # on, indicating this subroutine should be placed + # back when we're finished. + + + + } else { + + # If this is something we've already fatalised or played with, + # then look-up the name of the original sub for the rest of + # our processing. + + if (exists($Is_fatalised_sub{$sref})) { + # $sub is one of our wrappers around a CORE sub or a + # user sub. Instead of wrapping our wrapper, lets just + # generate a new wrapper for the original sub. + # - NB: the current wrapper might be for a different class + # than the one we are generating now (e.g. some limited + # mixing between use Fatal + use autodie can occur). + # - Even for nested autodie, we need this as the leak guards + # differ. + my $s = $Is_fatalised_sub{$sref}; + if (defined($s)) { + # It is a wrapper for a user sub + $sub = $s; + } else { + # It is a wrapper for a CORE:: sub + $core = 1; + $call = "CORE::$name"; + $proto = $CORE_prototype_cache{$call}; + } + } + + # A regular user sub, or a user sub wrapping a + # core sub. + + if (!$core) { + # A non-CORE sub might have hints and such... + $proto = prototype($sref); + $call = '&$sref'; + require autodie::hints; + + $hints = autodie::hints->get_hints_for( $sref ); + + # If we've insisted on hints, but don't have them, then + # bail out! + + if ($insist and not $hints) { + croak(sprintf(ERROR_NOHINTS, $name)); + } + + # Otherwise, use the default hints if we don't have + # any. + + $hints ||= autodie::hints::DEFAULT_HINTS(); + } + + } + + } elsif ($sub eq $ini && $sub !~ /^CORE::GLOBAL::/) { + # Stray user subroutine + croak(sprintf(ERROR_NOTSUB,$sub)); + + } elsif ($name eq 'system') { + + # If we're fatalising system, then we need to load + # helper code. + + # The business with $E is to avoid clobbering our caller's + # $@, and to avoid $@ being localised when we croak. + + my $E; + + { + local $@; + + eval { + require IPC::System::Simple; # Only load it if we need it. + require autodie::exception::system; + }; + $E = $@; + } + + if ($E) { croak ERROR_NO_IPC_SYS_SIMPLE; } + + # Make sure we're using a recent version of ISS that actually + # support fatalised system. + if ($IPC::System::Simple::VERSION < MIN_IPC_SYS_SIMPLE_VER) { + croak sprintf( + ERROR_IPC_SYS_SIMPLE_OLD, MIN_IPC_SYS_SIMPLE_VER, + $IPC::System::Simple::VERSION + ); + } + + $call = 'CORE::system'; + $core = 1; + + } elsif ($name eq 'exec') { + # Exec doesn't have a prototype. We don't care. This + # breaks the exotic form with lexical scope, and gives + # the regular form a "do or die" behavior as expected. + + $call = 'CORE::exec'; + $core = 1; + + } else { # CORE subroutine + $call = "CORE::$name"; + if (exists($CORE_prototype_cache{$call})) { + $proto = $CORE_prototype_cache{$call}; + } else { + my $E; + { + local $@; + $proto = eval { prototype $call }; + $E = $@; + } + croak(sprintf(ERROR_NOT_BUILT,$name)) if $E; + croak(sprintf(ERROR_CANT_OVERRIDE,$name)) if not defined $proto; + $CORE_prototype_cache{$call} = $proto; + } + $core = 1; + } + + # TODO: This caching works, but I don't like using $void and + # $lexical as keys. In particular, I suspect our code may end up + # wrapping already wrapped code when autodie and Fatal are used + # together. + + # NB: We must use '$sub' (the name plus package) and not + # just '$name' (the short name) here. Failing to do so + # results code that's in the wrong package, and hence has + # access to the wrong package filehandles. + + $cache = $Cached_fatalised_sub{$class}{$sub}; + if ($lexical) { + $cache_type = CACHE_AUTODIE_LEAK_GUARD; + } else { + $cache_type = CACHE_FATAL_WRAPPER; + $cache_type = CACHE_FATAL_VOID if $void; + } + + if (my $subref = $cache->{$cache_type}) { + $install_subs->{$name} = $subref; + return $sref; + } + + # If our subroutine is reusable (ie, not package depdendent), + # then check to see if we've got a cached copy, and use that. + # See RT #46984. (Thanks to Niels Thykier for being awesome!) + + if ($core && exists $reusable_builtins{$call}) { + # For non-lexical subs, we can just use this cache directly + # - for lexical variants, we need a leak guard as well. + $code = $reusable_builtins{$call}{$lexical}; + if (!$lexical && defined($code)) { + $install_subs->{$name} = $code; + return $sref; + } + } + + if (!($lexical && $core) && !defined($code)) { + # No code available, generate it now. + my $wrapper_pkg = $pkg; + $wrapper_pkg = undef if (exists($reusable_builtins{$call})); + $code = $class->_compile_wrapper($wrapper_pkg, $core, $call, $name, + $void, $lexical, $sub, $sref, + $hints, $proto); + if (!defined($wrapper_pkg)) { + # cache it so we don't recompile this part again + $reusable_builtins{$call}{$lexical} = $code; + } + } + + # Now we need to wrap our fatalised sub inside an itty bitty + # closure, which can detect if we've leaked into another file. + # Luckily, we only need to do this for lexical (autodie) + # subs. Fatal subs can leak all they want, it's considered + # a "feature" (or at least backwards compatible). + + # TODO: Cache our leak guards! + + # TODO: This is pretty hairy code. A lot more tests would + # be really nice for this. + + my $installed_sub = $code; + + if ($lexical) { + $installed_sub = $class->_make_leak_guard($filename, $code, $sref, $call, + $pkg, $proto); + } + + $cache->{$cache_type} = $code; + + $install_subs->{$name} = $installed_sub; + + # Cache that we've now overridden this sub. If we get called + # again, we may need to find that find subroutine again (eg, for hints). + + $Is_fatalised_sub{$installed_sub} = $sref; + + return $sref; + +} + +# This subroutine exists primarily so that child classes can override +# it to point to their own exception class. Doing this is significantly +# less complex than overriding throw() + +sub exception_class { return "autodie::exception" }; + +{ + my %exception_class_for; + my %class_loaded; + + sub throw { + my ($class, @args) = @_; + + # Find our exception class if we need it. + my $exception_class = + $exception_class_for{$class} ||= $class->exception_class; + + if (not $class_loaded{$exception_class}) { + if ($exception_class =~ /[^\w:']/) { + confess "Bad exception class '$exception_class'.\nThe '$class->exception_class' method wants to use $exception_class\nfor exceptions, but it contains characters which are not word-characters or colons."; + } + + # Alas, Perl does turn barewords into modules unless they're + # actually barewords. As such, we're left doing a string eval + # to make sure we load our file correctly. + + my $E; + + { + local $@; # We can't clobber $@, it's wrong! + my $pm_file = $exception_class . ".pm"; + $pm_file =~ s{ (?: :: | ' ) }{/}gx; + eval { require $pm_file }; + $E = $@; # Save $E despite ending our local. + } + + # We need quotes around $@ to make sure it's stringified + # while still in scope. Without them, we run the risk of + # $@ having been cleared by us exiting the local() block. + + confess "Failed to load '$exception_class'.\nThis may be a typo in the '$class->exception_class' method,\nor the '$exception_class' module may not exist.\n\n $E" if $E; + + $class_loaded{$exception_class}++; + + } + + return $exception_class->new(@args); + } +} + +# Creates and returns a leak guard (with prototype if needed). +sub _make_leak_guard { + my ($class, $filename, $wrapped_sub, $orig_sub, $call, $pkg, $proto) = @_; + + # The leak guard is rather lengthly (in fact it makes up the most + # of _make_leak_guard). It is possible to split it into a large + # "generic" part and a small wrapper with call-specific + # information. This was done in v2.19 and profiling suggested + # that we ended up using a substantial amount of runtime in "goto" + # between the leak guard(s) and the final sub. Therefore, the two + # parts were merged into one to reduce the runtime overhead. + + my $leak_guard = sub { + my $caller_level = 0; + my $caller; + + while ( ($caller = (caller $caller_level)[1]) =~ m{^\(eval \d+\)$} ) { + + # If our filename is actually an eval, and we + # reach it, then go to our autodying code immediatately. + + last if ($caller eq $filename); + $caller_level++; + } + + # We're now out of the eval stack. + + if ($caller eq $filename) { + # No leak, call the wrapper. NB: In this case, it doesn't + # matter if it is a CORE sub or not. + if (!defined($wrapped_sub)) { + # CORE sub that we were too lazy to compile when we + # created this leak guard. + die "$call is not CORE::" + if substr($call, 0, 6) ne 'CORE::'; + + my $name = substr($call, 6); + my $sub = $name; + my $lexical = 1; + my $wrapper_pkg = $pkg; + my $code; + if (exists($reusable_builtins{$call})) { + $code = $reusable_builtins{$call}{$lexical}; + $wrapper_pkg = undef; + } + if (!defined($code)) { + $code = $class->_compile_wrapper($wrapper_pkg, + 1, # core + $call, + $name, + 0, # void + $lexical, + $sub, + undef, # subref (not used for core) + undef, # hints (not used for core) + $proto); + + if (!defined($wrapper_pkg)) { + # cache it so we don't recompile this part again + $reusable_builtins{$call}{$lexical} = $code; + } + } + # As $wrapped_sub is "closed over", updating its value will + # be "remembered" for the next call. + $wrapped_sub = $code; + } + goto $wrapped_sub; + } + + # We leaked, time to call the original function. + # - for non-core functions that will be $orig_sub + # - for CORE functions, $orig_sub may be a trampoline + goto $orig_sub if defined($orig_sub); + + # We are wrapping a CORE sub and we do not have a trampoline + # yet. + # + # If we've cached a trampoline, then use it. Usually only + # resuable subs will have cache hits, but non-reusuably ones + # can get it as well in (very) rare cases. It is mostly in + # cases where a package uses autodie multiple times and leaks + # from multiple places. Possibly something like: + # + # package Pkg::With::LeakyCode; + # sub a { + # use autodie; + # code_that_leaks(); + # } + # + # sub b { + # use autodie; + # more_leaky_code(); + # } + # + # Note that we use "Fatal" as package name for reusable subs + # because A) that allows us to trivially re-use the + # trampolines as well and B) because the reusable sub is + # compiled into "package Fatal" as well. + + $pkg = 'Fatal' if exists $reusable_builtins{$call}; + $orig_sub = $Trampoline_cache{$pkg}{$call}; + + if (not $orig_sub) { + # If we don't have a trampoline, we need to build it. + # + # We only generate trampolines when we need them, and + # we can cache them by subroutine + package. + # + # As $orig_sub is "closed over", updating its value will + # be "remembered" for the next call. + + $orig_sub = make_core_trampoline($call, $pkg, $proto); + + # We still cache it despite remembering it in $orig_sub as + # well. In particularly, we rely on this to avoid + # re-compiling the reusable trampolines. + $Trampoline_cache{$pkg}{$call} = $orig_sub; + } + + # Bounce to our trampoline, which takes us to our core sub. + goto $orig_sub; + }; # <-- end of leak guard + + # If there is a prototype on the original sub, copy it to the leak + # guard. + if (defined $proto) { + # The "\&" may appear to be redundant but set_prototype + # croaks when it is removed. + set_prototype(\&$leak_guard, $proto); + } + + return $leak_guard; +} + +sub _compile_wrapper { + my ($class, $wrapper_pkg, $core, $call, $name, $void, $lexical, $sub, $sref, $hints, $proto) = @_; + my $real_proto = ''; + my @protos; + my $code; + if (defined $proto) { + $real_proto = " ($proto)"; + } else { + $proto = '@'; + } + + @protos = fill_protos($proto); + $code = qq[ + sub$real_proto { + ]; + + if (!$lexical) { + $code .= q[ + local($", $!) = (', ', 0); + ]; + } + + # Don't have perl whine if exec fails, since we'll be handling + # the exception now. + $code .= "no warnings qw(exec);\n" if $call eq "CORE::exec"; + + $code .= $class->_write_invocation($core, $call, $name, $void, $lexical, + $sub, $sref, @protos); + $code .= "}\n"; + warn $code if $Debug; + + # I thought that changing package was a monumental waste of + # time for CORE subs, since they'll always be the same. However + # that's not the case, since they may refer to package-based + # filehandles (eg, with open). + # + # The %reusable_builtins hash defines ones we can aggressively + # cache as they never depend upon package-based symbols. + + my $E; + + { + no strict 'refs'; ## no critic # to avoid: Can't use string (...) as a symbol ref ... + local $@; + if (defined($wrapper_pkg)) { + $code = eval("package $wrapper_pkg; require Carp; $code"); ## no critic + } else { + $code = eval("require Carp; $code"); ## no critic + + } + $E = $@; + } + + if (not $code) { + my $true_name = $core ? $call : $sub; + croak("Internal error in autodie/Fatal processing $true_name: $E"); + } + return $code; +} + +# For some reason, dying while replacing our subs doesn't +# kill our calling program. It simply stops the loading of +# autodie and keeps going with everything else. The _autocroak +# sub allows us to die with a vengeance. It should *only* ever be +# used for serious internal errors, since the results of it can't +# be captured. + +sub _autocroak { + warn Carp::longmess(@_); + exit(255); # Ugh! +} + +1; + +__END__ + + +require 5.004; +package Test; + +use strict; + +use Carp; +our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, $ntest, $TestLevel); #public-is +our ($TESTOUT, $TESTERR, %Program_Lines, $told_about_diff, + $ONFAIL, %todo, %history, $planned, @FAILDETAIL); #private-ish + +# In case a test is run in a persistent environment. +sub _reset_globals { + %todo = (); + %history = (); + @FAILDETAIL = (); + $ntest = 1; + $TestLevel = 0; # how many extra stack frames to skip + $planned = 0; +} + +$VERSION = '1.31'; +require Exporter; +@ISA=('Exporter'); + +@EXPORT = qw(&plan &ok &skip); +@EXPORT_OK = qw($ntest $TESTOUT $TESTERR); + +$|=1; +$TESTOUT = *STDOUT{IO}; +$TESTERR = *STDERR{IO}; + +# Use of this variable is strongly discouraged. It is set mainly to +# help test coverage analyzers know which test is running. +$ENV{REGRESSION_TEST} = $0; + + + +sub plan { + croak "Test::plan(%args): odd number of arguments" if @_ & 1; + croak "Test::plan(): should not be called more than once" if $planned; + + local($\, $,); # guard against -l and other things that screw with + # print + + _reset_globals(); + + _read_program( (caller)[1] ); + + my $max=0; + while (@_) { + my ($k,$v) = splice(@_, 0, 2); + if ($k =~ /^test(s)?$/) { $max = $v; } + elsif ($k eq 'todo' or + $k eq 'failok') { for (@$v) { $todo{$_}=1; }; } + elsif ($k eq 'onfail') { + ref $v eq 'CODE' or croak "Test::plan(onfail => $v): must be CODE"; + $ONFAIL = $v; + } + else { carp "Test::plan(): skipping unrecognized directive '$k'" } + } + my @todo = sort { $a <=> $b } keys %todo; + if (@todo) { + print $TESTOUT "1..$max todo ".join(' ', @todo).";\n"; + } else { + print $TESTOUT "1..$max\n"; + } + ++$planned; + print $TESTOUT "# Running under perl version $] for $^O", + (chr(65) eq 'A') ? "\n" : " in a non-ASCII world\n"; + + print $TESTOUT "# Win32::BuildNumber ", &Win32::BuildNumber(), "\n" + if defined(&Win32::BuildNumber) and defined &Win32::BuildNumber(); + + print $TESTOUT "# MacPerl version $MacPerl::Version\n" + if defined $MacPerl::Version; + + printf $TESTOUT + "# Current time local: %s\n# Current time GMT: %s\n", + scalar(localtime($^T)), scalar(gmtime($^T)); + + print $TESTOUT "# Using Test.pm version $VERSION\n"; + + # Retval never used: + return undef; +} + +sub _read_program { + my($file) = shift; + return unless defined $file and length $file + and -e $file and -f _ and -r _; + open(SOURCEFILE, '<', $file) || return; + $Program_Lines{$file} = []; + close(SOURCEFILE); + + foreach my $x (@{$Program_Lines{$file}}) + { $x =~ tr/\cm\cj\n\r//d } + + unshift @{$Program_Lines{$file}}, ''; + return 1; +} + + +sub _to_value { + my ($v) = @_; + return ref $v eq 'CODE' ? $v->() : $v; +} + +sub _quote { + my $str = $_[0]; + return "" unless defined $str; + $str =~ s/\\/\\\\/g; + $str =~ s/"/\\"/g; + $str =~ s/\a/\\a/g; + $str =~ s/[\b]/\\b/g; + $str =~ s/\e/\\e/g; + $str =~ s/\f/\\f/g; + $str =~ s/\n/\\n/g; + $str =~ s/\r/\\r/g; + $str =~ s/\t/\\t/g; + if (defined $^V && $^V ge v5.6) { + $str =~ s/([[:cntrl:]])(?!\d)/sprintf('\\%o',ord($1))/eg; + $str =~ s/([[:^print:]])/sprintf('\\x%02X',ord($1))/eg; + $str =~ s/([[:^ascii:]])/sprintf('\\x{%X}',ord($1))/eg; + } + elsif (ord("A") == 65) { + $str =~ s/([\0-\037])(?!\d)/sprintf('\\%o',ord($1))/eg; + $str =~ s/([\0-\037\177-\377])/sprintf('\\x%02X',ord($1))/eg; + $str =~ s/([^\0-\176])/sprintf('\\x{%X}',ord($1))/eg; + } + else { # Assuming EBCDIC on this ancient Perl + + # The controls except for one are 0-\077, so almost all controls on + # EBCDIC platforms will be expressed in octal, instead of just the C0 + # ones. + $str =~ s/([\0-\077])(?!\d)/sprintf('\\%o',ord($1))/eg; + $str =~ s/([\0-\077])/sprintf('\\x%02X',ord($1))/eg; + + $str =~ s/([^\0-\xFF])/sprintf('\\x{%X}',ord($1))/eg; + + # What remains to be escaped are the non-ASCII-range characters, + # including the one control that isn't in the 0-077 range. + # (We don't escape further any ASCII printables.) + $str =~ s<[^ !"\$\%#'()*+,\-./0123456789:;\<=\>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~]>eg; + } + #if( $_[1] ) { + # substr( $str , 218-3 ) = "..." + # if length($str) >= 218 and !$ENV{PERL_TEST_NO_TRUNC}; + #} + return qq("$str"); +} + + + +# A past maintainer of this module said: +# <> +# + +sub ok ($;$$) { + croak "ok: plan before you test!" if !$planned; + + local($\,$,); # guard against -l and other things that screw with + # print + + my ($pkg,$file,$line) = caller($TestLevel); + my $repetition = ++$history{"$file:$line"}; + my $context = ("$file at line $line". + ($repetition > 1 ? " fail \#$repetition" : '')); + + # Are we comparing two values? + my $compare = 0; + + my $ok=0; + my $result = _to_value(shift); + my ($expected, $isregex, $regex); + if (@_ == 0) { + $ok = $result; + } else { + $compare = 1; + $expected = _to_value(shift); + if (!defined $expected) { + $ok = !defined $result; + } elsif (!defined $result) { + $ok = 0; + } elsif (ref($expected) eq 'Regexp') { + $ok = $result =~ /$expected/; + $regex = $expected; + } elsif (($regex) = ($expected =~ m,^ / (.+) / $,sx) or + (undef, $regex) = ($expected =~ m,^ m([^\w\s]) (.+) \1 $,sx)) { + $ok = $result =~ /$regex/; + } else { + $ok = $result eq $expected; + } + } + my $todo = $todo{$ntest}; + if ($todo and $ok) { + $context .= ' TODO?!' if $todo; + print $TESTOUT "ok $ntest # ($context)\n"; + } else { + # Issuing two seperate prints() causes problems on VMS. + if (!$ok) { + print $TESTOUT "not ok $ntest\n"; + } + else { + print $TESTOUT "ok $ntest\n"; + } + + $ok or _complain($result, $expected, + { + 'repetition' => $repetition, 'package' => $pkg, + 'result' => $result, 'todo' => $todo, + 'file' => $file, 'line' => $line, + 'context' => $context, 'compare' => $compare, + @_ ? ('diagnostic' => _to_value(shift)) : (), + }); + + } + ++ $ntest; + $ok; +} + + +sub _complain { + my($result, $expected, $detail) = @_; + $$detail{expected} = $expected if defined $expected; + + # Get the user's diagnostic, protecting against multi-line + # diagnostics. + my $diag = $$detail{diagnostic}; + $diag =~ s/\n/\n#/g if defined $diag; + + my $out = $$detail{todo} ? $TESTOUT : $TESTERR; + $$detail{context} .= ' *TODO*' if $$detail{todo}; + if (!$$detail{compare}) { + if (!$diag) { + print $out "# Failed test $ntest in $$detail{context}\n"; + } else { + print $out "# Failed test $ntest in $$detail{context}: $diag\n"; + } + } else { + my $prefix = "Test $ntest"; + + print $out "# $prefix got: " . _quote($result) . + " ($$detail{context})\n"; + $prefix = ' ' x (length($prefix) - 5); + my $expected_quoted = (defined $$detail{regex}) + ? 'qr{'.($$detail{regex}).'}' : _quote($expected); + + print $out "# $prefix Expected: $expected_quoted", + $diag ? " ($diag)" : (), "\n"; + + _diff_complain( $result, $expected, $detail, $prefix ) + if defined($expected) and 2 < ($expected =~ tr/\n//); + } + + if(defined $Program_Lines{ $$detail{file} }[ $$detail{line} ]) { + print $out + "# $$detail{file} line $$detail{line} is: $Program_Lines{ $$detail{file} }[ $$detail{line} ]\n" + if $Program_Lines{ $$detail{file} }[ $$detail{line} ] + =~ m/[^\s\#\(\)\{\}\[\]\;]/; # Otherwise it's uninformative + + undef $Program_Lines{ $$detail{file} }[ $$detail{line} ]; + # So we won't repeat it. + } + + push @FAILDETAIL, $detail; + return; +} + + + +sub _diff_complain { + my($result, $expected, $detail, $prefix) = @_; + return _diff_complain_external(@_) if $ENV{PERL_TEST_DIFF}; + return _diff_complain_algdiff(@_) + if eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require Algorithm::Diff; Algorithm::Diff->VERSION(1.15); + 1; + }; + + $told_about_diff++ or print $TESTERR <<"EOT"; +# $prefix (Install the Algorithm::Diff module to have differences in multiline +# $prefix output explained. You might also set the PERL_TEST_DIFF environment +# $prefix variable to run a diff program on the output.) +EOT + ; + return; +} + + + +sub _diff_complain_external { + my($result, $expected, $detail, $prefix) = @_; + my $diff = $ENV{PERL_TEST_DIFF} || die "WHAAAA?"; + + require File::Temp; + my($got_fh, $got_filename) = File::Temp::tempfile("test-got-XXXXX"); + my($exp_fh, $exp_filename) = File::Temp::tempfile("test-exp-XXXXX"); + unless ($got_fh && $exp_fh) { + warn "Can't get tempfiles"; + return; + } + + print $got_fh $result; + print $exp_fh $expected; + if (close($got_fh) && close($exp_fh)) { + my $diff_cmd = "$diff $exp_filename $got_filename"; + print $TESTERR "#\n# $prefix $diff_cmd\n"; + if (open(DIFF, '-|', $diff_cmd)) { + local $_; + while () { + print $TESTERR "# $prefix $_"; + } + close(DIFF); + } + else { + warn "Can't run diff: $!"; + } + } else { + warn "Can't write to tempfiles: $!"; + } + unlink($got_filename); + unlink($exp_filename); + return; +} + + + +sub _diff_complain_algdiff { + my($result, $expected, $detail, $prefix) = @_; + + my @got = split(/^/, $result); + my @exp = split(/^/, $expected); + + my $diff_kind; + my @diff_lines; + + my $diff_flush = sub { + return unless $diff_kind; + + my $count_lines = @diff_lines; + my $s = $count_lines == 1 ? "" : "s"; + my $first_line = $diff_lines[0][0] + 1; + + print $TESTERR "# $prefix "; + if ($diff_kind eq "GOT") { + print $TESTERR "Got $count_lines extra line$s at line $first_line:\n"; + for my $i (@diff_lines) { + print $TESTERR "# $prefix + " . _quote($got[$i->[0]]) . "\n"; + } + } elsif ($diff_kind eq "EXP") { + if ($count_lines > 1) { + my $last_line = $diff_lines[-1][0] + 1; + print $TESTERR "Lines $first_line-$last_line are"; + } + else { + print $TESTERR "Line $first_line is"; + } + print $TESTERR " missing:\n"; + for my $i (@diff_lines) { + print $TESTERR "# $prefix - " . _quote($exp[$i->[1]]) . "\n"; + } + } elsif ($diff_kind eq "CH") { + if ($count_lines > 1) { + my $last_line = $diff_lines[-1][0] + 1; + print $TESTERR "Lines $first_line-$last_line are"; + } + else { + print $TESTERR "Line $first_line is"; + } + print $TESTERR " changed:\n"; + for my $i (@diff_lines) { + print $TESTERR "# $prefix - " . _quote($exp[$i->[1]]) . "\n"; + print $TESTERR "# $prefix + " . _quote($got[$i->[0]]) . "\n"; + } + } + + # reset + $diff_kind = undef; + @diff_lines = (); + }; + + my $diff_collect = sub { + my $kind = shift; + &$diff_flush() if $diff_kind && $diff_kind ne $kind; + $diff_kind = $kind; + push(@diff_lines, [@_]); + }; + + + Algorithm::Diff::traverse_balanced( + \@got, \@exp, + { + DISCARD_A => sub { &$diff_collect("GOT", @_) }, + DISCARD_B => sub { &$diff_collect("EXP", @_) }, + CHANGE => sub { &$diff_collect("CH", @_) }, + MATCH => sub { &$diff_flush() }, + }, + ); + &$diff_flush(); + + return; +} + + + + +#~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~ + + + +sub skip ($;$$$) { + local($\, $,); # guard against -l and other things that screw with + # print + + my $whyskip = _to_value(shift); + if (!@_ or $whyskip) { + $whyskip = '' if $whyskip =~ m/^\d+$/; + $whyskip =~ s/^[Ss]kip(?:\s+|$)//; # backwards compatibility, old + # versions required the reason + # to start with 'skip' + # We print in one shot for VMSy reasons. + my $ok = "ok $ntest # skip"; + $ok .= " $whyskip" if length $whyskip; + $ok .= "\n"; + print $TESTOUT $ok; + ++ $ntest; + return 1; + } else { + # backwards compatibility (I think). skip() used to be + # called like ok(), which is weird. I haven't decided what to do with + # this yet. +# warn <(\@FAILDETAIL) if @FAILDETAIL && $ONFAIL; +} + +1; +__END__ + + +# "Your mistake was a hidden intention." +# -- /Oblique Strategies/, Brian Eno and Peter Schmidt +package NEXT; + +use Carp; +use strict; +use warnings; +use overload (); + +our $VERSION = '0.67_01'; + +sub NEXT::ELSEWHERE::ancestors +{ + my @inlist = shift; + my @outlist = (); + while (my $next = shift @inlist) { + push @outlist, $next; + no strict 'refs'; + unshift @inlist, @{"$outlist[-1]::ISA"}; + } + return @outlist; +} + +sub NEXT::ELSEWHERE::ordered_ancestors +{ + my @inlist = shift; + my @outlist = (); + while (my $next = shift @inlist) { + push @outlist, $next; + no strict 'refs'; + push @inlist, @{"$outlist[-1]::ISA"}; + } + return sort { $a->isa($b) ? -1 + : $b->isa($a) ? +1 + : 0 } @outlist; +} + +sub NEXT::ELSEWHERE::buildAUTOLOAD +{ + my $autoload_name = caller() . '::AUTOLOAD'; + + no strict 'refs'; + *{$autoload_name} = sub { + my ($self) = @_; + my $depth = 1; + until (((caller($depth))[3]||q{}) !~ /^\(eval\)$/) { $depth++ } + my $caller = (caller($depth))[3]; + my $wanted = $NEXT::AUTOLOAD || $autoload_name; + undef $NEXT::AUTOLOAD; + my ($caller_class, $caller_method) = do { $caller =~ m{(.*)::(.*)}g }; + my ($wanted_class, $wanted_method) = do { $wanted =~ m{(.*)::(.*)}g }; + croak "Can't call $wanted from $caller" + unless $caller_method eq $wanted_method; + + my $key = ref $self && overload::Overloaded($self) + ? overload::StrVal($self) : $self; + + local ($NEXT::NEXT{$key,$wanted_method}, $NEXT::SEEN) = + ($NEXT::NEXT{$key,$wanted_method}, $NEXT::SEEN); + + unless ($NEXT::NEXT{$key,$wanted_method}) { + my @forebears = + NEXT::ELSEWHERE::ancestors ref $self || $self, + $wanted_class; + while (@forebears) { + last if shift @forebears eq $caller_class + } + no strict 'refs'; + # Use *{"..."} when first accessing the CODE slot, to make sure + # any typeglob stub is upgraded to a full typeglob. + @{$NEXT::NEXT{$key,$wanted_method}} = + map { + my $stash = \%{"${_}::"}; + ($stash->{$caller_method} && (*{"${_}::$caller_method"}{CODE})) + ? *{$stash->{$caller_method}}{CODE} + : () } @forebears + unless $wanted_method eq 'AUTOLOAD'; + @{$NEXT::NEXT{$key,$wanted_method}} = + map { + my $stash = \%{"${_}::"}; + ($stash->{AUTOLOAD} && (*{"${_}::AUTOLOAD"}{CODE})) + ? "${_}::AUTOLOAD" + : () } @forebears + unless @{$NEXT::NEXT{$key,$wanted_method}||[]}; + $NEXT::SEEN->{$key,*{$caller}{CODE}}++; + } + my $call_method = shift @{$NEXT::NEXT{$key,$wanted_method}}; + while (do { $wanted_class =~ /^NEXT\b.*\b(UNSEEN|DISTINCT)\b/ } + && defined $call_method + && $NEXT::SEEN->{$key,$call_method}++) { + $call_method = shift @{$NEXT::NEXT{$key,$wanted_method}}; + } + unless (defined $call_method) { + return unless do { $wanted_class =~ /^NEXT:.*:ACTUAL/ }; + (local $Carp::CarpLevel)++; + croak qq(Can't locate object method "$wanted_method" ), + qq(via package "$caller_class"); + }; + return $self->$call_method(@_[1..$#_]) if ref $call_method eq 'CODE'; + no strict 'refs'; + do { ($wanted_method=${$caller_class."::AUTOLOAD"}) =~ s/.*::// } + if $wanted_method eq 'AUTOLOAD'; + $$call_method = $caller_class."::NEXT::".$wanted_method; + return $call_method->(@_); + }; +} + +no strict 'vars'; +package NEXT; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::UNSEEN; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::DISTINCT; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::ACTUAL; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::ACTUAL::UNSEEN; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::ACTUAL::DISTINCT; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::UNSEEN::ACTUAL; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); +package NEXT::DISTINCT::ACTUAL; @ISA = 'NEXT'; NEXT::ELSEWHERE::buildAUTOLOAD(); + +package + EVERY; + +sub EVERY::ELSEWHERE::buildAUTOLOAD { + my $autoload_name = caller() . '::AUTOLOAD'; + + no strict 'refs'; + *{$autoload_name} = sub { + my ($self) = @_; + my $depth = 1; + until (((caller($depth))[3]||q{}) !~ /^\(eval\)$/) { $depth++ } + my $caller = (caller($depth))[3]; + my $wanted = $EVERY::AUTOLOAD || $autoload_name; + undef $EVERY::AUTOLOAD; + my ($wanted_class, $wanted_method) = do { $wanted =~ m{(.*)::(.*)}g }; + + my $key = ref($self) && overload::Overloaded($self) + ? overload::StrVal($self) : $self; + + local $NEXT::ALREADY_IN_EVERY{$key,$wanted_method} = + $NEXT::ALREADY_IN_EVERY{$key,$wanted_method}; + + return if $NEXT::ALREADY_IN_EVERY{$key,$wanted_method}++; + + my @forebears = NEXT::ELSEWHERE::ordered_ancestors ref $self || $self, + $wanted_class; + @forebears = reverse @forebears if do { $wanted_class =~ /\bLAST\b/ }; + no strict 'refs'; + my %seen; + my @every = map { my $sub = "${_}::$wanted_method"; + !*{$sub}{CODE} || $seen{$sub}++ ? () : $sub + } @forebears + unless $wanted_method eq 'AUTOLOAD'; + + my $want = wantarray; + if (@every) { + if ($want) { + return map {($_, [$self->$_(@_[1..$#_])])} @every; + } + elsif (defined $want) { + return { map {($_, scalar($self->$_(@_[1..$#_])))} + @every + }; + } + else { + $self->$_(@_[1..$#_]) for @every; + return; + } + } + + @every = map { my $sub = "${_}::AUTOLOAD"; + !*{$sub}{CODE} || $seen{$sub}++ ? () : "${_}::AUTOLOAD" + } @forebears; + if ($want) { + return map { $$_ = ref($self)."::EVERY::".$wanted_method; + ($_, [$self->$_(@_[1..$#_])]); + } @every; + } + elsif (defined $want) { + return { map { $$_ = ref($self)."::EVERY::".$wanted_method; + ($_, scalar($self->$_(@_[1..$#_]))) + } @every + }; + } + else { + for (@every) { + $$_ = ref($self)."::EVERY::".$wanted_method; + $self->$_(@_[1..$#_]); + } + return; + } + }; +} + +package EVERY::LAST; @ISA = 'EVERY'; EVERY::ELSEWHERE::buildAUTOLOAD(); +package + EVERY; @ISA = 'NEXT'; EVERY::ELSEWHERE::buildAUTOLOAD(); + +1; + +__END__ + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +use strict; +package CPAN; +$CPAN::VERSION = '2.20'; +$CPAN::VERSION =~ s/_//; + +# we need to run chdir all over and we would get at wrong libraries +# there +use File::Spec (); +BEGIN { + if (File::Spec->can("rel2abs")) { + for my $inc (@INC) { + $inc = File::Spec->rel2abs($inc) unless ref $inc; + } + } + $SIG{WINCH} = 'IGNORE' if exists $SIG{WINCH}; +} +use CPAN::Author; +use CPAN::HandleConfig; +use CPAN::Version; +use CPAN::Bundle; +use CPAN::CacheMgr; +use CPAN::Complete; +use CPAN::Debug; +use CPAN::Distribution; +use CPAN::Distrostatus; +use CPAN::FTP; +use CPAN::Index 1.93; # https://rt.cpan.org/Ticket/Display.html?id=43349 +use CPAN::InfoObj; +use CPAN::Module; +use CPAN::Prompt; +use CPAN::URL; +use CPAN::Queue; +use CPAN::Tarzip; +use CPAN::DeferredCode; +use CPAN::Shell; +use CPAN::LWP::UserAgent; +use CPAN::Exception::RecursiveDependency; +use CPAN::Exception::yaml_not_installed; +use CPAN::Exception::yaml_process_error; + +use Carp (); +use Config (); +use Cwd qw(chdir); +use DirHandle (); +use Exporter (); +use ExtUtils::MakeMaker qw(prompt); # for some unknown reason, + # 5.005_04 does not work without + # this +use File::Basename (); +use File::Copy (); +use File::Find; +use File::Path (); +use FileHandle (); +use Fcntl qw(:flock); +use Safe (); +use Sys::Hostname qw(hostname); +use Text::ParseWords (); +use Text::Wrap (); + +# protect against "called too early" +sub find_perl (); +sub anycwd (); +sub _uniq; + +no lib "."; + +require Mac::BuildTools if $^O eq 'MacOS'; +if ($ENV{PERL5_CPAN_IS_RUNNING} && $$ != $ENV{PERL5_CPAN_IS_RUNNING}) { + $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} ||= $ENV{PERL5_CPAN_IS_RUNNING}; + my @rec = _uniq split(/,/, $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION}), $$; + $ENV{PERL5_CPAN_IS_RUNNING_IN_RECURSION} = join ",", @rec; + # warn "# Note: Recursive call of CPAN.pm detected\n"; + my $w = sprintf "# Note: CPAN.pm is running in process %d now", pop @rec; + my %sleep = ( + 5 => 30, + 6 => 60, + 7 => 120, + ); + my $sleep = @rec > 7 ? 300 : ($sleep{scalar @rec}||0); + my $verbose = @rec >= 4; + while (@rec) { + $w .= sprintf " which has been called by process %d", pop @rec; + } + if ($sleep) { + $w .= ".\n\n# Sleeping $sleep seconds to protect other processes\n"; + } + if ($verbose) { + warn $w; + } + local $| = 1; + while ($sleep > 0) { + printf "\r#%5d", --$sleep; + sleep 1; + } + print "\n"; +} +$ENV{PERL5_CPAN_IS_RUNNING}=$$; +$ENV{PERL5_CPANPLUS_IS_RUNNING}=$$; # https://rt.cpan.org/Ticket/Display.html?id=23735 + +END { $CPAN::End++; &cleanup; } + +$CPAN::Signal ||= 0; +$CPAN::Frontend ||= "CPAN::Shell"; +unless (@CPAN::Defaultsites) { + @CPAN::Defaultsites = map { + CPAN::URL->new(TEXT => $_, FROM => "DEF") + } + "http://www.perl.org/CPAN/", + "ftp://ftp.perl.org/pub/CPAN/"; +} +# $CPAN::iCwd (i for initial) +$CPAN::iCwd ||= CPAN::anycwd(); +$CPAN::Perl ||= CPAN::find_perl(); +$CPAN::Defaultdocs ||= "http://search.cpan.org/perldoc?"; +$CPAN::Defaultrecent ||= "http://search.cpan.org/uploads.rdf"; +$CPAN::Defaultrecent ||= "http://cpan.uwinnipeg.ca/htdocs/cpan.xml"; + +# our globals are getting a mess +use vars qw( + $AUTOLOAD + $Be_Silent + $CONFIG_DIRTY + $Defaultdocs + $Echo_readline + $Frontend + $GOTOSHELL + $HAS_USABLE + $Have_warned + $MAX_RECURSION + $META + $RUN_DEGRADED + $Signal + $SQLite + $Suppress_readline + $VERSION + $autoload_recursion + $term + @Defaultsites + @EXPORT + ); + +$MAX_RECURSION = 32; + +@CPAN::ISA = qw(CPAN::Debug Exporter); + +# note that these functions live in CPAN::Shell and get executed via +# AUTOLOAD when called directly +@EXPORT = qw( + autobundle + bundle + clean + cvs_import + expand + force + fforce + get + install + install_tested + is_tested + make + mkmyconfig + notest + perldoc + readme + recent + recompile + report + shell + smoke + test + upgrade + ); + +sub soft_chdir_with_alternatives ($); + +{ + $autoload_recursion ||= 0; + + #-> sub CPAN::AUTOLOAD ; + sub AUTOLOAD { ## no critic + $autoload_recursion++; + my($l) = $AUTOLOAD; + $l =~ s/.*:://; + if ($CPAN::Signal) { + warn "Refusing to autoload '$l' while signal pending"; + $autoload_recursion--; + return; + } + if ($autoload_recursion > 1) { + my $fullcommand = join " ", map { "'$_'" } $l, @_; + warn "Refusing to autoload $fullcommand in recursion\n"; + $autoload_recursion--; + return; + } + my(%export); + @export{@EXPORT} = ''; + CPAN::HandleConfig->load unless $CPAN::Config_loaded++; + if (exists $export{$l}) { + CPAN::Shell->$l(@_); + } else { + die(qq{Unknown CPAN command "$AUTOLOAD". }. + qq{Type ? for help.\n}); + } + $autoload_recursion--; + } +} + +{ + my $x = *SAVEOUT; # avoid warning + open($x,">&STDOUT") or die "dup failed"; + my $redir = 0; + sub _redirect(@) { + #die if $redir; + local $_; + push(@_,undef); + while(defined($_=shift)) { + if (s/^\s*>//){ + my ($m) = s/^>// ? ">" : ""; + s/\s+//; + $_=shift unless length; + die "no dest" unless defined; + open(STDOUT,">$m$_") or die "open:$_:$!\n"; + $redir=1; + } elsif ( s/^\s*\|\s*// ) { + my $pipe="| $_"; + while(defined($_[0])){ + $pipe .= ' ' . shift; + } + open(STDOUT,$pipe) or die "open:$pipe:$!\n"; + $redir=1; + } else { + push(@_,$_); + } + } + return @_; + } + sub _unredirect { + return unless $redir; + $redir = 0; + ## redirect: unredirect and propagate errors. explicit close to wait for pipe. + close(STDOUT); + open(STDOUT,">&SAVEOUT"); + die "$@" if "$@"; + ## redirect: done + } +} + +sub _uniq { + my(@list) = @_; + my %seen; + return grep { !$seen{$_}++ } @list; +} + +#-> sub CPAN::shell ; +sub shell { + my($self) = @_; + $Suppress_readline = ! -t STDIN unless defined $Suppress_readline; + CPAN::HandleConfig->load unless $CPAN::Config_loaded++; + + my $oprompt = shift || CPAN::Prompt->new; + my $prompt = $oprompt; + my $commandline = shift || ""; + $CPAN::CurrentCommandId ||= 1; + + local($^W) = 1; + unless ($Suppress_readline) { + require Term::ReadLine; + if (! $term + or + $term->ReadLine eq "Term::ReadLine::Stub" + ) { + $term = Term::ReadLine->new('CPAN Monitor'); + } + if ($term->ReadLine eq "Term::ReadLine::Gnu") { + my $attribs = $term->Attribs; + $attribs->{attempted_completion_function} = sub { + &CPAN::Complete::gnu_cpl; + } + } else { + $readline::rl_completion_function = + $readline::rl_completion_function = 'CPAN::Complete::cpl'; + } + if (my $histfile = $CPAN::Config->{'histfile'}) {{ + unless ($term->can("AddHistory")) { + $CPAN::Frontend->mywarn("Terminal does not support AddHistory.\n"); + last; + } + $META->readhist($term,$histfile); + }} + for ($CPAN::Config->{term_ornaments}) { # alias + local $Term::ReadLine::termcap_nowarn = 1; + $term->ornaments($_) if defined; + } + # $term->OUT is autoflushed anyway + my $odef = select STDERR; + $| = 1; + select STDOUT; + $| = 1; + select $odef; + } + + $META->checklock(); + my @cwd = grep { defined $_ and length $_ } + CPAN::anycwd(), + File::Spec->can("tmpdir") ? File::Spec->tmpdir() : (), + File::Spec->rootdir(); + my $try_detect_readline; + $try_detect_readline = $term->ReadLine eq "Term::ReadLine::Stub" if $term; + unless ($CPAN::Config->{inhibit_startup_message}) { + my $rl_avail = $Suppress_readline ? "suppressed" : + ($term->ReadLine ne "Term::ReadLine::Stub") ? "enabled" : + "available (maybe install Bundle::CPAN or Bundle::CPANxxl?)"; + $CPAN::Frontend->myprint( + sprintf qq{ +cpan shell -- CPAN exploration and modules installation (v%s) +Enter 'h' for help. + +}, + $CPAN::VERSION, + ) + } + my($continuation) = ""; + my $last_term_ornaments; + SHELLCOMMAND: while () { + if ($Suppress_readline) { + if ($Echo_readline) { + $|=1; + } + print $prompt; + last SHELLCOMMAND unless defined ($_ = <> ); + if ($Echo_readline) { + # backdoor: I could not find a way to record sessions + print $_; + } + chomp; + } else { + last SHELLCOMMAND unless + defined ($_ = $term->readline($prompt, $commandline)); + } + $_ = "$continuation$_" if $continuation; + s/^\s+//; + next SHELLCOMMAND if /^$/; + s/^\s*\?\s*/help /; + if (/^(?:q(?:uit)?|bye|exit)\s*$/i) { + last SHELLCOMMAND; + } elsif (s/\\$//s) { + chomp; + $continuation = $_; + $prompt = " > "; + } elsif (/^\!/) { + s/^\!//; + my($eval) = $_; + package + CPAN::Eval; # hide from the indexer + use strict; + use vars qw($import_done); + CPAN->import(':DEFAULT') unless $import_done++; + CPAN->debug("eval[$eval]") if $CPAN::DEBUG; + eval($eval); + warn $@ if $@; + $continuation = ""; + $prompt = $oprompt; + } elsif (/./) { + my(@line); + eval { @line = Text::ParseWords::shellwords($_) }; + warn($@), next SHELLCOMMAND if $@; + warn("Text::Parsewords could not parse the line [$_]"), + next SHELLCOMMAND unless @line; + $CPAN::META->debug("line[".join("|",@line)."]") if $CPAN::DEBUG; + my $command = shift @line; + eval { + local (*STDOUT)=*STDOUT; + @line = _redirect(@line); + CPAN::Shell->$command(@line) + }; + my $command_error = $@; + _unredirect; + my $reported_error; + if ($command_error) { + my $err = $command_error; + if (ref $err and $err->isa('CPAN::Exception::blocked_urllist')) { + $CPAN::Frontend->mywarn("Client not fully configured, please proceed with configuring.$err"); + $reported_error = ref $err; + } else { + # I'd prefer never to arrive here and make all errors exception objects + if ($err =~ /\S/) { + require Carp; + require Dumpvalue; + my $dv = Dumpvalue->new(tick => '"'); + Carp::cluck(sprintf "Catching error: %s", $dv->stringify($err)); + } + } + } + if ($command =~ /^( + # classic commands + make + |test + |install + |clean + + # pragmas for classic commands + |ff?orce + |notest + + # compounds + |report + |smoke + |upgrade + )$/x) { + # only commands that tell us something about failed distros + # eval necessary for people without an urllist + eval {CPAN::Shell->failed($CPAN::CurrentCommandId,1);}; + if (my $err = $@) { + unless (ref $err and $reported_error eq ref $err) { + die $@; + } + } + } + soft_chdir_with_alternatives(\@cwd); + $CPAN::Frontend->myprint("\n"); + $continuation = ""; + $CPAN::CurrentCommandId++; + $prompt = $oprompt; + } + } continue { + $commandline = ""; # I do want to be able to pass a default to + # shell, but on the second command I see no + # use in that + $Signal=0; + CPAN::Queue->nullify_queue; + if ($try_detect_readline) { + if ($CPAN::META->has_inst("Term::ReadLine::Gnu") + || + $CPAN::META->has_inst("Term::ReadLine::Perl") + ) { + delete $INC{"Term/ReadLine.pm"}; + my $redef = 0; + local($SIG{__WARN__}) = CPAN::Shell::paintdots_onreload(\$redef); + require Term::ReadLine; + $CPAN::Frontend->myprint("\n$redef subroutines in ". + "Term::ReadLine redefined\n"); + $GOTOSHELL = 1; + } + } + if ($term and $term->can("ornaments")) { + for ($CPAN::Config->{term_ornaments}) { # alias + if (defined $_) { + if (not defined $last_term_ornaments + or $_ != $last_term_ornaments + ) { + local $Term::ReadLine::termcap_nowarn = 1; + $term->ornaments($_); + $last_term_ornaments = $_; + } + } else { + undef $last_term_ornaments; + } + } + } + for my $class (qw(Module Distribution)) { + # again unsafe meta access? + for my $dm (sort keys %{$CPAN::META->{readwrite}{"CPAN::$class"}}) { + next unless $CPAN::META->{readwrite}{"CPAN::$class"}{$dm}{incommandcolor}; + CPAN->debug("BUG: $class '$dm' was in command state, resetting"); + delete $CPAN::META->{readwrite}{"CPAN::$class"}{$dm}{incommandcolor}; + } + } + if ($GOTOSHELL) { + $GOTOSHELL = 0; # not too often + $META->savehist if $CPAN::term && $CPAN::term->can("GetHistory"); + @_ = ($oprompt,""); + goto &shell; + } + } + soft_chdir_with_alternatives(\@cwd); +} + +#-> CPAN::soft_chdir_with_alternatives ; +sub soft_chdir_with_alternatives ($) { + my($cwd) = @_; + unless (@$cwd) { + my $root = File::Spec->rootdir(); + $CPAN::Frontend->mywarn(qq{Warning: no good directory to chdir to! +Trying '$root' as temporary haven. +}); + push @$cwd, $root; + } + while () { + if (chdir $cwd->[0]) { + return; + } else { + if (@$cwd>1) { + $CPAN::Frontend->mywarn(qq{Could not chdir to "$cwd->[0]": $! +Trying to chdir to "$cwd->[1]" instead. +}); + shift @$cwd; + } else { + $CPAN::Frontend->mydie(qq{Could not chdir to "$cwd->[0]": $!}); + } + } + } +} + +sub _flock { + my($fh,$mode) = @_; + if ( $Config::Config{d_flock} || $Config::Config{d_fcntl_can_lock} ) { + return flock $fh, $mode; + } elsif (!$Have_warned->{"d_flock"}++) { + $CPAN::Frontend->mywarn("Your OS does not seem to support locking; continuing and ignoring all locking issues\n"); + $CPAN::Frontend->mysleep(5); + return 1; + } else { + return 1; + } +} + +sub _yaml_module () { + my $yaml_module = $CPAN::Config->{yaml_module} || "YAML"; + if ( + $yaml_module ne "YAML" + && + !$CPAN::META->has_inst($yaml_module) + ) { + # $CPAN::Frontend->mywarn("'$yaml_module' not installed, falling back to 'YAML'\n"); + $yaml_module = "YAML"; + } + if ($yaml_module eq "YAML" + && + $CPAN::META->has_inst($yaml_module) + && + $YAML::VERSION < 0.60 + && + !$Have_warned->{"YAML"}++ + ) { + $CPAN::Frontend->mywarn("Warning: YAML version '$YAML::VERSION' is too low, please upgrade!\n". + "I'll continue but problems are *very* likely to happen.\n" + ); + $CPAN::Frontend->mysleep(5); + } + return $yaml_module; +} + +# CPAN::_yaml_loadfile +sub _yaml_loadfile { + my($self,$local_file) = @_; + return +[] unless -s $local_file; + my $yaml_module = _yaml_module; + if ($CPAN::META->has_inst($yaml_module)) { + # temporarily enable yaml code deserialisation + no strict 'refs'; + # 5.6.2 could not do the local() with the reference + # so we do it manually instead + my $old_loadcode = ${"$yaml_module\::LoadCode"}; + ${ "$yaml_module\::LoadCode" } = $CPAN::Config->{yaml_load_code} || 0; + + my ($code, @yaml); + if ($code = UNIVERSAL::can($yaml_module, "LoadFile")) { + eval { @yaml = $code->($local_file); }; + if ($@) { + # this shall not be done by the frontend + die CPAN::Exception::yaml_process_error->new($yaml_module,$local_file,"parse",$@); + } + } elsif ($code = UNIVERSAL::can($yaml_module, "Load")) { + local *FH; + unless (open FH, $local_file) { + $CPAN::Frontend->mywarn("Could not open '$local_file': $!"); + return +[]; + } + local $/; + my $ystream = ; + eval { @yaml = $code->($ystream); }; + if ($@) { + # this shall not be done by the frontend + die CPAN::Exception::yaml_process_error->new($yaml_module,$local_file,"parse",$@); + } + } + ${"$yaml_module\::LoadCode"} = $old_loadcode; + return \@yaml; + } else { + # this shall not be done by the frontend + die CPAN::Exception::yaml_not_installed->new($yaml_module, $local_file, "parse"); + } + return +[]; +} + +# CPAN::_yaml_dumpfile +sub _yaml_dumpfile { + my($self,$local_file,@what) = @_; + my $yaml_module = _yaml_module; + if ($CPAN::META->has_inst($yaml_module)) { + my $code; + if (UNIVERSAL::isa($local_file, "FileHandle")) { + $code = UNIVERSAL::can($yaml_module, "Dump"); + eval { print $local_file $code->(@what) }; + } elsif ($code = UNIVERSAL::can($yaml_module, "DumpFile")) { + eval { $code->($local_file,@what); }; + } elsif ($code = UNIVERSAL::can($yaml_module, "Dump")) { + local *FH; + open FH, ">$local_file" or die "Could not open '$local_file': $!"; + print FH $code->(@what); + } + if ($@) { + die CPAN::Exception::yaml_process_error->new($yaml_module,$local_file,"dump",$@); + } + } else { + if (UNIVERSAL::isa($local_file, "FileHandle")) { + # I think this case does not justify a warning at all + } else { + die CPAN::Exception::yaml_not_installed->new($yaml_module, $local_file, "dump"); + } + } +} + +sub _init_sqlite () { + unless ($CPAN::META->has_inst("CPAN::SQLite")) { + $CPAN::Frontend->mywarn(qq{CPAN::SQLite not installed, trying to work without\n}) + unless $Have_warned->{"CPAN::SQLite"}++; + return; + } + require CPAN::SQLite::META; # not needed since CVS version of 2006-12-17 + $CPAN::SQLite ||= CPAN::SQLite::META->new($CPAN::META); +} + +{ + my $negative_cache = {}; + sub _sqlite_running { + if ($negative_cache->{time} && time < $negative_cache->{time} + 60) { + # need to cache the result, otherwise too slow + return $negative_cache->{fact}; + } else { + $negative_cache = {}; # reset + } + my $ret = $CPAN::Config->{use_sqlite} && ($CPAN::SQLite || _init_sqlite()); + return $ret if $ret; # fast anyway + $negative_cache->{time} = time; + return $negative_cache->{fact} = $ret; + } +} + +$META ||= CPAN->new; # In case we re-eval ourselves we need the || + +# from here on only subs. +################################################################################ + +sub _perl_fingerprint { + my($self,$other_fingerprint) = @_; + my $dll = eval {OS2::DLLname()}; + my $mtime_dll = 0; + if (defined $dll) { + $mtime_dll = (-f $dll ? (stat(_))[9] : '-1'); + } + my $mtime_perl = (-f CPAN::find_perl ? (stat(_))[9] : '-1'); + my $this_fingerprint = { + '$^X' => CPAN::find_perl, + sitearchexp => $Config::Config{sitearchexp}, + 'mtime_$^X' => $mtime_perl, + 'mtime_dll' => $mtime_dll, + }; + if ($other_fingerprint) { + if (exists $other_fingerprint->{'stat($^X)'}) { # repair fp from rev. 1.88_57 + $other_fingerprint->{'mtime_$^X'} = $other_fingerprint->{'stat($^X)'}[9]; + } + # mandatory keys since 1.88_57 + for my $key (qw($^X sitearchexp mtime_dll mtime_$^X)) { + return unless $other_fingerprint->{$key} eq $this_fingerprint->{$key}; + } + return 1; + } else { + return $this_fingerprint; + } +} + +sub suggest_myconfig () { + SUGGEST_MYCONFIG: if(!$INC{'CPAN/MyConfig.pm'}) { + $CPAN::Frontend->myprint("You don't seem to have a user ". + "configuration (MyConfig.pm) yet.\n"); + my $new = CPAN::Shell::colorable_makemaker_prompt("Do you want to create a ". + "user configuration now? (Y/n)", + "yes"); + if($new =~ m{^y}i) { + CPAN::Shell->mkmyconfig(); + return &checklock; + } else { + $CPAN::Frontend->mydie("OK, giving up."); + } + } +} + +#-> sub CPAN::all_objects ; +sub all_objects { + my($mgr,$class) = @_; + CPAN::HandleConfig->load unless $CPAN::Config_loaded++; + CPAN->debug("mgr[$mgr] class[$class]") if $CPAN::DEBUG; + CPAN::Index->reload; + values %{ $META->{readwrite}{$class} }; # unsafe meta access, ok +} + +# Called by shell, not in batch mode. In batch mode I see no risk in +# having many processes updating something as installations are +# continually checked at runtime. In shell mode I suspect it is +# unintentional to open more than one shell at a time + +#-> sub CPAN::checklock ; +sub checklock { + my($self) = @_; + my $lockfile = File::Spec->catfile($CPAN::Config->{cpan_home},".lock"); + if (-f $lockfile && -M _ > 0) { + my $fh = FileHandle->new($lockfile) or + $CPAN::Frontend->mydie("Could not open lockfile '$lockfile': $!"); + my $otherpid = <$fh>; + my $otherhost = <$fh>; + $fh->close; + if (defined $otherpid && length $otherpid) { + chomp $otherpid; + } + if (defined $otherhost && length $otherhost) { + chomp $otherhost; + } + my $thishost = hostname(); + my $ask_if_degraded_wanted = 0; + if (defined $otherhost && defined $thishost && + $otherhost ne '' && $thishost ne '' && + $otherhost ne $thishost) { + $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Lockfile '$lockfile'\n". + "reports other host $otherhost and other ". + "process $otherpid.\n". + "Cannot proceed.\n")); + } elsif ($RUN_DEGRADED) { + $CPAN::Frontend->mywarn("Running in downgraded mode (experimental)\n"); + } elsif (defined $otherpid && $otherpid) { + return if $$ == $otherpid; # should never happen + $CPAN::Frontend->mywarn( + qq{ +There seems to be running another CPAN process (pid $otherpid). Contacting... +}); + if (kill 0, $otherpid or $!{EPERM}) { + $CPAN::Frontend->mywarn(qq{Other job is running.\n}); + $ask_if_degraded_wanted = 1; + } elsif (-w $lockfile) { + my($ans) = + CPAN::Shell::colorable_makemaker_prompt + (qq{Other job not responding. Shall I overwrite }. + qq{the lockfile '$lockfile'? (Y/n)},"y"); + $CPAN::Frontend->myexit("Ok, bye\n") + unless $ans =~ /^y/i; + } else { + Carp::croak( + qq{Lockfile '$lockfile' not writable by you. }. + qq{Cannot proceed.\n}. + qq{ On UNIX try:\n}. + qq{ rm '$lockfile'\n}. + qq{ and then rerun us.\n} + ); + } + } elsif ($^O eq "MSWin32") { + $CPAN::Frontend->mywarn( + qq{ +There seems to be running another CPAN process according to '$lockfile'. +}); + $ask_if_degraded_wanted = 1; + } else { + $CPAN::Frontend->mydie(sprintf("CPAN.pm panic: Found invalid lockfile ". + "'$lockfile', please remove. Cannot proceed.\n")); + } + if ($ask_if_degraded_wanted) { + my($ans) = + CPAN::Shell::colorable_makemaker_prompt + (qq{Shall I try to run in downgraded }. + qq{mode? (Y/n)},"y"); + if ($ans =~ /^y/i) { + $CPAN::Frontend->mywarn("Running in downgraded mode (experimental). +Please report if something unexpected happens\n"); + $RUN_DEGRADED = 1; + for ($CPAN::Config) { + # XXX + # $_->{build_dir_reuse} = 0; # 2006-11-17 akoenig Why was that? + $_->{commandnumber_in_prompt} = 0; # visibility + $_->{histfile} = ""; # who should win otherwise? + $_->{cache_metadata} = 0; # better would be a lock? + $_->{use_sqlite} = 0; # better would be a write lock! + $_->{auto_commit} = 0; # we are violent, do not persist + $_->{test_report} = 0; # Oliver Paukstadt had sent wrong reports in degraded mode + } + } else { + my $msg = "You may want to kill the other job and delete the lockfile."; + if (defined $otherpid) { + $msg .= " Something like: + kill $otherpid + rm $lockfile +"; + } + $CPAN::Frontend->mydie("\n$msg"); + } + } + } + my $dotcpan = $CPAN::Config->{cpan_home}; + eval { File::Path::mkpath($dotcpan);}; + if ($@) { + # A special case at least for Jarkko. + my $firsterror = $@; + my $seconderror; + my $symlinkcpan; + if (-l $dotcpan) { + $symlinkcpan = readlink $dotcpan; + die "readlink $dotcpan failed: $!" unless defined $symlinkcpan; + eval { File::Path::mkpath($symlinkcpan); }; + if ($@) { + $seconderror = $@; + } else { + $CPAN::Frontend->mywarn(qq{ +Working directory $symlinkcpan created. +}); + } + } + unless (-d $dotcpan) { + my $mess = qq{ +Your configuration suggests "$dotcpan" as your +CPAN.pm working directory. I could not create this directory due +to this error: $firsterror\n}; + $mess .= qq{ +As "$dotcpan" is a symlink to "$symlinkcpan", +I tried to create that, but I failed with this error: $seconderror +} if $seconderror; + $mess .= qq{ +Please make sure the directory exists and is writable. +}; + $CPAN::Frontend->mywarn($mess); + return suggest_myconfig; + } + } # $@ after eval mkpath $dotcpan + if (0) { # to test what happens when a race condition occurs + for (reverse 1..10) { + print $_, "\n"; + sleep 1; + } + } + # locking + if (!$RUN_DEGRADED && !$self->{LOCKFH}) { + my $fh; + unless ($fh = FileHandle->new("+>>$lockfile")) { + $CPAN::Frontend->mywarn(qq{ + +Your configuration suggests that CPAN.pm should use a working +directory of + $CPAN::Config->{cpan_home} +Unfortunately we could not create the lock file + $lockfile +due to '$!'. + +Please make sure that the configuration variable + \$CPAN::Config->{cpan_home} +points to a directory where you can write a .lock file. You can set +this variable in either a CPAN/MyConfig.pm or a CPAN/Config.pm in your +\@INC path; +}); + return suggest_myconfig; + } + my $sleep = 1; + while (!CPAN::_flock($fh, LOCK_EX|LOCK_NB)) { + my $err = $! || "unknown error"; + if ($sleep>3) { + $CPAN::Frontend->mydie("Could not lock '$lockfile' with flock: $err; giving up\n"); + } + $CPAN::Frontend->mysleep($sleep+=0.1); + $CPAN::Frontend->mywarn("Could not lock '$lockfile' with flock: $err; retrying\n"); + } + + seek $fh, 0, 0; + truncate $fh, 0; + $fh->autoflush(1); + $fh->print($$, "\n"); + $fh->print(hostname(), "\n"); + $self->{LOCK} = $lockfile; + $self->{LOCKFH} = $fh; + } + $SIG{TERM} = sub { + my $sig = shift; + &cleanup; + $CPAN::Frontend->mydie("Got SIG$sig, leaving"); + }; + $SIG{INT} = sub { + # no blocks!!! + my $sig = shift; + &cleanup if $Signal; + die "Got yet another signal" if $Signal > 1; + $CPAN::Frontend->mydie("Got another SIG$sig") if $Signal; + $CPAN::Frontend->mywarn("Caught SIG$sig, trying to continue\n"); + $Signal++; + }; + +# From: Larry Wall +# Subject: Re: deprecating SIGDIE +# To: perl5-porters@perl.org +# Date: Thu, 30 Sep 1999 14:58:40 -0700 (PDT) +# +# The original intent of __DIE__ was only to allow you to substitute one +# kind of death for another on an application-wide basis without respect +# to whether you were in an eval or not. As a global backstop, it should +# not be used any more lightly (or any more heavily :-) than class +# UNIVERSAL. Any attempt to build a general exception model on it should +# be politely squashed. Any bug that causes every eval {} to have to be +# modified should be not so politely squashed. +# +# Those are my current opinions. It is also my opinion that polite +# arguments degenerate to personal arguments far too frequently, and that +# when they do, it's because both people wanted it to, or at least didn't +# sufficiently want it not to. +# +# Larry + + # global backstop to cleanup if we should really die + $SIG{__DIE__} = \&cleanup; + $self->debug("Signal handler set.") if $CPAN::DEBUG; +} + +#-> sub CPAN::DESTROY ; +sub DESTROY { + &cleanup; # need an eval? +} + +#-> sub CPAN::anycwd ; +sub anycwd () { + my $getcwd; + $getcwd = $CPAN::Config->{'getcwd'} || 'cwd'; + CPAN->$getcwd(); +} + +#-> sub CPAN::cwd ; +sub cwd {Cwd::cwd();} + +#-> sub CPAN::getcwd ; +sub getcwd {Cwd::getcwd();} + +#-> sub CPAN::fastcwd ; +sub fastcwd {Cwd::fastcwd();} + +#-> sub CPAN::getdcwd ; +sub getdcwd {Cwd::getdcwd();} + +#-> sub CPAN::backtickcwd ; +sub backtickcwd {my $cwd = `cwd`; chomp $cwd; $cwd} + +# Adapted from Probe::Perl +#-> sub CPAN::_perl_is_same +sub _perl_is_same { + my ($perl) = @_; + return MM->maybe_command($perl) + && `$perl -MConfig=myconfig -e print -e myconfig` eq Config->myconfig; +} + +# Adapted in part from Probe::Perl +#-> sub CPAN::find_perl ; +sub find_perl () { + if ( File::Spec->file_name_is_absolute($^X) ) { + return $^X; + } + else { + my $exe = $Config::Config{exe_ext}; + my @candidates = ( + File::Spec->catfile($CPAN::iCwd,$^X), + $Config::Config{'perlpath'}, + ); + for my $perl_name ($^X, 'perl', 'perl5', "perl$]") { + for my $path (File::Spec->path(), $Config::Config{'binexp'}) { + if ( defined($path) && length $path && -d $path ) { + my $perl = File::Spec->catfile($path,$perl_name); + push @candidates, $perl; + # try with extension if not provided already + if ($^O eq 'VMS') { + # VMS might have a file version at the end + push @candidates, $perl . $exe + unless $perl =~ m/$exe(;\d+)?$/i; + } elsif (defined $exe && length $exe) { + push @candidates, $perl . $exe + unless $perl =~ m/$exe$/i; + } + } + } + } + for my $perl ( @candidates ) { + if (MM->maybe_command($perl) && _perl_is_same($perl)) { + $^X = $perl; + return $perl; + } + } + } + return $^X; # default fall back +} + +#-> sub CPAN::exists ; +sub exists { + my($mgr,$class,$id) = @_; + CPAN::HandleConfig->load unless $CPAN::Config_loaded++; + CPAN::Index->reload; + ### Carp::croak "exists called without class argument" unless $class; + $id ||= ""; + $id =~ s/:+/::/g if $class eq "CPAN::Module"; + my $exists; + if (CPAN::_sqlite_running) { + $exists = (exists $META->{readonly}{$class}{$id} or + $CPAN::SQLite->set($class, $id)); + } else { + $exists = exists $META->{readonly}{$class}{$id}; + } + $exists ||= exists $META->{readwrite}{$class}{$id}; # unsafe meta access, ok +} + +#-> sub CPAN::delete ; +sub delete { + my($mgr,$class,$id) = @_; + delete $META->{readonly}{$class}{$id}; # unsafe meta access, ok + delete $META->{readwrite}{$class}{$id}; # unsafe meta access, ok +} + +#-> sub CPAN::has_usable +# has_inst is sometimes too optimistic, we should replace it with this +# has_usable whenever a case is given +sub has_usable { + my($self,$mod,$message) = @_; + return 1 if $HAS_USABLE->{$mod}; + my $has_inst = $self->has_inst($mod,$message); + return unless $has_inst; + my $usable; + $usable = { + + # + # these subroutines die if they believe the installed version is unusable; + # + 'CPAN::Meta' => [ + sub { + require CPAN::Meta; + unless (CPAN::Version->vge(CPAN::Meta->VERSION, 2.110350)) { + for ("Will not use CPAN::Meta, need version 2.110350\n") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + ], + + 'CPAN::Meta::Requirements' => [ + sub { + if (defined $CPAN::Meta::Requirements::VERSION + && CPAN::Version->vlt($CPAN::Meta::Requirements::VERSION, "2.120920") + ) { + delete $INC{"CPAN/Meta/Requirements.pm"}; + } + require CPAN::Meta::Requirements; + unless (CPAN::Version->vge(CPAN::Meta::Requirements->VERSION, 2.120920)) { + for ("Will not use CPAN::Meta::Requirements, need version 2.120920\n") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + ], + + LWP => [ # we frequently had "Can't locate object + # method "new" via package "LWP::UserAgent" at + # (eval 69) line 2006 + sub {require LWP}, + sub {require LWP::UserAgent}, + sub {require HTTP::Request}, + sub {require URI::URL; + unless (CPAN::Version->vge(URI::URL::->VERSION,0.08)) { + for ("Will not use URI::URL, need 0.08\n") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + ], + 'Net::FTP' => [ + sub { + my $var = $CPAN::Config->{ftp_proxy} || $ENV{ftp_proxy}; + if ($var and $var =~ /^http:/i) { + # rt #110833 + for ("Net::FTP cannot handle http proxy") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + sub {require Net::FTP}, + sub {require Net::Config}, + ], + 'HTTP::Tiny' => [ + sub { + require HTTP::Tiny; + unless (CPAN::Version->vge(HTTP::Tiny->VERSION, 0.005)) { + for ("Will not use HTTP::Tiny, need version 0.005\n") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + ], + 'File::HomeDir' => [ + sub {require File::HomeDir; + unless (CPAN::Version->vge(File::HomeDir::->VERSION, 0.52)) { + for ("Will not use File::HomeDir, need 0.52\n") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + ], + 'Archive::Tar' => [ + sub {require Archive::Tar; + my $demand = "1.50"; + unless (CPAN::Version->vge(Archive::Tar::->VERSION, $demand)) { + my $atv = Archive::Tar->VERSION; + for ("You have Archive::Tar $atv, but $demand or later is recommended. Please upgrade.\n") { + $CPAN::Frontend->mywarn($_); + # don't die, because we may need + # Archive::Tar to upgrade + } + + } + }, + ], + 'File::Temp' => [ + # XXX we should probably delete from + # %INC too so we can load after we + # installed a new enough version -- + # I'm not sure. + sub {require File::Temp; + unless (CPAN::Version->vge(File::Temp::->VERSION,0.16)) { + for ("Will not use File::Temp, need 0.16\n") { + $CPAN::Frontend->mywarn($_); + die $_; + } + } + }, + ] + }; + if ($usable->{$mod}) { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + for my $c (0..$#{$usable->{$mod}}) { + my $code = $usable->{$mod}[$c]; + my $ret = eval { &$code() }; + $ret = "" unless defined $ret; + if ($@) { + # warn "DEBUG: c[$c]\$\@[$@]ret[$ret]"; + return; + } + } + } + return $HAS_USABLE->{$mod} = 1; +} + +sub frontend { + shift; + $CPAN::Frontend = shift if @_; + $CPAN::Frontend; +} + +sub use_inst { + my ($self, $module) = @_; + + unless ($self->has_inst($module)) { + $self->frontend->mydie("$module not installed, cannot continue"); + } +} + +#-> sub CPAN::has_inst +sub has_inst { + my($self,$mod,$message) = @_; + Carp::croak("CPAN->has_inst() called without an argument") + unless defined $mod; + my %dont = map { $_ => 1 } keys %{$CPAN::META->{dontload_hash}||{}}, + keys %{$CPAN::Config->{dontload_hash}||{}}, + @{$CPAN::Config->{dontload_list}||[]}; + if (defined $message && $message eq "no" # as far as I remember only used by Nox + || + $dont{$mod} + ) { + $CPAN::META->{dontload_hash}{$mod}||=1; # unsafe meta access, ok + return 0; + } + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + my $file = $mod; + my $obj; + $file =~ s|::|/|g; + $file .= ".pm"; + if ($INC{$file}) { + # checking %INC is wrong, because $INC{LWP} may be true + # although $INC{"URI/URL.pm"} may have failed. But as + # I really want to say "blah loaded OK", I have to somehow + # cache results. + ### warn "$file in %INC"; #debug + return 1; + } elsif (eval { require $file }) { + # eval is good: if we haven't yet read the database it's + # perfect and if we have installed the module in the meantime, + # it tries again. The second require is only a NOOP returning + # 1 if we had success, otherwise it's retrying + + my $mtime = (stat $INC{$file})[9]; + # privileged files loaded by has_inst; Note: we use $mtime + # as a proxy for a checksum. + $CPAN::Shell::reload->{$file} = $mtime; + my $v = eval "\$$mod\::VERSION"; + $v = $v ? " (v$v)" : ""; + CPAN::Shell->optprint("load_module","CPAN: $mod loaded ok$v\n"); + if ($mod eq "CPAN::WAIT") { + push @CPAN::Shell::ISA, 'CPAN::WAIT'; + } + return 1; + } elsif ($mod eq "Net::FTP") { + $CPAN::Frontend->mywarn(qq{ + Please, install Net::FTP as soon as possible. CPAN.pm installs it for you + if you just type + install Bundle::libnet + +}) unless $Have_warned->{"Net::FTP"}++; + $CPAN::Frontend->mysleep(3); + } elsif ($mod eq "Digest::SHA") { + if ($Have_warned->{"Digest::SHA"}++) { + $CPAN::Frontend->mywarn(qq{CPAN: checksum security checks disabled }. + qq{because Digest::SHA not installed.\n}); + } else { + $CPAN::Frontend->mywarn(qq{ + CPAN: checksum security checks disabled because Digest::SHA not installed. + Please consider installing the Digest::SHA module. + +}); + $CPAN::Frontend->mysleep(2); + } + } elsif ($mod eq "Module::Signature") { + # NOT prefs_lookup, we are not a distro + my $check_sigs = $CPAN::Config->{check_sigs}; + if (not $check_sigs) { + # they do not want us:-( + } elsif (not $Have_warned->{"Module::Signature"}++) { + # No point in complaining unless the user can + # reasonably install and use it. + if (eval { require Crypt::OpenPGP; 1 } || + ( + defined $CPAN::Config->{'gpg'} + && + $CPAN::Config->{'gpg'} =~ /\S/ + ) + ) { + $CPAN::Frontend->mywarn(qq{ + CPAN: Module::Signature security checks disabled because Module::Signature + not installed. Please consider installing the Module::Signature module. + You may also need to be able to connect over the Internet to the public + key servers like pool.sks-keyservers.net or pgp.mit.edu. + +}); + $CPAN::Frontend->mysleep(2); + } + } + } else { + delete $INC{$file}; # if it inc'd LWP but failed during, say, URI + } + return 0; +} + +#-> sub CPAN::instance ; +sub instance { + my($mgr,$class,$id) = @_; + CPAN::Index->reload; + $id ||= ""; + # unsafe meta access, ok? + return $META->{readwrite}{$class}{$id} if exists $META->{readwrite}{$class}{$id}; + $META->{readwrite}{$class}{$id} ||= $class->new(ID => $id); +} + +#-> sub CPAN::new ; +sub new { + bless {}, shift; +} + +#-> sub CPAN::_exit_messages ; +sub _exit_messages { + my ($self) = @_; + $self->{exit_messages} ||= []; +} + +#-> sub CPAN::cleanup ; +sub cleanup { + # warn "cleanup called with arg[@_] End[$CPAN::End] Signal[$Signal]"; + local $SIG{__DIE__} = ''; + my($message) = @_; + my $i = 0; + my $ineval = 0; + my($subroutine); + while ((undef,undef,undef,$subroutine) = caller(++$i)) { + $ineval = 1, last if + $subroutine eq '(eval)'; + } + return if $ineval && !$CPAN::End; + return unless defined $META->{LOCK}; + return unless -f $META->{LOCK}; + $META->savehist; + $META->{cachemgr} ||= CPAN::CacheMgr->new('atexit'); + close $META->{LOCKFH}; + unlink $META->{LOCK}; + # require Carp; + # Carp::cluck("DEBUGGING"); + if ( $CPAN::CONFIG_DIRTY ) { + $CPAN::Frontend->mywarn("Warning: Configuration not saved.\n"); + } + $CPAN::Frontend->myprint("Lockfile removed.\n"); + for my $msg ( @{ $META->_exit_messages } ) { + $CPAN::Frontend->myprint($msg); + } +} + +#-> sub CPAN::readhist +sub readhist { + my($self,$term,$histfile) = @_; + my $histsize = $CPAN::Config->{'histsize'} || 100; + $term->Attribs->{'MaxHistorySize'} = $histsize if (defined($term->Attribs->{'MaxHistorySize'})); + my($fh) = FileHandle->new; + open $fh, "<$histfile" or return; + local $/ = "\n"; + while (<$fh>) { + chomp; + $term->AddHistory($_); + } + close $fh; +} + +#-> sub CPAN::savehist +sub savehist { + my($self) = @_; + my($histfile,$histsize); + unless ($histfile = $CPAN::Config->{'histfile'}) { + $CPAN::Frontend->mywarn("No history written (no histfile specified).\n"); + return; + } + $histsize = $CPAN::Config->{'histsize'} || 100; + if ($CPAN::term) { + unless ($CPAN::term->can("GetHistory")) { + $CPAN::Frontend->mywarn("Terminal does not support GetHistory.\n"); + return; + } + } else { + return; + } + my @h = $CPAN::term->GetHistory; + splice @h, 0, @h-$histsize if @h>$histsize; + my($fh) = FileHandle->new; + open $fh, ">$histfile" or $CPAN::Frontend->mydie("Couldn't open >$histfile: $!"); + local $\ = local $, = "\n"; + print $fh @h; + close $fh; +} + +#-> sub CPAN::is_tested +sub is_tested { + my($self,$what,$when) = @_; + unless ($what) { + Carp::cluck("DEBUG: empty what"); + return; + } + $self->{is_tested}{$what} = $when; +} + +#-> sub CPAN::reset_tested +# forget all distributions tested -- resets what gets included in PERL5LIB +sub reset_tested { + my ($self) = @_; + $self->{is_tested} = {}; +} + +#-> sub CPAN::is_installed +# unsets the is_tested flag: as soon as the thing is installed, it is +# not needed in set_perl5lib anymore +sub is_installed { + my($self,$what) = @_; + delete $self->{is_tested}{$what}; +} + +sub _list_sorted_descending_is_tested { + my($self) = @_; + my $foul = 0; + my @sorted = sort + { ($self->{is_tested}{$b}||0) <=> ($self->{is_tested}{$a}||0) } + grep + { if ($foul){ 0 } elsif (-e) { 1 } else { $foul = $_; 0 } } + keys %{$self->{is_tested}}; + if ($foul) { + $CPAN::Frontend->mywarn("Lost build_dir detected ($foul), giving up all cached test results of currently running session.\n"); + for my $dbd (sort keys %{$self->{is_tested}}) { # distro-build-dir + SEARCH: for my $d (sort { $a->id cmp $b->id } $CPAN::META->all_objects("CPAN::Distribution")) { + if ($d->{build_dir} && $d->{build_dir} eq $dbd) { + $CPAN::Frontend->mywarn(sprintf "Flushing cache for %s\n", $d->pretty_id); + $d->fforce(""); + last SEARCH; + } + } + delete $self->{is_tested}{$dbd}; + } + return (); + } else { + return @sorted; + } +} + +#-> sub CPAN::set_perl5lib +# Notes on max environment variable length: +# - Win32 : XP or later, 8191; Win2000 or NT4, 2047 +{ +my $fh; +sub set_perl5lib { + my($self,$for) = @_; + unless ($for) { + (undef,undef,undef,$for) = caller(1); + $for =~ s/.*://; + } + $self->{is_tested} ||= {}; + return unless %{$self->{is_tested}}; + my $env = $ENV{PERL5LIB}; + $env = $ENV{PERLLIB} unless defined $env; + my @env; + push @env, split /\Q$Config::Config{path_sep}\E/, $env if defined $env and length $env; + #my @dirs = map {("$_/blib/arch", "$_/blib/lib")} keys %{$self->{is_tested}}; + #$CPAN::Frontend->myprint("Prepending @dirs to PERL5LIB.\n"); + + my @dirs = map {("$_/blib/arch", "$_/blib/lib")} $self->_list_sorted_descending_is_tested; + return if !@dirs; + + if (@dirs < 12) { + $CPAN::Frontend->optprint('perl5lib', "Prepending @dirs to PERL5LIB for '$for'\n"); + $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env; + } elsif (@dirs < 24 ) { + my @d = map {my $cp = $_; + $cp =~ s/^\Q$CPAN::Config->{build_dir}\E/%BUILDDIR%/; + $cp + } @dirs; + $CPAN::Frontend->optprint('perl5lib', "Prepending @d to PERL5LIB; ". + "%BUILDDIR%=$CPAN::Config->{build_dir} ". + "for '$for'\n" + ); + $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env; + } else { + my $cnt = keys %{$self->{is_tested}}; + $CPAN::Frontend->optprint('perl5lib', "Prepending blib/arch and blib/lib of ". + "$cnt build dirs to PERL5LIB; ". + "for '$for'\n" + ); + $ENV{PERL5LIB} = join $Config::Config{path_sep}, @dirs, @env; + } +}} + + +1; + + +__END__ + +package vmsish; + +our $VERSION = '1.04'; + + +my $IsVMS = $^O eq 'VMS'; + +sub bits { + my $bits = 0; + my $sememe; + foreach $sememe (@_) { + # Those hints are defined in vms/vmsish.h : + # HINT_M_VMSISH_STATUS and HINT_M_VMSISH_TIME + $bits |= 0x40000000, next if $sememe eq 'status' || $sememe eq '$?'; + $bits |= 0x80000000, next if $sememe eq 'time'; + } + $bits; +} + +sub import { + return unless $IsVMS; + + shift; + $^H |= bits(@_ ? @_ : qw(status time)); + my $sememe; + + foreach $sememe (@_ ? @_ : qw(exit hushed)) { + $^H{'vmsish_exit'} = 1 if $sememe eq 'exit'; + vmsish::hushed(1) if $sememe eq 'hushed'; + } +} + +sub unimport { + return unless $IsVMS; + + shift; + $^H &= ~ bits(@_ ? @_ : qw(status time)); + my $sememe; + + foreach $sememe (@_ ? @_ : qw(exit hushed)) { + $^H{'vmsish_exit'} = 0 if $sememe eq 'exit'; + vmsish::hushed(0) if $sememe eq 'hushed'; + } +} + +1; +use 5.008; +package base; + +use strict 'vars'; +our $VERSION = '2.27'; +$VERSION =~ tr/_//d; + +# simplest way to avoid indexing of the package: no package statement +sub base::__inc::unhook { @INC = grep !(ref eq 'CODE' && $_ == $_[0]), @INC } +# instance is blessed array of coderefs to be removed from @INC at scope exit +sub base::__inc::scope_guard::DESTROY { base::__inc::unhook $_ for @{$_[0]} } + +# constant.pm is slow +sub SUCCESS () { 1 } + +sub PUBLIC () { 2**0 } +sub PRIVATE () { 2**1 } +sub INHERITED () { 2**2 } +sub PROTECTED () { 2**3 } + + +my $Fattr = \%fields::attr; + +sub has_fields { + my($base) = shift; + my $fglob = ${"$base\::"}{FIELDS}; + return( ($fglob && 'GLOB' eq ref($fglob) && *$fglob{HASH}) ? 1 : 0 ); +} + +sub has_attr { + my($proto) = shift; + my($class) = ref $proto || $proto; + return exists $Fattr->{$class}; +} + +sub get_attr { + $Fattr->{$_[0]} = [1] unless $Fattr->{$_[0]}; + return $Fattr->{$_[0]}; +} + +if ($] < 5.009) { + *get_fields = sub { + # Shut up a possible typo warning. + () = \%{$_[0].'::FIELDS'}; + my $f = \%{$_[0].'::FIELDS'}; + + # should be centralized in fields? perhaps + # fields::mk_FIELDS_be_OK. Peh. As long as %{ $package . '::FIELDS' } + # is used here anyway, it doesn't matter. + bless $f, 'pseudohash' if (ref($f) ne 'pseudohash'); + + return $f; + } +} +else { + *get_fields = sub { + # Shut up a possible typo warning. + () = \%{$_[0].'::FIELDS'}; + return \%{$_[0].'::FIELDS'}; + } +} + +if ($] < 5.008) { + *_module_to_filename = sub { + (my $fn = $_[0]) =~ s!::!/!g; + $fn .= '.pm'; + return $fn; + } +} +else { + *_module_to_filename = sub { + (my $fn = $_[0]) =~ s!::!/!g; + $fn .= '.pm'; + utf8::encode($fn); + return $fn; + } +} + + +sub import { + my $class = shift; + + return SUCCESS unless @_; + + # List of base classes from which we will inherit %FIELDS. + my $fields_base; + + my $inheritor = caller(0); + + my @bases; + foreach my $base (@_) { + if ( $inheritor eq $base ) { + warn "Class '$inheritor' tried to inherit from itself\n"; + } + + next if grep $_->isa($base), ($inheritor, @bases); + + # Following blocks help isolate $SIG{__DIE__} and @INC changes + { + my $sigdie; + { + local $SIG{__DIE__}; + my $fn = _module_to_filename($base); + my $dot_hidden; + eval { + my $guard; + if ($INC[-1] eq '.' && %{"$base\::"}) { + # So: the package already exists => this an optional load + # And: there is a dot at the end of @INC => we want to hide it + # However: we only want to hide it during our *own* require() + # (i.e. without affecting nested require()s). + # So we add a hook to @INC whose job is to hide the dot, but which + # first checks checks the callstack depth, because within nested + # require()s the callstack is deeper. + # Since CORE::GLOBAL::require makes it unknowable in advance what + # the exact relevant callstack depth will be, we have to record it + # inside a hook. So we put another hook just for that at the front + # of @INC, where it's guaranteed to run -- immediately. + # The dot-hiding hook does its job by sitting directly in front of + # the dot and removing itself from @INC when reached. This causes + # the dot to move up one index in @INC, causing the loop inside + # pp_require() to skip it. + # Loaded coded may disturb this precise arrangement, but that's OK + # because the hook is inert by that time. It is only active during + # the top-level require(), when @INC is in our control. The only + # possible gotcha is if other hooks already in @INC modify @INC in + # some way during that initial require(). + # Note that this jiggery hookery works just fine recursively: if + # a module loaded via base.pm uses base.pm itself, there will be + # one pair of hooks in @INC per base::import call frame, but the + # pairs from different nestings do not interfere with each other. + my $lvl; + unshift @INC, sub { return if defined $lvl; 1 while defined caller ++$lvl; () }; + splice @INC, -1, 0, sub { return if defined caller $lvl; ++$dot_hidden, &base::__inc::unhook; () }; + $guard = bless [ @INC[0,-2] ], 'base::__inc::scope_guard'; + } + require $fn + }; + if ($dot_hidden && (my @fn = grep -e && !( -d _ || -b _ ), $fn.'c', $fn)) { + require Carp; + Carp::croak(<]*> (?:line|chunk) [0-9]+)?\.\n\z/s + || $@ =~ /Compilation failed in require at .* line [0-9]+(?:, <[^>]*> (?:line|chunk) [0-9]+)?\.\n\z/; + unless (%{"$base\::"}) { + require Carp; + local $" = " "; + Carp::croak(<[0] = @$battr; + + if( keys %$dfields ) { + warn <<"END"; +$derived is inheriting from $base but already has its own fields! +This will cause problems. Be sure you use base BEFORE declaring fields. +END + + } + + # Iterate through the base's fields adding all the non-private + # ones to the derived class. Hang on to the original attribute + # (Public, Private, etc...) and add Inherited. + # This is all too complicated to do efficiently with add_fields(). + while (my($k,$v) = each %$bfields) { + my $fno; + if ($fno = $dfields->{$k} and $fno != $v) { + require Carp; + Carp::croak ("Inherited fields can't override existing fields"); + } + + if( $battr->[$v] & PRIVATE ) { + $dattr->[$v] = PRIVATE | INHERITED; + } + else { + $dattr->[$v] = INHERITED | $battr->[$v]; + $dfields->{$k} = $v; + } + } + + foreach my $idx (1..$#{$battr}) { + next if defined $dattr->[$idx]; + $dattr->[$idx] = $battr->[$idx] & INHERITED; + } +} + + +1; + +__END__ + +# You may distribute under the terms of either the GNU General Public License +# or the Artistic License (the same terms as Perl itself) +# +# (C) Paul Evans, 2011-2018 -- leonerd@leonerd.org.uk + +package Future; + +use strict; +use warnings; +no warnings 'recursion'; # Disable the "deep recursion" warning + +our $VERSION = '0.39'; + +use Carp qw(); # don't import croak +use Scalar::Util qw( weaken blessed reftype ); +use B qw( svref_2object ); +use Time::HiRes qw( gettimeofday tv_interval ); + +# we are not overloaded, but we want to check if other objects are +require overload; + +our @CARP_NOT = qw( Future::Utils ); + +use constant DEBUG => !!$ENV{PERL_FUTURE_DEBUG}; + +our $TIMES = DEBUG || $ENV{PERL_FUTURE_TIMES}; + + + + +# Callback flags +use constant { + CB_DONE => 1<<0, # Execute callback on done + CB_FAIL => 1<<1, # Execute callback on fail + CB_CANCEL => 1<<2, # Execute callback on cancellation + + CB_SELF => 1<<3, # Pass $self as first argument + CB_RESULT => 1<<4, # Pass result/failure as a list + + CB_SEQ_ONDONE => 1<<5, # Sequencing on success (->then) + CB_SEQ_ONFAIL => 1<<6, # Sequencing on failure (->else) + + CB_SEQ_IMDONE => 1<<7, # $code is in fact immediate ->done result + CB_SEQ_IMFAIL => 1<<8, # $code is in fact immediate ->fail result +}; + +use constant CB_ALWAYS => CB_DONE|CB_FAIL|CB_CANCEL; + +# Useful for identifying CODE references +sub CvNAME_FILE_LINE +{ + my ( $code ) = @_; + my $cv = svref_2object( $code ); + + my $name = join "::", $cv->STASH->NAME, $cv->GV->NAME; + return $name unless $cv->GV->NAME eq "__ANON__"; + + # $cv->GV->LINE isn't reliable, as outside of perl -d mode all anon CODE + # in the same file actually shares the same GV. :( + # Walk the optree looking for the first COP + my $cop = $cv->START; + $cop = $cop->next while $cop and ref $cop ne "B::COP" and ref $cop ne "B::NULL"; + + return $cv->GV->NAME if ref $cop eq "B::NULL"; + sprintf "%s(%s line %d)", $cv->GV->NAME, $cop->file, $cop->line; +} + +sub _callable +{ + my ( $cb ) = @_; + defined $cb and ( reftype($cb) eq 'CODE' || overload::Method($cb, '&{}') ); +} + +sub new +{ + my $proto = shift; + return bless { + ready => 0, + callbacks => [], # [] = [$type, ...] + ( DEBUG ? + ( do { my $at = Carp::shortmess( "constructed" ); + chomp $at; $at =~ s/\.$//; + constructed_at => $at } ) + : () ), + ( $TIMES ? + ( btime => [ gettimeofday ] ) + : () ), + }, ( ref $proto || $proto ); +} + +my $GLOBAL_END; +END { $GLOBAL_END = 1; } + +sub DESTROY_debug { + my $self = shift; + return if $GLOBAL_END; + return if $self->{ready} and ( $self->{reported} or !$self->{failure} ); + + my $lost_at = join " line ", (caller)[1,2]; + # We can't actually know the real line where the last reference was lost; + # a variable set to 'undef' or close of scope, because caller can't see it; + # the current op has already been updated. The best we can do is indicate + # 'near'. + + if( $self->{ready} and $self->{failure} ) { + warn "${\$self->__selfstr} was $self->{constructed_at} and was lost near $lost_at with an unreported failure of: " . + $self->{failure}[0] . "\n"; + } + elsif( !$self->{ready} ) { + warn "${\$self->__selfstr} was $self->{constructed_at} and was lost near $lost_at before it was ready.\n"; + } +} +*DESTROY = \&DESTROY_debug if DEBUG; + + +sub wrap +{ + my $class = shift; + my @values = @_; + + if( @values == 1 and blessed $values[0] and $values[0]->isa( __PACKAGE__ ) ) { + return $values[0]; + } + else { + return $class->done( @values ); + } +} + + +sub call +{ + my $class = shift; + my ( $code, @args ) = @_; + + my $f; + eval { $f = $code->( @args ); 1 } or $f = $class->fail( $@ ); + blessed $f and $f->isa( "Future" ) or $f = $class->fail( "Expected " . CvNAME_FILE_LINE($code) . " to return a Future" ); + + return $f; +} + +sub _shortmess +{ + my $at = Carp::shortmess( $_[0] ); + chomp $at; $at =~ s/\.$//; + return $at; +} + +sub _mark_ready +{ + my $self = shift; + $self->{ready} = 1; + $self->{ready_at} = _shortmess $_[0] if DEBUG; + + if( $TIMES ) { + $self->{rtime} = [ gettimeofday ]; + } + + delete $self->{on_cancel}; + my $callbacks = delete $self->{callbacks} or return; + + my $cancelled = $self->{cancelled}; + my $fail = defined $self->{failure}; + my $done = !$fail && !$cancelled; + + my @result = $done ? $self->get : + $fail ? $self->failure : + (); + + foreach my $cb ( @$callbacks ) { + my ( $flags, $code ) = @$cb; + my $is_future = blessed( $code ) && $code->isa( "Future" ); + + next if $done and not( $flags & CB_DONE ); + next if $fail and not( $flags & CB_FAIL ); + next if $cancelled and not( $flags & CB_CANCEL ); + + $self->{reported} = 1 if $fail; + + if( $is_future ) { + $done ? $code->done( @result ) : + $fail ? $code->fail( @result ) : + $code->cancel; + } + elsif( $flags & (CB_SEQ_ONDONE|CB_SEQ_ONFAIL) ) { + my ( undef, undef, $fseq ) = @$cb; + if( !$fseq ) { # weaken()ed; it might be gone now + # This warning should always be printed, even not in DEBUG mode. + # It's always an indication of a bug + Carp::carp +(DEBUG ? "${\$self->__selfstr} ($self->{constructed_at})" + : "${\$self->__selfstr} $self" ) . + " lost a sequence Future"; + next; + } + + my $f2; + if( $done and $flags & CB_SEQ_ONDONE or + $fail and $flags & CB_SEQ_ONFAIL ) { + + if( $flags & CB_SEQ_IMDONE ) { + $fseq->done( @$code ); + next; + } + elsif( $flags & CB_SEQ_IMFAIL ) { + $fseq->fail( @$code ); + next; + } + + my @args = ( + ( $flags & CB_SELF ? $self : () ), + ( $flags & CB_RESULT ? @result : () ), + ); + + unless( eval { $f2 = $code->( @args ); 1 } ) { + $fseq->fail( $@ ); + next; + } + + unless( blessed $f2 and $f2->isa( "Future" ) ) { + $fseq->fail( "Expected " . CvNAME_FILE_LINE($code) . " to return a Future" ); + next; + } + + $fseq->on_cancel( $f2 ); + } + else { + $f2 = $self; + } + + if( $f2->is_ready ) { + $f2->on_ready( $fseq ) if !$f2->{cancelled}; + } + else { + push @{ $f2->{callbacks} }, [ CB_DONE|CB_FAIL, $fseq ]; + weaken( $f2->{callbacks}[-1][1] ); + } + } + else { + $code->( + ( $flags & CB_SELF ? $self : () ), + ( $flags & CB_RESULT ? @result : () ), + ); + } + } +} + + + + +sub is_ready +{ + my $self = shift; + return $self->{ready}; +} + + +sub is_done +{ + my $self = shift; + return $self->{ready} && !$self->{failure} && !$self->{cancelled}; +} + + +sub is_failed +{ + my $self = shift; + return $self->{ready} && !!$self->{failure}; # boolify +} + + +sub is_cancelled +{ + my $self = shift; + return $self->{cancelled}; +} + + +sub state +{ + my $self = shift; + return !$self->{ready} ? "pending" : + DEBUG ? $self->{ready_at} : + $self->{failure} ? "failed" : + $self->{cancelled} ? "cancelled" : + "done"; +} + + + +sub done +{ + my $self = shift; + + if( ref $self ) { + $self->{cancelled} and return $self; + $self->{ready} and Carp::croak "${\$self->__selfstr} is already ".$self->state." and cannot be ->done"; + $self->{subs} and Carp::croak "${\$self->__selfstr} is not a leaf Future, cannot be ->done"; + $self->{result} = [ @_ ]; + $self->_mark_ready( "done" ); + } + else { + $self = $self->new; + $self->{ready} = 1; + $self->{ready_at} = _shortmess "done" if DEBUG; + $self->{result} = [ @_ ]; + } + + return $self; +} + +my $warned_done_cb; +sub done_cb +{ + my $self = shift; + $warned_done_cb or + $warned_done_cb++, warnings::warnif( deprecated => "Future->done_cb is now deprecated; use ->curry::done or sub {...}" ); + return sub { $self->done( @_ ) }; +} + + +sub fail +{ + my $self = shift; + my ( $exception, @details ) = @_; + + $_[0] or Carp::croak "$self ->fail requires an exception that is true"; + + if( ref $self ) { + $self->{cancelled} and return $self; + $self->{ready} and Carp::croak "${\$self->__selfstr} is already ".$self->state." and cannot be ->fail'ed"; + $self->{subs} and Carp::croak "${\$self->__selfstr} is not a leaf Future, cannot be ->fail'ed"; + $self->{failure} = [ $exception, @details ]; + $self->_mark_ready( "failed" ); + } + else { + $self = $self->new; + $self->{ready} = 1; + $self->{ready_at} = _shortmess "failed" if DEBUG; + $self->{failure} = [ $exception, @details ]; + } + + return $self; +} + +my $warned_fail_cb; +sub fail_cb +{ + my $self = shift; + $warned_fail_cb or + $warned_fail_cb++, warnings::warnif( deprecated => "Future->fail_cb is now deprecated; use ->curry::fail or sub {...}" ); + return sub { $self->fail( @_ ) }; +} + + +sub die :method +{ + my $self = shift; + my ( $exception, @details ) = @_; + + if( !ref $exception and $exception !~ m/\n$/ ) { + $exception .= sprintf " at %s line %d\n", (caller)[1,2]; + } + + $self->fail( $exception, @details ); +} + + +sub on_cancel +{ + my $self = shift; + my ( $code ) = @_; + + my $is_future = blessed( $code ) && $code->isa( "Future" ); + $is_future or _callable( $code ) or + Carp::croak "Expected \$code to be callable or a Future in ->on_cancel"; + + $self->{ready} and return $self; + + push @{ $self->{on_cancel} }, $code; + + return $self; +} + + + +sub on_ready +{ + my $self = shift; + my ( $code ) = @_; + + my $is_future = blessed( $code ) && $code->isa( "Future" ); + $is_future or _callable( $code ) or + Carp::croak "Expected \$code to be callable or a Future in ->on_ready"; + + if( $self->{ready} ) { + my $fail = defined $self->{failure}; + my $done = !$fail && !$self->{cancelled}; + + $self->{reported} = 1 if $fail; + + $is_future ? ( $done ? $code->done( $self->get ) : + $fail ? $code->fail( $self->failure ) : + $code->cancel ) + : $code->( $self ); + } + else { + push @{ $self->{callbacks} }, [ CB_ALWAYS|CB_SELF, $self->wrap_cb( on_ready => $code ) ]; + } + + return $self; +} + + +sub await +{ + my $self = shift; + Carp::croak "$self is not yet complete and does not provide ->await"; +} + +sub get +{ + my $self = shift; + until( $self->{ready} ) { $self->await } + if( $self->{failure} ) { + $self->{reported} = 1; + my $exception = $self->{failure}->[0]; + !ref $exception && $exception =~ m/\n$/ ? CORE::die $exception : Carp::croak $exception; + } + $self->{cancelled} and Carp::croak "${\$self->__selfstr} was cancelled"; + return $self->{result}->[0] unless wantarray; + return @{ $self->{result} }; +} + + +sub unwrap +{ + shift; # $class + my @values = @_; + + if( @values == 1 and blessed $values[0] and $values[0]->isa( __PACKAGE__ ) ) { + return $values[0]->get; + } + else { + return $values[0] if !wantarray; + return @values; + } +} + + +sub on_done +{ + my $self = shift; + my ( $code ) = @_; + + my $is_future = blessed( $code ) && $code->isa( "Future" ); + $is_future or _callable( $code ) or + Carp::croak "Expected \$code to be callable or a Future in ->on_done"; + + if( $self->{ready} ) { + return $self if $self->{failure} or $self->{cancelled}; + + $is_future ? $code->done( $self->get ) + : $code->( $self->get ); + } + else { + push @{ $self->{callbacks} }, [ CB_DONE|CB_RESULT, $self->wrap_cb( on_done => $code ) ]; + } + + return $self; +} + + +sub failure +{ + my $self = shift; + until( $self->{ready} ) { $self->await } + return unless $self->{failure}; + $self->{reported} = 1; + return $self->{failure}->[0] if !wantarray; + return @{ $self->{failure} }; +} + + +sub on_fail +{ + my $self = shift; + my ( $code ) = @_; + + my $is_future = blessed( $code ) && $code->isa( "Future" ); + $is_future or _callable( $code ) or + Carp::croak "Expected \$code to be callable or a Future in ->on_fail"; + + if( $self->{ready} ) { + return $self if not $self->{failure}; + $self->{reported} = 1; + + $is_future ? $code->fail( $self->failure ) + : $code->( $self->failure ); + } + else { + push @{ $self->{callbacks} }, [ CB_FAIL|CB_RESULT, $self->wrap_cb( on_fail => $code ) ]; + } + + return $self; +} + + +sub cancel +{ + my $self = shift; + + return $self if $self->{ready}; + + $self->{cancelled}++; + foreach my $code ( reverse @{ $self->{on_cancel} || [] } ) { + my $is_future = blessed( $code ) && $code->isa( "Future" ); + $is_future ? $code->cancel + : $code->( $self ); + } + $self->_mark_ready( "cancel" ); + + return $self; +} + +my $warned_cancel_cb; +sub cancel_cb +{ + my $self = shift; + $warned_cancel_cb or + $warned_cancel_cb++, warnings::warnif( deprecated => "Future->cancel_cb is now deprecated; use ->curry::cancel or sub {...}" ); + return sub { $self->cancel }; +} + + +sub _sequence +{ + my $f1 = shift; + my ( $code, $flags ) = @_; + + # For later, we might want to know where we were called from + my $func = (caller 1)[3]; + $func =~ s/^.*:://; + + $flags & (CB_SEQ_IMDONE|CB_SEQ_IMFAIL) or _callable( $code ) or + Carp::croak "Expected \$code to be callable in ->$func"; + + if( !defined wantarray ) { + Carp::carp "Calling ->$func in void context"; + } + + if( $f1->is_ready ) { + # Take a shortcut + return $f1 if $f1->is_done and not( $flags & CB_SEQ_ONDONE ) or + $f1->failure and not( $flags & CB_SEQ_ONFAIL ); + + if( $flags & CB_SEQ_IMDONE ) { + return Future->done( @$code ); + } + elsif( $flags & CB_SEQ_IMFAIL ) { + return Future->fail( @$code ); + } + + my @args = ( + ( $flags & CB_SELF ? $f1 : () ), + ( $flags & CB_RESULT ? $f1->is_done ? $f1->get : + $f1->failure ? $f1->failure : + () : () ), + ); + + my $fseq; + unless( eval { $fseq = $code->( @args ); 1 } ) { + return Future->fail( $@ ); + } + + unless( blessed $fseq and $fseq->isa( "Future" ) ) { + return Future->fail( "Expected " . CvNAME_FILE_LINE($code) . " to return a Future" ); + } + + return $fseq; + } + + my $fseq = $f1->new; + $fseq->on_cancel( $f1 ); + + # TODO: if anyone cares about the op name, we might have to synthesize it + # from $flags + $code = $f1->wrap_cb( sequence => $code ) unless $flags & (CB_SEQ_IMDONE|CB_SEQ_IMFAIL); + + push @{ $f1->{callbacks} }, [ CB_DONE|CB_FAIL|$flags, $code, $fseq ]; + weaken( $f1->{callbacks}[-1][2] ); + + return $fseq; +} + + +my $make_donecatchfail_sub = sub { + my ( $with_f, $done_code, $fail_code, @catch_list ) = @_; + + my $func = (caller 1)[3]; + $func =~ s/^.*:://; + + !$done_code or _callable( $done_code ) or + Carp::croak "Expected \$done_code to be callable in ->$func"; + !$fail_code or _callable( $fail_code ) or + Carp::croak "Expected \$fail_code to be callable in ->$func"; + + my %catch_handlers = @catch_list; + _callable( $catch_handlers{$_} ) or + Carp::croak "Expected catch handler for '$_' to be callable in ->$func" + for keys %catch_handlers; + + sub { + my $self = shift; + my @maybe_self = $with_f ? ( $self ) : (); + + if( !$self->{failure} ) { + return $self unless $done_code; + return $done_code->( @maybe_self, $self->get ); + } + else { + my $name = $self->{failure}[1]; + if( defined $name and $catch_handlers{$name} ) { + return $catch_handlers{$name}->( @maybe_self, $self->failure ); + } + return $self unless $fail_code; + return $fail_code->( @maybe_self, $self->failure ); + } + }; +}; + +sub then +{ + my $self = shift; + my $done_code = shift; + my $fail_code = ( @_ % 2 ) ? pop : undef; + my @catch_list = @_; + + if( $done_code and !@catch_list and !$fail_code ) { + return $self->_sequence( $done_code, CB_SEQ_ONDONE|CB_RESULT ); + } + + # Complex + return $self->_sequence( $make_donecatchfail_sub->( + 0, $done_code, $fail_code, @catch_list, + ), CB_SEQ_ONDONE|CB_SEQ_ONFAIL|CB_SELF ); +} + +sub else +{ + my $self = shift; + my ( $fail_code ) = @_; + + return $self->_sequence( $fail_code, CB_SEQ_ONFAIL|CB_RESULT ); +} + + +sub catch +{ + my $self = shift; + my $fail_code = ( @_ % 2 ) ? pop : undef; + my @catch_list = @_; + + return $self->_sequence( $make_donecatchfail_sub->( + 0, undef, $fail_code, @catch_list, + ), CB_SEQ_ONDONE|CB_SEQ_ONFAIL|CB_SELF ); +} + + +sub transform +{ + my $self = shift; + my %args = @_; + + my $xfrm_done = $args{done}; + my $xfrm_fail = $args{fail}; + + return $self->_sequence( sub { + my $self = shift; + if( !$self->{failure} ) { + return $self unless $xfrm_done; + my @result = $xfrm_done->( $self->get ); + return $self->new->done( @result ); + } + else { + return $self unless $xfrm_fail; + my @failure = $xfrm_fail->( $self->failure ); + return $self->new->fail( @failure ); + } + }, CB_SEQ_ONDONE|CB_SEQ_ONFAIL|CB_SELF ); +} + + +sub then_with_f +{ + my $self = shift; + my $done_code = shift; + my $fail_code = ( @_ % 2 ) ? pop : undef; + my @catch_list = @_; + + if( $done_code and !@catch_list and !$fail_code ) { + return $self->_sequence( $done_code, CB_SEQ_ONDONE|CB_SELF|CB_RESULT ); + } + + return $self->_sequence( $make_donecatchfail_sub->( + 1, $done_code, $fail_code, @catch_list, + ), CB_SEQ_ONDONE|CB_SEQ_ONFAIL|CB_SELF ); +} + + +sub then_done +{ + my $self = shift; + my ( @result ) = @_; + return $self->_sequence( \@result, CB_SEQ_ONDONE|CB_SEQ_IMDONE ); +} + +sub then_fail +{ + my $self = shift; + my ( @failure ) = @_; + return $self->_sequence( \@failure, CB_SEQ_ONDONE|CB_SEQ_IMFAIL ); +} + + +sub else_with_f +{ + my $self = shift; + my ( $fail_code ) = @_; + + return $self->_sequence( $fail_code, CB_SEQ_ONFAIL|CB_SELF|CB_RESULT ); +} + + +sub else_done +{ + my $self = shift; + my ( @result ) = @_; + return $self->_sequence( \@result, CB_SEQ_ONFAIL|CB_SEQ_IMDONE ); +} + +sub else_fail +{ + my $self = shift; + my ( @failure ) = @_; + return $self->_sequence( \@failure, CB_SEQ_ONFAIL|CB_SEQ_IMFAIL ); +} + + +sub catch_with_f +{ + my $self = shift; + my $fail_code = ( @_ % 2 ) ? pop : undef; + my @catch_list = @_; + + return $self->_sequence( $make_donecatchfail_sub->( + 1, undef, $fail_code, @catch_list, + ), CB_SEQ_ONDONE|CB_SEQ_ONFAIL|CB_SELF ); +} + + +sub followed_by +{ + my $self = shift; + my ( $code ) = @_; + + return $self->_sequence( $code, CB_SEQ_ONDONE|CB_SEQ_ONFAIL|CB_SELF ); +} + + +sub without_cancel +{ + my $self = shift; + my $new = $self->new; + + $self->on_ready( sub { + my $self = shift; + if( $self->failure ) { + $new->fail( $self->failure ); + } + else { + $new->done( $self->get ); + } + }); + + $new->{orig} = $self; # just to strongref it - RT122920 + $new->on_ready( sub { undef $_[0]->{orig} } ); + + return $new; +} + + +sub retain +{ + my $self = shift; + return $self->on_ready( sub { undef $self } ); +} + + +sub _new_convergent +{ + shift; # ignore this class + my ( $subs ) = @_; + + foreach my $sub ( @$subs ) { + blessed $sub and $sub->isa( "Future" ) or Carp::croak "Expected a Future, got $sub"; + } + + # Find the best prototype. Ideally anything derived if we can find one. + my $self; + ref($_) eq "Future" or $self = $_->new, last for @$subs; + + # No derived ones; just have to be a basic class then + $self ||= Future->new; + + $self->{subs} = $subs; + + # This might be called by a DESTROY during global destruction so it should + # be as defensive as possible (see RT88967) + $self->on_cancel( sub { + foreach my $sub ( @$subs ) { + $sub->cancel if $sub and !$sub->{ready}; + } + } ); + + return $self; +} + + +sub wait_all +{ + my $class = shift; + my @subs = @_; + + unless( @subs ) { + my $self = $class->done; + $self->{subs} = []; + return $self; + } + + my $self = Future->_new_convergent( \@subs ); + + my $pending = 0; + $_->{ready} or $pending++ for @subs; + + # Look for immediate ready + if( !$pending ) { + $self->{result} = [ @subs ]; + $self->_mark_ready( "wait_all" ); + return $self; + } + + weaken( my $weakself = $self ); + my $sub_on_ready = sub { + return unless my $self = $weakself; + + $pending--; + $pending and return; + + $self->{result} = [ @subs ]; + $self->_mark_ready( "wait_all" ); + }; + + foreach my $sub ( @subs ) { + $sub->{ready} or $sub->on_ready( $sub_on_ready ); + } + + return $self; +} + + +sub wait_any +{ + my $class = shift; + my @subs = @_; + + unless( @subs ) { + my $self = $class->fail( "Cannot ->wait_any with no subfutures" ); + $self->{subs} = []; + return $self; + } + + my $self = Future->_new_convergent( \@subs ); + + # Look for immediate ready + my $immediate_ready; + foreach my $sub ( @subs ) { + $sub->{ready} and $immediate_ready = $sub, last; + } + + if( $immediate_ready ) { + foreach my $sub ( @subs ) { + $sub->{ready} or $sub->cancel; + } + + if( $immediate_ready->{failure} ) { + $self->{failure} = [ $immediate_ready->failure ]; + } + else { + $self->{result} = [ $immediate_ready->get ]; + } + $self->_mark_ready( "wait_any" ); + return $self; + } + + my $pending = 0; + + weaken( my $weakself = $self ); + my $sub_on_ready = sub { + return unless my $self = $weakself; + return if $self->{result} or $self->{failure}; # don't recurse on child ->cancel + + return if --$pending and $_[0]->{cancelled}; + + if( $_[0]->{cancelled} ) { + $self->{failure} = [ "All component futures were cancelled" ]; + } + elsif( $_[0]->{failure} ) { + $self->{failure} = [ $_[0]->failure ]; + } + else { + $self->{result} = [ $_[0]->get ]; + } + + foreach my $sub ( @subs ) { + $sub->{ready} or $sub->cancel; + } + + $self->_mark_ready( "wait_any" ); + }; + + foreach my $sub ( @subs ) { + # No need to test $sub->{ready} since we know none of them are + $sub->on_ready( $sub_on_ready ); + $pending++; + } + + return $self; +} + + +sub needs_all +{ + my $class = shift; + my @subs = @_; + + unless( @subs ) { + my $self = $class->done; + $self->{subs} = []; + return $self; + } + + my $self = Future->_new_convergent( \@subs ); + + # Look for immediate fail + my $immediate_fail; + foreach my $sub ( @subs ) { + $sub->{ready} and $sub->{failure} and $immediate_fail = $sub, last; + } + + if( $immediate_fail ) { + foreach my $sub ( @subs ) { + $sub->{ready} or $sub->cancel; + } + + $self->{failure} = [ $immediate_fail->failure ]; + $self->_mark_ready( "needs_all" ); + return $self; + } + + my $pending = 0; + $_->{ready} or $pending++ for @subs; + + # Look for immediate done + if( !$pending ) { + $self->{result} = [ map { $_->get } @subs ]; + $self->_mark_ready( "needs_all" ); + return $self; + } + + weaken( my $weakself = $self ); + my $sub_on_ready = sub { + return unless my $self = $weakself; + return if $self->{result} or $self->{failure}; # don't recurse on child ->cancel + + if( $_[0]->{cancelled} ) { + $self->{failure} = [ "A component future was cancelled" ]; + foreach my $sub ( @subs ) { + $sub->cancel if !$sub->{ready}; + } + $self->_mark_ready( "needs_all" ); + } + elsif( my @failure = $_[0]->failure ) { + $self->{failure} = \@failure; + foreach my $sub ( @subs ) { + $sub->cancel if !$sub->{ready}; + } + $self->_mark_ready( "needs_all" ); + } + else { + $pending--; + $pending and return; + + $self->{result} = [ map { $_->get } @subs ]; + $self->_mark_ready( "needs_all" ); + } + }; + + foreach my $sub ( @subs ) { + $sub->{ready} or $sub->on_ready( $sub_on_ready ); + } + + return $self; +} + + +sub needs_any +{ + my $class = shift; + my @subs = @_; + + unless( @subs ) { + my $self = $class->fail( "Cannot ->needs_any with no subfutures" ); + $self->{subs} = []; + return $self; + } + + my $self = Future->_new_convergent( \@subs ); + + # Look for immediate done + my $immediate_done; + my $pending = 0; + foreach my $sub ( @subs ) { + $sub->{ready} and !$sub->{failure} and $immediate_done = $sub, last; + $sub->{ready} or $pending++; + } + + if( $immediate_done ) { + foreach my $sub ( @subs ) { + $sub->{ready} ? $sub->{reported} = 1 : $sub->cancel; + } + + $self->{result} = [ $immediate_done->get ]; + $self->_mark_ready( "needs_any" ); + return $self; + } + + # Look for immediate fail + my $immediate_fail = 1; + foreach my $sub ( @subs ) { + $sub->{ready} or $immediate_fail = 0, last; + } + + if( $immediate_fail ) { + $_->{reported} = 1 for @subs; + # For consistency we'll pick the last one for the failure + $self->{failure} = [ $subs[-1]->{failure} ]; + $self->_mark_ready( "needs_any" ); + return $self; + } + + weaken( my $weakself = $self ); + my $sub_on_ready = sub { + return unless my $self = $weakself; + return if $self->{result} or $self->{failure}; # don't recurse on child ->cancel + + return if --$pending and $_[0]->{cancelled}; + + if( $_[0]->{cancelled} ) { + $self->{failure} = [ "All component futures were cancelled" ]; + $self->_mark_ready( "needs_any" ); + } + elsif( my @failure = $_[0]->failure ) { + $pending and return; + + $self->{failure} = \@failure; + $self->_mark_ready( "needs_any" ); + } + else { + $self->{result} = [ $_[0]->get ]; + foreach my $sub ( @subs ) { + $sub->cancel if !$sub->{ready}; + } + $self->_mark_ready( "needs_any" ); + } + }; + + foreach my $sub ( @subs ) { + $sub->{ready} or $sub->on_ready( $sub_on_ready ); + } + + return $self; +} + + + +sub pending_futures +{ + my $self = shift; + $self->{subs} or Carp::croak "Cannot call ->pending_futures on a non-convergent Future"; + return grep { not $_->{ready} } @{ $self->{subs} }; +} + +sub ready_futures +{ + my $self = shift; + $self->{subs} or Carp::croak "Cannot call ->ready_futures on a non-convergent Future"; + return grep { $_->{ready} } @{ $self->{subs} }; +} + +sub done_futures +{ + my $self = shift; + $self->{subs} or Carp::croak "Cannot call ->done_futures on a non-convergent Future"; + return grep { $_->{ready} and not $_->{failure} and not $_->{cancelled} } @{ $self->{subs} }; +} + +sub failed_futures +{ + my $self = shift; + $self->{subs} or Carp::croak "Cannot call ->failed_futures on a non-convergent Future"; + return grep { $_->{ready} and $_->{failure} } @{ $self->{subs} }; +} + +sub cancelled_futures +{ + my $self = shift; + $self->{subs} or Carp::croak "Cannot call ->cancelled_futures on a non-convergent Future"; + return grep { $_->{ready} and $_->{cancelled} } @{ $self->{subs} }; +} + + +sub set_label +{ + my $self = shift; + ( $self->{label} ) = @_; + return $self; +} + +sub label +{ + my $self = shift; + return $self->{label}; +} + +sub __selfstr +{ + my $self = shift; + return "$self" unless defined $self->{label}; + return "$self (\"$self->{label}\")"; +} + + +sub btime +{ + my $self = shift; + return $self->{btime}; +} + +sub rtime +{ + my $self = shift; + return $self->{rtime}; +} + + +sub elapsed +{ + my $self = shift; + return undef unless defined $self->{btime} and defined $self->{rtime}; + return $self->{elapsed} ||= tv_interval( $self->{btime}, $self->{rtime} ); +} + + +sub wrap_cb +{ + my $self = shift; + my ( $op, $cb ) = @_; + return $cb; +} + + + + + + +0x55AA; +package bytes; + +sub length (_) { + BEGIN { bytes::import() } + return CORE::length($_[0]); +} + +sub substr ($$;$$) { + BEGIN { bytes::import() } + return + @_ == 2 ? CORE::substr($_[0], $_[1]) : + @_ == 3 ? CORE::substr($_[0], $_[1], $_[2]) : + CORE::substr($_[0], $_[1], $_[2], $_[3]) ; +} + +sub ord (_) { + BEGIN { bytes::import() } + return CORE::ord($_[0]); +} + +sub chr (_) { + BEGIN { bytes::import() } + return CORE::chr($_[0]); +} + +sub index ($$;$) { + BEGIN { bytes::import() } + return + @_ == 2 ? CORE::index($_[0], $_[1]) : + CORE::index($_[0], $_[1], $_[2]) ; +} + +sub rindex ($$;$) { + BEGIN { bytes::import() } + return + @_ == 2 ? CORE::rindex($_[0], $_[1]) : + CORE::rindex($_[0], $_[1], $_[2]) ; +} + +1; +package constant; +use 5.008; +use strict; +use warnings::register; + +our $VERSION = '1.33'; +our %declared; + +#======================================================================= + +# Some names are evil choices. +my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD }; +$keywords{UNITCHECK}++ if $] > 5.009; + +my %forced_into_main = map +($_, 1), + qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG }; + +my %forbidden = (%keywords, %forced_into_main); + +my $normal_constant_name = qr/^_?[^\W_0-9]\w*\z/; +my $tolerable = qr/^[A-Za-z_]\w*\z/; +my $boolean = qr/^[01]?\z/; + +BEGIN { + # We'd like to do use constant _CAN_PCS => $] > 5.009002 + # but that's a bit tricky before we load the constant module :-) + # By doing this, we save several run time checks for *every* call + # to import. + my $const = $] > 5.009002; + my $downgrade = $] < 5.015004; # && $] >= 5.008 + my $constarray = exists &_make_const; + if ($const) { + Internals::SvREADONLY($const, 1); + Internals::SvREADONLY($downgrade, 1); + $constant::{_CAN_PCS} = \$const; + $constant::{_DOWNGRADE} = \$downgrade; + $constant::{_CAN_PCS_FOR_ARRAY} = \$constarray; + } + else { + no strict 'refs'; + *{"_CAN_PCS"} = sub () {$const}; + *{"_DOWNGRADE"} = sub () { $downgrade }; + *{"_CAN_PCS_FOR_ARRAY"} = sub () { $constarray }; + } +} + +#======================================================================= +# import() - import symbols into user's namespace +# +# What we actually do is define a function in the caller's namespace +# which returns the value. The function we create will normally +# be inlined as a constant, thereby avoiding further sub calling +# overhead. +#======================================================================= +sub import { + my $class = shift; + return unless @_; # Ignore 'use constant;' + my $constants; + my $multiple = ref $_[0]; + my $caller = caller; + my $flush_mro; + my $symtab; + + if (_CAN_PCS) { + no strict 'refs'; + $symtab = \%{$caller . '::'}; + }; + + if ( $multiple ) { + if (ref $_[0] ne 'HASH') { + require Carp; + Carp::croak("Invalid reference type '".ref(shift)."' not 'HASH'"); + } + $constants = shift; + } else { + unless (defined $_[0]) { + require Carp; + Carp::croak("Can't use undef as constant name"); + } + $constants->{+shift} = undef; + } + + foreach my $name ( keys %$constants ) { + my $pkg; + my $symtab = $symtab; + my $orig_name = $name; + if ($name =~ s/(.*)(?:::|')(?=.)//s) { + $pkg = $1; + if (_CAN_PCS && $pkg ne $caller) { + no strict 'refs'; + $symtab = \%{$pkg . '::'}; + } + } + else { + $pkg = $caller; + } + + # Normal constant name + if ($name =~ $normal_constant_name and !$forbidden{$name}) { + # Everything is okay + + # Name forced into main, but we're not in main. Fatal. + } elsif ($forced_into_main{$name} and $pkg ne 'main') { + require Carp; + Carp::croak("Constant name '$name' is forced into main::"); + + # Starts with double underscore. Fatal. + } elsif ($name =~ /^__/) { + require Carp; + Carp::croak("Constant name '$name' begins with '__'"); + + # Maybe the name is tolerable + } elsif ($name =~ $tolerable) { + # Then we'll warn only if you've asked for warnings + if (warnings::enabled()) { + if ($keywords{$name}) { + warnings::warn("Constant name '$name' is a Perl keyword"); + } elsif ($forced_into_main{$name}) { + warnings::warn("Constant name '$name' is " . + "forced into package main::"); + } + } + + # Looks like a boolean + # use constant FRED == fred; + } elsif ($name =~ $boolean) { + require Carp; + if (@_) { + Carp::croak("Constant name '$name' is invalid"); + } else { + Carp::croak("Constant name looks like boolean value"); + } + + } else { + # Must have bad characters + require Carp; + Carp::croak("Constant name '$name' has invalid characters"); + } + + { + no strict 'refs'; + my $full_name = "${pkg}::$name"; + $declared{$full_name}++; + if ($multiple || @_ == 1) { + my $scalar = $multiple ? $constants->{$orig_name} : $_[0]; + + if (_DOWNGRADE) { # for 5.8 to 5.14 + # Work around perl bug #31991: Sub names (actually glob + # names in general) ignore the UTF8 flag. So we have to + # turn it off to get the "right" symbol table entry. + utf8::is_utf8 $name and utf8::encode $name; + } + + # The constant serves to optimise this entire block out on + # 5.8 and earlier. + if (_CAN_PCS) { + # Use a reference as a proxy for a constant subroutine. + # If this is not a glob yet, it saves space. If it is + # a glob, we must still create it this way to get the + # right internal flags set, as constants are distinct + # from subroutines created with sub(){...}. + # The check in Perl_ck_rvconst knows that inlinable + # constants from cv_const_sv are read only. So we have to: + Internals::SvREADONLY($scalar, 1); + if (!exists $symtab->{$name}) { + $symtab->{$name} = \$scalar; + ++$flush_mro->{$pkg}; + } + else { + local $constant::{_dummy} = \$scalar; + *$full_name = \&{"_dummy"}; + } + } else { + *$full_name = sub () { $scalar }; + } + } elsif (@_) { + my @list = @_; + if (_CAN_PCS_FOR_ARRAY) { + _make_const($list[$_]) for 0..$#list; + _make_const(@list); + if (!exists $symtab->{$name}) { + $symtab->{$name} = \@list; + $flush_mro->{$pkg}++; + } + else { + local $constant::{_dummy} = \@list; + *$full_name = \&{"_dummy"}; + } + } + else { *$full_name = sub () { @list }; } + } else { + *$full_name = sub () { }; + } + } + } + # Flush the cache exactly once if we make any direct symbol table changes. + if (_CAN_PCS && $flush_mro) { + mro::method_changed_in($_) for keys %$flush_mro; + } +} + +1; + +__END__ + +package AutoLoader; + +use strict; +use 5.006_001; + +our($VERSION, $AUTOLOAD); + +my $is_dosish; +my $is_epoc; +my $is_vms; +my $is_macos; + +BEGIN { + $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare'; + $is_epoc = $^O eq 'epoc'; + $is_vms = $^O eq 'VMS'; + $is_macos = $^O eq 'MacOS'; + $VERSION = '5.74'; +} + +AUTOLOAD { + my $sub = $AUTOLOAD; + autoload_sub($sub); + goto &$sub; +} + +sub autoload_sub { + my $sub = shift; + + my $filename = AutoLoader::find_filename( $sub ); + + my $save = $@; + local $!; # Do not munge the value. + eval { local $SIG{__DIE__}; require $filename }; + if ($@) { + if (substr($sub,-9) eq '::DESTROY') { + no strict 'refs'; + *$sub = sub {}; + $@ = undef; + } elsif ($@ =~ /^Can't locate/) { + # The load might just have failed because the filename was too + # long for some old SVR3 systems which treat long names as errors. + # If we can successfully truncate a long name then it's worth a go. + # There is a slight risk that we could pick up the wrong file here + # but autosplit should have warned about that when splitting. + if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ + eval { local $SIG{__DIE__}; require $filename }; + } + } + if ($@){ + $@ =~ s/ at .*\n//; + my $error = $@; + require Carp; + Carp::croak($error); + } + } + $@ = $save; + + return 1; +} + +sub find_filename { + my $sub = shift; + my $filename; + # Braces used to preserve $1 et al. + { + # Try to find the autoloaded file from the package-qualified + # name of the sub. e.g., if the sub needed is + # Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is + # something like '/usr/lib/perl5/Getopt/Long.pm', and the + # autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'. + # + # However, if @INC is a relative path, this might not work. If, + # for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is + # 'lib/Getopt/Long.pm', and we want to require + # 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib'). + # In this case, we simple prepend the 'auto/' and let the + # C take care of the searching for us. + + my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/); + $pkg =~ s#::#/#g; + if (defined($filename = $INC{"$pkg.pm"})) { + if ($is_macos) { + $pkg =~ tr#/#:#; + $filename = undef + unless $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s; + } else { + $filename = undef + unless $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s; + } + + # if the file exists, then make sure that it is a + # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al', + # or './lib/auto/foo/bar.al'. This avoids C searching + # (and failing) to find the 'lib/auto/foo/bar.al' because it + # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib'). + + if (defined $filename and -r $filename) { + unless ($filename =~ m|^/|s) { + if ($is_dosish) { + unless ($filename =~ m{^([a-z]:)?[\\/]}is) { + if ($^O ne 'NetWare') { + $filename = "./$filename"; + } else { + $filename = "$filename"; + } + } + } + elsif ($is_epoc) { + unless ($filename =~ m{^([a-z?]:)?[\\/]}is) { + $filename = "./$filename"; + } + } + elsif ($is_vms) { + # XXX todo by VMSmiths + $filename = "./$filename"; + } + elsif (!$is_macos) { + $filename = "./$filename"; + } + } + } + else { + $filename = undef; + } + } + unless (defined $filename) { + # let C do the searching + $filename = "auto/$sub.al"; + $filename =~ s#::#/#g; + } + } + return $filename; +} + +sub import { + my $pkg = shift; + my $callpkg = caller; + + # + # Export symbols, but not by accident of inheritance. + # + + if ($pkg eq 'AutoLoader') { + if ( @_ and $_[0] =~ /^&?AUTOLOAD$/ ) { + no strict 'refs'; + *{ $callpkg . '::AUTOLOAD' } = \&AUTOLOAD; + } + } + + # + # Try to find the autosplit index file. Eg., if the call package + # is POSIX, then $INC{POSIX.pm} is something like + # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in + # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that. + # + # However, if @INC is a relative path, this might not work. If, + # for example, @INC = ('lib'), then + # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require + # 'auto/POSIX/autosplit.ix' (without the leading 'lib'). + # + + (my $calldir = $callpkg) =~ s#::#/#g; + my $path = $INC{$calldir . '.pm'}; + if (defined($path)) { + # Try absolute path name, but only eval it if the + # transformation from module path to autosplit.ix path + # succeeded! + my $replaced_okay; + if ($is_macos) { + (my $malldir = $calldir) =~ tr#/#:#; + $replaced_okay = ($path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s); + } else { + $replaced_okay = ($path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#); + } + + eval { require $path; } if $replaced_okay; + # If that failed, try relative path with normal @INC searching. + if (!$replaced_okay or $@) { + $path ="auto/$calldir/autosplit.ix"; + eval { require $path; }; + } + if ($@) { + my $error = $@; + require Carp; + Carp::carp($error); + } + } +} + +sub unimport { + my $callpkg = caller; + + no strict 'refs'; + + for my $exported (qw( AUTOLOAD )) { + my $symname = $callpkg . '::' . $exported; + undef *{ $symname } if \&{ $symname } == \&{ $exported }; + *{ $symname } = \&{ $symname }; + } +} + +1; + +__END__ + +require 5.014; # For more reliable $@ after eval +package dumpvar; + +# Needed for PrettyPrinter only: + +# require 5.001; # Well, it coredumps anyway undef DB in 5.000 (not now) + +# translate control chars to ^X - Randal Schwartz +# Modifications to print types by Peter Gordon v1.0 + +# Ilya Zakharevich -- patches after 5.001 (and some before ;-) + +# Won't dump symbol tables and contents of debugged files by default + +$winsize = 80 unless defined $winsize; + +sub ASCII { return ord('A') == 65; } + + +# Defaults + +# $globPrint = 1; +$printUndef = 1 unless defined $printUndef; +$tick = "auto" unless defined $tick; +$unctrl = 'quote' unless defined $unctrl; +$subdump = 1; +$dumpReused = 0 unless defined $dumpReused; +$bareStringify = 1 unless defined $bareStringify; + +my $APC = chr utf8::unicode_to_native(0x9F); +my $backslash_c_question = (ASCII) ? '\177' : $APC; + +sub main::dumpValue { + local %address; + local $^W=0; + (print "undef\n"), return unless defined $_[0]; + (print &stringify($_[0]), "\n"), return unless ref $_[0]; + push @_, -1 if @_ == 1; + dumpvar::unwrap($_[0], 0, $_[1]); +} + +# This one is good for variable names: + +sub unctrl { + for (my($dummy) = shift) { + local($v) ; + + return \$_ if ref \$_ eq "GLOB"; + s/([\000-\037])/ '^' . chr(utf8::unicode_to_native(ord($1)^64))/eg; + s/ $backslash_c_question /^?/xg; + return $_; + } +} + +sub uniescape { + join("", + map { $_ > 255 ? sprintf("\\x{%04X}", $_) : chr($_) } + unpack("W*", $_[0])); +} + +sub stringify { + my $string; + if (eval { $string = _stringify(@_); 1 }) { + return $string; + } + + return "<< value could not be dumped: $@ >>"; +} + +sub _stringify { + (my $__, local $noticks) = @_; + for ($__) { + local($v) ; + my $tick = $tick; + + return 'undef' unless defined $_ or not $printUndef; + return $_ . "" if ref \$_ eq 'GLOB'; + $_ = &{'overload::StrVal'}($_) + if $bareStringify and ref $_ + and %overload:: and defined &{'overload::StrVal'}; + + if ($tick eq 'auto') { + if (/[^[:^cntrl:]\n]/u) { # All controls but \n get '"' + $tick = '"'; + } else { + $tick = "'"; + } + } + if ($tick eq "'") { + s/([\'\\])/\\$1/g; + } elsif ($unctrl eq 'unctrl') { + s/([\"\\])/\\$1/g ; + $_ = &unctrl($_); + # uniescape? + s/([[:^ascii:]])/'\\0x'.sprintf('%2X',ord($1))/eg + if $quoteHighBit; + } elsif ($unctrl eq 'quote') { + s/([\"\\\$\@])/\\$1/g if $tick eq '"'; + s/\e/\\e/g; + s/([\000-\037$backslash_c_question])/'\\c'._escaped_ord($1)/eg; + } + $_ = uniescape($_); + s/([[:^ascii:]])/'\\'.sprintf('%3o',ord($1))/eg if $quoteHighBit; + return ($noticks || /^\d+(\.\d*)?\Z/) + ? $_ + : $tick . $_ . $tick; + } +} + +# Ensure a resulting \ is escaped to be \\ +sub _escaped_ord { + my $chr = shift; + if ($chr eq $backslash_c_question) { + $chr = '?'; + } + else { + $chr = chr(utf8::unicode_to_native(ord($chr)^64)); + $chr =~ s{\\}{\\\\}g; + } + return $chr; +} + +sub ShortArray { + my $tArrayDepth = $#{$_[0]} ; + $tArrayDepth = $#{$_[0]} < $arrayDepth-1 ? $#{$_[0]} : $arrayDepth-1 + unless $arrayDepth eq '' ; + my $shortmore = ""; + $shortmore = " ..." if $tArrayDepth < $#{$_[0]} ; + if (!grep(ref $_, @{$_[0]})) { + $short = "0..$#{$_[0]} '" . + join("' '", @{$_[0]}[0..$tArrayDepth]) . "'$shortmore"; + return $short if length $short <= $compactDump; + } + undef; +} + +sub DumpElem { + my $short = &stringify($_[0], ref $_[0]); + if ($veryCompact && ref $_[0] + && (ref $_[0] eq 'ARRAY' and !grep(ref $_, @{$_[0]}) )) { + my $end = "0..$#{$v} '" . + join("' '", @{$_[0]}[0..$tArrayDepth]) . "'$shortmore"; + } elsif ($veryCompact && ref $_[0] + && (ref $_[0] eq 'HASH') and !grep(ref $_, values %{$_[0]})) { + my $end = 1; + $short = $sp . "0..$#{$v} '" . + join("' '", @{$v}[0..$tArrayDepth]) . "'$shortmore"; + } else { + print "$short\n"; + unwrap($_[0],$_[1],$_[2]) if ref $_[0]; + } +} + +sub unwrap { + return if $DB::signal; + local($v) = shift ; + local($s) = shift ; # extra no of spaces + local($m) = shift ; # maximum recursion depth + return if $m == 0; + local(%v,@v,$sp,$value,$key,@sortKeys,$more,$shortmore,$short) ; + local($tHashDepth,$tArrayDepth) ; + + $sp = " " x $s ; + $s += 3 ; + + eval { + # Check for reused addresses + if (ref $v) { + my $val = $v; + $val = &{'overload::StrVal'}($v) + if %overload:: and defined &{'overload::StrVal'}; + # Match type and address. + # Unblessed references will look like TYPE(0x...) + # Blessed references will look like Class=TYPE(0x...) + $val =~ s/^.*=//; # suppress the Class part, just keep TYPE(0x...) + ($item_type, $address) = + $val =~ /([^\(]+) # Keep stuff that's + # not an open paren + \( # Skip open paren + (0x[0-9a-f]+) # Save the address + \) # Skip close paren + $/x; # Should be at end now + + if (!$dumpReused && defined $address) { + $address{$address}++ ; + if ( $address{$address} > 1 ) { + print "${sp}-> REUSED_ADDRESS\n" ; + return ; + } + } + } elsif (ref \$v eq 'GLOB') { + # This is a raw glob. Special handling for that. + $address = "$v" . ""; # To avoid a bug with globs + $address{$address}++ ; + if ( $address{$address} > 1 ) { + print "${sp}*DUMPED_GLOB*\n" ; + return ; + } + } + + if (ref $v eq 'Regexp') { + # Reformat the regexp to look the standard way. + my $re = "$v"; + $re =~ s,/,\\/,g; + print "$sp-> qr/$re/\n"; + return; + } + + if ( $item_type eq 'HASH' ) { + # Hash ref or hash-based object. + my @sortKeys = sort keys(%$v) ; + undef $more ; + $tHashDepth = $#sortKeys ; + $tHashDepth = $#sortKeys < $hashDepth-1 ? $#sortKeys : $hashDepth-1 + unless $hashDepth eq '' ; + $more = "....\n" if $tHashDepth < $#sortKeys ; + $shortmore = ""; + $shortmore = ", ..." if $tHashDepth < $#sortKeys ; + $#sortKeys = $tHashDepth ; + if ($compactDump && !grep(ref $_, values %{$v})) { + #$short = $sp . + # (join ', ', +# Next row core dumps during require from DB on 5.000, even with map {"_"} + # map {&stringify($_) . " => " . &stringify($v->{$_})} + # @sortKeys) . "'$shortmore"; + $short = $sp; + my @keys; + for (@sortKeys) { + push @keys, &stringify($_) . " => " . &stringify($v->{$_}); + } + $short .= join ', ', @keys; + $short .= $shortmore; + (print "$short\n"), return if length $short <= $compactDump; + } + for $key (@sortKeys) { + return if $DB::signal; + $value = $ {$v}{$key} ; + print "$sp", &stringify($key), " => "; + DumpElem $value, $s, $m-1; + } + print "$sp empty hash\n" unless @sortKeys; + print "$sp$more" if defined $more ; + } elsif ( $item_type eq 'ARRAY' ) { + # Array ref or array-based object. Also: undef. + # See how big the array is. + $tArrayDepth = $#{$v} ; + undef $more ; + # Bigger than the max? + $tArrayDepth = $#{$v} < $arrayDepth-1 ? $#{$v} : $arrayDepth-1 + if defined $arrayDepth && $arrayDepth ne ''; + # Yep. Don't show it all. + $more = "....\n" if $tArrayDepth < $#{$v} ; + $shortmore = ""; + $shortmore = " ..." if $tArrayDepth < $#{$v} ; + + if ($compactDump && !grep(ref $_, @{$v})) { + if ($#$v >= 0) { + $short = $sp . "0..$#{$v} " . + join(" ", + map {exists $v->[$_] ? stringify $v->[$_] : "empty"} (0..$tArrayDepth) + ) . "$shortmore"; + } else { + $short = $sp . "empty array"; + } + (print "$short\n"), return if length $short <= $compactDump; + } + #if ($compactDump && $short = ShortArray($v)) { + # print "$short\n"; + # return; + #} + for $num (0 .. $tArrayDepth) { + return if $DB::signal; + print "$sp$num "; + if (exists $v->[$num]) { + if (defined $v->[$num]) { + DumpElem $v->[$num], $s, $m-1; + } + else { + print "undef\n"; + } + } else { + print "empty slot\n"; + } + } + print "$sp empty array\n" unless @$v; + print "$sp$more" if defined $more ; + } elsif ( $item_type eq 'SCALAR' ) { + unless (defined $$v) { + print "$sp-> undef\n"; + return; + } + print "$sp-> "; + DumpElem $$v, $s, $m-1; + } elsif ( $item_type eq 'REF' ) { + print "$sp-> $$v\n"; + return unless defined $$v; + unwrap($$v, $s+3, $m-1); + } elsif ( $item_type eq 'CODE' ) { + # Code object or reference. + print "$sp-> "; + dumpsub (0, $v); + } elsif ( $item_type eq 'GLOB' ) { + # Glob object or reference. + print "$sp-> ",&stringify($$v,1),"\n"; + if ($globPrint) { + $s += 3; + dumpglob($s, "{$$v}", $$v, 1, $m-1); + } elsif (defined ($fileno = eval {fileno($v)})) { + print( (' ' x ($s+3)) . "FileHandle({$$v}) => fileno($fileno)\n" ); + } + } elsif (ref \$v eq 'GLOB') { + # Raw glob (again?) + if ($globPrint) { + dumpglob($s, "{$v}", $v, 1, $m-1) if $globPrint; + } elsif (defined ($fileno = eval {fileno(\$v)})) { + print( (' ' x $s) . "FileHandle({$v}) => fileno($fileno)\n" ); + } + } + }; + if ($@) { + print( (' ' x $s) . "<< value could not be dumped: $@ >>\n"); + } + + return; +} + +sub matchlex { + (my $var = $_[0]) =~ s/.//; + $var eq $_[1] or + ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and + ($1 eq '!') ^ (eval { $var =~ /$2$3/ }); +} + +sub matchvar { + $_[0] eq $_[1] or + ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and + ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/}); +} + +sub compactDump { + $compactDump = shift if @_; + $compactDump = 6*80-1 if $compactDump and $compactDump < 2; + $compactDump; +} + +sub veryCompact { + $veryCompact = shift if @_; + compactDump(1) if !$compactDump and $veryCompact; + $veryCompact; +} + +sub unctrlSet { + if (@_) { + my $in = shift; + if ($in eq 'unctrl' or $in eq 'quote') { + $unctrl = $in; + } else { + print "Unknown value for 'unctrl'.\n"; + } + } + $unctrl; +} + +sub quote { + if (@_ and $_[0] eq '"') { + $tick = '"'; + $unctrl = 'quote'; + } elsif (@_ and $_[0] eq 'auto') { + $tick = 'auto'; + $unctrl = 'quote'; + } elsif (@_) { # Need to set + $tick = "'"; + $unctrl = 'unctrl'; + } + $tick; +} + +sub dumpglob { + return if $DB::signal; + my ($off,$key, $val, $all, $m) = @_; + local(*entry) = $val; + my $fileno; + if (($key !~ /^_ fileno($fileno)\n" ); + } + if ($all) { + if (defined &entry) { + dumpsub($off, $key); + } + } +} + +sub dumplex { + return if $DB::signal; + my ($key, $val, $m, @vars) = @_; + return if @vars && !grep( matchlex($key, $_), @vars ); + local %address; + my $off = 0; # It reads better this way + my $fileno; + if (UNIVERSAL::isa($val,'ARRAY')) { + print( (' ' x $off) . "$key = (\n" ); + unwrap($val,3+$off,$m) ; + print( (' ' x $off) . ")\n" ); + } + elsif (UNIVERSAL::isa($val,'HASH')) { + print( (' ' x $off) . "$key = (\n" ); + unwrap($val,3+$off,$m) ; + print( (' ' x $off) . ")\n" ); + } + elsif (UNIVERSAL::isa($val,'IO')) { + print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" ); + } + # No lexical subroutines yet... + # elsif (UNIVERSAL::isa($val,'CODE')) { + # dumpsub($off, $$val); + # } + else { + print( (' ' x $off) . &unctrl($key), " = " ); + DumpElem $$val, 3+$off, $m; + } +} + +sub CvGV_name_or_bust { + my $in = shift; + return if $skipCvGV; # Backdoor to avoid problems if XS broken... + $in = \&$in; # Hard reference... + eval {require Devel::Peek; 1} or return; + my $gv = Devel::Peek::CvGV($in) or return; + *$gv{PACKAGE} . '::' . *$gv{NAME}; +} + +sub dumpsub { + my ($off,$sub) = @_; + my $ini = $sub; + my $s; + $sub = $1 if $sub =~ /^\{\*(.*)\}$/; + my $subref = defined $1 ? \&$sub : \&$ini; + my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s}) + || (($s = CvGV_name_or_bust($subref)) && $DB::sub{$s}) + || ($subdump && ($s = findsubs("$subref")) && $DB::sub{$s}); + $place = '???' unless defined $place; + $s = $sub unless defined $s; + print( (' ' x $off) . "&$s in $place\n" ); +} + +sub findsubs { + return undef unless %DB::sub; + my ($addr, $name, $loc); + while (($name, $loc) = each %DB::sub) { + $addr = \&$name; + $subs{"$addr"} = $name; + } + $subdump = 0; + $subs{ shift() }; +} + +sub main::dumpvar { + my ($package,$m,@vars) = @_; + local(%address,$key,$val,$^W); + $package .= "::" unless $package =~ /::$/; + *stab = *{"main::"}; + while ($package =~ /(\w+?::)/g){ + *stab = $ {stab}{$1}; + } + local $TotalStrings = 0; + local $Strings = 0; + local $CompleteTotal = 0; + while (($key,$val) = each(%stab)) { + return if $DB::signal; + next if @vars && !grep( matchvar($key, $_), @vars ); + if ($usageOnly) { + globUsage(\$val, $key) + if ($package ne 'dumpvar' or $key ne 'stab') + and ref(\$val) eq 'GLOB'; + } else { + dumpglob(0,$key, $val, 0, $m); + } + } + if ($usageOnly) { + print "String space: $TotalStrings bytes in $Strings strings.\n"; + $CompleteTotal += $TotalStrings; + print "Grand total = $CompleteTotal bytes (1 level deep) + overhead.\n"; + } +} + +sub scalarUsage { + my $size = length($_[0]); + $TotalStrings += $size; + $Strings++; + $size; +} + +sub arrayUsage { # array ref, name + my $size = 0; + map {$size += scalarUsage($_)} @{$_[0]}; + my $len = @{$_[0]}; + print "\@$_[1] = $len item", ($len > 1 ? "s" : ""), + " (data: $size bytes)\n" + if defined $_[1]; + $CompleteTotal += $size; + $size; +} + +sub hashUsage { # hash ref, name + my @keys = keys %{$_[0]}; + my @values = values %{$_[0]}; + my $keys = arrayUsage \@keys; + my $values = arrayUsage \@values; + my $len = @keys; + my $total = $keys + $values; + print "\%$_[1] = $len item", ($len > 1 ? "s" : ""), + " (keys: $keys; values: $values; total: $total bytes)\n" + if defined $_[1]; + $total; +} + +sub globUsage { # glob ref, name + local *name = *{$_[0]}; + $total = 0; + $total += scalarUsage $name if defined $name; + $total += arrayUsage \@name, $_[1] if @name; + $total += hashUsage \%name, $_[1] if %name and $_[1] ne "main::" + and $_[1] ne "DB::"; #and !($package eq "dumpvar" and $key eq "stab")); + $total; +} + +sub packageUsage { + my ($package,@vars) = @_; + $package .= "::" unless $package =~ /::$/; + local *stab = *{"main::"}; + while ($package =~ /(\w+?::)/g){ + *stab = $ {stab}{$1}; + } + local $TotalStrings = 0; + local $CompleteTotal = 0; + my ($key,$val); + while (($key,$val) = each(%stab)) { + next if @vars && !grep($key eq $_,@vars); + globUsage \$val, $key unless $package eq 'dumpvar' and $key eq 'stab'; + } + print "String space: $TotalStrings.\n"; + $CompleteTotal += $TotalStrings; + print "\nGrand total = $CompleteTotal bytes\n"; +} + +1; + +package deprecate; +use strict; +use warnings; +our $VERSION = 0.03; + +# our %Config can ignore %Config::Config, e.g. for testing +our %Config; +unless (%Config) { require Config; *Config = \%Config::Config; } + +# This isn't a public API. It's internal to code maintained by the perl-porters +# If you would like it to be a public API, please send a patch with +# documentation and tests. Until then, it may change without warning. +sub __loaded_from_core { + my ($package, $file, $expect_leaf) = @_; + + foreach my $pair ([qw(sitearchexp archlibexp)], + [qw(sitelibexp privlibexp)]) { + my ($site, $priv) = @Config{@$pair}; + if ($^O eq 'VMS') { + for my $d ($site, $priv) { $d = VMS::Filespec::unixify($d) }; + } + # Just in case anyone managed to configure with trailing /s + s!/*$!!g foreach $site, $priv; + + next if $site eq $priv; + if (uc("$priv/$expect_leaf") eq uc($file)) { + return 1; + } + } + return 0; +} + +sub import { + my ($package, $file) = caller; + + my $expect_leaf = "$package.pm"; + $expect_leaf =~ s!::!/!g; + + if (__loaded_from_core($package, $file, $expect_leaf)) { + my $call_depth=1; + my @caller; + while (@caller = caller $call_depth++) { + last if $caller[7] # use/require + and $caller[6] eq $expect_leaf; # the package file + } + unless (@caller) { + require Carp; + Carp::cluck(<<"EOM"); +Can't find use/require $expect_leaf in caller stack +EOM + return; + } + + # This is fragile, because it + # is directly poking in the internals of warnings.pm + my ($call_file, $call_line, $callers_bitmask) = @caller[1,2,9]; + + if (defined $callers_bitmask + && (vec($callers_bitmask, $warnings::Offsets{deprecated}, 1) + || vec($callers_bitmask, $warnings::Offsets{all}, 1))) { + warn <<"EOM"; +$package will be removed from the Perl core distribution in the next major release. Please install it from CPAN. It is being used at $call_file, line $call_line. +EOM + } + } +} + +1; + +__END__ + +package AutoSplit; + +use Exporter (); +use Config qw(%Config); +use File::Basename (); +use File::Path qw(mkpath); +use File::Spec::Functions qw(curdir catfile catdir); +use strict; +our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Verbose, $Keep, $Maxlen, + $CheckForAutoloader, $CheckModTime); + +$VERSION = "1.06"; +@ISA = qw(Exporter); +@EXPORT = qw(&autosplit &autosplit_lib_modules); +@EXPORT_OK = qw($Verbose $Keep $Maxlen $CheckForAutoloader $CheckModTime); + + +# for portability warn about names longer than $maxlen +$Maxlen = 8; # 8 for dos, 11 (14-".al") for SYSVR3 +$Verbose = 1; # 0=none, 1=minimal, 2=list .al files +$Keep = 0; +$CheckForAutoloader = 1; +$CheckModTime = 1; + +my $IndexFile = "autosplit.ix"; # file also serves as timestamp +my $maxflen = 255; +$maxflen = 14 if $Config{'d_flexfnam'} ne 'define'; +if (defined (&Dos::UseLFN)) { + $maxflen = Dos::UseLFN() ? 255 : 11; +} +my $Is_VMS = ($^O eq 'VMS'); + +# allow checking for valid ': attrlist' attachments. +# extra jugglery required to support both 5.8 and 5.9/5.10 features +# (support for 5.8 required for cross-compiling environments) + +my $attr_list = + $] >= 5.009005 ? + eval <<'__QR__' + qr{ + \s* : \s* + (?: + # one attribute + (?> # no backtrack + (?! \d) \w+ + (? \( (?: [^()]++ | (?&nested)++ )*+ \) ) ? + ) + (?: \s* : \s* | \s+ (?! :) ) + )* + }x +__QR__ + : + do { + # In pre-5.9.5 world we have to do dirty tricks. + # (we use 'our' rather than 'my' here, due to the rather complex and buggy + # behaviour of lexicals with qr// and (??{$lex}) ) + our $trick1; # yes, cannot our and assign at the same time. + $trick1 = qr{ \( (?: (?> [^()]+ ) | (??{ $trick1 }) )* \) }x; + our $trick2 = qr{ (?> (?! \d) \w+ (?:$trick1)? ) (?:\s*\:\s*|\s+(?!\:)) }x; + qr{ \s* : \s* (?: $trick2 )* }x; + }; + +sub autosplit{ + my($file, $autodir, $keep, $ckal, $ckmt) = @_; + # $file - the perl source file to be split (after __END__) + # $autodir - the ".../auto" dir below which to write split subs + # Handle optional flags: + $keep = $Keep unless defined $keep; + $ckal = $CheckForAutoloader unless defined $ckal; + $ckmt = $CheckModTime unless defined $ckmt; + autosplit_file($file, $autodir, $keep, $ckal, $ckmt); +} + +sub carp{ + require Carp; + goto &Carp::carp; +} + +# This function is used during perl building/installation +# ./miniperl -e 'use AutoSplit; autosplit_lib_modules(@ARGV)' ... + +sub autosplit_lib_modules { + my(@modules) = @_; # list of Module names + local $_; # Avoid clobber. + while (defined($_ = shift @modules)) { + while (m#([^:]+)::([^:].*)#) { # in case specified as ABC::XYZ + $_ = catfile($1, $2); + } + s|\\|/|g; # bug in ksh OS/2 + s#^lib/##s; # incase specified as lib/*.pm + my($lib) = catfile(curdir(), "lib"); + if ($Is_VMS) { # may need to convert VMS-style filespecs + $lib =~ s#^\[\]#.\/#; + } + s#^$lib\W+##s; # incase specified as ./lib/*.pm + if ($Is_VMS && /[:>\]]/) { # may need to convert VMS-style filespecs + my ($dir,$name) = (/(.*])(.*)/s); + $dir =~ s/.*lib[\.\]]//s; + $dir =~ s#[\.\]]#/#g; + $_ = $dir . $name; + } + autosplit_file(catfile($lib, $_), catfile($lib, "auto"), + $Keep, $CheckForAutoloader, $CheckModTime); + } + 0; +} + + +# private functions + +my $self_mod_time = (stat __FILE__)[9]; + +sub autosplit_file { + my($filename, $autodir, $keep, $check_for_autoloader, $check_mod_time) + = @_; + my(@outfiles); + local($_); + local($/) = "\n"; + + # where to write output files + $autodir ||= catfile(curdir(), "lib", "auto"); + if ($Is_VMS) { + ($autodir = VMS::Filespec::unixpath($autodir)) =~ s|/\z||; + $filename = VMS::Filespec::unixify($filename); # may have dirs + } + unless (-d $autodir){ + mkpath($autodir,0,0755); + # We should never need to create the auto dir + # here. installperl (or similar) should have done + # it. Expecting it to exist is a valuable sanity check against + # autosplitting into some random directory by mistake. + print "Warning: AutoSplit had to create top-level " . + "$autodir unexpectedly.\n"; + } + + # allow just a package name to be used + $filename .= ".pm" unless ($filename =~ m/\.pm\z/); + + open(my $in, "<$filename") or die "AutoSplit: Can't open $filename: $!\n"; + my($pm_mod_time) = (stat($filename))[9]; + my($autoloader_seen) = 0; + my($in_pod) = 0; + my($def_package,$last_package,$this_package,$fnr); + while (<$in>) { + # Skip pod text. + $fnr++; + $in_pod = 1 if /^=\w/; + $in_pod = 0 if /^=cut/; + next if ($in_pod || /^=cut/); + next if /^\s*#/; + + # record last package name seen + $def_package = $1 if (m/^\s*package\s+([\w:]+)\s*;/); + ++$autoloader_seen if m/^\s*(use|require)\s+AutoLoader\b/; + ++$autoloader_seen if m/\bISA\s*=.*\bAutoLoader\b/; + last if /^__END__/; + } + if ($check_for_autoloader && !$autoloader_seen){ + print "AutoSplit skipped $filename: no AutoLoader used\n" + if ($Verbose>=2); + return 0; + } + $_ or die "Can't find __END__ in $filename\n"; + + $def_package or die "Can't find 'package Name;' in $filename\n"; + + my($modpname) = _modpname($def_package); + + # this _has_ to match so we have a reasonable timestamp file + die "Package $def_package ($modpname.pm) does not ". + "match filename $filename" + unless ($filename =~ m/\Q$modpname.pm\E$/ or + ($^O eq 'dos') or ($^O eq 'MSWin32') or ($^O eq 'NetWare') or + $Is_VMS && $filename =~ m/$modpname.pm/i); + + my($al_idx_file) = catfile($autodir, $modpname, $IndexFile); + + if ($check_mod_time){ + my($al_ts_time) = (stat("$al_idx_file"))[9] || 1; + if ($al_ts_time >= $pm_mod_time and + $al_ts_time >= $self_mod_time){ + print "AutoSplit skipped ($al_idx_file newer than $filename)\n" + if ($Verbose >= 2); + return undef; # one undef, not a list + } + } + + my($modnamedir) = catdir($autodir, $modpname); + print "AutoSplitting $filename ($modnamedir)\n" + if $Verbose; + + unless (-d $modnamedir){ + mkpath($modnamedir,0,0777); + } + + # We must try to deal with some SVR3 systems with a limit of 14 + # characters for file names. Sadly we *cannot* simply truncate all + # file names to 14 characters on these systems because we *must* + # create filenames which exactly match the names used by AutoLoader.pm. + # This is a problem because some systems silently truncate the file + # names while others treat long file names as an error. + + my $Is83 = $maxflen==11; # plain, case INSENSITIVE dos filenames + + my(@subnames, $subname, %proto, %package); + my @cache = (); + my $caching = 1; + $last_package = ''; + my $out; + while (<$in>) { + $fnr++; + $in_pod = 1 if /^=\w/; + $in_pod = 0 if /^=cut/; + next if ($in_pod || /^=cut/); + # the following (tempting) old coding gives big troubles if a + # cut is forgotten at EOF: + # next if /^=\w/ .. /^=cut/; + if (/^package\s+([\w:]+)\s*;/) { + $this_package = $def_package = $1; + } + + if (/^sub\s+([\w:]+)(\s*(?:\(.*?\))?(?:$attr_list)?)/) { + print $out "# end of $last_package\::$subname\n1;\n" + if $last_package; + $subname = $1; + my $proto = $2 || ''; + if ($subname =~ s/(.*):://){ + $this_package = $1; + } else { + $this_package = $def_package; + } + my $fq_subname = "$this_package\::$subname"; + $package{$fq_subname} = $this_package; + $proto{$fq_subname} = $proto; + push(@subnames, $fq_subname); + my($lname, $sname) = ($subname, substr($subname,0,$maxflen-3)); + $modpname = _modpname($this_package); + my($modnamedir) = catdir($autodir, $modpname); + mkpath($modnamedir,0,0777); + my($lpath) = catfile($modnamedir, "$lname.al"); + my($spath) = catfile($modnamedir, "$sname.al"); + my $path; + + if (!$Is83 and open($out, ">$lpath")){ + $path=$lpath; + print " writing $lpath\n" if ($Verbose>=2); + } else { + open($out, ">$spath") or die "Can't create $spath: $!\n"; + $path=$spath; + print " writing $spath (with truncated name)\n" + if ($Verbose>=1); + } + push(@outfiles, $path); + my $lineno = $fnr - @cache; + print $out < lc($_) } @outfiles; + } else { + @outfiles{@outfiles} = @outfiles; + } + my(%outdirs,@outdirs); + for (@outfiles) { + $outdirs{File::Basename::dirname($_)}||=1; + } + for my $dir (keys %outdirs) { + opendir(my $outdir,$dir); + foreach (sort readdir($outdir)){ + next unless /\.al\z/; + my($file) = catfile($dir, $_); + $file = lc $file if $Is83 or $Is_VMS; + next if $outfiles{$file}; + print " deleting $file\n" if ($Verbose>=2); + my($deleted,$thistime); # catch all versions on VMS + do { $deleted += ($thistime = unlink $file) } while ($thistime); + carp ("Unable to delete $file: $!") unless $deleted; + } + closedir($outdir); + } + } + + open(my $ts,">$al_idx_file") or + carp ("AutoSplit: unable to create timestamp file ($al_idx_file): $!"); + print $ts "# Index created by AutoSplit for $filename\n"; + print $ts "# (file acts as timestamp)\n"; + $last_package = ''; + for my $fqs (@subnames) { + my($subname) = $fqs; + $subname =~ s/.*:://; + print $ts "package $package{$fqs};\n" + unless $last_package eq $package{$fqs}; + print $ts "sub $subname $proto{$fqs};\n"; + $last_package = $package{$fqs}; + } + print $ts "1;\n"; + close($ts); + + _check_unique($filename, $Maxlen, 1, @outfiles); + + @outfiles; +} + +sub _modpname ($) { + my($package) = @_; + my $modpname = $package; + if ($^O eq 'MSWin32') { + $modpname =~ s#::#\\#g; + } else { + my @modpnames = (); + while ($modpname =~ m#(.*?[^:])::([^:].*)#) { + push @modpnames, $1; + $modpname = $2; + } + $modpname = catfile(@modpnames, $modpname); + } + if ($Is_VMS) { + $modpname = VMS::Filespec::unixify($modpname); # may have dirs + } + $modpname; +} + +sub _check_unique { + my($filename, $maxlen, $warn, @outfiles) = @_; + my(%notuniq) = (); + my(%shorts) = (); + my(@toolong) = grep( + length(File::Basename::basename($_)) + > $maxlen, + @outfiles + ); + + foreach (@toolong){ + my($dir) = File::Basename::dirname($_); + my($file) = File::Basename::basename($_); + my($trunc) = substr($file,0,$maxlen); + $notuniq{$dir}{$trunc} = 1 if $shorts{$dir}{$trunc}; + $shorts{$dir}{$trunc} = $shorts{$dir}{$trunc} ? + "$shorts{$dir}{$trunc}, $file" : $file; + } + if (%notuniq && $warn){ + print "$filename: some names are not unique when " . + "truncated to $maxlen characters:\n"; + foreach my $dir (sort keys %notuniq){ + print " directory $dir:\n"; + foreach my $trunc (sort keys %{$notuniq{$dir}}) { + print " $shorts{$dir}{$trunc} truncate to $trunc\n"; + } + } + } +} + +1; +__END__ + +# test functions so AutoSplit.pm can be applied to itself: +sub test1 ($) { "test 1\n"; } +sub test2 ($$) { "test 2\n"; } +sub test3 ($$$) { "test 3\n"; } +sub testtesttesttest4_1 { "test 4\n"; } +sub testtesttesttest4_2 { "duplicate test 4\n"; } +sub Just::Another::test5 { "another test 5\n"; } +sub test6 { return join ":", __FILE__,__LINE__; } +package Yet::Another::AutoSplit; +sub testtesttesttest4_1 ($) { "another test 4\n"; } +sub testtesttesttest4_2 ($$) { "another duplicate test 4\n"; } +package Yet::More::Attributes; +sub test_a1 ($) : locked :locked { 1; } +sub test_a2 : locked { 1; } +package diagnostics; + + +use strict; +use 5.009001; +use Carp; +$Carp::Internal{__PACKAGE__.""}++; + +our $VERSION = '1.36'; +our $DEBUG; +our $VERBOSE; +our $PRETTY; +our $TRACEONLY = 0; +our $WARNTRACE = 0; + +use Config; +use Text::Tabs 'expand'; +my $privlib = $Config{privlibexp}; +if ($^O eq 'VMS') { + require VMS::Filespec; + $privlib = VMS::Filespec::unixify($privlib); +} +my @trypod = ( + "$privlib/pod/perldiag.pod", + "$privlib/pods/perldiag.pod", + ); +# handy for development testing of new warnings etc +unshift @trypod, "./pod/perldiag.pod" if -e "pod/perldiag.pod"; +(my $PODFILE) = ((grep { -e } @trypod), $trypod[$#trypod])[0]; + +$DEBUG ||= 0; + +local $| = 1; +local $_; +local $.; + +my $standalone; +my(%HTML_2_Troff, %HTML_2_Latin_1, %HTML_2_ASCII_7); + +CONFIG: { + our $opt_p = our $opt_d = our $opt_v = our $opt_f = ''; + + unless (caller) { + $standalone++; + require Getopt::Std; + Getopt::Std::getopts('pdvf:') + or die "Usage: $0 [-v] [-p] [-f splainpod]"; + $PODFILE = $opt_f if $opt_f; + $DEBUG = 2 if $opt_d; + $VERBOSE = $opt_v; + $PRETTY = $opt_p; + } + + if (open(POD_DIAG, '<', $PODFILE)) { + warn "Happy happy podfile from real $PODFILE\n" if $DEBUG; + last CONFIG; + } + + if (caller) { + INCPATH: { + for my $file ( (map { "$_/".__PACKAGE__.".pm" } @INC), $0) { + warn "Checking $file\n" if $DEBUG; + if (open(POD_DIAG, '<', $file)) { + while () { + next unless + /^__END__\s*# wish diag dbase were more accessible/; + print STDERR "podfile is $file\n" if $DEBUG; + last INCPATH; + } + } + } + } + } else { + print STDERR "podfile is \n" if $DEBUG; + *POD_DIAG = *main::DATA; + } +} +if (eof(POD_DIAG)) { + die "couldn't find diagnostic data in $PODFILE @INC $0"; +} + + +%HTML_2_Troff = ( + 'amp' => '&', # ampersand + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + + "Aacute" => "A\\*'", # capital A, acute accent + # etc + +); + +%HTML_2_Latin_1 = ( + 'amp' => '&', # ampersand + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + + "Aacute" => "\xC1" # capital A, acute accent + + # etc +); + +%HTML_2_ASCII_7 = ( + 'amp' => '&', # ampersand + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + + "Aacute" => "A" # capital A, acute accent + # etc +); + +our %HTML_Escapes; +*HTML_Escapes = do { + if ($standalone) { + $PRETTY ? \%HTML_2_Latin_1 : \%HTML_2_ASCII_7; + } else { + \%HTML_2_Latin_1; + } +}; + +*THITHER = $standalone ? *STDOUT : *STDERR; + +my %transfmt = (); +my $transmo = <) { + + sub _split_pod_link { + $_[0] =~ m'(?:([^|]*)\|)?([^/]*)(?:/("?)(.*)\3)?'s; + ($1,$2,$4); + } + + unescape(); + if ($PRETTY) { + sub noop { return $_[0] } # spensive for a noop + sub bold { my $str =$_[0]; $str =~ s/(.)/$1\b$1/g; return $str; } + sub italic { my $str = $_[0]; $str =~ s/(.)/_\b$1/g; return $str; } + s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/bold($+)/ges; + s/[IF]<(.*?)>/italic($1)/ges; + s/L<(.*?)>/ + my($text,$page,$sect) = _split_pod_link($1); + defined $text + ? $text + : defined $sect + ? italic($sect) . ' in ' . italic($page) + : italic($page) + /ges; + s/S<(.*?)>/ + $1 + /ges; + } else { + s/C<<< (.*?) >>>|C<< (.*?) >>|[BC]<(.*?)>/$+/gs; + s/[IF]<(.*?)>/$1/gs; + s/L<(.*?)>/ + my($text,$page,$sect) = _split_pod_link($1); + defined $text + ? $text + : defined $sect + ? qq '"$sect" in $page' + : $page + /ges; + s/S<(.*?)>/ + $1 + /ges; + } + unless (/^=/) { + if (defined $header) { + if ( $header eq 'DESCRIPTION' && + ( /Optional warnings are enabled/ + || /Some of these messages are generic./ + ) ) + { + next; + } + $_ = expand $_; + s/^/ /gm; + $msg{$header} .= $_; + for my $h(@headers) { $msg{$h} .= $_ } + ++$seen_body; + undef $for_item; + } + next; + } + + # If we have not come across the body of the description yet, then + # the previous header needs to share the same description. + if ($seen_body) { + @headers = (); + } + else { + push @headers, $header if defined $header; + } + + if ( ! s/=item (.*?)\s*\z//s || $over_level != 1) { + + if ( s/=head1\sDESCRIPTION//) { + $msg{$header = 'DESCRIPTION'} = ''; + undef $for_item; + } + elsif( s/^=for\s+diagnostics\s*\n(.*?)\s*\z// ) { + $for_item = $1; + } + elsif( /^=over\b/ ) { + $over_level++; + } + elsif( /^=back\b/ ) { # Stop processing body here + $over_level--; + if ($over_level == 0) { + undef $header; + undef $for_item; + $seen_body = 0; + next; + } + } + next; + } + + if( $for_item ) { $header = $for_item; undef $for_item } + else { + $header = $1; + + $header =~ s/\n/ /gs; # Allow multi-line headers + } + + # strip formatting directives from =item line + $header =~ s/[A-Z]<(.*?)>/$1/g; + + # Since we strip "(\.\s*)\n" when we search a warning, strip it here as well + $header =~ s/(\.\s*)?$//; + + my @toks = split( /(%l?[dxX]|%[ucp]|%(?:\.\d+)?[fs])/, $header ); + if (@toks > 1) { + my $conlen = 0; + for my $i (0..$#toks){ + if( $i % 2 ){ + if( $toks[$i] eq '%c' ){ + $toks[$i] = '.'; + } elsif( $toks[$i] =~ /^%(?:d|u)$/ ){ + $toks[$i] = '\d+'; + } elsif( $toks[$i] =~ '^%(?:s|.*f)$' ){ + $toks[$i] = $i == $#toks ? '.*' : '.*?'; + } elsif( $toks[$i] =~ '%.(\d+)s' ){ + $toks[$i] = ".{$1}"; + } elsif( $toks[$i] =~ '^%l*([pxX])$' ){ + $toks[$i] = $1 eq 'X' ? '[\dA-F]+' : '[\da-f]+'; + } + } elsif( length( $toks[$i] ) ){ + $toks[$i] = quotemeta $toks[$i]; + $conlen += length( $toks[$i] ); + } + } + my $lhs = join( '', @toks ); + $lhs =~ s/(\\\s)+/\\s+/g; # Replace lit space with multi-space match + $transfmt{$header}{pat} = + " s^\\s*$lhs\\s*\Q$header\Es\n\t&& return 1;\n"; + $transfmt{$header}{len} = $conlen; + } else { + my $lhs = "\Q$header\E"; + $lhs =~ s/(\\\s)+/\\s+/g; # Replace lit space with multi-space match + $transfmt{$header}{pat} = + " s^\\s*$lhs\\s*\Q$header\E\n\t && return 1;\n"; + $transfmt{$header}{len} = length( $header ); + } + + print STDERR __PACKAGE__.": Duplicate entry: \"$header\"\n" + if $msg{$header}; + + $msg{$header} = ''; + $seen_body = 0; + } + + + close POD_DIAG unless *main::DATA eq *POD_DIAG; + + die "No diagnostics?" unless %msg; + + # Apply patterns in order of decreasing sum of lengths of fixed parts + # Seems the best way of hitting the right one. + for my $hdr ( sort { $transfmt{$b}{len} <=> $transfmt{$a}{len} } + keys %transfmt ){ + $transmo .= $transfmt{$hdr}{pat}; + } + $transmo .= " return 0;\n}\n"; + print STDERR $transmo if $DEBUG; + eval $transmo; + die $@ if $@; +} + +if ($standalone) { + if (!@ARGV and -t STDIN) { print STDERR "$0: Reading from STDIN\n" } + while (defined (my $error = <>)) { + splainthis($error) || print THITHER $error; + } + exit; +} + +my $olddie; +my $oldwarn; + +sub import { + shift; + $^W = 1; # yup, clobbered the global variable; + # tough, if you want diags, you want diags. + return if defined $SIG{__WARN__} && ($SIG{__WARN__} eq \&warn_trap); + + for (@_) { + + /^-d(ebug)?$/ && do { + $DEBUG++; + next; + }; + + /^-v(erbose)?$/ && do { + $VERBOSE++; + next; + }; + + /^-p(retty)?$/ && do { + print STDERR "$0: I'm afraid it's too late for prettiness.\n"; + $PRETTY++; + next; + }; + # matches trace and traceonly for legacy doc mixup reasons + /^-t(race(only)?)?$/ && do { + $TRACEONLY++; + next; + }; + /^-w(arntrace)?$/ && do { + $WARNTRACE++; + next; + }; + + warn "Unknown flag: $_"; + } + + $oldwarn = $SIG{__WARN__}; + $olddie = $SIG{__DIE__}; + $SIG{__WARN__} = \&warn_trap; + $SIG{__DIE__} = \&death_trap; +} + +sub enable { &import } + +sub disable { + shift; + return unless $SIG{__WARN__} eq \&warn_trap; + $SIG{__WARN__} = $oldwarn || ''; + $SIG{__DIE__} = $olddie || ''; +} + +sub warn_trap { + my $warning = $_[0]; + if (caller eq __PACKAGE__ or !splainthis($warning)) { + if ($WARNTRACE) { + print STDERR Carp::longmess($warning); + } else { + print STDERR $warning; + } + } + goto &$oldwarn if defined $oldwarn and $oldwarn and $oldwarn ne \&warn_trap; +}; + +sub death_trap { + my $exception = $_[0]; + + # See if we are coming from anywhere within an eval. If so we don't + # want to explain the exception because it's going to get caught. + my $in_eval = 0; + my $i = 0; + while (my $caller = (caller($i++))[3]) { + if ($caller eq '(eval)') { + $in_eval = 1; + last; + } + } + + splainthis($exception) unless $in_eval; + if (caller eq __PACKAGE__) { + print STDERR "INTERNAL EXCEPTION: $exception"; + } + &$olddie if defined $olddie and $olddie and $olddie ne \&death_trap; + + return if $in_eval; + + # We don't want to unset these if we're coming from an eval because + # then we've turned off diagnostics. + + # Switch off our die/warn handlers so we don't wind up in our own + # traps. + $SIG{__DIE__} = $SIG{__WARN__} = ''; + + $exception =~ s/\n(?=.)/\n\t/gas; + + die Carp::longmess("__diagnostics__") + =~ s/^__diagnostics__.*?line \d+\.?\n/ + "Uncaught exception from user code:\n\t$exception" + /re; + # up we go; where we stop, nobody knows, but i think we die now + # but i'm deeply afraid of the &$olddie guy reraising and us getting + # into an indirect recursion loop +}; + +my %exact_duplicate; +my %old_diag; +my $count; +my $wantspace; +sub splainthis { + return 0 if $TRACEONLY; + for (my $tmp = shift) { + local $\; + local $!; + ### &finish_compilation unless %msg; + s/(\.\s*)?\n+$//; + my $orig = $_; + # return unless defined; + + # get rid of the where-are-we-in-input part + s/, <.*?> (?:line|chunk).*$//; + + # Discard 1st " at line " and all text beyond + # but be aware of messages containing " at this-or-that" + my $real = 0; + my @secs = split( / at / ); + return unless @secs; + $_ = $secs[0]; + for my $i ( 1..$#secs ){ + if( $secs[$i] =~ /.+? (?:line|chunk) \d+/ ){ + $real = 1; + last; + } else { + $_ .= ' at ' . $secs[$i]; + } + } + + # remove parenthesis occurring at the end of some messages + s/^\((.*)\)$/$1/; + + if ($exact_duplicate{$orig}++) { + return &transmo; + } else { + return 0 unless &transmo; + } + + my $short = shorten($orig); + if ($old_diag{$_}) { + autodescribe(); + print THITHER "$short (#$old_diag{$_})\n"; + $wantspace = 1; + } elsif (!$msg{$_} && $orig =~ /\n./s) { + # A multiline message, like "Attempt to reload / + # Compilation failed" + my $found; + for (split /^/, $orig) { + splainthis($_) and $found = 1; + } + return $found; + } else { + autodescribe(); + $old_diag{$_} = ++$count; + print THITHER "\n" if $wantspace; + $wantspace = 0; + print THITHER "$short (#$old_diag{$_})\n"; + if ($msg{$_}) { + print THITHER $msg{$_}; + } else { + if (0 and $standalone) { + print THITHER " **** Error #$old_diag{$_} ", + ($real ? "is" : "appears to be"), + " an unknown diagnostic message.\n\n"; + } + return 0; + } + } + return 1; + } +} + +sub autodescribe { + if ($VERBOSE and not $count) { + print THITHER &{$PRETTY ? \&bold : \&noop}("DESCRIPTION OF DIAGNOSTICS"), + "\n$msg{DESCRIPTION}\n"; + } +} + +sub unescape { + s { + E< + ( [A-Za-z]+ ) + > + } { + do { + exists $HTML_Escapes{$1} + ? do { $HTML_Escapes{$1} } + : do { + warn "Unknown escape: E<$1> in $_"; + "E<$1>"; + } + } + }egx; +} + +sub shorten { + my $line = $_[0]; + if (length($line) > 79 and index($line, "\n") == -1) { + my $space_place = rindex($line, ' ', 79); + if ($space_place != -1) { + substr($line, $space_place, 1) = "\n\t"; + } + } + return $line; +} + + +1 unless $standalone; # or it'll complain about itself +__END__ # wish diag dbase were more accessible +package ok; +our $VERSION = '1.302133'; + +use strict; +use Test::More (); + +sub import { + shift; + + if (@_) { + goto &Test::More::pass if $_[0] eq 'ok'; + goto &Test::More::use_ok; + } + + # No argument list - croak as if we are prototyped like use_ok() + my (undef, $file, $line) = caller(); + ($file =~ /^\(eval/) or die "Not enough arguments for 'use ok' at $file line $line\n"; +} + + +__END__ + +package Safe; + +use 5.003_11; +use Scalar::Util qw(reftype refaddr); + +$Safe::VERSION = "2.40"; + +# *** Don't declare any lexicals above this point *** +# +# This function should return a closure which contains an eval that can't +# see any lexicals in scope (apart from __ExPr__ which is unavoidable) + +sub lexless_anon_sub { + # $_[0] is package; + # $_[1] is strict flag; + my $__ExPr__ = $_[2]; # must be a lexical to create the closure that + # can be used to pass the value into the safe + # world + + # Create anon sub ref in root of compartment. + # Uses a closure (on $__ExPr__) to pass in the code to be executed. + # (eval on one line to keep line numbers as expected by caller) + eval sprintf + 'package %s; %s sub { @_=(); eval q[local *SIG; my $__ExPr__;] . $__ExPr__; }', + $_[0], $_[1] ? 'use strict;' : ''; +} + +use strict; +use Carp; +BEGIN { eval q{ + use Carp::Heavy; +} } + +use B (); +BEGIN { + no strict 'refs'; + if (defined &B::sub_generation) { + *sub_generation = \&B::sub_generation; + } + else { + # fake sub generation changing for perls < 5.8.9 + my $sg; *sub_generation = sub { ++$sg }; + } +} + +use Opcode 1.01, qw( + opset opset_to_ops opmask_add + empty_opset full_opset invert_opset verify_opset + opdesc opcodes opmask define_optag opset_to_hex +); + +*ops_to_opset = \&opset; # Temporary alias for old Penguins + +# Regular expressions and other unicode-aware code may need to call +# utf8->SWASHNEW (via perl's utf8.c). That will fail unless we share the +# SWASHNEW method. +# Sadly we can't just add utf8::SWASHNEW to $default_share because perl's +# utf8.c code does a fetchmethod on SWASHNEW to check if utf8.pm is loaded, +# and sharing makes it look like the method exists. +# The simplest and most robust fix is to ensure the utf8 module is loaded when +# Safe is loaded. Then we can add utf8::SWASHNEW to $default_share. +require utf8; +# we must ensure that utf8_heavy.pl, where SWASHNEW is defined, is loaded +# but without depending on too much knowledge of that implementation detail. +# This code (//i on a unicode string) should ensure utf8 is fully loaded +# and also loads the ToFold SWASH, unless things change so that these +# particular code points don't cause it to load. +# (Swashes are cached internally by perl in PL_utf8_* variables +# independent of being inside/outside of Safe. So once loaded they can be) +do { my $a = pack('U',0x100); my $b = chr 0x101; utf8::upgrade $b; $a =~ /$b/i }; +# now we can safely include utf8::SWASHNEW in $default_share defined below. + +my $default_root = 0; +# share *_ and functions defined in universal.c +# Don't share stuff like *UNIVERSAL:: otherwise code from the +# compartment can 0wn functions in UNIVERSAL +my $default_share = [qw[ + *_ + &PerlIO::get_layers + &UNIVERSAL::isa + &UNIVERSAL::can + &UNIVERSAL::VERSION + &utf8::is_utf8 + &utf8::valid + &utf8::encode + &utf8::decode + &utf8::upgrade + &utf8::downgrade + &utf8::native_to_unicode + &utf8::unicode_to_native + &utf8::SWASHNEW + $version::VERSION + $version::CLASS + $version::STRICT + $version::LAX + @version::ISA +], ($] < 5.010 && qw[ + &utf8::SWASHGET +]), ($] >= 5.008001 && qw[ + &Regexp::DESTROY +]), ($] >= 5.010 && qw[ + &re::is_regexp + &re::regname + &re::regnames + &re::regnames_count + &UNIVERSAL::DOES + &version::() + &version::new + &version::("" + &version::stringify + &version::(0+ + &version::numify + &version::normal + &version::(cmp + &version::(<=> + &version::vcmp + &version::(bool + &version::boolean + &version::(nomethod + &version::noop + &version::is_alpha + &version::qv + &version::vxs::declare + &version::vxs::qv + &version::vxs::_VERSION + &version::vxs::stringify + &version::vxs::new + &version::vxs::parse + &version::vxs::VCMP +]), ($] >= 5.011 && qw[ + &re::regexp_pattern +]), ($] >= 5.010 && $] < 5.014 && qw[ + &Tie::Hash::NamedCapture::FETCH + &Tie::Hash::NamedCapture::STORE + &Tie::Hash::NamedCapture::DELETE + &Tie::Hash::NamedCapture::CLEAR + &Tie::Hash::NamedCapture::EXISTS + &Tie::Hash::NamedCapture::FIRSTKEY + &Tie::Hash::NamedCapture::NEXTKEY + &Tie::Hash::NamedCapture::SCALAR + &Tie::Hash::NamedCapture::flags +])]; +if (defined $Devel::Cover::VERSION) { + push @$default_share, '&Devel::Cover::use_file'; +} + +sub new { + my($class, $root, $mask) = @_; + my $obj = {}; + bless $obj, $class; + + if (defined($root)) { + croak "Can't use \"$root\" as root name" + if $root =~ /^main\b/ or $root !~ /^\w[:\w]*$/; + $obj->{Root} = $root; + $obj->{Erase} = 0; + } + else { + $obj->{Root} = "Safe::Root".$default_root++; + $obj->{Erase} = 1; + } + + # use permit/deny methods instead till interface issues resolved + # XXX perhaps new Safe 'Root', mask => $mask, foo => bar, ...; + croak "Mask parameter to new no longer supported" if defined $mask; + $obj->permit_only(':default'); + + # We must share $_ and @_ with the compartment or else ops such + # as split, length and so on won't default to $_ properly, nor + # will passing argument to subroutines work (via @_). In fact, + # for reasons I don't completely understand, we need to share + # the whole glob *_ rather than $_ and @_ separately, otherwise + # @_ in non default packages within the compartment don't work. + $obj->share_from('main', $default_share); + + Opcode::_safe_pkg_prep($obj->{Root}) if($Opcode::VERSION > 1.04); + + return $obj; +} + +sub DESTROY { + my $obj = shift; + $obj->erase('DESTROY') if $obj->{Erase}; +} + +sub erase { + my ($obj, $action) = @_; + my $pkg = $obj->root(); + my ($stem, $leaf); + + no strict 'refs'; + $pkg = "main::$pkg\::"; # expand to full symbol table name + ($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/; + + # The 'my $foo' is needed! Without it you get an + # 'Attempt to free unreferenced scalar' warning! + my $stem_symtab = *{$stem}{HASH}; + + #warn "erase($pkg) stem=$stem, leaf=$leaf"; + #warn " stem_symtab hash ".scalar(%$stem_symtab)."\n"; + # ", join(', ', %$stem_symtab),"\n"; + +# delete $stem_symtab->{$leaf}; + + my $leaf_glob = $stem_symtab->{$leaf}; + my $leaf_symtab = *{$leaf_glob}{HASH}; +# warn " leaf_symtab ", join(', ', %$leaf_symtab),"\n"; + %$leaf_symtab = (); + #delete $leaf_symtab->{'__ANON__'}; + #delete $leaf_symtab->{'foo'}; + #delete $leaf_symtab->{'main::'}; +# my $foo = undef ${"$stem\::"}{"$leaf\::"}; + + if ($action and $action eq 'DESTROY') { + delete $stem_symtab->{$leaf}; + } else { + $obj->share_from('main', $default_share); + } + 1; +} + + +sub reinit { + my $obj= shift; + $obj->erase; + $obj->share_redo; +} + +sub root { + my $obj = shift; + croak("Safe root method now read-only") if @_; + return $obj->{Root}; +} + + +sub mask { + my $obj = shift; + return $obj->{Mask} unless @_; + $obj->deny_only(@_); +} + +# v1 compatibility methods +sub trap { shift->deny(@_) } +sub untrap { shift->permit(@_) } + +sub deny { + my $obj = shift; + $obj->{Mask} |= opset(@_); +} +sub deny_only { + my $obj = shift; + $obj->{Mask} = opset(@_); +} + +sub permit { + my $obj = shift; + # XXX needs testing + $obj->{Mask} &= invert_opset opset(@_); +} +sub permit_only { + my $obj = shift; + $obj->{Mask} = invert_opset opset(@_); +} + + +sub dump_mask { + my $obj = shift; + print opset_to_hex($obj->{Mask}),"\n"; +} + + +sub share { + my($obj, @vars) = @_; + $obj->share_from(scalar(caller), \@vars); +} + + +sub share_from { + my $obj = shift; + my $pkg = shift; + my $vars = shift; + my $no_record = shift || 0; + my $root = $obj->root(); + croak("vars not an array ref") unless ref $vars eq 'ARRAY'; + no strict 'refs'; + # Check that 'from' package actually exists + croak("Package \"$pkg\" does not exist") + unless keys %{"$pkg\::"}; + my $arg; + foreach $arg (@$vars) { + # catch some $safe->share($var) errors: + my ($var, $type); + $type = $1 if ($var = $arg) =~ s/^(\W)//; + # warn "share_from $pkg $type $var"; + for (1..2) { # assign twice to avoid any 'used once' warnings + *{$root."::$var"} = (!$type) ? \&{$pkg."::$var"} + : ($type eq '&') ? \&{$pkg."::$var"} + : ($type eq '$') ? \${$pkg."::$var"} + : ($type eq '@') ? \@{$pkg."::$var"} + : ($type eq '%') ? \%{$pkg."::$var"} + : ($type eq '*') ? *{$pkg."::$var"} + : croak(qq(Can't share "$type$var" of unknown type)); + } + } + $obj->share_record($pkg, $vars) unless $no_record or !$vars; +} + + +sub share_record { + my $obj = shift; + my $pkg = shift; + my $vars = shift; + my $shares = \%{$obj->{Shares} ||= {}}; + # Record shares using keys of $obj->{Shares}. See reinit. + @{$shares}{@$vars} = ($pkg) x @$vars if @$vars; +} + + +sub share_redo { + my $obj = shift; + my $shares = \%{$obj->{Shares} ||= {}}; + my($var, $pkg); + while(($var, $pkg) = each %$shares) { + # warn "share_redo $pkg\:: $var"; + $obj->share_from($pkg, [ $var ], 1); + } +} + + +sub share_forget { + delete shift->{Shares}; +} + + +sub varglob { + my ($obj, $var) = @_; + no strict 'refs'; + return *{$obj->root()."::$var"}; +} + +sub _clean_stash { + my ($root, $saved_refs) = @_; + $saved_refs ||= []; + no strict 'refs'; + foreach my $hook (qw(DESTROY AUTOLOAD), grep /^\(/, keys %$root) { + push @$saved_refs, \*{$root.$hook}; + delete ${$root}{$hook}; + } + + for (grep /::$/, keys %$root) { + next if \%{$root.$_} eq \%$root; + _clean_stash($root.$_, $saved_refs); + } +} + +sub reval { + my ($obj, $expr, $strict) = @_; + die "Bad Safe object" unless $obj->isa('Safe'); + + my $root = $obj->{Root}; + + my $evalsub = lexless_anon_sub($root, $strict, $expr); + # propagate context + my $sg = sub_generation(); + my @subret; + if (defined wantarray) { + @subret = (wantarray) + ? Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub) + : scalar Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); + } + else { + Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); + } + _clean_stash($root.'::') if $sg != sub_generation(); + $obj->wrap_code_refs_within(@subret); + return (wantarray) ? @subret : $subret[0]; +} + +my %OID; + +sub wrap_code_refs_within { + my $obj = shift; + + %OID = (); + $obj->_find_code_refs('wrap_code_ref', @_); +} + + +sub _find_code_refs { + my $obj = shift; + my $visitor = shift; + + for my $item (@_) { + my $reftype = $item && reftype $item + or next; + + # skip references already seen + next if ++$OID{refaddr $item} > 1; + + if ($reftype eq 'ARRAY') { + $obj->_find_code_refs($visitor, @$item); + } + elsif ($reftype eq 'HASH') { + $obj->_find_code_refs($visitor, values %$item); + } + # XXX GLOBs? + elsif ($reftype eq 'CODE') { + $item = $obj->$visitor($item); + } + } +} + + +sub wrap_code_ref { + my ($obj, $sub) = @_; + die "Bad safe object" unless $obj->isa('Safe'); + + # wrap code ref $sub with _safe_call_sv so that, when called, the + # execution will happen with the compartment fully 'in effect'. + + croak "Not a CODE reference" + if reftype $sub ne 'CODE'; + + my $ret = sub { + my @args = @_; # lexical to close over + my $sub_with_args = sub { $sub->(@args) }; + + my @subret; + my $error; + do { + local $@; # needed due to perl_call_sv(sv, G_EVAL|G_KEEPERR) + my $sg = sub_generation(); + @subret = (wantarray) + ? Opcode::_safe_call_sv($obj->{Root}, $obj->{Mask}, $sub_with_args) + : scalar Opcode::_safe_call_sv($obj->{Root}, $obj->{Mask}, $sub_with_args); + $error = $@; + _clean_stash($obj->{Root}.'::') if $sg != sub_generation(); + }; + if ($error) { # rethrow exception + $error =~ s/\t\(in cleanup\) //; # prefix added by G_KEEPERR + die $error; + } + return (wantarray) ? @subret : $subret[0]; + }; + + return $ret; +} + + +sub rdo { + my ($obj, $file) = @_; + die "Bad Safe object" unless $obj->isa('Safe'); + + my $root = $obj->{Root}; + + my $sg = sub_generation(); + my $evalsub = eval + sprintf('package %s; sub { @_ = (); do $file }', $root); + my @subret = (wantarray) + ? Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub) + : scalar Opcode::_safe_call_sv($root, $obj->{Mask}, $evalsub); + _clean_stash($root.'::') if $sg != sub_generation(); + $obj->wrap_code_refs_within(@subret); + return (wantarray) ? @subret : $subret[0]; +} + + +1; + +__END__ + + +package Env; + +our $VERSION = '1.04'; + + +sub import { + my ($callpack) = caller(0); + my $pack = shift; + my @vars = grep /^[\$\@]?[A-Za-z_]\w*$/, (@_ ? @_ : keys(%ENV)); + return unless @vars; + + @vars = map { m/^[\$\@]/ ? $_ : '$'.$_ } @vars; + + eval "package $callpack; use vars qw(" . join(' ', @vars) . ")"; + die $@ if $@; + foreach (@vars) { + my ($type, $name) = m/^([\$\@])(.*)$/; + if ($type eq '$') { + tie ${"${callpack}::$name"}, Env, $name; + } else { + if ($^O eq 'VMS') { + tie @{"${callpack}::$name"}, Env::Array::VMS, $name; + } else { + tie @{"${callpack}::$name"}, Env::Array, $name; + } + } + } +} + +sub TIESCALAR { + bless \($_[1]); +} + +sub FETCH { + my ($self) = @_; + $ENV{$$self}; +} + +sub STORE { + my ($self, $value) = @_; + if (defined($value)) { + $ENV{$$self} = $value; + } else { + delete $ENV{$$self}; + } +} + +###################################################################### + +package Env::Array; + +use Config; +use Tie::Array; + +@ISA = qw(Tie::Array); + +my $sep = $Config::Config{path_sep}; + +sub TIEARRAY { + bless \($_[1]); +} + +sub FETCHSIZE { + my ($self) = @_; + return 1 + scalar(() = $ENV{$$self} =~ /\Q$sep\E/g); +} + +sub STORESIZE { + my ($self, $size) = @_; + my @temp = split($sep, $ENV{$$self}); + $#temp = $size - 1; + $ENV{$$self} = join($sep, @temp); +} + +sub CLEAR { + my ($self) = @_; + $ENV{$$self} = ''; +} + +sub FETCH { + my ($self, $index) = @_; + return (split($sep, $ENV{$$self}))[$index]; +} + +sub STORE { + my ($self, $index, $value) = @_; + my @temp = split($sep, $ENV{$$self}); + $temp[$index] = $value; + $ENV{$$self} = join($sep, @temp); + return $value; +} + +sub EXISTS { + my ($self, $index) = @_; + return $index < $self->FETCHSIZE; +} + +sub DELETE { + my ($self, $index) = @_; + my @temp = split($sep, $ENV{$$self}); + my $value = splice(@temp, $index, 1, ()); + $ENV{$$self} = join($sep, @temp); + return $value; +} + +sub PUSH { + my $self = shift; + my @temp = split($sep, $ENV{$$self}); + push @temp, @_; + $ENV{$$self} = join($sep, @temp); + return scalar(@temp); +} + +sub POP { + my ($self) = @_; + my @temp = split($sep, $ENV{$$self}); + my $result = pop @temp; + $ENV{$$self} = join($sep, @temp); + return $result; +} + +sub UNSHIFT { + my $self = shift; + my @temp = split($sep, $ENV{$$self}); + my $result = unshift @temp, @_; + $ENV{$$self} = join($sep, @temp); + return $result; +} + +sub SHIFT { + my ($self) = @_; + my @temp = split($sep, $ENV{$$self}); + my $result = shift @temp; + $ENV{$$self} = join($sep, @temp); + return $result; +} + +sub SPLICE { + my $self = shift; + my $offset = shift; + my $length = shift; + my @temp = split($sep, $ENV{$$self}); + if (wantarray) { + my @result = splice @temp, $offset, $length, @_; + $ENV{$$self} = join($sep, @temp); + return @result; + } else { + my $result = scalar splice @temp, $offset, $length, @_; + $ENV{$$self} = join($sep, @temp); + return $result; + } +} + +###################################################################### + +package Env::Array::VMS; +use Tie::Array; + +@ISA = qw(Tie::Array); + +sub TIEARRAY { + bless \($_[1]); +} + +sub FETCHSIZE { + my ($self) = @_; + my $i = 0; + while ($i < 127 and defined $ENV{$$self . ';' . $i}) { $i++; }; + return $i; +} + +sub FETCH { + my ($self, $index) = @_; + return $ENV{$$self . ';' . $index}; +} + +sub EXISTS { + my ($self, $index) = @_; + return $index < $self->FETCHSIZE; +} + +sub DELETE { } + +1; +# FindBin.pm +# +# Copyright (c) 1995 Graham Barr & Nick Ing-Simmons. All rights reserved. +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + + +package FindBin; +use Carp; +require 5.000; +require Exporter; +use Cwd qw(getcwd cwd abs_path); +use File::Basename; +use File::Spec; + +@EXPORT_OK = qw($Bin $Script $RealBin $RealScript $Dir $RealDir); +%EXPORT_TAGS = (ALL => [qw($Bin $Script $RealBin $RealScript $Dir $RealDir)]); +@ISA = qw(Exporter); + +$VERSION = "1.51"; + + +# needed for VMS-specific filename translation +if( $^O eq 'VMS' ) { + require VMS::Filespec; + VMS::Filespec->import; +} + +sub cwd2 { + my $cwd = getcwd(); + # getcwd might fail if it hasn't access to the current directory. + # try harder. + defined $cwd or $cwd = cwd(); + $cwd; +} + +sub init +{ + *Dir = \$Bin; + *RealDir = \$RealBin; + + if($0 eq '-e' || $0 eq '-') + { + # perl invoked with -e or script is on C + $Script = $RealScript = $0; + $Bin = $RealBin = cwd2(); + $Bin = VMS::Filespec::unixify($Bin) if $^O eq 'VMS'; + } + else + { + my $script = $0; + + if ($^O eq 'VMS') + { + ($Bin,$Script) = VMS::Filespec::rmsexpand($0) =~ /(.*[\]>\/]+)(.*)/s; + # C isn't going to work, so unixify first + ($Bin = VMS::Filespec::unixify($Bin)) =~ s/\/\z//; + ($RealBin,$RealScript) = ($Bin,$Script); + } + else + { + croak("Cannot find current script '$0'") unless(-f $script); + + # Ensure $script contains the complete path in case we C + + $script = File::Spec->catfile(cwd2(), $script) + unless File::Spec->file_name_is_absolute($script); + + ($Script,$Bin) = fileparse($script); + + # Resolve $script if it is a link + while(1) + { + my $linktext = readlink($script); + + ($RealScript,$RealBin) = fileparse($script); + last unless defined $linktext; + + $script = (File::Spec->file_name_is_absolute($linktext)) + ? $linktext + : File::Spec->catfile($RealBin, $linktext); + } + + # Get absolute paths to directories + if ($Bin) { + my $BinOld = $Bin; + $Bin = abs_path($Bin); + defined $Bin or $Bin = File::Spec->canonpath($BinOld); + } + $RealBin = abs_path($RealBin) if($RealBin); + } + } +} + +BEGIN { init } + +*again = \&init; + +1; # Keep require happy +package Symbol; + + +BEGIN { require 5.005; } + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(gensym ungensym qualify qualify_to_ref); +@EXPORT_OK = qw(delete_package geniosym); + +$VERSION = '1.08'; + +my $genpkg = "Symbol::"; +my $genseq = 0; + +my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT); + +# +# Note that we never _copy_ the glob; we just make a ref to it. +# If we did copy it, then SVf_FAKE would be set on the copy, and +# glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work. +# +sub gensym () { + my $name = "GEN" . $genseq++; + my $ref = \*{$genpkg . $name}; + delete $$genpkg{$name}; + $ref; +} + +sub geniosym () { + my $sym = gensym(); + # force the IO slot to be filled + select(select $sym); + *$sym{IO}; +} + +sub ungensym ($) {} + +sub qualify ($;$) { + my ($name) = @_; + if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) { + my $pkg; + # Global names: special character, "^xyz", or other. + if ($name =~ /^(([^a-z])|(\^[a-z_]+))\z/i || $global{$name}) { + # RGS 2001-11-05 : translate leading ^X to control-char + $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei; + $pkg = "main"; + } + else { + $pkg = (@_ > 1) ? $_[1] : caller; + } + $name = $pkg . "::" . $name; + } + $name; +} + +sub qualify_to_ref ($;$) { + return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller }; +} + +# +# of Safe.pm lineage +# +sub delete_package ($) { + my $pkg = shift; + + # expand to full symbol table name if needed + + unless ($pkg =~ /^main::.*::$/) { + $pkg = "main$pkg" if $pkg =~ /^::/; + $pkg = "main::$pkg" unless $pkg =~ /^main::/; + $pkg .= '::' unless $pkg =~ /::$/; + } + + my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/; + my $stem_symtab = *{$stem}{HASH}; + return unless defined $stem_symtab and exists $stem_symtab->{$leaf}; + + + # free all the symbols in the package + + my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH}; + foreach my $name (keys %$leaf_symtab) { + undef *{$pkg . $name}; + } + + # delete the symbol table + + %$leaf_symtab = (); + delete $stem_symtab->{$leaf}; +} + +1; +package blib; + + +use Cwd; +use File::Spec; + +our $VERSION = '1.07'; +our $Verbose = 0; + +sub import +{ + my $package = shift; + my $dir; + if ($^O eq "MSWin32" && -f "Win32.xs") { + # We don't use getcwd() on Windows because it will internally + # call Win32::GetCwd(), which will get the Win32 module loaded. + # That means that it would not be possible to run `make test` + # for the Win32 module because blib.pm would always load the + # installed version before @INC gets updated with the blib path. + chomp($dir = `cd`); + } + else { + $dir = getcwd; + } + if ($^O eq 'VMS') { ($dir = VMS::Filespec::unixify($dir)) =~ s-/\z--; } + if (@_) + { + $dir = shift; + $dir =~ s/blib\z//; + $dir =~ s,/+\z,,; + $dir = File::Spec->curdir unless ($dir); + die "$dir is not a directory\n" unless (-d $dir); + } + + # detaint: if the user asked for blib, s/he presumably knew + # what s/he wanted + $dir = $1 if $dir =~ /^(.*)$/; + + my $i = 5; + my($blib, $blib_lib, $blib_arch); + while ($i--) + { + $blib = File::Spec->catdir($dir, "blib"); + $blib_lib = File::Spec->catdir($blib, "lib"); + $blib_arch = File::Spec->catdir($blib, "arch"); + + if (-d $blib && -d $blib_arch && -d $blib_lib) + { + unshift(@INC,$blib_arch,$blib_lib); + warn "Using $blib\n" if $Verbose; + return; + } + $dir = File::Spec->catdir($dir, File::Spec->updir); + } + die "Cannot find blib even in $dir\n"; +} + +1; +package autouse; + +#use strict; # debugging only +use 5.006; # use warnings + +$autouse::VERSION = '1.11'; + +$autouse::DEBUG ||= 0; + +sub vet_import ($); + +sub croak { + require Carp; + Carp::croak(@_); +} + +sub import { + my $class = @_ ? shift : 'autouse'; + croak "usage: use $class MODULE [,SUBS...]" unless @_; + my $module = shift; + + (my $pm = $module) =~ s{::}{/}g; + $pm .= '.pm'; + if (exists $INC{$pm}) { + vet_import $module; + local $Exporter::ExportLevel = $Exporter::ExportLevel + 1; + # $Exporter::Verbose = 1; + return $module->import(map { (my $f = $_) =~ s/\(.*?\)$//; $f } @_); + } + + # It is not loaded: need to do real work. + my $callpkg = caller(0); + print "autouse called from $callpkg\n" if $autouse::DEBUG; + + my $index; + for my $f (@_) { + my $proto; + $proto = $1 if (my $func = $f) =~ s/\((.*)\)$//; + + my $closure_import_func = $func; # Full name + my $closure_func = $func; # Name inside package + my $index = rindex($func, '::'); + if ($index == -1) { + $closure_import_func = "${callpkg}::$func"; + } else { + $closure_func = substr $func, $index + 2; + croak "autouse into different package attempted" + unless substr($func, 0, $index) eq $module; + } + + my $load_sub = sub { + unless ($INC{$pm}) { + require $pm; + vet_import $module; + } + no warnings qw(redefine prototype); + *$closure_import_func = \&{"${module}::$closure_func"}; + print "autousing $module; " + ."imported $closure_func as $closure_import_func\n" + if $autouse::DEBUG; + goto &$closure_import_func; + }; + + if (defined $proto) { + *$closure_import_func = eval "sub ($proto) { goto &\$load_sub }" + || die; + } else { + *$closure_import_func = $load_sub; + } + } +} + +sub vet_import ($) { + my $module = shift; + if (my $import = $module->can('import')) { + croak "autoused module $module has unique import() method" + unless defined(&Exporter::import) + && ($import == \&Exporter::import || + $import == \&UNIVERSAL::import) + } +} + +1; + +__END__ + +# -*- mode: perl; perl-indent-level: 2; -*- +# Memoize.pm +# +# Transparent memoization of idempotent functions +# +# Copyright 1998, 1999, 2000, 2001, 2012 M. J. Dominus. +# You may copy and distribute this program under the +# same terms as Perl itself. If in doubt, +# write to mjd-perl-memoize+@plover.com for a license. + +package Memoize; +$VERSION = '1.03_01'; + +# Compile-time constants +sub SCALAR () { 0 } +sub LIST () { 1 } + + +# +# Usage memoize(functionname/ref, +# { NORMALIZER => coderef, INSTALL => name, +# LIST_CACHE => descriptor, SCALAR_CACHE => descriptor } +# + +use Carp; +use Exporter; +use vars qw($DEBUG); +use Config; # Dammit. +@ISA = qw(Exporter); +@EXPORT = qw(memoize); +@EXPORT_OK = qw(unmemoize flush_cache); +use strict; + +my %memotable; +my %revmemotable; +my @CONTEXT_TAGS = qw(MERGE TIE MEMORY FAULT HASH); +my %IS_CACHE_TAG = map {($_ => 1)} @CONTEXT_TAGS; + +# Raise an error if the user tries to specify one of thesepackage as a +# tie for LIST_CACHE + +my %scalar_only = map {($_ => 1)} qw(DB_File GDBM_File SDBM_File ODBM_File NDBM_File); + +sub memoize { + my $fn = shift; + my %options = @_; + my $options = \%options; + + unless (defined($fn) && + (ref $fn eq 'CODE' || ref $fn eq '')) { + croak "Usage: memoize 'functionname'|coderef {OPTIONS}"; + } + + my $uppack = caller; # TCL me Elmo! + my $cref; # Code reference to original function + my $name = (ref $fn ? undef : $fn); + + # Convert function names to code references + $cref = &_make_cref($fn, $uppack); + + # Locate function prototype, if any + my $proto = prototype $cref; + if (defined $proto) { $proto = "($proto)" } + else { $proto = "" } + + # I would like to get rid of the eval, but there seems not to be any + # other way to set the prototype properly. The switch here for + # 'usethreads' works around a bug in threadperl having to do with + # magic goto. It would be better to fix the bug and use the magic + # goto version everywhere. + my $wrapper = + $Config{usethreads} + ? eval "sub $proto { &_memoizer(\$cref, \@_); }" + : eval "sub $proto { unshift \@_, \$cref; goto &_memoizer; }"; + + my $normalizer = $options{NORMALIZER}; + if (defined $normalizer && ! ref $normalizer) { + $normalizer = _make_cref($normalizer, $uppack); + } + + my $install_name; + if (defined $options->{INSTALL}) { + # INSTALL => name + $install_name = $options->{INSTALL}; + } elsif (! exists $options->{INSTALL}) { + # No INSTALL option provided; use original name if possible + $install_name = $name; + } else { + # INSTALL => undef means don't install + } + + if (defined $install_name) { + $install_name = $uppack . '::' . $install_name + unless $install_name =~ /::/; + no strict; + local($^W) = 0; # ``Subroutine $install_name redefined at ...'' + *{$install_name} = $wrapper; # Install memoized version + } + + $revmemotable{$wrapper} = "" . $cref; # Turn code ref into hash key + + # These will be the caches + my %caches; + for my $context (qw(SCALAR LIST)) { + # suppress subsequent 'uninitialized value' warnings + $options{"${context}_CACHE"} ||= ''; + + my $cache_opt = $options{"${context}_CACHE"}; + my @cache_opt_args; + if (ref $cache_opt) { + @cache_opt_args = @$cache_opt; + $cache_opt = shift @cache_opt_args; + } + if ($cache_opt eq 'FAULT') { # no cache + $caches{$context} = undef; + } elsif ($cache_opt eq 'HASH') { # user-supplied hash + my $cache = $cache_opt_args[0]; + my $package = ref(tied %$cache); + if ($context eq 'LIST' && $scalar_only{$package}) { + croak("You can't use $package for LIST_CACHE because it can only store scalars"); + } + $caches{$context} = $cache; + } elsif ($cache_opt eq '' || $IS_CACHE_TAG{$cache_opt}) { + # default is that we make up an in-memory hash + $caches{$context} = {}; + # (this might get tied later, or MERGEd away) + } else { + croak "Unrecognized option to `${context}_CACHE': `$cache_opt' should be one of (@CONTEXT_TAGS); aborting"; + } + } + + # Perhaps I should check here that you didn't supply *both* merge + # options. But if you did, it does do something reasonable: They + # both get merged to the same in-memory hash. + if ($options{SCALAR_CACHE} eq 'MERGE' || $options{LIST_CACHE} eq 'MERGE') { + $options{MERGED} = 1; + $caches{SCALAR} = $caches{LIST}; + } + + # Now deal with the TIE options + { + my $context; + foreach $context (qw(SCALAR LIST)) { + # If the relevant option wasn't `TIE', this call does nothing. + _my_tie($context, $caches{$context}, $options); # Croaks on failure + } + } + + # We should put some more stuff in here eventually. + # We've been saying that for serveral versions now. + # And you know what? More stuff keeps going in! + $memotable{$cref} = + { + O => $options, # Short keys here for things we need to access frequently + N => $normalizer, + U => $cref, + MEMOIZED => $wrapper, + PACKAGE => $uppack, + NAME => $install_name, + S => $caches{SCALAR}, + L => $caches{LIST}, + }; + + $wrapper # Return just memoized version +} + +# This function tries to load a tied hash class and tie the hash to it. +sub _my_tie { + my ($context, $hash, $options) = @_; + my $fullopt = $options->{"${context}_CACHE"}; + + # We already checked to make sure that this works. + my $shortopt = (ref $fullopt) ? $fullopt->[0] : $fullopt; + + return unless defined $shortopt && $shortopt eq 'TIE'; + carp("TIE option to memoize() is deprecated; use HASH instead") + if $^W; + + my @args = ref $fullopt ? @$fullopt : (); + shift @args; + my $module = shift @args; + if ($context eq 'LIST' && $scalar_only{$module}) { + croak("You can't use $module for LIST_CACHE because it can only store scalars"); + } + my $modulefile = $module . '.pm'; + $modulefile =~ s{::}{/}g; + eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require $modulefile + }; + if ($@) { + croak "Memoize: Couldn't load hash tie module `$module': $@; aborting"; + } + my $rc = (tie %$hash => $module, @args); + unless ($rc) { + croak "Memoize: Couldn't tie hash to `$module': $!; aborting"; + } + 1; +} + +sub flush_cache { + my $func = _make_cref($_[0], scalar caller); + my $info = $memotable{$revmemotable{$func}}; + die "$func not memoized" unless defined $info; + for my $context (qw(S L)) { + my $cache = $info->{$context}; + if (tied %$cache && ! (tied %$cache)->can('CLEAR')) { + my $funcname = defined($info->{NAME}) ? + "function $info->{NAME}" : "anonymous function $func"; + my $context = {S => 'scalar', L => 'list'}->{$context}; + croak "Tied cache hash for $context-context $funcname does not support flushing"; + } else { + %$cache = (); + } + } +} + +# This is the function that manages the memo tables. +sub _memoizer { + my $orig = shift; # stringized version of ref to original func. + my $info = $memotable{$orig}; + my $normalizer = $info->{N}; + + my $argstr; + my $context = (wantarray() ? LIST : SCALAR); + + if (defined $normalizer) { + no strict; + if ($context == SCALAR) { + $argstr = &{$normalizer}(@_); + } elsif ($context == LIST) { + ($argstr) = &{$normalizer}(@_); + } else { + croak "Internal error \#41; context was neither LIST nor SCALAR\n"; + } + } else { # Default normalizer + local $^W = 0; + $argstr = join chr(28),@_; + } + + if ($context == SCALAR) { + my $cache = $info->{S}; + _crap_out($info->{NAME}, 'scalar') unless $cache; + if (exists $cache->{$argstr}) { + return $info->{O}{MERGED} + ? $cache->{$argstr}[0] : $cache->{$argstr}; + } else { + my $val = &{$info->{U}}(@_); + # Scalars are considered to be lists; store appropriately + if ($info->{O}{MERGED}) { + $cache->{$argstr} = [$val]; + } else { + $cache->{$argstr} = $val; + } + $val; + } + } elsif ($context == LIST) { + my $cache = $info->{L}; + _crap_out($info->{NAME}, 'list') unless $cache; + if (exists $cache->{$argstr}) { + return @{$cache->{$argstr}}; + } else { + my @q = &{$info->{U}}(@_); + $cache->{$argstr} = \@q; + @q; + } + } else { + croak "Internal error \#42; context was neither LIST nor SCALAR\n"; + } +} + +sub unmemoize { + my $f = shift; + my $uppack = caller; + my $cref = _make_cref($f, $uppack); + + unless (exists $revmemotable{$cref}) { + croak "Could not unmemoize function `$f', because it was not memoized to begin with"; + } + + my $tabent = $memotable{$revmemotable{$cref}}; + unless (defined $tabent) { + croak "Could not figure out how to unmemoize function `$f'"; + } + my $name = $tabent->{NAME}; + if (defined $name) { + no strict; + local($^W) = 0; # ``Subroutine $install_name redefined at ...'' + *{$name} = $tabent->{U}; # Replace with original function + } + undef $memotable{$revmemotable{$cref}}; + undef $revmemotable{$cref}; + + # This removes the last reference to the (possibly tied) memo tables + # my ($old_function, $memotabs) = @{$tabent}{'U','S','L'}; + # undef $tabent; + +# # Untie the memo tables if they were tied. +# my $i; +# for $i (0,1) { +# if (tied %{$memotabs->[$i]}) { +# warn "Untying hash #$i\n"; +# untie %{$memotabs->[$i]}; +# } +# } + + $tabent->{U}; +} + +sub _make_cref { + my $fn = shift; + my $uppack = shift; + my $cref; + my $name; + + if (ref $fn eq 'CODE') { + $cref = $fn; + } elsif (! ref $fn) { + if ($fn =~ /::/) { + $name = $fn; + } else { + $name = $uppack . '::' . $fn; + } + no strict; + if (defined $name and !defined(&$name)) { + croak "Cannot operate on nonexistent function `$fn'"; + } +# $cref = \&$name; + $cref = *{$name}{CODE}; + } else { + my $parent = (caller(1))[3]; # Function that called _make_cref + croak "Usage: argument 1 to `$parent' must be a function name or reference.\n"; + } + $DEBUG and warn "${name}($fn) => $cref in _make_cref\n"; + $cref; +} + +sub _crap_out { + my ($funcname, $context) = @_; + if (defined $funcname) { + croak "Function `$funcname' called in forbidden $context context; faulting"; + } else { + croak "Anonymous function called in forbidden $context context; faulting"; + } +} + +1; + + + + + +package charnames; +use strict; +use warnings; +our $VERSION = '1.45'; +use unicore::Name; # mktables-generated algorithmically-defined names +use _charnames (); # The submodule for this where most of the work gets done + +use bytes (); # for $bytes::hint_bits +use re "/aa"; # Everything in here should be ASCII + +# Translate between Unicode character names and their code points. +# This is a wrapper around the submodule C<_charnames>. This design allows +# C<_charnames> to be autoloaded to enable use of \N{...}, but requires this +# module to be explicitly requested for the functions API. + +$Carp::Internal{ (__PACKAGE__) } = 1; + +sub import +{ + shift; ## ignore class name + _charnames->import(@_); +} + +# Cache of already looked-up values. This is set to only contain +# official values, and user aliases can't override them, so scoping is +# not an issue. +my %viacode; + +sub viacode { + return _charnames::viacode(@_); +} + +sub vianame +{ + if (@_ != 1) { + _charnames::carp "charnames::vianame() expects one name argument"; + return () + } + + # Looks up the character name and returns its ordinal if + # found, undef otherwise. + + my $arg = shift; + + if ($arg =~ /^U\+([0-9a-fA-F]+)$/) { + + # khw claims that this is poor interface design. The function should + # return either a an ord or a chr for all inputs; not be bipolar. But + # can't change it because of backward compatibility. New code can use + # string_vianame() instead. + my $ord = CORE::hex $1; + return pack("U", $ord) if $ord <= 255 || ! ((caller 0)[8] & $bytes::hint_bits); + _charnames::carp _charnames::not_legal_use_bytes_msg($arg, chr $ord); + return; + } + + # The first 1 arg means wants an ord returned; the second that we are in + # runtime, and this is the first level routine called from the user + return _charnames::lookup_name($arg, 1, 1); +} # vianame + +sub string_vianame { + + # Looks up the character name and returns its string representation if + # found, undef otherwise. + + if (@_ != 1) { + _charnames::carp "charnames::string_vianame() expects one name argument"; + return; + } + + my $arg = shift; + + if ($arg =~ /^U\+([0-9a-fA-F]+)$/) { + + my $ord = CORE::hex $1; + return pack("U", $ord) if $ord <= 255 || ! ((caller 0)[8] & $bytes::hint_bits); + + _charnames::carp _charnames::not_legal_use_bytes_msg($arg, chr $ord); + return; + } + + # The 0 arg means wants a string returned; the 1 arg means that we are in + # runtime, and this is the first level routine called from the user + return _charnames::lookup_name($arg, 0, 1); +} # string_vianame + +1; +__END__ + + +# ex: set ts=8 sts=2 sw=2 et: +use 5.008; +package fields; + +require 5.005; +use strict; +no strict 'refs'; +unless( eval q{require warnings::register; warnings::register->import; 1} ) { + *warnings::warnif = sub { + require Carp; + Carp::carp(@_); + } +} +our %attr; + +our $VERSION = '2.24'; +$VERSION =~ tr/_//d; + +# constant.pm is slow +sub PUBLIC () { 2**0 } +sub PRIVATE () { 2**1 } +sub INHERITED () { 2**2 } +sub PROTECTED () { 2**3 } + + +# The %attr hash holds the attributes of the currently assigned fields +# per class. The hash is indexed by class names and the hash value is +# an array reference. The first element in the array is the lowest field +# number not belonging to a base class. The remaining elements' indices +# are the field numbers. The values are integer bit masks, or undef +# in the case of base class private fields (which occupy a slot but are +# otherwise irrelevant to the class). + +sub import { + my $class = shift; + return unless @_; + my $package = caller(0); + # avoid possible typo warnings + %{"$package\::FIELDS"} = () unless %{"$package\::FIELDS"}; + my $fields = \%{"$package\::FIELDS"}; + my $fattr = ($attr{$package} ||= [1]); + my $next = @$fattr; + + # Quiet pseudo-hash deprecation warning for uses of fields::new. + bless \%{"$package\::FIELDS"}, 'pseudohash'; + + if ($next > $fattr->[0] + and ($fields->{$_[0]} || 0) >= $fattr->[0]) + { + # There are already fields not belonging to base classes. + # Looks like a possible module reload... + $next = $fattr->[0]; + } + foreach my $f (@_) { + my $fno = $fields->{$f}; + + # Allow the module to be reloaded so long as field positions + # have not changed. + if ($fno and $fno != $next) { + require Carp; + if ($fno < $fattr->[0]) { + if ($] < 5.006001) { + warn("Hides field '$f' in base class") if $^W; + } else { + warnings::warnif("Hides field '$f' in base class") ; + } + } else { + Carp::croak("Field name '$f' already in use"); + } + } + $fields->{$f} = $next; + $fattr->[$next] = ($f =~ /^_/) ? PRIVATE : PUBLIC; + $next += 1; + } + if (@$fattr > $next) { + # Well, we gave them the benefit of the doubt by guessing the + # module was reloaded, but they appear to be declaring fields + # in more than one place. We can't be sure (without some extra + # bookkeeping) that the rest of the fields will be declared or + # have the same positions, so punt. + require Carp; + Carp::croak ("Reloaded module must declare all fields at once"); + } +} + +sub inherit { + require base; + goto &base::inherit_fields; +} + +sub _dump # sometimes useful for debugging +{ + for my $pkg (sort keys %attr) { + print "\n$pkg"; + if (@{"$pkg\::ISA"}) { + print " (", join(", ", @{"$pkg\::ISA"}), ")"; + } + print "\n"; + my $fields = \%{"$pkg\::FIELDS"}; + for my $f (sort {$fields->{$a} <=> $fields->{$b}} keys %$fields) { + my $no = $fields->{$f}; + print " $no: $f"; + my $fattr = $attr{$pkg}[$no]; + if (defined $fattr) { + my @a; + push(@a, "public") if $fattr & PUBLIC; + push(@a, "private") if $fattr & PRIVATE; + push(@a, "inherited") if $fattr & INHERITED; + print "\t(", join(", ", @a), ")"; + } + print "\n"; + } + } +} + +if ($] < 5.009) { + *new = sub { + my $class = shift; + $class = ref $class if ref $class; + return bless [\%{$class . "::FIELDS"}], $class; + } +} else { + *new = sub { + my $class = shift; + $class = ref $class if ref $class; + require Hash::Util; + my $self = bless {}, $class; + + # The lock_keys() prototype won't work since we require Hash::Util :( + &Hash::Util::lock_keys(\%$self, _accessible_keys($class)); + return $self; + } +} + +sub _accessible_keys { + my ($class) = @_; + return ( + keys %{$class.'::FIELDS'}, + map(_accessible_keys($_), @{$class.'::ISA'}), + ); +} + +sub phash { + die "Pseudo-hashes have been removed from Perl" if $] >= 5.009; + my $h; + my $v; + if (@_) { + if (ref $_[0] eq 'ARRAY') { + my $a = shift; + @$h{@$a} = 1 .. @$a; + if (@_) { + $v = shift; + unless (! @_ and ref $v eq 'ARRAY') { + require Carp; + Carp::croak ("Expected at most two array refs\n"); + } + } + } + else { + if (@_ % 2) { + require Carp; + Carp::croak ("Odd number of elements initializing pseudo-hash\n"); + } + my $i = 0; + @$h{grep ++$i % 2, @_} = 1 .. @_ / 2; + $i = 0; + $v = [grep $i++ % 2, @_]; + } + } + else { + $h = {}; + $v = []; + } + [ $h, @$v ]; + +} + +1; + +__END__ + +package Thread; + +use strict; +use warnings; +no warnings 'redefine'; + +our $VERSION = '3.04'; +$VERSION = eval $VERSION; + +BEGIN { + use Config; + if (! $Config{useithreads}) { + die("This Perl not built to support threads\n"); + } +} + +use threads 'yield'; +use threads::shared; + +require Exporter; +our @ISA = qw(Exporter threads); +our @EXPORT = qw(cond_wait cond_broadcast cond_signal); +our @EXPORT_OK = qw(async yield); + +sub async (&;@) { return Thread->new(shift); } + +sub done { return ! shift->is_running(); } + +sub eval { die("'eval' not implemented with 'ithreads'\n"); }; +sub flags { die("'flags' not implemented with 'ithreads'\n"); }; + +1; + +__END__ + +package parent; +use strict; +use vars qw($VERSION); +$VERSION = '0.236'; + +sub import { + my $class = shift; + + my $inheritor = caller(0); + + if ( @_ and $_[0] eq '-norequire' ) { + shift @_; + } else { + for ( my @filename = @_ ) { + s{::|'}{/}g; + require "$_.pm"; # dies if the file is not found + } + } + + { + no strict 'refs'; + push @{"$inheritor\::ISA"}, @_; # dies if a loop is detected + }; +}; + +1; + +__END__ + +package less; +use strict; +use warnings; + +our $VERSION = '0.03'; + +sub _pack_tags { + return join ' ', @_; +} + +sub _unpack_tags { + return grep { defined and length } + map { split ' ' } + grep {defined} @_; +} + +sub stash_name { $_[0] } + +sub of { + my $class = shift @_; + + # If no one wants the result, don't bother computing it. + return unless defined wantarray; + + my $hinthash = ( caller 0 )[10]; + my %tags; + @tags{ _unpack_tags( $hinthash->{ $class->stash_name } ) } = (); + + if (@_) { + exists $tags{$_} and return !!1 for @_; + return; + } + else { + return keys %tags; + } +} + +sub import { + my $class = shift @_; + my $stash = $class->stash_name; + + @_ = 'please' if not @_; + my %tags; + @tags{ _unpack_tags( @_, $^H{ $stash } ) } = (); + + $^H{$stash} = _pack_tags( keys %tags ); + return; +} + +sub unimport { + my $class = shift @_; + + if (@_) { + my %tags; + @tags{ _unpack_tags( $^H{$class} ) } = (); + delete @tags{ _unpack_tags(@_) }; + my $new = _pack_tags( keys %tags ); + + if ( not length $new ) { + delete $^H{ $class->stash_name }; + } + else { + $^H{ $class->stash_name } = $new; + } + } + else { + delete $^H{ $class->stash_name }; + } + + return; +} + +1; + +__END__ + +package Benchmark; + +use strict; + + + +# evaluate something in a clean lexical environment +sub _doeval { no strict; eval shift } + +# +# put any lexicals at file scope AFTER here +# + +use Carp; +use Exporter; + +our(@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); + +@ISA=qw(Exporter); +@EXPORT=qw(timeit timethis timethese timediff timestr); +@EXPORT_OK=qw(timesum cmpthese countit + clearcache clearallcache disablecache enablecache); +%EXPORT_TAGS=( all => [ @EXPORT, @EXPORT_OK ] ) ; + +$VERSION = 1.22; + +# --- ':hireswallclock' special handling + +my $hirestime; + +sub mytime () { time } + +init(); + +sub BEGIN { + if (eval 'require Time::HiRes') { + import Time::HiRes qw(time); + $hirestime = \&Time::HiRes::time; + } +} + +sub import { + my $class = shift; + if (grep { $_ eq ":hireswallclock" } @_) { + @_ = grep { $_ ne ":hireswallclock" } @_; + local $^W=0; + *mytime = $hirestime if defined $hirestime; + } + Benchmark->export_to_level(1, $class, @_); +} + +our($Debug, $Min_Count, $Min_CPU, $Default_Format, $Default_Style, + %_Usage, %Cache, $Do_Cache); + +sub init { + $Debug = 0; + $Min_Count = 4; + $Min_CPU = 0.4; + $Default_Format = '5.2f'; + $Default_Style = 'auto'; + # The cache can cause a slight loss of sys time accuracy. If a + # user does many tests (>10) with *very* large counts (>10000) + # or works on a very slow machine the cache may be useful. + disablecache(); + clearallcache(); +} + +sub debug { $Debug = ($_[1] != 0); } + +sub usage { + my $calling_sub = (caller(1))[3]; + $calling_sub =~ s/^Benchmark:://; + return $_Usage{$calling_sub} || ''; +} + +# The cache needs two branches: 's' for strings and 'c' for code. The +# empty loop is different in these two cases. + +$_Usage{clearcache} = <<'USAGE'; +usage: clearcache($count); +USAGE + +sub clearcache { + die usage unless @_ == 1; + delete $Cache{"$_[0]c"}; delete $Cache{"$_[0]s"}; +} + +$_Usage{clearallcache} = <<'USAGE'; +usage: clearallcache(); +USAGE + +sub clearallcache { + die usage if @_; + %Cache = (); +} + +$_Usage{enablecache} = <<'USAGE'; +usage: enablecache(); +USAGE + +sub enablecache { + die usage if @_; + $Do_Cache = 1; +} + +$_Usage{disablecache} = <<'USAGE'; +usage: disablecache(); +USAGE + +sub disablecache { + die usage if @_; + $Do_Cache = 0; +} + + +# --- Functions to process the 'time' data type + +sub new { my @t = (mytime, times, @_ == 2 ? $_[1] : 0); + print STDERR "new=@t\n" if $Debug; + bless \@t; } + +sub cpu_p { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps ; } +sub cpu_c { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $cu+$cs ; } +sub cpu_a { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $pu+$ps+$cu+$cs ; } +sub real { my($r,$pu,$ps,$cu,$cs) = @{$_[0]}; $r ; } +sub iters { $_[0]->[5] ; } + +# return the sum of various times: which ones depending on $style + +sub elapsed { + my ($self, $style) = @_; + $style = "" unless defined $style; + + return $self->cpu_c if $style eq 'nop'; + return $self->cpu_p if $style eq 'noc'; + return $self->cpu_a; +} + + +$_Usage{timediff} = <<'USAGE'; +usage: $result_diff = timediff($result1, $result2); +USAGE + +sub timediff { + my($a, $b) = @_; + + die usage unless ref $a and ref $b; + + my @r; + for (my $i=0; $i < @$a; ++$i) { + push(@r, $a->[$i] - $b->[$i]); + } + #die "Bad timediff(): ($r[1] + $r[2]) <= 0 (@$a[1,2]|@$b[1,2])\n" + # if ($r[1] + $r[2]) < 0; + bless \@r; +} + +$_Usage{timesum} = <<'USAGE'; +usage: $sum = timesum($result1, $result2); +USAGE + +sub timesum { + my($a, $b) = @_; + + die usage unless ref $a and ref $b; + + my @r; + for (my $i=0; $i < @$a; ++$i) { + push(@r, $a->[$i] + $b->[$i]); + } + bless \@r; +} + + +$_Usage{timestr} = <<'USAGE'; +usage: $formatted_result = timestr($result1); +USAGE + +sub timestr { + my($tr, $style, $f) = @_; + + die usage unless ref $tr; + + my @t = @$tr; + warn "bad time value (@t)" unless @t==6; + my($r, $pu, $ps, $cu, $cs, $n) = @t; + my($pt, $ct, $tt) = ($tr->cpu_p, $tr->cpu_c, $tr->cpu_a); + $f = $Default_Format unless defined $f; + # format a time in the required style, other formats may be added here + $style ||= $Default_Style; + return '' if $style eq 'none'; + $style = ($ct>0) ? 'all' : 'noc' if $style eq 'auto'; + my $s = "@t $style"; # default for unknown style + my $w = $hirestime ? "%2g" : "%2d"; + $s = sprintf("$w wallclock secs (%$f usr %$f sys + %$f cusr %$f csys = %$f CPU)", + $r,$pu,$ps,$cu,$cs,$tt) if $style eq 'all'; + $s = sprintf("$w wallclock secs (%$f usr + %$f sys = %$f CPU)", + $r,$pu,$ps,$pt) if $style eq 'noc'; + $s = sprintf("$w wallclock secs (%$f cusr + %$f csys = %$f CPU)", + $r,$cu,$cs,$ct) if $style eq 'nop'; + my $elapsed = $tr->elapsed($style); + $s .= sprintf(" @ %$f/s (n=$n)",$n/($elapsed)) if $n && $elapsed; + $s; +} + +sub timedebug { + my($msg, $t) = @_; + print STDERR "$msg",timestr($t),"\n" if $Debug; +} + +# --- Functions implementing low-level support for timing loops + +$_Usage{runloop} = <<'USAGE'; +usage: runloop($number, [$string | $coderef]) +USAGE + +sub runloop { + my($n, $c) = @_; + + $n+=0; # force numeric now, so garbage won't creep into the eval + croak "negative loopcount $n" if $n<0; + confess usage unless defined $c; + my($t0, $t1, $td); # before, after, difference + + # find package of caller so we can execute code there + my($curpack) = caller(0); + my($i, $pack)= 0; + while (($pack) = caller(++$i)) { + last if $pack ne $curpack; + } + + my ($subcode, $subref); + if (ref $c eq 'CODE') { + $subcode = "sub { for (1 .. $n) { local \$_; package $pack; &\$c; } }"; + $subref = eval $subcode; + } + else { + $subcode = "sub { for (1 .. $n) { local \$_; package $pack; $c;} }"; + $subref = _doeval($subcode); + } + croak "runloop unable to compile '$c': $@\ncode: $subcode\n" if $@; + print STDERR "runloop $n '$subcode'\n" if $Debug; + + # Wait for the user timer to tick. This makes the error range more like + # -0.01, +0. If we don't wait, then it's more like -0.01, +0.01. This + # may not seem important, but it significantly reduces the chances of + # getting a too low initial $n in the initial, 'find the minimum' loop + # in &countit. This, in turn, can reduce the number of calls to + # &runloop a lot, and thus reduce additive errors. + # + # Note that its possible for the act of reading the system clock to + # burn lots of system CPU while we burn very little user clock in the + # busy loop, which can cause the loop to run for a very long wall time. + # So gradually ramp up the duration of the loop. See RT #122003 + # + my $tbase = Benchmark->new(0)->[1]; + my $limit = 1; + while ( ( $t0 = Benchmark->new(0) )->[1] == $tbase ) { + for (my $i=0; $i < $limit; $i++) { my $x = $i / 1.5 } # burn user CPU + $limit *= 1.1; + } + $subref->(); + $t1 = Benchmark->new($n); + $td = &timediff($t1, $t0); + timedebug("runloop:",$td); + $td; +} + +$_Usage{timeit} = <<'USAGE'; +usage: $result = timeit($count, 'code' ); or + $result = timeit($count, sub { code } ); +USAGE + +sub timeit { + my($n, $code) = @_; + my($wn, $wc, $wd); + + die usage unless defined $code and + (!ref $code or ref $code eq 'CODE'); + + printf STDERR "timeit $n $code\n" if $Debug; + my $cache_key = $n . ( ref( $code ) ? 'c' : 's' ); + if ($Do_Cache && exists $Cache{$cache_key} ) { + $wn = $Cache{$cache_key}; + } else { + $wn = &runloop($n, ref( $code ) ? sub { } : '' ); + # Can't let our baseline have any iterations, or they get subtracted + # out of the result. + $wn->[5] = 0; + $Cache{$cache_key} = $wn; + } + + $wc = &runloop($n, $code); + + $wd = timediff($wc, $wn); + timedebug("timeit: ",$wc); + timedebug(" - ",$wn); + timedebug(" = ",$wd); + + $wd; +} + + +my $default_for = 3; +my $min_for = 0.1; + + +$_Usage{countit} = <<'USAGE'; +usage: $result = countit($time, 'code' ); or + $result = countit($time, sub { code } ); +USAGE + +sub countit { + my ( $tmax, $code ) = @_; + + die usage unless @_; + + if ( not defined $tmax or $tmax == 0 ) { + $tmax = $default_for; + } elsif ( $tmax < 0 ) { + $tmax = -$tmax; + } + + die "countit($tmax, ...): timelimit cannot be less than $min_for.\n" + if $tmax < $min_for; + + my ($n, $tc); + + # First find the minimum $n that gives a significant timing. + my $zeros=0; + for ($n = 1; ; $n *= 2 ) { + my $t0 = Benchmark->new(0); + my $td = timeit($n, $code); + my $t1 = Benchmark->new(0); + $tc = $td->[1] + $td->[2]; + if ( $tc <= 0 and $n > 1024 ) { + my $d = timediff($t1, $t0); + # note that $d is the total CPU time taken to call timeit(), + # while $tc is is difference in CPU secs between the empty run + # and the code run. If the code is trivial, its possible + # for $d to get large while $tc is still zero (or slightly + # negative). Bail out once timeit() starts taking more than a + # few seconds without noticeable difference. + if ($d->[1] + $d->[2] > 8 + || ++$zeros > 16) + { + die "Timing is consistently zero in estimation loop, cannot benchmark. N=$n\n"; + } + } else { + $zeros = 0; + } + last if $tc > 0.1; + } + + my $nmin = $n; + + # Get $n high enough that we can guess the final $n with some accuracy. + my $tpra = 0.1 * $tmax; # Target/time practice. + while ( $tc < $tpra ) { + # The 5% fudge is to keep us from iterating again all + # that often (this speeds overall responsiveness when $tmax is big + # and we guess a little low). This does not noticeably affect + # accuracy since we're not counting these times. + $n = int( $tpra * 1.05 * $n / $tc ); # Linear approximation. + my $td = timeit($n, $code); + my $new_tc = $td->[1] + $td->[2]; + # Make sure we are making progress. + $tc = $new_tc > 1.2 * $tc ? $new_tc : 1.2 * $tc; + } + + # Now, do the 'for real' timing(s), repeating until we exceed + # the max. + my $ntot = 0; + my $rtot = 0; + my $utot = 0.0; + my $stot = 0.0; + my $cutot = 0.0; + my $cstot = 0.0; + my $ttot = 0.0; + + # The 5% fudge is because $n is often a few % low even for routines + # with stable times and avoiding extra timeit()s is nice for + # accuracy's sake. + $n = int( $n * ( 1.05 * $tmax / $tc ) ); + $zeros=0; + while () { + my $td = timeit($n, $code); + $ntot += $n; + $rtot += $td->[0]; + $utot += $td->[1]; + $stot += $td->[2]; + $cutot += $td->[3]; + $cstot += $td->[4]; + $ttot = $utot + $stot; + last if $ttot >= $tmax; + if ( $ttot <= 0 ) { + ++$zeros > 16 + and die "Timing is consistently zero, cannot benchmark. N=$n\n"; + } else { + $zeros = 0; + } + $ttot = 0.01 if $ttot < 0.01; + my $r = $tmax / $ttot - 1; # Linear approximation. + $n = int( $r * $ntot ); + $n = $nmin if $n < $nmin; + } + + return bless [ $rtot, $utot, $stot, $cutot, $cstot, $ntot ]; +} + +# --- Functions implementing high-level time-then-print utilities + +sub n_to_for { + my $n = shift; + return $n == 0 ? $default_for : $n < 0 ? -$n : undef; +} + +$_Usage{timethis} = <<'USAGE'; +usage: $result = timethis($time, 'code' ); or + $result = timethis($time, sub { code } ); +USAGE + +sub timethis{ + my($n, $code, $title, $style) = @_; + my($t, $forn); + + die usage unless defined $code and + (!ref $code or ref $code eq 'CODE'); + + if ( $n > 0 ) { + croak "non-integer loopcount $n, stopped" if int($n)<$n; + $t = timeit($n, $code); + $title = "timethis $n" unless defined $title; + } else { + my $fort = n_to_for( $n ); + $t = countit( $fort, $code ); + $title = "timethis for $fort" unless defined $title; + $forn = $t->[-1]; + } + local $| = 1; + $style = "" unless defined $style; + printf("%10s: ", $title) unless $style eq 'none'; + print timestr($t, $style, $Default_Format),"\n" unless $style eq 'none'; + + $n = $forn if defined $forn; + + if ($t->elapsed($style) < 0) { + # due to clock granularity and variable CPU speed and load, + # on quick code with a small number of loops, it's possible for + # the empty loop to appear to take longer than the real loop + # (e.g. 1 tick versus 0 ticks). This leads to a negative elapsed + # time. In this case, floor it at zero, to stop bizarre results. + print " (warning: too few iterations for a reliable count)\n"; + $t->[$_] = 0 for 1..4; + } + + # A conservative warning to spot very silly tests. + # Don't assume that your benchmark is ok simply because + # you don't get this warning! + print " (warning: too few iterations for a reliable count)\n" + if $n < $Min_Count + || ($t->real < 1 && $n < 1000) + || $t->cpu_a < $Min_CPU; + $t; +} + + +$_Usage{timethese} = <<'USAGE'; +usage: timethese($count, { Name1 => 'code1', ... }); or + timethese($count, { Name1 => sub { code1 }, ... }); +USAGE + +sub timethese{ + my($n, $alt, $style) = @_; + die usage unless ref $alt eq 'HASH'; + + my @names = sort keys %$alt; + $style = "" unless defined $style; + print "Benchmark: " unless $style eq 'none'; + if ( $n > 0 ) { + croak "non-integer loopcount $n, stopped" if int($n)<$n; + print "timing $n iterations of" unless $style eq 'none'; + } else { + print "running" unless $style eq 'none'; + } + print " ", join(', ',@names) unless $style eq 'none'; + unless ( $n > 0 ) { + my $for = n_to_for( $n ); + print ", each" if $n > 1 && $style ne 'none'; + print " for at least $for CPU seconds" unless $style eq 'none'; + } + print "...\n" unless $style eq 'none'; + + # we could save the results in an array and produce a summary here + # sum, min, max, avg etc etc + my %results; + foreach my $name (@names) { + $results{$name} = timethis ($n, $alt -> {$name}, $name, $style); + } + + return \%results; +} + + +$_Usage{cmpthese} = <<'USAGE'; +usage: cmpthese($count, { Name1 => 'code1', ... }); or + cmpthese($count, { Name1 => sub { code1 }, ... }); or + cmpthese($result, $style); +USAGE + +sub cmpthese{ + my ($results, $style); + + # $count can be a blessed object. + if ( ref $_[0] eq 'HASH' ) { + ($results, $style) = @_; + } + else { + my($count, $code) = @_[0,1]; + $style = $_[2] if defined $_[2]; + + die usage unless ref $code eq 'HASH'; + + $results = timethese($count, $code, ($style || "none")); + } + + $style = "" unless defined $style; + + # Flatten in to an array of arrays with the name as the first field + my @vals = map{ [ $_, @{$results->{$_}} ] } keys %$results; + + for (@vals) { + # recreate the pre-flattened Benchmark object + my $tmp_bm = bless [ @{$_}[1..$#$_] ]; + my $elapsed = $tmp_bm->elapsed($style); + # The epsilon fudge here is to prevent div by 0. Since clock + # resolutions are much larger, it's below the noise floor. + my $rate = $_->[6]/(($elapsed)+0.000000000000001); + $_->[7] = $rate; + } + + # Sort by rate + @vals = sort { $a->[7] <=> $b->[7] } @vals; + + # If more than half of the rates are greater than one... + my $display_as_rate = @vals ? ($vals[$#vals>>1]->[7] > 1) : 0; + + my @rows; + my @col_widths; + + my @top_row = ( + '', + $display_as_rate ? 'Rate' : 's/iter', + map { $_->[0] } @vals + ); + + push @rows, \@top_row; + @col_widths = map { length( $_ ) } @top_row; + + # Build the data rows + # We leave the last column in even though it never has any data. Perhaps + # it should go away. Also, perhaps a style for a single column of + # percentages might be nice. + for my $row_val ( @vals ) { + my @row; + + # Column 0 = test name + push @row, $row_val->[0]; + $col_widths[0] = length( $row_val->[0] ) + if length( $row_val->[0] ) > $col_widths[0]; + + # Column 1 = performance + my $row_rate = $row_val->[7]; + + # We assume that we'll never get a 0 rate. + my $rate = $display_as_rate ? $row_rate : 1 / $row_rate; + + # Only give a few decimal places before switching to sci. notation, + # since the results aren't usually that accurate anyway. + my $format = + $rate >= 100 ? + "%0.0f" : + $rate >= 10 ? + "%0.1f" : + $rate >= 1 ? + "%0.2f" : + $rate >= 0.1 ? + "%0.3f" : + "%0.2e"; + + $format .= "/s" + if $display_as_rate; + + my $formatted_rate = sprintf( $format, $rate ); + push @row, $formatted_rate; + $col_widths[1] = length( $formatted_rate ) + if length( $formatted_rate ) > $col_widths[1]; + + # Columns 2..N = performance ratios + my $skip_rest = 0; + for ( my $col_num = 0 ; $col_num < @vals ; ++$col_num ) { + my $col_val = $vals[$col_num]; + my $out; + if ( $skip_rest ) { + $out = ''; + } + elsif ( $col_val->[0] eq $row_val->[0] ) { + $out = "--"; + # $skip_rest = 1; + } + else { + my $col_rate = $col_val->[7]; + $out = sprintf( "%.0f%%", 100*$row_rate/$col_rate - 100 ); + } + push @row, $out; + $col_widths[$col_num+2] = length( $out ) + if length( $out ) > $col_widths[$col_num+2]; + + # A little weirdness to set the first column width properly + $col_widths[$col_num+2] = length( $col_val->[0] ) + if length( $col_val->[0] ) > $col_widths[$col_num+2]; + } + push @rows, \@row; + } + + return \@rows if $style eq "none"; + + # Equalize column widths in the chart as much as possible without + # exceeding 80 characters. This does not use or affect cols 0 or 1. + my @sorted_width_refs = + sort { $$a <=> $$b } map { \$_ } @col_widths[2..$#col_widths]; + my $max_width = ${$sorted_width_refs[-1]}; + + my $total = @col_widths - 1 ; + for ( @col_widths ) { $total += $_ } + + STRETCHER: + while ( $total < 80 ) { + my $min_width = ${$sorted_width_refs[0]}; + last + if $min_width == $max_width; + for ( @sorted_width_refs ) { + last + if $$_ > $min_width; + ++$$_; + ++$total; + last STRETCHER + if $total >= 80; + } + } + + # Dump the output + my $format = join( ' ', map { "%${_}s" } @col_widths ) . "\n"; + substr( $format, 1, 0 ) = '-'; + for ( @rows ) { + printf $format, @$_; + } + + return \@rows ; +} + + +1; +package Carp; + +{ use 5.006; } +use strict; +use warnings; +BEGIN { + # Very old versions of warnings.pm load Carp. This can go wrong due + # to the circular dependency. If warnings is invoked before Carp, + # then warnings starts by loading Carp, then Carp (above) tries to + # invoke warnings, and gets nothing because warnings is in the process + # of loading and hasn't defined its import method yet. If we were + # only turning on warnings ("use warnings" above) this wouldn't be too + # bad, because Carp would just gets the state of the -w switch and so + # might not get some warnings that it wanted. The real problem is + # that we then want to turn off Unicode warnings, but "no warnings + # 'utf8'" won't be effective if we're in this circular-dependency + # situation. So, if warnings.pm is an affected version, we turn + # off all warnings ourselves by directly setting ${^WARNING_BITS}. + # On unaffected versions, we turn off just Unicode warnings, via + # the proper API. + if(!defined($warnings::VERSION) || eval($warnings::VERSION) < 1.06) { + ${^WARNING_BITS} = ""; + } else { + "warnings"->unimport("utf8"); + } +} + +sub _fetch_sub { # fetch sub without autovivifying + my($pack, $sub) = @_; + $pack .= '::'; + # only works with top-level packages + return unless exists($::{$pack}); + for ($::{$pack}) { + return unless ref \$_ eq 'GLOB' && *$_{HASH} && exists $$_{$sub}; + for ($$_{$sub}) { + return ref \$_ eq 'GLOB' ? *$_{CODE} : undef + } + } +} + +# UTF8_REGEXP_PROBLEM is a compile-time constant indicating whether Carp +# must avoid applying a regular expression to an upgraded (is_utf8) +# string. There are multiple problems, on different Perl versions, +# that require this to be avoided. All versions prior to 5.13.8 will +# load utf8_heavy.pl for the swash system, even if the regexp doesn't +# use character classes. Perl 5.6 and Perls [5.11.2, 5.13.11) exhibit +# specific problems when Carp is being invoked in the aftermath of a +# syntax error. +BEGIN { + if("$]" < 5.013011) { + *UTF8_REGEXP_PROBLEM = sub () { 1 }; + } else { + *UTF8_REGEXP_PROBLEM = sub () { 0 }; + } +} + +# is_utf8() is essentially the utf8::is_utf8() function, which indicates +# whether a string is represented in the upgraded form (using UTF-8 +# internally). As utf8::is_utf8() is only available from Perl 5.8 +# onwards, extra effort is required here to make it work on Perl 5.6. +BEGIN { + if(defined(my $sub = _fetch_sub utf8 => 'is_utf8')) { + *is_utf8 = $sub; + } else { + # black magic for perl 5.6 + *is_utf8 = sub { unpack("C", "\xaa".$_[0]) != 170 }; + } +} + +# The downgrade() function defined here is to be used for attempts to +# downgrade where it is acceptable to fail. It must be called with a +# second argument that is a true value. +BEGIN { + if(defined(my $sub = _fetch_sub utf8 => 'downgrade')) { + *downgrade = \&{"utf8::downgrade"}; + } else { + *downgrade = sub { + my $r = ""; + my $l = length($_[0]); + for(my $i = 0; $i != $l; $i++) { + my $o = ord(substr($_[0], $i, 1)); + return if $o > 255; + $r .= chr($o); + } + $_[0] = $r; + }; + } +} + +# is_safe_printable_codepoint() indicates whether a character, specified +# by integer codepoint, is OK to output literally in a trace. Generally +# this is if it is a printable character in the ancestral character set +# (ASCII or EBCDIC). This is used on some Perls in situations where a +# regexp can't be used. +BEGIN { + *is_safe_printable_codepoint = + "$]" >= 5.007_003 ? + eval(q(sub ($) { + my $u = utf8::native_to_unicode($_[0]); + $u >= 0x20 && $u <= 0x7e; + })) + : ord("A") == 65 ? + sub ($) { $_[0] >= 0x20 && $_[0] <= 0x7e } + : + sub ($) { + # Early EBCDIC + # 3 EBCDIC code pages supported then; all controls but one + # are the code points below SPACE. The other one is 0x5F on + # POSIX-BC; FF on the other two. + # FIXME: there are plenty of unprintable codepoints other + # than those that this code and the comment above identifies + # as "controls". + $_[0] >= ord(" ") && $_[0] <= 0xff && + $_[0] != (ord ("^") == 106 ? 0x5f : 0xff); + } + ; +} + +sub _univ_mod_loaded { + return 0 unless exists($::{"UNIVERSAL::"}); + for ($::{"UNIVERSAL::"}) { + return 0 unless ref \$_ eq "GLOB" && *$_{HASH} && exists $$_{"$_[0]::"}; + for ($$_{"$_[0]::"}) { + return 0 unless ref \$_ eq "GLOB" && *$_{HASH} && exists $$_{"VERSION"}; + for ($$_{"VERSION"}) { + return 0 unless ref \$_ eq "GLOB"; + return ${*$_{SCALAR}}; + } + } + } +} + +# _maybe_isa() is usually the UNIVERSAL::isa function. We have to avoid +# the latter if the UNIVERSAL::isa module has been loaded, to avoid infi- +# nite recursion; in that case _maybe_isa simply returns true. +my $isa; +BEGIN { + if (_univ_mod_loaded('isa')) { + *_maybe_isa = sub { 1 } + } + else { + # Since we have already done the check, record $isa for use below + # when defining _StrVal. + *_maybe_isa = $isa = _fetch_sub(UNIVERSAL => "isa"); + } +} + + +# We need an overload::StrVal or equivalent function, but we must avoid +# loading any modules on demand, as Carp is used from __DIE__ handlers and +# may be invoked after a syntax error. +# We can copy recent implementations of overload::StrVal and use +# overloading.pm, which is the fastest implementation, so long as +# overloading is available. If it is not available, we use our own pure- +# Perl StrVal. We never actually use overload::StrVal, for various rea- +# sons described below. +# overload versions are as follows: +# undef-1.00 (up to perl 5.8.0) uses bless (avoid!) +# 1.01-1.17 (perl 5.8.1 to 5.14) uses Scalar::Util +# 1.18+ (perl 5.16+) uses overloading +# The ancient 'bless' implementation (that inspires our pure-Perl version) +# blesses unblessed references and must be avoided. Those using +# Scalar::Util use refaddr, possibly the pure-Perl implementation, which +# has the same blessing bug, and must be avoided. Also, Scalar::Util is +# loaded on demand. Since we avoid the Scalar::Util implementations, we +# end up having to implement our own overloading.pm-based version for perl +# 5.10.1 to 5.14. Since it also works just as well in more recent ver- +# sions, we use it there, too. +BEGIN { + if (eval { require "overloading.pm" }) { + *_StrVal = eval 'sub { no overloading; "$_[0]" }' + } + else { + # Work around the UNIVERSAL::can/isa modules to avoid recursion. + + # _mycan is either UNIVERSAL::can, or, in the presence of an + # override, overload::mycan. + *_mycan = _univ_mod_loaded('can') + ? do { require "overload.pm"; _fetch_sub overload => 'mycan' } + : \&UNIVERSAL::can; + + # _blessed is either UNIVERAL::isa(...), or, in the presence of an + # override, a hideous, but fairly reliable, workaround. + *_blessed = $isa + ? sub { &$isa($_[0], "UNIVERSAL") } + : sub { + my $probe = "UNIVERSAL::Carp_probe_" . rand; + no strict 'refs'; + local *$probe = sub { "unlikely string" }; + local $@; + local $SIG{__DIE__} = sub{}; + (eval { $_[0]->$probe } || '') eq 'unlikely string' + }; + + *_StrVal = sub { + my $pack = ref $_[0]; + # Perl's overload mechanism uses the presence of a special + # "method" named "((" or "()" to signal it is in effect. + # This test seeks to see if it has been set up. "((" post- + # dates overloading.pm, so we can skip it. + return "$_[0]" unless _mycan($pack, "()"); + # Even at this point, the invocant may not be blessed, so + # check for that. + return "$_[0]" if not _blessed($_[0]); + bless $_[0], "Carp"; + my $str = "$_[0]"; + bless $_[0], $pack; + $pack . substr $str, index $str, "="; + } + } +} + + +our $VERSION = '1.50'; +$VERSION =~ tr/_//d; + +our $MaxEvalLen = 0; +our $Verbose = 0; +our $CarpLevel = 0; +our $MaxArgLen = 64; # How much of each argument to print. 0 = all. +our $MaxArgNums = 8; # How many arguments to print. 0 = all. +our $RefArgFormatter = undef; # allow caller to format reference arguments + +require Exporter; +our @ISA = ('Exporter'); +our @EXPORT = qw(confess croak carp); +our @EXPORT_OK = qw(cluck verbose longmess shortmess); +our @EXPORT_FAIL = qw(verbose); # hook to enable verbose mode + +# The members of %Internal are packages that are internal to perl. +# Carp will not report errors from within these packages if it +# can. The members of %CarpInternal are internal to Perl's warning +# system. Carp will not report errors from within these packages +# either, and will not report calls *to* these packages for carp and +# croak. They replace $CarpLevel, which is deprecated. The +# $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval +# text and function arguments should be formatted when printed. + +our %CarpInternal; +our %Internal; + +# disable these by default, so they can live w/o require Carp +$CarpInternal{Carp}++; +$CarpInternal{warnings}++; +$Internal{Exporter}++; +$Internal{'Exporter::Heavy'}++; + +# if the caller specifies verbose usage ("perl -MCarp=verbose script.pl") +# then the following method will be called by the Exporter which knows +# to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word +# 'verbose'. + +sub export_fail { shift; $Verbose = shift if $_[0] eq 'verbose'; @_ } + +sub _cgc { + no strict 'refs'; + return \&{"CORE::GLOBAL::caller"} if defined &{"CORE::GLOBAL::caller"}; + return; +} + +sub longmess { + local($!, $^E); + # Icky backwards compatibility wrapper. :-( + # + # The story is that the original implementation hard-coded the + # number of call levels to go back, so calls to longmess were off + # by one. Other code began calling longmess and expecting this + # behaviour, so the replacement has to emulate that behaviour. + my $cgc = _cgc(); + my $call_pack = $cgc ? $cgc->() : caller(); + if ( $Internal{$call_pack} or $CarpInternal{$call_pack} ) { + return longmess_heavy(@_); + } + else { + local $CarpLevel = $CarpLevel + 1; + return longmess_heavy(@_); + } +} + +our @CARP_NOT; + +sub shortmess { + local($!, $^E); + my $cgc = _cgc(); + + # Icky backwards compatibility wrapper. :-( + local @CARP_NOT = $cgc ? $cgc->() : caller(); + shortmess_heavy(@_); +} + +sub croak { die shortmess @_ } +sub confess { die longmess @_ } +sub carp { warn shortmess @_ } +sub cluck { warn longmess @_ } + +BEGIN { + if("$]" >= 5.015002 || ("$]" >= 5.014002 && "$]" < 5.015) || + ("$]" >= 5.012005 && "$]" < 5.013)) { + *CALLER_OVERRIDE_CHECK_OK = sub () { 1 }; + } else { + *CALLER_OVERRIDE_CHECK_OK = sub () { 0 }; + } +} + +sub caller_info { + my $i = shift(@_) + 1; + my %call_info; + my $cgc = _cgc(); + { + # Some things override caller() but forget to implement the + # @DB::args part of it, which we need. We check for this by + # pre-populating @DB::args with a sentinel which no-one else + # has the address of, so that we can detect whether @DB::args + # has been properly populated. However, on earlier versions + # of perl this check tickles a bug in CORE::caller() which + # leaks memory. So we only check on fixed perls. + @DB::args = \$i if CALLER_OVERRIDE_CHECK_OK; + package DB; + @call_info{ + qw(pack file line sub has_args wantarray evaltext is_require) } + = $cgc ? $cgc->($i) : caller($i); + } + + unless ( defined $call_info{file} ) { + return (); + } + + my $sub_name = Carp::get_subname( \%call_info ); + if ( $call_info{has_args} ) { + # Guard our serialization of the stack from stack refcounting bugs + # NOTE this is NOT a complete solution, we cannot 100% guard against + # these bugs. However in many cases Perl *is* capable of detecting + # them and throws an error when it does. Unfortunately serializing + # the arguments on the stack is a perfect way of finding these bugs, + # even when they would not affect normal program flow that did not + # poke around inside the stack. Inside of Carp.pm it makes little + # sense reporting these bugs, as Carp's job is to report the callers + # errors, not the ones it might happen to tickle while doing so. + # See: https://rt.perl.org/Public/Bug/Display.html?id=131046 + # and: https://rt.perl.org/Public/Bug/Display.html?id=52610 + # for more details and discussion. - Yves + my @args = map { + my $arg; + local $@= $@; + eval { + $arg = $_; + 1; + } or do { + $arg = '** argument not available anymore **'; + }; + $arg; + } @DB::args; + if (CALLER_OVERRIDE_CHECK_OK && @args == 1 + && ref $args[0] eq ref \$i + && $args[0] == \$i ) { + @args = (); # Don't let anyone see the address of $i + local $@; + my $where = eval { + my $func = $cgc or return ''; + my $gv = + (_fetch_sub B => 'svref_2object' or return '') + ->($func)->GV; + my $package = $gv->STASH->NAME; + my $subname = $gv->NAME; + return unless defined $package && defined $subname; + + # returning CORE::GLOBAL::caller isn't useful for tracing the cause: + return if $package eq 'CORE::GLOBAL' && $subname eq 'caller'; + " in &${package}::$subname"; + } || ''; + @args + = "** Incomplete caller override detected$where; \@DB::args were not set **"; + } + else { + my $overflow; + if ( $MaxArgNums and @args > $MaxArgNums ) + { # More than we want to show? + $#args = $MaxArgNums - 1; + $overflow = 1; + } + + @args = map { Carp::format_arg($_) } @args; + + if ($overflow) { + push @args, '...'; + } + } + + # Push the args onto the subroutine + $sub_name .= '(' . join( ', ', @args ) . ')'; + } + $call_info{sub_name} = $sub_name; + return wantarray() ? %call_info : \%call_info; +} + +# Transform an argument to a function into a string. +our $in_recurse; +sub format_arg { + my $arg = shift; + + if ( my $pack= ref($arg) ) { + + # legitimate, let's not leak it. + if (!$in_recurse && _maybe_isa( $arg, 'UNIVERSAL' ) && + do { + local $@; + local $in_recurse = 1; + local $SIG{__DIE__} = sub{}; + eval {$arg->can('CARP_TRACE') } + }) + { + return $arg->CARP_TRACE(); + } + elsif (!$in_recurse && + defined($RefArgFormatter) && + do { + local $@; + local $in_recurse = 1; + local $SIG{__DIE__} = sub{}; + eval {$arg = $RefArgFormatter->($arg); 1} + }) + { + return $arg; + } + else + { + # Argument may be blessed into a class with overloading, and so + # might have an overloaded stringification. We don't want to + # risk getting the overloaded stringification, so we need to + # use _StrVal, our overload::StrVal()-equivalent. + return _StrVal $arg; + } + } + return "undef" if !defined($arg); + downgrade($arg, 1); + return $arg if !(UTF8_REGEXP_PROBLEM && is_utf8($arg)) && + $arg =~ /\A-?[0-9]+(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?\z/; + my $suffix = ""; + if ( 2 < $MaxArgLen and $MaxArgLen < length($arg) ) { + substr ( $arg, $MaxArgLen - 3 ) = ""; + $suffix = "..."; + } + if(UTF8_REGEXP_PROBLEM && is_utf8($arg)) { + for(my $i = length($arg); $i--; ) { + my $c = substr($arg, $i, 1); + my $x = substr($arg, 0, 0); # work around bug on Perl 5.8.{1,2} + if($c eq "\"" || $c eq "\\" || $c eq "\$" || $c eq "\@") { + substr $arg, $i, 0, "\\"; + next; + } + my $o = ord($c); + substr $arg, $i, 1, sprintf("\\x{%x}", $o) + unless is_safe_printable_codepoint($o); + } + } else { + $arg =~ s/([\"\\\$\@])/\\$1/g; + # This is all the ASCII printables spelled-out. It is portable to all + # Perl versions and platforms (such as EBCDIC). There are other more + # compact ways to do this, but may not work everywhere every version. + $arg =~ s/([^ !"#\$\%\&'()*+,\-.\/0123456789:;<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz\{|}~])/sprintf("\\x{%x}",ord($1))/eg; + } + downgrade($arg, 1); + return "\"".$arg."\"".$suffix; +} + +sub Regexp::CARP_TRACE { + my $arg = "$_[0]"; + downgrade($arg, 1); + if(UTF8_REGEXP_PROBLEM && is_utf8($arg)) { + for(my $i = length($arg); $i--; ) { + my $o = ord(substr($arg, $i, 1)); + my $x = substr($arg, 0, 0); # work around bug on Perl 5.8.{1,2} + substr $arg, $i, 1, sprintf("\\x{%x}", $o) + unless is_safe_printable_codepoint($o); + } + } else { + # See comment in format_arg() about this same regex. + $arg =~ s/([^ !"#\$\%\&'()*+,\-.\/0123456789:;<=>?\@ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\\\]^_`abcdefghijklmnopqrstuvwxyz\{|}~])/sprintf("\\x{%x}",ord($1))/eg; + } + downgrade($arg, 1); + my $suffix = ""; + if($arg =~ /\A\(\?\^?([a-z]*)(?:-[a-z]*)?:(.*)\)\z/s) { + ($suffix, $arg) = ($1, $2); + } + if ( 2 < $MaxArgLen and $MaxArgLen < length($arg) ) { + substr ( $arg, $MaxArgLen - 3 ) = ""; + $suffix = "...".$suffix; + } + return "qr($arg)$suffix"; +} + +# Takes an inheritance cache and a package and returns +# an anon hash of known inheritances and anon array of +# inheritances which consequences have not been figured +# for. +sub get_status { + my $cache = shift; + my $pkg = shift; + $cache->{$pkg} ||= [ { $pkg => $pkg }, [ trusts_directly($pkg) ] ]; + return @{ $cache->{$pkg} }; +} + +# Takes the info from caller() and figures out the name of +# the sub/require/eval +sub get_subname { + my $info = shift; + if ( defined( $info->{evaltext} ) ) { + my $eval = $info->{evaltext}; + if ( $info->{is_require} ) { + return "require $eval"; + } + else { + $eval =~ s/([\\\'])/\\$1/g; + return "eval '" . str_len_trim( $eval, $MaxEvalLen ) . "'"; + } + } + + # this can happen on older perls when the sub (or the stash containing it) + # has been deleted + if ( !defined( $info->{sub} ) ) { + return '__ANON__::__ANON__'; + } + + return ( $info->{sub} eq '(eval)' ) ? 'eval {...}' : $info->{sub}; +} + +# Figures out what call (from the point of view of the caller) +# the long error backtrace should start at. +sub long_error_loc { + my $i; + my $lvl = $CarpLevel; + { + ++$i; + my $cgc = _cgc(); + my @caller = $cgc ? $cgc->($i) : caller($i); + my $pkg = $caller[0]; + unless ( defined($pkg) ) { + + # This *shouldn't* happen. + if (%Internal) { + local %Internal; + $i = long_error_loc(); + last; + } + elsif (defined $caller[2]) { + # this can happen when the stash has been deleted + # in that case, just assume that it's a reasonable place to + # stop (the file and line data will still be intact in any + # case) - the only issue is that we can't detect if the + # deleted package was internal (so don't do that then) + # -doy + redo unless 0 > --$lvl; + last; + } + else { + return 2; + } + } + redo if $CarpInternal{$pkg}; + redo unless 0 > --$lvl; + redo if $Internal{$pkg}; + } + return $i - 1; +} + +sub longmess_heavy { + if ( ref( $_[0] ) ) { # don't break references as exceptions + return wantarray ? @_ : $_[0]; + } + my $i = long_error_loc(); + return ret_backtrace( $i, @_ ); +} + +BEGIN { + if("$]" >= 5.017004) { + # The LAST_FH constant is a reference to the variable. + $Carp::{LAST_FH} = \eval '\${^LAST_FH}'; + } else { + eval '*LAST_FH = sub () { 0 }'; + } +} + +# Returns a full stack backtrace starting from where it is +# told. +sub ret_backtrace { + my ( $i, @error ) = @_; + my $mess; + my $err = join '', @error; + $i++; + + my $tid_msg = ''; + if ( defined &threads::tid ) { + my $tid = threads->tid; + $tid_msg = " thread $tid" if $tid; + } + + my %i = caller_info($i); + $mess = "$err at $i{file} line $i{line}$tid_msg"; + if( $. ) { + # Use ${^LAST_FH} if available. + if (LAST_FH) { + if (${+LAST_FH}) { + $mess .= sprintf ", <%s> %s %d", + *${+LAST_FH}{NAME}, + ($/ eq "\n" ? "line" : "chunk"), $. + } + } + else { + local $@ = ''; + local $SIG{__DIE__}; + eval { + CORE::die; + }; + if($@ =~ /^Died at .*(, <.*?> (?:line|chunk) \d+).$/ ) { + $mess .= $1; + } + } + } + $mess .= "\.\n"; + + while ( my %i = caller_info( ++$i ) ) { + $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n"; + } + + return $mess; +} + +sub ret_summary { + my ( $i, @error ) = @_; + my $err = join '', @error; + $i++; + + my $tid_msg = ''; + if ( defined &threads::tid ) { + my $tid = threads->tid; + $tid_msg = " thread $tid" if $tid; + } + + my %i = caller_info($i); + return "$err at $i{file} line $i{line}$tid_msg\.\n"; +} + +sub short_error_loc { + # You have to create your (hash)ref out here, rather than defaulting it + # inside trusts *on a lexical*, as you want it to persist across calls. + # (You can default it on $_[2], but that gets messy) + my $cache = {}; + my $i = 1; + my $lvl = $CarpLevel; + { + my $cgc = _cgc(); + my $called = $cgc ? $cgc->($i) : caller($i); + $i++; + my $caller = $cgc ? $cgc->($i) : caller($i); + + if (!defined($caller)) { + my @caller = $cgc ? $cgc->($i) : caller($i); + if (@caller) { + # if there's no package but there is other caller info, then + # the package has been deleted - treat this as a valid package + # in this case + redo if defined($called) && $CarpInternal{$called}; + redo unless 0 > --$lvl; + last; + } + else { + return 0; + } + } + redo if $Internal{$caller}; + redo if $CarpInternal{$caller}; + redo if $CarpInternal{$called}; + redo if trusts( $called, $caller, $cache ); + redo if trusts( $caller, $called, $cache ); + redo unless 0 > --$lvl; + } + return $i - 1; +} + +sub shortmess_heavy { + return longmess_heavy(@_) if $Verbose; + return @_ if ref( $_[0] ); # don't break references as exceptions + my $i = short_error_loc(); + if ($i) { + ret_summary( $i, @_ ); + } + else { + longmess_heavy(@_); + } +} + +# If a string is too long, trims it with ... +sub str_len_trim { + my $str = shift; + my $max = shift || 0; + if ( 2 < $max and $max < length($str) ) { + substr( $str, $max - 3 ) = '...'; + } + return $str; +} + +# Takes two packages and an optional cache. Says whether the +# first inherits from the second. +# +# Recursive versions of this have to work to avoid certain +# possible endless loops, and when following long chains of +# inheritance are less efficient. +sub trusts { + my $child = shift; + my $parent = shift; + my $cache = shift; + my ( $known, $partial ) = get_status( $cache, $child ); + + # Figure out consequences until we have an answer + while ( @$partial and not exists $known->{$parent} ) { + my $anc = shift @$partial; + next if exists $known->{$anc}; + $known->{$anc}++; + my ( $anc_knows, $anc_partial ) = get_status( $cache, $anc ); + my @found = keys %$anc_knows; + @$known{@found} = (); + push @$partial, @$anc_partial; + } + return exists $known->{$parent}; +} + +# Takes a package and gives a list of those trusted directly +sub trusts_directly { + my $class = shift; + no strict 'refs'; + my $stash = \%{"$class\::"}; + for my $var (qw/ CARP_NOT ISA /) { + # Don't try using the variable until we know it exists, + # to avoid polluting the caller's namespace. + if ( $stash->{$var} && ref \$stash->{$var} eq 'GLOB' + && *{$stash->{$var}}{ARRAY} && @{$stash->{$var}} ) { + return @{$stash->{$var}} + } + } + return; +} + +if(!defined($warnings::VERSION) || + do { no warnings "numeric"; $warnings::VERSION < 1.03 }) { + # Very old versions of warnings.pm import from Carp. This can go + # wrong due to the circular dependency. If Carp is invoked before + # warnings, then Carp starts by loading warnings, then warnings + # tries to import from Carp, and gets nothing because Carp is in + # the process of loading and hasn't defined its import method yet. + # So we work around that by manually exporting to warnings here. + no strict "refs"; + *{"warnings::$_"} = \&$_ foreach @EXPORT; +} + +1; + +__END__ + +# +# Documentation is at the __END__ +# + +package DB; + +# "private" globals + +my ($running, $ready, $deep, $usrctxt, $evalarg, + @stack, @saved, @skippkg, @clients); +my $preeval = {}; +my $posteval = {}; +my $ineval = {}; + +#### +# +# Globals - must be defined at startup so that clients can refer to +# them right after a C +# +#### + +BEGIN { + + # these are hardcoded in perl source (some are magical) + + $DB::sub = ''; # name of current subroutine + %DB::sub = (); # "filename:fromline-toline" for every known sub + $DB::single = 0; # single-step flag (set it to 1 to enable stops in BEGIN/use) + $DB::signal = 0; # signal flag (will cause a stop at the next line) + $DB::trace = 0; # are we tracing through subroutine calls? + @DB::args = (); # arguments of current subroutine or @ARGV array + @DB::dbline = (); # list of lines in currently loaded file + %DB::dbline = (); # actions in current file (keyed by line number) + @DB::ret = (); # return value of last sub executed in list context + $DB::ret = ''; # return value of last sub executed in scalar context + + # other "public" globals + + $DB::package = ''; # current package space + $DB::filename = ''; # current filename + $DB::subname = ''; # currently executing sub (fully qualified name) + $DB::lineno = ''; # current line number + + $DB::VERSION = $DB::VERSION = '1.08'; + + # initialize private globals to avoid warnings + + $running = 1; # are we running, or are we stopped? + @stack = (0); + @clients = (); + $deep = 1000; + $ready = 0; + @saved = (); + @skippkg = (); + $usrctxt = ''; + $evalarg = ''; +} + +#### +# entry point for all subroutine calls +# +sub sub { + push(@stack, $DB::single); + $DB::single &= 1; + $DB::single |= 4 if $#stack == $deep; + if ($DB::sub eq 'DESTROY' or substr($DB::sub, -9) eq '::DESTROY' or not defined wantarray) { + &$DB::sub; + $DB::single |= pop(@stack); + $DB::ret = undef; + } + elsif (wantarray) { + @DB::ret = &$DB::sub; + $DB::single |= pop(@stack); + @DB::ret; + } + else { + $DB::ret = &$DB::sub; + $DB::single |= pop(@stack); + $DB::ret; + } +} + +#### +# this is called by perl for every statement +# +sub DB { + return unless $ready; + &save; + ($DB::package, $DB::filename, $DB::lineno) = caller; + + return if @skippkg and grep { $_ eq $DB::package } @skippkg; + + $usrctxt = "package $DB::package;"; # this won't let them modify, alas + local(*DB::dbline) = "::_<$DB::filename"; + + my ($stop, $action); + if (($stop,$action) = split(/\0/,$DB::dbline{$DB::lineno})) { + if ($stop eq '1') { + $DB::signal |= 1; + } + else { + $stop = 0 unless $stop; # avoid un_init warning + $evalarg = "\$DB::signal |= do { $stop; }"; &eval; + $DB::dbline{$DB::lineno} =~ s/;9($|\0)/$1/; # clear any temp breakpt + } + } + if ($DB::single || $DB::trace || $DB::signal) { + $DB::subname = ($DB::sub =~ /\'|::/) ? $DB::sub : "${DB::package}::$DB::sub"; #'; + DB->loadfile($DB::filename, $DB::lineno); + } + $evalarg = $action, &eval if $action; + if ($DB::single || $DB::signal) { + _outputall($#stack . " levels deep in subroutine calls.\n") if $DB::single & 4; + $DB::single = 0; + $DB::signal = 0; + $running = 0; + + &eval if ($evalarg = DB->prestop); + my $c; + for $c (@clients) { + # perform any client-specific prestop actions + &eval if ($evalarg = $c->cprestop); + + # Now sit in an event loop until something sets $running + do { + $c->idle; # call client event loop; must not block + if ($running == 2) { # client wants something eval-ed + &eval if ($evalarg = $c->evalcode); + $running = 0; + } + } until $running; + + # perform any client-specific poststop actions + &eval if ($evalarg = $c->cpoststop); + } + &eval if ($evalarg = DB->poststop); + } + ($@, $!, $,, $/, $\, $^W) = @saved; + (); +} + +#### +# this takes its argument via $evalarg to preserve current @_ +# +sub eval { + ($@, $!, $,, $/, $\, $^W) = @saved; + eval "$usrctxt $evalarg; &DB::save"; + _outputall($@) if $@; +} + +############################################################################### +# no compile-time subroutine call allowed before this point # +############################################################################### + +use strict; # this can run only after DB() and sub() are defined + +sub save { + @saved = ($@, $!, $,, $/, $\, $^W); + $, = ""; $/ = "\n"; $\ = ""; $^W = 0; +} + +sub catch { + for (@clients) { $_->awaken; } + $DB::signal = 1; + $ready = 1; +} + +#### +# +# Client callable (read inheritable) methods defined after this point +# +#### + +sub register { + my $s = shift; + $s = _clientname($s) if ref($s); + push @clients, $s; +} + +sub done { + my $s = shift; + $s = _clientname($s) if ref($s); + @clients = grep {$_ ne $s} @clients; + $s->cleanup; +# $running = 3 unless @clients; + exit(0) unless @clients; +} + +sub _clientname { + my $name = shift; + "$name" =~ /^(.+)=[A-Z]+\(.+\)$/; + return $1; +} + +sub next { + my $s = shift; + $DB::single = 2; + $running = 1; +} + +sub step { + my $s = shift; + $DB::single = 1; + $running = 1; +} + +sub cont { + my $s = shift; + my $i = shift; + $s->set_tbreak($i) if $i; + for ($i = 0; $i <= $#stack;) { + $stack[$i++] &= ~1; + } + $DB::single = 0; + $running = 1; +} + +#### +# XXX caller must experimentally determine $i (since it depends +# on how many client call frames are between this call and the DB call). +# Such is life. +# +sub ret { + my $s = shift; + my $i = shift; # how many levels to get to DB sub + $i = 0 unless defined $i; + $stack[$#stack-$i] |= 1; + $DB::single = 0; + $running = 1; +} + +#### +# XXX caller must experimentally determine $start (since it depends +# on how many client call frames are between this call and the DB call). +# Such is life. +# +sub backtrace { + my $self = shift; + my $start = shift; + my($p,$f,$l,$s,$h,$w,$e,$r,$a, @a, @ret,$i); + $start = 1 unless $start; + for ($i = $start; ($p,$f,$l,$s,$h,$w,$e,$r) = caller($i); $i++) { + @a = @DB::args; + for (@a) { + s/'/\\'/g; + s/([^\0]*)/'$1'/ unless /^-?[\d.]+$/; + require 'meta_notation.pm'; + $_ = _meta_notation($_) if /[[:^print:]]/a; + } + $w = $w ? '@ = ' : '$ = '; + $a = $h ? '(' . join(', ', @a) . ')' : ''; + $e =~ s/\n\s*\;\s*\Z// if $e; + $e =~ s/[\\\']/\\$1/g if $e; + if ($r) { + $s = "require '$e'"; + } elsif (defined $r) { + $s = "eval '$e'"; + } elsif ($s eq '(eval)') { + $s = "eval {...}"; + } + $f = "file '$f'" unless $f eq '-e'; + push @ret, "$w&$s$a from $f line $l"; + last if $DB::signal; + } + return @ret; +} + +sub _outputall { + my $c; + for $c (@clients) { + $c->output(@_); + } +} + +sub trace_toggle { + my $s = shift; + $DB::trace = !$DB::trace; +} + + +#### +# without args: returns all defined subroutine names +# with subname args: returns a listref [file, start, end] +# +sub subs { + my $s = shift; + if (@_) { + my(@ret) = (); + while (@_) { + my $name = shift; + push @ret, [$DB::sub{$name} =~ /^(.*)\:(\d+)-(\d+)$/] + if exists $DB::sub{$name}; + } + return @ret; + } + return keys %DB::sub; +} + +#### +# first argument is a filename whose subs will be returned +# if a filename is not supplied, all subs in the current +# filename are returned. +# +sub filesubs { + my $s = shift; + my $fname = shift; + $fname = $DB::filename unless $fname; + return grep { $DB::sub{$_} =~ /^$fname/ } keys %DB::sub; +} + +#### +# returns a list of all filenames that DB knows about +# +sub files { + my $s = shift; + my(@f) = grep(m|^_<|, keys %main::); + return map { substr($_,2) } @f; +} + +#### +# returns reference to an array holding the lines in currently +# loaded file +# +sub lines { + my $s = shift; + return \@DB::dbline; +} + +#### +# loadfile($file, $line) +# +sub loadfile { + my $s = shift; + my($file, $line) = @_; + if (!defined $main::{'_<' . $file}) { + my $try; + if (($try) = grep(m|^_<.*$file|, keys %main::)) { + $file = substr($try,2); + } + } + if (defined($main::{'_<' . $file})) { + my $c; +# _outputall("Loading file $file.."); + *DB::dbline = "::_<$file"; + $DB::filename = $file; + for $c (@clients) { +# print "2 ", $file, '|', $line, "\n"; + $c->showfile($file, $line); + } + return $file; + } + return undef; +} + +sub lineevents { + my $s = shift; + my $fname = shift; + my(%ret) = (); + my $i; + $fname = $DB::filename unless $fname; + local(*DB::dbline) = "::_<$fname"; + for ($i = 1; $i <= $#DB::dbline; $i++) { + $ret{$i} = [$DB::dbline[$i], split(/\0/, $DB::dbline{$i})] + if defined $DB::dbline{$i}; + } + return %ret; +} + +sub set_break { + my $s = shift; + my $i = shift; + my $cond = shift; + $i ||= $DB::lineno; + $cond ||= '1'; + $i = _find_subline($i) if ($i =~ /\D/); + $s->output("Subroutine not found.\n") unless $i; + if ($i) { + if ($DB::dbline[$i] == 0) { + $s->output("Line $i not breakable.\n"); + } + else { + $DB::dbline{$i} =~ s/^[^\0]*/$cond/; + } + } +} + +sub set_tbreak { + my $s = shift; + my $i = shift; + $i = _find_subline($i) if ($i =~ /\D/); + $s->output("Subroutine not found.\n") unless $i; + if ($i) { + if ($DB::dbline[$i] == 0) { + $s->output("Line $i not breakable.\n"); + } + else { + $DB::dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p. + } + } +} + +sub _find_subline { + my $name = shift; + $name =~ s/\'/::/; + $name = "${DB::package}\:\:" . $name if $name !~ /::/; + $name = "main" . $name if substr($name,0,2) eq "::"; + my($fname, $from, $to) = ($DB::sub{$name} =~ /^(.*):(\d+)-(\d+)$/); + if ($from) { + local *DB::dbline = "::_<$fname"; + ++$from while $DB::dbline[$from] == 0 && $from < $to; + return $from; + } + return undef; +} + +sub clr_breaks { + my $s = shift; + my $i; + if (@_) { + while (@_) { + $i = shift; + $i = _find_subline($i) if ($i =~ /\D/); + $s->output("Subroutine not found.\n") unless $i; + if (defined $DB::dbline{$i}) { + $DB::dbline{$i} =~ s/^[^\0]+//; + if ($DB::dbline{$i} =~ s/^\0?$//) { + delete $DB::dbline{$i}; + } + } + } + } + else { + for ($i = 1; $i <= $#DB::dbline ; $i++) { + if (defined $DB::dbline{$i}) { + $DB::dbline{$i} =~ s/^[^\0]+//; + if ($DB::dbline{$i} =~ s/^\0?$//) { + delete $DB::dbline{$i}; + } + } + } + } +} + +sub set_action { + my $s = shift; + my $i = shift; + my $act = shift; + $i = _find_subline($i) if ($i =~ /\D/); + $s->output("Subroutine not found.\n") unless $i; + if ($i) { + if ($DB::dbline[$i] == 0) { + $s->output("Line $i not actionable.\n"); + } + else { + $DB::dbline{$i} =~ s/\0[^\0]*//; + $DB::dbline{$i} .= "\0" . $act; + } + } +} + +sub clr_actions { + my $s = shift; + my $i; + if (@_) { + while (@_) { + my $i = shift; + $i = _find_subline($i) if ($i =~ /\D/); + $s->output("Subroutine not found.\n") unless $i; + if ($i && $DB::dbline[$i] != 0) { + $DB::dbline{$i} =~ s/\0[^\0]*//; + delete $DB::dbline{$i} if $DB::dbline{$i} =~ s/^\0?$//; + } + } + } + else { + for ($i = 1; $i <= $#DB::dbline ; $i++) { + if (defined $DB::dbline{$i}) { + $DB::dbline{$i} =~ s/\0[^\0]*//; + delete $DB::dbline{$i} if $DB::dbline{$i} =~ s/^\0?$//; + } + } + } +} + +sub prestop { + my ($client, $val) = @_; + return defined($val) ? $preeval->{$client} = $val : $preeval->{$client}; +} + +sub poststop { + my ($client, $val) = @_; + return defined($val) ? $posteval->{$client} = $val : $posteval->{$client}; +} + +# +# "pure virtual" methods +# + +# client-specific pre/post-stop actions. +sub cprestop {} +sub cpoststop {} + +# client complete startup +sub awaken {} + +sub skippkg { + my $s = shift; + push @skippkg, @_ if @_; +} + +sub evalcode { + my ($client, $val) = @_; + if (defined $val) { + $running = 2; # hand over to DB() to evaluate in its context + $ineval->{$client} = $val; + } + return $ineval->{$client}; +} + +sub ready { + my $s = shift; + return $ready = 1; +} + +# stubs + +sub init {} +sub stop {} +sub idle {} +sub cleanup {} +sub output {} + +# +# client init +# +for (@clients) { $_->init } + +$SIG{'INT'} = \&DB::catch; + +# disable this if stepping through END blocks is desired +# (looks scary and deconstructivist with Swat) +END { $ready = 0 } + +1; +__END__ + +package FileHandle; + +use 5.006; +use strict; +our($VERSION, @ISA, @EXPORT, @EXPORT_OK); + +$VERSION = "2.03"; + +require IO::File; +@ISA = qw(IO::File); + +@EXPORT = qw(_IOFBF _IOLBF _IONBF); + +@EXPORT_OK = qw( + pipe + + autoflush + output_field_separator + output_record_separator + input_record_separator + input_line_number + format_page_number + format_lines_per_page + format_lines_left + format_name + format_top_name + format_line_break_characters + format_formfeed + + print + printf + getline + getlines +); + +# +# Everything we're willing to export, we must first import. +# +IO::Handle->import( grep { !defined(&$_) } @EXPORT, @EXPORT_OK ); + +# +# Some people call "FileHandle::function", so all the functions +# that were in the old FileHandle class must be imported, too. +# +{ + no strict 'refs'; + + my %import = ( + 'IO::Handle' => + [qw(DESTROY new_from_fd fdopen close fileno getc ungetc gets + eof flush error clearerr setbuf setvbuf _open_mode_string)], + 'IO::Seekable' => + [qw(seek tell getpos setpos)], + 'IO::File' => + [qw(new new_tmpfile open)] + ); + for my $pkg (keys %import) { + for my $func (@{$import{$pkg}}) { + my $c = *{"${pkg}::$func"}{CODE} + or die "${pkg}::$func missing"; + *$func = $c; + } + } +} + +# +# Specialized importer for Fcntl magic. +# +sub import { + my $pkg = shift; + my $callpkg = caller; + require Exporter; + Exporter::export($pkg, $callpkg, @_); + + # + # If the Fcntl extension is available, + # export its constants. + # + eval { + require Fcntl; + Exporter::export('Fcntl', $callpkg); + }; +} + +################################################ +# This is the only exported function we define; +# the rest come from other classes. +# + +sub pipe { + my $r = IO::Handle->new; + my $w = IO::Handle->new; + CORE::pipe($r, $w) or return undef; + ($r, $w); +} + +# Rebless standard file handles +bless *STDIN{IO}, "FileHandle" if ref *STDIN{IO} eq "IO::Handle"; +bless *STDOUT{IO}, "FileHandle" if ref *STDOUT{IO} eq "IO::Handle"; +bless *STDERR{IO}, "FileHandle" if ref *STDERR{IO} eq "IO::Handle"; + +1; + +__END__ + +package filetest; + +our $VERSION = '1.03'; + + +$filetest::hint_bits = 0x00400000; # HINT_FILETEST_ACCESS + +sub import { + if ( $_[1] eq 'access' ) { + $^H |= $filetest::hint_bits; + } else { + die "filetest: the only implemented subpragma is 'access'.\n"; + } +} + +sub unimport { + if ( $_[1] eq 'access' ) { + $^H &= ~$filetest::hint_bits; + } else { + die "filetest: the only implemented subpragma is 'access'.\n"; + } +} + +1; +package bignum; + +use 5.010; +use strict; +use warnings; + +our $VERSION = '0.49'; + +use Exporter; +our @ISA = qw( bigint ); +our @EXPORT_OK = qw( PI e bpi bexp hex oct ); +our @EXPORT = qw( inf NaN ); + +use overload; +use bigint (); + +############################################################################## + +BEGIN { + *inf = \&bigint::inf; + *NaN = \&bigint::NaN; + *hex = \&bigint::hex; + *oct = \&bigint::oct; +} + +# These are all alike, and thus faked by AUTOLOAD + +my @faked = qw/round_mode accuracy precision div_scale/; +our ($AUTOLOAD, $_lite); # _lite for testsuite + +sub AUTOLOAD { + my $name = $AUTOLOAD; + + $name =~ s/.*:://; # split package + no strict 'refs'; + foreach my $n (@faked) { + if ($n eq $name) { + *{"bignum::$name"} = + sub { + my $self = shift; + no strict 'refs'; + if (defined $_[0]) { + Math::BigInt->$name($_[0]); + return Math::BigFloat->$name($_[0]); + } + return Math::BigInt->$name(); + }; + return &$name; + } + } + + # delayed load of Carp and avoid recursion + require Carp; + Carp::croak ("Can't call bignum\-\>$name, not a valid method"); +} + +sub unimport { + $^H{bignum} = undef; # no longer in effect + overload::remove_constant('binary', '', 'float', '', 'integer'); +} + +sub in_effect { + my $level = shift || 0; + my $hinthash = (caller($level))[10]; + $hinthash->{bignum}; +} + +############################################################################# + +sub import { + my $self = shift; + + $^H{bignum} = 1; # we are in effect + + # for newer Perls override hex() and oct() with a lexical version: + if ($] > 5.009004) { + bigint::_override(); + } + + # some defaults + my $lib = ''; + my $lib_kind = 'try'; + my $upgrade = 'Math::BigFloat'; + my $downgrade = 'Math::BigInt'; + + my @import = (':constant'); # drive it w/ constant + my @a = @_; + my $l = scalar @_; + my $j = 0; + my ($ver, $trace); # version? trace? + my ($a, $p); # accuracy, precision + for (my $i = 0; $i < $l; $i++, $j++) { + if ($_[$i] eq 'upgrade') { + # this causes upgrading + $upgrade = $_[$i + 1]; # or undef to disable + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } elsif ($_[$i] eq 'downgrade') { + # this causes downgrading + $downgrade = $_[$i + 1]; # or undef to disable + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } elsif ($_[$i] =~ /^(l|lib|try|only)$/) { + # this causes a different low lib to take care... + $lib_kind = $1; + $lib_kind = 'lib' if $lib_kind eq 'l'; + $lib = $_[$i + 1] || ''; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } + elsif ($_[$i] =~ /^(a|accuracy)$/) { + $a = $_[$i + 1]; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } + elsif ($_[$i] =~ /^(p|precision)$/) { + $p = $_[$i + 1]; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } + elsif ($_[$i] =~ /^(v|version)$/) { + $ver = 1; + splice @a, $j, 1; + $j--; + } + elsif ($_[$i] =~ /^(t|trace)$/) { + $trace = 1; + splice @a, $j, 1; + $j--; + } + elsif ($_[$i] !~ /^(PI|e|bexp|bpi|hex|oct)\z/) { + die ("unknown option $_[$i]"); + } + } + my $class; + $_lite = 0; # using M::BI::L ? + if ($trace) { + require Math::BigInt::Trace; + $class = 'Math::BigInt::Trace'; + $upgrade = 'Math::BigFloat::Trace'; + } + else { + # see if we can find Math::BigInt::Lite + if (!defined $a && !defined $p) { # rounding won't work to well + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + if (eval { require Math::BigInt::Lite; 1 }) { + @import = (); # :constant in Lite, not MBI + Math::BigInt::Lite->import(':constant'); + $_lite = 1; # signal okay + } + } + require Math::BigInt if $_lite == 0; # not already loaded? + $class = 'Math::BigInt'; # regardless of MBIL or not + } + push @import, $lib_kind => $lib if $lib ne ''; + # Math::BigInt::Trace or plain Math::BigInt + $class->import(@import, upgrade => $upgrade); + + if ($trace) { + require Math::BigFloat::Trace; + $class = 'Math::BigFloat::Trace'; + $downgrade = 'Math::BigInt::Trace'; + } + else { + require Math::BigFloat; + $class = 'Math::BigFloat'; + } + $class->import(':constant', 'downgrade', $downgrade); + + bignum->accuracy($a) if defined $a; + bignum->precision($p) if defined $p; + if ($ver) { + print "bignum\t\t\t v$VERSION\n"; + print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite; + print "Math::BigInt\t\t v$Math::BigInt::VERSION"; + my $config = Math::BigInt->config(); + print " lib => $config->{lib} v$config->{lib_version}\n"; + print "Math::BigFloat\t\t v$Math::BigFloat::VERSION\n"; + exit; + } + + # Take care of octal/hexadecimal constants + overload::constant binary => + sub { + bigint::_binary_constant(shift); + }; + + # if another big* was already loaded: + my ($package) = caller(); + + no strict 'refs'; + if (!defined *{"${package}::inf"}) { + $self->export_to_level(1, $self, @a); # export inf and NaN + } +} + +sub PI () { Math::BigFloat->new('3.141592653589793238462643383279502884197'); } +sub e () { Math::BigFloat->new('2.718281828459045235360287471352662497757'); } +sub bpi ($) { Math::BigFloat->bpi(@_); } +sub bexp ($$) { + my $x = Math::BigFloat->new($_[0]); + $x->bexp($_[1]); +} + +1; + +__END__ + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This helper module is for internal use by core Perl only. This module is +# subject to change or removal at any time without notice. Don't use it +# directly. Use the public module instead. + +package _charnames; +use strict; +use warnings; +our $VERSION = '1.45'; +use unicore::Name; # mktables-generated algorithmically-defined names + +use bytes (); # for $bytes::hint_bits +use re "/aa"; # Everything in here should be ASCII + +$Carp::Internal{ (__PACKAGE__) } = 1; + +# Translate between Unicode character names and their code points. This is a +# submodule of package , used to allow \N{...} to be autoloaded, +# but it was decided not to autoload the various functions in charnames; the +# splitting allows this behavior. +# +# The official names with their code points are stored in a table in +# lib/unicore/Name.pl which is read in as a large string (almost 3/4 Mb in +# Unicode 6.0). Each code point/name combination is separated by a \n in the +# string. (Some of the CJK and the Hangul syllable names are instead +# determined algorithmically via subroutines stored instead in +# lib/unicore/Name.pm). Because of the large size of this table, it isn't +# converted into hashes for faster lookup. +# +# But, user defined aliases are stored in their own hashes, as are Perl +# extensions to the official names. These are checked first before looking at +# the official table. +# +# Basically, the table is grepped for the input code point (viacode()) or +# name (the other functions), and the corresponding value on the same line is +# returned. The grepping is done by turning the input into a regular +# expression. Thus, the same table does double duty, used by both name and +# code point lookup. (If we were to have hashes, we would need two, one for +# each lookup direction.) +# +# For loose name matching, the logical thing would be to have a table +# with all the ignorable characters squeezed out, and then grep it with the +# similiarly-squeezed input name. (And this is in fact how the lookups are +# done with the small Perl extension hashes.) But since we need to be able to +# go from code point to official name, the original table would still need to +# exist. Due to the large size of the table, it was decided to not read +# another very large string into memory for a second table. Instead, the +# regular expression of the input name is modified to have optional spaces and +# dashes between characters. For example, in strict matching, the regular +# expression would be: +# qr/\tDIGIT ONE$/m +# Under loose matching, the blank would be squeezed out, and the re would be: +# qr/\tD[- ]?I[- ]?G[- ]?I[- ]?T[- ]?O[- ]?N[- ]?E$/m +# which matches a blank or dash between any characters in the official table. +# +# This is also how script lookup is done. Basically the re looks like +# qr/ (?:LATIN|GREEK|CYRILLIC) (?:SMALL )?LETTER $name/ +# where $name is the loose or strict regex for the remainder of the name. + +# The hashes are stored as utf8 strings. This makes it easier to deal with +# sequences. I (khw) also tried making Name.pl utf8, but it slowed things +# down by a factor of 7. I then tried making Name.pl store the ut8 +# equivalents but not calling them utf8. That led to similar speed as leaving +# it alone, but since that is harder for a human to parse, I left it as-is. + +my %system_aliases = ( + + 'SINGLE-SHIFT 2' => chr utf8::unicode_to_native(0x8E), + 'SINGLE-SHIFT 3' => chr utf8::unicode_to_native(0x8F), + 'PRIVATE USE 1' => chr utf8::unicode_to_native(0x91), + 'PRIVATE USE 2' => chr utf8::unicode_to_native(0x92), +); + +# These are the aliases above that differ under :loose and :full matching +# because the :full versions have blanks or hyphens in them. +#my %loose_system_aliases = ( +#); + +#my %deprecated_aliases; +#$deprecated_aliases{'BELL'} = chr utf8::unicode_to_native(0x07) if $^V lt v5.17.0; + +#my %loose_deprecated_aliases = ( +#); + +# These are special cased in :loose matching, differing only in a medial +# hyphen +my $HANGUL_JUNGSEONG_O_E_utf8 = chr 0x1180; +my $HANGUL_JUNGSEONG_OE_utf8 = chr 0x116C; + + +my $txt; # The table of official character names + +my %full_names_cache; # Holds already-looked-up names, so don't have to +# re-look them up again. The previous versions of charnames had scoping +# bugs. For example if we use script A in one scope and find and cache +# what Z resolves to, we can't use that cache in a different scope that +# uses script B instead of A, as Z might be an entirely different letter +# there; or there might be different aliases in effect in different +# scopes, or :short may be in effect or not effect in different scopes, +# or various combinations thereof. This was solved in this version +# mostly by moving things to %^H. But some things couldn't be moved +# there. One of them was the cache of runtime looked-up names, in part +# because %^H is read-only at runtime. I (khw) don't know why the cache +# was run-time only in the previous versions: perhaps oversight; perhaps +# that compile time looking doesn't happen in a loop so didn't think it +# was worthwhile; perhaps not wanting to make the cache too large. But +# I decided to make it compile time as well; this could easily be +# changed. +# Anyway, this hash is not scoped, and is added to at runtime. It +# doesn't have scoping problems because the data in it is restricted to +# official names, which are always invariant, and we only set it and +# look at it at during :full lookups, so is unaffected by any other +# scoped options. I put this in to maintain parity with the older +# version. If desired, a %short_names cache could also be made, as well +# as one for each script, say in %script_names_cache, with each key +# being a hash for a script named in a 'use charnames' statement. I +# decided not to do that for now, just because it's added complication, +# and because I'm just trying to maintain parity, not extend it. + +# Like %full_names_cache, but for use when :loose is in effect. There needs +# to be two caches because :loose may not be in effect for a scope, and a +# loose name could inappropriately be returned when only exact matching is +# called for. +my %loose_names_cache; + +# Designed so that test decimal first, and then hex. Leading zeros +# imply non-decimal, as do non-[0-9] +my $decimal_qr = qr/^[1-9]\d*$/; + +# Returns the hex number in $1. +my $hex_qr = qr/^(?:[Uu]\+|0[xX])?([[:xdigit:]]+)$/; + +sub croak +{ + require Carp; goto &Carp::croak; +} # croak + +sub carp +{ + require Carp; goto &Carp::carp; +} # carp + +sub alias (@) # Set up a single alias +{ + my @errors; + my $nbsp = chr utf8::unicode_to_native(0xA0); + + my $alias = ref $_[0] ? $_[0] : { @_ }; + foreach my $name (sort keys %$alias) { # Sort only because it helps having + # deterministic output for + # t/lib/charnames/alias + my $value = $alias->{$name}; + next unless defined $value; # Omit if screwed up. + + # Is slightly slower to just after this statement see if it is + # decimal, since we already know it is after having converted from + # hex, but makes the code easier to maintain, and is called + # infrequently, only at compile-time + if ($value !~ $decimal_qr && $value =~ $hex_qr) { + my $temp = CORE::hex $1; + $temp = utf8::unicode_to_native($temp) if $value =~ /^[Uu]\+/; + $value = $temp; + } + if ($value =~ $decimal_qr) { + no warnings qw(non_unicode surrogate nonchar); # Allow any of these + $^H{charnames_ord_aliases}{$name} = chr $value; + + # Use a canonical form. + $^H{charnames_inverse_ords}{sprintf("%05X", $value)} = $name; + } + else { + my $ok_portion = ""; + $ok_portion = $1 if $name =~ / ^ ( + \p{_Perl_Charname_Begin} + \p{_Perl_Charname_Continue}* + ) /x; + + # If the name was fully correct, the above should have matched all of + # it. + if (length $ok_portion < length $name) { + my $first_bad = substr($name, length($ok_portion), 1); + push @errors, "Invalid character in charnames alias definition; " + . "marked by <-- HERE in '$ok_portion$first_bad<-- HERE " + . substr($name, length($ok_portion) + 1) + . "'"; + } + else { + if ($name =~ / ( .* \s ) ( \s* ) $ /x) { + push @errors, "charnames alias definitions may not contain " + . "trailing white-space; marked by <-- HERE in " + . "'$1 <-- HERE " . $2 . "'"; + next; + } + + # Use '+' instead of '*' in this regex, because any trailing + # blanks have already been found + if ($name =~ / ( .*? \s{2} ) ( .+ ) /x) { + push @errors, "charnames alias definitions may not contain a " + . "sequence of multiple spaces; marked by <-- HERE " + . "in '$1 <-- HERE " . $2 . "'"; + next; + } + + $^H{charnames_name_aliases}{$name} = $value; + } + } + } + + # We find and output all errors from this :alias definition, rather than + # failing on the first one, so fewer runs are needed to get it to compile + if (@errors) { + croak join "\n", @errors; + } + + return; +} # alias + +sub not_legal_use_bytes_msg { + my ($name, $utf8) = @_; + my $return; + + if (length($utf8) == 1) { + $return = sprintf("Character 0x%04x with name '%s' is", ord $utf8, $name); + } else { + $return = sprintf("String with name '%s' (and ordinals %s) contains character(s)", $name, join(" ", map { sprintf "0x%04X", ord $_ } split(//, $utf8))); + } + return $return . " above 0xFF with 'use bytes' in effect"; +} + +sub alias_file ($) # Reads a file containing alias definitions +{ + require File::Spec; + my ($arg, $file) = @_; + if (-f $arg && File::Spec->file_name_is_absolute ($arg)) { + $file = $arg; + } + elsif ($arg =~ m/ ^ \p{_Perl_IDStart} \p{_Perl_IDCont}* $/x) { + $file = "unicore/${arg}_alias.pl"; + } + else { + croak "Charnames alias file names can only have identifier characters"; + } + if (my @alias = do $file) { + @alias == 1 && !defined $alias[0] and + croak "$file cannot be used as alias file for charnames"; + @alias % 2 and + croak "$file did not return a (valid) list of alias pairs"; + alias (@alias); + return (1); + } + 0; +} # alias_file + +# For use when don't import anything. This structure must be kept in +# sync with the one that import() fills up. +my %dummy_H = ( + charnames_stringified_names => "", + charnames_stringified_ords => "", + charnames_scripts => "", + charnames_full => 1, + charnames_loose => 0, + charnames_short => 0, + ); + + +sub lookup_name ($$$) { + my ($name, $wants_ord, $runtime) = @_; + + # Lookup the name or sequence $name in the tables. If $wants_ord is false, + # returns the string equivalent of $name; if true, returns the ordinal value + # instead, but in this case $name must not be a sequence; otherwise undef is + # returned and a warning raised. $runtime is 0 if compiletime, otherwise + # gives the number of stack frames to go back to get the application caller + # info. + # If $name is not found, returns undef in runtime with no warning; and in + # compiletime, the Unicode replacement character, with a warning. + + # It looks first in the aliases, then in the large table of official Unicode + # names. + + my $result; # The string result + my $save_input; + + if ($runtime) { + + my $hints_ref = (caller($runtime))[10]; + + # If we didn't import anything (which happens with 'use charnames ()', + # substitute a dummy structure. + $hints_ref = \%dummy_H if ! defined $hints_ref + || (! defined $hints_ref->{charnames_full} + && ! defined $hints_ref->{charnames_loose}); + + # At runtime, but currently not at compile time, %^H gets + # stringified, so un-stringify back to the original data structures. + # These get thrown away by perl before the next invocation + # Also fill in the hash with the non-stringified data. + # N.B. New fields must be also added to %dummy_H + + %{$^H{charnames_name_aliases}} = split ',', + $hints_ref->{charnames_stringified_names}; + %{$^H{charnames_ord_aliases}} = split ',', + $hints_ref->{charnames_stringified_ords}; + $^H{charnames_scripts} = $hints_ref->{charnames_scripts}; + $^H{charnames_full} = $hints_ref->{charnames_full}; + $^H{charnames_loose} = $hints_ref->{charnames_loose}; + $^H{charnames_short} = $hints_ref->{charnames_short}; + } + + my $loose = $^H{charnames_loose}; + my $lookup_name; # Input name suitably modified for grepping for in the + # table + + # User alias should be checked first or else can't override ours, and if we + # were to add any, could conflict with theirs. + if (exists $^H{charnames_ord_aliases}{$name}) { + $result = $^H{charnames_ord_aliases}{$name}; + } + elsif (exists $^H{charnames_name_aliases}{$name}) { + $name = $^H{charnames_name_aliases}{$name}; + $save_input = $lookup_name = $name; # Cache the result for any error + # message + # The aliases are documented to not match loosely, so change loose match + # into full. + if ($loose) { + $loose = 0; + $^H{charnames_full} = 1; + } + } + else { + + # Here, not a user alias. That means that loose matching may be in + # effect; will have to modify the input name. + $lookup_name = $name; + if ($loose) { + $lookup_name = uc $lookup_name; + + # Squeeze out all underscores + $lookup_name =~ s/_//g; + + # Remove all medial hyphens + $lookup_name =~ s/ (?<= \S ) - (?= \S )//gx; + + # Squeeze out all spaces + $lookup_name =~ s/\s//g; + } + + # Here, $lookup_name has been modified as necessary for looking in the + # hashes. Check the system alias files next. Most of these aliases are + # the same for both strict and loose matching. To save space, the ones + # which differ are in their own separate hash, which is checked if loose + # matching is selected and the regular match fails. To save time, the + # loose hashes could be expanded to include all aliases, and there would + # only have to be one check. But if someone specifies :loose, they are + # interested in convenience over speed, and the time for this second check + # is miniscule compared to the rest of the routine. + if (exists $system_aliases{$lookup_name}) { + $result = $system_aliases{$lookup_name}; + } + # There are currently no entries in this hash, so don't waste time looking + # for them. But the code is retained for the unlikely possibility that + # some will be added in the future. +# elsif ($loose && exists $loose_system_aliases{$lookup_name}) { +# $result = $loose_system_aliases{$lookup_name}; +# } +# if (exists $deprecated_aliases{$lookup_name}) { +# require warnings; +# warnings::warnif('deprecated', +# "Unicode character name \"$name\" is deprecated, use \"" +# . viacode(ord $deprecated_aliases{$lookup_name}) +# . "\" instead"); +# $result = $deprecated_aliases{$lookup_name}; +# } + # There are currently no entries in this hash, so don't waste time looking + # for them. But the code is retained for the unlikely possibility that + # some will be added in the future. +# elsif ($loose && exists $loose_deprecated_aliases{$lookup_name}) { +# require warnings; +# warnings::warnif('deprecated', +# "Unicode character name \"$name\" is deprecated, use \"" +# . viacode(ord $loose_deprecated_aliases{$lookup_name}) +# . "\" instead"); +# $result = $loose_deprecated_aliases{$lookup_name}; +# } + } + + my @off; # Offsets into table of pattern match begin and end + + # If haven't found it yet... + if (! defined $result) { + + # See if has looked this input up earlier. + if (! $loose && $^H{charnames_full} && exists $full_names_cache{$name}) { + $result = $full_names_cache{$name}; + } + elsif ($loose && exists $loose_names_cache{$name}) { + $result = $loose_names_cache{$name}; + } + else { # Here, must do a look-up + + # If full or loose matching succeeded, points to where to cache the + # result + my $cache_ref; + + ## Suck in the code/name list as a big string. + ## Lines look like: + ## "00052\tLATIN CAPITAL LETTER R\n" + # or + # "0052 0303\tLATIN CAPITAL LETTER R WITH TILDE\n" + $txt = do "unicore/Name.pl" unless $txt; + + ## @off will hold the index into the code/name string of the start and + ## end of the name as we find it. + + ## If :loose, look for a loose match; if :full, look for the name + ## exactly + # First, see if the name is one which is algorithmically determinable. + # The subroutine is included in Name.pl. The table contained in + # $txt doesn't contain these. Experiments show that checking + # for these before checking for the regular names has no + # noticeable impact on performance for the regular names, but + # the other way around slows down finding these immensely. + # Algorithmically determinables are not placed in the cache because + # that uses up memory, and finding these again is fast. + if (($loose || $^H{charnames_full}) + && (defined (my $ord = charnames::name_to_code_point_special($lookup_name, $loose)))) + { + $result = chr $ord; + } + else { + + # Not algorithmically determinable; look up in the table. The name + # will be turned into a regex, so quote any meta characters. + $lookup_name = quotemeta $lookup_name; + + if ($loose) { + + # For loose matches, $lookup_name has already squeezed out the + # non-essential characters. We have to add in code to make the + # squeezed version match the non-squeezed equivalent in the table. + # The only remaining hyphens are ones that start or end a word in + # the original. They have been quoted in $lookup_name so they look + # like "\-". Change all other characters except the backslash + # quotes for any metacharacters, and the final character, so that + # e.g., COLON gets transformed into: /C[- ]?O[- ]?L[- ]?O[- ]?N/ + $lookup_name =~ s/ (?! \\ -) # Don't do this to the \- sequence + ( [^-\\] ) # Nor the "-" within that sequence, + # nor the "\" that quotes metachars, + # but otherwise put the char into $1 + (?=.) # And don't do it for the final char + /$1\[- \]?/gx; # And add an optional blank or + # '-' after each $1 char + + # Those remaining hyphens were originally at the beginning or end of + # a word, so they can match either a blank before or after, but not + # both. (Keep in mind that they have been quoted, so are a '\-' + # sequence) + $lookup_name =~ s/\\ -/(?:- | -)/xg; + } + + # Do the lookup in the full table if asked for, and if succeeds + # save the offsets and set where to cache the result. + if (($loose || $^H{charnames_full}) && $txt =~ /\t$lookup_name$/m) { + @off = ($-[0] + 1, $+[0]); # The 1 is for the tab + $cache_ref = ($loose) ? \%loose_names_cache : \%full_names_cache; + } + else { + + # Here, didn't look for, or didn't find the name. + # If :short is allowed, see if input is like "greek:Sigma". + # Keep in mind that $lookup_name has had the metas quoted. + my $scripts_trie = ""; + my $name_has_uppercase; + if (($^H{charnames_short}) + && $lookup_name =~ /^ (?: \\ \s)* # Quoted space + (.+?) # $1 = the script + (?: \\ \s)* + \\ : # Quoted colon + (?: \\ \s)* + (.+?) # $2 = the name + (?: \\ \s)* $ + /xs) + { + # Even in non-loose matching, the script traditionally has been + # case insensitive + $scripts_trie = "\U$1"; + $lookup_name = $2; + + # Use original name to find its input casing, but ignore the + # script part of that to make the determination. + $save_input = $name if ! defined $save_input; + $name =~ s/.*?://; + $name_has_uppercase = $name =~ /[[:upper:]]/; + } + else { # Otherwise look in allowed scripts + $scripts_trie = $^H{charnames_scripts}; + + # Use original name to find its input casing + $name_has_uppercase = $name =~ /[[:upper:]]/; + } + + my $case = $name_has_uppercase ? "CAPITAL" : "SMALL"; + return if (! $scripts_trie || $txt !~ + /\t (?: $scripts_trie ) \ (?:$case\ )? LETTER \ \U$lookup_name $/xm); + + # Here have found the input name in the table. + @off = ($-[0] + 1, $+[0]); # The 1 is for the tab + } + + # Here, the input name has been found; we haven't set up the output, + # but we know where in the string + # the name starts. The string is set up so that for single characters + # (and not named sequences), the name is preceded immediately by a + # tab and 5 hex digits for its code, with a \n before those. Named + # sequences won't have the 7th preceding character be a \n. + # (Actually, for the very first entry in the table this isn't strictly + # true: subtracting 7 will yield -1, and the substr below will + # therefore yield the very last character in the table, which should + # also be a \n, so the statement works anyway.) + if (substr($txt, $off[0] - 7, 1) eq "\n") { + $result = chr CORE::hex substr($txt, $off[0] - 6, 5); + + # Handle the single loose matching special case, in which two names + # differ only by a single medial hyphen. If the original had a + # hyphen (or more) in the right place, then it is that one. + $result = $HANGUL_JUNGSEONG_O_E_utf8 + if $loose + && $result eq $HANGUL_JUNGSEONG_OE_utf8 + && $name =~ m/O \s* - [-\s]* E/ix; + # Note that this wouldn't work if there were a 2nd + # OE in the name + } + else { + + # Here, is a named sequence. Need to go looking for the beginning, + # which is just after the \n from the previous entry in the table. + # The +1 skips past that newline, or, if the rindex() fails, to put + # us to an offset of zero. + my $charstart = rindex($txt, "\n", $off[0] - 7) + 1; + $result = pack("W*", map { CORE::hex } + split " ", substr($txt, $charstart, $off[0] - $charstart - 1)); + } + } + + # Cache the input so as to not have to search the large table + # again, but only if it came from the one search that we cache. + # (Haven't bothered with the pain of sorting out scoping issues for the + # scripts searches.) + $cache_ref->{$name} = $result if defined $cache_ref; + } + } + + # Here, have the result character. If the return is to be an ord, must be + # any single character. + if ($wants_ord) { + return ord($result) if length $result == 1; + } + elsif (! utf8::is_utf8($result)) { + + # Here isn't UTF-8. That's OK if it is all ASCII, or we are being called + # at compile time where we know we can guarantee that Unicode rules are + # correctly imposed on the result, or under 'bytes' where we don't want + # those rules. But otherwise we have to make it UTF8 to guarantee Unicode + # rules on the returned string. + return $result if ! $runtime + || (caller $runtime)[8] & $bytes::hint_bits + || $result !~ /[[:^ascii:]]/; + utf8::upgrade($result); + return $result; + } + else { + + # Here, wants string output. If utf8 is acceptable, just return what + # we've got; otherwise attempt to convert it to non-utf8 and return that. + my $in_bytes = ($runtime) + ? (caller $runtime)[8] & $bytes::hint_bits + : $^H & $bytes::hint_bits; + return $result if (! $in_bytes || utf8::downgrade($result, 1)) # The 1 arg + # means don't die on failure + } + + # Here, there is an error: either there are too many characters, or the + # result string needs to be non-utf8, and at least one character requires + # utf8. Prefer any official name over the input one for the error message. + if (@off) { + $name = substr($txt, $off[0], $off[1] - $off[0]) if @off; + } + else { + $name = (defined $save_input) ? $save_input : $_[0]; + } + + if ($wants_ord) { + # Only way to get here in this case is if result too long. Message + # assumes that our only caller that requires single char result is + # vianame. + carp "charnames::vianame() doesn't handle named sequences ($name). Use charnames::string_vianame() instead"; + return; + } + + # Only other possible failure here is from use bytes. + if ($runtime) { + carp not_legal_use_bytes_msg($name, $result); + return; + } else { + croak not_legal_use_bytes_msg($name, $result); + } + +} # lookup_name + +sub charnames { + + # For \N{...}. Looks up the character name and returns the string + # representation of it. + + # The first 0 arg means wants a string returned; the second that we are in + # compile time + return lookup_name($_[0], 0, 0); +} + +sub import +{ + shift; ## ignore class name + + if (not @_) { + carp("'use charnames' needs explicit imports list"); + } + $^H{charnames} = \&charnames ; + $^H{charnames_ord_aliases} = {}; + $^H{charnames_name_aliases} = {}; + $^H{charnames_inverse_ords} = {}; + # New fields must be added to %dummy_H, and the code in lookup_name() + # that copies fields from the runtime structure + + ## + ## fill %h keys with our @_ args. + ## + my ($promote, %h, @args) = (0); + while (my $arg = shift) { + if ($arg eq ":alias") { + @_ or + croak ":alias needs an argument in charnames"; + my $alias = shift; + if (ref $alias) { + ref $alias eq "HASH" or + croak "Only HASH reference supported as argument to :alias"; + alias ($alias); + $promote = 1; + next; + } + if ($alias =~ m{:(\w+)$}) { + $1 eq "full" || $1 eq "loose" || $1 eq "short" and + croak ":alias cannot use existing pragma :$1 (reversed order?)"; + alias_file ($1) and $promote = 1; + next; + } + alias_file ($alias) and $promote = 1; + next; + } + if (substr($arg, 0, 1) eq ':' + and ! ($arg eq ":full" || $arg eq ":short" || $arg eq ":loose")) + { + warn "unsupported special '$arg' in charnames"; + next; + } + push @args, $arg; + } + + @args == 0 && $promote and @args = (":full"); + @h{@args} = (1) x @args; + + # Don't leave these undefined as are tested for in lookup_names + $^H{charnames_full} = delete $h{':full'} || 0; + $^H{charnames_loose} = delete $h{':loose'} || 0; + $^H{charnames_short} = delete $h{':short'} || 0; + my @scripts = map { uc quotemeta } keys %h; + + ## + ## If utf8? warnings are enabled, and some scripts were given, + ## see if at least we can find one letter from each script. + ## + if (warnings::enabled('utf8') && @scripts) { + $txt = do "unicore/Name.pl" unless $txt; + + for my $script (@scripts) { + if (not $txt =~ m/\t$script (?:CAPITAL |SMALL )?LETTER /) { + warnings::warn('utf8', "No such script: '$script'"); + $script = quotemeta $script; # Escape it, for use in the re. + } + } + } + + # %^H gets stringified, so serialize it ourselves so can extract the + # real data back later. + $^H{charnames_stringified_ords} = join ",", %{$^H{charnames_ord_aliases}}; + $^H{charnames_stringified_names} = join ",", %{$^H{charnames_name_aliases}}; + $^H{charnames_stringified_inverse_ords} = join ",", %{$^H{charnames_inverse_ords}}; + + # Modify the input script names for loose name matching if that is also + # specified, similar to the way the base character name is prepared. They + # don't (currently, and hopefully never will) have dashes. These go into a + # regex, and have already been uppercased and quotemeta'd. Squeeze out all + # input underscores, blanks, and dashes. Then convert so will match a blank + # between any characters. + if ($^H{charnames_loose}) { + for (my $i = 0; $i < @scripts; $i++) { + $scripts[$i] =~ s/[_ -]//g; + $scripts[$i] =~ s/ ( [^\\] ) (?= . ) /$1\\ ?/gx; + } + } + + $^H{charnames_scripts} = join "|", @scripts; # Stringifiy them as a trie +} # import + +# Cache of already looked-up values. This is set to only contain +# official values, and user aliases can't override them, so scoping is +# not an issue. +my %viacode; + +my $no_name_code_points_re = join "|", map { sprintf("%05X", + utf8::unicode_to_native($_)) } + 0x80, 0x81, 0x84, 0x99; +$no_name_code_points_re = qr/$no_name_code_points_re/; + +sub viacode { + + # Returns the name of the code point argument + + if (@_ != 1) { + carp "charnames::viacode() expects one argument"; + return; + } + + my $arg = shift; + + # This is derived from Unicode::UCD, where it is nearly the same as the + # function _getcode(), but here it makes sure that even a hex argument + # has the proper number of leading zeros, which is critical in + # matching against $txt below + # Must check if decimal first; see comments at that definition + my $hex; + if ($arg =~ $decimal_qr) { + $hex = sprintf "%05X", $arg; + } elsif ($arg =~ $hex_qr) { + $hex = CORE::hex $1; + $hex = utf8::unicode_to_native($hex) if $arg =~ /^[Uu]\+/; + # Below is the line that differs from the _getcode() source + $hex = sprintf "%05X", $hex; + } else { + carp("unexpected arg \"$arg\" to charnames::viacode()"); + return; + } + + return $viacode{$hex} if exists $viacode{$hex}; + + my $return; + + # If the code point is above the max in the table, there's no point + # looking through it. Checking the length first is slightly faster + if (length($hex) <= 5 || CORE::hex($hex) <= 0x10FFFF) { + $txt = do "unicore/Name.pl" unless $txt; + + # See if the name is algorithmically determinable. + my $algorithmic = charnames::code_point_to_name_special(CORE::hex $hex); + if (defined $algorithmic) { + $viacode{$hex} = $algorithmic; + return $algorithmic; + } + + # Return the official name, if exists. It's unclear to me (khw) at + # this juncture if it is better to return a user-defined override, so + # leaving it as is for now. + if ($txt =~ m/^$hex\t/m) { + + # The name starts with the next character and goes up to the + # next new-line. Using capturing parentheses above instead of + # @+ more than doubles the execution time in Perl 5.13 + $return = substr($txt, $+[0], index($txt, "\n", $+[0]) - $+[0]); + + # If not one of these 4 code points, return what we've found. + if ($hex !~ / ^ $no_name_code_points_re $ /x) { + $viacode{$hex} = $return; + return $return; + } + + # For backwards compatibility, we don't return the official name of + # the 4 code points if there are user-defined aliases for them -- so + # continue looking. + } + } + + # See if there is a user name for it, before giving up completely. + # First get the scoped aliases, give up if have none. + my $H_ref = (caller(1))[10]; + return if ! defined $return + && (! defined $H_ref + || ! exists $H_ref->{charnames_stringified_inverse_ords}); + + my %code_point_aliases; + if (defined $H_ref->{charnames_stringified_inverse_ords}) { + %code_point_aliases = split ',', + $H_ref->{charnames_stringified_inverse_ords}; + return $code_point_aliases{$hex} if exists $code_point_aliases{$hex}; + } + + # Here there is no user-defined alias, return any official one. + return $return if defined $return; + + if (CORE::hex($hex) > 0x10FFFF + && warnings::enabled('non_unicode')) + { + carp "Unicode characters only allocated up to U+10FFFF (you asked for U+$hex)"; + } + return; + +} # viacode + +1; + +# ex: set ts=8 sts=2 sw=2 et: +package open; +use warnings; + +our $VERSION = '1.11'; + +require 5.008001; # for PerlIO::get_layers() + +my $locale_encoding; + +sub _get_encname { + return ($1, Encode::resolve_alias($1)) if $_[0] =~ /^:?encoding\((.+)\)$/; + return; +} + +sub croak { + require Carp; goto &Carp::croak; +} + +sub _drop_oldenc { + # If by the time we arrive here there already is at the top of the + # perlio layer stack an encoding identical to what we would like + # to push via this open pragma, we will pop away the old encoding + # (+utf8) so that we can push ourselves in place (this is easier + # than ignoring pushing ourselves because of the way how ${^OPEN} + # works). So we are looking for something like + # + # stdio encoding(xxx) utf8 + # + # in the existing layer stack, and in the new stack chunk for + # + # :encoding(xxx) + # + # If we find a match, we pop the old stack (once, since + # the utf8 is just a flag on the encoding layer) + my ($h, @new) = @_; + return unless @new >= 1 && $new[-1] =~ /^:encoding\(.+\)$/; + my @old = PerlIO::get_layers($h); + return unless @old >= 3 && + $old[-1] eq 'utf8' && + $old[-2] =~ /^encoding\(.+\)$/; + require Encode; + my ($loname, $lcname) = _get_encname($old[-2]); + unless (defined $lcname) { # Should we trust get_layers()? + croak("open: Unknown encoding '$loname'"); + } + my ($voname, $vcname) = _get_encname($new[-1]); + unless (defined $vcname) { + croak("open: Unknown encoding '$voname'"); + } + if ($lcname eq $vcname) { + binmode($h, ":pop"); # utf8 is part of the encoding layer + } +} + +sub import { + my ($class,@args) = @_; + croak("open: needs explicit list of PerlIO layers") unless @args; + my $std; + my ($in,$out) = split(/\0/,(${^OPEN} || "\0"), -1); + while (@args) { + my $type = shift(@args); + my $dscp; + if ($type =~ /^:?(utf8|locale|encoding\(.+\))$/) { + $type = 'IO'; + $dscp = ":$1"; + } elsif ($type eq ':std') { + $std = 1; + next; + } else { + $dscp = shift(@args) || ''; + } + my @val; + foreach my $layer (split(/\s+/,$dscp)) { + $layer =~ s/^://; + if ($layer eq 'locale') { + require Encode; + require encoding; + $locale_encoding = encoding::_get_locale_encoding() + unless defined $locale_encoding; + (warnings::warnif("layer", "Cannot figure out an encoding to use"), last) + unless defined $locale_encoding; + $layer = "encoding($locale_encoding)"; + $std = 1; + } else { + my $target = $layer; # the layer name itself + $target =~ s/^(\w+)\(.+\)$/$1/; # strip parameters + + unless(PerlIO::Layer::->find($target,1)) { + warnings::warnif("layer", "Unknown PerlIO layer '$target'"); + } + } + push(@val,":$layer"); + if ($layer =~ /^(crlf|raw)$/) { + $^H{"open_$type"} = $layer; + } + } + if ($type eq 'IN') { + _drop_oldenc(*STDIN, @val) if $std; + $in = join(' ', @val); + } + elsif ($type eq 'OUT') { + if ($std) { + _drop_oldenc(*STDOUT, @val); + _drop_oldenc(*STDERR, @val); + } + $out = join(' ', @val); + } + elsif ($type eq 'IO') { + if ($std) { + _drop_oldenc(*STDIN, @val); + _drop_oldenc(*STDOUT, @val); + _drop_oldenc(*STDERR, @val); + } + $in = $out = join(' ', @val); + } + else { + croak "Unknown PerlIO layer class '$type' (need IN, OUT or IO)"; + } + } + ${^OPEN} = join("\0", $in, $out); + if ($std) { + if ($in) { + if ($in =~ /:utf8\b/) { + binmode(STDIN, ":utf8"); + } elsif ($in =~ /(\w+\(.+\))/) { + binmode(STDIN, ":$1"); + } + } + if ($out) { + if ($out =~ /:utf8\b/) { + binmode(STDOUT, ":utf8"); + binmode(STDERR, ":utf8"); + } elsif ($out =~ /(\w+\(.+\))/) { + binmode(STDOUT, ":$1"); + binmode(STDERR, ":$1"); + } + } + } +} + +1; +__END__ + +package UNIVERSAL; + +our $VERSION = '1.13'; + +# UNIVERSAL should not contain any extra subs/methods beyond those +# that it exists to define. The existence of import() below is a historical +# accident that can't be fixed without breaking code. + +# Make sure that even though the import method is called, it doesn't do +# anything unless called on UNIVERSAL. +sub import { + return unless $_[0] eq __PACKAGE__; + return unless @_ > 1; + require Carp; + Carp::croak("UNIVERSAL does not export anything"); +} + +1; +__END__ + + + +package DB; + +use strict; + +use Cwd (); + +my $_initial_cwd; + +BEGIN {eval 'use IO::Handle'}; # Needed for flush only? breaks under miniperl + +BEGIN { + require feature; + $^V =~ /^v(\d+\.\d+)/; + feature->import(":$1"); + $_initial_cwd = Cwd::getcwd(); +} + +# Debugger for Perl 5.00x; perl5db.pl patch level: +use vars qw($VERSION $header); + +# bump to X.XX in blead, only use X.XX_XX in maint +$VERSION = '1.53'; + +$header = "perl5db.pl version $VERSION"; + + +############################################## Begin lexical danger zone + +# 'my' variables used here could leak into (that is, be visible in) +# the context that the code being evaluated is executing in. This means that +# the code could modify the debugger's variables. +# +# Fiddling with the debugger's context could be Bad. We insulate things as +# much as we can. + +use vars qw( + @args + %break_on_load + $CommandSet + $CreateTTY + $DBGR + @dbline + $dbline + %dbline + $dieLevel + $filename + $histfile + $histsize + $IN + $inhibit_exit + @ini_INC + $ini_warn + $maxtrace + $od + @options + $osingle + $otrace + $pager + $post + %postponed + $prc + $pre + $pretype + $psh + @RememberOnROptions + $remoteport + @res + $rl + @saved + $signalLevel + $sub + $term + $usercontext + $warnLevel +); + +our ( + @cmdfhs, + $evalarg, + $frame, + $hist, + $ImmediateStop, + $line, + $onetimeDump, + $onetimedumpDepth, + %option, + $OUT, + $packname, + $signal, + $single, + $start, + %sub, + $subname, + $trace, + $window, +); + +# Used to save @ARGV and extract any debugger-related flags. +use vars qw(@ARGS); + +# Used to prevent multiple entries to diesignal() +# (if for instance diesignal() itself dies) +use vars qw($panic); + +# Used to prevent the debugger from running nonstop +# after a restart +our ($second_time); + +sub _calc_usercontext { + my ($package) = @_; + + # Cancel strict completely for the evaluated code, so the code + # the user evaluates won't be affected by it. (Shlomi Fish) + return 'no strict; ($@, $!, $^E, $,, $/, $\, $^W) = @DB::saved;' + . "package $package;"; # this won't let them modify, alas +} + +sub eval { + + # 'my' would make it visible from user code + # but so does local! --tchrist + # Remember: this localizes @DB::res, not @main::res. + local @res; + { + + # Try to keep the user code from messing with us. Save these so that + # even if the eval'ed code changes them, we can put them back again. + # Needed because the user could refer directly to the debugger's + # package globals (and any 'my' variables in this containing scope) + # inside the eval(), and we want to try to stay safe. + local $otrace = $trace; + local $osingle = $single; + local $od = $^D; + + # Untaint the incoming eval() argument. + { ($evalarg) = $evalarg =~ /(.*)/s; } + + # $usercontext built in DB::DB near the comment + # "set up the context for DB::eval ..." + # Evaluate and save any results. + @res = eval "$usercontext $evalarg;\n"; # '\n' for nice recursive debug + + # Restore those old values. + $trace = $otrace; + $single = $osingle; + $^D = $od; + } + + # Save the current value of $@, and preserve it in the debugger's copy + # of the saved precious globals. + my $at = $@; + + # Since we're only saving $@, we only have to localize the array element + # that it will be stored in. + local $saved[0]; # Preserve the old value of $@ + eval { &DB::save }; + + # Now see whether we need to report an error back to the user. + if ($at) { + local $\ = ''; + print $OUT $at; + } + + # Display as required by the caller. $onetimeDump and $onetimedumpDepth + # are package globals. + elsif ($onetimeDump) { + if ( $onetimeDump eq 'dump' ) { + local $option{dumpDepth} = $onetimedumpDepth + if defined $onetimedumpDepth; + dumpit( $OUT, \@res ); + } + elsif ( $onetimeDump eq 'methods' ) { + methods( $res[0] ); + } + } ## end elsif ($onetimeDump) + @res; +} ## end sub eval + +############################################## End lexical danger zone + +# After this point it is safe to introduce lexicals. +# The code being debugged will be executing in its own context, and +# can't see the inside of the debugger. +# +# However, one should not overdo it: leave as much control from outside as +# possible. If you make something a lexical, it's not going to be addressable +# from outside the debugger even if you know its name. + +# This file is automatically included if you do perl -d. +# It's probably not useful to include this yourself. +# +# Before venturing further into these twisty passages, it is +# wise to read the perldebguts man page or risk the ire of dragons. +# +# (It should be noted that perldebguts will tell you a lot about +# the underlying mechanics of how the debugger interfaces into the +# Perl interpreter, but not a lot about the debugger itself. The new +# comments in this code try to address this problem.) + +# Note that no subroutine call is possible until &DB::sub is defined +# (for subroutines defined outside of the package DB). In fact the same is +# true if $deep is not defined. + +# Enhanced by ilya@math.ohio-state.edu (Ilya Zakharevich) + +# modified Perl debugger, to be run from Emacs in perldb-mode +# Ray Lischner (uunet!mntgfx!lisch) as of 5 Nov 1990 +# Johan Vromans -- upgrade to 4.0 pl 10 +# Ilya Zakharevich -- patches after 5.001 (and some before ;-) +######################################################################## + + +# Needed for the statement after exec(): +# +# This BEGIN block is simply used to switch off warnings during debugger +# compilation. Probably it would be better practice to fix the warnings, +# but this is how it's done at the moment. + +BEGIN { + $ini_warn = $^W; + $^W = 0; +} # Switch compilation warnings off until another BEGIN. + +local ($^W) = 0; # Switch run-time warnings off during init. + + +BEGIN { + # ensure we can share our non-threaded variables or no-op + if ($ENV{PERL5DB_THREADED}) { + require threads; + require threads::shared; + import threads::shared qw(share); + $DBGR; + share(\$DBGR); + lock($DBGR); + print "Threads support enabled\n"; + } else { + *lock = sub(*) {}; + *share = sub(\[$@%]) {}; + } +} + +# These variables control the execution of 'dumpvar.pl'. +{ + package dumpvar; + use vars qw( + $hashDepth + $arrayDepth + $dumpDBFiles + $dumpPackages + $quoteHighBit + $printUndef + $globPrint + $usageOnly + ); +} + +# used to control die() reporting in diesignal() +{ + package Carp; + use vars qw($CarpLevel); +} + +# without threads, $filename is not defined until DB::DB is called +share($main::{'_<'.$filename}) if defined $filename; + +# Command-line + PERLLIB: +# Save the contents of @INC before they are modified elsewhere. +@ini_INC = @INC; + +# This was an attempt to clear out the previous values of various +# trapped errors. Apparently it didn't help. XXX More info needed! +# $prevwarn = $prevdie = $prevbus = $prevsegv = ''; # Does not help?! + +# We set these variables to safe values. We don't want to blindly turn +# off warnings, because other packages may still want them. +$trace = $signal = $single = 0; # Uninitialized warning suppression + # (local $^W cannot help - other packages!). + +# Default to not exiting when program finishes; print the return +# value when the 'r' command is used to return from a subroutine. +$inhibit_exit = $option{PrintRet} = 1; + +use vars qw($trace_to_depth); + +# Default to 1E9 so it won't be limited to a certain recursion depth. +$trace_to_depth = 1E9; + + +@options = qw( + CommandSet HistFile HistSize + hashDepth arrayDepth dumpDepth + DumpDBFiles DumpPackages DumpReused + compactDump veryCompact quote + HighBit undefPrint globPrint + PrintRet UsageOnly frame + AutoTrace TTY noTTY + ReadLine NonStop LineInfo + maxTraceLen recallCommand ShellBang + pager tkRunning ornaments + signalLevel warnLevel dieLevel + inhibit_exit ImmediateStop bareStringify + CreateTTY RemotePort windowSize + DollarCaretP +); + +@RememberOnROptions = qw(DollarCaretP); + + +use vars qw(%optionVars); + +%optionVars = ( + hashDepth => \$dumpvar::hashDepth, + arrayDepth => \$dumpvar::arrayDepth, + CommandSet => \$CommandSet, + DumpDBFiles => \$dumpvar::dumpDBFiles, + DumpPackages => \$dumpvar::dumpPackages, + DumpReused => \$dumpvar::dumpReused, + HighBit => \$dumpvar::quoteHighBit, + undefPrint => \$dumpvar::printUndef, + globPrint => \$dumpvar::globPrint, + UsageOnly => \$dumpvar::usageOnly, + CreateTTY => \$CreateTTY, + bareStringify => \$dumpvar::bareStringify, + frame => \$frame, + AutoTrace => \$trace, + inhibit_exit => \$inhibit_exit, + maxTraceLen => \$maxtrace, + ImmediateStop => \$ImmediateStop, + RemotePort => \$remoteport, + windowSize => \$window, + HistFile => \$histfile, + HistSize => \$histsize, +); + + +use vars qw(%optionAction); + +%optionAction = ( + compactDump => \&dumpvar::compactDump, + veryCompact => \&dumpvar::veryCompact, + quote => \&dumpvar::quote, + TTY => \&TTY, + noTTY => \&noTTY, + ReadLine => \&ReadLine, + NonStop => \&NonStop, + LineInfo => \&LineInfo, + recallCommand => \&recallCommand, + ShellBang => \&shellBang, + pager => \&pager, + signalLevel => \&signalLevel, + warnLevel => \&warnLevel, + dieLevel => \&dieLevel, + tkRunning => \&tkRunning, + ornaments => \&ornaments, + RemotePort => \&RemotePort, + DollarCaretP => \&DollarCaretP, +); + + +# Note that this list is not complete: several options not listed here +# actually require that dumpvar.pl be loaded for them to work, but are +# not in the table. A subsequent patch will correct this problem; for +# the moment, we're just recommenting, and we are NOT going to change +# function. +use vars qw(%optionRequire); + +%optionRequire = ( + compactDump => 'dumpvar.pl', + veryCompact => 'dumpvar.pl', + quote => 'dumpvar.pl', +); + + +# These guys may be defined in $ENV{PERL5DB} : +$rl = 1 unless defined $rl; +$warnLevel = 1 unless defined $warnLevel; +$dieLevel = 1 unless defined $dieLevel; +$signalLevel = 1 unless defined $signalLevel; +$pre = [] unless defined $pre; +$post = [] unless defined $post; +$pretype = [] unless defined $pretype; +$CreateTTY = 3 unless defined $CreateTTY; +$CommandSet = '580' unless defined $CommandSet; + +share($rl); +share($warnLevel); +share($dieLevel); +share($signalLevel); +share($pre); +share($post); +share($pretype); +share($rl); +share($CreateTTY); +share($CommandSet); + + +warnLevel($warnLevel); +dieLevel($dieLevel); +signalLevel($signalLevel); + + +# This routine makes sure $pager is set up so that '|' can use it. +pager( + + # If PAGER is defined in the environment, use it. + defined $ENV{PAGER} + ? $ENV{PAGER} + + # If not, see if Config.pm defines it. + : eval { require Config } + && defined $Config::Config{pager} + ? $Config::Config{pager} + + # If not, fall back to 'more'. + : 'more' + ) + unless defined $pager; + + +setman(); + +# Set up defaults for command recall and shell escape (note: +# these currently don't work in linemode debugging). +recallCommand("!") unless defined $prc; +shellBang("!") unless defined $psh; + + +sethelp(); + +# If we didn't get a default for the length of eval/stack trace args, +# set it here. +$maxtrace = 400 unless defined $maxtrace; + + +# Save the current contents of the environment; we're about to +# much with it. We'll need this if we have to restart. +use vars qw($ini_pids); +$ini_pids = $ENV{PERLDB_PIDS}; + +use vars qw ($pids $term_pid); + +if ( defined $ENV{PERLDB_PIDS} ) { + + # We're a child. Make us a label out of the current PID structure + # recorded in PERLDB_PIDS plus our (new) PID. Mark us as not having + # a term yet so the parent will give us one later via resetterm(). + + my $env_pids = $ENV{PERLDB_PIDS}; + $pids = "[$env_pids]"; + + # Unless we are on OpenVMS, all programs under the DCL shell run under + # the same PID. + + if (($^O eq 'VMS') && ($env_pids =~ /\b$$\b/)) { + $term_pid = $$; + } + else { + $ENV{PERLDB_PIDS} .= "->$$"; + $term_pid = -1; + } + +} ## end if (defined $ENV{PERLDB_PIDS... +else { + + # We're the parent PID. Initialize PERLDB_PID in case we end up with a + # child debugger, and mark us as the parent, so we'll know to set up + # more TTY's is we have to. + $ENV{PERLDB_PIDS} = "$$"; + $pids = "[pid=$$]"; + $term_pid = $$; +} + +use vars qw($pidprompt); +$pidprompt = ''; + +# Sets up $emacs as a synonym for $slave_editor. +our ($slave_editor); +*emacs = $slave_editor if $slave_editor; # May be used in afterinit()... + + +# As noted, this test really doesn't check accurately that the debugger +# is running at a terminal or not. + +use vars qw($rcfile); +{ + my $dev_tty = (($^O eq 'VMS') ? 'TT:' : '/dev/tty'); + # this is the wrong metric! + $rcfile = ((-e $dev_tty) ? ".perldb" : "perldb.ini"); +} + + +# This wraps a safety test around "do" to read and evaluate the init file. +# +# This isn't really safe, because there's a race +# between checking and opening. The solution is to +# open and fstat the handle, but then you have to read and +# eval the contents. But then the silly thing gets +# your lexical scope, which is unfortunate at best. +sub safe_do { + my $file = shift; + + # Just exactly what part of the word "CORE::" don't you understand? + local $SIG{__WARN__}; + local $SIG{__DIE__}; + + unless ( is_safe_file($file) ) { + CORE::warn < $b} keys(%pf); + my @enabled_statuses = get_list("PERLDB_FILE_ENABLED_$file_idx"); + for my $line_idx (0 .. $#lines) { + _set_breakpoint_enabled_status( + $filename, + $lines[$line_idx], + ($enabled_statuses[$line_idx] ? 1 : ''), + ); + } + } + + return; +} + +sub _restore_options_after_restart +{ + my %options_map = get_list("PERLDB_OPT"); + + while ( my ( $opt, $val ) = each %options_map ) { + $val =~ s/[\\\']/\\$1/g; + parse_options("$opt'$val'"); + } + + return; +} + +sub _restore_globals_after_restart +{ + # restore original @INC + @INC = get_list("PERLDB_INC"); + @ini_INC = @INC; + + # return pre/postprompt actions and typeahead buffer + $pretype = [ get_list("PERLDB_PRETYPE") ]; + $pre = [ get_list("PERLDB_PRE") ]; + $post = [ get_list("PERLDB_POST") ]; + @typeahead = get_list( "PERLDB_TYPEAHEAD", @typeahead ); + + return; +} + + +if ( exists $ENV{PERLDB_RESTART} ) { + + # We're restarting, so we don't need the flag that says to restart anymore. + delete $ENV{PERLDB_RESTART}; + + # $restart = 1; + _restore_shared_globals_after_restart(); + + _restore_breakpoints_and_actions(); + + # restore options + _restore_options_after_restart(); + + _restore_globals_after_restart(); +} ## end if (exists $ENV{PERLDB_RESTART... + + +use vars qw($notty $console $tty $LINEINFO); +use vars qw($lineinfo $doccmd); + +our ($runnonstop); + +# Local autoflush to avoid rt#116769, +# as calling IO::File methods causes an unresolvable loop +# that results in debugger failure. +sub _autoflush { + my $o = select($_[0]); + $|++; + select($o); +} + +if ($notty) { + $runnonstop = 1; + share($runnonstop); +} + + +else { + + # Is Perl being run from a slave editor or graphical debugger? + # If so, don't use readline, and set $slave_editor = 1. + if ($slave_editor = ( @main::ARGV && ( $main::ARGV[0] eq '-emacs' ) )) { + $rl = 0; + shift(@main::ARGV); + } + + #require Term::ReadLine; + + + if ( $^O eq 'cygwin' ) { + + # /dev/tty is binary. use stdin for textmode + undef $console; + } + + + elsif ( $^O eq 'dos' or -e "con" or $^O eq 'MSWin32' ) { + $console = "con"; + } + + + elsif ( $^O eq 'amigaos' ) { + $console = "CONSOLE:"; + } + + + elsif ($^O eq 'VMS') { + $console = 'sys$command'; + } + +# Keep this penultimate, on the grounds that it satisfies a wide variety of +# Unix-like systems that would otherwise need to be identified individually. + + + elsif ( -e "/dev/tty" ) { + $console = "/dev/tty"; + } + +# Keep this last. + + else { + _db_warn("Can't figure out your console, using stdin"); + undef $console; + } + + + if ( ( $^O eq 'MSWin32' ) and ( $slave_editor or defined $ENV{EMACS} ) ) { + + # /dev/tty is binary. use stdin for textmode + $console = undef; + } + + if ( $^O eq 'NetWare' ) { + + # /dev/tty is binary. use stdin for textmode + $console = undef; + } + + # In OS/2, we need to use STDIN to get textmode too, even though + # it pretty much looks like Unix otherwise. + if ( defined $ENV{OS2_SHELL} and ( $slave_editor or $ENV{WINDOWID} ) ) + { # In OS/2 + $console = undef; + } + + + $console = $tty if defined $tty; + + + # Handle socket stuff. + + if ( defined $remoteport ) { + + # If RemotePort was defined in the options, connect input and output + # to the socket. + $IN = $OUT = connect_remoteport(); + } ## end if (defined $remoteport) + + + # Non-socket. + else { + + # Two debuggers running (probably a system or a backtick that invokes + # the debugger itself under the running one). create a new IN and OUT + # filehandle, and do the necessary mojo to create a new tty if we + # know how, and we can. + create_IN_OUT(4) if $CreateTTY & 4; + if ($console) { + + # If we have a console, check to see if there are separate ins and + # outs to open. (They are assumed identical if not.) + + my ( $i, $o ) = split /,/, $console; + $o = $i unless defined $o; + + # read/write on in, or just read, or read on STDIN. + open( IN, '+<', $i ) + || open( IN, '<', $i ) + || open( IN, "<&STDIN" ); + + # read/write/create/clobber out, or write/create/clobber out, + # or merge with STDERR, or merge with STDOUT. + open( OUT, '+>', $o ) + || open( OUT, '>', $o ) + || open( OUT, ">&STDERR" ) + || open( OUT, ">&STDOUT" ); # so we don't dongle stdout + + } ## end if ($console) + elsif ( not defined $console ) { + + # No console. Open STDIN. + open( IN, "<&STDIN" ); + + # merge with STDERR, or with STDOUT. + open( OUT, ">&STDERR" ) + || open( OUT, ">&STDOUT" ); # so we don't dongle stdout + $console = 'STDIN/OUT'; + } ## end elsif (not defined $console) + + # Keep copies of the filehandles so that when the pager runs, it + # can close standard input without clobbering ours. + if ($console or (not defined($console))) { + $IN = \*IN; + $OUT = \*OUT; + } + } ## end elsif (from if(defined $remoteport)) + + # Unbuffer DB::OUT. We need to see responses right away. + _autoflush($OUT); + + # Line info goes to debugger output unless pointed elsewhere. + # Pointing elsewhere makes it possible for slave editors to + # keep track of file and position. We have both a filehandle + # and a I/O description to keep track of. + $LINEINFO = $OUT unless defined $LINEINFO; + $lineinfo = $console unless defined $lineinfo; + # share($LINEINFO); # <- unable to share globs + share($lineinfo); # + + + # Show the debugger greeting. + $header =~ s/.Header: ([^,]+),v(\s+\S+\s+\S+).*$/$1$2/; + unless ($runnonstop) { + local $\ = ''; + local $, = ''; + if ( $term_pid eq '-1' ) { + print $OUT "\nDaughter DB session started...\n"; + } + else { + print $OUT "\nLoading DB routines from $header\n"; + print $OUT ( + "Editor support ", + $slave_editor ? "enabled" : "available", ".\n" + ); + print $OUT +"\nEnter h or 'h h' for help, or '$doccmd perldebug' for more help.\n\n"; + } ## end else [ if ($term_pid eq '-1') + } ## end unless ($runnonstop) +} ## end else [ if ($notty) + +# XXX This looks like a bug to me. +# Why copy to @ARGS and then futz with @args? +@ARGS = @ARGV; +# for (@args) { + # Make sure backslashes before single quotes are stripped out, and + # keep args unless they are numeric (XXX why?) + # s/\'/\\\'/g; # removed while not justified understandably + # s/(.*)/'$1'/ unless /^-?[\d.]+$/; # ditto +# } + +# If there was an afterinit() sub defined, call it. It will get +# executed in our scope, so it can fiddle with debugger globals. +if ( defined &afterinit ) { # May be defined in $rcfile + afterinit(); +} + +# Inform us about "Stack dump during die enabled ..." in dieLevel(). +use vars qw($I_m_init); + +$I_m_init = 1; + +############################################################ Subroutines + + +# $cmd cannot be an our() variable unfortunately (possible perl bug?). + +use vars qw( + $action + $cmd + $file + $filename_ini + $finished + %had_breakpoints + $level + $max + $package + $try +); + +our ( + %alias, + $doret, + $end, + $fall_off_end, + $incr, + $laststep, + $rc, + $sh, + $stack_depth, + @stack, + @to_watch, + @old_watch, +); + +sub _DB__determine_if_we_should_break +{ + # if we have something here, see if we should break. + # $stop is lexical and local to this block - $action on the other hand + # is global. + my $stop; + + if ( $dbline{$line} + && _is_breakpoint_enabled($filename, $line) + && (( $stop, $action ) = split( /\0/, $dbline{$line} ) ) ) + { + + # Stop if the stop criterion says to just stop. + if ( $stop eq '1' ) { + $signal |= 1; + } + + # It's a conditional stop; eval it in the user's context and + # see if we should stop. If so, remove the one-time sigil. + elsif ($stop) { + $evalarg = "\$DB::signal |= 1 if do {$stop}"; + # The &-call is here to ascertain the mutability of @_. + &DB::eval; + # If the breakpoint is temporary, then delete its enabled status. + if ($dbline{$line} =~ s/;9($|\0)/$1/) { + _cancel_breakpoint_temp_enabled_status($filename, $line); + } + } + } ## end if ($dbline{$line} && ... +} + +sub _DB__is_finished { + if ($finished and $level <= 1) { + end_report(); + return 1; + } + else { + return; + } +} + +sub _DB__read_next_cmd +{ + my ($tid) = @_; + + # We have a terminal, or can get one ... + if (!$term) { + setterm(); + } + + # ... and it belongs to this PID or we get one for this PID ... + if ($term_pid != $$) { + resetterm(1); + } + + # ... and we got a line of command input ... + $cmd = DB::readline( + "$pidprompt $tid DB" + . ( '<' x $level ) + . ( $#hist + 1 ) + . ( '>' x $level ) . " " + ); + + return defined($cmd); +} + +sub _DB__trim_command_and_return_first_component { + my ($obj) = @_; + + $cmd =~ s/\A\s+//s; # trim annoying leading whitespace + $cmd =~ s/\s+\z//s; # trim annoying trailing whitespace + + # A single-character debugger command can be immediately followed by its + # argument if they aren't both alphanumeric; otherwise require space + # between commands and arguments: + my ($verb, $args) = $cmd =~ m{\A(.\b|\S*)\s*(.*)}s; + + $obj->cmd_verb($verb); + $obj->cmd_args($args); + + return; +} + +sub _DB__handle_f_command { + my ($obj) = @_; + + if ($file = $obj->cmd_args) { + # help for no arguments (old-style was return from sub). + if ( !$file ) { + print $OUT + "The old f command is now the r command.\n"; # hint + print $OUT "The new f command switches filenames.\n"; + next CMD; + } ## end if (!$file) + + # if not in magic file list, try a close match. + if ( !defined $main::{ '_<' . $file } ) { + if ( ($try) = grep( m#^_<.*$file#, keys %main:: ) ) { + { + $try = substr( $try, 2 ); + print $OUT "Choosing $try matching '$file':\n"; + $file = $try; + } + } ## end if (($try) = grep(m#^_<.*$file#... + } ## end if (!defined $main::{ ... + + # If not successfully switched now, we failed. + if ( !defined $main::{ '_<' . $file } ) { + print $OUT "No file matching '$file' is loaded.\n"; + next CMD; + } + + # We switched, so switch the debugger internals around. + elsif ( $file ne $filename ) { + *dbline = $main::{ '_<' . $file }; + $max = $#dbline; + $filename = $file; + $start = 1; + $cmd = "l"; + } ## end elsif ($file ne $filename) + + # We didn't switch; say we didn't. + else { + print $OUT "Already in $file.\n"; + next CMD; + } + } + + return; +} + +sub _DB__handle_dot_command { + my ($obj) = @_; + + # . command. + if ($obj->_is_full('.')) { + $incr = -1; # stay at current line + + # Reset everything to the old location. + $start = $line; + $filename = $filename_ini; + *dbline = $main::{ '_<' . $filename }; + $max = $#dbline; + + # Now where are we? + print_lineinfo($obj->position()); + next CMD; + } + + return; +} + +sub _DB__handle_y_command { + my ($obj) = @_; + + if (my ($match_level, $match_vars) + = $obj->cmd_args =~ /\A(?:(\d*)\s*(.*))?\z/) { + + # See if we've got the necessary support. + if (!eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require PadWalker; PadWalker->VERSION(0.08) }) { + my $Err = $@; + _db_warn( + $Err =~ /locate/ + ? "PadWalker module not found - please install\n" + : $Err + ); + next CMD; + } + + # Load up dumpvar if we don't have it. If we can, that is. + do 'dumpvar.pl' || die $@ unless defined &main::dumpvar; + defined &main::dumpvar + or print $OUT "dumpvar.pl not available.\n" + and next CMD; + + # Got all the modules we need. Find them and print them. + my @vars = split( ' ', $match_vars || '' ); + + # Find the pad. + my $h = eval { PadWalker::peek_my( ( $match_level || 0 ) + 2 ) }; + + # Oops. Can't find it. + if (my $Err = $@) { + $Err =~ s/ at .*//; + _db_warn($Err); + next CMD; + } + + # Show the desired vars with dumplex(). + my $savout = select($OUT); + + # Have dumplex dump the lexicals. + foreach my $key (sort keys %$h) { + dumpvar::dumplex( $key, $h->{$key}, + defined $option{dumpDepth} ? $option{dumpDepth} : -1, + @vars ); + } + select($savout); + next CMD; + } +} + +sub _DB__handle_c_command { + my ($obj) = @_; + + my $i = $obj->cmd_args; + + if ($i =~ m#\A[\w:]*\z#) { + + # Hey, show's over. The debugged program finished + # executing already. + next CMD if _DB__is_finished(); + + # Capture the place to put a one-time break. + $subname = $i; + + # Probably not needed, since we finish an interactive + # sub-session anyway... + # local $filename = $filename; + # local *dbline = *dbline; # XXX Would this work?! + # + # The above question wonders if localizing the alias + # to the magic array works or not. Since it's commented + # out, we'll just leave that to speculation for now. + + # If the "subname" isn't all digits, we'll assume it + # is a subroutine name, and try to find it. + if ( $subname =~ /\D/ ) { # subroutine name + # Qualify it to the current package unless it's + # already qualified. + $subname = $package . "::" . $subname + unless $subname =~ /::/; + + # find_sub will return "file:line_number" corresponding + # to where the subroutine is defined; we call find_sub, + # break up the return value, and assign it in one + # operation. + ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(.*)$/ ); + + # Force the line number to be numeric. + $i = $i + 0; + + # If we got a line number, we found the sub. + if ($i) { + + # Switch all the debugger's internals around so + # we're actually working with that file. + $filename = $file; + *dbline = $main::{ '_<' . $filename }; + + # Mark that there's a breakpoint in this file. + $had_breakpoints{$filename} |= 1; + + # Scan forward to the first executable line + # after the 'sub whatever' line. + $max = $#dbline; + my $_line_num = $i; + while ($dbline[$_line_num] == 0 && $_line_num< $max) + { + $_line_num++; + } + $i = $_line_num; + } ## end if ($i) + + # We didn't find a sub by that name. + else { + print $OUT "Subroutine $subname not found.\n"; + next CMD; + } + } ## end if ($subname =~ /\D/) + + # At this point, either the subname was all digits (an + # absolute line-break request) or we've scanned through + # the code following the definition of the sub, looking + # for an executable, which we may or may not have found. + # + # If $i (which we set $subname from) is non-zero, we + # got a request to break at some line somewhere. On + # one hand, if there wasn't any real subroutine name + # involved, this will be a request to break in the current + # file at the specified line, so we have to check to make + # sure that the line specified really is breakable. + # + # On the other hand, if there was a subname supplied, the + # preceding block has moved us to the proper file and + # location within that file, and then scanned forward + # looking for the next executable line. We have to make + # sure that one was found. + # + # On the gripping hand, we can't do anything unless the + # current value of $i points to a valid breakable line. + # Check that. + if ($i) { + + # Breakable? + if ( $dbline[$i] == 0 ) { + print $OUT "Line $i not breakable.\n"; + next CMD; + } + + # Yes. Set up the one-time-break sigil. + $dbline{$i} =~ s/($|\0)/;9$1/; # add one-time-only b.p. + _enable_breakpoint_temp_enabled_status($filename, $i); + } ## end if ($i) + + # Turn off stack tracing from here up. + for my $j (0 .. $stack_depth) { + $stack[ $j ] &= ~1; + } + last CMD; + } + + return; +} + +sub _DB__handle_forward_slash_command { + my ($obj) = @_; + + # The pattern as a string. + use vars qw($inpat); + + if (($inpat) = $cmd =~ m#\A/(.*)\z#) { + + # Remove the final slash. + $inpat =~ s:([^\\])/$:$1:; + + # If the pattern isn't null ... + if ( $inpat ne "" ) { + + # Turn off warn and die processing for a bit. + local $SIG{__DIE__}; + local $SIG{__WARN__}; + + # Create the pattern. + eval 'no strict q/vars/; $inpat =~ m' . "\a$inpat\a"; + if ( $@ ne "" ) { + + # Oops. Bad pattern. No biscuit. + # Print the eval error and go back for more + # commands. + print {$OUT} "$@"; + next CMD; + } + $obj->pat($inpat); + } ## end if ($inpat ne "") + + # Set up to stop on wrap-around. + $end = $start; + + # Don't move off the current line. + $incr = -1; + + my $pat = $obj->pat; + + # Done in eval so nothing breaks if the pattern + # does something weird. + eval + { + no strict q/vars/; + for (;;) { + # Move ahead one line. + ++$start; + + # Wrap if we pass the last line. + if ($start > $max) { + $start = 1; + } + + # Stop if we have gotten back to this line again, + last if ($start == $end); + + # A hit! (Note, though, that we are doing + # case-insensitive matching. Maybe a qr// + # expression would be better, so the user could + # do case-sensitive matching if desired. + if ($dbline[$start] =~ m/$pat/i) { + if ($slave_editor) { + # Handle proper escaping in the slave. + print {$OUT} "\032\032$filename:$start:0\n"; + } + else { + # Just print the line normally. + print {$OUT} "$start:\t",$dbline[$start],"\n"; + } + # And quit since we found something. + last; + } + } + }; + + if ($@) { + warn $@; + } + + # If we wrapped, there never was a match. + if ( $start == $end ) { + print {$OUT} "/$pat/: not found\n"; + } + next CMD; + } + + return; +} + +sub _DB__handle_question_mark_command { + my ($obj) = @_; + + # ? - backward pattern search. + if (my ($inpat) = $cmd =~ m#\A\?(.*)\z#) { + + # Get the pattern, remove trailing question mark. + $inpat =~ s:([^\\])\?$:$1:; + + # If we've got one ... + if ( $inpat ne "" ) { + + # Turn off die & warn handlers. + local $SIG{__DIE__}; + local $SIG{__WARN__}; + eval '$inpat =~ m' . "\a$inpat\a"; + + if ( $@ ne "" ) { + + # Ouch. Not good. Print the error. + print $OUT $@; + next CMD; + } + $obj->pat($inpat); + } ## end if ($inpat ne "") + + # Where we are now is where to stop after wraparound. + $end = $start; + + # Don't move away from this line. + $incr = -1; + + my $pat = $obj->pat; + # Search inside the eval to prevent pattern badness + # from killing us. + eval { + no strict q/vars/; + for (;;) { + # Back up a line. + --$start; + + # Wrap if we pass the first line. + + $start = $max if ($start <= 0); + + # Quit if we get back where we started, + last if ($start == $end); + + # Match? + if ($dbline[$start] =~ m/$pat/i) { + if ($slave_editor) { + # Yep, follow slave editor requirements. + print $OUT "\032\032$filename:$start:0\n"; + } + else { + # Yep, just print normally. + print $OUT "$start:\t",$dbline[$start],"\n"; + } + + # Found, so done. + last; + } + } + }; + + # Say we failed if the loop never found anything, + if ( $start == $end ) { + print {$OUT} "?$pat?: not found\n"; + } + next CMD; + } + + return; +} + +sub _DB__handle_restart_and_rerun_commands { + my ($obj) = @_; + + my $cmd_cmd = $obj->cmd_verb; + my $cmd_params = $obj->cmd_args; + # R - restart execution. + # rerun - controlled restart execution. + if ($cmd_cmd eq 'rerun' or $cmd_params eq '') { + + # Change directory to the initial current working directory on + # the script startup, so if the debugged program changed the + # directory, then we will still be able to find the path to the + # the program. (perl 5 RT #121509 ). + chdir ($_initial_cwd); + + my @args = ($cmd_cmd eq 'R' ? restart() : rerun($cmd_params)); + + # Close all non-system fds for a clean restart. A more + # correct method would be to close all fds that were not + # open when the process started, but this seems to be + # hard. See "debugger 'R'estart and open database + # connections" on p5p. + + my $max_fd = 1024; # default if POSIX can't be loaded + if (eval { require POSIX }) { + eval { $max_fd = POSIX::sysconf(POSIX::_SC_OPEN_MAX()) }; + } + + if (defined $max_fd) { + foreach ($^F+1 .. $max_fd-1) { + next unless open FD_TO_CLOSE, "<&=$_"; + close(FD_TO_CLOSE); + } + } + + # And run Perl again. We use exec() to keep the + # PID stable (and that way $ini_pids is still valid). + exec(@args) or print {$OUT} "exec failed: $!\n"; + + last CMD; + } + + return; +} + +sub _DB__handle_run_command_in_pager_command { + my ($obj) = @_; + + if ($cmd =~ m#\A\|\|?\s*[^|]#) { + if ( $pager =~ /^\|/ ) { + + # Default pager is into a pipe. Redirect I/O. + open( SAVEOUT, ">&STDOUT" ) + || _db_warn("Can't save STDOUT"); + open( STDOUT, ">&OUT" ) + || _db_warn("Can't redirect STDOUT"); + } ## end if ($pager =~ /^\|/) + else { + + # Not into a pipe. STDOUT is safe. + open( SAVEOUT, ">&OUT" ) || _db_warn("Can't save DB::OUT"); + } + + # Fix up environment to record we have less if so. + fix_less(); + + unless ( $obj->piped(scalar ( open( OUT, $pager ) ) ) ) { + + # Couldn't open pipe to pager. + _db_warn("Can't pipe output to '$pager'"); + if ( $pager =~ /^\|/ ) { + + # Redirect I/O back again. + open( OUT, ">&STDOUT" ) # XXX: lost message + || _db_warn("Can't restore DB::OUT"); + open( STDOUT, ">&SAVEOUT" ) + || _db_warn("Can't restore STDOUT"); + close(SAVEOUT); + } ## end if ($pager =~ /^\|/) + else { + + # Redirect I/O. STDOUT already safe. + open( OUT, ">&STDOUT" ) # XXX: lost message + || _db_warn("Can't restore DB::OUT"); + } + next CMD; + } ## end unless ($piped = open(OUT,... + + # Set up broken-pipe handler if necessary. + $SIG{PIPE} = \&DB::catch + if $pager =~ /^\|/ + && ( "" eq $SIG{PIPE} || "DEFAULT" eq $SIG{PIPE} ); + + _autoflush(\*OUT); + # Save current filehandle, and put it back. + $obj->selected(scalar( select(OUT) )); + # Don't put it back if pager was a pipe. + if ($cmd !~ /\A\|\|/) + { + select($obj->selected()); + $obj->selected(""); + } + + # Trim off the pipe symbols and run the command now. + $cmd =~ s#\A\|+\s*##; + redo PIPE; + } + + return; +} + +sub _DB__handle_m_command { + my ($obj) = @_; + + if ($cmd =~ s#\Am\s+([\w:]+)\s*\z# #) { + methods($1); + next CMD; + } + + # m expr - set up DB::eval to do the work + if ($cmd =~ s#\Am\b# #) { # Rest gets done by DB::eval() + $onetimeDump = 'methods'; # method output gets used there + } + + return; +} + +sub _DB__at_end_of_every_command { + my ($obj) = @_; + + # At the end of every command: + if ($obj->piped) { + + # Unhook the pipe mechanism now. + if ( $pager =~ /^\|/ ) { + + # No error from the child. + $? = 0; + + # we cannot warn here: the handle is missing --tchrist + close(OUT) || print SAVEOUT "\nCan't close DB::OUT\n"; + + # most of the $? crud was coping with broken cshisms + # $? is explicitly set to 0, so this never runs. + if ($?) { + print SAVEOUT "Pager '$pager' failed: "; + if ( $? == -1 ) { + print SAVEOUT "shell returned -1\n"; + } + elsif ( $? >> 8 ) { + print SAVEOUT ( $? & 127 ) + ? " (SIG#" . ( $? & 127 ) . ")" + : "", ( $? & 128 ) ? " -- core dumped" : "", "\n"; + } + else { + print SAVEOUT "status ", ( $? >> 8 ), "\n"; + } + } ## end if ($?) + + # Reopen filehandle for our output (if we can) and + # restore STDOUT (if we can). + open( OUT, ">&STDOUT" ) || _db_warn("Can't restore DB::OUT"); + open( STDOUT, ">&SAVEOUT" ) + || _db_warn("Can't restore STDOUT"); + + # Turn off pipe exception handler if necessary. + $SIG{PIPE} = "DEFAULT" if $SIG{PIPE} eq \&DB::catch; + + # Will stop ignoring SIGPIPE if done like nohup(1) + # does SIGINT but Perl doesn't give us a choice. + } ## end if ($pager =~ /^\|/) + else { + + # Non-piped "pager". Just restore STDOUT. + open( OUT, ">&SAVEOUT" ) || _db_warn("Can't restore DB::OUT"); + } + + # Let Readline know about the new filehandles. + reset_IN_OUT( \*IN, \*OUT ); + + # Close filehandle pager was using, restore the normal one + # if necessary, + close(SAVEOUT); + + if ($obj->selected() ne "") { + select($obj->selected); + $obj->selected(""); + } + + # No pipes now. + $obj->piped(""); + } ## end if ($piped) + + return; +} + +sub _DB__handle_watch_expressions +{ + my $self = shift; + + if ( $DB::trace & 2 ) { + for my $n (0 .. $#DB::to_watch) { + $DB::evalarg = $DB::to_watch[$n]; + local $DB::onetimeDump; # Tell DB::eval() to not output results + + # Fix context DB::eval() wants to return an array, but + # we need a scalar here. + my ($val) = join( "', '", DB::eval(@_) ); + $val = ( ( defined $val ) ? "'$val'" : 'undef' ); + + # Did it change? + if ( $val ne $DB::old_watch[$n] ) { + + # Yep! Show the difference, and fake an interrupt. + $DB::signal = 1; + print {$DB::OUT} < { t => 'm', v => '_handle_dash_command', }, + '.' => { t => 's', v => \&_DB__handle_dot_command, }, + '=' => { t => 'm', v => '_handle_equal_sign_command', }, + 'H' => { t => 'm', v => '_handle_H_command', }, + 'S' => { t => 'm', v => '_handle_S_command', }, + 'T' => { t => 'm', v => '_handle_T_command', }, + 'W' => { t => 'm', v => '_handle_W_command', }, + 'c' => { t => 's', v => \&_DB__handle_c_command, }, + 'f' => { t => 's', v => \&_DB__handle_f_command, }, + 'm' => { t => 's', v => \&_DB__handle_m_command, }, + 'n' => { t => 'm', v => '_handle_n_command', }, + 'p' => { t => 'm', v => '_handle_p_command', }, + 'q' => { t => 'm', v => '_handle_q_command', }, + 'r' => { t => 'm', v => '_handle_r_command', }, + 's' => { t => 'm', v => '_handle_s_command', }, + 'save' => { t => 'm', v => '_handle_save_command', }, + 'source' => { t => 'm', v => '_handle_source_command', }, + 't' => { t => 'm', v => '_handle_t_command', }, + 'w' => { t => 'm', v => '_handle_w_command', }, + 'x' => { t => 'm', v => '_handle_x_command', }, + 'y' => { t => 's', v => \&_DB__handle_y_command, }, + (map { $_ => { t => 'm', v => '_handle_V_command_and_X_command', }, } + ('X', 'V')), + (map { $_ => { t => 'm', v => '_handle_enable_disable_commands', }, } + qw(enable disable)), + (map { $_ => + { t => 's', v => \&_DB__handle_restart_and_rerun_commands, }, + } qw(R rerun)), + (map { $_ => {t => 'm', v => '_handle_cmd_wrapper_commands' }, } + qw(a A b B e E h i l L M o O v w W)), +); +}; + +sub DB { + + # lock the debugger and get the thread id for the prompt + lock($DBGR); + my $tid; + my $position; + my ($prefix, $after, $infix); + my $pat; + my $explicit_stop; + my $piped; + my $selected; + + if ($ENV{PERL5DB_THREADED}) { + $tid = eval { "[".threads->tid."]" }; + } + + my $cmd_verb; + my $cmd_args; + + my $obj = DB::Obj->new( + { + position => \$position, + prefix => \$prefix, + after => \$after, + explicit_stop => \$explicit_stop, + infix => \$infix, + cmd_args => \$cmd_args, + cmd_verb => \$cmd_verb, + pat => \$pat, + piped => \$piped, + selected => \$selected, + }, + ); + + $obj->_DB_on_init__initialize_globals(@_); + + # Preserve current values of $@, $!, $^E, $,, $/, $\, $^W. + # The code being debugged may have altered them. + DB::save(); + + # Since DB::DB gets called after every line, we can use caller() to + # figure out where we last were executing. Sneaky, eh? This works because + # caller is returning all the extra information when called from the + # debugger. + local ( $package, $filename, $line ) = caller; + $filename_ini = $filename; + + # set up the context for DB::eval, so it can properly execute + # code on behalf of the user. We add the package in so that the + # code is eval'ed in the proper package (not in the debugger!). + local $usercontext = _calc_usercontext($package); + + # Create an alias to the active file magical array to simplify + # the code here. + local (*dbline) = $main::{ '_<' . $filename }; + + # Last line in the program. + $max = $#dbline; + + # The &-call is here to ascertain the mutability of @_. + &_DB__determine_if_we_should_break; + + # Preserve the current stop-or-not, and see if any of the W + # (watch expressions) has changed. + my $was_signal = $signal; + + # If we have any watch expressions ... + _DB__handle_watch_expressions($obj); + + + # If there's a user-defined DB::watchfunction, call it with the + # current package, filename, and line. The function executes in + # the DB:: package. + if ( $trace & 4 ) { # User-installed watch + return + if watchfunction( $package, $filename, $line ) + and not $single + and not $was_signal + and not( $trace & ~4 ); + } ## end if ($trace & 4) + + # Pick up any alteration to $signal in the watchfunction, and + # turn off the signal now. + $was_signal = $signal; + $signal = 0; + + + # Make sure that we always print if asked for explicitly regardless + # of $trace_to_depth . + $explicit_stop = ($single || $was_signal); + + # Check to see if we should grab control ($single true, + # trace set appropriately, or we got a signal). + if ( $explicit_stop || ( $trace & 1 ) ) { + $obj->_DB__grab_control(@_); + } ## end if ($single || ($trace... + + + # If there's an action, do it now. + if ($action) { + $evalarg = $action; + # The &-call is here to ascertain the mutability of @_. + &DB::eval; + } + + # Are we nested another level (e.g., did we evaluate a function + # that had a breakpoint in it at the debugger prompt)? + if ( $single || $was_signal ) { + + # Yes, go down a level. + local $level = $level + 1; + + # Do any pre-prompt actions. + foreach $evalarg (@$pre) { + # The &-call is here to ascertain the mutability of @_. + &DB::eval; + } + + # Complain about too much recursion if we passed the limit. + if ($single & 4) { + print $OUT $stack_depth . " levels deep in subroutine calls!\n"; + } + + # The line we're currently on. Set $incr to -1 to stay here + # until we get a command that tells us to advance. + $start = $line; + $incr = -1; # for backward motion. + + # Tack preprompt debugger actions ahead of any actual input. + @typeahead = ( @$pretype, @typeahead ); + + + # The big command dispatch loop. It keeps running until the + # user yields up control again. + # + # If we have a terminal for input, and we get something back + # from readline(), keep on processing. + + CMD: + while (_DB__read_next_cmd($tid)) + { + + share($cmd); + # ... try to execute the input as debugger commands. + + # Don't stop running. + $single = 0; + + # No signal is active. + $signal = 0; + + # Handle continued commands (ending with \): + if ($cmd =~ s/\\\z/\n/) { + $cmd .= DB::readline(" cont: "); + redo CMD; + } + + + # Empty input means repeat the last command. + if ($cmd eq '') { + $cmd = $laststep; + } + chomp($cmd); # get rid of the annoying extra newline + if (length($cmd) >= 2) { + push( @hist, $cmd ); + } + push( @truehist, $cmd ); + share(@hist); + share(@truehist); + + # This is a restart point for commands that didn't arrive + # via direct user input. It allows us to 'redo PIPE' to + # re-execute command processing without reading a new command. + PIPE: { + _DB__trim_command_and_return_first_component($obj); + + + # See if there's an alias for the command, and set it up if so. + if ( $alias{$cmd_verb} ) { + + # Squelch signal handling; we want to keep control here + # if something goes loco during the alias eval. + local $SIG{__DIE__}; + local $SIG{__WARN__}; + + # This is a command, so we eval it in the DEBUGGER's + # scope! Otherwise, we can't see the special debugger + # variables, or get to the debugger's subs. (Well, we + # _could_, but why make it even more complicated?) + eval "\$cmd =~ $alias{$cmd_verb}"; + if ($@) { + local $\ = ''; + print $OUT "Couldn't evaluate '$cmd_verb' alias: $@"; + next CMD; + } + _DB__trim_command_and_return_first_component($obj); + } ## end if ($alias{$cmd_verb}) + + + # All of these commands were remapped in perl 5.8.0; + # we send them off to the secondary dispatcher (see below). + $obj->_handle_special_char_cmd_wrapper_commands; + _DB__trim_command_and_return_first_component($obj); + + if (my $cmd_rec = $cmd_lookup{$cmd_verb}) { + my $type = $cmd_rec->{t}; + my $val = $cmd_rec->{v}; + if ($type eq 'm') { + $obj->$val(); + } + elsif ($type eq 's') { + $val->($obj); + } + } + + + _DB__handle_forward_slash_command($obj); + + + _DB__handle_question_mark_command($obj); + + + # $rc - recall command. + $obj->_handle_rc_recall_command; + + + $obj->_handle_sh_command; + + + $obj->_handle_rc_search_history_command; + + + + $obj->_handle_doc_command; + + + # || - run command in the pager, with output to DB::OUT. + _DB__handle_run_command_in_pager_command($obj); + + + } # PIPE: + + # trace an expression + $cmd =~ s/^t\s/\$DB::trace |= 1;\n/; + + # Make sure the flag that says "the debugger's running" is + # still on, to make sure we get control again. + $evalarg = "\$^D = \$^D | \$DB::db_stop;\n$cmd"; + + # Run *our* eval that executes in the caller's context. + # The &-call is here to ascertain the mutability of @_. + &DB::eval; + + # Turn off the one-time-dump stuff now. + if ($onetimeDump) { + $onetimeDump = undef; + $onetimedumpDepth = undef; + } + elsif ( $term_pid == $$ ) { + eval { # May run under miniperl, when not available... + STDOUT->flush(); + STDERR->flush(); + }; + + # XXX If this is the master pid, print a newline. + print {$OUT} "\n"; + } + } ## end while (($term || &setterm... + + + continue { # CMD: + _DB__at_end_of_every_command($obj); + } # CMD: + + + # No more commands? Quit. + $fall_off_end = 1 unless defined $cmd; # Emulate 'q' on EOF + + # Evaluate post-prompt commands. + foreach $evalarg (@$post) { + # The &-call is here to ascertain the mutability of @_. + &DB::eval; + } + } # if ($single || $signal) + + # Put the user's globals back where you found them. + ( $@, $!, $^E, $,, $/, $\, $^W ) = @saved; + (); +} ## end sub DB + +# Because DB::Obj is used above, +# +# my $obj = DB::Obj->new( +# +# The following package declaration must come before that, +# or else runtime errors will occur with +# +# PERLDB_OPTS="autotrace nonstop" +# +# ( rt#116771 ) +BEGIN { + +package DB::Obj; + +sub new { + my $class = shift; + + my $self = bless {}, $class; + + $self->_init(@_); + + return $self; +} + +sub _init { + my ($self, $args) = @_; + + %{$self} = (%$self, %$args); + + return; +} + +{ + no strict 'refs'; + foreach my $slot_name (qw( + after explicit_stop infix pat piped position prefix selected cmd_verb + cmd_args + )) { + my $slot = $slot_name; + *{$slot} = sub { + my $self = shift; + + if (@_) { + ${ $self->{$slot} } = shift; + } + + return ${ $self->{$slot} }; + }; + + *{"append_to_$slot"} = sub { + my $self = shift; + my $s = shift; + + return $self->$slot($self->$slot . $s); + }; + } +} + +sub _DB_on_init__initialize_globals +{ + my $self = shift; + + # Check for whether we should be running continuously or not. + # _After_ the perl program is compiled, $single is set to 1: + if ( $single and not $second_time++ ) { + + # Options say run non-stop. Run until we get an interrupt. + if ($runnonstop) { # Disable until signal + # If there's any call stack in place, turn off single + # stepping into subs throughout the stack. + for my $i (0 .. $stack_depth) { + $stack[ $i ] &= ~1; + } + + # And we are now no longer in single-step mode. + $single = 0; + + # If we simply returned at this point, we wouldn't get + # the trace info. Fall on through. + # return; + } ## end if ($runnonstop) + + elsif ($ImmediateStop) { + + # We are supposed to stop here; XXX probably a break. + $ImmediateStop = 0; # We've processed it; turn it off + $signal = 1; # Simulate an interrupt to force + # us into the command loop + } + } ## end if ($single and not $second_time... + + # If we're in single-step mode, or an interrupt (real or fake) + # has occurred, turn off non-stop mode. + $runnonstop = 0 if $single or $signal; + + return; +} + +sub _my_print_lineinfo +{ + my ($self, $i, $incr_pos) = @_; + + if ($frame) { + # Print it indented if tracing is on. + DB::print_lineinfo( ' ' x $stack_depth, + "$i:\t$DB::dbline[$i]" . $self->after ); + } + else { + DB::depth_print_lineinfo($self->explicit_stop, $incr_pos); + } +} + +sub _curr_line { + return $DB::dbline[$line]; +} + +sub _is_full { + my ($self, $letter) = @_; + + return ($DB::cmd eq $letter); +} + +sub _DB__grab_control +{ + my $self = shift; + + # Yes, grab control. + if ($slave_editor) { + + # Tell the editor to update its position. + $self->position("\032\032${DB::filename}:$line:0\n"); + DB::print_lineinfo($self->position()); + } + + + elsif ( $DB::package eq 'DB::fake' ) { + + # Fallen off the end already. + if (!$DB::term) { + DB::setterm(); + } + + DB::print_help(< to quit or B to restart, +use B I to avoid stopping after program termination, +B, B or B to get additional info. +EOP + + # Set the DB::eval context appropriately. + # At program termination disable any user actions. + $DB::action = undef; + + $DB::package = 'main'; + $DB::usercontext = DB::_calc_usercontext($DB::package); + } ## end elsif ($package eq 'DB::fake') + + + else { + + + # Still somewhere in the midst of execution. Set up the + # debugger prompt. + $DB::sub =~ s/\'/::/; # Swap Perl 4 package separators (') to + # Perl 5 ones (sorry, we don't print Klingon + #module names) + + $self->prefix($DB::sub =~ /::/ ? "" : ($DB::package . '::')); + $self->append_to_prefix( "$DB::sub(${DB::filename}:" ); + $self->after( $self->_curr_line =~ /\n$/ ? '' : "\n" ); + + # Break up the prompt if it's really long. + if ( length($self->prefix()) > 30 ) { + $self->position($self->prefix . "$line):\n$line:\t" . $self->_curr_line . $self->after); + $self->prefix(""); + $self->infix(":\t"); + } + else { + $self->infix("):\t"); + $self->position( + $self->prefix . $line. $self->infix + . $self->_curr_line . $self->after + ); + } + + # Print current line info, indenting if necessary. + $self->_my_print_lineinfo($line, $self->position); + + my $i; + my $line_i = sub { return $DB::dbline[$i]; }; + + # Scan forward, stopping at either the end or the next + # unbreakable line. + for ( $i = $line + 1 ; $i <= $DB::max && $line_i->() == 0 ; ++$i ) + { #{ vi + + # Drop out on null statements, block closers, and comments. + last if $line_i->() =~ /^\s*[\;\}\#\n]/; + + # Drop out if the user interrupted us. + last if $signal; + + # Append a newline if the line doesn't have one. Can happen + # in eval'ed text, for instance. + $self->after( $line_i->() =~ /\n$/ ? '' : "\n" ); + + # Next executable line. + my $incr_pos = $self->prefix . $i . $self->infix . $line_i->() + . $self->after; + $self->append_to_position($incr_pos); + $self->_my_print_lineinfo($i, $incr_pos); + } ## end for ($i = $line + 1 ; $i... + } ## end else [ if ($slave_editor) + + return; +} + +sub _handle_t_command { + my $self = shift; + + my $levels = $self->cmd_args(); + + if ((!length($levels)) or ($levels !~ /\D/)) { + $trace ^= 1; + local $\ = ''; + $DB::trace_to_depth = $levels ? $stack_depth + $levels : 1E9; + print {$OUT} "Trace = " + . ( ( $trace & 1 ) + ? ( $levels ? "on (to level $DB::trace_to_depth)" : "on" ) + : "off" ) . "\n"; + next CMD; + } + + return; +} + + +sub _handle_S_command { + my $self = shift; + + if (my ($print_all_subs, $should_reverse, $Spatt) + = $self->cmd_args =~ /\A((!)?(.+))?\z/) { + # $Spatt is the pattern (if any) to use. + # Reverse scan? + my $Srev = defined $should_reverse; + # No args - print all subs. + my $Snocheck = !defined $print_all_subs; + + # Need to make these sane here. + local $\ = ''; + local $, = ''; + + # Search through the debugger's magical hash of subs. + # If $nocheck is true, just print the sub name. + # Otherwise, check it against the pattern. We then use + # the XOR trick to reverse the condition as required. + foreach $subname ( sort( keys %sub ) ) { + if ( $Snocheck or $Srev ^ ( $subname =~ /$Spatt/ ) ) { + print $OUT $subname, "\n"; + } + } + next CMD; + } + + return; +} + +sub _handle_V_command_and_X_command { + my $self = shift; + + $DB::cmd =~ s/^X\b/V $DB::package/; + + # Bare V commands get the currently-being-debugged package + # added. + if ($self->_is_full('V')) { + $DB::cmd = "V $DB::package"; + } + + # V - show variables in package. + if (my ($new_packname, $new_vars_str) = + $DB::cmd =~ /\AV\b\s*(\S+)\s*(.*)/) { + + # Save the currently selected filehandle and + # force output to debugger's filehandle (dumpvar + # just does "print" for output). + my $savout = select($OUT); + + # Grab package name and variables to dump. + $packname = $new_packname; + my @vars = split( ' ', $new_vars_str ); + + # If main::dumpvar isn't here, get it. + do 'dumpvar.pl' || die $@ unless defined &main::dumpvar; + if ( defined &main::dumpvar ) { + + # We got it. Turn off subroutine entry/exit messages + # for the moment, along with return values. + local $frame = 0; + local $doret = -2; + + # must detect sigpipe failures - not catching + # then will cause the debugger to die. + eval { + main::dumpvar( + $packname, + defined $option{dumpDepth} + ? $option{dumpDepth} + : -1, # assume -1 unless specified + @vars + ); + }; + + # The die doesn't need to include the $@, because + # it will automatically get propagated for us. + if ($@) { + die unless $@ =~ /dumpvar print failed/; + } + } ## end if (defined &main::dumpvar) + else { + + # Couldn't load dumpvar. + print $OUT "dumpvar.pl not available.\n"; + } + + # Restore the output filehandle, and go round again. + select($savout); + next CMD; + } + + return; +} + +sub _handle_dash_command { + my $self = shift; + + if ($self->_is_full('-')) { + + # back up by a window; go to 1 if back too far. + $start -= $incr + $window + 1; + $start = 1 if $start <= 0; + $incr = $window - 1; + + # Generate and execute a "l +" command (handled below). + $DB::cmd = 'l ' . ($start) . '+'; + redo CMD; + } + return; +} + +sub _n_or_s_commands_generic { + my ($self, $new_val) = @_; + # n - next + next CMD if DB::_DB__is_finished(); + + # Single step, but don't enter subs. + $single = $new_val; + + # Save for empty command (repeat last). + $laststep = $DB::cmd; + last CMD; +} + +sub _n_or_s { + my ($self, $letter, $new_val) = @_; + + if ($self->_is_full($letter)) { + $self->_n_or_s_commands_generic($new_val); + } + else { + $self->_n_or_s_and_arg_commands_generic($letter, $new_val); + } + + return; +} + +sub _handle_n_command { + my $self = shift; + + return $self->_n_or_s('n', 2); +} + +sub _handle_s_command { + my $self = shift; + + return $self->_n_or_s('s', 1); +} + +sub _handle_r_command { + my $self = shift; + + # r - return from the current subroutine. + if ($self->_is_full('r')) { + + # Can't do anything if the program's over. + next CMD if DB::_DB__is_finished(); + + # Turn on stack trace. + $stack[$stack_depth] |= 1; + + # Print return value unless the stack is empty. + $doret = $option{PrintRet} ? $stack_depth - 1 : -2; + last CMD; + } + + return; +} + +sub _handle_T_command { + my $self = shift; + + if ($self->_is_full('T')) { + DB::print_trace( $OUT, 1 ); # skip DB + next CMD; + } + + return; +} + +sub _handle_w_command { + my $self = shift; + + DB::cmd_w( 'w', $self->cmd_args() ); + next CMD; + + return; +} + +sub _handle_W_command { + my $self = shift; + + if (my $arg = $self->cmd_args) { + DB::cmd_W( 'W', $arg ); + next CMD; + } + + return; +} + +sub _handle_rc_recall_command { + my $self = shift; + + # $rc - recall command. + if (my ($minus, $arg) = $DB::cmd =~ m#\A$rc+\s*(-)?(\d+)?\z#) { + + # No arguments, take one thing off history. + pop(@hist) if length($DB::cmd) > 1; + + # Relative (- found)? + # Y - index back from most recent (by 1 if bare minus) + # N - go to that particular command slot or the last + # thing if nothing following. + + $self->cmd_verb( + scalar($minus ? ( $#hist - ( $arg || 1 ) ) : ( $arg || $#hist )) + ); + + # Pick out the command desired. + $DB::cmd = $hist[$self->cmd_verb]; + + # Print the command to be executed and restart the loop + # with that command in the buffer. + print {$OUT} $DB::cmd, "\n"; + redo CMD; + } + + return; +} + +sub _handle_rc_search_history_command { + my $self = shift; + + # $rc pattern $rc - find a command in the history. + if (my ($arg) = $DB::cmd =~ /\A$rc([^$rc].*)\z/) { + + # Create the pattern to use. + my $pat = "^$arg"; + $self->pat($pat); + + # Toss off last entry if length is >1 (and it always is). + pop(@hist) if length($DB::cmd) > 1; + + my $i; + + # Look backward through the history. + SEARCH_HIST: + for ( $i = $#hist ; $i ; --$i ) { + # Stop if we find it. + last SEARCH_HIST if $hist[$i] =~ /$pat/; + } + + if ( !$i ) { + + # Never found it. + print $OUT "No such command!\n\n"; + next CMD; + } + + # Found it. Put it in the buffer, print it, and process it. + $DB::cmd = $hist[$i]; + print $OUT $DB::cmd, "\n"; + redo CMD; + } + + return; +} + +sub _handle_H_command { + my $self = shift; + + if ($self->cmd_args =~ m#\A\*#) { + @hist = @truehist = (); + print $OUT "History cleansed\n"; + next CMD; + } + + if (my ($num) = $self->cmd_args =~ /\A(?:-(\d+))?/) { + + # Anything other than negative numbers is ignored by + # the (incorrect) pattern, so this test does nothing. + $end = $num ? ( $#hist - $num ) : 0; + + # Set to the minimum if less than zero. + $hist = 0 if $hist < 0; + + # Start at the end of the array. + # Stay in while we're still above the ending value. + # Tick back by one each time around the loop. + my $i; + + for ( $i = $#hist ; $i > $end ; $i-- ) { + + # Print the command unless it has no arguments. + print $OUT "$i: ", $hist[$i], "\n" + unless $hist[$i] =~ /^.?$/; + } + + next CMD; + } + + return; +} + +sub _handle_doc_command { + my $self = shift; + + # man, perldoc, doc - show manual pages. + if (my ($man_page) + = $DB::cmd =~ /\A(?:man|(?:perl)?doc)\b(?:\s+([^(]*))?\z/) { + DB::runman($man_page); + next CMD; + } + + return; +} + +sub _handle_p_command { + my $self = shift; + + my $print_cmd = 'print {$DB::OUT} '; + # p - print (no args): print $_. + if ($self->_is_full('p')) { + $DB::cmd = $print_cmd . '$_'; + } + else { + # p - print the given expression. + $DB::cmd =~ s/\Ap\b/$print_cmd /; + } + + return; +} + +sub _handle_equal_sign_command { + my $self = shift; + + if ($DB::cmd =~ s/\A=\s*//) { + my @keys; + if ( length $DB::cmd == 0 ) { + + # No args, get current aliases. + @keys = sort keys %alias; + } + elsif ( my ( $k, $v ) = ( $DB::cmd =~ /^(\S+)\s+(\S.*)/ ) ) { + + # Creating a new alias. $k is alias name, $v is + # alias value. + + # can't use $_ or kill //g state + for my $x ( $k, $v ) { + + # Escape "alarm" characters. + $x =~ s/\a/\\a/g; + } + + # Substitute key for value, using alarm chars + # as separators (which is why we escaped them in + # the command). + $alias{$k} = "s\a$k\a$v\a"; + + # Turn off standard warn and die behavior. + local $SIG{__DIE__}; + local $SIG{__WARN__}; + + # Is it valid Perl? + unless ( eval "sub { s\a$k\a$v\a }; 1" ) { + + # Nope. Bad alias. Say so and get out. + print $OUT "Can't alias $k to $v: $@\n"; + delete $alias{$k}; + next CMD; + } + + # We'll only list the new one. + @keys = ($k); + } ## end elsif (my ($k, $v) = ($DB::cmd... + + # The argument is the alias to list. + else { + @keys = ($DB::cmd); + } + + # List aliases. + for my $k (@keys) { + + # Messy metaquoting: Trim the substitution code off. + # We use control-G as the delimiter because it's not + # likely to appear in the alias. + if ( ( my $v = $alias{$k} ) =~ ss\a$k\a(.*)\a$1 ) { + + # Print the alias. + print $OUT "$k\t= $1\n"; + } + elsif ( defined $alias{$k} ) { + + # Couldn't trim it off; just print the alias code. + print $OUT "$k\t$alias{$k}\n"; + } + else { + + # No such, dude. + print "No alias for $k\n"; + } + } ## end for my $k (@keys) + next CMD; + } + + return; +} + +sub _handle_source_command { + my $self = shift; + + # source - read commands from a file (or pipe!) and execute. + if (my $sourced_fn = $self->cmd_args) { + if ( open my $fh, $sourced_fn ) { + + # Opened OK; stick it in the list of file handles. + push @cmdfhs, $fh; + } + else { + + # Couldn't open it. + DB::_db_warn("Can't execute '$sourced_fn': $!\n"); + } + next CMD; + } + + return; +} + +sub _handle_enable_disable_commands { + my $self = shift; + + my $which_cmd = $self->cmd_verb; + my $position = $self->cmd_args; + + if ($position !~ /\s/) { + my ($fn, $line_num); + if ($position =~ m{\A\d+\z}) + { + $fn = $DB::filename; + $line_num = $position; + } + elsif (my ($new_fn, $new_line_num) + = $position =~ m{\A(.*):(\d+)\z}) { + ($fn, $line_num) = ($new_fn, $new_line_num); + } + else + { + DB::_db_warn("Wrong spec for enable/disable argument.\n"); + } + + if (defined($fn)) { + if (DB::_has_breakpoint_data_ref($fn, $line_num)) { + DB::_set_breakpoint_enabled_status($fn, $line_num, + ($which_cmd eq 'enable' ? 1 : '') + ); + } + else { + DB::_db_warn("No breakpoint set at ${fn}:${line_num}\n"); + } + } + + next CMD; + } + + return; +} + +sub _handle_save_command { + my $self = shift; + + if (my $new_fn = $self->cmd_args) { + my $filename = $new_fn || '.perl5dbrc'; # default? + if ( open my $fh, '>', $filename ) { + + # chomp to remove extraneous newlines from source'd files + chomp( my @truelist = + map { m/\A\s*(save|source)/ ? "#$_" : $_ } + @truehist ); + print {$fh} join( "\n", @truelist ); + print "commands saved in $filename\n"; + } + else { + DB::_db_warn("Can't save debugger commands in '$new_fn': $!\n"); + } + next CMD; + } + + return; +} + +sub _n_or_s_and_arg_commands_generic { + my ($self, $letter, $new_val) = @_; + + # s - single-step. Remember the last command was 's'. + if ($DB::cmd =~ s#\A\Q$letter\E\s#\$DB::single = $new_val;\n#) { + $laststep = $letter; + } + + return; +} + +sub _handle_sh_command { + my $self = shift; + + # $sh$sh - run a shell command (if it's all ASCII). + # Can't run shell commands with Unicode in the debugger, hmm. + my $my_cmd = $DB::cmd; + if ($my_cmd =~ m#\A$sh#gms) { + + if ($my_cmd =~ m#\G\z#cgms) { + # Run the user's shell. If none defined, run Bourne. + # We resume execution when the shell terminates. + DB::_db_system( $ENV{SHELL} || "/bin/sh" ); + next CMD; + } + elsif ($my_cmd =~ m#\G$sh\s*(.*)#cgms) { + # System it. + DB::_db_system($1); + next CMD; + } + elsif ($my_cmd =~ m#\G\s*(.*)#cgms) { + DB::_db_system( $ENV{SHELL} || "/bin/sh", "-c", $1 ); + next CMD; + } + } +} + +sub _handle_x_command { + my $self = shift; + + if ($DB::cmd =~ s#\Ax\b# #) { # Remainder gets done by DB::eval() + $onetimeDump = 'dump'; # main::dumpvar shows the output + + # handle special "x 3 blah" syntax XXX propagate + # doc back to special variables. + if ( $DB::cmd =~ s#\A\s*(\d+)(?=\s)# #) { + $onetimedumpDepth = $1; + } + } + + return; +} + +sub _handle_q_command { + my $self = shift; + + if ($self->_is_full('q')) { + $fall_off_end = 1; + DB::clean_ENV(); + exit $?; + } + + return; +} + +sub _handle_cmd_wrapper_commands { + my $self = shift; + + DB::cmd_wrapper( $self->cmd_verb, $self->cmd_args, $line ); + next CMD; +} + +sub _handle_special_char_cmd_wrapper_commands { + my $self = shift; + + # All of these commands were remapped in perl 5.8.0; + # we send them off to the secondary dispatcher (see below). + if (my ($cmd_letter, $my_arg) = $DB::cmd =~ /\A([<>\{]{1,2})\s*(.*)/so) { + DB::cmd_wrapper( $cmd_letter, $my_arg, $line ); + next CMD; + } + + return; +} + +} ## end DB::Obj + +package DB; + +# The following code may be executed now: +# BEGIN {warn 4} + + +use vars qw($deep); + +# We need to fully qualify the name ("DB::sub") to make "use strict;" +# happy. -- Shlomi Fish + +sub _indent_print_line_info { + my ($offset, $str) = @_; + + print_lineinfo( ' ' x ($stack_depth - $offset), $str); + + return; +} + +sub _print_frame_message { + my ($al) = @_; + + if ($frame) { + if ($frame & 4) { # Extended frame entry message + _indent_print_line_info(-1, "in "); + + # Why -1? But it works! :-( + # Because print_trace will call add 1 to it and then call + # dump_trace; this results in our skipping -1+1 = 0 stack frames + # in dump_trace. + # + # Now it's 0 because we extracted a function. + print_trace( $LINEINFO, 0, 1, 1, "$sub$al" ); + } + else { + _indent_print_line_info(-1, "entering $sub$al\n" ); + } + } + + return; +} + +sub DB::sub { + # lock ourselves under threads + lock($DBGR); + + # Whether or not the autoloader was running, a scalar to put the + # sub's return value in (if needed), and an array to put the sub's + # return value in (if needed). + my ( $al, $ret, @ret ) = ""; + if ($sub eq 'threads::new' && $ENV{PERL5DB_THREADED}) { + print "creating new thread\n"; + } + + # If the last ten characters are '::AUTOLOAD', note we've traced + # into AUTOLOAD for $sub. + if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) { + no strict 'refs'; + $al = " for $$sub" if defined $$sub; + } + + # We stack the stack pointer and then increment it to protect us + # from a situation that might unwind a whole bunch of call frames + # at once. Localizing the stack pointer means that it will automatically + # unwind the same amount when multiple stack frames are unwound. + local $stack_depth = $stack_depth + 1; # Protect from non-local exits + + # Expand @stack. + $#stack = $stack_depth; + + # Save current single-step setting. + $stack[-1] = $single; + + # Turn off all flags except single-stepping. + $single &= 1; + + # If we've gotten really deeply recursed, turn on the flag that will + # make us stop with the 'deep recursion' message. + $single |= 4 if $stack_depth == $deep; + + # If frame messages are on ... + + _print_frame_message($al); + # standard frame entry message + + my $print_exit_msg = sub { + # Check for exit trace messages... + if ($frame & 2) + { + if ($frame & 4) # Extended exit message + { + _indent_print_line_info(0, "out "); + print_trace( $LINEINFO, 0, 1, 1, "$sub$al" ); + } + else + { + _indent_print_line_info(0, "exited $sub$al\n" ); + } + } + return; + }; + + # Determine the sub's return type, and capture appropriately. + if (wantarray) { + + # Called in array context. call sub and capture output. + # DB::DB will recursively get control again if appropriate; we'll come + # back here when the sub is finished. + { + no strict 'refs'; + @ret = &$sub; + } + + # Pop the single-step value back off the stack. + $single |= $stack[ $stack_depth-- ]; + + $print_exit_msg->(); + + # Print the return info if we need to. + if ( $doret eq $stack_depth or $frame & 16 ) { + + # Turn off output record separator. + local $\ = ''; + my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO ); + + # Indent if we're printing because of $frame tracing. + if ($frame & 16) + { + print {$fh} ' ' x $stack_depth; + } + + # Print the return value. + print {$fh} "list context return from $sub:\n"; + dumpit( $fh, \@ret ); + + # And don't print it again. + $doret = -2; + } ## end if ($doret eq $stack_depth... + # And we have to return the return value now. + @ret; + } ## end if (wantarray) + + # Scalar context. + else { + if ( defined wantarray ) { + no strict 'refs'; + # Save the value if it's wanted at all. + $ret = &$sub; + } + else { + no strict 'refs'; + # Void return, explicitly. + &$sub; + undef $ret; + } + + # Pop the single-step value off the stack. + $single |= $stack[ $stack_depth-- ]; + + # If we're doing exit messages... + $print_exit_msg->(); + + # If we are supposed to show the return value... same as before. + if ( $doret eq $stack_depth or $frame & 16 and defined wantarray ) { + local $\ = ''; + my $fh = ( $doret eq $stack_depth ? $OUT : $LINEINFO ); + print $fh ( ' ' x $stack_depth ) if $frame & 16; + print $fh ( + defined wantarray + ? "scalar context return from $sub: " + : "void context return from $sub\n" + ); + dumpit( $fh, $ret ) if defined wantarray; + $doret = -2; + } ## end if ($doret eq $stack_depth... + + # Return the appropriate scalar value. + $ret; + } ## end else [ if (wantarray) +} ## end sub _sub + +sub lsub : lvalue { + + no strict 'refs'; + + # lock ourselves under threads + lock($DBGR); + + # Whether or not the autoloader was running, a scalar to put the + # sub's return value in (if needed), and an array to put the sub's + # return value in (if needed). + my ( $al, $ret, @ret ) = ""; + if ($sub =~ /^threads::new$/ && $ENV{PERL5DB_THREADED}) { + print "creating new thread\n"; + } + + # If the last ten characters are C'::AUTOLOAD', note we've traced + # into AUTOLOAD for $sub. + if ( length($sub) > 10 && substr( $sub, -10, 10 ) eq '::AUTOLOAD' ) { + $al = " for $$sub"; + } + + # We stack the stack pointer and then increment it to protect us + # from a situation that might unwind a whole bunch of call frames + # at once. Localizing the stack pointer means that it will automatically + # unwind the same amount when multiple stack frames are unwound. + local $stack_depth = $stack_depth + 1; # Protect from non-local exits + + # Expand @stack. + $#stack = $stack_depth; + + # Save current single-step setting. + $stack[-1] = $single; + + # Turn off all flags except single-stepping. + # Use local so the single-step value is popped back off the + # stack for us. + local $single = $single & 1; + + # If we've gotten really deeply recursed, turn on the flag that will + # make us stop with the 'deep recursion' message. + $single |= 4 if $stack_depth == $deep; + + # If frame messages are on ... + _print_frame_message($al); + + # call the original lvalue sub. + &$sub; +} + +# Abstracting common code from multiple places elsewhere: +sub depth_print_lineinfo { + my $always_print = shift; + + print_lineinfo( @_ ) if ($always_print or $stack_depth < $trace_to_depth); +} + + +### The API section + +my %set = ( # + 'pre580' => { + 'a' => 'pre580_a', + 'A' => 'pre580_null', + 'b' => 'pre580_b', + 'B' => 'pre580_null', + 'd' => 'pre580_null', + 'D' => 'pre580_D', + 'h' => 'pre580_h', + 'M' => 'pre580_null', + 'O' => 'o', + 'o' => 'pre580_null', + 'v' => 'M', + 'w' => 'v', + 'W' => 'pre580_W', + }, + 'pre590' => { + '<' => 'pre590_prepost', + '<<' => 'pre590_prepost', + '>' => 'pre590_prepost', + '>>' => 'pre590_prepost', + '{' => 'pre590_prepost', + '{{' => 'pre590_prepost', + }, +); + +my %breakpoints_data; + +sub _has_breakpoint_data_ref { + my ($filename, $line) = @_; + + return ( + exists( $breakpoints_data{$filename} ) + and + exists( $breakpoints_data{$filename}{$line} ) + ); +} + +sub _get_breakpoint_data_ref { + my ($filename, $line) = @_; + + return ($breakpoints_data{$filename}{$line} ||= +{}); +} + +sub _delete_breakpoint_data_ref { + my ($filename, $line) = @_; + + delete($breakpoints_data{$filename}{$line}); + if (! scalar(keys( %{$breakpoints_data{$filename}} )) ) { + delete($breakpoints_data{$filename}); + } + + return; +} + +sub _set_breakpoint_enabled_status { + my ($filename, $line, $status) = @_; + + _get_breakpoint_data_ref($filename, $line)->{'enabled'} = + ($status ? 1 : '') + ; + + return; +} + +sub _enable_breakpoint_temp_enabled_status { + my ($filename, $line) = @_; + + _get_breakpoint_data_ref($filename, $line)->{'temp_enabled'} = 1; + + return; +} + +sub _cancel_breakpoint_temp_enabled_status { + my ($filename, $line) = @_; + + my $ref = _get_breakpoint_data_ref($filename, $line); + + delete ($ref->{'temp_enabled'}); + + if (! %$ref) { + _delete_breakpoint_data_ref($filename, $line); + } + + return; +} + +sub _is_breakpoint_enabled { + my ($filename, $line) = @_; + + my $data_ref = _get_breakpoint_data_ref($filename, $line); + return ($data_ref->{'enabled'} || $data_ref->{'temp_enabled'}); +} + + +sub cmd_wrapper { + my $cmd = shift; + my $line = shift; + my $dblineno = shift; + + # Assemble the command subroutine's name by looking up the + # command set and command name in %set. If we can't find it, + # default to the older version of the command. + my $call = 'cmd_' + . ( $set{$CommandSet}{$cmd} + || ( $cmd =~ /\A[<>{]+/o ? 'prepost' : $cmd ) ); + + # Call the command subroutine, call it by name. + return __PACKAGE__->can($call)->( $cmd, $line, $dblineno ); +} ## end sub cmd_wrapper + + +sub cmd_a { + my $cmd = shift; + my $line = shift || ''; # [.|line] expr + my $dbline = shift; + + # If it's dot (here), or not all digits, use the current line. + $line =~ s/\A\./$dbline/; + + # Should be a line number followed by an expression. + if ( my ($lineno, $expr) = $line =~ /^\s*(\d*)\s*(\S.+)/ ) { + + if (! length($lineno)) { + $lineno = $dbline; + } + + # If we have an expression ... + if ( length $expr ) { + + # ... but the line isn't breakable, complain. + if ( $dbline[$lineno] == 0 ) { + print $OUT + "Line $lineno($dbline[$lineno]) does not have an action?\n"; + } + else { + + # It's executable. Record that the line has an action. + $had_breakpoints{$filename} |= 2; + + # Remove any action, temp breakpoint, etc. + $dbline{$lineno} =~ s/\0[^\0]*//; + + # Add the action to the line. + $dbline{$lineno} .= "\0" . action($expr); + + _set_breakpoint_enabled_status($filename, $lineno, 1); + } + } ## end if (length $expr) + } ## end if ($line =~ /^\s*(\d*)\s*(\S.+)/) + else { + + # Syntax wrong. + print $OUT + "Adding an action requires an optional lineno and an expression\n" + ; # hint + } +} ## end sub cmd_a + + +sub cmd_A { + my $cmd = shift; + my $line = shift || ''; + my $dbline = shift; + + # Dot is this line. + $line =~ s/^\./$dbline/; + + # Call delete_action with a null param to delete them all. + # The '1' forces the eval to be true. It'll be false only + # if delete_action blows up for some reason, in which case + # we print $@ and get out. + if ( $line eq '*' ) { + if (! eval { _delete_all_actions(); 1 }) { + print {$OUT} $@; + return; + } + } + + # There's a real line number. Pass it to delete_action. + # Error trapping is as above. + elsif ( $line =~ /^(\S.*)/ ) { + if (! eval { delete_action($1); 1 }) { + print {$OUT} $@; + return; + } + } + + # Swing and a miss. Bad syntax. + else { + print $OUT + "Deleting an action requires a line number, or '*' for all\n" ; # hint + } +} ## end sub cmd_A + + +sub _remove_action_from_dbline { + my $i = shift; + + $dbline{$i} =~ s/\0[^\0]*//; # \^a + delete $dbline{$i} if $dbline{$i} eq ''; + + return; +} + +sub _delete_all_actions { + print {$OUT} "Deleting all actions...\n"; + + for my $file ( keys %had_breakpoints ) { + local *dbline = $main::{ '_<' . $file }; + $max = $#dbline; + my $was; + for my $i (1 .. $max) { + if ( defined $dbline{$i} ) { + _remove_action_from_dbline($i); + } + } + + unless ( $had_breakpoints{$file} &= ~2 ) { + delete $had_breakpoints{$file}; + } + } + + return; +} + +sub delete_action { + my $i = shift; + + if ( defined($i) ) { + # Can there be one? + die "Line $i has no action .\n" if $dbline[$i] == 0; + + # Nuke whatever's there. + _remove_action_from_dbline($i); + } + else { + _delete_all_actions(); + } +} + + +sub cmd_b { + my $cmd = shift; + my $line = shift; # [.|line] [cond] + my $dbline = shift; + + my $default_cond = sub { + my $cond = shift; + return length($cond) ? $cond : '1'; + }; + + # Make . the current line number if it's there.. + $line =~ s/^\.(\s|\z)/$dbline$1/; + + # No line number, no condition. Simple break on current line. + if ( $line =~ /^\s*$/ ) { + cmd_b_line( $dbline, 1 ); + } + + # Break on load for a file. + elsif ( my ($file) = $line =~ /^load\b\s*(.*)/ ) { + $file =~ s/\s+\z//; + cmd_b_load($file); + } + + # b compile|postpone [] + # The interpreter actually traps this one for us; we just put the + # necessary condition in the %postponed hash. + elsif ( my ($action, $subname, $cond) + = $line =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) { + + # De-Perl4-ify the name - ' separators to ::. + $subname =~ s/'/::/g; + + # Qualify it into the current package unless it's already qualified. + $subname = "${package}::" . $subname unless $subname =~ /::/; + + # Add main if it starts with ::. + $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::"; + + # Save the break type for this sub. + $postponed{$subname} = (($action eq 'postpone') + ? ( "break +0 if " . $default_cond->($cond) ) + : "compile"); + } ## end elsif ($line =~ ... + # b : [] + elsif (my ($filename, $line_num, $cond) + = $line =~ /\A(\S+[^:]):(\d+)\s*(.*)/ms) { + cmd_b_filename_line( + $filename, + $line_num, + (length($cond) ? $cond : '1'), + ); + } + # b [] + elsif ( my ($new_subname, $new_cond) = + $line =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) { + + # + $subname = $new_subname; + cmd_b_sub( $subname, $default_cond->($new_cond) ); + } + + # b []. + elsif ( my ($line_n, $cond) = $line =~ /^(\d*)\s*(.*)/ ) { + + # Capture the line. If none, it's the current line. + $line = $line_n || $dbline; + + # Break on line. + cmd_b_line( $line, $default_cond->($cond) ); + } + + # Line didn't make sense. + else { + print "confused by line($line)?\n"; + } + + return; +} ## end sub cmd_b + + +sub break_on_load { + my $file = shift; + $break_on_load{$file} = 1; + $had_breakpoints{$file} |= 1; +} + + +sub report_break_on_load { + sort keys %break_on_load; +} + + +sub cmd_b_load { + my $file = shift; + my @files; + + # This is a block because that way we can use a redo inside it + # even without there being any looping structure at all outside it. + { + + # Save short name and full path if found. + push @files, $file; + push @files, $::INC{$file} if $::INC{$file}; + + # Tack on .pm and do it again unless there was a '.' in the name + # already. + $file .= '.pm', redo unless $file =~ /\./; + } + + # Do the real work here. + break_on_load($_) for @files; + + # All the files that have break-on-load breakpoints. + @files = report_break_on_load; + + # Normalize for the purposes of our printing this. + local $\ = ''; + local $" = ' '; + print $OUT "Will stop on load of '@files'.\n"; +} ## end sub cmd_b_load + + +use vars qw($filename_error); +$filename_error = ''; + + +sub breakable_line { + + my ( $from, $to ) = @_; + + # $i is the start point. (Where are the FORTRAN programs of yesteryear?) + my $i = $from; + + # If there are at least 2 arguments, we're trying to search a range. + if ( @_ >= 2 ) { + + # $delta is positive for a forward search, negative for a backward one. + my $delta = $from < $to ? +1 : -1; + + # Keep us from running off the ends of the file. + my $limit = $delta > 0 ? $#dbline : 1; + + # Clever test. If you're a mathematician, it's obvious why this + # test works. If not: + # If $delta is positive (going forward), $limit will be $#dbline. + # If $to is less than $limit, ($limit - $to) will be positive, times + # $delta of 1 (positive), so the result is > 0 and we should use $to + # as the stopping point. + # + # If $to is greater than $limit, ($limit - $to) is negative, + # times $delta of 1 (positive), so the result is < 0 and we should + # use $limit ($#dbline) as the stopping point. + # + # If $delta is negative (going backward), $limit will be 1. + # If $to is zero, ($limit - $to) will be 1, times $delta of -1 + # (negative) so the result is > 0, and we use $to as the stopping + # point. + # + # If $to is less than zero, ($limit - $to) will be positive, + # times $delta of -1 (negative), so the result is not > 0, and + # we use $limit (1) as the stopping point. + # + # If $to is 1, ($limit - $to) will zero, times $delta of -1 + # (negative), still giving zero; the result is not > 0, and + # we use $limit (1) as the stopping point. + # + # if $to is >1, ($limit - $to) will be negative, times $delta of -1 + # (negative), giving a positive (>0) value, so we'll set $limit to + # $to. + + $limit = $to if ( $limit - $to ) * $delta > 0; + + # The real search loop. + # $i starts at $from (the point we want to start searching from). + # We move through @dbline in the appropriate direction (determined + # by $delta: either -1 (back) or +1 (ahead). + # We stay in as long as we haven't hit an executable line + # ($dbline[$i] == 0 means not executable) and we haven't reached + # the limit yet (test similar to the above). + $i += $delta while $dbline[$i] == 0 and ( $limit - $i ) * $delta > 0; + + } ## end if (@_ >= 2) + + # If $i points to a line that is executable, return that. + return $i unless $dbline[$i] == 0; + + # Format the message and print it: no breakable lines in range. + my ( $pl, $upto ) = ( '', '' ); + ( $pl, $upto ) = ( 's', "..$to" ) if @_ >= 2 and $from != $to; + + # If there's a filename in filename_error, we'll see it. + # If not, not. + die "Line$pl $from$upto$filename_error not breakable\n"; +} ## end sub breakable_line + + +sub breakable_line_in_filename { + + # Capture the file name. + my ($f) = shift; + + # Swap the magic line array over there temporarily. + local *dbline = $main::{ '_<' . $f }; + + # If there's an error, it's in this other file. + local $filename_error = " of '$f'"; + + # Find the breakable line. + breakable_line(@_); + + # *dbline and $filename_error get restored when this block ends. + +} ## end sub breakable_line_in_filename + + +sub break_on_line { + my $i = shift; + my $cond = @_ ? shift(@_) : 1; + + my $inii = $i; + my $after = ''; + my $pl = ''; + + # Woops, not a breakable line. $filename_error allows us to say + # if it was in a different file. + die "Line $i$filename_error not breakable.\n" if $dbline[$i] == 0; + + # Mark this file as having breakpoints in it. + $had_breakpoints{$filename} |= 1; + + # If there is an action or condition here already ... + if ( $dbline{$i} ) { + + # ... swap this condition for the existing one. + $dbline{$i} =~ s/^[^\0]*/$cond/; + } + else { + + # Nothing here - just add the condition. + $dbline{$i} = $cond; + + _set_breakpoint_enabled_status($filename, $i, 1); + } + + return; +} ## end sub break_on_line + + +sub cmd_b_line { + if (not eval { break_on_line(@_); 1 }) { + local $\ = ''; + print $OUT $@ and return; + } + + return; +} ## end sub cmd_b_line + + +sub cmd_b_filename_line { + if (not eval { break_on_filename_line(@_); 1 }) { + local $\ = ''; + print $OUT $@ and return; + } + + return; +} + + +sub break_on_filename_line { + my $f = shift; + my $i = shift; + my $cond = @_ ? shift(@_) : 1; + + # Switch the magical hash temporarily. + local *dbline = $main::{ '_<' . $f }; + + # Localize the variables that break_on_line uses to make its message. + local $filename_error = " of '$f'"; + local $filename = $f; + + # Add the breakpoint. + break_on_line( $i, $cond ); + + return; +} ## end sub break_on_filename_line + + +sub break_on_filename_line_range { + my $f = shift; + my $from = shift; + my $to = shift; + my $cond = @_ ? shift(@_) : 1; + + # Find a breakable line if there is one. + my $i = breakable_line_in_filename( $f, $from, $to ); + + # Add the breakpoint. + break_on_filename_line( $f, $i, $cond ); + + return; +} ## end sub break_on_filename_line_range + + +sub subroutine_filename_lines { + my ( $subname ) = @_; + + # Returned value from find_sub() is fullpathname:startline-endline. + # The match creates the list (fullpathname, start, end). + return (find_sub($subname) =~ /^(.*):(\d+)-(\d+)$/); +} ## end sub subroutine_filename_lines + + +sub break_subroutine { + my $subname = shift; + + # Get filename, start, and end. + my ( $file, $s, $e ) = subroutine_filename_lines($subname) + or die "Subroutine $subname not found.\n"; + + + # Null condition changes to '1' (always true). + my $cond = @_ ? shift(@_) : 1; + + # Put a break the first place possible in the range of lines + # that make up this subroutine. + break_on_filename_line_range( $file, $s, $e, $cond ); + + return; +} ## end sub break_subroutine + + +sub cmd_b_sub { + my $subname = shift; + my $cond = @_ ? shift : 1; + + # If the subname isn't a code reference, qualify it so that + # break_subroutine() will work right. + if ( ref($subname) ne 'CODE' ) { + + # Not Perl 4. + $subname =~ s/'/::/g; + my $s = $subname; + + # Put it in this package unless it's already qualified. + if ($subname !~ /::/) + { + $subname = $package . '::' . $subname; + }; + + # Requalify it into CORE::GLOBAL if qualifying it into this + # package resulted in its not being defined, but only do so + # if it really is in CORE::GLOBAL. + my $core_name = "CORE::GLOBAL::$s"; + if ((!defined(&$subname)) + and ($s !~ /::/) + and (defined &{$core_name})) + { + $subname = $core_name; + } + + # Put it in package 'main' if it has a leading ::. + if ($subname =~ /\A::/) + { + $subname = "main" . $subname; + } + } ## end if ( ref($subname) ne 'CODE' ) { + + # Try to set the breakpoint. + if (not eval { break_subroutine( $subname, $cond ); 1 }) { + local $\ = ''; + print {$OUT} $@; + return; + } + + return; +} ## end sub cmd_b_sub + + +sub cmd_B { + my $cmd = shift; + + # No line spec? Use dbline. + # If there is one, use it if it's non-zero, or wipe it out if it is. + my $line = ( $_[0] =~ /\A\./ ) ? $dbline : (shift || ''); + my $dbline = shift; + + # If the line was dot, make the line the current one. + $line =~ s/^\./$dbline/; + + # If it's * we're deleting all the breakpoints. + if ( $line eq '*' ) { + if (not eval { delete_breakpoint(); 1 }) { + print {$OUT} $@; + } + } + + # If there is a line spec, delete the breakpoint on that line. + elsif ( $line =~ /\A(\S.*)/ ) { + if (not eval { delete_breakpoint( $line || $dbline ); 1 }) { + local $\ = ''; + print {$OUT} $@; + } + } ## end elsif ($line =~ /^(\S.*)/) + + # No line spec. + else { + print {$OUT} + "Deleting a breakpoint requires a line number, or '*' for all\n" + ; # hint + } + + return; +} ## end sub cmd_B + + +sub _remove_breakpoint_entry { + my ($fn, $i) = @_; + + delete $dbline{$i}; + _delete_breakpoint_data_ref($fn, $i); + + return; +} + +sub _delete_all_breakpoints { + print {$OUT} "Deleting all breakpoints...\n"; + + # %had_breakpoints lists every file that had at least one + # breakpoint in it. + for my $fn ( keys %had_breakpoints ) { + + # Switch to the desired file temporarily. + local *dbline = $main::{ '_<' . $fn }; + + $max = $#dbline; + + # For all lines in this file ... + for my $i (1 .. $max) { + + # If there's a breakpoint or action on this line ... + if ( defined $dbline{$i} ) { + + # ... remove the breakpoint. + $dbline{$i} =~ s/\A[^\0]+//; + if ( $dbline{$i} =~ s/\A\0?\z// ) { + # Remove the entry altogether if no action is there. + _remove_breakpoint_entry($fn, $i); + } + } ## end if (defined $dbline{$i... + } ## end for $i (1 .. $max) + + # If, after we turn off the "there were breakpoints in this file" + # bit, the entry in %had_breakpoints for this file is zero, + # we should remove this file from the hash. + if ( not $had_breakpoints{$fn} &= (~1) ) { + delete $had_breakpoints{$fn}; + } + } ## end for my $fn (keys %had_breakpoints) + + # Kill off all the other breakpoints that are waiting for files that + # haven't been loaded yet. + undef %postponed; + undef %postponed_file; + undef %break_on_load; + + return; +} + +sub _delete_breakpoint_from_line { + my ($i) = @_; + + # Woops. This line wasn't breakable at all. + die "Line $i not breakable.\n" if $dbline[$i] == 0; + + # Kill the condition, but leave any action. + $dbline{$i} =~ s/\A[^\0]*//; + + # Remove the entry entirely if there's no action left. + if ($dbline{$i} eq '') { + _remove_breakpoint_entry($filename, $i); + } + + return; +} + +sub delete_breakpoint { + my $i = shift; + + # If we got a line, delete just that one. + if ( defined($i) ) { + _delete_breakpoint_from_line($i); + } + # No line; delete them all. + else { + _delete_all_breakpoints(); + } + + return; +} + + +sub cmd_stop { # As on ^C, but not signal-safy. + $signal = 1; +} + + +sub cmd_e { + my $cmd = shift; + my $line = shift; + unless (exists($INC{'threads.pm'})) { + print "threads not loaded($ENV{PERL5DB_THREADED}) + please run the debugger with PERL5DB_THREADED=1 set in the environment\n"; + } else { + my $tid = threads->tid; + print "thread id: $tid\n"; + } +} ## end sub cmd_e + + +sub cmd_E { + my $cmd = shift; + my $line = shift; + unless (exists($INC{'threads.pm'})) { + print "threads not loaded($ENV{PERL5DB_THREADED}) + please run the debugger with PERL5DB_THREADED=1 set in the environment\n"; + } else { + my $tid = threads->tid; + print "thread ids: ".join(', ', + map { ($tid == $_->tid ? '<'.$_->tid.'>' : $_->tid) } threads->list + )."\n"; + } +} ## end sub cmd_E + + +use vars qw($help); +use vars qw($summary); + +sub cmd_h { + my $cmd = shift; + + # If we have no operand, assume null. + my $line = shift || ''; + + # 'h h'. Print the long-format help. + if ( $line =~ /\Ah\s*\z/ ) { + print_help($help); + } + + # 'h '. Search for the command and print only its help. + elsif ( my ($asked) = $line =~ /\A(\S.*)\z/ ) { + + # support long commands; otherwise bogus errors + # happen when you ask for h on for example + my $qasked = quotemeta($asked); # for searching; we don't + # want to use it as a pattern. + # XXX: finds CR but not + + # Search the help string for the command. + if ( + $help =~ /^ # Start of a line + is not a debugger command.\n"); + } + } ## end elsif ($line =~ /^(\S.*)$/) + + # 'h' - print the summary help. + else { + print_help($summary); + } +} ## end sub cmd_h + + +sub cmd_i { + my $cmd = shift; + my $line = shift; + foreach my $isa ( split( /\s+/, $line ) ) { + $evalarg = $isa; + # The &-call is here to ascertain the mutability of @_. + ($isa) = &DB::eval; + no strict 'refs'; + print join( + ', ', + map { + "$_" + . ( + defined( ${"$_\::VERSION"} ) + ? ' ' . ${"$_\::VERSION"} + : undef ) + } @{mro::get_linear_isa(ref($isa) || $isa)} + ); + print "\n"; + } +} ## end sub cmd_i + + +sub _min { + my $min = shift; + foreach my $v (@_) { + if ($min > $v) { + $min = $v; + } + } + return $min; +} + +sub _max { + my $max = shift; + foreach my $v (@_) { + if ($max < $v) { + $max = $v; + } + } + return $max; +} + +sub _minify_to_max { + my $ref = shift; + + $$ref = _min($$ref, $max); + + return; +} + +sub _cmd_l_handle_var_name { + my $var_name = shift; + + $evalarg = $var_name; + + my ($s) = DB::eval(); + + # Ooops. Bad scalar. + if ($@) { + print {$OUT} "Error: $@\n"; + next CMD; + } + + # Good scalar. If it's a reference, find what it points to. + $s = CvGV_name($s); + print {$OUT} "Interpreted as: $1 $s\n"; + $line = "$1 $s"; + + # Call self recursively to really do the command. + return _cmd_l_main( $s ); +} + +sub _cmd_l_handle_subname { + + my $s = $subname; + + # De-Perl4. + $subname =~ s/\'/::/; + + # Put it in this package unless it starts with ::. + $subname = $package . "::" . $subname unless $subname =~ /::/; + + # Put it in CORE::GLOBAL if t doesn't start with :: and + # it doesn't live in this package and it lives in CORE::GLOBAL. + $subname = "CORE::GLOBAL::$s" + if not defined &$subname + and $s !~ /::/ + and defined &{"CORE::GLOBAL::$s"}; + + # Put leading '::' names into 'main::'. + $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::"; + + # Get name:start-stop from find_sub, and break this up at + # colons. + my @pieces = split( /:/, find_sub($subname) || $sub{$subname} ); + + # Pull off start-stop. + my $subrange = pop @pieces; + + # If the name contained colons, the split broke it up. + # Put it back together. + $file = join( ':', @pieces ); + + # If we're not in that file, switch over to it. + if ( $file ne $filename ) { + if (! $slave_editor) { + print {$OUT} "Switching to file '$file'.\n"; + } + + # Switch debugger's magic structures. + *dbline = $main::{ '_<' . $file }; + $max = $#dbline; + $filename = $file; + } ## end if ($file ne $filename) + + # Subrange is 'start-stop'. If this is less than a window full, + # swap it to 'start+', which will list a window from the start point. + if ($subrange) { + if ( eval($subrange) < -$window ) { + $subrange =~ s/-.*/+/; + } + + # Call self recursively to list the range. + return _cmd_l_main( $subrange ); + } ## end if ($subrange) + + # Couldn't find it. + else { + print {$OUT} "Subroutine $subname not found.\n"; + return; + } +} + +sub _cmd_l_empty { + # Compute new range to list. + $incr = $window - 1; + + # Recurse to do it. + return _cmd_l_main( $start . '-' . ( $start + $incr ) ); +} + +sub _cmd_l_plus { + my ($new_start, $new_incr) = @_; + + # Don't reset start for 'l +nnn'. + $start = $new_start if $new_start; + + # Increment for list. Use window size if not specified. + # (Allows 'l +' to work.) + $incr = $new_incr || ($window - 1); + + # Create a line range we'll understand, and recurse to do it. + return _cmd_l_main( $start . '-' . ( $start + $incr ) ); +} + +sub _cmd_l_calc_initial_end_and_i { + my ($spec, $start_match, $end_match) = @_; + + # Determine end point; use end of file if not specified. + my $end = ( !defined $start_match ) ? $max : + ( $end_match ? $end_match : $start_match ); + + # Go on to the end, and then stop. + _minify_to_max(\$end); + + # Determine start line. + my $i = $start_match; + + if ($i eq '.') { + $i = $spec; + } + + $i = _max($i, 1); + + $incr = $end - $i; + + return ($end, $i); +} + +sub _cmd_l_range { + my ($spec, $current_line, $start_match, $end_match) = @_; + + my ($end, $i) = + _cmd_l_calc_initial_end_and_i($spec, $start_match, $end_match); + + # If we're running under a slave editor, force it to show the lines. + if ($slave_editor) { + print {$OUT} "\032\032$filename:$i:0\n"; + $i = $end; + } + # We're doing it ourselves. We want to show the line and special + # markers for: + # - the current line in execution + # - whether a line is breakable or not + # - whether a line has a break or not + # - whether a line has an action or not + else { + I_TO_END: + for ( ; $i <= $end ; $i++ ) { + + # Check for breakpoints and actions. + my ( $stop, $action ); + if ($dbline{$i}) { + ( $stop, $action ) = split( /\0/, $dbline{$i} ); + } + + # ==> if this is the current line in execution, + # : if it's breakable. + my $arrow = + ( $i == $current_line and $filename eq $filename_ini ) + ? '==>' + : ( $dbline[$i] + 0 ? ':' : ' ' ); + + # Add break and action indicators. + $arrow .= 'b' if $stop; + $arrow .= 'a' if $action; + + # Print the line. + print {$OUT} "$i$arrow\t", $dbline[$i]; + + # Move on to the next line. Drop out on an interrupt. + if ($signal) { + $i++; + last I_TO_END; + } + } ## end for (; $i <= $end ; $i++) + + # Line the prompt up; print a newline if the last line listed + # didn't have a newline. + if ($dbline[ $i - 1 ] !~ /\n\z/) { + print {$OUT} "\n"; + } + } ## end else [ if ($slave_editor) + + # Save the point we last listed to in case another relative 'l' + # command is desired. Don't let it run off the end. + $start = $i; + _minify_to_max(\$start); + + return; +} + +sub _cmd_l_main { + my $spec = shift; + + # If this is '-something', delete any spaces after the dash. + $spec =~ s/\A-\s*\z/-/; + + # If the line is '$something', assume this is a scalar containing a + # line number. + # Set up for DB::eval() - evaluate in *user* context. + if ( my ($var_name) = $spec =~ /\A(\$.*)/s ) { + return _cmd_l_handle_var_name($var_name); + } + # l name. Try to find a sub by that name. + elsif ( ($subname) = $spec =~ /\A([\':A-Za-z_][\':\w]*(?:\[.*\])?)/s ) { + return _cmd_l_handle_subname(); + } + # Bare 'l' command. + elsif ( $spec !~ /\S/ ) { + return _cmd_l_empty(); + } + # l [start]+number_of_lines + elsif ( my ($new_start, $new_incr) = $spec =~ /\A(\d*)\+(\d*)\z/ ) { + return _cmd_l_plus($new_start, $new_incr); + } + # l start-stop or l start,stop + elsif (my ($s, $e) = $spec =~ /^(?:(-?[\d\$\.]+)(?:[-,]([\d\$\.]+))?)?/ ) { + return _cmd_l_range($spec, $line, $s, $e); + } + + return; +} ## end sub cmd_l + +sub cmd_l { + my (undef, $line) = @_; + + return _cmd_l_main($line); +} + + +sub _cmd_L_calc_arg { + # If no argument, list everything. Pre-5.8.0 version always lists + # everything + my $arg = shift || 'abw'; + if ($CommandSet ne '580') + { + $arg = 'abw'; + } + + return $arg; +} + +sub _cmd_L_calc_wanted_flags { + my $arg = _cmd_L_calc_arg(shift); + + return (map { index($arg, $_) >= 0 ? 1 : 0 } qw(a b w)); +} + + +sub _cmd_L_handle_breakpoints { + my ($handle_db_line) = @_; + + BREAKPOINTS_SCAN: + # Look in all the files with breakpoints... + for my $file ( keys %had_breakpoints ) { + + # Temporary switch to this file. + local *dbline = $main::{ '_<' . $file }; + + # Set up to look through the whole file. + $max = $#dbline; + my $was; # Flag: did we print something + # in this file? + + # For each line in the file ... + for my $i (1 .. $max) { + + # We've got something on this line. + if ( defined $dbline{$i} ) { + + # Print the header if we haven't. + if (not $was++) { + print {$OUT} "$file:\n"; + } + + # Print the line. + print {$OUT} " $i:\t", $dbline[$i]; + + $handle_db_line->($dbline{$i}); + + # Quit if the user hit interrupt. + if ($signal) { + last BREAKPOINTS_SCAN; + } + } ## end if (defined $dbline{$i... + } ## end for my $i (1 .. $max) + } ## end for my $file (keys %had_breakpoints) + + return; +} + +sub _cmd_L_handle_postponed_breakpoints { + my ($handle_db_line) = @_; + + print {$OUT} "Postponed breakpoints in files:\n"; + + POSTPONED_SCANS: + for my $file ( keys %postponed_file ) { + my $db = $postponed_file{$file}; + print {$OUT} " $file:\n"; + for my $line ( sort { $a <=> $b } keys %$db ) { + print {$OUT} " $line:\n"; + + $handle_db_line->($db->{$line}); + + if ($signal) { + last POSTPONED_SCANS; + } + } + if ($signal) { + last POSTPONED_SCANS; + } + } + + return; +} + + +sub cmd_L { + my $cmd = shift; + + my ($action_wanted, $break_wanted, $watch_wanted) = + _cmd_L_calc_wanted_flags(shift); + + my $handle_db_line = sub { + my ($l) = @_; + + my ( $stop, $action ) = split( /\0/, $l ); + + if ($stop and $break_wanted) { + print {$OUT} " break if (", $stop, ")\n" + } + + if ($action && $action_wanted) { + print {$OUT} " action: ", $action, "\n" + } + + return; + }; + + # Breaks and actions are found together, so we look in the same place + # for both. + if ( $break_wanted or $action_wanted ) { + _cmd_L_handle_breakpoints($handle_db_line); + } + + # Look for breaks in not-yet-compiled subs: + if ( %postponed and $break_wanted ) { + print {$OUT} "Postponed breakpoints in subroutines:\n"; + my $subname; + SUBS_SCAN: + for $subname ( keys %postponed ) { + print {$OUT} " $subname\t$postponed{$subname}\n"; + if ($signal) { + last SUBS_SCAN; + } + } + } ## end if (%postponed and $break_wanted) + + # Find files that have not-yet-loaded breaks: + my @have = map { # Combined keys + keys %{ $postponed_file{$_} } + } keys %postponed_file; + + # If there are any, list them. + if ( @have and ( $break_wanted or $action_wanted ) ) { + _cmd_L_handle_postponed_breakpoints($handle_db_line); + } ## end if (@have and ($break_wanted... + + if ( %break_on_load and $break_wanted ) { + print {$OUT} "Breakpoints on load:\n"; + BREAK_ON_LOAD: for my $filename ( keys %break_on_load ) { + print {$OUT} " $filename\n"; + last BREAK_ON_LOAD if $signal; + } + } ## end if (%break_on_load and... + + if ($watch_wanted and ( $trace & 2 )) { + print {$OUT} "Watch-expressions:\n" if @to_watch; + TO_WATCH: for my $expr (@to_watch) { + print {$OUT} " $expr\n"; + last TO_WATCH if $signal; + } + } + + return; +} ## end sub cmd_L + + +sub cmd_M { + list_modules(); + + return; +} + + +sub cmd_o { + my $cmd = shift; + my $opt = shift || ''; # opt[=val] + + # Nonblank. Try to parse and process. + if ( $opt =~ /^(\S.*)/ ) { + parse_options($1); + } + + # Blank. List the current option settings. + else { + for (@options) { + dump_option($_); + } + } +} ## end sub cmd_o + + +sub cmd_O { + print $OUT "The old O command is now the o command.\n"; # hint + print $OUT "Use 'h' to get current command help synopsis or\n"; # + print $OUT "use 'o CommandSet=pre580' to revert to old usage\n"; # +} + + +use vars qw($preview); + +sub cmd_v { + my $cmd = shift; + my $line = shift; + + # Extract the line to list around. (Astute readers will have noted that + # this pattern will match whether or not a numeric line is specified, + # which means that we'll always enter this loop (though a non-numeric + # argument results in no action at all)). + if ( $line =~ /^(\d*)$/ ) { + + # Total number of lines to list (a windowful). + $incr = $window - 1; + + # Set the start to the argument given (if there was one). + $start = $1 if $1; + + # Back up by the context amount. + $start -= $preview; + + # Put together a linespec that cmd_l will like. + $line = $start . '-' . ( $start + $incr ); + + # List the lines. + cmd_l( 'l', $line ); + } ## end if ($line =~ /^(\d*)$/) +} ## end sub cmd_v + + +sub _add_watch_expr { + my $expr = shift; + + # ... save it. + push @to_watch, $expr; + + # Parameterize DB::eval and call it to get the expression's value + # in the user's context. This version can handle expressions which + # return a list value. + $evalarg = $expr; + # The &-call is here to ascertain the mutability of @_. + my ($val) = join( ' ', &DB::eval); + $val = ( defined $val ) ? "'$val'" : 'undef'; + + # Save the current value of the expression. + push @old_watch, $val; + + # We are now watching expressions. + $trace |= 2; + + return; +} + +sub cmd_w { + my $cmd = shift; + + # Null expression if no arguments. + my $expr = shift || ''; + + # If expression is not null ... + if ( $expr =~ /\A\S/ ) { + _add_watch_expr($expr); + } ## end if ($expr =~ /^(\S.*)/) + + # You have to give one to get one. + else { + print $OUT "Adding a watch-expression requires an expression\n"; # hint + } + + return; +} + + +sub cmd_W { + my $cmd = shift; + my $expr = shift || ''; + + # Delete them all. + if ( $expr eq '*' ) { + + # Not watching now. + $trace &= ~2; + + print $OUT "Deleting all watch expressions ...\n"; + + # And all gone. + @to_watch = @old_watch = (); + } + + # Delete one of them. + elsif ( $expr =~ /^(\S.*)/ ) { + + # Where we are in the list. + my $i_cnt = 0; + + # For each expression ... + foreach (@to_watch) { + my $val = $to_watch[$i_cnt]; + + # Does this one match the command argument? + if ( $val eq $expr ) { # =~ m/^\Q$i$/) { + # Yes. Turn it off, and its value too. + splice( @to_watch, $i_cnt, 1 ); + splice( @old_watch, $i_cnt, 1 ); + } + $i_cnt++; + } ## end foreach (@to_watch) + + # We don't bother to turn watching off because + # a) we don't want to stop calling watchfunction() if it exists + # b) foreach over a null list doesn't do anything anyway + + } ## end elsif ($expr =~ /^(\S.*)/) + + # No command arguments entered. + else { + print $OUT + "Deleting a watch-expression requires an expression, or '*' for all\n" + ; # hint + } +} ## end sub cmd_W + +### END of the API section + + +sub save { + + # Save eval failure, command failure, extended OS error, output field + # separator, input record separator, output record separator and + # the warning setting. + @saved = ( $@, $!, $^E, $,, $/, $\, $^W ); + + $, = ""; # output field separator is null string + $/ = "\n"; # input record separator is newline + $\ = ""; # output record separator is null string + $^W = 0; # warnings are off +} ## end sub save + + +sub print_lineinfo { + + # Make the terminal sensible if we're not the primary debugger. + resetterm(1) if $LINEINFO eq $OUT and $term_pid != $$; + local $\ = ''; + local $, = ''; + # $LINEINFO may be undef if $noTTY is set or some other issue. + if ($LINEINFO) + { + print {$LINEINFO} @_; + } +} ## end sub print_lineinfo + + +# The following takes its argument via $evalarg to preserve current @_ + +sub postponed_sub { + + # Get the subroutine name. + my $subname = shift; + + # If this is a 'break + if ' ... + if ( $postponed{$subname} =~ s/^break\s([+-]?\d+)\s+if\s// ) { + + # If there's no offset, use '+0'. + my $offset = $1 || 0; + + # find_sub's value is 'fullpath-filename:start-stop'. It's + # possible that the filename might have colons in it too. + my ( $file, $i ) = ( find_sub($subname) =~ /^(.*):(\d+)-.*$/ ); + if ($i) { + + # We got the start line. Add the offset '+' from + # $postponed{subname}. + $i += $offset; + + # Switch to the file this sub is in, temporarily. + local *dbline = $main::{ '_<' . $file }; + + # No warnings, please. + local $^W = 0; # != 0 is magical below + + # This file's got a breakpoint in it. + $had_breakpoints{$file} |= 1; + + # Last line in file. + $max = $#dbline; + + # Search forward until we hit a breakable line or get to + # the end of the file. + ++$i until $dbline[$i] != 0 or $i >= $max; + + # Copy the breakpoint in and delete it from %postponed. + $dbline{$i} = delete $postponed{$subname}; + } ## end if ($i) + + # find_sub didn't find the sub. + else { + local $\ = ''; + print $OUT "Subroutine $subname not found.\n"; + } + return; + } ## end if ($postponed{$subname... + elsif ( $postponed{$subname} eq 'compile' ) { $signal = 1 } + + #print $OUT "In postponed_sub for '$subname'.\n"; +} ## end sub postponed_sub + + +sub postponed { + + # If there's a break, process it. + if ($ImmediateStop) { + + # Right, we've stopped. Turn it off. + $ImmediateStop = 0; + + # Enter the command loop when DB::DB gets called. + $signal = 1; + } + + # If this is a subroutine, let postponed_sub() deal with it. + if (ref(\$_[0]) ne 'GLOB') { + return postponed_sub(@_); + } + + # Not a subroutine. Deal with the file. + local *dbline = shift; + my $filename = $dbline; + $filename =~ s/^_ $maxtrace; + + # Get the file name. + my $file = $sub[$i]{file}; + + # Put in a filename header if short is off. + $file = $file eq '-e' ? $file : "file '$file'" unless $short; + + # Get the actual sub's name, and shorten to $maxtrace's requirement. + $s = $sub[$i]{'sub'}; + $s = ( substr $s, 0, $maxtrace - 3 ) . '...' if length $s > $maxtrace; + + # Short report uses trimmed file and sub names. + if ($short) { + my $sub = @_ >= 4 ? $_[3] : $s; + print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n"; + } ## end if ($short) + + # Non-short report includes full names. + else { + print $fh "$sub[$i]{context} = $s$args" + . " called from $file" + . " line $sub[$i]{line}\n"; + } + } ## end for my $i (0 .. $#sub) +} ## end sub print_trace + + +sub _dump_trace_calc_saved_single_arg +{ + my ($nothard, $arg) = @_; + + my $type; + if ( not defined $arg ) { # undefined parameter + return "undef"; + } + + elsif ( $nothard and tied $arg ) { # tied parameter + return "tied"; + } + elsif ( $nothard and $type = ref $arg ) { # reference + return "ref($type)"; + } + else { # can be stringified + local $_ = + "$arg"; # Safe to stringify now - should not call f(). + + # Backslash any single-quotes or backslashes. + s/([\'\\])/\\$1/g; + + # Single-quote it unless it's a number or a colon-separated + # name. + s/(.*)/'$1'/s + unless /^(?: -?[\d.]+ | \*[\w:]* )$/x; + + # Turn high-bit characters into meta-whatever, and controls into like + # '^D'. + require 'meta_notation.pm'; + $_ = _meta_notation($_) if /[[:^print:]]/a; + + return $_; + } +} + +sub _dump_trace_calc_save_args { + my ($nothard) = @_; + + return [ + map { _dump_trace_calc_saved_single_arg($nothard, $_) } @args + ]; +} + +sub dump_trace { + + # How many levels to skip. + my $skip = shift; + + # How many levels to show. (1e9 is a cheap way of saying "all of them"; + # it's unlikely that we'll have more than a billion stack frames. If you + # do, you've got an awfully big machine...) + my $count = shift || 1e9; + + # We increment skip because caller(1) is the first level *back* from + # the current one. Add $skip to the count of frames so we have a + # simple stop criterion, counting from $skip to $count+$skip. + $skip++; + $count += $skip; + + # These variables are used to capture output from caller(); + my ( $p, $file, $line, $sub, $h, $context ); + + my ( $e, $r, @sub, $args ); + + # XXX Okay... why'd we do that? + my $nothard = not $frame & 8; + local $frame = 0; + + # Do not want to trace this. + my $otrace = $trace; + $trace = 0; + + # Start out at the skip count. + # If we haven't reached the number of frames requested, and caller() is + # still returning something, stay in the loop. (If we pass the requested + # number of stack frames, or we run out - caller() returns nothing - we + # quit. + # Up the stack frame index to go back one more level each time. + for ( + my $i = $skip ; + $i < $count + and ( $p, $file, $line, $sub, $h, $context, $e, $r ) = caller($i) ; + $i++ + ) + { + # if the sub has args ($h true), make an anonymous array of the + # dumped args. + my $args = $h ? _dump_trace_calc_save_args($nothard) : undef; + + # If context is true, this is array (@)context. + # If context is false, this is scalar ($) context. + # If neither, context isn't defined. (This is apparently a 'can't + # happen' trap.) + $context = $context ? '@' : ( defined $context ? "\$" : '.' ); + + # remove trailing newline-whitespace-semicolon-end of line sequence + # from the eval text, if any. + $e =~ s/\n\s*\;\s*\Z// if $e; + + # Escape backslashed single-quotes again if necessary. + $e =~ s/([\\\'])/\\$1/g if $e; + + # if the require flag is true, the eval text is from a require. + if ($r) { + $sub = "require '$e'"; + } + + # if it's false, the eval text is really from an eval. + elsif ( defined $r ) { + $sub = "eval '$e'"; + } + + # If the sub is '(eval)', this is a block eval, meaning we don't + # know what the eval'ed text actually was. + elsif ( $sub eq '(eval)' ) { + $sub = "eval {...}"; + } + + # Stick the collected information into @sub as an anonymous hash. + push( + @sub, + { + context => $context, + sub => $sub, + args => $args, + file => $file, + line => $line + } + ); + + # Stop processing frames if the user hit control-C. + last if $signal; + } ## end for ($i = $skip ; $i < ... + + # Restore the trace value again. + $trace = $otrace; + @sub; +} ## end sub dump_trace + + +sub action { + my $action = shift; + + while ( $action =~ s/\\$// ) { + + # We have a backslash on the end. Read more. + $action .= gets(); + } ## end while ($action =~ s/\\$//) + + # Return the assembled action. + $action; +} ## end sub action + + +use vars qw($balanced_brace_re); + +sub unbalanced { + + # I hate using globals! + $balanced_brace_re ||= qr{ + ^ \{ + (?: + (?> [^{}] + ) # Non-parens without backtracking + | + (??{ $balanced_brace_re }) # Group with matching parens + ) * + \} $ + }x; + return $_[0] !~ m/$balanced_brace_re/; +} ## end sub unbalanced + + +sub gets { + return DB::readline("cont: "); +} + + +sub _db_system { + + # We save, change, then restore STDIN and STDOUT to avoid fork() since + # some non-Unix systems can do system() but have problems with fork(). + open( SAVEIN, "<&STDIN" ) || _db_warn("Can't save STDIN"); + open( SAVEOUT, ">&STDOUT" ) || _db_warn("Can't save STDOUT"); + open( STDIN, "<&IN" ) || _db_warn("Can't redirect STDIN"); + open( STDOUT, ">&OUT" ) || _db_warn("Can't redirect STDOUT"); + + # XXX: using csh or tcsh destroys sigint retvals! + system(@_); + open( STDIN, "<&SAVEIN" ) || _db_warn("Can't restore STDIN"); + open( STDOUT, ">&SAVEOUT" ) || _db_warn("Can't restore STDOUT"); + close(SAVEIN); + close(SAVEOUT); + + # most of the $? crud was coping with broken cshisms + if ( $? >> 8 ) { + _db_warn( "(Command exited ", ( $? >> 8 ), ")\n" ); + } + elsif ($?) { + _db_warn( + "(Command died of SIG#", + ( $? & 127 ), + ( ( $? & 128 ) ? " -- core dumped" : "" ), + ")", "\n" + ); + } ## end elsif ($?) + + return $?; + +} ## end sub system + +*system = \&_db_system; + + +use vars qw($ornaments); +use vars qw($rl_attribs); + +sub setterm { + + # Load Term::Readline, but quietly; don't debug it and don't trace it. + local $frame = 0; + local $doret = -2; + require Term::ReadLine; + + # If noTTY is set, but we have a TTY name, go ahead and hook up to it. + if ($notty) { + if ($tty) { + my ( $i, $o ) = split $tty, /,/; + $o = $i unless defined $o; + open( IN, '<', $i ) or die "Cannot open TTY '$i' for read: $!"; + open( OUT, '>', $o ) or die "Cannot open TTY '$o' for write: $!"; + $IN = \*IN; + $OUT = \*OUT; + _autoflush($OUT); + } ## end if ($tty) + + # We don't have a TTY - try to find one via Term::Rendezvous. + else { + require Term::Rendezvous; + + # See if we have anything to pass to Term::Rendezvous. + # Use $HOME/.perldbtty$$ if not. + my $rv = $ENV{PERLDB_NOTTY} || "$ENV{HOME}/.perldbtty$$"; + + # Rendezvous and get the filehandles. + my $term_rv = Term::Rendezvous->new( $rv ); + $IN = $term_rv->IN; + $OUT = $term_rv->OUT; + } ## end else [ if ($tty) + } ## end if ($notty) + + # We're a daughter debugger. Try to fork off another TTY. + if ( $term_pid eq '-1' ) { # In a TTY with another debugger + resetterm(2); + } + + # If we shouldn't use Term::ReadLine, don't. + if ( !$rl ) { + $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT ); + } + + # We're using Term::ReadLine. Get all the attributes for this terminal. + else { + $term = Term::ReadLine->new( 'perldb', $IN, $OUT ); + + $rl_attribs = $term->Attribs; + $rl_attribs->{basic_word_break_characters} .= '-:+/*,[])}' + if defined $rl_attribs->{basic_word_break_characters} + and index( $rl_attribs->{basic_word_break_characters}, ":" ) == -1; + $rl_attribs->{special_prefixes} = '$@&%'; + $rl_attribs->{completer_word_break_characters} .= '$@&%'; + $rl_attribs->{completion_function} = \&db_complete; + } ## end else [ if (!$rl) + + # Set up the LINEINFO filehandle. + $LINEINFO = $OUT unless defined $LINEINFO; + $lineinfo = $console unless defined $lineinfo; + + $term->MinLine(2); + + load_hist(); + + if ( $term->Features->{setHistory} and "@hist" ne "?" ) { + $term->SetHistory(@hist); + } + + # XXX Ornaments are turned on unconditionally, which is not + # always a good thing. + ornaments($ornaments) if defined $ornaments; + $term_pid = $$; +} ## end sub setterm + +sub load_hist { + $histfile //= option_val("HistFile", undef); + return unless defined $histfile; + open my $fh, "<", $histfile or return; + local $/ = "\n"; + @hist = (); + while (<$fh>) { + chomp; + push @hist, $_; + } + close $fh; +} + +sub save_hist { + return unless defined $histfile; + eval { require File::Path } or return; + eval { require File::Basename } or return; + File::Path::mkpath(File::Basename::dirname($histfile)); + open my $fh, ">", $histfile or die "Could not open '$histfile': $!"; + $histsize //= option_val("HistSize",100); + my @copy = grep { $_ ne '?' } @hist; + my $start = scalar(@copy) > $histsize ? scalar(@copy)-$histsize : 0; + for ($start .. $#copy) { + print $fh "$copy[$_]\n"; + } + close $fh or die "Could not write '$histfile': $!"; +} + + +sub connect_remoteport { + require IO::Socket; + + my $socket = IO::Socket::INET->new( + Timeout => '10', + PeerAddr => $remoteport, + Proto => 'tcp', + ); + if ( ! $socket ) { + die "Unable to connect to remote host: $remoteport\n"; + } + return $socket; +} + +sub socket_get_fork_TTY { + $tty = $LINEINFO = $IN = $OUT = connect_remoteport(); + + # Do I need to worry about setting $term? + + reset_IN_OUT( $IN, $OUT ); + return ''; +} + + +sub xterm_get_fork_TTY { + ( my $name = $0 ) =~ s,^.*[/\\],,s; + open XT, +qq[3>&1 xterm -title "Daughter Perl debugger $pids $name" -e sh -c 'tty 1>&3;\ + sleep 10000000' |]; + + # Get the output from 'tty' and clean it up a little. + my $tty = ; + chomp $tty; + + $pidprompt = ''; # Shown anyway in titlebar + + # We need $term defined or we can not switch to the newly created xterm + if ($tty ne '' && !defined $term) { + require Term::ReadLine; + if ( !$rl ) { + $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT ); + } + else { + $term = Term::ReadLine->new( 'perldb', $IN, $OUT ); + } + } + # There's our new TTY. + return $tty; +} ## end sub xterm_get_fork_TTY + + +# This example function resets $IN, $OUT itself +my $c_pipe = 0; +sub os2_get_fork_TTY { # A simplification of the following (and works without): + local $\ = ''; + ( my $name = $0 ) =~ s,^.*[/\\],,s; + my %opt = ( title => "Daughter Perl debugger $pids $name", + ($rl ? (read_by_key => 1) : ()) ); + require OS2::Process; + my ($in, $out, $pid) = eval { OS2::Process::io_term(related => 0, %opt) } + or return; + $pidprompt = ''; # Shown anyway in titlebar + reset_IN_OUT($in, $out); + $tty = '*reset*'; + return ''; # Indicate that reset_IN_OUT is called +} ## end sub os2_get_fork_TTY + + +# Notes about Terminal.app's AppleScript support, +# (aka things that might break in future OS versions). +# +# The "do script" command doesn't return a reference to the new window +# it creates, but since it appears frontmost and windows are enumerated +# front to back, we can use "first window" === "window 1". +# +# Since "do script" is implemented by supplying the argument (plus a +# return character) as terminal input, there's a potential race condition +# where the debugger could beat the shell to reading the command. +# To prevent this, we wait for the screen to clear before proceeding. +# +# 10.3 and 10.4: +# There's no direct accessor for the tty device name, so we fiddle +# with the window title options until it says what we want. +# +# 10.5: +# There _is_ a direct accessor for the tty device name, _and_ there's +# a new possible component of the window title (the name of the settings +# set). A separate version is needed. + +my @script_versions= + + ([237, <<'__LEOPARD__'], +tell application "Terminal" + do script "clear;exec sleep 100000" + tell first tab of first window + copy tty to thetty + set custom title to "forked perl debugger" + set title displays custom title to true + repeat while (length of first paragraph of (get contents)) > 0 + delay 0.1 + end repeat + end tell +end tell +thetty +__LEOPARD__ + + [100, <<'__JAGUAR_TIGER__'], +tell application "Terminal" + do script "clear;exec sleep 100000" + tell first window + set title displays shell path to false + set title displays window size to false + set title displays file name to false + set title displays device name to true + set title displays custom title to true + set custom title to "" + copy "/dev/" & name to thetty + set custom title to "forked perl debugger" + repeat while (length of first paragraph of (get contents)) > 0 + delay 0.1 + end repeat + end tell +end tell +thetty +__JAGUAR_TIGER__ + +); + +sub macosx_get_fork_TTY +{ + my($version,$script,$pipe,$tty); + + return unless $version=$ENV{TERM_PROGRAM_VERSION}; + foreach my $entry (@script_versions) { + if ($version>=$entry->[0]) { + $script=$entry->[1]; + last; + } + } + return unless defined($script); + return unless open($pipe,'-|','/usr/bin/osascript','-e',$script); + $tty=readline($pipe); + close($pipe); + return unless defined($tty) && $tty =~ m(^/dev/); + chomp $tty; + return $tty; +} + + +sub tmux_get_fork_TTY { + return unless $ENV{TMUX}; + + my $pipe; + + my $status = open $pipe, '-|', 'tmux', 'split-window', + '-P', '-F', '#{pane_tty}', 'sleep 100000'; + + if ( !$status ) { + return; + } + + my $tty = <$pipe>; + close $pipe; + + if ( $tty ) { + chomp $tty; + + if ( !defined $term ) { + require Term::ReadLine; + if ( !$rl ) { + $term = Term::ReadLine::Stub->new( 'perldb', $IN, $OUT ); + } + else { + $term = Term::ReadLine->new( 'perldb', $IN, $OUT ); + } + } + } + + return $tty; +} + + +use vars qw($fork_TTY); + +sub create_IN_OUT { # Create a window with IN/OUT handles redirected there + + # If we know how to get a new TTY, do it! $in will have + # the TTY name if get_fork_TTY works. + my $in = get_fork_TTY(@_) if defined &get_fork_TTY; + + # It used to be that + $in = $fork_TTY if defined $fork_TTY; # Backward compatibility + + if ( not defined $in ) { + my $why = shift; + + # We don't know how. + print_help(< Forked, but do not know how to create a new B. I<#########> +EOP + + # Forked debugger. + print_help(< Daughter session, do not know how to change a B. I<#########> + This may be an asynchronous session, so the parent debugger may be active. +EOP + + # Note that both debuggers are fighting over the same input. + print_help(< in B<\$DB::fork_TTY>, or define a function + B returning this. + + On I-like systems one can get the name of a I for the given window + by typing B, and disconnect the I from I by B. + +EOP + } ## end if (not defined $in) + elsif ( $in ne '' ) { + TTY($in); + } + else { + $console = ''; # Indicate no need to open-from-the-console + } + undef $fork_TTY; +} ## end sub create_IN_OUT + + +sub resetterm { # We forked, so we need a different TTY + + # Needs to be passed to create_IN_OUT() as well. + my $in = shift; + + # resetterm(2): got in here because of a system() starting a debugger. + # resetterm(1): just forked. + my $systemed = $in > 1 ? '-' : ''; + + # If there's already a list of pids, add this to the end. + if ($pids) { + $pids =~ s/\]/$systemed->$$]/; + } + + # No pid list. Time to make one. + else { + $pids = "[$term_pid->$$]"; + } + + # The prompt we're going to be using for this debugger. + $pidprompt = $pids; + + # We now 0wnz this terminal. + $term_pid = $$; + + # Just return if we're not supposed to try to create a new TTY. + return unless $CreateTTY & $in; + + # Try to create a new IN/OUT pair. + create_IN_OUT($in); +} ## end sub resetterm + + +sub readline { + + # Localize to prevent it from being smashed in the program being debugged. + local $.; + + # If there are stacked filehandles to read from ... + # (Handle it before the typeahead, because we may call source/etc. from + # the typeahead.) + while (@cmdfhs) { + + # Read from the last one in the stack. + my $line = CORE::readline( $cmdfhs[-1] ); + + # If we got a line ... + defined $line + ? ( print $OUT ">> $line" and return $line ) # Echo and return + : close pop @cmdfhs; # Pop and close + } ## end while (@cmdfhs) + + # Pull a line out of the typeahead if there's stuff there. + if (@typeahead) { + + # How many lines left. + my $left = @typeahead; + + # Get the next line. + my $got = shift @typeahead; + + # Print a message saying we got input from the typeahead. + local $\ = ''; + print $OUT "auto(-$left)", shift, $got, "\n"; + + # Add it to the terminal history (if possible). + $term->AddHistory($got) + if length($got) > 1 + and defined $term->Features->{addHistory}; + return $got; + } ## end if (@typeahead) + + # We really need to read some input. Turn off entry/exit trace and + # return value printing. + local $frame = 0; + local $doret = -2; + + # Nothing on the filehandle stack. Socket? + if ( ref $OUT and UNIVERSAL::isa( $OUT, 'IO::Socket::INET' ) ) { + + # Send anything we have to send. + $OUT->write( join( '', @_ ) ); + + # Receive anything there is to receive. + my $stuff = ''; + my $buf; + my $first_time = 1; + + while ($first_time or (length($buf) && ($stuff .= $buf) !~ /\n/)) + { + $first_time = 0; + $IN->recv( $buf = '', 2048 ); # XXX "what's wrong with sysread?" + # XXX Don't know. You tell me. + } + + # What we got. + return $stuff; + } ## end if (ref $OUT and UNIVERSAL::isa... + + # No socket. Just read from the terminal. + else { + return $term->readline(@_); + } +} ## end sub readline + + +sub dump_option { + my ( $opt, $val ) = @_; + $val = option_val( $opt, 'N/A' ); + $val =~ s/([\\\'])/\\$1/g; + printf $OUT "%20s = '%s'\n", $opt, $val; +} ## end sub dump_option + +sub options2remember { + foreach my $k (@RememberOnROptions) { + $option{$k} = option_val( $k, 'N/A' ); + } + return %option; +} + + +sub option_val { + my ( $opt, $default ) = @_; + my $val; + + # Does this option exist, and is it a variable? + # If so, retrieve the value via the value in %optionVars. + if ( defined $optionVars{$opt} + and defined ${ $optionVars{$opt} } ) + { + $val = ${ $optionVars{$opt} }; + } + + # Does this option exist, and it's a subroutine? + # If so, call the subroutine via the ref in %optionAction + # and capture the value. + elsif ( defined $optionAction{$opt} + and defined &{ $optionAction{$opt} } ) + { + $val = &{ $optionAction{$opt} }(); + } + + # If there's an action or variable for the supplied option, + # but no value was set, use the default. + elsif (defined $optionAction{$opt} and not defined $option{$opt} + or defined $optionVars{$opt} and not defined ${ $optionVars{$opt} } ) + { + $val = $default; + } + + # Otherwise, do the simple hash lookup. + else { + $val = $option{$opt}; + } + + # If the value isn't defined, use the default. + # Then return whatever the value is. + $val = $default unless defined $val; + $val; +} ## end sub option_val + + +sub parse_options { + my ($s) = @_; + local $\ = ''; + + my $option; + + # These options need a value. Don't allow them to be clobbered by accident. + my %opt_needs_val = map { ( $_ => 1 ) } qw{ + dumpDepth arrayDepth hashDepth LineInfo maxTraceLen ornaments windowSize + pager quote ReadLine recallCommand RemotePort ShellBang TTY CommandSet + }; + + while (length($s)) { + my $val_defaulted; + + # Clean off excess leading whitespace. + $s =~ s/^\s+// && next; + + # Options are always all word characters, followed by a non-word + # separator. + if ($s !~ s/^(\w+)(\W?)//) { + print {$OUT} "Invalid option '$s'\n"; + last; + } + my ( $opt, $sep ) = ( $1, $2 ); + + # Make sure that such an option exists. + my $matches = ( grep { /^\Q$opt/ && ( $option = $_ ) } @options ) + || ( grep { /^\Q$opt/i && ( $option = $_ ) } @options ); + + unless ($matches) { + print {$OUT} "Unknown option '$opt'\n"; + next; + } + if ($matches > 1) { + print {$OUT} "Ambiguous option '$opt'\n"; + next; + } + my $val; + + # '?' as separator means query, but must have whitespace after it. + if ( "?" eq $sep ) { + if ($s =~ /\A\S/) { + print {$OUT} "Option query '$opt?' followed by non-space '$s'\n" ; + + last; + } + + #&dump_option($opt); + } ## end if ("?" eq $sep) + + # Separator is whitespace (or just a carriage return). + # They're going for a default, which we assume is 1. + elsif ( $sep !~ /\S/ ) { + $val_defaulted = 1; + $val = "1"; # this is an evil default; make 'em set it! + } + + # Separator is =. Trying to set a value. + elsif ( $sep eq "=" ) { + + # If quoted, extract a quoted string. + if ($s =~ s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) { + my $quote = $1; + ( $val = $2 ) =~ s/\\([$quote\\])/$1/g; + } + + # Not quoted. Use the whole thing. Warn about 'option='. + else { + $s =~ s/^(\S*)//; + $val = $1; + print OUT qq(Option better cleared using $opt=""\n) + unless length $val; + } ## end else [ if (s/ (["']) ( (?: \\. | (?! \1 ) [^\\] )* ) \1 //x) + + } ## end elsif ($sep eq "=") + + # "Quoted" with [], <>, or {}. + else { #{ to "let some poor schmuck bounce on the % key in B." + my ($end) = + "\\" . substr( ")]>}$sep", index( "([<{", $sep ), 1 ); #} + $s =~ s/^(([^\\$end]|\\[\\$end])*)$end($|\s+)// + or print( $OUT "Unclosed option value '$opt$sep$_'\n" ), last; + ( $val = $1 ) =~ s/\\([\\$end])/$1/g; + } ## end else [ if ("?" eq $sep) + + # Exclude non-booleans from getting set to 1 by default. + if ( $opt_needs_val{$option} && $val_defaulted ) { + my $cmd = ( $CommandSet eq '580' ) ? 'o' : 'O'; + print {$OUT} +"Option '$opt' is non-boolean. Use '$cmd $option=VAL' to set, '$cmd $option?' to query\n"; + next; + } ## end if ($opt_needs_val{$option... + + # Save the option value. + $option{$option} = $val if defined $val; + + # Load any module that this option requires. + if ( defined($optionRequire{$option}) && defined($val) ) { + eval qq{ + local \$frame = 0; + local \$doret = -2; + require '$optionRequire{$option}'; + 1; + } || die $@ # XXX: shouldn't happen + } + + # Set it. + # Stick it in the proper variable if it goes in a variable. + if (defined($optionVars{$option}) && defined($val)) { + ${ $optionVars{$option} } = $val; + } + + # Call the appropriate sub if it gets set via sub. + if (defined($optionAction{$option}) + && defined (&{ $optionAction{$option} }) + && defined ($val)) + { + &{ $optionAction{$option} }($val); + } + + # Not initialization - echo the value we set it to. + dump_option($option) if ($OUT ne \*STDERR); + } ## end while (length) +} ## end sub parse_options + + +sub set_list { + my ( $stem, @list ) = @_; + my $val; + + # VAR_n: how many we have. Scalar assignment gets the number of items. + $ENV{"${stem}_n"} = @list; + + # Grab each item in the list, escape the backslashes, encode the non-ASCII + # as hex, and then save in the appropriate VAR_0, VAR_1, etc. + for my $i ( 0 .. $#list ) { + $val = $list[$i]; + $val =~ s/\\/\\\\/g; + no warnings 'experimental::regex_sets'; + $val =~ s/ ( (?[ [\000-\xFF] & [:^print:] ]) ) / + "\\0x" . unpack('H2',$1)/xaeg; + $ENV{"${stem}_$i"} = $val; + } ## end for $i (0 .. $#list) +} ## end sub set_list + + +sub get_list { + my $stem = shift; + my @list; + my $n = delete $ENV{"${stem}_n"}; + my $val; + for my $i ( 0 .. $n - 1 ) { + $val = delete $ENV{"${stem}_$i"}; + $val =~ s/\\((\\)|0x(..))/ $2 ? $2 : pack('H2', $3) /ge; + push @list, $val; + } + @list; +} ## end sub get_list + + +sub catch { + $signal = 1; + return; # Put nothing on the stack - malloc/free land! +} + + +sub _db_warn { + my ($msg) = join( "", @_ ); + $msg .= ": $!\n" unless $msg =~ /\n$/; + local $\ = ''; + print $OUT $msg; +} ## end sub warn + +*warn = \&_db_warn; + + +sub reset_IN_OUT { + my $switch_li = $LINEINFO eq $OUT; + + # If there's a term and it's able to get a new tty, try to get one. + if ( $term and $term->Features->{newTTY} ) { + ( $IN, $OUT ) = ( shift, shift ); + $term->newTTY( $IN, $OUT ); + } + + # This term can't get a new tty now. Better luck later. + elsif ($term) { + _db_warn("Too late to set IN/OUT filehandles, enabled on next 'R'!\n"); + } + + # Set the filehndles up as they were. + else { + ( $IN, $OUT ) = ( shift, shift ); + } + + # Unbuffer the output filehandle. + _autoflush($OUT); + + # Point LINEINFO to the same output filehandle if it was there before. + $LINEINFO = $OUT if $switch_li; +} ## end sub reset_IN_OUT + + +sub TTY { + + if ( @_ and $term and $term->Features->{newTTY} ) { + + # This terminal supports switching to a new TTY. + # Can be a list of two files, or on string containing both names, + # comma-separated. + # XXX Should this perhaps be an assignment from @_? + my ( $in, $out ) = shift; + if ( $in =~ /,/ ) { + + # Split list apart if supplied. + ( $in, $out ) = split /,/, $in, 2; + } + else { + + # Use the same file for both input and output. + $out = $in; + } + + # Open file onto the debugger's filehandles, if you can. + open IN, '<', $in or die "cannot open '$in' for read: $!"; + open OUT, '>', $out or die "cannot open '$out' for write: $!"; + + # Swap to the new filehandles. + reset_IN_OUT( \*IN, \*OUT ); + + # Save the setting for later. + return $tty = $in; + } ## end if (@_ and $term and $term... + + # Terminal doesn't support new TTY, or doesn't support readline. + # Can't do it now, try restarting. + if ($term and @_) { + _db_warn("Too late to set TTY, enabled on next 'R'!\n"); + } + + # Useful if done through PERLDB_OPTS: + $console = $tty = shift if @_; + + # Return whatever the TTY is. + $tty or $console; +} ## end sub TTY + + +sub noTTY { + if ($term) { + _db_warn("Too late to set noTTY, enabled on next 'R'!\n") if @_; + } + $notty = shift if @_; + $notty; +} ## end sub noTTY + + +sub ReadLine { + if ($term) { + _db_warn("Too late to set ReadLine, enabled on next 'R'!\n") if @_; + } + $rl = shift if @_; + $rl; +} ## end sub ReadLine + + +sub RemotePort { + if ($term) { + _db_warn("Too late to set RemotePort, enabled on next 'R'!\n") if @_; + } + $remoteport = shift if @_; + $remoteport; +} ## end sub RemotePort + + +sub tkRunning { + if ( ${ $term->Features }{tkRunning} ) { + return $term->tkRunning(@_); + } + else { + local $\ = ''; + print $OUT "tkRunning not supported by current ReadLine package.\n"; + 0; + } +} ## end sub tkRunning + + +sub NonStop { + if ($term) { + _db_warn("Too late to set up NonStop mode, enabled on next 'R'!\n") + if @_; + } + $runnonstop = shift if @_; + $runnonstop; +} ## end sub NonStop + +sub DollarCaretP { + if ($term) { + _db_warn("Some flag changes could not take effect until next 'R'!\n") + if @_; + } + $^P = parse_DollarCaretP_flags(shift) if @_; + expand_DollarCaretP_flags($^P); +} + + +sub pager { + if (@_) { + $pager = shift; + $pager = "|" . $pager unless $pager =~ /^(\+?\>|\|)/; + } + $pager; +} ## end sub pager + + +sub shellBang { + + # If we got an argument, meta-quote it, and add '\b' if it + # ends in a word character. + if (@_) { + $sh = quotemeta shift; + $sh .= "\\b" if $sh =~ /\w$/; + } + + # Generate the printable version for the help: + $psh = $sh; # copy it + $psh =~ s/\\b$//; # Take off trailing \b if any + $psh =~ s/\\(.)/$1/g; # De-escape + $psh; # return the printable version +} ## end sub shellBang + + +sub ornaments { + if ( defined $term ) { + + # We don't want to show warning backtraces, but we do want die() ones. + local $warnLevel = 0; + local $dieLevel = 1; + + # No ornaments if the terminal doesn't support them. + if (not $term->Features->{ornaments}) { + return ''; + } + + return (eval { $term->ornaments(@_) } || ''); + } + + # Use what was passed in if we can't determine it ourselves. + else { + $ornaments = shift; + + return $ornaments; + } + +} ## end sub ornaments + + +sub recallCommand { + + # If there is input, metaquote it. Add '\b' if it ends with a word + # character. + if (@_) { + $rc = quotemeta shift; + $rc .= "\\b" if $rc =~ /\w$/; + } + + # Build it into a printable version. + $prc = $rc; # Copy it + $prc =~ s/\\b$//; # Remove trailing \b + $prc =~ s/\\(.)/$1/g; # Remove escapes + return $prc; # Return the printable version +} ## end sub recallCommand + + +sub LineInfo { + if (@_) { + $lineinfo = shift; + + # If this is a valid "thing to be opened for output", tack a + # '>' onto the front. + my $stream = ( $lineinfo =~ /^(\+?\>|\|)/ ) ? $lineinfo : ">$lineinfo"; + + # If this is a pipe, the stream points to a slave editor. + $slave_editor = ( $stream =~ /^\|/ ); + + my $new_lineinfo_fh; + # Open it up and unbuffer it. + open ($new_lineinfo_fh , $stream ) + or _db_warn("Cannot open '$stream' for write"); + $LINEINFO = $new_lineinfo_fh; + _autoflush($LINEINFO); + } + + return $lineinfo; +} ## end sub LineInfo + + +sub list_modules { # versions + my %version; + my $file; + + # keys are the "as-loaded" name, values are the fully-qualified path + # to the file itself. + for ( keys %INC ) { + $file = $_; # get the module name + s,\.p[lm]$,,i; # remove '.pl' or '.pm' + s,/,::,g; # change '/' to '::' + s/^perl5db$/DB/; # Special case: debugger + # moves to package DB + s/^Term::ReadLine::readline$/readline/; # simplify readline + + # If the package has a $VERSION package global (as all good packages + # should!) decode it and save as partial message. + my $pkg_version = do { no strict 'refs'; ${ $_ . '::VERSION' } }; + if ( defined $pkg_version ) { + $version{$file} = "$pkg_version from "; + } + + # Finish up the message with the file the package came from. + $version{$file} .= $INC{$file}; + } ## end for (keys %INC) + + # Hey, dumpit() formats a hash nicely, so why not use it? + dumpit( $OUT, \%version ); +} ## end sub list_modules + + +use vars qw($pre580_help); +use vars qw($pre580_summary); + +sub sethelp { + + # XXX: make sure there are tabs between the command and explanation, + # or print_help will screw up your formatting if you have + # eeevil ornaments enabled. This is an insane mess. + + $help = " +Help is currently only available for the new 5.8 command set. +No help is available for the old command set. +We assume you know what you're doing if you switch to it. + +B Stack trace. +B [I] Single step [in I]. +B [I] Next, steps over subroutine calls [in I]. +> Repeat last B or B command. +B Return from current subroutine. +B [I|I] Continue; optionally inserts a one-time-only breakpoint + at the specified position. +B IB<+>I List I+1 lines starting at I. +B IB<->I List lines I through I. +B I List single I. +B I List first window of lines from subroutine. +B I<\$var> List first window of lines from subroutine referenced by I<\$var>. +B List next window of lines. +B<-> List previous window of lines. +B [I] View window around I. +B<.> Return to the executed line. +B I Switch to viewing I. File must be already loaded. + I may be either the full name of the file, or a regular + expression matching the full file name: + B I and B I may access the same file. + Evals (with saved bodies) are considered to be filenames: + B I<(eval 7)> and B I access the body of the 7th eval + (in the order of execution). +BIB Search forwards for I; final B is optional. +BIB Search backwards for I; final B is optional. +B [I] List actions and or breakpoints and or watch-expressions. +B [[B]I] List subroutine names [not] matching I. +B [I] Toggle trace mode (to max I levels below current stack depth). +B [I] I Trace through execution of I. +B Sets breakpoint on current line) +B [I] [I] + Set breakpoint; I defaults to the current execution line; + I breaks if it evaluates to true, defaults to '1'. +B I [I] + Set breakpoint at first line of subroutine. +B I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>. +B B I Set breakpoint on 'require'ing the given file. +B B I [I] + Set breakpoint at first line of subroutine after + it is compiled. +B B I + Stop after the subroutine is compiled. +B [I] Delete the breakpoint for I. +B I<*> Delete all breakpoints. +B [I] I + Set an action to be done before the I is executed; + I defaults to the current execution line. + Sequence is: check for breakpoint/watchpoint, print line + if necessary, do action, prompt user if necessary, + execute line. +B Does nothing +B [I] Delete the action for I. +B I<*> Delete all actions. +B I Add a global watch-expression. +B Does nothing +B I Delete a global watch-expression. +B I<*> Delete all watch-expressions. +B [I [I]] List some (default all) variables in package (default current). + Use B<~>I and BI for positive and negative regexps. +B [I] Same as \"B I [I]\". +B I Evals expression in list context, dumps the result. +B I Evals expression in list context, prints methods callable + on the first element of the result. +B I Prints methods callable via the given class. +B Show versions of loaded modules. +B I Prints nested parents of given class. +B Display current thread id. +B Display all thread ids the current one will be identified: . +B [I [I]] List lexicals in higher scope . Vars same as B. + +B<<> ? List Perl commands to run before each prompt. +B<<> I Define Perl command to run before each prompt. +B<<<> I Add to the list of Perl commands to run before each prompt. +B<< *> Delete the list of perl commands to run before each prompt. +B<>> ? List Perl commands to run after each prompt. +B<>> I Define Perl command to run after each prompt. +B<>>B<>> I Add to the list of Perl commands to run after each prompt. +B<>>B< *> Delete the list of Perl commands to run after each prompt. +B<{> I Define debugger command to run before each prompt. +B<{> ? List debugger commands to run before each prompt. +B<{{> I Add to the list of debugger commands to run before each prompt. +B<{ *> Delete the list of debugger commands to run before each prompt. +B<$prc> I Redo a previous command (default previous command). +B<$prc> I<-number> Redo number'th-to-last command. +B<$prc> I Redo last command that started with I. + See 'B I' too. +B<$psh$psh> I Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)" + . ( + $rc eq $sh + ? "" + : " +B<$psh> [I] Run I in subshell (forces \"\$SHELL -c 'cmd'\")." + ) . " + See 'B I' too. +B I Execute I containing debugger commands (may nest). +B I Save current debugger session (actual history) to I. +B Rerun session to current position. +B I Rerun session to numbered command. +B I<-n> Rerun session to number'th-to-last command. +B I<-number> Display last number commands (default all). +B I<*> Delete complete history. +B

I Same as \"I\" in current package. +B<|>I Run debugger command, piping DB::OUT to current pager. +B<||>I Same as B<|>I but DB::OUT is temporarily select()ed as well. +B<\=> [I I] Define a command alias, or list current aliases. +I Execute as a perl statement in current package. +B Pure-man-restart of debugger, some of debugger state + and command-line options may be lost. + Currently the following settings are preserved: + history, breakpoints and actions, debugger Bptions + and the following command-line options: I<-w>, I<-I>, I<-e>. + +B [I] ... Set boolean option to true +B [IB] Query options +B [IB<=>I] [I=B<\">IB<\">] ... + Set options. Use quotes if spaces in value. + I, I chars used to recall command or spawn shell; + I program for output of \"|cmd\"; + I run Tk while prompting (with ReadLine); + I I I level of verbosity; + I Allows stepping off the end of the script. + I Debugger should stop as early as possible. + I Remote hostname:port for remote debugging + The following options affect what happens with B, B, and B commands: + I, I print only first N elements ('' for all); + I, I change style of array and hash dump; + I whether to print contents of globs; + I dump arrays holding debugged files; + I dump symbol tables of packages; + I dump contents of \"reused\" addresses; + I, I, I change style of string dump; + I Do not print the overload-stringified value; + Other options include: + I affects printing of return value after B command, + I affects printing messages on subroutine entry/exit. + I affects printing messages on possible breaking points. + I gives max length of evals/args listed in stack trace. + I affects screen appearance of the command line. + I bits control attempts to create a new TTY on events: + 1: on fork() 2: debugger is started inside debugger + 4: on startup + During startup options are initialized from \$ENV{PERLDB_OPTS}. + You can put additional initialization options I, I, + I, I, and I there (or use + B after you set them). + +B or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction. +B Summary of debugger commands. +B [I] Get help [on a specific debugger command], enter B<|h> to page. +B Long help for debugger commands +B<$doccmd> I Runs the external doc viewer B<$doccmd> command on the + named Perl I, or on B<$doccmd> itself if omitted. + Set B<\$DB::doccmd> to change viewer. + +Type '|h h' for a paged display if this was too hard to read. + +"; # Fix balance of vi % matching: }}}} + + # note: tabs in the following section are not-so-helpful + $summary = <<"END_SUM"; +I I + B [I|I] List source code B Stack trace + B<-> or B<.> List previous/current line B [I] Single step [in expr] + B [I] View around line B [I] Next, steps over subs + B I View source in file /B> Repeat last B or B + BIB BIB Search forw/backw B Return from subroutine + B Show module versions B [I|I] Continue until position +I B List break/watch/actions + B [...] Set debugger options B [I] [I] Toggle trace [max depth] ][trace expr] + B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint + B<$prc> [I|I] Redo a previous command B I Delete a/all breakpoints + B [I<-num>] Display last num commands B [I] I Do cmd before line + B<=> [I I] Define/list an alias B I Delete a/all actions + B [I] Get help on command B I Add a watch expression + B Complete help page B I Delete a/all watch exprs + B<|>[B<|>]I Send output to pager B<$psh>\[B<$psh>\] I Run cmd in a subprocess + B or B<^D> Quit B Attempt a restart +I B Execute perl code, also see: B,B,B I + B|B I Evals expr in list context, dumps the result or lists methods. + B

I Print expression (uses script's current package). + B [[B]I] List subroutine names [not] matching pattern + B [I [I]] List Variables in Package. Vars can be ~pattern or !pattern. + B [I] Same as \"B I [I]\". B I inheritance tree. + B [I [I]] List lexicals in higher scope . Vars same as B. + B Display thread id B Display all thread ids. +For more help, type B I, or run B<$doccmd perldebug> for all docs. +END_SUM + + # ')}}; # Fix balance of vi % matching + + # and this is really numb... + $pre580_help = " +B Stack trace. +B [I] Single step [in I]. +B [I] Next, steps over subroutine calls [in I]. +B> Repeat last B or B command. +B Return from current subroutine. +B [I|I] Continue; optionally inserts a one-time-only breakpoint + at the specified position. +B IB<+>I List I+1 lines starting at I. +B IB<->I List lines I through I. +B I List single I. +B I List first window of lines from subroutine. +B I<\$var> List first window of lines from subroutine referenced by I<\$var>. +B List next window of lines. +B<-> List previous window of lines. +B [I] List window around I. +B<.> Return to the executed line. +B I Switch to viewing I. File must be already loaded. + I may be either the full name of the file, or a regular + expression matching the full file name: + B I and B I may access the same file. + Evals (with saved bodies) are considered to be filenames: + B I<(eval 7)> and B I access the body of the 7th eval + (in the order of execution). +BIB Search forwards for I; final B is optional. +BIB Search backwards for I; final B is optional. +B List all breakpoints and actions. +B [[B]I] List subroutine names [not] matching I. +B [I] Toggle trace mode (to max I levels below current stack depth) . +B [I] I Trace through execution of I. +B [I] [I] + Set breakpoint; I defaults to the current execution line; + I breaks if it evaluates to true, defaults to '1'. +B I [I] + Set breakpoint at first line of subroutine. +B I<\$var> Set breakpoint at first line of subroutine referenced by I<\$var>. +B B I Set breakpoint on 'require'ing the given file. +B B I [I] + Set breakpoint at first line of subroutine after + it is compiled. +B B I + Stop after the subroutine is compiled. +B [I] Delete the breakpoint for I. +B Delete all breakpoints. +B [I] I + Set an action to be done before the I is executed; + I defaults to the current execution line. + Sequence is: check for breakpoint/watchpoint, print line + if necessary, do action, prompt user if necessary, + execute line. +B [I] Delete the action for I. +B Delete all actions. +B I Add a global watch-expression. +B Delete all watch-expressions. +B [I [I]] List some (default all) variables in package (default current). + Use B<~>I and BI for positive and negative regexps. +B [I] Same as \"B I [I]\". +B I Evals expression in list context, dumps the result. +B I Evals expression in list context, prints methods callable + on the first element of the result. +B I Prints methods callable via the given class. + +B<<> ? List Perl commands to run before each prompt. +B<<> I Define Perl command to run before each prompt. +B<<<> I Add to the list of Perl commands to run before each prompt. +B<>> ? List Perl commands to run after each prompt. +B<>> I Define Perl command to run after each prompt. +B<>>B<>> I Add to the list of Perl commands to run after each prompt. +B<{> I Define debugger command to run before each prompt. +B<{> ? List debugger commands to run before each prompt. +B<{{> I Add to the list of debugger commands to run before each prompt. +B<$prc> I Redo a previous command (default previous command). +B<$prc> I<-number> Redo number'th-to-last command. +B<$prc> I Redo last command that started with I. + See 'B I' too. +B<$psh$psh> I Run cmd in a subprocess (reads from DB::IN, writes to DB::OUT)" + . ( + $rc eq $sh + ? "" + : " +B<$psh> [I] Run I in subshell (forces \"\$SHELL -c 'cmd'\")." + ) . " + See 'B I' too. +B I Execute I containing debugger commands (may nest). +B I<-number> Display last number commands (default all). +B

I Same as \"I\" in current package. +B<|>I Run debugger command, piping DB::OUT to current pager. +B<||>I Same as B<|>I but DB::OUT is temporarilly select()ed as well. +B<\=> [I I] Define a command alias, or list current aliases. +I Execute as a perl statement in current package. +B Show versions of loaded modules. +B Pure-man-restart of debugger, some of debugger state + and command-line options may be lost. + Currently the following settings are preserved: + history, breakpoints and actions, debugger Bptions + and the following command-line options: I<-w>, I<-I>, I<-e>. + +B [I] ... Set boolean option to true +B [IB] Query options +B [IB<=>I] [I=B<\">IB<\">] ... + Set options. Use quotes if spaces in value. + I, I chars used to recall command or spawn shell; + I program for output of \"|cmd\"; + I run Tk while prompting (with ReadLine); + I I I level of verbosity; + I Allows stepping off the end of the script. + I Debugger should stop as early as possible. + I Remote hostname:port for remote debugging + The following options affect what happens with B, B, and B commands: + I, I print only first N elements ('' for all); + I, I change style of array and hash dump; + I whether to print contents of globs; + I dump arrays holding debugged files; + I dump symbol tables of packages; + I dump contents of \"reused\" addresses; + I, I, I change style of string dump; + I Do not print the overload-stringified value; + Other options include: + I affects printing of return value after B command, + I affects printing messages on subroutine entry/exit. + I affects printing messages on possible breaking points. + I gives max length of evals/args listed in stack trace. + I affects screen appearance of the command line. + I bits control attempts to create a new TTY on events: + 1: on fork() 2: debugger is started inside debugger + 4: on startup + During startup options are initialized from \$ENV{PERLDB_OPTS}. + You can put additional initialization options I, I, + I, I, and I there (or use + B after you set them). + +B or B<^D> Quit. Set B<\$DB::finished = 0> to debug global destruction. +B [I] Get help [on a specific debugger command], enter B<|h> to page. +B Summary of debugger commands. +B<$doccmd> I Runs the external doc viewer B<$doccmd> command on the + named Perl I, or on B<$doccmd> itself if omitted. + Set B<\$DB::doccmd> to change viewer. + +Type '|h' for a paged display if this was too hard to read. + +"; # Fix balance of vi % matching: }}}} + + # note: tabs in the following section are not-so-helpful + $pre580_summary = <<"END_SUM"; +I I + B [I|I] List source code B Stack trace + B<-> or B<.> List previous/current line B [I] Single step [in expr] + B [I] List around line B [I] Next, steps over subs + B I View source in file /B> Repeat last B or B + BIB BIB Search forw/backw B Return from subroutine + B Show versions of modules B [I|I] Continue until position +I B List break/watch/actions + B [...] Set debugger options B [I] Toggle trace [trace expr] + B<<>[B<<>]|B<{>[B<{>]|B<>>[B<>>] [I] Do pre/post-prompt B [I|I|I] [I] Set breakpoint + B<$prc> [I|I] Redo a previous command B [I] or B Delete a/all breakpoints + B [I<-num>] Display last num commands B [I] I Do cmd before line + B<=> [I I] Define/list an alias B I Add a watch expression + B [I] Get help on command B or B Delete all actions/watch + B<|>[B<|>]I Send output to pager B<$psh>\[B<$psh>\] I Run cmd in a subprocess + B or B<^D> Quit B Attempt a restart +I B Execute perl code, also see: B,B,B I + B|B I Evals expr in list context, dumps the result or lists methods. + B

I Print expression (uses script's current package). + B [[B]I] List subroutine names [not] matching pattern + B [I [I]] List Variables in Package. Vars can be ~pattern or !pattern. + B [I] Same as \"B I [I]\". + B [I [I]] List lexicals in higher scope . Vars same as B. +For more help, type B I, or run B<$doccmd perldebug> for all docs. +END_SUM + + # ')}}; # Fix balance of vi % matching + +} ## end sub sethelp + + +sub print_help { + my $help_str = shift; + + # Restore proper alignment destroyed by eeevil I<> and B<> + # ornaments: A pox on both their houses! + # + # A help command will have everything up to and including + # the first tab sequence padded into a field 16 (or if indented 20) + # wide. If it's wider than that, an extra space will be added. + $help_str =~ s{ + ^ # only matters at start of line + ( \ {4} | \t )* # some subcommands are indented + ( < ? # so works + [BI] < [^\t\n] + ) # find an eeevil ornament + ( \t+ ) # original separation, discarded + ( .* ) # this will now start (no earlier) than + # column 16 + } { + my($leadwhite, $command, $midwhite, $text) = ($1, $2, $3, $4); + my $clean = $command; + $clean =~ s/[BI]<([^>]*)>/$1/g; + + # replace with this whole string: + ($leadwhite ? " " x 4 : "") + . $command + . ((" " x (16 + ($leadwhite ? 4 : 0) - length($clean))) || " ") + . $text; + + }mgex; + + $help_str =~ s{ # handle bold ornaments + B < ( [^>] + | > ) > + } { + $Term::ReadLine::TermCap::rl_term_set[2] + . $1 + . $Term::ReadLine::TermCap::rl_term_set[3] + }gex; + + $help_str =~ s{ # handle italic ornaments + I < ( [^>] + | > ) > + } { + $Term::ReadLine::TermCap::rl_term_set[0] + . $1 + . $Term::ReadLine::TermCap::rl_term_set[1] + }gex; + + local $\ = ''; + print {$OUT} $help_str; + + return; +} ## end sub print_help + + +use vars qw($fixed_less); + +sub _calc_is_less { + if ($pager =~ /\bless\b/) + { + return 1; + } + elsif ($pager =~ /\bmore\b/) + { + # Nope, set to more. See what's out there. + my @st_more = stat('/usr/bin/more'); + my @st_less = stat('/usr/bin/less'); + + # is it really less, pretending to be more? + return ( + @st_more + && @st_less + && $st_more[0] == $st_less[0] + && $st_more[1] == $st_less[1] + ); + } + else { + return; + } +} + +sub fix_less { + + # We already know if this is set. + return if $fixed_less; + + # changes environment! + # 'r' added so we don't do (slow) stats again. + $fixed_less = 1 if _calc_is_less(); + + return; +} ## end sub fix_less + + +sub diesignal { + + # No entry/exit messages. + local $frame = 0; + + # No return value prints. + local $doret = -2; + + # set the abort signal handling to the default (just terminate). + $SIG{'ABRT'} = 'DEFAULT'; + + # If we enter the signal handler recursively, kill myself with an + # abort signal (so we just terminate). + kill 'ABRT', $$ if $panic++; + + # If we can show detailed info, do so. + if ( defined &Carp::longmess ) { + + # Don't recursively enter the warn handler, since we're carping. + local $SIG{__WARN__} = ''; + + # Skip two levels before reporting traceback: we're skipping + # mydie and confess. + local $Carp::CarpLevel = 2; # mydie + confess + + # Tell us all about it. + _db_warn( Carp::longmess("Signal @_") ); + } + + # No Carp. Tell us about the signal as best we can. + else { + local $\ = ''; + print $DB::OUT "Got signal @_\n"; + } + + # Drop dead. + kill 'ABRT', $$; +} ## end sub diesignal + + +sub dbwarn { + + # No entry/exit trace. + local $frame = 0; + + # No return value printing. + local $doret = -2; + + # Turn off warn and die handling to prevent recursive entries to this + # routine. + local $SIG{__WARN__} = ''; + local $SIG{__DIE__} = ''; + + # Load Carp if we can. If $^S is false (current thing being compiled isn't + # done yet), we may not be able to do a require. + eval { require Carp } + if defined $^S; # If error/warning during compilation, + # require may be broken. + + # Use the core warn() unless Carp loaded OK. + CORE::warn( @_, + "\nCannot print stack trace, load with -MCarp option to see stack" ), + return + unless defined &Carp::longmess; + + # Save the current values of $single and $trace, and then turn them off. + my ( $mysingle, $mytrace ) = ( $single, $trace ); + $single = 0; + $trace = 0; + + # We can call Carp::longmess without its being "debugged" (which we + # don't want - we just want to use it!). Capture this for later. + my $mess = Carp::longmess(@_); + + # Restore $single and $trace to their original values. + ( $single, $trace ) = ( $mysingle, $mytrace ); + + # Use the debugger's own special way of printing warnings to print + # the stack trace message. + _db_warn($mess); +} ## end sub dbwarn + + +sub dbdie { + local $frame = 0; + local $doret = -2; + local $SIG{__DIE__} = ''; + local $SIG{__WARN__} = ''; + if ( $dieLevel > 2 ) { + local $SIG{__WARN__} = \&dbwarn; + _db_warn(@_); # Yell no matter what + return; + } + if ( $dieLevel < 2 ) { + die @_ if $^S; # in eval propagate + } + + # The code used to check $^S to see if compilation of the current thing + # hadn't finished. We don't do it anymore, figuring eval is pretty stable. + eval { require Carp }; + + die( @_, + "\nCannot print stack trace, load with -MCarp option to see stack" ) + unless defined &Carp::longmess; + + # We do not want to debug this chunk (automatic disabling works + # inside DB::DB, but not in Carp). Save $single and $trace, turn them off, + # get the stack trace from Carp::longmess (if possible), restore $signal + # and $trace, and then die with the stack trace. + my ( $mysingle, $mytrace ) = ( $single, $trace ); + $single = 0; + $trace = 0; + my $mess = "@_"; + { + + package Carp; # Do not include us in the list + eval { $mess = Carp::longmess(@_); }; + } + ( $single, $trace ) = ( $mysingle, $mytrace ); + die $mess; +} ## end sub dbdie + + +sub warnLevel { + if (@_) { + my $prevwarn = $SIG{__WARN__} unless $warnLevel; + $warnLevel = shift; + if ($warnLevel) { + $SIG{__WARN__} = \&DB::dbwarn; + } + elsif ($prevwarn) { + $SIG{__WARN__} = $prevwarn; + } else { + undef $SIG{__WARN__}; + } + } ## end if (@_) + $warnLevel; +} ## end sub warnLevel + + +sub dieLevel { + local $\ = ''; + if (@_) { + my $prevdie = $SIG{__DIE__} unless $dieLevel; + $dieLevel = shift; + if ($dieLevel) { + + # Always set it to dbdie() for non-zero values. + $SIG{__DIE__} = \&DB::dbdie; # if $dieLevel < 2; + + # No longer exists, so don't try to use it. + #$SIG{__DIE__} = \&DB::diehard if $dieLevel >= 2; + + # If we've finished initialization, mention that stack dumps + # are enabled, If dieLevel is 1, we won't stack dump if we die + # in an eval(). + print $OUT "Stack dump during die enabled", + ( $dieLevel == 1 ? " outside of evals" : "" ), ".\n" + if $I_m_init; + + # XXX This is probably obsolete, given that diehard() is gone. + print $OUT "Dump printed too.\n" if $dieLevel > 2; + } ## end if ($dieLevel) + + # Put the old one back if there was one. + elsif ($prevdie) { + $SIG{__DIE__} = $prevdie; + print $OUT "Default die handler restored.\n"; + } else { + undef $SIG{__DIE__}; + print $OUT "Die handler removed.\n"; + } + } ## end if (@_) + $dieLevel; +} ## end sub dieLevel + + +sub signalLevel { + if (@_) { + my $prevsegv = $SIG{SEGV} unless $signalLevel; + my $prevbus = $SIG{BUS} unless $signalLevel; + $signalLevel = shift; + if ($signalLevel) { + $SIG{SEGV} = \&DB::diesignal; + $SIG{BUS} = \&DB::diesignal; + } + else { + $SIG{SEGV} = $prevsegv; + $SIG{BUS} = $prevbus; + } + } ## end if (@_) + $signalLevel; +} ## end sub signalLevel + + +sub CvGV_name { + my $in = shift; + my $name = CvGV_name_or_bust($in); + defined $name ? $name : $in; +} + + +use vars qw($skipCvGV); + +sub CvGV_name_or_bust { + my $in = shift; + return if $skipCvGV; # Backdoor to avoid problems if XS broken... + return unless ref $in; + $in = \&$in; # Hard reference... + eval { require Devel::Peek; 1 } or return; + my $gv = Devel::Peek::CvGV($in) or return; + *$gv{PACKAGE} . '::' . *$gv{NAME}; +} ## end sub CvGV_name_or_bust + + +sub _find_sub_helper { + my $subr = shift; + + return unless defined &$subr; + my $name = CvGV_name_or_bust($subr); + my $data; + $data = $sub{$name} if defined $name; + return $data if defined $data; + + # Old stupid way... + $subr = \&$subr; # Hard reference + my $s; + for ( keys %sub ) { + $s = $_, last if $subr eq \&$_; + } + if ($s) + { + return $sub{$s}; + } + else + { + return; + } + +} + +sub find_sub { + my $subr = shift; + return ( $sub{$subr} || _find_sub_helper($subr) ); +} ## end sub find_sub + + +use vars qw(%seen); + +sub methods { + + # Figure out the class - either this is the class or it's a reference + # to something blessed into that class. + my $class = shift; + $class = ref $class if ref $class; + + local %seen; + + # Show the methods that this class has. + methods_via( $class, '', 1 ); + + # Show the methods that UNIVERSAL has. + methods_via( 'UNIVERSAL', 'UNIVERSAL', 0 ); +} ## end sub methods + + +sub methods_via { + + # If we've processed this class already, just quit. + my $class = shift; + return if $seen{$class}++; + + # This is a package that is contributing the methods we're about to print. + my $prefix = shift; + my $prepend = $prefix ? "via $prefix: " : ''; + my @to_print; + + # Extract from all the symbols in this class. + my $class_ref = do { no strict "refs"; \%{$class . '::'} }; + while (my ($name, $glob) = each %$class_ref) { + # references directly in the symbol table are Proxy Constant + # Subroutines, and are by their very nature defined + # Otherwise, check if the thing is a typeglob, and if it is, it decays + # to a subroutine reference, which can be tested by defined. + # $glob might also be the value -1 (from sub foo;) + # or (say) '$$' (from sub foo ($$);) + # \$glob will be SCALAR in both cases. + if ((ref $glob || ($glob && ref \$glob eq 'GLOB' && defined &$glob)) + && !$seen{$name}++) { + push @to_print, "$prepend$name\n"; + } + } + + { + local $\ = ''; + local $, = ''; + print $DB::OUT $_ foreach sort @to_print; + } + + # If the $crawl_upward argument is false, just quit here. + return unless shift; + + # $crawl_upward true: keep going up the tree. + # Find all the classes this one is a subclass of. + my $class_ISA_ref = do { no strict "refs"; \@{"${class}::ISA"} }; + for my $name ( @$class_ISA_ref ) { + + # Set up the new prefix. + $prepend = $prefix ? $prefix . " -> $name" : $name; + + # Crawl up the tree and keep trying to crawl up. + methods_via( $name, $prepend, 1 ); + } +} ## end sub methods_via + + +sub setman { + $doccmd = $^O !~ /^(?:MSWin32|VMS|os2|dos|amigaos|riscos|NetWare)\z/s + ? "man" # O Happy Day! + : "perldoc"; # Alas, poor unfortunates +} ## end sub setman + + +sub runman { + my $page = shift; + unless ($page) { + _db_system("$doccmd $doccmd"); + return; + } + + # this way user can override, like with $doccmd="man -Mwhatever" + # or even just "man " to disable the path check. + if ( $doccmd ne 'man' ) { + _db_system("$doccmd $page"); + return; + } + + $page = 'perl' if lc($page) eq 'help'; + + require Config; + my $man1dir = $Config::Config{man1direxp}; + my $man3dir = $Config::Config{man3direxp}; + for ( $man1dir, $man3dir ) { s#/[^/]*\z## if /\S/ } + my $manpath = ''; + $manpath .= "$man1dir:" if $man1dir =~ /\S/; + $manpath .= "$man3dir:" if $man3dir =~ /\S/ && $man1dir ne $man3dir; + chop $manpath if $manpath; + + # harmless if missing, I figure + local $ENV{MANPATH} = $manpath if $manpath; + my $nopathopt = $^O =~ /dunno what goes here/; + if ( + CORE::system( + $doccmd, + + # I just *know* there are men without -M + ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ), + split ' ', $page + ) + ) + { + unless ( $page =~ /^perl\w/ ) { + # Previously the debugger contained a list which it slurped in, + # listing the known "perl" manpages. However, it was out of date, + # with errors both of omission and inclusion. This approach is + # considerably less complex. The failure mode on a butchered + # install is simply that the user has to run man or perldoc + # "manually" with the full manpage name. + + # There is a list of $^O values in installperl to determine whether + # the directory is 'pods' or 'pod'. However, we can avoid tight + # coupling to that by simply checking the "non-standard" 'pods' + # first. + my $pods = "$Config::Config{privlibexp}/pods"; + $pods = "$Config::Config{privlibexp}/pod" + unless -d $pods; + if (-f "$pods/perl$page.pod") { + CORE::system( $doccmd, + ( ( $manpath && !$nopathopt ) ? ( "-M", $manpath ) : () ), + "perl$page" ); + } + } + } ## end if (CORE::system($doccmd... +} ## end sub runman + +#use Carp; # This did break, left for debugging + + +# The following BEGIN is very handy if debugger goes havoc, debugging debugger? + +use vars qw($db_stop); + +BEGIN { # This does not compile, alas. (XXX eh?) + $IN = \*STDIN; # For bugs before DB::OUT has been opened + $OUT = \*STDERR; # For errors before DB::OUT has been opened + + # Define characters used by command parsing. + $sh = '!'; # Shell escape (does not work) + $rc = ','; # Recall command (does not work) + @hist = ('?'); # Show history (does not work) + @truehist = (); # Can be saved for replay (per session) + + # This defines the point at which you get the 'deep recursion' + # warning. It MUST be defined or the debugger will not load. + $deep = 1000; + + # Number of lines around the current one that are shown in the + # 'w' command. + $window = 10; + + # How much before-the-current-line context the 'v' command should + # use in calculating the start of the window it will display. + $preview = 3; + + # We're not in any sub yet, but we need this to be a defined value. + $sub = ''; + + # Set up the debugger's interrupt handler. It simply sets a flag + # ($signal) that DB::DB() will check before each command is executed. + $SIG{INT} = \&DB::catch; + + # The following lines supposedly, if uncommented, allow the debugger to + # debug itself. Perhaps we can try that someday. + # This may be enabled to debug debugger: + #$warnLevel = 1 unless defined $warnLevel; + #$dieLevel = 1 unless defined $dieLevel; + #$signalLevel = 1 unless defined $signalLevel; + + # This is the flag that says "a debugger is running, please call + # DB::DB and DB::sub". We will turn it on forcibly before we try to + # execute anything in the user's context, because we always want to + # get control back. + $db_stop = 0; # Compiler warning ... + $db_stop = 1 << 30; # ... because this is only used in an eval() later. + + # This variable records how many levels we're nested in debugging. Used + # Used in the debugger prompt, and in determining whether it's all over or + # not. + $level = 0; # Level of recursive debugging + + # "Triggers bug (?) in perl if we postpone this until runtime." + # XXX No details on this yet, or whether we should fix the bug instead + # of work around it. Stay tuned. + @stack = (0); + + # Used to track the current stack depth using the auto-stacked-variable + # trick. + $stack_depth = 0; # Localized repeatedly; simple way to track $#stack + + # Don't print return values on exiting a subroutine. + $doret = -2; + + # No extry/exit tracing. + $frame = 0; + +} ## end BEGIN + +BEGIN { $^W = $ini_warn; } # Switch warnings back + + +sub db_complete { + + # Specific code for b c l V m f O, &blah, $blah, @blah, %blah + # $text is the text to be completed. + # $line is the incoming line typed by the user. + # $start is the start of the text to be completed in the incoming line. + my ( $text, $line, $start ) = @_; + + # Save the initial text. + # The search pattern is current package, ::, extract the next qualifier + # Prefix and pack are set to undef. + my ( $itext, $search, $prefix, $pack ) = + ( $text, "^\Q${package}::\E([^:]+)\$" ); + + + return sort grep /^\Q$text/, ( keys %sub ), + qw(postpone load compile), # subroutines + ( map { /$search/ ? ($1) : () } keys %sub ) + if ( substr $line, 0, $start ) =~ /^\|*[blc]\s+((postpone|compile)\s+)?$/; + + + return sort grep /^\Q$text/, values %INC # files + if ( substr $line, 0, $start ) =~ /^\|*b\s+load\s+$/; + + + return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) } + grep /^\Q$text/, map { /^(.*)::$/ ? ($1) : () } keys %:: # top-packages + if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ and $text =~ /^\w*$/; + + + return sort map { ( $_, db_complete( $_ . "::", "V ", 2 ) ) } + grep !/^main::/, grep /^\Q$text/, + map { /^(.*)::$/ ? ( $prefix . "::$1" ) : () } + do { no strict 'refs'; keys %{ $prefix . '::' } } + if ( substr $line, 0, $start ) =~ /^\|*[Vm]\s+$/ + and $text =~ /^(.*[^:])::?(\w*)$/ + and $prefix = $1; + + + if ( $line =~ /^\|*f\s+(.*)/ ) { # Loaded files + # We might possibly want to switch to an eval (which has a "filename" + # like '(eval 9)'), so we may need to clean up the completion text + # before proceeding. + $prefix = length($1) - length($text); + $text = $1; + + + return sort + map { substr $_, 2 + $prefix } grep /^_<\Q$text/, ( keys %main:: ), + $0; + } ## end if ($line =~ /^\|*f\s+(.*)/) + + + if ( ( substr $text, 0, 1 ) eq '&' ) { # subroutines + $text = substr $text, 1; + $prefix = "&"; + return sort map "$prefix$_", grep /^\Q$text/, ( keys %sub ), + ( + map { /$search/ ? ($1) : () } + keys %sub + ); + } ## end if ((substr $text, 0, ... + + + if ( $text =~ /^[\$@%](.*)::(.*)/ ) { # symbols in a package + + + $pack = ( $1 eq 'main' ? '' : $1 ) . '::'; + + + $prefix = ( substr $text, 0, 1 ) . $1 . '::'; + $text = $2; + + + my @out = do { + no strict 'refs'; + map "$prefix$_", grep /^\Q$text/, grep /^_?[a-zA-Z]/, + keys %$pack; + }; + + + if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) { + return db_complete( $out[0], $line, $start ); + } + + # Return the list of possibles. + return sort @out; + + } ## end if ($text =~ /^[\$@%](.*)::(.*)/) + + + if ( $text =~ /^[\$@%]/ ) { # symbols (in $package + packages in main) + + $pack = ( $package eq 'main' ? '' : $package ) . '::'; + + + $prefix = substr $text, 0, 1; + $text = substr $text, 1; + + my @out; + + + if (not $text =~ /::/ and eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require PadWalker } ) { + my $level = 1; + while (1) { + my @info = caller($level); + $level++; + $level = -1, last + if not @info; + last if $info[3] eq 'DB::DB'; + } + if ($level > 0) { + my $lexicals = PadWalker::peek_my($level); + push @out, grep /^\Q$prefix$text/, keys %$lexicals; + } + } + + + push @out, map "$prefix$_", grep /^\Q$text/, + ( grep /^_?[a-zA-Z]/, do { no strict 'refs'; keys %$pack } ), + ( $pack eq '::' ? () : ( grep /::$/, keys %:: ) ); + + + if ( @out == 1 and $out[0] =~ /::$/ and $out[0] ne $itext ) { + return db_complete( $out[0], $line, $start ); + } + + # Return the list of possibles. + return sort @out; + } ## end if ($text =~ /^[\$@%]/) + + + if ( ( substr $line, 0, $start ) =~ /^\|*[oO]\b.*\s$/ ) + { # Options after space + # We look for the text to be matched in the list of possible options, + # and fetch the current value. + my @out = grep /^\Q$text/, @options; + my $val = option_val( $out[0], undef ); + + # Set up a 'query option's value' command. + my $out = '? '; + if ( not defined $val or $val =~ /[\n\r]/ ) { + + # There's really nothing else we can do. + } + + # We have a value. Create a proper option-setting command. + elsif ( $val =~ /\s/ ) { + + # XXX This may be an extraneous variable. + my $found; + + # We'll want to quote the string (because of the embedded + # whtespace), but we want to make sure we don't end up with + # mismatched quote characters. We try several possibilities. + foreach my $l ( split //, qq/\"\'\#\|/ ) { + + # If we didn't find this quote character in the value, + # quote it using this quote character. + $out = "$l$val$l ", last if ( index $val, $l ) == -1; + } + } ## end elsif ($val =~ /\s/) + + # Don't need any quotes. + else { + $out = "=$val "; + } + + # If there were multiple possible values, return '? ', which + # makes the command into a query command. If there was just one, + # have readline append that. + $rl_attribs->{completer_terminator_character} = + ( @out == 1 ? $out : '? ' ); + + # Return list of possibilities. + return sort @out; + } ## end if ((substr $line, 0, ... + + + return $term->filename_list($text); # filenames + +} ## end sub db_complete + + +sub end_report { + local $\ = ''; + print $OUT "Use 'q' to quit or 'R' to restart. 'h q' for details.\n"; +} + + +sub clean_ENV { + if ( defined($ini_pids) ) { + $ENV{PERLDB_PIDS} = $ini_pids; + } + else { + delete( $ENV{PERLDB_PIDS} ); + } +} ## end sub clean_ENV + +# PERLDBf_... flag names from perl.h +our ( %DollarCaretP_flags, %DollarCaretP_flags_r ); + +BEGIN { + %DollarCaretP_flags = ( + PERLDBf_SUB => 0x01, # Debug sub enter/exit + PERLDBf_LINE => 0x02, # Keep line # + PERLDBf_NOOPT => 0x04, # Switch off optimizations + PERLDBf_INTER => 0x08, # Preserve more data + PERLDBf_SUBLINE => 0x10, # Keep subr source lines + PERLDBf_SINGLE => 0x20, # Start with single-step on + PERLDBf_NONAME => 0x40, # For _SUB: no name of the subr + PERLDBf_GOTO => 0x80, # Report goto: call DB::goto + PERLDBf_NAMEEVAL => 0x100, # Informative names for evals + PERLDBf_NAMEANON => 0x200, # Informative names for anon subs + PERLDBf_SAVESRC => 0x400, # Save source lines into @{"_<$filename"} + PERLDB_ALL => 0x33f, # No _NONAME, _GOTO + ); + # PERLDBf_LINE also enables the actions of PERLDBf_SAVESRC, so the debugger + # doesn't need to set it. It's provided for the benefit of profilers and + # other code analysers. + + %DollarCaretP_flags_r = reverse %DollarCaretP_flags; +} + +sub parse_DollarCaretP_flags { + my $flags = shift; + $flags =~ s/^\s+//; + $flags =~ s/\s+$//; + my $acu = 0; + foreach my $f ( split /\s*\|\s*/, $flags ) { + my $value; + if ( $f =~ /^0x([[:xdigit:]]+)$/ ) { + $value = hex $1; + } + elsif ( $f =~ /^(\d+)$/ ) { + $value = int $1; + } + elsif ( $f =~ /^DEFAULT$/i ) { + $value = $DollarCaretP_flags{PERLDB_ALL}; + } + else { + $f =~ /^(?:PERLDBf_)?(.*)$/i; + $value = $DollarCaretP_flags{ 'PERLDBf_' . uc($1) }; + unless ( defined $value ) { + print $OUT ( + "Unrecognized \$^P flag '$f'!\n", + "Acceptable flags are: " + . join( ', ', sort keys %DollarCaretP_flags ), + ", and hexadecimal and decimal numbers.\n" + ); + return undef; + } + } + $acu |= $value; + } + $acu; +} + +sub expand_DollarCaretP_flags { + my $DollarCaretP = shift; + my @bits = ( + map { + my $n = ( 1 << $_ ); + ( $DollarCaretP & $n ) + ? ( $DollarCaretP_flags_r{$n} + || sprintf( '0x%x', $n ) ) + : () + } 0 .. 31 + ); + return @bits ? join( '|', @bits ) : 0; +} + + +sub rerun { + my $i = shift; + my @args; + pop(@truehist); # strim + unless (defined $truehist[$i]) { + print "Unable to return to non-existent command: $i\n"; + } else { + $#truehist = ($i < 0 ? $#truehist + $i : $i > 0 ? $i : $#truehist); + my @temp = @truehist; # store + push(@DB::typeahead, @truehist); # saved + @truehist = @hist = (); # flush + @args = restart(); # setup + get_list("PERLDB_HIST"); # clean + set_list("PERLDB_HIST", @temp); # reset + } + return @args; +} + + +sub restart { + # I may not be able to resurrect you, but here goes ... + print $OUT +"Warning: some settings and command-line options may be lost!\n"; + my ( @script, @flags, $cl ); + + # If warn was on before, turn it on again. + push @flags, '-w' if $ini_warn; + + # Rebuild the -I flags that were on the initial + # command line. + for (@ini_INC) { + push @flags, '-I', $_; + } + + # Turn on taint if it was on before. + push @flags, '-T' if ${^TAINT}; + + # Arrange for setting the old INC: + # Save the current @init_INC in the environment. + set_list( "PERLDB_INC", @ini_INC ); + + # If this was a perl one-liner, go to the "file" + # corresponding to the one-liner read all the lines + # out of it (except for the first one, which is going + # to be added back on again when 'perl -d' runs: that's + # the 'require perl5db.pl;' line), and add them back on + # to the command line to be executed. + if ( $0 eq '-e' ) { + my $lines = *{$main::{'_<-e'}}{ARRAY}; + for ( 1 .. $#$lines ) { # The first line is PERL5DB + chomp( $cl = $lines->[$_] ); + push @script, '-e', $cl; + } + } ## end if ($0 eq '-e') + + # Otherwise we just reuse the original name we had + # before. + else { + @script = $0; + } + + + # If the terminal supported history, grab it and + # save that in the environment. + set_list( "PERLDB_HIST", + $term->Features->{getHistory} + ? $term->GetHistory + : @hist ); + + # Find all the files that were visited during this + # session (i.e., the debugger had magic hashes + # corresponding to them) and stick them in the environment. + my @had_breakpoints = keys %had_breakpoints; + set_list( "PERLDB_VISITED", @had_breakpoints ); + + # Save the debugger options we chose. + set_list( "PERLDB_OPT", %option ); + # set_list( "PERLDB_OPT", options2remember() ); + + # Save the break-on-loads. + set_list( "PERLDB_ON_LOAD", %break_on_load ); + + + # Go through all the breakpoints and make sure they're + # still valid. + my @hard; + for ( 0 .. $#had_breakpoints ) { + + # We were in this file. + my $file = $had_breakpoints[$_]; + + # Grab that file's magic line hash. + *dbline = $main::{ '_<' . $file }; + + # Skip out if it doesn't exist, or if the breakpoint + # is in a postponed file (we'll do postponed ones + # later). + next unless %dbline or $postponed_file{$file}; + + # In an eval. This is a little harder, so we'll + # do more processing on that below. + ( push @hard, $file ), next + if $file =~ /^\(\w*eval/; + + # XXX I have no idea what this is doing. Yet. + my @add; + @add = %{ $postponed_file{$file} } + if $postponed_file{$file}; + + # Save the list of all the breakpoints for this file. + set_list( "PERLDB_FILE_$_", %dbline, @add ); + + # Serialize the extra data %breakpoints_data hash. + # That's a bug fix. + set_list( "PERLDB_FILE_ENABLED_$_", + map { _is_breakpoint_enabled($file, $_) ? 1 : 0 } + sort { $a <=> $b } keys(%dbline) + ) + } ## end for (0 .. $#had_breakpoints) + + # The breakpoint was inside an eval. This is a little + # more difficult. XXX and I don't understand it. + foreach my $hard_file (@hard) { + # Get over to the eval in question. + *dbline = $main::{ '_<' . $hard_file }; + my $quoted = quotemeta $hard_file; + my %subs; + for my $sub ( keys %sub ) { + if (my ($n1, $n2) = $sub{$sub} =~ /\A$quoted:(\d+)-(\d+)\z/) { + $subs{$sub} = [ $n1, $n2 ]; + } + } + unless (%subs) { + print {$OUT} + "No subroutines in $hard_file, ignoring breakpoints.\n"; + next; + } + LINES: foreach my $line ( keys %dbline ) { + + # One breakpoint per sub only: + my ( $offset, $found ); + SUBS: foreach my $sub ( keys %subs ) { + if ( + $subs{$sub}->[1] >= $line # Not after the subroutine + and ( + not defined $offset # Not caught + or $offset < 0 + ) + ) + { # or badly caught + $found = $sub; + $offset = $line - $subs{$sub}->[0]; + if ($offset >= 0) { + $offset = "+$offset"; + last SUBS; + } + } ## end if ($subs{$sub}->[1] >=... + } ## end for $sub (keys %subs) + if ( defined $offset ) { + $postponed{$found} = + "break $offset if $dbline{$line}"; + } + else { + print {$OUT} + ("Breakpoint in ${hard_file}:$line ignored:" + . " after all the subroutines.\n"); + } + } ## end for $line (keys %dbline) + } ## end for (@hard) + + # Save the other things that don't need to be + # processed. + set_list( "PERLDB_POSTPONE", %postponed ); + set_list( "PERLDB_PRETYPE", @$pretype ); + set_list( "PERLDB_PRE", @$pre ); + set_list( "PERLDB_POST", @$post ); + set_list( "PERLDB_TYPEAHEAD", @typeahead ); + + # We are officially restarting. + $ENV{PERLDB_RESTART} = 1; + + # We are junking all child debuggers. + delete $ENV{PERLDB_PIDS}; # Restore ini state + + # Set this back to the initial pid. + $ENV{PERLDB_PIDS} = $ini_pids if defined $ini_pids; + + + # And run Perl again. Add the "-d" flag, all the + # flags we built up, the script (whether a one-liner + # or a file), add on the -emacs flag for a slave editor, + # and then the old arguments. + + return ($^X, '-d', @flags, @script, ($slave_editor ? '-emacs' : ()), @ARGS); + +}; # end restart + + +END { + $finished = 1 if $inhibit_exit; # So that some commands may be disabled. + $fall_off_end = 1 unless $inhibit_exit; + + # Do not stop in at_exit() and destructors on exit: + if ($fall_off_end or $runnonstop) { + save_hist(); + } else { + $DB::single = 1; + DB::fake::at_exit(); + } +} ## end END + + +sub cmd_pre580_null { + + # do nothing... +} + + +sub cmd_pre580_a { + my $xcmd = shift; + my $cmd = shift; + + # Argument supplied. Add the action. + if ( $cmd =~ /^(\d*)\s*(.*)/ ) { + + # If the line isn't there, use the current line. + my $i = $1 || $line; + my $j = $2; + + # If there is an action ... + if ( length $j ) { + + # ... but the line isn't breakable, skip it. + if ( $dbline[$i] == 0 ) { + print $OUT "Line $i may not have an action.\n"; + } + else { + + # ... and the line is breakable: + # Mark that there's an action in this file. + $had_breakpoints{$filename} |= 2; + + # Delete any current action. + $dbline{$i} =~ s/\0[^\0]*//; + + # Add the new action, continuing the line as needed. + $dbline{$i} .= "\0" . action($j); + } + } ## end if (length $j) + + # No action supplied. + else { + + # Delete the action. + $dbline{$i} =~ s/\0[^\0]*//; + + # Mark as having no break or action if nothing's left. + delete $dbline{$i} if $dbline{$i} eq ''; + } + } ## end if ($cmd =~ /^(\d*)\s*(.*)/) +} ## end sub cmd_pre580_a + + +sub cmd_pre580_b { + my $xcmd = shift; + my $cmd = shift; + my $dbline = shift; + + # Break on load. + if ( $cmd =~ /^load\b\s*(.*)/ ) { + my $file = $1; + $file =~ s/\s+$//; + cmd_b_load($file); + } + + # b compile|postpone [] + # The interpreter actually traps this one for us; we just put the + # necessary condition in the %postponed hash. + elsif ( $cmd =~ /^(postpone|compile)\b\s*([':A-Za-z_][':\w]*)\s*(.*)/ ) { + + # Capture the condition if there is one. Make it true if none. + my $cond = length $3 ? $3 : '1'; + + # Save the sub name and set $break to 1 if $1 was 'postpone', 0 + # if it was 'compile'. + my ( $subname, $break ) = ( $2, $1 eq 'postpone' ); + + # De-Perl4-ify the name - ' separators to ::. + $subname =~ s/\'/::/g; + + # Qualify it into the current package unless it's already qualified. + $subname = "${package}::" . $subname + unless $subname =~ /::/; + + # Add main if it starts with ::. + $subname = "main" . $subname if substr( $subname, 0, 2 ) eq "::"; + + # Save the break type for this sub. + $postponed{$subname} = $break ? "break +0 if $cond" : "compile"; + } ## end elsif ($cmd =~ ... + + # b [] + elsif ( $cmd =~ /^([':A-Za-z_][':\w]*(?:\[.*\])?)\s*(.*)/ ) { + my $subname = $1; + my $cond = length $2 ? $2 : '1'; + cmd_b_sub( $subname, $cond ); + } + # b []. + elsif ( $cmd =~ /^(\d*)\s*(.*)/ ) { + my $i = $1 || $dbline; + my $cond = length $2 ? $2 : '1'; + cmd_b_line( $i, $cond ); + } +} ## end sub cmd_pre580_b + + +sub cmd_pre580_D { + my $xcmd = shift; + my $cmd = shift; + if ( $cmd =~ /^\s*$/ ) { + print $OUT "Deleting all breakpoints...\n"; + + # %had_breakpoints lists every file that had at least one + # breakpoint in it. + my $file; + for $file ( keys %had_breakpoints ) { + + # Switch to the desired file temporarily. + local *dbline = $main::{ '_<' . $file }; + + $max = $#dbline; + my $was; + + # For all lines in this file ... + for my $i (1 .. $max) { + + # If there's a breakpoint or action on this line ... + if ( defined $dbline{$i} ) { + + # ... remove the breakpoint. + $dbline{$i} =~ s/^[^\0]+//; + if ( $dbline{$i} =~ s/^\0?$// ) { + + # Remove the entry altogether if no action is there. + delete $dbline{$i}; + } + } ## end if (defined $dbline{$i... + } ## end for my $i (1 .. $max) + + # If, after we turn off the "there were breakpoints in this file" + # bit, the entry in %had_breakpoints for this file is zero, + # we should remove this file from the hash. + if ( not $had_breakpoints{$file} &= ~1 ) { + delete $had_breakpoints{$file}; + } + } ## end for $file (keys %had_breakpoints) + + # Kill off all the other breakpoints that are waiting for files that + # haven't been loaded yet. + undef %postponed; + undef %postponed_file; + undef %break_on_load; + } ## end if ($cmd =~ /^\s*$/) +} ## end sub cmd_pre580_D + + +sub cmd_pre580_h { + my $xcmd = shift; + my $cmd = shift; + + # Print the *right* help, long format. + if ( $cmd =~ /^\s*$/ ) { + print_help($pre580_help); + } + + # 'h h' - explicitly-requested summary. + elsif ( $cmd =~ /^h\s*/ ) { + print_help($pre580_summary); + } + + # Find and print a command's help. + elsif ( $cmd =~ /^h\s+(\S.*)$/ ) { + my $asked = $1; # for proper errmsg + my $qasked = quotemeta($asked); # for searching + # XXX: finds CR but not + if ( + $pre580_help =~ /^ + is not a debugger command.\n"); + } + } ## end elsif ($cmd =~ /^h\s+(\S.*)$/) +} ## end sub cmd_pre580_h + + +sub cmd_pre580_W { + my $xcmd = shift; + my $cmd = shift; + + # Delete all watch expressions. + if ( $cmd =~ /^$/ ) { + + # No watching is going on. + $trace &= ~2; + + # Kill all the watch expressions and values. + @to_watch = @old_watch = (); + } + + # Add a watch expression. + elsif ( $cmd =~ /^(.*)/s ) { + + # add it to the list to be watched. + push @to_watch, $1; + + # Get the current value of the expression. + # Doesn't handle expressions returning list values! + $evalarg = $1; + # The &-call is here to ascertain the mutability of @_. + my ($val) = &DB::eval; + $val = ( defined $val ) ? "'$val'" : 'undef'; + + # Save it. + push @old_watch, $val; + + # We're watching stuff. + $trace |= 2; + + } ## end elsif ($cmd =~ /^(.*)/s) +} ## end sub cmd_pre580_W + + +sub cmd_pre590_prepost { + my $cmd = shift; + my $line = shift || '*'; + my $dbline = shift; + + return cmd_prepost( $cmd, $line, $dbline ); +} ## end sub cmd_pre590_prepost + + +sub cmd_prepost { + my $cmd = shift; + + # No action supplied defaults to 'list'. + my $line = shift || '?'; + + # Figure out what to put in the prompt. + my $which = ''; + + # Make sure we have some array or another to address later. + # This means that if for some reason the tests fail, we won't be + # trying to stash actions or delete them from the wrong place. + my $aref = []; + + # < - Perl code to run before prompt. + if ( $cmd =~ /^\ - Perl code to run after prompt. + elsif ( $cmd =~ /^\>/o ) { + $which = 'post-perl'; + $aref = $post; + } + + # { - first check for properly-balanced braces. + elsif ( $cmd =~ /^\{/o ) { + if ( $cmd =~ /^\{.*\}$/o && unbalanced( substr( $cmd, 1 ) ) ) { + print $OUT +"$cmd is now a debugger command\nuse ';$cmd' if you mean Perl code\n"; + } + + # Properly balanced. Pre-prompt debugger actions. + else { + $which = 'pre-debugger'; + $aref = $pretype; + } + } ## end elsif ( $cmd =~ /^\{/o ) + + # Did we find something that makes sense? + unless ($which) { + print $OUT "Confused by command: $cmd\n"; + } + + # Yes. + else { + + # List actions. + if ( $line =~ /^\s*\?\s*$/o ) { + unless (@$aref) { + + # Nothing there. Complain. + print $OUT "No $which actions.\n"; + } + else { + + # List the actions in the selected list. + print $OUT "$which commands:\n"; + foreach my $action (@$aref) { + print $OUT "\t$cmd -- $action\n"; + } + } ## end else + } ## end if ( $line =~ /^\s*\?\s*$/o) + + # Might be a delete. + else { + if ( length($cmd) == 1 ) { + if ( $line =~ /^\s*\*\s*$/o ) { + + # It's a delete. Get rid of the old actions in the + # selected list.. + @$aref = (); + print $OUT "All $cmd actions cleared.\n"; + } + else { + + # Replace all the actions. (This is a <, >, or {). + @$aref = action($line); + } + } ## end if ( length($cmd) == 1) + elsif ( length($cmd) == 2 ) { + + # Add the action to the line. (This is a <<, >>, or {{). + push @$aref, action($line); + } + else { + + # <<<, >>>>, {{{{{{ ... something not a command. + print $OUT + "Confused by strange length of $which command($cmd)...\n"; + } + } ## end else [ if ( $line =~ /^\s*\?\s*$/o) + } ## end else +} ## end sub cmd_prepost + + +package DB::fake; + +sub at_exit { + "Debugged program terminated. Use 'q' to quit or 'R' to restart."; +} + +package DB; # Do not trace this 1; below! + +1; + + +package if; + +$VERSION = '0.0608'; + +sub work { + my $method = shift() ? 'import' : 'unimport'; + unless (@_ >= 2) { + my $type = ($method eq 'import') ? 'use' : 'no'; + die "Too few arguments to '$type if' (some code returning an empty list in list context?)" + } + return unless shift; # CONDITION + + my $p = $_[0]; # PACKAGE + (my $file = "$p.pm") =~ s!::!/!g; + require $file; # Works even if $_[0] is a keyword (like open) + my $m = $p->can($method); + goto &$m if $m; +} + +sub import { shift; unshift @_, 1; goto &work } +sub unimport { shift; unshift @_, 0; goto &work } + +1; +__END__ + +package FileCache; + +our $VERSION = '1.10'; + + +require 5.006; +use Carp; +use strict; +no strict 'refs'; + +# These are not C for legacy reasons. +# Previous versions requested the user set $cacheout_maxopen by hand. +# Some authors fiddled with %saw to overcome the clobber on initial open. +our %saw; +our $cacheout_maxopen = 16; + +use parent 'Exporter'; +our @EXPORT = qw[cacheout cacheout_close]; + + +my %isopen; +my $cacheout_seq = 0; + +sub import { + my ($pkg,%args) = @_; + + # Use Exporter. %args are for us, not Exporter. + # Make sure to up export_to_level, or we will import into ourselves, + # rather than our calling package; + + __PACKAGE__->export_to_level(1); + Exporter::import( $pkg ); + + # Truth is okay here because setting maxopen to 0 would be bad + return $cacheout_maxopen = $args{maxopen} if $args{maxopen}; + + # XXX This code is crazy. Why is it a one element foreach loop? + # Why is it using $param both as a filename and filehandle? + foreach my $param ( '/usr/include/sys/param.h' ){ + if (open($param, '<', $param)) { + local ($_, $.); + while (<$param>) { + if( /^\s*#\s*define\s+NOFILE\s+(\d+)/ ){ + $cacheout_maxopen = $1 - 4; + close($param); + last; + } + } + close $param; + } + } + $cacheout_maxopen ||= 16; +} + +# Open in their package. +sub cacheout_open { + return open(*{caller(1) . '::' . $_[1]}, $_[0], $_[1]) && $_[1]; +} + +# Close in their package. +sub cacheout_close { + # Short-circuit in case the filehandle disappeared + my $pkg = caller($_[1]||0); + defined fileno(*{$pkg . '::' . $_[0]}) && + CORE::close(*{$pkg . '::' . $_[0]}); + delete $isopen{$_[0]}; +} + +# But only this sub name is visible to them. +sub cacheout { + my($mode, $file, $class, $ret, $ref, $narg); + croak "Not enough arguments for cacheout" unless $narg = scalar @_; + croak "Too many arguments for cacheout" if $narg > 2; + + ($mode, $file) = @_; + ($file, $mode) = ($mode, $file) if $narg == 1; + croak "Invalid mode for cacheout" if $mode && + ( $mode !~ /^\s*(?:>>|\+?>|\+?<|\|\-|)|\-\|\s*$/ ); + + # Mode changed? + if( $isopen{$file} && ($mode||'>') ne $isopen{$file}->[1] ){ + &cacheout_close($file, 1); + } + + if( $isopen{$file}) { + $ret = $file; + $isopen{$file}->[0]++; + } + else{ + if( scalar keys(%isopen) > $cacheout_maxopen -1 ) { + my @lru = sort{ $isopen{$a}->[0] <=> $isopen{$b}->[0] } keys(%isopen); + $cacheout_seq = 0; + $isopen{$_}->[0] = $cacheout_seq++ for + splice(@lru, int($cacheout_maxopen / 3)||$cacheout_maxopen); + &cacheout_close($_, 1) for @lru; + } + + unless( $ref ){ + $mode ||= $saw{$file} ? '>>' : ($saw{$file}=1, '>'); + } + #XXX should we just return the value from cacheout_open, no croak? + $ret = cacheout_open($mode, $file) or croak("Can't create $file: $!"); + + $isopen{$file} = [++$cacheout_seq, $mode]; + } + return $ret; +} +1; +package Digest; + +use strict; +use vars qw($VERSION %MMAP $AUTOLOAD); + +$VERSION = "1.17_01"; + +%MMAP = ( + "SHA-1" => [["Digest::SHA", 1], "Digest::SHA1", ["Digest::SHA2", 1]], + "SHA-224" => [["Digest::SHA", 224]], + "SHA-256" => [["Digest::SHA", 256], ["Digest::SHA2", 256]], + "SHA-384" => [["Digest::SHA", 384], ["Digest::SHA2", 384]], + "SHA-512" => [["Digest::SHA", 512], ["Digest::SHA2", 512]], + "HMAC-MD5" => "Digest::HMAC_MD5", + "HMAC-SHA-1" => "Digest::HMAC_SHA1", + "CRC-16" => [["Digest::CRC", type => "crc16"]], + "CRC-32" => [["Digest::CRC", type => "crc32"]], + "CRC-CCITT" => [["Digest::CRC", type => "crcccitt"]], + "RIPEMD-160" => "Crypt::RIPEMD160", +); + +sub new +{ + shift; # class ignored + my $algorithm = shift; + my $impl = $MMAP{$algorithm} || do { + $algorithm =~ s/\W+//g; + "Digest::$algorithm"; + }; + $impl = [$impl] unless ref($impl); + local $@; # don't clobber it for our caller + my $err; + for (@$impl) { + my $class = $_; + my @args; + ($class, @args) = @$class if ref($class); + no strict 'refs'; + unless (exists ${"$class\::"}{"VERSION"}) { + my $pm_file = $class . ".pm"; + $pm_file =~ s{::}{/}g; + eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require $pm_file + }; + if ($@) { + $err ||= $@; + next; + } + } + return $class->new(@args, @_); + } + die $err; +} + +sub AUTOLOAD +{ + my $class = shift; + my $algorithm = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2); + $class->new($algorithm, @_); +} + +1; + +__END__ + +package utf8; + +$utf8::hint_bits = 0x00800000; + +our $VERSION = '1.21'; + +sub import { + $^H |= $utf8::hint_bits; +} + +sub unimport { + $^H &= ~$utf8::hint_bits; +} + +sub AUTOLOAD { + require "utf8_heavy.pl"; + goto &$AUTOLOAD if defined &$AUTOLOAD; + require Carp; + Carp::croak("Undefined subroutine $AUTOLOAD called"); +} + +1; +__END__ + +package overloading; +use warnings; + +our $VERSION = '0.02'; + +my $HINT_NO_AMAGIC = 0x01000000; # see perl.h + +require 5.010001; + +sub _ops_to_nums { + require overload::numbers; + + map { exists $overload::numbers::names{"($_"} + ? $overload::numbers::names{"($_"} + : do { require Carp; Carp::croak("'$_' is not a valid overload") } + } @_; +} + +sub import { + my ( $class, @ops ) = @_; + + if ( @ops ) { + if ( $^H{overloading} ) { + vec($^H{overloading} , $_, 1) = 0 for _ops_to_nums(@ops); + } + + if ( $^H{overloading} !~ /[^\0]/ ) { + delete $^H{overloading}; + $^H &= ~$HINT_NO_AMAGIC; + } + } else { + delete $^H{overloading}; + $^H &= ~$HINT_NO_AMAGIC; + } +} + +sub unimport { + my ( $class, @ops ) = @_; + + if ( exists $^H{overloading} or not $^H & $HINT_NO_AMAGIC ) { + if ( @ops ) { + vec($^H{overloading} ||= '', $_, 1) = 1 for _ops_to_nums(@ops); + } else { + delete $^H{overloading}; + } + } + + $^H |= $HINT_NO_AMAGIC; +} + +1; +__END__ + +package SelectSaver; + +our $VERSION = '1.02'; + + +require 5.000; +use Carp; +use Symbol; + +sub new { + @_ >= 1 && @_ <= 2 or croak 'usage: SelectSaver->new( [FILEHANDLE] )'; + my $fh = select; + my $self = bless \$fh, $_[0]; + select qualify($_[1], caller) if @_ > 1; + $self; +} + +sub DESTROY { + my $self = $_[0]; + select $$self; +} + +1; +package bytes; + +our $VERSION = '1.06'; + +$bytes::hint_bits = 0x00000008; + +sub import { + $^H |= $bytes::hint_bits; +} + +sub unimport { + $^H &= ~$bytes::hint_bits; +} + +sub AUTOLOAD { + require "bytes_heavy.pl"; + goto &$AUTOLOAD if defined &$AUTOLOAD; + require Carp; + Carp::croak("Undefined subroutine $AUTOLOAD called"); +} + +sub length (_); +sub chr (_); +sub ord (_); +sub substr ($$;$$); +sub index ($$;$); +sub rindex ($$;$); + +1; +__END__ + +package experimental; +$experimental::VERSION = '0.019'; +use strict; +use warnings; +use version (); + +BEGIN { eval { require feature } }; +use Carp qw/croak carp/; + +my %warnings = map { $_ => 1 } grep { /^experimental::/ } keys %warnings::Offsets; +my %features = map { $_ => 1 } $] > 5.015006 ? keys %feature::feature : do { + my @features; + if ($] >= 5.010) { + push @features, qw/switch say state/; + push @features, 'unicode_strings' if $] > 5.011002; + } + @features; +}; + +my %min_version = ( + array_base => '5', + autoderef => '5.14.0', + bitwise => '5.22.0', + const_attr => '5.22.0', + current_sub => '5.16.0', + evalbytes => '5.16.0', + fc => '5.16.0', + lexical_topic => '5.10.0', + lexical_subs => '5.18.0', + postderef => '5.20.0', + postderef_qq => '5.20.0', + refaliasing => '5.22.0', + regex_sets => '5.18.0', + say => '5.10.0', + smartmatch => '5.10.0', + signatures => '5.20.0', + state => '5.10.0', + switch => '5.10.0', + unicode_eval => '5.16.0', + unicode_strings => '5.12.0', +); +my %max_version = ( + autoderef => '5.23.1', + lexical_topic => '5.23.4', +); + +$_ = version->new($_) for values %min_version; +$_ = version->new($_) for values %max_version; + +my %additional = ( + postderef => ['postderef_qq'], + switch => ['smartmatch'], +); + +sub _enable { + my $pragma = shift; + if ($warnings{"experimental::$pragma"}) { + warnings->unimport("experimental::$pragma"); + feature->import($pragma) if exists $features{$pragma}; + _enable(@{ $additional{$pragma} }) if $additional{$pragma}; + } + elsif ($features{$pragma}) { + feature->import($pragma); + _enable(@{ $additional{$pragma} }) if $additional{$pragma}; + } + elsif (not exists $min_version{$pragma}) { + croak "Can't enable unknown feature $pragma"; + } + elsif ($] < $min_version{$pragma}) { + my $stable = $min_version{$pragma}; + if ($stable->{version}[1] % 2) { + $stable = version->new( + "5.".($stable->{version}[1]+1).'.0' + ); + } + croak "Need perl $stable or later for feature $pragma"; + } + elsif ($] >= ($max_version{$pragma} || 7)) { + croak "Experimental feature $pragma has been removed from perl in version $max_version{$pragma}"; + } +} + +sub import { + my ($self, @pragmas) = @_; + + for my $pragma (@pragmas) { + _enable($pragma); + } + return; +} + +sub _disable { + my $pragma = shift; + if ($warnings{"experimental::$pragma"}) { + warnings->import("experimental::$pragma"); + feature->unimport($pragma) if exists $features{$pragma}; + _disable(@{ $additional{$pragma} }) if $additional{$pragma}; + } + elsif ($features{$pragma}) { + feature->unimport($pragma); + _disable(@{ $additional{$pragma} }) if $additional{$pragma}; + } + elsif (not exists $min_version{$pragma}) { + carp "Can't disable unknown feature $pragma, ignoring"; + } +} + +sub unimport { + my ($self, @pragmas) = @_; + + for my $pragma (@pragmas) { + _disable($pragma); + } + return; +} + +1; + +#ABSTRACT: Experimental features made easy + +__END__ + +package Test2; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +1; + +__END__ + +package utf8; +use strict; +use warnings; +use re "/aa"; # So we won't even try to look at above Latin1, potentially + # resulting in a recursive call + +sub DEBUG () { 0 } +$|=1 if DEBUG; + +sub DESTROY {} + +my %Cache; + +sub croak { require Carp; Carp::croak(@_) } + +sub _loose_name ($) { + # Given a lowercase property or property-value name, return its + # standardized version that is expected for look-up in the 'loose' hashes + # in Heavy.pl (hence, this depends on what mktables does). This squeezes + # out blanks, underscores and dashes. The complication stems from the + # grandfathered-in 'L_', which retains a single trailing underscore. + + (my $loose = $_[0]) =~ s/[-_ \t]//g; + + return $loose if $loose !~ / ^ (?: is | to )? l $/x; + return 'l_' if $_[0] =~ / l .* _ /x; # If original had a trailing '_' + return $loose; +} + +## +## "SWASH" == "SWATCH HASH". A "swatch" is a swatch of the Unicode landscape. +## It's a data structure that encodes a set of Unicode characters. +## + +{ + # If a floating point number is within this distance from the value of a + # fraction, it is considered to be that fraction, even if many more digits + # are specified that don't exactly match. + my $min_floating_slop; + + # To guard against this program calling something that in turn ends up + # calling this program with the same inputs, and hence infinitely + # recursing, we keep a stack of the properties that are currently in + # progress, pushed upon entry, popped upon return. + my @recursed; + + sub SWASHNEW { + my ($class, $type, $list, $minbits, $none) = @_; + my $user_defined = 0; + local $^D = 0 if $^D; + + $class = "" unless defined $class; + print STDERR __LINE__, ": class=$class, type=$type, list=", + (defined $list) ? $list : ':undef:', + ", minbits=$minbits, none=$none\n" if DEBUG; + + ## + ## Get the list of codepoints for the type. + ## Called from swash_init (see utf8.c) or SWASHNEW itself. + ## + ## Callers of swash_init: + ## op.c:pmtrans -- for tr/// and y/// + ## regexec.c:regclass_swash -- for /[]/, \p, and \P + ## utf8.c:is_utf8_common -- for common Unicode properties + ## utf8.c:S__to_utf8_case -- for lc, uc, ucfirst, etc. and //i + ## Unicode::UCD::prop_invlist + ## Unicode::UCD::prop_invmap + ## + ## Given a $type, our goal is to fill $list with the set of codepoint + ## ranges. If $type is false, $list passed is used. + ## + ## $minbits: + ## For binary properties, $minbits must be 1. + ## For character mappings (case and transliteration), $minbits must + ## be a number except 1. + ## + ## $list (or that filled according to $type): + ## Refer to perlunicode.pod, "User-Defined Character Properties." + ## + ## For binary properties, only characters with the property value + ## of True should be listed. The 3rd column, if any, will be ignored + ## + ## $none is undocumented, so I'm (khw) trying to do some documentation + ## of it now. It appears to be if there is a mapping in an input file + ## that maps to 'XXXX', then that is replaced by $none+1, expressed in + ## hexadecimal. It is used somehow in tr///. + ## + ## To make the parsing of $type clear, this code takes the a rather + ## unorthodox approach of last'ing out of the block once we have the + ## info we need. Were this to be a subroutine, the 'last' would just + ## be a 'return'. + ## + # If a problem is found $type is returned; + # Upon success, a new (or cached) blessed object is returned with + # keys TYPE, BITS, EXTRAS, LIST, and NONE with values having the + # same meanings as the input parameters. + # SPECIALS contains a reference to any special-treatment hash in the + # property. + # INVERT_IT is non-zero if the result should be inverted before use + # USER_DEFINED is non-zero if the result came from a user-defined + my $file; ## file to load data from, and also part of the %Cache key. + + # Change this to get a different set of Unicode tables + my $unicore_dir = 'unicore'; + my $invert_it = 0; + my $list_is_from_mktables = 0; # Is $list returned from a mktables + # generated file? If so, we know it's + # well behaved. + + if ($type) + { + # Verify that this isn't a recursive call for this property. + # Can't use croak, as it may try to recurse to here itself. + my $class_type = $class . "::$type"; + if (grep { $_ eq $class_type } @recursed) { + CORE::die "panic: Infinite recursion in SWASHNEW for '$type'\n"; + } + push @recursed, $class_type; + + $type =~ s/^\s+//; + $type =~ s/\s+$//; + + # regcomp.c surrounds the property name with '__" and '_i' if this + # is to be caseless matching. + my $caseless = $type =~ s/^(.*)__(.*)_i$/$1$2/; + + print STDERR __LINE__, ": type=$type, caseless=$caseless\n" if DEBUG; + + GETFILE: + { + ## + ## It could be a user-defined property. Look in current + ## package if no package given + ## + + + my $caller0 = caller(0); + my $caller1 = $type =~ s/(.+)::// + ? $1 + : $caller0 eq 'main' + ? 'main' + : caller(1); + + if (defined $caller1 && $type =~ /^I[ns]\w+$/) { + my $prop = "${caller1}::$type"; + if (exists &{$prop}) { + # stolen from Scalar::Util::PP::tainted() + my $tainted; + { + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + local $^W = 0; + no warnings; + eval { kill 0 * $prop }; + $tainted = 1 if $@ =~ /^Insecure/; + } + die "Insecure user-defined property \\p{$prop}\n" + if $tainted; + no strict 'refs'; + $list = &{$prop}($caseless); + $user_defined = 1; + last GETFILE; + } + } + + # During Perl's compilation, this routine may be called before + # the tables are constructed. If so, we have a chicken/egg + # problem. If we die, the tables never get constructed, so + # keep going, but return an empty table so only what the code + # has compiled in internally (currently ASCII/Latin1 range + # matching) will work. + BEGIN { + # Poor man's constant, to avoid a run-time check. + $utf8::{miniperl} + = \! defined &DynaLoader::boot_DynaLoader; + } + if (miniperl) { + eval "require '$unicore_dir/Heavy.pl'"; + if ($@) { + print STDERR __LINE__, ": '$@'\n" if DEBUG; + pop @recursed if @recursed; + return $type; + } + } + else { + require "$unicore_dir/Heavy.pl"; + } + BEGIN { delete $utf8::{miniperl} } + + # All property names are matched caselessly + my $property_and_table = CORE::lc $type; + print STDERR __LINE__, ": $property_and_table\n" if DEBUG; + + # See if is of the compound form 'property=value', where the + # value indicates the table we should use. + my ($property, $table, @remainder) = + split /\s*[:=]\s*/, $property_and_table, -1; + if (@remainder) { + pop @recursed if @recursed; + return $type; + } + + my $prefix; + if (! defined $table) { + + # Here, is the single form. The property becomes empty, and + # the whole value is the table. + $table = $property; + $prefix = $property = ""; + } else { + print STDERR __LINE__, ": $property\n" if DEBUG; + + # Here it is the compound property=table form. The property + # name is always loosely matched, and always can have an + # optional 'is' prefix (which isn't true in the single + # form). + $property = _loose_name($property) =~ s/^is//r; + + # And convert to canonical form. Quit if not valid. + $property = $utf8::loose_property_name_of{$property}; + if (! defined $property) { + pop @recursed if @recursed; + return $type; + } + + $prefix = "$property="; + + # If the rhs looks like it is a number... + print STDERR __LINE__, ": table=$table\n" if DEBUG; + if ($table =~ m{ ^ [ \s 0-9 _ + / . -]+ $ }x) { + print STDERR __LINE__, ": table=$table\n" if DEBUG; + + # Don't allow leading nor trailing slashes + if ($table =~ / ^ \/ | \/ $ /x) { + pop @recursed if @recursed; + return $type; + } + + # Split on slash, in case it is a rational, like \p{1/5} + my @parts = split m{ \s* / \s* }x, $table, -1; + print __LINE__, ": $type\n" if @parts > 2 && DEBUG; + + # Can have maximum of one slash + if (@parts > 2) { + pop @recursed if @recursed; + return $type; + } + + foreach my $part (@parts) { + print __LINE__, ": part=$part\n" if DEBUG; + + $part =~ s/^\+\s*//; # Remove leading plus + $part =~ s/^-\s*/-/; # Remove blanks after unary + # minus + + # Remove underscores between digits. + $part =~ s/(?<= [0-9] ) _ (?= [0-9] ) //xg; + + # No leading zeros (but don't make a single '0' + # into a null string) + $part =~ s/ ^ ( -? ) 0+ /$1/x; + $part .= '0' if $part eq '-' || $part eq ""; + + # No trailing zeros after a decimal point + $part =~ s/ ( \. .*? ) 0+ $ /$1/x; + + # Begin with a 0 if a leading decimal point + $part =~ s/ ^ ( -? ) \. /${1}0./x; + + # Ensure not a trailing decimal point: turn into an + # integer + $part =~ s/ \. $ //x; + + print STDERR __LINE__, ": part=$part\n" if DEBUG; + #return $type if $part eq ""; + + # Result better look like a number. (This test is + # needed because, for example could have a plus in + # the middle.) + if ($part !~ / ^ -? [0-9]+ ( \. [0-9]+)? $ /x) { + pop @recursed if @recursed; + return $type; + } + } + + # If a rational... + if (@parts == 2) { + + # If denominator is negative, get rid of it, and ... + if ($parts[1] =~ s/^-//) { + + # If numerator is also negative, convert the + # whole thing to positive, else move the minus + # to the numerator + if ($parts[0] !~ s/^-//) { + $parts[0] = '-' . $parts[0]; + } + } + $table = join '/', @parts; + } + elsif ($property ne 'nv' || $parts[0] !~ /\./) { + + # Here is not numeric value, or doesn't have a + # decimal point. No further manipulation is + # necessary. (Note the hard-coded property name. + # This could fail if other properties eventually + # had fractions as well; perhaps the cjk ones + # could evolve to do that. This hard-coding could + # be fixed by mktables generating a list of + # properties that could have fractions.) + $table = $parts[0]; + } else { + + # Here is a floating point numeric_value. Try to + # convert to rational. First see if is in the list + # of known ones. + if (exists $utf8::nv_floating_to_rational{$parts[0]}) { + $table = $utf8::nv_floating_to_rational{$parts[0]}; + } else { + + # Here not in the list. See if is close + # enough to something in the list. First + # determine what 'close enough' means. It has + # to be as tight as what mktables says is the + # maximum slop, and as tight as how many + # digits we were passed. That is, if the user + # said .667, .6667, .66667, etc. we match as + # many digits as they passed until get to + # where it doesn't matter any more due to the + # machine's precision. If they said .6666668, + # we fail. + (my $fraction = $parts[0]) =~ s/^.*\.//; + my $epsilon = 10 ** - (length($fraction)); + if ($epsilon > $utf8::max_floating_slop) { + $epsilon = $utf8::max_floating_slop; + } + + # But it can't be tighter than the minimum + # precision for this machine. If haven't + # already calculated that minimum, do so now. + if (! defined $min_floating_slop) { + + # Keep going down an order of magnitude + # until find that adding this quantity to + # 1 remains 1; but put an upper limit on + # this so in case this algorithm doesn't + # work properly on some platform, that we + # won't loop forever. + my $count = 0; + $min_floating_slop = 1; + while (1+ $min_floating_slop != 1 + && $count++ < 50) + { + my $next = $min_floating_slop / 10; + last if $next == 0; # If underflows, + # use previous one + $min_floating_slop = $next; + print STDERR __LINE__, ": min_float_slop=$min_floating_slop\n" if DEBUG; + } + + # Back off a couple orders of magnitude, + # just to be safe. + $min_floating_slop *= 100; + } + + if ($epsilon < $min_floating_slop) { + $epsilon = $min_floating_slop; + } + print STDERR __LINE__, ": fraction=.$fraction; epsilon=$epsilon\n" if DEBUG; + + undef $table; + + # And for each possible rational in the table, + # see if it is within epsilon of the input. + foreach my $official + (keys %utf8::nv_floating_to_rational) + { + print STDERR __LINE__, ": epsilon=$epsilon, official=$official, diff=", abs($parts[0] - $official), "\n" if DEBUG; + if (abs($parts[0] - $official) < $epsilon) { + $table = + $utf8::nv_floating_to_rational{$official}; + last; + } + } + + # Quit if didn't find one. + if (! defined $table) { + pop @recursed if @recursed; + return $type; + } + } + } + print STDERR __LINE__, ": $property=$table\n" if DEBUG; + } + } + + # Combine lhs (if any) and rhs to get something that matches + # the syntax of the lookups. + $property_and_table = "$prefix$table"; + print STDERR __LINE__, ": $property_and_table\n" if DEBUG; + + # First try stricter matching. + $file = $utf8::stricter_to_file_of{$property_and_table}; + + # If didn't find it, try again with looser matching by editing + # out the applicable characters on the rhs and looking up + # again. + my $strict_property_and_table; + if (! defined $file) { + + # This isn't used unless the name begins with 'to' + $strict_property_and_table = $property_and_table =~ s/^to//r; + $table = _loose_name($table); + $property_and_table = "$prefix$table"; + print STDERR __LINE__, ": $property_and_table\n" if DEBUG; + $file = $utf8::loose_to_file_of{$property_and_table}; + } + + # Add the constant and go fetch it in. + if (defined $file) { + + # If the file name contains a !, it means to invert. The + # 0+ makes sure result is numeric + $invert_it = 0 + $file =~ s/!//; + + if ($utf8::why_deprecated{$file}) { + warnings::warnif('deprecated', "Use of '$type' in \\p{} or \\P{} is deprecated because: $utf8::why_deprecated{$file};"); + } + + if ($caseless + && exists $utf8::caseless_equivalent{$property_and_table}) + { + $file = $utf8::caseless_equivalent{$property_and_table}; + } + + # The pseudo-directory '#' means that there really isn't a + # file to read, the data is in-line as part of the string; + # we extract it below. + $file = "$unicore_dir/lib/$file.pl" unless $file =~ m!^#/!; + last GETFILE; + } + print STDERR __LINE__, ": didn't find $property_and_table\n" if DEBUG; + + ## + ## Last attempt -- see if it's a standard "To" name + ## (e.g. "ToLower") ToTitle is used by ucfirst(). + ## The user-level way to access ToDigit() and ToFold() + ## is to use Unicode::UCD. + ## + # Only check if caller wants non-binary + if ($minbits != 1) { + if ($property_and_table =~ s/^to//) { + # Look input up in list of properties for which we have + # mapping files. First do it with the strict approach + if (defined ($file = $utf8::strict_property_to_file_of{ + $strict_property_and_table})) + { + $type = $utf8::file_to_swash_name{$file}; + print STDERR __LINE__, ": type set to $type\n" + if DEBUG; + $file = "$unicore_dir/$file.pl"; + last GETFILE; + } + elsif (defined ($file = + $utf8::loose_property_to_file_of{$property_and_table})) + { + $type = $utf8::file_to_swash_name{$file}; + print STDERR __LINE__, ": type set to $type\n" + if DEBUG; + $file = "$unicore_dir/$file.pl"; + last GETFILE; + } # If that fails see if there is a corresponding binary + # property file + elsif (defined ($file = + $utf8::loose_to_file_of{$property_and_table})) + { + + # Here, there is no map file for the property we + # are trying to get the map of, but this is a + # binary property, and there is a file for it that + # can easily be translated to a mapping, so use + # that, treating this as a binary property. + # Setting 'minbits' here causes it to be stored as + # such in the cache, so if someone comes along + # later looking for just a binary, they get it. + $minbits = 1; + + # The 0+ makes sure is numeric + $invert_it = 0 + $file =~ s/!//; + $file = "$unicore_dir/lib/$file.pl" + unless $file =~ m!^#/!; + last GETFILE; + } + } + } + + ## + ## If we reach this line, it's because we couldn't figure + ## out what to do with $type. Ouch. + ## + + pop @recursed if @recursed; + return $type; + } # end of GETFILE block + + if (defined $file) { + print STDERR __LINE__, ": found it (file='$file')\n" if DEBUG; + + ## + ## If we reach here, it was due to a 'last GETFILE' above + ## (exception: user-defined properties and mappings), so we + ## have a filename, so now we load it if we haven't already. + + # The pseudo-directory '#' means the result isn't really a + # file, but is in-line, with semi-colons to be turned into + # new-lines. Since it is in-line there is no advantage to + # caching the result + if ($file =~ s!^#/!!) { + $list = $utf8::inline_definitions[$file]; + } + else { + # Here, we have an actual file to read in and load, but it + # may already have been read-in and cached. The cache key + # is the class and file to load, and whether the results + # need to be inverted. + my $found = $Cache{$class, $file, $invert_it}; + if ($found and ref($found) eq $class) { + print STDERR __LINE__, ": Returning cached swash for '$class,$file,$invert_it' for \\p{$type}\n" if DEBUG; + pop @recursed if @recursed; + return $found; + } + + local $@; + local $!; + $list = do $file; die $@ if $@; + } + + $list_is_from_mktables = 1; + } + } # End of $type is non-null + + # Here, either $type was null, or we found the requested property and + # read it into $list + + my $extras = ""; + + my $bits = $minbits; + + # mktables lists don't have extras, like '&utf8::prop', so don't need + # to separate them; also lists are already sorted, so don't need to do + # that. + if ($list && ! $list_is_from_mktables) { + my $taint = substr($list,0,0); # maintain taint + + # Separate the extras from the code point list, and make sure + # user-defined properties and tr/// are well-behaved for + # downstream code. + if ($user_defined || $none) { + my @tmp = split(/^/m, $list); + my %seen; + no warnings; + + # The extras are anything that doesn't begin with a hex digit. + $extras = join '', $taint, grep /^[^0-9a-fA-F]/, @tmp; + + # Remove the extras, and sort the remaining entries by the + # numeric value of their beginning hex digits, removing any + # duplicates. + $list = join '', $taint, + map { $_->[1] } + sort { $a->[0] <=> $b->[0] } + map { /^([0-9a-fA-F]+)/ && !$seen{$1}++ ? [ CORE::hex($1), $_ ] : () } + @tmp; # XXX doesn't do ranges right + } + else { + # mktables has gone to some trouble to make non-user defined + # properties well-behaved, so we can skip the effort we do for + # user-defined ones. Any extras are at the very beginning of + # the string. + + # This regex splits out the first lines of $list into $1 and + # strips them off from $list, until we get one that begins + # with a hex number, alone on the line, or followed by a tab. + # Either portion may be empty. + $list =~ s/ \A ( .*? ) + (?: \z | (?= ^ [0-9a-fA-F]+ (?: \t | $) ) ) + //msx; + + $extras = "$taint$1"; + } + } + + if ($none) { + my $hextra = sprintf "%04x", $none + 1; + $list =~ s/\tXXXX$/\t$hextra/mg; + } + + if ($minbits != 1 && $minbits < 32) { # not binary property + my $top = 0; + while ($list =~ /^([0-9a-fA-F]+)(?:[\t]([0-9a-fA-F]+)?)(?:[ \t]([0-9a-fA-F]+))?/mg) { + my $min = CORE::hex $1; + my $max = defined $2 ? CORE::hex $2 : $min; + my $val = defined $3 ? CORE::hex $3 : 0; + $val += $max - $min if defined $3; + $top = $val if $val > $top; + } + my $topbits = + $top > 0xffff ? 32 : + $top > 0xff ? 16 : 8; + $bits = $topbits if $bits < $topbits; + } + + my @extras; + if ($extras) { + for my $x ($extras) { + my $taint = substr($x,0,0); # maintain taint + pos $x = 0; + while ($x =~ /^([^0-9a-fA-F\n])(.*)/mg) { + my $char = "$1$taint"; + my $name = "$2$taint"; + print STDERR __LINE__, ": char [$char] => name [$name]\n" + if DEBUG; + if ($char =~ /[-+!&]/) { + my ($c,$t) = split(/::/, $name, 2); # bogus use of ::, really + my $subobj; + if ($c eq 'utf8') { + $subobj = utf8->SWASHNEW($t, "", $minbits, 0); + } + elsif (exists &$name) { + $subobj = utf8->SWASHNEW($name, "", $minbits, 0); + } + elsif ($c =~ /^([0-9a-fA-F]+)/) { + $subobj = utf8->SWASHNEW("", $c, $minbits, 0); + } + print STDERR __LINE__, ": returned from getting sub object for $name\n" if DEBUG; + if (! ref $subobj) { + pop @recursed if @recursed && $type; + return $subobj; + } + push @extras, $name => $subobj; + $bits = $subobj->{BITS} if $bits < $subobj->{BITS}; + $user_defined = $subobj->{USER_DEFINED} + if $subobj->{USER_DEFINED}; + } + } + } + } + + if (DEBUG) { + print STDERR __LINE__, ": CLASS = $class, TYPE => $type, BITS => $bits, NONE => $none, INVERT_IT => $invert_it, USER_DEFINED => $user_defined"; + print STDERR "\nLIST =>\n$list" if defined $list; + print STDERR "\nEXTRAS =>\n$extras" if defined $extras; + print STDERR "\n"; + } + + my $SWASH = bless { + TYPE => $type, + BITS => $bits, + EXTRAS => $extras, + LIST => $list, + NONE => $none, + USER_DEFINED => $user_defined, + @extras, + } => $class; + + if ($file) { + $Cache{$class, $file, $invert_it} = $SWASH; + if ($type + && exists $utf8::SwashInfo{$type} + && exists $utf8::SwashInfo{$type}{'specials_name'}) + { + my $specials_name = $utf8::SwashInfo{$type}{'specials_name'}; + no strict "refs"; + print STDERR "\nspecials_name => $specials_name\n" if DEBUG; + $SWASH->{'SPECIALS'} = \%$specials_name; + } + $SWASH->{'INVERT_IT'} = $invert_it; + } + + pop @recursed if @recursed && $type; + + return $SWASH; + } +} + +# Now SWASHGET is recasted into a C function S_swatch_get (see utf8.c). + +1; +use 5.006_001; # for (defined ref) and $#$v and our +package Dumpvalue; +use strict; +our $VERSION = '1.18'; +our(%address, $stab, @stab, %stab, %subs); + +sub ASCII { return ord('A') == 65; } + +# This module will give incorrect results for some inputs on EBCDIC platforms +# before v5.8 +*to_native = ($] lt "5.008") + ? sub { return shift } + : sub { return utf8::unicode_to_native(shift) }; + +my $APC = chr to_native(0x9F); +my $backslash_c_question = (ASCII) ? '\177' : $APC; + +# documentation nits, handle complex data structures better by chromatic +# translate control chars to ^X - Randal Schwartz +# Modifications to print types by Peter Gordon v1.0 + +# Ilya Zakharevich -- patches after 5.001 (and some before ;-) + +# Won't dump symbol tables and contents of debugged files by default + +# (IZ) changes for objectification: +# c) quote() renamed to method set_quote(); +# d) unctrlSet() renamed to method set_unctrl(); +# f) Compiles with 'use strict', but in two places no strict refs is needed: +# maybe more problems are waiting... + +my %defaults = ( + globPrint => 0, + printUndef => 1, + tick => "auto", + unctrl => 'quote', + subdump => 1, + dumpReused => 0, + bareStringify => 1, + hashDepth => '', + arrayDepth => '', + dumpDBFiles => '', + dumpPackages => '', + quoteHighBit => '', + usageOnly => '', + compactDump => '', + veryCompact => '', + stopDbSignal => '', + ); + +sub new { + my $class = shift; + my %opt = (%defaults, @_); + bless \%opt, $class; +} + +sub set { + my $self = shift; + my %opt = @_; + @$self{keys %opt} = values %opt; +} + +sub get { + my $self = shift; + wantarray ? @$self{@_} : $$self{pop @_}; +} + +sub dumpValue { + my $self = shift; + die "usage: \$dumper->dumpValue(value)" unless @_ == 1; + local %address; + local $^W=0; + (print "undef\n"), return unless defined $_[0]; + (print $self->stringify($_[0]), "\n"), return unless ref $_[0]; + $self->unwrap($_[0],0); +} + +sub dumpValues { + my $self = shift; + local %address; + local $^W=0; + (print "undef\n"), return unless defined $_[0]; + $self->unwrap(\@_,0); +} + +# This one is good for variable names: + +sub unctrl { + local($_) = @_; + + return \$_ if ref \$_ eq "GLOB"; + s/([\000-\037])/'^' . chr(to_native(ord($1)^64))/eg; + s/ $backslash_c_question /^?/xg; + $_; +} + +sub stringify { + my $self = shift; + local $_ = shift; + my $noticks = shift; + my $tick = $self->{tick}; + + return 'undef' unless defined $_ or not $self->{printUndef}; + return $_ . "" if ref \$_ eq 'GLOB'; + { no strict 'refs'; + $_ = &{'overload::StrVal'}($_) + if $self->{bareStringify} and ref $_ + and %overload:: and defined &{'overload::StrVal'}; + } + if ($tick eq 'auto') { + if (/[^[:^cntrl:]\n]/) { # All ASCII controls but \n get '"' + $tick = '"'; + } else { + $tick = "'"; + } + } + if ($tick eq "'") { + s/([\'\\])/\\$1/g; + } elsif ($self->{unctrl} eq 'unctrl') { + s/([\"\\])/\\$1/g ; + $_ = &unctrl($_); + s/([[:^ascii:]])/'\\0x'.sprintf('%2X',ord($1))/eg + if $self->{quoteHighBit}; + } elsif ($self->{unctrl} eq 'quote') { + s/([\"\\\$\@])/\\$1/g if $tick eq '"'; + s/\e/\\e/g; + s/([\000-\037$backslash_c_question])/'\\c'._escaped_ord($1)/eg; + } + s/([[:^ascii:]])/'\\'.sprintf('%3o',ord($1))/eg if $self->{quoteHighBit}; + ($noticks || /^\d+(\.\d*)?\Z/) + ? $_ + : $tick . $_ . $tick; +} + +# Ensure a resulting \ is escaped to be \\ +sub _escaped_ord { + my $chr = shift; + if ($chr eq $backslash_c_question) { + $chr = '?'; + } + else { + $chr = chr(to_native(ord($chr)^64)); + $chr =~ s{\\}{\\\\}g; + } + return $chr; +} + +sub DumpElem { + my ($self, $v) = (shift, shift); + my $short = $self->stringify($v, ref $v); + my $shortmore = ''; + if ($self->{veryCompact} && ref $v + && (ref $v eq 'ARRAY' and !grep(ref $_, @$v) )) { + my $depth = $#$v; + ($shortmore, $depth) = (' ...', $self->{arrayDepth} - 1) + if $self->{arrayDepth} and $depth >= $self->{arrayDepth}; + my @a = map $self->stringify($_), @$v[0..$depth]; + print "0..$#{$v} @a$shortmore\n"; + } elsif ($self->{veryCompact} && ref $v + && (ref $v eq 'HASH') and !grep(ref $_, values %$v)) { + my @a = sort keys %$v; + my $depth = $#a; + ($shortmore, $depth) = (' ...', $self->{hashDepth} - 1) + if $self->{hashDepth} and $depth >= $self->{hashDepth}; + my @b = map {$self->stringify($_) . " => " . $self->stringify($$v{$_})} + @a[0..$depth]; + local $" = ', '; + print "@b$shortmore\n"; + } else { + print "$short\n"; + $self->unwrap($v,shift); + } +} + +sub unwrap { + my $self = shift; + return if $DB::signal and $self->{stopDbSignal}; + my ($v) = shift ; + my ($s) = shift ; # extra no of spaces + my $sp; + my (%v,@v,$address,$short,$fileno); + + $sp = " " x $s ; + $s += 3 ; + + # Check for reused addresses + if (ref $v) { + my $val = $v; + { no strict 'refs'; + $val = &{'overload::StrVal'}($v) + if %overload:: and defined &{'overload::StrVal'}; + } + ($address) = $val =~ /(0x[0-9a-f]+)\)$/ ; + if (!$self->{dumpReused} && defined $address) { + $address{$address}++ ; + if ( $address{$address} > 1 ) { + print "${sp}-> REUSED_ADDRESS\n" ; + return ; + } + } + } elsif (ref \$v eq 'GLOB') { + $address = "$v" . ""; # To avoid a bug with globs + $address{$address}++ ; + if ( $address{$address} > 1 ) { + print "${sp}*DUMPED_GLOB*\n" ; + return ; + } + } + + if (ref $v eq 'Regexp') { + my $re = "$v"; + $re =~ s,/,\\/,g; + print "$sp-> qr/$re/\n"; + return; + } + + if ( UNIVERSAL::isa($v, 'HASH') ) { + my @sortKeys = sort keys(%$v) ; + my $more; + my $tHashDepth = $#sortKeys ; + $tHashDepth = $#sortKeys < $self->{hashDepth}-1 ? $#sortKeys : $self->{hashDepth}-1 + unless $self->{hashDepth} eq '' ; + $more = "....\n" if $tHashDepth < $#sortKeys ; + my $shortmore = ""; + $shortmore = ", ..." if $tHashDepth < $#sortKeys ; + $#sortKeys = $tHashDepth ; + if ($self->{compactDump} && !grep(ref $_, values %{$v})) { + $short = $sp; + my @keys; + for (@sortKeys) { + push @keys, $self->stringify($_) . " => " . $self->stringify($v->{$_}); + } + $short .= join ', ', @keys; + $short .= $shortmore; + (print "$short\n"), return if length $short <= $self->{compactDump}; + } + for my $key (@sortKeys) { + return if $DB::signal and $self->{stopDbSignal}; + my $value = $ {$v}{$key} ; + print $sp, $self->stringify($key), " => "; + $self->DumpElem($value, $s); + } + print "$sp empty hash\n" unless @sortKeys; + print "$sp$more" if defined $more ; + } elsif ( UNIVERSAL::isa($v, 'ARRAY') ) { + my $tArrayDepth = $#{$v} ; + my $more ; + $tArrayDepth = $#$v < $self->{arrayDepth}-1 ? $#$v : $self->{arrayDepth}-1 + unless $self->{arrayDepth} eq '' ; + $more = "....\n" if $tArrayDepth < $#{$v} ; + my $shortmore = ""; + $shortmore = " ..." if $tArrayDepth < $#{$v} ; + if ($self->{compactDump} && !grep(ref $_, @{$v})) { + if ($#$v >= 0) { + $short = $sp . "0..$#{$v} " . + join(" ", + map {exists $v->[$_] ? $self->stringify($v->[$_]) : "empty"} (0..$tArrayDepth) + ) . "$shortmore"; + } else { + $short = $sp . "empty array"; + } + (print "$short\n"), return if length $short <= $self->{compactDump}; + } + for my $num (0 .. $tArrayDepth) { + return if $DB::signal and $self->{stopDbSignal}; + print "$sp$num "; + if (exists $v->[$num]) { + $self->DumpElem($v->[$num], $s); + } else { + print "empty slot\n"; + } + } + print "$sp empty array\n" unless @$v; + print "$sp$more" if defined $more ; + } elsif ( UNIVERSAL::isa($v, 'SCALAR') or ref $v eq 'REF' ) { + print "$sp-> "; + $self->DumpElem($$v, $s); + } elsif ( UNIVERSAL::isa($v, 'CODE') ) { + print "$sp-> "; + $self->dumpsub(0, $v); + } elsif ( UNIVERSAL::isa($v, 'GLOB') ) { + print "$sp-> ",$self->stringify($$v,1),"\n"; + if ($self->{globPrint}) { + $s += 3; + $self->dumpglob('', $s, "{$$v}", $$v, 1); + } elsif (defined ($fileno = fileno($v))) { + print( (' ' x ($s+3)) . "FileHandle({$$v}) => fileno($fileno)\n" ); + } + } elsif (ref \$v eq 'GLOB') { + if ($self->{globPrint}) { + $self->dumpglob('', $s, "{$v}", $v, 1); + } elsif (defined ($fileno = fileno(\$v))) { + print( (' ' x $s) . "FileHandle({$v}) => fileno($fileno)\n" ); + } + } +} + +sub matchvar { + $_[0] eq $_[1] or + ($_[1] =~ /^([!~])(.)([\x00-\xff]*)/) and + ($1 eq '!') ^ (eval {($_[2] . "::" . $_[0]) =~ /$2$3/}); +} + +sub compactDump { + my $self = shift; + $self->{compactDump} = shift if @_; + $self->{compactDump} = 6*80-1 + if $self->{compactDump} and $self->{compactDump} < 2; + $self->{compactDump}; +} + +sub veryCompact { + my $self = shift; + $self->{veryCompact} = shift if @_; + $self->compactDump(1) if !$self->{compactDump} and $self->{veryCompact}; + $self->{veryCompact}; +} + +sub set_unctrl { + my $self = shift; + if (@_) { + my $in = shift; + if ($in eq 'unctrl' or $in eq 'quote') { + $self->{unctrl} = $in; + } else { + print "Unknown value for 'unctrl'.\n"; + } + } + $self->{unctrl}; +} + +sub set_quote { + my $self = shift; + if (@_ and $_[0] eq '"') { + $self->{tick} = '"'; + $self->{unctrl} = 'quote'; + } elsif (@_ and $_[0] eq 'auto') { + $self->{tick} = 'auto'; + $self->{unctrl} = 'quote'; + } elsif (@_) { # Need to set + $self->{tick} = "'"; + $self->{unctrl} = 'unctrl'; + } + $self->{tick}; +} + +sub dumpglob { + my $self = shift; + return if $DB::signal and $self->{stopDbSignal}; + my ($package, $off, $key, $val, $all) = @_; + local(*stab) = $val; + my $fileno; + if (($key !~ /^_{dumpDBFiles}) and defined $stab) { + print( (' ' x $off) . "\$", &unctrl($key), " = " ); + $self->DumpElem($stab, 3+$off); + } + if (($key !~ /^_{dumpDBFiles}) and @stab) { + print( (' ' x $off) . "\@$key = (\n" ); + $self->unwrap(\@stab,3+$off) ; + print( (' ' x $off) . ")\n" ); + } + if ($key ne "main::" && $key ne "DB::" && %stab + && ($self->{dumpPackages} or $key !~ /::$/) + && ($key !~ /^_{dumpDBFiles}) + && !($package eq "Dumpvalue" and $key eq "stab")) { + print( (' ' x $off) . "\%$key = (\n" ); + $self->unwrap(\%stab,3+$off) ; + print( (' ' x $off) . ")\n" ); + } + if (defined ($fileno = fileno(*stab))) { + print( (' ' x $off) . "FileHandle($key) => fileno($fileno)\n" ); + } + if ($all) { + if (defined &stab) { + $self->dumpsub($off, $key); + } + } +} + +sub CvGV_name { + my $self = shift; + my $in = shift; + return if $self->{skipCvGV}; # Backdoor to avoid problems if XS broken... + $in = \&$in; # Hard reference... + eval {require Devel::Peek; 1} or return; + my $gv = Devel::Peek::CvGV($in) or return; + *$gv{PACKAGE} . '::' . *$gv{NAME}; +} + +sub dumpsub { + my $self = shift; + my ($off,$sub) = @_; + my $ini = $sub; + my $s; + $sub = $1 if $sub =~ /^\{\*(.*)\}$/; + my $subref = defined $1 ? \&$sub : \&$ini; + my $place = $DB::sub{$sub} || (($s = $subs{"$subref"}) && $DB::sub{$s}) + || (($s = $self->CvGV_name($subref)) && $DB::sub{$s}) + || ($self->{subdump} && ($s = $self->findsubs("$subref")) + && $DB::sub{$s}); + $s = $sub unless defined $s; + $place = '???' unless defined $place; + print( (' ' x $off) . "&$s in $place\n" ); +} + +sub findsubs { + my $self = shift; + return undef unless %DB::sub; + my ($addr, $name, $loc); + while (($name, $loc) = each %DB::sub) { + $addr = \&$name; + $subs{"$addr"} = $name; + } + $self->{subdump} = 0; + $subs{ shift() }; +} + +sub dumpvars { + my $self = shift; + my ($package,@vars) = @_; + local(%address,$^W); + my ($key,$val); + $package .= "::" unless $package =~ /::$/; + *stab = *main::; + + while ($package =~ /(\w+?::)/g) { + *stab = $ {stab}{$1}; + } + $self->{TotalStrings} = 0; + $self->{Strings} = 0; + $self->{CompleteTotal} = 0; + while (($key,$val) = each(%stab)) { + return if $DB::signal and $self->{stopDbSignal}; + next if @vars && !grep( matchvar($key, $_), @vars ); + if ($self->{usageOnly}) { + $self->globUsage(\$val, $key) + if ($package ne 'Dumpvalue' or $key ne 'stab') + and ref(\$val) eq 'GLOB'; + } else { + $self->dumpglob($package, 0,$key, $val); + } + } + if ($self->{usageOnly}) { + print <{TotalStrings} bytes in $self->{Strings} strings. +EOP + $self->{CompleteTotal} += $self->{TotalStrings}; + print <{CompleteTotal} bytes (1 level deep) + overhead. +EOP + } +} + +sub scalarUsage { + my $self = shift; + my $size; + if (UNIVERSAL::isa($_[0], 'ARRAY')) { + $size = $self->arrayUsage($_[0]); + } elsif (UNIVERSAL::isa($_[0], 'HASH')) { + $size = $self->hashUsage($_[0]); + } elsif (!ref($_[0])) { + $size = length($_[0]); + } + $self->{TotalStrings} += $size; + $self->{Strings}++; + $size; +} + +sub arrayUsage { # array ref, name + my $self = shift; + my $size = 0; + map {$size += $self->scalarUsage($_)} @{$_[0]}; + my $len = @{$_[0]}; + print "\@$_[1] = $len item", ($len > 1 ? "s" : ""), " (data: $size bytes)\n" + if defined $_[1]; + $self->{CompleteTotal} += $size; + $size; +} + +sub hashUsage { # hash ref, name + my $self = shift; + my @keys = keys %{$_[0]}; + my @values = values %{$_[0]}; + my $keys = $self->arrayUsage(\@keys); + my $values = $self->arrayUsage(\@values); + my $len = @keys; + my $total = $keys + $values; + print "\%$_[1] = $len item", ($len > 1 ? "s" : ""), + " (keys: $keys; values: $values; total: $total bytes)\n" + if defined $_[1]; + $total; +} + +sub globUsage { # glob ref, name + my $self = shift; + local *stab = *{$_[0]}; + my $total = 0; + $total += $self->scalarUsage($stab) if defined $stab; + $total += $self->arrayUsage(\@stab, $_[1]) if @stab; + $total += $self->hashUsage(\%stab, $_[1]) + if %stab and $_[1] ne "main::" and $_[1] ne "DB::"; + #and !($package eq "Dumpvalue" and $key eq "stab")); + $total; +} + +1; + + +package sort; + +our $VERSION = '2.04'; + +# The hints for pp_sort are now stored in $^H{sort}; older versions +# of perl used the global variable $sort::hints. -- rjh 2005-12-19 + +$sort::stable_bit = 0x00000100; +$sort::unstable_bit = 0x00000200; + +use strict; + +sub import { + shift; + if (@_ == 0) { + require Carp; + Carp::croak("sort pragma requires arguments"); + } + local $_; + $^H{sort} //= 0; + while ($_ = shift(@_)) { + if ($_ eq 'stable') { + $^H{sort} |= $sort::stable_bit; + $^H{sort} &= ~$sort::unstable_bit; + } elsif ($_ eq 'defaults') { + $^H{sort} = 0; + } else { + require Carp; + Carp::croak("sort: unknown subpragma '$_'"); + } + } +} + +sub unimport { + shift; + if (@_ == 0) { + require Carp; + Carp::croak("sort pragma requires arguments"); + } + local $_; + no warnings 'uninitialized'; # bitops would warn + while ($_ = shift(@_)) { + if ($_ eq 'stable') { + $^H{sort} &= ~$sort::stable_bit; + $^H{sort} |= $sort::unstable_bit; + } else { + require Carp; + Carp::croak("sort: unknown subpragma '$_'"); + } + } +} + +sub current { + my @sort; + if ($^H{sort}) { + push @sort, 'stable' if $^H{sort} & $sort::stable_bit; + } + join(' ', @sort); +} + +1; +__END__ + + +package AnyDBM_File; +use warnings; +use strict; + +use 5.006_001; +our $VERSION = '1.01'; +our @ISA = qw(NDBM_File DB_File GDBM_File SDBM_File ODBM_File) unless @ISA; + +my $mod; +for $mod (@ISA) { + if (eval "require $mod") { + @ISA = ($mod); # if we leave @ISA alone, warnings abound + return 1; + } +} + +die "No DBM package was successfully found or installed"; + +__END__ + +# -*- buffer-read-only: t -*- +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by regen/feature.pl. +# Any changes made here will be lost! + +package feature; + +our $VERSION = '1.52'; + +our %feature = ( + fc => 'feature_fc', + say => 'feature_say', + state => 'feature_state', + switch => 'feature_switch', + bitwise => 'feature_bitwise', + evalbytes => 'feature_evalbytes', + array_base => 'feature_arybase', + signatures => 'feature_signatures', + current_sub => 'feature___SUB__', + refaliasing => 'feature_refaliasing', + postderef_qq => 'feature_postderef_qq', + unicode_eval => 'feature_unieval', + declared_refs => 'feature_myref', + unicode_strings => 'feature_unicode', +); + +our %feature_bundle = ( + "5.10" => [qw(array_base say state switch)], + "5.11" => [qw(array_base say state switch unicode_strings)], + "5.15" => [qw(current_sub evalbytes fc say state switch unicode_eval unicode_strings)], + "5.23" => [qw(current_sub evalbytes fc postderef_qq say state switch unicode_eval unicode_strings)], + "5.27" => [qw(bitwise current_sub evalbytes fc postderef_qq say state switch unicode_eval unicode_strings)], + "all" => [qw(array_base bitwise current_sub declared_refs evalbytes fc postderef_qq refaliasing say signatures state switch unicode_eval unicode_strings)], + "default" => [qw(array_base)], +); + +$feature_bundle{"5.12"} = $feature_bundle{"5.11"}; +$feature_bundle{"5.13"} = $feature_bundle{"5.11"}; +$feature_bundle{"5.14"} = $feature_bundle{"5.11"}; +$feature_bundle{"5.16"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.17"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.18"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.19"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.20"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.21"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.22"} = $feature_bundle{"5.15"}; +$feature_bundle{"5.24"} = $feature_bundle{"5.23"}; +$feature_bundle{"5.25"} = $feature_bundle{"5.23"}; +$feature_bundle{"5.26"} = $feature_bundle{"5.23"}; +$feature_bundle{"5.28"} = $feature_bundle{"5.27"}; +$feature_bundle{"5.9.5"} = $feature_bundle{"5.10"}; +my %noops = ( + postderef => 1, + lexical_subs => 1, +); + +our $hint_shift = 26; +our $hint_mask = 0x1c000000; +our @hint_bundles = qw( default 5.10 5.11 5.15 5.23 5.27 ); + +# This gets set (for now) in $^H as well as in %^H, +# for runtime speed of the uc/lc/ucfirst/lcfirst functions. +# See HINT_UNI_8_BIT in perl.h. +our $hint_uni8bit = 0x00000800; + +# TODO: +# - think about versioned features (use feature switch => 2) + + +sub import { + shift; + + if (!@_) { + croak("No features specified"); + } + + __common(1, @_); +} + +sub unimport { + shift; + + # A bare C should reset to the default bundle + if (!@_) { + $^H &= ~($hint_uni8bit|$hint_mask); + return; + } + + __common(0, @_); +} + + +sub __common { + my $import = shift; + my $bundle_number = $^H & $hint_mask; + my $features = $bundle_number != $hint_mask + && $feature_bundle{$hint_bundles[$bundle_number >> $hint_shift]}; + if ($features) { + # Features are enabled implicitly via bundle hints. + # Delete any keys that may be left over from last time. + delete @^H{ values(%feature) }; + $^H |= $hint_mask; + for (@$features) { + $^H{$feature{$_}} = 1; + $^H |= $hint_uni8bit if $_ eq 'unicode_strings'; + } + } + while (@_) { + my $name = shift; + if (substr($name, 0, 1) eq ":") { + my $v = substr($name, 1); + if (!exists $feature_bundle{$v}) { + $v =~ s/^([0-9]+)\.([0-9]+).[0-9]+$/$1.$2/; + if (!exists $feature_bundle{$v}) { + unknown_feature_bundle(substr($name, 1)); + } + } + unshift @_, @{$feature_bundle{$v}}; + next; + } + if (!exists $feature{$name}) { + if (exists $noops{$name}) { + next; + } + unknown_feature($name); + } + if ($import) { + $^H{$feature{$name}} = 1; + $^H |= $hint_uni8bit if $name eq 'unicode_strings'; + } else { + delete $^H{$feature{$name}}; + $^H &= ~ $hint_uni8bit if $name eq 'unicode_strings'; + } + } +} + +sub unknown_feature { + my $feature = shift; + croak(sprintf('Feature "%s" is not supported by Perl %vd', + $feature, $^V)); +} + +sub unknown_feature_bundle { + my $feature = shift; + croak(sprintf('Feature bundle "%s" is not supported by Perl %vd', + $feature, $^V)); +} + +sub croak { + require Carp; + Carp::croak(@_); +} + +1; + +# ex: set ro: +package subs; + +our $VERSION = '1.03'; + + +require 5.000; + +sub import { + my $callpack = caller; + my $pack = shift; + my @imports = @_; + foreach my $sym (@imports) { + *{"${callpack}::$sym"} = \&{"${callpack}::$sym"}; + } +}; + +1; +package SelfLoader; +use 5.008; +use strict; +use IO::Handle; +our $VERSION = "1.25"; + +# The following bit of eval-magic is necessary to make this work on +# perls < 5.009005. +our $AttrList; +BEGIN { + if ($] > 5.009004) { + eval <<'NEWERPERL'; +use 5.009005; # due to new regexp features +# allow checking for valid ': attrlist' attachments +# see also AutoSplit +$AttrList = qr{ + \s* : \s* + (?: + # one attribute + (?> # no backtrack + (?! \d) \w+ + (? \( (?: [^()]++ | (?&nested)++ )*+ \) ) ? + ) + (?: \s* : \s* | \s+ (?! :) ) + )* +}x; + +NEWERPERL + } + else { + eval <<'OLDERPERL'; +# allow checking for valid ': attrlist' attachments +# (we use 'our' rather than 'my' here, due to the rather complex and buggy +# behaviour of lexicals with qr// and (??{$lex}) ) +our $nested; +$nested = qr{ \( (?: (?> [^()]+ ) | (??{ $nested }) )* \) }x; +our $one_attr = qr{ (?> (?! \d) \w+ (?:$nested)? ) (?:\s*\:\s*|\s+(?!\:)) }x; +$AttrList = qr{ \s* : \s* (?: $one_attr )* }x; +OLDERPERL + } +} +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(AUTOLOAD); +sub Version {$VERSION} +sub DEBUG () { 0 } + +my %Cache; # private cache for all SelfLoader's client packages + +# in croak and carp, protect $@ from "require Carp;" RT #40216 + +sub croak { { local $@; require Carp; } goto &Carp::croak } +sub carp { { local $@; require Carp; } goto &Carp::carp } + +AUTOLOAD { + our $AUTOLOAD; + print STDERR "SelfLoader::AUTOLOAD for $AUTOLOAD\n" if DEBUG; + my $SL_code = $Cache{$AUTOLOAD}; + my $save = $@; # evals in both AUTOLOAD and _load_stubs can corrupt $@ + unless ($SL_code) { + # Maybe this pack had stubs before __DATA__, and never initialized. + # Or, this maybe an automatic DESTROY method call when none exists. + $AUTOLOAD =~ m/^(.*)::/; + SelfLoader->_load_stubs($1) unless exists $Cache{"${1}::_load_stubs((caller)[0]) } + +sub _load_stubs { + # $endlines is used by Devel::SelfStubber to capture lines after __END__ + my($self, $callpack, $endlines) = @_; + no strict "refs"; + my $fh = \*{"${callpack}::DATA"}; + use strict; + my $currpack = $callpack; + my($line,$name,@lines, @stubs, $protoype); + + print STDERR "SelfLoader::load_stubs($callpack)\n" if DEBUG; + croak("$callpack doesn't contain an __DATA__ token") + unless defined fileno($fh); + # Protect: fork() shares the file pointer between the parent and the kid + if(sysseek($fh, tell($fh), 0)) { + open my $nfh, '<&', $fh or croak "reopen: $!";# dup() the fd + close $fh or die "close: $!"; # autocloses, but be + # paranoid + open $fh, '<&', $nfh or croak "reopen2: $!"; # dup() the fd "back" + close $nfh or die "close after reopen: $!"; # autocloses, but be + # paranoid + $fh->untaint; + } + $Cache{"${currpack}::) and $line !~ m/^__END__/) { + if ($line =~ m/ ^\s* # indentation + sub\s+([\w:]+)\s* # 'sub' and sub name + ( + (?:\([\\\$\@\%\&\*\;]*\))? # optional prototype sigils + (?:$AttrList)? # optional attribute list + )/x) { + push(@stubs, $self->_add_to_cache($name, $currpack, + \@lines, $protoype)); + $protoype = $2; + @lines = ($line); + if (index($1,'::') == -1) { # simple sub name + $name = "${currpack}::$1"; + } else { # sub name with package + $name = $1; + $name =~ m/^(.*)::/; + if (defined(&{"${1}::AUTOLOAD"})) { + \&{"${1}::AUTOLOAD"} == \&SelfLoader::AUTOLOAD || + die 'SelfLoader Error: attempt to specify Selfloading', + " sub $name in non-selfloading module $1"; + } else { + $self->export($1,'AUTOLOAD'); + } + } + } elsif ($line =~ m/^package\s+([\w:]+)/) { # A package declared + push(@stubs, $self->_add_to_cache($name, $currpack, + \@lines, $protoype)); + $self->_package_defined($line); + $name = ''; + @lines = (); + $currpack = $1; + $Cache{"${currpack}::export($currpack,'AUTOLOAD'); + } + } else { + push(@lines,$line); + } + } + if (defined($line) && $line =~ /^__END__/) { # __END__ + unless ($line =~ /^__END__\s*DATA/) { + if ($endlines) { + # Devel::SelfStubber would like us to capture the lines after + # __END__ so it can write out the entire file + @$endlines = <$fh>; + } + close($fh); + } + } + push(@stubs, $self->_add_to_cache($name, $currpack, \@lines, $protoype)); + no strict; + eval join('', @stubs) if @stubs; +} + + +sub _add_to_cache { + my($self,$fullname,$pack,$lines, $protoype) = @_; + return () unless $fullname; + carp("Redefining sub $fullname") + if exists $Cache{$fullname}; + $Cache{$fullname} = join('', + "\n\#line 1 \"sub $fullname\"\npackage $pack; ", + @$lines); + #$Cache{$fullname} = join('', "package $pack; ",@$lines); + print STDERR "SelfLoader cached $fullname: $Cache{$fullname}" if DEBUG; + # return stub to be eval'd + defined($protoype) ? "sub $fullname $protoype;" : "sub $fullname;" +} + +sub _package_defined {} + +1; +__END__ + +package overload; + +our $VERSION = '1.30'; + +%ops = ( + with_assign => "+ - * / % ** << >> x .", + assign => "+= -= *= /= %= **= <<= >>= x= .=", + num_comparison => "< <= > >= == !=", + '3way_comparison' => "<=> cmp", + str_comparison => "lt le gt ge eq ne", + binary => '& &= | |= ^ ^= &. &.= |. |.= ^. ^.=', + unary => "neg ! ~ ~.", + mutators => '++ --', + func => "atan2 cos sin exp abs log sqrt int", + conversion => 'bool "" 0+ qr', + iterators => '<>', + filetest => "-X", + dereferencing => '${} @{} %{} &{} *{}', + matching => '~~', + special => 'nomethod fallback =', +); + +my %ops_seen; +@ops_seen{ map split(/ /), values %ops } = (); + +sub nil {} + +sub OVERLOAD { + $package = shift; + my %arg = @_; + my $sub; + *{$package . "::(("} = \&nil; # Make it findable via fetchmethod. + for (keys %arg) { + if ($_ eq 'fallback') { + for my $sym (*{$package . "::()"}) { + *$sym = \&nil; # Make it findable via fetchmethod. + $$sym = $arg{$_}; + } + } else { + warnings::warnif("overload arg '$_' is invalid") + unless exists $ops_seen{$_}; + $sub = $arg{$_}; + if (not ref $sub) { + $ {$package . "::(" . $_} = $sub; + $sub = \&nil; + } + #print STDERR "Setting '$ {'package'}::\cO$_' to \\&'$sub'.\n"; + *{$package . "::(" . $_} = \&{ $sub }; + } + } +} + +sub import { + $package = (caller())[0]; + # *{$package . "::OVERLOAD"} = \&OVERLOAD; + shift; + $package->overload::OVERLOAD(@_); +} + +sub unimport { + $package = (caller())[0]; + shift; + *{$package . "::(("} = \&nil; + for (@_) { + warnings::warnif("overload arg '$_' is invalid") + unless exists $ops_seen{$_}; + delete $ {$package . "::"}{$_ eq 'fallback' ? '()' : "(" .$_}; + } +} + +sub Overloaded { + my $package = shift; + $package = ref $package if ref $package; + mycan ($package, '()') || mycan ($package, '(('); +} + +sub ov_method { + my $globref = shift; + return undef unless $globref; + my $sub = \&{*$globref}; + no overloading; + return $sub if $sub != \&nil; + return shift->can($ {*$globref}); +} + +sub OverloadedStringify { + my $package = shift; + $package = ref $package if ref $package; + #$package->can('(""') + ov_method mycan($package, '(""'), $package + or ov_method mycan($package, '(0+'), $package + or ov_method mycan($package, '(bool'), $package + or ov_method mycan($package, '(nomethod'), $package; +} + +sub Method { + my $package = shift; + if(ref $package) { + local $@; + local $!; + require Scalar::Util; + $package = Scalar::Util::blessed($package); + return undef if !defined $package; + } + #my $meth = $package->can('(' . shift); + ov_method mycan($package, '(' . shift), $package; + #return $meth if $meth ne \&nil; + #return $ {*{$meth}}; +} + +sub AddrRef { + no overloading; + "$_[0]"; +} + +*StrVal = *AddrRef; + +sub mycan { # Real can would leave stubs. + my ($package, $meth) = @_; + + local $@; + local $!; + require mro; + + my $mro = mro::get_linear_isa($package); + foreach my $p (@$mro) { + my $fqmeth = $p . q{::} . $meth; + return \*{$fqmeth} if defined &{$fqmeth}; + } + + return undef; +} + +%constants = ( + 'integer' => 0x1000, # HINT_NEW_INTEGER + 'float' => 0x2000, # HINT_NEW_FLOAT + 'binary' => 0x4000, # HINT_NEW_BINARY + 'q' => 0x8000, # HINT_NEW_STRING + 'qr' => 0x10000, # HINT_NEW_RE + ); + +use warnings::register; +sub constant { + # Arguments: what, sub + while (@_) { + if (@_ == 1) { + warnings::warnif ("Odd number of arguments for overload::constant"); + last; + } + elsif (!exists $constants {$_ [0]}) { + warnings::warnif ("'$_[0]' is not an overloadable type"); + } + elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) { + # Can't use C above as code references can be + # blessed, and C would return the package the ref is blessed into. + if (warnings::enabled) { + $_ [1] = "undef" unless defined $_ [1]; + warnings::warn ("'$_[1]' is not a code reference"); + } + } + else { + $^H{$_[0]} = $_[1]; + $^H |= $constants{$_[0]}; + } + shift, shift; + } +} + +sub remove_constant { + # Arguments: what, sub + while (@_) { + delete $^H{$_[0]}; + $^H &= ~ $constants{$_[0]}; + shift, shift; + } +} + +1; + +__END__ + + +package strict; + +$strict::VERSION = "1.11"; + +my ( %bitmask, %explicit_bitmask ); + +BEGIN { + # Verify that we're called correctly so that strictures will work. + # Can't use Carp, since Carp uses us! + # see also warnings.pm. + die sprintf "Incorrect use of pragma '%s' at %s line %d.\n", __PACKAGE__, +(caller)[1,2] + if __FILE__ !~ ( '(?x) \b '.__PACKAGE__.' \.pmc? \z' ) + && __FILE__ =~ ( '(?x) \b (?i:'.__PACKAGE__.') \.pmc? \z' ); + + %bitmask = ( + refs => 0x00000002, + subs => 0x00000200, + vars => 0x00000400, + ); + + %explicit_bitmask = ( + refs => 0x00000020, + subs => 0x00000040, + vars => 0x00000080, + ); + + my $bits = 0; + $bits |= $_ for values %bitmask; + + my $inline_all_bits = $bits; + *all_bits = sub () { $inline_all_bits }; + + $bits = 0; + $bits |= $_ for values %explicit_bitmask; + + my $inline_all_explicit_bits = $bits; + *all_explicit_bits = sub () { $inline_all_explicit_bits }; +} + +sub bits { + my $bits = 0; + my @wrong; + foreach my $s (@_) { + if (exists $bitmask{$s}) { + $^H |= $explicit_bitmask{$s}; + + $bits |= $bitmask{$s}; + } + else { + push @wrong, $s; + } + } + if (@wrong) { + require Carp; + Carp::croak("Unknown 'strict' tag(s) '@wrong'"); + } + $bits; +} + +sub import { + shift; + $^H |= @_ ? &bits : all_bits | all_explicit_bits; +} + +sub unimport { + shift; + + if (@_) { + $^H &= ~&bits; + } + else { + $^H &= ~all_bits; + $^H |= all_explicit_bits; + } +} + +1; +__END__ + +package English; + +our $VERSION = '1.10'; + +require Exporter; +@ISA = qw(Exporter); + + +no warnings; + +my $globbed_match ; + +# Grandfather $NAME import +sub import { + my $this = shift; + my @list = grep { ! /^-no_match_vars$/ } @_ ; + local $Exporter::ExportLevel = 1; + if ( @_ == @list ) { + *EXPORT = \@COMPLETE_EXPORT ; + $globbed_match ||= ( + eval q{ + *MATCH = *& ; + *PREMATCH = *` ; + *POSTMATCH = *' ; + 1 ; + } + || do { + require Carp ; + Carp::croak("Can't create English for match leftovers: $@") ; + } + ) ; + } + else { + *EXPORT = \@MINIMAL_EXPORT ; + } + Exporter::import($this,grep {s/^\$/*/} @list); +} + +@MINIMAL_EXPORT = qw( + *ARG + *LAST_PAREN_MATCH + *INPUT_LINE_NUMBER + *NR + *INPUT_RECORD_SEPARATOR + *RS + *OUTPUT_AUTOFLUSH + *OUTPUT_FIELD_SEPARATOR + *OFS + *OUTPUT_RECORD_SEPARATOR + *ORS + *LIST_SEPARATOR + *SUBSCRIPT_SEPARATOR + *SUBSEP + *FORMAT_PAGE_NUMBER + *FORMAT_LINES_PER_PAGE + *FORMAT_LINES_LEFT + *FORMAT_NAME + *FORMAT_TOP_NAME + *FORMAT_LINE_BREAK_CHARACTERS + *FORMAT_FORMFEED + *CHILD_ERROR + *OS_ERROR + *ERRNO + *EXTENDED_OS_ERROR + *EVAL_ERROR + *PROCESS_ID + *PID + *REAL_USER_ID + *UID + *EFFECTIVE_USER_ID + *EUID + *REAL_GROUP_ID + *GID + *EFFECTIVE_GROUP_ID + *EGID + *PROGRAM_NAME + *PERL_VERSION + *OLD_PERL_VERSION + *ACCUMULATOR + *COMPILING + *DEBUGGING + *SYSTEM_FD_MAX + *INPLACE_EDIT + *PERLDB + *BASETIME + *WARNING + *EXECUTABLE_NAME + *OSNAME + *LAST_REGEXP_CODE_RESULT + *EXCEPTIONS_BEING_CAUGHT + *LAST_SUBMATCH_RESULT + @LAST_MATCH_START + @LAST_MATCH_END +); + + +@MATCH_EXPORT = qw( + *MATCH + *PREMATCH + *POSTMATCH +); + +@COMPLETE_EXPORT = ( @MINIMAL_EXPORT, @MATCH_EXPORT ) ; + +# The ground of all being. + + *ARG = *_ ; + +# Matching. + + *LAST_PAREN_MATCH = *+ ; + *LAST_SUBMATCH_RESULT = *^N ; + *LAST_MATCH_START = *-{ARRAY} ; + *LAST_MATCH_END = *+{ARRAY} ; + +# Input. + + *INPUT_LINE_NUMBER = *. ; + *NR = *. ; + *INPUT_RECORD_SEPARATOR = */ ; + *RS = */ ; + +# Output. + + *OUTPUT_AUTOFLUSH = *| ; + *OUTPUT_FIELD_SEPARATOR = *, ; + *OFS = *, ; + *OUTPUT_RECORD_SEPARATOR = *\ ; + *ORS = *\ ; + +# Interpolation "constants". + + *LIST_SEPARATOR = *" ; + *SUBSCRIPT_SEPARATOR = *; ; + *SUBSEP = *; ; + +# Formats + + *FORMAT_PAGE_NUMBER = *% ; + *FORMAT_LINES_PER_PAGE = *= ; + *FORMAT_LINES_LEFT = *-{SCALAR} ; + *FORMAT_NAME = *~ ; + *FORMAT_TOP_NAME = *^ ; + *FORMAT_LINE_BREAK_CHARACTERS = *: ; + *FORMAT_FORMFEED = *^L ; + +# Error status. + + *CHILD_ERROR = *? ; + *OS_ERROR = *! ; + *ERRNO = *! ; + *OS_ERROR = *! ; + *ERRNO = *! ; + *EXTENDED_OS_ERROR = *^E ; + *EVAL_ERROR = *@ ; + +# Process info. + + *PROCESS_ID = *$ ; + *PID = *$ ; + *REAL_USER_ID = *< ; + *UID = *< ; + *EFFECTIVE_USER_ID = *> ; + *EUID = *> ; + *REAL_GROUP_ID = *( ; + *GID = *( ; + *EFFECTIVE_GROUP_ID = *) ; + *EGID = *) ; + *PROGRAM_NAME = *0 ; + +# Internals. + + *PERL_VERSION = *^V ; + *OLD_PERL_VERSION = *] ; + *ACCUMULATOR = *^A ; + *COMPILING = *^C ; + *DEBUGGING = *^D ; + *SYSTEM_FD_MAX = *^F ; + *INPLACE_EDIT = *^I ; + *PERLDB = *^P ; + *LAST_REGEXP_CODE_RESULT = *^R ; + *EXCEPTIONS_BEING_CAUGHT = *^S ; + *BASETIME = *^T ; + *WARNING = *^W ; + *EXECUTABLE_NAME = *^X ; + *OSNAME = *^O ; + +# Deprecated. + +# *ARRAY_BASE = *[ ; +# *OFMT = *# ; + +1; +package integer; + +our $VERSION = '1.01'; + + +$integer::hint_bits = 0x1; + +sub import { + $^H |= $integer::hint_bits; +} + +sub unimport { + $^H &= ~$integer::hint_bits; +} + +1; +#!perl -w +package version; + +use 5.006002; +use strict; +use warnings::register; +if ($] >= 5.015) { + warnings::register_categories(qw/version/); +} + +our $VERSION = 0.9923; +our $CLASS = 'version'; +our (@ISA, $STRICT, $LAX); + +# avoid using Exporter +require version::regex; +*version::is_lax = \&version::regex::is_lax; +*version::is_strict = \&version::regex::is_strict; +*LAX = \$version::regex::LAX; +*LAX_DECIMAL_VERSION = \$version::regex::LAX_DECIMAL_VERSION; +*LAX_DOTTED_DECIMAL_VERSION = \$version::regex::LAX_DOTTED_DECIMAL_VERSION; +*STRICT = \$version::regex::STRICT; +*STRICT_DECIMAL_VERSION = \$version::regex::STRICT_DECIMAL_VERSION; +*STRICT_DOTTED_DECIMAL_VERSION = \$version::regex::STRICT_DOTTED_DECIMAL_VERSION; + +sub import { + no strict 'refs'; + my ($class) = shift; + + # Set up any derived class + unless ($class eq $CLASS) { + local $^W; + *{$class.'::declare'} = \&{$CLASS.'::declare'}; + *{$class.'::qv'} = \&{$CLASS.'::qv'}; + } + + my %args; + if (@_) { # any remaining terms are arguments + map { $args{$_} = 1 } @_ + } + else { # no parameters at all on use line + %args = + ( + qv => 1, + 'UNIVERSAL::VERSION' => 1, + ); + } + + my $callpkg = caller(); + + if (exists($args{declare})) { + *{$callpkg.'::declare'} = + sub {return $class->declare(shift) } + unless defined(&{$callpkg.'::declare'}); + } + + if (exists($args{qv})) { + *{$callpkg.'::qv'} = + sub {return $class->qv(shift) } + unless defined(&{$callpkg.'::qv'}); + } + + if (exists($args{'UNIVERSAL::VERSION'})) { + local $^W; + *UNIVERSAL::VERSION + = \&{$CLASS.'::_VERSION'}; + } + + if (exists($args{'VERSION'})) { + *{$callpkg.'::VERSION'} = \&{$CLASS.'::_VERSION'}; + } + + if (exists($args{'is_strict'})) { + *{$callpkg.'::is_strict'} = \&{$CLASS.'::is_strict'} + unless defined(&{$callpkg.'::is_strict'}); + } + + if (exists($args{'is_lax'})) { + *{$callpkg.'::is_lax'} = \&{$CLASS.'::is_lax'} + unless defined(&{$callpkg.'::is_lax'}); + } +} + + +1; +package bigint; + +use 5.010; +use strict; +use warnings; + +our $VERSION = '0.49'; + +use Exporter; +our @ISA = qw( Exporter ); +our @EXPORT_OK = qw( PI e bpi bexp hex oct ); +our @EXPORT = qw( inf NaN ); + +use overload; + +############################################################################## + +# These are all alike, and thus faked by AUTOLOAD + +my @faked = qw/round_mode accuracy precision div_scale/; +our ($AUTOLOAD, $_lite); # _lite for testsuite + +sub AUTOLOAD { + my $name = $AUTOLOAD; + + $name =~ s/.*:://; # split package + no strict 'refs'; + foreach my $n (@faked) { + if ($n eq $name) { + *{"bigint::$name"} = + sub { + my $self = shift; + no strict 'refs'; + if (defined $_[0]) { + return Math::BigInt->$name($_[0]); + } + return Math::BigInt->$name(); + }; + return &$name; + } + } + + # delayed load of Carp and avoid recursion + require Carp; + Carp::croak ("Can't call bigint\-\>$name, not a valid method"); +} + +sub upgrade { + $Math::BigInt::upgrade; +} + +sub _binary_constant { + # this takes a binary/hexadecimal/octal constant string and returns it + # as string suitable for new. Basically it converts octal to decimal, and + # passes every thing else unmodified back. + my $string = shift; + + return Math::BigInt->new($string) if $string =~ /^0[bx]/; + + # so it must be an octal constant + Math::BigInt->from_oct($string); +} + +sub _float_constant { + # this takes a floating point constant string and returns it truncated to + # integer. For instance, '4.5' => '4', '1.234e2' => '123' etc + my $float = shift; + + # some simple cases first + return $float if ($float =~ /^[+-]?[0-9]+$/); # '+123','-1','0' etc + return $float + if ($float =~ /^[+-]?[0-9]+\.?[eE]\+?[0-9]+$/); # 123e2, 123.e+2 + return '0' if ($float =~ /^[+-]?[0]*\.[0-9]+$/); # .2, 0.2, -.1 + if ($float =~ /^[+-]?[0-9]+\.[0-9]*$/) { # 1., 1.23, -1.2 etc + $float =~ s/\..*//; + return $float; + } + my ($mis, $miv, $mfv, $es, $ev) = Math::BigInt::_split($float); + return $float if !defined $mis; # doesn't look like a number to me + my $ec = int($$ev); + my $sign = $$mis; + $sign = '' if $sign eq '+'; + if ($$es eq '-') { + # ignore fraction part entirely + if ($ec >= length($$miv)) { # 123.23E-4 + return '0'; + } + return $sign . substr($$miv, 0, length($$miv) - $ec); # 1234.45E-2 = 12 + } + # xE+y + if ($ec >= length($$mfv)) { + $ec -= length($$mfv); + return $sign.$$miv.$$mfv if $ec == 0; # 123.45E+2 => 12345 + return $sign.$$miv.$$mfv.'E'.$ec; # 123.45e+3 => 12345e1 + } + $mfv = substr($$mfv, 0, $ec); + $sign.$$miv.$mfv; # 123.45e+1 => 1234 +} + +sub unimport { + $^H{bigint} = undef; # no longer in effect + overload::remove_constant('binary', '', 'float', '', 'integer'); +} + +sub in_effect { + my $level = shift || 0; + my $hinthash = (caller($level))[10]; + $hinthash->{bigint}; +} + +############################################################################# +# the following two routines are for "use bigint qw/hex oct/;": + +use constant LEXICAL => $] > 5.009004; + +# Internal function with the same semantics as CORE::hex(). This function is +# not used directly, but rather by other front-end functions. + +sub _hex_core { + my $str = shift; + + # Strip off, clean, and parse as much as we can from the beginning. + + my $x; + if ($str =~ s/ ^ (0?[xX])? ( [0-9a-fA-F]* ( _ [0-9a-fA-F]+ )* ) //x) { + my $chrs = $2; + $chrs =~ tr/_//d; + $chrs = '0' unless CORE::length $chrs; + $x = Math::BigInt -> from_hex($chrs); + } else { + $x = Math::BigInt -> bzero(); + } + + # Warn about trailing garbage. + + if (CORE::length($str)) { + require Carp; + Carp::carp(sprintf("Illegal hexadecimal digit '%s' ignored", + substr($str, 0, 1))); + } + + return $x; +} + +# Internal function with the same semantics as CORE::oct(). This function is +# not used directly, but rather by other front-end functions. + +sub _oct_core { + my $str = shift; + + $str =~ s/^\s*//; + + # Hexadecimal input. + + return _hex_core($str) if $str =~ /^0?[xX]/; + + my $x; + + # Binary input. + + if ($str =~ /^0?[bB]/) { + + # Strip off, clean, and parse as much as we can from the beginning. + + if ($str =~ s/ ^ (0?[bB])? ( [01]* ( _ [01]+ )* ) //x) { + my $chrs = $2; + $chrs =~ tr/_//d; + $chrs = '0' unless CORE::length $chrs; + $x = Math::BigInt -> from_bin($chrs); + } + + # Warn about trailing garbage. + + if (CORE::length($str)) { + require Carp; + Carp::carp(sprintf("Illegal binary digit '%s' ignored", + substr($str, 0, 1))); + } + + return $x; + } + + # Octal input. Strip off, clean, and parse as much as we can from the + # beginning. + + if ($str =~ s/ ^ ( [0-7]* ( _ [0-7]+ )* ) //x) { + my $chrs = $1; + $chrs =~ tr/_//d; + $chrs = '0' unless CORE::length $chrs; + $x = Math::BigInt -> from_oct($chrs); + } + + # Warn about trailing garbage. CORE::oct() only warns about 8 and 9. + + if (CORE::length($str)) { + my $chr = substr($str, 0, 1); + if ($chr eq '8' || $chr eq '9') { + require Carp; + Carp::carp(sprintf("Illegal octal digit '%s' ignored", $chr)); + } + } + + return $x; +} + +{ + my $proto = LEXICAL ? '_' : ';$'; + eval ' +sub hex(' . $proto . ') {' . <<'.'; + my $str = @_ ? $_[0] : $_; + _hex_core($str); +} +. + + eval ' +sub oct(' . $proto . ') {' . <<'.'; + my $str = @_ ? $_[0] : $_; + _oct_core($str); +} +. +} + +############################################################################# +# the following two routines are for Perl 5.9.4 or later and are lexical + +my ($prev_oct, $prev_hex, $overridden); + +if (LEXICAL) { eval <<'.' } +sub _hex(_) { + my $hh = (caller 0)[10]; + return $prev_hex ? &$prev_hex($_[0]) : CORE::hex($_[0]) + unless $$hh{bigint}||$$hh{bignum}||$$hh{bigrat}; + _hex_core($_[0]); +} + +sub _oct(_) { + my $hh = (caller 0)[10]; + return $prev_oct ? &$prev_oct($_[0]) : CORE::oct($_[0]) + unless $$hh{bigint}||$$hh{bignum}||$$hh{bigrat}; + _oct_core($_[0]); +} +. + +sub _override { + return if $overridden; + $prev_oct = *CORE::GLOBAL::oct{CODE}; + $prev_hex = *CORE::GLOBAL::hex{CODE}; + no warnings 'redefine'; + *CORE::GLOBAL::oct = \&_oct; + *CORE::GLOBAL::hex = \&_hex; + $overridden++; +} + +sub import { + my $self = shift; + + $^H{bigint} = 1; # we are in effect + + # for newer Perls always override hex() and oct() with a lexical version: + if (LEXICAL) { + _override(); + } + # some defaults + my $lib = ''; + my $lib_kind = 'try'; + + my @import = (':constant'); # drive it w/ constant + my @a = @_; + my $l = scalar @_; + my $j = 0; + my ($ver, $trace); # version? trace? + my ($a, $p); # accuracy, precision + for (my $i = 0; $i < $l; $i++, $j++) { + if ($_[$i] =~ /^(l|lib|try|only)$/) { + # this causes a different low lib to take care... + $lib_kind = $1; + $lib_kind = 'lib' if $lib_kind eq 'l'; + $lib = $_[$i + 1] || ''; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } elsif ($_[$i] =~ /^(a|accuracy)$/) { + $a = $_[$i + 1]; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } elsif ($_[$i] =~ /^(p|precision)$/) { + $p = $_[$i + 1]; + my $s = 2; + $s = 1 if @a - $j < 2; # avoid "can not modify non-existent..." + splice @a, $j, $s; + $j -= $s; + $i++; + } elsif ($_[$i] =~ /^(v|version)$/) { + $ver = 1; + splice @a, $j, 1; + $j--; + } elsif ($_[$i] =~ /^(t|trace)$/) { + $trace = 1; + splice @a, $j, 1; + $j--; + } elsif ($_[$i] !~ /^(PI|e|bpi|bexp|hex|oct)\z/) { + die ("unknown option $_[$i]"); + } + } + my $class; + $_lite = 0; # using M::BI::L ? + if ($trace) { + require Math::BigInt::Trace; + $class = 'Math::BigInt::Trace'; + } else { + # see if we can find Math::BigInt::Lite + if (!defined $a && !defined $p) { # rounding won't work to well + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + if (eval { require Math::BigInt::Lite; 1 }) { + @import = (); # :constant in Lite, not MBI + Math::BigInt::Lite->import(':constant'); + $_lite = 1; # signal okay + } + } + require Math::BigInt if $_lite == 0; # not already loaded? + $class = 'Math::BigInt'; # regardless of MBIL or not + } + push @import, $lib_kind => $lib if $lib ne ''; + # Math::BigInt::Trace or plain Math::BigInt + $class->import(@import); + + bigint->accuracy($a) if defined $a; + bigint->precision($p) if defined $p; + if ($ver) { + print "bigint\t\t\t v$VERSION\n"; + print "Math::BigInt::Lite\t v$Math::BigInt::Lite::VERSION\n" if $_lite; + print "Math::BigInt\t\t v$Math::BigInt::VERSION"; + my $config = Math::BigInt->config(); + print " lib => $config->{lib} v$config->{lib_version}\n"; + exit; + } + # we take care of floating point constants, since BigFloat isn't available + # and BigInt doesn't like them: + overload::constant float => + sub { + Math::BigInt->new(_float_constant(shift)); + }; + # Take care of octal/hexadecimal constants + overload::constant binary => + sub { + _binary_constant(shift); + }; + + # if another big* was already loaded: + my ($package) = caller(); + + no strict 'refs'; + if (!defined *{"${package}::inf"}) { + $self->export_to_level(1, $self, @a); # export inf and NaN, e and PI + } +} + +sub inf () { Math::BigInt->binf(); } +sub NaN () { Math::BigInt->bnan(); } + +sub PI () { Math::BigInt->new(3); } +sub e () { Math::BigInt->new(2); } +sub bpi ($) { Math::BigInt->new(3); } +sub bexp ($$) { + my $x = Math::BigInt->new($_[0]); + $x->bexp($_[1]); +} + +1; + +__END__ + +package autodie; +use 5.008; +use strict; +use warnings; + +use parent qw(Fatal); +our $VERSION; + +# ABSTRACT: Replace functions with ones that succeed or die with lexical scope + +BEGIN { + our $VERSION = '2.29'; # VERSION: Generated by DZP::OurPkg::Version +} + +use constant ERROR_WRONG_FATAL => q{ +Incorrect version of Fatal.pm loaded by autodie. + +The autodie pragma uses an updated version of Fatal to do its +heavy lifting. We seem to have loaded Fatal version %s, which is +probably the version that came with your version of Perl. However +autodie needs version %s, which would have come bundled with +autodie. + +You may be able to solve this problem by adding the following +line of code to your main program, before any use of Fatal or +autodie. + + use lib "%s"; + +}; + +# We have to check we've got the right version of Fatal before we +# try to compile the rest of our code, lest we use a constant +# that doesn't exist. + +BEGIN { + + # If we have the wrong Fatal, then we've probably loaded the system + # one, not our own. Complain, and give a useful hint. ;) + + if (defined($Fatal::VERSION) and defined($VERSION) and $Fatal::VERSION ne $VERSION) { + my $autodie_path = $INC{'autodie.pm'}; + + $autodie_path =~ s/autodie\.pm//; + + require Carp; + + Carp::croak sprintf( + ERROR_WRONG_FATAL, $Fatal::VERSION, $VERSION, $autodie_path + ); + } +} + +# When passing args to Fatal we want to keep the first arg +# (our package) in place. Hence the splice. + +sub import { + splice(@_,1,0,Fatal::LEXICAL_TAG); + goto &Fatal::import; +} + +sub unimport { + splice(@_,1,0,Fatal::LEXICAL_TAG); + goto &Fatal::unimport; +} + +1; + +__END__ + +package PerlIO; + +our $VERSION = '1.10'; + +# Map layer name to package that defines it +our %alias; + +sub import +{ + my $class = shift; + while (@_) + { + my $layer = shift; + if (exists $alias{$layer}) + { + $layer = $alias{$layer} + } + else + { + $layer = "${class}::$layer"; + } + eval { require $layer =~ s{::}{/}gr . '.pm' }; + warn $@ if $@; + } +} + +sub F_UTF8 () { 0x8000 } + +1; +__END__ + +use strict; +use warnings; +package perlfaq; +$perlfaq::VERSION = '5.021011'; +1; +package vars; + +use 5.006; + +our $VERSION = '1.04'; + +use warnings::register; +use strict qw(vars subs); + +sub import { + my $callpack = caller; + my (undef, @imports) = @_; + my ($sym, $ch); + foreach (@imports) { + if (($ch, $sym) = /^([\$\@\%\*\&])(.+)/) { + if ($sym =~ /\W/) { + # time for a more-detailed check-up + if ($sym =~ /^\w+[[{].*[]}]$/) { + require Carp; + Carp::croak("Can't declare individual elements of hash or array"); + } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) { + warnings::warn("No need to declare built-in vars"); + } elsif (($^H &= strict::bits('vars'))) { + require Carp; + Carp::croak("'$_' is not a valid variable name under strict vars"); + } + } + $sym = "${callpack}::$sym" unless $sym =~ /::/; + *$sym = + ( $ch eq "\$" ? \$$sym + : $ch eq "\@" ? \@$sym + : $ch eq "\%" ? \%$sym + : $ch eq "\*" ? \*$sym + : $ch eq "\&" ? \&$sym + : do { + require Carp; + Carp::croak("'$_' is not a valid variable name"); + }); + } else { + require Carp; + Carp::croak("'$_' is not a valid variable name"); + } + } +}; + +1; +__END__ + +package Exporter; + +require 5.006; + +# Be lean. +#use strict; +#no strict 'refs'; + +our $Debug = 0; +our $ExportLevel = 0; +our $Verbose ||= 0; +our $VERSION = '5.73'; +our (%Cache); + +sub as_heavy { + require Exporter::Heavy; + # Unfortunately, this does not work if the caller is aliased as *name = \&foo + # Thus the need to create a lot of identical subroutines + my $c = (caller(1))[3]; + $c =~ s/.*:://; + \&{"Exporter::Heavy::heavy_$c"}; +} + +sub export { + goto &{as_heavy()}; +} + +sub import { + my $pkg = shift; + my $callpkg = caller($ExportLevel); + + if ($pkg eq "Exporter" and @_ and $_[0] eq "import") { + *{$callpkg."::import"} = \&import; + return; + } + + # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-( + my $exports = \@{"$pkg\::EXPORT"}; + # But, avoid creating things if they don't exist, which saves a couple of + # hundred bytes per package processed. + my $fail = ${$pkg . '::'}{EXPORT_FAIL} && \@{"$pkg\::EXPORT_FAIL"}; + return export $pkg, $callpkg, @_ + if $Verbose or $Debug or $fail && @$fail > 1; + my $export_cache = ($Cache{$pkg} ||= {}); + my $args = @_ or @_ = @$exports; + + if ($args and not %$export_cache) { + s/^&//, $export_cache->{$_} = 1 + foreach (@$exports, @{"$pkg\::EXPORT_OK"}); + } + my $heavy; + # Try very hard not to use {} and hence have to enter scope on the foreach + # We bomb out of the loop with last as soon as heavy is set. + if ($args or $fail) { + ($heavy = (/\W/ or $args and not exists $export_cache->{$_} + or $fail and @$fail and $_ eq $fail->[0])) and last + foreach (@_); + } else { + ($heavy = /\W/) and last + foreach (@_); + } + return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy; + local $SIG{__WARN__} = + sub {require Carp; &Carp::carp} if not $SIG{__WARN__}; + # shortcut for the common case of no type character + *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_; +} + +# Default methods + +sub export_fail { + my $self = shift; + @_; +} + +# Unfortunately, caller(1)[3] "does not work" if the caller is aliased as +# *name = \&foo. Thus the need to create a lot of identical subroutines +# Otherwise we could have aliased them to export(). + +sub export_to_level { + goto &{as_heavy()}; +} + +sub export_tags { + goto &{as_heavy()}; +} + +sub export_ok_tags { + goto &{as_heavy()}; +} + +sub require_version { + goto &{as_heavy()}; +} + +1; +__END__ + + + + +package locale; + +our $VERSION = '1.09'; +use Config; + +$Carp::Internal{ (__PACKAGE__) } = 1; + + +# A separate bit is used for each of the two forms of the pragma, to save +# having to look at %^H for the normal case of a plain 'use locale' without an +# argument. + +$locale::hint_bits = 0x4; +$locale::partial_hint_bits = 0x10; # If pragma has an argument + +# The pseudo-category :characters consists of 2 real ones; but it also is +# given its own number, -1, because in the complement form it also has the +# side effect of "use feature 'unicode_strings'" + +sub import { + shift; # should be 'locale'; not checked + + $^H{locale} = 0 unless defined $^H{locale}; + if (! @_) { # If no parameter, use the plain form that changes all categories + $^H |= $locale::hint_bits; + + } + else { + my @categories = ( qw(:ctype :collate :messages + :numeric :monetary :time) ); + for (my $i = 0; $i < @_; $i++) { + my $arg = $_[$i]; + $complement = $arg =~ s/ : ( ! | not_ ) /:/x; + if (! grep { $arg eq $_ } @categories, ":characters") { + require Carp; + Carp::croak("Unknown parameter '$_[$i]' to 'use locale'"); + } + + if ($complement) { + if ($i != 0 || $i < @_ - 1) { + require Carp; + Carp::croak("Only one argument to 'use locale' allowed" + . "if is $complement"); + } + + if ($arg eq ':characters') { + push @_, grep { $_ ne ':ctype' && $_ ne ':collate' } + @categories; + # We add 1 to the category number; This category number + # is -1 + $^H{locale} |= (1 << 0); + } + else { + push @_, grep { $_ ne $arg } @categories; + } + next; + } + elsif ($arg eq ':characters') { + push @_, ':ctype', ':collate'; + next; + } + + $^H |= $locale::partial_hint_bits; + + # This form of the pragma overrides the other + $^H &= ~$locale::hint_bits; + + $arg =~ s/^://; + + eval { require POSIX; import POSIX 'locale_h'; }; + + # Map our names to the ones defined by POSIX + my $LC = "LC_" . uc($arg); + + my $bit = eval "&POSIX::$LC"; + if (defined $bit) { # XXX Should we warn that this category isn't + # supported on this platform, or make it + # always be the C locale? + + # Verify our assumption. + if (! ($bit >= 0 && $bit < 31)) { + require Carp; + Carp::croak("Cannot have ':$arg' parameter to 'use locale'" + . " on this platform. Use the 'perlbug' utility" + . " to report this problem, or send email to" + . " 'perlbug\@perl.org'. $LC=$bit"); + } + + # 1 is added so that the pseudo-category :characters, which is + # -1, comes out 0. + $^H{locale} |= 1 << ($bit + 1); + } + } + } + +} + +sub unimport { + $^H &= ~($locale::hint_bits|$locale::partial_hint_bits); + $^H{locale} = 0; +} + +1; +package sigtrap; + + +use Carp; + +$VERSION = 1.08; +$Verbose ||= 0; + +sub import { + my $pkg = shift; + my $handler = \&handler_traceback; + my $saw_sig = 0; + my $untrapped = 0; + local $_; + + Arg_loop: + while (@_) { + $_ = shift; + if (/^[A-Z][A-Z0-9]*$/) { + $saw_sig++; + unless ($untrapped and $SIG{$_} and $SIG{$_} ne 'DEFAULT') { + print "Installing handler $handler for $_\n" if $Verbose; + $SIG{$_} = $handler; + } + } + elsif ($_ eq 'normal-signals') { + unshift @_, grep(exists $SIG{$_}, qw(HUP INT PIPE TERM)); + } + elsif ($_ eq 'error-signals') { + unshift @_, grep(exists $SIG{$_}, + qw(ABRT BUS EMT FPE ILL QUIT SEGV SYS TRAP)); + } + elsif ($_ eq 'old-interface-signals') { + unshift @_, + grep(exists $SIG{$_}, + qw(ABRT BUS EMT FPE ILL PIPE QUIT SEGV SYS TERM TRAP)); + } + elsif ($_ eq 'stack-trace') { + $handler = \&handler_traceback; + } + elsif ($_ eq 'die') { + $handler = \&handler_die; + } + elsif ($_ eq 'handler') { + @_ or croak "No argument specified after 'handler'"; + $handler = shift; + unless (ref $handler or $handler eq 'IGNORE' + or $handler eq 'DEFAULT') { + require Symbol; + $handler = Symbol::qualify($handler, (caller)[0]); + } + } + elsif ($_ eq 'untrapped') { + $untrapped = 1; + } + elsif ($_ eq 'any') { + $untrapped = 0; + } + elsif ($_ =~ /^\d/) { + $VERSION >= $_ or croak "sigtrap.pm version $_ required," + . " but this is only version $VERSION"; + } + else { + croak "Unrecognized argument $_"; + } + } + unless ($saw_sig) { + @_ = qw(old-interface-signals); + goto Arg_loop; + } +} + +sub handler_die { + croak "Caught a SIG$_[0]"; +} + +sub handler_traceback { + package DB; # To get subroutine args. + $SIG{'ABRT'} = DEFAULT; + kill 'ABRT', $$ if $panic++; + syswrite(STDERR, 'Caught a SIG', 12); + syswrite(STDERR, $_[0], length($_[0])); + syswrite(STDERR, ' at ', 4); + ($pack,$file,$line) = caller; + syswrite(STDERR, $file, length($file)); + syswrite(STDERR, ' line ', 6); + syswrite(STDERR, $line, length($line)); + syswrite(STDERR, "\n", 1); + + # Now go for broke. + for ($i = 1; ($p,$f,$l,$s,$h,$w,$e,$r) = caller($i); $i++) { + @a = (); + for (@{[@args]}) { + s/([\'\\])/\\$1/g; + s/([^\0]*)/'$1'/ + unless /^(?: -?[\d.]+ | \*[\w:]* )$/x; + require 'meta_notation.pm'; + $_ = _meta_notation($_) if /[[:^print:]]/a; + push(@a, $_); + } + $w = $w ? '@ = ' : '$ = '; + $a = $h ? '(' . join(', ', @a) . ')' : ''; + $e =~ s/\n\s*\;\s*\Z// if $e; + $e =~ s/[\\\']/\\$1/g if $e; + if ($r) { + $s = "require '$e'"; + } elsif (defined $r) { + $s = "eval '$e'"; + } elsif ($s eq '(eval)') { + $s = "eval {...}"; + } + $f = "file '$f'" unless $f eq '-e'; + $mess = "$w$s$a called from $f line $l\n"; + syswrite(STDERR, $mess, length($mess)); + } + kill 'ABRT', $$; +} + +1; + +__END__ + +package DirHandle; + +our $VERSION = '1.05'; + + +require 5.000; +use Carp; +use Symbol; + +sub new { + @_ >= 1 && @_ <= 2 or croak 'usage: DirHandle->new( [DIRNAME] )'; + my $class = shift; + my $dh = gensym; + if (@_) { + DirHandle::open($dh, $_[0]) + or return undef; + } + bless $dh, $class; +} + +sub DESTROY { + my ($dh) = @_; + # Don't warn about already being closed as it may have been closed + # correctly, or maybe never opened at all. + local($., $@, $!, $^E, $?); + no warnings 'io'; + closedir($dh); +} + +sub open { + @_ == 2 or croak 'usage: $dh->open(DIRNAME)'; + my ($dh, $dirname) = @_; + opendir($dh, $dirname); +} + +sub close { + @_ == 1 or croak 'usage: $dh->close()'; + my ($dh) = @_; + closedir($dh); +} + +sub read { + @_ == 1 or croak 'usage: $dh->read()'; + my ($dh) = @_; + readdir($dh); +} + +sub rewind { + @_ == 1 or croak 'usage: $dh->rewind()'; + my ($dh) = @_; + rewinddir($dh); +} + +1; +use strict; +use warnings; + +# A tiny private library routine which is a helper to several Perl core +# modules, to allow a paradigm to be implemented in a single place. The name, +# contents, or even the existence of this file may be changed at any time and +# are NOT to be used by anything outside the Perl core. + +sub _meta_notation ($) { + + # Returns a copy of the input string with the nonprintable characters + # below 0x100 changed into printables. Any ASCII printables or above 0xFF + # are unchanged. (XXX Probably above-Latin1 characters should be + # converted to \X{...}) + # + # \0 .. \x1F (which are "\c@" .. "\c_") are changed into ^@, ^A, ^B, ... + # ^Z, ^[, ^\, ^], ^^, ^_ + # \c? is changed into ^?. + # + # The above accounts for all the ASCII-range nonprintables. + # + # On ASCII platforms, the upper-Latin1-range characters are converted to + # Meta notation, so that \xC1 becomes 'M-A', \xE2 becomes 'M-b', etc. + # This is how it always has worked, so is continued that way for backwards + # compatibility. The range \x80 .. \x9F becomes M-^@ .. M-^A, M-^B, ... + # M-^Z, M-^[, M-^\, M-^], M-^, M-^_ + # + # On EBCDIC platforms, the upper-Latin1-range characters are converted + # into '\x{...}' Meta notation doesn't make sense on EBCDIC platforms + # because the ASCII-range printables are a mixture of upper bit set or + # not. [A-Za-Z0-9] all have the upper bit set. The underscore likely + # doesn't; and other punctuation may or may not. There's no simple + # pattern. + + my $string = shift; + + $string =~ s/([\0-\037])/ + sprintf("^%c",utf8::unicode_to_native(ord($1)^64))/xeg; + $string =~ s/\c?/^?/g; + if (ord("A") == 65) { + $string =~ s/([\200-\237])/sprintf("M-^%c",(ord($1)&0177)^64)/eg; + $string =~ s/([\240-\377])/sprintf("M-%c" ,ord($1)&0177)/eg; + } + else { + no warnings 'experimental::regex_sets'; + # Leave alone things above \xff + $string =~ s/( (?[ [\x00-\xFF] & [:^print:]])) / + sprintf("\\x{%X}", ord($1))/xaeg; + } + + return $string; +} +1 +package autodie::Util; + +use strict; +use warnings; + +use Exporter 5.57 qw(import); + +use autodie::Scope::GuardStack; + +our @EXPORT_OK = qw( + fill_protos + install_subs + make_core_trampoline + on_end_of_compile_scope +); + +our $VERSION = '2.29'; # VERSION: Generated by DZP::OurPkg:Version + +# ABSTRACT: Internal Utility subroutines for autodie and Fatal + +# docs says we should pick __PACKAGE__ / +my $H_STACK_KEY = __PACKAGE__ . '/stack'; + +sub on_end_of_compile_scope { + my ($hook) = @_; + + # Dark magic to have autodie work under 5.8 + # Copied from namespace::clean, that copied it from + # autobox, that found it on an ancient scroll written + # in blood. + + # This magic bit causes %^H to be lexically scoped. + $^H |= 0x020000; + + my $stack = $^H{$H_STACK_KEY}; + if (not defined($stack)) { + $stack = autodie::Scope::GuardStack->new; + $^H{$H_STACK_KEY} = $stack; + } + + $stack->push_hook($hook); + return; +} + +# This code is based on code from the original Fatal. The "XXXX" +# remark is from the original code and its meaning is (sadly) unknown. +sub fill_protos { + my ($proto) = @_; + my ($n, $isref, @out, @out1, $seen_semi) = -1; + if ($proto =~ m{^\s* (?: [;] \s*)? \@}x) { + # prototype is entirely slurply - special case that does not + # require any handling. + return ([0, '@_']); + } + + while ($proto =~ /\S/) { + $n++; + push(@out1,[$n,@out]) if $seen_semi; + push(@out, $1 . "{\$_[$n]}"), next if $proto =~ s/^\s*\\([\@%\$\&])//; + push(@out, "\$_[$n]"), next if $proto =~ s/^\s*([_*\$&])//; + push(@out, "\@_[$n..\$#_]"), last if $proto =~ s/^\s*(;\s*)?\@//; + $seen_semi = 1, $n--, next if $proto =~ s/^\s*;//; # XXXX ???? + die "Internal error: Unknown prototype letters: \"$proto\""; + } + push(@out1,[$n+1,@out]); + return @out1; +} + + +sub make_core_trampoline { + my ($call, $pkg, $proto_str) = @_; + my $trampoline_code = 'sub {'; + my $trampoline_sub; + my @protos = fill_protos($proto_str); + + foreach my $proto (@protos) { + local $" = ", "; # So @args is formatted correctly. + my ($count, @args) = @$proto; + if (@args && $args[-1] =~ m/[@#]_/) { + $trampoline_code .= qq/ + if (\@_ >= $count) { + return $call(@args); + } + /; + } else { + $trampoline_code .= qq< + if (\@_ == $count) { + return $call(@args); + } + >; + } + } + + $trampoline_code .= qq< require Carp; Carp::croak("Internal error in Fatal/autodie. Leak-guard failure"); } >; + my $E; + + { + local $@; + $trampoline_sub = eval "package $pkg;\n $trampoline_code"; ## no critic + $E = $@; + } + die "Internal error in Fatal/autodie: Leak-guard installation failure: $E" + if $E; + + return $trampoline_sub; +} + +# The code here is originally lifted from namespace::clean, +# by Robert "phaylon" Sedlacek. +# +# It's been redesigned after feedback from ikegami on perlmonks. +# See http://perlmonks.org/?node_id=693338 . Ikegami rocks. +# +# Given a package, and hash of (subname => subref) pairs, +# we install the given subroutines into the package. If +# a subref is undef, the subroutine is removed. Otherwise +# it replaces any existing subs which were already there. + +sub install_subs { + my ($target_pkg, $subs_to_reinstate) = @_; + + my $pkg_sym = "${target_pkg}::"; + + # It does not hurt to do this in a predictable order, and might help debugging. + foreach my $sub_name (sort keys(%{$subs_to_reinstate})) { + + # We will repeatedly mess with stuff that strict "refs" does + # not like. So lets just disable it once for this entire + # scope. + no strict qw(refs); ## no critic + + my $sub_ref = $subs_to_reinstate->{$sub_name}; + + my $full_path = ${pkg_sym}.${sub_name}; + my $oldglob = *$full_path; + + # Nuke the old glob. + delete($pkg_sym->{$sub_name}); + + # For some reason this local *alias = *$full_path triggers an + # "only used once" warning. Not entirely sure why, but at + # least it is easy to silence. + no warnings qw(once); + local *alias = *$full_path; + use warnings qw(once); + + # Copy innocent bystanders back. Note that we lose + # formats; it seems that Perl versions up to 5.10.0 + # have a bug which causes copying formats to end up in + # the scalar slot. Thanks to Ben Morrow for spotting this. + + foreach my $slot (qw( SCALAR ARRAY HASH IO ) ) { + next unless defined(*$oldglob{$slot}); + *alias = *$oldglob{$slot}; + } + + if ($sub_ref) { + *$full_path = $sub_ref; + } + } + + return; +} + +1; + +__END__ + +package autodie::skip; +use strict; +use warnings; + +our $VERSION = '2.29'; # VERSION + +# This package exists purely so people can inherit from it, +# which isn't at all how roles are supposed to work, but it's +# how people will use them anyway. + +if ($] < 5.010) { + # Older Perls don't have a native ->DOES. Let's provide a cheap + # imitation here. + + *DOES = sub { return shift->isa(@_); }; +} + +1; + +__END__ + +package autodie::hints; + +use strict; +use warnings; + +use constant PERL58 => ( $] < 5.009 ); + +our $VERSION = '2.29001'; + +# ABSTRACT: Provide hints about user subroutines to autodie + + +# TODO: implement regular expression hints + +use constant UNDEF_ONLY => sub { not defined $_[0] }; +use constant EMPTY_OR_UNDEF => sub { + ! @_ or + @_==1 && !defined $_[0] +}; + +use constant EMPTY_ONLY => sub { @_ == 0 }; +use constant EMPTY_OR_FALSE => sub { + ! @_ or + @_==1 && !$_[0] +}; + +use constant SINGLE_TRUE => sub { @_ == 1 and not $_[0] }; + +use constant DEFAULT_HINTS => { + scalar => UNDEF_ONLY, + list => EMPTY_OR_UNDEF, +}; + + +use constant HINTS_PROVIDER => 'autodie::hints::provider'; + +our $DEBUG = 0; + +# Only ( undef ) is a strange but possible situation for very +# badly written code. It's not supported yet. + +my %Hints = ( + 'File::Copy::copy' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE }, + 'File::Copy::move' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE }, + 'File::Copy::cp' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE }, + 'File::Copy::mv' => { scalar => SINGLE_TRUE, list => SINGLE_TRUE }, +); + +# Start by using Sub::Identify if it exists on this system. + +eval { require Sub::Identify; Sub::Identify->import('get_code_info'); }; + +# If it doesn't exist, we'll define our own. This code is directly +# taken from Rafael Garcia's Sub::Identify 0.04, used under the same +# license as Perl itself. + +if ($@) { + require B; + + no warnings 'once'; + + *get_code_info = sub ($) { + + my ($coderef) = @_; + ref $coderef or return; + my $cv = B::svref_2object($coderef); + $cv->isa('B::CV') or return; + # bail out if GV is undefined + $cv->GV->isa('B::SPECIAL') and return; + + return ($cv->GV->STASH->NAME, $cv->GV->NAME); + }; + +} + +sub sub_fullname { + return join( '::', get_code_info( $_[1] ) ); +} + +my %Hints_loaded = (); + +sub load_hints { + my ($class, $sub) = @_; + + my ($package) = ( $sub =~ /(.*)::/ ); + + if (not defined $package) { + require Carp; + Carp::croak( + "Internal error in autodie::hints::load_hints - no package found. + "); + } + + # Do nothing if we've already tried to load hints for + # this package. + return if $Hints_loaded{$package}++; + + my $hints_available = 0; + + { + no strict 'refs'; ## no critic + + if ($package->can('DOES') and $package->DOES(HINTS_PROVIDER) ) { + $hints_available = 1; + } + elsif ( PERL58 and $package->isa(HINTS_PROVIDER) ) { + $hints_available = 1; + } + elsif ( ${"${package}::DOES"}{HINTS_PROVIDER.""} ) { + $hints_available = 1; + } + } + + return if not $hints_available; + + my %package_hints = %{ $package->AUTODIE_HINTS }; + + foreach my $sub (keys %package_hints) { + + my $hint = $package_hints{$sub}; + + # Ensure we have a package name. + $sub = "${package}::$sub" if $sub !~ /::/; + + # TODO - Currently we don't check for conflicts, should we? + $Hints{$sub} = $hint; + + $class->normalise_hints(\%Hints, $sub); + } + + return; + +} + +sub normalise_hints { + my ($class, $hints, $sub) = @_; + + if ( exists $hints->{$sub}->{fail} ) { + + if ( exists $hints->{$sub}->{scalar} or + exists $hints->{$sub}->{list} + ) { + # TODO: Turn into a proper diagnostic. + require Carp; + local $Carp::CarpLevel = 1; + Carp::croak("fail hints cannot be provided with either scalar or list hints for $sub"); + } + + # Set our scalar and list hints. + + $hints->{$sub}->{scalar} = + $hints->{$sub}->{list} = delete $hints->{$sub}->{fail}; + + return; + + } + + # Check to make sure all our hints exist. + + foreach my $hint (qw(scalar list)) { + if ( not exists $hints->{$sub}->{$hint} ) { + # TODO: Turn into a proper diagnostic. + require Carp; + local $Carp::CarpLevel = 1; + Carp::croak("$hint hint missing for $sub"); + } + } + + return; +} + +sub get_hints_for { + my ($class, $sub) = @_; + + my $subname = $class->sub_fullname( $sub ); + + # If we have hints loaded for a sub, then return them. + + if ( exists $Hints{ $subname } ) { + return $Hints{ $subname }; + } + + # If not, we try to load them... + + $class->load_hints( $subname ); + + # ...and try again! + + if ( exists $Hints{ $subname } ) { + return $Hints{ $subname }; + } + + # It's the caller's responsibility to use defaults if desired. + # This allows on autodie to insist on hints if needed. + + return; + +} + +sub set_hints_for { + my ($class, $sub, $hints) = @_; + + if (ref $sub) { + $sub = $class->sub_fullname( $sub ); + + require Carp; + + $sub or Carp::croak("Attempts to set_hints_for unidentifiable subroutine"); + } + + if ($DEBUG) { + warn "autodie::hints: Setting $sub to hints: $hints\n"; + } + + $Hints{ $sub } = $hints; + + $class->normalise_hints(\%Hints, $sub); + + return; +} + +1; + +__END__ + + +package autodie::exception; +use 5.008; +use strict; +use warnings; +use Carp qw(croak); + +our $VERSION = '2.29002'; +# ABSTRACT: Exceptions from autodying functions. + +our $DEBUG = 0; + +use overload + q{""} => "stringify", + # Overload smart-match only if we're using 5.10 or up + ($] >= 5.010 ? ('~~' => "matches") : ()), + fallback => 1 +; + +my $PACKAGE = __PACKAGE__; # Useful to have a scalar for hash keys. + + + +sub args { return $_[0]->{$PACKAGE}{args}; } + + +sub function { return $_[0]->{$PACKAGE}{function}; } + + +sub file { return $_[0]->{$PACKAGE}{file}; } + + +sub package { return $_[0]->{$PACKAGE}{package}; } + + +sub caller { return $_[0]->{$PACKAGE}{caller}; } + + +sub line { return $_[0]->{$PACKAGE}{line}; } + + +# TODO: The comments above say this can be undefined. Is that actually +# the case? (With 'system', perhaps?) + +sub context { return $_[0]->{$PACKAGE}{context} } + + +sub return { return $_[0]->{$PACKAGE}{return} } + + +# TODO: Make errno part of a role. It doesn't make sense for +# everything. + +sub errno { return $_[0]->{$PACKAGE}{errno}; } + + +sub eval_error { return $_[0]->{$PACKAGE}{eval_error}; } + + +{ + my (%cache); + + sub matches { + my ($this, $that) = @_; + + # TODO - Handle references + croak "UNIMPLEMENTED" if ref $that; + + my $sub = $this->function; + + if ($DEBUG) { + my $sub2 = $this->function; + warn "Smart-matching $that against $sub / $sub2\n"; + } + + # Direct subname match. + return 1 if $that eq $sub; + return 1 if $that !~ /:/ and "CORE::$that" eq $sub; + return 0 if $that !~ /^:/; + + # Cached match / check tags. + require Fatal; + + if (exists $cache{$sub}{$that}) { + return $cache{$sub}{$that}; + } + + # This rather awful looking line checks to see if our sub is in the + # list of expanded tags, caches it, and returns the result. + + return $cache{$sub}{$that} = grep { $_ eq $sub } @{ $this->_expand_tag($that) }; + } +} + +# This exists primarily so that child classes can override or +# augment it if they wish. + +sub _expand_tag { + my ($this, @args) = @_; + + return Fatal->_expand_tag(@args); +} + + +# The table below records customer formatters. +# TODO - Should this be a package var instead? +# TODO - Should these be in a completely different file, or +# perhaps loaded on demand? Most formatters will never +# get used in most programs. + +my %formatter_of = ( + 'CORE::close' => \&_format_close, + 'CORE::open' => \&_format_open, + 'CORE::dbmopen' => \&_format_dbmopen, + 'CORE::flock' => \&_format_flock, + 'CORE::read' => \&_format_readwrite, + 'CORE::sysread' => \&_format_readwrite, + 'CORE::syswrite' => \&_format_readwrite, + 'CORE::chmod' => \&_format_chmod, + 'CORE::mkdir' => \&_format_mkdir, +); + +sub _beautify_arguments { + shift @_; + + # Walk through all our arguments, and... + # + # * Replace undef with the word 'undef' + # * Replace globs with the string '$fh' + # * Quote all other args. + foreach my $arg (@_) { + if (not defined($arg)) { $arg = 'undef' } + elsif (ref($arg) eq "GLOB") { $arg = '$fh' } + else { $arg = qq{'$arg'} } + } + + return @_; +} + +sub _trim_package_name { + # Info: The following is done since 05/2008 (which is before v1.10) + + # TODO: This is probably a good idea for CORE, is it + # a good idea for other subs? + + # Trim package name off dying sub for error messages + (my $name = $_[1]) =~ s/.*:://; + return $name; +} + +# Returns the parameter formatted as octal number +sub _octalize_number { + my $number = $_[1]; + + # Only reformat if it looks like a whole number + if ($number =~ /^\d+$/) { + $number = sprintf("%#04lo", $number); + } + + return $number; +} + +# TODO: Our tests only check LOCK_EX | LOCK_NB is properly +# formatted. Try other combinations and ensure they work +# correctly. + +sub _format_flock { + my ($this) = @_; + + require Fcntl; + + my $filehandle = $this->args->[0]; + my $raw_mode = $this->args->[1]; + + my $mode_type; + my $lock_unlock; + + if ($raw_mode & Fcntl::LOCK_EX() ) { + $lock_unlock = "lock"; + $mode_type = "for exclusive access"; + } + elsif ($raw_mode & Fcntl::LOCK_SH() ) { + $lock_unlock = "lock"; + $mode_type = "for shared access"; + } + elsif ($raw_mode & Fcntl::LOCK_UN() ) { + $lock_unlock = "unlock"; + $mode_type = ""; + } + else { + # I've got no idea what they're trying to do. + $lock_unlock = "lock"; + $mode_type = "with mode $raw_mode"; + } + + my $cooked_filehandle; + + if ($filehandle and not ref $filehandle) { + + # A package filehandle with a name! + + $cooked_filehandle = " $filehandle"; + } + else { + # Otherwise we have a scalar filehandle. + + $cooked_filehandle = ''; + + } + + local $! = $this->errno; + + return "Can't $lock_unlock filehandle$cooked_filehandle $mode_type: $!"; + +} + +# Default formatter for CORE::chmod +sub _format_chmod { + my ($this) = @_; + my @args = @{$this->args}; + + my $mode = shift @args; + local $! = $this->errno; + + $mode = $this->_octalize_number($mode); + + @args = $this->_beautify_arguments(@args); + + return "Can't chmod($mode, ". join(q{, }, @args) ."): $!"; +} + +# Default formatter for CORE::mkdir +sub _format_mkdir { + my ($this) = @_; + my @args = @{$this->args}; + + # If no mask is specified use default formatter + if (@args < 2) { + return $this->format_default; + } + + my $file = $args[0]; + my $mask = $args[1]; + local $! = $this->errno; + + $mask = $this->_octalize_number($mask); + + return "Can't mkdir('$file', $mask): '$!'"; +} + +# Default formatter for CORE::dbmopen +sub _format_dbmopen { + my ($this) = @_; + my @args = @{$this->args}; + + # TODO: Presently, $args flattens out the (usually empty) hash + # which is passed as the first argument to dbmopen. This is + # a bug in our args handling code (taking a reference to it would + # be better), but for the moment we'll just examine the end of + # our arguments list for message formatting. + + my $mode = $args[-1]; + my $file = $args[-2]; + + $mode = $this->_octalize_number($mode); + + local $! = $this->errno; + + return "Can't dbmopen(%hash, '$file', $mode): '$!'"; +} + +# Default formatter for CORE::close + +sub _format_close { + my ($this) = @_; + my $close_arg = $this->args->[0]; + + local $! = $this->errno; + + # If we've got an old-style filehandle, mention it. + if ($close_arg and not ref $close_arg) { + return "Can't close filehandle '$close_arg': '$!'"; + } + + # TODO - This will probably produce an ugly error. Test and fix. + return "Can't close($close_arg) filehandle: '$!'"; + +} + +# Default formatter for CORE::read, CORE::sysread and CORE::syswrite +# +# Similar to default formatter with the buffer filtered out as it +# may contain binary data. +sub _format_readwrite { + my ($this) = @_; + my $call = $this->_trim_package_name($this->function); + local $! = $this->errno; + + # These subs receive the following arguments (in order): + # + # * FILEHANDLE + # * SCALAR (buffer, we do not want to write this) + # * LENGTH (optional for syswrite) + # * OFFSET (optional for all) + my (@args) = @{$this->args}; + my $arg_name = $args[1]; + if (defined($arg_name)) { + if (ref($arg_name)) { + my $name = blessed($arg_name) || ref($arg_name); + $arg_name = "<${name}>"; + } else { + $arg_name = ''; + } + } else { + $arg_name = ''; + } + $args[1] = $arg_name; + + return "Can't $call(" . join(q{, }, @args) . "): $!"; +} + +# Default formatter for CORE::open + +use constant _FORMAT_OPEN => "Can't open '%s' for %s: '%s'"; + +sub _format_open_with_mode { + my ($this, $mode, $file, $error) = @_; + + my $wordy_mode; + + if ($mode eq '<') { $wordy_mode = 'reading'; } + elsif ($mode eq '>') { $wordy_mode = 'writing'; } + elsif ($mode eq '>>') { $wordy_mode = 'appending'; } + + $file = '' if not defined $file; + + return sprintf _FORMAT_OPEN, $file, $wordy_mode, $error if $wordy_mode; + + Carp::confess("Internal autodie::exception error: Don't know how to format mode '$mode'."); + +} + +sub _format_open { + my ($this) = @_; + + my @open_args = @{$this->args}; + + # Use the default formatter for single-arg and many-arg open + if (@open_args <= 1 or @open_args >= 4) { + return $this->format_default; + } + + # For two arg open, we have to extract the mode + if (@open_args == 2) { + my ($fh, $file) = @open_args; + + if (ref($fh) eq "GLOB") { + $fh = '$fh'; + } + + my ($mode) = $file =~ m{ + ^\s* # Spaces before mode + ( + (?> # Non-backtracking subexp. + < # Reading + |>>? # Writing/appending + ) + ) + [^&] # Not an ampersand (which means a dup) + }x; + + if (not $mode) { + # Maybe it's a 2-arg open without any mode at all? + # Detect the most simple case for this, where our + # file consists only of word characters. + + if ( $file =~ m{^\s*\w+\s*$} ) { + $mode = '<' + } + else { + # Otherwise, we've got no idea what's going on. + # Use the default. + return $this->format_default; + } + } + + # Localising $! means perl makes it a pretty error for us. + local $! = $this->errno; + + return $this->_format_open_with_mode($mode, $file, $!); + } + + # Here we must be using three arg open. + + my $file = $open_args[2]; + + local $! = $this->errno; + + my $mode = $open_args[1]; + + local $@; + + my $msg = eval { $this->_format_open_with_mode($mode, $file, $!); }; + + return $msg if $msg; + + # Default message (for pipes and odd things) + + return "Can't open '$file' with mode '$open_args[1]': '$!'"; +} + + +sub register { + my ($class, $symbol, $handler) = @_; + + croak "Incorrect call to autodie::register" if @_ != 3; + + $formatter_of{$symbol} = $handler; + +} + + +# Simply produces the file and line number; intended to be added +# to the end of error messages. + +sub add_file_and_line { + my ($this) = @_; + + return sprintf(" at %s line %d\n", $this->file, $this->line); +} + + +sub stringify { + my ($this) = @_; + + my $call = $this->function; + my $msg; + + if ($DEBUG) { + my $dying_pkg = $this->package; + my $sub = $this->function; + my $caller = $this->caller; + warn "Stringifing exception for $dying_pkg :: $sub / $caller / $call\n"; + } + + # TODO - This isn't using inheritance. Should it? + if ( my $sub = $formatter_of{$call} ) { + $msg = $sub->($this) . $this->add_file_and_line; + } else { + $msg = $this->format_default . $this->add_file_and_line; + } + $msg .= $this->{$PACKAGE}{_stack_trace} + if $Carp::Verbose; + + return $msg; +} + + +# TODO: This produces ugly errors. Is there any way we can +# dig around to find the actual variable names? I know perl 5.10 +# does some dark and terrible magicks to find them for undef warnings. + +sub format_default { + my ($this) = @_; + + my $call = $this->_trim_package_name($this->function); + + local $! = $this->errno; + + my @args = @{ $this->args() }; + @args = $this->_beautify_arguments(@args); + + # Format our beautiful error. + + return "Can't $call(". join(q{, }, @args) . "): $!" ; + + # TODO - Handle user-defined errors from hash. + + # TODO - Handle default error messages. + +} + + +sub new { + my ($class, @args) = @_; + + my $this = {}; + + bless($this,$class); + + # I'd love to use EVERY here, but it causes our code to die + # because it wants to stringify our objects before they're + # initialised, causing everything to explode. + + $this->_init(@args); + + return $this; +} + +sub _init { + + my ($this, %args) = @_; + + # Capturing errno here is not necessarily reliable. + my $original_errno = $!; + + our $init_called = 1; + + my $class = ref $this; + + # We're going to walk up our call stack, looking for the + # first thing that doesn't look like our exception + # code, autodie/Fatal, or some whacky eval. + + my ($package, $file, $line, $sub); + + my $depth = 0; + + while (1) { + $depth++; + + ($package, $file, $line, $sub) = CORE::caller($depth); + + # Skip up the call stack until we find something outside + # of the Fatal/autodie/eval space. + + next if $package->isa('Fatal'); + next if $package->isa($class); + next if $package->isa(__PACKAGE__); + + # Anything with the 'autodie::skip' role wants us to skip it. + # https://github.com/pjf/autodie/issues/15 + + next if ($package->can('DOES') and $package->DOES('autodie::skip')); + + next if $file =~ /^\(eval\s\d+\)$/; + + last; + + } + + # We now have everything correct, *except* for our subroutine + # name. If it's __ANON__ or (eval), then we need to keep on + # digging deeper into our stack to find the real name. However we + # don't update our other information, since that will be correct + # for our current exception. + + my $first_guess_subroutine = $sub; + + while (defined $sub and $sub =~ /^\(eval\)$|::__ANON__$/) { + $depth++; + + $sub = (CORE::caller($depth))[3]; + } + + # If we end up falling out the bottom of our stack, then our + # __ANON__ guess is the best we can get. This includes situations + # where we were called from the top level of a program. + + if (not defined $sub) { + $sub = $first_guess_subroutine; + } + + $this->{$PACKAGE}{package} = $package; + $this->{$PACKAGE}{file} = $file; + $this->{$PACKAGE}{line} = $line; + $this->{$PACKAGE}{caller} = $sub; + + # Tranks to %Carp::CarpInternal all Fatal, autodie and + # autodie::exception stack frames are filtered already, but our + # nameless wrapper is still present, so strip that. + + my $trace = Carp::longmess(); + $trace =~ s/^\s*at \(eval[^\n]+\n//; + + # And if we see an __ANON__, then we'll replace that with the actual + # name of our autodying function. + + my $short_func = $args{function}; + $short_func =~ s/^CORE:://; + $trace =~ s/(\s*[\w:]+)__ANON__/$1$short_func/; + + # And now we just fill in all our attributes. + + $this->{$PACKAGE}{_stack_trace} = $trace; + + $this->{$PACKAGE}{errno} = $args{errno} || 0; + + $this->{$PACKAGE}{context} = $args{context}; + $this->{$PACKAGE}{return} = $args{return}; + $this->{$PACKAGE}{eval_error} = $args{eval_error}; + + $this->{$PACKAGE}{args} = $args{args} || []; + $this->{$PACKAGE}{function}= $args{function} or + croak("$class->new() called without function arg"); + + return $this; + +} + +1; + +__END__ + +package autodie::exception::system; +use 5.008; +use strict; +use warnings; +use parent 'autodie::exception'; +use Carp qw(croak); + +our $VERSION = '2.29'; # VERSION: Generated by DZP::OurPkg:Version + +# ABSTRACT: Exceptions from autodying system(). + +my $PACKAGE = __PACKAGE__; + + +sub _init { + my ($this, %args) = @_; + + $this->{$PACKAGE}{message} = $args{message} + || croak "'message' arg not supplied to autodie::exception::system->new"; + + return $this->SUPER::_init(%args); + +} + + +sub stringify { + + my ($this) = @_; + + return $this->{$PACKAGE}{message} . $this->add_file_and_line; + +} + +1; + +__END__ + +package autodie::Scope::Guard; + +use strict; +use warnings; + +# ABSTRACT: Wrapper class for calling subs at end of scope +our $VERSION = '2.29'; # VERSION + +# This code schedules the cleanup of subroutines at the end of +# scope. It's directly inspired by chocolateboy's excellent +# Scope::Guard module. + +sub new { + my ($class, $handler) = @_; + return bless($handler, $class); +} + +sub DESTROY { + my ($self) = @_; + + $self->(); +} + +1; + +__END__ + +package autodie::Scope::GuardStack; + +use strict; +use warnings; + +use autodie::Scope::Guard; + +# ABSTRACT: Hook stack for managing scopes via %^H +our $VERSION = '2.29'; # VERSION + +my $H_KEY_STEM = __PACKAGE__ . '/guard'; +my $COUNTER = 0; + +# This code schedules the cleanup of subroutines at the end of +# scope. It's directly inspired by chocolateboy's excellent +# Scope::Guard module. + +sub new { + my ($class) = @_; + + return bless([], $class); +} + +sub push_hook { + my ($self, $hook) = @_; + my $h_key = $H_KEY_STEM . ($COUNTER++); + my $size = @{$self}; + $^H{$h_key} = autodie::Scope::Guard->new(sub { + # Pop the stack until we reach the right size + # - this may seem weird, but it is to avoid relying + # on "destruction order" of keys in %^H. + # + # Example: + # { + # use autodie; # hook 1 + # no autodie; # hook 2 + # use autodie; # hook 3 + # } + # + # Here we want call hook 3, then hook 2 and finally hook 1. + # Any other order could have undesired consequences. + # + # Suppose hook 2 is destroyed first, it will pop hook 3 and + # then hook 2. hook 3 will then be destroyed, but do nothing + # since its "frame" was already popped and finally hook 1 + # will be popped and take its own frame with it. + # + # We need to check that $self still exists since things can get weird + # during global destruction. + $self->_pop_hook while $self && @{$self} > $size; + }); + push(@{$self}, [$hook, $h_key]); + return; +} + +sub _pop_hook { + my ($self) = @_; + my ($hook, $key) = @{ pop(@{$self}) }; + my $ref = delete($^H{$key}); + $hook->(); + return; +} + +sub DESTROY { + my ($self) = @_; + + # To be honest, I suspect @{$self} will always be empty here due + # to the subs in %^H having references to the stack (which would + # keep the stack alive until those have been destroyed). Anyhow, + # it never hurt to be careful. + $self->_pop_hook while @{$self}; + return; +} + +1; + +__END__ + +package Tie::Array; + +use 5.006_001; +use strict; +use Carp; +our $VERSION = '1.07'; + +# Pod documentation after __END__ below. + +sub DESTROY { } +sub EXTEND { } +sub UNSHIFT { scalar shift->SPLICE(0,0,@_) } +sub SHIFT { shift->SPLICE(0,1) } +sub CLEAR { shift->STORESIZE(0) } + +sub PUSH +{ + my $obj = shift; + my $i = $obj->FETCHSIZE; + $obj->STORE($i++, shift) while (@_); +} + +sub POP +{ + my $obj = shift; + my $newsize = $obj->FETCHSIZE - 1; + my $val; + if ($newsize >= 0) + { + $val = $obj->FETCH($newsize); + $obj->STORESIZE($newsize); + } + $val; +} + +sub SPLICE { + my $obj = shift; + my $sz = $obj->FETCHSIZE; + my $off = (@_) ? shift : 0; + $off += $sz if ($off < 0); + my $len = (@_) ? shift : $sz - $off; + $len += $sz - $off if $len < 0; + my @result; + for (my $i = 0; $i < $len; $i++) { + push(@result,$obj->FETCH($off+$i)); + } + $off = $sz if $off > $sz; + $len -= $off + $len - $sz if $off + $len > $sz; + if (@_ > $len) { + # Move items up to make room + my $d = @_ - $len; + my $e = $off+$len; + $obj->EXTEND($sz+$d); + for (my $i=$sz-1; $i >= $e; $i--) { + my $val = $obj->FETCH($i); + $obj->STORE($i+$d,$val); + } + } + elsif (@_ < $len) { + # Move items down to close the gap + my $d = $len - @_; + my $e = $off+$len; + for (my $i=$off+$len; $i < $sz; $i++) { + my $val = $obj->FETCH($i); + $obj->STORE($i-$d,$val); + } + $obj->STORESIZE($sz-$d); + } + for (my $i=0; $i < @_; $i++) { + $obj->STORE($off+$i,$_[$i]); + } + return wantarray ? @result : pop @result; +} + +sub EXISTS { + my $pkg = ref $_[0]; + croak "$pkg doesn't define an EXISTS method"; +} + +sub DELETE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a DELETE method"; +} + +package Tie::StdArray; +our @ISA = 'Tie::Array'; + +sub TIEARRAY { bless [], $_[0] } +sub FETCHSIZE { scalar @{$_[0]} } +sub STORESIZE { $#{$_[0]} = $_[1]-1 } +sub STORE { $_[0]->[$_[1]] = $_[2] } +sub FETCH { $_[0]->[$_[1]] } +sub CLEAR { @{$_[0]} = () } +sub POP { pop(@{$_[0]}) } +sub PUSH { my $o = shift; push(@$o,@_) } +sub SHIFT { shift(@{$_[0]}) } +sub UNSHIFT { my $o = shift; unshift(@$o,@_) } +sub EXISTS { exists $_[0]->[$_[1]] } +sub DELETE { delete $_[0]->[$_[1]] } + +sub SPLICE +{ + my $ob = shift; + my $sz = $ob->FETCHSIZE; + my $off = @_ ? shift : 0; + $off += $sz if $off < 0; + my $len = @_ ? shift : $sz-$off; + return splice(@$ob,$off,$len,@_); +} + +1; + +__END__ + +package Tie::SubstrHash; + +our $VERSION = '1.00'; + + +use Carp; + +sub TIEHASH { + my $pack = shift; + my ($klen, $vlen, $tsize) = @_; + my $rlen = 1 + $klen + $vlen; + $tsize = [$tsize, + findgteprime($tsize * 1.1)]; # Allow 10% empty. + local $self = bless ["\0", $klen, $vlen, $tsize, $rlen, 0, -1]; + $$self[0] x= $rlen * $tsize->[1]; + $self; +} + +sub CLEAR { + local($self) = @_; + $$self[0] = "\0" x ($$self[4] * $$self[3]->[1]); + $$self[5] = 0; + $$self[6] = -1; +} + +sub FETCH { + local($self,$key) = @_; + local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; + &hashkey; + for (;;) { + $offset = $hash * $rlen; + $record = substr($$self[0], $offset, $rlen); + if (ord($record) == 0) { + return undef; + } + elsif (ord($record) == 1) { + } + elsif (substr($record, 1, $klen) eq $key) { + return substr($record, 1+$klen, $vlen); + } + &rehash; + } +} + +sub STORE { + local($self,$key,$val) = @_; + local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; + croak("Table is full ($tsize->[0] elements)") if $$self[5] > $tsize->[0]; + croak(qq/Value "$val" is not $vlen characters long/) + if length($val) != $vlen; + my $writeoffset; + + &hashkey; + for (;;) { + $offset = $hash * $rlen; + $record = substr($$self[0], $offset, $rlen); + if (ord($record) == 0) { + $record = "\2". $key . $val; + die "panic" unless length($record) == $rlen; + $writeoffset = $offset unless defined $writeoffset; + substr($$self[0], $writeoffset, $rlen) = $record; + ++$$self[5]; + return; + } + elsif (ord($record) == 1) { + $writeoffset = $offset unless defined $writeoffset; + } + elsif (substr($record, 1, $klen) eq $key) { + $record = "\2". $key . $val; + die "panic" unless length($record) == $rlen; + substr($$self[0], $offset, $rlen) = $record; + return; + } + &rehash; + } +} + +sub DELETE { + local($self,$key) = @_; + local($klen, $vlen, $tsize, $rlen) = @$self[1..4]; + &hashkey; + for (;;) { + $offset = $hash * $rlen; + $record = substr($$self[0], $offset, $rlen); + if (ord($record) == 0) { + return undef; + } + elsif (ord($record) == 1) { + } + elsif (substr($record, 1, $klen) eq $key) { + substr($$self[0], $offset, 1) = "\1"; + return substr($record, 1+$klen, $vlen); + --$$self[5]; + } + &rehash; + } +} + +sub FIRSTKEY { + local($self) = @_; + $$self[6] = -1; + &NEXTKEY; +} + +sub NEXTKEY { + local($self) = @_; + local($klen, $vlen, $tsize, $rlen, $entries, $iterix) = @$self[1..6]; + for (++$iterix; $iterix < $tsize->[1]; ++$iterix) { + next unless substr($$self[0], $iterix * $rlen, 1) eq "\2"; + $$self[6] = $iterix; + return substr($$self[0], $iterix * $rlen + 1, $klen); + } + $$self[6] = -1; + undef; +} + +sub EXISTS { + croak "Tie::SubstrHash does not support exists()"; +} + +sub hashkey { + croak(qq/Key "$key" is not $klen characters long/) + if length($key) != $klen; + $hash = 2; + for (unpack('C*', $key)) { + $hash = $hash * 33 + $_; + &_hashwrap if $hash >= 1e13; + } + &_hashwrap if $hash >= $tsize->[1]; + $hash = 1 unless $hash; + $hashbase = $hash; +} + +sub _hashwrap { + $hash -= int($hash / $tsize->[1]) * $tsize->[1]; +} + +sub rehash { + $hash += $hashbase; + $hash -= $tsize->[1] if $hash >= $tsize->[1]; +} + +# using POSIX::ceil() would be too heavy, and not all platforms have it. +sub ceil { + my $num = shift; + $num = int($num + 1) unless $num == int $num; + return $num; +} + +# See: +# +# http://www-groups.dcs.st-andrews.ac.uk/~history/HistTopics/Prime_numbers.html +# + +sub findgteprime { # find the smallest prime integer greater than or equal to + use integer; + + my $num = ceil(shift); + return 2 if $num <= 2; + + $num++ unless $num % 2; + my $i; + my $sqrtnum = int sqrt $num; + my $sqrtnumsquared = $sqrtnum * $sqrtnum; + + NUM: + for (;; $num += 2) { + if ($sqrtnumsquared < $num) { + $sqrtnum++; + $sqrtnumsquared = $sqrtnum * $sqrtnum; + } + for ($i = 3; $i <= $sqrtnum; $i += 2) { + next NUM unless $num % $i; + } + return $num; + } +} + +1; +package Tie::StdHandle; + +use strict; + +use Tie::Handle; +our @ISA = 'Tie::Handle'; +our $VERSION = '4.5'; + + +sub TIEHANDLE +{ + my $class = shift; + my $fh = \do { local *HANDLE}; + bless $fh,$class; + $fh->OPEN(@_) if (@_); + return $fh; +} + +sub EOF { eof($_[0]) } +sub TELL { tell($_[0]) } +sub FILENO { fileno($_[0]) } +sub SEEK { seek($_[0],$_[1],$_[2]) } +sub CLOSE { close($_[0]) } +sub BINMODE { binmode($_[0]) } + +sub OPEN +{ + $_[0]->CLOSE if defined($_[0]->FILENO); + @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]); +} + +sub READ { &CORE::read(shift, \shift, @_) } +sub READLINE { my $fh = $_[0]; <$fh> } +sub GETC { getc($_[0]) } + +sub WRITE +{ + my $fh = $_[0]; + local $\; # don't print any line terminator + print $fh substr($_[1], $_[3], $_[2]); +} + + +1; +use strict; +package Tie::Memoize; +use Tie::Hash; +our @ISA = 'Tie::ExtraHash'; +our $VERSION = '1.1'; + +our $exists_token = \undef; + +sub croak {require Carp; goto &Carp::croak} + +# Format: [0: STORAGE, 1: EXISTS-CACHE, 2: FETCH_function; +# 3: EXISTS_function, 4: DATA, 5: EXISTS_different ] + +sub FETCH { + my ($h,$key) = ($_[0][0], $_[1]); + my $res = $h->{$key}; + return $res if defined $res; # Shortcut if accessible + return $res if exists $h->{$key}; # Accessible, but undef + my $cache = $_[0][1]{$key}; + return if defined $cache and not $cache; # Known to not exist + my @res = $_[0][2]->($key, $_[0][4]); # Autoload + $_[0][1]{$key} = 0, return unless @res; # Cache non-existence + delete $_[0][1]{$key}; # Clear existence cache, not needed any more + $_[0][0]{$key} = $res[0]; # Store data and return +} + +sub EXISTS { + my ($a,$key) = (shift, shift); + return 1 if exists $a->[0]{$key}; # Have data + my $cache = $a->[1]{$key}; + return $cache if defined $cache; # Existence cache + my @res = $a->[3]($key,$a->[4]); + $a->[1]{$key} = 0, return unless @res; # Cache non-existence + # Now we know it exists + return ($a->[1]{$key} = 1) if $a->[5]; # Only existence reported + # Now know the value + $a->[0]{$key} = $res[0]; # Store data + return 1 +} + +sub TIEHASH { + croak 'syntax: tie %hash, \'Tie::AutoLoad\', \&fetch_subr' if @_ < 2; + croak 'syntax: tie %hash, \'Tie::AutoLoad\', \&fetch_subr, $data, \&exists_subr, \%data_cache, \%existence_cache' if @_ > 6; + push @_, undef if @_ < 3; # Data + push @_, $_[1] if @_ < 4; # exists + push @_, {} while @_ < 6; # initial value and caches + bless [ @_[4,5,1,3,2], $_[1] ne $_[3]], $_[0] +} + +1; + + + +package Tie::File; +require 5.005; +use Carp ':DEFAULT', 'confess'; +use POSIX 'SEEK_SET'; +use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY'; +sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY } + + +$VERSION = "1.02"; +my $DEFAULT_MEMORY_SIZE = 1<<21; # 2 megabytes +my $DEFAULT_AUTODEFER_THRESHHOLD = 3; # 3 records +my $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD = 65536; # 16 disk blocksful + +my %good_opt = map {$_ => 1, "-$_" => 1} + qw(memory dw_size mode recsep discipline + autodefer autochomp autodefer_threshhold concurrent); + +sub TIEARRAY { + if (@_ % 2 != 0) { + croak "usage: tie \@array, $_[0], filename, [option => value]..."; + } + my ($pack, $file, %opts) = @_; + + # transform '-foo' keys into 'foo' keys + for my $key (keys %opts) { + unless ($good_opt{$key}) { + croak("$pack: Unrecognized option '$key'\n"); + } + my $okey = $key; + if ($key =~ s/^-+//) { + $opts{$key} = delete $opts{$okey}; + } + } + + if ($opts{concurrent}) { + croak("$pack: concurrent access not supported yet\n"); + } + + unless (defined $opts{memory}) { + # default is the larger of the default cache size and the + # deferred-write buffer size (if specified) + $opts{memory} = $DEFAULT_MEMORY_SIZE; + $opts{memory} = $opts{dw_size} + if defined $opts{dw_size} && $opts{dw_size} > $DEFAULT_MEMORY_SIZE; + # Dora Winifred Read + } + $opts{dw_size} = $opts{memory} unless defined $opts{dw_size}; + if ($opts{dw_size} > $opts{memory}) { + croak("$pack: dw_size may not be larger than total memory allocation\n"); + } + # are we in deferred-write mode? + $opts{defer} = 0 unless defined $opts{defer}; + $opts{deferred} = {}; # no records are presently deferred + $opts{deferred_s} = 0; # count of total bytes in ->{deferred} + $opts{deferred_max} = -1; # empty + + # What's a good way to arrange that this class can be overridden? + $opts{cache} = Tie::File::Cache->new($opts{memory}); + + # autodeferment is enabled by default + $opts{autodefer} = 1 unless defined $opts{autodefer}; + $opts{autodeferring} = 0; # but is not initially active + $opts{ad_history} = []; + $opts{autodefer_threshhold} = $DEFAULT_AUTODEFER_THRESHHOLD + unless defined $opts{autodefer_threshhold}; + $opts{autodefer_filelen_threshhold} = $DEFAULT_AUTODEFER_FILELEN_THRESHHOLD + unless defined $opts{autodefer_filelen_threshhold}; + + $opts{offsets} = [0]; + $opts{filename} = $file; + unless (defined $opts{recsep}) { + $opts{recsep} = _default_recsep(); + } + $opts{recseplen} = length($opts{recsep}); + if ($opts{recseplen} == 0) { + croak "Empty record separator not supported by $pack"; + } + + $opts{autochomp} = 1 unless defined $opts{autochomp}; + + $opts{mode} = O_CREAT|O_RDWR unless defined $opts{mode}; + $opts{rdonly} = (($opts{mode} & O_ACCMODE) == O_RDONLY); + $opts{sawlastrec} = undef; + + my $fh; + + if (UNIVERSAL::isa($file, 'GLOB')) { + # We use 1 here on the theory that some systems + # may not indicate failure if we use 0. + # MSWin32 does not indicate failure with 0, but I don't know if + # it will indicate failure with 1 or not. + unless (seek $file, 1, SEEK_SET) { + croak "$pack: your filehandle does not appear to be seekable"; + } + seek $file, 0, SEEK_SET; # put it back + $fh = $file; # setting binmode is the user's problem + } elsif (ref $file) { + croak "usage: tie \@array, $pack, filename, [option => value]..."; + } else { + # $fh = \do { local *FH }; # XXX this is buggy + if ($] < 5.006) { + # perl 5.005 and earlier don't autovivify filehandles + require Symbol; + $fh = Symbol::gensym(); + } + sysopen $fh, $file, $opts{mode}, 0666 or return; + binmode $fh; + ++$opts{ourfh}; + } + { my $ofh = select $fh; $| = 1; select $ofh } # autoflush on write + if (defined $opts{discipline} && $] >= 5.006) { + # This avoids a compile-time warning under 5.005 + eval 'binmode($fh, $opts{discipline})'; + croak $@ if $@ =~ /unknown discipline/i; + die if $@; + } + $opts{fh} = $fh; + + bless \%opts => $pack; +} + +sub FETCH { + my ($self, $n) = @_; + my $rec; + + # check the defer buffer + $rec = $self->{deferred}{$n} if exists $self->{deferred}{$n}; + $rec = $self->_fetch($n) unless defined $rec; + + # inlined _chomp1 + substr($rec, - $self->{recseplen}) = "" + if defined $rec && $self->{autochomp}; + $rec; +} + +# Chomp many records in-place; return nothing useful +sub _chomp { + my $self = shift; + return unless $self->{autochomp}; + if ($self->{autochomp}) { + for (@_) { + next unless defined; + substr($_, - $self->{recseplen}) = ""; + } + } +} + +# Chomp one record in-place; return modified record +sub _chomp1 { + my ($self, $rec) = @_; + return $rec unless $self->{autochomp}; + return unless defined $rec; + substr($rec, - $self->{recseplen}) = ""; + $rec; +} + +sub _fetch { + my ($self, $n) = @_; + + # check the record cache + { my $cached = $self->{cache}->lookup($n); + return $cached if defined $cached; + } + + if ($#{$self->{offsets}} < $n) { + return if $self->{eof}; # request for record beyond end of file + my $o = $self->_fill_offsets_to($n); + # If it's still undefined, there is no such record, so return 'undef' + return unless defined $o; + } + + my $fh = $self->{FH}; + $self->_seek($n); # we can do this now that offsets is populated + my $rec = $self->_read_record; + +# If we happen to have just read the first record, check to see if +# the length of the record matches what 'tell' says. If not, Tie::File +# won't work, and should drop dead. +# +# if ($n == 0 && defined($rec) && tell($self->{fh}) != length($rec)) { +# if (defined $self->{discipline}) { +# croak "I/O discipline $self->{discipline} not supported"; +# } else { +# croak "File encoding not supported"; +# } +# } + + $self->{cache}->insert($n, $rec) if defined $rec && not $self->{flushing}; + $rec; +} + +sub STORE { + my ($self, $n, $rec) = @_; + die "STORE called from _check_integrity!" if $DIAGNOSTIC; + + $self->_fixrecs($rec); + + if ($self->{autodefer}) { + $self->_annotate_ad_history($n); + } + + return $self->_store_deferred($n, $rec) if $self->_is_deferring; + + + # We need this to decide whether the new record will fit + # It incidentally populates the offsets table + # Note we have to do this before we alter the cache + # 20020324 Wait, but this DOES alter the cache. TODO BUG? + my $oldrec = $self->_fetch($n); + + if (not defined $oldrec) { + # We're storing a record beyond the end of the file + $self->_extend_file_to($n+1); + $oldrec = $self->{recsep}; + } +# return if $oldrec eq $rec; # don't bother + my $len_diff = length($rec) - length($oldrec); + + # length($oldrec) here is not consistent with text mode TODO XXX BUG + $self->_mtwrite($rec, $self->{offsets}[$n], length($oldrec)); + $self->_oadjust([$n, 1, $rec]); + $self->{cache}->update($n, $rec); +} + +sub _store_deferred { + my ($self, $n, $rec) = @_; + $self->{cache}->remove($n); + my $old_deferred = $self->{deferred}{$n}; + + if (defined $self->{deferred_max} && $n > $self->{deferred_max}) { + $self->{deferred_max} = $n; + } + $self->{deferred}{$n} = $rec; + + my $len_diff = length($rec); + $len_diff -= length($old_deferred) if defined $old_deferred; + $self->{deferred_s} += $len_diff; + $self->{cache}->adj_limit(-$len_diff); + if ($self->{deferred_s} > $self->{dw_size}) { + $self->_flush; + } elsif ($self->_cache_too_full) { + $self->_cache_flush; + } +} + +# Remove a single record from the deferred-write buffer without writing it +# The record need not be present +sub _delete_deferred { + my ($self, $n) = @_; + my $rec = delete $self->{deferred}{$n}; + return unless defined $rec; + + if (defined $self->{deferred_max} + && $n == $self->{deferred_max}) { + undef $self->{deferred_max}; + } + + $self->{deferred_s} -= length $rec; + $self->{cache}->adj_limit(length $rec); +} + +sub FETCHSIZE { + my $self = shift; + my $n = $self->{eof} ? $#{$self->{offsets}} : $self->_fill_offsets; + + my $top_deferred = $self->_defer_max; + $n = $top_deferred+1 if defined $top_deferred && $n < $top_deferred+1; + $n; +} + +sub STORESIZE { + my ($self, $len) = @_; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('STORESIZE'); + } + + my $olen = $self->FETCHSIZE; + return if $len == $olen; # Woo-hoo! + + # file gets longer + if ($len > $olen) { + if ($self->_is_deferring) { + for ($olen .. $len-1) { + $self->_store_deferred($_, $self->{recsep}); + } + } else { + $self->_extend_file_to($len); + } + return; + } + + # file gets shorter + if ($self->_is_deferring) { + # TODO maybe replace this with map-plus-assignment? + for (grep $_ >= $len, keys %{$self->{deferred}}) { + $self->_delete_deferred($_); + } + $self->{deferred_max} = $len-1; + } + + $self->_seek($len); + $self->_chop_file; + $#{$self->{offsets}} = $len; +# $self->{offsets}[0] = 0; # in case we just chopped this + + $self->{cache}->remove(grep $_ >= $len, $self->{cache}->ckeys); +} + +### OPTIMIZE ME +### It should not be necessary to do FETCHSIZE +### Just seek to the end of the file. +sub PUSH { + my $self = shift; + $self->SPLICE($self->FETCHSIZE, scalar(@_), @_); + + # No need to return: + # $self->FETCHSIZE; # because av.c takes care of this for me +} + +sub POP { + my $self = shift; + my $size = $self->FETCHSIZE; + return if $size == 0; +# print STDERR "# POPPITY POP POP POP\n"; + scalar $self->SPLICE($size-1, 1); +} + +sub SHIFT { + my $self = shift; + scalar $self->SPLICE(0, 1); +} + +sub UNSHIFT { + my $self = shift; + $self->SPLICE(0, 0, @_); + # $self->FETCHSIZE; # av.c takes care of this for me +} + +sub CLEAR { + my $self = shift; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('CLEAR'); + } + + $self->_seekb(0); + $self->_chop_file; + $self->{cache}->set_limit($self->{memory}); + $self->{cache}->empty; + @{$self->{offsets}} = (0); + %{$self->{deferred}}= (); + $self->{deferred_s} = 0; + $self->{deferred_max} = -1; +} + +sub EXTEND { + my ($self, $n) = @_; + + # No need to pre-extend anything in this case + return if $self->_is_deferring; + + $self->_fill_offsets_to($n); + $self->_extend_file_to($n); +} + +sub DELETE { + my ($self, $n) = @_; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('DELETE'); + } + + my $lastrec = $self->FETCHSIZE-1; + my $rec = $self->FETCH($n); + $self->_delete_deferred($n) if $self->_is_deferring; + if ($n == $lastrec) { + $self->_seek($n); + $self->_chop_file; + $#{$self->{offsets}}--; + $self->{cache}->remove($n); + # perhaps in this case I should also remove trailing null records? + # 20020316 + # Note that delete @a[-3..-1] deletes the records in the wrong order, + # so we only chop the very last one out of the file. We could repair this + # by tracking deleted records inside the object. + } elsif ($n < $lastrec) { + $self->STORE($n, ""); + } + $rec; +} + +sub EXISTS { + my ($self, $n) = @_; + return 1 if exists $self->{deferred}{$n}; + $n < $self->FETCHSIZE; +} + +sub SPLICE { + my $self = shift; + + if ($self->{autodefer}) { + $self->_annotate_ad_history('SPLICE'); + } + + $self->_flush if $self->_is_deferring; # move this up? + if (wantarray) { + $self->_chomp(my @a = $self->_splice(@_)); + @a; + } else { + $self->_chomp1(scalar $self->_splice(@_)); + } +} + +sub DESTROY { + my $self = shift; + $self->flush if $self->_is_deferring; + $self->{cache}->delink if defined $self->{cache}; # break circular link + if ($self->{fh} and $self->{ourfh}) { + delete $self->{ourfh}; + close delete $self->{fh}; + } +} + +sub _splice { + my ($self, $pos, $nrecs, @data) = @_; + my @result; + + $pos = 0 unless defined $pos; + + # Deal with negative and other out-of-range positions + # Also set default for $nrecs + { + my $oldsize = $self->FETCHSIZE; + $nrecs = $oldsize unless defined $nrecs; + my $oldpos = $pos; + + if ($pos < 0) { + $pos += $oldsize; + if ($pos < 0) { + croak "Modification of non-creatable array value attempted, " . + "subscript $oldpos"; + } + } + + if ($pos > $oldsize) { + return unless @data; + $pos = $oldsize; # This is what perl does for normal arrays + } + + # The manual is very unclear here + if ($nrecs < 0) { + $nrecs = $oldsize - $pos + $nrecs; + $nrecs = 0 if $nrecs < 0; + } + + # nrecs is too big---it really means "until the end" + # 20030507 + if ($nrecs + $pos > $oldsize) { + $nrecs = $oldsize - $pos; + } + } + + $self->_fixrecs(@data); + my $data = join '', @data; + my $datalen = length $data; + my $oldlen = 0; + + # compute length of data being removed + for ($pos .. $pos+$nrecs-1) { + last unless defined $self->_fill_offsets_to($_); + my $rec = $self->_fetch($_); + last unless defined $rec; + push @result, $rec; + + # Why don't we just use length($rec) here? + # Because that record might have come from the cache. _splice + # might have been called to flush out the deferred-write records, + # and in this case length($rec) is the length of the record to be + # *written*, not the length of the actual record in the file. But + # the offsets are still true. 20020322 + $oldlen += $self->{offsets}[$_+1] - $self->{offsets}[$_] + if defined $self->{offsets}[$_+1]; + } + $self->_fill_offsets_to($pos+$nrecs); + + # Modify the file + $self->_mtwrite($data, $self->{offsets}[$pos], $oldlen); + # Adjust the offsets table + $self->_oadjust([$pos, $nrecs, @data]); + + { # Take this read cache stuff out into a separate function + # You made a half-attempt to put it into _oadjust. + # Finish something like that up eventually. + # STORE also needs to do something similarish + + # update the read cache, part 1 + # modified records + for ($pos .. $pos+$nrecs-1) { + my $new = $data[$_-$pos]; + if (defined $new) { + $self->{cache}->update($_, $new); + } else { + $self->{cache}->remove($_); + } + } + + # update the read cache, part 2 + # moved records - records past the site of the change + # need to be renumbered + # Maybe merge this with the previous block? + { + my @oldkeys = grep $_ >= $pos + $nrecs, $self->{cache}->ckeys; + my @newkeys = map $_-$nrecs+@data, @oldkeys; + $self->{cache}->rekey(\@oldkeys, \@newkeys); + } + + # Now there might be too much data in the cache, if we spliced out + # some short records and spliced in some long ones. If so, flush + # the cache. + $self->_cache_flush; + } + + # Yes, the return value of 'splice' *is* actually this complicated + wantarray ? @result : @result ? $result[-1] : undef; +} + + +# write data into the file +# $data is the data to be written. +# it should be written at position $pos, and should overwrite +# exactly $len of the following bytes. +# Note that if length($data) > $len, the subsequent bytes will have to +# be moved up, and if length($data) < $len, they will have to +# be moved down +sub _twrite { + my ($self, $data, $pos, $len) = @_; + + unless (defined $pos) { + die "\$pos was undefined in _twrite"; + } + + my $len_diff = length($data) - $len; + + if ($len_diff == 0) { # Woo-hoo! + my $fh = $self->{fh}; + $self->_seekb($pos); + $self->_write_record($data); + return; # well, that was easy. + } + + # the two records are of different lengths + # our strategy here: rewrite the tail of the file, + # reading ahead one buffer at a time + # $bufsize is required to be at least as large as the data we're overwriting + my $bufsize = _bufsize($len_diff); + my ($writepos, $readpos) = ($pos, $pos+$len); + my $next_block; + my $more_data; + + # Seems like there ought to be a way to avoid the repeated code + # and the special case here. The read(1) is also a little weird. + # Think about this. + do { + $self->_seekb($readpos); + my $br = read $self->{fh}, $next_block, $bufsize; + $more_data = read $self->{fh}, my($dummy), 1; + $self->_seekb($writepos); + $self->_write_record($data); + $readpos += $br; + $writepos += length $data; + $data = $next_block; + } while $more_data; + $self->_seekb($writepos); + $self->_write_record($next_block); + + # There might be leftover data at the end of the file + $self->_chop_file if $len_diff < 0; +} + +# _iwrite(D, S, E) +# Insert text D at position S. +# Let C = E-S-|D|. If C < 0; die. +# Data in [S,S+C) is copied to [S+D,S+D+C) = [S+D,E). +# Data in [S+C = E-D, E) is returned. Data in [E, oo) is untouched. +# +# In a later version, don't read the entire intervening area into +# memory at once; do the copying block by block. +sub _iwrite { + my $self = shift; + my ($D, $s, $e) = @_; + my $d = length $D; + my $c = $e-$s-$d; + local *FH = $self->{fh}; + confess "Not enough space to insert $d bytes between $s and $e" + if $c < 0; + confess "[$s,$e) is an invalid insertion range" if $e < $s; + + $self->_seekb($s); + read FH, my $buf, $e-$s; + + $D .= substr($buf, 0, $c, ""); + + $self->_seekb($s); + $self->_write_record($D); + + return $buf; +} + +# Like _twrite, but the data-pos-len triple may be repeated; you may +# write several chunks. All the writing will be done in +# one pass. Chunks SHALL be in ascending order and SHALL NOT overlap. +sub _mtwrite { + my $self = shift; + my $unwritten = ""; + my $delta = 0; + + @_ % 3 == 0 + or die "Arguments to _mtwrite did not come in groups of three"; + + while (@_) { + my ($data, $pos, $len) = splice @_, 0, 3; + my $end = $pos + $len; # The OLD end of the segment to be replaced + $data = $unwritten . $data; + $delta -= length($unwritten); + $unwritten = ""; + $pos += $delta; # This is where the data goes now + my $dlen = length $data; + $self->_seekb($pos); + if ($len >= $dlen) { # the data will fit + $self->_write_record($data); + $delta += ($dlen - $len); # everything following moves down by this much + $data = ""; # All the data in the buffer has been written + } else { # won't fit + my $writable = substr($data, 0, $len - $delta, ""); + $self->_write_record($writable); + $delta += ($dlen - $len); # everything following moves down by this much + } + + # At this point we've written some but maybe not all of the data. + # There might be a gap to close up, or $data might still contain a + # bunch of unwritten data that didn't fit. + my $ndlen = length $data; + if ($delta == 0) { + $self->_write_record($data); + } elsif ($delta < 0) { + # upcopy (close up gap) + if (@_) { + $self->_upcopy($end, $end + $delta, $_[1] - $end); + } else { + $self->_upcopy($end, $end + $delta); + } + } else { + # downcopy (insert data that didn't fit; replace this data in memory + # with _later_ data that doesn't fit) + if (@_) { + $unwritten = $self->_downcopy($data, $end, $_[1] - $end); + } else { + # Make the file longer to accommodate the last segment that doesn't + $unwritten = $self->_downcopy($data, $end); + } + } + } +} + +# Copy block of data of length $len from position $spos to position $dpos +# $dpos must be <= $spos +# +# If $len is undefined, go all the way to the end of the file +# and then truncate it ($spos - $dpos bytes will be removed) +sub _upcopy { + my $blocksize = 8192; + my ($self, $spos, $dpos, $len) = @_; + if ($dpos > $spos) { + die "source ($spos) was upstream of destination ($dpos) in _upcopy"; + } elsif ($dpos == $spos) { + return; + } + + while (! defined ($len) || $len > 0) { + my $readsize = ! defined($len) ? $blocksize + : $len > $blocksize ? $blocksize + : $len; + + my $fh = $self->{fh}; + $self->_seekb($spos); + my $bytes_read = read $fh, my($data), $readsize; + $self->_seekb($dpos); + if ($data eq "") { + $self->_chop_file; + last; + } + $self->_write_record($data); + $spos += $bytes_read; + $dpos += $bytes_read; + $len -= $bytes_read if defined $len; + } +} + +# Write $data into a block of length $len at position $pos, +# moving everything in the block forwards to make room. +# Instead of writing the last length($data) bytes from the block +# (because there isn't room for them any longer) return them. +# +# Undefined $len means 'until the end of the file' +sub _downcopy { + my $blocksize = 8192; + my ($self, $data, $pos, $len) = @_; + my $fh = $self->{fh}; + + while (! defined $len || $len > 0) { + my $readsize = ! defined($len) ? $blocksize + : $len > $blocksize? $blocksize : $len; + $self->_seekb($pos); + read $fh, my($old), $readsize; + my $last_read_was_short = length($old) < $readsize; + $data .= $old; + my $writable; + if ($last_read_was_short) { + # If last read was short, then $data now contains the entire rest + # of the file, so there's no need to write only one block of it + $writable = $data; + $data = ""; + } else { + $writable = substr($data, 0, $readsize, ""); + } + last if $writable eq ""; + $self->_seekb($pos); + $self->_write_record($writable); + last if $last_read_was_short && $data eq ""; + $len -= $readsize if defined $len; + $pos += $readsize; + } + return $data; +} + +# Adjust the object data structures following an '_mtwrite' +# Arguments are +# [$pos, $nrecs, @length] items +# indicating that $nrecs records were removed at $recpos (a record offset) +# and replaced with records of length @length... +# Arguments guarantee that $recpos is strictly increasing. +# No return value +sub _oadjust { + my $self = shift; + my $delta = 0; + my $delta_recs = 0; + my $prev_end = -1; + my %newkeys; + + for (@_) { + my ($pos, $nrecs, @data) = @$_; + $pos += $delta_recs; + + # Adjust the offsets of the records after the previous batch up + # to the first new one of this batch + for my $i ($prev_end+2 .. $pos - 1) { + $self->{offsets}[$i] += $delta; + $newkey{$i} = $i + $delta_recs; + } + + $prev_end = $pos + @data - 1; # last record moved on this pass + + # Remove the offsets for the removed records; + # replace with the offsets for the inserted records + my @newoff = ($self->{offsets}[$pos] + $delta); + for my $i (0 .. $#data) { + my $newlen = length $data[$i]; + push @newoff, $newoff[$i] + $newlen; + $delta += $newlen; + } + + for my $i ($pos .. $pos+$nrecs-1) { + last if $i+1 > $#{$self->{offsets}}; + my $oldlen = $self->{offsets}[$i+1] - $self->{offsets}[$i]; + $delta -= $oldlen; + } + +# # also this data has changed, so update it in the cache +# for (0 .. $#data) { +# $self->{cache}->update($pos + $_, $data[$_]); +# } +# if ($delta_recs) { +# my @oldkeys = grep $_ >= $pos + @data, $self->{cache}->ckeys; +# my @newkeys = map $_ + $delta_recs, @oldkeys; +# $self->{cache}->rekey(\@oldkeys, \@newkeys); +# } + + # replace old offsets with new + splice @{$self->{offsets}}, $pos, $nrecs+1, @newoff; + # What if we just spliced out the end of the offsets table? + # shouldn't we clear $self->{eof}? Test for this XXX BUG TODO + + $delta_recs += @data - $nrecs; # net change in total number of records + } + + # The trailing records at the very end of the file + if ($delta) { + for my $i ($prev_end+2 .. $#{$self->{offsets}}) { + $self->{offsets}[$i] += $delta; + } + } + + # If we scrubbed out all known offsets, regenerate the trivial table + # that knows that the file does indeed start at 0. + $self->{offsets}[0] = 0 unless @{$self->{offsets}}; + # If the file got longer, the offsets table is no longer complete + # $self->{eof} = 0 if $delta_recs > 0; + + # Now there might be too much data in the cache, if we spliced out + # some short records and spliced in some long ones. If so, flush + # the cache. + $self->_cache_flush; +} + +# If a record does not already end with the appropriate terminator +# string, append one. +sub _fixrecs { + my $self = shift; + for (@_) { + $_ = "" unless defined $_; + $_ .= $self->{recsep} + unless substr($_, - $self->{recseplen}) eq $self->{recsep}; + } +} + + +################################################################ +# +# Basic read, write, and seek +# + +# seek to the beginning of record #$n +# Assumes that the offsets table is already correctly populated +# +# Note that $n=-1 has a special meaning here: It means the start of +# the last known record; this may or may not be the very last record +# in the file, depending on whether the offsets table is fully populated. +# +sub _seek { + my ($self, $n) = @_; + my $o = $self->{offsets}[$n]; + defined($o) + or confess("logic error: undefined offset for record $n"); + seek $self->{fh}, $o, SEEK_SET + or confess "Couldn't seek filehandle: $!"; # "Should never happen." +} + +# seek to byte $b in the file +sub _seekb { + my ($self, $b) = @_; + seek $self->{fh}, $b, SEEK_SET + or die "Couldn't seek filehandle: $!"; # "Should never happen." +} + +# populate the offsets table up to the beginning of record $n +# return the offset of record $n +sub _fill_offsets_to { + my ($self, $n) = @_; + + return $self->{offsets}[$n] if $self->{eof}; + + my $fh = $self->{fh}; + local *OFF = $self->{offsets}; + my $rec; + + until ($#OFF >= $n) { + $self->_seek(-1); # tricky -- see comment at _seek + $rec = $self->_read_record; + if (defined $rec) { + push @OFF, int(tell $fh); # Tels says that int() saves memory here + } else { + $self->{eof} = 1; + return; # It turns out there is no such record + } + } + + # we have now read all the records up to record n-1, + # so we can return the offset of record n + $OFF[$n]; +} + +sub _fill_offsets { + my ($self) = @_; + + my $fh = $self->{fh}; + local *OFF = $self->{offsets}; + + $self->_seek(-1); # tricky -- see comment at _seek + + # Tels says that inlining read_record() would make this loop + # five times faster. 20030508 + while ( defined $self->_read_record()) { + # int() saves us memory here + push @OFF, int(tell $fh); + } + + $self->{eof} = 1; + $#OFF; +} + +# assumes that $rec is already suitably terminated +sub _write_record { + my ($self, $rec) = @_; + my $fh = $self->{fh}; + local $\ = ""; + print $fh $rec + or die "Couldn't write record: $!"; # "Should never happen." +# $self->{_written} += length($rec); +} + +sub _read_record { + my $self = shift; + my $rec; + { local $/ = $self->{recsep}; + my $fh = $self->{fh}; + $rec = <$fh>; + } + return unless defined $rec; + if (substr($rec, -$self->{recseplen}) ne $self->{recsep}) { + # improperly terminated final record --- quietly fix it. +# my $ac = substr($rec, -$self->{recseplen}); +# $ac =~ s/\n/\\n/g; + $self->{sawlastrec} = 1; + unless ($self->{rdonly}) { + local $\ = ""; + my $fh = $self->{fh}; + print $fh $self->{recsep}; + } + $rec .= $self->{recsep}; + } +# $self->{_read} += length($rec) if defined $rec; + $rec; +} + +sub _rw_stats { + my $self = shift; + @{$self}{'_read', '_written'}; +} + +################################################################ +# +# Read cache management + +sub _cache_flush { + my ($self) = @_; + $self->{cache}->reduce_size_to($self->{memory} - $self->{deferred_s}); +} + +sub _cache_too_full { + my $self = shift; + $self->{cache}->bytes + $self->{deferred_s} >= $self->{memory}; +} + +################################################################ +# +# File custodial services +# + + +# We have read to the end of the file and have the offsets table +# entirely populated. Now we need to write a new record beyond +# the end of the file. We prepare for this by writing +# empty records into the file up to the position we want +# +# assumes that the offsets table already contains the offset of record $n, +# if it exists, and extends to the end of the file if not. +sub _extend_file_to { + my ($self, $n) = @_; + $self->_seek(-1); # position after the end of the last record + my $pos = $self->{offsets}[-1]; + + # the offsets table has one entry more than the total number of records + my $extras = $n - $#{$self->{offsets}}; + + # Todo : just use $self->{recsep} x $extras here? + while ($extras-- > 0) { + $self->_write_record($self->{recsep}); + push @{$self->{offsets}}, int(tell $self->{fh}); + } +} + +# Truncate the file at the current position +sub _chop_file { + my $self = shift; + truncate $self->{fh}, tell($self->{fh}); +} + + +# compute the size of a buffer suitable for moving +# all the data in a file forward $n bytes +# ($n may be negative) +# The result should be at least $n. +sub _bufsize { + my $n = shift; + return 8192 if $n <= 0; + my $b = $n & ~8191; + $b += 8192 if $n & 8191; + $b; +} + +################################################################ +# +# Miscellaneous public methods +# + +# Lock the file +sub flock { + my ($self, $op) = @_; + unless (@_ <= 3) { + my $pack = ref $self; + croak "Usage: $pack\->flock([OPERATION])"; + } + my $fh = $self->{fh}; + $op = LOCK_EX unless defined $op; + my $locked = flock $fh, $op; + + if ($locked && ($op & (LOCK_EX | LOCK_SH))) { + # If you're locking the file, then presumably it's because + # there might have been a write access by another process. + # In that case, the read cache contents and the offsets table + # might be invalid, so discard them. 20030508 + $self->{offsets} = [0]; + $self->{cache}->empty; + } + + $locked; +} + +# Get/set autochomp option +sub autochomp { + my $self = shift; + if (@_) { + my $old = $self->{autochomp}; + $self->{autochomp} = shift; + $old; + } else { + $self->{autochomp}; + } +} + +# Get offset table entries; returns offset of nth record +sub offset { + my ($self, $n) = @_; + + if ($#{$self->{offsets}} < $n) { + return if $self->{eof}; # request for record beyond the end of file + my $o = $self->_fill_offsets_to($n); + # If it's still undefined, there is no such record, so return 'undef' + return unless defined $o; + } + + $self->{offsets}[$n]; +} + +sub discard_offsets { + my $self = shift; + $self->{offsets} = [0]; +} + +################################################################ +# +# Matters related to deferred writing +# + +# Defer writes +sub defer { + my $self = shift; + $self->_stop_autodeferring; + @{$self->{ad_history}} = (); + $self->{defer} = 1; +} + +# Flush deferred writes +# +# This could be better optimized to write the file in one pass, instead +# of one pass per block of records. But that will require modifications +# to _twrite, so I should have a good _twrite test suite first. +sub flush { + my $self = shift; + + $self->_flush; + $self->{defer} = 0; +} + +sub _old_flush { + my $self = shift; + my @writable = sort {$a<=>$b} (keys %{$self->{deferred}}); + + while (@writable) { + # gather all consecutive records from the front of @writable + my $first_rec = shift @writable; + my $last_rec = $first_rec+1; + ++$last_rec, shift @writable while @writable && $last_rec == $writable[0]; + --$last_rec; + $self->_fill_offsets_to($last_rec); + $self->_extend_file_to($last_rec); + $self->_splice($first_rec, $last_rec-$first_rec+1, + @{$self->{deferred}}{$first_rec .. $last_rec}); + } + + $self->_discard; # clear out defered-write-cache +} + +sub _flush { + my $self = shift; + my @writable = sort {$a<=>$b} (keys %{$self->{deferred}}); + my @args; + my @adjust; + + while (@writable) { + # gather all consecutive records from the front of @writable + my $first_rec = shift @writable; + my $last_rec = $first_rec+1; + ++$last_rec, shift @writable while @writable && $last_rec == $writable[0]; + --$last_rec; + my $end = $self->_fill_offsets_to($last_rec+1); + if (not defined $end) { + $self->_extend_file_to($last_rec); + $end = $self->{offsets}[$last_rec]; + } + my ($start) = $self->{offsets}[$first_rec]; + push @args, + join("", @{$self->{deferred}}{$first_rec .. $last_rec}), # data + $start, # position + $end-$start; # length + push @adjust, [$first_rec, # starting at this position... + $last_rec-$first_rec+1, # this many records... + # are replaced with these... + @{$self->{deferred}}{$first_rec .. $last_rec}, + ]; + } + + $self->_mtwrite(@args); # write multiple record groups + $self->_discard; # clear out defered-write-cache + $self->_oadjust(@adjust); +} + +# Discard deferred writes and disable future deferred writes +sub discard { + my $self = shift; + $self->_discard; + $self->{defer} = 0; +} + +# Discard deferred writes, but retain old deferred writing mode +sub _discard { + my $self = shift; + %{$self->{deferred}} = (); + $self->{deferred_s} = 0; + $self->{deferred_max} = -1; + $self->{cache}->set_limit($self->{memory}); +} + +# Deferred writing is enabled, either explicitly ($self->{defer}) +# or automatically ($self->{autodeferring}) +sub _is_deferring { + my $self = shift; + $self->{defer} || $self->{autodeferring}; +} + +# The largest record number of any deferred record +sub _defer_max { + my $self = shift; + return $self->{deferred_max} if defined $self->{deferred_max}; + my $max = -1; + for my $key (keys %{$self->{deferred}}) { + $max = $key if $key > $max; + } + $self->{deferred_max} = $max; + $max; +} + +################################################################ +# +# Matters related to autodeferment +# + +# Get/set autodefer option +sub autodefer { + my $self = shift; + if (@_) { + my $old = $self->{autodefer}; + $self->{autodefer} = shift; + if ($old) { + $self->_stop_autodeferring; + @{$self->{ad_history}} = (); + } + $old; + } else { + $self->{autodefer}; + } +} + +# The user is trying to store record #$n Record that in the history, +# and then enable (or disable) autodeferment if that seems useful. +# Note that it's OK for $n to be a non-number, as long as the function +# is prepared to deal with that. Nobody else looks at the ad_history. +# +# Now, what does the ad_history mean, and what is this function doing? +# Essentially, the idea is to enable autodeferring when we see that the +# user has made three consecutive STORE calls to three consecutive records. +# ("Three" is actually ->{autodefer_threshhold}.) +# A STORE call for record #$n inserts $n into the autodefer history, +# and if the history contains three consecutive records, we enable +# autodeferment. An ad_history of [X, Y] means that the most recent +# STOREs were for records X, X+1, ..., Y, in that order. +# +# Inserting a nonconsecutive number erases the history and starts over. +# +# Performing a special operation like SPLICE erases the history. +# +# There's one special case: CLEAR means that CLEAR was just called. +# In this case, we prime the history with [-2, -1] so that if the next +# write is for record 0, autodeferring goes on immediately. This is for +# the common special case of "@a = (...)". +# +sub _annotate_ad_history { + my ($self, $n) = @_; + return unless $self->{autodefer}; # feature is disabled + return if $self->{defer}; # already in explicit defer mode + return unless $self->{offsets}[-1] >= $self->{autodefer_filelen_threshhold}; + + local *H = $self->{ad_history}; + if ($n eq 'CLEAR') { + @H = (-2, -1); # prime the history with fake records + $self->_stop_autodeferring; + } elsif ($n =~ /^\d+$/) { + if (@H == 0) { + @H = ($n, $n); + } else { # @H == 2 + if ($H[1] == $n-1) { # another consecutive record + $H[1]++; + if ($H[1] - $H[0] + 1 >= $self->{autodefer_threshhold}) { + $self->{autodeferring} = 1; + } + } else { # nonconsecutive- erase and start over + @H = ($n, $n); + $self->_stop_autodeferring; + } + } + } else { # SPLICE or STORESIZE or some such + @H = (); + $self->_stop_autodeferring; + } +} + +# If autodeferring was enabled, cut it out and discard the history +sub _stop_autodeferring { + my $self = shift; + if ($self->{autodeferring}) { + $self->_flush; + } + $self->{autodeferring} = 0; +} + +################################################################ + + +# This is NOT a method. It is here for two reasons: +# 1. To factor a fairly complicated block out of the constructor +# 2. To provide access for the test suite, which need to be sure +# files are being written properly. +sub _default_recsep { + my $recsep = $/; + if ($^O eq 'MSWin32') { # Dos too? + # Windows users expect files to be terminated with \r\n + # But $/ is set to \n instead + # Note that this also transforms \n\n into \r\n\r\n. + # That is a feature. + $recsep =~ s/\n/\r\n/g; + } + $recsep; +} + +# Utility function for _check_integrity +sub _ci_warn { + my $msg = shift; + $msg =~ s/\n/\\n/g; + $msg =~ s/\r/\\r/g; + print "# $msg\n"; +} + +# Given a file, make sure the cache is consistent with the +# file contents and the internal data structures are consistent with +# each other. Returns true if everything checks out, false if not +# +# The $file argument is no longer used. It is retained for compatibility +# with the existing test suite. +sub _check_integrity { + my ($self, $file, $warn) = @_; + my $rsl = $self->{recseplen}; + my $rs = $self->{recsep}; + my $good = 1; + local *_; # local $_ does not work here + local $DIAGNOSTIC = 1; + + if (not defined $rs) { + _ci_warn("recsep is undef!"); + $good = 0; + } elsif ($rs eq "") { + _ci_warn("recsep is empty!"); + $good = 0; + } elsif ($rsl != length $rs) { + my $ln = length $rs; + _ci_warn("recsep <$rs> has length $ln, should be $rsl"); + $good = 0; + } + + if (not defined $self->{offsets}[0]) { + _ci_warn("offset 0 is missing!"); + $good = 0; + + } elsif ($self->{offsets}[0] != 0) { + _ci_warn("rec 0: offset <$self->{offsets}[0]> s/b 0!"); + $good = 0; + } + + my $cached = 0; + { + local *F = $self->{fh}; + seek F, 0, SEEK_SET; + local $. = 0; + local $/ = $rs; + + while () { + my $n = $. - 1; + my $cached = $self->{cache}->_produce($n); + my $offset = $self->{offsets}[$.]; + my $ao = tell F; + if (defined $offset && $offset != $ao) { + _ci_warn("rec $n: offset <$offset> actual <$ao>"); + $good = 0; + } + if (defined $cached && $_ ne $cached && ! $self->{deferred}{$n}) { + $good = 0; + _ci_warn("rec $n: cached <$cached> actual <$_>"); + } + if (defined $cached && substr($cached, -$rsl) ne $rs) { + $good = 0; + _ci_warn("rec $n in the cache is missing the record separator"); + } + if (! defined $offset && $self->{eof}) { + $good = 0; + _ci_warn("The offset table was marked complete, but it is missing " . + "element $."); + } + } + if (@{$self->{offsets}} > $.+1) { + $good = 0; + my $n = @{$self->{offsets}}; + _ci_warn("The offset table has $n items, but the file has only $."); + } + + my $deferring = $self->_is_deferring; + for my $n ($self->{cache}->ckeys) { + my $r = $self->{cache}->_produce($n); + $cached += length($r); + next if $n+1 <= $.; # checked this already + _ci_warn("spurious caching of record $n"); + $good = 0; + } + my $b = $self->{cache}->bytes; + if ($cached != $b) { + _ci_warn("cache size is $b, should be $cached"); + $good = 0; + } + } + + # That cache has its own set of tests + $good = 0 unless $self->{cache}->_check_integrity; + + # Now let's check the deferbuffer + # Unless deferred writing is enabled, it should be empty + if (! $self->_is_deferring && %{$self->{deferred}}) { + _ci_warn("deferred writing disabled, but deferbuffer nonempty"); + $good = 0; + } + + # Any record in the deferbuffer should *not* be present in the readcache + my $deferred_s = 0; + while (my ($n, $r) = each %{$self->{deferred}}) { + $deferred_s += length($r); + if (defined $self->{cache}->_produce($n)) { + _ci_warn("record $n is in the deferbuffer *and* the readcache"); + $good = 0; + } + if (substr($r, -$rsl) ne $rs) { + _ci_warn("rec $n in the deferbuffer is missing the record separator"); + $good = 0; + } + } + + # Total size of deferbuffer should match internal total + if ($deferred_s != $self->{deferred_s}) { + _ci_warn("buffer size is $self->{deferred_s}, should be $deferred_s"); + $good = 0; + } + + # Total size of deferbuffer should not exceed the specified limit + if ($deferred_s > $self->{dw_size}) { + _ci_warn("buffer size is $self->{deferred_s} which exceeds the limit " . + "of $self->{dw_size}"); + $good = 0; + } + + # Total size of cached data should not exceed the specified limit + if ($deferred_s + $cached > $self->{memory}) { + my $total = $deferred_s + $cached; + _ci_warn("total stored data size is $total which exceeds the limit " . + "of $self->{memory}"); + $good = 0; + } + + # Stuff related to autodeferment + if (!$self->{autodefer} && @{$self->{ad_history}}) { + _ci_warn("autodefer is disabled, but ad_history is nonempty"); + $good = 0; + } + if ($self->{autodeferring} && $self->{defer}) { + _ci_warn("both autodeferring and explicit deferring are active"); + $good = 0; + } + if (@{$self->{ad_history}} == 0) { + # That's OK, no additional tests required + } elsif (@{$self->{ad_history}} == 2) { + my @non_number = grep !/^-?\d+$/, @{$self->{ad_history}}; + if (@non_number) { + my $msg; + { local $" = ')('; + $msg = "ad_history contains non-numbers (@{$self->{ad_history}})"; + } + _ci_warn($msg); + $good = 0; + } elsif ($self->{ad_history}[1] < $self->{ad_history}[0]) { + _ci_warn("ad_history has nonsensical values @{$self->{ad_history}}"); + $good = 0; + } + } else { + _ci_warn("ad_history has bad length <@{$self->{ad_history}}>"); + $good = 0; + } + + $good; +} + +################################################################ +# +# Tie::File::Cache +# +# Read cache + +package Tie::File::Cache; +$Tie::File::Cache::VERSION = $Tie::File::VERSION; +use Carp ':DEFAULT', 'confess'; + +sub HEAP () { 0 } +sub HASH () { 1 } +sub MAX () { 2 } +sub BYTES() { 3 } +#sub STAT () { 4 } # Array with request statistics for each record +#sub MISS () { 5 } # Total number of cache misses +#sub REQ () { 6 } # Total number of cache requests +use strict 'vars'; + +sub new { + my ($pack, $max) = @_; + local *_; + croak "missing argument to ->new" unless defined $max; + my $self = []; + bless $self => $pack; + @$self = (Tie::File::Heap->new($self), {}, $max, 0); + $self; +} + +sub adj_limit { + my ($self, $n) = @_; + $self->[MAX] += $n; +} + +sub set_limit { + my ($self, $n) = @_; + $self->[MAX] = $n; +} + +# For internal use only +# Will be called by the heap structure to notify us that a certain +# piece of data has moved from one heap element to another. +# $k is the hash key of the item +# $n is the new index into the heap at which it is stored +# If $n is undefined, the item has been removed from the heap. +sub _heap_move { + my ($self, $k, $n) = @_; + if (defined $n) { + $self->[HASH]{$k} = $n; + } else { + delete $self->[HASH]{$k}; + } +} + +sub insert { + my ($self, $key, $val) = @_; + local *_; + croak "missing argument to ->insert" unless defined $key; + unless (defined $self->[MAX]) { + confess "undefined max" ; + } + confess "undefined val" unless defined $val; + return if length($val) > $self->[MAX]; + +# if ($self->[STAT]) { +# $self->[STAT][$key] = 1; +# return; +# } + + my $oldnode = $self->[HASH]{$key}; + if (defined $oldnode) { + my $oldval = $self->[HEAP]->set_val($oldnode, $val); + $self->[BYTES] -= length($oldval); + } else { + $self->[HEAP]->insert($key, $val); + } + $self->[BYTES] += length($val); + $self->flush if $self->[BYTES] > $self->[MAX]; +} + +sub expire { + my $self = shift; + my $old_data = $self->[HEAP]->popheap; + return unless defined $old_data; + $self->[BYTES] -= length $old_data; + $old_data; +} + +sub remove { + my ($self, @keys) = @_; + my @result; + +# if ($self->[STAT]) { +# for my $key (@keys) { +# $self->[STAT][$key] = 0; +# } +# return; +# } + + for my $key (@keys) { + next unless exists $self->[HASH]{$key}; + my $old_data = $self->[HEAP]->remove($self->[HASH]{$key}); + $self->[BYTES] -= length $old_data; + push @result, $old_data; + } + @result; +} + +sub lookup { + my ($self, $key) = @_; + local *_; + croak "missing argument to ->lookup" unless defined $key; + +# if ($self->[STAT]) { +# $self->[MISS]++ if $self->[STAT][$key]++ == 0; +# $self->[REQ]++; +# my $hit_rate = 1 - $self->[MISS] / $self->[REQ]; +# # Do some testing to determine this threshhold +# $#$self = STAT - 1 if $hit_rate > 0.20; +# } + + if (exists $self->[HASH]{$key}) { + $self->[HEAP]->lookup($self->[HASH]{$key}); + } else { + return; + } +} + +# For internal use only +sub _produce { + my ($self, $key) = @_; + my $loc = $self->[HASH]{$key}; + return unless defined $loc; + $self->[HEAP][$loc][2]; +} + +# For internal use only +sub _promote { + my ($self, $key) = @_; + $self->[HEAP]->promote($self->[HASH]{$key}); +} + +sub empty { + my ($self) = @_; + %{$self->[HASH]} = (); + $self->[BYTES] = 0; + $self->[HEAP]->empty; +# @{$self->[STAT]} = (); +# $self->[MISS] = 0; +# $self->[REQ] = 0; +} + +sub is_empty { + my ($self) = @_; + keys %{$self->[HASH]} == 0; +} + +sub update { + my ($self, $key, $val) = @_; + local *_; + croak "missing argument to ->update" unless defined $key; + if (length($val) > $self->[MAX]) { + my ($oldval) = $self->remove($key); + $self->[BYTES] -= length($oldval) if defined $oldval; + } elsif (exists $self->[HASH]{$key}) { + my $oldval = $self->[HEAP]->set_val($self->[HASH]{$key}, $val); + $self->[BYTES] += length($val); + $self->[BYTES] -= length($oldval) if defined $oldval; + } else { + $self->[HEAP]->insert($key, $val); + $self->[BYTES] += length($val); + } + $self->flush; +} + +sub rekey { + my ($self, $okeys, $nkeys) = @_; + local *_; + my %map; + @map{@$okeys} = @$nkeys; + croak "missing argument to ->rekey" unless defined $nkeys; + croak "length mismatch in ->rekey arguments" unless @$nkeys == @$okeys; + my %adjusted; # map new keys to heap indices + # You should be able to cut this to one loop TODO XXX + for (0 .. $#$okeys) { + $adjusted{$nkeys->[$_]} = delete $self->[HASH]{$okeys->[$_]}; + } + while (my ($nk, $ix) = each %adjusted) { + # @{$self->[HASH]}{keys %adjusted} = values %adjusted; + $self->[HEAP]->rekey($ix, $nk); + $self->[HASH]{$nk} = $ix; + } +} + +sub ckeys { + my $self = shift; + my @a = keys %{$self->[HASH]}; + @a; +} + +# Return total amount of cached data +sub bytes { + my $self = shift; + $self->[BYTES]; +} + +# Expire oldest item from cache until cache size is smaller than $max +sub reduce_size_to { + my ($self, $max) = @_; + until ($self->[BYTES] <= $max) { + # Note that Tie::File::Cache::expire has been inlined here + my $old_data = $self->[HEAP]->popheap; + return unless defined $old_data; + $self->[BYTES] -= length $old_data; + } +} + +# Why not just $self->reduce_size_to($self->[MAX])? +# Try this when things stabilize TODO XXX +# If the cache is too full, expire the oldest records +sub flush { + my $self = shift; + $self->reduce_size_to($self->[MAX]) if $self->[BYTES] > $self->[MAX]; +} + +# For internal use only +sub _produce_lru { + my $self = shift; + $self->[HEAP]->expire_order; +} + +BEGIN { *_ci_warn = \&Tie::File::_ci_warn } + +sub _check_integrity { # For CACHE + my $self = shift; + my $good = 1; + + # Test HEAP + $self->[HEAP]->_check_integrity or $good = 0; + + # Test HASH + my $bytes = 0; + for my $k (keys %{$self->[HASH]}) { + if ($k ne '0' && $k !~ /^[1-9][0-9]*$/) { + $good = 0; + _ci_warn "Cache hash key <$k> is non-numeric"; + } + + my $h = $self->[HASH]{$k}; + if (! defined $h) { + $good = 0; + _ci_warn "Heap index number for key $k is undefined"; + } elsif ($h == 0) { + $good = 0; + _ci_warn "Heap index number for key $k is zero"; + } else { + my $j = $self->[HEAP][$h]; + if (! defined $j) { + $good = 0; + _ci_warn "Heap contents key $k (=> $h) are undefined"; + } else { + $bytes += length($j->[2]); + if ($k ne $j->[1]) { + $good = 0; + _ci_warn "Heap contents key $k (=> $h) is $j->[1], should be $k"; + } + } + } + } + + # Test BYTES + if ($bytes != $self->[BYTES]) { + $good = 0; + _ci_warn "Total data in cache is $bytes, expected $self->[BYTES]"; + } + + # Test MAX + if ($bytes > $self->[MAX]) { + $good = 0; + _ci_warn "Total data in cache is $bytes, exceeds maximum $self->[MAX]"; + } + + return $good; +} + +sub delink { + my $self = shift; + $self->[HEAP] = undef; # Bye bye heap +} + +################################################################ +# +# Tie::File::Heap +# +# Heap data structure for use by cache LRU routines + +package Tie::File::Heap; +use Carp ':DEFAULT', 'confess'; +$Tie::File::Heap::VERSION = $Tie::File::Cache::VERSION; +sub SEQ () { 0 }; +sub KEY () { 1 }; +sub DAT () { 2 }; + +sub new { + my ($pack, $cache) = @_; + die "$pack: Parent cache object $cache does not support _heap_move method" + unless eval { $cache->can('_heap_move') }; + my $self = [[0,$cache,0]]; + bless $self => $pack; +} + +# Allocate a new sequence number, larger than all previously allocated numbers +sub _nseq { + my $self = shift; + $self->[0][0]++; +} + +sub _cache { + my $self = shift; + $self->[0][1]; +} + +sub _nelts { + my $self = shift; + $self->[0][2]; +} + +sub _nelts_inc { + my $self = shift; + ++$self->[0][2]; +} + +sub _nelts_dec { + my $self = shift; + --$self->[0][2]; +} + +sub is_empty { + my $self = shift; + $self->_nelts == 0; +} + +sub empty { + my $self = shift; + $#$self = 0; + $self->[0][2] = 0; + $self->[0][0] = 0; # might as well reset the sequence numbers +} + +# notify the parent cache object that we moved something +sub _heap_move { + my $self = shift; + $self->_cache->_heap_move(@_); +} + +# Insert a piece of data into the heap with the indicated sequence number. +# The item with the smallest sequence number is always at the top. +# If no sequence number is specified, allocate a new one and insert the +# item at the bottom. +sub insert { + my ($self, $key, $data, $seq) = @_; + $seq = $self->_nseq unless defined $seq; + $self->_insert_new([$seq, $key, $data]); +} + +# Insert a new, fresh item at the bottom of the heap +sub _insert_new { + my ($self, $item) = @_; + my $i = @$self; + $i = int($i/2) until defined $self->[$i/2]; + $self->[$i] = $item; + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + $self->_nelts_inc; +} + +# Insert [$data, $seq] pair at or below item $i in the heap. +# If $i is omitted, default to 1 (the top element.) +sub _insert { + my ($self, $item, $i) = @_; +# $self->_check_loc($i) if defined $i; + $i = 1 unless defined $i; + until (! defined $self->[$i]) { + if ($self->[$i][SEQ] > $item->[SEQ]) { # inserted item is older + ($self->[$i], $item) = ($item, $self->[$i]); + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + } + # If either is undefined, go that way. Otherwise, choose at random + my $dir; + $dir = 0 if !defined $self->[2*$i]; + $dir = 1 if !defined $self->[2*$i+1]; + $dir = int(rand(2)) unless defined $dir; + $i = 2*$i + $dir; + } + $self->[$i] = $item; + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + $self->_nelts_inc; +} + +# Remove the item at node $i from the heap, moving child items upwards. +# The item with the smallest sequence number is always at the top. +# Moving items upwards maintains this condition. +# Return the removed item. Return undef if there was no item at node $i. +sub remove { + my ($self, $i) = @_; + $i = 1 unless defined $i; + my $top = $self->[$i]; + return unless defined $top; + while (1) { + my $ii; + my ($L, $R) = (2*$i, 2*$i+1); + + # If either is undefined, go the other way. + # Otherwise, go towards the smallest. + last unless defined $self->[$L] || defined $self->[$R]; + $ii = $R if not defined $self->[$L]; + $ii = $L if not defined $self->[$R]; + unless (defined $ii) { + $ii = $self->[$L][SEQ] < $self->[$R][SEQ] ? $L : $R; + } + + $self->[$i] = $self->[$ii]; # Promote child to fill vacated spot + $self->[0][1]->_heap_move($self->[$i][KEY], $i); + $i = $ii; # Fill new vacated spot + } + $self->[0][1]->_heap_move($top->[KEY], undef); + undef $self->[$i]; + $self->_nelts_dec; + return $top->[DAT]; +} + +sub popheap { + my $self = shift; + $self->remove(1); +} + +# set the sequence number of the indicated item to a higher number +# than any other item in the heap, and bubble the item down to the +# bottom. +sub promote { + my ($self, $n) = @_; +# $self->_check_loc($n); + $self->[$n][SEQ] = $self->_nseq; + my $i = $n; + while (1) { + my ($L, $R) = (2*$i, 2*$i+1); + my $dir; + last unless defined $self->[$L] || defined $self->[$R]; + $dir = $R unless defined $self->[$L]; + $dir = $L unless defined $self->[$R]; + unless (defined $dir) { + $dir = $self->[$L][SEQ] < $self->[$R][SEQ] ? $L : $R; + } + @{$self}[$i, $dir] = @{$self}[$dir, $i]; + for ($i, $dir) { + $self->[0][1]->_heap_move($self->[$_][KEY], $_) if defined $self->[$_]; + } + $i = $dir; + } +} + +# Return item $n from the heap, promoting its LRU status +sub lookup { + my ($self, $n) = @_; +# $self->_check_loc($n); + my $val = $self->[$n]; + $self->promote($n); + $val->[DAT]; +} + + +# Assign a new value for node $n, promoting it to the bottom of the heap +sub set_val { + my ($self, $n, $val) = @_; +# $self->_check_loc($n); + my $oval = $self->[$n][DAT]; + $self->[$n][DAT] = $val; + $self->promote($n); + return $oval; +} + +# The hash key has changed for an item; +# alter the heap's record of the hash key +sub rekey { + my ($self, $n, $new_key) = @_; +# $self->_check_loc($n); + $self->[$n][KEY] = $new_key; +} + +sub _check_loc { + my ($self, $n) = @_; + unless (1 || defined $self->[$n]) { + confess "_check_loc($n) failed"; + } +} + +BEGIN { *_ci_warn = \&Tie::File::_ci_warn } + +sub _check_integrity { + my $self = shift; + my $good = 1; + my %seq; + + unless (eval {$self->[0][1]->isa("Tie::File::Cache")}) { + _ci_warn "Element 0 of heap corrupt"; + $good = 0; + } + $good = 0 unless $self->_satisfies_heap_condition(1); + for my $i (2 .. $#{$self}) { + my $p = int($i/2); # index of parent node + if (defined $self->[$i] && ! defined $self->[$p]) { + _ci_warn "Element $i of heap defined, but parent $p isn't"; + $good = 0; + } + + if (defined $self->[$i]) { + if ($seq{$self->[$i][SEQ]}) { + my $seq = $self->[$i][SEQ]; + _ci_warn "Nodes $i and $seq{$seq} both have SEQ=$seq"; + $good = 0; + } else { + $seq{$self->[$i][SEQ]} = $i; + } + } + } + + return $good; +} + +sub _satisfies_heap_condition { + my $self = shift; + my $n = shift || 1; + my $good = 1; + for (0, 1) { + my $c = $n*2 + $_; + next unless defined $self->[$c]; + if ($self->[$n][SEQ] >= $self->[$c]) { + _ci_warn "Node $n of heap does not predate node $c"; + $good = 0 ; + } + $good = 0 unless $self->_satisfies_heap_condition($c); + } + return $good; +} + +# Return a list of all the values, sorted by expiration order +sub expire_order { + my $self = shift; + my @nodes = sort {$a->[SEQ] <=> $b->[SEQ]} $self->_nodes; + map { $_->[KEY] } @nodes; +} + +sub _nodes { + my $self = shift; + my $i = shift || 1; + return unless defined $self->[$i]; + ($self->[$i], $self->_nodes($i*2), $self->_nodes($i*2+1)); +} + +"Cogito, ergo sum."; # don't forget to return a true value from the file + +__END__ + + +package Tie::Hash; + +our $VERSION = '1.05'; + + +use Carp; +use warnings::register; + +sub new { + my $pkg = shift; + $pkg->TIEHASH(@_); +} + +# Grandfather "new" + +sub TIEHASH { + my $pkg = shift; + my $pkg_new = $pkg -> can ('new'); + + if ($pkg_new and $pkg ne __PACKAGE__) { + my $my_new = __PACKAGE__ -> can ('new'); + if ($pkg_new == $my_new) { + # + # Prevent recursion + # + croak "$pkg must define either a TIEHASH() or a new() method"; + } + + warnings::warnif ("WARNING: calling ${pkg}->new since " . + "${pkg}->TIEHASH is missing"); + $pkg -> new (@_); + } + else { + croak "$pkg doesn't define a TIEHASH method"; + } +} + +sub EXISTS { + my $pkg = ref $_[0]; + croak "$pkg doesn't define an EXISTS method"; +} + +sub CLEAR { + my $self = shift; + my $key = $self->FIRSTKEY(@_); + my @keys; + + while (defined $key) { + push @keys, $key; + $key = $self->NEXTKEY(@_, $key); + } + foreach $key (@keys) { + $self->DELETE(@_, $key); + } +} + +# The Tie::StdHash package implements standard perl hash behaviour. +# It exists to act as a base class for classes which only wish to +# alter some parts of their behaviour. + +package Tie::StdHash; +# @ISA = qw(Tie::Hash); # would inherit new() only + +sub TIEHASH { bless {}, $_[0] } +sub STORE { $_[0]->{$_[1]} = $_[2] } +sub FETCH { $_[0]->{$_[1]} } +sub FIRSTKEY { my $a = scalar keys %{$_[0]}; each %{$_[0]} } +sub NEXTKEY { each %{$_[0]} } +sub EXISTS { exists $_[0]->{$_[1]} } +sub DELETE { delete $_[0]->{$_[1]} } +sub CLEAR { %{$_[0]} = () } +sub SCALAR { scalar %{$_[0]} } + +package Tie::ExtraHash; + +sub TIEHASH { my $p = shift; bless [{}, @_], $p } +sub STORE { $_[0][0]{$_[1]} = $_[2] } +sub FETCH { $_[0][0]{$_[1]} } +sub FIRSTKEY { my $a = scalar keys %{$_[0][0]}; each %{$_[0][0]} } +sub NEXTKEY { each %{$_[0][0]} } +sub EXISTS { exists $_[0][0]->{$_[1]} } +sub DELETE { delete $_[0][0]->{$_[1]} } +sub CLEAR { %{$_[0][0]} = () } +sub SCALAR { scalar %{$_[0][0]} } + +1; +package Tie::Handle; + +use 5.006_001; +our $VERSION = '4.2'; + +# Tie::StdHandle used to be inside Tie::Handle. For backwards compatibility +# loading Tie::Handle has to make Tie::StdHandle available. +use Tie::StdHandle; + + +use Carp; +use warnings::register; + +sub new { + my $pkg = shift; + $pkg->TIEHANDLE(@_); +} + +# "Grandfather" the new, a la Tie::Hash + +sub TIEHANDLE { + my $pkg = shift; + if (defined &{"{$pkg}::new"}) { + warnings::warnif("WARNING: calling ${pkg}->new since ${pkg}->TIEHANDLE is missing"); + $pkg->new(@_); + } + else { + croak "$pkg doesn't define a TIEHANDLE method"; + } +} + +sub PRINT { + my $self = shift; + if($self->can('WRITE') != \&WRITE) { + my $buf = join(defined $, ? $, : "",@_); + $buf .= $\ if defined $\; + $self->WRITE($buf,length($buf),0); + } + else { + croak ref($self)," doesn't define a PRINT method"; + } +} + +sub PRINTF { + my $self = shift; + + if($self->can('WRITE') != \&WRITE) { + my $buf = sprintf(shift,@_); + $self->WRITE($buf,length($buf),0); + } + else { + croak ref($self)," doesn't define a PRINTF method"; + } +} + +sub READLINE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a READLINE method"; +} + +sub GETC { + my $self = shift; + + if($self->can('READ') != \&READ) { + my $buf; + $self->READ($buf,1); + return $buf; + } + else { + croak ref($self)," doesn't define a GETC method"; + } +} + +sub READ { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a READ method"; +} + +sub WRITE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a WRITE method"; +} + +sub CLOSE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a CLOSE method"; +} + +1; +package Tie::RefHash; + +use vars qw/$VERSION/; + +$VERSION = "1.39"; + +use 5.005; + + +use Tie::Hash; +use vars '@ISA'; +@ISA = qw(Tie::Hash); +use strict; +use Carp qw/croak/; + +BEGIN { + local $@; + # determine whether we need to take care of threads + use Config (); + my $usethreads = $Config::Config{usethreads}; # && exists $INC{"threads.pm"} + *_HAS_THREADS = $usethreads ? sub () { 1 } : sub () { 0 }; + *_HAS_SCALAR_UTIL = eval { require Scalar::Util; 1 } ? sub () { 1 } : sub () { 0 }; + *_HAS_WEAKEN = defined(&Scalar::Util::weaken) ? sub () { 1 } : sub () { 0 }; +} + +BEGIN { + # create a refaddr function + + local $@; + + if ( _HAS_SCALAR_UTIL ) { + Scalar::Util->import("refaddr"); + } else { + require overload; + + *refaddr = sub { + if ( overload::StrVal($_[0]) =~ /\( 0x ([a-zA-Z0-9]+) \)$/x) { + return $1; + } else { + die "couldn't parse StrVal: " . overload::StrVal($_[0]); + } + }; + } +} + +my (@thread_object_registry, $count); # used by the CLONE method to rehash the keys after their refaddr changed + +sub TIEHASH { + my $c = shift; + my $s = []; + bless $s, $c; + while (@_) { + $s->STORE(shift, shift); + } + + if (_HAS_THREADS ) { + + if ( _HAS_WEAKEN ) { + # remember the object so that we can rekey it on CLONE + push @thread_object_registry, $s; + # but make this a weak reference, so that there are no leaks + Scalar::Util::weaken( $thread_object_registry[-1] ); + + if ( ++$count > 1000 ) { + # this ensures we don't fill up with a huge array dead weakrefs + @thread_object_registry = grep { defined } @thread_object_registry; + $count = 0; + } + } else { + $count++; # used in the warning + } + } + + return $s; +} + +my $storable_format_version = join("/", __PACKAGE__, "0.01"); + +sub STORABLE_freeze { + my ( $self, $is_cloning ) = @_; + my ( $refs, $reg ) = @$self; + return ( $storable_format_version, [ values %$refs ], $reg || {} ); +} + +sub STORABLE_thaw { + my ( $self, $is_cloning, $version, $refs, $reg ) = @_; + croak "incompatible versions of Tie::RefHash between freeze and thaw" + unless $version eq $storable_format_version; + + @$self = ( {}, $reg ); + $self->_reindex_keys( $refs ); +} + +sub CLONE { + my $pkg = shift; + + if ( $count and not _HAS_WEAKEN ) { + warn "Tie::RefHash is not threadsafe without Scalar::Util::weaken"; + } + + # when the thread has been cloned all the objects need to be updated. + # dead weakrefs are undefined, so we filter them out + @thread_object_registry = grep { defined && do { $_->_reindex_keys; 1 } } @thread_object_registry; + $count = 0; # we just cleaned up +} + +sub _reindex_keys { + my ( $self, $extra_keys ) = @_; + # rehash all the ref keys based on their new StrVal + %{ $self->[0] } = map { refaddr($_->[0]) => $_ } (values(%{ $self->[0] }), @{ $extra_keys || [] }); +} + +sub FETCH { + my($s, $k) = @_; + if (ref $k) { + my $kstr = refaddr($k); + if (defined $s->[0]{$kstr}) { + $s->[0]{$kstr}[1]; + } + else { + undef; + } + } + else { + $s->[1]{$k}; + } +} + +sub STORE { + my($s, $k, $v) = @_; + if (ref $k) { + $s->[0]{refaddr($k)} = [$k, $v]; + } + else { + $s->[1]{$k} = $v; + } + $v; +} + +sub DELETE { + my($s, $k) = @_; + (ref $k) + ? (delete($s->[0]{refaddr($k)}) || [])->[1] + : delete($s->[1]{$k}); +} + +sub EXISTS { + my($s, $k) = @_; + (ref $k) ? exists($s->[0]{refaddr($k)}) : exists($s->[1]{$k}); +} + +sub FIRSTKEY { + my $s = shift; + keys %{$s->[0]}; # reset iterator + keys %{$s->[1]}; # reset iterator + $s->[2] = 0; # flag for iteration, see NEXTKEY + $s->NEXTKEY; +} + +sub NEXTKEY { + my $s = shift; + my ($k, $v); + if (!$s->[2]) { + if (($k, $v) = each %{$s->[0]}) { + return $v->[0]; + } + else { + $s->[2] = 1; + } + } + return each %{$s->[1]}; +} + +sub CLEAR { + my $s = shift; + $s->[2] = 0; + %{$s->[0]} = (); + %{$s->[1]} = (); +} + +package Tie::RefHash::Nestable; +use vars '@ISA'; +@ISA = 'Tie::RefHash'; + +sub STORE { + my($s, $k, $v) = @_; + if (ref($v) eq 'HASH' and not tied %$v) { + my @elems = %$v; + tie %$v, ref($s), @elems; + } + $s->SUPER::STORE($k, $v); +} + +1; +package Tie::Scalar; + +our $VERSION = '1.04'; + + +use Carp; +use warnings::register; + +sub new { + my $pkg = shift; + $pkg->TIESCALAR(@_); +} + +# "Grandfather" the new, a la Tie::Hash + +sub TIESCALAR { + my $pkg = shift; + my $pkg_new = $pkg -> can ('new'); + + if ($pkg_new and $pkg ne __PACKAGE__) { + my $my_new = __PACKAGE__ -> can ('new'); + if ($pkg_new == $my_new) { + # + # Prevent recursion + # + croak "$pkg must define either a TIESCALAR() or a new() method"; + } + + warnings::warnif ("WARNING: calling ${pkg}->new since " . + "${pkg}->TIESCALAR is missing"); + $pkg -> new (@_); + } + else { + croak "$pkg doesn't define a TIESCALAR method"; + } +} + +sub FETCH { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a FETCH method"; +} + +sub STORE { + my $pkg = ref $_[0]; + croak "$pkg doesn't define a STORE method"; +} + +# +# The Tie::StdScalar package provides scalars that behave exactly like +# Perl's built-in scalars. Good base to inherit from, if you're only going to +# tweak a small bit. +# +package Tie::StdScalar; +@ISA = qw(Tie::Scalar); + +sub TIESCALAR { + my $class = shift; + my $instance = @_ ? shift : undef; + return bless \$instance => $class; +} + +sub FETCH { + return ${$_[0]}; +} + +sub STORE { + ${$_[0]} = $_[1]; +} + +sub DESTROY { + undef ${$_[0]}; +} + +1; +package DBM_Filter::null ; + +use strict; +use warnings; + +our $VERSION = '0.03'; + +sub Store +{ + no warnings 'uninitialized'; + $_ .= "\x00" ; +} + +sub Fetch +{ + no warnings 'uninitialized'; + s/\x00$// ; +} + +1; + +__END__ + +package DBM_Filter::compress ; + +use strict; +use warnings; +use Carp; + +our $VERSION = '0.03'; + +BEGIN +{ + eval { require Compress::Zlib; Compress::Zlib->import() }; + + croak "Compress::Zlib module not found.\n" + if $@; +} + + + +sub Store { $_ = compress($_) } +sub Fetch { $_ = uncompress($_) } + +1; + +__END__ + +package DBM_Filter::int32 ; + +use strict; +use warnings; + +our $VERSION = '0.03'; + +# todo get Filter to figure endian. + +sub Store +{ + $_ = 0 if ! defined $_ || $_ eq "" ; + $_ = pack("i", $_); +} + +sub Fetch +{ + no warnings 'uninitialized'; + $_ = unpack("i", $_); +} + +1; + +__END__ + +package DBM_Filter::utf8 ; + +use strict; +use warnings; +use Carp; + +our $VERSION = '0.03'; + +BEGIN +{ + eval { require Encode; }; + + croak "Encode module not found.\n" + if $@; +} + +sub Store { $_ = Encode::encode_utf8($_) if defined $_ } + +sub Fetch { $_ = Encode::decode_utf8($_) if defined $_ } + +1; + +__END__ + +package DBM_Filter::encode ; + +use strict; +use warnings; +use Carp; + +our $VERSION = '0.03'; + +BEGIN +{ + eval { require Encode; }; + + croak "Encode module not found.\n" + if $@; +} + + +sub Filter +{ + my $encoding_name = shift || "utf8"; + + my $encoding = Encode::find_encoding($encoding_name) ; + + croak "Encoding '$encoding_name' is not available" + unless $encoding; + + return { + Store => sub { + $_ = $encoding->encode($_) + if defined $_ ; + }, + Fetch => sub { + $_ = $encoding->decode($_) + if defined $_ ; + } + } ; +} + +1; + +__END__ + +### the gnu tar specification: +### http://www.gnu.org/software/tar/manual/tar.html +### +### and the pax format spec, which tar derives from: +### http://www.opengroup.org/onlinepubs/007904975/utilities/pax.html + +package Archive::Tar; +require 5.005_03; + +use Cwd; +use IO::Zlib; +use IO::File; +use Carp qw(carp croak); +use File::Spec (); +use File::Spec::Unix (); +use File::Path (); + +use Archive::Tar::File; +use Archive::Tar::Constant; + +require Exporter; + +use strict; +use vars qw[$DEBUG $error $VERSION $WARN $FOLLOW_SYMLINK $CHOWN $CHMOD + $DO_NOT_USE_PREFIX $HAS_PERLIO $HAS_IO_STRING $SAME_PERMISSIONS + $INSECURE_EXTRACT_MODE $ZERO_PAD_NUMBERS @ISA @EXPORT $RESOLVE_SYMLINK + ]; + +@ISA = qw[Exporter]; +@EXPORT = qw[ COMPRESS_GZIP COMPRESS_BZIP ]; +$DEBUG = 0; +$WARN = 1; +$FOLLOW_SYMLINK = 0; +$VERSION = "2.30"; +$CHOWN = 1; +$CHMOD = 1; +$SAME_PERMISSIONS = $> == 0 ? 1 : 0; +$DO_NOT_USE_PREFIX = 0; +$INSECURE_EXTRACT_MODE = 0; +$ZERO_PAD_NUMBERS = 0; +$RESOLVE_SYMLINK = $ENV{'PERL5_AT_RESOLVE_SYMLINK'} || 'speed'; + +BEGIN { + use Config; + $HAS_PERLIO = $Config::Config{useperlio}; + + ### try and load IO::String anyway, so you can dynamically + ### switch between perlio and IO::String + $HAS_IO_STRING = eval { + require IO::String; + import IO::String; + 1; + } || 0; +} + + +my $tmpl = { + _data => [ ], + _file => 'Unknown', +}; + +### install get/set accessors for this object. +for my $key ( keys %$tmpl ) { + no strict 'refs'; + *{__PACKAGE__."::$key"} = sub { + my $self = shift; + $self->{$key} = $_[0] if @_; + return $self->{$key}; + } +} + +sub new { + my $class = shift; + $class = ref $class if ref $class; + + ### copying $tmpl here since a shallow copy makes it use the + ### same aref, causing for files to remain in memory always. + my $obj = bless { _data => [ ], _file => 'Unknown', _error => '' }, $class; + + if (@_) { + unless ( $obj->read( @_ ) ) { + $obj->_error(qq[No data could be read from file]); + return; + } + } + + return $obj; +} + + +sub read { + my $self = shift; + my $file = shift; + my $gzip = shift || 0; + my $opts = shift || {}; + + unless( defined $file ) { + $self->_error( qq[No file to read from!] ); + return; + } else { + $self->_file( $file ); + } + + my $handle = $self->_get_handle($file, $gzip, READ_ONLY->( ZLIB ) ) + or return; + + my $data = $self->_read_tar( $handle, $opts ) or return; + + $self->_data( $data ); + + return wantarray ? @$data : scalar @$data; +} + +sub _get_handle { + my $self = shift; + my $file = shift; return unless defined $file; + my $compress = shift || 0; + my $mode = shift || READ_ONLY->( ZLIB ); # default to read only + + ### Check if file is a file handle or IO glob + if ( ref $file ) { + return $file if eval{ *$file{IO} }; + return $file if eval{ $file->isa(q{IO::Handle}) }; + $file = q{}.$file; + } + + ### get a FH opened to the right class, so we can use it transparently + ### throughout the program + my $fh; + { ### reading magic only makes sense if we're opening a file for + ### reading. otherwise, just use what the user requested. + my $magic = ''; + if( MODE_READ->($mode) ) { + open my $tmp, $file or do { + $self->_error( qq[Could not open '$file' for reading: $!] ); + return; + }; + + ### read the first 4 bites of the file to figure out which class to + ### use to open the file. + sysread( $tmp, $magic, 4 ); + close $tmp; + } + + ### is it bzip? + ### if you asked specifically for bzip compression, or if we're in + ### read mode and the magic numbers add up, use bzip + if( BZIP and ( + ($compress eq COMPRESS_BZIP) or + ( MODE_READ->($mode) and $magic =~ BZIP_MAGIC_NUM ) + ) + ) { + + ### different reader/writer modules, different error vars... sigh + if( MODE_READ->($mode) ) { + $fh = IO::Uncompress::Bunzip2->new( $file, MultiStream => 1 ) or do { + $self->_error( qq[Could not read '$file': ] . + $IO::Uncompress::Bunzip2::Bunzip2Error + ); + return; + }; + + } else { + $fh = IO::Compress::Bzip2->new( $file ) or do { + $self->_error( qq[Could not write to '$file': ] . + $IO::Compress::Bzip2::Bzip2Error + ); + return; + }; + } + + ### is it gzip? + ### if you asked for compression, if you wanted to read or the gzip + ### magic number is present (redundant with read) + } elsif( ZLIB and ( + $compress or MODE_READ->($mode) or $magic =~ GZIP_MAGIC_NUM + ) + ) { + $fh = IO::Zlib->new; + + unless( $fh->open( $file, $mode ) ) { + $self->_error(qq[Could not create filehandle for '$file': $!]); + return; + } + + ### is it plain tar? + } else { + $fh = IO::File->new; + + unless( $fh->open( $file, $mode ) ) { + $self->_error(qq[Could not create filehandle for '$file': $!]); + return; + } + + ### enable bin mode on tar archives + binmode $fh; + } + } + + return $fh; +} + + +sub _read_tar { + my $self = shift; + my $handle = shift or return; + my $opts = shift || {}; + + my $count = $opts->{limit} || 0; + my $filter = $opts->{filter}; + my $md5 = $opts->{md5} || 0; # cdrake + my $filter_cb = $opts->{filter_cb}; + my $extract = $opts->{extract} || 0; + + ### set a cap on the amount of files to extract ### + my $limit = 0; + $limit = 1 if $count > 0; + + my $tarfile = [ ]; + my $chunk; + my $read = 0; + my $real_name; # to set the name of a file when + # we're encountering @longlink + my $data; + + LOOP: + while( $handle->read( $chunk, HEAD ) ) { + ### IO::Zlib doesn't support this yet + my $offset; + if ( ref($handle) ne 'IO::Zlib' ) { + local $@; + $offset = eval { tell $handle } || 'unknown'; + $@ = ''; + } + else { + $offset = 'unknown'; + } + + unless( $read++ ) { + my $gzip = GZIP_MAGIC_NUM; + if( $chunk =~ /$gzip/ ) { + $self->_error( qq[Cannot read compressed format in tar-mode] ); + return; + } + + ### size is < HEAD, which means a corrupted file, as the minimum + ### length is _at least_ HEAD + if (length $chunk != HEAD) { + $self->_error( qq[Cannot read enough bytes from the tarfile] ); + return; + } + } + + ### if we can't read in all bytes... ### + last if length $chunk != HEAD; + + ### Apparently this should really be two blocks of 512 zeroes, + ### but GNU tar sometimes gets it wrong. See comment in the + ### source code (tar.c) to GNU cpio. + next if $chunk eq TAR_END; + + ### according to the posix spec, the last 12 bytes of the header are + ### null bytes, to pad it to a 512 byte block. That means if these + ### bytes are NOT null bytes, it's a corrupt header. See: + ### www.koders.com/c/fidCE473AD3D9F835D690259D60AD5654591D91D5BA.aspx + ### line 111 + { my $nulls = join '', "\0" x 12; + unless( $nulls eq substr( $chunk, 500, 12 ) ) { + $self->_error( qq[Invalid header block at offset $offset] ); + next LOOP; + } + } + + ### pass the realname, so we can set it 'proper' right away + ### some of the heuristics are done on the name, so important + ### to set it ASAP + my $entry; + { my %extra_args = (); + $extra_args{'name'} = $$real_name if defined $real_name; + + unless( $entry = Archive::Tar::File->new( chunk => $chunk, + %extra_args ) + ) { + $self->_error( qq[Couldn't read chunk at offset $offset] ); + next LOOP; + } + } + + ### ignore labels: + ### http://www.gnu.org/software/tar/manual/html_chapter/Media.html#SEC159 + next if $entry->is_label; + + if( length $entry->type and ($entry->is_file || $entry->is_longlink) ) { + + if ( $entry->is_file && !$entry->validate ) { + ### sometimes the chunk is rather fux0r3d and a whole 512 + ### bytes ends up in the ->name area. + ### clean it up, if need be + my $name = $entry->name; + $name = substr($name, 0, 100) if length $name > 100; + $name =~ s/\n/ /g; + + $self->_error( $name . qq[: checksum error] ); + next LOOP; + } + + my $block = BLOCK_SIZE->( $entry->size ); + + $data = $entry->get_content_by_ref; + + my $skip = 0; + my $ctx; # cdrake + ### skip this entry if we're filtering + + if($md5) { # cdrake + $ctx = Digest::MD5->new; # cdrake + $skip=5; # cdrake + + } elsif ($filter && $entry->name !~ $filter) { + $skip = 1; + + } elsif ($filter_cb && ! $filter_cb->($entry)) { + $skip = 2; + + ### skip this entry if it's a pax header. This is a special file added + ### by, among others, git-generated tarballs. It holds comments and is + ### not meant for extracting. See #38932: pax_global_header extracted + } elsif ( $entry->name eq PAX_HEADER or $entry->type =~ /^(x|g)$/ ) { + $skip = 3; + } + + if ($skip) { + # + # Since we're skipping, do not allocate memory for the + # whole file. Read it 64 BLOCKS at a time. Do not + # complete the skip yet because maybe what we read is a + # longlink and it won't get skipped after all + # + my $amt = $block; + my $fsz=$entry->size; # cdrake + while ($amt > 0) { + $$data = ''; + my $this = 64 * BLOCK; + $this = $amt if $this > $amt; + if( $handle->read( $$data, $this ) < $this ) { + $self->_error( qq[Read error on tarfile (missing data) ']. + $entry->full_path ."' at offset $offset" ); + next LOOP; + } + $amt -= $this; + $fsz -= $this; # cdrake + substr ($$data, $fsz) = "" if ($fsz<0); # remove external junk prior to md5 # cdrake + $ctx->add($$data) if($skip==5); # cdrake + } + $$data = $ctx->hexdigest if($skip==5 && !$entry->is_longlink && !$entry->is_unknown && !$entry->is_label ) ; # cdrake + } else { + + ### just read everything into memory + ### can't do lazy loading since IO::Zlib doesn't support 'seek' + ### this is because Compress::Zlib doesn't support it =/ + ### this reads in the whole data in one read() call. + if ( $handle->read( $$data, $block ) < $block ) { + $self->_error( qq[Read error on tarfile (missing data) ']. + $entry->full_path ."' at offset $offset" ); + next LOOP; + } + ### throw away trailing garbage ### + substr ($$data, $entry->size) = "" if defined $$data; + } + + ### part II of the @LongLink munging -- need to do /after/ + ### the checksum check. + if( $entry->is_longlink ) { + ### weird thing in tarfiles -- if the file is actually a + ### @LongLink, the data part seems to have a trailing ^@ + ### (unprintable) char. to display, pipe output through less. + ### but that doesn't *always* happen.. so check if the last + ### character is a control character, and if so remove it + ### at any rate, we better remove that character here, or tests + ### like 'eq' and hash lookups based on names will SO not work + ### remove it by calculating the proper size, and then + ### tossing out everything that's longer than that size. + + ### count number of nulls + my $nulls = $$data =~ tr/\0/\0/; + + ### cut data + size by that many bytes + $entry->size( $entry->size - $nulls ); + substr ($$data, $entry->size) = ""; + } + } + + ### clean up of the entries.. posix tar /apparently/ has some + ### weird 'feature' that allows for filenames > 255 characters + ### they'll put a header in with as name '././@LongLink' and the + ### contents will be the name of the /next/ file in the archive + ### pretty crappy and kludgy if you ask me + + ### set the name for the next entry if this is a @LongLink; + ### this is one ugly hack =/ but needed for direct extraction + if( $entry->is_longlink ) { + $real_name = $data; + next LOOP; + } elsif ( defined $real_name ) { + $entry->name( $$real_name ); + $entry->prefix(''); + undef $real_name; + } + + if ($filter && $entry->name !~ $filter) { + next LOOP; + + } elsif ($filter_cb && ! $filter_cb->($entry)) { + next LOOP; + + ### skip this entry if it's a pax header. This is a special file added + ### by, among others, git-generated tarballs. It holds comments and is + ### not meant for extracting. See #38932: pax_global_header extracted + } elsif ( $entry->name eq PAX_HEADER or $entry->type =~ /^(x|g)$/ ) { + next LOOP; + } + + if ( $extract && !$entry->is_longlink + && !$entry->is_unknown + && !$entry->is_label ) { + $self->_extract_file( $entry ) or return; + } + + ### Guard against tarfiles with garbage at the end + last LOOP if $entry->name eq ''; + + ### push only the name on the rv if we're extracting + ### -- for extract_archive + push @$tarfile, ($extract ? $entry->name : $entry); + + if( $limit ) { + $count-- unless $entry->is_longlink || $entry->is_dir; + last LOOP unless $count; + } + } continue { + undef $data; + } + + return $tarfile; +} + + +sub contains_file { + my $self = shift; + my $full = shift; + + return unless defined $full; + + ### don't warn if the entry isn't there.. that's what this function + ### is for after all. + local $WARN = 0; + return 1 if $self->_find_entry($full); + return; +} + + +sub extract { + my $self = shift; + my @args = @_; + my @files; + my $hashmap; + + # use the speed optimization for all extracted files + local($self->{cwd}) = cwd() unless $self->{cwd}; + + ### you requested the extraction of only certain files + if( @args ) { + for my $file ( @args ) { + + ### it's already an object? + if( UNIVERSAL::isa( $file, 'Archive::Tar::File' ) ) { + push @files, $file; + next; + + ### go find it then + } else { + + # create hash-map once to speed up lookup + $hashmap = $hashmap || { + map { $_->full_path, $_ } @{$self->_data} + }; + + if (exists $hashmap->{$file}) { + ### we found the file you're looking for + push @files, $hashmap->{$file}; + } else { + return $self->_error( + qq[Could not find '$file' in archive] ); + } + } + } + + ### just grab all the file items + } else { + @files = $self->get_files; + } + + ### nothing found? that's an error + unless( scalar @files ) { + $self->_error( qq[No files found for ] . $self->_file ); + return; + } + + ### now extract them + for my $entry ( @files ) { + unless( $self->_extract_file( $entry ) ) { + $self->_error(q[Could not extract ']. $entry->full_path .q['] ); + return; + } + } + + return @files; +} + + +sub extract_file { + my $self = shift; + my $file = shift; return unless defined $file; + my $alt = shift; + + my $entry = $self->_find_entry( $file ) + or $self->_error( qq[Could not find an entry for '$file'] ), return; + + return $self->_extract_file( $entry, $alt ); +} + +sub _extract_file { + my $self = shift; + my $entry = shift or return; + my $alt = shift; + + ### you wanted an alternate extraction location ### + my $name = defined $alt ? $alt : $entry->full_path; + + ### splitpath takes a bool at the end to indicate + ### that it's splitting a dir + my ($vol,$dirs,$file); + if ( defined $alt ) { # It's a local-OS path + ($vol,$dirs,$file) = File::Spec->splitpath( $alt, + $entry->is_dir ); + } else { + ($vol,$dirs,$file) = File::Spec::Unix->splitpath( $name, + $entry->is_dir ); + } + + my $dir; + ### is $name an absolute path? ### + if( $vol || File::Spec->file_name_is_absolute( $dirs ) ) { + + ### absolute names are not allowed to be in tarballs under + ### strict mode, so only allow it if a user tells us to do it + if( not defined $alt and not $INSECURE_EXTRACT_MODE ) { + $self->_error( + q[Entry ']. $entry->full_path .q[' is an absolute path. ]. + q[Not extracting absolute paths under SECURE EXTRACT MODE] + ); + return; + } + + ### user asked us to, it's fine. + $dir = File::Spec->catpath( $vol, $dirs, "" ); + + ### it's a relative path ### + } else { + my $cwd = (ref $self and defined $self->{cwd}) + ? $self->{cwd} + : cwd(); + + my @dirs = defined $alt + ? File::Spec->splitdir( $dirs ) # It's a local-OS path + : File::Spec::Unix->splitdir( $dirs ); # it's UNIX-style, likely + # straight from the tarball + + if( not defined $alt and + not $INSECURE_EXTRACT_MODE + ) { + + ### paths that leave the current directory are not allowed under + ### strict mode, so only allow it if a user tells us to do this. + if( grep { $_ eq '..' } @dirs ) { + + $self->_error( + q[Entry ']. $entry->full_path .q[' is attempting to leave ]. + q[the current working directory. Not extracting under ]. + q[SECURE EXTRACT MODE] + ); + return; + } + + ### the archive may be asking us to extract into a symlink. This + ### is not sane and a possible security issue, as outlined here: + ### https://rt.cpan.org/Ticket/Display.html?id=30380 + ### https://bugzilla.redhat.com/show_bug.cgi?id=295021 + ### https://issues.rpath.com/browse/RPL-1716 + my $full_path = $cwd; + for my $d ( @dirs ) { + $full_path = File::Spec->catdir( $full_path, $d ); + + ### we've already checked this one, and it's safe. Move on. + next if ref $self and $self->{_link_cache}->{$full_path}; + + if( -l $full_path ) { + my $to = readlink $full_path; + my $diag = "symlinked directory ($full_path => $to)"; + + $self->_error( + q[Entry ']. $entry->full_path .q[' is attempting to ]. + qq[extract to a $diag. This is considered a security ]. + q[vulnerability and not allowed under SECURE EXTRACT ]. + q[MODE] + ); + return; + } + + ### XXX keep a cache if possible, so the stats become cheaper: + $self->{_link_cache}->{$full_path} = 1 if ref $self; + } + } + + ### '.' is the directory delimiter on VMS, which has to be escaped + ### or changed to '_' on vms. vmsify is used, because older versions + ### of vmspath do not handle this properly. + ### Must not add a '/' to an empty directory though. + map { length() ? VMS::Filespec::vmsify($_.'/') : $_ } @dirs if ON_VMS; + + my ($cwd_vol,$cwd_dir,$cwd_file) + = File::Spec->splitpath( $cwd ); + my @cwd = File::Spec->splitdir( $cwd_dir ); + push @cwd, $cwd_file if length $cwd_file; + + ### We need to pass '' as the last element to catpath. Craig Berry + ### explains why (msgid ): + ### The root problem is that splitpath on UNIX always returns the + ### final path element as a file even if it is a directory, and of + ### course there is no way it can know the difference without checking + ### against the filesystem, which it is documented as not doing. When + ### you turn around and call catpath, on VMS you have to know which bits + ### are directory bits and which bits are file bits. In this case we + ### know the result should be a directory. I had thought you could omit + ### the file argument to catpath in such a case, but apparently on UNIX + ### you can't. + $dir = File::Spec->catpath( + $cwd_vol, File::Spec->catdir( @cwd, @dirs ), '' + ); + + ### catdir() returns undef if the path is longer than 255 chars on + ### older VMS systems. + unless ( defined $dir ) { + $^W && $self->_error( qq[Could not compose a path for '$dirs'\n] ); + return; + } + + } + + if( -e $dir && !-d _ ) { + $^W && $self->_error( qq['$dir' exists, but it's not a directory!\n] ); + return; + } + + unless ( -d _ ) { + eval { File::Path::mkpath( $dir, 0, 0777 ) }; + if( $@ ) { + my $fp = $entry->full_path; + $self->_error(qq[Could not create directory '$dir' for '$fp': $@]); + return; + } + + ### XXX chown here? that might not be the same as in the archive + ### as we're only chown'ing to the owner of the file we're extracting + ### not to the owner of the directory itself, which may or may not + ### be another entry in the archive + ### Answer: no, gnu tar doesn't do it either, it'd be the wrong + ### way to go. + #if( $CHOWN && CAN_CHOWN ) { + # chown $entry->uid, $entry->gid, $dir or + # $self->_error( qq[Could not set uid/gid on '$dir'] ); + #} + } + + ### we're done if we just needed to create a dir ### + return 1 if $entry->is_dir; + + my $full = File::Spec->catfile( $dir, $file ); + + if( $entry->is_unknown ) { + $self->_error( qq[Unknown file type for file '$full'] ); + return; + } + + ### If a file system already contains a block device with the same name as + ### the being extracted regular file, we would write the file's content + ### to the block device. So remove the existing file (block device) now. + ### If an archive contains multiple same-named entries, the last one + ### should replace the previous ones. So remove the old file now. + ### If the old entry is a symlink to a file outside of the CWD, the new + ### entry would create a file there. This is CVE-2018-12015 + ### . + if (-l $full || -e _) { + if (!unlink $full) { + $self->_error( qq[Could not remove old file '$full': $!] ); + return; + } + } + if( length $entry->type && $entry->is_file ) { + my $fh = IO::File->new; + $fh->open( $full, '>' ) or ( + $self->_error( qq[Could not open file '$full': $!] ), + return + ); + + if( $entry->size ) { + binmode $fh; + syswrite $fh, $entry->data or ( + $self->_error( qq[Could not write data to '$full'] ), + return + ); + } + + close $fh or ( + $self->_error( qq[Could not close file '$full'] ), + return + ); + + } else { + $self->_make_special_file( $entry, $full ) or return; + } + + ### only update the timestamp if it's not a symlink; that will change the + ### timestamp of the original. This addresses bug #33669: Could not update + ### timestamp warning on symlinks + if( not -l $full ) { + utime time, $entry->mtime - TIME_OFFSET, $full or + $self->_error( qq[Could not update timestamp] ); + } + + if( $CHOWN && CAN_CHOWN->() and not -l $full ) { + chown $entry->uid, $entry->gid, $full or + $self->_error( qq[Could not set uid/gid on '$full'] ); + } + + ### only chmod if we're allowed to, but never chmod symlinks, since they'll + ### change the perms on the file they're linking too... + if( $CHMOD and not -l $full ) { + my $mode = $entry->mode; + unless ($SAME_PERMISSIONS) { + $mode &= ~(oct(7000) | umask); + } + chmod $mode, $full or + $self->_error( qq[Could not chown '$full' to ] . $entry->mode ); + } + + return 1; +} + +sub _make_special_file { + my $self = shift; + my $entry = shift or return; + my $file = shift; return unless defined $file; + + my $err; + + if( $entry->is_symlink ) { + my $fail; + if( ON_UNIX ) { + symlink( $entry->linkname, $file ) or $fail++; + + } else { + $self->_extract_special_file_as_plain_file( $entry, $file ) + or $fail++; + } + + $err = qq[Making symbolic link '$file' to '] . + $entry->linkname .q[' failed] if $fail; + + } elsif ( $entry->is_hardlink ) { + my $fail; + if( ON_UNIX ) { + link( $entry->linkname, $file ) or $fail++; + + } else { + $self->_extract_special_file_as_plain_file( $entry, $file ) + or $fail++; + } + + $err = qq[Making hard link from '] . $entry->linkname . + qq[' to '$file' failed] if $fail; + + } elsif ( $entry->is_fifo ) { + ON_UNIX && !system('mknod', $file, 'p') or + $err = qq[Making fifo ']. $entry->name .qq[' failed]; + + } elsif ( $entry->is_blockdev or $entry->is_chardev ) { + my $mode = $entry->is_blockdev ? 'b' : 'c'; + + ON_UNIX && !system('mknod', $file, $mode, + $entry->devmajor, $entry->devminor) or + $err = qq[Making block device ']. $entry->name .qq[' (maj=] . + $entry->devmajor . qq[ min=] . $entry->devminor . + qq[) failed.]; + + } elsif ( $entry->is_socket ) { + ### the original doesn't do anything special for sockets.... ### + 1; + } + + return $err ? $self->_error( $err ) : 1; +} + +### don't know how to make symlinks, let's just extract the file as +### a plain file +sub _extract_special_file_as_plain_file { + my $self = shift; + my $entry = shift or return; + my $file = shift; return unless defined $file; + + my $err; + TRY: { + my $orig = $self->_find_entry( $entry->linkname, $entry ); + + unless( $orig ) { + $err = qq[Could not find file '] . $entry->linkname . + qq[' in memory.]; + last TRY; + } + + ### clone the entry, make it appear as a normal file ### + my $clone = $orig->clone; + $clone->_downgrade_to_plainfile; + $self->_extract_file( $clone, $file ) or last TRY; + + return 1; + } + + return $self->_error($err); +} + + +sub list_files { + my $self = shift; + my $aref = shift || [ ]; + + unless( $self->_data ) { + $self->read() or return; + } + + if( @$aref == 0 or ( @$aref == 1 and $aref->[0] eq 'name' ) ) { + return map { $_->full_path } @{$self->_data}; + } else { + + #my @rv; + #for my $obj ( @{$self->_data} ) { + # push @rv, { map { $_ => $obj->$_() } @$aref }; + #} + #return @rv; + + ### this does the same as the above.. just needs a +{ } + ### to make sure perl doesn't confuse it for a block + return map { my $o=$_; + +{ map { $_ => $o->$_() } @$aref } + } @{$self->_data}; + } +} + +sub _find_entry { + my $self = shift; + my $file = shift; + + unless( defined $file ) { + $self->_error( qq[No file specified] ); + return; + } + + ### it's an object already + return $file if UNIVERSAL::isa( $file, 'Archive::Tar::File' ); + +seach_entry: + if($self->_data){ + for my $entry ( @{$self->_data} ) { + my $path = $entry->full_path; + return $entry if $path eq $file; + } + } + + if($Archive::Tar::RESOLVE_SYMLINK!~/none/){ + if(my $link_entry = shift()){#fallback mode when symlinks are using relative notations ( ../a/./b/text.bin ) + $file = _symlinks_resolver( $link_entry->name, $file ); + goto seach_entry if $self->_data; + + #this will be slower than never, but won't failed! + + my $iterargs = $link_entry->{'_archive'}; + if($Archive::Tar::RESOLVE_SYMLINK=~/speed/ && @$iterargs==3){ + #faster but whole archive will be read in memory + #read whole archive and share data + my $archive = Archive::Tar->new; + $archive->read( @$iterargs ); + push @$iterargs, $archive; #take a trace for destruction + if($archive->_data){ + $self->_data( $archive->_data ); + goto seach_entry; + } + }#faster + + {#slower but lower memory usage + # $iterargs = [$filename, $compressed, $opts]; + my $next = Archive::Tar->iter( @$iterargs ); + while(my $e = $next->()){ + if($e->full_path eq $file){ + undef $next; + return $e; + } + } + }#slower + } + } + + $self->_error( qq[No such file in archive: '$file'] ); + return; +} + + +sub get_files { + my $self = shift; + + return @{ $self->_data } unless @_; + + my @list; + for my $file ( @_ ) { + push @list, grep { defined } $self->_find_entry( $file ); + } + + return @list; +} + + +sub get_content { + my $self = shift; + my $entry = $self->_find_entry( shift ) or return; + + return $entry->data; +} + + +sub replace_content { + my $self = shift; + my $entry = $self->_find_entry( shift ) or return; + + return $entry->replace_content( shift ); +} + + +sub rename { + my $self = shift; + my $file = shift; return unless defined $file; + my $new = shift; return unless defined $new; + + my $entry = $self->_find_entry( $file ) or return; + + return $entry->rename( $new ); +} + + +sub chmod { + my $self = shift; + my $file = shift; return unless defined $file; + my $mode = shift; return unless defined $mode && $mode =~ /^[0-7]{1,4}$/; + my @args = ("$mode"); + + my $entry = $self->_find_entry( $file ) or return; + my $x = $entry->chmod( @args ); + return $x; +} + + +sub chown { + my $self = shift; + my $file = shift; return unless defined $file; + my $uname = shift; return unless defined $uname; + my @args = ($uname); + push(@args, shift); + + my $entry = $self->_find_entry( $file ) or return; + my $x = $entry->chown( @args ); + return $x; +} + + +sub remove { + my $self = shift; + my @list = @_; + + my %seen = map { $_->full_path => $_ } @{$self->_data}; + delete $seen{ $_ } for @list; + + $self->_data( [values %seen] ); + + return values %seen; +} + + +sub clear { + my $self = shift or return; + + $self->_data( [] ); + $self->_file( '' ); + + return 1; +} + + + +sub write { + my $self = shift; + my $file = shift; $file = '' unless defined $file; + my $gzip = shift || 0; + my $ext_prefix = shift; $ext_prefix = '' unless defined $ext_prefix; + my $dummy = ''; + + ### only need a handle if we have a file to print to ### + my $handle = length($file) + ? ( $self->_get_handle($file, $gzip, WRITE_ONLY->($gzip) ) + or return ) + : $HAS_PERLIO ? do { open my $h, '>', \$dummy; $h } + : $HAS_IO_STRING ? IO::String->new + : __PACKAGE__->no_string_support(); + + ### Addresses: #41798: Nonempty $\ when writing a TAR file produces a + ### corrupt TAR file. Must clear out $\ to make sure no garbage is + ### printed to the archive + local $\; + + for my $entry ( @{$self->_data} ) { + ### entries to be written to the tarfile ### + my @write_me; + + ### only now will we change the object to reflect the current state + ### of the name and prefix fields -- this needs to be limited to + ### write() only! + my $clone = $entry->clone; + + + ### so, if you don't want use to use the prefix, we'll stuff + ### everything in the name field instead + if( $DO_NOT_USE_PREFIX ) { + + ### you might have an extended prefix, if so, set it in the clone + ### XXX is ::Unix right? + $clone->name( length $ext_prefix + ? File::Spec::Unix->catdir( $ext_prefix, + $clone->full_path) + : $clone->full_path ); + $clone->prefix( '' ); + + ### otherwise, we'll have to set it properly -- prefix part in the + ### prefix and name part in the name field. + } else { + + ### split them here, not before! + my ($prefix,$name) = $clone->_prefix_and_file( $clone->full_path ); + + ### you might have an extended prefix, if so, set it in the clone + ### XXX is ::Unix right? + $prefix = File::Spec::Unix->catdir( $ext_prefix, $prefix ) + if length $ext_prefix; + + $clone->prefix( $prefix ); + $clone->name( $name ); + } + + ### names are too long, and will get truncated if we don't add a + ### '@LongLink' file... + my $make_longlink = ( length($clone->name) > NAME_LENGTH or + length($clone->prefix) > PREFIX_LENGTH + ) || 0; + + ### perhaps we need to make a longlink file? + if( $make_longlink ) { + my $longlink = Archive::Tar::File->new( + data => LONGLINK_NAME, + $clone->full_path, + { type => LONGLINK } + ); + + unless( $longlink ) { + $self->_error( qq[Could not create 'LongLink' entry for ] . + qq[oversize file '] . $clone->full_path ."'" ); + return; + }; + + push @write_me, $longlink; + } + + push @write_me, $clone; + + ### write the one, optionally 2 a::t::file objects to the handle + for my $clone (@write_me) { + + ### if the file is a symlink, there are 2 options: + ### either we leave the symlink intact, but then we don't write any + ### data OR we follow the symlink, which means we actually make a + ### copy. if we do the latter, we have to change the TYPE of the + ### clone to 'FILE' + my $link_ok = $clone->is_symlink && $Archive::Tar::FOLLOW_SYMLINK; + my $data_ok = !$clone->is_symlink && $clone->has_content; + + ### downgrade to a 'normal' file if it's a symlink we're going to + ### treat as a regular file + $clone->_downgrade_to_plainfile if $link_ok; + + ### get the header for this block + my $header = $self->_format_tar_entry( $clone ); + unless( $header ) { + $self->_error(q[Could not format header for: ] . + $clone->full_path ); + return; + } + + unless( print $handle $header ) { + $self->_error(q[Could not write header for: ] . + $clone->full_path); + return; + } + + if( $link_ok or $data_ok ) { + unless( print $handle $clone->data ) { + $self->_error(q[Could not write data for: ] . + $clone->full_path); + return; + } + + ### pad the end of the clone if required ### + print $handle TAR_PAD->( $clone->size ) if $clone->size % BLOCK + } + + } ### done writing these entries + } + + ### write the end markers ### + print $handle TAR_END x 2 or + return $self->_error( qq[Could not write tar end markers] ); + + ### did you want it written to a file, or returned as a string? ### + my $rv = length($file) ? 1 + : $HAS_PERLIO ? $dummy + : do { seek $handle, 0, 0; local $/; <$handle> }; + + ### make sure to close the handle if we created it + if ( $file ne $handle ) { + unless( close $handle ) { + $self->_error( qq[Could not write tar] ); + return; + } + } + + return $rv; +} + +sub _format_tar_entry { + my $self = shift; + my $entry = shift or return; + my $ext_prefix = shift; $ext_prefix = '' unless defined $ext_prefix; + my $no_prefix = shift || 0; + + my $file = $entry->name; + my $prefix = $entry->prefix; $prefix = '' unless defined $prefix; + + ### remove the prefix from the file name + ### not sure if this is still needed --kane + ### no it's not -- Archive::Tar::File->_new_from_file will take care of + ### this for us. Even worse, this would break if we tried to add a file + ### like x/x. + #if( length $prefix ) { + # $file =~ s/^$match//; + #} + + $prefix = File::Spec::Unix->catdir($ext_prefix, $prefix) + if length $ext_prefix; + + ### not sure why this is... ### + my $l = PREFIX_LENGTH; # is ambiguous otherwise... + substr ($prefix, 0, -$l) = "" if length $prefix >= PREFIX_LENGTH; + + my $f1 = "%06o"; my $f2 = $ZERO_PAD_NUMBERS ? "%011o" : "%11o"; + + ### this might be optimizable with a 'changed' flag in the file objects ### + my $tar = pack ( + PACK, + $file, + + (map { sprintf( $f1, $entry->$_() ) } qw[mode uid gid]), + (map { sprintf( $f2, $entry->$_() ) } qw[size mtime]), + + "", # checksum field - space padded a bit down + + (map { $entry->$_() } qw[type linkname magic]), + + $entry->version || TAR_VERSION, + + (map { $entry->$_() } qw[uname gname]), + (map { sprintf( $f1, $entry->$_() ) } qw[devmajor devminor]), + + ($no_prefix ? '' : $prefix) + ); + + ### add the checksum ### + my $checksum_fmt = $ZERO_PAD_NUMBERS ? "%06o\0" : "%06o\0"; + substr($tar,148,7) = sprintf("%6o\0", unpack("%16C*",$tar)); + + return $tar; +} + + +sub add_files { + my $self = shift; + my @files = @_ or return; + + my @rv; + for my $file ( @files ) { + + ### you passed an Archive::Tar::File object + ### clone it so we don't accidentally have a reference to + ### an object from another archive + if( UNIVERSAL::isa( $file,'Archive::Tar::File' ) ) { + push @rv, $file->clone; + next; + } + + eval { + if( utf8::is_utf8( $file )) { + utf8::encode( $file ); + } + }; + + unless( -e $file || -l $file ) { + $self->_error( qq[No such file: '$file'] ); + next; + } + + my $obj = Archive::Tar::File->new( file => $file ); + unless( $obj ) { + $self->_error( qq[Unable to add file: '$file'] ); + next; + } + + push @rv, $obj; + } + + push @{$self->{_data}}, @rv; + + return @rv; +} + + +sub add_data { + my $self = shift; + my ($file, $data, $opt) = @_; + + my $obj = Archive::Tar::File->new( data => $file, $data, $opt ); + unless( $obj ) { + $self->_error( qq[Unable to add file: '$file'] ); + return; + } + + push @{$self->{_data}}, $obj; + + return $obj; +} + + +{ + $error = ''; + my $longmess; + + sub _error { + my $self = shift; + my $msg = $error = shift; + $longmess = Carp::longmess($error); + if (ref $self) { + $self->{_error} = $error; + $self->{_longmess} = $longmess; + } + + ### set Archive::Tar::WARN to 0 to disable printing + ### of errors + if( $WARN ) { + carp $DEBUG ? $longmess : $msg; + } + + return; + } + + sub error { + my $self = shift; + if (ref $self) { + return shift() ? $self->{_longmess} : $self->{_error}; + } else { + return shift() ? $longmess : $error; + } + } +} + + +sub setcwd { + my $self = shift; + my $cwd = shift; + + $self->{cwd} = $cwd; +} + + +sub create_archive { + my $class = shift; + + my $file = shift; return unless defined $file; + my $gzip = shift || 0; + my @files = @_; + + unless( @files ) { + return $class->_error( qq[Cowardly refusing to create empty archive!] ); + } + + my $tar = $class->new; + $tar->add_files( @files ); + return $tar->write( $file, $gzip ); +} + + + +sub iter { + my $class = shift; + my $filename = shift; + return unless defined $filename; + my $compressed = shift || 0; + my $opts = shift || {}; + + ### get a handle to read from. + my $handle = $class->_get_handle( + $filename, + $compressed, + READ_ONLY->( ZLIB ) + ) or return; + + my @data; + my $CONSTRUCT_ARGS = [ $filename, $compressed, $opts ]; + return sub { + return shift(@data) if @data; # more than one file returned? + return unless $handle; # handle exhausted? + + ### read data, should only return file + my $tarfile = $class->_read_tar($handle, { %$opts, limit => 1 }); + @data = @$tarfile if ref $tarfile && ref $tarfile eq 'ARRAY'; + if($Archive::Tar::RESOLVE_SYMLINK!~/none/){ + foreach(@data){ + #may refine this heuristic for ON_UNIX? + if($_->linkname){ + #is there a better slot to store/share it ? + $_->{'_archive'} = $CONSTRUCT_ARGS; + } + } + } + + ### return one piece of data + return shift(@data) if @data; + + ### data is exhausted, free the filehandle + undef $handle; + if(@$CONSTRUCT_ARGS == 4){ + #free archive in memory + undef $CONSTRUCT_ARGS->[-1]; + } + return; + }; +} + + +sub list_archive { + my $class = shift; + my $file = shift; return unless defined $file; + my $gzip = shift || 0; + + my $tar = $class->new($file, $gzip); + return unless $tar; + + return $tar->list_files( @_ ); +} + + +sub extract_archive { + my $class = shift; + my $file = shift; return unless defined $file; + my $gzip = shift || 0; + + my $tar = $class->new( ) or return; + + return $tar->read( $file, $gzip, { extract => 1 } ); +} + + +sub has_io_string { return $HAS_IO_STRING; } + + +sub has_perlio { return $HAS_PERLIO; } + + +sub has_zlib_support { return ZLIB } + + +sub has_bzip2_support { return BZIP } + + +sub can_handle_compressed_files { return ZLIB && BZIP ? 1 : 0 } + +sub no_string_support { + croak("You have to install IO::String to support writing archives to strings"); +} + +sub _symlinks_resolver{ + my ($src, $trg) = @_; + my @src = split /[\/\\]/, $src; + my @trg = split /[\/\\]/, $trg; + pop @src; #strip out current object name + if(@trg and $trg[0] eq ''){ + shift @trg; + #restart path from scratch + @src = ( ); + } + foreach my $part ( @trg ){ + next if $part eq '.'; #ignore current + if($part eq '..'){ + #got to parent + pop @src; + } + else{ + #append it + push @src, $part; + } + } + my $path = join('/', @src); + warn "_symlinks_resolver('$src','$trg') = $path" if $DEBUG; + return $path; +} + +1; + +__END__ + + +package Archive::Tar::Constant; + +BEGIN { + require Exporter; + + $VERSION = '2.30'; + @ISA = qw[Exporter]; + + require Time::Local if $^O eq "MacOS"; +} + +@EXPORT = Archive::Tar::Constant->_list_consts( __PACKAGE__ ); + +use strict; +use warnings; + +use constant FILE => 0; +use constant HARDLINK => 1; +use constant SYMLINK => 2; +use constant CHARDEV => 3; +use constant BLOCKDEV => 4; +use constant DIR => 5; +use constant FIFO => 6; +use constant SOCKET => 8; +use constant UNKNOWN => 9; +use constant LONGLINK => 'L'; +use constant LABEL => 'V'; + +use constant BUFFER => 4096; +use constant HEAD => 512; +use constant BLOCK => 512; + +use constant COMPRESS_GZIP => 9; +use constant COMPRESS_BZIP => 'bzip2'; + +use constant BLOCK_SIZE => sub { my $n = int($_[0]/BLOCK); $n++ if $_[0] % BLOCK; $n * BLOCK }; +use constant TAR_PAD => sub { my $x = shift || return; return "\0" x (BLOCK - ($x % BLOCK) ) }; +use constant TAR_END => "\0" x BLOCK; + +use constant READ_ONLY => sub { shift() ? 'rb' : 'r' }; +use constant WRITE_ONLY => sub { $_[0] ? 'wb' . shift : 'w' }; +use constant MODE_READ => sub { $_[0] =~ /^r/ ? 1 : 0 }; + +# Pointless assignment to make -w shut up +my $getpwuid; $getpwuid = 'unknown' unless eval { my $f = getpwuid (0); }; +my $getgrgid; $getgrgid = 'unknown' unless eval { my $f = getgrgid (0); }; +use constant UNAME => sub { $getpwuid || scalar getpwuid( shift() ) || '' }; +use constant GNAME => sub { $getgrgid || scalar getgrgid( shift() ) || '' }; +use constant UID => $>; +use constant GID => (split ' ', $) )[0]; + +use constant MODE => do { 0666 & (0777 & ~umask) }; +use constant STRIP_MODE => sub { shift() & 0777 }; +use constant CHECK_SUM => " "; + +use constant UNPACK => 'a100 a8 a8 a8 a12 a12 a8 a1 a100 A6 a2 a32 a32 a8 a8 a155 x12'; # cdrake - size must be a12 - not A12 - or else screws up huge file sizes (>8gb) +use constant PACK => 'a100 a8 a8 a8 a12 a12 A8 a1 a100 a6 a2 a32 a32 a8 a8 a155 x12'; +use constant NAME_LENGTH => 100; +use constant PREFIX_LENGTH => 155; + +use constant TIME_OFFSET => ($^O eq "MacOS") ? Time::Local::timelocal(0,0,0,1,0,70) : 0; +use constant MAGIC => "ustar"; +use constant TAR_VERSION => "00"; +use constant LONGLINK_NAME => '././@LongLink'; +use constant PAX_HEADER => 'pax_global_header'; + + ### allow ZLIB to be turned off using ENV: DEBUG only +use constant ZLIB => do { !$ENV{'PERL5_AT_NO_ZLIB'} and + eval { require IO::Zlib }; + $ENV{'PERL5_AT_NO_ZLIB'} || $@ ? 0 : 1 + }; + + ### allow BZIP to be turned off using ENV: DEBUG only +use constant BZIP => do { !$ENV{'PERL5_AT_NO_BZIP'} and + eval { require IO::Uncompress::Bunzip2; + require IO::Compress::Bzip2; }; + $ENV{'PERL5_AT_NO_BZIP'} || $@ ? 0 : 1 + }; + +use constant GZIP_MAGIC_NUM => qr/^(?:\037\213|\037\235)/; +use constant BZIP_MAGIC_NUM => qr/^BZh\d/; + +use constant CAN_CHOWN => sub { ($> == 0 and $^O ne "MacOS" and $^O ne "MSWin32") }; +use constant CAN_READLINK => ($^O ne 'MSWin32' and $^O !~ /RISC(?:[ _])?OS/i and $^O ne 'VMS'); +use constant ON_UNIX => ($^O ne 'MSWin32' and $^O ne 'MacOS' and $^O ne 'VMS'); +use constant ON_VMS => $^O eq 'VMS'; + +sub _list_consts { + my $class = shift; + my $pkg = shift; + return unless defined $pkg; # some joker might use '0' as a pkg... + + my @rv; + { no strict 'refs'; + my $stash = $pkg . '::'; + + for my $name (sort keys %$stash ) { + + ### is it a subentry? + my $sub = $pkg->can( $name ); + next unless defined $sub; + + next unless defined prototype($sub) and + not length prototype($sub); + + push @rv, $name; + } + } + + return sort @rv; +} + +1; +package Archive::Tar::File; +use strict; + +use Carp (); +use IO::File; +use File::Spec::Unix (); +use File::Spec (); +use File::Basename (); + +### avoid circular use, so only require; +require Archive::Tar; +use Archive::Tar::Constant; + +use vars qw[@ISA $VERSION]; +#@ISA = qw[Archive::Tar]; +$VERSION = '2.30'; + +### set value to 1 to oct() it during the unpack ### + +my $tmpl = [ + name => 0, # string A100 + mode => 1, # octal A8 + uid => 1, # octal A8 + gid => 1, # octal A8 + size => 0, # octal # cdrake - not *always* octal.. A12 + mtime => 1, # octal A12 + chksum => 1, # octal A8 + type => 0, # character A1 + linkname => 0, # string A100 + magic => 0, # string A6 + version => 0, # 2 bytes A2 + uname => 0, # string A32 + gname => 0, # string A32 + devmajor => 1, # octal A8 + devminor => 1, # octal A8 + prefix => 0, # A155 x 12 + +### end UNPACK items ### + raw => 0, # the raw data chunk + data => 0, # the data associated with the file -- + # This might be very memory intensive +]; + +### install get/set accessors for this object. +for ( my $i=0; $i[$i]; + no strict 'refs'; + *{__PACKAGE__."::$key"} = sub { + my $self = shift; + $self->{$key} = $_[0] if @_; + + ### just in case the key is not there or undef or something ### + { local $^W = 0; + return $self->{$key}; + } + } +} + + +sub new { + my $class = shift; + my $what = shift; + + my $obj = ($what eq 'chunk') ? __PACKAGE__->_new_from_chunk( @_ ) : + ($what eq 'file' ) ? __PACKAGE__->_new_from_file( @_ ) : + ($what eq 'data' ) ? __PACKAGE__->_new_from_data( @_ ) : + undef; + + return $obj; +} + +### copies the data, creates a clone ### +sub clone { + my $self = shift; + return bless { %$self }, ref $self; +} + +sub _new_from_chunk { + my $class = shift; + my $chunk = shift or return; # 512 bytes of tar header + my %hash = @_; + + ### filter any arguments on defined-ness of values. + ### this allows overriding from what the tar-header is saying + ### about this tar-entry. Particularly useful for @LongLink files + my %args = map { $_ => $hash{$_} } grep { defined $hash{$_} } keys %hash; + + ### makes it start at 0 actually... :) ### + my $i = -1; + my %entry = map { + my ($s,$v)=($tmpl->[++$i],$tmpl->[++$i]); # cdrake + ($_)=($_=~/^([^\0]*)/) unless($s eq 'size'); # cdrake + $s=> $v ? oct $_ : $_ # cdrake + # $tmpl->[++$i] => $tmpl->[++$i] ? oct $_ : $_ # removed by cdrake - mucks up binary sizes >8gb + } unpack( UNPACK, $chunk ); # cdrake + # } map { /^([^\0]*)/ } unpack( UNPACK, $chunk ); # old - replaced now by cdrake + + + if(substr($entry{'size'}, 0, 1) eq "\x80") { # binary size extension for files >8gigs (> octal 77777777777777) # cdrake + my @sz=unpack("aCSNN",$entry{'size'}); $entry{'size'}=$sz[4]+(2**32)*$sz[3]+$sz[2]*(2**64); # Use the low 80 bits (should use the upper 15 as well, but as at year 2011, that seems unlikely to ever be needed - the numbers are just too big...) # cdrake + } else { # cdrake + ($entry{'size'})=($entry{'size'}=~/^([^\0]*)/); $entry{'size'}=oct $entry{'size'}; # cdrake + } # cdrake + + + my $obj = bless { %entry, %args }, $class; + + ### magic is a filetype string.. it should have something like 'ustar' or + ### something similar... if the chunk is garbage, skip it + return unless $obj->magic !~ /\W/; + + ### store the original chunk ### + $obj->raw( $chunk ); + + $obj->type(FILE) if ( (!length $obj->type) or ($obj->type =~ /\W/) ); + $obj->type(DIR) if ( ($obj->is_file) && ($obj->name =~ m|/$|) ); + + + return $obj; + +} + +sub _new_from_file { + my $class = shift; + my $path = shift; + + ### path has to at least exist + return unless defined $path; + + my $type = __PACKAGE__->_filetype($path); + my $data = ''; + + READ: { + unless ($type == DIR ) { + my $fh = IO::File->new; + + unless( $fh->open($path) ) { + ### dangling symlinks are fine, stop reading but continue + ### creating the object + last READ if $type == SYMLINK; + + ### otherwise, return from this function -- + ### anything that's *not* a symlink should be + ### resolvable + return; + } + + ### binmode needed to read files properly on win32 ### + binmode $fh; + $data = do { local $/; <$fh> }; + close $fh; + } + } + + my @items = qw[mode uid gid size mtime]; + my %hash = map { shift(@items), $_ } (lstat $path)[2,4,5,7,9]; + + if (ON_VMS) { + ### VMS has two UID modes, traditional and POSIX. Normally POSIX is + ### not used. We currently do not have an easy way to see if we are in + ### POSIX mode. In traditional mode, the UID is actually the VMS UIC. + ### The VMS UIC has the upper 16 bits is the GID, which in many cases + ### the VMS UIC will be larger than 209715, the largest that TAR can + ### handle. So for now, assume it is traditional if the UID is larger + ### than 0x10000. + + if ($hash{uid} > 0x10000) { + $hash{uid} = $hash{uid} & 0xFFFF; + } + + ### The file length from stat() is the physical length of the file + ### However the amount of data read in may be more for some file types. + ### Fixed length files are read past the logical EOF to end of the block + ### containing. Other file types get expanded on read because record + ### delimiters are added. + + my $data_len = length $data; + $hash{size} = $data_len if $hash{size} < $data_len; + + } + ### you *must* set size == 0 on symlinks, or the next entry will be + ### though of as the contents of the symlink, which is wrong. + ### this fixes bug #7937 + $hash{size} = 0 if ($type == DIR or $type == SYMLINK); + $hash{mtime} -= TIME_OFFSET; + + ### strip the high bits off the mode, which we don't need to store + $hash{mode} = STRIP_MODE->( $hash{mode} ); + + + ### probably requires some file path munging here ... ### + ### name and prefix are set later + my $obj = { + %hash, + name => '', + chksum => CHECK_SUM, + type => $type, + linkname => ($type == SYMLINK and CAN_READLINK) + ? readlink $path + : '', + magic => MAGIC, + version => TAR_VERSION, + uname => UNAME->( $hash{uid} ), + gname => GNAME->( $hash{gid} ), + devmajor => 0, # not handled + devminor => 0, # not handled + prefix => '', + data => $data, + }; + + bless $obj, $class; + + ### fix up the prefix and file from the path + my($prefix,$file) = $obj->_prefix_and_file( $path ); + $obj->prefix( $prefix ); + $obj->name( $file ); + + return $obj; +} + +sub _new_from_data { + my $class = shift; + my $path = shift; return unless defined $path; + my $data = shift; return unless defined $data; + my $opt = shift; + + my $obj = { + data => $data, + name => '', + mode => MODE, + uid => UID, + gid => GID, + size => length $data, + mtime => time - TIME_OFFSET, + chksum => CHECK_SUM, + type => FILE, + linkname => '', + magic => MAGIC, + version => TAR_VERSION, + uname => UNAME->( UID ), + gname => GNAME->( GID ), + devminor => 0, + devmajor => 0, + prefix => '', + }; + + ### overwrite with user options, if provided ### + if( $opt and ref $opt eq 'HASH' ) { + for my $key ( keys %$opt ) { + + ### don't write bogus options ### + next unless exists $obj->{$key}; + $obj->{$key} = $opt->{$key}; + } + } + + bless $obj, $class; + + ### fix up the prefix and file from the path + my($prefix,$file) = $obj->_prefix_and_file( $path ); + $obj->prefix( $prefix ); + $obj->name( $file ); + + return $obj; +} + +sub _prefix_and_file { + my $self = shift; + my $path = shift; + + my ($vol, $dirs, $file) = File::Spec->splitpath( $path, $self->is_dir ); + my @dirs = File::Spec->splitdir( File::Spec->canonpath($dirs) ); + + ### if it's a directory, then $file might be empty + $file = pop @dirs if $self->is_dir and not length $file; + + ### splitting ../ gives you the relative path in native syntax + map { $_ = '..' if $_ eq '-' } @dirs if ON_VMS; + + my $prefix = File::Spec::Unix->catdir(@dirs); + return( $prefix, $file ); +} + +sub _filetype { + my $self = shift; + my $file = shift; + + return unless defined $file; + + return SYMLINK if (-l $file); # Symlink + + return FILE if (-f _); # Plain file + + return DIR if (-d _); # Directory + + return FIFO if (-p _); # Named pipe + + return SOCKET if (-S _); # Socket + + return BLOCKDEV if (-b _); # Block special + + return CHARDEV if (-c _); # Character special + + ### shouldn't happen, this is when making archives, not reading ### + return LONGLINK if ( $file eq LONGLINK_NAME ); + + return UNKNOWN; # Something else (like what?) + +} + +### this method 'downgrades' a file to plain file -- this is used for +### symlinks when FOLLOW_SYMLINKS is true. +sub _downgrade_to_plainfile { + my $entry = shift; + $entry->type( FILE ); + $entry->mode( MODE ); + $entry->linkname(''); + + return 1; +} + + +sub extract { + my $self = shift; + + local $Carp::CarpLevel += 1; + + return Archive::Tar->_extract_file( $self, @_ ); +} + + +sub full_path { + my $self = shift; + + ### if prefix field is empty + return $self->name unless defined $self->prefix and length $self->prefix; + + ### or otherwise, catfile'd + return File::Spec::Unix->catfile( $self->prefix, $self->name ); +} + + + +sub validate { + my $self = shift; + + my $raw = $self->raw; + + ### don't know why this one is different from the one we /write/ ### + substr ($raw, 148, 8) = " "; + + ### bug #43513: [PATCH] Accept wrong checksums from SunOS and HP-UX tar + ### like GNU tar does. See here for details: + ### http://www.gnu.org/software/tar/manual/tar.html#SEC139 + ### so we do both a signed AND unsigned validate. if one succeeds, that's + ### good enough + return ( (unpack ("%16C*", $raw) == $self->chksum) + or (unpack ("%16c*", $raw) == $self->chksum)) ? 1 : 0; +} + + +sub has_content { + my $self = shift; + return defined $self->data() && length $self->data() ? 1 : 0; +} + + +sub get_content { + my $self = shift; + $self->data( ); +} + + +sub get_content_by_ref { + my $self = shift; + + return \$self->{data}; +} + + +sub replace_content { + my $self = shift; + my $data = shift || ''; + + $self->data( $data ); + $self->size( length $data ); + return 1; +} + + +sub rename { + my $self = shift; + my $path = shift; + + return unless defined $path; + + my ($prefix,$file) = $self->_prefix_and_file( $path ); + + $self->name( $file ); + $self->prefix( $prefix ); + + return 1; +} + + +sub chmod { + my $self = shift; + my $mode = shift; return unless defined $mode && $mode =~ /^[0-7]{1,4}$/; + $self->{mode} = oct($mode); + return 1; +} + + +sub chown { + my $self = shift; + my $uname = shift; + return unless defined $uname; + my $gname; + if (-1 != index($uname, ':')) { + ($uname, $gname) = split(/:/, $uname); + } else { + $gname = shift if @_ > 0; + } + + $self->uname( $uname ); + $self->gname( $gname ) if $gname; + return 1; +} + + +#stupid perl5.5.3 needs to warn if it's not numeric +sub is_file { local $^W; FILE == $_[0]->type } +sub is_dir { local $^W; DIR == $_[0]->type } +sub is_hardlink { local $^W; HARDLINK == $_[0]->type } +sub is_symlink { local $^W; SYMLINK == $_[0]->type } +sub is_chardev { local $^W; CHARDEV == $_[0]->type } +sub is_blockdev { local $^W; BLOCKDEV == $_[0]->type } +sub is_fifo { local $^W; FIFO == $_[0]->type } +sub is_socket { local $^W; SOCKET == $_[0]->type } +sub is_unknown { local $^W; UNKNOWN == $_[0]->type } +sub is_longlink { local $^W; LONGLINK eq $_[0]->type } +sub is_label { local $^W; LABEL eq $_[0]->type } + +1; +package Config::Extensions; +use strict; +our (%Extensions, $VERSION, @ISA, @EXPORT_OK); +use Config; +require Exporter; + +$VERSION = '0.02'; +@ISA = 'Exporter'; +@EXPORT_OK = '%Extensions'; + +foreach my $type (qw(static dynamic nonxs)) { + foreach (split /\s+/, $Config{$type . '_ext'}) { + s!/!::!g; + $Extensions{$_} = $type; + } +} + +1; +__END__ +#!/pro/bin/perl + +package Config::Perl::V; + +use strict; +use warnings; + +use Config; +use Exporter; +use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS); +$VERSION = "0.29"; +@ISA = qw( Exporter ); +@EXPORT_OK = qw( plv2hash summary myconfig signature ); +%EXPORT_TAGS = ( + all => [ @EXPORT_OK ], + sig => [ "signature" ], + ); + +# Characteristics of this binary (from libperl): +# Compile-time options: DEBUGGING PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP +# USE_64_BIT_INT USE_LARGE_FILES USE_PERLIO + +# The list are as the perl binary has stored it in PL_bincompat_options +# search for it in +# perl.c line 1643 S_Internals_V () +# perl -ne'(/^S_Internals_V/../^}/)&&s/^\s+"( .*)"/$1/ and print' perl.c +# perl.h line 4566 PL_bincompat_options +# perl -ne'(/^\w.*PL_bincompat/../^\w}/)&&s/^\s+"( .*)"/$1/ and print' perl.h +my %BTD = map { $_ => 0 } qw( + + DEBUGGING + NO_HASH_SEED + NO_MATHOMS + NO_TAINT_SUPPORT + PERL_BOOL_AS_CHAR + PERL_COPY_ON_WRITE + PERL_DISABLE_PMC + PERL_DONT_CREATE_GVSV + PERL_EXTERNAL_GLOB + PERL_HASH_FUNC_DJB2 + PERL_HASH_FUNC_MURMUR3 + PERL_HASH_FUNC_ONE_AT_A_TIME + PERL_HASH_FUNC_ONE_AT_A_TIME_HARD + PERL_HASH_FUNC_ONE_AT_A_TIME_OLD + PERL_HASH_FUNC_SDBM + PERL_HASH_FUNC_SIPHASH + PERL_HASH_FUNC_SUPERFAST + PERL_IS_MINIPERL + PERL_MALLOC_WRAP + PERL_MEM_LOG + PERL_MEM_LOG_ENV + PERL_MEM_LOG_ENV_FD + PERL_MEM_LOG_NOIMPL + PERL_MEM_LOG_STDERR + PERL_MEM_LOG_TIMESTAMP + PERL_NEW_COPY_ON_WRITE + PERL_OP_PARENT + PERL_PERTURB_KEYS_DETERMINISTIC + PERL_PERTURB_KEYS_DISABLED + PERL_PERTURB_KEYS_RANDOM + PERL_PRESERVE_IVUV + PERL_RELOCATABLE_INCPUSH + PERL_USE_DEVEL + PERL_USE_SAFE_PUTENV + SILENT_NO_TAINT_SUPPORT + UNLINK_ALL_VERSIONS + USE_ATTRIBUTES_FOR_PERLIO + USE_FAST_STDIO + USE_HASH_SEED_EXPLICIT + USE_LOCALE + USE_LOCALE_CTYPE + USE_NO_REGISTRY + USE_PERL_ATOF + USE_SITECUSTOMIZE + + DEBUG_LEAKING_SCALARS + DEBUG_LEAKING_SCALARS_FORK_DUMP + DECCRTL_SOCKETS + FAKE_THREADS + FCRYPT + HAS_TIMES + HAVE_INTERP_INTERN + MULTIPLICITY + MYMALLOC + PERL_DEBUG_READONLY_COW + PERL_DEBUG_READONLY_OPS + PERL_GLOBAL_STRUCT + PERL_GLOBAL_STRUCT_PRIVATE + PERL_IMPLICIT_CONTEXT + PERL_IMPLICIT_SYS + PERLIO_LAYERS + PERL_MAD + PERL_MICRO + PERL_NEED_APPCTX + PERL_NEED_TIMESBASE + PERL_OLD_COPY_ON_WRITE + PERL_POISON + PERL_SAWAMPERSAND + PERL_TRACK_MEMPOOL + PERL_USES_PL_PIDSTATUS + PL_OP_SLAB_ALLOC + THREADS_HAVE_PIDS + USE_64_BIT_ALL + USE_64_BIT_INT + USE_IEEE + USE_ITHREADS + USE_LARGE_FILES + USE_LOCALE_COLLATE + USE_LOCALE_NUMERIC + USE_LOCALE_TIME + USE_LONG_DOUBLE + USE_PERLIO + USE_QUADMATH + USE_REENTRANT_API + USE_SFIO + USE_SOCKS + VMS_DO_SOCKETS + VMS_SHORTEN_LONG_SYMBOLS + VMS_SYMBOL_CASE_AS_IS + ); + +# These are all the keys that are +# 1. Always present in %Config - lib/Config.pm #87 tie %Config +# 2. Reported by 'perl -V' (the rest) +my @config_vars = qw( + + api_subversion + api_version + api_versionstring + archlibexp + dont_use_nlink + d_readlink + d_symlink + exe_ext + inc_version_list + ldlibpthname + patchlevel + path_sep + perl_patchlevel + privlibexp + scriptdir + sitearchexp + sitelibexp + subversion + usevendorprefix + version + + git_commit_id + git_describe + git_branch + git_uncommitted_changes + git_commit_id_title + git_snapshot_date + + package revision version_patchlevel_string + + osname osvers archname + myuname + config_args + hint useposix d_sigaction + useithreads usemultiplicity + useperlio d_sfio uselargefiles usesocks + use64bitint use64bitall uselongdouble + usemymalloc default_inc_excludes_dot bincompat5005 + + cc ccflags + optimize + cppflags + ccversion gccversion gccosandvers + intsize longsize ptrsize doublesize byteorder + d_longlong longlongsize d_longdbl longdblsize + ivtype ivsize nvtype nvsize lseektype lseeksize + alignbytes prototype + + ld ldflags + libpth + libs + perllibs + libc so useshrplib libperl + gnulibc_version + + dlsrc dlext d_dlsymun ccdlflags + cccdlflags lddlflags + ); + +my %empty_build = ( + osname => "", + stamp => 0, + options => { %BTD }, + patches => [], + ); + +sub _make_derived { + my $conf = shift; + + for ( [ lseektype => "Off_t" ], + [ myuname => "uname" ], + [ perl_patchlevel => "patch" ], + ) { + my ($official, $derived) = @$_; + $conf->{config}{$derived} ||= $conf->{config}{$official}; + $conf->{config}{$official} ||= $conf->{config}{$derived}; + $conf->{derived}{$derived} = delete $conf->{config}{$derived}; + } + + if (exists $conf->{config}{version_patchlevel_string} && + !exists $conf->{config}{api_version}) { + my $vps = $conf->{config}{version_patchlevel_string}; + $vps =~ s{\b revision \s+ (\S+) }{}x and + $conf->{config}{revision} ||= $1; + + $vps =~ s{\b version \s+ (\S+) }{}x and + $conf->{config}{api_version} ||= $1; + $vps =~ s{\b subversion \s+ (\S+) }{}x and + $conf->{config}{subversion} ||= $1; + $vps =~ s{\b patch \s+ (\S+) }{}x and + $conf->{config}{perl_patchlevel} ||= $1; + } + + ($conf->{config}{version_patchlevel_string} ||= join " ", + map { ($_, $conf->{config}{$_} ) } + grep { $conf->{config}{$_} } + qw( api_version subversion perl_patchlevel )) =~ s/\bperl_//; + + $conf->{config}{perl_patchlevel} ||= ""; # 0 is not a valid patchlevel + + if ($conf->{config}{perl_patchlevel} =~ m{^git\w*-([^-]+)}i) { + $conf->{config}{git_branch} ||= $1; + $conf->{config}{git_describe} ||= $conf->{config}{perl_patchlevel}; + } + + $conf->{config}{$_} ||= "undef" for grep m/^(?:use|def)/ => @config_vars; + + $conf; + } # _make_derived + +sub plv2hash { + my %config; + + my $pv = join "\n" => @_; + + if ($pv =~ m/^Summary of my\s+(\S+)\s+\(\s*(.*?)\s*\)/m) { + $config{"package"} = $1; + my $rev = $2; + $rev =~ s/^ revision \s+ (\S+) \s*//x and $config{revision} = $1; + $rev and $config{version_patchlevel_string} = $rev; + my ($rel) = $config{"package"} =~ m{perl(\d)}; + my ($vers, $subvers) = $rev =~ m{version\s+(\d+)\s+subversion\s+(\d+)}; + defined $vers && defined $subvers && defined $rel and + $config{version} = "$rel.$vers.$subvers"; + } + + if ($pv =~ m/^\s+(Snapshot of:)\s+(\S+)/) { + $config{git_commit_id_title} = $1; + $config{git_commit_id} = $2; + } + + # these are always last on line and can have multiple quotation styles + for my $k (qw( ccflags ldflags lddlflags )) { + $pv =~ s{, \s* $k \s*=\s* (.*) \s*$}{}mx or next; + my $v = $1; + $v =~ s/\s*,\s*$//; + $v =~ s/^(['"])(.*)\1$/$2/; + $config{$k} = $v; + } + + if (my %kv = ($pv =~ m{\b + (\w+) # key + \s*= # assign + ( '\s*[^']*?\s*' # quoted value + | \S+[^=]*?\s*\n # unquoted running till end of line + | \S+ # unquoted value + | \s*\n # empty + ) + (?:,?\s+|\s*\n)? # separator (5.8.x reports did not have a ',' + }gx)) { # between every kv pair + + while (my ($k, $v) = each %kv) { + $k =~ s/\s+$//; + $v =~ s/\s*\n\z//; + $v =~ s/,$//; + $v =~ m/^'(.*)'$/ and $v = $1; + $v =~ s/\s+$//; + $config{$k} = $v; + } + } + + my $build = { %empty_build }; + + $pv =~ m{^\s+Compiled at\s+(.*)}m + and $build->{stamp} = $1; + $pv =~ m{^\s+Locally applied patches:(?:\s+|\n)(.*?)(?:[\s\n]+Buil[td] under)}ms + and $build->{patches} = [ split m/\n+\s*/, $1 ]; + $pv =~ m{^\s+Compile-time options:(?:\s+|\n)(.*?)(?:[\s\n]+(?:Locally applied|Buil[td] under))}ms + and map { $build->{options}{$_} = 1 } split m/\s+|\n/ => $1; + + $build->{osname} = $config{osname}; + $pv =~ m{^\s+Built under\s+(.*)}m + and $build->{osname} = $1; + $config{osname} ||= $build->{osname}; + + return _make_derived ({ + build => $build, + environment => {}, + config => \%config, + derived => {}, + inc => [], + }); + } # plv2hash + +sub summary { + my $conf = shift || myconfig (); + ref $conf eq "HASH" + && exists $conf->{config} + && exists $conf->{build} + && ref $conf->{config} eq "HASH" + && ref $conf->{build} eq "HASH" or return; + + my %info = map { + exists $conf->{config}{$_} ? ( $_ => $conf->{config}{$_} ) : () } + qw( archname osname osvers revision patchlevel subversion version + cc ccversion gccversion config_args inc_version_list + d_longdbl d_longlong use64bitall use64bitint useithreads + uselongdouble usemultiplicity usemymalloc useperlio useshrplib + doublesize intsize ivsize nvsize longdblsize longlongsize lseeksize + default_inc_excludes_dot + ); + $info{$_}++ for grep { $conf->{build}{options}{$_} } keys %{$conf->{build}{options}}; + + return \%info; + } # summary + +sub signature { + my $no_md5 = "0" x 32; + my $conf = summary (shift) or return $no_md5; + + eval { require Digest::MD5 }; + $@ and return $no_md5; + + $conf->{cc} =~ s{.*\bccache\s+}{}; + $conf->{cc} =~ s{.*[/\\]}{}; + + delete $conf->{config_args}; + return Digest::MD5::md5_hex (join "\xFF" => map { + "$_=".(defined $conf->{$_} ? $conf->{$_} : "\xFE"); + } sort keys %$conf); + } # signature + +sub myconfig { + my $args = shift; + my %args = ref $args eq "HASH" ? %$args : + ref $args eq "ARRAY" ? @$args : (); + + my $build = { %empty_build }; + + # 5.14.0 and later provide all the information without shelling out + my $stamp = eval { Config::compile_date () }; + if (defined $stamp) { + $stamp =~ s/^Compiled at //; + $build->{osname} = $^O; + $build->{stamp} = $stamp; + $build->{patches} = [ Config::local_patches () ]; + $build->{options}{$_} = 1 for Config::bincompat_options (), + Config::non_bincompat_options (); + } + else { + #y $pv = qx[$^X -e"sub Config::myconfig{};" -V]; + my $cnf = plv2hash (qx[$^X -V]); + + $build->{$_} = $cnf->{build}{$_} for qw( osname stamp patches options ); + } + + my @KEYS = keys %ENV; + my %env = + map { $_ => $ENV{$_} } grep m/^PERL/ => @KEYS; + $args{env} and + map { $env{$_} = $ENV{$_} } grep m{$args{env}} => @KEYS; + + my %config = map { $_ => $Config{$_} } @config_vars; + + return _make_derived ({ + build => $build, + environment => \%env, + config => \%config, + derived => {}, + inc => \@INC, + }); + } # myconfig + +1; + +__END__ + +package ExtUtils::MM_UWIN; + +use strict; +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Unix; +our @ISA = qw(ExtUtils::MM_Unix); + + + +sub os_flavor { + return('Unix', 'U/WIN'); +} + + + +sub replace_manpage_separator { + my($self, $man) = @_; + + $man =~ s,/+,.,g; + return $man; +} + + +1; +package ExtUtils::Manifest; + +require Exporter; +use Config; +use File::Basename; +use File::Copy 'copy'; +use File::Find; +use File::Spec 0.8; +use Carp; +use strict; +use warnings; + +our $VERSION = '1.70'; +our @ISA = ('Exporter'); +our @EXPORT_OK = qw(mkmanifest + manicheck filecheck fullcheck skipcheck + manifind maniread manicopy maniadd + maniskip + ); + +our $Is_MacOS = $^O eq 'MacOS'; +our $Is_VMS = $^O eq 'VMS'; +our $Is_VMS_mode = 0; +our $Is_VMS_lc = 0; +our $Is_VMS_nodot = 0; # No dots in dir names or double dots in files + +if ($Is_VMS) { + require VMS::Filespec if $Is_VMS; + my $vms_unix_rpt; + my $vms_efs; + my $vms_case; + + $Is_VMS_mode = 1; + $Is_VMS_lc = 1; + $Is_VMS_nodot = 1; + if (eval { local $SIG{__DIE__}; require VMS::Feature; }) { + $vms_unix_rpt = VMS::Feature::current("filename_unix_report"); + $vms_efs = VMS::Feature::current("efs_charset"); + $vms_case = VMS::Feature::current("efs_case_preserve"); + } else { + my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || ''; + my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || ''; + $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i; + $vms_efs = $efs_charset =~ /^[ET1]/i; + $vms_case = $efs_case =~ /^[ET1]/i; + } + $Is_VMS_lc = 0 if ($vms_case); + $Is_VMS_mode = 0 if ($vms_unix_rpt); + $Is_VMS_nodot = 0 if ($vms_efs); +} + +our $Debug = $ENV{PERL_MM_MANIFEST_DEBUG} || 0; +our $Verbose = defined $ENV{PERL_MM_MANIFEST_VERBOSE} ? + $ENV{PERL_MM_MANIFEST_VERBOSE} : 1; +our $Quiet = 0; +our $MANIFEST = 'MANIFEST'; + +our $DEFAULT_MSKIP = File::Spec->catfile( dirname(__FILE__), "$MANIFEST.SKIP" ); + + + +sub _sort { + return sort { lc $a cmp lc $b } @_; +} + +sub mkmanifest { + my $manimiss = 0; + my $read = (-r 'MANIFEST' && maniread()) or $manimiss++; + $read = {} if $manimiss; + local *M; + my $bakbase = $MANIFEST; + $bakbase =~ s/\./_/g if $Is_VMS_nodot; # avoid double dots + rename $MANIFEST, "$bakbase.bak" unless $manimiss; + open M, "> $MANIFEST" or die "Could not open $MANIFEST: $!"; + binmode M, ':raw'; + my $skip = maniskip(); + my $found = manifind(); + my($key,$val,$file,%all); + %all = (%$found, %$read); + $all{$MANIFEST} = ($Is_VMS_mode ? "$MANIFEST\t\t" : '') . + 'This list of files' + if $manimiss; # add new MANIFEST to known file list + foreach $file (_sort keys %all) { + if ($skip->($file)) { + # Policy: only remove files if they're listed in MANIFEST.SKIP. + # Don't remove files just because they don't exist. + warn "Removed from $MANIFEST: $file\n" if $Verbose and exists $read->{$file}; + next; + } + if ($Verbose){ + warn "Added to $MANIFEST: $file\n" unless exists $read->{$file}; + } + my $text = $all{$file}; + $file = _unmacify($file); + my $tabs = (5 - (length($file)+1)/8); + $tabs = 1 if $tabs < 1; + $tabs = 0 unless $text; + if ($file =~ /\s/) { + $file =~ s/([\\'])/\\$1/g; + $file = "'$file'"; + } + print M $file, "\t" x $tabs, $text, "\n"; + } + close M; +} + +# Geez, shouldn't this use File::Spec or File::Basename or something? +# Why so careful about dependencies? +sub clean_up_filename { + my $filename = shift; + $filename =~ s|^\./||; + $filename =~ s/^:([^:]+)$/$1/ if $Is_MacOS; + if ( $Is_VMS ) { + $filename =~ s/\.$//; # trim trailing dot + $filename = VMS::Filespec::unixify($filename); # unescape spaces, etc. + if( $Is_VMS_lc ) { + $filename = lc($filename); + $filename = uc($filename) if $filename =~ /^MANIFEST(\.SKIP)?$/i; + } + } + return $filename; +} + + + +sub manifind { + my $p = shift || {}; + my $found = {}; + + my $wanted = sub { + my $name = clean_up_filename($File::Find::name); + warn "Debug: diskfile $name\n" if $Debug; + return if -d $_; + $found->{$name} = ""; + }; + + # We have to use "$File::Find::dir/$_" in preprocess, because + # $File::Find::name is unavailable. + # Also, it's okay to use / here, because MANIFEST files use Unix-style + # paths. + find({wanted => $wanted, follow_fast => 1}, + $Is_MacOS ? ":" : "."); + + return $found; +} + + + +sub manicheck { + return _check_files(); +} + + + +sub filecheck { + return _check_manifest(); +} + + + +sub fullcheck { + return [_check_files()], [_check_manifest()]; +} + + + +sub skipcheck { + my($p) = @_; + my $found = manifind(); + my $matches = maniskip(); + + my @skipped = (); + foreach my $file (_sort keys %$found){ + if (&$matches($file)){ + warn "Skipping $file\n" unless $Quiet; + push @skipped, $file; + next; + } + } + + return @skipped; +} + + +sub _check_files { + my $p = shift; + my $dosnames=(defined(&Dos::UseLFN) && Dos::UseLFN()==0); + my $read = maniread() || {}; + my $found = manifind($p); + + my(@missfile) = (); + foreach my $file (_sort keys %$read){ + warn "Debug: manicheck checking from $MANIFEST $file\n" if $Debug; + if ($dosnames){ + $file = lc $file; + $file =~ s=(\.(\w|-)+)=substr ($1,0,4)=ge; + $file =~ s=((\w|-)+)=substr ($1,0,8)=ge; + } + unless ( exists $found->{$file} ) { + warn "No such file: $file\n" unless $Quiet; + push @missfile, $file; + } + } + + return @missfile; +} + + +sub _check_manifest { + my($p) = @_; + my $read = maniread() || {}; + my $found = manifind($p); + my $skip = maniskip(); + + my @missentry = (); + foreach my $file (_sort keys %$found){ + next if $skip->($file); + warn "Debug: manicheck checking from disk $file\n" if $Debug; + unless ( exists $read->{$file} ) { + my $canon = $Is_MacOS ? "\t" . _unmacify($file) : ''; + warn "Not in $MANIFEST: $file$canon\n" unless $Quiet; + push @missentry, $file; + } + } + + return @missentry; +} + + + +sub maniread { + my ($mfile) = @_; + $mfile ||= $MANIFEST; + my $read = {}; + local *M; + unless (open M, "< $mfile"){ + warn "Problem opening $mfile: $!"; + return $read; + } + local $_; + while (){ + chomp; + next if /^\s*#/; + + my($file, $comment); + + # filename may contain spaces if enclosed in '' + # (in which case, \\ and \' are escapes) + if (($file, $comment) = /^'((?:\\[\\']|.+)+)'\s*(.*)/) { + $file =~ s/\\([\\'])/$1/g; + } + else { + ($file, $comment) = /^(\S+)\s*(.*)/; + } + next unless $file; + + if ($Is_MacOS) { + $file = _macify($file); + $file =~ s/\\([0-3][0-7][0-7])/sprintf("%c", oct($1))/ge; + } + elsif ($Is_VMS_mode) { + require File::Basename; + my($base,$dir) = File::Basename::fileparse($file); + # Resolve illegal file specifications in the same way as tar + if ($Is_VMS_nodot) { + $dir =~ tr/./_/; + my(@pieces) = split(/\./,$base); + if (@pieces > 2) + { $base = shift(@pieces) . '.' . join('_',@pieces); } + my $okfile = "$dir$base"; + warn "Debug: Illegal name $file changed to $okfile\n" if $Debug; + $file = $okfile; + } + if( $Is_VMS_lc ) { + $file = lc($file); + $file = uc($file) if $file =~ /^MANIFEST(\.SKIP)?$/i; + } + } + + $read->{$file} = $comment; + } + close M; + $read; +} + + +# returns an anonymous sub that decides if an argument matches +sub maniskip { + my @skip ; + my $mfile = shift || "$MANIFEST.SKIP"; + _check_mskip_directives($mfile) if -f $mfile; + local(*M, $_); + open M, "< $mfile" or open M, "< $DEFAULT_MSKIP" or return sub {0}; + while (){ + chomp; + s/\r//; + $_ =~ qr{^\s*(?:(?:'([^\\']*(?:\\.[^\\']*)*)')|([^#\s]\S*))?(?:(?:\s*)|(?:\s+(.*?)\s*))$}; + #my $comment = $3; + my $filename = $2; + if ( defined($1) ) { + $filename = $1; + $filename =~ s/\\(['\\])/$1/g; + } + next if (not defined($filename) or not $filename); + push @skip, _macify($filename); + } + close M; + return sub {0} unless (scalar @skip > 0); + + my $opts = $Is_VMS_mode ? '(?i)' : ''; + + # Make sure each entry is isolated in its own parentheses, in case + # any of them contain alternations + my $regex = join '|', map "(?:$_)", @skip; + + return sub { $_[0] =~ qr{$opts$regex} }; +} + +# checks for the special directives +# #!include_default +# #!include /path/to/some/manifest.skip +# in a custom MANIFEST.SKIP for, for including +# the content of, respectively, the default MANIFEST.SKIP +# and an external manifest.skip file +sub _check_mskip_directives { + my $mfile = shift; + local (*M, $_); + my @lines = (); + my $flag = 0; + unless (open M, "< $mfile") { + warn "Problem opening $mfile: $!"; + return; + } + while () { + if (/^#!include_default\s*$/) { + if (my @default = _include_mskip_file()) { + push @lines, @default; + warn "Debug: Including default MANIFEST.SKIP\n" if $Debug; + $flag++; + } + next; + } + if (/^#!include\s+(.*)\s*$/) { + my $external_file = $1; + if (my @external = _include_mskip_file($external_file)) { + push @lines, @external; + warn "Debug: Including external $external_file\n" if $Debug; + $flag++; + } + next; + } + push @lines, $_; + } + close M; + return unless $flag; + my $bakbase = $mfile; + $bakbase =~ s/\./_/g if $Is_VMS_nodot; # avoid double dots + rename $mfile, "$bakbase.bak"; + warn "Debug: Saving original $mfile as $bakbase.bak\n" if $Debug; + unless (open M, "> $mfile") { + warn "Problem opening $mfile: $!"; + return; + } + binmode M, ':raw'; + print M $_ for (@lines); + close M; + return; +} + +# returns an array containing the lines of an external +# manifest.skip file, if given, or $DEFAULT_MSKIP +sub _include_mskip_file { + my $mskip = shift || $DEFAULT_MSKIP; + unless (-f $mskip) { + warn qq{Included file "$mskip" not found - skipping}; + return; + } + local (*M, $_); + unless (open M, "< $mskip") { + warn "Problem opening $mskip: $!"; + return; + } + my @lines = (); + push @lines, "\n#!start included $mskip\n"; + push @lines, $_ while ; + close M; + push @lines, "#!end included $mskip\n\n"; + return @lines; +} + + +sub manicopy { + my($read,$target,$how)=@_; + croak "manicopy() called without target argument" unless defined $target; + $how ||= 'cp'; + require File::Path; + require File::Basename; + + $target = VMS::Filespec::unixify($target) if $Is_VMS_mode; + File::Path::mkpath([ $target ],! $Quiet,$Is_VMS ? undef : 0755); + foreach my $file (keys %$read){ + if ($Is_MacOS) { + if ($file =~ m!:!) { + my $dir = _maccat($target, $file); + $dir =~ s/[^:]+$//; + File::Path::mkpath($dir,1,0755); + } + cp_if_diff($file, _maccat($target, $file), $how); + } else { + $file = VMS::Filespec::unixify($file) if $Is_VMS_mode; + if ($file =~ m!/!) { # Ilya, that hurts, I fear, or maybe not? + my $dir = File::Basename::dirname($file); + $dir = VMS::Filespec::unixify($dir) if $Is_VMS_mode; + File::Path::mkpath(["$target/$dir"],! $Quiet,$Is_VMS ? undef : 0755); + } + cp_if_diff($file, "$target/$file", $how); + } + } +} + +sub cp_if_diff { + my($from, $to, $how)=@_; + if (! -f $from) { + carp "$from not found"; + return; + } + my($diff) = 0; + local(*F,*T); + open(F,"< $from\0") or die "Can't read $from: $!\n"; + if (open(T,"< $to\0")) { + local $_; + while () { $diff++,last if $_ ne ; } + $diff++ unless eof(T); + close T; + } + else { $diff++; } + close F; + if ($diff) { + if (-e $to) { + unlink($to) or confess "unlink $to: $!"; + } + STRICT_SWITCH: { + best($from,$to), last STRICT_SWITCH if $how eq 'best'; + cp($from,$to), last STRICT_SWITCH if $how eq 'cp'; + ln($from,$to), last STRICT_SWITCH if $how eq 'ln'; + croak("ExtUtils::Manifest::cp_if_diff " . + "called with illegal how argument [$how]. " . + "Legal values are 'best', 'cp', and 'ln'."); + } + } +} + +sub cp { + my ($srcFile, $dstFile) = @_; + my ($access,$mod) = (stat $srcFile)[8,9]; + + copy($srcFile,$dstFile); + utime $access, $mod + ($Is_VMS ? 1 : 0), $dstFile; + _manicopy_chmod($srcFile, $dstFile); +} + + +sub ln { + my ($srcFile, $dstFile) = @_; + # Fix-me - VMS can support links. + return &cp if $Is_VMS or ($^O eq 'MSWin32' and Win32::IsWin95()); + link($srcFile, $dstFile); + + unless( _manicopy_chmod($srcFile, $dstFile) ) { + unlink $dstFile; + return; + } + 1; +} + +# 1) Strip off all group and world permissions. +# 2) Let everyone read it. +# 3) If the owner can execute it, everyone can. +sub _manicopy_chmod { + my($srcFile, $dstFile) = @_; + + my $perm = 0444 | (stat $srcFile)[2] & 0700; + chmod( $perm | ( $perm & 0100 ? 0111 : 0 ), $dstFile ); +} + +# Files that are often modified in the distdir. Don't hard link them. +my @Exceptions = qw(MANIFEST META.yml SIGNATURE); +sub best { + my ($srcFile, $dstFile) = @_; + + my $is_exception = grep $srcFile =~ /$_/, @Exceptions; + if ($is_exception or !$Config{d_link} or -l $srcFile) { + cp($srcFile, $dstFile); + } else { + ln($srcFile, $dstFile) or cp($srcFile, $dstFile); + } +} + +sub _macify { + my($file) = @_; + + return $file unless $Is_MacOS; + + $file =~ s|^\./||; + if ($file =~ m|/|) { + $file =~ s|/+|:|g; + $file = ":$file"; + } + + $file; +} + +sub _maccat { + my($f1, $f2) = @_; + + return "$f1/$f2" unless $Is_MacOS; + + $f1 .= ":$f2"; + $f1 =~ s/([^:]:):/$1/g; + return $f1; +} + +sub _unmacify { + my($file) = @_; + + return $file unless $Is_MacOS; + + $file =~ s|^:||; + $file =~ s|([/ \n])|sprintf("\\%03o", unpack("c", $1))|ge; + $file =~ y|:|/|; + + $file; +} + + + +sub maniadd { + my($additions) = shift; + + _normalize($additions); + _fix_manifest($MANIFEST); + + my $manifest = maniread(); + my @needed = grep { !exists $manifest->{$_} } keys %$additions; + return 1 unless @needed; + + open(MANIFEST, ">>$MANIFEST") or + die "maniadd() could not open $MANIFEST: $!"; + binmode MANIFEST, ':raw'; + + foreach my $file (_sort @needed) { + my $comment = $additions->{$file} || ''; + if ($file =~ /\s/) { + $file =~ s/([\\'])/\\$1/g; + $file = "'$file'"; + } + printf MANIFEST "%-40s %s\n", $file, $comment; + } + close MANIFEST or die "Error closing $MANIFEST: $!"; + + return 1; +} + + +# Make sure this MANIFEST is consistently written with native +# newlines and has a terminal newline. +sub _fix_manifest { + my $manifest_file = shift; + + open MANIFEST, $MANIFEST or die "Could not open $MANIFEST: $!"; + local $/; + my @manifest = split /(\015\012|\012|\015)/, , -1; + close MANIFEST; + my $must_rewrite = ""; + if ($manifest[-1] eq ""){ + # sane case: last line had a terminal newline + pop @manifest; + for (my $i=1; $i<=$#manifest; $i+=2) { + unless ($manifest[$i] eq "\n") { + $must_rewrite = "not a newline at pos $i"; + last; + } + } + } else { + $must_rewrite = "last line without newline"; + } + + if ( $must_rewrite ) { + 1 while unlink $MANIFEST; # avoid multiple versions on VMS + open MANIFEST, ">", $MANIFEST or die "(must_rewrite=$must_rewrite) Could not open >$MANIFEST: $!"; + binmode MANIFEST, ':raw'; + for (my $i=0; $i<=$#manifest; $i+=2) { + print MANIFEST "$manifest[$i]\n"; + } + close MANIFEST or die "could not write $MANIFEST: $!"; + } +} + + +# UNIMPLEMENTED +sub _normalize { + return; +} + + + +1; +package ExtUtils::Mkbootstrap; + +# There's just too much Dynaloader incest here to turn on strict vars. +use strict 'refs'; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require Exporter; +our @ISA = ('Exporter'); +our @EXPORT = ('&Mkbootstrap'); + +use Config; + +our $Verbose = 0; + + +sub Mkbootstrap { + my($baseext, @bsloadlibs)=@_; + @bsloadlibs = grep($_, @bsloadlibs); # strip empty libs + + print " bsloadlibs=@bsloadlibs\n" if $Verbose; + + # We need DynaLoader here because we and/or the *_BS file may + # call dl_findfile(). We don't say `use' here because when + # first building perl extensions the DynaLoader will not have + # been built when MakeMaker gets first used. + require DynaLoader; + + rename "$baseext.bs", "$baseext.bso" + if -s "$baseext.bs"; + + if (-f "${baseext}_BS"){ + $_ = "${baseext}_BS"; + package DynaLoader; # execute code as if in DynaLoader + local($osname, $dlsrc) = (); # avoid warnings + ($osname, $dlsrc) = @Config::Config{qw(osname dlsrc)}; + $bscode = ""; + unshift @INC, "."; + require $_; + shift @INC; + } + + if ($Config{'dlsrc'} =~ /^dl_dld/){ + package DynaLoader; + push(@dl_resolve_using, dl_findfile('-lc')); + } + + my(@all) = (@bsloadlibs, @DynaLoader::dl_resolve_using); + my($method) = ''; + if (@all || (defined $DynaLoader::bscode && length $DynaLoader::bscode)){ + open my $bs, ">", "$baseext.bs" + or die "Unable to open $baseext.bs: $!"; + print "Writing $baseext.bs\n"; + print " containing: @all" if $Verbose; + print $bs "# $baseext DynaLoader bootstrap file for $^O architecture.\n"; + print $bs "# Do not edit this file, changes will be lost.\n"; + print $bs "# This file was automatically generated by the\n"; + print $bs "# Mkbootstrap routine in ExtUtils::Mkbootstrap (v$VERSION).\n"; + if (@all) { + print $bs "\@DynaLoader::dl_resolve_using = "; + # If @all contains names in the form -lxxx or -Lxxx then it's asking for + # runtime library location so we automatically add a call to dl_findfile() + if (" @all" =~ m/ -[lLR]/){ + print $bs " dl_findfile(qw(\n @all\n ));\n"; + } else { + print $bs " qw(@all);\n"; + } + } + # write extra code if *_BS says so + print $bs $DynaLoader::bscode if $DynaLoader::bscode; + print $bs "\n1;\n"; + close $bs; + } +} + +1; + +__END__ + +package ExtUtils::MM_Win32; + +use strict; + + + +use ExtUtils::MakeMaker::Config; +use File::Basename; +use File::Spec; +use ExtUtils::MakeMaker qw(neatvalue _sprintf562); + +require ExtUtils::MM_Any; +require ExtUtils::MM_Unix; +our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +$ENV{EMXSHELL} = 'sh'; # to run `commands` + +my ( $BORLAND, $GCC, $MSVC ) = _identify_compiler_environment( \%Config ); + +sub _identify_compiler_environment { + my ( $config ) = @_; + + my $BORLAND = $config->{cc} =~ /\bbcc/i ? 1 : 0; + my $GCC = $config->{cc} =~ /\bgcc\b/i ? 1 : 0; + my $MSVC = $config->{cc} =~ /\b(?:cl|icl)/i ? 1 : 0; # MSVC can come as clarm.exe, icl=Intel C + + return ( $BORLAND, $GCC, $MSVC ); +} + + + +sub dlsyms { + my($self,%attribs) = @_; + return '' if $self->{SKIPHASH}{'dynamic'}; + $self->xs_dlsyms_iterator(\%attribs); +} + + +sub xs_dlsyms_ext { + '.def'; +} + + +sub replace_manpage_separator { + my($self,$man) = @_; + $man =~ s,/+,.,g; + $man; +} + + + +sub maybe_command { + my($self,$file) = @_; + my @e = exists($ENV{'PATHEXT'}) + ? split(/;/, $ENV{PATHEXT}) + : qw(.com .exe .bat .cmd); + my $e = ''; + for (@e) { $e .= "\Q$_\E|" } + chop $e; + # see if file ends in one of the known extensions + if ($file =~ /($e)$/i) { + return $file if -e $file; + } + else { + for (@e) { + return "$file$_" if -e "$file$_"; + } + } + return; +} + + + +sub init_DIRFILESEP { + my($self) = shift; + + # The ^ makes sure its not interpreted as an escape in nmake + $self->{DIRFILESEP} = $self->is_make_type('nmake') ? '^\\' : + $self->is_make_type('dmake') ? '\\\\' : + $self->is_make_type('gmake') ? '/' + : '\\'; +} + + +sub init_tools { + my ($self) = @_; + + $self->{NOOP} ||= 'rem'; + $self->{DEV_NULL} ||= '> NUL'; + + $self->{FIXIN} ||= $self->{PERL_CORE} ? + "\$(PERLRUN) $self->{PERL_SRC}\\win32\\bin\\pl2bat.pl" : + 'pl2bat.bat'; + + $self->SUPER::init_tools; + + # Setting SHELL from $Config{sh} can break dmake. Its ok without it. + delete $self->{SHELL}; + + return; +} + + + +sub init_others { + my $self = shift; + + $self->{LD} ||= 'link'; + $self->{AR} ||= 'lib'; + + $self->SUPER::init_others; + + $self->{LDLOADLIBS} ||= $Config{libs}; + # -Lfoo must come first for Borland, so we put it in LDDLFLAGS + if ($BORLAND) { + my $libs = $self->{LDLOADLIBS}; + my $libpath = ''; + while ($libs =~ s/(?:^|\s)(("?)-L.+?\2)(?:\s|$)/ /) { + $libpath .= ' ' if length $libpath; + $libpath .= $1; + } + $self->{LDLOADLIBS} = $libs; + $self->{LDDLFLAGS} ||= $Config{lddlflags}; + $self->{LDDLFLAGS} .= " $libpath"; + } + + return; +} + + + +sub init_platform { + my($self) = shift; + + $self->{MM_Win32_VERSION} = $VERSION; + + return; +} + +sub platform_constants { + my($self) = shift; + my $make_frag = ''; + + foreach my $macro (qw(MM_Win32_VERSION)) + { + next unless defined $self->{$macro}; + $make_frag .= "$macro = $self->{$macro}\n"; + } + + return $make_frag; +} + + +sub specify_shell { + my $self = shift; + return '' unless $self->is_make_type('gmake'); + "\nSHELL = $ENV{COMSPEC}\n"; +} + + +sub constants { + my $self = shift; + + my $make_text = $self->SUPER::constants; + return $make_text unless $self->is_make_type('dmake'); + + # dmake won't read any single "line" (even those with escaped newlines) + # larger than a certain size which can be as small as 8k. PM_TO_BLIB + # on large modules like DateTime::TimeZone can create lines over 32k. + # So we'll crank it up to a WHOPPING 64k. + # + # This has to come here before all the constants and not in + # platform_constants which is after constants. + my $size = $self->{MAXLINELENGTH} || 800000; + my $prefix = qq{ +# Get dmake to read long commands like PM_TO_BLIB +MAXLINELENGTH = $size + +}; + + return $prefix . $make_text; +} + + + +sub special_targets { + my($self) = @_; + + my $make_frag = $self->SUPER::special_targets; + + $make_frag .= <<'MAKE_FRAG' if $self->is_make_type('dmake'); +.USESHELL : +MAKE_FRAG + + return $make_frag; +} + + +sub static_lib_pure_cmd { + my ($self, $from) = @_; + $from =~ s/(\$\(\w+)(\))/$1:^"+"$2/g if $BORLAND; + sprintf qq{\t\$(AR) %s\n}, ($BORLAND ? '$@ ' . $from + : ($GCC ? '-ru $@ ' . $from + : '-out:$@ ' . $from)); +} + + +sub xs_make_dynamic_lib { + my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_; + my @m = sprintf '%s : %s $(MYEXTLIB) %s$(DFSEP).exists %s $(PERL_ARCHIVEDEP) $(INST_DYNAMIC_DEP)'."\n", $to, $from, $todir, $exportlist; + if ($GCC) { + # per https://rt.cpan.org/Ticket/Display.html?id=78395 no longer + # uses dlltool - relies on post 2002 MinGW + # 1 2 + push @m, _sprintf562 <<'EOF', $exportlist, $ldfrom; + $(LD) %1$s -o $@ $(LDDLFLAGS) %2$s $(OTHERLDFLAGS) $(MYEXTLIB) "$(PERL_ARCHIVE)" $(LDLOADLIBS) -Wl,--enable-auto-image-base +EOF + } elsif ($BORLAND) { + my $ldargs = $self->is_make_type('dmake') + ? q{"$(PERL_ARCHIVE:s,/,\,)" $(LDLOADLIBS:s,/,\,) $(MYEXTLIB:s,/,\,),} + : q{"$(subst /,\,$(PERL_ARCHIVE))" $(subst /,\,$(LDLOADLIBS)) $(subst /,\,$(MYEXTLIB)),}; + my $subbed; + if ($exportlist eq '$(EXPORT_LIST)') { + $subbed = $self->is_make_type('dmake') + ? q{$(EXPORT_LIST:s,/,\,)} + : q{$(subst /,\,$(EXPORT_LIST))}; + } else { + # in XSMULTI, exportlist is per-XS, so have to sub in perl not make + ($subbed = $exportlist) =~ s#/#\\#g; + } + push @m, sprintf <<'EOF', $ldfrom, $ldargs . $subbed; + $(LD) $(LDDLFLAGS) $(OTHERLDFLAGS) %s,$@,,%s,$(RESFILES) +EOF + } else { # VC + push @m, sprintf <<'EOF', $ldfrom, $exportlist; + $(LD) -out:$@ $(LDDLFLAGS) %s $(OTHERLDFLAGS) $(MYEXTLIB) "$(PERL_ARCHIVE)" $(LDLOADLIBS) -def:%s +EOF + # Embed the manifest file if it exists + push(@m, q{ if exist $@.manifest mt -nologo -manifest $@.manifest -outputresource:$@;2 + if exist $@.manifest del $@.manifest}); + } + push @m, "\n\t\$(CHMOD) \$(PERM_RWX) \$\@\n"; + + join '', @m; +} + +sub xs_dynamic_lib_macros { + my ($self, $attribs) = @_; + my $otherldflags = $attribs->{OTHERLDFLAGS} || ($BORLAND ? 'c0d32.obj': ''); + my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || ""; + sprintf <<'EOF', $otherldflags, $inst_dynamic_dep; +# This section creates the dynamically loadable objects from relevant +# objects and possibly $(MYEXTLIB). +OTHERLDFLAGS = %s +INST_DYNAMIC_DEP = %s +EOF +} + + +sub extra_clean_files { + my $self = shift; + + return $GCC ? (qw(dll.base dll.exp)) : ('*.pdb'); +} + + +sub init_linker { + my $self = shift; + + $self->{PERL_ARCHIVE} = "\$(PERL_INC)\\$Config{libperl}"; + $self->{PERL_ARCHIVEDEP} = "\$(PERL_INCDEP)\\$Config{libperl}"; + $self->{PERL_ARCHIVE_AFTER} = ''; + $self->{EXPORT_LIST} = '$(BASEEXT).def'; +} + + + +sub perl_script { + my($self,$file) = @_; + return $file if -r $file && -f _; + return "$file.pl" if -r "$file.pl" && -f _; + return "$file.plx" if -r "$file.plx" && -f _; + return "$file.bat" if -r "$file.bat" && -f _; + return; +} + +sub can_dep_space { + my $self = shift; + 1; # with Win32::GetShortPathName +} + + +sub quote_dep { + my ($self, $arg) = @_; + if ($arg =~ / / and not $self->is_make_type('gmake')) { + require Win32; + $arg = Win32::GetShortPathName($arg); + die <SUPER::quote_dep($arg); +} + + + +sub xs_obj_opt { + my ($self, $output_file) = @_; + ($MSVC ? "/Fo" : "-o ") . $output_file; +} + + + +sub pasthru { + my($self) = shift; + my $old = $self->SUPER::pasthru; + return $old unless $self->is_make_type('nmake'); + $old =~ s/(PASTHRU\s*=\s*)/$1 -nologo /; + $old; +} + + + +sub arch_check { + my $self = shift; + + # Win32 is an XS module, minperl won't have it. + # arch_check() is not critical, so just fake it. + return 1 unless $self->can_load_xs; + return $self->SUPER::arch_check( map { $self->_normalize_path_name($_) } @_); +} + +sub _normalize_path_name { + my $self = shift; + my $file = shift; + + require Win32; + my $short = Win32::GetShortPathName($file); + return defined $short ? lc $short : lc $file; +} + + + +sub oneliner { + my($self, $cmd, $switches) = @_; + $switches = [] unless defined $switches; + + # Strip leading and trailing newlines + $cmd =~ s{^\n+}{}; + $cmd =~ s{\n+$}{}; + + $cmd = $self->quote_literal($cmd); + $cmd = $self->escape_newlines($cmd); + + $switches = join ' ', @$switches; + + return qq{\$(ABSPERLRUN) $switches -e $cmd --}; +} + + +sub quote_literal { + my($self, $text, $opts) = @_; + $opts->{allow_variables} = 1 unless defined $opts->{allow_variables}; + + # See: http://www.autohotkey.net/~deleyd/parameters/parameters.htm#CPP + + # Apply the Microsoft C/C++ parsing rules + $text =~ s{\\\\"}{\\\\\\\\\\"}g; # \\" -> \\\\\" + $text =~ s{(? \\\" + $text =~ s{(? \" + $text = qq{"$text"} if $text =~ /[ \t]/; + + # Apply the Command Prompt parsing rules (cmd.exe) + my @text = split /("[^"]*")/, $text; + # We should also escape parentheses, but it breaks one-liners containing + # $(MACRO)s in makefiles. + s{([<>|&^@!])}{^$1}g foreach grep { !/^"[^"]*"$/ } @text; + $text = join('', @text); + + # dmake expands {{ to { and }} to }. + if( $self->is_make_type('dmake') ) { + $text =~ s/{/{{/g; + $text =~ s/}/}}/g; + } + + $text = $opts->{allow_variables} + ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text); + + return $text; +} + + +sub escape_newlines { + my($self, $text) = @_; + + # Escape newlines + $text =~ s{\n}{\\\n}g; + + return $text; +} + + + +sub cd { + my($self, $dir, @cmds) = @_; + + return $self->SUPER::cd($dir, @cmds) unless $self->is_make_type('nmake'); + + my $cmd = join "\n\t", map "$_", @cmds; + + my $updirs = $self->catdir(map { $self->updir } $self->splitdir($dir)); + + # No leading tab and no trailing newline makes for easier embedding. + my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd, $updirs; +cd %s + %s + cd %s +MAKE_FRAG + + chomp $make_frag; + + return $make_frag; +} + + + +sub max_exec_len { + my $self = shift; + + return $self->{_MAX_EXEC_LEN} ||= 2 * 1024; +} + + + +sub os_flavor { + return('Win32'); +} + + + +sub cflags { + my($self,$libperl)=@_; + return $self->{CFLAGS} if $self->{CFLAGS}; + return '' unless $self->needs_linking(); + + my $base = $self->SUPER::cflags($libperl); + foreach (split /\n/, $base) { + /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2; + }; + $self->{CCFLAGS} .= " -DPERLDLL" if ($self->{LINKTYPE} eq 'static'); + + return $self->{CFLAGS} = qq{ +CCFLAGS = $self->{CCFLAGS} +OPTIMIZE = $self->{OPTIMIZE} +PERLTYPE = $self->{PERLTYPE} +}; + +} + + +sub make_type { + my ($self) = @_; + my $make = $self->make; + $make = +( File::Spec->splitpath( $make ) )[-1]; + $make =~ s!\.exe$!!i; + if ( $make =~ m![^A-Z0-9]!i ) { + ($make) = grep { m!make!i } split m![^A-Z0-9]!i, $make; + } + return "$make-style"; +} + +1; +__END__ + +package ExtUtils::Mksymlists; + +use 5.006; +use strict qw[ subs refs ]; +# no strict 'vars'; # until filehandles are exempted + +use Carp; +use Exporter; +use Config; + +our @ISA = qw(Exporter); +our @EXPORT = qw(&Mksymlists); +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +sub Mksymlists { + my(%spec) = @_; + my($osname) = $^O; + + croak("Insufficient information specified to Mksymlists") + unless ( $spec{NAME} or + ($spec{FILE} and ($spec{DL_FUNCS} or $spec{FUNCLIST})) ); + + $spec{DL_VARS} = [] unless $spec{DL_VARS}; + ($spec{FILE} = $spec{NAME}) =~ s/.*::// unless $spec{FILE}; + $spec{FUNCLIST} = [] unless $spec{FUNCLIST}; + $spec{DL_FUNCS} = { $spec{NAME} => [] } + unless ( ($spec{DL_FUNCS} and keys %{$spec{DL_FUNCS}}) or + @{$spec{FUNCLIST}}); + if (defined $spec{DL_FUNCS}) { + foreach my $package (sort keys %{$spec{DL_FUNCS}}) { + my($packprefix,$bootseen); + ($packprefix = $package) =~ s/\W/_/g; + foreach my $sym (@{$spec{DL_FUNCS}->{$package}}) { + if ($sym =~ /^boot_/) { + push(@{$spec{FUNCLIST}},$sym); + $bootseen++; + } + else { + push(@{$spec{FUNCLIST}},"XS_${packprefix}_$sym"); + } + } + push(@{$spec{FUNCLIST}},"boot_$packprefix") unless $bootseen; + } + } + +# We'll need this if we ever add any OS which uses mod2fname +# not as pseudo-builtin. +# require DynaLoader; + if (defined &DynaLoader::mod2fname and not $spec{DLBASE}) { + $spec{DLBASE} = DynaLoader::mod2fname([ split(/::/,$spec{NAME}) ]); + } + + if ($osname eq 'aix') { _write_aix(\%spec); } + elsif ($osname eq 'MacOS'){ _write_aix(\%spec) } + elsif ($osname eq 'VMS') { _write_vms(\%spec) } + elsif ($osname eq 'os2') { _write_os2(\%spec) } + elsif ($osname eq 'MSWin32') { _write_win32(\%spec) } + else { + croak("Don't know how to create linker option file for $osname\n"); + } +} + + +sub _write_aix { + my($data) = @_; + + rename "$data->{FILE}.exp", "$data->{FILE}.exp_old"; + + open( my $exp, ">", "$data->{FILE}.exp") + or croak("Can't create $data->{FILE}.exp: $!\n"); + print $exp join("\n",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}}; + print $exp join("\n",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}}; + close $exp; +} + + +sub _write_os2 { + my($data) = @_; + require Config; + my $threaded = ($Config::Config{archname} =~ /-thread/ ? " threaded" : ""); + + if (not $data->{DLBASE}) { + ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://; + $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_'; + } + my $distname = $data->{DISTNAME} || $data->{NAME}; + $distname = "Distribution $distname"; + my $patchlevel = " pl$Config{perl_patchlevel}" || ''; + my $comment = sprintf "Perl (v%s%s%s) module %s", + $Config::Config{version}, $threaded, $patchlevel, $data->{NAME}; + chomp $comment; + if ($data->{INSTALLDIRS} and $data->{INSTALLDIRS} eq 'perl') { + $distname = 'perl5-porters@perl.org'; + $comment = "Core $comment"; + } + $comment = "$comment (Perl-config: $Config{config_args})"; + $comment = substr($comment, 0, 200) . "...)" if length $comment > 203; + rename "$data->{FILE}.def", "$data->{FILE}_def.old"; + + open(my $def, ">", "$data->{FILE}.def") + or croak("Can't create $data->{FILE}.def: $!\n"); + print $def "LIBRARY '$data->{DLBASE}' INITINSTANCE TERMINSTANCE\n"; + print $def "DESCRIPTION '\@#$distname:$data->{VERSION}#\@ $comment'\n"; + print $def "CODE LOADONCALL\n"; + print $def "DATA LOADONCALL NONSHARED MULTIPLE\n"; + print $def "EXPORTS\n "; + print $def join("\n ",@{$data->{DL_VARS}}, "\n") if @{$data->{DL_VARS}}; + print $def join("\n ",@{$data->{FUNCLIST}}, "\n") if @{$data->{FUNCLIST}}; + _print_imports($def, $data); + close $def; +} + +sub _print_imports { + my ($def, $data)= @_; + my $imports= $data->{IMPORTS} + or return; + if ( keys %$imports ) { + print $def "IMPORTS\n"; + foreach my $name (sort keys %$imports) { + print $def " $name=$imports->{$name}\n"; + } + } +} + +sub _write_win32 { + my($data) = @_; + + require Config; + if (not $data->{DLBASE}) { + ($data->{DLBASE} = $data->{NAME}) =~ s/.*:://; + $data->{DLBASE} = substr($data->{DLBASE},0,7) . '_'; + } + rename "$data->{FILE}.def", "$data->{FILE}_def.old"; + + open( my $def, ">", "$data->{FILE}.def" ) + or croak("Can't create $data->{FILE}.def: $!\n"); + # put library name in quotes (it could be a keyword, like 'Alias') + if ($Config::Config{'cc'} !~ /\bgcc/i) { + print $def "LIBRARY \"$data->{DLBASE}\"\n"; + } + print $def "EXPORTS\n "; + my @syms; + # Export public symbols both with and without underscores to + # ensure compatibility between DLLs from Borland C and Visual C + # NOTE: DynaLoader itself only uses the names without underscores, + # so this is only to cover the case when the extension DLL may be + # linked to directly from C. GSAR 97-07-10 + + #bcc dropped in 5.16, so dont create useless extra symbols for export table + unless($] >= 5.016) { + if ($Config::Config{'cc'} =~ /^bcc/i) { + push @syms, "_$_", "$_ = _$_" + for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}); + } + else { + push @syms, "$_", "_$_ = $_" + for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}); + } + } else { + push @syms, "$_" + for (@{$data->{DL_VARS}}, @{$data->{FUNCLIST}}); + } + print $def join("\n ",@syms, "\n") if @syms; + _print_imports($def, $data); + close $def; +} + + +sub _write_vms { + my($data) = @_; + + require Config; # a reminder for once we do $^O + require ExtUtils::XSSymSet; + + my($isvax) = $Config::Config{'archname'} =~ /VAX/i; + my($set) = new ExtUtils::XSSymSet; + + rename "$data->{FILE}.opt", "$data->{FILE}.opt_old"; + + open(my $opt,">", "$data->{FILE}.opt") + or croak("Can't create $data->{FILE}.opt: $!\n"); + + # Options file declaring universal symbols + # Used when linking shareable image for dynamic extension, + # or when linking PerlShr into which we've added this package + # as a static extension + # We don't do anything to preserve order, so we won't relax + # the GSMATCH criteria for a dynamic extension + + print $opt "case_sensitive=yes\n" + if $Config::Config{d_vms_case_sensitive_symbols}; + + foreach my $sym (@{$data->{FUNCLIST}}) { + my $safe = $set->addsym($sym); + if ($isvax) { print $opt "UNIVERSAL=$safe\n" } + else { print $opt "SYMBOL_VECTOR=($safe=PROCEDURE)\n"; } + } + + foreach my $sym (@{$data->{DL_VARS}}) { + my $safe = $set->addsym($sym); + print $opt "PSECT_ATTR=${sym},PIC,OVR,RD,NOEXE,WRT,NOSHR\n"; + if ($isvax) { print $opt "UNIVERSAL=$safe\n" } + else { print $opt "SYMBOL_VECTOR=($safe=DATA)\n"; } + } + + close $opt; +} + +1; + +__END__ + +#!perl +use 5.006; +BEGIN { pop @INC if $INC[-1] eq '.' } +use strict; +eval { + require ExtUtils::ParseXS; + 1; +} +or do { + my $err = $@ || 'Zombie error'; + my $v = $ExtUtils::ParseXS::VERSION; + $v = '' if not defined $v; + die "Failed to load or import from ExtUtils::ParseXS (version $v). Please check that ExtUtils::ParseXS is installed correctly and that the newest version will be found in your \@INC path: $err"; +}; + +use Getopt::Long; + +my %args = (); + +my $usage = "Usage: xsubpp [-v] [-csuffix csuffix] [-except] [-prototypes] [-noversioncheck] [-nolinenumbers] [-nooptimize] [-noinout] [-noargtypes] [-strip|s pattern] [-typemap typemap]... file.xs\n"; + +Getopt::Long::Configure qw(no_auto_abbrev no_ignore_case); + +@ARGV = grep {$_ ne '-C++'} @ARGV; # Allow -C++ for backward compatibility +GetOptions(\%args, qw(hiertype! + prototypes! + versioncheck! + linenumbers! + optimize! + inout! + argtypes! + object_capi! + except! + v + typemap=s@ + output=s + s|strip=s + csuffix=s + )) + or die $usage; + +if ($args{v}) { + print "xsubpp version $ExtUtils::ParseXS::VERSION\n"; + exit; +} + +@ARGV == 1 or die $usage; + +$args{filename} = shift @ARGV; + +my $pxs = ExtUtils::ParseXS->new; +$pxs->process_file(%args); +exit( $pxs->report_error_count() ? 1 : 0 ); + +__END__ + +=head1 NAME + +xsubpp - compiler to convert Perl XS code into C code + +=head1 SYNOPSIS + +B [B<-v>] [B<-except>] [B<-s pattern>] [B<-prototypes>] [B<-noversioncheck>] [B<-nolinenumbers>] [B<-nooptimize>] [B<-typemap typemap>] [B<-output filename>]... file.xs + +=head1 DESCRIPTION + +This compiler is typically run by the makefiles created by L +or by L or other Perl module build tools. + +I will compile XS code into C code by embedding the constructs +necessary to let C functions manipulate Perl values and creates the glue +necessary to let Perl access those functions. The compiler uses typemaps to +determine how to map C function parameters and variables to Perl values. + +The compiler will search for typemap files called I. It will use +the following search path to find default typemaps, with the rightmost +typemap taking precedence. + + ../../../typemap:../../typemap:../typemap:typemap + +It will also use a default typemap installed as C. + +=head1 OPTIONS + +Note that the C MakeMaker option may be used to add these options to +any makefiles generated by MakeMaker. + +=over 5 + +=item B<-hiertype> + +Retains '::' in type names so that C++ hierarchical types can be mapped. + +=item B<-except> + +Adds exception handling stubs to the C code. + +=item B<-typemap typemap> + +Indicates that a user-supplied typemap should take precedence over the +default typemaps. This option may be used multiple times, with the last +typemap having the highest precedence. + +=item B<-output filename> + +Specifies the name of the output file to generate. If no file is +specified, output will be written to standard output. + +=item B<-v> + +Prints the I version number to standard output, then exits. + +=item B<-prototypes> + +By default I will not automatically generate prototype code for +all xsubs. This flag will enable prototypes. + +=item B<-noversioncheck> + +Disables the run time test that determines if the object file (derived +from the C<.xs> file) and the C<.pm> files have the same version +number. + +=item B<-nolinenumbers> + +Prevents the inclusion of '#line' directives in the output. + +=item B<-nooptimize> + +Disables certain optimizations. The only optimization that is currently +affected is the use of Is by the output C code (see L). +This may significantly slow down the generated code, but this is the way +B of 5.005 and earlier operated. + +=item B<-noinout> + +Disable recognition of C, C and C declarations. + +=item B<-noargtypes> + +Disable recognition of ANSI-like descriptions of function signature. + +=item B<-C++> + +Currently doesn't do anything at all. This flag has been a no-op for +many versions of perl, at least as far back as perl5.003_07. It's +allowed here for backwards compatibility. + +=item B<-s=...> or B<-strip=...> + +I + +If specified, the given string will be stripped off from the beginning +of the C function name in the generated XS functions (if it starts with that prefix). +This only applies to XSUBs without C or C blocks. +For example, the XS: + + void foo_bar(int i); + +when C is invoked with C<-s foo_> will install a C +function in Perl, but really call C in C. Most of the time, +this is the opposite of what you want and failure modes are somewhat +obscure, so please avoid this option where possible. + +=back + +=head1 ENVIRONMENT + +No environment variables are used. + +=head1 AUTHOR + +Originally by Larry Wall. Turned into the C module +by Ken Williams. + +=head1 MODIFICATION HISTORY + +See the file F. + +=head1 SEE ALSO + +perl(1), perlxs(1), perlxstut(1), ExtUtils::ParseXS + +=cut + +package ExtUtils::MM_Win95; + +use strict; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Win32; +our @ISA = qw(ExtUtils::MM_Win32); + +use ExtUtils::MakeMaker::Config; + + + +sub max_exec_len { + my $self = shift; + + return $self->{_MAX_EXEC_LEN} ||= 1024; +} + + + +sub os_flavor { + my $self = shift; + return ($self->SUPER::os_flavor, 'Win9x'); +} + + + + +1; +package ExtUtils::Embed; +require Exporter; +use Config; +require File::Spec; + +our ( @Extensions, $opt_o, $opt_s ); +use strict; + +# This is not a dual-life module, so no need for development version numbers +our $VERSION = '1.35'; + +our @ISA = qw(Exporter); +our @EXPORT = qw(&xsinit &ldopts + &ccopts &ccflags &ccdlflags &perl_inc + &xsi_header &xsi_protos &xsi_body); + +our $Verbose = 0; +our $lib_ext = $Config{lib_ext} || '.a'; + +sub is_cmd { $0 eq '-e' } + +sub my_return { + my $val = shift; + if(is_cmd) { + print $val; + } + else { + return $val; + } +} + +sub xsinit { + my($file, $std, $mods) = @_; + my($fh,@mods,%seen); + $file ||= "perlxsi.c"; + my $xsinit_proto = "pTHX"; + + if (@_) { + @mods = @$mods if $mods; + } + else { + require Getopt::Std; + Getopt::Std::getopts('o:s:'); + $file = $opt_o if defined $opt_o; + $std = $opt_s if defined $opt_s; + @mods = @ARGV; + } + $std = 1 unless scalar @mods; + + if ($file eq "STDOUT") { + $fh = \*STDOUT; + } + else { + open $fh, '>', $file + or die "Can't open '$file': $!"; + } + + push(@mods, static_ext()) if defined $std; + @mods = grep(!$seen{$_}++, @mods); + + print $fh &xsi_header(); + print $fh "\nEXTERN_C void xs_init ($xsinit_proto);\n\n"; + print $fh &xsi_protos(@mods); + + print $fh "\nEXTERN_C void\nxs_init($xsinit_proto)\n{\n"; + print $fh &xsi_body(@mods); + print $fh "}\n"; + +} + +sub xsi_header { + return <catdir(@ns); + + print STDERR "searching for '$sub${lib_ext}'\n" if $Verbose; + foreach (@path) { + next unless -e ($archive = File::Spec->catdir($_,"auto",$root,"$sub$lib_ext")); + push @archives, $archive; + if(-e ($extra = File::Spec->catdir($_,"auto",$root,"extralibs.ld"))) { + local(*FH); + if(open(FH, '<', $extra)) { + my($libs) = ; chomp $libs; + push @potential_libs, split /\s+/, $libs; + } + else { + warn "Couldn't open '$extra'"; + } + } + last; + } + } + #print STDERR "\@potential_libs = @potential_libs\n"; + + my $libperl; + if ($^O eq 'MSWin32') { + $libperl = $Config{libperl}; + } + elsif ($^O eq 'os390' && $Config{usedl}) { + # Nothing for OS/390 (z/OS) dynamic. + } else { + $libperl = (grep(/^-l\w*perl\w*$/, @link_args))[0] + || ($Config{libperl} =~ /^lib(\w+)(\Q$lib_ext\E|\.\Q$Config{dlext}\E)$/ + ? "-l$1" : '') + || "-lperl"; + } + + my $lpath = File::Spec->catdir($Config{archlibexp}, 'CORE'); + $lpath = qq["$lpath"] if $^O eq 'MSWin32'; + my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) = + MM->ext(join ' ', "-L$lpath", $libperl, @potential_libs); + + my $ld_or_bs = $bsloadlibs || $ldloadlibs; + print STDERR "bs: $bsloadlibs ** ld: $ldloadlibs" if $Verbose; + my $ccdlflags = _ccdlflags(); + my $ldflags = _ldflags(); + my $linkage = "$ccdlflags $ldflags @archives $ld_or_bs"; + print STDERR "ldopts: '$linkage'\n" if $Verbose; + + return $linkage if scalar @_; + my_return("$linkage\n"); +} + +sub ccflags { + my $ccflags = _ccflags(); + my_return(" $ccflags "); +} + +sub ccdlflags { + my $ccdlflags = _ccdlflags(); + my_return(" $ccdlflags "); +} + +sub perl_inc { + my $dir = File::Spec->catdir($Config{archlibexp}, 'CORE'); + $dir = qq["$dir"] if $^O eq 'MSWin32'; + my_return(" -I$dir "); +} + +sub ccopts { + ccflags . perl_inc; +} + +sub canon { + my($as, @ext) = @_; + foreach(@ext) { + # might be X::Y or lib/auto/X/Y/Y.a + next + if s!::!/!g; + s!^(?:lib|ext|dist|cpan)/(?:auto/)?!!; + s!/\w+\.\w+$!!; + } + if ($as ne '/') { + s!/!$as!g + foreach @ext; + } + @ext; +} + +__END__ + +# basic C types +int T_IV +unsigned T_UV +unsigned int T_UV +long T_IV +unsigned long T_UV +short T_IV +unsigned short T_UV +char T_CHAR +unsigned char T_U_CHAR +char * T_PV +unsigned char * T_PV +const char * T_PV +caddr_t T_PV +wchar_t * T_PV +wchar_t T_IV +# bool_t is defined in +bool_t T_IV +size_t T_UV +ssize_t T_IV +time_t T_NV +unsigned long * T_OPAQUEPTR +char ** T_PACKEDARRAY +void * T_PTR +Time_t * T_PV +SV * T_SV + +# These are the backwards-compatibility AV*/HV* typemaps that +# do not decrement refcounts. Locally override with +# "AV* T_AVREF_REFCOUNT_FIXED", "HV* T_HVREF_REFCOUNT_FIXED", +# "CV* T_CVREF_REFCOUNT_FIXED", "SVREF T_SVREF_REFCOUNT_FIXED", +# to get the fixed versions. +SVREF T_SVREF +CV * T_CVREF +AV * T_AVREF +HV * T_HVREF + +IV T_IV +UV T_UV +NV T_NV +I32 T_IV +I16 T_IV +I8 T_IV +STRLEN T_UV +U32 T_U_LONG +U16 T_U_SHORT +U8 T_UV +Result T_U_CHAR +Boolean T_BOOL +float T_FLOAT +double T_DOUBLE +SysRet T_SYSRET +SysRetLong T_SYSRET +FILE * T_STDIO +PerlIO * T_INOUT +FileHandle T_PTROBJ +InputStream T_IN +InOutStream T_INOUT +OutputStream T_OUT +bool T_BOOL + +############################################################################# +INPUT +T_SV + $var = $arg +T_SVREF + STMT_START { + SV* const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + if (SvROK(xsub_tmp_sv)){ + $var = SvRV(xsub_tmp_sv); + } + else{ + Perl_croak_nocontext(\"%s: %s is not a reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_SVREF_REFCOUNT_FIXED + STMT_START { + SV* const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + if (SvROK(xsub_tmp_sv)){ + $var = SvRV(xsub_tmp_sv); + } + else{ + Perl_croak_nocontext(\"%s: %s is not a reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_AVREF + STMT_START { + SV* const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVAV){ + $var = (AV*)SvRV(xsub_tmp_sv); + } + else{ + Perl_croak_nocontext(\"%s: %s is not an ARRAY reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_AVREF_REFCOUNT_FIXED + STMT_START { + SV* const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVAV){ + $var = (AV*)SvRV(xsub_tmp_sv); + } + else{ + Perl_croak_nocontext(\"%s: %s is not an ARRAY reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_HVREF + STMT_START { + SV* const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVHV){ + $var = (HV*)SvRV(xsub_tmp_sv); + } + else{ + Perl_croak_nocontext(\"%s: %s is not a HASH reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_HVREF_REFCOUNT_FIXED + STMT_START { + SV* const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + if (SvROK(xsub_tmp_sv) && SvTYPE(SvRV(xsub_tmp_sv)) == SVt_PVHV){ + $var = (HV*)SvRV(xsub_tmp_sv); + } + else{ + Perl_croak_nocontext(\"%s: %s is not a HASH reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_CVREF + STMT_START { + HV *st; + GV *gvp; + SV * const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + $var = sv_2cv(xsub_tmp_sv, &st, &gvp, 0); + if (!$var) { + Perl_croak_nocontext(\"%s: %s is not a CODE reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_CVREF_REFCOUNT_FIXED + STMT_START { + HV *st; + GV *gvp; + SV * const xsub_tmp_sv = $arg; + SvGETMAGIC(xsub_tmp_sv); + $var = sv_2cv(xsub_tmp_sv, &st, &gvp, 0); + if (!$var) { + Perl_croak_nocontext(\"%s: %s is not a CODE reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\"); + } + } STMT_END +T_SYSRET + $var NOT IMPLEMENTED +T_UV + $var = ($type)SvUV($arg) +T_IV + $var = ($type)SvIV($arg) +T_INT + $var = (int)SvIV($arg) +T_ENUM + $var = ($type)SvIV($arg) +T_BOOL + $var = (bool)SvTRUE($arg) +T_U_INT + $var = (unsigned int)SvUV($arg) +T_SHORT + $var = (short)SvIV($arg) +T_U_SHORT + $var = (unsigned short)SvUV($arg) +T_LONG + $var = (long)SvIV($arg) +T_U_LONG + $var = (unsigned long)SvUV($arg) +T_CHAR + $var = (char)*SvPV_nolen($arg) +T_U_CHAR + $var = (unsigned char)SvUV($arg) +T_FLOAT + $var = (float)SvNV($arg) +T_NV + $var = ($type)SvNV($arg) +T_DOUBLE + $var = (double)SvNV($arg) +T_PV + $var = ($type)SvPV_nolen($arg) +T_PTR + $var = INT2PTR($type,SvIV($arg)) +T_PTRREF + if (SvROK($arg)) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = INT2PTR($type,tmp); + } + else + Perl_croak_nocontext(\"%s: %s is not a reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\") +T_REF_IV_REF + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *INT2PTR($type *, tmp); + } + else + Perl_croak_nocontext(\"%s: %s is not of type %s\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\", \"$ntype\") +T_REF_IV_PTR + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = INT2PTR($type, tmp); + } + else + Perl_croak_nocontext(\"%s: %s is not of type %s\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\", \"$ntype\") +T_PTROBJ + if (SvROK($arg) && sv_derived_from($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = INT2PTR($type,tmp); + } + else + Perl_croak_nocontext(\"%s: %s is not of type %s\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\", \"$ntype\") +T_PTRDESC + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + ${type}_desc = (\U${type}_DESC\E*) tmp; + $var = ${type}_desc->ptr; + } + else + Perl_croak_nocontext(\"%s: %s is not of type %s\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\", \"$ntype\") +T_REFREF + if (SvROK($arg)) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *INT2PTR($type,tmp); + } + else + Perl_croak_nocontext(\"%s: %s is not a reference\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\") +T_REFOBJ + if (sv_isa($arg, \"${ntype}\")) { + IV tmp = SvIV((SV*)SvRV($arg)); + $var = *INT2PTR($type,tmp); + } + else + Perl_croak_nocontext(\"%s: %s is not of type %s\", + ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, + \"$var\", \"$ntype\") +T_OPAQUE + $var = *($type *)SvPV_nolen($arg) +T_OPAQUEPTR + $var = ($type)SvPV_nolen($arg) +T_PACKED + $var = XS_unpack_$ntype($arg) +T_PACKEDARRAY + $var = XS_unpack_$ntype($arg) +T_ARRAY + U32 ix_$var = $argoff; + $var = $ntype(items -= $argoff); + while (items--) { + DO_ARRAY_ELEM; + ix_$var++; + } + /* this is the number of elements in the array */ + ix_$var -= $argoff +T_STDIO + $var = PerlIO_findFILE(IoIFP(sv_2io($arg))) +T_IN + $var = IoIFP(sv_2io($arg)) +T_INOUT + $var = IoIFP(sv_2io($arg)) +T_OUT + $var = IoOFP(sv_2io($arg)) +############################################################################# +OUTPUT +T_SV + $arg = $var; +T_SVREF + $arg = newRV((SV*)$var); +T_SVREF_REFCOUNT_FIXED + $arg = newRV_noinc((SV*)$var); +T_AVREF + $arg = newRV((SV*)$var); +T_AVREF_REFCOUNT_FIXED + $arg = newRV_noinc((SV*)$var); +T_HVREF + $arg = newRV((SV*)$var); +T_HVREF_REFCOUNT_FIXED + $arg = newRV_noinc((SV*)$var); +T_CVREF + $arg = newRV((SV*)$var); +T_CVREF_REFCOUNT_FIXED + $arg = newRV_noinc((SV*)$var); +T_IV + sv_setiv($arg, (IV)$var); +T_UV + sv_setuv($arg, (UV)$var); +T_INT + sv_setiv($arg, (IV)$var); +T_SYSRET + if ($var != -1) { + if ($var == 0) + sv_setpvn($arg, "0 but true", 10); + else + sv_setiv($arg, (IV)$var); + } +T_ENUM + sv_setiv($arg, (IV)$var); +T_BOOL + ${"$var" eq "RETVAL" ? \"$arg = boolSV($var);" : \"sv_setsv($arg, boolSV($var));"} +T_U_INT + sv_setuv($arg, (UV)$var); +T_SHORT + sv_setiv($arg, (IV)$var); +T_U_SHORT + sv_setuv($arg, (UV)$var); +T_LONG + sv_setiv($arg, (IV)$var); +T_U_LONG + sv_setuv($arg, (UV)$var); +T_CHAR + sv_setpvn($arg, (char *)&$var, 1); +T_U_CHAR + sv_setuv($arg, (UV)$var); +T_FLOAT + sv_setnv($arg, (double)$var); +T_NV + sv_setnv($arg, (NV)$var); +T_DOUBLE + sv_setnv($arg, (double)$var); +T_PV + sv_setpv((SV*)$arg, $var); +T_PTR + sv_setiv($arg, PTR2IV($var)); +T_PTRREF + sv_setref_pv($arg, Nullch, (void*)$var); +T_REF_IV_REF + sv_setref_pv($arg, \"${ntype}\", (void*)new $ntype($var)); +T_REF_IV_PTR + sv_setref_pv($arg, \"${ntype}\", (void*)$var); +T_PTROBJ + sv_setref_pv($arg, \"${ntype}\", (void*)$var); +T_PTRDESC + sv_setref_pv($arg, \"${ntype}\", (void*)new\U${type}_DESC\E($var)); +T_REFREF + NOT_IMPLEMENTED +T_REFOBJ + NOT IMPLEMENTED +T_OPAQUE + sv_setpvn($arg, (char *)&$var, sizeof($var)); +T_OPAQUEPTR + sv_setpvn($arg, (char *)$var, sizeof(*$var)); +T_PACKED + XS_pack_$ntype($arg, $var); +T_PACKEDARRAY + XS_pack_$ntype($arg, $var, count_$ntype); +T_ARRAY + { + U32 ix_$var; + SSize_t extend_size = + /* The weird way this is written is because g++ is dumb + * enough to warn "comparison is always false" on something + * like: + * + * sizeof(a) > sizeof(b) && a > B_t_MAX + * + * (where the LH condition is false) + */ + (size_$var > (sizeof(size_$var) > sizeof(SSize_t) + ? SSize_t_MAX : size_$var)) + ? -1 : (SSize_t)size_$var; + EXTEND(SP, extend_size); + for (ix_$var = 0; ix_$var < size_$var; ix_$var++) { + ST(ix_$var) = sv_newmortal(); + DO_ARRAY_ELEM + } + } +T_STDIO + { + GV *gv = (GV *)sv_newmortal(); + PerlIO *fp = PerlIO_importFILE($var,0); + gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0); + if ( fp && do_open(gv, "+<&", 3, FALSE, 0, 0, fp) ) { + SV *rv = newRV_inc((SV*)gv); + rv = sv_bless(rv, GvSTASH(gv)); + ${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);" + : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"} + }${"$var" ne "RETVAL" ? \" + else + sv_setsv($arg, &PL_sv_undef);\n" : \""} + } +T_IN + { + GV *gv = (GV *)sv_newmortal(); + gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0); + if ( do_open(gv, "<&", 2, FALSE, 0, 0, $var) ) { + SV *rv = newRV_inc((SV*)gv); + rv = sv_bless(rv, GvSTASH(gv)); + ${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);" + : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"} + }${"$var" ne "RETVAL" ? \" + else + sv_setsv($arg, &PL_sv_undef);\n" : \""} + } +T_INOUT + { + GV *gv = (GV *)sv_newmortal(); + gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0); + if ( do_open(gv, "+<&", 3, FALSE, 0, 0, $var) ) { + SV *rv = newRV_inc((SV*)gv); + rv = sv_bless(rv, GvSTASH(gv)); + ${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);" + : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"} + }${"$var" ne "RETVAL" ? \" + else + sv_setsv($arg, &PL_sv_undef);\n" : \""} + } +T_OUT + { + GV *gv = (GV *)sv_newmortal(); + gv_init_pvn(gv, gv_stashpvs("$Package",1),"__ANONIO__",10,0); + if ( do_open(gv, "+>&", 3, FALSE, 0, 0, $var) ) { + SV *rv = newRV_inc((SV*)gv); + rv = sv_bless(rv, GvSTASH(gv)); + ${"$var" eq "RETVAL" ? \"$arg = sv_2mortal(rv);" + : \"sv_setsv($arg, rv);\n\t\tSvREFCNT_dec_NN(rv);"} + }${"$var" ne "RETVAL" ? \" + else + sv_setsv($arg, &PL_sv_undef);\n" : \""} + } +package ExtUtils::MM_AIX; + +use strict; +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +use ExtUtils::MakeMaker::Config; +require ExtUtils::MM_Unix; +our @ISA = qw(ExtUtils::MM_Unix); + + +sub dlsyms { + my($self,%attribs) = @_; + return '' unless $self->needs_linking; + join "\n", $self->xs_dlsyms_iterator(\%attribs); +} + + +sub xs_dlsyms_ext { + '.exp'; +} + +sub xs_dlsyms_arg { + my($self, $file) = @_; + return qq{-bE:${file}}; +} + +sub init_others { + my $self = shift; + $self->SUPER::init_others; + # perl "hints" add -bE:$(BASEEXT).exp to LDDLFLAGS. strip that out + # so right value can be added by xs_make_dynamic_lib to work for XSMULTI + $self->{LDDLFLAGS} ||= $Config{lddlflags}; + $self->{LDDLFLAGS} =~ s#(\s*)\S*\Q$(BASEEXT)\E\S*(\s*)#$1$2#; + return; +} + + + +1; +package ExtUtils::Constant; +use vars qw (@ISA $VERSION @EXPORT_OK %EXPORT_TAGS); +$VERSION = '0.25'; + + +if ($] >= 5.006) { + eval "use warnings; 1" or die $@; +} +use strict; +use Carp qw(croak cluck); + +use Exporter; +use ExtUtils::Constant::Utils qw(C_stringify); +use ExtUtils::Constant::XS qw(%XS_Constant %XS_TypeSet); + +@ISA = 'Exporter'; + +%EXPORT_TAGS = ( 'all' => [ qw( + XS_constant constant_types return_clause memEQ_clause C_stringify + C_constant autoload WriteConstants WriteMakefileSnippet +) ] ); + +@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); + + +sub constant_types { + ExtUtils::Constant::XS->header(); +} + +sub memEQ_clause { + cluck "ExtUtils::Constant::memEQ_clause is deprecated"; + ExtUtils::Constant::XS->memEQ_clause({name=>$_[0], checked_at=>$_[1], + indent=>$_[2]}); +} + +sub return_clause ($$) { + cluck "ExtUtils::Constant::return_clause is deprecated"; + my $indent = shift; + ExtUtils::Constant::XS->return_clause({indent=>$indent}, @_); +} + +sub switch_clause { + cluck "ExtUtils::Constant::switch_clause is deprecated"; + my $indent = shift; + my $comment = shift; + ExtUtils::Constant::XS->switch_clause({indent=>$indent, comment=>$comment}, + @_); +} + +sub C_constant { + my ($package, $subname, $default_type, $what, $indent, $breakout, @items) + = @_; + ExtUtils::Constant::XS->C_constant({package => $package, subname => $subname, + default_type => $default_type, + types => $what, indent => $indent, + breakout => $breakout}, @items); +} + + +sub XS_constant { + my $package = shift; + my $what = shift; + my $XS_subname = shift; + my $C_subname = shift; + $XS_subname ||= 'constant'; + $C_subname ||= $XS_subname; + + if (!ref $what) { + # Convert line of the form IV,UV,NV to hash + $what = {map {$_ => 1} split /,\s*/, ($what)}; + } + my $params = ExtUtils::Constant::XS->params ($what); + my $type; + + my $xs = <<"EOT"; +void +$XS_subname(sv) + PREINIT: +#ifdef dXSTARG + dXSTARG; /* Faster if we have it. */ +#else + dTARGET; +#endif + STRLEN len; + int type; +EOT + + if ($params->{IV}) { + $xs .= " IV iv = 0; /* avoid uninit var warning */\n"; + } else { + $xs .= " /* IV\t\tiv;\tUncomment this if you need to return IVs */\n"; + } + if ($params->{NV}) { + $xs .= " NV nv = 0.0; /* avoid uninit var warning */\n"; + } else { + $xs .= " /* NV\t\tnv;\tUncomment this if you need to return NVs */\n"; + } + if ($params->{PV}) { + $xs .= " const char *pv = NULL; /* avoid uninit var warning */\n"; + } else { + $xs .= + " /* const char\t*pv;\tUncomment this if you need to return PVs */\n"; + } + + $xs .= << 'EOT'; + INPUT: + SV * sv; + const char * s = SvPV(sv, len); +EOT + if ($params->{''}) { + $xs .= << 'EOT'; + INPUT: + int utf8 = SvUTF8(sv); +EOT + } + $xs .= << 'EOT'; + PPCODE: +EOT + + if ($params->{IV} xor $params->{NV}) { + $xs .= << "EOT"; + /* Change this to $C_subname(aTHX_ s, len, &iv, &nv); + if you need to return both NVs and IVs */ +EOT + } + $xs .= " type = $C_subname(aTHX_ s, len"; + $xs .= ', utf8' if $params->{''}; + $xs .= ', &iv' if $params->{IV}; + $xs .= ', &nv' if $params->{NV}; + $xs .= ', &pv' if $params->{PV}; + $xs .= ', &sv' if $params->{SV}; + $xs .= ");\n"; + + # If anyone is insane enough to suggest a package name containing % + my $package_sprintf_safe = $package; + $package_sprintf_safe =~ s/%/%%/g; + + $xs .= << "EOT"; + /* Return 1 or 2 items. First is error message, or undef if no error. + Second, if present, is found value */ + switch (type) { + case PERL_constant_NOTFOUND: + sv = + sv_2mortal(newSVpvf("%s is not a valid $package_sprintf_safe macro", s)); + PUSHs(sv); + break; + case PERL_constant_NOTDEF: + sv = sv_2mortal(newSVpvf( + "Your vendor has not defined $package_sprintf_safe macro %s, used", + s)); + PUSHs(sv); + break; +EOT + + foreach $type (sort keys %XS_Constant) { + # '' marks utf8 flag needed. + next if $type eq ''; + $xs .= "\t/* Uncomment this if you need to return ${type}s\n" + unless $what->{$type}; + $xs .= " case PERL_constant_IS$type:\n"; + if (length $XS_Constant{$type}) { + $xs .= << "EOT"; + EXTEND(SP, 2); + PUSHs(&PL_sv_undef); + $XS_Constant{$type}; +EOT + } else { + # Do nothing. return (), which will be correctly interpreted as + # (undef, undef) + } + $xs .= " break;\n"; + unless ($what->{$type}) { + chop $xs; # Yes, another need for chop not chomp. + $xs .= " */\n"; + } + } + $xs .= << "EOT"; + default: + sv = sv_2mortal(newSVpvf( + "Unexpected return type %d while processing $package_sprintf_safe macro %s, used", + type, s)); + PUSHs(sv); + } +EOT + + return $xs; +} + + + +# ' # Grr. syntax highlighters that don't grok pod. + +sub autoload { + my ($module, $compat_version, $autoloader) = @_; + $compat_version ||= $]; + croak "Can't maintain compatibility back as far as version $compat_version" + if $compat_version < 5; + my $func = "sub AUTOLOAD {\n" + . " # This AUTOLOAD is used to 'autoload' constants from the constant()\n" + . " # XS function."; + $func .= " If a constant is not found then control is passed\n" + . " # to the AUTOLOAD in AutoLoader." if $autoloader; + + + $func .= "\n\n" + . " my \$constname;\n"; + $func .= + " our \$AUTOLOAD;\n" if ($compat_version >= 5.006); + + $func .= <<"EOT"; + (\$constname = \$AUTOLOAD) =~ s/.*:://; + croak "&${module}::constant not defined" if \$constname eq 'constant'; + my (\$error, \$val) = constant(\$constname); +EOT + + if ($autoloader) { + $func .= <<'EOT'; + if ($error) { + if ($error =~ /is not a valid/) { + $AutoLoader::AUTOLOAD = $AUTOLOAD; + goto &AutoLoader::AUTOLOAD; + } else { + croak $error; + } + } +EOT + } else { + $func .= + " if (\$error) { croak \$error; }\n"; + } + + $func .= <<'END'; + { + no strict 'refs'; + # Fixed between 5.005_53 and 5.005_61 +#XXX if ($] >= 5.00561) { +#XXX *$AUTOLOAD = sub () { $val }; +#XXX } +#XXX else { + *$AUTOLOAD = sub { $val }; +#XXX } + } + goto &$AUTOLOAD; +} + +END + + return $func; +} + + + +sub WriteMakefileSnippet { + my %args = @_; + my $indent = $args{INDENT} || 2; + + my $result = <<"EOT"; +ExtUtils::Constant::WriteConstants( + NAME => '$args{NAME}', + NAMES => \\\@names, + DEFAULT_TYPE => '$args{DEFAULT_TYPE}', +EOT + foreach (qw (C_FILE XS_FILE)) { + next unless exists $args{$_}; + $result .= sprintf " %-12s => '%s',\n", + $_, $args{$_}; + } + $result .= <<'EOT'; + ); +EOT + + $result =~ s/^/' 'x$indent/gem; + return ExtUtils::Constant::XS->dump_names({default_type=>$args{DEFAULT_TYPE}, + indent=>$indent,}, + @{$args{NAMES}}) + . $result; +} + + +sub WriteConstants { + my %ARGS = + ( # defaults + C_FILE => 'const-c.inc', + XS_FILE => 'const-xs.inc', + XS_SUBNAME => 'constant', + DEFAULT_TYPE => 'IV', + @_); + + $ARGS{C_SUBNAME} ||= $ARGS{XS_SUBNAME}; # No-one sane will have C_SUBNAME eq '0' + + croak "Module name not specified" unless length $ARGS{NAME}; + + # Do this before creating (empty) files, in case it fails: + require ExtUtils::Constant::ProxySubs if $ARGS{PROXYSUBS}; + + my $c_fh = $ARGS{C_FH}; + if (!$c_fh) { + if ($] <= 5.008) { + # We need these little games, rather than doing things + # unconditionally, because we're used in core Makefile.PLs before + # IO is available (needed by filehandle), but also we want to work on + # older perls where undefined scalars do not automatically turn into + # anonymous file handles. + require FileHandle; + $c_fh = FileHandle->new(); + } + open $c_fh, ">$ARGS{C_FILE}" or die "Can't open $ARGS{C_FILE}: $!"; + } + + my $xs_fh = $ARGS{XS_FH}; + if (!$xs_fh) { + if ($] <= 5.008) { + require FileHandle; + $xs_fh = FileHandle->new(); + } + open $xs_fh, ">$ARGS{XS_FILE}" or die "Can't open $ARGS{XS_FILE}: $!"; + } + + # As this subroutine is intended to make code that isn't edited, there's no + # need for the user to specify any types that aren't found in the list of + # names. + + if ($ARGS{PROXYSUBS}) { + $ARGS{C_FH} = $c_fh; + $ARGS{XS_FH} = $xs_fh; + ExtUtils::Constant::ProxySubs->WriteConstants(%ARGS); + } else { + my $types = {}; + + print $c_fh constant_types(); # macro defs + print $c_fh "\n"; + + # indent is still undef. Until anyone implements indent style rules with + # it. + foreach (ExtUtils::Constant::XS->C_constant({package => $ARGS{NAME}, + subname => $ARGS{C_SUBNAME}, + default_type => + $ARGS{DEFAULT_TYPE}, + types => $types, + breakout => + $ARGS{BREAKOUT_AT}}, + @{$ARGS{NAMES}})) { + print $c_fh $_, "\n"; # C constant subs + } + print $xs_fh XS_constant ($ARGS{NAME}, $types, $ARGS{XS_SUBNAME}, + $ARGS{C_SUBNAME}); + } + + close $c_fh or warn "Error closing $ARGS{C_FILE}: $!" unless $ARGS{C_FH}; + close $xs_fh or warn "Error closing $ARGS{XS_FILE}: $!" unless $ARGS{XS_FH}; +} + +1; +__END__ + +package ExtUtils::MM_OS2; + +use strict; + +use ExtUtils::MakeMaker qw(neatvalue); +use File::Spec; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Any; +require ExtUtils::MM_Unix; +our @ISA = qw(ExtUtils::MM_Any ExtUtils::MM_Unix); + + +sub init_dist { + my($self) = @_; + + $self->{TO_UNIX} ||= <<'MAKE_TEXT'; +$(NOECHO) $(TEST_F) tmp.zip && $(RM_F) tmp.zip; $(ZIP) -ll -mr tmp.zip $(DISTVNAME) && unzip -o tmp.zip && $(RM_F) tmp.zip +MAKE_TEXT + + $self->SUPER::init_dist; +} + +sub dlsyms { + my($self,%attribs) = @_; + if ($self->{IMPORTS} && %{$self->{IMPORTS}}) { + # Make import files (needed for static build) + -d 'tmp_imp' or mkdir 'tmp_imp', 0777 or die "Can't mkdir tmp_imp"; + open my $imp, '>', 'tmpimp.imp' or die "Can't open tmpimp.imp"; + foreach my $name (sort keys %{$self->{IMPORTS}}) { + my $exp = $self->{IMPORTS}->{$name}; + my ($lib, $id) = ($exp =~ /(.*)\.(.*)/) or die "Malformed IMPORT `$exp'"; + print $imp "$name $lib $id ?\n"; + } + close $imp or die "Can't close tmpimp.imp"; + # print "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp\n"; + system "emximp -o tmpimp$Config::Config{lib_ext} tmpimp.imp" + and die "Cannot make import library: $!, \$?=$?"; + # May be running under miniperl, so have no glob... + eval { unlink ; 1 } or system "rm tmp_imp/*"; + system "cd tmp_imp; $Config::Config{ar} x ../tmpimp$Config::Config{lib_ext}" + and die "Cannot extract import objects: $!, \$?=$?"; + } + return '' if $self->{SKIPHASH}{'dynamic'}; + $self->xs_dlsyms_iterator(\%attribs); +} + +sub xs_dlsyms_ext { + '.def'; +} + +sub xs_dlsyms_extra { + join '', map { qq{, "$_" => "\$($_)"} } qw(VERSION DISTNAME INSTALLDIRS); +} + +sub static_lib_pure_cmd { + my($self) = @_; + my $old = $self->SUPER::static_lib_pure_cmd; + return $old unless $self->{IMPORTS} && %{$self->{IMPORTS}}; + $old . <<'EOC'; + $(AR) $(AR_STATIC_ARGS) "$@" tmp_imp/* + $(RANLIB) "$@" +EOC +} + +sub replace_manpage_separator { + my($self,$man) = @_; + $man =~ s,/+,.,g; + $man; +} + +sub maybe_command { + my($self,$file) = @_; + $file =~ s,[/\\]+,/,g; + return $file if -x $file && ! -d _; + return "$file.exe" if -x "$file.exe" && ! -d _; + return "$file.cmd" if -x "$file.cmd" && ! -d _; + return; +} + + +sub init_linker { + my $self = shift; + + $self->{PERL_ARCHIVE} = "\$(PERL_INC)/libperl\$(LIB_EXT)"; + + $self->{PERL_ARCHIVEDEP} ||= ''; + $self->{PERL_ARCHIVE_AFTER} = $OS2::is_aout + ? '' + : '$(PERL_INC)/libperl_override$(LIB_EXT)'; + $self->{EXPORT_LIST} = '$(BASEEXT).def'; +} + + +sub os_flavor { + return('OS/2'); +} + + +sub xs_static_lib_is_xs { + return 1; +} + + +1; +package ExtUtils::CBuilder; + +use File::Spec (); +use File::Path (); +use File::Basename (); +use Perl::OSType qw/os_type/; + +use warnings; +use strict; +our $VERSION = '0.280230'; # VERSION +our @ISA; + +# We only use this once - don't waste a symbol table entry on it. +# More importantly, don't make it an inheritable method. +my $load = sub { + my $mod = shift; + eval "use $mod"; + die $@ if $@; + @ISA = ($mod); +}; + +{ + my @package = split /::/, __PACKAGE__; + + my $ostype = os_type(); + + if (grep {-e File::Spec->catfile($_, @package, 'Platform', $^O) . '.pm'} @INC) { + $load->(__PACKAGE__ . "::Platform::$^O"); + + } elsif ( $ostype && + grep {-e File::Spec->catfile($_, @package, 'Platform', $ostype) . '.pm'} @INC) { + $load->(__PACKAGE__ . "::Platform::$ostype"); + + } else { + $load->(__PACKAGE__ . "::Base"); + } +} + +1; +__END__ + +package ExtUtils::Install; +use strict; + +use Config qw(%Config); +use Cwd qw(cwd); +use Exporter (); +use File::Basename qw(dirname); +use File::Copy; +use File::Path; +use File::Spec; + +our @ISA = ('Exporter'); +our @EXPORT = ('install','uninstall','pm_to_blib', 'install_default'); + +our $MUST_REBOOT; + + +our $VERSION = '2.14'; # <-- do not forget to update the POD section just above this line! +$VERSION = eval $VERSION; + + +BEGIN { + *Is_VMS = $^O eq 'VMS' ? sub(){1} : sub(){0}; + *Is_Win32 = $^O eq 'MSWin32' ? sub(){1} : sub(){0}; + *Is_cygwin = $^O eq 'cygwin' ? sub(){1} : sub(){0}; + *CanMoveAtBoot = ($^O eq 'MSWin32' || $^O eq 'cygwin') ? sub(){1} : sub(){0}; +} + +my $Inc_uninstall_warn_handler; + +# install relative to here + +my $INSTALL_ROOT = $ENV{PERL_INSTALL_ROOT}; +my $INSTALL_QUIET = $ENV{PERL_INSTALL_QUIET}; +$INSTALL_QUIET = 1 + if (!exists $ENV{PERL_INSTALL_QUIET} and + defined $ENV{MAKEFLAGS} and + $ENV{MAKEFLAGS} =~ /\b(s|silent|quiet)\b/); + +my $Curdir = File::Spec->curdir; + +sub _estr(@) { + return join "\n",'!' x 72,@_,'!' x 72,''; +} + +{my %warned; +sub _warnonce(@) { + my $first=shift; + my $msg=_estr "WARNING: $first",@_; + warn $msg unless $warned{$msg}++; +}} + +sub _choke(@) { + my $first=shift; + my $msg=_estr "ERROR: $first",@_; + require Carp; + Carp::croak($msg); +} + +sub _croak { + require Carp; + Carp::croak(@_); +} +sub _confess { + require Carp; + Carp::confess(@_); +} + +sub _compare { + require File::Compare; + File::Compare::compare(@_); +} + + +sub _chmod($$;$) { + my ( $mode, $item, $verbose )=@_; + $verbose ||= 0; + if (chmod $mode, $item) { + printf "chmod(0%o, %s)\n",$mode, $item if $verbose > 1; + } else { + my $err="$!"; + _warnonce sprintf "WARNING: Failed chmod(0%o, %s): %s\n", + $mode, $item, $err + if -e $item; + } +} + + +{ + my $Has_Win32API_File; + sub _move_file_at_boot { #XXX OS-SPECIFIC + my ( $file, $target, $moan )= @_; + _confess("Panic: Can't _move_file_at_boot on this platform!") + unless CanMoveAtBoot; + + my $descr= ref $target + ? "'$file' for deletion" + : "'$file' for installation as '$target'"; + + # *note* CanMoveAtBoot is only incidentally the same condition as below + # this needs not hold true in the future. + $Has_Win32API_File = (Is_Win32 || Is_cygwin) + ? (eval {require Win32API::File; 1} || 0) + : 0 unless defined $Has_Win32API_File; + if ( ! $Has_Win32API_File ) { + + my @msg=( + "Cannot schedule $descr at reboot.", + "Try installing Win32API::File to allow operations on locked files", + "to be scheduled during reboot. Or try to perform the operation by", + "hand yourself. (You may need to close other perl processes first)" + ); + if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } + return 0; + } + my $opts= Win32API::File::MOVEFILE_DELAY_UNTIL_REBOOT(); + $opts= $opts | Win32API::File::MOVEFILE_REPLACE_EXISTING() + unless ref $target; + + _chmod( 0666, $file ); + _chmod( 0666, $target ) unless ref $target; + + if (Win32API::File::MoveFileEx( $file, $target, $opts )) { + $MUST_REBOOT ||= ref $target ? 0 : 1; + return 1; + } else { + my @msg=( + "MoveFileEx $descr at reboot failed: $^E", + "You may try to perform the operation by hand yourself. ", + "(You may need to close other perl processes first).", + ); + if ( $moan ) { _warnonce(@msg) } else { _choke(@msg) } + } + return 0; + } +} + + + + + +sub _unlink_or_rename { #XXX OS-SPECIFIC + my ( $file, $tryhard, $installing )= @_; + + # this chmod was originally unconditional. However, its not needed on + # POSIXy systems since permission to unlink a file is specified by the + # directory rather than the file; and in fact it screwed up hard- and + # symlinked files. Keep it for other platforms in case its still + # needed there. + if ($^O =~ /^(dos|os2|MSWin32|VMS)$/) { + _chmod( 0666, $file ); + } + my $unlink_count = 0; + while (unlink $file) { $unlink_count++; } + return $file if $unlink_count > 0; + my $error="$!"; + + _choke("Cannot unlink '$file': $!") + unless CanMoveAtBoot && $tryhard; + + my $tmp= "AAA"; + ++$tmp while -e "$file.$tmp"; + $tmp= "$file.$tmp"; + + warn "WARNING: Unable to unlink '$file': $error\n", + "Going to try to rename it to '$tmp'.\n"; + + if ( rename $file, $tmp ) { + warn "Rename successful. Scheduling '$tmp'\nfor deletion at reboot.\n"; + # when $installing we can set $moan to true. + # IOW, if we cant delete the renamed file at reboot its + # not the end of the world. The other cases are more serious + # and need to be fatal. + _move_file_at_boot( $tmp, [], $installing ); + return $file; + } elsif ( $installing ) { + _warnonce("Rename failed: $!. Scheduling '$tmp'\nfor". + " installation as '$file' at reboot.\n"); + _move_file_at_boot( $tmp, $file ); + return $tmp; + } else { + _choke("Rename failed:$!", "Cannot proceed."); + } + +} + + + + + +sub _get_install_skip { + my ( $skip, $verbose )= @_; + if ($ENV{EU_INSTALL_IGNORE_SKIP}) { + print "EU_INSTALL_IGNORE_SKIP is set, ignore skipfile settings\n" + if $verbose>2; + return []; + } + if ( ! defined $skip ) { + print "Looking for install skip list\n" + if $verbose>2; + for my $file ( 'INSTALL.SKIP', $ENV{EU_INSTALL_SITE_SKIPFILE} ) { + next unless $file; + print "\tChecking for $file\n" + if $verbose>2; + if (-e $file) { + $skip= $file; + last; + } + } + } + if ($skip && !ref $skip) { + print "Reading skip patterns from '$skip'.\n" + if $verbose; + if (open my $fh,$skip ) { + my @patterns; + while (<$fh>) { + chomp; + next if /^\s*(?:#|$)/; + print "\tSkip pattern: $_\n" if $verbose>3; + push @patterns, $_; + } + $skip= \@patterns; + } else { + warn "Can't read skip file:'$skip':$!\n"; + $skip=[]; + } + } elsif ( UNIVERSAL::isa($skip,'ARRAY') ) { + print "Using array for skip list\n" + if $verbose>2; + } elsif ($verbose) { + print "No skip list found.\n" + if $verbose>1; + $skip= []; + } + warn "Got @{[0+@$skip]} skip patterns.\n" + if $verbose>3; + return $skip +} + + +{ + my $has_posix; + sub _have_write_access { + my $dir=shift; + unless (defined $has_posix) { + $has_posix = (!Is_cygwin && !Is_Win32 + && eval { local $^W; require POSIX; 1} ) || 0; + } + if ($has_posix) { + return POSIX::access($dir, POSIX::W_OK()); + } else { + return -w $dir; + } + } +} + + + +sub _can_write_dir { + my $dir=shift; + return + unless defined $dir and length $dir; + + my ($vol, $dirs, $file) = File::Spec->splitpath($dir,1); + my @dirs = File::Spec->splitdir($dirs); + unshift @dirs, File::Spec->curdir + unless File::Spec->file_name_is_absolute($dir); + + my $path=''; + my @make; + while (@dirs) { + if (Is_VMS) { + $dir = File::Spec->catdir($vol,@dirs); + } + else { + $dir = File::Spec->catdir(@dirs); + $dir = File::Spec->catpath($vol,$dir,'') + if defined $vol and length $vol; + } + next if ( $dir eq $path ); + if ( ! -e $dir ) { + unshift @make,$dir; + next; + } + if ( _have_write_access($dir) ) { + return 1,$dir,@make + } else { + return 0,$dir,@make + } + } continue { + pop @dirs; + } + return 0; +} + + +sub _mkpath { + my ($dir,$show,$mode,$verbose,$dry_run)=@_; + if ( $verbose && $verbose > 1 && ! -d $dir) { + $show= 1; + printf "mkpath(%s,%d,%#o)\n", $dir, $show, $mode; + } + if (!$dry_run) { + if ( ! eval { File::Path::mkpath($dir,$show,$mode); 1 } ) { + _choke("Can't create '$dir'","$@"); + } + + } + my ($can,$root,@make)=_can_write_dir($dir); + if (!$can) { + my @msg=( + "Can't create '$dir'", + $root ? "Do not have write permissions on '$root'" + : "Unknown Error" + ); + if ($dry_run) { + _warnonce @msg; + } else { + _choke @msg; + } + } elsif ($show and $dry_run) { + print "$_\n" for @make; + } + +} + + + +sub _copy { + my ( $from, $to, $verbose, $dry_run)=@_; + if ($verbose && $verbose>1) { + printf "copy(%s,%s)\n", $from, $to; + } + if (!$dry_run) { + File::Copy::copy($from,$to) + or _croak( _estr "ERROR: Cannot copy '$from' to '$to': $!" ); + } +} + + +sub _chdir { + my ($dir)= @_; + my $ret; + if (defined wantarray) { + $ret= cwd; + } + chdir $dir + or _choke("Couldn't chdir to '$dir': $!"); + return $ret; +} + + +sub install { #XXX OS-SPECIFIC + my($from_to,$verbose,$dry_run,$uninstall_shadows,$skip,$always_copy,$result) = @_; + if (@_==1 and eval { 1+@$from_to }) { + my %opts = @$from_to; + $from_to = $opts{from_to} + or _confess("from_to is a mandatory parameter"); + $verbose = $opts{verbose}; + $dry_run = $opts{dry_run}; + $uninstall_shadows = $opts{uninstall_shadows}; + $skip = $opts{skip}; + $always_copy = $opts{always_copy}; + $result = $opts{result}; + } + + $result ||= {}; + $verbose ||= 0; + $dry_run ||= 0; + + $skip= _get_install_skip($skip,$verbose); + $always_copy = $ENV{EU_INSTALL_ALWAYS_COPY} + || $ENV{EU_ALWAYS_COPY} + || 0 + unless defined $always_copy; + + my(%from_to) = %$from_to; + my(%pack, $dir, %warned); + require ExtUtils::Packlist; + my($packlist) = ExtUtils::Packlist->new(); + + local(*DIR); + for (qw/read write/) { + $pack{$_}=$from_to{$_}; + delete $from_to{$_}; + } + my $tmpfile = install_rooted_file($pack{"read"}); + $packlist->read($tmpfile) if (-f $tmpfile); + my $cwd = cwd(); + my @found_files; + my %check_dirs; + require File::Find; + + my $blib_lib = File::Spec->catdir('blib', 'lib'); + my $blib_arch = File::Spec->catdir('blib', 'arch'); + + # File::Find seems to always be Unixy except on MacPerl :( + my $current_directory = $^O eq 'MacOS' ? $Curdir : '.'; + + MOD_INSTALL: foreach my $source (sort keys %from_to) { + #copy the tree to the target directory without altering + #timestamp and permission and remember for the .packlist + #file. The packlist file contains the absolute paths of the + #install locations. AFS users may call this a bug. We'll have + #to reconsider how to add the means to satisfy AFS users also. + + #October 1997: we want to install .pm files into archlib if + #there are any files in arch. So we depend on having ./blib/arch + #hardcoded here. + + my $targetroot = install_rooted_dir($from_to{$source}); + + if ($source eq $blib_lib and + exists $from_to{$blib_arch} and + directory_not_empty($blib_arch) + ){ + $targetroot = install_rooted_dir($from_to{$blib_arch}); + print "Files found in $blib_arch: installing files in $blib_lib into architecture dependent library tree\n"; + } + + next unless -d $source; + _chdir($source); + # 5.5.3's File::Find missing no_chdir option + # XXX OS-SPECIFIC + File::Find::find(sub { + my ($mode,$size,$atime,$mtime) = (stat)[2,7,8,9]; + + return if !-f _; + my $origfile = $_; + + return if $origfile eq ".exists"; + my $targetdir = File::Spec->catdir($targetroot, $File::Find::dir); + my $targetfile = File::Spec->catfile($targetdir, $origfile); + my $sourcedir = File::Spec->catdir($source, $File::Find::dir); + my $sourcefile = File::Spec->catfile($sourcedir, $origfile); + + for my $pat (@$skip) { + if ( $sourcefile=~/$pat/ ) { + print "Skipping $targetfile (filtered)\n" + if $verbose>1; + $result->{install_filtered}{$sourcefile} = $pat; + return; + } + } + # we have to do this for back compat with old File::Finds + # and because the target is relative + my $save_cwd = _chdir($cwd); + my $diff = 0; + # XXX: I wonder how useful this logic is actually -- demerphq + if ( $always_copy or !-f $targetfile or -s $targetfile != $size) { + $diff++; + } else { + # we might not need to copy this file + $diff = _compare($sourcefile, $targetfile); + } + $check_dirs{$targetdir}++ + unless -w $targetfile; + + push @found_files, + [ $diff, $File::Find::dir, $origfile, + $mode, $size, $atime, $mtime, + $targetdir, $targetfile, $sourcedir, $sourcefile, + + ]; + #restore the original directory we were in when File::Find + #called us so that it doesn't get horribly confused. + _chdir($save_cwd); + }, $current_directory ); + _chdir($cwd); + } + foreach my $targetdir (sort keys %check_dirs) { + _mkpath( $targetdir, 0, 0755, $verbose, $dry_run ); + } + foreach my $found (@found_files) { + my ($diff, $ffd, $origfile, $mode, $size, $atime, $mtime, + $targetdir, $targetfile, $sourcedir, $sourcefile)= @$found; + + my $realtarget= $targetfile; + if ($diff) { + eval { + if (-f $targetfile) { + print "_unlink_or_rename($targetfile)\n" if $verbose>1; + $targetfile= _unlink_or_rename( $targetfile, 'tryhard', 'install' ) + unless $dry_run; + } elsif ( ! -d $targetdir ) { + _mkpath( $targetdir, 0, 0755, $verbose, $dry_run ); + } + print "Installing $targetfile\n"; + + _copy( $sourcefile, $targetfile, $verbose, $dry_run, ); + + + #XXX OS-SPECIFIC + print "utime($atime,$mtime,$targetfile)\n" if $verbose>1; + utime($atime,$mtime + Is_VMS,$targetfile) unless $dry_run>1; + + + $mode = 0444 | ( $mode & 0111 ? 0111 : 0 ); + $mode = $mode | 0222 + if $realtarget ne $targetfile; + _chmod( $mode, $targetfile, $verbose ); + $result->{install}{$targetfile} = $sourcefile; + 1 + } or do { + $result->{install_fail}{$targetfile} = $sourcefile; + die $@; + }; + } else { + $result->{install_unchanged}{$targetfile} = $sourcefile; + print "Skipping $targetfile (unchanged)\n" if $verbose; + } + + if ( $uninstall_shadows ) { + inc_uninstall($sourcefile,$ffd, $verbose, + $dry_run, + $realtarget ne $targetfile ? $realtarget : "", + $result); + } + + # Record the full pathname. + $packlist->{$targetfile}++; + } + + if ($pack{'write'}) { + $dir = install_rooted_dir(dirname($pack{'write'})); + _mkpath( $dir, 0, 0755, $verbose, $dry_run ); + print "Writing $pack{'write'}\n" if $verbose; + $packlist->write(install_rooted_file($pack{'write'})) unless $dry_run; + } + + _do_cleanup($verbose); + return $result; +} + + +sub _do_cleanup { + my ($verbose) = @_; + if ($MUST_REBOOT) { + die _estr "Operation not completed! ", + "You must reboot to complete the installation.", + "Sorry."; + } elsif (defined $MUST_REBOOT & $verbose) { + warn _estr "Installation will be completed at the next reboot.\n", + "However it is not necessary to reboot immediately.\n"; + } +} + + + +sub install_rooted_file { + if (defined $INSTALL_ROOT) { + File::Spec->catfile($INSTALL_ROOT, $_[0]); + } else { + $_[0]; + } +} + + +sub install_rooted_dir { + if (defined $INSTALL_ROOT) { + File::Spec->catdir($INSTALL_ROOT, $_[0]); + } else { + $_[0]; + } +} + + + +sub forceunlink { + my ( $file, $tryhard )= @_; #XXX OS-SPECIFIC + _unlink_or_rename( $file, $tryhard, not("installing") ); +} + + +sub directory_not_empty ($) { + my($dir) = @_; + my $files = 0; + require File::Find; + File::Find::find(sub { + return if $_ eq ".exists"; + if (-f) { + $File::Find::prune++; + $files = 1; + } + }, $dir); + return $files; +} + + +sub install_default { + @_ < 2 or _croak("install_default should be called with 0 or 1 argument"); + my $FULLEXT = @_ ? shift : $ARGV[0]; + defined $FULLEXT or die "Do not know to where to write install log"; + my $INST_LIB = File::Spec->catdir($Curdir,"blib","lib"); + my $INST_ARCHLIB = File::Spec->catdir($Curdir,"blib","arch"); + my $INST_BIN = File::Spec->catdir($Curdir,'blib','bin'); + my $INST_SCRIPT = File::Spec->catdir($Curdir,'blib','script'); + my $INST_MAN1DIR = File::Spec->catdir($Curdir,'blib','man1'); + my $INST_MAN3DIR = File::Spec->catdir($Curdir,'blib','man3'); + + my @INST_HTML; + if($Config{installhtmldir}) { + my $INST_HTMLDIR = File::Spec->catdir($Curdir,'blib','html'); + @INST_HTML = ($INST_HTMLDIR => $Config{installhtmldir}); + } + + install({ + read => "$Config{sitearchexp}/auto/$FULLEXT/.packlist", + write => "$Config{installsitearch}/auto/$FULLEXT/.packlist", + $INST_LIB => (directory_not_empty($INST_ARCHLIB)) ? + $Config{installsitearch} : + $Config{installsitelib}, + $INST_ARCHLIB => $Config{installsitearch}, + $INST_BIN => $Config{installbin} , + $INST_SCRIPT => $Config{installscript}, + $INST_MAN1DIR => $Config{installman1dir}, + $INST_MAN3DIR => $Config{installman3dir}, + @INST_HTML, + },1,0,0); +} + + + +sub uninstall { + my($fil,$verbose,$dry_run) = @_; + $verbose ||= 0; + $dry_run ||= 0; + + die _estr "ERROR: no packlist file found: '$fil'" + unless -f $fil; + # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al)); + # require $my_req; # Hairy, but for the first + require ExtUtils::Packlist; + my ($packlist) = ExtUtils::Packlist->new($fil); + foreach (sort(keys(%$packlist))) { + chomp; + print "unlink $_\n" if $verbose; + forceunlink($_,'tryhard') unless $dry_run; + } + print "unlink $fil\n" if $verbose; + forceunlink($fil, 'tryhard') unless $dry_run; + _do_cleanup($verbose); +} + + +sub inc_uninstall { + my($filepath,$libdir,$verbose,$dry_run,$ignore,$results) = @_; + my($dir); + $ignore||=""; + my $file = (File::Spec->splitpath($filepath))[2]; + my %seen_dir = (); + + my @PERL_ENV_LIB = split $Config{path_sep}, defined $ENV{'PERL5LIB'} + ? $ENV{'PERL5LIB'} : $ENV{'PERLLIB'} || ''; + + my @dirs=( @PERL_ENV_LIB, + @INC, + @Config{qw(archlibexp + privlibexp + sitearchexp + sitelibexp)}); + + #warn join "\n","---",@dirs,"---"; + my $seen_ours; + foreach $dir ( @dirs ) { + my $canonpath = Is_VMS ? $dir : File::Spec->canonpath($dir); + next if $canonpath eq $Curdir; + next if $seen_dir{$canonpath}++; + my $targetfile = File::Spec->catfile($canonpath,$libdir,$file); + next unless -f $targetfile; + + # The reason why we compare file's contents is, that we cannot + # know, which is the file we just installed (AFS). So we leave + # an identical file in place + my $diff = 0; + if ( -f $targetfile && -s _ == -s $filepath) { + # We have a good chance, we can skip this one + $diff = _compare($filepath,$targetfile); + } else { + $diff++; + } + print "#$file and $targetfile differ\n" if $diff && $verbose > 1; + + if (!$diff or $targetfile eq $ignore) { + $seen_ours = 1; + next; + } + if ($dry_run) { + $results->{uninstall}{$targetfile} = $filepath; + if ($verbose) { + $Inc_uninstall_warn_handler ||= ExtUtils::Install::Warn->new(); + $libdir =~ s|^\./||s ; # That's just cosmetics, no need to port. It looks prettier. + $Inc_uninstall_warn_handler->add( + File::Spec->catfile($libdir, $file), + $targetfile + ); + } + # if not verbose, we just say nothing + } else { + print "Unlinking $targetfile (shadowing?)\n" if $verbose; + eval { + die "Fake die for testing" + if $ExtUtils::Install::Testing and + ucase(File::Spec->canonpath($ExtUtils::Install::Testing)) eq ucase($targetfile); + forceunlink($targetfile,'tryhard'); + $results->{uninstall}{$targetfile} = $filepath; + 1; + } or do { + $results->{fail_uninstall}{$targetfile} = $filepath; + if ($seen_ours) { + warn "Failed to remove probably harmless shadow file '$targetfile'\n"; + } else { + die "$@\n"; + } + }; + } + } +} + + +sub run_filter { + my ($cmd, $src, $dest) = @_; + local(*CMD, *SRC); + open(CMD, "|$cmd >$dest") || die "Cannot fork: $!"; + open(SRC, $src) || die "Cannot open $src: $!"; + my $buf; + my $sz = 1024; + while (my $len = sysread(SRC, $buf, $sz)) { + syswrite(CMD, $buf, $len); + } + close SRC; + close CMD or die "Filter command '$cmd' failed for $src"; +} + + +sub pm_to_blib { + my($fromto,$autodir,$pm_filter) = @_; + + _mkpath($autodir,0,0755) if defined $autodir; + while(my($from, $to) = each %$fromto) { + if( -f $to && -s $from == -s $to && -M $to < -M $from ) { + print "Skip $to (unchanged)\n" unless $INSTALL_QUIET; + next; + } + + # When a pm_filter is defined, we need to pre-process the source first + # to determine whether it has changed or not. Therefore, only perform + # the comparison check when there's no filter to be ran. + # -- RAM, 03/01/2001 + + my $need_filtering = defined $pm_filter && length $pm_filter && + $from =~ /\.pm$/; + + if (!$need_filtering && 0 == _compare($from,$to)) { + print "Skip $to (unchanged)\n" unless $INSTALL_QUIET; + next; + } + if (-f $to){ + # we wont try hard here. its too likely to mess things up. + forceunlink($to); + } else { + _mkpath(dirname($to),0,0755); + } + if ($need_filtering) { + run_filter($pm_filter, $from, $to); + print "$pm_filter <$from >$to\n"; + } else { + _copy( $from, $to ); + print "cp $from $to\n" unless $INSTALL_QUIET; + } + my($mode,$atime,$mtime) = (stat $from)[2,8,9]; + utime($atime,$mtime+Is_VMS,$to); + _chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$to); + next unless $from =~ /\.pm$/; + _autosplit($to,$autodir) if defined $autodir; + } +} + + + +sub _autosplit { #XXX OS-SPECIFIC + require AutoSplit; + my $retval = AutoSplit::autosplit(@_); + close *AutoSplit::IN if defined *AutoSplit::IN{IO}; + + return $retval; +} + + +package ExtUtils::Install::Warn; + +sub new { bless {}, shift } + +sub add { + my($self,$file,$targetfile) = @_; + push @{$self->{$file}}, $targetfile; +} + +sub DESTROY { + unless(defined $INSTALL_ROOT) { + my $self = shift; + my($file,$i,$plural); + foreach $file (sort keys %$self) { + $plural = @{$self->{$file}} > 1 ? "s" : ""; + print "## Differing version$plural of $file found. You might like to\n"; + for (0..$#{$self->{$file}}) { + print "rm ", $self->{$file}[$_], "\n"; + $i++; + } + } + $plural = $i>1 ? "all those files" : "this file"; + my $inst = (_invokant() eq 'ExtUtils::MakeMaker') + ? ( $Config::Config{make} || 'make' ).' install' + . ( ExtUtils::Install::Is_VMS ? '/MACRO="UNINST"=1' : ' UNINST=1' ) + : './Build install uninst=1'; + print "## Running '$inst' will unlink $plural for you.\n"; + } +} + + +sub _invokant { + my @stack; + my $frame = 0; + while (my $file = (caller($frame++))[1]) { + push @stack, (File::Spec->splitpath($file))[2]; + } + + my $builder; + my $top = pop @stack; + if ($top =~ /^Build/i || exists($INC{'Module/Build.pm'})) { + $builder = 'Module::Build'; + } else { + $builder = 'ExtUtils::MakeMaker'; + } + return $builder; +} + + +1; +package ExtUtils::MM_Cygwin; + +use strict; + +use ExtUtils::MakeMaker::Config; +use File::Spec; + +require ExtUtils::MM_Unix; +require ExtUtils::MM_Win32; +our @ISA = qw( ExtUtils::MM_Unix ); + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + + + +sub os_flavor { + return('Unix', 'Cygwin'); +} + + +sub cflags { + my($self,$libperl)=@_; + return $self->{CFLAGS} if $self->{CFLAGS}; + return '' unless $self->needs_linking(); + + my $base = $self->SUPER::cflags($libperl); + foreach (split /\n/, $base) { + /^(\S*)\s*=\s*(\S*)$/ and $self->{$1} = $2; + }; + $self->{CCFLAGS} .= " -DUSEIMPORTLIB" if ($Config{useshrplib} eq 'true'); + + return $self->{CFLAGS} = qq{ +CCFLAGS = $self->{CCFLAGS} +OPTIMIZE = $self->{OPTIMIZE} +PERLTYPE = $self->{PERLTYPE} +}; + +} + + + +sub replace_manpage_separator { + my($self, $man) = @_; + $man =~ s{/+}{.}g; + return $man; +} + + +sub init_linker { + my $self = shift; + + if ($Config{useshrplib} eq 'true') { + my $libperl = '$(PERL_INC)' .'/'. "$Config{libperl}"; + if( $] >= 5.006002 ) { + $libperl =~ s/(dll\.)?a$/dll.a/; + } + $self->{PERL_ARCHIVE} = $libperl; + } else { + $self->{PERL_ARCHIVE} = + '$(PERL_INC)' .'/'. ("$Config{libperl}" or "libperl.a"); + } + + $self->{PERL_ARCHIVEDEP} ||= ''; + $self->{PERL_ARCHIVE_AFTER} ||= ''; + $self->{EXPORT_LIST} ||= ''; +} + + +sub maybe_command { + my ($self, $file) = @_; + + my $cygpath = Cygwin::posix_to_win_path('/', 1); + my $filepath = Cygwin::posix_to_win_path($file, 1); + + return (substr($filepath,0,length($cygpath)) eq $cygpath) + ? $self->SUPER::maybe_command($file) # Unix + : ExtUtils::MM_Win32->maybe_command($file); # Win32 +} + + +sub dynamic_lib { + my($self, %attribs) = @_; + my $s = ExtUtils::MM_Unix::dynamic_lib($self, %attribs); + return '' unless $s; + return $s unless %{$self->{XS}}; + + # do an ephemeral rebase so the new DLL fits to the current rebase map + $s .= "\t/bin/find \$\(INST_ARCHLIB\)/auto -xdev -name \\*.$self->{DLEXT} | /bin/rebase -sOT -" if (( $Config{myarchname} eq 'i686-cygwin' ) and not ( exists $ENV{CYGPORT_PACKAGE_VERSION} )); + $s; +} + + +sub install { + my($self, %attribs) = @_; + my $s = ExtUtils::MM_Unix::install($self, %attribs); + return '' unless $s; + return $s unless %{$self->{XS}}; + + my $INSTALLDIRS = $self->{INSTALLDIRS}; + my $INSTALLLIB = $self->{"INSTALL". ($INSTALLDIRS eq 'perl' ? 'ARCHLIB' : uc($INSTALLDIRS)."ARCH")}; + my $dop = "\$\(DESTDIR\)$INSTALLLIB/auto/"; + my $dll = "$dop/$self->{FULLEXT}/$self->{BASEEXT}.$self->{DLEXT}"; + $s =~ s|^(pure_install :: pure_\$\(INSTALLDIRS\)_install\n\t)\$\(NOECHO\) \$\(NOOP\)\n|$1\$(CHMOD) \$(PERM_RWX) $dll\n\t/bin/find $dop -xdev -name \\*.$self->{DLEXT} \| /bin/rebase -sOT -\n|m if (( $Config{myarchname} eq 'i686-cygwin') and not ( exists $ENV{CYGPORT_PACKAGE_VERSION} )); + $s; +} + + +sub all_target { + ExtUtils::MM_Unix::all_target(shift); +} + + +1; +package ExtUtils::MM_BeOS; + +use strict; + + +use ExtUtils::MakeMaker::Config; +use File::Spec; +require ExtUtils::MM_Any; +require ExtUtils::MM_Unix; + +our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + + + +sub os_flavor { + return('BeOS'); +} + + +sub init_linker { + my($self) = shift; + + $self->{PERL_ARCHIVE} ||= + File::Spec->catdir('$(PERL_INC)',$Config{libperl}); + $self->{PERL_ARCHIVEDEP} ||= ''; + $self->{PERL_ARCHIVE_AFTER} ||= ''; + $self->{EXPORT_LIST} ||= ''; +} + +package ExtUtils::Packlist; + +use 5.00503; +use strict; +use Carp qw(); +use Config; +use vars qw($VERSION $Relocations); +$VERSION = '2.14'; +$VERSION = eval $VERSION; + +# Used for generating filehandle globs. IO::File might not be available! +my $fhname = "FH1"; + + +sub mkfh() +{ +no strict; +local $^W; +my $fh = \*{$fhname++}; +use strict; +return($fh); +} + + +sub __find_relocations +{ + my %paths; + while (my ($raw_key, $raw_val) = each %Config) { + my $exp_key = $raw_key . "exp"; + next unless exists $Config{$exp_key}; + next unless $raw_val =~ m!\.\.\./!; + $paths{$Config{$exp_key}}++; + } + # Longest prefixes go first in the alternatives + my $alternations = join "|", map {quotemeta $_} + sort {length $b <=> length $a} keys %paths; + qr/^($alternations)/o; +} + +sub new($$) +{ +my ($class, $packfile) = @_; +$class = ref($class) || $class; +my %self; +tie(%self, $class, $packfile); +return(bless(\%self, $class)); +} + +sub TIEHASH +{ +my ($class, $packfile) = @_; +my $self = { packfile => $packfile }; +bless($self, $class); +$self->read($packfile) if (defined($packfile) && -f $packfile); +return($self); +} + +sub STORE +{ +$_[0]->{data}->{$_[1]} = $_[2]; +} + +sub FETCH +{ +return($_[0]->{data}->{$_[1]}); +} + +sub FIRSTKEY +{ +my $reset = scalar(keys(%{$_[0]->{data}})); +return(each(%{$_[0]->{data}})); +} + +sub NEXTKEY +{ +return(each(%{$_[0]->{data}})); +} + +sub EXISTS +{ +return(exists($_[0]->{data}->{$_[1]})); +} + +sub DELETE +{ +return(delete($_[0]->{data}->{$_[1]})); +} + +sub CLEAR +{ +%{$_[0]->{data}} = (); +} + +sub DESTROY +{ +} + +sub read($;$) +{ +my ($self, $packfile) = @_; +$self = tied(%$self) || $self; + +if (defined($packfile)) { $self->{packfile} = $packfile; } +else { $packfile = $self->{packfile}; } +Carp::croak("No packlist filename specified") if (! defined($packfile)); +my $fh = mkfh(); +open($fh, "<$packfile") || Carp::croak("Can't open file $packfile: $!"); +$self->{data} = {}; +my ($line); +while (defined($line = <$fh>)) + { + chomp $line; + my ($key, $data) = $line; + if ($key =~ /^(.*?)( \w+=.*)$/) + { + $key = $1; + $data = { map { split('=', $_) } split(' ', $2)}; + + if ($Config{userelocatableinc} && $data->{relocate_as}) + { + require File::Spec; + require Cwd; + my ($vol, $dir) = File::Spec->splitpath($packfile); + my $newpath = File::Spec->catpath($vol, $dir, $data->{relocate_as}); + $key = Cwd::realpath($newpath); + } + } + $key =~ s!/\./!/!g; # Some .packlists have spurious '/./' bits in the paths + $self->{data}->{$key} = $data; + } +close($fh); +} + +sub write($;$) +{ +my ($self, $packfile) = @_; +$self = tied(%$self) || $self; +if (defined($packfile)) { $self->{packfile} = $packfile; } +else { $packfile = $self->{packfile}; } +Carp::croak("No packlist filename specified") if (! defined($packfile)); +my $fh = mkfh(); +open($fh, ">$packfile") || Carp::croak("Can't open file $packfile: $!"); +foreach my $key (sort(keys(%{$self->{data}}))) + { + my $data = $self->{data}->{$key}; + if ($Config{userelocatableinc}) { + $Relocations ||= __find_relocations(); + if ($packfile =~ $Relocations) { + # We are writing into a subdirectory of a run-time relocated + # path. Figure out if the this file is also within a subdir. + my $prefix = $1; + if (File::Spec->no_upwards(File::Spec->abs2rel($key, $prefix))) + { + # The relocated path is within the found prefix + my $packfile_prefix; + (undef, $packfile_prefix) + = File::Spec->splitpath($packfile); + + my $relocate_as + = File::Spec->abs2rel($key, $packfile_prefix); + + if (!ref $data) { + $data = {}; + } + $data->{relocate_as} = $relocate_as; + } + } + } + print $fh ("$key"); + if (ref($data)) + { + foreach my $k (sort(keys(%$data))) + { + print $fh (" $k=$data->{$k}"); + } + } + print $fh ("\n"); + } +close($fh); +} + +sub validate($;$) +{ +my ($self, $remove) = @_; +$self = tied(%$self) || $self; +my @missing; +foreach my $key (sort(keys(%{$self->{data}}))) + { + if (! -e $key) + { + push(@missing, $key); + delete($self->{data}{$key}) if ($remove); + } + } +return(@missing); +} + +sub packlist_file($) +{ +my ($self) = @_; +$self = tied(%$self) || $self; +return($self->{packfile}); +} + +1; + +__END__ + +package ExtUtils::MY; + +use strict; +require ExtUtils::MM; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; +our @ISA = qw(ExtUtils::MM); + +{ + package MY; + our @ISA = qw(ExtUtils::MY); +} + +sub DESTROY {} + + +package ExtUtils::Typemaps; +use 5.006001; +use strict; +use warnings; +our $VERSION = '3.38'; + +require ExtUtils::ParseXS; +require ExtUtils::ParseXS::Constants; +require ExtUtils::Typemaps::InputMap; +require ExtUtils::Typemaps::OutputMap; +require ExtUtils::Typemaps::Type; + + + +sub new { + my $class = shift; + my %args = @_; + + if (defined $args{file} and defined $args{string}) { + die("Cannot handle both 'file' and 'string' arguments to constructor"); + } + + my $self = bless { + file => undef, + %args, + typemap_section => [], + typemap_lookup => {}, + input_section => [], + input_lookup => {}, + output_section => [], + output_lookup => {}, + } => $class; + + $self->_init(); + + return $self; +} + +sub _init { + my $self = shift; + if (defined $self->{string}) { + $self->_parse(\($self->{string}), $self->{lineno_offset}, $self->{fake_filename}); + delete $self->{string}; + } + elsif (defined $self->{file} and -e $self->{file}) { + open my $fh, '<', $self->{file} + or die "Cannot open typemap file '" + . $self->{file} . "' for reading: $!"; + local $/ = undef; + my $string = <$fh>; + $self->_parse(\$string, $self->{lineno_offset}, $self->{file}); + } +} + + + +sub file { + $_[0]->{file} = $_[1] if @_ > 1; + $_[0]->{file} +} + + +sub add_typemap { + my $self = shift; + my $type; + my %args; + + if ((@_ % 2) == 1) { + my $orig = shift; + $type = $orig->new(); + %args = @_; + } + else { + %args = @_; + my $ctype = $args{ctype}; + die("Need ctype argument") if not defined $ctype; + my $xstype = $args{xstype}; + die("Need xstype argument") if not defined $xstype; + + $type = ExtUtils::Typemaps::Type->new( + xstype => $xstype, + 'prototype' => $args{'prototype'}, + ctype => $ctype, + ); + } + + if ($args{skip} and $args{replace}) { + die("Cannot use both 'skip' and 'replace'"); + } + + if ($args{replace}) { + $self->remove_typemap(ctype => $type->ctype); + } + elsif ($args{skip}) { + return() if exists $self->{typemap_lookup}{$type->ctype}; + } + else { + $self->validate(typemap_xstype => $type->xstype, ctype => $type->ctype); + } + + # store + push @{$self->{typemap_section}}, $type; + # remember type for lookup, too. + $self->{typemap_lookup}{$type->tidy_ctype} = $#{$self->{typemap_section}}; + + return 1; +} + + +sub add_inputmap { + my $self = shift; + my $input; + my %args; + + if ((@_ % 2) == 1) { + my $orig = shift; + $input = $orig->new(); + %args = @_; + } + else { + %args = @_; + my $xstype = $args{xstype}; + die("Need xstype argument") if not defined $xstype; + my $code = $args{code}; + die("Need code argument") if not defined $code; + + $input = ExtUtils::Typemaps::InputMap->new( + xstype => $xstype, + code => $code, + ); + } + + if ($args{skip} and $args{replace}) { + die("Cannot use both 'skip' and 'replace'"); + } + + if ($args{replace}) { + $self->remove_inputmap(xstype => $input->xstype); + } + elsif ($args{skip}) { + return() if exists $self->{input_lookup}{$input->xstype}; + } + else { + $self->validate(inputmap_xstype => $input->xstype); + } + + # store + push @{$self->{input_section}}, $input; + # remember type for lookup, too. + $self->{input_lookup}{$input->xstype} = $#{$self->{input_section}}; + + return 1; +} + + +sub add_outputmap { + my $self = shift; + my $output; + my %args; + + if ((@_ % 2) == 1) { + my $orig = shift; + $output = $orig->new(); + %args = @_; + } + else { + %args = @_; + my $xstype = $args{xstype}; + die("Need xstype argument") if not defined $xstype; + my $code = $args{code}; + die("Need code argument") if not defined $code; + + $output = ExtUtils::Typemaps::OutputMap->new( + xstype => $xstype, + code => $code, + ); + } + + if ($args{skip} and $args{replace}) { + die("Cannot use both 'skip' and 'replace'"); + } + + if ($args{replace}) { + $self->remove_outputmap(xstype => $output->xstype); + } + elsif ($args{skip}) { + return() if exists $self->{output_lookup}{$output->xstype}; + } + else { + $self->validate(outputmap_xstype => $output->xstype); + } + + # store + push @{$self->{output_section}}, $output; + # remember type for lookup, too. + $self->{output_lookup}{$output->xstype} = $#{$self->{output_section}}; + + return 1; +} + + +sub add_string { + my $self = shift; + my %args = @_; + die("Need 'string' argument") if not defined $args{string}; + + # no, this is not elegant. + my $other = ExtUtils::Typemaps->new(string => $args{string}); + $self->merge(typemap => $other); +} + + +sub remove_typemap { + my $self = shift; + my $ctype; + if (@_ > 1) { + my %args = @_; + $ctype = $args{ctype}; + die("Need ctype argument") if not defined $ctype; + $ctype = tidy_type($ctype); + } + else { + $ctype = $_[0]->tidy_ctype; + } + + return $self->_remove($ctype, $self->{typemap_section}, $self->{typemap_lookup}); +} + + +sub remove_inputmap { + my $self = shift; + my $xstype; + if (@_ > 1) { + my %args = @_; + $xstype = $args{xstype}; + die("Need xstype argument") if not defined $xstype; + } + else { + $xstype = $_[0]->xstype; + } + + return $self->_remove($xstype, $self->{input_section}, $self->{input_lookup}); +} + + +sub remove_outputmap { + my $self = shift; + my $xstype; + if (@_ > 1) { + my %args = @_; + $xstype = $args{xstype}; + die("Need xstype argument") if not defined $xstype; + } + else { + $xstype = $_[0]->xstype; + } + + return $self->_remove($xstype, $self->{output_section}, $self->{output_lookup}); +} + +sub _remove { + my $self = shift; + my $rm = shift; + my $array = shift; + my $lookup = shift; + + # Just fetch the index of the item from the lookup table + my $index = $lookup->{$rm}; + return() if not defined $index; + + # Nuke the item from storage + splice(@$array, $index, 1); + + # Decrement the storage position of all items thereafter + foreach my $key (keys %$lookup) { + if ($lookup->{$key} > $index) { + $lookup->{$key}--; + } + } + return(); +} + + +sub get_typemap { + my $self = shift; + die("Need named parameters, got uneven number") if @_ % 2; + + my %args = @_; + my $ctype = $args{ctype}; + die("Need ctype argument") if not defined $ctype; + $ctype = tidy_type($ctype); + + my $index = $self->{typemap_lookup}{$ctype}; + return() if not defined $index; + return $self->{typemap_section}[$index]; +} + + +sub get_inputmap { + my $self = shift; + die("Need named parameters, got uneven number") if @_ % 2; + + my %args = @_; + my $xstype = $args{xstype}; + my $ctype = $args{ctype}; + die("Need xstype or ctype argument") + if not defined $xstype + and not defined $ctype; + die("Need xstype OR ctype arguments, not both") + if defined $xstype and defined $ctype; + + if (defined $ctype) { + my $tm = $self->get_typemap(ctype => $ctype); + $xstype = $tm && $tm->xstype; + return() if not defined $xstype; + } + + my $index = $self->{input_lookup}{$xstype}; + return() if not defined $index; + return $self->{input_section}[$index]; +} + + +sub get_outputmap { + my $self = shift; + die("Need named parameters, got uneven number") if @_ % 2; + + my %args = @_; + my $xstype = $args{xstype}; + my $ctype = $args{ctype}; + die("Need xstype or ctype argument") + if not defined $xstype + and not defined $ctype; + die("Need xstype OR ctype arguments, not both") + if defined $xstype and defined $ctype; + + if (defined $ctype) { + my $tm = $self->get_typemap(ctype => $ctype); + $xstype = $tm && $tm->xstype; + return() if not defined $xstype; + } + + my $index = $self->{output_lookup}{$xstype}; + return() if not defined $index; + return $self->{output_section}[$index]; +} + + +sub write { + my $self = shift; + my %args = @_; + my $file = defined $args{file} ? $args{file} : $self->file(); + die("write() needs a file argument (or set the file name of the typemap using the 'file' method)") + if not defined $file; + + open my $fh, '>', $file + or die "Cannot open typemap file '$file' for writing: $!"; + print $fh $self->as_string(); + close $fh; +} + + +sub as_string { + my $self = shift; + my $typemap = $self->{typemap_section}; + my @code; + push @code, "TYPEMAP\n"; + foreach my $entry (@$typemap) { + # type kind proto + # /^(.*?\S)\s+(\S+)\s*($ExtUtils::ParseXS::Constants::PrototypeRegexp*)$/o + push @code, $entry->ctype . "\t" . $entry->xstype + . ($entry->proto ne '' ? "\t".$entry->proto : '') . "\n"; + } + + my $input = $self->{input_section}; + if (@$input) { + push @code, "\nINPUT\n"; + foreach my $entry (@$input) { + push @code, $entry->xstype, "\n", $entry->code, "\n"; + } + } + + my $output = $self->{output_section}; + if (@$output) { + push @code, "\nOUTPUT\n"; + foreach my $entry (@$output) { + push @code, $entry->xstype, "\n", $entry->code, "\n"; + } + } + return join '', @code; +} + + +sub as_embedded_typemap { + my $self = shift; + my $string = $self->as_string; + + my @ident_cand = qw(END_TYPEMAP END_OF_TYPEMAP END); + my $icand = 0; + my $cand_suffix = ""; + while ($string =~ /^\Q$ident_cand[$icand]$cand_suffix\E\s*$/m) { + $icand++; + if ($icand == @ident_cand) { + $icand = 0; + ++$cand_suffix; + } + } + + my $marker = "$ident_cand[$icand]$cand_suffix"; + return "TYPEMAP: <<$marker;\n$string\n$marker\n"; +} + + +sub merge { + my $self = shift; + my %args = @_; + + if (exists $args{typemap} and exists $args{file}) { + die("Need {file} OR {typemap} argument. Not both!"); + } + elsif (not exists $args{typemap} and not exists $args{file}) { + die("Need {file} or {typemap} argument!"); + } + + my @params; + push @params, 'replace' => $args{replace} if exists $args{replace}; + push @params, 'skip' => $args{skip} if exists $args{skip}; + + my $typemap = $args{typemap}; + if (not defined $typemap) { + $typemap = ref($self)->new(file => $args{file}, @params); + } + + # FIXME breaking encapsulation. Add accessor code. + foreach my $entry (@{$typemap->{typemap_section}}) { + $self->add_typemap( $entry, @params ); + } + + foreach my $entry (@{$typemap->{input_section}}) { + $self->add_inputmap( $entry, @params ); + } + + foreach my $entry (@{$typemap->{output_section}}) { + $self->add_outputmap( $entry, @params ); + } + + return 1; +} + + +sub is_empty { + my $self = shift; + + return @{ $self->{typemap_section} } == 0 + && @{ $self->{input_section} } == 0 + && @{ $self->{output_section} } == 0; +} + + +sub list_mapped_ctypes { + my $self = shift; + return sort keys %{ $self->{typemap_lookup} }; +} + + +sub _get_typemap_hash { + my $self = shift; + my $lookup = $self->{typemap_lookup}; + my $storage = $self->{typemap_section}; + + my %rv; + foreach my $ctype (keys %$lookup) { + $rv{$ctype} = $storage->[ $lookup->{$ctype} ]->xstype; + } + + return \%rv; +} + + +sub _get_inputmap_hash { + my $self = shift; + my $lookup = $self->{input_lookup}; + my $storage = $self->{input_section}; + + my %rv; + foreach my $xstype (keys %$lookup) { + $rv{$xstype} = $storage->[ $lookup->{$xstype} ]->code; + + # Squash trailing whitespace to one line break + # This isn't strictly necessary, but makes the output more similar + # to the original ExtUtils::ParseXS. + $rv{$xstype} =~ s/\s*\z/\n/; + } + + return \%rv; +} + + + +sub _get_outputmap_hash { + my $self = shift; + my $lookup = $self->{output_lookup}; + my $storage = $self->{output_section}; + + my %rv; + foreach my $xstype (keys %$lookup) { + $rv{$xstype} = $storage->[ $lookup->{$xstype} ]->code; + + # Squash trailing whitespace to one line break + # This isn't strictly necessary, but makes the output more similar + # to the original ExtUtils::ParseXS. + $rv{$xstype} =~ s/\s*\z/\n/; + } + + return \%rv; +} + + +sub _get_prototype_hash { + my $self = shift; + my $lookup = $self->{typemap_lookup}; + my $storage = $self->{typemap_section}; + + my %rv; + foreach my $ctype (keys %$lookup) { + $rv{$ctype} = $storage->[ $lookup->{$ctype} ]->proto || '$'; + } + + return \%rv; +} + + + +# make sure that the provided types wouldn't collide with what's +# in the object already. +sub validate { + my $self = shift; + my %args = @_; + + if ( exists $args{ctype} + and exists $self->{typemap_lookup}{tidy_type($args{ctype})} ) + { + die("Multiple definition of ctype '$args{ctype}' in TYPEMAP section"); + } + + if ( exists $args{inputmap_xstype} + and exists $self->{input_lookup}{$args{inputmap_xstype}} ) + { + die("Multiple definition of xstype '$args{inputmap_xstype}' in INPUTMAP section"); + } + + if ( exists $args{outputmap_xstype} + and exists $self->{output_lookup}{$args{outputmap_xstype}} ) + { + die("Multiple definition of xstype '$args{outputmap_xstype}' in OUTPUTMAP section"); + } + + return 1; +} + + +sub clone { + my $proto = shift; + my %args = @_; + + my $self; + if ($args{shallow}) { + $self = bless( { + %$proto, + typemap_section => [@{$proto->{typemap_section}}], + typemap_lookup => {%{$proto->{typemap_lookup}}}, + input_section => [@{$proto->{input_section}}], + input_lookup => {%{$proto->{input_lookup}}}, + output_section => [@{$proto->{output_section}}], + output_lookup => {%{$proto->{output_lookup}}}, + } => ref($proto) ); + } + else { + $self = bless( { + %$proto, + typemap_section => [map $_->new, @{$proto->{typemap_section}}], + typemap_lookup => {%{$proto->{typemap_lookup}}}, + input_section => [map $_->new, @{$proto->{input_section}}], + input_lookup => {%{$proto->{input_lookup}}}, + output_section => [map $_->new, @{$proto->{output_section}}], + output_lookup => {%{$proto->{output_lookup}}}, + } => ref($proto) ); + } + + return $self; +} + + +sub tidy_type { + local $_ = shift; + + # for templated C++ types, do some bit of flawed canonicalization + # wrt. templates at least + if (/[<>]/) { + s/\s*([<>])\s*/$1/g; + s/>>/> >/g; + } + + # rationalise any '*' by joining them into bunches and removing whitespace + s#\s*(\*+)\s*#$1#g; + s#(\*+)# $1 #g ; + + # trim leading & trailing whitespace + s/^\s+//; s/\s+$//; + + # change multiple whitespace into a single space + s/\s+/ /g; + + $_; +} + + + +sub _parse { + my $self = shift; + my $stringref = shift; + my $lineno_offset = shift; + $lineno_offset = 0 if not defined $lineno_offset; + my $filename = shift; + $filename = '' if not defined $filename; + + my $replace = $self->{replace}; + my $skip = $self->{skip}; + die "Can only replace OR skip" if $replace and $skip; + my @add_params; + push @add_params, replace => 1 if $replace; + push @add_params, skip => 1 if $skip; + + # TODO comments should round-trip, currently ignoring + # TODO order of sections, multiple sections of same type + # Heavily influenced by ExtUtils::ParseXS + my $section = 'typemap'; + my $lineno = $lineno_offset; + my $junk = ""; + my $current = \$junk; + my @input_expr; + my @output_expr; + while ($$stringref =~ /^(.*)$/gcm) { + local $_ = $1; + ++$lineno; + chomp; + next if /^\s*#/; + if (/^INPUT\s*$/) { + $section = 'input'; + $current = \$junk; + next; + } + elsif (/^OUTPUT\s*$/) { + $section = 'output'; + $current = \$junk; + next; + } + elsif (/^TYPEMAP\s*$/) { + $section = 'typemap'; + $current = \$junk; + next; + } + + if ($section eq 'typemap') { + my $line = $_; + s/^\s+//; s/\s+$//; + next if $_ eq '' or /^#/; + my($type, $kind, $proto) = /^(.*?\S)\s+(\S+)\s*($ExtUtils::ParseXS::Constants::PrototypeRegexp*)$/o + or warn("Warning: File '$filename' Line $lineno '$line' TYPEMAP entry needs 2 or 3 columns\n"), + next; + # prototype defaults to '$' + $proto = '$' unless $proto; + warn("Warning: File '$filename' Line $lineno '$line' Invalid prototype '$proto'\n") + unless _valid_proto_string($proto); + $self->add_typemap( + ExtUtils::Typemaps::Type->new( + xstype => $kind, proto => $proto, ctype => $type + ), + @add_params + ); + } elsif (/^\s/) { + s/\s+$//; + $$current .= $$current eq '' ? $_ : "\n".$_; + } elsif ($_ eq '') { + next; + } elsif ($section eq 'input') { + s/\s+$//; + push @input_expr, {xstype => $_, code => ''}; + $current = \$input_expr[-1]{code}; + } else { # output section + s/\s+$//; + push @output_expr, {xstype => $_, code => ''}; + $current = \$output_expr[-1]{code}; + } + + } # end while lines + + foreach my $inexpr (@input_expr) { + $self->add_inputmap( ExtUtils::Typemaps::InputMap->new(%$inexpr), @add_params ); + } + foreach my $outexpr (@output_expr) { + $self->add_outputmap( ExtUtils::Typemaps::OutputMap->new(%$outexpr), @add_params ); + } + + return 1; +} + +# taken from ExtUtils::ParseXS +sub _valid_proto_string { + my $string = shift; + if ($string =~ /^$ExtUtils::ParseXS::Constants::PrototypeRegexp+$/o) { + return $string; + } + + return 0 ; +} + +# taken from ExtUtils::ParseXS (C_string) +sub _escape_backslashes { + my $string = shift; + $string =~ s[\\][\\\\]g; + $string; +} + + +1; + +package ExtUtils::Command; + +use 5.00503; +use strict; +require Exporter; +use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION); +@ISA = qw(Exporter); +@EXPORT = qw(cp rm_f rm_rf mv cat eqtime mkpath touch test_f test_d chmod + dos2unix); +$VERSION = '7.34'; +$VERSION = eval $VERSION; + +my $Is_VMS = $^O eq 'VMS'; +my $Is_VMS_mode = $Is_VMS; +my $Is_VMS_noefs = $Is_VMS; +my $Is_Win32 = $^O eq 'MSWin32'; + +if( $Is_VMS ) { + my $vms_unix_rpt; + my $vms_efs; + my $vms_case; + + if (eval { local $SIG{__DIE__}; + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require VMS::Feature; }) { + $vms_unix_rpt = VMS::Feature::current("filename_unix_report"); + $vms_efs = VMS::Feature::current("efs_charset"); + $vms_case = VMS::Feature::current("efs_case_preserve"); + } else { + my $unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + my $efs_charset = $ENV{'DECC$EFS_CHARSET'} || ''; + my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || ''; + $vms_unix_rpt = $unix_rpt =~ /^[ET1]/i; + $vms_efs = $efs_charset =~ /^[ET1]/i; + $vms_case = $efs_case =~ /^[ET1]/i; + } + $Is_VMS_mode = 0 if $vms_unix_rpt; + $Is_VMS_noefs = 0 if ($vms_efs); +} + + + +# VMS uses % instead of ? to mean "one character" +my $wild_regex = $Is_VMS ? '*%' : '*?'; +sub expand_wildcards +{ + @ARGV = map(/[$wild_regex]/o ? glob($_) : $_,@ARGV); +} + + + +sub cat () +{ + expand_wildcards(); + print while (<>); +} + + +sub eqtime +{ + my ($src,$dst) = @ARGV; + local @ARGV = ($dst); touch(); # in case $dst doesn't exist + utime((stat($src))[8,9],$dst); +} + + +sub rm_rf +{ + expand_wildcards(); + require File::Path; + File::Path::rmtree([grep -e $_,@ARGV],0,0); +} + + +sub rm_f { + expand_wildcards(); + + foreach my $file (@ARGV) { + next unless -f $file; + + next if _unlink($file); + + chmod(0777, $file); + + next if _unlink($file); + + require Carp; + Carp::carp("Cannot delete $file: $!"); + } +} + +sub _unlink { + my $files_unlinked = 0; + foreach my $file (@_) { + my $delete_count = 0; + $delete_count++ while unlink $file; + $files_unlinked++ if $delete_count; + } + return $files_unlinked; +} + + + +sub touch { + my $t = time; + expand_wildcards(); + foreach my $file (@ARGV) { + open(FILE,">>$file") || die "Cannot write $file:$!"; + close(FILE); + utime($t,$t,$file); + } +} + + +sub mv { + expand_wildcards(); + my @src = @ARGV; + my $dst = pop @src; + + if (@src > 1 && ! -d $dst) { + require Carp; + Carp::croak("Too many arguments"); + } + + require File::Copy; + my $nok = 0; + foreach my $src (@src) { + $nok ||= !File::Copy::move($src,$dst); + } + return !$nok; +} + + +sub cp { + expand_wildcards(); + my @src = @ARGV; + my $dst = pop @src; + + if (@src > 1 && ! -d $dst) { + require Carp; + Carp::croak("Too many arguments"); + } + + require File::Copy; + my $nok = 0; + foreach my $src (@src) { + $nok ||= !File::Copy::copy($src,$dst); + + # Win32 does not update the mod time of a copied file, just the + # created time which make does not look at. + utime(time, time, $dst) if $Is_Win32; + } + return $nok; +} + + +sub chmod { + local @ARGV = @ARGV; + my $mode = shift(@ARGV); + expand_wildcards(); + + if( $Is_VMS_mode && $Is_VMS_noefs) { + require File::Spec; + foreach my $idx (0..$#ARGV) { + my $path = $ARGV[$idx]; + next unless -d $path; + + # chmod 0777, [.foo.bar] doesn't work on VMS, you have to do + # chmod 0777, [.foo]bar.dir + my @dirs = File::Spec->splitdir( $path ); + $dirs[-1] .= '.dir'; + $path = File::Spec->catfile(@dirs); + + $ARGV[$idx] = $path; + } + } + + chmod(oct $mode,@ARGV) || die "Cannot chmod ".join(' ',$mode,@ARGV).":$!"; +} + + +sub mkpath +{ + expand_wildcards(); + require File::Path; + File::Path::mkpath([@ARGV],0,0777); +} + + +sub test_f +{ + exit(-f $ARGV[0] ? 0 : 1); +} + + +sub test_d +{ + exit(-d $ARGV[0] ? 0 : 1); +} + + +sub dos2unix { + require File::Find; + File::Find::find(sub { + return if -d; + return unless -w _; + return unless -r _; + return if -B _; + + local $\; + + my $orig = $_; + my $temp = '.dos2unix_tmp'; + open ORIG, $_ or do { warn "dos2unix can't open $_: $!"; return }; + open TEMP, ">$temp" or + do { warn "dos2unix can't create .dos2unix_tmp: $!"; return }; + binmode ORIG; binmode TEMP; + while (my $line = ) { + $line =~ s/\015\012/\012/g; + print TEMP $line; + } + close ORIG; + close TEMP; + rename $temp, $orig; + + }, @ARGV); +} + + +package ExtUtils::MM_NW5; + + +use strict; +use ExtUtils::MakeMaker::Config; +use File::Basename; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Win32; +our @ISA = qw(ExtUtils::MM_Win32); + +use ExtUtils::MakeMaker qw(&neatvalue &_sprintf562); + +$ENV{EMXSHELL} = 'sh'; # to run `commands` + +my $BORLAND = $Config{'cc'} =~ /\bbcc/i; +my $GCC = $Config{'cc'} =~ /\bgcc/i; + + + +sub os_flavor { + my $self = shift; + return ($self->SUPER::os_flavor, 'Netware'); +} + + +sub init_platform { + my($self) = shift; + + # To get Win32's setup. + $self->SUPER::init_platform; + + # incpath is copied to makefile var INCLUDE in constants sub, here just + # make it empty + my $libpth = $Config{'libpth'}; + $libpth =~ s( )(;); + $self->{'LIBPTH'} = $libpth; + + $self->{'BASE_IMPORT'} = $Config{'base_import'}; + + # Additional import file specified from Makefile.pl + if($self->{'base_import'}) { + $self->{'BASE_IMPORT'} .= ', ' . $self->{'base_import'}; + } + + $self->{'NLM_VERSION'} = $Config{'nlm_version'}; + $self->{'MPKTOOL'} = $Config{'mpktool'}; + $self->{'TOOLPATH'} = $Config{'toolpath'}; + + (my $boot = $self->{'NAME'}) =~ s/:/_/g; + $self->{'BOOT_SYMBOL'}=$boot; + + # If the final binary name is greater than 8 chars, + # truncate it here. + if(length($self->{'BASEEXT'}) > 8) { + $self->{'NLM_SHORT_NAME'} = substr($self->{'BASEEXT'},0,8); + } + + # Get the include path and replace the spaces with ; + # Copy this to makefile as INCLUDE = d:\...;d:\; + ($self->{INCLUDE} = $Config{'incpath'}) =~ s/([ ]*)-I/;/g; + + # Set the path to CodeWarrior binaries which might not have been set in + # any other place + $self->{PATH} = '$(PATH);$(TOOLPATH)'; + + $self->{MM_NW5_VERSION} = $VERSION; +} + +sub platform_constants { + my($self) = shift; + my $make_frag = ''; + + # Setup Win32's constants. + $make_frag .= $self->SUPER::platform_constants; + + foreach my $macro (qw(LIBPTH BASE_IMPORT NLM_VERSION MPKTOOL + TOOLPATH BOOT_SYMBOL NLM_SHORT_NAME INCLUDE PATH + MM_NW5_VERSION + )) + { + next unless defined $self->{$macro}; + $make_frag .= "$macro = $self->{$macro}\n"; + } + + return $make_frag; +} + + +sub static_lib_pure_cmd { + my ($self, $src) = @_; + $src =~ s/(\$\(\w+)(\))/$1:^"+"$2/g if $BORLAND; + sprintf qq{\t\$(AR) %s\n}, ($BORLAND ? '$@ ' . $src + : ($GCC ? '-ru $@ ' . $src + : '-type library -o $@ ' . $src)); +} + + +sub xs_static_lib_is_xs { + return 1; +} + + +sub xs_make_dynamic_lib { + my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_; + my @m; + # Taking care of long names like FileHandle, ByteLoader, SDBM_File etc + if ($to =~ /^\$/) { + if ($self->{NLM_SHORT_NAME}) { + # deal with shortnames + my $newto = q{$(INST_AUTODIR)\\$(NLM_SHORT_NAME).$(DLEXT)}; + push @m, "$to: $newto\n\n"; + $to = $newto; + } + } else { + my ($v, $d, $f) = File::Spec->splitpath($to); + # relies on $f having a literal "." in it, unlike for $(OBJ_EXT) + if ($f =~ /[^\.]{9}\./) { + # 9+ chars before '.', need to shorten + $f = substr $f, 0, 8; + } + my $newto = File::Spec->catpath($v, $d, $f); + push @m, "$to: $newto\n\n"; + $to = $newto; + } + # bits below should be in dlsyms, not here + # 1 2 3 4 + push @m, _sprintf562 <<'MAKE_FRAG', $to, $from, $todir, $exportlist; +# Create xdc data for an MT safe NLM in case of mpk build +%1$s: %2$s $(MYEXTLIB) $(BOOTSTRAP) %3$s$(DFSEP).exists + $(NOECHO) $(ECHO) Export boot_$(BOOT_SYMBOL) > %4$s + $(NOECHO) $(ECHO) $(BASE_IMPORT) >> %4$s + $(NOECHO) $(ECHO) Import @$(PERL_INC)\perl.imp >> %4$s +MAKE_FRAG + if ( $self->{CCFLAGS} =~ m/ -DMPK_ON /) { + (my $xdc = $exportlist) =~ s#def\z#xdc#; + $xdc = '$(BASEEXT).xdc'; + push @m, sprintf <<'MAKE_FRAG', $xdc, $exportlist; + $(MPKTOOL) $(XDCFLAGS) %s + $(NOECHO) $(ECHO) xdcdata $(BASEEXT).xdc >> %s +MAKE_FRAG + } + # Reconstruct the X.Y.Z version. + my $version = join '.', map { sprintf "%d", $_ } + $] =~ /(\d)\.(\d{3})(\d{2})/; + push @m, sprintf <<'EOF', $from, $version, $to, $exportlist; + $(LD) $(LDFLAGS) %s -desc "Perl %s Extension ($(BASEEXT)) XS_VERSION: $(XS_VERSION)" -nlmversion $(NLM_VERSION) -o %s $(MYEXTLIB) $(PERL_INC)\Main.lib -commandfile %s + $(CHMOD) 755 $@ +EOF + join '', @m; +} + +1; +__END__ + +package ExtUtils::MM_Any; + +use strict; +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +use Carp; +use File::Spec; +use File::Basename; +BEGIN { our @ISA = qw(File::Spec); } + +# We need $Verbose +use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562); + +use ExtUtils::MakeMaker::Config; + + +# So we don't have to keep calling the methods over and over again, +# we have these globals to cache the values. Faster and shrtr. +my $Curdir = __PACKAGE__->curdir; +#my $Updir = __PACKAGE__->updir; + +my $METASPEC_URL = 'https://metacpan.org/pod/CPAN::Meta::Spec'; +my $METASPEC_V = 2; + + +sub os_flavor_is { + my $self = shift; + my %flavors = map { ($_ => 1) } $self->os_flavor; + return (grep { $flavors{$_} } @_) ? 1 : 0; +} + + + +sub can_load_xs { + return defined &DynaLoader::boot_DynaLoader ? 1 : 0; +} + + + +sub can_run { + my ($self, $command) = @_; + + # a lot of VMS executables have a symbol defined + # check those first + if ( $^O eq 'VMS' ) { + require VMS::DCLsym; + my $syms = VMS::DCLsym->new; + return $command if scalar $syms->getsym( uc $command ); + } + + my @possibles; + + if( File::Spec->file_name_is_absolute($command) ) { + return $self->maybe_command($command); + + } else { + for my $dir ( + File::Spec->path, + File::Spec->curdir + ) { + next if ! $dir || ! -d $dir; + my $abs = File::Spec->catfile($self->os_flavor_is('Win32') ? Win32::GetShortPathName( $dir ) : $dir, $command); + push @possibles, $abs if $abs = $self->maybe_command($abs); + } + } + return @possibles if wantarray; + return shift @possibles; +} + + + +sub can_redirect_error { + my $self = shift; + $self->os_flavor_is('Unix') + or ($self->os_flavor_is('Win32') and !$self->os_flavor_is('Win9x')) + or $self->os_flavor_is('OS/2') +} + + + +my %maketype2true; +# undocumented - so t/cd.t can still do its thing +sub _clear_maketype_cache { %maketype2true = () } + +sub is_make_type { + my($self, $type) = @_; + return $maketype2true{$type} if defined $maketype2true{$type}; + (undef, undef, my $make_basename) = $self->splitpath($self->make); + return $maketype2true{$type} = 1 + if $make_basename =~ /\b$type\b/i; # executable's filename + return $maketype2true{$type} = 0 + if $make_basename =~ /\b[gdn]make\b/i; # Never fall through for dmake/nmake/gmake + # now have to run with "-v" and guess + my $redirect = $self->can_redirect_error ? '2>&1' : ''; + my $make = $self->make || $self->{MAKE}; + my $minus_v = `"$make" -v $redirect`; + return $maketype2true{$type} = 1 + if $type eq 'gmake' and $minus_v =~ /GNU make/i; + return $maketype2true{$type} = 1 + if $type eq 'bsdmake' + and $minus_v =~ /^usage: make \[-BeikNnqrstWwX\]/im; + $maketype2true{$type} = 0; # it wasn't whatever you asked +} + + + +my $cached_dep_space; +sub can_dep_space { + my $self = shift; + return $cached_dep_space if defined $cached_dep_space; + return $cached_dep_space = 1 if $self->is_make_type('gmake'); + return $cached_dep_space = 0 if $self->is_make_type('dmake'); # only on W32 + return $cached_dep_space = 0 if $self->is_make_type('bsdmake'); + return $cached_dep_space = 0; # assume no +} + + + +sub quote_dep { + my ($self, $arg) = @_; + die <can_dep_space; +Tried to use make dependency with space for make that can't: + '$arg' +EOF + $arg =~ s/( )/\\$1/g; # how GNU make does it + return $arg; +} + + + +sub split_command { + my($self, $cmd, @args) = @_; + + my @cmds = (); + return(@cmds) unless @args; + + # If the command was given as a here-doc, there's probably a trailing + # newline. + chomp $cmd; + + # set aside 30% for macro expansion. + my $len_left = int($self->max_exec_len * 0.70); + $len_left -= length $self->_expand_macros($cmd); + + do { + my $arg_str = ''; + my @next_args; + while( @next_args = splice(@args, 0, 2) ) { + # Two at a time to preserve pairs. + my $next_arg_str = "\t ". join ' ', @next_args, "\n"; + + if( !length $arg_str ) { + $arg_str .= $next_arg_str + } + elsif( length($arg_str) + length($next_arg_str) > $len_left ) { + unshift @args, @next_args; + last; + } + else { + $arg_str .= $next_arg_str; + } + } + chop $arg_str; + + push @cmds, $self->escape_newlines("$cmd \n$arg_str"); + } while @args; + + return @cmds; +} + + +sub _expand_macros { + my($self, $cmd) = @_; + + $cmd =~ s{\$\((\w+)\)}{ + defined $self->{$1} ? $self->{$1} : "\$($1)" + }e; + return $cmd; +} + + + +# override if this isn't suitable! +sub make_type { return 'Unix-style'; } + + + +sub stashmeta { + my($self, $text, $file) = @_; + $self->echo($text, $file, { allow_variables => 0, append => 0 }); +} + + + +sub echo { + my($self, $text, $file, $opts) = @_; + + # Compatibility with old options + if( !ref $opts ) { + my $append = $opts; + $opts = { append => $append || 0 }; + } + $opts->{allow_variables} = 0 unless defined $opts->{allow_variables}; + + my $ql_opts = { allow_variables => $opts->{allow_variables} }; + my @cmds = map { '$(NOECHO) $(ECHO) '.$self->quote_literal($_, $ql_opts) } + split /\n/, $text; + if( $file ) { + my $redirect = $opts->{append} ? '>>' : '>'; + $cmds[0] .= " $redirect $file"; + $_ .= " >> $file" foreach @cmds[1..$#cmds]; + } + + return @cmds; +} + + + +sub wraplist { + my $self = shift; + return join " \\\n\t", @_; +} + + + +sub maketext_filter { return $_[1] } + + + +sub escape_dollarsigns { + my($self, $text) = @_; + + # Escape dollar signs which are not starting a variable + $text =~ s{\$ (?!\() }{\$\$}gx; + + return $text; +} + + + +sub escape_all_dollarsigns { + my($self, $text) = @_; + + # Escape dollar signs + $text =~ s{\$}{\$\$}gx; + + return $text; +} + + + +sub make { + my $self = shift; + + my $make = lc $self->{MAKE}; + + # Truncate anything like foomake6 to just foomake. + $make =~ s/^(\w+make).*/$1/; + + # Turn gnumake into gmake. + $make =~ s/^gnu/g/; + + return $make; +} + + + +sub all_target { + my $self = shift; + + return <<'MAKE_EXT'; +all :: pure_all + $(NOECHO) $(NOOP) +MAKE_EXT + +} + + + +sub _xs_list_basenames { + my ($self) = @_; + map { (my $b = $_) =~ s/\.xs$//; $b } sort keys %{ $self->{XS} }; +} + +sub blibdirs_target { + my $self = shift; + + my @dirs = map { uc "\$(INST_$_)" } qw(libdir archlib + autodir archautodir + bin script + man1dir man3dir + ); + if ($self->{XSMULTI}) { + for my $ext ($self->_xs_list_basenames) { + my ($v, $d, $f) = File::Spec->splitpath($ext); + my @d = File::Spec->splitdir($d); + shift @d if $d[0] eq 'lib'; + push @dirs, $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f); + } + } + + my @exists = map { $_.'$(DFSEP).exists' } @dirs; + + my $make = sprintf <<'MAKE', join(' ', @exists); +blibdirs : %s + $(NOECHO) $(NOOP) + +# Backwards compat with 6.18 through 6.25 +blibdirs.ts : blibdirs + $(NOECHO) $(NOOP) + +MAKE + + $make .= $self->dir_target(@dirs); + + return $make; +} + + + +sub clean { +# --- Cleanup and Distribution Sections --- + + my($self, %attribs) = @_; + my @m; + push(@m, ' +# Delete temporary files but do not touch installed files. We don\'t delete +# the Makefile here so a later make realclean still has a makefile to use. + +clean :: clean_subdirs +'); + + my @files = sort values %{$self->{XS}}; # .c files from *.xs files + push @files, map { + my $file = $_; + map { $file.$_ } $self->{OBJ_EXT}, qw(.def _def.old .bs .bso .exp .base); + } $self->_xs_list_basenames; + my @dirs = qw(blib); + + # Normally these are all under blib but they might have been + # redefined. + # XXX normally this would be a good idea, but the Perl core sets + # INST_LIB = ../../lib rather than actually installing the files. + # So a "make clean" in an ext/ directory would blow away lib. + # Until the core is adjusted let's leave this out. +# push @dirs, qw($(INST_ARCHLIB) $(INST_LIB) +# $(INST_BIN) $(INST_SCRIPT) +# $(INST_MAN1DIR) $(INST_MAN3DIR) +# $(INST_LIBDIR) $(INST_ARCHLIBDIR) $(INST_AUTODIR) +# $(INST_STATIC) $(INST_DYNAMIC) +# ); + + + if( $attribs{FILES} ) { + # Use @dirs because we don't know what's in here. + push @dirs, ref $attribs{FILES} ? + @{$attribs{FILES}} : + split /\s+/, $attribs{FILES} ; + } + + push(@files, qw[$(MAKE_APERL_FILE) + MYMETA.json MYMETA.yml perlmain.c tmon.out mon.out so_locations + blibdirs.ts pm_to_blib pm_to_blib.ts + *$(OBJ_EXT) *$(LIB_EXT) perl.exe perl perl$(EXE_EXT) + $(BOOTSTRAP) $(BASEEXT).bso + $(BASEEXT).def lib$(BASEEXT).def + $(BASEEXT).exp $(BASEEXT).x + ]); + + push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.all')); + push(@files, $self->catfile('$(INST_ARCHAUTODIR)','extralibs.ld')); + + # core files + if ($^O eq 'vos') { + push(@files, qw[perl*.kp]); + } + else { + push(@files, qw[core core.*perl.*.? *perl.core]); + } + + push(@files, map { "core." . "[0-9]"x$_ } (1..5)); + + # OS specific things to clean up. Use @dirs since we don't know + # what might be in here. + push @dirs, $self->extra_clean_files; + + # Occasionally files are repeated several times from different sources + { my(%f) = map { ($_ => 1) } @files; @files = sort keys %f; } + { my(%d) = map { ($_ => 1) } @dirs; @dirs = sort keys %d; } + + push @m, map "\t$_\n", $self->split_command('- $(RM_F)', @files); + push @m, map "\t$_\n", $self->split_command('- $(RM_RF)', @dirs); + + # Leave Makefile.old around for realclean + push @m, <<'MAKE'; + $(NOECHO) $(RM_F) $(MAKEFILE_OLD) + - $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) $(DEV_NULL) +MAKE + + push(@m, "\t$attribs{POSTOP}\n") if $attribs{POSTOP}; + + join("", @m); +} + + + +sub clean_subdirs_target { + my($self) = shift; + + # No subdirectories, no cleaning. + return <<'NOOP_FRAG' unless @{$self->{DIR}}; +clean_subdirs : + $(NOECHO) $(NOOP) +NOOP_FRAG + + + my $clean = "clean_subdirs :\n"; + + for my $dir (@{$self->{DIR}}) { + my $subclean = $self->oneliner(sprintf <<'CODE', $dir); +exit 0 unless chdir '%s'; system '$(MAKE) clean' if -f '$(FIRST_MAKEFILE)'; +CODE + + $clean .= "\t$subclean\n"; + } + + return $clean; +} + + + +sub dir_target { + my($self, @dirs) = @_; + + my $make = ''; + foreach my $dir (@dirs) { + $make .= sprintf <<'MAKE', ($dir) x 4; +%s$(DFSEP).exists :: Makefile.PL + $(NOECHO) $(MKPATH) %s + $(NOECHO) $(CHMOD) $(PERM_DIR) %s + $(NOECHO) $(TOUCH) %s$(DFSEP).exists + +MAKE + + } + + return $make; +} + + + +# For backwards compatibility. +*dist_dir = *distdir; + +sub distdir { + my($self) = shift; + + my $meta_target = $self->{NO_META} ? '' : 'distmeta'; + my $sign_target = !$self->{SIGN} ? '' : 'distsignature'; + + return sprintf <<'MAKE_FRAG', $meta_target, $sign_target; +create_distdir : + $(RM_RF) $(DISTVNAME) + $(PERLRUN) "-MExtUtils::Manifest=manicopy,maniread" \ + -e "manicopy(maniread(),'$(DISTVNAME)', '$(DIST_CP)');" + +distdir : create_distdir %s %s + $(NOECHO) $(NOOP) + +MAKE_FRAG + +} + + + +sub dist_test { + my($self) = shift; + + my $mpl_args = join " ", map qq["$_"], @ARGV; + + my $test = $self->cd('$(DISTVNAME)', + '$(ABSPERLRUN) Makefile.PL '.$mpl_args, + '$(MAKE) $(PASTHRU)', + '$(MAKE) test $(PASTHRU)' + ); + + return sprintf <<'MAKE_FRAG', $test; +disttest : distdir + %s + +MAKE_FRAG + + +} + + + +sub xs_dlsyms_arg { + return ''; +} + + +sub xs_dlsyms_ext { + die "Pure virtual method"; +} + + +sub xs_dlsyms_extra { + ''; +} + + +sub xs_dlsyms_iterator { + my ($self, $attribs) = @_; + if ($self->{XSMULTI}) { + my @m; + for my $ext ($self->_xs_list_basenames) { + my @parts = File::Spec->splitdir($ext); + shift @parts if $parts[0] eq 'lib'; + my $name = join '::', @parts; + push @m, $self->xs_make_dlsyms( + $attribs, + $ext . $self->xs_dlsyms_ext, + "$ext.xs", + $name, + $parts[-1], + {}, [], {}, [], + $self->xs_dlsyms_extra . q!, 'FILE' => ! . neatvalue($ext), + ); + } + return join "\n", @m; + } else { + return $self->xs_make_dlsyms( + $attribs, + $self->{BASEEXT} . $self->xs_dlsyms_ext, + 'Makefile.PL', + $self->{NAME}, + $self->{DLBASE}, + $attribs->{DL_FUNCS} || $self->{DL_FUNCS} || {}, + $attribs->{FUNCLIST} || $self->{FUNCLIST} || [], + $attribs->{IMPORTS} || $self->{IMPORTS} || {}, + $attribs->{DL_VARS} || $self->{DL_VARS} || [], + $self->xs_dlsyms_extra, + ); + } +} + + +sub xs_make_dlsyms { + my ($self, $attribs, $target, $dep, $name, $dlbase, $funcs, $funclist, $imports, $vars, $extra) = @_; + my @m = ( + "\n$target: $dep\n", + q! $(PERLRUN) -MExtUtils::Mksymlists \\ + -e "Mksymlists('NAME'=>\"!, $name, + q!\", 'DLBASE' => '!,$dlbase, + # The above two lines quoted differently to work around + # a bug in the 4DOS/4NT command line interpreter. The visible + # result of the bug was files named q('extension_name',) *with the + # single quotes and the comma* in the extension build directories. + q!', 'DL_FUNCS' => !,neatvalue($funcs), + q!, 'FUNCLIST' => !,neatvalue($funclist), + q!, 'IMPORTS' => !,neatvalue($imports), + q!, 'DL_VARS' => !, neatvalue($vars) + ); + push @m, $extra if defined $extra; + push @m, qq!);"\n!; + join '', @m; +} + + +sub dynamic { +# --- Dynamic Loading Sections --- + + my($self) = shift; + ' +dynamic :: $(FIRST_MAKEFILE) config $(INST_BOOT) $(INST_DYNAMIC) + $(NOECHO) $(NOOP) +'; +} + + + +sub makemakerdflt_target { + return <<'MAKE_FRAG'; +makemakerdflt : all + $(NOECHO) $(NOOP) +MAKE_FRAG + +} + + + +sub manifypods_target { + my($self) = shift; + + my $man1pods = ''; + my $man3pods = ''; + my $dependencies = ''; + + # populate manXpods & dependencies: + foreach my $name (sort keys %{$self->{MAN1PODS}}, sort keys %{$self->{MAN3PODS}}) { + $dependencies .= " \\\n\t$name"; + } + + my $manify = <{"MAN${section}PODS"}; + my $p2m = sprintf <<'CMD', $section, $] > 5.008 ? " -u" : ""; + $(NOECHO) $(POD2MAN) --section=%s --perm_rw=$(PERM_RW)%s +CMD + push @man_cmds, $self->split_command($p2m, map {($_,$pods->{$_})} sort keys %$pods); + } + + $manify .= "\t\$(NOECHO) \$(NOOP)\n" unless @man_cmds; + $manify .= join '', map { "$_\n" } @man_cmds; + + return $manify; +} + +{ + my $has_cpan_meta; + sub _has_cpan_meta { + return $has_cpan_meta if defined $has_cpan_meta; + return $has_cpan_meta = !!eval { + require CPAN::Meta; + CPAN::Meta->VERSION(2.112150); + 1; + }; + } +} + + +sub metafile_target { + my $self = shift; + return <<'MAKE_FRAG' if $self->{NO_META} or ! _has_cpan_meta(); +metafile : + $(NOECHO) $(NOOP) +MAKE_FRAG + + my $metadata = $self->metafile_data( + $self->{META_ADD} || {}, + $self->{META_MERGE} || {}, + ); + + my $meta = $self->_fix_metadata_before_conversion( $metadata ); + + my @write_metayml = $self->stashmeta( + $meta->as_string({version => "1.4"}), 'META_new.yml' + ); + my @write_metajson = $self->stashmeta( + $meta->as_string({version => "2.0"}), 'META_new.json' + ); + + my $metayml = join("\n\t", @write_metayml); + my $metajson = join("\n\t", @write_metajson); + return sprintf <<'MAKE_FRAG', $metayml, $metajson; +metafile : create_distdir + $(NOECHO) $(ECHO) Generating META.yml + %s + -$(NOECHO) $(MV) META_new.yml $(DISTVNAME)/META.yml + $(NOECHO) $(ECHO) Generating META.json + %s + -$(NOECHO) $(MV) META_new.json $(DISTVNAME)/META.json +MAKE_FRAG + +} + + +sub _fix_metadata_before_conversion { + my ( $self, $metadata ) = @_; + + # we should never be called unless this already passed but + # prefer to be defensive in case somebody else calls this + + return unless _has_cpan_meta; + + my $bad_version = $metadata->{version} && + !CPAN::Meta::Validator->new->version( 'version', $metadata->{version} ); + # just delete all invalid versions + if( $bad_version ) { + warn "Can't parse version '$metadata->{version}'\n"; + $metadata->{version} = ''; + } + + my $validator2 = CPAN::Meta::Validator->new( $metadata ); + my @errors; + push @errors, $validator2->errors if !$validator2->is_valid; + my $validator14 = CPAN::Meta::Validator->new( + { + %$metadata, + 'meta-spec' => { version => 1.4 }, + } + ); + push @errors, $validator14->errors if !$validator14->is_valid; + # fix non-camelcase custom resource keys (only other trick we know) + for my $error ( @errors ) { + my ( $key ) = ( $error =~ /Custom resource '(.*)' must be in CamelCase./ ); + next if !$key; + + # first try to remove all non-alphabetic chars + ( my $new_key = $key ) =~ s/[^_a-zA-Z]//g; + + # if that doesn't work, uppercase first one + $new_key = ucfirst $new_key if !$validator14->custom_1( $new_key ); + + # copy to new key if that worked + $metadata->{resources}{$new_key} = $metadata->{resources}{$key} + if $validator14->custom_1( $new_key ); + + # and delete old one in any case + delete $metadata->{resources}{$key}; + } + + # paper over validation issues, but still complain, necessary because + # there's no guarantee that the above will fix ALL errors + my $meta = eval { CPAN::Meta->create( $metadata, { lazy_validation => 1 } ) }; + warn $@ if $@ and + $@ !~ /encountered CODE.*, but JSON can only represent references to arrays or hashes/; + + # use the original metadata straight if the conversion failed + # or if it can't be stringified. + if( !$meta || + !eval { $meta->as_string( { version => $METASPEC_V } ) } || + !eval { $meta->as_string } + ) { + $meta = bless $metadata, 'CPAN::Meta'; + } + + my $now_license = $meta->as_struct({ version => 2 })->{license}; + if ($self->{LICENSE} and $self->{LICENSE} ne 'unknown' and + @{$now_license} == 1 and $now_license->[0] eq 'unknown' + ) { + warn "Invalid LICENSE value '$self->{LICENSE}' ignored\n"; + } + + $meta; +} + + + +sub _sort_pairs { + my $sort = shift; + my $pairs = shift; + return map { $_ => $pairs->{$_} } + sort $sort + keys %$pairs; +} + + +# Taken from Module::Build::Base +sub _hash_merge { + my ($self, $h, $k, $v) = @_; + if (ref $h->{$k} eq 'ARRAY') { + push @{$h->{$k}}, ref $v ? @$v : $v; + } elsif (ref $h->{$k} eq 'HASH') { + $self->_hash_merge($h->{$k}, $_, $v->{$_}) foreach keys %$v; + } else { + $h->{$k} = $v; + } +} + + + +sub metafile_data { + my $self = shift; + my($meta_add, $meta_merge) = @_; + + $meta_add ||= {}; + $meta_merge ||= {}; + + my $version = _normalize_version($self->{VERSION}); + my $release_status = ($version =~ /_/) ? 'unstable' : 'stable'; + my %meta = ( + # required + abstract => $self->{ABSTRACT} || 'unknown', + author => defined($self->{AUTHOR}) ? $self->{AUTHOR} : ['unknown'], + dynamic_config => 1, + generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION", + license => [ $self->{LICENSE} || 'unknown' ], + 'meta-spec' => { + url => $METASPEC_URL, + version => $METASPEC_V, + }, + name => $self->{DISTNAME}, + release_status => $release_status, + version => $version, + + # optional + no_index => { directory => [qw(t inc)] }, + ); + $self->_add_requirements_to_meta(\%meta); + + if (!eval { require JSON::PP; require CPAN::Meta::Converter; CPAN::Meta::Converter->VERSION(2.141170) }) { + return \%meta; + } + + # needs to be based on the original version + my $v1_add = _metaspec_version($meta_add) !~ /^2/; + + my ($add_v, $merge_v) = map _metaspec_version($_), $meta_add, $meta_merge; + for my $frag ($meta_add, $meta_merge) { + my $def_v = $frag == $meta_add ? $merge_v : $add_v; + $frag = CPAN::Meta::Converter->new($frag, default_version => $def_v)->upgrade_fragment; + } + + # if we upgraded a 1.x _ADD fragment, we gave it a prereqs key that + # will override all prereqs, which is more than the user asked for; + # instead, we'll go inside the prereqs and override all those + while( my($key, $val) = each %$meta_add ) { + if ($v1_add and $key eq 'prereqs') { + $meta{$key}{$_} = $val->{$_} for keys %$val; + } elsif ($key ne 'meta-spec') { + $meta{$key} = $val; + } + } + + while( my($key, $val) = each %$meta_merge ) { + next if $key eq 'meta-spec'; + $self->_hash_merge(\%meta, $key, $val); + } + + return \%meta; +} + + + +sub _add_requirements_to_meta { + my ( $self, $meta ) = @_; + # Check the original args so we can tell between the user setting it + # to an empty hash and it just being initialized. + $meta->{prereqs}{configure}{requires} = $self->{ARGS}{CONFIGURE_REQUIRES} + ? $self->{CONFIGURE_REQUIRES} + : { 'ExtUtils::MakeMaker' => 0, }; + $meta->{prereqs}{build}{requires} = $self->{ARGS}{BUILD_REQUIRES} + ? $self->{BUILD_REQUIRES} + : { 'ExtUtils::MakeMaker' => 0, }; + $meta->{prereqs}{test}{requires} = $self->{TEST_REQUIRES} + if $self->{ARGS}{TEST_REQUIRES}; + $meta->{prereqs}{runtime}{requires} = $self->{PREREQ_PM} + if $self->{ARGS}{PREREQ_PM}; + $meta->{prereqs}{runtime}{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION}) + if $self->{MIN_PERL_VERSION}; +} + +# spec version of given fragment - if not given, assume 1.4 +sub _metaspec_version { + my ( $meta ) = @_; + return $meta->{'meta-spec'}->{version} + if defined $meta->{'meta-spec'} + and defined $meta->{'meta-spec'}->{version}; + return '1.4'; +} + +sub _add_requirements_to_meta_v1_4 { + my ( $self, $meta ) = @_; + # Check the original args so we can tell between the user setting it + # to an empty hash and it just being initialized. + if( $self->{ARGS}{CONFIGURE_REQUIRES} ) { + $meta->{configure_requires} = $self->{CONFIGURE_REQUIRES}; + } else { + $meta->{configure_requires} = { + 'ExtUtils::MakeMaker' => 0, + }; + } + if( $self->{ARGS}{BUILD_REQUIRES} ) { + $meta->{build_requires} = $self->{BUILD_REQUIRES}; + } else { + $meta->{build_requires} = { + 'ExtUtils::MakeMaker' => 0, + }; + } + if( $self->{ARGS}{TEST_REQUIRES} ) { + $meta->{build_requires} = { + %{ $meta->{build_requires} }, + %{ $self->{TEST_REQUIRES} }, + }; + } + $meta->{requires} = $self->{PREREQ_PM} + if defined $self->{PREREQ_PM}; + $meta->{requires}{perl} = _normalize_version($self->{MIN_PERL_VERSION}) + if $self->{MIN_PERL_VERSION}; +} + +# Adapted from Module::Build::Base +sub _normalize_version { + my ($version) = @_; + $version = 0 unless defined $version; + + if ( ref $version eq 'version' ) { # version objects + $version = $version->stringify; + } + elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots + # normalize string tuples without "v": "1.2.3" -> "v1.2.3" + $version = "v$version"; + } + else { + # leave alone + } + return $version; +} + + +sub _dump_hash { + croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH'; + my $options = shift; + my %hash = @_; + + # Use a list to preserve order. + my @pairs; + + my $k_sort + = exists $options->{key_sort} ? $options->{key_sort} + : sub { lc $a cmp lc $b }; + if ($k_sort) { + croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE'; + @pairs = _sort_pairs($k_sort, \%hash); + } else { # list of pairs, no sorting + @pairs = @_; + } + + my $yaml = $options->{use_header} ? "--- #YAML:1.0\n" : ''; + my $indent = $options->{indent} || ''; + my $k_length = min( + ($options->{max_key_length} || 20), + max(map { length($_) + 1 } grep { !ref $hash{$_} } keys %hash) + ); + my $customs = $options->{customs} || {}; + + # printf format for key + my $k_format = "%-${k_length}s"; + + while( @pairs ) { + my($key, $val) = splice @pairs, 0, 2; + $val = '~' unless defined $val; + if(ref $val eq 'HASH') { + if ( keys %$val ) { + my %k_options = ( # options for recursive call + delta => $options->{delta}, + use_header => 0, + indent => $indent . $options->{delta}, + ); + if (exists $customs->{$key}) { + my %k_custom = %{$customs->{$key}}; + foreach my $k (qw(key_sort max_key_length customs)) { + $k_options{$k} = $k_custom{$k} if exists $k_custom{$k}; + } + } + $yaml .= $indent . "$key:\n" + . _dump_hash(\%k_options, %$val); + } + else { + $yaml .= $indent . "$key: {}\n"; + } + } + elsif (ref $val eq 'ARRAY') { + if( @$val ) { + $yaml .= $indent . "$key:\n"; + + for (@$val) { + croak "only nested arrays of non-refs are supported" if ref $_; + $yaml .= $indent . $options->{delta} . "- $_\n"; + } + } + else { + $yaml .= $indent . "$key: []\n"; + } + } + elsif( ref $val and !blessed($val) ) { + croak "only nested hashes, arrays and objects are supported"; + } + else { # if it's an object, just stringify it + $yaml .= $indent . sprintf "$k_format %s\n", "$key:", $val; + } + }; + + return $yaml; + +} + +sub blessed { + return eval { $_[0]->isa("UNIVERSAL"); }; +} + +sub max { + return (sort { $b <=> $a } @_)[0]; +} + +sub min { + return (sort { $a <=> $b } @_)[0]; +} + + +sub metafile_file { + my $self = shift; + + my %dump_options = ( + use_header => 1, + delta => ' ' x 4, + key_sort => undef, + ); + return _dump_hash(\%dump_options, @_); + +} + + + +sub distmeta_target { + my $self = shift; + + my @add_meta = ( + $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']), +exit unless -e q{META.yml}; +eval { maniadd({q{META.yml} => q{Module YAML meta-data (added by MakeMaker)}}) } + or die "Could not add META.yml to MANIFEST: ${'@'}" +CODE + $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']) +exit unless -f q{META.json}; +eval { maniadd({q{META.json} => q{Module JSON meta-data (added by MakeMaker)}}) } + or die "Could not add META.json to MANIFEST: ${'@'}" +CODE + ); + + my @add_meta_to_distdir = map { $self->cd('$(DISTVNAME)', $_) } @add_meta; + + return sprintf <<'MAKE', @add_meta_to_distdir; +distmeta : create_distdir metafile + $(NOECHO) %s + $(NOECHO) %s + +MAKE + +} + + + +sub mymeta { + my $self = shift; + my $file = shift || ''; # for testing + + my $mymeta = $self->_mymeta_from_meta($file); + my $v2 = 1; + + unless ( $mymeta ) { + $mymeta = $self->metafile_data( + $self->{META_ADD} || {}, + $self->{META_MERGE} || {}, + ); + $v2 = 0; + } + + # Overwrite the non-configure dependency hashes + $self->_add_requirements_to_meta($mymeta); + + $mymeta->{dynamic_config} = 0; + + return $mymeta; +} + + +sub _mymeta_from_meta { + my $self = shift; + my $metafile = shift || ''; # for testing + + return unless _has_cpan_meta(); + + my $meta; + for my $file ( $metafile, "META.json", "META.yml" ) { + next unless -e $file; + eval { + $meta = CPAN::Meta->load_file($file)->as_struct( { version => 2 } ); + }; + last if $meta; + } + return unless $meta; + + # META.yml before 6.25_01 cannot be trusted. META.yml lived in the source directory. + # There was a good chance the author accidentally uploaded a stale META.yml if they + # rolled their own tarball rather than using "make dist". + if ($meta->{generated_by} && + $meta->{generated_by} =~ /ExtUtils::MakeMaker version ([\d\._]+)/) { + my $eummv = do { local $^W = 0; $1+0; }; + if ($eummv < 6.2501) { + return; + } + } + + return $meta; +} + + +sub write_mymeta { + my $self = shift; + my $mymeta = shift; + + return unless _has_cpan_meta(); + + my $meta_obj = $self->_fix_metadata_before_conversion( $mymeta ); + + $meta_obj->save( 'MYMETA.json', { version => "2.0" } ); + $meta_obj->save( 'MYMETA.yml', { version => "1.4" } ); + return 1; +} + + +sub realclean { + my($self, %attribs) = @_; + + my @dirs = qw($(DISTVNAME)); + my @files = qw($(FIRST_MAKEFILE) $(MAKEFILE_OLD)); + + # Special exception for the perl core where INST_* is not in blib. + # This cleans up the files built from the ext/ directory (all XS). + if( $self->{PERL_CORE} ) { + push @dirs, qw($(INST_AUTODIR) $(INST_ARCHAUTODIR)); + push @files, values %{$self->{PM}}; + } + + if( $self->has_link_code ){ + push @files, qw($(OBJECT)); + } + + if( $attribs{FILES} ) { + if( ref $attribs{FILES} ) { + push @dirs, @{ $attribs{FILES} }; + } + else { + push @dirs, split /\s+/, $attribs{FILES}; + } + } + + # Occasionally files are repeated several times from different sources + { my(%f) = map { ($_ => 1) } @files; @files = sort keys %f; } + { my(%d) = map { ($_ => 1) } @dirs; @dirs = sort keys %d; } + + my $rm_cmd = join "\n\t", map { "$_" } + $self->split_command('- $(RM_F)', @files); + my $rmf_cmd = join "\n\t", map { "$_" } + $self->split_command('- $(RM_RF)', @dirs); + + my $m = sprintf <<'MAKE', $rm_cmd, $rmf_cmd; +# Delete temporary files (via clean) and also delete dist files +realclean purge :: realclean_subdirs + %s + %s +MAKE + + $m .= "\t$attribs{POSTOP}\n" if $attribs{POSTOP}; + + return $m; +} + + + +sub realclean_subdirs_target { + my $self = shift; + my @m = <<'EOF'; +# so clean is forced to complete before realclean_subdirs runs +realclean_subdirs : clean +EOF + return join '', @m, "\t\$(NOECHO) \$(NOOP)\n" unless @{$self->{DIR}}; + foreach my $dir (@{$self->{DIR}}) { + foreach my $makefile ('$(MAKEFILE_OLD)', '$(FIRST_MAKEFILE)' ) { + my $subrclean .= $self->oneliner(_sprintf562 <<'CODE', $dir, $makefile); +chdir '%1$s'; system '$(MAKE) $(USEMAKEFILE) %2$s realclean' if -f '%2$s'; +CODE + push @m, "\t- $subrclean\n"; + } + } + return join '', @m; +} + + + +sub signature_target { + my $self = shift; + + return <<'MAKE_FRAG'; +signature : + cpansign -s +MAKE_FRAG + +} + + + +sub distsignature_target { + my $self = shift; + + my $add_sign = $self->oneliner(<<'CODE', ['-MExtUtils::Manifest=maniadd']); +eval { maniadd({q{SIGNATURE} => q{Public-key signature (added by MakeMaker)}}) } + or die "Could not add SIGNATURE to MANIFEST: ${'@'}" +CODE + + my $sign_dist = $self->cd('$(DISTVNAME)' => 'cpansign -s'); + + # cpansign -s complains if SIGNATURE is in the MANIFEST yet does not + # exist + my $touch_sig = $self->cd('$(DISTVNAME)' => '$(TOUCH) SIGNATURE'); + my $add_sign_to_dist = $self->cd('$(DISTVNAME)' => $add_sign ); + + return sprintf <<'MAKE', $add_sign_to_dist, $touch_sig, $sign_dist +distsignature : distmeta + $(NOECHO) %s + $(NOECHO) %s + %s + +MAKE + +} + + + +sub special_targets { + my $make_frag = <<'MAKE_FRAG'; +.SUFFIXES : .xs .c .C .cpp .i .s .cxx .cc $(OBJ_EXT) + +.PHONY: all config static dynamic test linkext manifest blibdirs clean realclean disttest distdir pure_all subdirs clean_subdirs makemakerdflt manifypods realclean_subdirs subdirs_dynamic subdirs_pure_nolink subdirs_static subdirs-test_dynamic subdirs-test_static test_dynamic test_static + +MAKE_FRAG + + $make_frag .= <<'MAKE_FRAG' if $ENV{CLEARCASE_ROOT}; +.NO_CONFIG_REC: Makefile + +MAKE_FRAG + + return $make_frag; +} + + + + + +sub init_ABSTRACT { + my $self = shift; + + if( $self->{ABSTRACT_FROM} and $self->{ABSTRACT} ) { + warn "Both ABSTRACT_FROM and ABSTRACT are set. ". + "Ignoring ABSTRACT_FROM.\n"; + return; + } + + if ($self->{ABSTRACT_FROM}){ + $self->{ABSTRACT} = $self->parse_abstract($self->{ABSTRACT_FROM}) or + carp "WARNING: Setting ABSTRACT via file ". + "'$self->{ABSTRACT_FROM}' failed\n"; + } + + if ($self->{ABSTRACT} && $self->{ABSTRACT} =~ m![[:cntrl:]]+!) { + warn "WARNING: ABSTRACT contains control character(s),". + " they will be removed\n"; + $self->{ABSTRACT} =~ s![[:cntrl:]]+!!g; + return; + } +} + + +sub init_INST { + my($self) = shift; + + $self->{INST_ARCHLIB} ||= $self->catdir($Curdir,"blib","arch"); + $self->{INST_BIN} ||= $self->catdir($Curdir,'blib','bin'); + + # INST_LIB typically pre-set if building an extension after + # perl has been built and installed. Setting INST_LIB allows + # you to build directly into, say $Config{privlibexp}. + unless ($self->{INST_LIB}){ + if ($self->{PERL_CORE}) { + $self->{INST_LIB} = $self->{INST_ARCHLIB} = $self->{PERL_LIB}; + } else { + $self->{INST_LIB} = $self->catdir($Curdir,"blib","lib"); + } + } + + my @parentdir = split(/::/, $self->{PARENT_NAME}); + $self->{INST_LIBDIR} = $self->catdir('$(INST_LIB)', @parentdir); + $self->{INST_ARCHLIBDIR} = $self->catdir('$(INST_ARCHLIB)', @parentdir); + $self->{INST_AUTODIR} = $self->catdir('$(INST_LIB)', 'auto', + '$(FULLEXT)'); + $self->{INST_ARCHAUTODIR} = $self->catdir('$(INST_ARCHLIB)', 'auto', + '$(FULLEXT)'); + + $self->{INST_SCRIPT} ||= $self->catdir($Curdir,'blib','script'); + + $self->{INST_MAN1DIR} ||= $self->catdir($Curdir,'blib','man1'); + $self->{INST_MAN3DIR} ||= $self->catdir($Curdir,'blib','man3'); + + return 1; +} + + + +sub init_INSTALL { + my($self) = shift; + + if( $self->{ARGS}{INSTALL_BASE} and $self->{ARGS}{PREFIX} ) { + die "Only one of PREFIX or INSTALL_BASE can be given. Not both.\n"; + } + + if( $self->{ARGS}{INSTALL_BASE} ) { + $self->init_INSTALL_from_INSTALL_BASE; + } + else { + $self->init_INSTALL_from_PREFIX; + } +} + + + +sub init_INSTALL_from_PREFIX { + my $self = shift; + + $self->init_lib2arch; + + # There are often no Config.pm defaults for these new man variables so + # we fall back to the old behavior which is to use installman*dir + foreach my $num (1, 3) { + my $k = 'installsiteman'.$num.'dir'; + + $self->{uc $k} ||= uc "\$(installman${num}dir)" + unless $Config{$k}; + } + + foreach my $num (1, 3) { + my $k = 'installvendorman'.$num.'dir'; + + unless( $Config{$k} ) { + $self->{uc $k} ||= $Config{usevendorprefix} + ? uc "\$(installman${num}dir)" + : ''; + } + } + + $self->{INSTALLSITEBIN} ||= '$(INSTALLBIN)' + unless $Config{installsitebin}; + $self->{INSTALLSITESCRIPT} ||= '$(INSTALLSCRIPT)' + unless $Config{installsitescript}; + + unless( $Config{installvendorbin} ) { + $self->{INSTALLVENDORBIN} ||= $Config{usevendorprefix} + ? $Config{installbin} + : ''; + } + unless( $Config{installvendorscript} ) { + $self->{INSTALLVENDORSCRIPT} ||= $Config{usevendorprefix} + ? $Config{installscript} + : ''; + } + + + my $iprefix = $Config{installprefixexp} || $Config{installprefix} || + $Config{prefixexp} || $Config{prefix} || ''; + my $vprefix = $Config{usevendorprefix} ? $Config{vendorprefixexp} : ''; + my $sprefix = $Config{siteprefixexp} || ''; + + # 5.005_03 doesn't have a siteprefix. + $sprefix = $iprefix unless $sprefix; + + + $self->{PREFIX} ||= ''; + + if( $self->{PREFIX} ) { + @{$self}{qw(PERLPREFIX SITEPREFIX VENDORPREFIX)} = + ('$(PREFIX)') x 3; + } + else { + $self->{PERLPREFIX} ||= $iprefix; + $self->{SITEPREFIX} ||= $sprefix; + $self->{VENDORPREFIX} ||= $vprefix; + + # Lots of MM extension authors like to use $(PREFIX) so we + # put something sensible in there no matter what. + $self->{PREFIX} = '$('.uc $self->{INSTALLDIRS}.'PREFIX)'; + } + + my $arch = $Config{archname}; + my $version = $Config{version}; + + # default style + my $libstyle = $Config{installstyle} || 'lib/perl5'; + my $manstyle = ''; + + if( $self->{LIBSTYLE} ) { + $libstyle = $self->{LIBSTYLE}; + $manstyle = $self->{LIBSTYLE} eq 'lib/perl5' ? 'lib/perl5' : ''; + } + + # Some systems, like VOS, set installman*dir to '' if they can't + # read man pages. + for my $num (1, 3) { + $self->{'INSTALLMAN'.$num.'DIR'} ||= 'none' + unless $Config{'installman'.$num.'dir'}; + } + + my %bin_layouts = + ( + bin => { s => $iprefix, + t => 'perl', + d => 'bin' }, + vendorbin => { s => $vprefix, + t => 'vendor', + d => 'bin' }, + sitebin => { s => $sprefix, + t => 'site', + d => 'bin' }, + script => { s => $iprefix, + t => 'perl', + d => 'bin' }, + vendorscript=> { s => $vprefix, + t => 'vendor', + d => 'bin' }, + sitescript => { s => $sprefix, + t => 'site', + d => 'bin' }, + ); + + my %man_layouts = + ( + man1dir => { s => $iprefix, + t => 'perl', + d => 'man/man1', + style => $manstyle, }, + siteman1dir => { s => $sprefix, + t => 'site', + d => 'man/man1', + style => $manstyle, }, + vendorman1dir => { s => $vprefix, + t => 'vendor', + d => 'man/man1', + style => $manstyle, }, + + man3dir => { s => $iprefix, + t => 'perl', + d => 'man/man3', + style => $manstyle, }, + siteman3dir => { s => $sprefix, + t => 'site', + d => 'man/man3', + style => $manstyle, }, + vendorman3dir => { s => $vprefix, + t => 'vendor', + d => 'man/man3', + style => $manstyle, }, + ); + + my %lib_layouts = + ( + privlib => { s => $iprefix, + t => 'perl', + d => '', + style => $libstyle, }, + vendorlib => { s => $vprefix, + t => 'vendor', + d => '', + style => $libstyle, }, + sitelib => { s => $sprefix, + t => 'site', + d => 'site_perl', + style => $libstyle, }, + + archlib => { s => $iprefix, + t => 'perl', + d => "$version/$arch", + style => $libstyle }, + vendorarch => { s => $vprefix, + t => 'vendor', + d => "$version/$arch", + style => $libstyle }, + sitearch => { s => $sprefix, + t => 'site', + d => "site_perl/$version/$arch", + style => $libstyle }, + ); + + + # Special case for LIB. + if( $self->{LIB} ) { + foreach my $var (keys %lib_layouts) { + my $Installvar = uc "install$var"; + + if( $var =~ /arch/ ) { + $self->{$Installvar} ||= + $self->catdir($self->{LIB}, $Config{archname}); + } + else { + $self->{$Installvar} ||= $self->{LIB}; + } + } + } + + my %type2prefix = ( perl => 'PERLPREFIX', + site => 'SITEPREFIX', + vendor => 'VENDORPREFIX' + ); + + my %layouts = (%bin_layouts, %man_layouts, %lib_layouts); + while( my($var, $layout) = each(%layouts) ) { + my($s, $t, $d, $style) = @{$layout}{qw(s t d style)}; + my $r = '$('.$type2prefix{$t}.')'; + + warn "Prefixing $var\n" if $Verbose >= 2; + + my $installvar = "install$var"; + my $Installvar = uc $installvar; + next if $self->{$Installvar}; + + $d = "$style/$d" if $style; + $self->prefixify($installvar, $s, $r, $d); + + warn " $Installvar == $self->{$Installvar}\n" + if $Verbose >= 2; + } + + # Generate these if they weren't figured out. + $self->{VENDORARCHEXP} ||= $self->{INSTALLVENDORARCH}; + $self->{VENDORLIBEXP} ||= $self->{INSTALLVENDORLIB}; + + return 1; +} + + + +my %map = ( + lib => [qw(lib perl5)], + arch => [('lib', 'perl5', $Config{archname})], + bin => [qw(bin)], + man1dir => [qw(man man1)], + man3dir => [qw(man man3)] + ); +$map{script} = $map{bin}; + +sub init_INSTALL_from_INSTALL_BASE { + my $self = shift; + + @{$self}{qw(PREFIX VENDORPREFIX SITEPREFIX PERLPREFIX)} = + '$(INSTALL_BASE)'; + + my %install; + foreach my $thing (keys %map) { + foreach my $dir (('', 'SITE', 'VENDOR')) { + my $uc_thing = uc $thing; + my $key = "INSTALL".$dir.$uc_thing; + + $install{$key} ||= + $self->catdir('$(INSTALL_BASE)', @{$map{$thing}}); + } + } + + # Adjust for variable quirks. + $install{INSTALLARCHLIB} ||= delete $install{INSTALLARCH}; + $install{INSTALLPRIVLIB} ||= delete $install{INSTALLLIB}; + + foreach my $key (keys %install) { + $self->{$key} ||= $install{$key}; + } + + return 1; +} + + + +sub init_VERSION { + my($self) = shift; + + $self->{MAKEMAKER} = $ExtUtils::MakeMaker::Filename; + $self->{MM_VERSION} = $ExtUtils::MakeMaker::VERSION; + $self->{MM_REVISION}= $ExtUtils::MakeMaker::Revision; + $self->{VERSION_FROM} ||= ''; + + if ($self->{VERSION_FROM}){ + $self->{VERSION} = $self->parse_version($self->{VERSION_FROM}); + if( $self->{VERSION} eq 'undef' ) { + carp("WARNING: Setting VERSION via file ". + "'$self->{VERSION_FROM}' failed\n"); + } + } + + if (defined $self->{VERSION}) { + if ( $self->{VERSION} !~ /^\s*v?[\d_\.]+\s*$/ ) { + require version; + my $normal = eval { version->new( $self->{VERSION} ) }; + $self->{VERSION} = $normal if defined $normal; + } + $self->{VERSION} =~ s/^\s+//; + $self->{VERSION} =~ s/\s+$//; + } + else { + $self->{VERSION} = ''; + } + + + $self->{VERSION_MACRO} = 'VERSION'; + ($self->{VERSION_SYM} = $self->{VERSION}) =~ s/\W/_/g; + $self->{DEFINE_VERSION} = '-D$(VERSION_MACRO)=\"$(VERSION)\"'; + + + # Graham Barr and Paul Marquess had some ideas how to ensure + # version compatibility between the *.pm file and the + # corresponding *.xs file. The bottom line was, that we need an + # XS_VERSION macro that defaults to VERSION: + $self->{XS_VERSION} ||= $self->{VERSION}; + + $self->{XS_VERSION_MACRO} = 'XS_VERSION'; + $self->{XS_DEFINE_VERSION} = '-D$(XS_VERSION_MACRO)=\"$(XS_VERSION)\"'; + +} + + + +sub init_tools { + my $self = shift; + + $self->{ECHO} ||= $self->oneliner('binmode STDOUT, qq{:raw}; print qq{@ARGV}', ['-l']); + $self->{ECHO_N} ||= $self->oneliner('print qq{@ARGV}'); + + $self->{TOUCH} ||= $self->oneliner('touch', ["-MExtUtils::Command"]); + $self->{CHMOD} ||= $self->oneliner('chmod', ["-MExtUtils::Command"]); + $self->{RM_F} ||= $self->oneliner('rm_f', ["-MExtUtils::Command"]); + $self->{RM_RF} ||= $self->oneliner('rm_rf', ["-MExtUtils::Command"]); + $self->{TEST_F} ||= $self->oneliner('test_f', ["-MExtUtils::Command"]); + $self->{TEST_S} ||= $self->oneliner('test_s', ["-MExtUtils::Command::MM"]); + $self->{CP_NONEMPTY} ||= $self->oneliner('cp_nonempty', ["-MExtUtils::Command::MM"]); + $self->{FALSE} ||= $self->oneliner('exit 1'); + $self->{TRUE} ||= $self->oneliner('exit 0'); + + $self->{MKPATH} ||= $self->oneliner('mkpath', ["-MExtUtils::Command"]); + + $self->{CP} ||= $self->oneliner('cp', ["-MExtUtils::Command"]); + $self->{MV} ||= $self->oneliner('mv', ["-MExtUtils::Command"]); + + $self->{MOD_INSTALL} ||= + $self->oneliner(<<'CODE', ['-MExtUtils::Install']); +install([ from_to => {@ARGV}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]); +CODE + $self->{DOC_INSTALL} ||= $self->oneliner('perllocal_install', ["-MExtUtils::Command::MM"]); + $self->{UNINSTALL} ||= $self->oneliner('uninstall', ["-MExtUtils::Command::MM"]); + $self->{WARN_IF_OLD_PACKLIST} ||= + $self->oneliner('warn_if_old_packlist', ["-MExtUtils::Command::MM"]); + $self->{FIXIN} ||= $self->oneliner('MY->fixin(shift)', ["-MExtUtils::MY"]); + $self->{EQUALIZE_TIMESTAMP} ||= $self->oneliner('eqtime', ["-MExtUtils::Command"]); + + $self->{UNINST} ||= 0; + $self->{VERBINST} ||= 0; + + $self->{SHELL} ||= $Config{sh}; + + # UMASK_NULL is not used by MakeMaker but some CPAN modules + # make use of it. + $self->{UMASK_NULL} ||= "umask 0"; + + # Not the greatest default, but its something. + $self->{DEV_NULL} ||= "> /dev/null 2>&1"; + + $self->{NOOP} ||= '$(TRUE)'; + $self->{NOECHO} = '@' unless defined $self->{NOECHO}; + + $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE} || 'Makefile'; + $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE}; + $self->{MAKEFILE_OLD} ||= $self->{MAKEFILE}.'.old'; + $self->{MAKE_APERL_FILE} ||= $self->{MAKEFILE}.'.aperl'; + + # Not everybody uses -f to indicate "use this Makefile instead" + $self->{USEMAKEFILE} ||= '-f'; + + # Some makes require a wrapper around macros passed in on the command + # line. + $self->{MACROSTART} ||= ''; + $self->{MACROEND} ||= ''; + + return; +} + + + +sub init_others { + my $self = shift; + + $self->{LD_RUN_PATH} = ""; + + $self->{LIBS} = $self->_fix_libs($self->{LIBS}); + + # Compute EXTRALIBS, BSLOADLIBS and LDLOADLIBS from $self->{LIBS} + foreach my $libs ( @{$self->{LIBS}} ){ + $libs =~ s/^\s*(.*\S)\s*$/$1/; # remove leading and trailing whitespace + my(@libs) = $self->extliblist($libs); + if ($libs[0] or $libs[1] or $libs[2]){ + # LD_RUN_PATH now computed by ExtUtils::Liblist + ($self->{EXTRALIBS}, $self->{BSLOADLIBS}, + $self->{LDLOADLIBS}, $self->{LD_RUN_PATH}) = @libs; + last; + } + } + + if ( $self->{OBJECT} ) { + $self->{OBJECT} = join(" ", @{$self->{OBJECT}}) if ref $self->{OBJECT}; + $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g; + } elsif ( ($self->{MAGICXS} || $self->{XSMULTI}) && @{$self->{O_FILES}||[]} ) { + $self->{OBJECT} = join(" ", @{$self->{O_FILES}}); + $self->{OBJECT} =~ s!\.o(bj)?\b!\$(OBJ_EXT)!g; + } else { + # init_dirscan should have found out, if we have C files + $self->{OBJECT} = ""; + $self->{OBJECT} = '$(BASEEXT)$(OBJ_EXT)' if @{$self->{C}||[]}; + } + $self->{OBJECT} =~ s/\n+/ \\\n\t/g; + + $self->{BOOTDEP} = (-f "$self->{BASEEXT}_BS") ? "$self->{BASEEXT}_BS" : ""; + $self->{PERLMAINCC} ||= '$(CC)'; + $self->{LDFROM} = '$(OBJECT)' unless $self->{LDFROM}; + + # Sanity check: don't define LINKTYPE = dynamic if we're skipping + # the 'dynamic' section of MM. We don't have this problem with + # 'static', since we either must use it (%Config says we can't + # use dynamic loading) or the caller asked for it explicitly. + if (!$self->{LINKTYPE}) { + $self->{LINKTYPE} = $self->{SKIPHASH}{'dynamic'} + ? 'static' + : ($Config{usedl} ? 'dynamic' : 'static'); + } + + return; +} + + +# Lets look at $self->{LIBS} carefully: It may be an anon array, a string or +# undefined. In any case we turn it into an anon array +sub _fix_libs { + my($self, $libs) = @_; + + return !defined $libs ? [''] : + !ref $libs ? [$libs] : + !defined $libs->[0] ? [''] : + $libs ; +} + + + +sub tools_other { + my($self) = shift; + my @m; + + # We set PM_FILTER as late as possible so it can see all the earlier + # on macro-order sensitive makes such as nmake. + for my $tool (qw{ SHELL CHMOD CP MV NOOP NOECHO RM_F RM_RF TEST_F TOUCH + UMASK_NULL DEV_NULL MKPATH EQUALIZE_TIMESTAMP + FALSE TRUE + ECHO ECHO_N + UNINST VERBINST + MOD_INSTALL DOC_INSTALL UNINSTALL + WARN_IF_OLD_PACKLIST + MACROSTART MACROEND + USEMAKEFILE + PM_FILTER + FIXIN + CP_NONEMPTY + } ) + { + next unless defined $self->{$tool}; + push @m, "$tool = $self->{$tool}\n"; + } + + return join "", @m; +} + + + +sub init_platform { + return ''; +} + + + +sub init_MAKE { + my $self = shift; + + $self->{MAKE} ||= $ENV{MAKE} || $Config{make}; +} + + + +sub manifypods { + my $self = shift; + + my $POD2MAN_macro = $self->POD2MAN_macro(); + my $manifypods_target = $self->manifypods_target(); + + return <oneliner(sprintf <<'PERL_CODE', $maxlen); +use AutoSplit; %s autosplit($$ARGV[0], $$ARGV[1], 0, 1, 1) +PERL_CODE + + return sprintf <<'MAKE_FRAG', $asplit; +# Usage: $(AUTOSPLITFILE) FileToSplit AutoDirToSplitInto +AUTOSPLITFILE = %s + +MAKE_FRAG + +} + + + +sub arch_check { + my $self = shift; + my($pconfig, $cconfig) = @_; + + return 1 if $self->{PERL_SRC}; + + my($pvol, $pthinks) = $self->splitpath($pconfig); + my($cvol, $cthinks) = $self->splitpath($cconfig); + + $pthinks = $self->canonpath($pthinks); + $cthinks = $self->canonpath($cthinks); + + my $ret = 1; + if ($pthinks ne $cthinks) { + print "Have $pthinks\n"; + print "Want $cthinks\n"; + + $ret = 0; + + my $arch = (grep length, $self->splitdir($pthinks))[-1]; + + print <{UNINSTALLED_PERL}; +Your perl and your Config.pm seem to have different ideas about the +architecture they are running on. +Perl thinks: [$arch] +Config says: [$Config{archname}] +This may or may not cause problems. Please check your installation of perl +if you have problems building this extension. +END + } + + return $ret; +} + + + + +sub catfile { + my $self = shift; + return $self->canonpath($self->SUPER::catfile(@_)); +} + + + + +sub find_tests { + my($self) = shift; + return -d 't' ? 't/*.t' : ''; +} + + +sub find_tests_recursive { + my $self = shift; + return $self->find_tests_recursive_in('t'); +} + + +sub find_tests_recursive_in { + my($self, $dir) = @_; + return '' unless -d $dir; + + require File::Find; + + my $base_depth = grep { $_ ne '' } File::Spec->splitdir( (File::Spec->splitpath($dir))[1] ); + my %depths; + + my $wanted = sub { + return unless m!\.t$!; + my ($volume,$directories,$file) = + File::Spec->splitpath( $File::Find::name ); + my $depth = grep { $_ ne '' } File::Spec->splitdir( $directories ); + $depth -= $base_depth; + $depths{ $depth } = 1; + }; + + File::Find::find( $wanted, $dir ); + + return join ' ', + map { $dir . '/*' x $_ . '.t' } + sort { $a <=> $b } + keys %depths; +} + + +# An empty method here tickled a perl 5.8.1 bug and would return its object. +sub extra_clean_files { + return; +} + + + +sub installvars { + return qw(PRIVLIB SITELIB VENDORLIB + ARCHLIB SITEARCH VENDORARCH + BIN SITEBIN VENDORBIN + SCRIPT SITESCRIPT VENDORSCRIPT + MAN1DIR SITEMAN1DIR VENDORMAN1DIR + MAN3DIR SITEMAN3DIR VENDORMAN3DIR + ); +} + + + +sub libscan { + my($self,$path) = @_; + + if ($path =~ m<^README\.pod$>i) { + warn "WARNING: Older versions of ExtUtils::MakeMaker may errantly install $path as part of this distribution. It is recommended to avoid using this path in CPAN modules.\n" + unless $ENV{PERL_CORE}; + return ''; + } + + my($dirs,$file) = ($self->splitpath($path))[1,2]; + return '' if grep /^(?:RCS|CVS|SCCS|\.svn|_darcs)$/, + $self->splitdir($dirs), $file; + + return $path; +} + + + +sub platform_constants { + return ''; +} + + +sub post_constants { + ""; +} + + +sub post_initialize { + ""; +} + + +sub postamble { + ""; +} + + +sub _PREREQ_PRINT { + my $self = shift; + + require Data::Dumper; + my @what = ('PREREQ_PM'); + push @what, 'MIN_PERL_VERSION' if $self->{MIN_PERL_VERSION}; + push @what, 'BUILD_REQUIRES' if $self->{BUILD_REQUIRES}; + print Data::Dumper->Dump([@{$self}{@what}], \@what); + exit 0; +} + + + +sub _PRINT_PREREQ { + my $self = shift; + + my $prereqs= $self->{PREREQ_PM}; + my @prereq = map { [$_, $prereqs->{$_}] } keys %$prereqs; + + if ( $self->{MIN_PERL_VERSION} ) { + push @prereq, ['perl' => $self->{MIN_PERL_VERSION}]; + } + + print join(" ", map { "perl($_->[0])>=$_->[1] " } + sort { $a->[0] cmp $b->[0] } @prereq), "\n"; + exit 0; +} + + + +sub _perl_header_files { + my $self = shift; + + my $header_dir = $self->{PERL_SRC} || $ENV{PERL_SRC} || $self->catdir($Config{archlibexp}, 'CORE'); + opendir my $dh, $header_dir + or die "Failed to opendir '$header_dir' to find header files: $!"; + + # we need to use a temporary here as the sort in scalar context would have undefined results. + my @perl_headers= sort grep { /\.h\z/ } readdir($dh); + + closedir $dh; + + return @perl_headers; +} + + +sub _perl_header_files_fragment { + my ($self, $separator)= @_; + $separator ||= ""; + return join("\\\n", + "PERL_HDRS = ", + map { + sprintf( " \$(PERL_INCDEP)%s%s ", $separator, $_ ) + } $self->_perl_header_files() + ) . "\n\n" + . "\$(OBJECT) : \$(PERL_HDRS)\n"; +} + + + +1; +package ExtUtils::MM_QNX; + +use strict; +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Unix; +our @ISA = qw(ExtUtils::MM_Unix); + + + +sub extra_clean_files { + my $self = shift; + + my @errfiles = @{$self->{C}}; + for ( @errfiles ) { + s/.c$/.err/; + } + + return( @errfiles, 'perlmain.err' ); +} + + + + +1; +package ExtUtils::MM_VOS; + +use strict; +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Unix; +our @ISA = qw(ExtUtils::MM_Unix); + + + +sub extra_clean_files { + return qw(*.kp); +} + + + + +1; +package ExtUtils::MM_Darwin; + +use strict; + +BEGIN { + require ExtUtils::MM_Unix; + our @ISA = qw( ExtUtils::MM_Unix ); +} + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + + + +sub init_dist { + my $self = shift; + + # Thank you, Apple, for breaking tar and then breaking the work around. + # 10.4 wants COPY_EXTENDED_ATTRIBUTES_DISABLE while 10.5 wants + # COPYFILE_DISABLE. I'm not going to push my luck and instead just + # set both. + $self->{TAR} ||= + 'COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 tar'; + + $self->SUPER::init_dist(@_); +} + +1; +# $Id$ +package ExtUtils::MakeMaker; + +use strict; + +BEGIN {require 5.006;} + +require Exporter; +use ExtUtils::MakeMaker::Config; +use ExtUtils::MakeMaker::version; # ensure we always have our fake version.pm +use Carp; +use File::Path; +my $CAN_DECODE = eval { require ExtUtils::MakeMaker::Locale; }; # 2 birds, 1 stone +eval { ExtUtils::MakeMaker::Locale::reinit('UTF-8') } + if $CAN_DECODE and Encode::find_encoding('locale')->name eq 'ascii'; + +our $Verbose = 0; # exported +our @Parent; # needs to be localized +our @Get_from_Config; # referenced by MM_Unix +our @MM_Sections; +our @Overridable; +my @Prepend_parent; +my %Recognized_Att_Keys; +our %macro_fsentity; # whether a macro is a filesystem name +our %macro_dep; # whether a macro is a dependency + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; ## no critic [BuiltinFunctions::ProhibitStringyEval] + +# Emulate something resembling CVS $Revision$ +(our $Revision = $VERSION) =~ s{_}{}; +$Revision = int $Revision * 10000; + +our $Filename = __FILE__; # referenced outside MakeMaker + +our @ISA = qw(Exporter); +our @EXPORT = qw(&WriteMakefile $Verbose &prompt &os_unsupported); +our @EXPORT_OK = qw($VERSION &neatvalue &mkbootstrap &mksymlists + &WriteEmptyMakefile &open_for_writing &write_file_via_tmp + &_sprintf562); + +# These will go away once the last of the Win32 & VMS specific code is +# purged. +my $Is_VMS = $^O eq 'VMS'; +my $Is_Win32 = $^O eq 'MSWin32'; +our $UNDER_CORE = $ENV{PERL_CORE}; # needs to be our + +full_setup(); + +require ExtUtils::MM; # Things like CPAN assume loading ExtUtils::MakeMaker + # will give them MM. + +require ExtUtils::MY; # XXX pre-5.8 versions of ExtUtils::Embed expect + # loading ExtUtils::MakeMaker will give them MY. + # This will go when Embed is its own CPAN module. + + +# 5.6.2 can't do sprintf "%1$s" - this can only do %s +sub _sprintf562 { + my ($format, @args) = @_; + for (my $i = 1; $i <= @args; $i++) { + $format =~ s#%$i\$s#$args[$i-1]#g; + } + $format; +} + +sub WriteMakefile { + croak "WriteMakefile: Need even number of args" if @_ % 2; + + require ExtUtils::MY; + my %att = @_; + + _convert_compat_attrs(\%att); + + _verify_att(\%att); + + my $mm = MM->new(\%att); + $mm->flush; + + return $mm; +} + + +# Basic signatures of the attributes WriteMakefile takes. Each is the +# reference type. Empty value indicate it takes a non-reference +# scalar. +my %Att_Sigs; +my %Special_Sigs = ( + AUTHOR => 'ARRAY', + C => 'ARRAY', + CONFIG => 'ARRAY', + CONFIGURE => 'CODE', + DIR => 'ARRAY', + DL_FUNCS => 'HASH', + DL_VARS => 'ARRAY', + EXCLUDE_EXT => 'ARRAY', + EXE_FILES => 'ARRAY', + FUNCLIST => 'ARRAY', + H => 'ARRAY', + IMPORTS => 'HASH', + INCLUDE_EXT => 'ARRAY', + LIBS => ['ARRAY',''], + MAN1PODS => 'HASH', + MAN3PODS => 'HASH', + META_ADD => 'HASH', + META_MERGE => 'HASH', + OBJECT => ['ARRAY', ''], + PL_FILES => 'HASH', + PM => 'HASH', + PMLIBDIRS => 'ARRAY', + PMLIBPARENTDIRS => 'ARRAY', + PREREQ_PM => 'HASH', + BUILD_REQUIRES => 'HASH', + CONFIGURE_REQUIRES => 'HASH', + TEST_REQUIRES => 'HASH', + SKIP => 'ARRAY', + TYPEMAPS => 'ARRAY', + XS => 'HASH', + XSBUILD => 'HASH', + VERSION => ['version',''], + _KEEP_AFTER_FLUSH => '', + + clean => 'HASH', + depend => 'HASH', + dist => 'HASH', + dynamic_lib=> 'HASH', + linkext => 'HASH', + macro => 'HASH', + postamble => 'HASH', + realclean => 'HASH', + test => 'HASH', + tool_autosplit => 'HASH', +); + +@Att_Sigs{keys %Recognized_Att_Keys} = ('') x keys %Recognized_Att_Keys; +@Att_Sigs{keys %Special_Sigs} = values %Special_Sigs; + +sub _convert_compat_attrs { #result of running several times should be same + my($att) = @_; + if (exists $att->{AUTHOR}) { + if ($att->{AUTHOR}) { + if (!ref($att->{AUTHOR})) { + my $t = $att->{AUTHOR}; + $att->{AUTHOR} = [$t]; + } + } else { + $att->{AUTHOR} = []; + } + } +} + +sub _verify_att { + my($att) = @_; + + foreach my $key (sort keys %$att) { + my $val = $att->{$key}; + my $sig = $Att_Sigs{$key}; + unless( defined $sig ) { + warn "WARNING: $key is not a known parameter.\n"; + next; + } + + my @sigs = ref $sig ? @$sig : $sig; + my $given = ref $val; + unless( grep { _is_of_type($val, $_) } @sigs ) { + my $takes = join " or ", map { _format_att($_) } @sigs; + + my $has = _format_att($given); + warn "WARNING: $key takes a $takes not a $has.\n". + " Please inform the author.\n"; + } + } +} + + +# Check if a given thing is a reference or instance of $type +sub _is_of_type { + my($thing, $type) = @_; + + return 1 if ref $thing eq $type; + + local $SIG{__DIE__}; + return 1 if eval{ $thing->isa($type) }; + + return 0; +} + + +sub _format_att { + my $given = shift; + + return $given eq '' ? "string/number" + : uc $given eq $given ? "$given reference" + : "$given object" + ; +} + + +sub prompt ($;$) { ## no critic + my($mess, $def) = @_; + confess("prompt function called without an argument") + unless defined $mess; + + my $isa_tty = -t STDIN && (-t STDOUT || !(-f STDOUT || -c STDOUT)) ; + + my $dispdef = defined $def ? "[$def] " : " "; + $def = defined $def ? $def : ""; + + local $|=1; + local $\; + print "$mess $dispdef"; + + my $ans; + if ($ENV{PERL_MM_USE_DEFAULT} || (!$isa_tty && eof STDIN)) { + print "$def\n"; + } + else { + $ans = ; + if( defined $ans ) { + $ans =~ s{\015?\012$}{}; + } + else { # user hit ctrl-D + print "\n"; + } + } + + return (!defined $ans || $ans eq '') ? $def : $ans; +} + +sub os_unsupported { + die "OS unsupported\n"; +} + +sub eval_in_subdirs { + my($self) = @_; + use Cwd qw(cwd abs_path); + my $pwd = cwd() || die "Can't figure out your cwd!"; + + local @INC = map eval {abs_path($_) if -e} || $_, @INC; + push @INC, '.'; # '.' has to always be at the end of @INC + + foreach my $dir (@{$self->{DIR}}){ + my($abs) = $self->catdir($pwd,$dir); + eval { $self->eval_in_x($abs); }; + last if $@; + } + chdir $pwd; + die $@ if $@; +} + +sub eval_in_x { + my($self,$dir) = @_; + chdir $dir or carp("Couldn't change to directory $dir: $!"); + + { + package main; + do './Makefile.PL'; + }; + if ($@) { +# if ($@ =~ /prerequisites/) { +# die "MakeMaker WARNING: $@"; +# } else { +# warn "WARNING from evaluation of $dir/Makefile.PL: $@"; +# } + die "ERROR from evaluation of $dir/Makefile.PL: $@"; + } +} + + +# package name for the classes into which the first object will be blessed +my $PACKNAME = 'PACK000'; + +sub full_setup { + $Verbose ||= 0; + + my @dep_macros = qw/ + PERL_INCDEP PERL_ARCHLIBDEP PERL_ARCHIVEDEP + /; + + my @fs_macros = qw/ + FULLPERL XSUBPPDIR + + INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB INST_MAN1DIR INST_MAN3DIR + INSTALLDIRS + DESTDIR PREFIX INSTALL_BASE + PERLPREFIX SITEPREFIX VENDORPREFIX + INSTALLPRIVLIB INSTALLSITELIB INSTALLVENDORLIB + INSTALLARCHLIB INSTALLSITEARCH INSTALLVENDORARCH + INSTALLBIN INSTALLSITEBIN INSTALLVENDORBIN + INSTALLMAN1DIR INSTALLMAN3DIR + INSTALLSITEMAN1DIR INSTALLSITEMAN3DIR + INSTALLVENDORMAN1DIR INSTALLVENDORMAN3DIR + INSTALLSCRIPT INSTALLSITESCRIPT INSTALLVENDORSCRIPT + PERL_LIB PERL_ARCHLIB + SITELIBEXP SITEARCHEXP + + MAKE LIBPERL_A LIB PERL_SRC PERL_INC + PPM_INSTALL_EXEC PPM_UNINSTALL_EXEC + PPM_INSTALL_SCRIPT PPM_UNINSTALL_SCRIPT + /; + + my @attrib_help = qw/ + + AUTHOR ABSTRACT ABSTRACT_FROM BINARY_LOCATION + C CAPI CCFLAGS CONFIG CONFIGURE DEFINE DIR DISTNAME DISTVNAME + DL_FUNCS DL_VARS + EXCLUDE_EXT EXE_FILES FIRST_MAKEFILE + FULLPERLRUN FULLPERLRUNINST + FUNCLIST H IMPORTS + + INC INCLUDE_EXT LDFROM LIBS LICENSE + LINKTYPE MAKEAPERL MAKEFILE MAKEFILE_OLD MAN1PODS MAN3PODS MAP_TARGET + META_ADD META_MERGE MIN_PERL_VERSION BUILD_REQUIRES CONFIGURE_REQUIRES + MYEXTLIB NAME NEEDS_LINKING NOECHO NO_META NO_MYMETA NO_PACKLIST NO_PERLLOCAL + NORECURS NO_VC OBJECT OPTIMIZE PERL_MALLOC_OK PERL PERLMAINCC PERLRUN + PERLRUNINST PERL_CORE + PERM_DIR PERM_RW PERM_RWX MAGICXS + PL_FILES PM PM_FILTER PMLIBDIRS PMLIBPARENTDIRS POLLUTE + PREREQ_FATAL PREREQ_PM PREREQ_PRINT PRINT_PREREQ + SIGN SKIP TEST_REQUIRES TYPEMAPS UNINST VERSION VERSION_FROM XS + XSBUILD XSMULTI XSOPT XSPROTOARG XS_VERSION + clean depend dist dynamic_lib linkext macro realclean tool_autosplit + + MAN1EXT MAN3EXT + + MACPERL_SRC MACPERL_LIB MACLIBS_68K MACLIBS_PPC MACLIBS_SC MACLIBS_MRC + MACLIBS_ALL_68K MACLIBS_ALL_PPC MACLIBS_SHARED + /; + push @attrib_help, @fs_macros; + @macro_fsentity{@fs_macros, @dep_macros} = (1) x (@fs_macros+@dep_macros); + @macro_dep{@dep_macros} = (1) x @dep_macros; + + # IMPORTS is used under OS/2 and Win32 + + # @Overridable is close to @MM_Sections but not identical. The + # order is important. Many subroutines declare macros. These + # depend on each other. Let's try to collect the macros up front, + # then pasthru, then the rules. + + # MM_Sections are the sections we have to call explicitly + # in Overridable we have subroutines that are used indirectly + + + @MM_Sections = + qw( + + post_initialize const_config constants platform_constants + tool_autosplit tool_xsubpp tools_other + + makemakerdflt + + dist macro depend cflags const_loadlibs const_cccmd + post_constants + + pasthru + + special_targets + c_o xs_c xs_o + top_targets blibdirs linkext dlsyms dynamic_bs dynamic + dynamic_lib static static_lib manifypods processPL + installbin subdirs + clean_subdirs clean realclean_subdirs realclean + metafile signature + dist_basics dist_core distdir dist_test dist_ci distmeta distsignature + install force perldepend makefile staticmake test ppd + + ); # loses section ordering + + @Overridable = @MM_Sections; + push @Overridable, qw[ + + libscan makeaperl needs_linking + subdir_x test_via_harness test_via_script + + init_VERSION init_dist init_INST init_INSTALL init_DEST init_dirscan + init_PM init_MANPODS init_xs init_PERL init_DIRFILESEP init_linker + ]; + + push @MM_Sections, qw[ + + pm_to_blib selfdocument + + ]; + + # Postamble needs to be the last that was always the case + push @MM_Sections, "postamble"; + push @Overridable, "postamble"; + + # All sections are valid keys. + @Recognized_Att_Keys{@MM_Sections} = (1) x @MM_Sections; + + # we will use all these variables in the Makefile + @Get_from_Config = + qw( + ar cc cccdlflags ccdlflags dlext dlsrc exe_ext full_ar ld + lddlflags ldflags libc lib_ext obj_ext osname osvers ranlib + sitelibexp sitearchexp so + ); + + # 5.5.3 doesn't have any concept of vendor libs + push @Get_from_Config, qw( vendorarchexp vendorlibexp ) if $] >= 5.006; + + foreach my $item (@attrib_help){ + $Recognized_Att_Keys{$item} = 1; + } + foreach my $item (@Get_from_Config) { + $Recognized_Att_Keys{uc $item} = $Config{$item}; + print "Attribute '\U$item\E' => '$Config{$item}'\n" + if ($Verbose >= 2); + } + + # + # When we eval a Makefile.PL in a subdirectory, that one will ask + # us (the parent) for the values and will prepend "..", so that + # all files to be installed end up below OUR ./blib + # + @Prepend_parent = qw( + INST_BIN INST_LIB INST_ARCHLIB INST_SCRIPT + MAP_TARGET INST_MAN1DIR INST_MAN3DIR PERL_SRC + PERL FULLPERL + ); +} + +sub _has_cpan_meta_requirements { + return eval { + require CPAN::Meta::Requirements; + CPAN::Meta::Requirements->VERSION(2.130); + require B; # CMR requires this, for core we have to too. + }; +} + +sub new { + my($class,$self) = @_; + my($key); + + _convert_compat_attrs($self) if defined $self && $self; + + # Store the original args passed to WriteMakefile() + foreach my $k (keys %$self) { + $self->{ARGS}{$k} = $self->{$k}; + } + + $self = {} unless defined $self; + + # Temporarily bless it into MM so it can be used as an + # object. It will be blessed into a temp package later. + bless $self, "MM"; + + # Cleanup all the module requirement bits + my %key2cmr; + for my $key (qw(PREREQ_PM BUILD_REQUIRES CONFIGURE_REQUIRES TEST_REQUIRES)) { + $self->{$key} ||= {}; + if (_has_cpan_meta_requirements) { + my $cmr = CPAN::Meta::Requirements->from_string_hash( + $self->{$key}, + { + bad_version_hook => sub { + #no warnings 'numeric'; # module doesn't use warnings + my $fallback; + if ( $_[0] =~ m!^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$! ) { + $fallback = sprintf "%f", $_[0]; + } else { + ($fallback) = $_[0] ? ($_[0] =~ /^([0-9.]+)/) : 0; + $fallback += 0; + carp "Unparsable version '$_[0]' for prerequisite $_[1] treated as $fallback"; + } + version->new($fallback); + }, + }, + ); + $self->{$key} = $cmr->as_string_hash; + $key2cmr{$key} = $cmr; + } else { + for my $module (sort keys %{ $self->{$key} }) { + my $version = $self->{$key}->{$module}; + my $fallback = 0; + if (!defined($version) or !length($version)) { + carp "Undefined requirement for $module treated as '0' (CPAN::Meta::Requirements not available)"; + } + elsif ($version =~ /^\d+(?:\.\d+(?:_\d+)*)?$/) { + next; + } + else { + if ( $version =~ m!^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$! ) { + $fallback = sprintf "%f", $version; + } else { + ($fallback) = $version ? ($version =~ /^([0-9.]+)/) : 0; + $fallback += 0; + carp "Unparsable version '$version' for prerequisite $module treated as $fallback (CPAN::Meta::Requirements not available)"; + } + } + $self->{$key}->{$module} = $fallback; + } + } + } + + if ("@ARGV" =~ /\bPREREQ_PRINT\b/) { + $self->_PREREQ_PRINT; + } + + # PRINT_PREREQ is RedHatism. + if ("@ARGV" =~ /\bPRINT_PREREQ\b/) { + $self->_PRINT_PREREQ; + } + + print "MakeMaker (v$VERSION)\n" if $Verbose; + if (-f "MANIFEST" && ! -f "Makefile" && ! $UNDER_CORE){ + check_manifest(); + } + + check_hints($self); + + if ( defined $self->{MIN_PERL_VERSION} + && $self->{MIN_PERL_VERSION} !~ /^v?[\d_\.]+$/ ) { + require version; + my $normal = eval { + local $SIG{__WARN__} = sub { + # simulate "use warnings FATAL => 'all'" for vintage perls + die @_; + }; + version->new( $self->{MIN_PERL_VERSION} ) + }; + $self->{MIN_PERL_VERSION} = $normal if defined $normal && !$@; + } + + # Translate X.Y.Z to X.00Y00Z + if( defined $self->{MIN_PERL_VERSION} ) { + $self->{MIN_PERL_VERSION} =~ s{ ^v? (\d+) \. (\d+) \. (\d+) $ } + {sprintf "%d.%03d%03d", $1, $2, $3}ex; + } + + my $perl_version_ok = eval { + local $SIG{__WARN__} = sub { + # simulate "use warnings FATAL => 'all'" for vintage perls + die @_; + }; + !$self->{MIN_PERL_VERSION} or $self->{MIN_PERL_VERSION} <= $] + }; + if (!$perl_version_ok) { + if (!defined $perl_version_ok) { + die <<'END'; +Warning: MIN_PERL_VERSION is not in a recognized format. +Recommended is a quoted numerical value like '5.005' or '5.008001'. +END + } + elsif ($self->{PREREQ_FATAL}) { + die sprintf <<"END", $self->{MIN_PERL_VERSION}, $]; +MakeMaker FATAL: perl version too low for this distribution. +Required is %s. We run %s. +END + } + else { + warn sprintf + "Warning: Perl version %s or higher required. We run %s.\n", + $self->{MIN_PERL_VERSION}, $]; + } + } + + my %configure_att; # record &{$self->{CONFIGURE}} attributes + my(%initial_att) = %$self; # record initial attributes + + my(%unsatisfied) = (); + my %prereq2version; + my $cmr; + if (_has_cpan_meta_requirements) { + $cmr = CPAN::Meta::Requirements->new; + for my $key (qw(PREREQ_PM BUILD_REQUIRES CONFIGURE_REQUIRES TEST_REQUIRES)) { + $cmr->add_requirements($key2cmr{$key}) if $key2cmr{$key}; + } + foreach my $prereq ($cmr->required_modules) { + $prereq2version{$prereq} = $cmr->requirements_for_module($prereq); + } + } else { + for my $key (qw(PREREQ_PM BUILD_REQUIRES CONFIGURE_REQUIRES TEST_REQUIRES)) { + next unless my $module2version = $self->{$key}; + $prereq2version{$_} = $module2version->{$_} for keys %$module2version; + } + } + foreach my $prereq (sort keys %prereq2version) { + my $required_version = $prereq2version{$prereq}; + + my $pr_version = 0; + my $installed_file; + + if ( $prereq eq 'perl' ) { + if ( defined $required_version && $required_version =~ /^v?[\d_\.]+$/ + || $required_version !~ /^v?[\d_\.]+$/ ) { + require version; + my $normal = eval { version->new( $required_version ) }; + $required_version = $normal if defined $normal; + } + $installed_file = $prereq; + $pr_version = $]; + } + else { + $installed_file = MM->_installed_file_for_module($prereq); + $pr_version = MM->parse_version($installed_file) if $installed_file; + $pr_version = 0 if $pr_version eq 'undef'; + if ( !eval { version->new( $pr_version ); 1 } ) { + #no warnings 'numeric'; # module doesn't use warnings + my $fallback; + if ( $pr_version =~ m!^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$! ) { + $fallback = sprintf '%f', $pr_version; + } else { + ($fallback) = $pr_version ? ($pr_version =~ /^([0-9.]+)/) : 0; + $fallback += 0; + carp "Unparsable version '$pr_version' for installed prerequisite $prereq treated as $fallback"; + } + $pr_version = $fallback; + } + } + + # convert X.Y_Z alpha version #s to X.YZ for easier comparisons + $pr_version =~ s/(\d+)\.(\d+)_(\d+)/$1.$2$3/; + + if (!$installed_file) { + warn sprintf "Warning: prerequisite %s %s not found.\n", + $prereq, $required_version + unless $self->{PREREQ_FATAL} + or $UNDER_CORE; + + $unsatisfied{$prereq} = 'not installed'; + } + elsif ( + $cmr + ? !$cmr->accepts_module($prereq, $pr_version) + : $required_version > $pr_version + ) { + warn sprintf "Warning: prerequisite %s %s not found. We have %s.\n", + $prereq, $required_version, ($pr_version || 'unknown version') + unless $self->{PREREQ_FATAL} + or $UNDER_CORE; + + $unsatisfied{$prereq} = $required_version || 'unknown version' ; + } + } + + if (%unsatisfied && $self->{PREREQ_FATAL}){ + my $failedprereqs = join "\n", map {" $_ $unsatisfied{$_}"} + sort { $a cmp $b } keys %unsatisfied; + die <<"END"; +MakeMaker FATAL: prerequisites not found. +$failedprereqs + +Please install these modules first and rerun 'perl Makefile.PL'. +END + } + + if (defined $self->{CONFIGURE}) { + if (ref $self->{CONFIGURE} eq 'CODE') { + %configure_att = %{&{$self->{CONFIGURE}}}; + _convert_compat_attrs(\%configure_att); + $self = { %$self, %configure_att }; + } else { + croak "Attribute 'CONFIGURE' to WriteMakefile() not a code reference\n"; + } + } + + my $newclass = ++$PACKNAME; + local @Parent = @Parent; # Protect against non-local exits + { + print "Blessing Object into class [$newclass]\n" if $Verbose>=2; + mv_all_methods("MY",$newclass); + bless $self, $newclass; + push @Parent, $self; + require ExtUtils::MY; + + no strict 'refs'; ## no critic; + @{"$newclass\:\:ISA"} = 'MM'; + } + + if (defined $Parent[-2]){ + $self->{PARENT} = $Parent[-2]; + for my $key (@Prepend_parent) { + next unless defined $self->{PARENT}{$key}; + + # Don't stomp on WriteMakefile() args. + next if defined $self->{ARGS}{$key} and + $self->{ARGS}{$key} eq $self->{$key}; + + $self->{$key} = $self->{PARENT}{$key}; + + if ($Is_VMS && $key =~ /PERL$/) { + # PERL or FULLPERL will be a command verb or even a + # command with an argument instead of a full file + # specification under VMS. So, don't turn the command + # into a filespec, but do add a level to the path of + # the argument if not already absolute. + my @cmd = split /\s+/, $self->{$key}; + $cmd[1] = $self->catfile('[-]',$cmd[1]) + unless (@cmd < 2) || $self->file_name_is_absolute($cmd[1]); + $self->{$key} = join(' ', @cmd); + } else { + my $value = $self->{$key}; + # not going to test in FS so only stripping start + $value =~ s/^"// if $key =~ /PERL$/; + $value = $self->catdir("..", $value) + unless $self->file_name_is_absolute($value); + $value = qq{"$value} if $key =~ /PERL$/; + $self->{$key} = $value; + } + } + if ($self->{PARENT}) { + $self->{PARENT}->{CHILDREN}->{$newclass} = $self; + foreach my $opt (qw(POLLUTE PERL_CORE LINKTYPE LD OPTIMIZE)) { + if (exists $self->{PARENT}->{$opt} + and not exists $self->{$opt}) + { + # inherit, but only if already unspecified + $self->{$opt} = $self->{PARENT}->{$opt}; + } + } + } + my @fm = grep /^FIRST_MAKEFILE=/, @ARGV; + parse_args($self,@fm) if @fm; + } + else { + parse_args($self, _shellwords($ENV{PERL_MM_OPT} || ''),@ARGV); + } + + # RT#91540 PREREQ_FATAL not recognized on command line + if (%unsatisfied && $self->{PREREQ_FATAL}){ + my $failedprereqs = join "\n", map {" $_ $unsatisfied{$_}"} + sort { $a cmp $b } keys %unsatisfied; + die <<"END"; +MakeMaker FATAL: prerequisites not found. +$failedprereqs + +Please install these modules first and rerun 'perl Makefile.PL'. +END + } + + $self->{NAME} ||= $self->guess_name; + + warn "Warning: NAME must be a package name\n" + unless $self->{NAME} =~ m!^[A-Z_a-z][0-9A-Z_a-z]*(?:::[0-9A-Z_a-z]+)*$!; + + ($self->{NAME_SYM} = $self->{NAME}) =~ s/\W+/_/g; + + $self->init_MAKE; + $self->init_main; + $self->init_VERSION; + $self->init_dist; + $self->init_INST; + $self->init_INSTALL; + $self->init_DEST; + $self->init_dirscan; + $self->init_PM; + $self->init_MANPODS; + $self->init_xs; + $self->init_PERL; + $self->init_DIRFILESEP; + $self->init_linker; + $self->init_ABSTRACT; + + $self->arch_check( + $INC{'Config.pm'}, + $self->catfile($Config{'archlibexp'}, "Config.pm") + ); + + $self->init_tools(); + $self->init_others(); + $self->init_platform(); + $self->init_PERM(); + my @args = @ARGV; + @args = map { Encode::decode(locale => $_) } @args if $CAN_DECODE; + my($argv) = neatvalue(\@args); + $argv =~ s/^\[/(/; + $argv =~ s/\]$/)/; + + push @{$self->{RESULT}}, <{NAME} extension to perl. +# +# It was generated automatically by MakeMaker version +# $VERSION (Revision: $Revision) from the contents of +# Makefile.PL. Don't edit this file, edit Makefile.PL instead. +# +# ANY CHANGES MADE HERE WILL BE LOST! +# +# MakeMaker ARGV: $argv +# +END + + push @{$self->{RESULT}}, $self->_MakeMaker_Parameters_section(\%initial_att); + + if (defined $self->{CONFIGURE}) { + push @{$self->{RESULT}}, < 0) { + foreach my $key (sort keys %configure_att){ + next if $key eq 'ARGS'; + my($v) = neatvalue($configure_att{$key}); + $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/; + $v =~ tr/\n/ /s; + push @{$self->{RESULT}}, "# $key => $v"; + } + } + else + { + push @{$self->{RESULT}}, "# no values returned"; + } + undef %configure_att; # free memory + } + + # turn the SKIP array into a SKIPHASH hash + for my $skip (@{$self->{SKIP} || []}) { + $self->{SKIPHASH}{$skip} = 1; + } + delete $self->{SKIP}; # free memory + + if ($self->{PARENT}) { + for (qw/install dist dist_basics dist_core distdir dist_test dist_ci/) { + $self->{SKIPHASH}{$_} = 1; + } + } + + # We run all the subdirectories now. They don't have much to query + # from the parent, but the parent has to query them: if they need linking! + unless ($self->{NORECURS}) { + $self->eval_in_subdirs if @{$self->{DIR}}; + } + + foreach my $section ( @MM_Sections ){ + # Support for new foo_target() methods. + my $method = $section; + $method .= '_target' unless $self->can($method); + + print "Processing Makefile '$section' section\n" if ($Verbose >= 2); + my($skipit) = $self->skipcheck($section); + if ($skipit){ + push @{$self->{RESULT}}, "\n# --- MakeMaker $section section $skipit."; + } else { + my(%a) = %{$self->{$section} || {}}; + push @{$self->{RESULT}}, "\n# --- MakeMaker $section section:"; + push @{$self->{RESULT}}, "# " . join ", ", %a if $Verbose && %a; + push @{$self->{RESULT}}, $self->maketext_filter( + $self->$method( %a ) + ); + } + } + + push @{$self->{RESULT}}, "\n# End."; + + $self; +} + +sub WriteEmptyMakefile { + croak "WriteEmptyMakefile: Need an even number of args" if @_ % 2; + + my %att = @_; + $att{DIR} = [] unless $att{DIR}; # don't recurse by default + my $self = MM->new(\%att); + + my $new = $self->{MAKEFILE}; + my $old = $self->{MAKEFILE_OLD}; + if (-f $old) { + _unlink($old) or warn "unlink $old: $!"; + } + if ( -f $new ) { + _rename($new, $old) or warn "rename $new => $old: $!" + } + open my $mfh, '>', $new or die "open $new for write: $!"; + print $mfh <<'EOP'; +all : + +manifypods : + +subdirs : + +dynamic : + +static : + +clean : + +install : + +makemakerdflt : + +test : + +test_dynamic : + +test_static : + +EOP + close $mfh or die "close $new for write: $!"; +} + + + +sub _installed_file_for_module { + my $class = shift; + my $prereq = shift; + + my $file = "$prereq.pm"; + $file =~ s{::}{/}g; + + my $path; + for my $dir (@INC) { + my $tmp = File::Spec->catfile($dir, $file); + if ( -r $tmp ) { + $path = $tmp; + last; + } + } + + return $path; +} + + +# Extracted from MakeMaker->new so we can test it +sub _MakeMaker_Parameters_section { + my $self = shift; + my $att = shift; + + my @result = <<'END'; +# MakeMaker Parameters: +END + + foreach my $key (sort keys %$att){ + next if $key eq 'ARGS'; + my $v; + if ($key eq 'PREREQ_PM') { + # CPAN.pm takes prereqs from this field in 'Makefile' + # and does not know about BUILD_REQUIRES + $v = neatvalue({ + %{ $att->{PREREQ_PM} || {} }, + %{ $att->{BUILD_REQUIRES} || {} }, + %{ $att->{TEST_REQUIRES} || {} }, + }); + } else { + $v = neatvalue($att->{$key}); + } + + $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/; + $v =~ tr/\n/ /s; + push @result, "# $key => $v"; + } + + return @result; +} + +# _shellwords and _parseline borrowed from Text::ParseWords +sub _shellwords { + my (@lines) = @_; + my @allwords; + + foreach my $line (@lines) { + $line =~ s/^\s+//; + my @words = _parse_line('\s+', 0, $line); + pop @words if (@words and !defined $words[-1]); + return() unless (@words || !length($line)); + push(@allwords, @words); + } + return(@allwords); +} + +sub _parse_line { + my($delimiter, $keep, $line) = @_; + my($word, @pieces); + + no warnings 'uninitialized'; # we will be testing undef strings + + while (length($line)) { + # This pattern is optimised to be stack conservative on older perls. + # Do not refactor without being careful and testing it on very long strings. + # See Perl bug #42980 for an example of a stack busting input. + $line =~ s/^ + (?: + # double quoted string + (") # $quote + ((?>[^\\"]*(?:\\.[^\\"]*)*))" # $quoted + | # --OR-- + # singe quoted string + (') # $quote + ((?>[^\\']*(?:\\.[^\\']*)*))' # $quoted + | # --OR-- + # unquoted string + ( # $unquoted + (?:\\.|[^\\"'])*? + ) + # followed by + ( # $delim + \Z(?!\n) # EOL + | # --OR-- + (?-x:$delimiter) # delimiter + | # --OR-- + (?!^)(?=["']) # a quote + ) + )//xs or return; # extended layout + my ($quote, $quoted, $unquoted, $delim) = (($1 ? ($1,$2) : ($3,$4)), $5, $6); + + + return() unless( defined($quote) || length($unquoted) || length($delim)); + + if ($keep) { + $quoted = "$quote$quoted$quote"; + } + else { + $unquoted =~ s/\\(.)/$1/sg; + if (defined $quote) { + $quoted =~ s/\\(.)/$1/sg if ($quote eq '"'); + #$quoted =~ s/\\([\\'])/$1/g if ( $PERL_SINGLE_QUOTE && $quote eq "'"); + } + } + $word .= substr($line, 0, 0); # leave results tainted + $word .= defined $quote ? $quoted : $unquoted; + + if (length($delim)) { + push(@pieces, $word); + push(@pieces, $delim) if ($keep eq 'delimiters'); + undef $word; + } + if (!length($line)) { + push(@pieces, $word); + } + } + return(@pieces); +} + +sub check_manifest { + print "Checking if your kit is complete...\n"; + require ExtUtils::Manifest; + # avoid warning + $ExtUtils::Manifest::Quiet = $ExtUtils::Manifest::Quiet = 1; + my(@missed) = ExtUtils::Manifest::manicheck(); + if (@missed) { + print "Warning: the following files are missing in your kit:\n"; + print "\t", join "\n\t", @missed; + print "\n"; + print "Please inform the author.\n"; + } else { + print "Looks good\n"; + } +} + +sub parse_args{ + my($self, @args) = @_; + @args = map { Encode::decode(locale => $_) } @args if $CAN_DECODE; + foreach (@args) { + unless (m/(.*?)=(.*)/) { + ++$Verbose if m/^verb/; + next; + } + my($name, $value) = ($1, $2); + if ($value =~ m/^~(\w+)?/) { # tilde with optional username + $value =~ s [^~(\w*)] + [$1 ? + ((getpwnam($1))[7] || "~$1") : + (getpwuid($>))[7] + ]ex; + } + + # Remember the original args passed it. It will be useful later. + $self->{ARGS}{uc $name} = $self->{uc $name} = $value; + } + + # catch old-style 'potential_libs' and inform user how to 'upgrade' + if (defined $self->{potential_libs}){ + my($msg)="'potential_libs' => '$self->{potential_libs}' should be"; + if ($self->{potential_libs}){ + print "$msg changed to:\n\t'LIBS' => ['$self->{potential_libs}']\n"; + } else { + print "$msg deleted.\n"; + } + $self->{LIBS} = [$self->{potential_libs}]; + delete $self->{potential_libs}; + } + # catch old-style 'ARMAYBE' and inform user how to 'upgrade' + if (defined $self->{ARMAYBE}){ + my($armaybe) = $self->{ARMAYBE}; + print "ARMAYBE => '$armaybe' should be changed to:\n", + "\t'dynamic_lib' => {ARMAYBE => '$armaybe'}\n"; + my(%dl) = %{$self->{dynamic_lib} || {}}; + $self->{dynamic_lib} = { %dl, ARMAYBE => $armaybe}; + delete $self->{ARMAYBE}; + } + if (defined $self->{LDTARGET}){ + print "LDTARGET should be changed to LDFROM\n"; + $self->{LDFROM} = $self->{LDTARGET}; + delete $self->{LDTARGET}; + } + # Turn a DIR argument on the command line into an array + if (defined $self->{DIR} && ref \$self->{DIR} eq 'SCALAR') { + # So they can choose from the command line, which extensions they want + # the grep enables them to have some colons too much in case they + # have to build a list with the shell + $self->{DIR} = [grep $_, split ":", $self->{DIR}]; + } + # Turn a INCLUDE_EXT argument on the command line into an array + if (defined $self->{INCLUDE_EXT} && ref \$self->{INCLUDE_EXT} eq 'SCALAR') { + $self->{INCLUDE_EXT} = [grep $_, split '\s+', $self->{INCLUDE_EXT}]; + } + # Turn a EXCLUDE_EXT argument on the command line into an array + if (defined $self->{EXCLUDE_EXT} && ref \$self->{EXCLUDE_EXT} eq 'SCALAR') { + $self->{EXCLUDE_EXT} = [grep $_, split '\s+', $self->{EXCLUDE_EXT}]; + } + + foreach my $mmkey (sort keys %$self){ + next if $mmkey eq 'ARGS'; + print " $mmkey => ", neatvalue($self->{$mmkey}), "\n" if $Verbose; + print "'$mmkey' is not a known MakeMaker parameter name.\n" + unless exists $Recognized_Att_Keys{$mmkey}; + } + $| = 1 if $Verbose; +} + +sub check_hints { + my($self) = @_; + # We allow extension-specific hints files. + + require File::Spec; + my $curdir = File::Spec->curdir; + + my $hint_dir = File::Spec->catdir($curdir, "hints"); + return unless -d $hint_dir; + + # First we look for the best hintsfile we have + my($hint)="${^O}_$Config{osvers}"; + $hint =~ s/\./_/g; + $hint =~ s/_$//; + return unless $hint; + + # Also try without trailing minor version numbers. + while (1) { + last if -f File::Spec->catfile($hint_dir, "$hint.pl"); # found + } continue { + last unless $hint =~ s/_[^_]*$//; # nothing to cut off + } + my $hint_file = File::Spec->catfile($hint_dir, "$hint.pl"); + + return unless -f $hint_file; # really there + + _run_hintfile($self, $hint_file); +} + +sub _run_hintfile { + our $self; + local($self) = shift; # make $self available to the hint file. + my($hint_file) = shift; + + local($@, $!); + print "Processing hints file $hint_file\n" if $Verbose; + + # Just in case the ./ isn't on the hint file, which File::Spec can + # often strip off, we bung the curdir into @INC + local @INC = (File::Spec->curdir, @INC); + my $ret = do $hint_file; + if( !defined $ret ) { + my $error = $@ || $!; + warn $error; + } +} + +sub mv_all_methods { + my($from,$to) = @_; + local $SIG{__WARN__} = sub { + # can't use 'no warnings redefined', 5.6 only + warn @_ unless $_[0] =~ /^Subroutine .* redefined/ + }; + foreach my $method (@Overridable) { + next unless defined &{"${from}::$method"}; + no strict 'refs'; ## no critic + *{"${to}::$method"} = \&{"${from}::$method"}; + + # If we delete a method, then it will be undefined and cannot + # be called. But as long as we have Makefile.PLs that rely on + # %MY:: being intact, we have to fill the hole with an + # inheriting method: + + { + package MY; + my $super = "SUPER::".$method; + *{$method} = sub { + shift->$super(@_); + }; + } + } +} + +sub skipcheck { + my($self) = shift; + my($section) = @_; + return 'skipped' if $section eq 'metafile' && $UNDER_CORE; + if ($section eq 'dynamic') { + print "Warning (non-fatal): Target 'dynamic' depends on targets ", + "in skipped section 'dynamic_bs'\n" + if $self->{SKIPHASH}{dynamic_bs} && $Verbose; + print "Warning (non-fatal): Target 'dynamic' depends on targets ", + "in skipped section 'dynamic_lib'\n" + if $self->{SKIPHASH}{dynamic_lib} && $Verbose; + } + if ($section eq 'dynamic_lib') { + print "Warning (non-fatal): Target '\$(INST_DYNAMIC)' depends on ", + "targets in skipped section 'dynamic_bs'\n" + if $self->{SKIPHASH}{dynamic_bs} && $Verbose; + } + if ($section eq 'static') { + print "Warning (non-fatal): Target 'static' depends on targets ", + "in skipped section 'static_lib'\n" + if $self->{SKIPHASH}{static_lib} && $Verbose; + } + return 'skipped' if $self->{SKIPHASH}{$section}; + return ''; +} + +# returns filehandle, dies on fail. :raw so no :crlf +sub open_for_writing { + my ($file) = @_; + open my $fh ,">", $file or die "Unable to open $file: $!"; + my @layers = ':raw'; + push @layers, join ' ', ':encoding(locale)' if $CAN_DECODE; + binmode $fh, join ' ', @layers; + $fh; +} + +sub flush { + my $self = shift; + + my $finalname = $self->{MAKEFILE}; + printf "Generating a %s %s\n", $self->make_type, $finalname if $Verbose || !$self->{PARENT}; + print "Writing $finalname for $self->{NAME}\n" if $Verbose || !$self->{PARENT}; + + unlink($finalname, "MakeMaker.tmp", $Is_VMS ? 'Descrip.MMS' : ()); + + write_file_via_tmp($finalname, $self->{RESULT}); + + # Write MYMETA.yml to communicate metadata up to the CPAN clients + print "Writing MYMETA.yml and MYMETA.json\n" + if !$self->{NO_MYMETA} and $self->write_mymeta( $self->mymeta ); + + # save memory + if ($self->{PARENT} && !$self->{_KEEP_AFTER_FLUSH}) { + my %keep = map { ($_ => 1) } qw(NEEDS_LINKING HAS_LINK_CODE); + delete $self->{$_} for grep !$keep{$_}, keys %$self; + } + + system("$Config::Config{eunicefix} $finalname") + if $Config::Config{eunicefix} ne ":"; + + return; +} + +sub write_file_via_tmp { + my ($finalname, $contents) = @_; + my $fh = open_for_writing("MakeMaker.tmp"); + die "write_file_via_tmp: 2nd arg must be ref" unless ref $contents; + for my $chunk (@$contents) { + my $to_write = $chunk; + utf8::encode $to_write if !$CAN_DECODE && $] > 5.008; + print $fh "$to_write\n" or die "Can't write to MakeMaker.tmp: $!"; + } + close $fh or die "Can't write to MakeMaker.tmp: $!"; + _rename("MakeMaker.tmp", $finalname) or + warn "rename MakeMaker.tmp => $finalname: $!"; + chmod 0644, $finalname if !$Is_VMS; + return; +} + +# This is a rename for OS's where the target must be unlinked first. +sub _rename { + my($src, $dest) = @_; + _unlink($dest); + return rename $src, $dest; +} + +# This is an unlink for OS's where the target must be writable first. +sub _unlink { + my @files = @_; + chmod 0666, @files; + return unlink @files; +} + + +# The following mkbootstrap() is only for installations that are calling +# the pre-4.1 mkbootstrap() from their old Makefiles. This MakeMaker +# writes Makefiles, that use ExtUtils::Mkbootstrap directly. +sub mkbootstrap { + die <".neatvalue($v->{$key}); + } + return "{ ".join(', ',@m)." }"; +} + +sub _find_magic_vstring { + my $value = shift; + return $value if $UNDER_CORE; + my $tvalue = ''; + require B; + my $sv = B::svref_2object(\$value); + my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef; + while ( $magic ) { + if ( $magic->TYPE eq 'V' ) { + $tvalue = $magic->PTR; + $tvalue =~ s/^v?(.+)$/v$1/; + last; + } + else { + $magic = $magic->MOREMAGIC; + } + } + return $tvalue; +} + +sub selfdocument { + my($self) = @_; + my(@m); + if ($Verbose){ + push @m, "\n# Full list of MakeMaker attribute values:"; + foreach my $key (sort keys %$self){ + next if $key eq 'RESULT' || $key =~ /^[A-Z][a-z]/; + my($v) = neatvalue($self->{$key}); + $v =~ s/(CODE|HASH|ARRAY|SCALAR)\([\dxa-f]+\)/$1\(...\)/; + $v =~ tr/\n/ /s; + push @m, "# $key => $v"; + } + } + # added here as selfdocument is not overridable + push @m, <<'EOF'; + +# here so even if top_targets is overridden, these will still be defined +# gmake will silently still work if any are .PHONY-ed but nmake won't +EOF + push @m, join "\n", map "$_ ::\n\t\$(NOECHO) \$(NOOP)\n", + # config is so manifypods won't puke if no subdirs + grep !$self->{SKIPHASH}{$_}, + qw(static dynamic config); + join "\n", @m; +} + +1; + +__END__ + +package ExtUtils::Liblist; + +use strict; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +use File::Spec; +require ExtUtils::Liblist::Kid; +our @ISA = qw(ExtUtils::Liblist::Kid File::Spec); + +# Backwards compatibility with old interface. +sub ext { + goto &ExtUtils::Liblist::Kid::ext; +} + +sub lsdir { + shift; + my $rex = qr/$_[1]/; + opendir my $dir_fh, $_[0]; + my @out = grep /$rex/, readdir $dir_fh; + closedir $dir_fh; + return @out; +} + +__END__ + + +package ExtUtils::Installed; + +use 5.00503; +use strict; +#use warnings; # XXX requires 5.6 +use Carp qw(); +use ExtUtils::Packlist; +use ExtUtils::MakeMaker; +use Config; +use File::Find; +use File::Basename; +use File::Spec; + +my $Is_VMS = $^O eq 'VMS'; +my $DOSISH = ($^O =~ /^(MSWin\d\d|os2|dos|mint)$/); + +require VMS::Filespec if $Is_VMS; + +use vars qw($VERSION); +$VERSION = '2.14'; +$VERSION = eval $VERSION; + +sub _is_prefix { + my ($self, $path, $prefix) = @_; + return unless defined $prefix && defined $path; + + if( $Is_VMS ) { + $prefix = VMS::Filespec::unixify($prefix); + $path = VMS::Filespec::unixify($path); + } + + # Unix path normalization. + $prefix = File::Spec->canonpath($prefix); + + return 1 if substr($path, 0, length($prefix)) eq $prefix; + + if ($DOSISH) { + $path =~ s|\\|/|g; + $prefix =~ s|\\|/|g; + return 1 if $path =~ m{^\Q$prefix\E}i; + } + return(0); +} + +sub _is_doc { + my ($self, $path) = @_; + + my $man1dir = $self->{':private:'}{Config}{man1direxp}; + my $man3dir = $self->{':private:'}{Config}{man3direxp}; + return(($man1dir && $self->_is_prefix($path, $man1dir)) + || + ($man3dir && $self->_is_prefix($path, $man3dir)) + ? 1 : 0) +} + +sub _is_type { + my ($self, $path, $type) = @_; + return 1 if $type eq "all"; + + return($self->_is_doc($path)) if $type eq "doc"; + my $conf= $self->{':private:'}{Config}; + if ($type eq "prog") { + return($self->_is_prefix($path, $conf->{prefix} || $conf->{prefixexp}) + && !($self->_is_doc($path)) ? 1 : 0); + } + return(0); +} + +sub _is_under { + my ($self, $path, @under) = @_; + $under[0] = "" if (! @under); + foreach my $dir (@under) { + return(1) if ($self->_is_prefix($path, $dir)); + } + + return(0); +} + +sub _fix_dirs { + my ($self, @dirs)= @_; + # File::Find does not know how to deal with VMS filepaths. + if( $Is_VMS ) { + $_ = VMS::Filespec::unixify($_) + for @dirs; + } + + if ($DOSISH) { + s|\\|/|g for @dirs; + } + return wantarray ? @dirs : $dirs[0]; +} + +sub _make_entry { + my ($self, $module, $packlist_file, $modfile)= @_; + + my $data= { + module => $module, + packlist => scalar(ExtUtils::Packlist->new($packlist_file)), + packlist_file => $packlist_file, + }; + + if (!$modfile) { + $data->{version} = $self->{':private:'}{Config}{version}; + } else { + $data->{modfile} = $modfile; + # Find the top-level module file in @INC + $data->{version} = ''; + foreach my $dir (@{$self->{':private:'}{INC}}) { + my $p = File::Spec->catfile($dir, $modfile); + if (-r $p) { + $module = _module_name($p, $module) if $Is_VMS; + + $data->{version} = MM->parse_version($p); + $data->{version_from} = $p; + $data->{packlist_valid} = exists $data->{packlist}{$p}; + last; + } + } + } + $self->{$module}= $data; +} + +our $INSTALLED; +sub new { + my ($class) = shift(@_); + $class = ref($class) || $class; + + my %args = @_; + + return $INSTALLED if $INSTALLED and ($args{default_get} || $args{default}); + + my $self = bless {}, $class; + + $INSTALLED= $self if $args{default_set} || $args{default}; + + + if ($args{config_override}) { + eval { + $self->{':private:'}{Config} = { %{$args{config_override}} }; + } or Carp::croak( + "The 'config_override' parameter must be a hash reference." + ); + } + else { + $self->{':private:'}{Config} = \%Config; + } + + for my $tuple ([inc_override => INC => [ @INC ] ], + [ extra_libs => EXTRA => [] ]) + { + my ($arg,$key,$val)=@$tuple; + if ( $args{$arg} ) { + eval { + $self->{':private:'}{$key} = [ @{$args{$arg}} ]; + } or Carp::croak( + "The '$arg' parameter must be an array reference." + ); + } + elsif ($val) { + $self->{':private:'}{$key} = $val; + } + } + { + my %dupe; + @{$self->{':private:'}{LIBDIRS}} = + grep { $_ ne '.' || ! $args{skip_cwd} } + grep { -e $_ && !$dupe{$_}++ } + @{$self->{':private:'}{EXTRA}}, @{$self->{':private:'}{INC}}; + } + + my @dirs= $self->_fix_dirs(@{$self->{':private:'}{LIBDIRS}}); + + # Read the core packlist + my $archlib = $self->_fix_dirs($self->{':private:'}{Config}{archlibexp}); + $self->_make_entry("Perl",File::Spec->catfile($archlib, '.packlist')); + + my $root; + # Read the module packlists + my $sub = sub { + # Only process module .packlists + return if $_ ne ".packlist" || $File::Find::dir eq $archlib; + + # Hack of the leading bits of the paths & convert to a module name + my $module = $File::Find::name; + my $found = $module =~ s!^.*?/auto/(.*)/.packlist!$1!s + or do { + # warn "Woah! \$_=$_\n\$module=$module\n\$File::Find::dir=$File::Find::dir\n", + # join ("\n",@dirs); + return; + }; + + my $modfile = "$module.pm"; + $module =~ s!/!::!g; + + return if $self->{$module}; #shadowing? + $self->_make_entry($module,$File::Find::name,$modfile); + }; + while (@dirs) { + $root= shift @dirs; + next if !-d $root; + find($sub,$root); + } + + return $self; +} + +# VMS's non-case preserving file-system means the package name can't +# be reconstructed from the filename. +sub _module_name { + my($file, $orig_module) = @_; + + my $module = ''; + if (open PACKFH, $file) { + while () { + if (/package\s+(\S+)\s*;/) { + my $pack = $1; + # Make a sanity check, that lower case $module + # is identical to lowercase $pack before + # accepting it + if (lc($pack) eq lc($orig_module)) { + $module = $pack; + last; + } + } + } + close PACKFH; + } + + print STDERR "Couldn't figure out the package name for $file\n" + unless $module; + + return $module; +} + +sub modules { + my ($self) = @_; + $self= $self->new(default=>1) if !ref $self; + + # Bug/feature of sort in scalar context requires this. + return wantarray + ? sort grep { not /^:private:$/ } keys %$self + : grep { not /^:private:$/ } keys %$self; +} + +sub files { + my ($self, $module, $type, @under) = @_; + $self= $self->new(default=>1) if !ref $self; + + # Validate arguments + Carp::croak("$module is not installed") if (! exists($self->{$module})); + $type = "all" if (! defined($type)); + Carp::croak('type must be "all", "prog" or "doc"') + if ($type ne "all" && $type ne "prog" && $type ne "doc"); + + my (@files); + foreach my $file (keys(%{$self->{$module}{packlist}})) { + push(@files, $file) + if ($self->_is_type($file, $type) && + $self->_is_under($file, @under)); + } + return(@files); +} + +sub directories { + my ($self, $module, $type, @under) = @_; + $self= $self->new(default=>1) if !ref $self; + my (%dirs); + foreach my $file ($self->files($module, $type, @under)) { + $dirs{dirname($file)}++; + } + return sort keys %dirs; +} + +sub directory_tree { + my ($self, $module, $type, @under) = @_; + $self= $self->new(default=>1) if !ref $self; + my (%dirs); + foreach my $dir ($self->directories($module, $type, @under)) { + $dirs{$dir}++; + my ($last) = (""); + while ($last ne $dir) { + $last = $dir; + $dir = dirname($dir); + last if !$self->_is_under($dir, @under); + $dirs{$dir}++; + } + } + return(sort(keys(%dirs))); +} + +sub validate { + my ($self, $module, $remove) = @_; + $self= $self->new(default=>1) if !ref $self; + Carp::croak("$module is not installed") if (! exists($self->{$module})); + return($self->{$module}{packlist}->validate($remove)); +} + +sub packlist { + my ($self, $module) = @_; + $self= $self->new(default=>1) if !ref $self; + Carp::croak("$module is not installed") if (! exists($self->{$module})); + return($self->{$module}{packlist}); +} + +sub version { + my ($self, $module) = @_; + $self= $self->new(default=>1) if !ref $self; + Carp::croak("$module is not installed") if (! exists($self->{$module})); + return($self->{$module}{version}); +} + +sub debug_dump { + my ($self, $module) = @_; + $self= $self->new(default=>1) if !ref $self; + local $self->{":private:"}{Config}; + require Data::Dumper; + print Data::Dumper->new([$self])->Sortkeys(1)->Indent(1)->Dump(); +} + + +1; + +__END__ + +package ExtUtils::MM_MacOS; + +use strict; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +sub new { + die 'MacOS Classic (MacPerl) is no longer supported by MakeMaker'; +} + + +1; +#!./perl -w +package ExtUtils::Miniperl; +use strict; +require Exporter; +use ExtUtils::Embed 1.31, qw(xsi_header xsi_protos xsi_body); + +our @ISA = qw(Exporter); +our @EXPORT = qw(writemain); +our $VERSION = '1.08'; + +# blead will run this with miniperl, hence we can't use autodie or File::Temp +my $temp; + +END { + return if !defined $temp || !-e $temp; + unlink $temp or warn "Can't unlink '$temp': $!"; +} + +sub writemain{ + my ($fh, $real); + + if (ref $_[0] eq 'SCALAR') { + $real = ${+shift}; + $temp = $real; + $temp =~ s/(?:.c)?\z/.new/; + open $fh, '>', $temp + or die "Can't open '$temp' for writing: $!"; + } elsif (ref $_[0]) { + $fh = shift; + } else { + $fh = \*STDOUT; + } + + my(@exts) = @_; + + printf $fh <<'EOF!HEAD', xsi_header(); +/* miniperlmain.c or perlmain.c - a generated file + * + * Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, + * 2004, 2005, 2006, 2007, 2016 by Larry Wall and others + * + * You may distribute under the terms of either the GNU General Public + * License or the Artistic License, as specified in the README file. + * + */ + +/* + * The Road goes ever on and on + * Down from the door where it began. + * + * [Bilbo on p.35 of _The Lord of the Rings_, I/i: "A Long-Expected Party"] + * [Frodo on p.73 of _The Lord of the Rings_, I/iii: "Three Is Company"] + */ + +/* This file contains the main() function for the perl interpreter. + * Note that miniperlmain.c contains main() for the 'miniperl' binary, + * while perlmain.c contains main() for the 'perl' binary. The typical + * difference being that the latter includes Dynaloader. + * + * Miniperl is like perl except that it does not support dynamic loading, + * and in fact is used to build the dynamic modules needed for the 'real' + * perl executable. + * + * The content of the body of this generated file is mostly contained + * in Miniperl.pm - edit that file if you want to change anything. + * miniperlmain.c is generated by running regen/miniperlmain.pl.pl, while + * perlmain.c is built automatically by Makefile (so the former is + * included in the tarball while the latter isn't). + */ + +#ifdef OEMVS +#ifdef MYMALLOC +/* sbrk is limited to first heap segment so make it big */ +#pragma runopts(HEAP(8M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON)) +#else +#pragma runopts(HEAP(2M,500K,ANYWHERE,KEEP,8K,4K) STACK(,,ANY,) ALL31(ON)) +#endif +#endif + +#define PERL_IN_MINIPERLMAIN_C +%s +static void xs_init (pTHX); +static PerlInterpreter *my_perl; + +#if defined(PERL_GLOBAL_STRUCT_PRIVATE) +/* The static struct perl_vars* may seem counterproductive since the + * whole idea PERL_GLOBAL_STRUCT_PRIVATE was to avoid statics, but note + * that this static is not in the shared perl library, the globals PL_Vars + * and PL_VarsPtr will stay away. */ +static struct perl_vars* my_plvarsp; +struct perl_vars* Perl_GetVarsPrivate(void) { return my_plvarsp; } +#endif + +#ifdef NO_ENV_ARRAY_IN_MAIN +extern char **environ; +int +main(int argc, char **argv) +#else +int +main(int argc, char **argv, char **env) +#endif +{ + int exitstatus, i; +#ifdef PERL_GLOBAL_STRUCT + struct perl_vars *my_vars = init_global_struct(); +# ifdef PERL_GLOBAL_STRUCT_PRIVATE + int veto; + + my_plvarsp = my_vars; +# endif +#endif /* PERL_GLOBAL_STRUCT */ +#ifndef NO_ENV_ARRAY_IN_MAIN + PERL_UNUSED_ARG(env); +#endif +#ifndef PERL_USE_SAFE_PUTENV + PL_use_safe_putenv = FALSE; +#endif /* PERL_USE_SAFE_PUTENV */ + + /* if user wants control of gprof profiling off by default */ + /* noop unless Configure is given -Accflags=-DPERL_GPROF_CONTROL */ + PERL_GPROF_MONCONTROL(0); + +#ifdef NO_ENV_ARRAY_IN_MAIN + PERL_SYS_INIT3(&argc,&argv,&environ); +#else + PERL_SYS_INIT3(&argc,&argv,&env); +#endif + +#if defined(USE_ITHREADS) + /* XXX Ideally, this should really be happening in perl_alloc() or + * perl_construct() to keep libperl.a transparently fork()-safe. + * It is currently done here only because Apache/mod_perl have + * problems due to lack of a call to cancel pthread_atfork() + * handlers when shared objects that contain the handlers may + * be dlclose()d. This forces applications that embed perl to + * call PTHREAD_ATFORK() explicitly, but if and only if it hasn't + * been called at least once before in the current process. + * --GSAR 2001-07-20 */ + PTHREAD_ATFORK(Perl_atfork_lock, + Perl_atfork_unlock, + Perl_atfork_unlock); +#endif + + PERL_SYS_FPU_INIT; + + if (!PL_do_undump) { + my_perl = perl_alloc(); + if (!my_perl) + exit(1); + perl_construct(my_perl); + PL_perl_destruct_level = 0; + } + PL_exit_flags |= PERL_EXIT_DESTRUCT_END; + if (!perl_parse(my_perl, xs_init, argc, argv, (char **)NULL)) + perl_run(my_perl); + +#ifndef PERL_MICRO + /* Unregister our signal handler before destroying my_perl */ + for (i = 1; PL_sig_name[i]; i++) { + if (rsignal_state(PL_sig_num[i]) == (Sighandler_t) PL_csighandlerp) { + rsignal(PL_sig_num[i], (Sighandler_t) SIG_DFL); + } + } +#endif + + exitstatus = perl_destruct(my_perl); + + perl_free(my_perl); + +#if defined(USE_ENVIRON_ARRAY) && defined(PERL_TRACK_MEMPOOL) && !defined(NO_ENV_ARRAY_IN_MAIN) + /* + * The old environment may have been freed by perl_free() + * when PERL_TRACK_MEMPOOL is defined, but without having + * been restored by perl_destruct() before (this is only + * done if destruct_level > 0). + * + * It is important to have a valid environment for atexit() + * routines that are eventually called. + */ + environ = env; +#endif + + PERL_SYS_TERM(); + +#ifdef PERL_GLOBAL_STRUCT +# ifdef PERL_GLOBAL_STRUCT_PRIVATE + veto = my_plvarsp->Gveto_cleanup; +# endif + free_global_struct(my_vars); +# ifdef PERL_GLOBAL_STRUCT_PRIVATE + if (!veto) + my_plvarsp = NULL; + /* Remember, functions registered with atexit() can run after this point, + and may access "global" variables, and hence end up calling + Perl_GetVarsPrivate() */ +#endif +#endif /* PERL_GLOBAL_STRUCT */ + + exit(exitstatus); +} + +/* Register any extra external extensions */ + +EOF!HEAD + + print $fh xsi_protos(@exts), <<'EOT', xsi_body(@exts), "}\n"; + +static void +xs_init(pTHX) +{ +EOT + + if ($real) { + close $fh or die "Can't close '$temp': $!"; + rename $temp, $real or die "Can't rename '$temp' to '$real': $!"; + } +} + +1; +__END__ + + +# ex: set ts=8 sts=4 sw=4 et: +package ExtUtils::MM_DOS; + +use strict; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Any; +require ExtUtils::MM_Unix; +our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); + + + +sub os_flavor { + return('DOS'); +} + + +sub replace_manpage_separator { + my($self, $man) = @_; + + $man =~ s,/+,__,g; + return $man; +} + + +sub xs_static_lib_is_xs { + return 1; +} + + +1; +package ExtUtils::testlib; + +use strict; +use warnings; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +use Cwd; +use File::Spec; + +# So the tests can chdir around and not break @INC. +# We use getcwd() because otherwise rel2abs will blow up under taint +# mode pre-5.8. We detaint is so @INC won't be tainted. This is +# no worse, and probably better, than just shoving an untainted, +# relative "blib/lib" onto @INC. +my $cwd; +BEGIN { + ($cwd) = getcwd() =~ /(.*)/; +} +use lib map { File::Spec->rel2abs($_, $cwd) } qw(blib/arch blib/lib); +1; +__END__ + +package ExtUtils::ParseXS; +use strict; + +use 5.006001; +use Cwd; +use Config; +use Exporter 'import'; +use File::Basename; +use File::Spec; +use Symbol; + +our $VERSION; +BEGIN { + $VERSION = '3.39'; + require ExtUtils::ParseXS::Constants; ExtUtils::ParseXS::Constants->VERSION($VERSION); + require ExtUtils::ParseXS::CountLines; ExtUtils::ParseXS::CountLines->VERSION($VERSION); + require ExtUtils::ParseXS::Utilities; ExtUtils::ParseXS::Utilities->VERSION($VERSION); + require ExtUtils::ParseXS::Eval; ExtUtils::ParseXS::Eval->VERSION($VERSION); +} +$VERSION = eval $VERSION if $VERSION =~ /_/; + +use ExtUtils::ParseXS::Utilities qw( + standard_typemap_locations + trim_whitespace + C_string + valid_proto_string + process_typemaps + map_type + standard_XS_defs + assign_func_args + analyze_preprocessor_statements + set_cond + Warn + current_line_number + blurt + death + check_conditional_preprocessor_statements + escape_file_for_line_directive + report_typemap_failure +); + +our @EXPORT_OK = qw( + process_file + report_error_count +); + +############################## +# A number of "constants" + +our ($C_group_rex, $C_arg); +# Group in C (no support for comments or literals) +$C_group_rex = qr/ [({\[] + (?: (?> [^()\[\]{}]+ ) | (??{ $C_group_rex }) )* + [)}\]] /x; +# Chunk in C without comma at toplevel (no comments): +$C_arg = qr/ (?: (?> [^()\[\]{},"']+ ) + | (??{ $C_group_rex }) + | " (?: (?> [^\\"]+ ) + | \\. + )* " # String literal + | ' (?: (?> [^\\']+ ) | \\. )* ' # Char literal + )* /xs; + +# "impossible" keyword (multiple newline) +my $END = "!End!\n\n"; +# Match an XS Keyword +my $BLOCK_regexp = '\s*(' . $ExtUtils::ParseXS::Constants::XSKeywordsAlternation . "|$END)\\s*:"; + + + +sub new { + return bless {} => shift; +} + +our $Singleton = __PACKAGE__->new; + +sub process_file { + my $self; + # Allow for $package->process_file(%hash), $obj->process_file, and process_file() + if (@_ % 2) { + my $invocant = shift; + $self = ref($invocant) ? $invocant : $invocant->new; + } + else { + $self = $Singleton; + } + + my %options = @_; + $self->{ProtoUsed} = exists $options{prototypes}; + + # Set defaults. + my %args = ( + argtypes => 1, + csuffix => '.c', + except => 0, + hiertype => 0, + inout => 1, + linenumbers => 1, + optimize => 1, + output => \*STDOUT, + prototypes => 0, + typemap => [], + versioncheck => 1, + FH => Symbol::gensym(), + %options, + ); + $args{except} = $args{except} ? ' TRY' : ''; + + # Global Constants + + my ($Is_VMS, $SymSet); + if ($^O eq 'VMS') { + $Is_VMS = 1; + # Establish set of global symbols with max length 28, since xsubpp + # will later add the 'XS_' prefix. + require ExtUtils::XSSymSet; + $SymSet = ExtUtils::XSSymSet->new(28); + } + @{ $self->{XSStack} } = ({type => 'none'}); + $self->{InitFileCode} = [ @ExtUtils::ParseXS::Constants::InitFileCode ]; + $self->{Overload} = 0; # bool + $self->{errors} = 0; # count + $self->{Fallback} = '&PL_sv_undef'; + + # Most of the 1500 lines below uses these globals. We'll have to + # clean this up sometime, probably. For now, we just pull them out + # of %args. -Ken + + $self->{RetainCplusplusHierarchicalTypes} = $args{hiertype}; + $self->{WantPrototypes} = $args{prototypes}; + $self->{WantVersionChk} = $args{versioncheck}; + $self->{WantLineNumbers} = $args{linenumbers}; + $self->{IncludedFiles} = {}; + + die "Missing required parameter 'filename'" unless $args{filename}; + $self->{filepathname} = $args{filename}; + ($self->{dir}, $self->{filename}) = + (dirname($args{filename}), basename($args{filename})); + $self->{filepathname} =~ s/\\/\\\\/g; + $self->{IncludedFiles}->{$args{filename}}++; + + # Open the output file if given as a string. If they provide some + # other kind of reference, trust them that we can print to it. + if (not ref $args{output}) { + open my($fh), "> $args{output}" or die "Can't create $args{output}: $!"; + $args{outfile} = $args{output}; + $args{output} = $fh; + } + + # Really, we shouldn't have to chdir() or select() in the first + # place. For now, just save and restore. + my $orig_cwd = cwd(); + my $orig_fh = select(); + + chdir($self->{dir}); + my $pwd = cwd(); + my $csuffix = $args{csuffix}; + + if ($self->{WantLineNumbers}) { + my $cfile; + if ( $args{outfile} ) { + $cfile = $args{outfile}; + } + else { + $cfile = $args{filename}; + $cfile =~ s/\.xs$/$csuffix/i or $cfile .= $csuffix; + } + tie(*PSEUDO_STDOUT, 'ExtUtils::ParseXS::CountLines', $cfile, $args{output}); + select PSEUDO_STDOUT; + } + else { + select $args{output}; + } + + $self->{typemap} = process_typemaps( $args{typemap}, $pwd ); + + # Move more settings from parameters to object + foreach my $datum ( qw| argtypes except inout optimize | ) { + $self->{$datum} = $args{$datum}; + } + $self->{strip_c_func_prefix} = $args{s}; + + # Identify the version of xsubpp used + print <{filename}. Do not edit this file, edit $self->{filename} instead. + * + * ANY CHANGES MADE HERE WILL BE LOST! + * + */ + +EOM + + + print("#line 1 \"" . escape_file_for_line_directive($self->{filepathname}) . "\"\n") + if $self->{WantLineNumbers}; + + # Open the input file (using $self->{filename} which + # is a basename'd $args{filename} due to chdir above) + open($self->{FH}, '<', $self->{filename}) or die "cannot open $self->{filename}: $!\n"; + + FIRSTMODULE: + while (readline($self->{FH})) { + if (/^=/) { + my $podstartline = $.; + do { + if (/^=cut\s*$/) { + # We can't just write out a /* */ comment, as our embedded + # POD might itself be in a comment. We can't put a /**/ + # comment inside #if 0, as the C standard says that the source + # file is decomposed into preprocessing characters in the stage + # before preprocessing commands are executed. + # I don't want to leave the text as barewords, because the spec + # isn't clear whether macros are expanded before or after + # preprocessing commands are executed, and someone pathological + # may just have defined one of the 3 words as a macro that does + # something strange. Multiline strings are illegal in C, so + # the "" we write must be a string literal. And they aren't + # concatenated until 2 steps later, so we are safe. + # - Nicholas Clark + print("#if 0\n \"Skipped embedded POD.\"\n#endif\n"); + printf("#line %d \"%s\"\n", $. + 1, escape_file_for_line_directive($self->{filepathname})) + if $self->{WantLineNumbers}; + next FIRSTMODULE; + } + + } while (readline($self->{FH})); + # At this point $. is at end of file so die won't state the start + # of the problem, and as we haven't yet read any lines &death won't + # show the correct line in the message either. + die ("Error: Unterminated pod in $self->{filename}, line $podstartline\n") + unless $self->{lastline}; + } + last if ($self->{Package}, $self->{Prefix}) = + /^MODULE\s*=\s*[\w:]+(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/; + + print $_; + } + unless (defined $_) { + warn "Didn't find a 'MODULE ... PACKAGE ... PREFIX' line\n"; + exit 0; # Not a fatal error for the caller process + } + + print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n" if $self->{WantLineNumbers}; + + standard_XS_defs(); + + print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n" if $self->{WantLineNumbers}; + + $self->{lastline} = $_; + $self->{lastline_no} = $.; + + my $BootCode_ref = []; + my $XSS_work_idx = 0; + my $cpp_next_tmp = 'XSubPPtmpAAAA'; + PARAGRAPH: + while ($self->fetch_para()) { + my $outlist_ref = []; + # Print initial preprocessor statements and blank lines + while (@{ $self->{line} } && $self->{line}->[0] !~ /^[^\#]/) { + my $ln = shift(@{ $self->{line} }); + print $ln, "\n"; + next unless $ln =~ /^\#\s*((if)(?:n?def)?|elsif|else|endif)\b/; + my $statement = $+; + ( $self, $XSS_work_idx, $BootCode_ref ) = + analyze_preprocessor_statements( + $self, $statement, $XSS_work_idx, $BootCode_ref + ); + } + + next PARAGRAPH unless @{ $self->{line} }; + + if ($XSS_work_idx && !$self->{XSStack}->[$XSS_work_idx]{varname}) { + # We are inside an #if, but have not yet #defined its xsubpp variable. + print "#define $cpp_next_tmp 1\n\n"; + push(@{ $self->{InitFileCode} }, "#if $cpp_next_tmp\n"); + push(@{ $BootCode_ref }, "#if $cpp_next_tmp"); + $self->{XSStack}->[$XSS_work_idx]{varname} = $cpp_next_tmp++; + } + + $self->death( + "Code is not inside a function" + ." (maybe last function was ended by a blank line " + ." followed by a statement on column one?)") + if $self->{line}->[0] =~ /^\s/; + + # initialize info arrays + foreach my $member (qw(args_match var_types defaults arg_list + argtype_seen in_out lengthof)) + { + $self->{$member} = {}; + } + $self->{proto_arg} = []; + $self->{processing_arg_with_types} = 0; # bool + $self->{proto_in_this_xsub} = 0; # counter & bool + $self->{scope_in_this_xsub} = 0; # counter & bool + $self->{interface} = 0; # bool + $self->{interface_macro} = 'XSINTERFACE_FUNC'; + $self->{interface_macro_set} = 'XSINTERFACE_FUNC_SET'; + $self->{ProtoThisXSUB} = $self->{WantPrototypes}; # states 0 (none), 1 (yes), 2 (empty prototype) + $self->{ScopeThisXSUB} = 0; # bool + + my $xsreturn = 0; + + $_ = shift(@{ $self->{line} }); + while (my $kwd = $self->check_keyword("REQUIRE|PROTOTYPES|EXPORT_XSUB_SYMBOLS|FALLBACK|VERSIONCHECK|INCLUDE(?:_COMMAND)?|SCOPE")) { + my $method = $kwd . "_handler"; + $self->$method($_); + next PARAGRAPH unless @{ $self->{line} }; + $_ = shift(@{ $self->{line} }); + } + + if ($self->check_keyword("BOOT")) { + check_conditional_preprocessor_statements($self); + push (@{ $BootCode_ref }, "#line $self->{line_no}->[@{ $self->{line_no} } - @{ $self->{line} }] \"" + . escape_file_for_line_directive($self->{filepathname}) . "\"") + if $self->{WantLineNumbers} && $self->{line}->[0] !~ /^\s*#\s*line\b/; + push (@{ $BootCode_ref }, @{ $self->{line} }, ""); + next PARAGRAPH; + } + + # extract return type, function name and arguments + ($self->{ret_type}) = ExtUtils::Typemaps::tidy_type($_); + my $RETVAL_no_return = 1 if $self->{ret_type} =~ s/^NO_OUTPUT\s+//; + + # Allow one-line ANSI-like declaration + unshift @{ $self->{line} }, $2 + if $self->{argtypes} + and $self->{ret_type} =~ s/^(.*?\w.*?)\s*\b(\w+\s*\(.*)/$1/s; + + # a function definition needs at least 2 lines + $self->blurt("Error: Function definition too short '$self->{ret_type}'"), next PARAGRAPH + unless @{ $self->{line} }; + + my $externC = 1 if $self->{ret_type} =~ s/^extern "C"\s+//; + my $static = 1 if $self->{ret_type} =~ s/^static\s+//; + + my $func_header = shift(@{ $self->{line} }); + $self->blurt("Error: Cannot parse function definition from '$func_header'"), next PARAGRAPH + unless $func_header =~ /^(?:([\w:]*)::)?(\w+)\s*\(\s*(.*?)\s*\)\s*(const)?\s*(;\s*)?$/s; + + my ($class, $orig_args); + ($class, $self->{func_name}, $orig_args) = ($1, $2, $3); + $class = "$4 $class" if $4; + ($self->{pname} = $self->{func_name}) =~ s/^($self->{Prefix})?/$self->{Packprefix}/; + my $clean_func_name; + ($clean_func_name = $self->{func_name}) =~ s/^$self->{Prefix}//; + $self->{Full_func_name} = "$self->{Packid}_$clean_func_name"; + if ($Is_VMS) { + $self->{Full_func_name} = $SymSet->addsym( $self->{Full_func_name} ); + } + + # Check for duplicate function definition + for my $tmp (@{ $self->{XSStack} }) { + next unless defined $tmp->{functions}{ $self->{Full_func_name} }; + Warn( $self, "Warning: duplicate function definition '$clean_func_name' detected"); + last; + } + $self->{XSStack}->[$XSS_work_idx]{functions}{ $self->{Full_func_name} }++; + delete $self->{XsubAliases}; + delete $self->{XsubAliasValues}; + %{ $self->{Interfaces} } = (); + @{ $self->{Attributes} } = (); + $self->{DoSetMagic} = 1; + + $orig_args =~ s/\\\s*/ /g; # process line continuations + my @args; + + my (@fake_INPUT_pre); # For length(s) generated variables + my (@fake_INPUT); + my $only_C_inlist_ref = {}; # Not in the signature of Perl function + if ($self->{argtypes} and $orig_args =~ /\S/) { + my $args = "$orig_args ,"; + use re 'eval'; + if ($args =~ /^( (??{ $C_arg }) , )* $ /x) { + @args = ($args =~ /\G ( (??{ $C_arg }) ) , /xg); + no re 'eval'; + for ( @args ) { + s/^\s+//; + s/\s+$//; + my ($arg, $default) = ($_ =~ m/ ( [^=]* ) ( (?: = .* )? ) /x); + my ($pre, $len_name) = ($arg =~ /(.*?) \s* + \b ( \w+ | length\( \s*\w+\s* \) ) + \s* $ /x); + next unless defined($pre) && length($pre); + my $out_type = ''; + my $inout_var; + if ($self->{inout} and s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\b\s*//) { + my $type = $1; + $out_type = $type if $type ne 'IN'; + $arg =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\b\s*//; + $pre =~ s/^(IN|IN_OUTLIST|OUTLIST|OUT|IN_OUT)\b\s*//; + } + my $islength; + if ($len_name =~ /^length\( \s* (\w+) \s* \)\z/x) { + $len_name = "XSauto_length_of_$1"; + $islength = 1; + die "Default value on length() argument: '$_'" + if length $default; + } + if (length $pre or $islength) { # Has a type + if ($islength) { + push @fake_INPUT_pre, $arg; + } + else { + push @fake_INPUT, $arg; + } + # warn "pushing '$arg'\n"; + $self->{argtype_seen}->{$len_name}++; + $_ = "$len_name$default"; # Assigns to @args + } + $only_C_inlist_ref->{$_} = 1 if $out_type eq "OUTLIST" or $islength; + push @{ $outlist_ref }, $len_name if $out_type =~ /OUTLIST$/; + $self->{in_out}->{$len_name} = $out_type if $out_type; + } + } + else { + no re 'eval'; + @args = split(/\s*,\s*/, $orig_args); + Warn( $self, "Warning: cannot parse argument list '$orig_args', fallback to split"); + } + } + else { + @args = split(/\s*,\s*/, $orig_args); + for (@args) { + if ($self->{inout} and s/^(IN|IN_OUTLIST|OUTLIST|IN_OUT|OUT)\b\s*//) { + my $out_type = $1; + next if $out_type eq 'IN'; + $only_C_inlist_ref->{$_} = 1 if $out_type eq "OUTLIST"; + if ($out_type =~ /OUTLIST$/) { + push @{ $outlist_ref }, undef; + } + $self->{in_out}->{$_} = $out_type; + } + } + } + if (defined($class)) { + my $arg0 = ((defined($static) or $self->{func_name} eq 'new') + ? "CLASS" : "THIS"); + unshift(@args, $arg0); + } + my $extra_args = 0; + my @args_num = (); + my $num_args = 0; + my $report_args = ''; + my $ellipsis; + foreach my $i (0 .. $#args) { + if ($args[$i] =~ s/\.\.\.//) { + $ellipsis = 1; + if ($args[$i] eq '' && $i == $#args) { + $report_args .= ", ..."; + pop(@args); + last; + } + } + if ($only_C_inlist_ref->{$args[$i]}) { + push @args_num, undef; + } + else { + push @args_num, ++$num_args; + $report_args .= ", $args[$i]"; + } + if ($args[$i] =~ /^([^=]*[^\s=])\s*=\s*(.*)/s) { + $extra_args++; + $args[$i] = $1; + $self->{defaults}->{$args[$i]} = $2; + $self->{defaults}->{$args[$i]} =~ s/"/\\"/g; + } + $self->{proto_arg}->[$i+1] = '$'; + } + my $min_args = $num_args - $extra_args; + $report_args =~ s/"/\\"/g; + $report_args =~ s/^,\s+//; + $self->{func_args} = assign_func_args($self, \@args, $class); + @{ $self->{args_match} }{@args} = @args_num; + + my $PPCODE = grep(/^\s*PPCODE\s*:/, @{ $self->{line} }); + my $CODE = grep(/^\s*CODE\s*:/, @{ $self->{line} }); + # Detect CODE: blocks which use ST(n)= or XST_m*(n,v) + # to set explicit return values. + my $EXPLICIT_RETURN = ($CODE && + ("@{ $self->{line} }" =~ /(\bST\s*\([^;]*=) | (\bXST_m\w+\s*\()/x )); + + $self->{ALIAS} = grep(/^\s*ALIAS\s*:/, @{ $self->{line} }); + + my $INTERFACE = grep(/^\s*INTERFACE\s*:/, @{ $self->{line} }); + + $xsreturn = 1 if $EXPLICIT_RETURN; + + $externC = $externC ? qq[extern "C"] : ""; + + # print function header + print Q(<<"EOF"); +#$externC +#XS_EUPXS(XS_$self->{Full_func_name}); /* prototype to pass -Wmissing-prototypes */ +#XS_EUPXS(XS_$self->{Full_func_name}) +#[[ +# dVAR; dXSARGS; +EOF + print Q(<<"EOF") if $self->{ALIAS}; +# dXSI32; +EOF + print Q(<<"EOF") if $INTERFACE; +# dXSFUNCTION($self->{ret_type}); +EOF + + $self->{cond} = set_cond($ellipsis, $min_args, $num_args); + + print Q(<<"EOF") if $self->{except}; +# char errbuf[1024]; +# *errbuf = '\\0'; +EOF + + if($self->{cond}) { + print Q(<<"EOF"); +# if ($self->{cond}) +# croak_xs_usage(cv, "$report_args"); +EOF + } + else { + # cv and items likely to be unused + print Q(<<"EOF"); +# PERL_UNUSED_VAR(cv); /* -W */ +# PERL_UNUSED_VAR(items); /* -W */ +EOF + } + + #gcc -Wall: if an xsub has PPCODE is used + #it is possible none of ST, XSRETURN or XSprePUSH macros are used + #hence 'ax' (setup by dXSARGS) is unused + #XXX: could breakup the dXSARGS; into dSP;dMARK;dITEMS + #but such a move could break third-party extensions + print Q(<<"EOF") if $PPCODE; +# PERL_UNUSED_VAR(ax); /* -Wall */ +EOF + + print Q(<<"EOF") if $PPCODE; +# SP -= items; +EOF + + # Now do a block of some sort. + + $self->{condnum} = 0; + $self->{cond} = ''; # last CASE: conditional + push(@{ $self->{line} }, "$END:"); + push(@{ $self->{line_no} }, $self->{line_no}->[-1]); + $_ = ''; + check_conditional_preprocessor_statements(); + while (@{ $self->{line} }) { + + $self->CASE_handler($_) if $self->check_keyword("CASE"); + print Q(<<"EOF"); +# $self->{except} [[ +EOF + + # do initialization of input variables + $self->{thisdone} = 0; + $self->{retvaldone} = 0; + $self->{deferred} = ""; + %{ $self->{arg_list} } = (); + $self->{gotRETVAL} = 0; + $self->INPUT_handler($_); + $self->process_keyword("INPUT|PREINIT|INTERFACE_MACRO|C_ARGS|ALIAS|ATTRS|PROTOTYPE|SCOPE|OVERLOAD"); + + print Q(<<"EOF") if $self->{ScopeThisXSUB}; +# ENTER; +# [[ +EOF + + if (!$self->{thisdone} && defined($class)) { + if (defined($static) or $self->{func_name} eq 'new') { + print "\tchar *"; + $self->{var_types}->{"CLASS"} = "char *"; + $self->generate_init( { + type => "char *", + num => 1, + var => "CLASS", + printed_name => undef, + } ); + } + else { + print "\t" . map_type($self, "$class *"); + $self->{var_types}->{"THIS"} = "$class *"; + $self->generate_init( { + type => "$class *", + num => 1, + var => "THIS", + printed_name => undef, + } ); + } + } + + # These are set if OUTPUT is found and/or CODE using RETVAL + $self->{have_OUTPUT} = $self->{have_CODE_with_RETVAL} = 0; + + my ($wantRETVAL); + # do code + if (/^\s*NOT_IMPLEMENTED_YET/) { + print "\n\tPerl_croak(aTHX_ \"$self->{pname}: not implemented yet\");\n"; + $_ = ''; + } + else { + if ($self->{ret_type} ne "void") { + print "\t" . map_type($self, $self->{ret_type}, 'RETVAL') . ";\n" + if !$self->{retvaldone}; + $self->{args_match}->{"RETVAL"} = 0; + $self->{var_types}->{"RETVAL"} = $self->{ret_type}; + my $outputmap = $self->{typemap}->get_outputmap( ctype => $self->{ret_type} ); + print "\tdXSTARG;\n" + if $self->{optimize} and $outputmap and $outputmap->targetable; + } + + if (@fake_INPUT or @fake_INPUT_pre) { + unshift @{ $self->{line} }, @fake_INPUT_pre, @fake_INPUT, $_; + $_ = ""; + $self->{processing_arg_with_types} = 1; + $self->INPUT_handler($_); + } + print $self->{deferred}; + + $self->process_keyword("INIT|ALIAS|ATTRS|PROTOTYPE|INTERFACE_MACRO|INTERFACE|C_ARGS|OVERLOAD"); + + if ($self->check_keyword("PPCODE")) { + $self->print_section(); + $self->death("PPCODE must be last thing") if @{ $self->{line} }; + print "\tLEAVE;\n" if $self->{ScopeThisXSUB}; + print "\tPUTBACK;\n\treturn;\n"; + } + elsif ($self->check_keyword("CODE")) { + my $consumed_code = $self->print_section(); + if ($consumed_code =~ /\bRETVAL\b/) { + $self->{have_CODE_with_RETVAL} = 1; + } + } + elsif (defined($class) and $self->{func_name} eq "DESTROY") { + print "\n\t"; + print "delete THIS;\n"; + } + else { + print "\n\t"; + if ($self->{ret_type} ne "void") { + print "RETVAL = "; + $wantRETVAL = 1; + } + if (defined($static)) { + if ($self->{func_name} eq 'new') { + $self->{func_name} = "$class"; + } + else { + print "${class}::"; + } + } + elsif (defined($class)) { + if ($self->{func_name} eq 'new') { + $self->{func_name} .= " $class"; + } + else { + print "THIS->"; + } + } + my $strip = $self->{strip_c_func_prefix}; + $self->{func_name} =~ s/^\Q$strip// + if defined $strip; + $self->{func_name} = 'XSFUNCTION' if $self->{interface}; + print "$self->{func_name}($self->{func_args});\n"; + } + } + + # do output variables + $self->{gotRETVAL} = 0; # 1 if RETVAL seen in OUTPUT section; + undef $self->{RETVAL_code} ; # code to set RETVAL (from OUTPUT section); + # $wantRETVAL set if 'RETVAL =' autogenerated + ($wantRETVAL, $self->{ret_type}) = (0, 'void') if $RETVAL_no_return; + undef %{ $self->{outargs} }; + + $self->process_keyword("POSTCALL|OUTPUT|ALIAS|ATTRS|PROTOTYPE|OVERLOAD"); + + # A CODE section with RETVAL, but no OUTPUT? FAIL! + if ($self->{have_CODE_with_RETVAL} and not $self->{have_OUTPUT} and $self->{ret_type} ne 'void') { + $self->Warn("Warning: Found a 'CODE' section which seems to be using 'RETVAL' but no 'OUTPUT' section."); + } + + $self->generate_output( { + type => $self->{var_types}->{$_}, + num => $self->{args_match}->{$_}, + var => $_, + do_setmagic => $self->{DoSetMagic}, + do_push => undef, + } ) for grep $self->{in_out}->{$_} =~ /OUT$/, sort keys %{ $self->{in_out} }; + + my $prepush_done; + # all OUTPUT done, so now push the return value on the stack + if ($self->{gotRETVAL} && $self->{RETVAL_code}) { + print "\t$self->{RETVAL_code}\n"; + } + elsif ($self->{gotRETVAL} || $wantRETVAL) { + my $outputmap = $self->{typemap}->get_outputmap( ctype => $self->{ret_type} ); + my $trgt = $self->{optimize} && $outputmap && $outputmap->targetable; + my $var = 'RETVAL'; + my $type = $self->{ret_type}; + + if ($trgt) { + my $what = $self->eval_output_typemap_code( + qq("$trgt->{what}"), + {var => $var, type => $self->{ret_type}} + ); + if (not $trgt->{with_size} and $trgt->{type} eq 'p') { # sv_setpv + # PUSHp corresponds to sv_setpvn. Treat sv_setpv directly + print "\tsv_setpv(TARG, $what); XSprePUSH; PUSHTARG;\n"; + $prepush_done = 1; + } + else { + my $tsize = $trgt->{what_size}; + $tsize = '' unless defined $tsize; + $tsize = $self->eval_output_typemap_code( + qq("$tsize"), + {var => $var, type => $self->{ret_type}} + ); + print "\tXSprePUSH; PUSH$trgt->{type}($what$tsize);\n"; + $prepush_done = 1; + } + } + else { + # RETVAL almost never needs SvSETMAGIC() + $self->generate_output( { + type => $self->{ret_type}, + num => 0, + var => 'RETVAL', + do_setmagic => 0, + do_push => undef, + } ); + } + } + + $xsreturn = 1 if $self->{ret_type} ne "void"; + my $num = $xsreturn; + my $c = @{ $outlist_ref }; + print "\tXSprePUSH;" if $c and not $prepush_done; + print "\tEXTEND(SP,$c);\n" if $c; + $xsreturn += $c; + $self->generate_output( { + type => $self->{var_types}->{$_}, + num => $num++, + var => $_, + do_setmagic => 0, + do_push => 1, + } ) for @{ $outlist_ref }; + + # do cleanup + $self->process_keyword("CLEANUP|ALIAS|ATTRS|PROTOTYPE|OVERLOAD"); + + print Q(<<"EOF") if $self->{ScopeThisXSUB}; +# ]] +EOF + print Q(<<"EOF") if $self->{ScopeThisXSUB} and not $PPCODE; +# LEAVE; +EOF + + # print function trailer + print Q(<<"EOF"); +# ]] +EOF + print Q(<<"EOF") if $self->{except}; +# BEGHANDLERS +# CATCHALL +# sprintf(errbuf, "%s: %s\\tpropagated", Xname, Xreason); +# ENDHANDLERS +EOF + if ($self->check_keyword("CASE")) { + $self->blurt("Error: No 'CASE:' at top of function") + unless $self->{condnum}; + $_ = "CASE: $_"; # Restore CASE: label + next; + } + last if $_ eq "$END:"; + $self->death(/^$BLOCK_regexp/o ? "Misplaced '$1:'" : "Junk at end of function ($_)"); + } + + print Q(<<"EOF") if $self->{except}; +# if (errbuf[0]) +# Perl_croak(aTHX_ errbuf); +EOF + + if ($xsreturn) { + print Q(<<"EOF") unless $PPCODE; +# XSRETURN($xsreturn); +EOF + } + else { + print Q(<<"EOF") unless $PPCODE; +# XSRETURN_EMPTY; +EOF + } + + print Q(<<"EOF"); +#]] +# +EOF + + $self->{proto} = ""; + unless($self->{ProtoThisXSUB}) { + $self->{newXS} = "newXS_deffile"; + $self->{file} = ""; + } + else { + # Build the prototype string for the xsub + $self->{newXS} = "newXSproto_portable"; + $self->{file} = ", file"; + + if ($self->{ProtoThisXSUB} eq 2) { + # User has specified empty prototype + } + elsif ($self->{ProtoThisXSUB} eq 1) { + my $s = ';'; + if ($min_args < $num_args) { + $s = ''; + $self->{proto_arg}->[$min_args] .= ";"; + } + push @{ $self->{proto_arg} }, "$s\@" + if $ellipsis; + + $self->{proto} = join ("", grep defined, @{ $self->{proto_arg} } ); + } + else { + # User has specified a prototype + $self->{proto} = $self->{ProtoThisXSUB}; + } + $self->{proto} = qq{, "$self->{proto}"}; + } + + if ($self->{XsubAliases} and keys %{ $self->{XsubAliases} }) { + $self->{XsubAliases}->{ $self->{pname} } = 0 + unless defined $self->{XsubAliases}->{ $self->{pname} }; + foreach my $xname (sort keys %{ $self->{XsubAliases} }) { + my $value = $self->{XsubAliases}{$xname}; + push(@{ $self->{InitFileCode} }, Q(<<"EOF")); +# cv = $self->{newXS}(\"$xname\", XS_$self->{Full_func_name}$self->{file}$self->{proto}); +# XSANY.any_i32 = $value; +EOF + } + } + elsif (@{ $self->{Attributes} }) { + push(@{ $self->{InitFileCode} }, Q(<<"EOF")); +# cv = $self->{newXS}(\"$self->{pname}\", XS_$self->{Full_func_name}$self->{file}$self->{proto}); +# apply_attrs_string("$self->{Package}", cv, "@{ $self->{Attributes} }", 0); +EOF + } + elsif ($self->{interface}) { + foreach my $yname (sort keys %{ $self->{Interfaces} }) { + my $value = $self->{Interfaces}{$yname}; + $yname = "$self->{Package}\::$yname" unless $yname =~ /::/; + push(@{ $self->{InitFileCode} }, Q(<<"EOF")); +# cv = $self->{newXS}(\"$yname\", XS_$self->{Full_func_name}$self->{file}$self->{proto}); +# $self->{interface_macro_set}(cv,$value); +EOF + } + } + elsif($self->{newXS} eq 'newXS_deffile'){ # work around P5NCI's empty newXS macro + push(@{ $self->{InitFileCode} }, + " $self->{newXS}(\"$self->{pname}\", XS_$self->{Full_func_name}$self->{file}$self->{proto});\n"); + } + else { + push(@{ $self->{InitFileCode} }, + " (void)$self->{newXS}(\"$self->{pname}\", XS_$self->{Full_func_name}$self->{file}$self->{proto});\n"); + } + } # END 'PARAGRAPH' 'while' loop + + if ($self->{Overload}) { # make it findable with fetchmethod + print Q(<<"EOF"); +#XS_EUPXS(XS_$self->{Packid}_nil); /* prototype to pass -Wmissing-prototypes */ +#XS_EUPXS(XS_$self->{Packid}_nil) +#{ +# dXSARGS; +# PERL_UNUSED_VAR(items); +# XSRETURN_EMPTY; +#} +# +EOF + unshift(@{ $self->{InitFileCode} }, <<"MAKE_FETCHMETHOD_WORK"); + /* Making a sub named "$self->{Package}::()" allows the package */ + /* to be findable via fetchmethod(), and causes */ + /* overload::Overloaded("$self->{Package}") to return true. */ + (void)$self->{newXS}("$self->{Package}::()", XS_$self->{Packid}_nil$self->{file}$self->{proto}); +MAKE_FETCHMETHOD_WORK + } + + # print initialization routine + + print Q(<<"EOF"); +##ifdef __cplusplus +#extern "C" +##endif +EOF + + print Q(<<"EOF"); +#XS_EXTERNAL(boot_$self->{Module_cname}); /* prototype to pass -Wmissing-prototypes */ +#XS_EXTERNAL(boot_$self->{Module_cname}) +#[[ +##if PERL_VERSION_LE(5, 21, 5) +# dVAR; dXSARGS; +##else +# dVAR; ${\($self->{WantVersionChk} ? + 'dXSBOOTARGSXSAPIVERCHK;' : 'dXSBOOTARGSAPIVERCHK;')} +##endif +EOF + + #Under 5.8.x and lower, newXS is declared in proto.h as expecting a non-const + #file name argument. If the wrong qualifier is used, it causes breakage with + #C++ compilers and warnings with recent gcc. + #-Wall: if there is no $self->{Full_func_name} there are no xsubs in this .xs + #so 'file' is unused + print Q(<<"EOF") if $self->{Full_func_name}; +##if (PERL_REVISION == 5 && PERL_VERSION < 9) +# char* file = __FILE__; +##else +# const char* file = __FILE__; +##endif +# +# PERL_UNUSED_VAR(file); +EOF + + print Q("#\n"); + + print Q(<<"EOF"); +# PERL_UNUSED_VAR(cv); /* -W */ +# PERL_UNUSED_VAR(items); /* -W */ +EOF + + if( $self->{WantVersionChk}){ + print Q(<<"EOF") ; +##if PERL_VERSION_LE(5, 21, 5) +# XS_VERSION_BOOTCHECK; +## ifdef XS_APIVERSION_BOOTCHECK +# XS_APIVERSION_BOOTCHECK; +## endif +##endif + +EOF + } else { + print Q(<<"EOF") ; +##if PERL_VERSION_LE(5, 21, 5) && defined(XS_APIVERSION_BOOTCHECK) +# XS_APIVERSION_BOOTCHECK; +##endif + +EOF + } + + print Q(<<"EOF") if defined $self->{XsubAliases} or defined $self->{interfaces}; +# { +# CV * cv; +# +EOF + + print Q(<<"EOF") if ($self->{Overload}); +# /* register the overloading (type 'A') magic */ +##if (PERL_REVISION == 5 && PERL_VERSION < 9) +# PL_amagic_generation++; +##endif +# /* The magic for overload gets a GV* via gv_fetchmeth as */ +# /* mentioned above, and looks in the SV* slot of it for */ +# /* the "fallback" status. */ +# sv_setsv( +# get_sv( "$self->{Package}::()", TRUE ), +# $self->{Fallback} +# ); +EOF + + print @{ $self->{InitFileCode} }; + + print Q(<<"EOF") if defined $self->{XsubAliases} or defined $self->{interfaces}; +# } +EOF + + if (@{ $BootCode_ref }) { + print "\n /* Initialisation Section */\n\n"; + @{ $self->{line} } = @{ $BootCode_ref }; + $self->print_section(); + print "\n /* End of Initialisation Section */\n\n"; + } + + print Q(<<'EOF'); +##if PERL_VERSION_LE(5, 21, 5) +## if PERL_VERSION_GE(5, 9, 0) +# if (PL_unitcheckav) +# call_list(PL_scopestack_ix, PL_unitcheckav); +## endif +# XSRETURN_YES; +##else +# Perl_xs_boot_epilog(aTHX_ ax); +##endif +#]] +# +EOF + + warn("Please specify prototyping behavior for $self->{filename} (see perlxs manual)\n") + unless $self->{ProtoUsed}; + + chdir($orig_cwd); + select($orig_fh); + untie *PSEUDO_STDOUT if tied *PSEUDO_STDOUT; + close $self->{FH}; + + return 1; +} + +sub report_error_count { + if (@_) { + return $_[0]->{errors}||0; + } + else { + return $Singleton->{errors}||0; + } +} + +# Input: ($self, $_, @{ $self->{line} }) == unparsed input. +# Output: ($_, @{ $self->{line} }) == (rest of line, following lines). +# Return: the matched keyword if found, otherwise 0 +sub check_keyword { + my $self = shift; + $_ = shift(@{ $self->{line} }) while !/\S/ && @{ $self->{line} }; + s/^(\s*)($_[0])\s*:\s*(?:#.*)?/$1/s && $2; +} + +sub print_section { + my $self = shift; + + # the "do" is required for right semantics + do { $_ = shift(@{ $self->{line} }) } while !/\S/ && @{ $self->{line} }; + + my $consumed_code = ''; + + print("#line ", $self->{line_no}->[@{ $self->{line_no} } - @{ $self->{line} } -1], " \"", + escape_file_for_line_directive($self->{filepathname}), "\"\n") + if $self->{WantLineNumbers} && !/^\s*#\s*line\b/ && !/^#if XSubPPtmp/; + for (; defined($_) && !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + print "$_\n"; + $consumed_code .= "$_\n"; + } + print 'ExtUtils::ParseXS::CountLines'->end_marker, "\n" if $self->{WantLineNumbers}; + + return $consumed_code; +} + +sub merge_section { + my $self = shift; + my $in = ''; + + while (!/\S/ && @{ $self->{line} }) { + $_ = shift(@{ $self->{line} }); + } + + for (; defined($_) && !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + $in .= "$_\n"; + } + chomp $in; + return $in; +} + +sub process_keyword { + my($self, $pattern) = @_; + + while (my $kwd = $self->check_keyword($pattern)) { + my $method = $kwd . "_handler"; + $self->$method($_); + } +} + +sub CASE_handler { + my $self = shift; + $_ = shift; + $self->blurt("Error: 'CASE:' after unconditional 'CASE:'") + if $self->{condnum} && $self->{cond} eq ''; + $self->{cond} = $_; + trim_whitespace($self->{cond}); + print " ", ($self->{condnum}++ ? " else" : ""), ($self->{cond} ? " if ($self->{cond})\n" : "\n"); + $_ = ''; +} + +sub INPUT_handler { + my $self = shift; + $_ = shift; + for (; !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + last if /^\s*NOT_IMPLEMENTED_YET/; + next unless /\S/; # skip blank lines + + trim_whitespace($_); + my $ln = $_; + + # remove trailing semicolon if no initialisation + s/\s*;$//g unless /[=;+].*\S/; + + # Process the length(foo) declarations + if (s/^([^=]*)\blength\(\s*(\w+)\s*\)\s*$/$1 XSauto_length_of_$2=NO_INIT/x) { + print "\tSTRLEN\tSTRLEN_length_of_$2;\n"; + $self->{lengthof}->{$2} = undef; + $self->{deferred} .= "\n\tXSauto_length_of_$2 = STRLEN_length_of_$2;\n"; + } + + # check for optional initialisation code + my $var_init = ''; + $var_init = $1 if s/\s*([=;+].*)$//s; + $var_init =~ s/"/\\"/g; + # *sigh* It's valid to supply explicit input typemaps in the argument list... + my $is_overridden_typemap = $var_init =~ /ST\s*\(|\$arg\b/; + + s/\s+/ /g; + my ($var_type, $var_addr, $var_name) = /^(.*?[^&\s])\s*(\&?)\s*\b(\w+)$/s + or $self->blurt("Error: invalid argument declaration '$ln'"), next; + + # Check for duplicate definitions + $self->blurt("Error: duplicate definition of argument '$var_name' ignored"), next + if $self->{arg_list}->{$var_name}++ + or defined $self->{argtype_seen}->{$var_name} and not $self->{processing_arg_with_types}; + + $self->{thisdone} |= $var_name eq "THIS"; + $self->{retvaldone} |= $var_name eq "RETVAL"; + $self->{var_types}->{$var_name} = $var_type; + # XXXX This check is a safeguard against the unfinished conversion of + # generate_init(). When generate_init() is fixed, + # one can use 2-args map_type() unconditionally. + my $printed_name; + if ($var_type =~ / \( \s* \* \s* \) /x) { + # Function pointers are not yet supported with output_init()! + print "\t" . map_type($self, $var_type, $var_name); + $printed_name = 1; + } + else { + print "\t" . map_type($self, $var_type, undef); + $printed_name = 0; + } + $self->{var_num} = $self->{args_match}->{$var_name}; + + if ($self->{var_num}) { + my $typemap = $self->{typemap}->get_typemap(ctype => $var_type); + $self->report_typemap_failure($self->{typemap}, $var_type, "death") + if not $typemap and not $is_overridden_typemap; + $self->{proto_arg}->[$self->{var_num}] = ($typemap && $typemap->proto) || "\$"; + } + $self->{func_args} =~ s/\b($var_name)\b/&$1/ if $var_addr; + if ($var_init =~ /^[=;]\s*NO_INIT\s*;?\s*$/ + or $self->{in_out}->{$var_name} and $self->{in_out}->{$var_name} =~ /^OUT/ + and $var_init !~ /\S/) { + if ($printed_name) { + print ";\n"; + } + else { + print "\t$var_name;\n"; + } + } + elsif ($var_init =~ /\S/) { + $self->output_init( { + type => $var_type, + num => $self->{var_num}, + var => $var_name, + init => $var_init, + printed_name => $printed_name, + } ); + } + elsif ($self->{var_num}) { + $self->generate_init( { + type => $var_type, + num => $self->{var_num}, + var => $var_name, + printed_name => $printed_name, + } ); + } + else { + print ";\n"; + } + } +} + +sub OUTPUT_handler { + my $self = shift; + $self->{have_OUTPUT} = 1; + + $_ = shift; + for (; !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + next unless /\S/; + if (/^\s*SETMAGIC\s*:\s*(ENABLE|DISABLE)\s*/) { + $self->{DoSetMagic} = ($1 eq "ENABLE" ? 1 : 0); + next; + } + my ($outarg, $outcode) = /^\s*(\S+)\s*(.*?)\s*$/s; + $self->blurt("Error: duplicate OUTPUT argument '$outarg' ignored"), next + if $self->{outargs}->{$outarg}++; + if (!$self->{gotRETVAL} and $outarg eq 'RETVAL') { + # deal with RETVAL last + $self->{RETVAL_code} = $outcode; + $self->{gotRETVAL} = 1; + next; + } + $self->blurt("Error: OUTPUT $outarg not an argument"), next + unless defined($self->{args_match}->{$outarg}); + $self->blurt("Error: No input definition for OUTPUT argument '$outarg' - ignored"), next + unless defined $self->{var_types}->{$outarg}; + $self->{var_num} = $self->{args_match}->{$outarg}; + if ($outcode) { + print "\t$outcode\n"; + print "\tSvSETMAGIC(ST(" , $self->{var_num} - 1 , "));\n" if $self->{DoSetMagic}; + } + else { + $self->generate_output( { + type => $self->{var_types}->{$outarg}, + num => $self->{var_num}, + var => $outarg, + do_setmagic => $self->{DoSetMagic}, + do_push => undef, + } ); + } + delete $self->{in_out}->{$outarg} # No need to auto-OUTPUT + if exists $self->{in_out}->{$outarg} and $self->{in_out}->{$outarg} =~ /OUT$/; + } +} + +sub C_ARGS_handler { + my $self = shift; + $_ = shift; + my $in = $self->merge_section(); + + trim_whitespace($in); + $self->{func_args} = $in; +} + +sub INTERFACE_MACRO_handler { + my $self = shift; + $_ = shift; + my $in = $self->merge_section(); + + trim_whitespace($in); + if ($in =~ /\s/) { # two + ($self->{interface_macro}, $self->{interface_macro_set}) = split ' ', $in; + } + else { + $self->{interface_macro} = $in; + $self->{interface_macro_set} = 'UNKNOWN_CVT'; # catch later + } + $self->{interface} = 1; # local + $self->{interfaces} = 1; # global +} + +sub INTERFACE_handler { + my $self = shift; + $_ = shift; + my $in = $self->merge_section(); + + trim_whitespace($in); + + foreach (split /[\s,]+/, $in) { + my $iface_name = $_; + $iface_name =~ s/^$self->{Prefix}//; + $self->{Interfaces}->{$iface_name} = $_; + } + print Q(<<"EOF"); +# XSFUNCTION = $self->{interface_macro}($self->{ret_type},cv,XSANY.any_dptr); +EOF + $self->{interface} = 1; # local + $self->{interfaces} = 1; # global +} + +sub CLEANUP_handler { + my $self = shift; + $self->print_section(); +} + +sub PREINIT_handler { + my $self = shift; + $self->print_section(); +} + +sub POSTCALL_handler { + my $self = shift; + $self->print_section(); +} + +sub INIT_handler { + my $self = shift; + $self->print_section(); +} + +sub get_aliases { + my $self = shift; + my ($line) = @_; + my ($orig) = $line; + + # Parse alias definitions + # format is + # alias = value alias = value ... + + while ($line =~ s/^\s*([\w:]+)\s*=\s*(\w+)\s*//) { + my ($alias, $value) = ($1, $2); + my $orig_alias = $alias; + + # check for optional package definition in the alias + $alias = $self->{Packprefix} . $alias if $alias !~ /::/; + + # check for duplicate alias name & duplicate value + Warn( $self, "Warning: Ignoring duplicate alias '$orig_alias'") + if defined $self->{XsubAliases}->{$alias}; + + Warn( $self, "Warning: Aliases '$orig_alias' and '$self->{XsubAliasValues}->{$value}' have identical values") + if $self->{XsubAliasValues}->{$value}; + + $self->{XsubAliases}->{$alias} = $value; + $self->{XsubAliasValues}->{$value} = $orig_alias; + } + + blurt( $self, "Error: Cannot parse ALIAS definitions from '$orig'") + if $line; +} + +sub ATTRS_handler { + my $self = shift; + $_ = shift; + + for (; !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + next unless /\S/; + trim_whitespace($_); + push @{ $self->{Attributes} }, $_; + } +} + +sub ALIAS_handler { + my $self = shift; + $_ = shift; + + for (; !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + next unless /\S/; + trim_whitespace($_); + $self->get_aliases($_) if $_; + } +} + +sub OVERLOAD_handler { + my $self = shift; + $_ = shift; + + for (; !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + next unless /\S/; + trim_whitespace($_); + while ( s/^\s*([\w:"\\)\+\-\*\/\%\<\>\.\&\|\^\!\~\{\}\=]+)\s*//) { + $self->{Overload} = 1 unless $self->{Overload}; + my $overload = "$self->{Package}\::(".$1; + push(@{ $self->{InitFileCode} }, + " (void)$self->{newXS}(\"$overload\", XS_$self->{Full_func_name}$self->{file}$self->{proto});\n"); + } + } +} + +sub FALLBACK_handler { + my ($self, $setting) = @_; + + # the rest of the current line should contain either TRUE, + # FALSE or UNDEF + + trim_whitespace($setting); + $setting = uc($setting); + + my %map = ( + TRUE => "&PL_sv_yes", 1 => "&PL_sv_yes", + FALSE => "&PL_sv_no", 0 => "&PL_sv_no", + UNDEF => "&PL_sv_undef", + ); + + # check for valid FALLBACK value + $self->death("Error: FALLBACK: TRUE/FALSE/UNDEF") unless exists $map{$setting}; + + $self->{Fallback} = $map{$setting}; +} + + +sub REQUIRE_handler { + # the rest of the current line should contain a version number + my ($self, $ver) = @_; + + trim_whitespace($ver); + + $self->death("Error: REQUIRE expects a version number") + unless $ver; + + # check that the version number is of the form n.n + $self->death("Error: REQUIRE: expected a number, got '$ver'") + unless $ver =~ /^\d+(\.\d*)?/; + + $self->death("Error: xsubpp $ver (or better) required--this is only $VERSION.") + unless $VERSION >= $ver; +} + +sub VERSIONCHECK_handler { + # the rest of the current line should contain either ENABLE or + # DISABLE + my ($self, $setting) = @_; + + trim_whitespace($setting); + + # check for ENABLE/DISABLE + $self->death("Error: VERSIONCHECK: ENABLE/DISABLE") + unless $setting =~ /^(ENABLE|DISABLE)/i; + + $self->{WantVersionChk} = 1 if $1 eq 'ENABLE'; + $self->{WantVersionChk} = 0 if $1 eq 'DISABLE'; + +} + +sub PROTOTYPE_handler { + my $self = shift; + $_ = shift; + + my $specified; + + $self->death("Error: Only 1 PROTOTYPE definition allowed per xsub") + if $self->{proto_in_this_xsub}++; + + for (; !/^$BLOCK_regexp/o; $_ = shift(@{ $self->{line} })) { + next unless /\S/; + $specified = 1; + trim_whitespace($_); + if ($_ eq 'DISABLE') { + $self->{ProtoThisXSUB} = 0; + } + elsif ($_ eq 'ENABLE') { + $self->{ProtoThisXSUB} = 1; + } + else { + # remove any whitespace + s/\s+//g; + $self->death("Error: Invalid prototype '$_'") + unless valid_proto_string($_); + $self->{ProtoThisXSUB} = C_string($_); + } + } + + # If no prototype specified, then assume empty prototype "" + $self->{ProtoThisXSUB} = 2 unless $specified; + + $self->{ProtoUsed} = 1; +} + +sub SCOPE_handler { + # Rest of line should be either ENABLE or DISABLE + my ($self, $setting) = @_; + + $self->death("Error: Only 1 SCOPE declaration allowed per xsub") + if $self->{scope_in_this_xsub}++; + + trim_whitespace($setting); + $self->death("Error: SCOPE: ENABLE/DISABLE") + unless $setting =~ /^(ENABLE|DISABLE)\b/i; + $self->{ScopeThisXSUB} = ( uc($1) eq 'ENABLE' ); +} + +sub PROTOTYPES_handler { + # the rest of the current line should contain either ENABLE or + # DISABLE + my ($self, $setting) = @_; + + trim_whitespace($setting); + + # check for ENABLE/DISABLE + $self->death("Error: PROTOTYPES: ENABLE/DISABLE") + unless $setting =~ /^(ENABLE|DISABLE)/i; + + $self->{WantPrototypes} = 1 if $1 eq 'ENABLE'; + $self->{WantPrototypes} = 0 if $1 eq 'DISABLE'; + $self->{ProtoUsed} = 1; +} + +sub EXPORT_XSUB_SYMBOLS_handler { + # the rest of the current line should contain either ENABLE or + # DISABLE + my ($self, $setting) = @_; + + trim_whitespace($setting); + + # check for ENABLE/DISABLE + $self->death("Error: EXPORT_XSUB_SYMBOLS: ENABLE/DISABLE") + unless $setting =~ /^(ENABLE|DISABLE)/i; + + my $xs_impl = $1 eq 'ENABLE' ? 'XS_EXTERNAL' : 'XS_INTERNAL'; + + print Q(<<"EOF"); +##undef XS_EUPXS +##if defined(PERL_EUPXS_ALWAYS_EXPORT) +## define XS_EUPXS(name) XS_EXTERNAL(name) +##elif defined(PERL_EUPXS_NEVER_EXPORT) +## define XS_EUPXS(name) XS_INTERNAL(name) +##else +## define XS_EUPXS(name) $xs_impl(name) +##endif +EOF +} + + +sub PushXSStack { + my $self = shift; + my %args = @_; + # Save the current file context. + push(@{ $self->{XSStack} }, { + type => 'file', + LastLine => $self->{lastline}, + LastLineNo => $self->{lastline_no}, + Line => $self->{line}, + LineNo => $self->{line_no}, + Filename => $self->{filename}, + Filepathname => $self->{filepathname}, + Handle => $self->{FH}, + IsPipe => scalar($self->{filename} =~ /\|\s*$/), + %args, + }); + +} + +sub INCLUDE_handler { + my $self = shift; + $_ = shift; + # the rest of the current line should contain a valid filename + + trim_whitespace($_); + + $self->death("INCLUDE: filename missing") + unless $_; + + $self->death("INCLUDE: output pipe is illegal") + if /^\s*\|/; + + # simple minded recursion detector + $self->death("INCLUDE loop detected") + if $self->{IncludedFiles}->{$_}; + + ++$self->{IncludedFiles}->{$_} unless /\|\s*$/; + + if (/\|\s*$/ && /^\s*perl\s/) { + Warn( $self, "The INCLUDE directive with a command is discouraged." . + " Use INCLUDE_COMMAND instead! In particular using 'perl'" . + " in an 'INCLUDE: ... |' directive is not guaranteed to pick" . + " up the correct perl. The INCLUDE_COMMAND directive allows" . + " the use of \$^X as the currently running perl, see" . + " 'perldoc perlxs' for details."); + } + + $self->PushXSStack(); + + $self->{FH} = Symbol::gensym(); + + # open the new file + open($self->{FH}, $_) or $self->death("Cannot open '$_': $!"); + + print Q(<<"EOF"); +# +#/* INCLUDE: Including '$_' from '$self->{filename}' */ +# +EOF + + $self->{filename} = $_; + $self->{filepathname} = ( $^O =~ /^mswin/i ) + ? qq($self->{dir}/$self->{filename}) # See CPAN RT #61908: gcc doesn't like backslashes on win32? + : File::Spec->catfile($self->{dir}, $self->{filename}); + + # Prime the pump by reading the first + # non-blank line + + # skip leading blank lines + while (readline($self->{FH})) { + last unless /^\s*$/; + } + + $self->{lastline} = $_; + $self->{lastline_no} = $.; +} + +sub QuoteArgs { + my $cmd = shift; + my @args = split /\s+/, $cmd; + $cmd = shift @args; + for (@args) { + $_ = q(").$_.q(") if !/^\"/ && length($_) > 0; + } + return join (' ', ($cmd, @args)); +} + +# code copied from CPAN::HandleConfig::safe_quote +# - that has doc saying leave if start/finish with same quote, but no code +# given text, will conditionally quote it to protect from shell +{ + my ($quote, $use_quote) = $^O eq 'MSWin32' + ? (q{"}, q{"}) + : (q{"'}, q{'}); + sub _safe_quote { + my ($self, $command) = @_; + # Set up quote/default quote + if (defined($command) + and $command =~ /\s/ + and $command !~ /[$quote]/) { + return qq{$use_quote$command$use_quote} + } + return $command; + } +} + +sub INCLUDE_COMMAND_handler { + my $self = shift; + $_ = shift; + # the rest of the current line should contain a valid command + + trim_whitespace($_); + + $_ = QuoteArgs($_) if $^O eq 'VMS'; + + $self->death("INCLUDE_COMMAND: command missing") + unless $_; + + $self->death("INCLUDE_COMMAND: pipes are illegal") + if /^\s*\|/ or /\|\s*$/; + + $self->PushXSStack( IsPipe => 1 ); + + $self->{FH} = Symbol::gensym(); + + # If $^X is used in INCLUDE_COMMAND, we know it's supposed to be + # the same perl interpreter as we're currently running + my $X = $self->_safe_quote($^X); # quotes if has spaces + s/^\s*\$\^X/$X/; + + # open the new file + open ($self->{FH}, "-|", $_) + or $self->death( $self, "Cannot run command '$_' to include its output: $!"); + + print Q(<<"EOF"); +# +#/* INCLUDE_COMMAND: Including output of '$_' from '$self->{filename}' */ +# +EOF + + $self->{filename} = $_; + $self->{filepathname} = $self->{filename}; + #$self->{filepathname} =~ s/\"/\\"/g; # Fails? See CPAN RT #53938: MinGW Broken after 2.21 + $self->{filepathname} =~ s/\\/\\\\/g; # Works according to reporter of #53938 + + # Prime the pump by reading the first + # non-blank line + + # skip leading blank lines + while (readline($self->{FH})) { + last unless /^\s*$/; + } + + $self->{lastline} = $_; + $self->{lastline_no} = $.; +} + +sub PopFile { + my $self = shift; + + return 0 unless $self->{XSStack}->[-1]{type} eq 'file'; + + my $data = pop @{ $self->{XSStack} }; + my $ThisFile = $self->{filename}; + my $isPipe = $data->{IsPipe}; + + --$self->{IncludedFiles}->{$self->{filename}} + unless $isPipe; + + close $self->{FH}; + + $self->{FH} = $data->{Handle}; + # $filename is the leafname, which for some reason is used for diagnostic + # messages, whereas $filepathname is the full pathname, and is used for + # #line directives. + $self->{filename} = $data->{Filename}; + $self->{filepathname} = $data->{Filepathname}; + $self->{lastline} = $data->{LastLine}; + $self->{lastline_no} = $data->{LastLineNo}; + @{ $self->{line} } = @{ $data->{Line} }; + @{ $self->{line_no} } = @{ $data->{LineNo} }; + + if ($isPipe and $? ) { + --$self->{lastline_no}; + print STDERR "Error reading from pipe '$ThisFile': $! in $self->{filename}, line $self->{lastline_no}\n" ; + exit 1; + } + + print Q(<<"EOF"); +# +#/* INCLUDE: Returning to '$self->{filename}' from '$ThisFile' */ +# +EOF + + return 1; +} + +sub Q { + my($text) = @_; + $text =~ s/^#//gm; + $text =~ s/\[\[/{/g; + $text =~ s/\]\]/}/g; + $text; +} + +# Process "MODULE = Foo ..." lines and update global state accordingly +sub _process_module_xs_line { + my ($self, $module, $pkg, $prefix) = @_; + + ($self->{Module_cname} = $module) =~ s/\W/_/g; + + $self->{Package} = defined($pkg) ? $pkg : ''; + $self->{Prefix} = quotemeta( defined($prefix) ? $prefix : '' ); + + ($self->{Packid} = $self->{Package}) =~ tr/:/_/; + + $self->{Packprefix} = $self->{Package}; + $self->{Packprefix} .= "::" if $self->{Packprefix} ne ""; + + $self->{lastline} = ""; +} + +# Skip any embedded POD sections +sub _maybe_skip_pod { + my ($self) = @_; + + while ($self->{lastline} =~ /^=/) { + while ($self->{lastline} = readline($self->{FH})) { + last if ($self->{lastline} =~ /^=cut\s*$/); + } + $self->death("Error: Unterminated pod") unless defined $self->{lastline}; + $self->{lastline} = readline($self->{FH}); + chomp $self->{lastline}; + $self->{lastline} =~ s/^\s+$//; + } +} + +# This chunk of code strips out (and parses) embedded TYPEMAP blocks +# which support a HEREdoc-alike block syntax. +sub _maybe_parse_typemap_block { + my ($self) = @_; + + # This is special cased from the usual paragraph-handler logic + # due to the HEREdoc-ish syntax. + if ($self->{lastline} =~ /^TYPEMAP\s*:\s*<<\s*(?:(["'])(.+?)\1|([^\s'"]+?))\s*;?\s*$/) + { + my $end_marker = quotemeta(defined($1) ? $2 : $3); + + # Scan until we find $end_marker alone on a line. + my @tmaplines; + while (1) { + $self->{lastline} = readline($self->{FH}); + $self->death("Error: Unterminated TYPEMAP section") if not defined $self->{lastline}; + last if $self->{lastline} =~ /^$end_marker\s*$/; + push @tmaplines, $self->{lastline}; + } + + my $tmap = ExtUtils::Typemaps->new( + string => join("", @tmaplines), + lineno_offset => 1 + ($self->current_line_number() || 0), + fake_filename => $self->{filename}, + ); + $self->{typemap}->merge(typemap => $tmap, replace => 1); + + $self->{lastline} = ""; + } +} + +# Read next xsub into @{ $self->{line} } from ($lastline, readline($self->{FH})). +sub fetch_para { + my $self = shift; + + # parse paragraph + $self->death("Error: Unterminated '#if/#ifdef/#ifndef'") + if !defined $self->{lastline} && $self->{XSStack}->[-1]{type} eq 'if'; + @{ $self->{line} } = (); + @{ $self->{line_no} } = (); + return $self->PopFile() if not defined $self->{lastline}; # EOF + + if ($self->{lastline} =~ + /^MODULE\s*=\s*([\w:]+)(?:\s+PACKAGE\s*=\s*([\w:]+))?(?:\s+PREFIX\s*=\s*(\S+))?\s*$/) + { + $self->_process_module_xs_line($1, $2, $3); + } + + for (;;) { + $self->_maybe_skip_pod; + + $self->_maybe_parse_typemap_block; + + if ($self->{lastline} !~ /^\s*#/ # not a CPP directive + # CPP directives: + # ANSI: if ifdef ifndef elif else endif define undef + # line error pragma + # gcc: warning include_next + # obj-c: import + # others: ident (gcc notes that some cpps have this one) + || $self->{lastline} =~ /^\#[ \t]* + (?: + (?:if|ifn?def|elif|else|endif| + define|undef|pragma|error| + warning|line\s+\d+|ident) + \b + | (?:include(?:_next)?|import) + \s* ["<] .* [>"] + ) + /x + ) + { + last if $self->{lastline} =~ /^\S/ && @{ $self->{line} } && $self->{line}->[-1] eq ""; + push(@{ $self->{line} }, $self->{lastline}); + push(@{ $self->{line_no} }, $self->{lastline_no}); + } + + # Read next line and continuation lines + last unless defined($self->{lastline} = readline($self->{FH})); + $self->{lastline_no} = $.; + my $tmp_line; + $self->{lastline} .= $tmp_line + while ($self->{lastline} =~ /\\$/ && defined($tmp_line = readline($self->{FH}))); + + chomp $self->{lastline}; + $self->{lastline} =~ s/^\s+$//; + } + + # Nuke trailing "line" entries until there's one that's not empty + pop(@{ $self->{line} }), pop(@{ $self->{line_no} }) + while @{ $self->{line} } && $self->{line}->[-1] eq ""; + + return 1; +} + +sub output_init { + my $self = shift; + my $argsref = shift; + + my ($type, $num, $var, $init, $printed_name) + = @{$argsref}{qw(type num var init printed_name)}; + + # local assign for efficiently passing in to eval_input_typemap_code + local $argsref->{arg} = $num + ? "ST(" . ($num-1) . ")" + : "/* not a parameter */"; + + if ( $init =~ /^=/ ) { + if ($printed_name) { + $self->eval_input_typemap_code(qq/print " $init\\n"/, $argsref); + } + else { + $self->eval_input_typemap_code(qq/print "\\t$var $init\\n"/, $argsref); + } + } + else { + if ( $init =~ s/^\+// && $num ) { + $self->generate_init( { + type => $type, + num => $num, + var => $var, + printed_name => $printed_name, + } ); + } + elsif ($printed_name) { + print ";\n"; + $init =~ s/^;//; + } + else { + $self->eval_input_typemap_code(qq/print "\\t$var;\\n"/, $argsref); + $init =~ s/^;//; + } + $self->{deferred} + .= $self->eval_input_typemap_code(qq/"\\n\\t$init\\n"/, $argsref); + } +} + +sub generate_init { + my $self = shift; + my $argsref = shift; + + my ($type, $num, $var, $printed_name) + = @{$argsref}{qw(type num var printed_name)}; + + my $argoff = $num - 1; + my $arg = "ST($argoff)"; + + my $typemaps = $self->{typemap}; + + $type = ExtUtils::Typemaps::tidy_type($type); + if (not $typemaps->get_typemap(ctype => $type)) { + $self->report_typemap_failure($typemaps, $type); + return; + } + + (my $ntype = $type) =~ s/\s*\*/Ptr/g; + (my $subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//; + + my $typem = $typemaps->get_typemap(ctype => $type); + my $xstype = $typem->xstype; + #this is an optimization from perl 5.0 alpha 6, class check is skipped + #T_REF_IV_REF is missing since it has no untyped analog at the moment + $xstype =~ s/OBJ$/REF/ || $xstype =~ s/^T_REF_IV_PTR$/T_PTRREF/ + if $self->{func_name} =~ /DESTROY$/; + if ($xstype eq 'T_PV' and exists $self->{lengthof}->{$var}) { + print "\t$var" unless $printed_name; + print " = ($type)SvPV($arg, STRLEN_length_of_$var);\n"; + die "default value not supported with length(NAME) supplied" + if defined $self->{defaults}->{$var}; + return; + } + $type =~ tr/:/_/ unless $self->{RetainCplusplusHierarchicalTypes}; + + my $inputmap = $typemaps->get_inputmap(xstype => $xstype); + if (not defined $inputmap) { + $self->blurt("Error: No INPUT definition for type '$type', typekind '" . $type->xstype . "' found"); + return; + } + + my $expr = $inputmap->cleaned_code; + # Note: This gruesome bit either needs heavy rethinking or documentation. I vote for the former. --Steffen + if ($expr =~ /DO_ARRAY_ELEM/) { + my $subtypemap = $typemaps->get_typemap(ctype => $subtype); + if (not $subtypemap) { + $self->report_typemap_failure($typemaps, $subtype); + return; + } + + my $subinputmap = $typemaps->get_inputmap(xstype => $subtypemap->xstype); + if (not $subinputmap) { + $self->blurt("Error: No INPUT definition for type '$subtype', typekind '" . $subtypemap->xstype . "' found"); + return; + } + + my $subexpr = $subinputmap->cleaned_code; + $subexpr =~ s/\$type/\$subtype/g; + $subexpr =~ s/ntype/subtype/g; + $subexpr =~ s/\$arg/ST(ix_$var)/g; + $subexpr =~ s/\n\t/\n\t\t/g; + $subexpr =~ s/is not of (.*\")/[arg %d] is not of $1, ix_$var + 1/g; + $subexpr =~ s/\$var/${var}\[ix_$var - $argoff]/; + $expr =~ s/DO_ARRAY_ELEM/$subexpr/; + } + if ($expr =~ m#/\*.*scope.*\*/#i) { # "scope" in C comments + $self->{ScopeThisXSUB} = 1; + } + + my $eval_vars = { + var => $var, + printed_name => $printed_name, + type => $type, + ntype => $ntype, + subtype => $subtype, + num => $num, + arg => $arg, + argoff => $argoff, + }; + + if (defined($self->{defaults}->{$var})) { + $expr =~ s/(\t+)/$1 /g; + $expr =~ s/ /\t/g; + if ($printed_name) { + print ";\n"; + } + else { + $self->eval_input_typemap_code(qq/print "\\t$var;\\n"/, $eval_vars); + } + if ($self->{defaults}->{$var} eq 'NO_INIT') { + $self->{deferred} .= $self->eval_input_typemap_code( + qq/"\\n\\tif (items >= $num) {\\n$expr;\\n\\t}\\n"/, + $eval_vars + ); + } + else { + $self->{deferred} .= $self->eval_input_typemap_code( + qq/"\\n\\tif (items < $num)\\n\\t $var = $self->{defaults}->{$var};\\n\\telse {\\n$expr;\\n\\t}\\n"/, + $eval_vars + ); + } + } + elsif ($self->{ScopeThisXSUB} or $expr !~ /^\s*\$var =/) { + if ($printed_name) { + print ";\n"; + } + else { + $self->eval_input_typemap_code(qq/print "\\t$var;\\n"/, $eval_vars); + } + $self->{deferred} + .= $self->eval_input_typemap_code(qq/"\\n$expr;\\n"/, $eval_vars); + } + else { + die "panic: do not know how to handle this branch for function pointers" + if $printed_name; + $self->eval_input_typemap_code(qq/print "$expr;\\n"/, $eval_vars); + } +} + +sub generate_output { + my $self = shift; + my $argsref = shift; + my ($type, $num, $var, $do_setmagic, $do_push) + = @{$argsref}{qw(type num var do_setmagic do_push)}; + + my $arg = "ST(" . ($num - ($num != 0)) . ")"; + + my $typemaps = $self->{typemap}; + + $type = ExtUtils::Typemaps::tidy_type($type); + local $argsref->{type} = $type; + + if ($type =~ /^array\(([^,]*),(.*)\)/) { + print "\t$arg = sv_newmortal();\n"; + print "\tsv_setpvn($arg, (char *)$var, $2 * sizeof($1));\n"; + print "\tSvSETMAGIC($arg);\n" if $do_setmagic; + } + else { + my $typemap = $typemaps->get_typemap(ctype => $type); + if (not $typemap) { + $self->report_typemap_failure($typemaps, $type); + return; + } + + my $outputmap = $typemaps->get_outputmap(xstype => $typemap->xstype); + if (not $outputmap) { + $self->blurt("Error: No OUTPUT definition for type '$type', typekind '" . $typemap->xstype . "' found"); + return; + } + + (my $ntype = $type) =~ s/\s*\*/Ptr/g; + $ntype =~ s/\(\)//g; + (my $subtype = $ntype) =~ s/(?:Array)?(?:Ptr)?$//; + + my $eval_vars = {%$argsref, subtype => $subtype, ntype => $ntype, arg => $arg}; + my $expr = $outputmap->cleaned_code; + if ($expr =~ /DO_ARRAY_ELEM/) { + my $subtypemap = $typemaps->get_typemap(ctype => $subtype); + if (not $subtypemap) { + $self->report_typemap_failure($typemaps, $subtype); + return; + } + + my $suboutputmap = $typemaps->get_outputmap(xstype => $subtypemap->xstype); + if (not $suboutputmap) { + $self->blurt("Error: No OUTPUT definition for type '$subtype', typekind '" . $subtypemap->xstype . "' found"); + return; + } + + my $subexpr = $suboutputmap->cleaned_code; + $subexpr =~ s/ntype/subtype/g; + $subexpr =~ s/\$arg/ST(ix_$var)/g; + $subexpr =~ s/\$var/${var}\[ix_$var]/g; + $subexpr =~ s/\n\t/\n\t\t/g; + $expr =~ s/DO_ARRAY_ELEM\n/$subexpr/; + $self->eval_output_typemap_code("print qq\a$expr\a", $eval_vars); + print "\t\tSvSETMAGIC(ST(ix_$var));\n" if $do_setmagic; + } + elsif ($var eq 'RETVAL') { + my $orig_arg = $arg; + my $indent; + my $use_RETVALSV = 1; + my $do_mortal = 0; + my $do_copy_tmp = 1; + my $pre_expr; + local $eval_vars->{arg} = $arg = 'RETVALSV'; + my $evalexpr = $self->eval_output_typemap_code("qq\a$expr\a", $eval_vars); + + if ($expr =~ /^\t\Q$arg\E = new/) { + # We expect that $arg has refcnt 1, so we need to + # mortalize it. + $do_mortal = 1; + } + # If RETVAL is immortal, don't mortalize it. This code is not perfect: + # It won't detect a func or expression that only returns immortals, for + # example, this RE must be tried before next elsif. + elsif ($evalexpr =~ /^\t\Q$arg\E\s*=\s*(boolSV\(|(&PL_sv_yes|&PL_sv_no|&PL_sv_undef)\s*;)/) { + $do_copy_tmp = 0; #$arg will be a ST(X), no SV* RETVAL, no RETVALSV + $use_RETVALSV = 0; + } + elsif ($evalexpr =~ /^\s*\Q$arg\E\s*=/) { + # We expect that $arg has refcnt >=1, so we need + # to mortalize it! + $use_RETVALSV = 0 if $ntype eq "SVPtr";#reuse SV* RETVAL vs open new block + $do_mortal = 1; + } + else { + # Just hope that the entry would safely write it + # over an already mortalized value. By + # coincidence, something like $arg = &PL_sv_undef + # works too, but should be caught above. + $pre_expr = "RETVALSV = sv_newmortal();\n"; + # new mortals don't have set magic + $do_setmagic = 0; + } + if($use_RETVALSV) { + print "\t{\n\t SV * RETVALSV;\n"; + $indent = "\t "; + } else { + $indent = "\t"; + } + print $indent.$pre_expr if $pre_expr; + + if($use_RETVALSV) { + #take control of 1 layer of indent, may or may not indent more + $evalexpr =~ s/^(\t| )/$indent/gm; + #"\t \t" doesn't draw right in some IDEs + #break down all \t into spaces + $evalexpr =~ s/\t/ /g; + #rebuild back into \t'es, \t==8 spaces, indent==4 spaces + $evalexpr =~ s/ /\t/g; + } + else { + if($do_mortal || $do_setmagic) { + #typemap entry evaled with RETVALSV, if we aren't using RETVALSV replace + $evalexpr =~ s/RETVALSV/RETVAL/g; #all uses with RETVAL for prettier code + } + else { #if no extra boilerplate (no mortal, no set magic) is needed + #after $evalexport, get rid of RETVALSV's visual cluter and change + $evalexpr =~ s/RETVALSV/$orig_arg/g;#the lvalue to ST(X) + } + } + #stop " RETVAL = RETVAL;" for SVPtr type + print $evalexpr if $evalexpr !~ /^\s*RETVAL = RETVAL;$/; + print $indent.'RETVAL'.($use_RETVALSV ? 'SV':'') + .' = sv_2mortal(RETVAL'.($use_RETVALSV ? 'SV':'').");\n" if $do_mortal; + print $indent.'SvSETMAGIC(RETVAL'.($use_RETVALSV ? 'SV':'').");\n" if $do_setmagic; + #dont do "RETVALSV = boolSV(RETVAL); ST(0) = RETVALSV;", it is visual clutter + print $indent."$orig_arg = RETVAL".($use_RETVALSV ? 'SV':'').";\n" + if $do_mortal || $do_setmagic || $do_copy_tmp; + print "\t}\n" if $use_RETVALSV; + } + elsif ($do_push) { + print "\tPUSHs(sv_newmortal());\n"; + local $eval_vars->{arg} = "ST($num)"; + $self->eval_output_typemap_code("print qq\a$expr\a", $eval_vars); + print "\tSvSETMAGIC($arg);\n" if $do_setmagic; + } + elsif ($arg =~ /^ST\(\d+\)$/) { + $self->eval_output_typemap_code("print qq\a$expr\a", $eval_vars); + print "\tSvSETMAGIC($arg);\n" if $do_setmagic; + } + } +} + + +# Just delegates to a clean package. +# Shim to evaluate Perl code in the right variable context +# for typemap code (having things such as $ALIAS set up). +sub eval_output_typemap_code { + my ($self, $code, $other) = @_; + return ExtUtils::ParseXS::Eval::eval_output_typemap_code($self, $code, $other); +} + +sub eval_input_typemap_code { + my ($self, $code, $other) = @_; + return ExtUtils::ParseXS::Eval::eval_input_typemap_code($self, $code, $other); +} + +1; + +# vim: ts=2 sw=2 et: +package ExtUtils::MM_VMS; + +use strict; + +use ExtUtils::MakeMaker::Config; +require Exporter; + +BEGIN { + # so we can compile the thing on non-VMS platforms. + if( $^O eq 'VMS' ) { + require VMS::Filespec; + VMS::Filespec->import; + } +} + +use File::Basename; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::MM_Any; +require ExtUtils::MM_Unix; +our @ISA = qw( ExtUtils::MM_Any ExtUtils::MM_Unix ); + +use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562); +our $Revision = $ExtUtils::MakeMaker::Revision; + + + +sub wraplist { + my($self) = shift; + my($line,$hlen) = ('',0); + + foreach my $word (@_) { + # Perl bug -- seems to occasionally insert extra elements when + # traversing array (scalar(@array) doesn't show them, but + # foreach(@array) does) (5.00307) + next unless $word =~ /\w/; + $line .= ' ' if length($line); + if ($hlen > 80) { $line .= "\\\n\t"; $hlen = 0; } + $line .= $word; + $hlen += length($word) + 2; + } + $line; +} + + +# This isn't really an override. It's just here because ExtUtils::MM_VMS +# appears in @MM::ISA before ExtUtils::Liblist::Kid, so if there isn't an ext() +# in MM_VMS, then AUTOLOAD is called, and bad things happen. So, we just +# mimic inheritance here and hand off to ExtUtils::Liblist::Kid. +# XXX This hackery will die soon. --Schwern +sub ext { + require ExtUtils::Liblist::Kid; + goto &ExtUtils::Liblist::Kid::ext; +} + + +sub guess_name { + my($self) = @_; + my($defname,$defpm,@pm,%xs); + local *PM; + + $defname = basename(fileify($ENV{'DEFAULT'})); + $defname =~ s![\d\-_]*\.dir.*$!!; # Clip off .dir;1 suffix, and package version + $defpm = $defname; + # Fallback in case for some reason a user has copied the files for an + # extension into a working directory whose name doesn't reflect the + # extension's name. We'll use the name of a unique .pm file, or the + # first .pm file with a matching .xs file. + if (not -e "${defpm}.pm") { + @pm = glob('*.pm'); + s/.pm$// for @pm; + if (@pm == 1) { ($defpm = $pm[0]) =~ s/.pm$//; } + elsif (@pm) { + %xs = map { s/.xs$//; ($_,1) } glob('*.xs'); ## no critic + if (keys %xs) { + foreach my $pm (@pm) { + $defpm = $pm, last if exists $xs{$pm}; + } + } + } + } + if (open(my $pm, '<', "${defpm}.pm")){ + while (<$pm>) { + if (/^\s*package\s+([^;]+)/i) { + $defname = $1; + last; + } + } + print "Warning (non-fatal): Couldn't find package name in ${defpm}.pm;\n\t", + "defaulting package name to $defname\n" + if eof($pm); + close $pm; + } + else { + print "Warning (non-fatal): Couldn't find ${defpm}.pm;\n\t", + "defaulting package name to $defname\n"; + } + $defname =~ s#[\d.\-_]+$##; + $defname; +} + + +sub find_perl { + my($self, $ver, $names, $dirs, $trace) = @_; + my($vmsfile,@sdirs,@snames,@cand); + my($rslt); + my($inabs) = 0; + local *TCF; + + if( $self->{PERL_CORE} ) { + # Check in relative directories first, so we pick up the current + # version of Perl if we're running MakeMaker as part of the main build. + @sdirs = sort { my($absa) = $self->file_name_is_absolute($a); + my($absb) = $self->file_name_is_absolute($b); + if ($absa && $absb) { return $a cmp $b } + else { return $absa ? 1 : ($absb ? -1 : ($a cmp $b)); } + } @$dirs; + # Check miniperl before perl, and check names likely to contain + # version numbers before "generic" names, so we pick up an + # executable that's less likely to be from an old installation. + @snames = sort { my($ba) = $a =~ m!([^:>\]/]+)$!; # basename + my($bb) = $b =~ m!([^:>\]/]+)$!; + my($ahasdir) = (length($a) - length($ba) > 0); + my($bhasdir) = (length($b) - length($bb) > 0); + if ($ahasdir and not $bhasdir) { return 1; } + elsif ($bhasdir and not $ahasdir) { return -1; } + else { $bb =~ /\d/ <=> $ba =~ /\d/ + or substr($ba,0,1) cmp substr($bb,0,1) + or length($bb) <=> length($ba) } } @$names; + } + else { + @sdirs = @$dirs; + @snames = @$names; + } + + # Image names containing Perl version use '_' instead of '.' under VMS + s/\.(\d+)$/_$1/ for @snames; + if ($trace >= 2){ + print "Looking for perl $ver by these names:\n"; + print "\t@snames,\n"; + print "in these dirs:\n"; + print "\t@sdirs\n"; + } + foreach my $dir (@sdirs){ + next unless defined $dir; # $self->{PERL_SRC} may be undefined + $inabs++ if $self->file_name_is_absolute($dir); + if ($inabs == 1) { + # We've covered relative dirs; everything else is an absolute + # dir (probably an installed location). First, we'll try + # potential command names, to see whether we can avoid a long + # MCR expression. + foreach my $name (@snames) { + push(@cand,$name) if $name =~ /^[\w\-\$]+$/; + } + $inabs++; # Should happen above in next $dir, but just in case... + } + foreach my $name (@snames){ + push @cand, ($name !~ m![/:>\]]!) ? $self->catfile($dir,$name) + : $self->fixpath($name,0); + } + } + foreach my $name (@cand) { + print "Checking $name\n" if $trace >= 2; + # If it looks like a potential command, try it without the MCR + if ($name =~ /^[\w\-\$]+$/) { + open(my $tcf, ">", "temp_mmvms.com") + or die('unable to open temp file'); + print $tcf "\$ set message/nofacil/nosever/noident/notext\n"; + print $tcf "\$ $name -e \"require $ver; print \"\"VER_OK\\n\"\"\"\n"; + close $tcf; + $rslt = `\@temp_mmvms.com` ; + unlink('temp_mmvms.com'); + if ($rslt =~ /VER_OK/) { + print "Using PERL=$name\n" if $trace; + return $name; + } + } + next unless $vmsfile = $self->maybe_command($name); + $vmsfile =~ s/;[\d\-]*$//; # Clip off version number; we can use a newer version as well + print "Executing $vmsfile\n" if ($trace >= 2); + open(my $tcf, '>', "temp_mmvms.com") + or die('unable to open temp file'); + print $tcf "\$ set message/nofacil/nosever/noident/notext\n"; + print $tcf "\$ mcr $vmsfile -e \"require $ver; print \"\"VER_OK\\n\"\"\" \n"; + close $tcf; + $rslt = `\@temp_mmvms.com`; + unlink('temp_mmvms.com'); + if ($rslt =~ /VER_OK/) { + print "Using PERL=MCR $vmsfile\n" if $trace; + return "MCR $vmsfile"; + } + } + print "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n"; + 0; # false and not empty +} + + +sub _fixin_replace_shebang { + my ( $self, $file, $line ) = @_; + + my ( undef, $arg ) = split ' ', $line, 2; + + return $Config{startperl} . "\n" . $Config{sharpbang} . "perl $arg\n"; +} + + +sub maybe_command { + my($self,$file) = @_; + return $file if -x $file && ! -d _; + my(@dirs) = (''); + my(@exts) = ('',$Config{'exe_ext'},'.exe','.com'); + + if ($file !~ m![/:>\]]!) { + for (my $i = 0; defined $ENV{"DCL\$PATH;$i"}; $i++) { + my $dir = $ENV{"DCL\$PATH;$i"}; + $dir .= ':' unless $dir =~ m%[\]:]$%; + push(@dirs,$dir); + } + push(@dirs,'Sys$System:'); + foreach my $dir (@dirs) { + my $sysfile = "$dir$file"; + foreach my $ext (@exts) { + return $file if -x "$sysfile$ext" && ! -d _; + } + } + } + return 0; +} + + + +sub pasthru { + my($self) = shift; + my $pasthru = $self->SUPER::pasthru; + $pasthru =~ s|(PASTHRU\s*=\s*)|$1/MACRO=(|; + $pasthru =~ s|\n\z|)\n|m; + $pasthru =~ s|/defi?n?e?=\(?([^\),]+)\)?|,$1|ig; + + return $pasthru; +} + + + +sub pm_to_blib { + my $self = shift; + + my $make = $self->SUPER::pm_to_blib; + + $make =~ s{^pm_to_blib :}{pm_to_blib.ts :}m; + $make =~ s{\$\(TOUCH\) pm_to_blib}{\$(TOUCH) pm_to_blib.ts}; + + $make = <<'MAKE' . $make; +# Dummy target to match Unix target name; we use pm_to_blib.ts as +# timestamp file to avoid repeated invocations under VMS +pm_to_blib : pm_to_blib.ts + $(NOECHO) $(NOOP) + +MAKE + + return $make; +} + + + +sub perl_script { + my($self,$file) = @_; + return $file if -r $file && ! -d _; + return "$file.com" if -r "$file.com"; + return "$file.pl" if -r "$file.pl"; + return ''; +} + + + +sub replace_manpage_separator { + my($self,$man) = @_; + $man = unixify($man); + $man =~ s#/+#__#g; + $man; +} + + +sub init_DEST { + my $self = shift; + + $self->SUPER::init_DEST; + + # Expand DEST variables. + foreach my $var ($self->installvars) { + my $destvar = 'DESTINSTALL'.$var; + $self->{$destvar} = $self->eliminate_macros($self->{$destvar}); + } +} + + + +sub init_DIRFILESEP { + my($self) = shift; + + $self->{DIRFILESEP} = ''; + return 1; +} + + + +sub init_main { + my($self) = shift; + + $self->SUPER::init_main; + + $self->{DEFINE} ||= ''; + if ($self->{DEFINE} ne '') { + my(@terms) = split(/\s+/,$self->{DEFINE}); + my(@defs,@udefs); + foreach my $def (@terms) { + next unless $def; + my $targ = \@defs; + if ($def =~ s/^-([DU])//) { # If it was a Unix-style definition + $targ = \@udefs if $1 eq 'U'; + $def =~ s/='(.*)'$/=$1/; # then remove shell-protection '' + $def =~ s/^'(.*)'$/$1/; # from entire term or argument + } + if ($def =~ /=/) { + $def =~ s/"/""/g; # Protect existing " from DCL + $def = qq["$def"]; # and quote to prevent parsing of = + } + push @$targ, $def; + } + + $self->{DEFINE} = ''; + if (@defs) { + $self->{DEFINE} = '/Define=(' . join(',',@defs) . ')'; + } + if (@udefs) { + $self->{DEFINE} .= '/Undef=(' . join(',',@udefs) . ')'; + } + } +} + + +sub init_tools { + my($self) = @_; + + $self->{NOOP} = 'Continue'; + $self->{NOECHO} ||= '@ '; + + $self->{MAKEFILE} ||= $self->{FIRST_MAKEFILE} || 'Descrip.MMS'; + $self->{FIRST_MAKEFILE} ||= $self->{MAKEFILE}; + $self->{MAKE_APERL_FILE} ||= 'Makeaperl.MMS'; + $self->{MAKEFILE_OLD} ||= $self->eliminate_macros('$(FIRST_MAKEFILE)_old'); +# +# If an extension is not specified, then MMS/MMK assumes an +# an extension of .MMS. If there really is no extension, +# then a trailing "." needs to be appended to specify a +# a null extension. +# + $self->{MAKEFILE} .= '.' unless $self->{MAKEFILE} =~ m/\./; + $self->{FIRST_MAKEFILE} .= '.' unless $self->{FIRST_MAKEFILE} =~ m/\./; + $self->{MAKE_APERL_FILE} .= '.' unless $self->{MAKE_APERL_FILE} =~ m/\./; + $self->{MAKEFILE_OLD} .= '.' unless $self->{MAKEFILE_OLD} =~ m/\./; + + $self->{MACROSTART} ||= '/Macro=('; + $self->{MACROEND} ||= ')'; + $self->{USEMAKEFILE} ||= '/Descrip='; + + $self->{EQUALIZE_TIMESTAMP} ||= '$(ABSPERLRUN) -we "open F,qq{>>$ARGV[1]};close F;utime(0,(stat($ARGV[0]))[9]+1,$ARGV[1])"'; + + $self->{MOD_INSTALL} ||= + $self->oneliner(<<'CODE', ['-MExtUtils::Install']); +install([ from_to => {split('\|', )}, verbose => '$(VERBINST)', uninstall_shadows => '$(UNINST)', dir_mode => '$(PERM_DIR)' ]); +CODE + + $self->{UMASK_NULL} = '! '; + + $self->SUPER::init_tools; + + # Use the default shell + $self->{SHELL} ||= 'Posix'; + + # Redirection on VMS goes before the command, not after as on Unix. + # $(DEV_NULL) is used once and its not worth going nuts over making + # it work. However, Unix's DEV_NULL is quite wrong for VMS. + $self->{DEV_NULL} = ''; + + return; +} + + +sub init_platform { + my($self) = shift; + + $self->{MM_VMS_REVISION} = $Revision; + $self->{MM_VMS_VERSION} = $VERSION; + $self->{PERL_VMS} = $self->catdir($self->{PERL_SRC}, 'VMS') + if $self->{PERL_SRC}; +} + + + +sub platform_constants { + my($self) = shift; + my $make_frag = ''; + + foreach my $macro (qw(PERL_VMS MM_VMS_REVISION MM_VMS_VERSION)) + { + next unless defined $self->{$macro}; + $make_frag .= "$macro = $self->{$macro}\n"; + } + + return $make_frag; +} + + + +sub init_VERSION { + my $self = shift; + + $self->SUPER::init_VERSION; + + $self->{DEFINE_VERSION} = '"$(VERSION_MACRO)=""$(VERSION)"""'; + $self->{XS_DEFINE_VERSION} = '"$(XS_VERSION_MACRO)=""$(XS_VERSION)"""'; + $self->{MAKEMAKER} = vmsify($INC{'ExtUtils/MakeMaker.pm'}); +} + + + +sub constants { + my($self) = @_; + + # Be kind about case for pollution + for (@ARGV) { $_ = uc($_) if /POLLUTE/i; } + + # Cleanup paths for directories in MMS macros. + foreach my $macro ( qw [ + INST_BIN INST_SCRIPT INST_LIB INST_ARCHLIB + PERL_LIB PERL_ARCHLIB + PERL_INC PERL_SRC ], + (map { 'INSTALL'.$_ } $self->installvars) + ) + { + next unless defined $self->{$macro}; + next if $macro =~ /MAN/ && $self->{$macro} eq 'none'; + $self->{$macro} = $self->fixpath($self->{$macro},1); + } + + # Cleanup paths for files in MMS macros. + foreach my $macro ( qw[LIBPERL_A FIRST_MAKEFILE MAKEFILE_OLD + MAKE_APERL_FILE MYEXTLIB] ) + { + next unless defined $self->{$macro}; + $self->{$macro} = $self->fixpath($self->{$macro},0); + } + + # Fixup files for MMS macros + # XXX is this list complete? + for my $macro (qw/ + FULLEXT VERSION_FROM + / ) { + next unless defined $self->{$macro}; + $self->{$macro} = $self->fixpath($self->{$macro},0); + } + + + for my $macro (qw/ + OBJECT LDFROM + / ) { + next unless defined $self->{$macro}; + + # Must expand macros before splitting on unescaped whitespace. + $self->{$macro} = $self->eliminate_macros($self->{$macro}); + if ($self->{$macro} =~ /(?{$macro} =~ s/(\\)?\n+\s+/ /g; + $self->{$macro} = $self->wraplist( + map $self->fixpath($_,0), split /,?(?{$macro} + ); + } + else { + $self->{$macro} = $self->fixpath($self->{$macro},0); + } + } + + for my $macro (qw/ XS MAN1PODS MAN3PODS PM /) { + # Where is the space coming from? --jhi + next unless $self ne " " && defined $self->{$macro}; + my %tmp = (); + for my $key (keys %{$self->{$macro}}) { + $tmp{$self->fixpath($key,0)} = + $self->fixpath($self->{$macro}{$key},0); + } + $self->{$macro} = \%tmp; + } + + for my $macro (qw/ C O_FILES H /) { + next unless defined $self->{$macro}; + my @tmp = (); + for my $val (@{$self->{$macro}}) { + push(@tmp,$self->fixpath($val,0)); + } + $self->{$macro} = \@tmp; + } + + # mms/k does not define a $(MAKE) macro. + $self->{MAKE} = '$(MMS)$(MMSQUALIFIERS)'; + + return $self->SUPER::constants; +} + + + +sub special_targets { + my $self = shift; + + my $make_frag .= <<'MAKE_FRAG'; +.SUFFIXES : +.SUFFIXES : $(OBJ_EXT) .c .cpp .cxx .xs + +MAKE_FRAG + + return $make_frag; +} + + +sub cflags { + my($self,$libperl) = @_; + my($quals) = $self->{CCFLAGS} || $Config{'ccflags'}; + my($definestr,$undefstr,$flagoptstr) = ('','',''); + my($incstr) = '/Include=($(PERL_INC)'; + my($name,$sys,@m); + + ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ; + print "Unix shell script ".$Config{"$self->{'BASEEXT'}_cflags"}. + " required to modify CC command for $self->{'BASEEXT'}\n" + if ($Config{$name}); + + if ($quals =~ / -[DIUOg]/) { + while ($quals =~ / -([Og])(\d*)\b/) { + my($type,$lvl) = ($1,$2); + $quals =~ s/ -$type$lvl\b\s*//; + if ($type eq 'g') { $flagoptstr = '/NoOptimize'; } + else { $flagoptstr = '/Optimize' . (defined($lvl) ? "=$lvl" : ''); } + } + while ($quals =~ / -([DIU])(\S+)/) { + my($type,$def) = ($1,$2); + $quals =~ s/ -$type$def\s*//; + $def =~ s/"/""/g; + if ($type eq 'D') { $definestr .= qq["$def",]; } + elsif ($type eq 'I') { $incstr .= ',' . $self->fixpath($def,1); } + else { $undefstr .= qq["$def",]; } + } + } + if (length $quals and $quals !~ m!/!) { + warn "MM_VMS: Ignoring unrecognized CCFLAGS elements \"$quals\"\n"; + $quals = ''; + } + $definestr .= q["PERL_POLLUTE",] if $self->{POLLUTE}; + if (length $definestr) { chop($definestr); $quals .= "/Define=($definestr)"; } + if (length $undefstr) { chop($undefstr); $quals .= "/Undef=($undefstr)"; } + # Deal with $self->{DEFINE} here since some C compilers pay attention + # to only one /Define clause on command line, so we have to + # conflate the ones from $Config{'ccflags'} and $self->{DEFINE} + # ($self->{DEFINE} has already been VMSified in constants() above) + if ($self->{DEFINE}) { $quals .= $self->{DEFINE}; } + for my $type (qw(Def Undef)) { + my(@terms); + while ($quals =~ m:/${type}i?n?e?=([^/]+):ig) { + my $term = $1; + $term =~ s:^\((.+)\)$:$1:; + push @terms, $term; + } + if ($type eq 'Def') { + push @terms, qw[ $(DEFINE_VERSION) $(XS_DEFINE_VERSION) ]; + } + if (@terms) { + $quals =~ s:/${type}i?n?e?=[^/]+::ig; + # PASTHRU_DEFINE will have its own comma + $quals .= "/${type}ine=(" . join(',',@terms) . ($type eq 'Def' ? '$(PASTHRU_DEFINE)' : '') . ')'; + } + } + + $libperl or $libperl = $self->{LIBPERL_A} || "libperl.olb"; + + # Likewise with $self->{INC} and /Include + if ($self->{'INC'}) { + my(@includes) = split(/\s+/,$self->{INC}); + foreach (@includes) { + s/^-I//; + $incstr .= ','.$self->fixpath($_,1); + } + } + $quals .= "$incstr)"; +# $quals =~ s/,,/,/g; $quals =~ s/\(,/(/g; + $self->{CCFLAGS} = $quals; + + $self->{PERLTYPE} ||= ''; + + $self->{OPTIMIZE} ||= $flagoptstr || $Config{'optimize'}; + if ($self->{OPTIMIZE} !~ m!/!) { + if ($self->{OPTIMIZE} =~ m!-g!) { $self->{OPTIMIZE} = '/Debug/NoOptimize' } + elsif ($self->{OPTIMIZE} =~ /-O(\d*)/) { + $self->{OPTIMIZE} = '/Optimize' . (defined($1) ? "=$1" : ''); + } + else { + warn "MM_VMS: Can't parse OPTIMIZE \"$self->{OPTIMIZE}\"; using default\n" if length $self->{OPTIMIZE}; + $self->{OPTIMIZE} = '/Optimize'; + } + } + + return $self->{CFLAGS} = qq{ +CCFLAGS = $self->{CCFLAGS} +OPTIMIZE = $self->{OPTIMIZE} +PERLTYPE = $self->{PERLTYPE} +}; +} + + +sub const_cccmd { + my($self,$libperl) = @_; + my(@m); + + return $self->{CONST_CCCMD} if $self->{CONST_CCCMD}; + return '' unless $self->needs_linking(); + if ($Config{'vms_cc_type'} eq 'gcc') { + push @m,' +.FIRST + ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" Then Define/NoLog SYS GNU_CC_Include:[VMS]'; + } + elsif ($Config{'vms_cc_type'} eq 'vaxc') { + push @m,' +.FIRST + ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").eqs."" Then Define/NoLog SYS Sys$Library + ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("VAXC$Include").nes."" Then Define/NoLog SYS VAXC$Include'; + } + else { + push @m,' +.FIRST + ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").eqs."" Then Define/NoLog SYS ', + ($Config{'archname'} eq 'VMS_AXP' ? 'Sys$Library' : 'DECC$Library_Include'),' + ',$self->{NOECHO},'If F$TrnLnm("Sys").eqs."" .and. F$TrnLnm("DECC$System_Include").nes."" Then Define/NoLog SYS DECC$System_Include'; + } + + push(@m, "\n\nCCCMD = $Config{'cc'} \$(CCFLAGS)\$(OPTIMIZE)\n"); + + $self->{CONST_CCCMD} = join('',@m); +} + + + +sub tools_other { + my($self) = @_; + + # XXX Are these necessary? Does anyone override them? They're longer + # than just typing the literal string. + my $extra_tools = <<'EXTRA_TOOLS'; + +# Just in case anyone is using the old macro. +USEMACROS = $(MACROSTART) +SAY = $(ECHO) + +EXTRA_TOOLS + + return $self->SUPER::tools_other . $extra_tools; +} + + +sub init_dist { + my($self) = @_; + $self->{ZIPFLAGS} ||= '-Vu'; + $self->{COMPRESS} ||= 'gzip'; + $self->{SUFFIX} ||= '-gz'; + $self->{SHAR} ||= 'vms_share'; + $self->{DIST_DEFAULT} ||= 'zipdist'; + + $self->SUPER::init_dist; + + $self->{DISTVNAME} = "$self->{DISTNAME}-$self->{VERSION_SYM}" + unless $self->{ARGS}{DISTVNAME}; + + return; +} + + +sub c_o { + my($self) = @_; + return '' unless $self->needs_linking(); + ' +.c$(OBJ_EXT) : + $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT) + +.cpp$(OBJ_EXT) : + $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cpp /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT) + +.cxx$(OBJ_EXT) : + $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).cxx /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT) + +'; +} + + +sub xs_c { + my($self) = @_; + return '' unless $self->needs_linking(); + ' +.xs.c : + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).xsc + $(MV) $(MMS$TARGET_NAME).xsc $(MMS$TARGET_NAME).c +'; +} + + +sub xs_o { + my ($self) = @_; + return '' unless $self->needs_linking(); + my $frag = ' +.xs$(OBJ_EXT) : + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs >$(MMS$TARGET_NAME).xsc + $(MV) $(MMS$TARGET_NAME).xsc $(MMS$TARGET_NAME).c + $(CCCMD) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT) +'; + if ($self->{XSMULTI}) { + for my $ext ($self->_xs_list_basenames) { + my $version = $self->parse_version("$ext.pm"); + my $ccflags = $self->{CCFLAGS}; + $ccflags =~ s/\$\(DEFINE_VERSION\)/\"VERSION_MACRO=\\"\"$version\\"\"/; + $ccflags =~ s/\$\(XS_DEFINE_VERSION\)/\"XS_VERSION_MACRO=\\"\"$version\\"\"/; + $self->_xsbuild_replace_macro($ccflags, 'xs', $ext, 'INC'); + $self->_xsbuild_replace_macro($ccflags, 'xs', $ext, 'DEFINE'); + + $frag .= _sprintf562 <<'EOF', $ext, $ccflags; + +%1$s$(OBJ_EXT) : %1$s.xs + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(MMS$TARGET_NAME).xs > $(MMS$TARGET_NAME).xsc + $(MV) $(MMS$TARGET_NAME).xsc $(MMS$TARGET_NAME).c + $(CC)%2$s$(OPTIMIZE) $(CCCDLFLAGS) $(MMS$TARGET_NAME).c /OBJECT=$(MMS$TARGET_NAME)$(OBJ_EXT) +EOF + } + } + $frag; +} + + +sub _xsbuild_replace_macro { + my ($self, undef, $xstype, $ext, $varname) = @_; + my $value = $self->_xsbuild_value($xstype, $ext, $varname); + return unless defined $value; + $_[1] = _vms_replace_qualifier($self, $_[1], $value, $varname); +} + + +sub _xsbuild_value { + my ($self, $xstype, $ext, $varname) = @_; + $ext = unixify($ext); + return $self->SUPER::_xsbuild_value($xstype, $ext, $varname); +} + +sub _vms_replace_qualifier { + my ($self, $flags, $newflag, $macro) = @_; + my $qual_type; + my $type_suffix; + my $quote_subquals = 0; + my @subquals_new = split /\s+/, $newflag; + + if ($macro eq 'DEFINE') { + $qual_type = 'Def'; + $type_suffix = 'ine'; + map { $_ =~ s/^-D// } @subquals_new; + $quote_subquals = 1; + } + elsif ($macro eq 'INC') { + $qual_type = 'Inc'; + $type_suffix = 'lude'; + map { $_ =~ s/^-I//; $_ = $self->fixpath($_) } @subquals_new; + } + + my @subquals = (); + while ($flags =~ m:/${qual_type}\S{0,4}=([^/]+):ig) { + my $term = $1; + $term =~ s/\"//g; + $term =~ s:^\((.+)\)$:$1:; + push @subquals, split /,/, $term; + } + for my $new (@subquals_new) { + my ($sq_new, $sqval_new) = split /=/, $new; + my $replaced_old = 0; + for my $old (@subquals) { + my ($sq, $sqval) = split /=/, $old; + if ($sq_new eq $sq) { + $old = $sq_new; + $old .= '=' . $sqval_new if defined($sqval_new) and length($sqval_new); + $replaced_old = 1; + last; + } + } + push @subquals, $new unless $replaced_old; + } + + if (@subquals) { + $flags =~ s:/${qual_type}\S{0,4}=[^/]+::ig; + # add quotes if requested but not for unexpanded macros + map { $_ = qq/"$_"/ if $_ !~ m/^\$\(/ } @subquals if $quote_subquals; + $flags .= "/${qual_type}$type_suffix=(" . join(',',@subquals) . ')'; + } + + return $flags; +} + + +sub xs_dlsyms_ext { + '.opt'; +} + + +sub dlsyms { + my ($self, %attribs) = @_; + return '' unless $self->needs_linking; + $self->xs_dlsyms_iterator; +} + +sub xs_make_dlsyms { + my ($self, $attribs, $target, $dep, $name, $dlbase, $funcs, $funclist, $imports, $vars, $extra) = @_; + my @m; + my $instloc; + if ($self->{XSMULTI}) { + my ($v, $d, $f) = File::Spec->splitpath($target); + my @d = File::Spec->splitdir($d); + shift @d if $d[0] eq 'lib'; + $instloc = $self->catfile('$(INST_ARCHLIB)', 'auto', @d, $f); + push @m,"\ndynamic :: $instloc\n\t\$(NOECHO) \$(NOOP)\n" + unless $self->{SKIPHASH}{'dynamic'}; + push @m,"\nstatic :: $instloc\n\t\$(NOECHO) \$(NOOP)\n" + unless $self->{SKIPHASH}{'static'}; + push @m, "\n", sprintf <<'EOF', $instloc, $target; +%s : %s + $(CP) $(MMS$SOURCE) $(MMS$TARGET) +EOF + } + else { + push @m,"\ndynamic :: \$(INST_ARCHAUTODIR)$self->{BASEEXT}.opt\n\t\$(NOECHO) \$(NOOP)\n" + unless $self->{SKIPHASH}{'dynamic'}; + push @m,"\nstatic :: \$(INST_ARCHAUTODIR)$self->{BASEEXT}.opt\n\t\$(NOECHO) \$(NOOP)\n" + unless $self->{SKIPHASH}{'static'}; + push @m, "\n", sprintf <<'EOF', $target; +$(INST_ARCHAUTODIR)$(BASEEXT).opt : %s + $(CP) $(MMS$SOURCE) $(MMS$TARGET) +EOF + } + push @m, + "\n$target : $dep\n\t", + q!$(PERLRUN) -MExtUtils::Mksymlists -e "Mksymlists('NAME'=>'!, $name, + q!', 'DLBASE' => '!,$dlbase, + q!', 'DL_FUNCS' => !,neatvalue($funcs), + q!, 'FUNCLIST' => !,neatvalue($funclist), + q!, 'IMPORTS' => !,neatvalue($imports), + q!, 'DL_VARS' => !, neatvalue($vars); + push @m, $extra if defined $extra; + push @m, qq!);"\n\t!; + # Can't use dlbase as it's been through mod2fname. + my $olb_base = basename($target, '.opt'); + if ($self->{XSMULTI}) { + # We've been passed everything but the kitchen sink -- and the location of the + # static library we're using to build the dynamic library -- so concoct that + # location from what we do have. + my $olb_dir = $self->catdir(dirname($instloc), $olb_base); + push @m, qq!\$(PERL) -e "print ""${olb_dir}${olb_base}\$(LIB_EXT)/Include=!; + push @m, ($Config{d_vms_case_sensitive_symbols} ? uc($olb_base) : $olb_base); + push @m, '\n' . $olb_dir . $olb_base . '$(LIB_EXT)/Library\n"";" >>$(MMS$TARGET)',"\n"; + } + else { + push @m, qq!\$(PERL) -e "print ""\$(INST_ARCHAUTODIR)${olb_base}\$(LIB_EXT)/Include=!; + if ($self->{OBJECT} =~ /\bBASEEXT\b/ or + $self->{OBJECT} =~ /\b$self->{BASEEXT}\b/i) { + push @m, ($Config{d_vms_case_sensitive_symbols} + ? uc($self->{BASEEXT}) :'$(BASEEXT)'); + } + else { # We don't have a "main" object file, so pull 'em all in + # Upcase module names if linker is being case-sensitive + my($upcase) = $Config{d_vms_case_sensitive_symbols}; + my(@omods) = split ' ', $self->eliminate_macros($self->{OBJECT}); + for (@omods) { + s/\.[^.]*$//; # Trim off file type + s[\$\(\w+_EXT\)][]; # even as a macro + s/.*[:>\/\]]//; # Trim off dir spec + $_ = uc if $upcase; + }; + my(@lines); + my $tmp = shift @omods; + foreach my $elt (@omods) { + $tmp .= ",$elt"; + if (length($tmp) > 80) { push @lines, $tmp; $tmp = ''; } + } + push @lines, $tmp; + push @m, '(', join( qq[, -\\n\\t"";" >>\$(MMS\$TARGET)\n\t\$(PERL) -e "print ""], @lines),')'; + } + push @m, '\n$(INST_ARCHAUTODIR)' . $olb_base . '$(LIB_EXT)/Library\n"";" >>$(MMS$TARGET)',"\n"; + } + if (length $self->{LDLOADLIBS}) { + my($line) = ''; + foreach my $lib (split ' ', $self->{LDLOADLIBS}) { + $lib =~ s%\$%\\\$%g; # Escape '$' in VMS filespecs + if (length($line) + length($lib) > 160) { + push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n"; + $line = $lib . '\n'; + } + else { $line .= $lib . '\n'; } + } + push @m, "\t\$(PERL) -e \"print qq{$line}\" >>\$(MMS\$TARGET)\n" if $line; + } + join '', @m; +} + + + +sub xs_obj_opt { + my ($self, $output_file) = @_; + "/OBJECT=$output_file"; +} + + +sub xs_dynamic_lib_macros { + my ($self, $attribs) = @_; + my $otherldflags = $attribs->{OTHERLDFLAGS} || ""; + my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || ""; + sprintf <<'EOF', $otherldflags, $inst_dynamic_dep; +# This section creates the dynamically loadable objects from relevant +# objects and possibly $(MYEXTLIB). +OTHERLDFLAGS = %s +INST_DYNAMIC_DEP = %s +EOF +} + +sub xs_make_dynamic_lib { + my ($self, $attribs, $from, $to, $todir, $ldfrom, $exportlist) = @_; + my $shr = $Config{'dbgprefix'} . 'PerlShr'; + $exportlist =~ s/.def$/.opt/; # it's a linker options file + # 1 2 3 4 5 + _sprintf562 <<'EOF', $to, $todir, $exportlist, $shr, "$shr Sys\$Share:$shr.$Config{'dlext'}"; +%1$s : $(INST_STATIC) $(PERL_INC)perlshr_attr.opt %2$s$(DFSEP).exists %3$s $(PERL_ARCHIVE) $(INST_DYNAMIC_DEP) + If F$TrnLNm("%4$s").eqs."" Then Define/NoLog/User %5$s + Link $(LDFLAGS) /Shareable=$(MMS$TARGET)$(OTHERLDFLAGS) %3$s/Option,$(PERL_INC)perlshr_attr.opt/Option +EOF +} + + +sub xs_make_static_lib { + my ($self, $object, $to, $todir) = @_; + + my @objects; + if ($self->{XSMULTI}) { + # The extension name should be the main object file name minus file type. + my $lib = $object; + $lib =~ s/\$\(OBJ_EXT\)\z//; + my $override = $self->_xsbuild_value('xs', $lib, 'OBJECT'); + $object = $override if defined $override; + @objects = map { $self->fixpath($_,0) } split /(?{MYEXTLIB}; + + push(@m,"\t",'If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET)',"\n"); + + # if there was a library to copy, then we can't use MMS$SOURCE_LIST, + # 'cause it's a library and you can't stick them in other libraries. + # In that case, we use $OBJECT instead and hope for the best + if ($self->{MYEXTLIB}) { + for my $obj (@objects) { + push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) ' . $obj,"\n"); + } + } + else { + push(@m,"\t",'Library/Object/Replace $(MMS$TARGET) $(MMS$SOURCE_LIST)',"\n"); + } + + push @m, "\t\$(NOECHO) \$(PERL) -e 1 >\$(INST_ARCHAUTODIR)extralibs.ld\n"; + foreach my $lib (split ' ', $self->{EXTRALIBS}) { + push(@m,"\t",'$(NOECHO) $(PERL) -e "print qq{',$lib,'\n}" >>$(INST_ARCHAUTODIR)extralibs.ld',"\n"); + } + join('',@m); +} + + + +sub static_lib_pure_cmd { + my ($self, $from) = @_; + + sprintf <<'MAKE_FRAG', $from; + If F$Search("$(MMS$TARGET)").eqs."" Then Library/Object/Create $(MMS$TARGET) + Library/Object/Replace $(MMS$TARGET) %s +MAKE_FRAG +} + + +sub xs_static_lib_is_xs { + return 1; +} + + +sub extra_clean_files { + return qw( + *.Map *.Dmp *.Lis *.cpp *.$(DLEXT) *.Opt $(BASEEXT).bso + .MM_Tmp cxx_repository + ); +} + + + +sub zipfile_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +$(DISTVNAME).zip : distdir + $(PREOP) + $(ZIP) "$(ZIPFLAGS)" $(MMS$TARGET) [.$(DISTVNAME)...]*.*; + $(RM_RF) $(DISTVNAME) + $(POSTOP) +MAKE_FRAG +} + +sub tarfile_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +$(DISTVNAME).tar$(SUFFIX) : distdir + $(PREOP) + $(TO_UNIX) + $(TAR) "$(TARFLAGS)" $(DISTVNAME).tar [.$(DISTVNAME)...] + $(RM_RF) $(DISTVNAME) + $(COMPRESS) $(DISTVNAME).tar + $(POSTOP) +MAKE_FRAG +} + +sub shdist_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +shdist : distdir + $(PREOP) + $(SHAR) [.$(DISTVNAME)...]*.*; $(DISTVNAME).share + $(RM_RF) $(DISTVNAME) + $(POSTOP) +MAKE_FRAG +} + + +# --- Test and Installation Sections --- + + +sub install { + my($self, %attribs) = @_; + my(@m); + + push @m, q[ +install :: all pure_install doc_install + $(NOECHO) $(NOOP) + +install_perl :: all pure_perl_install doc_perl_install + $(NOECHO) $(NOOP) + +install_site :: all pure_site_install doc_site_install + $(NOECHO) $(NOOP) + +install_vendor :: all pure_vendor_install doc_vendor_install + $(NOECHO) $(NOOP) + +pure_install :: pure_$(INSTALLDIRS)_install + $(NOECHO) $(NOOP) + +doc_install :: doc_$(INSTALLDIRS)_install + $(NOECHO) $(NOOP) + +pure__install : pure_site_install + $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" + +doc__install : doc_site_install + $(NOECHO) $(ECHO) "INSTALLDIRS not defined, defaulting to INSTALLDIRS=site" + +# This hack brought to you by DCL's 255-character command line limit +pure_perl_install :: +]; + push @m, +q[ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read|'.File::Spec->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').'|'" >.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write|'.File::Spec->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').'|'" >>.MM_tmp +] unless $self->{NO_PACKLIST}; + + push @m, +q[ $(NOECHO) $(ECHO_N) "$(INST_LIB)|$(DESTINSTALLPRIVLIB)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB)|$(DESTINSTALLARCHLIB)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_BIN)|$(DESTINSTALLBIN)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_SCRIPT)|$(DESTINSTALLSCRIPT)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR) $(DESTINSTALLMAN1DIR) " >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR)|$(DESTINSTALLMAN3DIR)" >>.MM_tmp + $(NOECHO) $(MOD_INSTALL) <.MM_tmp + $(NOECHO) $(RM_F) .MM_tmp + $(NOECHO) $(WARN_IF_OLD_PACKLIST) "].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[" + +# Likewise +pure_site_install :: +]; + push @m, +q[ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read|'.File::Spec->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').'|'" >.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write|'.File::Spec->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').'|'" >>.MM_tmp +] unless $self->{NO_PACKLIST}; + + push @m, +q[ $(NOECHO) $(ECHO_N) "$(INST_LIB)|$(DESTINSTALLSITELIB)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB)|$(DESTINSTALLSITEARCH)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_BIN)|$(DESTINSTALLSITEBIN)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_SCRIPT)|$(DESTINSTALLSCRIPT)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR)|$(DESTINSTALLSITEMAN1DIR)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR)|$(DESTINSTALLSITEMAN3DIR)" >>.MM_tmp + $(NOECHO) $(MOD_INSTALL) <.MM_tmp + $(NOECHO) $(RM_F) .MM_tmp + $(NOECHO) $(WARN_IF_OLD_PACKLIST) "].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[" + +pure_vendor_install :: +]; + push @m, +q[ $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'read|'.File::Spec->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').'|'" >.MM_tmp + $(NOECHO) $(PERLRUN) "-MFile::Spec" -e "print 'write|'.File::Spec->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').'|'" >>.MM_tmp +] unless $self->{NO_PACKLIST}; + + push @m, +q[ $(NOECHO) $(ECHO_N) "$(INST_LIB)|$(DESTINSTALLVENDORLIB)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_ARCHLIB)|$(DESTINSTALLVENDORARCH)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_BIN)|$(DESTINSTALLVENDORBIN)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_SCRIPT)|$(DESTINSTALLSCRIPT)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_MAN1DIR)|$(DESTINSTALLVENDORMAN1DIR)|" >>.MM_tmp + $(NOECHO) $(ECHO_N) "$(INST_MAN3DIR)|$(DESTINSTALLVENDORMAN3DIR)" >>.MM_tmp + $(NOECHO) $(MOD_INSTALL) <.MM_tmp + $(NOECHO) $(RM_F) .MM_tmp + +]; + + push @m, q[ +# Ditto +doc_perl_install :: + $(NOECHO) $(NOOP) + +# And again +doc_site_install :: + $(NOECHO) $(NOOP) + +doc_vendor_install :: + $(NOECHO) $(NOOP) + +] if $self->{NO_PERLLOCAL}; + + push @m, q[ +# Ditto +doc_perl_install :: + $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q[" + $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) + $(NOECHO) $(ECHO_N) "installed into|$(INSTALLPRIVLIB)|" >.MM_tmp + $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp + $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp + +# And again +doc_site_install :: + $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q[" + $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) + $(NOECHO) $(ECHO_N) "installed into|$(INSTALLSITELIB)|" >.MM_tmp + $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp + $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp + +doc_vendor_install :: + $(NOECHO) $(ECHO) "Appending installation info to ].$self->catfile($self->{DESTINSTALLARCHLIB}, 'perllocal.pod').q[" + $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) + $(NOECHO) $(ECHO_N) "installed into|$(INSTALLVENDORLIB)|" >.MM_tmp + $(NOECHO) $(ECHO_N) "LINKTYPE|$(LINKTYPE)|VERSION|$(VERSION)|EXE_FILES|$(EXE_FILES) " >>.MM_tmp + $(NOECHO) $(DOC_INSTALL) "Module" "$(NAME)" <.MM_tmp >>].$self->catfile($self->{DESTINSTALLARCHLIB},'perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp + +] unless $self->{NO_PERLLOCAL}; + + push @m, q[ +uninstall :: uninstall_from_$(INSTALLDIRS)dirs + $(NOECHO) $(NOOP) + +uninstall_from_perldirs :: + $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{PERL_ARCHLIB},'auto',$self->{FULLEXT},'.packlist').q[ + +uninstall_from_sitedirs :: + $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{SITEARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[ + +uninstall_from_vendordirs :: + $(NOECHO) $(UNINSTALL) ].$self->catfile($self->{VENDORARCHEXP},'auto',$self->{FULLEXT},'.packlist').q[ +]; + + join('',@m); +} + + +sub perldepend { + my($self) = @_; + my(@m); + + if ($self->{OBJECT}) { + # Need to add an object file dependency on the perl headers. + # this is very important for XS modules in perl.git development. + + push @m, $self->_perl_header_files_fragment(""); # empty separator on VMS as its in the $(PERL_INC) + } + + if ($self->{PERL_SRC}) { + my(@macros); + my($mmsquals) = '$(USEMAKEFILE)[.vms]$(FIRST_MAKEFILE)'; + push(@macros,'__AXP__=1') if $Config{'archname'} eq 'VMS_AXP'; + push(@macros,'DECC=1') if $Config{'vms_cc_type'} eq 'decc'; + push(@macros,'GNUC=1') if $Config{'vms_cc_type'} eq 'gcc'; + push(@macros,'SOCKET=1') if $Config{'d_has_sockets'}; + push(@macros,qq["CC=$Config{'cc'}"]) if $Config{'cc'} =~ m!/!; + $mmsquals .= '$(USEMACROS)' . join(',',@macros) . '$(MACROEND)' if @macros; + push(@m,q[ +# Check for unpropagated config.sh changes. Should never happen. +# We do NOT just update config.h because that is not sufficient. +# An out of date config.h is not fatal but complains loudly! +$(PERL_INC)config.h : $(PERL_SRC)config.sh + $(NOOP) + +$(PERL_ARCHLIB)Config.pm : $(PERL_SRC)config.sh + $(NOECHO) Write Sys$Error "$(PERL_ARCHLIB)Config.pm may be out of date with config.h or genconfig.pl" + olddef = F$Environment("Default") + Set Default $(PERL_SRC) + $(MMS)],$mmsquals,); + if ($self->{PERL_ARCHLIB} =~ m|\[-| && $self->{PERL_SRC} =~ m|(\[-+)|) { + my($prefix,$target) = ($1,$self->fixpath('$(PERL_ARCHLIB)Config.pm',0)); + $target =~ s/\Q$prefix/[/; + push(@m," $target"); + } + else { push(@m,' $(MMS$TARGET)'); } + push(@m,q[ + Set Default 'olddef' +]); + } + + push(@m, join(" ", map($self->fixpath($_,0),sort values %{$self->{XS}}))." : \$(XSUBPPDEPS)\n") + if %{$self->{XS}}; + + join('',@m); +} + + + +our %olbs; # needs to be localized + +sub makeaperl { + my($self, %attribs) = @_; + my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmpdir, $libperl) = + @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)}; + my(@m); + push @m, " +# --- MakeMaker makeaperl section --- +MAP_TARGET = $target +"; + return join '', @m if $self->{PARENT}; + + my($dir) = join ":", @{$self->{DIR}}; + + unless ($self->{MAKEAPERL}) { + push @m, q{ +$(MAKE_APERL_FILE) : $(FIRST_MAKEFILE) + $(NOECHO) $(ECHO) "Writing ""$(MMS$TARGET)"" for this $(MAP_TARGET)" + $(NOECHO) $(PERLRUNINST) \ + Makefile.PL DIR=}, $dir, q{ \ + FIRST_MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ + MAKEAPERL=1 NORECURS=1 }; + + push @m, map(q[ \\\n\t\t"$_"], @ARGV),q{ + +$(MAP_TARGET) :: $(MAKE_APERL_FILE) + $(MAKE)$(USEMAKEFILE)$(MAKE_APERL_FILE) static $(MMS$TARGET) +}; + push @m, "\n"; + + return join '', @m; + } + + + my($linkcmd,@optlibs,@staticpkgs,$extralist,$targdir,$libperldir,%libseen); + local($_); + + # The front matter of the linkcommand... + $linkcmd = join ' ', $Config{'ld'}, + grep($_, @Config{qw(large split ldflags ccdlflags)}); + $linkcmd =~ s/\s+/ /g; + + # Which *.olb files could we make use of... + local(%olbs); # XXX can this be lexical? + $olbs{$self->{INST_ARCHAUTODIR}} = "$self->{BASEEXT}\$(LIB_EXT)"; + require File::Find; + File::Find::find(sub { + return unless m/\Q$self->{LIB_EXT}\E$/; + return if m/^libperl/; + + if( exists $self->{INCLUDE_EXT} ){ + my $found = 0; + + (my $xx = $File::Find::name) =~ s,.*?/auto/,,; + $xx =~ s,/?$_,,; + $xx =~ s,/,::,g; + + # Throw away anything not explicitly marked for inclusion. + # DynaLoader is implied. + foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){ + if( $xx eq $incl ){ + $found++; + last; + } + } + return unless $found; + } + elsif( exists $self->{EXCLUDE_EXT} ){ + (my $xx = $File::Find::name) =~ s,.*?/auto/,,; + $xx =~ s,/?$_,,; + $xx =~ s,/,::,g; + + # Throw away anything explicitly marked for exclusion + foreach my $excl (@{$self->{EXCLUDE_EXT}}){ + return if( $xx eq $excl ); + } + } + + $olbs{$ENV{DEFAULT}} = $_; + }, grep( -d $_, @{$searchdirs || []})); + + # We trust that what has been handed in as argument will be buildable + $static = [] unless $static; + @olbs{@{$static}} = (1) x @{$static}; + + $extra = [] unless $extra && ref $extra eq 'ARRAY'; + # Sort the object libraries in inverse order of + # filespec length to try to insure that dependent extensions + # will appear before their parents, so the linker will + # search the parent library to resolve references. + # (e.g. Intuit::DWIM will precede Intuit, so unresolved + # references from [.intuit.dwim]dwim.obj can be found + # in [.intuit]intuit.olb). + for (sort { length($a) <=> length($b) || $a cmp $b } keys %olbs) { + next unless $olbs{$_} =~ /\Q$self->{LIB_EXT}\E$/; + my($dir) = $self->fixpath($_,1); + my($extralibs) = $dir . "extralibs.ld"; + my($extopt) = $dir . $olbs{$_}; + $extopt =~ s/$self->{LIB_EXT}$/.opt/; + push @optlibs, "$dir$olbs{$_}"; + # Get external libraries this extension will need + if (-f $extralibs ) { + my %seenthis; + open my $list, "<", $extralibs or warn $!,next; + while (<$list>) { + chomp; + # Include a library in the link only once, unless it's mentioned + # multiple times within a single extension's options file, in which + # case we assume the builder needed to search it again later in the + # link. + my $skip = exists($libseen{$_}) && !exists($seenthis{$_}); + $libseen{$_}++; $seenthis{$_}++; + next if $skip; + push @$extra,$_; + } + } + # Get full name of extension for ExtUtils::Miniperl + if (-f $extopt) { + open my $opt, '<', $extopt or die $!; + while (<$opt>) { + next unless /(?:UNIVERSAL|VECTOR)=boot_([\w_]+)/; + my $pkg = $1; + $pkg =~ s#__*#::#g; + push @staticpkgs,$pkg; + } + } + } + # Place all of the external libraries after all of the Perl extension + # libraries in the final link, in order to maximize the opportunity + # for XS code from multiple extensions to resolve symbols against the + # same external library while only including that library once. + push @optlibs, @$extra; + + $target = "Perl$Config{'exe_ext'}" unless $target; + my $shrtarget; + ($shrtarget,$targdir) = fileparse($target); + $shrtarget =~ s/^([^.]*)/$1Shr/; + $shrtarget = $targdir . $shrtarget; + $target = "Perlshr.$Config{'dlext'}" unless $target; + $tmpdir = "[]" unless $tmpdir; + $tmpdir = $self->fixpath($tmpdir,1); + if (@optlibs) { $extralist = join(' ',@optlibs); } + else { $extralist = ''; } + # Let ExtUtils::Liblist find the necessary libs for us (but skip PerlShr) + # that's what we're building here). + push @optlibs, grep { !/PerlShr/i } split ' ', +($self->ext())[2]; + if ($libperl) { + unless (-f $libperl || -f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',$libperl))) { + print "Warning: $libperl not found\n"; + undef $libperl; + } + } + unless ($libperl) { + if (defined $self->{PERL_SRC}) { + $libperl = $self->catfile($self->{PERL_SRC},"libperl$self->{LIB_EXT}"); + } elsif (-f ($libperl = $self->catfile($Config{'installarchlib'},'CORE',"libperl$self->{LIB_EXT}")) ) { + } else { + print "Warning: $libperl not found + If you're going to build a static perl binary, make sure perl is installed + otherwise ignore this warning\n"; + } + } + $libperldir = $self->fixpath((fileparse($libperl))[1],1); + + push @m, ' +# Fill in the target you want to produce if it\'s not perl +MAP_TARGET = ',$self->fixpath($target,0),' +MAP_SHRTARGET = ',$self->fixpath($shrtarget,0)," +MAP_LINKCMD = $linkcmd +MAP_PERLINC = ", $perlinc ? map('"$_" ',@{$perlinc}) : ''," +MAP_EXTRA = $extralist +MAP_LIBPERL = ",$self->fixpath($libperl,0),' +'; + + + push @m,"\n${tmpdir}Makeaperl.Opt : \$(MAP_EXTRA)\n"; + foreach (@optlibs) { + push @m,' $(NOECHO) $(PERL) -e "print q{',$_,'}" >>$(MMS$TARGET)',"\n"; + } + push @m,"\n${tmpdir}PerlShr.Opt :\n\t"; + push @m,'$(NOECHO) $(PERL) -e "print q{$(MAP_SHRTARGET)}" >$(MMS$TARGET)',"\n"; + + push @m,' +$(MAP_SHRTARGET) : $(MAP_LIBPERL) Makeaperl.Opt ',"${libperldir}Perlshr_Attr.Opt",' + $(MAP_LINKCMD)/Shareable=$(MMS$TARGET) $(MAP_LIBPERL), Makeaperl.Opt/Option ',"${libperldir}Perlshr_Attr.Opt/Option",' +$(MAP_TARGET) : $(MAP_SHRTARGET) ',"${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}PerlShr.Opt",' + $(MAP_LINKCMD) ',"${tmpdir}perlmain\$(OBJ_EXT)",', PerlShr.Opt/Option + $(NOECHO) $(ECHO) "To install the new ""$(MAP_TARGET)"" binary, say" + $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) inst_perl $(USEMACROS)MAP_TARGET=$(MAP_TARGET)$(ENDMACRO)" + $(NOECHO) $(ECHO) "To remove the intermediate files, say + $(NOECHO) $(ECHO) " $(MAKE)$(USEMAKEFILE)$(FIRST_MAKEFILE) map_clean" +'; + push @m,"\n${tmpdir}perlmain.c : \$(FIRST_MAKEFILE)\n\t\$(NOECHO) \$(PERL) -e 1 >${tmpdir}Writemain.tmp\n"; + push @m, "# More from the 255-char line length limit\n"; + foreach (@staticpkgs) { + push @m,' $(NOECHO) $(PERL) -e "print q{',$_,qq[}" >>${tmpdir}Writemain.tmp\n]; + } + + push @m, sprintf <<'MAKE_FRAG', $tmpdir, $tmpdir; + $(NOECHO) $(PERL) $(MAP_PERLINC) -ane "use ExtUtils::Miniperl; writemain(@F)" %sWritemain.tmp >$(MMS$TARGET) + $(NOECHO) $(RM_F) %sWritemain.tmp +MAKE_FRAG + + push @m, q[ +# Still more from the 255-char line length limit +doc_inst_perl : + $(NOECHO) $(MKPATH) $(DESTINSTALLARCHLIB) + $(NOECHO) $(ECHO) "Perl binary $(MAP_TARGET)|" >.MM_tmp + $(NOECHO) $(ECHO) "MAP_STATIC|$(MAP_STATIC)|" >>.MM_tmp + $(NOECHO) $(PERL) -pl040 -e " " ].$self->catfile('$(INST_ARCHAUTODIR)','extralibs.all'),q[ >>.MM_tmp + $(NOECHO) $(ECHO) -e "MAP_LIBPERL|$(MAP_LIBPERL)|" >>.MM_tmp + $(NOECHO) $(DOC_INSTALL) <.MM_tmp >>].$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q[ + $(NOECHO) $(RM_F) .MM_tmp +]; + + push @m, " +inst_perl : pure_inst_perl doc_inst_perl + \$(NOECHO) \$(NOOP) + +pure_inst_perl : \$(MAP_TARGET) + $self->{CP} \$(MAP_SHRTARGET) ",$self->fixpath($Config{'installbin'},1)," + $self->{CP} \$(MAP_TARGET) ",$self->fixpath($Config{'installbin'},1)," + +clean :: map_clean + \$(NOECHO) \$(NOOP) + +map_clean : + \$(RM_F) ${tmpdir}perlmain\$(OBJ_EXT) ${tmpdir}perlmain.c \$(FIRST_MAKEFILE) + \$(RM_F) ${tmpdir}Makeaperl.Opt ${tmpdir}PerlShr.Opt \$(MAP_TARGET) +"; + + join '', @m; +} + + +# --- Output postprocessing section --- + + +sub maketext_filter { + my($self, $text) = @_; + + $text =~ s/^([^\s:=]+)(:+\s)/$1 $2/mg; + return $text; +} + + +sub prefixify { + my($self, $var, $sprefix, $rprefix, $default) = @_; + + # Translate $(PERLPREFIX) to a real path. + $rprefix = $self->eliminate_macros($rprefix); + $rprefix = vmspath($rprefix) if $rprefix; + $sprefix = vmspath($sprefix) if $sprefix; + + $default = vmsify($default) + unless $default =~ /\[.*\]/; + + (my $var_no_install = $var) =~ s/^install//; + my $path = $self->{uc $var} || + $ExtUtils::MM_Unix::Config_Override{lc $var} || + $Config{lc $var} || $Config{lc $var_no_install}; + + if( !$path ) { + warn " no Config found for $var.\n" if $Verbose >= 2; + $path = $self->_prefixify_default($rprefix, $default); + } + elsif( !$self->{ARGS}{PREFIX} || !$self->file_name_is_absolute($path) ) { + # do nothing if there's no prefix or if its relative + } + elsif( $sprefix eq $rprefix ) { + warn " no new prefix.\n" if $Verbose >= 2; + } + else { + + warn " prefixify $var => $path\n" if $Verbose >= 2; + warn " from $sprefix to $rprefix\n" if $Verbose >= 2; + + my($path_vol, $path_dirs) = $self->splitpath( $path ); + if( $path_vol eq $Config{vms_prefix}.':' ) { + warn " $Config{vms_prefix}: seen\n" if $Verbose >= 2; + + $path_dirs =~ s{^\[}{\[.} unless $path_dirs =~ m{^\[\.}; + $path = $self->_catprefix($rprefix, $path_dirs); + } + else { + $path = $self->_prefixify_default($rprefix, $default); + } + } + + print " now $path\n" if $Verbose >= 2; + return $self->{uc $var} = $path; +} + + +sub _prefixify_default { + my($self, $rprefix, $default) = @_; + + warn " cannot prefix, using default.\n" if $Verbose >= 2; + + if( !$default ) { + warn "No default!\n" if $Verbose >= 1; + return; + } + if( !$rprefix ) { + warn "No replacement prefix!\n" if $Verbose >= 1; + return ''; + } + + return $self->_catprefix($rprefix, $default); +} + +sub _catprefix { + my($self, $rprefix, $default) = @_; + + my($rvol, $rdirs) = $self->splitpath($rprefix); + if( $rvol ) { + return $self->catpath($rvol, + $self->catdir($rdirs, $default), + '' + ) + } + else { + return $self->catdir($rdirs, $default); + } +} + + + +sub cd { + my($self, $dir, @cmds) = @_; + + $dir = vmspath($dir); + + my $cmd = join "\n\t", map "$_", @cmds; + + # No leading tab makes it look right when embedded + my $make_frag = sprintf <<'MAKE_FRAG', $dir, $cmd; +startdir = F$Environment("Default") + Set Default %s + %s + Set Default 'startdir' +MAKE_FRAG + + # No trailing newline makes this easier to embed + chomp $make_frag; + + return $make_frag; +} + + + +sub oneliner { + my($self, $cmd, $switches) = @_; + $switches = [] unless defined $switches; + + # Strip leading and trailing newlines + $cmd =~ s{^\n+}{}; + $cmd =~ s{\n+$}{}; + + my @cmds = split /\n/, $cmd; + $cmd = join " \n\t -e ", map $self->quote_literal($_), @cmds; + $cmd = $self->escape_newlines($cmd); + + # Switches must be quoted else they will be lowercased. + $switches = join ' ', map { qq{"$_"} } @$switches; + + return qq{\$(ABSPERLRUN) $switches -e $cmd "--"}; +} + + + +sub echo { + my($self, $text, $file, $opts) = @_; + + # Compatibility with old options + if( !ref $opts ) { + my $append = $opts; + $opts = { append => $append || 0 }; + } + my $opencmd = $opts->{append} ? 'Open/Append' : 'Open/Write'; + + $opts->{allow_variables} = 0 unless defined $opts->{allow_variables}; + + my $ql_opts = { allow_variables => $opts->{allow_variables} }; + + my @cmds = ("\$(NOECHO) $opencmd MMECHOFILE $file "); + push @cmds, map { '$(NOECHO) Write MMECHOFILE '.$self->quote_literal($_, $ql_opts) } + split /\n/, $text; + push @cmds, '$(NOECHO) Close MMECHOFILE'; + return @cmds; +} + + + +sub quote_literal { + my($self, $text, $opts) = @_; + $opts->{allow_variables} = 1 unless defined $opts->{allow_variables}; + + # I believe this is all we should need. + $text =~ s{"}{""}g; + + $text = $opts->{allow_variables} + ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text); + + return qq{"$text"}; +} + + +sub escape_dollarsigns { + my($self, $text) = @_; + + # Quote dollar signs which are not starting a variable + $text =~ s{\$ (?!\() }{"\$"}gx; + + return $text; +} + + + +sub escape_all_dollarsigns { + my($self, $text) = @_; + + # Quote dollar signs + $text =~ s{\$}{"\$\"}gx; + + return $text; +} + + +sub escape_newlines { + my($self, $text) = @_; + + $text =~ s{\n}{-\n}g; + + return $text; +} + + +sub max_exec_len { + my $self = shift; + + return $self->{_MAX_EXEC_LEN} ||= 256; +} + + +sub init_linker { + my $self = shift; + $self->{EXPORT_LIST} ||= '$(BASEEXT).opt'; + + my $shr = $Config{dbgprefix} . 'PERLSHR'; + if ($self->{PERL_SRC}) { + $self->{PERL_ARCHIVE} ||= + $self->catfile($self->{PERL_SRC}, "$shr.$Config{'dlext'}"); + } + else { + $self->{PERL_ARCHIVE} ||= + $ENV{$shr} ? $ENV{$shr} : "Sys\$Share:$shr.$Config{'dlext'}"; + } + + $self->{PERL_ARCHIVEDEP} ||= ''; + $self->{PERL_ARCHIVE_AFTER} ||= ''; +} + + + +sub catdir { + my $self = shift; + + # Process the macros on VMS MMS/MMK + my @args = map { m{\$\(} ? $self->eliminate_macros($_) : $_ } @_; + + my $dir = $self->SUPER::catdir(@args); + + # Fix up the directory and force it to VMS format. + $dir = $self->fixpath($dir, 1); + + return $dir; +} + +sub catfile { + my $self = shift; + + # Process the macros on VMS MMS/MMK + my @args = map { m{\$\(} ? $self->eliminate_macros($_) : $_ } @_; + + my $file = $self->SUPER::catfile(@args); + + $file = vmsify($file); + + return $file +} + + + +sub eliminate_macros { + my($self,$path) = @_; + return '' unless $path; + $self = {} unless ref $self; + + my($npath) = unixify($path); + # sometimes unixify will return a string with an off-by-one trailing null + $npath =~ s{\0$}{}; + + my($complex) = 0; + my($head,$macro,$tail); + + # perform m##g in scalar context so it acts as an iterator + while ($npath =~ m#(.*?)\$\((\S+?)\)(.*)#gs) { + if (defined $self->{$2}) { + ($head,$macro,$tail) = ($1,$2,$3); + if (ref $self->{$macro}) { + if (ref $self->{$macro} eq 'ARRAY') { + $macro = join ' ', @{$self->{$macro}}; + } + else { + print "Note: can't expand macro \$($macro) containing ",ref($self->{$macro}), + "\n\t(using MMK-specific deferred substitutuon; MMS will break)\n"; + $macro = "\cB$macro\cB"; + $complex = 1; + } + } + else { + $macro = $self->{$macro}; + # Don't unixify if there is unescaped whitespace + $macro = unixify($macro) unless ($macro =~ /(?\]]#) { + if ($force_path or $path =~ /(?:DIR\)|\])\Z(?!\n)/) { + $fixedpath = vmspath($self->eliminate_macros($path)); + } + else { + $fixedpath = vmsify($self->eliminate_macros($path)); + } + } + elsif ((($prefix,$name) = ($path =~ m#^\$\(([^\)]+)\)(.+)#s)) && $self->{$prefix}) { + my($vmspre) = $self->eliminate_macros("\$($prefix)"); + # is it a dir or just a name? + $vmspre = ($vmspre =~ m|/| or $prefix =~ /DIR\Z(?!\n)/) ? vmspath($vmspre) : ''; + $fixedpath = ($vmspre ? $vmspre : $self->{$prefix}) . $name; + $fixedpath = vmspath($fixedpath) if $force_path; + } + else { + $fixedpath = $path; + $fixedpath = vmspath($fixedpath) if $force_path; + } + # No hints, so we try to guess + if (!defined($force_path) and $fixedpath !~ /[:>(.\]]/) { + $fixedpath = vmspath($fixedpath) if -d $fixedpath; + } + + # Trim off root dirname if it's had other dirs inserted in front of it. + $fixedpath =~ s/\.000000([\]>])/$1/; + # Special case for VMS absolute directory specs: these will have had device + # prepended during trip through Unix syntax in eliminate_macros(), since + # Unix syntax has no way to express "absolute from the top of this device's + # directory tree". + if ($path =~ /^[\[>][^.\-]/) { $fixedpath =~ s/^[^\[<]+//; } + + return $fixedpath; +} + + + +sub os_flavor { + return('VMS'); +} + + + +sub is_make_type { + my($self, $type) = @_; + return 0; +} + + + +sub make_type { "$Config{make}-style"; } + + + +1; + +# Avoid version control files. +\bRCS\b +\bCVS\b +\bSCCS\b +,v$ +\B\.svn\b +\B\.git\b +\B\.gitignore\b +\b_darcs\b +\B\.cvsignore$ + +# Avoid VMS specific MakeMaker generated files +\bDescrip.MMS$ +\bDESCRIP.MMS$ +\bdescrip.mms$ + +# Avoid Makemaker generated and utility files. +\bMANIFEST\.bak +\bMakefile$ +\bblib/ +\bMakeMaker-\d +\bpm_to_blib\.ts$ +\bpm_to_blib$ +\bblibdirs\.ts$ # 6.18 through 6.25 generated this +\b_eumm/ # 7.05_05 and above + +# Avoid Module::Build generated and utility files. +\bBuild$ +\b_build/ +\bBuild.bat$ +\bBuild.COM$ +\bBUILD.COM$ +\bbuild.com$ + +# and Module::Build::Tiny generated files +\b_build_params$ + +# Avoid temp and backup files. +~$ +\.old$ +\#$ +\b\.# +\.bak$ +\.tmp$ +\.# +\.rej$ +\..*\.sw.?$ + +# Avoid OS-specific files/dirs +# Mac OSX metadata +\B\.DS_Store +# Mac OSX SMB mount metadata files +\B\._ + +# Avoid Devel::Cover and Devel::CoverX::Covered files. +\bcover_db\b +\bcovered\b + +# Avoid prove files +\B\.prove$ + +# Avoid MYMETA files +^MYMETA\. +package ExtUtils::MM_Unix; + +require 5.006; + +use strict; + +use Carp; +use ExtUtils::MakeMaker::Config; +use File::Basename qw(basename dirname); + +our %Config_Override; + +use ExtUtils::MakeMaker qw($Verbose neatvalue _sprintf562); + +# If we make $VERSION an our variable parse_version() breaks +use vars qw($VERSION); +$VERSION = '7.34'; +$VERSION = eval $VERSION; ## no critic [BuiltinFunctions::ProhibitStringyEval] + +require ExtUtils::MM_Any; +our @ISA = qw(ExtUtils::MM_Any); + +my %Is; +BEGIN { + $Is{OS2} = $^O eq 'os2'; + $Is{Win32} = $^O eq 'MSWin32' || $Config{osname} eq 'NetWare'; + $Is{Dos} = $^O eq 'dos'; + $Is{VMS} = $^O eq 'VMS'; + $Is{OSF} = $^O eq 'dec_osf'; + $Is{IRIX} = $^O eq 'irix'; + $Is{NetBSD} = $^O eq 'netbsd'; + $Is{Interix} = $^O eq 'interix'; + $Is{SunOS4} = $^O eq 'sunos'; + $Is{Solaris} = $^O eq 'solaris'; + $Is{SunOS} = $Is{SunOS4} || $Is{Solaris}; + $Is{BSD} = ($^O =~ /^(?:free|net|open)bsd$/ or + grep( $^O eq $_, qw(bsdos interix dragonfly) ) + ); + $Is{Android} = $^O =~ /android/; +} + +BEGIN { + if( $Is{VMS} ) { + # For things like vmsify() + require VMS::Filespec; + VMS::Filespec->import; + } +} + + + +# So we don't have to keep calling the methods over and over again, +# we have these globals to cache the values. Faster and shrtr. +my $Curdir = __PACKAGE__->curdir; +my $Updir = __PACKAGE__->updir; + + + +sub os_flavor { + return('Unix'); +} + + + +sub c_o { +# --- Translation Sections --- + + my($self) = shift; + return '' unless $self->needs_linking(); + my(@m); + + my $command = '$(CCCMD)'; + my $flags = '$(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE)'; + + if (my $cpp = $Config{cpprun}) { + my $cpp_cmd = $self->const_cccmd; + $cpp_cmd =~ s/^CCCMD\s*=\s*\$\(CC\)/$cpp/; + push @m, qq{ +.c.i: + $cpp_cmd $flags \$*.c > \$*.i +}; + } + + my $m_o = $self->{XSMULTI} ? $self->xs_obj_opt('$*.s') : ''; + push @m, sprintf <<'EOF', $command, $flags, $m_o; + +.c.s : + %s -S %s $*.c %s +EOF + + my @exts = qw(c cpp cxx cc); + push @exts, 'C' if !$Is{OS2} and !$Is{Win32} and !$Is{Dos}; #Case-specific + $m_o = $self->{XSMULTI} ? $self->xs_obj_opt('$*$(OBJ_EXT)') : ''; + for my $ext (@exts) { + push @m, "\n.$ext\$(OBJ_EXT) :\n\t$command $flags \$*.$ext" . ( $m_o ? " $m_o" : '' ) . "\n"; + } + return join "", @m; +} + + + +sub xs_obj_opt { + my ($self, $output_file) = @_; + "-o $output_file"; +} + + + +#' + +sub cflags { + my($self,$libperl)=@_; + return $self->{CFLAGS} if $self->{CFLAGS}; + return '' unless $self->needs_linking(); + + my($prog, $uc, $perltype, %cflags); + $libperl ||= $self->{LIBPERL_A} || "libperl$self->{LIB_EXT}" ; + $libperl =~ s/\.\$\(A\)$/$self->{LIB_EXT}/; + + @cflags{qw(cc ccflags optimize shellflags)} + = @Config{qw(cc ccflags optimize shellflags)}; + + # Perl 5.21.4 adds the (gcc) warning (-Wall ...) and std (-std=c89) + # flags to the %Config, and the modules in the core should be built + # with the warning flags, but NOT the -std=c89 flags (the latter + # would break using any system header files that are strict C99). + my @ccextraflags = qw(ccwarnflags); + if ($ENV{PERL_CORE}) { + for my $x (@ccextraflags) { + if (exists $Config{$x}) { + $cflags{$x} = $Config{$x}; + } + } + } + + my($optdebug) = ""; + + $cflags{shellflags} ||= ''; + + my(%map) = ( + D => '-DDEBUGGING', + E => '-DEMBED', + DE => '-DDEBUGGING -DEMBED', + M => '-DEMBED -DMULTIPLICITY', + DM => '-DDEBUGGING -DEMBED -DMULTIPLICITY', + ); + + if ($libperl =~ /libperl(\w*)\Q$self->{LIB_EXT}/){ + $uc = uc($1); + } else { + $uc = ""; # avoid warning + } + $perltype = $map{$uc} ? $map{$uc} : ""; + + if ($uc =~ /^D/) { + $optdebug = "-g"; + } + + + my($name); + ( $name = $self->{NAME} . "_cflags" ) =~ s/:/_/g ; + if ($prog = $Config{$name}) { + # Expand hints for this extension via the shell + print "Processing $name hint:\n" if $Verbose; + my(@o)=`cc=\"$cflags{cc}\" + ccflags=\"$cflags{ccflags}\" + optimize=\"$cflags{optimize}\" + perltype=\"$cflags{perltype}\" + optdebug=\"$cflags{optdebug}\" + eval '$prog' + echo cc=\$cc + echo ccflags=\$ccflags + echo optimize=\$optimize + echo perltype=\$perltype + echo optdebug=\$optdebug + `; + foreach my $line (@o){ + chomp $line; + if ($line =~ /(.*?)=\s*(.*)\s*$/){ + $cflags{$1} = $2; + print " $1 = $2\n" if $Verbose; + } else { + print "Unrecognised result from hint: '$line'\n"; + } + } + } + + if ($optdebug) { + $cflags{optimize} = $optdebug; + } + + for (qw(ccflags optimize perltype)) { + $cflags{$_} ||= ''; + $cflags{$_} =~ s/^\s+//; + $cflags{$_} =~ s/\s+/ /g; + $cflags{$_} =~ s/\s+$//; + $self->{uc $_} ||= $cflags{$_}; + } + + if ($self->{POLLUTE}) { + $self->{CCFLAGS} .= ' -DPERL_POLLUTE '; + } + + for my $x (@ccextraflags) { + next unless exists $cflags{$x}; + $self->{CCFLAGS} .= $cflags{$x} =~ m!^\s! ? $cflags{$x} : ' ' . $cflags{$x}; + } + + my $pollute = ''; + if ($Config{usemymalloc} and not $Config{bincompat5005} + and not $Config{ccflags} =~ /-DPERL_POLLUTE_MALLOC\b/ + and $self->{PERL_MALLOC_OK}) { + $pollute = '$(PERL_MALLOC_DEF)'; + } + + return $self->{CFLAGS} = qq{ +CCFLAGS = $self->{CCFLAGS} +OPTIMIZE = $self->{OPTIMIZE} +PERLTYPE = $self->{PERLTYPE} +MPOLLUTE = $pollute +}; + +} + + + +sub const_cccmd { + my($self,$libperl)=@_; + return $self->{CONST_CCCMD} if $self->{CONST_CCCMD}; + return '' unless $self->needs_linking(); + return $self->{CONST_CCCMD} = + q{CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \\ + $(CCFLAGS) $(OPTIMIZE) \\ + $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \\ + $(XS_DEFINE_VERSION)}; +} + + +sub const_config { +# --- Constants Sections --- + + my($self) = shift; + my @m = $self->specify_shell(); # Usually returns empty string + push @m, <<"END"; + +# These definitions are from config.sh (via $INC{'Config.pm'}). +# They may have been overridden via Makefile.PL or on the command line. +END + + my(%once_only); + foreach my $key (@{$self->{CONFIG}}){ + # SITE*EXP macros are defined in &constants; avoid duplicates here + next if $once_only{$key}; + push @m, uc($key) , ' = ' , $self->{uc $key}, "\n"; + $once_only{$key} = 1; + } + join('', @m); +} + + +sub const_loadlibs { + my($self) = shift; + return "" unless $self->needs_linking; + my @m; + push @m, qq{ +# $self->{NAME} might depend on some other libraries: +# See ExtUtils::Liblist for details +# +}; + for my $tmp (qw/ + EXTRALIBS LDLOADLIBS BSLOADLIBS + /) { + next unless defined $self->{$tmp}; + push @m, "$tmp = $self->{$tmp}\n"; + } + # don't set LD_RUN_PATH if empty + for my $tmp (qw/ + LD_RUN_PATH + /) { + next unless $self->{$tmp}; + push @m, "$tmp = $self->{$tmp}\n"; + } + return join "", @m; +} + + +sub constants { + my($self) = @_; + my @m = (); + + $self->{DFSEP} = '$(DIRFILESEP)'; # alias for internal use + + for my $macro (qw( + + AR_STATIC_ARGS DIRFILESEP DFSEP + NAME NAME_SYM + VERSION VERSION_MACRO VERSION_SYM DEFINE_VERSION + XS_VERSION XS_VERSION_MACRO XS_DEFINE_VERSION + INST_ARCHLIB INST_SCRIPT INST_BIN INST_LIB + INST_MAN1DIR INST_MAN3DIR + MAN1EXT MAN3EXT + INSTALLDIRS INSTALL_BASE DESTDIR PREFIX + PERLPREFIX SITEPREFIX VENDORPREFIX + ), + (map { ("INSTALL".$_, + "DESTINSTALL".$_) + } $self->installvars), + qw( + PERL_LIB + PERL_ARCHLIB PERL_ARCHLIBDEP + LIBPERL_A MYEXTLIB + FIRST_MAKEFILE MAKEFILE_OLD MAKE_APERL_FILE + PERLMAINCC PERL_SRC PERL_INC PERL_INCDEP + PERL FULLPERL ABSPERL + PERLRUN FULLPERLRUN ABSPERLRUN + PERLRUNINST FULLPERLRUNINST ABSPERLRUNINST + PERL_CORE + PERM_DIR PERM_RW PERM_RWX + + ) ) + { + next unless defined $self->{$macro}; + + # pathnames can have sharp signs in them; escape them so + # make doesn't think it is a comment-start character. + $self->{$macro} =~ s/#/\\#/g; + $self->{$macro} = $self->quote_dep($self->{$macro}) + if $ExtUtils::MakeMaker::macro_dep{$macro}; + push @m, "$macro = $self->{$macro}\n"; + } + + push @m, qq{ +MAKEMAKER = $self->{MAKEMAKER} +MM_VERSION = $self->{MM_VERSION} +MM_REVISION = $self->{MM_REVISION} +}; + + push @m, q{ +# FULLEXT = Pathname for extension directory (eg Foo/Bar/Oracle). +# BASEEXT = Basename part of FULLEXT. May be just equal FULLEXT. (eg Oracle) +# PARENT_NAME = NAME without BASEEXT and no trailing :: (eg Foo::Bar) +# DLBASE = Basename part of dynamic library. May be just equal BASEEXT. +}; + + for my $macro (qw/ + MAKE + FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT + LDFROM LINKTYPE BOOTDEP + / ) + { + next unless defined $self->{$macro}; + push @m, "$macro = $self->{$macro}\n"; + } + + push @m, " +# Handy lists of source code files: +XS_FILES = ".$self->wraplist(sort keys %{$self->{XS}})." +C_FILES = ".$self->wraplist(sort @{$self->{C}})." +O_FILES = ".$self->wraplist(sort @{$self->{O_FILES}})." +H_FILES = ".$self->wraplist(sort @{$self->{H}})." +MAN1PODS = ".$self->wraplist(sort keys %{$self->{MAN1PODS}})." +MAN3PODS = ".$self->wraplist(sort keys %{$self->{MAN3PODS}})." +"; + + + push @m, q{ +# Where is the Config information that we are using/depend on +CONFIGDEP = $(PERL_ARCHLIBDEP)$(DFSEP)Config.pm $(PERL_INCDEP)$(DFSEP)config.h +} if -e $self->catfile( $self->{PERL_INC}, 'config.h' ); + + + push @m, qq{ +# Where to build things +INST_LIBDIR = $self->{INST_LIBDIR} +INST_ARCHLIBDIR = $self->{INST_ARCHLIBDIR} + +INST_AUTODIR = $self->{INST_AUTODIR} +INST_ARCHAUTODIR = $self->{INST_ARCHAUTODIR} + +INST_STATIC = $self->{INST_STATIC} +INST_DYNAMIC = $self->{INST_DYNAMIC} +INST_BOOT = $self->{INST_BOOT} +}; + + push @m, qq{ +# Extra linker info +EXPORT_LIST = $self->{EXPORT_LIST} +PERL_ARCHIVE = $self->{PERL_ARCHIVE} +PERL_ARCHIVEDEP = $self->{PERL_ARCHIVEDEP} +PERL_ARCHIVE_AFTER = $self->{PERL_ARCHIVE_AFTER} +}; + + push @m, " + +TO_INST_PM = ".$self->wraplist(map $self->quote_dep($_), sort keys %{$self->{PM}})."\n"; + + join('',@m); +} + + + +sub depend { + my($self,%attribs) = @_; + my(@m,$key,$val); + for my $key (sort keys %attribs){ + my $val = $attribs{$key}; + next unless defined $key and defined $val; + push @m, "$key : $val\n"; + } + join "", @m; +} + + + +sub init_DEST { + my $self = shift; + + # Initialize DESTDIR + $self->{DESTDIR} ||= ''; + + # Make DEST variables. + foreach my $var ($self->installvars) { + my $destvar = 'DESTINSTALL'.$var; + $self->{$destvar} ||= '$(DESTDIR)$(INSTALL'.$var.')'; + } +} + + + +sub init_dist { + my $self = shift; + + $self->{TAR} ||= 'tar'; + $self->{TARFLAGS} ||= 'cvf'; + $self->{ZIP} ||= 'zip'; + $self->{ZIPFLAGS} ||= '-r'; + $self->{COMPRESS} ||= 'gzip --best'; + $self->{SUFFIX} ||= '.gz'; + $self->{SHAR} ||= 'shar'; + $self->{PREOP} ||= '$(NOECHO) $(NOOP)'; # eg update MANIFEST + $self->{POSTOP} ||= '$(NOECHO) $(NOOP)'; # eg remove the distdir + $self->{TO_UNIX} ||= '$(NOECHO) $(NOOP)'; + + $self->{CI} ||= 'ci -u'; + $self->{RCS_LABEL}||= 'rcs -Nv$(VERSION_SYM): -q'; + $self->{DIST_CP} ||= 'best'; + $self->{DIST_DEFAULT} ||= 'tardist'; + + ($self->{DISTNAME} = $self->{NAME}) =~ s{::}{-}g unless $self->{DISTNAME}; + $self->{DISTVNAME} ||= $self->{DISTNAME}.'-'.$self->{VERSION}; +} + + +sub dist { + my($self, %attribs) = @_; + + my $make = ''; + if ( $attribs{SUFFIX} && $attribs{SUFFIX} !~ m!^\.! ) { + $attribs{SUFFIX} = '.' . $attribs{SUFFIX}; + } + foreach my $key (qw( + TAR TARFLAGS ZIP ZIPFLAGS COMPRESS SUFFIX SHAR + PREOP POSTOP TO_UNIX + CI RCS_LABEL DIST_CP DIST_DEFAULT + DISTNAME DISTVNAME + )) + { + my $value = $attribs{$key} || $self->{$key}; + $make .= "$key = $value\n"; + } + + return $make; +} + + +sub dist_basics { + my($self) = shift; + + return <<'MAKE_FRAG'; +distclean :: realclean distcheck + $(NOECHO) $(NOOP) + +distcheck : + $(PERLRUN) "-MExtUtils::Manifest=fullcheck" -e fullcheck + +skipcheck : + $(PERLRUN) "-MExtUtils::Manifest=skipcheck" -e skipcheck + +manifest : + $(PERLRUN) "-MExtUtils::Manifest=mkmanifest" -e mkmanifest + +veryclean : realclean + $(RM_F) *~ */*~ *.orig */*.orig *.bak */*.bak *.old */*.old + +MAKE_FRAG + +} + + +sub dist_ci { + my($self) = shift; + return sprintf "ci :\n\t%s\n", $self->oneliner(<<'EOF', [qw(-MExtUtils::Manifest=maniread)]); +@all = sort keys %{ maniread() }; +print(qq{Executing $(CI) @all\n}); +system(qq{$(CI) @all}) == 0 or die $!; +print(qq{Executing $(RCS_LABEL) ...\n}); +system(qq{$(RCS_LABEL) @all}) == 0 or die $!; +EOF +} + + +sub dist_core { + my($self) = shift; + + my $make_frag = ''; + foreach my $target (qw(dist tardist uutardist tarfile zipdist zipfile + shdist)) + { + my $method = $target.'_target'; + $make_frag .= "\n"; + $make_frag .= $self->$method(); + } + + return $make_frag; +} + + + +sub dist_target { + my($self) = shift; + + my $date_check = $self->oneliner(<<'CODE', ['-l']); +print 'Warning: Makefile possibly out of date with $(VERSION_FROM)' + if -e '$(VERSION_FROM)' and -M '$(VERSION_FROM)' < -M '$(FIRST_MAKEFILE)'; +CODE + + return sprintf <<'MAKE_FRAG', $date_check; +dist : $(DIST_DEFAULT) $(FIRST_MAKEFILE) + $(NOECHO) %s +MAKE_FRAG +} + + +sub tardist_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +tardist : $(DISTVNAME).tar$(SUFFIX) + $(NOECHO) $(NOOP) +MAKE_FRAG +} + + +sub zipdist_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +zipdist : $(DISTVNAME).zip + $(NOECHO) $(NOOP) +MAKE_FRAG +} + + +sub tarfile_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +$(DISTVNAME).tar$(SUFFIX) : distdir + $(PREOP) + $(TO_UNIX) + $(TAR) $(TARFLAGS) $(DISTVNAME).tar $(DISTVNAME) + $(RM_RF) $(DISTVNAME) + $(COMPRESS) $(DISTVNAME).tar + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)' + $(POSTOP) +MAKE_FRAG +} + + +sub zipfile_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +$(DISTVNAME).zip : distdir + $(PREOP) + $(ZIP) $(ZIPFLAGS) $(DISTVNAME).zip $(DISTVNAME) + $(RM_RF) $(DISTVNAME) + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).zip' + $(POSTOP) +MAKE_FRAG +} + + +sub uutardist_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +uutardist : $(DISTVNAME).tar$(SUFFIX) + uuencode $(DISTVNAME).tar$(SUFFIX) $(DISTVNAME).tar$(SUFFIX) > $(DISTVNAME).tar$(SUFFIX)_uu + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).tar$(SUFFIX)_uu' +MAKE_FRAG +} + + + +sub shdist_target { + my($self) = shift; + + return <<'MAKE_FRAG'; +shdist : distdir + $(PREOP) + $(SHAR) $(DISTVNAME) > $(DISTVNAME).shar + $(RM_RF) $(DISTVNAME) + $(NOECHO) $(ECHO) 'Created $(DISTVNAME).shar' + $(POSTOP) +MAKE_FRAG +} + + + +sub dlsyms { + return ''; +} + + + +sub dynamic_bs { + my($self, %attribs) = @_; + return "\nBOOTSTRAP =\n" unless $self->has_link_code(); + my @exts; + if ($self->{XSMULTI}) { + @exts = $self->_xs_list_basenames; + } else { + @exts = '$(BASEEXT)'; + } + return join "\n", + "BOOTSTRAP = @{[map { qq{$_.bs} } @exts]}\n", + map { $self->_xs_make_bs($_) } @exts; +} + +sub _xs_make_bs { + my ($self, $basename) = @_; + my ($v, $d, $f) = File::Spec->splitpath($basename); + my @d = File::Spec->splitdir($d); + shift @d if $self->{XSMULTI} and $d[0] eq 'lib'; + my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f); + $instdir = '$(INST_ARCHAUTODIR)' if $basename eq '$(BASEEXT)'; + my $instfile = $self->catfile($instdir, "$f.bs"); + my $exists = "$instdir\$(DFSEP).exists"; # match blibdirs_target + # 1 2 3 + return _sprintf562 <<'MAKE_FRAG', $basename, $instfile, $exists; +# As Mkbootstrap might not write a file (if none is required) +# we use touch to prevent make continually trying to remake it. +# The DynaLoader only reads a non-empty file. +%1$s.bs : $(FIRST_MAKEFILE) $(BOOTDEP) + $(NOECHO) $(ECHO) "Running Mkbootstrap for %1$s ($(BSLOADLIBS))" + $(NOECHO) $(PERLRUN) \ + "-MExtUtils::Mkbootstrap" \ + -e "Mkbootstrap('%1$s','$(BSLOADLIBS)');" + $(NOECHO) $(TOUCH) "%1$s.bs" + $(CHMOD) $(PERM_RW) "%1$s.bs" + +%2$s : %1$s.bs %3$s + $(NOECHO) $(RM_RF) %2$s + - $(CP_NONEMPTY) %1$s.bs %2$s $(PERM_RW) +MAKE_FRAG +} + + +sub dynamic_lib { + my($self, %attribs) = @_; + return '' unless $self->needs_linking(); #might be because of a subdir + return '' unless $self->has_link_code; + my @m = $self->xs_dynamic_lib_macros(\%attribs); + my @libs; + my $dlsyms_ext = eval { $self->xs_dlsyms_ext }; + if ($self->{XSMULTI}) { + my @exts = $self->_xs_list_basenames; + for my $ext (@exts) { + my ($v, $d, $f) = File::Spec->splitpath($ext); + my @d = File::Spec->splitdir($d); + shift @d if $d[0] eq 'lib'; + my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f); + + # Dynamic library names may need special handling. + eval { require DynaLoader }; + if (defined &DynaLoader::mod2fname) { + $f = &DynaLoader::mod2fname([@d, $f]); + } + + my $instfile = $self->catfile($instdir, "$f.\$(DLEXT)"); + my $objfile = $self->_xsbuild_value('xs', $ext, 'OBJECT'); + $objfile = "$ext\$(OBJ_EXT)" unless defined $objfile; + my $ldfrom = $self->_xsbuild_value('xs', $ext, 'LDFROM'); + $ldfrom = $objfile unless defined $ldfrom; + my $exportlist = "$ext.def"; + my @libchunk = ($objfile, $instfile, $instdir, $ldfrom, $exportlist); + push @libchunk, $dlsyms_ext ? $ext.$dlsyms_ext : undef; + push @libs, \@libchunk; + } + } else { + my @libchunk = qw($(OBJECT) $(INST_DYNAMIC) $(INST_ARCHAUTODIR) $(LDFROM) $(EXPORT_LIST)); + push @libchunk, $dlsyms_ext ? '$(BASEEXT)'.$dlsyms_ext : undef; + @libs = (\@libchunk); + } + push @m, map { $self->xs_make_dynamic_lib(\%attribs, @$_); } @libs; + + return join("\n",@m); +} + + +sub xs_dynamic_lib_macros { + my ($self, $attribs) = @_; + my $otherldflags = $attribs->{OTHERLDFLAGS} || ""; + my $inst_dynamic_dep = $attribs->{INST_DYNAMIC_DEP} || ""; + my $armaybe = $self->_xs_armaybe($attribs); + my $ld_opt = $Is{OS2} ? '$(OPTIMIZE) ' : ''; # Useful on other systems too? + my $ld_fix = $Is{OS2} ? '|| ( $(RM_F) $@ && sh -c false )' : ''; + sprintf <<'EOF', $armaybe, $ld_opt.$otherldflags, $inst_dynamic_dep, $ld_fix; +# This section creates the dynamically loadable objects from relevant +# objects and possibly $(MYEXTLIB). +ARMAYBE = %s +OTHERLDFLAGS = %s +INST_DYNAMIC_DEP = %s +INST_DYNAMIC_FIX = %s +EOF +} + +sub _xs_armaybe { + my ($self, $attribs) = @_; + my $armaybe = $attribs->{ARMAYBE} || $self->{ARMAYBE} || ":"; + $armaybe = 'ar' if ($Is{OSF} and $armaybe eq ':'); + $armaybe; +} + + +sub xs_make_dynamic_lib { + my ($self, $attribs, $object, $to, $todir, $ldfrom, $exportlist, $dlsyms) = @_; + $exportlist = '' if $exportlist ne '$(EXPORT_LIST)'; + my $armaybe = $self->_xs_armaybe($attribs); + my @m = sprintf '%s : %s $(MYEXTLIB) %s$(DFSEP).exists %s $(PERL_ARCHIVEDEP) $(PERL_ARCHIVE_AFTER) $(INST_DYNAMIC_DEP) %s'."\n", $to, $object, $todir, $exportlist, ($dlsyms || ''); + my $dlsyms_arg = $self->xs_dlsyms_arg($dlsyms); + if ($armaybe ne ':'){ + $ldfrom = 'tmp$(LIB_EXT)'; + push(@m," \$(ARMAYBE) cr $ldfrom $object\n"); + push(@m," \$(RANLIB) $ldfrom\n"); + } + $ldfrom = "-all $ldfrom -none" if $Is{OSF}; + + # The IRIX linker doesn't use LD_RUN_PATH + my $ldrun = $Is{IRIX} && $self->{LD_RUN_PATH} ? + qq{-rpath "$self->{LD_RUN_PATH}"} : ''; + + # For example in AIX the shared objects/libraries from previous builds + # linger quite a while in the shared dynalinker cache even when nobody + # is using them. This is painful if one for instance tries to restart + # a failed build because the link command will fail unnecessarily 'cos + # the shared object/library is 'busy'. + push(@m," \$(RM_F) \$\@\n"); + + my $libs = '$(LDLOADLIBS)'; + if (($Is{NetBSD} || $Is{Interix} || $Is{Android}) && $Config{'useshrplib'} eq 'true') { + # Use nothing on static perl platforms, and to the flags needed + # to link against the shared libperl library on shared perl + # platforms. We peek at lddlflags to see if we need -Wl,-R + # or -R to add paths to the run-time library search path. + if ($Config{'lddlflags'} =~ /-Wl,-R/) { + $libs .= ' "-L$(PERL_INC)" "-Wl,-R$(INSTALLARCHLIB)/CORE" "-Wl,-R$(PERL_ARCHLIB)/CORE" -lperl'; + } elsif ($Config{'lddlflags'} =~ /-R/) { + $libs .= ' "-L$(PERL_INC)" "-R$(INSTALLARCHLIB)/CORE" "-R$(PERL_ARCHLIB)/CORE" -lperl'; + } elsif ( $Is{Android} ) { + # The Android linker will not recognize symbols from + # libperl unless the module explicitly depends on it. + $libs .= ' "-L$(PERL_INC)" -lperl'; + } + } + + my $ld_run_path_shell = ""; + if ($self->{LD_RUN_PATH} ne "") { + $ld_run_path_shell = 'LD_RUN_PATH="$(LD_RUN_PATH)" '; + } + + push @m, sprintf <<'MAKE', $ld_run_path_shell, $ldrun, $dlsyms_arg, $ldfrom, $self->xs_obj_opt('$@'), $libs, $exportlist; + %s$(LD) %s $(LDDLFLAGS) %s %s $(OTHERLDFLAGS) %s $(MYEXTLIB) \ + $(PERL_ARCHIVE) %s $(PERL_ARCHIVE_AFTER) %s \ + $(INST_DYNAMIC_FIX) + $(CHMOD) $(PERM_RWX) $@ +MAKE + join '', @m; +} + + +sub exescan { + my($self,$path) = @_; + $path; +} + + +sub extliblist { + my($self,$libs) = @_; + require ExtUtils::Liblist; + $self->ext($libs, $Verbose); +} + + +sub find_perl { + my($self, $ver, $names, $dirs, $trace) = @_; + + if ($trace >= 2){ + print "Looking for perl $ver by these names: +@$names +in these dirs: +@$dirs +"; + } + + my $stderr_duped = 0; + local *STDERR_COPY; + + unless ($Is{BSD}) { + # >& and lexical filehandles together give 5.6.2 indigestion + if( open(STDERR_COPY, '>&STDERR') ) { ## no critic + $stderr_duped = 1; + } + else { + warn <file_name_is_absolute($name)) { # /foo/bar + $abs = $name; + } elsif ($self->canonpath($name) eq + $self->canonpath(basename($name))) { # foo + $use_dir = 1; + } else { # foo/bar + $abs = $self->catfile($Curdir, $name); + } + foreach my $dir ($use_dir ? @$dirs : 1){ + next unless defined $dir; # $self->{PERL_SRC} may be undefined + + $abs = $self->catfile($dir, $name) + if $use_dir; + + print "Checking $abs\n" if ($trace >= 2); + next unless $self->maybe_command($abs); + print "Executing $abs\n" if ($trace >= 2); + + my $val; + my $version_check = qq{"$abs" -le "require $ver; print qq{VER_OK}"}; + + # To avoid using the unportable 2>&1 to suppress STDERR, + # we close it before running the command. + # However, thanks to a thread library bug in many BSDs + # ( http://www.freebsd.org/cgi/query-pr.cgi?pr=51535 ) + # we cannot use the fancier more portable way in here + # but instead need to use the traditional 2>&1 construct. + if ($Is{BSD}) { + $val = `$version_check 2>&1`; + } else { + close STDERR if $stderr_duped; + $val = `$version_check`; + + # 5.6.2's 3-arg open doesn't work with >& + open STDERR, ">&STDERR_COPY" ## no critic + if $stderr_duped; + } + + if ($val =~ /^VER_OK/m) { + print "Using PERL=$abs\n" if $trace; + return $abs; + } elsif ($trace >= 2) { + print "Result: '$val' ".($? >> 8)."\n"; + } + } + } + print "Unable to find a perl $ver (by these names: @$names, in these dirs: @$dirs)\n"; + 0; # false and not empty +} + + + +sub fixin { # stolen from the pink Camel book, more or less + my ( $self, @files ) = @_; + + for my $file (@files) { + my $file_new = "$file.new"; + my $file_bak = "$file.bak"; + + open( my $fixin, '<', $file ) or croak "Can't process '$file': $!"; + local $/ = "\n"; + chomp( my $line = <$fixin> ); + next unless $line =~ s/^\s*\#!\s*//; # Not a shebang file. + + my $shb = $self->_fixin_replace_shebang( $file, $line ); + next unless defined $shb; + + open( my $fixout, ">", "$file_new" ) or do { + warn "Can't create new $file: $!\n"; + next; + }; + + # Print out the new #! line (or equivalent). + local $\; + local $/; + print $fixout $shb, <$fixin>; + close $fixin; + close $fixout; + + chmod 0666, $file_bak; + unlink $file_bak; + unless ( _rename( $file, $file_bak ) ) { + warn "Can't rename $file to $file_bak: $!"; + next; + } + unless ( _rename( $file_new, $file ) ) { + warn "Can't rename $file_new to $file: $!"; + unless ( _rename( $file_bak, $file ) ) { + warn "Can't rename $file_bak back to $file either: $!"; + warn "Leaving $file renamed as $file_bak\n"; + } + next; + } + unlink $file_bak; + } + continue { + system("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':'; + } +} + + +sub _rename { + my($old, $new) = @_; + + foreach my $file ($old, $new) { + if( $Is{VMS} and basename($file) !~ /\./ ) { + # rename() in 5.8.0 on VMS will not rename a file if it + # does not contain a dot yet it returns success. + $file = "$file."; + } + } + + return rename($old, $new); +} + +sub _fixin_replace_shebang { + my ( $self, $file, $line ) = @_; + + # Now figure out the interpreter name. + my ( $cmd, $arg ) = split ' ', $line, 2; + $cmd =~ s!^.*/!!; + + # Now look (in reverse) for interpreter in absolute PATH (unless perl). + my $interpreter; + if ( $cmd =~ m{^perl(?:\z|[^a-z])} ) { + if ( $Config{startperl} =~ m,^\#!.*/perl, ) { + $interpreter = $Config{startperl}; + $interpreter =~ s,^\#!,,; + } + else { + $interpreter = $Config{perlpath}; + } + } + else { + my (@absdirs) + = reverse grep { $self->file_name_is_absolute($_) } $self->path; + $interpreter = ''; + + foreach my $dir (@absdirs) { + my $maybefile = $self->catfile($dir,$cmd); + if ( $self->maybe_command($maybefile) ) { + warn "Ignoring $interpreter in $file\n" + if $Verbose && $interpreter; + $interpreter = $maybefile; + } + } + } + + # Figure out how to invoke interpreter on this machine. + + my ($does_shbang) = $Config{'sharpbang'} =~ /^\s*\#\!/; + my ($shb) = ""; + if ($interpreter) { + print "Changing sharpbang in $file to $interpreter" + if $Verbose; + # this is probably value-free on DOSISH platforms + if ($does_shbang) { + $shb .= "$Config{'sharpbang'}$interpreter"; + $shb .= ' ' . $arg if defined $arg; + $shb .= "\n"; + } + } + else { + warn "Can't find $cmd in PATH, $file unchanged" + if $Verbose; + return; + } + return $shb +} + + +sub force { + my($self) = shift; + '# Phony target to force checking subdirectories. +FORCE : + $(NOECHO) $(NOOP) +'; +} + + +# '; + +sub guess_name { + my($self) = @_; + use Cwd 'cwd'; + my $name = basename(cwd()); + $name =~ s|[\-_][\d\.\-]+\z||; # this is new with MM 5.00, we + # strip minus or underline + # followed by a float or some such + print "Warning: Guessing NAME [$name] from current directory name.\n"; + $name; +} + + +sub has_link_code { + my($self) = shift; + return $self->{HAS_LINK_CODE} if defined $self->{HAS_LINK_CODE}; + if ($self->{OBJECT} or @{$self->{C} || []} or $self->{MYEXTLIB}){ + $self->{HAS_LINK_CODE} = 1; + return 1; + } + return $self->{HAS_LINK_CODE} = 0; +} + + + +sub init_dirscan { # --- File and Directory Lists (.xs .pm .pod etc) + my($self) = @_; + my(%dir, %xs, %c, %o, %h, %pl_files, %pm); + + my %ignore = map {( $_ => 1 )} qw(Makefile.PL Build.PL test.pl t); + + # ignore the distdir + $Is{VMS} ? $ignore{"$self->{DISTVNAME}.dir"} = 1 + : $ignore{$self->{DISTVNAME}} = 1; + + my $distprefix = $Is{VMS} ? qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+\.dir$/i + : qr/^\Q$self->{DISTNAME}\E-v?[\d\.]+$/; + + @ignore{map lc, keys %ignore} = values %ignore if $Is{VMS}; + + if ( defined $self->{XS} and !defined $self->{C} ) { + my @c_files = grep { m/\.c(pp|xx)?\z/i } values %{$self->{XS}}; + my @o_files = grep { m/(?:.(?:o(?:bj)?)|\$\(OBJ_EXT\))\z/i } values %{$self->{XS}}; + %c = map { $_ => 1 } @c_files; + %o = map { $_ => 1 } @o_files; + } + + foreach my $name ($self->lsdir($Curdir)){ + next if $name =~ /\#/; + next if $name =~ $distprefix && -d $name; + $name = lc($name) if $Is{VMS}; + next if $name eq $Curdir or $name eq $Updir or $ignore{$name}; + next unless $self->libscan($name); + if (-d $name){ + next if -l $name; # We do not support symlinks at all + next if $self->{NORECURS}; + $dir{$name} = $name if (-f $self->catfile($name,"Makefile.PL")); + } elsif ($name =~ /\.xs\z/){ + my($c); ($c = $name) =~ s/\.xs\z/.c/; + $xs{$name} = $c; + $c{$c} = 1; + } elsif ($name =~ /\.c(pp|xx|c)?\z/i){ # .c .C .cpp .cxx .cc + $c{$name} = 1 + unless $name =~ m/perlmain\.c/; # See MAP_TARGET + } elsif ($name =~ /\.h\z/i){ + $h{$name} = 1; + } elsif ($name =~ /\.PL\z/) { + ($pl_files{$name} = $name) =~ s/\.PL\z// ; + } elsif (($Is{VMS} || $Is{Dos}) && $name =~ /[._]pl$/i) { + # case-insensitive filesystem, one dot per name, so foo.h.PL + # under Unix appears as foo.h_pl under VMS or fooh.pl on Dos + local($/); open(my $pl, '<', $name); my $txt = <$pl>; close $pl; + if ($txt =~ /Extracting \S+ \(with variable substitutions/) { + ($pl_files{$name} = $name) =~ s/[._]pl\z//i ; + } + else { + $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name); + } + } elsif ($name =~ /\.(p[ml]|pod)\z/){ + $pm{$name} = $self->catfile($self->{INST_LIBDIR},$name); + } + } + + $self->{PL_FILES} ||= \%pl_files; + $self->{DIR} ||= [sort keys %dir]; + $self->{XS} ||= \%xs; + $self->{C} ||= [sort keys %c]; + $self->{H} ||= [sort keys %h]; + $self->{PM} ||= \%pm; + + my @o_files = @{$self->{C}}; + %o = (%o, map { $_ => 1 } grep s/\.c(pp|xx|c)?\z/$self->{OBJ_EXT}/i, @o_files); + $self->{O_FILES} = [sort keys %o]; +} + + + +sub init_MANPODS { + my $self = shift; + + # Set up names of manual pages to generate from pods + foreach my $man (qw(MAN1 MAN3)) { + if ( $self->{"${man}PODS"} + or $self->{"INSTALL${man}DIR"} =~ /^(none|\s*)$/ + ) { + $self->{"${man}PODS"} ||= {}; + } + else { + my $init_method = "init_${man}PODS"; + $self->$init_method(); + } + } +} + + +sub _has_pod { + my($self, $file) = @_; + + my($ispod)=0; + if (open( my $fh, '<', $file )) { + while (<$fh>) { + if (/^=(?:head\d+|item|pod)\b/) { + $ispod=1; + last; + } + } + close $fh; + } else { + # If it doesn't exist yet, we assume, it has pods in it + $ispod = 1; + } + + return $ispod; +} + + + +sub init_MAN1PODS { + my($self) = @_; + + if ( exists $self->{EXE_FILES} ) { + foreach my $name (@{$self->{EXE_FILES}}) { + next unless $self->_has_pod($name); + + $self->{MAN1PODS}->{$name} = + $self->catfile("\$(INST_MAN1DIR)", + basename($name).".\$(MAN1EXT)"); + } + } +} + + + +sub init_MAN3PODS { + my $self = shift; + + my %manifypods = (); # we collect the keys first, i.e. the files + # we have to convert to pod + + foreach my $name (keys %{$self->{PM}}) { + if ($name =~ /\.pod\z/ ) { + $manifypods{$name} = $self->{PM}{$name}; + } elsif ($name =~ /\.p[ml]\z/ ) { + if( $self->_has_pod($name) ) { + $manifypods{$name} = $self->{PM}{$name}; + } + } + } + + my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}}; + + # Remove "Configure.pm" and similar, if it's not the only pod listed + # To force inclusion, just name it "Configure.pod", or override + # MAN3PODS + foreach my $name (keys %manifypods) { + if ( + ($self->{PERL_CORE} and $name =~ /(config|setup).*\.pm/is) or + ( $name =~ m/^README\.pod$/i ) # don't manify top-level README.pod + ) { + delete $manifypods{$name}; + next; + } + my($manpagename) = $name; + $manpagename =~ s/\.p(od|m|l)\z//; + # everything below lib is ok + unless($manpagename =~ s!^\W*($parentlibs_re)\W+!!s) { + $manpagename = $self->catfile( + split(/::/,$self->{PARENT_NAME}),$manpagename + ); + } + $manpagename = $self->replace_manpage_separator($manpagename); + $self->{MAN3PODS}->{$name} = + $self->catfile("\$(INST_MAN3DIR)", "$manpagename.\$(MAN3EXT)"); + } +} + + + +sub init_PM { + my $self = shift; + + # Some larger extensions often wish to install a number of *.pm/pl + # files into the library in various locations. + + # The attribute PMLIBDIRS holds an array reference which lists + # subdirectories which we should search for library files to + # install. PMLIBDIRS defaults to [ 'lib', $self->{BASEEXT} ]. We + # recursively search through the named directories (skipping any + # which don't exist or contain Makefile.PL files). + + # For each *.pm or *.pl file found $self->libscan() is called with + # the default installation path in $_[1]. The return value of + # libscan defines the actual installation location. The default + # libscan function simply returns the path. The file is skipped + # if libscan returns false. + + # The default installation location passed to libscan in $_[1] is: + # + # ./*.pm => $(INST_LIBDIR)/*.pm + # ./xyz/... => $(INST_LIBDIR)/xyz/... + # ./lib/... => $(INST_LIB)/... + # + # In this way the 'lib' directory is seen as the root of the actual + # perl library whereas the others are relative to INST_LIBDIR + # (which includes PARENT_NAME). This is a subtle distinction but one + # that's important for nested modules. + + unless( $self->{PMLIBDIRS} ) { + if( $Is{VMS} ) { + # Avoid logical name vs directory collisions + $self->{PMLIBDIRS} = ['./lib', "./$self->{BASEEXT}"]; + } + else { + $self->{PMLIBDIRS} = ['lib', $self->{BASEEXT}]; + } + } + + #only existing directories that aren't in $dir are allowed + + # Avoid $_ wherever possible: + # @{$self->{PMLIBDIRS}} = grep -d && !$dir{$_}, @{$self->{PMLIBDIRS}}; + my (@pmlibdirs) = @{$self->{PMLIBDIRS}}; + @{$self->{PMLIBDIRS}} = (); + my %dir = map { ($_ => $_) } @{$self->{DIR}}; + foreach my $pmlibdir (@pmlibdirs) { + -d $pmlibdir && !$dir{$pmlibdir} && push @{$self->{PMLIBDIRS}}, $pmlibdir; + } + + unless( $self->{PMLIBPARENTDIRS} ) { + @{$self->{PMLIBPARENTDIRS}} = ('lib'); + } + + return if $self->{PM} and $self->{ARGS}{PM}; + + if (@{$self->{PMLIBDIRS}}){ + print "Searching PMLIBDIRS: @{$self->{PMLIBDIRS}}\n" + if ($Verbose >= 2); + require File::Find; + File::Find::find(sub { + if (-d $_){ + unless ($self->libscan($_)){ + $File::Find::prune = 1; + } + return; + } + return if /\#/; + return if /~$/; # emacs temp files + return if /,v$/; # RCS files + return if m{\.swp$}; # vim swap files + + my $path = $File::Find::name; + my $prefix = $self->{INST_LIBDIR}; + my $striplibpath; + + my $parentlibs_re = join '|', @{$self->{PMLIBPARENTDIRS}}; + $prefix = $self->{INST_LIB} + if ($striplibpath = $path) =~ s{^(\W*)($parentlibs_re)\W} + {$1}i; + + my($inst) = $self->catfile($prefix,$striplibpath); + local($_) = $inst; # for backwards compatibility + $inst = $self->libscan($inst); + print "libscan($path) => '$inst'\n" if ($Verbose >= 2); + return unless $inst; + if ($self->{XSMULTI} and $inst =~ /\.xs\z/) { + my($base); ($base = $path) =~ s/\.xs\z//; + $self->{XS}{$path} = "$base.c"; + push @{$self->{C}}, "$base.c"; + push @{$self->{O_FILES}}, "$base$self->{OBJ_EXT}"; + } else { + $self->{PM}{$path} = $inst; + } + }, @{$self->{PMLIBDIRS}}); + } +} + + + +sub init_DIRFILESEP { + my($self) = shift; + + $self->{DIRFILESEP} = '/'; +} + + + +sub init_main { + my($self) = @_; + + # --- Initialize Module Name and Paths + + # NAME = Foo::Bar::Oracle + # FULLEXT = Foo/Bar/Oracle + # BASEEXT = Oracle + # PARENT_NAME = Foo::Bar +### Only UNIX: +### ($self->{FULLEXT} = +### $self->{NAME}) =~ s!::!/!g ; #eg. BSD/Foo/Socket + $self->{FULLEXT} = $self->catdir(split /::/, $self->{NAME}); + + + # Copied from DynaLoader: + + my(@modparts) = split(/::/,$self->{NAME}); + my($modfname) = $modparts[-1]; + + # Some systems have restrictions on files names for DLL's etc. + # mod2fname returns appropriate file base name (typically truncated) + # It may also edit @modparts if required. + # We require DynaLoader to make sure that mod2fname is loaded + eval { require DynaLoader }; + if (defined &DynaLoader::mod2fname) { + $modfname = &DynaLoader::mod2fname(\@modparts); + } + + ($self->{PARENT_NAME}, $self->{BASEEXT}) = $self->{NAME} =~ m!(?:([\w:]+)::)?(\w+)\z! ; + $self->{PARENT_NAME} ||= ''; + + if (defined &DynaLoader::mod2fname) { + # As of 5.001m, dl_os2 appends '_' + $self->{DLBASE} = $modfname; + } else { + $self->{DLBASE} = '$(BASEEXT)'; + } + + + # --- Initialize PERL_LIB, PERL_SRC + + # *Real* information: where did we get these two from? ... + my $inc_config_dir = dirname($INC{'Config.pm'}); + my $inc_carp_dir = dirname($INC{'Carp.pm'}); + + unless ($self->{PERL_SRC}){ + foreach my $dir_count (1..8) { # 8 is the VMS limit for nesting + my $dir = $self->catdir(($Updir) x $dir_count); + + if (-f $self->catfile($dir,"config_h.SH") && + -f $self->catfile($dir,"perl.h") && + -f $self->catfile($dir,"lib","strict.pm") + ) { + $self->{PERL_SRC}=$dir ; + last; + } + } + } + + warn "PERL_CORE is set but I can't find your PERL_SRC!\n" if + $self->{PERL_CORE} and !$self->{PERL_SRC}; + + if ($self->{PERL_SRC}){ + $self->{PERL_LIB} ||= $self->catdir("$self->{PERL_SRC}","lib"); + + $self->{PERL_ARCHLIB} = $self->{PERL_LIB}; + $self->{PERL_INC} = ($Is{Win32}) ? + $self->catdir($self->{PERL_LIB},"CORE") : $self->{PERL_SRC}; + + # catch a situation that has occurred a few times in the past: + unless ( + -s $self->catfile($self->{PERL_SRC},'cflags') + or + $Is{VMS} + && + -s $self->catfile($self->{PERL_SRC},'vmsish.h') + or + $Is{Win32} + ){ + warn qq{ +You cannot build extensions below the perl source tree after executing +a 'make clean' in the perl source tree. + +To rebuild extensions distributed with the perl source you should +simply Configure (to include those extensions) and then build perl as +normal. After installing perl the source tree can be deleted. It is +not needed for building extensions by running 'perl Makefile.PL' +usually without extra arguments. + +It is recommended that you unpack and build additional extensions away +from the perl source tree. +}; + } + } else { + # we should also consider $ENV{PERL5LIB} here + my $old = $self->{PERL_LIB} || $self->{PERL_ARCHLIB} || $self->{PERL_INC}; + $self->{PERL_LIB} ||= $Config{privlibexp}; + $self->{PERL_ARCHLIB} ||= $Config{archlibexp}; + $self->{PERL_INC} = $self->catdir("$self->{PERL_ARCHLIB}","CORE"); # wild guess for now + my $perl_h; + + if (not -f ($perl_h = $self->catfile($self->{PERL_INC},"perl.h")) + and not $old){ + # Maybe somebody tries to build an extension with an + # uninstalled Perl outside of Perl build tree + my $lib; + for my $dir (@INC) { + $lib = $dir, last if -e $self->catfile($dir, "Config.pm"); + } + if ($lib) { + # Win32 puts its header files in /perl/src/lib/CORE. + # Unix leaves them in /perl/src. + my $inc = $Is{Win32} ? $self->catdir($lib, "CORE" ) + : dirname $lib; + if (-e $self->catfile($inc, "perl.h")) { + $self->{PERL_LIB} = $lib; + $self->{PERL_ARCHLIB} = $lib; + $self->{PERL_INC} = $inc; + $self->{UNINSTALLED_PERL} = 1; + print <{PERL_LIB} = File::Spec->rel2abs($self->{PERL_LIB}); + $self->{PERL_ARCHLIB} = File::Spec->rel2abs($self->{PERL_ARCHLIB}); + } + $self->{PERL_INCDEP} = $self->{PERL_INC}; + $self->{PERL_ARCHLIBDEP} = $self->{PERL_ARCHLIB}; + + # We get SITELIBEXP and SITEARCHEXP directly via + # Get_from_Config. When we are running standard modules, these + # won't matter, we will set INSTALLDIRS to "perl". Otherwise we + # set it to "site". I prefer that INSTALLDIRS be set from outside + # MakeMaker. + $self->{INSTALLDIRS} ||= "site"; + + $self->{MAN1EXT} ||= $Config{man1ext}; + $self->{MAN3EXT} ||= $Config{man3ext}; + + # Get some stuff out of %Config if we haven't yet done so + print "CONFIG must be an array ref\n" + if ($self->{CONFIG} and ref $self->{CONFIG} ne 'ARRAY'); + $self->{CONFIG} = [] unless (ref $self->{CONFIG}); + push(@{$self->{CONFIG}}, @ExtUtils::MakeMaker::Get_from_Config); + push(@{$self->{CONFIG}}, 'shellflags') if $Config{shellflags}; + my(%once_only); + foreach my $m (@{$self->{CONFIG}}){ + next if $once_only{$m}; + print "CONFIG key '$m' does not exist in Config.pm\n" + unless exists $Config{$m}; + $self->{uc $m} ||= $Config{$m}; + $once_only{$m} = 1; + } + +# This is too dangerous: +# if ($^O eq "next") { +# $self->{AR} = "libtool"; +# $self->{AR_STATIC_ARGS} = "-o"; +# } +# But I leave it as a placeholder + + $self->{AR_STATIC_ARGS} ||= "cr"; + + # These should never be needed + $self->{OBJ_EXT} ||= '.o'; + $self->{LIB_EXT} ||= '.a'; + + $self->{MAP_TARGET} ||= "perl"; + + $self->{LIBPERL_A} ||= "libperl$self->{LIB_EXT}"; + + # make a simple check if we find strict + warn "Warning: PERL_LIB ($self->{PERL_LIB}) seems not to be a perl library directory + (strict.pm not found)" + unless -f $self->catfile("$self->{PERL_LIB}","strict.pm") || + $self->{NAME} eq "ExtUtils::MakeMaker"; +} + + +sub init_tools { + my $self = shift; + + $self->{ECHO} ||= 'echo'; + $self->{ECHO_N} ||= 'echo -n'; + $self->{RM_F} ||= "rm -f"; + $self->{RM_RF} ||= "rm -rf"; + $self->{TOUCH} ||= "touch"; + $self->{TEST_F} ||= "test -f"; + $self->{TEST_S} ||= "test -s"; + $self->{CP} ||= "cp"; + $self->{MV} ||= "mv"; + $self->{CHMOD} ||= "chmod"; + $self->{FALSE} ||= 'false'; + $self->{TRUE} ||= 'true'; + + $self->{LD} ||= 'ld'; + + return $self->SUPER::init_tools(@_); + + # After SUPER::init_tools so $Config{shell} has a + # chance to get set. + $self->{SHELL} ||= '/bin/sh'; + + return; +} + + + +sub init_linker { + my($self) = shift; + $self->{PERL_ARCHIVE} ||= ''; + $self->{PERL_ARCHIVEDEP} ||= ''; + $self->{PERL_ARCHIVE_AFTER} ||= ''; + $self->{EXPORT_LIST} ||= ''; +} + + + +sub init_lib2arch { + my($self) = shift; + + # The user who requests an installation directory explicitly + # should not have to tell us an architecture installation directory + # as well. We look if a directory exists that is named after the + # architecture. If not we take it as a sign that it should be the + # same as the requested installation directory. Otherwise we take + # the found one. + for my $libpair ({l=>"privlib", a=>"archlib"}, + {l=>"sitelib", a=>"sitearch"}, + {l=>"vendorlib", a=>"vendorarch"}, + ) + { + my $lib = "install$libpair->{l}"; + my $Lib = uc $lib; + my $Arch = uc "install$libpair->{a}"; + if( $self->{$Lib} && ! $self->{$Arch} ){ + my($ilib) = $Config{$lib}; + + $self->prefixify($Arch,$ilib,$self->{$Lib}); + + unless (-d $self->{$Arch}) { + print "Directory $self->{$Arch} not found\n" + if $Verbose; + $self->{$Arch} = $self->{$Lib}; + } + print "Defaulting $Arch to $self->{$Arch}\n" if $Verbose; + } + } +} + + + +sub init_PERL { + my($self) = shift; + + my @defpath = (); + foreach my $component ($self->{PERL_SRC}, $self->path(), + $Config{binexp}) + { + push @defpath, $component if defined $component; + } + + # Build up a set of file names (not command names). + my $thisperl = $self->canonpath($^X); + $thisperl .= $Config{exe_ext} unless + # VMS might have a file version # at the end + $Is{VMS} ? $thisperl =~ m/$Config{exe_ext}(;\d+)?$/i + : $thisperl =~ m/$Config{exe_ext}$/i; + + # We need a relative path to perl when in the core. + $thisperl = $self->abs2rel($thisperl) if $self->{PERL_CORE}; + + my @perls = ($thisperl); + push @perls, map { "$_$Config{exe_ext}" } + ("perl$Config{version}", 'perl5', 'perl'); + + # miniperl has priority over all but the canonical perl when in the + # core. Otherwise its a last resort. + my $miniperl = "miniperl$Config{exe_ext}"; + if( $self->{PERL_CORE} ) { + splice @perls, 1, 0, $miniperl; + } + else { + push @perls, $miniperl; + } + + $self->{PERL} ||= + $self->find_perl(5.0, \@perls, \@defpath, $Verbose ); + + my $perl = $self->{PERL}; + $perl =~ s/^"//; + my $has_mcr = $perl =~ s/^MCR\s*//; + my $perlflags = ''; + my $stripped_perl; + while ($perl) { + ($stripped_perl = $perl) =~ s/"$//; + last if -x $stripped_perl; + last unless $perl =~ s/(\s+\S+)$//; + $perlflags = $1.$perlflags; + } + $self->{PERL} = $stripped_perl; + $self->{PERL} = 'MCR '.$self->{PERL} if $has_mcr || $Is{VMS}; + + # When built for debugging, VMS doesn't create perl.exe but ndbgperl.exe. + my $perl_name = 'perl'; + $perl_name = 'ndbgperl' if $Is{VMS} && + defined $Config{usevmsdebug} && $Config{usevmsdebug} eq 'define'; + + # XXX This logic is flawed. If "miniperl" is anywhere in the path + # it will get confused. It should be fixed to work only on the filename. + # Define 'FULLPERL' to be a non-miniperl (used in test: target) + unless ($self->{FULLPERL}) { + ($self->{FULLPERL} = $self->{PERL}) =~ s/\Q$miniperl\E$/$perl_name$Config{exe_ext}/i; + $self->{FULLPERL} = qq{"$self->{FULLPERL}"}.$perlflags; + } + # Can't have an image name with quotes, and findperl will have + # already escaped spaces. + $self->{FULLPERL} =~ tr/"//d if $Is{VMS}; + + # Little hack to get around VMS's find_perl putting "MCR" in front + # sometimes. + $self->{ABSPERL} = $self->{PERL}; + $has_mcr = $self->{ABSPERL} =~ s/^MCR\s*//; + if( $self->file_name_is_absolute($self->{ABSPERL}) ) { + $self->{ABSPERL} = '$(PERL)'; + } + else { + $self->{ABSPERL} = $self->rel2abs($self->{ABSPERL}); + + # Quote the perl command if it contains whitespace + $self->{ABSPERL} = $self->quote_literal($self->{ABSPERL}) + if $self->{ABSPERL} =~ /\s/; + + $self->{ABSPERL} = 'MCR '.$self->{ABSPERL} if $has_mcr; + } + $self->{PERL} = qq{"$self->{PERL}"}.$perlflags; + + # Can't have an image name with quotes, and findperl will have + # already escaped spaces. + $self->{PERL} =~ tr/"//d if $Is{VMS}; + + # Are we building the core? + $self->{PERL_CORE} = $ENV{PERL_CORE} unless exists $self->{PERL_CORE}; + $self->{PERL_CORE} = 0 unless defined $self->{PERL_CORE}; + + # Make sure perl can find itself before it's installed. + my $lib_paths = $self->{UNINSTALLED_PERL} || $self->{PERL_CORE} + ? ( $self->{PERL_ARCHLIB} && $self->{PERL_LIB} && $self->{PERL_ARCHLIB} ne $self->{PERL_LIB} ) ? + q{ "-I$(PERL_LIB)" "-I$(PERL_ARCHLIB)"} : q{ "-I$(PERL_LIB)"} + : undef; + my $inst_lib_paths = $self->{INST_ARCHLIB} ne $self->{INST_LIB} + ? 'RUN)'.$perlflags.' "-I$(INST_ARCHLIB)" "-I$(INST_LIB)"' + : 'RUN)'.$perlflags.' "-I$(INST_LIB)"'; + # How do we run perl? + foreach my $perl (qw(PERL FULLPERL ABSPERL)) { + my $run = $perl.'RUN'; + + $self->{$run} = qq{\$($perl)}; + $self->{$run} .= $lib_paths if $lib_paths; + + $self->{$perl.'RUNINST'} = '$('.$perl.$inst_lib_paths; + } + + return 1; +} + + + +sub init_platform { + my($self) = shift; + + $self->{MM_Unix_VERSION} = $VERSION; + $self->{PERL_MALLOC_DEF} = '-DPERL_EXTMALLOC_DEF -Dmalloc=Perl_malloc '. + '-Dfree=Perl_mfree -Drealloc=Perl_realloc '. + '-Dcalloc=Perl_calloc'; + +} + +sub platform_constants { + my($self) = shift; + my $make_frag = ''; + + foreach my $macro (qw(MM_Unix_VERSION PERL_MALLOC_DEF)) + { + next unless defined $self->{$macro}; + $make_frag .= "$macro = $self->{$macro}\n"; + } + + return $make_frag; +} + + + +sub init_PERM { + my($self) = shift; + + $self->{PERM_DIR} = 755 unless defined $self->{PERM_DIR}; + $self->{PERM_RW} = 644 unless defined $self->{PERM_RW}; + $self->{PERM_RWX} = 755 unless defined $self->{PERM_RWX}; + + return 1; +} + + + +sub init_xs { + my $self = shift; + + if ($self->has_link_code()) { + $self->{INST_STATIC} = + $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT)$(LIB_EXT)'); + $self->{INST_DYNAMIC} = + $self->catfile('$(INST_ARCHAUTODIR)', '$(DLBASE).$(DLEXT)'); + $self->{INST_BOOT} = + $self->catfile('$(INST_ARCHAUTODIR)', '$(BASEEXT).bs'); + if ($self->{XSMULTI}) { + my @exts = $self->_xs_list_basenames; + my (@statics, @dynamics, @boots); + for my $ext (@exts) { + my ($v, $d, $f) = File::Spec->splitpath($ext); + my @d = File::Spec->splitdir($d); + shift @d if defined $d[0] and $d[0] eq 'lib'; + my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f); + my $instfile = $self->catfile($instdir, $f); + push @statics, "$instfile\$(LIB_EXT)"; + + # Dynamic library names may need special handling. + my $dynfile = $instfile; + eval { require DynaLoader }; + if (defined &DynaLoader::mod2fname) { + $dynfile = $self->catfile($instdir, &DynaLoader::mod2fname([@d, $f])); + } + + push @dynamics, "$dynfile.\$(DLEXT)"; + push @boots, "$instfile.bs"; + } + $self->{INST_STATIC} = join ' ', @statics; + $self->{INST_DYNAMIC} = join ' ', @dynamics; + $self->{INST_BOOT} = join ' ', @boots; + } + } else { + $self->{INST_STATIC} = ''; + $self->{INST_DYNAMIC} = ''; + $self->{INST_BOOT} = ''; + } +} + + +sub install { + my($self, %attribs) = @_; + my(@m); + + push @m, q{ +install :: pure_install doc_install + $(NOECHO) $(NOOP) + +install_perl :: pure_perl_install doc_perl_install + $(NOECHO) $(NOOP) + +install_site :: pure_site_install doc_site_install + $(NOECHO) $(NOOP) + +install_vendor :: pure_vendor_install doc_vendor_install + $(NOECHO) $(NOOP) + +pure_install :: pure_$(INSTALLDIRS)_install + $(NOECHO) $(NOOP) + +doc_install :: doc_$(INSTALLDIRS)_install + $(NOECHO) $(NOOP) + +pure__install : pure_site_install + $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +doc__install : doc_site_install + $(NOECHO) $(ECHO) INSTALLDIRS not defined, defaulting to INSTALLDIRS=site + +pure_perl_install :: all + $(NOECHO) $(MOD_INSTALL) \ +}; + + push @m, +q{ read "}.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \ + write "}.$self->catfile('$(DESTINSTALLARCHLIB)','auto','$(FULLEXT)','.packlist').q{" \ +} unless $self->{NO_PACKLIST}; + + push @m, +q{ "$(INST_LIB)" "$(DESTINSTALLPRIVLIB)" \ + "$(INST_ARCHLIB)" "$(DESTINSTALLARCHLIB)" \ + "$(INST_BIN)" "$(DESTINSTALLBIN)" \ + "$(INST_SCRIPT)" "$(DESTINSTALLSCRIPT)" \ + "$(INST_MAN1DIR)" "$(DESTINSTALLMAN1DIR)" \ + "$(INST_MAN3DIR)" "$(DESTINSTALLMAN3DIR)" + $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ + "}.$self->catdir('$(SITEARCHEXP)','auto','$(FULLEXT)').q{" + + +pure_site_install :: all + $(NOECHO) $(MOD_INSTALL) \ +}; + push @m, +q{ read "}.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \ + write "}.$self->catfile('$(DESTINSTALLSITEARCH)','auto','$(FULLEXT)','.packlist').q{" \ +} unless $self->{NO_PACKLIST}; + + push @m, +q{ "$(INST_LIB)" "$(DESTINSTALLSITELIB)" \ + "$(INST_ARCHLIB)" "$(DESTINSTALLSITEARCH)" \ + "$(INST_BIN)" "$(DESTINSTALLSITEBIN)" \ + "$(INST_SCRIPT)" "$(DESTINSTALLSITESCRIPT)" \ + "$(INST_MAN1DIR)" "$(DESTINSTALLSITEMAN1DIR)" \ + "$(INST_MAN3DIR)" "$(DESTINSTALLSITEMAN3DIR)" + $(NOECHO) $(WARN_IF_OLD_PACKLIST) \ + "}.$self->catdir('$(PERL_ARCHLIB)','auto','$(FULLEXT)').q{" + +pure_vendor_install :: all + $(NOECHO) $(MOD_INSTALL) \ +}; + push @m, +q{ read "}.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{" \ + write "}.$self->catfile('$(DESTINSTALLVENDORARCH)','auto','$(FULLEXT)','.packlist').q{" \ +} unless $self->{NO_PACKLIST}; + + push @m, +q{ "$(INST_LIB)" "$(DESTINSTALLVENDORLIB)" \ + "$(INST_ARCHLIB)" "$(DESTINSTALLVENDORARCH)" \ + "$(INST_BIN)" "$(DESTINSTALLVENDORBIN)" \ + "$(INST_SCRIPT)" "$(DESTINSTALLVENDORSCRIPT)" \ + "$(INST_MAN1DIR)" "$(DESTINSTALLVENDORMAN1DIR)" \ + "$(INST_MAN3DIR)" "$(DESTINSTALLVENDORMAN3DIR)" + +}; + + push @m, q{ +doc_perl_install :: all + $(NOECHO) $(NOOP) + +doc_site_install :: all + $(NOECHO) $(NOOP) + +doc_vendor_install :: all + $(NOECHO) $(NOOP) + +} if $self->{NO_PERLLOCAL}; + + push @m, q{ +doc_perl_install :: all + $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" + -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" + -$(NOECHO) $(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" "$(INSTALLPRIVLIB)" \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" + +doc_site_install :: all + $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" + -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" + -$(NOECHO) $(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" "$(INSTALLSITELIB)" \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" + +doc_vendor_install :: all + $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" + -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" + -$(NOECHO) $(DOC_INSTALL) \ + "Module" "$(NAME)" \ + "installed into" "$(INSTALLVENDORLIB)" \ + LINKTYPE "$(LINKTYPE)" \ + VERSION "$(VERSION)" \ + EXE_FILES "$(EXE_FILES)" \ + >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" + +} unless $self->{NO_PERLLOCAL}; + + push @m, q{ +uninstall :: uninstall_from_$(INSTALLDIRS)dirs + $(NOECHO) $(NOOP) + +uninstall_from_perldirs :: + $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(PERL_ARCHLIB)','auto','$(FULLEXT)','.packlist').q{" + +uninstall_from_sitedirs :: + $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(SITEARCHEXP)','auto','$(FULLEXT)','.packlist').q{" + +uninstall_from_vendordirs :: + $(NOECHO) $(UNINSTALL) "}.$self->catfile('$(VENDORARCHEXP)','auto','$(FULLEXT)','.packlist').q{" +}; + + join("",@m); +} + + +sub installbin { + my($self) = shift; + + return "" unless $self->{EXE_FILES} && ref $self->{EXE_FILES} eq "ARRAY"; + my @exefiles = sort @{$self->{EXE_FILES}}; + return "" unless @exefiles; + + @exefiles = map vmsify($_), @exefiles if $Is{VMS}; + + my %fromto; + for my $from (@exefiles) { + my($path)= $self->catfile('$(INST_SCRIPT)', basename($from)); + + local($_) = $path; # for backwards compatibility + my $to = $self->libscan($path); + print "libscan($from) => '$to'\n" if ($Verbose >=2); + + $to = vmsify($to) if $Is{VMS}; + $fromto{$from} = $to; + } + my @to = sort values %fromto; + + my @m; + push(@m, qq{ +EXE_FILES = @exefiles + +pure_all :: @to + \$(NOECHO) \$(NOOP) + +realclean :: +}); + + # realclean can get rather large. + push @m, map "\t$_\n", $self->split_command('$(RM_F)', @to); + push @m, "\n"; + + # A target for each exe file. + my @froms = sort keys %fromto; + for my $from (@froms) { + # 1 2 + push @m, _sprintf562 <<'MAKE', $from, $fromto{$from}; +%2$s : %1$s $(FIRST_MAKEFILE) $(INST_SCRIPT)$(DFSEP).exists $(INST_BIN)$(DFSEP).exists + $(NOECHO) $(RM_F) %2$s + $(CP) %1$s %2$s + $(FIXIN) %2$s + -$(NOECHO) $(CHMOD) $(PERM_RWX) %2$s + +MAKE + + } + + join "", @m; +} + + +# LINKTYPE => static or dynamic or '' +sub linkext { + my($self, %attribs) = @_; + my $linktype = $attribs{LINKTYPE}; + $linktype = $self->{LINKTYPE} unless defined $linktype; + if (defined $linktype and $linktype eq '') { + warn "Warning: LINKTYPE set to '', no longer necessary\n"; + } + $linktype = '$(LINKTYPE)' unless defined $linktype; + " +linkext :: $linktype + \$(NOECHO) \$(NOOP) +"; +} + + +sub lsdir { + # $self + my(undef, $dir, $regex) = @_; + opendir(my $dh, defined($dir) ? $dir : ".") + or return; + my @ls = readdir $dh; + closedir $dh; + @ls = grep(/$regex/, @ls) if defined $regex; + @ls; +} + + +sub macro { + my($self,%attribs) = @_; + my @m; + foreach my $key (sort keys %attribs) { + my $val = $attribs{$key}; + push @m, "$key = $val\n"; + } + join "", @m; +} + + +sub makeaperl { + my($self, %attribs) = @_; + my($makefilename, $searchdirs, $static, $extra, $perlinc, $target, $tmp, $libperl) = + @attribs{qw(MAKE DIRS STAT EXTRA INCL TARGET TMP LIBPERL)}; + s/^(.*)/"-I$1"/ for @{$perlinc || []}; + my(@m); + push @m, " +# --- MakeMaker makeaperl section --- +MAP_TARGET = $target +FULLPERL = $self->{FULLPERL} +MAP_PERLINC = @{$perlinc || []} +"; + return join '', @m if $self->{PARENT}; + + my($dir) = join ":", @{$self->{DIR}}; + + unless ($self->{MAKEAPERL}) { + push @m, q{ +$(MAP_TARGET) :: $(MAKE_APERL_FILE) + $(MAKE) $(USEMAKEFILE) $(MAKE_APERL_FILE) $@ + +$(MAKE_APERL_FILE) : static $(FIRST_MAKEFILE) pm_to_blib + $(NOECHO) $(ECHO) Writing \"$(MAKE_APERL_FILE)\" for this $(MAP_TARGET) + $(NOECHO) $(PERLRUNINST) \ + Makefile.PL DIR="}, $dir, q{" \ + MAKEFILE=$(MAKE_APERL_FILE) LINKTYPE=static \ + MAKEAPERL=1 NORECURS=1 CCCDLFLAGS=}; + + foreach (@ARGV){ + my $arg = $_; # avoid lvalue aliasing + if ( $arg =~ /(^.*?=)(.*['\s].*)/ ) { + $arg = $1 . $self->quote_literal($2); + } + push @m, " \\\n\t\t$arg"; + } + push @m, "\n"; + + return join '', @m; + } + + my $cccmd = $self->const_cccmd($libperl); + $cccmd =~ s/^CCCMD\s*=\s*//; + $cccmd =~ s/\$\(INC\)/ "-I$self->{PERL_INC}" /; + $cccmd .= " $Config{cccdlflags}" + if ($Config{useshrplib} eq 'true'); + $cccmd =~ s/\(CC\)/\(PERLMAINCC\)/; + + # The front matter of the linkcommand... + my $linkcmd = join ' ', "\$(CC)", + grep($_, @Config{qw(ldflags ccdlflags)}); + $linkcmd =~ s/\s+/ /g; + $linkcmd =~ s,(perl\.exp),\$(PERL_INC)/$1,; + + # Which *.a files could we make use of... + my $staticlib21 = $self->_find_static_libs($searchdirs); + # We trust that what has been handed in as argument, will be buildable + $static = [] unless $static; + @$staticlib21{@{$static}} = (1) x @{$static}; + + $extra = [] unless $extra && ref $extra eq 'ARRAY'; + for (sort keys %$staticlib21) { + next unless /\Q$self->{LIB_EXT}\E\z/; + $_ = dirname($_) . "/extralibs.ld"; + push @$extra, $_; + } + + s/^(.*)/"-I$1"/ for @{$perlinc || []}; + + $target ||= "perl"; + $tmp ||= "."; + +# MAP_STATIC doesn't look into subdirs yet. Once "all" is made and we +# regenerate the Makefiles, MAP_STATIC and the dependencies for +# extralibs.all are computed correctly + my @map_static = reverse sort keys %$staticlib21; + push @m, " +MAP_LINKCMD = $linkcmd +MAP_STATIC = ", join(" \\\n\t", map { qq{"$_"} } @map_static), " +MAP_STATICDEP = ", join(' ', map { $self->quote_dep($_) } @map_static), " + +MAP_PRELIBS = $Config{perllibs} $Config{cryptlib} +"; + + my $lperl; + if (defined $libperl) { + ($lperl = $libperl) =~ s/\$\(A\)/$self->{LIB_EXT}/; + } + unless ($libperl && -f $lperl) { # Ilya's code... + my $dir = $self->{PERL_SRC} || "$self->{PERL_ARCHLIB}/CORE"; + $dir = "$self->{PERL_ARCHLIB}/.." if $self->{UNINSTALLED_PERL}; + $libperl ||= "libperl$self->{LIB_EXT}"; + $libperl = "$dir/$libperl"; + $lperl ||= "libperl$self->{LIB_EXT}"; + $lperl = "$dir/$lperl"; + + if (! -f $libperl and ! -f $lperl) { + # We did not find a static libperl. Maybe there is a shared one? + if ($Is{SunOS}) { + $lperl = $libperl = "$dir/$Config{libperl}"; + # SUNOS ld does not take the full path to a shared library + $libperl = '' if $Is{SunOS4}; + } + } + + print <{PERL_SRC}); +Warning: $libperl not found +If you're going to build a static perl binary, make sure perl is installed +otherwise ignore this warning +EOF + } + + # SUNOS ld does not take the full path to a shared library + my $llibperl = $libperl ? '$(MAP_LIBPERL)' : '-lperl'; + my $libperl_dep = $self->quote_dep($libperl); + + push @m, " +MAP_LIBPERL = $libperl +MAP_LIBPERLDEP = $libperl_dep +LLIBPERL = $llibperl +"; + + push @m, ' +$(INST_ARCHAUTODIR)/extralibs.all : $(INST_ARCHAUTODIR)$(DFSEP).exists '.join(" \\\n\t", @$extra).' + $(NOECHO) $(RM_F) $@ + $(NOECHO) $(TOUCH) $@ +'; + + foreach my $catfile (@$extra){ + push @m, "\tcat $catfile >> \$\@\n"; + } + + my $ldfrom = $self->{XSMULTI} ? '' : '$(LDFROM)'; + # 1 2 3 4 + push @m, _sprintf562 <<'EOF', $tmp, $ldfrom, $self->xs_obj_opt('$@'), $makefilename; +$(MAP_TARGET) :: %1$s/perlmain$(OBJ_EXT) $(MAP_LIBPERLDEP) $(MAP_STATICDEP) $(INST_ARCHAUTODIR)/extralibs.all + $(MAP_LINKCMD) %2$s $(OPTIMIZE) %1$s/perlmain$(OBJ_EXT) %3$s $(MAP_STATIC) "$(LLIBPERL)" `cat $(INST_ARCHAUTODIR)/extralibs.all` $(MAP_PRELIBS) + $(NOECHO) $(ECHO) "To install the new '$(MAP_TARGET)' binary, call" + $(NOECHO) $(ECHO) " $(MAKE) $(USEMAKEFILE) %4$s inst_perl MAP_TARGET=$(MAP_TARGET)" + $(NOECHO) $(ECHO) " $(MAKE) $(USEMAKEFILE) %4$s map_clean" + +%1$s/perlmain\$(OBJ_EXT): %1$s/perlmain.c +EOF + push @m, "\t".$self->cd($tmp, qq[$cccmd "-I\$(PERL_INC)" perlmain.c])."\n"; + + my $maybe_DynaLoader = $Config{usedl} ? 'q(DynaLoader)' : ''; + push @m, _sprintf562 <<'EOF', $tmp, $makefilename, $maybe_DynaLoader; + +%1$s/perlmain.c: %2$s + $(NOECHO) $(ECHO) Writing $@ + $(NOECHO) $(PERL) $(MAP_PERLINC) "-MExtUtils::Miniperl" \ + -e "writemain(grep(s#.*/auto/##s, @ARGV), %3$s)" $(MAP_STATIC) > $@t + $(MV) $@t $@ + +EOF + push @m, "\t", q{$(NOECHO) $(PERL) "$(INSTALLSCRIPT)/fixpmain" +} if (defined (&Dos::UseLFN) && Dos::UseLFN()==0); + + + push @m, q{ +doc_inst_perl : + $(NOECHO) $(ECHO) Appending installation info to "$(DESTINSTALLARCHLIB)/perllocal.pod" + -$(NOECHO) $(MKPATH) "$(DESTINSTALLARCHLIB)" + -$(NOECHO) $(DOC_INSTALL) \ + "Perl binary" "$(MAP_TARGET)" \ + MAP_STATIC "$(MAP_STATIC)" \ + MAP_EXTRA "`cat $(INST_ARCHAUTODIR)/extralibs.all`" \ + MAP_LIBPERL "$(MAP_LIBPERL)" \ + >> "}.$self->catfile('$(DESTINSTALLARCHLIB)','perllocal.pod').q{" + +}; + + push @m, q{ +inst_perl : pure_inst_perl doc_inst_perl + +pure_inst_perl : $(MAP_TARGET) + }.$self->{CP}.q{ $(MAP_TARGET) "}.$self->catfile('$(DESTINSTALLBIN)','$(MAP_TARGET)').q{" + +clean :: map_clean + +map_clean : + }.$self->{RM_F}.qq{ $tmp/perlmain\$(OBJ_EXT) $tmp/perlmain.c \$(MAP_TARGET) $makefilename \$(INST_ARCHAUTODIR)/extralibs.all +}; + + join '', @m; +} + +# utility method +sub _find_static_libs { + my ($self, $searchdirs) = @_; + # don't use File::Spec here because on Win32 F::F still uses "/" + my $installed_version = join('/', + 'auto', $self->{FULLEXT}, "$self->{BASEEXT}$self->{LIB_EXT}" + ); + my %staticlib21; + require File::Find; + File::Find::find(sub { + if ($File::Find::name =~ m{/auto/share\z}) { + # in a subdir of auto/share, prune because e.g. + # Alien::pkgconfig uses File::ShareDir to put .a files + # there. do not want + $File::Find::prune = 1; + return; + } + + return unless m/\Q$self->{LIB_EXT}\E$/; + + return unless -f 'extralibs.ld'; # this checks is a "proper" XS installation + + # Skip perl's libraries. + return if m/^libperl/ or m/^perl\Q$self->{LIB_EXT}\E$/; + + # Skip purified versions of libraries + # (e.g., DynaLoader_pure_p1_c0_032.a) + return if m/_pure_\w+_\w+_\w+\.\w+$/ and -f "$File::Find::dir/.pure"; + + if( exists $self->{INCLUDE_EXT} ){ + my $found = 0; + + (my $xx = $File::Find::name) =~ s,.*?/auto/,,s; + $xx =~ s,/?$_,,; + $xx =~ s,/,::,g; + + # Throw away anything not explicitly marked for inclusion. + # DynaLoader is implied. + foreach my $incl ((@{$self->{INCLUDE_EXT}},'DynaLoader')){ + if( $xx eq $incl ){ + $found++; + last; + } + } + return unless $found; + } + elsif( exists $self->{EXCLUDE_EXT} ){ + (my $xx = $File::Find::name) =~ s,.*?/auto/,,s; + $xx =~ s,/?$_,,; + $xx =~ s,/,::,g; + + # Throw away anything explicitly marked for exclusion + foreach my $excl (@{$self->{EXCLUDE_EXT}}){ + return if( $xx eq $excl ); + } + } + + # don't include the installed version of this extension. I + # leave this line here, although it is not necessary anymore: + # I patched minimod.PL instead, so that Miniperl.pm won't + # include duplicates + + # Once the patch to minimod.PL is in the distribution, I can + # drop it + return if $File::Find::name =~ m:\Q$installed_version\E\z:; + return if !$self->xs_static_lib_is_xs($_); + use Cwd 'cwd'; + $staticlib21{cwd() . "/" . $_}++; + }, grep( -d $_, map { $self->catdir($_, 'auto') } @{$searchdirs || []}) ); + return \%staticlib21; +} + + +sub xs_static_lib_is_xs { + my ($self, $libfile) = @_; + my $devnull = File::Spec->devnull; + return `nm $libfile 2>$devnull` =~ /\bboot_/; +} + + +sub makefile { + my($self) = shift; + my $m; + # We do not know what target was originally specified so we + # must force a manual rerun to be sure. But as it should only + # happen very rarely it is not a significant problem. + $m = ' +$(OBJECT) : $(FIRST_MAKEFILE) + +' if $self->{OBJECT}; + + my $newer_than_target = $Is{VMS} ? '$(MMS$SOURCE_LIST)' : '$?'; + my $mpl_args = join " ", map qq["$_"], @ARGV; + my $cross = ''; + if (defined $::Cross::platform) { + # Inherited from win32/buildext.pl + $cross = "-MCross=$::Cross::platform "; + } + $m .= sprintf <<'MAKE_FRAG', $newer_than_target, $cross, $mpl_args; +# We take a very conservative approach here, but it's worth it. +# We move Makefile to Makefile.old here to avoid gnu make looping. +$(FIRST_MAKEFILE) : Makefile.PL $(CONFIGDEP) + $(NOECHO) $(ECHO) "Makefile out-of-date with respect to %s" + $(NOECHO) $(ECHO) "Cleaning current config before rebuilding Makefile..." + -$(NOECHO) $(RM_F) $(MAKEFILE_OLD) + -$(NOECHO) $(MV) $(FIRST_MAKEFILE) $(MAKEFILE_OLD) + - $(MAKE) $(USEMAKEFILE) $(MAKEFILE_OLD) clean $(DEV_NULL) + $(PERLRUN) %sMakefile.PL %s + $(NOECHO) $(ECHO) "==> Your Makefile has been rebuilt. <==" + $(NOECHO) $(ECHO) "==> Please rerun the $(MAKE) command. <==" + $(FALSE) + +MAKE_FRAG + + return $m; +} + + + +sub maybe_command { + my($self,$file) = @_; + return $file if -x $file && ! -d $file; + return; +} + + + +sub needs_linking { + my($self) = shift; + + my $caller = (caller(0))[3]; + confess("needs_linking called too early") if + $caller =~ /^ExtUtils::MakeMaker::/; + return $self->{NEEDS_LINKING} if defined $self->{NEEDS_LINKING}; + if ($self->has_link_code or $self->{MAKEAPERL}){ + $self->{NEEDS_LINKING} = 1; + return 1; + } + foreach my $child (keys %{$self->{CHILDREN}}) { + if ($self->{CHILDREN}->{$child}->needs_linking) { + $self->{NEEDS_LINKING} = 1; + return 1; + } + } + return $self->{NEEDS_LINKING} = 0; +} + + + +sub parse_abstract { + my($self,$parsefile) = @_; + my $result; + + local $/ = "\n"; + open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!"; + binmode $fh; + my $inpod = 0; + my $pod_encoding; + my $package = $self->{DISTNAME}; + $package =~ s/-/::/g; + while (<$fh>) { + $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; + next if !$inpod; + s#\r*\n\z##; # handle CRLF input + + if ( /^=encoding\s*(.*)$/i ) { + $pod_encoding = $1; + } + + if ( /^($package(?:\.pm)? \s+ -+ \s+)(.*)/x ) { + $result = $2; + next; + } + next unless $result; + + if ( $result && ( /^\s*$/ || /^\=/ ) ) { + last; + } + $result = join ' ', $result, $_; + } + close $fh; + + if ( $pod_encoding and !( $] < 5.008 or !$Config{useperlio} ) ) { + # Have to wrap in an eval{} for when running under PERL_CORE + # Encode isn't available during build phase and parsing + # ABSTRACT isn't important there + eval { + require Encode; + $result = Encode::decode($pod_encoding, $result); + } + } + + return $result; +} + + +sub parse_version { + my($self,$parsefile) = @_; + my $result; + + local $/ = "\n"; + local $_; + open(my $fh, '<', $parsefile) or die "Could not open '$parsefile': $!"; + my $inpod = 0; + while (<$fh>) { + $inpod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $inpod; + next if $inpod || /^\s*#/; + chop; + next if /^\s*(if|unless|elsif)/; + if ( m{^ \s* package \s+ \w[\w\:\']* \s+ (v?[0-9._]+) \s* (;|\{) }x ) { + local $^W = 0; + $result = $1; + } + elsif ( m{(?=!])\=[^=]}x ) { + $result = $self->get_version($parsefile, $1, $2); + } + else { + next; + } + last if defined $result; + } + close $fh; + + if ( defined $result && $result !~ /^v?[\d_\.]+$/ ) { + require version; + my $normal = eval { version->new( $result ) }; + $result = $normal if defined $normal; + } + $result = "undef" unless defined $result; + return $result; +} + +sub get_version { + my ($self, $parsefile, $sigil, $name) = @_; + my $line = $_; # from the while() loop in parse_version + { + package ExtUtils::MakeMaker::_version; + undef *version; # in case of unexpected version() sub + eval { + require version; + version::->import; + }; + no strict; + local *{$name}; + local $^W = 0; + $line = $1 if $line =~ m{^(.+)}s; + eval($line); ## no critic + return ${$name}; + } +} + + +sub pasthru { + my($self) = shift; + my(@m); + + my(@pasthru); + my($sep) = $Is{VMS} ? ',' : ''; + $sep .= "\\\n\t"; + + foreach my $key (qw(LIB LIBPERL_A LINKTYPE OPTIMIZE + PREFIX INSTALL_BASE) + ) + { + next unless defined $self->{$key}; + push @pasthru, "$key=\"\$($key)\""; + } + + foreach my $key (qw(DEFINE INC)) { + # default to the make var + my $val = qq{\$($key)}; + # expand within perl if given since need to use quote_literal + # since INC might include space-protecting ""! + chomp($val = $self->{$key}) if defined $self->{$key}; + $val .= " \$(PASTHRU_$key)"; + my $quoted = $self->quote_literal($val); + push @pasthru, qq{PASTHRU_$key=$quoted}; + } + + push @m, "\nPASTHRU = ", join ($sep, @pasthru), "\n"; + join "", @m; +} + + +sub perl_script { + my($self,$file) = @_; + return $file if -r $file && -f _; + return; +} + + +sub perldepend { + my($self) = shift; + my(@m); + + my $make_config = $self->cd('$(PERL_SRC)', '$(MAKE) lib/Config.pm'); + + push @m, sprintf <<'MAKE_FRAG', $make_config if $self->{PERL_SRC}; +# Check for unpropogated config.sh changes. Should never happen. +# We do NOT just update config.h because that is not sufficient. +# An out of date config.h is not fatal but complains loudly! +$(PERL_INCDEP)/config.h: $(PERL_SRC)/config.sh + -$(NOECHO) $(ECHO) "Warning: $(PERL_INC)/config.h out of date with $(PERL_SRC)/config.sh"; $(FALSE) + +$(PERL_ARCHLIB)/Config.pm: $(PERL_SRC)/config.sh + $(NOECHO) $(ECHO) "Warning: $(PERL_ARCHLIB)/Config.pm may be out of date with $(PERL_SRC)/config.sh" + %s +MAKE_FRAG + + return join "", @m unless $self->needs_linking; + + if ($self->{OBJECT}) { + # Need to add an object file dependency on the perl headers. + # this is very important for XS modules in perl.git development. + push @m, $self->_perl_header_files_fragment("/"); # Directory separator between $(PERL_INC)/header.h + } + + push @m, join(" ", sort values %{$self->{XS}})." : \$(XSUBPPDEPS)\n" if %{$self->{XS}}; + + return join "\n", @m; +} + + + +sub pm_to_blib { + my $self = shift; + my($autodir) = $self->catdir('$(INST_LIB)','auto'); + my $r = q{ +pm_to_blib : $(FIRST_MAKEFILE) $(TO_INST_PM) +}; + + # VMS will swallow '' and PM_FILTER is often empty. So use q[] + my $pm_to_blib = $self->oneliner(<split_command($pm_to_blib, + map { ($self->quote_literal($_) => $self->quote_literal($self->{PM}->{$_})) } sort keys %{$self->{PM}}); + + $r .= join '', map { "\t\$(NOECHO) $_\n" } @cmds; + $r .= qq{\t\$(NOECHO) \$(TOUCH) pm_to_blib\n}; + + return $r; +} + +# transform dot-separated version string into comma-separated quadruple +# examples: '1.2.3.4.5' => '1,2,3,4' +# '1.2.3' => '1,2,3,0' +sub _ppd_version { + my ($self, $string) = @_; + return join ',', ((split /\./, $string), (0) x 4)[0..3]; +} + + +sub ppd { + my($self) = @_; + + my $abstract = $self->{ABSTRACT} || ''; + $abstract =~ s/\n/\\n/sg; + $abstract =~ s//>/g; + + my $author = join(', ',@{ ref $self->{AUTHOR} eq 'ARRAY' ? $self->{AUTHOR} : [ $self->{AUTHOR} || '']}); + $author =~ s//>/g; + + my $ppd_file = "$self->{DISTNAME}.ppd"; + + my @ppd_chunks = qq(\n); + + push @ppd_chunks, sprintf <<'PPD_HTML', $abstract, $author; + %s + %s +PPD_HTML + + push @ppd_chunks, " \n"; + if ( $self->{MIN_PERL_VERSION} ) { + my $min_perl_version = $self->_ppd_version($self->{MIN_PERL_VERSION}); + push @ppd_chunks, sprintf <<'PPD_PERLVERS', $min_perl_version; + +PPD_PERLVERS + + } + + # Don't add "perl" to requires. perl dependencies are + # handles by ARCHITECTURE. + my %prereqs = %{$self->{PREREQ_PM}}; + delete $prereqs{perl}; + + # Build up REQUIRE + foreach my $prereq (sort keys %prereqs) { + my $name = $prereq; + $name .= '::' unless $name =~ /::/; + my $version = $prereqs{$prereq}; + + my %attrs = ( NAME => $name ); + $attrs{VERSION} = $version if $version; + my $attrs = join " ", map { qq[$_="$attrs{$_}"] } sort keys %attrs; + push @ppd_chunks, qq( \n); + } + + my $archname = $Config{archname}; + if ($] >= 5.008) { + # archname did not change from 5.6 to 5.8, but those versions may + # not be not binary compatible so now we append the part of the + # version that changes when binary compatibility may change + $archname .= "-$Config{PERL_REVISION}.$Config{PERL_VERSION}"; + } + push @ppd_chunks, sprintf <<'PPD_OUT', $archname; + +PPD_OUT + + if ($self->{PPM_INSTALL_SCRIPT}) { + if ($self->{PPM_INSTALL_EXEC}) { + push @ppd_chunks, sprintf qq{ %s\n}, + $self->{PPM_INSTALL_EXEC}, $self->{PPM_INSTALL_SCRIPT}; + } + else { + push @ppd_chunks, sprintf qq{ %s\n}, + $self->{PPM_INSTALL_SCRIPT}; + } + } + + if ($self->{PPM_UNINSTALL_SCRIPT}) { + if ($self->{PPM_UNINSTALL_EXEC}) { + push @ppd_chunks, sprintf qq{ %s\n}, + $self->{PPM_UNINSTALL_EXEC}, $self->{PPM_UNINSTALL_SCRIPT}; + } + else { + push @ppd_chunks, sprintf qq{ %s\n}, + $self->{PPM_UNINSTALL_SCRIPT}; + } + } + + my ($bin_location) = $self->{BINARY_LOCATION} || ''; + $bin_location =~ s/\\/\\\\/g; + + push @ppd_chunks, sprintf <<'PPD_XML', $bin_location; + + + +PPD_XML + + my @ppd_cmds = $self->stashmeta(join('', @ppd_chunks), $ppd_file); + + return sprintf <<'PPD_OUT', join "\n\t", @ppd_cmds; +# Creates a PPD (Perl Package Description) for a binary distribution. +ppd : + %s +PPD_OUT + +} + + +sub prefixify { + my($self,$var,$sprefix,$rprefix,$default) = @_; + + my $path = $self->{uc $var} || + $Config_Override{lc $var} || $Config{lc $var} || ''; + + $rprefix .= '/' if $sprefix =~ m|/$|; + + warn " prefixify $var => $path\n" if $Verbose >= 2; + warn " from $sprefix to $rprefix\n" if $Verbose >= 2; + + if( $self->{ARGS}{PREFIX} && + $path !~ s{^\Q$sprefix\E\b}{$rprefix}s ) + { + + warn " cannot prefix, using default.\n" if $Verbose >= 2; + warn " no default!\n" if !$default && $Verbose >= 2; + + $path = $self->catdir($rprefix, $default) if $default; + } + + print " now $path\n" if $Verbose >= 2; + return $self->{uc $var} = $path; +} + + + +sub processPL { + my $self = shift; + my $pl_files = $self->{PL_FILES}; + + return "" unless $pl_files; + + my $m = ''; + foreach my $plfile (sort keys %$pl_files) { + my $list = ref($pl_files->{$plfile}) + ? $pl_files->{$plfile} + : [$pl_files->{$plfile}]; + + foreach my $target (@$list) { + if( $Is{VMS} ) { + $plfile = vmsify($self->eliminate_macros($plfile)); + $target = vmsify($self->eliminate_macros($target)); + } + + # Normally a .PL file runs AFTER pm_to_blib so it can have + # blib in its @INC and load the just built modules. BUT if + # the generated module is something in $(TO_INST_PM) which + # pm_to_blib depends on then it can't depend on pm_to_blib + # else we have a dependency loop. + my $pm_dep; + my $perlrun; + if( defined $self->{PM}{$target} ) { + $pm_dep = ''; + $perlrun = 'PERLRUN'; + } + else { + $pm_dep = 'pm_to_blib'; + $perlrun = 'PERLRUNINST'; + } + + $m .= <quote_literal($_), @cmds; + $cmd = $self->escape_newlines($cmd); + + $switches = join ' ', @$switches; + + return qq{\$(ABSPERLRUN) $switches -e $cmd --}; +} + + + +sub quote_literal { + my($self, $text, $opts) = @_; + $opts->{allow_variables} = 1 unless defined $opts->{allow_variables}; + + # Quote single quotes + $text =~ s{'}{'\\''}g; + + $text = $opts->{allow_variables} + ? $self->escape_dollarsigns($text) : $self->escape_all_dollarsigns($text); + + return "'$text'"; +} + + + +sub escape_newlines { + my($self, $text) = @_; + + $text =~ s{\n}{\\\n}g; + + return $text; +} + + + +sub max_exec_len { + my $self = shift; + + if (!defined $self->{_MAX_EXEC_LEN}) { + if (my $arg_max = eval { require POSIX; &POSIX::ARG_MAX }) { + $self->{_MAX_EXEC_LEN} = $arg_max; + } + else { # POSIX minimum exec size + $self->{_MAX_EXEC_LEN} = 4096; + } + } + + return $self->{_MAX_EXEC_LEN}; +} + + + +sub static { +# --- Static Loading Sections --- + + my($self) = shift; + ' +## $(INST_PM) has been moved to the all: target. +## It remains here for awhile to allow for old usage: "make static" +static :: $(FIRST_MAKEFILE) $(INST_STATIC) + $(NOECHO) $(NOOP) +'; +} + +sub static_lib { + my($self) = @_; + return '' unless $self->has_link_code; + my(@m); + my @libs; + if ($self->{XSMULTI}) { + for my $ext ($self->_xs_list_basenames) { + my ($v, $d, $f) = File::Spec->splitpath($ext); + my @d = File::Spec->splitdir($d); + shift @d if $d[0] eq 'lib'; + my $instdir = $self->catdir('$(INST_ARCHLIB)', 'auto', @d, $f); + my $instfile = $self->catfile($instdir, "$f\$(LIB_EXT)"); + my $objfile = "$ext\$(OBJ_EXT)"; + push @libs, [ $objfile, $instfile, $instdir ]; + } + } else { + @libs = ([ qw($(OBJECT) $(INST_STATIC) $(INST_ARCHAUTODIR)) ]); + } + push @m, map { $self->xs_make_static_lib(@$_); } @libs; + join "\n", @m; +} + + +sub xs_make_static_lib { + my ($self, $from, $to, $todir) = @_; + my @m = sprintf '%s: %s $(MYEXTLIB) %s$(DFSEP).exists'."\n", $to, $from, $todir; + push @m, "\t\$(RM_F) \"\$\@\"\n"; + push @m, $self->static_lib_fixtures; + push @m, $self->static_lib_pure_cmd($from); + push @m, "\t\$(CHMOD) \$(PERM_RWX) \$\@\n"; + push @m, $self->static_lib_closures($todir); + join '', @m; +} + + +sub static_lib_closures { + my ($self, $todir) = @_; + my @m = sprintf <<'MAKE_FRAG', $todir; + $(NOECHO) $(ECHO) "$(EXTRALIBS)" > %s$(DFSEP)extralibs.ld +MAKE_FRAG + # Old mechanism - still available: + push @m, <<'MAKE_FRAG' if $self->{PERL_SRC} && $self->{EXTRALIBS}; + $(NOECHO) $(ECHO) "$(EXTRALIBS)" >> $(PERL_SRC)$(DFSEP)ext.libs +MAKE_FRAG + @m; +} + + +sub static_lib_fixtures { + my ($self) = @_; + # If this extension has its own library (eg SDBM_File) + # then copy that to $(INST_STATIC) and add $(OBJECT) into it. + return unless $self->{MYEXTLIB}; + "\t\$(CP) \$(MYEXTLIB) \"\$\@\"\n"; +} + + +sub static_lib_pure_cmd { + my ($self, $from) = @_; + my $ar; + if (exists $self->{FULL_AR} && -x $self->{FULL_AR}) { + # Prefer the absolute pathed ar if available so that PATH + # doesn't confuse us. Perl itself is built with the full_ar. + $ar = 'FULL_AR'; + } else { + $ar = 'AR'; + } + sprintf <<'MAKE_FRAG', $ar, $from; + $(%s) $(AR_STATIC_ARGS) "$@" %s + $(RANLIB) "$@" +MAKE_FRAG +} + + +sub staticmake { + my($self, %attribs) = @_; + my(@static); + + my(@searchdirs)=($self->{PERL_ARCHLIB}, $self->{SITEARCHEXP}, $self->{INST_ARCHLIB}); + + # And as it's not yet built, we add the current extension + # but only if it has some C code (or XS code, which implies C code) + if (@{$self->{C}}) { + @static = $self->catfile($self->{INST_ARCHLIB}, + "auto", + $self->{FULLEXT}, + "$self->{BASEEXT}$self->{LIB_EXT}" + ); + } + + # Either we determine now, which libraries we will produce in the + # subdirectories or we do it at runtime of the make. + + # We could ask all subdir objects, but I cannot imagine, why it + # would be necessary. + + # Instead we determine all libraries for the new perl at + # runtime. + my(@perlinc) = ($self->{INST_ARCHLIB}, $self->{INST_LIB}, $self->{PERL_ARCHLIB}, $self->{PERL_LIB}); + + $self->makeaperl(MAKE => $self->{MAKEFILE}, + DIRS => \@searchdirs, + STAT => \@static, + INCL => \@perlinc, + TARGET => $self->{MAP_TARGET}, + TMP => "", + LIBPERL => $self->{LIBPERL_A} + ); +} + + +sub subdir_x { + my($self, $subdir) = @_; + + my $subdir_cmd = $self->cd($subdir, + '$(MAKE) $(USEMAKEFILE) $(FIRST_MAKEFILE) all $(PASTHRU)' + ); + return sprintf <<'EOT', $subdir_cmd; + +subdirs :: + $(NOECHO) %s +EOT + +} + + +sub subdirs { +# --- Sub-directory Sections --- + my($self) = shift; + my(@m); + # This method provides a mechanism to automatically deal with + # subdirectories containing further Makefile.PL scripts. + # It calls the subdir_x() method for each subdirectory. + foreach my $dir (@{$self->{DIR}}){ + push @m, $self->subdir_x($dir); +#### print "Including $dir subdirectory\n"; + } + if (@m){ + unshift @m, <<'EOF'; + +# The default clean, realclean and test targets in this Makefile +# have automatically been given entries for each subdir. + +EOF + } else { + push(@m, "\n# none") + } + join('',@m); +} + + +sub test { + my($self, %attribs) = @_; + my $tests = $attribs{TESTS} || ''; + if (!$tests && -d 't' && defined $attribs{RECURSIVE_TEST_FILES}) { + $tests = $self->find_tests_recursive; + } + elsif (!$tests && -d 't') { + $tests = $self->find_tests; + } + # have to do this because nmake is broken + $tests =~ s!/!\\!g if $self->is_make_type('nmake'); + # note: 'test.pl' name is also hardcoded in init_dirscan() + my @m; + my $default_testtype = $Config{usedl} ? 'dynamic' : 'static'; + push @m, <{SKIPHASH}{$_}, $linktype, "pure_all"; # no depend on a linktype if SKIPped + push @m, "subdirs-test_$linktype :: $directdeps\n"; + foreach my $dir (@{ $self->{DIR} }) { + my $test = $self->cd($dir, "\$(MAKE) test_$linktype \$(PASTHRU)"); + push @m, "\t\$(NOECHO) $test\n"; + } + push @m, "\n"; + if ($tests or -f "test.pl") { + for my $testspec ([ '', '' ], [ 'db', ' $(TESTDB_SW)' ]) { + my ($db, $switch) = @$testspec; + my ($command, $deps); + # if testdb, build all but don't test all + $deps = $db eq 'db' ? $directdeps : "subdirs-test_$linktype"; + if ($linktype eq 'static' and $self->needs_linking) { + my $target = File::Spec->rel2abs('$(MAP_TARGET)'); + $command = qq{"$target" \$(MAP_PERLINC)}; + $deps .= ' $(MAP_TARGET)'; + } else { + $command = '$(FULLPERLRUN)' . $switch; + } + push @m, "test${db}_$linktype :: $deps\n"; + if ($db eq 'db') { + push @m, $self->test_via_script($command, '$(TEST_FILE)') + } else { + push @m, $self->test_via_script($command, '$(TEST_FILE)') + if -f "test.pl"; + push @m, $self->test_via_harness($command, '$(TEST_FILES)') + if $tests; + } + push @m, "\n"; + } + } else { + push @m, _sprintf562 <<'EOF', $linktype; +testdb_%1$s test_%1$s :: subdirs-test_%1$s + $(NOECHO) $(ECHO) 'No tests defined for $(NAME) extension.' + +EOF + } + } + + join "", @m; +} + + +sub test_via_harness { + my($self, $perl, $tests) = @_; + return $self->SUPER::test_via_harness("PERL_DL_NONLAZY=1 $perl", $tests); +} + + +sub test_via_script { + my($self, $perl, $script) = @_; + return $self->SUPER::test_via_script("PERL_DL_NONLAZY=1 $perl", $script); +} + + + +sub tool_xsubpp { + my($self) = shift; + return "" unless $self->needs_linking; + + my $xsdir; + my @xsubpp_dirs = @INC; + + # Make sure we pick up the new xsubpp if we're building perl. + unshift @xsubpp_dirs, $self->{PERL_LIB} if $self->{PERL_CORE}; + + my $foundxsubpp = 0; + foreach my $dir (@xsubpp_dirs) { + $xsdir = $self->catdir($dir, 'ExtUtils'); + if( -r $self->catfile($xsdir, "xsubpp") ) { + $foundxsubpp = 1; + last; + } + } + die "ExtUtils::MM_Unix::tool_xsubpp : Can't find xsubpp" if !$foundxsubpp; + + my $tmdir = $self->catdir($self->{PERL_LIB},"ExtUtils"); + my(@tmdeps) = $self->catfile($tmdir,'typemap'); + if( $self->{TYPEMAPS} ){ + foreach my $typemap (@{$self->{TYPEMAPS}}){ + if( ! -f $typemap ) { + warn "Typemap $typemap not found.\n"; + } + else { + $typemap = vmsify($typemap) if $Is{VMS}; + push(@tmdeps, $typemap); + } + } + } + push(@tmdeps, "typemap") if -f "typemap"; + # absolutised because with deep-located typemaps, eg "lib/XS/typemap", + # if xsubpp is called from top level with + # $(XSUBPP) ... -typemap "lib/XS/typemap" "lib/XS/Test.xs" + # it says: + # Can't find lib/XS/type map in (fulldir)/lib/XS + # because ExtUtils::ParseXS::process_file chdir's to .xs file's + # location. This is the only way to get all specified typemaps used, + # wherever located. + my @tmargs = map { '-typemap '.$self->quote_literal(File::Spec->rel2abs($_)) } @tmdeps; + $_ = $self->quote_dep($_) for @tmdeps; + if( exists $self->{XSOPT} ){ + unshift( @tmargs, $self->{XSOPT} ); + } + + if ($Is{VMS} && + $Config{'ldflags'} && + $Config{'ldflags'} =~ m!/Debug!i && + (!exists($self->{XSOPT}) || $self->{XSOPT} !~ /linenumbers/) + ) + { + unshift(@tmargs,'-nolinenumbers'); + } + + + $self->{XSPROTOARG} = "" unless defined $self->{XSPROTOARG}; + my $xsdirdep = $self->quote_dep($xsdir); + # -dep for use when dependency not command + + return qq{ +XSUBPPDIR = $xsdir +XSUBPP = "\$(XSUBPPDIR)\$(DFSEP)xsubpp" +XSUBPPRUN = \$(PERLRUN) \$(XSUBPP) +XSPROTOARG = $self->{XSPROTOARG} +XSUBPPDEPS = @tmdeps $xsdirdep\$(DFSEP)xsubpp +XSUBPPARGS = @tmargs +XSUBPP_EXTRA_ARGS = +}; +} + + + +sub all_target { + my $self = shift; + + return <<'MAKE_EXT'; +all :: pure_all manifypods + $(NOECHO) $(NOOP) +MAKE_EXT +} + + +sub top_targets { +# --- Target Sections --- + + my($self) = shift; + my(@m); + + push @m, $self->all_target, "\n" unless $self->{SKIPHASH}{'all'}; + + push @m, sprintf <<'EOF'; +pure_all :: config pm_to_blib subdirs linkext + $(NOECHO) $(NOOP) + + $(NOECHO) $(NOOP) + +subdirs :: $(MYEXTLIB) + $(NOECHO) $(NOOP) + +config :: $(FIRST_MAKEFILE) blibdirs + $(NOECHO) $(NOOP) +EOF + + push @m, ' +$(O_FILES) : $(H_FILES) +' if @{$self->{O_FILES} || []} && @{$self->{H} || []}; + + push @m, q{ +help : + perldoc ExtUtils::MakeMaker +}; + + join('',@m); +} + + +sub writedoc { +# --- perllocal.pod section --- + my($self,$what,$name,@attribs)=@_; + my $time = gmtime($ENV{SOURCE_DATE_EPOCH} || time); + print "=head2 $time: $what C<$name>\n\n=over 4\n\n=item *\n\n"; + print join "\n\n=item *\n\n", map("C<$_>",@attribs); + print "\n\n=back\n\n"; +} + + +sub xs_c { + my($self) = shift; + return '' unless $self->needs_linking(); + ' +.xs.c: + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $(XSUBPP_EXTRA_ARGS) $*.xs > $*.xsc + $(MV) $*.xsc $*.c +'; +} + + +sub xs_cpp { + my($self) = shift; + return '' unless $self->needs_linking(); + ' +.xs.cpp: + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc + $(MV) $*.xsc $*.cpp +'; +} + + +sub xs_o { + my ($self) = @_; + return '' unless $self->needs_linking(); + my $m_o = $self->{XSMULTI} ? $self->xs_obj_opt('$*$(OBJ_EXT)') : ''; + my $frag = ''; + # dmake makes noise about ambiguous rule + $frag .= sprintf <<'EOF', $m_o unless $self->is_make_type('dmake'); +.xs$(OBJ_EXT) : + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc + $(MV) $*.xsc $*.c + $(CCCMD) $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) $(DEFINE) $*.c %s +EOF + if ($self->{XSMULTI}) { + for my $ext ($self->_xs_list_basenames) { + my $pmfile = "$ext.pm"; + croak "$ext.xs has no matching $pmfile: $!" unless -f $pmfile; + my $version = $self->parse_version($pmfile); + my $cccmd = $self->{CONST_CCCMD}; + $cccmd =~ s/^\s*CCCMD\s*=\s*//; + $cccmd =~ s/\$\(DEFINE_VERSION\)/-DVERSION=\\"$version\\"/; + $cccmd =~ s/\$\(XS_DEFINE_VERSION\)/-DXS_VERSION=\\"$version\\"/; + $self->_xsbuild_replace_macro($cccmd, 'xs', $ext, 'INC'); + my $define = '$(DEFINE)'; + $self->_xsbuild_replace_macro($define, 'xs', $ext, 'DEFINE'); + # 1 2 3 4 + $frag .= _sprintf562 <<'EOF', $ext, $cccmd, $m_o, $define; + +%1$s$(OBJ_EXT): %1$s.xs + $(XSUBPPRUN) $(XSPROTOARG) $(XSUBPPARGS) $*.xs > $*.xsc + $(MV) $*.xsc $*.c + %2$s $(CCCDLFLAGS) "-I$(PERL_INC)" $(PASTHRU_DEFINE) %4$s $*.c %3$s +EOF + } + } + $frag; +} + +# param gets modified +sub _xsbuild_replace_macro { + my ($self, undef, $xstype, $ext, $varname) = @_; + my $value = $self->_xsbuild_value($xstype, $ext, $varname); + return unless defined $value; + $_[1] =~ s/\$\($varname\)/$value/; +} + +sub _xsbuild_value { + my ($self, $xstype, $ext, $varname) = @_; + return $self->{XSBUILD}{$xstype}{$ext}{$varname} + if $self->{XSBUILD}{$xstype}{$ext}{$varname}; + return $self->{XSBUILD}{$xstype}{all}{$varname} + if $self->{XSBUILD}{$xstype}{all}{$varname}; + (); +} + +1; + + +__END__ +package ExtUtils::MM; + +use strict; +use ExtUtils::MakeMaker::Config; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +require ExtUtils::Liblist; +require ExtUtils::MakeMaker; +our @ISA = qw(ExtUtils::Liblist ExtUtils::MakeMaker); + + +{ + # Convenient alias. + package MM; + our @ISA = qw(ExtUtils::MM); + sub DESTROY {} +} + +sub _is_win95 { + # miniperl might not have the Win32 functions available and we need + # to run in miniperl. + my $have_win32 = eval { require Win32 }; + return $have_win32 && defined &Win32::IsWin95 ? Win32::IsWin95() + : ! defined $ENV{SYSTEMROOT}; +} + +my %Is = (); +$Is{VMS} = $^O eq 'VMS'; +$Is{OS2} = $^O eq 'os2'; +$Is{MacOS} = $^O eq 'MacOS'; +if( $^O eq 'MSWin32' ) { + _is_win95() ? $Is{Win95} = 1 : $Is{Win32} = 1; +} +$Is{UWIN} = $^O =~ /^uwin(-nt)?$/; +$Is{Cygwin} = $^O eq 'cygwin'; +$Is{NW5} = $Config{osname} eq 'NetWare'; # intentional +$Is{BeOS} = ($^O =~ /beos/i or $^O eq 'haiku'); +$Is{DOS} = $^O eq 'dos'; +if( $Is{NW5} ) { + $^O = 'NetWare'; + delete $Is{Win32}; +} +$Is{VOS} = $^O eq 'vos'; +$Is{QNX} = $^O eq 'qnx'; +$Is{AIX} = $^O eq 'aix'; +$Is{Darwin} = $^O eq 'darwin'; + +$Is{Unix} = !grep { $_ } values %Is; + +map { delete $Is{$_} unless $Is{$_} } keys %Is; +_assert( keys %Is == 1 ); +my($OS) = keys %Is; + + +my $class = "ExtUtils::MM_$OS"; +eval "require $class" unless $INC{"ExtUtils/MM_$OS.pm"}; ## no critic +die $@ if $@; +unshift @ISA, $class; + + +sub _assert { + my $sanity = shift; + die sprintf "Assert failed at %s line %d\n", (caller)[1,2] unless $sanity; + return; +} +#--------------------------------------------------------------------------# +# This is a modified copy of version.pm 0.9909, bundled exclusively for +# use by ExtUtils::Makemaker and its dependencies to bootstrap when +# version.pm is not available. It should not be used by ordinary modules. +# +# When loaded, it will try to load version.pm. If that fails, it will load +# ExtUtils::MakeMaker::version::vpp and alias various *version functions +# to functions in that module. It will also override UNIVERSAL::VERSION. +#--------------------------------------------------------------------------# + +package ExtUtils::MakeMaker::version; + +use 5.006001; +use strict; + +use vars qw(@ISA $VERSION $CLASS $STRICT $LAX *declare *qv); + +$VERSION = '7.34'; +$VERSION = eval $VERSION; +$CLASS = 'version'; + +{ + local $SIG{'__DIE__'}; + eval "use version"; + if ( $@ ) { # don't have any version.pm installed + eval "use ExtUtils::MakeMaker::version::vpp"; + die "$@" if ( $@ ); + local $^W; + delete $INC{'version.pm'}; + $INC{'version.pm'} = $INC{'ExtUtils/MakeMaker/version.pm'}; + push @version::ISA, "ExtUtils::MakeMaker::version::vpp"; + $version::VERSION = $VERSION; + *version::qv = \&ExtUtils::MakeMaker::version::vpp::qv; + *version::declare = \&ExtUtils::MakeMaker::version::vpp::declare; + *version::_VERSION = \&ExtUtils::MakeMaker::version::vpp::_VERSION; + *version::vcmp = \&ExtUtils::MakeMaker::version::vpp::vcmp; + *version::new = \&ExtUtils::MakeMaker::version::vpp::new; + if ($] >= 5.009000) { + no strict 'refs'; + *version::stringify = \&ExtUtils::MakeMaker::version::vpp::stringify; + *{'version::(""'} = \&ExtUtils::MakeMaker::version::vpp::stringify; + *{'version::(<=>'} = \&ExtUtils::MakeMaker::version::vpp::vcmp; + *version::parse = \&ExtUtils::MakeMaker::version::vpp::parse; + } + require ExtUtils::MakeMaker::version::regex; + *version::is_lax = \&ExtUtils::MakeMaker::version::regex::is_lax; + *version::is_strict = \&ExtUtils::MakeMaker::version::regex::is_strict; + *LAX = \$ExtUtils::MakeMaker::version::regex::LAX; + *STRICT = \$ExtUtils::MakeMaker::version::regex::STRICT; + } + elsif ( ! version->can('is_qv') ) { + *version::is_qv = sub { exists $_[0]->{qv} }; + } +} + +1; +package ExtUtils::MakeMaker::Config; + +use strict; + +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +use Config (); + +# Give us an overridable config. +our %Config = %Config::Config; + +sub import { + my $caller = caller; + + no strict 'refs'; ## no critic + *{$caller.'::Config'} = \%Config; +} + +1; + + +package ExtUtils::MakeMaker::Locale; + +use strict; +our $VERSION = "7.34"; +$VERSION = eval $VERSION; + +use base 'Exporter'; +our @EXPORT_OK = qw( + decode_argv env + $ENCODING_LOCALE $ENCODING_LOCALE_FS + $ENCODING_CONSOLE_IN $ENCODING_CONSOLE_OUT +); + +use Encode (); +use Encode::Alias (); + +our $ENCODING_LOCALE; +our $ENCODING_LOCALE_FS; +our $ENCODING_CONSOLE_IN; +our $ENCODING_CONSOLE_OUT; + +sub DEBUG () { 0 } + +sub _init { + if ($^O eq "MSWin32") { + unless ($ENCODING_LOCALE) { + # Try to obtain what the Windows ANSI code page is + eval { + unless (defined &GetConsoleCP) { + require Win32; + # manually "import" it since Win32->import refuses + *GetConsoleCP = sub { &Win32::GetConsoleCP } if defined &Win32::GetConsoleCP; + } + unless (defined &GetConsoleCP) { + require Win32::API; + Win32::API->Import('kernel32', 'int GetConsoleCP()'); + } + if (defined &GetConsoleCP) { + my $cp = GetConsoleCP(); + $ENCODING_LOCALE = "cp$cp" if $cp; + } + }; + } + + unless ($ENCODING_CONSOLE_IN) { + # only test one since set together + unless (defined &GetInputCP) { + eval { + require Win32; + eval { Win32::GetConsoleCP() }; + # manually "import" it since Win32->import refuses + *GetInputCP = sub { &Win32::GetConsoleCP } if defined &Win32::GetConsoleCP; + *GetOutputCP = sub { &Win32::GetConsoleOutputCP } if defined &Win32::GetConsoleOutputCP; + }; + unless (defined &GetInputCP) { + eval { + # try Win32::Console module for codepage to use + require Win32::Console; + *GetInputCP = sub { &Win32::Console::InputCP } + if defined &Win32::Console::InputCP; + *GetOutputCP = sub { &Win32::Console::OutputCP } + if defined &Win32::Console::OutputCP; + }; + } + unless (defined &GetInputCP) { + # final fallback + *GetInputCP = *GetOutputCP = sub { + # another fallback that could work is: + # reg query HKLM\System\CurrentControlSet\Control\Nls\CodePage /v ACP + ((qx(chcp) || '') =~ /^Active code page: (\d+)/) + ? $1 : (); + }; + } + } + my $cp = GetInputCP(); + $ENCODING_CONSOLE_IN = "cp$cp" if $cp; + $cp = GetOutputCP(); + $ENCODING_CONSOLE_OUT = "cp$cp" if $cp; + } + } + + unless ($ENCODING_LOCALE) { + eval { + require I18N::Langinfo; + $ENCODING_LOCALE = I18N::Langinfo::langinfo(I18N::Langinfo::CODESET()); + + # Workaround of Encode < v2.25. The "646" encoding alias was + # introduced in Encode-2.25, but we don't want to require that version + # quite yet. Should avoid the CPAN testers failure reported from + # openbsd-4.7/perl-5.10.0 combo. + $ENCODING_LOCALE = "ascii" if $ENCODING_LOCALE eq "646"; + + # https://rt.cpan.org/Ticket/Display.html?id=66373 + $ENCODING_LOCALE = "hp-roman8" if $^O eq "hpux" && $ENCODING_LOCALE eq "roman8"; + }; + $ENCODING_LOCALE ||= $ENCODING_CONSOLE_IN; + } + + if ($^O eq "darwin") { + $ENCODING_LOCALE_FS ||= "UTF-8"; + } + + # final fallback + $ENCODING_LOCALE ||= $^O eq "MSWin32" ? "cp1252" : "UTF-8"; + $ENCODING_LOCALE_FS ||= $ENCODING_LOCALE; + $ENCODING_CONSOLE_IN ||= $ENCODING_LOCALE; + $ENCODING_CONSOLE_OUT ||= $ENCODING_CONSOLE_IN; + + unless (Encode::find_encoding($ENCODING_LOCALE)) { + my $foundit; + if (lc($ENCODING_LOCALE) eq "gb18030") { + eval { + require Encode::HanExtra; + }; + if ($@) { + die "Need Encode::HanExtra to be installed to support locale codeset ($ENCODING_LOCALE), stopped"; + } + $foundit++ if Encode::find_encoding($ENCODING_LOCALE); + } + die "The locale codeset ($ENCODING_LOCALE) isn't one that perl can decode, stopped" + unless $foundit; + + } + + # use Data::Dump; ddx $ENCODING_LOCALE, $ENCODING_LOCALE_FS, $ENCODING_CONSOLE_IN, $ENCODING_CONSOLE_OUT; +} + +_init(); +Encode::Alias::define_alias(sub { + no strict 'refs'; + no warnings 'once'; + return ${"ENCODING_" . uc(shift)}; +}, "locale"); + +sub _flush_aliases { + no strict 'refs'; + for my $a (sort keys %Encode::Alias::Alias) { + if (defined ${"ENCODING_" . uc($a)}) { + delete $Encode::Alias::Alias{$a}; + warn "Flushed alias cache for $a" if DEBUG; + } + } +} + +sub reinit { + $ENCODING_LOCALE = shift; + $ENCODING_LOCALE_FS = shift; + $ENCODING_CONSOLE_IN = $ENCODING_LOCALE; + $ENCODING_CONSOLE_OUT = $ENCODING_LOCALE; + _init(); + _flush_aliases(); +} + +sub decode_argv { + die if defined wantarray; + for (@ARGV) { + $_ = Encode::decode(locale => $_, @_); + } +} + +sub env { + my $k = Encode::encode(locale => shift); + my $old = $ENV{$k}; + if (@_) { + my $v = shift; + if (defined $v) { + $ENV{$k} = Encode::encode(locale => $v); + } + else { + delete $ENV{$k}; + } + } + return Encode::decode(locale => $old) if defined wantarray; +} + +1; + +__END__ + +package ExtUtils::Constant::Utils; + +use strict; +use vars qw($VERSION @EXPORT_OK @ISA); +use Carp; + +@ISA = 'Exporter'; +@EXPORT_OK = qw(C_stringify perl_stringify); +$VERSION = '0.04'; + +use constant is_perl55 => ($] < 5.005_50); +use constant is_perl56 => ($] < 5.007 && $] > 5.005_50); +use constant is_sane_perl => $] > 5.007; + + +# Hopefully make a happy C identifier. +sub C_stringify { + local $_ = shift; + return unless defined $_; + # grr 5.6.1 + confess "Wide character in '$_' intended as a C identifier" + if tr/\0-\377// != length; + # grr 5.6.1 more so because its regexps will break on data that happens to + # be utf8, which includes my 8 bit test cases. + $_ = pack 'C*', unpack 'U*', $_ . pack 'U*' if is_perl56; + s/\\/\\\\/g; + s/([\"\'])/\\$1/g; # Grr. fix perl mode. + s/\n/\\n/g; # Ensure newlines don't end up in octal + s/\r/\\r/g; + s/\t/\\t/g; + s/\f/\\f/g; + s/\a/\\a/g; + unless (is_perl55) { + # This will elicit a warning on 5.005_03 about [: :] being reserved unless + # I cheat + my $cheat = '([[:^print:]])'; + + if (ord('A') == 193) { # EBCDIC has no ^\0-\177 workalike. + s/$cheat/sprintf "\\%03o", ord $1/ge; + } else { + s/([^\0-\177])/sprintf "\\%03o", ord $1/ge; + } + + s/$cheat/sprintf "\\%03o", ord $1/ge; + } else { + require POSIX; + s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge; + } + $_; +} + + +# Hopefully make a happy perl identifier. +sub perl_stringify { + local $_ = shift; + return unless defined $_; + s/\\/\\\\/g; + s/([\"\'])/\\$1/g; # Grr. fix perl mode. + s/\n/\\n/g; # Ensure newlines don't end up in octal + s/\r/\\r/g; + s/\t/\\t/g; + s/\f/\\f/g; + s/\a/\\a/g; + unless (is_perl55) { + # This will elicit a warning on 5.005_03 about [: :] being reserved unless + # I cheat + my $cheat = '([[:^print:]])'; + if (is_sane_perl) { + if (ord('A') == 193) { # EBCDIC has no ^\0-\177 workalike. + s/$cheat/sprintf "\\x{%X}", ord $1/ge; + } else { + s/([^\0-\177])/sprintf "\\x{%X}", ord $1/ge; + } + } else { + # Grr 5.6.1. And I don't think I can use utf8; to force the regexp + # because 5.005_03 will fail. + # This is grim, but I also can't split on // + my $copy; + foreach my $index (0 .. length ($_) - 1) { + my $char = substr ($_, $index, 1); + $copy .= ($char le "\177") ? $char : sprintf "\\x{%X}", ord $char; + } + $_ = $copy; + } + s/$cheat/sprintf "\\%03o", ord $1/ge; + } else { + # Turns out "\x{}" notation only arrived with 5.6 + s/([^\0-\177])/sprintf "\\x%02X", ord $1/ge; + require POSIX; + s/([^A-Za-z0-9_])/POSIX::isprint($1) ? $1 : sprintf "\\%03o", ord $1/ge; + } + $_; +} + +1; +__END__ + +package ExtUtils::Constant::ProxySubs; + +use strict; +use vars qw($VERSION @ISA %type_to_struct %type_from_struct %type_to_sv + %type_to_C_value %type_is_a_problem %type_num_args + %type_temporary); +use Carp; +require ExtUtils::Constant::XS; +use ExtUtils::Constant::Utils qw(C_stringify); +use ExtUtils::Constant::XS qw(%XS_TypeSet); + +$VERSION = '0.09'; +@ISA = 'ExtUtils::Constant::XS'; + +%type_to_struct = + ( + IV => '{const char *name; I32 namelen; IV value;}', + NV => '{const char *name; I32 namelen; NV value;}', + UV => '{const char *name; I32 namelen; UV value;}', + PV => '{const char *name; I32 namelen; const char *value;}', + PVN => '{const char *name; I32 namelen; const char *value; STRLEN len;}', + YES => '{const char *name; I32 namelen;}', + NO => '{const char *name; I32 namelen;}', + UNDEF => '{const char *name; I32 namelen;}', + '' => '{const char *name; I32 namelen;} ', + ); + +%type_from_struct = + ( + IV => sub { $_[0] . '->value' }, + NV => sub { $_[0] . '->value' }, + UV => sub { $_[0] . '->value' }, + PV => sub { $_[0] . '->value' }, + PVN => sub { $_[0] . '->value', $_[0] . '->len' }, + YES => sub {}, + NO => sub {}, + UNDEF => sub {}, + '' => sub {}, + ); + +%type_to_sv = + ( + IV => sub { "newSViv($_[0])" }, + NV => sub { "newSVnv($_[0])" }, + UV => sub { "newSVuv($_[0])" }, + PV => sub { "newSVpv($_[0], 0)" }, + PVN => sub { "newSVpvn($_[0], $_[1])" }, + YES => sub { '&PL_sv_yes' }, + NO => sub { '&PL_sv_no' }, + UNDEF => sub { '&PL_sv_undef' }, + '' => sub { '&PL_sv_yes' }, + SV => sub {"SvREFCNT_inc($_[0])"}, + ); + +%type_to_C_value = + ( + YES => sub {}, + NO => sub {}, + UNDEF => sub {}, + '' => sub {}, + ); + +sub type_to_C_value { + my ($self, $type) = @_; + return $type_to_C_value{$type} || sub {return map {ref $_ ? @$_ : $_} @_}; +} + +# TODO - figure out if there is a clean way for the type_to_sv code to +# attempt s/sv_2mortal// and if it succeeds tell type_to_sv not to add +# SvREFCNT_inc +%type_is_a_problem = + ( + # The documentation says *mortal SV*, but we now need a non-mortal copy. + SV => 1, + ); + +%type_temporary = + ( + SV => ['SV *'], + PV => ['const char *'], + PVN => ['const char *', 'STRLEN'], + ); +$type_temporary{$_} = [$_] foreach qw(IV UV NV); + +while (my ($type, $value) = each %XS_TypeSet) { + $type_num_args{$type} + = defined $value ? ref $value ? scalar @$value : 1 : 0; +} +$type_num_args{''} = 0; + +sub partition_names { + my ($self, $default_type, @items) = @_; + my (%found, @notfound, @trouble); + + while (my $item = shift @items) { + my $default = delete $item->{default}; + if ($default) { + # If we find a default value, convert it into a regular item and + # append it to the queue of items to process + my $default_item = {%$item}; + $default_item->{invert_macro} = 1; + $default_item->{pre} = delete $item->{def_pre}; + $default_item->{post} = delete $item->{def_post}; + $default_item->{type} = shift @$default; + $default_item->{value} = $default; + push @items, $default_item; + } else { + # It can be "not found" unless it's the default (invert the macro) + # or the "macro" is an empty string (ie no macro) + push @notfound, $item unless $item->{invert_macro} + or !$self->macro_to_ifdef($self->macro_from_item($item)); + } + + if ($item->{pre} or $item->{post} or $item->{not_constant} + or $type_is_a_problem{$item->{type}}) { + push @trouble, $item; + } else { + push @{$found{$item->{type}}}, $item; + } + } + # use Data::Dumper; print Dumper \%found; + (\%found, \@notfound, \@trouble); +} + +sub boottime_iterator { + my ($self, $type, $iterator, $hash, $subname, $push) = @_; + my $extractor = $type_from_struct{$type}; + die "Can't find extractor code for type $type" + unless defined $extractor; + my $generator = $type_to_sv{$type}; + die "Can't find generator code for type $type" + unless defined $generator; + + my $athx = $self->C_constant_prefix_param(); + + if ($push) { + return sprintf <<"EOBOOT", &$generator(&$extractor($iterator)); + while ($iterator->name) { + he = $subname($athx $hash, $iterator->name, + $iterator->namelen, %s); + av_push(push, newSVhek(HeKEY_hek(he))); + ++$iterator; + } +EOBOOT + } else { + return sprintf <<"EOBOOT", &$generator(&$extractor($iterator)); + while ($iterator->name) { + $subname($athx $hash, $iterator->name, + $iterator->namelen, %s); + ++$iterator; + } +EOBOOT + } +} + +sub name_len_value_macro { + my ($self, $item) = @_; + my $name = $item->{name}; + my $value = $item->{value}; + $value = $item->{name} unless defined $value; + + my $namelen = length $name; + if ($name =~ tr/\0-\377// != $namelen) { + # the hash API signals UTF-8 by passing the length negated. + utf8::encode($name); + $namelen = -length $name; + } + $name = C_stringify($name); + + my $macro = $self->macro_from_item($item); + ($name, $namelen, $value, $macro); +} + +sub WriteConstants { + my $self = shift; + my $ARGS = {@_}; + + my ($c_fh, $xs_fh, $c_subname, $default_type, $package) + = @{$ARGS}{qw(C_FH XS_FH C_SUBNAME DEFAULT_TYPE NAME)}; + + my $xs_subname + = exists $ARGS->{XS_SUBNAME} ? $ARGS->{XS_SUBNAME} : 'constant'; + + my $options = $ARGS->{PROXYSUBS}; + $options = {} unless ref $options; + my $push = $options->{push}; + my $explosives = $options->{croak_on_read}; + my $croak_on_error = $options->{croak_on_error}; + my $autoload = $options->{autoload}; + { + my $exclusive = 0; + ++$exclusive if $explosives; + ++$exclusive if $croak_on_error; + ++$exclusive if $autoload; + + # Until someone patches this (with test cases): + carp ("PROXYSUBS options 'autoload', 'croak_on_read' and 'croak_on_error' cannot be used together") + if $exclusive > 1; + } + # Strictly it requires Perl_caller_cx + carp ("PROXYSUBS option 'croak_on_error' requires v5.13.5 or later") + if $croak_on_error && $^V < v5.13.5; + # Strictly this is actually 5.8.9, but it's not well tested there + my $can_do_pcs = $] >= 5.009; + # Until someone patches this (with test cases) + carp ("PROXYSUBS option 'push' requires v5.10 or later") + if $push && !$can_do_pcs; + # Until someone patches this (with test cases) + carp ("PROXYSUBS options 'push' and 'croak_on_read' cannot be used together") + if $explosives && $push; + + # If anyone is insane enough to suggest a package name containing % + my $package_sprintf_safe = $package; + $package_sprintf_safe =~ s/%/%%/g; + + # All the types we see + my $what = {}; + # A hash to lookup items with. + my $items = {}; + + my @items = $self->normalise_items ({disable_utf8_duplication => 1}, + $default_type, $what, $items, + @{$ARGS->{NAMES}}); + + # Partition the values by type. Also include any defaults in here + # Everything that doesn't have a default needs alternative code for + # "I'm missing" + # And everything that has pre or post code ends up in a private block + my ($found, $notfound, $trouble) + = $self->partition_names($default_type, @items); + + my $pthx = $self->C_constant_prefix_param_defintion(); + my $athx = $self->C_constant_prefix_param(); + my $symbol_table = C_stringify($package) . '::'; + $push = C_stringify($package . '::' . $push) if $push; + my $cast_CONSTSUB = $] < 5.010 ? '(char *)' : ''; + + print $c_fh $self->header(); + if ($autoload || $croak_on_error) { + print $c_fh <<'EOC'; + +/* This allows slightly more efficient code on !USE_ITHREADS: */ +#ifdef USE_ITHREADS +# define COP_FILE(c) CopFILE(c) +# define COP_FILE_F "s" +#else +# define COP_FILE(c) CopFILESV(c) +# define COP_FILE_F SVf +#endif +EOC + } + + my $return_type = $push ? 'HE *' : 'void'; + + print $c_fh <<"EOADD"; + +static $return_type +${c_subname}_add_symbol($pthx HV *hash, const char *name, I32 namelen, SV *value) { +EOADD + if (!$can_do_pcs) { + print $c_fh <<'EO_NOPCS'; + if (namelen == namelen) { +EO_NOPCS + } else { + print $c_fh <<"EO_PCS"; + HE *he = (HE*) hv_common_key_len(hash, name, namelen, HV_FETCH_LVALUE, NULL, + 0); + SV *sv; + + if (!he) { + croak("Couldn't add key '%s' to %%$package_sprintf_safe\::", + name); + } + sv = HeVAL(he); + if (SvOK(sv) || SvTYPE(sv) == SVt_PVGV) { + /* Someone has been here before us - have to make a real sub. */ +EO_PCS + } + # This piece of code is common to both + print $c_fh <<"EOADD"; + newCONSTSUB(hash, ${cast_CONSTSUB}name, value); +EOADD + if ($can_do_pcs) { + print $c_fh <<'EO_PCS'; + } else { + SvUPGRADE(sv, SVt_RV); + SvRV_set(sv, value); + SvROK_on(sv); + SvREADONLY_on(value); + } +EO_PCS + } else { + print $c_fh <<'EO_NOPCS'; + } +EO_NOPCS + } + print $c_fh " return he;\n" if $push; + print $c_fh <<'EOADD'; +} + +EOADD + + print $c_fh $explosives ? <<"EXPLODE" : "\n"; + +static int +Im_sorry_Dave(pTHX_ SV *sv, MAGIC *mg) +{ + PERL_UNUSED_ARG(mg); + croak("Your vendor has not defined $package_sprintf_safe macro %"SVf + " used", sv); + NORETURN_FUNCTION_END; +} + +static MGVTBL not_defined_vtbl = { + Im_sorry_Dave, /* get - I'm afraid I can't do that */ + Im_sorry_Dave, /* set */ + 0, /* len */ + 0, /* clear */ + 0, /* free */ + 0, /* copy */ + 0, /* dup */ +}; + +EXPLODE + +{ + my $key = $symbol_table; + # Just seems tidier (and slightly more space efficient) not to have keys + # such as Fcntl:: + $key =~ s/::$//; + my $key_len = length $key; + + print $c_fh <<"MISSING"; + +#ifndef SYMBIAN + +/* Store a hash of all symbols missing from the package. To avoid trampling on + the package namespace (uninvited) put each package's hash in our namespace. + To avoid creating lots of typeblogs and symbol tables for sub-packages, put + each package's hash into one hash in our namespace. */ + +static HV * +get_missing_hash(pTHX) { + HV *const parent + = get_hv("ExtUtils::Constant::ProxySubs::Missing", GVf_MULTI); + /* We could make a hash of hashes directly, but this would confuse anything + at Perl space that looks at us, and as we're visible in Perl space, + best to play nice. */ + SV *const *const ref + = hv_fetch(parent, "$key", $key_len, TRUE); + HV *new_hv; + + if (!ref) + return NULL; + + if (SvROK(*ref)) + return (HV*) SvRV(*ref); + + new_hv = newHV(); + SvUPGRADE(*ref, SVt_RV); + SvRV_set(*ref, (SV *)new_hv); + SvROK_on(*ref); + return new_hv; +} + +#endif + +MISSING + +} + + print $xs_fh <<"EOBOOT"; +BOOT: + { +#if defined(dTHX) && !defined(PERL_NO_GET_CONTEXT) + dTHX; +#endif + HV *symbol_table = get_hv("$symbol_table", GV_ADD); +EOBOOT + if ($push) { + print $xs_fh <<"EOC"; + AV *push = get_av(\"$push\", GV_ADD); + HE *he; +EOC + } + + my %iterator; + + $found->{''} + = [map {{%$_, type=>'', invert_macro => 1}} @$notfound]; + + foreach my $type (sort keys %$found) { + my $struct = $type_to_struct{$type}; + my $type_to_value = $self->type_to_C_value($type); + my $number_of_args = $type_num_args{$type}; + die "Can't find structure definition for type $type" + unless defined $struct; + + my $lc_type = $type ? lc($type) : 'notfound'; + my $struct_type = $lc_type . '_s'; + my $array_name = 'values_for_' . $lc_type; + $iterator{$type} = 'value_for_' . $lc_type; + # Give the notfound struct file scope. The others are scoped within the + # BOOT block + my $struct_fh = $type ? $xs_fh : $c_fh; + + print $c_fh "struct $struct_type $struct;\n"; + + print $struct_fh <<"EOBOOT"; + + static const struct $struct_type $array_name\[] = + { +EOBOOT + + + foreach my $item (@{$found->{$type}}) { + my ($name, $namelen, $value, $macro) + = $self->name_len_value_macro($item); + + my $ifdef = $self->macro_to_ifdef($macro); + if (!$ifdef && $item->{invert_macro}) { + carp("Attempting to supply a default for '$name' which has no conditional macro"); + next; + } + if ($item->{invert_macro}) { + print $struct_fh $self->macro_to_ifndef($macro); + print $struct_fh + " /* This is the default value: */\n" if $type; + } else { + print $struct_fh $ifdef; + } + print $struct_fh " { ", join (', ', "\"$name\"", $namelen, + &$type_to_value($value)), + " },\n", + $self->macro_to_endif($macro); + } + + # Terminate the list with a NULL + print $struct_fh " { NULL, 0", (", 0" x $number_of_args), " } };\n"; + + print $xs_fh <<"EOBOOT" if $type; + const struct $struct_type *$iterator{$type} = $array_name; +EOBOOT + } + + delete $found->{''}; + + my $add_symbol_subname = $c_subname . '_add_symbol'; + foreach my $type (sort keys %$found) { + print $xs_fh $self->boottime_iterator($type, $iterator{$type}, + 'symbol_table', + $add_symbol_subname, $push); + } + + print $xs_fh <<"EOBOOT"; + if (C_ARRAY_LENGTH(values_for_notfound) > 1) { +#ifndef SYMBIAN + HV *const ${c_subname}_missing = get_missing_hash(aTHX); +#endif + const struct notfound_s *value_for_notfound = values_for_notfound; + do { +EOBOOT + + print $xs_fh $explosives ? <<"EXPLODE" : << "DONT"; + SV *tripwire = newSV(0); + + sv_magicext(tripwire, 0, PERL_MAGIC_ext, ¬_defined_vtbl, 0, 0); + SvPV_set(tripwire, (char *)value_for_notfound->name); + if(value_for_notfound->namelen >= 0) { + SvCUR_set(tripwire, value_for_notfound->namelen); + } else { + SvCUR_set(tripwire, -value_for_notfound->namelen); + SvUTF8_on(tripwire); + } + SvPOKp_on(tripwire); + SvREADONLY_on(tripwire); + assert(SvLEN(tripwire) == 0); + + $add_symbol_subname($athx symbol_table, value_for_notfound->name, + value_for_notfound->namelen, tripwire); +EXPLODE + + /* Need to add prototypes, else parsing will vary by platform. */ + HE *he = (HE*) hv_common_key_len(symbol_table, + value_for_notfound->name, + value_for_notfound->namelen, + HV_FETCH_LVALUE, NULL, 0); + SV *sv; +#ifndef SYMBIAN + HEK *hek; +#endif + if (!he) { + croak("Couldn't add key '%s' to %%$package_sprintf_safe\::", + value_for_notfound->name); + } + sv = HeVAL(he); + if (!SvOK(sv) && SvTYPE(sv) != SVt_PVGV) { + /* Nothing was here before, so mark a prototype of "" */ + sv_setpvn(sv, "", 0); + } else if (SvPOK(sv) && SvCUR(sv) == 0) { + /* There is already a prototype of "" - do nothing */ + } else { + /* Someone has been here before us - have to make a real + typeglob. */ + /* It turns out to be incredibly hard to deal with all the + corner cases of sub foo (); and reporting errors correctly, + so lets cheat a bit. Start with a constant subroutine */ + CV *cv = newCONSTSUB(symbol_table, + ${cast_CONSTSUB}value_for_notfound->name, + &PL_sv_yes); + /* and then turn it into a non constant declaration only. */ + SvREFCNT_dec(CvXSUBANY(cv).any_ptr); + CvCONST_off(cv); + CvXSUB(cv) = NULL; + CvXSUBANY(cv).any_ptr = NULL; + } +#ifndef SYMBIAN + hek = HeKEY_hek(he); + if (!hv_common(${c_subname}_missing, NULL, HEK_KEY(hek), + HEK_LEN(hek), HEK_FLAGS(hek), HV_FETCH_ISSTORE, + &PL_sv_yes, HEK_HASH(hek))) + croak("Couldn't add key '%s' to missing_hash", + value_for_notfound->name); +#endif +DONT + + print $xs_fh " av_push(push, newSVhek(hek));\n" + if $push; + + print $xs_fh <<"EOBOOT"; + } while ((++value_for_notfound)->name); + } +EOBOOT + + foreach my $item (@$trouble) { + my ($name, $namelen, $value, $macro) + = $self->name_len_value_macro($item); + my $ifdef = $self->macro_to_ifdef($macro); + my $type = $item->{type}; + my $type_to_value = $self->type_to_C_value($type); + + print $xs_fh $ifdef; + if ($item->{invert_macro}) { + print $xs_fh + " /* This is the default value: */\n" if $type; + print $xs_fh "#else\n"; + } + my $generator = $type_to_sv{$type}; + die "Can't find generator code for type $type" + unless defined $generator; + + print $xs_fh " {\n"; + # We need to use a temporary value because some really troublesome + # items use C pre processor directives in their values, and in turn + # these don't fit nicely in the macro-ised generator functions + my $counter = 0; + printf $xs_fh " %s temp%d;\n", $_, $counter++ + foreach @{$type_temporary{$type}}; + + print $xs_fh " $item->{pre}\n" if $item->{pre}; + + # And because the code in pre might be both declarations and + # statements, we can't declare and assign to the temporaries in one. + $counter = 0; + printf $xs_fh " temp%d = %s;\n", $counter++, $_ + foreach &$type_to_value($value); + + my @tempvarnames = map {sprintf 'temp%d', $_} 0 .. $counter - 1; + printf $xs_fh <<"EOBOOT", $name, &$generator(@tempvarnames); + ${c_subname}_add_symbol($athx symbol_table, "%s", + $namelen, %s); +EOBOOT + print $xs_fh " $item->{post}\n" if $item->{post}; + print $xs_fh " }\n"; + + print $xs_fh $self->macro_to_endif($macro); + } + + if ($] >= 5.009) { + print $xs_fh <blk_oldcop : PL_curcop; +EOC + +void +AUTOLOAD() + PROTOTYPE: DISABLE + PREINIT: + SV *sv = newSVpvn_flags(SvPVX(cv), SvCUR(cv), SVs_TEMP | SvUTF8(cv)); + const COP *cop = PL_curcop; +EOA + print $xs_fh <<"EOC"; + PPCODE: +#ifndef SYMBIAN + /* It's not obvious how to calculate this at C pre-processor time. + However, any compiler optimiser worth its salt should be able to + remove the dead code, and hopefully the now-obviously-unused static + function too. */ + HV *${c_subname}_missing = (C_ARRAY_LENGTH(values_for_notfound) > 1) + ? get_missing_hash(aTHX) : NULL; + if ((C_ARRAY_LENGTH(values_for_notfound) > 1) + ? hv_exists_ent(${c_subname}_missing, sv, 0) : 0) { + sv = newSVpvf("Your vendor has not defined $package_sprintf_safe macro %" SVf + ", used at %" COP_FILE_F " line %" UVuf "\\n", + sv, COP_FILE(cop), (UV)CopLINE(cop)); + } else +#endif + { + sv = newSVpvf("%" SVf + " is not a valid $package_sprintf_safe macro at %" + COP_FILE_F " line %" UVuf "\\n", + sv, COP_FILE(cop), (UV)CopLINE(cop)); + } + croak_sv(sv_2mortal(sv)); +EOC + } else { + print $xs_fh $explosives ? <<"EXPLODE" : <<"DONT"; + +void +$xs_subname(sv) + INPUT: + SV * sv; + PPCODE: + sv = newSVpvf("Your vendor has not defined $package_sprintf_safe macro %" SVf + ", used", sv); + PUSHs(sv_2mortal(sv)); +EXPLODE + +void +$xs_subname(sv) + INPUT: + SV * sv; + PPCODE: +#ifndef SYMBIAN + /* It's not obvious how to calculate this at C pre-processor time. + However, any compiler optimiser worth its salt should be able to + remove the dead code, and hopefully the now-obviously-unused static + function too. */ + HV *${c_subname}_missing = (C_ARRAY_LENGTH(values_for_notfound) > 1) + ? get_missing_hash(aTHX) : NULL; + if ((C_ARRAY_LENGTH(values_for_notfound) > 1) + ? hv_exists_ent(${c_subname}_missing, sv, 0) : 0) { + sv = newSVpvf("Your vendor has not defined $package_sprintf_safe macro %" SVf + ", used", sv); + } else +#endif + { + sv = newSVpvf("%" SVf " is not a valid $package_sprintf_safe macro", + sv); + } + PUSHs(sv_2mortal(sv)); +DONT + } +} + +1; +package ExtUtils::Constant::Base; + +use strict; +use vars qw($VERSION); +use Carp; +use Text::Wrap; +use ExtUtils::Constant::Utils qw(C_stringify perl_stringify); +$VERSION = '0.06'; + +use constant is_perl56 => ($] < 5.007 && $] > 5.005_50); + + + +sub valid_type { + # Default to assuming that you don't need different types of return data. + 1; +} +sub default_type { + ''; +} + + +sub header { + '' +} + +# This might actually be a return statement. Note that you are responsible +# for any space you might need before your value, as it lets to perform +# "tricks" such as "return KEY_" and have strings appended. +sub assignment_clause_for_type; +# In which case this might be an empty string +sub return_statement_for_type {undef}; +sub return_statement_for_notdef; +sub return_statement_for_notfound; + +# "#if 1" is true to a C pre-processor +sub macro_from_name { + 1; +} + +sub macro_from_item { + 1; +} + +sub macro_to_ifdef { + my ($self, $macro) = @_; + if (ref $macro) { + return $macro->[0]; + } + if (defined $macro && $macro ne "" && $macro ne "1") { + return $macro ? "#ifdef $macro\n" : "#if 0\n"; + } + return ""; +} + +sub macro_to_ifndef { + my ($self, $macro) = @_; + if (ref $macro) { + # Can't invert these stylishly, so "bodge it" + return "$macro->[0]#else\n"; + } + if (defined $macro && $macro ne "" && $macro ne "1") { + return $macro ? "#ifndef $macro\n" : "#if 1\n"; + } + croak "Can't generate an ifndef for unconditional code"; +} + +sub macro_to_endif { + my ($self, $macro) = @_; + + if (ref $macro) { + return $macro->[1]; + } + if (defined $macro && $macro ne "" && $macro ne "1") { + return "#endif\n"; + } + return ""; +} + +sub name_param { + 'name'; +} + +# This is possibly buggy, in that it's not mandatory (below, in the main +# C_constant parameters, but is expected to exist here, if it's needed) +# Buggy because if you're definitely pure 8 bit only, and will never be +# presented with your constants in utf8, the default form of C_constant can't +# be told not to do the utf8 version. + +sub is_utf8_param { + 'utf8'; +} + +sub memEQ { + "!memcmp"; +} + + +sub memEQ_clause { +# if (memEQ(name, "thingy", 6)) { + # Which could actually be a character comparison or even "" + my ($self, $args) = @_; + my ($name, $checked_at, $indent) = @{$args}{qw(name checked_at indent)}; + $indent = ' ' x ($indent || 4); + my $front_chop; + if (ref $checked_at) { + # regexp won't work on 5.6.1 without use utf8; in turn that won't work + # on 5.005_03. + substr ($name, 0, length $$checked_at,) = ''; + $front_chop = C_stringify ($$checked_at); + undef $checked_at; + } + my $len = length $name; + + if ($len < 2) { + return $indent . "{\n" + if (defined $checked_at and $checked_at == 0) or $len == 0; + # We didn't switch, drop through to the code for the 2 character string + $checked_at = 1; + } + + my $name_param = $self->name_param; + + if ($len < 3 and defined $checked_at) { + my $check; + if ($checked_at == 1) { + $check = 0; + } elsif ($checked_at == 0) { + $check = 1; + } + if (defined $check) { + my $char = C_stringify (substr $name, $check, 1); + # Placate 5.005 with a break in the string. I can't see a good way of + # getting it to not take [ as introducing an array lookup, even with + # ${name_param}[$check] + return $indent . "if ($name_param" . "[$check] == '$char') {\n"; + } + } + if (($len == 2 and !defined $checked_at) + or ($len == 3 and defined ($checked_at) and $checked_at == 2)) { + my $char1 = C_stringify (substr $name, 0, 1); + my $char2 = C_stringify (substr $name, 1, 1); + return $indent . + "if ($name_param" . "[0] == '$char1' && $name_param" . "[1] == '$char2') {\n"; + } + if (($len == 3 and defined ($checked_at) and $checked_at == 1)) { + my $char1 = C_stringify (substr $name, 0, 1); + my $char2 = C_stringify (substr $name, 2, 1); + return $indent . + "if ($name_param" . "[0] == '$char1' && $name_param" . "[2] == '$char2') {\n"; + } + + my $pointer = '^'; + my $have_checked_last = defined ($checked_at) && $len == $checked_at + 1; + if ($have_checked_last) { + # Checked at the last character, so no need to memEQ it. + $pointer = C_stringify (chop $name); + $len--; + } + + $name = C_stringify ($name); + my $memEQ = $self->memEQ(); + my $body = $indent . "if ($memEQ($name_param, \"$name\", $len)) {\n"; + # Put a little ^ under the letter we checked at + # Screws up for non printable and non-7 bit stuff, but that's too hard to + # get right. + if (defined $checked_at) { + $body .= $indent . "/* " . (' ' x length $memEQ) + . (' ' x length $name_param) + . (' ' x $checked_at) . $pointer + . (' ' x ($len - $checked_at + length $len)) . " */\n"; + } elsif (defined $front_chop) { + $body .= $indent . "/* $front_chop" + . (' ' x ($len + 1 + length $len)) . " */\n"; + } + return $body; +} + + +sub dump_names { + my ($self, $args, @items) = @_; + my ($default_type, $what, $indent, $declare_types) + = @{$args}{qw(default_type what indent declare_types)}; + $indent = ' ' x ($indent || 0); + + my $result; + my (@simple, @complex, %used_types); + foreach (@items) { + my $type; + if (ref $_) { + $type = $_->{type} || $default_type; + if ($_->{utf8}) { + # For simplicity always skip the bytes case, and reconstitute this entry + # from its utf8 twin. + next if $_->{utf8} eq 'no'; + # Copy the hashref, as we don't want to mess with the caller's hashref. + $_ = {%$_}; + unless (is_perl56) { + utf8::decode ($_->{name}); + } else { + $_->{name} = pack 'U*', unpack 'U0U*', $_->{name}; + } + delete $_->{utf8}; + } + } else { + $_ = {name=>$_}; + $type = $default_type; + } + $used_types{$type}++; + if ($type eq $default_type + # grr 5.6.1 + and length $_->{name} + and length $_->{name} == ($_->{name} =~ tr/A-Za-z0-9_//) + and !defined ($_->{macro}) and !defined ($_->{value}) + and !defined ($_->{default}) and !defined ($_->{pre}) + and !defined ($_->{post}) and !defined ($_->{def_pre}) + and !defined ($_->{def_post}) and !defined ($_->{weight})) { + # It's the default type, and the name consists only of A-Za-z0-9_ + push @simple, $_->{name}; + } else { + push @complex, $_; + } + } + + if (!defined $declare_types) { + # Do they pass in any types we weren't already using? + foreach (keys %$what) { + next if $used_types{$_}; + $declare_types++; # Found one in $what that wasn't used. + last; # And one is enough to terminate this loop + } + } + if ($declare_types) { + $result = $indent . 'my $types = {map {($_, 1)} qw(' + . join (" ", sort keys %$what) . ")};\n"; + } + local $Text::Wrap::huge = 'overflow'; + local $Text::Wrap::columns = 80; + $result .= wrap ($indent . "my \@names = (qw(", + $indent . " ", join (" ", sort @simple) . ")"); + if (@complex) { + foreach my $item (sort {$a->{name} cmp $b->{name}} @complex) { + my $name = perl_stringify $item->{name}; + my $line = ",\n$indent {name=>\"$name\""; + $line .= ", type=>\"$item->{type}\"" if defined $item->{type}; + foreach my $thing (qw (macro value default pre post def_pre def_post)) { + my $value = $item->{$thing}; + if (defined $value) { + if (ref $value) { + $line .= ", $thing=>[\"" + . join ('", "', map {perl_stringify $_} @$value) . '"]'; + } else { + $line .= ", $thing=>\"" . perl_stringify($value) . "\""; + } + } + } + $line .= "}"; + # Ensure that the enclosing C comment doesn't end + # by turning */ into *" . "/ + $line =~ s!\*\/!\*" . "/!gs; + # gcc -Wall doesn't like finding /* inside a comment + $line =~ s!\/\*!/" . "\*!gs; + $result .= $line; + } + } + $result .= ");\n"; + + $result; +} + +# Hmm. value undef to do NOTDEF? value () to do NOTFOUND? + +sub assign { + my $self = shift; + my $args = shift; + my ($indent, $type, $pre, $post, $item) + = @{$args}{qw(indent type pre post item)}; + $post ||= ''; + my $clause; + my $close; + if ($pre) { + chomp $pre; + $close = "$indent}\n"; + $clause = $indent . "{\n"; + $indent .= " "; + $clause .= "$indent$pre"; + $clause .= ";" unless $pre =~ /;$/; + $clause .= "\n"; + } + confess "undef \$type" unless defined $type; + confess "Can't generate code for type $type" + unless $self->valid_type($type); + + $clause .= join '', map {"$indent$_\n"} + $self->assignment_clause_for_type({type=>$type,item=>$item}, @_); + chomp $post; + if (length $post) { + $clause .= "$post"; + $clause .= ";" unless $post =~ /;$/; + $clause .= "\n"; + } + my $return = $self->return_statement_for_type($type); + $clause .= "$indent$return\n" if defined $return; + $clause .= $close if $close; + return $clause; +} + + +sub return_clause { + +##ifdef thingy +# *iv_return = thingy; +# return PERL_constant_ISIV; +##else +# return PERL_constant_NOTDEF; +##endif + my ($self, $args, $item) = @_; + my $indent = $args->{indent}; + + my ($name, $value, $default, $pre, $post, $def_pre, $def_post, $type) + = @$item{qw (name value default pre post def_pre def_post type)}; + $value = $name unless defined $value; + my $macro = $self->macro_from_item($item); + $indent = ' ' x ($indent || 6); + unless (defined $type) { + # use Data::Dumper; print STDERR Dumper ($item); + confess "undef \$type"; + } + + ##ifdef thingy + my $clause = $self->macro_to_ifdef($macro); + + # *iv_return = thingy; + # return PERL_constant_ISIV; + $clause + .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre, post=>$post, + item=>$item}, ref $value ? @$value : $value); + + if (defined $macro && $macro ne "" && $macro ne "1") { + ##else + $clause .= "#else\n"; + + # return PERL_constant_NOTDEF; + if (!defined $default) { + my $notdef = $self->return_statement_for_notdef(); + $clause .= "$indent$notdef\n" if defined $notdef; + } else { + my @default = ref $default ? @$default : $default; + $type = shift @default; + $clause .= $self->assign ({indent=>$indent, type=>$type, pre=>$pre, + post=>$post, item=>$item}, @default); + } + } + ##endif + $clause .= $self->macro_to_endif($macro); + + return $clause; +} + +sub match_clause { + # $offset defined if we have checked an offset. + my ($self, $args, $item) = @_; + my ($offset, $indent) = @{$args}{qw(checked_at indent)}; + $indent = ' ' x ($indent || 4); + my $body = ''; + my ($no, $yes, $either, $name, $inner_indent); + if (ref $item eq 'ARRAY') { + ($yes, $no) = @$item; + $either = $yes || $no; + confess "$item is $either expecting hashref in [0] || [1]" + unless ref $either eq 'HASH'; + $name = $either->{name}; + } else { + confess "$item->{name} has utf8 flag '$item->{utf8}', should be false" + if $item->{utf8}; + $name = $item->{name}; + $inner_indent = $indent; + } + + $body .= $self->memEQ_clause ({name => $name, checked_at => $offset, + indent => length $indent}); + # If we've been presented with an arrayref for $item, then the user string + # contains in the range 128-255, and we need to check whether it was utf8 + # (or not). + # In the worst case we have two named constants, where one's name happens + # encoded in UTF8 happens to be the same byte sequence as the second's + # encoded in (say) ISO-8859-1. + # In this case, $yes and $no both have item hashrefs. + if ($yes) { + $body .= $indent . " if (" . $self->is_utf8_param . ") {\n"; + } elsif ($no) { + $body .= $indent . " if (!" . $self->is_utf8_param . ") {\n"; + } + if ($either) { + $body .= $self->return_clause ({indent=>4 + length $indent}, $either); + if ($yes and $no) { + $body .= $indent . " } else {\n"; + $body .= $self->return_clause ({indent=>4 + length $indent}, $no); + } + $body .= $indent . " }\n"; + } else { + $body .= $self->return_clause ({indent=>2 + length $indent}, $item); + } + $body .= $indent . "}\n"; +} + + + +sub switch_clause { + my ($self, $args, $namelen, $items, @items) = @_; + my ($indent, $comment) = @{$args}{qw(indent comment)}; + $indent = ' ' x ($indent || 2); + + local $Text::Wrap::huge = 'overflow'; + local $Text::Wrap::columns = 80; + + my @names = sort map {$_->{name}} @items; + my $leader = $indent . '/* '; + my $follower = ' ' x length $leader; + my $body = $indent . "/* Names all of length $namelen. */\n"; + if (defined $comment) { + $body = wrap ($leader, $follower, $comment) . "\n"; + $leader = $follower; + } + my @safe_names = @names; + foreach (@safe_names) { + confess sprintf "Name '$_' is length %d, not $namelen", length + unless length == $namelen; + # Argh. 5.6.1 + # next unless tr/A-Za-z0-9_//c; + next if tr/A-Za-z0-9_// == length; + $_ = '"' . perl_stringify ($_) . '"'; + # Ensure that the enclosing C comment doesn't end + # by turning */ into *" . "/ + s!\*\/!\*"."/!gs; + # gcc -Wall doesn't like finding /* inside a comment + s!\/\*!/"."\*!gs; + } + $body .= wrap ($leader, $follower, join (" ", @safe_names) . " */") . "\n"; + # Figure out what to switch on. + # (RMS, Spread of jump table, Position, Hashref) + my @best = (1e38, ~0); + # Prefer the last character over the others. (As it lets us shorten the + # memEQ clause at no cost). + foreach my $i ($namelen - 1, 0 .. ($namelen - 2)) { + my ($min, $max) = (~0, 0); + my %spread; + if (is_perl56) { + # Need proper Unicode preserving hash keys for bytes in range 128-255 + # here too, for some reason. grr 5.6.1 yet again. + tie %spread, 'ExtUtils::Constant::Aaargh56Hash'; + } + foreach (@names) { + my $char = substr $_, $i, 1; + my $ord = ord $char; + confess "char $ord is out of range" if $ord > 255; + $max = $ord if $ord > $max; + $min = $ord if $ord < $min; + push @{$spread{$char}}, $_; + # warn "$_ $char"; + } + # I'm going to pick the character to split on that minimises the root + # mean square of the number of names in each case. Normally this should + # be the one with the most keys, but it may pick a 7 where the 8 has + # one long linear search. I'm not sure if RMS or just sum of squares is + # actually better. + # $max and $min are for the tie-breaker if the root mean squares match. + # Assuming that the compiler may be building a jump table for the + # switch() then try to minimise the size of that jump table. + # Finally use < not <= so that if it still ties the earliest part of + # the string wins. Because if that passes but the memEQ fails, it may + # only need the start of the string to bin the choice. + # I think. But I'm micro-optimising. :-) + # OK. Trump that. Now favour the last character of the string, before the + # rest. + my $ss; + $ss += @$_ * @$_ foreach values %spread; + my $rms = sqrt ($ss / keys %spread); + if ($rms < $best[0] || ($rms == $best[0] && ($max - $min) < $best[1])) { + @best = ($rms, $max - $min, $i, \%spread); + } + } + confess "Internal error. Failed to pick a switch point for @names" + unless defined $best[2]; + # use Data::Dumper; print Dumper (@best); + my ($offset, $best) = @best[2,3]; + $body .= $indent . "/* Offset $offset gives the best switch position. */\n"; + + my $do_front_chop = $offset == 0 && $namelen > 2; + if ($do_front_chop) { + $body .= $indent . "switch (*" . $self->name_param() . "++) {\n"; + } else { + $body .= $indent . "switch (" . $self->name_param() . "[$offset]) {\n"; + } + foreach my $char (sort keys %$best) { + confess sprintf "'$char' is %d bytes long, not 1", length $char + if length ($char) != 1; + confess sprintf "char %#X is out of range", ord $char if ord ($char) > 255; + $body .= $indent . "case '" . C_stringify ($char) . "':\n"; + foreach my $thisone (sort { + # Deal with the case of an item actually being an array ref to 1 or 2 + # hashrefs. Don't assign to $a or $b, as they're aliases to the + # original + my $l = ref $a eq 'ARRAY' ? ($a->[0] || $->[1]) : $a; + my $r = ref $b eq 'ARRAY' ? ($b->[0] || $->[1]) : $b; + # Sort by weight first + ($r->{weight} || 0) <=> ($l->{weight} || 0) + # Sort equal weights by name + or $l->{name} cmp $r->{name}} + # If this looks evil, maybe it is. $items is a + # hashref, and we're doing a hash slice on it + @{$items}{@{$best->{$char}}}) { + # warn "You are here"; + if ($do_front_chop) { + $body .= $self->match_clause ({indent => 2 + length $indent, + checked_at => \$char}, $thisone); + } else { + $body .= $self->match_clause ({indent => 2 + length $indent, + checked_at => $offset}, $thisone); + } + } + $body .= $indent . " break;\n"; + } + $body .= $indent . "}\n"; + return $body; +} + +sub C_constant_return_type { + "static int"; +} + +sub C_constant_prefix_param { + ''; +} + +sub C_constant_prefix_param_defintion { + ''; +} + +sub name_param_definition { + "const char *" . $_[0]->name_param; +} + +sub namelen_param { + 'len'; +} + +sub namelen_param_definition { + 'size_t ' . $_[0]->namelen_param; +} + +sub C_constant_other_params { + ''; +} + +sub C_constant_other_params_defintion { + ''; +} + + +sub params { + ''; +} + + + +sub dogfood { + '' +} + + +sub normalise_items +{ + my $self = shift; + my $args = shift; + my $default_type = shift; + my $what = shift; + my $items = shift; + my @new_items; + foreach my $orig (@_) { + my ($name, $item); + if (ref $orig) { + # Make a copy which is a normalised version of the ref passed in. + $name = $orig->{name}; + my ($type, $macro, $value) = @$orig{qw (type macro value)}; + $type ||= $default_type; + $what->{$type} = 1; + $item = {name=>$name, type=>$type}; + + undef $macro if defined $macro and $macro eq $name; + $item->{macro} = $macro if defined $macro; + undef $value if defined $value and $value eq $name; + $item->{value} = $value if defined $value; + foreach my $key (qw(default pre post def_pre def_post weight + not_constant)) { + my $value = $orig->{$key}; + $item->{$key} = $value if defined $value; + # warn "$key $value"; + } + } else { + $name = $orig; + $item = {name=>$name, type=>$default_type}; + $what->{$default_type} = 1; + } + warn +(ref ($self) || $self) + . "doesn't know how to handle values of type $_ used in macro $name" + unless $self->valid_type ($item->{type}); + # tr///c is broken on 5.6.1 for utf8, so my original tr/\0-\177//c + # doesn't work. Upgrade to 5.8 + # if ($name !~ tr/\0-\177//c || $] < 5.005_50) { + if ($name =~ tr/\0-\177// == length $name || $] < 5.005_50 + || $args->{disable_utf8_duplication}) { + # No characters outside 7 bit ASCII. + if (exists $items->{$name}) { + die "Multiple definitions for macro $name"; + } + $items->{$name} = $item; + } else { + # No characters outside 8 bit. This is hardest. + if (exists $items->{$name} and ref $items->{$name} ne 'ARRAY') { + confess "Unexpected ASCII definition for macro $name"; + } + # Again, 5.6.1 tr broken, so s/5\.6.*/5\.8\.0/; + # if ($name !~ tr/\0-\377//c) { + if ($name =~ tr/\0-\377// == length $name) { +# if ($] < 5.007) { +# $name = pack "C*", unpack "U*", $name; +# } + $item->{utf8} = 'no'; + $items->{$name}[1] = $item; + push @new_items, $item; + # Copy item, to create the utf8 variant. + $item = {%$item}; + } + # Encode the name as utf8 bytes. + unless (is_perl56) { + utf8::encode($name); + } else { +# warn "Was >$name< " . length ${name}; + $name = pack 'C*', unpack 'C*', $name . pack 'U*'; +# warn "Now '${name}' " . length ${name}; + } + if ($items->{$name}[0]) { + die "Multiple definitions for macro $name"; + } + $item->{utf8} = 'yes'; + $item->{name} = $name; + $items->{$name}[0] = $item; + # We have need for the utf8 flag. + $what->{''} = 1; + } + push @new_items, $item; + } + @new_items; +} + + +# The parameter now BREAKOUT was previously documented as: +# +# I if defined signals that all the Is of the Is are of +# this length, and that the constant name passed in by perl is checked and +# also of this length. It is used during recursion, and should be C +# unless the caller has checked all the lengths during code generation, and +# the generated subroutine is only to be called with a name of this length. +# +# As you can see it now performs this function during recursion by being a +# scalar reference. + +sub C_constant { + my ($self, $args, @items) = @_; + my ($package, $subname, $default_type, $what, $indent, $breakout) = + @{$args}{qw(package subname default_type types indent breakout)}; + $package ||= 'Foo'; + $subname ||= 'constant'; + # I'm not using this. But a hashref could be used for full formatting without + # breaking this API + # $indent ||= 0; + + my ($namelen, $items); + if (ref $breakout) { + # We are called recursively. We trust @items to be normalised, $what to + # be a hashref, and pinch %$items from our parent to save recalculation. + ($namelen, $items) = @$breakout; + } else { + $items = {}; + if (is_perl56) { + # Need proper Unicode preserving hash keys. + require ExtUtils::Constant::Aaargh56Hash; + tie %$items, 'ExtUtils::Constant::Aaargh56Hash'; + } + $breakout ||= 3; + $default_type ||= $self->default_type(); + if (!ref $what) { + # Convert line of the form IV,UV,NV to hash + $what = {map {$_ => 1} split /,\s*/, ($what || '')}; + # Figure out what types we're dealing with, and assign all unknowns to the + # default type + } + @items = $self->normalise_items ({}, $default_type, $what, $items, @items); + # use Data::Dumper; print Dumper @items; + } + my $params = $self->params ($what); + + # Probably "static int" + my ($body, @subs); + $body = $self->C_constant_return_type($params) . "\n$subname (" + # Eg "pTHX_ " + . $self->C_constant_prefix_param_defintion($params) + # Probably "const char *name" + . $self->name_param_definition($params); + # Something like ", STRLEN len" + $body .= ", " . $self->namelen_param_definition($params) + unless defined $namelen; + $body .= $self->C_constant_other_params_defintion($params); + $body .= ") {\n"; + + if (defined $namelen) { + # We are a child subroutine. Print the simple description + my $comment = 'When generated this function returned values for the list' + . ' of names given here. However, subsequent manual editing may have' + . ' added or removed some.'; + $body .= $self->switch_clause ({indent=>2, comment=>$comment}, + $namelen, $items, @items); + } else { + # We are the top level. + $body .= " /* Initially switch on the length of the name. */\n"; + $body .= $self->dogfood ({package => $package, subname => $subname, + default_type => $default_type, what => $what, + indent => $indent, breakout => $breakout}, + @items); + $body .= ' switch ('.$self->namelen_param().") {\n"; + # Need to group names of the same length + my @by_length; + foreach (@items) { + push @{$by_length[length $_->{name}]}, $_; + } + foreach my $i (0 .. $#by_length) { + next unless $by_length[$i]; # None of this length + $body .= " case $i:\n"; + if (@{$by_length[$i]} == 1) { + my $only_thing = $by_length[$i]->[0]; + if ($only_thing->{utf8}) { + if ($only_thing->{utf8} eq 'yes') { + # With utf8 on flag item is passed in element 0 + $body .= $self->match_clause (undef, [$only_thing]); + } else { + # With utf8 off flag item is passed in element 1 + $body .= $self->match_clause (undef, [undef, $only_thing]); + } + } else { + $body .= $self->match_clause (undef, $only_thing); + } + } elsif (@{$by_length[$i]} < $breakout) { + $body .= $self->switch_clause ({indent=>4}, + $i, $items, @{$by_length[$i]}); + } else { + # Only use the minimal set of parameters actually needed by the types + # of the names of this length. + my $what = {}; + foreach (@{$by_length[$i]}) { + $what->{$_->{type}} = 1; + $what->{''} = 1 if $_->{utf8}; + } + $params = $self->params ($what); + push @subs, $self->C_constant ({package=>$package, + subname=>"${subname}_$i", + default_type => $default_type, + types => $what, indent => $indent, + breakout => [$i, $items]}, + @{$by_length[$i]}); + $body .= " return ${subname}_$i (" + # Eg "aTHX_ " + . $self->C_constant_prefix_param($params) + # Probably "name" + . $self->name_param($params); + $body .= $self->C_constant_other_params($params); + $body .= ");\n"; + } + $body .= " break;\n"; + } + $body .= " }\n"; + } + my $notfound = $self->return_statement_for_notfound(); + $body .= " $notfound\n" if $notfound; + $body .= "}\n"; + return (@subs, $body); +} + +1; +__END__ + +package ExtUtils::Constant::XS; + +use strict; +use vars qw($VERSION %XS_Constant %XS_TypeSet @ISA @EXPORT_OK $is_perl56); +use Carp; +use ExtUtils::Constant::Utils 'perl_stringify'; +require ExtUtils::Constant::Base; + + +@ISA = qw(ExtUtils::Constant::Base Exporter); +@EXPORT_OK = qw(%XS_Constant %XS_TypeSet); + +$VERSION = '0.03'; + +$is_perl56 = ($] < 5.007 && $] > 5.005_50); + + +# '' is used as a flag to indicate non-ascii macro names, and hence the need +# to pass in the utf8 on/off flag. +%XS_Constant = ( + '' => '', + IV => 'PUSHi(iv)', + UV => 'PUSHu((UV)iv)', + NV => 'PUSHn(nv)', + PV => 'PUSHp(pv, strlen(pv))', + PVN => 'PUSHp(pv, iv)', + SV => 'PUSHs(sv)', + YES => 'PUSHs(&PL_sv_yes)', + NO => 'PUSHs(&PL_sv_no)', + UNDEF => '', # implicit undef +); + +%XS_TypeSet = ( + IV => '*iv_return = ', + UV => '*iv_return = (IV)', + NV => '*nv_return = ', + PV => '*pv_return = ', + PVN => ['*pv_return = ', '*iv_return = (IV)'], + SV => '*sv_return = ', + YES => undef, + NO => undef, + UNDEF => undef, +); + +sub header { + my $start = 1; + my @lines; + push @lines, "#define PERL_constant_NOTFOUND\t$start\n"; $start++; + push @lines, "#define PERL_constant_NOTDEF\t$start\n"; $start++; + foreach (sort keys %XS_Constant) { + next if $_ eq ''; + push @lines, "#define PERL_constant_IS$_\t$start\n"; $start++; + } + push @lines, << 'EOT'; + +#ifndef NVTYPE +typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it. */ +#endif +#ifndef aTHX_ +#define aTHX_ /* 5.6 or later define this for threading support. */ +#endif +#ifndef pTHX_ +#define pTHX_ /* 5.6 or later define this for threading support. */ +#endif +EOT + + return join '', @lines; +} + +sub valid_type { + my ($self, $type) = @_; + return exists $XS_TypeSet{$type}; +} + +# This might actually be a return statement +sub assignment_clause_for_type { + my $self = shift; + my $args = shift; + my $type = $args->{type}; + my $typeset = $XS_TypeSet{$type}; + if (ref $typeset) { + die "Type $type is aggregate, but only single value given" + if @_ == 1; + return map {"$typeset->[$_]$_[$_];"} 0 .. $#$typeset; + } elsif (defined $typeset) { + confess "Aggregate value given for type $type" + if @_ > 1; + return "$typeset$_[0];"; + } + return (); +} + +sub return_statement_for_type { + my ($self, $type) = @_; + # In the future may pass in an options hash + $type = $type->{type} if ref $type; + "return PERL_constant_IS$type;"; +} + +sub return_statement_for_notdef { + # my ($self) = @_; + "return PERL_constant_NOTDEF;"; +} + +sub return_statement_for_notfound { + # my ($self) = @_; + "return PERL_constant_NOTFOUND;"; +} + +sub default_type { + 'IV'; +} + +sub macro_from_name { + my ($self, $item) = @_; + my $macro = $item->{name}; + $macro = $item->{value} unless defined $macro; + $macro; +} + +sub macro_from_item { + my ($self, $item) = @_; + my $macro = $item->{macro}; + $macro = $self->macro_from_name($item) unless defined $macro; + $macro; +} + +# Keep to the traditional perl source macro +sub memEQ { + "memEQ"; +} + +sub params { + my ($self, $what) = @_; + foreach (sort keys %$what) { + warn "ExtUtils::Constant doesn't know how to handle values of type $_" unless defined $XS_Constant{$_}; + } + my $params = {}; + $params->{''} = 1 if $what->{''}; + $params->{IV} = 1 if $what->{IV} || $what->{UV} || $what->{PVN}; + $params->{NV} = 1 if $what->{NV}; + $params->{PV} = 1 if $what->{PV} || $what->{PVN}; + $params->{SV} = 1 if $what->{SV}; + return $params; +} + + +sub C_constant_prefix_param { + "aTHX_ "; +} + +sub C_constant_prefix_param_defintion { + "pTHX_ "; +} + +sub namelen_param_definition { + 'STRLEN ' . $_[0] -> namelen_param; +} + +sub C_constant_other_params_defintion { + my ($self, $params) = @_; + my $body = ''; + $body .= ", int utf8" if $params->{''}; + $body .= ", IV *iv_return" if $params->{IV}; + $body .= ", NV *nv_return" if $params->{NV}; + $body .= ", const char **pv_return" if $params->{PV}; + $body .= ", SV **sv_return" if $params->{SV}; + $body; +} + +sub C_constant_other_params { + my ($self, $params) = @_; + my $body = ''; + $body .= ", utf8" if $params->{''}; + $body .= ", iv_return" if $params->{IV}; + $body .= ", nv_return" if $params->{NV}; + $body .= ", pv_return" if $params->{PV}; + $body .= ", sv_return" if $params->{SV}; + $body; +} + +sub dogfood { + my ($self, $args, @items) = @_; + my ($package, $subname, $default_type, $what, $indent, $breakout) = + @{$args}{qw(package subname default_type what indent breakout)}; + my $result = <<"EOT"; + /* When generated this function returned values for the list of names given + in this section of perl code. Rather than manually editing these functions + to add or remove constants, which would result in this comment and section + of code becoming inaccurate, we recommend that you edit this section of + code, and use it to regenerate a new set of constant functions which you + then use to replace the originals. + + Regenerate these constant functions by feeding this entire source file to + perl -x + +#!$^X -w +use ExtUtils::Constant qw (constant_types C_constant XS_constant); + +EOT + $result .= $self->dump_names ({default_type=>$default_type, what=>$what, + indent=>0, declare_types=>1}, + @items); + $result .= <<'EOT'; + +print constant_types(), "\n"; # macro defs +EOT + $package = perl_stringify($package); + $result .= + "foreach (C_constant (\"$package\", '$subname', '$default_type', \$types, "; + # The form of the indent parameter isn't defined. (Yet) + if (defined $indent) { + require Data::Dumper; + $Data::Dumper::Terse=1; + $Data::Dumper::Terse=1; # Not used once. :-) + chomp ($indent = Data::Dumper::Dumper ($indent)); + $result .= $indent; + } else { + $result .= 'undef'; + } + $result .= ", $breakout" . ', @names) ) { + print $_, "\n"; # C constant subs +} +print "\n#### XS Section:\n"; +print XS_constant ("' . $package . '", $types); +__END__ + */ + +'; + + $result; +} + +1; +package ExtUtils::CBuilder::Base; +use strict; +use warnings; +use File::Spec; +use File::Basename; +use Cwd (); +use Config; +use Text::ParseWords; +use IPC::Cmd qw(can_run); +use File::Temp qw(tempfile); + +our $VERSION = '0.280230'; # VERSION + +# More details about C/C++ compilers: +# http://developers.sun.com/sunstudio/documentation/product/compiler.jsp +# http://gcc.gnu.org/ +# http://publib.boulder.ibm.com/infocenter/comphelp/v101v121/index.jsp +# http://msdn.microsoft.com/en-us/vstudio/default.aspx + +my %cc2cxx = ( + # first line order is important to support wrappers like in pkgsrc + cc => [ 'c++', 'CC', 'aCC', 'cxx', ], # Sun Studio, HP ANSI C/C++ Compilers + gcc => [ 'g++' ], # GNU Compiler Collection + xlc => [ 'xlC' ], # IBM C/C++ Set, xlc without thread-safety + xlc_r => [ 'xlC_r' ], # IBM C/C++ Set, xlc with thread-safety + cl => [ 'cl' ], # Microsoft Visual Studio +); + +sub new { + my $class = shift; + my $self = bless {@_}, $class; + + $self->{properties}{perl} = $class->find_perl_interpreter + or warn "Warning: Can't locate your perl binary"; + + while (my ($k,$v) = each %Config) { + $self->{config}{$k} = $v unless exists $self->{config}{$k}; + } + $self->{config}{cc} = $ENV{CC} if defined $ENV{CC}; + $self->{config}{ccflags} = join(" ", $self->{config}{ccflags}, $ENV{CFLAGS}) + if defined $ENV{CFLAGS}; + $self->{config}{cxx} = $ENV{CXX} if defined $ENV{CXX}; + $self->{config}{cxxflags} = $ENV{CXXFLAGS} if defined $ENV{CXXFLAGS}; + $self->{config}{ld} = $ENV{LD} if defined $ENV{LD}; + $self->{config}{ldflags} = join(" ", $self->{config}{ldflags}, $ENV{LDFLAGS}) + if defined $ENV{LDFLAGS}; + + unless ( exists $self->{config}{cxx} ) { + + my ($ccbase, $ccpath, $ccsfx ) = fileparse($self->{config}{cc}, qr/\.[^.]*/); + + ## If the path is just "cc", fileparse returns $ccpath as "./" + $ccpath = "" if $self->{config}{cc} =~ /^$ccbase$ccsfx$/; + + foreach my $cxx (@{$cc2cxx{$ccbase}}) { + my $cxx1 = File::Spec->catfile( $ccpath, $cxx . $ccsfx); + + if( can_run( $cxx1 ) ) { + $self->{config}{cxx} = $cxx1; + last; + } + my $cxx2 = $cxx . $ccsfx; + + if( can_run( $cxx2 ) ) { + $self->{config}{cxx} = $cxx2; + last; + } + + if( can_run( $cxx ) ) { + $self->{config}{cxx} = $cxx; + last; + } + } + unless ( exists $self->{config}{cxx} ) { + $self->{config}{cxx} = $self->{config}{cc}; + my $cflags = $self->{config}{ccflags}; + $self->{config}{cxxflags} = '-x c++'; + $self->{config}{cxxflags} .= " $cflags" if defined $cflags; + } + } + + return $self; +} + +sub find_perl_interpreter { + my $perl; + File::Spec->file_name_is_absolute($perl = $^X) + or -f ($perl = $Config::Config{perlpath}) + or ($perl = $^X); # XXX how about using IPC::Cmd::can_run here? + return $perl; +} + +sub add_to_cleanup { + my $self = shift; + foreach (@_) { + $self->{files_to_clean}{$_} = 1; + } +} + +sub cleanup { + my $self = shift; + foreach my $file (keys %{$self->{files_to_clean}}) { + unlink $file; + } +} + +sub get_config { + return %{ $_[0]->{config} }; +} + +sub object_file { + my ($self, $filename) = @_; + + # File name, minus the suffix + (my $file_base = $filename) =~ s/\.[^.]+$//; + return "$file_base$self->{config}{obj_ext}"; +} + +sub arg_include_dirs { + my $self = shift; + return map {"-I$_"} @_; +} + +sub arg_nolink { '-c' } + +sub arg_object_file { + my ($self, $file) = @_; + return ('-o', $file); +} + +sub arg_share_object_file { + my ($self, $file) = @_; + return ($self->split_like_shell($self->{config}{lddlflags}), '-o', $file); +} + +sub arg_exec_file { + my ($self, $file) = @_; + return ('-o', $file); +} + +sub arg_defines { + my ($self, %args) = @_; + return map "-D$_=$args{$_}", sort keys %args; +} + +sub compile { + my ($self, %args) = @_; + die "Missing 'source' argument to compile()" unless defined $args{source}; + + my $cf = $self->{config}; # For convenience + + my $object_file = $args{object_file} + ? $args{object_file} + : $self->object_file($args{source}); + + my $include_dirs_ref = + (exists($args{include_dirs}) && ref($args{include_dirs}) ne "ARRAY") + ? [ $args{include_dirs} ] + : $args{include_dirs}; + my @include_dirs = $self->arg_include_dirs( + @{ $include_dirs_ref || [] }, + $self->perl_inc(), + ); + + my @defines = $self->arg_defines( %{$args{defines} || {}} ); + + my @extra_compiler_flags = + $self->split_like_shell($args{extra_compiler_flags}); + my @cccdlflags = $self->split_like_shell($cf->{cccdlflags}); + my @ccflags = $self->split_like_shell($args{'C++'} ? $cf->{cxxflags} : $cf->{ccflags}); + my @optimize = $self->split_like_shell($cf->{optimize}); + my @flags = ( + @include_dirs, + @defines, + @cccdlflags, + @extra_compiler_flags, + $self->arg_nolink, + @ccflags, + @optimize, + $self->arg_object_file($object_file), + ); + my @cc = $self->split_like_shell($args{'C++'} ? $cf->{cxx} : $cf->{cc}); + + $self->do_system(@cc, @flags, $args{source}) + or die "error building $object_file from '$args{source}'"; + + return $object_file; +} + +sub have_compiler { + my ($self, $is_cplusplus) = @_; + my $have_compiler_flag = $is_cplusplus ? "have_cxx" : "have_cc"; + my $suffix = $is_cplusplus ? ".cc" : ".c"; + return $self->{$have_compiler_flag} if defined $self->{$have_compiler_flag}; + + my $result; + my $attempts = 3; + # tmpdir has issues for some people so fall back to current dir + + # don't clobber existing files (rare, but possible) + my ( $FH, $tmpfile ) = tempfile( "compilet-XXXXX", SUFFIX => $suffix ); + binmode $FH; + + if ( $is_cplusplus ) { + print $FH "class Bogus { public: int boot_compilet() { return 1; } };\n"; + } + else { + print $FH "int boot_compilet() { return 1; }\n"; + } + close $FH; + + my ($obj_file, @lib_files); + eval { + local $^W = 0; + local $self->{quiet} = 1; + $obj_file = $self->compile('C++' => $is_cplusplus, source => $tmpfile); + @lib_files = $self->link(objects => $obj_file, module_name => 'compilet'); + }; + $result = $@ ? 0 : 1; + + foreach (grep defined, $tmpfile, $obj_file, @lib_files) { + 1 while unlink; + } + + return $self->{$have_compiler_flag} = $result; +} + +sub have_cplusplus { + push @_, 1; + goto &have_compiler; +} + +sub lib_file { + my ($self, $dl_file, %args) = @_; + $dl_file =~ s/\.[^.]+$//; + $dl_file =~ tr/"//d; + + if (defined $args{module_name} and length $args{module_name}) { + # Need to create with the same name as DynaLoader will load with. + require DynaLoader; + if (defined &DynaLoader::mod2fname) { + my $lib = DynaLoader::mod2fname([split /::/, $args{module_name}]); + my ($dev, $lib_dir, undef) = File::Spec->splitpath($dl_file); + $dl_file = File::Spec->catpath($dev, $lib_dir, $lib); + } + } + + $dl_file .= ".$self->{config}{dlext}"; + + return $dl_file; +} + + +sub exe_file { + my ($self, $dl_file) = @_; + $dl_file =~ s/\.[^.]+$//; + $dl_file =~ tr/"//d; + return "$dl_file$self->{config}{_exe}"; +} + +sub need_prelink { 0 } + +sub extra_link_args_after_prelink { return } + +sub prelink { + my ($self, %args) = @_; + + my ($dl_file_out, $mksymlists_args) = _prepare_mksymlists_args(\%args); + + require ExtUtils::Mksymlists; + # dl. abbrev for dynamic library + ExtUtils::Mksymlists::Mksymlists( %{ $mksymlists_args } ); + + # Mksymlists will create one of these files + return grep -e, map "$dl_file_out.$_", qw(ext def opt); +} + +sub _prepare_mksymlists_args { + my $args = shift; + ($args->{dl_file} = $args->{dl_name}) =~ s/.*::// unless $args->{dl_file}; + + my %mksymlists_args = ( + DL_VARS => $args->{dl_vars} || [], + DL_FUNCS => $args->{dl_funcs} || {}, + FUNCLIST => $args->{dl_func_list} || [], + IMPORTS => $args->{dl_imports} || {}, + NAME => $args->{dl_name}, # Name of the Perl module + DLBASE => $args->{dl_base}, # Basename of DLL file + FILE => $args->{dl_file}, # Dir + Basename of symlist file + VERSION => (defined $args->{dl_version} ? $args->{dl_version} : '0.0'), + ); + return ($args->{dl_file}, \%mksymlists_args); +} + +sub link { + my ($self, %args) = @_; + return $self->_do_link('lib_file', lddl => 1, %args); +} + +sub link_executable { + my ($self, %args) = @_; + return $self->_do_link('exe_file', lddl => 0, %args); +} + +sub _do_link { + my ($self, $type, %args) = @_; + + my $cf = $self->{config}; # For convenience + + my $objects = delete $args{objects}; + $objects = [$objects] unless ref $objects; + my $out = $args{$type} || $self->$type($objects->[0], %args); + + my @temp_files; + @temp_files = + $self->prelink(%args, dl_name => $args{module_name}) + if $args{lddl} && $self->need_prelink; + + my @linker_flags = ( + $self->split_like_shell($args{extra_linker_flags}), + $self->extra_link_args_after_prelink( + %args, dl_name => $args{module_name}, prelink_res => \@temp_files + ) + ); + + my @output = $args{lddl} + ? $self->arg_share_object_file($out) + : $self->arg_exec_file($out); + my @shrp = $self->split_like_shell($cf->{shrpenv}); + my @ld = $self->split_like_shell($cf->{ld}); + + $self->do_system(@shrp, @ld, @output, @$objects, @linker_flags) + or die "error building $out from @$objects"; + + return wantarray ? ($out, @temp_files) : $out; +} + + +sub do_system { + my ($self, @cmd) = @_; + print "@cmd\n" if !$self->{quiet}; + return !system(@cmd); +} + +sub split_like_shell { + my ($self, $string) = @_; + + return () unless defined($string); + return @$string if UNIVERSAL::isa($string, 'ARRAY'); + $string =~ s/^\s+|\s+$//g; + return () unless length($string); + + # Text::ParseWords replaces all 'escaped' characters with themselves, which completely + # breaks paths under windows. As such, we forcibly replace backwards slashes with forward + # slashes on windows. + $string =~ s@\\@/@g if $^O eq 'MSWin32'; + + return Text::ParseWords::shellwords($string); +} + +# if building perl, perl's main source directory +sub perl_src { + # N.B. makemaker actually searches regardless of PERL_CORE, but + # only squawks at not finding it if PERL_CORE is set + + return unless $ENV{PERL_CORE}; + + my $Updir = File::Spec->updir; + my $dir = File::Spec->curdir; + + # Try up to 5 levels upwards + for (0..10) { + if ( + -f File::Spec->catfile($dir,"config_h.SH") + && + -f File::Spec->catfile($dir,"perl.h") + && + -f File::Spec->catfile($dir,"lib","Exporter.pm") + ) { + return Cwd::realpath( $dir ); + } + + $dir = File::Spec->catdir($dir, $Updir); + } + + warn "PERL_CORE is set but I can't find your perl source!\n"; + return ''; # return empty string if $ENV{PERL_CORE} but can't find dir ??? +} + +# directory of perl's include files +sub perl_inc { + my $self = shift; + + $self->perl_src() || File::Spec->catdir($self->{config}{archlibexp},"CORE"); +} + +sub DESTROY { + my $self = shift; + local($., $@, $!, $^E, $?); + $self->cleanup(); +} + +1; + +# vim: ts=2 sw=2 et: +package ExtUtils::CBuilder::Platform::Windows; +use strict; +use warnings; + +use File::Basename; +use File::Spec; + +use ExtUtils::CBuilder::Base; +use IO::File; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Base); + + +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + my $cf = $self->{config}; + + # Inherit from an appropriate compiler driver class + my $driver = "ExtUtils::CBuilder::Platform::Windows::" . $self->_compiler_type; + eval "require $driver" or die "Could not load compiler driver: $@"; + unshift @ISA, $driver; + + return $self; +} + +sub _compiler_type { + my $self = shift; + my $cc = $self->{config}{cc}; + + return ( $cc =~ /cl(\.exe)?$/ ? 'MSVC' + : $cc =~ /bcc32(\.exe)?$/ ? 'BCC' + : 'GCC'); +} + +sub split_like_shell { + # Since Windows will pass the whole command string (not an argument + # array) to the target program and make the program parse it itself, + # we don't actually need to do any processing here. + (my $self, local $_) = @_; + + return @$_ if defined() && UNIVERSAL::isa($_, 'ARRAY'); + return unless defined() && length(); + return ($_); +} + +sub do_system { + # See above + my $self = shift; + my $cmd = join(" ", + grep length, + map {$a=$_;$a=~s/\t/ /g;$a=~s/^\s+|\s+$//;$a} + grep defined, @_); + return $self->SUPER::do_system($cmd); +} + +sub arg_defines { + my ($self, %args) = @_; + s/"/\\"/g foreach values %args; + return map qq{"-D$_=$args{$_}"}, sort keys %args; +} + +sub compile { + my ($self, %args) = @_; + my $cf = $self->{config}; + + die "Missing 'source' argument to compile()" unless defined $args{source}; + + $args{include_dirs} = [ $args{include_dirs} ] + if exists($args{include_dirs}) && ref($args{include_dirs}) ne "ARRAY"; + + my ($basename, $srcdir) = + ( File::Basename::fileparse($args{source}, '\.[^.]+$') )[0,1]; + + $srcdir ||= File::Spec->curdir(); + + my @defines = $self->arg_defines( %{ $args{defines} || {} } ); + + my %spec = ( + srcdir => $srcdir, + builddir => $srcdir, + basename => $basename, + source => $args{source}, + output => $args{object_file} || File::Spec->catfile($srcdir, $basename) . $cf->{obj_ext}, + cc => $cf->{cc}, + cflags => [ + $self->split_like_shell($cf->{ccflags}), + $self->split_like_shell($cf->{cccdlflags}), + $self->split_like_shell($args{extra_compiler_flags}), + ], + optimize => [ $self->split_like_shell($cf->{optimize}) ], + defines => \@defines, + includes => [ @{$args{include_dirs} || []} ], + perlinc => [ + $self->perl_inc(), + $self->split_like_shell($cf->{incpath}), + ], + use_scripts => 1, # XXX provide user option to change this??? + ); + + $self->normalize_filespecs( + \$spec{source}, + \$spec{output}, + $spec{includes}, + $spec{perlinc}, + ); + + my @cmds = $self->format_compiler_cmd(%spec); + while ( my $cmd = shift @cmds ) { + $self->do_system( @$cmd ) + or die "error building $cf->{dlext} file from '$args{source}'"; + } + + (my $out = $spec{output}) =~ tr/'"//d; + return $out; +} + +sub need_prelink { 1 } + +sub link { + my ($self, %args) = @_; + my $cf = $self->{config}; + + my @objects = ( ref $args{objects} eq 'ARRAY' ? @{$args{objects}} : $args{objects} ); + my $to = join '', (File::Spec->splitpath($objects[0]))[0,1]; + $to ||= File::Spec->curdir(); + + (my $file_base = $args{module_name}) =~ s/.*:://; + my $output = $args{lib_file} || + File::Spec->catfile($to, "$file_base.$cf->{dlext}"); + + # if running in perl source tree, look for libs there, not installed + my $lddlflags = $cf->{lddlflags}; + my $perl_src = $self->perl_src(); + $lddlflags =~ s{\Q$cf->{archlibexp}\E[\\/]CORE}{$perl_src/lib/CORE} if $perl_src; + + my %spec = ( + srcdir => $to, + builddir => $to, + startup => [ ], + objects => \@objects, + libs => [ ], + output => $output, + ld => $cf->{ld}, + libperl => $cf->{libperl}, + perllibs => [ $self->split_like_shell($cf->{perllibs}) ], + libpath => [ $self->split_like_shell($cf->{libpth}) ], + lddlflags => [ $self->split_like_shell($lddlflags) ], + other_ldflags => [ $self->split_like_shell($args{extra_linker_flags} || '') ], + use_scripts => 1, # XXX provide user option to change this??? + ); + + unless ( $spec{basename} ) { + ($spec{basename} = $args{module_name}) =~ s/.*:://; + } + + $spec{srcdir} = File::Spec->canonpath( $spec{srcdir} ); + $spec{builddir} = File::Spec->canonpath( $spec{builddir} ); + + $spec{output} ||= File::Spec->catfile( $spec{builddir}, + $spec{basename} . '.'.$cf->{dlext} ); + $spec{manifest} ||= $spec{output} . '.manifest'; + $spec{implib} ||= File::Spec->catfile( $spec{builddir}, + $spec{basename} . $cf->{lib_ext} ); + $spec{explib} ||= File::Spec->catfile( $spec{builddir}, + $spec{basename} . '.exp' ); + if ($cf->{cc} eq 'cl') { + $spec{dbg_file} ||= File::Spec->catfile( $spec{builddir}, + $spec{basename} . '.pdb' ); + } + elsif ($cf->{cc} eq 'bcc32') { + $spec{dbg_file} ||= File::Spec->catfile( $spec{builddir}, + $spec{basename} . '.tds' ); + } + $spec{def_file} ||= File::Spec->catfile( $spec{srcdir} , + $spec{basename} . '.def' ); + $spec{base_file} ||= File::Spec->catfile( $spec{srcdir} , + $spec{basename} . '.base' ); + + $self->add_to_cleanup( + grep defined, + @{[ @spec{qw(manifest implib explib dbg_file def_file base_file map_file)} ]} + ); + + foreach my $opt ( qw(output manifest implib explib dbg_file def_file map_file base_file) ) { + $self->normalize_filespecs( \$spec{$opt} ); + } + + foreach my $opt ( qw(libpath startup objects) ) { + $self->normalize_filespecs( $spec{$opt} ); + } + + (my $def_base = $spec{def_file}) =~ tr/'"//d; + $def_base =~ s/\.def$//; + $self->prelink( %args, + dl_name => $args{module_name}, + dl_file => $def_base, + dl_base => $spec{basename} ); + + my @cmds = $self->format_linker_cmd(%spec); + while ( my $cmd = shift @cmds ) { + $self->do_system( @$cmd ); + } + + $spec{output} =~ tr/'"//d; + return wantarray + ? grep defined, @spec{qw[output manifest implib explib dbg_file def_file map_file base_file]} + : $spec{output}; +} + +# canonize & quote paths +sub normalize_filespecs { + my ($self, @specs) = @_; + foreach my $spec ( grep defined, @specs ) { + if ( ref $spec eq 'ARRAY') { + $self->normalize_filespecs( map {\$_} grep defined, @$spec ) + } elsif ( ref $spec eq 'SCALAR' ) { + $$spec =~ tr/"//d if $$spec; + next unless $$spec; + $$spec = '"' . File::Spec->canonpath($$spec) . '"'; + } elsif ( ref $spec eq '' ) { + $spec = '"' . File::Spec->canonpath($spec) . '"'; + } else { + die "Don't know how to normalize " . (ref $spec || $spec) . "\n"; + } + } +} + +# directory of perl's include files +sub perl_inc { + my $self = shift; + + my $perl_src = $self->perl_src(); + + if ($perl_src) { + File::Spec->catdir($perl_src, "lib", "CORE"); + } else { + File::Spec->catdir($self->{config}{archlibexp},"CORE"); + } +} + +1; + +__END__ + +package ExtUtils::CBuilder::Platform::VMS; + +use warnings; +use strict; +use ExtUtils::CBuilder::Base; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Base); + +use File::Spec::Functions qw(catfile catdir); +use Config; + +# We do prelink, but don't want the parent to redo it. + +sub need_prelink { 0 } + +sub arg_defines { + my ($self, %args) = @_; + + s/"/""/g foreach values %args; + + my @config_defines; + + # VMS can only have one define qualifier; add the one from config, if any. + if ($self->{config}{ccflags} =~ s{/ def[^=]+ =+ \(? ([^\/\)]*) } {}ix) { + push @config_defines, $1; + } + + return '' unless keys(%args) || @config_defines; + + return ('/define=(' + . join(',', + @config_defines, + map "\"$_" . ( length($args{$_}) ? "=$args{$_}" : '') . "\"", + sort keys %args) + . ')'); +} + +sub arg_include_dirs { + my ($self, @dirs) = @_; + + # VMS can only have one include list, add the one from config. + if ($self->{config}{ccflags} =~ s{/inc[^=]+(?:=)+(?:\()?([^\/\)]*)} {}i) { + unshift @dirs, $1; + } + return unless @dirs; + + return ('/include=(' . join(',', @dirs) . ')'); +} + +# We override the compile method because we consume the includes and defines +# parts of ccflags in the process of compiling but don't save those parts +# anywhere, so $self->{config}{ccflags} needs to be reset for each compile +# operation. + +sub compile { + my ($self, %args) = @_; + + $self->{config}{ccflags} = $Config{ccflags}; + $self->{config}{ccflags} = $ENV{CFLAGS} if defined $ENV{CFLAGS}; + + return $self->SUPER::compile(%args); +} + +sub _do_link { + my ($self, $type, %args) = @_; + + my $objects = delete $args{objects}; + $objects = [$objects] unless ref $objects; + + if ($args{lddl}) { + + # prelink will call Mksymlists, which creates the extension-specific + # linker options file and populates it with the boot symbol. + + my @temp_files = $self->prelink(%args, dl_name => $args{module_name}); + + # We now add the rest of what we need to the linker options file. We + # should replicate the functionality of C, + # but there is as yet no infrastructure for handling object libraries, + # so for now we depend on object files being listed individually on the + # command line, which should work for simple cases. We do bring in our + # own version of C so that any additional + # libraries (including PERLSHR) can be added to the options file. + + my @optlibs = $self->_liblist_ext( $args{'libs'} ); + + my $optfile = 'sys$disk:[]' . $temp_files[0]; + open my $opt_fh, '>>', $optfile + or die "_do_link: Unable to open $optfile: $!"; + for my $lib (@optlibs) {print $opt_fh "$lib\n" if length $lib } + close $opt_fh; + + $objects->[-1] .= ','; + push @$objects, $optfile . '/OPTIONS,'; + + # This one not needed for DEC C, but leave for completeness. + push @$objects, $self->perl_inc() . 'perlshr_attr.opt/OPTIONS'; + } + + return $self->SUPER::_do_link($type, %args, objects => $objects); +} + +sub arg_nolink { return; } + +sub arg_object_file { + my ($self, $file) = @_; + return "/obj=$file"; +} + +sub arg_exec_file { + my ($self, $file) = @_; + return ("/exe=$file"); +} + +sub arg_share_object_file { + my ($self, $file) = @_; + return ("$self->{config}{lddlflags}=$file"); +} + +# The following is reproduced almost verbatim from ExtUtils::Liblist::Kid::_vms_ext. +# We can't just call that because it's tied up with the MakeMaker object hierarchy. + +sub _liblist_ext { + my($self, $potential_libs,$verbose,$give_libs) = @_; + $verbose ||= 0; + + my(@crtls,$crtlstr); + @crtls = ( ($self->{'config'}{'ldflags'} =~ m-/Debug-i ? $self->{'config'}{'dbgprefix'} : '') + . 'PerlShr/Share' ); + push(@crtls, grep { not /\(/ } split /\s+/, $self->{'config'}{'perllibs'}); + push(@crtls, grep { not /\(/ } split /\s+/, $self->{'config'}{'libc'}); + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and + # a library spec could be resolved via a logical name, we go to some trouble + # to ensure that the copy in the local tree is used, rather than one to + # which a system-wide logical may point. + if ($self->perl_src) { + my($lib,$locspec,$type); + foreach $lib (@crtls) { + if (($locspec,$type) = $lib =~ m{^([\w\$-]+)(/\w+)?} and $locspec =~ /perl/i) { + if (lc $type eq '/share') { $locspec .= $self->{'config'}{'exe_ext'}; } + elsif (lc $type eq '/library') { $locspec .= $self->{'config'}{'lib_ext'}; } + else { $locspec .= $self->{'config'}{'obj_ext'}; } + $locspec = catfile($self->perl_src, $locspec); + $lib = "$locspec$type" if -e $locspec; + } + } + } + $crtlstr = @crtls ? join(' ',@crtls) : ''; + + unless ($potential_libs) { + warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose; + return ('', '', $crtlstr, '', ($give_libs ? [] : ())); + } + + my(@dirs,@libs,$dir,$lib,%found,@fndlibs,$ldlib); + my $cwd = cwd(); + my($so,$lib_ext,$obj_ext) = @{$self->{'config'}}{'so','lib_ext','obj_ext'}; + # List of common Unix library names and their VMS equivalents + # (VMS equivalent of '' indicates that the library is automatically + # searched by the linker, and should be skipped here.) + my(@flibs, %libs_seen); + my %libmap = ( 'm' => '', 'f77' => '', 'F77' => '', 'V77' => '', 'c' => '', + 'malloc' => '', 'crypt' => '', 'resolv' => '', 'c_s' => '', + 'socket' => '', 'X11' => 'DECW$XLIBSHR', + 'Xt' => 'DECW$XTSHR', 'Xm' => 'DECW$XMLIBSHR', + 'Xmu' => 'DECW$XMULIBSHR'); + + warn "Potential libraries are '$potential_libs'\n" if $verbose; + + # First, sort out directories and library names in the input + foreach $lib (split ' ',$potential_libs) { + push(@dirs,$1), next if $lib =~ /^-L(.*)/; + push(@dirs,$lib), next if $lib =~ /[:>\]]$/; + push(@dirs,$lib), next if -d $lib; + push(@libs,$1), next if $lib =~ /^-l(.*)/; + push(@libs,$lib); + } + push(@dirs,split(' ',$self->{'config'}{'libpth'})); + + # Now make sure we've got VMS-syntax absolute directory specs + # (We don't, however, check whether someone's hidden a relative + # path in a logical name.) + foreach $dir (@dirs) { + unless (-d $dir) { + warn "Skipping nonexistent Directory $dir\n" if $verbose > 1; + $dir = ''; + next; + } + warn "Resolving directory $dir\n" if $verbose; + if (!File::Spec->file_name_is_absolute($dir)) { + $dir = catdir($cwd,$dir); + } + } + @dirs = grep { length($_) } @dirs; + unshift(@dirs,''); # Check each $lib without additions first + + LIB: foreach $lib (@libs) { + if (exists $libmap{$lib}) { + next unless length $libmap{$lib}; + $lib = $libmap{$lib}; + } + + my(@variants,$variant,$cand); + my($ctype) = ''; + + # If we don't have a file type, consider it a possibly abbreviated name and + # check for common variants. We try these first to grab libraries before + # a like-named executable image (e.g. -lperl resolves to perlshr.exe + # before perl.exe). + if ($lib !~ /\.[^:>\]]*$/) { + push(@variants,"${lib}shr","${lib}rtl","${lib}lib"); + push(@variants,"lib$lib") if $lib !~ /[:>\]]/; + } + push(@variants,$lib); + warn "Looking for $lib\n" if $verbose; + foreach $variant (@variants) { + my($fullname, $name); + + foreach $dir (@dirs) { + my($type); + + $name = "$dir$variant"; + warn "\tChecking $name\n" if $verbose > 2; + $fullname = VMS::Filespec::rmsexpand($name); + if (defined $fullname and -f $fullname) { + # It's got its own suffix, so we'll have to figure out the type + if ($fullname =~ /(?:$so|exe)$/i) { $type = 'SHR'; } + elsif ($fullname =~ /(?:$lib_ext|olb)$/i) { $type = 'OLB'; } + elsif ($fullname =~ /(?:$obj_ext|obj)$/i) { + warn "Note (probably harmless): " + ."Plain object file $fullname found in library list\n"; + $type = 'OBJ'; + } + else { + warn "Note (probably harmless): " + ."Unknown library type for $fullname; assuming shared\n"; + $type = 'SHR'; + } + } + elsif (-f ($fullname = VMS::Filespec::rmsexpand($name,$so)) or + -f ($fullname = VMS::Filespec::rmsexpand($name,'.exe'))) { + $type = 'SHR'; + $name = $fullname unless $fullname =~ /exe;?\d*$/i; + } + elsif (not length($ctype) and # If we've got a lib already, + # don't bother + ( -f ($fullname = VMS::Filespec::rmsexpand($name,$lib_ext)) or + -f ($fullname = VMS::Filespec::rmsexpand($name,'.olb')))) { + $type = 'OLB'; + $name = $fullname unless $fullname =~ /olb;?\d*$/i; + } + elsif (not length($ctype) and # If we've got a lib already, + # don't bother + ( -f ($fullname = VMS::Filespec::rmsexpand($name,$obj_ext)) or + -f ($fullname = VMS::Filespec::rmsexpand($name,'.obj')))) { + warn "Note (probably harmless): " + ."Plain object file $fullname found in library list\n"; + $type = 'OBJ'; + $name = $fullname unless $fullname =~ /obj;?\d*$/i; + } + if (defined $type) { + $ctype = $type; $cand = $name; + last if $ctype eq 'SHR'; + } + } + if ($ctype) { + push @{$found{$ctype}}, $cand; + warn "\tFound as $cand (really $fullname), type $ctype\n" + if $verbose > 1; + push @flibs, $name unless $libs_seen{$fullname}++; + next LIB; + } + } + warn "Note (probably harmless): " + ."No library found for $lib\n"; + } + + push @fndlibs, @{$found{OBJ}} if exists $found{OBJ}; + push @fndlibs, map { "$_/Library" } @{$found{OLB}} if exists $found{OLB}; + push @fndlibs, map { "$_/Share" } @{$found{SHR}} if exists $found{SHR}; + $lib = join(' ',@fndlibs); + + $ldlib = $crtlstr ? "$lib $crtlstr" : $lib; + warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose; + wantarray ? ($lib, '', $ldlib, '', ($give_libs ? \@flibs : ())) : $lib; +} + +1; +package ExtUtils::CBuilder::Platform::os2; + +use warnings; +use strict; +use ExtUtils::CBuilder::Platform::Unix; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Platform::Unix); + +sub need_prelink { 1 } + +sub prelink { + # Generate import libraries (XXXX currently near .DEF; should be near DLL!) + my $self = shift; + my %args = @_; + + my @res = $self->SUPER::prelink(%args); + die "Unexpected number of DEF files" unless @res == 1; + die "Can't find DEF file in the output" + unless $res[0] =~ m,^(.*)\.def$,si; + my $libname = "$1$self->{config}{lib_ext}"; # Put .LIB file near .DEF file + $self->do_system('emximp', '-o', $libname, $res[0]) or die "emxexp: res=$?"; + return (@res, $libname); +} + +sub _do_link { + my $self = shift; + my ($how, %args) = @_; + if ($how eq 'lib_file' + and (defined $args{module_name} and length $args{module_name})) { + + # Now know the basename, find directory parts via lib_file, or objects + my $objs = ( (ref $args{objects}) ? $args{objects} : [$args{objects}] ); + my $near_obj = $self->lib_file(@$objs); + my $exp_dir = ($near_obj =~ m,(.*)[/\\],s ? "$1/" : '' ); + + $args{dl_file} = $1 if $near_obj =~ m,(.*)\.,s; # put ExportList near OBJ + + # XXX _do_link does not have place to put libraries? + push @$objs, $self->perl_inc() . "/libperl$self->{config}{lib_ext}"; + $args{objects} = $objs; + } + # Some 'env' do exec(), thus return too early when run from ksh; + # To avoid 'env', remove (useless) shrpenv + local $self->{config}{shrpenv} = ''; + return $self->SUPER::_do_link($how, %args); +} + +sub extra_link_args_after_prelink { + # Add .DEF file to the link line + my ($self, %args) = @_; + + my @DEF = grep /\.def$/i, @{$args{prelink_res}}; + die "More than one .def files created by 'prelink' stage" if @DEF > 1; + # XXXX No "$how" argument here, so how to test for dynamic link? + die "No .def file created by 'prelink' stage" + unless @DEF or not @{$args{prelink_res}}; + + my @after_libs = ($OS2::is_aout ? () + : $self->perl_inc() . "/libperl_override$self->{config}{lib_ext}"); + # , "-L", "-lperl" + (@after_libs, @DEF); +} + +sub link_executable { + # ldflags is not expecting .exe extension given on command line; remove -Zexe + my $self = shift; + local $self->{config}{ldflags} = $self->{config}{ldflags}; + $self->{config}{ldflags} =~ s/(?SUPER::link_executable(@_); +} + + +1; +package ExtUtils::CBuilder::Platform::dec_osf; + +use warnings; +use strict; +use ExtUtils::CBuilder::Platform::Unix; +use File::Spec; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Platform::Unix); + +sub link_executable { + my $self = shift; + # $Config{ld} is 'ld' but that won't work: use the cc instead. + local $self->{config}{ld} = $self->{config}{cc}; + return $self->SUPER::link_executable(@_); +} + +1; +package ExtUtils::CBuilder::Platform::darwin; + +use warnings; +use strict; +use ExtUtils::CBuilder::Platform::Unix; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Platform::Unix); + +sub compile { + my $self = shift; + my $cf = $self->{config}; + + # -flat_namespace isn't a compile flag, it's a linker flag. But + # it's mistakenly in Config.pm as both. Make the correction here. + local $cf->{ccflags} = $cf->{ccflags}; + $cf->{ccflags} =~ s/-flat_namespace//; + $self->SUPER::compile(@_); +} + + +1; +package ExtUtils::CBuilder::Platform::cygwin; + +use warnings; +use strict; +use File::Spec; +use ExtUtils::CBuilder::Platform::Unix; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Platform::Unix); + +# TODO: If a specific exe_file name is requested, if the exe created +# doesn't have that name, we might want to rename it. Apparently asking +# for an exe of "foo" might result in "foo.exe". Alternatively, we should +# make sure the return value is correctly "foo.exe". +# C.f http://rt.cpan.org/Public/Bug/Display.html?id=41003 +sub link_executable { + my $self = shift; + return $self->SUPER::link_executable(@_); +} + +sub link { + my ($self, %args) = @_; + + my $lib = $self->{config}{useshrplib} ? 'libperl.dll.a' : 'libperl.a'; + $args{extra_linker_flags} = [ + File::Spec->catfile($self->perl_inc(), $lib), + $self->split_like_shell($args{extra_linker_flags}) + ]; + + return $self->SUPER::link(%args); +} + +1; +package ExtUtils::CBuilder::Platform::android; + +use warnings; +use strict; +use File::Spec; +use ExtUtils::CBuilder::Platform::Unix; +use Config; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Platform::Unix); + +# The Android linker will not recognize symbols from +# libperl unless the module explicitly depends on it. +sub link { + my ($self, %args) = @_; + + if ($self->{config}{useshrplib} eq 'true') { + $args{extra_linker_flags} = [ + $self->split_like_shell($args{extra_linker_flags}), + '-L' . $self->perl_inc(), + '-lperl', + $self->split_like_shell($Config{perllibs}), + ]; + } + + # Several modules on CPAN rather rightfully expect being + # able to pass $so_file to DynaLoader::dl_load_file and + # have it Just Work. However, $so_file will more likely + # than not be a relative path, and unless the module + # author subclasses MakeMaker/Module::Build to modify + # LD_LIBRARY_PATH, which would be insane, Android's linker + # won't find the .so + # So we make this all work by returning an absolute path. + my($so_file, @so_tmps) = $self->SUPER::link(%args); + $so_file = File::Spec->rel2abs($so_file); + return wantarray ? ($so_file, @so_tmps) : $so_file; +} + +1; +package ExtUtils::CBuilder::Platform::aix; + +use warnings; +use strict; +use ExtUtils::CBuilder::Platform::Unix; +use File::Spec; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Platform::Unix); + +sub need_prelink { 1 } + +sub link { + my ($self, %args) = @_; + my $cf = $self->{config}; + + (my $baseext = $args{module_name}) =~ s/.*:://; + my $perl_inc = $self->perl_inc(); + + # Massage some very naughty bits in %Config + local $cf->{lddlflags} = $cf->{lddlflags}; + for ($cf->{lddlflags}) { + s/\Q$(BASEEXT)\E/$baseext/; + s/\Q$(PERL_INC)\E/$perl_inc/; + } + + return $self->SUPER::link(%args); +} + + +1; +package ExtUtils::CBuilder::Platform::Unix; + +use warnings; +use strict; +use ExtUtils::CBuilder::Base; + +our $VERSION = '0.280230'; # VERSION +our @ISA = qw(ExtUtils::CBuilder::Base); + +sub link_executable { + my $self = shift; + + # On some platforms (which ones??) $Config{cc} seems to be a better + # bet for linking executables than $Config{ld}. Cygwin is a notable + # exception. + local $self->{config}{ld} = + $self->{config}{cc} . " " . $self->{config}{ldflags}; + return $self->SUPER::link_executable(@_); +} + +sub link { + my $self = shift; + my $cf = $self->{config}; + + # Some platforms (notably Mac OS X 10.3, but some others too) expect + # the syntax "FOO=BAR /bin/command arg arg" to work in %Config + # (notably $Config{ld}). It usually works in system(SCALAR), but we + # use system(LIST). We fix it up here with 'env'. + + local $cf->{ld} = $cf->{ld}; + if (ref $cf->{ld}) { + unshift @{$cf->{ld}}, 'env' if $cf->{ld}[0] =~ /^\s*\w+=/; + } else { + $cf->{ld} =~ s/^(\s*\w+=)/env $1/; + } + + return $self->SUPER::link(@_); +} + +1; +package ExtUtils::CBuilder::Platform::Windows::MSVC; + +our $VERSION = '0.280230'; # VERSION + +use warnings; +use strict; + +sub arg_exec_file { + my ($self, $file) = @_; + return "/OUT:$file"; +} + +sub format_compiler_cmd { + my ($self, %spec) = @_; + + foreach my $path ( @{ $spec{includes} || [] }, + @{ $spec{perlinc} || [] } ) { + $path = '-I' . $path; + } + + %spec = $self->write_compiler_script(%spec) + if $spec{use_scripts}; + + return [ grep {defined && length} ( + $spec{cc},'-nologo','-c', + @{$spec{includes}} , + @{$spec{cflags}} , + @{$spec{optimize}} , + @{$spec{defines}} , + @{$spec{perlinc}} , + "-Fo$spec{output}" , + $spec{source} , + ) ]; +} + +sub write_compiler_script { + my ($self, %spec) = @_; + + my $script = File::Spec->catfile( $spec{srcdir}, + $spec{basename} . '.ccs' ); + + $self->add_to_cleanup($script); + print "Generating script '$script'\n" if !$self->{quiet}; + + my $SCRIPT = IO::File->new( ">$script" ) + or die( "Could not create script '$script': $!" ); + + print $SCRIPT join( "\n", + map { ref $_ ? @{$_} : $_ } + grep defined, + delete( + @spec{ qw(includes cflags optimize defines perlinc) } ) + ); + + push @{$spec{includes}}, '@"' . $script . '"'; + + return %spec; +} + +sub format_linker_cmd { + my ($self, %spec) = @_; + my $cf = $self->{config}; + + foreach my $path ( @{$spec{libpath}} ) { + $path = "-libpath:$path"; + } + + my $output = $spec{output}; + my $manifest = $spec{manifest}; + + $spec{def_file} &&= '-def:' . $spec{def_file}; + $spec{output} &&= '-out:' . $spec{output}; + $spec{manifest} &&= '-manifest ' . $spec{manifest}; + $spec{implib} &&= '-implib:' . $spec{implib}; + $spec{map_file} &&= '-map:' . $spec{map_file}; + + %spec = $self->write_linker_script(%spec) + if $spec{use_scripts}; + + my @cmds; # Stores the series of commands needed to build the module. + + push @cmds, [ grep {defined && length} ( + $spec{ld} , + @{$spec{lddlflags}} , + @{$spec{libpath}} , + @{$spec{other_ldflags}} , + @{$spec{startup}} , + @{$spec{objects}} , + $spec{map_file} , + $spec{libperl} , + @{$spec{perllibs}} , + $spec{def_file} , + $spec{implib} , + $spec{output} , + ) ]; + + # Embed the manifest file if it exists + push @cmds, [ + 'if', 'exist', $manifest, 'mt', '-nologo', $spec{manifest}, '-outputresource:' . "$output;2" + ]; + + return @cmds; +} + +sub write_linker_script { + my ($self, %spec) = @_; + + my $script = File::Spec->catfile( $spec{srcdir}, + $spec{basename} . '.lds' ); + + $self->add_to_cleanup($script); + + print "Generating script '$script'\n" if !$self->{quiet}; + + my $SCRIPT = IO::File->new( ">$script" ) + or die( "Could not create script '$script': $!" ); + + print $SCRIPT join( "\n", + map { ref $_ ? @{$_} : $_ } + grep defined, + delete( + @spec{ qw(lddlflags libpath other_ldflags + startup objects libperl perllibs + def_file implib map_file) } ) + ); + + push @{$spec{lddlflags}}, '@"' . $script . '"'; + + return %spec; +} + +1; + + +package ExtUtils::CBuilder::Platform::Windows::BCC; + +our $VERSION = '0.280230'; # VERSION + +use strict; +use warnings; + +sub format_compiler_cmd { + my ($self, %spec) = @_; + + foreach my $path ( @{ $spec{includes} || [] }, + @{ $spec{perlinc} || [] } ) { + $path = '-I' . $path; + } + + %spec = $self->write_compiler_script(%spec) + if $spec{use_scripts}; + + return [ grep {defined && length} ( + $spec{cc}, '-c' , + @{$spec{includes}} , + @{$spec{cflags}} , + @{$spec{optimize}} , + @{$spec{defines}} , + @{$spec{perlinc}} , + "-o$spec{output}" , + $spec{source} , + ) ]; +} + +sub write_compiler_script { + my ($self, %spec) = @_; + + my $script = File::Spec->catfile( $spec{srcdir}, + $spec{basename} . '.ccs' ); + + $self->add_to_cleanup($script); + + print "Generating script '$script'\n" if !$self->{quiet}; + + my $SCRIPT = IO::File->new( ">$script" ) + or die( "Could not create script '$script': $!" ); + + # XXX Borland "response files" seem to be unable to accept macro + # definitions containing quoted strings. Escaping strings with + # backslash doesn't work, and any level of quotes are stripped. The + # result is a floating point number in the source file where a + # string is expected. So we leave the macros on the command line. + print $SCRIPT join( "\n", + map { ref $_ ? @{$_} : $_ } + grep defined, + delete( + @spec{ qw(includes cflags optimize perlinc) } ) + ); + + push @{$spec{includes}}, '@"' . $script . '"'; + + return %spec; +} + +sub format_linker_cmd { + my ($self, %spec) = @_; + + foreach my $path ( @{$spec{libpath}} ) { + $path = "-L$path"; + } + + push( @{$spec{startup}}, 'c0d32.obj' ) + unless ( $spec{startup} && @{$spec{startup}} ); + + %spec = $self->write_linker_script(%spec) + if $spec{use_scripts}; + + return [ grep {defined && length} ( + $spec{ld} , + @{$spec{lddlflags}} , + @{$spec{libpath}} , + @{$spec{other_ldflags}} , + @{$spec{startup}} , + @{$spec{objects}} , ',', + $spec{output} , ',', + $spec{map_file} , ',', + $spec{libperl} , + @{$spec{perllibs}} , ',', + $spec{def_file} + ) ]; +} + +sub write_linker_script { + my ($self, %spec) = @_; + + # To work around Borlands "unique" commandline syntax, + # two scripts are used: + + my $ld_script = File::Spec->catfile( $spec{srcdir}, + $spec{basename} . '.lds' ); + my $ld_libs = File::Spec->catfile( $spec{srcdir}, + $spec{basename} . '.lbs' ); + + $self->add_to_cleanup($ld_script, $ld_libs); + + print "Generating scripts '$ld_script' and '$ld_libs'.\n" if !$self->{quiet}; + + # Script 1: contains options & names of object files. + my $LD_SCRIPT = IO::File->new( ">$ld_script" ) + or die( "Could not create linker script '$ld_script': $!" ); + + print $LD_SCRIPT join( " +\n", + map { @{$_} } + grep defined, + delete( + @spec{ qw(lddlflags libpath other_ldflags startup objects) } ) + ); + + # Script 2: contains name of libs to link against. + my $LD_LIBS = IO::File->new( ">$ld_libs" ) + or die( "Could not create linker script '$ld_libs': $!" ); + + print $LD_LIBS join( " +\n", + (delete $spec{libperl} || ''), + @{delete $spec{perllibs} || []}, + ); + + push @{$spec{lddlflags}}, '@"' . $ld_script . '"'; + push @{$spec{perllibs}}, '@"' . $ld_libs . '"'; + + return %spec; +} + +1; + + +package ExtUtils::CBuilder::Platform::Windows::GCC; + +our $VERSION = '0.280230'; # VERSION + +use warnings; +use strict; + +sub format_compiler_cmd { + my ($self, %spec) = @_; + + foreach my $path ( @{ $spec{includes} || [] }, + @{ $spec{perlinc} || [] } ) { + $path = '-I' . $path; + } + + # split off any -arguments included in cc + my @cc = split / (?=-)/, $spec{cc}; + + return [ grep {defined && length} ( + @cc, '-c' , + @{$spec{includes}} , + @{$spec{cflags}} , + @{$spec{optimize}} , + @{$spec{defines}} , + @{$spec{perlinc}} , + '-o', $spec{output} , + $spec{source} , + ) ]; +} + +sub format_linker_cmd { + my ($self, %spec) = @_; + my $cf = $self->{config}; + + # The Config.pm variable 'libperl' is hardcoded to the full name + # of the perl import library (i.e. 'libperl56.a'). GCC will not + # find it unless the 'lib' prefix & the extension are stripped. + $spec{libperl} =~ s/^(?:lib)?([^.]+).*$/-l$1/; + + unshift( @{$spec{other_ldflags}}, '-nostartfiles' ) + if ( $spec{startup} && @{$spec{startup}} ); + + # From ExtUtils::MM_Win32: + # + ## one thing for GCC/Mingw32: + ## we try to overcome non-relocateable-DLL problems by generating + ## a (hopefully unique) image-base from the dll's name + ## -- BKS, 10-19-1999 + File::Basename::basename( $spec{output} ) =~ /(....)(.{0,4})/; + $spec{image_base} = sprintf( "0x%x0000", unpack('n', $1 ^ $2) ); + + %spec = $self->write_linker_script(%spec) + if $spec{use_scripts}; + + foreach my $path ( @{$spec{libpath}} ) { + $path = "-L$path"; + } + + my @cmds; # Stores the series of commands needed to build the module. + + my $DLLTOOL = $cf->{dlltool} || 'dlltool'; + + push @cmds, [ + $DLLTOOL, '--def' , $spec{def_file}, + '--output-exp' , $spec{explib} + ]; + + # split off any -arguments included in ld + my @ld = split / (?=-)/, $spec{ld}; + + push @cmds, [ grep {defined && length} ( + @ld , + '-o', $spec{output} , + "-Wl,--base-file,$spec{base_file}" , + "-Wl,--image-base,$spec{image_base}" , + @{$spec{lddlflags}} , + @{$spec{libpath}} , + @{$spec{startup}} , + @{$spec{objects}} , + @{$spec{other_ldflags}} , + $spec{libperl} , + @{$spec{perllibs}} , + $spec{explib} , + $spec{map_file} ? ('-Map', $spec{map_file}) : '' + ) ]; + + push @cmds, [ + $DLLTOOL, '--def' , $spec{def_file}, + '--output-exp' , $spec{explib}, + '--base-file' , $spec{base_file} + ]; + + push @cmds, [ grep {defined && length} ( + @ld , + '-o', $spec{output} , + "-Wl,--image-base,$spec{image_base}" , + @{$spec{lddlflags}} , + @{$spec{libpath}} , + @{$spec{startup}} , + @{$spec{objects}} , + @{$spec{other_ldflags}} , + $spec{libperl} , + @{$spec{perllibs}} , + $spec{explib} , + $spec{map_file} ? ('-Map', $spec{map_file}) : '' + ) ]; + + return @cmds; +} + +sub write_linker_script { + my ($self, %spec) = @_; + + my $script = File::Spec->catfile( $spec{srcdir}, + $spec{basename} . '.lds' ); + + $self->add_to_cleanup($script); + + print "Generating script '$script'\n" if !$self->{quiet}; + + my $SCRIPT = IO::File->new( ">$script" ) + or die( "Could not create script '$script': $!" ); + + print $SCRIPT ( 'SEARCH_DIR(' . $_ . ")\n" ) + for @{delete $spec{libpath} || []}; + + # gcc takes only one startup file, so the first object in startup is + # specified as the startup file and any others are shifted into the + # beginning of the list of objects. + if ( $spec{startup} && @{$spec{startup}} ) { + print $SCRIPT 'STARTUP(' . shift( @{$spec{startup}} ) . ")\n"; + unshift @{$spec{objects}}, + @{delete $spec{startup} || []}; + } + + print $SCRIPT 'INPUT(' . join( ',', + @{delete $spec{objects} || []} + ) . ")\n"; + + print $SCRIPT 'INPUT(' . join( ' ', + (delete $spec{libperl} || ''), + @{delete $spec{perllibs} || []}, + ) . ")\n"; + + #it is important to keep the order 1.linker_script - 2.other_ldflags + unshift @{$spec{other_ldflags}}, '"' . $script . '"'; + + return %spec; +} + +1; + + +package ExtUtils::Command::MM; + +require 5.006; + +use strict; +use warnings; + +require Exporter; +our @ISA = qw(Exporter); + +our @EXPORT = qw(test_harness pod2man perllocal_install uninstall + warn_if_old_packlist test_s cp_nonempty); +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +my $Is_VMS = $^O eq 'VMS'; + +sub mtime { + no warnings 'redefine'; + local $@; + *mtime = (eval { require Time::HiRes } && defined &Time::HiRes::stat) + ? sub { (Time::HiRes::stat($_[0]))[9] } + : sub { ( stat($_[0]))[9] } + ; + goto &mtime; +} + + +sub test_harness { + require Test::Harness; + require File::Spec; + + $Test::Harness::verbose = shift; + + # Because Windows doesn't do this for us and listing all the *.t files + # out on the command line can blow over its exec limit. + require ExtUtils::Command; + my @argv = ExtUtils::Command::expand_wildcards(@ARGV); + + local @INC = @INC; + unshift @INC, map { File::Spec->rel2abs($_) } @_; + Test::Harness::runtests(sort { lc $a cmp lc $b } @argv); +} + + + + +sub pod2man { + local @ARGV = @_ ? @_ : @ARGV; + + { + local $@; + if( !eval { require Pod::Man } ) { + warn "Pod::Man is not available: $@". + "Man pages will not be generated during this install.\n"; + return 0; + } + } + require Getopt::Long; + + # We will cheat and just use Getopt::Long. We fool it by putting + # our arguments into @ARGV. Should be safe. + my %options = (); + Getopt::Long::config ('bundling_override'); + Getopt::Long::GetOptions (\%options, + 'section|s=s', 'release|r=s', 'center|c=s', + 'date|d=s', 'fixed=s', 'fixedbold=s', 'fixeditalic=s', + 'fixedbolditalic=s', 'official|o', 'quotes|q=s', 'lax|l', + 'name|n=s', 'perm_rw=i', 'utf8|u' + ); + delete $options{utf8} unless $Pod::Man::VERSION >= 2.17; + + # If there's no files, don't bother going further. + return 0 unless @ARGV; + + # Official sets --center, but don't override things explicitly set. + if ($options{official} && !defined $options{center}) { + $options{center} = q[Perl Programmer's Reference Guide]; + } + + # This isn't a valid Pod::Man option and is only accepted for backwards + # compatibility. + delete $options{lax}; + my $count = scalar @ARGV / 2; + my $plural = $count == 1 ? 'document' : 'documents'; + print "Manifying $count pod $plural\n"; + + do {{ # so 'next' works + my ($pod, $man) = splice(@ARGV, 0, 2); + + next if ((-e $man) && + (mtime($man) > mtime($pod)) && + (mtime($man) > mtime("Makefile"))); + + my $parser = Pod::Man->new(%options); + $parser->parse_from_file($pod, $man) + or do { warn("Could not install $man\n"); next }; + + if (exists $options{perm_rw}) { + chmod(oct($options{perm_rw}), $man) + or do { warn("chmod $options{perm_rw} $man: $!\n"); next }; + } + }} while @ARGV; + + return 1; +} + + + +sub warn_if_old_packlist { + my $packlist = $ARGV[0]; + + return unless -f $packlist; + print <<"PACKLIST_WARNING"; +WARNING: I have found an old package in + $packlist. +Please make sure the two installations are not conflicting +PACKLIST_WARNING + +} + + + +sub perllocal_install { + my($type, $name) = splice(@ARGV, 0, 2); + + # VMS feeds args as a piped file on STDIN since it usually can't + # fit all the args on a single command line. + my @mod_info = $Is_VMS ? split /\|/, + : @ARGV; + + my $pod; + my $time = gmtime($ENV{SOURCE_DATE_EPOCH} || time); + $pod = sprintf <<'POD', scalar($time), $type, $name, $name; + =head2 %s: C<%s> L<%s|%s> + + =over 4 + +POD + + do { + my($key, $val) = splice(@mod_info, 0, 2); + + $pod .= < + +POD + + } while(@mod_info); + + $pod .= "=back\n\n"; + $pod =~ s/^ //mg; + print $pod; + + return 1; +} + + +sub uninstall { + my($packlist) = shift @ARGV; + + require ExtUtils::Install; + + print <<'WARNING'; + +Uninstall is unsafe and deprecated, the uninstallation was not performed. +We will show what would have been done. + +WARNING + + ExtUtils::Install::uninstall($packlist, 1, 1); + + print <<'WARNING'; + +Uninstall is unsafe and deprecated, the uninstallation was not performed. +Please check the list above carefully, there may be errors. +Remove the appropriate files manually. +Sorry for the inconvenience. + +WARNING + +} + + +sub test_s { + exit(-s $ARGV[0] ? 0 : 1); +} + + +sub cp_nonempty { + my @args = @ARGV; + return 0 unless -s $args[0]; + require ExtUtils::Command; + { + local @ARGV = @args[0,1]; + ExtUtils::Command::cp(@ARGV); + } + { + local @ARGV = @args[2,1]; + ExtUtils::Command::chmod(@ARGV); + } +} + + +1; +package ExtUtils::ParseXS::Constants; +use strict; +use warnings; +use Symbol; + +our $VERSION = '3.39'; + + +# FIXME: THESE ARE NOT CONSTANTS! +our @InitFileCode; + +# Note that to reduce maintenance, $PrototypeRegexp is used +# by ExtUtils::Typemaps, too! +our $PrototypeRegexp = "[" . quotemeta('\$%&*@;[]_') . "]"; +our @XSKeywords = qw( + REQUIRE BOOT CASE PREINIT INPUT INIT CODE PPCODE + OUTPUT CLEANUP ALIAS ATTRS PROTOTYPES PROTOTYPE + VERSIONCHECK INCLUDE INCLUDE_COMMAND SCOPE INTERFACE + INTERFACE_MACRO C_ARGS POSTCALL OVERLOAD FALLBACK + EXPORT_XSUB_SYMBOLS +); + +our $XSKeywordsAlternation = join('|', @XSKeywords); + +1; +package ExtUtils::ParseXS::Eval; +use strict; +use warnings; + +our $VERSION = '3.39'; + + +sub eval_output_typemap_code { + my ($_pxs, $_code, $_other) = @_; + + my ($Package, $ALIAS, $func_name, $Full_func_name, $pname) + = @{$_pxs}{qw(Package ALIAS func_name Full_func_name pname)}; + + my ($var, $type, $ntype, $subtype, $arg) + = @{$_other}{qw(var type ntype subtype arg)}; + + my $rv = eval $_code; + warn $@ if $@; + return $rv; +} + + +sub eval_input_typemap_code { + my ($_pxs, $_code, $_other) = @_; + + my ($Package, $ALIAS, $func_name, $Full_func_name, $pname) + = @{$_pxs}{qw(Package ALIAS func_name Full_func_name pname)}; + + my ($var, $type, $num, $init, $printed_name, $arg, $ntype, $argoff, $subtype) + = @{$_other}{qw(var type num init printed_name arg ntype argoff subtype)}; + + my $rv = eval $_code; + warn $@ if $@; + return $rv; +} + + +1; + +# vim: ts=2 sw=2 et: +package ExtUtils::ParseXS::CountLines; +use strict; + +our $VERSION = '3.39'; + +our $SECTION_END_MARKER; + +sub TIEHANDLE { + my ($class, $cfile, $fh) = @_; + $cfile =~ s/\\/\\\\/g; + $cfile =~ s/"/\\"/g; + $SECTION_END_MARKER = qq{#line --- "$cfile"}; + + return bless { + buffer => '', + fh => $fh, + line_no => 1, + }, $class; +} + +sub PRINT { + my $self = shift; + for (@_) { + $self->{buffer} .= $_; + while ($self->{buffer} =~ s/^([^\n]*\n)//) { + my $line = $1; + ++$self->{line_no}; + $line =~ s|^\#line\s+---(?=\s)|#line $self->{line_no}|; + print {$self->{fh}} $line; + } + } +} + +sub PRINTF { + my $self = shift; + my $fmt = shift; + $self->PRINT(sprintf($fmt, @_)); +} + +sub DESTROY { + # Not necessary if we're careful to end with a "\n" + my $self = shift; + print {$self->{fh}} $self->{buffer}; +} + +sub UNTIE { + # This sub does nothing, but is necessary for references to be released. +} + +sub end_marker { + return $SECTION_END_MARKER; +} + +1; +package ExtUtils::ParseXS::Utilities; +use strict; +use warnings; +use Exporter; +use File::Spec; +use ExtUtils::ParseXS::Constants (); + +our $VERSION = '3.39'; + +our (@ISA, @EXPORT_OK); +@ISA = qw(Exporter); +@EXPORT_OK = qw( + standard_typemap_locations + trim_whitespace + C_string + valid_proto_string + process_typemaps + map_type + standard_XS_defs + assign_func_args + analyze_preprocessor_statements + set_cond + Warn + current_line_number + blurt + death + check_conditional_preprocessor_statements + escape_file_for_line_directive + report_typemap_failure +); + + +SCOPE: { + my @tm_template; + + sub standard_typemap_locations { + my $include_ref = shift; + + if (not @tm_template) { + @tm_template = qw(typemap); + + my $updir = File::Spec->updir(); + foreach my $dir ( + File::Spec->catdir(($updir) x 1), + File::Spec->catdir(($updir) x 2), + File::Spec->catdir(($updir) x 3), + File::Spec->catdir(($updir) x 4), + ) { + unshift @tm_template, File::Spec->catfile($dir, 'typemap'); + unshift @tm_template, File::Spec->catfile($dir, lib => ExtUtils => 'typemap'); + } + } + + my @tm = @tm_template; + foreach my $dir (@{ $include_ref}) { + my $file = File::Spec->catfile($dir, ExtUtils => 'typemap'); + unshift @tm, $file if -e $file; + } + return @tm; + } +} # end SCOPE + + +sub trim_whitespace { + $_[0] =~ s/^\s+|\s+$//go; +} + + +sub C_string { + my($string) = @_; + + $string =~ s[\\][\\\\]g; + $string; +} + + +sub valid_proto_string { + my ($string) = @_; + + if ( $string =~ /^$ExtUtils::ParseXS::Constants::PrototypeRegexp+$/ ) { + return $string; + } + + return 0; +} + + +sub process_typemaps { + my ($tmap, $pwd) = @_; + + my @tm = ref $tmap ? @{$tmap} : ($tmap); + + foreach my $typemap (@tm) { + die "Can't find $typemap in $pwd\n" unless -r $typemap; + } + + push @tm, standard_typemap_locations( \@INC ); + + require ExtUtils::Typemaps; + my $typemap = ExtUtils::Typemaps->new; + foreach my $typemap_loc (@tm) { + next unless -f $typemap_loc; + # skip directories, binary files etc. + warn("Warning: ignoring non-text typemap file '$typemap_loc'\n"), next + unless -T $typemap_loc; + + $typemap->merge(file => $typemap_loc, replace => 1); + } + + return $typemap; +} + + +sub map_type { + my ($self, $type, $varname) = @_; + + # C++ has :: in types too so skip this + $type =~ tr/:/_/ unless $self->{RetainCplusplusHierarchicalTypes}; + $type =~ s/^array\(([^,]*),(.*)\).*/$1 */s; + if ($varname) { + if ($type =~ / \( \s* \* (?= \s* \) ) /xg) { + (substr $type, pos $type, 0) = " $varname "; + } + else { + $type .= "\t$varname"; + } + } + return $type; +} + + +sub standard_XS_defs { + print <<"EOF"; +#ifndef PERL_UNUSED_VAR +# define PERL_UNUSED_VAR(var) if (0) var = var +#endif + +#ifndef dVAR +# define dVAR dNOOP +#endif + + +/* This stuff is not part of the API! You have been warned. */ +#ifndef PERL_VERSION_DECIMAL +# define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s) +#endif +#ifndef PERL_DECIMAL_VERSION +# define PERL_DECIMAL_VERSION \\ + PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION) +#endif +#ifndef PERL_VERSION_GE +# define PERL_VERSION_GE(r,v,s) \\ + (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s)) +#endif +#ifndef PERL_VERSION_LE +# define PERL_VERSION_LE(r,v,s) \\ + (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s)) +#endif + +/* XS_INTERNAL is the explicit static-linkage variant of the default + * XS macro. + * + * XS_EXTERNAL is the same as XS_INTERNAL except it does not include + * "STATIC", ie. it exports XSUB symbols. You probably don't want that + * for anything but the BOOT XSUB. + * + * See XSUB.h in core! + */ + + +/* TODO: This might be compatible further back than 5.10.0. */ +#if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1) +# undef XS_EXTERNAL +# undef XS_INTERNAL +# if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING) +# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name) +# define XS_INTERNAL(name) STATIC XSPROTO(name) +# endif +# if defined(__SYMBIAN32__) +# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name) +# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name) +# endif +# ifndef XS_EXTERNAL +# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus) +# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__) +# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__) +# else +# ifdef __cplusplus +# define XS_EXTERNAL(name) extern "C" XSPROTO(name) +# define XS_INTERNAL(name) static XSPROTO(name) +# else +# define XS_EXTERNAL(name) XSPROTO(name) +# define XS_INTERNAL(name) STATIC XSPROTO(name) +# endif +# endif +# endif +#endif + +/* perl >= 5.10.0 && perl <= 5.15.1 */ + + +/* The XS_EXTERNAL macro is used for functions that must not be static + * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL + * macro defined, the best we can do is assume XS is the same. + * Dito for XS_INTERNAL. + */ +#ifndef XS_EXTERNAL +# define XS_EXTERNAL(name) XS(name) +#endif +#ifndef XS_INTERNAL +# define XS_INTERNAL(name) XS(name) +#endif + +/* Now, finally, after all this mess, we want an ExtUtils::ParseXS + * internal macro that we're free to redefine for varying linkage due + * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use + * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to! + */ + +#undef XS_EUPXS +#if defined(PERL_EUPXS_ALWAYS_EXPORT) +# define XS_EUPXS(name) XS_EXTERNAL(name) +#else + /* default to internal */ +# define XS_EUPXS(name) XS_INTERNAL(name) +#endif + +EOF + + print <<"EOF"; +#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE +#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) + +/* prototype to pass -Wmissing-prototypes */ +STATIC void +S_croak_xs_usage(const CV *const cv, const char *const params); + +STATIC void +S_croak_xs_usage(const CV *const cv, const char *const params) +{ + const GV *const gv = CvGV(cv); + + PERL_ARGS_ASSERT_CROAK_XS_USAGE; + + if (gv) { + const char *const gvname = GvNAME(gv); + const HV *const stash = GvSTASH(gv); + const char *const hvname = stash ? HvNAME(stash) : NULL; + + if (hvname) + Perl_croak_nocontext("Usage: %s::%s(%s)", hvname, gvname, params); + else + Perl_croak_nocontext("Usage: %s(%s)", gvname, params); + } else { + /* Pants. I don't think that it should be possible to get here. */ + Perl_croak_nocontext("Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params); + } +} +#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE + +#define croak_xs_usage S_croak_xs_usage + +#endif + +/* NOTE: the prototype of newXSproto() is different in versions of perls, + * so we define a portable version of newXSproto() + */ +#ifdef newXS_flags +#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0) +#else +#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv) +#endif /* !defined(newXS_flags) */ + +#if PERL_VERSION_LE(5, 21, 5) +# define newXS_deffile(a,b) Perl_newXS(aTHX_ a,b,file) +#else +# define newXS_deffile(a,b) Perl_newXS_deffile(aTHX_ a,b) +#endif + +EOF + return 1; +} + + +sub assign_func_args { + my ($self, $argsref, $class) = @_; + my @func_args = @{$argsref}; + shift @func_args if defined($class); + + for my $arg (@func_args) { + $arg =~ s/^/&/ if $self->{in_out}->{$arg}; + } + return join(", ", @func_args); +} + + +sub analyze_preprocessor_statements { + my ($self, $statement, $XSS_work_idx, $BootCode_ref) = @_; + + if ($statement eq 'if') { + $XSS_work_idx = @{ $self->{XSStack} }; + push(@{ $self->{XSStack} }, {type => 'if'}); + } + else { + $self->death("Error: '$statement' with no matching 'if'") + if $self->{XSStack}->[-1]{type} ne 'if'; + if ($self->{XSStack}->[-1]{varname}) { + push(@{ $self->{InitFileCode} }, "#endif\n"); + push(@{ $BootCode_ref }, "#endif"); + } + + my(@fns) = keys %{$self->{XSStack}->[-1]{functions}}; + if ($statement ne 'endif') { + # Hide the functions defined in other #if branches, and reset. + @{$self->{XSStack}->[-1]{other_functions}}{@fns} = (1) x @fns; + @{$self->{XSStack}->[-1]}{qw(varname functions)} = ('', {}); + } + else { + my($tmp) = pop(@{ $self->{XSStack} }); + 0 while (--$XSS_work_idx + && $self->{XSStack}->[$XSS_work_idx]{type} ne 'if'); + # Keep all new defined functions + push(@fns, keys %{$tmp->{other_functions}}); + @{$self->{XSStack}->[$XSS_work_idx]{functions}}{@fns} = (1) x @fns; + } + } + return ($self, $XSS_work_idx, $BootCode_ref); +} + + +sub set_cond { + my ($ellipsis, $min_args, $num_args) = @_; + my $cond; + if ($ellipsis) { + $cond = ($min_args ? qq(items < $min_args) : 0); + } + elsif ($min_args == $num_args) { + $cond = qq(items != $min_args); + } + else { + $cond = qq(items < $min_args || items > $num_args); + } + return $cond; +} + + +sub current_line_number { + my $self = shift; + my $line_number = $self->{line_no}->[@{ $self->{line_no} } - @{ $self->{line} } -1]; + return $line_number; +} + + +sub Warn { + my $self = shift; + my $warn_line_number = $self->current_line_number(); + print STDERR "@_ in $self->{filename}, line $warn_line_number\n"; +} + + +sub blurt { + my $self = shift; + $self->Warn(@_); + $self->{errors}++ +} + + +sub death { + my $self = shift; + $self->Warn(@_); + exit 1; +} + + +sub check_conditional_preprocessor_statements { + my ($self) = @_; + my @cpp = grep(/^\#\s*(?:if|e\w+)/, @{ $self->{line} }); + if (@cpp) { + my $cpplevel; + for my $cpp (@cpp) { + if ($cpp =~ /^\#\s*if/) { + $cpplevel++; + } + elsif (!$cpplevel) { + $self->Warn("Warning: #else/elif/endif without #if in this function"); + print STDERR " (precede it with a blank line if the matching #if is outside the function)\n" + if $self->{XSStack}->[-1]{type} eq 'if'; + return; + } + elsif ($cpp =~ /^\#\s*endif/) { + $cpplevel--; + } + } + $self->Warn("Warning: #if without #endif in this function") if $cpplevel; + } +} + + +sub escape_file_for_line_directive { + my $string = shift; + $string =~ s/\\/\\\\/g; + $string =~ s/"/\\"/g; + return $string; +} + + +sub report_typemap_failure { + my ($self, $tm, $ctype, $error_method) = @_; + $error_method ||= 'blurt'; + + my @avail_ctypes = $tm->list_mapped_ctypes; + + my $err = "Could not find a typemap for C type '$ctype'.\n" + . "The following C types are mapped by the current typemap:\n'" + . join("', '", @avail_ctypes) . "'\n"; + + $self->$error_method($err); + return(); +} + +1; + +# vim: ts=2 sw=2 et: +package ExtUtils::Typemaps::Type; +use 5.006001; +use strict; +use warnings; +require ExtUtils::Typemaps; + +our $VERSION = '3.38'; + + + +sub new { + my $prot = shift; + my $class = ref($prot)||$prot; + my %args = @_; + + if (!ref($prot)) { + if (not defined $args{xstype} or not defined $args{ctype}) { + die("Need xstype and ctype parameters"); + } + } + + my $self = bless( + (ref($prot) ? {%$prot} : {proto => ''}) + => $class + ); + + $self->{xstype} = $args{xstype} if defined $args{xstype}; + $self->{ctype} = $args{ctype} if defined $args{ctype}; + $self->{tidy_ctype} = ExtUtils::Typemaps::tidy_type($self->{ctype}); + $self->{proto} = $args{'prototype'} if defined $args{'prototype'}; + + return $self; +} + + +sub proto { + $_[0]->{proto} = $_[1] if @_ > 1; + return $_[0]->{proto}; +} + + +sub xstype { + return $_[0]->{xstype}; +} + + +sub ctype { + return defined($_[0]->{ctype}) ? $_[0]->{ctype} : $_[0]->{tidy_ctype}; +} + + +sub tidy_ctype { + return $_[0]->{tidy_ctype}; +} + + +1; + +package ExtUtils::Typemaps::OutputMap; +use 5.006001; +use strict; +use warnings; +our $VERSION = '3.38'; + + + +sub new { + my $prot = shift; + my $class = ref($prot)||$prot; + my %args = @_; + + if (!ref($prot)) { + if (not defined $args{xstype} or not defined $args{code}) { + die("Need xstype and code parameters"); + } + } + + my $self = bless( + (ref($prot) ? {%$prot} : {}) + => $class + ); + + $self->{xstype} = $args{xstype} if defined $args{xstype}; + $self->{code} = $args{code} if defined $args{code}; + $self->{code} =~ s/^(?=\S)/\t/mg; + + return $self; +} + + +sub code { + $_[0]->{code} = $_[1] if @_ > 1; + return $_[0]->{code}; +} + + +sub xstype { + return $_[0]->{xstype}; +} + + +sub cleaned_code { + my $self = shift; + my $code = $self->code; + + # Move C pre-processor instructions to column 1 to be strictly ANSI + # conformant. Some pre-processors are fussy about this. + $code =~ s/^\s+#/#/mg; + $code =~ s/\s*\z/\n/; + + return $code; +} + + +sub targetable { + my $self = shift; + return $self->{targetable} if exists $self->{targetable}; + + our $bal; # ()-balanced + $bal = qr[ + (?: + (?>[^()]+) + | + \( (??{ $bal }) \) + )* + ]x; + my $bal_no_comma = qr[ + (?: + (?>[^(),]+) + | + \( (??{ $bal }) \) + )+ + ]x; + + # matches variations on (SV*) + my $sv_cast = qr[ + (?: + \( \s* SV \s* \* \s* \) \s* + )? + ]x; + + my $size = qr[ # Third arg (to setpvn) + , \s* (??{ $bal }) + ]xo; + + my $code = $self->code; + + # We can still bootstrap compile 're', because in code re.pm is + # available to miniperl, and does not attempt to load the XS code. + use re 'eval'; + + my ($type, $with_size, $arg, $sarg) = + ($code =~ + m[^ + \s+ + sv_set([iunp])v(n)? # Type, is_setpvn + \s* + \( \s* + $sv_cast \$arg \s* , \s* + ( $bal_no_comma ) # Set from + ( $size )? # Possible sizeof set-from + \s* \) \s* ; \s* $ + ]xo + ); + + my $rv = undef; + if ($type) { + $rv = { + type => $type, + with_size => $with_size, + what => $arg, + what_size => $sarg, + }; + } + $self->{targetable} = $rv; + return $rv; +} + + +1; + +package ExtUtils::Typemaps::InputMap; +use 5.006001; +use strict; +use warnings; +our $VERSION = '3.38'; + + + +sub new { + my $prot = shift; + my $class = ref($prot)||$prot; + my %args = @_; + + if (!ref($prot)) { + if (not defined $args{xstype} or not defined $args{code}) { + die("Need xstype and code parameters"); + } + } + + my $self = bless( + (ref($prot) ? {%$prot} : {}) + => $class + ); + + $self->{xstype} = $args{xstype} if defined $args{xstype}; + $self->{code} = $args{code} if defined $args{code}; + $self->{code} =~ s/^(?=\S)/\t/mg; + + return $self; +} + + +sub code { + $_[0]->{code} = $_[1] if @_ > 1; + return $_[0]->{code}; +} + + +sub xstype { + return $_[0]->{xstype}; +} + + +sub cleaned_code { + my $self = shift; + my $code = $self->code; + + $code =~ s/(?:;+\s*|;*\s+)\z//s; + + # Move C pre-processor instructions to column 1 to be strictly ANSI + # conformant. Some pre-processors are fussy about this. + $code =~ s/^\s+#/#/mg; + $code =~ s/\s*\z/\n/; + + return $code; +} + + +1; + +package ExtUtils::Typemaps::Cmd; +use 5.006001; +use strict; +use warnings; +our $VERSION = '3.38'; + +use ExtUtils::Typemaps; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT = qw(embeddable_typemap); +our %EXPORT_TAGS = (all => \@EXPORT); + +sub embeddable_typemap { + my @tms = @_; + + # Get typemap objects + my @tm_objs = map [$_, _intuit_typemap_source($_)], @tms; + + # merge or short-circuit + my $final_tm; + if (@tm_objs == 1) { + # just one, merge would be pointless + $final_tm = shift(@tm_objs)->[1]; + } + else { + # multiple, need merge + $final_tm = ExtUtils::Typemaps->new; + foreach my $other_tm (@tm_objs) { + my ($tm_ident, $tm_obj) = @$other_tm; + eval { + $final_tm->merge(typemap => $tm_obj); + 1 + } or do { + my $err = $@ || 'Zombie error'; + die "Failed to merge typ"; + } + } + } + + # stringify for embedding + return $final_tm->as_embedded_typemap(); +} + +sub _load_module { + my $name = shift; + return eval "require $name; 1"; +} + +SCOPE: { + my %sources = ( + module => sub { + my $ident = shift; + my $tm; + if (/::/) { # looks like FQ module name, try that first + foreach my $module ($ident, "ExtUtils::Typemaps::$ident") { + if (_load_module($module)) { + eval { $tm = $module->new } + and return $tm; + } + } + } + else { + foreach my $module ("ExtUtils::Typemaps::$ident", "$ident") { + if (_load_module($module)) { + eval { $tm = $module->new } + and return $tm; + } + } + } + return(); + }, + file => sub { + my $ident = shift; + return unless -e $ident and -r _; + return ExtUtils::Typemaps->new(file => $ident); + }, + ); + # Try to find typemap either from module or file + sub _intuit_typemap_source { + my $identifier = shift; + + my @locate_attempts; + if ($identifier =~ /::/ || $identifier !~ /[^\w_]/) { + @locate_attempts = qw(module file); + } + else { + @locate_attempts = qw(file module); + } + + foreach my $source (@locate_attempts) { + my $tm = $sources{$source}->($identifier); + return $tm if defined $tm; + } + + die "Unable to find typemap for '$identifier': " + . "Tried to load both as file or module and failed.\n"; + } +} # end SCOPE + + +1; + +package ExtUtils::Liblist::Kid; + +# XXX Splitting this out into its own .pm is a temporary solution. + +# This kid package is to be used by MakeMaker. It will not work if +# $self is not a Makemaker. + +use 5.006; + +# Broken out of MakeMaker from version 4.11 + +use strict; +use warnings; +our $VERSION = '7.34'; +$VERSION = eval $VERSION; + +use ExtUtils::MakeMaker::Config; +use Cwd 'cwd'; +use File::Basename; +use File::Spec; + +sub ext { + if ( $^O eq 'VMS' ) { return &_vms_ext; } + elsif ( $^O eq 'MSWin32' ) { return &_win32_ext; } + else { return &_unix_os2_ext; } +} + +sub _unix_os2_ext { + my ( $self, $potential_libs, $verbose, $give_libs ) = @_; + $verbose ||= 0; + + if ( $^O =~ /os2|android/ and $Config{perllibs} ) { + + # Dynamic libraries are not transitive, so we may need including + # the libraries linked against perl.dll/libperl.so again. + + $potential_libs .= " " if $potential_libs; + $potential_libs .= $Config{perllibs}; + } + return ( "", "", "", "", ( $give_libs ? [] : () ) ) unless $potential_libs; + warn "Potential libraries are '$potential_libs':\n" if $verbose; + + my ( $so ) = $Config{so}; + my ( $libs ) = defined $Config{perllibs} ? $Config{perllibs} : $Config{libs}; + my $Config_libext = $Config{lib_ext} || ".a"; + my $Config_dlext = $Config{dlext}; + + # compute $extralibs, $bsloadlibs and $ldloadlibs from + # $potential_libs + # this is a rewrite of Andy Dougherty's extliblist in perl + + my ( @searchpath ); # from "-L/path" entries in $potential_libs + my ( @libpath ) = split " ", $Config{'libpth'} || ''; + my ( @ldloadlibs, @bsloadlibs, @extralibs, @ld_run_path, %ld_run_path_seen ); + my ( @libs, %libs_seen ); + my ( $fullname, @fullname ); + my ( $pwd ) = cwd(); # from Cwd.pm + my ( $found ) = 0; + + if ( $^O eq 'darwin' or $^O eq 'next' ) { + # 'escape' Mach-O ld -framework and -F flags, so they aren't dropped later on + $potential_libs =~ s/(^|\s)(-(?:weak_|reexport_|lazy_)?framework)\s+(\S+)/$1-Wl,$2 -Wl,$3/g; + $potential_libs =~ s/(^|\s)(-F)\s*(\S+)/$1-Wl,$2 -Wl,$3/g; + } + + foreach my $thislib ( split ' ', $potential_libs ) { + my ( $custom_name ) = ''; + + # Handle possible linker path arguments. + if ( $thislib =~ s/^(-[LR]|-Wl,-R|-Wl,-rpath,)// ) { # save path flag type + my ( $ptype ) = $1; + unless ( -d $thislib ) { + warn "$ptype$thislib ignored, directory does not exist\n" + if $verbose; + next; + } + my ( $rtype ) = $ptype; + if ( ( $ptype eq '-R' ) or ( $ptype =~ m!^-Wl,-[Rr]! ) ) { + if ( $Config{'lddlflags'} =~ /-Wl,-[Rr]/ ) { + $rtype = '-Wl,-R'; + } + elsif ( $Config{'lddlflags'} =~ /-R/ ) { + $rtype = '-R'; + } + } + unless ( File::Spec->file_name_is_absolute( $thislib ) ) { + warn "Warning: $ptype$thislib changed to $ptype$pwd/$thislib\n"; + $thislib = $self->catdir( $pwd, $thislib ); + } + push( @searchpath, $thislib ); + push( @extralibs, "$ptype$thislib" ); + push( @ldloadlibs, "$rtype$thislib" ); + next; + } + + if ( $thislib =~ m!^-Wl,! ) { + push( @extralibs, $thislib ); + push( @ldloadlibs, $thislib ); + next; + } + + # Handle possible library arguments. + if ( $thislib =~ s/^-l(:)?// ) { + # Handle -l:foo.so, which means that the library will + # actually be called foo.so, not libfoo.so. This + # is used in Android by ExtUtils::Depends to allow one XS + # module to link to another. + $custom_name = $1 || ''; + } + else { + warn "Unrecognized argument in LIBS ignored: '$thislib'\n"; + next; + } + + my ( $found_lib ) = 0; + foreach my $thispth ( @searchpath, @libpath ) { + + # Try to find the full name of the library. We need this to + # determine whether it's a dynamically-loadable library or not. + # This tends to be subject to various os-specific quirks. + # For gcc-2.6.2 on linux (March 1995), DLD can not load + # .sa libraries, with the exception of libm.sa, so we + # deliberately skip them. + if ((@fullname = + $self->lsdir($thispth, "^\Qlib$thislib.$so.\E[0-9]+")) || + (@fullname = + $self->lsdir($thispth, "^\Qlib$thislib.\E[0-9]+\Q\.$so"))) { + # Take care that libfoo.so.10 wins against libfoo.so.9. + # Compare two libraries to find the most recent version + # number. E.g. if you have libfoo.so.9.0.7 and + # libfoo.so.10.1, first convert all digits into two + # decimal places. Then we'll add ".00" to the shorter + # strings so that we're comparing strings of equal length + # Thus we'll compare libfoo.so.09.07.00 with + # libfoo.so.10.01.00. Some libraries might have letters + # in the version. We don't know what they mean, but will + # try to skip them gracefully -- we'll set any letter to + # '0'. Finally, sort in reverse so we can take the + # first element. + + #TODO: iterate through the directory instead of sorting + + $fullname = "$thispth/" . ( + sort { + my ( $ma ) = $a; + my ( $mb ) = $b; + $ma =~ tr/A-Za-z/0/s; + $ma =~ s/\b(\d)\b/0$1/g; + $mb =~ tr/A-Za-z/0/s; + $mb =~ s/\b(\d)\b/0$1/g; + while ( length( $ma ) < length( $mb ) ) { $ma .= ".00"; } + while ( length( $mb ) < length( $ma ) ) { $mb .= ".00"; } + + # Comparison deliberately backwards + $mb cmp $ma; + } @fullname + )[0]; + } + elsif ( -f ( $fullname = "$thispth/lib$thislib.$so" ) + && ( ( $Config{'dlsrc'} ne "dl_dld.xs" ) || ( $thislib eq "m" ) ) ) + { + } + elsif (-f ( $fullname = "$thispth/lib${thislib}_s$Config_libext" ) + && ( $Config{'archname'} !~ /RM\d\d\d-svr4/ ) + && ( $thislib .= "_s" ) ) + { # we must explicitly use _s version + } + elsif ( -f ( $fullname = "$thispth/lib$thislib$Config_libext" ) ) { + } + elsif ( defined( $Config_dlext ) + && -f ( $fullname = "$thispth/lib$thislib.$Config_dlext" ) ) + { + } + elsif ( -f ( $fullname = "$thispth/$thislib$Config_libext" ) ) { + } + elsif ( -f ( $fullname = "$thispth/lib$thislib.dll$Config_libext" ) ) { + } + elsif ( $^O eq 'cygwin' && -f ( $fullname = "$thispth/$thislib.dll" ) ) { + } + elsif ( -f ( $fullname = "$thispth/Slib$thislib$Config_libext" ) ) { + } + elsif ($^O eq 'dgux' + && -l ( $fullname = "$thispth/lib$thislib$Config_libext" ) + && readlink( $fullname ) =~ /^elink:/s ) + { + + # Some of DG's libraries look like misconnected symbolic + # links, but development tools can follow them. (They + # look like this: + # + # libm.a -> elink:${SDE_PATH:-/usr}/sde/\ + # ${TARGET_BINARY_INTERFACE:-m88kdgux}/usr/lib/libm.a + # + # , the compilation tools expand the environment variables.) + } + elsif ( $custom_name && -f ( $fullname = "$thispth/$thislib" ) ) { + } + else { + warn "$thislib not found in $thispth\n" if $verbose; + next; + } + warn "'-l$thislib' found at $fullname\n" if $verbose; + push @libs, $fullname unless $libs_seen{$fullname}++; + $found++; + $found_lib++; + + # Now update library lists + + # what do we know about this library... + my $is_dyna = ( $fullname !~ /\Q$Config_libext\E\z/ ); + my $in_perl = ( $libs =~ /\B-l:?\Q${thislib}\E\b/s ); + + # include the path to the lib once in the dynamic linker path + # but only if it is a dynamic lib and not in Perl itself + my ( $fullnamedir ) = dirname( $fullname ); + push @ld_run_path, $fullnamedir + if $is_dyna + && !$in_perl + && !$ld_run_path_seen{$fullnamedir}++; + + # Do not add it into the list if it is already linked in + # with the main perl executable. + # We have to special-case the NeXT, because math and ndbm + # are both in libsys_s + unless ( + $in_perl + || ( $Config{'osname'} eq 'next' + && ( $thislib eq 'm' || $thislib eq 'ndbm' ) ) + ) + { + push( @extralibs, "-l$custom_name$thislib" ); + } + + # We might be able to load this archive file dynamically + if ( ( $Config{'dlsrc'} =~ /dl_next/ && $Config{'osvers'} lt '4_0' ) + || ( $Config{'dlsrc'} =~ /dl_dld/ ) ) + { + + # We push -l$thislib instead of $fullname because + # it avoids hardwiring a fixed path into the .bs file. + # Mkbootstrap will automatically add dl_findfile() to + # the .bs file if it sees a name in the -l format. + # USE THIS, when dl_findfile() is fixed: + # push(@bsloadlibs, "-l$thislib"); + # OLD USE WAS while checking results against old_extliblist + push( @bsloadlibs, "$fullname" ); + } + else { + if ( $is_dyna ) { + + # For SunOS4, do not add in this shared library if + # it is already linked in the main perl executable + push( @ldloadlibs, "-l$custom_name$thislib" ) + unless ( $in_perl and $^O eq 'sunos' ); + } + else { + push( @ldloadlibs, "-l$custom_name$thislib" ); + } + } + last; # found one here so don't bother looking further + } + warn "Warning (mostly harmless): " . "No library found for -l$thislib\n" + unless $found_lib > 0; + } + + unless ( $found ) { + return ( '', '', '', '', ( $give_libs ? \@libs : () ) ); + } + else { + return ( "@extralibs", "@bsloadlibs", "@ldloadlibs", join( ":", @ld_run_path ), ( $give_libs ? \@libs : () ) ); + } +} + +sub _win32_ext { + + require Text::ParseWords; + + my ( $self, $potential_libs, $verbose, $give_libs ) = @_; + $verbose ||= 0; + + # If user did not supply a list, we punt. + # (caller should probably use the list in $Config{libs}) + return ( "", "", "", "", ( $give_libs ? [] : () ) ) unless $potential_libs; + + # TODO: make this use MM_Win32.pm's compiler detection + my %libs_seen; + my @extralibs; + my $cc = $Config{cc} || ''; + my $VC = $cc =~ /\bcl\b/i; + my $GC = $cc =~ /\bgcc\b/i; + + my $libext = _win32_lib_extensions(); + my @searchpath = ( '' ); # from "-L/path" entries in $potential_libs + my @libpath = _win32_default_search_paths( $VC, $GC ); + my $pwd = cwd(); # from Cwd.pm + my $search = 1; + + # compute @extralibs from $potential_libs + my @lib_search_list = _win32_make_lib_search_list( $potential_libs, $verbose ); + for ( @lib_search_list ) { + + my $thislib = $_; + + # see if entry is a flag + if ( /^:\w+$/ ) { + $search = 0 if lc eq ':nosearch'; + $search = 1 if lc eq ':search'; + _debug( "Ignoring unknown flag '$thislib'\n", $verbose ) if !/^:(no)?(search|default)$/i; + next; + } + + # if searching is disabled, do compiler-specific translations + unless ( $search ) { + s/^-l(.+)$/$1.lib/ unless $GC; + s/^-L/-libpath:/ if $VC; + push( @extralibs, $_ ); + next; + } + + # handle possible linker path arguments + if ( s/^-L// and not -d ) { + _debug( "$thislib ignored, directory does not exist\n", $verbose ); + next; + } + elsif ( -d ) { + unless ( File::Spec->file_name_is_absolute( $_ ) ) { + warn "Warning: '$thislib' changed to '-L$pwd/$_'\n"; + $_ = $self->catdir( $pwd, $_ ); + } + push( @searchpath, $_ ); + next; + } + + my @paths = ( @searchpath, @libpath ); + my ( $fullname, $path ) = _win32_search_file( $thislib, $libext, \@paths, $verbose, $GC ); + + if ( !$fullname ) { + warn "Warning (mostly harmless): No library found for $thislib\n"; + next; + } + + _debug( "'$thislib' found as '$fullname'\n", $verbose ); + push( @extralibs, $fullname ); + $libs_seen{$fullname} = 1 if $path; # why is this a special case? + } + + my @libs = sort keys %libs_seen; + + return ( '', '', '', '', ( $give_libs ? \@libs : () ) ) unless @extralibs; + + # make sure paths with spaces are properly quoted + @extralibs = map { qq["$_"] } @extralibs; + @libs = map { qq["$_"] } @libs; + + my $lib = join( ' ', @extralibs ); + + # normalize back to backward slashes (to help braindead tools) + # XXX this may break equally braindead GNU tools that don't understand + # backslashes, either. Seems like one can't win here. Cursed be CP/M. + $lib =~ s,/,\\,g; + + _debug( "Result: $lib\n", $verbose ); + wantarray ? ( $lib, '', $lib, '', ( $give_libs ? \@libs : () ) ) : $lib; +} + +sub _win32_make_lib_search_list { + my ( $potential_libs, $verbose ) = @_; + + # If Config.pm defines a set of default libs, we always + # tack them on to the user-supplied list, unless the user + # specified :nodefault + my $libs = $Config{'perllibs'}; + $potential_libs = join( ' ', $potential_libs, $libs ) if $libs and $potential_libs !~ /:nodefault/i; + _debug( "Potential libraries are '$potential_libs':\n", $verbose ); + + $potential_libs =~ s,\\,/,g; # normalize to forward slashes + + my @list = Text::ParseWords::quotewords( '\s+', 0, $potential_libs ); + + return @list; +} + +sub _win32_default_search_paths { + my ( $VC, $GC ) = @_; + + my $libpth = $Config{'libpth'} || ''; + $libpth =~ s,\\,/,g; # normalize to forward slashes + + my @libpath = Text::ParseWords::quotewords( '\s+', 0, $libpth ); + push @libpath, "$Config{installarchlib}/CORE"; # add "$Config{installarchlib}/CORE" to default search path + + push @libpath, split /;/, $ENV{LIB} if $VC and $ENV{LIB}; + push @libpath, split /;/, $ENV{LIBRARY_PATH} if $GC and $ENV{LIBRARY_PATH}; + + return @libpath; +} + +sub _win32_search_file { + my ( $thislib, $libext, $paths, $verbose, $GC ) = @_; + + my @file_list = _win32_build_file_list( $thislib, $GC, $libext ); + + for my $lib_file ( @file_list ) { + for my $path ( @{$paths} ) { + my $fullname = $lib_file; + $fullname = "$path\\$fullname" if $path; + + return ( $fullname, $path ) if -f $fullname; + + _debug( "'$thislib' not found as '$fullname'\n", $verbose ); + } + } + + return; +} + +sub _win32_build_file_list { + my ( $lib, $GC, $extensions ) = @_; + + my @pre_fixed = _win32_build_prefixed_list( $lib, $GC ); + return map _win32_attach_extensions( $_, $extensions ), @pre_fixed; +} + +sub _win32_build_prefixed_list { + my ( $lib, $GC ) = @_; + + return $lib if $lib !~ s/^-l//; + return $lib if $lib =~ /^lib/ and !$GC; + + ( my $no_prefix = $lib ) =~ s/^lib//i; + $lib = "lib$lib" if $no_prefix eq $lib; + + return ( $lib, $no_prefix ) if $GC; + return ( $no_prefix, $lib ); +} + +sub _win32_attach_extensions { + my ( $lib, $extensions ) = @_; + return map _win32_try_attach_extension( $lib, $_ ), @{$extensions}; +} + +sub _win32_try_attach_extension { + my ( $lib, $extension ) = @_; + + return $lib if $lib =~ /\Q$extension\E$/i; + return "$lib$extension"; +} + +sub _win32_lib_extensions { + my @extensions; + push @extensions, $Config{'lib_ext'} if $Config{'lib_ext'}; + push @extensions, '.dll.a' if grep { m!^\.a$! } @extensions; + push @extensions, '.lib' unless grep { m!^\.lib$! } @extensions; + return \@extensions; +} + +sub _debug { + my ( $message, $verbose ) = @_; + return if !$verbose; + warn $message; + return; +} + +sub _vms_ext { + my ( $self, $potential_libs, $verbose, $give_libs ) = @_; + $verbose ||= 0; + + my ( @crtls, $crtlstr ); + @crtls = ( ( $Config{'ldflags'} =~ m-/Debug-i ? $Config{'dbgprefix'} : '' ) . 'PerlShr/Share' ); + push( @crtls, grep { not /\(/ } split /\s+/, $Config{'perllibs'} ); + push( @crtls, grep { not /\(/ } split /\s+/, $Config{'libc'} ); + + # In general, we pass through the basic libraries from %Config unchanged. + # The one exception is that if we're building in the Perl source tree, and + # a library spec could be resolved via a logical name, we go to some trouble + # to insure that the copy in the local tree is used, rather than one to + # which a system-wide logical may point. + if ( $self->{PERL_SRC} ) { + my ( $locspec, $type ); + foreach my $lib ( @crtls ) { + if ( ( $locspec, $type ) = $lib =~ m{^([\w\$-]+)(/\w+)?} and $locspec =~ /perl/i ) { + if ( lc $type eq '/share' ) { $locspec .= $Config{'exe_ext'}; } + elsif ( lc $type eq '/library' ) { $locspec .= $Config{'lib_ext'}; } + else { $locspec .= $Config{'obj_ext'}; } + $locspec = $self->catfile( $self->{PERL_SRC}, $locspec ); + $lib = "$locspec$type" if -e $locspec; + } + } + } + $crtlstr = @crtls ? join( ' ', @crtls ) : ''; + + unless ( $potential_libs ) { + warn "Result:\n\tEXTRALIBS: \n\tLDLOADLIBS: $crtlstr\n" if $verbose; + return ( '', '', $crtlstr, '', ( $give_libs ? [] : () ) ); + } + + my ( %found, @fndlibs, $ldlib ); + my $cwd = cwd(); + my ( $so, $lib_ext, $obj_ext ) = @Config{ 'so', 'lib_ext', 'obj_ext' }; + + # List of common Unix library names and their VMS equivalents + # (VMS equivalent of '' indicates that the library is automatically + # searched by the linker, and should be skipped here.) + my ( @flibs, %libs_seen ); + my %libmap = ( + 'm' => '', + 'f77' => '', + 'F77' => '', + 'V77' => '', + 'c' => '', + 'malloc' => '', + 'crypt' => '', + 'resolv' => '', + 'c_s' => '', + 'socket' => '', + 'X11' => 'DECW$XLIBSHR', + 'Xt' => 'DECW$XTSHR', + 'Xm' => 'DECW$XMLIBSHR', + 'Xmu' => 'DECW$XMULIBSHR' + ); + + warn "Potential libraries are '$potential_libs'\n" if $verbose; + + # First, sort out directories and library names in the input + my ( @dirs, @libs ); + foreach my $lib ( split ' ', $potential_libs ) { + push( @dirs, $1 ), next if $lib =~ /^-L(.*)/; + push( @dirs, $lib ), next if $lib =~ /[:>\]]$/; + push( @dirs, $lib ), next if -d $lib; + push( @libs, $1 ), next if $lib =~ /^-l(.*)/; + push( @libs, $lib ); + } + push( @dirs, split( ' ', $Config{'libpth'} ) ); + + # Now make sure we've got VMS-syntax absolute directory specs + # (We don't, however, check whether someone's hidden a relative + # path in a logical name.) + foreach my $dir ( @dirs ) { + unless ( -d $dir ) { + warn "Skipping nonexistent Directory $dir\n" if $verbose > 1; + $dir = ''; + next; + } + warn "Resolving directory $dir\n" if $verbose; + if ( File::Spec->file_name_is_absolute( $dir ) ) { + $dir = VMS::Filespec::vmspath( $dir ); + } + else { + $dir = $self->catdir( $cwd, $dir ); + } + } + @dirs = grep { length( $_ ) } @dirs; + unshift( @dirs, '' ); # Check each $lib without additions first + + LIB: foreach my $lib ( @libs ) { + if ( exists $libmap{$lib} ) { + next unless length $libmap{$lib}; + $lib = $libmap{$lib}; + } + + my ( @variants, $cand ); + my ( $ctype ) = ''; + + # If we don't have a file type, consider it a possibly abbreviated name and + # check for common variants. We try these first to grab libraries before + # a like-named executable image (e.g. -lperl resolves to perlshr.exe + # before perl.exe). + if ( $lib !~ /\.[^:>\]]*$/ ) { + push( @variants, "${lib}shr", "${lib}rtl", "${lib}lib" ); + push( @variants, "lib$lib" ) if $lib !~ /[:>\]]/; + } + push( @variants, $lib ); + warn "Looking for $lib\n" if $verbose; + foreach my $variant ( @variants ) { + my ( $fullname, $name ); + + foreach my $dir ( @dirs ) { + my ( $type ); + + $name = "$dir$variant"; + warn "\tChecking $name\n" if $verbose > 2; + $fullname = VMS::Filespec::rmsexpand( $name ); + if ( defined $fullname and -f $fullname ) { + + # It's got its own suffix, so we'll have to figure out the type + if ( $fullname =~ /(?:$so|exe)$/i ) { $type = 'SHR'; } + elsif ( $fullname =~ /(?:$lib_ext|olb)$/i ) { $type = 'OLB'; } + elsif ( $fullname =~ /(?:$obj_ext|obj)$/i ) { + warn "Warning (mostly harmless): " . "Plain object file $fullname found in library list\n"; + $type = 'OBJ'; + } + else { + warn "Warning (mostly harmless): " . "Unknown library type for $fullname; assuming shared\n"; + $type = 'SHR'; + } + } + elsif (-f ( $fullname = VMS::Filespec::rmsexpand( $name, $so ) ) + or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.exe' ) ) ) + { + $type = 'SHR'; + $name = $fullname unless $fullname =~ /exe;?\d*$/i; + } + elsif ( + not length( $ctype ) and # If we've got a lib already, + # don't bother + ( -f ( $fullname = VMS::Filespec::rmsexpand( $name, $lib_ext ) ) or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.olb' ) ) ) + ) + { + $type = 'OLB'; + $name = $fullname unless $fullname =~ /olb;?\d*$/i; + } + elsif ( + not length( $ctype ) and # If we've got a lib already, + # don't bother + ( -f ( $fullname = VMS::Filespec::rmsexpand( $name, $obj_ext ) ) or -f ( $fullname = VMS::Filespec::rmsexpand( $name, '.obj' ) ) ) + ) + { + warn "Warning (mostly harmless): " . "Plain object file $fullname found in library list\n"; + $type = 'OBJ'; + $name = $fullname unless $fullname =~ /obj;?\d*$/i; + } + if ( defined $type ) { + $ctype = $type; + $cand = $name; + last if $ctype eq 'SHR'; + } + } + if ( $ctype ) { + + push @{ $found{$ctype} }, $cand; + warn "\tFound as $cand (really $fullname), type $ctype\n" + if $verbose > 1; + push @flibs, $name unless $libs_seen{$fullname}++; + next LIB; + } + } + warn "Warning (mostly harmless): " . "No library found for $lib\n"; + } + + push @fndlibs, @{ $found{OBJ} } if exists $found{OBJ}; + push @fndlibs, map { "$_/Library" } @{ $found{OLB} } if exists $found{OLB}; + push @fndlibs, map { "$_/Share" } @{ $found{SHR} } if exists $found{SHR}; + my $lib = join( ' ', @fndlibs ); + + $ldlib = $crtlstr ? "$lib $crtlstr" : $lib; + $ldlib =~ s/^\s+|\s+$//g; + warn "Result:\n\tEXTRALIBS: $lib\n\tLDLOADLIBS: $ldlib\n" if $verbose; + wantarray ? ( $lib, '', $ldlib, '', ( $give_libs ? \@flibs : () ) ) : $lib; +} + +1; +package Filter::Simple; + +use Text::Balanced ':ALL'; + +our $VERSION = '0.95'; + +use Filter::Util::Call; +use Carp; + +our @EXPORT = qw( FILTER FILTER_ONLY ); + + +sub import { + if (@_>1) { shift; goto &FILTER } + else { *{caller()."::$_"} = \&$_ foreach @EXPORT } +} + +sub fail { + croak "FILTER_ONLY: ", @_; +} + +my $exql = sub { + my @bits = extract_quotelike $_[0], qr//; + return unless $bits[0]; + return \@bits; +}; + +my $ncws = qr/\s+/; +my $comment = qr/(?()-]|\^[A-Z]?)\} + | (?:\$#?|[*\@\%]|\\&)\$*\s* + (?: \{\s*(?:\^(?=[A-Z_]))?(?:\w|::|'\w)*\s*\} + | (?:\^(?=[A-Z_]))?(?:\w|::|'\w)* + | (?=\{) # ${ block } + ) + ) + | \$\s*(?!::)(?:\d+|[][&`'#+*./|,";%=~:?!\@<>()-]|\^[A-Z]?) + }x; + +my %extractor_for = ( + quotelike => [ $ws, $variable, $id, { MATCH => \&extract_quotelike } ], + regex => [ $ws, $pod_or_DATA, $id, $exql ], + string => [ $ws, $pod_or_DATA, $id, $exql ], + code => [ $ws, { DONT_MATCH => $pod_or_DATA }, $variable, + $id, { DONT_MATCH => \&extract_quotelike } ], + code_no_comments + => [ { DONT_MATCH => $comment }, + $ncws, { DONT_MATCH => $pod_or_DATA }, $variable, + $id, { DONT_MATCH => \&extract_quotelike } ], + executable => [ $ws, { DONT_MATCH => $pod_or_DATA } ], + executable_no_comments + => [ { DONT_MATCH => $comment }, + $ncws, { DONT_MATCH => $pod_or_DATA } ], + all => [ { MATCH => qr/(?s:.*)/ } ], +); + +my %selector_for = ( + all => sub { my ($t)=@_; sub{ $_=$$_; $t->(@_); $_} }, + executable=> sub { my ($t)=@_; sub{ref() ? $_=$$_ : $t->(@_); $_} }, + quotelike => sub { my ($t)=@_; sub{ref() && do{$_=$$_; $t->(@_)}; $_} }, + regex => sub { my ($t)=@_; + sub{ref() or return $_; + my ($ql,undef,$pre,$op,$ld,$pat) = @$_; + return $_->[0] unless $op =~ /^(qr|m|s)/ + || !$op && ($ld eq '/' || $ld eq '?'); + $_ = $pat; + $t->(@_); + $ql =~ s/^(\s*\Q$op\E\s*\Q$ld\E)\Q$pat\E/$1$_/; + return "$pre$ql"; + }; + }, + string => sub { my ($t)=@_; + sub{ref() or return $_; + local *args = \@_; + my ($pre,$op,$ld1,$str1,$rd1,$ld2,$str2,$rd2,$flg) = @{$_}[2..10]; + return $_->[0] if $op =~ /^(qr|m)/ + || !$op && ($ld1 eq '/' || $ld1 eq '?'); + if (!$op || $op eq 'tr' || $op eq 'y') { + local *_ = \$str1; + $t->(@args); + } + if ($op =~ /^(tr|y|s)/) { + local *_ = \$str2; + $t->(@args); + } + my $result = "$pre$op$ld1$str1$rd1"; + $result .= $ld2 if $ld1 =~ m/[[({<]/; #])}> + $result .= "$str2$rd2$flg"; + return $result; + }; + }, +); + + +sub gen_std_filter_for { + my ($type, $transform) = @_; + return sub { + my $instr; + local @components; + for (extract_multiple($_,$extractor_for{$type})) { + if (ref()) { push @components, $_; $instr=0 } + elsif ($instr) { $components[-1] .= $_ } + else { push @components, $_; $instr=1 } + } + if ($type =~ /^code/) { + my $count = 0; + local $placeholder = qr/\Q$;\E(.{4})\Q$;\E/s; + my $extractor = qr/\Q$;\E(.{4})\Q$;\E/s; + $_ = join "", + map { ref $_ ? $;.pack('N',$count++).$; : $_ } + @components; + @components = grep { ref $_ } @components; + $transform->(@_); + s/$extractor/${$components[unpack('N',$1)]}/g; + } + else { + my $selector = $selector_for{$type}->($transform); + $_ = join "", map $selector->(@_), @components; + } + } +}; + +sub FILTER (&;$) { + my $caller = caller; + my ($filter, $terminator) = @_; + no warnings 'redefine'; + *{"${caller}::import"} = gen_filter_import($caller,$filter,$terminator); + *{"${caller}::unimport"} = gen_filter_unimport($caller); +} + +sub FILTER_ONLY { + my $caller = caller; + while (@_ > 1) { + my ($what, $how) = splice(@_, 0, 2); + fail "Unknown selector: $what" + unless exists $extractor_for{$what}; + fail "Filter for $what is not a subroutine reference" + unless ref $how eq 'CODE'; + push @transforms, gen_std_filter_for($what,$how); + } + my $terminator = shift; + + my $multitransform = sub { + foreach my $transform ( @transforms ) { + $transform->(@_); + } + }; + no warnings 'redefine'; + *{"${caller}::import"} = + gen_filter_import($caller,$multitransform,$terminator); + *{"${caller}::unimport"} = gen_filter_unimport($caller); +} + +my $ows = qr/(?:[ \t]+|#[^\n]*)*/; + +sub gen_filter_import { + my ($class, $filter, $terminator) = @_; + my %terminator; + my $prev_import = *{$class."::import"}{CODE}; + return sub { + my ($imported_class, @args) = @_; + my $def_terminator = + qr/^(?:\s*no\s+$imported_class\s*;$ows|__(?:END|DATA)__)\r?$/; + if (!defined $terminator) { + $terminator{terminator} = $def_terminator; + } + elsif (!ref $terminator || ref $terminator eq 'Regexp') { + $terminator{terminator} = $terminator; + } + elsif (ref $terminator ne 'HASH') { + croak "Terminator must be specified as scalar or hash ref" + } + elsif (!exists $terminator->{terminator}) { + $terminator{terminator} = $def_terminator; + } + filter_add( + sub { + my ($status, $lastline); + my $count = 0; + my $data = ""; + while ($status = filter_read()) { + return $status if $status < 0; + if ($terminator{terminator} && + m/$terminator{terminator}/) { + $lastline = $_; + $count++; + last; + } + $data .= $_; + $count++; + $_ = ""; + } + return $count if not $count; + $_ = $data; + $filter->($imported_class, @args) unless $status < 0; + if (defined $lastline) { + if (defined $terminator{becomes}) { + $_ .= $terminator{becomes}; + } + elsif ($lastline =~ $def_terminator) { + $_ .= $lastline; + } + } + return $count; + } + ); + if ($prev_import) { + goto &$prev_import; + } + elsif ($class->isa('Exporter')) { + $class->export_to_level(1,@_); + } + } +} + +sub gen_filter_unimport { + my ($class) = @_; + return sub { + filter_del(); + goto &$prev_unimport if $prev_unimport; + } +} + +1; + +__END__ + +# B::Deparse.pm +# Copyright (c) 1998-2000, 2002, 2003, 2004, 2005, 2006 Stephen McCamant. +# All rights reserved. +# This module is free software; you can redistribute and/or modify +# it under the same terms as Perl itself. + +# This is based on the module of the same name by Malcolm Beattie, +# but essentially none of his code remains. + +package B::Deparse; +use Carp; +use B qw(class main_root main_start main_cv svref_2object opnumber perlstring + OPf_WANT OPf_WANT_VOID OPf_WANT_SCALAR OPf_WANT_LIST + OPf_KIDS OPf_REF OPf_STACKED OPf_SPECIAL OPf_MOD OPf_PARENS + OPpLVAL_INTRO OPpOUR_INTRO OPpENTERSUB_AMPER OPpSLICE OPpKVSLICE + OPpCONST_BARE + OPpTRANS_SQUASH OPpTRANS_DELETE OPpTRANS_COMPLEMENT OPpTARGET_MY + OPpEXISTS_SUB OPpSORT_NUMERIC OPpSORT_INTEGER OPpREPEAT_DOLIST + OPpSORT_REVERSE OPpMULTIDEREF_EXISTS OPpMULTIDEREF_DELETE + OPpSPLIT_ASSIGN OPpSPLIT_LEX + OPpPADHV_ISKEYS OPpRV2HV_ISKEYS + OPpCONCAT_NESTED + OPpMULTICONCAT_APPEND OPpMULTICONCAT_STRINGIFY OPpMULTICONCAT_FAKE + OPpTRUEBOOL OPpINDEX_BOOLNEG + SVf_IOK SVf_NOK SVf_ROK SVf_POK SVpad_OUR SVf_FAKE SVs_RMG SVs_SMG + SVs_PADTMP SVpad_TYPED + CVf_METHOD CVf_LVALUE + PMf_KEEP PMf_GLOBAL PMf_CONTINUE PMf_EVAL PMf_ONCE + PMf_MULTILINE PMf_SINGLELINE PMf_FOLD PMf_EXTENDED PMf_EXTENDED_MORE + PADNAMEt_OUTER + MDEREF_reload + MDEREF_AV_pop_rv2av_aelem + MDEREF_AV_gvsv_vivify_rv2av_aelem + MDEREF_AV_padsv_vivify_rv2av_aelem + MDEREF_AV_vivify_rv2av_aelem + MDEREF_AV_padav_aelem + MDEREF_AV_gvav_aelem + MDEREF_HV_pop_rv2hv_helem + MDEREF_HV_gvsv_vivify_rv2hv_helem + MDEREF_HV_padsv_vivify_rv2hv_helem + MDEREF_HV_vivify_rv2hv_helem + MDEREF_HV_padhv_helem + MDEREF_HV_gvhv_helem + MDEREF_ACTION_MASK + MDEREF_INDEX_none + MDEREF_INDEX_const + MDEREF_INDEX_padsv + MDEREF_INDEX_gvsv + MDEREF_INDEX_MASK + MDEREF_FLAG_last + MDEREF_MASK + MDEREF_SHIFT + ); + +$VERSION = '1.48'; +use strict; +our $AUTOLOAD; +use warnings (); +require feature; + +use Config; + +BEGIN { + # List version-specific constants here. + # Easiest way to keep this code portable between version looks to + # be to fake up a dummy constant that will never actually be true. + foreach (qw(OPpSORT_INPLACE OPpSORT_DESCEND OPpITER_REVERSED OPpCONST_NOVER + OPpPAD_STATE PMf_SKIPWHITE RXf_SKIPWHITE + PMf_CHARSET PMf_KEEPCOPY PMf_NOCAPTURE CVf_ANONCONST + CVf_LOCKED OPpREVERSE_INPLACE OPpSUBSTR_REPL_FIRST + PMf_NONDESTRUCT OPpCONST_ARYBASE OPpEVAL_BYTES + OPpLVREF_TYPE OPpLVREF_SV OPpLVREF_AV OPpLVREF_HV + OPpLVREF_CV OPpLVREF_ELEM SVpad_STATE)) { + eval { B->import($_) }; + no strict 'refs'; + *{$_} = sub () {0} unless *{$_}{CODE}; + } +} + +# Todo: +# (See also BUGS section at the end of this file) +# +# - finish tr/// changes +# - add option for even more parens (generalize \&foo change) +# - left/right context +# - copy comments (look at real text with $^P?) +# - avoid semis in one-statement blocks +# - associativity of &&=, ||=, ?: +# - ',' => '=>' (auto-unquote?) +# - break long lines ("\r" as discretionary break?) +# - configurable syntax highlighting: ANSI color, HTML, TeX, etc. +# - more style options: brace style, hex vs. octal, quotes, ... +# - print big ints as hex/octal instead of decimal (heuristic?) +# - handle 'my $x if 0'? +# - version using op_next instead of op_first/sibling? +# - avoid string copies (pass arrays, one big join?) +# - here-docs? + +# Current test.deparse failures +# comp/hints 6 - location of BEGIN blocks wrt. block openings +# run/switchI 1 - missing -I switches entirely +# perl -Ifoo -e 'print @INC' +# op/caller 2 - warning mask propagates backwards before warnings::register +# 'use warnings; BEGIN {${^WARNING_BITS} eq "U"x12;} use warnings::register' +# op/getpid 2 - can't assign to shared my() declaration (threads only) +# 'my $x : shared = 5' +# op/override 7 - parens on overridden require change v-string interpretation +# 'BEGIN{*CORE::GLOBAL::require=sub {}} require v5.6' +# c.f. 'BEGIN { *f = sub {0} }; f 2' +# op/pat 774 - losing Unicode-ness of Latin1-only strings +# 'use charnames ":short"; $x="\N{latin:a with acute}"' +# op/recurse 12 - missing parens on recursive call makes it look like method +# 'sub f { f($x) }' +# op/subst 90 - inconsistent handling of utf8 under "use utf8" +# op/taint 29 - "use re 'taint'" deparsed in the wrong place wrt. block open +# op/tiehandle compile - "use strict" deparsed in the wrong place +# uni/tr_ several +# ext/B/t/xref 11 - line numbers when we add newlines to one-line subs +# ext/Data/Dumper/t/dumper compile +# ext/DB_file/several +# ext/Encode/several +# ext/Ernno/Errno warnings +# ext/IO/lib/IO/t/io_sel 23 +# ext/PerlIO/t/encoding compile +# ext/POSIX/t/posix 6 +# ext/Socket/Socket 8 +# ext/Storable/t/croak compile +# lib/Attribute/Handlers/t/multi compile +# lib/bignum/ several +# lib/charnames 35 +# lib/constant 32 +# lib/English 40 +# lib/ExtUtils/t/bytes 4 +# lib/File/DosGlob compile +# lib/Filter/Simple/t/data 1 +# lib/Math/BigInt/t/constant 1 +# lib/Net/t/config Deparse-warning +# lib/overload compile +# lib/Switch/ several +# lib/Symbol 4 +# lib/Test/Simple several +# lib/Term/Complete +# lib/Tie/File/t/29_downcopy 5 +# lib/vars 22 + +# Object fields: +# +# in_coderef2text: +# True when deparsing via $deparse->coderef2text; false when deparsing the +# main program. +# +# avoid_local: +# (local($a), local($b)) and local($a, $b) have the same internal +# representation but the short form looks better. We notice we can +# use a large-scale local when checking the list, but need to prevent +# individual locals too. This hash holds the addresses of OPs that +# have already had their local-ness accounted for. The same thing +# is done with my(). +# +# curcv: +# CV for current sub (or main program) being deparsed +# +# curcvlex: +# Cached hash of lexical variables for curcv: keys are +# names prefixed with "m" or "o" (representing my/our), and +# each value is an array with two elements indicating the cop_seq +# of scopes in which a var of that name is valid and a third ele- +# ment referencing the pad name. +# +# curcop: +# COP for statement being deparsed +# +# curstash: +# name of the current package for deparsed code +# +# subs_todo: +# array of [cop_seq, CV, is_format?, name] for subs and formats we still +# want to deparse. The fourth element is a pad name thingy for lexical +# subs or a string for special blocks. For other subs, it is undef. For +# lexical subs, CV may be undef, indicating a stub declaration. +# +# protos_todo: +# as above, but [name, prototype] for subs that never got a GV +# +# subs_done, forms_done: +# keys are addresses of GVs for subs and formats we've already +# deparsed (or at least put into subs_todo) +# +# subs_declared +# keys are names of subs for which we've printed declarations. +# That means we can omit parentheses from the arguments. It also means we +# need to put CORE:: on core functions of the same name. +# +# in_subst_repl +# True when deparsing the replacement part of a substitution. +# +# in_refgen +# True when deparsing the argument to \. +# +# parens: -p +# linenums: -l +# unquote: -q +# cuddle: ' ' or '\n', depending on -sC +# indent_size: -si +# use_tabs: -sT +# ex_const: -sv + +# A little explanation of how precedence contexts and associativity +# work: +# +# deparse() calls each per-op subroutine with an argument $cx (short +# for context, but not the same as the cx* in the perl core), which is +# a number describing the op's parents in terms of precedence, whether +# they're inside an expression or at statement level, etc. (see +# chart below). When ops with children call deparse on them, they pass +# along their precedence. Fractional values are used to implement +# associativity ('($x + $y) + $z' => '$x + $y + $y') and related +# parentheses hacks. The major disadvantage of this scheme is that +# it doesn't know about right sides and left sides, so say if you +# assign a listop to a variable, it can't tell it's allowed to leave +# the parens off the listop. + +# Precedences: +# 26 [TODO] inside interpolation context ("") +# 25 left terms and list operators (leftward) +# 24 left -> +# 23 nonassoc ++ -- +# 22 right ** +# 21 right ! ~ \ and unary + and - +# 20 left =~ !~ +# 19 left * / % x +# 18 left + - . +# 17 left << >> +# 16 nonassoc named unary operators +# 15 nonassoc < > <= >= lt gt le ge +# 14 nonassoc == != <=> eq ne cmp +# 13 left & +# 12 left | ^ +# 11 left && +# 10 left || +# 9 nonassoc .. ... +# 8 right ?: +# 7 right = += -= *= etc. +# 6 left , => +# 5 nonassoc list operators (rightward) +# 4 right not +# 3 left and +# 2 left or xor +# 1 statement modifiers +# 0.5 statements, but still print scopes as do { ... } +# 0 statement level +# -1 format body + +# Nonprinting characters with special meaning: +# \cS - steal parens (see maybe_parens_unop) +# \n - newline and indent +# \t - increase indent +# \b - decrease indent ('outdent') +# \f - flush left (no indent) +# \cK - kill following semicolon, if any + +# Semicolon handling: +# - Individual statements are not deparsed with trailing semicolons. +# (If necessary, \cK is tacked on to the end.) +# - Whatever code joins statements together or emits them (lineseq, +# scopeop, deparse_root) is responsible for adding semicolons where +# necessary. +# - use statements are deparsed with trailing semicolons because they are +# immediately concatenated with the following statement. +# - indent() removes semicolons wherever it sees \cK. + + +BEGIN { for (qw[ const stringify rv2sv list glob pushmark null aelem + kvaslice kvhslice padsv + nextstate dbstate rv2av rv2hv helem custom ]) { + eval "sub OP_\U$_ () { " . opnumber($_) . "}" +}} + +# _pessimise_walk(): recursively walk the optree of a sub, +# possibly undoing optimisations along the way. + +sub _pessimise_walk { + my ($self, $startop) = @_; + + return unless $$startop; + my ($op, $prevop); + for ($op = $startop; $$op; $prevop = $op, $op = $op->sibling) { + my $ppname = $op->name; + + # pessimisations start here + + if ($ppname eq "padrange") { + # remove PADRANGE: + # the original optimisation either (1) changed this: + # pushmark -> (various pad and list and null ops) -> the_rest + # or (2), for the = @_ case, changed this: + # pushmark -> gv[_] -> rv2av -> (pad stuff) -> the_rest + # into this: + # padrange ----------------------------------------> the_rest + # so we just need to convert the padrange back into a + # pushmark, and in case (1), set its op_next to op_sibling, + # which is the head of the original chain of optimised-away + # pad ops, or for (2), set it to sibling->first, which is + # the original gv[_]. + + $B::overlay->{$$op} = { + type => OP_PUSHMARK, + name => 'pushmark', + private => ($op->private & OPpLVAL_INTRO), + }; + } + + # pessimisations end here + + if (class($op) eq 'PMOP') { + if (ref($op->pmreplroot) + && ${$op->pmreplroot} + && $op->pmreplroot->isa( 'B::OP' )) + { + $self-> _pessimise_walk($op->pmreplroot); + } + + # pessimise any /(?{...})/ code blocks + my ($re, $cv); + my $code_list = $op->code_list; + if ($$code_list) { + $self->_pessimise_walk($code_list); + } + elsif (${$re = $op->pmregexp} && ${$cv = $re->qr_anoncv}) { + $code_list = $cv->ROOT # leavesub + ->first # qr + ->code_list; # list + $self->_pessimise_walk($code_list); + } + } + + if ($op->flags & OPf_KIDS) { + $self-> _pessimise_walk($op->first); + } + + } +} + + +# _pessimise_walk_exe(): recursively walk the op_next chain of a sub, +# possibly undoing optimisations along the way. + +sub _pessimise_walk_exe { + my ($self, $startop, $visited) = @_; + + no warnings 'recursion'; + + return unless $$startop; + return if $visited->{$$startop}; + my ($op, $prevop); + for ($op = $startop; $$op; $prevop = $op, $op = $op->next) { + last if $visited->{$$op}; + $visited->{$$op} = 1; + my $ppname = $op->name; + if ($ppname =~ + /^((and|d?or)(assign)?|(map|grep)while|range|cond_expr|once)$/ + # entertry is also a logop, but its op_other invariably points + # into the same chain as the main execution path, so we skip it + ) { + $self->_pessimise_walk_exe($op->other, $visited); + } + elsif ($ppname eq "subst") { + $self->_pessimise_walk_exe($op->pmreplstart, $visited); + } + elsif ($ppname =~ /^(enter(loop|iter))$/) { + # redoop and nextop will already be covered by the main block + # of the loop + $self->_pessimise_walk_exe($op->lastop, $visited); + } + + # pessimisations start here + } +} + +# Go through an optree and "remove" some optimisations by using an +# overlay to selectively modify or un-null some ops. Deparsing in the +# absence of those optimisations is then easier. +# +# Note that older optimisations are not removed, as Deparse was already +# written to recognise them before the pessimise/overlay system was added. + +sub pessimise { + my ($self, $root, $start) = @_; + + no warnings 'recursion'; + # walk tree in root-to-branch order + $self->_pessimise_walk($root); + + my %visited; + # walk tree in execution order + $self->_pessimise_walk_exe($start, \%visited); +} + + +sub null { + my $op = shift; + return class($op) eq "NULL"; +} + + +# Add a CV to the list of subs that still need deparsing. + +sub todo { + my $self = shift; + my($cv, $is_form, $name) = @_; + my $cvfile = $cv->FILE//''; + return unless ($cvfile eq $0 || exists $self->{files}{$cvfile}); + my $seq; + if ($cv->OUTSIDE_SEQ) { + $seq = $cv->OUTSIDE_SEQ; + } elsif (!null($cv->START) and is_state($cv->START)) { + $seq = $cv->START->cop_seq; + } else { + $seq = 0; + } + my $stash = $cv->STASH; + if (class($stash) eq 'HV') { + $self->{packs}{$stash->NAME}++; + } + push @{$self->{'subs_todo'}}, [$seq, $cv, $is_form, $name]; +} + + +# Pop the next sub from the todo list and deparse it + +sub next_todo { + my $self = shift; + my $ent = shift @{$self->{'subs_todo'}}; + my ($seq, $cv, $is_form, $name) = @$ent; + + # any 'use strict; package foo' that should come before the sub + # declaration to sync with the first COP of the sub + my $pragmata = ''; + if ($cv and !null($cv->START) and is_state($cv->START)) { + $pragmata = $self->pragmata($cv->START); + } + + if (ref $name) { # lexical sub + # emit the sub. + my @text; + my $flags = $name->FLAGS; + push @text, + !$cv || $seq <= $name->COP_SEQ_RANGE_LOW + ? $self->keyword($flags & SVpad_OUR + ? "our" + : $flags & SVpad_STATE + ? "state" + : "my") . " " + : ""; + # XXX We would do $self->keyword("sub"), but ‘my CORE::sub’ + # doesn’t work and ‘my sub’ ignores a &sub in scope. I.e., + # we have a core bug here. + push @text, "sub " . substr $name->PVX, 1; + if ($cv) { + # my sub foo { } + push @text, " " . $self->deparse_sub($cv); + $text[-1] =~ s/ ;$/;/; + } + else { + # my sub foo; + push @text, ";\n"; + } + return $pragmata . join "", @text; + } + + my $gv = $cv->GV; + $name //= $self->gv_name($gv); + if ($is_form) { + return $pragmata . $self->keyword("format") . " $name =\n" + . $self->deparse_format($cv). "\n"; + } else { + my $use_dec; + if ($name eq "BEGIN") { + $use_dec = $self->begin_is_use($cv); + if (defined ($use_dec) and $self->{'expand'} < 5) { + return $pragmata if 0 == length($use_dec); + + # XXX bit of a hack: Test::More's use_ok() method + # builds a fake use statement which deparses as, e.g. + # use Net::Ping (@{$args[0];}); + # As well as being superfluous (the use_ok() is deparsed + # too) and ugly, it fails under use strict and otherwise + # makes use of a lexical var that's not in scope. + # So strip it out. + return $pragmata + if $use_dec =~ + m/ + \A + use \s \S+ \s \(\@\{ + ( + \s*\#line\ \d+\ \".*"\s* + )? + \$args\[0\];\}\); + \n + \Z + /x; + + $use_dec =~ s/^(use|no)\b/$self->keyword($1)/e; + } + } + my $l = ''; + if ($self->{'linenums'}) { + my $line = $gv->LINE; + my $file = $gv->FILE; + $l = "\n\f#line $line \"$file\"\n"; + } + my $p = ''; + my $stash; + if (class($cv->STASH) ne "SPECIAL") { + $stash = $cv->STASH->NAME; + if ($stash ne $self->{'curstash'}) { + $p = $self->keyword("package") . " $stash;\n"; + $name = "$self->{'curstash'}::$name" unless $name =~ /::/; + $self->{'curstash'} = $stash; + } + } + if ($use_dec) { + return "$pragmata$p$l$use_dec"; + } + if ( $name !~ /::/ and $self->lex_in_scope("&$name") + || $self->lex_in_scope("&$name", 1) ) + { + $name = "$self->{'curstash'}::$name"; + } elsif (defined $stash) { + $name =~ s/^\Q$stash\E::(?!\z|.*::)//; + } + my $ret = "$pragmata${p}${l}" . $self->keyword("sub") . " $name " + . $self->deparse_sub($cv); + $self->{'subs_declared'}{$name} = 1; + return $ret; + } +} + + +# Return a "use" declaration for this BEGIN block, if appropriate +sub begin_is_use { + my ($self, $cv) = @_; + my $root = $cv->ROOT; + local @$self{qw'curcv curcvlex'} = ($cv); + local $B::overlay = {}; + $self->pessimise($root, $cv->START); +#require B::Debug; +#B::walkoptree($cv->ROOT, "debug"); + my $lineseq = $root->first; + return if $lineseq->name ne "lineseq"; + + my $req_op = $lineseq->first->sibling; + return if $req_op->name ne "require"; + + # maybe it's C rather than C + return if ($req_op->first->name ne 'const'); + + my $module; + if ($req_op->first->private & OPpCONST_BARE) { + # Actually it should always be a bareword + $module = $self->const_sv($req_op->first)->PV; + $module =~ s[/][::]g; + $module =~ s/.pm$//; + } + else { + $module = $self->const($self->const_sv($req_op->first), 6); + } + + my $version; + my $version_op = $req_op->sibling; + return if class($version_op) eq "NULL"; + if ($version_op->name eq "lineseq") { + # We have a version parameter; skip nextstate & pushmark + my $constop = $version_op->first->next->next; + + return unless $self->const_sv($constop)->PV eq $module; + $constop = $constop->sibling; + $version = $self->const_sv($constop); + if (class($version) eq "IV") { + $version = $version->int_value; + } elsif (class($version) eq "NV") { + $version = $version->NV; + } elsif (class($version) ne "PVMG") { + # Includes PVIV and PVNV + $version = $version->PV; + } else { + # version specified as a v-string + $version = 'v'.join '.', map ord, split //, $version->PV; + } + $constop = $constop->sibling; + return if $constop->name ne "method_named"; + return if $self->meth_sv($constop)->PV ne "VERSION"; + } + + $lineseq = $version_op->sibling; + return if $lineseq->name ne "lineseq"; + my $entersub = $lineseq->first->sibling; + if ($entersub->name eq "stub") { + return "use $module $version ();\n" if defined $version; + return "use $module ();\n"; + } + return if $entersub->name ne "entersub"; + + # See if there are import arguments + my $args = ''; + + my $svop = $entersub->first->sibling; # Skip over pushmark + return unless $self->const_sv($svop)->PV eq $module; + + # Pull out the arguments + for ($svop=$svop->sibling; index($svop->name, "method_") != 0; + $svop = $svop->sibling) { + $args .= ", " if length($args); + $args .= $self->deparse($svop, 6); + } + + my $use = 'use'; + my $method_named = $svop; + return if $method_named->name ne "method_named"; + my $method_name = $self->meth_sv($method_named)->PV; + + if ($method_name eq "unimport") { + $use = 'no'; + } + + # Certain pragmas are dealt with using hint bits, + # so we ignore them here + if ($module eq 'strict' || $module eq 'integer' + || $module eq 'bytes' || $module eq 'warnings' + || $module eq 'feature') { + return ""; + } + + if (defined $version && length $args) { + return "$use $module $version ($args);\n"; + } elsif (defined $version) { + return "$use $module $version;\n"; + } elsif (length $args) { + return "$use $module ($args);\n"; + } else { + return "$use $module;\n"; + } +} + +sub stash_subs { + my ($self, $pack, $seen) = @_; + my (@ret, $stash); + if (!defined $pack) { + $pack = ''; + $stash = \%::; + } + else { + $pack =~ s/(::)?$/::/; + no strict 'refs'; + $stash = \%{"main::$pack"}; + } + return + if ($seen ||= {})->{ + $INC{"overload.pm"} ? overload::StrVal($stash) : $stash + }++; + my $stashobj = svref_2object($stash); + my %stash = $stashobj->ARRAY; + while (my ($key, $val) = each %stash) { + my $flags = $val->FLAGS; + if ($flags & SVf_ROK) { + # A reference. Dump this if it is a reference to a CV. If it + # is a constant acting as a proxy for a full subroutine, then + # we may or may not have to dump it. If some form of perl- + # space visible code must have created it, be it a use + # statement, or some direct symbol-table manipulation code that + # we will deparse, then we don’t want to dump it. If it is the + # result of a declaration like sub f () { 42 } then we *do* + # want to dump it. The only way to distinguish these seems + # to be the SVs_PADTMP flag on the constant, which is admit- + # tedly a hack. + my $class = class(my $referent = $val->RV); + if ($class eq "CV") { + $self->todo($referent, 0); + } elsif ( + $class !~ /^(AV|HV|CV|FM|IO|SPECIAL)\z/ + # A more robust way to write that would be this, but B does + # not provide the SVt_ constants: + # ($referent->FLAGS & B::SVTYPEMASK) < B::SVt_PVAV + and $referent->FLAGS & SVs_PADTMP + ) { + push @{$self->{'protos_todo'}}, [$pack . $key, $val]; + } + } elsif ($flags & (SVf_POK|SVf_IOK)) { + # Just a prototype. As an ugly but fairly effective way + # to find out if it belongs here is to see if the AUTOLOAD + # (if any) for the stash was defined in one of our files. + my $A = $stash{"AUTOLOAD"}; + if (defined ($A) && class($A) eq "GV" && defined($A->CV) + && class($A->CV) eq "CV") { + my $AF = $A->FILE; + next unless $AF eq $0 || exists $self->{'files'}{$AF}; + } + push @{$self->{'protos_todo'}}, + [$pack . $key, $flags & SVf_POK ? $val->PV: undef]; + } elsif (class($val) eq "GV") { + if (class(my $cv = $val->CV) ne "SPECIAL") { + next if $self->{'subs_done'}{$$val}++; + + # Ignore imposters (aliases etc) + my $name = $cv->NAME_HEK; + if(defined $name) { + # avoid using $cv->GV here because if the $val GV is + # an alias, CvGV() could upgrade the real stash entry + # from an RV to a GV + next unless $name eq $key; + next unless $$stashobj == ${$cv->STASH}; + } + else { + next if $$val != ${$cv->GV}; + } + + $self->todo($cv, 0); + } + if (class(my $cv = $val->FORM) ne "SPECIAL") { + next if $self->{'forms_done'}{$$val}++; + next if $$val != ${$cv->GV}; # Ignore imposters + $self->todo($cv, 1); + } + if (class($val->HV) ne "SPECIAL" && $key =~ /::$/) { + $self->stash_subs($pack . $key, $seen); + } + } + } +} + +sub print_protos { + my $self = shift; + my $ar; + my @ret; + foreach $ar (@{$self->{'protos_todo'}}) { + if (ref $ar->[1]) { + # Only print a constant if it occurs in the same package as a + # dumped sub. This is not perfect, but a heuristic that will + # hopefully work most of the time. Ideally we would use + # CvFILE, but a constant stub has no CvFILE. + my $pack = ($ar->[0] =~ /(.*)::/)[0]; + next if $pack and !$self->{packs}{$pack} + } + my $body = defined $ar->[1] + ? ref $ar->[1] + ? " () {\n " . $self->const($ar->[1]->RV,0) . ";\n}" + : " (". $ar->[1] . ");" + : ";"; + push @ret, "sub " . $ar->[0] . "$body\n"; + } + delete $self->{'protos_todo'}; + return @ret; +} + +sub style_opts { + my $self = shift; + my $opts = shift; + my $opt; + while (length($opt = substr($opts, 0, 1))) { + if ($opt eq "C") { + $self->{'cuddle'} = " "; + $opts = substr($opts, 1); + } elsif ($opt eq "i") { + $opts =~ s/^i(\d+)//; + $self->{'indent_size'} = $1; + } elsif ($opt eq "T") { + $self->{'use_tabs'} = 1; + $opts = substr($opts, 1); + } elsif ($opt eq "v") { + $opts =~ s/^v([^.]*)(.|$)//; + $self->{'ex_const'} = $1; + } + } +} + +sub new { + my $class = shift; + my $self = bless {}, $class; + $self->{'cuddle'} = "\n"; + $self->{'curcop'} = undef; + $self->{'curstash'} = "main"; + $self->{'ex_const'} = "'???'"; + $self->{'expand'} = 0; + $self->{'files'} = {}; + $self->{'packs'} = {}; + $self->{'indent_size'} = 4; + $self->{'linenums'} = 0; + $self->{'parens'} = 0; + $self->{'subs_todo'} = []; + $self->{'unquote'} = 0; + $self->{'use_dumper'} = 0; + $self->{'use_tabs'} = 0; + + $self->{'ambient_arybase'} = 0; + $self->{'ambient_warnings'} = undef; # Assume no lexical warnings + $self->{'ambient_hints'} = 0; + $self->{'ambient_hinthash'} = undef; + $self->init(); + + while (my $arg = shift @_) { + if ($arg eq "-d") { + $self->{'use_dumper'} = 1; + require Data::Dumper; + } elsif ($arg =~ /^-f(.*)/) { + $self->{'files'}{$1} = 1; + } elsif ($arg eq "-l") { + $self->{'linenums'} = 1; + } elsif ($arg eq "-p") { + $self->{'parens'} = 1; + } elsif ($arg eq "-P") { + $self->{'noproto'} = 1; + } elsif ($arg eq "-q") { + $self->{'unquote'} = 1; + } elsif (substr($arg, 0, 2) eq "-s") { + $self->style_opts(substr $arg, 2); + } elsif ($arg =~ /^-x(\d)$/) { + $self->{'expand'} = $1; + } + } + return $self; +} + +{ + # Mask out the bits that L uses + my $WARN_MASK; + BEGIN { + $WARN_MASK = $warnings::Bits{all} | $warnings::DeadBits{all}; + } + sub WARN_MASK () { + return $WARN_MASK; + } +} + +# Initialise the contextual information, either from +# defaults provided with the ambient_pragmas method, +# or from perl's own defaults otherwise. +sub init { + my $self = shift; + + $self->{'arybase'} = $self->{'ambient_arybase'}; + $self->{'warnings'} = defined ($self->{'ambient_warnings'}) + ? $self->{'ambient_warnings'} & WARN_MASK + : undef; + $self->{'hints'} = $self->{'ambient_hints'}; + $self->{'hinthash'} = $self->{'ambient_hinthash'}; + + # also a convenient place to clear out subs_declared + delete $self->{'subs_declared'}; +} + +sub compile { + my(@args) = @_; + return sub { + my $self = B::Deparse->new(@args); + # First deparse command-line args + if (defined $^I) { # deparse -i + print q(BEGIN { $^I = ).perlstring($^I).qq(; }\n); + } + if ($^W) { # deparse -w + print qq(BEGIN { \$^W = $^W; }\n); + } + if ($/ ne "\n" or defined $O::savebackslash) { # deparse -l and -0 + my $fs = perlstring($/) || 'undef'; + my $bs = perlstring($O::savebackslash) || 'undef'; + print qq(BEGIN { \$/ = $fs; \$\\ = $bs; }\n); + } + my @BEGINs = B::begin_av->isa("B::AV") ? B::begin_av->ARRAY : (); + my @UNITCHECKs = B::unitcheck_av->isa("B::AV") + ? B::unitcheck_av->ARRAY + : (); + my @CHECKs = B::check_av->isa("B::AV") ? B::check_av->ARRAY : (); + my @INITs = B::init_av->isa("B::AV") ? B::init_av->ARRAY : (); + my @ENDs = B::end_av->isa("B::AV") ? B::end_av->ARRAY : (); + my @names = qw(BEGIN UNITCHECK CHECK INIT END); + my @blocks = \(@BEGINs, @UNITCHECKs, @CHECKs, @INITs, @ENDs); + while (@names) { + my ($name, $blocks) = (shift @names, shift @blocks); + for my $block (@$blocks) { + $self->todo($block, 0, $name); + } + } + $self->stash_subs(); + local($SIG{"__DIE__"}) = + sub { + if ($self->{'curcop'}) { + my $cop = $self->{'curcop'}; + my($line, $file) = ($cop->line, $cop->file); + print STDERR "While deparsing $file near line $line,\n"; + } + }; + $self->{'curcv'} = main_cv; + $self->{'curcvlex'} = undef; + print $self->print_protos; + @{$self->{'subs_todo'}} = + sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}}; + my $root = main_root; + local $B::overlay = {}; + unless (null $root) { + $self->pad_subs($self->{'curcv'}); + # Check for a stub-followed-by-ex-cop, resulting from a program + # consisting solely of sub declarations. For backward-compati- + # bility (and sane output) we don’t want to emit the stub. + # leave + # enter + # stub + # ex-nextstate (or ex-dbstate) + my $kid; + if ( $root->name eq 'leave' + and ($kid = $root->first)->name eq 'enter' + and !null($kid = $kid->sibling) and $kid->name eq 'stub' + and !null($kid = $kid->sibling) and $kid->name eq 'null' + and class($kid) eq 'COP' and null $kid->sibling ) + { + # ignore + } else { + $self->pessimise($root, main_start); + print $self->indent($self->deparse_root($root)), "\n"; + } + } + my @text; + while (scalar(@{$self->{'subs_todo'}})) { + push @text, $self->next_todo; + } + print $self->indent(join("", @text)), "\n" if @text; + + # Print __DATA__ section, if necessary + no strict 'refs'; + my $laststash = defined $self->{'curcop'} + ? $self->{'curcop'}->stash->NAME : $self->{'curstash'}; + if (defined *{$laststash."::DATA"}{IO}) { + print $self->keyword("package") . " $laststash;\n" + unless $laststash eq $self->{'curstash'}; + print $self->keyword("__DATA__") . "\n"; + print readline(*{$laststash."::DATA"}); + } + } +} + +sub coderef2text { + my $self = shift; + my $sub = shift; + croak "Usage: ->coderef2text(CODEREF)" unless UNIVERSAL::isa($sub, "CODE"); + + $self->init(); + local $self->{in_coderef2text} = 1; + return $self->indent($self->deparse_sub(svref_2object($sub))); +} + +my %strict_bits = do { + local $^H; + map +($_ => strict::bits($_)), qw/refs subs vars/ +}; + +sub ambient_pragmas { + my $self = shift; + my ($arybase, $hint_bits, $warning_bits, $hinthash) = (0, 0); + + while (@_ > 1) { + my $name = shift(); + my $val = shift(); + + if ($name eq 'strict') { + require strict; + + if ($val eq 'none') { + $hint_bits &= $strict_bits{$_} for qw/refs subs vars/; + next(); + } + + my @names; + if ($val eq "all") { + @names = qw/refs subs vars/; + } + elsif (ref $val) { + @names = @$val; + } + else { + @names = split' ', $val; + } + $hint_bits |= $strict_bits{$_} for @names; + } + + elsif ($name eq '$[') { + if (OPpCONST_ARYBASE) { + $arybase = $val; + } else { + croak "\$[ can't be non-zero on this perl" unless $val == 0; + } + } + + elsif ($name eq 'integer' + || $name eq 'bytes' + || $name eq 'utf8') { + require "$name.pm"; + if ($val) { + $hint_bits |= ${$::{"${name}::"}{"hint_bits"}}; + } + else { + $hint_bits &= ~${$::{"${name}::"}{"hint_bits"}}; + } + } + + elsif ($name eq 're') { + require re; + if ($val eq 'none') { + $hint_bits &= ~re::bits(qw/taint eval/); + next(); + } + + my @names; + if ($val eq 'all') { + @names = qw/taint eval/; + } + elsif (ref $val) { + @names = @$val; + } + else { + @names = split' ',$val; + } + $hint_bits |= re::bits(@names); + } + + elsif ($name eq 'warnings') { + if ($val eq 'none') { + $warning_bits = $warnings::NONE; + next(); + } + + my @names; + if (ref $val) { + @names = @$val; + } + else { + @names = split/\s+/, $val; + } + + $warning_bits = $warnings::NONE if !defined ($warning_bits); + $warning_bits |= warnings::bits(@names); + } + + elsif ($name eq 'warning_bits') { + $warning_bits = $val; + } + + elsif ($name eq 'hint_bits') { + $hint_bits = $val; + } + + elsif ($name eq '%^H') { + $hinthash = $val; + } + + else { + croak "Unknown pragma type: $name"; + } + } + if (@_) { + croak "The ambient_pragmas method expects an even number of args"; + } + + $self->{'ambient_arybase'} = $arybase; + $self->{'ambient_warnings'} = $warning_bits; + $self->{'ambient_hints'} = $hint_bits; + $self->{'ambient_hinthash'} = $hinthash; +} + +# This method is the inner loop, so try to keep it simple +sub deparse { + my $self = shift; + my($op, $cx) = @_; + + Carp::confess("Null op in deparse") if !defined($op) + || class($op) eq "NULL"; + my $meth = "pp_" . $op->name; + return $self->$meth($op, $cx); +} + +sub indent { + my $self = shift; + my $txt = shift; + # \cK also swallows a preceding line break when followed by a + # semicolon. + $txt =~ s/\n\cK;//g; + my @lines = split(/\n/, $txt); + my $leader = ""; + my $level = 0; + my $line; + for $line (@lines) { + my $cmd = substr($line, 0, 1); + if ($cmd eq "\t" or $cmd eq "\b") { + $level += ($cmd eq "\t" ? 1 : -1) * $self->{'indent_size'}; + if ($self->{'use_tabs'}) { + $leader = "\t" x ($level / 8) . " " x ($level % 8); + } else { + $leader = " " x $level; + } + $line = substr($line, 1); + } + if (index($line, "\f") > 0) { + $line =~ s/\f/\n/; + } + if (substr($line, 0, 1) eq "\f") { + $line = substr($line, 1); # no indent + } else { + $line = $leader . $line; + } + $line =~ s/\cK;?//g; + } + return join("\n", @lines); +} + +sub pad_subs { + my ($self, $cv) = @_; + my $padlist = $cv->PADLIST; + my @names = $padlist->ARRAYelt(0)->ARRAY; + my @values = $padlist->ARRAYelt(1)->ARRAY; + my @todo; + PADENTRY: + for my $ix (0.. $#names) { for $_ ($names[$ix]) { + next if class($_) eq "SPECIAL"; + my $name = $_->PVX; + if (defined $name && $name =~ /^&./) { + my $low = $_->COP_SEQ_RANGE_LOW; + my $flags = $_->FLAGS; + my $outer = $flags & PADNAMEt_OUTER; + if ($flags & SVpad_OUR) { + push @todo, [$low, undef, 0, $_] + # [seq, no cv, not format, padname] + unless $outer; + next; + } + my $protocv = $flags & SVpad_STATE + ? $values[$ix] + : $_->PROTOCV; + if (class ($protocv) ne 'CV') { + my $flags = $flags; + my $cv = $cv; + my $name = $_; + while ($flags & PADNAMEt_OUTER && class ($protocv) ne 'CV') + { + $cv = $cv->OUTSIDE; + next PADENTRY if class($cv) eq 'SPECIAL'; # XXX freed? + my $padlist = $cv->PADLIST; + my $ix = $name->PARENT_PAD_INDEX; + $name = $padlist->NAMES->ARRAYelt($ix); + $flags = $name->FLAGS; + $protocv = $flags & SVpad_STATE + ? $padlist->ARRAYelt(1)->ARRAYelt($ix) + : $name->PROTOCV; + } + } + my $defined_in_this_sub = ${$protocv->OUTSIDE} == $$cv || do { + my $other = $protocv->PADLIST; + $$other && $other->outid == $padlist->id; + }; + if ($flags & PADNAMEt_OUTER) { + next unless $defined_in_this_sub; + push @todo, [$protocv->OUTSIDE_SEQ, $protocv, 0, $_]; + next; + } + my $outseq = $protocv->OUTSIDE_SEQ; + if ($outseq <= $low) { + # defined before its name is visible, so it’s gotta be + # declared and defined at once: my sub foo { ... } + push @todo, [$low, $protocv, 0, $_]; + } + else { + # declared and defined separately: my sub f; sub f { ... } + push @todo, [$low, undef, 0, $_]; + push @todo, [$outseq, $protocv, 0, $_] + if $defined_in_this_sub; + } + } + }} + @{$self->{'subs_todo'}} = + sort {$a->[0] <=> $b->[0]} @{$self->{'subs_todo'}}, @todo +} + + +# deparse_argops(): deparse, if possible, a sequence of argcheck + argelem +# ops into a subroutine signature. If successful, return the first op +# following the signature ops plus the signature string; else return the +# empty list. +# +# Normally a bunch of argelem ops will have been generated by the +# signature parsing, but it's possible that ops have been added manually +# or altered. In this case we return "()" and fall back to general +# deparsing of the individual sigelems as 'my $x = $_[N]' etc. +# +# We're only called if the first two ops are nextstate and argcheck. + +sub deparse_argops { + my ($self, $firstop, $cv) = @_; + + my @sig; + my $o = $firstop; + return if $o->label; #first nextstate; + + # OP_ARGCHECK + + $o = $o->sibling; + my ($params, $opt_params, $slurpy) = $o->aux_list($cv); + my $mandatory = $params - $opt_params; + my $seen_slurpy = 0; + my $last_ix = -1; + + # keep looking for valid nextstate + argelem pairs + + while (1) { + # OP_NEXTSTATE + $o = $o->sibling; + last unless $$o; + last unless $o->name =~ /^(next|db)state$/; + last if $o->label; + + # OP_ARGELEM + my $o2 = $o->sibling; + last unless $$o2; + + if ($o2->name eq 'argelem') { + my $ix = $o2->string($cv); + while (++$last_ix < $ix) { + push @sig, $last_ix < $mandatory ? '$' : '$='; + } + my $var = $self->padname($o2->targ); + if ($var =~ /^[@%]/) { + return if $seen_slurpy; + $seen_slurpy = 1; + return if $ix != $params or !$slurpy + or substr($var,0,1) ne $slurpy; + } + else { + return if $ix >= $params; + } + if ($o2->flags & OPf_KIDS) { + my $kid = $o2->first; + return unless $$kid and $kid->name eq 'argdefelem'; + my $def = $self->deparse($kid->first, 7); + $def = "($def)" if $kid->first->flags & OPf_PARENS; + $var .= " = $def"; + } + push @sig, $var; + } + elsif ($o2->name eq 'null' + and ($o2->flags & OPf_KIDS) + and $o2->first->name eq 'argdefelem') + { + # special case - a void context default expression: $ = expr + + my $defop = $o2->first; + my $ix = $defop->targ; + while (++$last_ix < $ix) { + push @sig, $last_ix < $mandatory ? '$' : '$='; + } + return if $last_ix >= $params + or $last_ix < $mandatory; + my $def = $self->deparse($defop->first, 7); + $def = "($def)" if $defop->first->flags & OPf_PARENS; + push @sig, '$ = ' . $def; + } + else { + last; + } + + $o = $o2; + } + + while (++$last_ix < $params) { + push @sig, $last_ix < $mandatory ? '$' : '$='; + } + push @sig, $slurpy if $slurpy and !$seen_slurpy; + + return ($o, join(', ', @sig)); +} + +# Deparse a sub. Returns everything except the 'sub foo', +# e.g. ($$) : method { ...; } +# or : prototype($$) lvalue ($a, $b) { ...; }; + +sub deparse_sub { + my $self = shift; + my $cv = shift; + my @attrs; + my $proto; + my $sig; + +Carp::confess("NULL in deparse_sub") if !defined($cv) || $cv->isa("B::NULL"); +Carp::confess("SPECIAL in deparse_sub") if $cv->isa("B::SPECIAL"); + local $self->{'curcop'} = $self->{'curcop'}; + + my $has_sig = $self->{hinthash}{feature_signatures}; + if ($cv->FLAGS & SVf_POK) { + my $myproto = $cv->PV; + if ($has_sig) { + push @attrs, "prototype($myproto)"; + } + else { + $proto = $myproto; + } + } + if ($cv->CvFLAGS & (CVf_METHOD|CVf_LOCKED|CVf_LVALUE|CVf_ANONCONST)) { + push @attrs, "lvalue" if $cv->CvFLAGS & CVf_LVALUE; + push @attrs, "method" if $cv->CvFLAGS & CVf_METHOD; + push @attrs, "const" if $cv->CvFLAGS & CVf_ANONCONST; + } + + local($self->{'curcv'}) = $cv; + local($self->{'curcvlex'}); + local(@$self{qw'curstash warnings hints hinthash'}) + = @$self{qw'curstash warnings hints hinthash'}; + my $body; + my $root = $cv->ROOT; + local $B::overlay = {}; + if (not null $root) { + $self->pad_subs($cv); + $self->pessimise($root, $cv->START); + my $lineseq = $root->first; + if ($lineseq->name eq "lineseq") { + my $firstop = $lineseq->first; + + if ($has_sig) { + my $o2; + # try to deparse first few ops as a signature if possible + if ( $$firstop + and $firstop->name =~ /^(next|db)state$/ + and (($o2 = $firstop->sibling)) + and $$o2) + { + if ($o2->name eq 'argcheck') { + my ($nexto, $mysig) = $self->deparse_argops($firstop, $cv); + if (defined $nexto) { + $firstop = $nexto; + $sig = $mysig; + } + } + } + } + + my @ops; + for (my $o = $firstop; $$o; $o=$o->sibling) { + push @ops, $o; + } + $body = $self->lineseq(undef, 0, @ops).";"; + if (!$has_sig and $ops[-1]->name =~ /^(next|db)state$/) { + # this handles void context in + # use feature signatures; sub ($=1) {} + $body .= "\n()"; + } + my $scope_en = $self->find_scope_en($lineseq); + if (defined $scope_en) { + my $subs = join"", $self->seq_subs($scope_en); + $body .= ";\n$subs" if length($subs); + } + } + else { + $body = $self->deparse($root->first, 0); + } + + my $l = ''; + if ($self->{'linenums'}) { + # a glob's gp_line is set from the line containing a + # sub's closing '}' if the CV is the first use of the GV. + # So make sure the linenum is set correctly for '}' + my $gv = $cv->GV; + my $line = $gv->LINE; + my $file = $gv->FILE; + $l = "\f#line $line \"$file\"\n"; + } + $body = "{\n\t$body\n$l\b}"; + } + else { + my $sv = $cv->const_sv; + if ($$sv) { + # uh-oh. inlinable sub... format it differently + $body = "{ " . $self->const($sv, 0) . " }\n"; + } else { # XSUB? (or just a declaration) + $body = ';' + } + } + $proto = defined $proto ? "($proto) " : ""; + $sig = defined $sig ? "($sig) " : ""; + my $attrs = ''; + $attrs = ': ' . join('', map "$_ ", @attrs) if @attrs; + return "$proto$attrs$sig$body\n"; +} + +sub deparse_format { + my $self = shift; + my $form = shift; + my @text; + local($self->{'curcv'}) = $form; + local($self->{'curcvlex'}); + local($self->{'in_format'}) = 1; + local(@$self{qw'curstash warnings hints hinthash'}) + = @$self{qw'curstash warnings hints hinthash'}; + my $op = $form->ROOT; + local $B::overlay = {}; + $self->pessimise($op, $form->START); + my $kid; + return "\f." if $op->first->name eq 'stub' + || $op->first->name eq 'nextstate'; + $op = $op->first->first; # skip leavewrite, lineseq + while (not null $op) { + $op = $op->sibling; # skip nextstate + my @exprs; + $kid = $op->first->sibling; # skip pushmark + push @text, "\f".$self->const_sv($kid)->PV; + $kid = $kid->sibling; + for (; not null $kid; $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, -1); + $exprs[-1] =~ s/;\z//; + } + push @text, "\f".join(", ", @exprs)."\n" if @exprs; + $op = $op->sibling; + } + return join("", @text) . "\f."; +} + +sub is_scope { + my $op = shift; + return $op->name eq "leave" || $op->name eq "scope" + || $op->name eq "lineseq" + || ($op->name eq "null" && class($op) eq "UNOP" + && (is_scope($op->first) || $op->first->name eq "enter")); +} + +sub is_state { + my $name = $_[0]->name; + return $name eq "nextstate" || $name eq "dbstate" || $name eq "setstate"; +} + +sub is_miniwhile { # check for one-line loop ('foo() while $y--') + my $op = shift; + return (!null($op) and null($op->sibling) + and $op->name eq "null" and class($op) eq "UNOP" + and (($op->first->name =~ /^(and|or)$/ + and $op->first->first->sibling->name eq "lineseq") + or ($op->first->name eq "lineseq" + and not null $op->first->first->sibling + and $op->first->first->sibling->name eq "unstack") + )); +} + +# Check if the op and its sibling are the initialization and the rest of a +# for (..;..;..) { ... } loop +sub is_for_loop { + my $op = shift; + # This OP might be almost anything, though it won't be a + # nextstate. (It's the initialization, so in the canonical case it + # will be an sassign.) The sibling is (old style) a lineseq whose + # first child is a nextstate and whose second is a leaveloop, or + # (new style) an unstack whose sibling is a leaveloop. + my $lseq = $op->sibling; + return 0 unless !is_state($op) and !null($lseq); + if ($lseq->name eq "lineseq") { + if ($lseq->first && !null($lseq->first) && is_state($lseq->first) + && (my $sib = $lseq->first->sibling)) { + return (!null($sib) && $sib->name eq "leaveloop"); + } + } elsif ($lseq->name eq "unstack" && ($lseq->flags & OPf_SPECIAL)) { + my $sib = $lseq->sibling; + return $sib && !null($sib) && $sib->name eq "leaveloop"; + } + return 0; +} + +sub is_scalar { + my $op = shift; + return ($op->name eq "rv2sv" or + $op->name eq "padsv" or + $op->name eq "gv" or # only in array/hash constructs + $op->flags & OPf_KIDS && !null($op->first) + && $op->first->name eq "gvsv"); +} + +sub maybe_parens { + my $self = shift; + my($text, $cx, $prec) = @_; + if ($prec < $cx # unary ops nest just fine + or $prec == $cx and $cx != 4 and $cx != 16 and $cx != 21 + or $self->{'parens'}) + { + $text = "($text)"; + # In a unop, let parent reuse our parens; see maybe_parens_unop + $text = "\cS" . $text if $cx == 16; + return $text; + } else { + return $text; + } +} + +# same as above, but get around the 'if it looks like a function' rule +sub maybe_parens_unop { + my $self = shift; + my($name, $kid, $cx) = @_; + if ($cx > 16 or $self->{'parens'}) { + $kid = $self->deparse($kid, 1); + if ($name eq "umask" && $kid =~ /^\d+$/) { + $kid = sprintf("%#o", $kid); + } + return $self->keyword($name) . "($kid)"; + } else { + $kid = $self->deparse($kid, 16); + if ($name eq "umask" && $kid =~ /^\d+$/) { + $kid = sprintf("%#o", $kid); + } + $name = $self->keyword($name); + if (substr($kid, 0, 1) eq "\cS") { + # use kid's parens + return $name . substr($kid, 1); + } elsif (substr($kid, 0, 1) eq "(") { + # avoid looks-like-a-function trap with extra parens + # ('+' can lead to ambiguities) + return "$name(" . $kid . ")"; + } else { + return "$name $kid"; + } + } +} + +sub maybe_parens_func { + my $self = shift; + my($func, $text, $cx, $prec) = @_; + if ($prec <= $cx or substr($text, 0, 1) eq "(" or $self->{'parens'}) { + return "$func($text)"; + } else { + return "$func $text"; + } +} + +sub find_our_type { + my ($self, $name) = @_; + $self->populate_curcvlex() if !defined $self->{'curcvlex'}; + my $seq = $self->{'curcop'} ? $self->{'curcop'}->cop_seq : 0; + for my $a (@{$self->{'curcvlex'}{"o$name"}}) { + my ($st, undef, $padname) = @$a; + if ($st >= $seq && $padname->FLAGS & SVpad_TYPED) { + return $padname->SvSTASH->NAME; + } + } + return ''; +} + +sub maybe_local { + my $self = shift; + my($op, $cx, $text) = @_; + my $name = $op->name; + my $our_intro = ($name =~ /^(?:(?:gv|rv2)[ash]v|split|refassign + |lv(?:av)?ref)$/x) + ? OPpOUR_INTRO + : 0; + my $lval_intro = $name eq 'split' ? 0 : OPpLVAL_INTRO; + # The @a in \(@a) isn't in ref context, but only when the + # parens are there. + my $need_parens = $self->{'in_refgen'} && $name =~ /[ah]v\z/ + && ($op->flags & (OPf_PARENS|OPf_REF)) == OPf_PARENS; + if ((my $priv = $op->private) & ($lval_intro|$our_intro)) { + my @our_local; + push @our_local, "local" if $priv & $lval_intro; + push @our_local, "our" if $priv & $our_intro; + my $our_local = join " ", map $self->keyword($_), @our_local; + if( $our_local[-1] eq 'our' ) { + if ( $text !~ /^\W(\w+::)*\w+\z/ + and !utf8::decode($text) || $text !~ /^\W(\w+::)*\w+\z/ + ) { + die "Unexpected our($text)\n"; + } + $text =~ s/(\w+::)+//; + + if (my $type = $self->find_our_type($text)) { + $our_local .= ' ' . $type; + } + } + return $need_parens ? "($text)" : $text + if $self->{'avoid_local'}{$$op}; + if ($need_parens) { + return "$our_local($text)"; + } elsif (want_scalar($op) || $our_local eq 'our') { + return "$our_local $text"; + } else { + return $self->maybe_parens_func("$our_local", $text, $cx, 16); + } + } else { + return $need_parens ? "($text)" : $text; + } +} + +sub maybe_targmy { + my $self = shift; + my($op, $cx, $func, @args) = @_; + if ($op->private & OPpTARGET_MY) { + my $var = $self->padname($op->targ); + my $val = $func->($self, $op, 7, @args); + return $self->maybe_parens("$var = $val", $cx, 7); + } else { + return $func->($self, $op, $cx, @args); + } +} + +sub padname_sv { + my $self = shift; + my $targ = shift; + return $self->{'curcv'}->PADLIST->ARRAYelt(0)->ARRAYelt($targ); +} + +sub maybe_my { + my $self = shift; + my($op, $cx, $text, $padname, $forbid_parens) = @_; + # The @a in \(@a) isn't in ref context, but only when the + # parens are there. + my $need_parens = !$forbid_parens && $self->{'in_refgen'} + && $op->name =~ /[ah]v\z/ + && ($op->flags & (OPf_PARENS|OPf_REF)) == OPf_PARENS; + # The @a in \my @a must not have parens. + if (!$need_parens && $self->{'in_refgen'}) { + $forbid_parens = 1; + } + if ($op->private & OPpLVAL_INTRO and not $self->{'avoid_local'}{$$op}) { + # Check $padname->FLAGS for statehood, rather than $op->private, + # because enteriter ops do not carry the flag. + my $my = + $self->keyword($padname->FLAGS & SVpad_STATE ? "state" : "my"); + if ($padname->FLAGS & SVpad_TYPED) { + $my .= ' ' . $padname->SvSTASH->NAME; + } + if ($need_parens) { + return "$my($text)"; + } elsif ($forbid_parens || want_scalar($op)) { + return "$my $text"; + } else { + return $self->maybe_parens_func($my, $text, $cx, 16); + } + } else { + return $need_parens ? "($text)" : $text; + } +} + +# The following OPs don't have functions: + +# pp_padany -- does not exist after parsing + +sub AUTOLOAD { + if ($AUTOLOAD =~ s/^.*::pp_//) { + warn "unexpected OP_". + ($_[1]->type == OP_CUSTOM ? "CUSTOM ($AUTOLOAD)" : uc $AUTOLOAD); + return "XXX"; + } else { + die "Undefined subroutine $AUTOLOAD called"; + } +} + +sub DESTROY {} # Do not AUTOLOAD + +# $root should be the op which represents the root of whatever +# we're sequencing here. If it's undefined, then we don't append +# any subroutine declarations to the deparsed ops, otherwise we +# append appropriate declarations. +sub lineseq { + my($self, $root, $cx, @ops) = @_; + my($expr, @exprs); + + my $out_cop = $self->{'curcop'}; + my $out_seq = defined($out_cop) ? $out_cop->cop_seq : undef; + my $limit_seq; + if (defined $root) { + $limit_seq = $out_seq; + my $nseq; + $nseq = $self->find_scope_st($root->sibling) if ${$root->sibling}; + $limit_seq = $nseq if !defined($limit_seq) + or defined($nseq) && $nseq < $limit_seq; + } + $limit_seq = $self->{'limit_seq'} + if defined($self->{'limit_seq'}) + && (!defined($limit_seq) || $self->{'limit_seq'} < $limit_seq); + local $self->{'limit_seq'} = $limit_seq; + + $self->walk_lineseq($root, \@ops, + sub { push @exprs, $_[0]} ); + + my $sep = $cx ? '; ' : ";\n"; + my $body = join($sep, grep {length} @exprs); + my $subs = ""; + if (defined $root && defined $limit_seq && !$self->{'in_format'}) { + $subs = join "\n", $self->seq_subs($limit_seq); + } + return join($sep, grep {length} $body, $subs); +} + +sub scopeop { + my($real_block, $self, $op, $cx) = @_; + my $kid; + my @kids; + + local(@$self{qw'curstash warnings hints hinthash'}) + = @$self{qw'curstash warnings hints hinthash'} if $real_block; + if ($real_block) { + $kid = $op->first->sibling; # skip enter + if (is_miniwhile($kid)) { + my $top = $kid->first; + my $name = $top->name; + if ($name eq "and") { + $name = $self->keyword("while"); + } elsif ($name eq "or") { + $name = $self->keyword("until"); + } else { # no conditional -> while 1 or until 0 + return $self->deparse($top->first, 1) . " " + . $self->keyword("while") . " 1"; + } + my $cond = $top->first; + my $body = $cond->sibling->first; # skip lineseq + $cond = $self->deparse($cond, 1); + $body = $self->deparse($body, 1); + return "$body $name $cond"; + } + } else { + $kid = $op->first; + } + for (; !null($kid); $kid = $kid->sibling) { + push @kids, $kid; + } + if ($cx > 0) { # inside an expression, (a do {} while for lineseq) + my $body = $self->lineseq($op, 0, @kids); + return is_lexical_subs(@kids) + ? $body + : ($self->lex_in_scope("&do") ? "CORE::do" : "do") + . " {\n\t$body\n\b}"; + } else { + my $lineseq = $self->lineseq($op, $cx, @kids); + return (length ($lineseq) ? "$lineseq;" : ""); + } +} + +sub pp_scope { scopeop(0, @_); } +sub pp_lineseq { scopeop(0, @_); } +sub pp_leave { scopeop(1, @_); } + +# This is a special case of scopeop and lineseq, for the case of the +# main_root. The difference is that we print the output statements as +# soon as we get them, for the sake of impatient users. +sub deparse_root { + my $self = shift; + my($op) = @_; + local(@$self{qw'curstash warnings hints hinthash'}) + = @$self{qw'curstash warnings hints hinthash'}; + my @kids; + return if null $op->first; # Can happen, e.g., for Bytecode without -k + for (my $kid = $op->first->sibling; !null($kid); $kid = $kid->sibling) { + push @kids, $kid; + } + $self->walk_lineseq($op, \@kids, + sub { return unless length $_[0]; + print $self->indent($_[0].';'); + print "\n" + unless $_[1] == $#kids; + }); +} + +sub walk_lineseq { + my ($self, $op, $kids, $callback) = @_; + my @kids = @$kids; + for (my $i = 0; $i < @kids; $i++) { + my $expr = ""; + if (is_state $kids[$i]) { + $expr = $self->deparse($kids[$i++], 0); + if ($i > $#kids) { + $callback->($expr, $i); + last; + } + } + if (is_for_loop($kids[$i])) { + $callback->($expr . $self->for_loop($kids[$i], 0), + $i += $kids[$i]->sibling->name eq "unstack" ? 2 : 1); + next; + } + my $expr2 = $self->deparse($kids[$i], (@kids != 1)/2); + $expr2 =~ s/^sub :(?!:)/+sub :/; # statement label otherwise + $expr .= $expr2; + $callback->($expr, $i); + } +} + +# The BEGIN {} is used here because otherwise this code isn't executed +# when you run B::Deparse on itself. +my %globalnames; +BEGIN { map($globalnames{$_}++, "SIG", "STDIN", "STDOUT", "STDERR", "INC", + "ENV", "ARGV", "ARGVOUT", "_"); } + +sub gv_name { + my $self = shift; + my $gv = shift; + my $raw = shift; +#Carp::confess() unless ref($gv) eq "B::GV"; + my $cv = $gv->FLAGS & SVf_ROK ? $gv->RV : 0; + my $stash = ($cv || $gv)->STASH->NAME; + my $name = $raw + ? $cv ? $cv->NAME_HEK || $cv->GV->NAME : $gv->NAME + : $cv + ? B::safename($cv->NAME_HEK || $cv->GV->NAME) + : $gv->SAFENAME; + if ($stash eq 'main' && $name =~ /^::/) { + $stash = '::'; + } + elsif (($stash eq 'main' + && ($globalnames{$name} || $name =~ /^[^A-Za-z_:]/)) + or ($stash eq $self->{'curstash'} && !$globalnames{$name} + && ($stash eq 'main' || $name !~ /::/)) + ) + { + $stash = ""; + } else { + $stash = $stash . "::"; + } + if (!$raw and $name =~ /^(\^..|{)/) { + $name = "{$name}"; # ${^WARNING_BITS}, etc and ${ + } + return $stash . $name; +} + +# Return the name to use for a stash variable. +# If a lexical with the same name is in scope, or +# if strictures are enabled, it may need to be +# fully-qualified. +sub stash_variable { + my ($self, $prefix, $name, $cx) = @_; + + return $prefix.$self->maybe_qualify($prefix, $name) if $name =~ /::/; + + unless ($prefix eq '$' || $prefix eq '@' || $prefix eq '&' || #' + $prefix eq '%' || $prefix eq '$#') { + return "$prefix$name"; + } + + if ($name =~ /^[^[:alpha:]_+-]$/) { + if (defined $cx && $cx == 26) { + if ($prefix eq '@') { + return "$prefix\{$name}"; + } + elsif ($name eq '#') { return '${#}' } # "${#}a" vs "$#a" + } + if ($prefix eq '$#') { + return "\$#{$name}"; + } + } + + return $prefix . $self->maybe_qualify($prefix, $name); +} + +my %unctrl = # portable to EBCDIC + ( + "\c@" => '@', # unused + "\cA" => 'A', + "\cB" => 'B', + "\cC" => 'C', + "\cD" => 'D', + "\cE" => 'E', + "\cF" => 'F', + "\cG" => 'G', + "\cH" => 'H', + "\cI" => 'I', + "\cJ" => 'J', + "\cK" => 'K', + "\cL" => 'L', + "\cM" => 'M', + "\cN" => 'N', + "\cO" => 'O', + "\cP" => 'P', + "\cQ" => 'Q', + "\cR" => 'R', + "\cS" => 'S', + "\cT" => 'T', + "\cU" => 'U', + "\cV" => 'V', + "\cW" => 'W', + "\cX" => 'X', + "\cY" => 'Y', + "\cZ" => 'Z', + "\c[" => '[', # unused + "\c\\" => '\\', # unused + "\c]" => ']', # unused + "\c_" => '_', # unused + ); + +# Return just the name, without the prefix. It may be returned as a quoted +# string. The second return value is a boolean indicating that. +sub stash_variable_name { + my($self, $prefix, $gv) = @_; + my $name = $self->gv_name($gv, 1); + $name = $self->maybe_qualify($prefix,$name); + if ($name =~ /^(?:\S|(?!\d)[\ca-\cz]?(?:\w|::)*|\d+)\z/) { + $name =~ s/^([\ca-\cz])/'^' . $unctrl{$1}/e; + $name =~ /^(\^..|{)/ and $name = "{$name}"; + return $name, 0; # not quoted + } + else { + single_delim("q", "'", $name, $self), 1; + } +} + +sub maybe_qualify { + my ($self,$prefix,$name) = @_; + my $v = ($prefix eq '$#' ? '@' : $prefix) . $name; + if ($prefix eq "") { + $name .= "::" if $name =~ /(?:\ACORE::[^:]*|::)\z/; + return $name; + } + return $name if $name =~ /::/; + return $self->{'curstash'}.'::'. $name + if + $name =~ /^(?!\d)\w/ # alphabetic + && $v !~ /^\$[ab]\z/ # not $a or $b + && $v =~ /\A[\$\@\%\&]/ # scalar, array, hash, or sub + && !$globalnames{$name} # not a global name + && $self->{hints} & $strict_bits{vars} # strict vars + && !$self->lex_in_scope($v,1) # no "our" + or $self->lex_in_scope($v); # conflicts with "my" variable + return $name; +} + +sub lex_in_scope { + my ($self, $name, $our) = @_; + substr $name, 0, 0, = $our ? 'o' : 'm'; # our/my + $self->populate_curcvlex() if !defined $self->{'curcvlex'}; + + return 0 if !defined($self->{'curcop'}); + my $seq = $self->{'curcop'}->cop_seq; + return 0 if !exists $self->{'curcvlex'}{$name}; + for my $a (@{$self->{'curcvlex'}{$name}}) { + my ($st, $en) = @$a; + return 1 if $seq > $st && $seq <= $en; + } + return 0; +} + +sub populate_curcvlex { + my $self = shift; + for (my $cv = $self->{'curcv'}; class($cv) eq "CV"; $cv = $cv->OUTSIDE) { + my $padlist = $cv->PADLIST; + # an undef CV still in lexical chain + next if class($padlist) eq "SPECIAL"; + my @padlist = $padlist->ARRAY; + my @ns = $padlist[0]->ARRAY; + + for (my $i=0; $i<@ns; ++$i) { + next if class($ns[$i]) eq "SPECIAL"; + if (class($ns[$i]) eq "PV") { + # Probably that pesky lexical @_ + next; + } + my $name = $ns[$i]->PVX; + next unless defined $name; + my ($seq_st, $seq_en) = + ($ns[$i]->FLAGS & SVf_FAKE) + ? (0, 999999) + : ($ns[$i]->COP_SEQ_RANGE_LOW, $ns[$i]->COP_SEQ_RANGE_HIGH); + + push @{$self->{'curcvlex'}{ + ($ns[$i]->FLAGS & SVpad_OUR ? 'o' : 'm') . $name + }}, [$seq_st, $seq_en, $ns[$i]]; + } + } +} + +sub find_scope_st { ((find_scope(@_))[0]); } +sub find_scope_en { ((find_scope(@_))[1]); } + +# Recurses down the tree, looking for pad variable introductions and COPs +sub find_scope { + my ($self, $op, $scope_st, $scope_en) = @_; + carp("Undefined op in find_scope") if !defined $op; + return ($scope_st, $scope_en) unless $op->flags & OPf_KIDS; + + my @queue = ($op); + while(my $op = shift @queue ) { + for (my $o=$op->first; $$o; $o=$o->sibling) { + if ($o->name =~ /^pad.v$/ && $o->private & OPpLVAL_INTRO) { + my $s = int($self->padname_sv($o->targ)->COP_SEQ_RANGE_LOW); + my $e = $self->padname_sv($o->targ)->COP_SEQ_RANGE_HIGH; + $scope_st = $s if !defined($scope_st) || $s < $scope_st; + $scope_en = $e if !defined($scope_en) || $e > $scope_en; + return ($scope_st, $scope_en); + } + elsif (is_state($o)) { + my $c = $o->cop_seq; + $scope_st = $c if !defined($scope_st) || $c < $scope_st; + $scope_en = $c if !defined($scope_en) || $c > $scope_en; + return ($scope_st, $scope_en); + } + elsif ($o->flags & OPf_KIDS) { + unshift (@queue, $o); + } + } + } + + return ($scope_st, $scope_en); +} + +# Returns a list of subs which should be inserted before the COP +sub cop_subs { + my ($self, $op, $out_seq) = @_; + my $seq = $op->cop_seq; + $seq = $out_seq if defined($out_seq) && $out_seq < $seq; + return $self->seq_subs($seq); +} + +sub seq_subs { + my ($self, $seq) = @_; + my @text; +#push @text, "# ($seq)\n"; + + return "" if !defined $seq; + my @pending; + while (scalar(@{$self->{'subs_todo'}}) + and $seq > $self->{'subs_todo'}[0][0]) { + my $cv = $self->{'subs_todo'}[0][1]; + # Skip the OUTSIDE check for lexical subs. We may be deparsing a + # cloned anon sub with lexical subs declared in it, in which case + # the OUTSIDE pointer points to the anon protosub. + my $lexical = ref $self->{'subs_todo'}[0][3]; + my $outside = !$lexical && $cv && $cv->OUTSIDE; + if (!$lexical and $cv + and ${$cv->OUTSIDE || \0} != ${$self->{'curcv'}}) + { + push @pending, shift @{$self->{'subs_todo'}}; + next; + } + push @text, $self->next_todo; + } + unshift @{$self->{'subs_todo'}}, @pending; + return @text; +} + +sub _features_from_bundle { + my ($hints, $hh) = @_; + foreach (@{$feature::feature_bundle{@feature::hint_bundles[$hints >> $feature::hint_shift]}}) { + $hh->{$feature::feature{$_}} = 1; + } + return $hh; +} + +# generate any pragmas, 'package foo' etc needed to synchronise +# with the given cop + +sub pragmata { + my $self = shift; + my($op) = @_; + + my @text; + + my $stash = $op->stashpv; + if ($stash ne $self->{'curstash'}) { + push @text, $self->keyword("package") . " $stash;\n"; + $self->{'curstash'} = $stash; + } + + if (OPpCONST_ARYBASE && $self->{'arybase'} != $op->arybase) { + push @text, '$[ = '. $op->arybase .";\n"; + $self->{'arybase'} = $op->arybase; + } + + my $warnings = $op->warnings; + my $warning_bits; + if ($warnings->isa("B::SPECIAL") && $$warnings == 4) { + $warning_bits = $warnings::Bits{"all"} & WARN_MASK; + } + elsif ($warnings->isa("B::SPECIAL") && $$warnings == 5) { + $warning_bits = $warnings::NONE; + } + elsif ($warnings->isa("B::SPECIAL")) { + $warning_bits = undef; + } + else { + $warning_bits = $warnings->PV & WARN_MASK; + } + + if (defined ($warning_bits) and + !defined($self->{warnings}) || $self->{'warnings'} ne $warning_bits) { + push @text, + $self->declare_warnings($self->{'warnings'}, $warning_bits); + $self->{'warnings'} = $warning_bits; + } + + my $hints = $op->hints; + my $old_hints = $self->{'hints'}; + if ($self->{'hints'} != $hints) { + push @text, $self->declare_hints($self->{'hints'}, $hints); + $self->{'hints'} = $hints; + } + + my $newhh; + $newhh = $op->hints_hash->HASH; + + { + # feature bundle hints + my $from = $old_hints & $feature::hint_mask; + my $to = $ hints & $feature::hint_mask; + if ($from != $to) { + if ($to == $feature::hint_mask) { + if ($self->{'hinthash'}) { + delete $self->{'hinthash'}{$_} + for grep /^feature_/, keys %{$self->{'hinthash'}}; + } + else { $self->{'hinthash'} = {} } + $self->{'hinthash'} + = _features_from_bundle($from, $self->{'hinthash'}); + } + else { + my $bundle = + $feature::hint_bundles[$to >> $feature::hint_shift]; + $bundle =~ s/(\d[13579])\z/$1+1/e; # 5.11 => 5.12 + push @text, + $self->keyword("no") . " feature ':all';\n", + $self->keyword("use") . " feature ':$bundle';\n"; + } + } + } + + { + push @text, $self->declare_hinthash( + $self->{'hinthash'}, $newhh, + $self->{indent_size}, $self->{hints}, + ); + $self->{'hinthash'} = $newhh; + } + + return join("", @text); +} + + +# Notice how subs and formats are inserted between statements here; +# also $[ assignments and pragmas. +sub pp_nextstate { + my $self = shift; + my($op, $cx) = @_; + $self->{'curcop'} = $op; + + my @text; + + my @subs = $self->cop_subs($op); + if (@subs) { + # Special marker to swallow up the semicolon + push @subs, "\cK"; + } + push @text, @subs; + + push @text, $self->pragmata($op); + + + # This should go after of any branches that add statements, to + # increase the chances that it refers to the same line it did in + # the original program. + if ($self->{'linenums'} && $cx != .5) { # $cx == .5 means in a format + push @text, "\f#line " . $op->line . + ' "' . $op->file, qq'"\n'; + } + + push @text, $op->label . ": " if $op->label; + + return join("", @text); +} + +sub declare_warnings { + my ($self, $from, $to) = @_; + $from //= ''; + my $all = (warnings::bits("all") & WARN_MASK); + unless ((($from & WARN_MASK) & ~$all) =~ /[^\0]/) { + # no FATAL bits need turning off + if ( ($to & WARN_MASK) eq $all) { + return $self->keyword("use") . " warnings;\n"; + } + elsif (($to & WARN_MASK) eq ("\0"x length($to) & WARN_MASK)) { + return $self->keyword("no") . " warnings;\n"; + } + } + + return "BEGIN {\${^WARNING_BITS} = \"" + . join("", map { sprintf("\\x%02x", ord $_) } split "", $to) + . "\"}\n\cK"; +} + +sub declare_hints { + my ($self, $from, $to) = @_; + my $use = $to & ~$from; + my $no = $from & ~$to; + my $decls = ""; + for my $pragma (hint_pragmas($use)) { + $decls .= $self->keyword("use") . " $pragma;\n"; + } + for my $pragma (hint_pragmas($no)) { + $decls .= $self->keyword("no") . " $pragma;\n"; + } + return $decls; +} + +# Internal implementation hints that the core sets automatically, so don't need +# (or want) to be passed back to the user +my %ignored_hints = ( + 'open<' => 1, + 'open>' => 1, + ':' => 1, + 'strict/refs' => 1, + 'strict/subs' => 1, + 'strict/vars' => 1, +); + +my %rev_feature; + +sub declare_hinthash { + my ($self, $from, $to, $indent, $hints) = @_; + my $doing_features = + ($hints & $feature::hint_mask) == $feature::hint_mask; + my @decls; + my @features; + my @unfeatures; # bugs? + for my $key (sort keys %$to) { + next if $ignored_hints{$key}; + my $is_feature = $key =~ /^feature_/; + next if $is_feature and not $doing_features; + if (!exists $from->{$key} or $from->{$key} ne $to->{$key}) { + push(@features, $key), next if $is_feature; + push @decls, + qq(\$^H{) . single_delim("q", "'", $key, $self) . qq(} = ) + . ( + defined $to->{$key} + ? single_delim("q", "'", $to->{$key}, $self) + : 'undef' + ) + . qq(;); + } + } + for my $key (sort keys %$from) { + next if $ignored_hints{$key}; + my $is_feature = $key =~ /^feature_/; + next if $is_feature and not $doing_features; + if (!exists $to->{$key}) { + push(@unfeatures, $key), next if $is_feature; + push @decls, qq(delete \$^H{'$key'};); + } + } + my @ret; + if (@features || @unfeatures) { + if (!%rev_feature) { %rev_feature = reverse %feature::feature } + } + if (@features) { + push @ret, $self->keyword("use") . " feature " + . join(", ", map "'$rev_feature{$_}'", @features) . ";\n"; + } + if (@unfeatures) { + push @ret, $self->keyword("no") . " feature " + . join(", ", map "'$rev_feature{$_}'", @unfeatures) + . ";\n"; + } + @decls and + push @ret, + join("\n" . (" " x $indent), "BEGIN {", @decls) . "\n}\n\cK"; + return @ret; +} + +sub hint_pragmas { + my ($bits) = @_; + my (@pragmas, @strict); + push @pragmas, "integer" if $bits & 0x1; + for (sort keys %strict_bits) { + push @strict, "'$_'" if $bits & $strict_bits{$_}; + } + if (@strict == keys %strict_bits) { + push @pragmas, "strict"; + } + elsif (@strict) { + push @pragmas, "strict " . join ', ', @strict; + } + push @pragmas, "bytes" if $bits & 0x8; + return @pragmas; +} + +sub pp_dbstate { pp_nextstate(@_) } +sub pp_setstate { pp_nextstate(@_) } + +sub pp_unstack { return "" } # see also leaveloop + +my %feature_keywords = ( + # keyword => 'feature', + state => 'state', + say => 'say', + given => 'switch', + when => 'switch', + default => 'switch', + break => 'switch', + evalbytes=>'evalbytes', + __SUB__ => '__SUB__', + fc => 'fc', +); + +# keywords that are strong and also have a prototype +# +my %strong_proto_keywords = map { $_ => 1 } qw( + pos + prototype + scalar + study + undef +); + +sub feature_enabled { + my($self,$name) = @_; + my $hh; + my $hints = $self->{hints} & $feature::hint_mask; + if ($hints && $hints != $feature::hint_mask) { + $hh = _features_from_bundle($hints); + } + elsif ($hints) { $hh = $self->{'hinthash'} } + return $hh && $hh->{"feature_$feature_keywords{$name}"} +} + +sub keyword { + my $self = shift; + my $name = shift; + return $name if $name =~ /^CORE::/; # just in case + if (exists $feature_keywords{$name}) { + return "CORE::$name" if not $self->feature_enabled($name); + } + # This sub may be called for a program that has no nextstate ops. In + # that case we may have a lexical sub named no/use/sub in scope but + # but $self->lex_in_scope will return false because it depends on the + # current nextstate op. So we need this alternate method if there is + # no current cop. + if (!$self->{'curcop'}) { + $self->populate_curcvlex() if !defined $self->{'curcvlex'}; + return "CORE::$name" if exists $self->{'curcvlex'}{"m&$name"} + || exists $self->{'curcvlex'}{"o&$name"}; + } elsif ($self->lex_in_scope("&$name") + || $self->lex_in_scope("&$name", 1)) { + return "CORE::$name"; + } + if ($strong_proto_keywords{$name} + || ($name !~ /^(?:chom?p|do|exec|glob|s(?:elect|ystem))\z/ + && !defined eval{prototype "CORE::$name"}) + ) { return $name } + if ( + exists $self->{subs_declared}{$name} + or + exists &{"$self->{curstash}::$name"} + ) { + return "CORE::$name" + } + return $name; +} + +sub baseop { + my $self = shift; + my($op, $cx, $name) = @_; + return $self->keyword($name); +} + +sub pp_stub { "()" } +sub pp_wantarray { baseop(@_, "wantarray") } +sub pp_fork { baseop(@_, "fork") } +sub pp_wait { maybe_targmy(@_, \&baseop, "wait") } +sub pp_getppid { maybe_targmy(@_, \&baseop, "getppid") } +sub pp_time { maybe_targmy(@_, \&baseop, "time") } +sub pp_tms { baseop(@_, "times") } +sub pp_ghostent { baseop(@_, "gethostent") } +sub pp_gnetent { baseop(@_, "getnetent") } +sub pp_gprotoent { baseop(@_, "getprotoent") } +sub pp_gservent { baseop(@_, "getservent") } +sub pp_ehostent { baseop(@_, "endhostent") } +sub pp_enetent { baseop(@_, "endnetent") } +sub pp_eprotoent { baseop(@_, "endprotoent") } +sub pp_eservent { baseop(@_, "endservent") } +sub pp_gpwent { baseop(@_, "getpwent") } +sub pp_spwent { baseop(@_, "setpwent") } +sub pp_epwent { baseop(@_, "endpwent") } +sub pp_ggrent { baseop(@_, "getgrent") } +sub pp_sgrent { baseop(@_, "setgrent") } +sub pp_egrent { baseop(@_, "endgrent") } +sub pp_getlogin { baseop(@_, "getlogin") } + +sub POSTFIX () { 1 } + +# I couldn't think of a good short name, but this is the category of +# symbolic unary operators with interesting precedence + +sub pfixop { + my $self = shift; + my($op, $cx, $name, $prec, $flags) = (@_, 0); + my $kid = $op->first; + $kid = $self->deparse($kid, $prec); + return $self->maybe_parens(($flags & POSTFIX) + ? "$kid$name" + # avoid confusion with filetests + : $name eq '-' + && $kid =~ /^[a-zA-Z](?!\w)/ + ? "$name($kid)" + : "$name$kid", + $cx, $prec); +} + +sub pp_preinc { pfixop(@_, "++", 23) } +sub pp_predec { pfixop(@_, "--", 23) } +sub pp_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) } +sub pp_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) } +sub pp_i_preinc { pfixop(@_, "++", 23) } +sub pp_i_predec { pfixop(@_, "--", 23) } +sub pp_i_postinc { maybe_targmy(@_, \&pfixop, "++", 23, POSTFIX) } +sub pp_i_postdec { maybe_targmy(@_, \&pfixop, "--", 23, POSTFIX) } +sub pp_complement { maybe_targmy(@_, \&pfixop, "~", 21) } +*pp_ncomplement = *pp_complement; +sub pp_scomplement { maybe_targmy(@_, \&pfixop, "~.", 21) } + +sub pp_negate { maybe_targmy(@_, \&real_negate) } +sub real_negate { + my $self = shift; + my($op, $cx) = @_; + if ($op->first->name =~ /^(i_)?negate$/) { + # avoid --$x + $self->pfixop($op, $cx, "-", 21.5); + } else { + $self->pfixop($op, $cx, "-", 21); + } +} +sub pp_i_negate { pp_negate(@_) } + +sub pp_not { + my $self = shift; + my($op, $cx) = @_; + if ($cx <= 4) { + $self->listop($op, $cx, "not", $op->first); + } else { + $self->pfixop($op, $cx, "!", 21); + } +} + +sub unop { + my $self = shift; + my($op, $cx, $name, $nollafr) = @_; + my $kid; + if ($op->flags & OPf_KIDS) { + $kid = $op->first; + if (not $name) { + # this deals with 'boolkeys' right now + return $self->deparse($kid,$cx); + } + my $builtinname = $name; + $builtinname =~ /^CORE::/ or $builtinname = "CORE::$name"; + if (defined prototype($builtinname) + && $builtinname ne 'CORE::readline' + && prototype($builtinname) =~ /^;?\*/ + && $kid->name eq "rv2gv") { + $kid = $kid->first; + } + + if ($nollafr) { + if (($kid = $self->deparse($kid, 16)) !~ s/^\cS//) { + # require foo() is a syntax error. + $kid =~ /^(?!\d)\w/ and $kid = "($kid)"; + } + return $self->maybe_parens( + $self->keyword($name) . " $kid", $cx, 16 + ); + } + return $self->maybe_parens_unop($name, $kid, $cx); + } else { + return $self->maybe_parens( + $self->keyword($name) . ($op->flags & OPf_SPECIAL ? "()" : ""), + $cx, 16, + ); + } +} + +sub pp_chop { maybe_targmy(@_, \&unop, "chop") } +sub pp_chomp { maybe_targmy(@_, \&unop, "chomp") } +sub pp_schop { maybe_targmy(@_, \&unop, "chop") } +sub pp_schomp { maybe_targmy(@_, \&unop, "chomp") } +sub pp_defined { unop(@_, "defined") } +sub pp_undef { unop(@_, "undef") } +sub pp_study { unop(@_, "study") } +sub pp_ref { unop(@_, "ref") } +sub pp_pos { maybe_local(@_, unop(@_, "pos")) } + +sub pp_sin { maybe_targmy(@_, \&unop, "sin") } +sub pp_cos { maybe_targmy(@_, \&unop, "cos") } +sub pp_rand { maybe_targmy(@_, \&unop, "rand") } +sub pp_srand { unop(@_, "srand") } +sub pp_exp { maybe_targmy(@_, \&unop, "exp") } +sub pp_log { maybe_targmy(@_, \&unop, "log") } +sub pp_sqrt { maybe_targmy(@_, \&unop, "sqrt") } +sub pp_int { maybe_targmy(@_, \&unop, "int") } +sub pp_hex { maybe_targmy(@_, \&unop, "hex") } +sub pp_oct { maybe_targmy(@_, \&unop, "oct") } +sub pp_abs { maybe_targmy(@_, \&unop, "abs") } + +sub pp_length { maybe_targmy(@_, \&unop, "length") } +sub pp_ord { maybe_targmy(@_, \&unop, "ord") } +sub pp_chr { maybe_targmy(@_, \&unop, "chr") } + +sub pp_each { unop(@_, "each") } +sub pp_values { unop(@_, "values") } +sub pp_keys { unop(@_, "keys") } +{ no strict 'refs'; *{"pp_r$_"} = *{"pp_$_"} for qw< keys each values >; } +sub pp_boolkeys { + # no name because its an optimisation op that has no keyword + unop(@_,""); +} +sub pp_aeach { unop(@_, "each") } +sub pp_avalues { unop(@_, "values") } +sub pp_akeys { unop(@_, "keys") } +sub pp_pop { unop(@_, "pop") } +sub pp_shift { unop(@_, "shift") } + +sub pp_caller { unop(@_, "caller") } +sub pp_reset { unop(@_, "reset") } +sub pp_exit { unop(@_, "exit") } +sub pp_prototype { unop(@_, "prototype") } + +sub pp_close { unop(@_, "close") } +sub pp_fileno { unop(@_, "fileno") } +sub pp_umask { unop(@_, "umask") } +sub pp_untie { unop(@_, "untie") } +sub pp_tied { unop(@_, "tied") } +sub pp_dbmclose { unop(@_, "dbmclose") } +sub pp_getc { unop(@_, "getc") } +sub pp_eof { unop(@_, "eof") } +sub pp_tell { unop(@_, "tell") } +sub pp_getsockname { unop(@_, "getsockname") } +sub pp_getpeername { unop(@_, "getpeername") } + +sub pp_chdir { + my ($self, $op, $cx) = @_; + if (($op->flags & (OPf_SPECIAL|OPf_KIDS)) == (OPf_SPECIAL|OPf_KIDS)) { + my $kw = $self->keyword("chdir"); + my $kid = $self->const_sv($op->first)->PV; + my $code = $kw + . ($cx >= 16 || $self->{'parens'} ? "($kid)" : " $kid"); + maybe_targmy(@_, sub { $_[3] }, $code); + } else { + maybe_targmy(@_, \&unop, "chdir") + } +} + +sub pp_chroot { maybe_targmy(@_, \&unop, "chroot") } +sub pp_readlink { unop(@_, "readlink") } +sub pp_rmdir { maybe_targmy(@_, \&unop, "rmdir") } +sub pp_readdir { unop(@_, "readdir") } +sub pp_telldir { unop(@_, "telldir") } +sub pp_rewinddir { unop(@_, "rewinddir") } +sub pp_closedir { unop(@_, "closedir") } +sub pp_getpgrp { maybe_targmy(@_, \&unop, "getpgrp") } +sub pp_localtime { unop(@_, "localtime") } +sub pp_gmtime { unop(@_, "gmtime") } +sub pp_alarm { unop(@_, "alarm") } +sub pp_sleep { maybe_targmy(@_, \&unop, "sleep") } + +sub pp_dofile { + my $code = unop(@_, "do", 1); # llafr does not apply + if ($code =~ s/^((?:CORE::)?do) \{/$1({/) { $code .= ')' } + $code; +} +sub pp_entereval { + unop( + @_, + $_[1]->private & OPpEVAL_BYTES ? 'evalbytes' : "eval" + ) +} + +sub pp_ghbyname { unop(@_, "gethostbyname") } +sub pp_gnbyname { unop(@_, "getnetbyname") } +sub pp_gpbyname { unop(@_, "getprotobyname") } +sub pp_shostent { unop(@_, "sethostent") } +sub pp_snetent { unop(@_, "setnetent") } +sub pp_sprotoent { unop(@_, "setprotoent") } +sub pp_sservent { unop(@_, "setservent") } +sub pp_gpwnam { unop(@_, "getpwnam") } +sub pp_gpwuid { unop(@_, "getpwuid") } +sub pp_ggrnam { unop(@_, "getgrnam") } +sub pp_ggrgid { unop(@_, "getgrgid") } + +sub pp_lock { unop(@_, "lock") } + +sub pp_continue { unop(@_, "continue"); } +sub pp_break { unop(@_, "break"); } + +sub givwhen { + my $self = shift; + my($op, $cx, $givwhen) = @_; + + my $enterop = $op->first; + my ($head, $block); + if ($enterop->flags & OPf_SPECIAL) { + $head = $self->keyword("default"); + $block = $self->deparse($enterop->first, 0); + } + else { + my $cond = $enterop->first; + my $cond_str = $self->deparse($cond, 1); + $head = "$givwhen ($cond_str)"; + $block = $self->deparse($cond->sibling, 0); + } + + return "$head {\n". + "\t$block\n". + "\b}\cK"; +} + +sub pp_leavegiven { givwhen(@_, $_[0]->keyword("given")); } +sub pp_leavewhen { givwhen(@_, $_[0]->keyword("when")); } + +sub pp_exists { + my $self = shift; + my($op, $cx) = @_; + my $arg; + my $name = $self->keyword("exists"); + if ($op->private & OPpEXISTS_SUB) { + # Checking for the existence of a subroutine + return $self->maybe_parens_func($name, + $self->pp_rv2cv($op->first, 16), $cx, 16); + } + if ($op->flags & OPf_SPECIAL) { + # Array element, not hash element + return $self->maybe_parens_func($name, + $self->pp_aelem($op->first, 16), $cx, 16); + } + return $self->maybe_parens_func($name, $self->pp_helem($op->first, 16), + $cx, 16); +} + +sub pp_delete { + my $self = shift; + my($op, $cx) = @_; + my $arg; + my $name = $self->keyword("delete"); + if ($op->private & (OPpSLICE|OPpKVSLICE)) { + if ($op->flags & OPf_SPECIAL) { + # Deleting from an array, not a hash + return $self->maybe_parens_func($name, + $self->pp_aslice($op->first, 16), + $cx, 16); + } + return $self->maybe_parens_func($name, + $self->pp_hslice($op->first, 16), + $cx, 16); + } else { + if ($op->flags & OPf_SPECIAL) { + # Deleting from an array, not a hash + return $self->maybe_parens_func($name, + $self->pp_aelem($op->first, 16), + $cx, 16); + } + return $self->maybe_parens_func($name, + $self->pp_helem($op->first, 16), + $cx, 16); + } +} + +sub pp_require { + my $self = shift; + my($op, $cx) = @_; + my $opname = $op->flags & OPf_SPECIAL ? 'CORE::require' : 'require'; + my $kid = $op->first; + if ($kid->name eq 'const') { + my $priv = $kid->private; + my $sv = $self->const_sv($kid); + my $arg; + if ($priv & OPpCONST_BARE) { + $arg = $sv->PV; + $arg =~ s[/][::]g; + $arg =~ s/\.pm//g; + } elsif ($priv & OPpCONST_NOVER) { + $opname = $self->keyword('no'); + $arg = $self->const($sv, 16); + } elsif ((my $tmp = $self->const($sv, 16)) =~ /^v/) { + $arg = $tmp; + } + if ($arg) { + return $self->maybe_parens("$opname $arg", $cx, 16); + } + } + $self->unop( + $op, $cx, + $opname, + 1, # llafr does not apply + ); +} + +sub pp_scalar { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if (not null $kid->sibling) { + # XXX Was a here-doc + return $self->dquote($op); + } + $self->unop(@_, "scalar"); +} + + +sub padval { + my $self = shift; + my $targ = shift; + return $self->{'curcv'}->PADLIST->ARRAYelt(1)->ARRAYelt($targ); +} + +sub anon_hash_or_list { + my $self = shift; + my($op, $cx) = @_; + + my($pre, $post) = @{{"anonlist" => ["[","]"], + "anonhash" => ["{","}"]}->{$op->name}}; + my($expr, @exprs); + $op = $op->first->sibling; # skip pushmark + for (; !null($op); $op = $op->sibling) { + $expr = $self->deparse($op, 6); + push @exprs, $expr; + } + if ($pre eq "{" and $cx < 1) { + # Disambiguate that it's not a block + $pre = "+{"; + } + return $pre . join(", ", @exprs) . $post; +} + +sub pp_anonlist { + my $self = shift; + my ($op, $cx) = @_; + if ($op->flags & OPf_SPECIAL) { + return $self->anon_hash_or_list($op, $cx); + } + warn "Unexpected op pp_" . $op->name() . " without OPf_SPECIAL"; + return 'XXX'; +} + +*pp_anonhash = \&pp_anonlist; + +sub pp_refgen { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "null") { + my $anoncode = $kid = $kid->first; + if ($anoncode->name eq "anonconst") { + $anoncode = $anoncode->first->first->sibling; + } + if ($anoncode->name eq "anoncode" + or !null($anoncode = $kid->sibling) and + $anoncode->name eq "anoncode") { + return $self->e_anoncode({ code => $self->padval($anoncode->targ) }); + } elsif ($kid->name eq "pushmark") { + my $sib_name = $kid->sibling->name; + if ($sib_name eq 'entersub') { + my $text = $self->deparse($kid->sibling, 1); + # Always show parens for \(&func()), but only with -p otherwise + $text = "($text)" if $self->{'parens'} + or $kid->sibling->private & OPpENTERSUB_AMPER; + return "\\$text"; + } + } + } + local $self->{'in_refgen'} = 1; + $self->pfixop($op, $cx, "\\", 20); +} + +sub e_anoncode { + my ($self, $info) = @_; + my $text = $self->deparse_sub($info->{code}); + return $self->keyword("sub") . " $text"; +} + +sub pp_srefgen { pp_refgen(@_) } + +sub pp_readline { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if (is_scalar($kid) + and $op->flags & OPf_SPECIAL + and $self->deparse($kid, 1) eq 'ARGV') + { + return '<<>>'; + } + return $self->unop($op, $cx, "readline"); +} + +sub pp_rcatline { + my $self = shift; + my($op) = @_; + return "<" . $self->gv_name($self->gv_or_padgv($op)) . ">"; +} + +# Unary operators that can occur as pseudo-listops inside double quotes +sub dq_unop { + my $self = shift; + my($op, $cx, $name, $prec, $flags) = (@_, 0, 0); + my $kid; + if ($op->flags & OPf_KIDS) { + $kid = $op->first; + # If there's more than one kid, the first is an ex-pushmark. + $kid = $kid->sibling if not null $kid->sibling; + return $self->maybe_parens_unop($name, $kid, $cx); + } else { + return $name . ($op->flags & OPf_SPECIAL ? "()" : ""); + } +} + +sub pp_ucfirst { dq_unop(@_, "ucfirst") } +sub pp_lcfirst { dq_unop(@_, "lcfirst") } +sub pp_uc { dq_unop(@_, "uc") } +sub pp_lc { dq_unop(@_, "lc") } +sub pp_quotemeta { maybe_targmy(@_, \&dq_unop, "quotemeta") } +sub pp_fc { dq_unop(@_, "fc") } + +sub loopex { + my $self = shift; + my ($op, $cx, $name) = @_; + if (class($op) eq "PVOP") { + $name .= " " . $op->pv; + } elsif (class($op) eq "OP") { + # no-op + } elsif (class($op) eq "UNOP") { + (my $kid = $self->deparse($op->first, 7)) =~ s/^\cS//; + # last foo() is a syntax error. + $kid =~ /^(?!\d)\w/ and $kid = "($kid)"; + $name .= " $kid"; + } + return $self->maybe_parens($name, $cx, 7); +} + +sub pp_last { loopex(@_, "last") } +sub pp_next { loopex(@_, "next") } +sub pp_redo { loopex(@_, "redo") } +sub pp_goto { loopex(@_, "goto") } +sub pp_dump { loopex(@_, "CORE::dump") } + +sub ftst { + my $self = shift; + my($op, $cx, $name) = @_; + if (class($op) eq "UNOP") { + # Genuine '-X' filetests are exempt from the LLAFR, but not + # l?stat() + if ($name =~ /^-/) { + (my $kid = $self->deparse($op->first, 16)) =~ s/^\cS//; + return $self->maybe_parens("$name $kid", $cx, 16); + } + return $self->maybe_parens_unop($name, $op->first, $cx); + } elsif (class($op) =~ /^(SV|PAD)OP$/) { + return $self->maybe_parens_func($name, $self->pp_gv($op, 1), $cx, 16); + } else { # I don't think baseop filetests ever survive ck_ftst, but... + return $name; + } +} + +sub pp_lstat { ftst(@_, "lstat") } +sub pp_stat { ftst(@_, "stat") } +sub pp_ftrread { ftst(@_, "-R") } +sub pp_ftrwrite { ftst(@_, "-W") } +sub pp_ftrexec { ftst(@_, "-X") } +sub pp_fteread { ftst(@_, "-r") } +sub pp_ftewrite { ftst(@_, "-w") } +sub pp_fteexec { ftst(@_, "-x") } +sub pp_ftis { ftst(@_, "-e") } +sub pp_fteowned { ftst(@_, "-O") } +sub pp_ftrowned { ftst(@_, "-o") } +sub pp_ftzero { ftst(@_, "-z") } +sub pp_ftsize { ftst(@_, "-s") } +sub pp_ftmtime { ftst(@_, "-M") } +sub pp_ftatime { ftst(@_, "-A") } +sub pp_ftctime { ftst(@_, "-C") } +sub pp_ftsock { ftst(@_, "-S") } +sub pp_ftchr { ftst(@_, "-c") } +sub pp_ftblk { ftst(@_, "-b") } +sub pp_ftfile { ftst(@_, "-f") } +sub pp_ftdir { ftst(@_, "-d") } +sub pp_ftpipe { ftst(@_, "-p") } +sub pp_ftlink { ftst(@_, "-l") } +sub pp_ftsuid { ftst(@_, "-u") } +sub pp_ftsgid { ftst(@_, "-g") } +sub pp_ftsvtx { ftst(@_, "-k") } +sub pp_fttty { ftst(@_, "-t") } +sub pp_fttext { ftst(@_, "-T") } +sub pp_ftbinary { ftst(@_, "-B") } + +sub SWAP_CHILDREN () { 1 } +sub ASSIGN () { 2 } # has OP= variant +sub LIST_CONTEXT () { 4 } # Assignment is in list context + +my(%left, %right); + +sub assoc_class { + my $op = shift; + my $name = $op->name; + if ($name eq "concat" and $op->first->name eq "concat") { + # avoid spurious '=' -- see comment in pp_concat + return "concat"; + } + if ($name eq "null" and class($op) eq "UNOP" + and $op->first->name =~ /^(and|x?or)$/ + and null $op->first->sibling) + { + # Like all conditional constructs, OP_ANDs and OP_ORs are topped + # with a null that's used as the common end point of the two + # flows of control. For precedence purposes, ignore it. + # (COND_EXPRs have these too, but we don't bother with + # their associativity). + return assoc_class($op->first); + } + return $name . ($op->flags & OPf_STACKED ? "=" : ""); +} + +# Left associative operators, like '+', for which +# $a + $b + $c is equivalent to ($a + $b) + $c + +BEGIN { + %left = ('multiply' => 19, 'i_multiply' => 19, + 'divide' => 19, 'i_divide' => 19, + 'modulo' => 19, 'i_modulo' => 19, + 'repeat' => 19, + 'add' => 18, 'i_add' => 18, + 'subtract' => 18, 'i_subtract' => 18, + 'concat' => 18, + 'left_shift' => 17, 'right_shift' => 17, + 'bit_and' => 13, 'nbit_and' => 13, 'sbit_and' => 13, + 'bit_or' => 12, 'bit_xor' => 12, + 'sbit_or' => 12, 'sbit_xor' => 12, + 'nbit_or' => 12, 'nbit_xor' => 12, + 'and' => 3, + 'or' => 2, 'xor' => 2, + ); +} + +sub deparse_binop_left { + my $self = shift; + my($op, $left, $prec) = @_; + if ($left{assoc_class($op)} && $left{assoc_class($left)} + and $left{assoc_class($op)} == $left{assoc_class($left)}) + { + return $self->deparse($left, $prec - .00001); + } else { + return $self->deparse($left, $prec); + } +} + +# Right associative operators, like '=', for which +# $a = $b = $c is equivalent to $a = ($b = $c) + +BEGIN { + %right = ('pow' => 22, + 'sassign=' => 7, 'aassign=' => 7, + 'multiply=' => 7, 'i_multiply=' => 7, + 'divide=' => 7, 'i_divide=' => 7, + 'modulo=' => 7, 'i_modulo=' => 7, + 'repeat=' => 7, 'refassign' => 7, 'refassign=' => 7, + 'add=' => 7, 'i_add=' => 7, + 'subtract=' => 7, 'i_subtract=' => 7, + 'concat=' => 7, + 'left_shift=' => 7, 'right_shift=' => 7, + 'bit_and=' => 7, 'sbit_and=' => 7, 'nbit_and=' => 7, + 'nbit_or=' => 7, 'nbit_xor=' => 7, + 'sbit_or=' => 7, 'sbit_xor=' => 7, + 'andassign' => 7, + 'orassign' => 7, + ); +} + +sub deparse_binop_right { + my $self = shift; + my($op, $right, $prec) = @_; + if ($right{assoc_class($op)} && $right{assoc_class($right)} + and $right{assoc_class($op)} == $right{assoc_class($right)}) + { + return $self->deparse($right, $prec - .00001); + } else { + return $self->deparse($right, $prec); + } +} + +sub binop { + my $self = shift; + my ($op, $cx, $opname, $prec, $flags) = (@_, 0); + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + if ($op->flags & OPf_STACKED && $flags & ASSIGN) { + $eq = "="; + $prec = 7; + } + if ($flags & SWAP_CHILDREN) { + ($left, $right) = ($right, $left); + } + my $leftop = $left; + $left = $self->deparse_binop_left($op, $left, $prec); + $left = "($left)" if $flags & LIST_CONTEXT + and $left !~ /^(my|our|local|state|)\s*[\@%\(]/ + || do { + # Parenthesize if the left argument is a + # lone repeat op. + my $left = $leftop->first->sibling; + $left->name eq 'repeat' + && null($left->sibling); + }; + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left $opname$eq $right", $cx, $prec); +} + +sub pp_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) } +sub pp_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) } +sub pp_subtract { maybe_targmy(@_, \&binop, "-",18, ASSIGN) } +sub pp_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) } +sub pp_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) } +sub pp_i_add { maybe_targmy(@_, \&binop, "+", 18, ASSIGN) } +sub pp_i_multiply { maybe_targmy(@_, \&binop, "*", 19, ASSIGN) } +sub pp_i_subtract { maybe_targmy(@_, \&binop, "-", 18, ASSIGN) } +sub pp_i_divide { maybe_targmy(@_, \&binop, "/", 19, ASSIGN) } +sub pp_i_modulo { maybe_targmy(@_, \&binop, "%", 19, ASSIGN) } +sub pp_pow { maybe_targmy(@_, \&binop, "**", 22, ASSIGN) } + +sub pp_left_shift { maybe_targmy(@_, \&binop, "<<", 17, ASSIGN) } +sub pp_right_shift { maybe_targmy(@_, \&binop, ">>", 17, ASSIGN) } +sub pp_bit_and { maybe_targmy(@_, \&binop, "&", 13, ASSIGN) } +sub pp_bit_or { maybe_targmy(@_, \&binop, "|", 12, ASSIGN) } +sub pp_bit_xor { maybe_targmy(@_, \&binop, "^", 12, ASSIGN) } +*pp_nbit_and = *pp_bit_and; +*pp_nbit_or = *pp_bit_or; +*pp_nbit_xor = *pp_bit_xor; +sub pp_sbit_and { maybe_targmy(@_, \&binop, "&.", 13, ASSIGN) } +sub pp_sbit_or { maybe_targmy(@_, \&binop, "|.", 12, ASSIGN) } +sub pp_sbit_xor { maybe_targmy(@_, \&binop, "^.", 12, ASSIGN) } + +sub pp_eq { binop(@_, "==", 14) } +sub pp_ne { binop(@_, "!=", 14) } +sub pp_lt { binop(@_, "<", 15) } +sub pp_gt { binop(@_, ">", 15) } +sub pp_ge { binop(@_, ">=", 15) } +sub pp_le { binop(@_, "<=", 15) } +sub pp_ncmp { binop(@_, "<=>", 14) } +sub pp_i_eq { binop(@_, "==", 14) } +sub pp_i_ne { binop(@_, "!=", 14) } +sub pp_i_lt { binop(@_, "<", 15) } +sub pp_i_gt { binop(@_, ">", 15) } +sub pp_i_ge { binop(@_, ">=", 15) } +sub pp_i_le { binop(@_, "<=", 15) } +sub pp_i_ncmp { maybe_targmy(@_, \&binop, "<=>", 14) } + +sub pp_seq { binop(@_, "eq", 14) } +sub pp_sne { binop(@_, "ne", 14) } +sub pp_slt { binop(@_, "lt", 15) } +sub pp_sgt { binop(@_, "gt", 15) } +sub pp_sge { binop(@_, "ge", 15) } +sub pp_sle { binop(@_, "le", 15) } +sub pp_scmp { maybe_targmy(@_, \&binop, "cmp", 14) } + +sub pp_sassign { binop(@_, "=", 7, SWAP_CHILDREN) } +sub pp_aassign { binop(@_, "=", 7, SWAP_CHILDREN | LIST_CONTEXT) } + +sub pp_smartmatch { + my ($self, $op, $cx) = @_; + if (($op->flags & OPf_SPECIAL) && $self->{expand} < 2) { + return $self->deparse($op->last, $cx); + } + else { + binop(@_, "~~", 14); + } +} + +# '.' is special because concats-of-concats are optimized to save copying +# by making all but the first concat stacked. The effect is as if the +# programmer had written '($a . $b) .= $c', except legal. +sub pp_concat { maybe_targmy(@_, \&real_concat) } +sub real_concat { + my $self = shift; + my($op, $cx) = @_; + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + my $prec = 18; + if (($op->flags & OPf_STACKED) and !($op->private & OPpCONCAT_NESTED)) { + # '.=' rather than optimised '.' + $eq = "="; + $prec = 7; + } + $left = $self->deparse_binop_left($op, $left, $prec); + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left .$eq $right", $cx, $prec); +} + +sub pp_repeat { maybe_targmy(@_, \&repeat) } + +# 'x' is weird when the left arg is a list +sub repeat { + my $self = shift; + my($op, $cx) = @_; + my $left = $op->first; + my $right = $op->last; + my $eq = ""; + my $prec = 19; + if ($op->flags & OPf_STACKED) { + $eq = "="; + $prec = 7; + } + if (null($right)) { # list repeat; count is inside left-side ex-list + # in 5.21.5 and earlier + my $kid = $left->first->sibling; # skip pushmark + my @exprs; + for (; !null($kid->sibling); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + $right = $kid; + $left = "(" . join(", ", @exprs). ")"; + } else { + my $dolist = $op->private & OPpREPEAT_DOLIST; + $left = $self->deparse_binop_left($op, $left, $dolist ? 1 : $prec); + if ($dolist) { + $left = "($left)"; + } + } + $right = $self->deparse_binop_right($op, $right, $prec); + return $self->maybe_parens("$left x$eq $right", $cx, $prec); +} + +sub range { + my $self = shift; + my ($op, $cx, $type) = @_; + my $left = $op->first; + my $right = $left->sibling; + $left = $self->deparse($left, 9); + $right = $self->deparse($right, 9); + return $self->maybe_parens("$left $type $right", $cx, 9); +} + +sub pp_flop { + my $self = shift; + my($op, $cx) = @_; + my $flip = $op->first; + my $type = ($flip->flags & OPf_SPECIAL) ? "..." : ".."; + return $self->range($flip->first, $cx, $type); +} + +# one-line while/until is handled in pp_leave + +sub logop { + my $self = shift; + my ($op, $cx, $lowop, $lowprec, $highop, $highprec, $blockname) = @_; + my $left = $op->first; + my $right = $op->first->sibling; + $blockname &&= $self->keyword($blockname); + if ($cx < 1 and is_scope($right) and $blockname + and $self->{'expand'} < 7) + { # if ($a) {$b} + $left = $self->deparse($left, 1); + $right = $self->deparse($right, 0); + return "$blockname ($left) {\n\t$right\n\b}\cK"; + } elsif ($cx < 1 and $blockname and not $self->{'parens'} + and $self->{'expand'} < 7) { # $b if $a + $right = $self->deparse($right, 1); + $left = $self->deparse($left, 1); + return "$right $blockname $left"; + } elsif ($cx > $lowprec and $highop) { # $a && $b + $left = $self->deparse_binop_left($op, $left, $highprec); + $right = $self->deparse_binop_right($op, $right, $highprec); + return $self->maybe_parens("$left $highop $right", $cx, $highprec); + } else { # $a and $b + $left = $self->deparse_binop_left($op, $left, $lowprec); + $right = $self->deparse_binop_right($op, $right, $lowprec); + return $self->maybe_parens("$left $lowop $right", $cx, $lowprec); + } +} + +sub pp_and { logop(@_, "and", 3, "&&", 11, "if") } +sub pp_or { logop(@_, "or", 2, "||", 10, "unless") } +sub pp_dor { logop(@_, "//", 10) } + +# xor is syntactically a logop, but it's really a binop (contrary to +# old versions of opcode.pl). Syntax is what matters here. +sub pp_xor { logop(@_, "xor", 2, "", 0, "") } + +sub logassignop { + my $self = shift; + my ($op, $cx, $opname) = @_; + my $left = $op->first; + my $right = $op->first->sibling->first; # skip sassign + $left = $self->deparse($left, 7); + $right = $self->deparse($right, 7); + return $self->maybe_parens("$left $opname $right", $cx, 7); +} + +sub pp_andassign { logassignop(@_, "&&=") } +sub pp_orassign { logassignop(@_, "||=") } +sub pp_dorassign { logassignop(@_, "//=") } + +sub rv2gv_or_string { + my($self,$op) = @_; + if ($op->name eq "gv") { # could be open("open") or open("###") + my($name,$quoted) = + $self->stash_variable_name("", $self->gv_or_padgv($op)); + $quoted ? $name : "*$name"; + } + else { + $self->deparse($op, 6); + } +} + +sub listop { + my $self = shift; + my($op, $cx, $name, $kid, $nollafr) = @_; + my(@exprs); + my $parens = ($cx >= 5) || $self->{'parens'}; + $kid ||= $op->first->sibling; + # If there are no arguments, add final parentheses (or parenthesize the + # whole thing if the llafr does not apply) to account for cases like + # (return)+1 or setpgrp()+1. When the llafr does not apply, we use a + # precedence of 6 (< comma), as "return, 1" does not need parentheses. + if (null $kid) { + return $nollafr + ? $self->maybe_parens($self->keyword($name), $cx, 7) + : $self->keyword($name) . '()' x (7 < $cx); + } + my $first; + my $fullname = $self->keyword($name); + my $proto = prototype("CORE::$name"); + if ( + ( (defined $proto && $proto =~ /^;?\*/) + || $name eq 'select' # select(F) doesn't have a proto + ) + && $kid->name eq "rv2gv" + && !($kid->private & OPpLVAL_INTRO) + ) { + $first = $self->rv2gv_or_string($kid->first); + } + else { + $first = $self->deparse($kid, 6); + } + if ($name eq "chmod" && $first =~ /^\d+$/) { + $first = sprintf("%#o", $first); + } + $first = "+$first" + if not $parens and not $nollafr and substr($first, 0, 1) eq "("; + push @exprs, $first; + $kid = $kid->sibling; + if (defined $proto && $proto =~ /^\*\*/ && $kid->name eq "rv2gv" + && !($kid->private & OPpLVAL_INTRO)) { + push @exprs, $first = $self->rv2gv_or_string($kid->first); + $kid = $kid->sibling; + } + for (; !null($kid); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + if ($name eq "reverse" && ($op->private & OPpREVERSE_INPLACE)) { + return "$exprs[0] = $fullname" + . ($parens ? "($exprs[0])" : " $exprs[0]"); + } + + if ($parens && $nollafr) { + return "($fullname " . join(", ", @exprs) . ")"; + } elsif ($parens) { + return "$fullname(" . join(", ", @exprs) . ")"; + } else { + return "$fullname " . join(", ", @exprs); + } +} + +sub pp_bless { listop(@_, "bless") } +sub pp_atan2 { maybe_targmy(@_, \&listop, "atan2") } +sub pp_substr { + my ($self,$op,$cx) = @_; + if ($op->private & OPpSUBSTR_REPL_FIRST) { + return + listop($self, $op, 7, "substr", $op->first->sibling->sibling) + . " = " + . $self->deparse($op->first->sibling, 7); + } + maybe_local(@_, listop(@_, "substr")) +} + +sub pp_index { + # Also handles pp_rindex. + # + # The body of this function includes an unrolled maybe_targmy(), + # since the two parts of that sub's actions need to have have the + # '== -1' bit in between + + my($self, $op, $cx) = @_; + + my $lex = ($op->private & OPpTARGET_MY); + my $bool = ($op->private & OPpTRUEBOOL); + + my $val = $self->listop($op, ($bool ? 14 : $lex ? 7 : $cx), $op->name); + + # (index() == -1) has op_eq and op_const optimised away + if ($bool) { + $val .= ($op->private & OPpINDEX_BOOLNEG) ? " == -1" : " != -1"; + $val = "($val)" if ($op->flags & OPf_PARENS); + } + if ($lex) { + my $var = $self->padname($op->targ); + $val = $self->maybe_parens("$var = $val", $cx, 7); + } + $val; +} + +sub pp_rindex { pp_index(@_); } +sub pp_vec { maybe_targmy(@_, \&maybe_local, listop(@_, "vec")) } +sub pp_sprintf { maybe_targmy(@_, \&listop, "sprintf") } +sub pp_formline { listop(@_, "formline") } # see also deparse_format +sub pp_crypt { maybe_targmy(@_, \&listop, "crypt") } +sub pp_unpack { listop(@_, "unpack") } +sub pp_pack { listop(@_, "pack") } +sub pp_join { maybe_targmy(@_, \&listop, "join") } +sub pp_splice { listop(@_, "splice") } +sub pp_push { maybe_targmy(@_, \&listop, "push") } +sub pp_unshift { maybe_targmy(@_, \&listop, "unshift") } +sub pp_reverse { listop(@_, "reverse") } +sub pp_warn { listop(@_, "warn") } +sub pp_die { listop(@_, "die") } +sub pp_return { listop(@_, "return", undef, 1) } # llafr does not apply +sub pp_open { listop(@_, "open") } +sub pp_pipe_op { listop(@_, "pipe") } +sub pp_tie { listop(@_, "tie") } +sub pp_binmode { listop(@_, "binmode") } +sub pp_dbmopen { listop(@_, "dbmopen") } +sub pp_sselect { listop(@_, "select") } +sub pp_select { listop(@_, "select") } +sub pp_read { listop(@_, "read") } +sub pp_sysopen { listop(@_, "sysopen") } +sub pp_sysseek { listop(@_, "sysseek") } +sub pp_sysread { listop(@_, "sysread") } +sub pp_syswrite { listop(@_, "syswrite") } +sub pp_send { listop(@_, "send") } +sub pp_recv { listop(@_, "recv") } +sub pp_seek { listop(@_, "seek") } +sub pp_fcntl { listop(@_, "fcntl") } +sub pp_ioctl { listop(@_, "ioctl") } +sub pp_flock { maybe_targmy(@_, \&listop, "flock") } +sub pp_socket { listop(@_, "socket") } +sub pp_sockpair { listop(@_, "socketpair") } +sub pp_bind { listop(@_, "bind") } +sub pp_connect { listop(@_, "connect") } +sub pp_listen { listop(@_, "listen") } +sub pp_accept { listop(@_, "accept") } +sub pp_shutdown { listop(@_, "shutdown") } +sub pp_gsockopt { listop(@_, "getsockopt") } +sub pp_ssockopt { listop(@_, "setsockopt") } +sub pp_chown { maybe_targmy(@_, \&listop, "chown") } +sub pp_unlink { maybe_targmy(@_, \&listop, "unlink") } +sub pp_chmod { maybe_targmy(@_, \&listop, "chmod") } +sub pp_utime { maybe_targmy(@_, \&listop, "utime") } +sub pp_rename { maybe_targmy(@_, \&listop, "rename") } +sub pp_link { maybe_targmy(@_, \&listop, "link") } +sub pp_symlink { maybe_targmy(@_, \&listop, "symlink") } +sub pp_mkdir { maybe_targmy(@_, \&listop, "mkdir") } +sub pp_open_dir { listop(@_, "opendir") } +sub pp_seekdir { listop(@_, "seekdir") } +sub pp_waitpid { maybe_targmy(@_, \&listop, "waitpid") } +sub pp_system { maybe_targmy(@_, \&indirop, "system") } +sub pp_exec { maybe_targmy(@_, \&indirop, "exec") } +sub pp_kill { maybe_targmy(@_, \&listop, "kill") } +sub pp_setpgrp { maybe_targmy(@_, \&listop, "setpgrp") } +sub pp_getpriority { maybe_targmy(@_, \&listop, "getpriority") } +sub pp_setpriority { maybe_targmy(@_, \&listop, "setpriority") } +sub pp_shmget { listop(@_, "shmget") } +sub pp_shmctl { listop(@_, "shmctl") } +sub pp_shmread { listop(@_, "shmread") } +sub pp_shmwrite { listop(@_, "shmwrite") } +sub pp_msgget { listop(@_, "msgget") } +sub pp_msgctl { listop(@_, "msgctl") } +sub pp_msgsnd { listop(@_, "msgsnd") } +sub pp_msgrcv { listop(@_, "msgrcv") } +sub pp_semget { listop(@_, "semget") } +sub pp_semctl { listop(@_, "semctl") } +sub pp_semop { listop(@_, "semop") } +sub pp_ghbyaddr { listop(@_, "gethostbyaddr") } +sub pp_gnbyaddr { listop(@_, "getnetbyaddr") } +sub pp_gpbynumber { listop(@_, "getprotobynumber") } +sub pp_gsbyname { listop(@_, "getservbyname") } +sub pp_gsbyport { listop(@_, "getservbyport") } +sub pp_syscall { listop(@_, "syscall") } + +sub pp_glob { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first->sibling; # skip pushmark + my $keyword = + $op->flags & OPf_SPECIAL ? 'glob' : $self->keyword('glob'); + my $text = $self->deparse($kid); + return $cx >= 5 || $self->{'parens'} + ? "$keyword($text)" + : "$keyword $text"; +} + +# Truncate is special because OPf_SPECIAL makes a bareword first arg +# be a filehandle. This could probably be better fixed in the core +# by moving the GV lookup into ck_truc. + +sub pp_truncate { + my $self = shift; + my($op, $cx) = @_; + my(@exprs); + my $parens = ($cx >= 5) || $self->{'parens'}; + my $kid = $op->first->sibling; + my $fh; + if ($op->flags & OPf_SPECIAL) { + # $kid is an OP_CONST + $fh = $self->const_sv($kid)->PV; + } else { + $fh = $self->deparse($kid, 6); + $fh = "+$fh" if not $parens and substr($fh, 0, 1) eq "("; + } + my $len = $self->deparse($kid->sibling, 6); + my $name = $self->keyword('truncate'); + if ($parens) { + return "$name($fh, $len)"; + } else { + return "$name $fh, $len"; + } +} + +sub indirop { + my $self = shift; + my($op, $cx, $name) = @_; + my($expr, @exprs); + my $firstkid = my $kid = $op->first->sibling; + my $indir = ""; + if ($op->flags & OPf_STACKED) { + $indir = $kid; + $indir = $indir->first; # skip rv2gv + if (is_scope($indir)) { + $indir = "{" . $self->deparse($indir, 0) . "}"; + $indir = "{;}" if $indir eq "{}"; + } elsif ($indir->name eq "const" && $indir->private & OPpCONST_BARE) { + $indir = $self->const_sv($indir)->PV; + } else { + $indir = $self->deparse($indir, 24); + } + $indir = $indir . " "; + $kid = $kid->sibling; + } + if ($name eq "sort" && $op->private & (OPpSORT_NUMERIC | OPpSORT_INTEGER)) { + $indir = ($op->private & OPpSORT_DESCEND) ? '{$b <=> $a} ' + : '{$a <=> $b} '; + } + elsif ($name eq "sort" && $op->private & OPpSORT_DESCEND) { + $indir = '{$b cmp $a} '; + } + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, !$indir && $kid == $firstkid && $name eq "sort" && $firstkid->name eq "entersub" ? 16 : 6); + push @exprs, $expr; + } + my $name2; + if ($name eq "sort" && $op->private & OPpSORT_REVERSE) { + $name2 = $self->keyword('reverse') . ' ' . $self->keyword('sort'); + } + else { $name2 = $self->keyword($name) } + if ($name eq "sort" && ($op->private & OPpSORT_INPLACE)) { + return "$exprs[0] = $name2 $indir $exprs[0]"; + } + + my $args = $indir . join(", ", @exprs); + if ($indir ne "" && $name eq "sort") { + # We don't want to say "sort(f 1, 2, 3)", since perl -w will + # give bareword warnings in that case. Therefore if context + # requires, we'll put parens around the outside "(sort f 1, 2, + # 3)". Unfortunately, we'll currently think the parens are + # necessary more often that they really are, because we don't + # distinguish which side of an assignment we're on. + if ($cx >= 5) { + return "($name2 $args)"; + } else { + return "$name2 $args"; + } + } elsif ( + !$indir && $name eq "sort" + && !null($op->first->sibling) + && $op->first->sibling->name eq 'entersub' + ) { + # We cannot say sort foo(bar), as foo will be interpreted as a + # comparison routine. We have to say sort(...) in that case. + return "$name2($args)"; + } else { + return length $args + ? $self->maybe_parens_func($name2, $args, $cx, 5) + : $name2 . '()' x (7 < $cx); + } + +} + +sub pp_prtf { indirop(@_, "printf") } +sub pp_print { indirop(@_, "print") } +sub pp_say { indirop(@_, "say") } +sub pp_sort { indirop(@_, "sort") } + +sub mapop { + my $self = shift; + my($op, $cx, $name) = @_; + my($expr, @exprs); + my $kid = $op->first; # this is the (map|grep)start + $kid = $kid->first->sibling; # skip a pushmark + my $code = $kid->first; # skip a null + if (is_scope $code) { + $code = "{" . $self->deparse($code, 0) . "} "; + } else { + $code = $self->deparse($code, 24); + $code .= ", " if !null($kid->sibling); + } + $kid = $kid->sibling; + for (; !null($kid); $kid = $kid->sibling) { + $expr = $self->deparse($kid, 6); + push @exprs, $expr if defined $expr; + } + return $self->maybe_parens_func($self->keyword($name), + $code . join(", ", @exprs), $cx, 5); +} + +sub pp_mapwhile { mapop(@_, "map") } +sub pp_grepwhile { mapop(@_, "grep") } +sub pp_mapstart { baseop(@_, "map") } +sub pp_grepstart { baseop(@_, "grep") } + +my %uses_intro; +BEGIN { + @uses_intro{ + eval { require B::Op_private } + ? @{$B::Op_private::ops_using{OPpLVAL_INTRO}} + : qw(gvsv rv2sv rv2hv rv2gv rv2av aelem helem aslice + hslice delete padsv padav padhv enteriter entersub padrange + pushmark cond_expr refassign list) + } = (); + delete @uses_intro{qw( lvref lvrefslice lvavref entersub )}; +} + + +# Look for a my/state attribute declaration in a list or ex-list. +# Returns undef if not found, 'my($x, @a) :Foo(bar)' etc otherwise. +# +# There are three basic tree structs that are expected: +# +# my $x :foo; +# <1> ex-list vK/LVINTRO ->c +# <0> ex-pushmark v ->3 +# <1> entersub[t2] vKRS*/TARG ->b +# .... +# <0> padsv[$x:64,65] vM/LVINTRO ->c +# +# my @a :foo; +# my %h :foo; +# +# <1> ex-list vK ->c +# <0> ex-pushmark v ->3 +# <0> padav[@a:64,65] vM/LVINTRO ->4 +# <1> entersub[t2] vKRS*/TARG ->c +# .... +# +# my ($x,@a,%h) :foo; +# +# <;> nextstate(main 64 -e:1) v:{ ->3 +# <@> list vKP ->w +# <0> pushmark vM/LVINTRO ->4 +# <0> padsv[$x:64,65] vM/LVINTRO ->5 +# <0> padav[@a:64,65] vM/LVINTRO ->6 +# <0> padhv[%h:64,65] vM/LVINTRO ->7 +# <1> entersub[t4] vKRS*/TARG ->f +# .... +# <1> entersub[t5] vKRS*/TARG ->n +# .... +# <1> entersub[t6] vKRS*/TARG ->v +# .... +# where the entersub in all cases looks like +# <1> entersub[t2] vKRS*/TARG ->c +# <0> pushmark s ->5 +# <$> const[PV "attributes"] sM ->6 +# <$> const[PV "main"] sM ->7 +# <1> srefgen sKM/1 ->9 +# <1> ex-list lKRM ->8 +# <0> padsv[@a:64,65] sRM ->8 +# <$> const[PV "foo"] sM ->a +# <.> method_named[PV "import"] ->b + +sub maybe_var_attr { + my ($self, $op, $cx) = @_; + + my $kid = $op->first->sibling; # skip pushmark + return if class($kid) eq 'NULL'; + + my $lop; + my $type; + + # Extract out all the pad ops and entersub ops into + # @padops and @entersubops. Return if anything else seen. + # Also determine what class (if any) all the pad vars belong to + my $class; + my $decl; # 'my' or 'state' + my (@padops, @entersubops); + for ($lop = $kid; !null($lop); $lop = $lop->sibling) { + my $lopname = $lop->name; + my $loppriv = $lop->private; + if ($lopname =~ /^pad[sah]v$/) { + return unless $loppriv & OPpLVAL_INTRO; + + my $padname = $self->padname_sv($lop->targ); + my $thisclass = ($padname->FLAGS & SVpad_TYPED) + ? $padname->SvSTASH->NAME : 'main'; + + # all pad vars must be in the same class + $class //= $thisclass; + return unless $thisclass eq $class; + + # all pad vars must be the same sort of declaration + # (all my, all state, etc) + my $this = ($loppriv & OPpPAD_STATE) ? 'state' : 'my'; + if (defined $decl) { + return unless $this eq $decl; + } + $decl = $this; + + push @padops, $lop; + } + elsif ($lopname eq 'entersub') { + push @entersubops, $lop; + } + else { + return; + } + } + + return unless @padops && @padops == @entersubops; + + # there should be a balance: each padop has a corresponding + # 'attributes'->import() method call, in the same order. + + my @varnames; + my $attr_text; + + for my $i (0..$#padops) { + my $padop = $padops[$i]; + my $esop = $entersubops[$i]; + + push @varnames, $self->padname($padop->targ); + + return unless ($esop->flags & OPf_KIDS); + + my $kid = $esop->first; + return unless $kid->type == OP_PUSHMARK; + + $kid = $kid->sibling; + return unless $$kid && $kid->type == OP_CONST; + return unless $self->const_sv($kid)->PV eq 'attributes'; + + $kid = $kid->sibling; + return unless $$kid && $kid->type == OP_CONST; # __PACKAGE__ + + $kid = $kid->sibling; + return unless $$kid + && $kid->name eq "srefgen" + && ($kid->flags & OPf_KIDS) + && ($kid->first->flags & OPf_KIDS) + && $kid->first->first->name =~ /^pad[sah]v$/ + && $kid->first->first->targ == $padop->targ; + + $kid = $kid->sibling; + my @attr; + while ($$kid) { + last if ($kid->type != OP_CONST); + push @attr, $self->const_sv($kid)->PV; + $kid = $kid->sibling; + } + return unless @attr; + my $thisattr = ":" . join(' ', @attr); + $attr_text //= $thisattr; + # all import calls must have the same list of attributes + return unless $attr_text eq $thisattr; + + return unless $kid->name eq 'method_named'; + return unless $self->meth_sv($kid)->PV eq 'import'; + + $kid = $kid->sibling; + return if $$kid; + } + + my $res = $decl; + $res .= " $class " if $class ne 'main'; + $res .= + (@varnames > 1) + ? "(" . join(', ', @varnames) . ')' + : " $varnames[0]"; + + return "$res $attr_text"; +} + + +sub pp_list { + my $self = shift; + my($op, $cx) = @_; + + { + # might be my ($s,@a,%h) :Foo(bar); + my $my_attr = maybe_var_attr($self, $op, $cx); + return $my_attr if defined $my_attr; + } + + my($expr, @exprs); + my $kid = $op->first->sibling; # skip pushmark + return '' if class($kid) eq 'NULL'; + my $lop; + my $local = "either"; # could be local(...), my(...), state(...) or our(...) + my $type; + for ($lop = $kid; !null($lop); $lop = $lop->sibling) { + my $lopname = $lop->name; + my $loppriv = $lop->private; + my $newtype; + if ($lopname =~ /^pad[ash]v$/ && $loppriv & OPpLVAL_INTRO) { + if ($loppriv & OPpPAD_STATE) { # state() + ($local = "", last) if $local !~ /^(?:either|state)$/; + $local = "state"; + } else { # my() + ($local = "", last) if $local !~ /^(?:either|my)$/; + $local = "my"; + } + my $padname = $self->padname_sv($lop->targ); + if ($padname->FLAGS & SVpad_TYPED) { + $newtype = $padname->SvSTASH->NAME; + } + } elsif ($lopname =~ /^(?:gv|rv2)([ash])v$/ + && $loppriv & OPpOUR_INTRO + or $lopname eq "null" && class($lop) eq 'UNOP' + && $lop->first->name eq "gvsv" + && $lop->first->private & OPpOUR_INTRO) { # our() + my $newlocal = "local " x !!($loppriv & OPpLVAL_INTRO) . "our"; + ($local = "", last) + if $local ne 'either' && $local ne $newlocal; + $local = $newlocal; + my $funny = !$1 || $1 eq 's' ? '$' : $1 eq 'a' ? '@' : '%'; + if (my $t = $self->find_our_type( + $funny . $self->gv_or_padgv($lop->first)->NAME + )) { + $newtype = $t; + } + } elsif ($lopname ne 'undef' + and !($loppriv & OPpLVAL_INTRO) + || !exists $uses_intro{$lopname eq 'null' + ? substr B::ppname($lop->targ), 3 + : $lopname}) + { + $local = ""; # or not + last; + } elsif ($lopname ne "undef") + { + # local() + ($local = "", last) if $local !~ /^(?:either|local)$/; + $local = "local"; + } + if (defined $type && defined $newtype && $newtype ne $type) { + $local = ''; + last; + } + $type = $newtype; + } + $local = "" if $local eq "either"; # no point if it's all undefs + $local &&= join ' ', map $self->keyword($_), split / /, $local; + $local .= " $type " if $local && length $type; + return $self->deparse($kid, $cx) if null $kid->sibling and not $local; + for (; !null($kid); $kid = $kid->sibling) { + if ($local) { + if (class($kid) eq "UNOP" and $kid->first->name eq "gvsv") { + $lop = $kid->first; + } else { + $lop = $kid; + } + $self->{'avoid_local'}{$$lop}++; + $expr = $self->deparse($kid, 6); + delete $self->{'avoid_local'}{$$lop}; + } else { + $expr = $self->deparse($kid, 6); + } + push @exprs, $expr; + } + if ($local) { + if (@exprs == 1 && ($local eq 'state' || $local eq 'CORE::state')) { + # 'state @a = ...' is legal, while 'state(@a) = ...' currently isn't + return "$local $exprs[0]"; + } + return "$local(" . join(", ", @exprs) . ")"; + } else { + return $self->maybe_parens( join(", ", @exprs), $cx, 6); + } +} + +sub is_ifelse_cont { + my $op = shift; + return ($op->name eq "null" and class($op) eq "UNOP" + and $op->first->name =~ /^(and|cond_expr)$/ + and is_scope($op->first->first->sibling)); +} + +sub pp_cond_expr { + my $self = shift; + my($op, $cx) = @_; + my $cond = $op->first; + my $true = $cond->sibling; + my $false = $true->sibling; + my $cuddle = $self->{'cuddle'}; + unless ($cx < 1 and (is_scope($true) and $true->name ne "null") and + (is_scope($false) || is_ifelse_cont($false)) + and $self->{'expand'} < 7) { + $cond = $self->deparse($cond, 8); + $true = $self->deparse($true, 6); + $false = $self->deparse($false, 8); + return $self->maybe_parens("$cond ? $true : $false", $cx, 8); + } + + $cond = $self->deparse($cond, 1); + $true = $self->deparse($true, 0); + my $head = $self->keyword("if") . " ($cond) {\n\t$true\n\b}"; + my @elsifs; + my $elsif; + while (!null($false) and is_ifelse_cont($false)) { + my $newop = $false->first; + my $newcond = $newop->first; + my $newtrue = $newcond->sibling; + $false = $newtrue->sibling; # last in chain is OP_AND => no else + if ($newcond->name eq "lineseq") + { + # lineseq to ensure correct line numbers in elsif() + # Bug #37302 fixed by change #33710. + $newcond = $newcond->first->sibling; + } + $newcond = $self->deparse($newcond, 1); + $newtrue = $self->deparse($newtrue, 0); + $elsif ||= $self->keyword("elsif"); + push @elsifs, "$elsif ($newcond) {\n\t$newtrue\n\b}"; + } + if (!null($false)) { + $false = $cuddle . $self->keyword("else") . " {\n\t" . + $self->deparse($false, 0) . "\n\b}\cK"; + } else { + $false = "\cK"; + } + return $head . join($cuddle, "", @elsifs) . $false; +} + +sub pp_once { + my ($self, $op, $cx) = @_; + my $cond = $op->first; + my $true = $cond->sibling; + + my $ret = $self->deparse($true, $cx); + $ret =~ s/^(\(?)\$/$1 . $self->keyword("state") . ' $'/e; + $ret; +} + +sub loop_common { + my $self = shift; + my($op, $cx, $init) = @_; + my $enter = $op->first; + my $kid = $enter->sibling; + local(@$self{qw'curstash warnings hints hinthash'}) + = @$self{qw'curstash warnings hints hinthash'}; + my $head = ""; + my $bare = 0; + my $body; + my $cond = undef; + my $name; + if ($kid->name eq "lineseq") { # bare or infinite loop + if ($kid->last->name eq "unstack") { # infinite + $head = "while (1) "; # Can't use for(;;) if there's a continue + $cond = ""; + } else { + $bare = 1; + } + $body = $kid; + } elsif ($enter->name eq "enteriter") { # foreach + my $ary = $enter->first->sibling; # first was pushmark + my $var = $ary->sibling; + if ($ary->name eq 'null' and $enter->private & OPpITER_REVERSED) { + # "reverse" was optimised away + $ary = listop($self, $ary->first->sibling, 1, 'reverse'); + } elsif ($enter->flags & OPf_STACKED + and not null $ary->first->sibling->sibling) + { + $ary = $self->deparse($ary->first->sibling, 9) . " .. " . + $self->deparse($ary->first->sibling->sibling, 9); + } else { + $ary = $self->deparse($ary, 1); + } + if (null $var) { + $var = $self->pp_padsv($enter, 1, 1); + } elsif ($var->name eq "rv2gv") { + $var = $self->pp_rv2sv($var, 1); + if ($enter->private & OPpOUR_INTRO) { + # our declarations don't have package names + $var =~ s/^(.).*::/$1/; + $var = "our $var"; + } + } elsif ($var->name eq "gv") { + $var = "\$" . $self->deparse($var, 1); + } else { + $var = $self->deparse($var, 1); + } + $body = $kid->first->first->sibling; # skip OP_AND and OP_ITER + if (!is_state $body->first and $body->first->name !~ /^(?:stub|leave|scope)$/) { + confess unless $var eq '$_'; + $body = $body->first; + return $self->deparse($body, 2) . " " + . $self->keyword("foreach") . " ($ary)"; + } + $head = "foreach $var ($ary) "; + } elsif ($kid->name eq "null") { # while/until + $kid = $kid->first; + $name = {"and" => "while", "or" => "until"}->{$kid->name}; + $cond = $kid->first; + $body = $kid->first->sibling; + } elsif ($kid->name eq "stub") { # bare and empty + return "{;}"; # {} could be a hashref + } + # If there isn't a continue block, then the next pointer for the loop + # will point to the unstack, which is kid's last child, except + # in a bare loop, when it will point to the leaveloop. When neither of + # these conditions hold, then the second-to-last child is the continue + # block (or the last in a bare loop). + my $cont_start = $enter->nextop; + my $cont; + my $precond; + my $postcond; + if ($$cont_start != $$op && ${$cont_start} != ${$body->last}) { + if ($bare) { + $cont = $body->last; + } else { + $cont = $body->first; + while (!null($cont->sibling->sibling)) { + $cont = $cont->sibling; + } + } + my $state = $body->first; + my $cuddle = $self->{'cuddle'}; + my @states; + for (; $$state != $$cont; $state = $state->sibling) { + push @states, $state; + } + $body = $self->lineseq(undef, 0, @states); + if (defined $cond and not is_scope $cont and $self->{'expand'} < 3) { + $precond = "for ($init; "; + $postcond = "; " . $self->deparse($cont, 1) .") "; + $cont = "\cK"; + } else { + $cont = $cuddle . "continue {\n\t" . + $self->deparse($cont, 0) . "\n\b}\cK"; + } + } else { + return "" if !defined $body; + if (length $init) { + $precond = "for ($init; "; + $postcond = ";) "; + } + $cont = "\cK"; + $body = $self->deparse($body, 0); + } + if ($precond) { # for(;;) + $cond &&= $name eq 'until' + ? listop($self, undef, 1, "not", $cond->first) + : $self->deparse($cond, 1); + $head = "$precond$cond$postcond"; + } + if ($name && !$head) { + ref $cond and $cond = $self->deparse($cond, 1); + $head = "$name ($cond) "; + } + $head =~ s/^(for(?:each)?|while|until)/$self->keyword($1)/e; + $body =~ s/;?$/;\n/; + + return $head . "{\n\t" . $body . "\b}" . $cont; +} + +sub pp_leaveloop { shift->loop_common(@_, "") } + +sub for_loop { + my $self = shift; + my($op, $cx) = @_; + my $init = $self->deparse($op, 1); + my $s = $op->sibling; + my $ll = $s->name eq "unstack" ? $s->sibling : $s->first->sibling; + return $self->loop_common($ll, $cx, $init); +} + +sub pp_leavetry { + my $self = shift; + return "eval {\n\t" . $self->pp_leave(@_) . "\n\b}"; +} + +sub _op_is_or_was { + my ($op, $expect_type) = @_; + my $type = $op->type; + return($type == $expect_type + || ($type == OP_NULL && $op->targ == $expect_type)); +} + +sub pp_null { + my($self, $op, $cx) = @_; + + # might be 'my $s :Foo(bar);' + if ($op->targ == OP_LIST) { + my $my_attr = maybe_var_attr($self, $op, $cx); + return $my_attr if defined $my_attr; + } + + if (class($op) eq "OP") { + # old value is lost + return $self->{'ex_const'} if $op->targ == OP_CONST; + } elsif (class ($op) eq "COP") { + return &pp_nextstate; + } elsif ($op->first->name eq 'pushmark' + or $op->first->name eq 'null' + && $op->first->targ == OP_PUSHMARK + && _op_is_or_was($op, OP_LIST)) { + return $self->pp_list($op, $cx); + } elsif ($op->first->name eq "enter") { + return $self->pp_leave($op, $cx); + } elsif ($op->first->name eq "leave") { + return $self->pp_leave($op->first, $cx); + } elsif ($op->first->name eq "scope") { + return $self->pp_scope($op->first, $cx); + } elsif ($op->targ == OP_STRINGIFY) { + return $self->dquote($op, $cx); + } elsif ($op->targ == OP_GLOB) { + return $self->pp_glob( + $op->first # entersub + ->first # ex-list + ->first # pushmark + ->sibling, # glob + $cx + ); + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "readline" and + $op->first->sibling->flags & OPf_STACKED) { + return $self->maybe_parens($self->deparse($op->first, 7) . " = " + . $self->deparse($op->first->sibling, 7), + $cx, 7); + } elsif (!null($op->first->sibling) and + $op->first->sibling->name =~ /^transr?\z/ and + $op->first->sibling->flags & OPf_STACKED) { + return $self->maybe_parens($self->deparse($op->first, 20) . " =~ " + . $self->deparse($op->first->sibling, 20), + $cx, 20); + } elsif ($op->flags & OPf_SPECIAL && $cx < 1 && !$op->targ) { + return ($self->lex_in_scope("&do") ? "CORE::do" : "do") + . " {\n\t". $self->deparse($op->first, $cx) ."\n\b};"; + } elsif (!null($op->first->sibling) and + $op->first->sibling->name eq "null" and + class($op->first->sibling) eq "UNOP" and + $op->first->sibling->first->flags & OPf_STACKED and + $op->first->sibling->first->name eq "rcatline") { + return $self->maybe_parens($self->deparse($op->first, 18) . " .= " + . $self->deparse($op->first->sibling, 18), + $cx, 18); + } else { + return $self->deparse($op->first, $cx); + } +} + +sub padname { + my $self = shift; + my $targ = shift; + return $self->padname_sv($targ)->PVX; +} + +sub padany { + my $self = shift; + my $op = shift; + return substr($self->padname($op->targ), 1); # skip $/@/% +} + +sub pp_padsv { + my $self = shift; + my($op, $cx, $forbid_parens) = @_; + my $targ = $op->targ; + return $self->maybe_my($op, $cx, $self->padname($targ), + $self->padname_sv($targ), + $forbid_parens); +} + +sub pp_padav { pp_padsv(@_) } + +# prepend 'keys' where its been optimised away, with suitable handling +# of CORE:: and parens + +sub add_keys_keyword { + my ($self, $str, $cx) = @_; + $str = $self->maybe_parens($str, $cx, 16); + # 'keys %h' versus 'keys(%h)' + $str = " $str" unless $str =~ /^\(/; + return $self->keyword("keys") . $str; +} + +sub pp_padhv { + my ($self, $op, $cx) = @_; + my $str = pp_padsv(@_); + # with OPpPADHV_ISKEYS the keys op is optimised away, except + # in scalar context the old op is kept (but not executed) so its targ + # can be used. + if ( ($op->private & OPpPADHV_ISKEYS) + && !(($op->flags & OPf_WANT) == OPf_WANT_SCALAR)) + { + $str = $self->add_keys_keyword($str, $cx); + } + $str; +} + +sub gv_or_padgv { + my $self = shift; + my $op = shift; + if (class($op) eq "PADOP") { + return $self->padval($op->padix); + } else { # class($op) eq "SVOP" + return $op->gv; + } +} + +sub pp_gvsv { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + return $self->maybe_local($op, $cx, $self->stash_variable("\$", + $self->gv_name($gv), $cx)); +} + +sub pp_gv { + my $self = shift; + my($op, $cx) = @_; + my $gv = $self->gv_or_padgv($op); + return $self->maybe_qualify("", $self->gv_name($gv)); +} + +sub pp_aelemfast_lex { + my $self = shift; + my($op, $cx) = @_; + my $name = $self->padname($op->targ); + $name =~ s/^@/\$/; + my $i = $op->private; + $i -= 256 if $i > 127; + return $name . "[" . ($i + $self->{'arybase'}) . "]"; +} + +sub pp_aelemfast { + my $self = shift; + my($op, $cx) = @_; + # optimised PADAV, pre 5.15 + return $self->pp_aelemfast_lex(@_) if ($op->flags & OPf_SPECIAL); + + my $gv = $self->gv_or_padgv($op); + my($name,$quoted) = $self->stash_variable_name('@',$gv); + $name = $quoted ? "$name->" : '$' . $name; + my $i = $op->private; + $i -= 256 if $i > 127; + return $name . "[" . ($i + $self->{'arybase'}) . "]"; +} + +sub rv2x { + my $self = shift; + my($op, $cx, $type) = @_; + + if (class($op) eq 'NULL' || !$op->can("first")) { + carp("Unexpected op in pp_rv2x"); + return 'XXX'; + } + my $kid = $op->first; + if ($kid->name eq "gv") { + return $self->stash_variable($type, + $self->gv_name($self->gv_or_padgv($kid)), $cx); + } elsif (is_scalar $kid) { + my $str = $self->deparse($kid, 0); + if ($str =~ /^\$([^\w\d])\z/) { + # "$$+" isn't a legal way to write the scalar dereference + # of $+, since the lexer can't tell you aren't trying to + # do something like "$$ + 1" to get one more than your + # PID. Either "${$+}" or "$${+}" are workable + # disambiguations, but if the programmer did the former, + # they'd be in the "else" clause below rather than here. + # It's not clear if this should somehow be unified with + # the code in dq and re_dq that also adds lexer + # disambiguation braces. + $str = '$' . "{$1}"; #' + } + return $type . $str; + } else { + return $type . "{" . $self->deparse($kid, 0) . "}"; + } +} + +sub pp_rv2sv { maybe_local(@_, rv2x(@_, "\$")) } +sub pp_rv2gv { maybe_local(@_, rv2x(@_, "*")) } + +sub pp_rv2hv { + my ($self, $op, $cx) = @_; + my $str = rv2x(@_, "%"); + if ($op->private & OPpRV2HV_ISKEYS) { + $str = $self->add_keys_keyword($str, $cx); + } + return maybe_local(@_, $str); +} + +# skip rv2av +sub pp_av2arylen { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "padav") { + return $self->maybe_local($op, $cx, '$#' . $self->padany($kid)); + } else { + my $kkid; + if ( $kid->name eq "rv2av" + && ($kkid = $kid->first) + && $kkid->name !~ /^(scope|leave|gv)$/) + { + # handle (expr)->$#* postfix form + my $expr; + $expr = $self->deparse($kkid, 24); # 24 is '->' + $expr = "$expr->\$#*"; + # XXX maybe_local is probably wrong here: local($#-expression) + # doesn't "do" local (the is no INTRO flag set) + return $self->maybe_local($op, $cx, $expr); + } + else { + # handle $#{expr} form + # XXX see maybe_local comment above + return $self->maybe_local($op, $cx, $self->rv2x($kid, $cx, '$#')); + } + } +} + +# skip down to the old, ex-rv2cv +sub pp_rv2cv { + my ($self, $op, $cx) = @_; + if (!null($op->first) && $op->first->name eq 'null' && + $op->first->targ == OP_LIST) + { + return $self->rv2x($op->first->first->sibling, $cx, "&") + } + else { + return $self->rv2x($op, $cx, "") + } +} + +sub list_const { + my $self = shift; + my($cx, @list) = @_; + my @a = map $self->const($_, 6), @list; + if (@a == 0) { + return "()"; + } elsif (@a == 1) { + return $a[0]; + } elsif ( @a > 2 and !grep(!/^-?\d+$/, @a)) { + # collapse (-1,0,1,2) into (-1..2) + my ($s, $e) = @a[0,-1]; + my $i = $s; + return $self->maybe_parens("$s..$e", $cx, 9) + unless grep $i++ != $_, @a; + } + return $self->maybe_parens(join(", ", @a), $cx, 6); +} + +sub pp_rv2av { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + if ($kid->name eq "const") { # constant list + my $av = $self->const_sv($kid); + return $self->list_const($cx, $av->ARRAY); + } else { + return $self->maybe_local($op, $cx, $self->rv2x($op, $cx, "\@")); + } + } + +sub is_subscriptable { + my $op = shift; + if ($op->name =~ /^([ahg]elem|multideref$)/) { + return 1; + } elsif ($op->name eq "entersub") { + my $kid = $op->first; + return 0 unless null $kid->sibling; + $kid = $kid->first; + $kid = $kid->sibling until null $kid->sibling; + return 0 if is_scope($kid); + $kid = $kid->first; + return 0 if $kid->name eq "gv" || $kid->name eq "padcv"; + return 0 if is_scalar($kid); + return is_subscriptable($kid); + } else { + return 0; + } +} + +sub elem_or_slice_array_name +{ + my $self = shift; + my ($array, $left, $padname, $allow_arrow) = @_; + + if ($array->name eq $padname) { + return $self->padany($array); + } elsif (is_scope($array)) { # ${expr}[0] + return "{" . $self->deparse($array, 0) . "}"; + } elsif ($array->name eq "gv") { + ($array, my $quoted) = + $self->stash_variable_name( + $left eq '[' ? '@' : '%', $self->gv_or_padgv($array) + ); + if (!$allow_arrow && $quoted) { + # This cannot happen. + die "Invalid variable name $array for slice"; + } + return $quoted ? "$array->" : $array; + } elsif (!$allow_arrow || is_scalar $array) { # $x[0], $$x[0], ... + return $self->deparse($array, 24); + } else { + return undef; + } +} + +sub elem_or_slice_single_index +{ + my $self = shift; + my ($idx) = @_; + + $idx = $self->deparse($idx, 1); + + # Outer parens in an array index will confuse perl + # if we're interpolating in a regular expression, i.e. + # /$x$foo[(-1)]/ is *not* the same as /$x$foo[-1]/ + # + # If $self->{parens}, then an initial '(' will + # definitely be paired with a final ')'. If + # !$self->{parens}, the misleading parens won't + # have been added in the first place. + # + # [You might think that we could get "(...)...(...)" + # where the initial and final parens do not match + # each other. But we can't, because the above would + # only happen if there's an infix binop between the + # two pairs of parens, and *that* means that the whole + # expression would be parenthesized as well.] + # + $idx =~ s/^\((.*)\)$/$1/ if $self->{'parens'}; + + # Hash-element braces will autoquote a bareword inside themselves. + # We need to make sure that C<$hash{warn()}> doesn't come out as + # C<$hash{warn}>, which has a quite different meaning. Currently + # B::Deparse will always quote strings, even if the string was a + # bareword in the original (i.e. the OPpCONST_BARE flag is ignored + # for constant strings.) So we can cheat slightly here - if we see + # a bareword, we know that it is supposed to be a function call. + # + $idx =~ s/^([A-Za-z_]\w*)$/$1()/; + + return $idx; +} + +sub elem { + my $self = shift; + my ($op, $cx, $left, $right, $padname) = @_; + my($array, $idx) = ($op->first, $op->first->sibling); + + $idx = $self->elem_or_slice_single_index($idx); + + unless ($array->name eq $padname) { # Maybe this has been fixed + $array = $array->first; # skip rv2av (or ex-rv2av in _53+) + } + if (my $array_name=$self->elem_or_slice_array_name + ($array, $left, $padname, 1)) { + return ($array_name =~ /->\z/ + ? $array_name + : $array_name eq '#' ? '${#}' : "\$" . $array_name) + . $left . $idx . $right; + } else { + # $x[20][3]{hi} or expr->[20] + my $arrow = is_subscriptable($array) ? "" : "->"; + return $self->deparse($array, 24) . $arrow . $left . $idx . $right; + } + +} + +# a simplified version of elem_or_slice_array_name() +# for the use of pp_multideref + +sub multideref_var_name { + my $self = shift; + my ($gv, $is_hash) = @_; + + my ($name, $quoted) = + $self->stash_variable_name( $is_hash ? '%' : '@', $gv); + return $quoted ? "$name->" + : $name eq '#' + ? '${#}' # avoid ${#}[1] => $#[1] + : '$' . $name; +} + + +# deparse an OP_MULTICONCAT. If $in_dq is 1, we're within +# a double-quoted string, so for example. +# "abc\Qdef$x\Ebar" +# might get compiled as +# multiconcat("abc", metaquote(multiconcat("def", $x)), "bar") +# and the inner multiconcat should be deparsed as C rather than +# the normal C +# Ditto if $in_dq is 2, handle qr/...\Qdef$x\E.../. + +sub do_multiconcat { + my $self = shift; + my($op, $cx, $in_dq) = @_; + + my $kid; + my @kids; + my $assign; + my $append; + my $lhs = ""; + + for ($kid = $op->first; !null $kid; $kid = $kid->sibling) { + # skip the consts and/or padsv we've optimised away + push @kids, $kid + unless $kid->type == OP_NULL + && ( $kid->targ == OP_PADSV + || $kid->targ == OP_CONST + || $kid->targ == OP_PUSHMARK); + } + + $append = ($op->private & OPpMULTICONCAT_APPEND); + + if ($op->private & OPpTARGET_MY) { + # '$lex = ...' or '$lex .= ....' or 'my $lex = ' + $lhs = $self->padname($op->targ); + $lhs = "my $lhs" if ($op->private & OPpLVAL_INTRO); + $assign = 1; + } + elsif ($op->flags & OPf_STACKED) { + # 'expr = ...' or 'expr .= ....' + my $expr = $append ? shift(@kids) : pop(@kids); + $lhs = $self->deparse($expr, 7); + $assign = 1; + } + + if ($assign) { + $lhs .= $append ? ' .= ' : ' = '; + } + + my ($nargs, $const_str, @const_lens) = $op->aux_list($self->{curcv}); + + my @consts; + my $i = 0; + for (@const_lens) { + if ($_ == -1) { + push @consts, undef; + } + else { + push @consts, substr($const_str, $i, $_); + my @args; + $i += $_; + } + } + + my $rhs = ""; + + if ( $in_dq + || (($op->private & OPpMULTICONCAT_STRINGIFY) && !$self->{'unquote'})) + { + # "foo=$foo bar=$bar " + my $not_first; + while (@consts) { + if ($not_first) { + my $s = $self->dq(shift(@kids), 18); + # don't deparse "a${$}b" as "a$$b" + $s = '${$}' if $s eq '$$'; + $rhs = dq_disambiguate($rhs, $s); + } + $not_first = 1; + my $c = shift @consts; + if (defined $c) { + if ($in_dq == 2) { + # in pattern: don't convert newline to '\n' etc etc + my $s = re_uninterp(escape_re(re_unback($c))); + $rhs = re_dq_disambiguate($rhs, $s) + } + else { + my $s = uninterp(escape_str(unback($c))); + $rhs = dq_disambiguate($rhs, $s) + } + } + } + return $rhs if $in_dq; + $rhs = single_delim("qq", '"', $rhs, $self); + } + elsif ($op->private & OPpMULTICONCAT_FAKE) { + # sprintf("foo=%s bar=%s ", $foo, $bar) + + my @all; + @consts = map { $_ //= ''; s/%/%%/g; $_ } @consts; + my $fmt = join '%s', @consts; + push @all, $self->quoted_const_str($fmt); + + # the following is a stripped down copy of sub listop {} + my $parens = $assign || ($cx >= 5) || $self->{'parens'}; + my $fullname = $self->keyword('sprintf'); + push @all, map $self->deparse($_, 6), @kids; + + $rhs = $parens + ? "$fullname(" . join(", ", @all) . ")" + : "$fullname " . join(", ", @all); + } + else { + # "foo=" . $foo . " bar=" . $bar + my @all; + my $not_first; + while (@consts) { + push @all, $self->deparse(shift(@kids), 18) if $not_first; + $not_first = 1; + my $c = shift @consts; + if (defined $c) { + push @all, $self->quoted_const_str($c); + } + } + $rhs .= join ' . ', @all; + } + + my $text = $lhs . $rhs; + + $text = "($text)" if ($cx >= (($assign) ? 7 : 18+1)) + || $self->{'parens'}; + + return $text; +} + + +sub pp_multiconcat { + my $self = shift; + $self->do_multiconcat(@_, 0); +} + + +sub pp_multideref { + my $self = shift; + my($op, $cx) = @_; + my $text = ""; + + if ($op->private & OPpMULTIDEREF_EXISTS) { + $text = $self->keyword("exists"). " "; + } + elsif ($op->private & OPpMULTIDEREF_DELETE) { + $text = $self->keyword("delete"). " "; + } + elsif ($op->private & OPpLVAL_INTRO) { + $text = $self->keyword("local"). " "; + } + + if ($op->first && ($op->first->flags & OPf_KIDS)) { + # arbitrary initial expression, e.g. f(1,2,3)->[...] + my $expr = $self->deparse($op->first, 24); + # stop "exists (expr)->{...}" being interpreted as + #"(exists (expr))->{...}" + $expr = "+$expr" if $expr =~ /^\(/; + $text .= $expr; + } + + my @items = $op->aux_list($self->{curcv}); + my $actions = shift @items; + + my $is_hash; + my $derefs = 0; + + while (1) { + if (($actions & MDEREF_ACTION_MASK) == MDEREF_reload) { + $actions = shift @items; + next; + } + + $is_hash = ( + ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_pop_rv2hv_helem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvsv_vivify_rv2hv_helem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padsv_vivify_rv2hv_helem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_vivify_rv2hv_helem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padhv_helem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvhv_helem + ); + + if ( ($actions & MDEREF_ACTION_MASK) == MDEREF_AV_padav_aelem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_padhv_helem) + { + $derefs = 1; + $text .= '$' . substr($self->padname(shift @items), 1); + } + elsif ( ($actions & MDEREF_ACTION_MASK) == MDEREF_AV_gvav_aelem + || ($actions & MDEREF_ACTION_MASK) == MDEREF_HV_gvhv_helem) + { + $derefs = 1; + $text .= $self->multideref_var_name(shift @items, $is_hash); + } + else { + if ( ($actions & MDEREF_ACTION_MASK) == + MDEREF_AV_padsv_vivify_rv2av_aelem + || ($actions & MDEREF_ACTION_MASK) == + MDEREF_HV_padsv_vivify_rv2hv_helem) + { + $text .= $self->padname(shift @items); + } + elsif ( ($actions & MDEREF_ACTION_MASK) == + MDEREF_AV_gvsv_vivify_rv2av_aelem + || ($actions & MDEREF_ACTION_MASK) == + MDEREF_HV_gvsv_vivify_rv2hv_helem) + { + $text .= $self->multideref_var_name(shift @items, $is_hash); + } + elsif ( ($actions & MDEREF_ACTION_MASK) == + MDEREF_AV_pop_rv2av_aelem + || ($actions & MDEREF_ACTION_MASK) == + MDEREF_HV_pop_rv2hv_helem) + { + if ( ($op->flags & OPf_KIDS) + && ( _op_is_or_was($op->first, OP_RV2AV) + || _op_is_or_was($op->first, OP_RV2HV)) + && ($op->first->flags & OPf_KIDS) + && ( _op_is_or_was($op->first->first, OP_AELEM) + || _op_is_or_was($op->first->first, OP_HELEM)) + ) + { + $derefs++; + } + } + + $text .= '->' if !$derefs++; + } + + + if (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_none) { + last; + } + + $text .= $is_hash ? '{' : '['; + + if (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_const) { + my $key = shift @items; + if ($is_hash) { + $text .= $self->const($key, $cx); + } + else { + $text .= $key; + } + } + elsif (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_padsv) { + $text .= $self->padname(shift @items); + } + elsif (($actions & MDEREF_INDEX_MASK) == MDEREF_INDEX_gvsv) { + $text .= '$' . ($self->stash_variable_name('$', shift @items))[0]; + } + + $text .= $is_hash ? '}' : ']'; + + if ($actions & MDEREF_FLAG_last) { + last; + } + $actions >>= MDEREF_SHIFT; + } + + return $text; +} + + +sub pp_aelem { maybe_local(@_, elem(@_, "[", "]", "padav")) } +sub pp_helem { maybe_local(@_, elem(@_, "{", "}", "padhv")) } + +sub pp_gelem { + my $self = shift; + my($op, $cx) = @_; + my($glob, $part) = ($op->first, $op->last); + $glob = $glob->first; # skip rv2gv + $glob = $glob->first if $glob->name eq "rv2gv"; # this one's a bug + my $scope = is_scope($glob); + $glob = $self->deparse($glob, 0); + $part = $self->deparse($part, 1); + $glob =~ s/::\z// unless $scope; + return "*" . ($scope ? "{$glob}" : $glob) . "{$part}"; +} + +sub slice { + my $self = shift; + my ($op, $cx, $left, $right, $regname, $padname) = @_; + my $last; + my(@elems, $kid, $array, $list); + if (class($op) eq "LISTOP") { + $last = $op->last; + } else { # ex-hslice inside delete() + for ($kid = $op->first; !null $kid->sibling; $kid = $kid->sibling) {} + $last = $kid; + } + $array = $last; + $array = $array->first + if $array->name eq $regname or $array->name eq "null"; + $array = $self->elem_or_slice_array_name($array,$left,$padname,0); + $kid = $op->first->sibling; # skip pushmark + if ($kid->name eq "list") { + $kid = $kid->first->sibling; # skip list, pushmark + for (; !null $kid; $kid = $kid->sibling) { + push @elems, $self->deparse($kid, 6); + } + $list = join(", ", @elems); + } else { + $list = $self->elem_or_slice_single_index($kid); + } + my $lead = ( _op_is_or_was($op, OP_KVHSLICE) + || _op_is_or_was($op, OP_KVASLICE)) + ? '%' : '@'; + return $lead . $array . $left . $list . $right; +} + +sub pp_aslice { maybe_local(@_, slice(@_, "[", "]", "rv2av", "padav")) } +sub pp_kvaslice { slice(@_, "[", "]", "rv2av", "padav") } +sub pp_hslice { maybe_local(@_, slice(@_, "{", "}", "rv2hv", "padhv")) } +sub pp_kvhslice { slice(@_, "{", "}", "rv2hv", "padhv") } + +sub pp_lslice { + my $self = shift; + my($op, $cx) = @_; + my $idx = $op->first; + my $list = $op->last; + my(@elems, $kid); + $list = $self->deparse($list, 1); + $idx = $self->deparse($idx, 1); + return "($list)" . "[$idx]"; +} + +sub want_scalar { + my $op = shift; + return ($op->flags & OPf_WANT) == OPf_WANT_SCALAR; +} + +sub want_list { + my $op = shift; + return ($op->flags & OPf_WANT) == OPf_WANT_LIST; +} + +sub _method { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first->sibling; # skip pushmark + my($meth, $obj, @exprs); + if ($kid->name eq "list" and want_list $kid) { + # When an indirect object isn't a bareword but the args are in + # parens, the parens aren't part of the method syntax (the LLAFR + # doesn't apply), but they make a list with OPf_PARENS set that + # doesn't get flattened by the append_elem that adds the method, + # making a (object, arg1, arg2, ...) list where the object + # usually is. This can be distinguished from + # '($obj, $arg1, $arg2)->meth()' (which is legal if $arg2 is an + # object) because in the later the list is in scalar context + # as the left side of -> always is, while in the former + # the list is in list context as method arguments always are. + # (Good thing there aren't method prototypes!) + $meth = $kid->sibling; + $kid = $kid->first->sibling; # skip pushmark + $obj = $kid; + $kid = $kid->sibling; + for (; not null $kid; $kid = $kid->sibling) { + push @exprs, $kid; + } + } else { + $obj = $kid; + $kid = $kid->sibling; + for (; !null ($kid->sibling) && $kid->name!~/^method(?:_named)?\z/; + $kid = $kid->sibling) { + push @exprs, $kid + } + $meth = $kid; + } + + if ($meth->name eq "method_named") { + $meth = $self->meth_sv($meth)->PV; + } elsif ($meth->name eq "method_super") { + $meth = "SUPER::".$self->meth_sv($meth)->PV; + } elsif ($meth->name eq "method_redir") { + $meth = $self->meth_rclass_sv($meth)->PV.'::'.$self->meth_sv($meth)->PV; + } elsif ($meth->name eq "method_redir_super") { + $meth = $self->meth_rclass_sv($meth)->PV.'::SUPER::'. + $self->meth_sv($meth)->PV; + } else { + $meth = $meth->first; + if ($meth->name eq "const") { + # As of 5.005_58, this case is probably obsoleted by the + # method_named case above + $meth = $self->const_sv($meth)->PV; # needs to be bare + } + } + + return { method => $meth, variable_method => ref($meth), + object => $obj, args => \@exprs }, + $cx; +} + +# compat function only +sub method { + my $self = shift; + my $info = $self->_method(@_); + return $self->e_method( $self->_method(@_) ); +} + +sub e_method { + my ($self, $info, $cx) = @_; + my $obj = $self->deparse($info->{object}, 24); + + my $meth = $info->{method}; + $meth = $self->deparse($meth, 1) if $info->{variable_method}; + my $args = join(", ", map { $self->deparse($_, 6) } @{$info->{args}} ); + if ($info->{object}->name eq 'scope' && want_list $info->{object}) { + # method { $object } + # This must be deparsed this way to preserve list context + # of $object. + my $need_paren = $cx >= 6; + return '(' x $need_paren + . $meth . substr($obj,2) # chop off the "do" + . " $args" + . ')' x $need_paren; + } + my $kid = $obj . "->" . $meth; + if (length $args) { + return $kid . "(" . $args . ")"; # parens mandatory + } else { + return $kid; + } +} + +# returns "&" if the prototype doesn't match the args, +# or ("", $args_after_prototype_demunging) if it does. +sub check_proto { + my $self = shift; + return "&" if $self->{'noproto'}; + my($proto, @args) = @_; + my($arg, $real); + my $doneok = 0; + my @reals; + # An unbackslashed @ or % gobbles up the rest of the args + 1 while $proto =~ s/(?deparse($_, 6), @args); + @args = (); + } else { + $arg = shift @args; + last unless $arg; + if ($chr eq "\$" || $chr eq "_") { + if (want_scalar $arg) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } + } elsif ($chr eq "&") { + if ($arg->name =~ /^(s?refgen|undef)$/) { + push @reals, $self->deparse($arg, 6); + } else { + return "&"; + } + } elsif ($chr eq "*") { + if ($arg->name =~ /^s?refgen$/ + and $arg->first->first->name eq "rv2gv") + { + $real = $arg->first->first; # skip refgen, null + if ($real->first->name eq "gv") { + push @reals, $self->deparse($real, 6); + } else { + push @reals, $self->deparse($real->first, 6); + } + } else { + return "&"; + } + } elsif (substr($chr, 0, 1) eq "\\") { + $chr =~ tr/\\[]//d; + if ($arg->name =~ /^s?refgen$/ and + !null($real = $arg->first) and + ($chr =~ /\$/ && is_scalar($real->first) + or ($chr =~ /@/ + && class($real->first->sibling) ne 'NULL' + && $real->first->sibling->name + =~ /^(rv2|pad)av$/) + or ($chr =~ /%/ + && class($real->first->sibling) ne 'NULL' + && $real->first->sibling->name + =~ /^(rv2|pad)hv$/) + #or ($chr =~ /&/ # This doesn't work + # && $real->first->name eq "rv2cv") + or ($chr =~ /\*/ + && $real->first->name eq "rv2gv"))) + { + push @reals, $self->deparse($real, 6); + } else { + return "&"; + } + } + } + } + return "&" if $proto and !$doneok; # too few args and no ';' + return "&" if @args; # too many args + return ("", join ", ", @reals); +} + +sub retscalar { + my $name = $_[0]->name; + # XXX There has to be a better way of doing this scalar-op check. + # Currently PL_opargs is not exposed. + if ($name eq 'null') { + $name = substr B::ppname($_[0]->targ), 3 + } + $name =~ /^(?:scalar|pushmark|wantarray|const|gvsv|gv|padsv|rv2gv + |rv2sv|av2arylen|anoncode|prototype|srefgen|ref|bless + |regcmaybe|regcreset|regcomp|qr|subst|substcont|trans + |transr|sassign|chop|schop|chomp|schomp|defined|undef + |study|pos|preinc|i_preinc|predec|i_predec|postinc + |i_postinc|postdec|i_postdec|pow|multiply|i_multiply + |divide|i_divide|modulo|i_modulo|add|i_add|subtract + |i_subtract|concat|multiconcat|stringify|left_shift|right_shift|lt + |i_lt|gt|i_gt|le|i_le|ge|i_ge|eq|i_eq|ne|i_ne|ncmp|i_ncmp + |slt|sgt|sle|sge|seq|sne|scmp|[sn]?bit_(?:and|x?or)|negate + |i_negate|not|[sn]?complement|smartmatch|atan2|sin|cos + |rand|srand|exp|log|sqrt|int|hex|oct|abs|length|substr + |vec|index|rindex|sprintf|formline|ord|chr|crypt|ucfirst + |lcfirst|uc|lc|quotemeta|aelemfast|aelem|exists|helem + |pack|join|anonlist|anonhash|push|pop|shift|unshift|xor + |andassign|orassign|dorassign|warn|die|reset|nextstate + |dbstate|unstack|last|next|redo|dump|goto|exit|open|close + |pipe_op|fileno|umask|binmode|tie|untie|tied|dbmopen + |dbmclose|select|getc|read|enterwrite|prtf|print|say + |sysopen|sysseek|sysread|syswrite|eof|tell|seek|truncate + |fcntl|ioctl|flock|send|recv|socket|sockpair|bind|connect + |listen|accept|shutdown|gsockopt|ssockopt|getsockname + |getpeername|ftrread|ftrwrite|ftrexec|fteread|ftewrite + |fteexec|ftis|ftsize|ftmtime|ftatime|ftctime|ftrowned + |fteowned|ftzero|ftsock|ftchr|ftblk|ftfile|ftdir|ftpipe + |ftsuid|ftsgid|ftsvtx|ftlink|fttty|fttext|ftbinary|chdir + |chown|chroot|unlink|chmod|utime|rename|link|symlink + |readlink|mkdir|rmdir|open_dir|telldir|seekdir|rewinddir + |closedir|fork|wait|waitpid|system|exec|kill|getppid + |getpgrp|setpgrp|getpriority|setpriority|time|alarm|sleep + |shmget|shmctl|shmread|shmwrite|msgget|msgctl|msgsnd + |msgrcv|semop|semget|semctl|hintseval|shostent|snetent + |sprotoent|sservent|ehostent|enetent|eprotoent|eservent + |spwent|epwent|sgrent|egrent|getlogin|syscall|lock|runcv + |fc)\z/x +} + +sub pp_entersub { + my $self = shift; + my($op, $cx) = @_; + return $self->e_method($self->_method($op, $cx)) + unless null $op->first->sibling; + my $prefix = ""; + my $amper = ""; + my($kid, @exprs); + if ($op->flags & OPf_SPECIAL && !($op->flags & OPf_MOD)) { + $prefix = "do "; + } elsif ($op->private & OPpENTERSUB_AMPER) { + $amper = "&"; + } + $kid = $op->first; + $kid = $kid->first->sibling; # skip ex-list, pushmark + for (; not null $kid->sibling; $kid = $kid->sibling) { + push @exprs, $kid; + } + my $simple = 0; + my $proto = undef; + my $lexical; + if (is_scope($kid)) { + $amper = "&"; + $kid = "{" . $self->deparse($kid, 0) . "}"; + } elsif ($kid->first->name eq "gv") { + my $gv = $self->gv_or_padgv($kid->first); + my $cv; + if (class($gv) eq 'GV' && class($cv = $gv->CV) ne "SPECIAL" + || $gv->FLAGS & SVf_ROK && class($cv = $gv->RV) eq 'CV') { + $proto = $cv->PV if $cv->FLAGS & SVf_POK; + } + $simple = 1; # only calls of named functions can be prototyped + $kid = $self->maybe_qualify("!", $self->gv_name($gv)); + my $fq; + # Fully qualify any sub name that conflicts with a lexical. + if ($self->lex_in_scope("&$kid") + || $self->lex_in_scope("&$kid", 1)) + { + $fq++; + } elsif (!$amper) { + if ($kid eq 'main::') { + $kid = '::'; + } + else { + if ($kid !~ /::/ && $kid ne 'x') { + # Fully qualify any sub name that is also a keyword. While + # we could check the import flag, we cannot guarantee that + # the code deparsed so far would set that flag, so we qual- + # ify the names regardless of importation. + if (exists $feature_keywords{$kid}) { + $fq++ if $self->feature_enabled($kid); + } elsif (do { local $@; local $SIG{__DIE__}; + eval { () = prototype "CORE::$kid"; 1 } }) { + $fq++ + } + } + if ($kid !~ /^(?:\w|::)(?:[\w\d]|::(?!\z))*\z/) { + $kid = single_delim("q", "'", $kid, $self) . '->'; + } + } + } + $fq and substr $kid, 0, 0, = $self->{'curstash'}.'::'; + } elsif (is_scalar ($kid->first) && $kid->first->name ne 'rv2cv') { + $amper = "&"; + $kid = $self->deparse($kid, 24); + } else { + $prefix = ""; + my $grandkid = $kid->first; + my $arrow = ($lexical = $grandkid->name eq "padcv") + || is_subscriptable($grandkid) + ? "" + : "->"; + $kid = $self->deparse($kid, 24) . $arrow; + if ($lexical) { + my $padlist = $self->{'curcv'}->PADLIST; + my $padoff = $grandkid->targ; + my $padname = $padlist->ARRAYelt(0)->ARRAYelt($padoff); + my $protocv = $padname->FLAGS & SVpad_STATE + ? $padlist->ARRAYelt(1)->ARRAYelt($padoff) + : $padname->PROTOCV; + if ($protocv->FLAGS & SVf_POK) { + $proto = $protocv->PV + } + $simple = 1; + } + } + + # Doesn't matter how many prototypes there are, if + # they haven't happened yet! + my $declared = $lexical || exists $self->{'subs_declared'}{$kid}; + if (not $declared and $self->{'in_coderef2text'}) { + no strict 'refs'; + no warnings 'uninitialized'; + $declared = + ( + defined &{ ${$self->{'curstash'}."::"}{$kid} } + && !exists + $self->{'subs_deparsed'}{$self->{'curstash'}."::".$kid} + && defined prototype $self->{'curstash'}."::".$kid + ); + } + if (!$declared && defined($proto)) { + # Avoid "too early to check prototype" warning + ($amper, $proto) = ('&'); + } + + my $args; + my $listargs = 1; + if ($declared and defined $proto and not $amper) { + ($amper, $args) = $self->check_proto($proto, @exprs); + $listargs = $amper; + } + if ($listargs) { + $args = join(", ", map( + ($_->flags & OPf_WANT) == OPf_WANT_SCALAR + && !retscalar($_) + ? $self->maybe_parens_unop('scalar', $_, 6) + : $self->deparse($_, 6), + @exprs + )); + } + if ($prefix or $amper) { + if ($kid eq '&') { $kid = "{$kid}" } # &{&} cannot be written as && + if ($op->flags & OPf_STACKED) { + return $prefix . $amper . $kid . "(" . $args . ")"; + } else { + return $prefix . $amper. $kid; + } + } else { + # It's a syntax error to call CORE::GLOBAL::foo with a prefix, + # so it must have been translated from a keyword call. Translate + # it back. + $kid =~ s/^CORE::GLOBAL:://; + + my $dproto = defined($proto) ? $proto : "undefined"; + my $scalar_proto = $dproto =~ /^;*(?:[\$*_+]|\\.|\\\[[^]]\])\z/; + if (!$declared) { + return "$kid(" . $args . ")"; + } elsif ($dproto =~ /^\s*\z/) { + return $kid; + } elsif ($scalar_proto and is_scalar($exprs[0])) { + # is_scalar is an excessively conservative test here: + # really, we should be comparing to the precedence of the + # top operator of $exprs[0] (ala unop()), but that would + # take some major code restructuring to do right. + return $self->maybe_parens_func($kid, $args, $cx, 16); + } elsif (not $scalar_proto and defined($proto) || $simple) { #' + return $self->maybe_parens_func($kid, $args, $cx, 5); + } else { + return "$kid(" . $args . ")"; + } + } +} + +sub pp_enterwrite { unop(@_, "write") } + +# escape things that cause interpolation in double quotes, +# but not character escapes +sub uninterp { + my($str) = @_; + $str =~ s/(^|\G|[^\\])((?:\\\\)*)([\$\@]|\\[uUlLQE])/$1$2\\$3/g; + return $str; +} + +{ +my $bal; +BEGIN { + use re "eval"; + # Matches any string which is balanced with respect to {braces} + $bal = qr( + (?: + [^\\{}] + | \\\\ + | \\[{}] + | \{(??{$bal})\} + )* + )x; +} + +# the same, but treat $|, $), $( and $ at the end of the string differently +# and leave comments unmangled for the sake of /x and (?x). +sub re_uninterp { + my($str) = @_; + + $str =~ s/ + ( ^|\G # $1 + | [^\\] + ) + + ( # $2 + (?:\\\\)* + ) + + ( # $3 + ( \(\?\??\{$bal\}\) # $4 (skip over (?{}) and (??{}) blocks) + | \#[^\n]* # (skip over comments) + ) + | [\$\@] + (?!\||\)|\(|$|\s) + | \\[uUlLQE] + ) + + /defined($4) && length($4) ? "$1$2$4" : "$1$2\\$3"/xeg; + + return $str; +} +} + +# character escapes, but not delimiters that might need to be escaped +sub escape_str { # ASCII, UTF8 + my($str) = @_; + $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg; + $str =~ s/\a/\\a/g; +# $str =~ s/\cH/\\b/g; # \b means something different in a regex; and \cH + # isn't a backspace in EBCDIC + $str =~ s/\t/\\t/g; + $str =~ s/\n/\\n/g; + $str =~ s/\e/\\e/g; + $str =~ s/\f/\\f/g; + $str =~ s/\r/\\r/g; + $str =~ s/([\cA-\cZ])/'\\c' . $unctrl{$1}/ge; + $str =~ s/([[:^print:]])/sprintf("\\%03o", ord($1))/age; + return $str; +} + +# For regexes. Leave whitespace unmangled in case of /x or (?x). +sub escape_re { + my($str) = @_; + $str =~ s/(.)/ord($1) > 255 ? sprintf("\\x{%x}", ord($1)) : $1/eg; + $str =~ s/([[:^print:]])/ + ($1 =~ y! \t\n!!) ? $1 : sprintf("\\%03o", ord($1))/age; + $str =~ s/\n/\n\f/g; + return $str; +} + +# Don't do this for regexen +sub unback { + my($str) = @_; + $str =~ s/\\/\\\\/g; + return $str; +} + +# Remove backslashes which precede literal control characters, +# to avoid creating ambiguity when we escape the latter. +# +# Don't remove a backslash from escaped whitespace: where the T represents +# a literal tab character, /T/x is not equivalent to /\T/x + +sub re_unback { + my($str) = @_; + + # the insane complexity here is due to the behaviour of "\c\" + $str =~ s/ + # these two lines ensure that the backslash we're about to + # remove isn't preceeded by something which makes it part + # of a \c + + (^ | [^\\] | \\c\\) # $1 + (?'], ['{','}']) { + ($open, $close) = @$ar; + $fail = 0; $cnt = 0; $last_bs = 0; + for $c (@str) { + if ($c eq $open) { + $fail = 1 if $last_bs; + $cnt++; + } elsif ($c eq $close) { + $fail = 1 if $last_bs; + $cnt--; + if ($cnt < 0) { + # qq()() isn't ")(" + $fail = 1; + last; + } + } + $last_bs = $c eq '\\'; + } + $fail = 1 if $cnt != 0; + return ($open, "$open$str$close") if not $fail; + } + return ("", $str); +} + +sub single_delim { + my($q, $default, $str, $self) = @_; + return "$default$str$default" if $default and index($str, $default) == -1; + my $coreq = $self->keyword($q); # maybe CORE::q + if ($q ne 'qr') { + (my $succeed, $str) = balanced_delim($str); + return "$coreq$str" if $succeed; + } + for my $delim ('/', '"', '#') { + return "$coreq$delim" . $str . $delim if index($str, $delim) == -1; + } + if ($default) { + $str =~ s/$default/\\$default/g; + return "$default$str$default"; + } else { + $str =~ s[/][\\/]g; + return "$coreq/$str/"; + } +} + +my $max_prec; +BEGIN { $max_prec = int(0.999 + 8*length(pack("F", 42))*log(2)/log(10)); } + +# Split a floating point number into an integer mantissa and a binary +# exponent. Assumes you've already made sure the number isn't zero or +# some weird infinity or NaN. +sub split_float { + my($f) = @_; + my $exponent = 0; + if ($f == int($f)) { + while ($f % 2 == 0) { + $f /= 2; + $exponent++; + } + } else { + while ($f != int($f)) { + $f *= 2; + $exponent--; + } + } + my $mantissa = sprintf("%.0f", $f); + return ($mantissa, $exponent); +} + + +# suitably single- or double-quote a literal constant string + +sub quoted_const_str { + my ($self, $str) =@_; + if ($str =~ /[[:^print:]]/a) { + return single_delim("qq", '"', + uninterp(escape_str unback $str), $self); + } else { + return single_delim("q", "'", unback($str), $self); + } +} + + +sub const { + my $self = shift; + my($sv, $cx) = @_; + if ($self->{'use_dumper'}) { + return $self->const_dumper($sv, $cx); + } + if (class($sv) eq "SPECIAL") { + # sv_undef, sv_yes, sv_no + return $$sv == 3 ? $self->maybe_parens("!1", $cx, 21) + : ('undef', '1')[$$sv-1]; + } + if (class($sv) eq "NULL") { + return 'undef'; + } + # convert a version object into the "v1.2.3" string in its V magic + if ($sv->FLAGS & SVs_RMG) { + for (my $mg = $sv->MAGIC; $mg; $mg = $mg->MOREMAGIC) { + return $mg->PTR if $mg->TYPE eq 'V'; + } + } + + if ($sv->FLAGS & SVf_IOK) { + my $str = $sv->int_value; + $str = $self->maybe_parens($str, $cx, 21) if $str < 0; + return $str; + } elsif ($sv->FLAGS & SVf_NOK) { + my $nv = $sv->NV; + if ($nv == 0) { + if (pack("F", $nv) eq pack("F", 0)) { + # positive zero + return "0"; + } else { + # negative zero + return $self->maybe_parens("-.0", $cx, 21); + } + } elsif (1/$nv == 0) { + if ($nv > 0) { + # positive infinity + return $self->maybe_parens("9**9**9", $cx, 22); + } else { + # negative infinity + return $self->maybe_parens("-9**9**9", $cx, 21); + } + } elsif ($nv != $nv) { + # NaN + if (pack("F", $nv) eq pack("F", sin(9**9**9))) { + # the normal kind + return "sin(9**9**9)"; + } elsif (pack("F", $nv) eq pack("F", -sin(9**9**9))) { + # the inverted kind + return $self->maybe_parens("-sin(9**9**9)", $cx, 21); + } else { + # some other kind + my $hex = unpack("h*", pack("F", $nv)); + return qq'unpack("F", pack("h*", "$hex"))'; + } + } + # first, try the default stringification + my $str = "$nv"; + if ($str != $nv) { + # failing that, try using more precision + $str = sprintf("%.${max_prec}g", $nv); +# if (pack("F", $str) ne pack("F", $nv)) { + if ($str != $nv) { + # not representable in decimal with whatever sprintf() + # and atof() Perl is using here. + my($mant, $exp) = split_float($nv); + return $self->maybe_parens("$mant * 2**$exp", $cx, 19); + } + } + $str = $self->maybe_parens($str, $cx, 21) if $nv < 0; + return $str; + } elsif ($sv->FLAGS & SVf_ROK && $sv->can("RV")) { + my $ref = $sv->RV; + my $class = class($ref); + if ($class eq "AV") { + return "[" . $self->list_const(2, $ref->ARRAY) . "]"; + } elsif ($class eq "HV") { + my %hash = $ref->ARRAY; + my @elts; + for my $k (sort keys %hash) { + push @elts, "$k => " . $self->const($hash{$k}, 6); + } + return "{" . join(", ", @elts) . "}"; + } elsif ($class eq "CV") { + no overloading; + if ($self->{curcv} && + $self->{curcv}->object_2svref == $ref->object_2svref) { + return $self->keyword("__SUB__"); + } + return "sub " . $self->deparse_sub($ref); + } + if ($class ne 'SPECIAL' and $ref->FLAGS & SVs_SMG) { + for (my $mg = $ref->MAGIC; $mg; $mg = $mg->MOREMAGIC) { + if ($mg->TYPE eq 'r') { + my $re = re_uninterp(escape_re(re_unback($mg->precomp))); + return single_delim("qr", "", $re, $self); + } + } + } + + my $const = $self->const($ref, 20); + if ($self->{in_subst_repl} && $const =~ /^[0-9]/) { + $const = "($const)"; + } + return $self->maybe_parens("\\$const", $cx, 20); + } elsif ($sv->FLAGS & SVf_POK) { + my $str = $sv->PV; + return $self->quoted_const_str($str); + } else { + return "undef"; + } +} + +sub const_dumper { + my $self = shift; + my($sv, $cx) = @_; + my $ref = $sv->object_2svref(); + my $dumper = Data::Dumper->new([$$ref], ['$v']); + $dumper->Purity(1)->Terse(1)->Deparse(1)->Indent(0)->Useqq(1)->Sortkeys(1); + my $str = $dumper->Dump(); + if ($str =~ /^\$v/) { + return '${my ' . $str . ' \$v}'; + } else { + return $str; + } +} + +sub const_sv { + my $self = shift; + my $op = shift; + my $sv = $op->sv; + # the constant could be in the pad (under useithreads) + $sv = $self->padval($op->targ) unless $$sv; + return $sv; +} + +sub meth_sv { + my $self = shift; + my $op = shift; + my $sv = $op->meth_sv; + # the constant could be in the pad (under useithreads) + $sv = $self->padval($op->targ) unless $$sv; + return $sv; +} + +sub meth_rclass_sv { + my $self = shift; + my $op = shift; + my $sv = $op->rclass; + # the constant could be in the pad (under useithreads) + $sv = $self->padval($sv) unless ref $sv; + return $sv; +} + +sub pp_const { + my $self = shift; + my($op, $cx) = @_; + if ($op->private & OPpCONST_ARYBASE) { + return '$['; + } +# if ($op->private & OPpCONST_BARE) { # trouble with '=>' autoquoting +# return $self->const_sv($op)->PV; +# } + my $sv = $self->const_sv($op); + return $self->const($sv, $cx); +} + + +# Join two components of a double-quoted string, disambiguating +# "${foo}bar", "${foo}{bar}", "${foo}[1]", "$foo\::bar" + +sub dq_disambiguate { + my ($first, $last) = @_; + ($last =~ /^[A-Z\\\^\[\]_?]/ && + $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc + || ($last =~ /^[:'{\[\w_]/ && #' + $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/); + return $first . $last; +} + + +# Deparse a double-quoted optree. For example, "$a[0]\Q$b\Efo\"o" gets +# compiled to concat(concat($[0],quotemeta($b)),const("fo\"o")), and this +# sub deparses it back to $a[0]\Q$b\Efo"o +# (It does not add delimiters) + +sub dq { + my $self = shift; + my $op = shift; + my $type = $op->name; + if ($type eq "const") { + return '$[' if $op->private & OPpCONST_ARYBASE; + return uninterp(escape_str(unback($self->const_sv($op)->as_string))); + } elsif ($type eq "concat") { + return dq_disambiguate($self->dq($op->first), $self->dq($op->last)); + } elsif ($type eq "multiconcat") { + return $self->do_multiconcat($op, 26, 1); + } elsif ($type eq "uc") { + return '\U' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "lc") { + return '\L' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "ucfirst") { + return '\u' . $self->dq($op->first->sibling); + } elsif ($type eq "lcfirst") { + return '\l' . $self->dq($op->first->sibling); + } elsif ($type eq "quotemeta") { + return '\Q' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "fc") { + return '\F' . $self->dq($op->first->sibling) . '\E'; + } elsif ($type eq "join") { + return $self->deparse($op->last, 26); # was join($", @ary) + } else { + return $self->deparse($op, 26); + } +} + +sub pp_backtick { + my $self = shift; + my($op, $cx) = @_; + # skip pushmark if it exists (readpipe() vs ``) + my $child = $op->first->sibling->isa('B::NULL') + ? $op->first : $op->first->sibling; + if ($self->pure_string($child)) { + return single_delim("qx", '`', $self->dq($child, 1), $self); + } + unop($self, @_, "readpipe"); +} + +sub dquote { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first->sibling; # skip ex-stringify, pushmark + return $self->deparse($kid, $cx) if $self->{'unquote'}; + $self->maybe_targmy($kid, $cx, + sub {single_delim("qq", '"', $self->dq($_[1]), + $self)}); +} + +# OP_STRINGIFY is a listop, but it only ever has one arg +sub pp_stringify { + my ($self, $op, $cx) = @_; + my $kid = $op->first->sibling; + while ($kid->name eq 'null' && !null($kid->first)) { + $kid = $kid->first; + } + if ($kid->name =~ /^(?:const|padsv|rv2sv|av2arylen|gvsv|multideref + |aelemfast(?:_lex)?|[ah]elem|join|concat)\z/x) { + maybe_targmy(@_, \&dquote); + } + else { + # Actually an optimised join. + my $result = listop(@_,"join"); + $result =~ s/join([( ])/join$1$self->{'ex_const'}, /; + $result; + } +} + +# tr/// and s/// (and tr[][], tr[]//, tr###, etc) +# note that tr(from)/to/ is OK, but not tr/from/(to) +sub double_delim { + my($from, $to) = @_; + my($succeed, $delim); + if ($from !~ m[/] and $to !~ m[/]) { + return "/$from/$to/"; + } elsif (($succeed, $from) = balanced_delim($from) and $succeed) { + if (($succeed, $to) = balanced_delim($to) and $succeed) { + return "$from$to"; + } else { + for $delim ('/', '"', '#') { # note no "'" -- s''' is special + return "$from$delim$to$delim" if index($to, $delim) == -1; + } + $to =~ s[/][\\/]g; + return "$from/$to/"; + } + } else { + for $delim ('/', '"', '#') { # note no ' + return "$delim$from$delim$to$delim" + if index($to . $from, $delim) == -1; + } + $from =~ s[/][\\/]g; + $to =~ s[/][\\/]g; + return "/$from/$to/"; + } +} + +# Escape a characrter. +# Only used by tr///, so backslashes hyphens + +sub pchr { # ASCII + my($n) = @_; + if ($n == ord '\\') { + return '\\\\'; + } elsif ($n == ord "-") { + return "\\-"; + } elsif (utf8::native_to_unicode($n) >= utf8::native_to_unicode(ord(' ')) + and utf8::native_to_unicode($n) <= utf8::native_to_unicode(ord('~'))) + { + # I'm presuming a regex is not ok here, otherwise we could have used + # /[[:print:]]/a to get here + return chr($n); + } elsif ($n == ord "\a") { + return '\\a'; + } elsif ($n == ord "\b") { + return '\\b'; + } elsif ($n == ord "\t") { + return '\\t'; + } elsif ($n == ord "\n") { + return '\\n'; + } elsif ($n == ord "\e") { + return '\\e'; + } elsif ($n == ord "\f") { + return '\\f'; + } elsif ($n == ord "\r") { + return '\\r'; + } elsif ($n >= ord("\cA") and $n <= ord("\cZ")) { + return '\\c' . $unctrl{chr $n}; + } else { +# return '\x' . sprintf("%02x", $n); + return '\\' . sprintf("%03o", $n); + } +} + +# Convert a list of characters into a string suitable for tr/// search or +# replacement, with suitable escaping and collapsing of ranges + +sub collapse { + my(@chars) = @_; + my($str, $c, $tr) = (""); + for ($c = 0; $c < @chars; $c++) { + $tr = $chars[$c]; + $str .= pchr($tr); + if ($c <= $#chars - 2 and $chars[$c + 1] == $tr + 1 and + $chars[$c + 2] == $tr + 2) + { + for (; $c <= $#chars-1 and $chars[$c + 1] == $chars[$c] + 1; $c++) + {} + $str .= "-"; + $str .= pchr($chars[$c]); + } + } + return $str; +} + +sub tr_decode_byte { + my($table, $flags) = @_; + my $ssize_t = $Config{ptrsize} == 8 ? 'q' : 'l'; + my ($size, @table) = unpack("${ssize_t}s*", $table); + pop @table; # remove the wildcard final entry + + my($c, $tr, @from, @to, @delfrom, $delhyphen); + if ($table[ord "-"] != -1 and + $table[ord("-") - 1] == -1 || $table[ord("-") + 1] == -1) + { + $tr = $table[ord "-"]; + $table[ord "-"] = -1; + if ($tr >= 0) { + @from = ord("-"); + @to = $tr; + } else { # -2 ==> delete + $delhyphen = 1; + } + } + for ($c = 0; $c < @table; $c++) { + $tr = $table[$c]; + if ($tr >= 0) { + push @from, $c; push @to, $tr; + } elsif ($tr == -2) { + push @delfrom, $c; + } + } + @from = (@from, @delfrom); + + if ($flags & OPpTRANS_COMPLEMENT) { + unless ($flags & OPpTRANS_DELETE) { + @to = () if ("@from" eq "@to"); + } + + my @newfrom = (); + my %from; + @from{@from} = (1) x @from; + for ($c = 0; $c < 256; $c++) { + push @newfrom, $c unless $from{$c}; + } + @from = @newfrom; + } + unless ($flags & OPpTRANS_DELETE || !@to) { + pop @to while $#to and $to[$#to] == $to[$#to -1]; + } + my($from, $to); + $from = collapse(@from); + $to = collapse(@to); + $from .= "-" if $delhyphen; + return ($from, $to); +} + +sub tr_chr { + my $x = shift; + if ($x == ord "-") { + return "\\-"; + } elsif ($x == ord "\\") { + return "\\\\"; + } else { + return chr $x; + } +} + +# XXX This doesn't yet handle all cases correctly either + +sub tr_decode_utf8 { + my($swash_hv, $flags) = @_; + my %swash = $swash_hv->ARRAY; + my $final = undef; + $final = $swash{'FINAL'}->IV if exists $swash{'FINAL'}; + my $none = $swash{"NONE"}->IV; + my $extra = $none + 1; + my(@from, @delfrom, @to); + my $line; + foreach $line (split /\n/, $swash{'LIST'}->PV) { + my($min, $max, $result) = split(/\t/, $line); + $min = hex $min; + if (length $max) { + $max = hex $max; + } else { + $max = $min; + } + $result = hex $result; + if ($result == $extra) { + push @delfrom, [$min, $max]; + } else { + push @from, [$min, $max]; + push @to, [$result, $result + $max - $min]; + } + } + for my $i (0 .. $#from) { + if ($from[$i][0] == ord '-') { + unshift @from, splice(@from, $i, 1); + unshift @to, splice(@to, $i, 1); + last; + } elsif ($from[$i][1] == ord '-') { + $from[$i][1]--; + $to[$i][1]--; + unshift @from, ord '-'; + unshift @to, ord '-'; + last; + } + } + for my $i (0 .. $#delfrom) { + if ($delfrom[$i][0] == ord '-') { + push @delfrom, splice(@delfrom, $i, 1); + last; + } elsif ($delfrom[$i][1] == ord '-') { + $delfrom[$i][1]--; + push @delfrom, ord '-'; + last; + } + } + if (defined $final and $to[$#to][1] != $final) { + push @to, [$final, $final]; + } + push @from, @delfrom; + if ($flags & OPpTRANS_COMPLEMENT) { + my @newfrom; + my $next = 0; + for my $i (0 .. $#from) { + push @newfrom, [$next, $from[$i][0] - 1]; + $next = $from[$i][1] + 1; + } + @from = (); + for my $range (@newfrom) { + if ($range->[0] <= $range->[1]) { + push @from, $range; + } + } + } + my($from, $to, $diff); + for my $chunk (@from) { + $diff = $chunk->[1] - $chunk->[0]; + if ($diff > 1) { + $from .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]); + } elsif ($diff == 1) { + $from .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]); + } else { + $from .= tr_chr($chunk->[0]); + } + } + for my $chunk (@to) { + $diff = $chunk->[1] - $chunk->[0]; + if ($diff > 1) { + $to .= tr_chr($chunk->[0]) . "-" . tr_chr($chunk->[1]); + } elsif ($diff == 1) { + $to .= tr_chr($chunk->[0]) . tr_chr($chunk->[1]); + } else { + $to .= tr_chr($chunk->[0]); + } + } + #$final = sprintf("%04x", $final) if defined $final; + #$none = sprintf("%04x", $none) if defined $none; + #$extra = sprintf("%04x", $extra) if defined $extra; + #print STDERR "final: $final\n none: $none\nextra: $extra\n"; + #print STDERR $swash{'LIST'}->PV; + return (escape_str($from), escape_str($to)); +} + +sub pp_trans { + my $self = shift; + my($op, $cx, $morflags) = @_; + my($from, $to); + my $class = class($op); + my $priv_flags = $op->private; + if ($class eq "PVOP") { + ($from, $to) = tr_decode_byte($op->pv, $priv_flags); + } elsif ($class eq "PADOP") { + ($from, $to) + = tr_decode_utf8($self->padval($op->padix)->RV, $priv_flags); + } else { # class($op) eq "SVOP" + ($from, $to) = tr_decode_utf8($op->sv->RV, $priv_flags); + } + my $flags = ""; + $flags .= "c" if $priv_flags & OPpTRANS_COMPLEMENT; + $flags .= "d" if $priv_flags & OPpTRANS_DELETE; + $to = "" if $from eq $to and $flags eq ""; + $flags .= "s" if $priv_flags & OPpTRANS_SQUASH; + $flags .= $morflags if defined $morflags; + my $ret = $self->keyword("tr") . double_delim($from, $to) . $flags; + if (my $targ = $op->targ) { + return $self->maybe_parens($self->padname($targ) . " =~ $ret", + $cx, 20); + } + return $ret; +} + +sub pp_transr { push @_, 'r'; goto &pp_trans } + +# Join two components of a double-quoted re, disambiguating +# "${foo}bar", "${foo}{bar}", "${foo}[1]". + +sub re_dq_disambiguate { + my ($first, $last) = @_; + ($last =~ /^[A-Z\\\^\[\]_?]/ && + $first =~ s/([\$@])\^$/${1}{^}/) # "${^}W" etc + || ($last =~ /^[{\[\w_]/ && + $first =~ s/([\$@])([A-Za-z_]\w*)$/${1}{$2}/); + return $first . $last; +} + +# Like dq(), but different +sub re_dq { + my $self = shift; + my ($op) = @_; + + my $type = $op->name; + if ($type eq "const") { + return '$[' if $op->private & OPpCONST_ARYBASE; + my $unbacked = re_unback($self->const_sv($op)->as_string); + return re_uninterp(escape_re($unbacked)); + } elsif ($type eq "concat") { + my $first = $self->re_dq($op->first); + my $last = $self->re_dq($op->last); + return re_dq_disambiguate($first, $last); + } elsif ($type eq "multiconcat") { + return $self->do_multiconcat($op, 26, 2); + } elsif ($type eq "uc") { + return '\U' . $self->re_dq($op->first->sibling) . '\E'; + } elsif ($type eq "lc") { + return '\L' . $self->re_dq($op->first->sibling) . '\E'; + } elsif ($type eq "ucfirst") { + return '\u' . $self->re_dq($op->first->sibling); + } elsif ($type eq "lcfirst") { + return '\l' . $self->re_dq($op->first->sibling); + } elsif ($type eq "quotemeta") { + return '\Q' . $self->re_dq($op->first->sibling) . '\E'; + } elsif ($type eq "fc") { + return '\F' . $self->re_dq($op->first->sibling) . '\E'; + } elsif ($type eq "join") { + return $self->deparse($op->last, 26); # was join($", @ary) + } else { + my $ret = $self->deparse($op, 26); + $ret =~ s/^\$([(|)])\z/\${$1}/ # $( $| $) need braces + or $ret =~ s/^\@([-+])\z/\@{$1}/; # @- @+ need braces + return $ret; + } +} + +sub pure_string { + my ($self, $op) = @_; + return 0 if null $op; + my $type = $op->name; + + if ($type eq 'const' || $type eq 'av2arylen') { + return 1; + } + elsif ($type =~ /^(?:[ul]c(first)?|fc)$/ || $type eq 'quotemeta') { + return $self->pure_string($op->first->sibling); + } + elsif ($type eq 'join') { + my $join_op = $op->first->sibling; # Skip pushmark + return 0 unless $join_op->name eq 'null' && $join_op->targ == OP_RV2SV; + + my $gvop = $join_op->first; + return 0 unless $gvop->name eq 'gvsv'; + return 0 unless '"' eq $self->gv_name($self->gv_or_padgv($gvop)); + + return 0 unless ${$join_op->sibling} eq ${$op->last}; + return 0 unless $op->last->name =~ /^(?:[ah]slice|(?:rv2|pad)av)$/; + } + elsif ($type eq 'concat') { + return $self->pure_string($op->first) + && $self->pure_string($op->last); + } + elsif ($type eq 'multiconcat') { + my ($kid, @kids); + for ($kid = $op->first; !null $kid; $kid = $kid->sibling) { + # skip the consts and/or padsv we've optimised away + push @kids, $kid + unless $kid->type == OP_NULL + && ( $kid->targ == OP_PADSV + || $kid->targ == OP_CONST + || $kid->targ == OP_PUSHMARK); + } + + if ($op->flags & OPf_STACKED) { + # remove expr from @kids where 'expr = ...' or 'expr .= ....' + if ($op->private & OPpMULTICONCAT_APPEND) { + shift(@kids); + } + else { + pop(@kids); + } + } + for (@kids) { + return 0 unless $self->pure_string($_); + } + return 1; + } + elsif (is_scalar($op) || $type =~ /^[ah]elem$/) { + return 1; + } + elsif ($type eq "null" and $op->can('first') and not null $op->first) { + my $first = $op->first; + + return 1 if $first->name eq "multideref"; + return 1 if $first->name eq "aelemfast_lex"; + + if ( $first->name eq "null" + and $first->can('first') + and not null $first->first + and $first->first->name eq "aelemfast" + ) + { + return 1; + } + } + + return 0; +} + +sub code_list { + my ($self,$op,$cv) = @_; + + # localise stuff relating to the current sub + $cv and + local($self->{'curcv'}) = $cv, + local($self->{'curcvlex'}), + local(@$self{qw'curstash warnings hints hinthash curcop'}) + = @$self{qw'curstash warnings hints hinthash curcop'}; + + my $re; + for ($op = $op->first->sibling; !null($op); $op = $op->sibling) { + if ($op->name eq 'null' and $op->flags & OPf_SPECIAL) { + my $scope = $op->first; + # 0 context (last arg to scopeop) means statement context, so + # the contents of the block will not be wrapped in do{...}. + my $block = scopeop($scope->first->name eq "enter", $self, + $scope, 0); + # next op is the source code of the block + $op = $op->sibling; + $re .= ($self->const_sv($op)->PV =~ m|^(\(\?\??\{)|)[0]; + my $multiline = $block =~ /\n/; + $re .= $multiline ? "\n\t" : ' '; + $re .= $block; + $re .= $multiline ? "\n\b})" : " })"; + } else { + $re = re_dq_disambiguate($re, $self->re_dq($op)); + } + } + $re; +} + +sub regcomp { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + $kid = $kid->first if $kid->name eq "regcmaybe"; + $kid = $kid->first if $kid->name eq "regcreset"; + my $kname = $kid->name; + if ($kname eq "null" and !null($kid->first) + and $kid->first->name eq 'pushmark') + { + my $str = ''; + $kid = $kid->first->sibling; + while (!null($kid)) { + my $first = $str; + my $last = $self->re_dq($kid); + $str = re_dq_disambiguate($first, $last); + $kid = $kid->sibling; + } + return $str, 1; + } + + return ($self->re_dq($kid), 1) + if $kname =~ /^(?:rv2|pad)av/ or $self->pure_string($kid); + return ($self->deparse($kid, $cx), 0); +} + +sub pp_regcomp { + my ($self, $op, $cx) = @_; + return (($self->regcomp($op, $cx, 0))[0]); +} + +sub re_flags { + my ($self, $op) = @_; + my $flags = ''; + my $pmflags = $op->pmflags; + if (!$pmflags) { + my $re = $op->pmregexp; + if ($$re) { + $pmflags = $re->compflags; + } + } + $flags .= "g" if $pmflags & PMf_GLOBAL; + $flags .= "i" if $pmflags & PMf_FOLD; + $flags .= "m" if $pmflags & PMf_MULTILINE; + $flags .= "o" if $pmflags & PMf_KEEP; + $flags .= "s" if $pmflags & PMf_SINGLELINE; + $flags .= "x" if $pmflags & PMf_EXTENDED; + $flags .= "x" if $pmflags & PMf_EXTENDED_MORE; + $flags .= "p" if $pmflags & PMf_KEEPCOPY; + $flags .= "n" if $pmflags & PMf_NOCAPTURE; + if (my $charset = $pmflags & PMf_CHARSET) { + # Hardcoding this is fragile, but B does not yet export the + # constants we need. + $flags .= qw(d l u a aa)[$charset >> 7] + } + # The /d flag is indicated by 0; only show it if necessary. + elsif ($self->{hinthash} and + $self->{hinthash}{reflags_charset} + || $self->{hinthash}{feature_unicode} + or $self->{hints} & $feature::hint_mask + && ($self->{hints} & $feature::hint_mask) + != $feature::hint_mask + && $self->{hints} & $feature::hint_uni8bit + ) { + $flags .= 'd'; + } + $flags; +} + +# osmic acid -- see osmium tetroxide + +my %matchwords; +map($matchwords{join "", sort split //, $_} = $_, 'cig', 'cog', 'cos', 'cogs', + 'cox', 'go', 'is', 'ism', 'iso', 'mig', 'mix', 'osmic', 'ox', 'sic', + 'sig', 'six', 'smog', 'so', 'soc', 'sog', 'xi', 'soup', 'soupmix'); + +# When deparsing a regular expression with code blocks, we have to look in +# various places to find the blocks. +# +# For qr/(?{...})/ without interpolation, the CV is under $qr->qr_anoncv +# and the code list (list of blocks and constants, maybe vars) is under +# $cv->ROOT->first->code_list: +# ./perl -Ilib -MB -e 'use O "Concise", B::svref_2object(sub {qr/(?{die})/})->ROOT->first->first->sibling->pmregexp->qr_anoncv->object_2svref' +# +# For qr/$a(?{...})/ with interpolation, the code list is more accessible, +# under $pmop->code_list, but the $cv is something you have to dig for in +# the regcomp op’s kids: +# ./perl -Ilib -mO=Concise -e 'qr/$a(?{die})/' +# +# For m// and split //, things are much simpler. There is no CV. The code +# list is under $pmop->code_list. + +sub matchop { + my $self = shift; + my($op, $cx, $name, $delim) = @_; + my $kid = $op->first; + my ($binop, $var, $re) = ("", "", ""); + if ($op->name ne 'split' && $op->flags & OPf_STACKED) { + $binop = 1; + $var = $self->deparse($kid, 20); + $kid = $kid->sibling; + } + # not $name; $name will be 'm' for both match and split + elsif ($op->name eq 'match' and my $targ = $op->targ) { + $binop = 1; + $var = $self->padname($targ); + } + my $quote = 1; + my $pmflags = $op->pmflags; + my $rhs_bound_to_defsv; + my ($cv, $bregexp); + my $have_kid = !null $kid; + # Check for code blocks first + if (not null my $code_list = $op->code_list) { + $re = $self->code_list($code_list, + $op->name eq 'qr' + ? $self->padval( + $kid->first # ex-list + ->first # pushmark + ->sibling # entersub + ->first # ex-list + ->first # pushmark + ->sibling # srefgen + ->first # ex-list + ->first # anoncode + ->targ + ) + : undef); + } elsif (${$bregexp = $op->pmregexp} && ${$cv = $bregexp->qr_anoncv}) { + my $patop = $cv->ROOT # leavesub + ->first # qr + ->code_list;# list + $re = $self->code_list($patop, $cv); + } elsif (!$have_kid) { + $re = re_uninterp(escape_re(re_unback($op->precomp))); + } elsif ($kid->name ne 'regcomp') { + if ($op->name eq 'split') { + # split has other kids, not just regcomp + $re = re_uninterp(escape_re(re_unback($op->precomp))); + } + else { + carp("found ".$kid->name." where regcomp expected"); + } + } else { + ($re, $quote) = $self->regcomp($kid, 21); + } + if ($have_kid and $kid->name eq 'regcomp') { + my $matchop = $kid->first; + if ($matchop->name eq 'regcreset') { + $matchop = $matchop->first; + } + if ($matchop->name =~ /^(?:match|transr?|subst)\z/ + && $matchop->flags & OPf_SPECIAL) { + $rhs_bound_to_defsv = 1; + } + } + my $flags = ""; + $flags .= "c" if $pmflags & PMf_CONTINUE; + $flags .= $self->re_flags($op); + $flags = join '', sort split //, $flags; + $flags = $matchwords{$flags} if $matchwords{$flags}; + if ($pmflags & PMf_ONCE) { # only one kind of delimiter works here + $re =~ s/\?/\\?/g; + $re = $self->keyword("m") . "?$re?"; # explicit 'm' is required + } elsif ($quote) { + $re = single_delim($name, $delim, $re, $self); + } + $re = $re . $flags if $quote; + if ($binop) { + return + $self->maybe_parens( + $rhs_bound_to_defsv + ? "$var =~ (\$_ =~ $re)" + : "$var =~ $re", + $cx, 20 + ); + } else { + return $re; + } +} + +sub pp_match { matchop(@_, "m", "/") } +sub pp_qr { matchop(@_, "qr", "") } + +sub pp_runcv { unop(@_, "__SUB__"); } + +sub pp_split { + my $self = shift; + my($op, $cx) = @_; + my($kid, @exprs, $ary, $expr); + my $stacked = $op->flags & OPf_STACKED; + + $kid = $op->first; + $kid = $kid->sibling if $kid->name eq 'regcomp'; + for (; !null($kid); $kid = $kid->sibling) { + push @exprs, $self->deparse($kid, 6); + } + + unshift @exprs, $self->matchop($op, $cx, "m", "/"); + + if ($op->private & OPpSPLIT_ASSIGN) { + # With C<@array = split(/pat/, str);>, + # array is stored in split's pmreplroot; either + # as an integer index into the pad (for a lexical array) + # or as GV for a package array (which will be a pad index + # on threaded builds) + # With my/our @array = split(/pat/, str), the array is instead + # accessed via an extra padav/rv2av op at the end of the + # split's kid ops. + + if ($stacked) { + $ary = pop @exprs; + } + else { + if ($op->private & OPpSPLIT_LEX) { + $ary = $self->padname($op->pmreplroot); + } + else { + # union with op_pmtargetoff, op_pmtargetgv + my $gv = $op->pmreplroot; + $gv = $self->padval($gv) if !ref($gv); + $ary = $self->maybe_local(@_, + $self->stash_variable('@', + $self->gv_name($gv), + $cx)) + } + if ($op->private & OPpLVAL_INTRO) { + $ary = $op->private & OPpSPLIT_LEX ? "my $ary" : "local $ary"; + } + } + } + + # handle special case of split(), and split(' ') that compiles to /\s+/ + $exprs[0] = q{' '} if ($op->reflags // 0) & RXf_SKIPWHITE(); + + $expr = "split(" . join(", ", @exprs) . ")"; + if ($ary) { + return $self->maybe_parens("$ary = $expr", $cx, 7); + } else { + return $expr; + } +} + +# oxime -- any of various compounds obtained chiefly by the action of +# hydroxylamine on aldehydes and ketones and characterized by the +# bivalent grouping C=NOH [Webster's Tenth] + +my %substwords; +map($substwords{join "", sort split //, $_} = $_, 'ego', 'egoism', 'em', + 'es', 'ex', 'exes', 'gee', 'go', 'goes', 'ie', 'ism', 'iso', 'me', + 'meese', 'meso', 'mig', 'mix', 'os', 'ox', 'oxime', 'see', 'seem', + 'seg', 'sex', 'sig', 'six', 'smog', 'sog', 'some', 'xi', 'rogue', + 'sir', 'rise', 'smore', 'more', 'seer', 'rome', 'gore', 'grim', 'grime', + 'or', 'rose', 'rosie'); + +sub pp_subst { + my $self = shift; + my($op, $cx) = @_; + my $kid = $op->first; + my($binop, $var, $re, $repl) = ("", "", "", ""); + if ($op->flags & OPf_STACKED) { + $binop = 1; + $var = $self->deparse($kid, 20); + $kid = $kid->sibling; + } + elsif (my $targ = $op->targ) { + $binop = 1; + $var = $self->padname($targ); + } + my $flags = ""; + my $pmflags = $op->pmflags; + if (null($op->pmreplroot)) { + $repl = $kid; + $kid = $kid->sibling; + } else { + $repl = $op->pmreplroot->first; # skip substcont + } + while ($repl->name eq "entereval") { + $repl = $repl->first; + $flags .= "e"; + } + { + local $self->{in_subst_repl} = 1; + if ($pmflags & PMf_EVAL) { + $repl = $self->deparse($repl->first, 0); + } else { + $repl = $self->dq($repl); + } + } + if (not null my $code_list = $op->code_list) { + $re = $self->code_list($code_list); + } elsif (null $kid) { + $re = re_uninterp(escape_re(re_unback($op->precomp))); + } else { + ($re) = $self->regcomp($kid, 1); + } + $flags .= "r" if $pmflags & PMf_NONDESTRUCT; + $flags .= "e" if $pmflags & PMf_EVAL; + $flags .= $self->re_flags($op); + $flags = join '', sort split //, $flags; + $flags = $substwords{$flags} if $substwords{$flags}; + my $core_s = $self->keyword("s"); # maybe CORE::s + if ($binop) { + return $self->maybe_parens("$var =~ $core_s" + . double_delim($re, $repl) . $flags, + $cx, 20); + } else { + return "$core_s". double_delim($re, $repl) . $flags; + } +} + +sub is_lexical_subs { + my (@ops) = shift; + for my $op (@ops) { + return 0 if $op->name !~ /\A(?:introcv|clonecv)\z/; + } + return 1; +} + +# Pretend these two ops do not exist. The perl parser adds them to the +# beginning of any block containing my-sub declarations, whereas we handle +# the subs in pad_subs and next_todo. +*pp_clonecv = *pp_introcv; +sub pp_introcv { + my $self = shift; + my($op, $cx) = @_; + # For now, deparsing doesn't worry about the distinction between introcv + # and clonecv, so pretend this op doesn't exist: + return ''; +} + +sub pp_padcv { + my $self = shift; + my($op, $cx) = @_; + return $self->padany($op); +} + +my %lvref_funnies = ( + OPpLVREF_SV, => '$', + OPpLVREF_AV, => '@', + OPpLVREF_HV, => '%', + OPpLVREF_CV, => '&', +); + +sub pp_refassign { + my ($self, $op, $cx) = @_; + my $left; + if ($op->private & OPpLVREF_ELEM) { + $left = $op->first->sibling; + $left = maybe_local(@_, elem($self, $left, undef, + $left->targ == OP_AELEM + ? qw([ ] padav) + : qw({ } padhv))); + } elsif ($op->flags & OPf_STACKED) { + $left = maybe_local(@_, + $lvref_funnies{$op->private & OPpLVREF_TYPE} + . $self->deparse($op->first->sibling)); + } else { + $left = &pp_padsv; + } + my $right = $self->deparse_binop_right($op, $op->first, 7); + return $self->maybe_parens("\\$left = $right", $cx, 7); +} + +sub pp_lvref { + my ($self, $op, $cx) = @_; + my $code; + if ($op->private & OPpLVREF_ELEM) { + $code = $op->first->name =~ /av\z/ ? &pp_aelem : &pp_helem; + } elsif ($op->flags & OPf_STACKED) { + $code = maybe_local(@_, + $lvref_funnies{$op->private & OPpLVREF_TYPE} + . $self->deparse($op->first)); + } else { + $code = &pp_padsv; + } + "\\$code"; +} + +sub pp_lvrefslice { + my ($self, $op, $cx) = @_; + '\\' . ($op->last->name =~ /av\z/ ? &pp_aslice : &pp_hslice); +} + +sub pp_lvavref { + my ($self, $op, $cx) = @_; + '\\(' . ($op->flags & OPf_STACKED + ? maybe_local(@_, rv2x(@_, "\@")) + : &pp_padsv) . ')' +} + + +sub pp_argcheck { + my $self = shift; + my($op, $cx) = @_; + my ($params, $opt_params, $slurpy) = $op->aux_list($self->{curcv}); + my $mandatory = $params - $opt_params; + my $check = ''; + + $check .= < 0; +die sprintf("Too few arguments for subroutine at %s line %d.\\n", (caller)[1, 2]) unless \@_ >= $mandatory; +EOF + + my $cond = ($params & 1) ? 'unless' : 'if'; + $check .= < $params && ((\@_ - $params) & 1); +EOF + + $check =~ s/;\n\z//; + return $check; +} + + +sub pp_argelem { + my $self = shift; + my($op, $cx) = @_; + my $var = $self->padname($op->targ); + my $ix = $op->string($self->{curcv}); + my $expr; + if ($op->flags & OPf_KIDS) { + $expr = $self->deparse($op->first, 7); + } + elsif ($var =~ /^[@%]/) { + $expr = $ix ? "\@_[$ix .. \$#_]" : '@_'; + } + else { + $expr = "\$_[$ix]"; + } + return "my $var = $expr"; +} + + +sub pp_argdefelem { + my $self = shift; + my($op, $cx) = @_; + my $ix = $op->targ; + my $expr = "\@_ >= " . ($ix+1) . " ? \$_[$ix] : "; + my $def = $self->deparse($op->first, 7); + $def = "($def)" if $op->first->flags & OPf_PARENS; + $expr .= $self->deparse($op->first, $cx); + return $expr; +} + + +1; +__END__ + +# -*- buffer-read-only: t -*- +# +# lib/B/Op_private.pm +# +# Copyright (C) 2014 by Larry Wall and others +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by regen/opcode.pl from data in +# regen/op_private and pod embedded in regen/opcode.pl. +# Any changes made here will be lost! + + +package B::Op_private; + +our %bits; + + +our $VERSION = "5.028001"; + +$bits{$_}{3} = 'OPpENTERSUB_AMPER' for qw(entersub rv2cv); +$bits{$_}{6} = 'OPpENTERSUB_DB' for qw(entersub rv2cv); +$bits{$_}{2} = 'OPpENTERSUB_HASTARG' for qw(entersub rv2cv); +$bits{$_}{6} = 'OPpFLIP_LINENUM' for qw(flip flop); +$bits{$_}{1} = 'OPpFT_ACCESS' for qw(fteexec fteread ftewrite ftrexec ftrread ftrwrite); +$bits{$_}{4} = 'OPpFT_AFTER_t' for qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero); +$bits{$_}{2} = 'OPpFT_STACKED' for qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero); +$bits{$_}{3} = 'OPpFT_STACKING' for qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero); +$bits{$_}{1} = 'OPpHINT_STRICT_REFS' for qw(entersub multideref rv2av rv2cv rv2gv rv2hv rv2sv); +$bits{$_}{5} = 'OPpHUSH_VMSISH' for qw(dbstate nextstate); +$bits{$_}{6} = 'OPpINDEX_BOOLNEG' for qw(index rindex); +$bits{$_}{1} = 'OPpITER_REVERSED' for qw(enteriter iter); +$bits{$_}{7} = 'OPpLVALUE' for qw(leave leaveloop); +$bits{$_}{6} = 'OPpLVAL_DEFER' for qw(aelem helem multideref); +$bits{$_}{7} = 'OPpLVAL_INTRO' for qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split); +$bits{$_}{2} = 'OPpLVREF_ELEM' for qw(lvref refassign); +$bits{$_}{3} = 'OPpLVREF_ITER' for qw(lvref refassign); +$bits{$_}{3} = 'OPpMAYBE_LVSUB' for qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec); +$bits{$_}{4} = 'OPpMAYBE_TRUEBOOL' for qw(padhv ref rv2hv); +$bits{$_}{7} = 'OPpOFFBYONE' for qw(caller runcv wantarray); +$bits{$_}{5} = 'OPpOPEN_IN_CRLF' for qw(backtick open); +$bits{$_}{4} = 'OPpOPEN_IN_RAW' for qw(backtick open); +$bits{$_}{7} = 'OPpOPEN_OUT_CRLF' for qw(backtick open); +$bits{$_}{6} = 'OPpOPEN_OUT_RAW' for qw(backtick open); +$bits{$_}{6} = 'OPpOUR_INTRO' for qw(enteriter gvsv rv2av rv2hv rv2sv split); +$bits{$_}{6} = 'OPpPAD_STATE' for qw(lvavref lvref padav padhv padsv pushmark refassign); +$bits{$_}{7} = 'OPpPV_IS_UTF8' for qw(dump goto last next redo); +$bits{$_}{6} = 'OPpREFCOUNTED' for qw(leave leaveeval leavesub leavesublv leavewrite); +$bits{$_}{2} = 'OPpSLICEWARNING' for qw(aslice hslice padav padhv rv2av rv2hv); +$bits{$_}{4} = 'OPpTARGET_MY' for qw(abs add atan2 chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid); +$bits{$_}{5} = 'OPpTRANS_COMPLEMENT' for qw(trans transr); +$bits{$_}{7} = 'OPpTRANS_DELETE' for qw(trans transr); +$bits{$_}{0} = 'OPpTRANS_FROM_UTF' for qw(trans transr); +$bits{$_}{6} = 'OPpTRANS_GROWS' for qw(trans transr); +$bits{$_}{2} = 'OPpTRANS_IDENTICAL' for qw(trans transr); +$bits{$_}{3} = 'OPpTRANS_SQUASH' for qw(trans transr); +$bits{$_}{1} = 'OPpTRANS_TO_UTF' for qw(trans transr); +$bits{$_}{5} = 'OPpTRUEBOOL' for qw(grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst); + +my @bf = ( + { + label => '-', + mask_def => 'OPpARG1_MASK', + bitmin => 0, + bitmax => 0, + bitmask => 1, + }, + { + label => '-', + mask_def => 'OPpARG2_MASK', + bitmin => 0, + bitmax => 1, + bitmask => 3, + }, + { + label => 'offset', + mask_def => 'OPpAVHVSWITCH_MASK', + bitmin => 0, + bitmax => 1, + bitmask => 3, + }, + { + label => '-', + mask_def => 'OPpARG3_MASK', + bitmin => 0, + bitmax => 2, + bitmask => 7, + }, + { + label => '-', + mask_def => 'OPpARG4_MASK', + bitmin => 0, + bitmax => 3, + bitmask => 15, + }, + { + label => 'range', + mask_def => 'OPpPADRANGE_COUNTMASK', + bitcount_def => 'OPpPADRANGE_COUNTSHIFT', + bitmin => 0, + bitmax => 6, + bitmask => 127, + }, + { + label => 'key', + bitmin => 0, + bitmax => 7, + bitmask => 255, + }, + { + mask_def => 'OPpARGELEM_MASK', + bitmin => 1, + bitmax => 2, + bitmask => 6, + enum => [ + 0, 'OPpARGELEM_SV', 'SV', + 1, 'OPpARGELEM_AV', 'AV', + 2, 'OPpARGELEM_HV', 'HV', + ], + }, + { + mask_def => 'OPpDEREF', + bitmin => 4, + bitmax => 5, + bitmask => 48, + enum => [ + 1, 'OPpDEREF_AV', 'DREFAV', + 2, 'OPpDEREF_HV', 'DREFHV', + 3, 'OPpDEREF_SV', 'DREFSV', + ], + }, + { + mask_def => 'OPpLVREF_TYPE', + bitmin => 4, + bitmax => 5, + bitmask => 48, + enum => [ + 0, 'OPpLVREF_SV', 'SV', + 1, 'OPpLVREF_AV', 'AV', + 2, 'OPpLVREF_HV', 'HV', + 3, 'OPpLVREF_CV', 'CV', + ], + }, +); + +@{$bits{aassign}}{6,5,4,2,1,0} = ('OPpASSIGN_COMMON_SCALAR', 'OPpASSIGN_COMMON_RC1', 'OPpASSIGN_COMMON_AGG', 'OPpASSIGN_TRUEBOOL', $bf[1], $bf[1]); +$bits{abs}{0} = $bf[0]; +@{$bits{accept}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{add}}{1,0} = ($bf[1], $bf[1]); +$bits{aeach}{0} = $bf[0]; +@{$bits{aelem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]); +@{$bits{aelemfast}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]); +@{$bits{aelemfast_lex}}{7,6,5,4,3,2,1,0} = ($bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6], $bf[6]); +$bits{akeys}{0} = $bf[0]; +$bits{alarm}{0} = $bf[0]; +$bits{and}{0} = $bf[0]; +$bits{andassign}{0} = $bf[0]; +$bits{anonconst}{0} = $bf[0]; +@{$bits{anonhash}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{anonlist}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{argcheck}{0} = $bf[0]; +$bits{argdefelem}{0} = $bf[0]; +@{$bits{argelem}}{2,1,0} = ($bf[7], $bf[7], $bf[0]); +@{$bits{atan2}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{av2arylen}{0} = $bf[0]; +$bits{avalues}{0} = $bf[0]; +@{$bits{avhvswitch}}{1,0} = ($bf[2], $bf[2]); +$bits{backtick}{0} = $bf[0]; +@{$bits{bind}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{binmode}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{bit_and}}{1,0} = ($bf[1], $bf[1]); +@{$bits{bit_or}}{1,0} = ($bf[1], $bf[1]); +@{$bits{bit_xor}}{1,0} = ($bf[1], $bf[1]); +@{$bits{bless}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{caller}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{chdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{chmod}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{chomp}{0} = $bf[0]; +$bits{chop}{0} = $bf[0]; +@{$bits{chown}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{chr}{0} = $bf[0]; +$bits{chroot}{0} = $bf[0]; +@{$bits{close}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{closedir}{0} = $bf[0]; +$bits{complement}{0} = $bf[0]; +@{$bits{concat}}{6,1,0} = ('OPpCONCAT_NESTED', $bf[1], $bf[1]); +$bits{cond_expr}{0} = $bf[0]; +@{$bits{connect}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{const}}{6,4,3,2,1} = ('OPpCONST_BARE', 'OPpCONST_ENTERED', 'OPpCONST_STRICT', 'OPpCONST_SHORTCIRCUIT', 'OPpCONST_NOVER'); +@{$bits{coreargs}}{7,6,1,0} = ('OPpCOREARGS_PUSHMARK', 'OPpCOREARGS_SCALARMOD', 'OPpCOREARGS_DEREF2', 'OPpCOREARGS_DEREF1'); +$bits{cos}{0} = $bf[0]; +@{$bits{crypt}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{dbmclose}{0} = $bf[0]; +@{$bits{dbmopen}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{defined}{0} = $bf[0]; +@{$bits{delete}}{6,5,0} = ('OPpSLICE', 'OPpKVSLICE', $bf[0]); +@{$bits{die}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{divide}}{1,0} = ($bf[1], $bf[1]); +$bits{dofile}{0} = $bf[0]; +$bits{dor}{0} = $bf[0]; +$bits{dorassign}{0} = $bf[0]; +$bits{dump}{0} = $bf[0]; +$bits{each}{0} = $bf[0]; +@{$bits{entereval}}{5,4,3,2,1,0} = ('OPpEVAL_RE_REPARSING', 'OPpEVAL_COPHH', 'OPpEVAL_BYTES', 'OPpEVAL_UNICODE', 'OPpEVAL_HAS_HH', $bf[0]); +$bits{entergiven}{0} = $bf[0]; +$bits{enteriter}{3} = 'OPpITER_DEF'; +@{$bits{entersub}}{5,4,0} = ($bf[8], $bf[8], 'OPpENTERSUB_INARGS'); +$bits{entertry}{0} = $bf[0]; +$bits{enterwhen}{0} = $bf[0]; +@{$bits{enterwrite}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{eof}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{eq}}{1,0} = ($bf[1], $bf[1]); +@{$bits{exec}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{exists}}{6,0} = ('OPpEXISTS_SUB', $bf[0]); +@{$bits{exit}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{exp}{0} = $bf[0]; +$bits{fc}{0} = $bf[0]; +@{$bits{fcntl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{fileno}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{flip}{0} = $bf[0]; +@{$bits{flock}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{flop}{0} = $bf[0]; +@{$bits{formline}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{ftatime}{0} = $bf[0]; +$bits{ftbinary}{0} = $bf[0]; +$bits{ftblk}{0} = $bf[0]; +$bits{ftchr}{0} = $bf[0]; +$bits{ftctime}{0} = $bf[0]; +$bits{ftdir}{0} = $bf[0]; +$bits{fteexec}{0} = $bf[0]; +$bits{fteowned}{0} = $bf[0]; +$bits{fteread}{0} = $bf[0]; +$bits{ftewrite}{0} = $bf[0]; +$bits{ftfile}{0} = $bf[0]; +$bits{ftis}{0} = $bf[0]; +$bits{ftlink}{0} = $bf[0]; +$bits{ftmtime}{0} = $bf[0]; +$bits{ftpipe}{0} = $bf[0]; +$bits{ftrexec}{0} = $bf[0]; +$bits{ftrowned}{0} = $bf[0]; +$bits{ftrread}{0} = $bf[0]; +$bits{ftrwrite}{0} = $bf[0]; +$bits{ftsgid}{0} = $bf[0]; +$bits{ftsize}{0} = $bf[0]; +$bits{ftsock}{0} = $bf[0]; +$bits{ftsuid}{0} = $bf[0]; +$bits{ftsvtx}{0} = $bf[0]; +$bits{fttext}{0} = $bf[0]; +$bits{fttty}{0} = $bf[0]; +$bits{ftzero}{0} = $bf[0]; +@{$bits{ge}}{1,0} = ($bf[1], $bf[1]); +@{$bits{gelem}}{1,0} = ($bf[1], $bf[1]); +@{$bits{getc}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{getpeername}{0} = $bf[0]; +@{$bits{getpgrp}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{getpriority}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{getsockname}{0} = $bf[0]; +$bits{ggrgid}{0} = $bf[0]; +$bits{ggrnam}{0} = $bf[0]; +@{$bits{ghbyaddr}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{ghbyname}{0} = $bf[0]; +@{$bits{glob}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{gmtime}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{gnbyaddr}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{gnbyname}{0} = $bf[0]; +$bits{goto}{0} = $bf[0]; +$bits{gpbyname}{0} = $bf[0]; +@{$bits{gpbynumber}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{gpwnam}{0} = $bf[0]; +$bits{gpwuid}{0} = $bf[0]; +$bits{grepstart}{0} = $bf[0]; +$bits{grepwhile}{0} = $bf[0]; +@{$bits{gsbyname}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{gsbyport}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{gsockopt}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{gt}}{1,0} = ($bf[1], $bf[1]); +$bits{gv}{5} = 'OPpEARLY_CV'; +@{$bits{helem}}{5,4,1,0} = ($bf[8], $bf[8], $bf[1], $bf[1]); +$bits{hex}{0} = $bf[0]; +@{$bits{i_add}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_divide}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_eq}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_ge}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_gt}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_le}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_lt}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_modulo}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_multiply}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_ncmp}}{1,0} = ($bf[1], $bf[1]); +@{$bits{i_ne}}{1,0} = ($bf[1], $bf[1]); +$bits{i_negate}{0} = $bf[0]; +$bits{i_postdec}{0} = $bf[0]; +$bits{i_postinc}{0} = $bf[0]; +$bits{i_predec}{0} = $bf[0]; +$bits{i_preinc}{0} = $bf[0]; +@{$bits{i_subtract}}{1,0} = ($bf[1], $bf[1]); +@{$bits{index}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{int}{0} = $bf[0]; +@{$bits{ioctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{join}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{keys}{0} = $bf[0]; +@{$bits{kill}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{last}{0} = $bf[0]; +$bits{lc}{0} = $bf[0]; +$bits{lcfirst}{0} = $bf[0]; +@{$bits{le}}{1,0} = ($bf[1], $bf[1]); +$bits{leaveeval}{0} = $bf[0]; +$bits{leavegiven}{0} = $bf[0]; +@{$bits{leaveloop}}{1,0} = ($bf[1], $bf[1]); +$bits{leavesub}{0} = $bf[0]; +$bits{leavesublv}{0} = $bf[0]; +$bits{leavewhen}{0} = $bf[0]; +$bits{leavewrite}{0} = $bf[0]; +@{$bits{left_shift}}{1,0} = ($bf[1], $bf[1]); +$bits{length}{0} = $bf[0]; +@{$bits{link}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{list}{6} = 'OPpLIST_GUESSED'; +@{$bits{listen}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{localtime}{0} = $bf[0]; +$bits{lock}{0} = $bf[0]; +$bits{log}{0} = $bf[0]; +@{$bits{lslice}}{1,0} = ($bf[1], $bf[1]); +$bits{lstat}{0} = $bf[0]; +@{$bits{lt}}{1,0} = ($bf[1], $bf[1]); +$bits{lvavref}{0} = $bf[0]; +@{$bits{lvref}}{5,4,0} = ($bf[9], $bf[9], $bf[0]); +$bits{mapstart}{0} = $bf[0]; +$bits{mapwhile}{0} = $bf[0]; +$bits{method}{0} = $bf[0]; +$bits{method_named}{0} = $bf[0]; +$bits{method_redir}{0} = $bf[0]; +$bits{method_redir_super}{0} = $bf[0]; +$bits{method_super}{0} = $bf[0]; +@{$bits{mkdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{modulo}}{1,0} = ($bf[1], $bf[1]); +@{$bits{msgctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{msgget}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{msgrcv}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{msgsnd}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{multiconcat}}{6,5,3,0} = ('OPpMULTICONCAT_APPEND', 'OPpMULTICONCAT_FAKE', 'OPpMULTICONCAT_STRINGIFY', $bf[0]); +@{$bits{multideref}}{5,4,0} = ('OPpMULTIDEREF_DELETE', 'OPpMULTIDEREF_EXISTS', $bf[0]); +@{$bits{multiply}}{1,0} = ($bf[1], $bf[1]); +@{$bits{nbit_and}}{1,0} = ($bf[1], $bf[1]); +@{$bits{nbit_or}}{1,0} = ($bf[1], $bf[1]); +@{$bits{nbit_xor}}{1,0} = ($bf[1], $bf[1]); +@{$bits{ncmp}}{1,0} = ($bf[1], $bf[1]); +$bits{ncomplement}{0} = $bf[0]; +@{$bits{ne}}{1,0} = ($bf[1], $bf[1]); +$bits{negate}{0} = $bf[0]; +$bits{next}{0} = $bf[0]; +$bits{not}{0} = $bf[0]; +$bits{oct}{0} = $bf[0]; +$bits{once}{0} = $bf[0]; +@{$bits{open}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{open_dir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{or}{0} = $bf[0]; +$bits{orassign}{0} = $bf[0]; +$bits{ord}{0} = $bf[0]; +@{$bits{pack}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{padhv}{0} = 'OPpPADHV_ISKEYS'; +@{$bits{padrange}}{6,5,4,3,2,1,0} = ($bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5], $bf[5]); +@{$bits{padsv}}{5,4} = ($bf[8], $bf[8]); +@{$bits{pipe_op}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{pop}{0} = $bf[0]; +$bits{pos}{0} = $bf[0]; +$bits{postdec}{0} = $bf[0]; +$bits{postinc}{0} = $bf[0]; +@{$bits{pow}}{1,0} = ($bf[1], $bf[1]); +$bits{predec}{0} = $bf[0]; +$bits{preinc}{0} = $bf[0]; +$bits{prototype}{0} = $bf[0]; +@{$bits{push}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{quotemeta}{0} = $bf[0]; +@{$bits{rand}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{range}{0} = $bf[0]; +@{$bits{read}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{readdir}{0} = $bf[0]; +$bits{readline}{0} = $bf[0]; +$bits{readlink}{0} = $bf[0]; +@{$bits{recv}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{redo}{0} = $bf[0]; +$bits{ref}{0} = $bf[0]; +@{$bits{refassign}}{5,4,1,0} = ($bf[9], $bf[9], $bf[1], $bf[1]); +$bits{refgen}{0} = $bf[0]; +$bits{regcmaybe}{0} = $bf[0]; +$bits{regcomp}{0} = $bf[0]; +$bits{regcreset}{0} = $bf[0]; +@{$bits{rename}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{repeat}}{6,1,0} = ('OPpREPEAT_DOLIST', $bf[1], $bf[1]); +$bits{require}{0} = $bf[0]; +@{$bits{reset}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{reverse}}{3,0} = ('OPpREVERSE_INPLACE', $bf[0]); +$bits{rewinddir}{0} = $bf[0]; +@{$bits{right_shift}}{1,0} = ($bf[1], $bf[1]); +@{$bits{rindex}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{rmdir}{0} = $bf[0]; +$bits{rv2av}{0} = $bf[0]; +@{$bits{rv2cv}}{7,5,0} = ('OPpENTERSUB_NOPAREN', 'OPpMAY_RETURN_CONSTANT', $bf[0]); +@{$bits{rv2gv}}{6,5,4,2,0} = ('OPpALLOW_FAKE', $bf[8], $bf[8], 'OPpDONT_INIT_GV', $bf[0]); +$bits{rv2hv}{0} = 'OPpRV2HV_ISKEYS'; +@{$bits{rv2sv}}{5,4,0} = ($bf[8], $bf[8], $bf[0]); +@{$bits{sassign}}{7,6,1,0} = ('OPpASSIGN_CV_TO_GV', 'OPpASSIGN_BACKWARDS', $bf[1], $bf[1]); +@{$bits{sbit_and}}{1,0} = ($bf[1], $bf[1]); +@{$bits{sbit_or}}{1,0} = ($bf[1], $bf[1]); +@{$bits{sbit_xor}}{1,0} = ($bf[1], $bf[1]); +$bits{scalar}{0} = $bf[0]; +$bits{schomp}{0} = $bf[0]; +$bits{schop}{0} = $bf[0]; +@{$bits{scmp}}{1,0} = ($bf[1], $bf[1]); +$bits{scomplement}{0} = $bf[0]; +@{$bits{seek}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{seekdir}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{select}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{semctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{semget}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{semop}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{send}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{seq}}{1,0} = ($bf[1], $bf[1]); +@{$bits{setpgrp}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{setpriority}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{sge}}{1,0} = ($bf[1], $bf[1]); +@{$bits{sgt}}{1,0} = ($bf[1], $bf[1]); +$bits{shift}{0} = $bf[0]; +@{$bits{shmctl}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{shmget}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{shmread}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{shmwrite}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{shostent}{0} = $bf[0]; +@{$bits{shutdown}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{sin}{0} = $bf[0]; +@{$bits{sle}}{1,0} = ($bf[1], $bf[1]); +@{$bits{sleep}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{slt}}{1,0} = ($bf[1], $bf[1]); +@{$bits{smartmatch}}{1,0} = ($bf[1], $bf[1]); +@{$bits{sne}}{1,0} = ($bf[1], $bf[1]); +$bits{snetent}{0} = $bf[0]; +@{$bits{socket}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{sockpair}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{sort}}{7,6,4,3,2,1,0} = ('OPpSORT_UNSTABLE', 'OPpSORT_STABLE', 'OPpSORT_DESCEND', 'OPpSORT_INPLACE', 'OPpSORT_REVERSE', 'OPpSORT_INTEGER', 'OPpSORT_NUMERIC'); +@{$bits{splice}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{split}}{4,3,2} = ('OPpSPLIT_ASSIGN', 'OPpSPLIT_LEX', 'OPpSPLIT_IMPLIM'); +@{$bits{sprintf}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{sprotoent}{0} = $bf[0]; +$bits{sqrt}{0} = $bf[0]; +@{$bits{srand}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{srefgen}{0} = $bf[0]; +@{$bits{sselect}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{sservent}{0} = $bf[0]; +@{$bits{ssockopt}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{stat}{0} = $bf[0]; +@{$bits{stringify}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{study}{0} = $bf[0]; +$bits{substcont}{0} = $bf[0]; +@{$bits{substr}}{4,2,1,0} = ('OPpSUBSTR_REPL_FIRST', $bf[3], $bf[3], $bf[3]); +@{$bits{subtract}}{1,0} = ($bf[1], $bf[1]); +@{$bits{symlink}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{syscall}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{sysopen}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{sysread}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{sysseek}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{system}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{syswrite}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{tell}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{telldir}{0} = $bf[0]; +@{$bits{tie}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{tied}{0} = $bf[0]; +@{$bits{truncate}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{uc}{0} = $bf[0]; +$bits{ucfirst}{0} = $bf[0]; +@{$bits{umask}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{undef}{0} = $bf[0]; +@{$bits{unlink}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{unpack}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{unshift}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{untie}{0} = $bf[0]; +@{$bits{utime}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +$bits{values}{0} = $bf[0]; +@{$bits{vec}}{1,0} = ($bf[1], $bf[1]); +@{$bits{waitpid}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{warn}}{3,2,1,0} = ($bf[4], $bf[4], $bf[4], $bf[4]); +@{$bits{xor}}{1,0} = ($bf[1], $bf[1]); + + +our %defines = ( + OPpALLOW_FAKE => 64, + OPpARG1_MASK => 1, + OPpARG2_MASK => 3, + OPpARG3_MASK => 7, + OPpARG4_MASK => 15, + OPpARGELEM_AV => 2, + OPpARGELEM_HV => 4, + OPpARGELEM_MASK => 6, + OPpARGELEM_SV => 0, + OPpASSIGN_BACKWARDS => 64, + OPpASSIGN_COMMON_AGG => 16, + OPpASSIGN_COMMON_RC1 => 32, + OPpASSIGN_COMMON_SCALAR => 64, + OPpASSIGN_CV_TO_GV => 128, + OPpASSIGN_TRUEBOOL => 4, + OPpAVHVSWITCH_MASK => 3, + OPpCONCAT_NESTED => 64, + OPpCONST_BARE => 64, + OPpCONST_ENTERED => 16, + OPpCONST_NOVER => 2, + OPpCONST_SHORTCIRCUIT => 4, + OPpCONST_STRICT => 8, + OPpCOREARGS_DEREF1 => 1, + OPpCOREARGS_DEREF2 => 2, + OPpCOREARGS_PUSHMARK => 128, + OPpCOREARGS_SCALARMOD => 64, + OPpDEREF => 48, + OPpDEREF_AV => 16, + OPpDEREF_HV => 32, + OPpDEREF_SV => 48, + OPpDONT_INIT_GV => 4, + OPpEARLY_CV => 32, + OPpENTERSUB_AMPER => 8, + OPpENTERSUB_DB => 64, + OPpENTERSUB_HASTARG => 4, + OPpENTERSUB_INARGS => 1, + OPpENTERSUB_NOPAREN => 128, + OPpEVAL_BYTES => 8, + OPpEVAL_COPHH => 16, + OPpEVAL_HAS_HH => 2, + OPpEVAL_RE_REPARSING => 32, + OPpEVAL_UNICODE => 4, + OPpEXISTS_SUB => 64, + OPpFLIP_LINENUM => 64, + OPpFT_ACCESS => 2, + OPpFT_AFTER_t => 16, + OPpFT_STACKED => 4, + OPpFT_STACKING => 8, + OPpHINT_STRICT_REFS => 2, + OPpHUSH_VMSISH => 32, + OPpINDEX_BOOLNEG => 64, + OPpITER_DEF => 8, + OPpITER_REVERSED => 2, + OPpKVSLICE => 32, + OPpLIST_GUESSED => 64, + OPpLVALUE => 128, + OPpLVAL_DEFER => 64, + OPpLVAL_INTRO => 128, + OPpLVREF_AV => 16, + OPpLVREF_CV => 48, + OPpLVREF_ELEM => 4, + OPpLVREF_HV => 32, + OPpLVREF_ITER => 8, + OPpLVREF_SV => 0, + OPpLVREF_TYPE => 48, + OPpMAYBE_LVSUB => 8, + OPpMAYBE_TRUEBOOL => 16, + OPpMAY_RETURN_CONSTANT => 32, + OPpMULTICONCAT_APPEND => 64, + OPpMULTICONCAT_FAKE => 32, + OPpMULTICONCAT_STRINGIFY => 8, + OPpMULTIDEREF_DELETE => 32, + OPpMULTIDEREF_EXISTS => 16, + OPpOFFBYONE => 128, + OPpOPEN_IN_CRLF => 32, + OPpOPEN_IN_RAW => 16, + OPpOPEN_OUT_CRLF => 128, + OPpOPEN_OUT_RAW => 64, + OPpOUR_INTRO => 64, + OPpPADHV_ISKEYS => 1, + OPpPADRANGE_COUNTMASK => 127, + OPpPADRANGE_COUNTSHIFT => 7, + OPpPAD_STATE => 64, + OPpPV_IS_UTF8 => 128, + OPpREFCOUNTED => 64, + OPpREPEAT_DOLIST => 64, + OPpREVERSE_INPLACE => 8, + OPpRV2HV_ISKEYS => 1, + OPpSLICE => 64, + OPpSLICEWARNING => 4, + OPpSORT_DESCEND => 16, + OPpSORT_INPLACE => 8, + OPpSORT_INTEGER => 2, + OPpSORT_NUMERIC => 1, + OPpSORT_REVERSE => 4, + OPpSORT_STABLE => 64, + OPpSORT_UNSTABLE => 128, + OPpSPLIT_ASSIGN => 16, + OPpSPLIT_IMPLIM => 4, + OPpSPLIT_LEX => 8, + OPpSUBSTR_REPL_FIRST => 16, + OPpTARGET_MY => 16, + OPpTRANS_COMPLEMENT => 32, + OPpTRANS_DELETE => 128, + OPpTRANS_FROM_UTF => 1, + OPpTRANS_GROWS => 64, + OPpTRANS_IDENTICAL => 4, + OPpTRANS_SQUASH => 8, + OPpTRANS_TO_UTF => 2, + OPpTRUEBOOL => 32, +); + +our %labels = ( + OPpALLOW_FAKE => 'FAKE', + OPpARGELEM_AV => 'AV', + OPpARGELEM_HV => 'HV', + OPpARGELEM_SV => 'SV', + OPpASSIGN_BACKWARDS => 'BKWARD', + OPpASSIGN_COMMON_AGG => 'COM_AGG', + OPpASSIGN_COMMON_RC1 => 'COM_RC1', + OPpASSIGN_COMMON_SCALAR => 'COM_SCALAR', + OPpASSIGN_CV_TO_GV => 'CV2GV', + OPpASSIGN_TRUEBOOL => 'BOOL', + OPpCONCAT_NESTED => 'NESTED', + OPpCONST_BARE => 'BARE', + OPpCONST_ENTERED => 'ENTERED', + OPpCONST_NOVER => 'NOVER', + OPpCONST_SHORTCIRCUIT => 'SHORT', + OPpCONST_STRICT => 'STRICT', + OPpCOREARGS_DEREF1 => 'DEREF1', + OPpCOREARGS_DEREF2 => 'DEREF2', + OPpCOREARGS_PUSHMARK => 'MARK', + OPpCOREARGS_SCALARMOD => '$MOD', + OPpDEREF_AV => 'DREFAV', + OPpDEREF_HV => 'DREFHV', + OPpDEREF_SV => 'DREFSV', + OPpDONT_INIT_GV => 'NOINIT', + OPpEARLY_CV => 'EARLYCV', + OPpENTERSUB_AMPER => 'AMPER', + OPpENTERSUB_DB => 'DBG', + OPpENTERSUB_HASTARG => 'TARG', + OPpENTERSUB_INARGS => 'INARGS', + OPpENTERSUB_NOPAREN => 'NO()', + OPpEVAL_BYTES => 'BYTES', + OPpEVAL_COPHH => 'COPHH', + OPpEVAL_HAS_HH => 'HAS_HH', + OPpEVAL_RE_REPARSING => 'REPARSE', + OPpEVAL_UNICODE => 'UNI', + OPpEXISTS_SUB => 'SUB', + OPpFLIP_LINENUM => 'LINENUM', + OPpFT_ACCESS => 'FTACCESS', + OPpFT_AFTER_t => 'FTAFTERt', + OPpFT_STACKED => 'FTSTACKED', + OPpFT_STACKING => 'FTSTACKING', + OPpHINT_STRICT_REFS => 'STRICT', + OPpHUSH_VMSISH => 'HUSH', + OPpINDEX_BOOLNEG => 'NEG', + OPpITER_DEF => 'DEF', + OPpITER_REVERSED => 'REVERSED', + OPpKVSLICE => 'KVSLICE', + OPpLIST_GUESSED => 'GUESSED', + OPpLVALUE => 'LV', + OPpLVAL_DEFER => 'LVDEFER', + OPpLVAL_INTRO => 'LVINTRO', + OPpLVREF_AV => 'AV', + OPpLVREF_CV => 'CV', + OPpLVREF_ELEM => 'ELEM', + OPpLVREF_HV => 'HV', + OPpLVREF_ITER => 'ITER', + OPpLVREF_SV => 'SV', + OPpMAYBE_LVSUB => 'LVSUB', + OPpMAYBE_TRUEBOOL => 'BOOL?', + OPpMAY_RETURN_CONSTANT => 'CONST', + OPpMULTICONCAT_APPEND => 'APPEND', + OPpMULTICONCAT_FAKE => 'FAKE', + OPpMULTICONCAT_STRINGIFY => 'STRINGIFY', + OPpMULTIDEREF_DELETE => 'DELETE', + OPpMULTIDEREF_EXISTS => 'EXISTS', + OPpOFFBYONE => '+1', + OPpOPEN_IN_CRLF => 'INCR', + OPpOPEN_IN_RAW => 'INBIN', + OPpOPEN_OUT_CRLF => 'OUTCR', + OPpOPEN_OUT_RAW => 'OUTBIN', + OPpOUR_INTRO => 'OURINTR', + OPpPADHV_ISKEYS => 'KEYS', + OPpPAD_STATE => 'STATE', + OPpPV_IS_UTF8 => 'UTF', + OPpREFCOUNTED => 'REFC', + OPpREPEAT_DOLIST => 'DOLIST', + OPpREVERSE_INPLACE => 'INPLACE', + OPpRV2HV_ISKEYS => 'KEYS', + OPpSLICE => 'SLICE', + OPpSLICEWARNING => 'SLICEWARN', + OPpSORT_DESCEND => 'DESC', + OPpSORT_INPLACE => 'INPLACE', + OPpSORT_INTEGER => 'INT', + OPpSORT_NUMERIC => 'NUM', + OPpSORT_REVERSE => 'REV', + OPpSORT_STABLE => 'STABLE', + OPpSORT_UNSTABLE => 'UNSTABLE', + OPpSPLIT_ASSIGN => 'ASSIGN', + OPpSPLIT_IMPLIM => 'IMPLIM', + OPpSPLIT_LEX => 'LEX', + OPpSUBSTR_REPL_FIRST => 'REPL1ST', + OPpTARGET_MY => 'TARGMY', + OPpTRANS_COMPLEMENT => 'COMPL', + OPpTRANS_DELETE => 'DEL', + OPpTRANS_FROM_UTF => ' 'GROWS', + OPpTRANS_IDENTICAL => 'IDENT', + OPpTRANS_SQUASH => 'SQUASH', + OPpTRANS_TO_UTF => '>UTF', + OPpTRUEBOOL => 'BOOL', +); + + +our %ops_using = ( + OPpALLOW_FAKE => [qw(rv2gv)], + OPpASSIGN_BACKWARDS => [qw(sassign)], + OPpASSIGN_COMMON_AGG => [qw(aassign)], + OPpCONCAT_NESTED => [qw(concat)], + OPpCONST_BARE => [qw(const)], + OPpCOREARGS_DEREF1 => [qw(coreargs)], + OPpEARLY_CV => [qw(gv)], + OPpENTERSUB_AMPER => [qw(entersub rv2cv)], + OPpENTERSUB_INARGS => [qw(entersub)], + OPpENTERSUB_NOPAREN => [qw(rv2cv)], + OPpEVAL_BYTES => [qw(entereval)], + OPpEXISTS_SUB => [qw(exists)], + OPpFLIP_LINENUM => [qw(flip flop)], + OPpFT_ACCESS => [qw(fteexec fteread ftewrite ftrexec ftrread ftrwrite)], + OPpFT_AFTER_t => [qw(ftatime ftbinary ftblk ftchr ftctime ftdir fteexec fteowned fteread ftewrite ftfile ftis ftlink ftmtime ftpipe ftrexec ftrowned ftrread ftrwrite ftsgid ftsize ftsock ftsuid ftsvtx fttext fttty ftzero)], + OPpHINT_STRICT_REFS => [qw(entersub multideref rv2av rv2cv rv2gv rv2hv rv2sv)], + OPpHUSH_VMSISH => [qw(dbstate nextstate)], + OPpINDEX_BOOLNEG => [qw(index rindex)], + OPpITER_DEF => [qw(enteriter)], + OPpITER_REVERSED => [qw(enteriter iter)], + OPpKVSLICE => [qw(delete)], + OPpLIST_GUESSED => [qw(list)], + OPpLVALUE => [qw(leave leaveloop)], + OPpLVAL_DEFER => [qw(aelem helem multideref)], + OPpLVAL_INTRO => [qw(aelem aslice cond_expr delete enteriter entersub gvsv helem hslice list lvavref lvref lvrefslice multiconcat multideref padav padhv padrange padsv pushmark refassign rv2av rv2gv rv2hv rv2sv split)], + OPpLVREF_ELEM => [qw(lvref refassign)], + OPpMAYBE_LVSUB => [qw(aassign aelem akeys aslice av2arylen avhvswitch helem hslice keys kvaslice kvhslice multideref padav padhv pos rv2av rv2gv rv2hv substr values vec)], + OPpMAYBE_TRUEBOOL => [qw(padhv ref rv2hv)], + OPpMULTICONCAT_APPEND => [qw(multiconcat)], + OPpMULTIDEREF_DELETE => [qw(multideref)], + OPpOFFBYONE => [qw(caller runcv wantarray)], + OPpOPEN_IN_CRLF => [qw(backtick open)], + OPpOUR_INTRO => [qw(enteriter gvsv rv2av rv2hv rv2sv split)], + OPpPADHV_ISKEYS => [qw(padhv)], + OPpPAD_STATE => [qw(lvavref lvref padav padhv padsv pushmark refassign)], + OPpPV_IS_UTF8 => [qw(dump goto last next redo)], + OPpREFCOUNTED => [qw(leave leaveeval leavesub leavesublv leavewrite)], + OPpREPEAT_DOLIST => [qw(repeat)], + OPpREVERSE_INPLACE => [qw(reverse)], + OPpRV2HV_ISKEYS => [qw(rv2hv)], + OPpSLICEWARNING => [qw(aslice hslice padav padhv rv2av rv2hv)], + OPpSORT_DESCEND => [qw(sort)], + OPpSPLIT_ASSIGN => [qw(split)], + OPpSUBSTR_REPL_FIRST => [qw(substr)], + OPpTARGET_MY => [qw(abs add atan2 chdir chmod chomp chown chr chroot concat cos crypt divide exec exp flock getpgrp getppid getpriority hex i_add i_divide i_modulo i_multiply i_subtract index int kill left_shift length link log mkdir modulo multiconcat multiply nbit_and nbit_or nbit_xor ncomplement oct ord pow push rand rename right_shift rindex rmdir schomp scomplement setpgrp setpriority sin sleep sqrt srand stringify subtract symlink system time unlink unshift utime wait waitpid)], + OPpTRANS_COMPLEMENT => [qw(trans transr)], + OPpTRUEBOOL => [qw(grepwhile index length padav padhv pos ref rindex rv2av rv2hv subst)], +); + +$ops_using{OPpASSIGN_COMMON_RC1} = $ops_using{OPpASSIGN_COMMON_AGG}; +$ops_using{OPpASSIGN_COMMON_SCALAR} = $ops_using{OPpASSIGN_COMMON_AGG}; +$ops_using{OPpASSIGN_CV_TO_GV} = $ops_using{OPpASSIGN_BACKWARDS}; +$ops_using{OPpASSIGN_TRUEBOOL} = $ops_using{OPpASSIGN_COMMON_AGG}; +$ops_using{OPpCONST_ENTERED} = $ops_using{OPpCONST_BARE}; +$ops_using{OPpCONST_NOVER} = $ops_using{OPpCONST_BARE}; +$ops_using{OPpCONST_SHORTCIRCUIT} = $ops_using{OPpCONST_BARE}; +$ops_using{OPpCONST_STRICT} = $ops_using{OPpCONST_BARE}; +$ops_using{OPpCOREARGS_DEREF2} = $ops_using{OPpCOREARGS_DEREF1}; +$ops_using{OPpCOREARGS_PUSHMARK} = $ops_using{OPpCOREARGS_DEREF1}; +$ops_using{OPpCOREARGS_SCALARMOD} = $ops_using{OPpCOREARGS_DEREF1}; +$ops_using{OPpDONT_INIT_GV} = $ops_using{OPpALLOW_FAKE}; +$ops_using{OPpENTERSUB_DB} = $ops_using{OPpENTERSUB_AMPER}; +$ops_using{OPpENTERSUB_HASTARG} = $ops_using{OPpENTERSUB_AMPER}; +$ops_using{OPpEVAL_COPHH} = $ops_using{OPpEVAL_BYTES}; +$ops_using{OPpEVAL_HAS_HH} = $ops_using{OPpEVAL_BYTES}; +$ops_using{OPpEVAL_RE_REPARSING} = $ops_using{OPpEVAL_BYTES}; +$ops_using{OPpEVAL_UNICODE} = $ops_using{OPpEVAL_BYTES}; +$ops_using{OPpFT_STACKED} = $ops_using{OPpFT_AFTER_t}; +$ops_using{OPpFT_STACKING} = $ops_using{OPpFT_AFTER_t}; +$ops_using{OPpLVREF_ITER} = $ops_using{OPpLVREF_ELEM}; +$ops_using{OPpMAY_RETURN_CONSTANT} = $ops_using{OPpENTERSUB_NOPAREN}; +$ops_using{OPpMULTICONCAT_FAKE} = $ops_using{OPpMULTICONCAT_APPEND}; +$ops_using{OPpMULTICONCAT_STRINGIFY} = $ops_using{OPpMULTICONCAT_APPEND}; +$ops_using{OPpMULTIDEREF_EXISTS} = $ops_using{OPpMULTIDEREF_DELETE}; +$ops_using{OPpOPEN_IN_RAW} = $ops_using{OPpOPEN_IN_CRLF}; +$ops_using{OPpOPEN_OUT_CRLF} = $ops_using{OPpOPEN_IN_CRLF}; +$ops_using{OPpOPEN_OUT_RAW} = $ops_using{OPpOPEN_IN_CRLF}; +$ops_using{OPpSLICE} = $ops_using{OPpKVSLICE}; +$ops_using{OPpSORT_INPLACE} = $ops_using{OPpSORT_DESCEND}; +$ops_using{OPpSORT_INTEGER} = $ops_using{OPpSORT_DESCEND}; +$ops_using{OPpSORT_NUMERIC} = $ops_using{OPpSORT_DESCEND}; +$ops_using{OPpSORT_REVERSE} = $ops_using{OPpSORT_DESCEND}; +$ops_using{OPpSORT_STABLE} = $ops_using{OPpSORT_DESCEND}; +$ops_using{OPpSORT_UNSTABLE} = $ops_using{OPpSORT_DESCEND}; +$ops_using{OPpSPLIT_IMPLIM} = $ops_using{OPpSPLIT_ASSIGN}; +$ops_using{OPpSPLIT_LEX} = $ops_using{OPpSPLIT_ASSIGN}; +$ops_using{OPpTRANS_DELETE} = $ops_using{OPpTRANS_COMPLEMENT}; +$ops_using{OPpTRANS_FROM_UTF} = $ops_using{OPpTRANS_COMPLEMENT}; +$ops_using{OPpTRANS_GROWS} = $ops_using{OPpTRANS_COMPLEMENT}; +$ops_using{OPpTRANS_IDENTICAL} = $ops_using{OPpTRANS_COMPLEMENT}; +$ops_using{OPpTRANS_SQUASH} = $ops_using{OPpTRANS_COMPLEMENT}; +$ops_using{OPpTRANS_TO_UTF} = $ops_using{OPpTRANS_COMPLEMENT}; + +# ex: set ro: +package B::Debug; + +our $VERSION = '1.26'; +BEGIN { if ($] >= 5.027001) { require deprecate; import deprecate; } } + +use strict; +require 5.006; +use B qw(peekop walkoptree walkoptree_exec + main_start main_root cstring sv_undef SVf_NOK SVf_IOK); +use Config; +my (@optype, @specialsv_name); +require B; +if ($] < 5.009) { + require B::Asmdata; + B::Asmdata->import (qw(@optype @specialsv_name)); +} else { + B->import (qw(@optype @specialsv_name)); +} + +if ($] < 5.006002) { + eval q|sub B::GV::SAFENAME { + my $name = (shift())->NAME; + # The regex below corresponds to the isCONTROLVAR macro from toke.c + $name =~ s/^([\cA-\cZ\c\\c[\c]\c?\c_\c^])/"^".chr(64 ^ ord($1))/e; + return $name; + }|; +} + +my ($have_B_Flags, $have_B_Flags_extra); +if (!$ENV{PERL_CORE}){ # avoid CORE test crashes + eval { require B::Flags and $have_B_Flags++ }; + $have_B_Flags_extra++ if $have_B_Flags and $B::Flags::VERSION gt '0.03'; +} +my %done_gv; + +sub _printop { + my $op = shift; + my $addr = ${$op} ? $op->ppaddr : ''; + $addr =~ s/^PL_ppaddr// if $addr; + if (${$op}) { + return sprintf "0x%08x %6s %s", ${$op}, B::class($op), $addr; + } else { + return sprintf "0x%x %6s %s", ${$op}, '', $addr; + } +} + +sub B::OP::debug { + my ($op) = @_; + printf <<'EOT', B::class($op), $$op, _printop($op), _printop($op->next), _printop($op->sibling), $op->targ, $op->type, $op->name; +%s (0x%lx) + op_ppaddr %s + op_next %s + op_sibling %s + op_targ %d + op_type %d %s +EOT + if ($] > 5.009) { + printf <<'EOT', $op->opt; + op_opt %d +EOT + } else { + printf <<'EOT', $op->seq; + op_seq %d +EOT + } + if ($have_B_Flags) { + printf <<'EOT', $op->flags, $op->flagspv, $op->private, $op->privatepv; + op_flags %u %s + op_private %u %s +EOT + } else { + printf <<'EOT', $op->flags, $op->private; + op_flags %u + op_private %u +EOT + } + if ($op->can('rettype')) { + printf <<'EOT', $op->rettype; + op_rettype %u +EOT + } +} + +sub B::UNOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_first\t%s\n", _printop($op->first); +} + +sub B::BINOP::debug { + my ($op) = @_; + $op->B::UNOP::debug(); + printf "\top_last \t%s\n", _printop($op->last); +} + +sub B::LOOP::debug { + my ($op) = @_; + $op->B::BINOP::debug(); + printf <<'EOT', _printop($op->redoop), _printop($op->nextop), _printop($op->lastop); + op_redoop %s + op_nextop %s + op_lastop %s +EOT +} + +sub B::LOGOP::debug { + my ($op) = @_; + $op->B::UNOP::debug(); + printf "\top_other\t%s\n", _printop($op->other); +} + +sub B::LISTOP::debug { + my ($op) = @_; + $op->B::BINOP::debug(); + printf "\top_children\t%d\n", $op->children; +} + +sub B::PMOP::debug { + my ($op) = @_; + $op->B::LISTOP::debug(); + printf "\top_pmreplroot\t0x%x\n", $] < 5.008 ? ${$op->pmreplroot} : $op->pmreplroot; + printf "\top_pmreplstart\t0x%x\n", ${$op->pmreplstart}; + printf "\top_pmnext\t0x%x\n", ${$op->pmnext} if $] < 5.009005; + if ($Config{'useithreads'}) { + printf "\top_pmstashpv\t%s\n", cstring($op->pmstashpv); + printf "\top_pmoffset\t%d\n", $op->pmoffset; + } else { + printf "\top_pmstash\t%s\n", cstring($op->pmstash); + } + printf "\top_precomp\t%s\n", cstring($op->precomp); + printf "\top_pmflags\t0x%x\n", $op->pmflags; + printf "\top_reflags\t0x%x\n", $op->reflags if $] >= 5.009; + printf "\top_pmpermflags\t0x%x\n", $op->pmpermflags if $] < 5.009; + printf "\top_pmdynflags\t0x%x\n", $op->pmdynflags if $] < 5.009; + $op->pmreplroot->debug if $] < 5.008; +} + +sub B::COP::debug { + my ($op) = @_; + $op->B::OP::debug(); + my $warnings = ref $op->warnings ? ${$op->warnings} : 0; + printf <<'EOT', $op->label, $op->stashpv, $op->file, $op->cop_seq, $op->arybase, $op->line, $warnings; + cop_label "%s" + cop_stashpv "%s" + cop_file "%s" + cop_seq %d + cop_arybase %d + cop_line %d + cop_warnings 0x%x +EOT + if ($] > 5.008 and $] < 5.011) { + my $cop_io = B::class($op->io) eq 'SPECIAL' ? '' : $op->io->as_string; + printf(" cop_io %s\n", cstring($cop_io)); + } +} + +sub B::SVOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_sv\t\t0x%x\n", ${$op->sv}; + $op->sv->debug; +} + +sub B::METHOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + if (${$op->first}) { + printf "\top_first\t0x%x\n", ${$op->first}; + $op->first->debug; + } else { + printf "\top_meth_sv\t0x%x\n", ${$op->meth_sv}; + $op->meth_sv->debug; + } +} + +sub B::UNOP_AUX::debug { + my ($op) = @_; + $op->B::OP::debug(); + # string and perl5 aux_list needs the cv + # cperl has aux, Concise,-debug leaves it empty + if ($op->can('aux')) { + printf "\top_aux\t%s\n", cstring($op->aux); + } +} + +sub B::PVOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_pv\t\t%s\n", cstring($op->pv); +} + +sub B::PADOP::debug { + my ($op) = @_; + $op->B::OP::debug(); + printf "\top_padix\t%ld\n", $op->padix; +} + +sub B::NULL::debug { + my ($sv) = @_; + if ($$sv == ${sv_undef()}) { + print "&sv_undef\n"; + } else { + printf "NULL (0x%x)\n", $$sv; + } +} + +sub B::SV::debug { + my ($sv) = @_; + if (!$$sv) { + print B::class($sv), " = NULL\n"; + return; + } + printf <<'EOT', B::class($sv), $$sv, $sv->REFCNT; +%s (0x%x) + REFCNT %d +EOT + printf "\tFLAGS\t\t0x%x", $sv->FLAGS; + if ($have_B_Flags) { + printf "\t%s", $have_B_Flags_extra ? $sv->flagspv(0) : $sv->flagspv; + } + print "\n"; +} + +sub B::RV::debug { + my ($rv) = @_; + B::SV::debug($rv); + printf <<'EOT', ${$rv->RV}; + RV 0x%x +EOT + $rv->RV->debug; +} + +sub B::PV::debug { + my ($sv) = @_; + $sv->B::SV::debug(); + my $pv = $sv->PV(); + printf <<'EOT', cstring($pv), $sv->CUR, $sv->LEN; + xpv_pv %s + xpv_cur %d + xpv_len %d +EOT +} + +sub B::IV::debug { + my ($sv) = @_; + $sv->B::SV::debug(); + printf "\txiv_iv\t\t%d\n", $sv->IV if $sv->FLAGS & SVf_IOK; +} + +sub B::NV::debug { + my ($sv) = @_; + $sv->B::IV::debug(); + printf "\txnv_nv\t\t%s\n", $sv->NV if $sv->FLAGS & SVf_NOK; +} + +sub B::PVIV::debug { + my ($sv) = @_; + $sv->B::PV::debug(); + printf "\txiv_iv\t\t%d\n", $sv->IV if $sv->FLAGS & SVf_IOK; +} + +sub B::PVNV::debug { + my ($sv) = @_; + $sv->B::PVIV::debug(); + printf "\txnv_nv\t\t%s\n", $sv->NV if $sv->FLAGS & SVf_NOK; +} + +sub B::PVLV::debug { + my ($sv) = @_; + $sv->B::PVNV::debug(); + printf "\txlv_targoff\t%d\n", $sv->TARGOFF; + printf "\txlv_targlen\t%u\n", $sv->TARGLEN; + printf "\txlv_type\t%s\n", cstring(chr($sv->TYPE)); +} + +sub B::BM::debug { + my ($sv) = @_; + $sv->B::PVNV::debug(); + printf "\txbm_useful\t%d\n", $sv->USEFUL; + printf "\txbm_previous\t%u\n", $sv->PREVIOUS; + printf "\txbm_rare\t%s\n", cstring(chr($sv->RARE)); +} + +sub B::CV::debug { + my ($cv) = @_; + $cv->B::PVNV::debug(); + my $stash = $cv->STASH; + my $start = $cv->START; + my $root = $cv->ROOT; + my $padlist = $cv->PADLIST; + my $file = $cv->FILE; + my $gv; + printf <<'EOT', $$stash, $$start, $$root; + STASH 0x%x + START 0x%x + ROOT 0x%x +EOT + if ($cv->can('NAME_HEK') && $cv->NAME_HEK) { + printf("\tNAME\t%%s\n", $cv->NAME_HEK); + } + elsif ( $]>5.017 && ($cv->FLAGS & 0x40000)) { #lexsub + printf("\tNAME\t%%s\n", $cv->NAME_HEK); + } else { + $gv = $cv->GV; + printf("\tGV\t%0x%x\t%s\n", $$gv, $gv->SAFENAME); + } + printf <<'EOT', $file, $cv->DEPTH, $padlist, ${$cv->OUTSIDE}; + FILE %s + DEPTH %d + PADLIST 0x%x + OUTSIDE 0x%x +EOT + printf("\tOUTSIDE_SEQ\t%d\n", $cv->OUTSIDE_SEQ) if $] > 5.007; + if ($have_B_Flags) { + my $SVt_PVCV = $] < 5.010 ? 12 : 13; + printf("\tCvFLAGS\t0x%x\t%s\n", $cv->CvFLAGS, + $have_B_Flags_extra ? $cv->flagspv($SVt_PVCV) : $cv->flagspv); + } else { + printf("\tCvFLAGS\t0x%x\n", $cv->CvFLAGS); + } + printf("\tSIGOP\t0x%x\n", $cv->SIGOP) if $cv->can('SIGOP'); + $start->debug if $start; + $root->debug if $root; + $gv->debug if $gv; + $padlist->debug if $padlist; +} + +sub B::AV::debug { + my ($av) = @_; + $av->B::SV::debug; + _array_debug($av); +} + +sub _array_debug { + my ($av) = @_; + # tied arrays may leave out FETCHSIZE + my (@array) = eval { $av->ARRAY; }; + print "\tARRAY\t\t(", join(", ", map("0x" . $$_, @array)), ")\n"; + my $fill = eval { scalar(@array) }; + if ($Config{'useithreads'} && B::class($av) ne 'PADLIST') { + printf <<'EOT', $fill, $av->MAX, $av->OFF; + FILL %d + MAX %d + OFF %d +EOT + } else { + printf <<'EOT', $fill, $av->MAX; + FILL %d + MAX %d +EOT + } + if ($] < 5.009) { + if ($have_B_Flags) { + printf("\tAvFLAGS\t0x%x\t%s\n", $av->AvFLAGS, + $have_B_Flags_extra ? $av->flagspv(10) : $av->flagspv); + } else { + printf("\tAvFLAGS\t0x%x\n", $av->AvFLAGS); + } + } +} + +sub B::GV::debug { + my ($gv) = @_; + if ($done_gv{$$gv}++) { + printf "GV %s::%s\n", $gv->STASH->NAME, $gv->SAFENAME; + return; + } + my $sv = $gv->SV; + my $av = $gv->AV; + my $cv = $gv->CV; + $gv->B::SV::debug; + printf <<'EOT', $gv->SAFENAME, $gv->STASH->NAME, $gv->STASH, $$sv, $gv->GvREFCNT, $gv->FORM, $$av, ${$gv->HV}, ${$gv->EGV}, $$cv, $gv->CVGEN, $gv->LINE, $gv->FILE, $gv->GvFLAGS; + NAME %s + STASH %s (0x%x) + SV 0x%x + GvREFCNT %d + FORM 0x%x + AV 0x%x + HV 0x%x + EGV 0x%x + CV 0x%x + CVGEN %d + LINE %d + FILE %s +EOT + if ($have_B_Flags) { + my $SVt_PVGV = $] < 5.010 ? 13 : 9; + printf("\tGvFLAGS\t0x%x\t%s\n", $gv->GvFLAGS, + $have_B_Flags_extra ? $gv->flagspv($SVt_PVGV) : $gv->flagspv); + } else { + printf("\tGvFLAGS\t0x%x\n", $gv->GvFLAGS); + } + $sv->debug if $sv; + $av->debug if $av; + $cv->debug if $cv; +} + +sub B::SPECIAL::debug { + my $sv = shift; + my $i = ref $sv ? $$sv : 0; + print defined $specialsv_name[$i] ? $specialsv_name[$i] : "", "\n"; +} + +sub B::PADLIST::debug { + my ($padlist) = @_; + printf <<'EOT', B::class($padlist), $$padlist, $padlist->REFCNT; +%s (0x%x) + REFCNT %d +EOT + _array_debug($padlist); +} + +sub compile { + my $order = shift; + B::clearsym(); + $DB::single = 1 if defined &DB::DB; + if ($order && $order eq "exec") { + return sub { walkoptree_exec(main_start, "debug") } + } else { + return sub { walkoptree(main_root, "debug") } + } +} + +1; + +__END__ + + +# Net::SMTP.pm +# +# Copyright (C) 1995-2004 Graham Barr. All rights reserved. +# Copyright (C) 2013-2016 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::SMTP; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use IO::Socket; +use Net::Cmd; +use Net::Config; +use Socket; + +our $VERSION = "3.11"; + +# Code for detecting if we can use SSL +my $ssl_class = eval { + require IO::Socket::SSL; + # first version with default CA on most platforms + no warnings 'numeric'; + IO::Socket::SSL->VERSION(2.007); +} && 'IO::Socket::SSL'; + +my $nossl_warn = !$ssl_class && + 'To use SSL please install IO::Socket::SSL with version>=2.007'; + +# Code for detecting if we can use IPv6 +my $family_key = 'Domain'; +my $inet6_class = eval { + require IO::Socket::IP; + no warnings 'numeric'; + IO::Socket::IP->VERSION(0.25) || die; + $family_key = 'Family'; +} && 'IO::Socket::IP' || eval { + require IO::Socket::INET6; + no warnings 'numeric'; + IO::Socket::INET6->VERSION(2.62); +} && 'IO::Socket::INET6'; + +sub can_ssl { $ssl_class }; +sub can_inet6 { $inet6_class }; + +our @ISA = ('Net::Cmd', $inet6_class || 'IO::Socket::INET'); + +sub new { + my $self = shift; + my $type = ref($self) || $self; + my ($host, %arg); + if (@_ % 2) { + $host = shift; + %arg = @_; + } + else { + %arg = @_; + $host = delete $arg{Host}; + } + + if ($arg{SSL}) { + # SSL from start + die $nossl_warn if !$ssl_class; + $arg{Port} ||= 465; + } + + my $hosts = defined $host ? $host : $NetConfig{smtp_hosts}; + my $obj; + + $arg{Timeout} = 120 if ! defined $arg{Timeout}; + + foreach my $h (@{ref($hosts) ? $hosts : [$hosts]}) { + $obj = $type->SUPER::new( + PeerAddr => ($host = $h), + PeerPort => $arg{Port} || 'smtp(25)', + LocalAddr => $arg{LocalAddr}, + LocalPort => $arg{LocalPort}, + $family_key => $arg{Domain} || $arg{Family}, + Proto => 'tcp', + Timeout => $arg{Timeout} + ) + and last; + } + + return + unless defined $obj; + + ${*$obj}{'net_smtp_arg'} = \%arg; + ${*$obj}{'net_smtp_host'} = $host; + + if ($arg{SSL}) { + Net::SMTP::_SSL->start_SSL($obj,%arg) + or return; + } + + $obj->autoflush(1); + + $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef); + + unless ($obj->response() == CMD_OK) { + my $err = ref($obj) . ": " . $obj->code . " " . $obj->message; + $obj->close(); + $@ = $err; + return; + } + + ${*$obj}{'net_smtp_exact_addr'} = $arg{ExactAddresses}; + + (${*$obj}{'net_smtp_banner'}) = $obj->message; + (${*$obj}{'net_smtp_domain'}) = $obj->message =~ /\A\s*(\S+)/; + + if (!exists $arg{SendHello} || $arg{SendHello}) { + unless ($obj->hello($arg{Hello} || "")) { + my $err = ref($obj) . ": " . $obj->code . " " . $obj->message; + $obj->close(); + $@ = $err; + return; + } + } + + $obj; +} + + +sub host { + my $me = shift; + ${*$me}{'net_smtp_host'}; +} + +## +## User interface methods +## + + +sub banner { + my $me = shift; + + return ${*$me}{'net_smtp_banner'} || undef; +} + + +sub domain { + my $me = shift; + + return ${*$me}{'net_smtp_domain'} || undef; +} + + +sub etrn { + my $self = shift; + defined($self->supports('ETRN', 500, ["Command unknown: 'ETRN'"])) + && $self->_ETRN(@_); +} + + +sub auth { + my ($self, $username, $password) = @_; + + eval { + require MIME::Base64; + require Authen::SASL; + } or $self->set_status(500, ["Need MIME::Base64 and Authen::SASL todo auth"]), return 0; + + my $mechanisms = $self->supports('AUTH', 500, ["Command unknown: 'AUTH'"]); + return unless defined $mechanisms; + + my $sasl; + + if (ref($username) and UNIVERSAL::isa($username, 'Authen::SASL')) { + $sasl = $username; + my $requested_mechanisms = $sasl->mechanism(); + if (! defined($requested_mechanisms) || $requested_mechanisms eq '') { + $sasl->mechanism($mechanisms); + } + } + else { + die "auth(username, password)" if not length $username; + $sasl = Authen::SASL->new( + mechanism => $mechanisms, + callback => { + user => $username, + pass => $password, + authname => $username, + }, + debug => $self->debug + ); + } + + my $client; + my $str; + do { + if ($client) { + # $client mechanism failed, so we need to exclude this mechanism from list + my $failed_mechanism = $client->mechanism; + return unless defined $failed_mechanism; + $self->debug_text("Auth mechanism failed: $failed_mechanism") + if $self->debug; + $mechanisms =~ s/\b\Q$failed_mechanism\E\b//; + return unless $mechanisms =~ /\S/; + $sasl->mechanism($mechanisms); + } + + # We should probably allow the user to pass the host, but I don't + # currently know and SASL mechanisms that are used by smtp that need it + + $client = $sasl->client_new('smtp', ${*$self}{'net_smtp_host'}, 0); + $str = $client->client_start; + } while (!defined $str); + + # We don't support sasl mechanisms that encrypt the socket traffic. + # todo that we would really need to change the ISA hierarchy + # so we don't inherit from IO::Socket, but instead hold it in an attribute + + my @cmd = ("AUTH", $client->mechanism); + my $code; + + push @cmd, MIME::Base64::encode_base64($str, '') + if defined $str and length $str; + + while (($code = $self->command(@cmd)->response()) == CMD_MORE) { + my $str2 = MIME::Base64::decode_base64(($self->message)[0]); + $self->debug_print(0, "(decoded) " . $str2 . "\n") if $self->debug; + + $str = $client->client_step($str2); + @cmd = ( + MIME::Base64::encode_base64($str, '') + ); + + $self->debug_print(1, "(decoded) " . $str . "\n") if $self->debug; + } + + $code == CMD_OK; +} + + +sub hello { + my $me = shift; + my $domain = shift || "localhost.localdomain"; + my $ok = $me->_EHLO($domain); + my @msg = $me->message; + + if ($ok) { + my $h = ${*$me}{'net_smtp_esmtp'} = {}; + foreach my $ln (@msg) { + $h->{uc $1} = $2 + if $ln =~ /([-\w]+)\b[= \t]*([^\n]*)/; + } + } + elsif ($me->status == CMD_ERROR) { + @msg = $me->message + if $ok = $me->_HELO($domain); + } + + return unless $ok; + ${*$me}{net_smtp_hello_domain} = $domain; + + $msg[0] =~ /\A\s*(\S+)/; + return ($1 || " "); +} + +sub starttls { + my $self = shift; + $ssl_class or die $nossl_warn; + $self->_STARTTLS or return; + Net::SMTP::_SSL->start_SSL($self, + %{ ${*$self}{'net_smtp_arg'} }, # (ssl) args given in new + @_ # more (ssl) args + ) or return; + + # another hello after starttls to read new ESMTP capabilities + return $self->hello(${*$self}{net_smtp_hello_domain}); +} + + +sub supports { + my $self = shift; + my $cmd = uc shift; + return ${*$self}{'net_smtp_esmtp'}->{$cmd} + if exists ${*$self}{'net_smtp_esmtp'}->{$cmd}; + $self->set_status(@_) + if @_; + return; +} + + +sub _addr { + my $self = shift; + my $addr = shift; + $addr = "" unless defined $addr; + + if (${*$self}{'net_smtp_exact_addr'}) { + return $1 if $addr =~ /^\s*(<.*>)\s*$/s; + } + else { + return $1 if $addr =~ /(<[^>]*>)/; + $addr =~ s/^\s+|\s+$//sg; + } + + "<$addr>"; +} + + +sub mail { + my $me = shift; + my $addr = _addr($me, shift); + my $opts = ""; + + if (@_) { + my %opt = @_; + my ($k, $v); + + if (exists ${*$me}{'net_smtp_esmtp'}) { + my $esmtp = ${*$me}{'net_smtp_esmtp'}; + + if (defined($v = delete $opt{Size})) { + if (exists $esmtp->{SIZE}) { + $opts .= sprintf " SIZE=%d", $v + 0; + } + else { + carp 'Net::SMTP::mail: SIZE option not supported by host'; + } + } + + if (defined($v = delete $opt{Return})) { + if (exists $esmtp->{DSN}) { + $opts .= " RET=" . ((uc($v) eq "FULL") ? "FULL" : "HDRS"); + } + else { + carp 'Net::SMTP::mail: DSN option not supported by host'; + } + } + + if (defined($v = delete $opt{Bits})) { + if ($v eq "8") { + if (exists $esmtp->{'8BITMIME'}) { + $opts .= " BODY=8BITMIME"; + } + else { + carp 'Net::SMTP::mail: 8BITMIME option not supported by host'; + } + } + elsif ($v eq "binary") { + if (exists $esmtp->{'BINARYMIME'} && exists $esmtp->{'CHUNKING'}) { + $opts .= " BODY=BINARYMIME"; + ${*$me}{'net_smtp_chunking'} = 1; + } + else { + carp 'Net::SMTP::mail: BINARYMIME option not supported by host'; + } + } + elsif (exists $esmtp->{'8BITMIME'} or exists $esmtp->{'BINARYMIME'}) { + $opts .= " BODY=7BIT"; + } + else { + carp 'Net::SMTP::mail: 8BITMIME and BINARYMIME options not supported by host'; + } + } + + if (defined($v = delete $opt{Transaction})) { + if (exists $esmtp->{CHECKPOINT}) { + $opts .= " TRANSID=" . _addr($me, $v); + } + else { + carp 'Net::SMTP::mail: CHECKPOINT option not supported by host'; + } + } + + if (defined($v = delete $opt{Envelope})) { + if (exists $esmtp->{DSN}) { + $v =~ s/([^\041-\176]|=|\+)/sprintf "+%02X", ord($1)/sge; + $opts .= " ENVID=$v"; + } + else { + carp 'Net::SMTP::mail: DSN option not supported by host'; + } + } + + if (defined($v = delete $opt{ENVID})) { + + # expected to be in a format as required by RFC 3461, xtext-encoded + if (exists $esmtp->{DSN}) { + $opts .= " ENVID=$v"; + } + else { + carp 'Net::SMTP::mail: DSN option not supported by host'; + } + } + + if (defined($v = delete $opt{AUTH})) { + + # expected to be in a format as required by RFC 2554, + # rfc2821-quoted and xtext-encoded, or <> + if (exists $esmtp->{AUTH}) { + $v = '<>' if !defined($v) || $v eq ''; + $opts .= " AUTH=$v"; + } + else { + carp 'Net::SMTP::mail: AUTH option not supported by host'; + } + } + + if (defined($v = delete $opt{XVERP})) { + if (exists $esmtp->{'XVERP'}) { + $opts .= " XVERP"; + } + else { + carp 'Net::SMTP::mail: XVERP option not supported by host'; + } + } + + carp 'Net::SMTP::recipient: unknown option(s) ' . join(" ", keys %opt) . ' - ignored' + if scalar keys %opt; + } + else { + carp 'Net::SMTP::mail: ESMTP not supported by host - options discarded :-('; + } + } + + $me->_MAIL("FROM:" . $addr . $opts); +} + + +sub send { my $me = shift; $me->_SEND("FROM:" . _addr($me, $_[0])) } +sub send_or_mail { my $me = shift; $me->_SOML("FROM:" . _addr($me, $_[0])) } +sub send_and_mail { my $me = shift; $me->_SAML("FROM:" . _addr($me, $_[0])) } + + +sub reset { + my $me = shift; + + $me->dataend() + if (exists ${*$me}{'net_smtp_lastch'}); + + $me->_RSET(); +} + + +sub recipient { + my $smtp = shift; + my $opts = ""; + my $skip_bad = 0; + + if (@_ && ref($_[-1])) { + my %opt = %{pop(@_)}; + my $v; + + $skip_bad = delete $opt{'SkipBad'}; + + if (exists ${*$smtp}{'net_smtp_esmtp'}) { + my $esmtp = ${*$smtp}{'net_smtp_esmtp'}; + + if (defined($v = delete $opt{Notify})) { + if (exists $esmtp->{DSN}) { + $opts .= " NOTIFY=" . join(",", map { uc $_ } @$v); + } + else { + carp 'Net::SMTP::recipient: DSN option not supported by host'; + } + } + + if (defined($v = delete $opt{ORcpt})) { + if (exists $esmtp->{DSN}) { + $opts .= " ORCPT=" . $v; + } + else { + carp 'Net::SMTP::recipient: DSN option not supported by host'; + } + } + + carp 'Net::SMTP::recipient: unknown option(s) ' . join(" ", keys %opt) . ' - ignored' + if scalar keys %opt; + } + elsif (%opt) { + carp 'Net::SMTP::recipient: ESMTP not supported by host - options discarded :-('; + } + } + + my @ok; + foreach my $addr (@_) { + if ($smtp->_RCPT("TO:" . _addr($smtp, $addr) . $opts)) { + push(@ok, $addr) if $skip_bad; + } + elsif (!$skip_bad) { + return 0; + } + } + + return $skip_bad ? @ok : 1; +} + +BEGIN { + *to = \&recipient; + *cc = \&recipient; + *bcc = \&recipient; +} + + +sub data { + my $me = shift; + + if (exists ${*$me}{'net_smtp_chunking'}) { + carp 'Net::SMTP::data: CHUNKING extension in use, must call bdat instead'; + } + else { + my $ok = $me->_DATA() && $me->datasend(@_); + + $ok && @_ + ? $me->dataend + : $ok; + } +} + + +sub bdat { + my $me = shift; + + if (exists ${*$me}{'net_smtp_chunking'}) { + my $data = shift; + + $me->_BDAT(length $data) + && $me->rawdatasend($data) + && $me->response() == CMD_OK; + } + else { + carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead'; + } +} + + +sub bdatlast { + my $me = shift; + + if (exists ${*$me}{'net_smtp_chunking'}) { + my $data = shift; + + $me->_BDAT(length $data, "LAST") + && $me->rawdatasend($data) + && $me->response() == CMD_OK; + } + else { + carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead'; + } +} + + +sub datafh { + my $me = shift; + return unless $me->_DATA(); + return $me->tied_fh; +} + + +sub expand { + my $me = shift; + + $me->_EXPN(@_) + ? ($me->message) + : (); +} + + +sub verify { shift->_VRFY(@_) } + + +sub help { + my $me = shift; + + $me->_HELP(@_) + ? scalar $me->message + : undef; +} + + +sub quit { + my $me = shift; + + $me->_QUIT; + $me->close; +} + + +sub DESTROY { + + # ignore +} + +## +## RFC821 commands +## + + +sub _EHLO { shift->command("EHLO", @_)->response() == CMD_OK } +sub _HELO { shift->command("HELO", @_)->response() == CMD_OK } +sub _MAIL { shift->command("MAIL", @_)->response() == CMD_OK } +sub _RCPT { shift->command("RCPT", @_)->response() == CMD_OK } +sub _SEND { shift->command("SEND", @_)->response() == CMD_OK } +sub _SAML { shift->command("SAML", @_)->response() == CMD_OK } +sub _SOML { shift->command("SOML", @_)->response() == CMD_OK } +sub _VRFY { shift->command("VRFY", @_)->response() == CMD_OK } +sub _EXPN { shift->command("EXPN", @_)->response() == CMD_OK } +sub _HELP { shift->command("HELP", @_)->response() == CMD_OK } +sub _RSET { shift->command("RSET")->response() == CMD_OK } +sub _NOOP { shift->command("NOOP")->response() == CMD_OK } +sub _QUIT { shift->command("QUIT")->response() == CMD_OK } +sub _DATA { shift->command("DATA")->response() == CMD_MORE } +sub _BDAT { shift->command("BDAT", @_) } +sub _TURN { shift->unsupported(@_); } +sub _ETRN { shift->command("ETRN", @_)->response() == CMD_OK } +sub _AUTH { shift->command("AUTH", @_)->response() == CMD_OK } +sub _STARTTLS { shift->command("STARTTLS")->response() == CMD_OK } + + +{ + package Net::SMTP::_SSL; + our @ISA = ( $ssl_class ? ($ssl_class):(), 'Net::SMTP' ); + sub starttls { die "SMTP connection is already in SSL mode" } + sub start_SSL { + my ($class,$smtp,%arg) = @_; + delete @arg{ grep { !m{^SSL_} } keys %arg }; + ( $arg{SSL_verifycn_name} ||= $smtp->host ) + =~s{(?can_client_sni; + $arg{SSL_verifycn_scheme} ||= 'smtp'; + my $ok = $class->SUPER::start_SSL($smtp,%arg); + $@ = $ssl_class->errstr if !$ok; + return $ok; + } +} + + + +1; + +__END__ + +package Net::hostent; +use strict; + +use 5.006_001; +our $VERSION = '1.02'; +our (@EXPORT, @EXPORT_OK, %EXPORT_TAGS); +our ( + $h_name, @h_aliases, + $h_addrtype, $h_length, + @h_addr_list, $h_addr +); + +BEGIN { + use Exporter (); + @EXPORT = qw(gethostbyname gethostbyaddr gethost); + @EXPORT_OK = qw( + $h_name @h_aliases + $h_addrtype $h_length + @h_addr_list $h_addr + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); +} + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'Net::hostent' => [ + name => '$', + aliases => '@', + addrtype => '$', + 'length' => '$', + addr_list => '@', +]; + +sub addr { shift->addr_list->[0] } + +sub populate (@) { + return unless @_; + my $hob = new(); + $h_name = $hob->[0] = $_[0]; + @h_aliases = @{ $hob->[1] } = split ' ', $_[1]; + $h_addrtype = $hob->[2] = $_[2]; + $h_length = $hob->[3] = $_[3]; + $h_addr = $_[4]; + @h_addr_list = @{ $hob->[4] } = @_[ (4 .. $#_) ]; + return $hob; +} + +sub gethostbyname ($) { populate(CORE::gethostbyname(shift)) } + +sub gethostbyaddr ($;$) { + my ($addr, $addrtype); + $addr = shift; + require Socket unless @_; + $addrtype = @_ ? shift : Socket::AF_INET(); + populate(CORE::gethostbyaddr($addr, $addrtype)) +} + +sub gethost($) { + if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) { + require Socket; + &gethostbyaddr(Socket::inet_aton(shift)); + } else { + &gethostbyname; + } +} + +1; +__END__ + +# Net::Domain.pm +# +# Copyright (C) 1995-1998 Graham Barr. All rights reserved. +# Copyright (C) 2013-2014 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::Domain; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Exporter; +use Net::Config; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(hostname hostdomain hostfqdn domainname); +our $VERSION = "3.11"; + +my ($host, $domain, $fqdn) = (undef, undef, undef); + +# Try every conceivable way to get hostname. + + +sub _hostname { + + # we already know it + return $host + if (defined $host); + + if ($^O eq 'MSWin32') { + require Socket; + my ($name, $alias, $type, $len, @addr) = gethostbyname($ENV{'COMPUTERNAME'} || 'localhost'); + while (@addr) { + my $a = shift(@addr); + $host = gethostbyaddr($a, Socket::AF_INET()); + last if defined $host; + } + if (defined($host) && index($host, '.') > 0) { + $fqdn = $host; + ($host, $domain) = $fqdn =~ /^([^.]+)\.(.*)$/; + } + return $host; + } + elsif ($^O eq 'MacOS') { + chomp($host = `hostname`); + } + elsif ($^O eq 'VMS') { ## multiple varieties of net s/w makes this hard + $host = $ENV{'UCX$INET_HOST'} if defined($ENV{'UCX$INET_HOST'}); + $host = $ENV{'MULTINET_HOST_NAME'} if defined($ENV{'MULTINET_HOST_NAME'}); + if (index($host, '.') > 0) { + $fqdn = $host; + ($host, $domain) = $fqdn =~ /^([^.]+)\.(.*)$/; + } + return $host; + } + else { + local $SIG{'__DIE__'}; + + # syscall is preferred since it avoids tainting problems + eval { + my $tmp = "\0" x 256; ## preload scalar + eval { + package main; + require "syscall.ph"; ## no critic (Modules::RequireBarewordIncludes) + defined(&main::SYS_gethostname); + } + || eval { + package main; + require "sys/syscall.ph"; ## no critic (Modules::RequireBarewordIncludes) + defined(&main::SYS_gethostname); + } + and $host = + (syscall(&main::SYS_gethostname, $tmp, 256) == 0) + ? $tmp + : undef; + } + + # POSIX + || eval { + require POSIX; + $host = (POSIX::uname())[1]; + } + + # trusty old hostname command + || eval { + chop($host = `(hostname) 2>/dev/null`); # BSD'ish + } + + # sysV/POSIX uname command (may truncate) + || eval { + chop($host = `uname -n 2>/dev/null`); ## SYSV'ish && POSIX'ish + } + + # Apollo pre-SR10 + || eval { $host = (split(/[:. ]/, `/com/host`, 6))[0]; } + + || eval { $host = ""; }; + } + + # remove garbage + $host =~ s/[\0\r\n]+//go; + $host =~ s/(\A\.+|\.+\Z)//go; + $host =~ s/\.\.+/\./go; + + $host; +} + + +sub _hostdomain { + + # we already know it + return $domain + if (defined $domain); + + local $SIG{'__DIE__'}; + + return $domain = $NetConfig{'inet_domain'} + if defined $NetConfig{'inet_domain'}; + + # try looking in /etc/resolv.conf + # putting this here and assuming that it is correct, eliminates + # calls to gethostbyname, and therefore DNS lookups. This helps + # those on dialup systems. + + local ($_); + + if (open(my $res, '<', "/etc/resolv.conf")) { + while (<$res>) { + $domain = $1 + if (/\A\s*(?:domain|search)\s+(\S+)/); + } + close($res); + + return $domain + if (defined $domain); + } + + # just try hostname and system calls + + my $host = _hostname(); + my (@hosts); + + @hosts = ($host, "localhost"); + + unless (defined($host) && $host =~ /\./) { + my $dom = undef; + eval { + my $tmp = "\0" x 256; ## preload scalar + eval { + package main; + require "syscall.ph"; ## no critic (Modules::RequireBarewordIncludes) + } + || eval { + package main; + require "sys/syscall.ph"; ## no critic (Modules::RequireBarewordIncludes) + } + and $dom = + (syscall(&main::SYS_getdomainname, $tmp, 256) == 0) + ? $tmp + : undef; + }; + + if ($^O eq 'VMS') { + $dom ||= $ENV{'TCPIP$INET_DOMAIN'} + || $ENV{'UCX$INET_DOMAIN'}; + } + + chop($dom = `domainname 2>/dev/null`) + unless (defined $dom || $^O =~ /^(?:cygwin|MSWin32|android)/); + + if (defined $dom) { + my @h = (); + $dom =~ s/^\.+//; + while (length($dom)) { + push(@h, "$host.$dom"); + $dom =~ s/^[^.]+.+// or last; + } + unshift(@hosts, @h); + } + } + + # Attempt to locate FQDN + + foreach (grep { defined $_ } @hosts) { + my @info = gethostbyname($_); + + next unless @info; + + # look at real name & aliases + foreach my $site ($info[0], split(/ /, $info[1])) { + if (rindex($site, ".") > 0) { + + # Extract domain from FQDN + + ($domain = $site) =~ s/\A[^.]+\.//; + return $domain; + } + } + } + + # Look for environment variable + + $domain ||= $ENV{LOCALDOMAIN} || $ENV{DOMAIN}; + + if (defined $domain) { + $domain =~ s/[\r\n\0]+//g; + $domain =~ s/(\A\.+|\.+\Z)//g; + $domain =~ s/\.\.+/\./g; + } + + $domain; +} + + +sub domainname { + + return $fqdn + if (defined $fqdn); + + _hostname(); + + # *.local names are special on darwin. If we call gethostbyname below, it + # may hang while waiting for another, non-existent computer to respond. + if($^O eq 'darwin' && $host =~ /\.local$/) { + return $host; + } + + _hostdomain(); + + # Assumption: If the host name does not contain a period + # and the domain name does, then assume that they are correct + # this helps to eliminate calls to gethostbyname, and therefore + # eliminate DNS lookups + + return $fqdn = $host . "." . $domain + if (defined $host + and defined $domain + and $host !~ /\./ + and $domain =~ /\./); + + # For hosts that have no name, just an IP address + return $fqdn = $host if defined $host and $host =~ /^\d+(\.\d+){3}$/; + + my @host = defined $host ? split(/\./, $host) : ('localhost'); + my @domain = defined $domain ? split(/\./, $domain) : (); + my @fqdn = (); + + # Determine from @host & @domain the FQDN + + my @d = @domain; + +LOOP: + while (1) { + my @h = @host; + while (@h) { + my $tmp = join(".", @h, @d); + if ((gethostbyname($tmp))[0]) { + @fqdn = (@h, @d); + $fqdn = $tmp; + last LOOP; + } + pop @h; + } + last unless shift @d; + } + + if (@fqdn) { + $host = shift @fqdn; + until ((gethostbyname($host))[0]) { + $host .= "." . shift @fqdn; + } + $domain = join(".", @fqdn); + } + else { + undef $host; + undef $domain; + undef $fqdn; + } + + $fqdn; +} + + +sub hostfqdn { domainname() } + + +sub hostname { + domainname() + unless (defined $host); + return $host; +} + + +sub hostdomain { + domainname() + unless (defined $domain); + return $domain; +} + +1; # Keep require happy + +__END__ + +package Net::protoent; +use strict; + +use 5.006_001; +our $VERSION = '1.01'; +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); +our ( $p_name, @p_aliases, $p_proto ); +BEGIN { + use Exporter (); + @EXPORT = qw(getprotobyname getprotobynumber getprotoent getproto); + @EXPORT_OK = qw( $p_name @p_aliases $p_proto ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); +} + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'Net::protoent' => [ + name => '$', + aliases => '@', + proto => '$', +]; + +sub populate (@) { + return unless @_; + my $pob = new(); + $p_name = $pob->[0] = $_[0]; + @p_aliases = @{ $pob->[1] } = split ' ', $_[1]; + $p_proto = $pob->[2] = $_[2]; + return $pob; +} + +sub getprotoent ( ) { populate(CORE::getprotoent()) } +sub getprotobyname ($) { populate(CORE::getprotobyname(shift)) } +sub getprotobynumber ($) { populate(CORE::getprotobynumber(shift)) } + +sub getproto ($;$) { + no strict 'refs'; + return &{'getprotoby' . ($_[0]=~/^\d+$/ ? 'number' : 'name')}(@_); +} + +1; + +__END__ + +# Net::Time.pm +# +# Copyright (C) 1995-2004 Graham Barr. All rights reserved. +# Copyright (C) 2014 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::Time; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Exporter; +use IO::Select; +use IO::Socket; +use Net::Config; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(inet_time inet_daytime); + +our $VERSION = "3.11"; + +our $TIMEOUT = 120; + +sub _socket { + my ($pname, $pnum, $host, $proto, $timeout) = @_; + + $proto ||= 'udp'; + + my $port = (getservbyname($pname, $proto))[2] || $pnum; + + my $hosts = defined $host ? [$host] : $NetConfig{$pname . '_hosts'}; + + my $me; + + foreach my $addr (@$hosts) { + $me = IO::Socket::INET->new( + PeerAddr => $addr, + PeerPort => $port, + Proto => $proto + ) + and last; + } + + return unless $me; + + $me->send("\n") + if $proto eq 'udp'; + + $timeout = $TIMEOUT + unless defined $timeout; + + IO::Select->new($me)->can_read($timeout) + ? $me + : undef; +} + + +sub inet_time { + my $s = _socket('time', 37, @_) || return; + my $buf = ''; + my $offset = 0 | 0; + + return + unless defined $s->recv($buf, length(pack("N", 0))); + + # unpack, we | 0 to ensure we have an unsigned + my $time = (unpack("N", $buf))[0] | 0; + + # the time protocol return time in seconds since 1900, convert + # it to a the required format + + if ($^O eq "MacOS") { + + # MacOS return seconds since 1904, 1900 was not a leap year. + $offset = (4 * 31536000) | 0; + } + else { + + # otherwise return seconds since 1972, there were 17 leap years between + # 1900 and 1972 + $offset = (70 * 31536000 + 17 * 86400) | 0; + } + + $time - $offset; +} + + +sub inet_daytime { + my $s = _socket('daytime', 13, @_) || return; + my $buf = ''; + + defined($s->recv($buf, 1024)) + ? $buf + : undef; +} + +1; + +__END__ + +package Net::servent; +use strict; + +use 5.006_001; +our $VERSION = '1.02'; +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); +our ( $s_name, @s_aliases, $s_port, $s_proto ); +BEGIN { + use Exporter (); + @EXPORT = qw(getservbyname getservbyport getservent getserv); + @EXPORT_OK = qw( $s_name @s_aliases $s_port $s_proto ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); +} + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'Net::servent' => [ + name => '$', + aliases => '@', + port => '$', + proto => '$', +]; + +sub populate (@) { + return unless @_; + my $sob = new(); + $s_name = $sob->[0] = $_[0]; + @s_aliases = @{ $sob->[1] } = split ' ', $_[1]; + $s_port = $sob->[2] = $_[2]; + $s_proto = $sob->[3] = $_[3]; + return $sob; +} + +sub getservent ( ) { populate(CORE::getservent()) } +sub getservbyname ($;$) { populate(CORE::getservbyname(shift,shift||'tcp')) } +sub getservbyport ($;$) { populate(CORE::getservbyport(shift,shift||'tcp')) } + +sub getserv ($;$) { + no strict 'refs'; + return &{'getservby' . ($_[0]=~/^\d+$/ ? 'port' : 'name')}(@_); +} + +1; + +__END__ + +package Net::Ping; + +require 5.002; +require Exporter; + +use strict; +our $hires; +use Fcntl qw( F_GETFL F_SETFL O_NONBLOCK ); +use Socket qw( SOCK_DGRAM SOCK_STREAM SOCK_RAW AF_INET PF_INET IPPROTO_TCP + SOL_SOCKET SO_ERROR SO_BROADCAST + IPPROTO_IP IP_TOS IP_TTL + inet_ntoa inet_aton getnameinfo sockaddr_in ); +use POSIX qw( ENOTCONN ECONNREFUSED ECONNRESET EINPROGRESS EWOULDBLOCK EAGAIN + WNOHANG ); +use FileHandle; +use Carp; +use Time::HiRes; + +our @ISA = qw(Exporter); +our @EXPORT = qw(pingecho); +our @EXPORT_OK = qw(wakeonlan); +our $VERSION = "2.62"; + +# Globals + +our $def_timeout = 5; # Default timeout to wait for a reply +our $def_proto = "tcp"; # Default protocol to use for pinging +our $def_factor = 1.2; # Default exponential backoff rate. +our $def_family = AF_INET; # Default family. +our $max_datasize = 1024; # Maximum data bytes in a packet +# The data we exchange with the server for the stream protocol +our $pingstring = "pingschwingping!\n"; +our $source_verify = 1; # Default is to verify source endpoint +our $syn_forking = 0; + +# Constants + +my $AF_INET6 = eval { Socket::AF_INET6() } || 30; +my $AF_UNSPEC = eval { Socket::AF_UNSPEC() }; +my $AI_NUMERICHOST = eval { Socket::AI_NUMERICHOST() } || 4; +my $NI_NUMERICHOST = eval { Socket::NI_NUMERICHOST() } || 2; +my $IPPROTO_IPV6 = eval { Socket::IPPROTO_IPV6() } || 41; +#my $IPV6_HOPLIMIT = eval { Socket::IPV6_HOPLIMIT() }; # ping6 -h 0-255 +my $qr_family = qr/^(?:(?:(:?ip)?v?(?:4|6))|${\AF_INET}|$AF_INET6)$/; +my $qr_family4 = qr/^(?:(?:(:?ip)?v?4)|${\AF_INET})$/; + +if ($^O =~ /Win32/i) { + # Hack to avoid this Win32 spewage: + # Your vendor has not defined POSIX macro ECONNREFUSED + my @pairs = (ECONNREFUSED => 10061, # "Unknown Error" Special Win32 Response? + ENOTCONN => 10057, + ECONNRESET => 10054, + EINPROGRESS => 10036, + EWOULDBLOCK => 10035, + ); + while (my $name = shift @pairs) { + my $value = shift @pairs; + # When defined, these all are non-zero + unless (eval $name) { + no strict 'refs'; + *{$name} = defined prototype \&{$name} ? sub () {$value} : sub {$value}; + } + } +# $syn_forking = 1; # XXX possibly useful in < Win2K ? +}; + +# Description: The pingecho() subroutine is provided for backward +# compatibility with the original Net::Ping. It accepts a host +# name/IP and an optional timeout in seconds. Create a tcp ping +# object and try pinging the host. The result of the ping is returned. + +sub pingecho +{ + my ($host, # Name or IP number of host to ping + $timeout # Optional timeout in seconds + ) = @_; + my ($p); # A ping object + + $p = Net::Ping->new("tcp", $timeout); + $p->ping($host); # Going out of scope closes the connection +} + +# Description: The new() method creates a new ping object. Optional +# parameters may be specified for the protocol to use, the timeout in +# seconds and the size in bytes of additional data which should be +# included in the packet. +# After the optional parameters are checked, the data is constructed +# and a socket is opened if appropriate. The object is returned. + +sub new +{ + my ($this, + $proto, # Optional protocol to use for pinging + $timeout, # Optional timeout in seconds + $data_size, # Optional additional bytes of data + $device, # Optional device to use + $tos, # Optional ToS to set + $ttl, # Optional TTL to set + $family, # Optional address family (AF_INET) + ) = @_; + my $class = ref($this) || $this; + my $self = {}; + my ($cnt, # Count through data bytes + $min_datasize # Minimum data bytes required + ); + + bless($self, $class); + if (ref $proto eq 'HASH') { # support named args + for my $k (qw(proto timeout data_size device tos ttl family + gateway host port bind retrans pingstring source_verify + econnrefused dontfrag + IPV6_USE_MIN_MTU IPV6_RECVPATHMTU IPV6_HOPLIMIT)) + { + if (exists $proto->{$k}) { + $self->{$k} = $proto->{$k}; + # some are still globals + if ($k eq 'pingstring') { $pingstring = $proto->{$k} } + if ($k eq 'source_verify') { $source_verify = $proto->{$k} } + delete $proto->{$k}; + } + } + if (%$proto) { + croak("Invalid named argument: ",join(" ",keys (%$proto))); + } + $proto = $self->{'proto'}; + } + + $proto = $def_proto unless $proto; # Determine the protocol + croak('Protocol for ping must be "icmp", "icmpv6", "udp", "tcp", "syn", "stream" or "external"') + unless $proto =~ m/^(icmp|icmpv6|udp|tcp|syn|stream|external)$/; + $self->{proto} = $proto; + + $timeout = $def_timeout unless $timeout; # Determine the timeout + croak("Default timeout for ping must be greater than 0 seconds") + if $timeout <= 0; + $self->{timeout} = $timeout; + + $self->{device} = $device; + + $self->{tos} = $tos; + + if ($self->{'host'}) { + my $host = $self->{'host'}; + my $ip = _resolv($host) + or croak("could not resolve host $host"); + $self->{host} = $ip; + $self->{family} = $ip->{family}; + } + + if ($self->{bind}) { + my $addr = $self->{bind}; + my $ip = _resolv($addr) + or croak("could not resolve local addr $addr"); + $self->{local_addr} = $ip; + } else { + $self->{local_addr} = undef; # Don't bind by default + } + + if ($self->{proto} eq 'icmp') { + croak('TTL must be from 0 to 255') + if ($ttl && ($ttl < 0 || $ttl > 255)); + $self->{ttl} = $ttl; + } + + if ($family) { + if ($family =~ $qr_family) { + if ($family =~ $qr_family4) { + $self->{family} = AF_INET; + } else { + $self->{family} = $AF_INET6; + } + } else { + croak('Family must be "ipv4" or "ipv6"') + } + } else { + $self->{family} = $def_family; + } + + $min_datasize = ($proto eq "udp") ? 1 : 0; # Determine data size + $data_size = $min_datasize unless defined($data_size) && $proto ne "tcp"; + croak("Data for ping must be from $min_datasize to $max_datasize bytes") + if ($data_size < $min_datasize) || ($data_size > $max_datasize); + $data_size-- if $self->{proto} eq "udp"; # We provide the first byte + $self->{data_size} = $data_size; + + $self->{data} = ""; # Construct data bytes + for ($cnt = 0; $cnt < $self->{data_size}; $cnt++) + { + $self->{data} .= chr($cnt % 256); + } + + # Default exponential backoff rate + $self->{retrans} = $def_factor unless exists $self->{retrans}; + # Default Connection refused behavior + $self->{econnrefused} = undef unless exists $self->{econnrefused}; + + $self->{seq} = 0; # For counting packets + if ($self->{proto} eq "udp") # Open a socket + { + $self->{proto_num} = eval { (getprotobyname('udp'))[2] } || + croak("Can't udp protocol by name"); + $self->{port_num} = $self->{port} + || (getservbyname('echo', 'udp'))[2] + || croak("Can't get udp echo port by name"); + $self->{fh} = FileHandle->new(); + socket($self->{fh}, PF_INET, SOCK_DGRAM, + $self->{proto_num}) || + croak("udp socket error - $!"); + $self->_setopts(); + } + elsif ($self->{proto} eq "icmp") + { + croak("icmp ping requires root privilege") if !_isroot(); + $self->{proto_num} = eval { (getprotobyname('icmp'))[2] } || + croak("Can't get icmp protocol by name"); + $self->{pid} = $$ & 0xffff; # Save lower 16 bits of pid + $self->{fh} = FileHandle->new(); + socket($self->{fh}, PF_INET, SOCK_RAW, $self->{proto_num}) || + croak("icmp socket error - $!"); + $self->_setopts(); + if ($self->{'ttl'}) { + setsockopt($self->{fh}, IPPROTO_IP, IP_TTL, pack("I*", $self->{'ttl'})) + or croak "error configuring ttl to $self->{'ttl'} $!"; + } + } + elsif ($self->{proto} eq "icmpv6") + { + croak("icmpv6 ping requires root privilege") if !_isroot(); + croak("Wrong family $self->{family} for icmpv6 protocol") + if $self->{family} and $self->{family} != $AF_INET6; + $self->{family} = $AF_INET6; + $self->{proto_num} = eval { (getprotobyname('ipv6-icmp'))[2] } || + croak("Can't get ipv6-icmp protocol by name"); # 58 + $self->{pid} = $$ & 0xffff; # Save lower 16 bits of pid + $self->{fh} = FileHandle->new(); + socket($self->{fh}, $AF_INET6, SOCK_RAW, $self->{proto_num}) || + croak("icmp socket error - $!"); + $self->_setopts(); + if ($self->{'gateway'}) { + my $g = $self->{gateway}; + my $ip = _resolv($g) + or croak("nonexistent gateway $g"); + $self->{family} eq $AF_INET6 + or croak("gateway requires the AF_INET6 family"); + $ip->{family} eq $AF_INET6 + or croak("gateway address needs to be IPv6"); + my $IPV6_NEXTHOP = eval { Socket::IPV6_NEXTHOP() } || 48; # IPV6_3542NEXTHOP, or 21 + setsockopt($self->{fh}, $IPPROTO_IPV6, $IPV6_NEXTHOP, _pack_sockaddr_in($ip)) + or croak "error configuring gateway to $g NEXTHOP $!"; + } + if (exists $self->{IPV6_USE_MIN_MTU}) { + my $IPV6_USE_MIN_MTU = eval { Socket::IPV6_USE_MIN_MTU() } || 42; + setsockopt($self->{fh}, $IPPROTO_IPV6, $IPV6_USE_MIN_MTU, + pack("I*", $self->{'IPV6_USE_MIN_MT'})) + or croak "error configuring IPV6_USE_MIN_MT} $!"; + } + if (exists $self->{IPV6_RECVPATHMTU}) { + my $IPV6_RECVPATHMTU = eval { Socket::IPV6_RECVPATHMTU() } || 43; + setsockopt($self->{fh}, $IPPROTO_IPV6, $IPV6_RECVPATHMTU, + pack("I*", $self->{'RECVPATHMTU'})) + or croak "error configuring IPV6_RECVPATHMTU $!"; + } + if ($self->{'tos'}) { + my $proto = $self->{family} == AF_INET ? IPPROTO_IP : $IPPROTO_IPV6; + setsockopt($self->{fh}, $proto, IP_TOS, pack("I*", $self->{'tos'})) + or croak "error configuring tos to $self->{'tos'} $!"; + } + if ($self->{'ttl'}) { + my $proto = $self->{family} == AF_INET ? IPPROTO_IP : $IPPROTO_IPV6; + setsockopt($self->{fh}, $proto, IP_TTL, pack("I*", $self->{'ttl'})) + or croak "error configuring ttl to $self->{'ttl'} $!"; + } + } + elsif ($self->{proto} eq "tcp" || $self->{proto} eq "stream") + { + $self->{proto_num} = eval { (getprotobyname('tcp'))[2] } || + croak("Can't get tcp protocol by name"); + $self->{port_num} = $self->{port} + || (getservbyname('echo', 'tcp'))[2] + || croak("Can't get tcp echo port by name"); + $self->{fh} = FileHandle->new(); + } + elsif ($self->{proto} eq "syn") + { + $self->{proto_num} = eval { (getprotobyname('tcp'))[2] } || + croak("Can't get tcp protocol by name"); + $self->{port_num} = (getservbyname('echo', 'tcp'))[2] || + croak("Can't get tcp echo port by name"); + if ($syn_forking) { + $self->{fork_rd} = FileHandle->new(); + $self->{fork_wr} = FileHandle->new(); + pipe($self->{fork_rd}, $self->{fork_wr}); + $self->{fh} = FileHandle->new(); + $self->{good} = {}; + $self->{bad} = {}; + } else { + $self->{wbits} = ""; + $self->{bad} = {}; + } + $self->{syn} = {}; + $self->{stop_time} = 0; + } + + return($self); +} + +# Description: Set the local IP address from which pings will be sent. +# For ICMP, UDP and TCP pings, just saves the address to be used when +# the socket is opened. Returns non-zero if successful; croaks on error. +sub bind +{ + my ($self, + $local_addr # Name or IP number of local interface + ) = @_; + my ($ip, # Hash of addr (string), addr_in (packed), family + $h # resolved hash + ); + + croak("Usage: \$p->bind(\$local_addr)") unless @_ == 2; + croak("already bound") if defined($self->{local_addr}) && + ($self->{proto} eq "udp" || $self->{proto} eq "icmp"); + + $ip = $self->_resolv($local_addr); + croak("nonexistent local address $local_addr") unless defined($ip); + $self->{local_addr} = $ip; + + if (($self->{proto} ne "udp") && + ($self->{proto} ne "icmp") && + ($self->{proto} ne "tcp") && + ($self->{proto} ne "syn")) + { + croak("Unknown protocol \"$self->{proto}\" in bind()"); + } + + return 1; +} + +# Description: A select() wrapper that compensates for platform +# peculiarities. +sub mselect +{ + if ($_[3] > 0 and $^O eq 'MSWin32') { + # On windows, select() doesn't process the message loop, + # but sleep() will, allowing alarm() to interrupt the latter. + # So we chop up the timeout into smaller pieces and interleave + # select() and sleep() calls. + my $t = $_[3]; + my $gran = 0.5; # polling granularity in seconds + my @args = @_; + while (1) { + $gran = $t if $gran > $t; + my $nfound = select($_[0], $_[1], $_[2], $gran); + undef $nfound if $nfound == -1; + $t -= $gran; + return $nfound if $nfound or !defined($nfound) or $t <= 0; + + sleep(0); + ($_[0], $_[1], $_[2]) = @args; + } + } + else { + my $nfound = select($_[0], $_[1], $_[2], $_[3]); + undef $nfound if $nfound == -1; + return $nfound; + } +} + +# Description: Allow UDP source endpoint comparison to be +# skipped for those remote interfaces that do +# not response from the same endpoint. + +sub source_verify +{ + my $self = shift; + $source_verify = 1 unless defined + ($source_verify = ((defined $self) && (ref $self)) ? shift() : $self); +} + +# Description: Set whether or not the connect +# behavior should enforce remote service +# availability as well as reachability. + +sub service_check +{ + my $self = shift; + $self->{econnrefused} = 1 unless defined + ($self->{econnrefused} = shift()); +} + +sub tcp_service_check +{ + service_check(@_); +} + +# Description: Set exponential backoff for retransmission. +# Should be > 1 to retain exponential properties. +# If set to 0, retransmissions are disabled. + +sub retrans +{ + my $self = shift; + $self->{retrans} = shift; +} + +sub _IsAdminUser { + return unless $^O eq 'MSWin32' or $^O eq "cygwin"; + return unless eval { require Win32 }; + return unless defined &Win32::IsAdminUser; + return Win32::IsAdminUser(); +} + +sub _isroot { + if (($> and $^O ne 'VMS' and $^O ne 'cygwin') + or (($^O eq 'MSWin32' or $^O eq 'cygwin') + and !_IsAdminUser()) + or ($^O eq 'VMS' + and (`write sys\$output f\$privilege("SYSPRV")` =~ m/FALSE/))) { + return 0; + } + else { + return 1; + } +} + +# Description: Sets ipv6 reachability +# REACHCONF was removed in RFC3542, ping6 -R supports it. requires root. + +sub IPV6_REACHCONF +{ + my $self = shift; + my $on = shift; + if ($on) { + my $reachconf = eval { Socket::IPV6_REACHCONF() }; + if (!$reachconf) { + carp "IPV6_REACHCONF not supported on this platform"; + return 0; + } + if (!_isroot()) { + carp "IPV6_REACHCONF requires root permissions"; + return 0; + } + $self->{IPV6_REACHCONF} = 1; + } + else { + return $self->{IPV6_REACHCONF}; + } +} + +# Description: set it on or off. + +sub IPV6_USE_MIN_MTU +{ + my $self = shift; + my $on = shift; + if (defined $on) { + my $IPV6_USE_MIN_MTU = eval { Socket::IPV6_USE_MIN_MTU() } || 43; + #if (!$IPV6_USE_MIN_MTU) { + # carp "IPV6_USE_MIN_MTU not supported on this platform"; + # return 0; + #} + $self->{IPV6_USE_MIN_MTU} = $on ? 1 : 0; + setsockopt($self->{fh}, $IPPROTO_IPV6, $IPV6_USE_MIN_MTU, + pack("I*", $self->{'IPV6_USE_MIN_MT'})) + or croak "error configuring IPV6_USE_MIN_MT} $!"; + } + else { + return $self->{IPV6_USE_MIN_MTU}; + } +} + +# Description: notify an according MTU + +sub IPV6_RECVPATHMTU +{ + my $self = shift; + my $on = shift; + if ($on) { + my $IPV6_RECVPATHMTU = eval { Socket::IPV6_RECVPATHMTU() } || 43; + #if (!$RECVPATHMTU) { + # carp "IPV6_RECVPATHMTU not supported on this platform"; + # return 0; + #} + $self->{IPV6_RECVPATHMTU} = 1; + setsockopt($self->{fh}, $IPPROTO_IPV6, $IPV6_RECVPATHMTU, + pack("I*", $self->{'IPV6_RECVPATHMTU'})) + or croak "error configuring IPV6_RECVPATHMTU} $!"; + } + else { + return $self->{IPV6_RECVPATHMTU}; + } +} + +# Description: allows the module to use milliseconds as returned by +# the Time::HiRes module + +$hires = 1; +sub hires +{ + my $self = shift; + $hires = 1 unless defined + ($hires = ((defined $self) && (ref $self)) ? shift() : $self); +} + +sub time +{ + return $hires ? Time::HiRes::time() : CORE::time(); +} + +# Description: Sets or clears the O_NONBLOCK flag on a file handle. +sub socket_blocking_mode +{ + my ($self, + $fh, # the file handle whose flags are to be modified + $block) = @_; # if true then set the blocking + # mode (clear O_NONBLOCK), otherwise + # set the non-blocking mode (set O_NONBLOCK) + + my $flags; + if ($^O eq 'MSWin32' || $^O eq 'VMS') { + # FIONBIO enables non-blocking sockets on windows and vms. + # FIONBIO is (0x80000000|(4<<16)|(ord('f')<<8)|126), as per winsock.h, ioctl.h + my $f = 0x8004667e; + my $v = pack("L", $block ? 0 : 1); + ioctl($fh, $f, $v) or croak("ioctl failed: $!"); + return; + } + if ($flags = fcntl($fh, F_GETFL, 0)) { + $flags = $block ? ($flags & ~O_NONBLOCK) : ($flags | O_NONBLOCK); + if (!fcntl($fh, F_SETFL, $flags)) { + croak("fcntl F_SETFL: $!"); + } + } else { + croak("fcntl F_GETFL: $!"); + } +} + +# Description: Ping a host name or IP number with an optional timeout. +# First lookup the host, and return undef if it is not found. Otherwise +# perform the specific ping method based on the protocol. Return the +# result of the ping. + +sub ping +{ + my ($self, + $host, # Name or IP number of host to ping + $timeout, # Seconds after which ping times out + $family, # Address family + ) = @_; + my ($ip, # Hash of addr (string), addr_in (packed), family + $ret, # The return value + $ping_time, # When ping began + ); + + $host = $self->{host} if !defined $host and $self->{host}; + croak("Usage: \$p->ping([ \$host [, \$timeout [, \$family]]])") if @_ > 4 or !$host; + $timeout = $self->{timeout} unless $timeout; + croak("Timeout must be greater than 0 seconds") if $timeout <= 0; + + if ($family) { + if ($family =~ $qr_family) { + if ($family =~ $qr_family4) { + $self->{family_local} = AF_INET; + } else { + $self->{family_local} = $AF_INET6; + } + } else { + croak('Family must be "ipv4" or "ipv6"') + } + } else { + $self->{family_local} = $self->{family}; + } + + $ip = $self->_resolv($host); + return () unless defined($ip); # Does host exist? + + # Dispatch to the appropriate routine. + $ping_time = &time(); + if ($self->{proto} eq "external") { + $ret = $self->ping_external($ip, $timeout); + } + elsif ($self->{proto} eq "udp") { + $ret = $self->ping_udp($ip, $timeout); + } + elsif ($self->{proto} eq "icmp") { + $ret = $self->ping_icmp($ip, $timeout); + } + elsif ($self->{proto} eq "icmpv6") { + $ret = $self->ping_icmpv6($ip, $timeout); + } + elsif ($self->{proto} eq "tcp") { + $ret = $self->ping_tcp($ip, $timeout); + } + elsif ($self->{proto} eq "stream") { + $ret = $self->ping_stream($ip, $timeout); + } + elsif ($self->{proto} eq "syn") { + $ret = $self->ping_syn($host, $ip, $ping_time, $ping_time+$timeout); + } else { + croak("Unknown protocol \"$self->{proto}\" in ping()"); + } + + return wantarray ? ($ret, &time() - $ping_time, $self->ntop($ip)) : $ret; +} + +# Uses Net::Ping::External to do an external ping. +sub ping_external { + my ($self, + $ip, # Hash of addr (string), addr_in (packed), family + $timeout, # Seconds after which ping times out + $family + ) = @_; + + $ip = $self->{host} if !defined $ip and $self->{host}; + $timeout = $self->{timeout} if !defined $timeout and $self->{timeout}; + my @addr = exists $ip->{addr_in} + ? ('ip' => $ip->{addr_in}) + : ('host' => $ip->{host}); + + eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require Net::Ping::External; + } or croak('Protocol "external" not supported on your system: Net::Ping::External not found'); + return Net::Ping::External::ping(@addr, timeout => $timeout, + family => $family); +} + +# h2ph "asm/socket.h" +# require "asm/socket.ph"; +use constant SO_BINDTODEVICE => 25; +use constant ICMP_ECHOREPLY => 0; # ICMP packet types +use constant ICMPv6_ECHOREPLY => 129; # ICMP packet types +use constant ICMP_UNREACHABLE => 3; # ICMP packet types +use constant ICMPv6_UNREACHABLE => 1; # ICMP packet types +use constant ICMP_ECHO => 8; +use constant ICMPv6_ECHO => 128; +use constant ICMP_TIME_EXCEEDED => 11; # ICMP packet types +use constant ICMP_PARAMETER_PROBLEM => 12; # ICMP packet types +use constant ICMP_STRUCT => "C2 n3 A"; # Structure of a minimal ICMP packet +use constant SUBCODE => 0; # No ICMP subcode for ECHO and ECHOREPLY +use constant ICMP_FLAGS => 0; # No special flags for send or recv +use constant ICMP_PORT => 0; # No port with ICMP +use constant IP_MTU_DISCOVER => 10; # linux only + +sub ping_icmp +{ + my ($self, + $ip, # Hash of addr (string), addr_in (packed), family + $timeout # Seconds after which ping times out + ) = @_; + + my ($saddr, # sockaddr_in with port and ip + $checksum, # Checksum of ICMP packet + $msg, # ICMP packet to send + $len_msg, # Length of $msg + $rbits, # Read bits, filehandles for reading + $nfound, # Number of ready filehandles found + $finish_time, # Time ping should be finished + $done, # set to 1 when we are done + $ret, # Return value + $recv_msg, # Received message including IP header + $from_saddr, # sockaddr_in of sender + $from_port, # Port packet was sent from + $from_ip, # Packed IP of sender + $from_type, # ICMP type + $from_subcode, # ICMP subcode + $from_chk, # ICMP packet checksum + $from_pid, # ICMP packet id + $from_seq, # ICMP packet sequence + $from_msg # ICMP message + ); + + $ip = $self->{host} if !defined $ip and $self->{host}; + $timeout = $self->{timeout} if !defined $timeout and $self->{timeout}; + + socket($self->{fh}, $ip->{family}, SOCK_RAW, $self->{proto_num}) || + croak("icmp socket error - $!"); + + if (defined $self->{local_addr} && + !CORE::bind($self->{fh}, _pack_sockaddr_in(0, $self->{local_addr}))) { + croak("icmp bind error - $!"); + } + $self->_setopts(); + + $self->{seq} = ($self->{seq} + 1) % 65536; # Increment sequence + $checksum = 0; # No checksum for starters + if ($ip->{family} == AF_INET) { + $msg = pack(ICMP_STRUCT . $self->{data_size}, ICMP_ECHO, SUBCODE, + $checksum, $self->{pid}, $self->{seq}, $self->{data}); + } else { + # how to get SRC + my $pseudo_header = pack('a16a16Nnn', $ip->{addr_in}, $ip->{addr_in}, 8+length($self->{data}), "\0", 0x003a); + $msg = pack(ICMP_STRUCT . $self->{data_size}, ICMPv6_ECHO, SUBCODE, + $checksum, $self->{pid}, $self->{seq}, $self->{data}); + $msg = $pseudo_header.$msg + } + $checksum = Net::Ping->checksum($msg); + if ($ip->{family} == AF_INET) { + $msg = pack(ICMP_STRUCT . $self->{data_size}, ICMP_ECHO, SUBCODE, + $checksum, $self->{pid}, $self->{seq}, $self->{data}); + } else { + $msg = pack(ICMP_STRUCT . $self->{data_size}, ICMPv6_ECHO, SUBCODE, + $checksum, $self->{pid}, $self->{seq}, $self->{data}); + } + $len_msg = length($msg); + $saddr = _pack_sockaddr_in(ICMP_PORT, $ip); + $self->{from_ip} = undef; + $self->{from_type} = undef; + $self->{from_subcode} = undef; + send($self->{fh}, $msg, ICMP_FLAGS, $saddr); # Send the message + + $rbits = ""; + vec($rbits, $self->{fh}->fileno(), 1) = 1; + $ret = 0; + $done = 0; + $finish_time = &time() + $timeout; # Must be done by this time + while (!$done && $timeout > 0) # Keep trying if we have time + { + $nfound = mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for packet + $timeout = $finish_time - &time(); # Get remaining time + if (!defined($nfound)) # Hmm, a strange error + { + $ret = undef; + $done = 1; + } + elsif ($nfound) # Got a packet from somewhere + { + $recv_msg = ""; + $from_pid = -1; + $from_seq = -1; + $from_saddr = recv($self->{fh}, $recv_msg, 1500, ICMP_FLAGS); + ($from_port, $from_ip) = _unpack_sockaddr_in($from_saddr, $ip->{family}); + ($from_type, $from_subcode) = unpack("C2", substr($recv_msg, 20, 2)); + if ($from_type == ICMP_ECHOREPLY) { + ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 24, 4)) + if length $recv_msg >= 28; + } elsif ($from_type == ICMPv6_ECHOREPLY) { + ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 24, 4)) + if length $recv_msg >= 28; + } else { + ($from_pid, $from_seq) = unpack("n3", substr($recv_msg, 52, 4)) + if length $recv_msg >= 56; + } + $self->{from_ip} = $from_ip; + $self->{from_type} = $from_type; + $self->{from_subcode} = $from_subcode; + next if ($from_pid != $self->{pid}); + next if ($from_seq != $self->{seq}); + if (! $source_verify || ($self->ntop($from_ip) eq $self->ntop($ip))) { # Does the packet check out? + if (($from_type == ICMP_ECHOREPLY) || ($from_type == ICMPv6_ECHOREPLY)) { + $ret = 1; + $done = 1; + } elsif (($from_type == ICMP_UNREACHABLE) || ($from_type == ICMPv6_UNREACHABLE)) { + $done = 1; + } elsif ($from_type == ICMP_TIME_EXCEEDED) { + $ret = 0; + $done = 1; + } + } + } else { # Oops, timed out + $done = 1; + } + } + return $ret; +} + +sub ping_icmpv6 +{ + shift->ping_icmp(@_); +} + +sub icmp_result { + my ($self) = @_; + my $addr = $self->{from_ip} || ""; + $addr = "\0\0\0\0" unless 4 == length $addr; + return ($self->ntop($addr),($self->{from_type} || 0), ($self->{from_subcode} || 0)); +} + +# Description: Do a checksum on the message. Basically sum all of +# the short words and fold the high order bits into the low order bits. + +sub checksum +{ + my ($class, + $msg # The message to checksum + ) = @_; + my ($len_msg, # Length of the message + $num_short, # The number of short words in the message + $short, # One short word + $chk # The checksum + ); + + $len_msg = length($msg); + $num_short = int($len_msg / 2); + $chk = 0; + foreach $short (unpack("n$num_short", $msg)) + { + $chk += $short; + } # Add the odd byte in + $chk += (unpack("C", substr($msg, $len_msg - 1, 1)) << 8) if $len_msg % 2; + $chk = ($chk >> 16) + ($chk & 0xffff); # Fold high into low + return(~(($chk >> 16) + $chk) & 0xffff); # Again and complement +} + + +# Description: Perform a tcp echo ping. Since a tcp connection is +# host specific, we have to open and close each connection here. We +# can't just leave a socket open. Because of the robust nature of +# tcp, it will take a while before it gives up trying to establish a +# connection. Therefore, we use select() on a non-blocking socket to +# check against our timeout. No data bytes are actually +# sent since the successful establishment of a connection is proof +# enough of the reachability of the remote host. Also, tcp is +# expensive and doesn't need our help to add to the overhead. + +sub ping_tcp +{ + my ($self, + $ip, # Hash of addr (string), addr_in (packed), family + $timeout # Seconds after which ping times out + ) = @_; + my ($ret # The return value + ); + + $ip = $self->{host} if !defined $ip and $self->{host}; + $timeout = $self->{timeout} if !defined $timeout and $self->{timeout}; + + $! = 0; + $ret = $self -> tcp_connect( $ip, $timeout); + if (!$self->{econnrefused} && + $! == ECONNREFUSED) { + $ret = 1; # "Connection refused" means reachable + } + $self->{fh}->close(); + return $ret; +} + +sub tcp_connect +{ + my ($self, + $ip, # Hash of addr (string), addr_in (packed), family + $timeout # Seconds after which connect times out + ) = @_; + my ($saddr); # Packed IP and Port + + $ip = $self->{host} if !defined $ip and $self->{host}; + $timeout = $self->{timeout} if !defined $timeout and $self->{timeout}; + + $saddr = _pack_sockaddr_in($self->{port_num}, $ip); + + my $ret = 0; # Default to unreachable + + my $do_socket = sub { + socket($self->{fh}, $ip->{family}, SOCK_STREAM, $self->{proto_num}) || + croak("tcp socket error - $!"); + if (defined $self->{local_addr} && + !CORE::bind($self->{fh}, _pack_sockaddr_in(0, $self->{local_addr}))) { + croak("tcp bind error - $!"); + } + $self->_setopts(); + }; + my $do_connect = sub { + $self->{ip} = $ip->{addr_in}; + # ECONNREFUSED is 10061 on MSWin32. If we pass it as child error through $?, + # we'll get (10061 & 255) = 77, so we cannot check it in the parent process. + return ($ret = connect($self->{fh}, $saddr) || ($! == ECONNREFUSED && !$self->{econnrefused})); + }; + my $do_connect_nb = sub { + # Set O_NONBLOCK property on filehandle + $self->socket_blocking_mode($self->{fh}, 0); + + # start the connection attempt + if (!connect($self->{fh}, $saddr)) { + if ($! == ECONNREFUSED) { + $ret = 1 unless $self->{econnrefused}; + } elsif ($! != EINPROGRESS && ($^O ne 'MSWin32' || $! != EWOULDBLOCK)) { + # EINPROGRESS is the expected error code after a connect() + # on a non-blocking socket. But if the kernel immediately + # determined that this connect() will never work, + # Simply respond with "unreachable" status. + # (This can occur on some platforms with errno + # EHOSTUNREACH or ENETUNREACH.) + return 0; + } else { + # Got the expected EINPROGRESS. + # Just wait for connection completion... + my ($wbits, $wout, $wexc); + $wout = $wexc = $wbits = ""; + vec($wbits, $self->{fh}->fileno, 1) = 1; + + my $nfound = mselect(undef, + ($wout = $wbits), + ($^O eq 'MSWin32' ? ($wexc = $wbits) : undef), + $timeout); + warn("select: $!") unless defined $nfound; + + if ($nfound && vec($wout, $self->{fh}->fileno, 1)) { + # the socket is ready for writing so the connection + # attempt completed. test whether the connection + # attempt was successful or not + + if (getpeername($self->{fh})) { + # Connection established to remote host + $ret = 1; + } else { + # TCP ACK will never come from this host + # because there was an error connecting. + + # This should set $! to the correct error. + my $char; + sysread($self->{fh},$char,1); + $! = ECONNREFUSED if ($! == EAGAIN && $^O =~ /cygwin/i); + + $ret = 1 if (!$self->{econnrefused} + && $! == ECONNREFUSED); + } + } else { + # the connection attempt timed out (or there were connect + # errors on Windows) + if ($^O =~ 'MSWin32') { + # If the connect will fail on a non-blocking socket, + # winsock reports ECONNREFUSED as an exception, and we + # need to fetch the socket-level error code via getsockopt() + # instead of using the thread-level error code that is in $!. + if ($nfound && vec($wexc, $self->{fh}->fileno, 1)) { + $! = unpack("i", getsockopt($self->{fh}, SOL_SOCKET, + SO_ERROR)); + } + } + } + } + } else { + # Connection established to remote host + $ret = 1; + } + + # Unset O_NONBLOCK property on filehandle + $self->socket_blocking_mode($self->{fh}, 1); + $self->{ip} = $ip->{addr_in}; + return $ret; + }; + + if ($syn_forking) { + # Buggy Winsock API doesn't allow nonblocking connect. + # Hence, if our OS is Windows, we need to create a separate + # process to do the blocking connect attempt. + # XXX Above comments are not true at least for Win2K, where + # nonblocking connect works. + + $| = 1; # Clear buffer prior to fork to prevent duplicate flushing. + $self->{'tcp_chld'} = fork; + if (!$self->{'tcp_chld'}) { + if (!defined $self->{'tcp_chld'}) { + # Fork did not work + warn "Fork error: $!"; + return 0; + } + &{ $do_socket }(); + + # Try a slow blocking connect() call + # and report the status to the parent. + if ( &{ $do_connect }() ) { + $self->{fh}->close(); + # No error + exit 0; + } else { + # Pass the error status to the parent + # Make sure that $! <= 255 + exit($! <= 255 ? $! : 255); + } + } + + &{ $do_socket }(); + + my $patience = &time() + $timeout; + + my ($child, $child_errno); + $? = 0; $child_errno = 0; + # Wait up to the timeout + # And clean off the zombie + do { + $child = waitpid($self->{'tcp_chld'}, &WNOHANG()); + $child_errno = $? >> 8; + select(undef, undef, undef, 0.1); + } while &time() < $patience && $child != $self->{'tcp_chld'}; + + if ($child == $self->{'tcp_chld'}) { + if ($self->{proto} eq "stream") { + # We need the socket connected here, in parent + # Should be safe to connect because the child finished + # within the timeout + &{ $do_connect }(); + } + # $ret cannot be set by the child process + $ret = !$child_errno; + } else { + # Time must have run out. + # Put that choking client out of its misery + kill "KILL", $self->{'tcp_chld'}; + # Clean off the zombie + waitpid($self->{'tcp_chld'}, 0); + $ret = 0; + } + delete $self->{'tcp_chld'}; + $! = $child_errno; + } else { + # Otherwise don't waste the resources to fork + + &{ $do_socket }(); + + &{ $do_connect_nb }(); + } + + return $ret; +} + +sub DESTROY { + my $self = shift; + if ($self->{'proto'} eq 'tcp' && + $self->{'tcp_chld'}) { + # Put that choking client out of its misery + kill "KILL", $self->{'tcp_chld'}; + # Clean off the zombie + waitpid($self->{'tcp_chld'}, 0); + } +} + +# This writes the given string to the socket and then reads it +# back. It returns 1 on success, 0 on failure. +sub tcp_echo +{ + my ($self, $timeout, $pingstring) = @_; + + $timeout = $self->{timeout} if !defined $timeout and $self->{timeout}; + $pingstring = $self->{pingstring} if !defined $pingstring and $self->{pingstring}; + + my $ret = undef; + my $time = &time(); + my $wrstr = $pingstring; + my $rdstr = ""; + + eval <<'EOM'; + do { + my $rin = ""; + vec($rin, $self->{fh}->fileno(), 1) = 1; + + my $rout = undef; + if($wrstr) { + $rout = ""; + vec($rout, $self->{fh}->fileno(), 1) = 1; + } + + if(mselect($rin, $rout, undef, ($time + $timeout) - &time())) { + + if($rout && vec($rout,$self->{fh}->fileno(),1)) { + my $num = syswrite($self->{fh}, $wrstr, length $wrstr); + if($num) { + # If it was a partial write, update and try again. + $wrstr = substr($wrstr,$num); + } else { + # There was an error. + $ret = 0; + } + } + + if(vec($rin,$self->{fh}->fileno(),1)) { + my $reply; + if(sysread($self->{fh},$reply,length($pingstring)-length($rdstr))) { + $rdstr .= $reply; + $ret = 1 if $rdstr eq $pingstring; + } else { + # There was an error. + $ret = 0; + } + } + + } + } until &time() > ($time + $timeout) || defined($ret); +EOM + + return $ret; +} + +# Description: Perform a stream ping. If the tcp connection isn't +# already open, it opens it. It then sends some data and waits for +# a reply. It leaves the stream open on exit. + +sub ping_stream +{ + my ($self, + $ip, # Hash of addr (string), addr_in (packed), family + $timeout # Seconds after which ping times out + ) = @_; + + # Open the stream if it's not already open + if(!defined $self->{fh}->fileno()) { + $self->tcp_connect($ip, $timeout) or return 0; + } + + croak "tried to switch servers while stream pinging" + if $self->{ip} ne $ip->{addr_in}; + + return $self->tcp_echo($timeout, $pingstring); +} + +# Description: opens the stream. You would do this if you want to +# separate the overhead of opening the stream from the first ping. + +sub open +{ + my ($self, + $host, # Host or IP address + $timeout, # Seconds after which open times out + $family + ) = @_; + my $ip; # Hash of addr (string), addr_in (packed), family + $host = $self->{host} unless defined $host; + + if ($family) { + if ($family =~ $qr_family) { + if ($family =~ $qr_family4) { + $self->{family_local} = AF_INET; + } else { + $self->{family_local} = $AF_INET6; + } + } else { + croak('Family must be "ipv4" or "ipv6"') + } + } else { + $self->{family_local} = $self->{family}; + } + + $ip = $self->_resolv($host); + $timeout = $self->{timeout} unless $timeout; + + if($self->{proto} eq "stream") { + if(defined($self->{fh}->fileno())) { + croak("socket is already open"); + } else { + $self->tcp_connect($ip, $timeout); + } + } +} + +sub _dontfrag { + my $self = shift; + # bsd solaris + my $IP_DONTFRAG = eval { Socket::IP_DONTFRAG() }; + if ($IP_DONTFRAG) { + my $i = 1; + setsockopt($self->{fh}, IPPROTO_IP, $IP_DONTFRAG, pack("I*", $i)) + or croak "error configuring IP_DONTFRAG $!"; + # Linux needs more: Path MTU Discovery as defined in RFC 1191 + # For non SOCK_STREAM sockets it is the user's responsibility to packetize + # the data in MTU sized chunks and to do the retransmits if necessary. + # The kernel will reject packets that are bigger than the known path + # MTU if this flag is set (with EMSGSIZE). + if ($^O eq 'linux') { + my $i = 2; # IP_PMTUDISC_DO + setsockopt($self->{fh}, IPPROTO_IP, IP_MTU_DISCOVER, pack("I*", $i)) + or croak "error configuring IP_MTU_DISCOVER $!"; + } + } +} + +# SO_BINDTODEVICE + IP_TOS +sub _setopts { + my $self = shift; + if ($self->{'device'}) { + setsockopt($self->{fh}, SOL_SOCKET, SO_BINDTODEVICE, pack("Z*", $self->{'device'})) + or croak "error binding to device $self->{'device'} $!"; + } + if ($self->{'tos'}) { # need to re-apply ToS (RT #6706) + setsockopt($self->{fh}, IPPROTO_IP, IP_TOS, pack("I*", $self->{'tos'})) + or croak "error applying tos to $self->{'tos'} $!"; + } + if ($self->{'dontfrag'}) { + $self->_dontfrag; + } +} + + +# Description: Perform a udp echo ping. Construct a message of +# at least the one-byte sequence number and any additional data bytes. +# Send the message out and wait for a message to come back. If we +# get a message, make sure all of its parts match. If they do, we are +# done. Otherwise go back and wait for the message until we run out +# of time. Return the result of our efforts. + +use constant UDP_FLAGS => 0; # Nothing special on send or recv +sub ping_udp +{ + my ($self, + $ip, # Hash of addr (string), addr_in (packed), family + $timeout # Seconds after which ping times out + ) = @_; + + my ($saddr, # sockaddr_in with port and ip + $ret, # The return value + $msg, # Message to be echoed + $finish_time, # Time ping should be finished + $flush, # Whether socket needs to be disconnected + $connect, # Whether socket needs to be connected + $done, # Set to 1 when we are done pinging + $rbits, # Read bits, filehandles for reading + $nfound, # Number of ready filehandles found + $from_saddr, # sockaddr_in of sender + $from_msg, # Characters echoed by $host + $from_port, # Port message was echoed from + $from_ip # Packed IP number of sender + ); + + $saddr = _pack_sockaddr_in($self->{port_num}, $ip); + $self->{seq} = ($self->{seq} + 1) % 256; # Increment sequence + $msg = chr($self->{seq}) . $self->{data}; # Add data if any + + socket($self->{fh}, $ip->{family}, SOCK_DGRAM, + $self->{proto_num}) || + croak("udp socket error - $!"); + + if (defined $self->{local_addr} && + !CORE::bind($self->{fh}, _pack_sockaddr_in(0, $self->{local_addr}))) { + croak("udp bind error - $!"); + } + + $self->_setopts(); + + if ($self->{connected}) { + if ($self->{connected} ne $saddr) { + # Still connected to wrong destination. + # Need to flush out the old one. + $flush = 1; + } + } else { + # Not connected yet. + # Need to connect() before send() + $connect = 1; + } + + # Have to connect() and send() instead of sendto() + # in order to pick up on the ECONNREFUSED setting + # from recv() or double send() errno as utilized in + # the concept by rdw @ perlmonks. See: + # http://perlmonks.thepen.com/42898.html + if ($flush) { + # Need to socket() again to flush the descriptor + # This will disconnect from the old saddr. + socket($self->{fh}, $ip->{family}, SOCK_DGRAM, + $self->{proto_num}); + $self->_setopts(); + } + # Connect the socket if it isn't already connected + # to the right destination. + if ($flush || $connect) { + connect($self->{fh}, $saddr); # Tie destination to socket + $self->{connected} = $saddr; + } + send($self->{fh}, $msg, UDP_FLAGS); # Send it + + $rbits = ""; + vec($rbits, $self->{fh}->fileno(), 1) = 1; + $ret = 0; # Default to unreachable + $done = 0; + my $retrans = 0.01; + my $factor = $self->{retrans}; + $finish_time = &time() + $timeout; # Ping needs to be done by then + while (!$done && $timeout > 0) + { + if ($factor > 1) + { + $timeout = $retrans if $timeout > $retrans; + $retrans*= $factor; # Exponential backoff + } + $nfound = mselect((my $rout=$rbits), undef, undef, $timeout); # Wait for response + my $why = $!; + $timeout = $finish_time - &time(); # Get remaining time + + if (!defined($nfound)) # Hmm, a strange error + { + $ret = undef; + $done = 1; + } + elsif ($nfound) # A packet is waiting + { + $from_msg = ""; + $from_saddr = recv($self->{fh}, $from_msg, 1500, UDP_FLAGS); + if (!$from_saddr) { + # For example an unreachable host will make recv() fail. + if (!$self->{econnrefused} && + ($! == ECONNREFUSED || + $! == ECONNRESET)) { + # "Connection refused" means reachable + # Good, continue + $ret = 1; + } + $done = 1; + } else { + ($from_port, $from_ip) = _unpack_sockaddr_in($from_saddr, $ip->{family}); + my $addr_in = ref($ip) eq "HASH" ? $ip->{addr_in} : $ip; + if (!$source_verify || + (($from_ip eq $addr_in) && # Does the packet check out? + ($from_port == $self->{port_num}) && + ($from_msg eq $msg))) + { + $ret = 1; # It's a winner + $done = 1; + } + } + } + elsif ($timeout <= 0) # Oops, timed out + { + $done = 1; + } + else + { + # Send another in case the last one dropped + if (send($self->{fh}, $msg, UDP_FLAGS)) { + # Another send worked? The previous udp packet + # must have gotten lost or is still in transit. + # Hopefully this new packet will arrive safely. + } else { + if (!$self->{econnrefused} && + $! == ECONNREFUSED) { + # "Connection refused" means reachable + # Good, continue + $ret = 1; + } + $done = 1; + } + } + } + return $ret; +} + +# Description: Send a TCP SYN packet to host specified. +sub ping_syn +{ + my $self = shift; + my $host = shift; + my $ip = shift; + my $start_time = shift; + my $stop_time = shift; + + if ($syn_forking) { + return $self->ping_syn_fork($host, $ip, $start_time, $stop_time); + } + + my $fh = FileHandle->new(); + my $saddr = _pack_sockaddr_in($self->{port_num}, $ip); + + # Create TCP socket + if (!socket ($fh, $ip->{family}, SOCK_STREAM, $self->{proto_num})) { + croak("tcp socket error - $!"); + } + + if (defined $self->{local_addr} && + !CORE::bind($fh, _pack_sockaddr_in(0, $self->{local_addr}))) { + croak("tcp bind error - $!"); + } + + $self->_setopts(); + # Set O_NONBLOCK property on filehandle + $self->socket_blocking_mode($fh, 0); + + # Attempt the non-blocking connect + # by just sending the TCP SYN packet + if (connect($fh, $saddr)) { + # Non-blocking, yet still connected? + # Must have connected very quickly, + # or else it wasn't very non-blocking. + #warn "WARNING: Nonblocking connect connected anyway? ($^O)"; + } else { + # Error occurred connecting. + if ($! == EINPROGRESS || ($^O eq 'MSWin32' && $! == EWOULDBLOCK)) { + # The connection is just still in progress. + # This is the expected condition. + } else { + # Just save the error and continue on. + # The ack() can check the status later. + $self->{bad}->{$host} = $!; + } + } + + my $entry = [ $host, $ip, $fh, $start_time, $stop_time, $self->{port_num} ]; + $self->{syn}->{$fh->fileno} = $entry; + if ($self->{stop_time} < $stop_time) { + $self->{stop_time} = $stop_time; + } + vec($self->{wbits}, $fh->fileno, 1) = 1; + + return 1; +} + +sub ping_syn_fork { + my ($self, $host, $ip, $start_time, $stop_time) = @_; + + # Buggy Winsock API doesn't allow nonblocking connect. + # Hence, if our OS is Windows, we need to create a separate + # process to do the blocking connect attempt. + my $pid = fork(); + if (defined $pid) { + if ($pid) { + # Parent process + my $entry = [ $host, $ip, $pid, $start_time, $stop_time ]; + $self->{syn}->{$pid} = $entry; + if ($self->{stop_time} < $stop_time) { + $self->{stop_time} = $stop_time; + } + } else { + # Child process + my $saddr = _pack_sockaddr_in($self->{port_num}, $ip); + + # Create TCP socket + if (!socket ($self->{fh}, $ip->{family}, SOCK_STREAM, $self->{proto_num})) { + croak("tcp socket error - $!"); + } + + if (defined $self->{local_addr} && + !CORE::bind($self->{fh}, _pack_sockaddr_in(0, $self->{local_addr}))) { + croak("tcp bind error - $!"); + } + + $self->_setopts(); + + $!=0; + # Try to connect (could take a long time) + connect($self->{fh}, $saddr); + # Notify parent of connect error status + my $err = $!+0; + my $wrstr = "$$ $err"; + # Force to 16 chars including \n + $wrstr .= " "x(15 - length $wrstr). "\n"; + syswrite($self->{fork_wr}, $wrstr, length $wrstr); + exit; + } + } else { + # fork() failed? + die "fork: $!"; + } + return 1; +} + +# Description: Wait for TCP ACK from host specified +# from ping_syn above. If no host is specified, wait +# for TCP ACK from any of the hosts in the SYN queue. +sub ack +{ + my $self = shift; + + if ($self->{proto} eq "syn") { + if ($syn_forking) { + my @answer = $self->ack_unfork(shift); + return wantarray ? @answer : $answer[0]; + } + my $wbits = ""; + my $stop_time = 0; + if (my $host = shift or $self->{host}) { + # Host passed as arg or as option to new + $host = $self->{host} unless defined $host; + if (exists $self->{bad}->{$host}) { + if (!$self->{econnrefused} && + $self->{bad}->{ $host } && + (($! = ECONNREFUSED)>0) && + $self->{bad}->{ $host } eq "$!") { + # "Connection refused" means reachable + # Good, continue + } else { + # ECONNREFUSED means no good + return (); + } + } + my $host_fd = undef; + foreach my $fd (keys %{ $self->{syn} }) { + my $entry = $self->{syn}->{$fd}; + if ($entry->[0] eq $host) { + $host_fd = $fd; + $stop_time = $entry->[4] + || croak("Corrupted SYN entry for [$host]"); + last; + } + } + croak("ack called on [$host] without calling ping first!") + unless defined $host_fd; + vec($wbits, $host_fd, 1) = 1; + } else { + # No $host passed so scan all hosts + # Use the latest stop_time + $stop_time = $self->{stop_time}; + # Use all the bits + $wbits = $self->{wbits}; + } + + while ($wbits !~ /^\0*\z/) { + my $timeout = $stop_time - &time(); + # Force a minimum of 10 ms timeout. + $timeout = 0.01 if $timeout <= 0.01; + + my $winner_fd = undef; + my $wout = $wbits; + my $fd = 0; + # Do "bad" fds from $wbits first + while ($wout !~ /^\0*\z/) { + if (vec($wout, $fd, 1)) { + # Wipe it from future scanning. + vec($wout, $fd, 1) = 0; + if (my $entry = $self->{syn}->{$fd}) { + if ($self->{bad}->{ $entry->[0] }) { + $winner_fd = $fd; + last; + } + } + } + $fd++; + } + + if (defined($winner_fd) or my $nfound = mselect(undef, ($wout=$wbits), undef, $timeout)) { + if (defined $winner_fd) { + $fd = $winner_fd; + } else { + # Done waiting for one of the ACKs + $fd = 0; + # Determine which one + while ($wout !~ /^\0*\z/ && + !vec($wout, $fd, 1)) { + $fd++; + } + } + if (my $entry = $self->{syn}->{$fd}) { + # Wipe it from future scanning. + delete $self->{syn}->{$fd}; + vec($self->{wbits}, $fd, 1) = 0; + vec($wbits, $fd, 1) = 0; + if (!$self->{econnrefused} && + $self->{bad}->{ $entry->[0] } && + (($! = ECONNREFUSED)>0) && + $self->{bad}->{ $entry->[0] } eq "$!") { + # "Connection refused" means reachable + # Good, continue + } elsif (getpeername($entry->[2])) { + # Connection established to remote host + # Good, continue + } else { + # TCP ACK will never come from this host + # because there was an error connecting. + + # This should set $! to the correct error. + my $char; + sysread($entry->[2],$char,1); + # Store the excuse why the connection failed. + $self->{bad}->{$entry->[0]} = $!; + if (!$self->{econnrefused} && + (($! == ECONNREFUSED) || + ($! == EAGAIN && $^O =~ /cygwin/i))) { + # "Connection refused" means reachable + # Good, continue + } else { + # No good, try the next socket... + next; + } + } + # Everything passed okay, return the answer + return wantarray ? + ($entry->[0], &time() - $entry->[3], $self->ntop($entry->[1]), $entry->[5]) + : $entry->[0]; + } else { + warn "Corrupted SYN entry: unknown fd [$fd] ready!"; + vec($wbits, $fd, 1) = 0; + vec($self->{wbits}, $fd, 1) = 0; + } + } elsif (defined $nfound) { + # Timed out waiting for ACK + foreach my $fd (keys %{ $self->{syn} }) { + if (vec($wbits, $fd, 1)) { + my $entry = $self->{syn}->{$fd}; + $self->{bad}->{$entry->[0]} = "Timed out"; + vec($wbits, $fd, 1) = 0; + vec($self->{wbits}, $fd, 1) = 0; + delete $self->{syn}->{$fd}; + } + } + } else { + # Weird error occurred with select() + warn("select: $!"); + $self->{syn} = {}; + $wbits = ""; + } + } + } + return (); +} + +sub ack_unfork { + my ($self,$host) = @_; + my $stop_time = $self->{stop_time}; + if ($host) { + # Host passed as arg + if (my $entry = $self->{good}->{$host}) { + delete $self->{good}->{$host}; + return ($entry->[0], &time() - $entry->[3], $self->ntop($entry->[1])); + } + } + + my $rbits = ""; + my $timeout; + + if (keys %{ $self->{syn} }) { + # Scan all hosts that are left + vec($rbits, fileno($self->{fork_rd}), 1) = 1; + $timeout = $stop_time - &time(); + # Force a minimum of 10 ms timeout. + $timeout = 0.01 if $timeout < 0.01; + } else { + # No hosts left to wait for + $timeout = 0; + } + + if ($timeout > 0) { + my $nfound; + while ( keys %{ $self->{syn} } and + $nfound = mselect((my $rout=$rbits), undef, undef, $timeout)) { + # Done waiting for one of the ACKs + if (!sysread($self->{fork_rd}, $_, 16)) { + # Socket closed, which means all children are done. + return (); + } + my ($pid, $how) = split; + if ($pid) { + # Flush the zombie + waitpid($pid, 0); + if (my $entry = $self->{syn}->{$pid}) { + # Connection attempt to remote host is done + delete $self->{syn}->{$pid}; + if (!$how || # If there was no error connecting + (!$self->{econnrefused} && + $how == ECONNREFUSED)) { # "Connection refused" means reachable + if ($host && $entry->[0] ne $host) { + # A good connection, but not the host we need. + # Move it from the "syn" hash to the "good" hash. + $self->{good}->{$entry->[0]} = $entry; + # And wait for the next winner + next; + } + return ($entry->[0], &time() - $entry->[3], $self->ntop($entry->[1])); + } + } else { + # Should never happen + die "Unknown ping from pid [$pid]"; + } + } else { + die "Empty response from status socket?"; + } + } + if (defined $nfound) { + # Timed out waiting for ACK status + } else { + # Weird error occurred with select() + warn("select: $!"); + } + } + if (my @synners = keys %{ $self->{syn} }) { + # Kill all the synners + kill 9, @synners; + foreach my $pid (@synners) { + # Wait for the deaths to finish + # Then flush off the zombie + waitpid($pid, 0); + } + } + $self->{syn} = {}; + return (); +} + +# Description: Tell why the ack() failed +sub nack { + my $self = shift; + my $host = shift || croak('Usage> nack($failed_ack_host)'); + return $self->{bad}->{$host} || undef; +} + +# Description: Close the connection. + +sub close +{ + my ($self) = @_; + + if ($self->{proto} eq "syn") { + delete $self->{syn}; + } elsif ($self->{proto} eq "tcp") { + # The connection will already be closed + } elsif ($self->{proto} eq "external") { + # Nothing to close + } else { + $self->{fh}->close(); + } +} + +sub port_number { + my $self = shift; + if(@_) { + $self->{port_num} = shift @_; + $self->service_check(1); + } + return $self->{port_num}; +} + +sub ntop { + my($self, $ip) = @_; + + # Vista doesn't define a inet_ntop. It has InetNtop instead. + # Not following ANSI... priceless. getnameinfo() is defined + # for Windows 2000 and later, so that may be the choice. + + # Any port will work, even undef, but this will work for now. + # Socket warns when undef is passed in, but it still works. + my $port = getservbyname('echo', 'udp'); + my $sockaddr = _pack_sockaddr_in($port, $ip); + my ($error, $address) = getnameinfo($sockaddr, $NI_NUMERICHOST); + croak $error if $error; + return $address; +} + +sub wakeonlan { + my ($mac_addr, $host, $port) = @_; + + # use the discard service if $port not passed in + if (! defined $host) { $host = '255.255.255.255' } + if (! defined $port || $port !~ /^\d+$/ ) { $port = 9 } + + require IO::Socket::INET; + my $sock = IO::Socket::INET->new(Proto=>'udp') || return undef; + + my $ip_addr = inet_aton($host); + my $sock_addr = sockaddr_in($port, $ip_addr); + $mac_addr =~ s/://g; + my $packet = pack('C6H*', 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, $mac_addr x 16); + + setsockopt($sock, SOL_SOCKET, SO_BROADCAST, 1); + send($sock, $packet, 0, $sock_addr); + $sock->close; + + return 1; +} + +######################################################## +# DNS hostname resolution +# return: +# $h->{name} = host - as passed in +# $h->{host} = host - as passed in without :port +# $h->{port} = OPTIONAL - if :port, then value of port +# $h->{addr} = resolved numeric address +# $h->{addr_in} = aton/pton result +# $h->{family} = AF_INET/6 +############################ +sub _resolv { + my ($self, + $name, + ) = @_; + + my %h; + $h{name} = $name; + my $family = $self->{family}; + + if (defined($self->{family_local})) { + $family = $self->{family_local} + } + +# START - host:port + my $cnt = 0; + + # Count ":" + $cnt++ while ($name =~ m/:/g); + + # 0 = hostname or IPv4 address + if ($cnt == 0) { + $h{host} = $name + # 1 = IPv4 address with port + } elsif ($cnt == 1) { + ($h{host}, $h{port}) = split /:/, $name + # >=2 = IPv6 address + } elsif ($cnt >= 2) { + #IPv6 with port - [2001::1]:port + if ($name =~ /^\[.*\]:\d{1,5}$/) { + ($h{host}, $h{port}) = split /:([^:]+)$/, $name # split after last : + # IPv6 without port + } else { + $h{host} = $name + } + } + + # Clean up host + $h{host} =~ s/\[//g; + $h{host} =~ s/\]//g; + # Clean up port + if (defined($h{port}) && (($h{port} !~ /^\d{1,5}$/) || ($h{port} < 1) || ($h{port} > 65535))) { + croak("Invalid port `$h{port}' in `$name'"); + } +# END - host:port + + # address check + # new way + if ($Socket::VERSION >= 1.94) { + my %hints = ( + family => $AF_UNSPEC, + protocol => IPPROTO_TCP, + flags => $AI_NUMERICHOST + ); + + # numeric address, return + my ($err, @getaddr) = Socket::getaddrinfo($h{host}, undef, \%hints); + if (defined($getaddr[0])) { + $h{addr} = $h{host}; + $h{family} = $getaddr[0]->{family}; + if ($h{family} == AF_INET) { + (undef, $h{addr_in}, undef, undef) = Socket::unpack_sockaddr_in $getaddr[0]->{addr}; + } else { + (undef, $h{addr_in}, undef, undef) = Socket::unpack_sockaddr_in6 $getaddr[0]->{addr}; + } + return \%h + } + # old way + } else { + # numeric address, return + my $ret = gethostbyname($h{host}); + if (defined($ret) && (_inet_ntoa($ret) eq $h{host})) { + $h{addr} = $h{host}; + $h{addr_in} = $ret; + $h{family} = AF_INET; + return \%h + } + } + + # resolve + # new way + if ($Socket::VERSION >= 1.94) { + my %hints = ( + family => $family, + protocol => IPPROTO_TCP + ); + + my ($err, @getaddr) = Socket::getaddrinfo($h{host}, undef, \%hints); + if (defined($getaddr[0])) { + my ($err, $address) = Socket::getnameinfo($getaddr[0]->{addr}, $NI_NUMERICHOST); + if (defined($address)) { + $h{addr} = $address; + $h{addr} =~ s/\%(.)*$//; # remove %ifID if IPv6 + $h{family} = $getaddr[0]->{family}; + if ($h{family} == AF_INET) { + (undef, $h{addr_in}, undef, undef) = Socket::unpack_sockaddr_in $getaddr[0]->{addr}; + } else { + (undef, $h{addr_in}, undef, undef) = Socket::unpack_sockaddr_in6 $getaddr[0]->{addr}; + } + return \%h + } else { + croak("getnameinfo($getaddr[0]->{addr}) failed - $err"); + } + } else { + croak(sprintf("getaddrinfo($h{host},,%s) failed - $err", + $family == AF_INET ? "AF_INET" : "AF_INET6")); + } + # old way + } else { + if ($family == $AF_INET6) { + croak("Socket >= 1.94 required for IPv6 - found Socket $Socket::VERSION"); + } + + my @gethost = gethostbyname($h{host}); + if (defined($gethost[4])) { + $h{addr} = inet_ntoa($gethost[4]); + $h{addr_in} = $gethost[4]; + $h{family} = AF_INET; + return \%h + } else { + croak("gethostbyname($h{host}) failed - $^E"); + } + } +} + +sub _pack_sockaddr_in($$) { + my ($port, + $ip, + ) = @_; + + my $addr = ref($ip) eq "HASH" ? $ip->{addr_in} : $ip; + if (length($addr) <= 4 ) { + return Socket::pack_sockaddr_in($port, $addr); + } else { + return Socket::pack_sockaddr_in6($port, $addr); + } +} + +sub _unpack_sockaddr_in($;$) { + my ($addr, + $family, + ) = @_; + + my ($port, $host); + if ($family == AF_INET || (!defined($family) and length($addr) <= 16 )) { + ($port, $host) = Socket::unpack_sockaddr_in($addr); + } else { + ($port, $host) = Socket::unpack_sockaddr_in6($addr); + } + return $port, $host +} + +sub _inet_ntoa { + my ($addr + ) = @_; + + my $ret; + if ($Socket::VERSION >= 1.94) { + my ($err, $address) = Socket::getnameinfo($addr, $NI_NUMERICHOST); + if (defined($address)) { + $ret = $address; + } else { + croak("getnameinfo($addr) failed - $err"); + } + } else { + $ret = inet_ntoa($addr) + } + + return $ret +} + +1; +__END__ + +# Net::NNTP.pm +# +# Copyright (C) 1995-1997 Graham Barr. All rights reserved. +# Copyright (C) 2013-2016 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::NNTP; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use IO::Socket; +use Net::Cmd; +use Net::Config; +use Time::Local; + +our $VERSION = "3.11"; + +# Code for detecting if we can use SSL +my $ssl_class = eval { + require IO::Socket::SSL; + # first version with default CA on most platforms + no warnings 'numeric'; + IO::Socket::SSL->VERSION(2.007); +} && 'IO::Socket::SSL'; + +my $nossl_warn = !$ssl_class && + 'To use SSL please install IO::Socket::SSL with version>=2.007'; + +# Code for detecting if we can use IPv6 +my $family_key = 'Domain'; +my $inet6_class = eval { + require IO::Socket::IP; + no warnings 'numeric'; + IO::Socket::IP->VERSION(0.25) || die; + $family_key = 'Family'; +} && 'IO::Socket::IP' || eval { + require IO::Socket::INET6; + no warnings 'numeric'; + IO::Socket::INET6->VERSION(2.62); +} && 'IO::Socket::INET6'; + + +sub can_ssl { $ssl_class }; +sub can_inet6 { $inet6_class }; + +our @ISA = ('Net::Cmd', $inet6_class || 'IO::Socket::INET'); + + +sub new { + my $self = shift; + my $type = ref($self) || $self; + my ($host, %arg); + if (@_ % 2) { + $host = shift; + %arg = @_; + } + else { + %arg = @_; + $host = delete $arg{Host}; + } + my $obj; + + $host ||= $ENV{NNTPSERVER} || $ENV{NEWSHOST}; + + my $hosts = defined $host ? [$host] : $NetConfig{nntp_hosts}; + + @{$hosts} = qw(news) + unless @{$hosts}; + + my %connect = ( Proto => 'tcp'); + + if ($arg{SSL}) { + # SSL from start + die $nossl_warn if ! $ssl_class; + $arg{Port} ||= 563; + $connect{$_} = $arg{$_} for(grep { m{^SSL_} } keys %arg); + } + + foreach my $o (qw(LocalAddr LocalPort Timeout)) { + $connect{$o} = $arg{$o} if exists $arg{$o}; + } + $connect{$family_key} = $arg{Domain} || $arg{Family}; + $connect{Timeout} = 120 unless defined $connect{Timeout}; + $connect{PeerPort} = $arg{Port} || 'nntp(119)'; + foreach my $h (@{$hosts}) { + $connect{PeerAddr} = $h; + $obj = $type->SUPER::new(%connect) or next; + ${*$obj}{'net_nntp_host'} = $h; + ${*$obj}{'net_nntp_arg'} = \%arg; + if ($arg{SSL}) { + Net::NNTP::_SSL->start_SSL($obj,%arg) or next; + } + last: + } + + return + unless defined $obj; + + $obj->autoflush(1); + $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef); + + unless ($obj->response() == CMD_OK) { + $obj->close; + return; + } + + my $c = $obj->code; + my @m = $obj->message; + + unless (exists $arg{Reader} && $arg{Reader} == 0) { + + # if server is INN and we have transfer rights the we are currently + # talking to innd not nnrpd + if ($obj->reader) { + + # If reader succeeds the we need to consider this code to determine postok + $c = $obj->code; + } + else { + + # I want to ignore this failure, so restore the previous status. + $obj->set_status($c, \@m); + } + } + + ${*$obj}{'net_nntp_post'} = $c == 200 ? 1 : 0; + + $obj; +} + + +sub host { + my $me = shift; + ${*$me}{'net_nntp_host'}; +} + + +sub debug_text { + my $nntp = shift; + my $inout = shift; + my $text = shift; + + if ( (ref($nntp) and $nntp->code == 350 and $text =~ /^(\S+)/) + || ($text =~ /^(authinfo\s+pass)/io)) + { + $text = "$1 ....\n"; + } + + $text; +} + + +sub postok { + @_ == 1 or croak 'usage: $nntp->postok()'; + my $nntp = shift; + ${*$nntp}{'net_nntp_post'} || 0; +} + + +sub starttls { + my $self = shift; + $ssl_class or die $nossl_warn; + $self->_STARTTLS or return; + Net::NNTP::_SSL->start_SSL($self, + %{ ${*$self}{'net_nntp_arg'} }, # (ssl) args given in new + @_ # more (ssl) args + ) or return; + return 1; +} + + +sub article { + @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->article( [ MSGID ], [ FH ] )'; + my $nntp = shift; + my @fh; + + @fh = (pop) if @_ == 2 || (@_ && (ref($_[0]) || ref(\$_[0]) eq 'GLOB')); + + $nntp->_ARTICLE(@_) + ? $nntp->read_until_dot(@fh) + : undef; +} + + +sub articlefh { + @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->articlefh( [ MSGID ] )'; + my $nntp = shift; + + return unless $nntp->_ARTICLE(@_); + return $nntp->tied_fh; +} + + +sub authinfo { + @_ == 3 or croak 'usage: $nntp->authinfo( USER, PASS )'; + my ($nntp, $user, $pass) = @_; + + $nntp->_AUTHINFO("USER", $user) == CMD_MORE + && $nntp->_AUTHINFO("PASS", $pass) == CMD_OK; +} + + +sub authinfo_simple { + @_ == 3 or croak 'usage: $nntp->authinfo( USER, PASS )'; + my ($nntp, $user, $pass) = @_; + + $nntp->_AUTHINFO('SIMPLE') == CMD_MORE + && $nntp->command($user, $pass)->response == CMD_OK; +} + + +sub body { + @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->body( [ MSGID ], [ FH ] )'; + my $nntp = shift; + my @fh; + + @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB'); + + $nntp->_BODY(@_) + ? $nntp->read_until_dot(@fh) + : undef; +} + + +sub bodyfh { + @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->bodyfh( [ MSGID ] )'; + my $nntp = shift; + return unless $nntp->_BODY(@_); + return $nntp->tied_fh; +} + + +sub head { + @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->head( [ MSGID ], [ FH ] )'; + my $nntp = shift; + my @fh; + + @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB'); + + $nntp->_HEAD(@_) + ? $nntp->read_until_dot(@fh) + : undef; +} + + +sub headfh { + @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->headfh( [ MSGID ] )'; + my $nntp = shift; + return unless $nntp->_HEAD(@_); + return $nntp->tied_fh; +} + + +sub nntpstat { + @_ == 1 || @_ == 2 or croak 'usage: $nntp->nntpstat( [ MSGID ] )'; + my $nntp = shift; + + $nntp->_STAT(@_) && $nntp->message =~ /(<[^>]+>)/o + ? $1 + : undef; +} + + +sub group { + @_ == 1 || @_ == 2 or croak 'usage: $nntp->group( [ GROUP ] )'; + my $nntp = shift; + my $grp = ${*$nntp}{'net_nntp_group'}; + + return $grp + unless (@_ || wantarray); + + my $newgrp = shift; + + $newgrp = (defined($grp) and length($grp)) ? $grp : "" + unless defined($newgrp) and length($newgrp); + + return + unless $nntp->_GROUP($newgrp) and $nntp->message =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\S+)/; + + my ($count, $first, $last, $group) = ($1, $2, $3, $4); + + # group may be replied as '(current group)' + $group = ${*$nntp}{'net_nntp_group'} + if $group =~ /\(/; + + ${*$nntp}{'net_nntp_group'} = $group; + + wantarray + ? ($count, $first, $last, $group) + : $group; +} + + +sub help { + @_ == 1 or croak 'usage: $nntp->help()'; + my $nntp = shift; + + $nntp->_HELP + ? $nntp->read_until_dot + : undef; +} + + +sub ihave { + @_ >= 2 or croak 'usage: $nntp->ihave( MESSAGE-ID [, MESSAGE ])'; + my $nntp = shift; + my $mid = shift; + + $nntp->_IHAVE($mid) && $nntp->datasend(@_) + ? @_ == 0 || $nntp->dataend + : undef; +} + + +sub last { + @_ == 1 or croak 'usage: $nntp->last()'; + my $nntp = shift; + + $nntp->_LAST && $nntp->message =~ /(<[^>]+>)/o + ? $1 + : undef; +} + + +sub list { + @_ == 1 or croak 'usage: $nntp->list()'; + my $nntp = shift; + + $nntp->_LIST + ? $nntp->_grouplist + : undef; +} + + +sub newgroups { + @_ >= 2 or croak 'usage: $nntp->newgroups( SINCE [, DISTRIBUTIONS ])'; + my $nntp = shift; + my $time = _timestr(shift); + my $dist = shift || ""; + + $dist = join(",", @{$dist}) + if ref($dist); + + $nntp->_NEWGROUPS($time, $dist) + ? $nntp->_grouplist + : undef; +} + + +sub newnews { + @_ >= 2 && @_ <= 4 + or croak 'usage: $nntp->newnews( SINCE [, GROUPS [, DISTRIBUTIONS ]])'; + my $nntp = shift; + my $time = _timestr(shift); + my $grp = @_ ? shift: $nntp->group; + my $dist = shift || ""; + + $grp ||= "*"; + $grp = join(",", @{$grp}) + if ref($grp); + + $dist = join(",", @{$dist}) + if ref($dist); + + $nntp->_NEWNEWS($grp, $time, $dist) + ? $nntp->_articlelist + : undef; +} + + +sub next { + @_ == 1 or croak 'usage: $nntp->next()'; + my $nntp = shift; + + $nntp->_NEXT && $nntp->message =~ /(<[^>]+>)/o + ? $1 + : undef; +} + + +sub post { + @_ >= 1 or croak 'usage: $nntp->post( [ MESSAGE ] )'; + my $nntp = shift; + + $nntp->_POST() && $nntp->datasend(@_) + ? @_ == 0 || $nntp->dataend + : undef; +} + + +sub postfh { + my $nntp = shift; + return unless $nntp->_POST(); + return $nntp->tied_fh; +} + + +sub quit { + @_ == 1 or croak 'usage: $nntp->quit()'; + my $nntp = shift; + + $nntp->_QUIT; + $nntp->close; +} + + +sub slave { + @_ == 1 or croak 'usage: $nntp->slave()'; + my $nntp = shift; + + $nntp->_SLAVE; +} + +## +## The following methods are not implemented by all servers +## + + +sub active { + @_ == 1 || @_ == 2 or croak 'usage: $nntp->active( [ PATTERN ] )'; + my $nntp = shift; + + $nntp->_LIST('ACTIVE', @_) + ? $nntp->_grouplist + : undef; +} + + +sub active_times { + @_ == 1 or croak 'usage: $nntp->active_times()'; + my $nntp = shift; + + $nntp->_LIST('ACTIVE.TIMES') + ? $nntp->_grouplist + : undef; +} + + +sub distributions { + @_ == 1 or croak 'usage: $nntp->distributions()'; + my $nntp = shift; + + $nntp->_LIST('DISTRIBUTIONS') + ? $nntp->_description + : undef; +} + + +sub distribution_patterns { + @_ == 1 or croak 'usage: $nntp->distributions()'; + my $nntp = shift; + + my $arr; + local $_; + + ## no critic (ControlStructures::ProhibitMutatingListFunctions) + $nntp->_LIST('DISTRIB.PATS') + && ($arr = $nntp->read_until_dot) + ? [grep { /^\d/ && (chomp, $_ = [split /:/]) } @$arr] + : undef; +} + + +sub newsgroups { + @_ == 1 || @_ == 2 or croak 'usage: $nntp->newsgroups( [ PATTERN ] )'; + my $nntp = shift; + + $nntp->_LIST('NEWSGROUPS', @_) + ? $nntp->_description + : undef; +} + + +sub overview_fmt { + @_ == 1 or croak 'usage: $nntp->overview_fmt()'; + my $nntp = shift; + + $nntp->_LIST('OVERVIEW.FMT') + ? $nntp->_articlelist + : undef; +} + + +sub subscriptions { + @_ == 1 or croak 'usage: $nntp->subscriptions()'; + my $nntp = shift; + + $nntp->_LIST('SUBSCRIPTIONS') + ? $nntp->_articlelist + : undef; +} + + +sub listgroup { + @_ == 1 || @_ == 2 or croak 'usage: $nntp->listgroup( [ GROUP ] )'; + my $nntp = shift; + + $nntp->_LISTGROUP(@_) + ? $nntp->_articlelist + : undef; +} + + +sub reader { + @_ == 1 or croak 'usage: $nntp->reader()'; + my $nntp = shift; + + $nntp->_MODE('READER'); +} + + +sub xgtitle { + @_ == 1 || @_ == 2 or croak 'usage: $nntp->xgtitle( [ PATTERN ] )'; + my $nntp = shift; + + $nntp->_XGTITLE(@_) + ? $nntp->_description + : undef; +} + + +sub xhdr { + @_ >= 2 && @_ <= 4 or croak 'usage: $nntp->xhdr( HEADER, [ MESSAGE-SPEC ] )'; + my $nntp = shift; + my $hdr = shift; + my $arg = _msg_arg(@_); + + $nntp->_XHDR($hdr, $arg) + ? $nntp->_description + : undef; +} + + +sub xover { + @_ == 2 || @_ == 3 or croak 'usage: $nntp->xover( MESSAGE-SPEC )'; + my $nntp = shift; + my $arg = _msg_arg(@_); + + $nntp->_XOVER($arg) + ? $nntp->_fieldlist + : undef; +} + + +sub xpat { + @_ == 4 || @_ == 5 or croak '$nntp->xpat( HEADER, PATTERN, MESSAGE-SPEC )'; + my $nntp = shift; + my $hdr = shift; + my $pat = shift; + my $arg = _msg_arg(@_); + + $pat = join(" ", @$pat) + if ref($pat); + + $nntp->_XPAT($hdr, $arg, $pat) + ? $nntp->_description + : undef; +} + + +sub xpath { + @_ == 2 or croak 'usage: $nntp->xpath( MESSAGE-ID )'; + my ($nntp, $mid) = @_; + + return + unless $nntp->_XPATH($mid); + + my $m; + ($m = $nntp->message) =~ s/^\d+\s+//o; + my @p = split /\s+/, $m; + + wantarray ? @p : $p[0]; +} + + +sub xrover { + @_ == 2 || @_ == 3 or croak 'usage: $nntp->xrover( MESSAGE-SPEC )'; + my $nntp = shift; + my $arg = _msg_arg(@_); + + $nntp->_XROVER($arg) + ? $nntp->_description + : undef; +} + + +sub date { + @_ == 1 or croak 'usage: $nntp->date()'; + my $nntp = shift; + + $nntp->_DATE + && $nntp->message =~ /(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/ + ? timegm($6, $5, $4, $3, $2 - 1, $1 - 1900) + : undef; +} + + +## +## Private subroutines +## + + +sub _msg_arg { + my $spec = shift; + my $arg = ""; + + if (@_) { + carp "Depriciated passing of two message numbers, " . "pass a reference" + if $^W; + $spec = [$spec, $_[0]]; + } + + if (defined $spec) { + if (ref($spec)) { + $arg = $spec->[0]; + if (defined $spec->[1]) { + $arg .= "-" + if $spec->[1] != $spec->[0]; + $arg .= $spec->[1] + if $spec->[1] > $spec->[0]; + } + } + else { + $arg = $spec; + } + } + + $arg; +} + + +sub _timestr { + my $time = shift; + my @g = reverse((gmtime($time))[0 .. 5]); + $g[1] += 1; + $g[0] %= 100; + sprintf "%02d%02d%02d %02d%02d%02d GMT", @g; +} + + +sub _grouplist { + my $nntp = shift; + my $arr = $nntp->read_until_dot + or return; + + my $hash = {}; + + foreach my $ln (@$arr) { + my @a = split(/[\s\n]+/, $ln); + $hash->{$a[0]} = [@a[1, 2, 3]]; + } + + $hash; +} + + +sub _fieldlist { + my $nntp = shift; + my $arr = $nntp->read_until_dot + or return; + + my $hash = {}; + + foreach my $ln (@$arr) { + my @a = split(/[\t\n]/, $ln); + my $m = shift @a; + $hash->{$m} = [@a]; + } + + $hash; +} + + +sub _articlelist { + my $nntp = shift; + my $arr = $nntp->read_until_dot; + + chomp(@$arr) + if $arr; + + $arr; +} + + +sub _description { + my $nntp = shift; + my $arr = $nntp->read_until_dot + or return; + + my $hash = {}; + + foreach my $ln (@$arr) { + chomp($ln); + + $hash->{$1} = $ln + if $ln =~ s/^\s*(\S+)\s*//o; + } + + $hash; + +} + +## +## The commands +## + + +sub _ARTICLE { shift->command('ARTICLE', @_)->response == CMD_OK } +sub _AUTHINFO { shift->command('AUTHINFO', @_)->response } +sub _BODY { shift->command('BODY', @_)->response == CMD_OK } +sub _DATE { shift->command('DATE')->response == CMD_INFO } +sub _GROUP { shift->command('GROUP', @_)->response == CMD_OK } +sub _HEAD { shift->command('HEAD', @_)->response == CMD_OK } +sub _HELP { shift->command('HELP', @_)->response == CMD_INFO } +sub _IHAVE { shift->command('IHAVE', @_)->response == CMD_MORE } +sub _LAST { shift->command('LAST')->response == CMD_OK } +sub _LIST { shift->command('LIST', @_)->response == CMD_OK } +sub _LISTGROUP { shift->command('LISTGROUP', @_)->response == CMD_OK } +sub _NEWGROUPS { shift->command('NEWGROUPS', @_)->response == CMD_OK } +sub _NEWNEWS { shift->command('NEWNEWS', @_)->response == CMD_OK } +sub _NEXT { shift->command('NEXT')->response == CMD_OK } +sub _POST { shift->command('POST', @_)->response == CMD_MORE } +sub _QUIT { shift->command('QUIT', @_)->response == CMD_OK } +sub _SLAVE { shift->command('SLAVE', @_)->response == CMD_OK } +sub _STARTTLS { shift->command("STARTTLS")->response() == CMD_MORE } +sub _STAT { shift->command('STAT', @_)->response == CMD_OK } +sub _MODE { shift->command('MODE', @_)->response == CMD_OK } +sub _XGTITLE { shift->command('XGTITLE', @_)->response == CMD_OK } +sub _XHDR { shift->command('XHDR', @_)->response == CMD_OK } +sub _XPAT { shift->command('XPAT', @_)->response == CMD_OK } +sub _XPATH { shift->command('XPATH', @_)->response == CMD_OK } +sub _XOVER { shift->command('XOVER', @_)->response == CMD_OK } +sub _XROVER { shift->command('XROVER', @_)->response == CMD_OK } +sub _XTHREAD { shift->unsupported } +sub _XSEARCH { shift->unsupported } +sub _XINDEX { shift->unsupported } + +## +## IO/perl methods +## + + +sub DESTROY { + my $nntp = shift; + defined(fileno($nntp)) && $nntp->quit; +} + +{ + package Net::NNTP::_SSL; + our @ISA = ( $ssl_class ? ($ssl_class):(), 'Net::NNTP' ); + sub starttls { die "NNTP connection is already in SSL mode" } + sub start_SSL { + my ($class,$nntp,%arg) = @_; + delete @arg{ grep { !m{^SSL_} } keys %arg }; + ( $arg{SSL_verifycn_name} ||= $nntp->host ) + =~s{(?can_client_sni; + my $ok = $class->SUPER::start_SSL($nntp, + SSL_verifycn_scheme => 'nntp', + %arg + ); + $@ = $ssl_class->errstr if !$ok; + return $ok; + } +} + + + + +1; + +__END__ + +# Net::FTP.pm +# +# Copyright (C) 1995-2004 Graham Barr. All rights reserved. +# Copyright (C) 2013-2017 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. +# +# Documentation (at end) improved 1996 by Nathan Torkington . + +package Net::FTP; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Fcntl qw(O_WRONLY O_RDONLY O_APPEND O_CREAT O_TRUNC); +use IO::Socket; +use Net::Cmd; +use Net::Config; +use Socket; +use Time::Local; + +our $VERSION = '3.11'; + +our $IOCLASS; +my $family_key; +BEGIN { + # Code for detecting if we can use SSL + my $ssl_class = eval { + require IO::Socket::SSL; + # first version with default CA on most platforms + no warnings 'numeric'; + IO::Socket::SSL->VERSION(2.007); + } && 'IO::Socket::SSL'; + + my $nossl_warn = !$ssl_class && + 'To use SSL please install IO::Socket::SSL with version>=2.007'; + + # Code for detecting if we can use IPv6 + my $inet6_class = eval { + require IO::Socket::IP; + no warnings 'numeric'; + IO::Socket::IP->VERSION(0.25); + } && 'IO::Socket::IP' || eval { + require IO::Socket::INET6; + no warnings 'numeric'; + IO::Socket::INET6->VERSION(2.62); + } && 'IO::Socket::INET6'; + + sub can_ssl { $ssl_class }; + sub can_inet6 { $inet6_class }; + + $IOCLASS = $ssl_class || $inet6_class || 'IO::Socket::INET'; + $family_key = + ( $ssl_class ? $ssl_class->can_ipv6 : $inet6_class || '' ) + eq 'IO::Socket::IP' + ? 'Family' : 'Domain'; +} + +our @ISA = ('Exporter','Net::Cmd',$IOCLASS); + +use constant TELNET_IAC => 255; +use constant TELNET_IP => 244; +use constant TELNET_DM => 242; + +use constant EBCDIC => $^O eq 'os390'; + +sub new { + my $pkg = shift; + my ($peer, %arg); + if (@_ % 2) { + $peer = shift; + %arg = @_; + } + else { + %arg = @_; + $peer = delete $arg{Host}; + } + + my $host = $peer; + my $fire = undef; + my $fire_type = undef; + + if (exists($arg{Firewall}) || Net::Config->requires_firewall($peer)) { + $fire = $arg{Firewall} + || $ENV{FTP_FIREWALL} + || $NetConfig{ftp_firewall} + || undef; + + if (defined $fire) { + $peer = $fire; + delete $arg{Port}; + $fire_type = $arg{FirewallType} + || $ENV{FTP_FIREWALL_TYPE} + || $NetConfig{firewall_type} + || undef; + } + } + + my %tlsargs; + if (can_ssl()) { + # for name verification strip port from domain:port, ipv4:port, [ipv6]:port + (my $hostname = $host) =~s{(? 'ftp', + SSL_verifycn_name => $hostname, + # use SNI if supported by IO::Socket::SSL + $pkg->can_client_sni ? (SSL_hostname => $hostname):(), + # reuse SSL session of control connection in data connections + SSL_session_cache => Net::FTP::_SSL_SingleSessionCache->new, + ); + # user defined SSL arg + $tlsargs{$_} = $arg{$_} for(grep { m{^SSL_} } keys %arg); + + } elsif ($arg{SSL}) { + croak("IO::Socket::SSL >= 2.007 needed for SSL support"); + } + + my $ftp = $pkg->SUPER::new( + PeerAddr => $peer, + PeerPort => $arg{Port} || ($arg{SSL} ? 'ftps(990)' : 'ftp(21)'), + LocalAddr => $arg{'LocalAddr'}, + $family_key => $arg{Domain} || $arg{Family}, + Proto => 'tcp', + Timeout => defined $arg{Timeout} ? $arg{Timeout} : 120, + %tlsargs, + $arg{SSL} ? ():( SSL_startHandshake => 0 ), + ) or return; + + ${*$ftp}{'net_ftp_host'} = $host; # Remote hostname + ${*$ftp}{'net_ftp_type'} = 'A'; # ASCII/binary/etc mode + ${*$ftp}{'net_ftp_blksize'} = abs($arg{'BlockSize'} || 10240); + + ${*$ftp}{'net_ftp_localaddr'} = $arg{'LocalAddr'}; + ${*$ftp}{'net_ftp_domain'} = $arg{Domain} || $arg{Family}; + + ${*$ftp}{'net_ftp_firewall'} = $fire + if (defined $fire); + ${*$ftp}{'net_ftp_firewall_type'} = $fire_type + if (defined $fire_type); + + ${*$ftp}{'net_ftp_passive'} = + int exists $arg{Passive} ? $arg{Passive} + : exists $ENV{FTP_PASSIVE} ? $ENV{FTP_PASSIVE} + : defined $fire ? $NetConfig{ftp_ext_passive} + : $NetConfig{ftp_int_passive}; # Whew! :-) + + ${*$ftp}{net_ftp_tlsargs} = \%tlsargs if %tlsargs; + if ($arg{SSL}) { + ${*$ftp}{net_ftp_tlsprot} = 'P'; + ${*$ftp}{net_ftp_tlsdirect} = 1; + } + + $ftp->hash(exists $arg{Hash} ? $arg{Hash} : 0, 1024); + + $ftp->autoflush(1); + + $ftp->debug(exists $arg{Debug} ? $arg{Debug} : undef); + + unless ($ftp->response() == CMD_OK) { + $ftp->close(); + # keep @$ if no message. Happens, when response did not start with a code. + $@ = $ftp->message || $@; + undef $ftp; + } + + $ftp; +} + +## +## User interface methods +## + + +sub host { + my $me = shift; + ${*$me}{'net_ftp_host'}; +} + +sub passive { + my $ftp = shift; + return ${*$ftp}{'net_ftp_passive'} unless @_; + ${*$ftp}{'net_ftp_passive'} = shift; +} + + +sub hash { + my $ftp = shift; # self + + my ($h, $b) = @_; + unless ($h) { + delete ${*$ftp}{'net_ftp_hash'}; + return [\*STDERR, 0]; + } + ($h, $b) = (ref($h) ? $h : \*STDERR, $b || 1024); + select((select($h), $| = 1)[0]); + $b = 512 if $b < 512; + ${*$ftp}{'net_ftp_hash'} = [$h, $b]; +} + + +sub quit { + my $ftp = shift; + + $ftp->_QUIT; + $ftp->close; +} + + +sub DESTROY { } + + +sub ascii { shift->type('A', @_); } +sub binary { shift->type('I', @_); } + + +sub ebcdic { + carp "TYPE E is unsupported, shall default to I"; + shift->type('E', @_); +} + + +sub byte { + carp "TYPE L is unsupported, shall default to I"; + shift->type('L', @_); +} + +# Allow the user to send a command directly, BE CAREFUL !! + + +sub quot { + my $ftp = shift; + my $cmd = shift; + + $ftp->command(uc $cmd, @_); + $ftp->response(); +} + + +sub site { + my $ftp = shift; + + $ftp->command("SITE", @_); + $ftp->response(); +} + + +sub mdtm { + my $ftp = shift; + my $file = shift; + + # Server Y2K bug workaround + # + # sigh; some idiotic FTP servers use ("19%d",tm.tm_year) instead of + # ("%d",tm.tm_year+1900). This results in an extra digit in the + # string returned. To account for this we allow an optional extra + # digit in the year. Then if the first two digits are 19 we use the + # remainder, otherwise we subtract 1900 from the whole year. + + $ftp->_MDTM($file) + && $ftp->message =~ /((\d\d)(\d\d\d?))(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/ + ? timegm($8, $7, $6, $5, $4 - 1, $2 eq '19' ? $3 : ($1 - 1900)) + : undef; +} + + +sub size { + my $ftp = shift; + my $file = shift; + my $io; + if ($ftp->supported("SIZE")) { + return $ftp->_SIZE($file) + ? ($ftp->message =~ /(\d+)\s*(bytes?\s*)?$/)[0] + : undef; + } + elsif ($ftp->supported("STAT")) { + my @msg; + return + unless $ftp->_STAT($file) && (@msg = $ftp->message) == 3; + foreach my $line (@msg) { + return (split(/\s+/, $line))[4] + if $line =~ /^[-rwxSsTt]{10}/; + } + } + else { + my @files = $ftp->dir($file); + if (@files) { + return (split(/\s+/, $1))[4] + if $files[0] =~ /^([-rwxSsTt]{10}.*)$/; + } + } + undef; +} + + +sub starttls { + my $ftp = shift; + can_ssl() or croak("IO::Socket::SSL >= 2.007 needed for SSL support"); + $ftp->is_SSL and croak("called starttls within SSL session"); + $ftp->_AUTH('TLS') == CMD_OK or return; + + $ftp->connect_SSL or return; + $ftp->prot('P'); + return 1; +} + +sub prot { + my ($ftp,$prot) = @_; + $prot eq 'C' or $prot eq 'P' or croak("prot must by C or P"); + $ftp->_PBSZ(0) or return; + $ftp->_PROT($prot) or return; + ${*$ftp}{net_ftp_tlsprot} = $prot; + return 1; +} + +sub stoptls { + my $ftp = shift; + $ftp->is_SSL or croak("called stoptls outside SSL session"); + ${*$ftp}{net_ftp_tlsdirect} and croak("cannot stoptls direct SSL session"); + $ftp->_CCC() or return; + $ftp->stop_SSL(); + return 1; +} + +sub login { + my ($ftp, $user, $pass, $acct) = @_; + my ($ok, $ruser, $fwtype); + + unless (defined $user) { + require Net::Netrc; + + my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'}); + + ($user, $pass, $acct) = $rc->lpa() + if ($rc); + } + + $user ||= "anonymous"; + $ruser = $user; + + $fwtype = ${*$ftp}{'net_ftp_firewall_type'} + || $NetConfig{'ftp_firewall_type'} + || 0; + + if ($fwtype && defined ${*$ftp}{'net_ftp_firewall'}) { + if ($fwtype == 1 || $fwtype == 7) { + $user .= '@' . ${*$ftp}{'net_ftp_host'}; + } + else { + require Net::Netrc; + + my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'}); + + my ($fwuser, $fwpass, $fwacct) = $rc ? $rc->lpa() : (); + + if ($fwtype == 5) { + $user = join('@', $user, $fwuser, ${*$ftp}{'net_ftp_host'}); + $pass = $pass . '@' . $fwpass; + } + else { + if ($fwtype == 2) { + $user .= '@' . ${*$ftp}{'net_ftp_host'}; + } + elsif ($fwtype == 6) { + $fwuser .= '@' . ${*$ftp}{'net_ftp_host'}; + } + + $ok = $ftp->_USER($fwuser); + + return 0 unless $ok == CMD_OK || $ok == CMD_MORE; + + $ok = $ftp->_PASS($fwpass || ""); + + return 0 unless $ok == CMD_OK || $ok == CMD_MORE; + + $ok = $ftp->_ACCT($fwacct) + if defined($fwacct); + + if ($fwtype == 3) { + $ok = $ftp->command("SITE", ${*$ftp}{'net_ftp_host'})->response; + } + elsif ($fwtype == 4) { + $ok = $ftp->command("OPEN", ${*$ftp}{'net_ftp_host'})->response; + } + + return 0 unless $ok == CMD_OK || $ok == CMD_MORE; + } + } + } + + $ok = $ftp->_USER($user); + + # Some dumb firewalls don't prefix the connection messages + $ok = $ftp->response() + if ($ok == CMD_OK && $ftp->code == 220 && $user =~ /\@/); + + if ($ok == CMD_MORE) { + unless (defined $pass) { + require Net::Netrc; + + my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'}, $ruser); + + ($ruser, $pass, $acct) = $rc->lpa() + if ($rc); + + $pass = '-anonymous@' + if (!defined $pass && (!defined($ruser) || $ruser =~ /^anonymous/o)); + } + + $ok = $ftp->_PASS($pass || ""); + } + + $ok = $ftp->_ACCT($acct) + if (defined($acct) && ($ok == CMD_MORE || $ok == CMD_OK)); + + if ($fwtype == 7 && $ok == CMD_OK && defined ${*$ftp}{'net_ftp_firewall'}) { + my ($f, $auth, $resp) = _auth_id($ftp); + $ftp->authorize($auth, $resp) if defined($resp); + } + + $ok == CMD_OK; +} + + +sub account { + @_ == 2 or croak 'usage: $ftp->account( ACCT )'; + my $ftp = shift; + my $acct = shift; + $ftp->_ACCT($acct) == CMD_OK; +} + + +sub _auth_id { + my ($ftp, $auth, $resp) = @_; + + unless (defined $resp) { + require Net::Netrc; + + $auth ||= eval { (getpwuid($>))[0] } || $ENV{NAME}; + + my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'}, $auth) + || Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'}); + + ($auth, $resp) = $rc->lpa() + if ($rc); + } + ($ftp, $auth, $resp); +} + + +sub authorize { + @_ >= 1 || @_ <= 3 or croak 'usage: $ftp->authorize( [AUTH [, RESP]])'; + + my ($ftp, $auth, $resp) = &_auth_id; + + my $ok = $ftp->_AUTH($auth || ""); + + return $ftp->_RESP($resp || "") + if ($ok == CMD_MORE); + + $ok == CMD_OK; +} + + +sub rename { + @_ == 3 or croak 'usage: $ftp->rename(FROM, TO)'; + + my ($ftp, $from, $to) = @_; + + $ftp->_RNFR($from) + && $ftp->_RNTO($to); +} + + +sub type { + my $ftp = shift; + my $type = shift; + my $oldval = ${*$ftp}{'net_ftp_type'}; + + return $oldval + unless (defined $type); + + return + unless ($ftp->_TYPE($type, @_)); + + ${*$ftp}{'net_ftp_type'} = join(" ", $type, @_); + + $oldval; +} + + +sub alloc { + my $ftp = shift; + my $size = shift; + my $oldval = ${*$ftp}{'net_ftp_allo'}; + + return $oldval + unless (defined $size); + + return + unless ($ftp->supported("ALLO") and $ftp->_ALLO($size, @_)); + + ${*$ftp}{'net_ftp_allo'} = join(" ", $size, @_); + + $oldval; +} + + +sub abort { + my $ftp = shift; + + send($ftp, pack("CCC", TELNET_IAC, TELNET_IP, TELNET_IAC), MSG_OOB); + + $ftp->command(pack("C", TELNET_DM) . "ABOR"); + + ${*$ftp}{'net_ftp_dataconn'}->close() + if defined ${*$ftp}{'net_ftp_dataconn'}; + + $ftp->response(); + + $ftp->status == CMD_OK; +} + + +sub get { + my ($ftp, $remote, $local, $where) = @_; + + my ($loc, $len, $buf, $resp, $data); + local *FD; + + my $localfd = ref($local) || ref(\$local) eq "GLOB"; + + ($local = $remote) =~ s#^.*/## + unless (defined $local); + + croak("Bad remote filename '$remote'\n") + if $remote =~ /[\r\n]/s; + + ${*$ftp}{'net_ftp_rest'} = $where if defined $where; + my $rest = ${*$ftp}{'net_ftp_rest'}; + + delete ${*$ftp}{'net_ftp_port'}; + delete ${*$ftp}{'net_ftp_pasv'}; + + $data = $ftp->retr($remote) + or return; + + if ($localfd) { + $loc = $local; + } + else { + $loc = \*FD; + + unless (sysopen($loc, $local, O_CREAT | O_WRONLY | ($rest ? O_APPEND: O_TRUNC))) { + carp "Cannot open Local file $local: $!\n"; + $data->abort; + return; + } + } + + if ($ftp->type eq 'I' && !binmode($loc)) { + carp "Cannot binmode Local file $local: $!\n"; + $data->abort; + close($loc) unless $localfd; + return; + } + + $buf = ''; + my ($count, $hashh, $hashb, $ref) = (0); + + ($hashh, $hashb) = @$ref + if ($ref = ${*$ftp}{'net_ftp_hash'}); + + my $blksize = ${*$ftp}{'net_ftp_blksize'}; + local $\; # Just in case + + while (1) { + last unless $len = $data->read($buf, $blksize); + + if (EBCDIC && $ftp->type ne 'I') { + $buf = $ftp->toebcdic($buf); + $len = length($buf); + } + + if ($hashh) { + $count += $len; + print $hashh "#" x (int($count / $hashb)); + $count %= $hashb; + } + unless (print $loc $buf) { + carp "Cannot write to Local file $local: $!\n"; + $data->abort; + close($loc) + unless $localfd; + return; + } + } + + print $hashh "\n" if $hashh; + + unless ($localfd) { + unless (close($loc)) { + carp "Cannot close file $local (perhaps disk space) $!\n"; + return; + } + } + + unless ($data->close()) # implied $ftp->response + { + carp "Unable to close datastream"; + return; + } + + return $local; +} + + +sub cwd { + @_ == 1 || @_ == 2 or croak 'usage: $ftp->cwd( [ DIR ] )'; + + my ($ftp, $dir) = @_; + + $dir = "/" unless defined($dir) && $dir =~ /\S/; + + $dir eq ".." + ? $ftp->_CDUP() + : $ftp->_CWD($dir); +} + + +sub cdup { + @_ == 1 or croak 'usage: $ftp->cdup()'; + $_[0]->_CDUP; +} + + +sub pwd { + @_ == 1 || croak 'usage: $ftp->pwd()'; + my $ftp = shift; + + $ftp->_PWD(); + $ftp->_extract_path; +} + +# rmdir( $ftp, $dir, [ $recurse ] ) +# +# Removes $dir on remote host via FTP. +# $ftp is handle for remote host +# +# If $recurse is TRUE, the directory and deleted recursively. +# This means all of its contents and subdirectories. +# +# Initial version contributed by Dinkum Software +# +sub rmdir { + @_ == 2 || @_ == 3 or croak('usage: $ftp->rmdir( DIR [, RECURSE ] )'); + + # Pick off the args + my ($ftp, $dir, $recurse) = @_; + my $ok; + + return $ok + if $ok = $ftp->_RMD($dir) + or !$recurse; + + # Try to delete the contents + # Get a list of all the files in the directory, excluding the current and parent directories + my @filelist = map { /^(?:\S+;)+ (.+)$/ ? ($1) : () } grep { !/^(?:\S+;)*type=[cp]dir;/i } $ftp->_list_cmd("MLSD", $dir); + + # Fallback to using the less well-defined NLST command if MLSD fails + @filelist = grep { !/^\.{1,2}$/ } $ftp->ls($dir) + unless @filelist; + + return + unless @filelist; # failed, it is probably not a directory + + return $ftp->delete($dir) + if @filelist == 1 and $dir eq $filelist[0]; + + # Go thru and delete each file or the directory + foreach my $file (map { m,/, ? $_ : "$dir/$_" } @filelist) { + next # successfully deleted the file + if $ftp->delete($file); + + # Failed to delete it, assume its a directory + # Recurse and ignore errors, the final rmdir() will + # fail on any errors here + return $ok + unless $ok = $ftp->rmdir($file, 1); + } + + # Directory should be empty + # Try to remove the directory again + # Pass results directly to caller + # If any of the prior deletes failed, this + # rmdir() will fail because directory is not empty + return $ftp->_RMD($dir); +} + + +sub restart { + @_ == 2 || croak 'usage: $ftp->restart( BYTE_OFFSET )'; + + my ($ftp, $where) = @_; + + ${*$ftp}{'net_ftp_rest'} = $where; + + return; +} + + +sub mkdir { + @_ == 2 || @_ == 3 or croak 'usage: $ftp->mkdir( DIR [, RECURSE ] )'; + + my ($ftp, $dir, $recurse) = @_; + + $ftp->_MKD($dir) || $recurse + or return; + + my $path = $dir; + + unless ($ftp->ok) { + my @path = split(m#(?=/+)#, $dir); + + $path = ""; + + while (@path) { + $path .= shift @path; + + $ftp->_MKD($path); + + $path = $ftp->_extract_path($path); + } + + # If the creation of the last element was not successful, see if we + # can cd to it, if so then return path + + unless ($ftp->ok) { + my ($status, $message) = ($ftp->status, $ftp->message); + my $pwd = $ftp->pwd; + + if ($pwd && $ftp->cwd($dir)) { + $path = $dir; + $ftp->cwd($pwd); + } + else { + undef $path; + } + $ftp->set_status($status, $message); + } + } + + $path; +} + + +sub delete { + @_ == 2 || croak 'usage: $ftp->delete( FILENAME )'; + + $_[0]->_DELE($_[1]); +} + + +sub put { shift->_store_cmd("stor", @_) } +sub put_unique { shift->_store_cmd("stou", @_) } +sub append { shift->_store_cmd("appe", @_) } + + +sub nlst { shift->_data_cmd("NLST", @_) } +sub list { shift->_data_cmd("LIST", @_) } +sub retr { shift->_data_cmd("RETR", @_) } +sub stor { shift->_data_cmd("STOR", @_) } +sub stou { shift->_data_cmd("STOU", @_) } +sub appe { shift->_data_cmd("APPE", @_) } + + +sub _store_cmd { + my ($ftp, $cmd, $local, $remote) = @_; + my ($loc, $sock, $len, $buf); + local *FD; + + my $localfd = ref($local) || ref(\$local) eq "GLOB"; + + if (!defined($remote) and 'STOU' ne uc($cmd)) { + croak 'Must specify remote filename with stream input' + if $localfd; + + require File::Basename; + $remote = File::Basename::basename($local); + } + if (defined ${*$ftp}{'net_ftp_allo'}) { + delete ${*$ftp}{'net_ftp_allo'}; + } + else { + + # if the user hasn't already invoked the alloc method since the last + # _store_cmd call, figure out if the local file is a regular file(not + # a pipe, or device) and if so get the file size from stat, and send + # an ALLO command before sending the STOR, STOU, or APPE command. + my $size = do { local $^W; -f $local && -s _ }; # no ALLO if sending data from a pipe + ${*$ftp}{'net_ftp_allo'} = $size if $size; + } + croak("Bad remote filename '$remote'\n") + if defined($remote) and $remote =~ /[\r\n]/s; + + if ($localfd) { + $loc = $local; + } + else { + $loc = \*FD; + + unless (sysopen($loc, $local, O_RDONLY)) { + carp "Cannot open Local file $local: $!\n"; + return; + } + } + + if ($ftp->type eq 'I' && !binmode($loc)) { + carp "Cannot binmode Local file $local: $!\n"; + return; + } + + delete ${*$ftp}{'net_ftp_port'}; + delete ${*$ftp}{'net_ftp_pasv'}; + + $sock = $ftp->_data_cmd($cmd, grep { defined } $remote) + or return; + + $remote = ($ftp->message =~ /\w+\s*:\s*(.*)/)[0] + if 'STOU' eq uc $cmd; + + my $blksize = ${*$ftp}{'net_ftp_blksize'}; + + my ($count, $hashh, $hashb, $ref) = (0); + + ($hashh, $hashb) = @$ref + if ($ref = ${*$ftp}{'net_ftp_hash'}); + + while (1) { + last unless $len = read($loc, $buf = "", $blksize); + + if (EBCDIC && $ftp->type ne 'I') { + $buf = $ftp->toascii($buf); + $len = length($buf); + } + + if ($hashh) { + $count += $len; + print $hashh "#" x (int($count / $hashb)); + $count %= $hashb; + } + + my $wlen; + unless (defined($wlen = $sock->write($buf, $len)) && $wlen == $len) { + $sock->abort; + close($loc) + unless $localfd; + print $hashh "\n" if $hashh; + return; + } + } + + print $hashh "\n" if $hashh; + + close($loc) + unless $localfd; + + $sock->close() + or return; + + if ('STOU' eq uc $cmd and $ftp->message =~ m/unique\s+file\s*name\s*:\s*(.*)\)|"(.*)"/) { + require File::Basename; + $remote = File::Basename::basename($+); + } + + return $remote; +} + + +sub port { + @_ == 1 || @_ == 2 or croak 'usage: $self->port([PORT])'; + return _eprt('PORT',@_); +} + +sub eprt { + @_ == 1 || @_ == 2 or croak 'usage: $self->eprt([PORT])'; + return _eprt('EPRT',@_); +} + +sub _eprt { + my ($cmd,$ftp,$port) = @_; + delete ${*$ftp}{net_ftp_intern_port}; + unless ($port) { + my $listen = ${*$ftp}{net_ftp_listen} ||= $IOCLASS->new( + Listen => 1, + Timeout => $ftp->timeout, + LocalAddr => $ftp->sockhost, + $family_key => $ftp->sockdomain, + can_ssl() ? ( + %{ ${*$ftp}{net_ftp_tlsargs} }, + SSL_startHandshake => 0, + ):(), + ); + ${*$ftp}{net_ftp_intern_port} = 1; + my $fam = ($listen->sockdomain == AF_INET) ? 1:2; + if ( $cmd eq 'EPRT' || $fam == 2 ) { + $port = "|$fam|".$listen->sockhost."|".$listen->sockport."|"; + $cmd = 'EPRT'; + } else { + my $p = $listen->sockport; + $port = join(',',split(m{\.},$listen->sockhost),$p >> 8,$p & 0xff); + } + } elsif (ref($port) eq 'ARRAY') { + $port = join(',',split(m{\.},@$port[0]),@$port[1] >> 8,@$port[1] & 0xff); + } + my $ok = $cmd eq 'EPRT' ? $ftp->_EPRT($port) : $ftp->_PORT($port); + ${*$ftp}{net_ftp_port} = $port if $ok; + return $ok; +} + + +sub ls { shift->_list_cmd("NLST", @_); } +sub dir { shift->_list_cmd("LIST", @_); } + + +sub pasv { + my $ftp = shift; + @_ and croak 'usage: $ftp->port()'; + return $ftp->epsv if $ftp->sockdomain != AF_INET; + delete ${*$ftp}{net_ftp_intern_port}; + + if ( $ftp->_PASV && + $ftp->message =~ m{(\d+,\d+,\d+,\d+),(\d+),(\d+)} ) { + my $port = 256 * $2 + $3; + ( my $ip = $1 ) =~s{,}{.}g; + return ${*$ftp}{net_ftp_pasv} = [ $ip,$port ]; + } + return; +} + +sub epsv { + my $ftp = shift; + @_ and croak 'usage: $ftp->epsv()'; + delete ${*$ftp}{net_ftp_intern_port}; + + $ftp->_EPSV && $ftp->message =~ m{\(([\x33-\x7e])\1\1(\d+)\1\)} + ? ${*$ftp}{net_ftp_pasv} = [ $ftp->peerhost, $2 ] + : undef; +} + + +sub unique_name { + my $ftp = shift; + ${*$ftp}{'net_ftp_unique'} || undef; +} + + +sub supported { + @_ == 2 or croak 'usage: $ftp->supported( CMD )'; + my $ftp = shift; + my $cmd = uc shift; + my $hash = ${*$ftp}{'net_ftp_supported'} ||= {}; + + return $hash->{$cmd} + if exists $hash->{$cmd}; + + return $hash->{$cmd} = 1 + if $ftp->feature($cmd); + + return $hash->{$cmd} = 0 + unless $ftp->_HELP($cmd); + + my $text = $ftp->message; + if ($text =~ /following.+commands/i) { + $text =~ s/^.*\n//; + while ($text =~ /(\*?)(\w+)(\*?)/sg) { + $hash->{"\U$2"} = !length("$1$3"); + } + } + else { + $hash->{$cmd} = $text !~ /unimplemented/i; + } + + $hash->{$cmd} ||= 0; +} + +## +## Deprecated methods +## + + +sub lsl { + carp "Use of Net::FTP::lsl deprecated, use 'dir'" + if $^W; + goto &dir; +} + + +sub authorise { + carp "Use of Net::FTP::authorise deprecated, use 'authorize'" + if $^W; + goto &authorize; +} + + +## +## Private methods +## + + +sub _extract_path { + my ($ftp, $path) = @_; + + # This tries to work both with and without the quote doubling + # convention (RFC 959 requires it, but the first 3 servers I checked + # didn't implement it). It will fail on a server which uses a quote in + # the message which isn't a part of or surrounding the path. + $ftp->ok + && $ftp->message =~ /(?:^|\s)\"(.*)\"(?:$|\s)/ + && ($path = $1) =~ s/\"\"/\"/g; + + $path; +} + +## +## Communication methods +## + + +sub _dataconn { + my $ftp = shift; + my $pkg = "Net::FTP::" . $ftp->type; + eval "require " . $pkg ## no critic (BuiltinFunctions::ProhibitStringyEval) + or croak("cannot load $pkg required for type ".$ftp->type); + $pkg =~ s/ /_/g; + delete ${*$ftp}{net_ftp_dataconn}; + + my $conn; + my $pasv = ${*$ftp}{net_ftp_pasv}; + if ($pasv) { + $conn = $pkg->new( + PeerAddr => $pasv->[0], + PeerPort => $pasv->[1], + LocalAddr => ${*$ftp}{net_ftp_localaddr}, + $family_key => ${*$ftp}{net_ftp_domain}, + Timeout => $ftp->timeout, + can_ssl() ? ( + SSL_startHandshake => 0, + $ftp->is_SSL ? ( + SSL_reuse_ctx => $ftp, + SSL_verifycn_name => ${*$ftp}{net_ftp_tlsargs}{SSL_verifycn_name}, + # This will cause the use of SNI if supported by IO::Socket::SSL. + $ftp->can_client_sni ? ( + SSL_hostname => ${*$ftp}{net_ftp_tlsargs}{SSL_hostname} + ):(), + ) :( %{${*$ftp}{net_ftp_tlsargs}} ), + ):(), + ) or return; + } elsif (my $listen = delete ${*$ftp}{net_ftp_listen}) { + $conn = $listen->accept($pkg) or return; + $conn->timeout($ftp->timeout); + close($listen); + } else { + croak("no listener in active mode"); + } + + if (( ${*$ftp}{net_ftp_tlsprot} || '') eq 'P') { + if ($conn->connect_SSL) { + # SSL handshake ok + } else { + carp("failed to ssl upgrade dataconn: $IO::Socket::SSL::SSL_ERROR"); + return; + } + } + + ${*$ftp}{net_ftp_dataconn} = $conn; + ${*$conn} = ""; + ${*$conn}{net_ftp_cmd} = $ftp; + ${*$conn}{net_ftp_blksize} = ${*$ftp}{net_ftp_blksize}; + return $conn; +} + + +sub _list_cmd { + my $ftp = shift; + my $cmd = uc shift; + + delete ${*$ftp}{'net_ftp_port'}; + delete ${*$ftp}{'net_ftp_pasv'}; + + my $data = $ftp->_data_cmd($cmd, @_); + + return + unless (defined $data); + + require Net::FTP::A; + bless $data, "Net::FTP::A"; # Force ASCII mode + + my $databuf = ''; + my $buf = ''; + my $blksize = ${*$ftp}{'net_ftp_blksize'}; + + while ($data->read($databuf, $blksize)) { + $buf .= $databuf; + } + + my $list = [split(/\n/, $buf)]; + + $data->close(); + + if (EBCDIC) { + for (@$list) { $_ = $ftp->toebcdic($_) } + } + + wantarray + ? @{$list} + : $list; +} + + +sub _data_cmd { + my $ftp = shift; + my $cmd = uc shift; + my $ok = 1; + my $where = delete ${*$ftp}{'net_ftp_rest'} || 0; + my $arg; + + for my $arg (@_) { + croak("Bad argument '$arg'\n") + if $arg =~ /[\r\n]/s; + } + + if ( ${*$ftp}{'net_ftp_passive'} + && !defined ${*$ftp}{'net_ftp_pasv'} + && !defined ${*$ftp}{'net_ftp_port'}) + { + return unless defined $ftp->pasv; + + if ($where and !$ftp->_REST($where)) { + my ($status, $message) = ($ftp->status, $ftp->message); + $ftp->abort; + $ftp->set_status($status, $message); + return; + } + + # first send command, then open data connection + # otherwise the peer might not do a full accept (with SSL + # handshake if PROT P) + $ftp->command($cmd, @_); + my $data = $ftp->_dataconn(); + if (CMD_INFO == $ftp->response()) { + $data->reading + if $data && $cmd =~ /RETR|LIST|NLST|MLSD/; + return $data; + } + $data->_close if $data; + + return; + } + + $ok = $ftp->port + unless (defined ${*$ftp}{'net_ftp_port'} + || defined ${*$ftp}{'net_ftp_pasv'}); + + $ok = $ftp->_REST($where) + if $ok && $where; + + return + unless $ok; + + if ($cmd =~ /(STOR|APPE|STOU)/ and exists ${*$ftp}{net_ftp_allo} and + $ftp->supported("ALLO")) + { + $ftp->_ALLO(delete ${*$ftp}{net_ftp_allo}) + or return; + } + + $ftp->command($cmd, @_); + + return 1 + if (defined ${*$ftp}{'net_ftp_pasv'}); + + $ok = CMD_INFO == $ftp->response(); + + return $ok + unless exists ${*$ftp}{'net_ftp_intern_port'}; + + if ($ok) { + my $data = $ftp->_dataconn(); + + $data->reading + if $data && $cmd =~ /RETR|LIST|NLST|MLSD/; + + return $data; + } + + + close(delete ${*$ftp}{'net_ftp_listen'}); + + return; +} + +## +## Over-ride methods (Net::Cmd) +## + + +sub debug_text { $_[2] =~ /^(pass|resp|acct)/i ? "$1 ....\n" : $_[2]; } + + +sub command { + my $ftp = shift; + + delete ${*$ftp}{'net_ftp_port'}; + $ftp->SUPER::command(@_); +} + + +sub response { + my $ftp = shift; + my $code = $ftp->SUPER::response() || 5; # assume 500 if undef + + delete ${*$ftp}{'net_ftp_pasv'} + if ($code != CMD_MORE && $code != CMD_INFO); + + $code; +} + + +sub parse_response { + return ($1, $2 eq "-") + if $_[1] =~ s/^(\d\d\d)([- ]?)//o; + + my $ftp = shift; + + # Darn MS FTP server is a load of CRAP !!!! + # Expect to see undef here. + return () + unless 0 + (${*$ftp}{'net_cmd_code'} || 0); + + (${*$ftp}{'net_cmd_code'}, 1); +} + +## +## Allow 2 servers to talk directly +## + + +sub pasv_xfer_unique { + my ($sftp, $sfile, $dftp, $dfile) = @_; + $sftp->pasv_xfer($sfile, $dftp, $dfile, 1); +} + + +sub pasv_xfer { + my ($sftp, $sfile, $dftp, $dfile, $unique) = @_; + + ($dfile = $sfile) =~ s#.*/## + unless (defined $dfile); + + my $port = $sftp->pasv + or return; + + $dftp->port($port) + or return; + + return + unless ($unique ? $dftp->stou($dfile) : $dftp->stor($dfile)); + + unless ($sftp->retr($sfile) && $sftp->response == CMD_INFO) { + $sftp->retr($sfile); + $dftp->abort; + $dftp->response(); + return; + } + + $dftp->pasv_wait($sftp); +} + + +sub pasv_wait { + @_ == 2 or croak 'usage: $ftp->pasv_wait(NON_PASV_FTP)'; + + my ($ftp, $non_pasv) = @_; + my ($file, $rin, $rout); + + vec($rin = '', fileno($ftp), 1) = 1; + select($rout = $rin, undef, undef, undef); + + my $dres = $ftp->response(); + my $sres = $non_pasv->response(); + + return + unless $dres == CMD_OK && $sres == CMD_OK; + + return + unless $ftp->ok() && $non_pasv->ok(); + + return $1 + if $ftp->message =~ /unique file name:\s*(\S*)\s*\)/; + + return $1 + if $non_pasv->message =~ /unique file name:\s*(\S*)\s*\)/; + + return 1; +} + + +sub feature { + @_ == 2 or croak 'usage: $ftp->feature( NAME )'; + my ($ftp, $feat) = @_; + + my $feature = ${*$ftp}{net_ftp_feature} ||= do { + my @feat; + + # Example response + # 211-Features: + # MDTM + # REST STREAM + # SIZE + # 211 End + + @feat = map { /^\s+(.*\S)/ } $ftp->message + if $ftp->_FEAT; + + \@feat; + }; + + return grep { /^\Q$feat\E\b/i } @$feature; +} + + +sub cmd { shift->command(@_)->response() } + +######################################## +# +# RFC959 + RFC2428 + RFC4217 commands +# + + +sub _ABOR { shift->command("ABOR")->response() == CMD_OK } +sub _ALLO { shift->command("ALLO", @_)->response() == CMD_OK } +sub _CDUP { shift->command("CDUP")->response() == CMD_OK } +sub _NOOP { shift->command("NOOP")->response() == CMD_OK } +sub _PASV { shift->command("PASV")->response() == CMD_OK } +sub _QUIT { shift->command("QUIT")->response() == CMD_OK } +sub _DELE { shift->command("DELE", @_)->response() == CMD_OK } +sub _CWD { shift->command("CWD", @_)->response() == CMD_OK } +sub _PORT { shift->command("PORT", @_)->response() == CMD_OK } +sub _RMD { shift->command("RMD", @_)->response() == CMD_OK } +sub _MKD { shift->command("MKD", @_)->response() == CMD_OK } +sub _PWD { shift->command("PWD", @_)->response() == CMD_OK } +sub _TYPE { shift->command("TYPE", @_)->response() == CMD_OK } +sub _RNTO { shift->command("RNTO", @_)->response() == CMD_OK } +sub _RESP { shift->command("RESP", @_)->response() == CMD_OK } +sub _MDTM { shift->command("MDTM", @_)->response() == CMD_OK } +sub _SIZE { shift->command("SIZE", @_)->response() == CMD_OK } +sub _HELP { shift->command("HELP", @_)->response() == CMD_OK } +sub _STAT { shift->command("STAT", @_)->response() == CMD_OK } +sub _FEAT { shift->command("FEAT", @_)->response() == CMD_OK } +sub _PBSZ { shift->command("PBSZ", @_)->response() == CMD_OK } +sub _PROT { shift->command("PROT", @_)->response() == CMD_OK } +sub _CCC { shift->command("CCC", @_)->response() == CMD_OK } +sub _EPRT { shift->command("EPRT", @_)->response() == CMD_OK } +sub _EPSV { shift->command("EPSV", @_)->response() == CMD_OK } +sub _APPE { shift->command("APPE", @_)->response() == CMD_INFO } +sub _LIST { shift->command("LIST", @_)->response() == CMD_INFO } +sub _NLST { shift->command("NLST", @_)->response() == CMD_INFO } +sub _RETR { shift->command("RETR", @_)->response() == CMD_INFO } +sub _STOR { shift->command("STOR", @_)->response() == CMD_INFO } +sub _STOU { shift->command("STOU", @_)->response() == CMD_INFO } +sub _RNFR { shift->command("RNFR", @_)->response() == CMD_MORE } +sub _REST { shift->command("REST", @_)->response() == CMD_MORE } +sub _PASS { shift->command("PASS", @_)->response() } +sub _ACCT { shift->command("ACCT", @_)->response() } +sub _AUTH { shift->command("AUTH", @_)->response() } + + +sub _USER { + my $ftp = shift; + my $ok = $ftp->command("USER", @_)->response(); + + # A certain brain dead firewall :-) + $ok = $ftp->command("user", @_)->response() + unless $ok == CMD_MORE or $ok == CMD_OK; + + $ok; +} + + +sub _SMNT { shift->unsupported(@_) } +sub _MODE { shift->unsupported(@_) } +sub _SYST { shift->unsupported(@_) } +sub _STRU { shift->unsupported(@_) } +sub _REIN { shift->unsupported(@_) } + +{ + # Session Cache with single entry + # used to make sure that we reuse same session for control and data channels + package Net::FTP::_SSL_SingleSessionCache; + sub new { my $x; return bless \$x,shift } + sub add_session { + my ($cache,$key,$session) = @_; + Net::SSLeay::SESSION_free($$cache) if $$cache; + $$cache = $session; + } + sub get_session { + my $cache = shift; + return $$cache + } + sub DESTROY { + my $cache = shift; + Net::SSLeay::SESSION_free($$cache) if $$cache; + } +} + +1; + +__END__ + +# Net::Netrc.pm +# +# Copyright (C) 1995-1998 Graham Barr. All rights reserved. +# Copyright (C) 2013-2014 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::Netrc; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use FileHandle; + +our $VERSION = "3.11"; + +our $TESTING; + +my %netrc = (); + +sub _readrc { + my($class, $host) = @_; + my ($home, $file); + + if ($^O eq "MacOS") { + $home = $ENV{HOME} || `pwd`; + chomp($home); + $file = ($home =~ /:$/ ? $home . "netrc" : $home . ":netrc"); + } + else { + + # Some OS's don't have "getpwuid", so we default to $ENV{HOME} + $home = eval { (getpwuid($>))[7] } || $ENV{HOME}; + $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE}; + if (-e $home . "/.netrc") { + $file = $home . "/.netrc"; + } + elsif (-e $home . "/_netrc") { + $file = $home . "/_netrc"; + } + else { + return unless $TESTING; + } + } + + my ($login, $pass, $acct) = (undef, undef, undef); + my $fh; + local $_; + + $netrc{default} = undef; + + # OS/2 and Win32 do not handle stat in a way compatible with this check :-( + unless ($^O eq 'os2' + || $^O eq 'MSWin32' + || $^O eq 'MacOS' + || $^O =~ /^cygwin/) + { + my @stat = stat($file); + + if (@stat) { + if ($stat[2] & 077) { ## no critic (ValuesAndExpressions::ProhibitLeadingZeros) + carp "Bad permissions: $file"; + return; + } + if ($stat[4] != $<) { + carp "Not owner: $file"; + return; + } + } + } + + if ($fh = FileHandle->new($file, "r")) { + my ($mach, $macdef, $tok, @tok) = (0, 0); + + while (<$fh>) { + undef $macdef if /\A\n\Z/; + + if ($macdef) { + push(@$macdef, $_); + next; + } + + s/^\s*//; + chomp; + + while (length && s/^("((?:[^"]+|\\.)*)"|((?:[^\\\s]+|\\.)*))\s*//) { + (my $tok = $+) =~ s/\\(.)/$1/g; + push(@tok, $tok); + } + + TOKEN: + while (@tok) { + if ($tok[0] eq "default") { + shift(@tok); + $mach = bless {}, $class; + $netrc{default} = [$mach]; + + next TOKEN; + } + + last TOKEN + unless @tok > 1; + + $tok = shift(@tok); + + if ($tok eq "machine") { + my $host = shift @tok; + $mach = bless {machine => $host}, $class; + + $netrc{$host} = [] + unless exists($netrc{$host}); + push(@{$netrc{$host}}, $mach); + } + elsif ($tok =~ /^(login|password|account)$/) { + next TOKEN unless $mach; + my $value = shift @tok; + + # Following line added by rmerrell to remove '/' escape char in .netrc + $value =~ s/\/\\/\\/g; + $mach->{$1} = $value; + } + elsif ($tok eq "macdef") { + next TOKEN unless $mach; + my $value = shift @tok; + $mach->{macdef} = {} + unless exists $mach->{macdef}; + $macdef = $mach->{machdef}{$value} = []; + } + } + } + $fh->close(); + } +} + + +sub lookup { + my ($class, $mach, $login) = @_; + + $class->_readrc() + unless exists $netrc{default}; + + $mach ||= 'default'; + undef $login + if $mach eq 'default'; + + if (exists $netrc{$mach}) { + if (defined $login) { + foreach my $m (@{$netrc{$mach}}) { + return $m + if (exists $m->{login} && $m->{login} eq $login); + } + return; + } + return $netrc{$mach}->[0]; + } + + return $netrc{default}->[0] + if defined $netrc{default}; + + return; +} + + +sub login { + my $me = shift; + + exists $me->{login} + ? $me->{login} + : undef; +} + + +sub account { + my $me = shift; + + exists $me->{account} + ? $me->{account} + : undef; +} + + +sub password { + my $me = shift; + + exists $me->{password} + ? $me->{password} + : undef; +} + + +sub lpa { + my $me = shift; + ($me->login, $me->password, $me->account); +} + +1; + +__END__ + +# Net::Config.pm +# +# Copyright (C) 2000 Graham Barr. All rights reserved. +# Copyright (C) 2013-2014, 2016 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::Config; + +use 5.008001; + +use strict; +use warnings; + +use Exporter; +use Socket qw(inet_aton inet_ntoa); + +our @EXPORT = qw(%NetConfig); +our @ISA = qw(Net::LocalCfg Exporter); +our $VERSION = "3.11"; + +our($CONFIGURE, $LIBNET_CFG); + +eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + local $SIG{__DIE__}; + require Net::LocalCfg; +}; + +our %NetConfig = ( + nntp_hosts => [], + snpp_hosts => [], + pop3_hosts => [], + smtp_hosts => [], + ph_hosts => [], + daytime_hosts => [], + time_hosts => [], + inet_domain => undef, + ftp_firewall => undef, + ftp_ext_passive => 1, + ftp_int_passive => 1, + test_hosts => 1, + test_exist => 1, +); + +# +# Try to get as much configuration info as possible from InternetConfig +# +{ +## no critic (BuiltinFunctions::ProhibitStringyEval) +$^O eq 'MacOS' and eval < [ \$InternetConfig{ kICNNTPHost() } ], + pop3_hosts => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ], + smtp_hosts => [ \$InternetConfig{ kICSMTPHost() } ], + ftp_testhost => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef, + ph_hosts => [ \$InternetConfig{ kICPhHost() } ], + ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0, + ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0, + socks_hosts => + \$InternetConfig{ kICUseSocks() } ? [ \$InternetConfig{ kICSocksHost() } ] : [], + ftp_firewall => + \$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [], +); +\@NetConfig{keys %nc} = values %nc; +} +TRY_INTERNET_CONFIG +} + +my $file = __FILE__; +my $ref; +$file =~ s/Config.pm/libnet.cfg/; +if (-f $file) { + $ref = eval { local $SIG{__DIE__}; do $file }; + if (ref($ref) eq 'HASH') { + %NetConfig = (%NetConfig, %{$ref}); + $LIBNET_CFG = $file; + } +} +if ($< == $> and !$CONFIGURE) { + my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME}; + $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH} || '') if defined $ENV{HOMEDRIVE}; + if (defined $home) { + $file = $home . "/.libnetrc"; + $ref = eval { local $SIG{__DIE__}; do $file } if -f $file; + %NetConfig = (%NetConfig, %{$ref}) + if ref($ref) eq 'HASH'; + } +} +my ($k, $v); +while (($k, $v) = each %NetConfig) { + $NetConfig{$k} = [$v] + if ($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v)); +} + +# Take a hostname and determine if it is inside the firewall + + +sub requires_firewall { + shift; # ignore package + my $host = shift; + + return 0 unless defined $NetConfig{'ftp_firewall'}; + + $host = inet_aton($host) or return -1; + $host = inet_ntoa($host); + + if (exists $NetConfig{'local_netmask'}) { + my $quad = unpack("N", pack("C*", split(/\./, $host))); + my $list = $NetConfig{'local_netmask'}; + $list = [$list] unless ref($list); + foreach (@$list) { + my ($net, $bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next; + my $mask = ~0 << (32 - $bits); + my $addr = unpack("N", pack("C*", split(/\./, $net))); + + return 0 if (($addr & $mask) == ($quad & $mask)); + } + return 1; + } + + return 0; +} + +*is_external = \&requires_firewall; + +1; + +__END__ + +# Net::Cmd.pm +# +# Copyright (C) 1995-2006 Graham Barr. All rights reserved. +# Copyright (C) 2013-2016 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::Cmd; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Exporter; +use Symbol 'gensym'; +use Errno 'EINTR'; + +BEGIN { + if ($^O eq 'os390') { + require Convert::EBCDIC; + + # Convert::EBCDIC->import; + } +} + +our $VERSION = "3.11"; +our @ISA = qw(Exporter); +our @EXPORT = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING); + +use constant CMD_INFO => 1; +use constant CMD_OK => 2; +use constant CMD_MORE => 3; +use constant CMD_REJECT => 4; +use constant CMD_ERROR => 5; +use constant CMD_PENDING => 0; + +use constant DEF_REPLY_CODE => 421; + +my %debug = (); + +my $tr = $^O eq 'os390' ? Convert::EBCDIC->new() : undef; + +sub toebcdic { + my $cmd = shift; + + unless (exists ${*$cmd}{'net_cmd_asciipeer'}) { + my $string = $_[0]; + my $ebcdicstr = $tr->toebcdic($string); + ${*$cmd}{'net_cmd_asciipeer'} = $string !~ /^\d+/ && $ebcdicstr =~ /^\d+/; + } + + ${*$cmd}{'net_cmd_asciipeer'} + ? $tr->toebcdic($_[0]) + : $_[0]; +} + + +sub toascii { + my $cmd = shift; + ${*$cmd}{'net_cmd_asciipeer'} + ? $tr->toascii($_[0]) + : $_[0]; +} + + +sub _print_isa { + no strict 'refs'; ## no critic (TestingAndDebugging::ProhibitNoStrict) + + my $pkg = shift; + my $cmd = $pkg; + + $debug{$pkg} ||= 0; + + my %done = (); + my @do = ($pkg); + my %spc = ($pkg, ""); + + while ($pkg = shift @do) { + next if defined $done{$pkg}; + + $done{$pkg} = 1; + + my $v = + defined ${"${pkg}::VERSION"} + ? "(" . ${"${pkg}::VERSION"} . ")" + : ""; + + my $spc = $spc{$pkg}; + $cmd->debug_print(1, "${spc}${pkg}${v}\n"); + + if (@{"${pkg}::ISA"}) { + @spc{@{"${pkg}::ISA"}} = (" " . $spc{$pkg}) x @{"${pkg}::ISA"}; + unshift(@do, @{"${pkg}::ISA"}); + } + } +} + + +sub debug { + @_ == 1 or @_ == 2 or croak 'usage: $obj->debug([LEVEL])'; + + my ($cmd, $level) = @_; + my $pkg = ref($cmd) || $cmd; + my $oldval = 0; + + if (ref($cmd)) { + $oldval = ${*$cmd}{'net_cmd_debug'} || 0; + } + else { + $oldval = $debug{$pkg} || 0; + } + + return $oldval + unless @_ == 2; + + $level = $debug{$pkg} || 0 + unless defined $level; + + _print_isa($pkg) + if ($level && !exists $debug{$pkg}); + + if (ref($cmd)) { + ${*$cmd}{'net_cmd_debug'} = $level; + } + else { + $debug{$pkg} = $level; + } + + $oldval; +} + + +sub message { + @_ == 1 or croak 'usage: $obj->message()'; + + my $cmd = shift; + + wantarray + ? @{${*$cmd}{'net_cmd_resp'}} + : join("", @{${*$cmd}{'net_cmd_resp'}}); +} + + +sub debug_text { $_[2] } + + +sub debug_print { + my ($cmd, $out, $text) = @_; + print STDERR $cmd, ($out ? '>>> ' : '<<< '), $cmd->debug_text($out, $text); +} + + +sub code { + @_ == 1 or croak 'usage: $obj->code()'; + + my $cmd = shift; + + ${*$cmd}{'net_cmd_code'} = $cmd->DEF_REPLY_CODE + unless exists ${*$cmd}{'net_cmd_code'}; + + ${*$cmd}{'net_cmd_code'}; +} + + +sub status { + @_ == 1 or croak 'usage: $obj->status()'; + + my $cmd = shift; + + substr(${*$cmd}{'net_cmd_code'}, 0, 1); +} + + +sub set_status { + @_ == 3 or croak 'usage: $obj->set_status(CODE, MESSAGE)'; + + my $cmd = shift; + my ($code, $resp) = @_; + + $resp = defined $resp ? [$resp] : [] + unless ref($resp); + + (${*$cmd}{'net_cmd_code'}, ${*$cmd}{'net_cmd_resp'}) = ($code, $resp); + + 1; +} + +sub _syswrite_with_timeout { + my $cmd = shift; + my $line = shift; + + my $len = length($line); + my $offset = 0; + my $win = ""; + vec($win, fileno($cmd), 1) = 1; + my $timeout = $cmd->timeout || undef; + my $initial = time; + my $pending = $timeout; + + local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS'; + + while ($len) { + my $wout; + my $nfound = select(undef, $wout = $win, undef, $pending); + if ((defined $nfound and $nfound > 0) or -f $cmd) # -f for testing on win32 + { + my $w = syswrite($cmd, $line, $len, $offset); + if (! defined($w) ) { + my $err = $!; + $cmd->close; + $cmd->_set_status_closed($err); + return; + } + $len -= $w; + $offset += $w; + } + elsif ($nfound == -1) { + if ( $! == EINTR ) { + if ( defined($timeout) ) { + redo if ($pending = $timeout - ( time - $initial ) ) > 0; + $cmd->_set_status_timeout; + return; + } + redo; + } + my $err = $!; + $cmd->close; + $cmd->_set_status_closed($err); + return; + } + else { + $cmd->_set_status_timeout; + return; + } + } + + return 1; +} + +sub _set_status_timeout { + my $cmd = shift; + my $pkg = ref($cmd) || $cmd; + + $cmd->set_status($cmd->DEF_REPLY_CODE, "[$pkg] Timeout"); + carp(ref($cmd) . ": " . (caller(1))[3] . "(): timeout") if $cmd->debug; +} + +sub _set_status_closed { + my $cmd = shift; + my $err = shift; + my $pkg = ref($cmd) || $cmd; + + $cmd->set_status($cmd->DEF_REPLY_CODE, "[$pkg] Connection closed"); + carp(ref($cmd) . ": " . (caller(1))[3] + . "(): unexpected EOF on command channel: $err") if $cmd->debug; +} + +sub _is_closed { + my $cmd = shift; + if (!defined fileno($cmd)) { + $cmd->_set_status_closed($!); + return 1; + } + return 0; +} + +sub command { + my $cmd = shift; + + return $cmd + if $cmd->_is_closed; + + $cmd->dataend() + if (exists ${*$cmd}{'net_cmd_last_ch'}); + + if (scalar(@_)) { + my $str = join( + " ", + map { + /\n/ + ? do { my $n = $_; $n =~ tr/\n/ /; $n } + : $_; + } @_ + ); + $str = $cmd->toascii($str) if $tr; + $str .= "\015\012"; + + $cmd->debug_print(1, $str) + if ($cmd->debug); + + # though documented to return undef on failure, the legacy behavior + # was to return $cmd even on failure, so this odd construct does that + $cmd->_syswrite_with_timeout($str) + or return $cmd; + } + + $cmd; +} + + +sub ok { + @_ == 1 or croak 'usage: $obj->ok()'; + + my $code = $_[0]->code; + 0 < $code && $code < 400; +} + + +sub unsupported { + my $cmd = shift; + + $cmd->set_status(580, 'Unsupported command'); + + 0; +} + + +sub getline { + my $cmd = shift; + + ${*$cmd}{'net_cmd_lines'} ||= []; + + return shift @{${*$cmd}{'net_cmd_lines'}} + if scalar(@{${*$cmd}{'net_cmd_lines'}}); + + my $partial = defined(${*$cmd}{'net_cmd_partial'}) ? ${*$cmd}{'net_cmd_partial'} : ""; + + return + if $cmd->_is_closed; + + my $fd = fileno($cmd); + my $rin = ""; + vec($rin, $fd, 1) = 1; + + my $buf; + + until (scalar(@{${*$cmd}{'net_cmd_lines'}})) { + my $timeout = $cmd->timeout || undef; + my $rout; + + my $select_ret = select($rout = $rin, undef, undef, $timeout); + if ($select_ret > 0) { + unless (sysread($cmd, $buf = "", 1024)) { + my $err = $!; + $cmd->close; + $cmd->_set_status_closed($err); + return; + } + + substr($buf, 0, 0) = $partial; ## prepend from last sysread + + my @buf = split(/\015?\012/, $buf, -1); ## break into lines + + $partial = pop @buf; + + push(@{${*$cmd}{'net_cmd_lines'}}, map {"$_\n"} @buf); + + } + else { + $cmd->_set_status_timeout; + return; + } + } + + ${*$cmd}{'net_cmd_partial'} = $partial; + + if ($tr) { + foreach my $ln (@{${*$cmd}{'net_cmd_lines'}}) { + $ln = $cmd->toebcdic($ln); + } + } + + shift @{${*$cmd}{'net_cmd_lines'}}; +} + + +sub ungetline { + my ($cmd, $str) = @_; + + ${*$cmd}{'net_cmd_lines'} ||= []; + unshift(@{${*$cmd}{'net_cmd_lines'}}, $str); +} + + +sub parse_response { + return () + unless $_[1] =~ s/^(\d\d\d)(.?)//o; + ($1, $2 eq "-"); +} + + +sub response { + my $cmd = shift; + my ($code, $more) = (undef) x 2; + + $cmd->set_status($cmd->DEF_REPLY_CODE, undef); # initialize the response + + while (1) { + my $str = $cmd->getline(); + + return CMD_ERROR + unless defined($str); + + $cmd->debug_print(0, $str) + if ($cmd->debug); + + ($code, $more) = $cmd->parse_response($str); + unless (defined $code) { + carp("$cmd: response(): parse error in '$str'") if ($cmd->debug); + $cmd->ungetline($str); + $@ = $str; # $@ used as tunneling hack + return CMD_ERROR; + } + + ${*$cmd}{'net_cmd_code'} = $code; + + push(@{${*$cmd}{'net_cmd_resp'}}, $str); + + last unless ($more); + } + + return unless defined $code; + substr($code, 0, 1); +} + + +sub read_until_dot { + my $cmd = shift; + my $fh = shift; + my $arr = []; + + while (1) { + my $str = $cmd->getline() or return; + + $cmd->debug_print(0, $str) + if ($cmd->debug & 4); + + last if ($str =~ /^\.\r?\n/o); + + $str =~ s/^\.\././o; + + if (defined $fh) { + print $fh $str; + } + else { + push(@$arr, $str); + } + } + + $arr; +} + + +sub datasend { + my $cmd = shift; + my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_; + my $line = join("", @$arr); + + # Perls < 5.10.1 (with the exception of 5.8.9) have a performance problem with + # the substitutions below when dealing with strings stored internally in + # UTF-8, so downgrade them (if possible). + # Data passed to datasend() should be encoded to octets upstream already so + # shouldn't even have the UTF-8 flag on to start with, but if it so happens + # that the octets are stored in an upgraded string (as can sometimes occur) + # then they would still downgrade without fail anyway. + # Only Unicode codepoints > 0xFF stored in an upgraded string will fail to + # downgrade. We fail silently in that case, and a "Wide character in print" + # warning will be emitted later by syswrite(). + utf8::downgrade($line, 1) if $] < 5.010001 && $] != 5.008009; + + return 0 + if $cmd->_is_closed; + + my $last_ch = ${*$cmd}{'net_cmd_last_ch'}; + + # We have not send anything yet, so last_ch = "\012" means we are at the start of a line + $last_ch = ${*$cmd}{'net_cmd_last_ch'} = "\012" unless defined $last_ch; + + return 1 unless length $line; + + if ($cmd->debug) { + foreach my $b (split(/\n/, $line)) { + $cmd->debug_print(1, "$b\n"); + } + } + + $line =~ tr/\r\n/\015\012/ unless "\r" eq "\015"; + + my $first_ch = ''; + + if ($last_ch eq "\015") { + # Remove \012 so it does not get prefixed with another \015 below + # and escape the . if there is one following it because the fixup + # below will not find it + $first_ch = "\012" if $line =~ s/^\012(\.?)/$1$1/; + } + elsif ($last_ch eq "\012") { + # Fixup below will not find the . as the first character of the buffer + $first_ch = "." if $line =~ /^\./; + } + + $line =~ s/\015?\012(\.?)/\015\012$1$1/sg; + + substr($line, 0, 0) = $first_ch; + + ${*$cmd}{'net_cmd_last_ch'} = substr($line, -1, 1); + + $cmd->_syswrite_with_timeout($line) + or return; + + 1; +} + + +sub rawdatasend { + my $cmd = shift; + my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_; + my $line = join("", @$arr); + + return 0 + if $cmd->_is_closed; + + return 1 + unless length($line); + + if ($cmd->debug) { + my $b = "$cmd>>> "; + print STDERR $b, join("\n$b", split(/\n/, $line)), "\n"; + } + + $cmd->_syswrite_with_timeout($line) + or return; + + 1; +} + + +sub dataend { + my $cmd = shift; + + return 0 + if $cmd->_is_closed; + + my $ch = ${*$cmd}{'net_cmd_last_ch'}; + my $tosend; + + if (!defined $ch) { + return 1; + } + elsif ($ch ne "\012") { + $tosend = "\015\012"; + } + + $tosend .= ".\015\012"; + + $cmd->debug_print(1, ".\n") + if ($cmd->debug); + + $cmd->_syswrite_with_timeout($tosend) + or return 0; + + delete ${*$cmd}{'net_cmd_last_ch'}; + + $cmd->response() == CMD_OK; +} + +# read and write to tied filehandle +sub tied_fh { + my $cmd = shift; + ${*$cmd}{'net_cmd_readbuf'} = ''; + my $fh = gensym(); + tie *$fh, ref($cmd), $cmd; + return $fh; +} + +# tie to myself +sub TIEHANDLE { + my $class = shift; + my $cmd = shift; + return $cmd; +} + +# Tied filehandle read. Reads requested data length, returning +# end-of-file when the dot is encountered. +sub READ { + my $cmd = shift; + my ($len, $offset) = @_[1, 2]; + return unless exists ${*$cmd}{'net_cmd_readbuf'}; + my $done = 0; + while (!$done and length(${*$cmd}{'net_cmd_readbuf'}) < $len) { + ${*$cmd}{'net_cmd_readbuf'} .= $cmd->getline() or return; + $done++ if ${*$cmd}{'net_cmd_readbuf'} =~ s/^\.\r?\n\Z//m; + } + + $_[0] = ''; + substr($_[0], $offset + 0) = substr(${*$cmd}{'net_cmd_readbuf'}, 0, $len); + substr(${*$cmd}{'net_cmd_readbuf'}, 0, $len) = ''; + delete ${*$cmd}{'net_cmd_readbuf'} if $done; + + return length $_[0]; +} + + +sub READLINE { + my $cmd = shift; + + # in this context, we use the presence of readbuf to + # indicate that we have not yet reached the eof + return unless exists ${*$cmd}{'net_cmd_readbuf'}; + my $line = $cmd->getline; + return if $line =~ /^\.\r?\n/; + $line; +} + + +sub PRINT { + my $cmd = shift; + my ($buf, $len, $offset) = @_; + $len ||= length($buf); + $offset += 0; + return unless $cmd->datasend(substr($buf, $offset, $len)); + ${*$cmd}{'net_cmd_sending'}++; # flag that we should call dataend() + return $len; +} + + +sub CLOSE { + my $cmd = shift; + my $r = exists(${*$cmd}{'net_cmd_sending'}) ? $cmd->dataend : 1; + delete ${*$cmd}{'net_cmd_readbuf'}; + delete ${*$cmd}{'net_cmd_sending'}; + $r; +} + +1; + +__END__ + + +# Net::POP3.pm +# +# Copyright (C) 1995-2004 Graham Barr. All rights reserved. +# Copyright (C) 2013-2016 Steve Hay. All rights reserved. +# This module is free software; you can redistribute it and/or modify it under +# the same terms as Perl itself, i.e. under the terms of either the GNU General +# Public License or the Artistic License, as specified in the F file. + +package Net::POP3; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use IO::Socket; +use Net::Cmd; +use Net::Config; + +our $VERSION = "3.11"; + +# Code for detecting if we can use SSL +my $ssl_class = eval { + require IO::Socket::SSL; + # first version with default CA on most platforms + no warnings 'numeric'; + IO::Socket::SSL->VERSION(2.007); +} && 'IO::Socket::SSL'; + +my $nossl_warn = !$ssl_class && + 'To use SSL please install IO::Socket::SSL with version>=2.007'; + +# Code for detecting if we can use IPv6 +my $family_key = 'Domain'; +my $inet6_class = eval { + require IO::Socket::IP; + no warnings 'numeric'; + IO::Socket::IP->VERSION(0.25) || die; + $family_key = 'Family'; +} && 'IO::Socket::IP' || eval { + require IO::Socket::INET6; + no warnings 'numeric'; + IO::Socket::INET6->VERSION(2.62); +} && 'IO::Socket::INET6'; + + +sub can_ssl { $ssl_class }; +sub can_inet6 { $inet6_class }; + +our @ISA = ('Net::Cmd', $inet6_class || 'IO::Socket::INET'); + +sub new { + my $self = shift; + my $type = ref($self) || $self; + my ($host, %arg); + if (@_ % 2) { + $host = shift; + %arg = @_; + } + else { + %arg = @_; + $host = delete $arg{Host}; + } + my $hosts = defined $host ? [$host] : $NetConfig{pop3_hosts}; + my $obj; + + if ($arg{SSL}) { + # SSL from start + die $nossl_warn if !$ssl_class; + $arg{Port} ||= 995; + } + + $arg{Timeout} = 120 if ! defined $arg{Timeout}; + + foreach my $h (@{$hosts}) { + $obj = $type->SUPER::new( + PeerAddr => ($host = $h), + PeerPort => $arg{Port} || 'pop3(110)', + Proto => 'tcp', + $family_key => $arg{Domain} || $arg{Family}, + LocalAddr => $arg{LocalAddr}, + LocalPort => exists($arg{ResvPort}) ? $arg{ResvPort} : $arg{LocalPort}, + Timeout => $arg{Timeout}, + ) + and last; + } + + return + unless defined $obj; + + ${*$obj}{'net_pop3_arg'} = \%arg; + ${*$obj}{'net_pop3_host'} = $host; + if ($arg{SSL}) { + Net::POP3::_SSL->start_SSL($obj,%arg) or return; + } + + $obj->autoflush(1); + $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef); + + unless ($obj->response() == CMD_OK) { + $obj->close(); + return; + } + + ${*$obj}{'net_pop3_banner'} = $obj->message; + + $obj; +} + + +sub host { + my $me = shift; + ${*$me}{'net_pop3_host'}; +} + +## +## We don't want people sending me their passwords when they report problems +## now do we :-) +## + + +sub debug_text { $_[2] =~ /^(pass|rpop)/i ? "$1 ....\n" : $_[2]; } + + +sub login { + @_ >= 1 && @_ <= 3 or croak 'usage: $pop3->login( USER, PASS )'; + my ($me, $user, $pass) = @_; + + if (@_ <= 2) { + ($user, $pass) = $me->_lookup_credentials($user); + } + + $me->user($user) + and $me->pass($pass); +} + +sub starttls { + my $self = shift; + $ssl_class or die $nossl_warn; + $self->_STLS or return; + Net::POP3::_SSL->start_SSL($self, + %{ ${*$self}{'net_pop3_arg'} }, # (ssl) args given in new + @_ # more (ssl) args + ) or return; + return 1; +} + +sub apop { + @_ >= 1 && @_ <= 3 or croak 'usage: $pop3->apop( USER, PASS )'; + my ($me, $user, $pass) = @_; + my $banner; + my $md; + + if (eval { local $SIG{__DIE__}; require Digest::MD5 }) { + $md = Digest::MD5->new(); + } + elsif (eval { local $SIG{__DIE__}; require MD5 }) { + $md = MD5->new(); + } + else { + carp "You need to install Digest::MD5 or MD5 to use the APOP command"; + return; + } + + return + unless ($banner = (${*$me}{'net_pop3_banner'} =~ /(<.*>)/)[0]); + + if (@_ <= 2) { + ($user, $pass) = $me->_lookup_credentials($user); + } + + $md->add($banner, $pass); + + return + unless ($me->_APOP($user, $md->hexdigest)); + + $me->_get_mailbox_count(); +} + + +sub user { + @_ == 2 or croak 'usage: $pop3->user( USER )'; + $_[0]->_USER($_[1]) ? 1 : undef; +} + + +sub pass { + @_ == 2 or croak 'usage: $pop3->pass( PASS )'; + + my ($me, $pass) = @_; + + return + unless ($me->_PASS($pass)); + + $me->_get_mailbox_count(); +} + + +sub reset { + @_ == 1 or croak 'usage: $obj->reset()'; + + my $me = shift; + + return 0 + unless ($me->_RSET); + + if (defined ${*$me}{'net_pop3_mail'}) { + local $_; + foreach (@{${*$me}{'net_pop3_mail'}}) { + delete $_->{'net_pop3_deleted'}; + } + } +} + + +sub last { + @_ == 1 or croak 'usage: $obj->last()'; + + return + unless $_[0]->_LAST && $_[0]->message =~ /(\d+)/; + + return $1; +} + + +sub top { + @_ == 2 || @_ == 3 or croak 'usage: $pop3->top( MSGNUM [, NUMLINES ])'; + my $me = shift; + + return + unless $me->_TOP($_[0], $_[1] || 0); + + $me->read_until_dot; +} + + +sub popstat { + @_ == 1 or croak 'usage: $pop3->popstat()'; + my $me = shift; + + return () + unless $me->_STAT && $me->message =~ /(\d+)\D+(\d+)/; + + ($1 || 0, $2 || 0); +} + + +sub list { + @_ == 1 || @_ == 2 or croak 'usage: $pop3->list( [ MSGNUM ] )'; + my $me = shift; + + return + unless $me->_LIST(@_); + + if (@_) { + $me->message =~ /\d+\D+(\d+)/; + return $1 || undef; + } + + my $info = $me->read_until_dot + or return; + + my %hash = map { (/(\d+)\D+(\d+)/) } @$info; + + return \%hash; +} + + +sub get { + @_ == 2 or @_ == 3 or croak 'usage: $pop3->get( MSGNUM [, FH ])'; + my $me = shift; + + return + unless $me->_RETR(shift); + + $me->read_until_dot(@_); +} + + +sub getfh { + @_ == 2 or croak 'usage: $pop3->getfh( MSGNUM )'; + my $me = shift; + + return unless $me->_RETR(shift); + return $me->tied_fh; +} + + +sub delete { + @_ == 2 or croak 'usage: $pop3->delete( MSGNUM )'; + my $me = shift; + return 0 unless $me->_DELE(@_); + ${*$me}{'net_pop3_deleted'} = 1; +} + + +sub uidl { + @_ == 1 || @_ == 2 or croak 'usage: $pop3->uidl( [ MSGNUM ] )'; + my $me = shift; + my $uidl; + + $me->_UIDL(@_) + or return; + if (@_) { + $uidl = ($me->message =~ /\d+\s+([\041-\176]+)/)[0]; + } + else { + my $ref = $me->read_until_dot + or return; + $uidl = {}; + foreach my $ln (@$ref) { + my ($msg, $uid) = $ln =~ /^\s*(\d+)\s+([\041-\176]+)/; + $uidl->{$msg} = $uid; + } + } + return $uidl; +} + + +sub ping { + @_ == 2 or croak 'usage: $pop3->ping( USER )'; + my $me = shift; + + return () unless $me->_PING(@_) && $me->message =~ /(\d+)\D+(\d+)/; + + ($1 || 0, $2 || 0); +} + + +sub _lookup_credentials { + my ($me, $user) = @_; + + require Net::Netrc; + + $user ||= eval { local $SIG{__DIE__}; (getpwuid($>))[0] } + || $ENV{NAME} + || $ENV{USER} + || $ENV{LOGNAME}; + + my $m = Net::Netrc->lookup(${*$me}{'net_pop3_host'}, $user); + $m ||= Net::Netrc->lookup(${*$me}{'net_pop3_host'}); + + my $pass = $m + ? $m->password || "" + : ""; + + ($user, $pass); +} + + +sub _get_mailbox_count { + my ($me) = @_; + my $ret = ${*$me}{'net_pop3_count'} = + ($me->message =~ /(\d+)\s+message/io) ? $1 : ($me->popstat)[0]; + + $ret ? $ret : "0E0"; +} + + +sub _STAT { shift->command('STAT' )->response() == CMD_OK } +sub _LIST { shift->command('LIST', @_)->response() == CMD_OK } +sub _RETR { shift->command('RETR', $_[0])->response() == CMD_OK } +sub _DELE { shift->command('DELE', $_[0])->response() == CMD_OK } +sub _NOOP { shift->command('NOOP' )->response() == CMD_OK } +sub _RSET { shift->command('RSET' )->response() == CMD_OK } +sub _QUIT { shift->command('QUIT' )->response() == CMD_OK } +sub _TOP { shift->command( 'TOP', @_)->response() == CMD_OK } +sub _UIDL { shift->command('UIDL', @_)->response() == CMD_OK } +sub _USER { shift->command('USER', $_[0])->response() == CMD_OK } +sub _PASS { shift->command('PASS', $_[0])->response() == CMD_OK } +sub _APOP { shift->command('APOP', @_)->response() == CMD_OK } +sub _PING { shift->command('PING', $_[0])->response() == CMD_OK } +sub _RPOP { shift->command('RPOP', $_[0])->response() == CMD_OK } +sub _LAST { shift->command('LAST' )->response() == CMD_OK } +sub _CAPA { shift->command('CAPA' )->response() == CMD_OK } +sub _STLS { shift->command("STLS", )->response() == CMD_OK } + + +sub quit { + my $me = shift; + + $me->_QUIT; + $me->close; +} + + +sub DESTROY { + my $me = shift; + + if (defined fileno($me) and ${*$me}{'net_pop3_deleted'}) { + $me->reset; + $me->quit; + } +} + +## +## POP3 has weird responses, so we emulate them to look the same :-) +## + + +sub response { + my $cmd = shift; + my $str = $cmd->getline() or return; + my $code = "500"; + + $cmd->debug_print(0, $str) + if ($cmd->debug); + + if ($str =~ s/^\+OK\s*//io) { + $code = "200"; + } + elsif ($str =~ s/^\+\s*//io) { + $code = "300"; + } + else { + $str =~ s/^-ERR\s*//io; + } + + ${*$cmd}{'net_cmd_resp'} = [$str]; + ${*$cmd}{'net_cmd_code'} = $code; + + substr($code, 0, 1); +} + + +sub capa { + my $this = shift; + my ($capa, %capabilities); + + # Fake a capability here + $capabilities{APOP} = '' if ($this->banner() =~ /<.*>/); + + if ($this->_CAPA()) { + $capabilities{CAPA} = 1; + $capa = $this->read_until_dot(); + %capabilities = (%capabilities, map {/^\s*(\S+)\s*(.*)/} @$capa); + } + else { + + # Check AUTH for SASL capabilities + if ($this->command('AUTH')->response() == CMD_OK) { + my $mechanism = $this->read_until_dot(); + $capabilities{SASL} = join " ", map {m/([A-Z0-9_-]+)/} @{$mechanism}; + } + } + + return ${*$this}{'net_pop3e_capabilities'} = \%capabilities; +} + + +sub capabilities { + my $this = shift; + + ${*$this}{'net_pop3e_capabilities'} || $this->capa; +} + + +sub auth { + my ($self, $username, $password) = @_; + + eval { + require MIME::Base64; + require Authen::SASL; + } or $self->set_status(500, ["Need MIME::Base64 and Authen::SASL todo auth"]), return 0; + + my $capa = $self->capa; + my $mechanisms = $capa->{SASL} || 'CRAM-MD5'; + + my $sasl; + + if (ref($username) and UNIVERSAL::isa($username, 'Authen::SASL')) { + $sasl = $username; + my $user_mech = $sasl->mechanism || ''; + my @user_mech = split(/\s+/, $user_mech); + my %user_mech; + @user_mech{@user_mech} = (); + + my @server_mech = split(/\s+/, $mechanisms); + my @mech = @user_mech + ? grep { exists $user_mech{$_} } @server_mech + : @server_mech; + unless (@mech) { + $self->set_status( + 500, + [ 'Client SASL mechanisms (', + join(', ', @user_mech), + ') do not match the SASL mechnism the server announces (', + join(', ', @server_mech), ')', + ] + ); + return 0; + } + + $sasl->mechanism(join(" ", @mech)); + } + else { + die "auth(username, password)" if not length $username; + $sasl = Authen::SASL->new( + mechanism => $mechanisms, + callback => { + user => $username, + pass => $password, + authname => $username, + } + ); + } + + # We should probably allow the user to pass the host, but I don't + # currently know and SASL mechanisms that are used by smtp that need it + my ($hostname) = split /:/, ${*$self}{'net_pop3_host'}; + my $client = eval { $sasl->client_new('pop', $hostname, 0) }; + + unless ($client) { + my $mech = $sasl->mechanism; + $self->set_status( + 500, + [ " Authen::SASL failure: $@", + '(please check if your local Authen::SASL installation', + "supports mechanism '$mech'" + ] + ); + return 0; + } + + my ($token) = $client->client_start + or do { + my $mech = $client->mechanism; + $self->set_status( + 500, + [ ' Authen::SASL failure: $client->client_start ', + "mechanism '$mech' hostname #$hostname#", + $client->error + ] + ); + return 0; + }; + + # We don't support sasl mechanisms that encrypt the socket traffic. + # todo that we would really need to change the ISA hierarchy + # so we don't inherit from IO::Socket, but instead hold it in an attribute + + my @cmd = ("AUTH", $client->mechanism); + my $code; + + push @cmd, MIME::Base64::encode_base64($token, '') + if defined $token and length $token; + + while (($code = $self->command(@cmd)->response()) == CMD_MORE) { + + my ($token) = $client->client_step(MIME::Base64::decode_base64(($self->message)[0])) or do { + $self->set_status( + 500, + [ ' Authen::SASL failure: $client->client_step ', + "mechanism '", $client->mechanism, " hostname #$hostname#, ", + $client->error + ] + ); + return 0; + }; + + @cmd = (MIME::Base64::encode_base64(defined $token ? $token : '', '')); + } + + $code == CMD_OK; +} + + +sub banner { + my $this = shift; + + return ${*$this}{'net_pop3_banner'}; +} + +{ + package Net::POP3::_SSL; + our @ISA = ( $ssl_class ? ($ssl_class):(), 'Net::POP3' ); + sub starttls { die "POP3 connection is already in SSL mode" } + sub start_SSL { + my ($class,$pop3,%arg) = @_; + delete @arg{ grep { !m{^SSL_} } keys %arg }; + ( $arg{SSL_verifycn_name} ||= $pop3->host ) + =~s{(?can_client_sni; + $arg{SSL_verifycn_scheme} ||= 'pop3'; + my $ok = $class->SUPER::start_SSL($pop3,%arg); + $@ = $ssl_class->errstr if !$ok; + return $ok; + } +} + + + +1; + +__END__ + +package Net::netent; +use strict; + +use 5.006_001; +our $VERSION = '1.01'; +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); +our ( + $n_name, @n_aliases, + $n_addrtype, $n_net +); + +BEGIN { + use Exporter (); + @EXPORT = qw(getnetbyname getnetbyaddr getnet); + @EXPORT_OK = qw( + $n_name @n_aliases + $n_addrtype $n_net + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); +} + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'Net::netent' => [ + name => '$', + aliases => '@', + addrtype => '$', + net => '$', +]; + +sub populate (@) { + return unless @_; + my $nob = new(); + $n_name = $nob->[0] = $_[0]; + @n_aliases = @{ $nob->[1] } = split ' ', $_[1]; + $n_addrtype = $nob->[2] = $_[2]; + $n_net = $nob->[3] = $_[3]; + return $nob; +} + +sub getnetbyname ($) { populate(CORE::getnetbyname(shift)) } + +sub getnetbyaddr ($;$) { + my ($net, $addrtype); + $net = shift; + require Socket if @_; + $addrtype = @_ ? shift : Socket::AF_INET(); + populate(CORE::getnetbyaddr($net, $addrtype)) +} + +sub getnet($) { + if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) { + require Socket; + &getnetbyaddr(Socket::inet_aton(shift)); + } else { + &getnetbyname; + } +} + +1; +__END__ + +## +## Generic data connection package +## + +package Net::FTP::dataconn; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Errno; +use Net::Cmd; + +our $VERSION = '3.11'; + +$Net::FTP::IOCLASS or die "please load Net::FTP before Net::FTP::dataconn"; +our @ISA = $Net::FTP::IOCLASS; + +sub reading { + my $data = shift; + ${*$data}{'net_ftp_bytesread'} = 0; +} + + +sub abort { + my $data = shift; + my $ftp = ${*$data}{'net_ftp_cmd'}; + + # no need to abort if we have finished the xfer + return $data->close + if ${*$data}{'net_ftp_eof'}; + + # for some reason if we continuously open RETR connections and not + # read a single byte, then abort them after a while the server will + # close our connection, this prevents the unexpected EOF on the + # command channel -- GMB + if (exists ${*$data}{'net_ftp_bytesread'} + && (${*$data}{'net_ftp_bytesread'} == 0)) + { + my $buf = ""; + my $timeout = $data->timeout; + $data->can_read($timeout) && sysread($data, $buf, 1); + } + + ${*$data}{'net_ftp_eof'} = 1; # fake + + $ftp->abort; # this will close me +} + + +sub _close { + my $data = shift; + my $ftp = ${*$data}{'net_ftp_cmd'}; + + $data->SUPER::close(); + + delete ${*$ftp}{'net_ftp_dataconn'} + if defined $ftp + && exists ${*$ftp}{'net_ftp_dataconn'} + && $data == ${*$ftp}{'net_ftp_dataconn'}; +} + + +sub close { + my $data = shift; + my $ftp = ${*$data}{'net_ftp_cmd'}; + + if (exists ${*$data}{'net_ftp_bytesread'} && !${*$data}{'net_ftp_eof'}) { + my $junk; + eval { local($SIG{__DIE__}); $data->read($junk, 1, 0) }; + return $data->abort unless ${*$data}{'net_ftp_eof'}; + } + + $data->_close; + + return unless defined $ftp; + + $ftp->response() == CMD_OK + && $ftp->message =~ /unique file name:\s*(\S*)\s*\)/ + && (${*$ftp}{'net_ftp_unique'} = $1); + + $ftp->status == CMD_OK; +} + + +sub _select { + my ($data, $timeout, $do_read) = @_; + my ($rin, $rout, $win, $wout, $tout, $nfound); + + vec($rin = '', fileno($data), 1) = 1; + + ($win, $rin) = ($rin, $win) unless $do_read; + + while (1) { + $nfound = select($rout = $rin, $wout = $win, undef, $tout = $timeout); + + last if $nfound >= 0; + + croak "select: $!" + unless $!{EINTR}; + } + + $nfound; +} + + +sub can_read { + _select(@_[0, 1], 1); +} + + +sub can_write { + _select(@_[0, 1], 0); +} + + +sub cmd { + my $ftp = shift; + + ${*$ftp}{'net_ftp_cmd'}; +} + + +sub bytes_read { + my $ftp = shift; + + ${*$ftp}{'net_ftp_bytesread'} || 0; +} + +1; + +__END__ + +## +## Package to read/write on BINARY data connections +## + +package Net::FTP::I; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Net::FTP::dataconn; + +our @ISA = qw(Net::FTP::dataconn); +our $VERSION = "3.11"; + +our $buf; + +sub read { + my $data = shift; + local *buf = \$_[0]; + shift; + my $size = shift || croak 'read($buf,$size,[$timeout])'; + my $timeout = @_ ? shift: $data->timeout; + + my $n; + + if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) { + $data->can_read($timeout) + or croak "Timeout"; + + my $blksize = ${*$data}{'net_ftp_blksize'}; + $blksize = $size if $size > $blksize; + + unless ($n = sysread($data, ${*$data}, $blksize, length ${*$data})) { + return unless defined $n; + ${*$data}{'net_ftp_eof'} = 1; + } + } + + $buf = substr(${*$data}, 0, $size); + + $n = length($buf); + + substr(${*$data}, 0, $n) = ''; + + ${*$data}{'net_ftp_bytesread'} += $n; + + $n; +} + + +sub write { + my $data = shift; + local *buf = \$_[0]; + shift; + my $size = shift || croak 'write($buf,$size,[$timeout])'; + my $timeout = @_ ? shift: $data->timeout; + + # If the remote server has closed the connection we will be signal'd + # when we write. This can happen if the disk on the remote server fills up + + local $SIG{PIPE} = 'IGNORE' + unless ($SIG{PIPE} || '') eq 'IGNORE' + or $^O eq 'MacOS'; + my $sent = $size; + my $off = 0; + + my $blksize = ${*$data}{'net_ftp_blksize'}; + while ($sent > 0) { + $data->can_write($timeout) + or croak "Timeout"; + + my $n = syswrite($data, $buf, $sent > $blksize ? $blksize : $sent, $off); + return unless defined($n); + $sent -= $n; + $off += $n; + } + + $size; +} + +1; +## +## Package to read/write on ASCII data connections +## + +package Net::FTP::A; + +use 5.008001; + +use strict; +use warnings; + +use Carp; +use Net::FTP::dataconn; + +our @ISA = qw(Net::FTP::dataconn); +our $VERSION = "3.11"; + +our $buf; + +sub read { + my $data = shift; + local *buf = \$_[0]; + shift; + my $size = shift || croak 'read($buf,$size,[$offset])'; + my $timeout = @_ ? shift: $data->timeout; + + if (length(${*$data}) < $size && !${*$data}{'net_ftp_eof'}) { + my $blksize = ${*$data}{'net_ftp_blksize'}; + $blksize = $size if $size > $blksize; + + my $l = 0; + my $n; + + READ: + { + my $readbuf = defined(${*$data}{'net_ftp_cr'}) ? "\015" : ''; + + $data->can_read($timeout) + or croak "Timeout"; + + if ($n = sysread($data, $readbuf, $blksize, length $readbuf)) { + ${*$data}{'net_ftp_bytesread'} += $n; + ${*$data}{'net_ftp_cr'} = + substr($readbuf, -1) eq "\015" + ? chop($readbuf) + : undef; + } + else { + return + unless defined $n; + + ${*$data}{'net_ftp_eof'} = 1; + } + + $readbuf =~ s/\015\012/\n/sgo; + ${*$data} .= $readbuf; + + unless (length(${*$data})) { + + redo READ + if ($n > 0); + + $size = length(${*$data}) + if ($n == 0); + } + } + } + + $buf = substr(${*$data}, 0, $size); + substr(${*$data}, 0, $size) = ''; + + length $buf; +} + + +sub write { + my $data = shift; + local *buf = \$_[0]; + shift; + my $size = shift || croak 'write($buf,$size,[$timeout])'; + my $timeout = @_ ? shift: $data->timeout; + + my $nr = (my $tmp = substr($buf, 0, $size)) =~ tr/\r\n/\015\012/; + $tmp =~ s/(?can_write($timeout) + or croak "Timeout"; + + $off += $wrote; + $wrote = syswrite($data, substr($tmp, $off), $len > $blksize ? $blksize : $len); + return + unless defined($wrote); + $len -= $wrote; + } + + $size; +} + +1; +package Net::FTP::L; + +use 5.008001; + +use strict; +use warnings; + +use Net::FTP::I; + +our @ISA = qw(Net::FTP::I); +our $VERSION = "3.11"; + +1; +package Net::FTP::E; + +use 5.008001; + +use strict; +use warnings; + +use Net::FTP::I; + +our @ISA = qw(Net::FTP::I); +our $VERSION = "3.11"; + +1; +package Time::gmtime; +use strict; +use 5.006_001; + +use Time::tm; + +our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); +our ( $tm_sec, $tm_min, $tm_hour, $tm_mday, + $tm_mon, $tm_year, $tm_wday, $tm_yday, + $tm_isdst, +); + +BEGIN { + use Exporter (); + @ISA = qw(Exporter Time::tm); + @EXPORT = qw(gmtime gmctime); + @EXPORT_OK = qw( + $tm_sec $tm_min $tm_hour $tm_mday + $tm_mon $tm_year $tm_wday $tm_yday + $tm_isdst + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); + $VERSION = 1.04; +} + +sub populate (@) { + return unless @_; + my $tmob = Time::tm->new(); + @$tmob = ( + $tm_sec, $tm_min, $tm_hour, $tm_mday, + $tm_mon, $tm_year, $tm_wday, $tm_yday, + $tm_isdst ) + = @_; + return $tmob; +} + +sub gmtime (;$) { populate CORE::gmtime(@_ ? shift : time)} +sub gmctime (;$) { scalar CORE::gmtime(@_ ? shift : time)} + +1; +__END__ + +package Time::localtime; +use strict; +use 5.006_001; + +use Time::tm; + +our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION); +our ( + $tm_sec, $tm_min, $tm_hour, $tm_mday, + $tm_mon, $tm_year, $tm_wday, $tm_yday, + $tm_isdst +); + +BEGIN { + use Exporter (); + @ISA = qw(Exporter Time::tm); + @EXPORT = qw(localtime ctime); + @EXPORT_OK = qw( + $tm_sec $tm_min $tm_hour $tm_mday + $tm_mon $tm_year $tm_wday $tm_yday + $tm_isdst + ); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); + $VERSION = 1.03; +} + +sub populate (@) { + return unless @_; + my $tmob = Time::tm->new(); + @$tmob = ( + $tm_sec, $tm_min, $tm_hour, $tm_mday, + $tm_mon, $tm_year, $tm_wday, $tm_yday, + $tm_isdst ) + = @_; + return $tmob; +} + +sub localtime (;$) { populate CORE::localtime(@_ ? shift : time)} +sub ctime (;$) { scalar CORE::localtime(@_ ? shift : time) } + +1; + +__END__ + +package Time::Local; + +use strict; + +use Carp (); +use Exporter; + +our $VERSION = '1.25'; + +use parent 'Exporter'; + +our @EXPORT = qw( timegm timelocal ); +our @EXPORT_OK = qw( timegm_nocheck timelocal_nocheck ); + +my @MonthDays = ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); + +# Determine breakpoint for rolling century +my $ThisYear = ( localtime() )[5]; +my $Breakpoint = ( $ThisYear + 50 ) % 100; +my $NextCentury = $ThisYear - $ThisYear % 100; +$NextCentury += 100 if $Breakpoint < 50; +my $Century = $NextCentury - 100; +my $SecOff = 0; + +my ( %Options, %Cheat ); + +use constant SECS_PER_MINUTE => 60; +use constant SECS_PER_HOUR => 3600; +use constant SECS_PER_DAY => 86400; + +my $MaxDay; +if ( $] < 5.012000 ) { + require Config; + ## no critic (Variables::ProhibitPackageVars) + + my $MaxInt; + if ( $^O eq 'MacOS' ) { + + # time_t is unsigned... + $MaxInt = ( 1 << ( 8 * $Config::Config{ivsize} ) ) + - 1; ## no critic qw(ProhibitPackageVars) + } + else { + $MaxInt + = ( ( 1 << ( 8 * $Config::Config{ivsize} - 2 ) ) - 1 ) * 2 + + 1; ## no critic qw(ProhibitPackageVars) + } + + $MaxDay = int( ( $MaxInt - ( SECS_PER_DAY / 2 ) ) / SECS_PER_DAY ) - 1; +} +else { + # recent localtime()'s limit is the year 2**31 + $MaxDay = 365 * ( 2**31 ); +} + +# Determine the EPOC day for this machine +my $Epoc = 0; +if ( $^O eq 'vos' ) { + + # work around posix-977 -- VOS doesn't handle dates in the range + # 1970-1980. + $Epoc = _daygm( 0, 0, 0, 1, 0, 70, 4, 0 ); +} +elsif ( $^O eq 'MacOS' ) { + $MaxDay *= 2 if $^O eq 'MacOS'; # time_t unsigned ... quick hack? + # MacOS time() is seconds since 1 Jan 1904, localtime + # so we need to calculate an offset to apply later + $Epoc = 693901; + $SecOff = timelocal( localtime(0) ) - timelocal( gmtime(0) ); + $Epoc += _daygm( gmtime(0) ); +} +else { + $Epoc = _daygm( gmtime(0) ); +} + +%Cheat = (); # clear the cache as epoc has changed + +sub _daygm { + + # This is written in such a byzantine way in order to avoid + # lexical variables and sub calls, for speed + return $_[3] + ( + $Cheat{ pack( 'ss', @_[ 4, 5 ] ) } ||= do { + my $month = ( $_[4] + 10 ) % 12; + my $year = $_[5] + 1900 - int( $month / 10 ); + + ( ( 365 * $year ) + + int( $year / 4 ) + - int( $year / 100 ) + + int( $year / 400 ) + + int( ( ( $month * 306 ) + 5 ) / 10 ) ) - $Epoc; + } + ); +} + +sub _timegm { + my $sec + = $SecOff + $_[0] + + ( SECS_PER_MINUTE * $_[1] ) + + ( SECS_PER_HOUR * $_[2] ); + + return $sec + ( SECS_PER_DAY * &_daygm ); +} + +sub timegm { + my ( $sec, $min, $hour, $mday, $month, $year ) = @_; + + if ( $year >= 1000 ) { + $year -= 1900; + } + elsif ( $year < 100 and $year >= 0 ) { + $year += ( $year > $Breakpoint ) ? $Century : $NextCentury; + } + + unless ( $Options{no_range_check} ) { + Carp::croak("Month '$month' out of range 0..11") + if $month > 11 + or $month < 0; + + my $md = $MonthDays[$month]; + ++$md + if $month == 1 && _is_leap_year( $year + 1900 ); + + Carp::croak("Day '$mday' out of range 1..$md") + if $mday > $md or $mday < 1; + Carp::croak("Hour '$hour' out of range 0..23") + if $hour > 23 or $hour < 0; + Carp::croak("Minute '$min' out of range 0..59") + if $min > 59 or $min < 0; + Carp::croak("Second '$sec' out of range 0..59") + if $sec >= 60 or $sec < 0; + } + + my $days = _daygm( undef, undef, undef, $mday, $month, $year ); + + unless ( $Options{no_range_check} or abs($days) < $MaxDay ) { + my $msg = q{}; + $msg .= "Day too big - $days > $MaxDay\n" if $days > $MaxDay; + + $year += 1900; + $msg + .= "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)"; + + Carp::croak($msg); + } + + return + $sec + $SecOff + + ( SECS_PER_MINUTE * $min ) + + ( SECS_PER_HOUR * $hour ) + + ( SECS_PER_DAY * $days ); +} + +sub _is_leap_year { + return 0 if $_[0] % 4; + return 1 if $_[0] % 100; + return 0 if $_[0] % 400; + + return 1; +} + +sub timegm_nocheck { + local $Options{no_range_check} = 1; + return &timegm; +} + +sub timelocal { + my $ref_t = &timegm; + my $loc_for_ref_t = _timegm( localtime($ref_t) ); + + my $zone_off = $loc_for_ref_t - $ref_t + or return $loc_for_ref_t; + + # Adjust for timezone + my $loc_t = $ref_t - $zone_off; + + # Are we close to a DST change or are we done + my $dst_off = $ref_t - _timegm( localtime($loc_t) ); + + # If this evaluates to true, it means that the value in $loc_t is + # the _second_ hour after a DST change where the local time moves + # backward. + if ( + !$dst_off + && ( ( $ref_t - SECS_PER_HOUR ) + - _timegm( localtime( $loc_t - SECS_PER_HOUR ) ) < 0 ) + ) { + return $loc_t - SECS_PER_HOUR; + } + + # Adjust for DST change + $loc_t += $dst_off; + + return $loc_t if $dst_off > 0; + + # If the original date was a non-extent gap in a forward DST jump, + # we should now have the wrong answer - undo the DST adjustment + my ( $s, $m, $h ) = localtime($loc_t); + $loc_t -= $dst_off if $s != $_[0] || $m != $_[1] || $h != $_[2]; + + return $loc_t; +} + +sub timelocal_nocheck { + local $Options{no_range_check} = 1; + return &timelocal; +} + +1; + +# ABSTRACT: Efficiently compute time from local and GMT time + +__END__ + +package Time::tm; +use strict; + +our $VERSION = '1.00'; + +use Class::Struct qw(struct); +struct('Time::tm' => [ + map { $_ => '$' } qw{ sec min hour mday mon year wday yday isdst } +]); + +1; +__END__ + +use strict; +use warnings; + +package Perl::OSType; +# ABSTRACT: Map Perl operating system names to generic types + +our $VERSION = '1.010'; + +require Exporter; +our @ISA = qw(Exporter); + +our %EXPORT_TAGS = ( all => [qw( os_type is_os_type )] ); + +our @EXPORT_OK = @{ $EXPORT_TAGS{all} }; + +# originally taken from Module::Build by Ken Williams et al. +my %OSTYPES = qw( + aix Unix + bsdos Unix + beos Unix + bitrig Unix + dgux Unix + dragonfly Unix + dynixptx Unix + freebsd Unix + linux Unix + haiku Unix + hpux Unix + iphoneos Unix + irix Unix + darwin Unix + machten Unix + midnightbsd Unix + minix Unix + mirbsd Unix + next Unix + openbsd Unix + netbsd Unix + dec_osf Unix + nto Unix + svr4 Unix + svr5 Unix + sco Unix + sco_sv Unix + unicos Unix + unicosmk Unix + solaris Unix + sunos Unix + cygwin Unix + msys Unix + os2 Unix + interix Unix + gnu Unix + gnukfreebsd Unix + nto Unix + qnx Unix + android Unix + + dos Windows + MSWin32 Windows + + os390 EBCDIC + os400 EBCDIC + posix-bc EBCDIC + vmesa EBCDIC + + MacOS MacOS + VMS VMS + vos VOS + riscos RiscOS + amigaos Amiga + mpeix MPEiX +); + +sub os_type { + my ($os) = @_; + $os = $^O unless defined $os; + return $OSTYPES{$os} || q{}; +} + +sub is_os_type { + my ( $type, $os ) = @_; + return unless $type; + $os = $^O unless defined $os; + return os_type($os) eq $type; +} + +1; + + +__END__ + + +# vim: ts=4 sts=4 sw=4 et: +package User::grent; +use strict; + +use 5.006_001; +our $VERSION = '1.02'; +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); +our ($gr_name, $gr_gid, $gr_passwd, $gr_mem, @gr_members); +BEGIN { + use Exporter (); + @EXPORT = qw(getgrent getgrgid getgrnam getgr); + @EXPORT_OK = qw($gr_name $gr_gid $gr_passwd $gr_mem @gr_members); + %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] ); +} + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'User::grent' => [ + name => '$', + passwd => '$', + gid => '$', + members => '@', +]; + +sub populate (@) { + return unless @_; + my $gob = new(); + ($gr_name, $gr_passwd, $gr_gid) = @$gob[0,1,2] = @_[0,1,2]; + @gr_members = @{$gob->[3]} = split ' ', $_[3]; + return $gob; +} + +sub getgrent ( ) { populate(CORE::getgrent()) } +sub getgrnam ($) { populate(CORE::getgrnam(shift)) } +sub getgrgid ($) { populate(CORE::getgrgid(shift)) } +sub getgr ($) { ($_[0] =~ /^\d+/) ? &getgrgid : &getgrnam } + +1; +__END__ + +package User::pwent; + +use 5.006; +our $VERSION = '1.01'; + +use strict; +use warnings; + +use Config; +use Carp; + +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); +our ( $pw_name, $pw_passwd, $pw_uid, $pw_gid, + $pw_gecos, $pw_dir, $pw_shell, + $pw_expire, $pw_change, $pw_class, + $pw_age, + $pw_quota, $pw_comment, + ); +BEGIN { + use Exporter (); + @EXPORT = qw(getpwent getpwuid getpwnam getpw); + @EXPORT_OK = qw( + pw_has + + $pw_name $pw_passwd $pw_uid $pw_gid + $pw_gecos $pw_dir $pw_shell + $pw_expire $pw_change $pw_class + $pw_age + $pw_quota $pw_comment + ); + %EXPORT_TAGS = ( + FIELDS => [ grep(/^\$pw_/, @EXPORT_OK), @EXPORT ], + ALL => [ @EXPORT, @EXPORT_OK ], + ); +} + +# +# XXX: these mean somebody hacked this module's source +# without understanding the underlying assumptions. +# +my $IE = "[INTERNAL ERROR]"; + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'User::pwent' => [ + name => '$', # pwent[0] + passwd => '$', # pwent[1] + uid => '$', # pwent[2] + gid => '$', # pwent[3] + + # you'll only have one/none of these three + change => '$', # pwent[4] + age => '$', # pwent[4] + quota => '$', # pwent[4] + + # you'll only have one/none of these two + comment => '$', # pwent[5] + class => '$', # pwent[5] + + # you might not have this one + gecos => '$', # pwent[6] + + dir => '$', # pwent[7] + shell => '$', # pwent[8] + + # you might not have this one + expire => '$', # pwent[9] + +]; + + +# init our groks hash to be true if the built platform knew how +# to do each struct pwd field that perl can ever under any circumstances +# know about. we do not use /^pw_?/, but just the tails. +sub _feature_init { + our %Groks; # whether build system knew how to do this feature + for my $feep ( qw{ + pwage pwchange pwclass pwcomment + pwexpire pwgecos pwpasswd pwquota + } + ) + { + my $short = $feep =~ /^pw(.*)/ + ? $1 + : do { + # not cluck, as we know we called ourselves, + # and a confession is probably imminent anyway + warn("$IE $feep is a funny struct pwd field"); + $feep; + }; + + exists $Config{ "d_" . $feep } + || confess("$IE Configure doesn't d_$feep"); + $Groks{$short} = defined $Config{ "d_" . $feep }; + } + # assume that any that are left are always there + for my $feep (grep /^\$pw_/s, @EXPORT_OK) { + $feep =~ /^\$pw_(.*)/; + $Groks{$1} = 1 unless defined $Groks{$1}; + } +} + +# With arguments, reports whether one or more fields are all implemented +# in the build machine's struct pwd pw_*. May be whitespace separated. +# We do not use /^pw_?/, just the tails. +# +# Without arguments, returns the list of fields implemented on build +# machine, space separated in scalar context. +# +# Takes exception to being asked whether this machine's struct pwd has +# a field that Perl never knows how to provide under any circumstances. +# If the module does this idiocy to itself, the explosion is noisier. +# +sub pw_has { + our %Groks; # whether build system knew how to do this feature + my $cando = 1; + my $sploder = caller() ne __PACKAGE__ + ? \&croak + : sub { confess("$IE @_") }; + if (@_ == 0) { + my @valid = sort grep { $Groks{$_} } keys %Groks; + return wantarray ? @valid : "@valid"; + } + for my $feep (map { split } @_) { + defined $Groks{$feep} + || $sploder->("$feep is never a valid struct pwd field"); + $cando &&= $Groks{$feep}; + } + return $cando; +} + +sub _populate (@) { + return unless @_; + my $pwob = new(); + + # Any that haven't been pw_had are assumed on "all" platforms of + # course, this may not be so, but you can't get here otherwise, + # since the underlying core call already took exception to your + # impudence. + + $pw_name = $pwob->name ( $_[0] ); + $pw_passwd = $pwob->passwd ( $_[1] ) if pw_has("passwd"); + $pw_uid = $pwob->uid ( $_[2] ); + $pw_gid = $pwob->gid ( $_[3] ); + + if (pw_has("change")) { + $pw_change = $pwob->change ( $_[4] ); + } + elsif (pw_has("age")) { + $pw_age = $pwob->age ( $_[4] ); + } + elsif (pw_has("quota")) { + $pw_quota = $pwob->quota ( $_[4] ); + } + + if (pw_has("class")) { + $pw_class = $pwob->class ( $_[5] ); + } + elsif (pw_has("comment")) { + $pw_comment = $pwob->comment( $_[5] ); + } + + $pw_gecos = $pwob->gecos ( $_[6] ) if pw_has("gecos"); + + $pw_dir = $pwob->dir ( $_[7] ); + $pw_shell = $pwob->shell ( $_[8] ); + + $pw_expire = $pwob->expire ( $_[9] ) if pw_has("expire"); + + return $pwob; +} + +sub getpwent ( ) { _populate(CORE::getpwent()) } +sub getpwnam ($) { _populate(CORE::getpwnam(shift)) } +sub getpwuid ($) { _populate(CORE::getpwuid(shift)) } +sub getpw ($) { ($_[0] =~ /^\d+\z/s) ? &getpwuid : &getpwnam } + +_feature_init(); + +1; +__END__ + +package Attribute::Handlers; +use 5.006; +use Carp; +use warnings; +use strict; +our $AUTOLOAD; +our $VERSION = '1.01'; # remember to update version in POD! +# $DB::single=1; + +my %symcache; +sub findsym { + my ($pkg, $ref, $type) = @_; + return $symcache{$pkg,$ref} if $symcache{$pkg,$ref}; + $type ||= ref($ref); + no strict 'refs'; + my $symtab = \%{$pkg."::"}; + for ( keys %$symtab ) { for my $sym ( $$symtab{$_} ) { + if (ref $sym && $sym == $ref) { + return $symcache{$pkg,$ref} = \*{"$pkg:\:$_"}; + } + use strict; + next unless ref ( \$sym ) eq 'GLOB'; + return $symcache{$pkg,$ref} = \$sym + if *{$sym}{$type} && *{$sym}{$type} == $ref; + }} +} + +my %validtype = ( + VAR => [qw[SCALAR ARRAY HASH]], + ANY => [qw[SCALAR ARRAY HASH CODE]], + "" => [qw[SCALAR ARRAY HASH CODE]], + SCALAR => [qw[SCALAR]], + ARRAY => [qw[ARRAY]], + HASH => [qw[HASH]], + CODE => [qw[CODE]], +); +my %lastattr; +my @declarations; +my %raw; +my %phase; +my %sigil = (SCALAR=>'$', ARRAY=>'@', HASH=>'%'); +my $global_phase = 0; +my %global_phases = ( + BEGIN => 0, + CHECK => 1, + INIT => 2, + END => 3, +); +my @global_phases = qw(BEGIN CHECK INIT END); + +sub _usage_AH_ { + croak "Usage: use $_[0] autotie => {AttrName => TieClassName,...}"; +} + +my $qual_id = qr/^[_a-z]\w*(::[_a-z]\w*)*$/i; + +sub import { + my $class = shift @_; + return unless $class eq "Attribute::Handlers"; + while (@_) { + my $cmd = shift; + if ($cmd =~ /^autotie((?:ref)?)$/) { + my $tiedata = ($1 ? '$ref, ' : '') . '@$data'; + my $mapping = shift; + _usage_AH_ $class unless ref($mapping) eq 'HASH'; + while (my($attr, $tieclass) = each %$mapping) { + $tieclass =~ s/^([_a-z]\w*(::[_a-z]\w*)*)(.*)/$1/is; + my $args = $3||'()'; + _usage_AH_ $class unless $attr =~ $qual_id + && $tieclass =~ $qual_id + && eval "use base q\0$tieclass\0; 1"; + if ($tieclass->isa('Exporter')) { + local $Exporter::ExportLevel = 2; + $tieclass->import(eval $args); + } + $attr =~ s/__CALLER__/caller(1)/e; + $attr = caller()."::".$attr unless $attr =~ /::/; + eval qq{ + sub $attr : ATTR(VAR) { + my (\$ref, \$data) = \@_[2,4]; + my \$was_arrayref = ref \$data eq 'ARRAY'; + \$data = [ \$data ] unless \$was_arrayref; + my \$type = ref(\$ref)||"value (".(\$ref||"").")"; + (\$type eq 'SCALAR')? tie \$\$ref,'$tieclass',$tiedata + :(\$type eq 'ARRAY') ? tie \@\$ref,'$tieclass',$tiedata + :(\$type eq 'HASH') ? tie \%\$ref,'$tieclass',$tiedata + : die "Can't autotie a \$type\n" + } 1 + } or die "Internal error: $@"; + } + } + else { + croak "Can't understand $_"; + } + } +} + +# On older perls, code attribute handlers run before the sub gets placed +# in its package. Since the :ATTR handlers need to know the name of the +# sub they're applied to, the name lookup (via findsym) needs to be +# delayed: we do it immediately before we might need to find attribute +# handlers from their name. However, on newer perls (which fix some +# problems relating to attribute application), a sub gets placed in its +# package before its attributes are processed. In this case, the +# delayed name lookup might be too late, because the sub we're looking +# for might have already been replaced. So we need to detect which way +# round this perl does things, and time the name lookup accordingly. +BEGIN { + my $delayed; + sub Attribute::Handlers::_TEST_::MODIFY_CODE_ATTRIBUTES { + $delayed = \&Attribute::Handlers::_TEST_::t != $_[1]; + return (); + } + sub Attribute::Handlers::_TEST_::t :T { } + *_delayed_name_resolution = sub() { $delayed }; + undef &Attribute::Handlers::_TEST_::MODIFY_CODE_ATTRIBUTES; + undef &Attribute::Handlers::_TEST_::t; +} + +sub _resolve_lastattr { + return unless $lastattr{ref}; + my $sym = findsym @lastattr{'pkg','ref'} + or die "Internal error: $lastattr{pkg} symbol went missing"; + my $name = *{$sym}{NAME}; + warn "Declaration of $name attribute in package $lastattr{pkg} may clash with future reserved word\n" + if $^W and $name !~ /[A-Z]/; + foreach ( @{$validtype{$lastattr{type}}} ) { + no strict 'refs'; + *{"$lastattr{pkg}::_ATTR_${_}_${name}"} = $lastattr{ref}; + } + %lastattr = (); +} + +sub AUTOLOAD { + return if $AUTOLOAD =~ /::DESTROY$/; + my ($class) = $AUTOLOAD =~ m/(.*)::/g; + $AUTOLOAD =~ m/_ATTR_(.*?)_(.*)/ or + croak "Can't locate class method '$AUTOLOAD' via package '$class'"; + croak "Attribute handler '$2' doesn't handle $1 attributes"; +} + +my $builtin = $] ge '5.027000' + ? qr/lvalue|method|shared/ + : qr/lvalue|method|locked|shared|unique/; + +sub _gen_handler_AH_() { + return sub { + _resolve_lastattr if _delayed_name_resolution; + my ($pkg, $ref, @attrs) = @_; + my (undef, $filename, $linenum) = caller 2; + foreach (@attrs) { + my ($attr, $data) = /^([a-z_]\w*)(?:[(](.*)[)])?$/is or next; + if ($attr eq 'ATTR') { + no strict 'refs'; + $data ||= "ANY"; + $raw{$ref} = $data =~ s/\s*,?\s*RAWDATA\s*,?\s*//; + $phase{$ref}{BEGIN} = 1 + if $data =~ s/\s*,?\s*(BEGIN)\s*,?\s*//; + $phase{$ref}{INIT} = 1 + if $data =~ s/\s*,?\s*(INIT)\s*,?\s*//; + $phase{$ref}{END} = 1 + if $data =~ s/\s*,?\s*(END)\s*,?\s*//; + $phase{$ref}{CHECK} = 1 + if $data =~ s/\s*,?\s*(CHECK)\s*,?\s*// + || ! keys %{$phase{$ref}}; + # Added for cleanup to not pollute next call. + (%lastattr = ()), + croak "Can't have two ATTR specifiers on one subroutine" + if keys %lastattr; + croak "Bad attribute type: ATTR($data)" + unless $validtype{$data}; + %lastattr=(pkg=>$pkg,ref=>$ref,type=>$data); + _resolve_lastattr unless _delayed_name_resolution; + } + else { + my $type = ref $ref; + my $handler = $pkg->can("_ATTR_${type}_${attr}"); + next unless $handler; + my $decl = [$pkg, $ref, $attr, $data, + $raw{$handler}, $phase{$handler}, $filename, $linenum]; + foreach my $gphase (@global_phases) { + _apply_handler_AH_($decl,$gphase) + if $global_phases{$gphase} <= $global_phase; + } + if ($global_phase != 0) { + # if _gen_handler_AH_ is being called after + # CHECK it's for a lexical, so make sure + # it didn't want to run anything later + + local $Carp::CarpLevel = 2; + carp "Won't be able to apply END handler" + if $phase{$handler}{END}; + } + else { + push @declarations, $decl + } + } + $_ = undef; + } + return grep {defined && !/$builtin/} @attrs; + } +} + +{ + no strict 'refs'; + *{"Attribute::Handlers::UNIVERSAL::MODIFY_${_}_ATTRIBUTES"} = + _gen_handler_AH_ foreach @{$validtype{ANY}}; +} +push @UNIVERSAL::ISA, 'Attribute::Handlers::UNIVERSAL' + unless grep /^Attribute::Handlers::UNIVERSAL$/, @UNIVERSAL::ISA; + +sub _apply_handler_AH_ { + my ($declaration, $phase) = @_; + my ($pkg, $ref, $attr, $data, $raw, $handlerphase, $filename, $linenum) = @$declaration; + return unless $handlerphase->{$phase}; + # print STDERR "Handling $attr on $ref in $phase with [$data]\n"; + my $type = ref $ref; + my $handler = "_ATTR_${type}_${attr}"; + my $sym = findsym($pkg, $ref); + $sym ||= $type eq 'CODE' ? 'ANON' : 'LEXICAL'; + no warnings; + if (!$raw && defined($data)) { + if ($data ne '') { + my $evaled = eval("package $pkg; no warnings; no strict; + local \$SIG{__WARN__}=sub{die}; [$data]"); + $data = $evaled unless $@; + } + else { $data = undef } + } + $pkg->$handler($sym, + (ref $sym eq 'GLOB' ? *{$sym}{ref $ref}||$ref : $ref), + $attr, + $data, + $phase, + $filename, + $linenum, + ); + return 1; +} + +{ + no warnings 'void'; + CHECK { + $global_phase++; + _resolve_lastattr if _delayed_name_resolution; + foreach my $decl (@declarations) { + _apply_handler_AH_($decl, 'CHECK'); + } + } + + INIT { + $global_phase++; + foreach my $decl (@declarations) { + _apply_handler_AH_($decl, 'INIT'); + } + } +} + +END { + $global_phase++; + foreach my $decl (@declarations) { + _apply_handler_AH_($decl, 'END'); + } +} + +1; +__END__ + +Encode::$_Name_ version 0.1 +======== + +NAME + Encode::$_Name_ - + +SYNOPSIS + use Encode::$_Name_; + # +ABSTRACT + +INSTALLATION + +To install this module type the following: + + perl Makefile.PL + make + make test + make install + +DEPENDENCIES + +This module requires perl version 5.7.3 or later. + +COPYRIGHT AND LICENCE + +Copyright (C) 2002 Your Name + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +# +# This file is auto-generated by: +# enc2xs version $_Version_ +# $_Now_ +# +use 5.7.2; +use strict; +use ExtUtils::MakeMaker; +use Config; + +# Please edit the following to the taste! +my $name = '$_Name_'; +my %tables = ( + $_Name__t => [ $_TableFiles_ ], + ); + +#### DO NOT EDIT BEYOND THIS POINT! +require File::Spec; +my ($enc2xs, $encode_h) = (); +my @path_ext = (''); +@path_ext = split(';', $ENV{PATHEXT}) if $^O eq 'MSWin32'; +PATHLOOP: +for my $d (@Config{qw/bin sitebin vendorbin/}, + (split /$Config{path_sep}/o, $ENV{PATH})){ + for my $f (qw/enc2xs enc2xs5.7.3/){ + my $path = File::Spec->catfile($d, $f); + for my $ext (@path_ext) { + my $bin = "$path$ext"; + -r "$bin" and $enc2xs = $bin and last PATHLOOP; + } + } +} +$enc2xs or die "enc2xs not found!"; +print "enc2xs is $enc2xs\n"; +my %encode_h = (); +for my $d (@INC){ + my $dir = File::Spec->catfile($d, "Encode"); + my $file = File::Spec->catfile($dir, "encode.h"); + -f $file and $encode_h{$dir} = -M $file; +} +%encode_h or die "encode.h not found!"; +# find the latest one +($encode_h) = sort {$encode_h{$b} <=> $encode_h{$a}} keys %encode_h; +print "encode.h is at $encode_h\n"; + +WriteMakefile( + INC => "-I$encode_h", +#### END_OF_HEADER -- DO NOT EDIT THIS LINE BY HAND! #### + NAME => 'Encode::'.$name, + VERSION_FROM => "$name.pm", + OBJECT => '$(O_FILES)', + 'dist' => { + COMPRESS => 'gzip -9f', + SUFFIX => 'gz', + DIST_DEFAULT => 'all tardist', + }, + MAN3PODS => {}, + PREREQ_PM => { + 'Encode' => "1.41", + }, + # OS 390 winges about line numbers > 64K ??? + XSOPT => '-nolinenumbers', + ); + +package MY; + +sub post_initialize +{ + my ($self) = @_; + my %o; + my $x = $self->{'OBJ_EXT'}; + # Add the table O_FILES + foreach my $e (keys %tables) + { + $o{$e.$x} = 1; + } + $o{"$name$x"} = 1; + $self->{'O_FILES'} = [sort keys %o]; + my @files = ("$name.xs"); + $self->{'C'} = ["$name.c"]; + # The next two lines to make MacPerl Happy -- dankogai via pudge + $self->{SOURCE} .= " $name.c" + if $^O eq 'MacOS' && $self->{SOURCE} !~ /\b$name\.c\b/; + # $self->{'H'} = [$self->catfile($self->updir,'encode.h')]; + my %xs; + foreach my $table (sort keys %tables) { + push (@{$self->{'C'}},"$table.c"); + # Do NOT add $table.h etc. to H_FILES unless we own up as to how they + # get built. + foreach my $ext (qw($(OBJ_EXT) .c .h .exh .fnm)) { + push (@files,$table.$ext); + } + } + $self->{'XS'} = { "$name.xs" => "$name.c" }; + $self->{'clean'}{'FILES'} .= join(' ',@files); + open(XS,">$name.xs") || die "Cannot open $name.xs:$!"; + print XS <<'END'; +#include +#include +#include +#include "encode.h" +END + foreach my $table (sort keys %tables) { + print XS qq[#include "${table}.h"\n]; + } + print XS <<"END"; + +static void +Encode_XSEncoding(pTHX_ encode_t *enc) +{ + dSP; + HV *stash = gv_stashpv("Encode::XS", TRUE); + SV *iv = newSViv(PTR2IV(enc)); + SV *sv = sv_bless(newRV_noinc(iv),stash); + int i = 0; + /* with the SvLEN() == 0 hack, PVX won't be freed. We cast away name's + constness, in the hope that perl won't mess with it. */ + assert(SvTYPE(iv) >= SVt_PV); assert(SvLEN(iv) == 0); + SvFLAGS(iv) |= SVp_POK; + SvPVX(iv) = (char*) enc->name[0]; + PUSHMARK(sp); + XPUSHs(sv); + while (enc->name[i]) + { + const char *name = enc->name[i++]; + XPUSHs(sv_2mortal(newSVpvn(name,strlen(name)))); + } + PUTBACK; + call_pv("Encode::define_encoding",G_DISCARD); + SvREFCNT_dec(sv); +} + +MODULE = Encode::$name PACKAGE = Encode::$name +PROTOTYPES: DISABLE +BOOT: +{ +END + foreach my $table (sort keys %tables) { + print XS qq[#include "${table}.exh"\n]; + } + print XS "}\n"; + close(XS); + return "# Built $name.xs\n\n"; +} + +sub postamble +{ + my $self = shift; + my $dir = "."; # $self->catdir('Encode'); + my $str = "# $name\$(OBJ_EXT) depends on .h and .exh files not .c files - but all written by enc2xs\n"; + $str .= "$name.c : $name.xs "; + foreach my $table (sort keys %tables) + { + $str .= " $table.c"; + } + $str .= "\n\n"; + $str .= "$name\$(OBJ_EXT) : $name.c\n\n"; + + foreach my $table (sort keys %tables) + { + my $numlines = 1; + my $lengthsofar = length($str); + my $continuator = ''; + $str .= "$table.c : Makefile.PL"; + foreach my $file (@{$tables{$table}}) + { + $str .= $continuator.' '.$self->catfile($dir,$file); + if ( length($str)-$lengthsofar > 128*$numlines ) + { + $continuator .= " \\\n\t"; + $numlines++; + } else { + $continuator = ''; + } + } + my $plib = $self->{PERL_CORE} ? '"-I$(PERL_LIB)"' : ''; + my $ucopts = '-"Q"'; + $str .= + qq{\n\t\$(PERL) $plib $enc2xs $ucopts -o \$\@ -f $table.fnm\n\n}; + open (FILELIST, ">$table.fnm") + || die "Could not open $table.fnm: $!"; + foreach my $file (@{$tables{$table}}) + { + print FILELIST $self->catfile($dir,$file) . "\n"; + } + close(FILELIST); + } + return $str; +} + +# +# $Id: Changes.e2x,v 2.0 2004/05/16 20:55:15 dankogai Exp $ +# Revision history for Perl extension Encode::$_Name_. +# + +0.01 $_Now_ + Autogenerated by enc2xs version $_Version_. +# +# Local demand-load module list +# +# You should not edit this file by hand! use "enc2xs -C" +# +package Encode::ConfigLocal; +our $VERSION = $_LocalVer_; + +use strict; + +$_ModLines_ + +1; +package Encode::$_Name_; +our $VERSION = "0.01"; + +use Encode; +use XSLoader; +XSLoader::load(__PACKAGE__,$VERSION); + +1; +__END__ + +=head1 NAME + +Encode::$_Name_ - New Encoding + +=head1 SYNOPSIS + +You got to fill this in! + +=head1 SEE ALSO + +L + +=cut +use strict; +# Adjust the number here! +use Test::More tests => 2; + +BEGIN { + use_ok('Encode'); + use_ok('Encode::$_Name_'); +} +# Add more test here! +use 5.008001; +use strict; +use warnings; +package Parse::CPAN::Meta; +# ABSTRACT: Parse META.yml and META.json CPAN metadata files + +our $VERSION = '2.150010'; + +use Exporter; +use Carp 'croak'; + +our @ISA = qw/Exporter/; +our @EXPORT_OK = qw/Load LoadFile/; + +sub load_file { + my ($class, $filename) = @_; + + my $meta = _slurp($filename); + + if ($filename =~ /\.ya?ml$/) { + return $class->load_yaml_string($meta); + } + elsif ($filename =~ /\.json$/) { + return $class->load_json_string($meta); + } + else { + $class->load_string($meta); # try to detect yaml/json + } +} + +sub load_string { + my ($class, $string) = @_; + if ( $string =~ /^---/ ) { # looks like YAML + return $class->load_yaml_string($string); + } + elsif ( $string =~ /^\s*\{/ ) { # looks like JSON + return $class->load_json_string($string); + } + else { # maybe doc-marker-free YAML + return $class->load_yaml_string($string); + } +} + +sub load_yaml_string { + my ($class, $string) = @_; + my $backend = $class->yaml_backend(); + my $data = eval { no strict 'refs'; &{"$backend\::Load"}($string) }; + croak $@ if $@; + return $data || {}; # in case document was valid but empty +} + +sub load_json_string { + my ($class, $string) = @_; + require Encode; + # load_json_string takes characters, decode_json expects bytes + my $encoded = Encode::encode('UTF-8', $string, Encode::PERLQQ()); + my $data = eval { $class->json_decoder()->can('decode_json')->($encoded) }; + croak $@ if $@; + return $data || {}; +} + +sub yaml_backend { + if ($ENV{PERL_CORE} or not defined $ENV{PERL_YAML_BACKEND} ) { + _can_load( 'CPAN::Meta::YAML', 0.011 ) + or croak "CPAN::Meta::YAML 0.011 is not available\n"; + return "CPAN::Meta::YAML"; + } + else { + my $backend = $ENV{PERL_YAML_BACKEND}; + _can_load( $backend ) + or croak "Could not load PERL_YAML_BACKEND '$backend'\n"; + $backend->can("Load") + or croak "PERL_YAML_BACKEND '$backend' does not implement Load()\n"; + return $backend; + } +} + +sub json_decoder { + if ($ENV{PERL_CORE}) { + _can_load( 'JSON::PP' => 2.27300 ) + or croak "JSON::PP 2.27300 is not available\n"; + return 'JSON::PP'; + } + if (my $decoder = $ENV{CPAN_META_JSON_DECODER}) { + _can_load( $decoder ) + or croak "Could not load CPAN_META_JSON_DECODER '$decoder'\n"; + $decoder->can('decode_json') + or croak "No decode_json sub provided by CPAN_META_JSON_DECODER '$decoder'\n"; + return $decoder; + } + return $_[0]->json_backend; +} + +sub json_backend { + if ($ENV{PERL_CORE}) { + _can_load( 'JSON::PP' => 2.27300 ) + or croak "JSON::PP 2.27300 is not available\n"; + return 'JSON::PP'; + } + if (my $backend = $ENV{CPAN_META_JSON_BACKEND}) { + _can_load( $backend ) + or croak "Could not load CPAN_META_JSON_BACKEND '$backend'\n"; + $backend->can('new') + or croak "No constructor provided by CPAN_META_JSON_BACKEND '$backend'\n"; + return $backend; + } + if (! $ENV{PERL_JSON_BACKEND} or $ENV{PERL_JSON_BACKEND} eq 'JSON::PP') { + _can_load( 'JSON::PP' => 2.27300 ) + or croak "JSON::PP 2.27300 is not available\n"; + return 'JSON::PP'; + } + else { + _can_load( 'JSON' => 2.5 ) + or croak "JSON 2.5 is required for " . + "\$ENV{PERL_JSON_BACKEND} = '$ENV{PERL_JSON_BACKEND}'\n"; + return "JSON"; + } +} + +sub _slurp { + require Encode; + open my $fh, "<:raw", "$_[0]" ## no critic + or die "can't open $_[0] for reading: $!"; + my $content = do { local $/; <$fh> }; + $content = Encode::decode('UTF-8', $content, Encode::PERLQQ()); + return $content; +} + +sub _can_load { + my ($module, $version) = @_; + (my $file = $module) =~ s{::}{/}g; + $file .= ".pm"; + return 1 if $INC{$file}; + return 0 if exists $INC{$file}; # prior load failed + eval { require $file; 1 } + or return 0; + if ( defined $version ) { + eval { $module->VERSION($version); 1 } + or return 0; + } + return 1; +} + +# Kept for backwards compatibility only +# Create an object from a file +sub LoadFile ($) { ## no critic + return Load(_slurp(shift)); +} + +# Parse a document from a string. +sub Load ($) { ## no critic + require CPAN::Meta::YAML; + my $object = eval { CPAN::Meta::YAML::Load(shift) }; + croak $@ if $@; + return $object; +} + +1; + +__END__ + +package Thread::Queue; + +use strict; +use warnings; + +our $VERSION = '3.12'; +$VERSION = eval $VERSION; + +use threads::shared 1.21; +use Scalar::Util 1.10 qw(looks_like_number blessed reftype refaddr); + +# Carp errors from threads::shared calls should complain about caller +our @CARP_NOT = ("threads::shared"); + +# Create a new queue possibly pre-populated with items +sub new +{ + my $class = shift; + my @queue :shared = map { shared_clone($_) } @_; + my %self :shared = ( 'queue' => \@queue ); + return bless(\%self, $class); +} + +# Add items to the tail of a queue +sub enqueue +{ + my $self = shift; + lock(%$self); + + if ($$self{'ENDED'}) { + require Carp; + Carp::croak("'enqueue' method called on queue that has been 'end'ed"); + } + + # Block if queue size exceeds any specified limit + my $queue = $$self{'queue'}; + cond_wait(%$self) while ($$self{'LIMIT'} && (@$queue >= $$self{'LIMIT'})); + + # Add items to queue, and then signal other threads + push(@$queue, map { shared_clone($_) } @_) + and cond_signal(%$self); +} + +# Set or return the max. size for a queue +sub limit : lvalue +{ + my $self = shift; + lock(%$self); + $$self{'LIMIT'}; +} + +# Return a count of the number of items on a queue +sub pending +{ + my $self = shift; + lock(%$self); + return if ($$self{'ENDED'} && ! @{$$self{'queue'}}); + return scalar(@{$$self{'queue'}}); +} + +# Indicate that no more data will enter the queue +sub end +{ + my $self = shift; + lock(%$self); + # No more data is coming + $$self{'ENDED'} = 1; + + cond_signal(%$self); # Unblock possibly waiting threads +} + +# Return 1 or more items from the head of a queue, blocking if needed +sub dequeue +{ + my $self = shift; + lock(%$self); + my $queue = $$self{'queue'}; + + my $count = @_ ? $self->_validate_count(shift) : 1; + + # Wait for requisite number of items + cond_wait(%$self) while ((@$queue < $count) && ! $$self{'ENDED'}); + + # If no longer blocking, try getting whatever is left on the queue + return $self->dequeue_nb($count) if ($$self{'ENDED'}); + + # Return single item + if ($count == 1) { + my $item = shift(@$queue); + cond_signal(%$self); # Unblock possibly waiting threads + return $item; + } + + # Return multiple items + my @items; + push(@items, shift(@$queue)) for (1..$count); + cond_signal(%$self); # Unblock possibly waiting threads + return @items; +} + +# Return items from the head of a queue with no blocking +sub dequeue_nb +{ + my $self = shift; + lock(%$self); + my $queue = $$self{'queue'}; + + my $count = @_ ? $self->_validate_count(shift) : 1; + + # Return single item + if ($count == 1) { + my $item = shift(@$queue); + cond_signal(%$self); # Unblock possibly waiting threads + return $item; + } + + # Return multiple items + my @items; + for (1..$count) { + last if (! @$queue); + push(@items, shift(@$queue)); + } + cond_signal(%$self); # Unblock possibly waiting threads + return @items; +} + +# Return items from the head of a queue, blocking if needed up to a timeout +sub dequeue_timed +{ + my $self = shift; + lock(%$self); + my $queue = $$self{'queue'}; + + # Timeout may be relative or absolute + my $timeout = @_ ? $self->_validate_timeout(shift) : -1; + # Convert to an absolute time for use with cond_timedwait() + if ($timeout < 32000000) { # More than one year + $timeout += time(); + } + + my $count = @_ ? $self->_validate_count(shift) : 1; + + # Wait for requisite number of items, or until timeout + while ((@$queue < $count) && ! $$self{'ENDED'}) { + last if (! cond_timedwait(%$self, $timeout)); + } + + # Get whatever we need off the queue if available + return $self->dequeue_nb($count); +} + +# Return an item without removing it from a queue +sub peek +{ + my $self = shift; + lock(%$self); + my $index = @_ ? $self->_validate_index(shift) : 0; + return $$self{'queue'}[$index]; +} + +# Insert items anywhere into a queue +sub insert +{ + my $self = shift; + lock(%$self); + + if ($$self{'ENDED'}) { + require Carp; + Carp::croak("'insert' method called on queue that has been 'end'ed"); + } + + my $queue = $$self{'queue'}; + + my $index = $self->_validate_index(shift); + + return if (! @_); # Nothing to insert + + # Support negative indices + if ($index < 0) { + $index += @$queue; + if ($index < 0) { + $index = 0; + } + } + + # Dequeue items from $index onward + my @tmp; + while (@$queue > $index) { + unshift(@tmp, pop(@$queue)) + } + + # Add new items to the queue + push(@$queue, map { shared_clone($_) } @_); + + # Add previous items back onto the queue + push(@$queue, @tmp); + + cond_signal(%$self); # Unblock possibly waiting threads +} + +# Remove items from anywhere in a queue +sub extract +{ + my $self = shift; + lock(%$self); + my $queue = $$self{'queue'}; + + my $index = @_ ? $self->_validate_index(shift) : 0; + my $count = @_ ? $self->_validate_count(shift) : 1; + + # Support negative indices + if ($index < 0) { + $index += @$queue; + if ($index < 0) { + $count += $index; + return if ($count <= 0); # Beyond the head of the queue + return $self->dequeue_nb($count); # Extract from the head + } + } + + # Dequeue items from $index+$count onward + my @tmp; + while (@$queue > ($index+$count)) { + unshift(@tmp, pop(@$queue)) + } + + # Extract desired items + my @items; + unshift(@items, pop(@$queue)) while (@$queue > $index); + + # Add back any removed items + push(@$queue, @tmp); + + cond_signal(%$self); # Unblock possibly waiting threads + + # Return single item + return $items[0] if ($count == 1); + + # Return multiple items + return @items; +} + +### Internal Methods ### + +# Check value of the requested index +sub _validate_index +{ + my $self = shift; + my $index = shift; + + if (! defined($index) || + ! looks_like_number($index) || + (int($index) != $index)) + { + require Carp; + my ($method) = (caller(1))[3]; + my $class_name = ref($self); + $method =~ s/$class_name\:://; + $index = 'undef' if (! defined($index)); + Carp::croak("Invalid 'index' argument ($index) to '$method' method"); + } + + return $index; +}; + +# Check value of the requested count +sub _validate_count +{ + my $self = shift; + my $count = shift; + + if (! defined($count) || + ! looks_like_number($count) || + (int($count) != $count) || + ($count < 1) || + ($$self{'LIMIT'} && $count > $$self{'LIMIT'})) + { + require Carp; + my ($method) = (caller(1))[3]; + my $class_name = ref($self); + $method =~ s/$class_name\:://; + $count = 'undef' if (! defined($count)); + if ($$self{'LIMIT'} && $count > $$self{'LIMIT'}) { + Carp::croak("'count' argument ($count) to '$method' method exceeds queue size limit ($$self{'LIMIT'})"); + } else { + Carp::croak("Invalid 'count' argument ($count) to '$method' method"); + } + } + + return $count; +}; + +# Check value of the requested timeout +sub _validate_timeout +{ + my $self = shift; + my $timeout = shift; + + if (! defined($timeout) || + ! looks_like_number($timeout)) + { + require Carp; + my ($method) = (caller(1))[3]; + my $class_name = ref($self); + $method =~ s/$class_name\:://; + $timeout = 'undef' if (! defined($timeout)); + Carp::croak("Invalid 'timeout' argument ($timeout) to '$method' method"); + } + + return $timeout; +}; + +1; + +package Thread::Semaphore; + +use strict; +use warnings; + +our $VERSION = '2.13'; +$VERSION = eval $VERSION; + +use threads::shared; +use Scalar::Util 1.10 qw(looks_like_number); + +# Predeclarations for internal functions +my ($validate_arg); + +# Create a new semaphore optionally with specified count (count defaults to 1) +sub new { + my $class = shift; + + my $val :shared = 1; + if (@_) { + $val = shift; + if (! defined($val) || + ! looks_like_number($val) || + (int($val) != $val)) + { + require Carp; + $val = 'undef' if (! defined($val)); + Carp::croak("Semaphore initializer is not an integer: $val"); + } + } + + return bless(\$val, $class); +} + +# Decrement a semaphore's count (decrement amount defaults to 1) +sub down { + my $sema = shift; + my $dec = @_ ? $validate_arg->(shift) : 1; + + lock($$sema); + cond_wait($$sema) until ($$sema >= $dec); + $$sema -= $dec; +} + +# Decrement a semaphore's count only if count >= decrement value +# (decrement amount defaults to 1) +sub down_nb { + my $sema = shift; + my $dec = @_ ? $validate_arg->(shift) : 1; + + lock($$sema); + my $ok = ($$sema >= $dec); + $$sema -= $dec if $ok; + return $ok; +} + +# Decrement a semaphore's count even if the count goes below 0 +# (decrement amount defaults to 1) +sub down_force { + my $sema = shift; + my $dec = @_ ? $validate_arg->(shift) : 1; + + lock($$sema); + $$sema -= $dec; +} + +# Decrement a semaphore's count with timeout +# (timeout in seconds; decrement amount defaults to 1) +sub down_timed { + my $sema = shift; + my $timeout = $validate_arg->(shift); + my $dec = @_ ? $validate_arg->(shift) : 1; + + lock($$sema); + my $abs = time() + $timeout; + until ($$sema >= $dec) { + return if !cond_timedwait($$sema, $abs); + } + $$sema -= $dec; + return 1; +} + +# Increment a semaphore's count (increment amount defaults to 1) +sub up { + my $sema = shift; + my $inc = @_ ? $validate_arg->(shift) : 1; + + lock($$sema); + ($$sema += $inc) > 0 and cond_broadcast($$sema); +} + +### Internal Functions ### + +# Validate method argument +$validate_arg = sub { + my $arg = shift; + + if (! defined($arg) || + ! looks_like_number($arg) || + (int($arg) != $arg) || + ($arg < 1)) + { + require Carp; + my ($method) = (caller(1))[3]; + $method =~ s/Thread::Semaphore:://; + $arg = 'undef' if (! defined($arg)); + Carp::croak("Argument to semaphore method '$method' is not a positive integer: $arg"); + } + + return $arg; +}; + +1; + +# You may distribute under the terms of either the GNU General Public License +# or the Artistic License (the same terms as Perl itself) +# +# (C) Paul Evans, 2013-2016 -- leonerd@leonerd.org.uk + +package Future::Utils; + +use strict; +use warnings; + +our $VERSION = '0.39'; + +use Exporter 'import'; +# Can't import the one from Exporter as it relies on package inheritance +sub export_to_level +{ + my $pkg = shift; local $Exporter::ExportLevel = 1 + shift; $pkg->import(@_); +} + +our @EXPORT_OK = qw( + call + call_with_escape + + repeat + try_repeat try_repeat_until_success + repeat_until_success + + fmap fmap_concat + fmap1 fmap_scalar + fmap0 fmap_void +); + +use Carp; +our @CARP_NOT = qw( Future ); + +use Future; + + + +sub call(&) +{ + my ( $code ) = @_; + return Future->call( $code ); +} + + +sub call_with_escape(&) +{ + my ( $code ) = @_; + + my $escape_f = Future->new; + + return Future->wait_any( + Future->call( $code, $escape_f ), + $escape_f, + ); +} + + +sub _repeat +{ + my ( $code, $return, $trialp, $cond, $sense, $is_try ) = @_; + + my $prev = $$trialp; + + while(1) { + my $trial = $$trialp ||= Future->call( $code, $prev ); + $prev = $trial; + + if( !$trial->is_ready ) { + # defer + $return ||= $trial->new; + $trial->on_ready( sub { + return if $$trialp->is_cancelled; + _repeat( $code, $return, $trialp, $cond, $sense, $is_try ); + }); + return $return; + } + + my $stop; + if( not eval { $stop = !$cond->( $trial ) ^ $sense; 1 } ) { + $return ||= $trial->new; + $return->fail( $@ ); + return $return; + } + + if( $stop ) { + # Return result + $return ||= $trial->new; + $trial->on_done( $return ); + $trial->on_fail( $return ); + return $return; + } + + if( !$is_try and $trial->failure ) { + carp "Using Future::Utils::repeat to retry a failure is deprecated; use try_repeat instead"; + } + + # redo + undef $$trialp; + } +} + +sub repeat(&@) +{ + my $code = shift; + my %args = @_; + + # This makes it easier to account for other conditions + defined($args{while}) + defined($args{until}) == 1 + or defined($args{foreach}) + or defined($args{generate}) + or croak "Expected one of 'while', 'until', 'foreach' or 'generate'"; + + if( $args{foreach} ) { + $args{generate} and croak "Cannot use both 'foreach' and 'generate'"; + + my $array = delete $args{foreach}; + $args{generate} = sub { + @$array ? shift @$array : (); + }; + } + + if( $args{generate} ) { + my $generator = delete $args{generate}; + my $otherwise = delete $args{otherwise}; + + # TODO: This is slightly messy as this lexical is captured by both + # blocks of code. Can we do better somehow? + my $done; + + my $orig_code = $code; + $code = sub { + my ( $last_trial_f ) = @_; + my $again = my ( $value ) = $generator->( $last_trial_f ); + + if( $again ) { + unshift @_, $value; goto &$orig_code; + } + + $done++; + if( $otherwise ) { + goto &$otherwise; + } + else { + return $last_trial_f || Future->done; + } + }; + + if( my $orig_while = delete $args{while} ) { + $args{while} = sub { + $orig_while->( $_[0] ) and !$done; + }; + } + elsif( my $orig_until = delete $args{until} ) { + $args{while} = sub { + !$orig_until->( $_[0] ) and !$done; + }; + } + else { + $args{while} = sub { !$done }; + } + } + + my $future = $args{return}; + + my $trial; + $args{while} and $future = _repeat( $code, $future, \$trial, $args{while}, 0, $args{try} ); + $args{until} and $future = _repeat( $code, $future, \$trial, $args{until}, 1, $args{try} ); + + $future->on_cancel( sub { $trial->cancel } ); + + return $future; +} + + +sub try_repeat(&@) +{ + # defeat prototype + &repeat( @_, try => 1 ); +} + + +sub try_repeat_until_success(&@) +{ + my $code = shift; + my %args = @_; + + # TODO: maybe merge while/until conditions one day... + defined($args{while}) or defined($args{until}) + and croak "Cannot pass 'while' or 'until' to try_repeat_until_success"; + + # defeat prototype + &try_repeat( $code, while => sub { shift->failure }, %args ); +} + +# Legacy name +*repeat_until_success = \&try_repeat_until_success; + + +# This function is invoked in two circumstances: +# a) to create an item Future in a slot, +# b) once a non-immediate item Future is complete, to check its results +# It can tell which circumstance by whether the slot itself is defined or not +sub _fmap_slot +{ + my ( $slots, undef, $code, $generator, $collect, $results, $return ) = @_; + + SLOT: while(1) { + # Capture args each call because we mutate them + my ( undef, $idx ) = my @args = @_; + + unless( $slots->[$idx] ) { + # No item Future yet (case a), so create one + my $item; + unless( ( $item ) = $generator->() ) { + # All out of items, so now just wait for the slots to be finished + undef $slots->[$idx]; + defined and return $return for @$slots; + + # All the slots are done + $return ||= Future->new; + + $return->done( @$results ); + return $return; + } + + my $f = $slots->[$idx] = Future->call( $code, local $_ = $item ); + + if( $collect eq "array" ) { + push @$results, my $r = []; + $f->on_done( sub { @$r = @_ }); + } + elsif( $collect eq "scalar" ) { + push @$results, undef; + my $r = \$results->[-1]; + $f->on_done( sub { $$r = $_[0] }); + } + } + + my $f = $slots->[$idx]; + + # Slot is non-immediate; arrange for us to be invoked again later when it's ready + if( !$f->is_ready ) { + $args[-1] = ( $return ||= $f->new ); + $f->on_done( sub { _fmap_slot( @args ) } ); + $f->on_fail( $return ); + + # Try looking for more that might be ready + my $i = $idx + 1; + while( $i != $idx ) { + $i++; + $i %= @$slots; + next if defined $slots->[$i]; + + $_[1] = $i; + redo SLOT; + } + return $return; + } + + # Either we've been invoked again (case b), or the immediate Future was + # already ready. + if( $f->failure ) { + $return ||= $f->new; + $return->fail( $f->failure ); + return $return; + } + + undef $slots->[$idx]; + # next + } +} + +sub _fmap +{ + my $code = shift; + my %args = @_; + + my $concurrent = $args{concurrent} || 1; + my @slots; + + my $results = []; + my $future = $args{return}; + + my $generator; + if( $generator = $args{generate} ) { + # OK + } + elsif( my $array = $args{foreach} ) { + $generator = sub { return unless @$array; shift @$array }; + } + else { + croak "Expected either 'generate' or 'foreach'"; + } + + # If any of these immediately fail, don't bother continuing + foreach my $idx ( 0 .. $concurrent-1 ) { + $future = _fmap_slot( \@slots, $idx, $code, $generator, $args{collect}, $results, $future ); + last if $future->is_ready; + } + + $future->on_fail( sub { + !defined $_ or $_->is_ready or $_->cancel for @slots; + }); + $future->on_cancel( sub { + !defined $_ or $_->is_ready or $_->cancel for @slots; + }); + + return $future; +} + + +sub fmap_concat(&@) +{ + my $code = shift; + my %args = @_; + + _fmap( $code, %args, collect => "array" )->then( sub { + return Future->done( map { @$_ } @_ ); + }); +} +*fmap = \&fmap_concat; + + +sub fmap_scalar(&@) +{ + my $code = shift; + my %args = @_; + + _fmap( $code, %args, collect => "scalar" ) +} +*fmap1 = \&fmap_scalar; + + +sub fmap_void(&@) +{ + my $code = shift; + my %args = @_; + + _fmap( $code, %args, collect => "void" ) +} +*fmap0 = \&fmap_void; + + +0x55AA; +# You may distribute under the terms of either the GNU General Public License +# or the Artistic License (the same terms as Perl itself) +# +# (C) Paul Evans, 2016-2017 -- leonerd@leonerd.org.uk + +package Future::Mutex; + +use strict; +use warnings; + +our $VERSION = '0.39'; + +use Future; + + + + +sub new +{ + my $class = shift; + my %params = @_; + + return bless { + avail => $params{count} // 1, + queue => [], + }, $class; +} + + + +sub enter +{ + my $self = shift; + my ( $code ) = @_; + + my $down_f; + if( $self->{avail} ) { + $self->{avail}--; + $down_f = Future->done; + } + else { + push @{ $self->{queue} }, $down_f = Future->new; + } + + my $up = sub { + if( my $next_f = shift @{ $self->{queue} } ) { + $next_f->done; + } + else { + $self->{avail}++; + } + }; + + $down_f->then( $code )->on_ready( $up ); +} + + +sub available +{ + my $self = shift; + return $self->{avail}; +} + + +0x55AA; + +# Time-stamp: "2004-10-06 23:26:33 ADT" +# Sean M. Burke + +require 5.000; +package I18N::LangTags; +use strict; +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(); +our @EXPORT_OK = qw(is_language_tag same_language_tag + extract_language_tags super_languages + similarity_language_tag is_dialect_of + locale2language_tag alternate_language_tags + encode_language_tag panic_languages + implicate_supers + implicate_supers_strictly + ); +our %EXPORT_TAGS = ('ALL' => \@EXPORT_OK); + +our $VERSION = "0.43"; +our %Panic; + +sub uniq { my %seen; return grep(!($seen{$_}++), @_); } # a util function + + + +########################################################################### + + +sub is_language_tag { + + ## Changes in the language tagging standards may have to be reflected here. + + my($tag) = lc($_[0]); + + return 0 if $tag eq "i" or $tag eq "x"; + # Bad degenerate cases that the following + # regexp would erroneously let pass + + return $tag =~ + /^(?: # First subtag + [xi] | [a-z]{2,3} + ) + (?: # Subtags thereafter + - # separator + [a-z0-9]{1,8} # subtag + )* + $/xs ? 1 : 0; +} + +########################################################################### + + +sub extract_language_tags { + + ## Changes in the language tagging standards may have to be reflected here. + + my($text) = + $_[0] =~ m/(.+)/ # to make for an untainted result + ? $1 : '' + ; + + return grep(!m/^[ixIX]$/s, # 'i' and 'x' aren't good tags + $text =~ + m/ + \b + (?: # First subtag + [iIxX] | [a-zA-Z]{2,3} + ) + (?: # Subtags thereafter + - # separator + [a-zA-Z0-9]{1,8} # subtag + )* + \b + /xsg + ); +} + +########################################################################### + + +sub same_language_tag { + my $el1 = &encode_language_tag($_[0]); + return 0 unless defined $el1; + # this avoids the problem of + # encode_language_tag($lang1) eq and encode_language_tag($lang2) + # being true if $lang1 and $lang2 are both undef + + return $el1 eq &encode_language_tag($_[1]) ? 1 : 0; +} + +########################################################################### + + +sub similarity_language_tag { + my $lang1 = &encode_language_tag($_[0]); + my $lang2 = &encode_language_tag($_[1]); + # And encode_language_tag takes care of the whole + # no-nyn==nn, i-hakka==zh-hakka, etc, things + + # NB: (i-sil-...)? (i-sgn-...)? + + return undef if !defined($lang1) and !defined($lang2); + return 0 if !defined($lang1) or !defined($lang2); + + my @l1_subtags = split('-', $lang1); + my @l2_subtags = split('-', $lang2); + my $similarity = 0; + + while(@l1_subtags and @l2_subtags) { + if(shift(@l1_subtags) eq shift(@l2_subtags)) { + ++$similarity; + } else { + last; + } + } + return $similarity; +} + +########################################################################### + + +sub is_dialect_of { + + my $lang1 = &encode_language_tag($_[0]); + my $lang2 = &encode_language_tag($_[1]); + + return undef if !defined($lang1) and !defined($lang2); + return 0 if !defined($lang1) or !defined($lang2); + + return 1 if $lang1 eq $lang2; + return 0 if length($lang1) < length($lang2); + + $lang1 .= '-'; + $lang2 .= '-'; + return + (substr($lang1, 0, length($lang2)) eq $lang2) ? 1 : 0; +} + +########################################################################### + + +sub super_languages { + my $lang1 = $_[0]; + return() unless defined($lang1) && &is_language_tag($lang1); + + # a hack for those annoying new (2001) tags: + $lang1 =~ s/^nb\b/no-bok/i; # yes, backwards + $lang1 =~ s/^nn\b/no-nyn/i; # yes, backwards + $lang1 =~ s/^[ix](-hakka\b)/zh$1/i; # goes the right way + # i-hakka-bork-bjork-bjark => zh-hakka-bork-bjork-bjark + + my @l1_subtags = split('-', $lang1); + + ## Changes in the language tagging standards may have to be reflected here. + + # NB: (i-sil-...)? + + my @supers = (); + foreach my $bit (@l1_subtags) { + push @supers, + scalar(@supers) ? ($supers[-1] . '-' . $bit) : $bit; + } + pop @supers if @supers; + shift @supers if @supers && $supers[0] =~ m<^[iIxX]$>s; + return reverse @supers; +} + +########################################################################### + + +sub locale2language_tag { + my $lang = + $_[0] =~ m/(.+)/ # to make for an untainted result + ? $1 : '' + ; + + return $lang if &is_language_tag($lang); # like "en" + + $lang =~ tr<_><->; # "en_US" -> en-US + $lang =~ s<(?:[\.\@][-_a-zA-Z0-9]+)+$><>s; # "en_US.ISO8859-1" -> en-US + # it_IT.utf8@euro => it-IT + + return $lang if &is_language_tag($lang); + + return; +} + +########################################################################### + + +sub encode_language_tag { + # Only similarity_language_tag() is allowed to analyse encodings! + + ## Changes in the language tagging standards may have to be reflected here. + + my($tag) = $_[0] || return undef; + return undef unless &is_language_tag($tag); + + # For the moment, these legacy variances are few enough that + # we can just handle them here with regexps. + $tag =~ s/^iw\b/he/i; # Hebrew + $tag =~ s/^in\b/id/i; # Indonesian + $tag =~ s/^cre\b/cr/i; # Cree + $tag =~ s/^jw\b/jv/i; # Javanese + $tag =~ s/^[ix]-lux\b/lb/i; # Luxemburger + $tag =~ s/^[ix]-navajo\b/nv/i; # Navajo + $tag =~ s/^ji\b/yi/i; # Yiddish + # SMB 2003 -- Hm. There's a bunch of new XXX->YY variances now, + # but maybe they're all so obscure I can ignore them. "Obscure" + # meaning either that the language is obscure, and/or that the + # XXX form was extant so briefly that it's unlikely it was ever + # used. I hope. + # + # These go FROM the simplex to complex form, to get + # similarity-comparison right. And that's okay, since + # similarity_language_tag is the only thing that + # analyzes our output. + $tag =~ s/^[ix]-hakka\b/zh-hakka/i; # Hakka + $tag =~ s/^nb\b/no-bok/i; # BACKWARDS for Bokmal + $tag =~ s/^nn\b/no-nyn/i; # BACKWARDS for Nynorsk + + $tag =~ s/^[xiXI]-//s; + # Just lop off any leading "x/i-" + + return "~" . uc($tag); +} + +#-------------------------------------------------------------------------- + + +my %alt = qw( i x x i I X X I ); +sub alternate_language_tags { + my $tag = $_[0]; + return() unless &is_language_tag($tag); + + my @em; # push 'em real goood! + + # For the moment, these legacy variances are few enough that + # we can just handle them here with regexps. + + if( $tag =~ m/^[ix]-hakka\b(.*)/i) {push @em, "zh-hakka$1"; + } elsif($tag =~ m/^zh-hakka\b(.*)/i) { push @em, "x-hakka$1", "i-hakka$1"; + + } elsif($tag =~ m/^he\b(.*)/i) { push @em, "iw$1"; + } elsif($tag =~ m/^iw\b(.*)/i) { push @em, "he$1"; + + } elsif($tag =~ m/^in\b(.*)/i) { push @em, "id$1"; + } elsif($tag =~ m/^id\b(.*)/i) { push @em, "in$1"; + + } elsif($tag =~ m/^[ix]-lux\b(.*)/i) { push @em, "lb$1"; + } elsif($tag =~ m/^lb\b(.*)/i) { push @em, "i-lux$1", "x-lux$1"; + + } elsif($tag =~ m/^[ix]-navajo\b(.*)/i) { push @em, "nv$1"; + } elsif($tag =~ m/^nv\b(.*)/i) { push @em, "i-navajo$1", "x-navajo$1"; + + } elsif($tag =~ m/^yi\b(.*)/i) { push @em, "ji$1"; + } elsif($tag =~ m/^ji\b(.*)/i) { push @em, "yi$1"; + + } elsif($tag =~ m/^nb\b(.*)/i) { push @em, "no-bok$1"; + } elsif($tag =~ m/^no-bok\b(.*)/i) { push @em, "nb$1"; + + } elsif($tag =~ m/^nn\b(.*)/i) { push @em, "no-nyn$1"; + } elsif($tag =~ m/^no-nyn\b(.*)/i) { push @em, "nn$1"; + } + + push @em, $alt{$1} . $2 if $tag =~ /^([XIxi])(-.+)/; + return @em; +} + +########################################################################### + +{ + # Init %Panic... + + my @panic = ( # MUST all be lowercase! + # Only large ("national") languages make it in this list. + # If you, as a user, are so bizarre that the /only/ language + # you claim to accept is Galician, then no, we won't do you + # the favor of providing Catalan as a panic-fallback for + # you. Because if I start trying to add "little languages" in + # here, I'll just go crazy. + + # Scandinavian lgs. All based on opinion and hearsay. + 'sv' => [qw(nb no da nn)], + 'da' => [qw(nb no sv nn)], # I guess + [qw(no nn nb)], [qw(no nn nb sv da)], + 'is' => [qw(da sv no nb nn)], + 'fo' => [qw(da is no nb nn sv)], # I guess + + # I think this is about the extent of tolerable intelligibility + # among large modern Romance languages. + 'pt' => [qw(es ca it fr)], # Portuguese, Spanish, Catalan, Italian, French + 'ca' => [qw(es pt it fr)], + 'es' => [qw(ca it fr pt)], + 'it' => [qw(es fr ca pt)], + 'fr' => [qw(es it ca pt)], + + # Also assume that speakers of the main Indian languages prefer + # to read/hear Hindi over English + [qw( + as bn gu kn ks kok ml mni mr ne or pa sa sd te ta ur + )] => 'hi', + # Assamese, Bengali, Gujarati, [Hindi,] Kannada (Kanarese), Kashmiri, + # Konkani, Malayalam, Meithei (Manipuri), Marathi, Nepali, Oriya, + # Punjabi, Sanskrit, Sindhi, Telugu, Tamil, and Urdu. + 'hi' => [qw(bn pa as or)], + # I welcome finer data for the other Indian languages. + # E.g., what should Oriya's list be, besides just Hindi? + + # And the panic languages for English is, of course, nil! + + # My guesses at Slavic intelligibility: + ([qw(ru be uk)]) x 2, # Russian, Belarusian, Ukranian + ([qw(sr hr bs)]) x 2, # Serbian, Croatian, Bosnian + 'cs' => 'sk', 'sk' => 'cs', # Czech + Slovak + + 'ms' => 'id', 'id' => 'ms', # Malay + Indonesian + + 'et' => 'fi', 'fi' => 'et', # Estonian + Finnish + + #?? 'lo' => 'th', 'th' => 'lo', # Lao + Thai + + ); + my($k,$v); + while(@panic) { + ($k,$v) = splice(@panic,0,2); + foreach my $k (ref($k) ? @$k : $k) { + foreach my $v (ref($v) ? @$v : $v) { + push @{$Panic{$k} ||= []}, $v unless $k eq $v; + } + } + } +} + + +sub panic_languages { + # When in panic or in doubt, run in circles, scream, and shout! + my(@out, %seen); + foreach my $t (@_) { + next unless $t; + next if $seen{$t}++; # so we don't return it or hit it again + # push @out, super_languages($t); # nah, keep that separate + push @out, @{ $Panic{lc $t} || next }; + } + return grep !$seen{$_}++, @out, 'en'; +} + +#--------------------------------------------------------------------------- +#--------------------------------------------------------------------------- + + +sub implicate_supers { + my @languages = grep is_language_tag($_), @_; + my %seen_encoded; + foreach my $lang (@languages) { + $seen_encoded{ I18N::LangTags::encode_language_tag($lang) } = 1 + } + + my(@output_languages); + foreach my $lang (@languages) { + push @output_languages, $lang; + foreach my $s ( I18N::LangTags::super_languages($lang) ) { + # Note that super_languages returns the longest first. + last if $seen_encoded{ I18N::LangTags::encode_language_tag($s) }; + push @output_languages, $s; + } + } + return uniq( @output_languages ); + +} + +sub implicate_supers_strictly { + my @tags = grep is_language_tag($_), @_; + return uniq( @_, map super_languages($_), @_ ); +} + + + +########################################################################### +1; +__END__ + + +package I18N::Collate; + +use strict; +our $VERSION = '1.02'; + + +# I18N::Collate.pm +# +# Author: Jarkko Hietaniemi > +# Helsinki University of Technology, Finland +# +# Acks: Guy Decoux > understood +# overloading magic much deeper than I and told +# how to cut the size of this code by more than half. +# (my first version did overload all of lt gt eq le ge cmp) +# +# Purpose: compare 8-bit scalar data according to the current locale +# +# Requirements: Perl5 POSIX::setlocale() and POSIX::strxfrm() +# +# Exports: setlocale 1) +# collate_xfrm 2) +# +# Overloads: cmp # 3) +# +# Usage: use I18N::Collate; +# setlocale(LC_COLLATE, 'locale-of-your-choice'); # 4) +# $s1 = I18N::Collate->("scalar_data_1"); +# $s2 = I18N::Collate->("scalar_data_2"); +# +# now you can compare $s1 and $s2: $s1 le $s2 +# to extract the data itself, you need to deref: $$s1 +# +# Notes: +# 1) this uses POSIX::setlocale +# 2) the basic collation conversion is done by strxfrm() which +# terminates at NUL characters being a decent C routine. +# collate_xfrm handles embedded NUL characters gracefully. +# 3) due to cmp and overload magic, lt le eq ge gt work also +# 4) the available locales depend on your operating system; +# try whether "locale -a" shows them or man pages for +# "locale" or "nlsinfo" work or the more direct +# approach "ls /usr/lib/nls/loc" or "ls /usr/lib/nls". +# Not all the locales that your vendor supports +# are necessarily installed: please consult your +# operating system's documentation. +# The locale names are probably something like +# 'xx_XX.(ISO)?8859-N' or 'xx_XX.(ISO)?8859N', +# for example 'fr_CH.ISO8859-1' is the Swiss (CH) +# variant of French (fr), ISO Latin (8859) 1 (-1) +# which is the Western European character set. +# +# Updated: 19961005 +# +# --- + +use POSIX qw(strxfrm LC_COLLATE); +use warnings::register; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT = qw(collate_xfrm setlocale LC_COLLATE); +our @EXPORT_OK = qw(); + +use overload qw( +fallback 1 +cmp collate_cmp +); + +our($LOCALE, $C); + +our $please_use_I18N_Collate_even_if_deprecated = 0; +sub new { + my $new = $_[1]; + + if (warnings::enabled() && $] >= 5.003_06) { + unless ($please_use_I18N_Collate_even_if_deprecated) { + warnings::warn <<___EOD___; +*** + + WARNING: starting from the Perl version 5.003_06 + the I18N::Collate interface for comparing 8-bit scalar data + according to the current locale + + HAS BEEN DEPRECATED + + That is, please do not use it anymore for any new applications + and please migrate the old applications away from it because its + functionality was integrated into the Perl core language in the + release 5.003_06. + + See the perllocale manual page for further information. + +*** +___EOD___ + $please_use_I18N_Collate_even_if_deprecated++; + } + } + + bless \$new; +} + +sub setlocale { + my ($category, $locale) = @_[0,1]; + + POSIX::setlocale($category, $locale) if (defined $category); + # the current $LOCALE + $LOCALE = $locale || $ENV{'LC_COLLATE'} || $ENV{'LC_ALL'} || ''; +} + +sub C { + my $s = ${$_[0]}; + + $C->{$LOCALE}->{$s} = collate_xfrm($s) + unless (defined $C->{$LOCALE}->{$s}); # cache when met + + $C->{$LOCALE}->{$s}; +} + +sub collate_xfrm { + my $s = $_[0]; + my $x = ''; + + for (split(/(\000+)/, $s)) { + $x .= (/^\000/) ? $_ : strxfrm("$_\000"); + } + + $x; +} + +sub collate_cmp { + &C($_[0]) cmp &C($_[1]); +} + +# init $LOCALE + +&I18N::Collate::setlocale(); + +1; # keep require happy + +require 5; +package I18N::LangTags::List; +# Time-stamp: "2004-10-06 23:26:21 ADT" +use strict; +our (%Name, %Is_Disrec, $Debug); +our $VERSION = '0.40'; +# POD at the end. + +#---------------------------------------------------------------------- +{ +# read the table out of our own POD! + my $seeking = 1; + my $count = 0; + my($disrec,$tag,$name); + my $last_name = ''; + while() { + if($seeking) { + $seeking = 0 if m/=for woohah/; + } elsif( ($disrec, $tag, $name) = + m/(\[?)\{([-0-9a-zA-Z]+)\}(?:\s*:)?\s*([^\[\]]+)/ + ) { + $name =~ s/\s*[;\.]*\s*$//g; + next unless $name; + ++$count; + print "<$tag> <$name>\n" if $Debug; + $last_name = $Name{$tag} = $name; + $Is_Disrec{$tag} = 1 if $disrec; + } elsif (m/[Ff]ormerly \"([-a-z0-9]+)\"/) { + $Name{$1} = "$last_name (old tag)" if $last_name; + $Is_Disrec{$1} = 1; + } + } + die "No tags read??" unless $count; +} +#---------------------------------------------------------------------- + +sub name { + my $tag = lc($_[0] || return); + $tag =~ s/^\s+//s; + $tag =~ s/\s+$//s; + + my $alt; + if($tag =~ m/^x-(.+)/) { + $alt = "i-$1"; + } elsif($tag =~ m/^i-(.+)/) { + $alt = "x-$1"; + } else { + $alt = ''; + } + + my $subform = ''; + my $name = ''; + print "Input: {$tag}\n" if $Debug; + while(length $tag) { + last if $name = $Name{$tag}; + last if $name = $Name{$alt}; + if($tag =~ s/(-[a-z0-9]+)$//s) { + print "Shaving off: $1 leaving $tag\n" if $Debug; + $subform = "$1$subform"; + # and loop around again + + $alt =~ s/(-[a-z0-9]+)$//s && $Debug && print " alt -> $alt\n"; + } else { + # we're trying to pull a subform off a primary tag. TILT! + print "Aborting on: {$name}{$subform}\n" if $Debug; + last; + } + } + print "Output: {$name}{$subform}\n" if $Debug; + + return unless $name; # Failure + return $name unless $subform; # Exact match + $subform =~ s/^-//s; + $subform =~ s/-$//s; + return "$name (Subform \"$subform\")"; +} + +#-------------------------------------------------------------------------- + +sub is_decent { + my $tag = lc($_[0] || return 0); + #require I18N::LangTags; + + return 0 unless + $tag =~ + /^(?: # First subtag + [xi] | [a-z]{2,3} + ) + (?: # Subtags thereafter + - # separator + [a-z0-9]{1,8} # subtag + )* + $/xs; + + my @supers = (); + foreach my $bit (split('-', $tag)) { + push @supers, + scalar(@supers) ? ($supers[-1] . '-' . $bit) : $bit; + } + return 0 unless @supers; + shift @supers if $supers[0] =~ m<^(i|x|sgn)$>s; + return 0 unless @supers; + + foreach my $f ($tag, @supers) { + return 0 if $Is_Disrec{$f}; + return 2 if $Name{$f}; + # so that decent subforms of indecent tags are decent + } + return 2 if $Name{$tag}; # not only is it decent, it's known! + return 1; +} + +#-------------------------------------------------------------------------- +1; + +__DATA__ + + + +# To generate a list of just the two and three-letter codes: + +#!/usr/local/bin/perl -w + +require 5; # Time-stamp: "2001-03-13 21:53:39 MST" + # Sean M. Burke, sburke@cpan.org + # This program is for generating the language_codes.txt file +use strict; +use LWP::Simple; +use HTML::TreeBuilder 3.10; +my $root = HTML::TreeBuilder->new(); +my $url = 'http://lcweb.loc.gov/standards/iso639-2/bibcodes.html'; +$root->parse(get($url) || die "Can't get $url"); +$root->eof(); + +my @codes; + +foreach my $tr ($root->find_by_tag_name('tr')) { + my @f = map $_->as_text(), $tr->content_list(); + #print map("<$_> ", @f), "\n"; + next unless @f == 5; + pop @f; # nix the French name + next if $f[-1] eq 'Language Name (English)'; # it's a header line + my $xx = splice(@f, 2,1); # pull out the two-letter code + $f[-1] =~ s/^\s+//; + $f[-1] =~ s/\s+$//; + if($xx =~ m/[a-zA-Z]/) { # there's a two-letter code for it + push @codes, [ lc($f[-1]), "$xx\t$f[-1]\n" ]; + } else { # print the three-letter codes. + if($f[0] eq $f[1]) { + push @codes, [ lc($f[-1]), "$f[1]\t$f[2]\n" ]; + } else { # shouldn't happen + push @codes, [ lc($f[-1]), "@f !!!!!!!!!!\n" ]; + } + } +} + +print map $_->[1], sort {; $a->[0] cmp $b->[0] } @codes; +print "[ based on $url\n at ", scalar(localtime), "]\n", + "[Note: doesn't include IANA-registered codes.]\n"; +exit; +__END__ + + +# Time-stamp: "2004-06-20 21:47:55 ADT" + +require 5; +package I18N::LangTags::Detect; +use strict; + +our ( $MATCH_SUPERS, $USING_LANGUAGE_TAGS, + $USE_LITERALS, $MATCH_SUPERS_TIGHTLY); + +BEGIN { unless(defined &DEBUG) { *DEBUG = sub () {0} } } + # define the constant 'DEBUG' at compile-time + +our $VERSION = "1.07"; +our @ISA = (); +use I18N::LangTags qw(alternate_language_tags locale2language_tag); + +sub _uniq { my %seen; return grep(!($seen{$_}++), @_); } +sub _normalize { + my(@languages) = + map lc($_), + grep $_, + map {; $_, alternate_language_tags($_) } @_; + return _uniq(@languages) if wantarray; + return $languages[0]; +} + +#--------------------------------------------------------------------------- +# The extent of our functional interface: + +sub detect () { return __PACKAGE__->ambient_langprefs; } + +#=========================================================================== + +sub ambient_langprefs { # always returns things untainted + my $base_class = $_[0]; + + return $base_class->http_accept_langs + if length( $ENV{'REQUEST_METHOD'} || '' ); # I'm a CGI + # it's off in its own routine because it's complicated + + # Not running as a CGI: try to puzzle out from the environment + my @languages; + + foreach my $envname (qw( LANGUAGE LC_ALL LC_MESSAGES LANG )) { + next unless $ENV{$envname}; + DEBUG and print "Noting \$$envname: $ENV{$envname}\n"; + push @languages, + map locale2language_tag($_), + # if it's a lg tag, fine, pass thru (untainted) + # if it's a locale ID, try converting to a lg tag (untainted), + # otherwise nix it. + + split m/[,:]/, + $ENV{$envname} + ; + last; # first one wins + } + + if($ENV{'IGNORE_WIN32_LOCALE'}) { + # no-op + } elsif(&_try_use('Win32::Locale')) { + # If we have that module installed... + push @languages, Win32::Locale::get_language() || '' + if defined &Win32::Locale::get_language; + } + return _normalize @languages; +} + +#--------------------------------------------------------------------------- + +sub http_accept_langs { + # Deal with HTTP "Accept-Language:" stuff. Hassle. + # This code is more lenient than RFC 3282, which you must read. + # Hm. Should I just move this into I18N::LangTags at some point? + no integer; + + my $in = (@_ > 1) ? $_[1] : $ENV{'HTTP_ACCEPT_LANGUAGE'}; + # (always ends up untainting) + + return() unless defined $in and length $in; + + $in =~ s/\([^\)]*\)//g; # nix just about any comment + + if( $in =~ m/^\s*([a-zA-Z][-a-zA-Z]+)\s*$/s ) { + # Very common case: just one language tag + return _normalize $1; + } elsif( $in =~ m/^\s*[a-zA-Z][-a-zA-Z]+(?:\s*,\s*[a-zA-Z][-a-zA-Z]+)*\s*$/s ) { + # Common case these days: just "foo, bar, baz" + return _normalize( $in =~ m/([a-zA-Z][-a-zA-Z]+)/g ); + } + + # Else it's complicated... + + $in =~ s/\s+//g; # Yes, we can just do without the WS! + my @in = $in =~ m/([^,]+)/g; + my %pref; + + my $q; + foreach my $tag (@in) { + next unless $tag =~ + m/^([a-zA-Z][-a-zA-Z]+) + (?: + ;q= + ( + \d* # a bit too broad of a RE, but so what. + (?: + \.\d+ + )? + ) + )? + $ + /sx + ; + $q = (defined $2 and length $2) ? $2 : 1; + #print "$1 with q=$q\n"; + push @{ $pref{$q} }, lc $1; + } + + return _normalize( + # Read off %pref, in descending key order... + map @{$pref{$_}}, + sort {$b <=> $a} + keys %pref + ); +} + +#=========================================================================== + +my %tried = (); + # memoization of whether we've used this module, or found it unusable. + +sub _try_use { # Basically a wrapper around "require Modulename" + # "Many men have tried..." "They tried and failed?" "They tried and died." + return $tried{$_[0]} if exists $tried{$_[0]}; # memoization + + my $module = $_[0]; # ASSUME sane module name! + { no strict 'refs'; + no warnings 'once'; + return($tried{$module} = 1) + if %{$module . "::Lexicon"} or @{$module . "::ISA"}; + # weird case: we never use'd it, but there it is! + } + + print " About to use $module ...\n" if DEBUG; + { + local $SIG{'__DIE__'}; + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + eval "require $module"; # used to be "use $module", but no point in that. + } + if($@) { + print "Error using $module \: $@\n" if DEBUG > 1; + return $tried{$module} = 0; + } else { + print " OK, $module is used\n" if DEBUG; + return $tried{$module} = 1; + } +} + +#--------------------------------------------------------------------------- +1; +__END__ + + + +# a tip: Put a bit of chopped up pickled ginger in your salad. It's tasty! +# Pod::PlainText -- Convert POD data to formatted ASCII text. +# $Id: Text.pm,v 2.1 1999/09/20 11:53:33 eagle Exp $ +# +# Copyright 1999-2000 by Russ Allbery +# +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This module is intended to be a replacement for Pod::Text, and attempts to +# match its output except for some specific circumstances where other +# decisions seemed to produce better output. It uses Pod::Parser and is +# designed to be very easy to subclass. + +############################################################################ +# Modules and declarations +############################################################################ + +package Pod::PlainText; +use strict; + +require 5.005; + +use Carp qw(carp croak); +use Pod::Select (); + +use vars qw(@ISA %ESCAPES $VERSION); + +# We inherit from Pod::Select instead of Pod::Parser so that we can be used +# by Pod::Usage. +@ISA = qw(Pod::Select); + +$VERSION = '2.07'; + +BEGIN { + if ($] < 5.006) { + require Symbol; + import Symbol; + } +} + +############################################################################ +# Table of supported E<> escapes +############################################################################ + +# This table is taken near verbatim from Pod::PlainText in Pod::Parser, +# which got it near verbatim from the original Pod::Text. It is therefore +# credited to Tom Christiansen, and I'm glad I didn't have to write it. :) +%ESCAPES = ( + 'amp' => '&', # ampersand + 'lt' => '<', # left chevron, less-than + 'gt' => '>', # right chevron, greater-than + 'quot' => '"', # double quote + + "Aacute" => "\xC1", # capital A, acute accent + "aacute" => "\xE1", # small a, acute accent + "Acirc" => "\xC2", # capital A, circumflex accent + "acirc" => "\xE2", # small a, circumflex accent + "AElig" => "\xC6", # capital AE diphthong (ligature) + "aelig" => "\xE6", # small ae diphthong (ligature) + "Agrave" => "\xC0", # capital A, grave accent + "agrave" => "\xE0", # small a, grave accent + "Aring" => "\xC5", # capital A, ring + "aring" => "\xE5", # small a, ring + "Atilde" => "\xC3", # capital A, tilde + "atilde" => "\xE3", # small a, tilde + "Auml" => "\xC4", # capital A, dieresis or umlaut mark + "auml" => "\xE4", # small a, dieresis or umlaut mark + "Ccedil" => "\xC7", # capital C, cedilla + "ccedil" => "\xE7", # small c, cedilla + "Eacute" => "\xC9", # capital E, acute accent + "eacute" => "\xE9", # small e, acute accent + "Ecirc" => "\xCA", # capital E, circumflex accent + "ecirc" => "\xEA", # small e, circumflex accent + "Egrave" => "\xC8", # capital E, grave accent + "egrave" => "\xE8", # small e, grave accent + "ETH" => "\xD0", # capital Eth, Icelandic + "eth" => "\xF0", # small eth, Icelandic + "Euml" => "\xCB", # capital E, dieresis or umlaut mark + "euml" => "\xEB", # small e, dieresis or umlaut mark + "Iacute" => "\xCD", # capital I, acute accent + "iacute" => "\xED", # small i, acute accent + "Icirc" => "\xCE", # capital I, circumflex accent + "icirc" => "\xEE", # small i, circumflex accent + "Igrave" => "\xCD", # capital I, grave accent + "igrave" => "\xED", # small i, grave accent + "Iuml" => "\xCF", # capital I, dieresis or umlaut mark + "iuml" => "\xEF", # small i, dieresis or umlaut mark + "Ntilde" => "\xD1", # capital N, tilde + "ntilde" => "\xF1", # small n, tilde + "Oacute" => "\xD3", # capital O, acute accent + "oacute" => "\xF3", # small o, acute accent + "Ocirc" => "\xD4", # capital O, circumflex accent + "ocirc" => "\xF4", # small o, circumflex accent + "Ograve" => "\xD2", # capital O, grave accent + "ograve" => "\xF2", # small o, grave accent + "Oslash" => "\xD8", # capital O, slash + "oslash" => "\xF8", # small o, slash + "Otilde" => "\xD5", # capital O, tilde + "otilde" => "\xF5", # small o, tilde + "Ouml" => "\xD6", # capital O, dieresis or umlaut mark + "ouml" => "\xF6", # small o, dieresis or umlaut mark + "szlig" => "\xDF", # small sharp s, German (sz ligature) + "THORN" => "\xDE", # capital THORN, Icelandic + "thorn" => "\xFE", # small thorn, Icelandic + "Uacute" => "\xDA", # capital U, acute accent + "uacute" => "\xFA", # small u, acute accent + "Ucirc" => "\xDB", # capital U, circumflex accent + "ucirc" => "\xFB", # small u, circumflex accent + "Ugrave" => "\xD9", # capital U, grave accent + "ugrave" => "\xF9", # small u, grave accent + "Uuml" => "\xDC", # capital U, dieresis or umlaut mark + "uuml" => "\xFC", # small u, dieresis or umlaut mark + "Yacute" => "\xDD", # capital Y, acute accent + "yacute" => "\xFD", # small y, acute accent + "yuml" => "\xFF", # small y, dieresis or umlaut mark + + "lchevron" => "\xAB", # left chevron (double less than) + "rchevron" => "\xBB", # right chevron (double greater than) +); + + +############################################################################ +# Initialization +############################################################################ + +# Initialize the object. Must be sure to call our parent initializer. +sub initialize { + my $self = shift; + + $$self{alt} = 0 unless defined $$self{alt}; + $$self{indent} = 4 unless defined $$self{indent}; + $$self{loose} = 0 unless defined $$self{loose}; + $$self{sentence} = 0 unless defined $$self{sentence}; + $$self{width} = 76 unless defined $$self{width}; + + $$self{INDENTS} = []; # Stack of indentations. + $$self{MARGIN} = $$self{indent}; # Current left margin in spaces. + + return $self->SUPER::initialize; +} + + +############################################################################ +# Core overrides +############################################################################ + +# Called for each command paragraph. Gets the command, the associated +# paragraph, the line number, and a Pod::Paragraph object. Just dispatches +# the command to a method named the same as the command. =cut is handled +# internally by Pod::Parser. +sub command { + my $self = shift; + my $command = shift; + return if $command eq 'pod'; + return if ($$self{EXCLUDE} && $command ne 'end'); + if (defined $$self{ITEM}) { + $self->item ("\n"); + local $_ = "\n"; + $self->output($_) if($command eq 'back'); + } + $command = 'cmd_' . $command; + return $self->$command (@_); +} + +# Called for a verbatim paragraph. Gets the paragraph, the line number, and +# a Pod::Paragraph object. Just output it verbatim, but with tabs converted +# to spaces. +sub verbatim { + my $self = shift; + return if $$self{EXCLUDE}; + $self->item if defined $$self{ITEM}; + local $_ = shift; + return if /^\s*$/; + s/^(\s*\S+)/(' ' x $$self{MARGIN}) . $1/gme; + return $self->output($_); +} + +# Called for a regular text block. Gets the paragraph, the line number, and +# a Pod::Paragraph object. Perform interpolation and output the results. +sub textblock { + my $self = shift; + return if $$self{EXCLUDE}; + if($$self{VERBATIM}) { + $self->output($_[0]); + return; + } + local $_ = shift; + my $line = shift; + + # Perform a little magic to collapse multiple L<> references. This is + # here mostly for backwards-compatibility. We'll just rewrite the whole + # thing into actual text at this part, bypassing the whole internal + # sequence parsing thing. + s{ + ( + L< # A link of the form L. + / + ( + [:\w]+ # The item has to be a simple word... + (\(\))? # ...or simple function. + ) + > + ( + ,?\s+(and\s+)? # Allow lots of them, conjuncted. + L< + / + ( + [:\w]+ + (\(\))? + ) + > + )+ + ) + } { + local $_ = $1; + s%L]+)>%$1%g; + my @items = split /(?:,?\s+(?:and\s+)?)/; + my $string = "the "; + my $i; + for ($i = 0; $i < @items; $i++) { + $string .= $items[$i]; + $string .= ", " if @items > 2 && $i != $#items; + $string .= " and " if ($i == $#items - 1); + } + $string .= " entries elsewhere in this document"; + $string; + }gex; + + # Now actually interpolate and output the paragraph. + $_ = $self->interpolate ($_, $line); + s/\s*$/\n/s; + if (defined $$self{ITEM}) { + $self->item ($_ . "\n"); + } else { + $self->output ($self->reformat ($_ . "\n")); + } +} + +# Called for an interior sequence. Gets the command, argument, and a +# Pod::InteriorSequence object and is expected to return the resulting text. +# Calls code, bold, italic, file, and link to handle those types of +# sequences, and handles S<>, E<>, X<>, and Z<> directly. +sub interior_sequence { + my $self = shift; + my $command = shift; + local $_ = shift; + return '' if ($command eq 'X' || $command eq 'Z'); + + # Expand escapes into the actual character now, carping if invalid. + if ($command eq 'E') { + return $ESCAPES{$_} if defined $ESCAPES{$_}; + carp "Unknown escape: E<$_>"; + return "E<$_>"; + } + + # For all the other sequences, empty content produces no output. + return if $_ eq ''; + + # For S<>, compress all internal whitespace and then map spaces to \01. + # When we output the text, we'll map this back. + if ($command eq 'S') { + s/\s{2,}/ /g; + tr/ /\01/; + return $_; + } + + # Anything else needs to get dispatched to another method. + if ($command eq 'B') { return $self->seq_b ($_) } + elsif ($command eq 'C') { return $self->seq_c ($_) } + elsif ($command eq 'F') { return $self->seq_f ($_) } + elsif ($command eq 'I') { return $self->seq_i ($_) } + elsif ($command eq 'L') { return $self->seq_l ($_) } + else { carp "Unknown sequence $command<$_>" } +} + +# Called for each paragraph that's actually part of the POD. We take +# advantage of this opportunity to untabify the input. +sub preprocess_paragraph { + my $self = shift; + local $_ = shift; + 1 while s/^(.*?)(\t+)/$1 . ' ' x (length ($2) * 8 - length ($1) % 8)/me; + return $_; +} + + +############################################################################ +# Command paragraphs +############################################################################ + +# All command paragraphs take the paragraph and the line number. + +# First level heading. +sub cmd_head1 { + my $self = shift; + local $_ = shift; + s/\s+$//s; + $_ = $self->interpolate ($_, shift); + if ($$self{alt}) { + $self->output ("\n==== $_ ====\n\n"); + } else { + $_ .= "\n" if $$self{loose}; + $self->output ($_ . "\n"); + } +} + +# Second level heading. +sub cmd_head2 { + my $self = shift; + local $_ = shift; + s/\s+$//s; + $_ = $self->interpolate ($_, shift); + if ($$self{alt}) { + $self->output ("\n== $_ ==\n\n"); + } else { + $_ .= "\n" if $$self{loose}; + $self->output (' ' x ($$self{indent} / 2) . $_ . "\n"); + } +} + +# third level heading - not strictly perlpodspec compliant +sub cmd_head3 { + my $self = shift; + local $_ = shift; + s/\s+$//s; + $_ = $self->interpolate ($_, shift); + if ($$self{alt}) { + $self->output ("\n= $_ =\n"); + } else { + $_ .= "\n" if $$self{loose}; + $self->output (' ' x ($$self{indent}) . $_ . "\n"); + } +} + +# fourth level heading - not strictly perlpodspec compliant +# just like head3 +*cmd_head4 = \&cmd_head3; + +# Start a list. +sub cmd_over { + my $self = shift; + local $_ = shift; + unless (/^[-+]?\d+\s+$/) { $_ = $$self{indent} } + push (@{ $$self{INDENTS} }, $$self{MARGIN}); + $$self{MARGIN} += ($_ + 0); +} + +# End a list. +sub cmd_back { + my $self = shift; + $$self{MARGIN} = pop @{ $$self{INDENTS} }; + unless (defined $$self{MARGIN}) { + carp 'Unmatched =back'; + $$self{MARGIN} = $$self{indent}; + } +} + +# An individual list item. +sub cmd_item { + my $self = shift; + if (defined $$self{ITEM}) { $self->item } + local $_ = shift; + s/\s+$//s; + $$self{ITEM} = $self->interpolate ($_); +} + +# Begin a block for a particular translator. Setting VERBATIM triggers +# special handling in textblock(). +sub cmd_begin { + my $self = shift; + local $_ = shift; + my ($kind) = /^(\S+)/ or return; + if ($kind eq 'text') { + $$self{VERBATIM} = 1; + } else { + $$self{EXCLUDE} = 1; + } +} + +# End a block for a particular translator. We assume that all =begin/=end +# pairs are properly closed. +sub cmd_end { + my $self = shift; + $$self{EXCLUDE} = 0; + $$self{VERBATIM} = 0; +} + +# One paragraph for a particular translator. Ignore it unless it's intended +# for text, in which case we treat it as a verbatim text block. +sub cmd_for { + my $self = shift; + local $_ = shift; + my $line = shift; + return unless s/^text\b[ \t]*\r?\n?//; + $self->verbatim ($_, $line); +} + +# just a dummy method for the time being +sub cmd_encoding { + return; +} + +############################################################################ +# Interior sequences +############################################################################ + +# The simple formatting ones. These are here mostly so that subclasses can +# override them and do more complicated things. +sub seq_b { return $_[0]{alt} ? "``$_[1]''" : $_[1] } +sub seq_c { return $_[0]{alt} ? "``$_[1]''" : "`$_[1]'" } +sub seq_f { return $_[0]{alt} ? "\"$_[1]\"" : $_[1] } +sub seq_i { return '*' . $_[1] . '*' } + +# The complicated one. Handle links. Since this is plain text, we can't +# actually make any real links, so this is all to figure out what text we +# print out. +sub seq_l { + my $self = shift; + local $_ = shift; + + # Smash whitespace in case we were split across multiple lines. + s/\s+/ /g; + + # If we were given any explicit text, just output it. + if (/^([^|]+)\|/) { return $1 } + + # Okay, leading and trailing whitespace isn't important; get rid of it. + s/^\s+//; + s/\s+$//; + + # Default to using the whole content of the link entry as a section + # name. Note that L forces a manpage interpretation, as does + # something looking like L. The latter is an + # enhancement over the original Pod::Text. + my ($manpage, $section) = ('', $_); + if (/^(?:https?|ftp|news):/) { + # a URL + return $_; + } elsif (/^"\s*(.*?)\s*"$/) { + $section = '"' . $1 . '"'; + } elsif (m/^[-:.\w]+(?:\(\S+\))?$/) { + ($manpage, $section) = ($_, ''); + } elsif (m{/}) { + ($manpage, $section) = split (/\s*\/\s*/, $_, 2); + } + + my $text = ''; + # Now build the actual output text. + if (!length $section) { + $text = "the $manpage manpage" if length $manpage; + } elsif ($section =~ /^[:\w]+(?:\(\))?/) { + $text .= 'the ' . $section . ' entry'; + $text .= (length $manpage) ? " in the $manpage manpage" + : ' elsewhere in this document'; + } else { + $section =~ s/^\"\s*//; + $section =~ s/\s*\"$//; + $text .= 'the section on "' . $section . '"'; + $text .= " in the $manpage manpage" if length $manpage; + } + return $text; +} + + +############################################################################ +# List handling +############################################################################ + +# This method is called whenever an =item command is complete (in other +# words, we've seen its associated paragraph or know for certain that it +# doesn't have one). It gets the paragraph associated with the item as an +# argument. If that argument is empty, just output the item tag; if it +# contains a newline, output the item tag followed by the newline. +# Otherwise, see if there's enough room for us to output the item tag in the +# margin of the text or if we have to put it on a separate line. +sub item { + my $self = shift; + local $_ = shift; + my $tag = $$self{ITEM}; + unless (defined $tag) { + carp 'item called without tag'; + return; + } + undef $$self{ITEM}; + my $indent = $$self{INDENTS}[-1]; + unless (defined $indent) { $indent = $$self{indent} } + my $space = ' ' x $indent; + $space =~ s/^ /:/ if $$self{alt}; + if (!$_ || /^\s+$/ || ($$self{MARGIN} - $indent < length ($tag) + 1)) { + my $margin = $$self{MARGIN}; + $$self{MARGIN} = $indent; + my $output = $self->reformat ($tag); + $output =~ s/[\r\n]*$/\n/; + $self->output ($output); + $$self{MARGIN} = $margin; + $self->output ($self->reformat ($_)) if /\S/; + } else { + $_ = $self->reformat ($_); + s/^ /:/ if ($$self{alt} && $indent > 0); + my $tagspace = ' ' x length $tag; + s/^($space)$tagspace/$1$tag/ or carp 'Bizarre space in item'; + $self->output ($_); + } +} + + +############################################################################ +# Output formatting +############################################################################ + +# Wrap a line, indenting by the current left margin. We can't use +# Text::Wrap because it plays games with tabs. We can't use formline, even +# though we'd really like to, because it screws up non-printing characters. +# So we have to do the wrapping ourselves. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{width} - $$self{MARGIN}; + while (length > $width) { + if (s/^([^\r\n]{0,$width})\s+// || s/^([^\r\n]{$width})//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + return $output; +} + +# Reformat a paragraph of text for the current margin. Takes the text to +# reformat and returns the formatted text. +sub reformat { + my $self = shift; + local $_ = shift; + + # If we're trying to preserve two spaces after sentences, do some + # munging to support that. Otherwise, smash all repeated whitespace. + if ($$self{sentence}) { + s/ +$//mg; + s/\.\r?\n/. \n/g; + s/[\r\n]+/ /g; + s/ +/ /g; + } else { + s/\s+/ /g; + } + return $self->wrap($_); +} + +# Output text to the output device. +sub output { $_[1] =~ tr/\01/ /; print { $_[0]->output_handle } $_[1] } + + +############################################################################ +# Backwards compatibility +############################################################################ + +# The old Pod::Text module did everything in a pod2text() function. This +# tries to provide the same interface for legacy applications. +sub pod2text { + my @args; + + # This is really ugly; I hate doing option parsing in the middle of a + # module. But the old Pod::Text module supported passing flags to its + # entry function, so handle -a and -. + while ($_[0] =~ /^-/) { + my $flag = shift; + if ($flag eq '-a') { push (@args, alt => 1) } + elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) } + else { + unshift (@_, $flag); + last; + } + } + + # Now that we know what arguments we're using, create the parser. + my $parser = Pod::PlainText->new (@args); + + # If two arguments were given, the second argument is going to be a file + # handle. That means we want to call parse_from_filehandle(), which + # means we need to turn the first argument into a file handle. Magic + # open will handle the <&STDIN case automagically. + if (defined $_[1]) { + my $infh; + if ($] < 5.006) { + $infh = gensym(); + } + unless (open ($infh, $_[0])) { + croak ("Can't open $_[0] for reading: $!\n"); + } + $_[0] = $infh; + return $parser->parse_from_filehandle (@_); + } else { + return $parser->parse_from_file (@_); + } +} + + +############################################################################ +# Module return value and documentation +############################################################################ + +1; +__END__ + +# Pod::ParseLink -- Parse an L<> formatting code in POD text. +# +# Copyright 2001, 2008, 2009, 2014 by Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# This module implements parsing of the text of an L<> formatting code as +# defined in perlpodspec. It should be suitable for any POD formatter. It +# exports only one function, parselink(), which returns the five-item parse +# defined in perlpodspec. +# +# Perl core hackers, please note that this module is also separately +# maintained outside of the Perl core as part of the podlators. Please send +# me any patches at the address above in addition to sending them to the +# standard Perl mailing lists. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::ParseLink; + +use 5.006; +use strict; +use warnings; + +use vars qw(@EXPORT @ISA $VERSION); + +use Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(parselink); + +$VERSION = '4.10'; + +############################################################################## +# Implementation +############################################################################## + +# Parse the name and section portion of a link into a name and section. +sub _parse_section { + my ($link) = @_; + $link =~ s/^\s+//; + $link =~ s/\s+$//; + + # If the whole link is enclosed in quotes, interpret it all as a section + # even if it contains a slash. + return (undef, $1) if ($link =~ /^"\s*(.*?)\s*"$/); + + # Split into page and section on slash, and then clean up quoting in the + # section. If there is no section and the name contains spaces, also + # guess that it's an old section link. + my ($page, $section) = split (/\s*\/\s*/, $link, 2); + $section =~ s/^"\s*(.*?)\s*"$/$1/ if $section; + if ($page && $page =~ / / && !defined ($section)) { + $section = $page; + $page = undef; + } else { + $page = undef unless $page; + $section = undef unless $section; + } + return ($page, $section); +} + +# Infer link text from the page and section. +sub _infer_text { + my ($page, $section) = @_; + my $inferred; + if ($page && !$section) { + $inferred = $page; + } elsif (!$page && $section) { + $inferred = '"' . $section . '"'; + } elsif ($page && $section) { + $inferred = '"' . $section . '" in ' . $page; + } + return $inferred; +} + +# Given the contents of an L<> formatting code, parse it into the link text, +# the possibly inferred link text, the name or URL, the section, and the type +# of link (pod, man, or url). +sub parselink { + my ($link) = @_; + $link =~ s/\s+/ /g; + my $text; + if ($link =~ /\|/) { + ($text, $link) = split (/\|/, $link, 2); + } + if ($link =~ /\A\w+:[^:\s]\S*\Z/) { + my $inferred; + if (defined ($text) && length ($text) > 0) { + return ($text, $text, $link, undef, 'url'); + } else { + return ($text, $link, $link, undef, 'url'); + } + } else { + my ($name, $section) = _parse_section ($link); + my $inferred; + if (defined ($text) && length ($text) > 0) { + $inferred = $text; + } else { + $inferred = _infer_text ($name, $section); + } + my $type = ($name && $name =~ /\(\S*\)/) ? 'man' : 'pod'; + return ($text, $inferred, $name, $section, $type); + } +} + +############################################################################## +# Module return value and documentation +############################################################################## + +# Ensure we evaluate to true. +1; +__END__ + +# Convert POD data to formatted text. +# +# This module converts POD to formatted text. It replaces the old Pod::Text +# module that came with versions of Perl prior to 5.6.0 and attempts to match +# its output except for some specific circumstances where other decisions +# seemed to produce better output. It uses Pod::Parser and is designed to be +# very easy to subclass. +# +# Perl core hackers, please note that this module is also separately +# maintained outside of the Perl core as part of the podlators. Please send +# me any patches at the address above in addition to sending them to the +# standard Perl mailing lists. +# +# Copyright 1999, 2000, 2001, 2002, 2004, 2006, 2008, 2009, 2012, 2013, 2014, +# 2015, 2016 Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text; + +use 5.006; +use strict; +use warnings; + +use vars qw(@ISA @EXPORT %ESCAPES $VERSION); + +use Carp qw(carp croak); +use Encode qw(encode); +use Exporter (); +use Pod::Simple (); + +@ISA = qw(Pod::Simple Exporter); + +# We have to export pod2text for backward compatibility. +@EXPORT = qw(pod2text); + +$VERSION = '4.10'; + +# Ensure that $Pod::Simple::nbsp and $Pod::Simple::shy are available. Code +# taken from Pod::Simple 3.32, but was only added in 3.30. +my ($NBSP, $SHY); +if ($Pod::Simple::VERSION ge 3.30) { + $NBSP = $Pod::Simple::nbsp; + $SHY = $Pod::Simple::shy; +} else { + if ($] ge 5.007_003) { + $NBSP = chr utf8::unicode_to_native(0xA0); + $SHY = chr utf8::unicode_to_native(0xAD); + } elsif (Pod::Simple::ASCII) { + $NBSP = "\xA0"; + $SHY = "\xAD"; + } else { + $NBSP = "\x41"; + $SHY = "\xCA"; + } +} + +############################################################################## +# Initialization +############################################################################## + +# This function handles code blocks. It's registered as a callback to +# Pod::Simple and therefore doesn't work as a regular method call, but all it +# does is call output_code with the line. +sub handle_code { + my ($line, $number, $parser) = @_; + $parser->output_code ($line . "\n"); +} + +# Initialize the object and set various Pod::Simple options that we need. +# Here, we also process any additional options passed to the constructor or +# set up defaults if none were given. Note that all internal object keys are +# in all-caps, reserving all lower-case object keys for Pod::Simple and user +# arguments. +sub new { + my $class = shift; + my $self = $class->SUPER::new; + + # Tell Pod::Simple to handle S<> by automatically inserting  . + $self->nbsp_for_S (1); + + # Tell Pod::Simple to keep whitespace whenever possible. + if ($self->can ('preserve_whitespace')) { + $self->preserve_whitespace (1); + } else { + $self->fullstop_space_harden (1); + } + + # The =for and =begin targets that we accept. + $self->accept_targets (qw/text TEXT/); + + # Ensure that contiguous blocks of code are merged together. Otherwise, + # some of the guesswork heuristics don't work right. + $self->merge_text (1); + + # Pod::Simple doesn't do anything useful with our arguments, but we want + # to put them in our object as hash keys and values. This could cause + # problems if we ever clash with Pod::Simple's own internal class + # variables. + my %opts = @_; + my @opts = map { ("opt_$_", $opts{$_}) } keys %opts; + %$self = (%$self, @opts); + + # Send errors to stderr if requested. + if ($$self{opt_stderr} and not $$self{opt_errors}) { + $$self{opt_errors} = 'stderr'; + } + delete $$self{opt_stderr}; + + # Validate the errors parameter and act on it. + if (not defined $$self{opt_errors}) { + $$self{opt_errors} = 'pod'; + } + if ($$self{opt_errors} eq 'stderr' || $$self{opt_errors} eq 'die') { + $self->no_errata_section (1); + $self->complain_stderr (1); + if ($$self{opt_errors} eq 'die') { + $$self{complain_die} = 1; + } + } elsif ($$self{opt_errors} eq 'pod') { + $self->no_errata_section (0); + $self->complain_stderr (0); + } elsif ($$self{opt_errors} eq 'none') { + $self->no_whining (1); + } else { + croak (qq(Invalid errors setting: "$$self{errors}")); + } + delete $$self{errors}; + + # Initialize various things from our parameters. + $$self{opt_alt} = 0 unless defined $$self{opt_alt}; + $$self{opt_indent} = 4 unless defined $$self{opt_indent}; + $$self{opt_margin} = 0 unless defined $$self{opt_margin}; + $$self{opt_loose} = 0 unless defined $$self{opt_loose}; + $$self{opt_sentence} = 0 unless defined $$self{opt_sentence}; + $$self{opt_width} = 76 unless defined $$self{opt_width}; + + # Figure out what quotes we'll be using for C<> text. + $$self{opt_quotes} ||= '"'; + if ($$self{opt_quotes} eq 'none') { + $$self{LQUOTE} = $$self{RQUOTE} = ''; + } elsif (length ($$self{opt_quotes}) == 1) { + $$self{LQUOTE} = $$self{RQUOTE} = $$self{opt_quotes}; + } elsif (length ($$self{opt_quotes}) % 2 == 0) { + my $length = length ($$self{opt_quotes}) / 2; + $$self{LQUOTE} = substr ($$self{opt_quotes}, 0, $length); + $$self{RQUOTE} = substr ($$self{opt_quotes}, $length); + } else { + croak qq(Invalid quote specification "$$self{opt_quotes}"); + } + + # If requested, do something with the non-POD text. + $self->code_handler (\&handle_code) if $$self{opt_code}; + + # Return the created object. + return $self; +} + +############################################################################## +# Core parsing +############################################################################## + +# This is the glue that connects the code below with Pod::Simple itself. The +# goal is to convert the event stream coming from the POD parser into method +# calls to handlers once the complete content of a tag has been seen. Each +# paragraph or POD command will have textual content associated with it, and +# as soon as all of a paragraph or POD command has been seen, that content +# will be passed in to the corresponding method for handling that type of +# object. The exceptions are handlers for lists, which have opening tag +# handlers and closing tag handlers that will be called right away. +# +# The internal hash key PENDING is used to store the contents of a tag until +# all of it has been seen. It holds a stack of open tags, each one +# represented by a tuple of the attributes hash for the tag and the contents +# of the tag. + +# Add a block of text to the contents of the current node, formatting it +# according to the current formatting instructions as we do. +sub _handle_text { + my ($self, $text) = @_; + my $tag = $$self{PENDING}[-1]; + $$tag[1] .= $text; +} + +# Given an element name, get the corresponding method name. +sub method_for_element { + my ($self, $element) = @_; + $element =~ tr/-/_/; + $element =~ tr/A-Z/a-z/; + $element =~ tr/_a-z0-9//cd; + return $element; +} + +# Handle the start of a new element. If cmd_element is defined, assume that +# we need to collect the entire tree for this element before passing it to the +# element method, and create a new tree into which we'll collect blocks of +# text and nested elements. Otherwise, if start_element is defined, call it. +sub _handle_element_start { + my ($self, $element, $attrs) = @_; + my $method = $self->method_for_element ($element); + + # If we have a command handler, we need to accumulate the contents of the + # tag before calling it. + if ($self->can ("cmd_$method")) { + push (@{ $$self{PENDING} }, [ $attrs, '' ]); + } elsif ($self->can ("start_$method")) { + my $method = 'start_' . $method; + $self->$method ($attrs, ''); + } +} + +# Handle the end of an element. If we had a cmd_ method for this element, +# this is where we pass along the text that we've accumulated. Otherwise, if +# we have an end_ method for the element, call that. +sub _handle_element_end { + my ($self, $element) = @_; + my $method = $self->method_for_element ($element); + + # If we have a command handler, pull off the pending text and pass it to + # the handler along with the saved attribute hash. + if ($self->can ("cmd_$method")) { + my $tag = pop @{ $$self{PENDING} }; + my $method = 'cmd_' . $method; + my $text = $self->$method (@$tag); + if (defined $text) { + if (@{ $$self{PENDING} } > 1) { + $$self{PENDING}[-1][1] .= $text; + } else { + $self->output ($text); + } + } + } elsif ($self->can ("end_$method")) { + my $method = 'end_' . $method; + $self->$method (); + } +} + +############################################################################## +# Output formatting +############################################################################## + +# Wrap a line, indenting by the current left margin. We can't use Text::Wrap +# because it plays games with tabs. We can't use formline, even though we'd +# really like to, because it screws up non-printing characters. So we have to +# do the wrapping ourselves. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{opt_width} - $$self{MARGIN}; + while (length > $width) { + if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + return $output; +} + +# Reformat a paragraph of text for the current margin. Takes the text to +# reformat and returns the formatted text. +sub reformat { + my $self = shift; + local $_ = shift; + + # If we're trying to preserve two spaces after sentences, do some munging + # to support that. Otherwise, smash all repeated whitespace. + if ($$self{opt_sentence}) { + s/ +$//mg; + s/\.\n/. \n/g; + s/\n/ /g; + s/ +/ /g; + } else { + s/\s+/ /g; + } + return $self->wrap ($_); +} + +# Output text to the output device. Replace non-breaking spaces with spaces +# and soft hyphens with nothing, and then try to fix the output encoding if +# necessary to match the input encoding unless UTF-8 output is forced. This +# preserves the traditional pass-through behavior of Pod::Text. +sub output { + my ($self, @text) = @_; + my $text = join ('', @text); + if ($NBSP) { + $text =~ s/$NBSP/ /g; + } + if ($SHY) { + $text =~ s/$SHY//g; + } + unless ($$self{opt_utf8}) { + my $encoding = $$self{encoding} || ''; + if ($encoding && $encoding ne $$self{ENCODING}) { + $$self{ENCODING} = $encoding; + eval { binmode ($$self{output_fh}, ":encoding($encoding)") }; + } + } + if ($$self{ENCODE}) { + print { $$self{output_fh} } encode ('UTF-8', $text); + } else { + print { $$self{output_fh} } $text; + } +} + +# Output a block of code (something that isn't part of the POD text). Called +# by preprocess_paragraph only if we were given the code option. Exists here +# only so that it can be overridden by subclasses. +sub output_code { $_[0]->output ($_[1]) } + +############################################################################## +# Document initialization +############################################################################## + +# Set up various things that have to be initialized on a per-document basis. +sub start_document { + my ($self, $attrs) = @_; + if ($$attrs{contentless} && !$$self{ALWAYS_EMIT_SOMETHING}) { + $$self{CONTENTLESS} = 1; + } else { + delete $$self{CONTENTLESS}; + } + my $margin = $$self{opt_indent} + $$self{opt_margin}; + + # Initialize a few per-document variables. + $$self{INDENTS} = []; # Stack of indentations. + $$self{MARGIN} = $margin; # Default left margin. + $$self{PENDING} = [[]]; # Pending output. + + # We have to redo encoding handling for each document. + $$self{ENCODING} = ''; + + # When UTF-8 output is set, check whether our output file handle already + # has a PerlIO encoding layer set. If it does not, we'll need to encode + # our output before printing it (handled in the output() sub). Wrap the + # check in an eval to handle versions of Perl without PerlIO. + $$self{ENCODE} = 0; + if ($$self{opt_utf8}) { + $$self{ENCODE} = 1; + eval { + my @options = (output => 1, details => 1); + my $flag = (PerlIO::get_layers ($$self{output_fh}, @options))[-1]; + if ($flag & PerlIO::F_UTF8 ()) { + $$self{ENCODE} = 0; + $$self{ENCODING} = 'UTF-8'; + } + }; + } + + return ''; +} + +# Handle the end of the document. The only thing we do is handle dying on POD +# errors, since Pod::Parser currently doesn't. +sub end_document { + my ($self) = @_; + if ($$self{complain_die} && $self->errors_seen) { + croak ("POD document had syntax errors"); + } +} + +############################################################################## +# Text blocks +############################################################################## + +# Intended for subclasses to override, this method returns text with any +# non-printing formatting codes stripped out so that length() correctly +# returns the length of the text. For basic Pod::Text, it does nothing. +sub strip_format { + my ($self, $string) = @_; + return $string; +} + +# This method is called whenever an =item command is complete (in other words, +# we've seen its associated paragraph or know for certain that it doesn't have +# one). It gets the paragraph associated with the item as an argument. If +# that argument is empty, just output the item tag; if it contains a newline, +# output the item tag followed by the newline. Otherwise, see if there's +# enough room for us to output the item tag in the margin of the text or if we +# have to put it on a separate line. +sub item { + my ($self, $text) = @_; + my $tag = $$self{ITEM}; + unless (defined $tag) { + carp "Item called without tag"; + return; + } + undef $$self{ITEM}; + + # Calculate the indentation and margin. $fits is set to true if the tag + # will fit into the margin of the paragraph given our indentation level. + my $indent = $$self{INDENTS}[-1]; + $indent = $$self{opt_indent} unless defined $indent; + my $margin = ' ' x $$self{opt_margin}; + my $tag_length = length ($self->strip_format ($tag)); + my $fits = ($$self{MARGIN} - $indent >= $tag_length + 1); + + # If the tag doesn't fit, or if we have no associated text, print out the + # tag separately. Otherwise, put the tag in the margin of the paragraph. + if (!$text || $text =~ /^\s+$/ || !$fits) { + my $realindent = $$self{MARGIN}; + $$self{MARGIN} = $indent; + my $output = $self->reformat ($tag); + $output =~ s/^$margin /$margin:/ if ($$self{opt_alt} && $indent > 0); + $output =~ s/\n*$/\n/; + + # If the text is just whitespace, we have an empty item paragraph; + # this can result from =over/=item/=back without any intermixed + # paragraphs. Insert some whitespace to keep the =item from merging + # into the next paragraph. + $output .= "\n" if $text && $text =~ /^\s*$/; + + $self->output ($output); + $$self{MARGIN} = $realindent; + $self->output ($self->reformat ($text)) if ($text && $text =~ /\S/); + } else { + my $space = ' ' x $indent; + $space =~ s/^$margin /$margin:/ if $$self{opt_alt}; + $text = $self->reformat ($text); + $text =~ s/^$margin /$margin:/ if ($$self{opt_alt} && $indent > 0); + my $tagspace = ' ' x $tag_length; + $text =~ s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item"; + $self->output ($text); + } +} + +# Handle a basic block of text. The only tricky thing here is that if there +# is a pending item tag, we need to format this as an item paragraph. +sub cmd_para { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$/\n/; + if (defined $$self{ITEM}) { + $self->item ($text . "\n"); + } else { + $self->output ($self->reformat ($text . "\n")); + } + return ''; +} + +# Handle a verbatim paragraph. Just print it out, but indent it according to +# our margin. +sub cmd_verbatim { + my ($self, $attrs, $text) = @_; + $self->item if defined $$self{ITEM}; + return if $text =~ /^\s*$/; + $text =~ s/^(\n*)([ \t]*\S+)/$1 . (' ' x $$self{MARGIN}) . $2/gme; + $text =~ s/\s*$/\n\n/; + $self->output ($text); + return ''; +} + +# Handle literal text (produced by =for and similar constructs). Just output +# it with the minimum of changes. +sub cmd_data { + my ($self, $attrs, $text) = @_; + $text =~ s/^\n+//; + $text =~ s/\n{0,2}$/\n/; + $self->output ($text); + return ''; +} + +############################################################################## +# Headings +############################################################################## + +# The common code for handling all headers. Takes the header text, the +# indentation, and the surrounding marker for the alt formatting method. +sub heading { + my ($self, $text, $indent, $marker) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $text =~ s/\s+$//; + if ($$self{opt_alt}) { + my $closemark = reverse (split (//, $marker)); + my $margin = ' ' x $$self{opt_margin}; + $self->output ("\n" . "$margin$marker $text $closemark" . "\n\n"); + } else { + $text .= "\n" if $$self{opt_loose}; + my $margin = ' ' x ($$self{opt_margin} + $indent); + $self->output ($margin . $text . "\n"); + } + return ''; +} + +# First level heading. +sub cmd_head1 { + my ($self, $attrs, $text) = @_; + $self->heading ($text, 0, '===='); +} + +# Second level heading. +sub cmd_head2 { + my ($self, $attrs, $text) = @_; + $self->heading ($text, $$self{opt_indent} / 2, '== '); +} + +# Third level heading. +sub cmd_head3 { + my ($self, $attrs, $text) = @_; + $self->heading ($text, $$self{opt_indent} * 2 / 3 + 0.5, '= '); +} + +# Fourth level heading. +sub cmd_head4 { + my ($self, $attrs, $text) = @_; + $self->heading ($text, $$self{opt_indent} * 3 / 4 + 0.5, '- '); +} + +############################################################################## +# List handling +############################################################################## + +# Handle the beginning of an =over block. Takes the type of the block as the +# first argument, and then the attr hash. This is called by the handlers for +# the four different types of lists (bullet, number, text, and block). +sub over_common_start { + my ($self, $attrs) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + + # Find the indentation level. + my $indent = $$attrs{indent}; + unless (defined ($indent) && $indent =~ /^\s*[-+]?\d{1,4}\s*$/) { + $indent = $$self{opt_indent}; + } + + # Add this to our stack of indents and increase our current margin. + push (@{ $$self{INDENTS} }, $$self{MARGIN}); + $$self{MARGIN} += ($indent + 0); + return ''; +} + +# End an =over block. Takes no options other than the class pointer. Output +# any pending items and then pop one level of indentation. +sub over_common_end { + my ($self) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $$self{MARGIN} = pop @{ $$self{INDENTS} }; + return ''; +} + +# Dispatch the start and end calls as appropriate. +sub start_over_bullet { $_[0]->over_common_start ($_[1]) } +sub start_over_number { $_[0]->over_common_start ($_[1]) } +sub start_over_text { $_[0]->over_common_start ($_[1]) } +sub start_over_block { $_[0]->over_common_start ($_[1]) } +sub end_over_bullet { $_[0]->over_common_end } +sub end_over_number { $_[0]->over_common_end } +sub end_over_text { $_[0]->over_common_end } +sub end_over_block { $_[0]->over_common_end } + +# The common handler for all item commands. Takes the type of the item, the +# attributes, and then the text of the item. +sub item_common { + my ($self, $type, $attrs, $text) = @_; + $self->item if defined $$self{ITEM}; + + # Clean up the text. We want to end up with two variables, one ($text) + # which contains any body text after taking out the item portion, and + # another ($item) which contains the actual item text. Note the use of + # the internal Pod::Simple attribute here; that's a potential land mine. + $text =~ s/\s+$//; + my ($item, $index); + if ($type eq 'bullet') { + $item = '*'; + } elsif ($type eq 'number') { + $item = $$attrs{'~orig_content'}; + } else { + $item = $text; + $item =~ s/\s*\n\s*/ /g; + $text = ''; + } + $$self{ITEM} = $item; + + # If body text for this item was included, go ahead and output that now. + if ($text) { + $text =~ s/\s*$/\n/; + $self->item ($text); + } + return ''; +} + +# Dispatch the item commands to the appropriate place. +sub cmd_item_bullet { my $self = shift; $self->item_common ('bullet', @_) } +sub cmd_item_number { my $self = shift; $self->item_common ('number', @_) } +sub cmd_item_text { my $self = shift; $self->item_common ('text', @_) } +sub cmd_item_block { my $self = shift; $self->item_common ('block', @_) } + +############################################################################## +# Formatting codes +############################################################################## + +# The simple ones. +sub cmd_b { return $_[0]{alt} ? "``$_[2]''" : $_[2] } +sub cmd_f { return $_[0]{alt} ? "\"$_[2]\"" : $_[2] } +sub cmd_i { return '*' . $_[2] . '*' } +sub cmd_x { return '' } + +# Apply a whole bunch of messy heuristics to not quote things that don't +# benefit from being quoted. These originally come from Barrie Slaymaker and +# largely duplicate code in Pod::Man. +sub cmd_c { + my ($self, $attrs, $text) = @_; + + # A regex that matches the portion of a variable reference that's the + # array or hash index, separated out just because we want to use it in + # several places in the following regex. + my $index = '(?: \[.*\] | \{.*\} )?'; + + # Check for things that we don't want to quote, and if we find any of + # them, return the string with just a font change and no quoting. + $text =~ m{ + ^\s* + (?: + ( [\'\`\"] ) .* \1 # already quoted + | \` .* \' # `quoted' + | \$+ [\#^]? \S $index # special ($^Foo, $") + | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func + | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call + | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number + | 0x [a-fA-F\d]+ # a hex constant + ) + \s*\z + }xo && return $text; + + # If we didn't return, go ahead and quote the text. + return $$self{opt_alt} + ? "``$text''" + : "$$self{LQUOTE}$text$$self{RQUOTE}"; +} + +# Links reduce to the text that we're given, wrapped in angle brackets if it's +# a URL. +sub cmd_l { + my ($self, $attrs, $text) = @_; + if ($$attrs{type} eq 'url') { + if (not defined($$attrs{to}) or $$attrs{to} eq $text) { + return "<$text>"; + } elsif ($$self{opt_nourls}) { + return $text; + } else { + return "$text <$$attrs{to}>"; + } + } else { + return $text; + } +} + +############################################################################## +# Backwards compatibility +############################################################################## + +# The old Pod::Text module did everything in a pod2text() function. This +# tries to provide the same interface for legacy applications. +sub pod2text { + my @args; + + # This is really ugly; I hate doing option parsing in the middle of a + # module. But the old Pod::Text module supported passing flags to its + # entry function, so handle -a and -. + while ($_[0] =~ /^-/) { + my $flag = shift; + if ($flag eq '-a') { push (@args, alt => 1) } + elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) } + else { + unshift (@_, $flag); + last; + } + } + + # Now that we know what arguments we're using, create the parser. + my $parser = Pod::Text->new (@args); + + # If two arguments were given, the second argument is going to be a file + # handle. That means we want to call parse_from_filehandle(), which means + # we need to turn the first argument into a file handle. Magic open will + # handle the <&STDIN case automagically. + if (defined $_[1]) { + my @fhs = @_; + local *IN; + unless (open (IN, $fhs[0])) { + croak ("Can't open $fhs[0] for reading: $!\n"); + return; + } + $fhs[0] = \*IN; + $parser->output_fh ($fhs[1]); + my $retval = $parser->parse_file ($fhs[0]); + my $fh = $parser->output_fh (); + close $fh; + return $retval; + } else { + $parser->output_fh (\*STDOUT); + return $parser->parse_file (@_); + } +} + +# Reset the underlying Pod::Simple object between calls to parse_from_file so +# that the same object can be reused to convert multiple pages. +sub parse_from_file { + my $self = shift; + $self->reinit; + + # Fake the old cutting option to Pod::Parser. This fiddles with internal + # Pod::Simple state and is quite ugly; we need a better approach. + if (ref ($_[0]) eq 'HASH') { + my $opts = shift @_; + if (defined ($$opts{-cutting}) && !$$opts{-cutting}) { + $$self{in_pod} = 1; + $$self{last_was_blank} = 1; + } + } + + # Do the work. + my $retval = $self->Pod::Simple::parse_from_file (@_); + + # Flush output, since Pod::Simple doesn't do this. Ideally we should also + # close the file descriptor if we had to open one, but we can't easily + # figure this out. + my $fh = $self->output_fh (); + my $oldfh = select $fh; + my $oldflush = $|; + $| = 1; + print $fh ''; + $| = $oldflush; + select $oldfh; + return $retval; +} + +# Pod::Simple failed to provide this backward compatibility function, so +# implement it ourselves. File handles are one of the inputs that +# parse_from_file supports. +sub parse_from_filehandle { + my $self = shift; + $self->parse_from_file (@_); +} + +# Pod::Simple's parse_file doesn't set output_fh. Wrap the call and do so +# ourself unless it was already set by the caller, since our documentation has +# always said that this should work. +sub parse_file { + my ($self, $in) = @_; + unless (defined $$self{output_fh}) { + $self->output_fh (\*STDOUT); + } + return $self->SUPER::parse_file ($in); +} + +# Do the same for parse_lines, just to be polite. Pod::Simple's man page +# implies that the caller is responsible for setting this, but I don't see any +# reason not to set a default. +sub parse_lines { + my ($self, @lines) = @_; + unless (defined $$self{output_fh}) { + $self->output_fh (\*STDOUT); + } + return $self->SUPER::parse_lines (@lines); +} + +# Likewise for parse_string_document. +sub parse_string_document { + my ($self, $doc) = @_; + unless (defined $$self{output_fh}) { + $self->output_fh (\*STDOUT); + } + return $self->SUPER::parse_string_document ($doc); +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +package Pod::Escapes; +use strict; +use warnings; +use 5.006; + +use vars qw( + %Code2USASCII + %Name2character + %Name2character_number + %Latin1Code_to_fallback + %Latin1Char_to_fallback + $FAR_CHAR + $FAR_CHAR_NUMBER + $NOT_ASCII + @ISA $VERSION @EXPORT_OK %EXPORT_TAGS +); + +require Exporter; +@ISA = ('Exporter'); +$VERSION = '1.07'; +@EXPORT_OK = qw( + %Code2USASCII + %Name2character + %Name2character_number + %Latin1Code_to_fallback + %Latin1Char_to_fallback + e2char + e2charnum +); +%EXPORT_TAGS = ('ALL' => \@EXPORT_OK); + +#========================================================================== + +$FAR_CHAR = "?" unless defined $FAR_CHAR; +$FAR_CHAR_NUMBER = ord($FAR_CHAR) unless defined $FAR_CHAR_NUMBER; + +$NOT_ASCII = 'A' ne chr(65) unless defined $NOT_ASCII; + +#-------------------------------------------------------------------------- +sub e2char { + my $in = $_[0]; + return undef unless defined $in and length $in; + + # Convert to decimal: + if($in =~ m/^(0[0-7]*)$/s ) { + $in = oct $in; + } elsif($in =~ m/^0?x([0-9a-fA-F]+)$/s ) { + $in = hex $1; + } # else it's decimal, or named + + if($in =~ m/^\d+$/s) { + if($] < 5.007 and $in > 255) { # can't be trusted with Unicode + return $FAR_CHAR; + } elsif ($] >= 5.007003) { + return chr(utf8::unicode_to_native($in)); + } elsif ($NOT_ASCII) { + return $Code2USASCII{$in} # so "65" => "A" everywhere + || $Latin1Code_to_fallback{$in} # Fallback. + || $FAR_CHAR; # Fall further back + } else { + return chr($in); + } + } else { + return $Name2character{$in}; # returns undef if unknown + } +} + +#-------------------------------------------------------------------------- +sub e2charnum { + my $in = $_[0]; + return undef unless defined $in and length $in; + + # Convert to decimal: + if($in =~ m/^(0[0-7]*)$/s ) { + $in = oct $in; + } elsif($in =~ m/^0?x([0-9a-fA-F]+)$/s ) { + $in = hex $1; + } # else it's decimal, or named + + if($in =~ m/^[0-9]+$/s) { + return 0 + $in; + } else { + return $Name2character_number{$in}; # returns undef if unknown + } +} + +#-------------------------------------------------------------------------- + +%Code2USASCII = ( +# mostly generated by +# perl -e "printf qq{ \x25 3s, '\x25s',\n}, $_, chr($_) foreach (32 .. 126)" + 32, ' ', + 33, '!', + 34, '"', + 35, '#', + 36, '$', + 37, '%', + 38, '&', + 39, "'", #! + 40, '(', + 41, ')', + 42, '*', + 43, '+', + 44, ',', + 45, '-', + 46, '.', + 47, '/', + 48, '0', + 49, '1', + 50, '2', + 51, '3', + 52, '4', + 53, '5', + 54, '6', + 55, '7', + 56, '8', + 57, '9', + 58, ':', + 59, ';', + 60, '<', + 61, '=', + 62, '>', + 63, '?', + 64, '@', + 65, 'A', + 66, 'B', + 67, 'C', + 68, 'D', + 69, 'E', + 70, 'F', + 71, 'G', + 72, 'H', + 73, 'I', + 74, 'J', + 75, 'K', + 76, 'L', + 77, 'M', + 78, 'N', + 79, 'O', + 80, 'P', + 81, 'Q', + 82, 'R', + 83, 'S', + 84, 'T', + 85, 'U', + 86, 'V', + 87, 'W', + 88, 'X', + 89, 'Y', + 90, 'Z', + 91, '[', + 92, "\\", #! + 93, ']', + 94, '^', + 95, '_', + 96, '`', + 97, 'a', + 98, 'b', + 99, 'c', + 100, 'd', + 101, 'e', + 102, 'f', + 103, 'g', + 104, 'h', + 105, 'i', + 106, 'j', + 107, 'k', + 108, 'l', + 109, 'm', + 110, 'n', + 111, 'o', + 112, 'p', + 113, 'q', + 114, 'r', + 115, 's', + 116, 't', + 117, 'u', + 118, 'v', + 119, 'w', + 120, 'x', + 121, 'y', + 122, 'z', + 123, '{', + 124, '|', + 125, '}', + 126, '~', +); + +#-------------------------------------------------------------------------- + +%Latin1Code_to_fallback = (); +@Latin1Code_to_fallback{0xA0 .. 0xFF} = ( +# Copied from Text/Unidecode/x00.pm: + +' ', qq{!}, qq{C/}, 'PS', qq{\$?}, qq{Y=}, qq{|}, 'SS', qq{"}, qq{(c)}, 'a', qq{<<}, qq{!}, "", qq{(r)}, qq{-}, +'deg', qq{+-}, '2', '3', qq{'}, 'u', 'P', qq{*}, qq{,}, '1', 'o', qq{>>}, qq{1/4}, qq{1/2}, qq{3/4}, qq{?}, +'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', +'D', 'N', 'O', 'O', 'O', 'O', 'O', 'x', 'O', 'U', 'U', 'U', 'U', 'U', 'Th', 'ss', +'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', +'d', 'n', 'o', 'o', 'o', 'o', 'o', qq{/}, 'o', 'u', 'u', 'u', 'u', 'y', 'th', 'y', + +); + +{ + # Now stuff %Latin1Char_to_fallback: + %Latin1Char_to_fallback = (); + my($k,$v); + while( ($k,$v) = each %Latin1Code_to_fallback) { + $Latin1Char_to_fallback{chr $k} = $v; + #print chr($k), ' => ', $v, "\n"; + } +} + +#-------------------------------------------------------------------------- + +%Name2character_number = ( + # General XML/XHTML: + 'lt' => 60, + 'gt' => 62, + 'quot' => 34, + 'amp' => 38, + 'apos' => 39, + + # POD-specific: + 'sol' => 47, + 'verbar' => 124, + + 'lchevron' => 171, # legacy for laquo + 'rchevron' => 187, # legacy for raquo + + # Remember, grave looks like \ (as in virtu\) + # acute looks like / (as in re/sume/) + # circumflex looks like ^ (as in papier ma^che/) + # umlaut/dieresis looks like " (as in nai"ve, Chloe") + + # From the XHTML 1 .ent files: + 'nbsp' , 160, + 'iexcl' , 161, + 'cent' , 162, + 'pound' , 163, + 'curren' , 164, + 'yen' , 165, + 'brvbar' , 166, + 'sect' , 167, + 'uml' , 168, + 'copy' , 169, + 'ordf' , 170, + 'laquo' , 171, + 'not' , 172, + 'shy' , 173, + 'reg' , 174, + 'macr' , 175, + 'deg' , 176, + 'plusmn' , 177, + 'sup2' , 178, + 'sup3' , 179, + 'acute' , 180, + 'micro' , 181, + 'para' , 182, + 'middot' , 183, + 'cedil' , 184, + 'sup1' , 185, + 'ordm' , 186, + 'raquo' , 187, + 'frac14' , 188, + 'frac12' , 189, + 'frac34' , 190, + 'iquest' , 191, + 'Agrave' , 192, + 'Aacute' , 193, + 'Acirc' , 194, + 'Atilde' , 195, + 'Auml' , 196, + 'Aring' , 197, + 'AElig' , 198, + 'Ccedil' , 199, + 'Egrave' , 200, + 'Eacute' , 201, + 'Ecirc' , 202, + 'Euml' , 203, + 'Igrave' , 204, + 'Iacute' , 205, + 'Icirc' , 206, + 'Iuml' , 207, + 'ETH' , 208, + 'Ntilde' , 209, + 'Ograve' , 210, + 'Oacute' , 211, + 'Ocirc' , 212, + 'Otilde' , 213, + 'Ouml' , 214, + 'times' , 215, + 'Oslash' , 216, + 'Ugrave' , 217, + 'Uacute' , 218, + 'Ucirc' , 219, + 'Uuml' , 220, + 'Yacute' , 221, + 'THORN' , 222, + 'szlig' , 223, + 'agrave' , 224, + 'aacute' , 225, + 'acirc' , 226, + 'atilde' , 227, + 'auml' , 228, + 'aring' , 229, + 'aelig' , 230, + 'ccedil' , 231, + 'egrave' , 232, + 'eacute' , 233, + 'ecirc' , 234, + 'euml' , 235, + 'igrave' , 236, + 'iacute' , 237, + 'icirc' , 238, + 'iuml' , 239, + 'eth' , 240, + 'ntilde' , 241, + 'ograve' , 242, + 'oacute' , 243, + 'ocirc' , 244, + 'otilde' , 245, + 'ouml' , 246, + 'divide' , 247, + 'oslash' , 248, + 'ugrave' , 249, + 'uacute' , 250, + 'ucirc' , 251, + 'uuml' , 252, + 'yacute' , 253, + 'thorn' , 254, + 'yuml' , 255, + + 'fnof' , 402, + 'Alpha' , 913, + 'Beta' , 914, + 'Gamma' , 915, + 'Delta' , 916, + 'Epsilon' , 917, + 'Zeta' , 918, + 'Eta' , 919, + 'Theta' , 920, + 'Iota' , 921, + 'Kappa' , 922, + 'Lambda' , 923, + 'Mu' , 924, + 'Nu' , 925, + 'Xi' , 926, + 'Omicron' , 927, + 'Pi' , 928, + 'Rho' , 929, + 'Sigma' , 931, + 'Tau' , 932, + 'Upsilon' , 933, + 'Phi' , 934, + 'Chi' , 935, + 'Psi' , 936, + 'Omega' , 937, + 'alpha' , 945, + 'beta' , 946, + 'gamma' , 947, + 'delta' , 948, + 'epsilon' , 949, + 'zeta' , 950, + 'eta' , 951, + 'theta' , 952, + 'iota' , 953, + 'kappa' , 954, + 'lambda' , 955, + 'mu' , 956, + 'nu' , 957, + 'xi' , 958, + 'omicron' , 959, + 'pi' , 960, + 'rho' , 961, + 'sigmaf' , 962, + 'sigma' , 963, + 'tau' , 964, + 'upsilon' , 965, + 'phi' , 966, + 'chi' , 967, + 'psi' , 968, + 'omega' , 969, + 'thetasym' , 977, + 'upsih' , 978, + 'piv' , 982, + 'bull' , 8226, + 'hellip' , 8230, + 'prime' , 8242, + 'Prime' , 8243, + 'oline' , 8254, + 'frasl' , 8260, + 'weierp' , 8472, + 'image' , 8465, + 'real' , 8476, + 'trade' , 8482, + 'alefsym' , 8501, + 'larr' , 8592, + 'uarr' , 8593, + 'rarr' , 8594, + 'darr' , 8595, + 'harr' , 8596, + 'crarr' , 8629, + 'lArr' , 8656, + 'uArr' , 8657, + 'rArr' , 8658, + 'dArr' , 8659, + 'hArr' , 8660, + 'forall' , 8704, + 'part' , 8706, + 'exist' , 8707, + 'empty' , 8709, + 'nabla' , 8711, + 'isin' , 8712, + 'notin' , 8713, + 'ni' , 8715, + 'prod' , 8719, + 'sum' , 8721, + 'minus' , 8722, + 'lowast' , 8727, + 'radic' , 8730, + 'prop' , 8733, + 'infin' , 8734, + 'ang' , 8736, + 'and' , 8743, + 'or' , 8744, + 'cap' , 8745, + 'cup' , 8746, + 'int' , 8747, + 'there4' , 8756, + 'sim' , 8764, + 'cong' , 8773, + 'asymp' , 8776, + 'ne' , 8800, + 'equiv' , 8801, + 'le' , 8804, + 'ge' , 8805, + 'sub' , 8834, + 'sup' , 8835, + 'nsub' , 8836, + 'sube' , 8838, + 'supe' , 8839, + 'oplus' , 8853, + 'otimes' , 8855, + 'perp' , 8869, + 'sdot' , 8901, + 'lceil' , 8968, + 'rceil' , 8969, + 'lfloor' , 8970, + 'rfloor' , 8971, + 'lang' , 9001, + 'rang' , 9002, + 'loz' , 9674, + 'spades' , 9824, + 'clubs' , 9827, + 'hearts' , 9829, + 'diams' , 9830, + 'OElig' , 338, + 'oelig' , 339, + 'Scaron' , 352, + 'scaron' , 353, + 'Yuml' , 376, + 'circ' , 710, + 'tilde' , 732, + 'ensp' , 8194, + 'emsp' , 8195, + 'thinsp' , 8201, + 'zwnj' , 8204, + 'zwj' , 8205, + 'lrm' , 8206, + 'rlm' , 8207, + 'ndash' , 8211, + 'mdash' , 8212, + 'lsquo' , 8216, + 'rsquo' , 8217, + 'sbquo' , 8218, + 'ldquo' , 8220, + 'rdquo' , 8221, + 'bdquo' , 8222, + 'dagger' , 8224, + 'Dagger' , 8225, + 'permil' , 8240, + 'lsaquo' , 8249, + 'rsaquo' , 8250, + 'euro' , 8364, +); + + +# Fill out %Name2character... +{ + %Name2character = (); + my($name, $number); + while( ($name, $number) = each %Name2character_number) { + if($] < 5.007 and $number > 255) { + $Name2character{$name} = $FAR_CHAR; + # substitute for Unicode characters, for perls + # that can't reliably handle them + } elsif ($] >= 5.007003) { + $Name2character{$name} = chr utf8::unicode_to_native($number); + # normal case for more recent Perls where we can translate from Unicode + # to the native character set. + } + elsif (exists $Code2USASCII{$number}) { + $Name2character{$name} = $Code2USASCII{$number}; + # on older Perls, we can use the translations we have hard-coded in this + # file, but these don't include the non-ASCII-range characters + } + elsif ($NOT_ASCII && $number > 127 && $number < 256) { + # this range on old non-ASCII-platform perls is wrong + if (exists $Latin1Code_to_fallback{$number}) { + $Name2character{$name} = $Latin1Code_to_fallback{$number}; + } else { + $Name2character{$name} = $FAR_CHAR; + } + } else { + $Name2character{$name} = chr $number; + } + } +} + +#-------------------------------------------------------------------------- +1; +__END__ + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# What I used for reading the XHTML .ent files: + +my(@norms, @good, @bad); +my $dir = 'c:/sgml/docbook/'; +my %escapes; +foreach my $file (qw( + xhtml-symbol.ent + xhtml-lat1.ent + xhtml-special.ent +)) { + open(IN, "<$dir$file") or die "can't read-open $dir$file: $!"; + print "Reading $file...\n"; + while() { + if(m//) { + my($name, $value) = ($1,$2); + next if $name eq 'quot' or $name eq 'apos' or $name eq 'gt'; + + $value = hex $1 if $value =~ m/^x([a-fA-F0-9]+)$/s; + print "ILLEGAL VALUE $value" unless $value =~ m/^\d+$/s; + if($value > 255) { + push @good , sprintf " %-10s , chr(%s),\n", "'$name'", $value; + push @bad , sprintf " %-10s , \$bad,\n", "'$name'", $value; + } else { + push @norms, sprintf " %-10s , chr(%s),\n", "'$name'", $value; + } + } elsif(m/ 0) { + ## Too many arguments - assume that this is a hash and + ## the user forgot to pass a reference to it. + %opts = ($_, @_); + } + elsif (!defined $_) { + $_ = ''; + } + elsif (ref $_) { + ## User passed a ref to a hash + %opts = %{$_} if (ref($_) eq 'HASH'); + } + elsif (/^[-+]?\d+$/) { + ## User passed in the exit value to use + $opts{'-exitval'} = $_; + } + else { + ## User passed in a message to print before issuing usage. + $_ and $opts{'-message'} = $_; + } + + ## Need this for backward compatibility since we formerly used + ## options that were all uppercase words rather than ones that + ## looked like Unix command-line options. + ## to be uppercase keywords) + %opts = map { + my ($key, $val) = ($_, $opts{$_}); + $key =~ s/^(?=\w)/-/; + $key =~ /^-msg/i and $key = '-message'; + $key =~ /^-exit/i and $key = '-exitval'; + lc($key) => $val; + } (keys %opts); + + ## Now determine default -exitval and -verbose values to use + if ((! defined $opts{'-exitval'}) && (! defined $opts{'-verbose'})) { + $opts{'-exitval'} = 2; + $opts{'-verbose'} = 0; + } + elsif (! defined $opts{'-exitval'}) { + $opts{'-exitval'} = ($opts{'-verbose'} > 0) ? 1 : 2; + } + elsif (! defined $opts{'-verbose'}) { + $opts{'-verbose'} = (lc($opts{'-exitval'}) eq 'noexit' || + $opts{'-exitval'} < 2); + } + + ## Default the output file + $opts{'-output'} = (lc($opts{'-exitval'}) eq 'noexit' || + $opts{'-exitval'} < 2) ? \*STDOUT : \*STDERR + unless (defined $opts{'-output'}); + ## Default the input file + $opts{'-input'} = $0 unless (defined $opts{'-input'}); + + ## Look up input file in path if it doesn't exist. + unless ((ref $opts{'-input'}) || (-e $opts{'-input'})) { + my $basename = $opts{'-input'}; + my $pathsep = ($^O =~ /^(?:dos|os2|MSWin32)$/i) ? ';' + : (($^O eq 'MacOS' || $^O eq 'VMS') ? ',' : ':'); + my $pathspec = $opts{'-pathlist'} || $ENV{PATH} || $ENV{PERL5LIB}; + + my @paths = (ref $pathspec) ? @$pathspec : split($pathsep, $pathspec); + for my $dirname (@paths) { + $_ = File::Spec->catfile($dirname, $basename) if length; + last if (-e $_) && ($opts{'-input'} = $_); + } + } + + ## Now create a pod reader and constrain it to the desired sections. + my $parser = new Pod::Usage(USAGE_OPTIONS => \%opts); + if ($opts{'-verbose'} == 0) { + $parser->select('(?:SYNOPSIS|USAGE)\s*'); + } + elsif ($opts{'-verbose'} == 1) { + my $opt_re = '(?i)' . + '(?:OPTIONS|ARGUMENTS)' . + '(?:\s*(?:AND|\/)\s*(?:OPTIONS|ARGUMENTS))?'; + $parser->select( '(?:SYNOPSIS|USAGE)\s*', $opt_re, "DESCRIPTION/$opt_re" ); + } + elsif ($opts{'-verbose'} >= 2 && $opts{'-verbose'} != 99) { + $parser->select('.*'); + } + elsif ($opts{'-verbose'} == 99) { + my $sections = $opts{'-sections'}; + $parser->select( (ref $sections) ? @$sections : $sections ); + $opts{'-verbose'} = 1; + } + + ## Check for perldoc + my $progpath = $opts{'-perldoc'} ? $opts{'-perldoc'} : + File::Spec->catfile($Config{scriptdirexp} + || $Config{scriptdir}, 'perldoc'); + + my $version = sprintf("%vd",$^V); + if ($Config{versiononly} and $Config{startperl} =~ /\Q$version\E$/ ) { + $progpath .= $version; + } + $opts{'-noperldoc'} = 1 unless -e $progpath; + + ## Now translate the pod document and then exit with the desired status + if ( !$opts{'-noperldoc'} + and $opts{'-verbose'} >= 2 + and !ref($opts{'-input'}) + and $opts{'-output'} == \*STDOUT ) + { + ## spit out the entire PODs. Might as well invoke perldoc + print { $opts{'-output'} } ($opts{'-message'}, "\n") if($opts{'-message'}); + if(defined $opts{-input} && $opts{-input} =~ /^\s*(\S.*?)\s*$/) { + # the perldocs back to 5.005 should all have -F + # without -F there are warnings in -T scripts + my $f = $1; + my @perldoc_cmd = ($progpath); + if ($opts{'-perldocopt'}) { + $opts{'-perldocopt'} =~ s/^\s+|\s+$//g; + push @perldoc_cmd, split(/\s+/, $opts{'-perldocopt'}); + } + push @perldoc_cmd, ('-F', $f); + unshift @perldoc_cmd, $opts{'-perlcmd'} if $opts{'-perlcmd'}; + system(@perldoc_cmd); + if($?) { + # RT16091: fall back to more if perldoc failed + system(($Config{pager} || $ENV{PAGER} || '/bin/more'), $1); + } + } else { + croak "Unspecified input file or insecure argument.\n"; + } + } + else { + $parser->parse_from_file($opts{'-input'}, $opts{'-output'}); + } + + exit($opts{'-exitval'}) unless (lc($opts{'-exitval'}) eq 'noexit'); +} + +##--------------------------------------------------------------------------- + +##------------------------------- +## Method definitions begin here +##------------------------------- + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my %params = @_; + my $self = {%params}; + bless $self, $class; + if ($self->can('initialize')) { + $self->initialize(); + } else { + # pass through options to Pod::Text + my %opts; + for (qw(alt code indent loose margin quotes sentence stderr utf8 width)) { + my $val = $params{USAGE_OPTIONS}{"-$_"}; + $opts{$_} = $val if defined $val; + } + $self = $self->SUPER::new(%opts); + %$self = (%$self, %params); + } + return $self; +} + +# This subroutine was copied in whole-cloth from Pod::Select 1.60 in order to +# allow the ejection of Pod::Select from the core without breaking Pod::Usage. +# -- rjbs, 2013-03-18 +sub _compile_section_spec { + my ($section_spec) = @_; + my (@regexs, $negated); + + ## Compile the spec into a list of regexs + local $_ = $section_spec; + s{\\\\}{\001}g; ## handle escaped backward slashes + s{\\/}{\002}g; ## handle escaped forward slashes + + ## Parse the regexs for the heading titles + @regexs = split(/\//, $_, $MAX_HEADING_LEVEL); + + ## Set default regex for ommitted levels + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $regexs[$i] = '.*' unless ((defined $regexs[$i]) + && (length $regexs[$i])); + } + ## Modify the regexs as needed and validate their syntax + my $bad_regexs = 0; + for (@regexs) { + $_ .= '.+' if ($_ eq '!'); + s{\001}{\\\\}g; ## restore escaped backward slashes + s{\002}{\\/}g; ## restore escaped forward slashes + $negated = s/^\!//; ## check for negation + eval "m{$_}"; ## check regex syntax + if ($@) { + ++$bad_regexs; + carp qq{Bad regular expression /$_/ in "$section_spec": $@\n}; + } + else { + ## Add the forward and rear anchors (and put the negator back) + $_ = '^' . $_ unless (/^\^/); + $_ = $_ . '$' unless (/\$$/); + $_ = '!' . $_ if ($negated); + } + } + return (! $bad_regexs) ? [ @regexs ] : undef; +} + +sub select { + my ($self, @sections) = @_; + if ($ISA[0]->can('select')) { + $self->SUPER::select(@sections); + } else { + # we're using Pod::Simple - need to mimic the behavior of Pod::Select + my $add = ($sections[0] eq '+') ? shift(@sections) : ''; + ## Reset the set of sections to use + unless (@sections) { + delete $self->{USAGE_SELECT} unless ($add); + return; + } + $self->{USAGE_SELECT} = [] + unless ($add && $self->{USAGE_SELECT}); + my $sref = $self->{USAGE_SELECT}; + ## Compile each spec + for my $spec (@sections) { + my $cs = _compile_section_spec($spec); + if ( defined $cs ) { + ## Store them in our sections array + push(@$sref, $cs); + } else { + carp qq{Ignoring section spec "$spec"!\n}; + } + } + } +} + +# Override Pod::Text->seq_i to return just "arg", not "*arg*". +sub seq_i { return $_[1] } +# Override Pod::Text->cmd_i to return just "arg", not "*arg*". +# newer version based on Pod::Simple +sub cmd_i { return $_[2] } + +# This overrides the Pod::Text method to do something very akin to what +# Pod::Select did as well as the work done below by preprocess_paragraph. +# Note that the below is very, very specific to Pod::Text and Pod::Simple. +sub _handle_element_end { + my ($self, $element) = @_; + if ($element eq 'head1') { + $self->{USAGE_HEADINGS} = [ $$self{PENDING}[-1][1] ]; + if ($self->{USAGE_OPTIONS}->{-verbose} < 2) { + $$self{PENDING}[-1][1] =~ s/^\s*SYNOPSIS\s*$/USAGE/; + } + } elsif ($element =~ /^head(\d+)$/ && $1) { # avoid 0 + my $idx = $1 - 1; + $self->{USAGE_HEADINGS} = [] unless($self->{USAGE_HEADINGS}); + $self->{USAGE_HEADINGS}->[$idx] = $$self{PENDING}[-1][1]; + # we have to get rid of the lower headings + splice(@{$self->{USAGE_HEADINGS}},$idx+1); + } + if ($element =~ /^head\d+$/) { + $$self{USAGE_SKIPPING} = 1; + if (!$$self{USAGE_SELECT} || !@{ $$self{USAGE_SELECT} }) { + $$self{USAGE_SKIPPING} = 0; + } else { + my @headings = @{$$self{USAGE_HEADINGS}}; + for my $section_spec ( @{$$self{USAGE_SELECT}} ) { + my $match = 1; + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $headings[$i] = '' unless defined $headings[$i]; + my $regex = $section_spec->[$i]; + my $negated = ($regex =~ s/^\!//); + $match &= ($negated ? ($headings[$i] !~ /${regex}/) + : ($headings[$i] =~ /${regex}/)); + last unless ($match); + } # end heading levels + if ($match) { + $$self{USAGE_SKIPPING} = 0; + last; + } + } # end sections + } + + # Try to do some lowercasing instead of all-caps in headings, and use + # a colon to end all headings. + if($self->{USAGE_OPTIONS}->{-verbose} < 2) { + local $_ = $$self{PENDING}[-1][1]; + s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge; + s/\s*$/:/ unless (/:\s*$/); + $_ .= "\n"; + $$self{PENDING}[-1][1] = $_; + } + } + if ($$self{USAGE_SKIPPING} && $element !~ m/^over-|^[BCFILSZ]$/) { + pop @{ $$self{PENDING} }; + } else { + $self->SUPER::_handle_element_end($element); + } +} + +# required for Pod::Simple API +sub start_document { + my $self = shift; + $self->SUPER::start_document(); + my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1; + my $out_fh = $self->output_fh(); + print $out_fh "$msg\n"; +} + +# required for old Pod::Parser API +sub begin_pod { + my $self = shift; + $self->SUPER::begin_pod(); ## Have to call superclass + my $msg = $self->{USAGE_OPTIONS}->{-message} or return 1; + my $out_fh = $self->output_handle(); + print $out_fh "$msg\n"; +} + +sub preprocess_paragraph { + my $self = shift; + local $_ = shift; + my $line = shift; + ## See if this is a heading and we aren't printing the entire manpage. + if (($self->{USAGE_OPTIONS}->{-verbose} < 2) && /^=head/) { + ## Change the title of the SYNOPSIS section to USAGE + s/^=head1\s+SYNOPSIS\s*$/=head1 USAGE/; + ## Try to do some lowercasing instead of all-caps in headings + s{([A-Z])([A-Z]+)}{((length($2) > 2) ? $1 : lc($1)) . lc($2)}ge; + ## Use a colon to end all headings + s/\s*$/:/ unless (/:\s*$/); + $_ .= "\n"; + } + return $self->SUPER::preprocess_paragraph($_); +} + +1; # keep require happy + +__END__ + + +############################################################################# +# Pod/Find.pm -- finds files containing POD documentation +# +# Author: Marek Rouchal +# +# Copyright (C) 1999-2000 by Marek Rouchal (and borrowing code +# from Nick Ing-Simmon's PodToHtml). All rights reserved. +# This file is part of "PodParser". Pod::Find is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Find; +use strict; + +use vars qw($VERSION); +$VERSION = '1.63'; ## Current version of this package +require 5.005; ## requires this Perl version or later +use Carp; + +BEGIN { + if ($] < 5.006) { + require Symbol; + import Symbol; + } +} + +############################################################################# + + +#use diagnostics; +use Exporter; +use File::Spec; +use File::Find; +use Cwd qw(abs_path cwd); + +use vars qw(@ISA @EXPORT_OK $VERSION); +@ISA = qw(Exporter); +@EXPORT_OK = qw(&pod_find &simplify_name &pod_where &contains_pod); + +# package global variables +my $SIMPLIFY_RX; + + +# return a hash of the POD files found +# first argument may be a hashref (options), +# rest is a list of directories to search recursively +sub pod_find +{ + my %opts; + if(ref $_[0]) { + %opts = %{shift()}; + } + + $opts{-verbose} ||= 0; + $opts{-perl} ||= 0; + + my (@search) = @_; + + if($opts{-script}) { + require Config; + push(@search, $Config::Config{scriptdir}) + if -d $Config::Config{scriptdir}; + $opts{-perl} = 1; + } + + if($opts{-inc}) { + if ($^O eq 'MacOS') { + # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS + my @new_INC = @INC; + for (@new_INC) { + if ( $_ eq '.' ) { + $_ = ':'; + } elsif ( $_ =~ s{^((?:\.\./)+)}{':' x (length($1)/3)}e ) { + $_ = ':'. $_; + } else { + $_ =~ s{^\./}{:}; + } + } + push(@search, grep($_ ne File::Spec->curdir, @new_INC)); + } else { + my %seen; + my $curdir = File::Spec->curdir; + foreach(@INC) { + next if $_ eq $curdir; + my $path = abs_path($_); + push(@search, $path) unless $seen{$path}++; + } + } + + $opts{-perl} = 1; + } + + if($opts{-perl}) { + require Config; + # this code simplifies the POD name for Perl modules: + # * remove "site_perl" + # * remove e.g. "i586-linux" (from 'archname') + # * remove e.g. 5.00503 + # * remove pod/ if followed by *.pod (e.g. in pod/perlfunc.pod) + + # Mac OS: + # * remove ":?site_perl:" + # * remove :?pod: if followed by *.pod (e.g. in :pod:perlfunc.pod) + + if ($^O eq 'MacOS') { + $SIMPLIFY_RX = + qq!^(?i:\:?site_perl\:|\:?pod\:(?=.*?\\.pod\\z))*!; + } else { + $SIMPLIFY_RX = + qq!^(?i:site(_perl)?/|\Q$Config::Config{archname}\E/|\\d+\\.\\d+([_.]?\\d+)?/|pod/(?=.*?\\.pod\\z))*!; + } + } + + my %dirs_visited; + my %pods; + my %names; + my $pwd = cwd(); + + foreach my $try (@search) { + unless(File::Spec->file_name_is_absolute($try)) { + # make path absolute + $try = File::Spec->catfile($pwd,$try); + } + # simplify path + # on VMS canonpath will vmsify:[the.path], but File::Find::find + # wants /unixy/paths + if ($^O eq 'VMS') { + $try = VMS::Filespec::unixify($try); + } + else { + $try = File::Spec->canonpath($try); + } + my $name; + if(-f $try) { + if($name = _check_and_extract_name($try, $opts{-verbose})) { + _check_for_duplicates($try, $name, \%names, \%pods); + } + next; + } + my $root_rx = $^O eq 'MacOS' ? qq!^\Q$try\E! : qq!^\Q$try\E/!; + $root_rx=~ s|//$|/|; # remove trailing double slash + File::Find::find( sub { + my $item = $File::Find::name; + if(-d) { + if($item =~ m{/(?:RCS|CVS|SCCS|\.svn|\.hg|\.git|\.sync)$}) { + $File::Find::prune = 1; + return; + } + elsif($dirs_visited{$item}) { + warn "Directory '$item' already seen, skipping.\n" + if($opts{-verbose}); + $File::Find::prune = 1; + return; + } + else { + $dirs_visited{$item} = 1; + } + if($opts{-perl} && /^(\d+\.[\d_]+)\z/s && eval "$1" != $]) { + $File::Find::prune = 1; + warn "Perl $] version mismatch on $_, skipping.\n" + if($opts{-verbose}); + } + return; + } + if($name = _check_and_extract_name($item, $opts{-verbose}, $root_rx)) { + _check_for_duplicates($item, $name, \%names, \%pods); + } + }, $try); # end of File::Find::find + } + chdir $pwd; + return %pods; +} + +sub _check_for_duplicates { + my ($file, $name, $names_ref, $pods_ref) = @_; + if($$names_ref{$name}) { + warn "Duplicate POD found (shadowing?): $name ($file)\n"; + warn ' Already seen in ', + join(' ', grep($$pods_ref{$_} eq $name, keys %$pods_ref)),"\n"; + } + else { + $$names_ref{$name} = 1; + } + return $$pods_ref{$file} = $name; +} + +sub _check_and_extract_name { + my ($file, $verbose, $root_rx) = @_; + + # check extension or executable flag + # this involves testing the .bat extension on Win32! + unless(-f $file && -T $file && ($file =~ /\.(pod|pm|plx?)\z/i || -x $file )) { + return; + } + + return unless contains_pod($file,$verbose); + + # strip non-significant path components + # TODO what happens on e.g. Win32? + my $name = $file; + if(defined $root_rx) { + $name =~ s/$root_rx//is; + $name =~ s/$SIMPLIFY_RX//is if(defined $SIMPLIFY_RX); + } + else { + if ($^O eq 'MacOS') { + $name =~ s/^.*://s; + } else { + $name =~ s{^.*/}{}s; + } + } + _simplify($name); + $name =~ s{/+}{::}g; + if ($^O eq 'MacOS') { + $name =~ s{:+}{::}g; # : -> :: + } else { + $name =~ s{/+}{::}g; # / -> :: + } + return $name; +} + + +# basic simplification of the POD name: +# basename & strip extension +sub simplify_name { + my ($str) = @_; + # remove all path components + if ($^O eq 'MacOS') { + $str =~ s/^.*://s; + } else { + $str =~ s{^.*/}{}s; + } + _simplify($str); + return $str; +} + +# internal sub only +sub _simplify { + # strip Perl's own extensions + $_[0] =~ s/\.(pod|pm|plx?)\z//i; + # strip meaningless extensions on Win32 and OS/2 + $_[0] =~ s/\.(bat|exe|cmd)\z//i if($^O =~ /mswin|os2/i); + # strip meaningless extensions on VMS + $_[0] =~ s/\.(com)\z//i if($^O eq 'VMS'); +} + +# contribution from Tim Jenness + + +sub pod_where { + + # default options + my %options = ( + '-inc' => 0, + '-verbose' => 0, + '-dirs' => [ File::Spec->curdir ], + ); + + # Check for an options hash as first argument + if (defined $_[0] && ref($_[0]) eq 'HASH') { + my $opt = shift; + + # Merge default options with supplied options + %options = (%options, %$opt); + } + + # Check usage + carp 'Usage: pod_where({options}, $pod)' unless (scalar(@_)); + + # Read argument + my $pod = shift; + + # Split on :: and then join the name together using File::Spec + my @parts = split (/::/, $pod); + + # Get full directory list + my @search_dirs = @{ $options{'-dirs'} }; + + if ($options{'-inc'}) { + + require Config; + + # Add @INC + if ($^O eq 'MacOS' && $options{'-inc'}) { + # tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS + my @new_INC = @INC; + for (@new_INC) { + if ( $_ eq '.' ) { + $_ = ':'; + } elsif ( $_ =~ s{^((?:\.\./)+)}{':' x (length($1)/3)}e ) { + $_ = ':'. $_; + } else { + $_ =~ s{^\./}{:}; + } + } + push (@search_dirs, @new_INC); + } elsif ($options{'-inc'}) { + push (@search_dirs, @INC); + } + + # Add location of pod documentation for perl man pages (eg perlfunc) + # This is a pod directory in the private install tree + #my $perlpoddir = File::Spec->catdir($Config::Config{'installprivlib'}, + # 'pod'); + #push (@search_dirs, $perlpoddir) + # if -d $perlpoddir; + + # Add location of binaries such as pod2text + push (@search_dirs, $Config::Config{'scriptdir'}) + if -d $Config::Config{'scriptdir'}; + } + + warn 'Search path is: '.join(' ', @search_dirs)."\n" + if $options{'-verbose'}; + + # Loop over directories + Dir: foreach my $dir ( @search_dirs ) { + + # Don't bother if can't find the directory + if (-d $dir) { + warn "Looking in directory $dir\n" + if $options{'-verbose'}; + + # Now concatenate this directory with the pod we are searching for + my $fullname = File::Spec->catfile($dir, @parts); + $fullname = VMS::Filespec::unixify($fullname) if $^O eq 'VMS'; + warn "Filename is now $fullname\n" + if $options{'-verbose'}; + + # Loop over possible extensions + foreach my $ext ('', '.pod', '.pm', '.pl') { + my $fullext = $fullname . $ext; + if (-f $fullext && + contains_pod($fullext, $options{'-verbose'}) ) { + warn "FOUND: $fullext\n" if $options{'-verbose'}; + return $fullext; + } + } + } else { + warn "Directory $dir does not exist\n" + if $options{'-verbose'}; + next Dir; + } + # for some strange reason the path on MacOS/darwin/cygwin is + # 'pods' not 'pod' + # this could be the case also for other systems that + # have a case-tolerant file system, but File::Spec + # does not recognize 'darwin' yet. And cygwin also has "pods", + # but is not case tolerant. Oh well... + if((File::Spec->case_tolerant || $^O =~ /macos|darwin|cygwin/i) + && -d File::Spec->catdir($dir,'pods')) { + $dir = File::Spec->catdir($dir,'pods'); + redo Dir; + } + if(-d File::Spec->catdir($dir,'pod')) { + $dir = File::Spec->catdir($dir,'pod'); + redo Dir; + } + } + # No match; + return; +} + + +sub contains_pod { + my $file = shift; + my $verbose = 0; + $verbose = shift if @_; + + # check for one line of POD + my $podfh; + if ($] < 5.006) { + $podfh = gensym(); + } + + unless(open($podfh,"<$file")) { + warn "Error: $file is unreadable: $!\n"; + return; + } + + local $/ = undef; + my $pod = <$podfh>; + close($podfh) || die "Error closing $file: $!\n"; + unless($pod =~ /^=(head\d|pod|over|item|cut)\b/m) { + warn "No POD in $file, skipping.\n" + if($verbose); + return 0; + } + + return 1; +} + + +1; + +package Pod::Functions; +use strict; + + +our $VERSION = '1.13'; + +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT = qw(%Kinds %Type %Flavor %Type_Description @Type_Order); + +our(%Kinds, %Type, %Flavor, %Type_Description, @Type_Order); + +foreach ( + [String => 'Functions for SCALARs or strings'], + [Regexp => 'Regular expressions and pattern matching'], + [Math => 'Numeric functions'], + [ARRAY => 'Functions for real @ARRAYs'], + [LIST => 'Functions for list data'], + [HASH => 'Functions for real %HASHes'], + ['I/O' => 'Input and output functions'], + [Binary => 'Functions for fixed-length data or records'], + [File => 'Functions for filehandles, files, or directories'], + [Flow => 'Keywords related to the control flow of your Perl program'], + [Namespace => 'Keywords related to scoping'], + [Misc => 'Miscellaneous functions'], + [Process => 'Functions for processes and process groups'], + [Modules => 'Keywords related to Perl modules'], + [Objects => 'Keywords related to classes and object-orientation'], + [Socket => 'Low-level socket functions'], + [SysV => 'System V interprocess communication functions'], + [User => 'Fetching user and group info'], + [Network => 'Fetching network info'], + [Time => 'Time-related functions'], + ) { + push @Type_Order, $_->[0]; + $Type_Description{$_->[0]} = $_->[1]; +}; + +while () { + chomp; + s/^#.*//; + next unless $_; + my($name, @data) = split "\t", $_; + $Flavor{$name} = pop @data; + $Type{$name} = join ',', @data; + for my $t (@data) { + push @{$Kinds{$t}}, $name; + } +} + +close DATA; + +my( $typedesc, $list ); +unless (caller) { + foreach my $type ( @Type_Order ) { + $list = join(", ", sort @{$Kinds{$type}}); + $typedesc = $Type_Description{$type} . ":"; + write; + } +} + +format = + +^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $typedesc +~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $typedesc + ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + $list +. + +1; + +__DATA__ +-X File a file test (-r, -x, etc) +abs Math absolute value function +accept Socket accept an incoming socket connect +alarm Process schedule a SIGALRM +atan2 Math arctangent of Y/X in the range -PI to PI +bind Socket binds an address to a socket +binmode I/O prepare binary files for I/O +bless Objects create an object +break Flow break out of a C block +caller Flow Namespace get context of the current subroutine call +chdir File change your current working directory +chmod File changes the permissions on a list of files +chomp String remove a trailing record separator from a string +chop String remove the last character from a string +chown File change the ownership on a list of files +chr String get character this number represents +chroot File make directory new root for path lookups +close I/O close file (or pipe or socket) handle +closedir I/O close directory handle +connect Socket connect to a remote socket +continue Flow optional trailing block in a while or foreach +cos Math cosine function +crypt String one-way passwd-style encryption +dbmclose I/O Objects breaks binding on a tied dbm file +dbmopen I/O Objects create binding on a tied dbm file +defined Misc test whether a value, variable, or function is defined +delete HASH deletes a value from a hash +die Flow I/O raise an exception or bail out +do Flow Modules turn a BLOCK into a TERM +dump Flow create an immediate core dump +each ARRAY HASH retrieve the next key/value pair from a hash +endgrent User be done using group file +endhostent User be done using hosts file +endnetent User be done using networks file +endprotoent Network be done using protocols file +endpwent User be done using passwd file +endservent Network be done using services file +eof I/O test a filehandle for its end +eval Flow catch exceptions or compile and run code +evalbytes Flow similar to string eval, but intend to parse a bytestream +exec Process abandon this program to run another +exists HASH test whether a hash key is present +exit Flow terminate this program +exp Math raise I to a power +fc String return casefolded version of a string +fcntl File file control system call +__FILE__ Flow the name of the current source file +fileno I/O return file descriptor from filehandle +flock I/O lock an entire file with an advisory lock +fork Process create a new process just like this one +format I/O declare a picture format with use by the write() function +formline Misc internal function used for formats +getc I/O get the next character from the filehandle +getgrent User get next group record +getgrgid User get group record given group user ID +getgrnam User get group record given group name +gethostbyaddr Network get host record given its address +gethostbyname Network get host record given name +gethostent Network get next hosts record +getlogin User return who logged in at this tty +getnetbyaddr Network get network record given its address +getnetbyname Network get networks record given name +getnetent Network get next networks record +getpeername Socket find the other end of a socket connection +getpgrp Process get process group +getppid Process get parent process ID +getpriority Process get current nice value +getprotobyname Network get protocol record given name +getprotobynumber Network get protocol record numeric protocol +getprotoent Network get next protocols record +getpwent User get next passwd record +getpwnam User get passwd record given user login name +getpwuid User get passwd record given user ID +getservbyname Network get services record given its name +getservbyport Network get services record given numeric port +getservent Network get next services record +getsockname Socket retrieve the sockaddr for a given socket +getsockopt Socket get socket options on a given socket +glob File expand filenames using wildcards +gmtime Time convert UNIX time into record or string using Greenwich time +goto Flow create spaghetti code +grep LIST locate elements in a list test true against a given criterion +hex Math String convert a hexadecimal string to a number +import Modules Namespace patch a module's namespace into your own +index String find a substring within a string +int Math get the integer portion of a number +ioctl File system-dependent device control system call +join LIST join a list into a string using a separator +keys ARRAY HASH retrieve list of indices from a hash +kill Process send a signal to a process or process group +last Flow exit a block prematurely +lc String return lower-case version of a string +lcfirst String return a string with just the next letter in lower case +length String return the number of characters in a string +__LINE__ Flow the current source line number +link File create a hard link in the filesystem +listen Socket register your socket as a server +local Namespace create a temporary value for a global variable (dynamic scoping) +localtime Time convert UNIX time into record or string using local time +lock Misc get a thread lock on a variable, subroutine, or method +log Math retrieve the natural logarithm for a number +lstat File stat a symbolic link +m// Regexp match a string with a regular expression pattern +map LIST apply a change to a list to get back a new list with the changes +mkdir File create a directory +msgctl SysV SysV IPC message control operations +msgget SysV get SysV IPC message queue +msgrcv SysV receive a SysV IPC message from a message queue +msgsnd SysV send a SysV IPC message to a message queue +my Namespace declare and assign a local variable (lexical scoping) +next Flow iterate a block prematurely +no Modules unimport some module symbols or semantics at compile time +oct Math String convert a string to an octal number +open File open a file, pipe, or descriptor +opendir File open a directory +ord String find a character's numeric representation +our Namespace declare and assign a package variable (lexical scoping) +pack Binary String convert a list into a binary representation +package Modules Namespace Objects declare a separate global namespace +__PACKAGE__ Flow the current package +pipe Process open a pair of connected filehandles +pop ARRAY remove the last element from an array and return it +pos Regexp find or set the offset for the last/next m//g search +print I/O output a list to a filehandle +printf I/O output a formatted list to a filehandle +prototype Misc get the prototype (if any) of a subroutine +push ARRAY append one or more elements to an array +q/STRING/ String singly quote a string +qq/STRING/ String doubly quote a string +qr/STRING/ Regexp compile pattern +quotemeta Regexp quote regular expression magic characters +qw/STRING/ LIST quote a list of words +qx/STRING/ Process backquote quote a string +rand Math retrieve the next pseudorandom number +read Binary I/O fixed-length buffered input from a filehandle +readdir I/O get a directory from a directory handle +readline I/O fetch a record from a file +readlink File determine where a symbolic link is pointing +readpipe Process execute a system command and collect standard output +recv Socket receive a message over a Socket +redo Flow start this loop iteration over again +ref Objects find out the type of thing being referenced +rename File change a filename +require Modules load in external functions from a library at runtime +reset Misc clear all variables of a given name +return Flow get out of a function early +reverse LIST String flip a string or a list +rewinddir I/O reset directory handle +rindex String right-to-left substring search +rmdir File remove a directory +s/// Regexp replace a pattern with a string +say I/O output a list to a filehandle, appending a newline +scalar Misc force a scalar context +seek I/O reposition file pointer for random-access I/O +seekdir I/O reposition directory pointer +select File I/O reset default output or do I/O multiplexing +semctl SysV SysV semaphore control operations +semget SysV get set of SysV semaphores +semop SysV SysV semaphore operations +send Socket send a message over a socket +setgrent User prepare group file for use +sethostent Network prepare hosts file for use +setnetent Network prepare networks file for use +setpgrp Process set the process group of a process +setpriority Process set a process's nice value +setprotoent Network prepare protocols file for use +setpwent User prepare passwd file for use +setservent Network prepare services file for use +setsockopt Socket set some socket options +shift ARRAY remove the first element of an array, and return it +shmctl SysV SysV shared memory operations +shmget SysV get SysV shared memory segment identifier +shmread SysV read SysV shared memory +shmwrite SysV write SysV shared memory +shutdown Socket close down just half of a socket connection +sin Math return the sine of a number +sleep Process block for some number of seconds +socket Socket create a socket +socketpair Socket create a pair of sockets +sort LIST sort a list of values +splice ARRAY add or remove elements anywhere in an array +split Regexp split up a string using a regexp delimiter +sprintf String formatted print into a string +sqrt Math square root function +srand Math seed the random number generator +stat File get a file's status information +state Namespace declare and assign a persistent lexical variable +study Regexp no-op, formerly optimized input data for repeated searches +sub Flow declare a subroutine, possibly anonymously +__SUB__ Flow the current subroutine, or C if not in a subroutine +substr String get or alter a portion of a string +symlink File create a symbolic link to a file +syscall Binary I/O execute an arbitrary system call +sysopen File open a file, pipe, or descriptor +sysread Binary I/O fixed-length unbuffered input from a filehandle +sysseek Binary I/O position I/O pointer on handle used with sysread and syswrite +system Process run a separate program +syswrite Binary I/O fixed-length unbuffered output to a filehandle +tell I/O get current seekpointer on a filehandle +telldir I/O get current seekpointer on a directory handle +tie Objects bind a variable to an object class +tied Objects get a reference to the object underlying a tied variable +time Time return number of seconds since 1970 +times Process Time return elapsed time for self and child processes +tr/// String transliterate a string +truncate I/O shorten a file +uc String return upper-case version of a string +ucfirst String return a string with just the next letter in upper case +umask File set file creation mode mask +undef Misc remove a variable or function definition +unlink File remove one link to a file +unpack Binary LIST convert binary structure into normal perl variables +unshift ARRAY prepend more elements to the beginning of a list +untie Objects break a tie binding to a variable +use Modules Namespace Objects load in a module at compile time and import its namespace +utime File set a file's last access and modify times +values ARRAY HASH return a list of the values in a hash +vec Binary test or set particular bits in a string +wait Process wait for any child process to die +waitpid Process wait for a particular child process to die +wantarray Flow get void vs scalar vs list context of current subroutine call +warn I/O print debugging info +write I/O print a picture record +y/// String transliterate a string + +require 5; +package Pod::Simple; +use strict; +use Carp (); +BEGIN { *DEBUG = sub () {0} unless defined &DEBUG } +use integer; +use Pod::Escapes 1.04 (); +use Pod::Simple::LinkSection (); +use Pod::Simple::BlackBox (); +#use utf8; + +use vars qw( + $VERSION @ISA + @Known_formatting_codes @Known_directives + %Known_formatting_codes %Known_directives + $NL +); + +@ISA = ('Pod::Simple::BlackBox'); +$VERSION = '3.35'; + +@Known_formatting_codes = qw(I B C L E F S X Z); +%Known_formatting_codes = map(($_=>1), @Known_formatting_codes); +@Known_directives = qw(head1 head2 head3 head4 item over back); +%Known_directives = map(($_=>'Plain'), @Known_directives); +$NL = $/ unless defined $NL; + +#----------------------------------------------------------------------------- +# Set up some constants: + +BEGIN { + if(defined &ASCII) { } + elsif(chr(65) eq 'A') { *ASCII = sub () {1} } + else { *ASCII = sub () {''} } + + unless(defined &MANY_LINES) { *MANY_LINES = sub () {20} } + DEBUG > 4 and print STDERR "MANY_LINES is ", MANY_LINES(), "\n"; + unless(MANY_LINES() >= 1) { + die "MANY_LINES is too small (", MANY_LINES(), ")!\nAborting"; + } + if(defined &UNICODE) { } + elsif($] >= 5.008) { *UNICODE = sub() {1} } + else { *UNICODE = sub() {''} } +} +if(DEBUG > 2) { + print STDERR "# We are ", ASCII ? '' : 'not ', "in ASCII-land\n"; + print STDERR "# We are under a Unicode-safe Perl.\n"; +} + +# The NO BREAK SPACE and SOFT HYHPEN are used in several submodules. +if ($] ge 5.007_003) { # On sufficiently modern Perls we can handle any + # character set + $Pod::Simple::nbsp = chr utf8::unicode_to_native(0xA0); + $Pod::Simple::shy = chr utf8::unicode_to_native(0xAD); +} +elsif (Pod::Simple::ASCII) { # Hard code ASCII early Perl + $Pod::Simple::nbsp = "\xA0"; + $Pod::Simple::shy = "\xAD"; +} +else { # EBCDIC on early Perl. We know what the values are for the code + # pages supported then. + $Pod::Simple::nbsp = "\x41"; + $Pod::Simple::shy = "\xCA"; +} + +# Design note: +# This is a parser for Pod. It is not a parser for the set of Pod-like +# languages which happens to contain Pod -- it is just for Pod, plus possibly +# some extensions. + +# @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ +#@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +__PACKAGE__->_accessorize( + 'nbsp_for_S', # Whether to map S<...>'s to \xA0 characters + 'source_filename', # Filename of the source, for use in warnings + 'source_dead', # Whether to consider this parser's source dead + + 'output_fh', # The filehandle we're writing to, if applicable. + # Used only in some derived classes. + + 'hide_line_numbers', # For some dumping subclasses: whether to pointedly + # suppress the start_line attribute + + 'line_count', # the current line number + 'pod_para_count', # count of pod paragraphs seen so far + + 'no_whining', # whether to suppress whining + 'no_errata_section', # whether to suppress the errata section + 'complain_stderr', # whether to complain to stderr + + 'doc_has_started', # whether we've fired the open-Document event yet + + 'bare_output', # For some subclasses: whether to prepend + # header-code and postpend footer-code + + 'keep_encoding_directive', # whether to emit =encoding + 'nix_X_codes', # whether to ignore X<...> codes + 'merge_text', # whether to avoid breaking a single piece of + # text up into several events + + 'preserve_whitespace', # whether to try to keep whitespace as-is + 'strip_verbatim_indent', # What indent to strip from verbatim + + 'parse_characters', # Whether parser should expect chars rather than octets + + 'content_seen', # whether we've seen any real Pod content + 'errors_seen', # TODO: document. whether we've seen any errors (fatal or not) + + 'codes_in_verbatim', # for PseudoPod extensions + + 'code_handler', # coderef to call when a code (non-pod) line is seen + 'cut_handler', # ... when a =cut line is seen + 'pod_handler', # ... when a =pod line is seen + 'whiteline_handler', # ... when a line with only whitespace is seen + #Called like: + # $code_handler->($line, $self->{'line_count'}, $self) if $code_handler; + # $cut_handler->($line, $self->{'line_count'}, $self) if $cut_handler; + # $pod_handler->($line, $self->{'line_count'}, $self) if $pod_handler; + # $wl_handler->($line, $self->{'line_count'}, $self) if $wl_handler; + 'parse_empty_lists', # whether to acknowledge empty =over/=back blocks + 'raw_mode', # to report entire raw lines instead of Pod elements +); + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub any_errata_seen { # good for using as an exit() value... + return shift->{'errors_seen'} || 0; +} + +sub errata_seen { + return shift->{'all_errata'} || {}; +} + +# Returns the encoding only if it was recognized as being handled and set +sub detected_encoding { + return shift->{'detected_encoding'}; +} + +sub encoding { + my $this = shift; + return $this->{'encoding'} unless @_; # GET. + + $this->_handle_encoding_line("=encoding $_[0]"); + if ($this->{'_processed_encoding'}) { + delete $this->{'_processed_encoding'}; + if(! $this->{'encoding_command_statuses'} ) { + DEBUG > 2 and print STDERR " CRAZY ERROR: encoding wasn't really handled?!\n"; + } elsif( $this->{'encoding_command_statuses'}[-1] ) { + $this->scream( "=encoding $_[0]", + sprintf "Couldn't do %s: %s", + $this->{'encoding_command_reqs' }[-1], + $this->{'encoding_command_statuses'}[-1], + ); + } else { + DEBUG > 2 and print STDERR " (encoding successfully handled.)\n"; + } + return $this->{'encoding'}; + } else { + return undef; + } +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# Pull in some functions that, for some reason, I expect to see here too: +BEGIN { + *pretty = \&Pod::Simple::BlackBox::pretty; + *stringify_lol = \&Pod::Simple::BlackBox::stringify_lol; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub version_report { + my $class = ref($_[0]) || $_[0]; + if($class eq __PACKAGE__) { + return "$class $VERSION"; + } else { + my $v = $class->VERSION; + return "$class $v (" . __PACKAGE__ . " $VERSION)"; + } +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +#sub curr_open { # read-only list accessor +# return @{ $_[0]{'curr_open'} || return() }; +#} +#sub _curr_open_listref { $_[0]{'curr_open'} ||= [] } + + +sub output_string { + # Works by faking out output_fh. Simplifies our code. + # + my $this = shift; + return $this->{'output_string'} unless @_; # GET. + + require Pod::Simple::TiedOutFH; + my $x = (defined($_[0]) and ref($_[0])) ? $_[0] : \( $_[0] ); + $$x = '' unless defined $$x; + DEBUG > 4 and print STDERR "# Output string set to $x ($$x)\n"; + $this->{'output_fh'} = Pod::Simple::TiedOutFH->handle_on($_[0]); + return + $this->{'output_string'} = $_[0]; + #${ ${ $this->{'output_fh'} } }; +} + +sub abandon_output_string { $_[0]->abandon_output_fh; delete $_[0]{'output_string'} } +sub abandon_output_fh { $_[0]->output_fh(undef) } +# These don't delete the string or close the FH -- they just delete our +# references to it/them. +# TODO: document these + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub new { + # takes no parameters + my $class = ref($_[0]) || $_[0]; + #Carp::croak(__PACKAGE__ . " is a virtual base class -- see perldoc " + # . __PACKAGE__ ); + return bless { + 'accept_codes' => { map( ($_=>$_), @Known_formatting_codes ) }, + 'accept_directives' => { %Known_directives }, + 'accept_targets' => {}, + }, $class; +} + + + +# TODO: an option for whether to interpolate E<...>'s, or just resolve to codes. + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _handle_element_start { # OVERRIDE IN DERIVED CLASS + my($self, $element_name, $attr_hash_r) = @_; + return; +} + +sub _handle_element_end { # OVERRIDE IN DERIVED CLASS + my($self, $element_name) = @_; + return; +} + +sub _handle_text { # OVERRIDE IN DERIVED CLASS + my($self, $text) = @_; + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# +# And now directives (not targets) + +sub accept_directive_as_verbatim { shift->_accept_directives('Verbatim', @_) } +sub accept_directive_as_data { shift->_accept_directives('Data', @_) } +sub accept_directive_as_processed { shift->_accept_directives('Plain', @_) } + +sub _accept_directives { + my($this, $type) = splice @_,0,2; + foreach my $d (@_) { + next unless defined $d and length $d; + Carp::croak "\"$d\" isn't a valid directive name" + unless $d =~ m/^[a-zA-Z][a-zA-Z0-9]*$/s; + Carp::croak "\"$d\" is already a reserved Pod directive name" + if exists $Known_directives{$d}; + $this->{'accept_directives'}{$d} = $type; + DEBUG > 2 and print STDERR "Learning to accept \"=$d\" as directive of type $type\n"; + } + DEBUG > 6 and print STDERR "$this\'s accept_directives : ", + pretty($this->{'accept_directives'}), "\n"; + + return sort keys %{ $this->{'accept_directives'} } if wantarray; + return; +} + +#-------------------------------------------------------------------------- +# TODO: document these: + +sub unaccept_directive { shift->unaccept_directives(@_) }; + +sub unaccept_directives { + my $this = shift; + foreach my $d (@_) { + next unless defined $d and length $d; + Carp::croak "\"$d\" isn't a valid directive name" + unless $d =~ m/^[a-zA-Z][a-zA-Z0-9]*$/s; + Carp::croak "But you must accept \"$d\" directives -- it's a builtin!" + if exists $Known_directives{$d}; + delete $this->{'accept_directives'}{$d}; + DEBUG > 2 and print STDERR "OK, won't accept \"=$d\" as directive.\n"; + } + return sort keys %{ $this->{'accept_directives'} } if wantarray; + return +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# +# And now targets (not directives) + +sub accept_target { shift->accept_targets(@_) } # alias +sub accept_target_as_text { shift->accept_targets_as_text(@_) } # alias + + +sub accept_targets { shift->_accept_targets('1', @_) } + +sub accept_targets_as_text { shift->_accept_targets('force_resolve', @_) } + # forces them to be processed, even when there's no ":". + +sub _accept_targets { + my($this, $type) = splice @_,0,2; + foreach my $t (@_) { + next unless defined $t and length $t; + # TODO: enforce some limitations on what a target name can be? + $this->{'accept_targets'}{$t} = $type; + DEBUG > 2 and print STDERR "Learning to accept \"$t\" as target of type $type\n"; + } + return sort keys %{ $this->{'accept_targets'} } if wantarray; + return; +} + +#-------------------------------------------------------------------------- +sub unaccept_target { shift->unaccept_targets(@_) } + +sub unaccept_targets { + my $this = shift; + foreach my $t (@_) { + next unless defined $t and length $t; + # TODO: enforce some limitations on what a target name can be? + delete $this->{'accept_targets'}{$t}; + DEBUG > 2 and print STDERR "OK, won't accept \"$t\" as target.\n"; + } + return sort keys %{ $this->{'accept_targets'} } if wantarray; + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# +# And now codes (not targets or directives) + +# XXX Probably it is an error that the digit '9' is excluded from these re's. +# Broken for early Perls on EBCDIC +my $xml_name_re = eval "qr/[^-.0-8:A-Z_a-z[:^ascii:]]/"; +if (! defined $xml_name_re) { + $xml_name_re = qr/[\x00-\x2C\x2F\x39\x3B-\x40\x5B-\x5E\x60\x7B-\x7F]/; +} + +sub accept_code { shift->accept_codes(@_) } # alias + +sub accept_codes { # Add some codes + my $this = shift; + + foreach my $new_code (@_) { + next unless defined $new_code and length $new_code; + # A good-enough check that it's good as an XML Name symbol: + Carp::croak "\"$new_code\" isn't a valid element name" + if $new_code =~ $xml_name_re + # Characters under 0x80 that aren't legal in an XML Name. + or $new_code =~ m/^[-\.0-9]/s + or $new_code =~ m/:[-\.0-9]/s; + # The legal under-0x80 Name characters that + # an XML Name still can't start with. + + $this->{'accept_codes'}{$new_code} = $new_code; + + # Yes, map to itself -- just so that when we + # see "=extend W [whatever] thatelementname", we say that W maps + # to whatever $this->{accept_codes}{thatelementname} is, + # i.e., "thatelementname". Then when we go re-mapping, + # a "W" in the treelet turns into "thatelementname". We only + # remap once. + # If we say we accept "W", then a "W" in the treelet simply turns + # into "W". + } + + return; +} + +#-------------------------------------------------------------------------- +sub unaccept_code { shift->unaccept_codes(@_) } + +sub unaccept_codes { # remove some codes + my $this = shift; + + foreach my $new_code (@_) { + next unless defined $new_code and length $new_code; + # A good-enough check that it's good as an XML Name symbol: + Carp::croak "\"$new_code\" isn't a valid element name" + if $new_code =~ $xml_name_re + # Characters under 0x80 that aren't legal in an XML Name. + or $new_code =~ m/^[-\.0-9]/s + or $new_code =~ m/:[-\.0-9]/s; + # The legal under-0x80 Name characters that + # an XML Name still can't start with. + + Carp::croak "But you must accept \"$new_code\" codes -- it's a builtin!" + if grep $new_code eq $_, @Known_formatting_codes; + + delete $this->{'accept_codes'}{$new_code}; + + DEBUG > 2 and print STDERR "OK, won't accept the code $new_code<...>.\n"; + } + + return; +} + + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub parse_string_document { + my $self = shift; + my @lines; + foreach my $line_group (@_) { + next unless defined $line_group and length $line_group; + pos($line_group) = 0; + while($line_group =~ + m/([^\n\r]*)(\r?\n?)/g # supports \r, \n ,\r\n + #m/([^\n\r]*)((?:\r?\n)?)/g + ) { + #print(">> $1\n"), + $self->parse_lines($1) + if length($1) or length($2) + or pos($line_group) != length($line_group); + # I.e., unless it's a zero-length "empty line" at the very + # end of "foo\nbar\n" (i.e., between the \n and the EOS). + } + } + $self->parse_lines(undef); # to signal EOF + return $self; +} + +sub _init_fh_source { + my($self, $source) = @_; + + #DEBUG > 1 and print STDERR "Declaring $source as :raw for starters\n"; + #$self->_apply_binmode($source, ':raw'); + #binmode($source, ":raw"); + + return; +} + +#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. +# + +sub parse_file { + my($self, $source) = (@_); + + if(!defined $source) { + Carp::croak("Can't use empty-string as a source for parse_file"); + } elsif(ref(\$source) eq 'GLOB') { + $self->{'source_filename'} = '' . ($source); + } elsif(ref $source) { + $self->{'source_filename'} = '' . ($source); + } elsif(!length $source) { + Carp::croak("Can't use empty-string as a source for parse_file"); + } else { + { + local *PODSOURCE; + open(PODSOURCE, "<$source") || Carp::croak("Can't open $source: $!"); + $self->{'source_filename'} = $source; + $source = *PODSOURCE{IO}; + } + $self->_init_fh_source($source); + } + # By here, $source is a FH. + + $self->{'source_fh'} = $source; + + my($i, @lines); + until( $self->{'source_dead'} ) { + splice @lines; + + for($i = MANY_LINES; $i--;) { # read those many lines at a time + local $/ = $NL; + push @lines, scalar(<$source>); # readline + last unless defined $lines[-1]; + # but pass thru the undef, which will set source_dead to true + } + + my $at_eof = ! $lines[-1]; # keep track of the undef + pop @lines if $at_eof; # silence warnings + + # be eol agnostic + s/\r\n?/\n/g for @lines; + + # make sure there are only one line elements for parse_lines + @lines = split(/(?<=\n)/, join('', @lines)); + + # push the undef back after popping it to set source_dead to true + push @lines, undef if $at_eof; + + $self->parse_lines(@lines); + } + delete($self->{'source_fh'}); # so it can be GC'd + return $self; +} + +#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. + +sub parse_from_file { + # An emulation of Pod::Parser's interface, for the sake of Perldoc. + # Basically just a wrapper around parse_file. + + my($self, $source, $to) = @_; + $self = $self->new unless ref($self); # so we tolerate being a class method + + if(!defined $source) { $source = *STDIN{IO} + } elsif(ref(\$source) eq 'GLOB') { # stet + } elsif(ref($source) ) { # stet + } elsif(!length $source + or $source eq '-' or $source =~ m/^<&(?:STDIN|0)$/i + ) { + $source = *STDIN{IO}; + } + + if(!defined $to) { $self->output_fh( *STDOUT{IO} ); + } elsif(ref(\$to) eq 'GLOB') { $self->output_fh( $to ); + } elsif(ref($to)) { $self->output_fh( $to ); + } elsif(!length $to + or $to eq '-' or $to =~ m/^>&?(?:STDOUT|1)$/i + ) { + $self->output_fh( *STDOUT{IO} ); + } elsif($to =~ m/^>&(?:STDERR|2)$/i) { + $self->output_fh( *STDERR{IO} ); + } else { + require Symbol; + my $out_fh = Symbol::gensym(); + DEBUG and print STDERR "Write-opening to $to\n"; + open($out_fh, ">$to") or Carp::croak "Can't write-open $to: $!"; + binmode($out_fh) + if $self->can('write_with_binmode') and $self->write_with_binmode; + $self->output_fh($out_fh); + } + + return $self->parse_file($source); +} + +#----------------------------------------------------------------------------- + +sub whine { + #my($self,$line,$complaint) = @_; + my $self = shift(@_); + ++$self->{'errors_seen'}; + if($self->{'no_whining'}) { + DEBUG > 9 and print STDERR "Discarding complaint (at line $_[0]) $_[1]\n because no_whining is on.\n"; + return; + } + push @{$self->{'all_errata'}{$_[0]}}, $_[1]; + return $self->_complain_warn(@_) if $self->{'complain_stderr'}; + return $self->_complain_errata(@_); +} + +sub scream { # like whine, but not suppressible + #my($self,$line,$complaint) = @_; + my $self = shift(@_); + ++$self->{'errors_seen'}; + push @{$self->{'all_errata'}{$_[0]}}, $_[1]; + return $self->_complain_warn(@_) if $self->{'complain_stderr'}; + return $self->_complain_errata(@_); +} + +sub _complain_warn { + my($self,$line,$complaint) = @_; + return printf STDERR "%s around line %s: %s\n", + $self->{'source_filename'} || 'Pod input', $line, $complaint; +} + +sub _complain_errata { + my($self,$line,$complaint) = @_; + if( $self->{'no_errata_section'} ) { + DEBUG > 9 and print STDERR "Discarding erratum (at line $line) $complaint\n because no_errata_section is on.\n"; + } else { + DEBUG > 9 and print STDERR "Queuing erratum (at line $line) $complaint\n"; + push @{$self->{'errata'}{$line}}, $complaint + # for a report to be generated later! + } + return 1; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _get_initial_item_type { + # A hack-wrapper here for when you have like "=over\n\n=item 456\n\n" + my($self, $para) = @_; + return $para->[1]{'~type'} if $para->[1]{'~type'}; + + return $para->[1]{'~type'} = 'text' + if join("\n", @{$para}[2 .. $#$para]) =~ m/^\s*(\d+)\.?\s*$/s and $1 ne '1'; + # Else fall thru to the general case: + return $self->_get_item_type($para); +} + + + +sub _get_item_type { # mutates the item!! + my($self, $para) = @_; + return $para->[1]{'~type'} if $para->[1]{'~type'}; + + + # Otherwise we haven't yet been to this node. Maybe alter it... + + my $content = join "\n", @{$para}[2 .. $#$para]; + + if($content =~ m/^\s*\*\s*$/s or $content =~ m/^\s*$/s) { + # Like: "=item *", "=item * ", "=item" + splice @$para, 2; # so it ends up just being ['=item', { attrhash } ] + $para->[1]{'~orig_content'} = $content; + return $para->[1]{'~type'} = 'bullet'; + + } elsif($content =~ m/^\s*\*\s+(.+)/s) { # tolerance + + # Like: "=item * Foo bar baz"; + $para->[1]{'~orig_content'} = $content; + $para->[1]{'~_freaky_para_hack'} = $1; + DEBUG > 2 and print STDERR " Tolerating $$para[2] as =item *\\n\\n$1\n"; + splice @$para, 2; # so it ends up just being ['=item', { attrhash } ] + return $para->[1]{'~type'} = 'bullet'; + + } elsif($content =~ m/^\s*(\d+)\.?\s*$/s) { + # Like: "=item 1.", "=item 123412" + + $para->[1]{'~orig_content'} = $content; + $para->[1]{'number'} = $1; # Yes, stores the number there! + + splice @$para, 2; # so it ends up just being ['=item', { attrhash } ] + return $para->[1]{'~type'} = 'number'; + + } else { + # It's anything else. + return $para->[1]{'~type'} = 'text'; + + } +} + +#----------------------------------------------------------------------------- + +sub _make_treelet { + my $self = shift; # and ($para, $start_line) + my $treelet; + if(!@_) { + return ['']; + } if(ref $_[0] and ref $_[0][0] and $_[0][0][0] eq '~Top') { + # Hack so we can pass in fake-o pre-cooked paragraphs: + # just have the first line be a reference to a ['~Top', {}, ...] + # We use this feechure in gen_errata and stuff. + + DEBUG and print STDERR "Applying precooked treelet hack to $_[0][0]\n"; + $treelet = $_[0][0]; + splice @$treelet, 0, 2; # lop the top off + return $treelet; + } else { + $treelet = $self->_treelet_from_formatting_codes(@_); + } + + if( $self->_remap_sequences($treelet) ) { + $self->_treat_Zs($treelet); # Might as well nix these first + $self->_treat_Ls($treelet); # L has to precede E and S + $self->_treat_Es($treelet); + $self->_treat_Ss($treelet); # S has to come after E + + $self->_wrap_up($treelet); # Nix X's and merge texties + + } else { + DEBUG and print STDERR "Formatless treelet gets fast-tracked.\n"; + # Very common case! + } + + splice @$treelet, 0, 2; # lop the top off + + return $treelet; +} + +#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. + +sub _wrap_up { + my($self, @stack) = @_; + my $nixx = $self->{'nix_X_codes'}; + my $merge = $self->{'merge_text' }; + return unless $nixx or $merge; + + DEBUG > 2 and print STDERR "\nStarting _wrap_up traversal.\n", + $merge ? (" Merge mode on\n") : (), + $nixx ? (" Nix-X mode on\n") : (), + ; + + + my($i, $treelet); + while($treelet = shift @stack) { + DEBUG > 3 and print STDERR " Considering children of this $treelet->[0] node...\n"; + for($i = 2; $i < @$treelet; ++$i) { # iterate over children + DEBUG > 3 and print STDERR " Considering child at $i ", pretty($treelet->[$i]), "\n"; + if($nixx and ref $treelet->[$i] and $treelet->[$i][0] eq 'X') { + DEBUG > 3 and print STDERR " Nixing X node at $i\n"; + splice(@$treelet, $i, 1); # just nix this node (and its descendants) + # no need to back-update the counter just yet + redo; + + } elsif($merge and $i != 2 and # non-initial + !ref $treelet->[$i] and !ref $treelet->[$i - 1] + ) { + DEBUG > 3 and print STDERR " Merging ", $i-1, + ":[$treelet->[$i-1]] and $i\:[$treelet->[$i]]\n"; + $treelet->[$i-1] .= ( splice(@$treelet, $i, 1) )[0]; + DEBUG > 4 and print STDERR " Now: ", $i-1, ":[$treelet->[$i-1]]\n"; + --$i; + next; + # since we just pulled the possibly last node out from under + # ourselves, we can't just redo() + + } elsif( ref $treelet->[$i] ) { + DEBUG > 4 and print STDERR " Enqueuing ", pretty($treelet->[$i]), " for traversal.\n"; + push @stack, $treelet->[$i]; + + if($treelet->[$i][0] eq 'L') { + my $thing; + foreach my $attrname ('section', 'to') { + if(defined($thing = $treelet->[$i][1]{$attrname}) and ref $thing) { + unshift @stack, $thing; + DEBUG > 4 and print STDERR " +Enqueuing ", + pretty( $treelet->[$i][1]{$attrname} ), + " as an attribute value to tweak.\n"; + } + } + } + } + } + } + DEBUG > 2 and print STDERR "End of _wrap_up traversal.\n\n"; + + return; +} + +#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. + +sub _remap_sequences { + my($self,@stack) = @_; + + if(@stack == 1 and @{ $stack[0] } == 3 and !ref $stack[0][2]) { + # VERY common case: abort it. + DEBUG and print STDERR "Skipping _remap_sequences: formatless treelet.\n"; + return 0; + } + + my $map = ($self->{'accept_codes'} || die "NO accept_codes in $self?!?"); + + my $start_line = $stack[0][1]{'start_line'}; + DEBUG > 2 and printf + "\nAbout to start _remap_sequences on treelet from line %s.\n", + $start_line || '[?]' + ; + DEBUG > 3 and print STDERR " Map: ", + join('; ', map "$_=" . ( + ref($map->{$_}) ? join(",", @{$map->{$_}}) : $map->{$_} + ), + sort keys %$map ), + ("B~C~E~F~I~L~S~X~Z" eq join '~', sort keys %$map) + ? " (all normal)\n" : "\n" + ; + + # A recursive algorithm implemented iteratively! Whee! + + my($is, $was, $i, $treelet); # scratch + while($treelet = shift @stack) { + DEBUG > 3 and print STDERR " Considering children of this $treelet->[0] node...\n"; + for($i = 2; $i < @$treelet; ++$i) { # iterate over children + next unless ref $treelet->[$i]; # text nodes are uninteresting + + DEBUG > 4 and print STDERR " Noting child $i : $treelet->[$i][0]<...>\n"; + + $is = $treelet->[$i][0] = $map->{ $was = $treelet->[$i][0] }; + if( DEBUG > 3 ) { + if(!defined $is) { + print STDERR " Code $was<> is UNKNOWN!\n"; + } elsif($is eq $was) { + DEBUG > 4 and print STDERR " Code $was<> stays the same.\n"; + } else { + print STDERR " Code $was<> maps to ", + ref($is) + ? ( "tags ", map("$_<", @$is), '...', map('>', @$is), "\n" ) + : "tag $is<...>.\n"; + } + } + + if(!defined $is) { + $self->whine($start_line, "Deleting unknown formatting code $was<>"); + $is = $treelet->[$i][0] = '1'; # But saving the children! + # I could also insert a leading "$was<" and tailing ">" as + # children of this node, but something about that seems icky. + } + if(ref $is) { + my @dynasty = @$is; + DEBUG > 4 and print STDERR " Renaming $was node to $dynasty[-1]\n"; + $treelet->[$i][0] = pop @dynasty; + my $nugget; + while(@dynasty) { + DEBUG > 4 and printf + " Grafting a new %s node between %s and %s\n", + $dynasty[-1], $treelet->[0], $treelet->[$i][0], + ; + + #$nugget = ; + splice @$treelet, $i, 1, [pop(@dynasty), {}, $treelet->[$i]]; + # relace node with a new parent + } + } elsif($is eq '0') { + splice(@$treelet, $i, 1); # just nix this node (and its descendants) + --$i; # back-update the counter + } elsif($is eq '1') { + splice(@$treelet, $i, 1 # replace this node with its children! + => splice @{ $treelet->[$i] },2 + # (not catching its first two (non-child) items) + ); + --$i; # back up for new stuff + } else { + # otherwise it's unremarkable + unshift @stack, $treelet->[$i]; # just recurse + } + } + } + + DEBUG > 2 and print STDERR "End of _remap_sequences traversal.\n\n"; + + if(@_ == 2 and @{ $_[1] } == 3 and !ref $_[1][2]) { + DEBUG and print STDERR "Noting that the treelet is now formatless.\n"; + return 0; + } + return 1; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub _ponder_extend { + + # "Go to an extreme, move back to a more comfortable place" + # -- /Oblique Strategies/, Brian Eno and Peter Schmidt + + my($self, $para) = @_; + my $content = join ' ', splice @$para, 2; + $content =~ s/^\s+//s; + $content =~ s/\s+$//s; + + DEBUG > 2 and print STDERR "Ogling extensor: =extend $content\n"; + + if($content =~ + m/^ + (\S+) # 1 : new item + \s+ + (\S+) # 2 : fallback(s) + (?:\s+(\S+))? # 3 : element name(s) + \s* + $ + /xs + ) { + my $new_letter = $1; + my $fallbacks_one = $2; + my $elements_one; + $elements_one = defined($3) ? $3 : $1; + + DEBUG > 2 and print STDERR "Extensor has good syntax.\n"; + + unless($new_letter =~ m/^[A-Z]$/s or $new_letter) { + DEBUG > 2 and print STDERR " $new_letter isn't a valid thing to entend.\n"; + $self->whine( + $para->[1]{'start_line'}, + "You can extend only formatting codes A-Z, not like \"$new_letter\"" + ); + return; + } + + if(grep $new_letter eq $_, @Known_formatting_codes) { + DEBUG > 2 and print STDERR " $new_letter isn't a good thing to extend, because known.\n"; + $self->whine( + $para->[1]{'start_line'}, + "You can't extend an established code like \"$new_letter\"" + ); + + #TODO: or allow if last bit is same? + + return; + } + + unless($fallbacks_one =~ m/^[A-Z](,[A-Z])*$/s # like "B", "M,I", etc. + or $fallbacks_one eq '0' or $fallbacks_one eq '1' + ) { + $self->whine( + $para->[1]{'start_line'}, + "Format for second =extend parameter must be like" + . " M or 1 or 0 or M,N or M,N,O but you have it like " + . $fallbacks_one + ); + return; + } + + unless($elements_one =~ m/^[^ ,]+(,[^ ,]+)*$/s) { # like "B", "M,I", etc. + $self->whine( + $para->[1]{'start_line'}, + "Format for third =extend parameter: like foo or bar,Baz,qu:ux but not like " + . $elements_one + ); + return; + } + + my @fallbacks = split ',', $fallbacks_one, -1; + my @elements = split ',', $elements_one, -1; + + foreach my $f (@fallbacks) { + next if exists $Known_formatting_codes{$f} or $f eq '0' or $f eq '1'; + DEBUG > 2 and print STDERR " Can't fall back on unknown code $f\n"; + $self->whine( + $para->[1]{'start_line'}, + "Can't use unknown formatting code '$f' as a fallback for '$new_letter'" + ); + return; + } + + DEBUG > 3 and printf STDERR "Extensor: Fallbacks <%s> Elements <%s>.\n", + @fallbacks, @elements; + + my $canonical_form; + foreach my $e (@elements) { + if(exists $self->{'accept_codes'}{$e}) { + DEBUG > 1 and print STDERR " Mapping '$new_letter' to known extension '$e'\n"; + $canonical_form = $e; + last; # first acceptable elementname wins! + } else { + DEBUG > 1 and print STDERR " Can't map '$new_letter' to unknown extension '$e'\n"; + } + } + + + if( defined $canonical_form ) { + # We found a good N => elementname mapping + $self->{'accept_codes'}{$new_letter} = $canonical_form; + DEBUG > 2 and print + "Extensor maps $new_letter => known element $canonical_form.\n"; + } else { + # We have to use the fallback(s), which might be '0', or '1'. + $self->{'accept_codes'}{$new_letter} + = (@fallbacks == 1) ? $fallbacks[0] : \@fallbacks; + DEBUG > 2 and print + "Extensor maps $new_letter => fallbacks @fallbacks.\n"; + } + + } else { + DEBUG > 2 and print STDERR "Extensor has bad syntax.\n"; + $self->whine( + $para->[1]{'start_line'}, + "Unknown =extend syntax: $content" + ) + } + return; +} + + +#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:. + +sub _treat_Zs { # Nix Z<...>'s + my($self,@stack) = @_; + + my($i, $treelet); + my $start_line = $stack[0][1]{'start_line'}; + + # A recursive algorithm implemented iteratively! Whee! + + while($treelet = shift @stack) { + for($i = 2; $i < @$treelet; ++$i) { # iterate over children + next unless ref $treelet->[$i]; # text nodes are uninteresting + unless($treelet->[$i][0] eq 'Z') { + unshift @stack, $treelet->[$i]; # recurse + next; + } + + DEBUG > 1 and print STDERR "Nixing Z node @{$treelet->[$i]}\n"; + + # bitch UNLESS it's empty + unless( @{$treelet->[$i]} == 2 + or (@{$treelet->[$i]} == 3 and $treelet->[$i][2] eq '') + ) { + $self->whine( $start_line, "A non-empty Z<>" ); + } # but kill it anyway + + splice(@$treelet, $i, 1); # thereby just nix this node. + --$i; + + } + } + + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +# Quoting perlpodspec: + +# In parsing an L<...> code, Pod parsers must distinguish at least four +# attributes: + +############# Not used. Expressed via the element children plus +############# the value of the "content-implicit" flag. +# First: +# The link-text. If there is none, this must be undef. (E.g., in "L", the link-text is "Perl Functions". In +# "L" and even "L<|Time::HiRes>", there is no link text. Note +# that link text may contain formatting.) +# + +############# The element children +# Second: +# The possibly inferred link-text -- i.e., if there was no real link text, +# then this is the text that we'll infer in its place. (E.g., for +# "L", the inferred link text is "Getopt::Std".) +# + +############# The "to" attribute (which might be text, or a treelet) +# Third: +# The name or URL, or undef if none. (E.g., in "L", the name -- also sometimes called the page -- is +# "perlfunc". In "L", the name is undef.) +# + +############# The "section" attribute (which might be next, or a treelet) +# Fourth: +# The section (AKA "item" in older perlpods), or undef if none. E.g., in +# Getopt::Std/DESCRIPTION, "DESCRIPTION" is the section. (Note that this +# is not the same as a manpage section like the "5" in "man 5 crontab". +# "Section Foo" in the Pod sense means the part of the text that's +# introduced by the heading or item whose text is "Foo".) +# +# Pod parsers may also note additional attributes including: +# + +############# The "type" attribute. +# Fifth: +# A flag for whether item 3 (if present) is a URL (like +# "http://lists.perl.org" is), in which case there should be no section +# attribute; a Pod name (like "perldoc" and "Getopt::Std" are); or +# possibly a man page name (like "crontab(5)" is). +# + +############# The "raw" attribute that is already there. +# Sixth: +# The raw original L<...> content, before text is split on "|", "/", etc, +# and before E<...> codes are expanded. + + +# For L<...> codes without a "name|" part, only E<...> and Z<> codes may +# occur -- no other formatting codes. That is, authors should not use +# "L>". +# +# Note, however, that formatting codes and Z<>'s can occur in any and all +# parts of an L<...> (i.e., in name, section, text, and url). + +sub _treat_Ls { # Process our dear dear friends, the L<...> sequences + + # L + # L or L + # L or L or L<"sec"> + # L + # L or L + # L or L or L + # L + # L + + my($self,@stack) = @_; + + my($i, $treelet); + my $start_line = $stack[0][1]{'start_line'}; + + # A recursive algorithm implemented iteratively! Whee! + + while($treelet = shift @stack) { + for(my $i = 2; $i < @$treelet; ++$i) { + # iterate over children of current tree node + next unless ref $treelet->[$i]; # text nodes are uninteresting + unless($treelet->[$i][0] eq 'L') { + unshift @stack, $treelet->[$i]; # recurse + next; + } + + + # By here, $treelet->[$i] is definitely an L node + my $ell = $treelet->[$i]; + DEBUG > 1 and print STDERR "Ogling L node $ell\n"; + + # bitch if it's empty + if( @{$ell} == 2 + or (@{$ell} == 3 and $ell->[2] eq '') + ) { + $self->whine( $start_line, "An empty L<>" ); + $treelet->[$i] = 'L<>'; # just make it a text node + next; # and move on + } + + if( (! ref $ell->[2] && $ell->[2] =~ /\A\s/) + ||(! ref $ell->[-1] && $ell->[-1] =~ /\s\z/) + ) { + $self->whine( $start_line, "L<> starts or ends with whitespace" ); + } + + # Catch URLs: + + # there are a number of possible cases: + # 1) text node containing url: http://foo.com + # -> [ 'http://foo.com' ] + # 2) text node containing url and text: foo|http://foo.com + # -> [ 'foo|http://foo.com' ] + # 3) text node containing url start: mailto:xEfoo.com + # -> [ 'mailto:x', [ E ... ], 'foo.com' ] + # 4) text node containing url start and text: foo|mailto:xEfoo.com + # -> [ 'foo|mailto:x', [ E ... ], 'foo.com' ] + # 5) other nodes containing text and url start: OE<39>Malley|http://foo.com + # -> [ 'O', [ E ... ], 'Malley', '|http://foo.com' ] + # ... etc. + + # anything before the url is part of the text. + # anything after it is part of the url. + # the url text node itself may contain parts of both. + + if (my ($url_index, $text_part, $url_part) = + # grep is no good here; we want to bail out immediately so that we can + # use $1, $2, etc. without having to do the match twice. + sub { + for (2..$#$ell) { + next if ref $ell->[$_]; + next unless $ell->[$_] =~ m/^(?:([^|]*)\|)?(\w+:[^:\s]\S*)$/s; + return ($_, $1, $2); + } + return; + }->() + ) { + $ell->[1]{'type'} = 'url'; + + my @text = @{$ell}[2..$url_index-1]; + push @text, $text_part if defined $text_part; + + my @url = @{$ell}[$url_index+1..$#$ell]; + unshift @url, $url_part; + + unless (@text) { + $ell->[1]{'content-implicit'} = 'yes'; + @text = @url; + } + + $ell->[1]{to} = Pod::Simple::LinkSection->new( + @url == 1 + ? $url[0] + : [ '', {}, @url ], + ); + + splice @$ell, 2, $#$ell, @text; + + next; + } + + # Catch some very simple and/or common cases + if(@{$ell} == 3 and ! ref $ell->[2]) { + my $it = $ell->[2]; + if($it =~ m{^[^/|]+[(][-a-zA-Z0-9]+[)]$}s) { # man sections + # Hopefully neither too broad nor too restrictive a RE + DEBUG > 1 and print STDERR "Catching \"$it\" as manpage link.\n"; + $ell->[1]{'type'} = 'man'; + # This's the only place where man links can get made. + $ell->[1]{'content-implicit'} = 'yes'; + $ell->[1]{'to' } = + Pod::Simple::LinkSection->new( $it ); # treelet! + + next; + } + if($it =~ m/^[^\/\|,\$\%\@\ \"\<\>\:\#\&\*\{\}\[\]\(\)]+(\:\:[^\/\|,\$\%\@\ \"\<\>\:\#\&\*\{\}\[\]\(\)]+)*$/s) { + # Extremely forgiving idea of what constitutes a bare + # modulename link like L or even L + DEBUG > 1 and print STDERR "Catching \"$it\" as ho-hum L link.\n"; + $ell->[1]{'type'} = 'pod'; + $ell->[1]{'content-implicit'} = 'yes'; + $ell->[1]{'to' } = + Pod::Simple::LinkSection->new( $it ); # treelet! + next; + } + # else fall thru... + } + + + + # ...Uhoh, here's the real L<...> parsing stuff... + # "With the ill behavior, with the ill behavior, with the ill behavior..." + + DEBUG > 1 and print STDERR "Running a real parse on this non-trivial L\n"; + + + my $link_text; # set to an arrayref if found + my @ell_content = @$ell; + splice @ell_content,0,2; # Knock off the 'L' and {} bits + + DEBUG > 3 and print STDERR " Ell content to start: ", + pretty(@ell_content), "\n"; + + + # Look for the "|" -- only in CHILDREN (not all underlings!) + # Like L + DEBUG > 3 and + print STDERR " Peering at L content for a '|' ...\n"; + for(my $j = 0; $j < @ell_content; ++$j) { + next if ref $ell_content[$j]; + DEBUG > 3 and + print STDERR " Peering at L-content text bit \"$ell_content[$j]\" for a '|'.\n"; + + if($ell_content[$j] =~ m/^([^\|]*)\|(.*)$/s) { + my @link_text = ($1); # might be 0-length + $ell_content[$j] = $2; # might be 0-length + + DEBUG > 3 and + print STDERR " FOUND a '|' in it. Splitting into [$1] + [$2]\n"; + + if ($link_text[0] =~ m{[|/]}) { + $self->whine( + $start_line, + "alternative text '$link_text[0]' contains non-escaped | or /" + ); + } + + unshift @link_text, splice @ell_content, 0, $j; + # leaving only things at J and after + @ell_content = grep ref($_)||length($_), @ell_content ; + $link_text = [grep ref($_)||length($_), @link_text ]; + DEBUG > 3 and printf + " So link text is %s\n and remaining ell content is %s\n", + pretty($link_text), pretty(@ell_content); + last; + } + } + + + # Now look for the "/" -- only in CHILDREN (not all underlings!) + # And afterward, anything left in @ell_content will be the raw name + # Like L + my $section_name; # set to arrayref if found + DEBUG > 3 and print STDERR " Peering at L-content for a '/' ...\n"; + for(my $j = 0; $j < @ell_content; ++$j) { + next if ref $ell_content[$j]; + DEBUG > 3 and + print STDERR " Peering at L-content text bit \"$ell_content[$j]\" for a '/'.\n"; + + if($ell_content[$j] =~ m/^([^\/]*)\/(.*)$/s) { + my @section_name = ($2); # might be 0-length + $ell_content[$j] = $1; # might be 0-length + + DEBUG > 3 and + print STDERR " FOUND a '/' in it.", + " Splitting to page [...$1] + section [$2...]\n"; + + push @section_name, splice @ell_content, 1+$j; + # leaving only things before and including J + + @ell_content = grep ref($_)||length($_), @ell_content ; + @section_name = grep ref($_)||length($_), @section_name ; + + # Turn L<.../"foo"> into L<.../foo> + if(@section_name + and !ref($section_name[0]) and !ref($section_name[-1]) + and $section_name[ 0] =~ m/^\"/s + and $section_name[-1] =~ m/\"$/s + and !( # catch weird degenerate case of L<"> ! + @section_name == 1 and $section_name[0] eq '"' + ) + ) { + $section_name[ 0] =~ s/^\"//s; + $section_name[-1] =~ s/\"$//s; + DEBUG > 3 and + print STDERR " Quotes removed: ", pretty(@section_name), "\n"; + } else { + DEBUG > 3 and + print STDERR " No need to remove quotes in ", pretty(@section_name), "\n"; + } + + $section_name = \@section_name; + last; + } + } + + # Turn L<"Foo Bar"> into L + if(!$section_name and @ell_content + and !ref($ell_content[0]) and !ref($ell_content[-1]) + and $ell_content[ 0] =~ m/^\"/s + and $ell_content[-1] =~ m/\"$/s + and !( # catch weird degenerate case of L<"> ! + @ell_content == 1 and $ell_content[0] eq '"' + ) + ) { + $section_name = [splice @ell_content]; + $section_name->[ 0] =~ s/^\"//s; + $section_name->[-1] =~ s/\"$//s; + } + + # Turn L into L. + if(!$section_name and !$link_text and @ell_content + and grep !ref($_) && m/ /s, @ell_content + ) { + $section_name = [splice @ell_content]; + # That's support for the now-deprecated syntax. + # (Maybe generate a warning eventually?) + # Note that it deliberately won't work on L<...|Foo Bar> + } + + + # Now make up the link_text + # L -> L + # L -> L<"Bar"|Bar> + # L -> L<"Bar" in Foo/Foo> + unless($link_text) { + $ell->[1]{'content-implicit'} = 'yes'; + $link_text = []; + push @$link_text, '"', @$section_name, '"' if $section_name; + + if(@ell_content) { + $link_text->[-1] .= ' in ' if $section_name; + push @$link_text, @ell_content; + } + } + + + # And the E resolver will have to deal with all our treeletty things: + + if(@ell_content == 1 and !ref($ell_content[0]) + and $ell_content[0] =~ m{^[^/]+[(][-a-zA-Z0-9]+[)]$}s + ) { + $ell->[1]{'type'} = 'man'; + DEBUG > 3 and print STDERR "Considering this ($ell_content[0]) a man link.\n"; + } else { + $ell->[1]{'type'} = 'pod'; + DEBUG > 3 and print STDERR "Considering this a pod link (not man or url).\n"; + } + + if( defined $section_name ) { + $ell->[1]{'section'} = Pod::Simple::LinkSection->new( + ['', {}, @$section_name] + ); + DEBUG > 3 and print STDERR "L-section content: ", pretty($ell->[1]{'section'}), "\n"; + } + + if( @ell_content ) { + $ell->[1]{'to'} = Pod::Simple::LinkSection->new( + ['', {}, @ell_content] + ); + DEBUG > 3 and print STDERR "L-to content: ", pretty($ell->[1]{'to'}), "\n"; + } + + # And update children to be the link-text: + @$ell = (@$ell[0,1], defined($link_text) ? splice(@$link_text) : ''); + + DEBUG > 2 and print STDERR "End of L-parsing for this node $treelet->[$i]\n"; + + unshift @stack, $treelet->[$i]; # might as well recurse + } + } + + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub _treat_Es { + my($self,@stack) = @_; + + my($i, $treelet, $content, $replacer, $charnum); + my $start_line = $stack[0][1]{'start_line'}; + + # A recursive algorithm implemented iteratively! Whee! + + + # Has frightening side effects on L nodes' attributes. + + #my @ells_to_tweak; + + while($treelet = shift @stack) { + for(my $i = 2; $i < @$treelet; ++$i) { # iterate over children + next unless ref $treelet->[$i]; # text nodes are uninteresting + if($treelet->[$i][0] eq 'L') { + # SPECIAL STUFF for semi-processed L<>'s + + my $thing; + foreach my $attrname ('section', 'to') { + if(defined($thing = $treelet->[$i][1]{$attrname}) and ref $thing) { + unshift @stack, $thing; + DEBUG > 2 and print STDERR " Enqueuing ", + pretty( $treelet->[$i][1]{$attrname} ), + " as an attribute value to tweak.\n"; + } + } + + unshift @stack, $treelet->[$i]; # recurse + next; + } elsif($treelet->[$i][0] ne 'E') { + unshift @stack, $treelet->[$i]; # recurse + next; + } + + DEBUG > 1 and print STDERR "Ogling E node ", pretty($treelet->[$i]), "\n"; + + # bitch if it's empty + if( @{$treelet->[$i]} == 2 + or (@{$treelet->[$i]} == 3 and $treelet->[$i][2] eq '') + ) { + $self->whine( $start_line, "An empty E<>" ); + $treelet->[$i] = 'E<>'; # splice in a literal + next; + } + + # bitch if content is weird + unless(@{$treelet->[$i]} == 3 and !ref($content = $treelet->[$i][2])) { + $self->whine( $start_line, "An E<...> surrounding strange content" ); + $replacer = $treelet->[$i]; # scratch + splice(@$treelet, $i, 1, # fake out a literal + 'E<', + splice(@$replacer,2), # promote its content + '>' + ); + # Don't need to do --$i, as the 'E<' we just added isn't interesting. + next; + } + + DEBUG > 1 and print STDERR "Ogling E<$content>\n"; + + # XXX E<>'s contents *should* be a valid char in the scope of the current + # =encoding directive. Defaults to iso-8859-1, I believe. Fix this in the + # future sometime. + + $charnum = Pod::Escapes::e2charnum($content); + DEBUG > 1 and print STDERR " Considering E<$content> with char ", + defined($charnum) ? $charnum : "undef", ".\n"; + + if(!defined( $charnum )) { + DEBUG > 1 and print STDERR "I don't know how to deal with E<$content>.\n"; + $self->whine( $start_line, "Unknown E content in E<$content>" ); + $replacer = "E<$content>"; # better than nothing + } elsif($charnum >= 255 and !UNICODE) { + $replacer = ASCII ? "\xA4" : "?"; + DEBUG > 1 and print STDERR "This Perl version can't handle ", + "E<$content> (chr $charnum), so replacing with $replacer\n"; + } else { + $replacer = Pod::Escapes::e2char($content); + DEBUG > 1 and print STDERR " Replacing E<$content> with $replacer\n"; + } + + splice(@$treelet, $i, 1, $replacer); # no need to back up $i, tho + } + } + + return; +} + + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub _treat_Ss { + my($self,$treelet) = @_; + + _change_S_to_nbsp($treelet,0) if $self->{'nbsp_for_S'}; + + # TODO: or a change_nbsp_to_S + # Normalizing nbsp's to S is harder: for each text node, make S content + # out of anything matching m/([^ \xA0]*(?:\xA0+[^ \xA0]*)+)/ + + + return; +} + +sub _change_S_to_nbsp { # a recursive function + # Sanely assumes that the top node in the excursion won't be an S node. + my($treelet, $in_s) = @_; + + my $is_s = ('S' eq $treelet->[0]); + $in_s ||= $is_s; # So in_s is on either by this being an S element, + # or by an ancestor being an S element. + + for(my $i = 2; $i < @$treelet; ++$i) { + if(ref $treelet->[$i]) { + if( _change_S_to_nbsp( $treelet->[$i], $in_s ) ) { + my $to_pull_up = $treelet->[$i]; + splice @$to_pull_up,0,2; # ...leaving just its content + splice @$treelet, $i, 1, @$to_pull_up; # Pull up content + $i += @$to_pull_up - 1; # Make $i skip the pulled-up stuff + } + } else { + $treelet->[$i] =~ s/\s/$Pod::Simple::nbsp/g if $in_s; + + # Note that if you apply nbsp_for_S to text, and so turn + # "foo S quux" into "foo bar faz quux", you + # end up with something that fails to say "and don't hyphenate + # any part of 'bar baz'". However, hyphenation is such a vexing + # problem anyway, that most Pod renderers just don't render it + # at all. But if you do want to implement hyphenation, I guess + # that you'd better have nbsp_for_S off. + } + } + + return $is_s; +} + +#----------------------------------------------------------------------------- + +sub _accessorize { # A simple-minded method-maker + no strict 'refs'; + foreach my $attrname (@_) { + next if $attrname =~ m/::/; # a hack + *{caller() . '::' . $attrname} = sub { + use strict; + $Carp::CarpLevel = 1, Carp::croak( + "Accessor usage: \$obj->$attrname() or \$obj->$attrname(\$new_value)" + ) unless (@_ == 1 or @_ == 2) and ref $_[0]; + (@_ == 1) ? $_[0]->{$attrname} + : ($_[0]->{$attrname} = $_[1]); + }; + } + # Ya know, they say accessories make the ensemble! + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +#============================================================================= + +sub filter { + my($class, $source) = @_; + my $new = $class->new; + $new->output_fh(*STDOUT{IO}); + + if(ref($source || '') eq 'SCALAR') { + $new->parse_string_document( $$source ); + } elsif(ref($source)) { # it's a file handle + $new->parse_file($source); + } else { # it's a filename + $new->parse_file($source); + } + + return $new; +} + + +#----------------------------------------------------------------------------- + +sub _out { + # For use in testing: Class->_out($source) + # returns the transformation of $source + + my $class = shift(@_); + + my $mutor = shift(@_) if @_ and ref($_[0] || '') eq 'CODE'; + + DEBUG and print STDERR "\n\n", '#' x 76, + "\nAbout to parse source: {{\n$_[0]\n}}\n\n"; + + + my $parser = ref $class && $class->isa(__PACKAGE__) ? $class : $class->new; + $parser->hide_line_numbers(1); + + my $out = ''; + $parser->output_string( \$out ); + DEBUG and print STDERR " _out to ", \$out, "\n"; + + $mutor->($parser) if $mutor; + + $parser->parse_string_document( $_[0] ); + # use Data::Dumper; print STDERR Dumper($parser), "\n"; + return $out; +} + + +sub _duo { + # For use in testing: Class->_duo($source1, $source2) + # returns the parse trees of $source1 and $source2. + # Good in things like: &ok( Class->duo(... , ...) ); + + my $class = shift(@_); + + Carp::croak "But $class->_duo is useful only in list context!" + unless wantarray; + + my $mutor = shift(@_) if @_ and ref($_[0] || '') eq 'CODE'; + + Carp::croak "But $class->_duo takes two parameters, not: @_" + unless @_ == 2; + + my(@out); + + while( @_ ) { + my $parser = $class->new; + + push @out, ''; + $parser->output_string( \( $out[-1] ) ); + + DEBUG and print STDERR " _duo out to ", $parser->output_string(), + " = $parser->{'output_string'}\n"; + + $parser->hide_line_numbers(1); + $mutor->($parser) if $mutor; + $parser->parse_string_document( shift( @_ ) ); + # use Data::Dumper; print STDERR Dumper($parser), "\n"; + } + + return @out; +} + + + +#----------------------------------------------------------------------------- +1; +__END__ + +TODO: +A start_formatting_code and end_formatting_code methods, which in the +base class call start_L, end_L, start_C, end_C, etc., if they are +defined. + +have the POD FORMATTING ERRORS section note the localtime, and the +version of Pod::Simple. + +option to delete all Es? +option to scream if under-0x20 literals are found in the input, or +under-E<32> E codes are found in the tree. And ditto \x7f-\x9f + +Option to turn highbit characters into their compromised form? (applies +to E parsing too) + +TODO: BOM/encoding things. + +TODO: ascii-compat things in the XML classes? + +############################################################################# +# Pod/ParseUtils.pm -- helpers for POD parsing and conversion +# +# Copyright (C) 1999-2000 by Marek Rouchal. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::ParseUtils; +use strict; + +use vars qw($VERSION); +$VERSION = '1.63'; ## Current version of this package +require 5.005; ## requires this Perl version or later + + +#----------------------------------------------------------------------------- +# Pod::List +# +# class to hold POD list info (=over, =item, =back) +#----------------------------------------------------------------------------- + +package Pod::List; + +use Carp; + + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my %params = @_; + my $self = {%params}; + bless $self, $class; + $self->initialize(); + return $self; +} + +sub initialize { + my $self = shift; + $self->{-file} ||= 'unknown'; + $self->{-start} ||= 'unknown'; + $self->{-indent} ||= 4; # perlpod: "should be the default" + $self->{_items} = []; + $self->{-type} ||= ''; +} + + +# The POD file name the list appears in +sub file { + return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file}; +} + + +# The line in the file the node appears +sub start { + return (@_ > 1) ? ($_[0]->{-start} = $_[1]) : $_[0]->{-start}; +} + + +# indent level +sub indent { + return (@_ > 1) ? ($_[0]->{-indent} = $_[1]) : $_[0]->{-indent}; +} + + +# The type of the list (UL, OL, ...) +sub type { + return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type}; +} + + +# The regular expression to simplify the items +sub rx { + return (@_ > 1) ? ($_[0]->{-rx} = $_[1]) : $_[0]->{-rx}; +} + + +# The individual =items of this list +sub item { + my ($self,$item) = @_; + if(defined $item) { + push(@{$self->{_items}}, $item); + return $item; + } + else { + return @{$self->{_items}}; + } +} + + +# possibility for parsers/translators to store information about the +# lists's parent object +sub parent { + return (@_ > 1) ? ($_[0]->{-parent} = $_[1]) : $_[0]->{-parent}; +} + + +# possibility for parsers/translators to store information about the +# list's object +sub tag { + return (@_ > 1) ? ($_[0]->{-tag} = $_[1]) : $_[0]->{-tag}; +} + +#----------------------------------------------------------------------------- +# Pod::Hyperlink +# +# class to manipulate POD hyperlinks (L<>) +#----------------------------------------------------------------------------- + +package Pod::Hyperlink; + + +use Carp; + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my $self = +{}; + bless $self, $class; + $self->initialize(); + if(defined $_[0]) { + if(ref($_[0])) { + # called with a list of parameters + %$self = %{$_[0]}; + $self->_construct_text(); + } + else { + # called with L<> contents + return unless($self->parse($_[0])); + } + } + return $self; +} + +sub initialize { + my $self = shift; + $self->{-line} ||= 'undef'; + $self->{-file} ||= 'undef'; + $self->{-page} ||= ''; + $self->{-node} ||= ''; + $self->{-alttext} ||= ''; + $self->{-type} ||= 'undef'; + $self->{_warnings} = []; +} + + +sub parse { + my $self = shift; + local($_) = $_[0]; + # syntax check the link and extract destination + my ($alttext,$page,$node,$type,$quoted) = (undef,'','','',0); + + $self->{_warnings} = []; + + # collapse newlines with whitespace + s/\s*\n+\s*/ /g; + + # strip leading/trailing whitespace + if(s/^[\s\n]+//) { + $self->warning('ignoring leading whitespace in link'); + } + if(s/[\s\n]+$//) { + $self->warning('ignoring trailing whitespace in link'); + } + unless(length($_)) { + _invalid_link('empty link'); + return; + } + + ## Check for different possibilities. This is tedious and error-prone + # we match all possibilities (alttext, page, section/item) + #warn "DEBUG: link=$_\n"; + + # only page + # problem: a lot of people use (), or (1) or the like to indicate + # man page sections. But this collides with L that is supposed + # to point to an internal function... + my $page_rx = '[\w.-]+(?:::[\w.-]+)*(?:[(](?:\d\w*|)[)]|)'; + # page name only + if(/^($page_rx)$/o) { + $page = $1; + $type = 'page'; + } + # alttext, page and "section" + elsif(m{^(.*?)\s*[|]\s*($page_rx)\s*/\s*"(.+)"$}o) { + ($alttext, $page, $node) = ($1, $2, $3); + $type = 'section'; + $quoted = 1; #... therefore | and / are allowed + } + # alttext and page + elsif(/^(.*?)\s*[|]\s*($page_rx)$/o) { + ($alttext, $page) = ($1, $2); + $type = 'page'; + } + # alttext and "section" + elsif(m{^(.*?)\s*[|]\s*(?:/\s*|)"(.+)"$}) { + ($alttext, $node) = ($1,$2); + $type = 'section'; + $quoted = 1; + } + # page and "section" + elsif(m{^($page_rx)\s*/\s*"(.+)"$}o) { + ($page, $node) = ($1, $2); + $type = 'section'; + $quoted = 1; + } + # page and item + elsif(m{^($page_rx)\s*/\s*(.+)$}o) { + ($page, $node) = ($1, $2); + $type = 'item'; + } + # only "section" + elsif(m{^/?"(.+)"$}) { + $node = $1; + $type = 'section'; + $quoted = 1; + } + # only item + elsif(m{^\s*/(.+)$}) { + $node = $1; + $type = 'item'; + } + + # non-standard: Hyperlink with alt-text - doesn't remove protocol prefix, maybe it should? + elsif(/^ \s* (.*?) \s* [|] \s* (\w+:[^:\s] [^\s|]*?) \s* $/ix) { + ($alttext,$node) = ($1,$2); + $type = 'hyperlink'; + } + + # non-standard: Hyperlink + elsif(/^(\w+:[^:\s]\S*)$/i) { + $node = $1; + $type = 'hyperlink'; + } + # alttext, page and item + elsif(m{^(.*?)\s*[|]\s*($page_rx)\s*/\s*(.+)$}o) { + ($alttext, $page, $node) = ($1, $2, $3); + $type = 'item'; + } + # alttext and item + elsif(m{^(.*?)\s*[|]\s*/(.+)$}) { + ($alttext, $node) = ($1,$2); + } + # must be an item or a "malformed" section (without "") + else { + $node = $_; + $type = 'item'; + } + # collapse whitespace in nodes + $node =~ s/\s+/ /gs; + + # empty alternative text expands to node name + if(defined $alttext) { + if(!length($alttext)) { + $alttext = $node || $page; + } + } + else { + $alttext = ''; + } + + if($page =~ /[(]\w*[)]$/) { + $self->warning("(section) in '$page' deprecated"); + } + if(!$quoted && $node =~ m{[|/]} && $type ne 'hyperlink') { + $self->warning("node '$node' contains non-escaped | or /"); + } + if($alttext =~ m{[|/]}) { + $self->warning("alternative text '$node' contains non-escaped | or /"); + } + $self->{-page} = $page; + $self->{-node} = $node; + $self->{-alttext} = $alttext; + #warn "DEBUG: page=$page section=$section item=$item alttext=$alttext\n"; + $self->{-type} = $type; + $self->_construct_text(); + 1; +} + +sub _construct_text { + my $self = shift; + my $alttext = $self->alttext(); + my $type = $self->type(); + my $section = $self->node(); + my $page = $self->page(); + my $page_ext = ''; + $page =~ s/([(]\w*[)])$// && ($page_ext = $1); + if($alttext) { + $self->{_text} = $alttext; + } + elsif($type eq 'hyperlink') { + $self->{_text} = $section; + } + else { + $self->{_text} = ($section || '') . + (($page && $section) ? ' in ' : '') . + "$page$page_ext"; + } + # for being marked up later + # use the non-standard markers P<> and Q<>, so that the resulting + # text can be parsed by the translators. It's their job to put + # the correct hypertext around the linktext + if($alttext) { + $self->{_markup} = "Q<$alttext>"; + } + elsif($type eq 'hyperlink') { + $self->{_markup} = "Q<$section>"; + } + else { + $self->{_markup} = (!$section ? '' : "Q<$section>") . + ($page ? ($section ? ' in ':'') . "P<$page>$page_ext" : ''); + } +} + + +#' retrieve/set markuped text +sub markup { + return (@_ > 1) ? ($_[0]->{_markup} = $_[1]) : $_[0]->{_markup}; +} + + +# The complete link's text +sub text { + return $_[0]->{_text}; +} + + +# Set/retrieve warnings +sub warning { + my $self = shift; + if(@_) { + push(@{$self->{_warnings}}, @_); + return @_; + } + return @{$self->{_warnings}}; +} + + +# The line in the file the link appears +sub line { + return (@_ > 1) ? ($_[0]->{-line} = $_[1]) : $_[0]->{-line}; +} + +# The POD file name the link appears in +sub file { + return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file}; +} + + +# The POD page the link appears on +sub page { + if (@_ > 1) { + $_[0]->{-page} = $_[1]; + $_[0]->_construct_text(); + } + return $_[0]->{-page}; +} + + +# The link destination +sub node { + if (@_ > 1) { + $_[0]->{-node} = $_[1]; + $_[0]->_construct_text(); + } + return $_[0]->{-node}; +} + + +# Potential alternative text +sub alttext { + if (@_ > 1) { + $_[0]->{-alttext} = $_[1]; + $_[0]->_construct_text(); + } + return $_[0]->{-alttext}; +} + + +# The type: item or headn +sub type { + return (@_ > 1) ? ($_[0]->{-type} = $_[1]) : $_[0]->{-type}; +} + + +# The link itself +sub link { + my $self = shift; + my $link = $self->page() || ''; + if($self->node()) { + my $node = $self->node(); + $node =~ s/\|/E/g; + $node =~ s{/}{E}g; + if($self->type() eq 'section') { + $link .= ($link ? '/' : '') . '"' . $node . '"'; + } + elsif($self->type() eq 'hyperlink') { + $link = $self->node(); + } + else { # item + $link .= '/' . $node; + } + } + if($self->alttext()) { + my $text = $self->alttext(); + $text =~ s/\|/E/g; + $text =~ s{/}{E}g; + $link = "$text|$link"; + } + return $link; +} + +sub _invalid_link { + my ($msg) = @_; + # this sets @_ + #eval { die "$msg\n" }; + #chomp $@; + $@ = $msg; # this seems to work, too! + return; +} + +#----------------------------------------------------------------------------- +# Pod::Cache +# +# class to hold POD page details +#----------------------------------------------------------------------------- + +package Pod::Cache; + + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my $self = []; + bless $self, $class; + return $self; +} + + +sub item { + my ($self,%param) = @_; + if(%param) { + my $item = Pod::Cache::Item->new(%param); + push(@$self, $item); + return $item; + } + else { + return @{$self}; + } +} + + +sub find_page { + my ($self,$page) = @_; + foreach(@$self) { + if($_->page() eq $page) { + return $_; + } + } + return; +} + +package Pod::Cache::Item; + + +sub new { + my $this = shift; + my $class = ref($this) || $this; + my %params = @_; + my $self = {%params}; + bless $self, $class; + $self->initialize(); + return $self; +} + +sub initialize { + my $self = shift; + $self->{-nodes} = [] unless(defined $self->{-nodes}); +} + + +# The POD page +sub page { + return (@_ > 1) ? ($_[0]->{-page} = $_[1]) : $_[0]->{-page}; +} + + +# The POD description, taken out of NAME if present +sub description { + return (@_ > 1) ? ($_[0]->{-description} = $_[1]) : $_[0]->{-description}; +} + + +# The file path +sub path { + return (@_ > 1) ? ($_[0]->{-path} = $_[1]) : $_[0]->{-path}; +} + + +# The POD file name +sub file { + return (@_ > 1) ? ($_[0]->{-file} = $_[1]) : $_[0]->{-file}; +} + + +# The POD nodes +sub nodes { + my ($self,@nodes) = @_; + if(@nodes) { + push(@{$self->{-nodes}}, @nodes); + return @nodes; + } + else { + return @{$self->{-nodes}}; + } +} + + +sub find_node { + my ($self,$node) = @_; + my @search; + push(@search, @{$self->{-nodes}}) if($self->{-nodes}); + push(@search, @{$self->{-idx}}) if($self->{-idx}); + foreach(@search) { + if($_->[0] eq $node) { + return $_->[1]; # id + } + } + return; +} + + +# The POD index entries +sub idx { + my ($self,@idx) = @_; + if(@idx) { + push(@{$self->{-idx}}, @idx); + return @idx; + } + else { + return @{$self->{-idx}}; + } +} + + +1; +############################################################################# +# Pod/Parser.pm -- package which defines a base class for parsing POD docs. +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Parser; +use strict; + +## These "variables" are used as local "glob aliases" for performance +use vars qw($VERSION @ISA %myData %myOpts @input_stack); +$VERSION = '1.63'; ## Current version of this package +require 5.005; ## requires this Perl version or later + +############################################################################# + + +############################################################################# + +#use diagnostics; +use Pod::InputObjects; +use Carp; +use Exporter; +BEGIN { + if ($] < 5.006) { + require Symbol; + import Symbol; + } +} +@ISA = qw(Exporter); + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub command { + my ($self, $cmd, $text, $line_num, $pod_para) = @_; + ## Just treat this like a textblock + $self->textblock($pod_para->raw_text(), $line_num, $pod_para); +} + +##--------------------------------------------------------------------------- + + +sub verbatim { + my ($self, $text, $line_num, $pod_para) = @_; + my $out_fh = $self->{_OUTPUT}; + print $out_fh $text; +} + +##--------------------------------------------------------------------------- + + +sub textblock { + my ($self, $text, $line_num, $pod_para) = @_; + my $out_fh = $self->{_OUTPUT}; + print $out_fh $self->interpolate($text, $line_num); +} + +##--------------------------------------------------------------------------- + + +sub interior_sequence { + my ($self, $seq_cmd, $seq_arg, $pod_seq) = @_; + ## Just return the raw text of the interior sequence + return $pod_seq->raw_text(); +} + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub new { + ## Determine if we were called via an object-ref or a classname + my ($this,%params) = @_; + my $class = ref($this) || $this; + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. + my $self = { %params }; + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + $self->initialize(); + return $self; +} + +##--------------------------------------------------------------------------- + + +sub initialize { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + + +sub begin_pod { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + + +sub begin_input { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + + +sub end_input { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + + +sub end_pod { + #my $self = shift; + #return; +} + +##--------------------------------------------------------------------------- + + +sub preprocess_line { + my ($self, $text, $line_num) = @_; + return $text; +} + +##--------------------------------------------------------------------------- + + +sub preprocess_paragraph { + my ($self, $text, $line_num) = @_; + return $text; +} + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub parse_text { + my $self = shift; + local $_ = ''; + + ## Get options and set any defaults + my %opts = (ref $_[0]) ? %{ shift() } : (); + my $expand_seq = $opts{'-expand_seq'} || undef; + my $expand_text = $opts{'-expand_text'} || undef; + my $expand_ptree = $opts{'-expand_ptree'} || undef; + + my $text = shift; + my $line = shift; + my $file = $self->input_file(); + my $cmd = ""; + + ## Convert method calls into closures, for our convenience + my $xseq_sub = $expand_seq; + my $xtext_sub = $expand_text; + my $xptree_sub = $expand_ptree; + if (defined $expand_seq and $expand_seq eq 'interior_sequence') { + ## If 'interior_sequence' is the method to use, we have to pass + ## more than just the sequence object, we also need to pass the + ## sequence name and text. + $xseq_sub = sub { + my ($sself, $iseq) = @_; + my $args = join('', $iseq->parse_tree->children); + return $sself->interior_sequence($iseq->name, $args, $iseq); + }; + } + ref $xseq_sub or $xseq_sub = sub { shift()->$expand_seq(@_) }; + ref $xtext_sub or $xtext_sub = sub { shift()->$expand_text(@_) }; + ref $xptree_sub or $xptree_sub = sub { shift()->$expand_ptree(@_) }; + + ## Keep track of the "current" interior sequence, and maintain a stack + ## of "in progress" sequences. + ## + ## NOTE that we push our own "accumulator" at the very beginning of the + ## stack. It's really a parse-tree, not a sequence; but it implements + ## the methods we need so we can use it to gather-up all the sequences + ## and strings we parse. Thus, by the end of our parsing, it should be + ## the only thing left on our stack and all we have to do is return it! + ## + my $seq = Pod::ParseTree->new(); + my @seq_stack = ($seq); + my ($ldelim, $rdelim) = ('', ''); + + ## Iterate over all sequence starts text (NOTE: split with + ## capturing parens keeps the delimiters) + $_ = $text; + my @tokens = split /([A-Z]<(?:<+(?:\r?\n|[ \t]))?)/; + while ( @tokens ) { + $_ = shift @tokens; + ## Look for the beginning of a sequence + if ( /^([A-Z])(<(?:<+(?:\r?\n|[ \t]))?)$/ ) { + ## Push a new sequence onto the stack of those "in-progress" + my $ldelim_orig; + ($cmd, $ldelim_orig) = ($1, $2); + ($ldelim = $ldelim_orig) =~ s/\s+$//; + ($rdelim = $ldelim) =~ tr//; + $seq = Pod::InteriorSequence->new( + -name => $cmd, + -ldelim => $ldelim_orig, -rdelim => $rdelim, + -file => $file, -line => $line + ); + (@seq_stack > 1) and $seq->nested($seq_stack[-1]); + push @seq_stack, $seq; + } + ## Look for sequence ending + elsif ( @seq_stack > 1 ) { + ## Make sure we match the right kind of closing delimiter + my ($seq_end, $post_seq) = ('', ''); + if ( ($ldelim eq '<' and /\A(.*?)(>)/s) + or /\A(.*?)(\s+$rdelim)/s ) + { + ## Found end-of-sequence, capture the interior and the + ## closing the delimiter, and put the rest back on the + ## token-list + $post_seq = substr($_, length($1) + length($2)); + ($_, $seq_end) = ($1, $2); + (length $post_seq) and unshift @tokens, $post_seq; + } + if (length) { + ## In the middle of a sequence, append this text to it, and + ## don't forget to "expand" it if that's what the caller wanted + $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_); + $_ .= $seq_end; + } + if (length $seq_end) { + ## End of current sequence, record terminating delimiter + $seq->rdelim($seq_end); + ## Pop it off the stack of "in progress" sequences + pop @seq_stack; + ## Append result to its parent in current parse tree + $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) + : $seq); + ## Remember the current cmd-name and left-delimiter + if(@seq_stack > 1) { + $cmd = $seq_stack[-1]->name; + $ldelim = $seq_stack[-1]->ldelim; + $rdelim = $seq_stack[-1]->rdelim; + } else { + $cmd = $ldelim = $rdelim = ''; + } + } + } + elsif (length) { + ## In the middle of a sequence, append this text to it, and + ## don't forget to "expand" it if that's what the caller wanted + $seq->append($expand_text ? &$xtext_sub($self,$_,$seq) : $_); + } + ## Keep track of line count + $line += /\n/; + ## Remember the "current" sequence + $seq = $seq_stack[-1]; + } + + ## Handle unterminated sequences + my $errorsub = (@seq_stack > 1) ? $self->errorsub() : undef; + while (@seq_stack > 1) { + ($cmd, $file, $line) = ($seq->name, $seq->file_line); + $ldelim = $seq->ldelim; + ($rdelim = $ldelim) =~ tr//; + $rdelim =~ s/^(\S+)(\s*)$/$2$1/; + pop @seq_stack; + my $errmsg = "*** ERROR: unterminated ${cmd}${ldelim}...${rdelim}". + " at line $line in file $file\n"; + (ref $errorsub) and &{$errorsub}($errmsg) + or (defined $errorsub) and $self->$errorsub($errmsg) + or carp($errmsg); + $seq_stack[-1]->append($expand_seq ? &$xseq_sub($self,$seq) : $seq); + $seq = $seq_stack[-1]; + } + + ## Return the resulting parse-tree + my $ptree = (pop @seq_stack)->parse_tree; + return $expand_ptree ? &$xptree_sub($self, $ptree) : $ptree; +} + +##--------------------------------------------------------------------------- + + +sub interpolate { + my($self, $text, $line_num) = @_; + my %parse_opts = ( -expand_seq => 'interior_sequence' ); + my $ptree = $self->parse_text( \%parse_opts, $text, $line_num ); + return join '', $ptree->children(); +} + +##--------------------------------------------------------------------------- + + +sub parse_paragraph { + my ($self, $text, $line_num) = @_; + local *myData = $self; ## alias to avoid deref-ing overhead + local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options + local $_; + + ## See if we want to preprocess nonPOD paragraphs as well as POD ones. + my $wantNonPods = $myOpts{'-want_nonPODs'}; + + ## Update cutting status + $myData{_CUTTING} = 0 if $text =~ /^={1,2}\S/; + + ## Perform any desired preprocessing if we wanted it this early + $wantNonPods and $text = $self->preprocess_paragraph($text, $line_num); + + ## Ignore up until next POD directive if we are cutting + return if $myData{_CUTTING}; + + ## Now we know this is block of text in a POD section! + + ##----------------------------------------------------------------- + ## This is a hook (hack ;-) for Pod::Select to do its thing without + ## having to override methods, but also without Pod::Parser assuming + ## $self is an instance of Pod::Select (if the _SELECTED_SECTIONS + ## field exists then we assume there is an is_selected() method for + ## us to invoke (calling $self->can('is_selected') could verify this + ## but that is more overhead than I want to incur) + ##----------------------------------------------------------------- + + ## Ignore this block if it isn't in one of the selected sections + if (exists $myData{_SELECTED_SECTIONS}) { + $self->is_selected($text) or return ($myData{_CUTTING} = 1); + } + + ## If we haven't already, perform any desired preprocessing and + ## then re-check the "cutting" state + unless ($wantNonPods) { + $text = $self->preprocess_paragraph($text, $line_num); + return 1 unless ((defined $text) and (length $text)); + return 1 if ($myData{_CUTTING}); + } + + ## Look for one of the three types of paragraphs + my ($pfx, $cmd, $arg, $sep) = ('', '', '', ''); + my $pod_para = undef; + if ($text =~ /^(={1,2})(?=\S)/) { + ## Looks like a command paragraph. Capture the command prefix used + ## ("=" or "=="), as well as the command-name, its paragraph text, + ## and whatever sequence of characters was used to separate them + $pfx = $1; + $_ = substr($text, length $pfx); + ($cmd, $sep, $text) = split /(\s+)/, $_, 2; + $sep = '' unless defined $sep; + $text = '' unless defined $text; + ## If this is a "cut" directive then we don't need to do anything + ## except return to "cutting" mode. + if ($cmd eq 'cut') { + $myData{_CUTTING} = 1; + return unless $myOpts{'-process_cut_cmd'}; + } + } + ## Save the attributes indicating how the command was specified. + $pod_para = new Pod::Paragraph( + -name => $cmd, + -text => $text, + -prefix => $pfx, + -separator => $sep, + -file => $myData{_INFILE}, + -line => $line_num + ); + # ## Invoke appropriate callbacks + # if (exists $myData{_CALLBACKS}) { + # ## Look through the callback list, invoke callbacks, + # ## then see if we need to do the default actions + # ## (invoke_callbacks will return true if we do). + # return 1 unless $self->invoke_callbacks($cmd, $text, $line_num, $pod_para); + # } + + # If the last paragraph ended in whitespace, and we're not between verbatim blocks, carp + if ($myData{_WHITESPACE} and $myOpts{'-warnings'} + and not ($text =~ /^\s+/ and ($myData{_PREVIOUS}||"") eq "verbatim")) { + my $errorsub = $self->errorsub(); + my $line = $line_num - 1; + my $errmsg = "*** WARNING: line containing nothing but whitespace". + " in paragraph at line $line in file $myData{_INFILE}\n"; + (ref $errorsub) and &{$errorsub}($errmsg) + or (defined $errorsub) and $self->$errorsub($errmsg) + or carp($errmsg); + } + + if (length $cmd) { + ## A command paragraph + $self->command($cmd, $text, $line_num, $pod_para); + $myData{_PREVIOUS} = $cmd; + } + elsif ($text =~ /^\s+/) { + ## Indented text - must be a verbatim paragraph + $self->verbatim($text, $line_num, $pod_para); + $myData{_PREVIOUS} = "verbatim"; + } + else { + ## Looks like an ordinary block of text + $self->textblock($text, $line_num, $pod_para); + $myData{_PREVIOUS} = "textblock"; + } + + # Update the whitespace for the next time around + #$myData{_WHITESPACE} = $text =~ /^[^\S\r\n]+\Z/m ? 1 : 0; + $myData{_WHITESPACE} = $text =~ /^[^\S\r\n]+\r*\Z/m ? 1 : 0; + + return 1; +} + +##--------------------------------------------------------------------------- + + +sub parse_from_filehandle { + my $self = shift; + my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : (); + my ($in_fh, $out_fh) = @_; + $in_fh = \*STDIN unless ($in_fh); + local *myData = $self; ## alias to avoid deref-ing overhead + local *myOpts = ($myData{_PARSEOPTS} ||= {}); ## get parse-options + local $_; + + ## Put this stream at the top of the stack and do beginning-of-input + ## processing. NOTE that $in_fh might be reset during this process. + my $topstream = $self->_push_input_stream($in_fh, $out_fh); + (exists $opts{-cutting}) and $self->cutting( $opts{-cutting} ); + + ## Initialize line/paragraph + my ($textline, $paragraph) = ('', ''); + my ($nlines, $plines) = (0, 0); + + ## Use <$fh> instead of $fh->getline where possible (for speed) + $_ = ref $in_fh; + my $tied_fh = (/^(?:GLOB|FileHandle|IO::\w+)$/ or tied $in_fh); + + ## Read paragraphs line-by-line + while (defined ($textline = $tied_fh ? <$in_fh> : $in_fh->getline)) { + $textline = $self->preprocess_line($textline, ++$nlines); + next unless ((defined $textline) && (length $textline)); + + if ((! length $paragraph) && ($textline =~ /^==/)) { + ## '==' denotes a one-line command paragraph + $paragraph = $textline; + $plines = 1; + $textline = ''; + } else { + ## Append this line to the current paragraph + $paragraph .= $textline; + ++$plines; + } + + ## See if this line is blank and ends the current paragraph. + ## If it isn't, then keep iterating until it is. + next unless (($textline =~ /^[^\S\r\n]*[\r\n]*$/) + && (length $paragraph)); + + ## Now process the paragraph + parse_paragraph($self, $paragraph, ($nlines - $plines) + 1); + $paragraph = ''; + $plines = 0; + } + ## Don't forget about the last paragraph in the file + if (length $paragraph) { + parse_paragraph($self, $paragraph, ($nlines - $plines) + 1) + } + + ## Now pop the input stream off the top of the input stack. + $self->_pop_input_stream(); +} + +##--------------------------------------------------------------------------- + + +sub parse_from_file { + my $self = shift; + my %opts = (ref $_[0] eq 'HASH') ? %{ shift() } : (); + my ($infile, $outfile) = @_; + my ($in_fh, $out_fh); + if ($] < 5.006) { + ($in_fh, $out_fh) = (gensym(), gensym()); + } + my ($close_input, $close_output) = (0, 0); + local *myData = $self; + local *_; + + ## Is $infile a filename or a (possibly implied) filehandle + if (defined $infile && ref $infile) { + if (ref($infile) =~ /^(SCALAR|ARRAY|HASH|CODE|REF)$/) { + croak "Input from $1 reference not supported!\n"; + } + ## Must be a filehandle-ref (or else assume its a ref to an object + ## that supports the common IO read operations). + $myData{_INFILE} = ${$infile}; + $in_fh = $infile; + } + elsif (!defined($infile) || !length($infile) || ($infile eq '-') + || ($infile =~ /^<&(?:STDIN|0)$/i)) + { + ## Not a filename, just a string implying STDIN + $infile ||= '-'; + $myData{_INFILE} = ''; + $in_fh = \*STDIN; + } + else { + ## We have a filename, open it for reading + $myData{_INFILE} = $infile; + open($in_fh, "< $infile") or + croak "Can't open $infile for reading: $!\n"; + $close_input = 1; + } + + ## NOTE: we need to be *very* careful when "defaulting" the output + ## file. We only want to use a default if this is the beginning of + ## the entire document (but *not* if this is an included file). We + ## determine this by seeing if the input stream stack has been set-up + ## already + + ## Is $outfile a filename, a (possibly implied) filehandle, maybe a ref? + if (ref $outfile) { + ## we need to check for ref() first, as other checks involve reading + if (ref($outfile) =~ /^(ARRAY|HASH|CODE)$/) { + croak "Output to $1 reference not supported!\n"; + } + elsif (ref($outfile) eq 'SCALAR') { +# # NOTE: IO::String isn't a part of the perl distribution, +# # so probably we shouldn't support this case... +# require IO::String; +# $myData{_OUTFILE} = "$outfile"; +# $out_fh = IO::String->new($outfile); + croak "Output to SCALAR reference not supported!\n"; + } + else { + ## Must be a filehandle-ref (or else assume its a ref to an + ## object that supports the common IO write operations). + $myData{_OUTFILE} = ${$outfile}; + $out_fh = $outfile; + } + } + elsif (!defined($outfile) || !length($outfile) || ($outfile eq '-') + || ($outfile =~ /^>&?(?:STDOUT|1)$/i)) + { + if (defined $myData{_TOP_STREAM}) { + $out_fh = $myData{_OUTPUT}; + } + else { + ## Not a filename, just a string implying STDOUT + $outfile ||= '-'; + $myData{_OUTFILE} = ''; + $out_fh = \*STDOUT; + } + } + elsif ($outfile =~ /^>&(STDERR|2)$/i) { + ## Not a filename, just a string implying STDERR + $myData{_OUTFILE} = ''; + $out_fh = \*STDERR; + } + else { + ## We have a filename, open it for writing + $myData{_OUTFILE} = $outfile; + (-d $outfile) and croak "$outfile is a directory, not POD input!\n"; + open($out_fh, "> $outfile") or + croak "Can't open $outfile for writing: $!\n"; + $close_output = 1; + } + + ## Whew! That was a lot of work to set up reasonably/robust behavior + ## in the case of a non-filename for reading and writing. Now we just + ## have to parse the input and close the handles when we're finished. + $self->parse_from_filehandle(\%opts, $in_fh, $out_fh); + + $close_input and + close($in_fh) || croak "Can't close $infile after reading: $!\n"; + $close_output and + close($out_fh) || croak "Can't close $outfile after writing: $!\n"; +} + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub errorsub { + return (@_ > 1) ? ($_[0]->{_ERRORSUB} = $_[1]) : $_[0]->{_ERRORSUB}; +} + +##--------------------------------------------------------------------------- + + +sub cutting { + return (@_ > 1) ? ($_[0]->{_CUTTING} = $_[1]) : $_[0]->{_CUTTING}; +} + +##--------------------------------------------------------------------------- + +##--------------------------------------------------------------------------- + + +sub parseopts { + local *myData = shift; + local *myOpts = ($myData{_PARSEOPTS} ||= {}); + return %myOpts if (@_ == 0); + if (@_ == 1) { + local $_ = shift; + return ref($_) ? $myData{_PARSEOPTS} = $_ : $myOpts{$_}; + } + my @newOpts = (%myOpts, @_); + $myData{_PARSEOPTS} = { @newOpts }; +} + +##--------------------------------------------------------------------------- + + +sub output_file { + return $_[0]->{_OUTFILE}; +} + +##--------------------------------------------------------------------------- + + +sub output_handle { + return $_[0]->{_OUTPUT}; +} + +##--------------------------------------------------------------------------- + + +sub input_file { + return $_[0]->{_INFILE}; +} + +##--------------------------------------------------------------------------- + + +sub input_handle { + return $_[0]->{_INPUT}; +} + +##--------------------------------------------------------------------------- + + +sub input_streams { + return $_[0]->{_INPUT_STREAMS}; +} + +##--------------------------------------------------------------------------- + + +sub top_stream { + return $_[0]->{_TOP_STREAM} || undef; +} + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub _push_input_stream { + my ($self, $in_fh, $out_fh) = @_; + local *myData = $self; + + ## Initialize stuff for the entire document if this is *not* + ## an included file. + ## + ## NOTE: we need to be *very* careful when "defaulting" the output + ## filehandle. We only want to use a default value if this is the + ## beginning of the entire document (but *not* if this is an included + ## file). + unless (defined $myData{_TOP_STREAM}) { + $out_fh = \*STDOUT unless (defined $out_fh); + $myData{_CUTTING} = 1; ## current "cutting" state + $myData{_INPUT_STREAMS} = []; ## stack of all input streams + } + + ## Initialize input indicators + $myData{_OUTFILE} = '(unknown)' unless (defined $myData{_OUTFILE}); + $myData{_OUTPUT} = $out_fh if (defined $out_fh); + $in_fh = \*STDIN unless (defined $in_fh); + $myData{_INFILE} = '(unknown)' unless (defined $myData{_INFILE}); + $myData{_INPUT} = $in_fh; + my $input_top = $myData{_TOP_STREAM} + = new Pod::InputSource( + -name => $myData{_INFILE}, + -handle => $in_fh, + -was_cutting => $myData{_CUTTING} + ); + local *input_stack = $myData{_INPUT_STREAMS}; + push(@input_stack, $input_top); + + ## Perform beginning-of-document and/or beginning-of-input processing + $self->begin_pod() if (@input_stack == 1); + $self->begin_input(); + + return $input_top; +} + +##--------------------------------------------------------------------------- + + +sub _pop_input_stream { + my ($self) = @_; + local *myData = $self; + local *input_stack = $myData{_INPUT_STREAMS}; + + ## Perform end-of-input and/or end-of-document processing + $self->end_input() if (@input_stack > 0); + $self->end_pod() if (@input_stack == 1); + + ## Restore cutting state to whatever it was before we started + ## parsing this file. + my $old_top = pop(@input_stack); + $myData{_CUTTING} = $old_top->was_cutting(); + + ## Don't forget to reset the input indicators + my $input_top = undef; + if (@input_stack > 0) { + $input_top = $myData{_TOP_STREAM} = $input_stack[-1]; + $myData{_INFILE} = $input_top->name(); + $myData{_INPUT} = $input_top->handle(); + } else { + delete $myData{_TOP_STREAM}; + delete $myData{_INPUT_STREAMS}; + } + + return $input_top; +} + +############################################################################# + + +1; +# vim: ts=4 sw=4 et +package Pod::Html; +use strict; +require Exporter; + +our $VERSION = 1.24; +our @ISA = qw(Exporter); +our @EXPORT = qw(pod2html htmlify); +our @EXPORT_OK = qw(anchorify relativize_url); + +use Carp; +use Config; +use Cwd; +use File::Basename; +use File::Spec; +use File::Spec::Unix; +use Getopt::Long; +use Pod::Simple::Search; +use Pod::Simple::SimpleTree (); +use locale; # make \w work right in non-ASCII lands + + +# This sub duplicates the guts of Pod::Simple::FromTree. We could have +# used that module, except that it would have been a non-core dependency. +sub feed_tree_to_parser { + my($parser, $tree) = @_; + if(ref($tree) eq "") { + $parser->_handle_text($tree); + } elsif(!($tree->[0] eq "X" && $parser->nix_X_codes)) { + $parser->_handle_element_start($tree->[0], $tree->[1]); + feed_tree_to_parser($parser, $_) foreach @{$tree}[2..$#$tree]; + $parser->_handle_element_end($tree->[0]); + } +} + +my $Cachedir; +my $Dircache; +my($Htmlroot, $Htmldir, $Htmlfile, $Htmlfileurl); +my($Podfile, @Podpath, $Podroot); +my $Poderrors; +my $Css; + +my $Recurse; +my $Quiet; +my $Verbose; +my $Doindex; + +my $Backlink; + +my($Title, $Header); + +my %Pages = (); # associative array used to find the location + # of pages referenced by L<> links. + +my $Curdir = File::Spec->curdir; + +init_globals(); + +sub init_globals { + $Cachedir = "."; # The directory to which directory caches + # will be written. + + $Dircache = "pod2htmd.tmp"; + + $Htmlroot = "/"; # http-server base directory from which all + # relative paths in $podpath stem. + $Htmldir = ""; # The directory to which the html pages + # will (eventually) be written. + $Htmlfile = ""; # write to stdout by default + $Htmlfileurl = ""; # The url that other files would use to + # refer to this file. This is only used + # to make relative urls that point to + # other files. + + $Poderrors = 1; + $Podfile = ""; # read from stdin by default + @Podpath = (); # list of directories containing library pods. + $Podroot = $Curdir; # filesystem base directory from which all + # relative paths in $podpath stem. + $Css = ''; # Cascading style sheet + $Recurse = 1; # recurse on subdirectories in $podpath. + $Quiet = 0; # not quiet by default + $Verbose = 0; # not verbose by default + $Doindex = 1; # non-zero if we should generate an index + $Backlink = 0; # no backlinks added by default + $Header = 0; # produce block header/footer + $Title = undef; # title to give the pod(s) +} + +sub pod2html { + local(@ARGV) = @_; + local $_; + + init_globals(); + parse_command_line(); + + # prevent '//' in urls + $Htmlroot = "" if $Htmlroot eq "/"; + $Htmldir =~ s#/\z##; + + if ( $Htmlroot eq '' + && defined( $Htmldir ) + && $Htmldir ne '' + && substr( $Htmlfile, 0, length( $Htmldir ) ) eq $Htmldir + ) { + # Set the 'base' url for this file, so that we can use it + # as the location from which to calculate relative links + # to other files. If this is '', then absolute links will + # be used throughout. + #$Htmlfileurl = "$Htmldir/" . substr( $Htmlfile, length( $Htmldir ) + 1); + # Is the above not just "$Htmlfileurl = $Htmlfile"? + $Htmlfileurl = Pod::Html::_unixify($Htmlfile); + + } + + # load or generate/cache %Pages + unless (get_cache($Dircache, \@Podpath, $Podroot, $Recurse)) { + # generate %Pages + my $pwd = getcwd(); + chdir($Podroot) || + die "$0: error changing to directory $Podroot: $!\n"; + + # find all pod modules/pages in podpath, store in %Pages + # - callback used to remove Podroot and extension from each file + # - laborious to allow '.' in dirnames (e.g., /usr/share/perl/5.14.1) + Pod::Simple::Search->new->inc(0)->verbose($Verbose)->laborious(1) + ->callback(\&_save_page)->recurse($Recurse)->survey(@Podpath); + + chdir($pwd) || die "$0: error changing to directory $pwd: $!\n"; + + # cache the directory list for later use + warn "caching directories for later use\n" if $Verbose; + open my $cache, '>', $Dircache + or die "$0: error open $Dircache for writing: $!\n"; + + print $cache join(":", @Podpath) . "\n$Podroot\n"; + my $_updirs_only = ($Podroot =~ /\.\./) && !($Podroot =~ /[^\.\\\/]/); + foreach my $key (keys %Pages) { + if($_updirs_only) { + my $_dirlevel = $Podroot; + while($_dirlevel =~ /\.\./) { + $_dirlevel =~ s/\.\.//; + # Assume $Pages{$key} has '/' separators (html dir separators). + $Pages{$key} =~ s/^[\w\s\-\.]+\///; + } + } + print $cache "$key $Pages{$key}\n"; + } + + close $cache or die "error closing $Dircache: $!"; + } + + my $input; + unless (@ARGV && $ARGV[0]) { + if ($Podfile and $Podfile ne '-') { + $input = $Podfile; + } else { + $input = '-'; # XXX: make a test case for this + } + } else { + $Podfile = $ARGV[0]; + $input = *ARGV; + } + + # set options for input parser + my $parser = Pod::Simple::SimpleTree->new; + $parser->codes_in_verbatim(0); + $parser->accept_targets(qw(html HTML)); + $parser->no_errata_section(!$Poderrors); # note the inverse + + warn "Converting input file $Podfile\n" if $Verbose; + my $podtree = $parser->parse_file($input)->root; + + unless(defined $Title) { + if($podtree->[0] eq "Document" && ref($podtree->[2]) eq "ARRAY" && + $podtree->[2]->[0] eq "head1" && @{$podtree->[2]} == 3 && + ref($podtree->[2]->[2]) eq "" && $podtree->[2]->[2] eq "NAME" && + ref($podtree->[3]) eq "ARRAY" && $podtree->[3]->[0] eq "Para" && + @{$podtree->[3]} >= 3 && + !(grep { ref($_) ne "" } + @{$podtree->[3]}[2..$#{$podtree->[3]}]) && + (@$podtree == 4 || + (ref($podtree->[4]) eq "ARRAY" && + $podtree->[4]->[0] eq "head1"))) { + $Title = join("", @{$podtree->[3]}[2..$#{$podtree->[3]}]); + } + } + + $Title //= ""; + $Title = html_escape($Title); + + # set options for the HTML generator + $parser = Pod::Simple::XHTML::LocalPodLinks->new(); + $parser->codes_in_verbatim(0); + $parser->anchor_items(1); # the old Pod::Html always did + $parser->backlink($Backlink); # linkify =head1 directives + $parser->force_title($Title); + $parser->htmldir($Htmldir); + $parser->htmlfileurl($Htmlfileurl); + $parser->htmlroot($Htmlroot); + $parser->index($Doindex); + $parser->output_string(\my $output); # written to file later + $parser->pages(\%Pages); + $parser->quiet($Quiet); + $parser->verbose($Verbose); + + # We need to add this ourselves because we use our own header, not + # ::XHTML's header. We need to set $parser->backlink to linkify + # the =head1 directives + my $bodyid = $Backlink ? ' id="_podtop_"' : ''; + + my $csslink = ''; + my $tdstyle = ' style="background-color: #cccccc; color: #000"'; + + if ($Css) { + $csslink = qq(\n); + $csslink =~ s,\\,/,g; + $csslink =~ s,(/.):,$1|,; + $tdstyle= ''; + } + + # header/footer block + my $block = $Header ? < + + $Title + + +END_OF_BLOCK + + # create own header/footer because of --header + $parser->html_header(<<"HTMLHEAD"); + + + + +$Title$csslink + + + + + +$block +HTMLHEAD + + $parser->html_footer(<<"HTMLFOOT"); +$block + + + +HTMLFOOT + + feed_tree_to_parser($parser, $podtree); + + # Write output to file + $Htmlfile = "-" unless $Htmlfile; # stdout + my $fhout; + if($Htmlfile and $Htmlfile ne '-') { + open $fhout, ">", $Htmlfile + or die "$0: cannot open $Htmlfile file for output: $!\n"; + } else { + open $fhout, ">-"; + } + binmode $fhout, ":utf8"; + print $fhout $output; + close $fhout or die "Failed to close $Htmlfile: $!"; + chmod 0644, $Htmlfile unless $Htmlfile eq '-'; +} + +############################################################################## + +sub usage { + my $podfile = shift; + warn "$0: $podfile: @_\n" if @_; + die < --htmlroot= + --infile= --outfile= + --podpath=:...: --podroot= + --cachedir= --flush --recurse --norecurse + --quiet --noquiet --verbose --noverbose + --index --noindex --backlink --nobacklink + --header --noheader --poderrors --nopoderrors + --css= --title= + + --[no]backlink - turn =head1 directives into links pointing to the top of + the page (off by default). + --cachedir - directory for the directory cache files. + --css - stylesheet URL + --flush - flushes the directory cache. + --[no]header - produce block header/footer (default is no headers). + --help - prints this message. + --htmldir - directory for resulting HTML files. + --htmlroot - http-server base directory from which all relative paths + in podpath stem (default is /). + --[no]index - generate an index at the top of the resulting html + (default behaviour). + --infile - filename for the pod to convert (input taken from stdin + by default). + --outfile - filename for the resulting html file (output sent to + stdout by default). + --[no]poderrors - include a POD ERRORS section in the output if there were + any POD errors in the input (default behavior). + --podpath - colon-separated list of directories containing library + pods (empty by default). + --podroot - filesystem base directory from which all relative paths + in podpath stem (default is .). + --[no]quiet - suppress some benign warning messages (default is off). + --[no]recurse - recurse on those subdirectories listed in podpath + (default behaviour). + --title - title that will appear in resulting html file. + --[no]verbose - self-explanatory (off by default). + +END_OF_USAGE + +} + +sub parse_command_line { + my ($opt_backlink,$opt_cachedir,$opt_css,$opt_flush,$opt_header, + $opt_help,$opt_htmldir,$opt_htmlroot,$opt_index,$opt_infile, + $opt_outfile,$opt_poderrors,$opt_podpath,$opt_podroot, + $opt_quiet,$opt_recurse,$opt_title,$opt_verbose); + + unshift @ARGV, split ' ', $Config{pod2html} if $Config{pod2html}; + my $result = GetOptions( + 'backlink!' => \$opt_backlink, + 'cachedir=s' => \$opt_cachedir, + 'css=s' => \$opt_css, + 'flush' => \$opt_flush, + 'help' => \$opt_help, + 'header!' => \$opt_header, + 'htmldir=s' => \$opt_htmldir, + 'htmlroot=s' => \$opt_htmlroot, + 'index!' => \$opt_index, + 'infile=s' => \$opt_infile, + 'outfile=s' => \$opt_outfile, + 'poderrors!' => \$opt_poderrors, + 'podpath=s' => \$opt_podpath, + 'podroot=s' => \$opt_podroot, + 'quiet!' => \$opt_quiet, + 'recurse!' => \$opt_recurse, + 'title=s' => \$opt_title, + 'verbose!' => \$opt_verbose, + ); + usage("-", "invalid parameters") if not $result; + + usage("-") if defined $opt_help; # see if the user asked for help + $opt_help = ""; # just to make -w shut-up. + + @Podpath = split(":", $opt_podpath) if defined $opt_podpath; + + $Backlink = $opt_backlink if defined $opt_backlink; + $Cachedir = _unixify($opt_cachedir) if defined $opt_cachedir; + $Css = $opt_css if defined $opt_css; + $Header = $opt_header if defined $opt_header; + $Htmldir = _unixify($opt_htmldir) if defined $opt_htmldir; + $Htmlroot = _unixify($opt_htmlroot) if defined $opt_htmlroot; + $Doindex = $opt_index if defined $opt_index; + $Podfile = _unixify($opt_infile) if defined $opt_infile; + $Htmlfile = _unixify($opt_outfile) if defined $opt_outfile; + $Poderrors = $opt_poderrors if defined $opt_poderrors; + $Podroot = _unixify($opt_podroot) if defined $opt_podroot; + $Quiet = $opt_quiet if defined $opt_quiet; + $Recurse = $opt_recurse if defined $opt_recurse; + $Title = $opt_title if defined $opt_title; + $Verbose = $opt_verbose if defined $opt_verbose; + + warn "Flushing directory caches\n" + if $opt_verbose && defined $opt_flush; + $Dircache = "$Cachedir/pod2htmd.tmp"; + if (defined $opt_flush) { + 1 while unlink($Dircache); + } +} + +my $Saved_Cache_Key; + +sub get_cache { + my($dircache, $podpath, $podroot, $recurse) = @_; + my @cache_key_args = @_; + + # A first-level cache: + # Don't bother reading the cache files if they still apply + # and haven't changed since we last read them. + + my $this_cache_key = cache_key(@cache_key_args); + return 1 if $Saved_Cache_Key and $this_cache_key eq $Saved_Cache_Key; + $Saved_Cache_Key = $this_cache_key; + + # load the cache of %Pages if possible. $tests will be + # non-zero if successful. + my $tests = 0; + if (-f $dircache) { + warn "scanning for directory cache\n" if $Verbose; + $tests = load_cache($dircache, $podpath, $podroot); + } + + return $tests; +} + +sub cache_key { + my($dircache, $podpath, $podroot, $recurse) = @_; + return join('!',$dircache,$recurse,@$podpath,$podroot,stat($dircache)); +} + +# +# load_cache - tries to find if the cache stored in $dircache is a valid +# cache of %Pages. if so, it loads them and returns a non-zero value. +# +sub load_cache { + my($dircache, $podpath, $podroot) = @_; + my $tests = 0; + local $_; + + warn "scanning for directory cache\n" if $Verbose; + open(my $cachefh, '<', $dircache) || + die "$0: error opening $dircache for reading: $!\n"; + $/ = "\n"; + + # is it the same podpath? + $_ = <$cachefh>; + chomp($_); + $tests++ if (join(":", @$podpath) eq $_); + + # is it the same podroot? + $_ = <$cachefh>; + chomp($_); + $tests++ if ($podroot eq $_); + + # load the cache if its good + if ($tests != 2) { + close($cachefh); + return 0; + } + + warn "loading directory cache\n" if $Verbose; + while (<$cachefh>) { + /(.*?) (.*)$/; + $Pages{$1} = $2; + } + + close($cachefh); + return 1; +} + + +# +# html_escape: make text safe for HTML +# +sub html_escape { + my $rest = $_[0]; + $rest =~ s/&/&/g; + $rest =~ s//>/g; + $rest =~ s/"/"/g; + $rest =~ s/([[:^print:]])/sprintf("&#x%x;", ord($1))/aeg; + return $rest; +} + +# +# htmlify - converts a pod section specification to a suitable section +# specification for HTML. We adopt the mechanism used by the formatter +# that we use. +# +sub htmlify { + my( $heading) = @_; + return Pod::Simple::XHTML->can("idify")->(undef, $heading, 1); +} + +# +# similar to htmlify, but turns non-alphanumerics into underscores +# +sub anchorify { + my ($anchor) = @_; + $anchor = htmlify($anchor); + $anchor =~ s/\W/_/g; + return $anchor; +} + +# +# store POD files in %Pages +# +sub _save_page { + my ($modspec, $modname) = @_; + + # Remove Podroot from path + $modspec = $Podroot eq File::Spec->curdir + ? File::Spec->abs2rel($modspec) + : File::Spec->abs2rel($modspec, + File::Spec->canonpath($Podroot)); + + # Convert path to unix style path + $modspec = Pod::Html::_unixify($modspec); + + my ($file, $dir) = fileparse($modspec, qr/\.[^.]*/); # strip .ext + $Pages{$modname} = $dir.$file; +} + +sub _unixify { + my $full_path = shift; + return '' unless $full_path; + return $full_path if $full_path eq '/'; + + my ($vol, $dirs, $file) = File::Spec->splitpath($full_path); + my @dirs = $dirs eq File::Spec->curdir() + ? (File::Spec::Unix->curdir()) + : File::Spec->splitdir($dirs); + if (defined($vol) && $vol) { + $vol =~ s/:$// if $^O eq 'VMS'; + $vol = uc $vol if $^O eq 'MSWin32'; + + if( $dirs[0] ) { + unshift @dirs, $vol; + } + else { + $dirs[0] = $vol; + } + } + unshift @dirs, '' if File::Spec->file_name_is_absolute($full_path); + return $file unless scalar(@dirs); + $full_path = File::Spec::Unix->catfile(File::Spec::Unix->catdir(@dirs), + $file); + $full_path =~ s|^\/|| if $^O eq 'MSWin32'; # C:/foo works, /C:/foo doesn't + $full_path =~ s/\^\././g if $^O eq 'VMS'; # unescape dots + return $full_path; +} + +package Pod::Simple::XHTML::LocalPodLinks; +use strict; +use warnings; +use parent 'Pod::Simple::XHTML'; + +use File::Spec; +use File::Spec::Unix; + +__PACKAGE__->_accessorize( + 'htmldir', + 'htmlfileurl', + 'htmlroot', + 'pages', # Page name => relative/path/to/page from root POD dir + 'quiet', + 'verbose', +); + +sub resolve_pod_page_link { + my ($self, $to, $section) = @_; + + return undef unless defined $to || defined $section; + if (defined $section) { + $section = '#' . $self->idify($section, 1); + return $section unless defined $to; + } else { + $section = ''; + } + + my $path; # path to $to according to %Pages + unless (exists $self->pages->{$to}) { + # Try to find a POD that ends with $to and use that. + # e.g., given L, if there is no $Podpath/XHTML in %Pages, + # look for $Podpath/*/XHTML in %Pages, with * being any path, + # as a substitute (e.g., $Podpath/Pod/Simple/XHTML) + my @matches; + foreach my $modname (keys %{$self->pages}) { + push @matches, $modname if $modname =~ /::\Q$to\E\z/; + } + + if ($#matches == -1) { + warn "Cannot find \"$to\" in podpath: " . + "cannot find suitable replacement path, cannot resolve link\n" + unless $self->quiet; + return ''; + } elsif ($#matches == 0) { + warn "Cannot find \"$to\" in podpath: " . + "using $matches[0] as replacement path to $to\n" + unless $self->quiet; + $path = $self->pages->{$matches[0]}; + } else { + warn "Cannot find \"$to\" in podpath: " . + "more than one possible replacement path to $to, " . + "using $matches[-1]\n" unless $self->quiet; + # Use [-1] so newer (higher numbered) perl PODs are used + $path = $self->pages->{$matches[-1]}; + } + } else { + $path = $self->pages->{$to}; + } + + my $url = File::Spec::Unix->catfile(Pod::Html::_unixify($self->htmlroot), + $path); + + if ($self->htmlfileurl ne '') { + # then $self->htmlroot eq '' (by definition of htmlfileurl) so + # $self->htmldir needs to be prepended to link to get the absolute path + # that will be relativized + $url = Pod::Html::relativize_url( + File::Spec::Unix->catdir(Pod::Html::_unixify($self->htmldir), $url), + $self->htmlfileurl # already unixified + ); + } + + return $url . ".html$section"; +} + +package Pod::Html; + +# +# relativize_url - convert an absolute URL to one relative to a base URL. +# Assumes both end in a filename. +# +sub relativize_url { + my ($dest, $source) = @_; + + # Remove each file from its path + my ($dest_volume, $dest_directory, $dest_file) = + File::Spec::Unix->splitpath( $dest ); + $dest = File::Spec::Unix->catpath( $dest_volume, $dest_directory, '' ); + + my ($source_volume, $source_directory, $source_file) = + File::Spec::Unix->splitpath( $source ); + $source = File::Spec::Unix->catpath( $source_volume, $source_directory, '' ); + + my $rel_path = ''; + if ($dest ne '') { + $rel_path = File::Spec::Unix->abs2rel( $dest, $source ); + } + + if ($rel_path ne '' && substr( $rel_path, -1 ) ne '/') { + $rel_path .= "/$dest_file"; + } else { + $rel_path .= "$dest_file"; + } + + return $rel_path; +} + +1; +############################################################################# +# Pod/Select.pm -- function to select portions of POD docs +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::Select; +use strict; + +use vars qw($VERSION @ISA @EXPORT $MAX_HEADING_LEVEL %myData @section_headings @selected_sections); +$VERSION = '1.63'; ## Current version of this package +require 5.005; ## requires this Perl version or later + +############################################################################# + + +############################################################################# + +#use diagnostics; +use Carp; +use Pod::Parser 1.04; + +@ISA = qw(Pod::Parser); +@EXPORT = qw(&podselect); + +## Maximum number of heading levels supported for '=headN' directives +*MAX_HEADING_LEVEL = \3; + +############################################################################# + + +##--------------------------------------------------------------------------- + +## =begin _PRIVATE_ +## +## =head1 B<_init_headings()> +## +## Initialize the current set of active section headings. +## +## =cut +## +## =end _PRIVATE_ + +sub _init_headings { + my $self = shift; + local *myData = $self; + + ## Initialize current section heading titles if necessary + unless (defined $myData{_SECTION_HEADINGS}) { + local *section_headings = $myData{_SECTION_HEADINGS} = []; + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $section_headings[$i] = ''; + } + } +} + +##--------------------------------------------------------------------------- + + +sub curr_headings { + my $self = shift; + $self->_init_headings() unless (defined $self->{_SECTION_HEADINGS}); + my @headings = @{ $self->{_SECTION_HEADINGS} }; + return (@_ > 0 and $_[0] =~ /^\d+$/) ? $headings[$_[0] - 1] : @headings; +} + +##--------------------------------------------------------------------------- + + +sub select { + my ($self, @sections) = @_; + local *myData = $self; + local $_; + +### NEED TO DISCERN A SECTION-SPEC FROM A RANGE-SPEC (look for m{^/.+/$}?) + + ##--------------------------------------------------------------------- + ## The following is a blatant hack for backward compatibility, and for + ## implementing add_selection(). If the *first* *argument* is the + ## string "+", then the remaining section specifications are *added* + ## to the current set of selections; otherwise the given section + ## specifications will *replace* the current set of selections. + ## + ## This should probably be fixed someday, but for the present time, + ## it seems incredibly unlikely that "+" would ever correspond to + ## a legitimate section heading + ##--------------------------------------------------------------------- + my $add = ($sections[0] eq '+') ? shift(@sections) : ''; + + ## Reset the set of sections to use + unless (@sections) { + delete $myData{_SELECTED_SECTIONS} unless ($add); + return; + } + $myData{_SELECTED_SECTIONS} = [] + unless ($add && exists $myData{_SELECTED_SECTIONS}); + local *selected_sections = $myData{_SELECTED_SECTIONS}; + + ## Compile each spec + for my $spec (@sections) { + if ( defined($_ = _compile_section_spec($spec)) ) { + ## Store them in our sections array + push(@selected_sections, $_); + } + else { + carp qq{Ignoring section spec "$spec"!\n}; + } + } +} + +##--------------------------------------------------------------------------- + + +sub add_selection { + my $self = shift; + return $self->select('+', @_); +} + +##--------------------------------------------------------------------------- + + +sub clear_selections { + my $self = shift; + return $self->select(); +} + +##--------------------------------------------------------------------------- + + +sub match_section { + my $self = shift; + my (@headings) = @_; + local *myData = $self; + + ## Return true if no restrictions were explicitly specified + my $selections = (exists $myData{_SELECTED_SECTIONS}) + ? $myData{_SELECTED_SECTIONS} : undef; + return 1 unless ((defined $selections) && @{$selections}); + + ## Default any unspecified sections to the current one + my @current_headings = $self->curr_headings(); + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + (defined $headings[$i]) or $headings[$i] = $current_headings[$i]; + } + + ## Look for a match against the specified section expressions + for my $section_spec ( @{$selections} ) { + ##------------------------------------------------------ + ## Each portion of this spec must match in order for + ## the spec to be matched. So we will start with a + ## match-value of 'true' and logically 'and' it with + ## the results of matching a given element of the spec. + ##------------------------------------------------------ + my $match = 1; + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + my $regex = $section_spec->[$i]; + my $negated = ($regex =~ s/^\!//); + $match &= ($negated ? ($headings[$i] !~ /${regex}/) + : ($headings[$i] =~ /${regex}/)); + last unless ($match); + } + return 1 if ($match); + } + return 0; ## no match +} + +##--------------------------------------------------------------------------- + + +sub is_selected { + my ($self, $paragraph) = @_; + local $_; + local *myData = $self; + + $self->_init_headings() unless (defined $myData{_SECTION_HEADINGS}); + + ## Keep track of current sections levels and headings + $_ = $paragraph; + if (/^=((?:sub)*)(?:head(?:ing)?|sec(?:tion)?)(\d*)\s+(.*?)\s*$/) + { + ## This is a section heading command + my ($level, $heading) = ($2, $3); + $level = 1 + (length($1) / 3) if ((! length $level) || (length $1)); + ## Reset the current section heading at this level + $myData{_SECTION_HEADINGS}->[$level - 1] = $heading; + ## Reset subsection headings of this one to empty + for (my $i = $level; $i < $MAX_HEADING_LEVEL; ++$i) { + $myData{_SECTION_HEADINGS}->[$i] = ''; + } + } + + return $self->match_section(); +} + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub podselect { + my(@argv) = @_; + my %defaults = (); + my $pod_parser = new Pod::Select(%defaults); + my $num_inputs = 0; + my $output = '>&STDOUT'; + my %opts; + local $_; + for (@argv) { + my $ref = ref($_); + if ($ref && $ref eq 'HASH') { + %opts = (%defaults, %{$_}); + + ##------------------------------------------------------------- + ## Need this for backward compatibility since we formerly used + ## options that were all uppercase words rather than ones that + ## looked like Unix command-line options. + ## to be uppercase keywords) + ##------------------------------------------------------------- + %opts = map { + my ($key, $val) = (lc $_, $opts{$_}); + $key =~ s/^(?=\w)/-/; + $key =~ /^-se[cl]/ and $key = '-sections'; + #! $key eq '-range' and $key .= 's'; + ($key => $val); + } (keys %opts); + + ## Process the options + (exists $opts{'-output'}) and $output = $opts{'-output'}; + + ## Select the desired sections + $pod_parser->select(@{ $opts{'-sections'} }) + if ( (defined $opts{'-sections'}) + && ((ref $opts{'-sections'}) eq 'ARRAY') ); + + #! ## Select the desired paragraph ranges + #! $pod_parser->select(@{ $opts{'-ranges'} }) + #! if ( (defined $opts{'-ranges'}) + #! && ((ref $opts{'-ranges'}) eq 'ARRAY') ); + } + elsif(!$ref || $ref eq 'GLOB') { + $pod_parser->parse_from_file($_, $output); + ++$num_inputs; + } + else { + croak "Input from $ref reference not supported!\n"; + } + } + $pod_parser->parse_from_file('-') unless ($num_inputs > 0); +} + +############################################################################# + + +##--------------------------------------------------------------------------- + + +sub _compile_section_spec { + my ($section_spec) = @_; + my (@regexs, $negated); + + ## Compile the spec into a list of regexs + local $_ = $section_spec; + s{\\\\}{\001}g; ## handle escaped backward slashes + s{\\/}{\002}g; ## handle escaped forward slashes + + ## Parse the regexs for the heading titles + @regexs = split(/\//, $_, $MAX_HEADING_LEVEL); + + ## Set default regex for omitted levels + for (my $i = 0; $i < $MAX_HEADING_LEVEL; ++$i) { + $regexs[$i] = '.*' unless ((defined $regexs[$i]) + && (length $regexs[$i])); + } + ## Modify the regexs as needed and validate their syntax + my $bad_regexs = 0; + for (@regexs) { + $_ .= '.+' if ($_ eq '!'); + s{\001}{\\\\}g; ## restore escaped backward slashes + s{\002}{\\/}g; ## restore escaped forward slashes + $negated = s/^\!//; ## check for negation + eval "m{$_}"; ## check regex syntax + if ($@) { + ++$bad_regexs; + carp qq{Bad regular expression /$_/ in "$section_spec": $@\n}; + } + else { + ## Add the forward and rear anchors (and put the negator back) + $_ = '^' . $_ unless (/^\^/); + $_ = $_ . '$' unless (/\$$/); + $_ = '!' . $_ if ($negated); + } + } + return (! $bad_regexs) ? [ @regexs ] : undef; +} + +##--------------------------------------------------------------------------- + + +##--------------------------------------------------------------------------- + + +############################################################################# + + +1; +# vim: ts=4 sw=4 et +############################################################################# +# Pod/InputObjects.pm -- package which defines objects for input streams +# and paragraphs and commands when parsing POD docs. +# +# Copyright (C) 1996-2000 by Bradford Appleton. All rights reserved. +# This file is part of "PodParser". PodParser is free software; +# you can redistribute it and/or modify it under the same terms +# as Perl itself. +############################################################################# + +package Pod::InputObjects; +use strict; + +use vars qw($VERSION); +$VERSION = '1.63'; ## Current version of this package +require 5.005; ## requires this Perl version or later + +############################################################################# + + +############################################################################# + +package Pod::InputSource; + +##--------------------------------------------------------------------------- + + +##--------------------------------------------------------------------------- + + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. Note that we default + ## certain values by specifying them *before* the arguments passed. + ## If they are in the argument list, they will override the defaults. + my $self = { -name => '(unknown)', + -handle => undef, + -was_cutting => 0, + @_ }; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + + +sub name { + (@_ > 1) and $_[0]->{'-name'} = $_[1]; + return $_[0]->{'-name'}; +} + +## allow 'filename' as an alias for 'name' +*filename = \&name; + +##--------------------------------------------------------------------------- + + +sub handle { + return $_[0]->{'-handle'}; +} + +##--------------------------------------------------------------------------- + + +sub was_cutting { + (@_ > 1) and $_[0]->{-was_cutting} = $_[1]; + return $_[0]->{-was_cutting}; +} + +##--------------------------------------------------------------------------- + +############################################################################# + +package Pod::Paragraph; + +##--------------------------------------------------------------------------- + + +##--------------------------------------------------------------------------- + + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. Note that we default + ## certain values by specifying them *before* the arguments passed. + ## If they are in the argument list, they will override the defaults. + my $self = { + -name => undef, + -text => (@_ == 1) ? shift : undef, + -file => '', + -line => 0, + -prefix => '=', + -separator => ' ', + -ptree => [], + @_ + }; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + + +sub cmd_name { + (@_ > 1) and $_[0]->{'-name'} = $_[1]; + return $_[0]->{'-name'}; +} + +## let name() be an alias for cmd_name() +*name = \&cmd_name; + +##--------------------------------------------------------------------------- + + +sub text { + (@_ > 1) and $_[0]->{'-text'} = $_[1]; + return $_[0]->{'-text'}; +} + +##--------------------------------------------------------------------------- + + +sub raw_text { + return $_[0]->{'-text'} unless (defined $_[0]->{'-name'}); + return $_[0]->{'-prefix'} . $_[0]->{'-name'} . + $_[0]->{'-separator'} . $_[0]->{'-text'}; +} + +##--------------------------------------------------------------------------- + + +sub cmd_prefix { + return $_[0]->{'-prefix'}; +} + +##--------------------------------------------------------------------------- + + +sub cmd_separator { + return $_[0]->{'-separator'}; +} + +##--------------------------------------------------------------------------- + + +sub parse_tree { + (@_ > 1) and $_[0]->{'-ptree'} = $_[1]; + return $_[0]->{'-ptree'}; +} + +## let ptree() be an alias for parse_tree() +*ptree = \&parse_tree; + +##--------------------------------------------------------------------------- + + +sub file_line { + my @loc = ($_[0]->{'-file'} || '', + $_[0]->{'-line'} || 0); + return (wantarray) ? @loc : join(':', @loc); +} + +##--------------------------------------------------------------------------- + +############################################################################# + +package Pod::InteriorSequence; + +##--------------------------------------------------------------------------- + + +##--------------------------------------------------------------------------- + + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + ## See if first argument has no keyword + if (((@_ <= 2) or (@_ % 2)) and $_[0] !~ /^-\w/) { + ## Yup - need an implicit '-name' before first parameter + unshift @_, '-name'; + } + + ## See if odd number of args + if ((@_ % 2) != 0) { + ## Yup - need an implicit '-ptree' before the last parameter + splice @_, $#_, 0, '-ptree'; + } + + ## Any remaining arguments are treated as initial values for the + ## hash that is used to represent this object. Note that we default + ## certain values by specifying them *before* the arguments passed. + ## If they are in the argument list, they will override the defaults. + my $self = { + -name => (@_ == 1) ? $_[0] : undef, + -file => '', + -line => 0, + -ldelim => '<', + -rdelim => '>', + @_ + }; + + ## Initialize contents if they haven't been already + my $ptree = $self->{'-ptree'} || new Pod::ParseTree(); + if ( ref $ptree =~ /^(ARRAY)?$/ ) { + ## We have an array-ref, or a normal scalar. Pass it as an + ## an argument to the ptree-constructor + $ptree = new Pod::ParseTree($1 ? [$ptree] : $ptree); + } + $self->{'-ptree'} = $ptree; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + + +sub cmd_name { + (@_ > 1) and $_[0]->{'-name'} = $_[1]; + return $_[0]->{'-name'}; +} + +## let name() be an alias for cmd_name() +*name = \&cmd_name; + +##--------------------------------------------------------------------------- + +## Private subroutine to set the parent pointer of all the given +## children that are interior-sequences to be $self + +sub _set_child2parent_links { + my ($self, @children) = @_; + ## Make sure any sequences know who their parent is + for (@children) { + next unless (length and ref and ref ne 'SCALAR'); + if (UNIVERSAL::isa($_, 'Pod::InteriorSequence') or + UNIVERSAL::can($_, 'nested')) + { + $_->nested($self); + } + } +} + +## Private subroutine to unset child->parent links + +sub _unset_child2parent_links { + my $self = shift; + $self->{'-parent_sequence'} = undef; + my $ptree = $self->{'-ptree'}; + for (@$ptree) { + next unless (length and ref and ref ne 'SCALAR'); + $_->_unset_child2parent_links() + if UNIVERSAL::isa($_, 'Pod::InteriorSequence'); + } +} + +##--------------------------------------------------------------------------- + + +sub prepend { + my $self = shift; + $self->{'-ptree'}->prepend(@_); + _set_child2parent_links($self, @_); + return $self; +} + +##--------------------------------------------------------------------------- + + +sub append { + my $self = shift; + $self->{'-ptree'}->append(@_); + _set_child2parent_links($self, @_); + return $self; +} + +##--------------------------------------------------------------------------- + + +sub nested { + my $self = shift; + (@_ == 1) and $self->{'-parent_sequence'} = shift; + return $self->{'-parent_sequence'} || undef; +} + +##--------------------------------------------------------------------------- + + +sub raw_text { + my $self = shift; + my $text = $self->{'-name'} . $self->{'-ldelim'}; + for ( $self->{'-ptree'}->children ) { + $text .= (ref $_) ? $_->raw_text : $_; + } + $text .= $self->{'-rdelim'}; + return $text; +} + +##--------------------------------------------------------------------------- + + +sub left_delimiter { + (@_ > 1) and $_[0]->{'-ldelim'} = $_[1]; + return $_[0]->{'-ldelim'}; +} + +## let ldelim() be an alias for left_delimiter() +*ldelim = \&left_delimiter; + +##--------------------------------------------------------------------------- + + +sub right_delimiter { + (@_ > 1) and $_[0]->{'-rdelim'} = $_[1]; + return $_[0]->{'-rdelim'}; +} + +## let rdelim() be an alias for right_delimiter() +*rdelim = \&right_delimiter; + +##--------------------------------------------------------------------------- + + +sub parse_tree { + (@_ > 1) and $_[0]->{'-ptree'} = $_[1]; + return $_[0]->{'-ptree'}; +} + +## let ptree() be an alias for parse_tree() +*ptree = \&parse_tree; + +##--------------------------------------------------------------------------- + + +sub file_line { + my @loc = ($_[0]->{'-file'} || '', + $_[0]->{'-line'} || 0); + return (wantarray) ? @loc : join(':', @loc); +} + +##--------------------------------------------------------------------------- + + +sub DESTROY { + ## We need to get rid of all child->parent pointers throughout the + ## tree so their reference counts will go to zero and they can be + ## garbage-collected + _unset_child2parent_links(@_); +} + +##--------------------------------------------------------------------------- + +############################################################################# + +package Pod::ParseTree; + +##--------------------------------------------------------------------------- + + +##--------------------------------------------------------------------------- + + +sub new { + ## Determine if we were called via an object-ref or a classname + my $this = shift; + my $class = ref($this) || $this; + + my $self = (@_ == 1 and ref $_[0]) ? $_[0] : []; + + ## Bless ourselves into the desired class and perform any initialization + bless $self, $class; + return $self; +} + +##--------------------------------------------------------------------------- + + +sub top { + my $self = shift; + if (@_ > 0) { + @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_; + } + return $self; +} + +## let parse_tree() & ptree() be aliases for the 'top' method +*parse_tree = *ptree = \⊤ + +##--------------------------------------------------------------------------- + + +sub children { + my $self = shift; + if (@_ > 0) { + @{ $self } = (@_ == 1 and ref $_[0]) ? ${ @_ } : @_; + } + return @{ $self }; +} + +##--------------------------------------------------------------------------- + + +use vars qw(@ptree); ## an alias used for performance reasons + +sub prepend { + my $self = shift; + local *ptree = $self; + for (@_) { + next unless length; + if (@ptree && !(ref $ptree[0]) && !(ref $_)) { + $ptree[0] = $_ . $ptree[0]; + } + else { + unshift @ptree, $_; + } + } +} + +##--------------------------------------------------------------------------- + + +sub append { + my $self = shift; + local *ptree = $self; + my $can_append = @ptree && !(ref $ptree[-1]); + for (@_) { + if (ref) { + push @ptree, $_; + } + elsif(!length) { + next; + } + elsif ($can_append) { + $ptree[-1] .= $_; + } + else { + push @ptree, $_; + } + } +} + + +sub raw_text { + my $self = shift; + my $text = ''; + for ( @$self ) { + $text .= (ref $_) ? $_->raw_text : $_; + } + return $text; +} + +##--------------------------------------------------------------------------- + +## Private routines to set/unset child->parent links + +sub _unset_child2parent_links { + my $self = shift; + local *ptree = $self; + for (@ptree) { + next unless (defined and length and ref and ref ne 'SCALAR'); + $_->_unset_child2parent_links() + if UNIVERSAL::isa($_, 'Pod::InteriorSequence'); + } +} + +sub _set_child2parent_links { + ## nothing to do, Pod::ParseTrees cant have parent pointers +} + + +sub DESTROY { + ## We need to get rid of all child->parent pointers throughout the + ## tree so their reference counts will go to zero and they can be + ## garbage-collected + _unset_child2parent_links(@_); +} + +############################################################################# + + +1; +############################################################################# +# Pod/Checker.pm -- check pod documents for syntax errors +# +# Copyright (C) 1994-2000 by Bradford Appleton. All rights reserved. +# This is free software; you can redistribute it and/or modify it under the +# same terms as Perl itself. +############################################################################# + +package Pod::Checker; +use strict; +use warnings; + +our $VERSION = '1.73'; ## Current version of this package + + +############################################################################# + +#use diagnostics; +use Carp qw(croak); +use Exporter 'import'; +use base qw/Pod::Simple::Methody/; + +our @EXPORT = qw(&podchecker); + +##--------------------------------- +## Function definitions begin here +##--------------------------------- + +sub podchecker { + my ($infile, $outfile, %options) = @_; + local $_; + + ## Set defaults + $infile ||= \*STDIN; + $outfile ||= \*STDERR; + + ## Now create a pod checker + my $checker = Pod::Checker->new(%options); + + ## Now check the pod document for errors + $checker->parse_from_file($infile, $outfile); + + ## Return the number of errors found + return $checker->num_errors(); +} + + +##--------------------------------------------------------------------------- + +##------------------------------- +## Method definitions begin here +##------------------------------- + +################################## + + +sub new { + my $new = shift->SUPER::new(@_); + $new->{'output_fh'} ||= *STDERR{IO}; + + # Set options + my %opts = @_; + $new->{'-warnings'} = defined $opts{'-warnings'} ? + $opts{'-warnings'} : 1; # default on + $new->{'-quiet'} = $opts{'-quiet'} || 0; # default off + + # Initialize number of errors/warnings + $new->{'_NUM_ERRORS'} = 0; + $new->{'_NUM_WARNINGS'} = 0; + + # 'current' also means 'most recent' in the follow comments + $new->{'_thispara'} = ''; # current POD paragraph + $new->{'_line'} = 0; # current line number + $new->{'_head_num'} = 0; # current =head level (set to 0 to make + # logic easier down the road) + $new->{'_cmds_since_head'} = 0; # num of POD directives since prev. =headN + $new->{'_nodes'} = []; # stack for =head/=item nodes + $new->{'_fcode_stack'} = []; # stack for nested formatting codes + $new->{'_fcode_pos'} = []; # stack for position in paragraph of fcodes + $new->{'_begin_stack'} = []; # stack for =begins: [line #, target] + $new->{'_links'} = []; # stack for hyperlinks to external entities + $new->{'_internal_links'} = []; # set of linked-to internal sections + $new->{'_index'} = []; # stack for text in X<>s + + $new->accept_targets('*'); # check all =begin/=for blocks + $new->cut_handler( \&handle_pod_and_cut ); # warn if text after =cut + $new->pod_handler( \&handle_pod_and_cut ); # warn if text after =pod + $new->whiteline_handler( \&handle_whiteline ); # warn if whiteline + $new->parse_empty_lists(1); # warn if they are empty + + return $new; +} + +################################## + + +# Invoked as $self->poderror( @args ), or $self->poderror( {%opts}, @args ) +sub poderror { + my $self = shift; + my %opts = (ref $_[0]) ? %{shift()} : (); + + ## Retrieve options + chomp( my $msg = ($opts{'-msg'} || '')."@_" ); + my $line = (exists $opts{'-line'}) ? " at line $opts{'-line'}" : ''; + my $file = ' in file ' . ((exists $opts{'-file'}) + ? $opts{'-file'} + : ((defined $self->source_filename) + ? $self->source_filename + : "???")); + unless (exists $opts{'-severity'}) { + ## See if can find severity in message prefix + $opts{'-severity'} = $1 if ( $msg =~ s/^\**\s*([A-Z]{3,}):\s+// ); + } + my $severity = (exists $opts{'-severity'}) ? "*** $opts{-severity}: " : ''; + + ## Increment error count and print message " + ++($self->{'_NUM_ERRORS'}) + if(!%opts || ($opts{-severity} && $opts{'-severity'} eq 'ERROR')); + ++($self->{'_NUM_WARNINGS'}) + if(!%opts || ($opts{-severity} && $opts{'-severity'} eq 'WARNING')); + unless($self->{'-quiet'}) { + my $out_fh = $self->{'output_fh'} || \*STDERR; + print $out_fh ($severity, $msg, $line, $file, "\n") + if($self->{'-warnings'} || !%opts || $opts{'-severity'} ne 'WARNING'); + } +} + +################################## + + +sub num_errors { + return (@_ > 1) ? ($_[0]->{'_NUM_ERRORS'} = $_[1]) : $_[0]->{'_NUM_ERRORS'}; +} + +################################## + + +sub num_warnings { + return (@_ > 1) ? ($_[0]->{'_NUM_WARNINGS'} = $_[1]) : + $_[0]->{'_NUM_WARNINGS'}; +} + +################################## + + +sub name { + return (@_ > 1 && $_[1]) ? + ($_[0]->{'_pod_name'} = $_[1]) : $_[0]->{'_pod_name'}; +} + +################################## + + +sub node { + my ($self,$text) = @_; + if(defined $text) { + $text =~ s/\s+$//s; # strip trailing whitespace + $text =~ s/\s+/ /gs; # collapse whitespace + # add node, order important! + push(@{$self->{'_nodes'}}, $text); + # keep also a uniqueness counter + $self->{'_unique_nodes'}->{$text}++ if($text !~ /^\s*$/s); + return $text; + } + @{$self->{'_nodes'}}; +} + +################################## + + +# set/return index entries of current POD +sub idx { + my ($self,$text) = @_; + if(defined $text) { + $text =~ s/\s+$//s; # strip trailing whitespace + $text =~ s/\s+/ /gs; # collapse whitespace + # add node, order important! + push(@{$self->{'_index'}}, $text); + # keep also a uniqueness counter + $self->{'_unique_nodes'}->{$text}++ if($text !~ /^\s*$/s); + return $text; + } + @{$self->{'_index'}}; +} + +################################## + +# add a hyperlink to the list of those of the current POD; returns current +# list after the addition has been done +sub hyperlink { + my $self = shift; + push(@{$self->{'_links'}}, $_[0]); + return $_[0]; +} + + +sub hyperlinks { + @{shift->{'_links'}}; +} + +################################## + +# override Pod::Simple's whine() and scream() to use poderror() + +# Note: +# Ignore $self->{'no_whining'} b/c $self->{'quiet'} takes care of it in poderror +# Don't bother incrementing $self->{'errors_seen'} -- it's not used +# Don't bother pushing to $self->{'errata'} b/c poderror() outputs immediately +# We don't need to set $self->no_errata_section(1) b/c of these overrides + + +sub whine { + my ($self, $line, $complaint) = @_; + + my $severity = 'ERROR'; + + if (0) { + # XXX: Let's standardize what's a warning and what's an error. Let's not + # move stuff up and down the severity tree. -- rjbs, 2013-04-12 + # Convert errors in Pod::Simple that are warnings in Pod::Checker + # XXX Do differently so the $complaint can be reworded without this breaking + $severity = 'WARNING' if + $complaint =~ /^Expected '=item .+?'$/ || + $complaint =~ /^You can't have =items \(as at line .+?\) unless the first thing after the =over is an =item$/ || + $complaint =~ /^You have '=item .+?' instead of the expected '=item .+?'$/; + } + + $self->poderror({ -line => $line, + -severity => $severity, + -msg => $complaint }); + + return 1; # assume everything is peachy keen +} + +sub scream { + my ($self, $line, $complaint) = @_; + + $self->poderror({ -line => $line, + -severity => 'ERROR', # consider making severity 'FATAL' + -msg => $complaint }); + + return 1; +} + + +################################## + +# Some helper subroutines + +sub _init_event { # assignments done at the start of most events + $_[0]{'_thispara'} = ''; + $_[0]{'_line'} = $_[1]{'start_line'}; + $_[0]{'_cmds_since_head'}++; +} + +sub _check_fcode { + my ($self, $inner, $outers) = @_; + # Check for an fcode inside another of the same fcode + # XXX line number is the line of the start of the paragraph that the warning + # is in, not the line that the warning is on. Fix this + + # Later versions of Pod::Simple forbid nested L<>'s + return if $inner eq 'L' && $Pod::Simple::VERSION ge '3.33'; + + if (grep { $_ eq $inner } @$outers) { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'WARNING', + -msg => "nested commands $inner<...$inner<...>...>"}); + } +} + +################################## + +sub handle_text { $_[0]{'_thispara'} .= $_[1] } + +# whiteline is a seemingly blank line that matches /[^\S\r\n]/ +sub handle_whiteline { + my ($line, $line_n, $self) = @_; + $self->poderror({ + -line => $line_n, + -severity => 'WARNING', + -msg => 'line containing nothing but whitespace in paragraph'}); +} + +######## Directives +sub handle_pod_and_cut { + my ($line, $line_n, $self) = @_; + $self->{'_cmds_since_head'}++; + if ($line =~ /=(pod|cut)\s+\S/) { + $self->poderror({ -line => $line_n, + -severity => 'ERROR', + -msg => "Spurious text after =$1"}); + } +} + +sub start_Para { shift->_init_event(@_); } +sub end_Para { + my $self = shift; + # Get the NAME of the pod document + if ($self->{'_head_num'} == 1 && $self->{'_head_text'} eq 'NAME') { + if ($self->{'_thispara'} =~ /^\s*(\S+?)\s*[,-]/) { + $self->{'_pod_name'} = $1 unless defined $self->{'_pod_name'}; + } + } +} + +sub start_Verbatim { + my $self = shift; + $self->_init_event(@_); + + if ($self->{'_head_num'} == 1 && $self->{'_head_text'} eq 'NAME') { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'WARNING', + -msg => 'Verbatim paragraph in NAME section' }); + } +} +# Don't need an end_Verbatim + +# Do I need to do anything else with this? +sub start_Data { shift->_init_event() } + +sub start_head1 { shift->start_head(1, @_) } +sub start_head2 { shift->start_head(2, @_) } +sub start_head3 { shift->start_head(3, @_) } +sub start_head4 { shift->start_head(4, @_) } +sub start_head { + my $self = shift; + my $h = shift; + $self->_init_event(@_); + my $prev_h = $self->{'_head_num'}; + $self->{'_head_num'} = $h; + $self->{"_count_head$h"}++; + + if ($h > 1 && !$self->{'_count_head'.($h-1)}) { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'WARNING', + -msg => "=head$h without preceding higher level"}); + } + + # If this is the first =head of the doc, $prev_h is 0, thus less than $h + if ($self->{'_cmds_since_head'} == 1 && $prev_h >= $h) { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'WARNING', + -msg => 'empty section in previous paragraph'}); + } +} + +sub end_head1 { shift->end_head(@_) } +sub end_head2 { shift->end_head(@_) } +sub end_head3 { shift->end_head(@_) } +sub end_head4 { shift->end_head(@_) } +sub end_head { + my $self = shift; + my $arg = $self->{'_thispara'}; + $arg =~ s/\s+$//; + $self->{'_head_text'} = $arg; + $self->{'_cmds_since_head'} = 0; + my $h = $self->{'_head_num'}; + $self->node($arg); # remember this node + if ($arg eq '') { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'ERROR', + -msg => "empty =head$h" }); + } +} + +sub start_over_bullet { shift->start_over(@_, 'bullet') } +sub start_over_number { shift->start_over(@_, 'number') } +sub start_over_text { shift->start_over(@_, 'definition') } +sub start_over_block { shift->start_over(@_, 'block') } +sub start_over_empty { + my $self = shift; + $self->start_over(@_, 'empty'); + $self->poderror({ -line => $self->{'_line'}, + -severity => 'WARNING', + -msg => 'empty =over/=back block' }); +} +sub start_over { + my $self = shift; + my $type = pop; + $self->_init_event(@_); +} + +sub start_item_bullet { shift->_init_event(@_) } +sub start_item_number { shift->_init_event(@_) } +sub start_item_text { shift->_init_event(@_) } +sub end_item_bullet { shift->end_item('bullet') } +sub end_item_number { shift->end_item('number') } +sub end_item_text { shift->end_item('definition') } +sub end_item { + my $self = shift; + my $type = shift; + # If there is verbatim text in this item, it will show up as part of + # 'paras', and not part of '_thispara'. If the first para after this is a + # verbatim one, it actually will be (part of) the contents for this item. + if ( $self->{'_thispara'} eq '' + && ( ! @{$self->{'paras'}} + || $self->{'paras'}[0][0] !~ /Verbatim/i)) + { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'WARNING', + -msg => '=item has no contents' }); + } + + $self->node($self->{'_thispara'}); # remember this node +} + +sub start_for { # =for and =begin directives + my ($self, $flags) = @_; + $self->_init_event($flags); + push @{$self->{'_begin_stack'}}, [$self->{'_line'}, $flags->{'target'}]; +} + +sub end_for { + my ($self, $flags) = @_; + my ($line, $target) = @{pop @{$self->{'_begin_stack'}}}; + if ($flags->{'fake-closer'}) { # meaning Pod::Simple generated this =end + $self->poderror({ -line => $line, + -severity => 'ERROR', + -msg => "=begin $target without matching =end $target" + }); + } +} + +sub end_Document { + # Some final error checks + my $self = shift; + + # no POD found here + $self->num_errors(-1) && return unless $self->content_seen; + + my %nodes; + for ($self->node()) { + $nodes{$_} = 1; + if(/^(\S+)\s+\S/) { + # we have more than one word. Use the first as a node, too. + # This is used heavily in perlfunc.pod + $nodes{$1} ||= 2; # derived node + } + } + for ($self->idx()) { + $nodes{$_} = 3; # index node + } + + # XXX update unresolved internal link POD -- single word not enclosed in ""? + # I don't know what I was thinking when I made the above TODO, and I don't + # know what it means... + + for my $link (@{ $self->{'_internal_links'} }) { + my ($name, $line) = @$link; + unless ( $nodes{$name} ) { + $self->poderror({ -line => $line, + -severity => 'ERROR', + -msg => "unresolved internal link '$name'"}); + } + } + + # check the internal nodes for uniqueness. This pertains to + # =headX, =item and X<...> + if ($self->{'-warnings'} > 1 ) { + for my $node (sort keys %{ $self->{'_unique_nodes'} }) { + my $count = $self->{'_unique_nodes'}{$node}; + if ($count > 1) { # not unique + $self->poderror({ + -line => '-', + -severity => 'WARNING', + -msg => "multiple occurrences ($count) of link target ". + "'$node'"}); + } + } + } +} + +######## Formatting codes + +sub start_B { shift->start_fcode('B') } +sub start_C { shift->start_fcode('C') } +sub start_F { shift->start_fcode('F') } +sub start_I { shift->start_fcode('I') } +sub start_S { shift->start_fcode('S') } +sub start_fcode { + my ($self, $fcode) = @_; + unshift @{$self->{'_fcode_stack'}}, $fcode; +} + +sub end_B { shift->end_fcode() } +sub end_C { shift->end_fcode() } +sub end_F { shift->end_fcode() } +sub end_I { shift->end_fcode() } +sub end_S { shift->end_fcode() } +sub end_fcode { + my $self = shift; + $self->_check_fcode(shift @{$self->{'_fcode_stack'}}, # current fcode removed + $self->{'_fcode_stack'}); # previous fcodes +} + +sub start_L { + my ($self, $flags) = @_; + $self->start_fcode('L'); + + my $link = Pod::Checker::Hyperlink->new($flags, $self); + if ($link) { + if ( $link->type eq 'pod' + && $link->node + # It's an internal-to-this-page link if no page is given, or + # if the given one is to our NAME. + && (! $link->page || ( $self->{'_pod_name'} + && $link->page eq $self->{'_pod_name'}))) + { + push @{ $self->{'_internal_links'} }, [ $link->{'-raw_node'}, $link->line ]; + } + else { + $self->hyperlink($link); + } + } +} + +sub end_L { + my $self = shift; + $self->end_fcode(); +} + +sub start_X { + my $self = shift; + $self->start_fcode('X'); + # keep track of where X<> starts in the paragraph + # (this is a stack so nested X<>s are handled correctly) + push @{$self->{'_fcode_pos'}}, length $self->{'_thispara'}; +} +sub end_X { + my $self = shift; + # extract contents of X<> and replace with '' + my $start = pop @{$self->{'_fcode_pos'}}; # start at the beginning of X<> + my $end = length($self->{'_thispara'}) - $start; # end at end of X<> + my $x = substr($self->{'_thispara'}, $start, $end, ''); + if ($x eq "") { + $self->poderror({ -line => $self->{'_line'}, + -severity => 'ERROR', + -msg => "An empty X<>" }); + } + $self->idx($x); # remember this node + $self->end_fcode(); +} + +package Pod::Checker::Hyperlink; + +# This class is used to represent L<> link structures, so that the individual +# elements are easily accessible. It is based on code in Pod::Hyperlink + +sub new { + my ($class, + $simple_link, # The link structure returned by Pod::Simple + $caller # The caller class + ) = @_; + + my $self = +{}; + bless $self, $class; + + $self->{'-line'} ||= $caller->{'_line'}; + $self->{'-type'} ||= $simple_link->{'type'}; + + # Force stringification of page and node. (This expands any E<>.) + $self->{'-page'} = exists $simple_link->{'to'} ? "$simple_link->{'to'}" : ""; + $self->{'-node'} = exists $simple_link->{'section'} ? "$simple_link->{'section'}" : ""; + + # Save the unmodified node text, as the .t files are expecting the message + # for internal link failures to include it (hence this preserves backward + # compatibility). + $self->{'-raw_node'} = $self->{'-node'}; + + # Remove leading/trailing white space. Pod::Simple already warns about + # these, so if the only error is this, and the link is otherwise correct, + # only the Pod::Simple warning will be output, avoiding unnecessary + # confusion. + $self->{'-page'} =~ s/ ^ \s+ //x; + $self->{'-page'} =~ s/ \s+ $ //x; + + $self->{'-node'} =~ s/ ^ \s+ //x; + $self->{'-node'} =~ s/ \s+ $ //x; + + # Pod::Simple warns about L<> and L< >, but not L + if ($self->{'-page'} eq "" && $self->{'-node'} eq "") { + $caller->poderror({ -line => $caller->{'_line'}, + -severity => 'WARNING', + -msg => 'empty link'}); + return; + } + + return $self; +} + + +sub line { + return $_[0]->{-line}; +} + + +sub type { + return $_[0]->{-type}; +} + + +sub page { + return $_[0]->{-page}; +} + + +sub node { + return $_[0]->{-node}; +} + + +1 +# Pod::Man -- Convert POD data to formatted *roff input. +# +# This module translates POD documentation into *roff markup using the man +# macro set, and is intended for converting POD documents written as Unix +# manual pages to manual pages that can be read by the man(1) command. It is +# a replacement for the pod2man command distributed with versions of Perl +# prior to 5.6. +# +# Perl core hackers, please note that this module is also separately +# maintained outside of the Perl core as part of the podlators. Please send +# me any patches at the address above in addition to sending them to the +# standard Perl mailing lists. +# +# Written by Russ Allbery +# Substantial contributions by Sean Burke +# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, +# 2010, 2012, 2013, 2014, 2015, 2016, 2017 Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Man; + +use 5.006; +use strict; +use warnings; + +use subs qw(makespace); +use vars qw(@ISA %ESCAPES $PREAMBLE $VERSION); + +use Carp qw(carp croak); +use Pod::Simple (); + +# Conditionally import Encode and set $HAS_ENCODE if it is available. +our $HAS_ENCODE; +BEGIN { + $HAS_ENCODE = eval { require Encode }; +} + +@ISA = qw(Pod::Simple); + +$VERSION = '4.10'; + +# Set the debugging level. If someone has inserted a debug function into this +# class already, use that. Otherwise, use any Pod::Simple debug function +# that's defined, and failing that, define a debug level of 10. +BEGIN { + my $parent = defined (&Pod::Simple::DEBUG) ? \&Pod::Simple::DEBUG : undef; + unless (defined &DEBUG) { + *DEBUG = $parent || sub () { 10 }; + } +} + +# Import the ASCII constant from Pod::Simple. This is true iff we're in an +# ASCII-based universe (including such things as ISO 8859-1 and UTF-8), and is +# generally only false for EBCDIC. +BEGIN { *ASCII = \&Pod::Simple::ASCII } + +# Pretty-print a data structure. Only used for debugging. +BEGIN { *pretty = \&Pod::Simple::pretty } + +# Formatting instructions for various types of blocks. cleanup makes hyphens +# hard, adds spaces between consecutive underscores, and escapes backslashes. +# convert translates characters into escapes. guesswork means to apply the +# transformations done by the guesswork sub. literal says to protect literal +# quotes from being turned into UTF-8 quotes. By default, all transformations +# are on except literal, but some elements override. +# +# DEFAULT specifies the default settings. All other elements should list only +# those settings that they are overriding. Data indicates =for roff blocks, +# which should be passed along completely verbatim. +# +# Formatting inherits negatively, in the sense that if the parent has turned +# off guesswork, all child elements should leave it off. +my %FORMATTING = ( + DEFAULT => { cleanup => 1, convert => 1, guesswork => 1, literal => 0 }, + Data => { cleanup => 0, convert => 0, guesswork => 0, literal => 0 }, + Verbatim => { guesswork => 0, literal => 1 }, + C => { guesswork => 0, literal => 1 }, + X => { cleanup => 0, guesswork => 0 }, +); + +############################################################################## +# Object initialization +############################################################################## + +# Initialize the object and set various Pod::Simple options that we need. +# Here, we also process any additional options passed to the constructor or +# set up defaults if none were given. Note that all internal object keys are +# in all-caps, reserving all lower-case object keys for Pod::Simple and user +# arguments. +sub new { + my $class = shift; + my $self = $class->SUPER::new; + + # Tell Pod::Simple not to handle S<> by automatically inserting  . + $self->nbsp_for_S (1); + + # Tell Pod::Simple to keep whitespace whenever possible. + if (my $preserve_whitespace = $self->can ('preserve_whitespace')) { + $self->$preserve_whitespace (1); + } else { + $self->fullstop_space_harden (1); + } + + # The =for and =begin targets that we accept. + $self->accept_targets (qw/man MAN roff ROFF/); + + # Ensure that contiguous blocks of code are merged together. Otherwise, + # some of the guesswork heuristics don't work right. + $self->merge_text (1); + + # Pod::Simple doesn't do anything useful with our arguments, but we want + # to put them in our object as hash keys and values. This could cause + # problems if we ever clash with Pod::Simple's own internal class + # variables. + %$self = (%$self, @_); + + # Send errors to stderr if requested. + if ($$self{stderr} and not $$self{errors}) { + $$self{errors} = 'stderr'; + } + delete $$self{stderr}; + + # Validate the errors parameter and act on it. + if (not defined $$self{errors}) { + $$self{errors} = 'pod'; + } + if ($$self{errors} eq 'stderr' || $$self{errors} eq 'die') { + $self->no_errata_section (1); + $self->complain_stderr (1); + if ($$self{errors} eq 'die') { + $$self{complain_die} = 1; + } + } elsif ($$self{errors} eq 'pod') { + $self->no_errata_section (0); + $self->complain_stderr (0); + } elsif ($$self{errors} eq 'none') { + $self->no_whining (1); + } else { + croak (qq(Invalid errors setting: "$$self{errors}")); + } + delete $$self{errors}; + + # Degrade back to non-utf8 if Encode is not available. + # + # Suppress the warning message when PERL_CORE is set, indicating this is + # running as part of the core Perl build. Perl builds podlators (and all + # pure Perl modules) before Encode and other XS modules, so Encode won't + # yet be available. Rely on the Perl core build to generate man pages + # later, after all the modules are available, so that UTF-8 handling will + # be correct. + if ($$self{utf8} and !$HAS_ENCODE) { + if (!$ENV{PERL_CORE}) { + carp ('utf8 mode requested but Encode module not available,' + . ' falling back to non-utf8'); + } + delete $$self{utf8}; + } + + # Initialize various other internal constants based on our arguments. + $self->init_fonts; + $self->init_quotes; + $self->init_page; + + # For right now, default to turning on all of the magic. + $$self{MAGIC_CPP} = 1; + $$self{MAGIC_EMDASH} = 1; + $$self{MAGIC_FUNC} = 1; + $$self{MAGIC_MANREF} = 1; + $$self{MAGIC_SMALLCAPS} = 1; + $$self{MAGIC_VARS} = 1; + + return $self; +} + +# Translate a font string into an escape. +sub toescape { (length ($_[0]) > 1 ? '\f(' : '\f') . $_[0] } + +# Determine which fonts the user wishes to use and store them in the object. +# Regular, italic, bold, and bold-italic are constants, but the fixed width +# fonts may be set by the user. Sets the internal hash key FONTS which is +# used to map our internal font escapes to actual *roff sequences later. +sub init_fonts { + my ($self) = @_; + + # Figure out the fixed-width font. If user-supplied, make sure that they + # are the right length. + for (qw/fixed fixedbold fixeditalic fixedbolditalic/) { + my $font = $$self{$_}; + if (defined ($font) && (length ($font) < 1 || length ($font) > 2)) { + croak qq(roff font should be 1 or 2 chars, not "$font"); + } + } + + # Set the default fonts. We can't be sure portably across different + # implementations what fixed bold-italic may be called (if it's even + # available), so default to just bold. + $$self{fixed} ||= 'CW'; + $$self{fixedbold} ||= 'CB'; + $$self{fixeditalic} ||= 'CI'; + $$self{fixedbolditalic} ||= 'CB'; + + # Set up a table of font escapes. First number is fixed-width, second is + # bold, third is italic. + $$self{FONTS} = { '000' => '\fR', '001' => '\fI', + '010' => '\fB', '011' => '\f(BI', + '100' => toescape ($$self{fixed}), + '101' => toescape ($$self{fixeditalic}), + '110' => toescape ($$self{fixedbold}), + '111' => toescape ($$self{fixedbolditalic}) }; +} + +# Initialize the quotes that we'll be using for C<> text. This requires some +# special handling, both to parse the user parameters if given and to make +# sure that the quotes will be safe against *roff. Sets the internal hash +# keys LQUOTE and RQUOTE. +sub init_quotes { + my ($self) = (@_); + + # Handle the quotes option first, which sets both quotes at once. + $$self{quotes} ||= '"'; + if ($$self{quotes} eq 'none') { + $$self{LQUOTE} = $$self{RQUOTE} = ''; + } elsif (length ($$self{quotes}) == 1) { + $$self{LQUOTE} = $$self{RQUOTE} = $$self{quotes}; + } elsif (length ($$self{quotes}) % 2 == 0) { + my $length = length ($$self{quotes}) / 2; + $$self{LQUOTE} = substr ($$self{quotes}, 0, $length); + $$self{RQUOTE} = substr ($$self{quotes}, $length); + } else { + croak(qq(Invalid quote specification "$$self{quotes}")) + } + + # Now handle the lquote and rquote options. + if (defined $$self{lquote}) { + $$self{LQUOTE} = $$self{lquote} eq 'none' ? q{} : $$self{lquote}; + } + if (defined $$self{rquote}) { + $$self{RQUOTE} = $$self{rquote} eq 'none' ? q{} : $$self{rquote}; + } + + # Double the first quote; note that this should not be s///g as two double + # quotes is represented in *roff as three double quotes, not four. Weird, + # I know. + $$self{LQUOTE} =~ s/\"/\"\"/; + $$self{RQUOTE} =~ s/\"/\"\"/; +} + +# Initialize the page title information and indentation from our arguments. +sub init_page { + my ($self) = @_; + + # We used to try first to get the version number from a local binary, but + # we shouldn't need that any more. Get the version from the running Perl. + # Work a little magic to handle subversions correctly under both the + # pre-5.6 and the post-5.6 version numbering schemes. + my @version = ($] =~ /^(\d+)\.(\d{3})(\d{0,3})$/); + $version[2] ||= 0; + $version[2] *= 10 ** (3 - length $version[2]); + for (@version) { $_ += 0 } + my $version = join ('.', @version); + + # Set the defaults for page titles and indentation if the user didn't + # override anything. + $$self{center} = 'User Contributed Perl Documentation' + unless defined $$self{center}; + $$self{release} = 'perl v' . $version + unless defined $$self{release}; + $$self{indent} = 4 + unless defined $$self{indent}; + + # Double quotes in things that will be quoted. + for (qw/center release/) { + $$self{$_} =~ s/\"/\"\"/g if $$self{$_}; + } +} + +############################################################################## +# Core parsing +############################################################################## + +# This is the glue that connects the code below with Pod::Simple itself. The +# goal is to convert the event stream coming from the POD parser into method +# calls to handlers once the complete content of a tag has been seen. Each +# paragraph or POD command will have textual content associated with it, and +# as soon as all of a paragraph or POD command has been seen, that content +# will be passed in to the corresponding method for handling that type of +# object. The exceptions are handlers for lists, which have opening tag +# handlers and closing tag handlers that will be called right away. +# +# The internal hash key PENDING is used to store the contents of a tag until +# all of it has been seen. It holds a stack of open tags, each one +# represented by a tuple of the attributes hash for the tag, formatting +# options for the tag (which are inherited), and the contents of the tag. + +# Add a block of text to the contents of the current node, formatting it +# according to the current formatting instructions as we do. +sub _handle_text { + my ($self, $text) = @_; + DEBUG > 3 and print "== $text\n"; + my $tag = $$self{PENDING}[-1]; + $$tag[2] .= $self->format_text ($$tag[1], $text); +} + +# Given an element name, get the corresponding method name. +sub method_for_element { + my ($self, $element) = @_; + $element =~ tr/A-Z-/a-z_/; + $element =~ tr/_a-z0-9//cd; + return $element; +} + +# Handle the start of a new element. If cmd_element is defined, assume that +# we need to collect the entire tree for this element before passing it to the +# element method, and create a new tree into which we'll collect blocks of +# text and nested elements. Otherwise, if start_element is defined, call it. +sub _handle_element_start { + my ($self, $element, $attrs) = @_; + DEBUG > 3 and print "++ $element (<", join ('> <', %$attrs), ">)\n"; + my $method = $self->method_for_element ($element); + + # If we have a command handler, we need to accumulate the contents of the + # tag before calling it. Turn off IN_NAME for any command other than + # and the formatting codes so that IN_NAME isn't still set for the + # first heading after the NAME heading. + if ($self->can ("cmd_$method")) { + DEBUG > 2 and print "<$element> starts saving a tag\n"; + $$self{IN_NAME} = 0 if ($element ne 'Para' && length ($element) > 1); + + # How we're going to format embedded text blocks depends on the tag + # and also depends on our parent tags. Thankfully, inside tags that + # turn off guesswork and reformatting, nothing else can turn it back + # on, so this can be strictly inherited. + my $formatting = { + %{ $$self{PENDING}[-1][1] || $FORMATTING{DEFAULT} }, + %{ $FORMATTING{$element} || {} }, + }; + push (@{ $$self{PENDING} }, [ $attrs, $formatting, '' ]); + DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n"; + } elsif (my $start_method = $self->can ("start_$method")) { + $self->$start_method ($attrs, ''); + } else { + DEBUG > 2 and print "No $method start method, skipping\n"; + } +} + +# Handle the end of an element. If we had a cmd_ method for this element, +# this is where we pass along the tree that we built. Otherwise, if we have +# an end_ method for the element, call that. +sub _handle_element_end { + my ($self, $element) = @_; + DEBUG > 3 and print "-- $element\n"; + my $method = $self->method_for_element ($element); + + # If we have a command handler, pull off the pending text and pass it to + # the handler along with the saved attribute hash. + if (my $cmd_method = $self->can ("cmd_$method")) { + DEBUG > 2 and print " stops saving a tag\n"; + my $tag = pop @{ $$self{PENDING} }; + DEBUG > 4 and print "Popped: [", pretty ($tag), "]\n"; + DEBUG > 4 and print "Pending: [", pretty ($$self{PENDING}), "]\n"; + my $text = $self->$cmd_method ($$tag[0], $$tag[2]); + if (defined $text) { + if (@{ $$self{PENDING} } > 1) { + $$self{PENDING}[-1][2] .= $text; + } else { + $self->output ($text); + } + } + } elsif (my $end_method = $self->can ("end_$method")) { + $self->$end_method (); + } else { + DEBUG > 2 and print "No $method end method, skipping\n"; + } +} + +############################################################################## +# General formatting +############################################################################## + +# Format a text block. Takes a hash of formatting options and the text to +# format. Currently, the only formatting options are guesswork, cleanup, and +# convert, all of which are boolean. +sub format_text { + my ($self, $options, $text) = @_; + my $guesswork = $$options{guesswork} && !$$self{IN_NAME}; + my $cleanup = $$options{cleanup}; + my $convert = $$options{convert}; + my $literal = $$options{literal}; + + # Cleanup just tidies up a few things, telling *roff that the hyphens are + # hard, putting a bit of space between consecutive underscores, and + # escaping backslashes. Be careful not to mangle our character + # translations by doing this before processing character translation. + if ($cleanup) { + $text =~ s/\\/\\e/g; + $text =~ s/-/\\-/g; + $text =~ s/_(?=_)/_\\|/g; + } + + # Normally we do character translation, but we won't even do that in + # blocks or if UTF-8 output is desired. + if ($convert && !$$self{utf8} && ASCII) { + $text =~ s/([^\x00-\x7F])/$ESCAPES{ord ($1)} || "X"/eg; + } + + # Ensure that *roff doesn't convert literal quotes to UTF-8 single quotes, + # but don't mess up our accept escapes. + if ($literal) { + $text =~ s/(?guesswork ($text); + } + + return $text; +} + +# Handles C<> text, deciding whether to put \*C` around it or not. This is a +# whole bunch of messy heuristics to try to avoid overquoting, originally from +# Barrie Slaymaker. This largely duplicates similar code in Pod::Text. +sub quote_literal { + my $self = shift; + local $_ = shift; + + # A regex that matches the portion of a variable reference that's the + # array or hash index, separated out just because we want to use it in + # several places in the following regex. + my $index = '(?: \[.*\] | \{.*\} )?'; + + # If in NAME section, just return an ASCII quoted string to avoid + # confusing tools like whatis. + return qq{"$_"} if $$self{IN_NAME}; + + # Check for things that we don't want to quote, and if we find any of + # them, return the string with just a font change and no quoting. + m{ + ^\s* + (?: + ( [\'\`\"] ) .* \1 # already quoted + | \\\*\(Aq .* \\\*\(Aq # quoted and escaped + | \\?\` .* ( \' | \\\*\(Aq ) # `quoted' + | \$+ [\#^]? \S $index # special ($^Foo, $") + | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func + | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call + | [-+]? ( \d[\d.]* | \.\d+ ) (?: [eE][-+]?\d+ )? # a number + | 0x [a-fA-F\d]+ # a hex constant + ) + \s*\z + }xso and return '\f(FS' . $_ . '\f(FE'; + + # If we didn't return, go ahead and quote the text. + return '\f(FS\*(C`' . $_ . "\\*(C'\\f(FE"; +} + +# Takes a text block to perform guesswork on. Returns the text block with +# formatting codes added. This is the code that marks up various Perl +# constructs and things commonly used in man pages without requiring the user +# to add any explicit markup, and is applied to all non-literal text. We're +# guaranteed that the text we're applying guesswork to does not contain any +# *roff formatting codes. Note that the inserted font sequences must be +# treated later with mapfonts or textmapfonts. +# +# This method is very fragile, both in the regular expressions it uses and in +# the ordering of those modifications. Care and testing is required when +# modifying it. +sub guesswork { + my $self = shift; + local $_ = shift; + DEBUG > 5 and print " Guesswork called on [$_]\n"; + + # By the time we reach this point, all hyphens will be escaped by adding a + # backslash. We want to undo that escaping if they're part of regular + # words and there's only a single dash, since that's a real hyphen that + # *roff gets to consider a possible break point. Make sure that a dash + # after the first character of a word stays non-breaking, however. + # + # Note that this is not user-controllable; we pretty much have to do this + # transformation or *roff will mangle the output in unacceptable ways. + s{ + ( (?:\G|^|\s) [\(\"]* [a-zA-Z] ) ( \\- )? + ( (?: [a-zA-Z\']+ \\-)+ ) + ( [a-zA-Z\']+ ) (?= [\)\".?!,;:]* (?:\s|\Z|\\\ ) ) + \b + } { + my ($prefix, $hyphen, $main, $suffix) = ($1, $2, $3, $4); + $hyphen ||= ''; + $main =~ s/\\-/-/g; + $prefix . $hyphen . $main . $suffix; + }egx; + + # Translate "--" into a real em-dash if it's used like one. This means + # that it's either surrounded by whitespace, it follows a regular word, or + # it occurs between two regular words. + if ($$self{MAGIC_EMDASH}) { + s{ (\s) \\-\\- (\s) } { $1 . '\*(--' . $2 }egx; + s{ (\b[a-zA-Z]+) \\-\\- (\s|\Z|[a-zA-Z]+\b) } { $1 . '\*(--' . $2 }egx; + } + + # Make words in all-caps a little bit smaller; they look better that way. + # However, we don't want to change Perl code (like @ARGV), nor do we want + # to fix the MIME in MIME-Version since it looks weird with the + # full-height V. + # + # We change only a string of all caps (2) either at the beginning of the + # line or following regular punctuation (like quotes) or whitespace (1), + # and followed by either similar punctuation, an em-dash, or the end of + # the line (3). + # + # Allow the text we're changing to small caps to include double quotes, + # commas, newlines, and periods as long as it doesn't otherwise interrupt + # the string of small caps and still fits the criteria. This lets us turn + # entire warranty disclaimers in man page output into small caps. + if ($$self{MAGIC_SMALLCAPS}) { + s{ + ( ^ | [\s\(\"\'\`\[\{<>] | \\[ ] ) # (1) + ( [A-Z] [A-Z] (?: \s? [/A-Z+:\d_\$&] | \\- | \s? [.,\"] )* ) # (2) + (?= [\s>\}\]\(\)\'\".?!,;] | \\*\(-- | \\[ ] | $ ) # (3) + } { + $1 . '\s-1' . $2 . '\s0' + }egx; + } + + # Note that from this point forward, we have to adjust for \s-1 and \s-0 + # strings inserted around things that we've made small-caps if later + # transforms should work on those strings. + + # Embolden functions in the form func(), including functions that are in + # all capitals, but don't embolden if there's anything between the parens. + # The function must start with an alphabetic character or underscore and + # then consist of word characters or colons. + if ($$self{MAGIC_FUNC}) { + s{ + ( \b | \\s-1 ) + ( [A-Za-z_] ([:\w] | \\s-?[01])+ \(\) ) + } { + $1 . '\f(BS' . $2 . '\f(BE' + }egx; + } + + # Change references to manual pages to put the page name in bold but + # the number in the regular font, with a thin space between the name and + # the number. Only recognize func(n) where func starts with an alphabetic + # character or underscore and contains only word characters, periods (for + # configuration file man pages), or colons, and n is a single digit, + # optionally followed by some number of lowercase letters. Note that this + # does not recognize man page references like perl(l) or socket(3SOCKET). + if ($$self{MAGIC_MANREF}) { + s{ + ( \b | \\s-1 ) + (? 5 and print " Guesswork returning [$_]\n"; + return $_; +} + +############################################################################## +# Output +############################################################################## + +# When building up the *roff code, we don't use real *roff fonts. Instead, we +# embed font codes of the form \f([SE] where is one of B, I, or +# F, S stands for start, and E stands for end. This method turns these into +# the right start and end codes. +# +# We add this level of complexity because the old pod2man didn't get code like +# B else> right; after I<> it switched back to normal text rather +# than bold. We take care of this by using variables that state whether bold, +# italic, or fixed are turned on as a combined pointer to our current font +# sequence, and set each to the number of current nestings of start tags for +# that font. +# +# \fP changes to the previous font, but only one previous font is kept. We +# don't know what the outside level font is; normally it's R, but if we're +# inside a heading it could be something else. So arrange things so that the +# outside font is always the "previous" font and end with \fP instead of \fR. +# Idea from Zack Weinberg. +sub mapfonts { + my ($self, $text) = @_; + my ($fixed, $bold, $italic) = (0, 0, 0); + my %magic = (F => \$fixed, B => \$bold, I => \$italic); + my $last = '\fR'; + $text =~ s< + \\f\((.)(.) + > < + my $sequence = ''; + my $f; + if ($last ne '\fR') { $sequence = '\fP' } + ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1; + $f = $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) }; + if ($f eq $last) { + ''; + } else { + if ($f ne '\fR') { $sequence .= $f } + $last = $f; + $sequence; + } + >gxe; + return $text; +} + +# Unfortunately, there is a bug in Solaris 2.6 nroff (not present in GNU +# groff) where the sequence \fB\fP\f(CW\fP leaves the font set to B rather +# than R, presumably because \f(CW doesn't actually do a font change. To work +# around this, use a separate textmapfonts for text blocks where the default +# font is always R and only use the smart mapfonts for headings. +sub textmapfonts { + my ($self, $text) = @_; + my ($fixed, $bold, $italic) = (0, 0, 0); + my %magic = (F => \$fixed, B => \$bold, I => \$italic); + $text =~ s< + \\f\((.)(.) + > < + ${ $magic{$1} } += ($2 eq 'S') ? 1 : -1; + $$self{FONTS}{ ($fixed && 1) . ($bold && 1) . ($italic && 1) }; + >gxe; + return $text; +} + +# Given a command and a single argument that may or may not contain double +# quotes, handle double-quote formatting for it. If there are no double +# quotes, just return the command followed by the argument in double quotes. +# If there are double quotes, use an if statement to test for nroff, and for +# nroff output the command followed by the argument in double quotes with +# embedded double quotes doubled. For other formatters, remap paired double +# quotes to LQUOTE and RQUOTE. +sub switchquotes { + my ($self, $command, $text, $extra) = @_; + $text =~ s/\\\*\([LR]\"/\"/g; + + # We also have to deal with \*C` and \*C', which are used to add the + # quotes around C<> text, since they may expand to " and if they do this + # confuses the .SH macros and the like no end. Expand them ourselves. + # Also separate troff from nroff if there are any fixed-width fonts in use + # to work around problems with Solaris nroff. + my $c_is_quote = ($$self{LQUOTE} =~ /\"/) || ($$self{RQUOTE} =~ /\"/); + my $fixedpat = join '|', @{ $$self{FONTS} }{'100', '101', '110', '111'}; + $fixedpat =~ s/\\/\\\\/g; + $fixedpat =~ s/\(/\\\(/g; + if ($text =~ m/\"/ || $text =~ m/$fixedpat/) { + $text =~ s/\"/\"\"/g; + my $nroff = $text; + my $troff = $text; + $troff =~ s/\"\"([^\"]*)\"\"/\`\`$1\'\'/g; + if ($c_is_quote and $text =~ m/\\\*\(C[\'\`]/) { + $nroff =~ s/\\\*\(C\`/$$self{LQUOTE}/g; + $nroff =~ s/\\\*\(C\'/$$self{RQUOTE}/g; + $troff =~ s/\\\*\(C[\'\`]//g; + } + $nroff = qq("$nroff") . ($extra ? " $extra" : ''); + $troff = qq("$troff") . ($extra ? " $extra" : ''); + + # Work around the Solaris nroff bug where \f(CW\fP leaves the font set + # to Roman rather than the actual previous font when used in headings. + # troff output may still be broken, but at least we can fix nroff by + # just switching the font changes to the non-fixed versions. + my $font_end = "(?:\\f[PR]|\Q$$self{FONTS}{100}\E)"; + $nroff =~ s/\Q$$self{FONTS}{100}\E(.*?)\\f([PR])/$1/g; + $nroff =~ s/\Q$$self{FONTS}{101}\E(.*?)$font_end/\\fI$1\\fP/g; + $nroff =~ s/\Q$$self{FONTS}{110}\E(.*?)$font_end/\\fB$1\\fP/g; + $nroff =~ s/\Q$$self{FONTS}{111}\E(.*?)$font_end/\\f\(BI$1\\fP/g; + + # Now finally output the command. Bother with .ie only if the nroff + # and troff output aren't the same. + if ($nroff ne $troff) { + return ".ie n $command $nroff\n.el $command $troff\n"; + } else { + return "$command $nroff\n"; + } + } else { + $text = qq("$text") . ($extra ? " $extra" : ''); + return "$command $text\n"; + } +} + +# Protect leading quotes and periods against interpretation as commands. Also +# protect anything starting with a backslash, since it could expand or hide +# something that *roff would interpret as a command. This is overkill, but +# it's much simpler than trying to parse *roff here. +sub protect { + my ($self, $text) = @_; + $text =~ s/^([.\'\\])/\\&$1/mg; + return $text; +} + +# Make vertical whitespace if NEEDSPACE is set, appropriate to the indentation +# level the situation. This function is needed since in *roff one has to +# create vertical whitespace after paragraphs and between some things, but +# other macros create their own whitespace. Also close out a sequence of +# repeated =items, since calling makespace means we're about to begin the item +# body. +sub makespace { + my ($self) = @_; + $self->output (".PD\n") if $$self{ITEMS} > 1; + $$self{ITEMS} = 0; + $self->output ($$self{INDENT} > 0 ? ".Sp\n" : ".PP\n") + if $$self{NEEDSPACE}; +} + +# Output any pending index entries, and optionally an index entry given as an +# argument. Support multiple index entries in X<> separated by slashes, and +# strip special escapes from index entries. +sub outindex { + my ($self, $section, $index) = @_; + my @entries = map { split m%\s*/\s*% } @{ $$self{INDEX} }; + return unless ($section || @entries); + + # We're about to output all pending entries, so clear our pending queue. + $$self{INDEX} = []; + + # Build the output. Regular index entries are marked Xref, and headings + # pass in their own section. Undo some *roff formatting on headings. + my @output; + if (@entries) { + push @output, [ 'Xref', join (' ', @entries) ]; + } + if ($section) { + $index =~ s/\\-/-/g; + $index =~ s/\\(?:s-?\d|.\(..|.)//g; + push @output, [ $section, $index ]; + } + + # Print out the .IX commands. + for (@output) { + my ($type, $entry) = @$_; + $entry =~ s/\s+/ /g; + $entry =~ s/\"/\"\"/g; + $entry =~ s/\\/\\\\/g; + $self->output (".IX $type " . '"' . $entry . '"' . "\n"); + } +} + +# Output some text, without any additional changes. +sub output { + my ($self, @text) = @_; + if ($$self{ENCODE}) { + print { $$self{output_fh} } Encode::encode ('UTF-8', join ('', @text)); + } else { + print { $$self{output_fh} } @text; + } +} + +############################################################################## +# Document initialization +############################################################################## + +# Handle the start of the document. Here we handle empty documents, as well +# as setting up our basic macros in a preamble and building the page title. +sub start_document { + my ($self, $attrs) = @_; + if ($$attrs{contentless} && !$$self{ALWAYS_EMIT_SOMETHING}) { + DEBUG and print "Document is contentless\n"; + $$self{CONTENTLESS} = 1; + } else { + delete $$self{CONTENTLESS}; + } + + # When UTF-8 output is set, check whether our output file handle already + # has a PerlIO encoding layer set. If it does not, we'll need to encode + # our output before printing it (handled in the output() sub). Wrap the + # check in an eval to handle versions of Perl without PerlIO. + # + # PerlIO::get_layers still requires its argument be a glob, so coerce the + # file handle to a glob. + $$self{ENCODE} = 0; + if ($$self{utf8}) { + $$self{ENCODE} = 1; + eval { + my @options = (output => 1, details => 1); + my @layers = PerlIO::get_layers (*{$$self{output_fh}}, @options); + if ($layers[-1] & PerlIO::F_UTF8 ()) { + $$self{ENCODE} = 0; + } + } + } + + # Determine information for the preamble and then output it unless the + # document was content-free. + if (!$$self{CONTENTLESS}) { + my ($name, $section); + if (defined $$self{name}) { + $name = $$self{name}; + $section = $$self{section} || 1; + } else { + ($name, $section) = $self->devise_title; + } + my $date = defined($$self{date}) ? $$self{date} : $self->devise_date; + $self->preamble ($name, $section, $date) + unless $self->bare_output or DEBUG > 9; + } + + # Initialize a few per-document variables. + $$self{INDENT} = 0; # Current indentation level. + $$self{INDENTS} = []; # Stack of indentations. + $$self{INDEX} = []; # Index keys waiting to be printed. + $$self{IN_NAME} = 0; # Whether processing the NAME section. + $$self{ITEMS} = 0; # The number of consecutive =items. + $$self{ITEMTYPES} = []; # Stack of =item types, one per list. + $$self{SHIFTWAIT} = 0; # Whether there is a shift waiting. + $$self{SHIFTS} = []; # Stack of .RS shifts. + $$self{PENDING} = [[]]; # Pending output. +} + +# Handle the end of the document. This handles dying on POD errors, since +# Pod::Parser currently doesn't. Otherwise, does nothing but print out a +# final comment at the end of the document under debugging. +sub end_document { + my ($self) = @_; + if ($$self{complain_die} && $self->errors_seen) { + croak ("POD document had syntax errors"); + } + return if $self->bare_output; + return if ($$self{CONTENTLESS} && !$$self{ALWAYS_EMIT_SOMETHING}); + $self->output (q(.\" [End document]) . "\n") if DEBUG; +} + +# Try to figure out the name and section from the file name and return them as +# a list, returning an empty name and section 1 if we can't find any better +# information. Uses File::Basename and File::Spec as necessary. +sub devise_title { + my ($self) = @_; + my $name = $self->source_filename || ''; + my $section = $$self{section} || 1; + $section = 3 if (!$$self{section} && $name =~ /\.pm\z/i); + $name =~ s/\.p(od|[lm])\z//i; + + # If Pod::Parser gave us an IO::File reference as the source file name, + # convert that to the empty string as well. Then, if we don't have a + # valid name, convert it to STDIN. + # + # In podlators 4.00 through 4.07, this also produced a warning, but that + # was surprising to a lot of programs that had expected to be able to pipe + # POD through pod2man without specifying the name. In the name of + # backward compatibility, just quietly set STDIN as the page title. + if ($name =~ /^IO::File(?:=\w+)\(0x[\da-f]+\)$/i) { + $name = ''; + } + if ($name eq '') { + $name = 'STDIN'; + } + + # If the section isn't 3, then the name defaults to just the basename of + # the file. + if ($section !~ /^3/) { + require File::Basename; + $name = uc File::Basename::basename ($name); + } else { + require File::Spec; + my ($volume, $dirs, $file) = File::Spec->splitpath ($name); + + # Otherwise, assume we're dealing with a module. We want to figure + # out the full module name from the path to the file, but we don't + # want to include too much of the path into the module name. Lose + # anything up to the first of: + # + # */lib/*perl*/ standard or site_perl module + # */*perl*/lib/ from -Dprefix=/opt/perl + # */*perl*/ random module hierarchy + # + # Also strip off a leading site, site_perl, or vendor_perl component, + # any OS-specific component, and any version number component, and + # strip off an initial component of "lib" or "blib/lib" since that's + # what ExtUtils::MakeMaker creates. + # + # splitdir requires at least File::Spec 0.8. + my @dirs = File::Spec->splitdir ($dirs); + if (@dirs) { + my $cut = 0; + my $i; + for ($i = 0; $i < @dirs; $i++) { + if ($dirs[$i] =~ /perl/) { + $cut = $i + 1; + $cut++ if ($dirs[$i + 1] && $dirs[$i + 1] eq 'lib'); + last; + } + } + if ($cut > 0) { + splice (@dirs, 0, $cut); + shift @dirs if ($dirs[0] =~ /^(site|vendor)(_perl)?$/); + shift @dirs if ($dirs[0] =~ /^[\d.]+$/); + shift @dirs if ($dirs[0] =~ /^(.*-$^O|$^O-.*|$^O)$/); + } + shift @dirs if $dirs[0] eq 'lib'; + splice (@dirs, 0, 2) if ($dirs[0] eq 'blib' && $dirs[1] eq 'lib'); + } + + # Remove empty directories when building the module name; they + # occur too easily on Unix by doubling slashes. + $name = join ('::', (grep { $_ ? $_ : () } @dirs), $file); + } + return ($name, $section); +} + +# Determine the modification date and return that, properly formatted in ISO +# format. +# +# If POD_MAN_DATE is set, that overrides anything else. This can be used for +# reproducible generation of the same file even if the input file timestamps +# are unpredictable or the POD comes from standard input. +# +# Otherwise, if SOURCE_DATE_EPOCH is set and can be parsed as seconds since +# the UNIX epoch, base the timestamp on that. See +# +# +# Otherwise, use the modification date of the input if we can stat it. Be +# aware that Pod::Simple returns the stringification of the file handle as +# source_filename for input from a file handle, so we'll stat some random ref +# string in that case. If that fails, instead use the current time. +# +# $self - Pod::Man object, used to get the source file +# +# Returns: YYYY-MM-DD date suitable for the left-hand footer +sub devise_date { + my ($self) = @_; + + # If POD_MAN_DATE is set, always use it. + if (defined($ENV{POD_MAN_DATE})) { + return $ENV{POD_MAN_DATE}; + } + + # If SOURCE_DATE_EPOCH is set and can be parsed, use that. + my $time; + if (defined($ENV{SOURCE_DATE_EPOCH}) && $ENV{SOURCE_DATE_EPOCH} !~ /\D/) { + $time = $ENV{SOURCE_DATE_EPOCH}; + } + + # Otherwise, get the input filename and try to stat it. If that fails, + # use the current time. + if (!defined $time) { + my $input = $self->source_filename; + if ($input) { + $time = (stat($input))[9] || time(); + } else { + $time = time(); + } + } + + # Can't use POSIX::strftime(), which uses Fcntl, because MakeMaker uses + # this and it has to work in the core which can't load dynamic libraries. + # Use gmtime instead of localtime so that the generated man page does not + # depend on the local time zone setting and is more reproducible + my ($year, $month, $day) = (gmtime($time))[5,4,3]; + return sprintf("%04d-%02d-%02d", $year + 1900, $month + 1, $day); +} + +# Print out the preamble and the title. The meaning of the arguments to .TH +# unfortunately vary by system; some systems consider the fourth argument to +# be a "source" and others use it as a version number. Generally it's just +# presented as the left-side footer, though, so it doesn't matter too much if +# a particular system gives it another interpretation. +# +# The order of date and release used to be reversed in older versions of this +# module, but this order is correct for both Solaris and Linux. +sub preamble { + my ($self, $name, $section, $date) = @_; + my $preamble = $self->preamble_template (!$$self{utf8}); + + # Build the index line and make sure that it will be syntactically valid. + my $index = "$name $section"; + $index =~ s/\"/\"\"/g; + + # If name or section contain spaces, quote them (section really never + # should, but we may as well be cautious). + for ($name, $section) { + if (/\s/) { + s/\"/\"\"/g; + $_ = '"' . $_ . '"'; + } + } + + # Double quotes in date, since it will be quoted. + $date =~ s/\"/\"\"/g; + + # Substitute into the preamble the configuration options. + $preamble =~ s/\@CFONT\@/$$self{fixed}/; + $preamble =~ s/\@LQUOTE\@/$$self{LQUOTE}/; + $preamble =~ s/\@RQUOTE\@/$$self{RQUOTE}/; + chomp $preamble; + + # Get the version information. + my $version = $self->version_report; + + # Finally output everything. + $self->output (<<"----END OF HEADER----"); +.\\" Automatically generated by $version +.\\" +.\\" Standard preamble: +.\\" ======================================================================== +$preamble +.\\" ======================================================================== +.\\" +.IX Title "$index" +.TH $name $section "$date" "$$self{release}" "$$self{center}" +.\\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\\" way too many mistakes in technical documents. +.if n .ad l +.nh +----END OF HEADER---- + $self->output (".\\\" [End of preamble]\n") if DEBUG; +} + +############################################################################## +# Text blocks +############################################################################## + +# Handle a basic block of text. The only tricky part of this is if this is +# the first paragraph of text after an =over, in which case we have to change +# indentations for *roff. +sub cmd_para { + my ($self, $attrs, $text) = @_; + my $line = $$attrs{start_line}; + + # Output the paragraph. We also have to handle =over without =item. If + # there's an =over without =item, SHIFTWAIT will be set, and we need to + # handle creation of the indent here. Add the shift to SHIFTS so that it + # will be cleaned up on =back. + $self->makespace; + if ($$self{SHIFTWAIT}) { + $self->output (".RS $$self{INDENT}\n"); + push (@{ $$self{SHIFTS} }, $$self{INDENT}); + $$self{SHIFTWAIT} = 0; + } + + # Add the line number for debugging, but not in the NAME section just in + # case the comment would confuse apropos. + $self->output (".\\\" [At source line $line]\n") + if defined ($line) && DEBUG && !$$self{IN_NAME}; + + # Force exactly one newline at the end and strip unwanted trailing + # whitespace at the end, but leave "\ " backslashed space from an S< > at + # the end of a line. Reverse the text first, to avoid having to scan the + # entire paragraph. + $text = reverse $text; + $text =~ s/\A\s*?(?= \\|\S|\z)/\n/; + $text = reverse $text; + + # Output the paragraph. + $self->output ($self->protect ($self->textmapfonts ($text))); + $self->outindex; + $$self{NEEDSPACE} = 1; + return ''; +} + +# Handle a verbatim paragraph. Put a null token at the beginning of each line +# to protect against commands and wrap in .Vb/.Ve (which we define in our +# prelude). +sub cmd_verbatim { + my ($self, $attrs, $text) = @_; + + # Ignore an empty verbatim paragraph. + return unless $text =~ /\S/; + + # Force exactly one newline at the end and strip unwanted trailing + # whitespace at the end. Reverse the text first, to avoid having to scan + # the entire paragraph. + $text = reverse $text; + $text =~ s/\A\s*/\n/; + $text = reverse $text; + + # Get a count of the number of lines before the first blank line, which + # we'll pass to .Vb as its parameter. This tells *roff to keep that many + # lines together. We don't want to tell *roff to keep huge blocks + # together. + my @lines = split (/\n/, $text); + my $unbroken = 0; + for (@lines) { + last if /^\s*$/; + $unbroken++; + } + $unbroken = 10 if ($unbroken > 12 && !$$self{MAGIC_VNOPAGEBREAK_LIMIT}); + + # Prepend a null token to each line. + $text =~ s/^/\\&/gm; + + # Output the results. + $self->makespace; + $self->output (".Vb $unbroken\n$text.Ve\n"); + $$self{NEEDSPACE} = 1; + return ''; +} + +# Handle literal text (produced by =for and similar constructs). Just output +# it with the minimum of changes. +sub cmd_data { + my ($self, $attrs, $text) = @_; + $text =~ s/^\n+//; + $text =~ s/\n{0,2}$/\n/; + $self->output ($text); + return ''; +} + +############################################################################## +# Headings +############################################################################## + +# Common code for all headings. This is called before the actual heading is +# output. It returns the cleaned up heading text (putting the heading all on +# one line) and may do other things, like closing bad =item blocks. +sub heading_common { + my ($self, $text, $line) = @_; + $text =~ s/\s+$//; + $text =~ s/\s*\n\s*/ /g; + + # This should never happen; it means that we have a heading after =item + # without an intervening =back. But just in case, handle it anyway. + if ($$self{ITEMS} > 1) { + $$self{ITEMS} = 0; + $self->output (".PD\n"); + } + + # Output the current source line. + $self->output ( ".\\\" [At source line $line]\n" ) + if defined ($line) && DEBUG; + return $text; +} + +# First level heading. We can't output .IX in the NAME section due to a bug +# in some versions of catman, so don't output a .IX for that section. .SH +# already uses small caps, so remove \s0 and \s-1. Maintain IN_NAME as +# appropriate. +sub cmd_head1 { + my ($self, $attrs, $text) = @_; + $text =~ s/\\s-?\d//g; + $text = $self->heading_common ($text, $$attrs{start_line}); + my $isname = ($text eq 'NAME' || $text =~ /\(NAME\)/); + $self->output ($self->switchquotes ('.SH', $self->mapfonts ($text))); + $self->outindex ('Header', $text) unless $isname; + $$self{NEEDSPACE} = 0; + $$self{IN_NAME} = $isname; + return ''; +} + +# Second level heading. +sub cmd_head2 { + my ($self, $attrs, $text) = @_; + $text = $self->heading_common ($text, $$attrs{start_line}); + $self->output ($self->switchquotes ('.SS', $self->mapfonts ($text))); + $self->outindex ('Subsection', $text); + $$self{NEEDSPACE} = 0; + return ''; +} + +# Third level heading. *roff doesn't have this concept, so just put the +# heading in italics as a normal paragraph. +sub cmd_head3 { + my ($self, $attrs, $text) = @_; + $text = $self->heading_common ($text, $$attrs{start_line}); + $self->makespace; + $self->output ($self->textmapfonts ('\f(IS' . $text . '\f(IE') . "\n"); + $self->outindex ('Subsection', $text); + $$self{NEEDSPACE} = 1; + return ''; +} + +# Fourth level heading. *roff doesn't have this concept, so just put the +# heading as a normal paragraph. +sub cmd_head4 { + my ($self, $attrs, $text) = @_; + $text = $self->heading_common ($text, $$attrs{start_line}); + $self->makespace; + $self->output ($self->textmapfonts ($text) . "\n"); + $self->outindex ('Subsection', $text); + $$self{NEEDSPACE} = 1; + return ''; +} + +############################################################################## +# Formatting codes +############################################################################## + +# All of the formatting codes that aren't handled internally by the parser, +# other than L<> and X<>. +sub cmd_b { return $_[0]->{IN_NAME} ? $_[2] : '\f(BS' . $_[2] . '\f(BE' } +sub cmd_i { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' } +sub cmd_f { return $_[0]->{IN_NAME} ? $_[2] : '\f(IS' . $_[2] . '\f(IE' } +sub cmd_c { return $_[0]->quote_literal ($_[2]) } + +# Index entries are just added to the pending entries. +sub cmd_x { + my ($self, $attrs, $text) = @_; + push (@{ $$self{INDEX} }, $text); + return ''; +} + +# Links reduce to the text that we're given, wrapped in angle brackets if it's +# a URL, followed by the URL. We take an option to suppress the URL if anchor +# text is given. We need to format the "to" value of the link before +# comparing it to the text since we may escape hyphens. +sub cmd_l { + my ($self, $attrs, $text) = @_; + if ($$attrs{type} eq 'url') { + my $to = $$attrs{to}; + if (defined $to) { + my $tag = $$self{PENDING}[-1]; + $to = $self->format_text ($$tag[1], $to); + } + if (not defined ($to) or $to eq $text) { + return "<$text>"; + } elsif ($$self{nourls}) { + return $text; + } else { + return "$text <$$attrs{to}>"; + } + } else { + return $text; + } +} + +############################################################################## +# List handling +############################################################################## + +# Handle the beginning of an =over block. Takes the type of the block as the +# first argument, and then the attr hash. This is called by the handlers for +# the four different types of lists (bullet, number, text, and block). +sub over_common_start { + my ($self, $type, $attrs) = @_; + my $line = $$attrs{start_line}; + my $indent = $$attrs{indent}; + DEBUG > 3 and print " Starting =over $type (line $line, indent ", + ($indent || '?'), "\n"; + + # Find the indentation level. + unless (defined ($indent) && $indent =~ /^[-+]?\d{1,4}\s*$/) { + $indent = $$self{indent}; + } + + # If we've gotten multiple indentations in a row, we need to emit the + # pending indentation for the last level that we saw and haven't acted on + # yet. SHIFTS is the stack of indentations that we've actually emitted + # code for. + if (@{ $$self{SHIFTS} } < @{ $$self{INDENTS} }) { + $self->output (".RS $$self{INDENT}\n"); + push (@{ $$self{SHIFTS} }, $$self{INDENT}); + } + + # Now, do record-keeping. INDENTS is a stack of indentations that we've + # seen so far, and INDENT is the current level of indentation. ITEMTYPES + # is a stack of list types that we've seen. + push (@{ $$self{INDENTS} }, $$self{INDENT}); + push (@{ $$self{ITEMTYPES} }, $type); + $$self{INDENT} = $indent + 0; + $$self{SHIFTWAIT} = 1; +} + +# End an =over block. Takes no options other than the class pointer. +# Normally, once we close a block and therefore remove something from INDENTS, +# INDENTS will now be longer than SHIFTS, indicating that we also need to emit +# *roff code to close the indent. This isn't *always* true, depending on the +# circumstance. If we're still inside an indentation, we need to emit another +# .RE and then a new .RS to unconfuse *roff. +sub over_common_end { + my ($self) = @_; + DEBUG > 3 and print " Ending =over\n"; + $$self{INDENT} = pop @{ $$self{INDENTS} }; + pop @{ $$self{ITEMTYPES} }; + + # If we emitted code for that indentation, end it. + if (@{ $$self{SHIFTS} } > @{ $$self{INDENTS} }) { + $self->output (".RE\n"); + pop @{ $$self{SHIFTS} }; + } + + # If we're still in an indentation, *roff will have now lost track of the + # right depth of that indentation, so fix that. + if (@{ $$self{INDENTS} } > 0) { + $self->output (".RE\n"); + $self->output (".RS $$self{INDENT}\n"); + } + $$self{NEEDSPACE} = 1; + $$self{SHIFTWAIT} = 0; +} + +# Dispatch the start and end calls as appropriate. +sub start_over_bullet { my $s = shift; $s->over_common_start ('bullet', @_) } +sub start_over_number { my $s = shift; $s->over_common_start ('number', @_) } +sub start_over_text { my $s = shift; $s->over_common_start ('text', @_) } +sub start_over_block { my $s = shift; $s->over_common_start ('block', @_) } +sub end_over_bullet { $_[0]->over_common_end } +sub end_over_number { $_[0]->over_common_end } +sub end_over_text { $_[0]->over_common_end } +sub end_over_block { $_[0]->over_common_end } + +# The common handler for all item commands. Takes the type of the item, the +# attributes, and then the text of the item. +# +# Emit an index entry for anything that's interesting, but don't emit index +# entries for things like bullets and numbers. Newlines in an item title are +# turned into spaces since *roff can't handle them embedded. +sub item_common { + my ($self, $type, $attrs, $text) = @_; + my $line = $$attrs{start_line}; + DEBUG > 3 and print " $type item (line $line): $text\n"; + + # Clean up the text. We want to end up with two variables, one ($text) + # which contains any body text after taking out the item portion, and + # another ($item) which contains the actual item text. + $text =~ s/\s+$//; + my ($item, $index); + if ($type eq 'bullet') { + $item = "\\\(bu"; + $text =~ s/\n*$/\n/; + } elsif ($type eq 'number') { + $item = $$attrs{number} . '.'; + } else { + $item = $text; + $item =~ s/\s*\n\s*/ /g; + $text = ''; + $index = $item if ($item =~ /\w/); + } + + # Take care of the indentation. If shifts and indents are equal, close + # the top shift, since we're about to create an indentation with .IP. + # Also output .PD 0 to turn off spacing between items if this item is + # directly following another one. We only have to do that once for a + # whole chain of items so do it for the second item in the change. Note + # that makespace is what undoes this. + if (@{ $$self{SHIFTS} } == @{ $$self{INDENTS} }) { + $self->output (".RE\n"); + pop @{ $$self{SHIFTS} }; + } + $self->output (".PD 0\n") if ($$self{ITEMS} == 1); + + # Now, output the item tag itself. + $item = $self->textmapfonts ($item); + $self->output ($self->switchquotes ('.IP', $item, $$self{INDENT})); + $$self{NEEDSPACE} = 0; + $$self{ITEMS}++; + $$self{SHIFTWAIT} = 0; + + # If body text for this item was included, go ahead and output that now. + if ($text) { + $text =~ s/\s*$/\n/; + $self->makespace; + $self->output ($self->protect ($self->textmapfonts ($text))); + $$self{NEEDSPACE} = 1; + } + $self->outindex ($index ? ('Item', $index) : ()); +} + +# Dispatch the item commands to the appropriate place. +sub cmd_item_bullet { my $self = shift; $self->item_common ('bullet', @_) } +sub cmd_item_number { my $self = shift; $self->item_common ('number', @_) } +sub cmd_item_text { my $self = shift; $self->item_common ('text', @_) } +sub cmd_item_block { my $self = shift; $self->item_common ('block', @_) } + +############################################################################## +# Backward compatibility +############################################################################## + +# Reset the underlying Pod::Simple object between calls to parse_from_file so +# that the same object can be reused to convert multiple pages. +sub parse_from_file { + my $self = shift; + $self->reinit; + + # Fake the old cutting option to Pod::Parser. This fiddles with internal + # Pod::Simple state and is quite ugly; we need a better approach. + if (ref ($_[0]) eq 'HASH') { + my $opts = shift @_; + if (defined ($$opts{-cutting}) && !$$opts{-cutting}) { + $$self{in_pod} = 1; + $$self{last_was_blank} = 1; + } + } + + # Do the work. + my $retval = $self->SUPER::parse_from_file (@_); + + # Flush output, since Pod::Simple doesn't do this. Ideally we should also + # close the file descriptor if we had to open one, but we can't easily + # figure this out. + my $fh = $self->output_fh (); + my $oldfh = select $fh; + my $oldflush = $|; + $| = 1; + print $fh ''; + $| = $oldflush; + select $oldfh; + return $retval; +} + +# Pod::Simple failed to provide this backward compatibility function, so +# implement it ourselves. File handles are one of the inputs that +# parse_from_file supports. +sub parse_from_filehandle { + my $self = shift; + return $self->parse_from_file (@_); +} + +# Pod::Simple's parse_file doesn't set output_fh. Wrap the call and do so +# ourself unless it was already set by the caller, since our documentation has +# always said that this should work. +sub parse_file { + my ($self, $in) = @_; + unless (defined $$self{output_fh}) { + $self->output_fh (\*STDOUT); + } + return $self->SUPER::parse_file ($in); +} + +# Do the same for parse_lines, just to be polite. Pod::Simple's man page +# implies that the caller is responsible for setting this, but I don't see any +# reason not to set a default. +sub parse_lines { + my ($self, @lines) = @_; + unless (defined $$self{output_fh}) { + $self->output_fh (\*STDOUT); + } + return $self->SUPER::parse_lines (@lines); +} + +# Likewise for parse_string_document. +sub parse_string_document { + my ($self, $doc) = @_; + unless (defined $$self{output_fh}) { + $self->output_fh (\*STDOUT); + } + return $self->SUPER::parse_string_document ($doc); +} + +############################################################################## +# Translation tables +############################################################################## + +# The following table is adapted from Tom Christiansen's pod2man. It assumes +# that the standard preamble has already been printed, since that's what +# defines all of the accent marks. We really want to do something better than +# this when *roff actually supports other character sets itself, since these +# results are pretty poor. +# +# This only works in an ASCII world. What to do in a non-ASCII world is very +# unclear -- hopefully we can assume UTF-8 and just leave well enough alone. +@ESCAPES{0xA0 .. 0xFF} = ( + "\\ ", undef, undef, undef, undef, undef, undef, undef, + undef, undef, undef, undef, undef, "\\%", undef, undef, + + undef, undef, undef, undef, undef, undef, undef, undef, + undef, undef, undef, undef, undef, undef, undef, undef, + + "A\\*`", "A\\*'", "A\\*^", "A\\*~", "A\\*:", "A\\*o", "\\*(Ae", "C\\*,", + "E\\*`", "E\\*'", "E\\*^", "E\\*:", "I\\*`", "I\\*'", "I\\*^", "I\\*:", + + "\\*(D-", "N\\*~", "O\\*`", "O\\*'", "O\\*^", "O\\*~", "O\\*:", undef, + "O\\*/", "U\\*`", "U\\*'", "U\\*^", "U\\*:", "Y\\*'", "\\*(Th", "\\*8", + + "a\\*`", "a\\*'", "a\\*^", "a\\*~", "a\\*:", "a\\*o", "\\*(ae", "c\\*,", + "e\\*`", "e\\*'", "e\\*^", "e\\*:", "i\\*`", "i\\*'", "i\\*^", "i\\*:", + + "\\*(d-", "n\\*~", "o\\*`", "o\\*'", "o\\*^", "o\\*~", "o\\*:", undef, + "o\\*/" , "u\\*`", "u\\*'", "u\\*^", "u\\*:", "y\\*'", "\\*(th", "y\\*:", +) if ASCII; + +############################################################################## +# Premable +############################################################################## + +# The following is the static preamble which starts all *roff output we +# generate. Most is static except for the font to use as a fixed-width font, +# which is designed by @CFONT@, and the left and right quotes to use for C<> +# text, designated by @LQOUTE@ and @RQUOTE@. However, the second part, which +# defines the accent marks, is only used if $escapes is set to true. +sub preamble_template { + my ($self, $accents) = @_; + my $preamble = <<'----END OF PREAMBLE----'; +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft @CFONT@ +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` @LQUOTE@ +. ds C' @RQUOTE@ +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +----END OF PREAMBLE---- +#'# for cperl-mode + + if ($accents) { + $preamble .= <<'----END OF PREAMBLE----' +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +----END OF PREAMBLE---- +#`# for cperl-mode + } + return $preamble; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +use 5.006; # we use some open(X, "<", $y) syntax + +package Pod::Perldoc; +use strict; +use warnings; +use Config '%Config'; + +use Fcntl; # for sysopen +use File::Basename qw(basename); +use File::Spec::Functions qw(catfile catdir splitdir); + +use vars qw($VERSION @Pagers $Bindir $Pod2man + $Temp_Files_Created $Temp_File_Lifetime +); +$VERSION = '3.2801'; + +#.......................................................................... + +BEGIN { # Make a DEBUG constant very first thing... + unless(defined &DEBUG) { + if(($ENV{'PERLDOCDEBUG'} || '') =~ m/^(\d+)/) { # untaint + eval("sub DEBUG () {$1}"); + die "WHAT? Couldn't eval-up a DEBUG constant!? $@" if $@; + } else { + *DEBUG = sub () {0}; + } + } +} + +use Pod::Perldoc::GetOptsOO; # uses the DEBUG. +use Carp qw(croak carp); + +# these are also in BaseTo, which I don't want to inherit +sub debugging { + my $self = shift; + + ( defined(&Pod::Perldoc::DEBUG) and &Pod::Perldoc::DEBUG() ) + } + +sub debug { + my( $self, @messages ) = @_; + return unless $self->debugging; + print STDERR map { "DEBUG : $_" } @messages; + } + +sub warn { + my( $self, @messages ) = @_; + + carp( join "\n", @messages, '' ); + } + +sub die { + my( $self, @messages ) = @_; + + croak( join "\n", @messages, '' ); + } + +#.......................................................................... + +sub TRUE () {1} +sub FALSE () {return} +sub BE_LENIENT () {1} + +BEGIN { + *is_vms = $^O eq 'VMS' ? \&TRUE : \&FALSE unless defined &is_vms; + *is_mswin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &is_mswin32; + *is_dos = $^O eq 'dos' ? \&TRUE : \&FALSE unless defined &is_dos; + *is_os2 = $^O eq 'os2' ? \&TRUE : \&FALSE unless defined &is_os2; + *is_cygwin = $^O eq 'cygwin' ? \&TRUE : \&FALSE unless defined &is_cygwin; + *is_linux = $^O eq 'linux' ? \&TRUE : \&FALSE unless defined &is_linux; + *is_hpux = $^O =~ m/hpux/ ? \&TRUE : \&FALSE unless defined &is_hpux; + *is_amigaos = $^O eq 'amigaos' ? \&TRUE : \&FALSE unless defined &is_amigaos; +} + +$Temp_File_Lifetime ||= 60 * 60 * 24 * 5; + # If it's older than five days, it's quite unlikely + # that anyone's still looking at it!! + # (Currently used only by the MSWin cleanup routine) + + +#.......................................................................... +{ my $pager = $Config{'pager'}; + push @Pagers, $pager if -x (split /\s+/, $pager)[0] or __PACKAGE__->is_vms; +} +$Bindir = $Config{'scriptdirexp'}; +$Pod2man = "pod2man" . ( $Config{'versiononly'} ? $Config{'version'} : '' ); + +# End of class-init stuff +# +########################################################################### +# +# Option accessors... + +foreach my $subname (map "opt_$_", split '', q{mhlDriFfXqnTdULva}) { + no strict 'refs'; + *$subname = do{ use strict 'refs'; sub () { shift->_elem($subname, @_) } }; +} + +# And these are so that GetOptsOO knows they take options: +sub opt_a_with { shift->_elem('opt_a', @_) } +sub opt_f_with { shift->_elem('opt_f', @_) } +sub opt_q_with { shift->_elem('opt_q', @_) } +sub opt_d_with { shift->_elem('opt_d', @_) } +sub opt_L_with { shift->_elem('opt_L', @_) } +sub opt_v_with { shift->_elem('opt_v', @_) } + +sub opt_w_with { # Specify an option for the formatter subclass + my($self, $value) = @_; + if($value =~ m/^([-_a-zA-Z][-_a-zA-Z0-9]*)(?:[=\:](.*?))?$/s) { + my $option = $1; + my $option_value = defined($2) ? $2 : "TRUE"; + $option =~ tr/\-/_/s; # tolerate "foo-bar" for "foo_bar" + $self->add_formatter_option( $option, $option_value ); + } else { + $self->warn( qq("$value" isn't a good formatter option name. I'm ignoring it!\n ) ); + } + return; +} + +sub opt_M_with { # specify formatter class name(s) + my($self, $classes) = @_; + return unless defined $classes and length $classes; + DEBUG > 4 and print "Considering new formatter classes -M$classes\n"; + my @classes_to_add; + foreach my $classname (split m/[,;]+/s, $classes) { + next unless $classname =~ m/\S/; + if( $classname =~ m/^(\w+(::\w+)+)$/s ) { + # A mildly restrictive concept of what modulenames are valid. + push @classes_to_add, $1; # untaint + } else { + $self->warn( qq("$classname" isn't a valid classname. Ignoring.\n) ); + } + } + + unshift @{ $self->{'formatter_classes'} }, @classes_to_add; + + DEBUG > 3 and print( + "Adding @classes_to_add to the list of formatter classes, " + . "making them @{ $self->{'formatter_classes'} }.\n" + ); + + return; +} + +sub opt_V { # report version and exit + print join '', + "Perldoc v$VERSION, under perl v$] for $^O", + + (defined(&Win32::BuildNumber) and defined &Win32::BuildNumber()) + ? (" (win32 build ", &Win32::BuildNumber(), ")") : (), + + (chr(65) eq 'A') ? () : " (non-ASCII)", + + "\n", + ; + exit; +} + +sub opt_t { # choose plaintext as output format + my $self = shift; + $self->opt_o_with('text') if @_ and $_[0]; + return $self->_elem('opt_t', @_); +} + +sub opt_u { # choose raw pod as output format + my $self = shift; + $self->opt_o_with('pod') if @_ and $_[0]; + return $self->_elem('opt_u', @_); +} + +sub opt_n_with { + # choose man as the output format, and specify the proggy to run + my $self = shift; + $self->opt_o_with('man') if @_ and $_[0]; + $self->_elem('opt_n', @_); +} + +sub opt_o_with { # "o" for output format + my($self, $rest) = @_; + return unless defined $rest and length $rest; + if($rest =~ m/^(\w+)$/s) { + $rest = $1; #untaint + } else { + $self->warn( qq("$rest" isn't a valid output format. Skipping.\n") ); + return; + } + + $self->aside("Noting \"$rest\" as desired output format...\n"); + + # Figure out what class(es) that could actually mean... + + my @classes; + foreach my $prefix ("Pod::Perldoc::To", "Pod::Simple::", "Pod::") { + # Messy but smart: + foreach my $stem ( + $rest, # Yes, try it first with the given capitalization + "\L$rest", "\L\u$rest", "\U$rest" # And then try variations + + ) { + $self->aside("Considering $prefix$stem\n"); + push @classes, $prefix . $stem; + } + + # Tidier, but misses too much: + #push @classes, $prefix . ucfirst(lc($rest)); + } + $self->opt_M_with( join ";", @classes ); + return; +} + +########################################################################### +# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % + +sub run { # to be called by the "perldoc" executable + my $class = shift; + if(DEBUG > 3) { + print "Parameters to $class\->run:\n"; + my @x = @_; + while(@x) { + $x[1] = '' unless defined $x[1]; + $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY'; + print " [$x[0]] => [$x[1]]\n"; + splice @x,0,2; + } + print "\n"; + } + return $class -> new(@_) -> process() || 0; +} + +# % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % +########################################################################### + +sub new { # yeah, nothing fancy + my $class = shift; + my $new = bless {@_}, (ref($class) || $class); + DEBUG > 1 and print "New $class object $new\n"; + $new->init(); + $new; +} + +#.......................................................................... + +sub aside { # If we're in -D or DEBUG mode, say this. + my $self = shift; + if( DEBUG or $self->opt_D ) { + my $out = join( '', + DEBUG ? do { + my $callsub = (caller(1))[3]; + my $package = quotemeta(__PACKAGE__ . '::'); + $callsub =~ s/^$package/'/os; + # the o is justified, as $package really won't change. + $callsub . ": "; + } : '', + @_, + ); + if(DEBUG) { print $out } else { print STDERR $out } + } + return; +} + +#.......................................................................... + +sub usage { + my $self = shift; + $self->warn( "@_\n" ) if @_; + + # Erase evidence of previous errors (if any), so exit status is simple. + $! = 0; + + CORE::die( <debug( "The value in $0 is a symbolic link to $link\n" ); + } + + my $basename = basename( $0 ); + + $self->debug( "\$0 is [$0]\nbasename is [$basename]\n" ); + # possible name forms + # perldoc + # perldoc-v5.14 + # perldoc-5.14 + # perldoc-5.14.2 + # perlvar # an alias mentioned in Camel 3 + { + my( $untainted ) = $basename =~ m/( + \A + perl + (?: doc | func | faq | help | op | toc | var # Camel 3 + ) + (?: -? v? \d+ \. \d+ (?:\. \d+)? )? # possible version + (?: \. (?: bat | exe | com ) )? # possible extension + \z + ) + /x; + + $self->debug($untainted); + return $untainted if $untainted; + } + + $self->warn(<<"HERE"); +You called the perldoc command with a name that I didn't recognize. +This might mean that someone is tricking you into running a +program you don't intend to use, but it also might mean that you +created your own link to perldoc. I think your program name is +[$basename]. + +I'll allow this if the filename only has [a-zA-Z0-9._-]. +HERE + + { + my( $untainted ) = $basename =~ m/( + \A [a-zA-Z0-9._-]+ \z + )/x; + + $self->debug($untainted); + return $untainted if $untainted; + } + + $self->die(<<"HERE"); +I think that your name for perldoc is potentially unsafe, so I'm +going to disallow it. I'd rather you be safe than sorry. If you +intended to use the name I'm disallowing, please tell the maintainers +about it. Write to: + + Pod-Perldoc\@rt.cpan.org + +HERE +} + +#.......................................................................... + +sub usage_brief { + my $self = shift; + my $program_name = $self->program_name; + + CORE::die( <<"EOUSAGE" ); +Usage: $program_name [-hVriDtumUFXlT] [-n nroffer_program] + [-d output_filename] [-o output_format] [-M FormatterModule] + [-w formatter_option:option_value] [-L translation_code] + PageName|ModuleName|ProgramName + +Examples: + + $program_name -f PerlFunc + $program_name -q FAQKeywords + $program_name -v PerlVar + $program_name -a PerlAPI + +The -h option prints more help. Also try "$program_name perldoc" to get +acquainted with the system. [Perldoc v$VERSION] +EOUSAGE + +} + +#.......................................................................... + +sub pagers { @{ shift->{'pagers'} } } + +#.......................................................................... + +sub _elem { # handy scalar meta-accessor: shift->_elem("foo", @_) + if(@_ > 2) { return $_[0]{ $_[1] } = $_[2] } + else { return $_[0]{ $_[1] } } +} +#.......................................................................... +########################################################################### +# +# Init formatter switches, and start it off with __bindir and all that +# other stuff that ToMan.pm needs. +# + +sub init { + my $self = shift; + + # Make sure creat()s are neither too much nor too little + eval { umask(0077) }; # doubtless someone has no mask + + if ( $] < 5.008 ) { + $self->aside("Your old perl doesn't have proper unicode support."); + } + else { + # http://www.perl.com/pub/2012/04/perlunicookbook-decode-argv-as-utf8.html + # Decode command line arguments as UTF-8. See RT#98906 for example problem. + use Encode qw(decode_utf8); + @ARGV = map { decode_utf8($_, 1) } @ARGV; + } + + $self->{'args'} ||= \@ARGV; + $self->{'found'} ||= []; + $self->{'temp_file_list'} ||= []; + + + $self->{'target'} = undef; + + $self->init_formatter_class_list; + + $self->{'pagers' } = [@Pagers] unless exists $self->{'pagers'}; + $self->{'bindir' } = $Bindir unless exists $self->{'bindir'}; + $self->{'pod2man'} = $Pod2man unless exists $self->{'pod2man'}; + $self->{'search_path'} = [ ] unless exists $self->{'search_path'}; + + push @{ $self->{'formatter_switches'} = [] }, ( + # Yeah, we could use a hashref, but maybe there's some class where options + # have to be ordered; so we'll use an arrayref. + + [ '__bindir' => $self->{'bindir' } ], + [ '__pod2man' => $self->{'pod2man'} ], + ); + + DEBUG > 3 and printf "Formatter switches now: [%s]\n", + join ' ', map "[@$_]", @{ $self->{'formatter_switches'} }; + + $self->{'translators'} = []; + $self->{'extra_search_dirs'} = []; + + return; +} + +#.......................................................................... + +sub init_formatter_class_list { + my $self = shift; + $self->{'formatter_classes'} ||= []; + + # Remember, no switches have been read yet, when + # we've started this routine. + + $self->opt_M_with('Pod::Perldoc::ToPod'); # the always-there fallthru + $self->opt_o_with('text'); + + return; +} + +#.......................................................................... + +sub process { + # if this ever returns, its retval will be used for exit(RETVAL) + + my $self = shift; + DEBUG > 1 and print " Beginning process.\n"; + DEBUG > 1 and print " Args: @{$self->{'args'}}\n\n"; + if(DEBUG > 3) { + print "Object contents:\n"; + my @x = %$self; + while(@x) { + $x[1] = '' unless defined $x[1]; + $x[1] = "@{$x[1]}" if ref( $x[1] ) eq 'ARRAY'; + print " [$x[0]] => [$x[1]]\n"; + splice @x,0,2; + } + print "\n"; + } + + # TODO: make it deal with being invoked as various different things + # such as perlfaq". + + return $self->usage_brief unless @{ $self->{'args'} }; + $self->options_reading; + $self->pagers_guessing; + $self->aside(sprintf "$0 => %s v%s\n", ref($self), $self->VERSION); + $self->drop_privs_maybe unless ($self->opt_U || $self->opt_F); + $self->options_processing; + + # Hm, we have @pages and @found, but we only really act on one + # file per call, with the exception of the opt_q hack, and with + # -l things + + $self->aside("\n"); + + my @pages; + $self->{'pages'} = \@pages; + if( $self->opt_f) { @pages = qw(perlfunc perlop) } + elsif( $self->opt_q) { @pages = ("perlfaq1" .. "perlfaq9") } + elsif( $self->opt_v) { @pages = ("perlvar") } + elsif( $self->opt_a) { @pages = ("perlapi") } + else { @pages = @{$self->{'args'}}; + # @pages = __FILE__ + # if @pages == 1 and $pages[0] eq 'perldoc'; + } + + return $self->usage_brief unless @pages; + + $self->find_good_formatter_class(); + $self->formatter_sanity_check(); + + $self->maybe_extend_searchpath(); + # for when we're apparently in a module or extension directory + + my @found = $self->grand_search_init(\@pages); + exit ($self->is_vms ? 98962 : 1) unless @found; + + if ($self->opt_l and not $self->opt_q ) { + DEBUG and print "We're in -l mode, so byebye after this:\n"; + print join("\n", @found), "\n"; + return; + } + + $self->tweak_found_pathnames(\@found); + $self->assert_closing_stdout; + return $self->page_module_file(@found) if $self->opt_m; + DEBUG > 2 and print "Found: [@found]\n"; + + return $self->render_and_page(\@found); +} + +#.......................................................................... +{ + +my( %class_seen, %class_loaded ); +sub find_good_formatter_class { + my $self = $_[0]; + my @class_list = @{ $self->{'formatter_classes'} || [] }; + $self->die( "WHAT? Nothing in the formatter class list!?" ) unless @class_list; + + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + + my $good_class_found; + foreach my $c (@class_list) { + DEBUG > 4 and print "Trying to load $c...\n"; + if($class_loaded{$c}) { + DEBUG > 4 and print "OK, the already-loaded $c it is!\n"; + $good_class_found = $c; + last; + } + + if($class_seen{$c}) { + DEBUG > 4 and print + "I've tried $c before, and it's no good. Skipping.\n"; + next; + } + + $class_seen{$c} = 1; + + if( $c->can('parse_from_file') ) { + DEBUG > 4 and print + "Interesting, the formatter class $c is already loaded!\n"; + + } elsif( + ( $self->is_os2 or $self->is_mswin32 or $self->is_dos or $self->is_os2) + # the always case-insensitive filesystems + and $class_seen{lc("~$c")}++ + ) { + DEBUG > 4 and print + "We already used something quite like \"\L$c\E\", so no point using $c\n"; + # This avoids redefining the package. + } else { + DEBUG > 4 and print "Trying to eval 'require $c'...\n"; + + local $^W = $^W; + if(DEBUG() or $self->opt_D) { + # feh, let 'em see it + } else { + $^W = 0; + # The average user just has no reason to be seeing + # $^W-suppressible warnings from the require! + } + + eval "require $c"; + if($@) { + DEBUG > 4 and print "Couldn't load $c: $!\n"; + next; + } + } + + if( $c->can('parse_from_file') ) { + DEBUG > 4 and print "Settling on $c\n"; + my $v = $c->VERSION; + $v = ( defined $v and length $v ) ? " version $v" : ''; + $self->aside("Formatter class $c$v successfully loaded!\n"); + $good_class_found = $c; + last; + } else { + DEBUG > 4 and print "Class $c isn't a formatter?! Skipping.\n"; + } + } + + $self->die( "Can't find any loadable formatter class in @class_list?!\nAborting" ) + unless $good_class_found; + + $self->{'formatter_class'} = $good_class_found; + $self->aside("Will format with the class $good_class_found\n"); + + return; +} + +} +#.......................................................................... + +sub formatter_sanity_check { + my $self = shift; + my $formatter_class = $self->{'formatter_class'} + || $self->die( "NO FORMATTER CLASS YET!?" ); + + if(!$self->opt_T # so -T can FORCE sending to STDOUT + and $formatter_class->can('is_pageable') + and !$formatter_class->is_pageable + and !$formatter_class->can('page_for_perldoc') + ) { + my $ext = + ($formatter_class->can('output_extension') + && $formatter_class->output_extension + ) || ''; + $ext = ".$ext" if length $ext; + + my $me = $self->program_name; + $self->die( + "When using Perldoc to format with $formatter_class, you have to\n" + . "specify -T or -dsomefile$ext\n" + . "See `$me perldoc' for more information on those switches.\n" ) + ; + } +} + +#.......................................................................... + +sub render_and_page { + my($self, $found_list) = @_; + + $self->maybe_generate_dynamic_pod($found_list); + + my($out, $formatter) = $self->render_findings($found_list); + + if($self->opt_d) { + printf "Perldoc (%s) output saved to %s\n", + $self->{'formatter_class'} || ref($self), + $out; + print "But notice that it's 0 bytes long!\n" unless -s $out; + + + } elsif( # Allow the formatter to "page" itself, if it wants. + $formatter->can('page_for_perldoc') + and do { + $self->aside("Going to call $formatter\->page_for_perldoc(\"$out\")\n"); + if( $formatter->page_for_perldoc($out, $self) ) { + $self->aside("page_for_perldoc returned true, so NOT paging with $self.\n"); + 1; + } else { + $self->aside("page_for_perldoc returned false, so paging with $self instead.\n"); + ''; + } + } + ) { + # Do nothing, since the formatter has "paged" it for itself. + + } else { + # Page it normally (internally) + + if( -s $out ) { # Usual case: + $self->page($out, $self->{'output_to_stdout'}, $self->pagers); + + } else { + # Odd case: + $self->aside("Skipping $out (from $$found_list[0] " + . "via $$self{'formatter_class'}) as it is 0-length.\n"); + + push @{ $self->{'temp_file_list'} }, $out; + $self->unlink_if_temp_file($out); + } + } + + $self->after_rendering(); # any extra cleanup or whatever + + return; +} + +#.......................................................................... + +sub options_reading { + my $self = shift; + + if( defined $ENV{"PERLDOC"} and length $ENV{"PERLDOC"} ) { + require Text::ParseWords; + $self->aside("Noting env PERLDOC setting of $ENV{'PERLDOC'}\n"); + # Yes, appends to the beginning + unshift @{ $self->{'args'} }, + Text::ParseWords::shellwords( $ENV{"PERLDOC"} ) + ; + DEBUG > 1 and print " Args now: @{$self->{'args'}}\n\n"; + } else { + DEBUG > 1 and print " Okay, no PERLDOC setting in ENV.\n"; + } + + DEBUG > 1 + and print " Args right before switch processing: @{$self->{'args'}}\n"; + + Pod::Perldoc::GetOptsOO::getopts( $self, $self->{'args'}, 'YES' ) + or return $self->usage; + + DEBUG > 1 + and print " Args after switch processing: @{$self->{'args'}}\n"; + + return $self->usage if $self->opt_h; + + return; +} + +#.......................................................................... + +sub options_processing { + my $self = shift; + + if ($self->opt_X) { + my $podidx = "$Config{'archlib'}/pod.idx"; + $podidx = "" unless -f $podidx && -r _ && -M _ <= 7; + $self->{'podidx'} = $podidx; + } + + $self->{'output_to_stdout'} = 1 if $self->opt_T or ! -t STDOUT; + + $self->options_sanity; + + # This used to set a default, but that's now moved into any + # formatter that cares to have a default. + if( $self->opt_n ) { + $self->add_formatter_option( '__nroffer' => $self->opt_n ); + } + + # Get language from PERLDOC_POD2 environment variable + if ( ! $self->opt_L && $ENV{PERLDOC_POD2} ) { + if ( $ENV{PERLDOC_POD2} eq '1' ) { + $self->_elem('opt_L',(split(/\_/, $ENV{LC_ALL} || $ENV{LC_LANG} || $ENV{LANG}))[0] ); + } + else { + $self->_elem('opt_L', $ENV{PERLDOC_POD2}); + } + }; + + # Adjust for using translation packages + $self->add_translator(split(/\s+/,$self->opt_L)) if $self->opt_L; + + return; +} + +#.......................................................................... + +sub options_sanity { + my $self = shift; + + # The opts-counting stuff interacts quite badly with + # the $ENV{"PERLDOC"} stuff. I.e., if I have $ENV{"PERLDOC"} + # set to -t, and I specify -u on the command line, I don't want + # to be hectored at that -u and -t don't make sense together. + + #my $opts = grep $_ && 1, # yes, the count of the set ones + # $self->opt_t, $self->opt_u, $self->opt_m, $self->opt_l + #; + # + #$self->usage("only one of -t, -u, -m or -l") if $opts > 1; + + + # Any sanity-checking need doing here? + + # But does not make sense to set either -f or -q in $ENV{"PERLDOC"} + if( $self->opt_f or $self->opt_q or $self->opt_a) { + my $count; + $count++ if $self->opt_f; + $count++ if $self->opt_q; + $count++ if $self->opt_a; + $self->usage("Only one of -f or -q or -a") if $count > 1; + $self->warn( + "Perldoc is meant for reading one file at a time.\n", + "So these parameters are being ignored: ", + join(' ', @{$self->{'args'}}), + "\n" ) + if @{$self->{'args'}} + } + return; +} + +#.......................................................................... + +sub grand_search_init { + my($self, $pages, @found) = @_; + + foreach (@$pages) { + if (/^http(s)?:\/\//) { + require HTTP::Tiny; + require File::Temp; + my $response = HTTP::Tiny->new->get($_); + if ($response->{success}) { + my ($fh, $filename) = File::Temp::tempfile(UNLINK => 1); + $fh->print($response->{content}); + push @found, $filename; + ($self->{podnames}{$filename} = + m{.*/([^/#?]+)} ? uc $1 : "UNKNOWN") + =~ s/\.P(?:[ML]|OD)\z//; + } + else { + print STDERR "No " . + ($self->opt_m ? "module" : "documentation") . " found for \"$_\".\n"; + if ( /^https/ ) { + print STDERR "You may need an SSL library (such as IO::Socket::SSL) for that URL.\n"; + } + } + next; + } + if ($self->{'podidx'} && open(PODIDX, $self->{'podidx'})) { + my $searchfor = catfile split '::', $_; + $self->aside( "Searching for '$searchfor' in $self->{'podidx'}\n" ); + local $_; + while () { + chomp; + push(@found, $_) if m,/$searchfor(?:\.(?:pod|pm))?\z,i; + } + close(PODIDX) or $self->die( "Can't close $$self{'podidx'}: $!" ); + next; + } + + $self->aside( "Searching for $_\n" ); + + if ($self->opt_F) { + next unless -r; + push @found, $_ if $self->opt_l or $self->opt_m or $self->containspod($_); + next; + } + + my @searchdirs; + + # prepend extra search directories (including language specific) + push @searchdirs, @{ $self->{'extra_search_dirs'} }; + + # We must look both in @INC for library modules and in $bindir + # for executables, like h2xs or perldoc itself. + push @searchdirs, ($self->{'bindir'}, @{$self->{search_path}}, @INC); + unless ($self->opt_m) { + if ($self->is_vms) { + my($i,$trn); + for ($i = 0; $trn = $ENV{'DCL$PATH;'.$i}; $i++) { + push(@searchdirs,$trn); + } + push(@searchdirs,'perl_root:[lib.pods]') # installed pods + } + else { + push(@searchdirs, grep(-d, split($Config{path_sep}, + $ENV{'PATH'}))); + } + } + my @files = $self->searchfor(0,$_,@searchdirs); + if (@files) { + $self->aside( "Found as @files\n" ); + } + # add "perl" prefix, so "perldoc foo" may find perlfoo.pod + elsif (BE_LENIENT and !/\W/ and @files = $self->searchfor(0, "perl$_", @searchdirs)) { + $self->aside( "Loosely found as @files\n" ); + } + else { + # no match, try recursive search + @searchdirs = grep(!/^\.\z/s,@INC); + @files= $self->searchfor(1,$_,@searchdirs) if $self->opt_r; + if (@files) { + $self->aside( "Loosely found as @files\n" ); + } + else { + print STDERR "No " . + ($self->opt_m ? "module" : "documentation") . " found for \"$_\".\n"; + if ( @{ $self->{'found'} } ) { + print STDERR "However, try\n"; + my $me = $self->program_name; + for my $dir (@{ $self->{'found'} }) { + opendir(DIR, $dir) or $self->die( "opendir $dir: $!" ); + while (my $file = readdir(DIR)) { + next if ($file =~ /^\./s); + $file =~ s/\.(pm|pod)\z//; # XXX: badfs + print STDERR "\t$me $_\::$file\n"; + } + closedir(DIR) or $self->die( "closedir $dir: $!" ); + } + } + } + } + push(@found,@files); + } + return @found; +} + +#.......................................................................... + +sub maybe_generate_dynamic_pod { + my($self, $found_things) = @_; + my @dynamic_pod; + + $self->search_perlapi($found_things, \@dynamic_pod) if $self->opt_a; + + $self->search_perlfunc($found_things, \@dynamic_pod) if $self->opt_f; + + $self->search_perlvar($found_things, \@dynamic_pod) if $self->opt_v; + + $self->search_perlfaqs($found_things, \@dynamic_pod) if $self->opt_q; + + if( ! $self->opt_f and ! $self->opt_q and ! $self->opt_v and ! $self->opt_a) { + DEBUG > 4 and print "That's a non-dynamic pod search.\n"; + } elsif ( @dynamic_pod ) { + $self->aside("Hm, I found some Pod from that search!\n"); + my ($buffd, $buffer) = $self->new_tempfile('pod', 'dyn'); + if ( $] >= 5.008 && $self->opt_L ) { + binmode($buffd, ":encoding(UTF-8)"); + print $buffd "=encoding utf8\n\n"; + } + + push @{ $self->{'temp_file_list'} }, $buffer; + # I.e., it MIGHT be deleted at the end. + + my $in_list = !$self->not_dynamic && $self->opt_f || $self->opt_v || $self->opt_a; + + print $buffd "=over 8\n\n" if $in_list; + print $buffd @dynamic_pod or $self->die( "Can't print $buffer: $!" ); + print $buffd "=back\n" if $in_list; + + close $buffd or $self->die( "Can't close $buffer: $!" ); + + @$found_things = $buffer; + # Yes, so found_things never has more than one thing in + # it, by time we leave here + + $self->add_formatter_option('__filter_nroff' => 1); + + } else { + @$found_things = (); + $self->aside("I found no Pod from that search!\n"); + } + + return; +} + +#.......................................................................... + +sub not_dynamic { + my ($self,$value) = @_; + $self->{__not_dynamic} = $value if @_ == 2; + return $self->{__not_dynamic}; +} + +#.......................................................................... + +sub add_formatter_option { # $self->add_formatter_option('key' => 'value'); + my $self = shift; + push @{ $self->{'formatter_switches'} }, [ @_ ] if @_; + + DEBUG > 3 and printf "Formatter switches now: [%s]\n", + join ' ', map "[@$_]", @{ $self->{'formatter_switches'} }; + + return; +} + +#......................................................................... + +sub new_translator { # $tr = $self->new_translator($lang); + my $self = shift; + my $lang = shift; + + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + my $pack = 'POD2::' . uc($lang); + eval "require $pack"; + if ( !$@ && $pack->can('new') ) { + return $pack->new(); + } + + eval { require POD2::Base }; + return if $@; + + return POD2::Base->new({ lang => $lang }); +} + +#......................................................................... + +sub add_translator { # $self->add_translator($lang); + my $self = shift; + for my $lang (@_) { + my $tr = $self->new_translator($lang); + if ( defined $tr ) { + push @{ $self->{'translators'} }, $tr; + push @{ $self->{'extra_search_dirs'} }, $tr->pod_dirs; + + $self->aside( "translator for '$lang' loaded\n" ); + } else { + # non-installed or bad translator package + $self->warn( "Perldoc cannot load translator package for '$lang': ignored\n" ); + } + + } + return; +} + +#.......................................................................... + +sub open_fh { + my ($self, $op, $path) = @_; + + open my $fh, $op, $path or $self->die("Couldn't open $path: $!"); + return $fh; +} + +sub set_encoding { + my ($self, $fh, $encoding) = @_; + + if ( $encoding =~ /utf-?8/i ) { + $encoding = ":encoding(UTF-8)"; + } + else { + $encoding = ":encoding($encoding)"; + } + + if ( $] < 5.008 ) { + $self->aside("Your old perl doesn't have proper unicode support."); + } + else { + binmode($fh, $encoding); + } + + return $fh; +} + +sub search_perlvar { + my($self, $found_things, $pod) = @_; + + my $opt = $self->opt_v; + + if ( $opt !~ /^ (?: [\@\%\$]\S+ | [A-Z]\w* ) $/x ) { + CORE::die( "'$opt' does not look like a Perl variable\n" ); + } + + DEBUG > 2 and print "Search: @$found_things\n"; + + my $perlvar = shift @$found_things; + my $fh = $self->open_fh("<", $perlvar); + + if ( $opt ne '$0' && $opt =~ /^\$\d+$/ ) { # handle $1, $2, ... + $opt = '$>'; + } + my $search_re = quotemeta($opt); + + DEBUG > 2 and + print "Going to perlvar-scan for $search_re in $perlvar\n"; + + # Skip introduction + local $_; + my $enc; + while (<$fh>) { + $enc = $1 if /^=encoding\s+(\S+)/; + last if /^=over 8/; + } + + $fh = $self->set_encoding($fh, $enc) if $enc; + + # Look for our variable + my $found = 0; + my $inheader = 1; + my $inlist = 0; + while (<$fh>) { + last if /^=head2 Error Indicators/; + # \b at the end of $` and friends borks things! + if ( m/^=item\s+$search_re\s/ ) { + $found = 1; + } + elsif (/^=item/) { + last if $found && !$inheader && !$inlist; + } + elsif (!/^\s+$/) { # not a blank line + if ( $found ) { + $inheader = 0; # don't accept more =item (unless inlist) + } + else { + @$pod = (); # reset + $inheader = 1; # start over + next; + } + } + + if (/^=over/) { + ++$inlist; + } + elsif (/^=back/) { + last if $found && !$inheader && !$inlist; + --$inlist; + } + push @$pod, $_; +# ++$found if /^\w/; # found descriptive text + } + @$pod = () unless $found; + if (!@$pod) { + CORE::die( "No documentation for perl variable '$opt' found\n" ); + } + close $fh or $self->die( "Can't close $perlvar: $!" ); + + return; +} + +#.......................................................................... + +sub search_perlop { + my ($self,$found_things,$pod) = @_; + + $self->not_dynamic( 1 ); + + my $perlop = shift @$found_things; + # XXX FIXME: getting filehandles should probably be done in a single place + # especially since we need to support UTF8 or other encoding when dealing + # with perlop, perlfunc, perlapi, perlfaq[1-9] + my $fh = $self->open_fh('<', $perlop); + + my $thing = $self->opt_f; + + my $previous_line; + my $push = 0; + my $seen_item = 0; + my $skip = 1; + + while( my $line = <$fh> ) { + $line =~ /^=encoding\s+(\S+)/ && $self->set_encoding($fh, $1); + # only start search after we hit the operator section + if ($line =~ m!^X!) { + $skip = 0; + } + + next if $skip; + + # strategy is to capture the previous line until we get a match on X<$thingy> + # if the current line contains X<$thingy>, then we push "=over", the previous line, + # the current line and keep pushing current line until we see a ^X, + # then we chop off final line from @$pod and add =back + # + # At that point, Bob's your uncle. + + if ( $line =~ m!X<+\s*\Q$thing\E\s*>+!) { + if ( $previous_line ) { + push @$pod, "=over 8\n\n", $previous_line; + $previous_line = ""; + } + push @$pod, $line; + $push = 1; + + } + elsif ( $push and $line =~ m!^=item\s*.*$! ) { + $seen_item = 1; + } + elsif ( $push and $seen_item and $line =~ m!^X<+\s*[ a-z,?-]+\s*>+!) { + $push = 0; + $seen_item = 0; + last; + } + elsif ( $push ) { + push @$pod, $line; + } + + else { + $previous_line = $line; + } + + } #end while + + # we overfilled by 1 line, so pop off final array element if we have any + if ( scalar @$pod ) { + pop @$pod; + + # and add the =back + push @$pod, "\n\n=back\n"; + DEBUG > 8 and print "PERLOP POD --->" . (join "", @$pod) . "<---\n"; + } + else { + DEBUG > 4 and print "No pod from perlop\n"; + } + + close $fh; + + return; +} + +#.......................................................................... + +sub search_perlapi { + my($self, $found_things, $pod) = @_; + + DEBUG > 2 and print "Search: @$found_things\n"; + + my $perlapi = shift @$found_things; + my $fh = $self->open_fh('<', $perlapi); + + my $search_re = quotemeta($self->opt_a); + + DEBUG > 2 and + print "Going to perlapi-scan for $search_re in $perlapi\n"; + + local $_; + + # Look for our function + my $found = 0; + my $inlist = 0; + + my @related; + my $related_re; + while (<$fh>) { + /^=encoding\s+(\S+)/ && $self->set_encoding($fh, $1); + + if ( m/^=item\s+$search_re\b/ ) { + $found = 1; + } + elsif (@related > 1 and /^=item/) { + $related_re ||= join "|", @related; + if (m/^=item\s+(?:$related_re)\b/) { + $found = 1; + } + else { + last; + } + } + elsif (/^=item/) { + last if $found > 1 and not $inlist; + } + elsif ($found and /^X<[^>]+>/) { + push @related, m/X<([^>]+)>/g; + } + next unless $found; + if (/^=over/) { + ++$inlist; + } + elsif (/^=back/) { + last if $found > 1 and not $inlist; + --$inlist; + } + push @$pod, $_; + ++$found if /^\w/; # found descriptive text + } + + if (!@$pod) { + CORE::die( sprintf + "No documentation for perl api function '%s' found\n", + $self->opt_a ) + ; + } + close $fh or $self->die( "Can't open $perlapi: $!" ); + + return; +} + +#.......................................................................... + +sub search_perlfunc { + my($self, $found_things, $pod) = @_; + + DEBUG > 2 and print "Search: @$found_things\n"; + + my $pfunc = shift @$found_things; + my $fh = $self->open_fh("<", $pfunc); # "Funk is its own reward" + + # Functions like -r, -e, etc. are listed under `-X'. + my $search_re = ($self->opt_f =~ /^-[rwxoRWXOeszfdlpSbctugkTBMAC]$/) + ? '(?:I<)?-X' : quotemeta($self->opt_f) ; + + DEBUG > 2 and + print "Going to perlfunc-scan for $search_re in $pfunc\n"; + + my $re = 'Alphabetical Listing of Perl Functions'; + + # Check available translator or backup to default (english) + if ( $self->opt_L && defined $self->{'translators'}->[0] ) { + my $tr = $self->{'translators'}->[0]; + $re = $tr->search_perlfunc_re if $tr->can('search_perlfunc_re'); + if ( $] < 5.008 ) { + $self->aside("Your old perl doesn't really have proper unicode support."); + } + } + + # Skip introduction + local $_; + while (<$fh>) { + /^=encoding\s+(\S+)/ && $self->set_encoding($fh, $1); + last if /^=head2 (?:$re|Alphabetical Listing of Perl Functions)/; + } + + # Look for our function + my $found = 0; + my $inlist = 0; + + my @perlops = qw(m q qq qr qx qw s tr y); + + my @related; + my $related_re; + while (<$fh>) { # "The Mothership Connection is here!" + last if( grep{ $self->opt_f eq $_ }@perlops ); + + if ( /^=over/ and not $found ) { + ++$inlist; + } + elsif ( /^=back/ and not $found and $inlist ) { + --$inlist; + } + + + if ( m/^=item\s+$search_re\b/ and $inlist < 2 ) { + $found = 1; + } + elsif (@related > 1 and /^=item/) { + $related_re ||= join "|", @related; + if (m/^=item\s+(?:$related_re)\b/) { + $found = 1; + } + else { + last if $found > 1 and $inlist < 2; + } + } + elsif (/^=item|^=back/) { + last if $found > 1 and $inlist < 2; + } + elsif ($found and /^X<[^>]+>/) { + push @related, m/X<([^>]+)>/g; + } + next unless $found; + if (/^=over/) { + ++$inlist; + } + elsif (/^=back/) { + --$inlist; + } + push @$pod, $_; + ++$found if /^\w/; # found descriptive text + } + + if( !@$pod ){ + $self->search_perlop( $found_things, $pod ); + } + + if (!@$pod) { + CORE::die( sprintf + "No documentation for perl function '%s' found\n", + $self->opt_f ) + ; + } + close $fh or $self->die( "Can't close $pfunc: $!" ); + + return; +} + +#.......................................................................... + +sub search_perlfaqs { + my( $self, $found_things, $pod) = @_; + + my $found = 0; + my %found_in; + my $search_key = $self->opt_q; + + my $rx = eval { qr/$search_key/ } + or $self->die( <die( "invalid file spec: $!" ) if $file =~ /[<>|]/; + my $fh = $self->open_fh("<", $file); + while (<$fh>) { + /^=encoding\s+(\S+)/ && $self->set_encoding($fh, $1); + if ( m/^=head2\s+.*(?:$search_key)/i ) { + $found = 1; + push @$pod, "=head1 Found in $file\n\n" unless $found_in{$file}++; + } + elsif (/^=head[12]/) { + $found = 0; + } + next unless $found; + push @$pod, $_; + } + close($fh); + } + CORE::die("No documentation for perl FAQ keyword '$search_key' found\n") + unless @$pod; + + if ( $self->opt_l ) { + CORE::die((join "\n", keys %found_in) . "\n"); + } + return; +} + + +#.......................................................................... + +sub render_findings { + # Return the filename to open + + my($self, $found_things) = @_; + + my $formatter_class = $self->{'formatter_class'} + || $self->die( "No formatter class set!?" ); + my $formatter = $formatter_class->can('new') + ? $formatter_class->new + : $formatter_class + ; + + if(! @$found_things) { + $self->die( "Nothing found?!" ); + # should have been caught before here + } elsif(@$found_things > 1) { + $self->warn( + "Perldoc is only really meant for reading one document at a time.\n", + "So these parameters are being ignored: ", + join(' ', @$found_things[1 .. $#$found_things] ), + "\n" ); + } + + my $file = $found_things->[0]; + + DEBUG > 3 and printf "Formatter switches now: [%s]\n", + join ' ', map "[@$_]", @{ $self->{'formatter_switches'} }; + + # Set formatter options: + if( ref $formatter ) { + foreach my $f (@{ $self->{'formatter_switches'} || [] }) { + my($switch, $value, $silent_fail) = @$f; + if( $formatter->can($switch) ) { + eval { $formatter->$switch( defined($value) ? $value : () ) }; + $self->warn( "Got an error when setting $formatter_class\->$switch:\n$@\n" ) + if $@; + } else { + if( $silent_fail or $switch =~ m/^__/s ) { + DEBUG > 2 and print "Formatter $formatter_class doesn't support $switch\n"; + } else { + $self->warn( "$formatter_class doesn't recognize the $switch switch.\n" ); + } + } + } + } + + $self->{'output_is_binary'} = + $formatter->can('write_with_binmode') && $formatter->write_with_binmode; + + if( $self->{podnames} and exists $self->{podnames}{$file} and + $formatter->can('name') ) { + $formatter->name($self->{podnames}{$file}); + } + + my ($out_fh, $out) = $self->new_output_file( + ( $formatter->can('output_extension') && $formatter->output_extension ) + || undef, + $self->useful_filename_bit, + ); + + # Now, finally, do the formatting! + { + local $^W = $^W; + if(DEBUG() or $self->opt_D) { + # feh, let 'em see it + } else { + $^W = 0; + # The average user just has no reason to be seeing + # $^W-suppressible warnings from the formatting! + } + + eval { $formatter->parse_from_file( $file, $out_fh ) }; + } + + $self->warn( "Error while formatting with $formatter_class:\n $@\n" ) if $@; + DEBUG > 2 and print "Back from formatting with $formatter_class\n"; + + close $out_fh + or $self->warn( "Can't close $out: $!\n(Did $formatter already close it?)" ); + sleep 0; sleep 0; sleep 0; + # Give the system a few timeslices to meditate on the fact + # that the output file does in fact exist and is closed. + + $self->unlink_if_temp_file($file); + + unless( -s $out ) { + if( $formatter->can( 'if_zero_length' ) ) { + # Basically this is just a hook for Pod::Simple::Checker; since + # what other class could /happily/ format an input file with Pod + # as a 0-length output file? + $formatter->if_zero_length( $file, $out, $out_fh ); + } else { + $self->warn( "Got a 0-length file from $$found_things[0] via $formatter_class!?\n" ); + } + } + + DEBUG and print "Finished writing to $out.\n"; + return($out, $formatter) if wantarray; + return $out; +} + +#.......................................................................... + +sub unlink_if_temp_file { + # Unlink the specified file IFF it's in the list of temp files. + # Really only used in the case of -f / -q things when we can + # throw away the dynamically generated source pod file once + # we've formatted it. + # + my($self, $file) = @_; + return unless defined $file and length $file; + + my $temp_file_list = $self->{'temp_file_list'} || return; + if(grep $_ eq $file, @$temp_file_list) { + $self->aside("Unlinking $file\n"); + unlink($file) or $self->warn( "Odd, couldn't unlink $file: $!" ); + } else { + DEBUG > 1 and print "$file isn't a temp file, so not unlinking.\n"; + } + return; +} + +#.......................................................................... + + +sub after_rendering { + my $self = $_[0]; + $self->after_rendering_VMS if $self->is_vms; + $self->after_rendering_MSWin32 if $self->is_mswin32; + $self->after_rendering_Dos if $self->is_dos; + $self->after_rendering_OS2 if $self->is_os2; + return; +} + +sub after_rendering_VMS { return } +sub after_rendering_Dos { return } +sub after_rendering_OS2 { return } +sub after_rendering_MSWin32 { return } + +#.......................................................................... +# : : : : : : : : : +#.......................................................................... + +sub minus_f_nocase { # i.e., do like -f, but without regard to case + + my($self, $dir, $file) = @_; + my $path = catfile($dir,$file); + return $path if -f $path and -r _; + + if(!$self->opt_i + or $self->is_vms or $self->is_mswin32 + or $self->is_dos or $self->is_os2 + ) { + # On a case-forgiving file system, or if case is important, + # that is it, all we can do. + $self->warn( "Ignored $path: unreadable\n" ) if -f _; + return ''; + } + + local *DIR; + my @p = ($dir); + my($p,$cip); + foreach $p (splitdir $file){ + my $try = catfile @p, $p; + $self->aside("Scrutinizing $try...\n"); + stat $try; + if (-d _) { + push @p, $p; + if ( $p eq $self->{'target'} ) { + my $tmp_path = catfile @p; + my $path_f = 0; + for (@{ $self->{'found'} }) { + $path_f = 1 if $_ eq $tmp_path; + } + push (@{ $self->{'found'} }, $tmp_path) unless $path_f; + $self->aside( "Found as $tmp_path but directory\n" ); + } + } + elsif (-f _ && -r _ && lc($try) eq lc($path)) { + return $try; + } + elsif (-f _) { + $self->warn( "Ignored $try: unreadable or file/dir mismatch\n" ); + } + elsif (-d catdir(@p)) { # at least we see the containing directory! + my $found = 0; + my $lcp = lc $p; + my $p_dirspec = catdir(@p); + opendir DIR, $p_dirspec or $self->die( "opendir $p_dirspec: $!" ); + while(defined( $cip = readdir(DIR) )) { + if (lc $cip eq $lcp){ + $found++; + last; # XXX stop at the first? what if there's others? + } + } + closedir DIR or $self->die( "closedir $p_dirspec: $!" ); + return "" unless $found; + + push @p, $cip; + my $p_filespec = catfile(@p); + return $p_filespec if -f $p_filespec and -r _; + $self->warn( "Ignored $p_filespec: unreadable\n" ) if -f _; + } + } + return ""; +} + +#.......................................................................... + +sub pagers_guessing { + # TODO: This whole subroutine needs to be rewritten. It's semi-insane + # right now. + + my $self = shift; + + my @pagers; + push @pagers, $self->pagers; + $self->{'pagers'} = \@pagers; + + if ($self->is_mswin32) { + push @pagers, qw( more< less notepad ); + unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; + } + elsif ($self->is_vms) { + push @pagers, qw( most more less type/page ); + } + elsif ($self->is_dos) { + push @pagers, qw( less.exe more.com< ); + unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; + } + elsif ( $self->is_amigaos) { + push @pagers, qw( /SYS/Utilities/MultiView /SYS/Utilities/More /C/TYPE ); + unshift @pagers, "$ENV{PAGER}" if $ENV{PAGER}; + } + else { + if ($self->is_os2) { + unshift @pagers, 'less', 'cmd /c more <'; + } + push @pagers, qw( more less pg view cat ); + unshift @pagers, "$ENV{PAGER} <" if $ENV{PAGER}; + } + + if ($self->is_cygwin) { + if (($pagers[0] eq 'less') || ($pagers[0] eq '/usr/bin/less')) { + unshift @pagers, '/usr/bin/less -isrR'; + unshift @pagers, $ENV{PAGER} if $ENV{PAGER}; + } + } + + if ( $self->opt_m ) { + unshift @pagers, "$ENV{PERLDOC_SRC_PAGER}" if $ENV{PERLDOC_SRC_PAGER} + } + else { + unshift @pagers, "$ENV{MANPAGER} <" if $ENV{MANPAGER}; + unshift @pagers, "$ENV{PERLDOC_PAGER} <" if $ENV{PERLDOC_PAGER}; + } + + $self->aside("Pagers: ", (join ", ", @pagers)); + + return; +} + +#.......................................................................... + +sub page_module_file { + my($self, @found) = @_; + + # Security note: + # Don't ever just pass this off to anything like MSWin's "start.exe", + # since we might be calling on a .pl file, and we wouldn't want that + # to actually /execute/ the file that we just want to page thru! + # Also a consideration if one were to use a web browser as a pager; + # doing so could trigger the browser's MIME mapping for whatever + # it thinks .pm/.pl/whatever is. Probably just a (useless and + # annoying) "Save as..." dialog, but potentially executing the file + # in question -- particularly in the case of MSIE and it's, ahem, + # occasionally hazy distinction between OS-local extension + # associations, and browser-specific MIME mappings. + + if(@found > 1) { + $self->warn( + "Perldoc is only really meant for reading one document at a time.\n" . + "So these files are being ignored: " . + join(' ', @found[1 .. $#found] ) . + "\n" ) + } + + return $self->page($found[0], $self->{'output_to_stdout'}, $self->pagers); + +} + +#.......................................................................... + +sub check_file { + my($self, $dir, $file) = @_; + + unless( ref $self ) { + # Should never get called: + $Carp::Verbose = 1; + require Carp; + Carp::croak( join '', + "Crazy ", __PACKAGE__, " error:\n", + "check_file must be an object_method!\n", + "Aborting" + ); + } + + if(length $dir and not -d $dir) { + DEBUG > 3 and print " No dir $dir -- skipping.\n"; + return ""; + } + + my $path = $self->minus_f_nocase($dir,$file); + if( length $path and ($self->opt_m ? $self->isprintable($path) + : $self->containspod($path)) ) { + DEBUG > 3 and print + " The file $path indeed looks promising!\n"; + return $path; + } + DEBUG > 3 and print " No good: $file in $dir\n"; + + return ""; +} + +sub isprintable { + my($self, $file, $readit) = @_; + my $size= 1024; + my $maxunprintfrac= 0.2; # tolerate some unprintables for UTF-8 comments etc. + + return 1 if !$readit && $file =~ /\.(?:pl|pm|pod|cmd|com|bat)\z/i; + + my $data; + local($_); + my $fh = $self->open_fh("<", $file); + read $fh, $data, $size; + close $fh; + $size= length($data); + $data =~ tr/\x09-\x0D\x20-\x7E//d; + return length($data) <= $size*$maxunprintfrac; +} + +#.......................................................................... + +sub containspod { + my($self, $file, $readit) = @_; + return 1 if !$readit && $file =~ /\.pod\z/i; + + + # Under cygwin the /usr/bin/perl is legal executable, but + # you cannot open a file with that name. It must be spelled + # out as "/usr/bin/perl.exe". + # + # The following if-case under cygwin prevents error + # + # $ perldoc perl + # Cannot open /usr/bin/perl: no such file or directory + # + # This would work though + # + # $ perldoc perl.pod + + if ( $self->is_cygwin and -x $file and -f "$file.exe" ) + { + $self->warn( "Cygwin $file.exe search skipped\n" ) if DEBUG or $self->opt_D; + return 0; + } + + local($_); + my $fh = $self->open_fh("<", $file); + while (<$fh>) { + if (/^=head/) { + close($fh) or $self->die( "Can't close $file: $!" ); + return 1; + } + } + close($fh) or $self->die( "Can't close $file: $!" ); + return 0; +} + +#.......................................................................... + +sub maybe_extend_searchpath { + my $self = shift; + + # Does this look like a module or extension directory? + + if (-f "Makefile.PL" || -f "Build.PL") { + + push @{$self->{search_path} }, '.','lib'; + + # don't add if superuser + if ($< && $> && -d "blib") { # don't be looking too hard now! + push @{ $self->{search_path} }, 'blib'; + $self->warn( $@ ) if $@ && $self->opt_D; + } + } + + return; +} + +#.......................................................................... + +sub new_output_file { + my $self = shift; + my $outspec = $self->opt_d; # Yes, -d overrides all else! + # So don't call this twice per format-job! + + return $self->new_tempfile(@_) unless defined $outspec and length $outspec; + + # Otherwise open a write-handle on opt_d!f + + DEBUG > 3 and print "About to try writing to specified output file $outspec\n"; + my $fh = $self->open_fh(">", $outspec); + + DEBUG > 3 and print "Successfully opened $outspec\n"; + binmode($fh) if $self->{'output_is_binary'}; + return($fh, $outspec); +} + +#.......................................................................... + +sub useful_filename_bit { + # This tries to provide a meaningful bit of text to do with the query, + # such as can be used in naming the file -- since if we're going to be + # opening windows on temp files (as a "pager" may well do!) then it's + # better if the temp file's name (which may well be used as the window + # title) isn't ALL just random garbage! + # In other words "perldoc_LWPSimple_2371981429" is a better temp file + # name than "perldoc_2371981429". So this routine is what tries to + # provide the "LWPSimple" bit. + # + my $self = shift; + my $pages = $self->{'pages'} || return undef; + return undef unless @$pages; + + my $chunk = $pages->[0]; + return undef unless defined $chunk; + $chunk =~ s/:://g; + $chunk =~ s/\.\w+$//g; # strip any extension + if( $chunk =~ m/([^\#\\:\/\$]+)$/s ) { # get basename, if it's a file + $chunk = $1; + } else { + return undef; + } + $chunk =~ s/[^a-zA-Z0-9]+//g; # leave ONLY a-zA-Z0-9 things! + $chunk = substr($chunk, -10) if length($chunk) > 10; + return $chunk; +} + +#.......................................................................... + +sub new_tempfile { # $self->new_tempfile( [$suffix, [$infix] ] ) + my $self = shift; + + ++$Temp_Files_Created; + + require File::Temp; + return File::Temp::tempfile(UNLINK => 1); +} + +#.......................................................................... + +sub page { # apply a pager to the output file + my ($self, $output, $output_to_stdout, @pagers) = @_; + if ($output_to_stdout) { + $self->aside("Sending unpaged output to STDOUT.\n"); + my $fh = $self->open_fh("<", $output); + local $_; + while (<$fh>) { + print or $self->die( "Can't print to stdout: $!" ); + } + close $fh or $self->die( "Can't close while $output: $!" ); + $self->unlink_if_temp_file($output); + } else { + # On VMS, quoting prevents logical expansion, and temp files with no + # extension get the wrong default extension (such as .LIS for TYPE) + + $output = VMS::Filespec::rmsexpand($output, '.') if $self->is_vms; + + $output =~ s{/}{\\}g if $self->is_mswin32 || $self->is_dos; + # Altho "/" under MSWin is in theory good as a pathsep, + # many many corners of the OS don't like it. So we + # have to force it to be "\" to make everyone happy. + + # if we are on an amiga convert unix path to an amiga one + $output =~ s/^\/(.*)\/(.*)/$1:$2/ if $self->is_amigaos; + + foreach my $pager (@pagers) { + $self->aside("About to try calling $pager $output\n"); + if ($self->is_vms) { + last if system("$pager $output") == 0; + } elsif($self->is_amigaos) { + last if system($pager, $output) == 0; + } else { + last if system("$pager \"$output\"") == 0; + } + } + } + return; +} + +#.......................................................................... + +sub searchfor { + my($self, $recurse,$s,@dirs) = @_; + $s =~ s!::!/!g; + $s = VMS::Filespec::unixify($s) if $self->is_vms; + return $s if -f $s && $self->containspod($s); + $self->aside( "Looking for $s in @dirs\n" ); + my $ret; + my $i; + my $dir; + $self->{'target'} = (splitdir $s)[-1]; # XXX: why not use File::Basename? + for ($i=0; $i<@dirs; $i++) { + $dir = $dirs[$i]; + next unless -d $dir; + ($dir = VMS::Filespec::unixpath($dir)) =~ s!/\z!! if $self->is_vms; + if ( (! $self->opt_m && ( $ret = $self->check_file($dir,"$s.pod"))) + or ( $ret = $self->check_file($dir,"$s.pm")) + or ( $ret = $self->check_file($dir,$s)) + or ( $self->is_vms and + $ret = $self->check_file($dir,"$s.com")) + or ( $self->is_os2 and + $ret = $self->check_file($dir,"$s.cmd")) + or ( ($self->is_mswin32 or $self->is_dos or $self->is_os2) and + $ret = $self->check_file($dir,"$s.bat")) + or ( $ret = $self->check_file("$dir/pod","$s.pod")) + or ( $ret = $self->check_file("$dir/pod",$s)) + or ( $ret = $self->check_file("$dir/pods","$s.pod")) + or ( $ret = $self->check_file("$dir/pods",$s)) + ) { + DEBUG > 1 and print " Found $ret\n"; + return $ret; + } + + if ($recurse) { + opendir(D,$dir) or $self->die( "Can't opendir $dir: $!" ); + my @newdirs = map catfile($dir, $_), grep { + not /^\.\.?\z/s and + not /^auto\z/s and # save time! don't search auto dirs + -d catfile($dir, $_) + } readdir D; + closedir(D) or $self->die( "Can't closedir $dir: $!" ); + next unless @newdirs; + # what a wicked map! + @newdirs = map((s/\.dir\z//,$_)[1],@newdirs) if $self->is_vms; + $self->aside( "Also looking in @newdirs\n" ); + push(@dirs,@newdirs); + } + } + return (); +} + +#.......................................................................... +{ + my $already_asserted; + sub assert_closing_stdout { + my $self = shift; + + return if $already_asserted; + + eval q~ END { close(STDOUT) || CORE::die "Can't close STDOUT: $!" } ~; + # What for? to let the pager know that nothing more will come? + + $self->die( $@ ) if $@; + $already_asserted = 1; + return; + } +} + +#.......................................................................... + +sub tweak_found_pathnames { + my($self, $found) = @_; + if ($self->is_mswin32) { + foreach (@$found) { s,/,\\,g } + } + foreach (@$found) { s,',\\',g } # RT 37347 + return; +} + +#.......................................................................... +# : : : : : : : : : +#.......................................................................... + +sub am_taint_checking { + my $self = shift; + $self->die( "NO ENVIRONMENT?!?!" ) unless keys %ENV; # reset iterator along the way + my($k,$v) = each %ENV; + return is_tainted($v); +} + +#.......................................................................... + +sub is_tainted { # just a function + my $arg = shift; + my $nada = substr($arg, 0, 0); # zero-length! + local $@; # preserve the caller's version of $@ + eval { eval "# $nada" }; + return length($@) != 0; +} + +#.......................................................................... + +sub drop_privs_maybe { + my $self = shift; + + DEBUG and print "Attempting to drop privs...\n"; + + # Attempt to drop privs if we should be tainting and aren't + if (!( $self->is_vms || $self->is_mswin32 || $self->is_dos + || $self->is_os2 + ) + && ($> == 0 || $< == 0) + && !$self->am_taint_checking() + ) { + my $id = eval { getpwnam("nobody") }; + $id = eval { getpwnam("nouser") } unless defined $id; + $id = -2 unless defined $id; + # + # According to Stevens' APUE and various + # (BSD, Solaris, HP-UX) man pages, setting + # the real uid first and effective uid second + # is the way to go if one wants to drop privileges, + # because if one changes into an effective uid of + # non-zero, one cannot change the real uid any more. + # + # Actually, it gets even messier. There is + # a third uid, called the saved uid, and as + # long as that is zero, one can get back to + # uid of zero. Setting the real-effective *twice* + # helps in *most* systems (FreeBSD and Solaris) + # but apparently in HP-UX even this doesn't help: + # the saved uid stays zero (apparently the only way + # in HP-UX to change saved uid is to call setuid() + # when the effective uid is zero). + # + eval { + $< = $id; # real uid + $> = $id; # effective uid + $< = $id; # real uid + $> = $id; # effective uid + }; + if( !$@ && $< && $> ) { + DEBUG and print "OK, I dropped privileges.\n"; + } elsif( $self->opt_U ) { + DEBUG and print "Couldn't drop privileges, but in -U mode, so feh." + } else { + DEBUG and print "Hm, couldn't drop privileges. Ah well.\n"; + # We used to die here; but that seemed pointless. + } + } + return; +} + +#.......................................................................... + +1; + +__END__ + +# Pod::Text::Color -- Convert POD data to formatted color ASCII text +# +# This is just a basic proof of concept. It should later be modified to make +# better use of color, take options changing what colors are used for what +# text, and the like. +# +# Copyright 1999, 2001, 2004, 2006, 2008, 2009, 2014 +# Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text::Color; + +use 5.006; +use strict; +use warnings; + +use Pod::Text (); +use Term::ANSIColor qw(colored); + +use vars qw(@ISA $VERSION); + +@ISA = qw(Pod::Text); + +$VERSION = '4.10'; + +############################################################################## +# Overrides +############################################################################## + +# Make level one headings bold. +sub cmd_head1 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $self->SUPER::cmd_head1 ($attrs, colored ($text, 'bold')); +} + +# Make level two headings bold. +sub cmd_head2 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $self->SUPER::cmd_head2 ($attrs, colored ($text, 'bold')); +} + +# Fix the various formatting codes. +sub cmd_b { return colored ($_[2], 'bold') } +sub cmd_f { return colored ($_[2], 'cyan') } +sub cmd_i { return colored ($_[2], 'yellow') } + +# Output any included code in green. +sub output_code { + my ($self, $code) = @_; + $code = colored ($code, 'green'); + $self->output ($code); +} + +# Strip all of the formatting from a provided string, returning the stripped +# version. We will eventually want to use colorstrip() from Term::ANSIColor, +# but it's fairly new so avoid the tight dependency. +sub strip_format { + my ($self, $text) = @_; + $text =~ s/\e\[[\d;]*m//g; + return $text; +} + +# We unfortunately have to override the wrapping code here, since the normal +# wrapping code gets really confused by all the escape sequences. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{opt_width} - $$self{MARGIN}; + + # We have to do $shortchar and $longchar in variables because the + # construct ${char}{0,$width} didn't do the right thing until Perl 5.8.x. + my $char = '(?:(?:\e\[[\d;]+m)*[^\n])'; + my $shortchar = $char . "{0,$width}"; + my $longchar = $char . "{$width}"; + while (length > $width) { + if (s/^($shortchar)\s+// || s/^($longchar)//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + $output; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +# Pod::Text::Overstrike -- Convert POD data to formatted overstrike text +# +# This was written because the output from: +# +# pod2text Text.pm > plain.txt; less plain.txt +# +# is not as rich as the output from +# +# pod2man Text.pm | nroff -man > fancy.txt; less fancy.txt +# +# and because both Pod::Text::Color and Pod::Text::Termcap are not device +# independent. +# +# Created by Joe Smith 30-Nov-2000 +# (based on Pod::Text::Color by Russ Allbery ) +# Copyright 2000 Joe Smith . +# Copyright 2001, 2004, 2008, 2014 Russ Allbery . +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text::Overstrike; + +use 5.006; +use strict; +use warnings; + +use vars qw(@ISA $VERSION); + +use Pod::Text (); + +@ISA = qw(Pod::Text); + +$VERSION = '4.10'; + +############################################################################## +# Overrides +############################################################################## + +# Make level one headings bold, overriding any existing formatting. +sub cmd_head1 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/$1\b$1/g; + return $self->SUPER::cmd_head1 ($attrs, $text); +} + +# Make level two headings bold, overriding any existing formatting. +sub cmd_head2 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/$1\b$1/g; + return $self->SUPER::cmd_head2 ($attrs, $text); +} + +# Make level three headings underscored, overriding any existing formatting. +sub cmd_head3 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/_\b$1/g; + return $self->SUPER::cmd_head3 ($attrs, $text); +} + +# Level four headings look like level three headings. +sub cmd_head4 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $text = $self->strip_format ($text); + $text =~ s/(.)/_\b$1/g; + return $self->SUPER::cmd_head4 ($attrs, $text); +} + +# The common code for handling all headers. We have to override to avoid +# interpolating twice and because we don't want to honor alt. +sub heading { + my ($self, $text, $indent, $marker) = @_; + $self->item ("\n\n") if defined $$self{ITEM}; + $text .= "\n" if $$self{opt_loose}; + my $margin = ' ' x ($$self{opt_margin} + $indent); + $self->output ($margin . $text . "\n"); + return ''; +} + +# Fix the various formatting codes. +sub cmd_b { local $_ = $_[0]->strip_format ($_[2]); s/(.)/$1\b$1/g; $_ } +sub cmd_f { local $_ = $_[0]->strip_format ($_[2]); s/(.)/_\b$1/g; $_ } +sub cmd_i { local $_ = $_[0]->strip_format ($_[2]); s/(.)/_\b$1/g; $_ } + +# Output any included code in bold. +sub output_code { + my ($self, $code) = @_; + $code =~ s/(.)/$1\b$1/g; + $self->output ($code); +} + +# Strip all of the formatting from a provided string, returning the stripped +# version. +sub strip_format { + my ($self, $text) = @_; + $text =~ s/(.)[\b]\1/$1/g; + $text =~ s/_[\b]//g; + return $text; +} + +# We unfortunately have to override the wrapping code here, since the normal +# wrapping code gets really confused by all the backspaces. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{opt_width} - $$self{MARGIN}; + while (length > $width) { + # This regex represents a single character, that's possibly underlined + # or in bold (in which case, it's three characters; the character, a + # backspace, and a character). Use [^\n] rather than . to protect + # against odd settings of $*. + my $char = '(?:[^\n][\b])?[^\n]'; + if (s/^((?>$char){0,$width})(?:\Z|\s+)//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + return $output; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +# Pod::Text::Termcap -- Convert POD data to ASCII text with format escapes. +# +# This is a simple subclass of Pod::Text that overrides a few key methods to +# output the right termcap escape sequences for formatted text on the current +# terminal type. +# +# Copyright 1999, 2001, 2002, 2004, 2006, 2008, 2009, 2014, 2015 +# Russ Allbery +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################## +# Modules and declarations +############################################################################## + +package Pod::Text::Termcap; + +use 5.006; +use strict; +use warnings; + +use Pod::Text (); +use POSIX (); +use Term::Cap; + +use vars qw(@ISA $VERSION); + +@ISA = qw(Pod::Text); + +$VERSION = '4.10'; + +############################################################################## +# Overrides +############################################################################## + +# In the initialization method, grab our terminal characteristics as well as +# do all the stuff we normally do. +sub new { + my ($self, @args) = @_; + my ($ospeed, $term, $termios); + $self = $self->SUPER::new (@args); + + # $ENV{HOME} is usually not set on Windows. The default Term::Cap path + # may not work on Solaris. + unless (exists $ENV{TERMPATH}) { + my $home = exists $ENV{HOME} ? "$ENV{HOME}/.termcap:" : ''; + $ENV{TERMPATH} = + "${home}/etc/termcap:/usr/share/misc/termcap:/usr/share/lib/termcap"; + } + + # Fall back on a hard-coded terminal speed if POSIX::Termios isn't + # available (such as on VMS). + eval { $termios = POSIX::Termios->new }; + if ($@) { + $ospeed = 9600; + } else { + $termios->getattr; + $ospeed = $termios->getospeed || 9600; + } + + # Fall back on the ANSI escape sequences if Term::Cap doesn't work. + eval { $term = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed } }; + $$self{BOLD} = $$term{_md} || "\e[1m"; + $$self{UNDL} = $$term{_us} || "\e[4m"; + $$self{NORM} = $$term{_me} || "\e[m"; + + unless (defined $$self{width}) { + $$self{opt_width} = $ENV{COLUMNS} || $$term{_co} || 80; + $$self{opt_width} -= 2; + } + + return $self; +} + +# Make level one headings bold. +sub cmd_head1 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $self->SUPER::cmd_head1 ($attrs, "$$self{BOLD}$text$$self{NORM}"); +} + +# Make level two headings bold. +sub cmd_head2 { + my ($self, $attrs, $text) = @_; + $text =~ s/\s+$//; + $self->SUPER::cmd_head2 ($attrs, "$$self{BOLD}$text$$self{NORM}"); +} + +# Fix up B<> and I<>. Note that we intentionally don't do F<>. +sub cmd_b { my $self = shift; return "$$self{BOLD}$_[1]$$self{NORM}" } +sub cmd_i { my $self = shift; return "$$self{UNDL}$_[1]$$self{NORM}" } + +# Output any included code in bold. +sub output_code { + my ($self, $code) = @_; + $self->output ($$self{BOLD} . $code . $$self{NORM}); +} + +# Strip all of the formatting from a provided string, returning the stripped +# version. +sub strip_format { + my ($self, $text) = @_; + $text =~ s/\Q$$self{BOLD}//g; + $text =~ s/\Q$$self{UNDL}//g; + $text =~ s/\Q$$self{NORM}//g; + return $text; +} + +# Override the wrapping code to ignore the special sequences. +sub wrap { + my $self = shift; + local $_ = shift; + my $output = ''; + my $spaces = ' ' x $$self{MARGIN}; + my $width = $$self{opt_width} - $$self{MARGIN}; + + # $codes matches a single special sequence. $char matches any number of + # special sequences preceding a single character other than a newline. + # We have to do $shortchar and $longchar in variables because the + # construct ${char}{0,$width} didn't do the right thing until Perl 5.8.x. + my $codes = "(?:\Q$$self{BOLD}\E|\Q$$self{UNDL}\E|\Q$$self{NORM}\E)"; + my $char = "(?:$codes*[^\\n])"; + my $shortchar = $char . "{0,$width}"; + my $longchar = $char . "{$width}"; + while (length > $width) { + if (s/^($shortchar)\s+// || s/^($longchar)//) { + $output .= $spaces . $1 . "\n"; + } else { + last; + } + } + $output .= $spaces . $_; + $output =~ s/\s+$/\n\n/; + return $output; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +1; +__END__ + +require 5.005; +package Pod::Simple::Search; +use strict; + +use vars qw($VERSION $MAX_VERSION_WITHIN $SLEEPY); +$VERSION = '3.35'; ## Current version of this package + +BEGIN { *DEBUG = sub () {0} unless defined &DEBUG; } # set DEBUG level +use Carp (); + +$SLEEPY = 1 if !defined $SLEEPY and $^O =~ /mswin|mac/i; + # flag to occasionally sleep for $SLEEPY - 1 seconds. + +$MAX_VERSION_WITHIN ||= 60; +my $IS_CASE_INSENSITIVE = -e uc __FILE__ && -e lc __FILE__; + +############################################################################# + +#use diagnostics; +use File::Spec (); +use File::Basename qw( basename dirname ); +use Config (); +use Cwd qw( cwd ); + +#========================================================================== +__PACKAGE__->_accessorize( # Make my dumb accessor methods + 'callback', 'progress', 'dir_prefix', 'inc', 'laborious', 'limit_glob', + 'limit_re', 'shadows', 'verbose', 'name2path', 'path2name', 'recurse', + 'ciseen' +); +#========================================================================== + +sub new { + my $class = shift; + my $self = bless {}, ref($class) || $class; + $self->init; + return $self; +} + +sub init { + my $self = shift; + $self->inc(1); + $self->recurse(1); + $self->verbose(DEBUG); + return $self; +} + +#-------------------------------------------------------------------------- + +sub survey { + my($self, @search_dirs) = @_; + $self = $self->new unless ref $self; # tolerate being a class method + + $self->_expand_inc( \@search_dirs ); + + $self->{'_scan_count'} = 0; + $self->{'_dirs_visited'} = {}; + $self->path2name( {} ); + $self->name2path( {} ); + $self->ciseen( {} ); + $self->limit_re( $self->_limit_glob_to_limit_re ) if $self->{'limit_glob'}; + my $cwd = cwd(); + my $verbose = $self->verbose; + local $_; # don't clobber the caller's $_ ! + + foreach my $try (@search_dirs) { + unless( File::Spec->file_name_is_absolute($try) ) { + # make path absolute + $try = File::Spec->catfile( $cwd ,$try); + } + # simplify path + $try = File::Spec->canonpath($try); + + my $start_in; + my $modname_prefix; + if($self->{'dir_prefix'}) { + $start_in = File::Spec->catdir( + $try, + grep length($_), split '[\\/:]+', $self->{'dir_prefix'} + ); + $modname_prefix = [grep length($_), split m{[:/\\]}, $self->{'dir_prefix'}]; + $verbose and print "Appending \"$self->{'dir_prefix'}\" to $try, ", + "giving $start_in (= @$modname_prefix)\n"; + } else { + $start_in = $try; + } + + if( $self->{'_dirs_visited'}{$start_in} ) { + $verbose and print "Directory '$start_in' already seen, skipping.\n"; + next; + } else { + $self->{'_dirs_visited'}{$start_in} = 1; + } + + unless(-e $start_in) { + $verbose and print "Skipping non-existent $start_in\n"; + next; + } + + my $closure = $self->_make_search_callback; + + if(-d $start_in) { + # Normal case: + $verbose and print "Beginning excursion under $start_in\n"; + $self->_recurse_dir( $start_in, $closure, $modname_prefix ); + $verbose and print "Back from excursion under $start_in\n\n"; + + } elsif(-f _) { + # A excursion consisting of just one file! + $_ = basename($start_in); + $verbose and print "Pondering $start_in ($_)\n"; + $closure->($start_in, $_, 0, []); + + } else { + $verbose and print "Skipping mysterious $start_in\n"; + } + } + $self->progress and $self->progress->done( + "Noted $$self{'_scan_count'} Pod files total"); + $self->ciseen( {} ); + + return unless defined wantarray; # void + return $self->name2path unless wantarray; # scalar + return $self->name2path, $self->path2name; # list +} + +#========================================================================== +sub _make_search_callback { + my $self = $_[0]; + + # Put the options in variables, for easy access + my( $laborious, $verbose, $shadows, $limit_re, $callback, $progress, + $path2name, $name2path, $recurse, $ciseen) = + map scalar($self->$_()), + qw(laborious verbose shadows limit_re callback progress + path2name name2path recurse ciseen); + my ($seen, $remember, $files_for); + if ($IS_CASE_INSENSITIVE) { + $seen = sub { $ciseen->{ lc $_[0] } }; + $remember = sub { $name2path->{ $_[0] } = $ciseen->{ lc $_[0] } = $_[1]; }; + $files_for = sub { my $n = lc $_[0]; grep { lc $path2name->{$_} eq $n } %{ $path2name } }; + } else { + $seen = sub { $name2path->{ $_[0] } }; + $remember = sub { $name2path->{ $_[0] } = $_[1] }; + $files_for = sub { my $n = $_[0]; grep { $path2name->{$_} eq $n } %{ $path2name } }; + } + + my($file, $shortname, $isdir, $modname_bits); + return sub { + ($file, $shortname, $isdir, $modname_bits) = @_; + + if($isdir) { # this never gets called on the startdir itself, just subdirs + + unless( $recurse ) { + $verbose and print "Not recursing into '$file' as per requested.\n"; + return 'PRUNE'; + } + + if( $self->{'_dirs_visited'}{$file} ) { + $verbose and print "Directory '$file' already seen, skipping.\n"; + return 'PRUNE'; + } + + print "Looking in dir $file\n" if $verbose; + + unless ($laborious) { # $laborious overrides pruning + if( m/^(\d+\.[\d_]{3,})\z/s + and do { my $x = $1; $x =~ tr/_//d; $x != $] } + ) { + $verbose and print "Perl $] version mismatch on $_, skipping.\n"; + return 'PRUNE'; + } + + if( m/^([A-Za-z][a-zA-Z0-9_]*)\z/s ) { + $verbose and print "$_ is a well-named module subdir. Looking....\n"; + } else { + $verbose and print "$_ is a fishy directory name. Skipping.\n"; + return 'PRUNE'; + } + } # end unless $laborious + + $self->{'_dirs_visited'}{$file} = 1; + return; # (not pruning); + } + + # Make sure it's a file even worth even considering + if($laborious) { + unless( + m/\.(pod|pm|plx?)\z/i || -x _ and -T _ + # Note that the cheapest operation (the RE) is run first. + ) { + $verbose > 1 and print " Brushing off uninteresting $file\n"; + return; + } + } else { + unless( m/^[-_a-zA-Z0-9]+\.(?:pod|pm|plx?)\z/is ) { + $verbose > 1 and print " Brushing off oddly-named $file\n"; + return; + } + } + + $verbose and print "Considering item $file\n"; + my $name = $self->_path2modname( $file, $shortname, $modname_bits ); + $verbose > 0.01 and print " Nominating $file as $name\n"; + + if($limit_re and $name !~ m/$limit_re/i) { + $verbose and print "Shunning $name as not matching $limit_re\n"; + return; + } + + if( !$shadows and $seen->($name) ) { + $verbose and print "Not worth considering $file ", + "-- already saw $name as ", + join(' ', $files_for->($name)), "\n"; + return; + } + + # Put off until as late as possible the expense of + # actually reading the file: + $progress and $progress->reach($self->{'_scan_count'}, "Scanning $file"); + return unless $self->contains_pod( $file ); + ++ $self->{'_scan_count'}; + + # Or finally take note of it: + if ( my $prev = $seen->($name) ) { + $verbose and print + "Duplicate POD found (shadowing?): $name ($file)\n", + " Already seen in ", join(' ', $files_for->($name)), "\n"; + } else { + $remember->($name, $file); # Noting just the first occurrence + } + $verbose and print " Noting $name = $file\n"; + if( $callback ) { + local $_ = $_; # insulate from changes, just in case + $callback->($file, $name); + } + $path2name->{$file} = $name; + return; + } +} + +#========================================================================== + +sub _path2modname { + my($self, $file, $shortname, $modname_bits) = @_; + + # this code simplifies the POD name for Perl modules: + # * remove "site_perl" + # * remove e.g. "i586-linux" (from 'archname') + # * remove e.g. 5.00503 + # * remove pod/ if followed by perl*.pod (e.g. in pod/perlfunc.pod) + # * dig into the file for case-preserved name if not already mixed case + + my @m = @$modname_bits; + my $x; + my $verbose = $self->verbose; + + # Shaving off leading naughty-bits + while(@m + and defined($x = lc( $m[0] )) + and( $x eq 'site_perl' + or($x eq 'pod' and @m == 1 and $shortname =~ m{^perl.*\.pod$}s ) + or $x =~ m{\\d+\\.z\\d+([_.]?\\d+)?} # if looks like a vernum + or $x eq lc( $Config::Config{'archname'} ) + )) { shift @m } + + my $name = join '::', @m, $shortname; + $self->_simplify_base($name); + + # On VMS, case-preserved document names can't be constructed from + # filenames, so try to extract them from the "=head1 NAME" tag in the + # file instead. + if ($^O eq 'VMS' && ($name eq lc($name) || $name eq uc($name))) { + open PODFILE, "<$file" or die "_path2modname: Can't open $file: $!"; + my $in_pod = 0; + my $in_name = 0; + my $line; + while ($line = ) { + chomp $line; + $in_pod = 1 if ($line =~ m/^=\w/); + $in_pod = 0 if ($line =~ m/^=cut/); + next unless $in_pod; # skip non-pod text + next if ($line =~ m/^\s*\z/); # and blank lines + next if ($in_pod && ($line =~ m/^X{'fs_recursion_maxdepth'} || 10; + my $verbose = $self->verbose; + + my $here_string = File::Spec->curdir; + my $up_string = File::Spec->updir; + $modname_bits ||= []; + + my $recursor; + $recursor = sub { + my($dir_long, $dir_bare) = @_; + if( @$modname_bits >= 10 ) { + $verbose and print "Too deep! [@$modname_bits]\n"; + return; + } + + unless(-d $dir_long) { + $verbose > 2 and print "But it's not a dir! $dir_long\n"; + return; + } + unless( opendir(INDIR, $dir_long) ) { + $verbose > 2 and print "Can't opendir $dir_long : $!\n"; + closedir(INDIR); + return + } + + # Load all items; put no extension before .pod before .pm before .plx?. + my @items = map { $_->[0] } + sort { $a->[1] cmp $b->[1] || $b->[2] cmp $a->[2] } + map { + (my $t = $_) =~ s/[.]p(m|lx?|od)\z//; + [$_, $t, lc($1 || 'z') ] + } readdir(INDIR); + closedir(INDIR); + + push @$modname_bits, $dir_bare unless $dir_bare eq ''; + + my $i_full; + foreach my $i (@items) { + next if $i eq $here_string or $i eq $up_string or $i eq ''; + $i_full = File::Spec->catfile( $dir_long, $i ); + + if(!-r $i_full) { + $verbose and print "Skipping unreadable $i_full\n"; + + } elsif(-f $i_full) { + $_ = $i; + $callback->( $i_full, $i, 0, $modname_bits ); + + } elsif(-d _) { + $i =~ s/\.DIR\z//i if $^O eq 'VMS'; + $_ = $i; + my $rv = $callback->( $i_full, $i, 1, $modname_bits ) || ''; + + if($rv eq 'PRUNE') { + $verbose > 1 and print "OK, pruning"; + } else { + # Otherwise, recurse into it + $recursor->( File::Spec->catdir($dir_long, $i) , $i); + } + } else { + $verbose > 1 and print "Skipping oddity $i_full\n"; + } + } + pop @$modname_bits; + return; + };; + + local $_; + $recursor->($startdir, ''); + + undef $recursor; # allow it to be GC'd + + return; +} + + +#========================================================================== + +sub run { + # A function, useful in one-liners + + my $self = __PACKAGE__->new; + $self->limit_glob($ARGV[0]) if @ARGV; + $self->callback( sub { + my($file, $name) = @_; + my $version = ''; + + # Yes, I know we won't catch the version in like a File/Thing.pm + # if we see File/Thing.pod first. That's just the way the + # cookie crumbles. -- SMB + + if($file =~ m/\.pod$/i) { + # Don't bother looking for $VERSION in .pod files + DEBUG and print "Not looking for \$VERSION in .pod $file\n"; + } elsif( !open(INPOD, $file) ) { + DEBUG and print "Couldn't open $file: $!\n"; + close(INPOD); + } else { + # Sane case: file is readable + my $lines = 0; + while() { + last if $lines++ > $MAX_VERSION_WITHIN; # some degree of sanity + if( s/^\s*\$VERSION\s*=\s*//s and m/\d/ ) { + DEBUG and print "Found version line (#$lines): $_"; + s/\s*\#.*//s; + s/\;\s*$//s; + s/\s+$//s; + s/\t+/ /s; # nix tabs + # Optimize the most common cases: + $_ = "v$1" + if m{^v?["']?([0-9_]+(\.[0-9_]+)*)["']?$}s + # like in $VERSION = "3.14159"; + or m{\$Revision:\s*([0-9_]+(?:\.[0-9_]+)*)\s*\$}s + # like in sprintf("%d.%02d", q$Revision: 4.13 $ =~ /(\d+)\.(\d+)/); + ; + + # Like in sprintf("%d.%s", map {s/_//g; $_} q$Name: release-0_55-public $ =~ /-(\d+)_([\d_]+)/) + $_ = sprintf("v%d.%s", + map {s/_//g; $_} + $1 =~ m/-(\d+)_([\d_]+)/) # snare just the numeric part + if m{\$Name:\s*([^\$]+)\$}s + ; + $version = $_; + DEBUG and print "Noting $version as version\n"; + last; + } + } + close(INPOD); + } + print "$name\t$version\t$file\n"; + return; + # End of callback! + }); + + $self->survey; +} + +#========================================================================== + +sub simplify_name { + my($self, $str) = @_; + + # Remove all path components + # XXX Why not just use basename()? -- SMB + + if ($^O eq 'MacOS') { $str =~ s{^.*:+}{}s } + else { $str =~ s{^.*/+}{}s } + + $self->_simplify_base($str); + return $str; +} + +#========================================================================== + +sub _simplify_base { # Internal method only + + # strip Perl's own extensions + $_[1] =~ s/\.(pod|pm|plx?)\z//i; + + # strip meaningless extensions on Win32 and OS/2 + $_[1] =~ s/\.(bat|exe|cmd)\z//i if $^O =~ /mswin|os2/i; + + # strip meaningless extensions on VMS + $_[1] =~ s/\.(com)\z//i if $^O eq 'VMS'; + + return; +} + +#========================================================================== + +sub _expand_inc { + my($self, $search_dirs) = @_; + + return unless $self->{'inc'}; + my %seen = map { File::Spec->rel2abs($_) => 1 } @{ $search_dirs }; + + if ($^O eq 'MacOS') { + push @$search_dirs, + grep { !$seen{ File::Spec->rel2abs($_) }++ } $self->_mac_whammy(@INC); + # Any other OSs need custom handling here? + } else { + push @$search_dirs, + grep { !$seen{ File::Spec->rel2abs($_) }++ } @INC; + } + + $self->{'laborious'} = 0; # Since inc said to use INC + return; +} + +#========================================================================== + +sub _mac_whammy { # Tolerate '.', './some_dir' and '(../)+some_dir' on Mac OS + my @them; + (undef,@them) = @_; + for $_ (@them) { + if ( $_ eq '.' ) { + $_ = ':'; + } elsif ( $_ =~ s|^((?:\.\./)+)|':' x (length($1)/3)|e ) { + $_ = ':'. $_; + } else { + $_ =~ s|^\./|:|; + } + } + return @them; +} + +#========================================================================== + +sub _limit_glob_to_limit_re { + my $self = $_[0]; + my $limit_glob = $self->{'limit_glob'} || return; + + my $limit_re = '^' . quotemeta($limit_glob) . '$'; + $limit_re =~ s/\\\?/./g; # glob "?" => "." + $limit_re =~ s/\\\*/.*?/g; # glob "*" => ".*?" + $limit_re =~ s/\.\*\?\$$//s; # final glob "*" => ".*?$" => "" + + $self->{'verbose'} and print "Turning limit_glob $limit_glob into re $limit_re\n"; + + # A common optimization: + if(!exists($self->{'dir_prefix'}) + and $limit_glob =~ m/^(?:\w+\:\:)+/s # like "File::*" or "File::Thing*" + # Optimize for sane and common cases (but not things like "*::File") + ) { + $self->{'dir_prefix'} = join "::", $limit_glob =~ m/^(?:\w+::)+/sg; + $self->{'verbose'} and print " and setting dir_prefix to $self->{'dir_prefix'}\n"; + } + + return $limit_re; +} + +#========================================================================== + +# contribution mostly from Tim Jenness + +sub _actual_filenames { + my $dir = shift; + my $fn = lc shift; + opendir my $dh, $dir or return; + return map { File::Spec->catdir($dir, $_) } + grep { lc $_ eq $fn } readdir $dh; +} + +sub find { + my($self, $pod, @search_dirs) = @_; + $self = $self->new unless ref $self; # tolerate being a class method + + # Check usage + Carp::carp 'Usage: \$self->find($podname, ...)' + unless defined $pod and length $pod; + + my $verbose = $self->verbose; + + # Split on :: and then join the name together using File::Spec + my @parts = split /::/, $pod; + $verbose and print "Chomping {$pod} => {@parts}\n"; + + #@search_dirs = File::Spec->curdir unless @search_dirs; + + $self->_expand_inc(\@search_dirs); + # Add location of binaries such as pod2text: + push @search_dirs, $Config::Config{'scriptdir'} if $self->inc; + + my %seen_dir; + while (my $dir = shift @search_dirs ) { + next unless defined $dir and length $dir; + next if $seen_dir{$dir}; + $seen_dir{$dir} = 1; + unless(-d $dir) { + print "Directory $dir does not exist\n" if $verbose; + } + + print "Looking in directory $dir\n" if $verbose; + my $fullname = File::Spec->catfile( $dir, @parts ); + print "Filename is now $fullname\n" if $verbose; + + foreach my $ext ('', '.pod', '.pm', '.pl') { # possible extensions + my $fullext = $fullname . $ext; + if ( -f $fullext and $self->contains_pod($fullext) ) { + print "FOUND: $fullext\n" if $verbose; + if (@parts > 1 && lc $parts[0] eq 'pod' && $IS_CASE_INSENSITIVE && $ext eq '.pod') { + # Well, this file could be for a program (perldoc) but we actually + # want a module (Pod::Perldoc). So see if there is a .pm with the + # proper casing. + my $subdir = dirname $fullext; + unless (grep { $fullext eq $_ } _actual_filenames $subdir, "$parts[-1].pod") { + print "# Looking for alternate spelling in $subdir\n" if $verbose; + # Try the .pm file. + my $pm = $fullname . '.pm'; + if ( -f $pm and $self->contains_pod($pm) ) { + # Prefer the .pm if its case matches. + if (grep { $pm eq $_ } _actual_filenames $subdir, "$parts[-1].pm") { + print "FOUND: $fullext\n" if $verbose; + return $pm; + } + } + } + } + return $fullext; + } + } + + # Case-insensitively Look for ./pod directories and slip them in. + for my $subdir ( _actual_filenames($dir, 'pod') ) { + if (-d $subdir) { + $verbose and print "Noticing $subdir and looking there...\n"; + unshift @search_dirs, $subdir; + } + } + } + + return undef; +} + +#========================================================================== + +sub contains_pod { + my($self, $file) = @_; + my $verbose = $self->{'verbose'}; + + # check for one line of POD + $verbose > 1 and print " Scanning $file for pod...\n"; + unless( open(MAYBEPOD,"<$file") ) { + print "Error: $file is unreadable: $!\n"; + return undef; + } + + sleep($SLEEPY - 1) if $SLEEPY; + # avoid totally hogging the processor on OSs with poor process control + + local $_; + while( ) { + if(m/^=(head\d|pod|over|item)\b/s) { + close(MAYBEPOD) || die "Bizarre error closing $file: $!\nAborting"; + chomp; + $verbose > 1 and print " Found some pod ($_) in $file\n"; + return 1; + } + } + close(MAYBEPOD) || die "Bizarre error closing $file: $!\nAborting"; + $verbose > 1 and print " No POD in $file, skipping.\n"; + return 0; +} + +#========================================================================== + +sub _accessorize { # A simple-minded method-maker + shift; + no strict 'refs'; + foreach my $attrname (@_) { + *{caller() . '::' . $attrname} = sub { + use strict; + $Carp::CarpLevel = 1, Carp::croak( + "Accessor usage: \$obj->$attrname() or \$obj->$attrname(\$new_value)" + ) unless (@_ == 1 or @_ == 2) and ref $_[0]; + + # Read access: + return $_[0]->{$attrname} if @_ == 1; + + # Write access: + $_[0]->{$attrname} = $_[1]; + return $_[0]; # RETURNS MYSELF! + }; + } + # Ya know, they say accessories make the ensemble! + return; +} + +#========================================================================== +sub _state_as_string { + my $self = $_[0]; + return '' unless ref $self; + my @out = "{\n # State of $self ...\n"; + foreach my $k (sort keys %$self) { + push @out, " ", _esc($k), " => ", _esc($self->{$k}), ",\n"; + } + push @out, "}\n"; + my $x = join '', @out; + $x =~ s/^/#/mg; + return $x; +} + +sub _esc { + my $in = $_[0]; + return 'undef' unless defined $in; + $in =~ + s<([^\x20\x21\x23\x27-\x3F\x41-\x5B\x5D-\x7E])> + <'\\x'.(unpack("H2",$1))>eg; + return qq{"$in"}; +} + +#========================================================================== + +run() unless caller; # run if "perl whatever/Search.pm" + +1; + +#========================================================================== + +__END__ + + + +require 5; +package Pod::Simple::DumpAsXML; +$VERSION = '3.35'; +use Pod::Simple (); +BEGIN {@ISA = ('Pod::Simple')} + +use strict; + +use Carp (); +use Text::Wrap qw(wrap); + +BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG } + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->accept_codes('VerbatimFormatted'); + $new->keep_encoding_directive(1); + return $new; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _handle_element_start { + # ($self, $element_name, $attr_hash_r) + my $fh = $_[0]{'output_fh'}; + my($key, $value); + DEBUG and print STDERR "++ $_[1]\n"; + + print $fh ' ' x ($_[0]{'indent'} || 0), "<", $_[1]; + + foreach my $key (sort keys %{$_[2]}) { + unless($key =~ m/^~/s) { + next if $key eq 'start_line' and $_[0]{'hide_line_numbers'}; + _xml_escape($value = $_[2]{$key}); + print $fh ' ', $key, '="', $value, '"'; + } + } + + + print $fh ">\n"; + $_[0]{'indent'}++; + return; +} + +sub _handle_text { + DEBUG and print STDERR "== \"$_[1]\"\n"; + if(length $_[1]) { + my $indent = ' ' x $_[0]{'indent'}; + my $text = $_[1]; + _xml_escape($text); + local $Text::Wrap::huge = 'overflow'; + $text = wrap('', $indent, $text); + print {$_[0]{'output_fh'}} $indent, $text, "\n"; + } + return; +} + +sub _handle_element_end { + DEBUG and print STDERR "-- $_[1]\n"; + print {$_[0]{'output_fh'}} + ' ' x --$_[0]{'indent'}, "\n"; + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub _xml_escape { + foreach my $x (@_) { + # Escape things very cautiously: + if ($] ge 5.007_003) { + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(utf8::native_to_unicode(ord($1))).';'/eg; + } else { # Is broken for non-ASCII platforms on early perls + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg; + } + # Yes, stipulate the list without a range, so that this can work right on + # all charsets that this module happens to run under. + } + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + +__END__ + + +require 5; +package Pod::Simple::Text; +use strict; +use Carp (); +use Pod::Simple::Methody (); +use Pod::Simple (); +use vars qw( @ISA $VERSION $FREAKYMODE); +$VERSION = '3.35'; +@ISA = ('Pod::Simple::Methody'); +BEGIN { *DEBUG = defined(&Pod::Simple::DEBUG) + ? \&Pod::Simple::DEBUG + : sub() {0} + } + +use Text::Wrap 98.112902 (); +$Text::Wrap::huge = 'overflow'; + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->accept_target_as_text(qw( text plaintext plain )); + $new->nix_X_codes(1); + $new->nbsp_for_S(1); + $new->{'Thispara'} = ''; + $new->{'Indent'} = 0; + $new->{'Indentstring'} = ' '; + return $new; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub handle_text { $_[0]{'Thispara'} .= $_[1] } + +sub start_Para { $_[0]{'Thispara'} = '' } +sub start_head1 { $_[0]{'Thispara'} = '' } +sub start_head2 { $_[0]{'Thispara'} = '' } +sub start_head3 { $_[0]{'Thispara'} = '' } +sub start_head4 { $_[0]{'Thispara'} = '' } + +sub start_Verbatim { $_[0]{'Thispara'} = '' } +sub start_item_bullet { $_[0]{'Thispara'} = $FREAKYMODE ? '' : '* ' } +sub start_item_number { $_[0]{'Thispara'} = $FREAKYMODE ? '' : "$_[1]{'number'}. " } +sub start_item_text { $_[0]{'Thispara'} = '' } + +sub start_over_bullet { ++$_[0]{'Indent'} } +sub start_over_number { ++$_[0]{'Indent'} } +sub start_over_text { ++$_[0]{'Indent'} } +sub start_over_block { ++$_[0]{'Indent'} } + +sub end_over_bullet { --$_[0]{'Indent'} } +sub end_over_number { --$_[0]{'Indent'} } +sub end_over_text { --$_[0]{'Indent'} } +sub end_over_block { --$_[0]{'Indent'} } + + +# . . . . . Now the actual formatters: + +sub end_head1 { $_[0]->emit_par(-4) } +sub end_head2 { $_[0]->emit_par(-3) } +sub end_head3 { $_[0]->emit_par(-2) } +sub end_head4 { $_[0]->emit_par(-1) } +sub end_Para { $_[0]->emit_par( 0) } +sub end_item_bullet { $_[0]->emit_par( 0) } +sub end_item_number { $_[0]->emit_par( 0) } +sub end_item_text { $_[0]->emit_par(-2) } +sub start_L { $_[0]{'Link'} = $_[1] if $_[1]->{type} eq 'url' } +sub end_L { + if (my $link = delete $_[0]{'Link'}) { + # Append the URL to the output unless it's already present. + $_[0]{'Thispara'} .= " <$link->{to}>" + unless $_[0]{'Thispara'} =~ /\b\Q$link->{to}/; + } +} + +sub emit_par { + my($self, $tweak_indent) = splice(@_,0,2); + my $indent = ' ' x ( 2 * $self->{'Indent'} + 4 + ($tweak_indent||0) ); + # Yes, 'STRING' x NEGATIVE gives '', same as 'STRING' x 0 + + $self->{'Thispara'} =~ s/$Pod::Simple::shy//g; + my $out = Text::Wrap::wrap($indent, $indent, $self->{'Thispara'} .= "\n"); + $out =~ s/$Pod::Simple::nbsp/ /g; + print {$self->{'output_fh'}} $out, "\n"; + $self->{'Thispara'} = ''; + + return; +} + +# . . . . . . . . . . And then off by its lonesome: + +sub end_Verbatim { + my $self = shift; + $self->{'Thispara'} =~ s/$Pod::Simple::nbsp/ /g; + $self->{'Thispara'} =~ s/$Pod::Simple::shy//g; + + my $i = ' ' x ( 2 * $self->{'Indent'} + 4); + #my $i = ' ' x (4 + $self->{'Indent'}); + + $self->{'Thispara'} =~ s/^/$i/mg; + + print { $self->{'output_fh'} } '', + $self->{'Thispara'}, + "\n\n" + ; + $self->{'Thispara'} = ''; + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + + +__END__ + + +use strict; +package Pod::Simple::TiedOutFH; +use Symbol ('gensym'); +use Carp (); +use vars qw($VERSION ); +$VERSION = '3.35'; + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub handle_on { # some horrible frightening things are encapsulated in here + my $class = shift; + $class = ref($class) || $class; + + Carp::croak "Usage: ${class}->handle_on(\$somescalar)" unless @_; + + my $x = (defined($_[0]) and ref($_[0])) + ? $_[0] + : ( \( $_[0] ) )[0] + ; + $$x = '' unless defined $$x; + + #Pod::Simple::DEBUG and print STDERR "New $class handle on $x = \"$$x\"\n"; + + my $new = gensym(); + tie *$new, $class, $x; + return $new; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub TIEHANDLE { # Ties to just a scalar ref + my($class, $scalar_ref) = @_; + $$scalar_ref = '' unless defined $$scalar_ref; + return bless \$scalar_ref, ref($class) || $class; +} + +sub PRINT { + my $it = shift; + foreach my $x (@_) { $$$it .= $x } + + #Pod::Simple::DEBUG > 10 and print STDERR " appended to $$it = \"$$$it\"\n"; + + return 1; +} + +sub FETCH { + return ${$_[0]}; +} + +sub PRINTF { + my $it = shift; + my $format = shift; + $$$it .= sprintf $format, @_; + return 1; +} + +sub FILENO { ${ $_[0] } + 100 } # just to produce SOME number + +sub CLOSE { 1 } + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1; +__END__ + +Chole + + * 1 large red onion + * 2 tomatillos + * 4 or 5 roma tomatoes (optionally with the pulp discarded) + * 1 tablespoons chopped ginger root (or more, to taste) + * 2 tablespoons canola oil (or vegetable oil) + + * 1 tablespoon garam masala + * 1/2 teaspoon red chili powder, or to taste + * Salt, to taste (probably quite a bit) + * 2 (15-ounce) cans chick peas or garbanzo beans, drained and rinsed + * juice of one smallish lime + * a dash of balsamic vinegar (to taste) + * cooked rice, preferably long-grain white rice (whether plain, + basmati rice, jasmine rice, or even a mild pilaf) + +In a blender or food processor, puree the onions, tomatoes, tomatillos, +and ginger root. You can even do it with a Braun hand "mixer", if you +chop things finer to start with, and work at it. + +In a saucepan set over moderate heat, warm the oil until hot. + +Add the puree and the balsamic vinegar, and cook, stirring occasionally, +for 20 to 40 minutes. (Cooking it longer will make it sweeter.) + +Add the Garam Masala, chili powder, and cook, stirring occasionally, for +5 minutes. + +Add the salt and chick peas and cook, stirring, until heated through. + +Stir in the lime juice, and optionally one or two teaspoons of tahini. +You can let it simmer longer, depending on how much softer you want the +garbanzos to get. + +Serve over rice, like a curry. + +Yields 5 to 7 servings. + + + +require 5; +package Pod::Simple::RTF; + +#sub DEBUG () {4}; +#sub Pod::Simple::DEBUG () {4}; +#sub Pod::Simple::PullParser::DEBUG () {4}; + +use strict; +use vars qw($VERSION @ISA %Escape $WRAP %Tagmap); +$VERSION = '3.35'; +use Pod::Simple::PullParser (); +BEGIN {@ISA = ('Pod::Simple::PullParser')} + +use Carp (); +BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG } + +$WRAP = 1 unless defined $WRAP; + +# These are broken for early Perls on EBCDIC; they could be fixed to work +# better there, but not worth it. These are part of a larger [...] class, so +# are just the strings to substitute into it, as opposed to compiled patterns. +my $cntrl = '[:cntrl:]'; +$cntrl = '\x00-\x1F\x7F' unless eval "qr/[$cntrl]/"; + +my $not_ascii = '[:^ascii:]'; +$not_ascii = '\x80-\xFF' unless eval "qr/[$not_ascii]/"; + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub _openclose { + return map {; + m/^([-A-Za-z]+)=(\w[^\=]*)$/s or die "what's <$_>?"; + ( $1, "{\\$2\n", "/$1", "}" ); + } @_; +} + +my @_to_accept; + +%Tagmap = ( + # 'foo=bar' means ('foo' => '{\bar'."\n", '/foo' => '}') + _openclose( + 'B=cs18\b', + 'I=cs16\i', + 'C=cs19\f1\lang1024\noproof', + 'F=cs17\i\lang1024\noproof', + + 'VerbatimI=cs26\i', + 'VerbatimB=cs27\b', + 'VerbatimBI=cs28\b\i', + + map {; m/^([-a-z]+)/s && push @_to_accept, $1; $_ } + qw[ + underline=ul smallcaps=scaps shadow=shad + superscript=super subscript=sub strikethrough=strike + outline=outl emboss=embo engrave=impr + dotted-underline=uld dash-underline=uldash + dot-dash-underline=uldashd dot-dot-dash-underline=uldashdd + double-underline=uldb thick-underline=ulth + word-underline=ulw wave-underline=ulwave + ] + # But no double-strikethrough, because MSWord can't agree with the + # RTF spec on whether it's supposed to be \strikedl or \striked1 (!!!) + ), + + # Bit of a hack here: + 'L=pod' => '{\cs22\i'."\n", + 'L=url' => '{\cs23\i'."\n", + 'L=man' => '{\cs24\i'."\n", + '/L' => '}', + + 'Data' => "\n", + '/Data' => "\n", + + 'Verbatim' => "\n{\\pard\\li#rtfindent##rtfkeep#\\plain\\s20\\sa180\\f1\\fs18\\lang1024\\noproof\n", + '/Verbatim' => "\n\\par}\n", + 'VerbatimFormatted' => "\n{\\pard\\li#rtfindent##rtfkeep#\\plain\\s20\\sa180\\f1\\fs18\\lang1024\\noproof\n", + '/VerbatimFormatted' => "\n\\par}\n", + 'Para' => "\n{\\pard\\li#rtfindent#\\sa180\n", + '/Para' => "\n\\par}\n", + 'head1' => "\n{\\pard\\li#rtfindent#\\s31\\keepn\\sb90\\sa180\\f2\\fs#head1_halfpoint_size#\\ul{\n", + '/head1' => "\n}\\par}\n", + 'head2' => "\n{\\pard\\li#rtfindent#\\s32\\keepn\\sb90\\sa180\\f2\\fs#head2_halfpoint_size#\\ul{\n", + '/head2' => "\n}\\par}\n", + 'head3' => "\n{\\pard\\li#rtfindent#\\s33\\keepn\\sb90\\sa180\\f2\\fs#head3_halfpoint_size#\\ul{\n", + '/head3' => "\n}\\par}\n", + 'head4' => "\n{\\pard\\li#rtfindent#\\s34\\keepn\\sb90\\sa180\\f2\\fs#head4_halfpoint_size#\\ul{\n", + '/head4' => "\n}\\par}\n", + # wordpad borks on \tc\tcl1, or I'd put that in =head1 and =head2 + + 'item-bullet' => "\n{\\pard\\li#rtfindent##rtfitemkeepn#\\sb60\\sa150\\fi-120\n", + '/item-bullet' => "\n\\par}\n", + 'item-number' => "\n{\\pard\\li#rtfindent##rtfitemkeepn#\\sb60\\sa150\\fi-120\n", + '/item-number' => "\n\\par}\n", + 'item-text' => "\n{\\pard\\li#rtfindent##rtfitemkeepn#\\sb60\\sa150\\fi-120\n", + '/item-text' => "\n\\par}\n", + + # we don't need any styles for over-* and /over-* +); + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sub new { + my $new = shift->SUPER::new(@_); + $new->nix_X_codes(1); + $new->nbsp_for_S(1); + $new->accept_targets( 'rtf', 'RTF' ); + + $new->{'Tagmap'} = {%Tagmap}; + + $new->accept_codes(@_to_accept); + $new->accept_codes('VerbatimFormatted'); + DEBUG > 2 and print STDERR "To accept: ", join(' ',@_to_accept), "\n"; + $new->doc_lang( + ( $ENV{'RTFDEFLANG'} || '') =~ m/^(\d{1,10})$/s ? $1 + : ($ENV{'RTFDEFLANG'} || '') =~ m/^0?x([a-fA-F0-9]{1,10})$/s ? hex($1) + # yes, tolerate hex! + : ($ENV{'RTFDEFLANG'} || '') =~ m/^([a-fA-F0-9]{4})$/s ? hex($1) + # yes, tolerate even more hex! + : '1033' + ); + + $new->head1_halfpoint_size(32); + $new->head2_halfpoint_size(28); + $new->head3_halfpoint_size(25); + $new->head4_halfpoint_size(22); + $new->codeblock_halfpoint_size(18); + $new->header_halfpoint_size(17); + $new->normal_halfpoint_size(25); + + return $new; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +__PACKAGE__->_accessorize( + 'doc_lang', + 'head1_halfpoint_size', + 'head2_halfpoint_size', + 'head3_halfpoint_size', + 'head4_halfpoint_size', + 'codeblock_halfpoint_size', + 'header_halfpoint_size', + 'normal_halfpoint_size', + 'no_proofing_exemptions', +); + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sub run { + my $self = $_[0]; + return $self->do_middle if $self->bare_output; + return + $self->do_beginning && $self->do_middle && $self->do_end; +} + + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub do_middle { # the main work + my $self = $_[0]; + my $fh = $self->{'output_fh'}; + + my($token, $type, $tagname, $scratch); + my @stack; + my @indent_stack; + $self->{'rtfindent'} = 0 unless defined $self->{'rtfindent'}; + + while($token = $self->get_token) { + + if( ($type = $token->type) eq 'text' ) { + if( $self->{'rtfverbatim'} ) { + DEBUG > 1 and print STDERR " $type " , $token->text, " in verbatim!\n"; + rtf_esc_codely($scratch = $token->text); + print $fh $scratch; + next; + } + + DEBUG > 1 and print STDERR " $type " , $token->text, "\n"; + + $scratch = $token->text; + $scratch =~ tr/\t\cb\cc/ /d; + + $self->{'no_proofing_exemptions'} or $scratch =~ + s/(?: + ^ + | + (?<=[\r\n\t "\[\<\(]) + ) # start on whitespace, sequence-start, or quote + ( # something looking like a Perl token: + (?: + [\$\@\:\<\*\\_]\S+ # either starting with a sigil, etc. + ) + | + # or starting alpha, but containing anything strange: + (?: + [a-zA-Z'${not_ascii}]+[\$\@\:_<>\(\\\*]\S+ + ) + ) + /\cb$1\cc/xsg + ; + + rtf_esc($scratch); + $scratch =~ + s/( + [^\r\n]{65} # Snare 65 characters from a line + [^\r\n ]{0,50} # and finish any current word + ) + (\ {1,10})(?![\r\n]) # capture some spaces not at line-end + /$1$2\n/gx # and put a NL before those spaces + if $WRAP; + # This may wrap at well past the 65th column, but not past the 120th. + + print $fh $scratch; + + } elsif( $type eq 'start' ) { + DEBUG > 1 and print STDERR " +$type ",$token->tagname, + " (", map("<$_> ", %{$token->attr_hash}), ")\n"; + + if( ($tagname = $token->tagname) eq 'Verbatim' + or $tagname eq 'VerbatimFormatted' + ) { + ++$self->{'rtfverbatim'}; + my $next = $self->get_token; + next unless defined $next; + my $line_count = 1; + if($next->type eq 'text') { + my $t = $next->text_r; + while( $$t =~ m/$/mg ) { + last if ++$line_count > 15; # no point in counting further + } + DEBUG > 3 and print STDERR " verbatim line count: $line_count\n"; + } + $self->unget_token($next); + $self->{'rtfkeep'} = ($line_count > 15) ? '' : '\keepn' ; + + } elsif( $tagname =~ m/^item-/s ) { + my @to_unget; + my $text_count_here = 0; + $self->{'rtfitemkeepn'} = ''; + # Some heuristics to stop item-*'s functioning as subheadings + # from getting split from the things they're subheadings for. + # + # It's not terribly pretty, but it really does make things pretty. + # + while(1) { + push @to_unget, $self->get_token; + pop(@to_unget), last unless defined $to_unget[-1]; + # Erroneously used to be "unshift" instead of pop! Adds instead + # of removes, and operates on the beginning instead of the end! + + if($to_unget[-1]->type eq 'text') { + if( ($text_count_here += length ${$to_unget[-1]->text_r}) > 150 ){ + DEBUG > 1 and print STDERR " item-* is too long to be keepn'd.\n"; + last; + } + } elsif (@to_unget > 1 and + $to_unget[-2]->type eq 'end' and + $to_unget[-2]->tagname =~ m/^item-/s + ) { + # Bail out here, after setting rtfitemkeepn yea or nay. + $self->{'rtfitemkeepn'} = '\keepn' if + $to_unget[-1]->type eq 'start' and + $to_unget[-1]->tagname eq 'Para'; + + DEBUG > 1 and printf STDERR " item-* before %s(%s) %s keepn'd.\n", + $to_unget[-1]->type, + $to_unget[-1]->can('tagname') ? $to_unget[-1]->tagname : '', + $self->{'rtfitemkeepn'} ? "gets" : "doesn't get"; + last; + } elsif (@to_unget > 40) { + DEBUG > 1 and print STDERR " item-* now has too many tokens (", + scalar(@to_unget), + (DEBUG > 4) ? (q<: >, map($_->dump, @to_unget)) : (), + ") to be keepn'd.\n"; + last; # give up + } + # else keep while'ing along + } + # Now put it aaaaall back... + $self->unget_token(@to_unget); + + } elsif( $tagname =~ m/^over-/s ) { + push @stack, $1; + push @indent_stack, + int($token->attr('indent') * 4 * $self->normal_halfpoint_size); + DEBUG and print STDERR "Indenting over $indent_stack[-1] twips.\n"; + $self->{'rtfindent'} += $indent_stack[-1]; + + } elsif ($tagname eq 'L') { + $tagname .= '=' . ($token->attr('type') || 'pod'); + + } elsif ($tagname eq 'Data') { + my $next = $self->get_token; + next unless defined $next; + unless( $next->type eq 'text' ) { + $self->unget_token($next); + next; + } + DEBUG and print STDERR " raw text ", $next->text, "\n"; + printf $fh "\n" . $next->text . "\n"; + next; + } + + defined($scratch = $self->{'Tagmap'}{$tagname}) or next; + $scratch =~ s/\#([^\#]+)\#/${$self}{$1}/g; # interpolate + print $fh $scratch; + + if ($tagname eq 'item-number') { + print $fh $token->attr('number'), ". \n"; + } elsif ($tagname eq 'item-bullet') { + print $fh "\\'", ord("_"), "\n"; + #for funky testing: print $fh '', rtf_esc("\x{4E4B}\x{9053}"); + } + + } elsif( $type eq 'end' ) { + DEBUG > 1 and print STDERR " -$type ",$token->tagname,"\n"; + if( ($tagname = $token->tagname) =~ m/^over-/s ) { + DEBUG and print STDERR "Indenting back $indent_stack[-1] twips.\n"; + $self->{'rtfindent'} -= pop @indent_stack; + pop @stack; + } elsif( $tagname eq 'Verbatim' or $tagname eq 'VerbatimFormatted') { + --$self->{'rtfverbatim'}; + } + defined($scratch = $self->{'Tagmap'}{"/$tagname"}) or next; + $scratch =~ s/\#([^\#]+)\#/${$self}{$1}/g; # interpolate + print $fh $scratch; + } + } + return 1; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sub do_beginning { + my $self = $_[0]; + my $fh = $self->{'output_fh'}; + return print $fh join '', + $self->doc_init, + $self->font_table, + $self->stylesheet, + $self->color_table, + $self->doc_info, + $self->doc_start, + "\n" + ; +} + +sub do_end { + my $self = $_[0]; + my $fh = $self->{'output_fh'}; + return print $fh '}'; # that should do it +} + +########################################################################### + +sub stylesheet { + return sprintf <<'END', +{\stylesheet +{\snext0 Normal;} +{\*\cs10 \additive Default Paragraph Font;} +{\*\cs16 \additive \i \sbasedon10 pod-I;} +{\*\cs17 \additive \i\lang1024\noproof \sbasedon10 pod-F;} +{\*\cs18 \additive \b \sbasedon10 pod-B;} +{\*\cs19 \additive \f1\lang1024\noproof\sbasedon10 pod-C;} +{\s20\ql \li0\ri0\sa180\widctlpar\f1\fs%s\lang1024\noproof\sbasedon0 \snext0 pod-codeblock;} +{\*\cs21 \additive \lang1024\noproof \sbasedon10 pod-computerese;} +{\*\cs22 \additive \i\lang1024\noproof\sbasedon10 pod-L-pod;} +{\*\cs23 \additive \i\lang1024\noproof\sbasedon10 pod-L-url;} +{\*\cs24 \additive \i\lang1024\noproof\sbasedon10 pod-L-man;} + +{\*\cs25 \additive \f1\lang1024\noproof\sbasedon0 pod-codelbock-plain;} +{\*\cs26 \additive \f1\lang1024\noproof\sbasedon25 pod-codelbock-ital;} +{\*\cs27 \additive \f1\lang1024\noproof\sbasedon25 pod-codelbock-bold;} +{\*\cs28 \additive \f1\lang1024\noproof\sbasedon25 pod-codelbock-bold-ital;} + +{\s31\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head1;} +{\s32\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head2;} +{\s33\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head3;} +{\s34\ql \keepn\sb90\sa180\f2\fs%s\ul\sbasedon0 \snext0 pod-head4;} +} + +END + + $_[0]->codeblock_halfpoint_size(), + $_[0]->head1_halfpoint_size(), + $_[0]->head2_halfpoint_size(), + $_[0]->head3_halfpoint_size(), + $_[0]->head4_halfpoint_size(), + ; +} + +########################################################################### +# Override these as necessary for further customization + +sub font_table { + return <<'END'; # text font, code font, heading font +{\fonttbl +{\f0\froman Times New Roman;} +{\f1\fmodern Courier New;} +{\f2\fswiss Arial;} +} + +END +} + +sub doc_init { + return <<'END'; +{\rtf1\ansi\deff0 + +END +} + +sub color_table { + return <<'END'; +{\colortbl;\red255\green0\blue0;\red0\green0\blue255;} +END +} + + +sub doc_info { + my $self = $_[0]; + + my $class = ref($self) || $self; + + my $tag = __PACKAGE__ . ' ' . $VERSION; + + unless($class eq __PACKAGE__) { + $tag = " ($tag)"; + $tag = " v" . $self->VERSION . $tag if defined $self->VERSION; + $tag = $class . $tag; + } + + return sprintf <<'END', +{\info{\doccomm +%s + using %s v%s + under Perl v%s at %s GMT} +{\author [see doc]}{\company [see doc]}{\operator [see doc]} +} + +END + + # None of the following things should need escaping, I dare say! + $tag, + $ISA[0], $ISA[0]->VERSION(), + $], scalar(gmtime), + ; +} + +sub doc_start { + my $self = $_[0]; + my $title = $self->get_short_title(); + DEBUG and print STDERR "Short Title: <$title>\n"; + $title .= ' ' if length $title; + + $title =~ s/ *$/ /s; + $title =~ s/^ //s; + $title =~ s/ $/, /s; + # make sure it ends in a comma and a space, unless it's 0-length + + my $is_obviously_module_name; + $is_obviously_module_name = 1 + if $title =~ m/^\S+$/s and $title =~ m/::/s; + # catches the most common case, at least + + DEBUG and print STDERR "Title0: <$title>\n"; + $title = rtf_esc($title); + DEBUG and print STDERR "Title1: <$title>\n"; + $title = '\lang1024\noproof ' . $title + if $is_obviously_module_name; + + return sprintf <<'END', +\deflang%s\plain\lang%s\widowctrl +{\header\pard\qr\plain\f2\fs%s +%s +p.\chpgn\par} +\fs%s + +END + ($self->doc_lang) x 2, + $self->header_halfpoint_size, + $title, + $self->normal_halfpoint_size, + ; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +#------------------------------------------------------------------------- + +use integer; +sub rtf_esc { + my $x; # scratch + if(!defined wantarray) { # void context: alter in-place! + for(@_) { + s/([F${cntrl}\-\\\{\}${not_ascii}])/$Escape{$1}/g; # ESCAPER + s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg; + } + return; + } elsif(wantarray) { # return an array + return map {; ($x = $_) =~ + s/([F${cntrl}\-\\\{\}${not_ascii}])/$Escape{$1}/g; # ESCAPER + $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg; + $x; + } @_; + } else { # return a single scalar + ($x = ((@_ == 1) ? $_[0] : join '', @_) + ) =~ s/([F${cntrl}\-\\\{\}${not_ascii}])/$Escape{$1}/g; # ESCAPER + # Escape \, {, }, -, control chars, and 7f-ff. + $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg; + return $x; + } +} + +sub rtf_esc_codely { + # Doesn't change "-" to hard-hyphen, nor apply computerese style-smarts. + # We don't want to change the "-" to hard-hyphen, because we want to + # be able to paste this into a file and run it without there being + # dire screaming about the mysterious hard-hyphen character (which + # looks just like a normal dash character). + + my $x; # scratch + if(!defined wantarray) { # void context: alter in-place! + for(@_) { + s/([F${cntrl}\\\{\}${not_ascii}])/$Escape{$1}/g; # ESCAPER + s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg; + } + return; + } elsif(wantarray) { # return an array + return map {; ($x = $_) =~ + s/([F${cntrl}\\\{\}${not_ascii}])/$Escape{$1}/g; # ESCAPER + $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg; + $x; + } @_; + } else { # return a single scalar + ($x = ((@_ == 1) ? $_[0] : join '', @_) + ) =~ s/([F${cntrl}\\\{\}${not_ascii}])/$Escape{$1}/g; # ESCAPER + # Escape \, {, }, -, control chars, and 7f-ff. + $x =~ s/([^\x00-\xFF])/'\\uc1\\u'.((ord($1)<32768)?ord($1):(ord($1)-65536)).'?'/eg; + return $x; + } +} + +%Escape = ( + (($] lt 5.007_003) # Broken for non-ASCII on early Perls + ? (map( (chr($_),chr($_)), # things not apparently needing escaping + 0x20 .. 0x7E ), + map( (chr($_),sprintf("\\'%02x", $_)), # apparently escapeworthy things + 0x00 .. 0x1F, 0x5c, 0x7b, 0x7d, 0x7f .. 0xFF, 0x46)) + : (map( (chr(utf8::unicode_to_native($_)),chr(utf8::unicode_to_native($_))), + 0x20 .. 0x7E ), + map( (chr($_),sprintf("\\'%02x", utf8::unicode_to_native($_))), + 0x00 .. 0x1F, 0x5c, 0x7b, 0x7d, 0x7f .. 0xFF, 0x46))), + + # We get to escape out 'F' so that we can send RTF files thru the mail + # without the slightest worry that paragraphs beginning with "From" + # will get munged. + + # And some refinements: + "\r" => "\n", + "\cj" => "\n", + "\n" => "\n\\line ", + + "\t" => "\\tab ", # Tabs (altho theoretically raw \t's are okay) + "\f" => "\n\\page\n", # Formfeed + "-" => "\\_", # Turn plaintext '-' into a non-breaking hyphen + $Pod::Simple::nbsp => "\\~", # Latin-1 non-breaking space + $Pod::Simple::shy => "\\-", # Latin-1 soft (optional) hyphen + + # CRAZY HACKS: + "\n" => "\\line\n", + "\r" => "\n", + "\cb" => "{\n\\cs21\\lang1024\\noproof ", # \\cf1 + "\cc" => "}", +); +1; + +__END__ + +package Pod::Simple::BlackBox; +# +# "What's in the box?" "Pain." +# +########################################################################### +# +# This is where all the scary things happen: parsing lines into +# paragraphs; and then into directives, verbatims, and then also +# turning formatting sequences into treelets. +# +# Are you really sure you want to read this code? +# +#----------------------------------------------------------------------------- +# +# The basic work of this module Pod::Simple::BlackBox is doing the dirty work +# of parsing Pod into treelets (generally one per non-verbatim paragraph), and +# to call the proper callbacks on the treelets. +# +# Every node in a treelet is a ['name', {attrhash}, ...children...] + +use integer; # vroom! +use strict; +use Carp (); +use vars qw($VERSION ); +$VERSION = '3.35'; +#use constant DEBUG => 7; +BEGIN { + require Pod::Simple; + *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG +} + +# Matches a character iff the character will have a different meaning +# if we choose CP1252 vs UTF-8 if there is no =encoding line. +# This is broken for early Perls on non-ASCII platforms. +my $non_ascii_re = eval "qr/[[:^ascii:]]/"; +$non_ascii_re = qr/[\x80-\xFF]/ if ! defined $non_ascii_re; + +my $utf8_bom; +if (($] ge 5.007_003)) { + $utf8_bom = "\x{FEFF}"; + utf8::encode($utf8_bom); +} else { + $utf8_bom = "\xEF\xBB\xBF"; # No EBCDIC BOM detection for early Perls. +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub parse_line { shift->parse_lines(@_) } # alias + +# - - - Turn back now! Run away! - - - + +sub parse_lines { # Usage: $parser->parse_lines(@lines) + # an undef means end-of-stream + my $self = shift; + + my $code_handler = $self->{'code_handler'}; + my $cut_handler = $self->{'cut_handler'}; + my $wl_handler = $self->{'whiteline_handler'}; + $self->{'line_count'} ||= 0; + + my $scratch; + + DEBUG > 4 and + print STDERR "# Parsing starting at line ", $self->{'line_count'}, ".\n"; + + DEBUG > 5 and + print STDERR "# About to parse lines: ", + join(' ', map defined($_) ? "[$_]" : "EOF", @_), "\n"; + + my $paras = ($self->{'paras'} ||= []); + # paragraph buffer. Because we need to defer processing of =over + # directives and verbatim paragraphs. We call _ponder_paragraph_buffer + # to process this. + + $self->{'pod_para_count'} ||= 0; + + my $line; + foreach my $source_line (@_) { + if( $self->{'source_dead'} ) { + DEBUG > 4 and print STDERR "# Source is dead.\n"; + last; + } + + unless( defined $source_line ) { + DEBUG > 4 and print STDERR "# Undef-line seen.\n"; + + push @$paras, ['~end', {'start_line' => $self->{'line_count'}}]; + push @$paras, $paras->[-1], $paras->[-1]; + # So that it definitely fills the buffer. + $self->{'source_dead'} = 1; + $self->_ponder_paragraph_buffer; + next; + } + + + if( $self->{'line_count'}++ ) { + ($line = $source_line) =~ tr/\n\r//d; + # If we don't have two vars, we'll end up with that there + # tr/// modding the (potentially read-only) original source line! + + } else { + DEBUG > 2 and print STDERR "First line: [$source_line]\n"; + + if( ($line = $source_line) =~ s/^$utf8_bom//s ) { + DEBUG and print STDERR "UTF-8 BOM seen. Faking a '=encoding utf8'.\n"; + $self->_handle_encoding_line( "=encoding utf8" ); + delete $self->{'_processed_encoding'}; + $line =~ tr/\n\r//d; + + } elsif( $line =~ s/^\xFE\xFF//s ) { + DEBUG and print STDERR "Big-endian UTF-16 BOM seen. Aborting parsing.\n"; + $self->scream( + $self->{'line_count'}, + "UTF16-BE Byte Encoding Mark found; but Pod::Simple v$Pod::Simple::VERSION doesn't implement UTF16 yet." + ); + splice @_; + push @_, undef; + next; + + # TODO: implement somehow? + + } elsif( $line =~ s/^\xFF\xFE//s ) { + DEBUG and print STDERR "Little-endian UTF-16 BOM seen. Aborting parsing.\n"; + $self->scream( + $self->{'line_count'}, + "UTF16-LE Byte Encoding Mark found; but Pod::Simple v$Pod::Simple::VERSION doesn't implement UTF16 yet." + ); + splice @_; + push @_, undef; + next; + + # TODO: implement somehow? + + } else { + DEBUG > 2 and print STDERR "First line is BOM-less.\n"; + ($line = $source_line) =~ tr/\n\r//d; + } + } + + if(!$self->{'parse_characters'} && !$self->{'encoding'} + && ($self->{'in_pod'} || $line =~ /^=/s) + && $line =~ /$non_ascii_re/ + ) { + + my $encoding; + + # No =encoding line, and we are at the first line in the input that + # contains a non-ascii byte, that is one whose meaning varies depending + # on whether the file is encoded in UTF-8 or CP1252, which are the two + # possibilities permitted by the pod spec. (ASCII is assumed if the + # file only contains ASCII bytes.) In order to process this line, we + # need to figure out what encoding we will use for the file. + # + # Strictly speaking ISO 8859-1 (Latin 1) refers to the code points + # 160-255, but it is used here, as it often colloquially is, to refer to + # the complete set of code points 0-255, including ASCII (0-127), the C1 + # controls (128-159), and strict Latin 1 (160-255). + # + # CP1252 is effectively a superset of Latin 1, because it differs only + # from colloquial 8859-1 in the C1 controls, which are very unlikely to + # actually be present in 8859-1 files, so can be used for other purposes + # without conflict. CP 1252 uses most of them for graphic characters. + # + # Note that all ASCII-range bytes represent their corresponding code + # points in CP1252 and UTF-8. In ASCII platform UTF-8 all other code + # points require multiple (non-ASCII) bytes to represent. (A separate + # paragraph for EBCDIC is below.) The multi-byte representation is + # quite structured. If we find an isolated byte that requires multiple + # bytes to represent in UTF-8, we know that the encoding is not UTF-8. + # If we find a sequence of bytes that violates the UTF-8 structure, we + # also can presume the encoding isn't UTF-8, and hence must be 1252. + # + # But there are ambiguous cases where we could guess wrong. If so, the + # user will end up having to supply an =encoding line. We use all + # readily available information to improve our chances of guessing + # right. The odds of something not being UTF-8, but still passing a + # UTF-8 validity test go down very rapidly with increasing length of the + # sequence. Therefore we look at all the maximal length non-ascii + # sequences on the line. If any of the sequences can't be UTF-8, we + # quit there and choose CP1252. If all could be UTF-8, we guess UTF-8. + # + # On EBCDIC platforms, the situation is somewhat different. In + # UTF-EBCDIC, not only do ASCII-range bytes represent their code points, + # but so do the bytes that are for the C1 controls. Recall that these + # correspond to the unused portion of 8859-1 that 1252 mostly takes + # over. That means that there are fewer code points that are + # represented by multi-bytes. But, note that the these controls are + # very unlikely to be in pod text. So if we encounter one of them, it + # means that it is quite likely CP1252 and not UTF-8. The net result is + # the same code below is used for both platforms. + while ($line =~ m/($non_ascii_re+)/g) { + my $non_ascii_seq = $1; + + if (length $non_ascii_seq == 1) { + $encoding = 'CP1252'; + goto guessed; + } elsif ($] ge 5.007_003) { + + # On Perls that have this function, we can see if the sequence is + # valid UTF-8 or not. + my $is_utf8; + { + no warnings 'utf8'; + $is_utf8 = utf8::decode($non_ascii_seq); + } + if (! $is_utf8) { + $encoding = 'CP1252'; + goto guessed; + } + } elsif (ord("A") == 65) { # An early Perl, ASCII platform + + # Without utf8::decode, it's a lot harder to do a rigorous check + # (though some early releases had a different function that + # accomplished the same thing). Since these are ancient Perls, not + # likely to be in use today, we take the easy way out, and look at + # just the first two bytes of the sequence to see if they are the + # start of a UTF-8 character. In ASCII UTF-8, continuation bytes + # must be between 0x80 and 0xBF. Start bytes can range from 0xC2 + # through 0xFF, but anything above 0xF4 is not Unicode, and hence + # extremely unlikely to be in a pod. + if ($non_ascii_seq !~ /^[\xC2-\xF4][\x80-\xBF]/) { + $encoding = 'CP1252'; + goto guessed; + } + + # We don't bother doing anything special for EBCDIC on early Perls. + # If there is a solitary variant, CP1252 will be chosen; otherwise + # UTF-8. + } + } # End of loop through all variant sequences on the line + + # All sequences in the line could be UTF-8. Guess that. + $encoding = 'UTF-8'; + + guessed: + $self->_handle_encoding_line( "=encoding $encoding" ); + delete $self->{'_processed_encoding'}; + $self->{'_transcoder'} && $self->{'_transcoder'}->($line); + + my ($word) = $line =~ /(\S*$non_ascii_re\S*)/; + + $self->whine( + $self->{'line_count'}, + "Non-ASCII character seen before =encoding in '$word'. Assuming $encoding" + ); + } + + DEBUG > 5 and print STDERR "# Parsing line: [$line]\n"; + + if(!$self->{'in_pod'}) { + if($line =~ m/^=([a-zA-Z][a-zA-Z0-9]*)(?:\s|$)/s) { + if($1 eq 'cut') { + $self->scream( + $self->{'line_count'}, + "=cut found outside a pod block. Skipping to next block." + ); + + ## Before there were errata sections in the world, it was + ## least-pessimal to abort processing the file. But now we can + ## just barrel on thru (but still not start a pod block). + #splice @_; + #push @_, undef; + + next; + } else { + $self->{'in_pod'} = $self->{'start_of_pod_block'} + = $self->{'last_was_blank'} = 1; + # And fall thru to the pod-mode block further down + } + } else { + DEBUG > 5 and print STDERR "# It's a code-line.\n"; + $code_handler->(map $_, $line, $self->{'line_count'}, $self) + if $code_handler; + # Note: this may cause code to be processed out of order relative + # to pods, but in order relative to cuts. + + # Note also that we haven't yet applied the transcoding to $line + # by time we call $code_handler! + + if( $line =~ m/^#\s*line\s+(\d+)\s*(?:\s"([^"]+)")?\s*$/ ) { + # That RE is from perlsyn, section "Plain Old Comments (Not!)", + #$fname = $2 if defined $2; + #DEBUG > 1 and defined $2 and print STDERR "# Setting fname to \"$fname\"\n"; + DEBUG > 1 and print STDERR "# Setting nextline to $1\n"; + $self->{'line_count'} = $1 - 1; + } + + next; + } + } + + # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + # Else we're in pod mode: + + # Apply any necessary transcoding: + $self->{'_transcoder'} && $self->{'_transcoder'}->($line); + + # HERE WE CATCH =encoding EARLY! + if( $line =~ m/^=encoding\s+\S+\s*$/s ) { + next if $self->parse_characters; # Ignore this line + $line = $self->_handle_encoding_line( $line ); + } + + if($line =~ m/^=cut/s) { + # here ends the pod block, and therefore the previous pod para + DEBUG > 1 and print STDERR "Noting =cut at line ${$self}{'line_count'}\n"; + $self->{'in_pod'} = 0; + # ++$self->{'pod_para_count'}; + $self->_ponder_paragraph_buffer(); + # by now it's safe to consider the previous paragraph as done. + $cut_handler->(map $_, $line, $self->{'line_count'}, $self) + if $cut_handler; + + # TODO: add to docs: Note: this may cause cuts to be processed out + # of order relative to pods, but in order relative to code. + + } elsif($line =~ m/^(\s*)$/s) { # it's a blank line + if (defined $1 and $1 =~ /[^\S\r\n]/) { # it's a white line + $wl_handler->(map $_, $line, $self->{'line_count'}, $self) + if $wl_handler; + } + + if(!$self->{'start_of_pod_block'} and @$paras and $paras->[-1][0] eq '~Verbatim') { + DEBUG > 1 and print STDERR "Saving blank line at line ${$self}{'line_count'}\n"; + push @{$paras->[-1]}, $line; + } # otherwise it's not interesting + + if(!$self->{'start_of_pod_block'} and !$self->{'last_was_blank'}) { + DEBUG > 1 and print STDERR "Noting para ends with blank line at ${$self}{'line_count'}\n"; + } + + $self->{'last_was_blank'} = 1; + + } elsif($self->{'last_was_blank'}) { # A non-blank line starting a new para... + + if($line =~ m/^(=[a-zA-Z][a-zA-Z0-9]*)(?:\s+|$)(.*)/s) { + # THIS IS THE ONE PLACE WHERE WE CONSTRUCT NEW DIRECTIVE OBJECTS + my $new = [$1, {'start_line' => $self->{'line_count'}}, $2]; + # Note that in "=head1 foo", the WS is lost. + # Example: ['=head1', {'start_line' => 123}, ' foo'] + + ++$self->{'pod_para_count'}; + + $self->_ponder_paragraph_buffer(); + # by now it's safe to consider the previous paragraph as done. + + push @$paras, $new; # the new incipient paragraph + DEBUG > 1 and print STDERR "Starting new ${$paras}[-1][0] para at line ${$self}{'line_count'}\n"; + + } elsif($line =~ m/^\s/s) { + + if(!$self->{'start_of_pod_block'} and @$paras and $paras->[-1][0] eq '~Verbatim') { + DEBUG > 1 and print STDERR "Resuming verbatim para at line ${$self}{'line_count'}\n"; + push @{$paras->[-1]}, $line; + } else { + ++$self->{'pod_para_count'}; + $self->_ponder_paragraph_buffer(); + # by now it's safe to consider the previous paragraph as done. + DEBUG > 1 and print STDERR "Starting verbatim para at line ${$self}{'line_count'}\n"; + push @$paras, ['~Verbatim', {'start_line' => $self->{'line_count'}}, $line]; + } + } else { + ++$self->{'pod_para_count'}; + $self->_ponder_paragraph_buffer(); + # by now it's safe to consider the previous paragraph as done. + push @$paras, ['~Para', {'start_line' => $self->{'line_count'}}, $line]; + DEBUG > 1 and print STDERR "Starting plain para at line ${$self}{'line_count'}\n"; + } + $self->{'last_was_blank'} = $self->{'start_of_pod_block'} = 0; + + } else { + # It's a non-blank line /continuing/ the current para + if(@$paras) { + DEBUG > 2 and print STDERR "Line ${$self}{'line_count'} continues current paragraph\n"; + push @{$paras->[-1]}, $line; + } else { + # Unexpected case! + die "Continuing a paragraph but \@\$paras is empty?"; + } + $self->{'last_was_blank'} = $self->{'start_of_pod_block'} = 0; + } + + } # ends the big while loop + + DEBUG > 1 and print STDERR (pretty(@$paras), "\n"); + return $self; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _handle_encoding_line { + my($self, $line) = @_; + + return if $self->parse_characters; + + # The point of this routine is to set $self->{'_transcoder'} as indicated. + + return $line unless $line =~ m/^=encoding\s+(\S+)\s*$/s; + DEBUG > 1 and print STDERR "Found an encoding line \"=encoding $1\"\n"; + + my $e = $1; + my $orig = $e; + push @{ $self->{'encoding_command_reqs'} }, "=encoding $orig"; + + my $enc_error; + + # Cf. perldoc Encode and perldoc Encode::Supported + + require Pod::Simple::Transcode; + + if( $self->{'encoding'} ) { + my $norm_current = $self->{'encoding'}; + my $norm_e = $e; + foreach my $that ($norm_current, $norm_e) { + $that = lc($that); + $that =~ s/[-_]//g; + } + if($norm_current eq $norm_e) { + DEBUG > 1 and print STDERR "The '=encoding $orig' line is ", + "redundant. ($norm_current eq $norm_e). Ignoring.\n"; + $enc_error = ''; + # But that doesn't necessarily mean that the earlier one went okay + } else { + $enc_error = "Encoding is already set to " . $self->{'encoding'}; + DEBUG > 1 and print STDERR $enc_error; + } + } elsif ( + # OK, let's turn on the encoding + do { + DEBUG > 1 and print STDERR " Setting encoding to $e\n"; + $self->{'encoding'} = $e; + 1; + } + and $e eq 'HACKRAW' + ) { + DEBUG and print STDERR " Putting in HACKRAW (no-op) encoding mode.\n"; + + } elsif( Pod::Simple::Transcode::->encoding_is_available($e) ) { + + die($enc_error = "WHAT? _transcoder is already set?!") + if $self->{'_transcoder'}; # should never happen + require Pod::Simple::Transcode; + $self->{'_transcoder'} = Pod::Simple::Transcode::->make_transcoder($e); + eval { + my @x = ('', "abc", "123"); + $self->{'_transcoder'}->(@x); + }; + $@ && die( $enc_error = + "Really unexpected error setting up encoding $e: $@\nAborting" + ); + $self->{'detected_encoding'} = $e; + + } else { + my @supported = Pod::Simple::Transcode::->all_encodings; + + # Note unsupported, and complain + DEBUG and print STDERR " Encoding [$e] is unsupported.", + "\nSupporteds: @supported\n"; + my $suggestion = ''; + + # Look for a near match: + my $norm = lc($e); + $norm =~ tr[-_][]d; + my $n; + foreach my $enc (@supported) { + $n = lc($enc); + $n =~ tr[-_][]d; + next unless $n eq $norm; + $suggestion = " (Maybe \"$e\" should be \"$enc\"?)"; + last; + } + my $encmodver = Pod::Simple::Transcode::->encmodver; + $enc_error = join '' => + "This document probably does not appear as it should, because its ", + "\"=encoding $e\" line calls for an unsupported encoding.", + $suggestion, " [$encmodver\'s supported encodings are: @supported]" + ; + + $self->scream( $self->{'line_count'}, $enc_error ); + } + push @{ $self->{'encoding_command_statuses'} }, $enc_error; + if (defined($self->{'_processed_encoding'})) { + # Double declaration. + $self->scream( $self->{'line_count'}, 'Cannot have multiple =encoding directives'); + } + $self->{'_processed_encoding'} = $orig; + + return $line; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _handle_encoding_second_level { + # By time this is called, the encoding (if well formed) will already + # have been acted one. + my($self, $para) = @_; + my @x = @$para; + my $content = join ' ', splice @x, 2; + $content =~ s/^\s+//s; + $content =~ s/\s+$//s; + + DEBUG > 2 and print STDERR "Ogling encoding directive: =encoding $content\n"; + + if (defined($self->{'_processed_encoding'})) { + #if($content ne $self->{'_processed_encoding'}) { + # Could it happen? + #} + delete $self->{'_processed_encoding'}; + # It's already been handled. Check for errors. + if(! $self->{'encoding_command_statuses'} ) { + DEBUG > 2 and print STDERR " CRAZY ERROR: It wasn't really handled?!\n"; + } elsif( $self->{'encoding_command_statuses'}[-1] ) { + $self->whine( $para->[1]{'start_line'}, + sprintf "Couldn't do %s: %s", + $self->{'encoding_command_reqs' }[-1], + $self->{'encoding_command_statuses'}[-1], + ); + } else { + DEBUG > 2 and print STDERR " (Yup, it was successfully handled already.)\n"; + } + + } else { + # Otherwise it's a syntax error + $self->whine( $para->[1]{'start_line'}, + "Invalid =encoding syntax: $content" + ); + } + + return; +} + +#~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~`~` + +{ +my $m = -321; # magic line number + +sub _gen_errata { + my $self = $_[0]; + # Return 0 or more fake-o paragraphs explaining the accumulated + # errors on this document. + + return() unless $self->{'errata'} and keys %{$self->{'errata'}}; + + my @out; + + foreach my $line (sort {$a <=> $b} keys %{$self->{'errata'}}) { + push @out, + ['=item', {'start_line' => $m}, "Around line $line:"], + map( ['~Para', {'start_line' => $m, '~cooked' => 1}, + #['~Top', {'start_line' => $m}, + $_ + #] + ], + @{$self->{'errata'}{$line}} + ) + ; + } + + # TODO: report of unknown entities? unrenderable characters? + + unshift @out, + ['=head1', {'start_line' => $m, 'errata' => 1}, 'POD ERRORS'], + ['~Para', {'start_line' => $m, '~cooked' => 1, 'errata' => 1}, + "Hey! ", + ['B', {}, + 'The above document had some coding errors, which are explained below:' + ] + ], + ['=over', {'start_line' => $m, 'errata' => 1}, ''], + ; + + push @out, + ['=back', {'start_line' => $m, 'errata' => 1}, ''], + ; + + DEBUG and print STDERR "\n<<\n", pretty(\@out), "\n>>\n\n"; + + return @out; +} + +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +############################################################################## +## +## stop reading now stop reading now stop reading now stop reading now stop +## +## HERE IT BECOMES REALLY SCARY +## +## stop reading now stop reading now stop reading now stop reading now stop +## +############################################################################## + +sub _ponder_paragraph_buffer { + + # Para-token types as found in the buffer. + # ~Verbatim, ~Para, ~end, =head1..4, =for, =begin, =end, + # =over, =back, =item + # and the null =pod (to be complained about if over one line) + # + # "~data" paragraphs are something we generate at this level, depending on + # a currently open =over region + + # Events fired: Begin and end for: + # directivename (like head1 .. head4), item, extend, + # for (from =begin...=end, =for), + # over-bullet, over-number, over-text, over-block, + # item-bullet, item-number, item-text, + # Document, + # Data, Para, Verbatim + # B, C, longdirname (TODO -- wha?), etc. for all directives + # + + my $self = $_[0]; + my $paras; + return unless @{$paras = $self->{'paras'}}; + my $curr_open = ($self->{'curr_open'} ||= []); + + my $scratch; + + DEBUG > 10 and print STDERR "# Paragraph buffer: <<", pretty($paras), ">>\n"; + + # We have something in our buffer. So apparently the document has started. + unless($self->{'doc_has_started'}) { + $self->{'doc_has_started'} = 1; + + my $starting_contentless; + $starting_contentless = + ( + !@$curr_open + and @$paras and ! grep $_->[0] ne '~end', @$paras + # i.e., if the paras is all ~ends + ) + ; + DEBUG and print STDERR "# Starting ", + $starting_contentless ? 'contentless' : 'contentful', + " document\n" + ; + + $self->_handle_element_start( + ($scratch = 'Document'), + { + 'start_line' => $paras->[0][1]{'start_line'}, + $starting_contentless ? ( 'contentless' => 1 ) : (), + }, + ); + } + + my($para, $para_type); + while(@$paras) { + last if @$paras == 1 and + ( $paras->[0][0] eq '=over' or $paras->[0][0] eq '~Verbatim' + or $paras->[0][0] eq '=item' ) + ; + # Those're the three kinds of paragraphs that require lookahead. + # Actually, an "=item Foo" inside an region + # and any =item inside an region (rare) + # don't require any lookahead, but all others (bullets + # and numbers) do. + +# TODO: whinge about many kinds of directives in non-resolving =for regions? +# TODO: many? like what? =head1 etc? + + $para = shift @$paras; + $para_type = $para->[0]; + + DEBUG > 1 and print STDERR "Pondering a $para_type paragraph, given the stack: (", + $self->_dump_curr_open(), ")\n"; + + if($para_type eq '=for') { + next if $self->_ponder_for($para,$curr_open,$paras); + + } elsif($para_type eq '=begin') { + next if $self->_ponder_begin($para,$curr_open,$paras); + + } elsif($para_type eq '=end') { + next if $self->_ponder_end($para,$curr_open,$paras); + + } elsif($para_type eq '~end') { # The virtual end-document signal + next if $self->_ponder_doc_end($para,$curr_open,$paras); + } + + + # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + #~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + if(grep $_->[1]{'~ignore'}, @$curr_open) { + DEBUG > 1 and + print STDERR "Skipping $para_type paragraph because in ignore mode.\n"; + next; + } + #~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + + if($para_type eq '=pod') { + $self->_ponder_pod($para,$curr_open,$paras); + + } elsif($para_type eq '=over') { + next if $self->_ponder_over($para,$curr_open,$paras); + + } elsif($para_type eq '=back') { + next if $self->_ponder_back($para,$curr_open,$paras); + + } else { + + # All non-magical codes!!! + + # Here we start using $para_type for our own twisted purposes, to + # mean how it should get treated, not as what the element name + # should be. + + DEBUG > 1 and print STDERR "Pondering non-magical $para_type\n"; + + my $i; + + # Enforce some =headN discipline + if($para_type =~ m/^=head\d$/s + and ! $self->{'accept_heads_anywhere'} + and @$curr_open + and $curr_open->[-1][0] eq '=over' + ) { + DEBUG > 2 and print STDERR "'=$para_type' inside an '=over'!\n"; + $self->whine( + $para->[1]{'start_line'}, + "You forgot a '=back' before '$para_type'" + ); + unshift @$paras, ['=back', {}, ''], $para; # close the =over + next; + } + + + if($para_type eq '=item') { + + my $over; + unless(@$curr_open and + $over = (grep { $_->[0] eq '=over' } @$curr_open)[-1]) { + $self->whine( + $para->[1]{'start_line'}, + "'=item' outside of any '=over'" + ); + unshift @$paras, + ['=over', {'start_line' => $para->[1]{'start_line'}}, ''], + $para + ; + next; + } + + + my $over_type = $over->[1]{'~type'}; + + if(!$over_type) { + # Shouldn't happen1 + die "Typeless over in stack, starting at line " + . $over->[1]{'start_line'}; + + } elsif($over_type eq 'block') { + unless($curr_open->[-1][1]{'~bitched_about'}) { + $curr_open->[-1][1]{'~bitched_about'} = 1; + $self->whine( + $curr_open->[-1][1]{'start_line'}, + "You can't have =items (as at line " + . $para->[1]{'start_line'} + . ") unless the first thing after the =over is an =item" + ); + } + # Just turn it into a paragraph and reconsider it + $para->[0] = '~Para'; + unshift @$paras, $para; + next; + + } elsif($over_type eq 'text') { + my $item_type = $self->_get_item_type($para); + # That kills the content of the item if it's a number or bullet. + DEBUG and print STDERR " Item is of type ", $para->[0], " under $over_type\n"; + + if($item_type eq 'text') { + # Nothing special needs doing for 'text' + } elsif($item_type eq 'number' or $item_type eq 'bullet') { + $self->whine( + $para->[1]{'start_line'}, + "Expected text after =item, not a $item_type" + ); + # Undo our clobbering: + push @$para, $para->[1]{'~orig_content'}; + delete $para->[1]{'number'}; + # Only a PROPER item-number element is allowed + # to have a number attribute. + } else { + die "Unhandled item type $item_type"; # should never happen + } + + # =item-text thingies don't need any assimilation, it seems. + + } elsif($over_type eq 'number') { + my $item_type = $self->_get_item_type($para); + # That kills the content of the item if it's a number or bullet. + DEBUG and print STDERR " Item is of type ", $para->[0], " under $over_type\n"; + + my $expected_value = ++ $curr_open->[-1][1]{'~counter'}; + + if($item_type eq 'bullet') { + # Hm, it's not numeric. Correct for this. + $para->[1]{'number'} = $expected_value; + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item $expected_value'" + ); + push @$para, $para->[1]{'~orig_content'}; + # restore the bullet, blocking the assimilation of next para + + } elsif($item_type eq 'text') { + # Hm, it's not numeric. Correct for this. + $para->[1]{'number'} = $expected_value; + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item $expected_value'" + ); + # Text content will still be there and will block next ~Para + + } elsif($item_type ne 'number') { + die "Unknown item type $item_type"; # should never happen + + } elsif($expected_value == $para->[1]{'number'}) { + DEBUG > 1 and print STDERR " Numeric item has the expected value of $expected_value\n"; + + } else { + DEBUG > 1 and print STDERR " Numeric item has ", $para->[1]{'number'}, + " instead of the expected value of $expected_value\n"; + $self->whine( + $para->[1]{'start_line'}, + "You have '=item " . $para->[1]{'number'} . + "' instead of the expected '=item $expected_value'" + ); + $para->[1]{'number'} = $expected_value; # correcting!! + } + + if(@$para == 2) { + # For the cases where we /didn't/ push to @$para + if($paras->[0][0] eq '~Para') { + DEBUG and print STDERR "Assimilating following ~Para content into $over_type item\n"; + push @$para, splice @{shift @$paras},2; + } else { + DEBUG and print STDERR "Can't assimilate following ", $paras->[0][0], "\n"; + push @$para, ''; # Just so it's not contentless + } + } + + + } elsif($over_type eq 'bullet') { + my $item_type = $self->_get_item_type($para); + # That kills the content of the item if it's a number or bullet. + DEBUG and print STDERR " Item is of type ", $para->[0], " under $over_type\n"; + + if($item_type eq 'bullet') { + # as expected! + + if( $para->[1]{'~_freaky_para_hack'} ) { + DEBUG and print STDERR "Accomodating '=item * Foo' tolerance hack.\n"; + push @$para, delete $para->[1]{'~_freaky_para_hack'}; + } + + } elsif($item_type eq 'number') { + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item *'" + ); + push @$para, $para->[1]{'~orig_content'}; + # and block assimilation of the next paragraph + delete $para->[1]{'number'}; + # Only a PROPER item-number element is allowed + # to have a number attribute. + } elsif($item_type eq 'text') { + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item *'" + ); + # But doesn't need processing. But it'll block assimilation + # of the next para. + } else { + die "Unhandled item type $item_type"; # should never happen + } + + if(@$para == 2) { + # For the cases where we /didn't/ push to @$para + if($paras->[0][0] eq '~Para') { + DEBUG and print STDERR "Assimilating following ~Para content into $over_type item\n"; + push @$para, splice @{shift @$paras},2; + } else { + DEBUG and print STDERR "Can't assimilate following ", $paras->[0][0], "\n"; + push @$para, ''; # Just so it's not contentless + } + } + + } else { + die "Unhandled =over type \"$over_type\"?"; + # Shouldn't happen! + } + + $para_type = 'Plain'; + $para->[0] .= '-' . $over_type; + # Whew. Now fall thru and process it. + + + } elsif($para_type eq '=extend') { + # Well, might as well implement it here. + $self->_ponder_extend($para); + next; # and skip + } elsif($para_type eq '=encoding') { + # Not actually acted on here, but we catch errors here. + $self->_handle_encoding_second_level($para); + next unless $self->keep_encoding_directive; + $para_type = 'Plain'; + } elsif($para_type eq '~Verbatim') { + $para->[0] = 'Verbatim'; + $para_type = '?Verbatim'; + } elsif($para_type eq '~Para') { + $para->[0] = 'Para'; + $para_type = '?Plain'; + } elsif($para_type eq 'Data') { + $para->[0] = 'Data'; + $para_type = '?Data'; + } elsif( $para_type =~ s/^=//s + and defined( $para_type = $self->{'accept_directives'}{$para_type} ) + ) { + DEBUG > 1 and print STDERR " Pondering known directive ${$para}[0] as $para_type\n"; + } else { + # An unknown directive! + DEBUG > 1 and printf STDERR "Unhandled directive %s (Handled: %s)\n", + $para->[0], join(' ', sort keys %{$self->{'accept_directives'}} ) + ; + $self->whine( + $para->[1]{'start_line'}, + "Unknown directive: $para->[0]" + ); + + # And maybe treat it as text instead of just letting it go? + next; + } + + if($para_type =~ s/^\?//s) { + if(! @$curr_open) { # usual case + DEBUG and print STDERR "Treating $para_type paragraph as such because stack is empty.\n"; + } else { + my @fors = grep $_->[0] eq '=for', @$curr_open; + DEBUG > 1 and print STDERR "Containing fors: ", + join(',', map $_->[1]{'target'}, @fors), "\n"; + + if(! @fors) { + DEBUG and print STDERR "Treating $para_type paragraph as such because stack has no =for's\n"; + + #} elsif(grep $_->[1]{'~resolve'}, @fors) { + #} elsif(not grep !$_->[1]{'~resolve'}, @fors) { + } elsif( $fors[-1][1]{'~resolve'} ) { + # Look to the immediately containing for + + if($para_type eq 'Data') { + DEBUG and print STDERR "Treating Data paragraph as Plain/Verbatim because the containing =for ($fors[-1][1]{'target'}) is a resolver\n"; + $para->[0] = 'Para'; + $para_type = 'Plain'; + } else { + DEBUG and print STDERR "Treating $para_type paragraph as such because the containing =for ($fors[-1][1]{'target'}) is a resolver\n"; + } + } else { + DEBUG and print STDERR "Treating $para_type paragraph as Data because the containing =for ($fors[-1][1]{'target'}) is a non-resolver\n"; + $para->[0] = $para_type = 'Data'; + } + } + } + + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + if($para_type eq 'Plain') { + $self->_ponder_Plain($para); + } elsif($para_type eq 'Verbatim') { + $self->_ponder_Verbatim($para); + } elsif($para_type eq 'Data') { + $self->_ponder_Data($para); + } else { + die "\$para type is $para_type -- how did that happen?"; + # Shouldn't happen. + } + + #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + $para->[0] =~ s/^[~=]//s; + + DEBUG and print STDERR "\n", pretty($para), "\n"; + + # traverse the treelet (which might well be just one string scalar) + $self->{'content_seen'} ||= 1; + $self->_traverse_treelet_bit(@$para); + } + } + + return; +} + +########################################################################### +# The sub-ponderers... + + + +sub _ponder_for { + my ($self,$para,$curr_open,$paras) = @_; + + # Fake it out as a begin/end + my $target; + + if(grep $_->[1]{'~ignore'}, @$curr_open) { + DEBUG > 1 and print STDERR "Ignoring ignorable =for\n"; + return 1; + } + + for(my $i = 2; $i < @$para; ++$i) { + if($para->[$i] =~ s/^\s*(\S+)\s*//s) { + $target = $1; + last; + } + } + unless(defined $target) { + $self->whine( + $para->[1]{'start_line'}, + "=for without a target?" + ); + return 1; + } + DEBUG > 1 and + print STDERR "Faking out a =for $target as a =begin $target / =end $target\n"; + + $para->[0] = 'Data'; + + unshift @$paras, + ['=begin', + {'start_line' => $para->[1]{'start_line'}, '~really' => '=for'}, + $target, + ], + $para, + ['=end', + {'start_line' => $para->[1]{'start_line'}, '~really' => '=for'}, + $target, + ], + ; + + return 1; +} + +sub _ponder_begin { + my ($self,$para,$curr_open,$paras) = @_; + my $content = join ' ', splice @$para, 2; + $content =~ s/^\s+//s; + $content =~ s/\s+$//s; + unless(length($content)) { + $self->whine( + $para->[1]{'start_line'}, + "=begin without a target?" + ); + DEBUG and print STDERR "Ignoring targetless =begin\n"; + return 1; + } + + my ($target, $title) = $content =~ m/^(\S+)\s*(.*)$/; + $para->[1]{'title'} = $title if ($title); + $para->[1]{'target'} = $target; # without any ':' + $content = $target; # strip off the title + + $content =~ s/^:!/!:/s; + my $neg; # whether this is a negation-match + $neg = 1 if $content =~ s/^!//s; + my $to_resolve; # whether to process formatting codes + $to_resolve = 1 if $content =~ s/^://s; + + my $dont_ignore; # whether this target matches us + + foreach my $target_name ( + split(',', $content, -1), + $neg ? () : '*' + ) { + DEBUG > 2 and + print STDERR " Considering whether =begin $content matches $target_name\n"; + next unless $self->{'accept_targets'}{$target_name}; + + DEBUG > 2 and + print STDERR " It DOES match the acceptable target $target_name!\n"; + $to_resolve = 1 + if $self->{'accept_targets'}{$target_name} eq 'force_resolve'; + $dont_ignore = 1; + $para->[1]{'target_matching'} = $target_name; + last; # stop looking at other target names + } + + if($neg) { + if( $dont_ignore ) { + $dont_ignore = ''; + delete $para->[1]{'target_matching'}; + DEBUG > 2 and print STDERR " But the leading ! means that this is a NON-match!\n"; + } else { + $dont_ignore = 1; + $para->[1]{'target_matching'} = '!'; + DEBUG > 2 and print STDERR " But the leading ! means that this IS a match!\n"; + } + } + + $para->[0] = '=for'; # Just what we happen to call these, internally + $para->[1]{'~really'} ||= '=begin'; + $para->[1]{'~ignore'} = (! $dont_ignore) || 0; + $para->[1]{'~resolve'} = $to_resolve || 0; + + DEBUG > 1 and print STDERR " Making note to ", $dont_ignore ? 'not ' : '', + "ignore contents of this region\n"; + DEBUG > 1 and $dont_ignore and print STDERR " Making note to treat contents as ", + ($to_resolve ? 'verbatim/plain' : 'data'), " paragraphs\n"; + DEBUG > 1 and print STDERR " (Stack now: ", $self->_dump_curr_open(), ")\n"; + + push @$curr_open, $para; + if(!$dont_ignore or scalar grep $_->[1]{'~ignore'}, @$curr_open) { + DEBUG > 1 and print STDERR "Ignoring ignorable =begin\n"; + } else { + $self->{'content_seen'} ||= 1; + $self->_handle_element_start((my $scratch='for'), $para->[1]); + } + + return 1; +} + +sub _ponder_end { + my ($self,$para,$curr_open,$paras) = @_; + my $content = join ' ', splice @$para, 2; + $content =~ s/^\s+//s; + $content =~ s/\s+$//s; + DEBUG and print STDERR "Ogling '=end $content' directive\n"; + + unless(length($content)) { + $self->whine( + $para->[1]{'start_line'}, + "'=end' without a target?" . ( + ( @$curr_open and $curr_open->[-1][0] eq '=for' ) + ? ( " (Should be \"=end " . $curr_open->[-1][1]{'target'} . '")' ) + : '' + ) + ); + DEBUG and print STDERR "Ignoring targetless =end\n"; + return 1; + } + + unless($content =~ m/^\S+$/) { # i.e., unless it's one word + $self->whine( + $para->[1]{'start_line'}, + "'=end $content' is invalid. (Stack: " + . $self->_dump_curr_open() . ')' + ); + DEBUG and print STDERR "Ignoring mistargetted =end $content\n"; + return 1; + } + + unless(@$curr_open and $curr_open->[-1][0] eq '=for') { + $self->whine( + $para->[1]{'start_line'}, + "=end $content without matching =begin. (Stack: " + . $self->_dump_curr_open() . ')' + ); + DEBUG and print STDERR "Ignoring mistargetted =end $content\n"; + return 1; + } + + unless($content eq $curr_open->[-1][1]{'target'}) { + $self->whine( + $para->[1]{'start_line'}, + "=end $content doesn't match =begin " + . $curr_open->[-1][1]{'target'} + . ". (Stack: " + . $self->_dump_curr_open() . ')' + ); + DEBUG and print STDERR "Ignoring mistargetted =end $content at line $para->[1]{'start_line'}\n"; + return 1; + } + + # Else it's okay to close... + if(grep $_->[1]{'~ignore'}, @$curr_open) { + DEBUG > 1 and print STDERR "Not firing any event for this =end $content because in an ignored region\n"; + # And that may be because of this to-be-closed =for region, or some + # other one, but it doesn't matter. + } else { + $curr_open->[-1][1]{'start_line'} = $para->[1]{'start_line'}; + # what's that for? + + $self->{'content_seen'} ||= 1; + $self->_handle_element_end( my $scratch = 'for', $para->[1]); + } + DEBUG > 1 and print STDERR "Popping $curr_open->[-1][0] $curr_open->[-1][1]{'target'} because of =end $content\n"; + pop @$curr_open; + + return 1; +} + +sub _ponder_doc_end { + my ($self,$para,$curr_open,$paras) = @_; + if(@$curr_open) { # Deal with things left open + DEBUG and print STDERR "Stack is nonempty at end-document: (", + $self->_dump_curr_open(), ")\n"; + + DEBUG > 9 and print STDERR "Stack: ", pretty($curr_open), "\n"; + unshift @$paras, $self->_closers_for_all_curr_open; + # Make sure there is exactly one ~end in the parastack, at the end: + @$paras = grep $_->[0] ne '~end', @$paras; + push @$paras, $para, $para; + # We need two -- once for the next cycle where we + # generate errata, and then another to be at the end + # when that loop back around to process the errata. + return 1; + + } else { + DEBUG and print STDERR "Okay, stack is empty now.\n"; + } + + # Try generating errata section, if applicable + unless($self->{'~tried_gen_errata'}) { + $self->{'~tried_gen_errata'} = 1; + my @extras = $self->_gen_errata(); + if(@extras) { + unshift @$paras, @extras; + DEBUG and print STDERR "Generated errata... relooping...\n"; + return 1; # I.e., loop around again to process these fake-o paragraphs + } + } + + splice @$paras; # Well, that's that for this paragraph buffer. + DEBUG and print STDERR "Throwing end-document event.\n"; + + $self->_handle_element_end( my $scratch = 'Document' ); + return 1; # Hasta la byebye +} + +sub _ponder_pod { + my ($self,$para,$curr_open,$paras) = @_; + $self->whine( + $para->[1]{'start_line'}, + "=pod directives shouldn't be over one line long! Ignoring all " + . (@$para - 2) . " lines of content" + ) if @$para > 3; + + # Content ignored unless 'pod_handler' is set + if (my $pod_handler = $self->{'pod_handler'}) { + my ($line_num, $line) = map $_, $para->[1]{'start_line'}, $para->[2]; + $line = $line eq '' ? "=pod" : "=pod $line"; # imitate cut_handler output + $pod_handler->($line, $line_num, $self); + } + + # The surrounding methods set content_seen, so let us remain consistent. + # I do not know why it was not here before -- should it not be here? + # $self->{'content_seen'} ||= 1; + + return; +} + +sub _ponder_over { + my ($self,$para,$curr_open,$paras) = @_; + return 1 unless @$paras; + my $list_type; + + if($paras->[0][0] eq '=item') { # most common case + $list_type = $self->_get_initial_item_type($paras->[0]); + + } elsif($paras->[0][0] eq '=back') { + # Ignore empty lists by default + if ($self->{'parse_empty_lists'}) { + $list_type = 'empty'; + } else { + shift @$paras; + return 1; + } + } elsif($paras->[0][0] eq '~end') { + $self->whine( + $para->[1]{'start_line'}, + "=over is the last thing in the document?!" + ); + return 1; # But feh, ignore it. + } else { + $list_type = 'block'; + } + $para->[1]{'~type'} = $list_type; + push @$curr_open, $para; + # yes, we reuse the paragraph as a stack item + + my $content = join ' ', splice @$para, 2; + my $overness; + if($content =~ m/^\s*$/s) { + $para->[1]{'indent'} = 4; + } elsif($content =~ m/^\s*((?:\d*\.)?\d+)\s*$/s) { + no integer; + $para->[1]{'indent'} = $1; + if($1 == 0) { + $self->whine( + $para->[1]{'start_line'}, + "Can't have a 0 in =over $content" + ); + $para->[1]{'indent'} = 4; + } + } else { + $self->whine( + $para->[1]{'start_line'}, + "=over should be: '=over' or '=over positive_number'" + ); + $para->[1]{'indent'} = 4; + } + DEBUG > 1 and print STDERR "=over found of type $list_type\n"; + + $self->{'content_seen'} ||= 1; + $self->_handle_element_start((my $scratch = 'over-' . $list_type), $para->[1]); + + return; +} + +sub _ponder_back { + my ($self,$para,$curr_open,$paras) = @_; + # TODO: fire off or or ?? + + my $content = join ' ', splice @$para, 2; + if($content =~ m/\S/) { + $self->whine( + $para->[1]{'start_line'}, + "=back doesn't take any parameters, but you said =back $content" + ); + } + + if(@$curr_open and $curr_open->[-1][0] eq '=over') { + DEBUG > 1 and print STDERR "=back happily closes matching =over\n"; + # Expected case: we're closing the most recently opened thing + #my $over = pop @$curr_open; + $self->{'content_seen'} ||= 1; + $self->_handle_element_end( my $scratch = + 'over-' . ( (pop @$curr_open)->[1]{'~type'} ), $para->[1] + ); + } else { + DEBUG > 1 and print STDERR "=back found without a matching =over. Stack: (", + join(', ', map $_->[0], @$curr_open), ").\n"; + $self->whine( + $para->[1]{'start_line'}, + '=back without =over' + ); + return 1; # and ignore it + } +} + +sub _ponder_item { + my ($self,$para,$curr_open,$paras) = @_; + my $over; + unless(@$curr_open and + $over = (grep { $_->[0] eq '=over' } @$curr_open)[-1]) { + $self->whine( + $para->[1]{'start_line'}, + "'=item' outside of any '=over'" + ); + unshift @$paras, + ['=over', {'start_line' => $para->[1]{'start_line'}}, ''], + $para + ; + return 1; + } + + + my $over_type = $over->[1]{'~type'}; + + if(!$over_type) { + # Shouldn't happen1 + die "Typeless over in stack, starting at line " + . $over->[1]{'start_line'}; + + } elsif($over_type eq 'block') { + unless($curr_open->[-1][1]{'~bitched_about'}) { + $curr_open->[-1][1]{'~bitched_about'} = 1; + $self->whine( + $curr_open->[-1][1]{'start_line'}, + "You can't have =items (as at line " + . $para->[1]{'start_line'} + . ") unless the first thing after the =over is an =item" + ); + } + # Just turn it into a paragraph and reconsider it + $para->[0] = '~Para'; + unshift @$paras, $para; + return 1; + + } elsif($over_type eq 'text') { + my $item_type = $self->_get_item_type($para); + # That kills the content of the item if it's a number or bullet. + DEBUG and print STDERR " Item is of type ", $para->[0], " under $over_type\n"; + + if($item_type eq 'text') { + # Nothing special needs doing for 'text' + } elsif($item_type eq 'number' or $item_type eq 'bullet') { + $self->whine( + $para->[1]{'start_line'}, + "Expected text after =item, not a $item_type" + ); + # Undo our clobbering: + push @$para, $para->[1]{'~orig_content'}; + delete $para->[1]{'number'}; + # Only a PROPER item-number element is allowed + # to have a number attribute. + } else { + die "Unhandled item type $item_type"; # should never happen + } + + # =item-text thingies don't need any assimilation, it seems. + + } elsif($over_type eq 'number') { + my $item_type = $self->_get_item_type($para); + # That kills the content of the item if it's a number or bullet. + DEBUG and print STDERR " Item is of type ", $para->[0], " under $over_type\n"; + + my $expected_value = ++ $curr_open->[-1][1]{'~counter'}; + + if($item_type eq 'bullet') { + # Hm, it's not numeric. Correct for this. + $para->[1]{'number'} = $expected_value; + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item $expected_value'" + ); + push @$para, $para->[1]{'~orig_content'}; + # restore the bullet, blocking the assimilation of next para + + } elsif($item_type eq 'text') { + # Hm, it's not numeric. Correct for this. + $para->[1]{'number'} = $expected_value; + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item $expected_value'" + ); + # Text content will still be there and will block next ~Para + + } elsif($item_type ne 'number') { + die "Unknown item type $item_type"; # should never happen + + } elsif($expected_value == $para->[1]{'number'}) { + DEBUG > 1 and print STDERR " Numeric item has the expected value of $expected_value\n"; + + } else { + DEBUG > 1 and print STDERR " Numeric item has ", $para->[1]{'number'}, + " instead of the expected value of $expected_value\n"; + $self->whine( + $para->[1]{'start_line'}, + "You have '=item " . $para->[1]{'number'} . + "' instead of the expected '=item $expected_value'" + ); + $para->[1]{'number'} = $expected_value; # correcting!! + } + + if(@$para == 2) { + # For the cases where we /didn't/ push to @$para + if($paras->[0][0] eq '~Para') { + DEBUG and print STDERR "Assimilating following ~Para content into $over_type item\n"; + push @$para, splice @{shift @$paras},2; + } else { + DEBUG and print STDERR "Can't assimilate following ", $paras->[0][0], "\n"; + push @$para, ''; # Just so it's not contentless + } + } + + + } elsif($over_type eq 'bullet') { + my $item_type = $self->_get_item_type($para); + # That kills the content of the item if it's a number or bullet. + DEBUG and print STDERR " Item is of type ", $para->[0], " under $over_type\n"; + + if($item_type eq 'bullet') { + # as expected! + + if( $para->[1]{'~_freaky_para_hack'} ) { + DEBUG and print STDERR "Accomodating '=item * Foo' tolerance hack.\n"; + push @$para, delete $para->[1]{'~_freaky_para_hack'}; + } + + } elsif($item_type eq 'number') { + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item *'" + ); + push @$para, $para->[1]{'~orig_content'}; + # and block assimilation of the next paragraph + delete $para->[1]{'number'}; + # Only a PROPER item-number element is allowed + # to have a number attribute. + } elsif($item_type eq 'text') { + $self->whine( + $para->[1]{'start_line'}, + "Expected '=item *'" + ); + # But doesn't need processing. But it'll block assimilation + # of the next para. + } else { + die "Unhandled item type $item_type"; # should never happen + } + + if(@$para == 2) { + # For the cases where we /didn't/ push to @$para + if($paras->[0][0] eq '~Para') { + DEBUG and print STDERR "Assimilating following ~Para content into $over_type item\n"; + push @$para, splice @{shift @$paras},2; + } else { + DEBUG and print STDERR "Can't assimilate following ", $paras->[0][0], "\n"; + push @$para, ''; # Just so it's not contentless + } + } + + } else { + die "Unhandled =over type \"$over_type\"?"; + # Shouldn't happen! + } + $para->[0] .= '-' . $over_type; + + return; +} + +sub _ponder_Plain { + my ($self,$para) = @_; + DEBUG and print STDERR " giving plain treatment...\n"; + unless( @$para == 2 or ( @$para == 3 and $para->[2] eq '' ) + or $para->[1]{'~cooked'} + ) { + push @$para, + @{$self->_make_treelet( + join("\n", splice(@$para, 2)), + $para->[1]{'start_line'} + )}; + } + # Empty paragraphs don't need a treelet for any reason I can see. + # And precooked paragraphs already have a treelet. + return; +} + +sub _ponder_Verbatim { + my ($self,$para) = @_; + DEBUG and print STDERR " giving verbatim treatment...\n"; + + $para->[1]{'xml:space'} = 'preserve'; + + my $indent = $self->strip_verbatim_indent; + if ($indent && ref $indent eq 'CODE') { + my @shifted = (shift @{$para}, shift @{$para}); + $indent = $indent->($para); + unshift @{$para}, @shifted; + } + + for(my $i = 2; $i < @$para; $i++) { + foreach my $line ($para->[$i]) { # just for aliasing + # Strip indentation. + $line =~ s/^\Q$indent// if $indent + && !($self->{accept_codes} && $self->{accept_codes}{VerbatimFormatted}); + while( $line =~ + # Sort of adapted from Text::Tabs -- yes, it's hardwired in that + # tabs are at every EIGHTH column. For portability, it has to be + # one setting everywhere, and 8th wins. + s/^([^\t]*)(\t+)/$1.(" " x ((length($2)<<3)-(length($1)&7)))/e + ) {} + + # TODO: whinge about (or otherwise treat) unindented or overlong lines + + } + } + + # Now the VerbatimFormatted hoodoo... + if( $self->{'accept_codes'} and + $self->{'accept_codes'}{'VerbatimFormatted'} + ) { + while(@$para > 3 and $para->[-1] !~ m/\S/) { pop @$para } + # Kill any number of terminal newlines + $self->_verbatim_format($para); + } elsif ($self->{'codes_in_verbatim'}) { + push @$para, + @{$self->_make_treelet( + join("\n", splice(@$para, 2)), + $para->[1]{'start_line'}, $para->[1]{'xml:space'} + )}; + $para->[-1] =~ s/\n+$//s; # Kill any number of terminal newlines + } else { + push @$para, join "\n", splice(@$para, 2) if @$para > 3; + $para->[-1] =~ s/\n+$//s; # Kill any number of terminal newlines + } + return; +} + +sub _ponder_Data { + my ($self,$para) = @_; + DEBUG and print STDERR " giving data treatment...\n"; + $para->[1]{'xml:space'} = 'preserve'; + push @$para, join "\n", splice(@$para, 2) if @$para > 3; + return; +} + + + + +########################################################################### + +sub _traverse_treelet_bit { # for use only by the routine above + my($self, $name) = splice @_,0,2; + + my $scratch; + $self->_handle_element_start(($scratch=$name), shift @_); + + while (@_) { + my $x = shift; + if (ref($x)) { + &_traverse_treelet_bit($self, @$x); + } else { + $x .= shift while @_ && !ref($_[0]); + $self->_handle_text($x); + } + } + + $self->_handle_element_end($scratch=$name); + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _closers_for_all_curr_open { + my $self = $_[0]; + my @closers; + foreach my $still_open (@{ $self->{'curr_open'} || return }) { + my @copy = @$still_open; + $copy[1] = {%{ $copy[1] }}; + #$copy[1]{'start_line'} = -1; + if($copy[0] eq '=for') { + $copy[0] = '=end'; + } elsif($copy[0] eq '=over') { + $self->whine( + $still_open->[1]{start_line} , + "=over without closing =back" + ); + + $copy[0] = '=back'; + } else { + die "I don't know how to auto-close an open $copy[0] region"; + } + + unless( @copy > 2 ) { + push @copy, $copy[1]{'target'}; + $copy[-1] = '' unless defined $copy[-1]; + # since =over's don't have targets + } + + $copy[1]{'fake-closer'} = 1; + + DEBUG and print STDERR "Queuing up fake-o event: ", pretty(\@copy), "\n"; + unshift @closers, \@copy; + } + return @closers; +} + +#-------------------------------------------------------------------------- + +sub _verbatim_format { + my($it, $p) = @_; + + my $formatting; + + for(my $i = 2; $i < @$p; $i++) { # work backwards over the lines + DEBUG and print STDERR "_verbatim_format appends a newline to $i: $p->[$i]\n"; + $p->[$i] .= "\n"; + # Unlike with simple Verbatim blocks, we don't end up just doing + # a join("\n", ...) on the contents, so we have to append a + # newline to ever line, and then nix the last one later. + } + + if( DEBUG > 4 ) { + print STDERR "<<\n"; + for(my $i = $#$p; $i >= 2; $i--) { # work backwards over the lines + print STDERR "_verbatim_format $i: $p->[$i]"; + } + print STDERR ">>\n"; + } + + for(my $i = $#$p; $i > 2; $i--) { + # work backwards over the lines, except the first (#2) + + #next unless $p->[$i] =~ m{^#:([ \^\/\%]*)\n?$}s + # and $p->[$i-1] !~ m{^#:[ \^\/\%]*\n?$}s; + # look at a formatty line preceding a nonformatty one + DEBUG > 5 and print STDERR "Scrutinizing line $i: $$p[$i]\n"; + if($p->[$i] =~ m{^#:([ \^\/\%]*)\n?$}s) { + DEBUG > 5 and print STDERR " It's a formatty line. ", + "Peeking at previous line ", $i-1, ": $$p[$i-1]: \n"; + + if( $p->[$i-1] =~ m{^#:[ \^\/\%]*\n?$}s ) { + DEBUG > 5 and print STDERR " Previous line is formatty! Skipping this one.\n"; + next; + } else { + DEBUG > 5 and print STDERR " Previous line is non-formatty! Yay!\n"; + } + } else { + DEBUG > 5 and print STDERR " It's not a formatty line. Ignoring\n"; + next; + } + + # A formatty line has to have #: in the first two columns, and uses + # "^" to mean bold, "/" to mean underline, and "%" to mean bold italic. + # Example: + # What do you want? i like pie. [or whatever] + # #:^^^^^^^^^^^^^^^^^ ///////////// + + + DEBUG > 4 and print STDERR "_verbatim_format considers:\n<$p->[$i-1]>\n<$p->[$i]>\n"; + + $formatting = ' ' . $1; + $formatting =~ s/\s+$//s; # nix trailing whitespace + unless(length $formatting and $p->[$i-1] =~ m/\S/) { # no-op + splice @$p,$i,1; # remove this line + $i--; # don't consider next line + next; + } + + if( length($formatting) >= length($p->[$i-1]) ) { + $formatting = substr($formatting, 0, length($p->[$i-1]) - 1) . ' '; + } else { + $formatting .= ' ' x (length($p->[$i-1]) - length($formatting)); + } + # Make $formatting and the previous line be exactly the same length, + # with $formatting having a " " as the last character. + + DEBUG > 4 and print STDERR "Formatting <$formatting> on <", $p->[$i-1], ">\n"; + + + my @new_line; + while( $formatting =~ m{\G(( +)|(\^+)|(\/+)|(\%+))}g ) { + #print STDERR "Format matches $1\n"; + + if($2) { + #print STDERR "SKIPPING <$2>\n"; + push @new_line, + substr($p->[$i-1], pos($formatting)-length($1), length($1)); + } else { + #print STDERR "SNARING $+\n"; + push @new_line, [ + ( + $3 ? 'VerbatimB' : + $4 ? 'VerbatimI' : + $5 ? 'VerbatimBI' : die("Should never get called") + ), {}, + substr($p->[$i-1], pos($formatting)-length($1), length($1)) + ]; + #print STDERR "Formatting <$new_line[-1][-1]> as $new_line[-1][0]\n"; + } + } + my @nixed = + splice @$p, $i-1, 2, @new_line; # replace myself and the next line + DEBUG > 10 and print STDERR "Nixed count: ", scalar(@nixed), "\n"; + + DEBUG > 6 and print STDERR "New version of the above line is these tokens (", + scalar(@new_line), "):", + map( ref($_)?"<@$_> ":"<$_>", @new_line ), "\n"; + $i--; # So the next line we scrutinize is the line before the one + # that we just went and formatted + } + + $p->[0] = 'VerbatimFormatted'; + + # Collapse adjacent text nodes, just for kicks. + for( my $i = 2; $i > $#$p; $i++ ) { # work forwards over the tokens except for the last + if( !ref($p->[$i]) and !ref($p->[$i + 1]) ) { + DEBUG > 5 and print STDERR "_verbatim_format merges {$p->[$i]} and {$p->[$i+1]}\n"; + $p->[$i] .= splice @$p, $i+1, 1; # merge + --$i; # and back up + } + } + + # Now look for the last text token, and remove the terminal newline + for( my $i = $#$p; $i >= 2; $i-- ) { + # work backwards over the tokens, even the first + if( !ref($p->[$i]) ) { + if($p->[$i] =~ s/\n$//s) { + DEBUG > 5 and print STDERR "_verbatim_format killed the terminal newline on #$i: {$p->[$i]}, after {$p->[$i-1]}\n"; + } else { + DEBUG > 5 and print STDERR + "No terminal newline on #$i: {$p->[$i]}, after {$p->[$i-1]} !?\n"; + } + last; # we only want the next one + } + } + + return; +} + + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + + +sub _treelet_from_formatting_codes { + # Given a paragraph, returns a treelet. Full of scary tokenizing code. + # Like [ '~Top', {'start_line' => $start_line}, + # "I like ", + # [ 'B', {}, "pie" ], + # "!" + # ] + + my($self, $para, $start_line, $preserve_space) = @_; + + my $treelet = ['~Top', {'start_line' => $start_line},]; + + unless ($preserve_space || $self->{'preserve_whitespace'}) { + $para =~ s/\s+/ /g; # collapse and trim all whitespace first. + $para =~ s/ $//; + $para =~ s/^ //; + } + + # Only apparent problem the above code is that N<< >> turns into + # N<< >>. But then, word wrapping does that too! So don't do that! + + my @stack; + my @lineage = ($treelet); + my $raw = ''; # raw content of L<> fcode before splitting/processing + # XXX 'raw' is not 100% accurate: all surrounding whitespace is condensed + # into just 1 ' '. Is this the regex's doing or 'raw's? + my $inL = 0; + + DEBUG > 4 and print STDERR "Paragraph:\n$para\n\n"; + + # Here begins our frightening tokenizer RE. The following regex matches + # text in four main parts: + # + # * Start-codes. The first alternative matches C< or C<<, the latter + # followed by some whitespace. $1 will hold the entire start code + # (including any space following a multiple-angle-bracket delimiter), + # and $2 will hold only the additional brackets past the first in a + # multiple-bracket delimiter. length($2) + 1 will be the number of + # closing brackets we have to find. + # + # * Closing brackets. Match some amount of whitespace followed by + # multiple close brackets. The logic to see if this closes anything + # is down below. Note that in order to parse C<< >> correctly, we + # have to use look-behind (?<=\s\s), since the match of the starting + # code will have consumed the whitespace. + # + # * A single closing bracket, to close a simple code like C<>. + # + # * Something that isn't a start or end code. We have to be careful + # about accepting whitespace, since perlpodspec says that any whitespace + # before a multiple-bracket closing delimiter should be ignored. + # + while($para =~ + m/\G + (?: + # Match starting codes, including the whitespace following a + # multiple-delimiter start code. $1 gets the whole start code and + # $2 gets all but one of the {2,}) + | + (\s?>) # $5: simple end-codes + | + ( # $6: stuff containing no start-codes or end-codes + (?: + [^A-Z\s>] + | + (?: + [A-Z](?!<) + ) + | + # whitespace is ok, but we don't want to eat the whitespace before + # a multiple-bracket end code. + # NOTE: we may still have problems with e.g. S<< >> + (?: + \s(?!\s*>{2,}) + ) + )+ + ) + ) + /xgo + ) { + DEBUG > 4 and print STDERR "\nParagraphic tokenstack = (@stack)\n"; + if(defined $1) { + if(defined $2) { + DEBUG > 3 and print STDERR "Found complex start-text code \"$1\"\n"; + push @stack, length($2) + 1; + # length of the necessary complex end-code string + } else { + DEBUG > 3 and print STDERR "Found simple start-text code \"$1\"\n"; + push @stack, 0; # signal that we're looking for simple + } + push @lineage, [ substr($1,0,1), {}, ]; # new node object + push @{ $lineage[-2] }, $lineage[-1]; + if ('L' eq substr($1,0,1)) { + $raw = $inL ? $raw.$1 : ''; # reset raw content accumulator + $inL = 1; + } else { + $raw .= $1 if $inL; + } + + } elsif(defined $4) { + DEBUG > 3 and print STDERR "Found apparent complex end-text code \"$3$4\"\n"; + # This is where it gets messy... + if(! @stack) { + # We saw " >>>>" but needed nothing. This is ALL just stuff then. + DEBUG > 4 and print STDERR " But it's really just stuff.\n"; + push @{ $lineage[-1] }, $3, $4; + next; + } elsif(!$stack[-1]) { + # We saw " >>>>" but needed only ">". Back pos up. + DEBUG > 4 and print STDERR " And that's more than we needed to close simple.\n"; + push @{ $lineage[-1] }, $3; # That was a for-real space, too. + pos($para) = pos($para) - length($4) + 1; + } elsif($stack[-1] == length($4)) { + # We found " >>>>", and it was exactly what we needed. Commonest case. + DEBUG > 4 and print STDERR " And that's exactly what we needed to close complex.\n"; + } elsif($stack[-1] < length($4)) { + # We saw " >>>>" but needed only " >>". Back pos up. + DEBUG > 4 and print STDERR " And that's more than we needed to close complex.\n"; + pos($para) = pos($para) - length($4) + $stack[-1]; + } else { + # We saw " >>>>" but needed " >>>>>>". So this is all just stuff! + DEBUG > 4 and print STDERR " But it's really just stuff, because we needed more.\n"; + push @{ $lineage[-1] }, $3, $4; + next; + } + #print STDERR "\nHOOBOY ", scalar(@{$lineage[-1]}), "!!!\n"; + + push @{ $lineage[-1] }, '' if 2 == @{ $lineage[-1] }; + # Keep the element from being childless + + pop @stack; + pop @lineage; + + unless (@stack) { # not in an L if there are no open fcodes + $inL = 0; + if (ref $lineage[-1][-1] && $lineage[-1][-1][0] eq 'L') { + $lineage[-1][-1][1]{'raw'} = $raw + } + } + $raw .= $3.$4 if $inL; + + } elsif(defined $5) { + DEBUG > 3 and print STDERR "Found apparent simple end-text code \"$5\"\n"; + + if(@stack and ! $stack[-1]) { + # We're indeed expecting a simple end-code + DEBUG > 4 and print STDERR " It's indeed an end-code.\n"; + + if(length($5) == 2) { # There was a space there: " >" + push @{ $lineage[-1] }, ' '; + } elsif( 2 == @{ $lineage[-1] } ) { # Closing a childless element + push @{ $lineage[-1] }, ''; # keep it from being really childless + } + + pop @stack; + pop @lineage; + } else { + DEBUG > 4 and print STDERR " It's just stuff.\n"; + push @{ $lineage[-1] }, $5; + } + + unless (@stack) { # not in an L if there are no open fcodes + $inL = 0; + if (ref $lineage[-1][-1] && $lineage[-1][-1][0] eq 'L') { + $lineage[-1][-1][1]{'raw'} = $raw + } + } + $raw .= $5 if $inL; + + } elsif(defined $6) { + DEBUG > 3 and print STDERR "Found stuff \"$6\"\n"; + push @{ $lineage[-1] }, $6; + $raw .= $6 if $inL; + # XXX does not capture multiplace whitespaces -- 'raw' ends up with + # at most 1 leading/trailing whitespace, why not all of it? + + } else { + # should never ever ever ever happen + DEBUG and print STDERR "AYYAYAAAAA at line ", __LINE__, "\n"; + die "SPORK 512512!"; + } + } + + if(@stack) { # Uhoh, some sequences weren't closed. + my $x= "..."; + while(@stack) { + push @{ $lineage[-1] }, '' if 2 == @{ $lineage[-1] }; + # Hmmmmm! + + my $code = (pop @lineage)->[0]; + my $ender_length = pop @stack; + if($ender_length) { + --$ender_length; + $x = $code . ("<" x $ender_length) . " $x " . (">" x $ender_length); + } else { + $x = $code . "<$x>"; + } + } + DEBUG > 1 and print STDERR "Unterminated $x sequence\n"; + $self->whine($start_line, + "Unterminated $x sequence", + ); + } + + return $treelet; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub text_content_of_treelet { # method: $parser->text_content_of_treelet($lol) + return stringify_lol($_[1]); +} + +sub stringify_lol { # function: stringify_lol($lol) + my $string_form = ''; + _stringify_lol( $_[0] => \$string_form ); + return $string_form; +} + +sub _stringify_lol { # the real recursor + my($lol, $to) = @_; + for(my $i = 2; $i < @$lol; ++$i) { + if( ref($lol->[$i] || '') and UNIVERSAL::isa($lol->[$i], 'ARRAY') ) { + _stringify_lol( $lol->[$i], $to); # recurse! + } else { + $$to .= $lol->[$i]; + } + } + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _dump_curr_open { # return a string representation of the stack + my $curr_open = $_[0]{'curr_open'}; + + return '[empty]' unless @$curr_open; + return join '; ', + map {; + ($_->[0] eq '=for') + ? ( ($_->[1]{'~really'} || '=over') + . ' ' . $_->[1]{'target'}) + : $_->[0] + } + @$curr_open + ; +} + +########################################################################### +my %pretty_form = ( + "\a" => '\a', # ding! + "\b" => '\b', # BS + "\e" => '\e', # ESC + "\f" => '\f', # FF + "\t" => '\t', # tab + "\cm" => '\cm', + "\cj" => '\cj', + "\n" => '\n', # probably overrides one of either \cm or \cj + '"' => '\"', + '\\' => '\\\\', + '$' => '\\$', + '@' => '\\@', + '%' => '\\%', + '#' => '\\#', +); + +sub pretty { # adopted from Class::Classless + # Not the most brilliant routine, but passable. + # Don't give it a cyclic data structure! + my @stuff = @_; # copy + my $x; + my $out = + # join ",\n" . + join ", ", + map {; + if(!defined($_)) { + "undef"; + } elsif(ref($_) eq 'ARRAY' or ref($_) eq 'Pod::Simple::LinkSection') { + $x = "[ " . pretty(@$_) . " ]" ; + $x; + } elsif(ref($_) eq 'SCALAR') { + $x = "\\" . pretty($$_) ; + $x; + } elsif(ref($_) eq 'HASH') { + my $hr = $_; + $x = "{" . join(", ", + map(pretty($_) . '=>' . pretty($hr->{$_}), + sort keys %$hr ) ) . "}" ; + $x; + } elsif(!length($_)) { q{''} # empty string + } elsif( + $_ eq '0' # very common case + or( + m/^-?(?:[123456789]\d*|0)(?:\.\d+)?$/s + and $_ ne '-0' # the strange case that RE lets thru + ) + ) { $_; + } else { + # Yes, explicitly name every character desired. There are shorcuts one + # could make, but I (Karl Williamson) was afraid that some Perl + # releases would have bugs in some of them. For example [A-Z] works + # even on EBCDIC platforms to match exactly the 26 uppercase English + # letters, but I don't know if it has always worked without bugs. It + # seemed safest just to list the characters. + # s<([^\x20\x21\x23\x27-\x3F\x41-\x5B\x5D-\x7E])> + s<([^ !#'()*+,\-./0123456789:;\<=\>?ABCDEFGHIJKLMNOPQRSTUVWXYZ\[\]^_`abcdefghijklmnopqrstuvwxyz{|}~])> + <$pretty_form{$1} || '\\x{'.sprintf("%x", ord($1)).'}'>eg; + #<$pretty_form{$1} || '\\x'.(unpack("H2",$1))>eg; + qq{"$_"}; + } + } @stuff; + # $out =~ s/\n */ /g if length($out) < 75; + return $out; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +# A rather unsubtle method of blowing away all the state information +# from a parser object so it can be reused. Provided as a utility for +# backward compatibility in Pod::Man, etc. but not recommended for +# general use. + +sub reinit { + my $self = shift; + foreach (qw(source_dead source_filename doc_has_started +start_of_pod_block content_seen last_was_blank paras curr_open +line_count pod_para_count in_pod ~tried_gen_errata all_errata errata errors_seen +Title)) { + + delete $self->{$_}; + } +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + + +require 5; +package Pod::Simple::DumpAsText; +$VERSION = '3.35'; +use Pod::Simple (); +BEGIN {@ISA = ('Pod::Simple')} + +use strict; + +use Carp (); + +BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG } + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->accept_codes('VerbatimFormatted'); + $new->keep_encoding_directive(1); + return $new; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _handle_element_start { + # ($self, $element_name, $attr_hash_r) + my $fh = $_[0]{'output_fh'}; + my($key, $value); + DEBUG and print STDERR "++ $_[1]\n"; + + print $fh ' ' x ($_[0]{'indent'} || 0), "++", $_[1], "\n"; + $_[0]{'indent'}++; + while(($key,$value) = each %{$_[2]}) { + unless($key =~ m/^~/s) { + next if $key eq 'start_line' and $_[0]{'hide_line_numbers'}; + _perly_escape($key); + _perly_escape($value); + printf $fh qq{%s \\ "%s" => "%s"\n}, + ' ' x ($_[0]{'indent'} || 0), $key, $value; + } + } + return; +} + +sub _handle_text { + DEBUG and print STDERR "== \"$_[1]\"\n"; + + if(length $_[1]) { + my $indent = ' ' x $_[0]{'indent'}; + my $text = $_[1]; + _perly_escape($text); + $text =~ # A not-totally-brilliant wrapping algorithm: + s/( + [^\n]{55} # Snare some characters from a line + [^\n\ ]{0,50} # and finish any current word + ) + \ {1,10}(?!\n) # capture some spaces not at line-end + /$1"\n$indent . "/gx # => line-break here + ; + + print {$_[0]{'output_fh'}} $indent, '* "', $text, "\"\n"; + } + return; +} + +sub _handle_element_end { + DEBUG and print STDERR "-- $_[1]\n"; + print {$_[0]{'output_fh'}} + ' ' x --$_[0]{'indent'}, "--", $_[1], "\n"; + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub _perly_escape { + foreach my $x (@_) { + $x =~ s/([^\x00-\xFF])/sprintf'\x{%X}',ord($1)/eg; + # Escape things very cautiously: + $x =~ s/([^-\n\t \&\<\>\'!\#\%\(\)\*\+,\.\/\:\;=\?\~\[\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/sprintf'\x%02X',ord($1)/eg; + } + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + + +__END__ + + +require 5; +package Pod::Simple::Methody; +use strict; +use Pod::Simple (); +use vars qw(@ISA $VERSION); +$VERSION = '3.35'; +@ISA = ('Pod::Simple'); + +# Yes, we could use named variables, but I want this to be impose +# as little an additional performance hit as possible. + +sub _handle_element_start { + $_[1] =~ tr/-:./__/; + ( $_[0]->can( 'start_' . $_[1] ) + || return + )->( + $_[0], $_[2] + ); +} + +sub _handle_text { + ( $_[0]->can( 'handle_text' ) + || return + )->( + @_ + ); +} + +sub _handle_element_end { + $_[1] =~ tr/-:./__/; + ( $_[0]->can( 'end_' . $_[1] ) + || return + )->( + $_[0], $_[2] + ); +} + +1; + + +__END__ + + +package Pod::Simple::XHTML; +use strict; +use vars qw( $VERSION @ISA $HAS_HTML_ENTITIES ); +$VERSION = '3.35'; +use Pod::Simple::Methody (); +@ISA = ('Pod::Simple::Methody'); + +BEGIN { + $HAS_HTML_ENTITIES = eval "require HTML::Entities; 1"; +} + +my %entities = ( + q{>} => 'gt', + q{<} => 'lt', + q{'} => '#39', + q{"} => 'quot', + q{&} => 'amp', +); + +sub encode_entities { + my $self = shift; + my $ents = $self->html_encode_chars; + return HTML::Entities::encode_entities( $_[0], $ents ) if $HAS_HTML_ENTITIES; + if (defined $ents) { + $ents =~ s,(?_accessorize( + 'perldoc_url_prefix', + 'perldoc_url_postfix', + 'man_url_prefix', + 'man_url_postfix', + 'title_prefix', 'title_postfix', + 'html_css', + 'html_javascript', + 'html_doctype', + 'html_charset', + 'html_encode_chars', + 'html_h_level', + 'title', # Used internally for the title extracted from the content + 'default_title', + 'force_title', + 'html_header', + 'html_footer', + 'index', + 'anchor_items', + 'backlink', + 'batch_mode', # whether we're in batch mode + 'batch_mode_current_level', + # When in batch mode, how deep the current module is: 1 for "LWP", + # 2 for "LWP::Procotol", 3 for "LWP::Protocol::GHTTP", etc +); + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->perldoc_url_prefix('http://search.cpan.org/perldoc?'); + $new->man_url_prefix('http://man.he.net/man'); + $new->html_charset('ISO-8859-1'); + $new->nix_X_codes(1); + $new->{'scratch'} = ''; + $new->{'to_index'} = []; + $new->{'output'} = []; + $new->{'saved'} = []; + $new->{'ids'} = { '_podtop_' => 1 }; # used in + $new->{'in_li'} = []; + + $new->{'__region_targets'} = []; + $new->{'__literal_targets'} = {}; + $new->accept_targets_as_html( 'html', 'HTML' ); + + return $new; +} + +sub html_header_tags { + my $self = shift; + return $self->{html_header_tags} = shift if @_; + return $self->{html_header_tags} + ||= ''; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + +sub __in_literal_xhtml_region { + return unless @{ $_[0]{__region_targets} }; + my $target = $_[0]{__region_targets}[-1]; + return $_[0]{__literal_targets}{ $target }; +} + +sub accept_targets_as_html { + my ($self, @targets) = @_; + $self->accept_targets(@targets); + $self->{__literal_targets}{$_} = 1 for @targets; +} + +sub handle_text { + # escape special characters in HTML (<, >, &, etc) + my $text = $_[0]->__in_literal_xhtml_region + ? $_[1] + : $_[0]->encode_entities( $_[1] ); + + if ($_[0]{'in_code'} && @{$_[0]{'in_code'}}) { + # Intentionally use the raw text in $_[1], even if we're not in a + # literal xhtml region, since handle_code calls encode_entities. + $_[0]->handle_code( $_[1], $_[0]{'in_code'}[-1] ); + } else { + if ($_[0]->{in_for}) { + my $newlines = $_[0]->__in_literal_xhtml_region ? "\n\n" : ''; + if ($_[0]->{started_for}) { + if ($text =~ /\S/) { + delete $_[0]->{started_for}; + $_[0]{'scratch'} .= $text . $newlines; + } + # Otherwise, append nothing until we have something to append. + } else { + # The parser sometimes preserves newlines and sometimes doesn't! + $text =~ s/\n\z//; + $_[0]{'scratch'} .= $text . $newlines; + } + } else { + # Just plain text. + $_[0]{'scratch'} .= $text; + } + } + + $_[0]{htext} .= $text if $_[0]{'in_head'}; +} + +sub start_code { + $_[0]{'scratch'} .= ''; +} + +sub end_code { + $_[0]{'scratch'} .= ''; +} + +sub handle_code { + $_[0]{'scratch'} .= $_[0]->encode_entities( $_[1] ); +} + +sub start_Para { + $_[0]{'scratch'} .= '

'; +} + +sub start_Verbatim { + $_[0]{'scratch'} = '

';
+    push(@{$_[0]{'in_code'}}, 'Verbatim');
+    $_[0]->start_code($_[0]{'in_code'}[-1]);
+}
+
+sub start_head1 {  $_[0]{'in_head'} = 1; $_[0]{htext} = ''; }
+sub start_head2 {  $_[0]{'in_head'} = 2; $_[0]{htext} = ''; }
+sub start_head3 {  $_[0]{'in_head'} = 3; $_[0]{htext} = ''; }
+sub start_head4 {  $_[0]{'in_head'} = 4; $_[0]{htext} = ''; }
+
+sub start_item_number {
+    $_[0]{'scratch'} = "\n" if ($_[0]{'in_li'}->[-1] && pop @{$_[0]{'in_li'}});
+    $_[0]{'scratch'} .= '
  • '; + push @{$_[0]{'in_li'}}, 1; +} + +sub start_item_bullet { + $_[0]{'scratch'} = "

  • \n" if ($_[0]{'in_li'}->[-1] && pop @{$_[0]{'in_li'}}); + $_[0]{'scratch'} .= '
  • '; + push @{$_[0]{'in_li'}}, 1; +} + +sub start_item_text { + # see end_item_text +} + +sub start_over_bullet { $_[0]{'scratch'} = '

      '; push @{$_[0]{'in_li'}}, 0; $_[0]->emit } +sub start_over_block { $_[0]{'scratch'} = '
        '; $_[0]->emit } +sub start_over_number { $_[0]{'scratch'} = '
          '; push @{$_[0]{'in_li'}}, 0; $_[0]->emit } +sub start_over_text { + $_[0]{'scratch'} = '
          '; + $_[0]{'dl_level'}++; + $_[0]{'in_dd'} ||= []; + $_[0]->emit +} + +sub end_over_block { $_[0]{'scratch'} .= '
      '; $_[0]->emit } + +sub end_over_number { + $_[0]{'scratch'} = "\n" if ( pop @{$_[0]{'in_li'}} ); + $_[0]{'scratch'} .= ''; + pop @{$_[0]{'in_li'}}; + $_[0]->emit; +} + +sub end_over_bullet { + $_[0]{'scratch'} = "\n" if ( pop @{$_[0]{'in_li'}} ); + $_[0]{'scratch'} .= '
    '; + pop @{$_[0]{'in_li'}}; + $_[0]->emit; +} + +sub end_over_text { + if ($_[0]{'in_dd'}[ $_[0]{'dl_level'} ]) { + $_[0]{'scratch'} = "\n"; + $_[0]{'in_dd'}[ $_[0]{'dl_level'} ] = 0; + } + $_[0]{'scratch'} .= ''; + $_[0]{'dl_level'}--; + $_[0]->emit; +} + +# . . . . . Now the actual formatters: + +sub end_Para { $_[0]{'scratch'} .= '

    '; $_[0]->emit } +sub end_Verbatim { + $_[0]->end_code(pop(@{$_[0]->{'in_code'}})); + $_[0]{'scratch'} .= '
  • '; + $_[0]->emit; +} + +sub _end_head { + my $h = delete $_[0]{in_head}; + + my $add = $_[0]->html_h_level; + $add = 1 unless defined $add; + $h += $add - 1; + + my $id = $_[0]->idify($_[0]{htext}); + my $text = $_[0]{scratch}; + $_[0]{'scratch'} = $_[0]->backlink && ($h - $add == 0) + # backlinks enabled && =head1 + ? qq{$text} + : qq{$text}; + $_[0]->emit; + push @{ $_[0]{'to_index'} }, [$h, $id, delete $_[0]{'htext'}]; +} + +sub end_head1 { shift->_end_head(@_); } +sub end_head2 { shift->_end_head(@_); } +sub end_head3 { shift->_end_head(@_); } +sub end_head4 { shift->_end_head(@_); } + +sub end_item_bullet { $_[0]{'scratch'} .= '

    '; $_[0]->emit } +sub end_item_number { $_[0]{'scratch'} .= '

    '; $_[0]->emit } + +sub end_item_text { + # idify and anchor =item content if wanted + my $dt_id = $_[0]{'anchor_items'} + ? ' id="'. $_[0]->idify($_[0]{'scratch'}) .'"' + : ''; + + # reset scratch + my $text = $_[0]{scratch}; + $_[0]{'scratch'} = ''; + + if ($_[0]{'in_dd'}[ $_[0]{'dl_level'} ]) { + $_[0]{'scratch'} = "\n"; + $_[0]{'in_dd'}[ $_[0]{'dl_level'} ] = 0; + } + + $_[0]{'scratch'} .= qq{$text\n
    }; + $_[0]{'in_dd'}[ $_[0]{'dl_level'} ] = 1; + $_[0]->emit; +} + +# This handles =begin and =for blocks of all kinds. +sub start_for { + my ($self, $flags) = @_; + + push @{ $self->{__region_targets} }, $flags->{target_matching}; + $self->{started_for} = 1; + $self->{in_for} = 1; + + unless ($self->__in_literal_xhtml_region) { + $self->{scratch} .= '{scratch} .= qq( class="$flags->{target}") if $flags->{target}; + $self->{scratch} .= ">\n\n"; + } +} + +sub end_for { + my ($self) = @_; + delete $self->{started_for}; + delete $self->{in_for}; + + if ($self->__in_literal_xhtml_region) { + # Remove trailine newlines. + $self->{'scratch'} =~ s/\s+\z//s; + } else { + $self->{'scratch'} .= '

    '; + } + + pop @{ $self->{__region_targets} }; + $self->emit; +} + +sub start_Document { + my ($self) = @_; + if (defined $self->html_header) { + $self->{'scratch'} .= $self->html_header; + $self->emit unless $self->html_header eq ""; + } else { + my ($doctype, $title, $metatags, $bodyid); + $doctype = $self->html_doctype || ''; + $title = $self->force_title || $self->title || $self->default_title || ''; + $metatags = $self->html_header_tags || ''; + if (my $css = $self->html_css) { + if ($css !~ /encode_entities($css) . '" type="text/css" />'; + } else { + $metatags .= $css; + } + } + if ($self->html_javascript) { + $metatags .= qq{\n'; + } + $bodyid = $self->backlink ? ' id="_podtop_"' : ''; + $self->{'scratch'} .= <<"HTML"; +$doctype + + +$title +$metatags + + +HTML + $self->emit; + } +} + +sub end_Document { + my ($self) = @_; + my $to_index = $self->{'to_index'}; + if ($self->index && @{ $to_index } ) { + my @out; + my $level = 0; + my $indent = -1; + my $space = ''; + my $id = ' id="index"'; + + for my $h (@{ $to_index }, [0]) { + my $target_level = $h->[0]; + # Get to target_level by opening or closing ULs + if ($level == $target_level) { + $out[-1] .= ''; + } elsif ($level > $target_level) { + $out[-1] .= '' if $out[-1] =~ /^\s+
  • /; + while ($level > $target_level) { + --$level; + push @out, (' ' x --$indent) . '
  • ' if @out && $out[-1] =~ m{^\s+<\/ul}; + push @out, (' ' x --$indent) . ''; + } + push @out, (' ' x --$indent) . '' if $level; + } else { + while ($level < $target_level) { + ++$level; + push @out, (' ' x ++$indent) . '
  • ' if @out && $out[-1]=~ /^\s*
      "; + $id = ''; + } + ++$indent; + } + + next unless $level; + $space = ' ' x $indent; + push @out, sprintf '%s
    • %s', + $space, $h->[1], $h->[2]; + } + # Splice the index in between the HTML headers and the first element. + my $offset = defined $self->html_header ? $self->html_header eq '' ? 0 : 1 : 1; + splice @{ $self->{'output'} }, $offset, 0, join "\n", @out; + } + + if (defined $self->html_footer) { + $self->{'scratch'} .= $self->html_footer; + $self->emit unless $self->html_footer eq ""; + } else { + $self->{'scratch'} .= "\n"; + $self->emit; + } + + if ($self->index) { + print {$self->{'output_fh'}} join ("\n\n", @{ $self->{'output'} }), "\n\n"; + @{$self->{'output'}} = (); + } + +} + +# Handling code tags +sub start_B { $_[0]{'scratch'} .= '' } +sub end_B { $_[0]{'scratch'} .= '' } + +sub start_C { push(@{$_[0]{'in_code'}}, 'C'); $_[0]->start_code($_[0]{'in_code'}[-1]); } +sub end_C { $_[0]->end_code(pop(@{$_[0]{'in_code'}})); } + +sub start_F { $_[0]{'scratch'} .= '' } +sub end_F { $_[0]{'scratch'} .= '' } + +sub start_I { $_[0]{'scratch'} .= '' } +sub end_I { $_[0]{'scratch'} .= '' } + +sub start_L { + my ($self, $flags) = @_; + my ($type, $to, $section) = @{$flags}{'type', 'to', 'section'}; + my $url = $self->encode_entities( + $type eq 'url' ? $to + : $type eq 'pod' ? $self->resolve_pod_page_link($to, $section) + : $type eq 'man' ? $self->resolve_man_page_link($to, $section) + : undef + ); + + # If it's an unknown type, use an attribute-less like HTML.pm. + $self->{'scratch'} .= '' : '>'); +} + +sub end_L { $_[0]{'scratch'} .= '' } + +sub start_S { $_[0]{'scratch'} .= '' } +sub end_S { $_[0]{'scratch'} .= '' } + +sub emit { + my($self) = @_; + if ($self->index) { + push @{ $self->{'output'} }, $self->{'scratch'}; + } else { + print {$self->{'output_fh'}} $self->{'scratch'}, "\n\n"; + } + $self->{'scratch'} = ''; + return; +} + + +sub resolve_pod_page_link { + my ($self, $to, $section) = @_; + return undef unless defined $to || defined $section; + if (defined $section) { + $section = '#' . $self->idify($self->encode_entities($section), 1); + return $section unless defined $to; + } else { + $section = '' + } + + return ($self->perldoc_url_prefix || '') + . $self->encode_entities($to) . $section + . ($self->perldoc_url_postfix || ''); +} + + +sub resolve_man_page_link { + my ($self, $to, $section) = @_; + return undef unless defined $to; + my ($page, $part) = $to =~ /^([^(]+)(?:[(](\d+)[)])?$/; + return undef unless $page; + return ($self->man_url_prefix || '') + . ($part || 1) . "/" . $self->encode_entities($page) + . ($self->man_url_postfix || ''); + +} + + +sub idify { + my ($self, $t, $not_unique) = @_; + for ($t) { + s/<[^>]+>//g; # Strip HTML. + s/&[^;]+;//g; # Strip entities. + s/^\s+//; s/\s+$//; # Strip white space. + s/^([^a-zA-Z]+)$/pod$1/; # Prepend "pod" if no valid chars. + s/^[^a-zA-Z]+//; # First char must be a letter. + s/[^-a-zA-Z0-9_:.]+/-/g; # All other chars must be valid. + s/[-:.]+$//; # Strip trailing punctuation. + } + return $t if $not_unique; + my $i = ''; + $i++ while $self->{ids}{"$t$i"}++; + return "$t$i"; +} + + +sub batch_mode_page_object_init { + my ($self, $batchconvobj, $module, $infile, $outfile, $depth) = @_; + $self->batch_mode(1); + $self->batch_mode_current_level($depth); + return $self; +} + +sub html_header_after_title { +} + + +1; + +__END__ + + +require 5; +package Pod::Simple::HTMLBatch; +use strict; +use vars qw( $VERSION $HTML_RENDER_CLASS $HTML_EXTENSION + $CSS $JAVASCRIPT $SLEEPY $SEARCH_CLASS @ISA +); +$VERSION = '3.35'; +@ISA = (); # Yup, we're NOT a subclass of Pod::Simple::HTML! + +# TODO: nocontents stylesheets. Strike some of the color variations? + +use Pod::Simple::HTML (); +BEGIN {*esc = \&Pod::Simple::HTML::esc } +use File::Spec (); + +use Pod::Simple::Search; +$SEARCH_CLASS ||= 'Pod::Simple::Search'; + +BEGIN { + if(defined &DEBUG) { } # no-op + elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG } + else { *DEBUG = sub () {0}; } +} + +$SLEEPY = 1 if !defined $SLEEPY and $^O =~ /mswin|mac/i; +# flag to occasionally sleep for $SLEEPY - 1 seconds. + +$HTML_RENDER_CLASS ||= "Pod::Simple::HTML"; + +# +# Methods beginning with "_" are particularly internal and possibly ugly. +# + +Pod::Simple::_accessorize( __PACKAGE__, + 'verbose', # how verbose to be during batch conversion + 'html_render_class', # what class to use to render + 'search_class', # what to use to search for POD documents + 'contents_file', # If set, should be the name of a file (in current directory) + # to write the list of all modules to + 'index', # will set $htmlpage->index(...) to this (true or false) + 'progress', # progress object + 'contents_page_start', 'contents_page_end', + + 'css_flurry', '_css_wad', 'javascript_flurry', '_javascript_wad', + 'no_contents_links', # set to true to suppress automatic adding of << links. + '_contents', +); + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Just so we can run from the command line more easily +sub go { + @ARGV == 2 or die sprintf( + "Usage: perl -M%s -e %s:go indirs outdir\n (or use \"\@INC\" for indirs)\n", + __PACKAGE__, __PACKAGE__, + ); + + if(defined($ARGV[1]) and length($ARGV[1])) { + my $d = $ARGV[1]; + -e $d or die "I see no output directory named \"$d\"\nAborting"; + -d $d or die "But \"$d\" isn't a directory!\nAborting"; + -w $d or die "Directory \"$d\" isn't writeable!\nAborting"; + } + + __PACKAGE__->batch_convert(@ARGV); +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +sub new { + my $new = bless {}, ref($_[0]) || $_[0]; + $new->html_render_class($HTML_RENDER_CLASS); + $new->search_class($SEARCH_CLASS); + $new->verbose(1 + DEBUG); + $new->_contents([]); + + $new->index(1); + + $new-> _css_wad([]); $new->css_flurry(1); + $new->_javascript_wad([]); $new->javascript_flurry(1); + + $new->contents_file( + 'index' . ($HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION) + ); + + $new->contents_page_start( join "\n", grep $_, + $Pod::Simple::HTML::Doctype_decl, + "", + "Perl Documentation", + $Pod::Simple::HTML::Content_decl, + "", + "\n\n

      Perl Documentation

      \n" + ); # override if you need a different title + + + $new->contents_page_end( sprintf( + "\n\n

      Generated by %s v%s under Perl v%s\n
      At %s GMT, which is %s local time.

      \n\n\n", + esc( + ref($new), + eval {$new->VERSION} || $VERSION, + $], scalar(gmtime), scalar(localtime), + ))); + + return $new; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub muse { + my $self = shift; + if($self->verbose) { + print 'T+', int(time() - $self->{'_batch_start_time'}), "s: ", @_, "\n"; + } + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub batch_convert { + my($self, $dirs, $outdir) = @_; + $self ||= __PACKAGE__; # tolerate being called as an optionless function + $self = $self->new unless ref $self; # tolerate being used as a class method + + if(!defined($dirs) or $dirs eq '' or $dirs eq '@INC' ) { + $dirs = ''; + } elsif(ref $dirs) { + # OK, it's an explicit set of dirs to scan, specified as an arrayref. + } else { + # OK, it's an explicit set of dirs to scan, specified as a + # string like "/thing:/also:/whatever/perl" (":"-delim, as usual) + # or, under MSWin, like "c:/thing;d:/also;c:/whatever/perl" (";"-delim!) + require Config; + my $ps = quotemeta( $Config::Config{'path_sep'} || ":" ); + $dirs = [ grep length($_), split qr/$ps/, $dirs ]; + } + + $outdir = $self->filespecsys->curdir + unless defined $outdir and length $outdir; + + $self->_batch_convert_main($dirs, $outdir); +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _batch_convert_main { + my($self, $dirs, $outdir) = @_; + # $dirs is either false, or an arrayref. + # $outdir is a pathspec. + + $self->{'_batch_start_time'} ||= time(); + + $self->muse( "= ", scalar(localtime) ); + $self->muse( "Starting batch conversion to \"$outdir\"" ); + + my $progress = $self->progress; + if(!$progress and $self->verbose > 0 and $self->verbose() <= 5) { + require Pod::Simple::Progress; + $progress = Pod::Simple::Progress->new( + ($self->verbose < 2) ? () # Default omission-delay + : ($self->verbose == 2) ? 1 # Reduce the omission-delay + : 0 # Eliminate the omission-delay + ); + $self->progress($progress); + } + + if($dirs) { + $self->muse(scalar(@$dirs), " dirs to scan: @$dirs"); + } else { + $self->muse("Scanning \@INC. This could take a minute or two."); + } + my $mod2path = $self->find_all_pods($dirs ? $dirs : ()); + $self->muse("Done scanning."); + + my $total = keys %$mod2path; + unless($total) { + $self->muse("No pod found. Aborting batch conversion.\n"); + return $self; + } + + $progress and $progress->goal($total); + $self->muse("Now converting pod files to HTML.", + ($total > 25) ? " This will take a while more." : () + ); + + $self->_spray_css( $outdir ); + $self->_spray_javascript( $outdir ); + + $self->_do_all_batch_conversions($mod2path, $outdir); + + $progress and $progress->done(sprintf ( + "Done converting %d files.", $self->{"__batch_conv_page_count"} + )); + return $self->_batch_convert_finish($outdir); + return $self; +} + + +sub _do_all_batch_conversions { + my($self, $mod2path, $outdir) = @_; + $self->{"__batch_conv_page_count"} = 0; + + foreach my $module (sort {lc($a) cmp lc($b)} keys %$mod2path) { + $self->_do_one_batch_conversion($module, $mod2path, $outdir); + sleep($SLEEPY - 1) if $SLEEPY; + } + + return; +} + +sub _batch_convert_finish { + my($self, $outdir) = @_; + $self->write_contents_file($outdir); + $self->muse("Done with batch conversion. $$self{'__batch_conv_page_count'} files done."); + $self->muse( "= ", scalar(localtime) ); + $self->progress and $self->progress->done("All done!"); + return; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _do_one_batch_conversion { + my($self, $module, $mod2path, $outdir, $outfile) = @_; + + my $retval; + my $total = scalar keys %$mod2path; + my $infile = $mod2path->{$module}; + my @namelets = grep m/\S/, split "::", $module; + # this can stick around in the contents LoL + my $depth = scalar @namelets; + die "Contentless thingie?! $module $infile" unless @namelets; #sanity + + $outfile ||= do { + my @n = @namelets; + $n[-1] .= $HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION; + $self->filespecsys->catfile( $outdir, @n ); + }; + + my $progress = $self->progress; + + my $page = $self->html_render_class->new; + if(DEBUG > 5) { + $self->muse($self->{"__batch_conv_page_count"} + 1, "/$total: ", + ref($page), " render ($depth) $module => $outfile"); + } elsif(DEBUG > 2) { + $self->muse($self->{"__batch_conv_page_count"} + 1, "/$total: $module => $outfile") + } + + # Give each class a chance to init the converter: + $page->batch_mode_page_object_init($self, $module, $infile, $outfile, $depth) + if $page->can('batch_mode_page_object_init'); + # Init for the index (TOC), too. + $self->batch_mode_page_object_init($page, $module, $infile, $outfile, $depth) + if $self->can('batch_mode_page_object_init'); + + # Now get busy... + $self->makepath($outdir => \@namelets); + + $progress and $progress->reach($self->{"__batch_conv_page_count"}, "Rendering $module"); + + if( $retval = $page->parse_from_file($infile, $outfile) ) { + ++ $self->{"__batch_conv_page_count"} ; + $self->note_for_contents_file( \@namelets, $infile, $outfile ); + } else { + $self->muse("Odd, parse_from_file(\"$infile\", \"$outfile\") returned false."); + } + + $page->batch_mode_page_object_kill($self, $module, $infile, $outfile, $depth) + if $page->can('batch_mode_page_object_kill'); + # The following isn't a typo. Note that it switches $self and $page. + $self->batch_mode_page_object_kill($page, $module, $infile, $outfile, $depth) + if $self->can('batch_mode_page_object_kill'); + + DEBUG > 4 and printf STDERR "%s %sb < $infile %s %sb\n", + $outfile, -s $outfile, $infile, -s $infile + ; + + undef($page); + return $retval; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub filespecsys { $_[0]{'_filespecsys'} || 'File::Spec' } + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub note_for_contents_file { + my($self, $namelets, $infile, $outfile) = @_; + + # I think the infile and outfile parts are never used. -- SMB + # But it's handy to have them around for debugging. + + if( $self->contents_file ) { + my $c = $self->_contents(); + push @$c, + [ join("::", @$namelets), $infile, $outfile, $namelets ] + # 0 1 2 3 + ; + DEBUG > 3 and print STDERR "Noting @$c[-1]\n"; + } + return; +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub write_contents_file { + my($self, $outdir) = @_; + my $outfile = $self->_contents_filespec($outdir) || return; + + $self->muse("Preparing list of modules for ToC"); + + my($toplevel, # maps toplevelbit => [all submodules] + $toplevel_form_freq, # ends up being 'foo' => 'Foo' + ) = $self->_prep_contents_breakdown; + + my $Contents = eval { $self->_wopen($outfile) }; + if( $Contents ) { + $self->muse( "Writing contents file $outfile" ); + } else { + warn "Couldn't write-open contents file $outfile: $!\nAbort writing to $outfile at all"; + return; + } + + $self->_write_contents_start( $Contents, $outfile, ); + $self->_write_contents_middle( $Contents, $outfile, $toplevel, $toplevel_form_freq ); + $self->_write_contents_end( $Contents, $outfile, ); + return $outfile; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _write_contents_start { + my($self, $Contents, $outfile) = @_; + my $starter = $self->contents_page_start || ''; + + { + my $css_wad = $self->_css_wad_to_markup(1); + if( $css_wad ) { + $starter =~ s{()}{\n$css_wad\n$1}i; # otherwise nevermind + } + + my $javascript_wad = $self->_javascript_wad_to_markup(1); + if( $javascript_wad ) { + $starter =~ s{()}{\n$javascript_wad\n$1}i; # otherwise nevermind + } + } + + unless(print $Contents $starter, "
      \n" ) { + warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all"; + close($Contents); + return 0; + } + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _write_contents_middle { + my($self, $Contents, $outfile, $toplevel2submodules, $toplevel_form_freq) = @_; + + foreach my $t (sort keys %$toplevel2submodules) { + my @downlines = sort {$a->[-1] cmp $b->[-1]} + @{ $toplevel2submodules->{$t} }; + + printf $Contents qq[
      %s
      \n
      \n], + esc( $t, $toplevel_form_freq->{$t} ) + ; + + my($path, $name); + foreach my $e (@downlines) { + $name = $e->[0]; + $path = join( "/", '.', esc( @{$e->[3]} ) ) + . ($HTML_EXTENSION || $Pod::Simple::HTML::HTML_EXTENSION); + print $Contents qq{ }, esc($name), "  \n"; + } + print $Contents "
      \n\n"; + } + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _write_contents_end { + my($self, $Contents, $outfile) = @_; + unless( + print $Contents "
      \n", + $self->contents_page_end || '', + ) { + warn "Couldn't write to $outfile: $!"; + } + close($Contents) or warn "Couldn't close $outfile: $!"; + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _prep_contents_breakdown { + my($self) = @_; + my $contents = $self->_contents; + my %toplevel; # maps lctoplevelbit => [all submodules] + my %toplevel_form_freq; # ends up being 'foo' => 'Foo' + # (mapping anycase forms to most freq form) + + foreach my $entry (@$contents) { + my $toplevel = + $entry->[0] =~ m/^perl\w*$/ ? 'perl_core_docs' + # group all the perlwhatever docs together + : $entry->[3][0] # normal case + ; + ++$toplevel_form_freq{ lc $toplevel }{ $toplevel }; + push @{ $toplevel{ lc $toplevel } }, $entry; + push @$entry, lc($entry->[0]); # add a sort-order key to the end + } + + foreach my $toplevel (sort keys %toplevel) { + my $fgroup = $toplevel_form_freq{$toplevel}; + $toplevel_form_freq{$toplevel} = + ( + sort { $fgroup->{$b} <=> $fgroup->{$a} or $a cmp $b } + keys %$fgroup + # This hash is extremely unlikely to have more than 4 members, so this + # sort isn't so very wasteful + )[0]; + } + + return(\%toplevel, \%toplevel_form_freq) if wantarray; + return \%toplevel; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _contents_filespec { + my($self, $outdir) = @_; + my $outfile = $self->contents_file; + return unless $outfile; + return $self->filespecsys->catfile( $outdir, $outfile ); +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub makepath { + my($self, $outdir, $namelets) = @_; + return unless @$namelets > 1; + for my $i (0 .. ($#$namelets - 1)) { + my $dir = $self->filespecsys->catdir( $outdir, @$namelets[0 .. $i] ); + if(-e $dir) { + die "$dir exists but not as a directory!?" unless -d $dir; + next; + } + DEBUG > 3 and print STDERR " Making $dir\n"; + mkdir $dir, 0777 + or die "Can't mkdir $dir: $!\nAborting" + ; + } + return; +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub batch_mode_page_object_init { + my $self = shift; + my($page, $module, $infile, $outfile, $depth) = @_; + + # TODO: any further options to percolate onto this new object here? + + $page->default_title($module); + $page->index( $self->index ); + + $page->html_css( $self-> _css_wad_to_markup($depth) ); + $page->html_javascript( $self->_javascript_wad_to_markup($depth) ); + + $self->add_header_backlink($page, $module, $infile, $outfile, $depth); + $self->add_footer_backlink($page, $module, $infile, $outfile, $depth); + + + return $self; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub add_header_backlink { + my $self = shift; + return if $self->no_contents_links; + my($page, $module, $infile, $outfile, $depth) = @_; + $page->html_header_after_title( join '', + $page->html_header_after_title || '', + + qq[

      <<

      \n], + ) + if $self->contents_file + ; + return; +} + +sub add_footer_backlink { + my $self = shift; + return if $self->no_contents_links; + my($page, $module, $infile, $outfile, $depth) = @_; + $page->html_footer( join '', + qq[

      <<

      \n], + + $page->html_footer || '', + ) + if $self->contents_file + ; + return; +} + +sub url_up_to_contents { + my($self, $depth) = @_; + --$depth; + return join '/', ('..') x $depth, esc($self->contents_file); +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub find_all_pods { + my($self, $dirs) = @_; + # You can override find_all_pods in a subclass if you want to + # do extra filtering or whatnot. But for the moment, we just + # pass to modnames2paths: + return $self->modnames2paths($dirs); +} + +#_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_- + +sub modnames2paths { # return a hashref mapping modulenames => paths + my($self, $dirs) = @_; + + my $m2p; + { + my $search = $self->search_class->new; + DEBUG and print STDERR "Searching via $search\n"; + $search->verbose(1) if DEBUG > 10; + $search->progress( $self->progress->copy->goal(0) ) if $self->progress; + $search->shadows(0); # don't bother noting shadowed files + $search->inc( $dirs ? 0 : 1 ); + $search->survey( $dirs ? @$dirs : () ); + $m2p = $search->name2path; + die "What, no name2path?!" unless $m2p; + } + + $self->muse("That's odd... no modules found!") unless keys %$m2p; + if( DEBUG > 4 ) { + print STDERR "Modules found (name => path):\n"; + foreach my $m (sort {lc($a) cmp lc($b)} keys %$m2p) { + print STDERR " $m $$m2p{$m}\n"; + } + print STDERR "(total ", scalar(keys %$m2p), ")\n\n"; + } elsif( DEBUG ) { + print STDERR "Found ", scalar(keys %$m2p), " modules.\n"; + } + $self->muse( "Found ", scalar(keys %$m2p), " modules." ); + + # return the Foo::Bar => /whatever/Foo/Bar.pod|pm hashref + return $m2p; +} + +#=========================================================================== + +sub _wopen { + # this is abstracted out so that the daemon class can override it + my($self, $outpath) = @_; + require Symbol; + my $out_fh = Symbol::gensym(); + DEBUG > 5 and print STDERR "Write-opening to $outpath\n"; + return $out_fh if open($out_fh, "> $outpath"); + require Carp; + Carp::croak("Can't write-open $outpath: $!"); +} + +#========================================================================== + +sub add_css { + my($self, $url, $is_default, $name, $content_type, $media, $_code) = @_; + return unless $url; + unless($name) { + # cook up a reasonable name based on the URL + $name = $url; + if( $name !~ m/\?/ and $name =~ m{([^/]+)$}s ) { + $name = $1; + $name =~ s/\.css//i; + } + } + $media ||= 'all'; + $content_type ||= 'text/css'; + + my $bunch = [$url, $name, $content_type, $media, $_code]; + if($is_default) { unshift @{ $self->_css_wad }, $bunch } + else { push @{ $self->_css_wad }, $bunch } + return; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _spray_css { + my($self, $outdir) = @_; + + return unless $self->css_flurry(); + $self->_gen_css_wad(); + + my $lol = $self->_css_wad; + foreach my $chunk (@$lol) { + my $url = $chunk->[0]; + my $outfile; + if( ref($chunk->[-1]) and $url =~ m{^(_[-a-z0-9_]+\.css$)} ) { + $outfile = $self->filespecsys->catfile( $outdir, "$1" ); + DEBUG > 5 and print STDERR "Noting $$chunk[0] as a file I'll create.\n"; + } else { + DEBUG > 5 and print STDERR "OK, noting $$chunk[0] as an external CSS.\n"; + # Requires no further attention. + next; + } + + #$self->muse( "Writing autogenerated CSS file $outfile" ); + my $Cssout = $self->_wopen($outfile); + print $Cssout ${$chunk->[-1]} + or warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all"; + close($Cssout); + DEBUG > 5 and print STDERR "Wrote $outfile\n"; + } + + return; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub _css_wad_to_markup { + my($self, $depth) = @_; + + my @css = @{ $self->_css_wad || return '' }; + return '' unless @css; + + my $rel = 'stylesheet'; + my $out = ''; + + --$depth; + my $uplink = $depth ? ('../' x $depth) : ''; + + foreach my $chunk (@css) { + next unless $chunk and @$chunk; + + my( $url1, $url2, $title, $type, $media) = ( + $self->_maybe_uplink( $chunk->[0], $uplink ), + esc(grep !ref($_), @$chunk) + ); + + $out .= qq{\n}; + + $rel = 'alternate stylesheet'; # alternates = all non-first iterations + } + return $out; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub _maybe_uplink { + # if the given URL looks relative, return the given uplink string -- + # otherwise return emptystring + my($self, $url, $uplink) = @_; + ($url =~ m{^\./} or $url !~ m{[/\:]} ) + ? $uplink + : '' + # qualify it, if/as needed +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +sub _gen_css_wad { + my $self = $_[0]; + my $css_template = $self->_css_template; + foreach my $variation ( + + # Commented out for sake of concision: + # + # 011n=black_with_red_on_white + # 001n=black_with_yellow_on_white + # 101n=black_with_green_on_white + # 110=white_with_yellow_on_black + # 010=white_with_green_on_black + # 011=white_with_blue_on_black + # 100=white_with_red_on_black + '110n=blkbluw', # black_with_blue_on_white + '010n=blkmagw', # black_with_magenta_on_white + '100n=blkcynw', # black_with_cyan_on_white + '101=whtprpk', # white_with_purple_on_black + '001=whtnavk', # white_with_navy_blue_on_black + '010a=grygrnk', # grey_with_green_on_black + '010b=whtgrng', # white_with_green_on_grey + '101an=blkgrng', # black_with_green_on_grey + '101bn=grygrnw', # grey_with_green_on_white + ) { + + my $outname = $variation; + my($flipmode, @swap) = ( ($4 || ''), $1,$2,$3) + if $outname =~ s/^([012])([012])([[012])([a-z]*)=?//s; + @swap = () if '010' eq join '', @swap; # 010 is a swop-no-op! + + my $this_css = + "/* This file is autogenerated. Do not edit. $variation */\n\n" + . $css_template; + + # Only look at three-digitty colors, for now at least. + if( $flipmode =~ m/n/ ) { + $this_css =~ s/(#[0-9a-fA-F]{3})\b/_color_negate($1)/eg; + $this_css =~ s/\bthin\b/medium/g; + } + $this_css =~ s<#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])\b> + < join '', '#', ($1,$2,$3)[@swap] >eg if @swap; + + if( $flipmode =~ m/a/) + { $this_css =~ s/#fff\b/#999/gi } # black -> dark grey + elsif($flipmode =~ m/b/) + { $this_css =~ s/#000\b/#666/gi } # white -> light grey + + my $name = $outname; + $name =~ tr/-_/ /; + $self->add_css( "_$outname.css", 0, $name, 0, 0, \$this_css); + } + + # Now a few indexless variations: + foreach my $variation ( + 'blkbluw', # black_with_blue_on_white + 'whtpurk', # white_with_purple_on_black + 'whtgrng', # white_with_green_on_grey + 'grygrnw', # grey_with_green_on_white + ) { + my $outname = $variation; + my $this_css = join "\n", + "/* This file is autogenerated. Do not edit. $outname */\n", + "\@import url(\"./_$variation.css\");", + ".indexgroup { display: none; }", + "\n", + ; + my $name = $outname; + $name =~ tr/-_/ /; + $self->add_css( "_$outname.css", 0, $name, 0, 0, \$this_css); + } + + return; +} + +sub _color_negate { + my $x = lc $_[0]; + $x =~ tr[0123456789abcdef] + [fedcba9876543210]; + return $x; +} + +#=========================================================================== + +sub add_javascript { + my($self, $url, $content_type, $_code) = @_; + return unless $url; + push @{ $self->_javascript_wad }, [ + $url, $content_type || 'text/javascript', $_code + ]; + return; +} + +sub _spray_javascript { + my($self, $outdir) = @_; + return unless $self->javascript_flurry(); + $self->_gen_javascript_wad(); + + my $lol = $self->_javascript_wad; + foreach my $script (@$lol) { + my $url = $script->[0]; + my $outfile; + + if( ref($script->[-1]) and $url =~ m{^(_[-a-z0-9_]+\.js$)} ) { + $outfile = $self->filespecsys->catfile( $outdir, "$1" ); + DEBUG > 5 and print STDERR "Noting $$script[0] as a file I'll create.\n"; + } else { + DEBUG > 5 and print STDERR "OK, noting $$script[0] as an external JavaScript.\n"; + next; + } + + #$self->muse( "Writing JavaScript file $outfile" ); + my $Jsout = $self->_wopen($outfile); + + print $Jsout ${$script->[-1]} + or warn "Couldn't print to $outfile: $!\nAbort writing to $outfile at all"; + close($Jsout); + DEBUG > 5 and print STDERR "Wrote $outfile\n"; + } + + return; +} + +sub _gen_javascript_wad { + my $self = $_[0]; + my $js_code = $self->_javascript || return; + $self->add_javascript( "_podly.js", 0, \$js_code); + return; +} + +sub _javascript_wad_to_markup { + my($self, $depth) = @_; + + my @scripts = @{ $self->_javascript_wad || return '' }; + return '' unless @scripts; + + my $out = ''; + + --$depth; + my $uplink = $depth ? ('../' x $depth) : ''; + + foreach my $s (@scripts) { + next unless $s and @$s; + + my( $url1, $url2, $type, $media) = ( + $self->_maybe_uplink( $s->[0], $uplink ), + esc(grep !ref($_), @$s) + ); + + $out .= qq{\n}; + } + return $out; +} + +#=========================================================================== + +sub _css_template { return $CSS } +sub _javascript { return $JAVASCRIPT } + +$CSS = <<'EOCSS'; +/* For accessibility reasons, never specify text sizes in px/pt/pc/in/cm/mm */ + +@media all { .hide { display: none; } } + +@media print { + .noprint, div.indexgroup, .backlinktop, .backlinkbottom { display: none } + + * { + border-color: black !important; + color: black !important; + background-color: transparent !important; + background-image: none !important; + } + + dl.superindex > dd { + word-spacing: .6em; + } +} + +@media aural, braille, embossed { + div.indexgroup { display: none; } /* Too noisy, don't you think? */ + dl.superindex > dt:before { content: "Group "; } + dl.superindex > dt:after { content: " contains:"; } + .backlinktop a:before { content: "Back to contents"; } + .backlinkbottom a:before { content: "Back to contents"; } +} + +@media aural { + dl.superindex > dt { pause-before: 600ms; } +} + +@media screen, tty, tv, projection { + .noscreen { display: none; } + + a:link { color: #7070ff; text-decoration: underline; } + a:visited { color: #e030ff; text-decoration: underline; } + a:active { color: #800000; text-decoration: underline; } + body.contentspage a { text-decoration: none; } + a.u { color: #fff !important; text-decoration: none; } + + body.pod { + margin: 0 5px; + color: #fff; + background-color: #000; + } + + body.pod h1, body.pod h2, body.pod h3, body.pod h4 { + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif; + font-weight: normal; + margin-top: 1.2em; + margin-bottom: .1em; + border-top: thin solid transparent; + /* margin-left: -5px; border-left: 2px #7070ff solid; padding-left: 3px; */ + } + + body.pod h1 { border-top-color: #0a0; } + body.pod h2 { border-top-color: #080; } + body.pod h3 { border-top-color: #040; } + body.pod h4 { border-top-color: #010; } + + p.backlinktop + h1 { border-top: none; margin-top: 0em; } + p.backlinktop + h2 { border-top: none; margin-top: 0em; } + p.backlinktop + h3 { border-top: none; margin-top: 0em; } + p.backlinktop + h4 { border-top: none; margin-top: 0em; } + + body.pod dt { + font-size: 105%; /* just a wee bit more than normal */ + } + + .indexgroup { font-size: 80%; } + + .backlinktop, .backlinkbottom { + margin-left: -5px; + margin-right: -5px; + background-color: #040; + border-top: thin solid #050; + border-bottom: thin solid #050; + } + + .backlinktop a, .backlinkbottom a { + text-decoration: none; + color: #080; + background-color: #000; + border: thin solid #0d0; + } + .backlinkbottom { margin-bottom: 0; padding-bottom: 0; } + .backlinktop { margin-top: 0; padding-top: 0; } + + body.contentspage { + color: #fff; + background-color: #000; + } + + body.contentspage h1 { + color: #0d0; + margin-left: 1em; + margin-right: 1em; + text-indent: -.9em; + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif; + font-weight: normal; + border-top: thin solid #fff; + border-bottom: thin solid #fff; + text-align: center; + } + + dl.superindex > dt { + font-family: Tahoma, Verdana, Helvetica, Arial, sans-serif; + font-weight: normal; + font-size: 90%; + margin-top: .45em; + /* margin-bottom: -.15em; */ + } + dl.superindex > dd { + word-spacing: .6em; /* most important rule here! */ + } + dl.superindex > a:link { + text-decoration: none; + color: #fff; + } + + .contentsfooty { + border-top: thin solid #999; + font-size: 90%; + } + +} + +/* The End */ + +EOCSS + +#========================================================================== + +$JAVASCRIPT = <<'EOJAVASCRIPT'; + +// From http://www.alistapart.com/articles/alternate/ + +function setActiveStyleSheet(title) { + var i, a, main; + for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) { + if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) { + a.disabled = true; + if(a.getAttribute("title") == title) a.disabled = false; + } + } +} + +function getActiveStyleSheet() { + var i, a; + for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) { + if( a.getAttribute("rel").indexOf("style") != -1 + && a.getAttribute("title") + && !a.disabled + ) return a.getAttribute("title"); + } + return null; +} + +function getPreferredStyleSheet() { + var i, a; + for(i=0 ; (a = document.getElementsByTagName("link")[i]) ; i++) { + if( a.getAttribute("rel").indexOf("style") != -1 + && a.getAttribute("rel").indexOf("alt") == -1 + && a.getAttribute("title") + ) return a.getAttribute("title"); + } + return null; +} + +function createCookie(name,value,days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + } + else expires = ""; + document.cookie = name+"="+value+expires+"; path=/"; +} + +function readCookie(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0 ; i < ca.length ; i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + } + return null; +} + +window.onload = function(e) { + var cookie = readCookie("style"); + var title = cookie ? cookie : getPreferredStyleSheet(); + setActiveStyleSheet(title); +} + +window.onunload = function(e) { + var title = getActiveStyleSheet(); + createCookie("style", title, 365); +} + +var cookie = readCookie("style"); +var title = cookie ? cookie : getPreferredStyleSheet(); +setActiveStyleSheet(title); + +// The End + +EOJAVASCRIPT + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +1; +__END__ + + + + +require 5; +package Pod::Simple::TextContent; +use strict; +use Carp (); +use Pod::Simple (); +use vars qw( @ISA $VERSION ); +$VERSION = '3.35'; +@ISA = ('Pod::Simple'); + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->nix_X_codes(1); + return $new; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub _handle_element_start { + print {$_[0]{'output_fh'}} "\n" unless $_[1] =~ m/^[A-Z]$/s; + return; +} + +sub _handle_text { + $_[1] =~ s/$Pod::Simple::shy//g; + $_[1] =~ s/$Pod::Simple::nbsp/ /g; + print {$_[0]{'output_fh'}} $_[1]; + return; +} + +sub _handle_element_end { + print {$_[0]{'output_fh'}} "\n" unless $_[1] =~ m/^[A-Z]$/s; + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + + +__END__ + + +require 5; +package Pod::Simple::LinkSection; + # Based somewhat dimly on Array::Autojoin +use vars qw($VERSION ); +$VERSION = '3.35'; + +use strict; +use Pod::Simple::BlackBox; +use vars qw($VERSION ); +$VERSION = '3.35'; + +use overload( # So it'll stringify nice + '""' => \&Pod::Simple::BlackBox::stringify_lol, + 'bool' => \&Pod::Simple::BlackBox::stringify_lol, + # '.=' => \&tack_on, # grudgingly support + + 'fallback' => 1, # turn on cleverness +); + +sub tack_on { + $_[0] = ['', {}, "$_[0]" ]; + return $_[0][2] .= $_[1]; +} + +sub as_string { + goto &Pod::Simple::BlackBox::stringify_lol; +} +sub stringify { + goto &Pod::Simple::BlackBox::stringify_lol; +} + +sub new { + my $class = shift; + $class = ref($class) || $class; + my $new; + if(@_ == 1) { + if (!ref($_[0] || '')) { # most common case: one bare string + return bless ['', {}, $_[0] ], $class; + } elsif( ref($_[0] || '') eq 'ARRAY') { + $new = [ @{ $_[0] } ]; + } else { + Carp::croak( "$class new() doesn't know to clone $new" ); + } + } else { # misc stuff + $new = [ '', {}, @_ ]; + } + + # By now it's a treelet: [ 'foo', {}, ... ] + foreach my $x (@$new) { + if(ref($x || '') eq 'ARRAY') { + $x = $class->new($x); # recurse + } elsif(ref($x || '') eq 'HASH') { + $x = { %$x }; + } + # otherwise leave it. + } + + return bless $new, $class; +} + +# Not much in this class is likely to be link-section specific -- +# but it just so happens that link-sections are about the only treelets +# that are exposed to the user. + +1; + +__END__ + +# TODO: let it be an option whether a given subclass even wants little treelets? + + +__END__ + + +require 5; +package Pod::Simple::Progress; +$VERSION = '3.35'; +use strict; + +# Objects of this class are used for noting progress of an +# operation every so often. Messages delivered more often than that +# are suppressed. +# +# There's actually nothing in here that's specific to Pod processing; +# but it's ad-hoc enough that I'm not willing to give it a name that +# implies that it's generally useful, like "IO::Progress" or something. +# +# -- sburke +# +#-------------------------------------------------------------------------- + +sub new { + my($class,$delay) = @_; + my $self = bless {'quiet_until' => 1}, ref($class) || $class; + $self->to(*STDOUT{IO}); + $self->delay(defined($delay) ? $delay : 5); + return $self; +} + +sub copy { + my $orig = shift; + bless {%$orig, 'quiet_until' => 1}, ref($orig); +} +#-------------------------------------------------------------------------- + +sub reach { + my($self, $point, $note) = @_; + if( (my $now = time) >= $self->{'quiet_until'}) { + my $goal; + my $to = $self->{'to'}; + print $to join('', + ($self->{'quiet_until'} == 1) ? () : '... ', + (defined $point) ? ( + '#', + ($goal = $self->{'goal'}) ? ( + ' ' x (length($goal) - length($point)), + $point, '/', $goal, + ) : $point, + $note ? ': ' : (), + ) : (), + $note || '', + "\n" + ); + $self->{'quiet_until'} = $now + $self->{'delay'}; + } + return $self; +} + +#-------------------------------------------------------------------------- + +sub done { + my($self, $note) = @_; + $self->{'quiet_until'} = 1; + return $self->reach( undef, $note ); +} + +#-------------------------------------------------------------------------- +# Simple accessors: + +sub delay { + return $_[0]{'delay'} if @_ == 1; $_[0]{'delay'} = $_[1]; return $_[0] } +sub goal { + return $_[0]{'goal' } if @_ == 1; $_[0]{'goal' } = $_[1]; return $_[0] } +sub to { + return $_[0]{'to' } if @_ == 1; $_[0]{'to' } = $_[1]; return $_[0] } + +#-------------------------------------------------------------------------- + +unless(caller) { # Simple self-test: + my $p = __PACKAGE__->new->goal(5); + $p->reach(1, "Primus!"); + sleep 1; + $p->reach(2, "Secundus!"); + sleep 3; + $p->reach(3, "Tertius!"); + sleep 5; + $p->reach(4); + $p->reach(5, "Quintus!"); + sleep 1; + $p->done("All done"); +} + +#-------------------------------------------------------------------------- +1; +__END__ + +require 5; +package Pod::Simple::Debug; +use strict; +use vars qw($VERSION ); +$VERSION = '3.35'; + +sub import { + my($value,$variable); + + if(@_ == 2) { + $value = $_[1]; + } elsif(@_ == 3) { + ($variable, $value) = @_[1,2]; + + ($variable, $value) = ($value, $variable) + if defined $value and ref($value) eq 'SCALAR' + and not(defined $variable and ref($variable) eq 'SCALAR') + ; # tolerate getting it backwards + + unless( defined $variable and ref($variable) eq 'SCALAR') { + require Carp; + Carp::croak("Usage:\n use Pod::Simple::Debug (NUMVAL)\nor" + . "\n use Pod::Simple::Debug (\\\$var, STARTNUMVAL)\nAborting"); + } + } else { + require Carp; + Carp::croak("Usage:\n use Pod::Simple::Debug (NUMVAL)\nor" + . "\n use Pod::Simple::Debug (\\\$var, STARTNUMVAL)\nAborting"); + } + + if( defined &Pod::Simple::DEBUG ) { + require Carp; + Carp::croak("It's too late to call Pod::Simple::Debug -- " + . "Pod::Simple has already loaded\nAborting"); + } + + $value = 0 unless defined $value; + + unless($value =~ m/^-?\d+$/) { + require Carp; + Carp::croak( "$value isn't a numeric value." + . "\nUsage:\n use Pod::Simple::Debug (NUMVAL)\nor" + . "\n use Pod::Simple::Debug (\\\$var, STARTNUMVAL)\nAborting"); + } + + if( defined $variable ) { + # make a not-really-constant + *Pod::Simple::DEBUG = sub () { $$variable } ; + $$variable = $value; + print STDERR "# Starting Pod::Simple::DEBUG = non-constant $variable with val $value\n"; + } else { + *Pod::Simple::DEBUG = eval " sub () { $value } "; + print STDERR "# Starting Pod::Simple::DEBUG = $value\n"; + } + + require Pod::Simple; + return; +} + +1; + + +__END__ + + +require 5; +package Pod::Simple::PullParserEndToken; +use Pod::Simple::PullParserToken (); +use strict; +use vars qw(@ISA $VERSION); +@ISA = ('Pod::Simple::PullParserToken'); +$VERSION = '3.35'; + +sub new { # Class->new(tagname); + my $class = shift; + return bless ['end', @_], ref($class) || $class; +} + +# Purely accessors: + +sub tagname { (@_ == 2) ? ($_[0][1] = $_[1]) : $_[0][1] } +sub tag { shift->tagname(@_) } + +# shortcut: +sub is_tagname { $_[0][1] eq $_[1] } +sub is_tag { shift->is_tagname(@_) } + +1; + + +__END__ + +require 5; +package Pod::Simple::PullParser; +$VERSION = '3.35'; +use Pod::Simple (); +BEGIN {@ISA = ('Pod::Simple')} + +use strict; +use Carp (); + +use Pod::Simple::PullParserStartToken; +use Pod::Simple::PullParserEndToken; +use Pod::Simple::PullParserTextToken; + +BEGIN { *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG } + +__PACKAGE__->_accessorize( + 'source_fh', # the filehandle we're reading from + 'source_scalar_ref', # the scalarref we're reading from + 'source_arrayref', # the arrayref we're reading from +); + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# +# And here is how we implement a pull-parser on top of a push-parser... + +sub filter { + my($self, $source) = @_; + $self = $self->new unless ref $self; + + $source = *STDIN{IO} unless defined $source; + $self->set_source($source); + $self->output_fh(*STDOUT{IO}); + + $self->run; # define run() in a subclass if you want to use filter()! + return $self; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub parse_string_document { + my $this = shift; + $this->set_source(\ $_[0]); + $this->run; +} + +sub parse_file { + my($this, $filename) = @_; + $this->set_source($filename); + $this->run; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# In case anyone tries to use them: + +sub run { + use Carp (); + if( __PACKAGE__ eq ref($_[0]) || $_[0]) { # I'm not being subclassed! + Carp::croak "You can call run() only on subclasses of " + . __PACKAGE__; + } else { + Carp::croak join '', + "You can't call run() because ", + ref($_[0]) || $_[0], " didn't define a run() method"; + } +} + +sub parse_lines { + use Carp (); + Carp::croak "Use set_source with ", __PACKAGE__, + " and subclasses, not parse_lines"; +} + +sub parse_line { + use Carp (); + Carp::croak "Use set_source with ", __PACKAGE__, + " and subclasses, not parse_line"; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub new { + my $class = shift; + my $self = $class->SUPER::new(@_); + die "Couldn't construct for $class" unless $self; + + $self->{'token_buffer'} ||= []; + $self->{'start_token_class'} ||= 'Pod::Simple::PullParserStartToken'; + $self->{'text_token_class'} ||= 'Pod::Simple::PullParserTextToken'; + $self->{'end_token_class'} ||= 'Pod::Simple::PullParserEndToken'; + + DEBUG > 1 and print STDERR "New pullparser object: $self\n"; + + return $self; +} + +# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + +sub get_token { + my $self = shift; + DEBUG > 1 and print STDERR "\nget_token starting up on $self.\n"; + DEBUG > 2 and print STDERR " Items in token-buffer (", + scalar( @{ $self->{'token_buffer'} } ) , + ") :\n", map( + " " . $_->dump . "\n", @{ $self->{'token_buffer'} } + ), + @{ $self->{'token_buffer'} } ? '' : ' (no tokens)', + "\n" + ; + + until( @{ $self->{'token_buffer'} } ) { + DEBUG > 3 and print STDERR "I need to get something into my empty token buffer...\n"; + if($self->{'source_dead'}) { + DEBUG and print STDERR "$self 's source is dead.\n"; + push @{ $self->{'token_buffer'} }, undef; + } elsif(exists $self->{'source_fh'}) { + my @lines; + my $fh = $self->{'source_fh'} + || Carp::croak('You have to call set_source before you can call get_token'); + + DEBUG and print STDERR "$self 's source is filehandle $fh.\n"; + # Read those many lines at a time + for(my $i = Pod::Simple::MANY_LINES; $i--;) { + DEBUG > 3 and print STDERR " Fetching a line from source filehandle $fh...\n"; + local $/ = $Pod::Simple::NL; + push @lines, scalar(<$fh>); # readline + DEBUG > 3 and print STDERR " Line is: ", + defined($lines[-1]) ? $lines[-1] : "\n"; + unless( defined $lines[-1] ) { + DEBUG and print STDERR "That's it for that source fh! Killing.\n"; + delete $self->{'source_fh'}; # so it can be GC'd + last; + } + # but pass thru the undef, which will set source_dead to true + + # TODO: look to see if $lines[-1] is =encoding, and if so, + # do horribly magic things + + } + + if(DEBUG > 8) { + print STDERR "* I've gotten ", scalar(@lines), " lines:\n"; + foreach my $l (@lines) { + if(defined $l) { + print STDERR " line {$l}\n"; + } else { + print STDERR " line undef\n"; + } + } + print STDERR "* end of ", scalar(@lines), " lines\n"; + } + + $self->SUPER::parse_lines(@lines); + + } elsif(exists $self->{'source_arrayref'}) { + DEBUG and print STDERR "$self 's source is arrayref $self->{'source_arrayref'}, with ", + scalar(@{$self->{'source_arrayref'}}), " items left in it.\n"; + + DEBUG > 3 and print STDERR " Fetching ", Pod::Simple::MANY_LINES, " lines.\n"; + $self->SUPER::parse_lines( + splice @{ $self->{'source_arrayref'} }, + 0, + Pod::Simple::MANY_LINES + ); + unless( @{ $self->{'source_arrayref'} } ) { + DEBUG and print STDERR "That's it for that source arrayref! Killing.\n"; + $self->SUPER::parse_lines(undef); + delete $self->{'source_arrayref'}; # so it can be GC'd + } + # to make sure that an undef is always sent to signal end-of-stream + + } elsif(exists $self->{'source_scalar_ref'}) { + + DEBUG and print STDERR "$self 's source is scalarref $self->{'source_scalar_ref'}, with ", + length(${ $self->{'source_scalar_ref'} }) - + (pos(${ $self->{'source_scalar_ref'} }) || 0), + " characters left to parse.\n"; + + DEBUG > 3 and print STDERR " Fetching a line from source-string...\n"; + if( ${ $self->{'source_scalar_ref'} } =~ + m/([^\n\r]*)((?:\r?\n)?)/g + ) { + #print(">> $1\n"), + $self->SUPER::parse_lines($1) + if length($1) or length($2) + or pos( ${ $self->{'source_scalar_ref'} }) + != length( ${ $self->{'source_scalar_ref'} }); + # I.e., unless it's a zero-length "empty line" at the very + # end of "foo\nbar\n" (i.e., between the \n and the EOS). + } else { # that's the end. Byebye + $self->SUPER::parse_lines(undef); + delete $self->{'source_scalar_ref'}; + DEBUG and print STDERR "That's it for that source scalarref! Killing.\n"; + } + + + } else { + die "What source??"; + } + } + DEBUG and print STDERR "get_token about to return ", + Pod::Simple::pretty( @{$self->{'token_buffer'}} + ? $self->{'token_buffer'}[-1] : undef + ), "\n"; + return shift @{$self->{'token_buffer'}}; # that's an undef if empty +} + +sub unget_token { + my $self = shift; + DEBUG and print STDERR "Ungetting ", scalar(@_), " tokens: ", + @_ ? "@_\n" : "().\n"; + foreach my $t (@_) { + Carp::croak "Can't unget that, because it's not a token -- it's undef!" + unless defined $t; + Carp::croak "Can't unget $t, because it's not a token -- it's a string!" + unless ref $t; + Carp::croak "Can't unget $t, because it's not a token object!" + unless UNIVERSAL::can($t, 'type'); + } + + unshift @{$self->{'token_buffer'}}, @_; + DEBUG > 1 and print STDERR "Token buffer now has ", + scalar(@{$self->{'token_buffer'}}), " items in it.\n"; + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +# $self->{'source_filename'} = $source; + +sub set_source { + my $self = shift @_; + return $self->{'source_fh'} unless @_; + Carp::croak("Cannot assign new source to pull parser; create a new instance, instead") + if $self->{'source_fh'} || $self->{'source_scalar_ref'} || $self->{'source_arrayref'}; + my $handle; + if(!defined $_[0]) { + Carp::croak("Can't use empty-string as a source for set_source"); + } elsif(ref(\( $_[0] )) eq 'GLOB') { + $self->{'source_filename'} = '' . ($handle = $_[0]); + DEBUG and print STDERR "$self 's source is glob $_[0]\n"; + # and fall thru + } elsif(ref( $_[0] ) eq 'SCALAR') { + $self->{'source_scalar_ref'} = $_[0]; + DEBUG and print STDERR "$self 's source is scalar ref $_[0]\n"; + return; + } elsif(ref( $_[0] ) eq 'ARRAY') { + $self->{'source_arrayref'} = $_[0]; + DEBUG and print STDERR "$self 's source is array ref $_[0]\n"; + return; + } elsif(ref $_[0]) { + $self->{'source_filename'} = '' . ($handle = $_[0]); + DEBUG and print STDERR "$self 's source is fh-obj $_[0]\n"; + } elsif(!length $_[0]) { + Carp::croak("Can't use empty-string as a source for set_source"); + } else { # It's a filename! + DEBUG and print STDERR "$self 's source is filename $_[0]\n"; + { + local *PODSOURCE; + open(PODSOURCE, "<$_[0]") || Carp::croak "Can't open $_[0]: $!"; + $handle = *PODSOURCE{IO}; + } + $self->{'source_filename'} = $_[0]; + DEBUG and print STDERR " Its name is $_[0].\n"; + + # TODO: file-discipline things here! + } + + $self->{'source_fh'} = $handle; + DEBUG and print STDERR " Its handle is $handle\n"; + return 1; +} + +# ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + +sub get_title_short { shift->get_short_title(@_) } # alias + +sub get_short_title { + my $title = shift->get_title(@_); + $title = $1 if $title =~ m/^(\S{1,60})\s+--?\s+./s; + # turn "Foo::Bar -- bars for your foo" into "Foo::Bar" + return $title; +} + +sub get_title { shift->_get_titled_section( + 'NAME', max_token => 50, desperate => 1, @_) +} +sub get_version { shift->_get_titled_section( + 'VERSION', + max_token => 400, + accept_verbatim => 1, + max_content_length => 3_000, + @_, + ); +} +sub get_description { shift->_get_titled_section( + 'DESCRIPTION', + max_token => 400, + max_content_length => 3_000, + @_, +) } + +sub get_authors { shift->get_author(@_) } # a harmless alias + +sub get_author { + my $this = shift; + # Max_token is so high because these are + # typically at the end of the document: + $this->_get_titled_section('AUTHOR' , max_token => 10_000, @_) || + $this->_get_titled_section('AUTHORS', max_token => 10_000, @_); +} + +#-------------------------------------------------------------------------- + +sub _get_titled_section { + # Based on a get_title originally contributed by Graham Barr + my($self, $titlename, %options) = (@_); + + my $max_token = delete $options{'max_token'}; + my $desperate_for_title = delete $options{'desperate'}; + my $accept_verbatim = delete $options{'accept_verbatim'}; + my $max_content_length = delete $options{'max_content_length'}; + my $nocase = delete $options{'nocase'}; + $max_content_length = 120 unless defined $max_content_length; + + Carp::croak( "Unknown " . ((1 == keys %options) ? "option: " : "options: ") + . join " ", map "[$_]", sort keys %options + ) + if keys %options; + + my %content_containers; + $content_containers{'Para'} = 1; + if($accept_verbatim) { + $content_containers{'Verbatim'} = 1; + $content_containers{'VerbatimFormatted'} = 1; + } + + my $token_count = 0; + my $title; + my @to_unget; + my $state = 0; + my $depth = 0; + + Carp::croak "What kind of titlename is \"$titlename\"?!" unless + defined $titlename and $titlename =~ m/^[A-Z ]{1,60}$/s; #sanity + my $titlename_re = quotemeta($titlename); + + my $head1_text_content; + my $para_text_content; + my $skipX; + + while( + ++$token_count <= ($max_token || 1_000_000) + and defined(my $token = $self->get_token) + ) { + push @to_unget, $token; + + if ($state == 0) { # seeking =head1 + if( $token->is_start and $token->tagname eq 'head1' ) { + DEBUG and print STDERR " Found head1. Seeking content...\n"; + ++$state; + $head1_text_content = ''; + } + } + + elsif($state == 1) { # accumulating text until end of head1 + if( $token->is_text ) { + unless ($skipX) { + DEBUG and print STDERR " Adding \"", $token->text, "\" to head1-content.\n"; + $head1_text_content .= $token->text; + } + } elsif( $token->is_tagname('X') ) { + # We're going to want to ignore X<> stuff. + $skipX = $token->is_start; + DEBUG and print STDERR +($skipX ? 'Start' : 'End'), 'ing ignoring of X<> tag'; + } elsif( $token->is_end and $token->tagname eq 'head1' ) { + DEBUG and print STDERR " Found end of head1. Considering content...\n"; + $head1_text_content = uc $head1_text_content if $nocase; + if($head1_text_content eq $titlename + or $head1_text_content =~ m/\($titlename_re\)/s + # We accept "=head1 Nomen Modularis (NAME)" for sake of i18n + ) { + DEBUG and print STDERR " Yup, it was $titlename. Seeking next para-content...\n"; + ++$state; + } elsif( + $desperate_for_title + # if we're so desperate we'll take the first + # =head1's content as a title + and $head1_text_content =~ m/\S/ + and $head1_text_content !~ m/^[ A-Z]+$/s + and $head1_text_content !~ + m/\((?: + NAME | TITLE | VERSION | AUTHORS? | DESCRIPTION | SYNOPSIS + | COPYRIGHT | LICENSE | NOTES? | FUNCTIONS? | METHODS? + | CAVEATS? | BUGS? | SEE\ ALSO | SWITCHES | ENVIRONMENT + )\)/sx + # avoid accepting things like =head1 Thingy Thongy (DESCRIPTION) + and ($max_content_length + ? (length($head1_text_content) <= $max_content_length) # sanity + : 1) + ) { + # Looks good; trim it + ($title = $head1_text_content) =~ s/\s+$//; + DEBUG and print STDERR " It looks titular: \"$title\".\n\n Using that.\n"; + last; + } else { + --$state; + DEBUG and print STDERR " Didn't look titular ($head1_text_content).\n", + "\n Dropping back to seeking-head1-content mode...\n"; + } + } + } + + elsif($state == 2) { + # seeking start of para (which must immediately follow) + if($token->is_start and $content_containers{ $token->tagname }) { + DEBUG and print STDERR " Found start of Para. Accumulating content...\n"; + $para_text_content = ''; + ++$state; + } else { + DEBUG and print + " Didn't see an immediately subsequent start-Para. Reseeking H1\n"; + $state = 0; + } + } + + elsif($state == 3) { + # accumulating text until end of Para + if( $token->is_text ) { + DEBUG and print STDERR " Adding \"", $token->text, "\" to para-content.\n"; + $para_text_content .= $token->text; + # and keep looking + + } elsif( $token->is_end and $content_containers{ $token->tagname } ) { + DEBUG and print STDERR " Found end of Para. Considering content: ", + $para_text_content, "\n"; + + if( $para_text_content =~ m/\S/ + and ($max_content_length + ? (length($para_text_content) <= $max_content_length) + : 1) + ) { + # Some minimal sanity constraints, I think. + DEBUG and print STDERR " It looks contentworthy, I guess. Using it.\n"; + $title = $para_text_content; + last; + } else { + DEBUG and print STDERR " Doesn't look at all contentworthy!\n Giving up.\n"; + undef $title; + last; + } + } + } + + else { + die "IMPOSSIBLE STATE $state!\n"; # should never happen + } + + } + + # Put it all back! + $self->unget_token(@to_unget); + + if(DEBUG) { + if(defined $title) { print STDERR " Returning title <$title>\n" } + else { print STDERR "Returning title <>\n" } + } + + return '' unless defined $title; + $title =~ s/^\s+//; + return $title; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +# +# Methods that actually do work at parse-time: + +sub _handle_element_start { + my $self = shift; # leaving ($element_name, $attr_hash_r) + DEBUG > 2 and print STDERR "++ $_[0] (", map("<$_> ", %{$_[1]}), ")\n"; + + push @{ $self->{'token_buffer'} }, + $self->{'start_token_class'}->new(@_); + return; +} + +sub _handle_text { + my $self = shift; # leaving ($text) + DEBUG > 2 and print STDERR "== $_[0]\n"; + push @{ $self->{'token_buffer'} }, + $self->{'text_token_class'}->new(@_); + return; +} + +sub _handle_element_end { + my $self = shift; # leaving ($element_name); + DEBUG > 2 and print STDERR "-- $_[0]\n"; + push @{ $self->{'token_buffer'} }, + $self->{'end_token_class'}->new(@_); + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +1; + + +__END__ + + +JUNK: + +sub _old_get_title { # some witchery in here + my $self = $_[0]; + my $title; + my @to_unget; + + while(1) { + push @to_unget, $self->get_token; + unless(defined $to_unget[-1]) { # whoops, short doc! + pop @to_unget; + last; + } + + DEBUG and print STDERR "-Got token ", $to_unget[-1]->dump, "\n"; + + (DEBUG and print STDERR "Too much in the buffer.\n"), + last if @to_unget > 25; # sanity + + my $pattern = ''; + if( #$to_unget[-1]->type eq 'end' + #and $to_unget[-1]->tagname eq 'Para' + #and + ($pattern = join('', + map {; + ($_->type eq 'start') ? ("<" . $_->tagname .">") + : ($_->type eq 'end' ) ? ("tagname .">") + : ($_->type eq 'text' ) ? ($_->text =~ m<^([A-Z]+)$>s ? $1 : 'X') + : "BLORP" + } @to_unget + )) =~ m{NAME(X|)+$}s + ) { + # Whee, it fits the pattern + DEBUG and print STDERR "Seems to match =head1 NAME pattern.\n"; + $title = ''; + foreach my $t (reverse @to_unget) { + last if $t->type eq 'start' and $t->tagname eq 'Para'; + $title = $t->text . $title if $t->type eq 'text'; + } + undef $title if $title =~ m<^\s*$>; # make sure it's contentful! + last; + + } elsif ($pattern =~ m{(.+)$} + and !( $1 eq '1' and $2 eq 'NAME' ) + ) { + # Well, it fits a fallback pattern + DEBUG and print STDERR "Seems to match NAMEless pattern.\n"; + $title = ''; + foreach my $t (reverse @to_unget) { + last if $t->type eq 'start' and $t->tagname =~ m/^head\d$/s; + $title = $t->text . $title if $t->type eq 'text'; + } + undef $title if $title =~ m<^\s*$>; # make sure it's contentful! + last; + + } else { + DEBUG and $pattern and print STDERR "Leading pattern: $pattern\n"; + } + } + + # Put it all back: + $self->unget_token(@to_unget); + + if(DEBUG) { + if(defined $title) { print STDERR " Returning title <$title>\n" } + else { print STDERR "Returning title <>\n" } + } + + return '' unless defined $title; + return $title; +} + + +require 5; +package Pod::Simple::PullParserStartToken; +use Pod::Simple::PullParserToken (); +use strict; +use vars qw(@ISA $VERSION); +@ISA = ('Pod::Simple::PullParserToken'); +$VERSION = '3.35'; + +sub new { # Class->new(tagname, optional_attrhash); + my $class = shift; + return bless ['start', @_], ref($class) || $class; +} + +# Purely accessors: + +sub tagname { (@_ == 2) ? ($_[0][1] = $_[1]) : $_[0][1] } +sub tag { shift->tagname(@_) } + +sub is_tagname { $_[0][1] eq $_[1] } +sub is_tag { shift->is_tagname(@_) } + + +sub attr_hash { $_[0][2] ||= {} } + +sub attr { + if(@_ == 2) { # Reading: $token->attr('attrname') + ${$_[0][2] || return undef}{ $_[1] }; + } elsif(@_ > 2) { # Writing: $token->attr('attrname', 'newval') + ${$_[0][2] ||= {}}{ $_[1] } = $_[2]; + } else { + require Carp; + Carp::croak( + 'usage: $object->attr("val") or $object->attr("key", "newval")'); + return undef; + } +} + +1; + + +__END__ + +require 5; +package Pod::Simple::HTML; +use strict; +use Pod::Simple::PullParser (); +use vars qw( + @ISA %Tagmap $Computerese $LamePad $Linearization_Limit $VERSION + $Perldoc_URL_Prefix $Perldoc_URL_Postfix $Man_URL_Prefix $Man_URL_Postfix + $Title_Prefix $Title_Postfix $HTML_EXTENSION %ToIndex + $Doctype_decl $Content_decl +); +@ISA = ('Pod::Simple::PullParser'); +$VERSION = '3.35'; +BEGIN { + if(defined &DEBUG) { } # no-op + elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG } + else { *DEBUG = sub () {0}; } +} + +$Doctype_decl ||= ''; # No. Just No. Don't even ask me for it. + # qq{\n}; + +$Content_decl ||= + q{}; + +$HTML_EXTENSION = '.html' unless defined $HTML_EXTENSION; +$Computerese = "" unless defined $Computerese; +$LamePad = '' unless defined $LamePad; + +$Linearization_Limit = 120 unless defined $Linearization_Limit; + # headings/items longer than that won't get an +$Perldoc_URL_Prefix = 'http://search.cpan.org/perldoc?' + unless defined $Perldoc_URL_Prefix; +$Perldoc_URL_Postfix = '' + unless defined $Perldoc_URL_Postfix; + + +$Man_URL_Prefix = 'http://man.he.net/man'; +$Man_URL_Postfix = ''; + +$Title_Prefix = '' unless defined $Title_Prefix; +$Title_Postfix = '' unless defined $Title_Postfix; +%ToIndex = map {; $_ => 1 } qw(head1 head2 head3 head4 ); # item-text + # 'item-text' stuff in the index doesn't quite work, and may + # not be a good idea anyhow. + + +__PACKAGE__->_accessorize( + 'perldoc_url_prefix', + # In turning L into http://whatever/Foo%3a%3aBar, what + # to put before the "Foo%3a%3aBar". + # (for singleton mode only?) + 'perldoc_url_postfix', + # what to put after "Foo%3a%3aBar" in the URL. Normally "". + + 'man_url_prefix', + # In turning L into http://whatever/man/1/crontab, what + # to put before the "1/crontab". + 'man_url_postfix', + # what to put after the "1/crontab" in the URL. Normally "". + + 'batch_mode', # whether we're in batch mode + 'batch_mode_current_level', + # When in batch mode, how deep the current module is: 1 for "LWP", + # 2 for "LWP::Procotol", 3 for "LWP::Protocol::GHTTP", etc + + 'title_prefix', 'title_postfix', + # What to put before and after the title in the head. + # Should already be &-escaped + + 'html_h_level', + + 'html_header_before_title', + 'html_header_after_title', + 'html_footer', + 'top_anchor', + + 'index', # whether to add an index at the top of each page + # (actually it's a table-of-contents, but we'll call it an index, + # out of apparently longstanding habit) + + 'html_css', # URL of CSS file to point to + 'html_javascript', # URL of Javascript file to point to + + 'force_title', # should already be &-escaped + 'default_title', # should already be &-escaped +); + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +my @_to_accept; + +%Tagmap = ( + 'Verbatim' => "\n", + '/Verbatim' => "\n", + 'VerbatimFormatted' => "\n", + '/VerbatimFormatted' => "\n", + 'VerbatimB' => "", + '/VerbatimB' => "", + 'VerbatimI' => "", + '/VerbatimI' => "", + 'VerbatimBI' => "", + '/VerbatimBI' => "", + + + 'Data' => "\n", + '/Data' => "\n", + + 'head1' => "\n

      ", # And also stick in an + 'head2' => "\n

      ", # '' + 'head3' => "\n

      ", # '' + 'head4' => "\n

      ", # '' + '/head1' => "

      \n", + '/head2' => "

      \n", + '/head3' => "\n", + '/head4' => "\n", + + 'X' => "", + + changes(qw( + Para=p + B=b I=i + over-bullet=ul + over-number=ol + over-text=dl + over-block=blockquote + item-bullet=li + item-number=li + item-text=dt + )), + changes2( + map {; m/^([-a-z]+)/s && push @_to_accept, $1; $_ } + qw[ + sample=samp + definition=dfn + keyboard=kbd + variable=var + citation=cite + abbreviation=abbr + acronym=acronym + subscript=sub + superscript=sup + big=big + small=small + underline=u + strikethrough=s + preformat=pre + teletype=tt + ] # no point in providing a way to get ..., I think + ), + + '/item-bullet' => "
    • $LamePad\n", + '/item-number' => "$LamePad\n", + '/item-text' => "$LamePad\n", + 'item-body' => "\n
      ", + '/item-body' => "
      \n", + + + 'B' => "", '/B' => "", + 'I' => "", '/I' => "", + 'F' => "", '/F' => "", + 'C' => "", '/C' => "
      ", + 'L' => "", # ideally never used! + '/L' => "", +); + +sub changes { + return map {; m/^([-_:0-9a-zA-Z]+)=([-_:0-9a-zA-Z]+)$/s + ? ( $1, => "\n<$2>", "/$1", => "\n" ) : die "Funky $_" + } @_; +} +sub changes2 { + return map {; m/^([-_:0-9a-zA-Z]+)=([-_:0-9a-zA-Z]+)$/s + ? ( $1, => "<$2>", "/$1", => "" ) : die "Funky $_" + } @_; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sub go { Pod::Simple::HTML->parse_from_file(@ARGV); exit 0 } + # Just so we can run from the command line. No options. + # For that, use perldoc! +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub new { + my $new = shift->SUPER::new(@_); + #$new->nix_X_codes(1); + $new->nbsp_for_S(1); + $new->accept_targets( 'html', 'HTML' ); + $new->accept_codes('VerbatimFormatted'); + $new->accept_codes(@_to_accept); + DEBUG > 2 and print STDERR "To accept: ", join(' ',@_to_accept), "\n"; + + $new->perldoc_url_prefix( $Perldoc_URL_Prefix ); + $new->perldoc_url_postfix( $Perldoc_URL_Postfix ); + $new->man_url_prefix( $Man_URL_Prefix ); + $new->man_url_postfix( $Man_URL_Postfix ); + $new->title_prefix( $Title_Prefix ); + $new->title_postfix( $Title_Postfix ); + + $new->html_header_before_title( + qq[$Doctype_decl] + ); + $new->html_header_after_title( join "\n" => + "", + $Content_decl, + "\n", + $new->version_tag_comment, + "\n", + ); + $new->html_footer( qq[\n\n\n\n] ); + $new->top_anchor( "\n" ); + + $new->{'Tagmap'} = {%Tagmap}; + + return $new; +} + +sub __adjust_html_h_levels { + my ($self) = @_; + my $Tagmap = $self->{'Tagmap'}; + + my $add = $self->html_h_level; + return unless defined $add; + return if ($self->{'Adjusted_html_h_levels'}||0) == $add; + + $add -= 1; + for (1 .. 4) { + $Tagmap->{"head$_"} =~ s/$_/$_ + $add/e; + $Tagmap->{"/head$_"} =~ s/$_/$_ + $add/e; + } +} + +sub batch_mode_page_object_init { + my($self, $batchconvobj, $module, $infile, $outfile, $depth) = @_; + DEBUG and print STDERR "Initting $self\n for $module\n", + " in $infile\n out $outfile\n depth $depth\n"; + $self->batch_mode(1); + $self->batch_mode_current_level($depth); + return $self; +} + +sub run { + my $self = $_[0]; + return $self->do_middle if $self->bare_output; + return + $self->do_beginning && $self->do_middle && $self->do_end; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub do_beginning { + my $self = $_[0]; + + my $title; + + if(defined $self->force_title) { + $title = $self->force_title; + DEBUG and print STDERR "Forcing title to be $title\n"; + } else { + # Actually try looking for the title in the document: + $title = $self->get_short_title(); + unless($self->content_seen) { + DEBUG and print STDERR "No content seen in search for title.\n"; + return; + } + $self->{'Title'} = $title; + + if(defined $title and $title =~ m/\S/) { + $title = $self->title_prefix . esc($title) . $self->title_postfix; + } else { + $title = $self->default_title; + $title = '' unless defined $title; + DEBUG and print STDERR "Title defaults to $title\n"; + } + } + + + my $after = $self->html_header_after_title || ''; + if($self->html_css) { + my $link = + $self->html_css =~ m/html_css # It's a big blob of markup, let's drop it in + : sprintf( # It's just a URL, so let's wrap it up + qq[\n], + $self->html_css, + ); + $after =~ s{()}{$link\n$1}i; # otherwise nevermind + } + $self->_add_top_anchor(\$after); + + if($self->html_javascript) { + my $link = + $self->html_javascript =~ m/html_javascript # It's a big blob of markup, let's drop it in + : sprintf( # It's just a URL, so let's wrap it up + qq[\n], + $self->html_javascript, + ); + $after =~ s{()}{$link\n$1}i; # otherwise nevermind + } + + print {$self->{'output_fh'}} + $self->html_header_before_title || '', + $title, # already escaped + $after, + ; + + DEBUG and print STDERR "Returning from do_beginning...\n"; + return 1; +} + +sub _add_top_anchor { + my($self, $text_r) = @_; + unless($$text_r and $$text_r =~ m/name=['"]___top['"]/) { # a hack + $$text_r .= $self->top_anchor || ''; + } + return; +} + +sub version_tag_comment { + my $self = shift; + return sprintf + "\n", + esc( + ref($self), $self->VERSION(), $ISA[0], $ISA[0]->VERSION(), + $], scalar(gmtime), + ), $self->_modnote(), + ; +} + +sub _modnote { + my $class = ref($_[0]) || $_[0]; + return join "\n " => grep m/\S/, split "\n", + +qq{ +If you want to change this HTML document, you probably shouldn't do that +by changing it directly. Instead, see about changing the calling options +to $class, and/or subclassing $class, +then reconverting this document from the Pod source. +When in doubt, email the author of $class for advice. +See 'perldoc $class' for more info. +}; + +} + +sub do_end { + my $self = $_[0]; + print {$self->{'output_fh'}} $self->html_footer || ''; + return 1; +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Normally this would just be a call to _do_middle_main_loop -- but we +# have to do some elaborate things to emit all the content and then +# summarize it and output it /before/ the content that it's a summary of. + +sub do_middle { + my $self = $_[0]; + return $self->_do_middle_main_loop unless $self->index; + + if( $self->output_string ) { + # An efficiency hack + my $out = $self->output_string; #it's a reference to it + my $sneakytag = "\f\f\e\e\b\bIndex Here\e\e\b\b\f\f\n"; + $$out .= $sneakytag; + $self->_do_middle_main_loop; + $sneakytag = quotemeta($sneakytag); + my $index = $self->index_as_html(); + if( $$out =~ s/$sneakytag/$index/s ) { + # Expected case + DEBUG and print STDERR "Inserted ", length($index), " bytes of index HTML into $out.\n"; + } else { + DEBUG and print STDERR "Odd, couldn't find where to insert the index in the output!\n"; + # I don't think this should ever happen. + } + return 1; + } + + unless( $self->output_fh ) { + require Carp; + Carp::confess("Parser object \$p doesn't seem to have any output object! I don't know how to deal with that."); + } + + # If we get here, we're outputting to a FH. So we need to do some magic. + # Namely, divert all content to a string, which we output after the index. + my $fh = $self->output_fh; + my $content = ''; + { + # Our horrible bait and switch: + $self->output_string( \$content ); + $self->_do_middle_main_loop; + $self->abandon_output_string(); + $self->output_fh($fh); + } + print $fh $self->index_as_html(); + print $fh $content; + + return 1; +} + +########################################################################### + +sub index_as_html { + my $self = $_[0]; + # This is meant to be called AFTER the input document has been parsed! + + my $points = $self->{'PSHTML_index_points'} || []; + + @$points > 1 or return qq[
      \n]; + # There's no point in having a 0-item or 1-item index, I dare say. + + my(@out) = qq{\n
      }; + my $level = 0; + + my( $target_level, $previous_tagname, $tagname, $text, $anchorname, $indent); + foreach my $p (@$points, ['head0', '(end)']) { + ($tagname, $text) = @$p; + $anchorname = $self->section_escape($text); + if( $tagname =~ m{^head(\d+)$} ) { + $target_level = 0 + $1; + } else { # must be some kinda list item + if($previous_tagname =~ m{^head\d+$} ) { + $target_level = $level + 1; + } else { + $target_level = $level; # no change needed + } + } + + # Get to target_level by opening or closing ULs + while($level > $target_level) + { --$level; push @out, (" " x $level) . "
    "; } + while($level < $target_level) + { ++$level; push @out, (" " x ($level-1)) + . "
      "; } + + $previous_tagname = $tagname; + next unless $level; + + $indent = ' ' x $level; + push @out, sprintf + "%s
    • %s", + $indent, $level, esc($anchorname), esc($text) + ; + } + push @out, "
  • \n"; + return join "\n", @out; +} + +########################################################################### + +sub _do_middle_main_loop { + my $self = $_[0]; + my $fh = $self->{'output_fh'}; + my $tagmap = $self->{'Tagmap'}; + + $self->__adjust_html_h_levels; + + my($token, $type, $tagname, $linkto, $linktype); + my @stack; + my $dont_wrap = 0; + + while($token = $self->get_token) { + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + if( ($type = $token->type) eq 'start' ) { + if(($tagname = $token->tagname) eq 'L') { + $linktype = $token->attr('type') || 'insane'; + + $linkto = $self->do_link($token); + + if(defined $linkto and length $linkto) { + esc($linkto); + # (Yes, SGML-escaping applies on top of %-escaping! + # But it's rarely noticeable in practice.) + print $fh qq{}; + } else { + print $fh ""; # Yes, an 'a' element with no attributes! + } + + } elsif ($tagname eq 'item-text' or $tagname =~ m/^head\d$/s) { + print $fh $tagmap->{$tagname} || next; + + my @to_unget; + while(1) { + push @to_unget, $self->get_token; + last if $to_unget[-1]->is_end + and $to_unget[-1]->tagname eq $tagname; + + # TODO: support for X<...>'s found in here? (maybe hack into linearize_tokens) + } + + my $name = $self->linearize_tokens(@to_unget); + $name = $self->do_section($name, $token) if defined $name; + + print $fh "index + ? " href='#___top' title='click to go to top of document'\n" + : "\n"; + } + + if(defined $name) { + my $esc = esc( $self->section_name_tidy( $name ) ); + print $fh qq[name="$esc"]; + DEBUG and print STDERR "Linearized ", scalar(@to_unget), + " tokens as \"$name\".\n"; + push @{ $self->{'PSHTML_index_points'} }, [$tagname, $name] + if $ToIndex{ $tagname }; + # Obviously, this discards all formatting codes (saving + # just their content), but ahwell. + + } else { # ludicrously long, so nevermind + DEBUG and print STDERR "Linearized ", scalar(@to_unget), + " tokens, but it was too long, so nevermind.\n"; + } + print $fh "\n>"; + $self->unget_token(@to_unget); + + } elsif ($tagname eq 'Data') { + my $next = $self->get_token; + next unless defined $next; + unless( $next->type eq 'text' ) { + $self->unget_token($next); + next; + } + DEBUG and print STDERR " raw text ", $next->text, "\n"; + # The parser sometimes preserves newlines and sometimes doesn't! + (my $text = $next->text) =~ s/\n\z//; + print $fh $text, "\n"; + next; + + } else { + if( $tagname =~ m/^over-/s ) { + push @stack, ''; + } elsif( $tagname =~ m/^item-/s and @stack and $stack[-1] ) { + print $fh $stack[-1]; + $stack[-1] = ''; + } + print $fh $tagmap->{$tagname} || next; + ++$dont_wrap if $tagname eq 'Verbatim' or $tagname eq "VerbatimFormatted" + or $tagname eq 'X'; + } + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + } elsif( $type eq 'end' ) { + if( ($tagname = $token->tagname) =~ m/^over-/s ) { + if( my $end = pop @stack ) { + print $fh $end; + } + } elsif( $tagname =~ m/^item-/s and @stack) { + $stack[-1] = $tagmap->{"/$tagname"}; + if( $tagname eq 'item-text' and defined(my $next = $self->get_token) ) { + $self->unget_token($next); + if( $next->type eq 'start' ) { + print $fh $tagmap->{"/item-text"},$tagmap->{"item-body"}; + $stack[-1] = $tagmap->{"/item-body"}; + } + } + next; + } + print $fh $tagmap->{"/$tagname"} || next; + --$dont_wrap if $tagname eq 'Verbatim' or $tagname eq 'X'; + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + } elsif( $type eq 'text' ) { + esc($type = $token->text); # reuse $type, why not + $type =~ s/([\?\!\"\'\.\,]) /$1\n/g unless $dont_wrap; + print $fh $type; + } + + } + return 1; +} + +########################################################################### +# + +sub do_section { + my($self, $name, $token) = @_; + return $name; +} + +sub do_link { + my($self, $token) = @_; + my $type = $token->attr('type'); + if(!defined $type) { + $self->whine("Typeless L!?", $token->attr('start_line')); + } elsif( $type eq 'pod') { return $self->do_pod_link($token); + } elsif( $type eq 'url') { return $self->do_url_link($token); + } elsif( $type eq 'man') { return $self->do_man_link($token); + } else { + $self->whine("L of unknown type $type!?", $token->attr('start_line')); + } + return 'FNORG'; # should never get called +} + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +sub do_url_link { return $_[1]->attr('to') } + +sub do_man_link { + my ($self, $link) = @_; + my $to = $link->attr('to'); + my $frag = $link->attr('section'); + + return undef unless defined $to and length $to; # should never happen + + $frag = $self->section_escape($frag) + if defined $frag and length($frag .= ''); # (stringify) + + DEBUG and print STDERR "Resolving \"$to/$frag\"\n\n"; + + return $self->resolve_man_page_link($to, $frag); +} + + +sub do_pod_link { + # And now things get really messy... + my($self, $link) = @_; + my $to = $link->attr('to'); + my $section = $link->attr('section'); + return undef unless( # should never happen + (defined $to and length $to) or + (defined $section and length $section) + ); + + $section = $self->section_escape($section) + if defined $section and length($section .= ''); # (stringify) + + DEBUG and printf STDERR "Resolving \"%s\" \"%s\"...\n", + $to || "(nil)", $section || "(nil)"; + + { + # An early hack: + my $complete_url = $self->resolve_pod_link_by_table($to, $section); + if( $complete_url ) { + DEBUG > 1 and print STDERR "resolve_pod_link_by_table(T,S) gives ", + $complete_url, "\n (Returning that.)\n"; + return $complete_url; + } else { + DEBUG > 4 and print STDERR " resolve_pod_link_by_table(T,S)", + " didn't return anything interesting.\n"; + } + } + + if(defined $to and length $to) { + # Give this routine first hack again + my $there = $self->resolve_pod_link_by_table($to); + if(defined $there and length $there) { + DEBUG > 1 + and print STDERR "resolve_pod_link_by_table(T) gives $there\n"; + } else { + $there = + $self->resolve_pod_page_link($to, $section); + # (I pass it the section value, but I don't see a + # particular reason it'd use it.) + DEBUG > 1 and print STDERR "resolve_pod_page_link gives ", $there || "(nil)", "\n"; + unless( defined $there and length $there ) { + DEBUG and print STDERR "Can't resolve $to\n"; + return undef; + } + # resolve_pod_page_link returning undef is how it + # can signal that it gives up on making a link + } + $to = $there; + } + + #DEBUG and print STDERR "So far [", $to||'nil', "] [", $section||'nil', "]\n"; + + my $out = (defined $to and length $to) ? $to : ''; + $out .= "#" . $section if defined $section and length $section; + + unless(length $out) { # sanity check + DEBUG and printf STDERR "Oddly, couldn't resolve \"%s\" \"%s\"...\n", + $to || "(nil)", $section || "(nil)"; + return undef; + } + + DEBUG and print STDERR "Resolved to $out\n"; + return $out; +} + + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . + +sub section_escape { + my($self, $section) = @_; + return $self->section_url_escape( + $self->section_name_tidy($section) + ); +} + +sub section_name_tidy { + my($self, $section) = @_; + $section =~ s/^\s+//; + $section =~ s/\s+$//; + $section =~ tr/ /_/; + if ($] ge 5.006) { + $section =~ s/[[:cntrl:][:^ascii:]]//g; # drop crazy characters + } elsif ('A' eq chr(65)) { # But not on early EBCDIC + $section =~ tr/\x00-\x1F\x80-\x9F//d; + } + $section = $self->unicode_escape_url($section); + $section = '_' unless length $section; + return $section; +} + +sub section_url_escape { shift->general_url_escape(@_) } +sub pagepath_url_escape { shift->general_url_escape(@_) } +sub manpage_url_escape { shift->general_url_escape(@_) } + +sub general_url_escape { + my($self, $string) = @_; + + $string =~ s/([^\x00-\xFF])/join '', map sprintf('%%%02X',$_), unpack 'C*', $1/eg; + # express Unicode things as urlencode(utf(orig)). + + # A pretty conservative escaping, behoovey even for query components + # of a URL (see RFC 2396) + + if ($] ge 5.007_003) { + $string =~ s/([^-_\.!~*()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/sprintf('%%%02X',utf8::native_to_unicode(ord($1)))/eg; + } else { # Is broken for non-ASCII platforms on early perls + $string =~ s/([^-_\.!~*()abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/sprintf('%%%02X',ord($1))/eg; + } + # Yes, stipulate the list without a range, so that this can work right on + # all charsets that this module happens to run under. + + return $string; +} + +#-------------------------------------------------------------------------- +# +# Oh look, a yawning portal to Hell! Let's play touch football right by it! +# + +sub resolve_pod_page_link { + # resolve_pod_page_link must return a properly escaped URL + my $self = shift; + return $self->batch_mode() + ? $self->resolve_pod_page_link_batch_mode(@_) + : $self->resolve_pod_page_link_singleton_mode(@_) + ; +} + +sub resolve_pod_page_link_singleton_mode { + my($self, $it) = @_; + return undef unless defined $it and length $it; + my $url = $self->pagepath_url_escape($it); + + $url =~ s{::$}{}s; # probably never comes up anyway + $url =~ s{::}{/}g unless $self->perldoc_url_prefix =~ m/\?/s; # sane DWIM? + + return undef unless length $url; + return $self->perldoc_url_prefix . $url . $self->perldoc_url_postfix; +} + +sub resolve_pod_page_link_batch_mode { + my($self, $to) = @_; + DEBUG > 1 and print STDERR " During batch mode, resolving $to ...\n"; + my @path = grep length($_), split m/::/s, $to, -1; + unless( @path ) { # sanity + DEBUG and print STDERR "Very odd! Splitting $to gives (nil)!\n"; + return undef; + } + $self->batch_mode_rectify_path(\@path); + my $out = join('/', map $self->pagepath_url_escape($_), @path) + . $HTML_EXTENSION; + DEBUG > 1 and print STDERR " => $out\n"; + return $out; +} + +sub batch_mode_rectify_path { + my($self, $pathbits) = @_; + my $level = $self->batch_mode_current_level; + $level--; # how many levels up to go to get to the root + if($level < 1) { + unshift @$pathbits, '.'; # just to be pretty + } else { + unshift @$pathbits, ('..') x $level; + } + return; +} + +sub resolve_man_page_link { + my ($self, $to, $frag) = @_; + my ($page, $section) = $to =~ /^([^(]+)(?:[(](\d+)[)])?$/; + + return undef unless defined $page and length $page; + $section ||= 1; + + return $self->man_url_prefix . "$section/" + . $self->manpage_url_escape($page) + . $self->man_url_postfix; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub resolve_pod_link_by_table { + # A crazy hack to allow specifying custom L => URL mappings + + return unless $_[0]->{'podhtml_LOT'}; # An optimizy shortcut + + my($self, $to, $section) = @_; + + # TODO: add a method that actually populates podhtml_LOT from a file? + + if(defined $section) { + $to = '' unless defined $to and length $to; + return $self->{'podhtml_LOT'}{"$to#$section"}; # quite possibly undef! + } else { + return $self->{'podhtml_LOT'}{$to}; # quite possibly undef! + } + return; +} + +########################################################################### + +sub linearize_tokens { # self, tokens + my $self = shift; + my $out = ''; + + my $t; + while($t = shift @_) { + if(!ref $t or !UNIVERSAL::can($t, 'is_text')) { + $out .= $t; # a string, or some insane thing + } elsif($t->is_text) { + $out .= $t->text; + } elsif($t->is_start and $t->tag eq 'X') { + # Ignore until the end of this X<...> sequence: + my $x_open = 1; + while($x_open) { + next if( ($t = shift @_)->is_text ); + if( $t->is_start and $t->tag eq 'X') { ++$x_open } + elsif($t->is_end and $t->tag eq 'X') { --$x_open } + } + } + } + return undef if length $out > $Linearization_Limit; + return $out; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub unicode_escape_url { + my($self, $string) = @_; + $string =~ s/([^\x00-\xFF])/'('.ord($1).')'/eg; + # Turn char 1234 into "(1234)" + return $string; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +sub esc { # a function. + if(defined wantarray) { + if(wantarray) { + @_ = splice @_; # break aliasing + } else { + my $x = shift; + if ($] ge 5.007_003) { + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(utf8::native_to_unicode(ord($1))).';'/eg; + } else { # Is broken for non-ASCII platforms on early perls + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg; + } + return $x; + } + } + foreach my $x (@_) { + # Escape things very cautiously: + if (defined $x) { + if ($] ge 5.007_003) { + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(utf8::native_to_unicode(ord($1))).';'/eg + } else { # Is broken for non-ASCII platforms on early perls + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg + } + } + # Leave out "- so that "--" won't make it thru in X-generated comments + # with text in them. + + # Yes, stipulate the list without a range, so that this can work right on + # all charsets that this module happens to run under. + } + return @_; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +1; +__END__ + + +require 5; +use 5.008; +## Anything before 5.8.0 is GIMPY! +## This module is to be use()'d only by Pod::Simple::Transcode + +package Pod::Simple::TranscodeSmart; +use strict; +use Pod::Simple; +require Encode; +use vars qw($VERSION ); +$VERSION = '3.35'; + +sub is_dumb {0} +sub is_smart {1} + +sub all_encodings { + return Encode::->encodings(':all'); +} + +sub encoding_is_available { + return Encode::resolve_alias($_[1]); +} + +sub encmodver { + return "Encode.pm v" .($Encode::VERSION || '?'); +} + +sub make_transcoder { + my $e = Encode::find_encoding($_[1]); + die "WHAT ENCODING!?!?" unless $e; + my $x; + return sub { + foreach $x (@_) { + $x = $e->decode($x) unless Encode::is_utf8($x); + } + return; + }; +} + + +1; + + + +# A quite dimwitted pod2plaintext that need only know how to format whatever +# text comes out of Pod::BlackBox's _gen_errata + +require 5; +package Pod::Simple::Checker; +use strict; +use Carp (); +use Pod::Simple::Methody (); +use Pod::Simple (); +use vars qw( @ISA $VERSION ); +$VERSION = '3.35'; +@ISA = ('Pod::Simple::Methody'); +BEGIN { *DEBUG = defined(&Pod::Simple::DEBUG) + ? \&Pod::Simple::DEBUG + : sub() {0} + } + +use Text::Wrap 98.112902 (); # was 2001.0131, but I don't think we need that +$Text::Wrap::wrap = 'overflow'; +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub any_errata_seen { # read-only accessor + return $_[1]->{'Errata_seen'}; +} + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->nix_X_codes(1); + $new->nbsp_for_S(1); + $new->{'Thispara'} = ''; + $new->{'Indent'} = 0; + $new->{'Indentstring'} = ' '; + $new->{'Errata_seen'} = 0; + return $new; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub handle_text { $_[0]{'Errata_seen'} and $_[0]{'Thispara'} .= $_[1] } + +sub start_Para { $_[0]{'Thispara'} = '' } + +sub start_head1 { + if($_[0]{'Errata_seen'}) { + $_[0]{'Thispara'} = ''; + } else { + if($_[1]{'errata'}) { # start of errata! + $_[0]{'Errata_seen'} = 1; + $_[0]{'Thispara'} = $_[0]{'source_filename'} ? + "$_[0]{'source_filename'} -- " : '' + } + } +} +sub start_head2 { $_[0]{'Thispara'} = '' } +sub start_head3 { $_[0]{'Thispara'} = '' } +sub start_head4 { $_[0]{'Thispara'} = '' } + +sub start_Verbatim { $_[0]{'Thispara'} = '' } +sub start_item_bullet { $_[0]{'Thispara'} = '* ' } +sub start_item_number { $_[0]{'Thispara'} = "$_[1]{'number'}. " } +sub start_item_text { $_[0]{'Thispara'} = '' } + +sub start_over_bullet { ++$_[0]{'Indent'} } +sub start_over_number { ++$_[0]{'Indent'} } +sub start_over_text { ++$_[0]{'Indent'} } +sub start_over_block { ++$_[0]{'Indent'} } + +sub end_over_bullet { --$_[0]{'Indent'} } +sub end_over_number { --$_[0]{'Indent'} } +sub end_over_text { --$_[0]{'Indent'} } +sub end_over_block { --$_[0]{'Indent'} } + + +# . . . . . Now the actual formatters: + +sub end_head1 { $_[0]->emit_par(-4) } +sub end_head2 { $_[0]->emit_par(-3) } +sub end_head3 { $_[0]->emit_par(-2) } +sub end_head4 { $_[0]->emit_par(-1) } +sub end_Para { $_[0]->emit_par( 0) } +sub end_item_bullet { $_[0]->emit_par( 0) } +sub end_item_number { $_[0]->emit_par( 0) } +sub end_item_text { $_[0]->emit_par(-2) } + +sub emit_par { + return unless $_[0]{'Errata_seen'}; + my($self, $tweak_indent) = splice(@_,0,2); + my $indent = ' ' x ( 2 * $self->{'Indent'} + ($tweak_indent||0) ); + # Yes, 'STRING' x NEGATIVE gives '', same as 'STRING' x 0 + + $self->{'Thispara'} =~ s/$Pod::Simple::shy//g; + my $out = Text::Wrap::wrap($indent, $indent, $self->{'Thispara'} .= "\n"); + $out =~ s/$Pod::Simple::nbsp/ /g; + print {$self->{'output_fh'}} $out, + #"\n" + ; + $self->{'Thispara'} = ''; + + return; +} + +# . . . . . . . . . . And then off by its lonesome: + +sub end_Verbatim { + return unless $_[0]{'Errata_seen'}; + my $self = shift; + $self->{'Thispara'} =~ s/$Pod::Simple::nbsp/ /g; + $self->{'Thispara'} =~ s/$Pod::Simple::shy//g; + + my $i = ' ' x ( 2 * $self->{'Indent'} + 4); + + $self->{'Thispara'} =~ s/^/$i/mg; + + print { $self->{'output_fh'} } '', + $self->{'Thispara'}, + "\n\n" + ; + $self->{'Thispara'} = ''; + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + +__END__ + + +require 5; +package Pod::Simple::XMLOutStream; +use strict; +use Carp (); +use Pod::Simple (); +use vars qw( $ATTR_PAD @ISA $VERSION $SORT_ATTRS); +$VERSION = '3.35'; +BEGIN { + @ISA = ('Pod::Simple'); + *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG; +} + +$ATTR_PAD = "\n" unless defined $ATTR_PAD; + # Don't mess with this unless you know what you're doing. + +$SORT_ATTRS = 0 unless defined $SORT_ATTRS; + +sub new { + my $self = shift; + my $new = $self->SUPER::new(@_); + $new->{'output_fh'} ||= *STDOUT{IO}; + $new->keep_encoding_directive(1); + #$new->accept_codes('VerbatimFormatted'); + return $new; +} + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub _handle_element_start { + # ($self, $element_name, $attr_hash_r) + my $fh = $_[0]{'output_fh'}; + my($key, $value); + DEBUG and print STDERR "++ $_[1]\n"; + print $fh "<", $_[1]; + if($SORT_ATTRS) { + foreach my $key (sort keys %{$_[2]}) { + unless($key =~ m/^~/s) { + next if $key eq 'start_line' and $_[0]{'hide_line_numbers'}; + _xml_escape($value = $_[2]{$key}); + print $fh $ATTR_PAD, $key, '="', $value, '"'; + } + } + } else { # faster + while(($key,$value) = each %{$_[2]}) { + unless($key =~ m/^~/s) { + next if $key eq 'start_line' and $_[0]{'hide_line_numbers'}; + _xml_escape($value); + print $fh $ATTR_PAD, $key, '="', $value, '"'; + } + } + } + print $fh ">"; + return; +} + +sub _handle_text { + DEBUG and print STDERR "== \"$_[1]\"\n"; + if(length $_[1]) { + my $text = $_[1]; + _xml_escape($text); + print {$_[0]{'output_fh'}} $text; + } + return; +} + +sub _handle_element_end { + DEBUG and print STDERR "-- $_[1]\n"; + print {$_[0]{'output_fh'}} ""; + return; +} + +# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ + +sub _xml_escape { + foreach my $x (@_) { + # Escape things very cautiously: + if ($] ge 5.007_003) { + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(utf8::native_to_unicode(ord($1))).';'/eg; + } else { # Is broken for non-ASCII platforms on early perls + $x =~ s/([^-\n\t !\#\$\%\(\)\*\+,\.\~\/\:\;=\?\@\[\\\]\^_\`\{\|\}abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789])/'&#'.(ord($1)).';'/eg; + } + # Yes, stipulate the list without a range, so that this can work right on + # all charsets that this module happens to run under. + } + return; +} + +#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +1; + +__END__ + + +require 5; +package Pod::Simple::HTMLLegacy; +use strict; + +use vars qw($VERSION); +use Getopt::Long; + +$VERSION = "5.01"; + +#-------------------------------------------------------------------------- +# +# This class is meant to thinly emulate bad old Pod::Html +# +# TODO: some basic docs + +sub pod2html { + my @args = (@_); + + my( $verbose, $infile, $outfile, $title ); + my $index = 1; + + { + my($help); + + my($netscape); # dummy + local @ARGV = @args; + GetOptions( + "help" => \$help, + "verbose!" => \$verbose, + "infile=s" => \$infile, + "outfile=s" => \$outfile, + "title=s" => \$title, + "index!" => \$index, + + "netscape!" => \$netscape, + ) or return bad_opts(@args); + bad_opts(@args) if @ARGV; # it should be all switches! + return help_message() if $help; + } + + for($infile, $outfile) { $_ = undef unless defined and length } + + if($verbose) { + warn sprintf "%s version %s\n", __PACKAGE__, $VERSION; + warn "OK, processed args [@args] ...\n"; + warn sprintf + " Verbose: %s\n Index: %s\n Infile: %s\n Outfile: %s\n Title: %s\n", + map defined($_) ? $_ : "(nil)", + $verbose, $index, $infile, $outfile, $title, + ; + *Pod::Simple::HTML::DEBUG = sub(){1}; + } + require Pod::Simple::HTML; + Pod::Simple::HTML->VERSION(3); + + die "No such input file as $infile\n" + if defined $infile and ! -e $infile; + + + my $pod = Pod::Simple::HTML->new; + $pod->force_title($title) if defined $title; + $pod->index($index); + return $pod->parse_from_file($infile, $outfile); +} + +#-------------------------------------------------------------------------- + +sub bad_opts { die _help_message(); } +sub help_message { print STDOUT _help_message() } + +#-------------------------------------------------------------------------- + +sub _help_message { + + join '', + +"[", __PACKAGE__, " version ", $VERSION, qq~] +Usage: pod2html --help --infile= --outfile= + --verbose --index --noindex + +Options: + --help - prints this message. + --[no]index - generate an index at the top of the resulting html + (default behavior). + --infile - filename for the pod to convert (input taken from stdin + by default). + --outfile - filename for the resulting html file (output sent to + stdout by default). + --title - title that will appear in resulting html file. + --[no]verbose - self-explanatory (off by default). + +Note that pod2html is DEPRECATED, and this version implements only + some of the options known to older versions. +For more information, see 'perldoc pod2html'. +~; + +} + +1; +__END__ + +OVER the underpass! UNDER the overpass! Around the FUTURE and BEYOND REPAIR!! + + +require 5; +package Pod::Simple::PullParserTextToken; +use Pod::Simple::PullParserToken (); +use strict; +use vars qw(@ISA $VERSION); +@ISA = ('Pod::Simple::PullParserToken'); +$VERSION = '3.35'; + +sub new { # Class->new(text); + my $class = shift; + return bless ['text', @_], ref($class) || $class; +} + +# Purely accessors: + +sub text { (@_ == 2) ? ($_[0][1] = $_[1]) : $_[0][1] } + +sub text_r { \ $_[0][1] } + +1; + +__END__ + + +require 5; +package Pod::Simple::Transcode; +use strict; +use vars qw($VERSION @ISA); +$VERSION = '3.35'; + +BEGIN { + if(defined &DEBUG) {;} # Okay + elsif( defined &Pod::Simple::DEBUG ) { *DEBUG = \&Pod::Simple::DEBUG; } + else { *DEBUG = sub () {0}; } +} + +foreach my $class ( + 'Pod::Simple::TranscodeSmart', + 'Pod::Simple::TranscodeDumb', + '', +) { + $class or die "Couldn't load any encoding classes"; + DEBUG and print STDERR "About to try loading $class...\n"; + eval "require $class;"; + if($@) { + DEBUG and print STDERR "Couldn't load $class: $@\n"; + } else { + DEBUG and print STDERR "OK, loaded $class.\n"; + @ISA = ($class); + last; + } +} + +sub _blorp { return; } # just to avoid any "empty class" warning + +1; +__END__ + + + +require 5; +package Pod::Simple::SimpleTree; +use strict; +use Carp (); +use Pod::Simple (); +use vars qw( $ATTR_PAD @ISA $VERSION $SORT_ATTRS); +$VERSION = '3.35'; +BEGIN { + @ISA = ('Pod::Simple'); + *DEBUG = \&Pod::Simple::DEBUG unless defined &DEBUG; +} + +__PACKAGE__->_accessorize( + 'root', # root of the tree +); + +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +sub _handle_element_start { # self, tagname, attrhash + DEBUG > 2 and print STDERR "Handling $_[1] start-event\n"; + my $x = [$_[1], $_[2]]; + if($_[0]{'_currpos'}) { + push @{ $_[0]{'_currpos'}[0] }, $x; # insert in parent's child-list + unshift @{ $_[0]{'_currpos'} }, $x; # prefix to stack + } else { + DEBUG and print STDERR " And oo, it gets to be root!\n"; + $_[0]{'_currpos'} = [ $_[0]{'root'} = $x ]; + # first event! set to stack, and set as root. + } + DEBUG > 3 and print STDERR "Stack is now: ", + join(">", map $_->[0], @{$_[0]{'_currpos'}}), "\n"; + return; +} + +sub _handle_element_end { # self, tagname + DEBUG > 2 and print STDERR "Handling $_[1] end-event\n"; + shift @{$_[0]{'_currpos'}}; + DEBUG > 3 and print STDERR "Stack is now: ", + join(">", map $_->[0], @{$_[0]{'_currpos'}}), "\n"; + return; +} + +sub _handle_text { # self, text + DEBUG > 2 and print STDERR "Handling $_[1] text-event\n"; + push @{ $_[0]{'_currpos'}[0] }, $_[1]; + return; +} + + +# A bit of evil from the black box... please avert your eyes, kind souls. +sub _traverse_treelet_bit { + DEBUG > 2 and print STDERR "Handling $_[1] paragraph event\n"; + my $self = shift; + push @{ $self->{'_currpos'}[0] }, [@_]; + return; +} +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +1; +__END__ + + +require 5; +package Pod::Simple::PullParserToken; + # Base class for tokens gotten from Pod::Simple::PullParser's $parser->get_token +@ISA = (); +$VERSION = '3.35'; +use strict; + +sub new { # Class->new('type', stuff...); ## Overridden in derived classes anyway + my $class = shift; + return bless [@_], ref($class) || $class; +} + +sub type { $_[0][0] } # Can't change the type of an object +sub dump { Pod::Simple::pretty( [ @{ $_[0] } ] ) } + +sub is_start { $_[0][0] eq 'start' } +sub is_end { $_[0][0] eq 'end' } +sub is_text { $_[0][0] eq 'text' } + +1; +__END__ + +sub dump { '[' . _esc( @{ $_[0] } ) . ']' } + +# JUNK: + +sub _esc { + return '' unless @_; + my @out; + foreach my $in (@_) { + push @out, '"' . $in . '"'; + $out[-1] =~ s/([^- \:\:\.\,\'\>\<\"\/\=\?\+\|\[\]\{\}\_a-zA-Z0-9_\`\~\!\#\%\^\&\*\(\)])/ + sprintf( (ord($1) < 256) ? "\\x%02X" : "\\x{%X}", ord($1)) + /eg; + } + return join ', ', @out; +} + + +__END__ + + +require 5; +## This module is to be use()'d only by Pod::Simple::Transcode + +package Pod::Simple::TranscodeDumb; +use strict; +use vars qw($VERSION %Supported); +$VERSION = '3.35'; +# This module basically pretends it knows how to transcode, except +# only for null-transcodings! We use this when Encode isn't +# available. + +%Supported = ( + 'ascii' => 1, + 'ascii-ctrl' => 1, + 'iso-8859-1' => 1, + 'cp1252' => 1, + 'null' => 1, + 'latin1' => 1, + 'latin-1' => 1, + %Supported, +); + +sub is_dumb {1} +sub is_smart {0} + +sub all_encodings { + return sort keys %Supported; +} + +sub encoding_is_available { + return exists $Supported{lc $_[1]}; +} + +sub encmodver { + return __PACKAGE__ . " v" .($VERSION || '?'); +} + +sub make_transcoder { + my ($e) = $_[1]; + die "WHAT ENCODING!?!?" unless $e; + # No-op for all but CP1252. + return sub {;} if $e !~ /^cp-?1252$/i; + + # Replace CP1252 nerbles with their ASCII equivalents. + return sub { + # Copied from Encode::ZapCP1252. + my %ascii_for = ( + # http://en.wikipedia.org/wiki/Windows-1252 + "\x80" => 'e', # EURO SIGN + "\x82" => ',', # SINGLE LOW-9 QUOTATION MARK + "\x83" => 'f', # LATIN SMALL LETTER F WITH HOOK + "\x84" => ',,', # DOUBLE LOW-9 QUOTATION MARK + "\x85" => '...', # HORIZONTAL ELLIPSIS + "\x86" => '+', # DAGGER + "\x87" => '++', # DOUBLE DAGGER + "\x88" => '^', # MODIFIER LETTER CIRCUMFLEX ACCENT + "\x89" => '%', # PER MILLE SIGN + "\x8a" => 'S', # LATIN CAPITAL LETTER S WITH CARON + "\x8b" => '<', # SINGLE LEFT-POINTING ANGLE QUOTATION MARK + "\x8c" => 'OE', # LATIN CAPITAL LIGATURE OE + "\x8e" => 'Z', # LATIN CAPITAL LETTER Z WITH CARON + "\x91" => "'", # LEFT SINGLE QUOTATION MARK + "\x92" => "'", # RIGHT SINGLE QUOTATION MARK + "\x93" => '"', # LEFT DOUBLE QUOTATION MARK + "\x94" => '"', # RIGHT DOUBLE QUOTATION MARK + "\x95" => '*', # BULLET + "\x96" => '-', # EN DASH + "\x97" => '--', # EM DASH + "\x98" => '~', # SMALL TILDE + "\x99" => '(tm)', # TRADE MARK SIGN + "\x9a" => 's', # LATIN SMALL LETTER S WITH CARON + "\x9b" => '>', # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK + "\x9c" => 'oe', # LATIN SMALL LIGATURE OE + "\x9e" => 'z', # LATIN SMALL LETTER Z WITH CARON + "\x9f" => 'Y', # LATIN CAPITAL LETTER Y WITH DIAERESIS + ); + + s{([\x80-\x9f])}{$ascii_for{$1} || $1}emxsg for @_; + }; +} + + +1; + + +package Pod::Perldoc::ToChecker; +use strict; +use warnings; +use vars qw(@ISA); + +use vars qw($VERSION); +$VERSION = '3.28'; + +# Pick our superclass... +# +eval 'require Pod::Simple::Checker'; +if($@) { + require Pod::Checker; + @ISA = ('Pod::Checker'); +} else { + @ISA = ('Pod::Simple::Checker'); +} + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +sub if_zero_length { + my( $self, $file, $tmp, $tmpfd ) = @_; + print "No Pod errors in $file\n"; +} + + +1; + +__END__ + + +package Pod::Perldoc::ToRtf; +use strict; +use warnings; +use parent qw( Pod::Simple::RTF ); + +use vars qw($VERSION); +$VERSION = '3.28'; + +sub is_pageable { 0 } +sub write_with_binmode { 0 } +sub output_extension { 'rtf' } + +sub page_for_perldoc { + my($self, $tempfile, $perldoc) = @_; + return unless $perldoc->IS_MSWin32; + + my $rtf_pager = $ENV{'RTFREADER'} || 'write.exe'; + + $perldoc->aside( "About to launch <\"$rtf_pager\" \"$tempfile\">\n" ); + + return 1 if system( qq{"$rtf_pager"}, qq{"$tempfile"} ) == 0; + return 0; +} + +1; +__END__ + + +package Pod::Perldoc::ToText; +use strict; +use warnings; + +use vars qw($VERSION); +$VERSION = '3.28'; + +use parent qw(Pod::Perldoc::BaseTo); + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +use Pod::Text (); + +sub alt { shift->_perldoc_elem('alt' , @_) } +sub indent { shift->_perldoc_elem('indent' , @_) } +sub loose { shift->_perldoc_elem('loose' , @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub sentence { shift->_perldoc_elem('sentence', @_) } +sub width { shift->_perldoc_elem('width' , @_) } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my $self = shift; + + my @options = + map {; $_, $self->{$_} } + grep !m/^_/s, + keys %$self + ; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to call new Pod::Text ", + $Pod::Text::VERSION ? "(v$Pod::Text::VERSION) " : '', + "with options: ", + @options ? "[@options]" : "(nil)", "\n"; + ; + + Pod::Text->new(@options)->parse_from_file(@_); +} + +1; + + +package Pod::Perldoc::ToANSI; +use strict; +use warnings; +use parent qw(Pod::Perldoc::BaseTo); + +use vars qw($VERSION); +$VERSION = '3.28'; + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +use Pod::Text::Color (); + +sub alt { shift->_perldoc_elem('alt' , @_) } +sub indent { shift->_perldoc_elem('indent' , @_) } +sub loose { shift->_perldoc_elem('loose' , @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub sentence { shift->_perldoc_elem('sentence', @_) } +sub width { shift->_perldoc_elem('width' , @_) } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my $self = shift; + + my @options = + map {; $_, $self->{$_} } + grep !m/^_/s, + keys %$self + ; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to call new Pod::Text::Color ", + $Pod::Text::VERSION ? "(v$Pod::Text::VERSION) " : '', + "with options: ", + @options ? "[@options]" : "(nil)", "\n"; + ; + + Pod::Text::Color->new(@options)->parse_from_file(@_); +} + +1; + +package Pod::Perldoc::ToXml; +use strict; +use warnings; +use vars qw($VERSION); + +use parent qw( Pod::Simple::XMLOutStream ); + +use vars qw($VERSION); +$VERSION = '3.28'; + +sub is_pageable { 0 } +sub write_with_binmode { 0 } +sub output_extension { 'xml' } + +1; +__END__ + + +package Pod::Perldoc::GetOptsOO; +use strict; + +use vars qw($VERSION); +$VERSION = '3.28'; + +BEGIN { # Make a DEBUG constant ASAP + *DEBUG = defined( &Pod::Perldoc::DEBUG ) + ? \&Pod::Perldoc::DEBUG + : sub(){10}; +} + + +sub getopts { + my($target, $args, $truth) = @_; + + $args ||= \@ARGV; + + $target->aside( + "Starting switch processing. Scanning arguments [@$args]\n" + ) if $target->can('aside'); + + return unless @$args; + + $truth = 1 unless @_ > 2; + + DEBUG > 3 and print " Truth is $truth\n"; + + + my $error_count = 0; + + while( @$args and ($_ = $args->[0]) =~ m/^-(.)(.*)/s ) { + my($first,$rest) = ($1,$2); + if ($_ eq '--') { # early exit if "--" + shift @$args; + last; + } + if ($first eq '-' and $rest) { # GNU style long param names + ($first, $rest) = split '=', $rest, 2; + } + my $method = "opt_${first}_with"; + if( $target->can($method) ) { # it's argumental + if($rest eq '') { # like -f bar + shift @$args; + $target->warn( "Option $first needs a following argument!\n" ) unless @$args; + $rest = shift @$args; + } else { # like -fbar (== -f bar) + shift @$args; + } + + DEBUG > 3 and print " $method => $rest\n"; + $target->$method( $rest ); + + # Otherwise, it's not argumental... + } else { + + if( $target->can( $method = "opt_$first" ) ) { + DEBUG > 3 and print " $method is true ($truth)\n"; + $target->$method( $truth ); + + # Otherwise it's an unknown option... + + } elsif( $target->can('handle_unknown_option') ) { + DEBUG > 3 + and print " calling handle_unknown_option('$first')\n"; + + $error_count += ( + $target->handle_unknown_option( $first ) || 0 + ); + + } else { + ++$error_count; + $target->warn( "Unknown option: $first\n" ); + } + + if($rest eq '') { # like -f + shift @$args + } else { # like -fbar (== -f -bar ) + DEBUG > 2 and print " Setting args->[0] to \"-$rest\"\n"; + $args->[0] = "-$rest"; + } + } + } + + + $target->aside( + "Ending switch processing. Args are [@$args] with $error_count errors.\n" + ) if $target->can('aside'); + + $error_count == 0; +} + +1; + +__END__ + +package Pod::Perldoc::ToNroff; +use strict; +use warnings; +use parent qw(Pod::Perldoc::BaseTo); + +use vars qw($VERSION); +$VERSION = '3.28'; + +# This is unlike ToMan.pm in that it emits the raw nroff source! + +sub is_pageable { 1 } # well, if you ask for it... +sub write_with_binmode { 0 } +sub output_extension { 'man' } + +use Pod::Man (); + +sub center { shift->_perldoc_elem('center' , @_) } +sub date { shift->_perldoc_elem('date' , @_) } +sub fixed { shift->_perldoc_elem('fixed' , @_) } +sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) } +sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) } +sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub release { shift->_perldoc_elem('release' , @_) } +sub section { shift->_perldoc_elem('section' , @_) } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my $self = shift; + my $file = $_[0]; + + my @options = + map {; $_, $self->{$_} } + grep !m/^_/s, + keys %$self + ; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to call new Pod::Man ", + $Pod::Man::VERSION ? "(v$Pod::Man::VERSION) " : '', + "with options: ", + @options ? "[@options]" : "(nil)", "\n"; + ; + + Pod::Man->new(@options)->parse_from_file(@_); +} + +1; +__END__ + + +package Pod::Perldoc::ToTerm; +use strict; +use warnings; + +use vars qw($VERSION); +$VERSION = '3.28'; + +use parent qw(Pod::Perldoc::BaseTo); + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +use Pod::Text::Termcap (); + +sub alt { shift->_perldoc_elem('alt' , @_) } +sub indent { shift->_perldoc_elem('indent' , @_) } +sub loose { shift->_perldoc_elem('loose' , @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub sentence { shift->_perldoc_elem('sentence', @_) } +sub width { + my $self = shift; + $self->_perldoc_elem('width' , @_) || + $self->_get_columns_from_manwidth || + $self->_get_columns_from_stty || + $self->_get_default_width; +} + +sub pager_configuration { + my($self, $pager, $perldoc) = @_; + + # do not modify anything on Windows or DOS + return if ( $perldoc->is_mswin32 || $perldoc->is_dos ); + + if ( $pager =~ /less/ ) { + $self->_maybe_modify_environment('LESS'); + } + elsif ( $pager =~ /more/ ) { + $self->_maybe_modify_environment('MORE'); + } + + return; +} + +sub _maybe_modify_environment { + my($self, $name) = @_; + + if ( ! defined $ENV{$name} ) { + $ENV{$name} = "-R"; + } + + # if the environment is set, don't modify + # anything + +} + +sub _get_stty { `stty -a` } + +sub _get_columns_from_stty { + my $output = $_[0]->_get_stty; + + if( $output =~ /\bcolumns\s+(\d+)/ ) { return $1; } + elsif( $output =~ /;\s*(\d+)\s+columns;/ ) { return $1; } + else { return 0 } + } + +sub _get_columns_from_manwidth { + my( $self ) = @_; + + return 0 unless defined $ENV{MANWIDTH}; + + unless( $ENV{MANWIDTH} =~ m/\A\d+\z/ ) { + $self->warn( "Ignoring non-numeric MANWIDTH ($ENV{MANWIDTH})\n" ); + return 0; + } + + if( $ENV{MANWIDTH} == 0 ) { + $self->warn( "Ignoring MANWIDTH of 0. Really? Why even run the program? :)\n" ); + return 0; + } + + if( $ENV{MANWIDTH} =~ m/\A(\d+)\z/ ) { return $1 } + + return 0; + } + +sub _get_default_width { + 76 + } + + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my $self = shift; + + $self->{width} = $self->width(); + + my @options = + map {; $_, $self->{$_} } + grep !m/^_/s, + keys %$self + ; + + defined(&Pod::Perldoc::DEBUG) + and Pod::Perldoc::DEBUG() + and print "About to call new Pod::Text::Termcap ", + $Pod::Text::VERSION ? "(v$Pod::Text::Termcap::VERSION) " : '', + "with options: ", + @options ? "[@options]" : "(nil)", "\n"; + ; + + Pod::Text::Termcap->new(@options)->parse_from_file(@_); +} + +1; + +package Pod::Perldoc::ToPod; +use strict; +use warnings; +use parent qw(Pod::Perldoc::BaseTo); + +use vars qw($VERSION); +$VERSION = '3.28'; + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'pod' } + +sub new { return bless {}, ref($_[0]) || $_[0] } + +sub parse_from_file { + my( $self, $in, $outfh ) = @_; + + open(IN, "<", $in) or $self->die( "Can't read-open $in: $!\nAborting" ); + + my $cut_mode = 1; + + # A hack for finding things between =foo and =cut, inclusive + local $_; + while () { + if( m/^=(\w+)/s ) { + if($cut_mode = ($1 eq 'cut')) { + print $outfh "\n=cut\n\n"; + # Pass thru the =cut line with some harmless + # (and occasionally helpful) padding + } + } + next if $cut_mode; + print $outfh $_ or $self->die( "Can't print to $outfh: $!" ); + } + + close IN or $self->die( "Can't close $in: $!" ); + return; +} + +1; +__END__ + + +package Pod::Perldoc::ToTk; +use strict; +use warnings; + +use vars qw($VERSION); +$VERSION = '3.28'; + +use parent qw(Pod::Perldoc::BaseTo); + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } # doesn't matter +sub if_zero_length { } # because it will be 0-length! +sub new { return bless {}, ref($_[0]) || $_[0] } + +# TODO: document these and their meanings... +sub tree { shift->_perldoc_elem('tree' , @_) } +sub tk_opt { shift->_perldoc_elem('tk_opt' , @_) } +sub forky { shift->_perldoc_elem('forky' , @_) } + +use Pod::Perldoc (); +use File::Spec::Functions qw(catfile); + +BEGIN{ # Tk is not core, but this is + eval { require Tk } || + __PACKAGE__->die( <<"HERE" ); +You must have the Tk module to use Pod::Perldoc::ToTk. +If you have it installed, ensure it's in your Perl library +path. +HERE + + __PACKAGE__->die( + __PACKAGE__, + " doesn't work nice with Tk.pm version $Tk::VERSION" + ) if $Tk::VERSION eq '800.003'; + } + + +BEGIN { eval { require Tk::FcyEntry; }; }; +BEGIN{ # Tk::Pod is not core, but this is + eval { require Tk::Pod } || + __PACKAGE__->die( <<"HERE" ); +You must have the Tk::Pod module to use Pod::Perldoc::ToTk. +If you have it installed, ensure it's in your Perl library +path. +HERE + } + +# The following was adapted from "tkpod" in the Tk-Pod dist. + +sub parse_from_file { + + my($self, $Input_File) = @_; + if($self->{'forky'}) { + return if fork; # i.e., parent process returns + } + + $Input_File =~ s{\\}{/}g + if $self->is_mswin32 or $self->is_dos + # and maybe OS/2 + ; + + my($tk_opt, $tree); + $tree = $self->{'tree' }; + $tk_opt = $self->{'tk_opt'}; + + #require Tk::ErrorDialog; + + # Add 'Tk' subdirectories to search path so, e.g., + # 'Scrolled' will find doc in 'Tk/Scrolled' + + if( $tk_opt ) { + push @INC, grep -d $_, map catfile($_,'Tk'), @INC; + } + + my $mw = MainWindow->new(); + #eval 'use blib "/home/e/eserte/src/perl/Tk-App";require Tk::App::Debug'; + $mw->withdraw; + + # CDE use Font Settings if available + my $ufont = $mw->optionGet('userFont','UserFont'); # fixed width + my $sfont = $mw->optionGet('systemFont','SystemFont'); # proportional + if (defined($ufont) and defined($sfont)) { + foreach ($ufont, $sfont) { s/:$//; }; + $mw->optionAdd('*Font', $sfont); + $mw->optionAdd('*Entry.Font', $ufont); + $mw->optionAdd('*Text.Font', $ufont); + } + + $mw->optionAdd('*Menu.tearOff', $Tk::platform ne 'MSWin32' ? 1 : 0); + + $mw->Pod( + '-file' => $Input_File, + (($Tk::Pod::VERSION >= 4) ? ('-tree' => $tree) : ()) + )->focusNext; + + # xxx dirty but it works. A simple $mw->destroy if $mw->children + # does not work because Tk::ErrorDialogs could be created. + # (they are withdrawn after Ok instead of destory'ed I guess) + + if ($mw->children) { + $mw->repeat(1000, sub { + # ErrorDialog is withdrawn not deleted :-( + foreach ($mw->children) { + return if "$_" =~ /^Tk::Pod/ # ->isa('Tk::Pod') + } + $mw->destroy; + }); + } else { + $mw->destroy; + } + #$mw->WidgetDump; + MainLoop(); + + exit if $self->{'forky'}; # we were the child! so exit now! + return; +} + +1; +__END__ + + + +package Pod::Perldoc::BaseTo; +use strict; +use warnings; + +use vars qw($VERSION); +$VERSION = '3.28'; + +use Carp qw(croak carp); +use Config qw(%Config); +use File::Spec::Functions qw(catfile); + +sub is_pageable { '' } +sub write_with_binmode { 1 } + +sub output_extension { 'txt' } # override in subclass! + +# sub new { my $self = shift; ... } +# sub parse_from_file( my($class, $in, $out) = ...; ... } + +#sub new { return bless {}, ref($_[0]) || $_[0] } + +# this is also in Perldoc.pm, but why look there when you're a +# subclass of this? +sub TRUE () {1} +sub FALSE () {return} + +BEGIN { + *is_vms = $^O eq 'VMS' ? \&TRUE : \&FALSE unless defined &is_vms; + *is_mswin32 = $^O eq 'MSWin32' ? \&TRUE : \&FALSE unless defined &is_mswin32; + *is_dos = $^O eq 'dos' ? \&TRUE : \&FALSE unless defined &is_dos; + *is_os2 = $^O eq 'os2' ? \&TRUE : \&FALSE unless defined &is_os2; + *is_cygwin = $^O eq 'cygwin' ? \&TRUE : \&FALSE unless defined &is_cygwin; + *is_linux = $^O eq 'linux' ? \&TRUE : \&FALSE unless defined &is_linux; + *is_hpux = $^O =~ m/hpux/ ? \&TRUE : \&FALSE unless defined &is_hpux; + *is_openbsd = $^O =~ m/openbsd/ ? \&TRUE : \&FALSE unless defined &is_openbsd; + *is_freebsd = $^O =~ m/freebsd/ ? \&TRUE : \&FALSE unless defined &is_freebsd; + *is_bitrig = $^O =~ m/bitrig/ ? \&TRUE : \&FALSE unless defined &is_bitrig; +} + +sub _perldoc_elem { + my($self, $name) = splice @_,0,2; + if(@_) { + $self->{$name} = $_[0]; + } else { + $self->{$name}; + } +} + +sub debugging { + my( $self, @messages ) = @_; + + ( defined(&Pod::Perldoc::DEBUG) and &Pod::Perldoc::DEBUG() ) + } + +sub debug { + my( $self, @messages ) = @_; + return unless $self->debugging; + print STDERR map { "DEBUG $_" } @messages; + } + +sub warn { + my( $self, @messages ) = @_; + carp join "\n", @messages, ''; + } + +sub die { + my( $self, @messages ) = @_; + croak join "\n", @messages, ''; + } + +sub _get_path_components { + my( $self ) = @_; + + my @paths = split /\Q$Config{path_sep}/, $ENV{PATH}; + + return @paths; + } + +sub _find_executable_in_path { + my( $self, $program ) = @_; + + my @found = (); + foreach my $dir ( $self->_get_path_components ) { + my $binary = catfile( $dir, $program ); + $self->debug( "Looking for $binary\n" ); + next unless -e $binary; + unless( -x $binary ) { + $self->warn( "Found $binary but it's not executable. Skipping.\n" ); + next; + } + $self->debug( "Found $binary\n" ); + push @found, $binary; + } + + return @found; + } + +1; + +__END__ + +require 5.006; +package Pod::Perldoc::ToMan; +use strict; +use warnings; +use parent qw(Pod::Perldoc::BaseTo); + +use vars qw($VERSION); +$VERSION = '3.28'; + +use File::Spec::Functions qw(catfile); +use Pod::Man 2.18; +# This class is unlike ToText.pm et al, because we're NOT paging thru +# the output in our particular format -- we make the output and +# then we run nroff (or whatever) on it, and then page thru the +# (plaintext) output of THAT! + +sub SUCCESS () { 1 } +sub FAILED () { 0 } + +sub is_pageable { 1 } +sub write_with_binmode { 0 } +sub output_extension { 'txt' } + +sub __filter_nroff { shift->_perldoc_elem('__filter_nroff' , @_) } +sub __nroffer { shift->_perldoc_elem('__nroffer' , @_) } +sub __bindir { shift->_perldoc_elem('__bindir' , @_) } +sub __pod2man { shift->_perldoc_elem('__pod2man' , @_) } +sub __output_file { shift->_perldoc_elem('__output_file' , @_) } + +sub center { shift->_perldoc_elem('center' , @_) } +sub date { shift->_perldoc_elem('date' , @_) } +sub fixed { shift->_perldoc_elem('fixed' , @_) } +sub fixedbold { shift->_perldoc_elem('fixedbold' , @_) } +sub fixeditalic { shift->_perldoc_elem('fixeditalic' , @_) } +sub fixedbolditalic { shift->_perldoc_elem('fixedbolditalic', @_) } +sub name { shift->_perldoc_elem('name' , @_) } +sub quotes { shift->_perldoc_elem('quotes' , @_) } +sub release { shift->_perldoc_elem('release' , @_) } +sub section { shift->_perldoc_elem('section' , @_) } + +sub new { + my( $either ) = shift; + my $self = bless {}, ref($either) || $either; + $self->init( @_ ); + return $self; + } + +sub init { + my( $self, @args ) = @_; + + unless( $self->__nroffer ) { + my $roffer = $self->_find_roffer( $self->_roffer_candidates ); + $self->debug( "Using $roffer\n" ); + $self->__nroffer( $roffer ); + } + else { + $self->debug( "__nroffer is " . $self->__nroffer() . "\n" ); + } + + $self->_check_nroffer; + } + +sub _roffer_candidates { + my( $self ) = @_; + + if( $self->is_openbsd || $self->is_freebsd || $self->is_bitrig ) { qw( mandoc groff nroff ) } + else { qw( groff nroff mandoc ) } + } + +sub _find_roffer { + my( $self, @candidates ) = @_; + + my @found = (); + foreach my $candidate ( @candidates ) { + push @found, $self->_find_executable_in_path( $candidate ); + } + + return wantarray ? @found : $found[0]; + } + +sub _check_nroffer { + return 1; + # where is it in the PATH? + + # is it executable? + + # what is its real name? + + # what is its version? + + # does it support the flags we need? + + # is it good enough for us? + } + +sub _get_stty { `stty -a` } + +sub _get_columns_from_stty { + my $output = $_[0]->_get_stty; + + if( $output =~ /\bcolumns\s+(\d+)/ ) { return $1 } + elsif( $output =~ /;\s*(\d+)\s+columns;/ ) { return $1 } + else { return 0 } + } + +sub _get_columns_from_manwidth { + my( $self ) = @_; + + return 0 unless defined $ENV{MANWIDTH}; + + unless( $ENV{MANWIDTH} =~ m/\A\d+\z/ ) { + $self->warn( "Ignoring non-numeric MANWIDTH ($ENV{MANWIDTH})\n" ); + return 0; + } + + if( $ENV{MANWIDTH} == 0 ) { + $self->warn( "Ignoring MANWIDTH of 0. Really? Why even run the program? :)\n" ); + return 0; + } + + if( $ENV{MANWIDTH} =~ m/\A(\d+)\z/ ) { return $1 } + + return 0; + } + +sub _get_default_width { + 73 + } + +sub _get_columns { + $_[0]->_get_columns_from_manwidth || + $_[0]->_get_columns_from_stty || + $_[0]->_get_default_width; + } + +sub _get_podman_switches { + my( $self ) = @_; + + my @switches = map { $_, $self->{$_} } grep !m/^_/s, keys %$self; + + # There needs to be a cleaner way to handle setting + # the UTF-8 flag, but for now, comment out this + # line because it often does the wrong thing. + # + # See RT #77465 + # + #push @switches, 'utf8' => 1; + + $self->debug( "Pod::Man switches are [@switches]\n" ); + + return @switches; + } + +sub _parse_with_pod_man { + my( $self, $file ) = @_; + + #->output_fh and ->output_string from Pod::Simple aren't + # working, apparently, so there's this ugly hack: + local *STDOUT; + open STDOUT, '>', $self->{_text_ref}; + my $parser = Pod::Man->new( $self->_get_podman_switches ); + $self->debug( "Parsing $file\n" ); + $parser->parse_from_file( $file ); + $self->debug( "Done parsing $file\n" ); + close STDOUT; + + $self->die( "No output from Pod::Man!\n" ) + unless length $self->{_text_ref}; + + $self->_save_pod_man_output if $self->debugging; + + return SUCCESS; + } + +sub _save_pod_man_output { + my( $self, $fh ) = @_; + + $fh = do { + my $file = "podman.out.$$.txt"; + $self->debug( "Writing $file with Pod::Man output\n" ); + open my $fh2, '>', $file; + $fh2; + } unless $fh; + + print { $fh } ${ $self->{_text_ref} }; + } + +sub _have_groff_with_utf8 { + my( $self ) = @_; + + return 0 unless $self->_is_groff; + my $roffer = $self->__nroffer; + + my $minimum_groff_version = '1.20.1'; + + my $version_string = `$roffer -v`; + my( $version ) = $version_string =~ /\(?groff\)? version (\d+\.\d+(?:\.\d+)?)/; + $self->debug( "Found groff $version\n" ); + + # is a string comparison good enough? + if( $version lt $minimum_groff_version ) { + $self->warn( + "You have an old groff." . + " Update to version $minimum_groff_version for good Unicode support.\n" . + "If you don't upgrade, wide characters may come out oddly.\n" + ); + } + + $version ge $minimum_groff_version; + } + +sub _have_mandoc_with_utf8 { + my( $self ) = @_; + + $self->_is_mandoc and not system 'mandoc -Tlocale -V > /dev/null 2>&1'; + } + +sub _collect_nroff_switches { + my( $self ) = shift; + + my @render_switches = ('-man', $self->_get_device_switches); + + # Thanks to Brendan O'Dea for contributing the following block + if( $self->_is_roff and -t STDOUT and my ($cols) = $self->_get_columns ) { + my $c = $cols * 39 / 40; + $cols = $c > $cols - 2 ? $c : $cols -2; + push @render_switches, '-rLL=' . (int $c) . 'n' if $cols > 80; + } + + # I hear persistent reports that adding a -c switch to $render + # solves many people's problems. But I also hear that some mans + # don't have a -c switch, so that unconditionally adding it here + # would presumably be a Bad Thing -- sburke@cpan.org + push @render_switches, '-c' if( $self->_is_roff and $self->is_cygwin ); + + return @render_switches; + } + +sub _get_device_switches { + my( $self ) = @_; + + if( $self->_is_nroff ) { qw() } + elsif( $self->_have_groff_with_utf8 ) { qw(-Kutf8 -Tutf8) } + elsif( $self->_is_ebcdic ) { qw(-Tcp1047) } + elsif( $self->_have_mandoc_with_utf8 ) { qw(-Tlocale) } + elsif( $self->_is_mandoc ) { qw() } + else { qw(-Tlatin1) } + } + +sub _is_roff { + my( $self ) = @_; + + $self->_is_nroff or $self->_is_groff; + } + +sub _is_nroff { + my( $self ) = @_; + + $self->__nroffer =~ /\bnroff\b/; + } + +sub _is_groff { + my( $self ) = @_; + + $self->__nroffer =~ /\bgroff\b/; + } + +sub _is_mandoc { + my ( $self ) = @_; + + $self->__nroffer =~ /\bmandoc\b/; + } + +sub _is_ebcdic { + my( $self ) = @_; + + return 0; + } + +sub _filter_through_nroff { + my( $self ) = shift; + $self->debug( "Filtering through " . $self->__nroffer() . "\n" ); + + # Maybe someone set rendering switches as part of the opt_n value + # Deal with that here. + + my ($render, $switches) = $self->__nroffer() =~ /\A([\/a-zA-Z0-9_\.-]+)\b(.+)?\z/; + + $self->die("no nroffer!?") unless $render; + my @render_switches = $self->_collect_nroff_switches; + + if ( $switches ) { + # Eliminate whitespace + $switches =~ s/\s//g; + + # Then separate the switches with a zero-width positive + # lookahead on the dash. + # + # See: + # http://www.effectiveperlprogramming.com/blog/1411 + # for a good discussion of this technique + + push @render_switches, split(/(?=-)/, $switches); + } + + $self->debug( "render is $render\n" ); + $self->debug( "render options are @render_switches\n" ); + + require Symbol; + require IPC::Open3; + require IO::Handle; + + my $pid = IPC::Open3::open3( + my $writer, + my $reader, + my $err = Symbol::gensym(), + $render, + @render_switches + ); + + $reader->autoflush(1); + + use IO::Select; + my $selector = IO::Select->new( $reader ); + + $self->debug( "Writing to pipe to $render\n" ); + + my $offset = 0; + my $chunk_size = 4096; + my $length = length( ${ $self->{_text_ref} } ); + my $chunks = $length / $chunk_size; + my $done; + my $buffer; + while( $offset <= $length ) { + $self->debug( "Writing chunk $chunks\n" ); $chunks++; + syswrite $writer, ${ $self->{_text_ref} }, $chunk_size, $offset + or $self->die( $! ); + $offset += $chunk_size; + $self->debug( "Checking read\n" ); + READ: { + last READ unless $selector->can_read( 0.01 ); + $self->debug( "Reading\n" ); + my $bytes = sysread $reader, $buffer, 4096; + $self->debug( "Read $bytes bytes\n" ); + $done .= $buffer; + $self->debug( sprintf "Output is %d bytes\n", + length $done + ); + next READ; + } + } + close $writer; + $self->debug( "Done writing\n" ); + + # read any leftovers + $done .= do { local $/; <$reader> }; + $self->debug( sprintf "Done reading. Output is %d bytes\n", + length $done + ); + + if( $? ) { + $self->warn( "Error from pipe to $render!\n" ); + $self->debug( 'Error: ' . do { local $/; <$err> } ); + } + + + close $reader; + if( my $err = $? ) { + $self->debug( + "Nonzero exit ($?) while running `$render @render_switches`.\n" . + "Falling back to Pod::Perldoc::ToPod\n" + ); + return $self->_fallback_to_pod( @_ ); + } + + $self->debug( "Output:\n----\n$done\n----\n" ); + + ${ $self->{_text_ref} } = $done; + + return length ${ $self->{_text_ref} } ? SUCCESS : FAILED; + } + +sub parse_from_file { + my( $self, $file, $outfh) = @_; + + # We have a pipeline of filters each affecting the reference + # in $self->{_text_ref} + $self->{_text_ref} = \my $output; + + $self->_parse_with_pod_man( $file ); + # so far, nroff is an external command so we ensure it worked + my $result = $self->_filter_through_nroff; + return $self->_fallback_to_pod( @_ ) unless $result == SUCCESS; + + $self->_post_nroff_processing; + + print { $outfh } $output or + $self->die( "Can't print to $$self{__output_file}: $!" ); + + return; + } + +sub _fallback_to_pod { + my( $self, @args ) = @_; + $self->warn( "Falling back to Pod because there was a problem!\n" ); + require Pod::Perldoc::ToPod; + return Pod::Perldoc::ToPod->new->parse_from_file(@_); + } + +# maybe there's a user setting we should check? +sub _get_tab_width { 4 } + +sub _expand_tabs { + my( $self ) = @_; + + my $tab_width = ' ' x $self->_get_tab_width; + + ${ $self->{_text_ref} } =~ s/\t/$tab_width/g; + } + +sub _post_nroff_processing { + my( $self ) = @_; + + if( $self->is_hpux ) { + $self->debug( "On HP-UX, I'm going to expand tabs for you\n" ); + # this used to be a pipe to `col -x` for HP-UX + $self->_expand_tabs; + } + + if( $self->{'__filter_nroff'} ) { + $self->debug( "filter_nroff is set, so filtering\n" ); + $self->_remove_nroff_header; + $self->_remove_nroff_footer; + } + else { + $self->debug( "filter_nroff is not set, so not filtering\n" ); + } + + $self->_handle_unicode; + + return 1; + } + +# I don't think this does anything since there aren't two consecutive +# newlines in the Pod::Man output +sub _remove_nroff_header { + my( $self ) = @_; + $self->debug( "_remove_nroff_header is still a stub!\n" ); + return 1; + +# my @data = split /\n{2,}/, shift; +# shift @data while @data and $data[0] !~ /\S/; # Go to header +# shift @data if @data and $data[0] =~ /Contributed\s+Perl/; # Skip header + } + +# I don't think this does anything since there aren't two consecutive +# newlines in the Pod::Man output +sub _remove_nroff_footer { + my( $self ) = @_; + $self->debug( "_remove_nroff_footer is still a stub!\n" ); + return 1; + ${ $self->{_text_ref} } =~ s/\n\n+.*\w.*\Z//m; + +# my @data = split /\n{2,}/, shift; +# pop @data if @data and $data[-1] =~ /^\w/; # Skip footer, like + # 28/Jan/99 perl 5.005, patch 53 1 + } + +sub _unicode_already_handled { + my( $self ) = @_; + + $self->_have_groff_with_utf8 || + 1 # so, we don't have a case that needs _handle_unicode + ; + } + +sub _handle_unicode { +# this is the job of preconv +# we don't need this with groff 1.20 and later. + my( $self ) = @_; + + return 1 if $self->_unicode_already_handled; + + require Encode; + + # it's UTF-8 here, but we need character data + my $text = Encode::decode( 'UTF-8', ${ $self->{_text_ref} } ) ; + +# http://www.mail-archive.com/groff@gnu.org/msg01378.html +# http://linux.die.net/man/7/groff_char +# http://www.gnu.org/software/groff/manual/html_node/Using-Symbols.html +# http://lists.gnu.org/archive/html/groff/2011-05/msg00007.html +# http://www.simplicidade.org/notes/archives/2009/05/fixing_the_pod.html +# http://lists.freebsd.org/pipermail/freebsd-questions/2011-July/232239.html + $text =~ s/(\P{ASCII})/ + sprintf '\\[u%04X]', ord $1 + /eg; + + # should we encode? + ${ $self->{_text_ref} } = $text; + } + +1; + +__END__ + + +package Class::Struct; + +## See POD after __END__ + +use 5.006_001; + +use strict; +use warnings::register; +our(@ISA, @EXPORT, $VERSION); + +use Carp; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(struct); + +$VERSION = '0.65'; + +my $print = 0; +sub printem { + if (@_) { $print = shift } + else { $print++ } +} + +{ + package Class::Struct::Tie_ISA; + + sub TIEARRAY { + my $class = shift; + return bless [], $class; + } + + sub STORE { + my ($self, $index, $value) = @_; + Class::Struct::_subclass_error(); + } + + sub FETCH { + my ($self, $index) = @_; + $self->[$index]; + } + + sub FETCHSIZE { + my $self = shift; + return scalar(@$self); + } + + sub DESTROY { } +} + +sub import { + my $self = shift; + + if ( @_ == 0 ) { + $self->export_to_level( 1, $self, @EXPORT ); + } elsif ( @_ == 1 ) { + # This is admittedly a little bit silly: + # do we ever export anything else than 'struct'...? + $self->export_to_level( 1, $self, @_ ); + } else { + goto &struct; + } +} + +sub struct { + + # Determine parameter list structure, one of: + # struct( class => [ element-list ]) + # struct( class => { element-list }) + # struct( element-list ) + # Latter form assumes current package name as struct name. + + my ($class, @decls); + my $base_type = ref $_[1]; + if ( $base_type eq 'HASH' ) { + $class = shift; + @decls = %{shift()}; + _usage_error() if @_; + } + elsif ( $base_type eq 'ARRAY' ) { + $class = shift; + @decls = @{shift()}; + _usage_error() if @_; + } + else { + $base_type = 'ARRAY'; + $class = (caller())[0]; + @decls = @_; + } + + _usage_error() if @decls % 2 == 1; + + # Ensure we are not, and will not be, a subclass. + + my $isa = do { + no strict 'refs'; + \@{$class . '::ISA'}; + }; + _subclass_error() if @$isa; + tie @$isa, 'Class::Struct::Tie_ISA'; + + # Create constructor. + + croak "function 'new' already defined in package $class" + if do { no strict 'refs'; defined &{$class . "::new"} }; + + my @methods = (); + my %refs = (); + my %arrays = (); + my %hashes = (); + my %classes = (); + my $got_class = 0; + my $out = ''; + + $out = "{\n package $class;\n use Carp;\n sub new {\n"; + $out .= " my (\$class, \%init) = \@_;\n"; + $out .= " \$class = __PACKAGE__ unless \@_;\n"; + + my $cnt = 0; + my $idx = 0; + my( $cmt, $name, $type, $elem ); + + if( $base_type eq 'HASH' ){ + $out .= " my(\$r) = {};\n"; + $cmt = ''; + } + elsif( $base_type eq 'ARRAY' ){ + $out .= " my(\$r) = [];\n"; + } + + $out .= " bless \$r, \$class;\n\n"; + + while( $idx < @decls ){ + $name = $decls[$idx]; + $type = $decls[$idx+1]; + push( @methods, $name ); + if( $base_type eq 'HASH' ){ + $elem = "{'${class}::$name'}"; + } + elsif( $base_type eq 'ARRAY' ){ + $elem = "[$cnt]"; + ++$cnt; + $cmt = " # $name"; + } + if( $type =~ /^\*(.)/ ){ + $refs{$name}++; + $type = $1; + } + my $init = "defined(\$init{'$name'}) ? \$init{'$name'} :"; + if( $type eq '@' ){ + $out .= " croak 'Initializer for $name must be array reference'\n"; + $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'ARRAY';\n"; + $out .= " \$r->$name( $init [] );$cmt\n"; + $arrays{$name}++; + } + elsif( $type eq '%' ){ + $out .= " croak 'Initializer for $name must be hash reference'\n"; + $out .= " if defined(\$init{'$name'}) && ref(\$init{'$name'}) ne 'HASH';\n"; + $out .= " \$r->$name( $init {} );$cmt\n"; + $hashes{$name}++; + } + elsif ( $type eq '$') { + $out .= " \$r->$name( $init undef );$cmt\n"; + } + elsif( $type =~ /^\w+(?:::\w+)*$/ ){ + $out .= " if (defined(\$init{'$name'})) {\n"; + $out .= " if (ref \$init{'$name'} eq 'HASH')\n"; + $out .= " { \$r->$name( $type->new(\%{\$init{'$name'}}) ) } $cmt\n"; + $out .= " elsif (UNIVERSAL::isa(\$init{'$name'}, '$type'))\n"; + $out .= " { \$r->$name( \$init{'$name'} ) } $cmt\n"; + $out .= " else { croak 'Initializer for $name must be hash or $type reference' }\n"; + $out .= " }\n"; + $classes{$name} = $type; + $got_class = 1; + } + else{ + croak "'$type' is not a valid struct element type"; + } + $idx += 2; + } + + $out .= "\n \$r;\n}\n"; + + # Create accessor methods. + + my( $pre, $pst, $sel ); + $cnt = 0; + foreach $name (@methods){ + if ( do { no strict 'refs'; defined &{$class . "::$name"} } ) { + warnings::warnif("function '$name' already defined, overrides struct accessor method"); + } + else { + $pre = $pst = $cmt = $sel = ''; + if( defined $refs{$name} ){ + $pre = "\\("; + $pst = ")"; + $cmt = " # returns ref"; + } + $out .= " sub $name {$cmt\n my \$r = shift;\n"; + if( $base_type eq 'ARRAY' ){ + $elem = "[$cnt]"; + ++$cnt; + } + elsif( $base_type eq 'HASH' ){ + $elem = "{'${class}::$name'}"; + } + if( defined $arrays{$name} ){ + $out .= " my \$i;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'ARRAY' && !\@_) { \$r->$elem = \$i; return \$r }\n"; + $sel = "->[\$i]"; + } + elsif( defined $hashes{$name} ){ + $out .= " my \$i;\n"; + $out .= " \@_ ? (\$i = shift) : return \$r->$elem;\n"; + $out .= " if (ref(\$i) eq 'HASH' && !\@_) { \$r->$elem = \$i; return \$r }\n"; + $sel = "->{\$i}"; + } + elsif( defined $classes{$name} ){ + $out .= " croak '$name argument is wrong class' if \@_ && ! UNIVERSAL::isa(\$_[0], '$classes{$name}');\n"; + } + $out .= " croak 'Too many args to $name' if \@_ > 1;\n"; + $out .= " \@_ ? ($pre\$r->$elem$sel = shift$pst) : $pre\$r->$elem$sel$pst;\n"; + $out .= " }\n"; + } + } + $out .= "}\n1;\n"; + + print $out if $print; + my $result = eval $out; + carp $@ if $@; +} + +sub _usage_error { + confess "struct usage error"; +} + +sub _subclass_error { + croak 'struct class cannot be a subclass (@ISA not allowed)'; +} + +1; # for require + + +__END__ + +# vim: ts=4 sts=4 sw=4 et: +package HTTP::Tiny; +use strict; +use warnings; +# ABSTRACT: A small, simple, correct HTTP/1.1 client + +our $VERSION = '0.070'; + +sub _croak { require Carp; Carp::croak(@_) } + +#pod =method new +#pod +#pod $http = HTTP::Tiny->new( %attributes ); +#pod +#pod This constructor returns a new HTTP::Tiny object. Valid attributes include: +#pod +#pod =for :list +#pod * C — A user-agent string (defaults to 'HTTP-Tiny/$VERSION'). If +#pod C — ends in a space character, the default user-agent string is +#pod appended. +#pod * C — An instance of L — or equivalent class +#pod that supports the C and C methods +#pod * C — A hashref of default headers to apply to requests +#pod * C — The local IP address to bind to +#pod * C — Whether to reuse the last connection (if for the same +#pod scheme, host and port) (defaults to 1) +#pod * C — Maximum number of redirects allowed (defaults to 5) +#pod * C — Maximum response size in bytes (only when not using a data +#pod callback). If defined, responses larger than this will return an +#pod exception. +#pod * C — URL of a proxy server to use for HTTP connections +#pod (default is C<$ENV{http_proxy}> — if set) +#pod * C — URL of a proxy server to use for HTTPS connections +#pod (default is C<$ENV{https_proxy}> — if set) +#pod * C — URL of a generic proxy server for both HTTP and HTTPS +#pod connections (default is C<$ENV{all_proxy}> — if set) +#pod * C — List of domain suffixes that should not be proxied. Must +#pod be a comma-separated string or an array reference. (default is +#pod C<$ENV{no_proxy}> —) +#pod * C — Request timeout in seconds (default is 60) If a socket open, +#pod read or write takes longer than the timeout, an exception is thrown. +#pod * C — A boolean that indicates whether to validate the SSL +#pod certificate of an C — connection (default is false) +#pod * C — A hashref of C — options to pass through to +#pod L +#pod +#pod Passing an explicit C for C, C or C will +#pod prevent getting the corresponding proxies from the environment. +#pod +#pod Exceptions from C, C or other errors will result in a +#pod pseudo-HTTP status code of 599 and a reason of "Internal Exception". The +#pod content field in the response will contain the text of the exception. +#pod +#pod The C parameter enables a persistent connection, but only to a +#pod single destination scheme, host and port. Also, if any connection-relevant +#pod attributes are modified, or if the process ID or thread ID change, the +#pod persistent connection will be dropped. If you want persistent connections +#pod across multiple destinations, use multiple HTTP::Tiny objects. +#pod +#pod See L for more on the C and C attributes. +#pod +#pod =cut + +my @attributes; +BEGIN { + @attributes = qw( + cookie_jar default_headers http_proxy https_proxy keep_alive + local_address max_redirect max_size proxy no_proxy + SSL_options verify_SSL + ); + my %persist_ok = map {; $_ => 1 } qw( + cookie_jar default_headers max_redirect max_size + ); + no strict 'refs'; + no warnings 'uninitialized'; + for my $accessor ( @attributes ) { + *{$accessor} = sub { + @_ > 1 + ? do { + delete $_[0]->{handle} if !$persist_ok{$accessor} && $_[1] ne $_[0]->{$accessor}; + $_[0]->{$accessor} = $_[1] + } + : $_[0]->{$accessor}; + }; + } +} + +sub agent { + my($self, $agent) = @_; + if( @_ > 1 ){ + $self->{agent} = + (defined $agent && $agent =~ / $/) ? $agent . $self->_agent : $agent; + } + return $self->{agent}; +} + +sub timeout { + my ($self, $timeout) = @_; + if ( @_ > 1 ) { + $self->{timeout} = $timeout; + if ($self->{handle}) { + $self->{handle}->timeout($timeout); + } + } + return $self->{timeout}; +} + +sub new { + my($class, %args) = @_; + + my $self = { + max_redirect => 5, + timeout => defined $args{timeout} ? $args{timeout} : 60, + keep_alive => 1, + verify_SSL => $args{verify_SSL} || $args{verify_ssl} || 0, # no verification by default + no_proxy => $ENV{no_proxy}, + }; + + bless $self, $class; + + $class->_validate_cookie_jar( $args{cookie_jar} ) if $args{cookie_jar}; + + for my $key ( @attributes ) { + $self->{$key} = $args{$key} if exists $args{$key} + } + + $self->agent( exists $args{agent} ? $args{agent} : $class->_agent ); + + $self->_set_proxies; + + return $self; +} + +sub _set_proxies { + my ($self) = @_; + + # get proxies from %ENV only if not provided; explicit undef will disable + # getting proxies from the environment + + # generic proxy + if (! exists $self->{proxy} ) { + $self->{proxy} = $ENV{all_proxy} || $ENV{ALL_PROXY}; + } + + if ( defined $self->{proxy} ) { + $self->_split_proxy( 'generic proxy' => $self->{proxy} ); # validate + } + else { + delete $self->{proxy}; + } + + # http proxy + if (! exists $self->{http_proxy} ) { + # under CGI, bypass HTTP_PROXY as request sets it from Proxy header + local $ENV{HTTP_PROXY} if $ENV{REQUEST_METHOD}; + $self->{http_proxy} = $ENV{http_proxy} || $ENV{HTTP_PROXY} || $self->{proxy}; + } + + if ( defined $self->{http_proxy} ) { + $self->_split_proxy( http_proxy => $self->{http_proxy} ); # validate + $self->{_has_proxy}{http} = 1; + } + else { + delete $self->{http_proxy}; + } + + # https proxy + if (! exists $self->{https_proxy} ) { + $self->{https_proxy} = $ENV{https_proxy} || $ENV{HTTPS_PROXY} || $self->{proxy}; + } + + if ( $self->{https_proxy} ) { + $self->_split_proxy( https_proxy => $self->{https_proxy} ); # validate + $self->{_has_proxy}{https} = 1; + } + else { + delete $self->{https_proxy}; + } + + # Split no_proxy to array reference if not provided as such + unless ( ref $self->{no_proxy} eq 'ARRAY' ) { + $self->{no_proxy} = + (defined $self->{no_proxy}) ? [ split /\s*,\s*/, $self->{no_proxy} ] : []; + } + + return; +} + +#pod =method get|head|put|post|delete +#pod +#pod $response = $http->get($url); +#pod $response = $http->get($url, \%options); +#pod $response = $http->head($url); +#pod +#pod These methods are shorthand for calling C for the given method. The +#pod URL must have unsafe characters escaped and international domain names encoded. +#pod See C for valid options and a description of the response. +#pod +#pod The C field of the response will be true if the status code is 2XX. +#pod +#pod =cut + +for my $sub_name ( qw/get head put post delete/ ) { + my $req_method = uc $sub_name; + no strict 'refs'; + eval <<"HERE"; ## no critic + sub $sub_name { + my (\$self, \$url, \$args) = \@_; + \@_ == 2 || (\@_ == 3 && ref \$args eq 'HASH') + or _croak(q/Usage: \$http->$sub_name(URL, [HASHREF])/ . "\n"); + return \$self->request('$req_method', \$url, \$args || {}); + } +HERE +} + +#pod =method post_form +#pod +#pod $response = $http->post_form($url, $form_data); +#pod $response = $http->post_form($url, $form_data, \%options); +#pod +#pod This method executes a C request and sends the key/value pairs from a +#pod form data hash or array reference to the given URL with a C of +#pod C. If data is provided as an array +#pod reference, the order is preserved; if provided as a hash reference, the terms +#pod are sorted on key and value for consistency. See documentation for the +#pod C method for details on the encoding. +#pod +#pod The URL must have unsafe characters escaped and international domain names +#pod encoded. See C for valid options and a description of the response. +#pod Any C header or content in the options hashref will be ignored. +#pod +#pod The C field of the response will be true if the status code is 2XX. +#pod +#pod =cut + +sub post_form { + my ($self, $url, $data, $args) = @_; + (@_ == 3 || @_ == 4 && ref $args eq 'HASH') + or _croak(q/Usage: $http->post_form(URL, DATAREF, [HASHREF])/ . "\n"); + + my $headers = {}; + while ( my ($key, $value) = each %{$args->{headers} || {}} ) { + $headers->{lc $key} = $value; + } + delete $args->{headers}; + + return $self->request('POST', $url, { + %$args, + content => $self->www_form_urlencode($data), + headers => { + %$headers, + 'content-type' => 'application/x-www-form-urlencoded' + }, + } + ); +} + +#pod =method mirror +#pod +#pod $response = $http->mirror($url, $file, \%options) +#pod if ( $response->{success} ) { +#pod print "$file is up to date\n"; +#pod } +#pod +#pod Executes a C request for the URL and saves the response body to the file +#pod name provided. The URL must have unsafe characters escaped and international +#pod domain names encoded. If the file already exists, the request will include an +#pod C header with the modification timestamp of the file. You +#pod may specify a different C header yourself in the C<< +#pod $options->{headers} >> hash. +#pod +#pod The C field of the response will be true if the status code is 2XX +#pod or if the status code is 304 (unmodified). +#pod +#pod If the file was modified and the server response includes a properly +#pod formatted C header, the file modification time will +#pod be updated accordingly. +#pod +#pod =cut + +sub mirror { + my ($self, $url, $file, $args) = @_; + @_ == 3 || (@_ == 4 && ref $args eq 'HASH') + or _croak(q/Usage: $http->mirror(URL, FILE, [HASHREF])/ . "\n"); + + if ( exists $args->{headers} ) { + my $headers = {}; + while ( my ($key, $value) = each %{$args->{headers} || {}} ) { + $headers->{lc $key} = $value; + } + $args->{headers} = $headers; + } + + if ( -e $file and my $mtime = (stat($file))[9] ) { + $args->{headers}{'if-modified-since'} ||= $self->_http_date($mtime); + } + my $tempfile = $file . int(rand(2**31)); + + require Fcntl; + sysopen my $fh, $tempfile, Fcntl::O_CREAT()|Fcntl::O_EXCL()|Fcntl::O_WRONLY() + or _croak(qq/Error: Could not create temporary file $tempfile for downloading: $!\n/); + binmode $fh; + $args->{data_callback} = sub { print {$fh} $_[0] }; + my $response = $self->request('GET', $url, $args); + close $fh + or _croak(qq/Error: Caught error closing temporary file $tempfile: $!\n/); + + if ( $response->{success} ) { + rename $tempfile, $file + or _croak(qq/Error replacing $file with $tempfile: $!\n/); + my $lm = $response->{headers}{'last-modified'}; + if ( $lm and my $mtime = $self->_parse_http_date($lm) ) { + utime $mtime, $mtime, $file; + } + } + $response->{success} ||= $response->{status} eq '304'; + unlink $tempfile; + return $response; +} + +#pod =method request +#pod +#pod $response = $http->request($method, $url); +#pod $response = $http->request($method, $url, \%options); +#pod +#pod Executes an HTTP request of the given method type ('GET', 'HEAD', 'POST', +#pod 'PUT', etc.) on the given URL. The URL must have unsafe characters escaped and +#pod international domain names encoded. +#pod +#pod If the URL includes a "user:password" stanza, they will be used for Basic-style +#pod authorization headers. (Authorization headers will not be included in a +#pod redirected request.) For example: +#pod +#pod $http->request('GET', 'http://Aladdin:open sesame@example.com/'); +#pod +#pod If the "user:password" stanza contains reserved characters, they must +#pod be percent-escaped: +#pod +#pod $http->request('GET', 'http://john%40example.com:password@example.com/'); +#pod +#pod A hashref of options may be appended to modify the request. +#pod +#pod Valid options are: +#pod +#pod =for :list +#pod * C — +#pod A hashref containing headers to include with the request. If the value for +#pod a header is an array reference, the header will be output multiple times with +#pod each value in the array. These headers over-write any default headers. +#pod * C — +#pod A scalar to include as the body of the request OR a code reference +#pod that will be called iteratively to produce the body of the request +#pod * C — +#pod A code reference that will be called if it exists to provide a hashref +#pod of trailing headers (only used with chunked transfer-encoding) +#pod * C — +#pod A code reference that will be called for each chunks of the response +#pod body received. +#pod * C — +#pod Override host resolution and force all connections to go only to a +#pod specific peer address, regardless of the URL of the request. This will +#pod include any redirections! This options should be used with extreme +#pod caution (e.g. debugging or very special circumstances). +#pod +#pod The C header is generated from the URL in accordance with RFC 2616. It +#pod is a fatal error to specify C in the C option. Other headers +#pod may be ignored or overwritten if necessary for transport compliance. +#pod +#pod If the C option is a code reference, it will be called iteratively +#pod to provide the content body of the request. It should return the empty +#pod string or undef when the iterator is exhausted. +#pod +#pod If the C option is the empty string, no C or +#pod C headers will be generated. +#pod +#pod If the C option is provided, it will be called iteratively until +#pod the entire response body is received. The first argument will be a string +#pod containing a chunk of the response body, the second argument will be the +#pod in-progress response hash reference, as described below. (This allows +#pod customizing the action of the callback based on the C or C +#pod received prior to the content body.) +#pod +#pod The C method returns a hashref containing the response. The hashref +#pod will have the following keys: +#pod +#pod =for :list +#pod * C — +#pod Boolean indicating whether the operation returned a 2XX status code +#pod * C — +#pod URL that provided the response. This is the URL of the request unless +#pod there were redirections, in which case it is the last URL queried +#pod in a redirection chain +#pod * C — +#pod The HTTP status code of the response +#pod * C — +#pod The response phrase returned by the server +#pod * C — +#pod The body of the response. If the response does not have any content +#pod or if a data callback is provided to consume the response body, +#pod this will be the empty string +#pod * C — +#pod A hashref of header fields. All header field names will be normalized +#pod to be lower case. If a header is repeated, the value will be an arrayref; +#pod it will otherwise be a scalar string containing the value +#pod * C +#pod If this field exists, it is an arrayref of response hash references from +#pod redirects in the same order that redirections occurred. If it does +#pod not exist, then no redirections occurred. +#pod +#pod On an exception during the execution of the request, the C field will +#pod contain 599, and the C field will contain the text of the exception. +#pod +#pod =cut + +my %idempotent = map { $_ => 1 } qw/GET HEAD PUT DELETE OPTIONS TRACE/; + +sub request { + my ($self, $method, $url, $args) = @_; + @_ == 3 || (@_ == 4 && ref $args eq 'HASH') + or _croak(q/Usage: $http->request(METHOD, URL, [HASHREF])/ . "\n"); + $args ||= {}; # we keep some state in this during _request + + # RFC 2616 Section 8.1.4 mandates a single retry on broken socket + my $response; + for ( 0 .. 1 ) { + $response = eval { $self->_request($method, $url, $args) }; + last unless $@ && $idempotent{$method} + && $@ =~ m{^(?:Socket closed|Unexpected end)}; + } + + if (my $e = $@) { + # maybe we got a response hash thrown from somewhere deep + if ( ref $e eq 'HASH' && exists $e->{status} ) { + $e->{redirects} = delete $args->{_redirects} if @{ $args->{_redirects} || []}; + return $e; + } + + # otherwise, stringify it + $e = "$e"; + $response = { + url => $url, + success => q{}, + status => 599, + reason => 'Internal Exception', + content => $e, + headers => { + 'content-type' => 'text/plain', + 'content-length' => length $e, + }, + ( @{$args->{_redirects} || []} ? (redirects => delete $args->{_redirects}) : () ), + }; + } + return $response; +} + +#pod =method www_form_urlencode +#pod +#pod $params = $http->www_form_urlencode( $data ); +#pod $response = $http->get("http://example.com/query?$params"); +#pod +#pod This method converts the key/value pairs from a data hash or array reference +#pod into a C string. The keys and values from the data +#pod reference will be UTF-8 encoded and escaped per RFC 3986. If a value is an +#pod array reference, the key will be repeated with each of the values of the array +#pod reference. If data is provided as a hash reference, the key/value pairs in the +#pod resulting string will be sorted by key and value for consistent ordering. +#pod +#pod =cut + +sub www_form_urlencode { + my ($self, $data) = @_; + (@_ == 2 && ref $data) + or _croak(q/Usage: $http->www_form_urlencode(DATAREF)/ . "\n"); + (ref $data eq 'HASH' || ref $data eq 'ARRAY') + or _croak("form data must be a hash or array reference\n"); + + my @params = ref $data eq 'HASH' ? %$data : @$data; + @params % 2 == 0 + or _croak("form data reference must have an even number of terms\n"); + + my @terms; + while( @params ) { + my ($key, $value) = splice(@params, 0, 2); + if ( ref $value eq 'ARRAY' ) { + unshift @params, map { $key => $_ } @$value; + } + else { + push @terms, join("=", map { $self->_uri_escape($_) } $key, $value); + } + } + + return join("&", (ref $data eq 'ARRAY') ? (@terms) : (sort @terms) ); +} + +#pod =method can_ssl +#pod +#pod $ok = HTTP::Tiny->can_ssl; +#pod ($ok, $why) = HTTP::Tiny->can_ssl; +#pod ($ok, $why) = $http->can_ssl; +#pod +#pod Indicates if SSL support is available. When called as a class object, it +#pod checks for the correct version of L and L. +#pod When called as an object methods, if C is true or if C +#pod is set in C, it checks that a CA file is available. +#pod +#pod In scalar context, returns a boolean indicating if SSL is available. +#pod In list context, returns the boolean and a (possibly multi-line) string of +#pod errors indicating why SSL isn't available. +#pod +#pod =cut + +sub can_ssl { + my ($self) = @_; + + my($ok, $reason) = (1, ''); + + # Need IO::Socket::SSL 1.42 for SSL_create_ctx_callback + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + unless (eval {require IO::Socket::SSL; IO::Socket::SSL->VERSION(1.42)}) { + $ok = 0; + $reason .= qq/IO::Socket::SSL 1.42 must be installed for https support\n/; + } + + # Need Net::SSLeay 1.49 for MODE_AUTO_RETRY + unless (eval {require Net::SSLeay; Net::SSLeay->VERSION(1.49)}) { + $ok = 0; + $reason .= qq/Net::SSLeay 1.49 must be installed for https support\n/; + } + + # If an object, check that SSL config lets us get a CA if necessary + if ( ref($self) && ( $self->{verify_SSL} || $self->{SSL_options}{SSL_verify_mode} ) ) { + my $handle = HTTP::Tiny::Handle->new( + SSL_options => $self->{SSL_options}, + verify_SSL => $self->{verify_SSL}, + ); + unless ( eval { $handle->_find_CA_file; 1 } ) { + $ok = 0; + $reason .= "$@"; + } + } + + wantarray ? ($ok, $reason) : $ok; +} + +#pod =method connected +#pod +#pod $host = $http->connected; +#pod ($host, $port) = $http->connected; +#pod +#pod Indicates if a connection to a peer is being kept alive, per the C +#pod option. +#pod +#pod In scalar context, returns the peer host and port, joined with a colon, or +#pod C (if no peer is connected). +#pod In list context, returns the peer host and port or an empty list (if no peer +#pod is connected). +#pod +#pod B: This method cannot reliably be used to discover whether the remote +#pod host has closed its end of the socket. +#pod +#pod =cut + +sub connected { + my ($self) = @_; + + # If a socket exists... + if ($self->{handle} && $self->{handle}{fh}) { + my $socket = $self->{handle}{fh}; + + # ...and is connected, return the peer host and port. + if ($socket->connected) { + return wantarray + ? ($socket->peerhost, $socket->peerport) + : join(':', $socket->peerhost, $socket->peerport); + } + } + return; +} + +#--------------------------------------------------------------------------# +# private methods +#--------------------------------------------------------------------------# + +my %DefaultPort = ( + http => 80, + https => 443, +); + +sub _agent { + my $class = ref($_[0]) || $_[0]; + (my $default_agent = $class) =~ s{::}{-}g; + return $default_agent . "/" . $class->VERSION; +} + +sub _request { + my ($self, $method, $url, $args) = @_; + + my ($scheme, $host, $port, $path_query, $auth) = $self->_split_url($url); + + my $request = { + method => $method, + scheme => $scheme, + host => $host, + port => $port, + host_port => ($port == $DefaultPort{$scheme} ? $host : "$host:$port"), + uri => $path_query, + headers => {}, + }; + + my $peer = $args->{peer} || $host; + + # We remove the cached handle so it is not reused in the case of redirect. + # If all is well, it will be recached at the end of _request. We only + # reuse for the same scheme, host and port + my $handle = delete $self->{handle}; + if ( $handle ) { + unless ( $handle->can_reuse( $scheme, $host, $port, $peer ) ) { + $handle->close; + undef $handle; + } + } + $handle ||= $self->_open_handle( $request, $scheme, $host, $port, $peer ); + + $self->_prepare_headers_and_cb($request, $args, $url, $auth); + $handle->write_request($request); + + my $response; + do { $response = $handle->read_response_header } + until (substr($response->{status},0,1) ne '1'); + + $self->_update_cookie_jar( $url, $response ) if $self->{cookie_jar}; + my @redir_args = $self->_maybe_redirect($request, $response, $args); + + my $known_message_length; + if ($method eq 'HEAD' || $response->{status} =~ /^[23]04/) { + # response has no message body + $known_message_length = 1; + } + else { + # Ignore any data callbacks during redirection. + my $cb_args = @redir_args ? +{} : $args; + my $data_cb = $self->_prepare_data_cb($response, $cb_args); + $known_message_length = $handle->read_body($data_cb, $response); + } + + if ( $self->{keep_alive} + && $known_message_length + && $response->{protocol} eq 'HTTP/1.1' + && ($response->{headers}{connection} || '') ne 'close' + ) { + $self->{handle} = $handle; + } + else { + $handle->close; + } + + $response->{success} = substr( $response->{status}, 0, 1 ) eq '2'; + $response->{url} = $url; + + # Push the current response onto the stack of redirects if redirecting. + if (@redir_args) { + push @{$args->{_redirects}}, $response; + return $self->_request(@redir_args, $args); + } + + # Copy the stack of redirects into the response before returning. + $response->{redirects} = delete $args->{_redirects} + if @{$args->{_redirects}}; + return $response; +} + +sub _open_handle { + my ($self, $request, $scheme, $host, $port, $peer) = @_; + + my $handle = HTTP::Tiny::Handle->new( + timeout => $self->{timeout}, + SSL_options => $self->{SSL_options}, + verify_SSL => $self->{verify_SSL}, + local_address => $self->{local_address}, + keep_alive => $self->{keep_alive} + ); + + if ($self->{_has_proxy}{$scheme} && ! grep { $host =~ /\Q$_\E$/ } @{$self->{no_proxy}}) { + return $self->_proxy_connect( $request, $handle ); + } + else { + return $handle->connect($scheme, $host, $port, $peer); + } +} + +sub _proxy_connect { + my ($self, $request, $handle) = @_; + + my @proxy_vars; + if ( $request->{scheme} eq 'https' ) { + _croak(qq{No https_proxy defined}) unless $self->{https_proxy}; + @proxy_vars = $self->_split_proxy( https_proxy => $self->{https_proxy} ); + if ( $proxy_vars[0] eq 'https' ) { + _croak(qq{Can't proxy https over https: $request->{uri} via $self->{https_proxy}}); + } + } + else { + _croak(qq{No http_proxy defined}) unless $self->{http_proxy}; + @proxy_vars = $self->_split_proxy( http_proxy => $self->{http_proxy} ); + } + + my ($p_scheme, $p_host, $p_port, $p_auth) = @proxy_vars; + + if ( length $p_auth && ! defined $request->{headers}{'proxy-authorization'} ) { + $self->_add_basic_auth_header( $request, 'proxy-authorization' => $p_auth ); + } + + $handle->connect($p_scheme, $p_host, $p_port, $p_host); + + if ($request->{scheme} eq 'https') { + $self->_create_proxy_tunnel( $request, $handle ); + } + else { + # non-tunneled proxy requires absolute URI + $request->{uri} = "$request->{scheme}://$request->{host_port}$request->{uri}"; + } + + return $handle; +} + +sub _split_proxy { + my ($self, $type, $proxy) = @_; + + my ($scheme, $host, $port, $path_query, $auth) = eval { $self->_split_url($proxy) }; + + unless( + defined($scheme) && length($scheme) && length($host) && length($port) + && $path_query eq '/' + ) { + _croak(qq{$type URL must be in format http[s]://[auth@]:/\n}); + } + + return ($scheme, $host, $port, $auth); +} + +sub _create_proxy_tunnel { + my ($self, $request, $handle) = @_; + + $handle->_assert_ssl; + + my $agent = exists($request->{headers}{'user-agent'}) + ? $request->{headers}{'user-agent'} : $self->{agent}; + + my $connect_request = { + method => 'CONNECT', + uri => "$request->{host}:$request->{port}", + headers => { + host => "$request->{host}:$request->{port}", + 'user-agent' => $agent, + } + }; + + if ( $request->{headers}{'proxy-authorization'} ) { + $connect_request->{headers}{'proxy-authorization'} = + delete $request->{headers}{'proxy-authorization'}; + } + + $handle->write_request($connect_request); + my $response; + do { $response = $handle->read_response_header } + until (substr($response->{status},0,1) ne '1'); + + # if CONNECT failed, throw the response so it will be + # returned from the original request() method; + unless (substr($response->{status},0,1) eq '2') { + die $response; + } + + # tunnel established, so start SSL handshake + $handle->start_ssl( $request->{host} ); + + return; +} + +sub _prepare_headers_and_cb { + my ($self, $request, $args, $url, $auth) = @_; + + for ($self->{default_headers}, $args->{headers}) { + next unless defined; + while (my ($k, $v) = each %$_) { + $request->{headers}{lc $k} = $v; + $request->{header_case}{lc $k} = $k; + } + } + + if (exists $request->{headers}{'host'}) { + die(qq/The 'Host' header must not be provided as header option\n/); + } + + $request->{headers}{'host'} = $request->{host_port}; + $request->{headers}{'user-agent'} ||= $self->{agent}; + $request->{headers}{'connection'} = "close" + unless $self->{keep_alive}; + + if ( defined $args->{content} ) { + if (ref $args->{content} eq 'CODE') { + $request->{headers}{'content-type'} ||= "application/octet-stream"; + $request->{headers}{'transfer-encoding'} = 'chunked' + unless $request->{headers}{'content-length'} + || $request->{headers}{'transfer-encoding'}; + $request->{cb} = $args->{content}; + } + elsif ( length $args->{content} ) { + my $content = $args->{content}; + if ( $] ge '5.008' ) { + utf8::downgrade($content, 1) + or die(qq/Wide character in request message body\n/); + } + $request->{headers}{'content-type'} ||= "application/octet-stream"; + $request->{headers}{'content-length'} = length $content + unless $request->{headers}{'content-length'} + || $request->{headers}{'transfer-encoding'}; + $request->{cb} = sub { substr $content, 0, length $content, '' }; + } + $request->{trailer_cb} = $args->{trailer_callback} + if ref $args->{trailer_callback} eq 'CODE'; + } + + ### If we have a cookie jar, then maybe add relevant cookies + if ( $self->{cookie_jar} ) { + my $cookies = $self->cookie_jar->cookie_header( $url ); + $request->{headers}{cookie} = $cookies if length $cookies; + } + + # if we have Basic auth parameters, add them + if ( length $auth && ! defined $request->{headers}{authorization} ) { + $self->_add_basic_auth_header( $request, 'authorization' => $auth ); + } + + return; +} + +sub _add_basic_auth_header { + my ($self, $request, $header, $auth) = @_; + require MIME::Base64; + $request->{headers}{$header} = + "Basic " . MIME::Base64::encode_base64($auth, ""); + return; +} + +sub _prepare_data_cb { + my ($self, $response, $args) = @_; + my $data_cb = $args->{data_callback}; + $response->{content} = ''; + + if (!$data_cb || $response->{status} !~ /^2/) { + if (defined $self->{max_size}) { + $data_cb = sub { + $_[1]->{content} .= $_[0]; + die(qq/Size of response body exceeds the maximum allowed of $self->{max_size}\n/) + if length $_[1]->{content} > $self->{max_size}; + }; + } + else { + $data_cb = sub { $_[1]->{content} .= $_[0] }; + } + } + return $data_cb; +} + +sub _update_cookie_jar { + my ($self, $url, $response) = @_; + + my $cookies = $response->{headers}->{'set-cookie'}; + return unless defined $cookies; + + my @cookies = ref $cookies ? @$cookies : $cookies; + + $self->cookie_jar->add( $url, $_ ) for @cookies; + + return; +} + +sub _validate_cookie_jar { + my ($class, $jar) = @_; + + # duck typing + for my $method ( qw/add cookie_header/ ) { + _croak(qq/Cookie jar must provide the '$method' method\n/) + unless ref($jar) && ref($jar)->can($method); + } + + return; +} + +sub _maybe_redirect { + my ($self, $request, $response, $args) = @_; + my $headers = $response->{headers}; + my ($status, $method) = ($response->{status}, $request->{method}); + $args->{_redirects} ||= []; + + if (($status eq '303' or ($status =~ /^30[1278]/ && $method =~ /^GET|HEAD$/)) + and $headers->{location} + and @{$args->{_redirects}} < $self->{max_redirect} + ) { + my $location = ($headers->{location} =~ /^\//) + ? "$request->{scheme}://$request->{host_port}$headers->{location}" + : $headers->{location} ; + return (($status eq '303' ? 'GET' : $method), $location); + } + return; +} + +sub _split_url { + my $url = pop; + + # URI regex adapted from the URI module + my ($scheme, $host, $path_query) = $url =~ m<\A([^:/?#]+)://([^/?#]*)([^#]*)> + or die(qq/Cannot parse URL: '$url'\n/); + + $scheme = lc $scheme; + $path_query = "/$path_query" unless $path_query =~ m<\A/>; + + my $auth = ''; + if ( (my $i = index $host, '@') != -1 ) { + # user:pass@host + $auth = substr $host, 0, $i, ''; # take up to the @ for auth + substr $host, 0, 1, ''; # knock the @ off the host + + # userinfo might be percent escaped, so recover real auth info + $auth =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; + } + my $port = $host =~ s/:(\d*)\z// && length $1 ? $1 + : $scheme eq 'http' ? 80 + : $scheme eq 'https' ? 443 + : undef; + + return ($scheme, (length $host ? lc $host : "localhost") , $port, $path_query, $auth); +} + +# Date conversions adapted from HTTP::Date +my $DoW = "Sun|Mon|Tue|Wed|Thu|Fri|Sat"; +my $MoY = "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec"; +sub _http_date { + my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($_[1]); + return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", + substr($DoW,$wday*4,3), + $mday, substr($MoY,$mon*4,3), $year+1900, + $hour, $min, $sec + ); +} + +sub _parse_http_date { + my ($self, $str) = @_; + require Time::Local; + my @tl_parts; + if ($str =~ /^[SMTWF][a-z]+, +(\d{1,2}) ($MoY) +(\d\d\d\d) +(\d\d):(\d\d):(\d\d) +GMT$/) { + @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3); + } + elsif ($str =~ /^[SMTWF][a-z]+, +(\d\d)-($MoY)-(\d{2,4}) +(\d\d):(\d\d):(\d\d) +GMT$/ ) { + @tl_parts = ($6, $5, $4, $1, (index($MoY,$2)/4), $3); + } + elsif ($str =~ /^[SMTWF][a-z]+ +($MoY) +(\d{1,2}) +(\d\d):(\d\d):(\d\d) +(?:[^0-9]+ +)?(\d\d\d\d)$/ ) { + @tl_parts = ($5, $4, $3, $2, (index($MoY,$1)/4), $6); + } + return eval { + my $t = @tl_parts ? Time::Local::timegm(@tl_parts) : -1; + $t < 0 ? undef : $t; + }; +} + +# URI escaping adapted from URI::Escape +# c.f. http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1 +# perl 5.6 ready UTF-8 encoding adapted from JSON::PP +my %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255; +$escapes{' '}="+"; +my $unsafe_char = qr/[^A-Za-z0-9\-\._~]/; + +sub _uri_escape { + my ($self, $str) = @_; + if ( $] ge '5.008' ) { + utf8::encode($str); + } + else { + $str = pack("U*", unpack("C*", $str)) # UTF-8 encode a byte string + if ( length $str == do { use bytes; length $str } ); + $str = pack("C*", unpack("C*", $str)); # clear UTF-8 flag + } + $str =~ s/($unsafe_char)/$escapes{$1}/ge; + return $str; +} + +package + HTTP::Tiny::Handle; # hide from PAUSE/indexers +use strict; +use warnings; + +use Errno qw[EINTR EPIPE]; +use IO::Socket qw[SOCK_STREAM]; +use Socket qw[SOL_SOCKET SO_KEEPALIVE]; + +# PERL_HTTP_TINY_IPV4_ONLY is a private environment variable to force old +# behavior if someone is unable to boostrap CPAN from a new perl install; it is +# not intended for general, per-client use and may be removed in the future +my $SOCKET_CLASS = + $ENV{PERL_HTTP_TINY_IPV4_ONLY} ? 'IO::Socket::INET' : + eval { require IO::Socket::IP; IO::Socket::IP->VERSION(0.25) } ? 'IO::Socket::IP' : + 'IO::Socket::INET'; + +sub BUFSIZE () { 32768 } ## no critic + +my $Printable = sub { + local $_ = shift; + s/\r/\\r/g; + s/\n/\\n/g; + s/\t/\\t/g; + s/([^\x20-\x7E])/sprintf('\\x%.2X', ord($1))/ge; + $_; +}; + +my $Token = qr/[\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7A\x7C\x7E]/; +my $Field_Content = qr/[[:print:]]+ (?: [\x20\x09]+ [[:print:]]+ )*/x; + +sub new { + my ($class, %args) = @_; + return bless { + rbuf => '', + timeout => 60, + max_line_size => 16384, + max_header_lines => 64, + verify_SSL => 0, + SSL_options => {}, + %args + }, $class; +} + +sub timeout { + my ($self, $timeout) = @_; + if ( @_ > 1 ) { + $self->{timeout} = $timeout; + if ( $self->{fh} && $self->{fh}->can('timeout') ) { + $self->{fh}->timeout($timeout); + } + } + return $self->{timeout}; +} + +sub connect { + @_ == 5 || die(q/Usage: $handle->connect(scheme, host, port, peer)/ . "\n"); + my ($self, $scheme, $host, $port, $peer) = @_; + + if ( $scheme eq 'https' ) { + $self->_assert_ssl; + } + elsif ( $scheme ne 'http' ) { + die(qq/Unsupported URL scheme '$scheme'\n/); + } + $self->{fh} = $SOCKET_CLASS->new( + PeerHost => $peer, + PeerPort => $port, + $self->{local_address} ? + ( LocalAddr => $self->{local_address} ) : (), + Proto => 'tcp', + Type => SOCK_STREAM, + Timeout => $self->{timeout}, + ) or die(qq/Could not connect to '$host:$port': $@\n/); + + binmode($self->{fh}) + or die(qq/Could not binmode() socket: '$!'\n/); + + if ( $self->{keep_alive} ) { + unless ( defined( $self->{fh}->setsockopt( SOL_SOCKET, SO_KEEPALIVE, 1 ) ) ) { + CORE::close($self->{fh}); + die(qq/Could not set SO_KEEPALIVE on socket: '$!'\n/); + } + } + + $self->start_ssl($host) if $scheme eq 'https'; + + $self->{scheme} = $scheme; + $self->{host} = $host; + $self->{peer} = $peer; + $self->{port} = $port; + $self->{pid} = $$; + $self->{tid} = _get_tid(); + + return $self; +} + +sub start_ssl { + my ($self, $host) = @_; + + # As this might be used via CONNECT after an SSL session + # to a proxy, we shut down any existing SSL before attempting + # the handshake + if ( ref($self->{fh}) eq 'IO::Socket::SSL' ) { + unless ( $self->{fh}->stop_SSL ) { + my $ssl_err = IO::Socket::SSL->errstr; + die(qq/Error halting prior SSL connection: $ssl_err/); + } + } + + my $ssl_args = $self->_ssl_args($host); + IO::Socket::SSL->start_SSL( + $self->{fh}, + %$ssl_args, + SSL_create_ctx_callback => sub { + my $ctx = shift; + Net::SSLeay::CTX_set_mode($ctx, Net::SSLeay::MODE_AUTO_RETRY()); + }, + ); + + unless ( ref($self->{fh}) eq 'IO::Socket::SSL' ) { + my $ssl_err = IO::Socket::SSL->errstr; + die(qq/SSL connection failed for $host: $ssl_err\n/); + } +} + +sub close { + @_ == 1 || die(q/Usage: $handle->close()/ . "\n"); + my ($self) = @_; + CORE::close($self->{fh}) + or die(qq/Could not close socket: '$!'\n/); +} + +sub write { + @_ == 2 || die(q/Usage: $handle->write(buf)/ . "\n"); + my ($self, $buf) = @_; + + if ( $] ge '5.008' ) { + utf8::downgrade($buf, 1) + or die(qq/Wide character in write()\n/); + } + + my $len = length $buf; + my $off = 0; + + local $SIG{PIPE} = 'IGNORE'; + + while () { + $self->can_write + or die(qq/Timed out while waiting for socket to become ready for writing\n/); + my $r = syswrite($self->{fh}, $buf, $len, $off); + if (defined $r) { + $len -= $r; + $off += $r; + last unless $len > 0; + } + elsif ($! == EPIPE) { + die(qq/Socket closed by remote server: $!\n/); + } + elsif ($! != EINTR) { + if ($self->{fh}->can('errstr')){ + my $err = $self->{fh}->errstr(); + die (qq/Could not write to SSL socket: '$err'\n /); + } + else { + die(qq/Could not write to socket: '$!'\n/); + } + + } + } + return $off; +} + +sub read { + @_ == 2 || @_ == 3 || die(q/Usage: $handle->read(len [, allow_partial])/ . "\n"); + my ($self, $len, $allow_partial) = @_; + + my $buf = ''; + my $got = length $self->{rbuf}; + + if ($got) { + my $take = ($got < $len) ? $got : $len; + $buf = substr($self->{rbuf}, 0, $take, ''); + $len -= $take; + } + + while ($len > 0) { + $self->can_read + or die(q/Timed out while waiting for socket to become ready for reading/ . "\n"); + my $r = sysread($self->{fh}, $buf, $len, length $buf); + if (defined $r) { + last unless $r; + $len -= $r; + } + elsif ($! != EINTR) { + if ($self->{fh}->can('errstr')){ + my $err = $self->{fh}->errstr(); + die (qq/Could not read from SSL socket: '$err'\n /); + } + else { + die(qq/Could not read from socket: '$!'\n/); + } + } + } + if ($len && !$allow_partial) { + die(qq/Unexpected end of stream\n/); + } + return $buf; +} + +sub readline { + @_ == 1 || die(q/Usage: $handle->readline()/ . "\n"); + my ($self) = @_; + + while () { + if ($self->{rbuf} =~ s/\A ([^\x0D\x0A]* \x0D?\x0A)//x) { + return $1; + } + if (length $self->{rbuf} >= $self->{max_line_size}) { + die(qq/Line size exceeds the maximum allowed size of $self->{max_line_size}\n/); + } + $self->can_read + or die(qq/Timed out while waiting for socket to become ready for reading\n/); + my $r = sysread($self->{fh}, $self->{rbuf}, BUFSIZE, length $self->{rbuf}); + if (defined $r) { + last unless $r; + } + elsif ($! != EINTR) { + if ($self->{fh}->can('errstr')){ + my $err = $self->{fh}->errstr(); + die (qq/Could not read from SSL socket: '$err'\n /); + } + else { + die(qq/Could not read from socket: '$!'\n/); + } + } + } + die(qq/Unexpected end of stream while looking for line\n/); +} + +sub read_header_lines { + @_ == 1 || @_ == 2 || die(q/Usage: $handle->read_header_lines([headers])/ . "\n"); + my ($self, $headers) = @_; + $headers ||= {}; + my $lines = 0; + my $val; + + while () { + my $line = $self->readline; + + if (++$lines >= $self->{max_header_lines}) { + die(qq/Header lines exceeds maximum number allowed of $self->{max_header_lines}\n/); + } + elsif ($line =~ /\A ([^\x00-\x1F\x7F:]+) : [\x09\x20]* ([^\x0D\x0A]*)/x) { + my ($field_name) = lc $1; + if (exists $headers->{$field_name}) { + for ($headers->{$field_name}) { + $_ = [$_] unless ref $_ eq "ARRAY"; + push @$_, $2; + $val = \$_->[-1]; + } + } + else { + $val = \($headers->{$field_name} = $2); + } + } + elsif ($line =~ /\A [\x09\x20]+ ([^\x0D\x0A]*)/x) { + $val + or die(qq/Unexpected header continuation line\n/); + next unless length $1; + $$val .= ' ' if length $$val; + $$val .= $1; + } + elsif ($line =~ /\A \x0D?\x0A \z/x) { + last; + } + else { + die(q/Malformed header line: / . $Printable->($line) . "\n"); + } + } + return $headers; +} + +sub write_request { + @_ == 2 || die(q/Usage: $handle->write_request(request)/ . "\n"); + my($self, $request) = @_; + $self->write_request_header(@{$request}{qw/method uri headers header_case/}); + $self->write_body($request) if $request->{cb}; + return; +} + +# Standard request header names/case from HTTP/1.1 RFCs +my @rfc_request_headers = qw( + Accept Accept-Charset Accept-Encoding Accept-Language Authorization + Cache-Control Connection Content-Length Expect From Host + If-Match If-Modified-Since If-None-Match If-Range If-Unmodified-Since + Max-Forwards Pragma Proxy-Authorization Range Referer TE Trailer + Transfer-Encoding Upgrade User-Agent Via +); + +my @other_request_headers = qw( + Content-Encoding Content-MD5 Content-Type Cookie DNT Date Origin + X-XSS-Protection +); + +my %HeaderCase = map { lc($_) => $_ } @rfc_request_headers, @other_request_headers; + +# to avoid multiple small writes and hence nagle, you can pass the method line or anything else to +# combine writes. +sub write_header_lines { + (@_ >= 2 && @_ <= 4 && ref $_[1] eq 'HASH') || die(q/Usage: $handle->write_header_lines(headers, [header_case, prefix])/ . "\n"); + my($self, $headers, $header_case, $prefix_data) = @_; + $header_case ||= {}; + + my $buf = (defined $prefix_data ? $prefix_data : ''); + + # Per RFC, control fields should be listed first + my %seen; + for my $k ( qw/host cache-control expect max-forwards pragma range te/ ) { + next unless exists $headers->{$k}; + $seen{$k}++; + my $field_name = $HeaderCase{$k}; + my $v = $headers->{$k}; + for (ref $v eq 'ARRAY' ? @$v : $v) { + $_ = '' unless defined $_; + $buf .= "$field_name: $_\x0D\x0A"; + } + } + + # Other headers sent in arbitrary order + while (my ($k, $v) = each %$headers) { + my $field_name = lc $k; + next if $seen{$field_name}; + if (exists $HeaderCase{$field_name}) { + $field_name = $HeaderCase{$field_name}; + } + else { + if (exists $header_case->{$field_name}) { + $field_name = $header_case->{$field_name}; + } + else { + $field_name =~ s/\b(\w)/\u$1/g; + } + $field_name =~ /\A $Token+ \z/xo + or die(q/Invalid HTTP header field name: / . $Printable->($field_name) . "\n"); + $HeaderCase{lc $field_name} = $field_name; + } + for (ref $v eq 'ARRAY' ? @$v : $v) { + # unwrap a field value if pre-wrapped by user + s/\x0D?\x0A\s+/ /g; + die(qq/Invalid HTTP header field value ($field_name): / . $Printable->($_). "\n") + unless $_ eq '' || /\A $Field_Content \z/xo; + $_ = '' unless defined $_; + $buf .= "$field_name: $_\x0D\x0A"; + } + } + $buf .= "\x0D\x0A"; + return $self->write($buf); +} + +# return value indicates whether message length was defined; this is generally +# true unless there was no content-length header and we just read until EOF. +# Other message length errors are thrown as exceptions +sub read_body { + @_ == 3 || die(q/Usage: $handle->read_body(callback, response)/ . "\n"); + my ($self, $cb, $response) = @_; + my $te = $response->{headers}{'transfer-encoding'} || ''; + my $chunked = grep { /chunked/i } ( ref $te eq 'ARRAY' ? @$te : $te ) ; + return $chunked + ? $self->read_chunked_body($cb, $response) + : $self->read_content_body($cb, $response); +} + +sub write_body { + @_ == 2 || die(q/Usage: $handle->write_body(request)/ . "\n"); + my ($self, $request) = @_; + if ($request->{headers}{'content-length'}) { + return $self->write_content_body($request); + } + else { + return $self->write_chunked_body($request); + } +} + +sub read_content_body { + @_ == 3 || @_ == 4 || die(q/Usage: $handle->read_content_body(callback, response, [read_length])/ . "\n"); + my ($self, $cb, $response, $content_length) = @_; + $content_length ||= $response->{headers}{'content-length'}; + + if ( defined $content_length ) { + my $len = $content_length; + while ($len > 0) { + my $read = ($len > BUFSIZE) ? BUFSIZE : $len; + $cb->($self->read($read, 0), $response); + $len -= $read; + } + return length($self->{rbuf}) == 0; + } + + my $chunk; + $cb->($chunk, $response) while length( $chunk = $self->read(BUFSIZE, 1) ); + + return; +} + +sub write_content_body { + @_ == 2 || die(q/Usage: $handle->write_content_body(request)/ . "\n"); + my ($self, $request) = @_; + + my ($len, $content_length) = (0, $request->{headers}{'content-length'}); + while () { + my $data = $request->{cb}->(); + + defined $data && length $data + or last; + + if ( $] ge '5.008' ) { + utf8::downgrade($data, 1) + or die(qq/Wide character in write_content()\n/); + } + + $len += $self->write($data); + } + + $len == $content_length + or die(qq/Content-Length mismatch (got: $len expected: $content_length)\n/); + + return $len; +} + +sub read_chunked_body { + @_ == 3 || die(q/Usage: $handle->read_chunked_body(callback, $response)/ . "\n"); + my ($self, $cb, $response) = @_; + + while () { + my $head = $self->readline; + + $head =~ /\A ([A-Fa-f0-9]+)/x + or die(q/Malformed chunk head: / . $Printable->($head) . "\n"); + + my $len = hex($1) + or last; + + $self->read_content_body($cb, $response, $len); + + $self->read(2) eq "\x0D\x0A" + or die(qq/Malformed chunk: missing CRLF after chunk data\n/); + } + $self->read_header_lines($response->{headers}); + return 1; +} + +sub write_chunked_body { + @_ == 2 || die(q/Usage: $handle->write_chunked_body(request)/ . "\n"); + my ($self, $request) = @_; + + my $len = 0; + while () { + my $data = $request->{cb}->(); + + defined $data && length $data + or last; + + if ( $] ge '5.008' ) { + utf8::downgrade($data, 1) + or die(qq/Wide character in write_chunked_body()\n/); + } + + $len += length $data; + + my $chunk = sprintf '%X', length $data; + $chunk .= "\x0D\x0A"; + $chunk .= $data; + $chunk .= "\x0D\x0A"; + + $self->write($chunk); + } + $self->write("0\x0D\x0A"); + if ( ref $request->{trailer_cb} eq 'CODE' ) { + $self->write_header_lines($request->{trailer_cb}->()) + } + else { + $self->write("\x0D\x0A"); + } + return $len; +} + +sub read_response_header { + @_ == 1 || die(q/Usage: $handle->read_response_header()/ . "\n"); + my ($self) = @_; + + my $line = $self->readline; + + $line =~ /\A (HTTP\/(0*\d+\.0*\d+)) [\x09\x20]+ ([0-9]{3}) [\x09\x20]+ ([^\x0D\x0A]*) \x0D?\x0A/x + or die(q/Malformed Status-Line: / . $Printable->($line). "\n"); + + my ($protocol, $version, $status, $reason) = ($1, $2, $3, $4); + + die (qq/Unsupported HTTP protocol: $protocol\n/) + unless $version =~ /0*1\.0*[01]/; + + return { + status => $status, + reason => $reason, + headers => $self->read_header_lines, + protocol => $protocol, + }; +} + +sub write_request_header { + @_ == 5 || die(q/Usage: $handle->write_request_header(method, request_uri, headers, header_case)/ . "\n"); + my ($self, $method, $request_uri, $headers, $header_case) = @_; + + return $self->write_header_lines($headers, $header_case, "$method $request_uri HTTP/1.1\x0D\x0A"); +} + +sub _do_timeout { + my ($self, $type, $timeout) = @_; + $timeout = $self->{timeout} + unless defined $timeout && $timeout >= 0; + + my $fd = fileno $self->{fh}; + defined $fd && $fd >= 0 + or die(qq/select(2): 'Bad file descriptor'\n/); + + my $initial = time; + my $pending = $timeout; + my $nfound; + + vec(my $fdset = '', $fd, 1) = 1; + + while () { + $nfound = ($type eq 'read') + ? select($fdset, undef, undef, $pending) + : select(undef, $fdset, undef, $pending) ; + if ($nfound == -1) { + $! == EINTR + or die(qq/select(2): '$!'\n/); + redo if !$timeout || ($pending = $timeout - (time - $initial)) > 0; + $nfound = 0; + } + last; + } + $! = 0; + return $nfound; +} + +sub can_read { + @_ == 1 || @_ == 2 || die(q/Usage: $handle->can_read([timeout])/ . "\n"); + my $self = shift; + if ( ref($self->{fh}) eq 'IO::Socket::SSL' ) { + return 1 if $self->{fh}->pending; + } + return $self->_do_timeout('read', @_) +} + +sub can_write { + @_ == 1 || @_ == 2 || die(q/Usage: $handle->can_write([timeout])/ . "\n"); + my $self = shift; + return $self->_do_timeout('write', @_) +} + +sub _assert_ssl { + my($ok, $reason) = HTTP::Tiny->can_ssl(); + die $reason unless $ok; +} + +sub can_reuse { + my ($self,$scheme,$host,$port,$peer) = @_; + return 0 if + $self->{pid} != $$ + || $self->{tid} != _get_tid() + || length($self->{rbuf}) + || $scheme ne $self->{scheme} + || $host ne $self->{host} + || $port ne $self->{port} + || $peer ne $self->{peer} + || eval { $self->can_read(0) } + || $@ ; + return 1; +} + +# Try to find a CA bundle to validate the SSL cert, +# prefer Mozilla::CA or fallback to a system file +sub _find_CA_file { + my $self = shift(); + + my $ca_file = + defined( $self->{SSL_options}->{SSL_ca_file} ) + ? $self->{SSL_options}->{SSL_ca_file} + : $ENV{SSL_CERT_FILE}; + + if ( defined $ca_file ) { + unless ( -r $ca_file ) { + die qq/SSL_ca_file '$ca_file' not found or not readable\n/; + } + return $ca_file; + } + + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + return Mozilla::CA::SSL_ca_file() + if eval { require Mozilla::CA; 1 }; + + # cert list copied from golang src/crypto/x509/root_unix.go + foreach my $ca_bundle ( + "/etc/ssl/certs/ca-certificates.crt", # Debian/Ubuntu/Gentoo etc. + "/etc/pki/tls/certs/ca-bundle.crt", # Fedora/RHEL + "/etc/ssl/ca-bundle.pem", # OpenSUSE + "/etc/openssl/certs/ca-certificates.crt", # NetBSD + "/etc/ssl/cert.pem", # OpenBSD + "/usr/local/share/certs/ca-root-nss.crt", # FreeBSD/DragonFly + "/etc/pki/tls/cacert.pem", # OpenELEC + "/etc/certs/ca-certificates.crt", # Solaris 11.2+ + ) { + return $ca_bundle if -e $ca_bundle; + } + + die qq/Couldn't find a CA bundle with which to verify the SSL certificate.\n/ + . qq/Try installing Mozilla::CA from CPAN\n/; +} + +# for thread safety, we need to know thread id if threads are loaded +sub _get_tid { + no warnings 'reserved'; # for 'threads' + return threads->can("tid") ? threads->tid : 0; +} + +sub _ssl_args { + my ($self, $host) = @_; + + my %ssl_args; + + # This test reimplements IO::Socket::SSL::can_client_sni(), which wasn't + # added until IO::Socket::SSL 1.84 + if ( Net::SSLeay::OPENSSL_VERSION_NUMBER() >= 0x01000000 ) { + $ssl_args{SSL_hostname} = $host, # Sane SNI support + } + + if ($self->{verify_SSL}) { + $ssl_args{SSL_verifycn_scheme} = 'http'; # enable CN validation + $ssl_args{SSL_verifycn_name} = $host; # set validation hostname + $ssl_args{SSL_verify_mode} = 0x01; # enable cert validation + $ssl_args{SSL_ca_file} = $self->_find_CA_file; + } + else { + $ssl_args{SSL_verifycn_scheme} = 'none'; # disable CN validation + $ssl_args{SSL_verify_mode} = 0x00; # disable cert validation + } + + # user options override settings from verify_SSL + for my $k ( keys %{$self->{SSL_options}} ) { + $ssl_args{$k} = $self->{SSL_options}{$k} if $k =~ m/^SSL_/; + } + + return \%ssl_args; +} + +1; + +__END__ + +package PerlIO::via::QuotedPrint; + +$VERSION= '0.08'; + +# be as strict as possible +use strict; + +# modules that we need +use MIME::QuotedPrint (); # no need to pollute this namespace + +# satisfy -require- +1; + +#------------------------------------------------------------------------------- +# +# Standard Perl features +# +#------------------------------------------------------------------------------- +# IN: 1 class to bless with +# 2 mode string (ignored) +# 3 file handle of PerlIO layer below (ignored) +# OUT: 1 blessed object + +sub PUSHED { bless \*PUSHED,$_[0] } #PUSHED + +#------------------------------------------------------------------------------- +# IN: 1 instantiated object (ignored) +# 2 handle to read from +# OUT: 1 decoded string + +sub FILL { + + # decode and return + my $line= readline( $_[1] ); + return ( defined $line ) + ? MIME::QuotedPrint::decode_qp($line) + : undef; +} #FILL + +#------------------------------------------------------------------------------- +# IN: 1 instantiated object (ignored) +# 2 buffer to be written +# 3 handle to write to +# OUT: 1 number of bytes written + +sub WRITE { + + # encode and write to handle: indicate result + return ( print { $_[2] } MIME::QuotedPrint::encode_qp( $_[1] ) ) + ? length( $_[1] ) + : -1; +} #WRITE + +#------------------------------------------------------------------------------- + +__END__ + +package Text::ParseWords; + +use strict; +require 5.006; +our $VERSION = "3.30"; + + +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(shellwords quotewords nested_quotewords parse_line); +our @EXPORT_OK = qw(old_shellwords); +our $PERL_SINGLE_QUOTE; + + +sub shellwords { + my (@lines) = @_; + my @allwords; + + foreach my $line (@lines) { + $line =~ s/^\s+//; + my @words = parse_line('\s+', 0, $line); + pop @words if (@words and !defined $words[-1]); + return() unless (@words || !length($line)); + push(@allwords, @words); + } + return(@allwords); +} + + + +sub quotewords { + my($delim, $keep, @lines) = @_; + my($line, @words, @allwords); + + foreach $line (@lines) { + @words = parse_line($delim, $keep, $line); + return() unless (@words || !length($line)); + push(@allwords, @words); + } + return(@allwords); +} + + + +sub nested_quotewords { + my($delim, $keep, @lines) = @_; + my($i, @allwords); + + for ($i = 0; $i < @lines; $i++) { + @{$allwords[$i]} = parse_line($delim, $keep, $lines[$i]); + return() unless (@{$allwords[$i]} || !length($lines[$i])); + } + return(@allwords); +} + + + +sub parse_line { + my($delimiter, $keep, $line) = @_; + my($word, @pieces); + + no warnings 'uninitialized'; # we will be testing undef strings + + while (length($line)) { + # This pattern is optimised to be stack conservative on older perls. + # Do not refactor without being careful and testing it on very long strings. + # See Perl bug #42980 for an example of a stack busting input. + $line =~ s/^ + (?: + # double quoted string + (") # $quote + ((?>[^\\"]*(?:\\.[^\\"]*)*))" # $quoted + | # --OR-- + # singe quoted string + (') # $quote + ((?>[^\\']*(?:\\.[^\\']*)*))' # $quoted + | # --OR-- + # unquoted string + ( # $unquoted + (?:\\.|[^\\"'])*? + ) + # followed by + ( # $delim + \Z(?!\n) # EOL + | # --OR-- + (?-x:$delimiter) # delimiter + | # --OR-- + (?!^)(?=["']) # a quote + ) + )//xs or return; # extended layout + my ($quote, $quoted, $unquoted, $delim) = (($1 ? ($1,$2) : ($3,$4)), $5, $6); + + + return() unless( defined($quote) || length($unquoted) || length($delim)); + + if ($keep) { + $quoted = "$quote$quoted$quote"; + } + else { + $unquoted =~ s/\\(.)/$1/sg; + if (defined $quote) { + $quoted =~ s/\\(.)/$1/sg if ($quote eq '"'); + $quoted =~ s/\\([\\'])/$1/g if ( $PERL_SINGLE_QUOTE && $quote eq "'"); + } + } + $word .= substr($line, 0, 0); # leave results tainted + $word .= defined $quote ? $quoted : $unquoted; + + if (length($delim)) { + push(@pieces, $word); + push(@pieces, $delim) if ($keep eq 'delimiters'); + undef $word; + } + if (!length($line)) { + push(@pieces, $word); + } + } + return(@pieces); +} + + + +sub old_shellwords { + + # Usage: + # use ParseWords; + # @words = old_shellwords($line); + # or + # @words = old_shellwords(@lines); + # or + # @words = old_shellwords(); # defaults to $_ (and clobbers it) + + no warnings 'uninitialized'; # we will be testing undef strings + local *_ = \join('', @_) if @_; + my (@words, $snippet); + + s/\A\s+//; + while ($_ ne '') { + my $field = substr($_, 0, 0); # leave results tainted + for (;;) { + if (s/\A"(([^"\\]|\\.)*)"//s) { + ($snippet = $1) =~ s#\\(.)#$1#sg; + } + elsif (/\A"/) { + require Carp; + Carp::carp("Unmatched double quote: $_"); + return(); + } + elsif (s/\A'(([^'\\]|\\.)*)'//s) { + ($snippet = $1) =~ s#\\(.)#$1#sg; + } + elsif (/\A'/) { + require Carp; + Carp::carp("Unmatched single quote: $_"); + return(); + } + elsif (s/\A\\(.?)//s) { + $snippet = $1; + } + elsif (s/\A([^\s\\'"]+)//) { + $snippet = $1; + } + else { + s/\A\s+//; + last; + } + $field .= $snippet; + } + push(@words, $field); + } + return @words; +} + +1; + +__END__ + +package Text::Balanced; + +# EXTRACT VARIOUSLY DELIMITED TEXT SEQUENCES FROM STRINGS. +# FOR FULL DOCUMENTATION SEE Balanced.pod + +use 5.005; +use strict; +use Exporter (); +use SelfLoader; + +use vars qw { $VERSION @ISA %EXPORT_TAGS }; +BEGIN { + $VERSION = '2.03'; + @ISA = 'Exporter'; + %EXPORT_TAGS = ( + ALL => [ qw{ + &extract_delimited + &extract_bracketed + &extract_quotelike + &extract_codeblock + &extract_variable + &extract_tagged + &extract_multiple + &gen_delimited_pat + &gen_extract_tagged + &delimited_pat + } ], + ); +} + +Exporter::export_ok_tags('ALL'); + +# PROTOTYPES + +sub _match_bracketed($$$$$$); +sub _match_variable($$); +sub _match_codeblock($$$$$$$); +sub _match_quotelike($$$$); + +# HANDLE RETURN VALUES IN VARIOUS CONTEXTS + +sub _failmsg { + my ($message, $pos) = @_; + $@ = bless { + error => $message, + pos => $pos, + }, 'Text::Balanced::ErrorMsg'; +} + +sub _fail { + my ($wantarray, $textref, $message, $pos) = @_; + _failmsg $message, $pos if $message; + return (undef, $$textref, undef) if $wantarray; + return undef; +} + +sub _succeed { + $@ = undef; + my ($wantarray,$textref) = splice @_, 0, 2; + my ($extrapos, $extralen) = @_ > 18 + ? splice(@_, -2, 2) + : (0, 0); + my ($startlen, $oppos) = @_[5,6]; + my $remainderpos = $_[2]; + if ( $wantarray ) { + my @res; + while (my ($from, $len) = splice @_, 0, 2) { + push @res, substr($$textref, $from, $len); + } + if ( $extralen ) { # CORRECT FILLET + my $extra = substr($res[0], $extrapos-$oppos, $extralen, "\n"); + $res[1] = "$extra$res[1]"; + eval { substr($$textref,$remainderpos,0) = $extra; + substr($$textref,$extrapos,$extralen,"\n")} ; + #REARRANGE HERE DOC AND FILLET IF POSSIBLE + pos($$textref) = $remainderpos-$extralen+1; # RESET \G + } else { + pos($$textref) = $remainderpos; # RESET \G + } + return @res; + } else { + my $match = substr($$textref,$_[0],$_[1]); + substr($match,$extrapos-$_[0]-$startlen,$extralen,"") if $extralen; + my $extra = $extralen + ? substr($$textref, $extrapos, $extralen)."\n" : ""; + eval {substr($$textref,$_[4],$_[1]+$_[5])=$extra} ; #CHOP OUT PREFIX & MATCH, IF POSSIBLE + pos($$textref) = $_[4]; # RESET \G + return $match; + } +} + +# BUILD A PATTERN MATCHING A SIMPLE DELIMITED STRING + +sub gen_delimited_pat($;$) # ($delimiters;$escapes) +{ + my ($dels, $escs) = @_; + return "" unless $dels =~ /\S/; + $escs = '\\' unless $escs; + $escs .= substr($escs,-1) x (length($dels)-length($escs)); + my @pat = (); + my $i; + for ($i=0; $i\0-\377/[[(({{</) + { + return _fail $wantarray, $textref, + "Did not find a suitable bracket in delimiter: \"$_[1]\"", + 0; + } + my $posbug = pos; + $ldel = join('|', map { quotemeta $_ } split('', $ldel)); + $rdel = join('|', map { quotemeta $_ } split('', $rdel)); + pos = $posbug; + + my $startpos = pos $$textref || 0; + my @match = _match_bracketed($textref,$pre, $ldel, $qdel, $quotelike, $rdel); + + return _fail ($wantarray, $textref) unless @match; + + return _succeed ( $wantarray, $textref, + $match[2], $match[5]+2, # MATCH + @match[8,9], # REMAINDER + @match[0,1], # PREFIX + ); +} + +sub _match_bracketed($$$$$$) # $textref, $pre, $ldel, $qdel, $quotelike, $rdel +{ + my ($textref, $pre, $ldel, $qdel, $quotelike, $rdel) = @_; + my ($startpos, $ldelpos, $endpos) = (pos $$textref = pos $$textref||0); + unless ($$textref =~ m/\G$pre/gc) + { + _failmsg "Did not find prefix: /$pre/", $startpos; + return; + } + + $ldelpos = pos $$textref; + + unless ($$textref =~ m/\G($ldel)/gc) + { + _failmsg "Did not find opening bracket after prefix: \"$pre\"", + pos $$textref; + pos $$textref = $startpos; + return; + } + + my @nesting = ( $1 ); + my $textlen = length $$textref; + while (pos $$textref < $textlen) + { + next if $$textref =~ m/\G\\./gcs; + + if ($$textref =~ m/\G($ldel)/gc) + { + push @nesting, $1; + } + elsif ($$textref =~ m/\G($rdel)/gc) + { + my ($found, $brackettype) = ($1, $1); + if ($#nesting < 0) + { + _failmsg "Unmatched closing bracket: \"$found\"", + pos $$textref; + pos $$textref = $startpos; + return; + } + my $expected = pop(@nesting); + $expected =~ tr/({[/; + if ($expected ne $brackettype) + { + _failmsg qq{Mismatched closing bracket: expected "$expected" but found "$found"}, + pos $$textref; + pos $$textref = $startpos; + return; + } + last if $#nesting < 0; + } + elsif ($qdel && $$textref =~ m/\G([$qdel])/gc) + { + $$textref =~ m/\G[^\\$1]*(?:\\.[^\\$1]*)*(\Q$1\E)/gsc and next; + _failmsg "Unmatched embedded quote ($1)", + pos $$textref; + pos $$textref = $startpos; + return; + } + elsif ($quotelike && _match_quotelike($textref,"",1,0)) + { + next; + } + + else { $$textref =~ m/\G(?:[a-zA-Z0-9]+|.)/gcs } + } + if ($#nesting>=0) + { + _failmsg "Unmatched opening bracket(s): " + . join("..",@nesting)."..", + pos $$textref; + pos $$textref = $startpos; + return; + } + + $endpos = pos $$textref; + + return ( + $startpos, $ldelpos-$startpos, # PREFIX + $ldelpos, 1, # OPENING BRACKET + $ldelpos+1, $endpos-$ldelpos-2, # CONTENTS + $endpos-1, 1, # CLOSING BRACKET + $endpos, length($$textref)-$endpos, # REMAINDER + ); +} + +sub _revbracket($) +{ + my $brack = reverse $_[0]; + $brack =~ tr/[({/; + return $brack; +} + +my $XMLNAME = q{[a-zA-Z_:][a-zA-Z0-9_:.-]*}; + +sub extract_tagged (;$$$$$) # ($text, $opentag, $closetag, $pre, \%options) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + my $ldel = $_[1]; + my $rdel = $_[2]; + my $pre = defined $_[3] ? $_[3] : '\s*'; + my %options = defined $_[4] ? %{$_[4]} : (); + my $omode = defined $options{fail} ? $options{fail} : ''; + my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}}) + : defined($options{reject}) ? $options{reject} + : '' + ; + my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}}) + : defined($options{ignore}) ? $options{ignore} + : '' + ; + + if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; } + $@ = undef; + + my @match = _match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); + + return _fail(wantarray, $textref) unless @match; + return _succeed wantarray, $textref, + $match[2], $match[3]+$match[5]+$match[7], # MATCH + @match[8..9,0..1,2..7]; # REM, PRE, BITS +} + +sub _match_tagged # ($$$$$$$) +{ + my ($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore) = @_; + my $rdelspec; + + my ($startpos, $opentagpos, $textpos, $parapos, $closetagpos, $endpos) = ( pos($$textref) = pos($$textref)||0 ); + + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg "Did not find prefix: /$pre/", pos $$textref; + goto failed; + } + + $opentagpos = pos($$textref); + + unless ($$textref =~ m/\G$ldel/gc) + { + _failmsg "Did not find opening tag: /$ldel/", pos $$textref; + goto failed; + } + + $textpos = pos($$textref); + + if (!defined $rdel) + { + $rdelspec = substr($$textref, $-[0], $+[0] - $-[0]); + unless ($rdelspec =~ s/\A([[(<{]+)($XMLNAME).*/ quotemeta "$1\/$2". _revbracket($1) /oes) + { + _failmsg "Unable to construct closing tag to match: $rdel", + pos $$textref; + goto failed; + } + } + else + { + $rdelspec = eval "qq{$rdel}" || do { + my $del; + for (qw,~ ! ^ & * ) _ + - = } ] : " ; ' > . ? / | ',) + { next if $rdel =~ /\Q$_/; $del = $_; last } + unless ($del) { + use Carp; + croak "Can't interpolate right delimiter $rdel" + } + eval "qq$del$rdel$del"; + }; + } + + while (pos($$textref) < length($$textref)) + { + next if $$textref =~ m/\G\\./gc; + + if ($$textref =~ m/\G(\n[ \t]*\n)/gc ) + { + $parapos = pos($$textref) - length($1) + unless defined $parapos; + } + elsif ($$textref =~ m/\G($rdelspec)/gc ) + { + $closetagpos = pos($$textref)-length($1); + goto matched; + } + elsif ($ignore && $$textref =~ m/\G(?:$ignore)/gc) + { + next; + } + elsif ($bad && $$textref =~ m/\G($bad)/gcs) + { + pos($$textref) -= length($1); # CUT OFF WHATEVER CAUSED THE SHORTNESS + goto short if ($omode eq 'PARA' || $omode eq 'MAX'); + _failmsg "Found invalid nested tag: $1", pos $$textref; + goto failed; + } + elsif ($$textref =~ m/\G($ldel)/gc) + { + my $tag = $1; + pos($$textref) -= length($tag); # REWIND TO NESTED TAG + unless (_match_tagged(@_)) # MATCH NESTED TAG + { + goto short if $omode eq 'PARA' || $omode eq 'MAX'; + _failmsg "Found unbalanced nested tag: $tag", + pos $$textref; + goto failed; + } + } + else { $$textref =~ m/./gcs } + } + +short: + $closetagpos = pos($$textref); + goto matched if $omode eq 'MAX'; + goto failed unless $omode eq 'PARA'; + + if (defined $parapos) { pos($$textref) = $parapos } + else { $parapos = pos($$textref) } + + return ( + $startpos, $opentagpos-$startpos, # PREFIX + $opentagpos, $textpos-$opentagpos, # OPENING TAG + $textpos, $parapos-$textpos, # TEXT + $parapos, 0, # NO CLOSING TAG + $parapos, length($$textref)-$parapos, # REMAINDER + ); + +matched: + $endpos = pos($$textref); + return ( + $startpos, $opentagpos-$startpos, # PREFIX + $opentagpos, $textpos-$opentagpos, # OPENING TAG + $textpos, $closetagpos-$textpos, # TEXT + $closetagpos, $endpos-$closetagpos, # CLOSING TAG + $endpos, length($$textref)-$endpos, # REMAINDER + ); + +failed: + _failmsg "Did not find closing tag", pos $$textref unless $@; + pos($$textref) = $startpos; + return; +} + +sub extract_variable (;$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + return ("","","") unless defined $$textref; + my $pre = defined $_[1] ? $_[1] : '\s*'; + + my @match = _match_variable($textref,$pre); + + return _fail wantarray, $textref unless @match; + + return _succeed wantarray, $textref, + @match[2..3,4..5,0..1]; # MATCH, REMAINDER, PREFIX +} + +sub _match_variable($$) +{ +# $# +# $^ +# $$ + my ($textref, $pre) = @_; + my $startpos = pos($$textref) = pos($$textref)||0; + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg "Did not find prefix: /$pre/", pos $$textref; + return; + } + my $varpos = pos($$textref); + unless ($$textref =~ m{\G\$\s*(?!::)(\d+|[][&`'+*./|,";%=~:?!\@<>()-]|\^[a-z]?)}gci) + { + unless ($$textref =~ m/\G((\$#?|[*\@\%]|\\&)+)/gc) + { + _failmsg "Did not find leading dereferencer", pos $$textref; + pos $$textref = $startpos; + return; + } + my $deref = $1; + + unless ($$textref =~ m/\G\s*(?:::|')?(?:[_a-z]\w*(?:::|'))*[_a-z]\w*/gci + or _match_codeblock($textref, "", '\{', '\}', '\{', '\}', 0) + or $deref eq '$#' or $deref eq '$$' ) + { + _failmsg "Bad identifier after dereferencer", pos $$textref; + pos $$textref = $startpos; + return; + } + } + + while (1) + { + next if $$textref =~ m/\G\s*(?:->)?\s*[{]\w+[}]/gc; + next if _match_codeblock($textref, + qr/\s*->\s*(?:[_a-zA-Z]\w+\s*)?/, + qr/[({[]/, qr/[)}\]]/, + qr/[({[]/, qr/[)}\]]/, 0); + next if _match_codeblock($textref, + qr/\s*/, qr/[{[]/, qr/[}\]]/, + qr/[{[]/, qr/[}\]]/, 0); + next if _match_variable($textref,'\s*->\s*'); + next if $$textref =~ m/\G\s*->\s*\w+(?![{([])/gc; + last; + } + + my $endpos = pos($$textref); + return ($startpos, $varpos-$startpos, + $varpos, $endpos-$varpos, + $endpos, length($$textref)-$endpos + ); +} + +sub extract_codeblock (;$$$$$) +{ + my $textref = defined $_[0] ? \$_[0] : \$_; + my $wantarray = wantarray; + my $ldel_inner = defined $_[1] ? $_[1] : '{'; + my $pre = defined $_[2] ? $_[2] : '\s*'; + my $ldel_outer = defined $_[3] ? $_[3] : $ldel_inner; + my $rd = $_[4]; + my $rdel_inner = $ldel_inner; + my $rdel_outer = $ldel_outer; + my $posbug = pos; + for ($ldel_inner, $ldel_outer) { tr/[]()<>{}\0-\377/[[((<<{{/ds } + for ($rdel_inner, $rdel_outer) { tr/[]()<>{}\0-\377/]]))>>}}/ds } + for ($ldel_inner, $ldel_outer, $rdel_inner, $rdel_outer) + { + $_ = '('.join('|',map { quotemeta $_ } split('',$_)).')' + } + pos = $posbug; + + my @match = _match_codeblock($textref, $pre, + $ldel_outer, $rdel_outer, + $ldel_inner, $rdel_inner, + $rd); + return _fail($wantarray, $textref) unless @match; + return _succeed($wantarray, $textref, + @match[2..3,4..5,0..1] # MATCH, REMAINDER, PREFIX + ); + +} + +sub _match_codeblock($$$$$$$) +{ + my ($textref, $pre, $ldel_outer, $rdel_outer, $ldel_inner, $rdel_inner, $rd) = @_; + my $startpos = pos($$textref) = pos($$textref) || 0; + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg qq{Did not match prefix /$pre/ at"} . + substr($$textref,pos($$textref),20) . + q{..."}, + pos $$textref; + return; + } + my $codepos = pos($$textref); + unless ($$textref =~ m/\G($ldel_outer)/gc) # OUTERMOST DELIMITER + { + _failmsg qq{Did not find expected opening bracket at "} . + substr($$textref,pos($$textref),20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + my $closing = $1; + $closing =~ tr/([<{/)]>}/; + my $matched; + my $patvalid = 1; + while (pos($$textref) < length($$textref)) + { + $matched = ''; + if ($rd && $$textref =~ m#\G(\Q(?)\E|\Q(s?)\E|\Q(s)\E)#gc) + { + $patvalid = 0; + next; + } + + if ($$textref =~ m/\G\s*#.*/gc) + { + next; + } + + if ($$textref =~ m/\G\s*($rdel_outer)/gc) + { + unless ($matched = ($closing && $1 eq $closing) ) + { + next if $1 eq '>'; # MIGHT BE A "LESS THAN" + _failmsg q{Mismatched closing bracket at "} . + substr($$textref,pos($$textref),20) . + qq{...". Expected '$closing'}, + pos $$textref; + } + last; + } + + if (_match_variable($textref,'\s*') || + _match_quotelike($textref,'\s*',$patvalid,$patvalid) ) + { + $patvalid = 0; + next; + } + + + # NEED TO COVER MANY MORE CASES HERE!!! + if ($$textref =~ m#\G\s*(?!$ldel_inner) + ( [-+*x/%^&|.]=? + | [!=]~ + | =(?!>) + | (\*\*|&&|\|\||<<|>>)=? + | split|grep|map|return + | [([] + )#gcx) + { + $patvalid = 1; + next; + } + + if ( _match_codeblock($textref, '\s*', $ldel_inner, $rdel_inner, $ldel_inner, $rdel_inner, $rd) ) + { + $patvalid = 1; + next; + } + + if ($$textref =~ m/\G\s*$ldel_outer/gc) + { + _failmsg q{Improperly nested codeblock at "} . + substr($$textref,pos($$textref),20) . + q{..."}, + pos $$textref; + last; + } + + $patvalid = 0; + $$textref =~ m/\G\s*(\w+|[-=>]>|.|\Z)/gc; + } + continue { $@ = undef } + + unless ($matched) + { + _failmsg 'No match found for opening bracket', pos $$textref + unless $@; + return; + } + + my $endpos = pos($$textref); + return ( $startpos, $codepos-$startpos, + $codepos, $endpos-$codepos, + $endpos, length($$textref)-$endpos, + ); +} + + +my %mods = ( + 'none' => '[cgimsox]*', + 'm' => '[cgimsox]*', + 's' => '[cegimsox]*', + 'tr' => '[cds]*', + 'y' => '[cds]*', + 'qq' => '', + 'qx' => '', + 'qw' => '', + 'qr' => '[imsx]*', + 'q' => '', + ); + +sub extract_quotelike (;$$) +{ + my $textref = $_[0] ? \$_[0] : \$_; + my $wantarray = wantarray; + my $pre = defined $_[1] ? $_[1] : '\s*'; + + my @match = _match_quotelike($textref,$pre,1,0); + return _fail($wantarray, $textref) unless @match; + return _succeed($wantarray, $textref, + $match[2], $match[18]-$match[2], # MATCH + @match[18,19], # REMAINDER + @match[0,1], # PREFIX + @match[2..17], # THE BITS + @match[20,21], # ANY FILLET? + ); +}; + +sub _match_quotelike($$$$) # ($textref, $prepat, $allow_raw_match) +{ + my ($textref, $pre, $rawmatch, $qmark) = @_; + + my ($textlen,$startpos, + $oppos, + $preld1pos,$ld1pos,$str1pos,$rd1pos, + $preld2pos,$ld2pos,$str2pos,$rd2pos, + $modpos) = ( length($$textref), pos($$textref) = pos($$textref) || 0 ); + + unless ($$textref =~ m/\G($pre)/gc) + { + _failmsg qq{Did not find prefix /$pre/ at "} . + substr($$textref, pos($$textref), 20) . + q{..."}, + pos $$textref; + return; + } + $oppos = pos($$textref); + + my $initial = substr($$textref,$oppos,1); + + if ($initial && $initial =~ m|^[\"\'\`]| + || $rawmatch && $initial =~ m|^/| + || $qmark && $initial =~ m|^\?|) + { + unless ($$textref =~ m/ \Q$initial\E [^\\$initial]* (\\.[^\\$initial]*)* \Q$initial\E /gcsx) + { + _failmsg qq{Did not find closing delimiter to match '$initial' at "} . + substr($$textref, $oppos, 20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + $modpos= pos($$textref); + $rd1pos = $modpos-1; + + if ($initial eq '/' || $initial eq '?') + { + $$textref =~ m/\G$mods{none}/gc + } + + my $endpos = pos($$textref); + return ( + $startpos, $oppos-$startpos, # PREFIX + $oppos, 0, # NO OPERATOR + $oppos, 1, # LEFT DEL + $oppos+1, $rd1pos-$oppos-1, # STR/PAT + $rd1pos, 1, # RIGHT DEL + $modpos, 0, # NO 2ND LDEL + $modpos, 0, # NO 2ND STR + $modpos, 0, # NO 2ND RDEL + $modpos, $endpos-$modpos, # MODIFIERS + $endpos, $textlen-$endpos, # REMAINDER + ); + } + + unless ($$textref =~ m{\G(\b(?:m|s|qq|qx|qw|q|qr|tr|y)\b(?=\s*\S)|<<)}gc) + { + _failmsg q{No quotelike operator found after prefix at "} . + substr($$textref, pos($$textref), 20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + + my $op = $1; + $preld1pos = pos($$textref); + if ($op eq '<<') { + $ld1pos = pos($$textref); + my $label; + if ($$textref =~ m{\G([A-Za-z_]\w*)}gc) { + $label = $1; + } + elsif ($$textref =~ m{ \G ' ([^'\\]* (?:\\.[^'\\]*)*) ' + | \G " ([^"\\]* (?:\\.[^"\\]*)*) " + | \G ` ([^`\\]* (?:\\.[^`\\]*)*) ` + }gcsx) { + $label = $+; + } + else { + $label = ""; + } + my $extrapos = pos($$textref); + $$textref =~ m{.*\n}gc; + $str1pos = pos($$textref)--; + unless ($$textref =~ m{.*?\n(?=\Q$label\E\n)}gc) { + _failmsg qq{Missing here doc terminator ('$label') after "} . + substr($$textref, $startpos, 20) . + q{..."}, + pos $$textref; + pos $$textref = $startpos; + return; + } + $rd1pos = pos($$textref); + $$textref =~ m{\Q$label\E\n}gc; + $ld2pos = pos($$textref); + return ( + $startpos, $oppos-$startpos, # PREFIX + $oppos, length($op), # OPERATOR + $ld1pos, $extrapos-$ld1pos, # LEFT DEL + $str1pos, $rd1pos-$str1pos, # STR/PAT + $rd1pos, $ld2pos-$rd1pos, # RIGHT DEL + $ld2pos, 0, # NO 2ND LDEL + $ld2pos, 0, # NO 2ND STR + $ld2pos, 0, # NO 2ND RDEL + $ld2pos, 0, # NO MODIFIERS + $ld2pos, $textlen-$ld2pos, # REMAINDER + $extrapos, $str1pos-$extrapos, # FILLETED BIT + ); + } + + $$textref =~ m/\G\s*/gc; + $ld1pos = pos($$textref); + $str1pos = $ld1pos+1; + + unless ($$textref =~ m/\G(\S)/gc) # SHOULD USE LOOKAHEAD + { + _failmsg "No block delimiter found after quotelike $op", + pos $$textref; + pos $$textref = $startpos; + return; + } + pos($$textref) = $ld1pos; # HAVE TO DO THIS BECAUSE LOOKAHEAD BROKEN + my ($ldel1, $rdel1) = ("\Q$1","\Q$1"); + if ($ldel1 =~ /[[(<{]/) + { + $rdel1 =~ tr/[({/; + defined(_match_bracketed($textref,"",$ldel1,"","",$rdel1)) + || do { pos $$textref = $startpos; return }; + $ld2pos = pos($$textref); + $rd1pos = $ld2pos-1; + } + else + { + $$textref =~ /\G$ldel1[^\\$ldel1]*(\\.[^\\$ldel1]*)*$ldel1/gcs + || do { pos $$textref = $startpos; return }; + $ld2pos = $rd1pos = pos($$textref)-1; + } + + my $second_arg = $op =~ /s|tr|y/ ? 1 : 0; + if ($second_arg) + { + my ($ldel2, $rdel2); + if ($ldel1 =~ /[[(<{]/) + { + unless ($$textref =~ /\G\s*(\S)/gc) # SHOULD USE LOOKAHEAD + { + _failmsg "Missing second block for quotelike $op", + pos $$textref; + pos $$textref = $startpos; + return; + } + $ldel2 = $rdel2 = "\Q$1"; + $rdel2 =~ tr/[({/; + } + else + { + $ldel2 = $rdel2 = $ldel1; + } + $str2pos = $ld2pos+1; + + if ($ldel2 =~ /[[(<{]/) + { + pos($$textref)--; # OVERCOME BROKEN LOOKAHEAD + defined(_match_bracketed($textref,"",$ldel2,"","",$rdel2)) + || do { pos $$textref = $startpos; return }; + } + else + { + $$textref =~ /[^\\$ldel2]*(\\.[^\\$ldel2]*)*$ldel2/gcs + || do { pos $$textref = $startpos; return }; + } + $rd2pos = pos($$textref)-1; + } + else + { + $ld2pos = $str2pos = $rd2pos = $rd1pos; + } + + $modpos = pos $$textref; + + $$textref =~ m/\G($mods{$op})/gc; + my $endpos = pos $$textref; + + return ( + $startpos, $oppos-$startpos, # PREFIX + $oppos, length($op), # OPERATOR + $ld1pos, 1, # LEFT DEL + $str1pos, $rd1pos-$str1pos, # STR/PAT + $rd1pos, 1, # RIGHT DEL + $ld2pos, $second_arg, # 2ND LDEL (MAYBE) + $str2pos, $rd2pos-$str2pos, # 2ND STR (MAYBE) + $rd2pos, $second_arg, # 2ND RDEL (MAYBE) + $modpos, $endpos-$modpos, # MODIFIERS + $endpos, $textlen-$endpos, # REMAINDER + ); +} + +my $def_func = [ + sub { extract_variable($_[0], '') }, + sub { extract_quotelike($_[0],'') }, + sub { extract_codeblock($_[0],'{}','') }, +]; + +sub extract_multiple (;$$$$) # ($text, $functions_ref, $max_fields, $ignoreunknown) +{ + my $textref = defined($_[0]) ? \$_[0] : \$_; + my $posbug = pos; + my ($lastpos, $firstpos); + my @fields = (); + + #for ($$textref) + { + my @func = defined $_[1] ? @{$_[1]} : @{$def_func}; + my $max = defined $_[2] && $_[2]>0 ? $_[2] : 1_000_000_000; + my $igunk = $_[3]; + + pos $$textref ||= 0; + + unless (wantarray) + { + use Carp; + carp "extract_multiple reset maximal count to 1 in scalar context" + if $^W && defined($_[2]) && $max > 1; + $max = 1 + } + + my $unkpos; + my $func; + my $class; + + my @class; + foreach $func ( @func ) + { + if (ref($func) eq 'HASH') + { + push @class, (keys %$func)[0]; + $func = (values %$func)[0]; + } + else + { + push @class, undef; + } + } + + FIELD: while (pos($$textref) < length($$textref)) + { + my ($field, $rem); + my @bits; + foreach my $i ( 0..$#func ) + { + my $pref; + $func = $func[$i]; + $class = $class[$i]; + $lastpos = pos $$textref; + if (ref($func) eq 'CODE') + { ($field,$rem,$pref) = @bits = $func->($$textref) } + elsif (ref($func) eq 'Text::Balanced::Extractor') + { @bits = $field = $func->extract($$textref) } + elsif( $$textref =~ m/\G$func/gc ) + { @bits = $field = defined($1) + ? $1 + : substr($$textref, $-[0], $+[0] - $-[0]) + } + $pref ||= ""; + if (defined($field) && length($field)) + { + if (!$igunk) { + $unkpos = $lastpos + if length($pref) && !defined($unkpos); + if (defined $unkpos) + { + push @fields, substr($$textref, $unkpos, $lastpos-$unkpos).$pref; + $firstpos = $unkpos unless defined $firstpos; + undef $unkpos; + last FIELD if @fields == $max; + } + } + push @fields, $class + ? bless (\$field, $class) + : $field; + $firstpos = $lastpos unless defined $firstpos; + $lastpos = pos $$textref; + last FIELD if @fields == $max; + next FIELD; + } + } + if ($$textref =~ /\G(.)/gcs) + { + $unkpos = pos($$textref)-1 + unless $igunk || defined $unkpos; + } + } + + if (defined $unkpos) + { + push @fields, substr($$textref, $unkpos); + $firstpos = $unkpos unless defined $firstpos; + $lastpos = length $$textref; + } + last; + } + + pos $$textref = $lastpos; + return @fields if wantarray; + + $firstpos ||= 0; + eval { substr($$textref,$firstpos,$lastpos-$firstpos)=""; + pos $$textref = $firstpos }; + return $fields[0]; +} + +sub gen_extract_tagged # ($opentag, $closetag, $pre, \%options) +{ + my $ldel = $_[0]; + my $rdel = $_[1]; + my $pre = defined $_[2] ? $_[2] : '\s*'; + my %options = defined $_[3] ? %{$_[3]} : (); + my $omode = defined $options{fail} ? $options{fail} : ''; + my $bad = ref($options{reject}) eq 'ARRAY' ? join('|', @{$options{reject}}) + : defined($options{reject}) ? $options{reject} + : '' + ; + my $ignore = ref($options{ignore}) eq 'ARRAY' ? join('|', @{$options{ignore}}) + : defined($options{ignore}) ? $options{ignore} + : '' + ; + + if (!defined $ldel) { $ldel = '<\w+(?:' . gen_delimited_pat(q{'"}) . '|[^>])*>'; } + + my $posbug = pos; + for ($ldel, $pre, $bad, $ignore) { $_ = qr/$_/ if $_ } + pos = $posbug; + + my $closure = sub + { + my $textref = defined $_[0] ? \$_[0] : \$_; + my @match = Text::Balanced::_match_tagged($textref, $pre, $ldel, $rdel, $omode, $bad, $ignore); + + return _fail(wantarray, $textref) unless @match; + return _succeed wantarray, $textref, + $match[2], $match[3]+$match[5]+$match[7], # MATCH + @match[8..9,0..1,2..7]; # REM, PRE, BITS + }; + + bless $closure, 'Text::Balanced::Extractor'; +} + +package Text::Balanced::Extractor; + +sub extract($$) # ($self, $text) +{ + &{$_[0]}($_[1]); +} + +package Text::Balanced::ErrorMsg; + +use overload '""' => sub { "$_[0]->{error}, detected at offset $_[0]->{pos}" }; + +1; + +__END__ + +package Text::Tabs; + +require Exporter; + +@ISA = (Exporter); +@EXPORT = qw(expand unexpand $tabstop); + +use vars qw($VERSION $SUBVERSION $tabstop $debug); +$VERSION = 2013.0523; +$SUBVERSION = 'modern'; + +use strict; + +use 5.010_000; + +BEGIN { + $tabstop = 8; + $debug = 0; +} + +my $CHUNK = qr/\X/; + +sub _xlen (_) { scalar(() = $_[0] =~ /$CHUNK/g) } +sub _xpos (_) { _xlen( substr( $_[0], 0, pos($_[0]) ) ) } + +sub expand { + my @l; + my $pad; + for ( @_ ) { + my $s = ''; + for (split(/^/m, $_, -1)) { + my $offs = 0; + s{\t}{ + # this works on both 5.10 and 5.11 + $pad = $tabstop - (_xlen(${^PREMATCH}) + $offs) % $tabstop; + # this works on 5.11, but fails on 5.10 + #XXX# $pad = $tabstop - (_xpos() + $offs) % $tabstop; + $offs += $pad - 1; + " " x $pad; + }peg; + $s .= $_; + } + push(@l, $s); + } + return @l if wantarray; + return $l[0]; +} + +sub unexpand +{ + my (@l) = @_; + my @e; + my $x; + my $line; + my @lines; + my $lastbit; + my $ts_as_space = " " x $tabstop; + for $x (@l) { + @lines = split("\n", $x, -1); + for $line (@lines) { + $line = expand($line); + @e = split(/(${CHUNK}{$tabstop})/,$line,-1); + $lastbit = pop(@e); + $lastbit = '' + unless defined $lastbit; + $lastbit = "\t" + if $lastbit eq $ts_as_space; + for $_ (@e) { + if ($debug) { + my $x = $_; + $x =~ s/\t/^I\t/gs; + print "sub on '$x'\n"; + } + s/ +$/\t/; + } + $line = join('',@e, $lastbit); + } + $x = join("\n", @lines); + } + return @l if wantarray; + return $l[0]; +} + +1; +__END__ + +sub expand +{ + my (@l) = @_; + for $_ (@l) { + 1 while s/(^|\n)([^\t\n]*)(\t+)/ + $1. $2 . (" " x + ($tabstop * length($3) + - (length($2) % $tabstop))) + /sex; + } + return @l if wantarray; + return $l[0]; +} + + +package Text::Abbrev; +require 5.005; # Probably works on earlier versions too. +require Exporter; + +our $VERSION = '1.02'; + + +@ISA = qw(Exporter); +@EXPORT = qw(abbrev); + +# Usage: +# abbrev \%foo, LIST; +# ... +# $long = $foo{$short}; + +sub abbrev { + my ($word, $hashref, $glob, %table, $returnvoid); + + @_ or return; # So we don't autovivify onto @_ and trigger warning + if (ref($_[0])) { # hash reference preferably + $hashref = shift; + $returnvoid = 1; + } elsif (ref \$_[0] eq 'GLOB') { # is actually a glob (deprecated) + $hashref = \%{shift()}; + $returnvoid = 1; + } + %{$hashref} = (); + + WORD: foreach $word (@_) { + for (my $len = (length $word) - 1; $len > 0; --$len) { + my $abbrev = substr($word,0,$len); + my $seen = ++$table{$abbrev}; + if ($seen == 1) { # We're the first word so far to have + # this abbreviation. + $hashref->{$abbrev} = $word; + } elsif ($seen == 2) { # We're the second word to have this + # abbreviation, so we can't use it. + delete $hashref->{$abbrev}; + } else { # We're the third word to have this + # abbreviation, so skip to the next word. + next WORD; + } + } + } + # Non-abbreviations always get entered, even if they aren't unique + foreach $word (@_) { + $hashref->{$word} = $word; + } + return if $returnvoid; + if (wantarray) { + %{$hashref}; + } else { + $hashref; + } +} + +1; +package Text::Wrap; + +use warnings::register; +require Exporter; + +@ISA = qw(Exporter); +@EXPORT = qw(wrap fill); +@EXPORT_OK = qw($columns $break $huge); + +$VERSION = 2013.0523; +$SUBVERSION = 'modern'; + +use 5.010_000; + +use vars qw($VERSION $SUBVERSION $columns $debug $break $huge $unexpand $tabstop $separator $separator2); +use strict; + +BEGIN { + $columns = 76; # <= screen width + $debug = 0; + $break = '(?=\s)\X'; + $huge = 'wrap'; # alternatively: 'die' or 'overflow' + $unexpand = 1; + $tabstop = 8; + $separator = "\n"; + $separator2 = undef; +} + +my $CHUNK = qr/\X/; + +sub _xlen(_) { scalar(() = $_[0] =~ /$CHUNK/g) } + +sub _xpos(_) { _xlen( substr( $_[0], 0, pos($_[0]) ) ) } + +use Text::Tabs qw(expand unexpand); + +sub wrap +{ + my ($ip, $xp, @t) = @_; + + local($Text::Tabs::tabstop) = $tabstop; + my $r = ""; + my $tail = pop(@t); + my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail)); + my $lead = $ip; + my $nll = $columns - _xlen(expand($xp)) - 1; + if ($nll <= 0 && $xp ne '') { + my $nc = _xlen(expand($xp)) + 2; + warnings::warnif "Increasing \$Text::Wrap::columns from $columns to $nc to accommodate length of subsequent tab"; + $columns = $nc; + $nll = 1; + } + my $ll = $columns - _xlen(expand($ip)) - 1; + $ll = 0 if $ll < 0; + my $nl = ""; + my $remainder = ""; + + use re 'taint'; + + pos($t) = 0; + while ($t !~ /\G(?:$break)*\Z/gc) { + if ($t =~ /\G((?:(?=[^\n])\X){0,$ll})($break|\n+|\z)/xmgc) { + $r .= $unexpand + ? unexpand($nl . $lead . $1) + : $nl . $lead . $1; + $remainder = $2; + } elsif ($huge eq 'wrap' && $t =~ /\G((?:(?=[^\n])\X){$ll})/gc) { + $r .= $unexpand + ? unexpand($nl . $lead . $1) + : $nl . $lead . $1; + $remainder = defined($separator2) ? $separator2 : $separator; + } elsif ($huge eq 'overflow' && $t =~ /\G((?:(?=[^\n])\X)*?)($break|\n+|\z)/xmgc) { + $r .= $unexpand + ? unexpand($nl . $lead . $1) + : $nl . $lead . $1; + $remainder = $2; + } elsif ($huge eq 'die') { + die "couldn't wrap '$t'"; + } elsif ($columns < 2) { + warnings::warnif "Increasing \$Text::Wrap::columns from $columns to 2"; + $columns = 2; + return ($ip, $xp, @t); + } else { + die "This shouldn't happen"; + } + + $lead = $xp; + $ll = $nll; + $nl = defined($separator2) + ? ($remainder eq "\n" + ? "\n" + : $separator2) + : $separator; + } + $r .= $remainder; + + print "-----------$r---------\n" if $debug; + + print "Finish up with '$lead'\n" if $debug; + + my($opos) = pos($t); + + $r .= $lead . substr($t, pos($t), length($t) - pos($t)) + if pos($t) ne length($t); + + print "-----------$r---------\n" if $debug;; + + return $r; +} + +sub fill +{ + my ($ip, $xp, @raw) = @_; + my @para; + my $pp; + + for $pp (split(/\n\s+/, join("\n",@raw))) { + $pp =~ s/\s+/ /g; + my $x = wrap($ip, $xp, $pp); + push(@para, $x); + } + + # if paragraph_indent is the same as line_indent, + # separate paragraphs with blank lines + + my $ps = ($ip eq $xp) ? "\n\n" : "\n"; + return join ($ps, @para); +} + +1; +__END__ + +package IPC::Open3; + +use strict; +no strict 'refs'; # because users pass me bareword filehandles +our ($VERSION, @ISA, @EXPORT); + +require Exporter; + +use Carp; +use Symbol qw(gensym qualify); + +$VERSION = '1.20'; +@ISA = qw(Exporter); +@EXPORT = qw(open3); + + +# &open3: Marc Horowitz +# derived mostly from &open2 by tom christiansen, +# fixed for 5.001 by Ulrich Kunitz +# ported to Win32 by Ron Schmidt, Merrill Lynch almost ended my career +# fixed for autovivving FHs, tchrist again +# allow fd numbers to be used, by Frank Tobin +# allow '-' as command (c.f. open "-|"), by Adam Spiers +# +# usage: $pid = open3('wtr', 'rdr', 'err' 'some cmd and args', 'optarg', ...); +# +# spawn the given $cmd and connect rdr for +# reading, wtr for writing, and err for errors. +# if err is '', or the same as rdr, then stdout and +# stderr of the child are on the same fh. returns pid +# of child (or dies on failure). + + +# if wtr begins with '<&', then wtr will be closed in the parent, and +# the child will read from it directly. if rdr or err begins with +# '>&', then the child will send output directly to that fd. In both +# cases, there will be a dup() instead of a pipe() made. + + +# WARNING: this is dangerous, as you may block forever +# unless you are very careful. +# +# $wtr is left unbuffered. +# +# abort program if +# rdr or wtr are null +# a system call fails + +our $Me = 'open3 (bug)'; # you should never see this, it's always localized + +# Fatal.pm needs to be fixed WRT prototypes. + +sub xpipe { + pipe $_[0], $_[1] or croak "$Me: pipe($_[0], $_[1]) failed: $!"; +} + +# I tried using a * prototype character for the filehandle but it still +# disallows a bareword while compiling under strict subs. + +sub xopen { + open $_[0], $_[1], @_[2..$#_] and return; + local $" = ', '; + carp "$Me: open(@_) failed: $!"; +} + +sub xclose { + $_[0] =~ /\A=?(\d+)\z/ + ? do { my $fh; open($fh, $_[1] . '&=' . $1) and close($fh); } + : close $_[0] + or croak "$Me: close($_[0]) failed: $!"; +} + +sub xfileno { + return $1 if $_[0] =~ /\A=?(\d+)\z/; # deal with fh just being an fd + return fileno $_[0]; +} + +use constant FORCE_DEBUG_SPAWN => 0; +use constant DO_SPAWN => $^O eq 'os2' || $^O eq 'MSWin32' || FORCE_DEBUG_SPAWN; + +sub _open3 { + local $Me = shift; + + # simulate autovivification of filehandles because + # it's too ugly to use @_ throughout to make perl do it for us + # tchrist 5-Mar-00 + + # Historically, open3(undef...) has silently worked, so keep + # it working. + splice @_, 0, 1, undef if \$_[0] == \undef; + splice @_, 1, 1, undef if \$_[1] == \undef; + unless (eval { + $_[0] = gensym unless defined $_[0] && length $_[0]; + $_[1] = gensym unless defined $_[1] && length $_[1]; + 1; }) + { + # must strip crud for croak to add back, or looks ugly + $@ =~ s/(?<=value attempted) at .*//s; + croak "$Me: $@"; + } + + my @handles = ({ mode => '<', handle => \*STDIN }, + { mode => '>', handle => \*STDOUT }, + { mode => '>', handle => \*STDERR }, + ); + + foreach (@handles) { + $_->{parent} = shift; + $_->{open_as} = gensym; + } + + if (@_ > 1 and $_[0] eq '-') { + croak "Arguments don't make sense when the command is '-'" + } + + $handles[2]{parent} ||= $handles[1]{parent}; + $handles[2]{dup_of_out} = $handles[1]{parent} eq $handles[2]{parent}; + + my $package; + foreach (@handles) { + $_->{dup} = ($_->{parent} =~ s/^[<>]&//); + + if ($_->{parent} !~ /\A=?(\d+)\z/) { + # force unqualified filehandles into caller's package + $package //= caller 1; + $_->{parent} = qualify $_->{parent}, $package; + } + + next if $_->{dup} or $_->{dup_of_out}; + if ($_->{mode} eq '<') { + xpipe $_->{open_as}, $_->{parent}; + } else { + xpipe $_->{parent}, $_->{open_as}; + } + } + + my $kidpid; + if (!DO_SPAWN) { + # Used to communicate exec failures. + xpipe my $stat_r, my $stat_w; + + $kidpid = fork; + croak "$Me: fork failed: $!" unless defined $kidpid; + if ($kidpid == 0) { # Kid + eval { + # A tie in the parent should not be allowed to cause problems. + untie *STDIN; + untie *STDOUT; + untie *STDERR; + + close $stat_r; + require Fcntl; + my $flags = fcntl $stat_w, &Fcntl::F_GETFD, 0; + croak "$Me: fcntl failed: $!" unless $flags; + fcntl $stat_w, &Fcntl::F_SETFD, $flags|&Fcntl::FD_CLOEXEC + or croak "$Me: fcntl failed: $!"; + + # If she wants to dup the kid's stderr onto her stdout I need to + # save a copy of her stdout before I put something else there. + if (!$handles[2]{dup_of_out} && $handles[2]{dup} + && xfileno($handles[2]{parent}) == fileno \*STDOUT) { + my $tmp = gensym; + xopen($tmp, '>&', $handles[2]{parent}); + $handles[2]{parent} = $tmp; + } + + foreach (@handles) { + if ($_->{dup_of_out}) { + xopen \*STDERR, ">&STDOUT" + if defined fileno STDERR && fileno STDERR != fileno STDOUT; + } elsif ($_->{dup}) { + xopen $_->{handle}, $_->{mode} . '&', $_->{parent} + if fileno $_->{handle} != xfileno($_->{parent}); + } else { + xclose $_->{parent}, $_->{mode}; + xopen $_->{handle}, $_->{mode} . '&=', + fileno $_->{open_as}; + } + } + return 1 if ($_[0] eq '-'); + exec @_ or do { + local($")=(" "); + croak "$Me: exec of @_ failed: $!"; + }; + } and do { + close $stat_w; + return 0; + }; + + my $bang = 0+$!; + my $err = $@; + utf8::encode $err if $] >= 5.008; + print $stat_w pack('IIa*', $bang, length($err), $err); + close $stat_w; + + eval { require POSIX; POSIX::_exit(255); }; + exit 255; + } + else { # Parent + close $stat_w; + my $to_read = length(pack('I', 0)) * 2; + my $bytes_read = read($stat_r, my $buf = '', $to_read); + if ($bytes_read) { + (my $bang, $to_read) = unpack('II', $buf); + read($stat_r, my $err = '', $to_read); + waitpid $kidpid, 0; # Reap child which should have exited + if ($err) { + utf8::decode $err if $] >= 5.008; + } else { + $err = "$Me: " . ($! = $bang); + } + $! = $bang; + die($err); + } + } + } + else { # DO_SPAWN + # All the bookkeeping of coincidence between handles is + # handled in spawn_with_handles. + + my @close; + + foreach (@handles) { + if ($_->{dup_of_out}) { + $_->{open_as} = $handles[1]{open_as}; + } elsif ($_->{dup}) { + $_->{open_as} = $_->{parent} =~ /\A[0-9]+\z/ + ? $_->{parent} : \*{$_->{parent}}; + push @close, $_->{open_as}; + } else { + push @close, \*{$_->{parent}}, $_->{open_as}; + } + } + require IO::Pipe; + $kidpid = eval { + spawn_with_handles(\@handles, \@close, @_); + }; + die "$Me: $@" if $@; + } + + foreach (@handles) { + next if $_->{dup} or $_->{dup_of_out}; + xclose $_->{open_as}, $_->{mode}; + } + + # If the write handle is a dup give it away entirely, close my copy + # of it. + xclose $handles[0]{parent}, $handles[0]{mode} if $handles[0]{dup}; + + select((select($handles[0]{parent}), $| = 1)[0]); # unbuffer pipe + $kidpid; +} + +sub open3 { + if (@_ < 4) { + local $" = ', '; + croak "open3(@_): not enough arguments"; + } + return _open3 'open3', @_ +} + +sub spawn_with_handles { + my $fds = shift; # Fields: handle, mode, open_as + my $close_in_child = shift; + my ($fd, %saved, @errs); + + foreach $fd (@$fds) { + $fd->{tmp_copy} = IO::Handle->new_from_fd($fd->{handle}, $fd->{mode}); + $saved{fileno $fd->{handle}} = $fd->{tmp_copy} if $fd->{tmp_copy}; + } + foreach $fd (@$fds) { + bless $fd->{handle}, 'IO::Handle' + unless eval { $fd->{handle}->isa('IO::Handle') } ; + # If some of handles to redirect-to coincide with handles to + # redirect, we need to use saved variants: + my $open_as = $fd->{open_as}; + my $fileno = fileno($open_as); + $fd->{handle}->fdopen(defined($fileno) + ? $saved{$fileno} || $open_as + : $open_as, + $fd->{mode}); + } + unless ($^O eq 'MSWin32') { + require Fcntl; + # Stderr may be redirected below, so we save the err text: + foreach $fd (@$close_in_child) { + next unless fileno $fd; + fcntl($fd, Fcntl::F_SETFD(), 1) or push @errs, "fcntl $fd: $!" + unless $saved{fileno $fd}; # Do not close what we redirect! + } + } + + my $pid; + unless (@errs) { + if (FORCE_DEBUG_SPAWN) { + pipe my $r, my $w or die "Pipe failed: $!"; + $pid = fork; + die "Fork failed: $!" unless defined $pid; + if (!$pid) { + { no warnings; exec @_ } + print $w 0 + $!; + close $w; + require POSIX; + POSIX::_exit(255); + } + close $w; + my $bad = <$r>; + if (defined $bad) { + $! = $bad; + undef $pid; + } + } else { + $pid = eval { system 1, @_ }; # 1 == P_NOWAIT + } + if($@) { + push @errs, "IO::Pipe: Can't spawn-NOWAIT: $@"; + } elsif(!$pid || $pid < 0) { + push @errs, "IO::Pipe: Can't spawn-NOWAIT: $!"; + } + } + + # Do this in reverse, so that STDERR is restored first: + foreach $fd (reverse @$fds) { + $fd->{handle}->fdopen($fd->{tmp_copy}, $fd->{mode}); + } + foreach (values %saved) { + $_->close or croak "Can't close: $!"; + } + croak join "\n", @errs if @errs; + return $pid; +} + +1; # so require is happy +package IPC::Cmd; + +use strict; + +BEGIN { + + use constant IS_VMS => $^O eq 'VMS' ? 1 : 0; + use constant IS_WIN32 => $^O eq 'MSWin32' ? 1 : 0; + use constant IS_WIN98 => (IS_WIN32 and !Win32::IsWinNT()) ? 1 : 0; + use constant ALARM_CLASS => __PACKAGE__ . '::TimeOut'; + use constant SPECIAL_CHARS => qw[< > | &]; + use constant QUOTE => do { IS_WIN32 ? q["] : q['] }; + + use Exporter (); + use vars qw[ @ISA $VERSION @EXPORT_OK $VERBOSE $DEBUG + $USE_IPC_RUN $USE_IPC_OPEN3 $CAN_USE_RUN_FORKED $WARN + $INSTANCES $ALLOW_NULL_ARGS + $HAVE_MONOTONIC + ]; + + $VERSION = '1.00'; + $VERBOSE = 0; + $DEBUG = 0; + $WARN = 1; + $USE_IPC_RUN = IS_WIN32 && !IS_WIN98; + $USE_IPC_OPEN3 = not IS_VMS; + $ALLOW_NULL_ARGS = 0; + + $CAN_USE_RUN_FORKED = 0; + eval { + require POSIX; POSIX->import(); + require IPC::Open3; IPC::Open3->import(); + require IO::Select; IO::Select->import(); + require IO::Handle; IO::Handle->import(); + require FileHandle; FileHandle->import(); + require Socket; + require Time::HiRes; Time::HiRes->import(); + require Win32 if IS_WIN32; + }; + $CAN_USE_RUN_FORKED = $@ || !IS_VMS && !IS_WIN32; + + eval { + my $wait_start_time = Time::HiRes::clock_gettime(&Time::HiRes::CLOCK_MONOTONIC); + }; + if ($@) { + $HAVE_MONOTONIC = 0; + } + else { + $HAVE_MONOTONIC = 1; + } + + @ISA = qw[Exporter]; + @EXPORT_OK = qw[can_run run run_forked QUOTE]; +} + +require Carp; +use File::Spec; +use Params::Check qw[check]; +use Text::ParseWords (); # import ONLY if needed! +use Module::Load::Conditional qw[can_load]; +use Locale::Maketext::Simple Style => 'gettext'; + +local $Module::Load::Conditional::FORCE_SAFE_INC = 1; + + + +sub can_use_ipc_run { + my $self = shift; + my $verbose = shift || 0; + + ### IPC::Run doesn't run on win98 + return if IS_WIN98; + + ### if we don't have ipc::run, we obviously can't use it. + return unless can_load( + modules => { 'IPC::Run' => '0.55' }, + verbose => ($WARN && $verbose), + ); + + ### otherwise, we're good to go + return $IPC::Run::VERSION; +} + + + +sub can_use_ipc_open3 { + my $self = shift; + my $verbose = shift || 0; + + ### IPC::Open3 is not working on VMS because of a lack of fork. + return if IS_VMS; + + ### IPC::Open3 works on every non-VMS platform, but it can't + ### capture buffers on win32 :( + return unless can_load( + modules => { map {$_ => '0.0'} qw|IPC::Open3 IO::Select Symbol| }, + verbose => ($WARN && $verbose), + ); + + return $IPC::Open3::VERSION; +} + + +sub can_capture_buffer { + my $self = shift; + + return 1 if $USE_IPC_RUN && $self->can_use_ipc_run; + return 1 if $USE_IPC_OPEN3 && $self->can_use_ipc_open3; + return; +} + + +sub can_run { + my $command = shift; + + # a lot of VMS executables have a symbol defined + # check those first + if ( $^O eq 'VMS' ) { + require VMS::DCLsym; + my $syms = VMS::DCLsym->new; + return $command if scalar $syms->getsym( uc $command ); + } + + require File::Spec; + require ExtUtils::MakeMaker; + + my @possibles; + + if( File::Spec->file_name_is_absolute($command) ) { + return MM->maybe_command($command); + + } else { + for my $dir ( + File::Spec->path, + ( IS_WIN32 ? File::Spec->curdir : () ) + ) { + next if ! $dir || ! -d $dir; + my $abs = File::Spec->catfile( IS_WIN32 ? Win32::GetShortPathName( $dir ) : $dir, $command); + push @possibles, $abs if $abs = MM->maybe_command($abs); + } + } + return @possibles if wantarray and $INSTANCES; + return shift @possibles; +} + + +{ my @acc = qw[ok error _fds]; + + ### autogenerate accessors ### + for my $key ( @acc ) { + no strict 'refs'; + *{__PACKAGE__."::$key"} = sub { + $_[0]->{$key} = $_[1] if @_ > 1; + return $_[0]->{$key}; + } + } +} + +sub can_use_run_forked { + return $CAN_USE_RUN_FORKED eq "1"; +} + +sub get_monotonic_time { + if ($HAVE_MONOTONIC) { + return Time::HiRes::clock_gettime(&Time::HiRes::CLOCK_MONOTONIC); + } + else { + return time(); + } +} + +sub adjust_monotonic_start_time { + my ($ref_vars, $now, $previous) = @_; + + # workaround only for those systems which don't have + # Time::HiRes::CLOCK_MONOTONIC (Mac OSX in particular) + return if $HAVE_MONOTONIC; + + # don't have previous monotonic value (only happens once + # in the beginning of the program execution) + return unless $previous; + + my $time_diff = $now - $previous; + + # adjust previously saved time with the skew value which is + # either negative when clock moved back or more than 5 seconds -- + # assuming that event loop does happen more often than once + # per five seconds, which might not be always true (!) but + # hopefully that's ok, because it's just a workaround + if ($time_diff > 5 || $time_diff < 0) { + foreach my $ref_var (@{$ref_vars}) { + if (defined($$ref_var)) { + $$ref_var = $$ref_var + $time_diff; + } + } + } +} + +sub uninstall_signals { + return unless defined($IPC::Cmd::{'__old_signals'}); + + foreach my $sig_name (keys %{$IPC::Cmd::{'__old_signals'}}) { + $SIG{$sig_name} = $IPC::Cmd::{'__old_signals'}->{$sig_name}; + } +} + +# incompatible with POSIX::SigAction +# +sub install_layered_signal { + my ($s, $handler_code) = @_; + + my %available_signals = map {$_ => 1} keys %SIG; + + Carp::confess("install_layered_signal got nonexistent signal name [$s]") + unless defined($available_signals{$s}); + Carp::confess("install_layered_signal expects coderef") + if !ref($handler_code) || ref($handler_code) ne 'CODE'; + + $IPC::Cmd::{'__old_signals'} = {} + unless defined($IPC::Cmd::{'__old_signals'}); + $IPC::Cmd::{'__old_signals'}->{$s} = $SIG{$s}; + + my $previous_handler = $SIG{$s}; + + my $sig_handler = sub { + my ($called_sig_name, @sig_param) = @_; + + # $s is a closure referring to real signal name + # for which this handler is being installed. + # it is used to distinguish between + # real signal handlers and aliased signal handlers + my $signal_name = $s; + + # $called_sig_name is a signal name which + # was passed to this signal handler; + # it doesn't equal $signal_name in case + # some signal handlers in %SIG point + # to other signal handler (CHLD and CLD, + # ABRT and IOT) + # + # initial signal handler for aliased signal + # calls some other signal handler which + # should not execute the same handler_code again + if ($called_sig_name eq $signal_name) { + $handler_code->($signal_name); + } + + # run original signal handler if any (including aliased) + # + if (ref($previous_handler)) { + $previous_handler->($called_sig_name, @sig_param); + } + }; + + $SIG{$s} = $sig_handler; +} + +# give process a chance sending TERM, +# waiting for a while (2 seconds) +# and killing it with KILL +sub kill_gently { + my ($pid, $opts) = @_; + + require POSIX; + + $opts = {} unless $opts; + $opts->{'wait_time'} = 2 unless defined($opts->{'wait_time'}); + $opts->{'first_kill_type'} = 'just_process' unless $opts->{'first_kill_type'}; + $opts->{'final_kill_type'} = 'just_process' unless $opts->{'final_kill_type'}; + + if ($opts->{'first_kill_type'} eq 'just_process') { + kill(15, $pid); + } + elsif ($opts->{'first_kill_type'} eq 'process_group') { + kill(-15, $pid); + } + + my $do_wait = 1; + my $child_finished = 0; + + my $wait_start_time = get_monotonic_time(); + my $now; + my $previous_monotonic_value; + + while ($do_wait) { + $previous_monotonic_value = $now; + $now = get_monotonic_time(); + + adjust_monotonic_start_time([\$wait_start_time], $now, $previous_monotonic_value); + + if ($now > $wait_start_time + $opts->{'wait_time'}) { + $do_wait = 0; + next; + } + + my $waitpid = waitpid($pid, POSIX::WNOHANG); + + if ($waitpid eq -1) { + $child_finished = 1; + $do_wait = 0; + next; + } + + Time::HiRes::usleep(250000); # quarter of a second + } + + if (!$child_finished) { + if ($opts->{'final_kill_type'} eq 'just_process') { + kill(9, $pid); + } + elsif ($opts->{'final_kill_type'} eq 'process_group') { + kill(-9, $pid); + } + } +} + +sub open3_run { + my ($cmd, $opts) = @_; + + $opts = {} unless $opts; + + my $child_in = FileHandle->new; + my $child_out = FileHandle->new; + my $child_err = FileHandle->new; + $child_out->autoflush(1); + $child_err->autoflush(1); + + my $pid = open3($child_in, $child_out, $child_err, $cmd); + Time::HiRes::usleep(1); + + # push my child's pid to our parent + # so in case i am killed parent + # could stop my child (search for + # child_child_pid in parent code) + if ($opts->{'parent_info'}) { + my $ps = $opts->{'parent_info'}; + print $ps "spawned $pid\n"; + } + + if ($child_in && $child_out->opened && $opts->{'child_stdin'}) { + # If the child process dies for any reason, + # the next write to CHLD_IN is likely to generate + # a SIGPIPE in the parent, which is fatal by default. + # So you may wish to handle this signal. + # + # from http://perldoc.perl.org/IPC/Open3.html, + # absolutely needed to catch piped commands errors. + # + local $SIG{'PIPE'} = sub { 1; }; + + print $child_in $opts->{'child_stdin'}; + } + close($child_in); + + my $child_output = { + 'out' => $child_out->fileno, + 'err' => $child_err->fileno, + $child_out->fileno => { + 'parent_socket' => $opts->{'parent_stdout'}, + 'scalar_buffer' => "", + 'child_handle' => $child_out, + 'block_size' => ($child_out->stat)[11] || 1024, + }, + $child_err->fileno => { + 'parent_socket' => $opts->{'parent_stderr'}, + 'scalar_buffer' => "", + 'child_handle' => $child_err, + 'block_size' => ($child_err->stat)[11] || 1024, + }, + }; + + my $select = IO::Select->new(); + $select->add($child_out, $child_err); + + # pass any signal to the child + # effectively creating process + # strongly attached to the child: + # it will terminate only after child + # has terminated (except for SIGKILL, + # which is specially handled) + SIGNAL: foreach my $s (keys %SIG) { + next SIGNAL if $s eq '__WARN__' or $s eq '__DIE__'; # Skip and don't clobber __DIE__ & __WARN__ + my $sig_handler; + $sig_handler = sub { + kill("$s", $pid); + $SIG{$s} = $sig_handler; + }; + $SIG{$s} = $sig_handler; + } + + my $child_finished = 0; + + my $real_exit; + my $exit_value; + + while(!$child_finished) { + + # parent was killed otherwise we would have got + # the same signal as parent and process it same way + if (getppid() eq "1") { + + # end my process group with all the children + # (i am the process group leader, so my pid + # equals to the process group id) + # + # same thing which is done + # with $opts->{'clean_up_children'} + # in run_forked + # + kill(-9, $$); + + POSIX::_exit 1; + } + + my $waitpid = waitpid($pid, POSIX::WNOHANG); + + # child finished, catch it's exit status + if ($waitpid ne 0 && $waitpid ne -1) { + $real_exit = $?; + $exit_value = $? >> 8; + } + + if ($waitpid eq -1) { + $child_finished = 1; + } + + + my $ready_fds = []; + push @{$ready_fds}, $select->can_read(1/100); + + READY_FDS: while (scalar(@{$ready_fds})) { + my $fd = shift @{$ready_fds}; + $ready_fds = [grep {$_ ne $fd} @{$ready_fds}]; + + my $str = $child_output->{$fd->fileno}; + Carp::confess("child stream not found: $fd") unless $str; + + my $data; + my $count = $fd->sysread($data, $str->{'block_size'}); + + if ($count) { + if ($str->{'parent_socket'}) { + my $ph = $str->{'parent_socket'}; + print $ph $data; + } + else { + $str->{'scalar_buffer'} .= $data; + } + } + elsif ($count eq 0) { + $select->remove($fd); + $fd->close(); + } + else { + Carp::confess("error during sysread: " . $!); + } + + push @{$ready_fds}, $select->can_read(1/100) if $child_finished; + } + + Time::HiRes::usleep(1); + } + + # since we've successfully reaped the child, + # let our parent know about this. + # + if ($opts->{'parent_info'}) { + my $ps = $opts->{'parent_info'}; + + # child was killed, inform parent + if ($real_exit & 127) { + print $ps "$pid killed with " . ($real_exit & 127) . "\n"; + } + + print $ps "reaped $pid\n"; + } + + if ($opts->{'parent_stdout'} || $opts->{'parent_stderr'}) { + return $exit_value; + } + else { + return { + 'stdout' => $child_output->{$child_output->{'out'}}->{'scalar_buffer'}, + 'stderr' => $child_output->{$child_output->{'err'}}->{'scalar_buffer'}, + 'exit_code' => $exit_value, + }; + } +} + + +sub run_forked { + ### container to store things in + my $self = bless {}, __PACKAGE__; + + if (!can_use_run_forked()) { + Carp::carp("run_forked is not available: $CAN_USE_RUN_FORKED"); + return; + } + + require POSIX; + + my ($cmd, $opts) = @_; + if (ref($cmd) eq 'ARRAY') { + $cmd = join(" ", @{$cmd}); + } + + if (!$cmd) { + Carp::carp("run_forked expects command to run"); + return; + } + + $opts = {} unless $opts; + $opts->{'timeout'} = 0 unless $opts->{'timeout'}; + $opts->{'terminate_wait_time'} = 2 unless defined($opts->{'terminate_wait_time'}); + + # turned on by default + $opts->{'clean_up_children'} = 1 unless defined($opts->{'clean_up_children'}); + + # sockets to pass child stdout to parent + my $child_stdout_socket; + my $parent_stdout_socket; + + # sockets to pass child stderr to parent + my $child_stderr_socket; + my $parent_stderr_socket; + + # sockets for child -> parent internal communication + my $child_info_socket; + my $parent_info_socket; + + socketpair($child_stdout_socket, $parent_stdout_socket, &Socket::AF_UNIX, &Socket::SOCK_STREAM, &Socket::PF_UNSPEC) || + Carp::confess ("socketpair: $!"); + socketpair($child_stderr_socket, $parent_stderr_socket, &Socket::AF_UNIX, &Socket::SOCK_STREAM, &Socket::PF_UNSPEC) || + Carp::confess ("socketpair: $!"); + socketpair($child_info_socket, $parent_info_socket, &Socket::AF_UNIX, &Socket::SOCK_STREAM, &Socket::PF_UNSPEC) || + Carp::confess ("socketpair: $!"); + + $child_stdout_socket->autoflush(1); + $parent_stdout_socket->autoflush(1); + $child_stderr_socket->autoflush(1); + $parent_stderr_socket->autoflush(1); + $child_info_socket->autoflush(1); + $parent_info_socket->autoflush(1); + + my $start_time = get_monotonic_time(); + + my $pid; + if ($pid = fork) { + + # we are a parent + close($parent_stdout_socket); + close($parent_stderr_socket); + close($parent_info_socket); + + my $flags; + + # prepare sockets to read from child + + $flags = fcntl($child_stdout_socket, POSIX::F_GETFL, 0) || Carp::confess "can't fnctl F_GETFL: $!"; + $flags |= POSIX::O_NONBLOCK; + fcntl($child_stdout_socket, POSIX::F_SETFL, $flags) || Carp::confess "can't fnctl F_SETFL: $!"; + + $flags = fcntl($child_stderr_socket, POSIX::F_GETFL, 0) || Carp::confess "can't fnctl F_GETFL: $!"; + $flags |= POSIX::O_NONBLOCK; + fcntl($child_stderr_socket, POSIX::F_SETFL, $flags) || Carp::confess "can't fnctl F_SETFL: $!"; + + $flags = fcntl($child_info_socket, POSIX::F_GETFL, 0) || Carp::confess "can't fnctl F_GETFL: $!"; + $flags |= POSIX::O_NONBLOCK; + fcntl($child_info_socket, POSIX::F_SETFL, $flags) || Carp::confess "can't fnctl F_SETFL: $!"; + + # print "child $pid started\n"; + + my $child_output = { + $child_stdout_socket->fileno => { + 'scalar_buffer' => "", + 'child_handle' => $child_stdout_socket, + 'block_size' => ($child_stdout_socket->stat)[11] || 1024, + 'protocol' => 'stdout', + }, + $child_stderr_socket->fileno => { + 'scalar_buffer' => "", + 'child_handle' => $child_stderr_socket, + 'block_size' => ($child_stderr_socket->stat)[11] || 1024, + 'protocol' => 'stderr', + }, + $child_info_socket->fileno => { + 'scalar_buffer' => "", + 'child_handle' => $child_info_socket, + 'block_size' => ($child_info_socket->stat)[11] || 1024, + 'protocol' => 'info', + }, + }; + + my $select = IO::Select->new(); + $select->add($child_stdout_socket, $child_stderr_socket, $child_info_socket); + + my $child_timedout = 0; + my $child_finished = 0; + my $child_stdout = ''; + my $child_stderr = ''; + my $child_merged = ''; + my $child_exit_code = 0; + my $child_killed_by_signal = 0; + my $parent_died = 0; + + my $last_parent_check = 0; + my $got_sig_child = 0; + my $got_sig_quit = 0; + my $orig_sig_child = $SIG{'CHLD'}; + + $SIG{'CHLD'} = sub { $got_sig_child = get_monotonic_time(); }; + + if ($opts->{'terminate_on_signal'}) { + install_layered_signal($opts->{'terminate_on_signal'}, sub { $got_sig_quit = time(); }); + } + + my $child_child_pid; + my $now; + my $previous_monotonic_value; + + while (!$child_finished) { + $previous_monotonic_value = $now; + $now = get_monotonic_time(); + + adjust_monotonic_start_time([\$start_time, \$last_parent_check, \$got_sig_child], $now, $previous_monotonic_value); + + if ($opts->{'terminate_on_parent_sudden_death'}) { + # check for parent once each five seconds + if ($now > $last_parent_check + 5) { + if (getppid() eq "1") { + kill_gently ($pid, { + 'first_kill_type' => 'process_group', + 'final_kill_type' => 'process_group', + 'wait_time' => $opts->{'terminate_wait_time'} + }); + $parent_died = 1; + } + + $last_parent_check = $now; + } + } + + # user specified timeout + if ($opts->{'timeout'}) { + if ($now > $start_time + $opts->{'timeout'}) { + kill_gently ($pid, { + 'first_kill_type' => 'process_group', + 'final_kill_type' => 'process_group', + 'wait_time' => $opts->{'terminate_wait_time'} + }); + $child_timedout = 1; + } + } + + # give OS 10 seconds for correct return of waitpid, + # kill process after that and finish wait loop; + # shouldn't ever happen -- remove this code? + if ($got_sig_child) { + if ($now > $got_sig_child + 10) { + print STDERR "waitpid did not return -1 for 10 seconds after SIG_CHLD, killing [$pid]\n"; + kill (-9, $pid); + $child_finished = 1; + } + } + + if ($got_sig_quit) { + kill_gently ($pid, { + 'first_kill_type' => 'process_group', + 'final_kill_type' => 'process_group', + 'wait_time' => $opts->{'terminate_wait_time'} + }); + $child_finished = 1; + } + + my $waitpid = waitpid($pid, POSIX::WNOHANG); + + # child finished, catch it's exit status + if ($waitpid ne 0 && $waitpid ne -1) { + $child_exit_code = $? >> 8; + } + + if ($waitpid eq -1) { + $child_finished = 1; + } + + my $ready_fds = []; + push @{$ready_fds}, $select->can_read(1/100); + + READY_FDS: while (scalar(@{$ready_fds})) { + my $fd = shift @{$ready_fds}; + $ready_fds = [grep {$_ ne $fd} @{$ready_fds}]; + + my $str = $child_output->{$fd->fileno}; + Carp::confess("child stream not found: $fd") unless $str; + + my $data = ""; + my $count = $fd->sysread($data, $str->{'block_size'}); + + if ($count) { + # extract all the available lines and store the rest in temporary buffer + if ($data =~ /(.+\n)([^\n]*)/so) { + $data = $str->{'scalar_buffer'} . $1; + $str->{'scalar_buffer'} = $2 || ""; + } + else { + $str->{'scalar_buffer'} .= $data; + $data = ""; + } + } + elsif ($count eq 0) { + $select->remove($fd); + $fd->close(); + if ($str->{'scalar_buffer'}) { + $data = $str->{'scalar_buffer'} . "\n"; + } + } + else { + Carp::confess("error during sysread on [$fd]: " . $!); + } + + # $data contains only full lines (or last line if it was unfinished read + # or now new-line in the output of the child); dat is processed + # according to the "protocol" of socket + if ($str->{'protocol'} eq 'info') { + if ($data =~ /^spawned ([0-9]+?)\n(.*?)/so) { + $child_child_pid = $1; + $data = $2; + } + if ($data =~ /^reaped ([0-9]+?)\n(.*?)/so) { + $child_child_pid = undef; + $data = $2; + } + if ($data =~ /^[\d]+ killed with ([0-9]+?)\n(.*?)/so) { + $child_killed_by_signal = $1; + $data = $2; + } + + # we don't expect any other data in info socket, so it's + # some strange violation of protocol, better know about this + if ($data) { + Carp::confess("info protocol violation: [$data]"); + } + } + if ($str->{'protocol'} eq 'stdout') { + if (!$opts->{'discard_output'}) { + $child_stdout .= $data; + $child_merged .= $data; + } + + if ($opts->{'stdout_handler'} && ref($opts->{'stdout_handler'}) eq 'CODE') { + $opts->{'stdout_handler'}->($data); + } + } + if ($str->{'protocol'} eq 'stderr') { + if (!$opts->{'discard_output'}) { + $child_stderr .= $data; + $child_merged .= $data; + } + + if ($opts->{'stderr_handler'} && ref($opts->{'stderr_handler'}) eq 'CODE') { + $opts->{'stderr_handler'}->($data); + } + } + + # process may finish (waitpid returns -1) before + # we've read all of its output because of buffering; + # so try to read all the way it is possible to read + # in such case - this shouldn't be too much (unless + # the buffer size is HUGE -- should introduce + # another counter in such case, maybe later) + # + push @{$ready_fds}, $select->can_read(1/100) if $child_finished; + } + + if ($opts->{'wait_loop_callback'} && ref($opts->{'wait_loop_callback'}) eq 'CODE') { + $opts->{'wait_loop_callback'}->(); + } + + Time::HiRes::usleep(1); + } + + # $child_pid_pid is not defined in two cases: + # * when our child was killed before + # it had chance to tell us the pid + # of the child it spawned. we can do + # nothing in this case :( + # * our child successfully reaped its child, + # we have nothing left to do in this case + # + # defined $child_pid_pid means child's child + # has not died but nobody is waiting for it, + # killing it brutally. + # + if ($child_child_pid) { + kill_gently($child_child_pid); + } + + # in case there are forks in child which + # do not forward or process signals (TERM) correctly + # kill whole child process group, effectively trying + # not to return with some children or their parts still running + # + # to be more accurate -- we need to be sure + # that this is process group created by our child + # (and not some other process group with the same pgid, + # created just after death of our child) -- fortunately + # this might happen only when process group ids + # are reused quickly (there are lots of processes + # spawning new process groups for example) + # + if ($opts->{'clean_up_children'}) { + kill(-9, $pid); + } + + # print "child $pid finished\n"; + + close($child_stdout_socket); + close($child_stderr_socket); + close($child_info_socket); + + my $o = { + 'stdout' => $child_stdout, + 'stderr' => $child_stderr, + 'merged' => $child_merged, + 'timeout' => $child_timedout ? $opts->{'timeout'} : 0, + 'exit_code' => $child_exit_code, + 'parent_died' => $parent_died, + 'killed_by_signal' => $child_killed_by_signal, + 'child_pgid' => $pid, + 'cmd' => $cmd, + }; + + my $err_msg = ''; + if ($o->{'exit_code'}) { + $err_msg .= "exited with code [$o->{'exit_code'}]\n"; + } + if ($o->{'timeout'}) { + $err_msg .= "ran more than [$o->{'timeout'}] seconds\n"; + } + if ($o->{'parent_died'}) { + $err_msg .= "parent died\n"; + } + if ($o->{'stdout'} && !$opts->{'non_empty_stdout_ok'}) { + $err_msg .= "stdout:\n" . $o->{'stdout'} . "\n"; + } + if ($o->{'stderr'}) { + $err_msg .= "stderr:\n" . $o->{'stderr'} . "\n"; + } + if ($o->{'killed_by_signal'}) { + $err_msg .= "killed by signal [" . $o->{'killed_by_signal'} . "]\n"; + } + $o->{'err_msg'} = $err_msg; + + if ($orig_sig_child) { + $SIG{'CHLD'} = $orig_sig_child; + } + else { + delete($SIG{'CHLD'}); + } + + uninstall_signals(); + + return $o; + } + else { + Carp::confess("cannot fork: $!") unless defined($pid); + + # create new process session for open3 call, + # so we hopefully can kill all the subprocesses + # which might be spawned in it (except for those + # which do setsid theirselves -- can't do anything + # with those) + + POSIX::setsid() || Carp::confess("Error running setsid: " . $!); + + if ($opts->{'child_BEGIN'} && ref($opts->{'child_BEGIN'}) eq 'CODE') { + $opts->{'child_BEGIN'}->(); + } + + close($child_stdout_socket); + close($child_stderr_socket); + close($child_info_socket); + + my $child_exit_code; + + # allow both external programs + # and internal perl calls + if (!ref($cmd)) { + $child_exit_code = open3_run($cmd, { + 'parent_info' => $parent_info_socket, + 'parent_stdout' => $parent_stdout_socket, + 'parent_stderr' => $parent_stderr_socket, + 'child_stdin' => $opts->{'child_stdin'}, + }); + } + elsif (ref($cmd) eq 'CODE') { + # reopen STDOUT and STDERR for child code: + # https://rt.cpan.org/Ticket/Display.html?id=85912 + open STDOUT, '>&', $parent_stdout_socket || Carp::confess("Unable to reopen STDOUT: $!\n"); + open STDERR, '>&', $parent_stderr_socket || Carp::confess("Unable to reopen STDERR: $!\n"); + + $child_exit_code = $cmd->({ + 'opts' => $opts, + 'parent_info' => $parent_info_socket, + 'parent_stdout' => $parent_stdout_socket, + 'parent_stderr' => $parent_stderr_socket, + 'child_stdin' => $opts->{'child_stdin'}, + }); + } + else { + print $parent_stderr_socket "Invalid command reference: " . ref($cmd) . "\n"; + $child_exit_code = 1; + } + + close($parent_stdout_socket); + close($parent_stderr_socket); + close($parent_info_socket); + + if ($opts->{'child_END'} && ref($opts->{'child_END'}) eq 'CODE') { + $opts->{'child_END'}->(); + } + + $| = 1; + POSIX::_exit $child_exit_code; + } +} + +sub run { + ### container to store things in + my $self = bless {}, __PACKAGE__; + + my %hash = @_; + + ### if the user didn't provide a buffer, we'll store it here. + my $def_buf = ''; + + my($verbose,$cmd,$buffer,$timeout); + my $tmpl = { + verbose => { default => $VERBOSE, store => \$verbose }, + buffer => { default => \$def_buf, store => \$buffer }, + command => { required => 1, store => \$cmd, + allow => sub { !ref($_[0]) or ref($_[0]) eq 'ARRAY' }, + }, + timeout => { default => 0, store => \$timeout }, + }; + + unless( check( $tmpl, \%hash, $VERBOSE ) ) { + Carp::carp( loc( "Could not validate input: %1", + Params::Check->last_error ) ); + return; + }; + + $cmd = _quote_args_vms( $cmd ) if IS_VMS; + + ### strip any empty elements from $cmd if present + if ( $ALLOW_NULL_ARGS ) { + $cmd = [ grep { defined } @$cmd ] if ref $cmd; + } + else { + $cmd = [ grep { defined && length } @$cmd ] if ref $cmd; + } + + my $pp_cmd = (ref $cmd ? "@$cmd" : $cmd); + print loc("Running [%1]...\n", $pp_cmd ) if $verbose; + + ### did the user pass us a buffer to fill or not? if so, set this + ### flag so we know what is expected of us + ### XXX this is now being ignored. in the future, we could add diagnostic + ### messages based on this logic + #my $user_provided_buffer = $buffer == \$def_buf ? 0 : 1; + + ### buffers that are to be captured + my( @buffer, @buff_err, @buff_out ); + + ### capture STDOUT + my $_out_handler = sub { + my $buf = shift; + return unless defined $buf; + + print STDOUT $buf if $verbose; + push @buffer, $buf; + push @buff_out, $buf; + }; + + ### capture STDERR + my $_err_handler = sub { + my $buf = shift; + return unless defined $buf; + + print STDERR $buf if $verbose; + push @buffer, $buf; + push @buff_err, $buf; + }; + + + ### flag to indicate we have a buffer captured + my $have_buffer = $self->can_capture_buffer ? 1 : 0; + + ### flag indicating if the subcall went ok + my $ok; + + ### don't look at previous errors: + local $?; + local $@; + local $!; + + ### we might be having a timeout set + eval { + local $SIG{ALRM} = sub { die bless sub { + ALARM_CLASS . + qq[: Command '$pp_cmd' aborted by alarm after $timeout seconds] + }, ALARM_CLASS } if $timeout; + alarm $timeout || 0; + + ### IPC::Run is first choice if $USE_IPC_RUN is set. + if( !IS_WIN32 and $USE_IPC_RUN and $self->can_use_ipc_run( 1 ) ) { + ### ipc::run handlers needs the command as a string or an array ref + + $self->_debug( "# Using IPC::Run. Have buffer: $have_buffer" ) + if $DEBUG; + + $ok = $self->_ipc_run( $cmd, $_out_handler, $_err_handler ); + + ### since IPC::Open3 works on all platforms, and just fails on + ### win32 for capturing buffers, do that ideally + } elsif ( $USE_IPC_OPEN3 and $self->can_use_ipc_open3( 1 ) ) { + + $self->_debug("# Using IPC::Open3. Have buffer: $have_buffer") + if $DEBUG; + + ### in case there are pipes in there; + ### IPC::Open3 will call exec and exec will do the right thing + + my $method = IS_WIN32 ? '_open3_run_win32' : '_open3_run'; + + $ok = $self->$method( + $cmd, $_out_handler, $_err_handler, $verbose + ); + + ### if we are allowed to run verbose, just dispatch the system command + } else { + $self->_debug( "# Using system(). Have buffer: $have_buffer" ) + if $DEBUG; + $ok = $self->_system_run( $cmd, $verbose ); + } + + alarm 0; + }; + + ### restore STDIN after duping, or STDIN will be closed for + ### this current perl process! + $self->__reopen_fds( @{ $self->_fds} ) if $self->_fds; + + my $err; + unless( $ok ) { + ### alarm happened + if ( $@ and ref $@ and $@->isa( ALARM_CLASS ) ) { + $err = $@->(); # the error code is an expired alarm + + ### another error happened, set by the dispatchub + } else { + $err = $self->error; + } + } + + ### fill the buffer; + $$buffer = join '', @buffer if @buffer; + + ### return a list of flags and buffers (if available) in list + ### context, or just a simple 'ok' in scalar + return wantarray + ? $have_buffer + ? ($ok, $err, \@buffer, \@buff_out, \@buff_err) + : ($ok, $err ) + : $ok + + +} + +sub _open3_run_win32 { + my $self = shift; + my $cmd = shift; + my $outhand = shift; + my $errhand = shift; + + require Socket; + + my $pipe = sub { + socketpair($_[0], $_[1], &Socket::AF_UNIX, &Socket::SOCK_STREAM, &Socket::PF_UNSPEC) + or return undef; + shutdown($_[0], 1); # No more writing for reader + shutdown($_[1], 0); # No more reading for writer + return 1; + }; + + my $open3 = sub { + local (*TO_CHLD_R, *TO_CHLD_W); + local (*FR_CHLD_R, *FR_CHLD_W); + local (*FR_CHLD_ERR_R, *FR_CHLD_ERR_W); + + $pipe->(*TO_CHLD_R, *TO_CHLD_W ) or die $^E; + $pipe->(*FR_CHLD_R, *FR_CHLD_W ) or die $^E; + $pipe->(*FR_CHLD_ERR_R, *FR_CHLD_ERR_W) or die $^E; + + my $pid = IPC::Open3::open3('>&TO_CHLD_R', '<&FR_CHLD_W', '<&FR_CHLD_ERR_W', @_); + + return ( $pid, *TO_CHLD_W, *FR_CHLD_R, *FR_CHLD_ERR_R ); + }; + + $cmd = [ grep { defined && length } @$cmd ] if ref $cmd; + $cmd = $self->__fix_cmd_whitespace_and_special_chars( $cmd ); + + my ($pid, $to_chld, $fr_chld, $fr_chld_err) = + $open3->( ( ref $cmd ? @$cmd : $cmd ) ); + + my $in_sel = IO::Select->new(); + my $out_sel = IO::Select->new(); + + my %objs; + + $objs{ fileno( $fr_chld ) } = $outhand; + $objs{ fileno( $fr_chld_err ) } = $errhand; + $in_sel->add( $fr_chld ); + $in_sel->add( $fr_chld_err ); + + close($to_chld); + + while ($in_sel->count() + $out_sel->count()) { + my ($ins, $outs) = IO::Select::select($in_sel, $out_sel, undef); + + for my $fh (@$ins) { + my $obj = $objs{ fileno($fh) }; + my $buf; + my $bytes_read = sysread($fh, $buf, 64*1024 ); #, length($buf)); + if (!$bytes_read) { + $in_sel->remove($fh); + } + else { + $obj->( "$buf" ); + } + } + + for my $fh (@$outs) { + } + } + + waitpid($pid, 0); + + ### some error occurred + if( $? ) { + $self->error( $self->_pp_child_error( $cmd, $? ) ); + $self->ok( 0 ); + return; + } else { + return $self->ok( 1 ); + } +} + +sub _open3_run { + my $self = shift; + my $cmd = shift; + my $_out_handler = shift; + my $_err_handler = shift; + my $verbose = shift || 0; + + ### Following code are adapted from Friar 'abstracts' in the + ### Perl Monastery (http://www.perlmonks.org/index.pl?node_id=151886). + ### XXX that code didn't work. + ### we now use the following code, thanks to theorbtwo + + ### define them beforehand, so we always have defined FH's + ### to read from. + use Symbol; + my $kidout = Symbol::gensym(); + my $kiderror = Symbol::gensym(); + + ### Dup the filehandle so we can pass 'our' STDIN to the + ### child process. This stops us from having to pump input + ### from ourselves to the childprocess. However, we will need + ### to revive the FH afterwards, as IPC::Open3 closes it. + ### We'll do the same for STDOUT and STDERR. It works without + ### duping them on non-unix derivatives, but not on win32. + my @fds_to_dup = ( IS_WIN32 && !$verbose + ? qw[STDIN STDOUT STDERR] + : qw[STDIN] + ); + $self->_fds( \@fds_to_dup ); + $self->__dup_fds( @fds_to_dup ); + + ### pipes have to come in a quoted string, and that clashes with + ### whitespace. This sub fixes up such commands so they run properly + $cmd = $self->__fix_cmd_whitespace_and_special_chars( $cmd ); + + ### don't stringify @$cmd, so spaces in filenames/paths are + ### treated properly + my $pid = eval { + IPC::Open3::open3( + '<&STDIN', + (IS_WIN32 ? '>&STDOUT' : $kidout), + (IS_WIN32 ? '>&STDERR' : $kiderror), + ( ref $cmd ? @$cmd : $cmd ), + ); + }; + + ### open3 error occurred + if( $@ and $@ =~ /^open3:/ ) { + $self->ok( 0 ); + $self->error( $@ ); + return; + }; + + ### use OUR stdin, not $kidin. Somehow, + ### we never get the input.. so jump through + ### some hoops to do it :( + my $selector = IO::Select->new( + (IS_WIN32 ? \*STDERR : $kiderror), + \*STDIN, + (IS_WIN32 ? \*STDOUT : $kidout) + ); + + STDOUT->autoflush(1); STDERR->autoflush(1); STDIN->autoflush(1); + $kidout->autoflush(1) if UNIVERSAL::can($kidout, 'autoflush'); + $kiderror->autoflush(1) if UNIVERSAL::can($kiderror, 'autoflush'); + + ### add an explicit break statement + ### code courtesy of theorbtwo from #london.pm + my $stdout_done = 0; + my $stderr_done = 0; + OUTER: while ( my @ready = $selector->can_read ) { + + for my $h ( @ready ) { + my $buf; + + ### $len is the amount of bytes read + my $len = sysread( $h, $buf, 4096 ); # try to read 4096 bytes + + ### see perldoc -f sysread: it returns undef on error, + ### so bail out. + if( not defined $len ) { + warn(loc("Error reading from process: %1", $!)); + last OUTER; + } + + ### check for $len. it may be 0, at which point we're + ### done reading, so don't try to process it. + ### if we would print anyway, we'd provide bogus information + $_out_handler->( "$buf" ) if $len && $h == $kidout; + $_err_handler->( "$buf" ) if $len && $h == $kiderror; + + ### Wait till child process is done printing to both + ### stdout and stderr. + $stdout_done = 1 if $h == $kidout and $len == 0; + $stderr_done = 1 if $h == $kiderror and $len == 0; + last OUTER if ($stdout_done && $stderr_done); + } + } + + waitpid $pid, 0; # wait for it to die + + ### restore STDIN after duping, or STDIN will be closed for + ### this current perl process! + ### done in the parent call now + # $self->__reopen_fds( @fds_to_dup ); + + ### some error occurred + if( $? ) { + $self->error( $self->_pp_child_error( $cmd, $? ) ); + $self->ok( 0 ); + return; + } else { + return $self->ok( 1 ); + } +} + +### Text::ParseWords::shellwords() uses unix semantics. that will break +### on win32 +{ my $parse_sub = IS_WIN32 + ? __PACKAGE__->can('_split_like_shell_win32') + : Text::ParseWords->can('shellwords'); + + sub _ipc_run { + my $self = shift; + my $cmd = shift; + my $_out_handler = shift; + my $_err_handler = shift; + + STDOUT->autoflush(1); STDERR->autoflush(1); + + ### a command like: + # [ + # '/usr/bin/gzip', + # '-cdf', + # '/Users/kane/sources/p4/other/archive-extract/t/src/x.tgz', + # '|', + # '/usr/bin/tar', + # '-tf -' + # ] + ### needs to become: + # [ + # ['/usr/bin/gzip', '-cdf', + # '/Users/kane/sources/p4/other/archive-extract/t/src/x.tgz'] + # '|', + # ['/usr/bin/tar', '-tf -'] + # ] + + + my @command; + my $special_chars; + + my $re = do { my $x = join '', SPECIAL_CHARS; qr/([$x])/ }; + if( ref $cmd ) { + my $aref = []; + for my $item (@$cmd) { + if( $item =~ $re ) { + push @command, $aref, $item; + $aref = []; + $special_chars .= $1; + } else { + push @$aref, $item; + } + } + push @command, $aref; + } else { + @command = map { if( $_ =~ $re ) { + $special_chars .= $1; $_; + } else { +# [ split /\s+/ ] + [ map { m/[ ]/ ? qq{'$_'} : $_ } $parse_sub->($_) ] + } + } split( /\s*$re\s*/, $cmd ); + } + + ### if there's a pipe in the command, *STDIN needs to + ### be inserted *BEFORE* the pipe, to work on win32 + ### this also works on *nix, so we should do it when possible + ### this should *also* work on multiple pipes in the command + ### if there's no pipe in the command, append STDIN to the back + ### of the command instead. + ### XXX seems IPC::Run works it out for itself if you just + ### don't pass STDIN at all. + # if( $special_chars and $special_chars =~ /\|/ ) { + # ### only add STDIN the first time.. + # my $i; + # @command = map { ($_ eq '|' && not $i++) + # ? ( \*STDIN, $_ ) + # : $_ + # } @command; + # } else { + # push @command, \*STDIN; + # } + + # \*STDIN is already included in the @command, see a few lines up + my $ok = eval { IPC::Run::run( @command, + fileno(STDOUT).'>', + $_out_handler, + fileno(STDERR).'>', + $_err_handler + ) + }; + + ### all is well + if( $ok ) { + return $self->ok( $ok ); + + ### some error occurred + } else { + $self->ok( 0 ); + + ### if the eval fails due to an exception, deal with it + ### unless it's an alarm + if( $@ and not UNIVERSAL::isa( $@, ALARM_CLASS ) ) { + $self->error( $@ ); + + ### if it *is* an alarm, propagate + } elsif( $@ ) { + die $@; + + ### some error in the sub command + } else { + $self->error( $self->_pp_child_error( $cmd, $? ) ); + } + + return; + } + } +} + +sub _system_run { + my $self = shift; + my $cmd = shift; + my $verbose = shift || 0; + + ### pipes have to come in a quoted string, and that clashes with + ### whitespace. This sub fixes up such commands so they run properly + $cmd = $self->__fix_cmd_whitespace_and_special_chars( $cmd ); + + my @fds_to_dup = $verbose ? () : qw[STDOUT STDERR]; + $self->_fds( \@fds_to_dup ); + $self->__dup_fds( @fds_to_dup ); + + ### system returns 'true' on failure -- the exit code of the cmd + $self->ok( 1 ); + system( ref $cmd ? @$cmd : $cmd ) == 0 or do { + $self->error( $self->_pp_child_error( $cmd, $? ) ); + $self->ok( 0 ); + }; + + ### done in the parent call now + #$self->__reopen_fds( @fds_to_dup ); + + return unless $self->ok; + return $self->ok; +} + +{ my %sc_lookup = map { $_ => $_ } SPECIAL_CHARS; + + + sub __fix_cmd_whitespace_and_special_chars { + my $self = shift; + my $cmd = shift; + + ### command has a special char in it + if( ref $cmd and grep { $sc_lookup{$_} } @$cmd ) { + + ### since we have special chars, we have to quote white space + ### this *may* conflict with the parsing :( + my $fixed; + my @cmd = map { / / ? do { $fixed++; QUOTE.$_.QUOTE } : $_ } @$cmd; + + $self->_debug( "# Quoted $fixed arguments containing whitespace" ) + if $DEBUG && $fixed; + + ### stringify it, so the special char isn't escaped as argument + ### to the program + $cmd = join ' ', @cmd; + } + + return $cmd; + } +} + +### Command-line arguments (but not the command itself) must be quoted +### to ensure case preservation. Borrowed from Module::Build with adaptations. +### Patch for this supplied by Craig Berry, see RT #46288: [PATCH] Add argument +### quoting for run() on VMS +sub _quote_args_vms { + ### Returns a command string with proper quoting so that the subprocess + ### sees this same list of args, or if we get a single arg that is an + ### array reference, quote the elements of it (except for the first) + ### and return the reference. + my @args = @_; + my $got_arrayref = (scalar(@args) == 1 + && UNIVERSAL::isa($args[0], 'ARRAY')) + ? 1 + : 0; + + @args = split(/\s+/, $args[0]) unless $got_arrayref || scalar(@args) > 1; + + my $cmd = $got_arrayref ? shift @{$args[0]} : shift @args; + + ### Do not quote qualifiers that begin with '/' or previously quoted args. + map { if (/^[^\/\"]/) { + $_ =~ s/\"/""/g; # escape C<"> by doubling + $_ = q(").$_.q("); + } + } + ($got_arrayref ? @{$args[0]} + : @args + ); + + $got_arrayref ? unshift(@{$args[0]}, $cmd) : unshift(@args, $cmd); + + return $got_arrayref ? $args[0] + : join(' ', @args); +} + + +### XXX this is cribbed STRAIGHT from M::B 0.30 here: +### http://search.cpan.org/src/KWILLIAMS/Module-Build-0.30/lib/Module/Build/Platform/Windows.pm:split_like_shell +### XXX this *should* be integrated into text::parsewords +sub _split_like_shell_win32 { + # As it turns out, Windows command-parsing is very different from + # Unix command-parsing. Double-quotes mean different things, + # backslashes don't necessarily mean escapes, and so on. So we + # can't use Text::ParseWords::shellwords() to break a command string + # into words. The algorithm below was bashed out by Randy and Ken + # (mostly Randy), and there are a lot of regression tests, so we + # should feel free to adjust if desired. + + local $_ = shift; + + my @argv; + return @argv unless defined() && length(); + + my $arg = ''; + my( $i, $quote_mode ) = ( 0, 0 ); + + while ( $i < length() ) { + + my $ch = substr( $_, $i , 1 ); + my $next_ch = substr( $_, $i+1, 1 ); + + if ( $ch eq '\\' && $next_ch eq '"' ) { + $arg .= '"'; + $i++; + } elsif ( $ch eq '\\' && $next_ch eq '\\' ) { + $arg .= '\\'; + $i++; + } elsif ( $ch eq '"' && $next_ch eq '"' && $quote_mode ) { + $quote_mode = !$quote_mode; + $arg .= '"'; + $i++; + } elsif ( $ch eq '"' && $next_ch eq '"' && !$quote_mode && + ( $i + 2 == length() || + substr( $_, $i + 2, 1 ) eq ' ' ) + ) { # for cases like: a"" => [ 'a' ] + push( @argv, $arg ); + $arg = ''; + $i += 2; + } elsif ( $ch eq '"' ) { + $quote_mode = !$quote_mode; + } elsif ( $ch eq ' ' && !$quote_mode ) { + push( @argv, $arg ) if defined( $arg ) && length( $arg ); + $arg = ''; + ++$i while substr( $_, $i + 1, 1 ) eq ' '; + } else { + $arg .= $ch; + } + + $i++; + } + + push( @argv, $arg ) if defined( $arg ) && length( $arg ); + return @argv; +} + + + +{ use File::Spec; + use Symbol; + + my %Map = ( + STDOUT => [qw|>&|, \*STDOUT, Symbol::gensym() ], + STDERR => [qw|>&|, \*STDERR, Symbol::gensym() ], + STDIN => [qw|<&|, \*STDIN, Symbol::gensym() ], + ); + + ### dups FDs and stores them in a cache + sub __dup_fds { + my $self = shift; + my @fds = @_; + + __PACKAGE__->_debug( "# Closing the following fds: @fds" ) if $DEBUG; + + for my $name ( @fds ) { + my($redir, $fh, $glob) = @{$Map{$name}} or ( + Carp::carp(loc("No such FD: '%1'", $name)), next ); + + ### MUST use the 2-arg version of open for dup'ing for + ### 5.6.x compatibility. 5.8.x can use 3-arg open + ### see perldoc5.6.2 -f open for details + open $glob, $redir . fileno($fh) or ( + Carp::carp(loc("Could not dup '$name': %1", $!)), + return + ); + + ### we should re-open this filehandle right now, not + ### just dup it + ### Use 2-arg version of open, as 5.5.x doesn't support + ### 3-arg version =/ + if( $redir eq '>&' ) { + open( $fh, '>' . File::Spec->devnull ) or ( + Carp::carp(loc("Could not reopen '$name': %1", $!)), + return + ); + } + } + + return 1; + } + + ### reopens FDs from the cache + sub __reopen_fds { + my $self = shift; + my @fds = @_; + + __PACKAGE__->_debug( "# Reopening the following fds: @fds" ) if $DEBUG; + + for my $name ( @fds ) { + my($redir, $fh, $glob) = @{$Map{$name}} or ( + Carp::carp(loc("No such FD: '%1'", $name)), next ); + + ### MUST use the 2-arg version of open for dup'ing for + ### 5.6.x compatibility. 5.8.x can use 3-arg open + ### see perldoc5.6.2 -f open for details + open( $fh, $redir . fileno($glob) ) or ( + Carp::carp(loc("Could not restore '$name': %1", $!)), + return + ); + + ### close this FD, we're not using it anymore + close $glob; + } + return 1; + + } +} + +sub _debug { + my $self = shift; + my $msg = shift or return; + my $level = shift || 0; + + local $Carp::CarpLevel += $level; + Carp::carp($msg); + + return 1; +} + +sub _pp_child_error { + my $self = shift; + my $cmd = shift or return; + my $ce = shift or return; + my $pp_cmd = ref $cmd ? "@$cmd" : $cmd; + + + my $str; + if( $ce == -1 ) { + ### Include $! in the error message, so that the user can + ### see 'No such file or directory' versus 'Permission denied' + ### versus 'Cannot fork' or whatever the cause was. + $str = "Failed to execute '$pp_cmd': $!"; + + } elsif ( $ce & 127 ) { + ### some signal + $str = loc( "'%1' died with signal %2, %3 coredump", + $pp_cmd, ($ce & 127), ($ce & 128) ? 'with' : 'without'); + + } else { + ### Otherwise, the command run but gave error status. + $str = "'$pp_cmd' exited with value " . ($ce >> 8); + } + + $self->_debug( "# Child error '$ce' translated to: $str" ) if $DEBUG; + + return $str; +} + +1; + +__END__ + +package IPC::Open2; + +use strict; +our ($VERSION, @ISA, @EXPORT); + +require 5.000; +require Exporter; + +$VERSION = 1.04; +@ISA = qw(Exporter); +@EXPORT = qw(open2); + + +# &open2: tom christiansen, +# +# usage: $pid = open2('rdr', 'wtr', 'some cmd and args'); +# or $pid = open2('rdr', 'wtr', 'some', 'cmd', 'and', 'args'); +# +# spawn the given $cmd and connect $rdr for +# reading and $wtr for writing. return pid +# of child, or 0 on failure. +# +# WARNING: this is dangerous, as you may block forever +# unless you are very careful. +# +# $wtr is left unbuffered. +# +# abort program if +# rdr or wtr are null +# a system call fails + +require IPC::Open3; + +sub open2 { + local $Carp::CarpLevel = $Carp::CarpLevel + 1; + return IPC::Open3::_open3('open2', $_[1], $_[0], '>&STDERR', @_[2 .. $#_]); +} + +1 +package Devel::SelfStubber; +use File::Spec; +require SelfLoader; +@ISA = qw(SelfLoader); +@EXPORT = 'AUTOLOAD'; +$JUST_STUBS = 1; +$VERSION = 1.06; +sub Version {$VERSION} + +# Use as +# perl -e 'use Devel::SelfStubber;Devel::SelfStubber->stub(MODULE_NAME,LIB)' +# (LIB defaults to '.') e.g. +# perl -e 'use Devel::SelfStubber;Devel::SelfStubber->stub('Math::BigInt')' +# would print out stubs needed if you added a __DATA__ before the subs. +# Setting $Devel::SelfStubber::JUST_STUBS to 0 will print out the whole +# module with the stubs entered just before the __DATA__ + +sub _add_to_cache { + my($self,$fullname,$pack,$lines, $prototype) = @_; + push(@DATA,@{$lines}); + if($fullname){push(@STUBS,"sub $fullname $prototype;\n")}; # stubs + '1;'; +} + +sub _package_defined { + my($self,$line) = @_; + push(@DATA,$line); +} + +sub stub { + my($self,$module,$lib) = @_; + my($line,$end_data,$fh,$mod_file,$found_selfloader); + $lib ||= File::Spec->curdir(); + ($mod_file = $module) =~ s,::,/,g; + $mod_file =~ tr|/|:| if $^O eq 'MacOS'; + + $mod_file = File::Spec->catfile($lib, "$mod_file.pm"); + $fh = "${module}::DATA"; + my (@BEFORE_DATA, @AFTER_DATA, @AFTER_END); + @DATA = @STUBS = (); + + open($fh,'<',$mod_file) || die "Unable to open $mod_file"; + local $/ = "\n"; + while(defined ($line = <$fh>) and $line !~ m/^__DATA__/) { + push(@BEFORE_DATA,$line); + $line =~ /use\s+SelfLoader/ && $found_selfloader++; + } + (defined ($line) && $line =~ m/^__DATA__/) + || die "$mod_file doesn't contain a __DATA__ token"; + $found_selfloader || + print 'die "\'use SelfLoader;\' statement NOT FOUND!!\n"',"\n"; + if ($JUST_STUBS) { + $self->_load_stubs($module); + } else { + $self->_load_stubs($module, \@AFTER_END); + } + if ( fileno($fh) ) { + $end_data = 1; + while(defined($line = <$fh>)) { + push(@AFTER_DATA,$line); + } + } + close($fh); + unless ($JUST_STUBS) { + print @BEFORE_DATA; + } + print @STUBS; + unless ($JUST_STUBS) { + print "1;\n__DATA__\n",@DATA; + if($end_data) { print "__END__ DATA\n",@AFTER_DATA; } + if(@AFTER_END) { print "__END__\n",@AFTER_END; } + } +} + +1; +__END__ + +package Devel::StackTrace; + +use 5.006; + +use strict; +use warnings; + +our $VERSION = '2.03'; + +use Devel::StackTrace::Frame; +use File::Spec; +use Scalar::Util qw( blessed ); + +use overload + '""' => \&as_string, + fallback => 1; + +sub new { + my $class = shift; + my %p = @_; + + $p{unsafe_ref_capture} = !delete $p{no_refs} + if exists $p{no_refs}; + + my $self = bless { + index => undef, + frames => [], + raw => [], + %p, + }, $class; + + $self->_record_caller_data; + + return $self; +} + +sub _record_caller_data { + my $self = shift; + + my $filter = $self->{filter_frames_early} && $self->_make_frame_filter; + + # We exclude this method by starting at least one frame back. + my $x = 1 + ( $self->{skip_frames} || 0 ); + + while ( + my @c + = $self->{no_args} + ? caller( $x++ ) + : do { + ## no critic (Modules::ProhibitMultiplePackages, Variables::ProhibitPackageVars) + package # the newline keeps dzil from adding a version here + DB; + @DB::args = (); + caller( $x++ ); + } + ) { + + my @args; + + ## no critic (Variables::ProhibitPackageVars) + @args = $self->{no_args} ? () : @DB::args; + ## use critic + + my $raw = { + caller => \@c, + args => \@args, + }; + + next if $filter && !$filter->($raw); + + unless ( $self->{unsafe_ref_capture} ) { + $raw->{args} = [ map { ref $_ ? $self->_ref_to_string($_) : $_ } + @{ $raw->{args} } ]; + } + + push @{ $self->{raw} }, $raw; + } +} + +sub _ref_to_string { + my $self = shift; + my $ref = shift; + + return overload::AddrRef($ref) + if blessed $ref && $ref->isa('Exception::Class::Base'); + + return overload::AddrRef($ref) unless $self->{respect_overload}; + + ## no critic (Variables::RequireInitializationForLocalVars) + local $@; + local $SIG{__DIE__}; + ## use critic + + my $str = eval { $ref . q{} }; + + return $@ ? overload::AddrRef($ref) : $str; +} + +sub _make_frames { + my $self = shift; + + my $filter = !$self->{filter_frames_early} && $self->_make_frame_filter; + + my $raw = delete $self->{raw}; + for my $r ( @{$raw} ) { + next if $filter && !$filter->($r); + + $self->_add_frame( $r->{caller}, $r->{args} ); + } +} + +my $default_filter = sub {1}; + +sub _make_frame_filter { + my $self = shift; + + my ( @i_pack_re, %i_class ); + if ( $self->{ignore_package} ) { + ## no critic (Variables::RequireInitializationForLocalVars) + local $@; + local $SIG{__DIE__}; + ## use critic + + $self->{ignore_package} = [ $self->{ignore_package} ] + unless eval { @{ $self->{ignore_package} } }; + + @i_pack_re + = map { ref $_ ? $_ : qr/^\Q$_\E$/ } @{ $self->{ignore_package} }; + } + + my $p = __PACKAGE__; + push @i_pack_re, qr/^\Q$p\E$/; + + if ( $self->{ignore_class} ) { + $self->{ignore_class} = [ $self->{ignore_class} ] + unless ref $self->{ignore_class}; + %i_class = map { $_ => 1 } @{ $self->{ignore_class} }; + } + + my $user_filter = $self->{frame_filter}; + + return sub { + return 0 if grep { $_[0]{caller}[0] =~ /$_/ } @i_pack_re; + return 0 if grep { $_[0]{caller}[0]->isa($_) } keys %i_class; + + if ($user_filter) { + return $user_filter->( $_[0] ); + } + + return 1; + }; +} + +sub _add_frame { + my $self = shift; + my $c = shift; + my $p = shift; + + # eval and is_require are only returned when applicable under 5.00503. + push @$c, ( undef, undef ) if scalar @$c == 6; + + push @{ $self->{frames} }, + Devel::StackTrace::Frame->new( + $c, + $p, + $self->{respect_overload}, + $self->{max_arg_length}, + $self->{message}, + $self->{indent} + ); +} + +sub next_frame { + my $self = shift; + + # reset to top if necessary. + $self->{index} = -1 unless defined $self->{index}; + + my @f = $self->frames; + if ( defined $f[ $self->{index} + 1 ] ) { + return $f[ ++$self->{index} ]; + } + else { + $self->{index} = undef; + ## no critic (Subroutines::ProhibitExplicitReturnUndef) + return undef; + } +} + +sub prev_frame { + my $self = shift; + + my @f = $self->frames; + + # reset to top if necessary. + $self->{index} = scalar @f unless defined $self->{index}; + + if ( defined $f[ $self->{index} - 1 ] && $self->{index} >= 1 ) { + return $f[ --$self->{index} ]; + } + else { + ## no critic (Subroutines::ProhibitExplicitReturnUndef) + $self->{index} = undef; + return undef; + } +} + +sub reset_pointer { + my $self = shift; + + $self->{index} = undef; + + return; +} + +sub frames { + my $self = shift; + + if (@_) { + die + "Devel::StackTrace->frames can only take Devel::StackTrace::Frame args\n" + if grep { !$_->isa('Devel::StackTrace::Frame') } @_; + + $self->{frames} = \@_; + delete $self->{raw}; + } + else { + $self->_make_frames if $self->{raw}; + } + + return @{ $self->{frames} }; +} + +sub frame { + my $self = shift; + my $i = shift; + + return unless defined $i; + + return ( $self->frames )[$i]; +} + +sub frame_count { + my $self = shift; + + return scalar( $self->frames ); +} + +sub message { $_[0]->{message} } + +sub as_string { + my $self = shift; + my $p = shift; + + my @frames = $self->frames; + if (@frames) { + my $st = q{}; + my $first = 1; + for my $f (@frames) { + $st .= $f->as_string( $first, $p ) . "\n"; + $first = 0; + } + + return $st; + } + + my $msg = $self->message; + return $msg if defined $msg; + + return 'Trace begun'; +} + +{ + ## no critic (Modules::ProhibitMultiplePackages, ClassHierarchies::ProhibitExplicitISA) + package # hide from PAUSE + Devel::StackTraceFrame; + + our @ISA = 'Devel::StackTrace::Frame'; +} + +1; + +# ABSTRACT: An object representing a stack trace + +__END__ + +package Devel::StackTrace::Frame; + +use strict; +use warnings; + +our $VERSION = '2.03'; + +# Create accessor routines +BEGIN { + ## no critic (TestingAndDebugging::ProhibitNoStrict) + no strict 'refs'; + + my @attrs = qw( + package + filename + line + subroutine + hasargs + wantarray + evaltext + is_require + hints + bitmask + ); + + for my $a (@attrs) { + *{$a} = sub { my $s = shift; return $s->{$a} }; + } +} + +{ + my @args = qw( + package + filename + line + subroutine + hasargs + wantarray + evaltext + is_require + hints + bitmask + ); + + sub new { + my $proto = shift; + my $class = ref $proto || $proto; + + my $self = bless {}, $class; + + @{$self}{@args} = @{ shift() }; + $self->{args} = shift; + $self->{respect_overload} = shift; + $self->{max_arg_length} = shift; + $self->{message} = shift; + $self->{indent} = shift; + + # fixup unix-style paths on win32 + $self->{filename} = File::Spec->canonpath( $self->{filename} ); + + return $self; + } +} + +sub args { + my $self = shift; + + return @{ $self->{args} }; +} + +sub as_string { + my $self = shift; + my $first = shift; + my $p = shift; + + my $sub = $self->subroutine; + + # This code stolen straight from Carp.pm and then tweaked. All + # errors are probably my fault -dave + if ($first) { + $sub + = defined $self->{message} + ? $self->{message} + : 'Trace begun'; + } + else { + + # Build a string, $sub, which names the sub-routine called. + # This may also be "require ...", "eval '...' or "eval {...}" + if ( my $eval = $self->evaltext ) { + if ( $self->is_require ) { + $sub = "require $eval"; + } + else { + $eval =~ s/([\\\'])/\\$1/g; + $sub = "eval '$eval'"; + } + } + elsif ( $sub eq '(eval)' ) { + $sub = 'eval {...}'; + } + + # if there are any arguments in the sub-routine call, format + # them according to the format variables defined earlier in + # this file and join them onto the $sub sub-routine string + # + # We copy them because they're going to be modified. + # + if ( my @a = $self->args ) { + for (@a) { + + # set args to the string "undef" if undefined + unless ( defined $_ ) { + $_ = 'undef'; + next; + } + + # hack! + ## no critic (Subroutines::ProtectPrivateSubs) + $_ = $self->Devel::StackTrace::_ref_to_string($_) + if ref $_; + ## use critic; + + ## no critic (Variables::RequireInitializationForLocalVars) + local $SIG{__DIE__}; + local $@; + ## use critic; + + ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval) + eval { + my $max_arg_length + = exists $p->{max_arg_length} + ? $p->{max_arg_length} + : $self->{max_arg_length}; + + if ( $max_arg_length + && length $_ > $max_arg_length ) { + ## no critic (BuiltinFunctions::ProhibitLvalueSubstr) + substr( $_, $max_arg_length ) = '...'; + } + + s/'/\\'/g; + + # 'quote' arg unless it looks like a number + $_ = "'$_'" unless /^-?[\d.]+$/; + + # print control/high ASCII chars as 'M-' or '^' + s/([\200-\377])/sprintf("M-%c",ord($1)&0177)/eg; + s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg; + }; + ## use critic + + if ( my $e = $@ ) { + $_ = $e =~ /malformed utf-8/i ? '(bad utf-8)' : '?'; + } + } + + # append ('all', 'the', 'arguments') to the $sub string + $sub .= '(' . join( ', ', @a ) . ')'; + $sub .= ' called'; + } + } + + # If the user opted into indentation (a la Carp::confess), pre-add a tab + my $tab = $self->{indent} && !$first ? "\t" : q{}; + + return "${tab}$sub at " . $self->filename . ' line ' . $self->line; +} + +1; + +# ABSTRACT: A single frame in a stack trace + +__END__ + +package Unicode::UCD; + +use strict; +use warnings; +no warnings 'surrogate'; # surrogates can be inputs to this +use charnames (); + +our $VERSION = '0.70'; + +require Exporter; + +our @ISA = qw(Exporter); + +our @EXPORT_OK = qw(charinfo + charblock charscript + charblocks charscripts + charinrange + charprop + charprops_all + general_categories bidi_types + compexcl + casefold all_casefolds casespec + namedseq + num + prop_aliases + prop_value_aliases + prop_values + prop_invlist + prop_invmap + search_invlist + MAX_CP + ); + +use Carp; + +sub IS_ASCII_PLATFORM { ord("A") == 65 } + + +my $v_unicode_version; # v-string. + +sub openunicode { + my (@path) = @_; + my $rfh; + for my $d (@INC) { + use File::Spec; + my $f = File::Spec->catfile($d, "unicore", @path); + return $rfh if open($rfh, '<', $f); + } + croak __PACKAGE__, ": failed to find ", + File::Spec->catfile("unicore", @path), " in @INC"; +} + +sub _dclone ($) { # Use Storable::dclone if available; otherwise emulate it. + + use if defined &DynaLoader::boot_DynaLoader, Storable => qw(dclone); + + return dclone(shift) if defined &dclone; + + my $arg = shift; + my $type = ref $arg; + return $arg unless $type; # No deep cloning needed for scalars + + if ($type eq 'ARRAY') { + my @return; + foreach my $element (@$arg) { + push @return, &_dclone($element); + } + return \@return; + } + elsif ($type eq 'HASH') { + my %return; + foreach my $key (keys %$arg) { + $return{$key} = &_dclone($arg->{$key}); + } + return \%return; + } + else { + croak "_dclone can't handle " . $type; + } +} + + +# NB: This function is nearly duplicated in charnames.pm +sub _getcode { + my $arg = shift; + + if ($arg =~ /^[1-9]\d*$/) { + return $arg; + } + elsif ($arg =~ /^(?:0[xX])?([[:xdigit:]]+)$/) { + return CORE::hex($1); + } + elsif ($arg =~ /^[Uu]\+([[:xdigit:]]+)$/) { # Is of form U+0000, means + # wants the Unicode code + # point, not the native one + my $decimal = CORE::hex($1); + return $decimal if IS_ASCII_PLATFORM; + return utf8::unicode_to_native($decimal); + } + + return; +} + +# Populated by _num. Converts real number back to input rational +my %real_to_rational; + +# To store the contents of files found on disk. +my @BIDIS; +my @CATEGORIES; +my @DECOMPOSITIONS; +my @NUMERIC_TYPES; +my %SIMPLE_LOWER; +my %SIMPLE_TITLE; +my %SIMPLE_UPPER; +my %UNICODE_1_NAMES; +my %ISO_COMMENT; + +# Eval'd so can run on versions earlier than the property is available in +my $Hangul_Syllables_re = eval 'qr/\p{Block=Hangul_Syllables}/'; + +sub charinfo { + + # This function has traditionally mimicked what is in UnicodeData.txt, + # warts and all. This is a re-write that avoids UnicodeData.txt so that + # it can be removed to save disk space. Instead, this assembles + # information gotten by other methods that get data from various other + # files. It uses charnames to get the character name; and various + # mktables tables. + + use feature 'unicode_strings'; + + # Will fail if called under minitest + use if defined &DynaLoader::boot_DynaLoader, "Unicode::Normalize" => qw(getCombinClass NFD); + + my $arg = shift; + my $code = _getcode($arg); + croak __PACKAGE__, "::charinfo: unknown code '$arg'" unless defined $code; + + # Non-unicode implies undef. + return if $code > 0x10FFFF; + + my %prop; + my $char = chr($code); + + @CATEGORIES =_read_table("To/Gc.pl") unless @CATEGORIES; + $prop{'category'} = _search(\@CATEGORIES, 0, $#CATEGORIES, $code) + // $utf8::SwashInfo{'ToGc'}{'missing'}; + # Return undef if category value is 'Unassigned' or one of its synonyms + return if grep { lc $_ eq 'unassigned' } + prop_value_aliases('Gc', $prop{'category'}); + + $prop{'code'} = sprintf "%04X", $code; + $prop{'name'} = ($char =~ /\p{Cntrl}/) ? '' + : (charnames::viacode($code) // ""); + + $prop{'combining'} = getCombinClass($code); + + @BIDIS =_read_table("To/Bc.pl") unless @BIDIS; + $prop{'bidi'} = _search(\@BIDIS, 0, $#BIDIS, $code) + // $utf8::SwashInfo{'ToBc'}{'missing'}; + + # For most code points, we can just read in "unicore/Decomposition.pl", as + # its contents are exactly what should be output. But that file doesn't + # contain the data for the Hangul syllable decompositions, which can be + # algorithmically computed, and NFD() does that, so we call NFD() for + # those. We can't use NFD() for everything, as it does a complete + # recursive decomposition, and what this function has always done is to + # return what's in UnicodeData.txt which doesn't show that recursiveness. + # Fortunately, the NFD() of the Hanguls doesn't have any recursion + # issues. + # Having no decomposition implies an empty field; otherwise, all but + # "Canonical" imply a compatible decomposition, and the type is prefixed + # to that, as it is in UnicodeData.txt + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version ge v2.0.0 && $char =~ $Hangul_Syllables_re) { + # The code points of the decomposition are output in standard Unicode + # hex format, separated by blanks. + $prop{'decomposition'} = join " ", map { sprintf("%04X", $_)} + unpack "U*", NFD($char); + } + else { + @DECOMPOSITIONS = _read_table("Decomposition.pl") + unless @DECOMPOSITIONS; + $prop{'decomposition'} = _search(\@DECOMPOSITIONS, 0, $#DECOMPOSITIONS, + $code) // ""; + } + + # Can use num() to get the numeric values, if any. + if (! defined (my $value = num($char))) { + $prop{'decimal'} = $prop{'digit'} = $prop{'numeric'} = ""; + } + else { + if ($char =~ /\d/) { + $prop{'decimal'} = $prop{'digit'} = $prop{'numeric'} = $value; + } + else { + + # For non-decimal-digits, we have to read in the Numeric type + # to distinguish them. It is not just a matter of integer vs. + # rational, as some whole number values are not considered digits, + # e.g., TAMIL NUMBER TEN. + $prop{'decimal'} = ""; + + @NUMERIC_TYPES =_read_table("To/Nt.pl") unless @NUMERIC_TYPES; + if ((_search(\@NUMERIC_TYPES, 0, $#NUMERIC_TYPES, $code) // "") + eq 'Digit') + { + $prop{'digit'} = $prop{'numeric'} = $value; + } + else { + $prop{'digit'} = ""; + $prop{'numeric'} = $real_to_rational{$value} // $value; + } + } + } + + $prop{'mirrored'} = ($char =~ /\p{Bidi_Mirrored}/) ? 'Y' : 'N'; + + %UNICODE_1_NAMES =_read_table("To/Na1.pl", "use_hash") unless %UNICODE_1_NAMES; + $prop{'unicode10'} = $UNICODE_1_NAMES{$code} // ""; + + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version ge v6.0.0) { + $prop{'comment'} = ""; + } + else { + %ISO_COMMENT = _read_table("To/Isc.pl", "use_hash") unless %ISO_COMMENT; + $prop{'comment'} = (defined $ISO_COMMENT{$code}) + ? $ISO_COMMENT{$code} + : ""; + } + + %SIMPLE_UPPER = _read_table("To/Uc.pl", "use_hash") unless %SIMPLE_UPPER; + $prop{'upper'} = (defined $SIMPLE_UPPER{$code}) + ? sprintf("%04X", $SIMPLE_UPPER{$code}) + : ""; + + %SIMPLE_LOWER = _read_table("To/Lc.pl", "use_hash") unless %SIMPLE_LOWER; + $prop{'lower'} = (defined $SIMPLE_LOWER{$code}) + ? sprintf("%04X", $SIMPLE_LOWER{$code}) + : ""; + + %SIMPLE_TITLE = _read_table("To/Tc.pl", "use_hash") unless %SIMPLE_TITLE; + $prop{'title'} = (defined $SIMPLE_TITLE{$code}) + ? sprintf("%04X", $SIMPLE_TITLE{$code}) + : ""; + + $prop{block} = charblock($code); + $prop{script} = charscript($code); + return \%prop; +} + +sub _search { # Binary search in a [[lo,hi,prop],[...],...] table. + my ($table, $lo, $hi, $code) = @_; + + return if $lo > $hi; + + my $mid = int(($lo+$hi) / 2); + + if ($table->[$mid]->[0] < $code) { + if ($table->[$mid]->[1] >= $code) { + return $table->[$mid]->[2]; + } else { + _search($table, $mid + 1, $hi, $code); + } + } elsif ($table->[$mid]->[0] > $code) { + _search($table, $lo, $mid - 1, $code); + } else { + return $table->[$mid]->[2]; + } +} + +sub _read_table ($;$) { + + # Returns the contents of the mktables generated table file located at $1 + # in the form of either an array of arrays or a hash, depending on if the + # optional second parameter is true (for hash return) or not. In the case + # of a hash return, each key is a code point, and its corresponding value + # is what the table gives as the code point's corresponding value. In the + # case of an array return, each outer array denotes a range with [0] the + # start point of that range; [1] the end point; and [2] the value that + # every code point in the range has. The hash return is useful for fast + # lookup when the table contains only single code point ranges. The array + # return takes much less memory when there are large ranges. + # + # This function has the side effect of setting + # $utf8::SwashInfo{$property}{'format'} to be the mktables format of the + # table; and + # $utf8::SwashInfo{$property}{'missing'} to be the value for all entries + # not listed in the table. + # where $property is the Unicode property name, preceded by 'To' for map + # properties., e.g., 'ToSc'. + # + # Table entries look like one of: + # 0000 0040 Common # [65] + # 00AA Latin + + my $table = shift; + my $return_hash = shift; + $return_hash = 0 unless defined $return_hash; + my @return; + my %return; + local $_; + my $list = do "unicore/$table"; + + # Look up if this property requires adjustments, which we do below if it + # does. + require "unicore/Heavy.pl"; + my $property = $table =~ s/\.pl//r; + $property = $utf8::file_to_swash_name{$property}; + my $to_adjust = defined $property + && $utf8::SwashInfo{$property}{'format'} =~ / ^ a /x; + + for (split /^/m, $list) { + my ($start, $end, $value) = / ^ (.+?) \t (.*?) \t (.+?) + \s* ( \# .* )? # Optional comment + $ /x; + my $decimal_start = hex $start; + my $decimal_end = ($end eq "") ? $decimal_start : hex $end; + $value = hex $value if $to_adjust + && $utf8::SwashInfo{$property}{'format'} eq 'ax'; + if ($return_hash) { + foreach my $i ($decimal_start .. $decimal_end) { + $return{$i} = ($to_adjust) + ? $value + $i - $decimal_start + : $value; + } + } + elsif (! $to_adjust + && @return + && $return[-1][1] == $decimal_start - 1 + && $return[-1][2] eq $value) + { + # If this is merely extending the previous range, do just that. + $return[-1]->[1] = $decimal_end; + } + else { + push @return, [ $decimal_start, $decimal_end, $value ]; + } + } + return ($return_hash) ? %return : @return; +} + +sub charinrange { + my ($range, $arg) = @_; + my $code = _getcode($arg); + croak __PACKAGE__, "::charinrange: unknown code '$arg'" + unless defined $code; + _search($range, 0, $#$range, $code); +} + + +sub charprop ($$;$) { + my ($input_cp, $prop, $internal_ok) = @_; + + my $cp = _getcode($input_cp); + croak __PACKAGE__, "::charprop: unknown code point '$input_cp'" unless defined $cp; + + my ($list_ref, $map_ref, $format, $default) + = prop_invmap($prop, $internal_ok); + return undef unless defined $list_ref; + + my $i = search_invlist($list_ref, $cp); + croak __PACKAGE__, "::charprop: prop_invmap return is invalid for charprop('$input_cp', '$prop)" unless defined $i; + + # $i is the index into both the inversion list and map of $cp. + my $map = $map_ref->[$i]; + + # Convert enumeration values to their most complete form. + if (! ref $map) { + my $long_form = prop_value_aliases($prop, $map); + $map = $long_form if defined $long_form; + } + + if ($format =~ / ^ s /x) { # Scalars + return join ",", @$map if ref $map; # Convert to scalar with comma + # separated array elements + + # Resolve ambiguity as to whether an all digit value is a code point + # that should be converted to a character, or whether it is really + # just a number. To do this, look at the default. If it is a + # non-empty number, we can safely assume the result is also a number. + if ($map =~ / ^ \d+ $ /ax && $default !~ / ^ \d+ $ /ax) { + $map = chr $map; + } + elsif ($map =~ / ^ (?: Y | N ) $ /x) { + + # prop_invmap() returns these values for properties that are Perl + # extensions. But this is misleading. For now, return undef for + # these, as currently documented. + undef $map unless + exists $Unicode::UCD::prop_aliases{utf8::_loose_name(lc $prop)}; + } + return $map; + } + elsif ($format eq 'ar') { # numbers, including rationals + my $offset = $cp - $list_ref->[$i]; + return $map if $map =~ /nan/i; + return $map + $offset if $offset != 0; # If needs adjustment + return eval $map; # Convert e.g., 1/2 to 0.5 + } + elsif ($format =~ /^a/) { # Some entries need adjusting + + # Linearize sequences into a string. + return join "", map { chr $_ } @$map if ref $map; # XXX && $format =~ /^ a [dl] /x; + + return "" if $map eq "" && $format =~ /^a.*e/; + + # These are all character mappings. Return the chr if no adjustment + # is needed + return chr $cp if $map eq "0"; + + # Convert special entry. + if ($map eq '' && $format eq 'ad') { + use Unicode::Normalize qw(NFD); + return NFD(chr $cp); + } + + # The rest need adjustment from the first entry in the inversion list + # corresponding to this map. + my $offset = $cp - $list_ref->[$i]; + return chr($map + $cp - $list_ref->[$i]); + } + elsif ($format eq 'n') { # The name property + + # There are two special cases, handled here. + if ($map =~ / ( .+ ) $ /x) { + $map = sprintf("$1%04X", $cp); + } + elsif ($map eq '') { + $map = charnames::viacode($cp); + } + return $map; + } + else { + croak __PACKAGE__, "::charprop: Internal error: unknown format '$format'. Please perlbug this"; + } +} + + +sub charprops_all($) { + my $input_cp = shift; + + my $cp = _getcode($input_cp); + croak __PACKAGE__, "::charprops_all: unknown code point '$input_cp'" unless defined $cp; + + my %return; + + require "unicore/UCD.pl"; + + foreach my $prop (keys %Unicode::UCD::prop_aliases) { + + # Don't return a Perl extension. (This is the only one that + # %prop_aliases has in it.) + next if $prop eq 'perldecimaldigit'; + + # Use long name for $prop in the hash + $return{scalar prop_aliases($prop)} = charprop($cp, $prop); + } + + return \%return; +} + + +my @BLOCKS; +my %BLOCKS; + +sub _charblocks { + + # Can't read from the mktables table because it loses the hyphens in the + # original. + unless (@BLOCKS) { + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version lt v2.0.0) { + my $subrange = [ 0, 0x10FFFF, 'No_Block' ]; + push @BLOCKS, $subrange; + push @{$BLOCKS{'No_Block'}}, $subrange; + } + else { + my $blocksfh = openunicode("Blocks.txt"); + local $_; + local $/ = "\n"; + while (<$blocksfh>) { + + # Old versions used a different syntax to mark the range. + $_ =~ s/;\s+/../ if $v_unicode_version lt v3.1.0; + + if (/^([0-9A-F]+)\.\.([0-9A-F]+);\s+(.+)/) { + my ($lo, $hi) = (hex($1), hex($2)); + my $subrange = [ $lo, $hi, $3 ]; + push @BLOCKS, $subrange; + push @{$BLOCKS{$3}}, $subrange; + } + } + if (! IS_ASCII_PLATFORM) { + # The first two blocks, through 0xFF, are wrong on EBCDIC + # platforms. + + my @new_blocks = _read_table("To/Blk.pl"); + + # Get rid of the first two ranges in the Unicode version, and + # replace them with the ones computed by mktables. + shift @BLOCKS; + shift @BLOCKS; + delete $BLOCKS{'Basic Latin'}; + delete $BLOCKS{'Latin-1 Supplement'}; + + # But there are multiple entries in the computed versions, and + # we change their names to (which we know) to be the old-style + # ones. + for my $i (0.. @new_blocks - 1) { + if ($new_blocks[$i][2] =~ s/Basic_Latin/Basic Latin/ + or $new_blocks[$i][2] =~ + s/Latin_1_Supplement/Latin-1 Supplement/) + { + push @{$BLOCKS{$new_blocks[$i][2]}}, $new_blocks[$i]; + } + else { + splice @new_blocks, $i; + last; + } + } + unshift @BLOCKS, @new_blocks; + } + } + } +} + +sub charblock { + my $arg = shift; + + _charblocks() unless @BLOCKS; + + my $code = _getcode($arg); + + if (defined $code) { + my $result = _search(\@BLOCKS, 0, $#BLOCKS, $code); + return $result if defined $result; + return 'No_Block'; + } + elsif (exists $BLOCKS{$arg}) { + return _dclone $BLOCKS{$arg}; + } + + carp __PACKAGE__, "::charblock: unknown code '$arg'"; + return; +} + + +my @SCRIPTS; +my %SCRIPTS; + +sub _charscripts { + unless (@SCRIPTS) { + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version lt v3.1.0) { + push @SCRIPTS, [ 0, 0x10FFFF, 'Unknown' ]; + } + else { + @SCRIPTS =_read_table("To/Sc.pl"); + } + } + foreach my $entry (@SCRIPTS) { + $entry->[2] =~ s/(_\w)/\L$1/g; # Preserve old-style casing + push @{$SCRIPTS{$entry->[2]}}, $entry; + } +} + +sub charscript { + my $arg = shift; + + _charscripts() unless @SCRIPTS; + + my $code = _getcode($arg); + + if (defined $code) { + my $result = _search(\@SCRIPTS, 0, $#SCRIPTS, $code); + return $result if defined $result; + return $utf8::SwashInfo{'ToSc'}{'missing'}; + } elsif (exists $SCRIPTS{$arg}) { + return _dclone $SCRIPTS{$arg}; + } + + carp __PACKAGE__, "::charscript: unknown code '$arg'"; + return; +} + + +sub charblocks { + _charblocks() unless %BLOCKS; + return _dclone \%BLOCKS; +} + + +sub charscripts { + _charscripts() unless %SCRIPTS; + return _dclone \%SCRIPTS; +} + + +my %GENERAL_CATEGORIES = + ( + 'L' => 'Letter', + 'LC' => 'CasedLetter', + 'Lu' => 'UppercaseLetter', + 'Ll' => 'LowercaseLetter', + 'Lt' => 'TitlecaseLetter', + 'Lm' => 'ModifierLetter', + 'Lo' => 'OtherLetter', + 'M' => 'Mark', + 'Mn' => 'NonspacingMark', + 'Mc' => 'SpacingMark', + 'Me' => 'EnclosingMark', + 'N' => 'Number', + 'Nd' => 'DecimalNumber', + 'Nl' => 'LetterNumber', + 'No' => 'OtherNumber', + 'P' => 'Punctuation', + 'Pc' => 'ConnectorPunctuation', + 'Pd' => 'DashPunctuation', + 'Ps' => 'OpenPunctuation', + 'Pe' => 'ClosePunctuation', + 'Pi' => 'InitialPunctuation', + 'Pf' => 'FinalPunctuation', + 'Po' => 'OtherPunctuation', + 'S' => 'Symbol', + 'Sm' => 'MathSymbol', + 'Sc' => 'CurrencySymbol', + 'Sk' => 'ModifierSymbol', + 'So' => 'OtherSymbol', + 'Z' => 'Separator', + 'Zs' => 'SpaceSeparator', + 'Zl' => 'LineSeparator', + 'Zp' => 'ParagraphSeparator', + 'C' => 'Other', + 'Cc' => 'Control', + 'Cf' => 'Format', + 'Cs' => 'Surrogate', + 'Co' => 'PrivateUse', + 'Cn' => 'Unassigned', + ); + +sub general_categories { + return _dclone \%GENERAL_CATEGORIES; +} + + +my %BIDI_TYPES = + ( + 'L' => 'Left-to-Right', + 'LRE' => 'Left-to-Right Embedding', + 'LRO' => 'Left-to-Right Override', + 'R' => 'Right-to-Left', + 'AL' => 'Right-to-Left Arabic', + 'RLE' => 'Right-to-Left Embedding', + 'RLO' => 'Right-to-Left Override', + 'PDF' => 'Pop Directional Format', + 'EN' => 'European Number', + 'ES' => 'European Number Separator', + 'ET' => 'European Number Terminator', + 'AN' => 'Arabic Number', + 'CS' => 'Common Number Separator', + 'NSM' => 'Non-Spacing Mark', + 'BN' => 'Boundary Neutral', + 'B' => 'Paragraph Separator', + 'S' => 'Segment Separator', + 'WS' => 'Whitespace', + 'ON' => 'Other Neutrals', + ); + + +sub bidi_types { + return _dclone \%BIDI_TYPES; +} + + +# Eval'd so can run on versions earlier than the property is available in +my $Composition_Exclusion_re = eval 'qr/\p{Composition_Exclusion}/'; + +sub compexcl { + my $arg = shift; + my $code = _getcode($arg); + croak __PACKAGE__, "::compexcl: unknown code '$arg'" + unless defined $code; + + UnicodeVersion() unless defined $v_unicode_version; + return if $v_unicode_version lt v3.0.0; + + no warnings "non_unicode"; # So works on non-Unicode code points + return chr($code) =~ $Composition_Exclusion_re +} + + +my %CASEFOLD; + +sub _casefold { + unless (%CASEFOLD) { # Populate the hash + my ($full_invlist_ref, $full_invmap_ref, undef, $default) + = prop_invmap('Case_Folding'); + + # Use the recipe given in the prop_invmap() pod to convert the + # inversion map into the hash. + for my $i (0 .. @$full_invlist_ref - 1 - 1) { + next if $full_invmap_ref->[$i] == $default; + my $adjust = -1; + for my $j ($full_invlist_ref->[$i] .. $full_invlist_ref->[$i+1] -1) { + $adjust++; + if (! ref $full_invmap_ref->[$i]) { + + # This is a single character mapping + $CASEFOLD{$j}{'status'} = 'C'; + $CASEFOLD{$j}{'simple'} + = $CASEFOLD{$j}{'full'} + = $CASEFOLD{$j}{'mapping'} + = sprintf("%04X", $full_invmap_ref->[$i] + $adjust); + $CASEFOLD{$j}{'code'} = sprintf("%04X", $j); + $CASEFOLD{$j}{'turkic'} = ""; + } + else { # prop_invmap ensures that $adjust is 0 for a ref + $CASEFOLD{$j}{'status'} = 'F'; + $CASEFOLD{$j}{'full'} + = $CASEFOLD{$j}{'mapping'} + = join " ", map { sprintf "%04X", $_ } + @{$full_invmap_ref->[$i]}; + $CASEFOLD{$j}{'simple'} = ""; + $CASEFOLD{$j}{'code'} = sprintf("%04X", $j); + $CASEFOLD{$j}{'turkic'} = ""; + } + } + } + + # We have filled in the full mappings above, assuming there were no + # simple ones for the ones with multi-character maps. Now, we find + # and fix the cases where that assumption was false. + (my ($simple_invlist_ref, $simple_invmap_ref, undef), $default) + = prop_invmap('Simple_Case_Folding'); + for my $i (0 .. @$simple_invlist_ref - 1 - 1) { + next if $simple_invmap_ref->[$i] == $default; + my $adjust = -1; + for my $j ($simple_invlist_ref->[$i] + .. $simple_invlist_ref->[$i+1] -1) + { + $adjust++; + next if $CASEFOLD{$j}{'status'} eq 'C'; + $CASEFOLD{$j}{'status'} = 'S'; + $CASEFOLD{$j}{'simple'} + = $CASEFOLD{$j}{'mapping'} + = sprintf("%04X", $simple_invmap_ref->[$i] + $adjust); + $CASEFOLD{$j}{'code'} = sprintf("%04X", $j); + $CASEFOLD{$j}{'turkic'} = ""; + } + } + + # We hard-code in the turkish rules + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version ge v3.2.0) { + + # These two code points should already have regular entries, so + # just fill in the turkish fields + $CASEFOLD{ord('I')}{'turkic'} = '0131'; + $CASEFOLD{0x130}{'turkic'} = sprintf "%04X", ord('i'); + } + elsif ($v_unicode_version ge v3.1.0) { + + # These two code points don't have entries otherwise. + $CASEFOLD{0x130}{'code'} = '0130'; + $CASEFOLD{0x131}{'code'} = '0131'; + $CASEFOLD{0x130}{'status'} = $CASEFOLD{0x131}{'status'} = 'I'; + $CASEFOLD{0x130}{'turkic'} + = $CASEFOLD{0x130}{'mapping'} + = $CASEFOLD{0x130}{'full'} + = $CASEFOLD{0x130}{'simple'} + = $CASEFOLD{0x131}{'turkic'} + = $CASEFOLD{0x131}{'mapping'} + = $CASEFOLD{0x131}{'full'} + = $CASEFOLD{0x131}{'simple'} + = sprintf "%04X", ord('i'); + } + } +} + +sub casefold { + my $arg = shift; + my $code = _getcode($arg); + croak __PACKAGE__, "::casefold: unknown code '$arg'" + unless defined $code; + + _casefold() unless %CASEFOLD; + + return $CASEFOLD{$code}; +} + + +sub all_casefolds () { + _casefold() unless %CASEFOLD; + return _dclone \%CASEFOLD; +} + + +my %CASESPEC; + +sub _casespec { + unless (%CASESPEC) { + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version ge v2.1.8) { + my $casespecfh = openunicode("SpecialCasing.txt"); + local $_; + local $/ = "\n"; + while (<$casespecfh>) { + if (/^([0-9A-F]+); ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; ([0-9A-F]+(?: [0-9A-F]+)*)?; (\w+(?: \w+)*)?/) { + + my ($hexcode, $lower, $title, $upper, $condition) = + ($1, $2, $3, $4, $5); + if (! IS_ASCII_PLATFORM) { # Remap entry to native + foreach my $var_ref (\$hexcode, + \$lower, + \$title, + \$upper) + { + next unless defined $$var_ref; + $$var_ref = join " ", + map { sprintf("%04X", + utf8::unicode_to_native(hex $_)) } + split " ", $$var_ref; + } + } + + my $code = hex($hexcode); + + # In 2.1.8, there were duplicate entries; ignore all but + # the first one -- there were no conditions in the file + # anyway. + if (exists $CASESPEC{$code} && $v_unicode_version ne v2.1.8) + { + if (exists $CASESPEC{$code}->{code}) { + my ($oldlower, + $oldtitle, + $oldupper, + $oldcondition) = + @{$CASESPEC{$code}}{qw(lower + title + upper + condition)}; + if (defined $oldcondition) { + my ($oldlocale) = + ($oldcondition =~ /^([a-z][a-z](?:_\S+)?)/); + delete $CASESPEC{$code}; + $CASESPEC{$code}->{$oldlocale} = + { code => $hexcode, + lower => $oldlower, + title => $oldtitle, + upper => $oldupper, + condition => $oldcondition }; + } + } + my ($locale) = + ($condition =~ /^([a-z][a-z](?:_\S+)?)/); + $CASESPEC{$code}->{$locale} = + { code => $hexcode, + lower => $lower, + title => $title, + upper => $upper, + condition => $condition }; + } else { + $CASESPEC{$code} = + { code => $hexcode, + lower => $lower, + title => $title, + upper => $upper, + condition => $condition }; + } + } + } + } + } +} + +sub casespec { + my $arg = shift; + my $code = _getcode($arg); + croak __PACKAGE__, "::casespec: unknown code '$arg'" + unless defined $code; + + _casespec() unless %CASESPEC; + + return ref $CASESPEC{$code} ? _dclone $CASESPEC{$code} : $CASESPEC{$code}; +} + + +my %NAMEDSEQ; + +sub _namedseq { + unless (%NAMEDSEQ) { + my $namedseqfh = openunicode("Name.pl"); + local $_; + local $/ = "\n"; + while (<$namedseqfh>) { + if (/^ [0-9A-F]+ \ /x) { + chomp; + my ($sequence, $name) = split /\t/; + my @s = map { chr(hex($_)) } split(' ', $sequence); + $NAMEDSEQ{$name} = join("", @s); + } + } + } +} + +sub namedseq { + + # Use charnames::string_vianame() which now returns this information, + # unless the caller wants the hash returned, in which case we read it in, + # and thereafter use it instead of calling charnames, as it is faster. + + my $wantarray = wantarray(); + if (defined $wantarray) { + if ($wantarray) { + if (@_ == 0) { + _namedseq() unless %NAMEDSEQ; + return %NAMEDSEQ; + } elsif (@_ == 1) { + my $s; + if (%NAMEDSEQ) { + $s = $NAMEDSEQ{ $_[0] }; + } + else { + $s = charnames::string_vianame($_[0]); + } + return defined $s ? map { ord($_) } split('', $s) : (); + } + } elsif (@_ == 1) { + return $NAMEDSEQ{ $_[0] } if %NAMEDSEQ; + return charnames::string_vianame($_[0]); + } + } + return; +} + +my %NUMERIC; + +sub _numeric { + my @numbers = _read_table("To/Nv.pl"); + foreach my $entry (@numbers) { + my ($start, $end, $value) = @$entry; + + # If value contains a slash, convert to decimal, add a reverse hash + # used by charinfo. + if ((my @rational = split /\//, $value) == 2) { + my $real = $rational[0] / $rational[1]; + $real_to_rational{$real} = $value; + $value = $real; + + # Should only be single element, but just in case... + for my $i ($start .. $end) { + $NUMERIC{$i} = $value; + } + } + else { + # The values require adjusting, as is in 'a' format + for my $i ($start .. $end) { + $NUMERIC{$i} = $value + $i - $start; + } + } + } + + # Decided unsafe to use these that aren't officially part of the Unicode + # standard. + #use Math::Trig; + #my $pi = acos(-1.0); + #$NUMERIC{0x03C0} = $pi; + + # Euler's constant, not to be confused with Euler's number + #$NUMERIC{0x2107} = 0.57721566490153286060651209008240243104215933593992; + + # Euler's number + #$NUMERIC{0x212F} = 2.7182818284590452353602874713526624977572; + + return; +} + + +#A few characters to which Unicode doesn't officially +#assign a numeric value are considered numeric by C. +#These are: + +# EULER CONSTANT 0.5772... (this is NOT Euler's number) +# SCRIPT SMALL E 2.71828... (this IS Euler's number) +# GREEK SMALL LETTER PI 3.14159... + + +# To handle sub, superscripts, this could if called in list context, +# consider those, and return the type in the second +# array element. + +sub num ($;$) { + my ($string, $retlen_ref) = @_; + + use feature 'unicode_strings'; + + _numeric unless %NUMERIC; + $$retlen_ref = 0 if $retlen_ref; # Assume will fail + + my $length = length $string; + return if $length == 0; + + my $first_ord = ord(substr($string, 0, 1)); + return if ! exists $NUMERIC{$first_ord} + || ! defined $NUMERIC{$first_ord}; + + # Here, we know the first character is numeric + my $value = $NUMERIC{$first_ord}; + $$retlen_ref = 1 if $retlen_ref; # Assume only this one is numeric + + return $value if $length == 1; + + # Here, the input is longer than a single character. To be valid, it must + # be entirely decimal digits, which means it must start with one. + return if $string =~ / ^ \D /x; + + # To be a valid decimal number, it should be in a block of 10 consecutive + # characters, whose values are 0, 1, 2, ... 9. Therefore this digit's + # value is its offset in that block from the character that means zero. + my $zero_ord = $first_ord - $value; + + # Unicode 6.0 instituted the rule that only digits in a consecutive + # block of 10 would be considered decimal digits. If this is an earlier + # release, we verify that this first character is a member of such a + # block. That is, that the block of characters surrounding this one + # consists of all \d characters whose numeric values are the expected + # ones. If not, then this single character is numeric, but the string as + # a whole is not considered to be. + UnicodeVersion() unless defined $v_unicode_version; + if ($v_unicode_version lt v6.0.0) { + for my $i (0 .. 9) { + my $ord = $zero_ord + $i; + return unless chr($ord) =~ /\d/; + my $numeric = $NUMERIC{$ord}; + return unless defined $numeric; + return unless $numeric == $i; + } + } + + for my $i (1 .. $length -1) { + + # Here we know either by verifying, or by fact of the first character + # being a \d in Unicode 6.0 or later, that any character between the + # character that means 0, and 9 positions above it must be \d, and + # must have its value correspond to its offset from the zero. Any + # characters outside these 10 do not form a legal number for this + # function. + my $ord = ord(substr($string, $i, 1)); + my $digit = $ord - $zero_ord; + if ($digit < 0 || $digit > 9) { + $$retlen_ref = $i if $retlen_ref; + return; + } + $value = $value * 10 + $digit; + } + + $$retlen_ref = $length if $retlen_ref; + return $value; +} + + +# It may be that there are use cases where the discouraged forms should be +# returned. If that comes up, an optional boolean second parameter to the +# function could be created, for example. + +# These are created by mktables for this routine and stored in unicore/UCD.pl +# where their structures are described. +our %string_property_loose_to_name; +our %ambiguous_names; +our %loose_perlprop_to_name; +our %prop_aliases; + +sub prop_aliases ($) { + my $prop = $_[0]; + return unless defined $prop; + + require "unicore/UCD.pl"; + require "unicore/Heavy.pl"; + require "utf8_heavy.pl"; + + # The property name may be loosely or strictly matched; we don't know yet. + # But both types use lower-case. + $prop = lc $prop; + + # It is loosely matched if its lower case isn't known to be strict. + my $list_ref; + if (! exists $utf8::stricter_to_file_of{$prop}) { + my $loose = utf8::_loose_name($prop); + + # There is a hash that converts from any loose name to its standard + # form, mapping all synonyms for a name to one name that can be used + # as a key into another hash. The whole concept is for memory + # savings, as the second hash doesn't have to have all the + # combinations. Actually, there are two hashes that do the + # converstion. One is used in utf8_heavy.pl (stored in Heavy.pl) for + # looking up properties matchable in regexes. This function needs to + # access string properties, which aren't available in regexes, so a + # second conversion hash is made for them (stored in UCD.pl). Look in + # the string one now, as the rest can have an optional 'is' prefix, + # which these don't. + if (exists $string_property_loose_to_name{$loose}) { + + # Convert to its standard loose name. + $prop = $string_property_loose_to_name{$loose}; + } + else { + my $retrying = 0; # bool. ? Has an initial 'is' been stripped + RETRY: + if (exists $utf8::loose_property_name_of{$loose} + && (! $retrying + || ! exists $ambiguous_names{$loose})) + { + # Found an entry giving the standard form. We don't get here + # (in the test above) when we've stripped off an + # 'is' and the result is an ambiguous name. That is because + # these are official Unicode properties (though Perl can have + # an optional 'is' prefix meaning the official property), and + # all ambiguous cases involve a Perl single-form extension + # for the gc, script, or block properties, and the stripped + # 'is' means that they mean one of those, and not one of + # these + $prop = $utf8::loose_property_name_of{$loose}; + } + elsif (exists $loose_perlprop_to_name{$loose}) { + + # This hash is specifically for this function to list Perl + # extensions that aren't in the earlier hashes. If there is + # only one element, the short and long names are identical. + # Otherwise the form is already in the same form as + # %prop_aliases, which is handled at the end of the function. + $list_ref = $loose_perlprop_to_name{$loose}; + if (@$list_ref == 1) { + my @list = ($list_ref->[0], $list_ref->[0]); + $list_ref = \@list; + } + } + elsif (! exists $utf8::loose_to_file_of{$loose}) { + + # loose_to_file_of is a complete list of loose names. If not + # there, the input is unknown. + return; + } + elsif ($loose =~ / [:=] /x) { + + # Here we found the name but not its aliases, so it has to + # exist. Exclude property-value combinations. (This shows up + # for something like ccc=vr which matches loosely, but is a + # synonym for ccc=9 which matches only strictly. + return; + } + else { + + # Here it has to exist, and isn't a property-value + # combination. This means it must be one of the Perl + # single-form extensions. First see if it is for a + # property-value combination in one of the following + # properties. + my @list; + foreach my $property ("gc", "script") { + @list = prop_value_aliases($property, $loose); + last if @list; + } + if (@list) { + + # Here, it is one of those property-value combination + # single-form synonyms. There are ambiguities with some + # of these. Check against the list for these, and adjust + # if necessary. + for my $i (0 .. @list -1) { + if (exists $ambiguous_names + {utf8::_loose_name(lc $list[$i])}) + { + # The ambiguity is resolved by toggling whether or + # not it has an 'is' prefix + $list[$i] =~ s/^Is_// or $list[$i] =~ s/^/Is_/; + } + } + return @list; + } + + # Here, it wasn't one of the gc or script single-form + # extensions. It could be a block property single-form + # extension. An 'in' prefix definitely means that, and should + # be looked up without the prefix. However, starting in + # Unicode 6.1, we have to special case 'indic...', as there + # is a property that begins with that name. We shouldn't + # strip the 'in' from that. I'm (khw) generalizing this to + # 'indic' instead of the single property, because I suspect + # that others of this class may come along in the future. + # However, this could backfire and a block created whose name + # begins with 'dic...', and we would want to strip the 'in'. + # At which point this would have to be tweaked. + my $began_with_in = $loose =~ s/^in(?!dic)//; + @list = prop_value_aliases("block", $loose); + if (@list) { + map { $_ =~ s/^/In_/ } @list; + return @list; + } + + # Here still haven't found it. The last opportunity for it + # being valid is only if it began with 'is'. We retry without + # the 'is', setting a flag to that effect so that we don't + # accept things that begin with 'isis...' + if (! $retrying && ! $began_with_in && $loose =~ s/^is//) { + $retrying = 1; + goto RETRY; + } + + # Here, didn't find it. Since it was in %loose_to_file_of, we + # should have been able to find it. + carp __PACKAGE__, "::prop_aliases: Unexpectedly could not find '$prop'. Send bug report to perlbug\@perl.org"; + return; + } + } + } + + if (! $list_ref) { + # Here, we have set $prop to a standard form name of the input. Look + # it up in the structure created by mktables for this purpose, which + # contains both strict and loosely matched properties. Avoid + # autovivifying. + $list_ref = $prop_aliases{$prop} if exists $prop_aliases{$prop}; + return unless $list_ref; + } + + # The full name is in element 1. + return $list_ref->[1] unless wantarray; + + return @{_dclone $list_ref}; +} + + +# These are created by mktables for this module and stored in unicore/UCD.pl +# where their structures are described. +our %loose_to_standard_value; +our %prop_value_aliases; + +sub prop_values ($) { + my $prop = shift; + return undef unless defined $prop; + + require "unicore/UCD.pl"; + require "utf8_heavy.pl"; + + # Find the property name synonym that's used as the key in other hashes, + # which is element 0 in the returned list. + ($prop) = prop_aliases($prop); + return undef if ! $prop; + $prop = utf8::_loose_name(lc $prop); + + # Here is a legal property. + return undef unless exists $prop_value_aliases{$prop}; + my @return; + foreach my $value_key (sort { lc $a cmp lc $b } + keys %{$prop_value_aliases{$prop}}) + { + push @return, $prop_value_aliases{$prop}{$value_key}[0]; + } + return @return; +} + + +sub prop_value_aliases ($$) { + my ($prop, $value) = @_; + return unless defined $prop && defined $value; + + require "unicore/UCD.pl"; + require "utf8_heavy.pl"; + + # Find the property name synonym that's used as the key in other hashes, + # which is element 0 in the returned list. + ($prop) = prop_aliases($prop); + return if ! $prop; + $prop = utf8::_loose_name(lc $prop); + + # Here is a legal property, but the hash below (created by mktables for + # this purpose) only knows about the properties that have a very finite + # number of potential values, that is not ones whose value could be + # anything, like most (if not all) string properties. These don't have + # synonyms anyway. Simply return the input. For example, there is no + # synonym for ('Uppercase_Mapping', A'). + if (! exists $prop_value_aliases{$prop}) { + + # Here, we have a legal property, but an unknown value. Since the + # property is legal, if it isn't in the prop_aliases hash, it must be + # a Perl-extension All perl extensions are binary, hence are + # enumerateds, which means that we know that the input unknown value + # is illegal. + return if ! exists $Unicode::UCD::prop_aliases{$prop}; + + # Otherwise, we assume it's valid, as documented. + return $value; + } + + # The value name may be loosely or strictly matched; we don't know yet. + # But both types use lower-case. + $value = lc $value; + + # If the name isn't found under loose matching, it certainly won't be + # found under strict + my $loose_value = utf8::_loose_name($value); + return unless exists $loose_to_standard_value{"$prop=$loose_value"}; + + # Similarly if the combination under loose matching doesn't exist, it + # won't exist under strict. + my $standard_value = $loose_to_standard_value{"$prop=$loose_value"}; + return unless exists $prop_value_aliases{$prop}{$standard_value}; + + # Here we did find a combination under loose matching rules. But it could + # be that is a strict property match that shouldn't have matched. + # %prop_value_aliases is set up so that the strict matches will appear as + # if they were in loose form. Thus, if the non-loose version is legal, + # we're ok, can skip the further check. + if (! exists $utf8::stricter_to_file_of{"$prop=$value"} + + # We're also ok and skip the further check if value loosely matches. + # mktables has verified that no strict name under loose rules maps to + # an existing loose name. This code relies on the very limited + # circumstances that strict names can be here. Strict name matching + # happens under two conditions: + # 1) when the name begins with an underscore. But this function + # doesn't accept those, and %prop_value_aliases doesn't have + # them. + # 2) When the values are numeric, in which case we need to look + # further, but their squeezed-out loose values will be in + # %stricter_to_file_of + && exists $utf8::stricter_to_file_of{"$prop=$loose_value"}) + { + # The only thing that's legal loosely under strict is that can have an + # underscore between digit pairs XXX + while ($value =~ s/(\d)_(\d)/$1$2/g) {} + return unless exists $utf8::stricter_to_file_of{"$prop=$value"}; + } + + # Here, we know that the combination exists. Return it. + my $list_ref = $prop_value_aliases{$prop}{$standard_value}; + if (@$list_ref > 1) { + # The full name is in element 1. + return $list_ref->[1] unless wantarray; + + return @{_dclone $list_ref}; + } + + return $list_ref->[0] unless wantarray; + + # Only 1 element means that it repeats + return ( $list_ref->[0], $list_ref->[0] ); +} + +# All 1 bits but the top one is the largest possible IV. +$Unicode::UCD::MAX_CP = (~0) >> 1; + + +# User-defined properties could be handled with some changes to utf8_heavy.pl; +# and implementing here of dealing with EXTRAS. If done, consideration should +# be given to the fact that the user subroutine could return different results +# with each call; security issues need to be thought about. + +# These are created by mktables for this routine and stored in unicore/UCD.pl +# where their structures are described. +our %loose_defaults; +our $MAX_UNICODE_CODEPOINT; + +sub prop_invlist ($;$) { + my $prop = $_[0]; + + # Undocumented way to get at Perl internal properties; it may be changed + # or removed without notice at any time. + my $internal_ok = defined $_[1] && $_[1] eq '_perl_core_internal_ok'; + + return if ! defined $prop; + + require "utf8_heavy.pl"; + + # Warnings for these are only for regexes, so not applicable to us + no warnings 'deprecated'; + + # Get the swash definition of the property-value. + my $swash = utf8::SWASHNEW(__PACKAGE__, $prop, undef, 1, 0); + + # Fail if not found, or isn't a boolean property-value, or is a + # user-defined property, or is internal-only. + return if ! $swash + || ref $swash eq "" + || $swash->{'BITS'} != 1 + || $swash->{'USER_DEFINED'} + || (! $internal_ok && $prop =~ /^\s*_/); + + if ($swash->{'EXTRAS'}) { + carp __PACKAGE__, "::prop_invlist: swash returned for $prop unexpectedly has EXTRAS magic"; + return; + } + if ($swash->{'SPECIALS'}) { + carp __PACKAGE__, "::prop_invlist: swash returned for $prop unexpectedly has SPECIALS magic"; + return; + } + + my @invlist; + + if ($swash->{'LIST'} =~ /^V/) { + + # A 'V' as the first character marks the input as already an inversion + # list, in which case, all we need to do is put the remaining lines + # into our array. + @invlist = split "\n", $swash->{'LIST'} =~ s/ \s* (?: \# .* )? $ //xmgr; + shift @invlist; + } + else { + # The input lines look like: + # 0041\t005A # [26] + # 005F + + # Split into lines, stripped of trailing comments + foreach my $range (split "\n", + $swash->{'LIST'} =~ s/ \s* (?: \# .* )? $ //xmgr) + { + # And find the beginning and end of the range on the line + my ($hex_begin, $hex_end) = split "\t", $range; + my $begin = hex $hex_begin; + + # If the new range merely extends the old, we remove the marker + # created the last time through the loop for the old's end, which + # causes the new one's end to be used instead. + if (@invlist && $begin == $invlist[-1]) { + pop @invlist; + } + else { + # Add the beginning of the range + push @invlist, $begin; + } + + if (defined $hex_end) { # The next item starts with the code point 1 + # beyond the end of the range. + no warnings 'portable'; + my $end = hex $hex_end; + last if $end == $Unicode::UCD::MAX_CP; + push @invlist, $end + 1; + } + else { # No end of range, is a single code point. + push @invlist, $begin + 1; + } + } + } + + # Could need to be inverted: add or subtract a 0 at the beginning of the + # list. + if ($swash->{'INVERT_IT'}) { + if (@invlist && $invlist[0] == 0) { + shift @invlist; + } + else { + unshift @invlist, 0; + } + } + + return @invlist; +} + + +# User-defined properties could be handled with some changes to utf8_heavy.pl; +# if done, consideration should be given to the fact that the user subroutine +# could return different results with each call, which could lead to some +# security issues. + +# One could store things in memory so they don't have to be recalculated, but +# it is unlikely this will be called often, and some properties would take up +# significant memory. + +# These are created by mktables for this routine and stored in unicore/UCD.pl +# where their structures are described. +our @algorithmic_named_code_points; +our $HANGUL_BEGIN; +our $HANGUL_COUNT; + +sub prop_invmap ($;$) { + + croak __PACKAGE__, "::prop_invmap: must be called in list context" unless wantarray; + + my $prop = $_[0]; + return unless defined $prop; + + # Undocumented way to get at Perl internal properties; it may be changed + # or removed without notice at any time. It currently also changes the + # output to use the format specified in the file rather than the one we + # normally compute and return + my $internal_ok = defined $_[1] && $_[1] eq '_perl_core_internal_ok'; + + # Fail internal properties + return if $prop =~ /^_/ && ! $internal_ok; + + # The values returned by this function. + my (@invlist, @invmap, $format, $missing); + + # The swash has two components we look at, the base list, and a hash, + # named 'SPECIALS', containing any additional members whose mappings don't + # fit into the base list scheme of things. These generally 'override' + # any value in the base list for the same code point. + my $overrides; + + require "utf8_heavy.pl"; + require "unicore/UCD.pl"; + +RETRY: + + # If there are multiple entries for a single code point + my $has_multiples = 0; + + # Try to get the map swash for the property. They have 'To' prepended to + # the property name, and 32 means we will accept 32 bit return values. + # The 0 means we aren't calling this from tr///. + my $swash = utf8::SWASHNEW(__PACKAGE__, "To$prop", undef, 32, 0); + + # If didn't find it, could be because needs a proxy. And if was the + # 'Block' or 'Name' property, use a proxy even if did find it. Finding it + # in these cases would be the result of the installation changing mktables + # to output the Block or Name tables. The Block table gives block names + # in the new-style, and this routine is supposed to return old-style block + # names. The Name table is valid, but we need to execute the special code + # below to add in the algorithmic-defined name entries. + # And NFKCCF needs conversion, so handle that here too. + if (ref $swash eq "" + || $swash->{'TYPE'} =~ / ^ To (?: Blk | Na | NFKCCF ) $ /x) + { + + # Get the short name of the input property, in standard form + my ($second_try) = prop_aliases($prop); + return unless $second_try; + $second_try = utf8::_loose_name(lc $second_try); + + if ($second_try eq "in") { + + # This property is identical to age for inversion map purposes + $prop = "age"; + goto RETRY; + } + elsif ($second_try =~ / ^ s ( cf | fc | [ltu] c ) $ /x) { + + # These properties use just the LIST part of the full mapping, + # which includes the simple maps that are otherwise overridden by + # the SPECIALS. So all we need do is to not look at the SPECIALS; + # set $overrides to indicate that + $overrides = -1; + + # The full name is the simple name stripped of its initial 's' + $prop = $1; + + # .. except for this case + $prop = 'cf' if $prop eq 'fc'; + + goto RETRY; + } + elsif ($second_try eq "blk") { + + # We use the old block names. Just create a fake swash from its + # data. + _charblocks(); + my %blocks; + $blocks{'LIST'} = ""; + $blocks{'TYPE'} = "ToBlk"; + $utf8::SwashInfo{ToBlk}{'missing'} = "No_Block"; + $utf8::SwashInfo{ToBlk}{'format'} = "s"; + + foreach my $block (@BLOCKS) { + $blocks{'LIST'} .= sprintf "%x\t%x\t%s\n", + $block->[0], + $block->[1], + $block->[2]; + } + $swash = \%blocks; + } + elsif ($second_try eq "na") { + + # Use the combo file that has all the Name-type properties in it, + # extracting just the ones that are for the actual 'Name' + # property. And create a fake swash from it. + my %names; + $names{'LIST'} = ""; + my $original = do "unicore/Name.pl"; + my $algorithm_names = \@algorithmic_named_code_points; + + # We need to remove the names from it that are aliases. For that + # we need to also read in that table. Create a hash with the keys + # being the code points, and the values being a list of the + # aliases for the code point key. + my ($aliases_code_points, $aliases_maps, undef, undef) + = &prop_invmap("_Perl_Name_Alias", '_perl_core_internal_ok'); + my %aliases; + for (my $i = 0; $i < @$aliases_code_points; $i++) { + my $code_point = $aliases_code_points->[$i]; + $aliases{$code_point} = $aliases_maps->[$i]; + + # If not already a list, make it into one, so that later we + # can treat things uniformly + if (! ref $aliases{$code_point}) { + $aliases{$code_point} = [ $aliases{$code_point} ]; + } + + # Remove the alias type from the entry, retaining just the + # name. + map { s/:.*// } @{$aliases{$code_point}}; + } + + my $i = 0; + foreach my $line (split "\n", $original) { + my ($hex_code_point, $name) = split "\t", $line; + + # Weeds out all comments, blank lines, and named sequences + next if $hex_code_point =~ /[^[:xdigit:]]/a; + + my $code_point = hex $hex_code_point; + + # The name of all controls is the default: the empty string. + # The set of controls is immutable + next if chr($code_point) =~ /[[:cntrl:]]/u; + + # If this is a name_alias, it isn't a name + next if grep { $_ eq $name } @{$aliases{$code_point}}; + + # If we are beyond where one of the special lines needs to + # be inserted ... + while ($i < @$algorithm_names + && $code_point > $algorithm_names->[$i]->{'low'}) + { + + # ... then insert it, ahead of what we were about to + # output + $names{'LIST'} .= sprintf "%x\t%x\t%s\n", + $algorithm_names->[$i]->{'low'}, + $algorithm_names->[$i]->{'high'}, + $algorithm_names->[$i]->{'name'}; + + # Done with this range. + $i++; + + # We loop until all special lines that precede the next + # regular one are output. + } + + # Here, is a normal name. + $names{'LIST'} .= sprintf "%x\t\t%s\n", $code_point, $name; + } # End of loop through all the names + + $names{'TYPE'} = "ToNa"; + $utf8::SwashInfo{ToNa}{'missing'} = ""; + $utf8::SwashInfo{ToNa}{'format'} = "n"; + $swash = \%names; + } + elsif ($second_try =~ / ^ ( d [mt] ) $ /x) { + + # The file is a combination of dt and dm properties. Create a + # fake swash from the portion that we want. + my $original = do "unicore/Decomposition.pl"; + my %decomps; + + if ($second_try eq 'dt') { + $decomps{'TYPE'} = "ToDt"; + $utf8::SwashInfo{'ToDt'}{'missing'} = "None"; + $utf8::SwashInfo{'ToDt'}{'format'} = "s"; + } # 'dm' is handled below, with 'nfkccf' + + $decomps{'LIST'} = ""; + + # This property has one special range not in the file: for the + # hangul syllables. But not in Unicode version 1. + UnicodeVersion() unless defined $v_unicode_version; + my $done_hangul = ($v_unicode_version lt v2.0.0) + ? 1 + : 0; # Have we done the hangul range ? + foreach my $line (split "\n", $original) { + my ($hex_lower, $hex_upper, $type_and_map) = split "\t", $line; + my $code_point = hex $hex_lower; + my $value; + my $redo = 0; + + # The type, enclosed in <...>, precedes the mapping separated + # by blanks + if ($type_and_map =~ / ^ < ( .* ) > \s+ (.*) $ /x) { + $value = ($second_try eq 'dt') ? $1 : $2 + } + else { # If there is no type specified, it's canonical + $value = ($second_try eq 'dt') + ? "Canonical" : + $type_and_map; + } + + # Insert the hangul range at the appropriate spot. + if (! $done_hangul && $code_point > $HANGUL_BEGIN) { + $done_hangul = 1; + $decomps{'LIST'} .= + sprintf "%x\t%x\t%s\n", + $HANGUL_BEGIN, + $HANGUL_BEGIN + $HANGUL_COUNT - 1, + ($second_try eq 'dt') + ? "Canonical" + : ""; + } + + if ($value =~ / / && $hex_upper ne "" && $hex_upper ne $hex_lower) { + $line = sprintf("%04X\t%s\t%s", hex($hex_lower) + 1, $hex_upper, $value); + $hex_upper = ""; + $redo = 1; + } + + # And append this to our constructed LIST. + $decomps{'LIST'} .= "$hex_lower\t$hex_upper\t$value\n"; + + redo if $redo; + } + $swash = \%decomps; + } + elsif ($second_try ne 'nfkccf') { # Don't know this property. Fail. + return; + } + + if ($second_try eq 'nfkccf' || $second_try eq 'dm') { + + # The 'nfkccf' property is stored in the old format for backwards + # compatibility for any applications that has read its file + # directly before prop_invmap() existed. + # And the code above has extracted the 'dm' property from its file + # yielding the same format. So here we convert them to adjusted + # format for compatibility with the other properties similar to + # them. + my %revised_swash; + + # We construct a new converted list. + my $list = ""; + + my @ranges = split "\n", $swash->{'LIST'}; + for (my $i = 0; $i < @ranges; $i++) { + my ($hex_begin, $hex_end, $map) = split "\t", $ranges[$i]; + + # The dm property has maps that are space separated sequences + # of code points, as well as the special entry ", which also contains a blank. + my @map = split " ", $map; + if (@map > 1) { + + # If it's just the special entry, append as-is. + if ($map eq '') { + $list .= "$ranges[$i]\n"; + } + else { + + # These should all be single-element ranges. + croak __PACKAGE__, "::prop_invmap: Not expecting a mapping with multiple code points in a multi-element range, $ranges[$i]" if $hex_end ne "" && $hex_end ne $hex_begin; + + # Convert them to decimal, as that's what's expected. + $list .= "$hex_begin\t\t" + . join(" ", map { hex } @map) + . "\n"; + } + next; + } + + # Here, the mapping doesn't have a blank, is for a single code + # point. + my $begin = hex $hex_begin; + my $end = (defined $hex_end && $hex_end ne "") + ? hex $hex_end + : $begin; + + # Again, the output is to be in decimal. + my $decimal_map = hex $map; + + # We know that multi-element ranges with the same mapping + # should not be adjusted, as after the adjustment + # multi-element ranges are for consecutive increasing code + # points. Further, the final element in the list won't be + # adjusted, as there is nothing after it to include in the + # adjustment + if ($begin != $end || $i == @ranges -1) { + + # So just convert these to single-element ranges + foreach my $code_point ($begin .. $end) { + $list .= sprintf("%04X\t\t%d\n", + $code_point, $decimal_map); + } + } + else { + + # Here, we have a candidate for adjusting. What we do is + # look through the subsequent adjacent elements in the + # input. If the map to the next one differs by 1 from the + # one before, then we combine into a larger range with the + # initial map. Loop doing this until we find one that + # can't be combined. + + my $offset = 0; # How far away are we from the initial + # map + my $squished = 0; # ? Did we squish at least two + # elements together into one range + for ( ; $i < @ranges; $i++) { + my ($next_hex_begin, $next_hex_end, $next_map) + = split "\t", $ranges[$i+1]; + + # In the case of 'dm', the map may be a sequence of + # multiple code points, which are never combined with + # another range + last if $next_map =~ / /; + + $offset++; + my $next_decimal_map = hex $next_map; + + # If the next map is not next in sequence, it + # shouldn't be combined. + last if $next_decimal_map != $decimal_map + $offset; + + my $next_begin = hex $next_hex_begin; + + # Likewise, if the next element isn't adjacent to the + # previous one, it shouldn't be combined. + last if $next_begin != $begin + $offset; + + my $next_end = (defined $next_hex_end + && $next_hex_end ne "") + ? hex $next_hex_end + : $next_begin; + + # And finally, if the next element is a multi-element + # range, it shouldn't be combined. + last if $next_end != $next_begin; + + # Here, we will combine. Loop to see if we should + # combine the next element too. + $squished = 1; + } + + if ($squished) { + + # Here, 'i' is the element number of the last element to + # be combined, and the range is single-element, or we + # wouldn't be combining. Get it's code point. + my ($hex_end, undef, undef) = split "\t", $ranges[$i]; + $list .= "$hex_begin\t$hex_end\t$decimal_map\n"; + } else { + + # Here, no combining done. Just append the initial + # (and current) values. + $list .= "$hex_begin\t\t$decimal_map\n"; + } + } + } # End of loop constructing the converted list + + # Finish up the data structure for our converted swash + my $type = ($second_try eq 'nfkccf') ? 'ToNFKCCF' : 'ToDm'; + $revised_swash{'LIST'} = $list; + $revised_swash{'TYPE'} = $type; + $revised_swash{'SPECIALS'} = $swash->{'SPECIALS'}; + $swash = \%revised_swash; + + $utf8::SwashInfo{$type}{'missing'} = 0; + $utf8::SwashInfo{$type}{'format'} = 'a'; + } + } + + if ($swash->{'EXTRAS'}) { + carp __PACKAGE__, "::prop_invmap: swash returned for $prop unexpectedly has EXTRAS magic"; + return; + } + + # Here, have a valid swash return. Examine it. + my $returned_prop = $swash->{'TYPE'}; + + # All properties but binary ones should have 'missing' and 'format' + # entries + $missing = $utf8::SwashInfo{$returned_prop}{'missing'}; + $missing = 'N' unless defined $missing; + + $format = $utf8::SwashInfo{$returned_prop}{'format'}; + $format = 'b' unless defined $format; + + my $requires_adjustment = $format =~ /^a/; + + if ($swash->{'LIST'} =~ /^V/) { + @invlist = split "\n", $swash->{'LIST'} =~ s/ \s* (?: \# .* )? $ //xmgr; + + shift @invlist; # Get rid of 'V'; + + # Could need to be inverted: add or subtract a 0 at the beginning of + # the list. + if ($swash->{'INVERT_IT'}) { + if (@invlist && $invlist[0] == 0) { + shift @invlist; + } + else { + unshift @invlist, 0; + } + } + foreach my $i (0 .. @invlist - 1) { + $invmap[$i] = ($i % 2 == 0) ? 'Y' : 'N' + } + + # The map includes lines for all code points; add one for the range + # from 0 to the first Y. + if ($invlist[0] != 0) { + unshift @invlist, 0; + unshift @invmap, 'N'; + } + } + else { + if ($swash->{'INVERT_IT'}) { + croak __PACKAGE__, ":prop_invmap: Don't know how to deal with inverted"; + } + + # The LIST input lines look like: + # ... + # 0374\t\tCommon + # 0375\t0377\tGreek # [3] + # 037A\t037D\tGreek # [4] + # 037E\t\tCommon + # 0384\t\tGreek + # ... + # + # Convert them to like + # 0374 => Common + # 0375 => Greek + # 0378 => $missing + # 037A => Greek + # 037E => Common + # 037F => $missing + # 0384 => Greek + # + # For binary properties, the final non-comment column is absent, and + # assumed to be 'Y'. + + foreach my $range (split "\n", $swash->{'LIST'}) { + $range =~ s/ \s* (?: \# .* )? $ //xg; # rmv trailing space, comments + + # Find the beginning and end of the range on the line + my ($hex_begin, $hex_end, $map) = split "\t", $range; + my $begin = hex $hex_begin; + no warnings 'portable'; + my $end = (defined $hex_end && $hex_end ne "") + ? hex $hex_end + : $begin; + + # Each time through the loop (after the first): + # $invlist[-2] contains the beginning of the previous range processed + # $invlist[-1] contains the end+1 of the previous range processed + # $invmap[-2] contains the value of the previous range processed + # $invmap[-1] contains the default value for missing ranges + # ($missing) + # + # Thus, things are set up for the typical case of a new + # non-adjacent range of non-missings to be added. But, if the new + # range is adjacent, it needs to replace the [-1] element; and if + # the new range is a multiple value of the previous one, it needs + # to be added to the [-2] map element. + + # The first time through, everything will be empty. If the + # property doesn't have a range that begins at 0, add one that + # maps to $missing + if (! @invlist) { + if ($begin != 0) { + push @invlist, 0; + push @invmap, $missing; + } + } + elsif (@invlist > 1 && $invlist[-2] == $begin) { + + # Here we handle the case where the input has multiple entries + # for each code point. mktables should have made sure that + # each such range contains only one code point. At this + # point, $invlist[-1] is the $missing that was added at the + # end of the last loop iteration, and [-2] is the last real + # input code point, and that code point is the same as the one + # we are adding now, making the new one a multiple entry. Add + # it to the existing entry, either by pushing it to the + # existing list of multiple entries, or converting the single + # current entry into a list with both on it. This is all we + # need do for this iteration. + + if ($end != $begin) { + croak __PACKAGE__, ":prop_invmap: Multiple maps per code point in '$prop' require single-element ranges: begin=$begin, end=$end, map=$map"; + } + if (! ref $invmap[-2]) { + $invmap[-2] = [ $invmap[-2], $map ]; + } + else { + push @{$invmap[-2]}, $map; + } + $has_multiples = 1; + next; + } + elsif ($invlist[-1] == $begin) { + + # If the input isn't in the most compact form, so that there + # are two adjacent ranges that map to the same thing, they + # should be combined (EXCEPT where the arrays require + # adjustments, in which case everything is already set up + # correctly). This happens in our constructed dt mapping, as + # Element [-2] is the map for the latest range so far + # processed. Just set the beginning point of the map to + # $missing (in invlist[-1]) to 1 beyond where this range ends. + # For example, in + # 12\t13\tXYZ + # 14\t17\tXYZ + # we have set it up so that it looks like + # 12 => XYZ + # 14 => $missing + # + # We now see that it should be + # 12 => XYZ + # 18 => $missing + if (! $requires_adjustment && @invlist > 1 && ( (defined $map) + ? $invmap[-2] eq $map + : $invmap[-2] eq 'Y')) + { + $invlist[-1] = $end + 1; + next; + } + + # Here, the range started in the previous iteration that maps + # to $missing starts at the same code point as this range. + # That means there is no gap to fill that that range was + # intended for, so we just pop it off the parallel arrays. + pop @invlist; + pop @invmap; + } + + # Add the range beginning, and the range's map. + push @invlist, $begin; + if ($returned_prop eq 'ToDm') { + + # The decomposition maps are either a line like which are to be taken as is; or a sequence of code + # points in hex and separated by blanks. Convert them to + # decimal, and if there is more than one, use an anonymous + # array as the map. + if ($map =~ /^ < /x) { + push @invmap, $map; + } + else { + my @map = split " ", $map; + if (@map == 1) { + push @invmap, $map[0]; + } + else { + push @invmap, \@map; + } + } + } + else { + + # Otherwise, convert hex formatted list entries to decimal; + # add a 'Y' map for the missing value in binary properties, or + # otherwise, use the input map unchanged. + $map = ($format eq 'x' || $format eq 'ax') + ? hex $map + : $format eq 'b' + ? 'Y' + : $map; + push @invmap, $map; + } + + # We just started a range. It ends with $end. The gap between it + # and the next element in the list must be filled with a range + # that maps to the default value. If there is no gap, the next + # iteration will pop this, unless there is no next iteration, and + # we have filled all of the Unicode code space, so check for that + # and skip. + if ($end < $Unicode::UCD::MAX_CP) { + push @invlist, $end + 1; + push @invmap, $missing; + } + } + } + + # If the property is empty, make all code points use the value for missing + # ones. + if (! @invlist) { + push @invlist, 0; + push @invmap, $missing; + } + + # The final element is always for just the above-Unicode code points. If + # not already there, add it. It merely splits the current final range + # that extends to infinity into two elements, each with the same map. + # (This is to conform with the API that says the final element is for + # $MAX_UNICODE_CODEPOINT + 1 .. INFINITY.) + if ($invlist[-1] != $MAX_UNICODE_CODEPOINT + 1) { + push @invmap, $invmap[-1]; + push @invlist, $MAX_UNICODE_CODEPOINT + 1; + } + + # The second component of the map are those values that require + # non-standard specification, stored in SPECIALS. These override any + # duplicate code points in LIST. If we are using a proxy, we may have + # already set $overrides based on the proxy. + $overrides = $swash->{'SPECIALS'} unless defined $overrides; + if ($overrides) { + + # A negative $overrides implies that the SPECIALS should be ignored, + # and a simple 'a' list is the value. + if ($overrides < 0) { + $format = 'a'; + } + else { + + # Currently, all overrides are for properties that normally map to + # single code points, but now some will map to lists of code + # points (but there is an exception case handled below). + $format = 'al'; + + # Look through the overrides. + foreach my $cp_maybe_utf8 (keys %$overrides) { + my $cp; + my @map; + + # If the overrides came from SPECIALS, the code point keys are + # packed UTF-8. + if ($overrides == $swash->{'SPECIALS'}) { + $cp = $cp_maybe_utf8; + if (! utf8::decode($cp)) { + croak __PACKAGE__, "::prop_invmap: Malformed UTF-8: ", + map { sprintf("\\x{%02X}", unpack("C", $_)) } + split "", $cp; + } + + $cp = unpack("W", $cp); + @map = unpack "W*", $swash->{'SPECIALS'}{$cp_maybe_utf8}; + + # The empty string will show up unpacked as an empty + # array. + $format = 'ale' if @map == 0; + } + else { + + # But if we generated the overrides, we didn't bother to + # pack them, and we, so far, do this only for properties + # that are 'a' ones. + $cp = $cp_maybe_utf8; + @map = hex $overrides->{$cp}; + $format = 'a'; + } + + # Find the range that the override applies to. + my $i = search_invlist(\@invlist, $cp); + if ($cp < $invlist[$i] || $cp >= $invlist[$i + 1]) { + croak __PACKAGE__, "::prop_invmap: wrong_range, cp=$cp; i=$i, current=$invlist[$i]; next=$invlist[$i + 1]" + } + + # And what that range currently maps to + my $cur_map = $invmap[$i]; + + # If there is a gap between the next range and the code point + # we are overriding, we have to add elements to both arrays to + # fill that gap, using the map that applies to it, which is + # $cur_map, since it is part of the current range. + if ($invlist[$i + 1] > $cp + 1) { + #use feature 'say'; + #say "Before splice:"; + #say 'i-2=[', $i-2, ']', sprintf("%04X maps to %s", $invlist[$i-2], $invmap[$i-2]) if $i >= 2; + #say 'i-1=[', $i-1, ']', sprintf("%04X maps to %s", $invlist[$i-1], $invmap[$i-1]) if $i >= 1; + #say 'i =[', $i, ']', sprintf("%04X maps to %s", $invlist[$i], $invmap[$i]); + #say 'i+1=[', $i+1, ']', sprintf("%04X maps to %s", $invlist[$i+1], $invmap[$i+1]) if $i < @invlist + 1; + #say 'i+2=[', $i+2, ']', sprintf("%04X maps to %s", $invlist[$i+2], $invmap[$i+2]) if $i < @invlist + 2; + + splice @invlist, $i + 1, 0, $cp + 1; + splice @invmap, $i + 1, 0, $cur_map; + + #say "After splice:"; + #say 'i-2=[', $i-2, ']', sprintf("%04X maps to %s", $invlist[$i-2], $invmap[$i-2]) if $i >= 2; + #say 'i-1=[', $i-1, ']', sprintf("%04X maps to %s", $invlist[$i-1], $invmap[$i-1]) if $i >= 1; + #say 'i =[', $i, ']', sprintf("%04X maps to %s", $invlist[$i], $invmap[$i]); + #say 'i+1=[', $i+1, ']', sprintf("%04X maps to %s", $invlist[$i+1], $invmap[$i+1]) if $i < @invlist + 1; + #say 'i+2=[', $i+2, ']', sprintf("%04X maps to %s", $invlist[$i+2], $invmap[$i+2]) if $i < @invlist + 2; + } + + # If the remaining portion of the range is multiple code + # points (ending with the one we are replacing, guaranteed by + # the earlier splice). We must split it into two + if ($invlist[$i] < $cp) { + $i++; # Compensate for the new element + + #use feature 'say'; + #say "Before splice:"; + #say 'i-2=[', $i-2, ']', sprintf("%04X maps to %s", $invlist[$i-2], $invmap[$i-2]) if $i >= 2; + #say 'i-1=[', $i-1, ']', sprintf("%04X maps to %s", $invlist[$i-1], $invmap[$i-1]) if $i >= 1; + #say 'i =[', $i, ']', sprintf("%04X maps to %s", $invlist[$i], $invmap[$i]); + #say 'i+1=[', $i+1, ']', sprintf("%04X maps to %s", $invlist[$i+1], $invmap[$i+1]) if $i < @invlist + 1; + #say 'i+2=[', $i+2, ']', sprintf("%04X maps to %s", $invlist[$i+2], $invmap[$i+2]) if $i < @invlist + 2; + + splice @invlist, $i, 0, $cp; + splice @invmap, $i, 0, 'dummy'; + + #say "After splice:"; + #say 'i-2=[', $i-2, ']', sprintf("%04X maps to %s", $invlist[$i-2], $invmap[$i-2]) if $i >= 2; + #say 'i-1=[', $i-1, ']', sprintf("%04X maps to %s", $invlist[$i-1], $invmap[$i-1]) if $i >= 1; + #say 'i =[', $i, ']', sprintf("%04X maps to %s", $invlist[$i], $invmap[$i]); + #say 'i+1=[', $i+1, ']', sprintf("%04X maps to %s", $invlist[$i+1], $invmap[$i+1]) if $i < @invlist + 1; + #say 'i+2=[', $i+2, ']', sprintf("%04X maps to %s", $invlist[$i+2], $invmap[$i+2]) if $i < @invlist + 2; + } + + # Here, the range we are overriding contains a single code + # point. The result could be the empty string, a single + # value, or a list. If the last case, we use an anonymous + # array. + $invmap[$i] = (scalar @map == 0) + ? "" + : (scalar @map > 1) + ? \@map + : $map[0]; + } + } + } + elsif ($format eq 'x') { + + # All hex-valued properties are really to code points, and have been + # converted to decimal. + $format = 's'; + } + elsif ($returned_prop eq 'ToDm') { + $format = 'ad'; + } + elsif ($format eq 'sw') { # blank-separated elements to form a list. + map { $_ = [ split " ", $_ ] if $_ =~ / / } @invmap; + $format = 'sl'; + } + elsif ($returned_prop =~ / To ( _Perl )? NameAlias/x) { + + # This property currently doesn't have any lists, but theoretically + # could + $format = 'sl'; + } + elsif ($returned_prop eq 'ToPerlDecimalDigit') { + $format = 'ae'; + } + elsif ($returned_prop eq 'ToNv') { + + # The one property that has this format is stored as a delta, so needs + # to indicate that need to add code point to it. + $format = 'ar'; + } + elsif ($format eq 'ax') { + + # Normally 'ax' properties have overrides, and will have been handled + # above, but if not, they still need adjustment, and the hex values + # have already been converted to decimal + $format = 'a'; + } + elsif ($format ne 'n' && $format !~ / ^ a /x) { + + # All others are simple scalars + $format = 's'; + } + if ($has_multiples && $format !~ /l/) { + croak __PACKAGE__, "::prop_invmap: Wrong format '$format' for prop_invmap('$prop'); should indicate has lists"; + } + + return (\@invlist, \@invmap, $format, $missing); +} + +sub search_invlist { + + + + my $list_ref = shift; + my $input_code_point = shift; + my $code_point = _getcode($input_code_point); + + if (! defined $code_point) { + carp __PACKAGE__, "::search_invlist: unknown code '$input_code_point'"; + return; + } + + my $max_element = @$list_ref - 1; + + # Return undef if list is empty or requested item is before the first element. + return if $max_element < 0; + return if $code_point < $list_ref->[0]; + + # Short cut something at the far-end of the table. This also allows us to + # refer to element [$i+1] without fear of being out-of-bounds in the loop + # below. + return $max_element if $code_point >= $list_ref->[$max_element]; + + use integer; # want integer division + + my $i = $max_element / 2; + + my $lower = 0; + my $upper = $max_element; + while (1) { + + if ($code_point >= $list_ref->[$i]) { + + # Here we have met the lower constraint. We can quit if we + # also meet the upper one. + last if $code_point < $list_ref->[$i+1]; + + $lower = $i; # Still too low. + + } + else { + + # Here, $code_point < $list_ref[$i], so look lower down. + $upper = $i; + } + + # Split search domain in half to try again. + my $temp = ($upper + $lower) / 2; + + # No point in continuing unless $i changes for next time + # in the loop. + return $i if $temp == $i; + $i = $temp; + } # End of while loop + + # Here we have found the offset + return $i; +} + + +my $UNICODEVERSION; + +sub UnicodeVersion { + unless (defined $UNICODEVERSION) { + my $versionfh = openunicode("version"); + local $/ = "\n"; + chomp($UNICODEVERSION = <$versionfh>); + croak __PACKAGE__, "::VERSION: strange version '$UNICODEVERSION'" + unless $UNICODEVERSION =~ /^\d+(?:\.\d+)+$/; + } + $v_unicode_version = pack "C*", split /\./, $UNICODEVERSION; + return $UNICODEVERSION; +} + + +1; +package TAP::Parser; + +use strict; +use warnings; + +use TAP::Parser::Grammar (); +use TAP::Parser::Result (); +use TAP::Parser::ResultFactory (); +use TAP::Parser::Source (); +use TAP::Parser::Iterator (); +use TAP::Parser::IteratorFactory (); +use TAP::Parser::SourceHandler::Executable (); +use TAP::Parser::SourceHandler::Perl (); +use TAP::Parser::SourceHandler::File (); +use TAP::Parser::SourceHandler::RawTAP (); +use TAP::Parser::SourceHandler::Handle (); + +use Carp qw( confess ); + +use base 'TAP::Base'; + + +our $VERSION = '3.42'; + +my $DEFAULT_TAP_VERSION = 12; +my $MAX_TAP_VERSION = 13; + +$ENV{TAP_VERSION} = $MAX_TAP_VERSION; + +END { + + # For VMS. + delete $ENV{TAP_VERSION}; +} + +BEGIN { # making accessors + __PACKAGE__->mk_methods( + qw( + _iterator + _spool + exec + exit + is_good_plan + plan + tests_planned + tests_run + wait + version + in_todo + start_time + end_time + start_times + end_times + skip_all + grammar_class + result_factory_class + iterator_factory_class + ) + ); + + sub _stream { # deprecated + my $self = shift; + $self->_iterator(@_); + } +} # done making accessors + + +# new() implementation supplied by TAP::Base + +# This should make overriding behaviour of the Parser in subclasses easier: +sub _default_grammar_class {'TAP::Parser::Grammar'} +sub _default_result_factory_class {'TAP::Parser::ResultFactory'} +sub _default_iterator_factory_class {'TAP::Parser::IteratorFactory'} + +############################################################################## + + +sub next { + my $self = shift; + return ( $self->{_iter} ||= $self->_iter )->(); +} + +############################################################################## + + +sub run { + my $self = shift; + while ( defined( my $result = $self->next ) ) { + + # do nothing + } +} + +############################################################################## + + +# This should make overriding behaviour of the Parser in subclasses easier: +sub make_iterator_factory { shift->iterator_factory_class->new(@_); } +sub make_grammar { shift->grammar_class->new(@_); } +sub make_result { shift->result_factory_class->make_result(@_); } + +{ + + # of the following, anything beginning with an underscore is strictly + # internal and should not be exposed. + my %initialize = ( + version => $DEFAULT_TAP_VERSION, + plan => '', # the test plan (e.g., 1..3) + tests_run => 0, # actual current test numbers + skipped => [], # + todo => [], # + passed => [], # + failed => [], # + actual_failed => [], # how many tests really failed + actual_passed => [], # how many tests really passed + todo_passed => [], # tests which unexpectedly succeed + parse_errors => [], # perfect TAP should have none + ); + + # We seem to have this list hanging around all over the place. We could + # probably get it from somewhere else to avoid the repetition. + my @legal_callback = qw( + test + version + plan + comment + bailout + unknown + yaml + ALL + ELSE + EOF + ); + + my @class_overrides = qw( + grammar_class + result_factory_class + iterator_factory_class + ); + + sub _initialize { + my ( $self, $arg_for ) = @_; + + # everything here is basically designed to convert any TAP source to a + # TAP::Parser::Iterator. + + # Shallow copy + my %args = %{ $arg_for || {} }; + + $self->SUPER::_initialize( \%args, \@legal_callback ); + + # get any class overrides out first: + for my $key (@class_overrides) { + my $default_method = "_default_$key"; + my $val = delete $args{$key} || $self->$default_method(); + $self->$key($val); + } + + my $iterator = delete $args{iterator}; + $iterator ||= delete $args{stream}; # deprecated + my $tap = delete $args{tap}; + my $version = delete $args{version}; + my $raw_source = delete $args{source}; + my $sources = delete $args{sources}; + my $exec = delete $args{exec}; + my $merge = delete $args{merge}; + my $spool = delete $args{spool}; + my $switches = delete $args{switches}; + my $ignore_exit = delete $args{ignore_exit}; + my $test_args = delete $args{test_args} || []; + + if ( 1 < grep {defined} $iterator, $tap, $raw_source, $exec ) { + $self->_croak( + "You may only choose one of 'exec', 'tap', 'source' or 'iterator'" + ); + } + + if ( my @excess = sort keys %args ) { + $self->_croak("Unknown options: @excess"); + } + + # convert $tap & $exec to $raw_source equiv. + my $type = ''; + my $source = TAP::Parser::Source->new; + if ($tap) { + $type = 'raw TAP'; + $source->raw( \$tap ); + } + elsif ($exec) { + $type = 'exec ' . $exec->[0]; + $source->raw( { exec => $exec } ); + } + elsif ($raw_source) { + $type = 'source ' . ref($raw_source) || $raw_source; + $source->raw( ref($raw_source) ? $raw_source : \$raw_source ); + } + elsif ($iterator) { + $type = 'iterator ' . ref($iterator); + } + + if ( $source->raw ) { + my $src_factory = $self->make_iterator_factory($sources); + $source->merge($merge)->switches($switches) + ->test_args($test_args); + $iterator = $src_factory->make_iterator($source); + } + + unless ($iterator) { + $self->_croak( + "PANIC: could not determine iterator for input $type"); + } + + while ( my ( $k, $v ) = each %initialize ) { + $self->{$k} = 'ARRAY' eq ref $v ? [] : $v; + } + + $self->version($version) if $version; + $self->_iterator($iterator); + $self->_spool($spool); + $self->ignore_exit($ignore_exit); + + return $self; + } +} + + +sub passed { + return @{ $_[0]->{passed} } + if ref $_[0]->{passed}; + return wantarray ? 1 .. $_[0]->{passed} : $_[0]->{passed}; +} + + +sub failed { @{ shift->{failed} } } + + +sub actual_passed { + return @{ $_[0]->{actual_passed} } + if ref $_[0]->{actual_passed}; + return wantarray ? 1 .. $_[0]->{actual_passed} : $_[0]->{actual_passed}; +} +*actual_ok = \&actual_passed; + + +sub actual_failed { @{ shift->{actual_failed} } } + +############################################################################## + + +sub todo { @{ shift->{todo} } } + + +sub todo_passed { @{ shift->{todo_passed} } } + +############################################################################## + + +sub todo_failed { + warn + '"todo_failed" is deprecated. Please use "todo_passed". See the docs.'; + goto &todo_passed; +} + + +sub skipped { @{ shift->{skipped} } } + + +sub pragma { + my ( $self, $pragma ) = splice @_, 0, 2; + + return $self->{pragma}->{$pragma} unless @_; + + if ( my $state = shift ) { + $self->{pragma}->{$pragma} = 1; + } + else { + delete $self->{pragma}->{$pragma}; + } + + return; +} + + +sub pragmas { sort keys %{ shift->{pragma} || {} } } + + +sub good_plan { + warn 'good_plan() is deprecated. Please use "is_good_plan()"'; + goto &is_good_plan; +} + +############################################################################## + + +sub has_problems { + my $self = shift; + return + $self->failed + || $self->parse_errors + || ( !$self->ignore_exit && ( $self->wait || $self->exit ) ); +} + + +sub ignore_exit { shift->pragma( 'ignore_exit', @_ ) } + + +sub parse_errors { @{ shift->{parse_errors} } } + +sub _add_error { + my ( $self, $error ) = @_; + push @{ $self->{parse_errors} } => $error; + return $self; +} + +sub _make_state_table { + my $self = shift; + my %states; + my %planned_todo = (); + + # These transitions are defaults for all states + my %state_globals = ( + comment => {}, + bailout => {}, + yaml => {}, + version => { + act => sub { + $self->_add_error( + 'If TAP version is present it must be the first line of output' + ); + }, + }, + unknown => { + act => sub { + my $unk = shift; + if ( $self->pragma('strict') ) { + $self->_add_error( + 'Unknown TAP token: "' . $unk->raw . '"' ); + } + }, + }, + pragma => { + act => sub { + my ($pragma) = @_; + for my $pr ( $pragma->pragmas ) { + if ( $pr =~ /^ ([-+])(\w+) $/x ) { + $self->pragma( $2, $1 eq '+' ); + } + } + }, + }, + ); + + # Provides default elements for transitions + my %state_defaults = ( + plan => { + act => sub { + my ($plan) = @_; + $self->tests_planned( $plan->tests_planned ); + $self->plan( $plan->plan ); + if ( $plan->has_skip ) { + $self->skip_all( $plan->explanation + || '(no reason given)' ); + } + + $planned_todo{$_}++ for @{ $plan->todo_list }; + }, + }, + test => { + act => sub { + my ($test) = @_; + + my ( $number, $tests_run ) + = ( $test->number, ++$self->{tests_run} ); + + # Fake TODO state + if ( defined $number && delete $planned_todo{$number} ) { + $test->set_directive('TODO'); + } + + my $has_todo = $test->has_todo; + + $self->in_todo($has_todo); + if ( defined( my $tests_planned = $self->tests_planned ) ) { + if ( $tests_run > $tests_planned ) { + $test->is_unplanned(1); + } + } + + if ( defined $number ) { + if ( $number != $tests_run ) { + my $count = $tests_run; + $self->_add_error( "Tests out of sequence. Found " + . "($number) but expected ($count)" ); + } + } + else { + $test->_number( $number = $tests_run ); + } + + push @{ $self->{todo} } => $number if $has_todo; + push @{ $self->{todo_passed} } => $number + if $test->todo_passed; + push @{ $self->{skipped} } => $number + if $test->has_skip; + + push @{ $self->{ $test->is_ok ? 'passed' : 'failed' } } => + $number; + push @{ + $self->{ + $test->is_actual_ok + ? 'actual_passed' + : 'actual_failed' + } + } => $number; + }, + }, + yaml => { act => sub { }, }, + ); + + # Each state contains a hash the keys of which match a token type. For + # each token + # type there may be: + # act A coderef to run + # goto The new state to move to. Stay in this state if + # missing + # continue Goto the new state and run the new state for the + # current token + %states = ( + INIT => { + version => { + act => sub { + my ($version) = @_; + my $ver_num = $version->version; + if ( $ver_num <= $DEFAULT_TAP_VERSION ) { + my $ver_min = $DEFAULT_TAP_VERSION + 1; + $self->_add_error( + "Explicit TAP version must be at least " + . "$ver_min. Got version $ver_num" ); + $ver_num = $DEFAULT_TAP_VERSION; + } + if ( $ver_num > $MAX_TAP_VERSION ) { + $self->_add_error( + "TAP specified version $ver_num but " + . "we don't know about versions later " + . "than $MAX_TAP_VERSION" ); + $ver_num = $MAX_TAP_VERSION; + } + $self->version($ver_num); + $self->_grammar->set_version($ver_num); + }, + goto => 'PLAN' + }, + plan => { goto => 'PLANNED' }, + test => { goto => 'UNPLANNED' }, + }, + PLAN => { + plan => { goto => 'PLANNED' }, + test => { goto => 'UNPLANNED' }, + }, + PLANNED => { + test => { goto => 'PLANNED_AFTER_TEST' }, + plan => { + act => sub { + my ($version) = @_; + $self->_add_error( + 'More than one plan found in TAP output'); + }, + }, + }, + PLANNED_AFTER_TEST => { + test => { goto => 'PLANNED_AFTER_TEST' }, + plan => { act => sub { }, continue => 'PLANNED' }, + yaml => { goto => 'PLANNED' }, + }, + GOT_PLAN => { + test => { + act => sub { + my ($plan) = @_; + my $line = $self->plan; + $self->_add_error( + "Plan ($line) must be at the beginning " + . "or end of the TAP output" ); + $self->is_good_plan(0); + }, + continue => 'PLANNED' + }, + plan => { continue => 'PLANNED' }, + }, + UNPLANNED => { + test => { goto => 'UNPLANNED_AFTER_TEST' }, + plan => { goto => 'GOT_PLAN' }, + }, + UNPLANNED_AFTER_TEST => { + test => { act => sub { }, continue => 'UNPLANNED' }, + plan => { act => sub { }, continue => 'UNPLANNED' }, + yaml => { goto => 'UNPLANNED' }, + }, + ); + + # Apply globals and defaults to state table + for my $name ( keys %states ) { + + # Merge with globals + my $st = { %state_globals, %{ $states{$name} } }; + + # Add defaults + for my $next ( sort keys %{$st} ) { + if ( my $default = $state_defaults{$next} ) { + for my $def ( sort keys %{$default} ) { + $st->{$next}->{$def} ||= $default->{$def}; + } + } + } + + # Stuff back in table + $states{$name} = $st; + } + + return \%states; +} + + +sub get_select_handles { shift->_iterator->get_select_handles } + +sub _grammar { + my $self = shift; + return $self->{_grammar} = shift if @_; + + return $self->{_grammar} ||= $self->make_grammar( + { iterator => $self->_iterator, + parser => $self, + version => $self->version + } + ); +} + +sub _iter { + my $self = shift; + my $iterator = $self->_iterator; + my $grammar = $self->_grammar; + my $spool = $self->_spool; + my $state = 'INIT'; + my $state_table = $self->_make_state_table; + + $self->start_time( $self->get_time ); + $self->start_times( $self->get_times ); + + # Make next_state closure + my $next_state = sub { + my $token = shift; + my $type = $token->type; + TRANS: { + my $state_spec = $state_table->{$state} + or die "Illegal state: $state"; + + if ( my $next = $state_spec->{$type} ) { + if ( my $act = $next->{act} ) { + $act->($token); + } + if ( my $cont = $next->{continue} ) { + $state = $cont; + redo TRANS; + } + elsif ( my $goto = $next->{goto} ) { + $state = $goto; + } + } + else { + confess("Unhandled token type: $type\n"); + } + } + return $token; + }; + + # Handle end of stream - which means either pop a block or finish + my $end_handler = sub { + $self->exit( $iterator->exit ); + $self->wait( $iterator->wait ); + $self->_finish; + return; + }; + + # Finally make the closure that we return. For performance reasons + # there are two versions of the returned function: one that handles + # callbacks and one that does not. + if ( $self->_has_callbacks ) { + return sub { + my $result = eval { $grammar->tokenize }; + $self->_add_error($@) if $@; + + if ( defined $result ) { + $result = $next_state->($result); + + if ( my $code = $self->_callback_for( $result->type ) ) { + $_->($result) for @{$code}; + } + else { + $self->_make_callback( 'ELSE', $result ); + } + + $self->_make_callback( 'ALL', $result ); + + # Echo TAP to spool file + print {$spool} $result->raw, "\n" if $spool; + } + else { + $result = $end_handler->(); + $self->_make_callback( 'EOF', $self ) + unless defined $result; + } + + return $result; + }; + } # _has_callbacks + else { + return sub { + my $result = eval { $grammar->tokenize }; + $self->_add_error($@) if $@; + + if ( defined $result ) { + $result = $next_state->($result); + + # Echo TAP to spool file + print {$spool} $result->raw, "\n" if $spool; + } + else { + $result = $end_handler->(); + } + + return $result; + }; + } # no callbacks +} + +sub _finish { + my $self = shift; + + $self->end_time( $self->get_time ); + $self->end_times( $self->get_times ); + + # Avoid leaks + $self->_iterator(undef); + $self->_grammar(undef); + + # If we just delete the iter we won't get a fault if it's recreated. + # Instead we set it to a sub that returns an infinite + # stream of undef. This segfaults on 5.5.4, presumably because + # we're still executing the closure that gets replaced and it hasn't + # been protected with a refcount. + $self->{_iter} = sub {return} + if $] >= 5.006; + + # sanity checks + if ( !$self->plan ) { + $self->_add_error('No plan found in TAP output'); + } + else { + $self->is_good_plan(1) unless defined $self->is_good_plan; + } + if ( $self->tests_run != ( $self->tests_planned || 0 ) ) { + $self->is_good_plan(0); + if ( defined( my $planned = $self->tests_planned ) ) { + my $ran = $self->tests_run; + $self->_add_error( + "Bad plan. You planned $planned tests but ran $ran."); + } + } + if ( $self->tests_run != ( $self->passed + $self->failed ) ) { + + # this should never happen + my $actual = $self->tests_run; + my $passed = $self->passed; + my $failed = $self->failed; + $self->_croak( "Panic: planned test count ($actual) did not equal " + . "sum of passed ($passed) and failed ($failed) tests!" ); + } + + $self->is_good_plan(0) unless defined $self->is_good_plan; + + unless ( $self->parse_errors ) { + # Optimise storage where possible + if ( $self->tests_run == @{$self->{passed}} ) { + $self->{passed} = $self->tests_run; + } + if ( $self->tests_run == @{$self->{actual_passed}} ) { + $self->{actual_passed} = $self->tests_run; + } + } + + return $self; +} + + +sub delete_spool { + my $self = shift; + + return delete $self->{_spool}; +} + +############################################################################## + + +1; +package TAP::Base; + +use strict; +use warnings; + +use base 'TAP::Object'; + + +our $VERSION = '3.42'; + +use constant GOT_TIME_HIRES => do { + eval 'use Time::HiRes qw(time);'; + $@ ? 0 : 1; +}; + + +sub _initialize { + my ( $self, $arg_for, $ok_callback ) = @_; + + my %ok_map = map { $_ => 1 } @$ok_callback; + + $self->{ok_callbacks} = \%ok_map; + + if ( my $cb = delete $arg_for->{callbacks} ) { + while ( my ( $event, $callback ) = each %$cb ) { + $self->callback( $event, $callback ); + } + } + + return $self; +} + + +sub callback { + my ( $self, $event, $callback ) = @_; + + my %ok_map = %{ $self->{ok_callbacks} }; + + $self->_croak('No callbacks may be installed') + unless %ok_map; + + $self->_croak( "Callback $event is not supported. Valid callbacks are " + . join( ', ', sort keys %ok_map ) ) + unless exists $ok_map{$event}; + + push @{ $self->{code_for}{$event} }, $callback; + + return; +} + +sub _has_callbacks { + my $self = shift; + return keys %{ $self->{code_for} } != 0; +} + +sub _callback_for { + my ( $self, $event ) = @_; + return $self->{code_for}{$event}; +} + +sub _make_callback { + my $self = shift; + my $event = shift; + + my $cb = $self->_callback_for($event); + return unless defined $cb; + return map { $_->(@_) } @$cb; +} + + +sub get_time { return time() } + + +sub time_is_hires { return GOT_TIME_HIRES } + + +sub get_times { return [ times() ] } + +1; +package TAP::Harness; + +use strict; +use warnings; +use Carp; + +use File::Spec; +use File::Path; +use IO::Handle; + +use base 'TAP::Base'; + + +our $VERSION = '3.42'; + +$ENV{HARNESS_ACTIVE} = 1; +$ENV{HARNESS_VERSION} = $VERSION; + +END { + + # For VMS. + delete $ENV{HARNESS_ACTIVE}; + delete $ENV{HARNESS_VERSION}; +} + + +my %VALIDATION_FOR; +my @FORMATTER_ARGS; + +sub _error { + my $self = shift; + return $self->{error} unless @_; + $self->{error} = shift; +} + +BEGIN { + + @FORMATTER_ARGS = qw( + directives verbosity timer failures comments errors stdout color + show_count normalize + ); + + %VALIDATION_FOR = ( + lib => sub { + my ( $self, $libs ) = @_; + $libs = [$libs] unless 'ARRAY' eq ref $libs; + + return [ map {"-I$_"} @$libs ]; + }, + switches => sub { shift; shift }, + exec => sub { shift; shift }, + merge => sub { shift; shift }, + aggregator_class => sub { shift; shift }, + formatter_class => sub { shift; shift }, + multiplexer_class => sub { shift; shift }, + parser_class => sub { shift; shift }, + scheduler_class => sub { shift; shift }, + formatter => sub { shift; shift }, + jobs => sub { shift; shift }, + test_args => sub { shift; shift }, + ignore_exit => sub { shift; shift }, + rules => sub { shift; shift }, + rulesfile => sub { shift; shift }, + sources => sub { shift; shift }, + version => sub { shift; shift }, + trap => sub { shift; shift }, + ); + + for my $method ( sort keys %VALIDATION_FOR ) { + no strict 'refs'; + if ( $method eq 'lib' || $method eq 'switches' ) { + *{$method} = sub { + my $self = shift; + unless (@_) { + $self->{$method} ||= []; + return wantarray + ? @{ $self->{$method} } + : $self->{$method}; + } + $self->_croak("Too many arguments to method '$method'") + if @_ > 1; + my $args = shift; + $args = [$args] unless ref $args; + $self->{$method} = $args; + return $self; + }; + } + else { + *{$method} = sub { + my $self = shift; + return $self->{$method} unless @_; + $self->{$method} = shift; + }; + } + } + + for my $method (@FORMATTER_ARGS) { + no strict 'refs'; + *{$method} = sub { + my $self = shift; + return $self->formatter->$method(@_); + }; + } +} + +############################################################################## + + +# new supplied by TAP::Base + +{ + my @legal_callback = qw( + parser_args + made_parser + before_runtests + after_runtests + after_test + ); + + my %default_class = ( + aggregator_class => 'TAP::Parser::Aggregator', + formatter_class => 'TAP::Formatter::Console', + multiplexer_class => 'TAP::Parser::Multiplexer', + parser_class => 'TAP::Parser', + scheduler_class => 'TAP::Parser::Scheduler', + ); + + sub _initialize { + my ( $self, $arg_for ) = @_; + $arg_for ||= {}; + + $self->SUPER::_initialize( $arg_for, \@legal_callback ); + my %arg_for = %$arg_for; # force a shallow copy + + for my $name ( sort keys %VALIDATION_FOR ) { + my $property = delete $arg_for{$name}; + if ( defined $property ) { + my $validate = $VALIDATION_FOR{$name}; + + my $value = $self->$validate($property); + if ( $self->_error ) { + $self->_croak; + } + $self->$name($value); + } + } + + $self->jobs(1) unless defined $self->jobs; + + if ( ! defined $self->rules ) { + $self->_maybe_load_rulesfile; + } + + local $default_class{formatter_class} = 'TAP::Formatter::File' + unless -t ( $arg_for{stdout} || \*STDOUT ) && !$ENV{HARNESS_NOTTY}; + + while ( my ( $attr, $class ) = each %default_class ) { + $self->$attr( $self->$attr() || $class ); + } + + unless ( $self->formatter ) { + + # This is a little bodge to preserve legacy behaviour. It's + # pretty horrible that we know which args are destined for + # the formatter. + my %formatter_args = ( jobs => $self->jobs ); + for my $name (@FORMATTER_ARGS) { + if ( defined( my $property = delete $arg_for{$name} ) ) { + $formatter_args{$name} = $property; + } + } + + $self->formatter( + $self->_construct( $self->formatter_class, \%formatter_args ) + ); + } + + if ( my @props = sort keys %arg_for ) { + $self->_croak("Unknown arguments to TAP::Harness::new (@props)"); + } + + return $self; + } + + sub _maybe_load_rulesfile { + my ($self) = @_; + + my ($rulesfile) = defined $self->rulesfile ? $self->rulesfile : + defined($ENV{HARNESS_RULESFILE}) ? $ENV{HARNESS_RULESFILE} : + grep { -r } qw(./testrules.yml t/testrules.yml); + + if ( defined $rulesfile && -r $rulesfile ) { + if ( ! eval { require CPAN::Meta::YAML; 1} ) { + warn "CPAN::Meta::YAML required to process $rulesfile" ; + return; + } + my $layer = $] lt "5.008" ? "" : ":encoding(UTF-8)"; + open my $fh, "<$layer", $rulesfile + or die "Couldn't open $rulesfile: $!"; + my $yaml_text = do { local $/; <$fh> }; + my $yaml = CPAN::Meta::YAML->read_string($yaml_text) + or die CPAN::Meta::YAML->errstr; + $self->rules( $yaml->[0] ); + } + return; + } +} + +############################################################################## + + +sub runtests { + my ( $self, @tests ) = @_; + + my $aggregate = $self->_construct( $self->aggregator_class ); + + $self->_make_callback( 'before_runtests', $aggregate ); + $aggregate->start; + my $finish = sub { + my $interrupted = shift; + $aggregate->stop; + $self->summary( $aggregate, $interrupted ); + $self->_make_callback( 'after_runtests', $aggregate ); + }; + my $run = sub { + $self->aggregate_tests( $aggregate, @tests ); + $finish->(); + }; + + if ( $self->trap ) { + local $SIG{INT} = sub { + print "\n"; + $finish->(1); + exit; + }; + $run->(); + } + else { + $run->(); + } + + return $aggregate; +} + + +sub summary { + my ( $self, @args ) = @_; + $self->formatter->summary(@args); +} + +sub _after_test { + my ( $self, $aggregate, $job, $parser ) = @_; + + $self->_make_callback( 'after_test', $job->as_array_ref, $parser ); + $aggregate->add( $job->description, $parser ); +} + +sub _bailout { + my ( $self, $result ) = @_; + my $explanation = $result->explanation; + die "FAILED--Further testing stopped" + . ( $explanation ? ": $explanation\n" : ".\n" ); +} + +sub _aggregate_parallel { + my ( $self, $aggregate, $scheduler ) = @_; + + my $jobs = $self->jobs; + my $mux = $self->_construct( $self->multiplexer_class ); + + RESULT: { + + # Keep multiplexer topped up + FILL: + while ( $mux->parsers < $jobs ) { + my $job = $scheduler->get_job; + + # If we hit a spinner stop filling and start running. + last FILL if !defined $job || $job->is_spinner; + + my ( $parser, $session ) = $self->make_parser($job); + $mux->add( $parser, [ $session, $job ] ); + } + + if ( my ( $parser, $stash, $result ) = $mux->next ) { + my ( $session, $job ) = @$stash; + if ( defined $result ) { + $session->result($result); + $self->_bailout($result) if $result->is_bailout; + } + else { + + # End of parser. Automatically removed from the mux. + $self->finish_parser( $parser, $session ); + $self->_after_test( $aggregate, $job, $parser ); + $job->finish; + } + redo RESULT; + } + } + + return; +} + +sub _aggregate_single { + my ( $self, $aggregate, $scheduler ) = @_; + + JOB: + while ( my $job = $scheduler->get_job ) { + next JOB if $job->is_spinner; + + my ( $parser, $session ) = $self->make_parser($job); + + while ( defined( my $result = $parser->next ) ) { + $session->result($result); + if ( $result->is_bailout ) { + + # Keep reading until input is exhausted in the hope + # of allowing any pending diagnostics to show up. + 1 while $parser->next; + $self->_bailout($result); + } + } + + $self->finish_parser( $parser, $session ); + $self->_after_test( $aggregate, $job, $parser ); + $job->finish; + } + + return; +} + + +sub aggregate_tests { + my ( $self, $aggregate, @tests ) = @_; + + my $jobs = $self->jobs; + my $scheduler = $self->make_scheduler(@tests); + + # #12458 + local $ENV{HARNESS_IS_VERBOSE} = 1 + if $self->formatter->verbosity > 0; + + # Formatter gets only names. + $self->formatter->prepare( map { $_->description } $scheduler->get_all ); + + if ( $self->jobs > 1 ) { + $self->_aggregate_parallel( $aggregate, $scheduler ); + } + else { + $self->_aggregate_single( $aggregate, $scheduler ); + } + + return; +} + +sub _add_descriptions { + my $self = shift; + + # Turn unwrapped scalars into anonymous arrays and copy the name as + # the description for tests that have only a name. + return map { @$_ == 1 ? [ $_->[0], $_->[0] ] : $_ } + map { 'ARRAY' eq ref $_ ? $_ : [$_] } @_; +} + + +sub make_scheduler { + my ( $self, @tests ) = @_; + return $self->_construct( + $self->scheduler_class, + tests => [ $self->_add_descriptions(@tests) ], + rules => $self->rules + ); +} + + +############################################################################## + +sub _get_parser_args { + my ( $self, $job ) = @_; + my $test_prog = $job->filename; + my %args = (); + + $args{sources} = $self->sources if $self->sources; + + my @switches; + @switches = $self->lib if $self->lib; + push @switches => $self->switches if $self->switches; + $args{switches} = \@switches; + $args{spool} = $self->_open_spool($test_prog); + $args{merge} = $self->merge; + $args{ignore_exit} = $self->ignore_exit; + $args{version} = $self->version if $self->version; + + if ( my $exec = $self->exec ) { + $args{exec} + = ref $exec eq 'CODE' + ? $exec->( $self, $test_prog ) + : [ @$exec, $test_prog ]; + if ( not defined $args{exec} ) { + $args{source} = $test_prog; + } + elsif ( ( ref( $args{exec} ) || "" ) ne "ARRAY" ) { + $args{source} = delete $args{exec}; + } + } + else { + $args{source} = $test_prog; + } + + if ( defined( my $test_args = $self->test_args ) ) { + + if ( ref($test_args) eq 'HASH' ) { + + # different args for each test + if ( exists( $test_args->{ $job->description } ) ) { + $test_args = $test_args->{ $job->description }; + } + else { + $self->_croak( "TAP::Harness Can't find test_args for " + . $job->description ); + } + } + + $args{test_args} = $test_args; + } + + return \%args; +} + + +sub make_parser { + my ( $self, $job ) = @_; + + my $args = $self->_get_parser_args($job); + $self->_make_callback( 'parser_args', $args, $job->as_array_ref ); + my $parser = $self->_construct( $self->parser_class, $args ); + + $self->_make_callback( 'made_parser', $parser, $job->as_array_ref ); + my $session = $self->formatter->open_test( $job->description, $parser ); + + return ( $parser, $session ); +} + + +sub finish_parser { + my ( $self, $parser, $session ) = @_; + + $session->close_test; + $self->_close_spool($parser); + + return $parser; +} + +sub _open_spool { + my $self = shift; + my $test = shift; + + if ( my $spool_dir = $ENV{PERL_TEST_HARNESS_DUMP_TAP} ) { + + my $spool = File::Spec->catfile( $spool_dir, $test ); + + # Make the directory + my ( $vol, $dir, undef ) = File::Spec->splitpath($spool); + my $path = File::Spec->catpath( $vol, $dir, '' ); + eval { mkpath($path) }; + $self->_croak($@) if $@; + + my $spool_handle = IO::Handle->new; + open( $spool_handle, ">$spool" ) + or $self->_croak(" Can't write $spool ( $! ) "); + + return $spool_handle; + } + + return; +} + +sub _close_spool { + my $self = shift; + my ($parser) = @_; + + if ( my $spool_handle = $parser->delete_spool ) { + close($spool_handle) + or $self->_croak(" Error closing TAP spool file( $! ) \n "); + } + + return; +} + +sub _croak { + my ( $self, $message ) = @_; + unless ($message) { + $message = $self->_error; + } + $self->SUPER::_croak($message); + + return; +} + +1; + +__END__ + +############################################################################## + + + +# vim:ts=4:sw=4:et:sta +package TAP::Object; + +use strict; +use warnings; + + +our $VERSION = '3.42'; + + +sub new { + my $class = shift; + my $self = bless {}, $class; + return $self->_initialize(@_); +} + + +sub _initialize { + return $_[0]; +} + + +sub _croak { + my $proto = shift; + require Carp; + Carp::croak(@_); + return; +} + + +sub _confess { + my $proto = shift; + require Carp; + Carp::confess(@_); + return; +} + + +sub _construct { + my ( $self, $class, @args ) = @_; + + $self->_croak("Bad module name $class") + unless $class =~ /^ \w+ (?: :: \w+ ) *$/x; + + unless ( $class->can('new') ) { + local $@; + eval "require $class"; + $self->_croak("Can't load $class: $@") if $@; + } + + return $class->new(@args); +} + + +sub mk_methods { + my ( $class, @methods ) = @_; + for my $method_name (@methods) { + my $method = "${class}::$method_name"; + no strict 'refs'; + *$method = sub { + my $self = shift; + $self->{$method_name} = shift if @_; + return $self->{$method_name}; + }; + } +} + +1; + +package TAP::Formatter::Session; + +use strict; +use warnings; + +use base 'TAP::Base'; + +my @ACCESSOR; + +BEGIN { + + @ACCESSOR = qw( name formatter parser show_count ); + + for my $method (@ACCESSOR) { + no strict 'refs'; + *$method = sub { shift->{$method} }; + } +} + + +our $VERSION = '3.42'; + + +sub _initialize { + my ( $self, $arg_for ) = @_; + $arg_for ||= {}; + + $self->SUPER::_initialize($arg_for); + my %arg_for = %$arg_for; # force a shallow copy + + for my $name (@ACCESSOR) { + $self->{$name} = delete $arg_for{$name}; + } + + if ( !defined $self->show_count ) { + $self->{show_count} = 1; # defaults to true + } + if ( $self->show_count ) { # but may be a damned lie! + $self->{show_count} = $self->_should_show_count; + } + + if ( my @props = sort keys %arg_for ) { + $self->_croak( + "Unknown arguments to " . __PACKAGE__ . "::new (@props)" ); + } + + return $self; +} + + +sub header { } + +sub result { } + +sub close_test { } + +sub clear_for_close { } + +sub _should_show_count { + my $self = shift; + return + !$self->formatter->verbose + && -t $self->formatter->stdout + && !$ENV{HARNESS_NOTTY}; +} + +sub _format_for_output { + my ( $self, $result ) = @_; + return $self->formatter->normalize ? $result->as_string : $result->raw; +} + +sub _output_test_failure { + my ( $self, $parser ) = @_; + my $formatter = $self->formatter; + return if $formatter->really_quiet; + + my $tests_run = $parser->tests_run; + my $tests_planned = $parser->tests_planned; + + my $total + = defined $tests_planned + ? $tests_planned + : $tests_run; + + my $passed = $parser->passed; + + # The total number of fails includes any tests that were planned but + # didn't run + my $failed = $parser->failed + $total - $tests_run; + my $exit = $parser->exit; + + if ( my $exit = $parser->exit ) { + my $wstat = $parser->wait; + my $status = sprintf( "%d (wstat %d, 0x%x)", $exit, $wstat, $wstat ); + $formatter->_failure_output("Dubious, test returned $status\n"); + } + + if ( $failed == 0 ) { + $formatter->_failure_output( + $total + ? "All $total subtests passed " + : 'No subtests run ' + ); + } + else { + $formatter->_failure_output("Failed $failed/$total subtests "); + if ( !$total ) { + $formatter->_failure_output("\nNo tests run!"); + } + } + + if ( my $skipped = $parser->skipped ) { + $passed -= $skipped; + my $test = 'subtest' . ( $skipped != 1 ? 's' : '' ); + $formatter->_output( + "\n\t(less $skipped skipped $test: $passed okay)"); + } + + if ( my $failed = $parser->todo_passed ) { + my $test = $failed > 1 ? 'tests' : 'test'; + $formatter->_output( + "\n\t($failed TODO $test unexpectedly succeeded)"); + } + + $formatter->_output("\n"); +} + +sub _make_ok_line { + my ( $self, $suffix ) = @_; + return "ok$suffix\n"; +} + +sub time_report { + my ( $self, $formatter, $parser ) = @_; + + my @time_report; + if ( $formatter->timer ) { + my $start_time = $parser->start_time; + my $end_time = $parser->end_time; + if ( defined $start_time and defined $end_time ) { + my $elapsed = $end_time - $start_time; + push @time_report, + $self->time_is_hires + ? sprintf( ' %8d ms', $elapsed * 1000 ) + : sprintf( ' %8s s', $elapsed || '<1' ); + } + my $start_times = $parser->start_times(); + my $end_times = $parser->end_times(); + my $usr = $end_times->[0] - $start_times->[0]; + my $sys = $end_times->[1] - $start_times->[1]; + my $cusr = $end_times->[2] - $start_times->[2]; + my $csys = $end_times->[3] - $start_times->[3]; + push @time_report, + sprintf('(%5.2f usr %5.2f sys + %5.2f cusr %5.2f csys = %5.2f CPU)', + $usr, $sys, $cusr, $csys, + $usr + $sys + $cusr + $csys); + } + + return "@time_report"; +} + +1; +package TAP::Formatter::Console; + +use strict; +use warnings; +use base 'TAP::Formatter::Base'; +use POSIX qw(strftime); + + +our $VERSION = '3.42'; + + +sub open_test { + my ( $self, $test, $parser ) = @_; + + my $class + = $self->jobs > 1 + ? 'TAP::Formatter::Console::ParallelSession' + : 'TAP::Formatter::Console::Session'; + + eval "require $class"; + $self->_croak($@) if $@; + + my $session = $class->new( + { name => $test, + formatter => $self, + parser => $parser, + show_count => $self->show_count, + } + ); + + $session->header; + + return $session; +} + +# Use _colorizer delegate to set output color. NOP if we have no delegate +sub _set_colors { + my ( $self, @colors ) = @_; + if ( my $colorizer = $self->_colorizer ) { + my $output_func = $self->{_output_func} ||= sub { + $self->_output(@_); + }; + $colorizer->set_color( $output_func, $_ ) for @colors; + } +} + +sub _failure_color { + my ($self) = @_; + + return $ENV{'HARNESS_SUMMARY_COLOR_FAIL'} || 'red'; +} + +sub _success_color { + my ($self) = @_; + + return $ENV{'HARNESS_SUMMARY_COLOR_SUCCESS'} || 'green'; +} + +sub _output_success { + my ( $self, $msg ) = @_; + $self->_set_colors( $self->_success_color() ); + $self->_output($msg); + $self->_set_colors('reset'); +} + +sub _failure_output { + my $self = shift; + $self->_set_colors( $self->_failure_color() ); + my $out = join '', @_; + my $has_newline = chomp $out; + $self->_output($out); + $self->_set_colors('reset'); + $self->_output($/) + if $has_newline; +} + +1; +package TAP::Formatter::File; + +use strict; +use warnings; +use TAP::Formatter::File::Session; +use POSIX qw(strftime); + +use base 'TAP::Formatter::Base'; + + +our $VERSION = '3.42'; + + +sub open_test { + my ( $self, $test, $parser ) = @_; + + my $session = TAP::Formatter::File::Session->new( + { name => $test, + formatter => $self, + parser => $parser, + } + ); + + $session->header; + + return $session; +} + +sub _should_show_count { + return 0; +} + +1; +package TAP::Formatter::Color; + +use strict; +use warnings; + +use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ ); + +use base 'TAP::Object'; + +my $NO_COLOR; + +BEGIN { + $NO_COLOR = 0; + + eval 'require Term::ANSIColor'; + if ($@) { + $NO_COLOR = $@; + }; + if (IS_WIN32) { + eval 'use Win32::Console::ANSI'; + if ($@) { + $NO_COLOR = $@; + } + }; + + if ($NO_COLOR) { + *set_color = sub { }; + } else { + *set_color = sub { + my ( $self, $output, $color ) = @_; + $output->( Term::ANSIColor::color($color) ); + }; + } +} + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object + +sub _initialize { + my $self = shift; + + if ($NO_COLOR) { + + # shorten that message a bit + ( my $error = $NO_COLOR ) =~ s/ in \@INC .*//s; + warn "Note: Cannot run tests in color: $error\n"; + return; # abort object construction + } + + return $self; +} + +############################################################################## + + +sub can_color { + return !$NO_COLOR; +} + + +1; +package TAP::Formatter::Base; + +use strict; +use warnings; +use base 'TAP::Base'; +use POSIX qw(strftime); + +my $MAX_ERRORS = 5; +my %VALIDATION_FOR; + +BEGIN { + %VALIDATION_FOR = ( + directives => sub { shift; shift }, + verbosity => sub { shift; shift }, + normalize => sub { shift; shift }, + timer => sub { shift; shift }, + failures => sub { shift; shift }, + comments => sub { shift; shift }, + errors => sub { shift; shift }, + color => sub { shift; shift }, + jobs => sub { shift; shift }, + show_count => sub { shift; shift }, + stdout => sub { + my ( $self, $ref ) = @_; + + $self->_croak("option 'stdout' needs a filehandle") + unless $self->_is_filehandle($ref); + + return $ref; + }, + ); + + sub _is_filehandle { + my ( $self, $ref ) = @_; + + return 0 if !defined $ref; + + return 1 if ref $ref eq 'GLOB'; # lexical filehandle + return 1 if !ref $ref && ref \$ref eq 'GLOB'; # bare glob like *STDOUT + + return 1 if eval { $ref->can('print') }; + + return 0; + } + + my @getter_setters = qw( + _longest + _printed_summary_header + _colorizer + ); + + __PACKAGE__->mk_methods( @getter_setters, keys %VALIDATION_FOR ); +} + + +our $VERSION = '3.42'; + + +sub _initialize { + my ( $self, $arg_for ) = @_; + $arg_for ||= {}; + + $self->SUPER::_initialize($arg_for); + my %arg_for = %$arg_for; # force a shallow copy + + $self->verbosity(0); + + for my $name ( keys %VALIDATION_FOR ) { + my $property = delete $arg_for{$name}; + if ( defined $property ) { + my $validate = $VALIDATION_FOR{$name}; + $self->$name( $self->$validate($property) ); + } + } + + if ( my @props = keys %arg_for ) { + $self->_croak( + "Unknown arguments to " . __PACKAGE__ . "::new (@props)" ); + } + + $self->stdout( \*STDOUT ) unless $self->stdout; + + if ( $self->color ) { + require TAP::Formatter::Color; + $self->_colorizer( TAP::Formatter::Color->new ); + } + + return $self; +} + +sub verbose { shift->verbosity >= 1 } +sub quiet { shift->verbosity <= -1 } +sub really_quiet { shift->verbosity <= -2 } +sub silent { shift->verbosity <= -3 } + + +# new supplied by TAP::Base + + +sub prepare { + my ( $self, @tests ) = @_; + + my $longest = 0; + + for my $test (@tests) { + $longest = length $test if length $test > $longest; + } + + $self->_longest($longest); +} + +sub _format_now { strftime "[%H:%M:%S]", localtime } + +sub _format_name { + my ( $self, $test ) = @_; + my $name = $test; + my $periods = '.' x ( $self->_longest + 2 - length $test ); + $periods = " $periods "; + + if ( $self->timer ) { + my $stamp = $self->_format_now(); + return "$stamp $name$periods"; + } + else { + return "$name$periods"; + } + +} + + +sub open_test { + die "Unimplemented."; +} + +sub _output_success { + my ( $self, $msg ) = @_; + $self->_output($msg); +} + + +sub summary { + my ( $self, $aggregate, $interrupted ) = @_; + + return if $self->silent; + + my @t = $aggregate->descriptions; + my $tests = \@t; + + my $runtime = $aggregate->elapsed_timestr; + + my $total = $aggregate->total; + my $passed = $aggregate->passed; + + if ( $self->timer ) { + $self->_output( $self->_format_now(), "\n" ); + } + + $self->_failure_output("Test run interrupted!\n") + if $interrupted; + + # TODO: Check this condition still works when all subtests pass but + # the exit status is nonzero + + if ( $aggregate->all_passed ) { + $self->_output_success("All tests successful.\n"); + } + + # ~TODO option where $aggregate->skipped generates reports + if ( $total != $passed or $aggregate->has_problems ) { + $self->_output("\nTest Summary Report"); + $self->_output("\n-------------------\n"); + for my $test (@$tests) { + $self->_printed_summary_header(0); + my ($parser) = $aggregate->parsers($test); + $self->_output_summary_failure( + 'failed', + [ ' Failed test: ', ' Failed tests: ' ], + $test, $parser + ); + $self->_output_summary_failure( + 'todo_passed', + " TODO passed: ", $test, $parser + ); + + # ~TODO this cannot be the default + #$self->_output_summary_failure( 'skipped', " Tests skipped: " ); + + if ( my $exit = $parser->exit ) { + $self->_summary_test_header( $test, $parser ); + $self->_failure_output(" Non-zero exit status: $exit\n"); + } + elsif ( my $wait = $parser->wait ) { + $self->_summary_test_header( $test, $parser ); + $self->_failure_output(" Non-zero wait status: $wait\n"); + } + + if ( my @errors = $parser->parse_errors ) { + my $explain; + if ( @errors > $MAX_ERRORS && !$self->errors ) { + $explain + = "Displayed the first $MAX_ERRORS of " + . scalar(@errors) + . " TAP syntax errors.\n" + . "Re-run prove with the -p option to see them all.\n"; + splice @errors, $MAX_ERRORS; + } + $self->_summary_test_header( $test, $parser ); + $self->_failure_output( + sprintf " Parse errors: %s\n", + shift @errors + ); + for my $error (@errors) { + my $spaces = ' ' x 16; + $self->_failure_output("$spaces$error\n"); + } + $self->_failure_output($explain) if $explain; + } + } + } + my $files = @$tests; + $self->_output("Files=$files, Tests=$total, $runtime\n"); + my $status = $aggregate->get_status; + $self->_output("Result: $status\n"); +} + +sub _output_summary_failure { + my ( $self, $method, $name, $test, $parser ) = @_; + + # ugly hack. Must rethink this :( + my $output = $method eq 'failed' ? '_failure_output' : '_output'; + + if ( my @r = $parser->$method() ) { + $self->_summary_test_header( $test, $parser ); + my ( $singular, $plural ) + = 'ARRAY' eq ref $name ? @$name : ( $name, $name ); + $self->$output( @r == 1 ? $singular : $plural ); + my @results = $self->_balanced_range( 40, @r ); + $self->$output( sprintf "%s\n" => shift @results ); + my $spaces = ' ' x 16; + while (@results) { + $self->$output( sprintf "$spaces%s\n" => shift @results ); + } + } +} + +sub _summary_test_header { + my ( $self, $test, $parser ) = @_; + return if $self->_printed_summary_header; + my $spaces = ' ' x ( $self->_longest - length $test ); + $spaces = ' ' unless $spaces; + my $output = $self->_get_output_method($parser); + my $wait = $parser->wait; + defined $wait or $wait = '(none)'; + $self->$output( + sprintf "$test$spaces(Wstat: %s Tests: %d Failed: %d)\n", + $wait, $parser->tests_run, scalar $parser->failed + ); + $self->_printed_summary_header(1); +} + +sub _output { + my $self = shift; + + print { $self->stdout } @_; +} + +sub _failure_output { + my $self = shift; + + $self->_output(@_); +} + +sub _balanced_range { + my ( $self, $limit, @range ) = @_; + @range = $self->_range(@range); + my $line = ""; + my @lines; + my $curr = 0; + while (@range) { + if ( $curr < $limit ) { + my $range = ( shift @range ) . ", "; + $line .= $range; + $curr += length $range; + } + elsif (@range) { + $line =~ s/, $//; + push @lines => $line; + $line = ''; + $curr = 0; + } + } + if ($line) { + $line =~ s/, $//; + push @lines => $line; + } + return @lines; +} + +sub _range { + my ( $self, @numbers ) = @_; + + # shouldn't be needed, but subclasses might call this + @numbers = sort { $a <=> $b } @numbers; + my ( $min, @range ); + + for my $i ( 0 .. $#numbers ) { + my $num = $numbers[$i]; + my $next = $numbers[ $i + 1 ]; + if ( defined $next && $next == $num + 1 ) { + if ( !defined $min ) { + $min = $num; + } + } + elsif ( defined $min ) { + push @range => "$min-$num"; + undef $min; + } + else { + push @range => $num; + } + } + return @range; +} + +sub _get_output_method { + my ( $self, $parser ) = @_; + return $parser->has_problems ? '_failure_output' : '_output'; +} + +1; +package TAP::Formatter::Console::Session; + +use strict; +use warnings; + +use base 'TAP::Formatter::Session'; + +my @ACCESSOR; + +BEGIN { + my @CLOSURE_BINDING = qw( header result clear_for_close close_test ); + + for my $method (@CLOSURE_BINDING) { + no strict 'refs'; + *$method = sub { + my $self = shift; + return ( $self->{_closures} ||= $self->_closures )->{$method} + ->(@_); + }; + } +} + + +our $VERSION = '3.42'; + + +sub _get_output_result { + my $self = shift; + + my @color_map = ( + { test => sub { $_->is_test && !$_->is_ok }, + colors => ['red'], + }, + { test => sub { $_->is_test && $_->has_skip }, + colors => [ + 'white', + 'on_blue' + ], + }, + { test => sub { $_->is_test && $_->has_todo }, + colors => ['yellow'], + }, + ); + + my $formatter = $self->formatter; + my $parser = $self->parser; + + return $formatter->_colorizer + ? sub { + my $result = shift; + for my $col (@color_map) { + local $_ = $result; + if ( $col->{test}->() ) { + $formatter->_set_colors( @{ $col->{colors} } ); + last; + } + } + $formatter->_output( $self->_format_for_output($result) ); + $formatter->_set_colors('reset'); + } + : sub { + $formatter->_output( $self->_format_for_output(shift) ); + }; +} + +sub _closures { + my $self = shift; + + my $parser = $self->parser; + my $formatter = $self->formatter; + my $pretty = $formatter->_format_name( $self->name ); + my $show_count = $self->show_count; + + my $really_quiet = $formatter->really_quiet; + my $quiet = $formatter->quiet; + my $verbose = $formatter->verbose; + my $directives = $formatter->directives; + my $failures = $formatter->failures; + my $comments = $formatter->comments; + + my $output_result = $self->_get_output_result; + + my $output = '_output'; + my $plan = ''; + my $newline_printed = 0; + + my $last_status_printed = 0; + + return { + header => sub { + $formatter->_output($pretty) + unless $really_quiet; + }, + + result => sub { + my $result = shift; + + if ( $result->is_bailout ) { + $formatter->_failure_output( + "Bailout called. Further testing stopped: " + . $result->explanation + . "\n" ); + } + + return if $really_quiet; + + my $is_test = $result->is_test; + + # These are used in close_test - but only if $really_quiet + # is false - so it's safe to only set them here unless that + # relationship changes. + + if ( !$plan ) { + my $planned = $parser->tests_planned || '?'; + $plan = "/$planned "; + } + $output = $formatter->_get_output_method($parser); + + if ( $show_count and $is_test ) { + my $number = $result->number; + my $now = CORE::time; + + # Print status roughly once per second. + # We will always get the first number as a side effect of + # $last_status_printed starting with the value 0, which $now + # will never be. (Unless someone sets their clock to 1970) + if ( $last_status_printed != $now ) { + $formatter->$output("\r$pretty$number$plan"); + $last_status_printed = $now; + } + } + + if (!$quiet + && ( $verbose + || ( $is_test && $failures && !$result->is_ok ) + || ( $comments && $result->is_comment ) + || ( $directives && $result->has_directive ) ) + ) + { + unless ($newline_printed) { + $formatter->_output("\n"); + $newline_printed = 1; + } + $output_result->($result); + $formatter->_output("\n"); + } + }, + + clear_for_close => sub { + my $spaces + = ' ' x length( '.' . $pretty . $plan . $parser->tests_run ); + $formatter->$output("\r$spaces"); + }, + + close_test => sub { + if ( $show_count && !$really_quiet ) { + $self->clear_for_close; + $formatter->$output("\r$pretty"); + } + + # Avoid circular references + $self->parser(undef); + $self->{_closures} = {}; + + return if $really_quiet; + + if ( my $skip_all = $parser->skip_all ) { + $formatter->_output("skipped: $skip_all\n"); + } + elsif ( $parser->has_problems ) { + $self->_output_test_failure($parser); + } + else { + my $time_report = $self->time_report($formatter, $parser); + $formatter->_output( $self->_make_ok_line($time_report) ); + } + }, + }; +} + + +1; +package TAP::Formatter::Console::ParallelSession; + +use strict; +use warnings; +use File::Spec; +use File::Path; +use Carp; + +use base 'TAP::Formatter::Console::Session'; + +use constant WIDTH => 72; # Because Eric says + +my %shared; + +sub _initialize { + my ( $self, $arg_for ) = @_; + + $self->SUPER::_initialize($arg_for); + my $formatter = $self->formatter; + + # Horrid bodge. This creates our shared context per harness. Maybe + # TAP::Harness should give us this? + my $context = $shared{$formatter} ||= $self->_create_shared_context; + push @{ $context->{active} }, $self; + + return $self; +} + +sub _create_shared_context { + my $self = shift; + return { + active => [], + tests => 0, + fails => 0, + }; +} + + +our $VERSION = '3.42'; + + + +sub header { +} + +sub _clear_ruler { + my $self = shift; + $self->formatter->_output( "\r" . ( ' ' x WIDTH ) . "\r" ); +} + +my $now = 0; +my $start; + +my $trailer = '... )==='; +my $chop_length = WIDTH - length $trailer; + +sub _output_ruler { + my ( $self, $refresh ) = @_; + my $new_now = time; + return if $new_now == $now and !$refresh; + $now = $new_now; + $start ||= $now; + my $formatter = $self->formatter; + return if $formatter->really_quiet; + + my $context = $shared{$formatter}; + + my $ruler = sprintf '===( %7d;%d ', $context->{tests}, $now - $start; + + for my $active ( @{ $context->{active} } ) { + my $parser = $active->parser; + my $tests = $parser->tests_run; + my $planned = $parser->tests_planned || '?'; + + $ruler .= sprintf '%' . length($planned) . "d/$planned ", $tests; + } + chop $ruler; # Remove a trailing space + $ruler .= ')==='; + + if ( length $ruler > WIDTH ) { + $ruler =~ s/(.{$chop_length}).*/$1$trailer/o; + } + else { + $ruler .= '=' x ( WIDTH - length($ruler) ); + } + $formatter->_output("\r$ruler"); +} + + +sub result { + my ( $self, $result ) = @_; + my $formatter = $self->formatter; + + # my $really_quiet = $formatter->really_quiet; + # my $show_count = $self->_should_show_count; + + if ( $result->is_test ) { + my $context = $shared{$formatter}; + $context->{tests}++; + + my $active = $context->{active}; + if ( @$active == 1 ) { + + # There is only one test, so use the serial output format. + return $self->SUPER::result($result); + } + + $self->_output_ruler( $self->parser->tests_run == 1 ); + } + elsif ( $result->is_bailout ) { + $formatter->_failure_output( + "Bailout called. Further testing stopped: " + . $result->explanation + . "\n" ); + } +} + + +sub clear_for_close { + my $self = shift; + my $formatter = $self->formatter; + return if $formatter->really_quiet; + my $context = $shared{$formatter}; + if ( @{ $context->{active} } == 1 ) { + $self->SUPER::clear_for_close; + } + else { + $self->_clear_ruler; + } +} + + +sub close_test { + my $self = shift; + my $name = $self->name; + my $parser = $self->parser; + my $formatter = $self->formatter; + my $context = $shared{$formatter}; + + $self->SUPER::close_test; + + my $active = $context->{active}; + + my @pos = grep { $active->[$_]->name eq $name } 0 .. $#$active; + + die "Can't find myself" unless @pos; + splice @$active, $pos[0], 1; + + if ( @$active > 1 ) { + $self->_output_ruler(1); + } + elsif ( @$active == 1 ) { + + # Print out "test/name.t ...." + $active->[0]->SUPER::header; + } + else { + + # $self->formatter->_output("\n"); + delete $shared{$formatter}; + } +} + +1; +package TAP::Formatter::File::Session; + +use strict; +use warnings; +use base 'TAP::Formatter::Session'; + + +our $VERSION = '3.42'; + + + +sub result { + my $self = shift; + my $result = shift; + + my $parser = $self->parser; + my $formatter = $self->formatter; + + if ( $result->is_bailout ) { + $formatter->_failure_output( + "Bailout called. Further testing stopped: " + . $result->explanation + . "\n" ); + return; + } + + if (!$formatter->quiet + && ( $formatter->verbose + || ( $result->is_test && $formatter->failures && !$result->is_ok ) + || ( $formatter->comments && $result->is_comment ) + || ( $result->has_directive && $formatter->directives ) ) + ) + { + $self->{results} .= $self->_format_for_output($result) . "\n"; + } +} + + +sub close_test { + my $self = shift; + + # Avoid circular references + $self->parser(undef); + + my $parser = $self->parser; + my $formatter = $self->formatter; + my $pretty = $formatter->_format_name( $self->name ); + + return if $formatter->really_quiet; + if ( my $skip_all = $parser->skip_all ) { + $formatter->_output( $pretty . "skipped: $skip_all\n" ); + } + elsif ( $parser->has_problems ) { + $formatter->_output( + $pretty . ( $self->{results} ? "\n" . $self->{results} : "\n" ) ); + $self->_output_test_failure($parser); + } + else { + my $time_report = $self->time_report($formatter, $parser); + $formatter->_output( $pretty + . ( $self->{results} ? "\n" . $self->{results} : "" ) + . $self->_make_ok_line($time_report) ); + } +} + +1; +package TAP::Harness::Env; + +use strict; +use warnings; + +use constant IS_VMS => ( $^O eq 'VMS' ); +use TAP::Object; +use Text::ParseWords qw/shellwords/; + +our $VERSION = '3.42'; + +# Get the parts of @INC which are changed from the stock list AND +# preserve reordering of stock directories. +sub _filtered_inc_vms { + my @inc = grep { !ref } @INC; #28567 + + # VMS has a 255-byte limit on the length of %ENV entries, so + # toss the ones that involve perl_root, the install location + @inc = grep { !/perl_root/i } @inc; + + my @default_inc = _default_inc(); + + my @new_inc; + my %seen; + for my $dir (@inc) { + next if $seen{$dir}++; + + if ( $dir eq ( $default_inc[0] || '' ) ) { + shift @default_inc; + } + else { + push @new_inc, $dir; + } + + shift @default_inc while @default_inc and $seen{ $default_inc[0] }; + } + return @new_inc; +} + +# Cache this to avoid repeatedly shelling out to Perl. +my @inc; + +sub _default_inc { + return @inc if @inc; + + local $ENV{PERL5LIB}; + local $ENV{PERLLIB}; + + my $perl = $ENV{HARNESS_PERL} || $^X; + + # Avoid using -l for the benefit of Perl 6 + chomp( @inc = `"$perl" -e "print join qq[\\n], \@INC, q[]"` ); + return @inc; +} + +sub create { + my $package = shift; + my %input = %{ shift || {} }; + + my @libs = @{ delete $input{libs} || [] }; + my @raw_switches = @{ delete $input{switches} || [] }; + my @opt + = ( @raw_switches, shellwords( $ENV{HARNESS_PERL_SWITCHES} || '' ) ); + my @switches; + while ( my $opt = shift @opt ) { + if ( $opt =~ /^ -I (.*) $ /x ) { + push @libs, length($1) ? $1 : shift @opt; + } + else { + push @switches, $opt; + } + } + + # Do things the old way on VMS... + push @libs, _filtered_inc_vms() if IS_VMS; + + # If $Verbose isn't numeric default to 1. This helps core. + my $verbose + = $ENV{HARNESS_VERBOSE} + ? $ENV{HARNESS_VERBOSE} !~ /\d/ + ? 1 + : $ENV{HARNESS_VERBOSE} + : 0; + + my %args = ( + lib => \@libs, + timer => $ENV{HARNESS_TIMER} || 0, + switches => \@switches, + color => $ENV{HARNESS_COLOR} || 0, + verbosity => $verbose, + ignore_exit => $ENV{HARNESS_IGNORE_EXIT} || 0, + ); + + my $class = delete $input{harness_class} || $ENV{HARNESS_SUBCLASS} || 'TAP::Harness'; + if ( defined( my $env_opt = $ENV{HARNESS_OPTIONS} ) ) { + for my $opt ( split /:/, $env_opt ) { + if ( $opt =~ /^j(\d*)$/ ) { + $args{jobs} = $1 || 9; + } + elsif ( $opt eq 'c' ) { + $args{color} = 1; + } + elsif ( $opt =~ m/^f(.*)$/ ) { + my $fmt = $1; + $fmt =~ s/-/::/g; + $args{formatter_class} = $fmt; + } + elsif ( $opt =~ m/^a(.*)$/ ) { + my $archive = $1; + $class = 'TAP::Harness::Archive'; + $args{archive} = $archive; + } + else { + die "Unknown HARNESS_OPTIONS item: $opt\n"; + } + } + } + return TAP::Object->_construct($class, { %args, %input }); +} + +1; + +package TAP::Parser::IteratorFactory; + +use strict; +use warnings; + +use Carp qw( confess ); +use File::Basename qw( fileparse ); + +use base 'TAP::Object'; + +use constant handlers => []; + + +our $VERSION = '3.42'; + + +sub _initialize { + my ( $self, $config ) = @_; + $self->config( $config || {} )->load_handlers; + return $self; +} + + +sub register_handler { + my ( $class, $dclass ) = @_; + + confess("$dclass must implement can_handle & make_iterator methods!") + unless UNIVERSAL::can( $dclass, 'can_handle' ) + && UNIVERSAL::can( $dclass, 'make_iterator' ); + + my $handlers = $class->handlers; + push @{$handlers}, $dclass + unless grep { $_ eq $dclass } @{$handlers}; + + return $class; +} + +############################################################################## + + +sub config { + my $self = shift; + return $self->{config} unless @_; + unless ( 'HASH' eq ref $_[0] ) { + $self->_croak('Argument to &config must be a hash reference'); + } + $self->{config} = shift; + return $self; +} + +sub _last_handler { + my $self = shift; + return $self->{last_handler} unless @_; + $self->{last_handler} = shift; + return $self; +} + +sub _testing { + my $self = shift; + return $self->{testing} unless @_; + $self->{testing} = shift; + return $self; +} + +############################################################################## + + +sub load_handlers { + my ($self) = @_; + for my $handler ( keys %{ $self->config } ) { + my $sclass = $self->_load_handler($handler); + + # TODO: store which class we loaded anywhere? + } + return $self; +} + +sub _load_handler { + my ( $self, $handler ) = @_; + + my @errors; + for my $dclass ( "TAP::Parser::SourceHandler::$handler", $handler ) { + return $dclass + if UNIVERSAL::can( $dclass, 'can_handle' ) + && UNIVERSAL::can( $dclass, 'make_iterator' ); + + eval "use $dclass"; + if ( my $e = $@ ) { + push @errors, $e; + next; + } + + return $dclass + if UNIVERSAL::can( $dclass, 'can_handle' ) + && UNIVERSAL::can( $dclass, 'make_iterator' ); + push @errors, + "handler '$dclass' does not implement can_handle & make_iterator"; + } + + $self->_croak( + "Cannot load handler '$handler': " . join( "\n", @errors ) ); +} + +############################################################################## + + +sub make_iterator { + my ( $self, $source ) = @_; + + $self->_croak('no raw source defined!') unless defined $source->raw; + + $source->config( $self->config )->assemble_meta; + + # is the raw source already an object? + return $source->raw + if ( $source->meta->{is_object} + && UNIVERSAL::isa( $source->raw, 'TAP::Parser::SourceHandler' ) ); + + # figure out what kind of source it is + my $sd_class = $self->detect_source($source); + $self->_last_handler($sd_class); + + return if $self->_testing; + + # create it + my $iterator = $sd_class->make_iterator($source); + + return $iterator; +} + + +sub detect_source { + my ( $self, $source ) = @_; + + confess('no raw source ref defined!') unless defined $source->raw; + + # find a list of handlers that can handle this source: + my %confidence_for; + for my $handler ( @{ $self->handlers } ) { + my $confidence = $handler->can_handle($source); + # warn "handler: $handler: $confidence\n"; + $confidence_for{$handler} = $confidence if $confidence; + } + + if ( !%confidence_for ) { + # error: can't detect source + my $raw_source_short = substr( ${ $source->raw }, 0, 50 ); + confess("Cannot detect source of '$raw_source_short'!"); + return; + } + + # if multiple handlers can handle it, choose the most confident one + my @handlers = + sort { $confidence_for{$b} <=> $confidence_for{$a} } + keys %confidence_for; + + # Check for a tie. + if( @handlers > 1 && + $confidence_for{$handlers[0]} == $confidence_for{$handlers[1]} + ) { + my $filename = $source->meta->{file}{basename}; + die("There is a tie between $handlers[0] and $handlers[1].\n". + "Both voted $confidence_for{$handlers[0]} on $filename.\n"); + } + + # this is really useful for debugging handlers: + if ( $ENV{TAP_HARNESS_SOURCE_FACTORY_VOTES} ) { + warn( + "votes: ", + join( ', ', map {"$_: $confidence_for{$_}"} @handlers ), + "\n" + ); + } + + # return 1st + return $handlers[0]; +} + +1; + +__END__ + + +package TAP::Parser::Iterator; + +use strict; +use warnings; + +use base 'TAP::Object'; + + +our $VERSION = '3.42'; + + +sub next { + my $self = shift; + my $line = $self->next_raw; + + # vms nit: When encountering 'not ok', vms often has the 'not' on a line + # by itself: + # not + # ok 1 - 'I hate VMS' + if ( defined($line) and $line =~ /^\s*not\s*$/ ) { + $line .= ( $self->next_raw || '' ); + } + + return $line; +} + +sub next_raw { + require Carp; + my $msg = Carp::longmess('abstract method called directly!'); + $_[0]->_croak($msg); +} + + +sub handle_unicode { } + + +sub get_select_handles { + return; +} + + +sub wait { + require Carp; + my $msg = Carp::longmess('abstract method called directly!'); + $_[0]->_croak($msg); +} + +sub exit { + require Carp; + my $msg = Carp::longmess('abstract method called directly!'); + $_[0]->_croak($msg); +} + +1; + + +package TAP::Parser::Multiplexer; + +use strict; +use warnings; + +use IO::Select; + +use base 'TAP::Object'; + +use constant IS_WIN32 => $^O =~ /^(MS)?Win32$/; +use constant IS_VMS => $^O eq 'VMS'; +use constant SELECT_OK => !( IS_VMS || IS_WIN32 ); + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object + +sub _initialize { + my $self = shift; + $self->{select} = IO::Select->new; + $self->{avid} = []; # Parsers that can't select + $self->{count} = 0; + return $self; +} + +############################################################################## + + +sub add { + my ( $self, $parser, $stash ) = @_; + + if ( SELECT_OK && ( my @handles = $parser->get_select_handles ) ) { + my $sel = $self->{select}; + + # We have to turn handles into file numbers here because by + # the time we want to remove them from our IO::Select they + # will already have been closed by the iterator. + my @filenos = map { fileno $_ } @handles; + for my $h (@handles) { + $sel->add( [ $h, $parser, $stash, @filenos ] ); + } + + $self->{count}++; + } + else { + push @{ $self->{avid} }, [ $parser, $stash ]; + } +} + + +sub parsers { + my $self = shift; + return $self->{count} + scalar @{ $self->{avid} }; +} + +sub _iter { + my $self = shift; + + my $sel = $self->{select}; + my $avid = $self->{avid}; + my @ready = (); + + return sub { + + # Drain all the non-selectable parsers first + if (@$avid) { + my ( $parser, $stash ) = @{ $avid->[0] }; + my $result = $parser->next; + shift @$avid unless defined $result; + return ( $parser, $stash, $result ); + } + + unless (@ready) { + return unless $sel->count; + @ready = $sel->can_read; + } + + my ( $h, $parser, $stash, @handles ) = @{ shift @ready }; + my $result = $parser->next; + + unless ( defined $result ) { + $sel->remove(@handles); + $self->{count}--; + + # Force another can_read - we may now have removed a handle + # thought to have been ready. + @ready = (); + } + + return ( $parser, $stash, $result ); + }; +} + + +sub next { + my $self = shift; + return ( $self->{_iter} ||= $self->_iter )->(); +} + + +1; +package TAP::Parser::ResultFactory; + +use strict; +use warnings; + +use TAP::Parser::Result::Bailout (); +use TAP::Parser::Result::Comment (); +use TAP::Parser::Result::Plan (); +use TAP::Parser::Result::Pragma (); +use TAP::Parser::Result::Test (); +use TAP::Parser::Result::Unknown (); +use TAP::Parser::Result::Version (); +use TAP::Parser::Result::YAML (); + +use base 'TAP::Object'; + +############################################################################## + + +our $VERSION = '3.42'; + + +sub make_result { + my ( $proto, $token ) = @_; + my $type = $token->{type}; + return $proto->class_for($type)->new($token); +} + + +our %CLASS_FOR = ( + plan => 'TAP::Parser::Result::Plan', + pragma => 'TAP::Parser::Result::Pragma', + test => 'TAP::Parser::Result::Test', + comment => 'TAP::Parser::Result::Comment', + bailout => 'TAP::Parser::Result::Bailout', + version => 'TAP::Parser::Result::Version', + unknown => 'TAP::Parser::Result::Unknown', + yaml => 'TAP::Parser::Result::YAML', +); + +sub class_for { + my ( $class, $type ) = @_; + + # return target class: + return $CLASS_FOR{$type} if exists $CLASS_FOR{$type}; + + # or complain: + require Carp; + Carp::croak("Could not determine class for result type '$type'"); +} + +sub register_type { + my ( $class, $type, $rclass ) = @_; + + # register it blindly, assume they know what they're doing + $CLASS_FOR{$type} = $rclass; + return $class; +} + +1; + +package TAP::Parser::Scheduler; + +use strict; +use warnings; + +use Carp; +use TAP::Parser::Scheduler::Job; +use TAP::Parser::Scheduler::Spinner; + + +our $VERSION = '3.42'; + + +sub new { + my $class = shift; + + croak "Need a number of key, value pairs" if @_ % 2; + + my %args = @_; + my $tests = delete $args{tests} || croak "Need a 'tests' argument"; + my $rules = delete $args{rules} || { par => '**' }; + + croak "Unknown arg(s): ", join ', ', sort keys %args + if keys %args; + + # Turn any simple names into a name, description pair. TODO: Maybe + # construct jobs here? + my $self = bless {}, $class; + + $self->_set_rules( $rules, $tests ); + + return $self; +} + +# Build the scheduler data structure. +# +# SCHEDULER-DATA ::= JOB +# || ARRAY OF ARRAY OF SCHEDULER-DATA +# +# The nested arrays are the key to scheduling. The outer array contains +# a list of things that may be executed in parallel. Whenever an +# eligible job is sought any element of the outer array that is ready to +# execute can be selected. The inner arrays represent sequential +# execution. They can only proceed when the first job is ready to run. + +sub _set_rules { + my ( $self, $rules, $tests ) = @_; + + # Convert all incoming tests to job objects. + # If no test description is provided use the file name as the description. + my @tests = map { TAP::Parser::Scheduler::Job->new(@$_) } + map { 'ARRAY' eq ref $_ ? $_ : [ $_, $_ ] } @$tests; + my $schedule = $self->_rule_clause( $rules, \@tests ); + + # If any tests are left add them as a sequential block at the end of + # the run. + $schedule = [ [ $schedule, @tests ] ] if @tests; + + $self->{schedule} = $schedule; +} + +sub _rule_clause { + my ( $self, $rule, $tests ) = @_; + croak 'Rule clause must be a hash' + unless 'HASH' eq ref $rule; + + my @type = keys %$rule; + croak 'Rule clause must have exactly one key' + unless @type == 1; + + my %handlers = ( + par => sub { + [ map { [$_] } @_ ]; + }, + seq => sub { [ [@_] ] }, + ); + + my $handler = $handlers{ $type[0] } + || croak 'Unknown scheduler type: ', $type[0]; + my $val = $rule->{ $type[0] }; + + return $handler->( + map { + 'HASH' eq ref $_ + ? $self->_rule_clause( $_, $tests ) + : $self->_expand( $_, $tests ) + } 'ARRAY' eq ref $val ? @$val : $val + ); +} + +sub _glob_to_regexp { + my ( $self, $glob ) = @_; + my $nesting; + my $pattern; + + while (1) { + if ( $glob =~ /\G\*\*/gc ) { + + # ** is any number of characters, including /, within a pathname + $pattern .= '.*?'; + } + elsif ( $glob =~ /\G\*/gc ) { + + # * is zero or more characters within a filename/directory name + $pattern .= '[^/]*'; + } + elsif ( $glob =~ /\G\?/gc ) { + + # ? is exactly one character within a filename/directory name + $pattern .= '[^/]'; + } + elsif ( $glob =~ /\G\{/gc ) { + + # {foo,bar,baz} is any of foo, bar or baz. + $pattern .= '(?:'; + ++$nesting; + } + elsif ( $nesting and $glob =~ /\G,/gc ) { + + # , is only special inside {} + $pattern .= '|'; + } + elsif ( $nesting and $glob =~ /\G\}/gc ) { + + # } that matches { is special. But unbalanced } are not. + $pattern .= ')'; + --$nesting; + } + elsif ( $glob =~ /\G(\\.)/gc ) { + + # A quoted literal + $pattern .= $1; + } + elsif ( $glob =~ /\G([\},])/gc ) { + + # Sometimes meta characters + $pattern .= '\\' . $1; + } + else { + + # Eat everything that is not a meta character. + $glob =~ /\G([^{?*\\\},]*)/gc; + $pattern .= quotemeta $1; + } + return $pattern if pos $glob == length $glob; + } +} + +sub _expand { + my ( $self, $name, $tests ) = @_; + + my $pattern = $self->_glob_to_regexp($name); + $pattern = qr/^ $pattern $/x; + my @match = (); + + for ( my $ti = 0; $ti < @$tests; $ti++ ) { + if ( $tests->[$ti]->filename =~ $pattern ) { + push @match, splice @$tests, $ti, 1; + $ti--; + } + } + + return @match; +} + + +sub get_all { + my $self = shift; + my @all = $self->_gather( $self->{schedule} ); + $self->{count} = @all; + @all; +} + +sub _gather { + my ( $self, $rule ) = @_; + return unless defined $rule; + return $rule unless 'ARRAY' eq ref $rule; + return map { defined() ? $self->_gather($_) : () } map {@$_} @$rule; +} + + +sub get_job { + my $self = shift; + $self->{count} ||= $self->get_all; + my @jobs = $self->_find_next_job( $self->{schedule} ); + if (@jobs) { + --$self->{count}; + return $jobs[0]; + } + + return TAP::Parser::Scheduler::Spinner->new + if $self->{count}; + + return; +} + +sub _not_empty { + my $ar = shift; + return 1 unless 'ARRAY' eq ref $ar; + for (@$ar) { + return 1 if _not_empty($_); + } + return; +} + +sub _is_empty { !_not_empty(@_) } + +sub _find_next_job { + my ( $self, $rule ) = @_; + + my @queue = (); + my $index = 0; + while ( $index < @$rule ) { + my $seq = $rule->[$index]; + + # Prune any exhausted items. + shift @$seq while @$seq && _is_empty( $seq->[0] ); + if (@$seq) { + if ( defined $seq->[0] ) { + if ( 'ARRAY' eq ref $seq->[0] ) { + push @queue, $seq; + } + else { + my $job = splice @$seq, 0, 1, undef; + $job->on_finish( sub { shift @$seq } ); + return $job; + } + } + ++$index; + } + else { + + # Remove the empty sub-array from the array + splice @$rule, $index, 1; + } + } + + for my $seq (@queue) { + if ( my @jobs = $self->_find_next_job( $seq->[0] ) ) { + return @jobs; + } + } + + return; +} + + + +sub as_string { + my $self = shift; + return $self->_as_string( $self->{schedule} ); +} + +sub _as_string { + my ( $self, $rule, $depth ) = ( shift, shift, shift || 0 ); + my $pad = ' ' x 2; + my $indent = $pad x $depth; + if ( !defined $rule ) { + return "$indent(undef)\n"; + } + elsif ( 'ARRAY' eq ref $rule ) { + return unless @$rule; + my $type = ( 'par', 'seq' )[ $depth % 2 ]; + return join( + '', "$indent$type:\n", + map { $self->_as_string( $_, $depth + 1 ) } @$rule + ); + } + else { + return "$indent'" . $rule->filename . "'\n"; + } +} + +1; +package TAP::Parser::Grammar; + +use strict; +use warnings; + +use TAP::Parser::ResultFactory (); +use TAP::Parser::YAMLish::Reader (); + +use base 'TAP::Object'; + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object +sub _initialize { + my ( $self, $args ) = @_; + $self->{iterator} = $args->{iterator}; # TODO: accessor + $self->{iterator} ||= $args->{stream}; # deprecated + $self->{parser} = $args->{parser}; # TODO: accessor + $self->set_version( $args->{version} || 12 ); + return $self; +} + +my %language_for; + +{ + + # XXX the 'not' and 'ok' might be on separate lines in VMS ... + my $ok = qr/(?:not )?ok\b/; + my $num = qr/\d+/; + + my %v12 = ( + version => { + syntax => qr/^TAP\s+version\s+(\d+)\s*\z/i, + handler => sub { + my ( $self, $line ) = @_; + my $version = $1; + return $self->_make_version_token( $line, $version, ); + }, + }, + plan => { + syntax => qr/^1\.\.(\d+)\s*(.*)\z/, + handler => sub { + my ( $self, $line ) = @_; + my ( $tests_planned, $tail ) = ( $1, $2 ); + my $explanation = undef; + my $skip = ''; + + if ( $tail =~ /^todo((?:\s+\d+)+)/ ) { + my @todo = split /\s+/, _trim($1); + return $self->_make_plan_token( + $line, $tests_planned, 'TODO', + '', \@todo + ); + } + elsif ( 0 == $tests_planned ) { + $skip = 'SKIP'; + + # If we can't match # SKIP the directive should be undef. + ($explanation) = $tail =~ /^#\s*SKIP\S*\s+(.*)/i; + } + elsif ( $tail !~ /^\s*$/ ) { + return $self->_make_unknown_token($line); + } + + $explanation = '' unless defined $explanation; + + return $self->_make_plan_token( + $line, $tests_planned, $skip, + $explanation, [] + ); + + }, + }, + + # An optimization to handle the most common test lines without + # directives. + simple_test => { + syntax => qr/^($ok) \ ($num) (?:\ ([^#]+))? \z/x, + handler => sub { + my ( $self, $line ) = @_; + my ( $ok, $num, $desc ) = ( $1, $2, $3 ); + + return $self->_make_test_token( + $line, $ok, $num, + $desc + ); + }, + }, + test => { + syntax => qr/^($ok) \s* ($num)? \s* (.*) \z/x, + handler => sub { + my ( $self, $line ) = @_; + my ( $ok, $num, $desc ) = ( $1, $2, $3 ); + my ( $dir, $explanation ) = ( '', '' ); + if ($desc =~ m/^ ( [^\\\#]* (?: \\. [^\\\#]* )* ) + \# \s* (SKIP|TODO) \b \s* (.*) $/ix + ) + { + ( $desc, $dir, $explanation ) = ( $1, $2, $3 ); + } + return $self->_make_test_token( + $line, $ok, $num, $desc, + $dir, $explanation + ); + }, + }, + comment => { + syntax => qr/^#(.*)/, + handler => sub { + my ( $self, $line ) = @_; + my $comment = $1; + return $self->_make_comment_token( $line, $comment ); + }, + }, + bailout => { + syntax => qr/^\s*Bail out!\s*(.*)/, + handler => sub { + my ( $self, $line ) = @_; + my $explanation = $1; + return $self->_make_bailout_token( + $line, + $explanation + ); + }, + }, + ); + + my %v13 = ( + %v12, + plan => { + syntax => qr/^1\.\.(\d+)\s*(?:\s*#\s*SKIP\b(.*))?\z/i, + handler => sub { + my ( $self, $line ) = @_; + my ( $tests_planned, $explanation ) = ( $1, $2 ); + my $skip + = ( 0 == $tests_planned || defined $explanation ) + ? 'SKIP' + : ''; + $explanation = '' unless defined $explanation; + return $self->_make_plan_token( + $line, $tests_planned, $skip, + $explanation, [] + ); + }, + }, + yaml => { + syntax => qr/^ (\s+) (---.*) $/x, + handler => sub { + my ( $self, $line ) = @_; + my ( $pad, $marker ) = ( $1, $2 ); + return $self->_make_yaml_token( $pad, $marker ); + }, + }, + pragma => { + syntax => + qr/^ pragma \s+ ( [-+] \w+ \s* (?: , \s* [-+] \w+ \s* )* ) $/x, + handler => sub { + my ( $self, $line ) = @_; + my $pragmas = $1; + return $self->_make_pragma_token( $line, $pragmas ); + }, + }, + ); + + %language_for = ( + '12' => { + tokens => \%v12, + }, + '13' => { + tokens => \%v13, + setup => sub { + shift->{iterator}->handle_unicode; + }, + }, + ); +} + +############################################################################## + + +sub set_version { + my $self = shift; + my $version = shift; + + if ( my $language = $language_for{$version} ) { + $self->{version} = $version; + $self->{tokens} = $language->{tokens}; + + if ( my $setup = $language->{setup} ) { + $self->$setup(); + } + + $self->_order_tokens; + } + else { + require Carp; + Carp::croak("Unsupported syntax version: $version"); + } +} + +# Optimization to put the most frequent tokens first. +sub _order_tokens { + my $self = shift; + + my %copy = %{ $self->{tokens} }; + my @ordered_tokens = grep {defined} + map { delete $copy{$_} } qw( simple_test test comment plan ); + push @ordered_tokens, values %copy; + + $self->{ordered_tokens} = \@ordered_tokens; +} + +############################################################################## + + +sub tokenize { + my $self = shift; + + my $line = $self->{iterator}->next; + unless ( defined $line ) { + delete $self->{parser}; # break circular ref + return; + } + + my $token; + + for my $token_data ( @{ $self->{ordered_tokens} } ) { + if ( $line =~ $token_data->{syntax} ) { + my $handler = $token_data->{handler}; + $token = $self->$handler($line); + last; + } + } + + $token = $self->_make_unknown_token($line) unless $token; + + return $self->{parser}->make_result($token); +} + +############################################################################## + + +sub token_types { + my $self = shift; + return keys %{ $self->{tokens} }; +} + +############################################################################## + + +sub syntax_for { + my ( $self, $type ) = @_; + return $self->{tokens}->{$type}->{syntax}; +} + +############################################################################## + + +sub handler_for { + my ( $self, $type ) = @_; + return $self->{tokens}->{$type}->{handler}; +} + +sub _make_version_token { + my ( $self, $line, $version ) = @_; + return { + type => 'version', + raw => $line, + version => $version, + }; +} + +sub _make_plan_token { + my ( $self, $line, $tests_planned, $directive, $explanation, $todo ) = @_; + + if ( $directive eq 'SKIP' + && 0 != $tests_planned + && $self->{version} < 13 ) + { + warn + "Specified SKIP directive in plan but more than 0 tests ($line)\n"; + } + + return { + type => 'plan', + raw => $line, + tests_planned => $tests_planned, + directive => $directive, + explanation => _trim($explanation), + todo_list => $todo, + }; +} + +sub _make_test_token { + my ( $self, $line, $ok, $num, $desc, $dir, $explanation ) = @_; + return { + ok => $ok, + + # forcing this to be an integer (and not a string) reduces memory + # consumption. RT #84939 + test_num => ( defined $num ? 0 + $num : undef ), + description => _trim($desc), + directive => ( defined $dir ? uc $dir : '' ), + explanation => _trim($explanation), + raw => $line, + type => 'test', + }; +} + +sub _make_unknown_token { + my ( $self, $line ) = @_; + return { + raw => $line, + type => 'unknown', + }; +} + +sub _make_comment_token { + my ( $self, $line, $comment ) = @_; + return { + type => 'comment', + raw => $line, + comment => _trim($comment) + }; +} + +sub _make_bailout_token { + my ( $self, $line, $explanation ) = @_; + return { + type => 'bailout', + raw => $line, + bailout => _trim($explanation) + }; +} + +sub _make_yaml_token { + my ( $self, $pad, $marker ) = @_; + + my $yaml = TAP::Parser::YAMLish::Reader->new; + + my $iterator = $self->{iterator}; + + # Construct a reader that reads from our input stripping leading + # spaces from each line. + my $leader = length($pad); + my $strip = qr{ ^ (\s{$leader}) (.*) $ }x; + my @extra = ($marker); + my $reader = sub { + return shift @extra if @extra; + my $line = $iterator->next; + return $2 if $line =~ $strip; + return; + }; + + my $data = $yaml->read($reader); + + # Reconstitute input. This is convoluted. Maybe we should just + # record it on the way in... + chomp( my $raw = $yaml->get_raw ); + $raw =~ s/^/$pad/mg; + + return { + type => 'yaml', + raw => $raw, + data => $data + }; +} + +sub _make_pragma_token { + my ( $self, $line, $pragmas ) = @_; + return { + type => 'pragma', + raw => $line, + pragmas => [ split /\s*,\s*/, _trim($pragmas) ], + }; +} + +sub _trim { + my $data = shift; + + return '' unless defined $data; + + $data =~ s/^\s+//; + $data =~ s/\s+$//; + return $data; +} + +1; + +package TAP::Parser::Source; + +use strict; +use warnings; + +use File::Basename qw( fileparse ); +use base 'TAP::Object'; + +use constant BLK_SIZE => 512; + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object + +sub _initialize { + my ($self) = @_; + $self->meta( {} ); + $self->config( {} ); + return $self; +} + +############################################################################## + + +sub raw { + my $self = shift; + return $self->{raw} unless @_; + $self->{raw} = shift; + return $self; +} + +sub meta { + my $self = shift; + return $self->{meta} unless @_; + $self->{meta} = shift; + return $self; +} + +sub has_meta { + return scalar %{ shift->meta } ? 1 : 0; +} + +sub config { + my $self = shift; + return $self->{config} unless @_; + $self->{config} = shift; + return $self; +} + +sub merge { + my $self = shift; + return $self->{merge} unless @_; + $self->{merge} = shift; + return $self; +} + +sub switches { + my $self = shift; + return $self->{switches} unless @_; + $self->{switches} = shift; + return $self; +} + +sub test_args { + my $self = shift; + return $self->{test_args} unless @_; + $self->{test_args} = shift; + return $self; +} + + +sub assemble_meta { + my ($self) = @_; + + return $self->meta if $self->has_meta; + + my $meta = $self->meta; + my $raw = $self->raw; + + # rudimentary is object test - if it's blessed it'll + # inherit from UNIVERSAL + $meta->{is_object} = UNIVERSAL::isa( $raw, 'UNIVERSAL' ) ? 1 : 0; + + if ( $meta->{is_object} ) { + $meta->{class} = ref($raw); + } + else { + my $ref = lc( ref($raw) ); + $meta->{"is_$ref"} = 1; + } + + if ( $meta->{is_scalar} ) { + my $source = $$raw; + $meta->{length} = length($$raw); + $meta->{has_newlines} = $$raw =~ /\n/ ? 1 : 0; + + # only do file checks if it looks like a filename + if ( !$meta->{has_newlines} and $meta->{length} < 1024 ) { + my $file = {}; + $file->{exists} = -e $source ? 1 : 0; + if ( $file->{exists} ) { + $meta->{file} = $file; + + # avoid extra system calls (see `perldoc -f -X`) + $file->{stat} = [ stat(_) ]; + $file->{empty} = -z _ ? 1 : 0; + $file->{size} = -s _; + $file->{text} = -T _ ? 1 : 0; + $file->{binary} = -B _ ? 1 : 0; + $file->{read} = -r _ ? 1 : 0; + $file->{write} = -w _ ? 1 : 0; + $file->{execute} = -x _ ? 1 : 0; + $file->{setuid} = -u _ ? 1 : 0; + $file->{setgid} = -g _ ? 1 : 0; + $file->{sticky} = -k _ ? 1 : 0; + + $meta->{is_file} = $file->{is_file} = -f _ ? 1 : 0; + $meta->{is_dir} = $file->{is_dir} = -d _ ? 1 : 0; + + # symlink check requires another system call + $meta->{is_symlink} = $file->{is_symlink} + = -l $source ? 1 : 0; + if ( $file->{is_symlink} ) { + $file->{lstat} = [ lstat(_) ]; + } + + # put together some common info about the file + ( $file->{basename}, $file->{dir}, $file->{ext} ) + = map { defined $_ ? $_ : '' } + fileparse( $source, qr/\.[^.]*/ ); + $file->{lc_ext} = lc( $file->{ext} ); + $file->{basename} .= $file->{ext} if $file->{ext}; + + if ( !$file->{is_dir} && $file->{read} ) { + eval { $file->{shebang} = $self->shebang($$raw); }; + if ( my $e = $@ ) { + warn $e; + } + } + } + } + } + elsif ( $meta->{is_array} ) { + $meta->{size} = $#$raw + 1; + } + elsif ( $meta->{is_hash} ) { + ; # do nothing + } + + return $meta; +} + + +{ + + # Global shebang cache. + my %shebang_for; + + sub _read_shebang { + my ( $class, $file ) = @_; + open my $fh, '<', $file or die "Can't read $file: $!\n"; + + # Might be a binary file - so read a fixed number of bytes. + my $got = read $fh, my ($buf), BLK_SIZE; + defined $got or die "I/O error: $!\n"; + return $1 if $buf =~ /(.*)/; + return; + } + + sub shebang { + my ( $class, $file ) = @_; + $shebang_for{$file} = $class->_read_shebang($file) + unless exists $shebang_for{$file}; + return $shebang_for{$file}; + } +} + + +sub config_for { + my ( $self, $class ) = @_; + my ($abbrv_class) = ( $class =~ /(?:\:\:)?(\w+)$/ ); + my $config = $self->config->{$abbrv_class} || $self->config->{$class}; + return $config; +} + +1; + +__END__ + +package TAP::Parser::Result; + +use strict; +use warnings; + +use base 'TAP::Object'; + +BEGIN { + + # make is_* methods + my @attrs = qw( plan pragma test comment bailout version unknown yaml ); + no strict 'refs'; + for my $token (@attrs) { + my $method = "is_$token"; + *$method = sub { return $token eq shift->type }; + } +} + +############################################################################## + + +our $VERSION = '3.42'; + + +# new() implementation provided by TAP::Object + +sub _initialize { + my ( $self, $token ) = @_; + if ($token) { + + # assign to a hash slice to make a shallow copy of the token. + # I guess we could assign to the hash as (by default) there are not + # contents, but that seems less helpful if someone wants to subclass us + @{$self}{ keys %$token } = values %$token; + } + return $self; +} + +############################################################################## + + +############################################################################## + + +sub raw { shift->{raw} } + +############################################################################## + + +sub type { shift->{type} } + +############################################################################## + + +sub as_string { shift->{raw} } + +############################################################################## + + +sub is_ok {1} + +############################################################################## + + +sub passed { + warn 'passed() is deprecated. Please use "is_ok()"'; + shift->is_ok; +} + +############################################################################## + + +sub has_directive { + my $self = shift; + return ( $self->has_todo || $self->has_skip ); +} + +############################################################################## + + +sub has_todo { 'TODO' eq ( shift->{directive} || '' ) } + +############################################################################## + + +sub has_skip { 'SKIP' eq ( shift->{directive} || '' ) } + + +sub set_directive { + my ( $self, $dir ) = @_; + $self->{directive} = $dir; +} + +1; + +package TAP::Parser::SourceHandler; + +use strict; +use warnings; + +use TAP::Parser::Iterator (); +use base 'TAP::Object'; + + +our $VERSION = '3.42'; + + +sub can_handle { + my ( $class, $args ) = @_; + $class->_croak( + "Abstract method 'can_handle' not implemented for $class!"); + return; +} + + +sub make_iterator { + my ( $class, $args ) = @_; + $class->_croak( + "Abstract method 'make_iterator' not implemented for $class!"); + return; +} +1; + +__END__ + + +package TAP::Parser::Aggregator; + +use strict; +use warnings; +use Benchmark; + +use base 'TAP::Object'; + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object + +my %SUMMARY_METHOD_FOR; + +BEGIN { # install summary methods + %SUMMARY_METHOD_FOR = map { $_ => $_ } qw( + failed + parse_errors + passed + skipped + todo + todo_passed + total + wait + exit + ); + $SUMMARY_METHOD_FOR{total} = 'tests_run'; + $SUMMARY_METHOD_FOR{planned} = 'tests_planned'; + + for my $method ( keys %SUMMARY_METHOD_FOR ) { + next if 'total' eq $method; + no strict 'refs'; + *$method = sub { + my $self = shift; + return wantarray + ? @{ $self->{"descriptions_for_$method"} } + : $self->{$method}; + }; + } +} # end install summary methods + +sub _initialize { + my ($self) = @_; + $self->{parser_for} = {}; + $self->{parse_order} = []; + for my $summary ( keys %SUMMARY_METHOD_FOR ) { + $self->{$summary} = 0; + next if 'total' eq $summary; + $self->{"descriptions_for_$summary"} = []; + } + return $self; +} + +############################################################################## + + +sub add { + my ( $self, $description, $parser ) = @_; + if ( exists $self->{parser_for}{$description} ) { + $self->_croak( "You already have a parser for ($description)." + . " Perhaps you have run the same test twice." ); + } + push @{ $self->{parse_order} } => $description; + $self->{parser_for}{$description} = $parser; + + while ( my ( $summary, $method ) = each %SUMMARY_METHOD_FOR ) { + + # Slightly nasty. Instead we should maybe have 'cooked' accessors + # for results that may be masked by the parser. + next + if ( $method eq 'exit' || $method eq 'wait' ) + && $parser->ignore_exit; + + if ( my $count = $parser->$method() ) { + $self->{$summary} += $count; + push @{ $self->{"descriptions_for_$summary"} } => $description; + } + } + + return $self; +} + +############################################################################## + + +sub parsers { + my $self = shift; + return $self->_get_parsers(@_) if @_; + my $descriptions = $self->{parse_order}; + my @parsers = @{ $self->{parser_for} }{@$descriptions}; + + # Note: Because of the way context works, we must assign the parsers to + # the @parsers array or else this method does not work as documented. + return @parsers; +} + +sub _get_parsers { + my ( $self, @descriptions ) = @_; + my @parsers; + for my $description (@descriptions) { + $self->_croak("A parser for ($description) could not be found") + unless exists $self->{parser_for}{$description}; + push @parsers => $self->{parser_for}{$description}; + } + return wantarray ? @parsers : \@parsers; +} + + +sub descriptions { @{ shift->{parse_order} || [] } } + + +sub start { + my $self = shift; + $self->{start_time} = Benchmark->new; +} + + +sub stop { + my $self = shift; + $self->{end_time} = Benchmark->new; +} + + +sub elapsed { + my $self = shift; + + require Carp; + Carp::croak + q{Can't call elapsed without first calling start and then stop} + unless defined $self->{start_time} && defined $self->{end_time}; + return timediff( $self->{end_time}, $self->{start_time} ); +} + + +sub elapsed_timestr { + my $self = shift; + + my $elapsed = $self->elapsed; + + return timestr($elapsed); +} + + +sub all_passed { + my $self = shift; + return + $self->total + && $self->total == $self->passed + && !$self->has_errors; +} + + +sub get_status { + my $self = shift; + + my $total = $self->total; + my $passed = $self->passed; + + return + ( $self->has_errors || $total != $passed ) ? 'FAIL' + : $total ? 'PASS' + : 'NOTESTS'; +} + +############################################################################## + + +############################################################################## + + +sub total { shift->{total} } + +############################################################################## + + +sub has_problems { + my $self = shift; + return $self->todo_passed + || $self->has_errors; +} + +############################################################################## + + +sub has_errors { + my $self = shift; + return + $self->failed + || $self->parse_errors + || $self->exit + || $self->wait; +} + +############################################################################## + + +sub todo_failed { + warn + '"todo_failed" is deprecated. Please use "todo_passed". See the docs.'; + goto &todo_passed; +} + + +1; +package TAP::Parser::Iterator::Array; + +use strict; +use warnings; + +use base 'TAP::Parser::Iterator'; + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object + +sub _initialize { + my ( $self, $thing ) = @_; + chomp @$thing; + $self->{idx} = 0; + $self->{array} = $thing; + $self->{exit} = undef; + return $self; +} + +sub wait { shift->exit } + +sub exit { + my $self = shift; + return 0 if $self->{idx} >= @{ $self->{array} }; + return; +} + +sub next_raw { + my $self = shift; + return $self->{array}->[ $self->{idx}++ ]; +} + +1; + + +package TAP::Parser::Iterator::Process; + +use strict; +use warnings; + +use Config; +use IO::Handle; + +use base 'TAP::Parser::Iterator'; + +my $IS_WIN32 = ( $^O =~ /^(MS)?Win32$/ ); + + +our $VERSION = '3.42'; + + +{ + + no warnings 'uninitialized'; + # get around a catch22 in the test suite that causes failures on Win32: + local $SIG{__DIE__} = undef; + eval { require POSIX; &POSIX::WEXITSTATUS(0) }; + if ($@) { + *_wait2exit = sub { $_[1] >> 8 }; + } + else { + *_wait2exit = sub { POSIX::WEXITSTATUS( $_[1] ) } + } +} + +sub _use_open3 { + my $self = shift; + return unless $Config{d_fork} || $IS_WIN32; + for my $module (qw( IPC::Open3 IO::Select )) { + eval "use $module"; + return if $@; + } + return 1; +} + +{ + my $got_unicode; + + sub _get_unicode { + return $got_unicode if defined $got_unicode; + eval 'use Encode qw(decode_utf8);'; + $got_unicode = $@ ? 0 : 1; + + } +} + +# new() implementation supplied by TAP::Object + +sub _initialize { + my ( $self, $args ) = @_; + + my @command = @{ delete $args->{command} || [] } + or die "Must supply a command to execute"; + + $self->{command} = [@command]; + + # Private. Used to frig with chunk size during testing. + my $chunk_size = delete $args->{_chunk_size} || 65536; + + my $merge = delete $args->{merge}; + my ( $pid, $err, $sel ); + + if ( my $setup = delete $args->{setup} ) { + $setup->(@command); + } + + my $out = IO::Handle->new; + + if ( $self->_use_open3 ) { + + # HOTPATCH {{{ + my $xclose = \&IPC::Open3::xclose; + no warnings; + local *IPC::Open3::xclose = sub { + my $fh = shift; + no strict 'refs'; + return if ( fileno($fh) == fileno(STDIN) ); + $xclose->($fh); + }; + + # }}} + + if ($IS_WIN32) { + $err = $merge ? '' : '>&STDERR'; + eval { + $pid = open3( + '<&STDIN', $out, $merge ? '' : $err, + @command + ); + }; + die "Could not execute (@command): $@" if $@; + if ( $] >= 5.006 ) { + binmode($out, ":crlf"); + } + } + else { + $err = $merge ? '' : IO::Handle->new; + eval { $pid = open3( '<&STDIN', $out, $err, @command ); }; + die "Could not execute (@command): $@" if $@; + $sel = $merge ? undef : IO::Select->new( $out, $err ); + } + } + else { + $err = ''; + my $command + = join( ' ', map { $_ =~ /\s/ ? qq{"$_"} : $_ } @command ); + open( $out, "$command|" ) + or die "Could not execute ($command): $!"; + } + + $self->{out} = $out; + $self->{err} = $err; + $self->{sel} = $sel; + $self->{pid} = $pid; + $self->{exit} = undef; + $self->{chunk_size} = $chunk_size; + + if ( my $teardown = delete $args->{teardown} ) { + $self->{teardown} = sub { + $teardown->(@command); + }; + } + + return $self; +} + + +sub handle_unicode { + my $self = shift; + + if ( $self->{sel} ) { + if ( _get_unicode() ) { + + # Make sure our iterator has been constructed and... + my $next = $self->{_next} ||= $self->_next; + + # ...wrap it to do UTF8 casting + $self->{_next} = sub { + my $line = $next->(); + return decode_utf8($line) if defined $line; + return; + }; + } + } + else { + if ( $] >= 5.008 ) { + eval 'binmode($self->{out}, ":utf8")'; + } + } + +} + +############################################################################## + +sub wait { shift->{wait} } +sub exit { shift->{exit} } + +sub _next { + my $self = shift; + + if ( my $out = $self->{out} ) { + if ( my $sel = $self->{sel} ) { + my $err = $self->{err}; + my @buf = (); + my $partial = ''; # Partial line + my $chunk_size = $self->{chunk_size}; + return sub { + return shift @buf if @buf; + + READ: + while ( my @ready = $sel->can_read ) { + for my $fh (@ready) { + my $got = sysread $fh, my ($chunk), $chunk_size; + + if ( $got == 0 ) { + $sel->remove($fh); + } + elsif ( $fh == $err ) { + print STDERR $chunk; # echo STDERR + } + else { + $chunk = $partial . $chunk; + $partial = ''; + + # Make sure we have a complete line + unless ( substr( $chunk, -1, 1 ) eq "\n" ) { + my $nl = rindex $chunk, "\n"; + if ( $nl == -1 ) { + $partial = $chunk; + redo READ; + } + else { + $partial = substr( $chunk, $nl + 1 ); + $chunk = substr( $chunk, 0, $nl ); + } + } + + push @buf, split /\n/, $chunk; + return shift @buf if @buf; + } + } + } + + # Return partial last line + if ( length $partial ) { + my $last = $partial; + $partial = ''; + return $last; + } + + $self->_finish; + return; + }; + } + else { + return sub { + if ( defined( my $line = <$out> ) ) { + chomp $line; + return $line; + } + $self->_finish; + return; + }; + } + } + else { + return sub { + $self->_finish; + return; + }; + } +} + +sub next_raw { + my $self = shift; + return ( $self->{_next} ||= $self->_next )->(); +} + +sub _finish { + my $self = shift; + + my $status = $?; + + # Avoid circular refs + $self->{_next} = sub {return} + if $] >= 5.006; + + # If we have a subprocess we need to wait for it to terminate + if ( defined $self->{pid} ) { + if ( $self->{pid} == waitpid( $self->{pid}, 0 ) ) { + $status = $?; + } + } + + ( delete $self->{out} )->close if $self->{out}; + + # If we have an IO::Select we also have an error handle to close. + if ( $self->{sel} ) { + ( delete $self->{err} )->close; + delete $self->{sel}; + } + else { + $status = $?; + } + + # Sometimes we get -1 on Windows. Presumably that means status not + # available. + $status = 0 if $IS_WIN32 && $status == -1; + + $self->{wait} = $status; + $self->{exit} = $self->_wait2exit($status); + + if ( my $teardown = $self->{teardown} ) { + $teardown->(); + } + + return $self; +} + + +sub get_select_handles { + my $self = shift; + return grep $_, ( $self->{out}, $self->{err} ); +} + +1; + + +package TAP::Parser::Iterator::Stream; + +use strict; +use warnings; + +use base 'TAP::Parser::Iterator'; + + +our $VERSION = '3.42'; + + +# new() implementation supplied by TAP::Object + +sub _initialize { + my ( $self, $thing ) = @_; + $self->{fh} = $thing; + return $self; +} + + +sub wait { shift->exit } +sub exit { shift->{fh} ? () : 0 } + +sub next_raw { + my $self = shift; + my $fh = $self->{fh}; + + if ( defined( my $line = <$fh> ) ) { + chomp $line; + return $line; + } + else { + $self->_finish; + return; + } +} + +sub _finish { + my $self = shift; + close delete $self->{fh}; +} + +sub get_select_handles { + my $self = shift; + + # return our handle in case it's a socket or pipe (select()-able) + return ( $self->{fh}, ) + if (-S $self->{fh} || -p $self->{fh}); + + return; +} + +1; + + +package TAP::Parser::YAMLish::Reader; + +use strict; +use warnings; + +use base 'TAP::Object'; + +our $VERSION = '3.42'; + +# TODO: +# Handle blessed object syntax + +# Printable characters for escapes +my %UNESCAPES = ( + z => "\x00", a => "\x07", t => "\x09", + n => "\x0a", v => "\x0b", f => "\x0c", + r => "\x0d", e => "\x1b", '\\' => '\\', +); + +my $QQ_STRING = qr{ " (?:\\. | [^"])* " }x; +my $HASH_LINE = qr{ ^ ($QQ_STRING|\S+) \s* : \s* (?: (.+?) \s* )? $ }x; +my $IS_HASH_KEY = qr{ ^ [\w\'\"] }x; +my $IS_END_YAML = qr{ ^ \.\.\. \s* $ }x; +my $IS_QQ_STRING = qr{ ^ $QQ_STRING $ }x; + +# new() implementation supplied by TAP::Object + +sub read { + my $self = shift; + my $obj = shift; + + die "Must have a code reference to read input from" + unless ref $obj eq 'CODE'; + + $self->{reader} = $obj; + $self->{capture} = []; + + # Prime the reader + $self->_next; + return unless $self->{next}; + + my $doc = $self->_read; + + # The terminator is mandatory otherwise we'd consume a line from the + # iterator that doesn't belong to us. If we want to remove this + # restriction we'll have to implement look-ahead in the iterators. + # Which might not be a bad idea. + my $dots = $self->_peek; + die "Missing '...' at end of YAMLish" + unless defined $dots + and $dots =~ $IS_END_YAML; + + delete $self->{reader}; + delete $self->{next}; + + return $doc; +} + +sub get_raw { join( "\n", grep defined, @{ shift->{capture} || [] } ) . "\n" } + +sub _peek { + my $self = shift; + return $self->{next} unless wantarray; + my $line = $self->{next}; + $line =~ /^ (\s*) (.*) $ /x; + return ( $2, length $1 ); +} + +sub _next { + my $self = shift; + die "_next called with no reader" + unless $self->{reader}; + my $line = $self->{reader}->(); + $self->{next} = $line; + push @{ $self->{capture} }, $line; +} + +sub _read { + my $self = shift; + + my $line = $self->_peek; + + # Do we have a document header? + if ( $line =~ /^ --- (?: \s* (.+?)? \s* )? $/x ) { + $self->_next; + + return $self->_read_scalar($1) if defined $1; # Inline? + + my ( $next, $indent ) = $self->_peek; + + if ( $next =~ /^ - /x ) { + return $self->_read_array($indent); + } + elsif ( $next =~ $IS_HASH_KEY ) { + return $self->_read_hash( $next, $indent ); + } + elsif ( $next =~ $IS_END_YAML ) { + die "Premature end of YAMLish"; + } + else { + die "Unsupported YAMLish syntax: '$next'"; + } + } + else { + die "YAMLish document header not found"; + } +} + +# Parse a double quoted string +sub _read_qq { + my $self = shift; + my $str = shift; + + unless ( $str =~ s/^ " (.*?) " $/$1/x ) { + die "Internal: not a quoted string"; + } + + $str =~ s/\\"/"/gx; + $str =~ s/ \\ ( [tartan\\favez] | x([0-9a-fA-F]{2}) ) + / (length($1) > 1) ? pack("H2", $2) : $UNESCAPES{$1} /gex; + return $str; +} + +# Parse a scalar string to the actual scalar +sub _read_scalar { + my $self = shift; + my $string = shift; + + return undef if $string eq '~'; + return {} if $string eq '{}'; + return [] if $string eq '[]'; + + if ( $string eq '>' || $string eq '|' ) { + + my ( $line, $indent ) = $self->_peek; + die "Multi-line scalar content missing" unless defined $line; + + my @multiline = ($line); + + while (1) { + $self->_next; + my ( $next, $ind ) = $self->_peek; + last if $ind < $indent; + + my $pad = $string eq '|' ? ( ' ' x ( $ind - $indent ) ) : ''; + push @multiline, $pad . $next; + } + + return join( ( $string eq '>' ? ' ' : "\n" ), @multiline ) . "\n"; + } + + if ( $string =~ /^ ' (.*) ' $/x ) { + ( my $rv = $1 ) =~ s/''/'/g; + return $rv; + } + + if ( $string =~ $IS_QQ_STRING ) { + return $self->_read_qq($string); + } + + if ( $string =~ /^['"]/ ) { + + # A quote with folding... we don't support that + die __PACKAGE__ . " does not support multi-line quoted scalars"; + } + + # Regular unquoted string + return $string; +} + +sub _read_nested { + my $self = shift; + + my ( $line, $indent ) = $self->_peek; + + if ( $line =~ /^ -/x ) { + return $self->_read_array($indent); + } + elsif ( $line =~ $IS_HASH_KEY ) { + return $self->_read_hash( $line, $indent ); + } + else { + die "Unsupported YAMLish syntax: '$line'"; + } +} + +# Parse an array +sub _read_array { + my ( $self, $limit ) = @_; + + my $ar = []; + + while (1) { + my ( $line, $indent ) = $self->_peek; + last + if $indent < $limit + || !defined $line + || $line =~ $IS_END_YAML; + + if ( $indent > $limit ) { + die "Array line over-indented"; + } + + if ( $line =~ /^ (- \s+) \S+ \s* : (?: \s+ | $ ) /x ) { + $indent += length $1; + $line =~ s/-\s+//; + push @$ar, $self->_read_hash( $line, $indent ); + } + elsif ( $line =~ /^ - \s* (.+?) \s* $/x ) { + die "Unexpected start of YAMLish" if $line =~ /^---/; + $self->_next; + push @$ar, $self->_read_scalar($1); + } + elsif ( $line =~ /^ - \s* $/x ) { + $self->_next; + push @$ar, $self->_read_nested; + } + elsif ( $line =~ $IS_HASH_KEY ) { + $self->_next; + push @$ar, $self->_read_hash( $line, $indent, ); + } + else { + die "Unsupported YAMLish syntax: '$line'"; + } + } + + return $ar; +} + +sub _read_hash { + my ( $self, $line, $limit ) = @_; + + my $indent; + my $hash = {}; + + while (1) { + die "Badly formed hash line: '$line'" + unless $line =~ $HASH_LINE; + + my ( $key, $value ) = ( $self->_read_scalar($1), $2 ); + $self->_next; + + if ( defined $value ) { + $hash->{$key} = $self->_read_scalar($value); + } + else { + $hash->{$key} = $self->_read_nested; + } + + ( $line, $indent ) = $self->_peek; + last + if $indent < $limit + || !defined $line + || $line =~ $IS_END_YAML; + } + + return $hash; +} + +1; + +__END__ + + +package TAP::Parser::YAMLish::Writer; + +use strict; +use warnings; + +use base 'TAP::Object'; + +our $VERSION = '3.42'; + +my $ESCAPE_CHAR = qr{ [ \x00-\x1f \" ] }x; +my $ESCAPE_KEY = qr{ (?: ^\W ) | $ESCAPE_CHAR }x; + +my @UNPRINTABLE = qw( + z x01 x02 x03 x04 x05 x06 a + x08 t n v f r x0e x0f + x10 x11 x12 x13 x14 x15 x16 x17 + x18 x19 x1a e x1c x1d x1e x1f +); + +# new() implementation supplied by TAP::Object + +sub write { + my $self = shift; + + die "Need something to write" + unless @_; + + my $obj = shift; + my $out = shift || \*STDOUT; + + die "Need a reference to something I can write to" + unless ref $out; + + $self->{writer} = $self->_make_writer($out); + + $self->_write_obj( '---', $obj ); + $self->_put('...'); + + delete $self->{writer}; +} + +sub _make_writer { + my $self = shift; + my $out = shift; + + my $ref = ref $out; + + if ( 'CODE' eq $ref ) { + return $out; + } + elsif ( 'ARRAY' eq $ref ) { + return sub { push @$out, shift }; + } + elsif ( 'SCALAR' eq $ref ) { + return sub { $$out .= shift() . "\n" }; + } + elsif ( 'GLOB' eq $ref || 'IO::Handle' eq $ref ) { + return sub { print $out shift(), "\n" }; + } + + die "Can't write to $out"; +} + +sub _put { + my $self = shift; + $self->{writer}->( join '', @_ ); +} + +sub _enc_scalar { + my $self = shift; + my $val = shift; + my $rule = shift; + + return '~' unless defined $val; + + if ( $val =~ /$rule/ ) { + $val =~ s/\\/\\\\/g; + $val =~ s/"/\\"/g; + $val =~ s/ ( [\x00-\x1f] ) / '\\' . $UNPRINTABLE[ ord($1) ] /gex; + return qq{"$val"}; + } + + if ( length($val) == 0 or $val =~ /\s/ ) { + $val =~ s/'/''/; + return "'$val'"; + } + + return $val; +} + +sub _write_obj { + my $self = shift; + my $prefix = shift; + my $obj = shift; + my $indent = shift || 0; + + if ( my $ref = ref $obj ) { + my $pad = ' ' x $indent; + if ( 'HASH' eq $ref ) { + if ( keys %$obj ) { + $self->_put($prefix); + for my $key ( sort keys %$obj ) { + my $value = $obj->{$key}; + $self->_write_obj( + $pad . $self->_enc_scalar( $key, $ESCAPE_KEY ) . ':', + $value, $indent + 1 + ); + } + } + else { + $self->_put( $prefix, ' {}' ); + } + } + elsif ( 'ARRAY' eq $ref ) { + if (@$obj) { + $self->_put($prefix); + for my $value (@$obj) { + $self->_write_obj( + $pad . '-', $value, + $indent + 1 + ); + } + } + else { + $self->_put( $prefix, ' []' ); + } + } + else { + die "Don't know how to encode $ref"; + } + } + else { + $self->_put( $prefix, ' ', $self->_enc_scalar( $obj, $ESCAPE_CHAR ) ); + } +} + +1; + +__END__ + + +package TAP::Parser::Scheduler::Job; + +use strict; +use warnings; +use Carp; + + +our $VERSION = '3.42'; + + +sub new { + my ( $class, $name, $desc, @ctx ) = @_; + return bless { + filename => $name, + description => $desc, + @ctx ? ( context => \@ctx ) : (), + }, $class; +} + + +sub on_finish { + my ( $self, $cb ) = @_; + $self->{on_finish} = $cb; +} + + +sub finish { + my $self = shift; + if ( my $cb = $self->{on_finish} ) { + $cb->($self); + } +} + + +sub filename { shift->{filename} } +sub description { shift->{description} } +sub context { @{ shift->{context} || [] } } + + +sub as_array_ref { + my $self = shift; + return [ $self->filename, $self->description, $self->{context} ||= [] ]; +} + + +sub is_spinner {0} + +1; +package TAP::Parser::Scheduler::Spinner; + +use strict; +use warnings; +use Carp; + + +our $VERSION = '3.42'; + + +sub new { bless {}, shift } + + +sub is_spinner {1} + + +1; +package TAP::Parser::Result::Test; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub ok { shift->{ok} } + +############################################################################## + + +sub number { shift->{test_num} } + +sub _number { + my ( $self, $number ) = @_; + $self->{test_num} = $number; +} + +############################################################################## + + +sub description { shift->{description} } + +############################################################################## + + +sub directive { shift->{directive} } + +############################################################################## + + +sub explanation { shift->{explanation} } + +############################################################################## + + +sub is_ok { + my $self = shift; + + return if $self->is_unplanned; + + # TODO directives reverse the sense of a test. + return $self->has_todo ? 1 : $self->ok !~ /not/; +} + +############################################################################## + + +sub is_actual_ok { + my $self = shift; + return $self->{ok} !~ /not/; +} + +############################################################################## + + +sub actual_passed { + warn 'actual_passed() is deprecated. Please use "is_actual_ok()"'; + goto &is_actual_ok; +} + +############################################################################## + + +sub todo_passed { + my $self = shift; + return $self->has_todo && $self->is_actual_ok; +} + +############################################################################## + + +sub todo_failed { + warn 'todo_failed() is deprecated. Please use "todo_passed()"'; + goto &todo_passed; +} + +############################################################################## + + +sub as_string { + my $self = shift; + my $string = $self->ok . " " . $self->number; + if ( my $description = $self->description ) { + $string .= " $description"; + } + if ( my $directive = $self->directive ) { + my $explanation = $self->explanation; + $string .= " # $directive $explanation"; + } + return $string; +} + +############################################################################## + + +sub is_unplanned { + my $self = shift; + return ( $self->{unplanned} || '' ) unless @_; + $self->{unplanned} = !!shift; + return $self; +} + +1; +package TAP::Parser::Result::YAML; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub data { shift->{data} } + +1; +package TAP::Parser::Result::Version; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub version { shift->{version} } + +1; +package TAP::Parser::Result::Comment; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub comment { shift->{comment} } +sub as_string { shift->{raw} } + +1; +package TAP::Parser::Result::Bailout; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub explanation { shift->{bailout} } +sub as_string { shift->{bailout} } + +1; +package TAP::Parser::Result::Unknown; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +1; +package TAP::Parser::Result::Pragma; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub pragmas { + my @pragmas = @{ shift->{pragmas} }; + return wantarray ? @pragmas : \@pragmas; +} + +1; +package TAP::Parser::Result::Plan; + +use strict; +use warnings; + +use base 'TAP::Parser::Result'; + + +our $VERSION = '3.42'; + + +############################################################################## + + +sub plan { '1..' . shift->{tests_planned} } + +############################################################################## + + +sub tests_planned { shift->{tests_planned} } + +############################################################################## + + +sub directive { shift->{directive} } + +############################################################################## + + +sub explanation { shift->{explanation} } + + +sub todo_list { shift->{todo_list} } + +1; +package TAP::Parser::SourceHandler::Executable; + +use strict; +use warnings; + +use TAP::Parser::IteratorFactory (); +use TAP::Parser::Iterator::Process (); + +use base 'TAP::Parser::SourceHandler'; + +TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); + + +our $VERSION = '3.42'; + + +sub can_handle { + my ( $class, $src ) = @_; + my $meta = $src->meta; + + if ( $meta->{is_file} ) { + my $file = $meta->{file}; + + return 0.85 if $file->{execute} && $file->{binary}; + return 0.8 if $file->{lc_ext} eq '.bat'; + return 0.25 if $file->{execute}; + } + elsif ( $meta->{is_hash} ) { + return 0.9 if $src->raw->{exec}; + } + + return 0; +} + + +sub make_iterator { + my ( $class, $source ) = @_; + my $meta = $source->meta; + + my @command; + if ( $meta->{is_hash} ) { + @command = @{ $source->raw->{exec} || [] }; + } + elsif ( $meta->{is_scalar} ) { + @command = ${ $source->raw }; + } + elsif ( $meta->{is_array} ) { + @command = @{ $source->raw }; + } + + $class->_croak('No command found in $source->raw!') unless @command; + + $class->_autoflush( \*STDOUT ); + $class->_autoflush( \*STDERR ); + + push @command, @{ $source->test_args || [] }; + + return $class->iterator_class->new( + { command => \@command, + merge => $source->merge + } + ); +} + + +use constant iterator_class => 'TAP::Parser::Iterator::Process'; + +# Turns on autoflush for the handle passed +sub _autoflush { + my ( $class, $flushed ) = @_; + my $old_fh = select $flushed; + $| = 1; + select $old_fh; +} + +1; + +package TAP::Parser::SourceHandler::RawTAP; + +use strict; +use warnings; + +use TAP::Parser::IteratorFactory (); +use TAP::Parser::Iterator::Array (); + +use base 'TAP::Parser::SourceHandler'; + +TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); + + +our $VERSION = '3.42'; + + +sub can_handle { + my ( $class, $src ) = @_; + my $meta = $src->meta; + + return 0 if $meta->{file}; + if ( $meta->{is_scalar} ) { + return 0 unless $meta->{has_newlines}; + return 0.9 if ${ $src->raw } =~ /\d\.\.\d/; + return 0.7 if ${ $src->raw } =~ /ok/; + return 0.3; + } + elsif ( $meta->{is_array} ) { + return 0.5; + } + return 0; +} + + +sub make_iterator { + my ( $class, $src ) = @_; + my $meta = $src->meta; + + my $tap_array; + if ( $meta->{is_scalar} ) { + $tap_array = [ split "\n" => ${ $src->raw } ]; + } + elsif ( $meta->{is_array} ) { + $tap_array = $src->raw; + } + + $class->_croak('No raw TAP found in $source->raw') + unless scalar $tap_array; + + return TAP::Parser::Iterator::Array->new($tap_array); +} + +1; + +package TAP::Parser::SourceHandler::Perl; + +use strict; +use warnings; +use Config; + +use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ ); +use constant IS_VMS => ( $^O eq 'VMS' ); + +use TAP::Parser::IteratorFactory (); +use TAP::Parser::Iterator::Process (); +use Text::ParseWords qw(shellwords); + +use base 'TAP::Parser::SourceHandler::Executable'; + +TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); + + +our $VERSION = '3.42'; + + +sub can_handle { + my ( $class, $source ) = @_; + my $meta = $source->meta; + + return 0 unless $meta->{is_file}; + my $file = $meta->{file}; + + if ( my $shebang = $file->{shebang} ) { + return 0.9 if $shebang =~ /^#!.*\bperl/; + + # We favour Perl as the interpreter for any shebang to preserve + # previous semantics: we used to execute everything via Perl and + # relied on it to pass the shebang off to the appropriate + # interpreter. + return 0.3; + } + + return 0.8 if $file->{lc_ext} eq '.t'; # vote higher than Executable + return 0.9 if $file->{lc_ext} eq '.pl'; + + return 0.75 if $file->{dir} =~ /^t\b/; # vote higher than Executable + + # backwards compat, always vote: + return 0.25; +} + + +sub _autoflush_stdhandles { + my ($class) = @_; + + $class->_autoflush( \*STDOUT ); + $class->_autoflush( \*STDERR ); +} + +sub make_iterator { + my ( $class, $source ) = @_; + my $meta = $source->meta; + my $perl_script = ${ $source->raw }; + + $class->_croak("Cannot find ($perl_script)") unless $meta->{is_file}; + + # TODO: does this really need to be done here? + $class->_autoflush_stdhandles; + + my ( $libs, $switches ) + = $class->_mangle_switches( + $class->_filter_libs( $class->_switches($source) ) ); + + $class->_run( $source, $libs, $switches ); +} + + +sub _has_taint_switch { + my( $class, $switches ) = @_; + + my $has_taint = grep { $_ eq "-T" || $_ eq "-t" } @{$switches}; + return $has_taint ? 1 : 0; +} + +sub _mangle_switches { + my ( $class, $libs, $switches ) = @_; + + # Taint mode ignores environment variables so we must retranslate + # PERL5LIB as -I switches and place PERL5OPT on the command line + # in order that it be seen. + if ( $class->_has_taint_switch($switches) ) { + my @perl5lib = defined $ENV{PERL5LIB} ? split /$Config{path_sep}/, $ENV{PERL5LIB} : (); + return ( + $libs, + [ @{$switches}, + $class->_libs2switches([@$libs, @perl5lib]), + defined $ENV{PERL5OPT} ? shellwords( $ENV{PERL5OPT} ) : () + ], + ); + } + + return ( $libs, $switches ); +} + +sub _filter_libs { + my ( $class, @switches ) = @_; + + my $path_sep = $Config{path_sep}; + my $path_re = qr{$path_sep}; + + # Filter out any -I switches to be handled as libs later. + # + # Nasty kludge. It might be nicer if we got the libs separately + # although at least this way we find any -I switches that were + # supplied other then as explicit libs. + # + # We filter out any names containing colons because they will break + # PERL5LIB + my @libs; + my @filtered_switches; + for (@switches) { + if ( !/$path_re/ && m/ ^ ['"]? -I ['"]? (.*?) ['"]? $ /x ) { + push @libs, $1; + } + else { + push @filtered_switches, $_; + } + } + + return \@libs, \@filtered_switches; +} + +sub _iterator_hooks { + my ( $class, $source, $libs, $switches ) = @_; + + my $setup = sub { + if ( @{$libs} and !$class->_has_taint_switch($switches) ) { + $ENV{PERL5LIB} = join( + $Config{path_sep}, grep {defined} @{$libs}, + $ENV{PERL5LIB} + ); + } + }; + + # VMS environment variables aren't guaranteed to reset at the end of + # the process, so we need to put PERL5LIB back. + my $previous = $ENV{PERL5LIB}; + my $teardown = sub { + if ( defined $previous ) { + $ENV{PERL5LIB} = $previous; + } + else { + delete $ENV{PERL5LIB}; + } + }; + + return ( $setup, $teardown ); +} + +sub _run { + my ( $class, $source, $libs, $switches ) = @_; + + my @command = $class->_get_command_for_switches( $source, $switches ) + or $class->_croak("No command found!"); + + my ( $setup, $teardown ) = $class->_iterator_hooks( $source, $libs, $switches ); + + return $class->_create_iterator( $source, \@command, $setup, $teardown ); +} + +sub _create_iterator { + my ( $class, $source, $command, $setup, $teardown ) = @_; + + return TAP::Parser::Iterator::Process->new( + { command => $command, + merge => $source->merge, + setup => $setup, + teardown => $teardown, + } + ); +} + +sub _get_command_for_switches { + my ( $class, $source, $switches ) = @_; + my $file = ${ $source->raw }; + my @args = @{ $source->test_args || [] }; + my $command = $class->get_perl; + + # XXX don't need to quote if we treat the parts as atoms (except maybe vms) + #$file = qq["$file"] if ( $file =~ /\s/ ) && ( $file !~ /^".*"$/ ); + my @command = ( $command, @{$switches}, $file, @args ); + return @command; +} + +sub _libs2switches { + my $class = shift; + return map {"-I$_"} grep {$_} @{ $_[0] }; +} + + +sub get_taint { + my ( $class, $shebang ) = @_; + return + unless defined $shebang + && $shebang =~ /^#!.*\bperl.*\s-\w*([Tt]+)/; + return $1; +} + +sub _switches { + my ( $class, $source ) = @_; + my $file = ${ $source->raw }; + my @switches = @{ $source->switches || [] }; + my $shebang = $source->meta->{file}->{shebang}; + return unless defined $shebang; + + my $taint = $class->get_taint($shebang); + push @switches, "-$taint" if defined $taint; + + # Quote the argument if we're VMS, since VMS will downcase anything + # not quoted. + if (IS_VMS) { + for (@switches) { + $_ = qq["$_"]; + } + } + + return @switches; +} + + +sub get_perl { + my $class = shift; + return $ENV{HARNESS_PERL} if defined $ENV{HARNESS_PERL}; + return qq["$^X"] if IS_WIN32 && ( $^X =~ /[^\w\.\/\\]/ ); + return $^X; +} + +1; + +__END__ + +package TAP::Parser::SourceHandler::File; + +use strict; +use warnings; + +use TAP::Parser::IteratorFactory (); +use TAP::Parser::Iterator::Stream (); + +use base 'TAP::Parser::SourceHandler'; + +TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); + + +our $VERSION = '3.42'; + + +sub can_handle { + my ( $class, $src ) = @_; + my $meta = $src->meta; + my $config = $src->config_for($class); + + return 0 unless $meta->{is_file}; + my $file = $meta->{file}; + return 0.9 if $file->{lc_ext} eq '.tap'; + + if ( my $exts = $config->{extensions} ) { + my @exts = ref $exts eq 'ARRAY' ? @$exts : $exts; + return 0.9 if grep { lc($_) eq $file->{lc_ext} } @exts; + } + + return 0; +} + + +sub make_iterator { + my ( $class, $source ) = @_; + + $class->_croak('$source->raw must be a scalar ref') + unless $source->meta->{is_scalar}; + + my $file = ${ $source->raw }; + my $fh; + open( $fh, '<', $file ) + or $class->_croak("error opening TAP source file '$file': $!"); + return $class->iterator_class->new($fh); +} + + +use constant iterator_class => 'TAP::Parser::Iterator::Stream'; + +1; + +__END__ + +package TAP::Parser::SourceHandler::Handle; + +use strict; +use warnings; + +use TAP::Parser::IteratorFactory (); +use TAP::Parser::Iterator::Stream (); + +use base 'TAP::Parser::SourceHandler'; + +TAP::Parser::IteratorFactory->register_handler(__PACKAGE__); + + +our $VERSION = '3.42'; + + +sub can_handle { + my ( $class, $src ) = @_; + my $meta = $src->meta; + + return 0.9 + if $meta->{is_object} + && UNIVERSAL::isa( $src->raw, 'IO::Handle' ); + + return 0.8 if $meta->{is_glob}; + + return 0; +} + + +sub make_iterator { + my ( $class, $source ) = @_; + + $class->_croak('$source->raw must be a glob ref or an IO::Handle') + unless $source->meta->{is_glob} + || UNIVERSAL::isa( $source->raw, 'IO::Handle' ); + + return $class->iterator_class->new( $source->raw ); +} + + +use constant iterator_class => 'TAP::Parser::Iterator::Stream'; + +1; + +package Search::Dict; +require 5.000; +require Exporter; + +my $fc_available; +BEGIN { + $fc_available = '5.015008'; + if ( $] ge $fc_available ) { + require feature; + 'feature'->import('fc'); # string avoids warning on old Perls + } +} + +use strict; + +our $VERSION = '1.07'; +our @ISA = qw(Exporter); +our @EXPORT = qw(look); + + +sub look { + my($fh,$key,$dict,$fold) = @_; + my ($comp, $xfrm); + if (@_ == 3 && ref $dict eq 'HASH') { + my $params = $dict; + $dict = 0; + $dict = $params->{dict} if exists $params->{dict}; + $fold = $params->{fold} if exists $params->{fold}; + $comp = $params->{comp} if exists $params->{comp}; + $xfrm = $params->{xfrm} if exists $params->{xfrm}; + } + $comp = sub { $_[0] cmp $_[1] } unless defined $comp; + local($_); + my $fno = fileno $fh; + my @stat; + if ( defined $fno && $fno >= 0 && ! tied *{$fh} ) { # real, open file + @stat = eval { stat($fh) }; # in case fileno lies + } + my($size, $blksize) = @stat[7,11]; + $size = do { seek($fh,0,2); my $s = tell($fh); seek($fh,0,0); $s } + unless defined $size; + $blksize ||= 8192; + $key =~ s/[^\w\s]//g if $dict; + if ( $fold ) { + $key = $] ge $fc_available ? fc($key) : lc($key); + } + # find the right block + my($min, $max) = (0, int($size / $blksize)); + my $mid; + while ($max - $min > 1) { + $mid = int(($max + $min) / 2); + seek($fh, $mid * $blksize, 0) + or return -1; + <$fh> if $mid; # probably a partial line + $_ = <$fh>; + $_ = $xfrm->($_) if defined $xfrm; + chomp; + s/[^\w\s]//g if $dict; + if ( $fold ) { + $_ = $] ge $fc_available ? fc($_) : lc($_); + } + if (defined($_) && $comp->($_, $key) < 0) { + $min = $mid; + } + else { + $max = $mid; + } + } + # find the right line + $min *= $blksize; + seek($fh,$min,0) + or return -1; + <$fh> if $min; + for (;;) { + $min = tell($fh); + defined($_ = <$fh>) + or last; + $_ = $xfrm->($_) if defined $xfrm; + chomp; + s/[^\w\s]//g if $dict; + if ( $fold ) { + $_ = $] ge $fc_available ? fc($_) : lc($_); + } + last if $comp->($_, $key) >= 0; + } + seek($fh,$min,0); + $min; +} + +1; +# SpecialCasing-10.0.0.txt +# Date: 2017-04-14, 05:40:43 GMT +# © 2017 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Special Casing +# +# This file is a supplement to the UnicodeData.txt file. It does not define any +# properties, but rather provides additional information about the casing of +# Unicode characters, for situations when casing incurs a change in string length +# or is dependent on context or locale. For compatibility, the UnicodeData.txt +# file only contains simple case mappings for characters where they are one-to-one +# and independent of context and language. The data in this file, combined with +# the simple case mappings in UnicodeData.txt, defines the full case mappings +# Lowercase_Mapping (lc), Titlecase_Mapping (tc), and Uppercase_Mapping (uc). +# +# Note that the preferred mechanism for defining tailored casing operations is +# the Unicode Common Locale Data Repository (CLDR). For more information, see the +# discussion of case mappings and case algorithms in the Unicode Standard. +# +# All code points not listed in this file that do not have a simple case mappings +# in UnicodeData.txt map to themselves. +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; <upper>; (<condition_list>;)? # <comment> +# +# <code>, <lower>, <title>, and <upper> provide the respective full case mappings +# of <code>, expressed as character values in hex. If there is more than one character, +# they are separated by spaces. Other than as used to separate elements, spaces are +# to be ignored. +# +# The <condition_list> is optional. Where present, it consists of one or more language IDs +# or casing contexts, separated by spaces. In these conditions: +# - A condition list overrides the normal behavior if all of the listed conditions are true. +# - The casing context is always the context of the characters in the original string, +# NOT in the resulting string. +# - Case distinctions in the condition list are not significant. +# - Conditions preceded by "Not_" represent the negation of the condition. +# The condition list is not represented in the UCD as a formal property. +# +# A language ID is defined by BCP 47, with '-' and '_' treated equivalently. +# +# A casing context for a character is defined by Section 3.13 Default Case Algorithms +# of The Unicode Standard. +# +# Parsers of this file must be prepared to deal with future additions to this format: +# * Additional contexts +# * Additional fields +# ================================================================================ + +# ================================================================================ +# Unconditional mappings +# ================================================================================ + +# The German es-zed is special--the normal mapping is to SS. +# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>)) + +00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S + +# Preserve canonical equivalence for I with dot. Turkic is handled below. + +0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# Ligatures + +FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF +FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI +FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL +FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI +FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL +FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T +FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST + +0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN +FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH + +# No corresponding uppercase precomposed character + +0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON +1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI + +# IMPORTANT-when iota-subscript (0345) is uppercased or titlecased, +# the result will be incorrect unless the iota-subscript is moved to the end +# of any sequence of combining marks. Otherwise, the accents will go on the capital iota. +# This process can be achieved by first transforming the text to NFC before casing. +# E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA> + +# The following cases are already in the UnicodeData.txt file, so are only commented here. + +# 0345; 0345; 0345; 0399; # COMBINING GREEK YPOGEGRAMMENI + +# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript) +# have special uppercases. +# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase! + +1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + +# Some characters with YPOGEGRAMMENI also have no corresponding titlecases + +1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + +1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + +# ================================================================================ +# Conditional Mappings +# The remainder of this file provides conditional casing data used to produce +# full case mappings. +# ================================================================================ +# Language-Insensitive Mappings +# These are characters whose full case mappings do not depend on language, but do +# depend on context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. +# ================================================================================ + +# Special case for final form of sigma + +03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + +# Note: the following cases for non-final are already in the UnicodeData.txt file. + +# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA +# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA +# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA + +# Note: the following cases are not included, since they would case-fold in lowercasing + +# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA +# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA + +# ================================================================================ +# Language-Sensitive Mappings +# These are characters whose full case mappings depend on language and perhaps also +# context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. +# ================================================================================ + +# Lithuanian + +# Lithuanian retains the dot in a lowercase i when followed by accents. + +# Remove DOT ABOVE after "i" with upper or titlecase + +0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE + +# Introduce an explicit dot above when lowercasing capital I's and J's +# whenever there are more accents above. +# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) + +0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I +004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J +012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK +00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE +0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE + +# ================================================================================ + +# Turkish and Azeri + +# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri +# The following rules handle those cases. + +0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. +# This matches the behavior of the canonically equivalent I-dot_above + +0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE +0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE + +# When lowercasing, unless an I is before a dot_above, it turns into a dotless i. + +0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I +0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I + +# When uppercasing, i turns into a dotted capital I + +0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I +0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I + +# Note: the following case is already in the UnicodeData.txt file. + +# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I + +# EOF + +# NamedSequences-10.0.0.txt +# Date: 2017-04-13, 01:00:00 GMT [KW, LI] +# © 2017 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Unicode Named Character Sequences +# +# This file is a normative contributory data file in the Unicode +# Character Database. +# +# Format: +# Name of Sequence; Code Point Sequence for USI +# +# Code point sequences in the Unicode Character Database +# use spaces as delimiters. The corresponding format for a +# UCS Sequence Identifier (USI) in ISO/IEC 10646 uses +# comma delimitation and angle brackets. Thus, a Unicode +# named character sequence of the form: +# +# EXAMPLE NAME;1000 1001 1002 +# +# in this data file, would correspond to an ISO/IEC 10646 USI +# as follows: +# +# <1000, 1001, 1002> +# +# For more information, see UAX #34: Unicode Named Character +# Sequences, at http://www.unicode.org/unicode/reports/tr34/ +# +# Note: The order of entries in this file is not significant. +# However, entries are generally in script order corresponding +# to block order in the Unicode Standard, to make it easier +# to find entries in the list. + +# ================================================ + +# Named keycap sequences for telephone keypad (used for emoji) +# Provisional, 2015-05-05 +# FE0F added to the sequences, 2016-05-11 +# Approved 2017-05-12 + +KEYCAP NUMBER SIGN;0023 FE0F 20E3 +KEYCAP ASTERISK;002A FE0F 20E3 +KEYCAP DIGIT ZERO;0030 FE0F 20E3 +KEYCAP DIGIT ONE;0031 FE0F 20E3 +KEYCAP DIGIT TWO;0032 FE0F 20E3 +KEYCAP DIGIT THREE;0033 FE0F 20E3 +KEYCAP DIGIT FOUR;0034 FE0F 20E3 +KEYCAP DIGIT FIVE;0035 FE0F 20E3 +KEYCAP DIGIT SIX;0036 FE0F 20E3 +KEYCAP DIGIT SEVEN;0037 FE0F 20E3 +KEYCAP DIGIT EIGHT;0038 FE0F 20E3 +KEYCAP DIGIT NINE;0039 FE0F 20E3 + +# Latin letter plus accent combinations. +# These are part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +LATIN CAPITAL LETTER A WITH MACRON AND GRAVE;0100 0300 +LATIN SMALL LETTER A WITH MACRON AND GRAVE;0101 0300 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW;0045 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW;0065 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00C8 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE;00E8 0329 +LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00C9 0329 +LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE;00E9 0329 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON;00CA 0304 +LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON;00EA 0304 +LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON;00CA 030C +LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON;00EA 030C +LATIN CAPITAL LETTER I WITH MACRON AND GRAVE;012A 0300 +LATIN SMALL LETTER I WITH MACRON AND GRAVE;012B 0300 +LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE;0069 0307 0301 +LATIN SMALL LETTER NG WITH TILDE ABOVE;006E 0360 0067 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW;004F 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW;006F 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00D2 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE;00F2 0329 +LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00D3 0329 +LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE;00F3 0329 +LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW;0053 0329 +LATIN SMALL LETTER S WITH VERTICAL LINE BELOW;0073 0329 +LATIN CAPITAL LETTER U WITH MACRON AND GRAVE;016A 0300 +LATIN SMALL LETTER U WITH MACRON AND GRAVE;016B 0300 + +# Additions for Lithuanian. +# Provisional 2006-05-18, Approved 2007-10-19 + +LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE;0104 0301 +LATIN SMALL LETTER A WITH OGONEK AND ACUTE;0105 0301 +LATIN CAPITAL LETTER A WITH OGONEK AND TILDE;0104 0303 +LATIN SMALL LETTER A WITH OGONEK AND TILDE;0105 0303 +LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE;0118 0301 +LATIN SMALL LETTER E WITH OGONEK AND ACUTE;0119 0301 +LATIN CAPITAL LETTER E WITH OGONEK AND TILDE;0118 0303 +LATIN SMALL LETTER E WITH OGONEK AND TILDE;0119 0303 +LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE;0116 0301 +LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE;0117 0301 +LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE;0116 0303 +LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE;0117 0303 +LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE;0069 0307 0300 +LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE;0069 0307 0303 +LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE;012E 0301 +LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE;012F 0307 0301 +LATIN CAPITAL LETTER I WITH OGONEK AND TILDE;012E 0303 +LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE;012F 0307 0303 +LATIN CAPITAL LETTER J WITH TILDE;004A 0303 +LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE;006A 0307 0303 +LATIN CAPITAL LETTER L WITH TILDE;004C 0303 +LATIN SMALL LETTER L WITH TILDE;006C 0303 +LATIN CAPITAL LETTER M WITH TILDE;004D 0303 +LATIN SMALL LETTER M WITH TILDE;006D 0303 +LATIN CAPITAL LETTER R WITH TILDE;0052 0303 +LATIN SMALL LETTER R WITH TILDE;0072 0303 +LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE;0172 0301 +LATIN SMALL LETTER U WITH OGONEK AND ACUTE;0173 0301 +LATIN CAPITAL LETTER U WITH OGONEK AND TILDE;0172 0303 +LATIN SMALL LETTER U WITH OGONEK AND TILDE;0173 0303 +LATIN CAPITAL LETTER U WITH MACRON AND ACUTE;016A 0301 +LATIN SMALL LETTER U WITH MACRON AND ACUTE;016B 0301 +LATIN CAPITAL LETTER U WITH MACRON AND TILDE;016A 0303 +LATIN SMALL LETTER U WITH MACRON AND TILDE;016B 0303 + +# Entries for JIS X 0213 compatibility mapping. +# Provisional 2008-11-07, Approved 2010-05-14 + +LATIN SMALL LETTER AE WITH GRAVE;00E6 0300 +LATIN SMALL LETTER OPEN O WITH GRAVE;0254 0300 +LATIN SMALL LETTER OPEN O WITH ACUTE;0254 0301 +LATIN SMALL LETTER TURNED V WITH GRAVE;028C 0300 +LATIN SMALL LETTER TURNED V WITH ACUTE;028C 0301 +LATIN SMALL LETTER SCHWA WITH GRAVE;0259 0300 +LATIN SMALL LETTER SCHWA WITH ACUTE;0259 0301 +LATIN SMALL LETTER HOOKED SCHWA WITH GRAVE;025A 0300 +LATIN SMALL LETTER HOOKED SCHWA WITH ACUTE;025A 0301 + +# Entries for Uyghur and Chagatai. +# Provisional N/A, Approved 2012-11-08 + +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF;0626 0627 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH WAW;0626 0648 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA;0626 0649 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH OE;0626 06C6 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH U;0626 06C7 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH YU;0626 06C8 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH E;0626 06D0 +ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH AE;0626 06D5 +ARABIC SEQUENCE NOON WITH KEHEH;0646 06A9 + +# Entry for a Bangla entity. +# Provisional 2009-08-10, Approved 2010-05-14 +# +# Note that this same sequence is also used for the ASSAMESE LETTER KSSA. + +BENGALI LETTER KHINYA;0995 09CD 09B7 + +# Additions for Tamil. +# Provisional 2008-02-08, Approved 2009-08-14 +# +# A visual display of the Tamil named character sequences is available +# in the documentation for the Unicode Standard. See Section 12.6, Tamil in +# http://www.unicode.org/versions/latest/ + +TAMIL CONSONANT K; 0B95 0BCD +TAMIL CONSONANT NG; 0B99 0BCD +TAMIL CONSONANT C; 0B9A 0BCD +TAMIL CONSONANT NY; 0B9E 0BCD +TAMIL CONSONANT TT; 0B9F 0BCD +TAMIL CONSONANT NN; 0BA3 0BCD +TAMIL CONSONANT T; 0BA4 0BCD +TAMIL CONSONANT N; 0BA8 0BCD +TAMIL CONSONANT P; 0BAA 0BCD +TAMIL CONSONANT M; 0BAE 0BCD +TAMIL CONSONANT Y; 0BAF 0BCD +TAMIL CONSONANT R; 0BB0 0BCD +TAMIL CONSONANT L; 0BB2 0BCD +TAMIL CONSONANT V; 0BB5 0BCD +TAMIL CONSONANT LLL;0BB4 0BCD +TAMIL CONSONANT LL; 0BB3 0BCD +TAMIL CONSONANT RR; 0BB1 0BCD +TAMIL CONSONANT NNN;0BA9 0BCD +TAMIL CONSONANT J; 0B9C 0BCD +TAMIL CONSONANT SH; 0BB6 0BCD +TAMIL CONSONANT SS; 0BB7 0BCD +TAMIL CONSONANT S; 0BB8 0BCD +TAMIL CONSONANT H; 0BB9 0BCD +TAMIL CONSONANT KSS;0B95 0BCD 0BB7 0BCD + +TAMIL SYLLABLE KAA; 0B95 0BBE +TAMIL SYLLABLE KI; 0B95 0BBF +TAMIL SYLLABLE KII; 0B95 0BC0 +TAMIL SYLLABLE KU; 0B95 0BC1 +TAMIL SYLLABLE KUU; 0B95 0BC2 +TAMIL SYLLABLE KE; 0B95 0BC6 +TAMIL SYLLABLE KEE; 0B95 0BC7 +TAMIL SYLLABLE KAI; 0B95 0BC8 +TAMIL SYLLABLE KO; 0B95 0BCA +TAMIL SYLLABLE KOO; 0B95 0BCB +TAMIL SYLLABLE KAU; 0B95 0BCC + +TAMIL SYLLABLE NGAA; 0B99 0BBE +TAMIL SYLLABLE NGI; 0B99 0BBF +TAMIL SYLLABLE NGII; 0B99 0BC0 +TAMIL SYLLABLE NGU; 0B99 0BC1 +TAMIL SYLLABLE NGUU; 0B99 0BC2 +TAMIL SYLLABLE NGE; 0B99 0BC6 +TAMIL SYLLABLE NGEE; 0B99 0BC7 +TAMIL SYLLABLE NGAI; 0B99 0BC8 +TAMIL SYLLABLE NGO; 0B99 0BCA +TAMIL SYLLABLE NGOO; 0B99 0BCB +TAMIL SYLLABLE NGAU; 0B99 0BCC + +TAMIL SYLLABLE CAA; 0B9A 0BBE +TAMIL SYLLABLE CI; 0B9A 0BBF +TAMIL SYLLABLE CII; 0B9A 0BC0 +TAMIL SYLLABLE CU; 0B9A 0BC1 +TAMIL SYLLABLE CUU; 0B9A 0BC2 +TAMIL SYLLABLE CE; 0B9A 0BC6 +TAMIL SYLLABLE CEE; 0B9A 0BC7 +TAMIL SYLLABLE CAI; 0B9A 0BC8 +TAMIL SYLLABLE CO; 0B9A 0BCA +TAMIL SYLLABLE COO; 0B9A 0BCB +TAMIL SYLLABLE CAU; 0B9A 0BCC + +TAMIL SYLLABLE NYAA; 0B9E 0BBE +TAMIL SYLLABLE NYI; 0B9E 0BBF +TAMIL SYLLABLE NYII; 0B9E 0BC0 +TAMIL SYLLABLE NYU; 0B9E 0BC1 +TAMIL SYLLABLE NYUU; 0B9E 0BC2 +TAMIL SYLLABLE NYE; 0B9E 0BC6 +TAMIL SYLLABLE NYEE; 0B9E 0BC7 +TAMIL SYLLABLE NYAI; 0B9E 0BC8 +TAMIL SYLLABLE NYO; 0B9E 0BCA +TAMIL SYLLABLE NYOO; 0B9E 0BCB +TAMIL SYLLABLE NYAU; 0B9E 0BCC + +TAMIL SYLLABLE TTAA; 0B9F 0BBE +TAMIL SYLLABLE TTI; 0B9F 0BBF +TAMIL SYLLABLE TTII; 0B9F 0BC0 +TAMIL SYLLABLE TTU; 0B9F 0BC1 +TAMIL SYLLABLE TTUU; 0B9F 0BC2 +TAMIL SYLLABLE TTE; 0B9F 0BC6 +TAMIL SYLLABLE TTEE; 0B9F 0BC7 +TAMIL SYLLABLE TTAI; 0B9F 0BC8 +TAMIL SYLLABLE TTO; 0B9F 0BCA +TAMIL SYLLABLE TTOO; 0B9F 0BCB +TAMIL SYLLABLE TTAU; 0B9F 0BCC + +TAMIL SYLLABLE NNAA; 0BA3 0BBE +TAMIL SYLLABLE NNI; 0BA3 0BBF +TAMIL SYLLABLE NNII; 0BA3 0BC0 +TAMIL SYLLABLE NNU; 0BA3 0BC1 +TAMIL SYLLABLE NNUU; 0BA3 0BC2 +TAMIL SYLLABLE NNE; 0BA3 0BC6 +TAMIL SYLLABLE NNEE; 0BA3 0BC7 +TAMIL SYLLABLE NNAI; 0BA3 0BC8 +TAMIL SYLLABLE NNO; 0BA3 0BCA +TAMIL SYLLABLE NNOO; 0BA3 0BCB +TAMIL SYLLABLE NNAU; 0BA3 0BCC + +TAMIL SYLLABLE TAA; 0BA4 0BBE +TAMIL SYLLABLE TI; 0BA4 0BBF +TAMIL SYLLABLE TII; 0BA4 0BC0 +TAMIL SYLLABLE TU; 0BA4 0BC1 +TAMIL SYLLABLE TUU; 0BA4 0BC2 +TAMIL SYLLABLE TE; 0BA4 0BC6 +TAMIL SYLLABLE TEE; 0BA4 0BC7 +TAMIL SYLLABLE TAI; 0BA4 0BC8 +TAMIL SYLLABLE TO; 0BA4 0BCA +TAMIL SYLLABLE TOO; 0BA4 0BCB +TAMIL SYLLABLE TAU; 0BA4 0BCC + +TAMIL SYLLABLE NAA; 0BA8 0BBE +TAMIL SYLLABLE NI; 0BA8 0BBF +TAMIL SYLLABLE NII; 0BA8 0BC0 +TAMIL SYLLABLE NU; 0BA8 0BC1 +TAMIL SYLLABLE NUU; 0BA8 0BC2 +TAMIL SYLLABLE NE; 0BA8 0BC6 +TAMIL SYLLABLE NEE; 0BA8 0BC7 +TAMIL SYLLABLE NAI; 0BA8 0BC8 +TAMIL SYLLABLE NO; 0BA8 0BCA +TAMIL SYLLABLE NOO; 0BA8 0BCB +TAMIL SYLLABLE NAU; 0BA8 0BCC + +TAMIL SYLLABLE PAA; 0BAA 0BBE +TAMIL SYLLABLE PI; 0BAA 0BBF +TAMIL SYLLABLE PII; 0BAA 0BC0 +TAMIL SYLLABLE PU; 0BAA 0BC1 +TAMIL SYLLABLE PUU; 0BAA 0BC2 +TAMIL SYLLABLE PE; 0BAA 0BC6 +TAMIL SYLLABLE PEE; 0BAA 0BC7 +TAMIL SYLLABLE PAI; 0BAA 0BC8 +TAMIL SYLLABLE PO; 0BAA 0BCA +TAMIL SYLLABLE POO; 0BAA 0BCB +TAMIL SYLLABLE PAU; 0BAA 0BCC + +TAMIL SYLLABLE MAA; 0BAE 0BBE +TAMIL SYLLABLE MI; 0BAE 0BBF +TAMIL SYLLABLE MII; 0BAE 0BC0 +TAMIL SYLLABLE MU; 0BAE 0BC1 +TAMIL SYLLABLE MUU; 0BAE 0BC2 +TAMIL SYLLABLE ME; 0BAE 0BC6 +TAMIL SYLLABLE MEE; 0BAE 0BC7 +TAMIL SYLLABLE MAI; 0BAE 0BC8 +TAMIL SYLLABLE MO; 0BAE 0BCA +TAMIL SYLLABLE MOO; 0BAE 0BCB +TAMIL SYLLABLE MAU; 0BAE 0BCC + +TAMIL SYLLABLE YAA; 0BAF 0BBE +TAMIL SYLLABLE YI; 0BAF 0BBF +TAMIL SYLLABLE YII; 0BAF 0BC0 +TAMIL SYLLABLE YU; 0BAF 0BC1 +TAMIL SYLLABLE YUU; 0BAF 0BC2 +TAMIL SYLLABLE YE; 0BAF 0BC6 +TAMIL SYLLABLE YEE; 0BAF 0BC7 +TAMIL SYLLABLE YAI; 0BAF 0BC8 +TAMIL SYLLABLE YO; 0BAF 0BCA +TAMIL SYLLABLE YOO; 0BAF 0BCB +TAMIL SYLLABLE YAU; 0BAF 0BCC + +TAMIL SYLLABLE RAA; 0BB0 0BBE +TAMIL SYLLABLE RI; 0BB0 0BBF +TAMIL SYLLABLE RII; 0BB0 0BC0 +TAMIL SYLLABLE RU; 0BB0 0BC1 +TAMIL SYLLABLE RUU; 0BB0 0BC2 +TAMIL SYLLABLE RE; 0BB0 0BC6 +TAMIL SYLLABLE REE; 0BB0 0BC7 +TAMIL SYLLABLE RAI; 0BB0 0BC8 +TAMIL SYLLABLE RO; 0BB0 0BCA +TAMIL SYLLABLE ROO; 0BB0 0BCB +TAMIL SYLLABLE RAU; 0BB0 0BCC + +TAMIL SYLLABLE LAA; 0BB2 0BBE +TAMIL SYLLABLE LI; 0BB2 0BBF +TAMIL SYLLABLE LII; 0BB2 0BC0 +TAMIL SYLLABLE LU; 0BB2 0BC1 +TAMIL SYLLABLE LUU; 0BB2 0BC2 +TAMIL SYLLABLE LE; 0BB2 0BC6 +TAMIL SYLLABLE LEE; 0BB2 0BC7 +TAMIL SYLLABLE LAI; 0BB2 0BC8 +TAMIL SYLLABLE LO; 0BB2 0BCA +TAMIL SYLLABLE LOO; 0BB2 0BCB +TAMIL SYLLABLE LAU; 0BB2 0BCC + +TAMIL SYLLABLE VAA; 0BB5 0BBE +TAMIL SYLLABLE VI; 0BB5 0BBF +TAMIL SYLLABLE VII; 0BB5 0BC0 +TAMIL SYLLABLE VU; 0BB5 0BC1 +TAMIL SYLLABLE VUU; 0BB5 0BC2 +TAMIL SYLLABLE VE; 0BB5 0BC6 +TAMIL SYLLABLE VEE; 0BB5 0BC7 +TAMIL SYLLABLE VAI; 0BB5 0BC8 +TAMIL SYLLABLE VO; 0BB5 0BCA +TAMIL SYLLABLE VOO; 0BB5 0BCB +TAMIL SYLLABLE VAU; 0BB5 0BCC + +TAMIL SYLLABLE LLLAA; 0BB4 0BBE +TAMIL SYLLABLE LLLI; 0BB4 0BBF +TAMIL SYLLABLE LLLII; 0BB4 0BC0 +TAMIL SYLLABLE LLLU; 0BB4 0BC1 +TAMIL SYLLABLE LLLUU; 0BB4 0BC2 +TAMIL SYLLABLE LLLE; 0BB4 0BC6 +TAMIL SYLLABLE LLLEE; 0BB4 0BC7 +TAMIL SYLLABLE LLLAI; 0BB4 0BC8 +TAMIL SYLLABLE LLLO; 0BB4 0BCA +TAMIL SYLLABLE LLLOO; 0BB4 0BCB +TAMIL SYLLABLE LLLAU; 0BB4 0BCC + +TAMIL SYLLABLE LLAA; 0BB3 0BBE +TAMIL SYLLABLE LLI; 0BB3 0BBF +TAMIL SYLLABLE LLII; 0BB3 0BC0 +TAMIL SYLLABLE LLU; 0BB3 0BC1 +TAMIL SYLLABLE LLUU; 0BB3 0BC2 +TAMIL SYLLABLE LLE; 0BB3 0BC6 +TAMIL SYLLABLE LLEE; 0BB3 0BC7 +TAMIL SYLLABLE LLAI; 0BB3 0BC8 +TAMIL SYLLABLE LLO; 0BB3 0BCA +TAMIL SYLLABLE LLOO; 0BB3 0BCB +TAMIL SYLLABLE LLAU; 0BB3 0BCC + +TAMIL SYLLABLE RRAA; 0BB1 0BBE +TAMIL SYLLABLE RRI; 0BB1 0BBF +TAMIL SYLLABLE RRII; 0BB1 0BC0 +TAMIL SYLLABLE RRU; 0BB1 0BC1 +TAMIL SYLLABLE RRUU; 0BB1 0BC2 +TAMIL SYLLABLE RRE; 0BB1 0BC6 +TAMIL SYLLABLE RREE; 0BB1 0BC7 +TAMIL SYLLABLE RRAI; 0BB1 0BC8 +TAMIL SYLLABLE RRO; 0BB1 0BCA +TAMIL SYLLABLE RROO; 0BB1 0BCB +TAMIL SYLLABLE RRAU; 0BB1 0BCC + +TAMIL SYLLABLE NNNAA; 0BA9 0BBE +TAMIL SYLLABLE NNNI; 0BA9 0BBF +TAMIL SYLLABLE NNNII; 0BA9 0BC0 +TAMIL SYLLABLE NNNU; 0BA9 0BC1 +TAMIL SYLLABLE NNNUU; 0BA9 0BC2 +TAMIL SYLLABLE NNNE; 0BA9 0BC6 +TAMIL SYLLABLE NNNEE; 0BA9 0BC7 +TAMIL SYLLABLE NNNAI; 0BA9 0BC8 +TAMIL SYLLABLE NNNO; 0BA9 0BCA +TAMIL SYLLABLE NNNOO; 0BA9 0BCB +TAMIL SYLLABLE NNNAU; 0BA9 0BCC + +TAMIL SYLLABLE JAA; 0B9C 0BBE +TAMIL SYLLABLE JI; 0B9C 0BBF +TAMIL SYLLABLE JII; 0B9C 0BC0 +TAMIL SYLLABLE JU; 0B9C 0BC1 +TAMIL SYLLABLE JUU; 0B9C 0BC2 +TAMIL SYLLABLE JE; 0B9C 0BC6 +TAMIL SYLLABLE JEE; 0B9C 0BC7 +TAMIL SYLLABLE JAI; 0B9C 0BC8 +TAMIL SYLLABLE JO; 0B9C 0BCA +TAMIL SYLLABLE JOO; 0B9C 0BCB +TAMIL SYLLABLE JAU; 0B9C 0BCC + +TAMIL SYLLABLE SHAA; 0BB6 0BBE +TAMIL SYLLABLE SHI; 0BB6 0BBF +TAMIL SYLLABLE SHII; 0BB6 0BC0 +TAMIL SYLLABLE SHU; 0BB6 0BC1 +TAMIL SYLLABLE SHUU; 0BB6 0BC2 +TAMIL SYLLABLE SHE; 0BB6 0BC6 +TAMIL SYLLABLE SHEE; 0BB6 0BC7 +TAMIL SYLLABLE SHAI; 0BB6 0BC8 +TAMIL SYLLABLE SHO; 0BB6 0BCA +TAMIL SYLLABLE SHOO; 0BB6 0BCB +TAMIL SYLLABLE SHAU; 0BB6 0BCC + +TAMIL SYLLABLE SSAA; 0BB7 0BBE +TAMIL SYLLABLE SSI; 0BB7 0BBF +TAMIL SYLLABLE SSII; 0BB7 0BC0 +TAMIL SYLLABLE SSU; 0BB7 0BC1 +TAMIL SYLLABLE SSUU; 0BB7 0BC2 +TAMIL SYLLABLE SSE; 0BB7 0BC6 +TAMIL SYLLABLE SSEE; 0BB7 0BC7 +TAMIL SYLLABLE SSAI; 0BB7 0BC8 +TAMIL SYLLABLE SSO; 0BB7 0BCA +TAMIL SYLLABLE SSOO; 0BB7 0BCB +TAMIL SYLLABLE SSAU; 0BB7 0BCC + +TAMIL SYLLABLE SAA; 0BB8 0BBE +TAMIL SYLLABLE SI; 0BB8 0BBF +TAMIL SYLLABLE SII; 0BB8 0BC0 +TAMIL SYLLABLE SU; 0BB8 0BC1 +TAMIL SYLLABLE SUU; 0BB8 0BC2 +TAMIL SYLLABLE SE; 0BB8 0BC6 +TAMIL SYLLABLE SEE; 0BB8 0BC7 +TAMIL SYLLABLE SAI; 0BB8 0BC8 +TAMIL SYLLABLE SO; 0BB8 0BCA +TAMIL SYLLABLE SOO; 0BB8 0BCB +TAMIL SYLLABLE SAU; 0BB8 0BCC + +TAMIL SYLLABLE HAA; 0BB9 0BBE +TAMIL SYLLABLE HI; 0BB9 0BBF +TAMIL SYLLABLE HII; 0BB9 0BC0 +TAMIL SYLLABLE HU; 0BB9 0BC1 +TAMIL SYLLABLE HUU; 0BB9 0BC2 +TAMIL SYLLABLE HE; 0BB9 0BC6 +TAMIL SYLLABLE HEE; 0BB9 0BC7 +TAMIL SYLLABLE HAI; 0BB9 0BC8 +TAMIL SYLLABLE HO; 0BB9 0BCA +TAMIL SYLLABLE HOO; 0BB9 0BCB +TAMIL SYLLABLE HAU; 0BB9 0BCC + +TAMIL SYLLABLE KSSA; 0B95 0BCD 0BB7 +TAMIL SYLLABLE KSSAA; 0B95 0BCD 0BB7 0BBE +TAMIL SYLLABLE KSSI; 0B95 0BCD 0BB7 0BBF +TAMIL SYLLABLE KSSII; 0B95 0BCD 0BB7 0BC0 +TAMIL SYLLABLE KSSU; 0B95 0BCD 0BB7 0BC1 +TAMIL SYLLABLE KSSUU; 0B95 0BCD 0BB7 0BC2 +TAMIL SYLLABLE KSSE; 0B95 0BCD 0BB7 0BC6 +TAMIL SYLLABLE KSSEE; 0B95 0BCD 0BB7 0BC7 +TAMIL SYLLABLE KSSAI; 0B95 0BCD 0BB7 0BC8 +TAMIL SYLLABLE KSSO; 0B95 0BCD 0BB7 0BCA +TAMIL SYLLABLE KSSOO; 0B95 0BCD 0BB7 0BCB +TAMIL SYLLABLE KSSAU; 0B95 0BCD 0BB7 0BCC + +TAMIL SYLLABLE SHRII; 0BB6 0BCD 0BB0 0BC0 + +# Sinhala medial consonants and "reph" form. +# Provisional 2010-05-13, Approved 2011-08-05 + +SINHALA CONSONANT SIGN YANSAYA;0DCA 200D 0DBA +SINHALA CONSONANT SIGN RAKAARAANSAYA;0DCA 200D 0DBB +SINHALA CONSONANT SIGN REPAYA;0DBB 0DCA 200D + +# Georgian letter plus accent sequence. +# This is part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +GEORGIAN LETTER U-BRJGU;10E3 0302 + +# Khmer subjoined forms and other sequences. +# These are part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +KHMER CONSONANT SIGN COENG KA;17D2 1780 +KHMER CONSONANT SIGN COENG KHA;17D2 1781 +KHMER CONSONANT SIGN COENG KO;17D2 1782 +KHMER CONSONANT SIGN COENG KHO;17D2 1783 +KHMER CONSONANT SIGN COENG NGO;17D2 1784 +KHMER CONSONANT SIGN COENG CA;17D2 1785 +KHMER CONSONANT SIGN COENG CHA;17D2 1786 +KHMER CONSONANT SIGN COENG CO;17D2 1787 +KHMER CONSONANT SIGN COENG CHO;17D2 1788 +KHMER CONSONANT SIGN COENG NYO;17D2 1789 +KHMER CONSONANT SIGN COENG DA;17D2 178A +KHMER CONSONANT SIGN COENG TTHA;17D2 178B +KHMER CONSONANT SIGN COENG DO;17D2 178C +KHMER CONSONANT SIGN COENG TTHO;17D2 178D +KHMER CONSONANT SIGN COENG NA;17D2 178E +KHMER CONSONANT SIGN COENG TA;17D2 178F +KHMER CONSONANT SIGN COENG THA;17D2 1790 +KHMER CONSONANT SIGN COENG TO;17D2 1791 +KHMER CONSONANT SIGN COENG THO;17D2 1792 +KHMER CONSONANT SIGN COENG NO;17D2 1793 +KHMER CONSONANT SIGN COENG BA;17D2 1794 +KHMER CONSONANT SIGN COENG PHA;17D2 1795 +KHMER CONSONANT SIGN COENG PO;17D2 1796 +KHMER CONSONANT SIGN COENG PHO;17D2 1797 +KHMER CONSONANT SIGN COENG MO;17D2 1798 +KHMER CONSONANT SIGN COENG YO;17D2 1799 +KHMER CONSONANT SIGN COENG RO;17D2 179A +KHMER CONSONANT SIGN COENG LO;17D2 179B +KHMER CONSONANT SIGN COENG VO;17D2 179C +KHMER CONSONANT SIGN COENG SHA;17D2 179D +KHMER CONSONANT SIGN COENG SSA;17D2 179E +KHMER CONSONANT SIGN COENG SA;17D2 179F +KHMER CONSONANT SIGN COENG HA;17D2 17A0 +KHMER CONSONANT SIGN COENG LA;17D2 17A1 +KHMER VOWEL SIGN COENG QA;17D2 17A2 +KHMER INDEPENDENT VOWEL SIGN COENG QU;17D2 17A7 +KHMER INDEPENDENT VOWEL SIGN COENG RY;17D2 17AB +KHMER INDEPENDENT VOWEL SIGN COENG RYY;17D2 17AC +KHMER INDEPENDENT VOWEL SIGN COENG QE;17D2 17AF +KHMER VOWEL SIGN OM;17BB 17C6 +KHMER VOWEL SIGN AAM;17B6 17C6 + +# Entries for JIS X 0213 compatibility mapping. +# Provisional 2008-11-07, Approved 2010-05-14 +# +# Two of these were part of the original set of approved named sequences +# for Unicode 4.1. 2005. + +HIRAGANA LETTER BIDAKUON NGA;304B 309A +HIRAGANA LETTER BIDAKUON NGI;304D 309A +HIRAGANA LETTER BIDAKUON NGU;304F 309A +HIRAGANA LETTER BIDAKUON NGE;3051 309A +HIRAGANA LETTER BIDAKUON NGO;3053 309A +KATAKANA LETTER BIDAKUON NGA;30AB 309A +KATAKANA LETTER BIDAKUON NGI;30AD 309A +KATAKANA LETTER BIDAKUON NGU;30AF 309A +KATAKANA LETTER BIDAKUON NGE;30B1 309A +KATAKANA LETTER BIDAKUON NGO;30B3 309A +KATAKANA LETTER AINU CE;30BB 309A +KATAKANA LETTER AINU TU;30C4 309A +KATAKANA LETTER AINU TO;30C8 309A +KATAKANA LETTER AINU P;31F7 309A +MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR;02E5 02E9 +MODIFIER LETTER EXTRA-LOW EXTRA-HIGH CONTOUR TONE BAR;02E9 02E5 + +# EOF +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# This file is for the use of Unicode::UCD + +# Highest legal Unicode code point +$Unicode::UCD::MAX_UNICODE_CODEPOINT = 0x10FFFF; + +# Hangul syllables +$Unicode::UCD::HANGUL_BEGIN = 0xAC00; +$Unicode::UCD::HANGUL_COUNT = 11172; + +# Keys are all the possible "prop=value" combinations, in loose form; values +# are the standard loose name for the 'value' part of the key +%Unicode::UCD::loose_to_standard_value = ( +'age=1.1' => '1.1', +'age=10.0' => '10.0', +'age=2.0' => '2.0', +'age=2.1' => '2.1', +'age=3.0' => '3.0', +'age=3.1' => '3.1', +'age=3.2' => '3.2', +'age=4.0' => '4.0', +'age=4.1' => '4.1', +'age=5.0' => '5.0', +'age=5.1' => '5.1', +'age=5.2' => '5.2', +'age=6.0' => '6.0', +'age=6.1' => '6.1', +'age=6.2' => '6.2', +'age=6.3' => '6.3', +'age=7.0' => '7.0', +'age=8.0' => '8.0', +'age=9.0' => '9.0', +'age=na' => 'na', +'age=unassigned' => 'na', +'age=v100' => '10.0', +'age=v11' => '1.1', +'age=v20' => '2.0', +'age=v21' => '2.1', +'age=v30' => '3.0', +'age=v31' => '3.1', +'age=v32' => '3.2', +'age=v40' => '4.0', +'age=v41' => '4.1', +'age=v50' => '5.0', +'age=v51' => '5.1', +'age=v52' => '5.2', +'age=v60' => '6.0', +'age=v61' => '6.1', +'age=v62' => '6.2', +'age=v63' => '6.3', +'age=v70' => '7.0', +'age=v80' => '8.0', +'age=v90' => '9.0', +'ahex=f' => 'n', +'ahex=false' => 'n', +'ahex=n' => 'n', +'ahex=no' => 'n', +'ahex=t' => 'y', +'ahex=true' => 'y', +'ahex=y' => 'y', +'ahex=yes' => 'y', +'alpha=f' => 'n', +'alpha=false' => 'n', +'alpha=n' => 'n', +'alpha=no' => 'n', +'alpha=t' => 'y', +'alpha=true' => 'y', +'alpha=y' => 'y', +'alpha=yes' => 'y', +'bc=al' => 'al', +'bc=an' => 'an', +'bc=arabicletter' => 'al', +'bc=arabicnumber' => 'an', +'bc=b' => 'b', +'bc=bn' => 'bn', +'bc=boundaryneutral' => 'bn', +'bc=commonseparator' => 'cs', +'bc=cs' => 'cs', +'bc=en' => 'en', +'bc=es' => 'es', +'bc=et' => 'et', +'bc=europeannumber' => 'en', +'bc=europeanseparator' => 'es', +'bc=europeanterminator' => 'et', +'bc=firststrongisolate' => 'fsi', +'bc=fsi' => 'fsi', +'bc=l' => 'l', +'bc=lefttoright' => 'l', +'bc=lefttorightembedding' => 'lre', +'bc=lefttorightisolate' => 'lri', +'bc=lefttorightoverride' => 'lro', +'bc=lre' => 'lre', +'bc=lri' => 'lri', +'bc=lro' => 'lro', +'bc=nonspacingmark' => 'nsm', +'bc=nsm' => 'nsm', +'bc=on' => 'on', +'bc=otherneutral' => 'on', +'bc=paragraphseparator' => 'b', +'bc=pdf' => 'pdf', +'bc=pdi' => 'pdi', +'bc=popdirectionalformat' => 'pdf', +'bc=popdirectionalisolate' => 'pdi', +'bc=r' => 'r', +'bc=righttoleft' => 'r', +'bc=righttoleftembedding' => 'rle', +'bc=righttoleftisolate' => 'rli', +'bc=righttoleftoverride' => 'rlo', +'bc=rle' => 'rle', +'bc=rli' => 'rli', +'bc=rlo' => 'rlo', +'bc=s' => 's', +'bc=segmentseparator' => 's', +'bc=whitespace' => 'ws', +'bc=ws' => 'ws', +'bidic=f' => 'n', +'bidic=false' => 'n', +'bidic=n' => 'n', +'bidic=no' => 'n', +'bidic=t' => 'y', +'bidic=true' => 'y', +'bidic=y' => 'y', +'bidic=yes' => 'y', +'bidim=f' => 'n', +'bidim=false' => 'n', +'bidim=n' => 'n', +'bidim=no' => 'n', +'bidim=t' => 'y', +'bidim=true' => 'y', +'bidim=y' => 'y', +'bidim=yes' => 'y', +'blk=adlam' => 'adlam', +'blk=aegeannumbers' => 'aegeannumbers', +'blk=ahom' => 'ahom', +'blk=alchemical' => 'alchemical', +'blk=alchemicalsymbols' => 'alchemical', +'blk=alphabeticpf' => 'alphabeticpf', +'blk=alphabeticpresentationforms' => 'alphabeticpf', +'blk=anatolianhieroglyphs' => 'anatolianhieroglyphs', +'blk=ancientgreekmusic' => 'ancientgreekmusic', +'blk=ancientgreekmusicalnotation' => 'ancientgreekmusic', +'blk=ancientgreeknumbers' => 'ancientgreeknumbers', +'blk=ancientsymbols' => 'ancientsymbols', +'blk=arabic' => 'arabic', +'blk=arabicexta' => 'arabicexta', +'blk=arabicextendeda' => 'arabicexta', +'blk=arabicmath' => 'arabicmath', +'blk=arabicmathematicalalphabeticsymbols' => 'arabicmath', +'blk=arabicpfa' => 'arabicpfa', +'blk=arabicpfb' => 'arabicpfb', +'blk=arabicpresentationformsa' => 'arabicpfa', +'blk=arabicpresentationformsb' => 'arabicpfb', +'blk=arabicsup' => 'arabicsup', +'blk=arabicsupplement' => 'arabicsup', +'blk=armenian' => 'armenian', +'blk=arrows' => 'arrows', +'blk=ascii' => 'ascii', +'blk=avestan' => 'avestan', +'blk=balinese' => 'balinese', +'blk=bamum' => 'bamum', +'blk=bamumsup' => 'bamumsup', +'blk=bamumsupplement' => 'bamumsup', +'blk=basiclatin' => 'ascii', +'blk=bassavah' => 'bassavah', +'blk=batak' => 'batak', +'blk=bengali' => 'bengali', +'blk=bhaiksuki' => 'bhaiksuki', +'blk=blockelements' => 'blockelements', +'blk=bopomofo' => 'bopomofo', +'blk=bopomofoext' => 'bopomofoext', +'blk=bopomofoextended' => 'bopomofoext', +'blk=boxdrawing' => 'boxdrawing', +'blk=brahmi' => 'brahmi', +'blk=braille' => 'braille', +'blk=braillepatterns' => 'braille', +'blk=buginese' => 'buginese', +'blk=buhid' => 'buhid', +'blk=byzantinemusic' => 'byzantinemusic', +'blk=byzantinemusicalsymbols' => 'byzantinemusic', +'blk=canadiansyllabics' => 'ucas', +'blk=carian' => 'carian', +'blk=caucasianalbanian' => 'caucasianalbanian', +'blk=chakma' => 'chakma', +'blk=cham' => 'cham', +'blk=cherokee' => 'cherokee', +'blk=cherokeesup' => 'cherokeesup', +'blk=cherokeesupplement' => 'cherokeesup', +'blk=cjk' => 'cjk', +'blk=cjkcompat' => 'cjkcompat', +'blk=cjkcompatforms' => 'cjkcompatforms', +'blk=cjkcompatibility' => 'cjkcompat', +'blk=cjkcompatibilityforms' => 'cjkcompatforms', +'blk=cjkcompatibilityideographs' => 'cjkcompatideographs', +'blk=cjkcompatibilityideographssupplement' => 'cjkcompatideographssup', +'blk=cjkcompatideographs' => 'cjkcompatideographs', +'blk=cjkcompatideographssup' => 'cjkcompatideographssup', +'blk=cjkexta' => 'cjkexta', +'blk=cjkextb' => 'cjkextb', +'blk=cjkextc' => 'cjkextc', +'blk=cjkextd' => 'cjkextd', +'blk=cjkexte' => 'cjkexte', +'blk=cjkextf' => 'cjkextf', +'blk=cjkradicalssup' => 'cjkradicalssup', +'blk=cjkradicalssupplement' => 'cjkradicalssup', +'blk=cjkstrokes' => 'cjkstrokes', +'blk=cjksymbols' => 'cjksymbols', +'blk=cjksymbolsandpunctuation' => 'cjksymbols', +'blk=cjkunifiedideographs' => 'cjk', +'blk=cjkunifiedideographsextensiona' => 'cjkexta', +'blk=cjkunifiedideographsextensionb' => 'cjkextb', +'blk=cjkunifiedideographsextensionc' => 'cjkextc', +'blk=cjkunifiedideographsextensiond' => 'cjkextd', +'blk=cjkunifiedideographsextensione' => 'cjkexte', +'blk=cjkunifiedideographsextensionf' => 'cjkextf', +'blk=combiningdiacriticalmarks' => 'diacriticals', +'blk=combiningdiacriticalmarksextended' => 'diacriticalsext', +'blk=combiningdiacriticalmarksforsymbols' => 'diacriticalsforsymbols', +'blk=combiningdiacriticalmarkssupplement' => 'diacriticalssup', +'blk=combininghalfmarks' => 'halfmarks', +'blk=combiningmarksforsymbols' => 'diacriticalsforsymbols', +'blk=commonindicnumberforms' => 'indicnumberforms', +'blk=compatjamo' => 'compatjamo', +'blk=controlpictures' => 'controlpictures', +'blk=coptic' => 'coptic', +'blk=copticepactnumbers' => 'copticepactnumbers', +'blk=countingrod' => 'countingrod', +'blk=countingrodnumerals' => 'countingrod', +'blk=cuneiform' => 'cuneiform', +'blk=cuneiformnumbers' => 'cuneiformnumbers', +'blk=cuneiformnumbersandpunctuation' => 'cuneiformnumbers', +'blk=currencysymbols' => 'currencysymbols', +'blk=cypriotsyllabary' => 'cypriotsyllabary', +'blk=cyrillic' => 'cyrillic', +'blk=cyrillicexta' => 'cyrillicexta', +'blk=cyrillicextb' => 'cyrillicextb', +'blk=cyrillicextc' => 'cyrillicextc', +'blk=cyrillicextendeda' => 'cyrillicexta', +'blk=cyrillicextendedb' => 'cyrillicextb', +'blk=cyrillicextendedc' => 'cyrillicextc', +'blk=cyrillicsup' => 'cyrillicsup', +'blk=cyrillicsupplement' => 'cyrillicsup', +'blk=cyrillicsupplementary' => 'cyrillicsup', +'blk=deseret' => 'deseret', +'blk=devanagari' => 'devanagari', +'blk=devanagariext' => 'devanagariext', +'blk=devanagariextended' => 'devanagariext', +'blk=diacriticals' => 'diacriticals', +'blk=diacriticalsext' => 'diacriticalsext', +'blk=diacriticalsforsymbols' => 'diacriticalsforsymbols', +'blk=diacriticalssup' => 'diacriticalssup', +'blk=dingbats' => 'dingbats', +'blk=domino' => 'domino', +'blk=dominotiles' => 'domino', +'blk=duployan' => 'duployan', +'blk=earlydynasticcuneiform' => 'earlydynasticcuneiform', +'blk=egyptianhieroglyphs' => 'egyptianhieroglyphs', +'blk=elbasan' => 'elbasan', +'blk=emoticons' => 'emoticons', +'blk=enclosedalphanum' => 'enclosedalphanum', +'blk=enclosedalphanumerics' => 'enclosedalphanum', +'blk=enclosedalphanumericsupplement' => 'enclosedalphanumsup', +'blk=enclosedalphanumsup' => 'enclosedalphanumsup', +'blk=enclosedcjk' => 'enclosedcjk', +'blk=enclosedcjklettersandmonths' => 'enclosedcjk', +'blk=enclosedideographicsup' => 'enclosedideographicsup', +'blk=enclosedideographicsupplement' => 'enclosedideographicsup', +'blk=ethiopic' => 'ethiopic', +'blk=ethiopicext' => 'ethiopicext', +'blk=ethiopicexta' => 'ethiopicexta', +'blk=ethiopicextended' => 'ethiopicext', +'blk=ethiopicextendeda' => 'ethiopicexta', +'blk=ethiopicsup' => 'ethiopicsup', +'blk=ethiopicsupplement' => 'ethiopicsup', +'blk=generalpunctuation' => 'punctuation', +'blk=geometricshapes' => 'geometricshapes', +'blk=geometricshapesext' => 'geometricshapesext', +'blk=geometricshapesextended' => 'geometricshapesext', +'blk=georgian' => 'georgian', +'blk=georgiansup' => 'georgiansup', +'blk=georgiansupplement' => 'georgiansup', +'blk=glagolitic' => 'glagolitic', +'blk=glagoliticsup' => 'glagoliticsup', +'blk=glagoliticsupplement' => 'glagoliticsup', +'blk=gothic' => 'gothic', +'blk=grantha' => 'grantha', +'blk=greek' => 'greek', +'blk=greekandcoptic' => 'greek', +'blk=greekext' => 'greekext', +'blk=greekextended' => 'greekext', +'blk=gujarati' => 'gujarati', +'blk=gurmukhi' => 'gurmukhi', +'blk=halfandfullforms' => 'halfandfullforms', +'blk=halfmarks' => 'halfmarks', +'blk=halfwidthandfullwidthforms' => 'halfandfullforms', +'blk=hangul' => 'hangul', +'blk=hangulcompatibilityjamo' => 'compatjamo', +'blk=hanguljamo' => 'jamo', +'blk=hanguljamoextendeda' => 'jamoexta', +'blk=hanguljamoextendedb' => 'jamoextb', +'blk=hangulsyllables' => 'hangul', +'blk=hanunoo' => 'hanunoo', +'blk=hatran' => 'hatran', +'blk=hebrew' => 'hebrew', +'blk=highprivateusesurrogates' => 'highpusurrogates', +'blk=highpusurrogates' => 'highpusurrogates', +'blk=highsurrogates' => 'highsurrogates', +'blk=hiragana' => 'hiragana', +'blk=idc' => 'idc', +'blk=ideographicdescriptioncharacters' => 'idc', +'blk=ideographicsymbols' => 'ideographicsymbols', +'blk=ideographicsymbolsandpunctuation' => 'ideographicsymbols', +'blk=imperialaramaic' => 'imperialaramaic', +'blk=indicnumberforms' => 'indicnumberforms', +'blk=inscriptionalpahlavi' => 'inscriptionalpahlavi', +'blk=inscriptionalparthian' => 'inscriptionalparthian', +'blk=ipaext' => 'ipaext', +'blk=ipaextensions' => 'ipaext', +'blk=jamo' => 'jamo', +'blk=jamoexta' => 'jamoexta', +'blk=jamoextb' => 'jamoextb', +'blk=javanese' => 'javanese', +'blk=kaithi' => 'kaithi', +'blk=kanaexta' => 'kanaexta', +'blk=kanaextendeda' => 'kanaexta', +'blk=kanasup' => 'kanasup', +'blk=kanasupplement' => 'kanasup', +'blk=kanbun' => 'kanbun', +'blk=kangxi' => 'kangxi', +'blk=kangxiradicals' => 'kangxi', +'blk=kannada' => 'kannada', +'blk=katakana' => 'katakana', +'blk=katakanaext' => 'katakanaext', +'blk=katakanaphoneticextensions' => 'katakanaext', +'blk=kayahli' => 'kayahli', +'blk=kharoshthi' => 'kharoshthi', +'blk=khmer' => 'khmer', +'blk=khmersymbols' => 'khmersymbols', +'blk=khojki' => 'khojki', +'blk=khudawadi' => 'khudawadi', +'blk=lao' => 'lao', +'blk=latin1' => 'latin1sup', +'blk=latin1sup' => 'latin1sup', +'blk=latin1supplement' => 'latin1sup', +'blk=latinexta' => 'latinexta', +'blk=latinextadditional' => 'latinextadditional', +'blk=latinextb' => 'latinextb', +'blk=latinextc' => 'latinextc', +'blk=latinextd' => 'latinextd', +'blk=latinexte' => 'latinexte', +'blk=latinextendeda' => 'latinexta', +'blk=latinextendedadditional' => 'latinextadditional', +'blk=latinextendedb' => 'latinextb', +'blk=latinextendedc' => 'latinextc', +'blk=latinextendedd' => 'latinextd', +'blk=latinextendede' => 'latinexte', +'blk=lepcha' => 'lepcha', +'blk=letterlikesymbols' => 'letterlikesymbols', +'blk=limbu' => 'limbu', +'blk=lineara' => 'lineara', +'blk=linearbideograms' => 'linearbideograms', +'blk=linearbsyllabary' => 'linearbsyllabary', +'blk=lisu' => 'lisu', +'blk=lowsurrogates' => 'lowsurrogates', +'blk=lycian' => 'lycian', +'blk=lydian' => 'lydian', +'blk=mahajani' => 'mahajani', +'blk=mahjong' => 'mahjong', +'blk=mahjongtiles' => 'mahjong', +'blk=malayalam' => 'malayalam', +'blk=mandaic' => 'mandaic', +'blk=manichaean' => 'manichaean', +'blk=marchen' => 'marchen', +'blk=masaramgondi' => 'masaramgondi', +'blk=mathalphanum' => 'mathalphanum', +'blk=mathematicalalphanumericsymbols' => 'mathalphanum', +'blk=mathematicaloperators' => 'mathoperators', +'blk=mathoperators' => 'mathoperators', +'blk=meeteimayek' => 'meeteimayek', +'blk=meeteimayekext' => 'meeteimayekext', +'blk=meeteimayekextensions' => 'meeteimayekext', +'blk=mendekikakui' => 'mendekikakui', +'blk=meroiticcursive' => 'meroiticcursive', +'blk=meroitichieroglyphs' => 'meroitichieroglyphs', +'blk=miao' => 'miao', +'blk=miscarrows' => 'miscarrows', +'blk=miscellaneousmathematicalsymbolsa' => 'miscmathsymbolsa', +'blk=miscellaneousmathematicalsymbolsb' => 'miscmathsymbolsb', +'blk=miscellaneoussymbols' => 'miscsymbols', +'blk=miscellaneoussymbolsandarrows' => 'miscarrows', +'blk=miscellaneoussymbolsandpictographs' => 'miscpictographs', +'blk=miscellaneoustechnical' => 'misctechnical', +'blk=miscmathsymbolsa' => 'miscmathsymbolsa', +'blk=miscmathsymbolsb' => 'miscmathsymbolsb', +'blk=miscpictographs' => 'miscpictographs', +'blk=miscsymbols' => 'miscsymbols', +'blk=misctechnical' => 'misctechnical', +'blk=modi' => 'modi', +'blk=modifierletters' => 'modifierletters', +'blk=modifiertoneletters' => 'modifiertoneletters', +'blk=mongolian' => 'mongolian', +'blk=mongoliansup' => 'mongoliansup', +'blk=mongoliansupplement' => 'mongoliansup', +'blk=mro' => 'mro', +'blk=multani' => 'multani', +'blk=music' => 'music', +'blk=musicalsymbols' => 'music', +'blk=myanmar' => 'myanmar', +'blk=myanmarexta' => 'myanmarexta', +'blk=myanmarextb' => 'myanmarextb', +'blk=myanmarextendeda' => 'myanmarexta', +'blk=myanmarextendedb' => 'myanmarextb', +'blk=nabataean' => 'nabataean', +'blk=nb' => 'nb', +'blk=newa' => 'newa', +'blk=newtailue' => 'newtailue', +'blk=nko' => 'nko', +'blk=noblock' => 'nb', +'blk=numberforms' => 'numberforms', +'blk=nushu' => 'nushu', +'blk=ocr' => 'ocr', +'blk=ogham' => 'ogham', +'blk=olchiki' => 'olchiki', +'blk=oldhungarian' => 'oldhungarian', +'blk=olditalic' => 'olditalic', +'blk=oldnortharabian' => 'oldnortharabian', +'blk=oldpermic' => 'oldpermic', +'blk=oldpersian' => 'oldpersian', +'blk=oldsoutharabian' => 'oldsoutharabian', +'blk=oldturkic' => 'oldturkic', +'blk=opticalcharacterrecognition' => 'ocr', +'blk=oriya' => 'oriya', +'blk=ornamentaldingbats' => 'ornamentaldingbats', +'blk=osage' => 'osage', +'blk=osmanya' => 'osmanya', +'blk=pahawhhmong' => 'pahawhhmong', +'blk=palmyrene' => 'palmyrene', +'blk=paucinhau' => 'paucinhau', +'blk=phagspa' => 'phagspa', +'blk=phaistos' => 'phaistos', +'blk=phaistosdisc' => 'phaistos', +'blk=phoenician' => 'phoenician', +'blk=phoneticext' => 'phoneticext', +'blk=phoneticextensions' => 'phoneticext', +'blk=phoneticextensionssupplement' => 'phoneticextsup', +'blk=phoneticextsup' => 'phoneticextsup', +'blk=playingcards' => 'playingcards', +'blk=privateuse' => 'pua', +'blk=privateusearea' => 'pua', +'blk=psalterpahlavi' => 'psalterpahlavi', +'blk=pua' => 'pua', +'blk=punctuation' => 'punctuation', +'blk=rejang' => 'rejang', +'blk=rumi' => 'rumi', +'blk=ruminumeralsymbols' => 'rumi', +'blk=runic' => 'runic', +'blk=samaritan' => 'samaritan', +'blk=saurashtra' => 'saurashtra', +'blk=sharada' => 'sharada', +'blk=shavian' => 'shavian', +'blk=shorthandformatcontrols' => 'shorthandformatcontrols', +'blk=siddham' => 'siddham', +'blk=sinhala' => 'sinhala', +'blk=sinhalaarchaicnumbers' => 'sinhalaarchaicnumbers', +'blk=smallforms' => 'smallforms', +'blk=smallformvariants' => 'smallforms', +'blk=sorasompeng' => 'sorasompeng', +'blk=soyombo' => 'soyombo', +'blk=spacingmodifierletters' => 'modifierletters', +'blk=specials' => 'specials', +'blk=sundanese' => 'sundanese', +'blk=sundanesesup' => 'sundanesesup', +'blk=sundanesesupplement' => 'sundanesesup', +'blk=suparrowsa' => 'suparrowsa', +'blk=suparrowsb' => 'suparrowsb', +'blk=suparrowsc' => 'suparrowsc', +'blk=superandsub' => 'superandsub', +'blk=superscriptsandsubscripts' => 'superandsub', +'blk=supmathoperators' => 'supmathoperators', +'blk=supplementalarrowsa' => 'suparrowsa', +'blk=supplementalarrowsb' => 'suparrowsb', +'blk=supplementalarrowsc' => 'suparrowsc', +'blk=supplementalmathematicaloperators' => 'supmathoperators', +'blk=supplementalpunctuation' => 'suppunctuation', +'blk=supplementalsymbolsandpictographs' => 'supsymbolsandpictographs', +'blk=supplementaryprivateuseareaa' => 'suppuaa', +'blk=supplementaryprivateuseareab' => 'suppuab', +'blk=suppuaa' => 'suppuaa', +'blk=suppuab' => 'suppuab', +'blk=suppunctuation' => 'suppunctuation', +'blk=supsymbolsandpictographs' => 'supsymbolsandpictographs', +'blk=suttonsignwriting' => 'suttonsignwriting', +'blk=sylotinagri' => 'sylotinagri', +'blk=syriac' => 'syriac', +'blk=syriacsup' => 'syriacsup', +'blk=syriacsupplement' => 'syriacsup', +'blk=tagalog' => 'tagalog', +'blk=tagbanwa' => 'tagbanwa', +'blk=tags' => 'tags', +'blk=taile' => 'taile', +'blk=taitham' => 'taitham', +'blk=taiviet' => 'taiviet', +'blk=taixuanjing' => 'taixuanjing', +'blk=taixuanjingsymbols' => 'taixuanjing', +'blk=takri' => 'takri', +'blk=tamil' => 'tamil', +'blk=tangut' => 'tangut', +'blk=tangutcomponents' => 'tangutcomponents', +'blk=telugu' => 'telugu', +'blk=thaana' => 'thaana', +'blk=thai' => 'thai', +'blk=tibetan' => 'tibetan', +'blk=tifinagh' => 'tifinagh', +'blk=tirhuta' => 'tirhuta', +'blk=transportandmap' => 'transportandmap', +'blk=transportandmapsymbols' => 'transportandmap', +'blk=ucas' => 'ucas', +'blk=ucasext' => 'ucasext', +'blk=ugaritic' => 'ugaritic', +'blk=unifiedcanadianaboriginalsyllabics' => 'ucas', +'blk=unifiedcanadianaboriginalsyllabicsextended' => 'ucasext', +'blk=vai' => 'vai', +'blk=variationselectors' => 'vs', +'blk=variationselectorssupplement' => 'vssup', +'blk=vedicext' => 'vedicext', +'blk=vedicextensions' => 'vedicext', +'blk=verticalforms' => 'verticalforms', +'blk=vs' => 'vs', +'blk=vssup' => 'vssup', +'blk=warangciti' => 'warangciti', +'blk=yijing' => 'yijing', +'blk=yijinghexagramsymbols' => 'yijing', +'blk=yiradicals' => 'yiradicals', +'blk=yisyllables' => 'yisyllables', +'blk=zanabazarsquare' => 'zanabazarsquare', +'bpt=c' => 'c', +'bpt=close' => 'c', +'bpt=n' => 'n', +'bpt=none' => 'n', +'bpt=o' => 'o', +'bpt=open' => 'o', +'cased=f' => 'n', +'cased=false' => 'n', +'cased=n' => 'n', +'cased=no' => 'n', +'cased=t' => 'y', +'cased=true' => 'y', +'cased=y' => 'y', +'cased=yes' => 'y', +'ccc=0' => 'nr', +'ccc=1' => 'ov', +'ccc=10' => 'ccc10', +'ccc=103' => 'ccc103', +'ccc=107' => 'ccc107', +'ccc=11' => 'ccc11', +'ccc=118' => 'ccc118', +'ccc=12' => 'ccc12', +'ccc=122' => 'ccc122', +'ccc=129' => 'ccc129', +'ccc=13' => 'ccc13', +'ccc=130' => 'ccc130', +'ccc=132' => 'ccc132', +'ccc=133' => 'ccc133', +'ccc=14' => 'ccc14', +'ccc=15' => 'ccc15', +'ccc=16' => 'ccc16', +'ccc=17' => 'ccc17', +'ccc=18' => 'ccc18', +'ccc=19' => 'ccc19', +'ccc=20' => 'ccc20', +'ccc=200' => 'atbl', +'ccc=202' => 'atb', +'ccc=21' => 'ccc21', +'ccc=214' => 'ata', +'ccc=216' => 'atar', +'ccc=218' => 'bl', +'ccc=22' => 'ccc22', +'ccc=220' => 'b', +'ccc=222' => 'br', +'ccc=224' => 'l', +'ccc=226' => 'r', +'ccc=228' => 'al', +'ccc=23' => 'ccc23', +'ccc=230' => 'a', +'ccc=232' => 'ar', +'ccc=233' => 'db', +'ccc=234' => 'da', +'ccc=24' => 'ccc24', +'ccc=240' => 'is', +'ccc=25' => 'ccc25', +'ccc=26' => 'ccc26', +'ccc=27' => 'ccc27', +'ccc=28' => 'ccc28', +'ccc=29' => 'ccc29', +'ccc=30' => 'ccc30', +'ccc=31' => 'ccc31', +'ccc=32' => 'ccc32', +'ccc=33' => 'ccc33', +'ccc=34' => 'ccc34', +'ccc=35' => 'ccc35', +'ccc=36' => 'ccc36', +'ccc=7' => 'nk', +'ccc=8' => 'kv', +'ccc=84' => 'ccc84', +'ccc=9' => 'vr', +'ccc=91' => 'ccc91', +'ccc=a' => 'a', +'ccc=above' => 'a', +'ccc=aboveleft' => 'al', +'ccc=aboveright' => 'ar', +'ccc=al' => 'al', +'ccc=ar' => 'ar', +'ccc=ata' => 'ata', +'ccc=atar' => 'atar', +'ccc=atb' => 'atb', +'ccc=atbl' => 'atbl', +'ccc=attachedabove' => 'ata', +'ccc=attachedaboveright' => 'atar', +'ccc=attachedbelow' => 'atb', +'ccc=attachedbelowleft' => 'atbl', +'ccc=b' => 'b', +'ccc=below' => 'b', +'ccc=belowleft' => 'bl', +'ccc=belowright' => 'br', +'ccc=bl' => 'bl', +'ccc=br' => 'br', +'ccc=ccc10' => 'ccc10', +'ccc=ccc103' => 'ccc103', +'ccc=ccc107' => 'ccc107', +'ccc=ccc11' => 'ccc11', +'ccc=ccc118' => 'ccc118', +'ccc=ccc12' => 'ccc12', +'ccc=ccc122' => 'ccc122', +'ccc=ccc129' => 'ccc129', +'ccc=ccc13' => 'ccc13', +'ccc=ccc130' => 'ccc130', +'ccc=ccc132' => 'ccc132', +'ccc=ccc133' => 'ccc133', +'ccc=ccc14' => 'ccc14', +'ccc=ccc15' => 'ccc15', +'ccc=ccc16' => 'ccc16', +'ccc=ccc17' => 'ccc17', +'ccc=ccc18' => 'ccc18', +'ccc=ccc19' => 'ccc19', +'ccc=ccc20' => 'ccc20', +'ccc=ccc21' => 'ccc21', +'ccc=ccc22' => 'ccc22', +'ccc=ccc23' => 'ccc23', +'ccc=ccc24' => 'ccc24', +'ccc=ccc25' => 'ccc25', +'ccc=ccc26' => 'ccc26', +'ccc=ccc27' => 'ccc27', +'ccc=ccc28' => 'ccc28', +'ccc=ccc29' => 'ccc29', +'ccc=ccc30' => 'ccc30', +'ccc=ccc31' => 'ccc31', +'ccc=ccc32' => 'ccc32', +'ccc=ccc33' => 'ccc33', +'ccc=ccc34' => 'ccc34', +'ccc=ccc35' => 'ccc35', +'ccc=ccc36' => 'ccc36', +'ccc=ccc84' => 'ccc84', +'ccc=ccc91' => 'ccc91', +'ccc=da' => 'da', +'ccc=db' => 'db', +'ccc=doubleabove' => 'da', +'ccc=doublebelow' => 'db', +'ccc=iotasubscript' => 'is', +'ccc=is' => 'is', +'ccc=kanavoicing' => 'kv', +'ccc=kv' => 'kv', +'ccc=l' => 'l', +'ccc=left' => 'l', +'ccc=nk' => 'nk', +'ccc=notreordered' => 'nr', +'ccc=nr' => 'nr', +'ccc=nukta' => 'nk', +'ccc=ov' => 'ov', +'ccc=overlay' => 'ov', +'ccc=r' => 'r', +'ccc=right' => 'r', +'ccc=virama' => 'vr', +'ccc=vr' => 'vr', +'ce=f' => 'n', +'ce=false' => 'n', +'ce=n' => 'n', +'ce=no' => 'n', +'ce=t' => 'y', +'ce=true' => 'y', +'ce=y' => 'y', +'ce=yes' => 'y', +'ci=f' => 'n', +'ci=false' => 'n', +'ci=n' => 'n', +'ci=no' => 'n', +'ci=t' => 'y', +'ci=true' => 'y', +'ci=y' => 'y', +'ci=yes' => 'y', +'compex=f' => 'n', +'compex=false' => 'n', +'compex=n' => 'n', +'compex=no' => 'n', +'compex=t' => 'y', +'compex=true' => 'y', +'compex=y' => 'y', +'compex=yes' => 'y', +'cwcf=f' => 'n', +'cwcf=false' => 'n', +'cwcf=n' => 'n', +'cwcf=no' => 'n', +'cwcf=t' => 'y', +'cwcf=true' => 'y', +'cwcf=y' => 'y', +'cwcf=yes' => 'y', +'cwcm=f' => 'n', +'cwcm=false' => 'n', +'cwcm=n' => 'n', +'cwcm=no' => 'n', +'cwcm=t' => 'y', +'cwcm=true' => 'y', +'cwcm=y' => 'y', +'cwcm=yes' => 'y', +'cwkcf=f' => 'n', +'cwkcf=false' => 'n', +'cwkcf=n' => 'n', +'cwkcf=no' => 'n', +'cwkcf=t' => 'y', +'cwkcf=true' => 'y', +'cwkcf=y' => 'y', +'cwkcf=yes' => 'y', +'cwl=f' => 'n', +'cwl=false' => 'n', +'cwl=n' => 'n', +'cwl=no' => 'n', +'cwl=t' => 'y', +'cwl=true' => 'y', +'cwl=y' => 'y', +'cwl=yes' => 'y', +'cwt=f' => 'n', +'cwt=false' => 'n', +'cwt=n' => 'n', +'cwt=no' => 'n', +'cwt=t' => 'y', +'cwt=true' => 'y', +'cwt=y' => 'y', +'cwt=yes' => 'y', +'cwu=f' => 'n', +'cwu=false' => 'n', +'cwu=n' => 'n', +'cwu=no' => 'n', +'cwu=t' => 'y', +'cwu=true' => 'y', +'cwu=y' => 'y', +'cwu=yes' => 'y', +'dash=f' => 'n', +'dash=false' => 'n', +'dash=n' => 'n', +'dash=no' => 'n', +'dash=t' => 'y', +'dash=true' => 'y', +'dash=y' => 'y', +'dash=yes' => 'y', +'dep=f' => 'n', +'dep=false' => 'n', +'dep=n' => 'n', +'dep=no' => 'n', +'dep=t' => 'y', +'dep=true' => 'y', +'dep=y' => 'y', +'dep=yes' => 'y', +'di=f' => 'n', +'di=false' => 'n', +'di=n' => 'n', +'di=no' => 'n', +'di=t' => 'y', +'di=true' => 'y', +'di=y' => 'y', +'di=yes' => 'y', +'dia=f' => 'n', +'dia=false' => 'n', +'dia=n' => 'n', +'dia=no' => 'n', +'dia=t' => 'y', +'dia=true' => 'y', +'dia=y' => 'y', +'dia=yes' => 'y', +'dt=can' => 'can', +'dt=canonical' => 'can', +'dt=circle' => 'enc', +'dt=com' => 'com', +'dt=compat' => 'com', +'dt=enc' => 'enc', +'dt=fin' => 'fin', +'dt=final' => 'fin', +'dt=font' => 'font', +'dt=fra' => 'fra', +'dt=fraction' => 'fra', +'dt=init' => 'init', +'dt=initial' => 'init', +'dt=iso' => 'iso', +'dt=isolated' => 'iso', +'dt=med' => 'med', +'dt=medial' => 'med', +'dt=nar' => 'nar', +'dt=narrow' => 'nar', +'dt=nb' => 'nb', +'dt=nobreak' => 'nb', +'dt=noncanon' => 'noncanon', +'dt=noncanonical' => 'noncanon', +'dt=none' => 'none', +'dt=small' => 'sml', +'dt=sml' => 'sml', +'dt=sqr' => 'sqr', +'dt=square' => 'sqr', +'dt=sub' => 'sub', +'dt=sup' => 'sup', +'dt=super' => 'sup', +'dt=vert' => 'vert', +'dt=vertical' => 'vert', +'dt=wide' => 'wide', +'ea=a' => 'a', +'ea=ambiguous' => 'a', +'ea=f' => 'f', +'ea=fullwidth' => 'f', +'ea=h' => 'h', +'ea=halfwidth' => 'h', +'ea=n' => 'n', +'ea=na' => 'na', +'ea=narrow' => 'na', +'ea=neutral' => 'n', +'ea=w' => 'w', +'ea=wide' => 'w', +'ext=f' => 'n', +'ext=false' => 'n', +'ext=n' => 'n', +'ext=no' => 'n', +'ext=t' => 'y', +'ext=true' => 'y', +'ext=y' => 'y', +'ext=yes' => 'y', +'gc=c' => 'c', +'gc=casedletter' => 'lc', +'gc=cc' => 'cc', +'gc=cf' => 'cf', +'gc=closepunctuation' => 'pe', +'gc=cn' => 'cn', +'gc=cntrl' => 'cc', +'gc=co' => 'co', +'gc=combiningmark' => 'm', +'gc=connectorpunctuation' => 'pc', +'gc=control' => 'cc', +'gc=cs' => 'cs', +'gc=currencysymbol' => 'sc', +'gc=dashpunctuation' => 'pd', +'gc=decimalnumber' => 'nd', +'gc=digit' => 'nd', +'gc=enclosingmark' => 'me', +'gc=finalpunctuation' => 'pf', +'gc=format' => 'cf', +'gc=initialpunctuation' => 'pi', +'gc=l' => 'l', +'gc=l&' => 'lc', +'gc=l_' => 'lc', +'gc=lc' => 'lc', +'gc=letter' => 'l', +'gc=letternumber' => 'nl', +'gc=lineseparator' => 'zl', +'gc=ll' => 'll', +'gc=lm' => 'lm', +'gc=lo' => 'lo', +'gc=lowercaseletter' => 'll', +'gc=lt' => 'lt', +'gc=lu' => 'lu', +'gc=m' => 'm', +'gc=mark' => 'm', +'gc=mathsymbol' => 'sm', +'gc=mc' => 'mc', +'gc=me' => 'me', +'gc=mn' => 'mn', +'gc=modifierletter' => 'lm', +'gc=modifiersymbol' => 'sk', +'gc=n' => 'n', +'gc=nd' => 'nd', +'gc=nl' => 'nl', +'gc=no' => 'no', +'gc=nonspacingmark' => 'mn', +'gc=number' => 'n', +'gc=openpunctuation' => 'ps', +'gc=other' => 'c', +'gc=otherletter' => 'lo', +'gc=othernumber' => 'no', +'gc=otherpunctuation' => 'po', +'gc=othersymbol' => 'so', +'gc=p' => 'p', +'gc=paragraphseparator' => 'zp', +'gc=pc' => 'pc', +'gc=pd' => 'pd', +'gc=pe' => 'pe', +'gc=pf' => 'pf', +'gc=pi' => 'pi', +'gc=po' => 'po', +'gc=privateuse' => 'co', +'gc=ps' => 'ps', +'gc=punct' => 'p', +'gc=punctuation' => 'p', +'gc=s' => 's', +'gc=sc' => 'sc', +'gc=separator' => 'z', +'gc=sk' => 'sk', +'gc=sm' => 'sm', +'gc=so' => 'so', +'gc=spaceseparator' => 'zs', +'gc=spacingmark' => 'mc', +'gc=surrogate' => 'cs', +'gc=symbol' => 's', +'gc=titlecaseletter' => 'lt', +'gc=unassigned' => 'cn', +'gc=uppercaseletter' => 'lu', +'gc=z' => 'z', +'gc=zl' => 'zl', +'gc=zp' => 'zp', +'gc=zs' => 'zs', +'gcb=cn' => 'cn', +'gcb=control' => 'cn', +'gcb=cr' => 'cr', +'gcb=eb' => 'eb', +'gcb=ebase' => 'eb', +'gcb=ebasegaz' => 'ebg', +'gcb=ebg' => 'ebg', +'gcb=em' => 'em', +'gcb=emodifier' => 'em', +'gcb=ex' => 'ex', +'gcb=extend' => 'ex', +'gcb=gaz' => 'gaz', +'gcb=glueafterzwj' => 'gaz', +'gcb=l' => 'l', +'gcb=lf' => 'lf', +'gcb=lv' => 'lv', +'gcb=lvt' => 'lvt', +'gcb=other' => 'xx', +'gcb=pp' => 'pp', +'gcb=prepend' => 'pp', +'gcb=regionalindicator' => 'ri', +'gcb=ri' => 'ri', +'gcb=sm' => 'sm', +'gcb=spacingmark' => 'sm', +'gcb=t' => 't', +'gcb=v' => 'v', +'gcb=xx' => 'xx', +'gcb=zwj' => 'zwj', +'grbase=f' => 'n', +'grbase=false' => 'n', +'grbase=n' => 'n', +'grbase=no' => 'n', +'grbase=t' => 'y', +'grbase=true' => 'y', +'grbase=y' => 'y', +'grbase=yes' => 'y', +'grext=f' => 'n', +'grext=false' => 'n', +'grext=n' => 'n', +'grext=no' => 'n', +'grext=t' => 'y', +'grext=true' => 'y', +'grext=y' => 'y', +'grext=yes' => 'y', +'hex=f' => 'n', +'hex=false' => 'n', +'hex=n' => 'n', +'hex=no' => 'n', +'hex=t' => 'y', +'hex=true' => 'y', +'hex=y' => 'y', +'hex=yes' => 'y', +'hst=l' => 'l', +'hst=leadingjamo' => 'l', +'hst=lv' => 'lv', +'hst=lvsyllable' => 'lv', +'hst=lvt' => 'lvt', +'hst=lvtsyllable' => 'lvt', +'hst=na' => 'na', +'hst=notapplicable' => 'na', +'hst=t' => 't', +'hst=trailingjamo' => 't', +'hst=v' => 'v', +'hst=voweljamo' => 'v', +'hyphen=f' => 'n', +'hyphen=false' => 'n', +'hyphen=n' => 'n', +'hyphen=no' => 'n', +'hyphen=t' => 'y', +'hyphen=true' => 'y', +'hyphen=y' => 'y', +'hyphen=yes' => 'y', +'idc=f' => 'n', +'idc=false' => 'n', +'idc=n' => 'n', +'idc=no' => 'n', +'idc=t' => 'y', +'idc=true' => 'y', +'idc=y' => 'y', +'idc=yes' => 'y', +'ideo=f' => 'n', +'ideo=false' => 'n', +'ideo=n' => 'n', +'ideo=no' => 'n', +'ideo=t' => 'y', +'ideo=true' => 'y', +'ideo=y' => 'y', +'ideo=yes' => 'y', +'ids=f' => 'n', +'ids=false' => 'n', +'ids=n' => 'n', +'ids=no' => 'n', +'ids=t' => 'y', +'ids=true' => 'y', +'ids=y' => 'y', +'ids=yes' => 'y', +'idsb=f' => 'n', +'idsb=false' => 'n', +'idsb=n' => 'n', +'idsb=no' => 'n', +'idsb=t' => 'y', +'idsb=true' => 'y', +'idsb=y' => 'y', +'idsb=yes' => 'y', +'idst=f' => 'n', +'idst=false' => 'n', +'idst=n' => 'n', +'idst=no' => 'n', +'idst=t' => 'y', +'idst=true' => 'y', +'idst=y' => 'y', +'idst=yes' => 'y', +'in=1.1' => '1.1', +'in=10.0' => '10.0', +'in=2.0' => '2.0', +'in=2.1' => '2.1', +'in=3.0' => '3.0', +'in=3.1' => '3.1', +'in=3.2' => '3.2', +'in=4.0' => '4.0', +'in=4.1' => '4.1', +'in=5.0' => '5.0', +'in=5.1' => '5.1', +'in=5.2' => '5.2', +'in=6.0' => '6.0', +'in=6.1' => '6.1', +'in=6.2' => '6.2', +'in=6.3' => '6.3', +'in=7.0' => '7.0', +'in=8.0' => '8.0', +'in=9.0' => '9.0', +'in=unassigned' => 'unassigned', +'in=v100' => '10.0', +'in=v20' => '2.0', +'in=v21' => '2.1', +'in=v30' => '3.0', +'in=v31' => '3.1', +'in=v32' => '3.2', +'in=v40' => '4.0', +'in=v41' => '4.1', +'in=v50' => '5.0', +'in=v51' => '5.1', +'in=v52' => '5.2', +'in=v60' => '6.0', +'in=v61' => '6.1', +'in=v62' => '6.2', +'in=v63' => '6.3', +'in=v70' => '7.0', +'in=v80' => '8.0', +'in=v90' => '9.0', +'inpc=bottom' => 'bottom', +'inpc=bottomandleft' => 'bottomandleft', +'inpc=bottomandright' => 'bottomandright', +'inpc=left' => 'left', +'inpc=leftandright' => 'leftandright', +'inpc=na' => 'na', +'inpc=overstruck' => 'overstruck', +'inpc=right' => 'right', +'inpc=top' => 'top', +'inpc=topandbottom' => 'topandbottom', +'inpc=topandbottomandright' => 'topandbottomandright', +'inpc=topandleft' => 'topandleft', +'inpc=topandleftandright' => 'topandleftandright', +'inpc=topandright' => 'topandright', +'inpc=visualorderleft' => 'visualorderleft', +'insc=avagraha' => 'avagraha', +'insc=bindu' => 'bindu', +'insc=brahmijoiningnumber' => 'brahmijoiningnumber', +'insc=cantillationmark' => 'cantillationmark', +'insc=consonant' => 'consonant', +'insc=consonantdead' => 'consonantdead', +'insc=consonantfinal' => 'consonantfinal', +'insc=consonantheadletter' => 'consonantheadletter', +'insc=consonantkiller' => 'consonantkiller', +'insc=consonantmedial' => 'consonantmedial', +'insc=consonantplaceholder' => 'consonantplaceholder', +'insc=consonantprecedingrepha' => 'consonantprecedingrepha', +'insc=consonantprefixed' => 'consonantprefixed', +'insc=consonantsubjoined' => 'consonantsubjoined', +'insc=consonantsucceedingrepha' => 'consonantsucceedingrepha', +'insc=consonantwithstacker' => 'consonantwithstacker', +'insc=geminationmark' => 'geminationmark', +'insc=invisiblestacker' => 'invisiblestacker', +'insc=joiner' => 'joiner', +'insc=modifyingletter' => 'modifyingletter', +'insc=nonjoiner' => 'nonjoiner', +'insc=nukta' => 'nukta', +'insc=number' => 'number', +'insc=numberjoiner' => 'numberjoiner', +'insc=other' => 'other', +'insc=purekiller' => 'purekiller', +'insc=registershifter' => 'registershifter', +'insc=syllablemodifier' => 'syllablemodifier', +'insc=toneletter' => 'toneletter', +'insc=tonemark' => 'tonemark', +'insc=virama' => 'virama', +'insc=visarga' => 'visarga', +'insc=vowel' => 'vowel', +'insc=voweldependent' => 'voweldependent', +'insc=vowelindependent' => 'vowelindependent', +'jg=africanfeh' => 'africanfeh', +'jg=africannoon' => 'africannoon', +'jg=africanqaf' => 'africanqaf', +'jg=ain' => 'ain', +'jg=alaph' => 'alaph', +'jg=alef' => 'alef', +'jg=beh' => 'beh', +'jg=beth' => 'beth', +'jg=burushaskiyehbarree' => 'burushaskiyehbarree', +'jg=dal' => 'dal', +'jg=dalathrish' => 'dalathrish', +'jg=e' => 'e', +'jg=farsiyeh' => 'farsiyeh', +'jg=fe' => 'fe', +'jg=feh' => 'feh', +'jg=finalsemkath' => 'finalsemkath', +'jg=gaf' => 'gaf', +'jg=gamal' => 'gamal', +'jg=hah' => 'hah', +'jg=hamzaonhehgoal' => 'tehmarbutagoal', +'jg=he' => 'he', +'jg=heh' => 'heh', +'jg=hehgoal' => 'hehgoal', +'jg=heth' => 'heth', +'jg=kaf' => 'kaf', +'jg=kaph' => 'kaph', +'jg=khaph' => 'khaph', +'jg=knottedheh' => 'knottedheh', +'jg=lam' => 'lam', +'jg=lamadh' => 'lamadh', +'jg=malayalambha' => 'malayalambha', +'jg=malayalamja' => 'malayalamja', +'jg=malayalamlla' => 'malayalamlla', +'jg=malayalamllla' => 'malayalamllla', +'jg=malayalamnga' => 'malayalamnga', +'jg=malayalamnna' => 'malayalamnna', +'jg=malayalamnnna' => 'malayalamnnna', +'jg=malayalamnya' => 'malayalamnya', +'jg=malayalamra' => 'malayalamra', +'jg=malayalamssa' => 'malayalamssa', +'jg=malayalamtta' => 'malayalamtta', +'jg=manichaeanaleph' => 'manichaeanaleph', +'jg=manichaeanayin' => 'manichaeanayin', +'jg=manichaeanbeth' => 'manichaeanbeth', +'jg=manichaeandaleth' => 'manichaeandaleth', +'jg=manichaeandhamedh' => 'manichaeandhamedh', +'jg=manichaeanfive' => 'manichaeanfive', +'jg=manichaeangimel' => 'manichaeangimel', +'jg=manichaeanheth' => 'manichaeanheth', +'jg=manichaeanhundred' => 'manichaeanhundred', +'jg=manichaeankaph' => 'manichaeankaph', +'jg=manichaeanlamedh' => 'manichaeanlamedh', +'jg=manichaeanmem' => 'manichaeanmem', +'jg=manichaeannun' => 'manichaeannun', +'jg=manichaeanone' => 'manichaeanone', +'jg=manichaeanpe' => 'manichaeanpe', +'jg=manichaeanqoph' => 'manichaeanqoph', +'jg=manichaeanresh' => 'manichaeanresh', +'jg=manichaeansadhe' => 'manichaeansadhe', +'jg=manichaeansamekh' => 'manichaeansamekh', +'jg=manichaeantaw' => 'manichaeantaw', +'jg=manichaeanten' => 'manichaeanten', +'jg=manichaeanteth' => 'manichaeanteth', +'jg=manichaeanthamedh' => 'manichaeanthamedh', +'jg=manichaeantwenty' => 'manichaeantwenty', +'jg=manichaeanwaw' => 'manichaeanwaw', +'jg=manichaeanyodh' => 'manichaeanyodh', +'jg=manichaeanzayin' => 'manichaeanzayin', +'jg=meem' => 'meem', +'jg=mim' => 'mim', +'jg=nojoininggroup' => 'nojoininggroup', +'jg=noon' => 'noon', +'jg=nun' => 'nun', +'jg=nya' => 'nya', +'jg=pe' => 'pe', +'jg=qaf' => 'qaf', +'jg=qaph' => 'qaph', +'jg=reh' => 'reh', +'jg=reversedpe' => 'reversedpe', +'jg=rohingyayeh' => 'rohingyayeh', +'jg=sad' => 'sad', +'jg=sadhe' => 'sadhe', +'jg=seen' => 'seen', +'jg=semkath' => 'semkath', +'jg=shin' => 'shin', +'jg=straightwaw' => 'straightwaw', +'jg=swashkaf' => 'swashkaf', +'jg=syriacwaw' => 'syriacwaw', +'jg=tah' => 'tah', +'jg=taw' => 'taw', +'jg=tehmarbuta' => 'tehmarbuta', +'jg=tehmarbutagoal' => 'tehmarbutagoal', +'jg=teth' => 'teth', +'jg=waw' => 'waw', +'jg=yeh' => 'yeh', +'jg=yehbarree' => 'yehbarree', +'jg=yehwithtail' => 'yehwithtail', +'jg=yudh' => 'yudh', +'jg=yudhhe' => 'yudhhe', +'jg=zain' => 'zain', +'jg=zhain' => 'zhain', +'joinc=f' => 'n', +'joinc=false' => 'n', +'joinc=n' => 'n', +'joinc=no' => 'n', +'joinc=t' => 'y', +'joinc=true' => 'y', +'joinc=y' => 'y', +'joinc=yes' => 'y', +'jt=c' => 'c', +'jt=d' => 'd', +'jt=dualjoining' => 'd', +'jt=joincausing' => 'c', +'jt=l' => 'l', +'jt=leftjoining' => 'l', +'jt=nonjoining' => 'u', +'jt=r' => 'r', +'jt=rightjoining' => 'r', +'jt=t' => 't', +'jt=transparent' => 't', +'jt=u' => 'u', +'lb=ai' => 'ai', +'lb=al' => 'al', +'lb=alphabetic' => 'al', +'lb=ambiguous' => 'ai', +'lb=b2' => 'b2', +'lb=ba' => 'ba', +'lb=bb' => 'bb', +'lb=bk' => 'bk', +'lb=breakafter' => 'ba', +'lb=breakbefore' => 'bb', +'lb=breakboth' => 'b2', +'lb=breaksymbols' => 'sy', +'lb=carriagereturn' => 'cr', +'lb=cb' => 'cb', +'lb=cj' => 'cj', +'lb=cl' => 'cl', +'lb=closeparenthesis' => 'cp', +'lb=closepunctuation' => 'cl', +'lb=cm' => 'cm', +'lb=combiningmark' => 'cm', +'lb=complexcontext' => 'sa', +'lb=conditionaljapanesestarter' => 'cj', +'lb=contingentbreak' => 'cb', +'lb=cp' => 'cp', +'lb=cr' => 'cr', +'lb=eb' => 'eb', +'lb=ebase' => 'eb', +'lb=em' => 'em', +'lb=emodifier' => 'em', +'lb=ex' => 'ex', +'lb=exclamation' => 'ex', +'lb=gl' => 'gl', +'lb=glue' => 'gl', +'lb=h2' => 'h2', +'lb=h3' => 'h3', +'lb=hebrewletter' => 'hl', +'lb=hl' => 'hl', +'lb=hy' => 'hy', +'lb=hyphen' => 'hy', +'lb=id' => 'id', +'lb=ideographic' => 'id', +'lb=in' => 'in', +'lb=infixnumeric' => 'is', +'lb=inseparable' => 'in', +'lb=inseperable' => 'in', +'lb=is' => 'is', +'lb=jl' => 'jl', +'lb=jt' => 'jt', +'lb=jv' => 'jv', +'lb=lf' => 'lf', +'lb=linefeed' => 'lf', +'lb=mandatorybreak' => 'bk', +'lb=nextline' => 'nl', +'lb=nl' => 'nl', +'lb=nonstarter' => 'ns', +'lb=ns' => 'ns', +'lb=nu' => 'nu', +'lb=numeric' => 'nu', +'lb=op' => 'op', +'lb=openpunctuation' => 'op', +'lb=po' => 'po', +'lb=postfixnumeric' => 'po', +'lb=pr' => 'pr', +'lb=prefixnumeric' => 'pr', +'lb=qu' => 'qu', +'lb=quotation' => 'qu', +'lb=regionalindicator' => 'ri', +'lb=ri' => 'ri', +'lb=sa' => 'sa', +'lb=sg' => 'sg', +'lb=sp' => 'sp', +'lb=space' => 'sp', +'lb=surrogate' => 'sg', +'lb=sy' => 'sy', +'lb=unknown' => 'xx', +'lb=wj' => 'wj', +'lb=wordjoiner' => 'wj', +'lb=xx' => 'xx', +'lb=zw' => 'zw', +'lb=zwj' => 'zwj', +'lb=zwspace' => 'zw', +'loe=f' => 'n', +'loe=false' => 'n', +'loe=n' => 'n', +'loe=no' => 'n', +'loe=t' => 'y', +'loe=true' => 'y', +'loe=y' => 'y', +'loe=yes' => 'y', +'lower=f' => 'n', +'lower=false' => 'n', +'lower=n' => 'n', +'lower=no' => 'n', +'lower=t' => 'y', +'lower=true' => 'y', +'lower=y' => 'y', +'lower=yes' => 'y', +'math=f' => 'n', +'math=false' => 'n', +'math=n' => 'n', +'math=no' => 'n', +'math=t' => 'y', +'math=true' => 'y', +'math=y' => 'y', +'math=yes' => 'y', +'nchar=f' => 'n', +'nchar=false' => 'n', +'nchar=n' => 'n', +'nchar=no' => 'n', +'nchar=t' => 'y', +'nchar=true' => 'y', +'nchar=y' => 'y', +'nchar=yes' => 'y', +'nfcqc=m' => 'm', +'nfcqc=maybe' => 'm', +'nfcqc=n' => 'n', +'nfcqc=no' => 'n', +'nfcqc=y' => 'y', +'nfcqc=yes' => 'y', +'nfdqc=n' => 'n', +'nfdqc=no' => 'n', +'nfdqc=y' => 'y', +'nfdqc=yes' => 'y', +'nfkcqc=m' => 'm', +'nfkcqc=maybe' => 'm', +'nfkcqc=n' => 'n', +'nfkcqc=no' => 'n', +'nfkcqc=y' => 'y', +'nfkcqc=yes' => 'y', +'nfkdqc=n' => 'n', +'nfkdqc=no' => 'n', +'nfkdqc=y' => 'y', +'nfkdqc=yes' => 'y', +'nt=de' => 'de', +'nt=decimal' => 'de', +'nt=di' => 'di', +'nt=digit' => 'di', +'nt=none' => 'none', +'nt=nu' => 'nu', +'nt=numeric' => 'nu', +'nv=-1/2' => '-1/2', +'nv=0' => 0, +'nv=1' => 1, +'nv=1/10' => '1/10', +'nv=1/12' => '1/12', +'nv=1/16' => '1/16', +'nv=1/160' => '1/160', +'nv=1/2' => '1/2', +'nv=1/20' => '1/20', +'nv=1/3' => '1/3', +'nv=1/4' => '1/4', +'nv=1/40' => '1/40', +'nv=1/5' => '1/5', +'nv=1/6' => '1/6', +'nv=1/7' => '1/7', +'nv=1/8' => '1/8', +'nv=1/9' => '1/9', +'nv=10' => 10, +'nv=100' => 100, +'nv=1000' => 1000, +'nv=10000' => 10000, +'nv=100000' => 100000, +'nv=1000000' => 1000000, +'nv=100000000' => 100000000, +'nv=10000000000' => 10000000000, +'nv=1000000000000' => 1000000000000, +'nv=11' => 11, +'nv=11/12' => '11/12', +'nv=11/2' => '11/2', +'nv=12' => 12, +'nv=13' => 13, +'nv=13/2' => '13/2', +'nv=14' => 14, +'nv=15' => 15, +'nv=15/2' => '15/2', +'nv=16' => 16, +'nv=17' => 17, +'nv=17/2' => '17/2', +'nv=18' => 18, +'nv=19' => 19, +'nv=2' => 2, +'nv=2/3' => '2/3', +'nv=2/5' => '2/5', +'nv=20' => 20, +'nv=200' => 200, +'nv=2000' => 2000, +'nv=20000' => 20000, +'nv=200000' => 200000, +'nv=21' => 21, +'nv=216000' => 216000, +'nv=22' => 22, +'nv=23' => 23, +'nv=24' => 24, +'nv=25' => 25, +'nv=26' => 26, +'nv=27' => 27, +'nv=28' => 28, +'nv=29' => 29, +'nv=3' => 3, +'nv=3/16' => '3/16', +'nv=3/2' => '3/2', +'nv=3/20' => '3/20', +'nv=3/4' => '3/4', +'nv=3/5' => '3/5', +'nv=3/8' => '3/8', +'nv=3/80' => '3/80', +'nv=30' => 30, +'nv=300' => 300, +'nv=3000' => 3000, +'nv=30000' => 30000, +'nv=300000' => 300000, +'nv=31' => 31, +'nv=32' => 32, +'nv=33' => 33, +'nv=34' => 34, +'nv=35' => 35, +'nv=36' => 36, +'nv=37' => 37, +'nv=38' => 38, +'nv=39' => 39, +'nv=4' => 4, +'nv=4/5' => '4/5', +'nv=40' => 40, +'nv=400' => 400, +'nv=4000' => 4000, +'nv=40000' => 40000, +'nv=400000' => 400000, +'nv=41' => 41, +'nv=42' => 42, +'nv=43' => 43, +'nv=432000' => 432000, +'nv=44' => 44, +'nv=45' => 45, +'nv=46' => 46, +'nv=47' => 47, +'nv=48' => 48, +'nv=49' => 49, +'nv=5' => 5, +'nv=5/12' => '5/12', +'nv=5/2' => '5/2', +'nv=5/6' => '5/6', +'nv=5/8' => '5/8', +'nv=50' => 50, +'nv=500' => 500, +'nv=5000' => 5000, +'nv=50000' => 50000, +'nv=500000' => 500000, +'nv=6' => 6, +'nv=60' => 60, +'nv=600' => 600, +'nv=6000' => 6000, +'nv=60000' => 60000, +'nv=600000' => 600000, +'nv=7' => 7, +'nv=7/12' => '7/12', +'nv=7/2' => '7/2', +'nv=7/8' => '7/8', +'nv=70' => 70, +'nv=700' => 700, +'nv=7000' => 7000, +'nv=70000' => 70000, +'nv=700000' => 700000, +'nv=8' => 8, +'nv=80' => 80, +'nv=800' => 800, +'nv=8000' => 8000, +'nv=80000' => 80000, +'nv=800000' => 800000, +'nv=9' => 9, +'nv=9/2' => '9/2', +'nv=90' => 90, +'nv=900' => 900, +'nv=9000' => 9000, +'nv=90000' => 90000, +'nv=900000' => 900000, +'nv=nan' => 'nan', +'patsyn=f' => 'n', +'patsyn=false' => 'n', +'patsyn=n' => 'n', +'patsyn=no' => 'n', +'patsyn=t' => 'y', +'patsyn=true' => 'y', +'patsyn=y' => 'y', +'patsyn=yes' => 'y', +'patws=f' => 'n', +'patws=false' => 'n', +'patws=n' => 'n', +'patws=no' => 'n', +'patws=t' => 'y', +'patws=true' => 'y', +'patws=y' => 'y', +'patws=yes' => 'y', +'pcm=f' => 'n', +'pcm=false' => 'n', +'pcm=n' => 'n', +'pcm=no' => 'n', +'pcm=t' => 'y', +'pcm=true' => 'y', +'pcm=y' => 'y', +'pcm=yes' => 'y', +'qmark=f' => 'n', +'qmark=false' => 'n', +'qmark=n' => 'n', +'qmark=no' => 'n', +'qmark=t' => 'y', +'qmark=true' => 'y', +'qmark=y' => 'y', +'qmark=yes' => 'y', +'radical=f' => 'n', +'radical=false' => 'n', +'radical=n' => 'n', +'radical=no' => 'n', +'radical=t' => 'y', +'radical=true' => 'y', +'radical=y' => 'y', +'radical=yes' => 'y', +'ri=f' => 'n', +'ri=false' => 'n', +'ri=n' => 'n', +'ri=no' => 'n', +'ri=t' => 'y', +'ri=true' => 'y', +'ri=y' => 'y', +'ri=yes' => 'y', +'sb=at' => 'at', +'sb=aterm' => 'at', +'sb=cl' => 'cl', +'sb=close' => 'cl', +'sb=cr' => 'cr', +'sb=ex' => 'ex', +'sb=extend' => 'ex', +'sb=fo' => 'fo', +'sb=format' => 'fo', +'sb=le' => 'le', +'sb=lf' => 'lf', +'sb=lo' => 'lo', +'sb=lower' => 'lo', +'sb=nu' => 'nu', +'sb=numeric' => 'nu', +'sb=oletter' => 'le', +'sb=other' => 'xx', +'sb=sc' => 'sc', +'sb=scontinue' => 'sc', +'sb=se' => 'se', +'sb=sep' => 'se', +'sb=sp' => 'sp', +'sb=st' => 'st', +'sb=sterm' => 'st', +'sb=up' => 'up', +'sb=upper' => 'up', +'sb=xx' => 'xx', +'sc=adlam' => 'adlm', +'sc=adlm' => 'adlm', +'sc=aghb' => 'aghb', +'sc=ahom' => 'ahom', +'sc=anatolianhieroglyphs' => 'hluw', +'sc=arab' => 'arab', +'sc=arabic' => 'arab', +'sc=armenian' => 'armn', +'sc=armi' => 'armi', +'sc=armn' => 'armn', +'sc=avestan' => 'avst', +'sc=avst' => 'avst', +'sc=bali' => 'bali', +'sc=balinese' => 'bali', +'sc=bamu' => 'bamu', +'sc=bamum' => 'bamu', +'sc=bass' => 'bass', +'sc=bassavah' => 'bass', +'sc=batak' => 'batk', +'sc=batk' => 'batk', +'sc=beng' => 'beng', +'sc=bengali' => 'beng', +'sc=bhaiksuki' => 'bhks', +'sc=bhks' => 'bhks', +'sc=bopo' => 'bopo', +'sc=bopomofo' => 'bopo', +'sc=brah' => 'brah', +'sc=brahmi' => 'brah', +'sc=brai' => 'brai', +'sc=braille' => 'brai', +'sc=bugi' => 'bugi', +'sc=buginese' => 'bugi', +'sc=buhd' => 'buhd', +'sc=buhid' => 'buhd', +'sc=cakm' => 'cakm', +'sc=canadianaboriginal' => 'cans', +'sc=cans' => 'cans', +'sc=cari' => 'cari', +'sc=carian' => 'cari', +'sc=caucasianalbanian' => 'aghb', +'sc=chakma' => 'cakm', +'sc=cham' => 'cham', +'sc=cher' => 'cher', +'sc=cherokee' => 'cher', +'sc=common' => 'zyyy', +'sc=copt' => 'copt', +'sc=coptic' => 'copt', +'sc=cprt' => 'cprt', +'sc=cuneiform' => 'xsux', +'sc=cypriot' => 'cprt', +'sc=cyrillic' => 'cyrl', +'sc=cyrl' => 'cyrl', +'sc=deseret' => 'dsrt', +'sc=deva' => 'deva', +'sc=devanagari' => 'deva', +'sc=dsrt' => 'dsrt', +'sc=dupl' => 'dupl', +'sc=duployan' => 'dupl', +'sc=egyp' => 'egyp', +'sc=egyptianhieroglyphs' => 'egyp', +'sc=elba' => 'elba', +'sc=elbasan' => 'elba', +'sc=ethi' => 'ethi', +'sc=ethiopic' => 'ethi', +'sc=geor' => 'geor', +'sc=georgian' => 'geor', +'sc=glag' => 'glag', +'sc=glagolitic' => 'glag', +'sc=gonm' => 'gonm', +'sc=goth' => 'goth', +'sc=gothic' => 'goth', +'sc=gran' => 'gran', +'sc=grantha' => 'gran', +'sc=greek' => 'grek', +'sc=grek' => 'grek', +'sc=gujarati' => 'gujr', +'sc=gujr' => 'gujr', +'sc=gurmukhi' => 'guru', +'sc=guru' => 'guru', +'sc=han' => 'hani', +'sc=hang' => 'hang', +'sc=hangul' => 'hang', +'sc=hani' => 'hani', +'sc=hano' => 'hano', +'sc=hanunoo' => 'hano', +'sc=hatr' => 'hatr', +'sc=hatran' => 'hatr', +'sc=hebr' => 'hebr', +'sc=hebrew' => 'hebr', +'sc=hira' => 'hira', +'sc=hiragana' => 'hira', +'sc=hluw' => 'hluw', +'sc=hmng' => 'hmng', +'sc=hung' => 'hung', +'sc=imperialaramaic' => 'armi', +'sc=inherited' => 'zinh', +'sc=inscriptionalpahlavi' => 'phli', +'sc=inscriptionalparthian' => 'prti', +'sc=ital' => 'ital', +'sc=java' => 'java', +'sc=javanese' => 'java', +'sc=kaithi' => 'kthi', +'sc=kali' => 'kali', +'sc=kana' => 'kana', +'sc=kannada' => 'knda', +'sc=katakana' => 'kana', +'sc=kayahli' => 'kali', +'sc=khar' => 'khar', +'sc=kharoshthi' => 'khar', +'sc=khmer' => 'khmr', +'sc=khmr' => 'khmr', +'sc=khoj' => 'khoj', +'sc=khojki' => 'khoj', +'sc=khudawadi' => 'sind', +'sc=knda' => 'knda', +'sc=kthi' => 'kthi', +'sc=lana' => 'lana', +'sc=lao' => 'laoo', +'sc=laoo' => 'laoo', +'sc=latin' => 'latn', +'sc=latn' => 'latn', +'sc=lepc' => 'lepc', +'sc=lepcha' => 'lepc', +'sc=limb' => 'limb', +'sc=limbu' => 'limb', +'sc=lina' => 'lina', +'sc=linb' => 'linb', +'sc=lineara' => 'lina', +'sc=linearb' => 'linb', +'sc=lisu' => 'lisu', +'sc=lyci' => 'lyci', +'sc=lycian' => 'lyci', +'sc=lydi' => 'lydi', +'sc=lydian' => 'lydi', +'sc=mahajani' => 'mahj', +'sc=mahj' => 'mahj', +'sc=malayalam' => 'mlym', +'sc=mand' => 'mand', +'sc=mandaic' => 'mand', +'sc=mani' => 'mani', +'sc=manichaean' => 'mani', +'sc=marc' => 'marc', +'sc=marchen' => 'marc', +'sc=masaramgondi' => 'gonm', +'sc=meeteimayek' => 'mtei', +'sc=mend' => 'mend', +'sc=mendekikakui' => 'mend', +'sc=merc' => 'merc', +'sc=mero' => 'mero', +'sc=meroiticcursive' => 'merc', +'sc=meroitichieroglyphs' => 'mero', +'sc=miao' => 'plrd', +'sc=mlym' => 'mlym', +'sc=modi' => 'modi', +'sc=mong' => 'mong', +'sc=mongolian' => 'mong', +'sc=mro' => 'mroo', +'sc=mroo' => 'mroo', +'sc=mtei' => 'mtei', +'sc=mult' => 'mult', +'sc=multani' => 'mult', +'sc=myanmar' => 'mymr', +'sc=mymr' => 'mymr', +'sc=nabataean' => 'nbat', +'sc=narb' => 'narb', +'sc=nbat' => 'nbat', +'sc=newa' => 'newa', +'sc=newtailue' => 'talu', +'sc=nko' => 'nkoo', +'sc=nkoo' => 'nkoo', +'sc=nshu' => 'nshu', +'sc=nushu' => 'nshu', +'sc=ogam' => 'ogam', +'sc=ogham' => 'ogam', +'sc=olchiki' => 'olck', +'sc=olck' => 'olck', +'sc=oldhungarian' => 'hung', +'sc=olditalic' => 'ital', +'sc=oldnortharabian' => 'narb', +'sc=oldpermic' => 'perm', +'sc=oldpersian' => 'xpeo', +'sc=oldsoutharabian' => 'sarb', +'sc=oldturkic' => 'orkh', +'sc=oriya' => 'orya', +'sc=orkh' => 'orkh', +'sc=orya' => 'orya', +'sc=osage' => 'osge', +'sc=osge' => 'osge', +'sc=osma' => 'osma', +'sc=osmanya' => 'osma', +'sc=pahawhhmong' => 'hmng', +'sc=palm' => 'palm', +'sc=palmyrene' => 'palm', +'sc=pauc' => 'pauc', +'sc=paucinhau' => 'pauc', +'sc=perm' => 'perm', +'sc=phag' => 'phag', +'sc=phagspa' => 'phag', +'sc=phli' => 'phli', +'sc=phlp' => 'phlp', +'sc=phnx' => 'phnx', +'sc=phoenician' => 'phnx', +'sc=plrd' => 'plrd', +'sc=prti' => 'prti', +'sc=psalterpahlavi' => 'phlp', +'sc=qaac' => 'copt', +'sc=qaai' => 'zinh', +'sc=rejang' => 'rjng', +'sc=rjng' => 'rjng', +'sc=runic' => 'runr', +'sc=runr' => 'runr', +'sc=samaritan' => 'samr', +'sc=samr' => 'samr', +'sc=sarb' => 'sarb', +'sc=saur' => 'saur', +'sc=saurashtra' => 'saur', +'sc=sgnw' => 'sgnw', +'sc=sharada' => 'shrd', +'sc=shavian' => 'shaw', +'sc=shaw' => 'shaw', +'sc=shrd' => 'shrd', +'sc=sidd' => 'sidd', +'sc=siddham' => 'sidd', +'sc=signwriting' => 'sgnw', +'sc=sind' => 'sind', +'sc=sinh' => 'sinh', +'sc=sinhala' => 'sinh', +'sc=sora' => 'sora', +'sc=sorasompeng' => 'sora', +'sc=soyo' => 'soyo', +'sc=soyombo' => 'soyo', +'sc=sund' => 'sund', +'sc=sundanese' => 'sund', +'sc=sylo' => 'sylo', +'sc=sylotinagri' => 'sylo', +'sc=syrc' => 'syrc', +'sc=syriac' => 'syrc', +'sc=tagalog' => 'tglg', +'sc=tagb' => 'tagb', +'sc=tagbanwa' => 'tagb', +'sc=taile' => 'tale', +'sc=taitham' => 'lana', +'sc=taiviet' => 'tavt', +'sc=takr' => 'takr', +'sc=takri' => 'takr', +'sc=tale' => 'tale', +'sc=talu' => 'talu', +'sc=tamil' => 'taml', +'sc=taml' => 'taml', +'sc=tang' => 'tang', +'sc=tangut' => 'tang', +'sc=tavt' => 'tavt', +'sc=telu' => 'telu', +'sc=telugu' => 'telu', +'sc=tfng' => 'tfng', +'sc=tglg' => 'tglg', +'sc=thaa' => 'thaa', +'sc=thaana' => 'thaa', +'sc=thai' => 'thai', +'sc=tibetan' => 'tibt', +'sc=tibt' => 'tibt', +'sc=tifinagh' => 'tfng', +'sc=tirh' => 'tirh', +'sc=tirhuta' => 'tirh', +'sc=ugar' => 'ugar', +'sc=ugaritic' => 'ugar', +'sc=unknown' => 'zzzz', +'sc=vai' => 'vaii', +'sc=vaii' => 'vaii', +'sc=wara' => 'wara', +'sc=warangciti' => 'wara', +'sc=xpeo' => 'xpeo', +'sc=xsux' => 'xsux', +'sc=yi' => 'yiii', +'sc=yiii' => 'yiii', +'sc=zanabazarsquare' => 'zanb', +'sc=zanb' => 'zanb', +'sc=zinh' => 'zinh', +'sc=zyyy' => 'zyyy', +'sc=zzzz' => 'zzzz', +'scx=adlam' => 'adlm', +'scx=adlm' => 'adlm', +'scx=aghb' => 'aghb', +'scx=ahom' => 'ahom', +'scx=anatolianhieroglyphs' => 'hluw', +'scx=arab' => 'arab', +'scx=arabic' => 'arab', +'scx=armenian' => 'armn', +'scx=armi' => 'armi', +'scx=armn' => 'armn', +'scx=avestan' => 'avst', +'scx=avst' => 'avst', +'scx=bali' => 'bali', +'scx=balinese' => 'bali', +'scx=bamu' => 'bamu', +'scx=bamum' => 'bamu', +'scx=bass' => 'bass', +'scx=bassavah' => 'bass', +'scx=batak' => 'batk', +'scx=batk' => 'batk', +'scx=beng' => 'beng', +'scx=bengali' => 'beng', +'scx=bhaiksuki' => 'bhks', +'scx=bhks' => 'bhks', +'scx=bopo' => 'bopo', +'scx=bopomofo' => 'bopo', +'scx=brah' => 'brah', +'scx=brahmi' => 'brah', +'scx=brai' => 'brai', +'scx=braille' => 'brai', +'scx=bugi' => 'bugi', +'scx=buginese' => 'bugi', +'scx=buhd' => 'buhd', +'scx=buhid' => 'buhd', +'scx=cakm' => 'cakm', +'scx=canadianaboriginal' => 'cans', +'scx=cans' => 'cans', +'scx=cari' => 'cari', +'scx=carian' => 'cari', +'scx=caucasianalbanian' => 'aghb', +'scx=chakma' => 'cakm', +'scx=cham' => 'cham', +'scx=cher' => 'cher', +'scx=cherokee' => 'cher', +'scx=common' => 'zyyy', +'scx=copt' => 'copt', +'scx=coptic' => 'copt', +'scx=cprt' => 'cprt', +'scx=cuneiform' => 'xsux', +'scx=cypriot' => 'cprt', +'scx=cyrillic' => 'cyrl', +'scx=cyrl' => 'cyrl', +'scx=deseret' => 'dsrt', +'scx=deva' => 'deva', +'scx=devanagari' => 'deva', +'scx=dsrt' => 'dsrt', +'scx=dupl' => 'dupl', +'scx=duployan' => 'dupl', +'scx=egyp' => 'egyp', +'scx=egyptianhieroglyphs' => 'egyp', +'scx=elba' => 'elba', +'scx=elbasan' => 'elba', +'scx=ethi' => 'ethi', +'scx=ethiopic' => 'ethi', +'scx=geor' => 'geor', +'scx=georgian' => 'geor', +'scx=glag' => 'glag', +'scx=glagolitic' => 'glag', +'scx=gonm' => 'gonm', +'scx=goth' => 'goth', +'scx=gothic' => 'goth', +'scx=gran' => 'gran', +'scx=grantha' => 'gran', +'scx=greek' => 'grek', +'scx=grek' => 'grek', +'scx=gujarati' => 'gujr', +'scx=gujr' => 'gujr', +'scx=gurmukhi' => 'guru', +'scx=guru' => 'guru', +'scx=han' => 'hani', +'scx=hang' => 'hang', +'scx=hangul' => 'hang', +'scx=hani' => 'hani', +'scx=hano' => 'hano', +'scx=hanunoo' => 'hano', +'scx=hatr' => 'hatr', +'scx=hatran' => 'hatr', +'scx=hebr' => 'hebr', +'scx=hebrew' => 'hebr', +'scx=hira' => 'hira', +'scx=hiragana' => 'hira', +'scx=hluw' => 'hluw', +'scx=hmng' => 'hmng', +'scx=hung' => 'hung', +'scx=imperialaramaic' => 'armi', +'scx=inherited' => 'zinh', +'scx=inscriptionalpahlavi' => 'phli', +'scx=inscriptionalparthian' => 'prti', +'scx=ital' => 'ital', +'scx=java' => 'java', +'scx=javanese' => 'java', +'scx=kaithi' => 'kthi', +'scx=kali' => 'kali', +'scx=kana' => 'kana', +'scx=kannada' => 'knda', +'scx=katakana' => 'kana', +'scx=kayahli' => 'kali', +'scx=khar' => 'khar', +'scx=kharoshthi' => 'khar', +'scx=khmer' => 'khmr', +'scx=khmr' => 'khmr', +'scx=khoj' => 'khoj', +'scx=khojki' => 'khoj', +'scx=khudawadi' => 'sind', +'scx=knda' => 'knda', +'scx=kthi' => 'kthi', +'scx=lana' => 'lana', +'scx=lao' => 'laoo', +'scx=laoo' => 'laoo', +'scx=latin' => 'latn', +'scx=latn' => 'latn', +'scx=lepc' => 'lepc', +'scx=lepcha' => 'lepc', +'scx=limb' => 'limb', +'scx=limbu' => 'limb', +'scx=lina' => 'lina', +'scx=linb' => 'linb', +'scx=lineara' => 'lina', +'scx=linearb' => 'linb', +'scx=lisu' => 'lisu', +'scx=lyci' => 'lyci', +'scx=lycian' => 'lyci', +'scx=lydi' => 'lydi', +'scx=lydian' => 'lydi', +'scx=mahajani' => 'mahj', +'scx=mahj' => 'mahj', +'scx=malayalam' => 'mlym', +'scx=mand' => 'mand', +'scx=mandaic' => 'mand', +'scx=mani' => 'mani', +'scx=manichaean' => 'mani', +'scx=marc' => 'marc', +'scx=marchen' => 'marc', +'scx=masaramgondi' => 'gonm', +'scx=meeteimayek' => 'mtei', +'scx=mend' => 'mend', +'scx=mendekikakui' => 'mend', +'scx=merc' => 'merc', +'scx=mero' => 'mero', +'scx=meroiticcursive' => 'merc', +'scx=meroitichieroglyphs' => 'mero', +'scx=miao' => 'plrd', +'scx=mlym' => 'mlym', +'scx=modi' => 'modi', +'scx=mong' => 'mong', +'scx=mongolian' => 'mong', +'scx=mro' => 'mroo', +'scx=mroo' => 'mroo', +'scx=mtei' => 'mtei', +'scx=mult' => 'mult', +'scx=multani' => 'mult', +'scx=myanmar' => 'mymr', +'scx=mymr' => 'mymr', +'scx=nabataean' => 'nbat', +'scx=narb' => 'narb', +'scx=nbat' => 'nbat', +'scx=newa' => 'newa', +'scx=newtailue' => 'talu', +'scx=nko' => 'nkoo', +'scx=nkoo' => 'nkoo', +'scx=nshu' => 'nshu', +'scx=nushu' => 'nshu', +'scx=ogam' => 'ogam', +'scx=ogham' => 'ogam', +'scx=olchiki' => 'olck', +'scx=olck' => 'olck', +'scx=oldhungarian' => 'hung', +'scx=olditalic' => 'ital', +'scx=oldnortharabian' => 'narb', +'scx=oldpermic' => 'perm', +'scx=oldpersian' => 'xpeo', +'scx=oldsoutharabian' => 'sarb', +'scx=oldturkic' => 'orkh', +'scx=oriya' => 'orya', +'scx=orkh' => 'orkh', +'scx=orya' => 'orya', +'scx=osage' => 'osge', +'scx=osge' => 'osge', +'scx=osma' => 'osma', +'scx=osmanya' => 'osma', +'scx=pahawhhmong' => 'hmng', +'scx=palm' => 'palm', +'scx=palmyrene' => 'palm', +'scx=pauc' => 'pauc', +'scx=paucinhau' => 'pauc', +'scx=perm' => 'perm', +'scx=phag' => 'phag', +'scx=phagspa' => 'phag', +'scx=phli' => 'phli', +'scx=phlp' => 'phlp', +'scx=phnx' => 'phnx', +'scx=phoenician' => 'phnx', +'scx=plrd' => 'plrd', +'scx=prti' => 'prti', +'scx=psalterpahlavi' => 'phlp', +'scx=qaac' => 'copt', +'scx=qaai' => 'zinh', +'scx=rejang' => 'rjng', +'scx=rjng' => 'rjng', +'scx=runic' => 'runr', +'scx=runr' => 'runr', +'scx=samaritan' => 'samr', +'scx=samr' => 'samr', +'scx=sarb' => 'sarb', +'scx=saur' => 'saur', +'scx=saurashtra' => 'saur', +'scx=sgnw' => 'sgnw', +'scx=sharada' => 'shrd', +'scx=shavian' => 'shaw', +'scx=shaw' => 'shaw', +'scx=shrd' => 'shrd', +'scx=sidd' => 'sidd', +'scx=siddham' => 'sidd', +'scx=signwriting' => 'sgnw', +'scx=sind' => 'sind', +'scx=sinh' => 'sinh', +'scx=sinhala' => 'sinh', +'scx=sora' => 'sora', +'scx=sorasompeng' => 'sora', +'scx=soyo' => 'soyo', +'scx=soyombo' => 'soyo', +'scx=sund' => 'sund', +'scx=sundanese' => 'sund', +'scx=sylo' => 'sylo', +'scx=sylotinagri' => 'sylo', +'scx=syrc' => 'syrc', +'scx=syriac' => 'syrc', +'scx=tagalog' => 'tglg', +'scx=tagb' => 'tagb', +'scx=tagbanwa' => 'tagb', +'scx=taile' => 'tale', +'scx=taitham' => 'lana', +'scx=taiviet' => 'tavt', +'scx=takr' => 'takr', +'scx=takri' => 'takr', +'scx=tale' => 'tale', +'scx=talu' => 'talu', +'scx=tamil' => 'taml', +'scx=taml' => 'taml', +'scx=tang' => 'tang', +'scx=tangut' => 'tang', +'scx=tavt' => 'tavt', +'scx=telu' => 'telu', +'scx=telugu' => 'telu', +'scx=tfng' => 'tfng', +'scx=tglg' => 'tglg', +'scx=thaa' => 'thaa', +'scx=thaana' => 'thaa', +'scx=thai' => 'thai', +'scx=tibetan' => 'tibt', +'scx=tibt' => 'tibt', +'scx=tifinagh' => 'tfng', +'scx=tirh' => 'tirh', +'scx=tirhuta' => 'tirh', +'scx=ugar' => 'ugar', +'scx=ugaritic' => 'ugar', +'scx=unknown' => 'zzzz', +'scx=vai' => 'vaii', +'scx=vaii' => 'vaii', +'scx=wara' => 'wara', +'scx=warangciti' => 'wara', +'scx=xpeo' => 'xpeo', +'scx=xsux' => 'xsux', +'scx=yi' => 'yiii', +'scx=yiii' => 'yiii', +'scx=zanabazarsquare' => 'zanb', +'scx=zanb' => 'zanb', +'scx=zinh' => 'zinh', +'scx=zyyy' => 'zyyy', +'scx=zzzz' => 'zzzz', +'sd=f' => 'n', +'sd=false' => 'n', +'sd=n' => 'n', +'sd=no' => 'n', +'sd=t' => 'y', +'sd=true' => 'y', +'sd=y' => 'y', +'sd=yes' => 'y', +'sterm=f' => 'n', +'sterm=false' => 'n', +'sterm=n' => 'n', +'sterm=no' => 'n', +'sterm=t' => 'y', +'sterm=true' => 'y', +'sterm=y' => 'y', +'sterm=yes' => 'y', +'term=f' => 'n', +'term=false' => 'n', +'term=n' => 'n', +'term=no' => 'n', +'term=t' => 'y', +'term=true' => 'y', +'term=y' => 'y', +'term=yes' => 'y', +'uideo=f' => 'n', +'uideo=false' => 'n', +'uideo=n' => 'n', +'uideo=no' => 'n', +'uideo=t' => 'y', +'uideo=true' => 'y', +'uideo=y' => 'y', +'uideo=yes' => 'y', +'upper=f' => 'n', +'upper=false' => 'n', +'upper=n' => 'n', +'upper=no' => 'n', +'upper=t' => 'y', +'upper=true' => 'y', +'upper=y' => 'y', +'upper=yes' => 'y', +'vo=r' => 'r', +'vo=rotated' => 'r', +'vo=tr' => 'tr', +'vo=transformedrotated' => 'tr', +'vo=transformedupright' => 'tu', +'vo=tu' => 'tu', +'vo=u' => 'u', +'vo=upright' => 'u', +'vs=f' => 'n', +'vs=false' => 'n', +'vs=n' => 'n', +'vs=no' => 'n', +'vs=t' => 'y', +'vs=true' => 'y', +'vs=y' => 'y', +'vs=yes' => 'y', +'wb=aletter' => 'le', +'wb=cr' => 'cr', +'wb=doublequote' => 'dq', +'wb=dq' => 'dq', +'wb=eb' => 'eb', +'wb=ebase' => 'eb', +'wb=ebasegaz' => 'ebg', +'wb=ebg' => 'ebg', +'wb=em' => 'em', +'wb=emodifier' => 'em', +'wb=ex' => 'ex', +'wb=extend' => 'extend', +'wb=extendnumlet' => 'ex', +'wb=fo' => 'fo', +'wb=format' => 'fo', +'wb=gaz' => 'gaz', +'wb=glueafterzwj' => 'gaz', +'wb=hebrewletter' => 'hl', +'wb=hl' => 'hl', +'wb=ka' => 'ka', +'wb=katakana' => 'ka', +'wb=le' => 'le', +'wb=lf' => 'lf', +'wb=mb' => 'mb', +'wb=midletter' => 'ml', +'wb=midnum' => 'mn', +'wb=midnumlet' => 'mb', +'wb=ml' => 'ml', +'wb=mn' => 'mn', +'wb=newline' => 'nl', +'wb=nl' => 'nl', +'wb=nu' => 'nu', +'wb=numeric' => 'nu', +'wb=other' => 'xx', +'wb=regionalindicator' => 'ri', +'wb=ri' => 'ri', +'wb=singlequote' => 'sq', +'wb=sq' => 'sq', +'wb=xx' => 'xx', +'wb=zwj' => 'zwj', +'wspace=f' => 'n', +'wspace=false' => 'n', +'wspace=n' => 'n', +'wspace=no' => 'n', +'wspace=t' => 'y', +'wspace=true' => 'y', +'wspace=y' => 'y', +'wspace=yes' => 'y', +'xidc=f' => 'n', +'xidc=false' => 'n', +'xidc=n' => 'n', +'xidc=no' => 'n', +'xidc=t' => 'y', +'xidc=true' => 'y', +'xidc=y' => 'y', +'xidc=yes' => 'y', +'xids=f' => 'n', +'xids=false' => 'n', +'xids=n' => 'n', +'xids=no' => 'n', +'xids=t' => 'y', +'xids=true' => 'y', +'xids=y' => 'y', +'xids=yes' => 'y', +); + +# String property loose names to standard loose name +%Unicode::UCD::string_property_loose_to_name = ( +'_perlnamealias' => 'namealias', +'bidimirroringglyph' => 'bmg', +'bidipairedbracket' => 'bpb', +'bmg' => 'bmg', +'bpb' => 'bpb', +'casefolding' => 'cf', +'cf' => 'cf', +'decompositionmapping' => 'dm', +'dm' => 'dm', +'isc' => 'isc', +'isocomment' => 'isc', +'lc' => 'lc', +'lowercasemapping' => 'lc', +'na' => 'na', +'na1' => 'na1', +'name' => 'na', +'namealias' => 'namealias', +'nfkccasefold' => 'nfkccf', +'nfkccf' => 'nfkccf', +'perldecimaldigit' => 'perldecimaldigit', +'scf' => 'scf', +'sfc' => 'scf', +'simplecasefolding' => 'scf', +'simplelowercasemapping' => 'slc', +'simpletitlecasemapping' => 'stc', +'simpleuppercasemapping' => 'suc', +'slc' => 'slc', +'stc' => 'stc', +'suc' => 'suc', +'tc' => 'tc', +'titlecasemapping' => 'tc', +'uc' => 'uc', +'unicode1name' => 'na1', +'uppercasemapping' => 'uc', +); + +# Keys are Perl extensions in loose form; values are each one's list of +# aliases +%Unicode::UCD::loose_perlprop_to_name = ( +'all' => +[ +'All', +], +'alnum' => +[ +'Alnum', +'XPosixAlnum', +], +'any' => +[ +'Any', +'Any', +'Unicode', +], +'ascii' => +[ +'ASCII', +], +'assigned' => +[ +'Assigned', +], +'blank' => +[ +'Blank', +'XPosixBlank', +'HorizSpace', +], +'cntrl' => +[ +'Cntrl', +'XPosixCntrl', +], +'digit' => +[ +'Digit', +'XPosixDigit', +], +'graph' => +[ +'Graph', +'XPosixGraph', +], +'horizspace' => +[ +'Blank', +'XPosixBlank', +'HorizSpace', +], +'perlspace' => +[ +'PosixSpace', +'PosixSpace', +'PerlSpace', +], +'perlword' => +[ +'PosixWord', +'PosixWord', +'PerlWord', +], +'posixalnum' => +[ +'PosixAlnum', +], +'posixalpha' => +[ +'PosixAlpha', +], +'posixblank' => +[ +'PosixBlank', +], +'posixcntrl' => +[ +'PosixCntrl', +], +'posixdigit' => +[ +'PosixDigit', +], +'posixgraph' => +[ +'PosixGraph', +], +'posixlower' => +[ +'PosixLower', +], +'posixprint' => +[ +'PosixPrint', +], +'posixpunct' => +[ +'PosixPunct', +], +'posixspace' => +[ +'PosixSpace', +'PosixSpace', +'PerlSpace', +], +'posixupper' => +[ +'PosixUpper', +], +'posixword' => +[ +'PosixWord', +'PosixWord', +'PerlWord', +], +'posixxdigit' => +[ +'PosixXDigit', +], +'print' => +[ +'Print', +'XPosixPrint', +], +'punct' => +[ +'Punct', +], +'spaceperl' => +[ +'XPosixSpace', +'XPosixSpace', +'XPerlSpace', +'SpacePerl', +], +'title' => +[ +'Title', +'Titlecase', +], +'titlecase' => +[ +'Title', +'Titlecase', +], +'unicode' => +[ +'Any', +'Any', +'Unicode', +], +'vertspace' => +[ +'VertSpace', +], +'word' => +[ +'Word', +'XPosixWord', +], +'xdigit' => +[ +'XDigit', +'XPosixXDigit', +], +'xperlspace' => +[ +'XPosixSpace', +'XPosixSpace', +'XPerlSpace', +'SpacePerl', +], +'xposixalnum' => +[ +'Alnum', +'XPosixAlnum', +], +'xposixalpha' => +[ +'XPosixAlpha', +], +'xposixblank' => +[ +'Blank', +'XPosixBlank', +'HorizSpace', +], +'xposixcntrl' => +[ +'Cntrl', +'XPosixCntrl', +], +'xposixdigit' => +[ +'Digit', +'XPosixDigit', +], +'xposixgraph' => +[ +'Graph', +'XPosixGraph', +], +'xposixlower' => +[ +'XPosixLower', +], +'xposixprint' => +[ +'Print', +'XPosixPrint', +], +'xposixpunct' => +[ +'XPosixPunct', +], +'xposixspace' => +[ +'XPosixSpace', +'XPosixSpace', +'XPerlSpace', +'SpacePerl', +], +'xposixupper' => +[ +'XPosixUpper', +], +'xposixword' => +[ +'Word', +'XPosixWord', +], +'xposixxdigit' => +[ +'XDigit', +'XPosixXDigit', +], +); + +# Keys are standard property name; values are each one's aliases +%Unicode::UCD::prop_aliases = ( +'age' => +[ +'age', +'Age', +], +'ahex' => +[ +'AHex', +'ASCII_Hex_Digit', +], +'alpha' => +[ +'Alpha', +'Alphabetic', +], +'bc' => +[ +'bc', +'Bidi_Class', +], +'bidic' => +[ +'Bidi_C', +'Bidi_Control', +], +'bidim' => +[ +'Bidi_M', +'Bidi_Mirrored', +], +'blk' => +[ +'blk', +'Block', +], +'bmg' => +[ +'bmg', +'Bidi_Mirroring_Glyph', +], +'bpb' => +[ +'bpb', +'Bidi_Paired_Bracket', +], +'bpt' => +[ +'bpt', +'Bidi_Paired_Bracket_Type', +], +'cased' => +[ +'Cased', +'Cased', +], +'ccc' => +[ +'ccc', +'Canonical_Combining_Class', +], +'ce' => +[ +'CE', +'Composition_Exclusion', +], +'cf' => +[ +'cf', +'Case_Folding', +], +'ci' => +[ +'CI', +'Case_Ignorable', +], +'compex' => +[ +'Comp_Ex', +'Full_Composition_Exclusion', +], +'cwcf' => +[ +'CWCF', +'Changes_When_Casefolded', +], +'cwcm' => +[ +'CWCM', +'Changes_When_Casemapped', +], +'cwkcf' => +[ +'CWKCF', +'Changes_When_NFKC_Casefolded', +], +'cwl' => +[ +'CWL', +'Changes_When_Lowercased', +], +'cwt' => +[ +'CWT', +'Changes_When_Titlecased', +], +'cwu' => +[ +'CWU', +'Changes_When_Uppercased', +], +'dash' => +[ +'Dash', +'Dash', +], +'dep' => +[ +'Dep', +'Deprecated', +], +'di' => +[ +'DI', +'Default_Ignorable_Code_Point', +], +'dia' => +[ +'Dia', +'Diacritic', +], +'dm' => +[ +'dm', +'Decomposition_Mapping', +], +'dt' => +[ +'dt', +'Decomposition_Type', +], +'ea' => +[ +'ea', +'East_Asian_Width', +], +'ext' => +[ +'Ext', +'Extender', +], +'gc' => +[ +'gc', +'General_Category', +'Category', +], +'gcb' => +[ +'GCB', +'Grapheme_Cluster_Break', +'_Perl_GCB', +], +'grbase' => +[ +'Gr_Base', +'Grapheme_Base', +], +'grext' => +[ +'Gr_Ext', +'Grapheme_Extend', +], +'hex' => +[ +'Hex', +'Hex_Digit', +], +'hst' => +[ +'hst', +'Hangul_Syllable_Type', +], +'hyphen' => +[ +'Hyphen', +'Hyphen', +], +'idc' => +[ +'IDC', +'ID_Continue', +], +'ideo' => +[ +'Ideo', +'Ideographic', +], +'ids' => +[ +'IDS', +'ID_Start', +], +'idsb' => +[ +'IDSB', +'IDS_Binary_Operator', +], +'idst' => +[ +'IDST', +'IDS_Trinary_Operator', +], +'in' => +[ +'In', +'Present_In', +], +'inpc' => +[ +'InPC', +'Indic_Positional_Category', +], +'insc' => +[ +'InSC', +'Indic_Syllabic_Category', +], +'isc' => +[ +'isc', +'ISO_Comment', +], +'jg' => +[ +'jg', +'Joining_Group', +], +'joinc' => +[ +'Join_C', +'Join_Control', +], +'jt' => +[ +'jt', +'Joining_Type', +], +'lb' => +[ +'lb', +'Line_Break', +], +'lc' => +[ +'lc', +'Lowercase_Mapping', +], +'loe' => +[ +'LOE', +'Logical_Order_Exception', +], +'lower' => +[ +'Lower', +'Lowercase', +], +'math' => +[ +'Math', +'Math', +], +'na' => +[ +'na', +'Name', +], +'na1' => +[ +'na1', +'Unicode_1_Name', +], +'namealias' => +[ +'Name_Alias', +'Name_Alias', +'_Perl_Name_Alias', +], +'nchar' => +[ +'NChar', +'Noncharacter_Code_Point', +], +'nfcqc' => +[ +'NFC_QC', +'NFC_Quick_Check', +], +'nfdqc' => +[ +'NFD_QC', +'NFD_Quick_Check', +], +'nfkccf' => +[ +'NFKC_CF', +'NFKC_Casefold', +], +'nfkcqc' => +[ +'NFKC_QC', +'NFKC_Quick_Check', +], +'nfkdqc' => +[ +'NFKD_QC', +'NFKD_Quick_Check', +], +'nt' => +[ +'nt', +'Numeric_Type', +], +'nv' => +[ +'nv', +'Numeric_Value', +], +'patsyn' => +[ +'Pat_Syn', +'Pattern_Syntax', +], +'patws' => +[ +'Pat_WS', +'Pattern_White_Space', +], +'pcm' => +[ +'PCM', +'Prepended_Concatenation_Mark', +], +'perldecimaldigit' => +[ +'Perl_Decimal_Digit', +'Perl_Decimal_Digit', +], +'qmark' => +[ +'QMark', +'Quotation_Mark', +], +'radical' => +[ +'Radical', +'Radical', +], +'ri' => +[ +'RI', +'Regional_Indicator', +], +'sb' => +[ +'SB', +'Sentence_Break', +'_Perl_SB', +], +'sc' => +[ +'sc', +'Script', +], +'scf' => +[ +'scf', +'Simple_Case_Folding', +'Sfc', +], +'scx' => +[ +'scx', +'Script_Extensions', +], +'sd' => +[ +'SD', +'Soft_Dotted', +], +'slc' => +[ +'slc', +'Simple_Lowercase_Mapping', +], +'stc' => +[ +'stc', +'Simple_Titlecase_Mapping', +], +'sterm' => +[ +'STerm', +'Sentence_Terminal', +], +'suc' => +[ +'suc', +'Simple_Uppercase_Mapping', +], +'tc' => +[ +'tc', +'Titlecase_Mapping', +], +'term' => +[ +'Term', +'Terminal_Punctuation', +], +'uc' => +[ +'uc', +'Uppercase_Mapping', +], +'uideo' => +[ +'UIdeo', +'Unified_Ideograph', +], +'upper' => +[ +'Upper', +'Uppercase', +], +'vo' => +[ +'vo', +'Vertical_Orientation', +], +'vs' => +[ +'VS', +'Variation_Selector', +], +'wb' => +[ +'WB', +'Word_Break', +], +'wspace' => +[ +'WSpace', +'White_Space', +'Space', +], +'xidc' => +[ +'XIDC', +'XID_Continue', +], +'xids' => +[ +'XIDS', +'XID_Start', +], +); + +# Keys of top level are standard property name; values are keys to another +# hash, Each one is one of the property's values, in standard form. The +# values are that prop-val's aliases. If only one specified, the short and +# long alias are identical. +%Unicode::UCD::prop_value_aliases = ( +'age' => +{ +'1.1' => +[ +'1.1', +'V1_1', +], +'10.0' => +[ +'10.0', +'V10_0', +], +'2.0' => +[ +'2.0', +'V2_0', +], +'2.1' => +[ +'2.1', +'V2_1', +], +'3.0' => +[ +'3.0', +'V3_0', +], +'3.1' => +[ +'3.1', +'V3_1', +], +'3.2' => +[ +'3.2', +'V3_2', +], +'4.0' => +[ +'4.0', +'V4_0', +], +'4.1' => +[ +'4.1', +'V4_1', +], +'5.0' => +[ +'5.0', +'V5_0', +], +'5.1' => +[ +'5.1', +'V5_1', +], +'5.2' => +[ +'5.2', +'V5_2', +], +'6.0' => +[ +'6.0', +'V6_0', +], +'6.1' => +[ +'6.1', +'V6_1', +], +'6.2' => +[ +'6.2', +'V6_2', +], +'6.3' => +[ +'6.3', +'V6_3', +], +'7.0' => +[ +'7.0', +'V7_0', +], +'8.0' => +[ +'8.0', +'V8_0', +], +'9.0' => +[ +'9.0', +'V9_0', +], +'na' => +[ +'NA', +'Unassigned', +], +}, +'ahex' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'alpha' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'bc' => +{ +'al' => +[ +'AL', +'Arabic_Letter', +], +'an' => +[ +'AN', +'Arabic_Number', +], +'b' => +[ +'B', +'Paragraph_Separator', +], +'bn' => +[ +'BN', +'Boundary_Neutral', +], +'cs' => +[ +'CS', +'Common_Separator', +], +'en' => +[ +'EN', +'European_Number', +], +'es' => +[ +'ES', +'European_Separator', +], +'et' => +[ +'ET', +'European_Terminator', +], +'fsi' => +[ +'FSI', +'First_Strong_Isolate', +], +'l' => +[ +'L', +'Left_To_Right', +], +'lre' => +[ +'LRE', +'Left_To_Right_Embedding', +], +'lri' => +[ +'LRI', +'Left_To_Right_Isolate', +], +'lro' => +[ +'LRO', +'Left_To_Right_Override', +], +'nsm' => +[ +'NSM', +'Nonspacing_Mark', +], +'on' => +[ +'ON', +'Other_Neutral', +], +'pdf' => +[ +'PDF', +'Pop_Directional_Format', +], +'pdi' => +[ +'PDI', +'Pop_Directional_Isolate', +], +'r' => +[ +'R', +'Right_To_Left', +], +'rle' => +[ +'RLE', +'Right_To_Left_Embedding', +], +'rli' => +[ +'RLI', +'Right_To_Left_Isolate', +], +'rlo' => +[ +'RLO', +'Right_To_Left_Override', +], +'s' => +[ +'S', +'Segment_Separator', +], +'ws' => +[ +'WS', +'White_Space', +], +}, +'bidic' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'bidim' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'blk' => +{ +'adlam' => +[ +'Adlam', +], +'aegeannumbers' => +[ +'Aegean_Numbers', +], +'ahom' => +[ +'Ahom', +], +'alchemical' => +[ +'Alchemical', +'Alchemical_Symbols', +], +'alphabeticpf' => +[ +'Alphabetic_PF', +'Alphabetic_Presentation_Forms', +], +'anatolianhieroglyphs' => +[ +'Anatolian_Hieroglyphs', +], +'ancientgreekmusic' => +[ +'Ancient_Greek_Music', +'Ancient_Greek_Musical_Notation', +], +'ancientgreeknumbers' => +[ +'Ancient_Greek_Numbers', +], +'ancientsymbols' => +[ +'Ancient_Symbols', +], +'arabic' => +[ +'Arabic', +], +'arabicexta' => +[ +'Arabic_Ext_A', +'Arabic_Extended_A', +], +'arabicmath' => +[ +'Arabic_Math', +'Arabic_Mathematical_Alphabetic_Symbols', +], +'arabicpfa' => +[ +'Arabic_PF_A', +'Arabic_Presentation_Forms_A', +], +'arabicpfb' => +[ +'Arabic_PF_B', +'Arabic_Presentation_Forms_B', +], +'arabicsup' => +[ +'Arabic_Sup', +'Arabic_Supplement', +], +'armenian' => +[ +'Armenian', +], +'arrows' => +[ +'Arrows', +], +'ascii' => +[ +'ASCII', +'Basic_Latin', +], +'avestan' => +[ +'Avestan', +], +'balinese' => +[ +'Balinese', +], +'bamum' => +[ +'Bamum', +], +'bamumsup' => +[ +'Bamum_Sup', +'Bamum_Supplement', +], +'bassavah' => +[ +'Bassa_Vah', +], +'batak' => +[ +'Batak', +], +'bengali' => +[ +'Bengali', +], +'bhaiksuki' => +[ +'Bhaiksuki', +], +'blockelements' => +[ +'Block_Elements', +], +'bopomofo' => +[ +'Bopomofo', +], +'bopomofoext' => +[ +'Bopomofo_Ext', +'Bopomofo_Extended', +], +'boxdrawing' => +[ +'Box_Drawing', +], +'brahmi' => +[ +'Brahmi', +], +'braille' => +[ +'Braille', +'Braille_Patterns', +], +'buginese' => +[ +'Buginese', +], +'buhid' => +[ +'Buhid', +], +'byzantinemusic' => +[ +'Byzantine_Music', +'Byzantine_Musical_Symbols', +], +'carian' => +[ +'Carian', +], +'caucasianalbanian' => +[ +'Caucasian_Albanian', +], +'chakma' => +[ +'Chakma', +], +'cham' => +[ +'Cham', +], +'cherokee' => +[ +'Cherokee', +], +'cherokeesup' => +[ +'Cherokee_Sup', +'Cherokee_Supplement', +], +'cjk' => +[ +'CJK', +'CJK_Unified_Ideographs', +], +'cjkcompat' => +[ +'CJK_Compat', +'CJK_Compatibility', +], +'cjkcompatforms' => +[ +'CJK_Compat_Forms', +'CJK_Compatibility_Forms', +], +'cjkcompatideographs' => +[ +'CJK_Compat_Ideographs', +'CJK_Compatibility_Ideographs', +], +'cjkcompatideographssup' => +[ +'CJK_Compat_Ideographs_Sup', +'CJK_Compatibility_Ideographs_Supplement', +], +'cjkexta' => +[ +'CJK_Ext_A', +'CJK_Unified_Ideographs_Extension_A', +], +'cjkextb' => +[ +'CJK_Ext_B', +'CJK_Unified_Ideographs_Extension_B', +], +'cjkextc' => +[ +'CJK_Ext_C', +'CJK_Unified_Ideographs_Extension_C', +], +'cjkextd' => +[ +'CJK_Ext_D', +'CJK_Unified_Ideographs_Extension_D', +], +'cjkexte' => +[ +'CJK_Ext_E', +'CJK_Unified_Ideographs_Extension_E', +], +'cjkextf' => +[ +'CJK_Ext_F', +'CJK_Unified_Ideographs_Extension_F', +], +'cjkradicalssup' => +[ +'CJK_Radicals_Sup', +'CJK_Radicals_Supplement', +], +'cjkstrokes' => +[ +'CJK_Strokes', +], +'cjksymbols' => +[ +'CJK_Symbols', +'CJK_Symbols_And_Punctuation', +], +'compatjamo' => +[ +'Compat_Jamo', +'Hangul_Compatibility_Jamo', +], +'controlpictures' => +[ +'Control_Pictures', +], +'coptic' => +[ +'Coptic', +], +'copticepactnumbers' => +[ +'Coptic_Epact_Numbers', +], +'countingrod' => +[ +'Counting_Rod', +'Counting_Rod_Numerals', +], +'cuneiform' => +[ +'Cuneiform', +], +'cuneiformnumbers' => +[ +'Cuneiform_Numbers', +'Cuneiform_Numbers_And_Punctuation', +], +'currencysymbols' => +[ +'Currency_Symbols', +], +'cypriotsyllabary' => +[ +'Cypriot_Syllabary', +], +'cyrillic' => +[ +'Cyrillic', +], +'cyrillicexta' => +[ +'Cyrillic_Ext_A', +'Cyrillic_Extended_A', +], +'cyrillicextb' => +[ +'Cyrillic_Ext_B', +'Cyrillic_Extended_B', +], +'cyrillicextc' => +[ +'Cyrillic_Ext_C', +'Cyrillic_Extended_C', +], +'cyrillicsup' => +[ +'Cyrillic_Sup', +'Cyrillic_Supplement', +'Cyrillic_Supplementary', +], +'deseret' => +[ +'Deseret', +], +'devanagari' => +[ +'Devanagari', +], +'devanagariext' => +[ +'Devanagari_Ext', +'Devanagari_Extended', +], +'diacriticals' => +[ +'Diacriticals', +'Combining_Diacritical_Marks', +], +'diacriticalsext' => +[ +'Diacriticals_Ext', +'Combining_Diacritical_Marks_Extended', +], +'diacriticalsforsymbols' => +[ +'Diacriticals_For_Symbols', +'Combining_Diacritical_Marks_For_Symbols', +'Combining_Marks_For_Symbols', +], +'diacriticalssup' => +[ +'Diacriticals_Sup', +'Combining_Diacritical_Marks_Supplement', +], +'dingbats' => +[ +'Dingbats', +], +'domino' => +[ +'Domino', +'Domino_Tiles', +], +'duployan' => +[ +'Duployan', +], +'earlydynasticcuneiform' => +[ +'Early_Dynastic_Cuneiform', +], +'egyptianhieroglyphs' => +[ +'Egyptian_Hieroglyphs', +], +'elbasan' => +[ +'Elbasan', +], +'emoticons' => +[ +'Emoticons', +], +'enclosedalphanum' => +[ +'Enclosed_Alphanum', +'Enclosed_Alphanumerics', +], +'enclosedalphanumsup' => +[ +'Enclosed_Alphanum_Sup', +'Enclosed_Alphanumeric_Supplement', +], +'enclosedcjk' => +[ +'Enclosed_CJK', +'Enclosed_CJK_Letters_And_Months', +], +'enclosedideographicsup' => +[ +'Enclosed_Ideographic_Sup', +'Enclosed_Ideographic_Supplement', +], +'ethiopic' => +[ +'Ethiopic', +], +'ethiopicext' => +[ +'Ethiopic_Ext', +'Ethiopic_Extended', +], +'ethiopicexta' => +[ +'Ethiopic_Ext_A', +'Ethiopic_Extended_A', +], +'ethiopicsup' => +[ +'Ethiopic_Sup', +'Ethiopic_Supplement', +], +'geometricshapes' => +[ +'Geometric_Shapes', +], +'geometricshapesext' => +[ +'Geometric_Shapes_Ext', +'Geometric_Shapes_Extended', +], +'georgian' => +[ +'Georgian', +], +'georgiansup' => +[ +'Georgian_Sup', +'Georgian_Supplement', +], +'glagolitic' => +[ +'Glagolitic', +], +'glagoliticsup' => +[ +'Glagolitic_Sup', +'Glagolitic_Supplement', +], +'gothic' => +[ +'Gothic', +], +'grantha' => +[ +'Grantha', +], +'greek' => +[ +'Greek', +'Greek_And_Coptic', +], +'greekext' => +[ +'Greek_Ext', +'Greek_Extended', +], +'gujarati' => +[ +'Gujarati', +], +'gurmukhi' => +[ +'Gurmukhi', +], +'halfandfullforms' => +[ +'Half_And_Full_Forms', +'Halfwidth_And_Fullwidth_Forms', +], +'halfmarks' => +[ +'Half_Marks', +'Combining_Half_Marks', +], +'hangul' => +[ +'Hangul', +'Hangul_Syllables', +], +'hanunoo' => +[ +'Hanunoo', +], +'hatran' => +[ +'Hatran', +], +'hebrew' => +[ +'Hebrew', +], +'highpusurrogates' => +[ +'High_PU_Surrogates', +'High_Private_Use_Surrogates', +], +'highsurrogates' => +[ +'High_Surrogates', +], +'hiragana' => +[ +'Hiragana', +], +'idc' => +[ +'IDC', +'Ideographic_Description_Characters', +], +'ideographicsymbols' => +[ +'Ideographic_Symbols', +'Ideographic_Symbols_And_Punctuation', +], +'imperialaramaic' => +[ +'Imperial_Aramaic', +], +'indicnumberforms' => +[ +'Indic_Number_Forms', +'Common_Indic_Number_Forms', +], +'inscriptionalpahlavi' => +[ +'Inscriptional_Pahlavi', +], +'inscriptionalparthian' => +[ +'Inscriptional_Parthian', +], +'ipaext' => +[ +'IPA_Ext', +'IPA_Extensions', +], +'jamo' => +[ +'Jamo', +'Hangul_Jamo', +], +'jamoexta' => +[ +'Jamo_Ext_A', +'Hangul_Jamo_Extended_A', +], +'jamoextb' => +[ +'Jamo_Ext_B', +'Hangul_Jamo_Extended_B', +], +'javanese' => +[ +'Javanese', +], +'kaithi' => +[ +'Kaithi', +], +'kanaexta' => +[ +'Kana_Ext_A', +'Kana_Extended_A', +], +'kanasup' => +[ +'Kana_Sup', +'Kana_Supplement', +], +'kanbun' => +[ +'Kanbun', +], +'kangxi' => +[ +'Kangxi', +'Kangxi_Radicals', +], +'kannada' => +[ +'Kannada', +], +'katakana' => +[ +'Katakana', +], +'katakanaext' => +[ +'Katakana_Ext', +'Katakana_Phonetic_Extensions', +], +'kayahli' => +[ +'Kayah_Li', +], +'kharoshthi' => +[ +'Kharoshthi', +], +'khmer' => +[ +'Khmer', +], +'khmersymbols' => +[ +'Khmer_Symbols', +], +'khojki' => +[ +'Khojki', +], +'khudawadi' => +[ +'Khudawadi', +], +'lao' => +[ +'Lao', +], +'latin1sup' => +[ +'Latin_1_Sup', +'Latin_1_Supplement', +'Latin_1', +], +'latinexta' => +[ +'Latin_Ext_A', +'Latin_Extended_A', +], +'latinextadditional' => +[ +'Latin_Ext_Additional', +'Latin_Extended_Additional', +], +'latinextb' => +[ +'Latin_Ext_B', +'Latin_Extended_B', +], +'latinextc' => +[ +'Latin_Ext_C', +'Latin_Extended_C', +], +'latinextd' => +[ +'Latin_Ext_D', +'Latin_Extended_D', +], +'latinexte' => +[ +'Latin_Ext_E', +'Latin_Extended_E', +], +'lepcha' => +[ +'Lepcha', +], +'letterlikesymbols' => +[ +'Letterlike_Symbols', +], +'limbu' => +[ +'Limbu', +], +'lineara' => +[ +'Linear_A', +], +'linearbideograms' => +[ +'Linear_B_Ideograms', +], +'linearbsyllabary' => +[ +'Linear_B_Syllabary', +], +'lisu' => +[ +'Lisu', +], +'lowsurrogates' => +[ +'Low_Surrogates', +], +'lycian' => +[ +'Lycian', +], +'lydian' => +[ +'Lydian', +], +'mahajani' => +[ +'Mahajani', +], +'mahjong' => +[ +'Mahjong', +'Mahjong_Tiles', +], +'malayalam' => +[ +'Malayalam', +], +'mandaic' => +[ +'Mandaic', +], +'manichaean' => +[ +'Manichaean', +], +'marchen' => +[ +'Marchen', +], +'masaramgondi' => +[ +'Masaram_Gondi', +], +'mathalphanum' => +[ +'Math_Alphanum', +'Mathematical_Alphanumeric_Symbols', +], +'mathoperators' => +[ +'Math_Operators', +'Mathematical_Operators', +], +'meeteimayek' => +[ +'Meetei_Mayek', +], +'meeteimayekext' => +[ +'Meetei_Mayek_Ext', +'Meetei_Mayek_Extensions', +], +'mendekikakui' => +[ +'Mende_Kikakui', +], +'meroiticcursive' => +[ +'Meroitic_Cursive', +], +'meroitichieroglyphs' => +[ +'Meroitic_Hieroglyphs', +], +'miao' => +[ +'Miao', +], +'miscarrows' => +[ +'Misc_Arrows', +'Miscellaneous_Symbols_And_Arrows', +], +'miscmathsymbolsa' => +[ +'Misc_Math_Symbols_A', +'Miscellaneous_Mathematical_Symbols_A', +], +'miscmathsymbolsb' => +[ +'Misc_Math_Symbols_B', +'Miscellaneous_Mathematical_Symbols_B', +], +'miscpictographs' => +[ +'Misc_Pictographs', +'Miscellaneous_Symbols_And_Pictographs', +], +'miscsymbols' => +[ +'Misc_Symbols', +'Miscellaneous_Symbols', +], +'misctechnical' => +[ +'Misc_Technical', +'Miscellaneous_Technical', +], +'modi' => +[ +'Modi', +], +'modifierletters' => +[ +'Modifier_Letters', +'Spacing_Modifier_Letters', +], +'modifiertoneletters' => +[ +'Modifier_Tone_Letters', +], +'mongolian' => +[ +'Mongolian', +], +'mongoliansup' => +[ +'Mongolian_Sup', +'Mongolian_Supplement', +], +'mro' => +[ +'Mro', +], +'multani' => +[ +'Multani', +], +'music' => +[ +'Music', +'Musical_Symbols', +], +'myanmar' => +[ +'Myanmar', +], +'myanmarexta' => +[ +'Myanmar_Ext_A', +'Myanmar_Extended_A', +], +'myanmarextb' => +[ +'Myanmar_Ext_B', +'Myanmar_Extended_B', +], +'nabataean' => +[ +'Nabataean', +], +'nb' => +[ +'NB', +'No_Block', +], +'newa' => +[ +'Newa', +], +'newtailue' => +[ +'New_Tai_Lue', +], +'nko' => +[ +'NKo', +], +'numberforms' => +[ +'Number_Forms', +], +'nushu' => +[ +'Nushu', +], +'ocr' => +[ +'OCR', +'Optical_Character_Recognition', +], +'ogham' => +[ +'Ogham', +], +'olchiki' => +[ +'Ol_Chiki', +], +'oldhungarian' => +[ +'Old_Hungarian', +], +'olditalic' => +[ +'Old_Italic', +], +'oldnortharabian' => +[ +'Old_North_Arabian', +], +'oldpermic' => +[ +'Old_Permic', +], +'oldpersian' => +[ +'Old_Persian', +], +'oldsoutharabian' => +[ +'Old_South_Arabian', +], +'oldturkic' => +[ +'Old_Turkic', +], +'oriya' => +[ +'Oriya', +], +'ornamentaldingbats' => +[ +'Ornamental_Dingbats', +], +'osage' => +[ +'Osage', +], +'osmanya' => +[ +'Osmanya', +], +'pahawhhmong' => +[ +'Pahawh_Hmong', +], +'palmyrene' => +[ +'Palmyrene', +], +'paucinhau' => +[ +'Pau_Cin_Hau', +], +'phagspa' => +[ +'Phags_Pa', +], +'phaistos' => +[ +'Phaistos', +'Phaistos_Disc', +], +'phoenician' => +[ +'Phoenician', +], +'phoneticext' => +[ +'Phonetic_Ext', +'Phonetic_Extensions', +], +'phoneticextsup' => +[ +'Phonetic_Ext_Sup', +'Phonetic_Extensions_Supplement', +], +'playingcards' => +[ +'Playing_Cards', +], +'psalterpahlavi' => +[ +'Psalter_Pahlavi', +], +'pua' => +[ +'PUA', +'Private_Use_Area', +'Private_Use', +], +'punctuation' => +[ +'Punctuation', +'General_Punctuation', +], +'rejang' => +[ +'Rejang', +], +'rumi' => +[ +'Rumi', +'Rumi_Numeral_Symbols', +], +'runic' => +[ +'Runic', +], +'samaritan' => +[ +'Samaritan', +], +'saurashtra' => +[ +'Saurashtra', +], +'sharada' => +[ +'Sharada', +], +'shavian' => +[ +'Shavian', +], +'shorthandformatcontrols' => +[ +'Shorthand_Format_Controls', +], +'siddham' => +[ +'Siddham', +], +'sinhala' => +[ +'Sinhala', +], +'sinhalaarchaicnumbers' => +[ +'Sinhala_Archaic_Numbers', +], +'smallforms' => +[ +'Small_Forms', +'Small_Form_Variants', +], +'sorasompeng' => +[ +'Sora_Sompeng', +], +'soyombo' => +[ +'Soyombo', +], +'specials' => +[ +'Specials', +], +'sundanese' => +[ +'Sundanese', +], +'sundanesesup' => +[ +'Sundanese_Sup', +'Sundanese_Supplement', +], +'suparrowsa' => +[ +'Sup_Arrows_A', +'Supplemental_Arrows_A', +], +'suparrowsb' => +[ +'Sup_Arrows_B', +'Supplemental_Arrows_B', +], +'suparrowsc' => +[ +'Sup_Arrows_C', +'Supplemental_Arrows_C', +], +'superandsub' => +[ +'Super_And_Sub', +'Superscripts_And_Subscripts', +], +'supmathoperators' => +[ +'Sup_Math_Operators', +'Supplemental_Mathematical_Operators', +], +'suppuaa' => +[ +'Sup_PUA_A', +'Supplementary_Private_Use_Area_A', +], +'suppuab' => +[ +'Sup_PUA_B', +'Supplementary_Private_Use_Area_B', +], +'suppunctuation' => +[ +'Sup_Punctuation', +'Supplemental_Punctuation', +], +'supsymbolsandpictographs' => +[ +'Sup_Symbols_And_Pictographs', +'Supplemental_Symbols_And_Pictographs', +], +'suttonsignwriting' => +[ +'Sutton_SignWriting', +], +'sylotinagri' => +[ +'Syloti_Nagri', +], +'syriac' => +[ +'Syriac', +], +'syriacsup' => +[ +'Syriac_Sup', +'Syriac_Supplement', +], +'tagalog' => +[ +'Tagalog', +], +'tagbanwa' => +[ +'Tagbanwa', +], +'tags' => +[ +'Tags', +], +'taile' => +[ +'Tai_Le', +], +'taitham' => +[ +'Tai_Tham', +], +'taiviet' => +[ +'Tai_Viet', +], +'taixuanjing' => +[ +'Tai_Xuan_Jing', +'Tai_Xuan_Jing_Symbols', +], +'takri' => +[ +'Takri', +], +'tamil' => +[ +'Tamil', +], +'tangut' => +[ +'Tangut', +], +'tangutcomponents' => +[ +'Tangut_Components', +], +'telugu' => +[ +'Telugu', +], +'thaana' => +[ +'Thaana', +], +'thai' => +[ +'Thai', +], +'tibetan' => +[ +'Tibetan', +], +'tifinagh' => +[ +'Tifinagh', +], +'tirhuta' => +[ +'Tirhuta', +], +'transportandmap' => +[ +'Transport_And_Map', +'Transport_And_Map_Symbols', +], +'ucas' => +[ +'UCAS', +'Unified_Canadian_Aboriginal_Syllabics', +'Canadian_Syllabics', +], +'ucasext' => +[ +'UCAS_Ext', +'Unified_Canadian_Aboriginal_Syllabics_Extended', +], +'ugaritic' => +[ +'Ugaritic', +], +'vai' => +[ +'Vai', +], +'vedicext' => +[ +'Vedic_Ext', +'Vedic_Extensions', +], +'verticalforms' => +[ +'Vertical_Forms', +], +'vs' => +[ +'VS', +'Variation_Selectors', +], +'vssup' => +[ +'VS_Sup', +'Variation_Selectors_Supplement', +], +'warangciti' => +[ +'Warang_Citi', +], +'yijing' => +[ +'Yijing', +'Yijing_Hexagram_Symbols', +], +'yiradicals' => +[ +'Yi_Radicals', +], +'yisyllables' => +[ +'Yi_Syllables', +], +'zanabazarsquare' => +[ +'Zanabazar_Square', +], +}, +'bpt' => +{ +'c' => +[ +'c', +'Close', +], +'n' => +[ +'n', +'None', +], +'o' => +[ +'o', +'Open', +], +}, +'cased' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'ccc' => +{ +'a' => +[ +'A', +'Above', +230, +], +'al' => +[ +'AL', +'Above_Left', +228, +], +'ar' => +[ +'AR', +'Above_Right', +232, +], +'ata' => +[ +'ATA', +'Attached_Above', +214, +], +'atar' => +[ +'ATAR', +'Attached_Above_Right', +216, +], +'atb' => +[ +'ATB', +'Attached_Below', +202, +], +'atbl' => +[ +'ATBL', +'Attached_Below_Left', +200, +], +'b' => +[ +'B', +'Below', +220, +], +'bl' => +[ +'BL', +'Below_Left', +218, +], +'br' => +[ +'BR', +'Below_Right', +222, +], +'ccc10' => +[ +'CCC10', +'CCC10', +10, +], +'ccc103' => +[ +'CCC103', +'CCC103', +103, +], +'ccc107' => +[ +'CCC107', +'CCC107', +107, +], +'ccc11' => +[ +'CCC11', +'CCC11', +11, +], +'ccc118' => +[ +'CCC118', +'CCC118', +118, +], +'ccc12' => +[ +'CCC12', +'CCC12', +12, +], +'ccc122' => +[ +'CCC122', +'CCC122', +122, +], +'ccc129' => +[ +'CCC129', +'CCC129', +129, +], +'ccc13' => +[ +'CCC13', +'CCC13', +13, +], +'ccc130' => +[ +'CCC130', +'CCC130', +130, +], +'ccc132' => +[ +'CCC132', +'CCC132', +132, +], +'ccc133' => +[ +'CCC133', +'CCC133', +133, +], +'ccc14' => +[ +'CCC14', +'CCC14', +14, +], +'ccc15' => +[ +'CCC15', +'CCC15', +15, +], +'ccc16' => +[ +'CCC16', +'CCC16', +16, +], +'ccc17' => +[ +'CCC17', +'CCC17', +17, +], +'ccc18' => +[ +'CCC18', +'CCC18', +18, +], +'ccc19' => +[ +'CCC19', +'CCC19', +19, +], +'ccc20' => +[ +'CCC20', +'CCC20', +20, +], +'ccc21' => +[ +'CCC21', +'CCC21', +21, +], +'ccc22' => +[ +'CCC22', +'CCC22', +22, +], +'ccc23' => +[ +'CCC23', +'CCC23', +23, +], +'ccc24' => +[ +'CCC24', +'CCC24', +24, +], +'ccc25' => +[ +'CCC25', +'CCC25', +25, +], +'ccc26' => +[ +'CCC26', +'CCC26', +26, +], +'ccc27' => +[ +'CCC27', +'CCC27', +27, +], +'ccc28' => +[ +'CCC28', +'CCC28', +28, +], +'ccc29' => +[ +'CCC29', +'CCC29', +29, +], +'ccc30' => +[ +'CCC30', +'CCC30', +30, +], +'ccc31' => +[ +'CCC31', +'CCC31', +31, +], +'ccc32' => +[ +'CCC32', +'CCC32', +32, +], +'ccc33' => +[ +'CCC33', +'CCC33', +33, +], +'ccc34' => +[ +'CCC34', +'CCC34', +34, +], +'ccc35' => +[ +'CCC35', +'CCC35', +35, +], +'ccc36' => +[ +'CCC36', +'CCC36', +36, +], +'ccc84' => +[ +'CCC84', +'CCC84', +84, +], +'ccc91' => +[ +'CCC91', +'CCC91', +91, +], +'da' => +[ +'DA', +'Double_Above', +234, +], +'db' => +[ +'DB', +'Double_Below', +233, +], +'is' => +[ +'IS', +'Iota_Subscript', +240, +], +'kv' => +[ +'KV', +'Kana_Voicing', +8, +], +'l' => +[ +'L', +'Left', +224, +], +'nk' => +[ +'NK', +'Nukta', +7, +], +'nr' => +[ +'NR', +'Not_Reordered', +0, +], +'ov' => +[ +'OV', +'Overlay', +1, +], +'r' => +[ +'R', +'Right', +226, +], +'vr' => +[ +'VR', +'Virama', +9, +], +}, +'ce' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'ci' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'compex' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'cwcf' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'cwcm' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'cwkcf' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'cwl' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'cwt' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'cwu' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'dash' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'dep' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'di' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'dia' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'dt' => +{ +'can' => +[ +'Can', +'Canonical', +], +'com' => +[ +'Com', +'Compat', +], +'enc' => +[ +'Enc', +'Circle', +], +'fin' => +[ +'Fin', +'Final', +], +'font' => +[ +'Font', +], +'fra' => +[ +'Fra', +'Fraction', +], +'init' => +[ +'Init', +'Initial', +], +'iso' => +[ +'Iso', +'Isolated', +], +'med' => +[ +'Med', +'Medial', +], +'nar' => +[ +'Nar', +'Narrow', +], +'nb' => +[ +'Nb', +'Nobreak', +], +'noncanon' => +[ +'Non_Canon', +'Non_Canonical', +], +'none' => +[ +'None', +], +'sml' => +[ +'Sml', +'Small', +], +'sqr' => +[ +'Sqr', +'Square', +], +'sub' => +[ +'Sub', +], +'sup' => +[ +'Sup', +'Super', +], +'vert' => +[ +'Vert', +'Vertical', +], +'wide' => +[ +'Wide', +], +}, +'ea' => +{ +'a' => +[ +'A', +'Ambiguous', +], +'f' => +[ +'F', +'Fullwidth', +], +'h' => +[ +'H', +'Halfwidth', +], +'n' => +[ +'N', +'Neutral', +], +'na' => +[ +'Na', +'Narrow', +], +'w' => +[ +'W', +'Wide', +], +}, +'ext' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'gc' => +{ +'c' => +[ +'C', +'Other', +], +'cc' => +[ +'Cc', +'Control', +'Cntrl', +], +'cf' => +[ +'Cf', +'Format', +], +'cn' => +[ +'Cn', +'Unassigned', +], +'co' => +[ +'Co', +'Private_Use', +], +'cs' => +[ +'Cs', +'Surrogate', +], +'l' => +[ +'L', +'Letter', +], +'lc' => +[ +'LC', +'Cased_Letter', +], +'ll' => +[ +'Ll', +'Lowercase_Letter', +], +'lm' => +[ +'Lm', +'Modifier_Letter', +], +'lo' => +[ +'Lo', +'Other_Letter', +], +'lt' => +[ +'Lt', +'Titlecase_Letter', +], +'lu' => +[ +'Lu', +'Uppercase_Letter', +], +'m' => +[ +'M', +'Mark', +'Combining_Mark', +], +'mc' => +[ +'Mc', +'Spacing_Mark', +], +'me' => +[ +'Me', +'Enclosing_Mark', +], +'mn' => +[ +'Mn', +'Nonspacing_Mark', +], +'n' => +[ +'N', +'Number', +], +'nd' => +[ +'Nd', +'Decimal_Number', +'Digit', +], +'nl' => +[ +'Nl', +'Letter_Number', +], +'no' => +[ +'No', +'Other_Number', +], +'p' => +[ +'P', +'Punctuation', +'Punct', +], +'pc' => +[ +'Pc', +'Connector_Punctuation', +], +'pd' => +[ +'Pd', +'Dash_Punctuation', +], +'pe' => +[ +'Pe', +'Close_Punctuation', +], +'pf' => +[ +'Pf', +'Final_Punctuation', +], +'pi' => +[ +'Pi', +'Initial_Punctuation', +], +'po' => +[ +'Po', +'Other_Punctuation', +], +'ps' => +[ +'Ps', +'Open_Punctuation', +], +'s' => +[ +'S', +'Symbol', +], +'sc' => +[ +'Sc', +'Currency_Symbol', +], +'sk' => +[ +'Sk', +'Modifier_Symbol', +], +'sm' => +[ +'Sm', +'Math_Symbol', +], +'so' => +[ +'So', +'Other_Symbol', +], +'z' => +[ +'Z', +'Separator', +], +'zl' => +[ +'Zl', +'Line_Separator', +], +'zp' => +[ +'Zp', +'Paragraph_Separator', +], +'zs' => +[ +'Zs', +'Space_Separator', +], +}, +'gcb' => +{ +'cn' => +[ +'CN', +'Control', +], +'cr' => +[ +'CR', +], +'eb' => +[ +'EB', +'E_Base', +], +'ebg' => +[ +'EBG', +'E_Base_GAZ', +], +'em' => +[ +'EM', +'E_Modifier', +], +'ex' => +[ +'EX', +'Extend', +], +'gaz' => +[ +'GAZ', +'Glue_After_Zwj', +], +'l' => +[ +'L', +], +'lf' => +[ +'LF', +], +'lv' => +[ +'LV', +], +'lvt' => +[ +'LVT', +], +'pp' => +[ +'PP', +'Prepend', +], +'ri' => +[ +'RI', +'Regional_Indicator', +], +'sm' => +[ +'SM', +'SpacingMark', +], +'t' => +[ +'T', +], +'v' => +[ +'V', +], +'xx' => +[ +'XX', +'Other', +], +'zwj' => +[ +'ZWJ', +], +}, +'grbase' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'grext' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'hex' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'hst' => +{ +'l' => +[ +'L', +'Leading_Jamo', +], +'lv' => +[ +'LV', +'LV_Syllable', +], +'lvt' => +[ +'LVT', +'LVT_Syllable', +], +'na' => +[ +'NA', +'Not_Applicable', +], +'t' => +[ +'T', +'Trailing_Jamo', +], +'v' => +[ +'V', +'Vowel_Jamo', +], +}, +'hyphen' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'idc' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'ideo' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'ids' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'idsb' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'idst' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'in' => +{ +'1.1' => +[ +'1.1', +], +'10.0' => +[ +'10.0', +'10.0', +'V10_0', +], +'2.0' => +[ +'2.0', +'2.0', +'V2_0', +], +'2.1' => +[ +'2.1', +'2.1', +'V2_1', +], +'3.0' => +[ +'3.0', +'3.0', +'V3_0', +], +'3.1' => +[ +'3.1', +'3.1', +'V3_1', +], +'3.2' => +[ +'3.2', +'3.2', +'V3_2', +], +'4.0' => +[ +'4.0', +'4.0', +'V4_0', +], +'4.1' => +[ +'4.1', +'4.1', +'V4_1', +], +'5.0' => +[ +'5.0', +'5.0', +'V5_0', +], +'5.1' => +[ +'5.1', +'5.1', +'V5_1', +], +'5.2' => +[ +'5.2', +'5.2', +'V5_2', +], +'6.0' => +[ +'6.0', +'6.0', +'V6_0', +], +'6.1' => +[ +'6.1', +'6.1', +'V6_1', +], +'6.2' => +[ +'6.2', +'6.2', +'V6_2', +], +'6.3' => +[ +'6.3', +'6.3', +'V6_3', +], +'7.0' => +[ +'7.0', +'7.0', +'V7_0', +], +'8.0' => +[ +'8.0', +'8.0', +'V8_0', +], +'9.0' => +[ +'9.0', +'9.0', +'V9_0', +], +'unassigned' => +[ +'Unassigned', +], +}, +'inpc' => +{ +'bottom' => +[ +'Bottom', +], +'bottomandleft' => +[ +'Bottom_And_Left', +], +'bottomandright' => +[ +'Bottom_And_Right', +], +'left' => +[ +'Left', +], +'leftandright' => +[ +'Left_And_Right', +], +'na' => +[ +'NA', +], +'overstruck' => +[ +'Overstruck', +], +'right' => +[ +'Right', +], +'top' => +[ +'Top', +], +'topandbottom' => +[ +'Top_And_Bottom', +], +'topandbottomandright' => +[ +'Top_And_Bottom_And_Right', +], +'topandleft' => +[ +'Top_And_Left', +], +'topandleftandright' => +[ +'Top_And_Left_And_Right', +], +'topandright' => +[ +'Top_And_Right', +], +'visualorderleft' => +[ +'Visual_Order_Left', +], +}, +'insc' => +{ +'avagraha' => +[ +'Avagraha', +], +'bindu' => +[ +'Bindu', +], +'brahmijoiningnumber' => +[ +'Brahmi_Joining_Number', +], +'cantillationmark' => +[ +'Cantillation_Mark', +], +'consonant' => +[ +'Consonant', +], +'consonantdead' => +[ +'Consonant_Dead', +], +'consonantfinal' => +[ +'Consonant_Final', +], +'consonantheadletter' => +[ +'Consonant_Head_Letter', +], +'consonantkiller' => +[ +'Consonant_Killer', +], +'consonantmedial' => +[ +'Consonant_Medial', +], +'consonantplaceholder' => +[ +'Consonant_Placeholder', +], +'consonantprecedingrepha' => +[ +'Consonant_Preceding_Repha', +], +'consonantprefixed' => +[ +'Consonant_Prefixed', +], +'consonantsubjoined' => +[ +'Consonant_Subjoined', +], +'consonantsucceedingrepha' => +[ +'Consonant_Succeeding_Repha', +], +'consonantwithstacker' => +[ +'Consonant_With_Stacker', +], +'geminationmark' => +[ +'Gemination_Mark', +], +'invisiblestacker' => +[ +'Invisible_Stacker', +], +'joiner' => +[ +'Joiner', +], +'modifyingletter' => +[ +'Modifying_Letter', +], +'nonjoiner' => +[ +'Non_Joiner', +], +'nukta' => +[ +'Nukta', +], +'number' => +[ +'Number', +], +'numberjoiner' => +[ +'Number_Joiner', +], +'other' => +[ +'Other', +], +'purekiller' => +[ +'Pure_Killer', +], +'registershifter' => +[ +'Register_Shifter', +], +'syllablemodifier' => +[ +'Syllable_Modifier', +], +'toneletter' => +[ +'Tone_Letter', +], +'tonemark' => +[ +'Tone_Mark', +], +'virama' => +[ +'Virama', +], +'visarga' => +[ +'Visarga', +], +'vowel' => +[ +'Vowel', +], +'voweldependent' => +[ +'Vowel_Dependent', +], +'vowelindependent' => +[ +'Vowel_Independent', +], +}, +'jg' => +{ +'africanfeh' => +[ +'African_Feh', +], +'africannoon' => +[ +'African_Noon', +], +'africanqaf' => +[ +'African_Qaf', +], +'ain' => +[ +'Ain', +], +'alaph' => +[ +'Alaph', +], +'alef' => +[ +'Alef', +], +'beh' => +[ +'Beh', +], +'beth' => +[ +'Beth', +], +'burushaskiyehbarree' => +[ +'Burushaski_Yeh_Barree', +], +'dal' => +[ +'Dal', +], +'dalathrish' => +[ +'Dalath_Rish', +], +'e' => +[ +'E', +], +'farsiyeh' => +[ +'Farsi_Yeh', +], +'fe' => +[ +'Fe', +], +'feh' => +[ +'Feh', +], +'finalsemkath' => +[ +'Final_Semkath', +], +'gaf' => +[ +'Gaf', +], +'gamal' => +[ +'Gamal', +], +'hah' => +[ +'Hah', +], +'he' => +[ +'He', +], +'heh' => +[ +'Heh', +], +'hehgoal' => +[ +'Heh_Goal', +], +'heth' => +[ +'Heth', +], +'kaf' => +[ +'Kaf', +], +'kaph' => +[ +'Kaph', +], +'khaph' => +[ +'Khaph', +], +'knottedheh' => +[ +'Knotted_Heh', +], +'lam' => +[ +'Lam', +], +'lamadh' => +[ +'Lamadh', +], +'malayalambha' => +[ +'Malayalam_Bha', +], +'malayalamja' => +[ +'Malayalam_Ja', +], +'malayalamlla' => +[ +'Malayalam_Lla', +], +'malayalamllla' => +[ +'Malayalam_Llla', +], +'malayalamnga' => +[ +'Malayalam_Nga', +], +'malayalamnna' => +[ +'Malayalam_Nna', +], +'malayalamnnna' => +[ +'Malayalam_Nnna', +], +'malayalamnya' => +[ +'Malayalam_Nya', +], +'malayalamra' => +[ +'Malayalam_Ra', +], +'malayalamssa' => +[ +'Malayalam_Ssa', +], +'malayalamtta' => +[ +'Malayalam_Tta', +], +'manichaeanaleph' => +[ +'Manichaean_Aleph', +], +'manichaeanayin' => +[ +'Manichaean_Ayin', +], +'manichaeanbeth' => +[ +'Manichaean_Beth', +], +'manichaeandaleth' => +[ +'Manichaean_Daleth', +], +'manichaeandhamedh' => +[ +'Manichaean_Dhamedh', +], +'manichaeanfive' => +[ +'Manichaean_Five', +], +'manichaeangimel' => +[ +'Manichaean_Gimel', +], +'manichaeanheth' => +[ +'Manichaean_Heth', +], +'manichaeanhundred' => +[ +'Manichaean_Hundred', +], +'manichaeankaph' => +[ +'Manichaean_Kaph', +], +'manichaeanlamedh' => +[ +'Manichaean_Lamedh', +], +'manichaeanmem' => +[ +'Manichaean_Mem', +], +'manichaeannun' => +[ +'Manichaean_Nun', +], +'manichaeanone' => +[ +'Manichaean_One', +], +'manichaeanpe' => +[ +'Manichaean_Pe', +], +'manichaeanqoph' => +[ +'Manichaean_Qoph', +], +'manichaeanresh' => +[ +'Manichaean_Resh', +], +'manichaeansadhe' => +[ +'Manichaean_Sadhe', +], +'manichaeansamekh' => +[ +'Manichaean_Samekh', +], +'manichaeantaw' => +[ +'Manichaean_Taw', +], +'manichaeanten' => +[ +'Manichaean_Ten', +], +'manichaeanteth' => +[ +'Manichaean_Teth', +], +'manichaeanthamedh' => +[ +'Manichaean_Thamedh', +], +'manichaeantwenty' => +[ +'Manichaean_Twenty', +], +'manichaeanwaw' => +[ +'Manichaean_Waw', +], +'manichaeanyodh' => +[ +'Manichaean_Yodh', +], +'manichaeanzayin' => +[ +'Manichaean_Zayin', +], +'meem' => +[ +'Meem', +], +'mim' => +[ +'Mim', +], +'nojoininggroup' => +[ +'No_Joining_Group', +], +'noon' => +[ +'Noon', +], +'nun' => +[ +'Nun', +], +'nya' => +[ +'Nya', +], +'pe' => +[ +'Pe', +], +'qaf' => +[ +'Qaf', +], +'qaph' => +[ +'Qaph', +], +'reh' => +[ +'Reh', +], +'reversedpe' => +[ +'Reversed_Pe', +], +'rohingyayeh' => +[ +'Rohingya_Yeh', +], +'sad' => +[ +'Sad', +], +'sadhe' => +[ +'Sadhe', +], +'seen' => +[ +'Seen', +], +'semkath' => +[ +'Semkath', +], +'shin' => +[ +'Shin', +], +'straightwaw' => +[ +'Straight_Waw', +], +'swashkaf' => +[ +'Swash_Kaf', +], +'syriacwaw' => +[ +'Syriac_Waw', +], +'tah' => +[ +'Tah', +], +'taw' => +[ +'Taw', +], +'tehmarbuta' => +[ +'Teh_Marbuta', +], +'tehmarbutagoal' => +[ +'Teh_Marbuta_Goal', +'Hamza_On_Heh_Goal', +], +'teth' => +[ +'Teth', +], +'waw' => +[ +'Waw', +], +'yeh' => +[ +'Yeh', +], +'yehbarree' => +[ +'Yeh_Barree', +], +'yehwithtail' => +[ +'Yeh_With_Tail', +], +'yudh' => +[ +'Yudh', +], +'yudhhe' => +[ +'Yudh_He', +], +'zain' => +[ +'Zain', +], +'zhain' => +[ +'Zhain', +], +}, +'joinc' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'jt' => +{ +'c' => +[ +'C', +'Join_Causing', +], +'d' => +[ +'D', +'Dual_Joining', +], +'l' => +[ +'L', +'Left_Joining', +], +'r' => +[ +'R', +'Right_Joining', +], +'t' => +[ +'T', +'Transparent', +], +'u' => +[ +'U', +'Non_Joining', +], +}, +'lb' => +{ +'ai' => +[ +'AI', +'Ambiguous', +], +'al' => +[ +'AL', +'Alphabetic', +], +'b2' => +[ +'B2', +'Break_Both', +], +'ba' => +[ +'BA', +'Break_After', +], +'bb' => +[ +'BB', +'Break_Before', +], +'bk' => +[ +'BK', +'Mandatory_Break', +], +'cb' => +[ +'CB', +'Contingent_Break', +], +'cj' => +[ +'CJ', +'Conditional_Japanese_Starter', +], +'cl' => +[ +'CL', +'Close_Punctuation', +], +'cm' => +[ +'CM', +'Combining_Mark', +], +'cp' => +[ +'CP', +'Close_Parenthesis', +], +'cr' => +[ +'CR', +'Carriage_Return', +], +'eb' => +[ +'EB', +'E_Base', +], +'em' => +[ +'EM', +'E_Modifier', +], +'ex' => +[ +'EX', +'Exclamation', +], +'gl' => +[ +'GL', +'Glue', +], +'h2' => +[ +'H2', +], +'h3' => +[ +'H3', +], +'hl' => +[ +'HL', +'Hebrew_Letter', +], +'hy' => +[ +'HY', +'Hyphen', +], +'id' => +[ +'ID', +'Ideographic', +], +'in' => +[ +'IN', +'Inseparable', +'Inseperable', +], +'is' => +[ +'IS', +'Infix_Numeric', +], +'jl' => +[ +'JL', +], +'jt' => +[ +'JT', +], +'jv' => +[ +'JV', +], +'lf' => +[ +'LF', +'Line_Feed', +], +'nl' => +[ +'NL', +'Next_Line', +], +'ns' => +[ +'NS', +'Nonstarter', +], +'nu' => +[ +'NU', +'Numeric', +], +'op' => +[ +'OP', +'Open_Punctuation', +], +'po' => +[ +'PO', +'Postfix_Numeric', +], +'pr' => +[ +'PR', +'Prefix_Numeric', +], +'qu' => +[ +'QU', +'Quotation', +], +'ri' => +[ +'RI', +'Regional_Indicator', +], +'sa' => +[ +'SA', +'Complex_Context', +], +'sg' => +[ +'SG', +'Surrogate', +], +'sp' => +[ +'SP', +'Space', +], +'sy' => +[ +'SY', +'Break_Symbols', +], +'wj' => +[ +'WJ', +'Word_Joiner', +], +'xx' => +[ +'XX', +'Unknown', +], +'zw' => +[ +'ZW', +'ZWSpace', +], +'zwj' => +[ +'ZWJ', +], +}, +'loe' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'lower' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'math' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'nchar' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'nfcqc' => +{ +'m' => +[ +'M', +'Maybe', +], +'n' => +[ +'N', +'No', +], +'y' => +[ +'Y', +'Yes', +], +}, +'nfdqc' => +{ +'n' => +[ +'N', +'No', +], +'y' => +[ +'Y', +'Yes', +], +}, +'nfkcqc' => +{ +'m' => +[ +'M', +'Maybe', +], +'n' => +[ +'N', +'No', +], +'y' => +[ +'Y', +'Yes', +], +}, +'nfkdqc' => +{ +'n' => +[ +'N', +'No', +], +'y' => +[ +'Y', +'Yes', +], +}, +'nt' => +{ +'de' => +[ +'De', +'Decimal', +], +'di' => +[ +'Di', +'Digit', +], +'none' => +[ +'None', +], +'nu' => +[ +'Nu', +'Numeric', +], +}, +'nv' => +{ +'-1/2' => +[ +'-1/2', +], +0 => +[ +0, +], +1 => +[ +1, +], +'1/10' => +[ +'1/10', +], +'1/12' => +[ +'1/12', +], +'1/16' => +[ +'1/16', +], +'1/160' => +[ +'1/160', +], +'1/2' => +[ +'1/2', +], +'1/20' => +[ +'1/20', +], +'1/3' => +[ +'1/3', +], +'1/4' => +[ +'1/4', +], +'1/40' => +[ +'1/40', +], +'1/5' => +[ +'1/5', +], +'1/6' => +[ +'1/6', +], +'1/7' => +[ +'1/7', +], +'1/8' => +[ +'1/8', +], +'1/9' => +[ +'1/9', +], +10 => +[ +10, +], +100 => +[ +100, +], +1000 => +[ +1000, +], +10000 => +[ +10000, +], +100000 => +[ +100000, +], +1000000 => +[ +1000000, +], +100000000 => +[ +100000000, +], +10000000000 => +[ +10000000000, +], +1000000000000 => +[ +1000000000000, +], +11 => +[ +11, +], +'11/12' => +[ +'11/12', +], +'11/2' => +[ +'11/2', +], +12 => +[ +12, +], +13 => +[ +13, +], +'13/2' => +[ +'13/2', +], +14 => +[ +14, +], +15 => +[ +15, +], +'15/2' => +[ +'15/2', +], +16 => +[ +16, +], +17 => +[ +17, +], +'17/2' => +[ +'17/2', +], +18 => +[ +18, +], +19 => +[ +19, +], +2 => +[ +2, +], +'2/3' => +[ +'2/3', +], +'2/5' => +[ +'2/5', +], +20 => +[ +20, +], +200 => +[ +200, +], +2000 => +[ +2000, +], +20000 => +[ +20000, +], +200000 => +[ +200000, +], +21 => +[ +21, +], +216000 => +[ +216000, +], +22 => +[ +22, +], +23 => +[ +23, +], +24 => +[ +24, +], +25 => +[ +25, +], +26 => +[ +26, +], +27 => +[ +27, +], +28 => +[ +28, +], +29 => +[ +29, +], +3 => +[ +3, +], +'3/16' => +[ +'3/16', +], +'3/2' => +[ +'3/2', +], +'3/20' => +[ +'3/20', +], +'3/4' => +[ +'3/4', +], +'3/5' => +[ +'3/5', +], +'3/8' => +[ +'3/8', +], +'3/80' => +[ +'3/80', +], +30 => +[ +30, +], +300 => +[ +300, +], +3000 => +[ +3000, +], +30000 => +[ +30000, +], +300000 => +[ +300000, +], +31 => +[ +31, +], +32 => +[ +32, +], +33 => +[ +33, +], +34 => +[ +34, +], +35 => +[ +35, +], +36 => +[ +36, +], +37 => +[ +37, +], +38 => +[ +38, +], +39 => +[ +39, +], +4 => +[ +4, +], +'4/5' => +[ +'4/5', +], +40 => +[ +40, +], +400 => +[ +400, +], +4000 => +[ +4000, +], +40000 => +[ +40000, +], +400000 => +[ +400000, +], +41 => +[ +41, +], +42 => +[ +42, +], +43 => +[ +43, +], +432000 => +[ +432000, +], +44 => +[ +44, +], +45 => +[ +45, +], +46 => +[ +46, +], +47 => +[ +47, +], +48 => +[ +48, +], +49 => +[ +49, +], +5 => +[ +5, +], +'5/12' => +[ +'5/12', +], +'5/2' => +[ +'5/2', +], +'5/6' => +[ +'5/6', +], +'5/8' => +[ +'5/8', +], +50 => +[ +50, +], +500 => +[ +500, +], +5000 => +[ +5000, +], +50000 => +[ +50000, +], +500000 => +[ +500000, +], +6 => +[ +6, +], +60 => +[ +60, +], +600 => +[ +600, +], +6000 => +[ +6000, +], +60000 => +[ +60000, +], +600000 => +[ +600000, +], +7 => +[ +7, +], +'7/12' => +[ +'7/12', +], +'7/2' => +[ +'7/2', +], +'7/8' => +[ +'7/8', +], +70 => +[ +70, +], +700 => +[ +700, +], +7000 => +[ +7000, +], +70000 => +[ +70000, +], +700000 => +[ +700000, +], +8 => +[ +8, +], +80 => +[ +80, +], +800 => +[ +800, +], +8000 => +[ +8000, +], +80000 => +[ +80000, +], +800000 => +[ +800000, +], +9 => +[ +9, +], +'9/2' => +[ +'9/2', +], +90 => +[ +90, +], +900 => +[ +900, +], +9000 => +[ +9000, +], +90000 => +[ +90000, +], +900000 => +[ +900000, +], +'nan' => +[ +'NaN', +], +}, +'patsyn' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'patws' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'pcm' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'qmark' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'radical' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'ri' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'sb' => +{ +'at' => +[ +'AT', +'ATerm', +], +'cl' => +[ +'CL', +'Close', +], +'cr' => +[ +'CR', +], +'ex' => +[ +'EX', +'Extend', +], +'fo' => +[ +'FO', +'Format', +], +'le' => +[ +'LE', +'OLetter', +], +'lf' => +[ +'LF', +], +'lo' => +[ +'LO', +'Lower', +], +'nu' => +[ +'NU', +'Numeric', +], +'sc' => +[ +'SC', +'SContinue', +], +'se' => +[ +'SE', +'Sep', +], +'sp' => +[ +'SP', +'Sp', +], +'st' => +[ +'ST', +'STerm', +], +'up' => +[ +'UP', +'Upper', +], +'xx' => +[ +'XX', +'Other', +], +}, +'sc' => +{ +'adlm' => +[ +'Adlm', +'Adlam', +], +'aghb' => +[ +'Aghb', +'Caucasian_Albanian', +], +'ahom' => +[ +'Ahom', +], +'arab' => +[ +'Arab', +'Arabic', +], +'armi' => +[ +'Armi', +'Imperial_Aramaic', +], +'armn' => +[ +'Armn', +'Armenian', +], +'avst' => +[ +'Avst', +'Avestan', +], +'bali' => +[ +'Bali', +'Balinese', +], +'bamu' => +[ +'Bamu', +'Bamum', +], +'bass' => +[ +'Bass', +'Bassa_Vah', +], +'batk' => +[ +'Batk', +'Batak', +], +'beng' => +[ +'Beng', +'Bengali', +], +'bhks' => +[ +'Bhks', +'Bhaiksuki', +], +'bopo' => +[ +'Bopo', +'Bopomofo', +], +'brah' => +[ +'Brah', +'Brahmi', +], +'brai' => +[ +'Brai', +'Braille', +], +'bugi' => +[ +'Bugi', +'Buginese', +], +'buhd' => +[ +'Buhd', +'Buhid', +], +'cakm' => +[ +'Cakm', +'Chakma', +], +'cans' => +[ +'Cans', +'Canadian_Aboriginal', +], +'cari' => +[ +'Cari', +'Carian', +], +'cham' => +[ +'Cham', +], +'cher' => +[ +'Cher', +'Cherokee', +], +'copt' => +[ +'Copt', +'Coptic', +'Qaac', +], +'cprt' => +[ +'Cprt', +'Cypriot', +], +'cyrl' => +[ +'Cyrl', +'Cyrillic', +], +'deva' => +[ +'Deva', +'Devanagari', +], +'dsrt' => +[ +'Dsrt', +'Deseret', +], +'dupl' => +[ +'Dupl', +'Duployan', +], +'egyp' => +[ +'Egyp', +'Egyptian_Hieroglyphs', +], +'elba' => +[ +'Elba', +'Elbasan', +], +'ethi' => +[ +'Ethi', +'Ethiopic', +], +'geor' => +[ +'Geor', +'Georgian', +], +'glag' => +[ +'Glag', +'Glagolitic', +], +'gonm' => +[ +'Gonm', +'Masaram_Gondi', +], +'goth' => +[ +'Goth', +'Gothic', +], +'gran' => +[ +'Gran', +'Grantha', +], +'grek' => +[ +'Grek', +'Greek', +], +'gujr' => +[ +'Gujr', +'Gujarati', +], +'guru' => +[ +'Guru', +'Gurmukhi', +], +'hang' => +[ +'Hang', +'Hangul', +], +'hani' => +[ +'Hani', +'Han', +], +'hano' => +[ +'Hano', +'Hanunoo', +], +'hatr' => +[ +'Hatr', +'Hatran', +], +'hebr' => +[ +'Hebr', +'Hebrew', +], +'hira' => +[ +'Hira', +'Hiragana', +], +'hluw' => +[ +'Hluw', +'Anatolian_Hieroglyphs', +], +'hmng' => +[ +'Hmng', +'Pahawh_Hmong', +], +'hrkt' => +[ +'Hrkt', +'Katakana_Or_Hiragana', +], +'hung' => +[ +'Hung', +'Old_Hungarian', +], +'ital' => +[ +'Ital', +'Old_Italic', +], +'java' => +[ +'Java', +'Javanese', +], +'kali' => +[ +'Kali', +'Kayah_Li', +], +'kana' => +[ +'Kana', +'Katakana', +], +'khar' => +[ +'Khar', +'Kharoshthi', +], +'khmr' => +[ +'Khmr', +'Khmer', +], +'khoj' => +[ +'Khoj', +'Khojki', +], +'knda' => +[ +'Knda', +'Kannada', +], +'kthi' => +[ +'Kthi', +'Kaithi', +], +'lana' => +[ +'Lana', +'Tai_Tham', +], +'laoo' => +[ +'Laoo', +'Lao', +], +'latn' => +[ +'Latn', +'Latin', +], +'lepc' => +[ +'Lepc', +'Lepcha', +], +'limb' => +[ +'Limb', +'Limbu', +], +'lina' => +[ +'Lina', +'Linear_A', +], +'linb' => +[ +'Linb', +'Linear_B', +], +'lisu' => +[ +'Lisu', +], +'lyci' => +[ +'Lyci', +'Lycian', +], +'lydi' => +[ +'Lydi', +'Lydian', +], +'mahj' => +[ +'Mahj', +'Mahajani', +], +'mand' => +[ +'Mand', +'Mandaic', +], +'mani' => +[ +'Mani', +'Manichaean', +], +'marc' => +[ +'Marc', +'Marchen', +], +'mend' => +[ +'Mend', +'Mende_Kikakui', +], +'merc' => +[ +'Merc', +'Meroitic_Cursive', +], +'mero' => +[ +'Mero', +'Meroitic_Hieroglyphs', +], +'mlym' => +[ +'Mlym', +'Malayalam', +], +'modi' => +[ +'Modi', +], +'mong' => +[ +'Mong', +'Mongolian', +], +'mroo' => +[ +'Mroo', +'Mro', +], +'mtei' => +[ +'Mtei', +'Meetei_Mayek', +], +'mult' => +[ +'Mult', +'Multani', +], +'mymr' => +[ +'Mymr', +'Myanmar', +], +'narb' => +[ +'Narb', +'Old_North_Arabian', +], +'nbat' => +[ +'Nbat', +'Nabataean', +], +'newa' => +[ +'Newa', +], +'nkoo' => +[ +'Nkoo', +'Nko', +], +'nshu' => +[ +'Nshu', +'Nushu', +], +'ogam' => +[ +'Ogam', +'Ogham', +], +'olck' => +[ +'Olck', +'Ol_Chiki', +], +'orkh' => +[ +'Orkh', +'Old_Turkic', +], +'orya' => +[ +'Orya', +'Oriya', +], +'osge' => +[ +'Osge', +'Osage', +], +'osma' => +[ +'Osma', +'Osmanya', +], +'palm' => +[ +'Palm', +'Palmyrene', +], +'pauc' => +[ +'Pauc', +'Pau_Cin_Hau', +], +'perm' => +[ +'Perm', +'Old_Permic', +], +'phag' => +[ +'Phag', +'Phags_Pa', +], +'phli' => +[ +'Phli', +'Inscriptional_Pahlavi', +], +'phlp' => +[ +'Phlp', +'Psalter_Pahlavi', +], +'phnx' => +[ +'Phnx', +'Phoenician', +], +'plrd' => +[ +'Plrd', +'Miao', +], +'prti' => +[ +'Prti', +'Inscriptional_Parthian', +], +'rjng' => +[ +'Rjng', +'Rejang', +], +'runr' => +[ +'Runr', +'Runic', +], +'samr' => +[ +'Samr', +'Samaritan', +], +'sarb' => +[ +'Sarb', +'Old_South_Arabian', +], +'saur' => +[ +'Saur', +'Saurashtra', +], +'sgnw' => +[ +'Sgnw', +'SignWriting', +], +'shaw' => +[ +'Shaw', +'Shavian', +], +'shrd' => +[ +'Shrd', +'Sharada', +], +'sidd' => +[ +'Sidd', +'Siddham', +], +'sind' => +[ +'Sind', +'Khudawadi', +], +'sinh' => +[ +'Sinh', +'Sinhala', +], +'sora' => +[ +'Sora', +'Sora_Sompeng', +], +'soyo' => +[ +'Soyo', +'Soyombo', +], +'sund' => +[ +'Sund', +'Sundanese', +], +'sylo' => +[ +'Sylo', +'Syloti_Nagri', +], +'syrc' => +[ +'Syrc', +'Syriac', +], +'tagb' => +[ +'Tagb', +'Tagbanwa', +], +'takr' => +[ +'Takr', +'Takri', +], +'tale' => +[ +'Tale', +'Tai_Le', +], +'talu' => +[ +'Talu', +'New_Tai_Lue', +], +'taml' => +[ +'Taml', +'Tamil', +], +'tang' => +[ +'Tang', +'Tangut', +], +'tavt' => +[ +'Tavt', +'Tai_Viet', +], +'telu' => +[ +'Telu', +'Telugu', +], +'tfng' => +[ +'Tfng', +'Tifinagh', +], +'tglg' => +[ +'Tglg', +'Tagalog', +], +'thaa' => +[ +'Thaa', +'Thaana', +], +'thai' => +[ +'Thai', +], +'tibt' => +[ +'Tibt', +'Tibetan', +], +'tirh' => +[ +'Tirh', +'Tirhuta', +], +'ugar' => +[ +'Ugar', +'Ugaritic', +], +'vaii' => +[ +'Vaii', +'Vai', +], +'wara' => +[ +'Wara', +'Warang_Citi', +], +'xpeo' => +[ +'Xpeo', +'Old_Persian', +], +'xsux' => +[ +'Xsux', +'Cuneiform', +], +'yiii' => +[ +'Yiii', +'Yi', +], +'zanb' => +[ +'Zanb', +'Zanabazar_Square', +], +'zinh' => +[ +'Zinh', +'Inherited', +'Qaai', +], +'zyyy' => +[ +'Zyyy', +'Common', +], +'zzzz' => +[ +'Zzzz', +'Unknown', +], +}, +'scx' => +{ +'adlm' => +[ +'Adlm', +'Adlam', +], +'aghb' => +[ +'Aghb', +'Caucasian_Albanian', +], +'ahom' => +[ +'Ahom', +], +'arab' => +[ +'Arab', +'Arabic', +], +'armi' => +[ +'Armi', +'Imperial_Aramaic', +], +'armn' => +[ +'Armn', +'Armenian', +], +'avst' => +[ +'Avst', +'Avestan', +], +'bali' => +[ +'Bali', +'Balinese', +], +'bamu' => +[ +'Bamu', +'Bamum', +], +'bass' => +[ +'Bass', +'Bassa_Vah', +], +'batk' => +[ +'Batk', +'Batak', +], +'beng' => +[ +'Beng', +'Bengali', +], +'bhks' => +[ +'Bhks', +'Bhaiksuki', +], +'bopo' => +[ +'Bopo', +'Bopomofo', +], +'brah' => +[ +'Brah', +'Brahmi', +], +'brai' => +[ +'Brai', +'Braille', +], +'bugi' => +[ +'Bugi', +'Buginese', +], +'buhd' => +[ +'Buhd', +'Buhid', +], +'cakm' => +[ +'Cakm', +'Chakma', +], +'cans' => +[ +'Cans', +'Canadian_Aboriginal', +], +'cari' => +[ +'Cari', +'Carian', +], +'cham' => +[ +'Cham', +], +'cher' => +[ +'Cher', +'Cherokee', +], +'copt' => +[ +'Copt', +'Coptic', +'Qaac', +], +'cprt' => +[ +'Cprt', +'Cypriot', +], +'cyrl' => +[ +'Cyrl', +'Cyrillic', +], +'deva' => +[ +'Deva', +'Devanagari', +], +'dsrt' => +[ +'Dsrt', +'Deseret', +], +'dupl' => +[ +'Dupl', +'Duployan', +], +'egyp' => +[ +'Egyp', +'Egyptian_Hieroglyphs', +], +'elba' => +[ +'Elba', +'Elbasan', +], +'ethi' => +[ +'Ethi', +'Ethiopic', +], +'geor' => +[ +'Geor', +'Georgian', +], +'glag' => +[ +'Glag', +'Glagolitic', +], +'gonm' => +[ +'Gonm', +'Masaram_Gondi', +], +'goth' => +[ +'Goth', +'Gothic', +], +'gran' => +[ +'Gran', +'Grantha', +], +'grek' => +[ +'Grek', +'Greek', +], +'gujr' => +[ +'Gujr', +'Gujarati', +], +'guru' => +[ +'Guru', +'Gurmukhi', +], +'hang' => +[ +'Hang', +'Hangul', +], +'hani' => +[ +'Hani', +'Han', +], +'hano' => +[ +'Hano', +'Hanunoo', +], +'hatr' => +[ +'Hatr', +'Hatran', +], +'hebr' => +[ +'Hebr', +'Hebrew', +], +'hira' => +[ +'Hira', +'Hiragana', +], +'hluw' => +[ +'Hluw', +'Anatolian_Hieroglyphs', +], +'hmng' => +[ +'Hmng', +'Pahawh_Hmong', +], +'hrkt' => +[ +'Hrkt', +'Katakana_Or_Hiragana', +], +'hung' => +[ +'Hung', +'Old_Hungarian', +], +'ital' => +[ +'Ital', +'Old_Italic', +], +'java' => +[ +'Java', +'Javanese', +], +'kali' => +[ +'Kali', +'Kayah_Li', +], +'kana' => +[ +'Kana', +'Katakana', +], +'khar' => +[ +'Khar', +'Kharoshthi', +], +'khmr' => +[ +'Khmr', +'Khmer', +], +'khoj' => +[ +'Khoj', +'Khojki', +], +'knda' => +[ +'Knda', +'Kannada', +], +'kthi' => +[ +'Kthi', +'Kaithi', +], +'lana' => +[ +'Lana', +'Tai_Tham', +], +'laoo' => +[ +'Laoo', +'Lao', +], +'latn' => +[ +'Latn', +'Latin', +], +'lepc' => +[ +'Lepc', +'Lepcha', +], +'limb' => +[ +'Limb', +'Limbu', +], +'lina' => +[ +'Lina', +'Linear_A', +], +'linb' => +[ +'Linb', +'Linear_B', +], +'lisu' => +[ +'Lisu', +], +'lyci' => +[ +'Lyci', +'Lycian', +], +'lydi' => +[ +'Lydi', +'Lydian', +], +'mahj' => +[ +'Mahj', +'Mahajani', +], +'mand' => +[ +'Mand', +'Mandaic', +], +'mani' => +[ +'Mani', +'Manichaean', +], +'marc' => +[ +'Marc', +'Marchen', +], +'mend' => +[ +'Mend', +'Mende_Kikakui', +], +'merc' => +[ +'Merc', +'Meroitic_Cursive', +], +'mero' => +[ +'Mero', +'Meroitic_Hieroglyphs', +], +'mlym' => +[ +'Mlym', +'Malayalam', +], +'modi' => +[ +'Modi', +], +'mong' => +[ +'Mong', +'Mongolian', +], +'mroo' => +[ +'Mroo', +'Mro', +], +'mtei' => +[ +'Mtei', +'Meetei_Mayek', +], +'mult' => +[ +'Mult', +'Multani', +], +'mymr' => +[ +'Mymr', +'Myanmar', +], +'narb' => +[ +'Narb', +'Old_North_Arabian', +], +'nbat' => +[ +'Nbat', +'Nabataean', +], +'newa' => +[ +'Newa', +], +'nkoo' => +[ +'Nkoo', +'Nko', +], +'nshu' => +[ +'Nshu', +'Nushu', +], +'ogam' => +[ +'Ogam', +'Ogham', +], +'olck' => +[ +'Olck', +'Ol_Chiki', +], +'orkh' => +[ +'Orkh', +'Old_Turkic', +], +'orya' => +[ +'Orya', +'Oriya', +], +'osge' => +[ +'Osge', +'Osage', +], +'osma' => +[ +'Osma', +'Osmanya', +], +'palm' => +[ +'Palm', +'Palmyrene', +], +'pauc' => +[ +'Pauc', +'Pau_Cin_Hau', +], +'perm' => +[ +'Perm', +'Old_Permic', +], +'phag' => +[ +'Phag', +'Phags_Pa', +], +'phli' => +[ +'Phli', +'Inscriptional_Pahlavi', +], +'phlp' => +[ +'Phlp', +'Psalter_Pahlavi', +], +'phnx' => +[ +'Phnx', +'Phoenician', +], +'plrd' => +[ +'Plrd', +'Miao', +], +'prti' => +[ +'Prti', +'Inscriptional_Parthian', +], +'rjng' => +[ +'Rjng', +'Rejang', +], +'runr' => +[ +'Runr', +'Runic', +], +'samr' => +[ +'Samr', +'Samaritan', +], +'sarb' => +[ +'Sarb', +'Old_South_Arabian', +], +'saur' => +[ +'Saur', +'Saurashtra', +], +'sgnw' => +[ +'Sgnw', +'SignWriting', +], +'shaw' => +[ +'Shaw', +'Shavian', +], +'shrd' => +[ +'Shrd', +'Sharada', +], +'sidd' => +[ +'Sidd', +'Siddham', +], +'sind' => +[ +'Sind', +'Khudawadi', +], +'sinh' => +[ +'Sinh', +'Sinhala', +], +'sora' => +[ +'Sora', +'Sora_Sompeng', +], +'soyo' => +[ +'Soyo', +'Soyombo', +], +'sund' => +[ +'Sund', +'Sundanese', +], +'sylo' => +[ +'Sylo', +'Syloti_Nagri', +], +'syrc' => +[ +'Syrc', +'Syriac', +], +'tagb' => +[ +'Tagb', +'Tagbanwa', +], +'takr' => +[ +'Takr', +'Takri', +], +'tale' => +[ +'Tale', +'Tai_Le', +], +'talu' => +[ +'Talu', +'New_Tai_Lue', +], +'taml' => +[ +'Taml', +'Tamil', +], +'tang' => +[ +'Tang', +'Tangut', +], +'tavt' => +[ +'Tavt', +'Tai_Viet', +], +'telu' => +[ +'Telu', +'Telugu', +], +'tfng' => +[ +'Tfng', +'Tifinagh', +], +'tglg' => +[ +'Tglg', +'Tagalog', +], +'thaa' => +[ +'Thaa', +'Thaana', +], +'thai' => +[ +'Thai', +], +'tibt' => +[ +'Tibt', +'Tibetan', +], +'tirh' => +[ +'Tirh', +'Tirhuta', +], +'ugar' => +[ +'Ugar', +'Ugaritic', +], +'vaii' => +[ +'Vaii', +'Vai', +], +'wara' => +[ +'Wara', +'Warang_Citi', +], +'xpeo' => +[ +'Xpeo', +'Old_Persian', +], +'xsux' => +[ +'Xsux', +'Cuneiform', +], +'yiii' => +[ +'Yiii', +'Yi', +], +'zanb' => +[ +'Zanb', +'Zanabazar_Square', +], +'zinh' => +[ +'Zinh', +'Inherited', +'Qaai', +], +'zyyy' => +[ +'Zyyy', +'Common', +], +'zzzz' => +[ +'Zzzz', +'Unknown', +], +}, +'sd' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'sterm' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'term' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'uideo' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'upper' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'vo' => +{ +'r' => +[ +'R', +'Rotated', +], +'tr' => +[ +'Tr', +'Transformed_Rotated', +], +'tu' => +[ +'Tu', +'Transformed_Upright', +], +'u' => +[ +'U', +'Upright', +], +}, +'vs' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'wb' => +{ +'cr' => +[ +'CR', +], +'dq' => +[ +'DQ', +'Double_Quote', +], +'eb' => +[ +'EB', +'E_Base', +], +'ebg' => +[ +'EBG', +'E_Base_GAZ', +], +'em' => +[ +'EM', +'E_Modifier', +], +'ex' => +[ +'EX', +'ExtendNumLet', +], +'extend' => +[ +'Extend', +], +'fo' => +[ +'FO', +'Format', +], +'gaz' => +[ +'GAZ', +'Glue_After_Zwj', +], +'hl' => +[ +'HL', +'Hebrew_Letter', +], +'ka' => +[ +'KA', +'Katakana', +], +'le' => +[ +'LE', +'ALetter', +], +'lf' => +[ +'LF', +], +'mb' => +[ +'MB', +'MidNumLet', +], +'ml' => +[ +'ML', +'MidLetter', +], +'mn' => +[ +'MN', +'MidNum', +], +'nl' => +[ +'NL', +'Newline', +], +'nu' => +[ +'NU', +'Numeric', +], +'ri' => +[ +'RI', +'Regional_Indicator', +], +'sq' => +[ +'SQ', +'Single_Quote', +], +'xx' => +[ +'XX', +'Other', +], +'zwj' => +[ +'ZWJ', +], +}, +'wspace' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'xidc' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +'xids' => +{ +'n' => +[ +'N', +'No', +'F', +'False', +], +'y' => +[ +'Y', +'Yes', +'T', +'True', +], +}, +); + +# Ordered (by code point ordinal) list of the ranges of code points whose +# names are algorithmically determined. Each range entry is an anonymous hash +# of the start and end points and a template for the names within it. +@Unicode::UCD::algorithmic_named_code_points = ( + +{ +'high' => 19893, +'low' => 13312, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 40938, +'low' => 19968, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 55203, +'low' => 44032, +'name' => '<hangul syllable>', +}, +{ +'high' => 64109, +'low' => 63744, +'name' => 'CJK COMPATIBILITY IDEOGRAPH-<code point>', +}, +{ +'high' => 64217, +'low' => 64112, +'name' => 'CJK COMPATIBILITY IDEOGRAPH-<code point>', +}, +{ +'high' => 100332, +'low' => 94208, +'name' => 'TANGUT IDEOGRAPH-<code point>', +}, +{ +'high' => 111355, +'low' => 110960, +'name' => 'NUSHU CHARACTER-<code point>', +}, +{ +'high' => 173782, +'low' => 131072, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 177972, +'low' => 173824, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 178205, +'low' => 177984, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 183969, +'low' => 178208, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 191456, +'low' => 183984, +'name' => 'CJK UNIFIED IDEOGRAPH-<code point>', +}, +{ +'high' => 195101, +'low' => 194560, +'name' => 'CJK COMPATIBILITY IDEOGRAPH-<code point>', +}, +, +); + +# The properties that as-is have two meanings, and which must be disambiguated +%Unicode::UCD::ambiguous_names = ( +'cf' => 1, +'isc' => 1, +'lc' => 1, +'sc' => 1, +); + +# Keys are the prop-val combinations which are the default values for the +# given property, expressed in standard loose form +%Unicode::UCD::loose_defaults = ( +'age=na' => 1, +'age=unassigned' => 1, +'ahex=f' => 1, +'ahex=false' => 1, +'ahex=n' => 1, +'ahex=no' => 1, +'alpha=f' => 1, +'alpha=false' => 1, +'alpha=n' => 1, +'alpha=no' => 1, +'bc=l' => 1, +'bc=lefttoright' => 1, +'bidic=f' => 1, +'bidic=false' => 1, +'bidic=n' => 1, +'bidic=no' => 1, +'bidim=f' => 1, +'bidim=false' => 1, +'bidim=n' => 1, +'bidim=no' => 1, +'blk=nb' => 1, +'blk=noblock' => 1, +'bpt=n' => 1, +'bpt=none' => 1, +'cased=f' => 1, +'cased=false' => 1, +'cased=n' => 1, +'cased=no' => 1, +'ccc=0' => 1, +'ccc=notreordered' => 1, +'ccc=nr' => 1, +'ce=f' => 1, +'ce=false' => 1, +'ce=n' => 1, +'ce=no' => 1, +'ci=f' => 1, +'ci=false' => 1, +'ci=n' => 1, +'ci=no' => 1, +'cn' => 1, +'compex=f' => 1, +'compex=false' => 1, +'compex=n' => 1, +'compex=no' => 1, +'cwcf=f' => 1, +'cwcf=false' => 1, +'cwcf=n' => 1, +'cwcf=no' => 1, +'cwcm=f' => 1, +'cwcm=false' => 1, +'cwcm=n' => 1, +'cwcm=no' => 1, +'cwkcf=f' => 1, +'cwkcf=false' => 1, +'cwkcf=n' => 1, +'cwkcf=no' => 1, +'cwl=f' => 1, +'cwl=false' => 1, +'cwl=n' => 1, +'cwl=no' => 1, +'cwt=f' => 1, +'cwt=false' => 1, +'cwt=n' => 1, +'cwt=no' => 1, +'cwu=f' => 1, +'cwu=false' => 1, +'cwu=n' => 1, +'cwu=no' => 1, +'dash=f' => 1, +'dash=false' => 1, +'dash=n' => 1, +'dash=no' => 1, +'dep=f' => 1, +'dep=false' => 1, +'dep=n' => 1, +'dep=no' => 1, +'di=f' => 1, +'di=false' => 1, +'di=n' => 1, +'di=no' => 1, +'dia=f' => 1, +'dia=false' => 1, +'dia=n' => 1, +'dia=no' => 1, +'dt=none' => 1, +'ea=n' => 1, +'ea=neutral' => 1, +'ext=f' => 1, +'ext=false' => 1, +'ext=n' => 1, +'ext=no' => 1, +'gc=cn' => 1, +'gc=unassigned' => 1, +'gcb=other' => 1, +'gcb=xx' => 1, +'grbase=f' => 1, +'grbase=false' => 1, +'grbase=n' => 1, +'grbase=no' => 1, +'grext=f' => 1, +'grext=false' => 1, +'grext=n' => 1, +'grext=no' => 1, +'hex=f' => 1, +'hex=false' => 1, +'hex=n' => 1, +'hex=no' => 1, +'hst=na' => 1, +'hst=notapplicable' => 1, +'hyphen=f' => 1, +'hyphen=false' => 1, +'hyphen=n' => 1, +'hyphen=no' => 1, +'idc=f' => 1, +'idc=false' => 1, +'idc=n' => 1, +'idc=no' => 1, +'ideo=f' => 1, +'ideo=false' => 1, +'ideo=n' => 1, +'ideo=no' => 1, +'ids=f' => 1, +'ids=false' => 1, +'ids=n' => 1, +'ids=no' => 1, +'idsb=f' => 1, +'idsb=false' => 1, +'idsb=n' => 1, +'idsb=no' => 1, +'idst=f' => 1, +'idst=false' => 1, +'idst=n' => 1, +'idst=no' => 1, +'in=unassigned' => 1, +'innb' => 1, +'innoblock' => 1, +'inpc=na' => 1, +'insc=other' => 1, +'iscn' => 1, +'isnb' => 1, +'isnoblock' => 1, +'isunassigned' => 1, +'isunknown' => 1, +'iszzzz' => 1, +'jg=nojoininggroup' => 1, +'joinc=f' => 1, +'joinc=false' => 1, +'joinc=n' => 1, +'joinc=no' => 1, +'jt=nonjoining' => 1, +'jt=u' => 1, +'lb=unknown' => 1, +'lb=xx' => 1, +'loe=f' => 1, +'loe=false' => 1, +'loe=n' => 1, +'loe=no' => 1, +'lower=f' => 1, +'lower=false' => 1, +'lower=n' => 1, +'lower=no' => 1, +'math=f' => 1, +'math=false' => 1, +'math=n' => 1, +'math=no' => 1, +'nb' => 1, +'nchar=f' => 1, +'nchar=false' => 1, +'nchar=n' => 1, +'nchar=no' => 1, +'nfcqc=y' => 1, +'nfcqc=yes' => 1, +'nfdqc=y' => 1, +'nfdqc=yes' => 1, +'nfkcqc=y' => 1, +'nfkcqc=yes' => 1, +'nfkdqc=y' => 1, +'nfkdqc=yes' => 1, +'noblock' => 1, +'nt=none' => 1, +'nv=nan' => 1, +'patsyn=f' => 1, +'patsyn=false' => 1, +'patsyn=n' => 1, +'patsyn=no' => 1, +'patws=f' => 1, +'patws=false' => 1, +'patws=n' => 1, +'patws=no' => 1, +'pcm=f' => 1, +'pcm=false' => 1, +'pcm=n' => 1, +'pcm=no' => 1, +'qmark=f' => 1, +'qmark=false' => 1, +'qmark=n' => 1, +'qmark=no' => 1, +'radical=f' => 1, +'radical=false' => 1, +'radical=n' => 1, +'radical=no' => 1, +'ri=f' => 1, +'ri=false' => 1, +'ri=n' => 1, +'ri=no' => 1, +'sb=other' => 1, +'sb=xx' => 1, +'sc=unknown' => 1, +'sc=zzzz' => 1, +'scx=unknown' => 1, +'scx=zzzz' => 1, +'sd=f' => 1, +'sd=false' => 1, +'sd=n' => 1, +'sd=no' => 1, +'sterm=f' => 1, +'sterm=false' => 1, +'sterm=n' => 1, +'sterm=no' => 1, +'term=f' => 1, +'term=false' => 1, +'term=n' => 1, +'term=no' => 1, +'uideo=f' => 1, +'uideo=false' => 1, +'uideo=n' => 1, +'uideo=no' => 1, +'unassigned' => 1, +'unknown' => 1, +'upper=f' => 1, +'upper=false' => 1, +'upper=n' => 1, +'upper=no' => 1, +'vo=r' => 1, +'vo=rotated' => 1, +'vs=f' => 1, +'vs=false' => 1, +'vs=n' => 1, +'vs=no' => 1, +'wb=other' => 1, +'wb=xx' => 1, +'wspace=f' => 1, +'wspace=false' => 1, +'wspace=n' => 1, +'wspace=no' => 1, +'xidc=f' => 1, +'xidc=false' => 1, +'xidc=n' => 1, +'xidc=no' => 1, +'xids=f' => 1, +'xids=false' => 1, +'xids=n' => 1, +'xids=no' => 1, +'zzzz' => 1, +); + +# The properties that are combinations, in that they have both a map table and +# a match table. This is actually for UCD.t, so it knows how to test for +# these. +%Unicode::UCD::combination_property = ( + +); + +# All combinations of names that are suppressed. +# This is actually for UCD.t, so it knows which properties shouldn't have +# entries. If it got any bigger, would probably want to put it in its own +# file to use memory only when it was needed, in testing. +@Unicode::UCD::suppressed_properties = ( + +'cjkaccountingnumeric', +'cjkcompatibilityvariant', +'cjkiicore', +'cjkirggsource', +'cjkirghsource', +'cjkirgjsource', +'cjkirgkpsource', +'cjkirgksource', +'cjkirgmsource', +'cjkirgtsource', +'cjkirgusource', +'cjkirgvsource', +'cjkothernumeric', +'cjkprimarynumeric', +'cjkrsunicode', +'expandsonnfc', +'expandsonnfd', +'expandsonnfkc', +'expandsonnfkd', +'fcnfkc', +'fcnfkcclosure', +'graphemelink', +'grlink', +'jamoshortname', +'jsn', +'kaccountingnumeric', +'kcompatibilityvariant', +'kiicore', +'kirggsource', +'kirghsource', +'kirgjsource', +'kirgkpsource', +'kirgksource', +'kirgmsource', +'kirgtsource', +'kirgusource', +'kirgvsource', +'kothernumeric', +'kprimarynumeric', +'krsunicode', +'oalpha', +'odi', +'ogrext', +'oidc', +'oids', +'olower', +'omath', +'otheralphabetic', +'otherdefaultignorablecodepoint', +'othergraphemeextend', +'otheridcontinue', +'otheridstart', +'otherlowercase', +'othermath', +'otheruppercase', +'oupper', +'sc=hrkt', +'sc=katakanaorhiragana', +'script=hrkt', +'script=katakanaorhiragana', +'scriptextensions=hrkt', +'scriptextensions=katakanaorhiragana', +'scx=hrkt', +'scx=katakanaorhiragana', +'unicoderadicalstroke', +'urs', +'xonfc', +'xonfd', +'xonfkc', +'xonfkd', +, +); + +1; +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +00000 NULL +00000 NUL +00001 START OF HEADING +00001 SOH +00002 START OF TEXT +00002 STX +00003 END OF TEXT +00003 ETX +00004 END OF TRANSMISSION +00004 EOT +00005 ENQUIRY +00005 ENQ +00006 ACKNOWLEDGE +00006 ACK +00007 ALERT +00007 BEL +00008 BACKSPACE +00008 BS +00009 CHARACTER TABULATION +00009 HORIZONTAL TABULATION +00009 HT +00009 TAB +0000A LINE FEED +0000A NEW LINE +0000A END OF LINE +0000A LINE FEED (LF) +0000A EOL +0000A LF +0000A NL +0000B LINE TABULATION +0000B VERTICAL TABULATION +0000B VT +0000C FORM FEED +0000C FORM FEED (FF) +0000C FF +0000D CARRIAGE RETURN +0000D CARRIAGE RETURN (CR) +0000D CR +0000E SHIFT OUT +0000E LOCKING-SHIFT ONE +0000E SO +0000F SHIFT IN +0000F LOCKING-SHIFT ZERO +0000F SI +00010 DATA LINK ESCAPE +00010 DLE +00011 DEVICE CONTROL ONE +00011 DC1 +00012 DEVICE CONTROL TWO +00012 DC2 +00013 DEVICE CONTROL THREE +00013 DC3 +00014 DEVICE CONTROL FOUR +00014 DC4 +00015 NEGATIVE ACKNOWLEDGE +00015 NAK +00016 SYNCHRONOUS IDLE +00016 SYN +00017 END OF TRANSMISSION BLOCK +00017 ETB +00018 CANCEL +00018 CAN +00019 END OF MEDIUM +00019 EOM +0001A SUBSTITUTE +0001A SUB +0001B ESCAPE +0001B ESC +0001C INFORMATION SEPARATOR FOUR +0001C FILE SEPARATOR +0001C FS +0001D INFORMATION SEPARATOR THREE +0001D GROUP SEPARATOR +0001D GS +0001E INFORMATION SEPARATOR TWO +0001E RECORD SEPARATOR +0001E RS +0001F INFORMATION SEPARATOR ONE +0001F UNIT SEPARATOR +0001F US +00020 SPACE +00020 SP +00021 EXCLAMATION MARK +00022 QUOTATION MARK +00023 NUMBER SIGN +00024 DOLLAR SIGN +00025 PERCENT SIGN +00026 AMPERSAND +00027 APOSTROPHE +00028 LEFT PARENTHESIS +00029 RIGHT PARENTHESIS +0002A ASTERISK +0002B PLUS SIGN +0002C COMMA +0002D HYPHEN-MINUS +0002E FULL STOP +0002F SOLIDUS +00030 DIGIT ZERO +00031 DIGIT ONE +00032 DIGIT TWO +00033 DIGIT THREE +00034 DIGIT FOUR +00035 DIGIT FIVE +00036 DIGIT SIX +00037 DIGIT SEVEN +00038 DIGIT EIGHT +00039 DIGIT NINE +0003A COLON +0003B SEMICOLON +0003C LESS-THAN SIGN +0003D EQUALS SIGN +0003E GREATER-THAN SIGN +0003F QUESTION MARK +00040 COMMERCIAL AT +00041 LATIN CAPITAL LETTER A +00042 LATIN CAPITAL LETTER B +00043 LATIN CAPITAL LETTER C +00044 LATIN CAPITAL LETTER D +00045 LATIN CAPITAL LETTER E +00046 LATIN CAPITAL LETTER F +00047 LATIN CAPITAL LETTER G +00048 LATIN CAPITAL LETTER H +00049 LATIN CAPITAL LETTER I +0004A LATIN CAPITAL LETTER J +0004B LATIN CAPITAL LETTER K +0004C LATIN CAPITAL LETTER L +0004D LATIN CAPITAL LETTER M +0004E LATIN CAPITAL LETTER N +0004F LATIN CAPITAL LETTER O +00050 LATIN CAPITAL LETTER P +00051 LATIN CAPITAL LETTER Q +00052 LATIN CAPITAL LETTER R +00053 LATIN CAPITAL LETTER S +00054 LATIN CAPITAL LETTER T +00055 LATIN CAPITAL LETTER U +00056 LATIN CAPITAL LETTER V +00057 LATIN CAPITAL LETTER W +00058 LATIN CAPITAL LETTER X +00059 LATIN CAPITAL LETTER Y +0005A LATIN CAPITAL LETTER Z +0005B LEFT SQUARE BRACKET +0005C REVERSE SOLIDUS +0005D RIGHT SQUARE BRACKET +0005E CIRCUMFLEX ACCENT +0005F LOW LINE +00060 GRAVE ACCENT +00061 LATIN SMALL LETTER A +00062 LATIN SMALL LETTER B +00063 LATIN SMALL LETTER C +00064 LATIN SMALL LETTER D +00065 LATIN SMALL LETTER E +00066 LATIN SMALL LETTER F +00067 LATIN SMALL LETTER G +00068 LATIN SMALL LETTER H +00069 LATIN SMALL LETTER I +0006A LATIN SMALL LETTER J +0006B LATIN SMALL LETTER K +0006C LATIN SMALL LETTER L +0006D LATIN SMALL LETTER M +0006E LATIN SMALL LETTER N +0006F LATIN SMALL LETTER O +00070 LATIN SMALL LETTER P +00071 LATIN SMALL LETTER Q +00072 LATIN SMALL LETTER R +00073 LATIN SMALL LETTER S +00074 LATIN SMALL LETTER T +00075 LATIN SMALL LETTER U +00076 LATIN SMALL LETTER V +00077 LATIN SMALL LETTER W +00078 LATIN SMALL LETTER X +00079 LATIN SMALL LETTER Y +0007A LATIN SMALL LETTER Z +0007B LEFT CURLY BRACKET +0007C VERTICAL LINE +0007D RIGHT CURLY BRACKET +0007E TILDE +0007F DELETE +0007F DEL +00080 PADDING CHARACTER +00080 PAD +00081 HIGH OCTET PRESET +00081 HOP +00082 BREAK PERMITTED HERE +00082 BPH +00083 NO BREAK HERE +00083 NBH +00084 INDEX +00084 IND +00085 NEXT LINE +00085 NEXT LINE (NEL) +00085 NEL +00086 START OF SELECTED AREA +00086 SSA +00087 END OF SELECTED AREA +00087 ESA +00088 CHARACTER TABULATION SET +00088 HORIZONTAL TABULATION SET +00088 HTS +00089 CHARACTER TABULATION WITH JUSTIFICATION +00089 HORIZONTAL TABULATION WITH JUSTIFICATION +00089 HTJ +0008A LINE TABULATION SET +0008A VERTICAL TABULATION SET +0008A VTS +0008B PARTIAL LINE FORWARD +0008B PARTIAL LINE DOWN +0008B PLD +0008C PARTIAL LINE BACKWARD +0008C PARTIAL LINE UP +0008C PLU +0008D REVERSE LINE FEED +0008D REVERSE INDEX +0008D RI +0008E SINGLE SHIFT TWO +0008E SINGLE-SHIFT-2 +0008E SS2 +0008F SINGLE SHIFT THREE +0008F SINGLE-SHIFT-3 +0008F SS3 +00090 DEVICE CONTROL STRING +00090 DCS +00091 PRIVATE USE ONE +00091 PRIVATE USE-1 +00091 PU1 +00092 PRIVATE USE TWO +00092 PRIVATE USE-2 +00092 PU2 +00093 SET TRANSMIT STATE +00093 STS +00094 CANCEL CHARACTER +00094 CCH +00095 MESSAGE WAITING +00095 MW +00096 START OF GUARDED AREA +00096 START OF PROTECTED AREA +00096 SPA +00097 END OF GUARDED AREA +00097 END OF PROTECTED AREA +00097 EPA +00098 START OF STRING +00098 SOS +00099 SINGLE GRAPHIC CHARACTER INTRODUCER +00099 SGC +0009A SINGLE CHARACTER INTRODUCER +0009A SCI +0009B CONTROL SEQUENCE INTRODUCER +0009B CSI +0009C STRING TERMINATOR +0009C ST +0009D OPERATING SYSTEM COMMAND +0009D OSC +0009E PRIVACY MESSAGE +0009E PM +0009F APPLICATION PROGRAM COMMAND +0009F APC +000A0 NO-BREAK SPACE +000A0 NBSP +000A1 INVERTED EXCLAMATION MARK +000A2 CENT SIGN +000A3 POUND SIGN +000A4 CURRENCY SIGN +000A5 YEN SIGN +000A6 BROKEN BAR +000A7 SECTION SIGN +000A8 DIAERESIS +000A9 COPYRIGHT SIGN +000AA FEMININE ORDINAL INDICATOR +000AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +000AC NOT SIGN +000AD SOFT HYPHEN +000AD SHY +000AE REGISTERED SIGN +000AF MACRON +000B0 DEGREE SIGN +000B1 PLUS-MINUS SIGN +000B2 SUPERSCRIPT TWO +000B3 SUPERSCRIPT THREE +000B4 ACUTE ACCENT +000B5 MICRO SIGN +000B6 PILCROW SIGN +000B7 MIDDLE DOT +000B8 CEDILLA +000B9 SUPERSCRIPT ONE +000BA MASCULINE ORDINAL INDICATOR +000BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +000BC VULGAR FRACTION ONE QUARTER +000BD VULGAR FRACTION ONE HALF +000BE VULGAR FRACTION THREE QUARTERS +000BF INVERTED QUESTION MARK +000C0 LATIN CAPITAL LETTER A WITH GRAVE +000C1 LATIN CAPITAL LETTER A WITH ACUTE +000C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +000C3 LATIN CAPITAL LETTER A WITH TILDE +000C4 LATIN CAPITAL LETTER A WITH DIAERESIS +000C5 LATIN CAPITAL LETTER A WITH RING ABOVE +000C6 LATIN CAPITAL LETTER AE +000C7 LATIN CAPITAL LETTER C WITH CEDILLA +000C8 LATIN CAPITAL LETTER E WITH GRAVE +000C9 LATIN CAPITAL LETTER E WITH ACUTE +000CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX +000CB LATIN CAPITAL LETTER E WITH DIAERESIS +000CC LATIN CAPITAL LETTER I WITH GRAVE +000CD LATIN CAPITAL LETTER I WITH ACUTE +000CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX +000CF LATIN CAPITAL LETTER I WITH DIAERESIS +000D0 LATIN CAPITAL LETTER ETH +000D1 LATIN CAPITAL LETTER N WITH TILDE +000D2 LATIN CAPITAL LETTER O WITH GRAVE +000D3 LATIN CAPITAL LETTER O WITH ACUTE +000D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +000D5 LATIN CAPITAL LETTER O WITH TILDE +000D6 LATIN CAPITAL LETTER O WITH DIAERESIS +000D7 MULTIPLICATION SIGN +000D8 LATIN CAPITAL LETTER O WITH STROKE +000D9 LATIN CAPITAL LETTER U WITH GRAVE +000DA LATIN CAPITAL LETTER U WITH ACUTE +000DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX +000DC LATIN CAPITAL LETTER U WITH DIAERESIS +000DD LATIN CAPITAL LETTER Y WITH ACUTE +000DE LATIN CAPITAL LETTER THORN +000DF LATIN SMALL LETTER SHARP S +000E0 LATIN SMALL LETTER A WITH GRAVE +000E1 LATIN SMALL LETTER A WITH ACUTE +000E2 LATIN SMALL LETTER A WITH CIRCUMFLEX +000E3 LATIN SMALL LETTER A WITH TILDE +000E4 LATIN SMALL LETTER A WITH DIAERESIS +000E5 LATIN SMALL LETTER A WITH RING ABOVE +000E6 LATIN SMALL LETTER AE +000E7 LATIN SMALL LETTER C WITH CEDILLA +000E8 LATIN SMALL LETTER E WITH GRAVE +000E9 LATIN SMALL LETTER E WITH ACUTE +000EA LATIN SMALL LETTER E WITH CIRCUMFLEX +000EB LATIN SMALL LETTER E WITH DIAERESIS +000EC LATIN SMALL LETTER I WITH GRAVE +000ED LATIN SMALL LETTER I WITH ACUTE +000EE LATIN SMALL LETTER I WITH CIRCUMFLEX +000EF LATIN SMALL LETTER I WITH DIAERESIS +000F0 LATIN SMALL LETTER ETH +000F1 LATIN SMALL LETTER N WITH TILDE +000F2 LATIN SMALL LETTER O WITH GRAVE +000F3 LATIN SMALL LETTER O WITH ACUTE +000F4 LATIN SMALL LETTER O WITH CIRCUMFLEX +000F5 LATIN SMALL LETTER O WITH TILDE +000F6 LATIN SMALL LETTER O WITH DIAERESIS +000F7 DIVISION SIGN +000F8 LATIN SMALL LETTER O WITH STROKE +000F9 LATIN SMALL LETTER U WITH GRAVE +000FA LATIN SMALL LETTER U WITH ACUTE +000FB LATIN SMALL LETTER U WITH CIRCUMFLEX +000FC LATIN SMALL LETTER U WITH DIAERESIS +000FD LATIN SMALL LETTER Y WITH ACUTE +000FE LATIN SMALL LETTER THORN +000FF LATIN SMALL LETTER Y WITH DIAERESIS +00100 LATIN CAPITAL LETTER A WITH MACRON +00101 LATIN SMALL LETTER A WITH MACRON +00102 LATIN CAPITAL LETTER A WITH BREVE +00103 LATIN SMALL LETTER A WITH BREVE +00104 LATIN CAPITAL LETTER A WITH OGONEK +00105 LATIN SMALL LETTER A WITH OGONEK +00106 LATIN CAPITAL LETTER C WITH ACUTE +00107 LATIN SMALL LETTER C WITH ACUTE +00108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +00109 LATIN SMALL LETTER C WITH CIRCUMFLEX +0010A LATIN CAPITAL LETTER C WITH DOT ABOVE +0010B LATIN SMALL LETTER C WITH DOT ABOVE +0010C LATIN CAPITAL LETTER C WITH CARON +0010D LATIN SMALL LETTER C WITH CARON +0010E LATIN CAPITAL LETTER D WITH CARON +0010F LATIN SMALL LETTER D WITH CARON +00110 LATIN CAPITAL LETTER D WITH STROKE +00111 LATIN SMALL LETTER D WITH STROKE +00112 LATIN CAPITAL LETTER E WITH MACRON +00113 LATIN SMALL LETTER E WITH MACRON +00114 LATIN CAPITAL LETTER E WITH BREVE +00115 LATIN SMALL LETTER E WITH BREVE +00116 LATIN CAPITAL LETTER E WITH DOT ABOVE +00117 LATIN SMALL LETTER E WITH DOT ABOVE +00118 LATIN CAPITAL LETTER E WITH OGONEK +00119 LATIN SMALL LETTER E WITH OGONEK +0011A LATIN CAPITAL LETTER E WITH CARON +0011B LATIN SMALL LETTER E WITH CARON +0011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX +0011D LATIN SMALL LETTER G WITH CIRCUMFLEX +0011E LATIN CAPITAL LETTER G WITH BREVE +0011F LATIN SMALL LETTER G WITH BREVE +00120 LATIN CAPITAL LETTER G WITH DOT ABOVE +00121 LATIN SMALL LETTER G WITH DOT ABOVE +00122 LATIN CAPITAL LETTER G WITH CEDILLA +00123 LATIN SMALL LETTER G WITH CEDILLA +00124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +00125 LATIN SMALL LETTER H WITH CIRCUMFLEX +00126 LATIN CAPITAL LETTER H WITH STROKE +00127 LATIN SMALL LETTER H WITH STROKE +00128 LATIN CAPITAL LETTER I WITH TILDE +00129 LATIN SMALL LETTER I WITH TILDE +0012A LATIN CAPITAL LETTER I WITH MACRON +0012B LATIN SMALL LETTER I WITH MACRON +0012C LATIN CAPITAL LETTER I WITH BREVE +0012D LATIN SMALL LETTER I WITH BREVE +0012E LATIN CAPITAL LETTER I WITH OGONEK +0012F LATIN SMALL LETTER I WITH OGONEK +00130 LATIN CAPITAL LETTER I WITH DOT ABOVE +00131 LATIN SMALL LETTER DOTLESS I +00132 LATIN CAPITAL LIGATURE IJ +00133 LATIN SMALL LIGATURE IJ +00134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +00135 LATIN SMALL LETTER J WITH CIRCUMFLEX +00136 LATIN CAPITAL LETTER K WITH CEDILLA +00137 LATIN SMALL LETTER K WITH CEDILLA +00138 LATIN SMALL LETTER KRA +00139 LATIN CAPITAL LETTER L WITH ACUTE +0013A LATIN SMALL LETTER L WITH ACUTE +0013B LATIN CAPITAL LETTER L WITH CEDILLA +0013C LATIN SMALL LETTER L WITH CEDILLA +0013D LATIN CAPITAL LETTER L WITH CARON +0013E LATIN SMALL LETTER L WITH CARON +0013F LATIN CAPITAL LETTER L WITH MIDDLE DOT +00140 LATIN SMALL LETTER L WITH MIDDLE DOT +00141 LATIN CAPITAL LETTER L WITH STROKE +00142 LATIN SMALL LETTER L WITH STROKE +00143 LATIN CAPITAL LETTER N WITH ACUTE +00144 LATIN SMALL LETTER N WITH ACUTE +00145 LATIN CAPITAL LETTER N WITH CEDILLA +00146 LATIN SMALL LETTER N WITH CEDILLA +00147 LATIN CAPITAL LETTER N WITH CARON +00148 LATIN SMALL LETTER N WITH CARON +00149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0014A LATIN CAPITAL LETTER ENG +0014B LATIN SMALL LETTER ENG +0014C LATIN CAPITAL LETTER O WITH MACRON +0014D LATIN SMALL LETTER O WITH MACRON +0014E LATIN CAPITAL LETTER O WITH BREVE +0014F LATIN SMALL LETTER O WITH BREVE +00150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +00151 LATIN SMALL LETTER O WITH DOUBLE ACUTE +00152 LATIN CAPITAL LIGATURE OE +00153 LATIN SMALL LIGATURE OE +00154 LATIN CAPITAL LETTER R WITH ACUTE +00155 LATIN SMALL LETTER R WITH ACUTE +00156 LATIN CAPITAL LETTER R WITH CEDILLA +00157 LATIN SMALL LETTER R WITH CEDILLA +00158 LATIN CAPITAL LETTER R WITH CARON +00159 LATIN SMALL LETTER R WITH CARON +0015A LATIN CAPITAL LETTER S WITH ACUTE +0015B LATIN SMALL LETTER S WITH ACUTE +0015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX +0015D LATIN SMALL LETTER S WITH CIRCUMFLEX +0015E LATIN CAPITAL LETTER S WITH CEDILLA +0015F LATIN SMALL LETTER S WITH CEDILLA +00160 LATIN CAPITAL LETTER S WITH CARON +00161 LATIN SMALL LETTER S WITH CARON +00162 LATIN CAPITAL LETTER T WITH CEDILLA +00163 LATIN SMALL LETTER T WITH CEDILLA +00164 LATIN CAPITAL LETTER T WITH CARON +00165 LATIN SMALL LETTER T WITH CARON +00166 LATIN CAPITAL LETTER T WITH STROKE +00167 LATIN SMALL LETTER T WITH STROKE +00168 LATIN CAPITAL LETTER U WITH TILDE +00169 LATIN SMALL LETTER U WITH TILDE +0016A LATIN CAPITAL LETTER U WITH MACRON +0016B LATIN SMALL LETTER U WITH MACRON +0016C LATIN CAPITAL LETTER U WITH BREVE +0016D LATIN SMALL LETTER U WITH BREVE +0016E LATIN CAPITAL LETTER U WITH RING ABOVE +0016F LATIN SMALL LETTER U WITH RING ABOVE +00170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +00171 LATIN SMALL LETTER U WITH DOUBLE ACUTE +00172 LATIN CAPITAL LETTER U WITH OGONEK +00173 LATIN SMALL LETTER U WITH OGONEK +00174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX +00175 LATIN SMALL LETTER W WITH CIRCUMFLEX +00176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +00177 LATIN SMALL LETTER Y WITH CIRCUMFLEX +00178 LATIN CAPITAL LETTER Y WITH DIAERESIS +00179 LATIN CAPITAL LETTER Z WITH ACUTE +0017A LATIN SMALL LETTER Z WITH ACUTE +0017B LATIN CAPITAL LETTER Z WITH DOT ABOVE +0017C LATIN SMALL LETTER Z WITH DOT ABOVE +0017D LATIN CAPITAL LETTER Z WITH CARON +0017E LATIN SMALL LETTER Z WITH CARON +0017F LATIN SMALL LETTER LONG S +00180 LATIN SMALL LETTER B WITH STROKE +00181 LATIN CAPITAL LETTER B WITH HOOK +00182 LATIN CAPITAL LETTER B WITH TOPBAR +00183 LATIN SMALL LETTER B WITH TOPBAR +00184 LATIN CAPITAL LETTER TONE SIX +00185 LATIN SMALL LETTER TONE SIX +00186 LATIN CAPITAL LETTER OPEN O +00187 LATIN CAPITAL LETTER C WITH HOOK +00188 LATIN SMALL LETTER C WITH HOOK +00189 LATIN CAPITAL LETTER AFRICAN D +0018A LATIN CAPITAL LETTER D WITH HOOK +0018B LATIN CAPITAL LETTER D WITH TOPBAR +0018C LATIN SMALL LETTER D WITH TOPBAR +0018D LATIN SMALL LETTER TURNED DELTA +0018E LATIN CAPITAL LETTER REVERSED E +0018F LATIN CAPITAL LETTER SCHWA +00190 LATIN CAPITAL LETTER OPEN E +00191 LATIN CAPITAL LETTER F WITH HOOK +00192 LATIN SMALL LETTER F WITH HOOK +00193 LATIN CAPITAL LETTER G WITH HOOK +00194 LATIN CAPITAL LETTER GAMMA +00195 LATIN SMALL LETTER HV +00196 LATIN CAPITAL LETTER IOTA +00197 LATIN CAPITAL LETTER I WITH STROKE +00198 LATIN CAPITAL LETTER K WITH HOOK +00199 LATIN SMALL LETTER K WITH HOOK +0019A LATIN SMALL LETTER L WITH BAR +0019B LATIN SMALL LETTER LAMBDA WITH STROKE +0019C LATIN CAPITAL LETTER TURNED M +0019D LATIN CAPITAL LETTER N WITH LEFT HOOK +0019E LATIN SMALL LETTER N WITH LONG RIGHT LEG +0019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE +001A0 LATIN CAPITAL LETTER O WITH HORN +001A1 LATIN SMALL LETTER O WITH HORN +001A2 LATIN CAPITAL LETTER GHA +001A2 LATIN CAPITAL LETTER OI +001A3 LATIN SMALL LETTER GHA +001A3 LATIN SMALL LETTER OI +001A4 LATIN CAPITAL LETTER P WITH HOOK +001A5 LATIN SMALL LETTER P WITH HOOK +001A6 LATIN LETTER YR +001A7 LATIN CAPITAL LETTER TONE TWO +001A8 LATIN SMALL LETTER TONE TWO +001A9 LATIN CAPITAL LETTER ESH +001AA LATIN LETTER REVERSED ESH LOOP +001AB LATIN SMALL LETTER T WITH PALATAL HOOK +001AC LATIN CAPITAL LETTER T WITH HOOK +001AD LATIN SMALL LETTER T WITH HOOK +001AE LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +001AF LATIN CAPITAL LETTER U WITH HORN +001B0 LATIN SMALL LETTER U WITH HORN +001B1 LATIN CAPITAL LETTER UPSILON +001B2 LATIN CAPITAL LETTER V WITH HOOK +001B3 LATIN CAPITAL LETTER Y WITH HOOK +001B4 LATIN SMALL LETTER Y WITH HOOK +001B5 LATIN CAPITAL LETTER Z WITH STROKE +001B6 LATIN SMALL LETTER Z WITH STROKE +001B7 LATIN CAPITAL LETTER EZH +001B8 LATIN CAPITAL LETTER EZH REVERSED +001B9 LATIN SMALL LETTER EZH REVERSED +001BA LATIN SMALL LETTER EZH WITH TAIL +001BB LATIN LETTER TWO WITH STROKE +001BC LATIN CAPITAL LETTER TONE FIVE +001BD LATIN SMALL LETTER TONE FIVE +001BE LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE +001BF LATIN LETTER WYNN +001C0 LATIN LETTER DENTAL CLICK +001C1 LATIN LETTER LATERAL CLICK +001C2 LATIN LETTER ALVEOLAR CLICK +001C3 LATIN LETTER RETROFLEX CLICK +001C4 LATIN CAPITAL LETTER DZ WITH CARON +001C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +001C6 LATIN SMALL LETTER DZ WITH CARON +001C7 LATIN CAPITAL LETTER LJ +001C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J +001C9 LATIN SMALL LETTER LJ +001CA LATIN CAPITAL LETTER NJ +001CB LATIN CAPITAL LETTER N WITH SMALL LETTER J +001CC LATIN SMALL LETTER NJ +001CD LATIN CAPITAL LETTER A WITH CARON +001CE LATIN SMALL LETTER A WITH CARON +001CF LATIN CAPITAL LETTER I WITH CARON +001D0 LATIN SMALL LETTER I WITH CARON +001D1 LATIN CAPITAL LETTER O WITH CARON +001D2 LATIN SMALL LETTER O WITH CARON +001D3 LATIN CAPITAL LETTER U WITH CARON +001D4 LATIN SMALL LETTER U WITH CARON +001D5 LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +001D6 LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +001D7 LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +001D8 LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +001D9 LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +001DA LATIN SMALL LETTER U WITH DIAERESIS AND CARON +001DB LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +001DC LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +001DD LATIN SMALL LETTER TURNED E +001DE LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +001DF LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +001E0 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +001E1 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +001E2 LATIN CAPITAL LETTER AE WITH MACRON +001E3 LATIN SMALL LETTER AE WITH MACRON +001E4 LATIN CAPITAL LETTER G WITH STROKE +001E5 LATIN SMALL LETTER G WITH STROKE +001E6 LATIN CAPITAL LETTER G WITH CARON +001E7 LATIN SMALL LETTER G WITH CARON +001E8 LATIN CAPITAL LETTER K WITH CARON +001E9 LATIN SMALL LETTER K WITH CARON +001EA LATIN CAPITAL LETTER O WITH OGONEK +001EB LATIN SMALL LETTER O WITH OGONEK +001EC LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +001ED LATIN SMALL LETTER O WITH OGONEK AND MACRON +001EE LATIN CAPITAL LETTER EZH WITH CARON +001EF LATIN SMALL LETTER EZH WITH CARON +001F0 LATIN SMALL LETTER J WITH CARON +001F1 LATIN CAPITAL LETTER DZ +001F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z +001F3 LATIN SMALL LETTER DZ +001F4 LATIN CAPITAL LETTER G WITH ACUTE +001F5 LATIN SMALL LETTER G WITH ACUTE +001F6 LATIN CAPITAL LETTER HWAIR +001F7 LATIN CAPITAL LETTER WYNN +001F8 LATIN CAPITAL LETTER N WITH GRAVE +001F9 LATIN SMALL LETTER N WITH GRAVE +001FA LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +001FB LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +001FC LATIN CAPITAL LETTER AE WITH ACUTE +001FD LATIN SMALL LETTER AE WITH ACUTE +001FE LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +001FF LATIN SMALL LETTER O WITH STROKE AND ACUTE +00200 LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +00201 LATIN SMALL LETTER A WITH DOUBLE GRAVE +00202 LATIN CAPITAL LETTER A WITH INVERTED BREVE +00203 LATIN SMALL LETTER A WITH INVERTED BREVE +00204 LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +00205 LATIN SMALL LETTER E WITH DOUBLE GRAVE +00206 LATIN CAPITAL LETTER E WITH INVERTED BREVE +00207 LATIN SMALL LETTER E WITH INVERTED BREVE +00208 LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +00209 LATIN SMALL LETTER I WITH DOUBLE GRAVE +0020A LATIN CAPITAL LETTER I WITH INVERTED BREVE +0020B LATIN SMALL LETTER I WITH INVERTED BREVE +0020C LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +0020D LATIN SMALL LETTER O WITH DOUBLE GRAVE +0020E LATIN CAPITAL LETTER O WITH INVERTED BREVE +0020F LATIN SMALL LETTER O WITH INVERTED BREVE +00210 LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +00211 LATIN SMALL LETTER R WITH DOUBLE GRAVE +00212 LATIN CAPITAL LETTER R WITH INVERTED BREVE +00213 LATIN SMALL LETTER R WITH INVERTED BREVE +00214 LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +00215 LATIN SMALL LETTER U WITH DOUBLE GRAVE +00216 LATIN CAPITAL LETTER U WITH INVERTED BREVE +00217 LATIN SMALL LETTER U WITH INVERTED BREVE +00218 LATIN CAPITAL LETTER S WITH COMMA BELOW +00219 LATIN SMALL LETTER S WITH COMMA BELOW +0021A LATIN CAPITAL LETTER T WITH COMMA BELOW +0021B LATIN SMALL LETTER T WITH COMMA BELOW +0021C LATIN CAPITAL LETTER YOGH +0021D LATIN SMALL LETTER YOGH +0021E LATIN CAPITAL LETTER H WITH CARON +0021F LATIN SMALL LETTER H WITH CARON +00220 LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +00221 LATIN SMALL LETTER D WITH CURL +00222 LATIN CAPITAL LETTER OU +00223 LATIN SMALL LETTER OU +00224 LATIN CAPITAL LETTER Z WITH HOOK +00225 LATIN SMALL LETTER Z WITH HOOK +00226 LATIN CAPITAL LETTER A WITH DOT ABOVE +00227 LATIN SMALL LETTER A WITH DOT ABOVE +00228 LATIN CAPITAL LETTER E WITH CEDILLA +00229 LATIN SMALL LETTER E WITH CEDILLA +0022A LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +0022B LATIN SMALL LETTER O WITH DIAERESIS AND MACRON +0022C LATIN CAPITAL LETTER O WITH TILDE AND MACRON +0022D LATIN SMALL LETTER O WITH TILDE AND MACRON +0022E LATIN CAPITAL LETTER O WITH DOT ABOVE +0022F LATIN SMALL LETTER O WITH DOT ABOVE +00230 LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +00231 LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON +00232 LATIN CAPITAL LETTER Y WITH MACRON +00233 LATIN SMALL LETTER Y WITH MACRON +00234 LATIN SMALL LETTER L WITH CURL +00235 LATIN SMALL LETTER N WITH CURL +00236 LATIN SMALL LETTER T WITH CURL +00237 LATIN SMALL LETTER DOTLESS J +00238 LATIN SMALL LETTER DB DIGRAPH +00239 LATIN SMALL LETTER QP DIGRAPH +0023A LATIN CAPITAL LETTER A WITH STROKE +0023B LATIN CAPITAL LETTER C WITH STROKE +0023C LATIN SMALL LETTER C WITH STROKE +0023D LATIN CAPITAL LETTER L WITH BAR +0023E LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0023F LATIN SMALL LETTER S WITH SWASH TAIL +00240 LATIN SMALL LETTER Z WITH SWASH TAIL +00241 LATIN CAPITAL LETTER GLOTTAL STOP +00242 LATIN SMALL LETTER GLOTTAL STOP +00243 LATIN CAPITAL LETTER B WITH STROKE +00244 LATIN CAPITAL LETTER U BAR +00245 LATIN CAPITAL LETTER TURNED V +00246 LATIN CAPITAL LETTER E WITH STROKE +00247 LATIN SMALL LETTER E WITH STROKE +00248 LATIN CAPITAL LETTER J WITH STROKE +00249 LATIN SMALL LETTER J WITH STROKE +0024A LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +0024B LATIN SMALL LETTER Q WITH HOOK TAIL +0024C LATIN CAPITAL LETTER R WITH STROKE +0024D LATIN SMALL LETTER R WITH STROKE +0024E LATIN CAPITAL LETTER Y WITH STROKE +0024F LATIN SMALL LETTER Y WITH STROKE +00250 LATIN SMALL LETTER TURNED A +00251 LATIN SMALL LETTER ALPHA +00252 LATIN SMALL LETTER TURNED ALPHA +00253 LATIN SMALL LETTER B WITH HOOK +00254 LATIN SMALL LETTER OPEN O +00255 LATIN SMALL LETTER C WITH CURL +00256 LATIN SMALL LETTER D WITH TAIL +00257 LATIN SMALL LETTER D WITH HOOK +00258 LATIN SMALL LETTER REVERSED E +00259 LATIN SMALL LETTER SCHWA +0025A LATIN SMALL LETTER SCHWA WITH HOOK +0025B LATIN SMALL LETTER OPEN E +0025C LATIN SMALL LETTER REVERSED OPEN E +0025D LATIN SMALL LETTER REVERSED OPEN E WITH HOOK +0025E LATIN SMALL LETTER CLOSED REVERSED OPEN E +0025F LATIN SMALL LETTER DOTLESS J WITH STROKE +00260 LATIN SMALL LETTER G WITH HOOK +00261 LATIN SMALL LETTER SCRIPT G +00262 LATIN LETTER SMALL CAPITAL G +00263 LATIN SMALL LETTER GAMMA +00264 LATIN SMALL LETTER RAMS HORN +00265 LATIN SMALL LETTER TURNED H +00266 LATIN SMALL LETTER H WITH HOOK +00267 LATIN SMALL LETTER HENG WITH HOOK +00268 LATIN SMALL LETTER I WITH STROKE +00269 LATIN SMALL LETTER IOTA +0026A LATIN LETTER SMALL CAPITAL I +0026B LATIN SMALL LETTER L WITH MIDDLE TILDE +0026C LATIN SMALL LETTER L WITH BELT +0026D LATIN SMALL LETTER L WITH RETROFLEX HOOK +0026E LATIN SMALL LETTER LEZH +0026F LATIN SMALL LETTER TURNED M +00270 LATIN SMALL LETTER TURNED M WITH LONG LEG +00271 LATIN SMALL LETTER M WITH HOOK +00272 LATIN SMALL LETTER N WITH LEFT HOOK +00273 LATIN SMALL LETTER N WITH RETROFLEX HOOK +00274 LATIN LETTER SMALL CAPITAL N +00275 LATIN SMALL LETTER BARRED O +00276 LATIN LETTER SMALL CAPITAL OE +00277 LATIN SMALL LETTER CLOSED OMEGA +00278 LATIN SMALL LETTER PHI +00279 LATIN SMALL LETTER TURNED R +0027A LATIN SMALL LETTER TURNED R WITH LONG LEG +0027B LATIN SMALL LETTER TURNED R WITH HOOK +0027C LATIN SMALL LETTER R WITH LONG LEG +0027D LATIN SMALL LETTER R WITH TAIL +0027E LATIN SMALL LETTER R WITH FISHHOOK +0027F LATIN SMALL LETTER REVERSED R WITH FISHHOOK +00280 LATIN LETTER SMALL CAPITAL R +00281 LATIN LETTER SMALL CAPITAL INVERTED R +00282 LATIN SMALL LETTER S WITH HOOK +00283 LATIN SMALL LETTER ESH +00284 LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK +00285 LATIN SMALL LETTER SQUAT REVERSED ESH +00286 LATIN SMALL LETTER ESH WITH CURL +00287 LATIN SMALL LETTER TURNED T +00288 LATIN SMALL LETTER T WITH RETROFLEX HOOK +00289 LATIN SMALL LETTER U BAR +0028A LATIN SMALL LETTER UPSILON +0028B LATIN SMALL LETTER V WITH HOOK +0028C LATIN SMALL LETTER TURNED V +0028D LATIN SMALL LETTER TURNED W +0028E LATIN SMALL LETTER TURNED Y +0028F LATIN LETTER SMALL CAPITAL Y +00290 LATIN SMALL LETTER Z WITH RETROFLEX HOOK +00291 LATIN SMALL LETTER Z WITH CURL +00292 LATIN SMALL LETTER EZH +00293 LATIN SMALL LETTER EZH WITH CURL +00294 LATIN LETTER GLOTTAL STOP +00295 LATIN LETTER PHARYNGEAL VOICED FRICATIVE +00296 LATIN LETTER INVERTED GLOTTAL STOP +00297 LATIN LETTER STRETCHED C +00298 LATIN LETTER BILABIAL CLICK +00299 LATIN LETTER SMALL CAPITAL B +0029A LATIN SMALL LETTER CLOSED OPEN E +0029B LATIN LETTER SMALL CAPITAL G WITH HOOK +0029C LATIN LETTER SMALL CAPITAL H +0029D LATIN SMALL LETTER J WITH CROSSED-TAIL +0029E LATIN SMALL LETTER TURNED K +0029F LATIN LETTER SMALL CAPITAL L +002A0 LATIN SMALL LETTER Q WITH HOOK +002A1 LATIN LETTER GLOTTAL STOP WITH STROKE +002A2 LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE +002A3 LATIN SMALL LETTER DZ DIGRAPH +002A4 LATIN SMALL LETTER DEZH DIGRAPH +002A5 LATIN SMALL LETTER DZ DIGRAPH WITH CURL +002A6 LATIN SMALL LETTER TS DIGRAPH +002A7 LATIN SMALL LETTER TESH DIGRAPH +002A8 LATIN SMALL LETTER TC DIGRAPH WITH CURL +002A9 LATIN SMALL LETTER FENG DIGRAPH +002AA LATIN SMALL LETTER LS DIGRAPH +002AB LATIN SMALL LETTER LZ DIGRAPH +002AC LATIN LETTER BILABIAL PERCUSSIVE +002AD LATIN LETTER BIDENTAL PERCUSSIVE +002AE LATIN SMALL LETTER TURNED H WITH FISHHOOK +002AF LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +002B0 MODIFIER LETTER SMALL H +002B1 MODIFIER LETTER SMALL H WITH HOOK +002B2 MODIFIER LETTER SMALL J +002B3 MODIFIER LETTER SMALL R +002B4 MODIFIER LETTER SMALL TURNED R +002B5 MODIFIER LETTER SMALL TURNED R WITH HOOK +002B6 MODIFIER LETTER SMALL CAPITAL INVERTED R +002B7 MODIFIER LETTER SMALL W +002B8 MODIFIER LETTER SMALL Y +002B9 MODIFIER LETTER PRIME +002BA MODIFIER LETTER DOUBLE PRIME +002BB MODIFIER LETTER TURNED COMMA +002BC MODIFIER LETTER APOSTROPHE +002BD MODIFIER LETTER REVERSED COMMA +002BE MODIFIER LETTER RIGHT HALF RING +002BF MODIFIER LETTER LEFT HALF RING +002C0 MODIFIER LETTER GLOTTAL STOP +002C1 MODIFIER LETTER REVERSED GLOTTAL STOP +002C2 MODIFIER LETTER LEFT ARROWHEAD +002C3 MODIFIER LETTER RIGHT ARROWHEAD +002C4 MODIFIER LETTER UP ARROWHEAD +002C5 MODIFIER LETTER DOWN ARROWHEAD +002C6 MODIFIER LETTER CIRCUMFLEX ACCENT +002C7 CARON +002C8 MODIFIER LETTER VERTICAL LINE +002C9 MODIFIER LETTER MACRON +002CA MODIFIER LETTER ACUTE ACCENT +002CB MODIFIER LETTER GRAVE ACCENT +002CC MODIFIER LETTER LOW VERTICAL LINE +002CD MODIFIER LETTER LOW MACRON +002CE MODIFIER LETTER LOW GRAVE ACCENT +002CF MODIFIER LETTER LOW ACUTE ACCENT +002D0 MODIFIER LETTER TRIANGULAR COLON +002D1 MODIFIER LETTER HALF TRIANGULAR COLON +002D2 MODIFIER LETTER CENTRED RIGHT HALF RING +002D3 MODIFIER LETTER CENTRED LEFT HALF RING +002D4 MODIFIER LETTER UP TACK +002D5 MODIFIER LETTER DOWN TACK +002D6 MODIFIER LETTER PLUS SIGN +002D7 MODIFIER LETTER MINUS SIGN +002D8 BREVE +002D9 DOT ABOVE +002DA RING ABOVE +002DB OGONEK +002DC SMALL TILDE +002DD DOUBLE ACUTE ACCENT +002DE MODIFIER LETTER RHOTIC HOOK +002DF MODIFIER LETTER CROSS ACCENT +002E0 MODIFIER LETTER SMALL GAMMA +002E1 MODIFIER LETTER SMALL L +002E2 MODIFIER LETTER SMALL S +002E3 MODIFIER LETTER SMALL X +002E4 MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +002E5 MODIFIER LETTER EXTRA-HIGH TONE BAR +002E6 MODIFIER LETTER HIGH TONE BAR +002E7 MODIFIER LETTER MID TONE BAR +002E8 MODIFIER LETTER LOW TONE BAR +002E9 MODIFIER LETTER EXTRA-LOW TONE BAR +002EA MODIFIER LETTER YIN DEPARTING TONE MARK +002EB MODIFIER LETTER YANG DEPARTING TONE MARK +002EC MODIFIER LETTER VOICING +002ED MODIFIER LETTER UNASPIRATED +002EE MODIFIER LETTER DOUBLE APOSTROPHE +002EF MODIFIER LETTER LOW DOWN ARROWHEAD +002F0 MODIFIER LETTER LOW UP ARROWHEAD +002F1 MODIFIER LETTER LOW LEFT ARROWHEAD +002F2 MODIFIER LETTER LOW RIGHT ARROWHEAD +002F3 MODIFIER LETTER LOW RING +002F4 MODIFIER LETTER MIDDLE GRAVE ACCENT +002F5 MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT +002F6 MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT +002F7 MODIFIER LETTER LOW TILDE +002F8 MODIFIER LETTER RAISED COLON +002F9 MODIFIER LETTER BEGIN HIGH TONE +002FA MODIFIER LETTER END HIGH TONE +002FB MODIFIER LETTER BEGIN LOW TONE +002FC MODIFIER LETTER END LOW TONE +002FD MODIFIER LETTER SHELF +002FE MODIFIER LETTER OPEN SHELF +002FF MODIFIER LETTER LOW LEFT ARROW +00300 COMBINING GRAVE ACCENT +00301 COMBINING ACUTE ACCENT +00302 COMBINING CIRCUMFLEX ACCENT +00303 COMBINING TILDE +00304 COMBINING MACRON +00305 COMBINING OVERLINE +00306 COMBINING BREVE +00307 COMBINING DOT ABOVE +00308 COMBINING DIAERESIS +00309 COMBINING HOOK ABOVE +0030A COMBINING RING ABOVE +0030B COMBINING DOUBLE ACUTE ACCENT +0030C COMBINING CARON +0030D COMBINING VERTICAL LINE ABOVE +0030E COMBINING DOUBLE VERTICAL LINE ABOVE +0030F COMBINING DOUBLE GRAVE ACCENT +00310 COMBINING CANDRABINDU +00311 COMBINING INVERTED BREVE +00312 COMBINING TURNED COMMA ABOVE +00313 COMBINING COMMA ABOVE +00314 COMBINING REVERSED COMMA ABOVE +00315 COMBINING COMMA ABOVE RIGHT +00316 COMBINING GRAVE ACCENT BELOW +00317 COMBINING ACUTE ACCENT BELOW +00318 COMBINING LEFT TACK BELOW +00319 COMBINING RIGHT TACK BELOW +0031A COMBINING LEFT ANGLE ABOVE +0031B COMBINING HORN +0031C COMBINING LEFT HALF RING BELOW +0031D COMBINING UP TACK BELOW +0031E COMBINING DOWN TACK BELOW +0031F COMBINING PLUS SIGN BELOW +00320 COMBINING MINUS SIGN BELOW +00321 COMBINING PALATALIZED HOOK BELOW +00322 COMBINING RETROFLEX HOOK BELOW +00323 COMBINING DOT BELOW +00324 COMBINING DIAERESIS BELOW +00325 COMBINING RING BELOW +00326 COMBINING COMMA BELOW +00327 COMBINING CEDILLA +00328 COMBINING OGONEK +00329 COMBINING VERTICAL LINE BELOW +0032A COMBINING BRIDGE BELOW +0032B COMBINING INVERTED DOUBLE ARCH BELOW +0032C COMBINING CARON BELOW +0032D COMBINING CIRCUMFLEX ACCENT BELOW +0032E COMBINING BREVE BELOW +0032F COMBINING INVERTED BREVE BELOW +00330 COMBINING TILDE BELOW +00331 COMBINING MACRON BELOW +00332 COMBINING LOW LINE +00333 COMBINING DOUBLE LOW LINE +00334 COMBINING TILDE OVERLAY +00335 COMBINING SHORT STROKE OVERLAY +00336 COMBINING LONG STROKE OVERLAY +00337 COMBINING SHORT SOLIDUS OVERLAY +00338 COMBINING LONG SOLIDUS OVERLAY +00339 COMBINING RIGHT HALF RING BELOW +0033A COMBINING INVERTED BRIDGE BELOW +0033B COMBINING SQUARE BELOW +0033C COMBINING SEAGULL BELOW +0033D COMBINING X ABOVE +0033E COMBINING VERTICAL TILDE +0033F COMBINING DOUBLE OVERLINE +00340 COMBINING GRAVE TONE MARK +00341 COMBINING ACUTE TONE MARK +00342 COMBINING GREEK PERISPOMENI +00343 COMBINING GREEK KORONIS +00344 COMBINING GREEK DIALYTIKA TONOS +00345 COMBINING GREEK YPOGEGRAMMENI +00346 COMBINING BRIDGE ABOVE +00347 COMBINING EQUALS SIGN BELOW +00348 COMBINING DOUBLE VERTICAL LINE BELOW +00349 COMBINING LEFT ANGLE BELOW +0034A COMBINING NOT TILDE ABOVE +0034B COMBINING HOMOTHETIC ABOVE +0034C COMBINING ALMOST EQUAL TO ABOVE +0034D COMBINING LEFT RIGHT ARROW BELOW +0034E COMBINING UPWARDS ARROW BELOW +0034F COMBINING GRAPHEME JOINER +0034F CGJ +00350 COMBINING RIGHT ARROWHEAD ABOVE +00351 COMBINING LEFT HALF RING ABOVE +00352 COMBINING FERMATA +00353 COMBINING X BELOW +00354 COMBINING LEFT ARROWHEAD BELOW +00355 COMBINING RIGHT ARROWHEAD BELOW +00356 COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW +00357 COMBINING RIGHT HALF RING ABOVE +00358 COMBINING DOT ABOVE RIGHT +00359 COMBINING ASTERISK BELOW +0035A COMBINING DOUBLE RING BELOW +0035B COMBINING ZIGZAG ABOVE +0035C COMBINING DOUBLE BREVE BELOW +0035D COMBINING DOUBLE BREVE +0035E COMBINING DOUBLE MACRON +0035F COMBINING DOUBLE MACRON BELOW +00360 COMBINING DOUBLE TILDE +00361 COMBINING DOUBLE INVERTED BREVE +00362 COMBINING DOUBLE RIGHTWARDS ARROW BELOW +00363 COMBINING LATIN SMALL LETTER A +00364 COMBINING LATIN SMALL LETTER E +00365 COMBINING LATIN SMALL LETTER I +00366 COMBINING LATIN SMALL LETTER O +00367 COMBINING LATIN SMALL LETTER U +00368 COMBINING LATIN SMALL LETTER C +00369 COMBINING LATIN SMALL LETTER D +0036A COMBINING LATIN SMALL LETTER H +0036B COMBINING LATIN SMALL LETTER M +0036C COMBINING LATIN SMALL LETTER R +0036D COMBINING LATIN SMALL LETTER T +0036E COMBINING LATIN SMALL LETTER V +0036F COMBINING LATIN SMALL LETTER X +00370 GREEK CAPITAL LETTER HETA +00371 GREEK SMALL LETTER HETA +00372 GREEK CAPITAL LETTER ARCHAIC SAMPI +00373 GREEK SMALL LETTER ARCHAIC SAMPI +00374 GREEK NUMERAL SIGN +00375 GREEK LOWER NUMERAL SIGN +00376 GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +00377 GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +0037A GREEK YPOGEGRAMMENI +0037B GREEK SMALL REVERSED LUNATE SIGMA SYMBOL +0037C GREEK SMALL DOTTED LUNATE SIGMA SYMBOL +0037D GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +0037E GREEK QUESTION MARK +0037F GREEK CAPITAL LETTER YOT +00384 GREEK TONOS +00385 GREEK DIALYTIKA TONOS +00386 GREEK CAPITAL LETTER ALPHA WITH TONOS +00387 GREEK ANO TELEIA +00388 GREEK CAPITAL LETTER EPSILON WITH TONOS +00389 GREEK CAPITAL LETTER ETA WITH TONOS +0038A GREEK CAPITAL LETTER IOTA WITH TONOS +0038C GREEK CAPITAL LETTER OMICRON WITH TONOS +0038E GREEK CAPITAL LETTER UPSILON WITH TONOS +0038F GREEK CAPITAL LETTER OMEGA WITH TONOS +00390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +00391 GREEK CAPITAL LETTER ALPHA +00392 GREEK CAPITAL LETTER BETA +00393 GREEK CAPITAL LETTER GAMMA +00394 GREEK CAPITAL LETTER DELTA +00395 GREEK CAPITAL LETTER EPSILON +00396 GREEK CAPITAL LETTER ZETA +00397 GREEK CAPITAL LETTER ETA +00398 GREEK CAPITAL LETTER THETA +00399 GREEK CAPITAL LETTER IOTA +0039A GREEK CAPITAL LETTER KAPPA +0039B GREEK CAPITAL LETTER LAMDA +0039C GREEK CAPITAL LETTER MU +0039D GREEK CAPITAL LETTER NU +0039E GREEK CAPITAL LETTER XI +0039F GREEK CAPITAL LETTER OMICRON +003A0 GREEK CAPITAL LETTER PI +003A1 GREEK CAPITAL LETTER RHO +003A3 GREEK CAPITAL LETTER SIGMA +003A4 GREEK CAPITAL LETTER TAU +003A5 GREEK CAPITAL LETTER UPSILON +003A6 GREEK CAPITAL LETTER PHI +003A7 GREEK CAPITAL LETTER CHI +003A8 GREEK CAPITAL LETTER PSI +003A9 GREEK CAPITAL LETTER OMEGA +003AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +003AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +003AC GREEK SMALL LETTER ALPHA WITH TONOS +003AD GREEK SMALL LETTER EPSILON WITH TONOS +003AE GREEK SMALL LETTER ETA WITH TONOS +003AF GREEK SMALL LETTER IOTA WITH TONOS +003B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +003B1 GREEK SMALL LETTER ALPHA +003B2 GREEK SMALL LETTER BETA +003B3 GREEK SMALL LETTER GAMMA +003B4 GREEK SMALL LETTER DELTA +003B5 GREEK SMALL LETTER EPSILON +003B6 GREEK SMALL LETTER ZETA +003B7 GREEK SMALL LETTER ETA +003B8 GREEK SMALL LETTER THETA +003B9 GREEK SMALL LETTER IOTA +003BA GREEK SMALL LETTER KAPPA +003BB GREEK SMALL LETTER LAMDA +003BC GREEK SMALL LETTER MU +003BD GREEK SMALL LETTER NU +003BE GREEK SMALL LETTER XI +003BF GREEK SMALL LETTER OMICRON +003C0 GREEK SMALL LETTER PI +003C1 GREEK SMALL LETTER RHO +003C2 GREEK SMALL LETTER FINAL SIGMA +003C3 GREEK SMALL LETTER SIGMA +003C4 GREEK SMALL LETTER TAU +003C5 GREEK SMALL LETTER UPSILON +003C6 GREEK SMALL LETTER PHI +003C7 GREEK SMALL LETTER CHI +003C8 GREEK SMALL LETTER PSI +003C9 GREEK SMALL LETTER OMEGA +003CA GREEK SMALL LETTER IOTA WITH DIALYTIKA +003CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA +003CC GREEK SMALL LETTER OMICRON WITH TONOS +003CD GREEK SMALL LETTER UPSILON WITH TONOS +003CE GREEK SMALL LETTER OMEGA WITH TONOS +003CF GREEK CAPITAL KAI SYMBOL +003D0 GREEK BETA SYMBOL +003D1 GREEK THETA SYMBOL +003D2 GREEK UPSILON WITH HOOK SYMBOL +003D3 GREEK UPSILON WITH ACUTE AND HOOK SYMBOL +003D4 GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL +003D5 GREEK PHI SYMBOL +003D6 GREEK PI SYMBOL +003D7 GREEK KAI SYMBOL +003D8 GREEK LETTER ARCHAIC KOPPA +003D9 GREEK SMALL LETTER ARCHAIC KOPPA +003DA GREEK LETTER STIGMA +003DB GREEK SMALL LETTER STIGMA +003DC GREEK LETTER DIGAMMA +003DD GREEK SMALL LETTER DIGAMMA +003DE GREEK LETTER KOPPA +003DF GREEK SMALL LETTER KOPPA +003E0 GREEK LETTER SAMPI +003E1 GREEK SMALL LETTER SAMPI +003E2 COPTIC CAPITAL LETTER SHEI +003E3 COPTIC SMALL LETTER SHEI +003E4 COPTIC CAPITAL LETTER FEI +003E5 COPTIC SMALL LETTER FEI +003E6 COPTIC CAPITAL LETTER KHEI +003E7 COPTIC SMALL LETTER KHEI +003E8 COPTIC CAPITAL LETTER HORI +003E9 COPTIC SMALL LETTER HORI +003EA COPTIC CAPITAL LETTER GANGIA +003EB COPTIC SMALL LETTER GANGIA +003EC COPTIC CAPITAL LETTER SHIMA +003ED COPTIC SMALL LETTER SHIMA +003EE COPTIC CAPITAL LETTER DEI +003EF COPTIC SMALL LETTER DEI +003F0 GREEK KAPPA SYMBOL +003F1 GREEK RHO SYMBOL +003F2 GREEK LUNATE SIGMA SYMBOL +003F3 GREEK LETTER YOT +003F4 GREEK CAPITAL THETA SYMBOL +003F5 GREEK LUNATE EPSILON SYMBOL +003F6 GREEK REVERSED LUNATE EPSILON SYMBOL +003F7 GREEK CAPITAL LETTER SHO +003F8 GREEK SMALL LETTER SHO +003F9 GREEK CAPITAL LUNATE SIGMA SYMBOL +003FA GREEK CAPITAL LETTER SAN +003FB GREEK SMALL LETTER SAN +003FC GREEK RHO WITH STROKE SYMBOL +003FD GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +003FE GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +003FF GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +00400 CYRILLIC CAPITAL LETTER IE WITH GRAVE +00401 CYRILLIC CAPITAL LETTER IO +00402 CYRILLIC CAPITAL LETTER DJE +00403 CYRILLIC CAPITAL LETTER GJE +00404 CYRILLIC CAPITAL LETTER UKRAINIAN IE +00405 CYRILLIC CAPITAL LETTER DZE +00406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +00407 CYRILLIC CAPITAL LETTER YI +00408 CYRILLIC CAPITAL LETTER JE +00409 CYRILLIC CAPITAL LETTER LJE +0040A CYRILLIC CAPITAL LETTER NJE +0040B CYRILLIC CAPITAL LETTER TSHE +0040C CYRILLIC CAPITAL LETTER KJE +0040D CYRILLIC CAPITAL LETTER I WITH GRAVE +0040E CYRILLIC CAPITAL LETTER SHORT U +0040F CYRILLIC CAPITAL LETTER DZHE +00410 CYRILLIC CAPITAL LETTER A +00411 CYRILLIC CAPITAL LETTER BE +00412 CYRILLIC CAPITAL LETTER VE +00413 CYRILLIC CAPITAL LETTER GHE +00414 CYRILLIC CAPITAL LETTER DE +00415 CYRILLIC CAPITAL LETTER IE +00416 CYRILLIC CAPITAL LETTER ZHE +00417 CYRILLIC CAPITAL LETTER ZE +00418 CYRILLIC CAPITAL LETTER I +00419 CYRILLIC CAPITAL LETTER SHORT I +0041A CYRILLIC CAPITAL LETTER KA +0041B CYRILLIC CAPITAL LETTER EL +0041C CYRILLIC CAPITAL LETTER EM +0041D CYRILLIC CAPITAL LETTER EN +0041E CYRILLIC CAPITAL LETTER O +0041F CYRILLIC CAPITAL LETTER PE +00420 CYRILLIC CAPITAL LETTER ER +00421 CYRILLIC CAPITAL LETTER ES +00422 CYRILLIC CAPITAL LETTER TE +00423 CYRILLIC CAPITAL LETTER U +00424 CYRILLIC CAPITAL LETTER EF +00425 CYRILLIC CAPITAL LETTER HA +00426 CYRILLIC CAPITAL LETTER TSE +00427 CYRILLIC CAPITAL LETTER CHE +00428 CYRILLIC CAPITAL LETTER SHA +00429 CYRILLIC CAPITAL LETTER SHCHA +0042A CYRILLIC CAPITAL LETTER HARD SIGN +0042B CYRILLIC CAPITAL LETTER YERU +0042C CYRILLIC CAPITAL LETTER SOFT SIGN +0042D CYRILLIC CAPITAL LETTER E +0042E CYRILLIC CAPITAL LETTER YU +0042F CYRILLIC CAPITAL LETTER YA +00430 CYRILLIC SMALL LETTER A +00431 CYRILLIC SMALL LETTER BE +00432 CYRILLIC SMALL LETTER VE +00433 CYRILLIC SMALL LETTER GHE +00434 CYRILLIC SMALL LETTER DE +00435 CYRILLIC SMALL LETTER IE +00436 CYRILLIC SMALL LETTER ZHE +00437 CYRILLIC SMALL LETTER ZE +00438 CYRILLIC SMALL LETTER I +00439 CYRILLIC SMALL LETTER SHORT I +0043A CYRILLIC SMALL LETTER KA +0043B CYRILLIC SMALL LETTER EL +0043C CYRILLIC SMALL LETTER EM +0043D CYRILLIC SMALL LETTER EN +0043E CYRILLIC SMALL LETTER O +0043F CYRILLIC SMALL LETTER PE +00440 CYRILLIC SMALL LETTER ER +00441 CYRILLIC SMALL LETTER ES +00442 CYRILLIC SMALL LETTER TE +00443 CYRILLIC SMALL LETTER U +00444 CYRILLIC SMALL LETTER EF +00445 CYRILLIC SMALL LETTER HA +00446 CYRILLIC SMALL LETTER TSE +00447 CYRILLIC SMALL LETTER CHE +00448 CYRILLIC SMALL LETTER SHA +00449 CYRILLIC SMALL LETTER SHCHA +0044A CYRILLIC SMALL LETTER HARD SIGN +0044B CYRILLIC SMALL LETTER YERU +0044C CYRILLIC SMALL LETTER SOFT SIGN +0044D CYRILLIC SMALL LETTER E +0044E CYRILLIC SMALL LETTER YU +0044F CYRILLIC SMALL LETTER YA +00450 CYRILLIC SMALL LETTER IE WITH GRAVE +00451 CYRILLIC SMALL LETTER IO +00452 CYRILLIC SMALL LETTER DJE +00453 CYRILLIC SMALL LETTER GJE +00454 CYRILLIC SMALL LETTER UKRAINIAN IE +00455 CYRILLIC SMALL LETTER DZE +00456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +00457 CYRILLIC SMALL LETTER YI +00458 CYRILLIC SMALL LETTER JE +00459 CYRILLIC SMALL LETTER LJE +0045A CYRILLIC SMALL LETTER NJE +0045B CYRILLIC SMALL LETTER TSHE +0045C CYRILLIC SMALL LETTER KJE +0045D CYRILLIC SMALL LETTER I WITH GRAVE +0045E CYRILLIC SMALL LETTER SHORT U +0045F CYRILLIC SMALL LETTER DZHE +00460 CYRILLIC CAPITAL LETTER OMEGA +00461 CYRILLIC SMALL LETTER OMEGA +00462 CYRILLIC CAPITAL LETTER YAT +00463 CYRILLIC SMALL LETTER YAT +00464 CYRILLIC CAPITAL LETTER IOTIFIED E +00465 CYRILLIC SMALL LETTER IOTIFIED E +00466 CYRILLIC CAPITAL LETTER LITTLE YUS +00467 CYRILLIC SMALL LETTER LITTLE YUS +00468 CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +00469 CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS +0046A CYRILLIC CAPITAL LETTER BIG YUS +0046B CYRILLIC SMALL LETTER BIG YUS +0046C CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +0046D CYRILLIC SMALL LETTER IOTIFIED BIG YUS +0046E CYRILLIC CAPITAL LETTER KSI +0046F CYRILLIC SMALL LETTER KSI +00470 CYRILLIC CAPITAL LETTER PSI +00471 CYRILLIC SMALL LETTER PSI +00472 CYRILLIC CAPITAL LETTER FITA +00473 CYRILLIC SMALL LETTER FITA +00474 CYRILLIC CAPITAL LETTER IZHITSA +00475 CYRILLIC SMALL LETTER IZHITSA +00476 CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +00477 CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +00478 CYRILLIC CAPITAL LETTER UK +00479 CYRILLIC SMALL LETTER UK +0047A CYRILLIC CAPITAL LETTER ROUND OMEGA +0047B CYRILLIC SMALL LETTER ROUND OMEGA +0047C CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +0047D CYRILLIC SMALL LETTER OMEGA WITH TITLO +0047E CYRILLIC CAPITAL LETTER OT +0047F CYRILLIC SMALL LETTER OT +00480 CYRILLIC CAPITAL LETTER KOPPA +00481 CYRILLIC SMALL LETTER KOPPA +00482 CYRILLIC THOUSANDS SIGN +00483 COMBINING CYRILLIC TITLO +00484 COMBINING CYRILLIC PALATALIZATION +00485 COMBINING CYRILLIC DASIA PNEUMATA +00486 COMBINING CYRILLIC PSILI PNEUMATA +00487 COMBINING CYRILLIC POKRYTIE +00488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN +00489 COMBINING CYRILLIC MILLIONS SIGN +0048A CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +0048B CYRILLIC SMALL LETTER SHORT I WITH TAIL +0048C CYRILLIC CAPITAL LETTER SEMISOFT SIGN +0048D CYRILLIC SMALL LETTER SEMISOFT SIGN +0048E CYRILLIC CAPITAL LETTER ER WITH TICK +0048F CYRILLIC SMALL LETTER ER WITH TICK +00490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +00491 CYRILLIC SMALL LETTER GHE WITH UPTURN +00492 CYRILLIC CAPITAL LETTER GHE WITH STROKE +00493 CYRILLIC SMALL LETTER GHE WITH STROKE +00494 CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +00495 CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK +00496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +00497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER +00498 CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +00499 CYRILLIC SMALL LETTER ZE WITH DESCENDER +0049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER +0049B CYRILLIC SMALL LETTER KA WITH DESCENDER +0049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +0049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE +0049E CYRILLIC CAPITAL LETTER KA WITH STROKE +0049F CYRILLIC SMALL LETTER KA WITH STROKE +004A0 CYRILLIC CAPITAL LETTER BASHKIR KA +004A1 CYRILLIC SMALL LETTER BASHKIR KA +004A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER +004A3 CYRILLIC SMALL LETTER EN WITH DESCENDER +004A4 CYRILLIC CAPITAL LIGATURE EN GHE +004A5 CYRILLIC SMALL LIGATURE EN GHE +004A6 CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +004A7 CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK +004A8 CYRILLIC CAPITAL LETTER ABKHASIAN HA +004A9 CYRILLIC SMALL LETTER ABKHASIAN HA +004AA CYRILLIC CAPITAL LETTER ES WITH DESCENDER +004AB CYRILLIC SMALL LETTER ES WITH DESCENDER +004AC CYRILLIC CAPITAL LETTER TE WITH DESCENDER +004AD CYRILLIC SMALL LETTER TE WITH DESCENDER +004AE CYRILLIC CAPITAL LETTER STRAIGHT U +004AF CYRILLIC SMALL LETTER STRAIGHT U +004B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +004B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE +004B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER +004B3 CYRILLIC SMALL LETTER HA WITH DESCENDER +004B4 CYRILLIC CAPITAL LIGATURE TE TSE +004B5 CYRILLIC SMALL LIGATURE TE TSE +004B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +004B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER +004B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +004B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE +004BA CYRILLIC CAPITAL LETTER SHHA +004BB CYRILLIC SMALL LETTER SHHA +004BC CYRILLIC CAPITAL LETTER ABKHASIAN CHE +004BD CYRILLIC SMALL LETTER ABKHASIAN CHE +004BE CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +004BF CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER +004C0 CYRILLIC LETTER PALOCHKA +004C1 CYRILLIC CAPITAL LETTER ZHE WITH BREVE +004C2 CYRILLIC SMALL LETTER ZHE WITH BREVE +004C3 CYRILLIC CAPITAL LETTER KA WITH HOOK +004C4 CYRILLIC SMALL LETTER KA WITH HOOK +004C5 CYRILLIC CAPITAL LETTER EL WITH TAIL +004C6 CYRILLIC SMALL LETTER EL WITH TAIL +004C7 CYRILLIC CAPITAL LETTER EN WITH HOOK +004C8 CYRILLIC SMALL LETTER EN WITH HOOK +004C9 CYRILLIC CAPITAL LETTER EN WITH TAIL +004CA CYRILLIC SMALL LETTER EN WITH TAIL +004CB CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +004CC CYRILLIC SMALL LETTER KHAKASSIAN CHE +004CD CYRILLIC CAPITAL LETTER EM WITH TAIL +004CE CYRILLIC SMALL LETTER EM WITH TAIL +004CF CYRILLIC SMALL LETTER PALOCHKA +004D0 CYRILLIC CAPITAL LETTER A WITH BREVE +004D1 CYRILLIC SMALL LETTER A WITH BREVE +004D2 CYRILLIC CAPITAL LETTER A WITH DIAERESIS +004D3 CYRILLIC SMALL LETTER A WITH DIAERESIS +004D4 CYRILLIC CAPITAL LIGATURE A IE +004D5 CYRILLIC SMALL LIGATURE A IE +004D6 CYRILLIC CAPITAL LETTER IE WITH BREVE +004D7 CYRILLIC SMALL LETTER IE WITH BREVE +004D8 CYRILLIC CAPITAL LETTER SCHWA +004D9 CYRILLIC SMALL LETTER SCHWA +004DA CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +004DB CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS +004DC CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +004DD CYRILLIC SMALL LETTER ZHE WITH DIAERESIS +004DE CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +004DF CYRILLIC SMALL LETTER ZE WITH DIAERESIS +004E0 CYRILLIC CAPITAL LETTER ABKHASIAN DZE +004E1 CYRILLIC SMALL LETTER ABKHASIAN DZE +004E2 CYRILLIC CAPITAL LETTER I WITH MACRON +004E3 CYRILLIC SMALL LETTER I WITH MACRON +004E4 CYRILLIC CAPITAL LETTER I WITH DIAERESIS +004E5 CYRILLIC SMALL LETTER I WITH DIAERESIS +004E6 CYRILLIC CAPITAL LETTER O WITH DIAERESIS +004E7 CYRILLIC SMALL LETTER O WITH DIAERESIS +004E8 CYRILLIC CAPITAL LETTER BARRED O +004E9 CYRILLIC SMALL LETTER BARRED O +004EA CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +004EB CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS +004EC CYRILLIC CAPITAL LETTER E WITH DIAERESIS +004ED CYRILLIC SMALL LETTER E WITH DIAERESIS +004EE CYRILLIC CAPITAL LETTER U WITH MACRON +004EF CYRILLIC SMALL LETTER U WITH MACRON +004F0 CYRILLIC CAPITAL LETTER U WITH DIAERESIS +004F1 CYRILLIC SMALL LETTER U WITH DIAERESIS +004F2 CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +004F3 CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE +004F4 CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +004F5 CYRILLIC SMALL LETTER CHE WITH DIAERESIS +004F6 CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +004F7 CYRILLIC SMALL LETTER GHE WITH DESCENDER +004F8 CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +004F9 CYRILLIC SMALL LETTER YERU WITH DIAERESIS +004FA CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +004FB CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK +004FC CYRILLIC CAPITAL LETTER HA WITH HOOK +004FD CYRILLIC SMALL LETTER HA WITH HOOK +004FE CYRILLIC CAPITAL LETTER HA WITH STROKE +004FF CYRILLIC SMALL LETTER HA WITH STROKE +00500 CYRILLIC CAPITAL LETTER KOMI DE +00501 CYRILLIC SMALL LETTER KOMI DE +00502 CYRILLIC CAPITAL LETTER KOMI DJE +00503 CYRILLIC SMALL LETTER KOMI DJE +00504 CYRILLIC CAPITAL LETTER KOMI ZJE +00505 CYRILLIC SMALL LETTER KOMI ZJE +00506 CYRILLIC CAPITAL LETTER KOMI DZJE +00507 CYRILLIC SMALL LETTER KOMI DZJE +00508 CYRILLIC CAPITAL LETTER KOMI LJE +00509 CYRILLIC SMALL LETTER KOMI LJE +0050A CYRILLIC CAPITAL LETTER KOMI NJE +0050B CYRILLIC SMALL LETTER KOMI NJE +0050C CYRILLIC CAPITAL LETTER KOMI SJE +0050D CYRILLIC SMALL LETTER KOMI SJE +0050E CYRILLIC CAPITAL LETTER KOMI TJE +0050F CYRILLIC SMALL LETTER KOMI TJE +00510 CYRILLIC CAPITAL LETTER REVERSED ZE +00511 CYRILLIC SMALL LETTER REVERSED ZE +00512 CYRILLIC CAPITAL LETTER EL WITH HOOK +00513 CYRILLIC SMALL LETTER EL WITH HOOK +00514 CYRILLIC CAPITAL LETTER LHA +00515 CYRILLIC SMALL LETTER LHA +00516 CYRILLIC CAPITAL LETTER RHA +00517 CYRILLIC SMALL LETTER RHA +00518 CYRILLIC CAPITAL LETTER YAE +00519 CYRILLIC SMALL LETTER YAE +0051A CYRILLIC CAPITAL LETTER QA +0051B CYRILLIC SMALL LETTER QA +0051C CYRILLIC CAPITAL LETTER WE +0051D CYRILLIC SMALL LETTER WE +0051E CYRILLIC CAPITAL LETTER ALEUT KA +0051F CYRILLIC SMALL LETTER ALEUT KA +00520 CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +00521 CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK +00522 CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +00523 CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK +00524 CYRILLIC CAPITAL LETTER PE WITH DESCENDER +00525 CYRILLIC SMALL LETTER PE WITH DESCENDER +00526 CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +00527 CYRILLIC SMALL LETTER SHHA WITH DESCENDER +00528 CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +00529 CYRILLIC SMALL LETTER EN WITH LEFT HOOK +0052A CYRILLIC CAPITAL LETTER DZZHE +0052B CYRILLIC SMALL LETTER DZZHE +0052C CYRILLIC CAPITAL LETTER DCHE +0052D CYRILLIC SMALL LETTER DCHE +0052E CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0052F CYRILLIC SMALL LETTER EL WITH DESCENDER +00531 ARMENIAN CAPITAL LETTER AYB +00532 ARMENIAN CAPITAL LETTER BEN +00533 ARMENIAN CAPITAL LETTER GIM +00534 ARMENIAN CAPITAL LETTER DA +00535 ARMENIAN CAPITAL LETTER ECH +00536 ARMENIAN CAPITAL LETTER ZA +00537 ARMENIAN CAPITAL LETTER EH +00538 ARMENIAN CAPITAL LETTER ET +00539 ARMENIAN CAPITAL LETTER TO +0053A ARMENIAN CAPITAL LETTER ZHE +0053B ARMENIAN CAPITAL LETTER INI +0053C ARMENIAN CAPITAL LETTER LIWN +0053D ARMENIAN CAPITAL LETTER XEH +0053E ARMENIAN CAPITAL LETTER CA +0053F ARMENIAN CAPITAL LETTER KEN +00540 ARMENIAN CAPITAL LETTER HO +00541 ARMENIAN CAPITAL LETTER JA +00542 ARMENIAN CAPITAL LETTER GHAD +00543 ARMENIAN CAPITAL LETTER CHEH +00544 ARMENIAN CAPITAL LETTER MEN +00545 ARMENIAN CAPITAL LETTER YI +00546 ARMENIAN CAPITAL LETTER NOW +00547 ARMENIAN CAPITAL LETTER SHA +00548 ARMENIAN CAPITAL LETTER VO +00549 ARMENIAN CAPITAL LETTER CHA +0054A ARMENIAN CAPITAL LETTER PEH +0054B ARMENIAN CAPITAL LETTER JHEH +0054C ARMENIAN CAPITAL LETTER RA +0054D ARMENIAN CAPITAL LETTER SEH +0054E ARMENIAN CAPITAL LETTER VEW +0054F ARMENIAN CAPITAL LETTER TIWN +00550 ARMENIAN CAPITAL LETTER REH +00551 ARMENIAN CAPITAL LETTER CO +00552 ARMENIAN CAPITAL LETTER YIWN +00553 ARMENIAN CAPITAL LETTER PIWR +00554 ARMENIAN CAPITAL LETTER KEH +00555 ARMENIAN CAPITAL LETTER OH +00556 ARMENIAN CAPITAL LETTER FEH +00559 ARMENIAN MODIFIER LETTER LEFT HALF RING +0055A ARMENIAN APOSTROPHE +0055B ARMENIAN EMPHASIS MARK +0055C ARMENIAN EXCLAMATION MARK +0055D ARMENIAN COMMA +0055E ARMENIAN QUESTION MARK +0055F ARMENIAN ABBREVIATION MARK +00561 ARMENIAN SMALL LETTER AYB +00562 ARMENIAN SMALL LETTER BEN +00563 ARMENIAN SMALL LETTER GIM +00564 ARMENIAN SMALL LETTER DA +00565 ARMENIAN SMALL LETTER ECH +00566 ARMENIAN SMALL LETTER ZA +00567 ARMENIAN SMALL LETTER EH +00568 ARMENIAN SMALL LETTER ET +00569 ARMENIAN SMALL LETTER TO +0056A ARMENIAN SMALL LETTER ZHE +0056B ARMENIAN SMALL LETTER INI +0056C ARMENIAN SMALL LETTER LIWN +0056D ARMENIAN SMALL LETTER XEH +0056E ARMENIAN SMALL LETTER CA +0056F ARMENIAN SMALL LETTER KEN +00570 ARMENIAN SMALL LETTER HO +00571 ARMENIAN SMALL LETTER JA +00572 ARMENIAN SMALL LETTER GHAD +00573 ARMENIAN SMALL LETTER CHEH +00574 ARMENIAN SMALL LETTER MEN +00575 ARMENIAN SMALL LETTER YI +00576 ARMENIAN SMALL LETTER NOW +00577 ARMENIAN SMALL LETTER SHA +00578 ARMENIAN SMALL LETTER VO +00579 ARMENIAN SMALL LETTER CHA +0057A ARMENIAN SMALL LETTER PEH +0057B ARMENIAN SMALL LETTER JHEH +0057C ARMENIAN SMALL LETTER RA +0057D ARMENIAN SMALL LETTER SEH +0057E ARMENIAN SMALL LETTER VEW +0057F ARMENIAN SMALL LETTER TIWN +00580 ARMENIAN SMALL LETTER REH +00581 ARMENIAN SMALL LETTER CO +00582 ARMENIAN SMALL LETTER YIWN +00583 ARMENIAN SMALL LETTER PIWR +00584 ARMENIAN SMALL LETTER KEH +00585 ARMENIAN SMALL LETTER OH +00586 ARMENIAN SMALL LETTER FEH +00587 ARMENIAN SMALL LIGATURE ECH YIWN +00589 ARMENIAN FULL STOP +0058A ARMENIAN HYPHEN +0058D RIGHT-FACING ARMENIAN ETERNITY SIGN +0058E LEFT-FACING ARMENIAN ETERNITY SIGN +0058F ARMENIAN DRAM SIGN +00591 HEBREW ACCENT ETNAHTA +00592 HEBREW ACCENT SEGOL +00593 HEBREW ACCENT SHALSHELET +00594 HEBREW ACCENT ZAQEF QATAN +00595 HEBREW ACCENT ZAQEF GADOL +00596 HEBREW ACCENT TIPEHA +00597 HEBREW ACCENT REVIA +00598 HEBREW ACCENT ZARQA +00599 HEBREW ACCENT PASHTA +0059A HEBREW ACCENT YETIV +0059B HEBREW ACCENT TEVIR +0059C HEBREW ACCENT GERESH +0059D HEBREW ACCENT GERESH MUQDAM +0059E HEBREW ACCENT GERSHAYIM +0059F HEBREW ACCENT QARNEY PARA +005A0 HEBREW ACCENT TELISHA GEDOLA +005A1 HEBREW ACCENT PAZER +005A2 HEBREW ACCENT ATNAH HAFUKH +005A3 HEBREW ACCENT MUNAH +005A4 HEBREW ACCENT MAHAPAKH +005A5 HEBREW ACCENT MERKHA +005A6 HEBREW ACCENT MERKHA KEFULA +005A7 HEBREW ACCENT DARGA +005A8 HEBREW ACCENT QADMA +005A9 HEBREW ACCENT TELISHA QETANA +005AA HEBREW ACCENT YERAH BEN YOMO +005AB HEBREW ACCENT OLE +005AC HEBREW ACCENT ILUY +005AD HEBREW ACCENT DEHI +005AE HEBREW ACCENT ZINOR +005AF HEBREW MARK MASORA CIRCLE +005B0 HEBREW POINT SHEVA +005B1 HEBREW POINT HATAF SEGOL +005B2 HEBREW POINT HATAF PATAH +005B3 HEBREW POINT HATAF QAMATS +005B4 HEBREW POINT HIRIQ +005B5 HEBREW POINT TSERE +005B6 HEBREW POINT SEGOL +005B7 HEBREW POINT PATAH +005B8 HEBREW POINT QAMATS +005B9 HEBREW POINT HOLAM +005BA HEBREW POINT HOLAM HASER FOR VAV +005BB HEBREW POINT QUBUTS +005BC HEBREW POINT DAGESH OR MAPIQ +005BD HEBREW POINT METEG +005BE HEBREW PUNCTUATION MAQAF +005BF HEBREW POINT RAFE +005C0 HEBREW PUNCTUATION PASEQ +005C1 HEBREW POINT SHIN DOT +005C2 HEBREW POINT SIN DOT +005C3 HEBREW PUNCTUATION SOF PASUQ +005C4 HEBREW MARK UPPER DOT +005C5 HEBREW MARK LOWER DOT +005C6 HEBREW PUNCTUATION NUN HAFUKHA +005C7 HEBREW POINT QAMATS QATAN +005D0 HEBREW LETTER ALEF +005D1 HEBREW LETTER BET +005D2 HEBREW LETTER GIMEL +005D3 HEBREW LETTER DALET +005D4 HEBREW LETTER HE +005D5 HEBREW LETTER VAV +005D6 HEBREW LETTER ZAYIN +005D7 HEBREW LETTER HET +005D8 HEBREW LETTER TET +005D9 HEBREW LETTER YOD +005DA HEBREW LETTER FINAL KAF +005DB HEBREW LETTER KAF +005DC HEBREW LETTER LAMED +005DD HEBREW LETTER FINAL MEM +005DE HEBREW LETTER MEM +005DF HEBREW LETTER FINAL NUN +005E0 HEBREW LETTER NUN +005E1 HEBREW LETTER SAMEKH +005E2 HEBREW LETTER AYIN +005E3 HEBREW LETTER FINAL PE +005E4 HEBREW LETTER PE +005E5 HEBREW LETTER FINAL TSADI +005E6 HEBREW LETTER TSADI +005E7 HEBREW LETTER QOF +005E8 HEBREW LETTER RESH +005E9 HEBREW LETTER SHIN +005EA HEBREW LETTER TAV +005F0 HEBREW LIGATURE YIDDISH DOUBLE VAV +005F1 HEBREW LIGATURE YIDDISH VAV YOD +005F2 HEBREW LIGATURE YIDDISH DOUBLE YOD +005F3 HEBREW PUNCTUATION GERESH +005F4 HEBREW PUNCTUATION GERSHAYIM +00600 ARABIC NUMBER SIGN +00601 ARABIC SIGN SANAH +00602 ARABIC FOOTNOTE MARKER +00603 ARABIC SIGN SAFHA +00604 ARABIC SIGN SAMVAT +00605 ARABIC NUMBER MARK ABOVE +00606 ARABIC-INDIC CUBE ROOT +00607 ARABIC-INDIC FOURTH ROOT +00608 ARABIC RAY +00609 ARABIC-INDIC PER MILLE SIGN +0060A ARABIC-INDIC PER TEN THOUSAND SIGN +0060B AFGHANI SIGN +0060C ARABIC COMMA +0060D ARABIC DATE SEPARATOR +0060E ARABIC POETIC VERSE SIGN +0060F ARABIC SIGN MISRA +00610 ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM +00611 ARABIC SIGN ALAYHE ASSALLAM +00612 ARABIC SIGN RAHMATULLAH ALAYHE +00613 ARABIC SIGN RADI ALLAHOU ANHU +00614 ARABIC SIGN TAKHALLUS +00615 ARABIC SMALL HIGH TAH +00616 ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH +00617 ARABIC SMALL HIGH ZAIN +00618 ARABIC SMALL FATHA +00619 ARABIC SMALL DAMMA +0061A ARABIC SMALL KASRA +0061B ARABIC SEMICOLON +0061C ARABIC LETTER MARK +0061C ALM +0061E ARABIC TRIPLE DOT PUNCTUATION MARK +0061F ARABIC QUESTION MARK +00620 ARABIC LETTER KASHMIRI YEH +00621 ARABIC LETTER HAMZA +00622 ARABIC LETTER ALEF WITH MADDA ABOVE +00623 ARABIC LETTER ALEF WITH HAMZA ABOVE +00624 ARABIC LETTER WAW WITH HAMZA ABOVE +00625 ARABIC LETTER ALEF WITH HAMZA BELOW +00626 ARABIC LETTER YEH WITH HAMZA ABOVE +00627 ARABIC LETTER ALEF +00628 ARABIC LETTER BEH +00629 ARABIC LETTER TEH MARBUTA +0062A ARABIC LETTER TEH +0062B ARABIC LETTER THEH +0062C ARABIC LETTER JEEM +0062D ARABIC LETTER HAH +0062E ARABIC LETTER KHAH +0062F ARABIC LETTER DAL +00630 ARABIC LETTER THAL +00631 ARABIC LETTER REH +00632 ARABIC LETTER ZAIN +00633 ARABIC LETTER SEEN +00634 ARABIC LETTER SHEEN +00635 ARABIC LETTER SAD +00636 ARABIC LETTER DAD +00637 ARABIC LETTER TAH +00638 ARABIC LETTER ZAH +00639 ARABIC LETTER AIN +0063A ARABIC LETTER GHAIN +0063B ARABIC LETTER KEHEH WITH TWO DOTS ABOVE +0063C ARABIC LETTER KEHEH WITH THREE DOTS BELOW +0063D ARABIC LETTER FARSI YEH WITH INVERTED V +0063E ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE +0063F ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +00640 ARABIC TATWEEL +00641 ARABIC LETTER FEH +00642 ARABIC LETTER QAF +00643 ARABIC LETTER KAF +00644 ARABIC LETTER LAM +00645 ARABIC LETTER MEEM +00646 ARABIC LETTER NOON +00647 ARABIC LETTER HEH +00648 ARABIC LETTER WAW +00649 ARABIC LETTER ALEF MAKSURA +0064A ARABIC LETTER YEH +0064B ARABIC FATHATAN +0064C ARABIC DAMMATAN +0064D ARABIC KASRATAN +0064E ARABIC FATHA +0064F ARABIC DAMMA +00650 ARABIC KASRA +00651 ARABIC SHADDA +00652 ARABIC SUKUN +00653 ARABIC MADDAH ABOVE +00654 ARABIC HAMZA ABOVE +00655 ARABIC HAMZA BELOW +00656 ARABIC SUBSCRIPT ALEF +00657 ARABIC INVERTED DAMMA +00658 ARABIC MARK NOON GHUNNA +00659 ARABIC ZWARAKAY +0065A ARABIC VOWEL SIGN SMALL V ABOVE +0065B ARABIC VOWEL SIGN INVERTED SMALL V ABOVE +0065C ARABIC VOWEL SIGN DOT BELOW +0065D ARABIC REVERSED DAMMA +0065E ARABIC FATHA WITH TWO DOTS +0065F ARABIC WAVY HAMZA BELOW +00660 ARABIC-INDIC DIGIT ZERO +00661 ARABIC-INDIC DIGIT ONE +00662 ARABIC-INDIC DIGIT TWO +00663 ARABIC-INDIC DIGIT THREE +00664 ARABIC-INDIC DIGIT FOUR +00665 ARABIC-INDIC DIGIT FIVE +00666 ARABIC-INDIC DIGIT SIX +00667 ARABIC-INDIC DIGIT SEVEN +00668 ARABIC-INDIC DIGIT EIGHT +00669 ARABIC-INDIC DIGIT NINE +0066A ARABIC PERCENT SIGN +0066B ARABIC DECIMAL SEPARATOR +0066C ARABIC THOUSANDS SEPARATOR +0066D ARABIC FIVE POINTED STAR +0066E ARABIC LETTER DOTLESS BEH +0066F ARABIC LETTER DOTLESS QAF +00670 ARABIC LETTER SUPERSCRIPT ALEF +00671 ARABIC LETTER ALEF WASLA +00672 ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE +00673 ARABIC LETTER ALEF WITH WAVY HAMZA BELOW +00674 ARABIC LETTER HIGH HAMZA +00675 ARABIC LETTER HIGH HAMZA ALEF +00676 ARABIC LETTER HIGH HAMZA WAW +00677 ARABIC LETTER U WITH HAMZA ABOVE +00678 ARABIC LETTER HIGH HAMZA YEH +00679 ARABIC LETTER TTEH +0067A ARABIC LETTER TTEHEH +0067B ARABIC LETTER BEEH +0067C ARABIC LETTER TEH WITH RING +0067D ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS +0067E ARABIC LETTER PEH +0067F ARABIC LETTER TEHEH +00680 ARABIC LETTER BEHEH +00681 ARABIC LETTER HAH WITH HAMZA ABOVE +00682 ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE +00683 ARABIC LETTER NYEH +00684 ARABIC LETTER DYEH +00685 ARABIC LETTER HAH WITH THREE DOTS ABOVE +00686 ARABIC LETTER TCHEH +00687 ARABIC LETTER TCHEHEH +00688 ARABIC LETTER DDAL +00689 ARABIC LETTER DAL WITH RING +0068A ARABIC LETTER DAL WITH DOT BELOW +0068B ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH +0068C ARABIC LETTER DAHAL +0068D ARABIC LETTER DDAHAL +0068E ARABIC LETTER DUL +0068F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS +00690 ARABIC LETTER DAL WITH FOUR DOTS ABOVE +00691 ARABIC LETTER RREH +00692 ARABIC LETTER REH WITH SMALL V +00693 ARABIC LETTER REH WITH RING +00694 ARABIC LETTER REH WITH DOT BELOW +00695 ARABIC LETTER REH WITH SMALL V BELOW +00696 ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE +00697 ARABIC LETTER REH WITH TWO DOTS ABOVE +00698 ARABIC LETTER JEH +00699 ARABIC LETTER REH WITH FOUR DOTS ABOVE +0069A ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE +0069B ARABIC LETTER SEEN WITH THREE DOTS BELOW +0069C ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE +0069D ARABIC LETTER SAD WITH TWO DOTS BELOW +0069E ARABIC LETTER SAD WITH THREE DOTS ABOVE +0069F ARABIC LETTER TAH WITH THREE DOTS ABOVE +006A0 ARABIC LETTER AIN WITH THREE DOTS ABOVE +006A1 ARABIC LETTER DOTLESS FEH +006A2 ARABIC LETTER FEH WITH DOT MOVED BELOW +006A3 ARABIC LETTER FEH WITH DOT BELOW +006A4 ARABIC LETTER VEH +006A5 ARABIC LETTER FEH WITH THREE DOTS BELOW +006A6 ARABIC LETTER PEHEH +006A7 ARABIC LETTER QAF WITH DOT ABOVE +006A8 ARABIC LETTER QAF WITH THREE DOTS ABOVE +006A9 ARABIC LETTER KEHEH +006AA ARABIC LETTER SWASH KAF +006AB ARABIC LETTER KAF WITH RING +006AC ARABIC LETTER KAF WITH DOT ABOVE +006AD ARABIC LETTER NG +006AE ARABIC LETTER KAF WITH THREE DOTS BELOW +006AF ARABIC LETTER GAF +006B0 ARABIC LETTER GAF WITH RING +006B1 ARABIC LETTER NGOEH +006B2 ARABIC LETTER GAF WITH TWO DOTS BELOW +006B3 ARABIC LETTER GUEH +006B4 ARABIC LETTER GAF WITH THREE DOTS ABOVE +006B5 ARABIC LETTER LAM WITH SMALL V +006B6 ARABIC LETTER LAM WITH DOT ABOVE +006B7 ARABIC LETTER LAM WITH THREE DOTS ABOVE +006B8 ARABIC LETTER LAM WITH THREE DOTS BELOW +006B9 ARABIC LETTER NOON WITH DOT BELOW +006BA ARABIC LETTER NOON GHUNNA +006BB ARABIC LETTER RNOON +006BC ARABIC LETTER NOON WITH RING +006BD ARABIC LETTER NOON WITH THREE DOTS ABOVE +006BE ARABIC LETTER HEH DOACHASHMEE +006BF ARABIC LETTER TCHEH WITH DOT ABOVE +006C0 ARABIC LETTER HEH WITH YEH ABOVE +006C1 ARABIC LETTER HEH GOAL +006C2 ARABIC LETTER HEH GOAL WITH HAMZA ABOVE +006C3 ARABIC LETTER TEH MARBUTA GOAL +006C4 ARABIC LETTER WAW WITH RING +006C5 ARABIC LETTER KIRGHIZ OE +006C6 ARABIC LETTER OE +006C7 ARABIC LETTER U +006C8 ARABIC LETTER YU +006C9 ARABIC LETTER KIRGHIZ YU +006CA ARABIC LETTER WAW WITH TWO DOTS ABOVE +006CB ARABIC LETTER VE +006CC ARABIC LETTER FARSI YEH +006CD ARABIC LETTER YEH WITH TAIL +006CE ARABIC LETTER YEH WITH SMALL V +006CF ARABIC LETTER WAW WITH DOT ABOVE +006D0 ARABIC LETTER E +006D1 ARABIC LETTER YEH WITH THREE DOTS BELOW +006D2 ARABIC LETTER YEH BARREE +006D3 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +006D4 ARABIC FULL STOP +006D5 ARABIC LETTER AE +006D6 ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA +006D7 ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA +006D8 ARABIC SMALL HIGH MEEM INITIAL FORM +006D9 ARABIC SMALL HIGH LAM ALEF +006DA ARABIC SMALL HIGH JEEM +006DB ARABIC SMALL HIGH THREE DOTS +006DC ARABIC SMALL HIGH SEEN +006DD ARABIC END OF AYAH +006DE ARABIC START OF RUB EL HIZB +006DF ARABIC SMALL HIGH ROUNDED ZERO +006E0 ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO +006E1 ARABIC SMALL HIGH DOTLESS HEAD OF KHAH +006E2 ARABIC SMALL HIGH MEEM ISOLATED FORM +006E3 ARABIC SMALL LOW SEEN +006E4 ARABIC SMALL HIGH MADDA +006E5 ARABIC SMALL WAW +006E6 ARABIC SMALL YEH +006E7 ARABIC SMALL HIGH YEH +006E8 ARABIC SMALL HIGH NOON +006E9 ARABIC PLACE OF SAJDAH +006EA ARABIC EMPTY CENTRE LOW STOP +006EB ARABIC EMPTY CENTRE HIGH STOP +006EC ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE +006ED ARABIC SMALL LOW MEEM +006EE ARABIC LETTER DAL WITH INVERTED V +006EF ARABIC LETTER REH WITH INVERTED V +006F0 EXTENDED ARABIC-INDIC DIGIT ZERO +006F1 EXTENDED ARABIC-INDIC DIGIT ONE +006F2 EXTENDED ARABIC-INDIC DIGIT TWO +006F3 EXTENDED ARABIC-INDIC DIGIT THREE +006F4 EXTENDED ARABIC-INDIC DIGIT FOUR +006F5 EXTENDED ARABIC-INDIC DIGIT FIVE +006F6 EXTENDED ARABIC-INDIC DIGIT SIX +006F7 EXTENDED ARABIC-INDIC DIGIT SEVEN +006F8 EXTENDED ARABIC-INDIC DIGIT EIGHT +006F9 EXTENDED ARABIC-INDIC DIGIT NINE +006FA ARABIC LETTER SHEEN WITH DOT BELOW +006FB ARABIC LETTER DAD WITH DOT BELOW +006FC ARABIC LETTER GHAIN WITH DOT BELOW +006FD ARABIC SIGN SINDHI AMPERSAND +006FE ARABIC SIGN SINDHI POSTPOSITION MEN +006FF ARABIC LETTER HEH WITH INVERTED V +00700 SYRIAC END OF PARAGRAPH +00701 SYRIAC SUPRALINEAR FULL STOP +00702 SYRIAC SUBLINEAR FULL STOP +00703 SYRIAC SUPRALINEAR COLON +00704 SYRIAC SUBLINEAR COLON +00705 SYRIAC HORIZONTAL COLON +00706 SYRIAC COLON SKEWED LEFT +00707 SYRIAC COLON SKEWED RIGHT +00708 SYRIAC SUPRALINEAR COLON SKEWED LEFT +00709 SYRIAC SUBLINEAR COLON SKEWED LEFT +00709 SYRIAC SUBLINEAR COLON SKEWED RIGHT +0070A SYRIAC CONTRACTION +0070B SYRIAC HARKLEAN OBELUS +0070C SYRIAC HARKLEAN METOBELUS +0070D SYRIAC HARKLEAN ASTERISCUS +0070F SYRIAC ABBREVIATION MARK +00710 SYRIAC LETTER ALAPH +00711 SYRIAC LETTER SUPERSCRIPT ALAPH +00712 SYRIAC LETTER BETH +00713 SYRIAC LETTER GAMAL +00714 SYRIAC LETTER GAMAL GARSHUNI +00715 SYRIAC LETTER DALATH +00716 SYRIAC LETTER DOTLESS DALATH RISH +00717 SYRIAC LETTER HE +00718 SYRIAC LETTER WAW +00719 SYRIAC LETTER ZAIN +0071A SYRIAC LETTER HETH +0071B SYRIAC LETTER TETH +0071C SYRIAC LETTER TETH GARSHUNI +0071D SYRIAC LETTER YUDH +0071E SYRIAC LETTER YUDH HE +0071F SYRIAC LETTER KAPH +00720 SYRIAC LETTER LAMADH +00721 SYRIAC LETTER MIM +00722 SYRIAC LETTER NUN +00723 SYRIAC LETTER SEMKATH +00724 SYRIAC LETTER FINAL SEMKATH +00725 SYRIAC LETTER E +00726 SYRIAC LETTER PE +00727 SYRIAC LETTER REVERSED PE +00728 SYRIAC LETTER SADHE +00729 SYRIAC LETTER QAPH +0072A SYRIAC LETTER RISH +0072B SYRIAC LETTER SHIN +0072C SYRIAC LETTER TAW +0072D SYRIAC LETTER PERSIAN BHETH +0072E SYRIAC LETTER PERSIAN GHAMAL +0072F SYRIAC LETTER PERSIAN DHALATH +00730 SYRIAC PTHAHA ABOVE +00731 SYRIAC PTHAHA BELOW +00732 SYRIAC PTHAHA DOTTED +00733 SYRIAC ZQAPHA ABOVE +00734 SYRIAC ZQAPHA BELOW +00735 SYRIAC ZQAPHA DOTTED +00736 SYRIAC RBASA ABOVE +00737 SYRIAC RBASA BELOW +00738 SYRIAC DOTTED ZLAMA HORIZONTAL +00739 SYRIAC DOTTED ZLAMA ANGULAR +0073A SYRIAC HBASA ABOVE +0073B SYRIAC HBASA BELOW +0073C SYRIAC HBASA-ESASA DOTTED +0073D SYRIAC ESASA ABOVE +0073E SYRIAC ESASA BELOW +0073F SYRIAC RWAHA +00740 SYRIAC FEMININE DOT +00741 SYRIAC QUSHSHAYA +00742 SYRIAC RUKKAKHA +00743 SYRIAC TWO VERTICAL DOTS ABOVE +00744 SYRIAC TWO VERTICAL DOTS BELOW +00745 SYRIAC THREE DOTS ABOVE +00746 SYRIAC THREE DOTS BELOW +00747 SYRIAC OBLIQUE LINE ABOVE +00748 SYRIAC OBLIQUE LINE BELOW +00749 SYRIAC MUSIC +0074A SYRIAC BARREKH +0074D SYRIAC LETTER SOGDIAN ZHAIN +0074E SYRIAC LETTER SOGDIAN KHAPH +0074F SYRIAC LETTER SOGDIAN FE +00750 ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW +00751 ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE +00752 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW +00753 ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE +00754 ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE +00755 ARABIC LETTER BEH WITH INVERTED SMALL V BELOW +00756 ARABIC LETTER BEH WITH SMALL V +00757 ARABIC LETTER HAH WITH TWO DOTS ABOVE +00758 ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW +00759 ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH +0075A ARABIC LETTER DAL WITH INVERTED SMALL V BELOW +0075B ARABIC LETTER REH WITH STROKE +0075C ARABIC LETTER SEEN WITH FOUR DOTS ABOVE +0075D ARABIC LETTER AIN WITH TWO DOTS ABOVE +0075E ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE +0075F ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE +00760 ARABIC LETTER FEH WITH TWO DOTS BELOW +00761 ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW +00762 ARABIC LETTER KEHEH WITH DOT ABOVE +00763 ARABIC LETTER KEHEH WITH THREE DOTS ABOVE +00764 ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW +00765 ARABIC LETTER MEEM WITH DOT ABOVE +00766 ARABIC LETTER MEEM WITH DOT BELOW +00767 ARABIC LETTER NOON WITH TWO DOTS BELOW +00768 ARABIC LETTER NOON WITH SMALL TAH +00769 ARABIC LETTER NOON WITH SMALL V +0076A ARABIC LETTER LAM WITH BAR +0076B ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE +0076C ARABIC LETTER REH WITH HAMZA ABOVE +0076D ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE +0076E ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW +0076F ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +00770 ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS +00771 ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS +00772 ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE +00773 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +00774 ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +00775 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +00776 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +00777 ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +00778 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +00779 ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0077A ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE +0077B ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE +0077C ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW +0077D ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE +0077E ARABIC LETTER SEEN WITH INVERTED V +0077F ARABIC LETTER KAF WITH TWO DOTS ABOVE +00780 THAANA LETTER HAA +00781 THAANA LETTER SHAVIYANI +00782 THAANA LETTER NOONU +00783 THAANA LETTER RAA +00784 THAANA LETTER BAA +00785 THAANA LETTER LHAVIYANI +00786 THAANA LETTER KAAFU +00787 THAANA LETTER ALIFU +00788 THAANA LETTER VAAVU +00789 THAANA LETTER MEEMU +0078A THAANA LETTER FAAFU +0078B THAANA LETTER DHAALU +0078C THAANA LETTER THAA +0078D THAANA LETTER LAAMU +0078E THAANA LETTER GAAFU +0078F THAANA LETTER GNAVIYANI +00790 THAANA LETTER SEENU +00791 THAANA LETTER DAVIYANI +00792 THAANA LETTER ZAVIYANI +00793 THAANA LETTER TAVIYANI +00794 THAANA LETTER YAA +00795 THAANA LETTER PAVIYANI +00796 THAANA LETTER JAVIYANI +00797 THAANA LETTER CHAVIYANI +00798 THAANA LETTER TTAA +00799 THAANA LETTER HHAA +0079A THAANA LETTER KHAA +0079B THAANA LETTER THAALU +0079C THAANA LETTER ZAA +0079D THAANA LETTER SHEENU +0079E THAANA LETTER SAADHU +0079F THAANA LETTER DAADHU +007A0 THAANA LETTER TO +007A1 THAANA LETTER ZO +007A2 THAANA LETTER AINU +007A3 THAANA LETTER GHAINU +007A4 THAANA LETTER QAAFU +007A5 THAANA LETTER WAAVU +007A6 THAANA ABAFILI +007A7 THAANA AABAAFILI +007A8 THAANA IBIFILI +007A9 THAANA EEBEEFILI +007AA THAANA UBUFILI +007AB THAANA OOBOOFILI +007AC THAANA EBEFILI +007AD THAANA EYBEYFILI +007AE THAANA OBOFILI +007AF THAANA OABOAFILI +007B0 THAANA SUKUN +007B1 THAANA LETTER NAA +007C0 NKO DIGIT ZERO +007C1 NKO DIGIT ONE +007C2 NKO DIGIT TWO +007C3 NKO DIGIT THREE +007C4 NKO DIGIT FOUR +007C5 NKO DIGIT FIVE +007C6 NKO DIGIT SIX +007C7 NKO DIGIT SEVEN +007C8 NKO DIGIT EIGHT +007C9 NKO DIGIT NINE +007CA NKO LETTER A +007CB NKO LETTER EE +007CC NKO LETTER I +007CD NKO LETTER E +007CE NKO LETTER U +007CF NKO LETTER OO +007D0 NKO LETTER O +007D1 NKO LETTER DAGBASINNA +007D2 NKO LETTER N +007D3 NKO LETTER BA +007D4 NKO LETTER PA +007D5 NKO LETTER TA +007D6 NKO LETTER JA +007D7 NKO LETTER CHA +007D8 NKO LETTER DA +007D9 NKO LETTER RA +007DA NKO LETTER RRA +007DB NKO LETTER SA +007DC NKO LETTER GBA +007DD NKO LETTER FA +007DE NKO LETTER KA +007DF NKO LETTER LA +007E0 NKO LETTER NA WOLOSO +007E1 NKO LETTER MA +007E2 NKO LETTER NYA +007E3 NKO LETTER NA +007E4 NKO LETTER HA +007E5 NKO LETTER WA +007E6 NKO LETTER YA +007E7 NKO LETTER NYA WOLOSO +007E8 NKO LETTER JONA JA +007E9 NKO LETTER JONA CHA +007EA NKO LETTER JONA RA +007EB NKO COMBINING SHORT HIGH TONE +007EC NKO COMBINING SHORT LOW TONE +007ED NKO COMBINING SHORT RISING TONE +007EE NKO COMBINING LONG DESCENDING TONE +007EF NKO COMBINING LONG HIGH TONE +007F0 NKO COMBINING LONG LOW TONE +007F1 NKO COMBINING LONG RISING TONE +007F2 NKO COMBINING NASALIZATION MARK +007F3 NKO COMBINING DOUBLE DOT ABOVE +007F4 NKO HIGH TONE APOSTROPHE +007F5 NKO LOW TONE APOSTROPHE +007F6 NKO SYMBOL OO DENNEN +007F7 NKO SYMBOL GBAKURUNEN +007F8 NKO COMMA +007F9 NKO EXCLAMATION MARK +007FA NKO LAJANYALAN +00800 SAMARITAN LETTER ALAF +00801 SAMARITAN LETTER BIT +00802 SAMARITAN LETTER GAMAN +00803 SAMARITAN LETTER DALAT +00804 SAMARITAN LETTER IY +00805 SAMARITAN LETTER BAA +00806 SAMARITAN LETTER ZEN +00807 SAMARITAN LETTER IT +00808 SAMARITAN LETTER TIT +00809 SAMARITAN LETTER YUT +0080A SAMARITAN LETTER KAAF +0080B SAMARITAN LETTER LABAT +0080C SAMARITAN LETTER MIM +0080D SAMARITAN LETTER NUN +0080E SAMARITAN LETTER SINGAAT +0080F SAMARITAN LETTER IN +00810 SAMARITAN LETTER FI +00811 SAMARITAN LETTER TSAADIY +00812 SAMARITAN LETTER QUF +00813 SAMARITAN LETTER RISH +00814 SAMARITAN LETTER SHAN +00815 SAMARITAN LETTER TAAF +00816 SAMARITAN MARK IN +00817 SAMARITAN MARK IN-ALAF +00818 SAMARITAN MARK OCCLUSION +00819 SAMARITAN MARK DAGESH +0081A SAMARITAN MODIFIER LETTER EPENTHETIC YUT +0081B SAMARITAN MARK EPENTHETIC YUT +0081C SAMARITAN VOWEL SIGN LONG E +0081D SAMARITAN VOWEL SIGN E +0081E SAMARITAN VOWEL SIGN OVERLONG AA +0081F SAMARITAN VOWEL SIGN LONG AA +00820 SAMARITAN VOWEL SIGN AA +00821 SAMARITAN VOWEL SIGN OVERLONG A +00822 SAMARITAN VOWEL SIGN LONG A +00823 SAMARITAN VOWEL SIGN A +00824 SAMARITAN MODIFIER LETTER SHORT A +00825 SAMARITAN VOWEL SIGN SHORT A +00826 SAMARITAN VOWEL SIGN LONG U +00827 SAMARITAN VOWEL SIGN U +00828 SAMARITAN MODIFIER LETTER I +00829 SAMARITAN VOWEL SIGN LONG I +0082A SAMARITAN VOWEL SIGN I +0082B SAMARITAN VOWEL SIGN O +0082C SAMARITAN VOWEL SIGN SUKUN +0082D SAMARITAN MARK NEQUDAA +00830 SAMARITAN PUNCTUATION NEQUDAA +00831 SAMARITAN PUNCTUATION AFSAAQ +00832 SAMARITAN PUNCTUATION ANGED +00833 SAMARITAN PUNCTUATION BAU +00834 SAMARITAN PUNCTUATION ATMAAU +00835 SAMARITAN PUNCTUATION SHIYYAALAA +00836 SAMARITAN ABBREVIATION MARK +00837 SAMARITAN PUNCTUATION MELODIC QITSA +00838 SAMARITAN PUNCTUATION ZIQAA +00839 SAMARITAN PUNCTUATION QITSA +0083A SAMARITAN PUNCTUATION ZAEF +0083B SAMARITAN PUNCTUATION TURU +0083C SAMARITAN PUNCTUATION ARKAANU +0083D SAMARITAN PUNCTUATION SOF MASHFAAT +0083E SAMARITAN PUNCTUATION ANNAAU +00840 MANDAIC LETTER HALQA +00841 MANDAIC LETTER AB +00842 MANDAIC LETTER AG +00843 MANDAIC LETTER AD +00844 MANDAIC LETTER AH +00845 MANDAIC LETTER USHENNA +00846 MANDAIC LETTER AZ +00847 MANDAIC LETTER IT +00848 MANDAIC LETTER ATT +00849 MANDAIC LETTER AKSA +0084A MANDAIC LETTER AK +0084B MANDAIC LETTER AL +0084C MANDAIC LETTER AM +0084D MANDAIC LETTER AN +0084E MANDAIC LETTER AS +0084F MANDAIC LETTER IN +00850 MANDAIC LETTER AP +00851 MANDAIC LETTER ASZ +00852 MANDAIC LETTER AQ +00853 MANDAIC LETTER AR +00854 MANDAIC LETTER ASH +00855 MANDAIC LETTER AT +00856 MANDAIC LETTER DUSHENNA +00857 MANDAIC LETTER KAD +00858 MANDAIC LETTER AIN +00859 MANDAIC AFFRICATION MARK +0085A MANDAIC VOCALIZATION MARK +0085B MANDAIC GEMINATION MARK +0085E MANDAIC PUNCTUATION +00860 SYRIAC LETTER MALAYALAM NGA +00861 SYRIAC LETTER MALAYALAM JA +00862 SYRIAC LETTER MALAYALAM NYA +00863 SYRIAC LETTER MALAYALAM TTA +00864 SYRIAC LETTER MALAYALAM NNA +00865 SYRIAC LETTER MALAYALAM NNNA +00866 SYRIAC LETTER MALAYALAM BHA +00867 SYRIAC LETTER MALAYALAM RA +00868 SYRIAC LETTER MALAYALAM LLA +00869 SYRIAC LETTER MALAYALAM LLLA +0086A SYRIAC LETTER MALAYALAM SSA +008A0 ARABIC LETTER BEH WITH SMALL V BELOW +008A1 ARABIC LETTER BEH WITH HAMZA ABOVE +008A2 ARABIC LETTER JEEM WITH TWO DOTS ABOVE +008A3 ARABIC LETTER TAH WITH TWO DOTS ABOVE +008A4 ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE +008A5 ARABIC LETTER QAF WITH DOT BELOW +008A6 ARABIC LETTER LAM WITH DOUBLE BAR +008A7 ARABIC LETTER MEEM WITH THREE DOTS ABOVE +008A8 ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE +008A9 ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE +008AA ARABIC LETTER REH WITH LOOP +008AB ARABIC LETTER WAW WITH DOT WITHIN +008AC ARABIC LETTER ROHINGYA YEH +008AD ARABIC LETTER LOW ALEF +008AE ARABIC LETTER DAL WITH THREE DOTS BELOW +008AF ARABIC LETTER SAD WITH THREE DOTS BELOW +008B0 ARABIC LETTER GAF WITH INVERTED STROKE +008B1 ARABIC LETTER STRAIGHT WAW +008B2 ARABIC LETTER ZAIN WITH INVERTED V ABOVE +008B3 ARABIC LETTER AIN WITH THREE DOTS BELOW +008B4 ARABIC LETTER KAF WITH DOT BELOW +008B6 ARABIC LETTER BEH WITH SMALL MEEM ABOVE +008B7 ARABIC LETTER PEH WITH SMALL MEEM ABOVE +008B8 ARABIC LETTER TEH WITH SMALL TEH ABOVE +008B9 ARABIC LETTER REH WITH SMALL NOON ABOVE +008BA ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE +008BB ARABIC LETTER AFRICAN FEH +008BC ARABIC LETTER AFRICAN QAF +008BD ARABIC LETTER AFRICAN NOON +008D4 ARABIC SMALL HIGH WORD AR-RUB +008D5 ARABIC SMALL HIGH SAD +008D6 ARABIC SMALL HIGH AIN +008D7 ARABIC SMALL HIGH QAF +008D8 ARABIC SMALL HIGH NOON WITH KASRA +008D9 ARABIC SMALL LOW NOON WITH KASRA +008DA ARABIC SMALL HIGH WORD ATH-THALATHA +008DB ARABIC SMALL HIGH WORD AS-SAJDA +008DC ARABIC SMALL HIGH WORD AN-NISF +008DD ARABIC SMALL HIGH WORD SAKTA +008DE ARABIC SMALL HIGH WORD QIF +008DF ARABIC SMALL HIGH WORD WAQFA +008E0 ARABIC SMALL HIGH FOOTNOTE MARKER +008E1 ARABIC SMALL HIGH SIGN SAFHA +008E2 ARABIC DISPUTED END OF AYAH +008E3 ARABIC TURNED DAMMA BELOW +008E4 ARABIC CURLY FATHA +008E5 ARABIC CURLY DAMMA +008E6 ARABIC CURLY KASRA +008E7 ARABIC CURLY FATHATAN +008E8 ARABIC CURLY DAMMATAN +008E9 ARABIC CURLY KASRATAN +008EA ARABIC TONE ONE DOT ABOVE +008EB ARABIC TONE TWO DOTS ABOVE +008EC ARABIC TONE LOOP ABOVE +008ED ARABIC TONE ONE DOT BELOW +008EE ARABIC TONE TWO DOTS BELOW +008EF ARABIC TONE LOOP BELOW +008F0 ARABIC OPEN FATHATAN +008F1 ARABIC OPEN DAMMATAN +008F2 ARABIC OPEN KASRATAN +008F3 ARABIC SMALL HIGH WAW +008F4 ARABIC FATHA WITH RING +008F5 ARABIC FATHA WITH DOT ABOVE +008F6 ARABIC KASRA WITH DOT BELOW +008F7 ARABIC LEFT ARROWHEAD ABOVE +008F8 ARABIC RIGHT ARROWHEAD ABOVE +008F9 ARABIC LEFT ARROWHEAD BELOW +008FA ARABIC RIGHT ARROWHEAD BELOW +008FB ARABIC DOUBLE RIGHT ARROWHEAD ABOVE +008FC ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT +008FD ARABIC RIGHT ARROWHEAD ABOVE WITH DOT +008FE ARABIC DAMMA WITH DOT +008FF ARABIC MARK SIDEWAYS NOON GHUNNA +00900 DEVANAGARI SIGN INVERTED CANDRABINDU +00901 DEVANAGARI SIGN CANDRABINDU +00902 DEVANAGARI SIGN ANUSVARA +00903 DEVANAGARI SIGN VISARGA +00904 DEVANAGARI LETTER SHORT A +00905 DEVANAGARI LETTER A +00906 DEVANAGARI LETTER AA +00907 DEVANAGARI LETTER I +00908 DEVANAGARI LETTER II +00909 DEVANAGARI LETTER U +0090A DEVANAGARI LETTER UU +0090B DEVANAGARI LETTER VOCALIC R +0090C DEVANAGARI LETTER VOCALIC L +0090D DEVANAGARI LETTER CANDRA E +0090E DEVANAGARI LETTER SHORT E +0090F DEVANAGARI LETTER E +00910 DEVANAGARI LETTER AI +00911 DEVANAGARI LETTER CANDRA O +00912 DEVANAGARI LETTER SHORT O +00913 DEVANAGARI LETTER O +00914 DEVANAGARI LETTER AU +00915 DEVANAGARI LETTER KA +00916 DEVANAGARI LETTER KHA +00917 DEVANAGARI LETTER GA +00918 DEVANAGARI LETTER GHA +00919 DEVANAGARI LETTER NGA +0091A DEVANAGARI LETTER CA +0091B DEVANAGARI LETTER CHA +0091C DEVANAGARI LETTER JA +0091D DEVANAGARI LETTER JHA +0091E DEVANAGARI LETTER NYA +0091F DEVANAGARI LETTER TTA +00920 DEVANAGARI LETTER TTHA +00921 DEVANAGARI LETTER DDA +00922 DEVANAGARI LETTER DDHA +00923 DEVANAGARI LETTER NNA +00924 DEVANAGARI LETTER TA +00925 DEVANAGARI LETTER THA +00926 DEVANAGARI LETTER DA +00927 DEVANAGARI LETTER DHA +00928 DEVANAGARI LETTER NA +00929 DEVANAGARI LETTER NNNA +0092A DEVANAGARI LETTER PA +0092B DEVANAGARI LETTER PHA +0092C DEVANAGARI LETTER BA +0092D DEVANAGARI LETTER BHA +0092E DEVANAGARI LETTER MA +0092F DEVANAGARI LETTER YA +00930 DEVANAGARI LETTER RA +00931 DEVANAGARI LETTER RRA +00932 DEVANAGARI LETTER LA +00933 DEVANAGARI LETTER LLA +00934 DEVANAGARI LETTER LLLA +00935 DEVANAGARI LETTER VA +00936 DEVANAGARI LETTER SHA +00937 DEVANAGARI LETTER SSA +00938 DEVANAGARI LETTER SA +00939 DEVANAGARI LETTER HA +0093A DEVANAGARI VOWEL SIGN OE +0093B DEVANAGARI VOWEL SIGN OOE +0093C DEVANAGARI SIGN NUKTA +0093D DEVANAGARI SIGN AVAGRAHA +0093E DEVANAGARI VOWEL SIGN AA +0093F DEVANAGARI VOWEL SIGN I +00940 DEVANAGARI VOWEL SIGN II +00941 DEVANAGARI VOWEL SIGN U +00942 DEVANAGARI VOWEL SIGN UU +00943 DEVANAGARI VOWEL SIGN VOCALIC R +00944 DEVANAGARI VOWEL SIGN VOCALIC RR +00945 DEVANAGARI VOWEL SIGN CANDRA E +00946 DEVANAGARI VOWEL SIGN SHORT E +00947 DEVANAGARI VOWEL SIGN E +00948 DEVANAGARI VOWEL SIGN AI +00949 DEVANAGARI VOWEL SIGN CANDRA O +0094A DEVANAGARI VOWEL SIGN SHORT O +0094B DEVANAGARI VOWEL SIGN O +0094C DEVANAGARI VOWEL SIGN AU +0094D DEVANAGARI SIGN VIRAMA +0094E DEVANAGARI VOWEL SIGN PRISHTHAMATRA E +0094F DEVANAGARI VOWEL SIGN AW +00950 DEVANAGARI OM +00951 DEVANAGARI STRESS SIGN UDATTA +00952 DEVANAGARI STRESS SIGN ANUDATTA +00953 DEVANAGARI GRAVE ACCENT +00954 DEVANAGARI ACUTE ACCENT +00955 DEVANAGARI VOWEL SIGN CANDRA LONG E +00956 DEVANAGARI VOWEL SIGN UE +00957 DEVANAGARI VOWEL SIGN UUE +00958 DEVANAGARI LETTER QA +00959 DEVANAGARI LETTER KHHA +0095A DEVANAGARI LETTER GHHA +0095B DEVANAGARI LETTER ZA +0095C DEVANAGARI LETTER DDDHA +0095D DEVANAGARI LETTER RHA +0095E DEVANAGARI LETTER FA +0095F DEVANAGARI LETTER YYA +00960 DEVANAGARI LETTER VOCALIC RR +00961 DEVANAGARI LETTER VOCALIC LL +00962 DEVANAGARI VOWEL SIGN VOCALIC L +00963 DEVANAGARI VOWEL SIGN VOCALIC LL +00964 DEVANAGARI DANDA +00965 DEVANAGARI DOUBLE DANDA +00966 DEVANAGARI DIGIT ZERO +00967 DEVANAGARI DIGIT ONE +00968 DEVANAGARI DIGIT TWO +00969 DEVANAGARI DIGIT THREE +0096A DEVANAGARI DIGIT FOUR +0096B DEVANAGARI DIGIT FIVE +0096C DEVANAGARI DIGIT SIX +0096D DEVANAGARI DIGIT SEVEN +0096E DEVANAGARI DIGIT EIGHT +0096F DEVANAGARI DIGIT NINE +00970 DEVANAGARI ABBREVIATION SIGN +00971 DEVANAGARI SIGN HIGH SPACING DOT +00972 DEVANAGARI LETTER CANDRA A +00973 DEVANAGARI LETTER OE +00974 DEVANAGARI LETTER OOE +00975 DEVANAGARI LETTER AW +00976 DEVANAGARI LETTER UE +00977 DEVANAGARI LETTER UUE +00978 DEVANAGARI LETTER MARWARI DDA +00979 DEVANAGARI LETTER ZHA +0097A DEVANAGARI LETTER HEAVY YA +0097B DEVANAGARI LETTER GGA +0097C DEVANAGARI LETTER JJA +0097D DEVANAGARI LETTER GLOTTAL STOP +0097E DEVANAGARI LETTER DDDA +0097F DEVANAGARI LETTER BBA +00980 BENGALI ANJI +00981 BENGALI SIGN CANDRABINDU +00982 BENGALI SIGN ANUSVARA +00983 BENGALI SIGN VISARGA +00985 BENGALI LETTER A +00986 BENGALI LETTER AA +00987 BENGALI LETTER I +00988 BENGALI LETTER II +00989 BENGALI LETTER U +0098A BENGALI LETTER UU +0098B BENGALI LETTER VOCALIC R +0098C BENGALI LETTER VOCALIC L +0098F BENGALI LETTER E +00990 BENGALI LETTER AI +00993 BENGALI LETTER O +00994 BENGALI LETTER AU +00995 BENGALI LETTER KA +00996 BENGALI LETTER KHA +00997 BENGALI LETTER GA +00998 BENGALI LETTER GHA +00999 BENGALI LETTER NGA +0099A BENGALI LETTER CA +0099B BENGALI LETTER CHA +0099C BENGALI LETTER JA +0099D BENGALI LETTER JHA +0099E BENGALI LETTER NYA +0099F BENGALI LETTER TTA +009A0 BENGALI LETTER TTHA +009A1 BENGALI LETTER DDA +009A2 BENGALI LETTER DDHA +009A3 BENGALI LETTER NNA +009A4 BENGALI LETTER TA +009A5 BENGALI LETTER THA +009A6 BENGALI LETTER DA +009A7 BENGALI LETTER DHA +009A8 BENGALI LETTER NA +009AA BENGALI LETTER PA +009AB BENGALI LETTER PHA +009AC BENGALI LETTER BA +009AD BENGALI LETTER BHA +009AE BENGALI LETTER MA +009AF BENGALI LETTER YA +009B0 BENGALI LETTER RA +009B2 BENGALI LETTER LA +009B6 BENGALI LETTER SHA +009B7 BENGALI LETTER SSA +009B8 BENGALI LETTER SA +009B9 BENGALI LETTER HA +009BC BENGALI SIGN NUKTA +009BD BENGALI SIGN AVAGRAHA +009BE BENGALI VOWEL SIGN AA +009BF BENGALI VOWEL SIGN I +009C0 BENGALI VOWEL SIGN II +009C1 BENGALI VOWEL SIGN U +009C2 BENGALI VOWEL SIGN UU +009C3 BENGALI VOWEL SIGN VOCALIC R +009C4 BENGALI VOWEL SIGN VOCALIC RR +009C7 BENGALI VOWEL SIGN E +009C8 BENGALI VOWEL SIGN AI +009CB BENGALI VOWEL SIGN O +009CC BENGALI VOWEL SIGN AU +009CD BENGALI SIGN VIRAMA +009CE BENGALI LETTER KHANDA TA +009D7 BENGALI AU LENGTH MARK +009DC BENGALI LETTER RRA +009DD BENGALI LETTER RHA +009DF BENGALI LETTER YYA +009E0 BENGALI LETTER VOCALIC RR +009E1 BENGALI LETTER VOCALIC LL +009E2 BENGALI VOWEL SIGN VOCALIC L +009E3 BENGALI VOWEL SIGN VOCALIC LL +009E6 BENGALI DIGIT ZERO +009E7 BENGALI DIGIT ONE +009E8 BENGALI DIGIT TWO +009E9 BENGALI DIGIT THREE +009EA BENGALI DIGIT FOUR +009EB BENGALI DIGIT FIVE +009EC BENGALI DIGIT SIX +009ED BENGALI DIGIT SEVEN +009EE BENGALI DIGIT EIGHT +009EF BENGALI DIGIT NINE +009F0 BENGALI LETTER RA WITH MIDDLE DIAGONAL +009F1 BENGALI LETTER RA WITH LOWER DIAGONAL +009F2 BENGALI RUPEE MARK +009F3 BENGALI RUPEE SIGN +009F4 BENGALI CURRENCY NUMERATOR ONE +009F5 BENGALI CURRENCY NUMERATOR TWO +009F6 BENGALI CURRENCY NUMERATOR THREE +009F7 BENGALI CURRENCY NUMERATOR FOUR +009F8 BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +009F9 BENGALI CURRENCY DENOMINATOR SIXTEEN +009FA BENGALI ISSHAR +009FB BENGALI GANDA MARK +009FC BENGALI LETTER VEDIC ANUSVARA +009FD BENGALI ABBREVIATION SIGN +00A01 GURMUKHI SIGN ADAK BINDI +00A02 GURMUKHI SIGN BINDI +00A03 GURMUKHI SIGN VISARGA +00A05 GURMUKHI LETTER A +00A06 GURMUKHI LETTER AA +00A07 GURMUKHI LETTER I +00A08 GURMUKHI LETTER II +00A09 GURMUKHI LETTER U +00A0A GURMUKHI LETTER UU +00A0F GURMUKHI LETTER EE +00A10 GURMUKHI LETTER AI +00A13 GURMUKHI LETTER OO +00A14 GURMUKHI LETTER AU +00A15 GURMUKHI LETTER KA +00A16 GURMUKHI LETTER KHA +00A17 GURMUKHI LETTER GA +00A18 GURMUKHI LETTER GHA +00A19 GURMUKHI LETTER NGA +00A1A GURMUKHI LETTER CA +00A1B GURMUKHI LETTER CHA +00A1C GURMUKHI LETTER JA +00A1D GURMUKHI LETTER JHA +00A1E GURMUKHI LETTER NYA +00A1F GURMUKHI LETTER TTA +00A20 GURMUKHI LETTER TTHA +00A21 GURMUKHI LETTER DDA +00A22 GURMUKHI LETTER DDHA +00A23 GURMUKHI LETTER NNA +00A24 GURMUKHI LETTER TA +00A25 GURMUKHI LETTER THA +00A26 GURMUKHI LETTER DA +00A27 GURMUKHI LETTER DHA +00A28 GURMUKHI LETTER NA +00A2A GURMUKHI LETTER PA +00A2B GURMUKHI LETTER PHA +00A2C GURMUKHI LETTER BA +00A2D GURMUKHI LETTER BHA +00A2E GURMUKHI LETTER MA +00A2F GURMUKHI LETTER YA +00A30 GURMUKHI LETTER RA +00A32 GURMUKHI LETTER LA +00A33 GURMUKHI LETTER LLA +00A35 GURMUKHI LETTER VA +00A36 GURMUKHI LETTER SHA +00A38 GURMUKHI LETTER SA +00A39 GURMUKHI LETTER HA +00A3C GURMUKHI SIGN NUKTA +00A3E GURMUKHI VOWEL SIGN AA +00A3F GURMUKHI VOWEL SIGN I +00A40 GURMUKHI VOWEL SIGN II +00A41 GURMUKHI VOWEL SIGN U +00A42 GURMUKHI VOWEL SIGN UU +00A47 GURMUKHI VOWEL SIGN EE +00A48 GURMUKHI VOWEL SIGN AI +00A4B GURMUKHI VOWEL SIGN OO +00A4C GURMUKHI VOWEL SIGN AU +00A4D GURMUKHI SIGN VIRAMA +00A51 GURMUKHI SIGN UDAAT +00A59 GURMUKHI LETTER KHHA +00A5A GURMUKHI LETTER GHHA +00A5B GURMUKHI LETTER ZA +00A5C GURMUKHI LETTER RRA +00A5E GURMUKHI LETTER FA +00A66 GURMUKHI DIGIT ZERO +00A67 GURMUKHI DIGIT ONE +00A68 GURMUKHI DIGIT TWO +00A69 GURMUKHI DIGIT THREE +00A6A GURMUKHI DIGIT FOUR +00A6B GURMUKHI DIGIT FIVE +00A6C GURMUKHI DIGIT SIX +00A6D GURMUKHI DIGIT SEVEN +00A6E GURMUKHI DIGIT EIGHT +00A6F GURMUKHI DIGIT NINE +00A70 GURMUKHI TIPPI +00A71 GURMUKHI ADDAK +00A72 GURMUKHI IRI +00A73 GURMUKHI URA +00A74 GURMUKHI EK ONKAR +00A75 GURMUKHI SIGN YAKASH +00A81 GUJARATI SIGN CANDRABINDU +00A82 GUJARATI SIGN ANUSVARA +00A83 GUJARATI SIGN VISARGA +00A85 GUJARATI LETTER A +00A86 GUJARATI LETTER AA +00A87 GUJARATI LETTER I +00A88 GUJARATI LETTER II +00A89 GUJARATI LETTER U +00A8A GUJARATI LETTER UU +00A8B GUJARATI LETTER VOCALIC R +00A8C GUJARATI LETTER VOCALIC L +00A8D GUJARATI VOWEL CANDRA E +00A8F GUJARATI LETTER E +00A90 GUJARATI LETTER AI +00A91 GUJARATI VOWEL CANDRA O +00A93 GUJARATI LETTER O +00A94 GUJARATI LETTER AU +00A95 GUJARATI LETTER KA +00A96 GUJARATI LETTER KHA +00A97 GUJARATI LETTER GA +00A98 GUJARATI LETTER GHA +00A99 GUJARATI LETTER NGA +00A9A GUJARATI LETTER CA +00A9B GUJARATI LETTER CHA +00A9C GUJARATI LETTER JA +00A9D GUJARATI LETTER JHA +00A9E GUJARATI LETTER NYA +00A9F GUJARATI LETTER TTA +00AA0 GUJARATI LETTER TTHA +00AA1 GUJARATI LETTER DDA +00AA2 GUJARATI LETTER DDHA +00AA3 GUJARATI LETTER NNA +00AA4 GUJARATI LETTER TA +00AA5 GUJARATI LETTER THA +00AA6 GUJARATI LETTER DA +00AA7 GUJARATI LETTER DHA +00AA8 GUJARATI LETTER NA +00AAA GUJARATI LETTER PA +00AAB GUJARATI LETTER PHA +00AAC GUJARATI LETTER BA +00AAD GUJARATI LETTER BHA +00AAE GUJARATI LETTER MA +00AAF GUJARATI LETTER YA +00AB0 GUJARATI LETTER RA +00AB2 GUJARATI LETTER LA +00AB3 GUJARATI LETTER LLA +00AB5 GUJARATI LETTER VA +00AB6 GUJARATI LETTER SHA +00AB7 GUJARATI LETTER SSA +00AB8 GUJARATI LETTER SA +00AB9 GUJARATI LETTER HA +00ABC GUJARATI SIGN NUKTA +00ABD GUJARATI SIGN AVAGRAHA +00ABE GUJARATI VOWEL SIGN AA +00ABF GUJARATI VOWEL SIGN I +00AC0 GUJARATI VOWEL SIGN II +00AC1 GUJARATI VOWEL SIGN U +00AC2 GUJARATI VOWEL SIGN UU +00AC3 GUJARATI VOWEL SIGN VOCALIC R +00AC4 GUJARATI VOWEL SIGN VOCALIC RR +00AC5 GUJARATI VOWEL SIGN CANDRA E +00AC7 GUJARATI VOWEL SIGN E +00AC8 GUJARATI VOWEL SIGN AI +00AC9 GUJARATI VOWEL SIGN CANDRA O +00ACB GUJARATI VOWEL SIGN O +00ACC GUJARATI VOWEL SIGN AU +00ACD GUJARATI SIGN VIRAMA +00AD0 GUJARATI OM +00AE0 GUJARATI LETTER VOCALIC RR +00AE1 GUJARATI LETTER VOCALIC LL +00AE2 GUJARATI VOWEL SIGN VOCALIC L +00AE3 GUJARATI VOWEL SIGN VOCALIC LL +00AE6 GUJARATI DIGIT ZERO +00AE7 GUJARATI DIGIT ONE +00AE8 GUJARATI DIGIT TWO +00AE9 GUJARATI DIGIT THREE +00AEA GUJARATI DIGIT FOUR +00AEB GUJARATI DIGIT FIVE +00AEC GUJARATI DIGIT SIX +00AED GUJARATI DIGIT SEVEN +00AEE GUJARATI DIGIT EIGHT +00AEF GUJARATI DIGIT NINE +00AF0 GUJARATI ABBREVIATION SIGN +00AF1 GUJARATI RUPEE SIGN +00AF9 GUJARATI LETTER ZHA +00AFA GUJARATI SIGN SUKUN +00AFB GUJARATI SIGN SHADDA +00AFC GUJARATI SIGN MADDAH +00AFD GUJARATI SIGN THREE-DOT NUKTA ABOVE +00AFE GUJARATI SIGN CIRCLE NUKTA ABOVE +00AFF GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +00B01 ORIYA SIGN CANDRABINDU +00B02 ORIYA SIGN ANUSVARA +00B03 ORIYA SIGN VISARGA +00B05 ORIYA LETTER A +00B06 ORIYA LETTER AA +00B07 ORIYA LETTER I +00B08 ORIYA LETTER II +00B09 ORIYA LETTER U +00B0A ORIYA LETTER UU +00B0B ORIYA LETTER VOCALIC R +00B0C ORIYA LETTER VOCALIC L +00B0F ORIYA LETTER E +00B10 ORIYA LETTER AI +00B13 ORIYA LETTER O +00B14 ORIYA LETTER AU +00B15 ORIYA LETTER KA +00B16 ORIYA LETTER KHA +00B17 ORIYA LETTER GA +00B18 ORIYA LETTER GHA +00B19 ORIYA LETTER NGA +00B1A ORIYA LETTER CA +00B1B ORIYA LETTER CHA +00B1C ORIYA LETTER JA +00B1D ORIYA LETTER JHA +00B1E ORIYA LETTER NYA +00B1F ORIYA LETTER TTA +00B20 ORIYA LETTER TTHA +00B21 ORIYA LETTER DDA +00B22 ORIYA LETTER DDHA +00B23 ORIYA LETTER NNA +00B24 ORIYA LETTER TA +00B25 ORIYA LETTER THA +00B26 ORIYA LETTER DA +00B27 ORIYA LETTER DHA +00B28 ORIYA LETTER NA +00B2A ORIYA LETTER PA +00B2B ORIYA LETTER PHA +00B2C ORIYA LETTER BA +00B2D ORIYA LETTER BHA +00B2E ORIYA LETTER MA +00B2F ORIYA LETTER YA +00B30 ORIYA LETTER RA +00B32 ORIYA LETTER LA +00B33 ORIYA LETTER LLA +00B35 ORIYA LETTER VA +00B36 ORIYA LETTER SHA +00B37 ORIYA LETTER SSA +00B38 ORIYA LETTER SA +00B39 ORIYA LETTER HA +00B3C ORIYA SIGN NUKTA +00B3D ORIYA SIGN AVAGRAHA +00B3E ORIYA VOWEL SIGN AA +00B3F ORIYA VOWEL SIGN I +00B40 ORIYA VOWEL SIGN II +00B41 ORIYA VOWEL SIGN U +00B42 ORIYA VOWEL SIGN UU +00B43 ORIYA VOWEL SIGN VOCALIC R +00B44 ORIYA VOWEL SIGN VOCALIC RR +00B47 ORIYA VOWEL SIGN E +00B48 ORIYA VOWEL SIGN AI +00B4B ORIYA VOWEL SIGN O +00B4C ORIYA VOWEL SIGN AU +00B4D ORIYA SIGN VIRAMA +00B56 ORIYA AI LENGTH MARK +00B57 ORIYA AU LENGTH MARK +00B5C ORIYA LETTER RRA +00B5D ORIYA LETTER RHA +00B5F ORIYA LETTER YYA +00B60 ORIYA LETTER VOCALIC RR +00B61 ORIYA LETTER VOCALIC LL +00B62 ORIYA VOWEL SIGN VOCALIC L +00B63 ORIYA VOWEL SIGN VOCALIC LL +00B66 ORIYA DIGIT ZERO +00B67 ORIYA DIGIT ONE +00B68 ORIYA DIGIT TWO +00B69 ORIYA DIGIT THREE +00B6A ORIYA DIGIT FOUR +00B6B ORIYA DIGIT FIVE +00B6C ORIYA DIGIT SIX +00B6D ORIYA DIGIT SEVEN +00B6E ORIYA DIGIT EIGHT +00B6F ORIYA DIGIT NINE +00B70 ORIYA ISSHAR +00B71 ORIYA LETTER WA +00B72 ORIYA FRACTION ONE QUARTER +00B73 ORIYA FRACTION ONE HALF +00B74 ORIYA FRACTION THREE QUARTERS +00B75 ORIYA FRACTION ONE SIXTEENTH +00B76 ORIYA FRACTION ONE EIGHTH +00B77 ORIYA FRACTION THREE SIXTEENTHS +00B82 TAMIL SIGN ANUSVARA +00B83 TAMIL SIGN VISARGA +00B85 TAMIL LETTER A +00B86 TAMIL LETTER AA +00B87 TAMIL LETTER I +00B88 TAMIL LETTER II +00B89 TAMIL LETTER U +00B8A TAMIL LETTER UU +00B8E TAMIL LETTER E +00B8F TAMIL LETTER EE +00B90 TAMIL LETTER AI +00B92 TAMIL LETTER O +00B93 TAMIL LETTER OO +00B94 TAMIL LETTER AU +00B95 TAMIL LETTER KA +00B99 TAMIL LETTER NGA +00B9A TAMIL LETTER CA +00B9C TAMIL LETTER JA +00B9E TAMIL LETTER NYA +00B9F TAMIL LETTER TTA +00BA3 TAMIL LETTER NNA +00BA4 TAMIL LETTER TA +00BA8 TAMIL LETTER NA +00BA9 TAMIL LETTER NNNA +00BAA TAMIL LETTER PA +00BAE TAMIL LETTER MA +00BAF TAMIL LETTER YA +00BB0 TAMIL LETTER RA +00BB1 TAMIL LETTER RRA +00BB2 TAMIL LETTER LA +00BB3 TAMIL LETTER LLA +00BB4 TAMIL LETTER LLLA +00BB5 TAMIL LETTER VA +00BB6 TAMIL LETTER SHA +00BB7 TAMIL LETTER SSA +00BB8 TAMIL LETTER SA +00BB9 TAMIL LETTER HA +00BBE TAMIL VOWEL SIGN AA +00BBF TAMIL VOWEL SIGN I +00BC0 TAMIL VOWEL SIGN II +00BC1 TAMIL VOWEL SIGN U +00BC2 TAMIL VOWEL SIGN UU +00BC6 TAMIL VOWEL SIGN E +00BC7 TAMIL VOWEL SIGN EE +00BC8 TAMIL VOWEL SIGN AI +00BCA TAMIL VOWEL SIGN O +00BCB TAMIL VOWEL SIGN OO +00BCC TAMIL VOWEL SIGN AU +00BCD TAMIL SIGN VIRAMA +00BD0 TAMIL OM +00BD7 TAMIL AU LENGTH MARK +00BE6 TAMIL DIGIT ZERO +00BE7 TAMIL DIGIT ONE +00BE8 TAMIL DIGIT TWO +00BE9 TAMIL DIGIT THREE +00BEA TAMIL DIGIT FOUR +00BEB TAMIL DIGIT FIVE +00BEC TAMIL DIGIT SIX +00BED TAMIL DIGIT SEVEN +00BEE TAMIL DIGIT EIGHT +00BEF TAMIL DIGIT NINE +00BF0 TAMIL NUMBER TEN +00BF1 TAMIL NUMBER ONE HUNDRED +00BF2 TAMIL NUMBER ONE THOUSAND +00BF3 TAMIL DAY SIGN +00BF4 TAMIL MONTH SIGN +00BF5 TAMIL YEAR SIGN +00BF6 TAMIL DEBIT SIGN +00BF7 TAMIL CREDIT SIGN +00BF8 TAMIL AS ABOVE SIGN +00BF9 TAMIL RUPEE SIGN +00BFA TAMIL NUMBER SIGN +00C00 TELUGU SIGN COMBINING CANDRABINDU ABOVE +00C01 TELUGU SIGN CANDRABINDU +00C02 TELUGU SIGN ANUSVARA +00C03 TELUGU SIGN VISARGA +00C05 TELUGU LETTER A +00C06 TELUGU LETTER AA +00C07 TELUGU LETTER I +00C08 TELUGU LETTER II +00C09 TELUGU LETTER U +00C0A TELUGU LETTER UU +00C0B TELUGU LETTER VOCALIC R +00C0C TELUGU LETTER VOCALIC L +00C0E TELUGU LETTER E +00C0F TELUGU LETTER EE +00C10 TELUGU LETTER AI +00C12 TELUGU LETTER O +00C13 TELUGU LETTER OO +00C14 TELUGU LETTER AU +00C15 TELUGU LETTER KA +00C16 TELUGU LETTER KHA +00C17 TELUGU LETTER GA +00C18 TELUGU LETTER GHA +00C19 TELUGU LETTER NGA +00C1A TELUGU LETTER CA +00C1B TELUGU LETTER CHA +00C1C TELUGU LETTER JA +00C1D TELUGU LETTER JHA +00C1E TELUGU LETTER NYA +00C1F TELUGU LETTER TTA +00C20 TELUGU LETTER TTHA +00C21 TELUGU LETTER DDA +00C22 TELUGU LETTER DDHA +00C23 TELUGU LETTER NNA +00C24 TELUGU LETTER TA +00C25 TELUGU LETTER THA +00C26 TELUGU LETTER DA +00C27 TELUGU LETTER DHA +00C28 TELUGU LETTER NA +00C2A TELUGU LETTER PA +00C2B TELUGU LETTER PHA +00C2C TELUGU LETTER BA +00C2D TELUGU LETTER BHA +00C2E TELUGU LETTER MA +00C2F TELUGU LETTER YA +00C30 TELUGU LETTER RA +00C31 TELUGU LETTER RRA +00C32 TELUGU LETTER LA +00C33 TELUGU LETTER LLA +00C34 TELUGU LETTER LLLA +00C35 TELUGU LETTER VA +00C36 TELUGU LETTER SHA +00C37 TELUGU LETTER SSA +00C38 TELUGU LETTER SA +00C39 TELUGU LETTER HA +00C3D TELUGU SIGN AVAGRAHA +00C3E TELUGU VOWEL SIGN AA +00C3F TELUGU VOWEL SIGN I +00C40 TELUGU VOWEL SIGN II +00C41 TELUGU VOWEL SIGN U +00C42 TELUGU VOWEL SIGN UU +00C43 TELUGU VOWEL SIGN VOCALIC R +00C44 TELUGU VOWEL SIGN VOCALIC RR +00C46 TELUGU VOWEL SIGN E +00C47 TELUGU VOWEL SIGN EE +00C48 TELUGU VOWEL SIGN AI +00C4A TELUGU VOWEL SIGN O +00C4B TELUGU VOWEL SIGN OO +00C4C TELUGU VOWEL SIGN AU +00C4D TELUGU SIGN VIRAMA +00C55 TELUGU LENGTH MARK +00C56 TELUGU AI LENGTH MARK +00C58 TELUGU LETTER TSA +00C59 TELUGU LETTER DZA +00C5A TELUGU LETTER RRRA +00C60 TELUGU LETTER VOCALIC RR +00C61 TELUGU LETTER VOCALIC LL +00C62 TELUGU VOWEL SIGN VOCALIC L +00C63 TELUGU VOWEL SIGN VOCALIC LL +00C66 TELUGU DIGIT ZERO +00C67 TELUGU DIGIT ONE +00C68 TELUGU DIGIT TWO +00C69 TELUGU DIGIT THREE +00C6A TELUGU DIGIT FOUR +00C6B TELUGU DIGIT FIVE +00C6C TELUGU DIGIT SIX +00C6D TELUGU DIGIT SEVEN +00C6E TELUGU DIGIT EIGHT +00C6F TELUGU DIGIT NINE +00C78 TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR +00C79 TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR +00C7A TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR +00C7B TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR +00C7C TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR +00C7D TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR +00C7E TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +00C7F TELUGU SIGN TUUMU +00C80 KANNADA SIGN SPACING CANDRABINDU +00C81 KANNADA SIGN CANDRABINDU +00C82 KANNADA SIGN ANUSVARA +00C83 KANNADA SIGN VISARGA +00C85 KANNADA LETTER A +00C86 KANNADA LETTER AA +00C87 KANNADA LETTER I +00C88 KANNADA LETTER II +00C89 KANNADA LETTER U +00C8A KANNADA LETTER UU +00C8B KANNADA LETTER VOCALIC R +00C8C KANNADA LETTER VOCALIC L +00C8E KANNADA LETTER E +00C8F KANNADA LETTER EE +00C90 KANNADA LETTER AI +00C92 KANNADA LETTER O +00C93 KANNADA LETTER OO +00C94 KANNADA LETTER AU +00C95 KANNADA LETTER KA +00C96 KANNADA LETTER KHA +00C97 KANNADA LETTER GA +00C98 KANNADA LETTER GHA +00C99 KANNADA LETTER NGA +00C9A KANNADA LETTER CA +00C9B KANNADA LETTER CHA +00C9C KANNADA LETTER JA +00C9D KANNADA LETTER JHA +00C9E KANNADA LETTER NYA +00C9F KANNADA LETTER TTA +00CA0 KANNADA LETTER TTHA +00CA1 KANNADA LETTER DDA +00CA2 KANNADA LETTER DDHA +00CA3 KANNADA LETTER NNA +00CA4 KANNADA LETTER TA +00CA5 KANNADA LETTER THA +00CA6 KANNADA LETTER DA +00CA7 KANNADA LETTER DHA +00CA8 KANNADA LETTER NA +00CAA KANNADA LETTER PA +00CAB KANNADA LETTER PHA +00CAC KANNADA LETTER BA +00CAD KANNADA LETTER BHA +00CAE KANNADA LETTER MA +00CAF KANNADA LETTER YA +00CB0 KANNADA LETTER RA +00CB1 KANNADA LETTER RRA +00CB2 KANNADA LETTER LA +00CB3 KANNADA LETTER LLA +00CB5 KANNADA LETTER VA +00CB6 KANNADA LETTER SHA +00CB7 KANNADA LETTER SSA +00CB8 KANNADA LETTER SA +00CB9 KANNADA LETTER HA +00CBC KANNADA SIGN NUKTA +00CBD KANNADA SIGN AVAGRAHA +00CBE KANNADA VOWEL SIGN AA +00CBF KANNADA VOWEL SIGN I +00CC0 KANNADA VOWEL SIGN II +00CC1 KANNADA VOWEL SIGN U +00CC2 KANNADA VOWEL SIGN UU +00CC3 KANNADA VOWEL SIGN VOCALIC R +00CC4 KANNADA VOWEL SIGN VOCALIC RR +00CC6 KANNADA VOWEL SIGN E +00CC7 KANNADA VOWEL SIGN EE +00CC8 KANNADA VOWEL SIGN AI +00CCA KANNADA VOWEL SIGN O +00CCB KANNADA VOWEL SIGN OO +00CCC KANNADA VOWEL SIGN AU +00CCD KANNADA SIGN VIRAMA +00CD5 KANNADA LENGTH MARK +00CD6 KANNADA AI LENGTH MARK +00CDE KANNADA LETTER LLLA +00CDE KANNADA LETTER FA +00CE0 KANNADA LETTER VOCALIC RR +00CE1 KANNADA LETTER VOCALIC LL +00CE2 KANNADA VOWEL SIGN VOCALIC L +00CE3 KANNADA VOWEL SIGN VOCALIC LL +00CE6 KANNADA DIGIT ZERO +00CE7 KANNADA DIGIT ONE +00CE8 KANNADA DIGIT TWO +00CE9 KANNADA DIGIT THREE +00CEA KANNADA DIGIT FOUR +00CEB KANNADA DIGIT FIVE +00CEC KANNADA DIGIT SIX +00CED KANNADA DIGIT SEVEN +00CEE KANNADA DIGIT EIGHT +00CEF KANNADA DIGIT NINE +00CF1 KANNADA SIGN JIHVAMULIYA +00CF2 KANNADA SIGN UPADHMANIYA +00D00 MALAYALAM SIGN COMBINING ANUSVARA ABOVE +00D01 MALAYALAM SIGN CANDRABINDU +00D02 MALAYALAM SIGN ANUSVARA +00D03 MALAYALAM SIGN VISARGA +00D05 MALAYALAM LETTER A +00D06 MALAYALAM LETTER AA +00D07 MALAYALAM LETTER I +00D08 MALAYALAM LETTER II +00D09 MALAYALAM LETTER U +00D0A MALAYALAM LETTER UU +00D0B MALAYALAM LETTER VOCALIC R +00D0C MALAYALAM LETTER VOCALIC L +00D0E MALAYALAM LETTER E +00D0F MALAYALAM LETTER EE +00D10 MALAYALAM LETTER AI +00D12 MALAYALAM LETTER O +00D13 MALAYALAM LETTER OO +00D14 MALAYALAM LETTER AU +00D15 MALAYALAM LETTER KA +00D16 MALAYALAM LETTER KHA +00D17 MALAYALAM LETTER GA +00D18 MALAYALAM LETTER GHA +00D19 MALAYALAM LETTER NGA +00D1A MALAYALAM LETTER CA +00D1B MALAYALAM LETTER CHA +00D1C MALAYALAM LETTER JA +00D1D MALAYALAM LETTER JHA +00D1E MALAYALAM LETTER NYA +00D1F MALAYALAM LETTER TTA +00D20 MALAYALAM LETTER TTHA +00D21 MALAYALAM LETTER DDA +00D22 MALAYALAM LETTER DDHA +00D23 MALAYALAM LETTER NNA +00D24 MALAYALAM LETTER TA +00D25 MALAYALAM LETTER THA +00D26 MALAYALAM LETTER DA +00D27 MALAYALAM LETTER DHA +00D28 MALAYALAM LETTER NA +00D29 MALAYALAM LETTER NNNA +00D2A MALAYALAM LETTER PA +00D2B MALAYALAM LETTER PHA +00D2C MALAYALAM LETTER BA +00D2D MALAYALAM LETTER BHA +00D2E MALAYALAM LETTER MA +00D2F MALAYALAM LETTER YA +00D30 MALAYALAM LETTER RA +00D31 MALAYALAM LETTER RRA +00D32 MALAYALAM LETTER LA +00D33 MALAYALAM LETTER LLA +00D34 MALAYALAM LETTER LLLA +00D35 MALAYALAM LETTER VA +00D36 MALAYALAM LETTER SHA +00D37 MALAYALAM LETTER SSA +00D38 MALAYALAM LETTER SA +00D39 MALAYALAM LETTER HA +00D3A MALAYALAM LETTER TTTA +00D3B MALAYALAM SIGN VERTICAL BAR VIRAMA +00D3C MALAYALAM SIGN CIRCULAR VIRAMA +00D3D MALAYALAM SIGN AVAGRAHA +00D3E MALAYALAM VOWEL SIGN AA +00D3F MALAYALAM VOWEL SIGN I +00D40 MALAYALAM VOWEL SIGN II +00D41 MALAYALAM VOWEL SIGN U +00D42 MALAYALAM VOWEL SIGN UU +00D43 MALAYALAM VOWEL SIGN VOCALIC R +00D44 MALAYALAM VOWEL SIGN VOCALIC RR +00D46 MALAYALAM VOWEL SIGN E +00D47 MALAYALAM VOWEL SIGN EE +00D48 MALAYALAM VOWEL SIGN AI +00D4A MALAYALAM VOWEL SIGN O +00D4B MALAYALAM VOWEL SIGN OO +00D4C MALAYALAM VOWEL SIGN AU +00D4D MALAYALAM SIGN VIRAMA +00D4E MALAYALAM LETTER DOT REPH +00D4F MALAYALAM SIGN PARA +00D54 MALAYALAM LETTER CHILLU M +00D55 MALAYALAM LETTER CHILLU Y +00D56 MALAYALAM LETTER CHILLU LLL +00D57 MALAYALAM AU LENGTH MARK +00D58 MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH +00D59 MALAYALAM FRACTION ONE FORTIETH +00D5A MALAYALAM FRACTION THREE EIGHTIETHS +00D5B MALAYALAM FRACTION ONE TWENTIETH +00D5C MALAYALAM FRACTION ONE TENTH +00D5D MALAYALAM FRACTION THREE TWENTIETHS +00D5E MALAYALAM FRACTION ONE FIFTH +00D5F MALAYALAM LETTER ARCHAIC II +00D60 MALAYALAM LETTER VOCALIC RR +00D61 MALAYALAM LETTER VOCALIC LL +00D62 MALAYALAM VOWEL SIGN VOCALIC L +00D63 MALAYALAM VOWEL SIGN VOCALIC LL +00D66 MALAYALAM DIGIT ZERO +00D67 MALAYALAM DIGIT ONE +00D68 MALAYALAM DIGIT TWO +00D69 MALAYALAM DIGIT THREE +00D6A MALAYALAM DIGIT FOUR +00D6B MALAYALAM DIGIT FIVE +00D6C MALAYALAM DIGIT SIX +00D6D MALAYALAM DIGIT SEVEN +00D6E MALAYALAM DIGIT EIGHT +00D6F MALAYALAM DIGIT NINE +00D70 MALAYALAM NUMBER TEN +00D71 MALAYALAM NUMBER ONE HUNDRED +00D72 MALAYALAM NUMBER ONE THOUSAND +00D73 MALAYALAM FRACTION ONE QUARTER +00D74 MALAYALAM FRACTION ONE HALF +00D75 MALAYALAM FRACTION THREE QUARTERS +00D76 MALAYALAM FRACTION ONE SIXTEENTH +00D77 MALAYALAM FRACTION ONE EIGHTH +00D78 MALAYALAM FRACTION THREE SIXTEENTHS +00D79 MALAYALAM DATE MARK +00D7A MALAYALAM LETTER CHILLU NN +00D7B MALAYALAM LETTER CHILLU N +00D7C MALAYALAM LETTER CHILLU RR +00D7D MALAYALAM LETTER CHILLU L +00D7E MALAYALAM LETTER CHILLU LL +00D7F MALAYALAM LETTER CHILLU K +00D82 SINHALA SIGN ANUSVARAYA +00D83 SINHALA SIGN VISARGAYA +00D85 SINHALA LETTER AYANNA +00D86 SINHALA LETTER AAYANNA +00D87 SINHALA LETTER AEYANNA +00D88 SINHALA LETTER AEEYANNA +00D89 SINHALA LETTER IYANNA +00D8A SINHALA LETTER IIYANNA +00D8B SINHALA LETTER UYANNA +00D8C SINHALA LETTER UUYANNA +00D8D SINHALA LETTER IRUYANNA +00D8E SINHALA LETTER IRUUYANNA +00D8F SINHALA LETTER ILUYANNA +00D90 SINHALA LETTER ILUUYANNA +00D91 SINHALA LETTER EYANNA +00D92 SINHALA LETTER EEYANNA +00D93 SINHALA LETTER AIYANNA +00D94 SINHALA LETTER OYANNA +00D95 SINHALA LETTER OOYANNA +00D96 SINHALA LETTER AUYANNA +00D9A SINHALA LETTER ALPAPRAANA KAYANNA +00D9B SINHALA LETTER MAHAAPRAANA KAYANNA +00D9C SINHALA LETTER ALPAPRAANA GAYANNA +00D9D SINHALA LETTER MAHAAPRAANA GAYANNA +00D9E SINHALA LETTER KANTAJA NAASIKYAYA +00D9F SINHALA LETTER SANYAKA GAYANNA +00DA0 SINHALA LETTER ALPAPRAANA CAYANNA +00DA1 SINHALA LETTER MAHAAPRAANA CAYANNA +00DA2 SINHALA LETTER ALPAPRAANA JAYANNA +00DA3 SINHALA LETTER MAHAAPRAANA JAYANNA +00DA4 SINHALA LETTER TAALUJA NAASIKYAYA +00DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA +00DA6 SINHALA LETTER SANYAKA JAYANNA +00DA7 SINHALA LETTER ALPAPRAANA TTAYANNA +00DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA +00DA9 SINHALA LETTER ALPAPRAANA DDAYANNA +00DAA SINHALA LETTER MAHAAPRAANA DDAYANNA +00DAB SINHALA LETTER MUURDHAJA NAYANNA +00DAC SINHALA LETTER SANYAKA DDAYANNA +00DAD SINHALA LETTER ALPAPRAANA TAYANNA +00DAE SINHALA LETTER MAHAAPRAANA TAYANNA +00DAF SINHALA LETTER ALPAPRAANA DAYANNA +00DB0 SINHALA LETTER MAHAAPRAANA DAYANNA +00DB1 SINHALA LETTER DANTAJA NAYANNA +00DB3 SINHALA LETTER SANYAKA DAYANNA +00DB4 SINHALA LETTER ALPAPRAANA PAYANNA +00DB5 SINHALA LETTER MAHAAPRAANA PAYANNA +00DB6 SINHALA LETTER ALPAPRAANA BAYANNA +00DB7 SINHALA LETTER MAHAAPRAANA BAYANNA +00DB8 SINHALA LETTER MAYANNA +00DB9 SINHALA LETTER AMBA BAYANNA +00DBA SINHALA LETTER YAYANNA +00DBB SINHALA LETTER RAYANNA +00DBD SINHALA LETTER DANTAJA LAYANNA +00DC0 SINHALA LETTER VAYANNA +00DC1 SINHALA LETTER TAALUJA SAYANNA +00DC2 SINHALA LETTER MUURDHAJA SAYANNA +00DC3 SINHALA LETTER DANTAJA SAYANNA +00DC4 SINHALA LETTER HAYANNA +00DC5 SINHALA LETTER MUURDHAJA LAYANNA +00DC6 SINHALA LETTER FAYANNA +00DCA SINHALA SIGN AL-LAKUNA +00DCF SINHALA VOWEL SIGN AELA-PILLA +00DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA +00DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA +00DD2 SINHALA VOWEL SIGN KETTI IS-PILLA +00DD3 SINHALA VOWEL SIGN DIGA IS-PILLA +00DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA +00DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA +00DD8 SINHALA VOWEL SIGN GAETTA-PILLA +00DD9 SINHALA VOWEL SIGN KOMBUVA +00DDA SINHALA VOWEL SIGN DIGA KOMBUVA +00DDB SINHALA VOWEL SIGN KOMBU DEKA +00DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA +00DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA +00DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA +00DDF SINHALA VOWEL SIGN GAYANUKITTA +00DE6 SINHALA LITH DIGIT ZERO +00DE7 SINHALA LITH DIGIT ONE +00DE8 SINHALA LITH DIGIT TWO +00DE9 SINHALA LITH DIGIT THREE +00DEA SINHALA LITH DIGIT FOUR +00DEB SINHALA LITH DIGIT FIVE +00DEC SINHALA LITH DIGIT SIX +00DED SINHALA LITH DIGIT SEVEN +00DEE SINHALA LITH DIGIT EIGHT +00DEF SINHALA LITH DIGIT NINE +00DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA +00DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA +00DF4 SINHALA PUNCTUATION KUNDDALIYA +00E01 THAI CHARACTER KO KAI +00E02 THAI CHARACTER KHO KHAI +00E03 THAI CHARACTER KHO KHUAT +00E04 THAI CHARACTER KHO KHWAI +00E05 THAI CHARACTER KHO KHON +00E06 THAI CHARACTER KHO RAKHANG +00E07 THAI CHARACTER NGO NGU +00E08 THAI CHARACTER CHO CHAN +00E09 THAI CHARACTER CHO CHING +00E0A THAI CHARACTER CHO CHANG +00E0B THAI CHARACTER SO SO +00E0C THAI CHARACTER CHO CHOE +00E0D THAI CHARACTER YO YING +00E0E THAI CHARACTER DO CHADA +00E0F THAI CHARACTER TO PATAK +00E10 THAI CHARACTER THO THAN +00E11 THAI CHARACTER THO NANGMONTHO +00E12 THAI CHARACTER THO PHUTHAO +00E13 THAI CHARACTER NO NEN +00E14 THAI CHARACTER DO DEK +00E15 THAI CHARACTER TO TAO +00E16 THAI CHARACTER THO THUNG +00E17 THAI CHARACTER THO THAHAN +00E18 THAI CHARACTER THO THONG +00E19 THAI CHARACTER NO NU +00E1A THAI CHARACTER BO BAIMAI +00E1B THAI CHARACTER PO PLA +00E1C THAI CHARACTER PHO PHUNG +00E1D THAI CHARACTER FO FA +00E1E THAI CHARACTER PHO PHAN +00E1F THAI CHARACTER FO FAN +00E20 THAI CHARACTER PHO SAMPHAO +00E21 THAI CHARACTER MO MA +00E22 THAI CHARACTER YO YAK +00E23 THAI CHARACTER RO RUA +00E24 THAI CHARACTER RU +00E25 THAI CHARACTER LO LING +00E26 THAI CHARACTER LU +00E27 THAI CHARACTER WO WAEN +00E28 THAI CHARACTER SO SALA +00E29 THAI CHARACTER SO RUSI +00E2A THAI CHARACTER SO SUA +00E2B THAI CHARACTER HO HIP +00E2C THAI CHARACTER LO CHULA +00E2D THAI CHARACTER O ANG +00E2E THAI CHARACTER HO NOKHUK +00E2F THAI CHARACTER PAIYANNOI +00E30 THAI CHARACTER SARA A +00E31 THAI CHARACTER MAI HAN-AKAT +00E32 THAI CHARACTER SARA AA +00E33 THAI CHARACTER SARA AM +00E34 THAI CHARACTER SARA I +00E35 THAI CHARACTER SARA II +00E36 THAI CHARACTER SARA UE +00E37 THAI CHARACTER SARA UEE +00E38 THAI CHARACTER SARA U +00E39 THAI CHARACTER SARA UU +00E3A THAI CHARACTER PHINTHU +00E3F THAI CURRENCY SYMBOL BAHT +00E40 THAI CHARACTER SARA E +00E41 THAI CHARACTER SARA AE +00E42 THAI CHARACTER SARA O +00E43 THAI CHARACTER SARA AI MAIMUAN +00E44 THAI CHARACTER SARA AI MAIMALAI +00E45 THAI CHARACTER LAKKHANGYAO +00E46 THAI CHARACTER MAIYAMOK +00E47 THAI CHARACTER MAITAIKHU +00E48 THAI CHARACTER MAI EK +00E49 THAI CHARACTER MAI THO +00E4A THAI CHARACTER MAI TRI +00E4B THAI CHARACTER MAI CHATTAWA +00E4C THAI CHARACTER THANTHAKHAT +00E4D THAI CHARACTER NIKHAHIT +00E4E THAI CHARACTER YAMAKKAN +00E4F THAI CHARACTER FONGMAN +00E50 THAI DIGIT ZERO +00E51 THAI DIGIT ONE +00E52 THAI DIGIT TWO +00E53 THAI DIGIT THREE +00E54 THAI DIGIT FOUR +00E55 THAI DIGIT FIVE +00E56 THAI DIGIT SIX +00E57 THAI DIGIT SEVEN +00E58 THAI DIGIT EIGHT +00E59 THAI DIGIT NINE +00E5A THAI CHARACTER ANGKHANKHU +00E5B THAI CHARACTER KHOMUT +00E81 LAO LETTER KO +00E82 LAO LETTER KHO SUNG +00E84 LAO LETTER KHO TAM +00E87 LAO LETTER NGO +00E88 LAO LETTER CO +00E8A LAO LETTER SO TAM +00E8D LAO LETTER NYO +00E94 LAO LETTER DO +00E95 LAO LETTER TO +00E96 LAO LETTER THO SUNG +00E97 LAO LETTER THO TAM +00E99 LAO LETTER NO +00E9A LAO LETTER BO +00E9B LAO LETTER PO +00E9C LAO LETTER PHO SUNG +00E9D LAO LETTER FO FON +00E9D LAO LETTER FO TAM +00E9E LAO LETTER PHO TAM +00E9F LAO LETTER FO FAY +00E9F LAO LETTER FO SUNG +00EA1 LAO LETTER MO +00EA2 LAO LETTER YO +00EA3 LAO LETTER RO +00EA3 LAO LETTER LO LING +00EA5 LAO LETTER LO +00EA5 LAO LETTER LO LOOT +00EA7 LAO LETTER WO +00EAA LAO LETTER SO SUNG +00EAB LAO LETTER HO SUNG +00EAD LAO LETTER O +00EAE LAO LETTER HO TAM +00EAF LAO ELLIPSIS +00EB0 LAO VOWEL SIGN A +00EB1 LAO VOWEL SIGN MAI KAN +00EB2 LAO VOWEL SIGN AA +00EB3 LAO VOWEL SIGN AM +00EB4 LAO VOWEL SIGN I +00EB5 LAO VOWEL SIGN II +00EB6 LAO VOWEL SIGN Y +00EB7 LAO VOWEL SIGN YY +00EB8 LAO VOWEL SIGN U +00EB9 LAO VOWEL SIGN UU +00EBB LAO VOWEL SIGN MAI KON +00EBC LAO SEMIVOWEL SIGN LO +00EBD LAO SEMIVOWEL SIGN NYO +00EC0 LAO VOWEL SIGN E +00EC1 LAO VOWEL SIGN EI +00EC2 LAO VOWEL SIGN O +00EC3 LAO VOWEL SIGN AY +00EC4 LAO VOWEL SIGN AI +00EC6 LAO KO LA +00EC8 LAO TONE MAI EK +00EC9 LAO TONE MAI THO +00ECA LAO TONE MAI TI +00ECB LAO TONE MAI CATAWA +00ECC LAO CANCELLATION MARK +00ECD LAO NIGGAHITA +00ED0 LAO DIGIT ZERO +00ED1 LAO DIGIT ONE +00ED2 LAO DIGIT TWO +00ED3 LAO DIGIT THREE +00ED4 LAO DIGIT FOUR +00ED5 LAO DIGIT FIVE +00ED6 LAO DIGIT SIX +00ED7 LAO DIGIT SEVEN +00ED8 LAO DIGIT EIGHT +00ED9 LAO DIGIT NINE +00EDC LAO HO NO +00EDD LAO HO MO +00EDE LAO LETTER KHMU GO +00EDF LAO LETTER KHMU NYO +00F00 TIBETAN SYLLABLE OM +00F01 TIBETAN MARK GTER YIG MGO TRUNCATED A +00F02 TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA +00F03 TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +00F04 TIBETAN MARK INITIAL YIG MGO MDUN MA +00F05 TIBETAN MARK CLOSING YIG MGO SGAB MA +00F06 TIBETAN MARK CARET YIG MGO PHUR SHAD MA +00F07 TIBETAN MARK YIG MGO TSHEG SHAD MA +00F08 TIBETAN MARK SBRUL SHAD +00F09 TIBETAN MARK BSKUR YIG MGO +00F0A TIBETAN MARK BKA- SHOG YIG MGO +00F0B TIBETAN MARK INTERSYLLABIC TSHEG +00F0C TIBETAN MARK DELIMITER TSHEG BSTAR +00F0D TIBETAN MARK SHAD +00F0E TIBETAN MARK NYIS SHAD +00F0F TIBETAN MARK TSHEG SHAD +00F10 TIBETAN MARK NYIS TSHEG SHAD +00F11 TIBETAN MARK RIN CHEN SPUNGS SHAD +00F12 TIBETAN MARK RGYA GRAM SHAD +00F13 TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +00F14 TIBETAN MARK GTER TSHEG +00F15 TIBETAN LOGOTYPE SIGN CHAD RTAGS +00F16 TIBETAN LOGOTYPE SIGN LHAG RTAGS +00F17 TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +00F18 TIBETAN ASTROLOGICAL SIGN -KHYUD PA +00F19 TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +00F1A TIBETAN SIGN RDEL DKAR GCIG +00F1B TIBETAN SIGN RDEL DKAR GNYIS +00F1C TIBETAN SIGN RDEL DKAR GSUM +00F1D TIBETAN SIGN RDEL NAG GCIG +00F1E TIBETAN SIGN RDEL NAG GNYIS +00F1F TIBETAN SIGN RDEL DKAR RDEL NAG +00F20 TIBETAN DIGIT ZERO +00F21 TIBETAN DIGIT ONE +00F22 TIBETAN DIGIT TWO +00F23 TIBETAN DIGIT THREE +00F24 TIBETAN DIGIT FOUR +00F25 TIBETAN DIGIT FIVE +00F26 TIBETAN DIGIT SIX +00F27 TIBETAN DIGIT SEVEN +00F28 TIBETAN DIGIT EIGHT +00F29 TIBETAN DIGIT NINE +00F2A TIBETAN DIGIT HALF ONE +00F2B TIBETAN DIGIT HALF TWO +00F2C TIBETAN DIGIT HALF THREE +00F2D TIBETAN DIGIT HALF FOUR +00F2E TIBETAN DIGIT HALF FIVE +00F2F TIBETAN DIGIT HALF SIX +00F30 TIBETAN DIGIT HALF SEVEN +00F31 TIBETAN DIGIT HALF EIGHT +00F32 TIBETAN DIGIT HALF NINE +00F33 TIBETAN DIGIT HALF ZERO +00F34 TIBETAN MARK BSDUS RTAGS +00F35 TIBETAN MARK NGAS BZUNG NYI ZLA +00F36 TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +00F37 TIBETAN MARK NGAS BZUNG SGOR RTAGS +00F38 TIBETAN MARK CHE MGO +00F39 TIBETAN MARK TSA -PHRU +00F3A TIBETAN MARK GUG RTAGS GYON +00F3B TIBETAN MARK GUG RTAGS GYAS +00F3C TIBETAN MARK ANG KHANG GYON +00F3D TIBETAN MARK ANG KHANG GYAS +00F3E TIBETAN SIGN YAR TSHES +00F3F TIBETAN SIGN MAR TSHES +00F40 TIBETAN LETTER KA +00F41 TIBETAN LETTER KHA +00F42 TIBETAN LETTER GA +00F43 TIBETAN LETTER GHA +00F44 TIBETAN LETTER NGA +00F45 TIBETAN LETTER CA +00F46 TIBETAN LETTER CHA +00F47 TIBETAN LETTER JA +00F49 TIBETAN LETTER NYA +00F4A TIBETAN LETTER TTA +00F4B TIBETAN LETTER TTHA +00F4C TIBETAN LETTER DDA +00F4D TIBETAN LETTER DDHA +00F4E TIBETAN LETTER NNA +00F4F TIBETAN LETTER TA +00F50 TIBETAN LETTER THA +00F51 TIBETAN LETTER DA +00F52 TIBETAN LETTER DHA +00F53 TIBETAN LETTER NA +00F54 TIBETAN LETTER PA +00F55 TIBETAN LETTER PHA +00F56 TIBETAN LETTER BA +00F57 TIBETAN LETTER BHA +00F58 TIBETAN LETTER MA +00F59 TIBETAN LETTER TSA +00F5A TIBETAN LETTER TSHA +00F5B TIBETAN LETTER DZA +00F5C TIBETAN LETTER DZHA +00F5D TIBETAN LETTER WA +00F5E TIBETAN LETTER ZHA +00F5F TIBETAN LETTER ZA +00F60 TIBETAN LETTER -A +00F61 TIBETAN LETTER YA +00F62 TIBETAN LETTER RA +00F63 TIBETAN LETTER LA +00F64 TIBETAN LETTER SHA +00F65 TIBETAN LETTER SSA +00F66 TIBETAN LETTER SA +00F67 TIBETAN LETTER HA +00F68 TIBETAN LETTER A +00F69 TIBETAN LETTER KSSA +00F6A TIBETAN LETTER FIXED-FORM RA +00F6B TIBETAN LETTER KKA +00F6C TIBETAN LETTER RRA +00F71 TIBETAN VOWEL SIGN AA +00F72 TIBETAN VOWEL SIGN I +00F73 TIBETAN VOWEL SIGN II +00F74 TIBETAN VOWEL SIGN U +00F75 TIBETAN VOWEL SIGN UU +00F76 TIBETAN VOWEL SIGN VOCALIC R +00F77 TIBETAN VOWEL SIGN VOCALIC RR +00F78 TIBETAN VOWEL SIGN VOCALIC L +00F79 TIBETAN VOWEL SIGN VOCALIC LL +00F7A TIBETAN VOWEL SIGN E +00F7B TIBETAN VOWEL SIGN EE +00F7C TIBETAN VOWEL SIGN O +00F7D TIBETAN VOWEL SIGN OO +00F7E TIBETAN SIGN RJES SU NGA RO +00F7F TIBETAN SIGN RNAM BCAD +00F80 TIBETAN VOWEL SIGN REVERSED I +00F81 TIBETAN VOWEL SIGN REVERSED II +00F82 TIBETAN SIGN NYI ZLA NAA DA +00F83 TIBETAN SIGN SNA LDAN +00F84 TIBETAN MARK HALANTA +00F85 TIBETAN MARK PALUTA +00F86 TIBETAN SIGN LCI RTAGS +00F87 TIBETAN SIGN YANG RTAGS +00F88 TIBETAN SIGN LCE TSA CAN +00F89 TIBETAN SIGN MCHU CAN +00F8A TIBETAN SIGN GRU CAN RGYINGS +00F8B TIBETAN SIGN GRU MED RGYINGS +00F8C TIBETAN SIGN INVERTED MCHU CAN +00F8D TIBETAN SUBJOINED SIGN LCE TSA CAN +00F8E TIBETAN SUBJOINED SIGN MCHU CAN +00F8F TIBETAN SUBJOINED SIGN INVERTED MCHU CAN +00F90 TIBETAN SUBJOINED LETTER KA +00F91 TIBETAN SUBJOINED LETTER KHA +00F92 TIBETAN SUBJOINED LETTER GA +00F93 TIBETAN SUBJOINED LETTER GHA +00F94 TIBETAN SUBJOINED LETTER NGA +00F95 TIBETAN SUBJOINED LETTER CA +00F96 TIBETAN SUBJOINED LETTER CHA +00F97 TIBETAN SUBJOINED LETTER JA +00F99 TIBETAN SUBJOINED LETTER NYA +00F9A TIBETAN SUBJOINED LETTER TTA +00F9B TIBETAN SUBJOINED LETTER TTHA +00F9C TIBETAN SUBJOINED LETTER DDA +00F9D TIBETAN SUBJOINED LETTER DDHA +00F9E TIBETAN SUBJOINED LETTER NNA +00F9F TIBETAN SUBJOINED LETTER TA +00FA0 TIBETAN SUBJOINED LETTER THA +00FA1 TIBETAN SUBJOINED LETTER DA +00FA2 TIBETAN SUBJOINED LETTER DHA +00FA3 TIBETAN SUBJOINED LETTER NA +00FA4 TIBETAN SUBJOINED LETTER PA +00FA5 TIBETAN SUBJOINED LETTER PHA +00FA6 TIBETAN SUBJOINED LETTER BA +00FA7 TIBETAN SUBJOINED LETTER BHA +00FA8 TIBETAN SUBJOINED LETTER MA +00FA9 TIBETAN SUBJOINED LETTER TSA +00FAA TIBETAN SUBJOINED LETTER TSHA +00FAB TIBETAN SUBJOINED LETTER DZA +00FAC TIBETAN SUBJOINED LETTER DZHA +00FAD TIBETAN SUBJOINED LETTER WA +00FAE TIBETAN SUBJOINED LETTER ZHA +00FAF TIBETAN SUBJOINED LETTER ZA +00FB0 TIBETAN SUBJOINED LETTER -A +00FB1 TIBETAN SUBJOINED LETTER YA +00FB2 TIBETAN SUBJOINED LETTER RA +00FB3 TIBETAN SUBJOINED LETTER LA +00FB4 TIBETAN SUBJOINED LETTER SHA +00FB5 TIBETAN SUBJOINED LETTER SSA +00FB6 TIBETAN SUBJOINED LETTER SA +00FB7 TIBETAN SUBJOINED LETTER HA +00FB8 TIBETAN SUBJOINED LETTER A +00FB9 TIBETAN SUBJOINED LETTER KSSA +00FBA TIBETAN SUBJOINED LETTER FIXED-FORM WA +00FBB TIBETAN SUBJOINED LETTER FIXED-FORM YA +00FBC TIBETAN SUBJOINED LETTER FIXED-FORM RA +00FBE TIBETAN KU RU KHA +00FBF TIBETAN KU RU KHA BZHI MIG CAN +00FC0 TIBETAN CANTILLATION SIGN HEAVY BEAT +00FC1 TIBETAN CANTILLATION SIGN LIGHT BEAT +00FC2 TIBETAN CANTILLATION SIGN CANG TE-U +00FC3 TIBETAN CANTILLATION SIGN SBUB -CHAL +00FC4 TIBETAN SYMBOL DRIL BU +00FC5 TIBETAN SYMBOL RDO RJE +00FC6 TIBETAN SYMBOL PADMA GDAN +00FC7 TIBETAN SYMBOL RDO RJE RGYA GRAM +00FC8 TIBETAN SYMBOL PHUR PA +00FC9 TIBETAN SYMBOL NOR BU +00FCA TIBETAN SYMBOL NOR BU NYIS -KHYIL +00FCB TIBETAN SYMBOL NOR BU GSUM -KHYIL +00FCC TIBETAN SYMBOL NOR BU BZHI -KHYIL +00FCE TIBETAN SIGN RDEL NAG RDEL DKAR +00FCF TIBETAN SIGN RDEL NAG GSUM +00FD0 TIBETAN MARK BKA- SHOG GI MGO RGYAN +00FD0 TIBETAN MARK BSKA- SHOG GI MGO RGYAN +00FD1 TIBETAN MARK MNYAM YIG GI MGO RGYAN +00FD2 TIBETAN MARK NYIS TSHEG +00FD3 TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA +00FD4 TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +00FD5 RIGHT-FACING SVASTI SIGN +00FD6 LEFT-FACING SVASTI SIGN +00FD7 RIGHT-FACING SVASTI SIGN WITH DOTS +00FD8 LEFT-FACING SVASTI SIGN WITH DOTS +00FD9 TIBETAN MARK LEADING MCHAN RTAGS +00FDA TIBETAN MARK TRAILING MCHAN RTAGS +01000 MYANMAR LETTER KA +01001 MYANMAR LETTER KHA +01002 MYANMAR LETTER GA +01003 MYANMAR LETTER GHA +01004 MYANMAR LETTER NGA +01005 MYANMAR LETTER CA +01006 MYANMAR LETTER CHA +01007 MYANMAR LETTER JA +01008 MYANMAR LETTER JHA +01009 MYANMAR LETTER NYA +0100A MYANMAR LETTER NNYA +0100B MYANMAR LETTER TTA +0100C MYANMAR LETTER TTHA +0100D MYANMAR LETTER DDA +0100E MYANMAR LETTER DDHA +0100F MYANMAR LETTER NNA +01010 MYANMAR LETTER TA +01011 MYANMAR LETTER THA +01012 MYANMAR LETTER DA +01013 MYANMAR LETTER DHA +01014 MYANMAR LETTER NA +01015 MYANMAR LETTER PA +01016 MYANMAR LETTER PHA +01017 MYANMAR LETTER BA +01018 MYANMAR LETTER BHA +01019 MYANMAR LETTER MA +0101A MYANMAR LETTER YA +0101B MYANMAR LETTER RA +0101C MYANMAR LETTER LA +0101D MYANMAR LETTER WA +0101E MYANMAR LETTER SA +0101F MYANMAR LETTER HA +01020 MYANMAR LETTER LLA +01021 MYANMAR LETTER A +01022 MYANMAR LETTER SHAN A +01023 MYANMAR LETTER I +01024 MYANMAR LETTER II +01025 MYANMAR LETTER U +01026 MYANMAR LETTER UU +01027 MYANMAR LETTER E +01028 MYANMAR LETTER MON E +01029 MYANMAR LETTER O +0102A MYANMAR LETTER AU +0102B MYANMAR VOWEL SIGN TALL AA +0102C MYANMAR VOWEL SIGN AA +0102D MYANMAR VOWEL SIGN I +0102E MYANMAR VOWEL SIGN II +0102F MYANMAR VOWEL SIGN U +01030 MYANMAR VOWEL SIGN UU +01031 MYANMAR VOWEL SIGN E +01032 MYANMAR VOWEL SIGN AI +01033 MYANMAR VOWEL SIGN MON II +01034 MYANMAR VOWEL SIGN MON O +01035 MYANMAR VOWEL SIGN E ABOVE +01036 MYANMAR SIGN ANUSVARA +01037 MYANMAR SIGN DOT BELOW +01038 MYANMAR SIGN VISARGA +01039 MYANMAR SIGN VIRAMA +0103A MYANMAR SIGN ASAT +0103B MYANMAR CONSONANT SIGN MEDIAL YA +0103C MYANMAR CONSONANT SIGN MEDIAL RA +0103D MYANMAR CONSONANT SIGN MEDIAL WA +0103E MYANMAR CONSONANT SIGN MEDIAL HA +0103F MYANMAR LETTER GREAT SA +01040 MYANMAR DIGIT ZERO +01041 MYANMAR DIGIT ONE +01042 MYANMAR DIGIT TWO +01043 MYANMAR DIGIT THREE +01044 MYANMAR DIGIT FOUR +01045 MYANMAR DIGIT FIVE +01046 MYANMAR DIGIT SIX +01047 MYANMAR DIGIT SEVEN +01048 MYANMAR DIGIT EIGHT +01049 MYANMAR DIGIT NINE +0104A MYANMAR SIGN LITTLE SECTION +0104B MYANMAR SIGN SECTION +0104C MYANMAR SYMBOL LOCATIVE +0104D MYANMAR SYMBOL COMPLETED +0104E MYANMAR SYMBOL AFOREMENTIONED +0104F MYANMAR SYMBOL GENITIVE +01050 MYANMAR LETTER SHA +01051 MYANMAR LETTER SSA +01052 MYANMAR LETTER VOCALIC R +01053 MYANMAR LETTER VOCALIC RR +01054 MYANMAR LETTER VOCALIC L +01055 MYANMAR LETTER VOCALIC LL +01056 MYANMAR VOWEL SIGN VOCALIC R +01057 MYANMAR VOWEL SIGN VOCALIC RR +01058 MYANMAR VOWEL SIGN VOCALIC L +01059 MYANMAR VOWEL SIGN VOCALIC LL +0105A MYANMAR LETTER MON NGA +0105B MYANMAR LETTER MON JHA +0105C MYANMAR LETTER MON BBA +0105D MYANMAR LETTER MON BBE +0105E MYANMAR CONSONANT SIGN MON MEDIAL NA +0105F MYANMAR CONSONANT SIGN MON MEDIAL MA +01060 MYANMAR CONSONANT SIGN MON MEDIAL LA +01061 MYANMAR LETTER SGAW KAREN SHA +01062 MYANMAR VOWEL SIGN SGAW KAREN EU +01063 MYANMAR TONE MARK SGAW KAREN HATHI +01064 MYANMAR TONE MARK SGAW KAREN KE PHO +01065 MYANMAR LETTER WESTERN PWO KAREN THA +01066 MYANMAR LETTER WESTERN PWO KAREN PWA +01067 MYANMAR VOWEL SIGN WESTERN PWO KAREN EU +01068 MYANMAR VOWEL SIGN WESTERN PWO KAREN UE +01069 MYANMAR SIGN WESTERN PWO KAREN TONE-1 +0106A MYANMAR SIGN WESTERN PWO KAREN TONE-2 +0106B MYANMAR SIGN WESTERN PWO KAREN TONE-3 +0106C MYANMAR SIGN WESTERN PWO KAREN TONE-4 +0106D MYANMAR SIGN WESTERN PWO KAREN TONE-5 +0106E MYANMAR LETTER EASTERN PWO KAREN NNA +0106F MYANMAR LETTER EASTERN PWO KAREN YWA +01070 MYANMAR LETTER EASTERN PWO KAREN GHWA +01071 MYANMAR VOWEL SIGN GEBA KAREN I +01072 MYANMAR VOWEL SIGN KAYAH OE +01073 MYANMAR VOWEL SIGN KAYAH U +01074 MYANMAR VOWEL SIGN KAYAH EE +01075 MYANMAR LETTER SHAN KA +01076 MYANMAR LETTER SHAN KHA +01077 MYANMAR LETTER SHAN GA +01078 MYANMAR LETTER SHAN CA +01079 MYANMAR LETTER SHAN ZA +0107A MYANMAR LETTER SHAN NYA +0107B MYANMAR LETTER SHAN DA +0107C MYANMAR LETTER SHAN NA +0107D MYANMAR LETTER SHAN PHA +0107E MYANMAR LETTER SHAN FA +0107F MYANMAR LETTER SHAN BA +01080 MYANMAR LETTER SHAN THA +01081 MYANMAR LETTER SHAN HA +01082 MYANMAR CONSONANT SIGN SHAN MEDIAL WA +01083 MYANMAR VOWEL SIGN SHAN AA +01084 MYANMAR VOWEL SIGN SHAN E +01085 MYANMAR VOWEL SIGN SHAN E ABOVE +01086 MYANMAR VOWEL SIGN SHAN FINAL Y +01087 MYANMAR SIGN SHAN TONE-2 +01088 MYANMAR SIGN SHAN TONE-3 +01089 MYANMAR SIGN SHAN TONE-5 +0108A MYANMAR SIGN SHAN TONE-6 +0108B MYANMAR SIGN SHAN COUNCIL TONE-2 +0108C MYANMAR SIGN SHAN COUNCIL TONE-3 +0108D MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +0108E MYANMAR LETTER RUMAI PALAUNG FA +0108F MYANMAR SIGN RUMAI PALAUNG TONE-5 +01090 MYANMAR SHAN DIGIT ZERO +01091 MYANMAR SHAN DIGIT ONE +01092 MYANMAR SHAN DIGIT TWO +01093 MYANMAR SHAN DIGIT THREE +01094 MYANMAR SHAN DIGIT FOUR +01095 MYANMAR SHAN DIGIT FIVE +01096 MYANMAR SHAN DIGIT SIX +01097 MYANMAR SHAN DIGIT SEVEN +01098 MYANMAR SHAN DIGIT EIGHT +01099 MYANMAR SHAN DIGIT NINE +0109A MYANMAR SIGN KHAMTI TONE-1 +0109B MYANMAR SIGN KHAMTI TONE-3 +0109C MYANMAR VOWEL SIGN AITON A +0109D MYANMAR VOWEL SIGN AITON AI +0109E MYANMAR SYMBOL SHAN ONE +0109F MYANMAR SYMBOL SHAN EXCLAMATION +010A0 GEORGIAN CAPITAL LETTER AN +010A1 GEORGIAN CAPITAL LETTER BAN +010A2 GEORGIAN CAPITAL LETTER GAN +010A3 GEORGIAN CAPITAL LETTER DON +010A4 GEORGIAN CAPITAL LETTER EN +010A5 GEORGIAN CAPITAL LETTER VIN +010A6 GEORGIAN CAPITAL LETTER ZEN +010A7 GEORGIAN CAPITAL LETTER TAN +010A8 GEORGIAN CAPITAL LETTER IN +010A9 GEORGIAN CAPITAL LETTER KAN +010AA GEORGIAN CAPITAL LETTER LAS +010AB GEORGIAN CAPITAL LETTER MAN +010AC GEORGIAN CAPITAL LETTER NAR +010AD GEORGIAN CAPITAL LETTER ON +010AE GEORGIAN CAPITAL LETTER PAR +010AF GEORGIAN CAPITAL LETTER ZHAR +010B0 GEORGIAN CAPITAL LETTER RAE +010B1 GEORGIAN CAPITAL LETTER SAN +010B2 GEORGIAN CAPITAL LETTER TAR +010B3 GEORGIAN CAPITAL LETTER UN +010B4 GEORGIAN CAPITAL LETTER PHAR +010B5 GEORGIAN CAPITAL LETTER KHAR +010B6 GEORGIAN CAPITAL LETTER GHAN +010B7 GEORGIAN CAPITAL LETTER QAR +010B8 GEORGIAN CAPITAL LETTER SHIN +010B9 GEORGIAN CAPITAL LETTER CHIN +010BA GEORGIAN CAPITAL LETTER CAN +010BB GEORGIAN CAPITAL LETTER JIL +010BC GEORGIAN CAPITAL LETTER CIL +010BD GEORGIAN CAPITAL LETTER CHAR +010BE GEORGIAN CAPITAL LETTER XAN +010BF GEORGIAN CAPITAL LETTER JHAN +010C0 GEORGIAN CAPITAL LETTER HAE +010C1 GEORGIAN CAPITAL LETTER HE +010C2 GEORGIAN CAPITAL LETTER HIE +010C3 GEORGIAN CAPITAL LETTER WE +010C4 GEORGIAN CAPITAL LETTER HAR +010C5 GEORGIAN CAPITAL LETTER HOE +010C7 GEORGIAN CAPITAL LETTER YN +010CD GEORGIAN CAPITAL LETTER AEN +010D0 GEORGIAN LETTER AN +010D1 GEORGIAN LETTER BAN +010D2 GEORGIAN LETTER GAN +010D3 GEORGIAN LETTER DON +010D4 GEORGIAN LETTER EN +010D5 GEORGIAN LETTER VIN +010D6 GEORGIAN LETTER ZEN +010D7 GEORGIAN LETTER TAN +010D8 GEORGIAN LETTER IN +010D9 GEORGIAN LETTER KAN +010DA GEORGIAN LETTER LAS +010DB GEORGIAN LETTER MAN +010DC GEORGIAN LETTER NAR +010DD GEORGIAN LETTER ON +010DE GEORGIAN LETTER PAR +010DF GEORGIAN LETTER ZHAR +010E0 GEORGIAN LETTER RAE +010E1 GEORGIAN LETTER SAN +010E2 GEORGIAN LETTER TAR +010E3 GEORGIAN LETTER UN +010E4 GEORGIAN LETTER PHAR +010E5 GEORGIAN LETTER KHAR +010E6 GEORGIAN LETTER GHAN +010E7 GEORGIAN LETTER QAR +010E8 GEORGIAN LETTER SHIN +010E9 GEORGIAN LETTER CHIN +010EA GEORGIAN LETTER CAN +010EB GEORGIAN LETTER JIL +010EC GEORGIAN LETTER CIL +010ED GEORGIAN LETTER CHAR +010EE GEORGIAN LETTER XAN +010EF GEORGIAN LETTER JHAN +010F0 GEORGIAN LETTER HAE +010F1 GEORGIAN LETTER HE +010F2 GEORGIAN LETTER HIE +010F3 GEORGIAN LETTER WE +010F4 GEORGIAN LETTER HAR +010F5 GEORGIAN LETTER HOE +010F6 GEORGIAN LETTER FI +010F7 GEORGIAN LETTER YN +010F8 GEORGIAN LETTER ELIFI +010F9 GEORGIAN LETTER TURNED GAN +010FA GEORGIAN LETTER AIN +010FB GEORGIAN PARAGRAPH SEPARATOR +010FC MODIFIER LETTER GEORGIAN NAR +010FD GEORGIAN LETTER AEN +010FE GEORGIAN LETTER HARD SIGN +010FF GEORGIAN LETTER LABIAL SIGN +01100 HANGUL CHOSEONG KIYEOK +01101 HANGUL CHOSEONG SSANGKIYEOK +01102 HANGUL CHOSEONG NIEUN +01103 HANGUL CHOSEONG TIKEUT +01104 HANGUL CHOSEONG SSANGTIKEUT +01105 HANGUL CHOSEONG RIEUL +01106 HANGUL CHOSEONG MIEUM +01107 HANGUL CHOSEONG PIEUP +01108 HANGUL CHOSEONG SSANGPIEUP +01109 HANGUL CHOSEONG SIOS +0110A HANGUL CHOSEONG SSANGSIOS +0110B HANGUL CHOSEONG IEUNG +0110C HANGUL CHOSEONG CIEUC +0110D HANGUL CHOSEONG SSANGCIEUC +0110E HANGUL CHOSEONG CHIEUCH +0110F HANGUL CHOSEONG KHIEUKH +01110 HANGUL CHOSEONG THIEUTH +01111 HANGUL CHOSEONG PHIEUPH +01112 HANGUL CHOSEONG HIEUH +01113 HANGUL CHOSEONG NIEUN-KIYEOK +01114 HANGUL CHOSEONG SSANGNIEUN +01115 HANGUL CHOSEONG NIEUN-TIKEUT +01116 HANGUL CHOSEONG NIEUN-PIEUP +01117 HANGUL CHOSEONG TIKEUT-KIYEOK +01118 HANGUL CHOSEONG RIEUL-NIEUN +01119 HANGUL CHOSEONG SSANGRIEUL +0111A HANGUL CHOSEONG RIEUL-HIEUH +0111B HANGUL CHOSEONG KAPYEOUNRIEUL +0111C HANGUL CHOSEONG MIEUM-PIEUP +0111D HANGUL CHOSEONG KAPYEOUNMIEUM +0111E HANGUL CHOSEONG PIEUP-KIYEOK +0111F HANGUL CHOSEONG PIEUP-NIEUN +01120 HANGUL CHOSEONG PIEUP-TIKEUT +01121 HANGUL CHOSEONG PIEUP-SIOS +01122 HANGUL CHOSEONG PIEUP-SIOS-KIYEOK +01123 HANGUL CHOSEONG PIEUP-SIOS-TIKEUT +01124 HANGUL CHOSEONG PIEUP-SIOS-PIEUP +01125 HANGUL CHOSEONG PIEUP-SSANGSIOS +01126 HANGUL CHOSEONG PIEUP-SIOS-CIEUC +01127 HANGUL CHOSEONG PIEUP-CIEUC +01128 HANGUL CHOSEONG PIEUP-CHIEUCH +01129 HANGUL CHOSEONG PIEUP-THIEUTH +0112A HANGUL CHOSEONG PIEUP-PHIEUPH +0112B HANGUL CHOSEONG KAPYEOUNPIEUP +0112C HANGUL CHOSEONG KAPYEOUNSSANGPIEUP +0112D HANGUL CHOSEONG SIOS-KIYEOK +0112E HANGUL CHOSEONG SIOS-NIEUN +0112F HANGUL CHOSEONG SIOS-TIKEUT +01130 HANGUL CHOSEONG SIOS-RIEUL +01131 HANGUL CHOSEONG SIOS-MIEUM +01132 HANGUL CHOSEONG SIOS-PIEUP +01133 HANGUL CHOSEONG SIOS-PIEUP-KIYEOK +01134 HANGUL CHOSEONG SIOS-SSANGSIOS +01135 HANGUL CHOSEONG SIOS-IEUNG +01136 HANGUL CHOSEONG SIOS-CIEUC +01137 HANGUL CHOSEONG SIOS-CHIEUCH +01138 HANGUL CHOSEONG SIOS-KHIEUKH +01139 HANGUL CHOSEONG SIOS-THIEUTH +0113A HANGUL CHOSEONG SIOS-PHIEUPH +0113B HANGUL CHOSEONG SIOS-HIEUH +0113C HANGUL CHOSEONG CHITUEUMSIOS +0113D HANGUL CHOSEONG CHITUEUMSSANGSIOS +0113E HANGUL CHOSEONG CEONGCHIEUMSIOS +0113F HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS +01140 HANGUL CHOSEONG PANSIOS +01141 HANGUL CHOSEONG IEUNG-KIYEOK +01142 HANGUL CHOSEONG IEUNG-TIKEUT +01143 HANGUL CHOSEONG IEUNG-MIEUM +01144 HANGUL CHOSEONG IEUNG-PIEUP +01145 HANGUL CHOSEONG IEUNG-SIOS +01146 HANGUL CHOSEONG IEUNG-PANSIOS +01147 HANGUL CHOSEONG SSANGIEUNG +01148 HANGUL CHOSEONG IEUNG-CIEUC +01149 HANGUL CHOSEONG IEUNG-CHIEUCH +0114A HANGUL CHOSEONG IEUNG-THIEUTH +0114B HANGUL CHOSEONG IEUNG-PHIEUPH +0114C HANGUL CHOSEONG YESIEUNG +0114D HANGUL CHOSEONG CIEUC-IEUNG +0114E HANGUL CHOSEONG CHITUEUMCIEUC +0114F HANGUL CHOSEONG CHITUEUMSSANGCIEUC +01150 HANGUL CHOSEONG CEONGCHIEUMCIEUC +01151 HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC +01152 HANGUL CHOSEONG CHIEUCH-KHIEUKH +01153 HANGUL CHOSEONG CHIEUCH-HIEUH +01154 HANGUL CHOSEONG CHITUEUMCHIEUCH +01155 HANGUL CHOSEONG CEONGCHIEUMCHIEUCH +01156 HANGUL CHOSEONG PHIEUPH-PIEUP +01157 HANGUL CHOSEONG KAPYEOUNPHIEUPH +01158 HANGUL CHOSEONG SSANGHIEUH +01159 HANGUL CHOSEONG YEORINHIEUH +0115A HANGUL CHOSEONG KIYEOK-TIKEUT +0115B HANGUL CHOSEONG NIEUN-SIOS +0115C HANGUL CHOSEONG NIEUN-CIEUC +0115D HANGUL CHOSEONG NIEUN-HIEUH +0115E HANGUL CHOSEONG TIKEUT-RIEUL +0115F HANGUL CHOSEONG FILLER +01160 HANGUL JUNGSEONG FILLER +01161 HANGUL JUNGSEONG A +01162 HANGUL JUNGSEONG AE +01163 HANGUL JUNGSEONG YA +01164 HANGUL JUNGSEONG YAE +01165 HANGUL JUNGSEONG EO +01166 HANGUL JUNGSEONG E +01167 HANGUL JUNGSEONG YEO +01168 HANGUL JUNGSEONG YE +01169 HANGUL JUNGSEONG O +0116A HANGUL JUNGSEONG WA +0116B HANGUL JUNGSEONG WAE +0116C HANGUL JUNGSEONG OE +0116D HANGUL JUNGSEONG YO +0116E HANGUL JUNGSEONG U +0116F HANGUL JUNGSEONG WEO +01170 HANGUL JUNGSEONG WE +01171 HANGUL JUNGSEONG WI +01172 HANGUL JUNGSEONG YU +01173 HANGUL JUNGSEONG EU +01174 HANGUL JUNGSEONG YI +01175 HANGUL JUNGSEONG I +01176 HANGUL JUNGSEONG A-O +01177 HANGUL JUNGSEONG A-U +01178 HANGUL JUNGSEONG YA-O +01179 HANGUL JUNGSEONG YA-YO +0117A HANGUL JUNGSEONG EO-O +0117B HANGUL JUNGSEONG EO-U +0117C HANGUL JUNGSEONG EO-EU +0117D HANGUL JUNGSEONG YEO-O +0117E HANGUL JUNGSEONG YEO-U +0117F HANGUL JUNGSEONG O-EO +01180 HANGUL JUNGSEONG O-E +01181 HANGUL JUNGSEONG O-YE +01182 HANGUL JUNGSEONG O-O +01183 HANGUL JUNGSEONG O-U +01184 HANGUL JUNGSEONG YO-YA +01185 HANGUL JUNGSEONG YO-YAE +01186 HANGUL JUNGSEONG YO-YEO +01187 HANGUL JUNGSEONG YO-O +01188 HANGUL JUNGSEONG YO-I +01189 HANGUL JUNGSEONG U-A +0118A HANGUL JUNGSEONG U-AE +0118B HANGUL JUNGSEONG U-EO-EU +0118C HANGUL JUNGSEONG U-YE +0118D HANGUL JUNGSEONG U-U +0118E HANGUL JUNGSEONG YU-A +0118F HANGUL JUNGSEONG YU-EO +01190 HANGUL JUNGSEONG YU-E +01191 HANGUL JUNGSEONG YU-YEO +01192 HANGUL JUNGSEONG YU-YE +01193 HANGUL JUNGSEONG YU-U +01194 HANGUL JUNGSEONG YU-I +01195 HANGUL JUNGSEONG EU-U +01196 HANGUL JUNGSEONG EU-EU +01197 HANGUL JUNGSEONG YI-U +01198 HANGUL JUNGSEONG I-A +01199 HANGUL JUNGSEONG I-YA +0119A HANGUL JUNGSEONG I-O +0119B HANGUL JUNGSEONG I-U +0119C HANGUL JUNGSEONG I-EU +0119D HANGUL JUNGSEONG I-ARAEA +0119E HANGUL JUNGSEONG ARAEA +0119F HANGUL JUNGSEONG ARAEA-EO +011A0 HANGUL JUNGSEONG ARAEA-U +011A1 HANGUL JUNGSEONG ARAEA-I +011A2 HANGUL JUNGSEONG SSANGARAEA +011A3 HANGUL JUNGSEONG A-EU +011A4 HANGUL JUNGSEONG YA-U +011A5 HANGUL JUNGSEONG YEO-YA +011A6 HANGUL JUNGSEONG O-YA +011A7 HANGUL JUNGSEONG O-YAE +011A8 HANGUL JONGSEONG KIYEOK +011A9 HANGUL JONGSEONG SSANGKIYEOK +011AA HANGUL JONGSEONG KIYEOK-SIOS +011AB HANGUL JONGSEONG NIEUN +011AC HANGUL JONGSEONG NIEUN-CIEUC +011AD HANGUL JONGSEONG NIEUN-HIEUH +011AE HANGUL JONGSEONG TIKEUT +011AF HANGUL JONGSEONG RIEUL +011B0 HANGUL JONGSEONG RIEUL-KIYEOK +011B1 HANGUL JONGSEONG RIEUL-MIEUM +011B2 HANGUL JONGSEONG RIEUL-PIEUP +011B3 HANGUL JONGSEONG RIEUL-SIOS +011B4 HANGUL JONGSEONG RIEUL-THIEUTH +011B5 HANGUL JONGSEONG RIEUL-PHIEUPH +011B6 HANGUL JONGSEONG RIEUL-HIEUH +011B7 HANGUL JONGSEONG MIEUM +011B8 HANGUL JONGSEONG PIEUP +011B9 HANGUL JONGSEONG PIEUP-SIOS +011BA HANGUL JONGSEONG SIOS +011BB HANGUL JONGSEONG SSANGSIOS +011BC HANGUL JONGSEONG IEUNG +011BD HANGUL JONGSEONG CIEUC +011BE HANGUL JONGSEONG CHIEUCH +011BF HANGUL JONGSEONG KHIEUKH +011C0 HANGUL JONGSEONG THIEUTH +011C1 HANGUL JONGSEONG PHIEUPH +011C2 HANGUL JONGSEONG HIEUH +011C3 HANGUL JONGSEONG KIYEOK-RIEUL +011C4 HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK +011C5 HANGUL JONGSEONG NIEUN-KIYEOK +011C6 HANGUL JONGSEONG NIEUN-TIKEUT +011C7 HANGUL JONGSEONG NIEUN-SIOS +011C8 HANGUL JONGSEONG NIEUN-PANSIOS +011C9 HANGUL JONGSEONG NIEUN-THIEUTH +011CA HANGUL JONGSEONG TIKEUT-KIYEOK +011CB HANGUL JONGSEONG TIKEUT-RIEUL +011CC HANGUL JONGSEONG RIEUL-KIYEOK-SIOS +011CD HANGUL JONGSEONG RIEUL-NIEUN +011CE HANGUL JONGSEONG RIEUL-TIKEUT +011CF HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH +011D0 HANGUL JONGSEONG SSANGRIEUL +011D1 HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK +011D2 HANGUL JONGSEONG RIEUL-MIEUM-SIOS +011D3 HANGUL JONGSEONG RIEUL-PIEUP-SIOS +011D4 HANGUL JONGSEONG RIEUL-PIEUP-HIEUH +011D5 HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP +011D6 HANGUL JONGSEONG RIEUL-SSANGSIOS +011D7 HANGUL JONGSEONG RIEUL-PANSIOS +011D8 HANGUL JONGSEONG RIEUL-KHIEUKH +011D9 HANGUL JONGSEONG RIEUL-YEORINHIEUH +011DA HANGUL JONGSEONG MIEUM-KIYEOK +011DB HANGUL JONGSEONG MIEUM-RIEUL +011DC HANGUL JONGSEONG MIEUM-PIEUP +011DD HANGUL JONGSEONG MIEUM-SIOS +011DE HANGUL JONGSEONG MIEUM-SSANGSIOS +011DF HANGUL JONGSEONG MIEUM-PANSIOS +011E0 HANGUL JONGSEONG MIEUM-CHIEUCH +011E1 HANGUL JONGSEONG MIEUM-HIEUH +011E2 HANGUL JONGSEONG KAPYEOUNMIEUM +011E3 HANGUL JONGSEONG PIEUP-RIEUL +011E4 HANGUL JONGSEONG PIEUP-PHIEUPH +011E5 HANGUL JONGSEONG PIEUP-HIEUH +011E6 HANGUL JONGSEONG KAPYEOUNPIEUP +011E7 HANGUL JONGSEONG SIOS-KIYEOK +011E8 HANGUL JONGSEONG SIOS-TIKEUT +011E9 HANGUL JONGSEONG SIOS-RIEUL +011EA HANGUL JONGSEONG SIOS-PIEUP +011EB HANGUL JONGSEONG PANSIOS +011EC HANGUL JONGSEONG YESIEUNG-KIYEOK +011EC HANGUL JONGSEONG IEUNG-KIYEOK +011ED HANGUL JONGSEONG YESIEUNG-SSANGKIYEOK +011ED HANGUL JONGSEONG IEUNG-SSANGKIYEOK +011EE HANGUL JONGSEONG SSANGYESIEUNG +011EE HANGUL JONGSEONG SSANGIEUNG +011EF HANGUL JONGSEONG YESIEUNG-KHIEUKH +011EF HANGUL JONGSEONG IEUNG-KHIEUKH +011F0 HANGUL JONGSEONG YESIEUNG +011F1 HANGUL JONGSEONG YESIEUNG-SIOS +011F2 HANGUL JONGSEONG YESIEUNG-PANSIOS +011F3 HANGUL JONGSEONG PHIEUPH-PIEUP +011F4 HANGUL JONGSEONG KAPYEOUNPHIEUPH +011F5 HANGUL JONGSEONG HIEUH-NIEUN +011F6 HANGUL JONGSEONG HIEUH-RIEUL +011F7 HANGUL JONGSEONG HIEUH-MIEUM +011F8 HANGUL JONGSEONG HIEUH-PIEUP +011F9 HANGUL JONGSEONG YEORINHIEUH +011FA HANGUL JONGSEONG KIYEOK-NIEUN +011FB HANGUL JONGSEONG KIYEOK-PIEUP +011FC HANGUL JONGSEONG KIYEOK-CHIEUCH +011FD HANGUL JONGSEONG KIYEOK-KHIEUKH +011FE HANGUL JONGSEONG KIYEOK-HIEUH +011FF HANGUL JONGSEONG SSANGNIEUN +01200 ETHIOPIC SYLLABLE HA +01201 ETHIOPIC SYLLABLE HU +01202 ETHIOPIC SYLLABLE HI +01203 ETHIOPIC SYLLABLE HAA +01204 ETHIOPIC SYLLABLE HEE +01205 ETHIOPIC SYLLABLE HE +01206 ETHIOPIC SYLLABLE HO +01207 ETHIOPIC SYLLABLE HOA +01208 ETHIOPIC SYLLABLE LA +01209 ETHIOPIC SYLLABLE LU +0120A ETHIOPIC SYLLABLE LI +0120B ETHIOPIC SYLLABLE LAA +0120C ETHIOPIC SYLLABLE LEE +0120D ETHIOPIC SYLLABLE LE +0120E ETHIOPIC SYLLABLE LO +0120F ETHIOPIC SYLLABLE LWA +01210 ETHIOPIC SYLLABLE HHA +01211 ETHIOPIC SYLLABLE HHU +01212 ETHIOPIC SYLLABLE HHI +01213 ETHIOPIC SYLLABLE HHAA +01214 ETHIOPIC SYLLABLE HHEE +01215 ETHIOPIC SYLLABLE HHE +01216 ETHIOPIC SYLLABLE HHO +01217 ETHIOPIC SYLLABLE HHWA +01218 ETHIOPIC SYLLABLE MA +01219 ETHIOPIC SYLLABLE MU +0121A ETHIOPIC SYLLABLE MI +0121B ETHIOPIC SYLLABLE MAA +0121C ETHIOPIC SYLLABLE MEE +0121D ETHIOPIC SYLLABLE ME +0121E ETHIOPIC SYLLABLE MO +0121F ETHIOPIC SYLLABLE MWA +01220 ETHIOPIC SYLLABLE SZA +01221 ETHIOPIC SYLLABLE SZU +01222 ETHIOPIC SYLLABLE SZI +01223 ETHIOPIC SYLLABLE SZAA +01224 ETHIOPIC SYLLABLE SZEE +01225 ETHIOPIC SYLLABLE SZE +01226 ETHIOPIC SYLLABLE SZO +01227 ETHIOPIC SYLLABLE SZWA +01228 ETHIOPIC SYLLABLE RA +01229 ETHIOPIC SYLLABLE RU +0122A ETHIOPIC SYLLABLE RI +0122B ETHIOPIC SYLLABLE RAA +0122C ETHIOPIC SYLLABLE REE +0122D ETHIOPIC SYLLABLE RE +0122E ETHIOPIC SYLLABLE RO +0122F ETHIOPIC SYLLABLE RWA +01230 ETHIOPIC SYLLABLE SA +01231 ETHIOPIC SYLLABLE SU +01232 ETHIOPIC SYLLABLE SI +01233 ETHIOPIC SYLLABLE SAA +01234 ETHIOPIC SYLLABLE SEE +01235 ETHIOPIC SYLLABLE SE +01236 ETHIOPIC SYLLABLE SO +01237 ETHIOPIC SYLLABLE SWA +01238 ETHIOPIC SYLLABLE SHA +01239 ETHIOPIC SYLLABLE SHU +0123A ETHIOPIC SYLLABLE SHI +0123B ETHIOPIC SYLLABLE SHAA +0123C ETHIOPIC SYLLABLE SHEE +0123D ETHIOPIC SYLLABLE SHE +0123E ETHIOPIC SYLLABLE SHO +0123F ETHIOPIC SYLLABLE SHWA +01240 ETHIOPIC SYLLABLE QA +01241 ETHIOPIC SYLLABLE QU +01242 ETHIOPIC SYLLABLE QI +01243 ETHIOPIC SYLLABLE QAA +01244 ETHIOPIC SYLLABLE QEE +01245 ETHIOPIC SYLLABLE QE +01246 ETHIOPIC SYLLABLE QO +01247 ETHIOPIC SYLLABLE QOA +01248 ETHIOPIC SYLLABLE QWA +0124A ETHIOPIC SYLLABLE QWI +0124B ETHIOPIC SYLLABLE QWAA +0124C ETHIOPIC SYLLABLE QWEE +0124D ETHIOPIC SYLLABLE QWE +01250 ETHIOPIC SYLLABLE QHA +01251 ETHIOPIC SYLLABLE QHU +01252 ETHIOPIC SYLLABLE QHI +01253 ETHIOPIC SYLLABLE QHAA +01254 ETHIOPIC SYLLABLE QHEE +01255 ETHIOPIC SYLLABLE QHE +01256 ETHIOPIC SYLLABLE QHO +01258 ETHIOPIC SYLLABLE QHWA +0125A ETHIOPIC SYLLABLE QHWI +0125B ETHIOPIC SYLLABLE QHWAA +0125C ETHIOPIC SYLLABLE QHWEE +0125D ETHIOPIC SYLLABLE QHWE +01260 ETHIOPIC SYLLABLE BA +01261 ETHIOPIC SYLLABLE BU +01262 ETHIOPIC SYLLABLE BI +01263 ETHIOPIC SYLLABLE BAA +01264 ETHIOPIC SYLLABLE BEE +01265 ETHIOPIC SYLLABLE BE +01266 ETHIOPIC SYLLABLE BO +01267 ETHIOPIC SYLLABLE BWA +01268 ETHIOPIC SYLLABLE VA +01269 ETHIOPIC SYLLABLE VU +0126A ETHIOPIC SYLLABLE VI +0126B ETHIOPIC SYLLABLE VAA +0126C ETHIOPIC SYLLABLE VEE +0126D ETHIOPIC SYLLABLE VE +0126E ETHIOPIC SYLLABLE VO +0126F ETHIOPIC SYLLABLE VWA +01270 ETHIOPIC SYLLABLE TA +01271 ETHIOPIC SYLLABLE TU +01272 ETHIOPIC SYLLABLE TI +01273 ETHIOPIC SYLLABLE TAA +01274 ETHIOPIC SYLLABLE TEE +01275 ETHIOPIC SYLLABLE TE +01276 ETHIOPIC SYLLABLE TO +01277 ETHIOPIC SYLLABLE TWA +01278 ETHIOPIC SYLLABLE CA +01279 ETHIOPIC SYLLABLE CU +0127A ETHIOPIC SYLLABLE CI +0127B ETHIOPIC SYLLABLE CAA +0127C ETHIOPIC SYLLABLE CEE +0127D ETHIOPIC SYLLABLE CE +0127E ETHIOPIC SYLLABLE CO +0127F ETHIOPIC SYLLABLE CWA +01280 ETHIOPIC SYLLABLE XA +01281 ETHIOPIC SYLLABLE XU +01282 ETHIOPIC SYLLABLE XI +01283 ETHIOPIC SYLLABLE XAA +01284 ETHIOPIC SYLLABLE XEE +01285 ETHIOPIC SYLLABLE XE +01286 ETHIOPIC SYLLABLE XO +01287 ETHIOPIC SYLLABLE XOA +01288 ETHIOPIC SYLLABLE XWA +0128A ETHIOPIC SYLLABLE XWI +0128B ETHIOPIC SYLLABLE XWAA +0128C ETHIOPIC SYLLABLE XWEE +0128D ETHIOPIC SYLLABLE XWE +01290 ETHIOPIC SYLLABLE NA +01291 ETHIOPIC SYLLABLE NU +01292 ETHIOPIC SYLLABLE NI +01293 ETHIOPIC SYLLABLE NAA +01294 ETHIOPIC SYLLABLE NEE +01295 ETHIOPIC SYLLABLE NE +01296 ETHIOPIC SYLLABLE NO +01297 ETHIOPIC SYLLABLE NWA +01298 ETHIOPIC SYLLABLE NYA +01299 ETHIOPIC SYLLABLE NYU +0129A ETHIOPIC SYLLABLE NYI +0129B ETHIOPIC SYLLABLE NYAA +0129C ETHIOPIC SYLLABLE NYEE +0129D ETHIOPIC SYLLABLE NYE +0129E ETHIOPIC SYLLABLE NYO +0129F ETHIOPIC SYLLABLE NYWA +012A0 ETHIOPIC SYLLABLE GLOTTAL A +012A1 ETHIOPIC SYLLABLE GLOTTAL U +012A2 ETHIOPIC SYLLABLE GLOTTAL I +012A3 ETHIOPIC SYLLABLE GLOTTAL AA +012A4 ETHIOPIC SYLLABLE GLOTTAL EE +012A5 ETHIOPIC SYLLABLE GLOTTAL E +012A6 ETHIOPIC SYLLABLE GLOTTAL O +012A7 ETHIOPIC SYLLABLE GLOTTAL WA +012A8 ETHIOPIC SYLLABLE KA +012A9 ETHIOPIC SYLLABLE KU +012AA ETHIOPIC SYLLABLE KI +012AB ETHIOPIC SYLLABLE KAA +012AC ETHIOPIC SYLLABLE KEE +012AD ETHIOPIC SYLLABLE KE +012AE ETHIOPIC SYLLABLE KO +012AF ETHIOPIC SYLLABLE KOA +012B0 ETHIOPIC SYLLABLE KWA +012B2 ETHIOPIC SYLLABLE KWI +012B3 ETHIOPIC SYLLABLE KWAA +012B4 ETHIOPIC SYLLABLE KWEE +012B5 ETHIOPIC SYLLABLE KWE +012B8 ETHIOPIC SYLLABLE KXA +012B9 ETHIOPIC SYLLABLE KXU +012BA ETHIOPIC SYLLABLE KXI +012BB ETHIOPIC SYLLABLE KXAA +012BC ETHIOPIC SYLLABLE KXEE +012BD ETHIOPIC SYLLABLE KXE +012BE ETHIOPIC SYLLABLE KXO +012C0 ETHIOPIC SYLLABLE KXWA +012C2 ETHIOPIC SYLLABLE KXWI +012C3 ETHIOPIC SYLLABLE KXWAA +012C4 ETHIOPIC SYLLABLE KXWEE +012C5 ETHIOPIC SYLLABLE KXWE +012C8 ETHIOPIC SYLLABLE WA +012C9 ETHIOPIC SYLLABLE WU +012CA ETHIOPIC SYLLABLE WI +012CB ETHIOPIC SYLLABLE WAA +012CC ETHIOPIC SYLLABLE WEE +012CD ETHIOPIC SYLLABLE WE +012CE ETHIOPIC SYLLABLE WO +012CF ETHIOPIC SYLLABLE WOA +012D0 ETHIOPIC SYLLABLE PHARYNGEAL A +012D1 ETHIOPIC SYLLABLE PHARYNGEAL U +012D2 ETHIOPIC SYLLABLE PHARYNGEAL I +012D3 ETHIOPIC SYLLABLE PHARYNGEAL AA +012D4 ETHIOPIC SYLLABLE PHARYNGEAL EE +012D5 ETHIOPIC SYLLABLE PHARYNGEAL E +012D6 ETHIOPIC SYLLABLE PHARYNGEAL O +012D8 ETHIOPIC SYLLABLE ZA +012D9 ETHIOPIC SYLLABLE ZU +012DA ETHIOPIC SYLLABLE ZI +012DB ETHIOPIC SYLLABLE ZAA +012DC ETHIOPIC SYLLABLE ZEE +012DD ETHIOPIC SYLLABLE ZE +012DE ETHIOPIC SYLLABLE ZO +012DF ETHIOPIC SYLLABLE ZWA +012E0 ETHIOPIC SYLLABLE ZHA +012E1 ETHIOPIC SYLLABLE ZHU +012E2 ETHIOPIC SYLLABLE ZHI +012E3 ETHIOPIC SYLLABLE ZHAA +012E4 ETHIOPIC SYLLABLE ZHEE +012E5 ETHIOPIC SYLLABLE ZHE +012E6 ETHIOPIC SYLLABLE ZHO +012E7 ETHIOPIC SYLLABLE ZHWA +012E8 ETHIOPIC SYLLABLE YA +012E9 ETHIOPIC SYLLABLE YU +012EA ETHIOPIC SYLLABLE YI +012EB ETHIOPIC SYLLABLE YAA +012EC ETHIOPIC SYLLABLE YEE +012ED ETHIOPIC SYLLABLE YE +012EE ETHIOPIC SYLLABLE YO +012EF ETHIOPIC SYLLABLE YOA +012F0 ETHIOPIC SYLLABLE DA +012F1 ETHIOPIC SYLLABLE DU +012F2 ETHIOPIC SYLLABLE DI +012F3 ETHIOPIC SYLLABLE DAA +012F4 ETHIOPIC SYLLABLE DEE +012F5 ETHIOPIC SYLLABLE DE +012F6 ETHIOPIC SYLLABLE DO +012F7 ETHIOPIC SYLLABLE DWA +012F8 ETHIOPIC SYLLABLE DDA +012F9 ETHIOPIC SYLLABLE DDU +012FA ETHIOPIC SYLLABLE DDI +012FB ETHIOPIC SYLLABLE DDAA +012FC ETHIOPIC SYLLABLE DDEE +012FD ETHIOPIC SYLLABLE DDE +012FE ETHIOPIC SYLLABLE DDO +012FF ETHIOPIC SYLLABLE DDWA +01300 ETHIOPIC SYLLABLE JA +01301 ETHIOPIC SYLLABLE JU +01302 ETHIOPIC SYLLABLE JI +01303 ETHIOPIC SYLLABLE JAA +01304 ETHIOPIC SYLLABLE JEE +01305 ETHIOPIC SYLLABLE JE +01306 ETHIOPIC SYLLABLE JO +01307 ETHIOPIC SYLLABLE JWA +01308 ETHIOPIC SYLLABLE GA +01309 ETHIOPIC SYLLABLE GU +0130A ETHIOPIC SYLLABLE GI +0130B ETHIOPIC SYLLABLE GAA +0130C ETHIOPIC SYLLABLE GEE +0130D ETHIOPIC SYLLABLE GE +0130E ETHIOPIC SYLLABLE GO +0130F ETHIOPIC SYLLABLE GOA +01310 ETHIOPIC SYLLABLE GWA +01312 ETHIOPIC SYLLABLE GWI +01313 ETHIOPIC SYLLABLE GWAA +01314 ETHIOPIC SYLLABLE GWEE +01315 ETHIOPIC SYLLABLE GWE +01318 ETHIOPIC SYLLABLE GGA +01319 ETHIOPIC SYLLABLE GGU +0131A ETHIOPIC SYLLABLE GGI +0131B ETHIOPIC SYLLABLE GGAA +0131C ETHIOPIC SYLLABLE GGEE +0131D ETHIOPIC SYLLABLE GGE +0131E ETHIOPIC SYLLABLE GGO +0131F ETHIOPIC SYLLABLE GGWAA +01320 ETHIOPIC SYLLABLE THA +01321 ETHIOPIC SYLLABLE THU +01322 ETHIOPIC SYLLABLE THI +01323 ETHIOPIC SYLLABLE THAA +01324 ETHIOPIC SYLLABLE THEE +01325 ETHIOPIC SYLLABLE THE +01326 ETHIOPIC SYLLABLE THO +01327 ETHIOPIC SYLLABLE THWA +01328 ETHIOPIC SYLLABLE CHA +01329 ETHIOPIC SYLLABLE CHU +0132A ETHIOPIC SYLLABLE CHI +0132B ETHIOPIC SYLLABLE CHAA +0132C ETHIOPIC SYLLABLE CHEE +0132D ETHIOPIC SYLLABLE CHE +0132E ETHIOPIC SYLLABLE CHO +0132F ETHIOPIC SYLLABLE CHWA +01330 ETHIOPIC SYLLABLE PHA +01331 ETHIOPIC SYLLABLE PHU +01332 ETHIOPIC SYLLABLE PHI +01333 ETHIOPIC SYLLABLE PHAA +01334 ETHIOPIC SYLLABLE PHEE +01335 ETHIOPIC SYLLABLE PHE +01336 ETHIOPIC SYLLABLE PHO +01337 ETHIOPIC SYLLABLE PHWA +01338 ETHIOPIC SYLLABLE TSA +01339 ETHIOPIC SYLLABLE TSU +0133A ETHIOPIC SYLLABLE TSI +0133B ETHIOPIC SYLLABLE TSAA +0133C ETHIOPIC SYLLABLE TSEE +0133D ETHIOPIC SYLLABLE TSE +0133E ETHIOPIC SYLLABLE TSO +0133F ETHIOPIC SYLLABLE TSWA +01340 ETHIOPIC SYLLABLE TZA +01341 ETHIOPIC SYLLABLE TZU +01342 ETHIOPIC SYLLABLE TZI +01343 ETHIOPIC SYLLABLE TZAA +01344 ETHIOPIC SYLLABLE TZEE +01345 ETHIOPIC SYLLABLE TZE +01346 ETHIOPIC SYLLABLE TZO +01347 ETHIOPIC SYLLABLE TZOA +01348 ETHIOPIC SYLLABLE FA +01349 ETHIOPIC SYLLABLE FU +0134A ETHIOPIC SYLLABLE FI +0134B ETHIOPIC SYLLABLE FAA +0134C ETHIOPIC SYLLABLE FEE +0134D ETHIOPIC SYLLABLE FE +0134E ETHIOPIC SYLLABLE FO +0134F ETHIOPIC SYLLABLE FWA +01350 ETHIOPIC SYLLABLE PA +01351 ETHIOPIC SYLLABLE PU +01352 ETHIOPIC SYLLABLE PI +01353 ETHIOPIC SYLLABLE PAA +01354 ETHIOPIC SYLLABLE PEE +01355 ETHIOPIC SYLLABLE PE +01356 ETHIOPIC SYLLABLE PO +01357 ETHIOPIC SYLLABLE PWA +01358 ETHIOPIC SYLLABLE RYA +01359 ETHIOPIC SYLLABLE MYA +0135A ETHIOPIC SYLLABLE FYA +0135D ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK +0135E ETHIOPIC COMBINING VOWEL LENGTH MARK +0135F ETHIOPIC COMBINING GEMINATION MARK +01360 ETHIOPIC SECTION MARK +01361 ETHIOPIC WORDSPACE +01362 ETHIOPIC FULL STOP +01363 ETHIOPIC COMMA +01364 ETHIOPIC SEMICOLON +01365 ETHIOPIC COLON +01366 ETHIOPIC PREFACE COLON +01367 ETHIOPIC QUESTION MARK +01368 ETHIOPIC PARAGRAPH SEPARATOR +01369 ETHIOPIC DIGIT ONE +0136A ETHIOPIC DIGIT TWO +0136B ETHIOPIC DIGIT THREE +0136C ETHIOPIC DIGIT FOUR +0136D ETHIOPIC DIGIT FIVE +0136E ETHIOPIC DIGIT SIX +0136F ETHIOPIC DIGIT SEVEN +01370 ETHIOPIC DIGIT EIGHT +01371 ETHIOPIC DIGIT NINE +01372 ETHIOPIC NUMBER TEN +01373 ETHIOPIC NUMBER TWENTY +01374 ETHIOPIC NUMBER THIRTY +01375 ETHIOPIC NUMBER FORTY +01376 ETHIOPIC NUMBER FIFTY +01377 ETHIOPIC NUMBER SIXTY +01378 ETHIOPIC NUMBER SEVENTY +01379 ETHIOPIC NUMBER EIGHTY +0137A ETHIOPIC NUMBER NINETY +0137B ETHIOPIC NUMBER HUNDRED +0137C ETHIOPIC NUMBER TEN THOUSAND +01380 ETHIOPIC SYLLABLE SEBATBEIT MWA +01381 ETHIOPIC SYLLABLE MWI +01382 ETHIOPIC SYLLABLE MWEE +01383 ETHIOPIC SYLLABLE MWE +01384 ETHIOPIC SYLLABLE SEBATBEIT BWA +01385 ETHIOPIC SYLLABLE BWI +01386 ETHIOPIC SYLLABLE BWEE +01387 ETHIOPIC SYLLABLE BWE +01388 ETHIOPIC SYLLABLE SEBATBEIT FWA +01389 ETHIOPIC SYLLABLE FWI +0138A ETHIOPIC SYLLABLE FWEE +0138B ETHIOPIC SYLLABLE FWE +0138C ETHIOPIC SYLLABLE SEBATBEIT PWA +0138D ETHIOPIC SYLLABLE PWI +0138E ETHIOPIC SYLLABLE PWEE +0138F ETHIOPIC SYLLABLE PWE +01390 ETHIOPIC TONAL MARK YIZET +01391 ETHIOPIC TONAL MARK DERET +01392 ETHIOPIC TONAL MARK RIKRIK +01393 ETHIOPIC TONAL MARK SHORT RIKRIK +01394 ETHIOPIC TONAL MARK DIFAT +01395 ETHIOPIC TONAL MARK KENAT +01396 ETHIOPIC TONAL MARK CHIRET +01397 ETHIOPIC TONAL MARK HIDET +01398 ETHIOPIC TONAL MARK DERET-HIDET +01399 ETHIOPIC TONAL MARK KURT +013A0 CHEROKEE LETTER A +013A1 CHEROKEE LETTER E +013A2 CHEROKEE LETTER I +013A3 CHEROKEE LETTER O +013A4 CHEROKEE LETTER U +013A5 CHEROKEE LETTER V +013A6 CHEROKEE LETTER GA +013A7 CHEROKEE LETTER KA +013A8 CHEROKEE LETTER GE +013A9 CHEROKEE LETTER GI +013AA CHEROKEE LETTER GO +013AB CHEROKEE LETTER GU +013AC CHEROKEE LETTER GV +013AD CHEROKEE LETTER HA +013AE CHEROKEE LETTER HE +013AF CHEROKEE LETTER HI +013B0 CHEROKEE LETTER HO +013B1 CHEROKEE LETTER HU +013B2 CHEROKEE LETTER HV +013B3 CHEROKEE LETTER LA +013B4 CHEROKEE LETTER LE +013B5 CHEROKEE LETTER LI +013B6 CHEROKEE LETTER LO +013B7 CHEROKEE LETTER LU +013B8 CHEROKEE LETTER LV +013B9 CHEROKEE LETTER MA +013BA CHEROKEE LETTER ME +013BB CHEROKEE LETTER MI +013BC CHEROKEE LETTER MO +013BD CHEROKEE LETTER MU +013BE CHEROKEE LETTER NA +013BF CHEROKEE LETTER HNA +013C0 CHEROKEE LETTER NAH +013C1 CHEROKEE LETTER NE +013C2 CHEROKEE LETTER NI +013C3 CHEROKEE LETTER NO +013C4 CHEROKEE LETTER NU +013C5 CHEROKEE LETTER NV +013C6 CHEROKEE LETTER QUA +013C7 CHEROKEE LETTER QUE +013C8 CHEROKEE LETTER QUI +013C9 CHEROKEE LETTER QUO +013CA CHEROKEE LETTER QUU +013CB CHEROKEE LETTER QUV +013CC CHEROKEE LETTER SA +013CD CHEROKEE LETTER S +013CE CHEROKEE LETTER SE +013CF CHEROKEE LETTER SI +013D0 CHEROKEE LETTER SO +013D1 CHEROKEE LETTER SU +013D2 CHEROKEE LETTER SV +013D3 CHEROKEE LETTER DA +013D4 CHEROKEE LETTER TA +013D5 CHEROKEE LETTER DE +013D6 CHEROKEE LETTER TE +013D7 CHEROKEE LETTER DI +013D8 CHEROKEE LETTER TI +013D9 CHEROKEE LETTER DO +013DA CHEROKEE LETTER DU +013DB CHEROKEE LETTER DV +013DC CHEROKEE LETTER DLA +013DD CHEROKEE LETTER TLA +013DE CHEROKEE LETTER TLE +013DF CHEROKEE LETTER TLI +013E0 CHEROKEE LETTER TLO +013E1 CHEROKEE LETTER TLU +013E2 CHEROKEE LETTER TLV +013E3 CHEROKEE LETTER TSA +013E4 CHEROKEE LETTER TSE +013E5 CHEROKEE LETTER TSI +013E6 CHEROKEE LETTER TSO +013E7 CHEROKEE LETTER TSU +013E8 CHEROKEE LETTER TSV +013E9 CHEROKEE LETTER WA +013EA CHEROKEE LETTER WE +013EB CHEROKEE LETTER WI +013EC CHEROKEE LETTER WO +013ED CHEROKEE LETTER WU +013EE CHEROKEE LETTER WV +013EF CHEROKEE LETTER YA +013F0 CHEROKEE LETTER YE +013F1 CHEROKEE LETTER YI +013F2 CHEROKEE LETTER YO +013F3 CHEROKEE LETTER YU +013F4 CHEROKEE LETTER YV +013F5 CHEROKEE LETTER MV +013F8 CHEROKEE SMALL LETTER YE +013F9 CHEROKEE SMALL LETTER YI +013FA CHEROKEE SMALL LETTER YO +013FB CHEROKEE SMALL LETTER YU +013FC CHEROKEE SMALL LETTER YV +013FD CHEROKEE SMALL LETTER MV +01400 CANADIAN SYLLABICS HYPHEN +01401 CANADIAN SYLLABICS E +01402 CANADIAN SYLLABICS AAI +01403 CANADIAN SYLLABICS I +01404 CANADIAN SYLLABICS II +01405 CANADIAN SYLLABICS O +01406 CANADIAN SYLLABICS OO +01407 CANADIAN SYLLABICS Y-CREE OO +01408 CANADIAN SYLLABICS CARRIER EE +01409 CANADIAN SYLLABICS CARRIER I +0140A CANADIAN SYLLABICS A +0140B CANADIAN SYLLABICS AA +0140C CANADIAN SYLLABICS WE +0140D CANADIAN SYLLABICS WEST-CREE WE +0140E CANADIAN SYLLABICS WI +0140F CANADIAN SYLLABICS WEST-CREE WI +01410 CANADIAN SYLLABICS WII +01411 CANADIAN SYLLABICS WEST-CREE WII +01412 CANADIAN SYLLABICS WO +01413 CANADIAN SYLLABICS WEST-CREE WO +01414 CANADIAN SYLLABICS WOO +01415 CANADIAN SYLLABICS WEST-CREE WOO +01416 CANADIAN SYLLABICS NASKAPI WOO +01417 CANADIAN SYLLABICS WA +01418 CANADIAN SYLLABICS WEST-CREE WA +01419 CANADIAN SYLLABICS WAA +0141A CANADIAN SYLLABICS WEST-CREE WAA +0141B CANADIAN SYLLABICS NASKAPI WAA +0141C CANADIAN SYLLABICS AI +0141D CANADIAN SYLLABICS Y-CREE W +0141E CANADIAN SYLLABICS GLOTTAL STOP +0141F CANADIAN SYLLABICS FINAL ACUTE +01420 CANADIAN SYLLABICS FINAL GRAVE +01421 CANADIAN SYLLABICS FINAL BOTTOM HALF RING +01422 CANADIAN SYLLABICS FINAL TOP HALF RING +01423 CANADIAN SYLLABICS FINAL RIGHT HALF RING +01424 CANADIAN SYLLABICS FINAL RING +01425 CANADIAN SYLLABICS FINAL DOUBLE ACUTE +01426 CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES +01427 CANADIAN SYLLABICS FINAL MIDDLE DOT +01428 CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE +01429 CANADIAN SYLLABICS FINAL PLUS +0142A CANADIAN SYLLABICS FINAL DOWN TACK +0142B CANADIAN SYLLABICS EN +0142C CANADIAN SYLLABICS IN +0142D CANADIAN SYLLABICS ON +0142E CANADIAN SYLLABICS AN +0142F CANADIAN SYLLABICS PE +01430 CANADIAN SYLLABICS PAAI +01431 CANADIAN SYLLABICS PI +01432 CANADIAN SYLLABICS PII +01433 CANADIAN SYLLABICS PO +01434 CANADIAN SYLLABICS POO +01435 CANADIAN SYLLABICS Y-CREE POO +01436 CANADIAN SYLLABICS CARRIER HEE +01437 CANADIAN SYLLABICS CARRIER HI +01438 CANADIAN SYLLABICS PA +01439 CANADIAN SYLLABICS PAA +0143A CANADIAN SYLLABICS PWE +0143B CANADIAN SYLLABICS WEST-CREE PWE +0143C CANADIAN SYLLABICS PWI +0143D CANADIAN SYLLABICS WEST-CREE PWI +0143E CANADIAN SYLLABICS PWII +0143F CANADIAN SYLLABICS WEST-CREE PWII +01440 CANADIAN SYLLABICS PWO +01441 CANADIAN SYLLABICS WEST-CREE PWO +01442 CANADIAN SYLLABICS PWOO +01443 CANADIAN SYLLABICS WEST-CREE PWOO +01444 CANADIAN SYLLABICS PWA +01445 CANADIAN SYLLABICS WEST-CREE PWA +01446 CANADIAN SYLLABICS PWAA +01447 CANADIAN SYLLABICS WEST-CREE PWAA +01448 CANADIAN SYLLABICS Y-CREE PWAA +01449 CANADIAN SYLLABICS P +0144A CANADIAN SYLLABICS WEST-CREE P +0144B CANADIAN SYLLABICS CARRIER H +0144C CANADIAN SYLLABICS TE +0144D CANADIAN SYLLABICS TAAI +0144E CANADIAN SYLLABICS TI +0144F CANADIAN SYLLABICS TII +01450 CANADIAN SYLLABICS TO +01451 CANADIAN SYLLABICS TOO +01452 CANADIAN SYLLABICS Y-CREE TOO +01453 CANADIAN SYLLABICS CARRIER DEE +01454 CANADIAN SYLLABICS CARRIER DI +01455 CANADIAN SYLLABICS TA +01456 CANADIAN SYLLABICS TAA +01457 CANADIAN SYLLABICS TWE +01458 CANADIAN SYLLABICS WEST-CREE TWE +01459 CANADIAN SYLLABICS TWI +0145A CANADIAN SYLLABICS WEST-CREE TWI +0145B CANADIAN SYLLABICS TWII +0145C CANADIAN SYLLABICS WEST-CREE TWII +0145D CANADIAN SYLLABICS TWO +0145E CANADIAN SYLLABICS WEST-CREE TWO +0145F CANADIAN SYLLABICS TWOO +01460 CANADIAN SYLLABICS WEST-CREE TWOO +01461 CANADIAN SYLLABICS TWA +01462 CANADIAN SYLLABICS WEST-CREE TWA +01463 CANADIAN SYLLABICS TWAA +01464 CANADIAN SYLLABICS WEST-CREE TWAA +01465 CANADIAN SYLLABICS NASKAPI TWAA +01466 CANADIAN SYLLABICS T +01467 CANADIAN SYLLABICS TTE +01468 CANADIAN SYLLABICS TTI +01469 CANADIAN SYLLABICS TTO +0146A CANADIAN SYLLABICS TTA +0146B CANADIAN SYLLABICS KE +0146C CANADIAN SYLLABICS KAAI +0146D CANADIAN SYLLABICS KI +0146E CANADIAN SYLLABICS KII +0146F CANADIAN SYLLABICS KO +01470 CANADIAN SYLLABICS KOO +01471 CANADIAN SYLLABICS Y-CREE KOO +01472 CANADIAN SYLLABICS KA +01473 CANADIAN SYLLABICS KAA +01474 CANADIAN SYLLABICS KWE +01475 CANADIAN SYLLABICS WEST-CREE KWE +01476 CANADIAN SYLLABICS KWI +01477 CANADIAN SYLLABICS WEST-CREE KWI +01478 CANADIAN SYLLABICS KWII +01479 CANADIAN SYLLABICS WEST-CREE KWII +0147A CANADIAN SYLLABICS KWO +0147B CANADIAN SYLLABICS WEST-CREE KWO +0147C CANADIAN SYLLABICS KWOO +0147D CANADIAN SYLLABICS WEST-CREE KWOO +0147E CANADIAN SYLLABICS KWA +0147F CANADIAN SYLLABICS WEST-CREE KWA +01480 CANADIAN SYLLABICS KWAA +01481 CANADIAN SYLLABICS WEST-CREE KWAA +01482 CANADIAN SYLLABICS NASKAPI KWAA +01483 CANADIAN SYLLABICS K +01484 CANADIAN SYLLABICS KW +01485 CANADIAN SYLLABICS SOUTH-SLAVEY KEH +01486 CANADIAN SYLLABICS SOUTH-SLAVEY KIH +01487 CANADIAN SYLLABICS SOUTH-SLAVEY KOH +01488 CANADIAN SYLLABICS SOUTH-SLAVEY KAH +01489 CANADIAN SYLLABICS CE +0148A CANADIAN SYLLABICS CAAI +0148B CANADIAN SYLLABICS CI +0148C CANADIAN SYLLABICS CII +0148D CANADIAN SYLLABICS CO +0148E CANADIAN SYLLABICS COO +0148F CANADIAN SYLLABICS Y-CREE COO +01490 CANADIAN SYLLABICS CA +01491 CANADIAN SYLLABICS CAA +01492 CANADIAN SYLLABICS CWE +01493 CANADIAN SYLLABICS WEST-CREE CWE +01494 CANADIAN SYLLABICS CWI +01495 CANADIAN SYLLABICS WEST-CREE CWI +01496 CANADIAN SYLLABICS CWII +01497 CANADIAN SYLLABICS WEST-CREE CWII +01498 CANADIAN SYLLABICS CWO +01499 CANADIAN SYLLABICS WEST-CREE CWO +0149A CANADIAN SYLLABICS CWOO +0149B CANADIAN SYLLABICS WEST-CREE CWOO +0149C CANADIAN SYLLABICS CWA +0149D CANADIAN SYLLABICS WEST-CREE CWA +0149E CANADIAN SYLLABICS CWAA +0149F CANADIAN SYLLABICS WEST-CREE CWAA +014A0 CANADIAN SYLLABICS NASKAPI CWAA +014A1 CANADIAN SYLLABICS C +014A2 CANADIAN SYLLABICS SAYISI TH +014A3 CANADIAN SYLLABICS ME +014A4 CANADIAN SYLLABICS MAAI +014A5 CANADIAN SYLLABICS MI +014A6 CANADIAN SYLLABICS MII +014A7 CANADIAN SYLLABICS MO +014A8 CANADIAN SYLLABICS MOO +014A9 CANADIAN SYLLABICS Y-CREE MOO +014AA CANADIAN SYLLABICS MA +014AB CANADIAN SYLLABICS MAA +014AC CANADIAN SYLLABICS MWE +014AD CANADIAN SYLLABICS WEST-CREE MWE +014AE CANADIAN SYLLABICS MWI +014AF CANADIAN SYLLABICS WEST-CREE MWI +014B0 CANADIAN SYLLABICS MWII +014B1 CANADIAN SYLLABICS WEST-CREE MWII +014B2 CANADIAN SYLLABICS MWO +014B3 CANADIAN SYLLABICS WEST-CREE MWO +014B4 CANADIAN SYLLABICS MWOO +014B5 CANADIAN SYLLABICS WEST-CREE MWOO +014B6 CANADIAN SYLLABICS MWA +014B7 CANADIAN SYLLABICS WEST-CREE MWA +014B8 CANADIAN SYLLABICS MWAA +014B9 CANADIAN SYLLABICS WEST-CREE MWAA +014BA CANADIAN SYLLABICS NASKAPI MWAA +014BB CANADIAN SYLLABICS M +014BC CANADIAN SYLLABICS WEST-CREE M +014BD CANADIAN SYLLABICS MH +014BE CANADIAN SYLLABICS ATHAPASCAN M +014BF CANADIAN SYLLABICS SAYISI M +014C0 CANADIAN SYLLABICS NE +014C1 CANADIAN SYLLABICS NAAI +014C2 CANADIAN SYLLABICS NI +014C3 CANADIAN SYLLABICS NII +014C4 CANADIAN SYLLABICS NO +014C5 CANADIAN SYLLABICS NOO +014C6 CANADIAN SYLLABICS Y-CREE NOO +014C7 CANADIAN SYLLABICS NA +014C8 CANADIAN SYLLABICS NAA +014C9 CANADIAN SYLLABICS NWE +014CA CANADIAN SYLLABICS WEST-CREE NWE +014CB CANADIAN SYLLABICS NWA +014CC CANADIAN SYLLABICS WEST-CREE NWA +014CD CANADIAN SYLLABICS NWAA +014CE CANADIAN SYLLABICS WEST-CREE NWAA +014CF CANADIAN SYLLABICS NASKAPI NWAA +014D0 CANADIAN SYLLABICS N +014D1 CANADIAN SYLLABICS CARRIER NG +014D2 CANADIAN SYLLABICS NH +014D3 CANADIAN SYLLABICS LE +014D4 CANADIAN SYLLABICS LAAI +014D5 CANADIAN SYLLABICS LI +014D6 CANADIAN SYLLABICS LII +014D7 CANADIAN SYLLABICS LO +014D8 CANADIAN SYLLABICS LOO +014D9 CANADIAN SYLLABICS Y-CREE LOO +014DA CANADIAN SYLLABICS LA +014DB CANADIAN SYLLABICS LAA +014DC CANADIAN SYLLABICS LWE +014DD CANADIAN SYLLABICS WEST-CREE LWE +014DE CANADIAN SYLLABICS LWI +014DF CANADIAN SYLLABICS WEST-CREE LWI +014E0 CANADIAN SYLLABICS LWII +014E1 CANADIAN SYLLABICS WEST-CREE LWII +014E2 CANADIAN SYLLABICS LWO +014E3 CANADIAN SYLLABICS WEST-CREE LWO +014E4 CANADIAN SYLLABICS LWOO +014E5 CANADIAN SYLLABICS WEST-CREE LWOO +014E6 CANADIAN SYLLABICS LWA +014E7 CANADIAN SYLLABICS WEST-CREE LWA +014E8 CANADIAN SYLLABICS LWAA +014E9 CANADIAN SYLLABICS WEST-CREE LWAA +014EA CANADIAN SYLLABICS L +014EB CANADIAN SYLLABICS WEST-CREE L +014EC CANADIAN SYLLABICS MEDIAL L +014ED CANADIAN SYLLABICS SE +014EE CANADIAN SYLLABICS SAAI +014EF CANADIAN SYLLABICS SI +014F0 CANADIAN SYLLABICS SII +014F1 CANADIAN SYLLABICS SO +014F2 CANADIAN SYLLABICS SOO +014F3 CANADIAN SYLLABICS Y-CREE SOO +014F4 CANADIAN SYLLABICS SA +014F5 CANADIAN SYLLABICS SAA +014F6 CANADIAN SYLLABICS SWE +014F7 CANADIAN SYLLABICS WEST-CREE SWE +014F8 CANADIAN SYLLABICS SWI +014F9 CANADIAN SYLLABICS WEST-CREE SWI +014FA CANADIAN SYLLABICS SWII +014FB CANADIAN SYLLABICS WEST-CREE SWII +014FC CANADIAN SYLLABICS SWO +014FD CANADIAN SYLLABICS WEST-CREE SWO +014FE CANADIAN SYLLABICS SWOO +014FF CANADIAN SYLLABICS WEST-CREE SWOO +01500 CANADIAN SYLLABICS SWA +01501 CANADIAN SYLLABICS WEST-CREE SWA +01502 CANADIAN SYLLABICS SWAA +01503 CANADIAN SYLLABICS WEST-CREE SWAA +01504 CANADIAN SYLLABICS NASKAPI SWAA +01505 CANADIAN SYLLABICS S +01506 CANADIAN SYLLABICS ATHAPASCAN S +01507 CANADIAN SYLLABICS SW +01508 CANADIAN SYLLABICS BLACKFOOT S +01509 CANADIAN SYLLABICS MOOSE-CREE SK +0150A CANADIAN SYLLABICS NASKAPI SKW +0150B CANADIAN SYLLABICS NASKAPI S-W +0150C CANADIAN SYLLABICS NASKAPI SPWA +0150D CANADIAN SYLLABICS NASKAPI STWA +0150E CANADIAN SYLLABICS NASKAPI SKWA +0150F CANADIAN SYLLABICS NASKAPI SCWA +01510 CANADIAN SYLLABICS SHE +01511 CANADIAN SYLLABICS SHI +01512 CANADIAN SYLLABICS SHII +01513 CANADIAN SYLLABICS SHO +01514 CANADIAN SYLLABICS SHOO +01515 CANADIAN SYLLABICS SHA +01516 CANADIAN SYLLABICS SHAA +01517 CANADIAN SYLLABICS SHWE +01518 CANADIAN SYLLABICS WEST-CREE SHWE +01519 CANADIAN SYLLABICS SHWI +0151A CANADIAN SYLLABICS WEST-CREE SHWI +0151B CANADIAN SYLLABICS SHWII +0151C CANADIAN SYLLABICS WEST-CREE SHWII +0151D CANADIAN SYLLABICS SHWO +0151E CANADIAN SYLLABICS WEST-CREE SHWO +0151F CANADIAN SYLLABICS SHWOO +01520 CANADIAN SYLLABICS WEST-CREE SHWOO +01521 CANADIAN SYLLABICS SHWA +01522 CANADIAN SYLLABICS WEST-CREE SHWA +01523 CANADIAN SYLLABICS SHWAA +01524 CANADIAN SYLLABICS WEST-CREE SHWAA +01525 CANADIAN SYLLABICS SH +01526 CANADIAN SYLLABICS YE +01527 CANADIAN SYLLABICS YAAI +01528 CANADIAN SYLLABICS YI +01529 CANADIAN SYLLABICS YII +0152A CANADIAN SYLLABICS YO +0152B CANADIAN SYLLABICS YOO +0152C CANADIAN SYLLABICS Y-CREE YOO +0152D CANADIAN SYLLABICS YA +0152E CANADIAN SYLLABICS YAA +0152F CANADIAN SYLLABICS YWE +01530 CANADIAN SYLLABICS WEST-CREE YWE +01531 CANADIAN SYLLABICS YWI +01532 CANADIAN SYLLABICS WEST-CREE YWI +01533 CANADIAN SYLLABICS YWII +01534 CANADIAN SYLLABICS WEST-CREE YWII +01535 CANADIAN SYLLABICS YWO +01536 CANADIAN SYLLABICS WEST-CREE YWO +01537 CANADIAN SYLLABICS YWOO +01538 CANADIAN SYLLABICS WEST-CREE YWOO +01539 CANADIAN SYLLABICS YWA +0153A CANADIAN SYLLABICS WEST-CREE YWA +0153B CANADIAN SYLLABICS YWAA +0153C CANADIAN SYLLABICS WEST-CREE YWAA +0153D CANADIAN SYLLABICS NASKAPI YWAA +0153E CANADIAN SYLLABICS Y +0153F CANADIAN SYLLABICS BIBLE-CREE Y +01540 CANADIAN SYLLABICS WEST-CREE Y +01541 CANADIAN SYLLABICS SAYISI YI +01542 CANADIAN SYLLABICS RE +01543 CANADIAN SYLLABICS R-CREE RE +01544 CANADIAN SYLLABICS WEST-CREE LE +01545 CANADIAN SYLLABICS RAAI +01546 CANADIAN SYLLABICS RI +01547 CANADIAN SYLLABICS RII +01548 CANADIAN SYLLABICS RO +01549 CANADIAN SYLLABICS ROO +0154A CANADIAN SYLLABICS WEST-CREE LO +0154B CANADIAN SYLLABICS RA +0154C CANADIAN SYLLABICS RAA +0154D CANADIAN SYLLABICS WEST-CREE LA +0154E CANADIAN SYLLABICS RWAA +0154F CANADIAN SYLLABICS WEST-CREE RWAA +01550 CANADIAN SYLLABICS R +01551 CANADIAN SYLLABICS WEST-CREE R +01552 CANADIAN SYLLABICS MEDIAL R +01553 CANADIAN SYLLABICS FE +01554 CANADIAN SYLLABICS FAAI +01555 CANADIAN SYLLABICS FI +01556 CANADIAN SYLLABICS FII +01557 CANADIAN SYLLABICS FO +01558 CANADIAN SYLLABICS FOO +01559 CANADIAN SYLLABICS FA +0155A CANADIAN SYLLABICS FAA +0155B CANADIAN SYLLABICS FWAA +0155C CANADIAN SYLLABICS WEST-CREE FWAA +0155D CANADIAN SYLLABICS F +0155E CANADIAN SYLLABICS THE +0155F CANADIAN SYLLABICS N-CREE THE +01560 CANADIAN SYLLABICS THI +01561 CANADIAN SYLLABICS N-CREE THI +01562 CANADIAN SYLLABICS THII +01563 CANADIAN SYLLABICS N-CREE THII +01564 CANADIAN SYLLABICS THO +01565 CANADIAN SYLLABICS THOO +01566 CANADIAN SYLLABICS THA +01567 CANADIAN SYLLABICS THAA +01568 CANADIAN SYLLABICS THWAA +01569 CANADIAN SYLLABICS WEST-CREE THWAA +0156A CANADIAN SYLLABICS TH +0156B CANADIAN SYLLABICS TTHE +0156C CANADIAN SYLLABICS TTHI +0156D CANADIAN SYLLABICS TTHO +0156E CANADIAN SYLLABICS TTHA +0156F CANADIAN SYLLABICS TTH +01570 CANADIAN SYLLABICS TYE +01571 CANADIAN SYLLABICS TYI +01572 CANADIAN SYLLABICS TYO +01573 CANADIAN SYLLABICS TYA +01574 CANADIAN SYLLABICS NUNAVIK HE +01575 CANADIAN SYLLABICS NUNAVIK HI +01576 CANADIAN SYLLABICS NUNAVIK HII +01577 CANADIAN SYLLABICS NUNAVIK HO +01578 CANADIAN SYLLABICS NUNAVIK HOO +01579 CANADIAN SYLLABICS NUNAVIK HA +0157A CANADIAN SYLLABICS NUNAVIK HAA +0157B CANADIAN SYLLABICS NUNAVIK H +0157C CANADIAN SYLLABICS NUNAVUT H +0157D CANADIAN SYLLABICS HK +0157E CANADIAN SYLLABICS QAAI +0157F CANADIAN SYLLABICS QI +01580 CANADIAN SYLLABICS QII +01581 CANADIAN SYLLABICS QO +01582 CANADIAN SYLLABICS QOO +01583 CANADIAN SYLLABICS QA +01584 CANADIAN SYLLABICS QAA +01585 CANADIAN SYLLABICS Q +01586 CANADIAN SYLLABICS TLHE +01587 CANADIAN SYLLABICS TLHI +01588 CANADIAN SYLLABICS TLHO +01589 CANADIAN SYLLABICS TLHA +0158A CANADIAN SYLLABICS WEST-CREE RE +0158B CANADIAN SYLLABICS WEST-CREE RI +0158C CANADIAN SYLLABICS WEST-CREE RO +0158D CANADIAN SYLLABICS WEST-CREE RA +0158E CANADIAN SYLLABICS NGAAI +0158F CANADIAN SYLLABICS NGI +01590 CANADIAN SYLLABICS NGII +01591 CANADIAN SYLLABICS NGO +01592 CANADIAN SYLLABICS NGOO +01593 CANADIAN SYLLABICS NGA +01594 CANADIAN SYLLABICS NGAA +01595 CANADIAN SYLLABICS NG +01596 CANADIAN SYLLABICS NNG +01597 CANADIAN SYLLABICS SAYISI SHE +01598 CANADIAN SYLLABICS SAYISI SHI +01599 CANADIAN SYLLABICS SAYISI SHO +0159A CANADIAN SYLLABICS SAYISI SHA +0159B CANADIAN SYLLABICS WOODS-CREE THE +0159C CANADIAN SYLLABICS WOODS-CREE THI +0159D CANADIAN SYLLABICS WOODS-CREE THO +0159E CANADIAN SYLLABICS WOODS-CREE THA +0159F CANADIAN SYLLABICS WOODS-CREE TH +015A0 CANADIAN SYLLABICS LHI +015A1 CANADIAN SYLLABICS LHII +015A2 CANADIAN SYLLABICS LHO +015A3 CANADIAN SYLLABICS LHOO +015A4 CANADIAN SYLLABICS LHA +015A5 CANADIAN SYLLABICS LHAA +015A6 CANADIAN SYLLABICS LH +015A7 CANADIAN SYLLABICS TH-CREE THE +015A8 CANADIAN SYLLABICS TH-CREE THI +015A9 CANADIAN SYLLABICS TH-CREE THII +015AA CANADIAN SYLLABICS TH-CREE THO +015AB CANADIAN SYLLABICS TH-CREE THOO +015AC CANADIAN SYLLABICS TH-CREE THA +015AD CANADIAN SYLLABICS TH-CREE THAA +015AE CANADIAN SYLLABICS TH-CREE TH +015AF CANADIAN SYLLABICS AIVILIK B +015B0 CANADIAN SYLLABICS BLACKFOOT E +015B1 CANADIAN SYLLABICS BLACKFOOT I +015B2 CANADIAN SYLLABICS BLACKFOOT O +015B3 CANADIAN SYLLABICS BLACKFOOT A +015B4 CANADIAN SYLLABICS BLACKFOOT WE +015B5 CANADIAN SYLLABICS BLACKFOOT WI +015B6 CANADIAN SYLLABICS BLACKFOOT WO +015B7 CANADIAN SYLLABICS BLACKFOOT WA +015B8 CANADIAN SYLLABICS BLACKFOOT NE +015B9 CANADIAN SYLLABICS BLACKFOOT NI +015BA CANADIAN SYLLABICS BLACKFOOT NO +015BB CANADIAN SYLLABICS BLACKFOOT NA +015BC CANADIAN SYLLABICS BLACKFOOT KE +015BD CANADIAN SYLLABICS BLACKFOOT KI +015BE CANADIAN SYLLABICS BLACKFOOT KO +015BF CANADIAN SYLLABICS BLACKFOOT KA +015C0 CANADIAN SYLLABICS SAYISI HE +015C1 CANADIAN SYLLABICS SAYISI HI +015C2 CANADIAN SYLLABICS SAYISI HO +015C3 CANADIAN SYLLABICS SAYISI HA +015C4 CANADIAN SYLLABICS CARRIER GHU +015C5 CANADIAN SYLLABICS CARRIER GHO +015C6 CANADIAN SYLLABICS CARRIER GHE +015C7 CANADIAN SYLLABICS CARRIER GHEE +015C8 CANADIAN SYLLABICS CARRIER GHI +015C9 CANADIAN SYLLABICS CARRIER GHA +015CA CANADIAN SYLLABICS CARRIER RU +015CB CANADIAN SYLLABICS CARRIER RO +015CC CANADIAN SYLLABICS CARRIER RE +015CD CANADIAN SYLLABICS CARRIER REE +015CE CANADIAN SYLLABICS CARRIER RI +015CF CANADIAN SYLLABICS CARRIER RA +015D0 CANADIAN SYLLABICS CARRIER WU +015D1 CANADIAN SYLLABICS CARRIER WO +015D2 CANADIAN SYLLABICS CARRIER WE +015D3 CANADIAN SYLLABICS CARRIER WEE +015D4 CANADIAN SYLLABICS CARRIER WI +015D5 CANADIAN SYLLABICS CARRIER WA +015D6 CANADIAN SYLLABICS CARRIER HWU +015D7 CANADIAN SYLLABICS CARRIER HWO +015D8 CANADIAN SYLLABICS CARRIER HWE +015D9 CANADIAN SYLLABICS CARRIER HWEE +015DA CANADIAN SYLLABICS CARRIER HWI +015DB CANADIAN SYLLABICS CARRIER HWA +015DC CANADIAN SYLLABICS CARRIER THU +015DD CANADIAN SYLLABICS CARRIER THO +015DE CANADIAN SYLLABICS CARRIER THE +015DF CANADIAN SYLLABICS CARRIER THEE +015E0 CANADIAN SYLLABICS CARRIER THI +015E1 CANADIAN SYLLABICS CARRIER THA +015E2 CANADIAN SYLLABICS CARRIER TTU +015E3 CANADIAN SYLLABICS CARRIER TTO +015E4 CANADIAN SYLLABICS CARRIER TTE +015E5 CANADIAN SYLLABICS CARRIER TTEE +015E6 CANADIAN SYLLABICS CARRIER TTI +015E7 CANADIAN SYLLABICS CARRIER TTA +015E8 CANADIAN SYLLABICS CARRIER PU +015E9 CANADIAN SYLLABICS CARRIER PO +015EA CANADIAN SYLLABICS CARRIER PE +015EB CANADIAN SYLLABICS CARRIER PEE +015EC CANADIAN SYLLABICS CARRIER PI +015ED CANADIAN SYLLABICS CARRIER PA +015EE CANADIAN SYLLABICS CARRIER P +015EF CANADIAN SYLLABICS CARRIER GU +015F0 CANADIAN SYLLABICS CARRIER GO +015F1 CANADIAN SYLLABICS CARRIER GE +015F2 CANADIAN SYLLABICS CARRIER GEE +015F3 CANADIAN SYLLABICS CARRIER GI +015F4 CANADIAN SYLLABICS CARRIER GA +015F5 CANADIAN SYLLABICS CARRIER KHU +015F6 CANADIAN SYLLABICS CARRIER KHO +015F7 CANADIAN SYLLABICS CARRIER KHE +015F8 CANADIAN SYLLABICS CARRIER KHEE +015F9 CANADIAN SYLLABICS CARRIER KHI +015FA CANADIAN SYLLABICS CARRIER KHA +015FB CANADIAN SYLLABICS CARRIER KKU +015FC CANADIAN SYLLABICS CARRIER KKO +015FD CANADIAN SYLLABICS CARRIER KKE +015FE CANADIAN SYLLABICS CARRIER KKEE +015FF CANADIAN SYLLABICS CARRIER KKI +01600 CANADIAN SYLLABICS CARRIER KKA +01601 CANADIAN SYLLABICS CARRIER KK +01602 CANADIAN SYLLABICS CARRIER NU +01603 CANADIAN SYLLABICS CARRIER NO +01604 CANADIAN SYLLABICS CARRIER NE +01605 CANADIAN SYLLABICS CARRIER NEE +01606 CANADIAN SYLLABICS CARRIER NI +01607 CANADIAN SYLLABICS CARRIER NA +01608 CANADIAN SYLLABICS CARRIER MU +01609 CANADIAN SYLLABICS CARRIER MO +0160A CANADIAN SYLLABICS CARRIER ME +0160B CANADIAN SYLLABICS CARRIER MEE +0160C CANADIAN SYLLABICS CARRIER MI +0160D CANADIAN SYLLABICS CARRIER MA +0160E CANADIAN SYLLABICS CARRIER YU +0160F CANADIAN SYLLABICS CARRIER YO +01610 CANADIAN SYLLABICS CARRIER YE +01611 CANADIAN SYLLABICS CARRIER YEE +01612 CANADIAN SYLLABICS CARRIER YI +01613 CANADIAN SYLLABICS CARRIER YA +01614 CANADIAN SYLLABICS CARRIER JU +01615 CANADIAN SYLLABICS SAYISI JU +01616 CANADIAN SYLLABICS CARRIER JO +01617 CANADIAN SYLLABICS CARRIER JE +01618 CANADIAN SYLLABICS CARRIER JEE +01619 CANADIAN SYLLABICS CARRIER JI +0161A CANADIAN SYLLABICS SAYISI JI +0161B CANADIAN SYLLABICS CARRIER JA +0161C CANADIAN SYLLABICS CARRIER JJU +0161D CANADIAN SYLLABICS CARRIER JJO +0161E CANADIAN SYLLABICS CARRIER JJE +0161F CANADIAN SYLLABICS CARRIER JJEE +01620 CANADIAN SYLLABICS CARRIER JJI +01621 CANADIAN SYLLABICS CARRIER JJA +01622 CANADIAN SYLLABICS CARRIER LU +01623 CANADIAN SYLLABICS CARRIER LO +01624 CANADIAN SYLLABICS CARRIER LE +01625 CANADIAN SYLLABICS CARRIER LEE +01626 CANADIAN SYLLABICS CARRIER LI +01627 CANADIAN SYLLABICS CARRIER LA +01628 CANADIAN SYLLABICS CARRIER DLU +01629 CANADIAN SYLLABICS CARRIER DLO +0162A CANADIAN SYLLABICS CARRIER DLE +0162B CANADIAN SYLLABICS CARRIER DLEE +0162C CANADIAN SYLLABICS CARRIER DLI +0162D CANADIAN SYLLABICS CARRIER DLA +0162E CANADIAN SYLLABICS CARRIER LHU +0162F CANADIAN SYLLABICS CARRIER LHO +01630 CANADIAN SYLLABICS CARRIER LHE +01631 CANADIAN SYLLABICS CARRIER LHEE +01632 CANADIAN SYLLABICS CARRIER LHI +01633 CANADIAN SYLLABICS CARRIER LHA +01634 CANADIAN SYLLABICS CARRIER TLHU +01635 CANADIAN SYLLABICS CARRIER TLHO +01636 CANADIAN SYLLABICS CARRIER TLHE +01637 CANADIAN SYLLABICS CARRIER TLHEE +01638 CANADIAN SYLLABICS CARRIER TLHI +01639 CANADIAN SYLLABICS CARRIER TLHA +0163A CANADIAN SYLLABICS CARRIER TLU +0163B CANADIAN SYLLABICS CARRIER TLO +0163C CANADIAN SYLLABICS CARRIER TLE +0163D CANADIAN SYLLABICS CARRIER TLEE +0163E CANADIAN SYLLABICS CARRIER TLI +0163F CANADIAN SYLLABICS CARRIER TLA +01640 CANADIAN SYLLABICS CARRIER ZU +01641 CANADIAN SYLLABICS CARRIER ZO +01642 CANADIAN SYLLABICS CARRIER ZE +01643 CANADIAN SYLLABICS CARRIER ZEE +01644 CANADIAN SYLLABICS CARRIER ZI +01645 CANADIAN SYLLABICS CARRIER ZA +01646 CANADIAN SYLLABICS CARRIER Z +01647 CANADIAN SYLLABICS CARRIER INITIAL Z +01648 CANADIAN SYLLABICS CARRIER DZU +01649 CANADIAN SYLLABICS CARRIER DZO +0164A CANADIAN SYLLABICS CARRIER DZE +0164B CANADIAN SYLLABICS CARRIER DZEE +0164C CANADIAN SYLLABICS CARRIER DZI +0164D CANADIAN SYLLABICS CARRIER DZA +0164E CANADIAN SYLLABICS CARRIER SU +0164F CANADIAN SYLLABICS CARRIER SO +01650 CANADIAN SYLLABICS CARRIER SE +01651 CANADIAN SYLLABICS CARRIER SEE +01652 CANADIAN SYLLABICS CARRIER SI +01653 CANADIAN SYLLABICS CARRIER SA +01654 CANADIAN SYLLABICS CARRIER SHU +01655 CANADIAN SYLLABICS CARRIER SHO +01656 CANADIAN SYLLABICS CARRIER SHE +01657 CANADIAN SYLLABICS CARRIER SHEE +01658 CANADIAN SYLLABICS CARRIER SHI +01659 CANADIAN SYLLABICS CARRIER SHA +0165A CANADIAN SYLLABICS CARRIER SH +0165B CANADIAN SYLLABICS CARRIER TSU +0165C CANADIAN SYLLABICS CARRIER TSO +0165D CANADIAN SYLLABICS CARRIER TSE +0165E CANADIAN SYLLABICS CARRIER TSEE +0165F CANADIAN SYLLABICS CARRIER TSI +01660 CANADIAN SYLLABICS CARRIER TSA +01661 CANADIAN SYLLABICS CARRIER CHU +01662 CANADIAN SYLLABICS CARRIER CHO +01663 CANADIAN SYLLABICS CARRIER CHE +01664 CANADIAN SYLLABICS CARRIER CHEE +01665 CANADIAN SYLLABICS CARRIER CHI +01666 CANADIAN SYLLABICS CARRIER CHA +01667 CANADIAN SYLLABICS CARRIER TTSU +01668 CANADIAN SYLLABICS CARRIER TTSO +01669 CANADIAN SYLLABICS CARRIER TTSE +0166A CANADIAN SYLLABICS CARRIER TTSEE +0166B CANADIAN SYLLABICS CARRIER TTSI +0166C CANADIAN SYLLABICS CARRIER TTSA +0166D CANADIAN SYLLABICS CHI SIGN +0166E CANADIAN SYLLABICS FULL STOP +0166F CANADIAN SYLLABICS QAI +01670 CANADIAN SYLLABICS NGAI +01671 CANADIAN SYLLABICS NNGI +01672 CANADIAN SYLLABICS NNGII +01673 CANADIAN SYLLABICS NNGO +01674 CANADIAN SYLLABICS NNGOO +01675 CANADIAN SYLLABICS NNGA +01676 CANADIAN SYLLABICS NNGAA +01677 CANADIAN SYLLABICS WOODS-CREE THWEE +01678 CANADIAN SYLLABICS WOODS-CREE THWI +01679 CANADIAN SYLLABICS WOODS-CREE THWII +0167A CANADIAN SYLLABICS WOODS-CREE THWO +0167B CANADIAN SYLLABICS WOODS-CREE THWOO +0167C CANADIAN SYLLABICS WOODS-CREE THWA +0167D CANADIAN SYLLABICS WOODS-CREE THWAA +0167E CANADIAN SYLLABICS WOODS-CREE FINAL TH +0167F CANADIAN SYLLABICS BLACKFOOT W +01680 OGHAM SPACE MARK +01681 OGHAM LETTER BEITH +01682 OGHAM LETTER LUIS +01683 OGHAM LETTER FEARN +01684 OGHAM LETTER SAIL +01685 OGHAM LETTER NION +01686 OGHAM LETTER UATH +01687 OGHAM LETTER DAIR +01688 OGHAM LETTER TINNE +01689 OGHAM LETTER COLL +0168A OGHAM LETTER CEIRT +0168B OGHAM LETTER MUIN +0168C OGHAM LETTER GORT +0168D OGHAM LETTER NGEADAL +0168E OGHAM LETTER STRAIF +0168F OGHAM LETTER RUIS +01690 OGHAM LETTER AILM +01691 OGHAM LETTER ONN +01692 OGHAM LETTER UR +01693 OGHAM LETTER EADHADH +01694 OGHAM LETTER IODHADH +01695 OGHAM LETTER EABHADH +01696 OGHAM LETTER OR +01697 OGHAM LETTER UILLEANN +01698 OGHAM LETTER IFIN +01699 OGHAM LETTER EAMHANCHOLL +0169A OGHAM LETTER PEITH +0169B OGHAM FEATHER MARK +0169C OGHAM REVERSED FEATHER MARK +016A0 RUNIC LETTER FEHU FEOH FE F +016A1 RUNIC LETTER V +016A2 RUNIC LETTER URUZ UR U +016A3 RUNIC LETTER YR +016A4 RUNIC LETTER Y +016A5 RUNIC LETTER W +016A6 RUNIC LETTER THURISAZ THURS THORN +016A7 RUNIC LETTER ETH +016A8 RUNIC LETTER ANSUZ A +016A9 RUNIC LETTER OS O +016AA RUNIC LETTER AC A +016AB RUNIC LETTER AESC +016AC RUNIC LETTER LONG-BRANCH-OSS O +016AD RUNIC LETTER SHORT-TWIG-OSS O +016AE RUNIC LETTER O +016AF RUNIC LETTER OE +016B0 RUNIC LETTER ON +016B1 RUNIC LETTER RAIDO RAD REID R +016B2 RUNIC LETTER KAUNA +016B3 RUNIC LETTER CEN +016B4 RUNIC LETTER KAUN K +016B5 RUNIC LETTER G +016B6 RUNIC LETTER ENG +016B7 RUNIC LETTER GEBO GYFU G +016B8 RUNIC LETTER GAR +016B9 RUNIC LETTER WUNJO WYNN W +016BA RUNIC LETTER HAGLAZ H +016BB RUNIC LETTER HAEGL H +016BC RUNIC LETTER LONG-BRANCH-HAGALL H +016BD RUNIC LETTER SHORT-TWIG-HAGALL H +016BE RUNIC LETTER NAUDIZ NYD NAUD N +016BF RUNIC LETTER SHORT-TWIG-NAUD N +016C0 RUNIC LETTER DOTTED-N +016C1 RUNIC LETTER ISAZ IS ISS I +016C2 RUNIC LETTER E +016C3 RUNIC LETTER JERAN J +016C4 RUNIC LETTER GER +016C5 RUNIC LETTER LONG-BRANCH-AR AE +016C6 RUNIC LETTER SHORT-TWIG-AR A +016C7 RUNIC LETTER IWAZ EOH +016C8 RUNIC LETTER PERTHO PEORTH P +016C9 RUNIC LETTER ALGIZ EOLHX +016CA RUNIC LETTER SOWILO S +016CB RUNIC LETTER SIGEL LONG-BRANCH-SOL S +016CC RUNIC LETTER SHORT-TWIG-SOL S +016CD RUNIC LETTER C +016CE RUNIC LETTER Z +016CF RUNIC LETTER TIWAZ TIR TYR T +016D0 RUNIC LETTER SHORT-TWIG-TYR T +016D1 RUNIC LETTER D +016D2 RUNIC LETTER BERKANAN BEORC BJARKAN B +016D3 RUNIC LETTER SHORT-TWIG-BJARKAN B +016D4 RUNIC LETTER DOTTED-P +016D5 RUNIC LETTER OPEN-P +016D6 RUNIC LETTER EHWAZ EH E +016D7 RUNIC LETTER MANNAZ MAN M +016D8 RUNIC LETTER LONG-BRANCH-MADR M +016D9 RUNIC LETTER SHORT-TWIG-MADR M +016DA RUNIC LETTER LAUKAZ LAGU LOGR L +016DB RUNIC LETTER DOTTED-L +016DC RUNIC LETTER INGWAZ +016DD RUNIC LETTER ING +016DE RUNIC LETTER DAGAZ DAEG D +016DF RUNIC LETTER OTHALAN ETHEL O +016E0 RUNIC LETTER EAR +016E1 RUNIC LETTER IOR +016E2 RUNIC LETTER CWEORTH +016E3 RUNIC LETTER CALC +016E4 RUNIC LETTER CEALC +016E5 RUNIC LETTER STAN +016E6 RUNIC LETTER LONG-BRANCH-YR +016E7 RUNIC LETTER SHORT-TWIG-YR +016E8 RUNIC LETTER ICELANDIC-YR +016E9 RUNIC LETTER Q +016EA RUNIC LETTER X +016EB RUNIC SINGLE PUNCTUATION +016EC RUNIC MULTIPLE PUNCTUATION +016ED RUNIC CROSS PUNCTUATION +016EE RUNIC ARLAUG SYMBOL +016EF RUNIC TVIMADUR SYMBOL +016F0 RUNIC BELGTHOR SYMBOL +016F1 RUNIC LETTER K +016F2 RUNIC LETTER SH +016F3 RUNIC LETTER OO +016F4 RUNIC LETTER FRANKS CASKET OS +016F5 RUNIC LETTER FRANKS CASKET IS +016F6 RUNIC LETTER FRANKS CASKET EH +016F7 RUNIC LETTER FRANKS CASKET AC +016F8 RUNIC LETTER FRANKS CASKET AESC +01700 TAGALOG LETTER A +01701 TAGALOG LETTER I +01702 TAGALOG LETTER U +01703 TAGALOG LETTER KA +01704 TAGALOG LETTER GA +01705 TAGALOG LETTER NGA +01706 TAGALOG LETTER TA +01707 TAGALOG LETTER DA +01708 TAGALOG LETTER NA +01709 TAGALOG LETTER PA +0170A TAGALOG LETTER BA +0170B TAGALOG LETTER MA +0170C TAGALOG LETTER YA +0170E TAGALOG LETTER LA +0170F TAGALOG LETTER WA +01710 TAGALOG LETTER SA +01711 TAGALOG LETTER HA +01712 TAGALOG VOWEL SIGN I +01713 TAGALOG VOWEL SIGN U +01714 TAGALOG SIGN VIRAMA +01720 HANUNOO LETTER A +01721 HANUNOO LETTER I +01722 HANUNOO LETTER U +01723 HANUNOO LETTER KA +01724 HANUNOO LETTER GA +01725 HANUNOO LETTER NGA +01726 HANUNOO LETTER TA +01727 HANUNOO LETTER DA +01728 HANUNOO LETTER NA +01729 HANUNOO LETTER PA +0172A HANUNOO LETTER BA +0172B HANUNOO LETTER MA +0172C HANUNOO LETTER YA +0172D HANUNOO LETTER RA +0172E HANUNOO LETTER LA +0172F HANUNOO LETTER WA +01730 HANUNOO LETTER SA +01731 HANUNOO LETTER HA +01732 HANUNOO VOWEL SIGN I +01733 HANUNOO VOWEL SIGN U +01734 HANUNOO SIGN PAMUDPOD +01735 PHILIPPINE SINGLE PUNCTUATION +01736 PHILIPPINE DOUBLE PUNCTUATION +01740 BUHID LETTER A +01741 BUHID LETTER I +01742 BUHID LETTER U +01743 BUHID LETTER KA +01744 BUHID LETTER GA +01745 BUHID LETTER NGA +01746 BUHID LETTER TA +01747 BUHID LETTER DA +01748 BUHID LETTER NA +01749 BUHID LETTER PA +0174A BUHID LETTER BA +0174B BUHID LETTER MA +0174C BUHID LETTER YA +0174D BUHID LETTER RA +0174E BUHID LETTER LA +0174F BUHID LETTER WA +01750 BUHID LETTER SA +01751 BUHID LETTER HA +01752 BUHID VOWEL SIGN I +01753 BUHID VOWEL SIGN U +01760 TAGBANWA LETTER A +01761 TAGBANWA LETTER I +01762 TAGBANWA LETTER U +01763 TAGBANWA LETTER KA +01764 TAGBANWA LETTER GA +01765 TAGBANWA LETTER NGA +01766 TAGBANWA LETTER TA +01767 TAGBANWA LETTER DA +01768 TAGBANWA LETTER NA +01769 TAGBANWA LETTER PA +0176A TAGBANWA LETTER BA +0176B TAGBANWA LETTER MA +0176C TAGBANWA LETTER YA +0176E TAGBANWA LETTER LA +0176F TAGBANWA LETTER WA +01770 TAGBANWA LETTER SA +01772 TAGBANWA VOWEL SIGN I +01773 TAGBANWA VOWEL SIGN U +01780 KHMER LETTER KA +01781 KHMER LETTER KHA +01782 KHMER LETTER KO +01783 KHMER LETTER KHO +01784 KHMER LETTER NGO +01785 KHMER LETTER CA +01786 KHMER LETTER CHA +01787 KHMER LETTER CO +01788 KHMER LETTER CHO +01789 KHMER LETTER NYO +0178A KHMER LETTER DA +0178B KHMER LETTER TTHA +0178C KHMER LETTER DO +0178D KHMER LETTER TTHO +0178E KHMER LETTER NNO +0178F KHMER LETTER TA +01790 KHMER LETTER THA +01791 KHMER LETTER TO +01792 KHMER LETTER THO +01793 KHMER LETTER NO +01794 KHMER LETTER BA +01795 KHMER LETTER PHA +01796 KHMER LETTER PO +01797 KHMER LETTER PHO +01798 KHMER LETTER MO +01799 KHMER LETTER YO +0179A KHMER LETTER RO +0179B KHMER LETTER LO +0179C KHMER LETTER VO +0179D KHMER LETTER SHA +0179E KHMER LETTER SSO +0179F KHMER LETTER SA +017A0 KHMER LETTER HA +017A1 KHMER LETTER LA +017A2 KHMER LETTER QA +017A3 KHMER INDEPENDENT VOWEL QAQ +017A4 KHMER INDEPENDENT VOWEL QAA +017A5 KHMER INDEPENDENT VOWEL QI +017A6 KHMER INDEPENDENT VOWEL QII +017A7 KHMER INDEPENDENT VOWEL QU +017A8 KHMER INDEPENDENT VOWEL QUK +017A9 KHMER INDEPENDENT VOWEL QUU +017AA KHMER INDEPENDENT VOWEL QUUV +017AB KHMER INDEPENDENT VOWEL RY +017AC KHMER INDEPENDENT VOWEL RYY +017AD KHMER INDEPENDENT VOWEL LY +017AE KHMER INDEPENDENT VOWEL LYY +017AF KHMER INDEPENDENT VOWEL QE +017B0 KHMER INDEPENDENT VOWEL QAI +017B1 KHMER INDEPENDENT VOWEL QOO TYPE ONE +017B2 KHMER INDEPENDENT VOWEL QOO TYPE TWO +017B3 KHMER INDEPENDENT VOWEL QAU +017B4 KHMER VOWEL INHERENT AQ +017B5 KHMER VOWEL INHERENT AA +017B6 KHMER VOWEL SIGN AA +017B7 KHMER VOWEL SIGN I +017B8 KHMER VOWEL SIGN II +017B9 KHMER VOWEL SIGN Y +017BA KHMER VOWEL SIGN YY +017BB KHMER VOWEL SIGN U +017BC KHMER VOWEL SIGN UU +017BD KHMER VOWEL SIGN UA +017BE KHMER VOWEL SIGN OE +017BF KHMER VOWEL SIGN YA +017C0 KHMER VOWEL SIGN IE +017C1 KHMER VOWEL SIGN E +017C2 KHMER VOWEL SIGN AE +017C3 KHMER VOWEL SIGN AI +017C4 KHMER VOWEL SIGN OO +017C5 KHMER VOWEL SIGN AU +017C6 KHMER SIGN NIKAHIT +017C7 KHMER SIGN REAHMUK +017C8 KHMER SIGN YUUKALEAPINTU +017C9 KHMER SIGN MUUSIKATOAN +017CA KHMER SIGN TRIISAP +017CB KHMER SIGN BANTOC +017CC KHMER SIGN ROBAT +017CD KHMER SIGN TOANDAKHIAT +017CE KHMER SIGN KAKABAT +017CF KHMER SIGN AHSDA +017D0 KHMER SIGN SAMYOK SANNYA +017D1 KHMER SIGN VIRIAM +017D2 KHMER SIGN COENG +017D3 KHMER SIGN BATHAMASAT +017D4 KHMER SIGN KHAN +017D5 KHMER SIGN BARIYOOSAN +017D6 KHMER SIGN CAMNUC PII KUUH +017D7 KHMER SIGN LEK TOO +017D8 KHMER SIGN BEYYAL +017D9 KHMER SIGN PHNAEK MUAN +017DA KHMER SIGN KOOMUUT +017DB KHMER CURRENCY SYMBOL RIEL +017DC KHMER SIGN AVAKRAHASANYA +017DD KHMER SIGN ATTHACAN +017E0 KHMER DIGIT ZERO +017E1 KHMER DIGIT ONE +017E2 KHMER DIGIT TWO +017E3 KHMER DIGIT THREE +017E4 KHMER DIGIT FOUR +017E5 KHMER DIGIT FIVE +017E6 KHMER DIGIT SIX +017E7 KHMER DIGIT SEVEN +017E8 KHMER DIGIT EIGHT +017E9 KHMER DIGIT NINE +017F0 KHMER SYMBOL LEK ATTAK SON +017F1 KHMER SYMBOL LEK ATTAK MUOY +017F2 KHMER SYMBOL LEK ATTAK PII +017F3 KHMER SYMBOL LEK ATTAK BEI +017F4 KHMER SYMBOL LEK ATTAK BUON +017F5 KHMER SYMBOL LEK ATTAK PRAM +017F6 KHMER SYMBOL LEK ATTAK PRAM-MUOY +017F7 KHMER SYMBOL LEK ATTAK PRAM-PII +017F8 KHMER SYMBOL LEK ATTAK PRAM-BEI +017F9 KHMER SYMBOL LEK ATTAK PRAM-BUON +01800 MONGOLIAN BIRGA +01801 MONGOLIAN ELLIPSIS +01802 MONGOLIAN COMMA +01803 MONGOLIAN FULL STOP +01804 MONGOLIAN COLON +01805 MONGOLIAN FOUR DOTS +01806 MONGOLIAN TODO SOFT HYPHEN +01807 MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +01808 MONGOLIAN MANCHU COMMA +01809 MONGOLIAN MANCHU FULL STOP +0180A MONGOLIAN NIRUGU +0180B MONGOLIAN FREE VARIATION SELECTOR ONE +0180B FVS1 +0180C MONGOLIAN FREE VARIATION SELECTOR TWO +0180C FVS2 +0180D MONGOLIAN FREE VARIATION SELECTOR THREE +0180D FVS3 +0180E MONGOLIAN VOWEL SEPARATOR +0180E MVS +01810 MONGOLIAN DIGIT ZERO +01811 MONGOLIAN DIGIT ONE +01812 MONGOLIAN DIGIT TWO +01813 MONGOLIAN DIGIT THREE +01814 MONGOLIAN DIGIT FOUR +01815 MONGOLIAN DIGIT FIVE +01816 MONGOLIAN DIGIT SIX +01817 MONGOLIAN DIGIT SEVEN +01818 MONGOLIAN DIGIT EIGHT +01819 MONGOLIAN DIGIT NINE +01820 MONGOLIAN LETTER A +01821 MONGOLIAN LETTER E +01822 MONGOLIAN LETTER I +01823 MONGOLIAN LETTER O +01824 MONGOLIAN LETTER U +01825 MONGOLIAN LETTER OE +01826 MONGOLIAN LETTER UE +01827 MONGOLIAN LETTER EE +01828 MONGOLIAN LETTER NA +01829 MONGOLIAN LETTER ANG +0182A MONGOLIAN LETTER BA +0182B MONGOLIAN LETTER PA +0182C MONGOLIAN LETTER QA +0182D MONGOLIAN LETTER GA +0182E MONGOLIAN LETTER MA +0182F MONGOLIAN LETTER LA +01830 MONGOLIAN LETTER SA +01831 MONGOLIAN LETTER SHA +01832 MONGOLIAN LETTER TA +01833 MONGOLIAN LETTER DA +01834 MONGOLIAN LETTER CHA +01835 MONGOLIAN LETTER JA +01836 MONGOLIAN LETTER YA +01837 MONGOLIAN LETTER RA +01838 MONGOLIAN LETTER WA +01839 MONGOLIAN LETTER FA +0183A MONGOLIAN LETTER KA +0183B MONGOLIAN LETTER KHA +0183C MONGOLIAN LETTER TSA +0183D MONGOLIAN LETTER ZA +0183E MONGOLIAN LETTER HAA +0183F MONGOLIAN LETTER ZRA +01840 MONGOLIAN LETTER LHA +01841 MONGOLIAN LETTER ZHI +01842 MONGOLIAN LETTER CHI +01843 MONGOLIAN LETTER TODO LONG VOWEL SIGN +01844 MONGOLIAN LETTER TODO E +01845 MONGOLIAN LETTER TODO I +01846 MONGOLIAN LETTER TODO O +01847 MONGOLIAN LETTER TODO U +01848 MONGOLIAN LETTER TODO OE +01849 MONGOLIAN LETTER TODO UE +0184A MONGOLIAN LETTER TODO ANG +0184B MONGOLIAN LETTER TODO BA +0184C MONGOLIAN LETTER TODO PA +0184D MONGOLIAN LETTER TODO QA +0184E MONGOLIAN LETTER TODO GA +0184F MONGOLIAN LETTER TODO MA +01850 MONGOLIAN LETTER TODO TA +01851 MONGOLIAN LETTER TODO DA +01852 MONGOLIAN LETTER TODO CHA +01853 MONGOLIAN LETTER TODO JA +01854 MONGOLIAN LETTER TODO TSA +01855 MONGOLIAN LETTER TODO YA +01856 MONGOLIAN LETTER TODO WA +01857 MONGOLIAN LETTER TODO KA +01858 MONGOLIAN LETTER TODO GAA +01859 MONGOLIAN LETTER TODO HAA +0185A MONGOLIAN LETTER TODO JIA +0185B MONGOLIAN LETTER TODO NIA +0185C MONGOLIAN LETTER TODO DZA +0185D MONGOLIAN LETTER SIBE E +0185E MONGOLIAN LETTER SIBE I +0185F MONGOLIAN LETTER SIBE IY +01860 MONGOLIAN LETTER SIBE UE +01861 MONGOLIAN LETTER SIBE U +01862 MONGOLIAN LETTER SIBE ANG +01863 MONGOLIAN LETTER SIBE KA +01864 MONGOLIAN LETTER SIBE GA +01865 MONGOLIAN LETTER SIBE HA +01866 MONGOLIAN LETTER SIBE PA +01867 MONGOLIAN LETTER SIBE SHA +01868 MONGOLIAN LETTER SIBE TA +01869 MONGOLIAN LETTER SIBE DA +0186A MONGOLIAN LETTER SIBE JA +0186B MONGOLIAN LETTER SIBE FA +0186C MONGOLIAN LETTER SIBE GAA +0186D MONGOLIAN LETTER SIBE HAA +0186E MONGOLIAN LETTER SIBE TSA +0186F MONGOLIAN LETTER SIBE ZA +01870 MONGOLIAN LETTER SIBE RAA +01871 MONGOLIAN LETTER SIBE CHA +01872 MONGOLIAN LETTER SIBE ZHA +01873 MONGOLIAN LETTER MANCHU I +01874 MONGOLIAN LETTER MANCHU KA +01875 MONGOLIAN LETTER MANCHU RA +01876 MONGOLIAN LETTER MANCHU FA +01877 MONGOLIAN LETTER MANCHU ZHA +01880 MONGOLIAN LETTER ALI GALI ANUSVARA ONE +01881 MONGOLIAN LETTER ALI GALI VISARGA ONE +01882 MONGOLIAN LETTER ALI GALI DAMARU +01883 MONGOLIAN LETTER ALI GALI UBADAMA +01884 MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +01885 MONGOLIAN LETTER ALI GALI BALUDA +01886 MONGOLIAN LETTER ALI GALI THREE BALUDA +01887 MONGOLIAN LETTER ALI GALI A +01888 MONGOLIAN LETTER ALI GALI I +01889 MONGOLIAN LETTER ALI GALI KA +0188A MONGOLIAN LETTER ALI GALI NGA +0188B MONGOLIAN LETTER ALI GALI CA +0188C MONGOLIAN LETTER ALI GALI TTA +0188D MONGOLIAN LETTER ALI GALI TTHA +0188E MONGOLIAN LETTER ALI GALI DDA +0188F MONGOLIAN LETTER ALI GALI NNA +01890 MONGOLIAN LETTER ALI GALI TA +01891 MONGOLIAN LETTER ALI GALI DA +01892 MONGOLIAN LETTER ALI GALI PA +01893 MONGOLIAN LETTER ALI GALI PHA +01894 MONGOLIAN LETTER ALI GALI SSA +01895 MONGOLIAN LETTER ALI GALI ZHA +01896 MONGOLIAN LETTER ALI GALI ZA +01897 MONGOLIAN LETTER ALI GALI AH +01898 MONGOLIAN LETTER TODO ALI GALI TA +01899 MONGOLIAN LETTER TODO ALI GALI ZHA +0189A MONGOLIAN LETTER MANCHU ALI GALI GHA +0189B MONGOLIAN LETTER MANCHU ALI GALI NGA +0189C MONGOLIAN LETTER MANCHU ALI GALI CA +0189D MONGOLIAN LETTER MANCHU ALI GALI JHA +0189E MONGOLIAN LETTER MANCHU ALI GALI TTA +0189F MONGOLIAN LETTER MANCHU ALI GALI DDHA +018A0 MONGOLIAN LETTER MANCHU ALI GALI TA +018A1 MONGOLIAN LETTER MANCHU ALI GALI DHA +018A2 MONGOLIAN LETTER MANCHU ALI GALI SSA +018A3 MONGOLIAN LETTER MANCHU ALI GALI CYA +018A4 MONGOLIAN LETTER MANCHU ALI GALI ZHA +018A5 MONGOLIAN LETTER MANCHU ALI GALI ZA +018A6 MONGOLIAN LETTER ALI GALI HALF U +018A7 MONGOLIAN LETTER ALI GALI HALF YA +018A8 MONGOLIAN LETTER MANCHU ALI GALI BHA +018A9 MONGOLIAN LETTER ALI GALI DAGALGA +018AA MONGOLIAN LETTER MANCHU ALI GALI LHA +018B0 CANADIAN SYLLABICS OY +018B1 CANADIAN SYLLABICS AY +018B2 CANADIAN SYLLABICS AAY +018B3 CANADIAN SYLLABICS WAY +018B4 CANADIAN SYLLABICS POY +018B5 CANADIAN SYLLABICS PAY +018B6 CANADIAN SYLLABICS PWOY +018B7 CANADIAN SYLLABICS TAY +018B8 CANADIAN SYLLABICS KAY +018B9 CANADIAN SYLLABICS KWAY +018BA CANADIAN SYLLABICS MAY +018BB CANADIAN SYLLABICS NOY +018BC CANADIAN SYLLABICS NAY +018BD CANADIAN SYLLABICS LAY +018BE CANADIAN SYLLABICS SOY +018BF CANADIAN SYLLABICS SAY +018C0 CANADIAN SYLLABICS SHOY +018C1 CANADIAN SYLLABICS SHAY +018C2 CANADIAN SYLLABICS SHWOY +018C3 CANADIAN SYLLABICS YOY +018C4 CANADIAN SYLLABICS YAY +018C5 CANADIAN SYLLABICS RAY +018C6 CANADIAN SYLLABICS NWI +018C7 CANADIAN SYLLABICS OJIBWAY NWI +018C8 CANADIAN SYLLABICS NWII +018C9 CANADIAN SYLLABICS OJIBWAY NWII +018CA CANADIAN SYLLABICS NWO +018CB CANADIAN SYLLABICS OJIBWAY NWO +018CC CANADIAN SYLLABICS NWOO +018CD CANADIAN SYLLABICS OJIBWAY NWOO +018CE CANADIAN SYLLABICS RWEE +018CF CANADIAN SYLLABICS RWI +018D0 CANADIAN SYLLABICS RWII +018D1 CANADIAN SYLLABICS RWO +018D2 CANADIAN SYLLABICS RWOO +018D3 CANADIAN SYLLABICS RWA +018D4 CANADIAN SYLLABICS OJIBWAY P +018D5 CANADIAN SYLLABICS OJIBWAY T +018D6 CANADIAN SYLLABICS OJIBWAY K +018D7 CANADIAN SYLLABICS OJIBWAY C +018D8 CANADIAN SYLLABICS OJIBWAY M +018D9 CANADIAN SYLLABICS OJIBWAY N +018DA CANADIAN SYLLABICS OJIBWAY S +018DB CANADIAN SYLLABICS OJIBWAY SH +018DC CANADIAN SYLLABICS EASTERN W +018DD CANADIAN SYLLABICS WESTERN W +018DE CANADIAN SYLLABICS FINAL SMALL RING +018DF CANADIAN SYLLABICS FINAL RAISED DOT +018E0 CANADIAN SYLLABICS R-CREE RWE +018E1 CANADIAN SYLLABICS WEST-CREE LOO +018E2 CANADIAN SYLLABICS WEST-CREE LAA +018E3 CANADIAN SYLLABICS THWE +018E4 CANADIAN SYLLABICS THWA +018E5 CANADIAN SYLLABICS TTHWE +018E6 CANADIAN SYLLABICS TTHOO +018E7 CANADIAN SYLLABICS TTHAA +018E8 CANADIAN SYLLABICS TLHWE +018E9 CANADIAN SYLLABICS TLHOO +018EA CANADIAN SYLLABICS SAYISI SHWE +018EB CANADIAN SYLLABICS SAYISI SHOO +018EC CANADIAN SYLLABICS SAYISI HOO +018ED CANADIAN SYLLABICS CARRIER GWU +018EE CANADIAN SYLLABICS CARRIER DENE GEE +018EF CANADIAN SYLLABICS CARRIER GAA +018F0 CANADIAN SYLLABICS CARRIER GWA +018F1 CANADIAN SYLLABICS SAYISI JUU +018F2 CANADIAN SYLLABICS CARRIER JWA +018F3 CANADIAN SYLLABICS BEAVER DENE L +018F4 CANADIAN SYLLABICS BEAVER DENE R +018F5 CANADIAN SYLLABICS CARRIER DENTAL S +01900 LIMBU VOWEL-CARRIER LETTER +01901 LIMBU LETTER KA +01902 LIMBU LETTER KHA +01903 LIMBU LETTER GA +01904 LIMBU LETTER GHA +01905 LIMBU LETTER NGA +01906 LIMBU LETTER CA +01907 LIMBU LETTER CHA +01908 LIMBU LETTER JA +01909 LIMBU LETTER JHA +0190A LIMBU LETTER YAN +0190B LIMBU LETTER TA +0190C LIMBU LETTER THA +0190D LIMBU LETTER DA +0190E LIMBU LETTER DHA +0190F LIMBU LETTER NA +01910 LIMBU LETTER PA +01911 LIMBU LETTER PHA +01912 LIMBU LETTER BA +01913 LIMBU LETTER BHA +01914 LIMBU LETTER MA +01915 LIMBU LETTER YA +01916 LIMBU LETTER RA +01917 LIMBU LETTER LA +01918 LIMBU LETTER WA +01919 LIMBU LETTER SHA +0191A LIMBU LETTER SSA +0191B LIMBU LETTER SA +0191C LIMBU LETTER HA +0191D LIMBU LETTER GYAN +0191E LIMBU LETTER TRA +01920 LIMBU VOWEL SIGN A +01921 LIMBU VOWEL SIGN I +01922 LIMBU VOWEL SIGN U +01923 LIMBU VOWEL SIGN EE +01924 LIMBU VOWEL SIGN AI +01925 LIMBU VOWEL SIGN OO +01926 LIMBU VOWEL SIGN AU +01927 LIMBU VOWEL SIGN E +01928 LIMBU VOWEL SIGN O +01929 LIMBU SUBJOINED LETTER YA +0192A LIMBU SUBJOINED LETTER RA +0192B LIMBU SUBJOINED LETTER WA +01930 LIMBU SMALL LETTER KA +01931 LIMBU SMALL LETTER NGA +01932 LIMBU SMALL LETTER ANUSVARA +01933 LIMBU SMALL LETTER TA +01934 LIMBU SMALL LETTER NA +01935 LIMBU SMALL LETTER PA +01936 LIMBU SMALL LETTER MA +01937 LIMBU SMALL LETTER RA +01938 LIMBU SMALL LETTER LA +01939 LIMBU SIGN MUKPHRENG +0193A LIMBU SIGN KEMPHRENG +0193B LIMBU SIGN SA-I +01940 LIMBU SIGN LOO +01944 LIMBU EXCLAMATION MARK +01945 LIMBU QUESTION MARK +01946 LIMBU DIGIT ZERO +01947 LIMBU DIGIT ONE +01948 LIMBU DIGIT TWO +01949 LIMBU DIGIT THREE +0194A LIMBU DIGIT FOUR +0194B LIMBU DIGIT FIVE +0194C LIMBU DIGIT SIX +0194D LIMBU DIGIT SEVEN +0194E LIMBU DIGIT EIGHT +0194F LIMBU DIGIT NINE +01950 TAI LE LETTER KA +01951 TAI LE LETTER XA +01952 TAI LE LETTER NGA +01953 TAI LE LETTER TSA +01954 TAI LE LETTER SA +01955 TAI LE LETTER YA +01956 TAI LE LETTER TA +01957 TAI LE LETTER THA +01958 TAI LE LETTER LA +01959 TAI LE LETTER PA +0195A TAI LE LETTER PHA +0195B TAI LE LETTER MA +0195C TAI LE LETTER FA +0195D TAI LE LETTER VA +0195E TAI LE LETTER HA +0195F TAI LE LETTER QA +01960 TAI LE LETTER KHA +01961 TAI LE LETTER TSHA +01962 TAI LE LETTER NA +01963 TAI LE LETTER A +01964 TAI LE LETTER I +01965 TAI LE LETTER EE +01966 TAI LE LETTER EH +01967 TAI LE LETTER U +01968 TAI LE LETTER OO +01969 TAI LE LETTER O +0196A TAI LE LETTER UE +0196B TAI LE LETTER E +0196C TAI LE LETTER AUE +0196D TAI LE LETTER AI +01970 TAI LE LETTER TONE-2 +01971 TAI LE LETTER TONE-3 +01972 TAI LE LETTER TONE-4 +01973 TAI LE LETTER TONE-5 +01974 TAI LE LETTER TONE-6 +01980 NEW TAI LUE LETTER HIGH QA +01981 NEW TAI LUE LETTER LOW QA +01982 NEW TAI LUE LETTER HIGH KA +01983 NEW TAI LUE LETTER HIGH XA +01984 NEW TAI LUE LETTER HIGH NGA +01985 NEW TAI LUE LETTER LOW KA +01986 NEW TAI LUE LETTER LOW XA +01987 NEW TAI LUE LETTER LOW NGA +01988 NEW TAI LUE LETTER HIGH TSA +01989 NEW TAI LUE LETTER HIGH SA +0198A NEW TAI LUE LETTER HIGH YA +0198B NEW TAI LUE LETTER LOW TSA +0198C NEW TAI LUE LETTER LOW SA +0198D NEW TAI LUE LETTER LOW YA +0198E NEW TAI LUE LETTER HIGH TA +0198F NEW TAI LUE LETTER HIGH THA +01990 NEW TAI LUE LETTER HIGH NA +01991 NEW TAI LUE LETTER LOW TA +01992 NEW TAI LUE LETTER LOW THA +01993 NEW TAI LUE LETTER LOW NA +01994 NEW TAI LUE LETTER HIGH PA +01995 NEW TAI LUE LETTER HIGH PHA +01996 NEW TAI LUE LETTER HIGH MA +01997 NEW TAI LUE LETTER LOW PA +01998 NEW TAI LUE LETTER LOW PHA +01999 NEW TAI LUE LETTER LOW MA +0199A NEW TAI LUE LETTER HIGH FA +0199B NEW TAI LUE LETTER HIGH VA +0199C NEW TAI LUE LETTER HIGH LA +0199D NEW TAI LUE LETTER LOW FA +0199E NEW TAI LUE LETTER LOW VA +0199F NEW TAI LUE LETTER LOW LA +019A0 NEW TAI LUE LETTER HIGH HA +019A1 NEW TAI LUE LETTER HIGH DA +019A2 NEW TAI LUE LETTER HIGH BA +019A3 NEW TAI LUE LETTER LOW HA +019A4 NEW TAI LUE LETTER LOW DA +019A5 NEW TAI LUE LETTER LOW BA +019A6 NEW TAI LUE LETTER HIGH KVA +019A7 NEW TAI LUE LETTER HIGH XVA +019A8 NEW TAI LUE LETTER LOW KVA +019A9 NEW TAI LUE LETTER LOW XVA +019AA NEW TAI LUE LETTER HIGH SUA +019AB NEW TAI LUE LETTER LOW SUA +019B0 NEW TAI LUE VOWEL SIGN VOWEL SHORTENER +019B1 NEW TAI LUE VOWEL SIGN AA +019B2 NEW TAI LUE VOWEL SIGN II +019B3 NEW TAI LUE VOWEL SIGN U +019B4 NEW TAI LUE VOWEL SIGN UU +019B5 NEW TAI LUE VOWEL SIGN E +019B6 NEW TAI LUE VOWEL SIGN AE +019B7 NEW TAI LUE VOWEL SIGN O +019B8 NEW TAI LUE VOWEL SIGN OA +019B9 NEW TAI LUE VOWEL SIGN UE +019BA NEW TAI LUE VOWEL SIGN AY +019BB NEW TAI LUE VOWEL SIGN AAY +019BC NEW TAI LUE VOWEL SIGN UY +019BD NEW TAI LUE VOWEL SIGN OY +019BE NEW TAI LUE VOWEL SIGN OAY +019BF NEW TAI LUE VOWEL SIGN UEY +019C0 NEW TAI LUE VOWEL SIGN IY +019C1 NEW TAI LUE LETTER FINAL V +019C2 NEW TAI LUE LETTER FINAL NG +019C3 NEW TAI LUE LETTER FINAL N +019C4 NEW TAI LUE LETTER FINAL M +019C5 NEW TAI LUE LETTER FINAL K +019C6 NEW TAI LUE LETTER FINAL D +019C7 NEW TAI LUE LETTER FINAL B +019C8 NEW TAI LUE TONE MARK-1 +019C9 NEW TAI LUE TONE MARK-2 +019D0 NEW TAI LUE DIGIT ZERO +019D1 NEW TAI LUE DIGIT ONE +019D2 NEW TAI LUE DIGIT TWO +019D3 NEW TAI LUE DIGIT THREE +019D4 NEW TAI LUE DIGIT FOUR +019D5 NEW TAI LUE DIGIT FIVE +019D6 NEW TAI LUE DIGIT SIX +019D7 NEW TAI LUE DIGIT SEVEN +019D8 NEW TAI LUE DIGIT EIGHT +019D9 NEW TAI LUE DIGIT NINE +019DA NEW TAI LUE THAM DIGIT ONE +019DE NEW TAI LUE SIGN LAE +019DF NEW TAI LUE SIGN LAEV +019E0 KHMER SYMBOL PATHAMASAT +019E1 KHMER SYMBOL MUOY KOET +019E2 KHMER SYMBOL PII KOET +019E3 KHMER SYMBOL BEI KOET +019E4 KHMER SYMBOL BUON KOET +019E5 KHMER SYMBOL PRAM KOET +019E6 KHMER SYMBOL PRAM-MUOY KOET +019E7 KHMER SYMBOL PRAM-PII KOET +019E8 KHMER SYMBOL PRAM-BEI KOET +019E9 KHMER SYMBOL PRAM-BUON KOET +019EA KHMER SYMBOL DAP KOET +019EB KHMER SYMBOL DAP-MUOY KOET +019EC KHMER SYMBOL DAP-PII KOET +019ED KHMER SYMBOL DAP-BEI KOET +019EE KHMER SYMBOL DAP-BUON KOET +019EF KHMER SYMBOL DAP-PRAM KOET +019F0 KHMER SYMBOL TUTEYASAT +019F1 KHMER SYMBOL MUOY ROC +019F2 KHMER SYMBOL PII ROC +019F3 KHMER SYMBOL BEI ROC +019F4 KHMER SYMBOL BUON ROC +019F5 KHMER SYMBOL PRAM ROC +019F6 KHMER SYMBOL PRAM-MUOY ROC +019F7 KHMER SYMBOL PRAM-PII ROC +019F8 KHMER SYMBOL PRAM-BEI ROC +019F9 KHMER SYMBOL PRAM-BUON ROC +019FA KHMER SYMBOL DAP ROC +019FB KHMER SYMBOL DAP-MUOY ROC +019FC KHMER SYMBOL DAP-PII ROC +019FD KHMER SYMBOL DAP-BEI ROC +019FE KHMER SYMBOL DAP-BUON ROC +019FF KHMER SYMBOL DAP-PRAM ROC +01A00 BUGINESE LETTER KA +01A01 BUGINESE LETTER GA +01A02 BUGINESE LETTER NGA +01A03 BUGINESE LETTER NGKA +01A04 BUGINESE LETTER PA +01A05 BUGINESE LETTER BA +01A06 BUGINESE LETTER MA +01A07 BUGINESE LETTER MPA +01A08 BUGINESE LETTER TA +01A09 BUGINESE LETTER DA +01A0A BUGINESE LETTER NA +01A0B BUGINESE LETTER NRA +01A0C BUGINESE LETTER CA +01A0D BUGINESE LETTER JA +01A0E BUGINESE LETTER NYA +01A0F BUGINESE LETTER NYCA +01A10 BUGINESE LETTER YA +01A11 BUGINESE LETTER RA +01A12 BUGINESE LETTER LA +01A13 BUGINESE LETTER VA +01A14 BUGINESE LETTER SA +01A15 BUGINESE LETTER A +01A16 BUGINESE LETTER HA +01A17 BUGINESE VOWEL SIGN I +01A18 BUGINESE VOWEL SIGN U +01A19 BUGINESE VOWEL SIGN E +01A1A BUGINESE VOWEL SIGN O +01A1B BUGINESE VOWEL SIGN AE +01A1E BUGINESE PALLAWA +01A1F BUGINESE END OF SECTION +01A20 TAI THAM LETTER HIGH KA +01A21 TAI THAM LETTER HIGH KHA +01A22 TAI THAM LETTER HIGH KXA +01A23 TAI THAM LETTER LOW KA +01A24 TAI THAM LETTER LOW KXA +01A25 TAI THAM LETTER LOW KHA +01A26 TAI THAM LETTER NGA +01A27 TAI THAM LETTER HIGH CA +01A28 TAI THAM LETTER HIGH CHA +01A29 TAI THAM LETTER LOW CA +01A2A TAI THAM LETTER LOW SA +01A2B TAI THAM LETTER LOW CHA +01A2C TAI THAM LETTER NYA +01A2D TAI THAM LETTER RATA +01A2E TAI THAM LETTER HIGH RATHA +01A2F TAI THAM LETTER DA +01A30 TAI THAM LETTER LOW RATHA +01A31 TAI THAM LETTER RANA +01A32 TAI THAM LETTER HIGH TA +01A33 TAI THAM LETTER HIGH THA +01A34 TAI THAM LETTER LOW TA +01A35 TAI THAM LETTER LOW THA +01A36 TAI THAM LETTER NA +01A37 TAI THAM LETTER BA +01A38 TAI THAM LETTER HIGH PA +01A39 TAI THAM LETTER HIGH PHA +01A3A TAI THAM LETTER HIGH FA +01A3B TAI THAM LETTER LOW PA +01A3C TAI THAM LETTER LOW FA +01A3D TAI THAM LETTER LOW PHA +01A3E TAI THAM LETTER MA +01A3F TAI THAM LETTER LOW YA +01A40 TAI THAM LETTER HIGH YA +01A41 TAI THAM LETTER RA +01A42 TAI THAM LETTER RUE +01A43 TAI THAM LETTER LA +01A44 TAI THAM LETTER LUE +01A45 TAI THAM LETTER WA +01A46 TAI THAM LETTER HIGH SHA +01A47 TAI THAM LETTER HIGH SSA +01A48 TAI THAM LETTER HIGH SA +01A49 TAI THAM LETTER HIGH HA +01A4A TAI THAM LETTER LLA +01A4B TAI THAM LETTER A +01A4C TAI THAM LETTER LOW HA +01A4D TAI THAM LETTER I +01A4E TAI THAM LETTER II +01A4F TAI THAM LETTER U +01A50 TAI THAM LETTER UU +01A51 TAI THAM LETTER EE +01A52 TAI THAM LETTER OO +01A53 TAI THAM LETTER LAE +01A54 TAI THAM LETTER GREAT SA +01A55 TAI THAM CONSONANT SIGN MEDIAL RA +01A56 TAI THAM CONSONANT SIGN MEDIAL LA +01A57 TAI THAM CONSONANT SIGN LA TANG LAI +01A58 TAI THAM SIGN MAI KANG LAI +01A59 TAI THAM CONSONANT SIGN FINAL NGA +01A5A TAI THAM CONSONANT SIGN LOW PA +01A5B TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA +01A5C TAI THAM CONSONANT SIGN MA +01A5D TAI THAM CONSONANT SIGN BA +01A5E TAI THAM CONSONANT SIGN SA +01A60 TAI THAM SIGN SAKOT +01A61 TAI THAM VOWEL SIGN A +01A62 TAI THAM VOWEL SIGN MAI SAT +01A63 TAI THAM VOWEL SIGN AA +01A64 TAI THAM VOWEL SIGN TALL AA +01A65 TAI THAM VOWEL SIGN I +01A66 TAI THAM VOWEL SIGN II +01A67 TAI THAM VOWEL SIGN UE +01A68 TAI THAM VOWEL SIGN UUE +01A69 TAI THAM VOWEL SIGN U +01A6A TAI THAM VOWEL SIGN UU +01A6B TAI THAM VOWEL SIGN O +01A6C TAI THAM VOWEL SIGN OA BELOW +01A6D TAI THAM VOWEL SIGN OY +01A6E TAI THAM VOWEL SIGN E +01A6F TAI THAM VOWEL SIGN AE +01A70 TAI THAM VOWEL SIGN OO +01A71 TAI THAM VOWEL SIGN AI +01A72 TAI THAM VOWEL SIGN THAM AI +01A73 TAI THAM VOWEL SIGN OA ABOVE +01A74 TAI THAM SIGN MAI KANG +01A75 TAI THAM SIGN TONE-1 +01A76 TAI THAM SIGN TONE-2 +01A77 TAI THAM SIGN KHUEN TONE-3 +01A78 TAI THAM SIGN KHUEN TONE-4 +01A79 TAI THAM SIGN KHUEN TONE-5 +01A7A TAI THAM SIGN RA HAAM +01A7B TAI THAM SIGN MAI SAM +01A7C TAI THAM SIGN KHUEN-LUE KARAN +01A7F TAI THAM COMBINING CRYPTOGRAMMIC DOT +01A80 TAI THAM HORA DIGIT ZERO +01A81 TAI THAM HORA DIGIT ONE +01A82 TAI THAM HORA DIGIT TWO +01A83 TAI THAM HORA DIGIT THREE +01A84 TAI THAM HORA DIGIT FOUR +01A85 TAI THAM HORA DIGIT FIVE +01A86 TAI THAM HORA DIGIT SIX +01A87 TAI THAM HORA DIGIT SEVEN +01A88 TAI THAM HORA DIGIT EIGHT +01A89 TAI THAM HORA DIGIT NINE +01A90 TAI THAM THAM DIGIT ZERO +01A91 TAI THAM THAM DIGIT ONE +01A92 TAI THAM THAM DIGIT TWO +01A93 TAI THAM THAM DIGIT THREE +01A94 TAI THAM THAM DIGIT FOUR +01A95 TAI THAM THAM DIGIT FIVE +01A96 TAI THAM THAM DIGIT SIX +01A97 TAI THAM THAM DIGIT SEVEN +01A98 TAI THAM THAM DIGIT EIGHT +01A99 TAI THAM THAM DIGIT NINE +01AA0 TAI THAM SIGN WIANG +01AA1 TAI THAM SIGN WIANGWAAK +01AA2 TAI THAM SIGN SAWAN +01AA3 TAI THAM SIGN KEOW +01AA4 TAI THAM SIGN HOY +01AA5 TAI THAM SIGN DOKMAI +01AA6 TAI THAM SIGN REVERSED ROTATED RANA +01AA7 TAI THAM SIGN MAI YAMOK +01AA8 TAI THAM SIGN KAAN +01AA9 TAI THAM SIGN KAANKUU +01AAA TAI THAM SIGN SATKAAN +01AAB TAI THAM SIGN SATKAANKUU +01AAC TAI THAM SIGN HANG +01AAD TAI THAM SIGN CAANG +01AB0 COMBINING DOUBLED CIRCUMFLEX ACCENT +01AB1 COMBINING DIAERESIS-RING +01AB2 COMBINING INFINITY +01AB3 COMBINING DOWNWARDS ARROW +01AB4 COMBINING TRIPLE DOT +01AB5 COMBINING X-X BELOW +01AB6 COMBINING WIGGLY LINE BELOW +01AB7 COMBINING OPEN MARK BELOW +01AB8 COMBINING DOUBLE OPEN MARK BELOW +01AB9 COMBINING LIGHT CENTRALIZATION STROKE BELOW +01ABA COMBINING STRONG CENTRALIZATION STROKE BELOW +01ABB COMBINING PARENTHESES ABOVE +01ABC COMBINING DOUBLE PARENTHESES ABOVE +01ABD COMBINING PARENTHESES BELOW +01ABE COMBINING PARENTHESES OVERLAY +01B00 BALINESE SIGN ULU RICEM +01B01 BALINESE SIGN ULU CANDRA +01B02 BALINESE SIGN CECEK +01B03 BALINESE SIGN SURANG +01B04 BALINESE SIGN BISAH +01B05 BALINESE LETTER AKARA +01B06 BALINESE LETTER AKARA TEDUNG +01B07 BALINESE LETTER IKARA +01B08 BALINESE LETTER IKARA TEDUNG +01B09 BALINESE LETTER UKARA +01B0A BALINESE LETTER UKARA TEDUNG +01B0B BALINESE LETTER RA REPA +01B0C BALINESE LETTER RA REPA TEDUNG +01B0D BALINESE LETTER LA LENGA +01B0E BALINESE LETTER LA LENGA TEDUNG +01B0F BALINESE LETTER EKARA +01B10 BALINESE LETTER AIKARA +01B11 BALINESE LETTER OKARA +01B12 BALINESE LETTER OKARA TEDUNG +01B13 BALINESE LETTER KA +01B14 BALINESE LETTER KA MAHAPRANA +01B15 BALINESE LETTER GA +01B16 BALINESE LETTER GA GORA +01B17 BALINESE LETTER NGA +01B18 BALINESE LETTER CA +01B19 BALINESE LETTER CA LACA +01B1A BALINESE LETTER JA +01B1B BALINESE LETTER JA JERA +01B1C BALINESE LETTER NYA +01B1D BALINESE LETTER TA LATIK +01B1E BALINESE LETTER TA MURDA MAHAPRANA +01B1F BALINESE LETTER DA MURDA ALPAPRANA +01B20 BALINESE LETTER DA MURDA MAHAPRANA +01B21 BALINESE LETTER NA RAMBAT +01B22 BALINESE LETTER TA +01B23 BALINESE LETTER TA TAWA +01B24 BALINESE LETTER DA +01B25 BALINESE LETTER DA MADU +01B26 BALINESE LETTER NA +01B27 BALINESE LETTER PA +01B28 BALINESE LETTER PA KAPAL +01B29 BALINESE LETTER BA +01B2A BALINESE LETTER BA KEMBANG +01B2B BALINESE LETTER MA +01B2C BALINESE LETTER YA +01B2D BALINESE LETTER RA +01B2E BALINESE LETTER LA +01B2F BALINESE LETTER WA +01B30 BALINESE LETTER SA SAGA +01B31 BALINESE LETTER SA SAPA +01B32 BALINESE LETTER SA +01B33 BALINESE LETTER HA +01B34 BALINESE SIGN REREKAN +01B35 BALINESE VOWEL SIGN TEDUNG +01B36 BALINESE VOWEL SIGN ULU +01B37 BALINESE VOWEL SIGN ULU SARI +01B38 BALINESE VOWEL SIGN SUKU +01B39 BALINESE VOWEL SIGN SUKU ILUT +01B3A BALINESE VOWEL SIGN RA REPA +01B3B BALINESE VOWEL SIGN RA REPA TEDUNG +01B3C BALINESE VOWEL SIGN LA LENGA +01B3D BALINESE VOWEL SIGN LA LENGA TEDUNG +01B3E BALINESE VOWEL SIGN TALING +01B3F BALINESE VOWEL SIGN TALING REPA +01B40 BALINESE VOWEL SIGN TALING TEDUNG +01B41 BALINESE VOWEL SIGN TALING REPA TEDUNG +01B42 BALINESE VOWEL SIGN PEPET +01B43 BALINESE VOWEL SIGN PEPET TEDUNG +01B44 BALINESE ADEG ADEG +01B45 BALINESE LETTER KAF SASAK +01B46 BALINESE LETTER KHOT SASAK +01B47 BALINESE LETTER TZIR SASAK +01B48 BALINESE LETTER EF SASAK +01B49 BALINESE LETTER VE SASAK +01B4A BALINESE LETTER ZAL SASAK +01B4B BALINESE LETTER ASYURA SASAK +01B50 BALINESE DIGIT ZERO +01B51 BALINESE DIGIT ONE +01B52 BALINESE DIGIT TWO +01B53 BALINESE DIGIT THREE +01B54 BALINESE DIGIT FOUR +01B55 BALINESE DIGIT FIVE +01B56 BALINESE DIGIT SIX +01B57 BALINESE DIGIT SEVEN +01B58 BALINESE DIGIT EIGHT +01B59 BALINESE DIGIT NINE +01B5A BALINESE PANTI +01B5B BALINESE PAMADA +01B5C BALINESE WINDU +01B5D BALINESE CARIK PAMUNGKAH +01B5E BALINESE CARIK SIKI +01B5F BALINESE CARIK PAREREN +01B60 BALINESE PAMENENG +01B61 BALINESE MUSICAL SYMBOL DONG +01B62 BALINESE MUSICAL SYMBOL DENG +01B63 BALINESE MUSICAL SYMBOL DUNG +01B64 BALINESE MUSICAL SYMBOL DANG +01B65 BALINESE MUSICAL SYMBOL DANG SURANG +01B66 BALINESE MUSICAL SYMBOL DING +01B67 BALINESE MUSICAL SYMBOL DAENG +01B68 BALINESE MUSICAL SYMBOL DEUNG +01B69 BALINESE MUSICAL SYMBOL DAING +01B6A BALINESE MUSICAL SYMBOL DANG GEDE +01B6B BALINESE MUSICAL SYMBOL COMBINING TEGEH +01B6C BALINESE MUSICAL SYMBOL COMBINING ENDEP +01B6D BALINESE MUSICAL SYMBOL COMBINING KEMPUL +01B6E BALINESE MUSICAL SYMBOL COMBINING KEMPLI +01B6F BALINESE MUSICAL SYMBOL COMBINING JEGOGAN +01B70 BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN +01B71 BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN +01B72 BALINESE MUSICAL SYMBOL COMBINING BENDE +01B73 BALINESE MUSICAL SYMBOL COMBINING GONG +01B74 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG +01B75 BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG +01B76 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK +01B77 BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK +01B78 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG +01B79 BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG +01B7A BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK +01B7B BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK +01B7C BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +01B80 SUNDANESE SIGN PANYECEK +01B81 SUNDANESE SIGN PANGLAYAR +01B82 SUNDANESE SIGN PANGWISAD +01B83 SUNDANESE LETTER A +01B84 SUNDANESE LETTER I +01B85 SUNDANESE LETTER U +01B86 SUNDANESE LETTER AE +01B87 SUNDANESE LETTER O +01B88 SUNDANESE LETTER E +01B89 SUNDANESE LETTER EU +01B8A SUNDANESE LETTER KA +01B8B SUNDANESE LETTER QA +01B8C SUNDANESE LETTER GA +01B8D SUNDANESE LETTER NGA +01B8E SUNDANESE LETTER CA +01B8F SUNDANESE LETTER JA +01B90 SUNDANESE LETTER ZA +01B91 SUNDANESE LETTER NYA +01B92 SUNDANESE LETTER TA +01B93 SUNDANESE LETTER DA +01B94 SUNDANESE LETTER NA +01B95 SUNDANESE LETTER PA +01B96 SUNDANESE LETTER FA +01B97 SUNDANESE LETTER VA +01B98 SUNDANESE LETTER BA +01B99 SUNDANESE LETTER MA +01B9A SUNDANESE LETTER YA +01B9B SUNDANESE LETTER RA +01B9C SUNDANESE LETTER LA +01B9D SUNDANESE LETTER WA +01B9E SUNDANESE LETTER SA +01B9F SUNDANESE LETTER XA +01BA0 SUNDANESE LETTER HA +01BA1 SUNDANESE CONSONANT SIGN PAMINGKAL +01BA2 SUNDANESE CONSONANT SIGN PANYAKRA +01BA3 SUNDANESE CONSONANT SIGN PANYIKU +01BA4 SUNDANESE VOWEL SIGN PANGHULU +01BA5 SUNDANESE VOWEL SIGN PANYUKU +01BA6 SUNDANESE VOWEL SIGN PANAELAENG +01BA7 SUNDANESE VOWEL SIGN PANOLONG +01BA8 SUNDANESE VOWEL SIGN PAMEPET +01BA9 SUNDANESE VOWEL SIGN PANEULEUNG +01BAA SUNDANESE SIGN PAMAAEH +01BAB SUNDANESE SIGN VIRAMA +01BAC SUNDANESE CONSONANT SIGN PASANGAN MA +01BAD SUNDANESE CONSONANT SIGN PASANGAN WA +01BAE SUNDANESE LETTER KHA +01BAF SUNDANESE LETTER SYA +01BB0 SUNDANESE DIGIT ZERO +01BB1 SUNDANESE DIGIT ONE +01BB2 SUNDANESE DIGIT TWO +01BB3 SUNDANESE DIGIT THREE +01BB4 SUNDANESE DIGIT FOUR +01BB5 SUNDANESE DIGIT FIVE +01BB6 SUNDANESE DIGIT SIX +01BB7 SUNDANESE DIGIT SEVEN +01BB8 SUNDANESE DIGIT EIGHT +01BB9 SUNDANESE DIGIT NINE +01BBA SUNDANESE AVAGRAHA +01BBB SUNDANESE LETTER REU +01BBC SUNDANESE LETTER LEU +01BBD SUNDANESE LETTER BHA +01BBE SUNDANESE LETTER FINAL K +01BBF SUNDANESE LETTER FINAL M +01BC0 BATAK LETTER A +01BC1 BATAK LETTER SIMALUNGUN A +01BC2 BATAK LETTER HA +01BC3 BATAK LETTER SIMALUNGUN HA +01BC4 BATAK LETTER MANDAILING HA +01BC5 BATAK LETTER BA +01BC6 BATAK LETTER KARO BA +01BC7 BATAK LETTER PA +01BC8 BATAK LETTER SIMALUNGUN PA +01BC9 BATAK LETTER NA +01BCA BATAK LETTER MANDAILING NA +01BCB BATAK LETTER WA +01BCC BATAK LETTER SIMALUNGUN WA +01BCD BATAK LETTER PAKPAK WA +01BCE BATAK LETTER GA +01BCF BATAK LETTER SIMALUNGUN GA +01BD0 BATAK LETTER JA +01BD1 BATAK LETTER DA +01BD2 BATAK LETTER RA +01BD3 BATAK LETTER SIMALUNGUN RA +01BD4 BATAK LETTER MA +01BD5 BATAK LETTER SIMALUNGUN MA +01BD6 BATAK LETTER SOUTHERN TA +01BD7 BATAK LETTER NORTHERN TA +01BD8 BATAK LETTER SA +01BD9 BATAK LETTER SIMALUNGUN SA +01BDA BATAK LETTER MANDAILING SA +01BDB BATAK LETTER YA +01BDC BATAK LETTER SIMALUNGUN YA +01BDD BATAK LETTER NGA +01BDE BATAK LETTER LA +01BDF BATAK LETTER SIMALUNGUN LA +01BE0 BATAK LETTER NYA +01BE1 BATAK LETTER CA +01BE2 BATAK LETTER NDA +01BE3 BATAK LETTER MBA +01BE4 BATAK LETTER I +01BE5 BATAK LETTER U +01BE6 BATAK SIGN TOMPI +01BE7 BATAK VOWEL SIGN E +01BE8 BATAK VOWEL SIGN PAKPAK E +01BE9 BATAK VOWEL SIGN EE +01BEA BATAK VOWEL SIGN I +01BEB BATAK VOWEL SIGN KARO I +01BEC BATAK VOWEL SIGN O +01BED BATAK VOWEL SIGN KARO O +01BEE BATAK VOWEL SIGN U +01BEF BATAK VOWEL SIGN U FOR SIMALUNGUN SA +01BF0 BATAK CONSONANT SIGN NG +01BF1 BATAK CONSONANT SIGN H +01BF2 BATAK PANGOLAT +01BF3 BATAK PANONGONAN +01BFC BATAK SYMBOL BINDU NA METEK +01BFD BATAK SYMBOL BINDU PINARBORAS +01BFE BATAK SYMBOL BINDU JUDUL +01BFF BATAK SYMBOL BINDU PANGOLAT +01C00 LEPCHA LETTER KA +01C01 LEPCHA LETTER KLA +01C02 LEPCHA LETTER KHA +01C03 LEPCHA LETTER GA +01C04 LEPCHA LETTER GLA +01C05 LEPCHA LETTER NGA +01C06 LEPCHA LETTER CA +01C07 LEPCHA LETTER CHA +01C08 LEPCHA LETTER JA +01C09 LEPCHA LETTER NYA +01C0A LEPCHA LETTER TA +01C0B LEPCHA LETTER THA +01C0C LEPCHA LETTER DA +01C0D LEPCHA LETTER NA +01C0E LEPCHA LETTER PA +01C0F LEPCHA LETTER PLA +01C10 LEPCHA LETTER PHA +01C11 LEPCHA LETTER FA +01C12 LEPCHA LETTER FLA +01C13 LEPCHA LETTER BA +01C14 LEPCHA LETTER BLA +01C15 LEPCHA LETTER MA +01C16 LEPCHA LETTER MLA +01C17 LEPCHA LETTER TSA +01C18 LEPCHA LETTER TSHA +01C19 LEPCHA LETTER DZA +01C1A LEPCHA LETTER YA +01C1B LEPCHA LETTER RA +01C1C LEPCHA LETTER LA +01C1D LEPCHA LETTER HA +01C1E LEPCHA LETTER HLA +01C1F LEPCHA LETTER VA +01C20 LEPCHA LETTER SA +01C21 LEPCHA LETTER SHA +01C22 LEPCHA LETTER WA +01C23 LEPCHA LETTER A +01C24 LEPCHA SUBJOINED LETTER YA +01C25 LEPCHA SUBJOINED LETTER RA +01C26 LEPCHA VOWEL SIGN AA +01C27 LEPCHA VOWEL SIGN I +01C28 LEPCHA VOWEL SIGN O +01C29 LEPCHA VOWEL SIGN OO +01C2A LEPCHA VOWEL SIGN U +01C2B LEPCHA VOWEL SIGN UU +01C2C LEPCHA VOWEL SIGN E +01C2D LEPCHA CONSONANT SIGN K +01C2E LEPCHA CONSONANT SIGN M +01C2F LEPCHA CONSONANT SIGN L +01C30 LEPCHA CONSONANT SIGN N +01C31 LEPCHA CONSONANT SIGN P +01C32 LEPCHA CONSONANT SIGN R +01C33 LEPCHA CONSONANT SIGN T +01C34 LEPCHA CONSONANT SIGN NYIN-DO +01C35 LEPCHA CONSONANT SIGN KANG +01C36 LEPCHA SIGN RAN +01C37 LEPCHA SIGN NUKTA +01C3B LEPCHA PUNCTUATION TA-ROL +01C3C LEPCHA PUNCTUATION NYET THYOOM TA-ROL +01C3D LEPCHA PUNCTUATION CER-WA +01C3E LEPCHA PUNCTUATION TSHOOK CER-WA +01C3F LEPCHA PUNCTUATION TSHOOK +01C40 LEPCHA DIGIT ZERO +01C41 LEPCHA DIGIT ONE +01C42 LEPCHA DIGIT TWO +01C43 LEPCHA DIGIT THREE +01C44 LEPCHA DIGIT FOUR +01C45 LEPCHA DIGIT FIVE +01C46 LEPCHA DIGIT SIX +01C47 LEPCHA DIGIT SEVEN +01C48 LEPCHA DIGIT EIGHT +01C49 LEPCHA DIGIT NINE +01C4D LEPCHA LETTER TTA +01C4E LEPCHA LETTER TTHA +01C4F LEPCHA LETTER DDA +01C50 OL CHIKI DIGIT ZERO +01C51 OL CHIKI DIGIT ONE +01C52 OL CHIKI DIGIT TWO +01C53 OL CHIKI DIGIT THREE +01C54 OL CHIKI DIGIT FOUR +01C55 OL CHIKI DIGIT FIVE +01C56 OL CHIKI DIGIT SIX +01C57 OL CHIKI DIGIT SEVEN +01C58 OL CHIKI DIGIT EIGHT +01C59 OL CHIKI DIGIT NINE +01C5A OL CHIKI LETTER LA +01C5B OL CHIKI LETTER AT +01C5C OL CHIKI LETTER AG +01C5D OL CHIKI LETTER ANG +01C5E OL CHIKI LETTER AL +01C5F OL CHIKI LETTER LAA +01C60 OL CHIKI LETTER AAK +01C61 OL CHIKI LETTER AAJ +01C62 OL CHIKI LETTER AAM +01C63 OL CHIKI LETTER AAW +01C64 OL CHIKI LETTER LI +01C65 OL CHIKI LETTER IS +01C66 OL CHIKI LETTER IH +01C67 OL CHIKI LETTER INY +01C68 OL CHIKI LETTER IR +01C69 OL CHIKI LETTER LU +01C6A OL CHIKI LETTER UC +01C6B OL CHIKI LETTER UD +01C6C OL CHIKI LETTER UNN +01C6D OL CHIKI LETTER UY +01C6E OL CHIKI LETTER LE +01C6F OL CHIKI LETTER EP +01C70 OL CHIKI LETTER EDD +01C71 OL CHIKI LETTER EN +01C72 OL CHIKI LETTER ERR +01C73 OL CHIKI LETTER LO +01C74 OL CHIKI LETTER OTT +01C75 OL CHIKI LETTER OB +01C76 OL CHIKI LETTER OV +01C77 OL CHIKI LETTER OH +01C78 OL CHIKI MU TTUDDAG +01C79 OL CHIKI GAAHLAA TTUDDAAG +01C7A OL CHIKI MU-GAAHLAA TTUDDAAG +01C7B OL CHIKI RELAA +01C7C OL CHIKI PHAARKAA +01C7D OL CHIKI AHAD +01C7E OL CHIKI PUNCTUATION MUCAAD +01C7F OL CHIKI PUNCTUATION DOUBLE MUCAAD +01C80 CYRILLIC SMALL LETTER ROUNDED VE +01C81 CYRILLIC SMALL LETTER LONG-LEGGED DE +01C82 CYRILLIC SMALL LETTER NARROW O +01C83 CYRILLIC SMALL LETTER WIDE ES +01C84 CYRILLIC SMALL LETTER TALL TE +01C85 CYRILLIC SMALL LETTER THREE-LEGGED TE +01C86 CYRILLIC SMALL LETTER TALL HARD SIGN +01C87 CYRILLIC SMALL LETTER TALL YAT +01C88 CYRILLIC SMALL LETTER UNBLENDED UK +01CC0 SUNDANESE PUNCTUATION BINDU SURYA +01CC1 SUNDANESE PUNCTUATION BINDU PANGLONG +01CC2 SUNDANESE PUNCTUATION BINDU PURNAMA +01CC3 SUNDANESE PUNCTUATION BINDU CAKRA +01CC4 SUNDANESE PUNCTUATION BINDU LEU SATANGA +01CC5 SUNDANESE PUNCTUATION BINDU KA SATANGA +01CC6 SUNDANESE PUNCTUATION BINDU DA SATANGA +01CC7 SUNDANESE PUNCTUATION BINDU BA SATANGA +01CD0 VEDIC TONE KARSHANA +01CD1 VEDIC TONE SHARA +01CD2 VEDIC TONE PRENKHA +01CD3 VEDIC SIGN NIHSHVASA +01CD4 VEDIC SIGN YAJURVEDIC MIDLINE SVARITA +01CD5 VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA +01CD6 VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA +01CD7 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA +01CD8 VEDIC TONE CANDRA BELOW +01CD9 VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER +01CDA VEDIC TONE DOUBLE SVARITA +01CDB VEDIC TONE TRIPLE SVARITA +01CDC VEDIC TONE KATHAKA ANUDATTA +01CDD VEDIC TONE DOT BELOW +01CDE VEDIC TONE TWO DOTS BELOW +01CDF VEDIC TONE THREE DOTS BELOW +01CE0 VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +01CE1 VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +01CE2 VEDIC SIGN VISARGA SVARITA +01CE3 VEDIC SIGN VISARGA UDATTA +01CE4 VEDIC SIGN REVERSED VISARGA UDATTA +01CE5 VEDIC SIGN VISARGA ANUDATTA +01CE6 VEDIC SIGN REVERSED VISARGA ANUDATTA +01CE7 VEDIC SIGN VISARGA UDATTA WITH TAIL +01CE8 VEDIC SIGN VISARGA ANUDATTA WITH TAIL +01CE9 VEDIC SIGN ANUSVARA ANTARGOMUKHA +01CEA VEDIC SIGN ANUSVARA BAHIRGOMUKHA +01CEB VEDIC SIGN ANUSVARA VAMAGOMUKHA +01CEC VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +01CED VEDIC SIGN TIRYAK +01CEE VEDIC SIGN HEXIFORM LONG ANUSVARA +01CEF VEDIC SIGN LONG ANUSVARA +01CF0 VEDIC SIGN RTHANG LONG ANUSVARA +01CF1 VEDIC SIGN ANUSVARA UBHAYATO MUKHA +01CF2 VEDIC SIGN ARDHAVISARGA +01CF3 VEDIC SIGN ROTATED ARDHAVISARGA +01CF4 VEDIC TONE CANDRA ABOVE +01CF5 VEDIC SIGN JIHVAMULIYA +01CF6 VEDIC SIGN UPADHMANIYA +01CF7 VEDIC SIGN ATIKRAMA +01CF8 VEDIC TONE RING ABOVE +01CF9 VEDIC TONE DOUBLE RING ABOVE +01D00 LATIN LETTER SMALL CAPITAL A +01D01 LATIN LETTER SMALL CAPITAL AE +01D02 LATIN SMALL LETTER TURNED AE +01D03 LATIN LETTER SMALL CAPITAL BARRED B +01D04 LATIN LETTER SMALL CAPITAL C +01D05 LATIN LETTER SMALL CAPITAL D +01D06 LATIN LETTER SMALL CAPITAL ETH +01D07 LATIN LETTER SMALL CAPITAL E +01D08 LATIN SMALL LETTER TURNED OPEN E +01D09 LATIN SMALL LETTER TURNED I +01D0A LATIN LETTER SMALL CAPITAL J +01D0B LATIN LETTER SMALL CAPITAL K +01D0C LATIN LETTER SMALL CAPITAL L WITH STROKE +01D0D LATIN LETTER SMALL CAPITAL M +01D0E LATIN LETTER SMALL CAPITAL REVERSED N +01D0F LATIN LETTER SMALL CAPITAL O +01D10 LATIN LETTER SMALL CAPITAL OPEN O +01D11 LATIN SMALL LETTER SIDEWAYS O +01D12 LATIN SMALL LETTER SIDEWAYS OPEN O +01D13 LATIN SMALL LETTER SIDEWAYS O WITH STROKE +01D14 LATIN SMALL LETTER TURNED OE +01D15 LATIN LETTER SMALL CAPITAL OU +01D16 LATIN SMALL LETTER TOP HALF O +01D17 LATIN SMALL LETTER BOTTOM HALF O +01D18 LATIN LETTER SMALL CAPITAL P +01D19 LATIN LETTER SMALL CAPITAL REVERSED R +01D1A LATIN LETTER SMALL CAPITAL TURNED R +01D1B LATIN LETTER SMALL CAPITAL T +01D1C LATIN LETTER SMALL CAPITAL U +01D1D LATIN SMALL LETTER SIDEWAYS U +01D1E LATIN SMALL LETTER SIDEWAYS DIAERESIZED U +01D1F LATIN SMALL LETTER SIDEWAYS TURNED M +01D20 LATIN LETTER SMALL CAPITAL V +01D21 LATIN LETTER SMALL CAPITAL W +01D22 LATIN LETTER SMALL CAPITAL Z +01D23 LATIN LETTER SMALL CAPITAL EZH +01D24 LATIN LETTER VOICED LARYNGEAL SPIRANT +01D25 LATIN LETTER AIN +01D26 GREEK LETTER SMALL CAPITAL GAMMA +01D27 GREEK LETTER SMALL CAPITAL LAMDA +01D28 GREEK LETTER SMALL CAPITAL PI +01D29 GREEK LETTER SMALL CAPITAL RHO +01D2A GREEK LETTER SMALL CAPITAL PSI +01D2B CYRILLIC LETTER SMALL CAPITAL EL +01D2C MODIFIER LETTER CAPITAL A +01D2D MODIFIER LETTER CAPITAL AE +01D2E MODIFIER LETTER CAPITAL B +01D2F MODIFIER LETTER CAPITAL BARRED B +01D30 MODIFIER LETTER CAPITAL D +01D31 MODIFIER LETTER CAPITAL E +01D32 MODIFIER LETTER CAPITAL REVERSED E +01D33 MODIFIER LETTER CAPITAL G +01D34 MODIFIER LETTER CAPITAL H +01D35 MODIFIER LETTER CAPITAL I +01D36 MODIFIER LETTER CAPITAL J +01D37 MODIFIER LETTER CAPITAL K +01D38 MODIFIER LETTER CAPITAL L +01D39 MODIFIER LETTER CAPITAL M +01D3A MODIFIER LETTER CAPITAL N +01D3B MODIFIER LETTER CAPITAL REVERSED N +01D3C MODIFIER LETTER CAPITAL O +01D3D MODIFIER LETTER CAPITAL OU +01D3E MODIFIER LETTER CAPITAL P +01D3F MODIFIER LETTER CAPITAL R +01D40 MODIFIER LETTER CAPITAL T +01D41 MODIFIER LETTER CAPITAL U +01D42 MODIFIER LETTER CAPITAL W +01D43 MODIFIER LETTER SMALL A +01D44 MODIFIER LETTER SMALL TURNED A +01D45 MODIFIER LETTER SMALL ALPHA +01D46 MODIFIER LETTER SMALL TURNED AE +01D47 MODIFIER LETTER SMALL B +01D48 MODIFIER LETTER SMALL D +01D49 MODIFIER LETTER SMALL E +01D4A MODIFIER LETTER SMALL SCHWA +01D4B MODIFIER LETTER SMALL OPEN E +01D4C MODIFIER LETTER SMALL TURNED OPEN E +01D4D MODIFIER LETTER SMALL G +01D4E MODIFIER LETTER SMALL TURNED I +01D4F MODIFIER LETTER SMALL K +01D50 MODIFIER LETTER SMALL M +01D51 MODIFIER LETTER SMALL ENG +01D52 MODIFIER LETTER SMALL O +01D53 MODIFIER LETTER SMALL OPEN O +01D54 MODIFIER LETTER SMALL TOP HALF O +01D55 MODIFIER LETTER SMALL BOTTOM HALF O +01D56 MODIFIER LETTER SMALL P +01D57 MODIFIER LETTER SMALL T +01D58 MODIFIER LETTER SMALL U +01D59 MODIFIER LETTER SMALL SIDEWAYS U +01D5A MODIFIER LETTER SMALL TURNED M +01D5B MODIFIER LETTER SMALL V +01D5C MODIFIER LETTER SMALL AIN +01D5D MODIFIER LETTER SMALL BETA +01D5E MODIFIER LETTER SMALL GREEK GAMMA +01D5F MODIFIER LETTER SMALL DELTA +01D60 MODIFIER LETTER SMALL GREEK PHI +01D61 MODIFIER LETTER SMALL CHI +01D62 LATIN SUBSCRIPT SMALL LETTER I +01D63 LATIN SUBSCRIPT SMALL LETTER R +01D64 LATIN SUBSCRIPT SMALL LETTER U +01D65 LATIN SUBSCRIPT SMALL LETTER V +01D66 GREEK SUBSCRIPT SMALL LETTER BETA +01D67 GREEK SUBSCRIPT SMALL LETTER GAMMA +01D68 GREEK SUBSCRIPT SMALL LETTER RHO +01D69 GREEK SUBSCRIPT SMALL LETTER PHI +01D6A GREEK SUBSCRIPT SMALL LETTER CHI +01D6B LATIN SMALL LETTER UE +01D6C LATIN SMALL LETTER B WITH MIDDLE TILDE +01D6D LATIN SMALL LETTER D WITH MIDDLE TILDE +01D6E LATIN SMALL LETTER F WITH MIDDLE TILDE +01D6F LATIN SMALL LETTER M WITH MIDDLE TILDE +01D70 LATIN SMALL LETTER N WITH MIDDLE TILDE +01D71 LATIN SMALL LETTER P WITH MIDDLE TILDE +01D72 LATIN SMALL LETTER R WITH MIDDLE TILDE +01D73 LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE +01D74 LATIN SMALL LETTER S WITH MIDDLE TILDE +01D75 LATIN SMALL LETTER T WITH MIDDLE TILDE +01D76 LATIN SMALL LETTER Z WITH MIDDLE TILDE +01D77 LATIN SMALL LETTER TURNED G +01D78 MODIFIER LETTER CYRILLIC EN +01D79 LATIN SMALL LETTER INSULAR G +01D7A LATIN SMALL LETTER TH WITH STRIKETHROUGH +01D7B LATIN SMALL CAPITAL LETTER I WITH STROKE +01D7C LATIN SMALL LETTER IOTA WITH STROKE +01D7D LATIN SMALL LETTER P WITH STROKE +01D7E LATIN SMALL CAPITAL LETTER U WITH STROKE +01D7F LATIN SMALL LETTER UPSILON WITH STROKE +01D80 LATIN SMALL LETTER B WITH PALATAL HOOK +01D81 LATIN SMALL LETTER D WITH PALATAL HOOK +01D82 LATIN SMALL LETTER F WITH PALATAL HOOK +01D83 LATIN SMALL LETTER G WITH PALATAL HOOK +01D84 LATIN SMALL LETTER K WITH PALATAL HOOK +01D85 LATIN SMALL LETTER L WITH PALATAL HOOK +01D86 LATIN SMALL LETTER M WITH PALATAL HOOK +01D87 LATIN SMALL LETTER N WITH PALATAL HOOK +01D88 LATIN SMALL LETTER P WITH PALATAL HOOK +01D89 LATIN SMALL LETTER R WITH PALATAL HOOK +01D8A LATIN SMALL LETTER S WITH PALATAL HOOK +01D8B LATIN SMALL LETTER ESH WITH PALATAL HOOK +01D8C LATIN SMALL LETTER V WITH PALATAL HOOK +01D8D LATIN SMALL LETTER X WITH PALATAL HOOK +01D8E LATIN SMALL LETTER Z WITH PALATAL HOOK +01D8F LATIN SMALL LETTER A WITH RETROFLEX HOOK +01D90 LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK +01D91 LATIN SMALL LETTER D WITH HOOK AND TAIL +01D92 LATIN SMALL LETTER E WITH RETROFLEX HOOK +01D93 LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK +01D94 LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK +01D95 LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK +01D96 LATIN SMALL LETTER I WITH RETROFLEX HOOK +01D97 LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK +01D98 LATIN SMALL LETTER ESH WITH RETROFLEX HOOK +01D99 LATIN SMALL LETTER U WITH RETROFLEX HOOK +01D9A LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +01D9B MODIFIER LETTER SMALL TURNED ALPHA +01D9C MODIFIER LETTER SMALL C +01D9D MODIFIER LETTER SMALL C WITH CURL +01D9E MODIFIER LETTER SMALL ETH +01D9F MODIFIER LETTER SMALL REVERSED OPEN E +01DA0 MODIFIER LETTER SMALL F +01DA1 MODIFIER LETTER SMALL DOTLESS J WITH STROKE +01DA2 MODIFIER LETTER SMALL SCRIPT G +01DA3 MODIFIER LETTER SMALL TURNED H +01DA4 MODIFIER LETTER SMALL I WITH STROKE +01DA5 MODIFIER LETTER SMALL IOTA +01DA6 MODIFIER LETTER SMALL CAPITAL I +01DA7 MODIFIER LETTER SMALL CAPITAL I WITH STROKE +01DA8 MODIFIER LETTER SMALL J WITH CROSSED-TAIL +01DA9 MODIFIER LETTER SMALL L WITH RETROFLEX HOOK +01DAA MODIFIER LETTER SMALL L WITH PALATAL HOOK +01DAB MODIFIER LETTER SMALL CAPITAL L +01DAC MODIFIER LETTER SMALL M WITH HOOK +01DAD MODIFIER LETTER SMALL TURNED M WITH LONG LEG +01DAE MODIFIER LETTER SMALL N WITH LEFT HOOK +01DAF MODIFIER LETTER SMALL N WITH RETROFLEX HOOK +01DB0 MODIFIER LETTER SMALL CAPITAL N +01DB1 MODIFIER LETTER SMALL BARRED O +01DB2 MODIFIER LETTER SMALL PHI +01DB3 MODIFIER LETTER SMALL S WITH HOOK +01DB4 MODIFIER LETTER SMALL ESH +01DB5 MODIFIER LETTER SMALL T WITH PALATAL HOOK +01DB6 MODIFIER LETTER SMALL U BAR +01DB7 MODIFIER LETTER SMALL UPSILON +01DB8 MODIFIER LETTER SMALL CAPITAL U +01DB9 MODIFIER LETTER SMALL V WITH HOOK +01DBA MODIFIER LETTER SMALL TURNED V +01DBB MODIFIER LETTER SMALL Z +01DBC MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK +01DBD MODIFIER LETTER SMALL Z WITH CURL +01DBE MODIFIER LETTER SMALL EZH +01DBF MODIFIER LETTER SMALL THETA +01DC0 COMBINING DOTTED GRAVE ACCENT +01DC1 COMBINING DOTTED ACUTE ACCENT +01DC2 COMBINING SNAKE BELOW +01DC3 COMBINING SUSPENSION MARK +01DC4 COMBINING MACRON-ACUTE +01DC5 COMBINING GRAVE-MACRON +01DC6 COMBINING MACRON-GRAVE +01DC7 COMBINING ACUTE-MACRON +01DC8 COMBINING GRAVE-ACUTE-GRAVE +01DC9 COMBINING ACUTE-GRAVE-ACUTE +01DCA COMBINING LATIN SMALL LETTER R BELOW +01DCB COMBINING BREVE-MACRON +01DCC COMBINING MACRON-BREVE +01DCD COMBINING DOUBLE CIRCUMFLEX ABOVE +01DCE COMBINING OGONEK ABOVE +01DCF COMBINING ZIGZAG BELOW +01DD0 COMBINING IS BELOW +01DD1 COMBINING UR ABOVE +01DD2 COMBINING US ABOVE +01DD3 COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE +01DD4 COMBINING LATIN SMALL LETTER AE +01DD5 COMBINING LATIN SMALL LETTER AO +01DD6 COMBINING LATIN SMALL LETTER AV +01DD7 COMBINING LATIN SMALL LETTER C CEDILLA +01DD8 COMBINING LATIN SMALL LETTER INSULAR D +01DD9 COMBINING LATIN SMALL LETTER ETH +01DDA COMBINING LATIN SMALL LETTER G +01DDB COMBINING LATIN LETTER SMALL CAPITAL G +01DDC COMBINING LATIN SMALL LETTER K +01DDD COMBINING LATIN SMALL LETTER L +01DDE COMBINING LATIN LETTER SMALL CAPITAL L +01DDF COMBINING LATIN LETTER SMALL CAPITAL M +01DE0 COMBINING LATIN SMALL LETTER N +01DE1 COMBINING LATIN LETTER SMALL CAPITAL N +01DE2 COMBINING LATIN LETTER SMALL CAPITAL R +01DE3 COMBINING LATIN SMALL LETTER R ROTUNDA +01DE4 COMBINING LATIN SMALL LETTER S +01DE5 COMBINING LATIN SMALL LETTER LONG S +01DE6 COMBINING LATIN SMALL LETTER Z +01DE7 COMBINING LATIN SMALL LETTER ALPHA +01DE8 COMBINING LATIN SMALL LETTER B +01DE9 COMBINING LATIN SMALL LETTER BETA +01DEA COMBINING LATIN SMALL LETTER SCHWA +01DEB COMBINING LATIN SMALL LETTER F +01DEC COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +01DED COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE +01DEE COMBINING LATIN SMALL LETTER P +01DEF COMBINING LATIN SMALL LETTER ESH +01DF0 COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE +01DF1 COMBINING LATIN SMALL LETTER W +01DF2 COMBINING LATIN SMALL LETTER A WITH DIAERESIS +01DF3 COMBINING LATIN SMALL LETTER O WITH DIAERESIS +01DF4 COMBINING LATIN SMALL LETTER U WITH DIAERESIS +01DF5 COMBINING UP TACK ABOVE +01DF6 COMBINING KAVYKA ABOVE RIGHT +01DF7 COMBINING KAVYKA ABOVE LEFT +01DF8 COMBINING DOT ABOVE LEFT +01DF9 COMBINING WIDE INVERTED BRIDGE BELOW +01DFB COMBINING DELETION MARK +01DFC COMBINING DOUBLE INVERTED BREVE BELOW +01DFD COMBINING ALMOST EQUAL TO BELOW +01DFE COMBINING LEFT ARROWHEAD ABOVE +01DFF COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +01E00 LATIN CAPITAL LETTER A WITH RING BELOW +01E01 LATIN SMALL LETTER A WITH RING BELOW +01E02 LATIN CAPITAL LETTER B WITH DOT ABOVE +01E03 LATIN SMALL LETTER B WITH DOT ABOVE +01E04 LATIN CAPITAL LETTER B WITH DOT BELOW +01E05 LATIN SMALL LETTER B WITH DOT BELOW +01E06 LATIN CAPITAL LETTER B WITH LINE BELOW +01E07 LATIN SMALL LETTER B WITH LINE BELOW +01E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +01E09 LATIN SMALL LETTER C WITH CEDILLA AND ACUTE +01E0A LATIN CAPITAL LETTER D WITH DOT ABOVE +01E0B LATIN SMALL LETTER D WITH DOT ABOVE +01E0C LATIN CAPITAL LETTER D WITH DOT BELOW +01E0D LATIN SMALL LETTER D WITH DOT BELOW +01E0E LATIN CAPITAL LETTER D WITH LINE BELOW +01E0F LATIN SMALL LETTER D WITH LINE BELOW +01E10 LATIN CAPITAL LETTER D WITH CEDILLA +01E11 LATIN SMALL LETTER D WITH CEDILLA +01E12 LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +01E13 LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW +01E14 LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +01E15 LATIN SMALL LETTER E WITH MACRON AND GRAVE +01E16 LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +01E17 LATIN SMALL LETTER E WITH MACRON AND ACUTE +01E18 LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +01E19 LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW +01E1A LATIN CAPITAL LETTER E WITH TILDE BELOW +01E1B LATIN SMALL LETTER E WITH TILDE BELOW +01E1C LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +01E1D LATIN SMALL LETTER E WITH CEDILLA AND BREVE +01E1E LATIN CAPITAL LETTER F WITH DOT ABOVE +01E1F LATIN SMALL LETTER F WITH DOT ABOVE +01E20 LATIN CAPITAL LETTER G WITH MACRON +01E21 LATIN SMALL LETTER G WITH MACRON +01E22 LATIN CAPITAL LETTER H WITH DOT ABOVE +01E23 LATIN SMALL LETTER H WITH DOT ABOVE +01E24 LATIN CAPITAL LETTER H WITH DOT BELOW +01E25 LATIN SMALL LETTER H WITH DOT BELOW +01E26 LATIN CAPITAL LETTER H WITH DIAERESIS +01E27 LATIN SMALL LETTER H WITH DIAERESIS +01E28 LATIN CAPITAL LETTER H WITH CEDILLA +01E29 LATIN SMALL LETTER H WITH CEDILLA +01E2A LATIN CAPITAL LETTER H WITH BREVE BELOW +01E2B LATIN SMALL LETTER H WITH BREVE BELOW +01E2C LATIN CAPITAL LETTER I WITH TILDE BELOW +01E2D LATIN SMALL LETTER I WITH TILDE BELOW +01E2E LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +01E2F LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE +01E30 LATIN CAPITAL LETTER K WITH ACUTE +01E31 LATIN SMALL LETTER K WITH ACUTE +01E32 LATIN CAPITAL LETTER K WITH DOT BELOW +01E33 LATIN SMALL LETTER K WITH DOT BELOW +01E34 LATIN CAPITAL LETTER K WITH LINE BELOW +01E35 LATIN SMALL LETTER K WITH LINE BELOW +01E36 LATIN CAPITAL LETTER L WITH DOT BELOW +01E37 LATIN SMALL LETTER L WITH DOT BELOW +01E38 LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +01E39 LATIN SMALL LETTER L WITH DOT BELOW AND MACRON +01E3A LATIN CAPITAL LETTER L WITH LINE BELOW +01E3B LATIN SMALL LETTER L WITH LINE BELOW +01E3C LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +01E3D LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW +01E3E LATIN CAPITAL LETTER M WITH ACUTE +01E3F LATIN SMALL LETTER M WITH ACUTE +01E40 LATIN CAPITAL LETTER M WITH DOT ABOVE +01E41 LATIN SMALL LETTER M WITH DOT ABOVE +01E42 LATIN CAPITAL LETTER M WITH DOT BELOW +01E43 LATIN SMALL LETTER M WITH DOT BELOW +01E44 LATIN CAPITAL LETTER N WITH DOT ABOVE +01E45 LATIN SMALL LETTER N WITH DOT ABOVE +01E46 LATIN CAPITAL LETTER N WITH DOT BELOW +01E47 LATIN SMALL LETTER N WITH DOT BELOW +01E48 LATIN CAPITAL LETTER N WITH LINE BELOW +01E49 LATIN SMALL LETTER N WITH LINE BELOW +01E4A LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +01E4B LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW +01E4C LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +01E4D LATIN SMALL LETTER O WITH TILDE AND ACUTE +01E4E LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +01E4F LATIN SMALL LETTER O WITH TILDE AND DIAERESIS +01E50 LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +01E51 LATIN SMALL LETTER O WITH MACRON AND GRAVE +01E52 LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +01E53 LATIN SMALL LETTER O WITH MACRON AND ACUTE +01E54 LATIN CAPITAL LETTER P WITH ACUTE +01E55 LATIN SMALL LETTER P WITH ACUTE +01E56 LATIN CAPITAL LETTER P WITH DOT ABOVE +01E57 LATIN SMALL LETTER P WITH DOT ABOVE +01E58 LATIN CAPITAL LETTER R WITH DOT ABOVE +01E59 LATIN SMALL LETTER R WITH DOT ABOVE +01E5A LATIN CAPITAL LETTER R WITH DOT BELOW +01E5B LATIN SMALL LETTER R WITH DOT BELOW +01E5C LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +01E5D LATIN SMALL LETTER R WITH DOT BELOW AND MACRON +01E5E LATIN CAPITAL LETTER R WITH LINE BELOW +01E5F LATIN SMALL LETTER R WITH LINE BELOW +01E60 LATIN CAPITAL LETTER S WITH DOT ABOVE +01E61 LATIN SMALL LETTER S WITH DOT ABOVE +01E62 LATIN CAPITAL LETTER S WITH DOT BELOW +01E63 LATIN SMALL LETTER S WITH DOT BELOW +01E64 LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +01E65 LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE +01E66 LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +01E67 LATIN SMALL LETTER S WITH CARON AND DOT ABOVE +01E68 LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +01E69 LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE +01E6A LATIN CAPITAL LETTER T WITH DOT ABOVE +01E6B LATIN SMALL LETTER T WITH DOT ABOVE +01E6C LATIN CAPITAL LETTER T WITH DOT BELOW +01E6D LATIN SMALL LETTER T WITH DOT BELOW +01E6E LATIN CAPITAL LETTER T WITH LINE BELOW +01E6F LATIN SMALL LETTER T WITH LINE BELOW +01E70 LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +01E71 LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW +01E72 LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +01E73 LATIN SMALL LETTER U WITH DIAERESIS BELOW +01E74 LATIN CAPITAL LETTER U WITH TILDE BELOW +01E75 LATIN SMALL LETTER U WITH TILDE BELOW +01E76 LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +01E77 LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW +01E78 LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +01E79 LATIN SMALL LETTER U WITH TILDE AND ACUTE +01E7A LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +01E7B LATIN SMALL LETTER U WITH MACRON AND DIAERESIS +01E7C LATIN CAPITAL LETTER V WITH TILDE +01E7D LATIN SMALL LETTER V WITH TILDE +01E7E LATIN CAPITAL LETTER V WITH DOT BELOW +01E7F LATIN SMALL LETTER V WITH DOT BELOW +01E80 LATIN CAPITAL LETTER W WITH GRAVE +01E81 LATIN SMALL LETTER W WITH GRAVE +01E82 LATIN CAPITAL LETTER W WITH ACUTE +01E83 LATIN SMALL LETTER W WITH ACUTE +01E84 LATIN CAPITAL LETTER W WITH DIAERESIS +01E85 LATIN SMALL LETTER W WITH DIAERESIS +01E86 LATIN CAPITAL LETTER W WITH DOT ABOVE +01E87 LATIN SMALL LETTER W WITH DOT ABOVE +01E88 LATIN CAPITAL LETTER W WITH DOT BELOW +01E89 LATIN SMALL LETTER W WITH DOT BELOW +01E8A LATIN CAPITAL LETTER X WITH DOT ABOVE +01E8B LATIN SMALL LETTER X WITH DOT ABOVE +01E8C LATIN CAPITAL LETTER X WITH DIAERESIS +01E8D LATIN SMALL LETTER X WITH DIAERESIS +01E8E LATIN CAPITAL LETTER Y WITH DOT ABOVE +01E8F LATIN SMALL LETTER Y WITH DOT ABOVE +01E90 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +01E91 LATIN SMALL LETTER Z WITH CIRCUMFLEX +01E92 LATIN CAPITAL LETTER Z WITH DOT BELOW +01E93 LATIN SMALL LETTER Z WITH DOT BELOW +01E94 LATIN CAPITAL LETTER Z WITH LINE BELOW +01E95 LATIN SMALL LETTER Z WITH LINE BELOW +01E96 LATIN SMALL LETTER H WITH LINE BELOW +01E97 LATIN SMALL LETTER T WITH DIAERESIS +01E98 LATIN SMALL LETTER W WITH RING ABOVE +01E99 LATIN SMALL LETTER Y WITH RING ABOVE +01E9A LATIN SMALL LETTER A WITH RIGHT HALF RING +01E9B LATIN SMALL LETTER LONG S WITH DOT ABOVE +01E9C LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE +01E9D LATIN SMALL LETTER LONG S WITH HIGH STROKE +01E9E LATIN CAPITAL LETTER SHARP S +01E9F LATIN SMALL LETTER DELTA +01EA0 LATIN CAPITAL LETTER A WITH DOT BELOW +01EA1 LATIN SMALL LETTER A WITH DOT BELOW +01EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE +01EA3 LATIN SMALL LETTER A WITH HOOK ABOVE +01EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +01EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE +01EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +01EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE +01EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +01EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +01EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +01EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE +01EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +01EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW +01EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +01EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE +01EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +01EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE +01EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +01EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE +01EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE +01EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE +01EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +01EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW +01EB8 LATIN CAPITAL LETTER E WITH DOT BELOW +01EB9 LATIN SMALL LETTER E WITH DOT BELOW +01EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE +01EBB LATIN SMALL LETTER E WITH HOOK ABOVE +01EBC LATIN CAPITAL LETTER E WITH TILDE +01EBD LATIN SMALL LETTER E WITH TILDE +01EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +01EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE +01EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +01EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE +01EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +01EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +01EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +01EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE +01EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +01EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW +01EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE +01EC9 LATIN SMALL LETTER I WITH HOOK ABOVE +01ECA LATIN CAPITAL LETTER I WITH DOT BELOW +01ECB LATIN SMALL LETTER I WITH DOT BELOW +01ECC LATIN CAPITAL LETTER O WITH DOT BELOW +01ECD LATIN SMALL LETTER O WITH DOT BELOW +01ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE +01ECF LATIN SMALL LETTER O WITH HOOK ABOVE +01ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +01ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE +01ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +01ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE +01ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +01ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +01ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +01ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE +01ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +01ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW +01EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE +01EDB LATIN SMALL LETTER O WITH HORN AND ACUTE +01EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE +01EDD LATIN SMALL LETTER O WITH HORN AND GRAVE +01EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +01EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE +01EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE +01EE1 LATIN SMALL LETTER O WITH HORN AND TILDE +01EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +01EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW +01EE4 LATIN CAPITAL LETTER U WITH DOT BELOW +01EE5 LATIN SMALL LETTER U WITH DOT BELOW +01EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE +01EE7 LATIN SMALL LETTER U WITH HOOK ABOVE +01EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE +01EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE +01EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE +01EEB LATIN SMALL LETTER U WITH HORN AND GRAVE +01EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +01EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE +01EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE +01EEF LATIN SMALL LETTER U WITH HORN AND TILDE +01EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +01EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW +01EF2 LATIN CAPITAL LETTER Y WITH GRAVE +01EF3 LATIN SMALL LETTER Y WITH GRAVE +01EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW +01EF5 LATIN SMALL LETTER Y WITH DOT BELOW +01EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE +01EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE +01EF8 LATIN CAPITAL LETTER Y WITH TILDE +01EF9 LATIN SMALL LETTER Y WITH TILDE +01EFA LATIN CAPITAL LETTER MIDDLE-WELSH LL +01EFB LATIN SMALL LETTER MIDDLE-WELSH LL +01EFC LATIN CAPITAL LETTER MIDDLE-WELSH V +01EFD LATIN SMALL LETTER MIDDLE-WELSH V +01EFE LATIN CAPITAL LETTER Y WITH LOOP +01EFF LATIN SMALL LETTER Y WITH LOOP +01F00 GREEK SMALL LETTER ALPHA WITH PSILI +01F01 GREEK SMALL LETTER ALPHA WITH DASIA +01F02 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +01F03 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +01F04 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +01F05 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +01F06 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +01F07 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +01F08 GREEK CAPITAL LETTER ALPHA WITH PSILI +01F09 GREEK CAPITAL LETTER ALPHA WITH DASIA +01F0A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +01F0B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +01F0C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +01F0D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +01F0E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +01F0F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +01F10 GREEK SMALL LETTER EPSILON WITH PSILI +01F11 GREEK SMALL LETTER EPSILON WITH DASIA +01F12 GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA +01F13 GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA +01F14 GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA +01F15 GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +01F18 GREEK CAPITAL LETTER EPSILON WITH PSILI +01F19 GREEK CAPITAL LETTER EPSILON WITH DASIA +01F1A GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +01F1B GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +01F1C GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +01F1D GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +01F20 GREEK SMALL LETTER ETA WITH PSILI +01F21 GREEK SMALL LETTER ETA WITH DASIA +01F22 GREEK SMALL LETTER ETA WITH PSILI AND VARIA +01F23 GREEK SMALL LETTER ETA WITH DASIA AND VARIA +01F24 GREEK SMALL LETTER ETA WITH PSILI AND OXIA +01F25 GREEK SMALL LETTER ETA WITH DASIA AND OXIA +01F26 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI +01F27 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI +01F28 GREEK CAPITAL LETTER ETA WITH PSILI +01F29 GREEK CAPITAL LETTER ETA WITH DASIA +01F2A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +01F2B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +01F2C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +01F2D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +01F2E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +01F2F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +01F30 GREEK SMALL LETTER IOTA WITH PSILI +01F31 GREEK SMALL LETTER IOTA WITH DASIA +01F32 GREEK SMALL LETTER IOTA WITH PSILI AND VARIA +01F33 GREEK SMALL LETTER IOTA WITH DASIA AND VARIA +01F34 GREEK SMALL LETTER IOTA WITH PSILI AND OXIA +01F35 GREEK SMALL LETTER IOTA WITH DASIA AND OXIA +01F36 GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI +01F37 GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI +01F38 GREEK CAPITAL LETTER IOTA WITH PSILI +01F39 GREEK CAPITAL LETTER IOTA WITH DASIA +01F3A GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +01F3B GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +01F3C GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +01F3D GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +01F3E GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +01F3F GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +01F40 GREEK SMALL LETTER OMICRON WITH PSILI +01F41 GREEK SMALL LETTER OMICRON WITH DASIA +01F42 GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA +01F43 GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA +01F44 GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA +01F45 GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +01F48 GREEK CAPITAL LETTER OMICRON WITH PSILI +01F49 GREEK CAPITAL LETTER OMICRON WITH DASIA +01F4A GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +01F4B GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +01F4C GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +01F4D GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +01F50 GREEK SMALL LETTER UPSILON WITH PSILI +01F51 GREEK SMALL LETTER UPSILON WITH DASIA +01F52 GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +01F53 GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA +01F54 GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +01F55 GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA +01F56 GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +01F57 GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +01F59 GREEK CAPITAL LETTER UPSILON WITH DASIA +01F5B GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +01F5D GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +01F5F GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +01F60 GREEK SMALL LETTER OMEGA WITH PSILI +01F61 GREEK SMALL LETTER OMEGA WITH DASIA +01F62 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA +01F63 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA +01F64 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA +01F65 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA +01F66 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI +01F67 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI +01F68 GREEK CAPITAL LETTER OMEGA WITH PSILI +01F69 GREEK CAPITAL LETTER OMEGA WITH DASIA +01F6A GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +01F6B GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +01F6C GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +01F6D GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +01F6E GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +01F6F GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +01F70 GREEK SMALL LETTER ALPHA WITH VARIA +01F71 GREEK SMALL LETTER ALPHA WITH OXIA +01F72 GREEK SMALL LETTER EPSILON WITH VARIA +01F73 GREEK SMALL LETTER EPSILON WITH OXIA +01F74 GREEK SMALL LETTER ETA WITH VARIA +01F75 GREEK SMALL LETTER ETA WITH OXIA +01F76 GREEK SMALL LETTER IOTA WITH VARIA +01F77 GREEK SMALL LETTER IOTA WITH OXIA +01F78 GREEK SMALL LETTER OMICRON WITH VARIA +01F79 GREEK SMALL LETTER OMICRON WITH OXIA +01F7A GREEK SMALL LETTER UPSILON WITH VARIA +01F7B GREEK SMALL LETTER UPSILON WITH OXIA +01F7C GREEK SMALL LETTER OMEGA WITH VARIA +01F7D GREEK SMALL LETTER OMEGA WITH OXIA +01F80 GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +01F81 GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +01F82 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +01F83 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +01F84 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +01F85 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +01F86 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +01F87 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +01F88 GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +01F89 GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +01F8A GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +01F8B GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +01F8C GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +01F8D GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +01F8E GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +01F8F GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +01F90 GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +01F91 GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +01F92 GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +01F93 GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +01F94 GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +01F95 GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +01F96 GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +01F97 GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +01F98 GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +01F99 GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +01F9A GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +01F9B GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +01F9C GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +01F9D GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +01F9E GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +01F9F GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +01FA0 GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +01FA1 GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +01FA2 GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +01FA3 GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +01FA4 GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +01FA5 GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +01FA6 GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +01FA7 GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +01FA8 GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +01FA9 GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +01FAA GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +01FAB GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +01FAC GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +01FAD GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +01FAE GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +01FAF GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +01FB0 GREEK SMALL LETTER ALPHA WITH VRACHY +01FB1 GREEK SMALL LETTER ALPHA WITH MACRON +01FB2 GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +01FB3 GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +01FB4 GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +01FB6 GREEK SMALL LETTER ALPHA WITH PERISPOMENI +01FB7 GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +01FB8 GREEK CAPITAL LETTER ALPHA WITH VRACHY +01FB9 GREEK CAPITAL LETTER ALPHA WITH MACRON +01FBA GREEK CAPITAL LETTER ALPHA WITH VARIA +01FBB GREEK CAPITAL LETTER ALPHA WITH OXIA +01FBC GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +01FBD GREEK KORONIS +01FBE GREEK PROSGEGRAMMENI +01FBF GREEK PSILI +01FC0 GREEK PERISPOMENI +01FC1 GREEK DIALYTIKA AND PERISPOMENI +01FC2 GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +01FC3 GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +01FC4 GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +01FC6 GREEK SMALL LETTER ETA WITH PERISPOMENI +01FC7 GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +01FC8 GREEK CAPITAL LETTER EPSILON WITH VARIA +01FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA +01FCA GREEK CAPITAL LETTER ETA WITH VARIA +01FCB GREEK CAPITAL LETTER ETA WITH OXIA +01FCC GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +01FCD GREEK PSILI AND VARIA +01FCE GREEK PSILI AND OXIA +01FCF GREEK PSILI AND PERISPOMENI +01FD0 GREEK SMALL LETTER IOTA WITH VRACHY +01FD1 GREEK SMALL LETTER IOTA WITH MACRON +01FD2 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +01FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +01FD6 GREEK SMALL LETTER IOTA WITH PERISPOMENI +01FD7 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +01FD8 GREEK CAPITAL LETTER IOTA WITH VRACHY +01FD9 GREEK CAPITAL LETTER IOTA WITH MACRON +01FDA GREEK CAPITAL LETTER IOTA WITH VARIA +01FDB GREEK CAPITAL LETTER IOTA WITH OXIA +01FDD GREEK DASIA AND VARIA +01FDE GREEK DASIA AND OXIA +01FDF GREEK DASIA AND PERISPOMENI +01FE0 GREEK SMALL LETTER UPSILON WITH VRACHY +01FE1 GREEK SMALL LETTER UPSILON WITH MACRON +01FE2 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +01FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +01FE4 GREEK SMALL LETTER RHO WITH PSILI +01FE5 GREEK SMALL LETTER RHO WITH DASIA +01FE6 GREEK SMALL LETTER UPSILON WITH PERISPOMENI +01FE7 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +01FE8 GREEK CAPITAL LETTER UPSILON WITH VRACHY +01FE9 GREEK CAPITAL LETTER UPSILON WITH MACRON +01FEA GREEK CAPITAL LETTER UPSILON WITH VARIA +01FEB GREEK CAPITAL LETTER UPSILON WITH OXIA +01FEC GREEK CAPITAL LETTER RHO WITH DASIA +01FED GREEK DIALYTIKA AND VARIA +01FEE GREEK DIALYTIKA AND OXIA +01FEF GREEK VARIA +01FF2 GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +01FF3 GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +01FF4 GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +01FF6 GREEK SMALL LETTER OMEGA WITH PERISPOMENI +01FF7 GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +01FF8 GREEK CAPITAL LETTER OMICRON WITH VARIA +01FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA +01FFA GREEK CAPITAL LETTER OMEGA WITH VARIA +01FFB GREEK CAPITAL LETTER OMEGA WITH OXIA +01FFC GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +01FFD GREEK OXIA +01FFE GREEK DASIA +02000 EN QUAD +02001 EM QUAD +02002 EN SPACE +02003 EM SPACE +02004 THREE-PER-EM SPACE +02005 FOUR-PER-EM SPACE +02006 SIX-PER-EM SPACE +02007 FIGURE SPACE +02008 PUNCTUATION SPACE +02009 THIN SPACE +0200A HAIR SPACE +0200B ZERO WIDTH SPACE +0200B ZWSP +0200C ZERO WIDTH NON-JOINER +0200C ZWNJ +0200D ZERO WIDTH JOINER +0200D ZWJ +0200E LEFT-TO-RIGHT MARK +0200E LRM +0200F RIGHT-TO-LEFT MARK +0200F RLM +02010 HYPHEN +02011 NON-BREAKING HYPHEN +02012 FIGURE DASH +02013 EN DASH +02014 EM DASH +02015 HORIZONTAL BAR +02016 DOUBLE VERTICAL LINE +02017 DOUBLE LOW LINE +02018 LEFT SINGLE QUOTATION MARK +02019 RIGHT SINGLE QUOTATION MARK +0201A SINGLE LOW-9 QUOTATION MARK +0201B SINGLE HIGH-REVERSED-9 QUOTATION MARK +0201C LEFT DOUBLE QUOTATION MARK +0201D RIGHT DOUBLE QUOTATION MARK +0201E DOUBLE LOW-9 QUOTATION MARK +0201F DOUBLE HIGH-REVERSED-9 QUOTATION MARK +02020 DAGGER +02021 DOUBLE DAGGER +02022 BULLET +02023 TRIANGULAR BULLET +02024 ONE DOT LEADER +02025 TWO DOT LEADER +02026 HORIZONTAL ELLIPSIS +02027 HYPHENATION POINT +02028 LINE SEPARATOR +02029 PARAGRAPH SEPARATOR +0202A LEFT-TO-RIGHT EMBEDDING +0202A LRE +0202B RIGHT-TO-LEFT EMBEDDING +0202B RLE +0202C POP DIRECTIONAL FORMATTING +0202C PDF +0202D LEFT-TO-RIGHT OVERRIDE +0202D LRO +0202E RIGHT-TO-LEFT OVERRIDE +0202E RLO +0202F NARROW NO-BREAK SPACE +0202F NNBSP +02030 PER MILLE SIGN +02031 PER TEN THOUSAND SIGN +02032 PRIME +02033 DOUBLE PRIME +02034 TRIPLE PRIME +02035 REVERSED PRIME +02036 REVERSED DOUBLE PRIME +02037 REVERSED TRIPLE PRIME +02038 CARET +02039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +0203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +0203B REFERENCE MARK +0203C DOUBLE EXCLAMATION MARK +0203D INTERROBANG +0203E OVERLINE +0203F UNDERTIE +02040 CHARACTER TIE +02041 CARET INSERTION POINT +02042 ASTERISM +02043 HYPHEN BULLET +02044 FRACTION SLASH +02045 LEFT SQUARE BRACKET WITH QUILL +02046 RIGHT SQUARE BRACKET WITH QUILL +02047 DOUBLE QUESTION MARK +02048 QUESTION EXCLAMATION MARK +02049 EXCLAMATION QUESTION MARK +0204A TIRONIAN SIGN ET +0204B REVERSED PILCROW SIGN +0204C BLACK LEFTWARDS BULLET +0204D BLACK RIGHTWARDS BULLET +0204E LOW ASTERISK +0204F REVERSED SEMICOLON +02050 CLOSE UP +02051 TWO ASTERISKS ALIGNED VERTICALLY +02052 COMMERCIAL MINUS SIGN +02053 SWUNG DASH +02054 INVERTED UNDERTIE +02055 FLOWER PUNCTUATION MARK +02056 THREE DOT PUNCTUATION +02057 QUADRUPLE PRIME +02058 FOUR DOT PUNCTUATION +02059 FIVE DOT PUNCTUATION +0205A TWO DOT PUNCTUATION +0205B FOUR DOT MARK +0205C DOTTED CROSS +0205D TRICOLON +0205E VERTICAL FOUR DOTS +0205F MEDIUM MATHEMATICAL SPACE +0205F MMSP +02060 WORD JOINER +02060 WJ +02061 FUNCTION APPLICATION +02062 INVISIBLE TIMES +02063 INVISIBLE SEPARATOR +02064 INVISIBLE PLUS +02066 LEFT-TO-RIGHT ISOLATE +02066 LRI +02067 RIGHT-TO-LEFT ISOLATE +02067 RLI +02068 FIRST STRONG ISOLATE +02068 FSI +02069 POP DIRECTIONAL ISOLATE +02069 PDI +0206A INHIBIT SYMMETRIC SWAPPING +0206B ACTIVATE SYMMETRIC SWAPPING +0206C INHIBIT ARABIC FORM SHAPING +0206D ACTIVATE ARABIC FORM SHAPING +0206E NATIONAL DIGIT SHAPES +0206F NOMINAL DIGIT SHAPES +02070 SUPERSCRIPT ZERO +02071 SUPERSCRIPT LATIN SMALL LETTER I +02074 SUPERSCRIPT FOUR +02075 SUPERSCRIPT FIVE +02076 SUPERSCRIPT SIX +02077 SUPERSCRIPT SEVEN +02078 SUPERSCRIPT EIGHT +02079 SUPERSCRIPT NINE +0207A SUPERSCRIPT PLUS SIGN +0207B SUPERSCRIPT MINUS +0207C SUPERSCRIPT EQUALS SIGN +0207D SUPERSCRIPT LEFT PARENTHESIS +0207E SUPERSCRIPT RIGHT PARENTHESIS +0207F SUPERSCRIPT LATIN SMALL LETTER N +02080 SUBSCRIPT ZERO +02081 SUBSCRIPT ONE +02082 SUBSCRIPT TWO +02083 SUBSCRIPT THREE +02084 SUBSCRIPT FOUR +02085 SUBSCRIPT FIVE +02086 SUBSCRIPT SIX +02087 SUBSCRIPT SEVEN +02088 SUBSCRIPT EIGHT +02089 SUBSCRIPT NINE +0208A SUBSCRIPT PLUS SIGN +0208B SUBSCRIPT MINUS +0208C SUBSCRIPT EQUALS SIGN +0208D SUBSCRIPT LEFT PARENTHESIS +0208E SUBSCRIPT RIGHT PARENTHESIS +02090 LATIN SUBSCRIPT SMALL LETTER A +02091 LATIN SUBSCRIPT SMALL LETTER E +02092 LATIN SUBSCRIPT SMALL LETTER O +02093 LATIN SUBSCRIPT SMALL LETTER X +02094 LATIN SUBSCRIPT SMALL LETTER SCHWA +02095 LATIN SUBSCRIPT SMALL LETTER H +02096 LATIN SUBSCRIPT SMALL LETTER K +02097 LATIN SUBSCRIPT SMALL LETTER L +02098 LATIN SUBSCRIPT SMALL LETTER M +02099 LATIN SUBSCRIPT SMALL LETTER N +0209A LATIN SUBSCRIPT SMALL LETTER P +0209B LATIN SUBSCRIPT SMALL LETTER S +0209C LATIN SUBSCRIPT SMALL LETTER T +020A0 EURO-CURRENCY SIGN +020A1 COLON SIGN +020A2 CRUZEIRO SIGN +020A3 FRENCH FRANC SIGN +020A4 LIRA SIGN +020A5 MILL SIGN +020A6 NAIRA SIGN +020A7 PESETA SIGN +020A8 RUPEE SIGN +020A9 WON SIGN +020AA NEW SHEQEL SIGN +020AB DONG SIGN +020AC EURO SIGN +020AD KIP SIGN +020AE TUGRIK SIGN +020AF DRACHMA SIGN +020B0 GERMAN PENNY SIGN +020B1 PESO SIGN +020B2 GUARANI SIGN +020B3 AUSTRAL SIGN +020B4 HRYVNIA SIGN +020B5 CEDI SIGN +020B6 LIVRE TOURNOIS SIGN +020B7 SPESMILO SIGN +020B8 TENGE SIGN +020B9 INDIAN RUPEE SIGN +020BA TURKISH LIRA SIGN +020BB NORDIC MARK SIGN +020BC MANAT SIGN +020BD RUBLE SIGN +020BE LARI SIGN +020BF BITCOIN SIGN +020D0 COMBINING LEFT HARPOON ABOVE +020D1 COMBINING RIGHT HARPOON ABOVE +020D2 COMBINING LONG VERTICAL LINE OVERLAY +020D3 COMBINING SHORT VERTICAL LINE OVERLAY +020D4 COMBINING ANTICLOCKWISE ARROW ABOVE +020D5 COMBINING CLOCKWISE ARROW ABOVE +020D6 COMBINING LEFT ARROW ABOVE +020D7 COMBINING RIGHT ARROW ABOVE +020D8 COMBINING RING OVERLAY +020D9 COMBINING CLOCKWISE RING OVERLAY +020DA COMBINING ANTICLOCKWISE RING OVERLAY +020DB COMBINING THREE DOTS ABOVE +020DC COMBINING FOUR DOTS ABOVE +020DD COMBINING ENCLOSING CIRCLE +020DE COMBINING ENCLOSING SQUARE +020DF COMBINING ENCLOSING DIAMOND +020E0 COMBINING ENCLOSING CIRCLE BACKSLASH +020E1 COMBINING LEFT RIGHT ARROW ABOVE +020E2 COMBINING ENCLOSING SCREEN +020E3 COMBINING ENCLOSING KEYCAP +020E4 COMBINING ENCLOSING UPWARD POINTING TRIANGLE +020E5 COMBINING REVERSE SOLIDUS OVERLAY +020E6 COMBINING DOUBLE VERTICAL STROKE OVERLAY +020E7 COMBINING ANNUITY SYMBOL +020E8 COMBINING TRIPLE UNDERDOT +020E9 COMBINING WIDE BRIDGE ABOVE +020EA COMBINING LEFTWARDS ARROW OVERLAY +020EB COMBINING LONG DOUBLE SOLIDUS OVERLAY +020EC COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS +020ED COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS +020EE COMBINING LEFT ARROW BELOW +020EF COMBINING RIGHT ARROW BELOW +020F0 COMBINING ASTERISK ABOVE +02100 ACCOUNT OF +02101 ADDRESSED TO THE SUBJECT +02102 DOUBLE-STRUCK CAPITAL C +02103 DEGREE CELSIUS +02104 CENTRE LINE SYMBOL +02105 CARE OF +02106 CADA UNA +02107 EULER CONSTANT +02108 SCRUPLE +02109 DEGREE FAHRENHEIT +0210A SCRIPT SMALL G +0210B SCRIPT CAPITAL H +0210C BLACK-LETTER CAPITAL H +0210D DOUBLE-STRUCK CAPITAL H +0210E PLANCK CONSTANT +0210F PLANCK CONSTANT OVER TWO PI +02110 SCRIPT CAPITAL I +02111 BLACK-LETTER CAPITAL I +02112 SCRIPT CAPITAL L +02113 SCRIPT SMALL L +02114 L B BAR SYMBOL +02115 DOUBLE-STRUCK CAPITAL N +02116 NUMERO SIGN +02117 SOUND RECORDING COPYRIGHT +02118 WEIERSTRASS ELLIPTIC FUNCTION +02118 SCRIPT CAPITAL P +02119 DOUBLE-STRUCK CAPITAL P +0211A DOUBLE-STRUCK CAPITAL Q +0211B SCRIPT CAPITAL R +0211C BLACK-LETTER CAPITAL R +0211D DOUBLE-STRUCK CAPITAL R +0211E PRESCRIPTION TAKE +0211F RESPONSE +02120 SERVICE MARK +02121 TELEPHONE SIGN +02122 TRADE MARK SIGN +02123 VERSICLE +02124 DOUBLE-STRUCK CAPITAL Z +02125 OUNCE SIGN +02126 OHM SIGN +02127 INVERTED OHM SIGN +02128 BLACK-LETTER CAPITAL Z +02129 TURNED GREEK SMALL LETTER IOTA +0212A KELVIN SIGN +0212B ANGSTROM SIGN +0212C SCRIPT CAPITAL B +0212D BLACK-LETTER CAPITAL C +0212E ESTIMATED SYMBOL +0212F SCRIPT SMALL E +02130 SCRIPT CAPITAL E +02131 SCRIPT CAPITAL F +02132 TURNED CAPITAL F +02133 SCRIPT CAPITAL M +02134 SCRIPT SMALL O +02135 ALEF SYMBOL +02136 BET SYMBOL +02137 GIMEL SYMBOL +02138 DALET SYMBOL +02139 INFORMATION SOURCE +0213A ROTATED CAPITAL Q +0213B FACSIMILE SIGN +0213C DOUBLE-STRUCK SMALL PI +0213D DOUBLE-STRUCK SMALL GAMMA +0213E DOUBLE-STRUCK CAPITAL GAMMA +0213F DOUBLE-STRUCK CAPITAL PI +02140 DOUBLE-STRUCK N-ARY SUMMATION +02141 TURNED SANS-SERIF CAPITAL G +02142 TURNED SANS-SERIF CAPITAL L +02143 REVERSED SANS-SERIF CAPITAL L +02144 TURNED SANS-SERIF CAPITAL Y +02145 DOUBLE-STRUCK ITALIC CAPITAL D +02146 DOUBLE-STRUCK ITALIC SMALL D +02147 DOUBLE-STRUCK ITALIC SMALL E +02148 DOUBLE-STRUCK ITALIC SMALL I +02149 DOUBLE-STRUCK ITALIC SMALL J +0214A PROPERTY LINE +0214B TURNED AMPERSAND +0214C PER SIGN +0214D AKTIESELSKAB +0214E TURNED SMALL F +0214F SYMBOL FOR SAMARITAN SOURCE +02150 VULGAR FRACTION ONE SEVENTH +02151 VULGAR FRACTION ONE NINTH +02152 VULGAR FRACTION ONE TENTH +02153 VULGAR FRACTION ONE THIRD +02154 VULGAR FRACTION TWO THIRDS +02155 VULGAR FRACTION ONE FIFTH +02156 VULGAR FRACTION TWO FIFTHS +02157 VULGAR FRACTION THREE FIFTHS +02158 VULGAR FRACTION FOUR FIFTHS +02159 VULGAR FRACTION ONE SIXTH +0215A VULGAR FRACTION FIVE SIXTHS +0215B VULGAR FRACTION ONE EIGHTH +0215C VULGAR FRACTION THREE EIGHTHS +0215D VULGAR FRACTION FIVE EIGHTHS +0215E VULGAR FRACTION SEVEN EIGHTHS +0215F FRACTION NUMERATOR ONE +02160 ROMAN NUMERAL ONE +02161 ROMAN NUMERAL TWO +02162 ROMAN NUMERAL THREE +02163 ROMAN NUMERAL FOUR +02164 ROMAN NUMERAL FIVE +02165 ROMAN NUMERAL SIX +02166 ROMAN NUMERAL SEVEN +02167 ROMAN NUMERAL EIGHT +02168 ROMAN NUMERAL NINE +02169 ROMAN NUMERAL TEN +0216A ROMAN NUMERAL ELEVEN +0216B ROMAN NUMERAL TWELVE +0216C ROMAN NUMERAL FIFTY +0216D ROMAN NUMERAL ONE HUNDRED +0216E ROMAN NUMERAL FIVE HUNDRED +0216F ROMAN NUMERAL ONE THOUSAND +02170 SMALL ROMAN NUMERAL ONE +02171 SMALL ROMAN NUMERAL TWO +02172 SMALL ROMAN NUMERAL THREE +02173 SMALL ROMAN NUMERAL FOUR +02174 SMALL ROMAN NUMERAL FIVE +02175 SMALL ROMAN NUMERAL SIX +02176 SMALL ROMAN NUMERAL SEVEN +02177 SMALL ROMAN NUMERAL EIGHT +02178 SMALL ROMAN NUMERAL NINE +02179 SMALL ROMAN NUMERAL TEN +0217A SMALL ROMAN NUMERAL ELEVEN +0217B SMALL ROMAN NUMERAL TWELVE +0217C SMALL ROMAN NUMERAL FIFTY +0217D SMALL ROMAN NUMERAL ONE HUNDRED +0217E SMALL ROMAN NUMERAL FIVE HUNDRED +0217F SMALL ROMAN NUMERAL ONE THOUSAND +02180 ROMAN NUMERAL ONE THOUSAND C D +02181 ROMAN NUMERAL FIVE THOUSAND +02182 ROMAN NUMERAL TEN THOUSAND +02183 ROMAN NUMERAL REVERSED ONE HUNDRED +02184 LATIN SMALL LETTER REVERSED C +02185 ROMAN NUMERAL SIX LATE FORM +02186 ROMAN NUMERAL FIFTY EARLY FORM +02187 ROMAN NUMERAL FIFTY THOUSAND +02188 ROMAN NUMERAL ONE HUNDRED THOUSAND +02189 VULGAR FRACTION ZERO THIRDS +0218A TURNED DIGIT TWO +0218B TURNED DIGIT THREE +02190 LEFTWARDS ARROW +02191 UPWARDS ARROW +02192 RIGHTWARDS ARROW +02193 DOWNWARDS ARROW +02194 LEFT RIGHT ARROW +02195 UP DOWN ARROW +02196 NORTH WEST ARROW +02197 NORTH EAST ARROW +02198 SOUTH EAST ARROW +02199 SOUTH WEST ARROW +0219A LEFTWARDS ARROW WITH STROKE +0219B RIGHTWARDS ARROW WITH STROKE +0219C LEFTWARDS WAVE ARROW +0219D RIGHTWARDS WAVE ARROW +0219E LEFTWARDS TWO HEADED ARROW +0219F UPWARDS TWO HEADED ARROW +021A0 RIGHTWARDS TWO HEADED ARROW +021A1 DOWNWARDS TWO HEADED ARROW +021A2 LEFTWARDS ARROW WITH TAIL +021A3 RIGHTWARDS ARROW WITH TAIL +021A4 LEFTWARDS ARROW FROM BAR +021A5 UPWARDS ARROW FROM BAR +021A6 RIGHTWARDS ARROW FROM BAR +021A7 DOWNWARDS ARROW FROM BAR +021A8 UP DOWN ARROW WITH BASE +021A9 LEFTWARDS ARROW WITH HOOK +021AA RIGHTWARDS ARROW WITH HOOK +021AB LEFTWARDS ARROW WITH LOOP +021AC RIGHTWARDS ARROW WITH LOOP +021AD LEFT RIGHT WAVE ARROW +021AE LEFT RIGHT ARROW WITH STROKE +021AF DOWNWARDS ZIGZAG ARROW +021B0 UPWARDS ARROW WITH TIP LEFTWARDS +021B1 UPWARDS ARROW WITH TIP RIGHTWARDS +021B2 DOWNWARDS ARROW WITH TIP LEFTWARDS +021B3 DOWNWARDS ARROW WITH TIP RIGHTWARDS +021B4 RIGHTWARDS ARROW WITH CORNER DOWNWARDS +021B5 DOWNWARDS ARROW WITH CORNER LEFTWARDS +021B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW +021B7 CLOCKWISE TOP SEMICIRCLE ARROW +021B8 NORTH WEST ARROW TO LONG BAR +021B9 LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +021BA ANTICLOCKWISE OPEN CIRCLE ARROW +021BB CLOCKWISE OPEN CIRCLE ARROW +021BC LEFTWARDS HARPOON WITH BARB UPWARDS +021BD LEFTWARDS HARPOON WITH BARB DOWNWARDS +021BE UPWARDS HARPOON WITH BARB RIGHTWARDS +021BF UPWARDS HARPOON WITH BARB LEFTWARDS +021C0 RIGHTWARDS HARPOON WITH BARB UPWARDS +021C1 RIGHTWARDS HARPOON WITH BARB DOWNWARDS +021C2 DOWNWARDS HARPOON WITH BARB RIGHTWARDS +021C3 DOWNWARDS HARPOON WITH BARB LEFTWARDS +021C4 RIGHTWARDS ARROW OVER LEFTWARDS ARROW +021C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW +021C6 LEFTWARDS ARROW OVER RIGHTWARDS ARROW +021C7 LEFTWARDS PAIRED ARROWS +021C8 UPWARDS PAIRED ARROWS +021C9 RIGHTWARDS PAIRED ARROWS +021CA DOWNWARDS PAIRED ARROWS +021CB LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON +021CC RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON +021CD LEFTWARDS DOUBLE ARROW WITH STROKE +021CE LEFT RIGHT DOUBLE ARROW WITH STROKE +021CF RIGHTWARDS DOUBLE ARROW WITH STROKE +021D0 LEFTWARDS DOUBLE ARROW +021D1 UPWARDS DOUBLE ARROW +021D2 RIGHTWARDS DOUBLE ARROW +021D3 DOWNWARDS DOUBLE ARROW +021D4 LEFT RIGHT DOUBLE ARROW +021D5 UP DOWN DOUBLE ARROW +021D6 NORTH WEST DOUBLE ARROW +021D7 NORTH EAST DOUBLE ARROW +021D8 SOUTH EAST DOUBLE ARROW +021D9 SOUTH WEST DOUBLE ARROW +021DA LEFTWARDS TRIPLE ARROW +021DB RIGHTWARDS TRIPLE ARROW +021DC LEFTWARDS SQUIGGLE ARROW +021DD RIGHTWARDS SQUIGGLE ARROW +021DE UPWARDS ARROW WITH DOUBLE STROKE +021DF DOWNWARDS ARROW WITH DOUBLE STROKE +021E0 LEFTWARDS DASHED ARROW +021E1 UPWARDS DASHED ARROW +021E2 RIGHTWARDS DASHED ARROW +021E3 DOWNWARDS DASHED ARROW +021E4 LEFTWARDS ARROW TO BAR +021E5 RIGHTWARDS ARROW TO BAR +021E6 LEFTWARDS WHITE ARROW +021E7 UPWARDS WHITE ARROW +021E8 RIGHTWARDS WHITE ARROW +021E9 DOWNWARDS WHITE ARROW +021EA UPWARDS WHITE ARROW FROM BAR +021EB UPWARDS WHITE ARROW ON PEDESTAL +021EC UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR +021ED UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR +021EE UPWARDS WHITE DOUBLE ARROW +021EF UPWARDS WHITE DOUBLE ARROW ON PEDESTAL +021F0 RIGHTWARDS WHITE ARROW FROM WALL +021F1 NORTH WEST ARROW TO CORNER +021F2 SOUTH EAST ARROW TO CORNER +021F3 UP DOWN WHITE ARROW +021F4 RIGHT ARROW WITH SMALL CIRCLE +021F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW +021F6 THREE RIGHTWARDS ARROWS +021F7 LEFTWARDS ARROW WITH VERTICAL STROKE +021F8 RIGHTWARDS ARROW WITH VERTICAL STROKE +021F9 LEFT RIGHT ARROW WITH VERTICAL STROKE +021FA LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE +021FB RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE +021FC LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE +021FD LEFTWARDS OPEN-HEADED ARROW +021FE RIGHTWARDS OPEN-HEADED ARROW +021FF LEFT RIGHT OPEN-HEADED ARROW +02200 FOR ALL +02201 COMPLEMENT +02202 PARTIAL DIFFERENTIAL +02203 THERE EXISTS +02204 THERE DOES NOT EXIST +02205 EMPTY SET +02206 INCREMENT +02207 NABLA +02208 ELEMENT OF +02209 NOT AN ELEMENT OF +0220A SMALL ELEMENT OF +0220B CONTAINS AS MEMBER +0220C DOES NOT CONTAIN AS MEMBER +0220D SMALL CONTAINS AS MEMBER +0220E END OF PROOF +0220F N-ARY PRODUCT +02210 N-ARY COPRODUCT +02211 N-ARY SUMMATION +02212 MINUS SIGN +02213 MINUS-OR-PLUS SIGN +02214 DOT PLUS +02215 DIVISION SLASH +02216 SET MINUS +02217 ASTERISK OPERATOR +02218 RING OPERATOR +02219 BULLET OPERATOR +0221A SQUARE ROOT +0221B CUBE ROOT +0221C FOURTH ROOT +0221D PROPORTIONAL TO +0221E INFINITY +0221F RIGHT ANGLE +02220 ANGLE +02221 MEASURED ANGLE +02222 SPHERICAL ANGLE +02223 DIVIDES +02224 DOES NOT DIVIDE +02225 PARALLEL TO +02226 NOT PARALLEL TO +02227 LOGICAL AND +02228 LOGICAL OR +02229 INTERSECTION +0222A UNION +0222B INTEGRAL +0222C DOUBLE INTEGRAL +0222D TRIPLE INTEGRAL +0222E CONTOUR INTEGRAL +0222F SURFACE INTEGRAL +02230 VOLUME INTEGRAL +02231 CLOCKWISE INTEGRAL +02232 CLOCKWISE CONTOUR INTEGRAL +02233 ANTICLOCKWISE CONTOUR INTEGRAL +02234 THEREFORE +02235 BECAUSE +02236 RATIO +02237 PROPORTION +02238 DOT MINUS +02239 EXCESS +0223A GEOMETRIC PROPORTION +0223B HOMOTHETIC +0223C TILDE OPERATOR +0223D REVERSED TILDE +0223E INVERTED LAZY S +0223F SINE WAVE +02240 WREATH PRODUCT +02241 NOT TILDE +02242 MINUS TILDE +02243 ASYMPTOTICALLY EQUAL TO +02244 NOT ASYMPTOTICALLY EQUAL TO +02245 APPROXIMATELY EQUAL TO +02246 APPROXIMATELY BUT NOT ACTUALLY EQUAL TO +02247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +02248 ALMOST EQUAL TO +02249 NOT ALMOST EQUAL TO +0224A ALMOST EQUAL OR EQUAL TO +0224B TRIPLE TILDE +0224C ALL EQUAL TO +0224D EQUIVALENT TO +0224E GEOMETRICALLY EQUIVALENT TO +0224F DIFFERENCE BETWEEN +02250 APPROACHES THE LIMIT +02251 GEOMETRICALLY EQUAL TO +02252 APPROXIMATELY EQUAL TO OR THE IMAGE OF +02253 IMAGE OF OR APPROXIMATELY EQUAL TO +02254 COLON EQUALS +02255 EQUALS COLON +02256 RING IN EQUAL TO +02257 RING EQUAL TO +02258 CORRESPONDS TO +02259 ESTIMATES +0225A EQUIANGULAR TO +0225B STAR EQUALS +0225C DELTA EQUAL TO +0225D EQUAL TO BY DEFINITION +0225E MEASURED BY +0225F QUESTIONED EQUAL TO +02260 NOT EQUAL TO +02261 IDENTICAL TO +02262 NOT IDENTICAL TO +02263 STRICTLY EQUIVALENT TO +02264 LESS-THAN OR EQUAL TO +02265 GREATER-THAN OR EQUAL TO +02266 LESS-THAN OVER EQUAL TO +02267 GREATER-THAN OVER EQUAL TO +02268 LESS-THAN BUT NOT EQUAL TO +02269 GREATER-THAN BUT NOT EQUAL TO +0226A MUCH LESS-THAN +0226B MUCH GREATER-THAN +0226C BETWEEN +0226D NOT EQUIVALENT TO +0226E NOT LESS-THAN +0226F NOT GREATER-THAN +02270 NEITHER LESS-THAN NOR EQUAL TO +02271 NEITHER GREATER-THAN NOR EQUAL TO +02272 LESS-THAN OR EQUIVALENT TO +02273 GREATER-THAN OR EQUIVALENT TO +02274 NEITHER LESS-THAN NOR EQUIVALENT TO +02275 NEITHER GREATER-THAN NOR EQUIVALENT TO +02276 LESS-THAN OR GREATER-THAN +02277 GREATER-THAN OR LESS-THAN +02278 NEITHER LESS-THAN NOR GREATER-THAN +02279 NEITHER GREATER-THAN NOR LESS-THAN +0227A PRECEDES +0227B SUCCEEDS +0227C PRECEDES OR EQUAL TO +0227D SUCCEEDS OR EQUAL TO +0227E PRECEDES OR EQUIVALENT TO +0227F SUCCEEDS OR EQUIVALENT TO +02280 DOES NOT PRECEDE +02281 DOES NOT SUCCEED +02282 SUBSET OF +02283 SUPERSET OF +02284 NOT A SUBSET OF +02285 NOT A SUPERSET OF +02286 SUBSET OF OR EQUAL TO +02287 SUPERSET OF OR EQUAL TO +02288 NEITHER A SUBSET OF NOR EQUAL TO +02289 NEITHER A SUPERSET OF NOR EQUAL TO +0228A SUBSET OF WITH NOT EQUAL TO +0228B SUPERSET OF WITH NOT EQUAL TO +0228C MULTISET +0228D MULTISET MULTIPLICATION +0228E MULTISET UNION +0228F SQUARE IMAGE OF +02290 SQUARE ORIGINAL OF +02291 SQUARE IMAGE OF OR EQUAL TO +02292 SQUARE ORIGINAL OF OR EQUAL TO +02293 SQUARE CAP +02294 SQUARE CUP +02295 CIRCLED PLUS +02296 CIRCLED MINUS +02297 CIRCLED TIMES +02298 CIRCLED DIVISION SLASH +02299 CIRCLED DOT OPERATOR +0229A CIRCLED RING OPERATOR +0229B CIRCLED ASTERISK OPERATOR +0229C CIRCLED EQUALS +0229D CIRCLED DASH +0229E SQUARED PLUS +0229F SQUARED MINUS +022A0 SQUARED TIMES +022A1 SQUARED DOT OPERATOR +022A2 RIGHT TACK +022A3 LEFT TACK +022A4 DOWN TACK +022A5 UP TACK +022A6 ASSERTION +022A7 MODELS +022A8 TRUE +022A9 FORCES +022AA TRIPLE VERTICAL BAR RIGHT TURNSTILE +022AB DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +022AC DOES NOT PROVE +022AD NOT TRUE +022AE DOES NOT FORCE +022AF NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE +022B0 PRECEDES UNDER RELATION +022B1 SUCCEEDS UNDER RELATION +022B2 NORMAL SUBGROUP OF +022B3 CONTAINS AS NORMAL SUBGROUP +022B4 NORMAL SUBGROUP OF OR EQUAL TO +022B5 CONTAINS AS NORMAL SUBGROUP OR EQUAL TO +022B6 ORIGINAL OF +022B7 IMAGE OF +022B8 MULTIMAP +022B9 HERMITIAN CONJUGATE MATRIX +022BA INTERCALATE +022BB XOR +022BC NAND +022BD NOR +022BE RIGHT ANGLE WITH ARC +022BF RIGHT TRIANGLE +022C0 N-ARY LOGICAL AND +022C1 N-ARY LOGICAL OR +022C2 N-ARY INTERSECTION +022C3 N-ARY UNION +022C4 DIAMOND OPERATOR +022C5 DOT OPERATOR +022C6 STAR OPERATOR +022C7 DIVISION TIMES +022C8 BOWTIE +022C9 LEFT NORMAL FACTOR SEMIDIRECT PRODUCT +022CA RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT +022CB LEFT SEMIDIRECT PRODUCT +022CC RIGHT SEMIDIRECT PRODUCT +022CD REVERSED TILDE EQUALS +022CE CURLY LOGICAL OR +022CF CURLY LOGICAL AND +022D0 DOUBLE SUBSET +022D1 DOUBLE SUPERSET +022D2 DOUBLE INTERSECTION +022D3 DOUBLE UNION +022D4 PITCHFORK +022D5 EQUAL AND PARALLEL TO +022D6 LESS-THAN WITH DOT +022D7 GREATER-THAN WITH DOT +022D8 VERY MUCH LESS-THAN +022D9 VERY MUCH GREATER-THAN +022DA LESS-THAN EQUAL TO OR GREATER-THAN +022DB GREATER-THAN EQUAL TO OR LESS-THAN +022DC EQUAL TO OR LESS-THAN +022DD EQUAL TO OR GREATER-THAN +022DE EQUAL TO OR PRECEDES +022DF EQUAL TO OR SUCCEEDS +022E0 DOES NOT PRECEDE OR EQUAL +022E1 DOES NOT SUCCEED OR EQUAL +022E2 NOT SQUARE IMAGE OF OR EQUAL TO +022E3 NOT SQUARE ORIGINAL OF OR EQUAL TO +022E4 SQUARE IMAGE OF OR NOT EQUAL TO +022E5 SQUARE ORIGINAL OF OR NOT EQUAL TO +022E6 LESS-THAN BUT NOT EQUIVALENT TO +022E7 GREATER-THAN BUT NOT EQUIVALENT TO +022E8 PRECEDES BUT NOT EQUIVALENT TO +022E9 SUCCEEDS BUT NOT EQUIVALENT TO +022EA NOT NORMAL SUBGROUP OF +022EB DOES NOT CONTAIN AS NORMAL SUBGROUP +022EC NOT NORMAL SUBGROUP OF OR EQUAL TO +022ED DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL +022EE VERTICAL ELLIPSIS +022EF MIDLINE HORIZONTAL ELLIPSIS +022F0 UP RIGHT DIAGONAL ELLIPSIS +022F1 DOWN RIGHT DIAGONAL ELLIPSIS +022F2 ELEMENT OF WITH LONG HORIZONTAL STROKE +022F3 ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +022F4 SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +022F5 ELEMENT OF WITH DOT ABOVE +022F6 ELEMENT OF WITH OVERBAR +022F7 SMALL ELEMENT OF WITH OVERBAR +022F8 ELEMENT OF WITH UNDERBAR +022F9 ELEMENT OF WITH TWO HORIZONTAL STROKES +022FA CONTAINS WITH LONG HORIZONTAL STROKE +022FB CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +022FC SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE +022FD CONTAINS WITH OVERBAR +022FE SMALL CONTAINS WITH OVERBAR +022FF Z NOTATION BAG MEMBERSHIP +02300 DIAMETER SIGN +02301 ELECTRIC ARROW +02302 HOUSE +02303 UP ARROWHEAD +02304 DOWN ARROWHEAD +02305 PROJECTIVE +02306 PERSPECTIVE +02307 WAVY LINE +02308 LEFT CEILING +02309 RIGHT CEILING +0230A LEFT FLOOR +0230B RIGHT FLOOR +0230C BOTTOM RIGHT CROP +0230D BOTTOM LEFT CROP +0230E TOP RIGHT CROP +0230F TOP LEFT CROP +02310 REVERSED NOT SIGN +02311 SQUARE LOZENGE +02312 ARC +02313 SEGMENT +02314 SECTOR +02315 TELEPHONE RECORDER +02316 POSITION INDICATOR +02317 VIEWDATA SQUARE +02318 PLACE OF INTEREST SIGN +02319 TURNED NOT SIGN +0231A WATCH +0231B HOURGLASS +0231C TOP LEFT CORNER +0231D TOP RIGHT CORNER +0231E BOTTOM LEFT CORNER +0231F BOTTOM RIGHT CORNER +02320 TOP HALF INTEGRAL +02321 BOTTOM HALF INTEGRAL +02322 FROWN +02323 SMILE +02324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS +02325 OPTION KEY +02326 ERASE TO THE RIGHT +02327 X IN A RECTANGLE BOX +02328 KEYBOARD +02329 LEFT-POINTING ANGLE BRACKET +0232A RIGHT-POINTING ANGLE BRACKET +0232B ERASE TO THE LEFT +0232C BENZENE RING +0232D CYLINDRICITY +0232E ALL AROUND-PROFILE +0232F SYMMETRY +02330 TOTAL RUNOUT +02331 DIMENSION ORIGIN +02332 CONICAL TAPER +02333 SLOPE +02334 COUNTERBORE +02335 COUNTERSINK +02336 APL FUNCTIONAL SYMBOL I-BEAM +02337 APL FUNCTIONAL SYMBOL SQUISH QUAD +02338 APL FUNCTIONAL SYMBOL QUAD EQUAL +02339 APL FUNCTIONAL SYMBOL QUAD DIVIDE +0233A APL FUNCTIONAL SYMBOL QUAD DIAMOND +0233B APL FUNCTIONAL SYMBOL QUAD JOT +0233C APL FUNCTIONAL SYMBOL QUAD CIRCLE +0233D APL FUNCTIONAL SYMBOL CIRCLE STILE +0233E APL FUNCTIONAL SYMBOL CIRCLE JOT +0233F APL FUNCTIONAL SYMBOL SLASH BAR +02340 APL FUNCTIONAL SYMBOL BACKSLASH BAR +02341 APL FUNCTIONAL SYMBOL QUAD SLASH +02342 APL FUNCTIONAL SYMBOL QUAD BACKSLASH +02343 APL FUNCTIONAL SYMBOL QUAD LESS-THAN +02344 APL FUNCTIONAL SYMBOL QUAD GREATER-THAN +02345 APL FUNCTIONAL SYMBOL LEFTWARDS VANE +02346 APL FUNCTIONAL SYMBOL RIGHTWARDS VANE +02347 APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW +02348 APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW +02349 APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH +0234A APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR +0234B APL FUNCTIONAL SYMBOL DELTA STILE +0234C APL FUNCTIONAL SYMBOL QUAD DOWN CARET +0234D APL FUNCTIONAL SYMBOL QUAD DELTA +0234E APL FUNCTIONAL SYMBOL DOWN TACK JOT +0234F APL FUNCTIONAL SYMBOL UPWARDS VANE +02350 APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW +02351 APL FUNCTIONAL SYMBOL UP TACK OVERBAR +02352 APL FUNCTIONAL SYMBOL DEL STILE +02353 APL FUNCTIONAL SYMBOL QUAD UP CARET +02354 APL FUNCTIONAL SYMBOL QUAD DEL +02355 APL FUNCTIONAL SYMBOL UP TACK JOT +02356 APL FUNCTIONAL SYMBOL DOWNWARDS VANE +02357 APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW +02358 APL FUNCTIONAL SYMBOL QUOTE UNDERBAR +02359 APL FUNCTIONAL SYMBOL DELTA UNDERBAR +0235A APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR +0235B APL FUNCTIONAL SYMBOL JOT UNDERBAR +0235C APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR +0235D APL FUNCTIONAL SYMBOL UP SHOE JOT +0235E APL FUNCTIONAL SYMBOL QUOTE QUAD +0235F APL FUNCTIONAL SYMBOL CIRCLE STAR +02360 APL FUNCTIONAL SYMBOL QUAD COLON +02361 APL FUNCTIONAL SYMBOL UP TACK DIAERESIS +02362 APL FUNCTIONAL SYMBOL DEL DIAERESIS +02363 APL FUNCTIONAL SYMBOL STAR DIAERESIS +02364 APL FUNCTIONAL SYMBOL JOT DIAERESIS +02365 APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS +02366 APL FUNCTIONAL SYMBOL DOWN SHOE STILE +02367 APL FUNCTIONAL SYMBOL LEFT SHOE STILE +02368 APL FUNCTIONAL SYMBOL TILDE DIAERESIS +02369 APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS +0236A APL FUNCTIONAL SYMBOL COMMA BAR +0236B APL FUNCTIONAL SYMBOL DEL TILDE +0236C APL FUNCTIONAL SYMBOL ZILDE +0236D APL FUNCTIONAL SYMBOL STILE TILDE +0236E APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR +0236F APL FUNCTIONAL SYMBOL QUAD NOT EQUAL +02370 APL FUNCTIONAL SYMBOL QUAD QUESTION +02371 APL FUNCTIONAL SYMBOL DOWN CARET TILDE +02372 APL FUNCTIONAL SYMBOL UP CARET TILDE +02373 APL FUNCTIONAL SYMBOL IOTA +02374 APL FUNCTIONAL SYMBOL RHO +02375 APL FUNCTIONAL SYMBOL OMEGA +02376 APL FUNCTIONAL SYMBOL ALPHA UNDERBAR +02377 APL FUNCTIONAL SYMBOL EPSILON UNDERBAR +02378 APL FUNCTIONAL SYMBOL IOTA UNDERBAR +02379 APL FUNCTIONAL SYMBOL OMEGA UNDERBAR +0237A APL FUNCTIONAL SYMBOL ALPHA +0237B NOT CHECK MARK +0237C RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +0237D SHOULDERED OPEN BOX +0237E BELL SYMBOL +0237F VERTICAL LINE WITH MIDDLE DOT +02380 INSERTION SYMBOL +02381 CONTINUOUS UNDERLINE SYMBOL +02382 DISCONTINUOUS UNDERLINE SYMBOL +02383 EMPHASIS SYMBOL +02384 COMPOSITION SYMBOL +02385 WHITE SQUARE WITH CENTRE VERTICAL LINE +02386 ENTER SYMBOL +02387 ALTERNATIVE KEY SYMBOL +02388 HELM SYMBOL +02389 CIRCLED HORIZONTAL BAR WITH NOTCH +0238A CIRCLED TRIANGLE DOWN +0238B BROKEN CIRCLE WITH NORTHWEST ARROW +0238C UNDO SYMBOL +0238D MONOSTABLE SYMBOL +0238E HYSTERESIS SYMBOL +0238F OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL +02390 OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL +02391 PASSIVE-PULL-DOWN-OUTPUT SYMBOL +02392 PASSIVE-PULL-UP-OUTPUT SYMBOL +02393 DIRECT CURRENT SYMBOL FORM TWO +02394 SOFTWARE-FUNCTION SYMBOL +02395 APL FUNCTIONAL SYMBOL QUAD +02396 DECIMAL SEPARATOR KEY SYMBOL +02397 PREVIOUS PAGE +02398 NEXT PAGE +02399 PRINT SCREEN SYMBOL +0239A CLEAR SCREEN SYMBOL +0239B LEFT PARENTHESIS UPPER HOOK +0239C LEFT PARENTHESIS EXTENSION +0239D LEFT PARENTHESIS LOWER HOOK +0239E RIGHT PARENTHESIS UPPER HOOK +0239F RIGHT PARENTHESIS EXTENSION +023A0 RIGHT PARENTHESIS LOWER HOOK +023A1 LEFT SQUARE BRACKET UPPER CORNER +023A2 LEFT SQUARE BRACKET EXTENSION +023A3 LEFT SQUARE BRACKET LOWER CORNER +023A4 RIGHT SQUARE BRACKET UPPER CORNER +023A5 RIGHT SQUARE BRACKET EXTENSION +023A6 RIGHT SQUARE BRACKET LOWER CORNER +023A7 LEFT CURLY BRACKET UPPER HOOK +023A8 LEFT CURLY BRACKET MIDDLE PIECE +023A9 LEFT CURLY BRACKET LOWER HOOK +023AA CURLY BRACKET EXTENSION +023AB RIGHT CURLY BRACKET UPPER HOOK +023AC RIGHT CURLY BRACKET MIDDLE PIECE +023AD RIGHT CURLY BRACKET LOWER HOOK +023AE INTEGRAL EXTENSION +023AF HORIZONTAL LINE EXTENSION +023B0 UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION +023B1 UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION +023B2 SUMMATION TOP +023B3 SUMMATION BOTTOM +023B4 TOP SQUARE BRACKET +023B5 BOTTOM SQUARE BRACKET +023B6 BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET +023B7 RADICAL SYMBOL BOTTOM +023B8 LEFT VERTICAL BOX LINE +023B9 RIGHT VERTICAL BOX LINE +023BA HORIZONTAL SCAN LINE-1 +023BB HORIZONTAL SCAN LINE-3 +023BC HORIZONTAL SCAN LINE-7 +023BD HORIZONTAL SCAN LINE-9 +023BE DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT +023BF DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT +023C0 DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE +023C1 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE +023C2 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE +023C3 DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE +023C4 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE +023C5 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE +023C6 DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE +023C7 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE +023C8 DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE +023C9 DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL +023CA DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL +023CB DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT +023CC DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT +023CD SQUARE FOOT +023CE RETURN SYMBOL +023CF EJECT SYMBOL +023D0 VERTICAL LINE EXTENSION +023D1 METRICAL BREVE +023D2 METRICAL LONG OVER SHORT +023D3 METRICAL SHORT OVER LONG +023D4 METRICAL LONG OVER TWO SHORTS +023D5 METRICAL TWO SHORTS OVER LONG +023D6 METRICAL TWO SHORTS JOINED +023D7 METRICAL TRISEME +023D8 METRICAL TETRASEME +023D9 METRICAL PENTASEME +023DA EARTH GROUND +023DB FUSE +023DC TOP PARENTHESIS +023DD BOTTOM PARENTHESIS +023DE TOP CURLY BRACKET +023DF BOTTOM CURLY BRACKET +023E0 TOP TORTOISE SHELL BRACKET +023E1 BOTTOM TORTOISE SHELL BRACKET +023E2 WHITE TRAPEZIUM +023E3 BENZENE RING WITH CIRCLE +023E4 STRAIGHTNESS +023E5 FLATNESS +023E6 AC CURRENT +023E7 ELECTRICAL INTERSECTION +023E8 DECIMAL EXPONENT SYMBOL +023E9 BLACK RIGHT-POINTING DOUBLE TRIANGLE +023EA BLACK LEFT-POINTING DOUBLE TRIANGLE +023EB BLACK UP-POINTING DOUBLE TRIANGLE +023EC BLACK DOWN-POINTING DOUBLE TRIANGLE +023ED BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +023EE BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR +023EF BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +023F0 ALARM CLOCK +023F1 STOPWATCH +023F2 TIMER CLOCK +023F3 HOURGLASS WITH FLOWING SAND +023F4 BLACK MEDIUM LEFT-POINTING TRIANGLE +023F5 BLACK MEDIUM RIGHT-POINTING TRIANGLE +023F6 BLACK MEDIUM UP-POINTING TRIANGLE +023F7 BLACK MEDIUM DOWN-POINTING TRIANGLE +023F8 DOUBLE VERTICAL BAR +023F9 BLACK SQUARE FOR STOP +023FA BLACK CIRCLE FOR RECORD +023FB POWER SYMBOL +023FC POWER ON-OFF SYMBOL +023FD POWER ON SYMBOL +023FE POWER SLEEP SYMBOL +023FF OBSERVER EYE SYMBOL +02400 SYMBOL FOR NULL +02401 SYMBOL FOR START OF HEADING +02402 SYMBOL FOR START OF TEXT +02403 SYMBOL FOR END OF TEXT +02404 SYMBOL FOR END OF TRANSMISSION +02405 SYMBOL FOR ENQUIRY +02406 SYMBOL FOR ACKNOWLEDGE +02407 SYMBOL FOR BELL +02408 SYMBOL FOR BACKSPACE +02409 SYMBOL FOR HORIZONTAL TABULATION +0240A SYMBOL FOR LINE FEED +0240B SYMBOL FOR VERTICAL TABULATION +0240C SYMBOL FOR FORM FEED +0240D SYMBOL FOR CARRIAGE RETURN +0240E SYMBOL FOR SHIFT OUT +0240F SYMBOL FOR SHIFT IN +02410 SYMBOL FOR DATA LINK ESCAPE +02411 SYMBOL FOR DEVICE CONTROL ONE +02412 SYMBOL FOR DEVICE CONTROL TWO +02413 SYMBOL FOR DEVICE CONTROL THREE +02414 SYMBOL FOR DEVICE CONTROL FOUR +02415 SYMBOL FOR NEGATIVE ACKNOWLEDGE +02416 SYMBOL FOR SYNCHRONOUS IDLE +02417 SYMBOL FOR END OF TRANSMISSION BLOCK +02418 SYMBOL FOR CANCEL +02419 SYMBOL FOR END OF MEDIUM +0241A SYMBOL FOR SUBSTITUTE +0241B SYMBOL FOR ESCAPE +0241C SYMBOL FOR FILE SEPARATOR +0241D SYMBOL FOR GROUP SEPARATOR +0241E SYMBOL FOR RECORD SEPARATOR +0241F SYMBOL FOR UNIT SEPARATOR +02420 SYMBOL FOR SPACE +02421 SYMBOL FOR DELETE +02422 BLANK SYMBOL +02423 OPEN BOX +02424 SYMBOL FOR NEWLINE +02425 SYMBOL FOR DELETE FORM TWO +02426 SYMBOL FOR SUBSTITUTE FORM TWO +02440 OCR HOOK +02441 OCR CHAIR +02442 OCR FORK +02443 OCR INVERTED FORK +02444 OCR BELT BUCKLE +02445 OCR BOW TIE +02446 OCR BRANCH BANK IDENTIFICATION +02447 OCR AMOUNT OF CHECK +02448 MICR ON US SYMBOL +02448 OCR DASH +02449 MICR DASH SYMBOL +02449 OCR CUSTOMER ACCOUNT NUMBER +0244A OCR DOUBLE BACKSLASH +02460 CIRCLED DIGIT ONE +02461 CIRCLED DIGIT TWO +02462 CIRCLED DIGIT THREE +02463 CIRCLED DIGIT FOUR +02464 CIRCLED DIGIT FIVE +02465 CIRCLED DIGIT SIX +02466 CIRCLED DIGIT SEVEN +02467 CIRCLED DIGIT EIGHT +02468 CIRCLED DIGIT NINE +02469 CIRCLED NUMBER TEN +0246A CIRCLED NUMBER ELEVEN +0246B CIRCLED NUMBER TWELVE +0246C CIRCLED NUMBER THIRTEEN +0246D CIRCLED NUMBER FOURTEEN +0246E CIRCLED NUMBER FIFTEEN +0246F CIRCLED NUMBER SIXTEEN +02470 CIRCLED NUMBER SEVENTEEN +02471 CIRCLED NUMBER EIGHTEEN +02472 CIRCLED NUMBER NINETEEN +02473 CIRCLED NUMBER TWENTY +02474 PARENTHESIZED DIGIT ONE +02475 PARENTHESIZED DIGIT TWO +02476 PARENTHESIZED DIGIT THREE +02477 PARENTHESIZED DIGIT FOUR +02478 PARENTHESIZED DIGIT FIVE +02479 PARENTHESIZED DIGIT SIX +0247A PARENTHESIZED DIGIT SEVEN +0247B PARENTHESIZED DIGIT EIGHT +0247C PARENTHESIZED DIGIT NINE +0247D PARENTHESIZED NUMBER TEN +0247E PARENTHESIZED NUMBER ELEVEN +0247F PARENTHESIZED NUMBER TWELVE +02480 PARENTHESIZED NUMBER THIRTEEN +02481 PARENTHESIZED NUMBER FOURTEEN +02482 PARENTHESIZED NUMBER FIFTEEN +02483 PARENTHESIZED NUMBER SIXTEEN +02484 PARENTHESIZED NUMBER SEVENTEEN +02485 PARENTHESIZED NUMBER EIGHTEEN +02486 PARENTHESIZED NUMBER NINETEEN +02487 PARENTHESIZED NUMBER TWENTY +02488 DIGIT ONE FULL STOP +02489 DIGIT TWO FULL STOP +0248A DIGIT THREE FULL STOP +0248B DIGIT FOUR FULL STOP +0248C DIGIT FIVE FULL STOP +0248D DIGIT SIX FULL STOP +0248E DIGIT SEVEN FULL STOP +0248F DIGIT EIGHT FULL STOP +02490 DIGIT NINE FULL STOP +02491 NUMBER TEN FULL STOP +02492 NUMBER ELEVEN FULL STOP +02493 NUMBER TWELVE FULL STOP +02494 NUMBER THIRTEEN FULL STOP +02495 NUMBER FOURTEEN FULL STOP +02496 NUMBER FIFTEEN FULL STOP +02497 NUMBER SIXTEEN FULL STOP +02498 NUMBER SEVENTEEN FULL STOP +02499 NUMBER EIGHTEEN FULL STOP +0249A NUMBER NINETEEN FULL STOP +0249B NUMBER TWENTY FULL STOP +0249C PARENTHESIZED LATIN SMALL LETTER A +0249D PARENTHESIZED LATIN SMALL LETTER B +0249E PARENTHESIZED LATIN SMALL LETTER C +0249F PARENTHESIZED LATIN SMALL LETTER D +024A0 PARENTHESIZED LATIN SMALL LETTER E +024A1 PARENTHESIZED LATIN SMALL LETTER F +024A2 PARENTHESIZED LATIN SMALL LETTER G +024A3 PARENTHESIZED LATIN SMALL LETTER H +024A4 PARENTHESIZED LATIN SMALL LETTER I +024A5 PARENTHESIZED LATIN SMALL LETTER J +024A6 PARENTHESIZED LATIN SMALL LETTER K +024A7 PARENTHESIZED LATIN SMALL LETTER L +024A8 PARENTHESIZED LATIN SMALL LETTER M +024A9 PARENTHESIZED LATIN SMALL LETTER N +024AA PARENTHESIZED LATIN SMALL LETTER O +024AB PARENTHESIZED LATIN SMALL LETTER P +024AC PARENTHESIZED LATIN SMALL LETTER Q +024AD PARENTHESIZED LATIN SMALL LETTER R +024AE PARENTHESIZED LATIN SMALL LETTER S +024AF PARENTHESIZED LATIN SMALL LETTER T +024B0 PARENTHESIZED LATIN SMALL LETTER U +024B1 PARENTHESIZED LATIN SMALL LETTER V +024B2 PARENTHESIZED LATIN SMALL LETTER W +024B3 PARENTHESIZED LATIN SMALL LETTER X +024B4 PARENTHESIZED LATIN SMALL LETTER Y +024B5 PARENTHESIZED LATIN SMALL LETTER Z +024B6 CIRCLED LATIN CAPITAL LETTER A +024B7 CIRCLED LATIN CAPITAL LETTER B +024B8 CIRCLED LATIN CAPITAL LETTER C +024B9 CIRCLED LATIN CAPITAL LETTER D +024BA CIRCLED LATIN CAPITAL LETTER E +024BB CIRCLED LATIN CAPITAL LETTER F +024BC CIRCLED LATIN CAPITAL LETTER G +024BD CIRCLED LATIN CAPITAL LETTER H +024BE CIRCLED LATIN CAPITAL LETTER I +024BF CIRCLED LATIN CAPITAL LETTER J +024C0 CIRCLED LATIN CAPITAL LETTER K +024C1 CIRCLED LATIN CAPITAL LETTER L +024C2 CIRCLED LATIN CAPITAL LETTER M +024C3 CIRCLED LATIN CAPITAL LETTER N +024C4 CIRCLED LATIN CAPITAL LETTER O +024C5 CIRCLED LATIN CAPITAL LETTER P +024C6 CIRCLED LATIN CAPITAL LETTER Q +024C7 CIRCLED LATIN CAPITAL LETTER R +024C8 CIRCLED LATIN CAPITAL LETTER S +024C9 CIRCLED LATIN CAPITAL LETTER T +024CA CIRCLED LATIN CAPITAL LETTER U +024CB CIRCLED LATIN CAPITAL LETTER V +024CC CIRCLED LATIN CAPITAL LETTER W +024CD CIRCLED LATIN CAPITAL LETTER X +024CE CIRCLED LATIN CAPITAL LETTER Y +024CF CIRCLED LATIN CAPITAL LETTER Z +024D0 CIRCLED LATIN SMALL LETTER A +024D1 CIRCLED LATIN SMALL LETTER B +024D2 CIRCLED LATIN SMALL LETTER C +024D3 CIRCLED LATIN SMALL LETTER D +024D4 CIRCLED LATIN SMALL LETTER E +024D5 CIRCLED LATIN SMALL LETTER F +024D6 CIRCLED LATIN SMALL LETTER G +024D7 CIRCLED LATIN SMALL LETTER H +024D8 CIRCLED LATIN SMALL LETTER I +024D9 CIRCLED LATIN SMALL LETTER J +024DA CIRCLED LATIN SMALL LETTER K +024DB CIRCLED LATIN SMALL LETTER L +024DC CIRCLED LATIN SMALL LETTER M +024DD CIRCLED LATIN SMALL LETTER N +024DE CIRCLED LATIN SMALL LETTER O +024DF CIRCLED LATIN SMALL LETTER P +024E0 CIRCLED LATIN SMALL LETTER Q +024E1 CIRCLED LATIN SMALL LETTER R +024E2 CIRCLED LATIN SMALL LETTER S +024E3 CIRCLED LATIN SMALL LETTER T +024E4 CIRCLED LATIN SMALL LETTER U +024E5 CIRCLED LATIN SMALL LETTER V +024E6 CIRCLED LATIN SMALL LETTER W +024E7 CIRCLED LATIN SMALL LETTER X +024E8 CIRCLED LATIN SMALL LETTER Y +024E9 CIRCLED LATIN SMALL LETTER Z +024EA CIRCLED DIGIT ZERO +024EB NEGATIVE CIRCLED NUMBER ELEVEN +024EC NEGATIVE CIRCLED NUMBER TWELVE +024ED NEGATIVE CIRCLED NUMBER THIRTEEN +024EE NEGATIVE CIRCLED NUMBER FOURTEEN +024EF NEGATIVE CIRCLED NUMBER FIFTEEN +024F0 NEGATIVE CIRCLED NUMBER SIXTEEN +024F1 NEGATIVE CIRCLED NUMBER SEVENTEEN +024F2 NEGATIVE CIRCLED NUMBER EIGHTEEN +024F3 NEGATIVE CIRCLED NUMBER NINETEEN +024F4 NEGATIVE CIRCLED NUMBER TWENTY +024F5 DOUBLE CIRCLED DIGIT ONE +024F6 DOUBLE CIRCLED DIGIT TWO +024F7 DOUBLE CIRCLED DIGIT THREE +024F8 DOUBLE CIRCLED DIGIT FOUR +024F9 DOUBLE CIRCLED DIGIT FIVE +024FA DOUBLE CIRCLED DIGIT SIX +024FB DOUBLE CIRCLED DIGIT SEVEN +024FC DOUBLE CIRCLED DIGIT EIGHT +024FD DOUBLE CIRCLED DIGIT NINE +024FE DOUBLE CIRCLED NUMBER TEN +024FF NEGATIVE CIRCLED DIGIT ZERO +02500 BOX DRAWINGS LIGHT HORIZONTAL +02501 BOX DRAWINGS HEAVY HORIZONTAL +02502 BOX DRAWINGS LIGHT VERTICAL +02503 BOX DRAWINGS HEAVY VERTICAL +02504 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +02505 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +02506 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +02507 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +02508 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +02509 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +0250A BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +0250B BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +0250C BOX DRAWINGS LIGHT DOWN AND RIGHT +0250D BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +0250E BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +0250F BOX DRAWINGS HEAVY DOWN AND RIGHT +02510 BOX DRAWINGS LIGHT DOWN AND LEFT +02511 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +02512 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +02513 BOX DRAWINGS HEAVY DOWN AND LEFT +02514 BOX DRAWINGS LIGHT UP AND RIGHT +02515 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +02516 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +02517 BOX DRAWINGS HEAVY UP AND RIGHT +02518 BOX DRAWINGS LIGHT UP AND LEFT +02519 BOX DRAWINGS UP LIGHT AND LEFT HEAVY +0251A BOX DRAWINGS UP HEAVY AND LEFT LIGHT +0251B BOX DRAWINGS HEAVY UP AND LEFT +0251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT +0251D BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +0251E BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT +0251F BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT +02520 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +02521 BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY +02522 BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY +02523 BOX DRAWINGS HEAVY VERTICAL AND RIGHT +02524 BOX DRAWINGS LIGHT VERTICAL AND LEFT +02525 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +02526 BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT +02527 BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT +02528 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +02529 BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY +0252A BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY +0252B BOX DRAWINGS HEAVY VERTICAL AND LEFT +0252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +0252D BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT +0252E BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT +0252F BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +02530 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +02531 BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY +02532 BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY +02533 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +02534 BOX DRAWINGS LIGHT UP AND HORIZONTAL +02535 BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT +02536 BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT +02537 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +02538 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +02539 BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY +0253A BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY +0253B BOX DRAWINGS HEAVY UP AND HORIZONTAL +0253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +0253D BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT +0253E BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT +0253F BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +02540 BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT +02541 BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT +02542 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +02543 BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT +02544 BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT +02545 BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT +02546 BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT +02547 BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY +02548 BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY +02549 BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY +0254A BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY +0254B BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +0254C BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL +0254D BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL +0254E BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL +0254F BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +02550 BOX DRAWINGS DOUBLE HORIZONTAL +02551 BOX DRAWINGS DOUBLE VERTICAL +02552 BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE +02553 BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE +02554 BOX DRAWINGS DOUBLE DOWN AND RIGHT +02555 BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE +02556 BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE +02557 BOX DRAWINGS DOUBLE DOWN AND LEFT +02558 BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE +02559 BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE +0255A BOX DRAWINGS DOUBLE UP AND RIGHT +0255B BOX DRAWINGS UP SINGLE AND LEFT DOUBLE +0255C BOX DRAWINGS UP DOUBLE AND LEFT SINGLE +0255D BOX DRAWINGS DOUBLE UP AND LEFT +0255E BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE +0255F BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE +02560 BOX DRAWINGS DOUBLE VERTICAL AND RIGHT +02561 BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE +02562 BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE +02563 BOX DRAWINGS DOUBLE VERTICAL AND LEFT +02564 BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE +02565 BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE +02566 BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL +02567 BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE +02568 BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE +02569 BOX DRAWINGS DOUBLE UP AND HORIZONTAL +0256A BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE +0256B BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE +0256C BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL +0256D BOX DRAWINGS LIGHT ARC DOWN AND RIGHT +0256E BOX DRAWINGS LIGHT ARC DOWN AND LEFT +0256F BOX DRAWINGS LIGHT ARC UP AND LEFT +02570 BOX DRAWINGS LIGHT ARC UP AND RIGHT +02571 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +02572 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +02573 BOX DRAWINGS LIGHT DIAGONAL CROSS +02574 BOX DRAWINGS LIGHT LEFT +02575 BOX DRAWINGS LIGHT UP +02576 BOX DRAWINGS LIGHT RIGHT +02577 BOX DRAWINGS LIGHT DOWN +02578 BOX DRAWINGS HEAVY LEFT +02579 BOX DRAWINGS HEAVY UP +0257A BOX DRAWINGS HEAVY RIGHT +0257B BOX DRAWINGS HEAVY DOWN +0257C BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT +0257D BOX DRAWINGS LIGHT UP AND HEAVY DOWN +0257E BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT +0257F BOX DRAWINGS HEAVY UP AND LIGHT DOWN +02580 UPPER HALF BLOCK +02581 LOWER ONE EIGHTH BLOCK +02582 LOWER ONE QUARTER BLOCK +02583 LOWER THREE EIGHTHS BLOCK +02584 LOWER HALF BLOCK +02585 LOWER FIVE EIGHTHS BLOCK +02586 LOWER THREE QUARTERS BLOCK +02587 LOWER SEVEN EIGHTHS BLOCK +02588 FULL BLOCK +02589 LEFT SEVEN EIGHTHS BLOCK +0258A LEFT THREE QUARTERS BLOCK +0258B LEFT FIVE EIGHTHS BLOCK +0258C LEFT HALF BLOCK +0258D LEFT THREE EIGHTHS BLOCK +0258E LEFT ONE QUARTER BLOCK +0258F LEFT ONE EIGHTH BLOCK +02590 RIGHT HALF BLOCK +02591 LIGHT SHADE +02592 MEDIUM SHADE +02593 DARK SHADE +02594 UPPER ONE EIGHTH BLOCK +02595 RIGHT ONE EIGHTH BLOCK +02596 QUADRANT LOWER LEFT +02597 QUADRANT LOWER RIGHT +02598 QUADRANT UPPER LEFT +02599 QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT +0259A QUADRANT UPPER LEFT AND LOWER RIGHT +0259B QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT +0259C QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT +0259D QUADRANT UPPER RIGHT +0259E QUADRANT UPPER RIGHT AND LOWER LEFT +0259F QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +025A0 BLACK SQUARE +025A1 WHITE SQUARE +025A2 WHITE SQUARE WITH ROUNDED CORNERS +025A3 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +025A4 SQUARE WITH HORIZONTAL FILL +025A5 SQUARE WITH VERTICAL FILL +025A6 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +025A7 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +025A8 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +025A9 SQUARE WITH DIAGONAL CROSSHATCH FILL +025AA BLACK SMALL SQUARE +025AB WHITE SMALL SQUARE +025AC BLACK RECTANGLE +025AD WHITE RECTANGLE +025AE BLACK VERTICAL RECTANGLE +025AF WHITE VERTICAL RECTANGLE +025B0 BLACK PARALLELOGRAM +025B1 WHITE PARALLELOGRAM +025B2 BLACK UP-POINTING TRIANGLE +025B3 WHITE UP-POINTING TRIANGLE +025B4 BLACK UP-POINTING SMALL TRIANGLE +025B5 WHITE UP-POINTING SMALL TRIANGLE +025B6 BLACK RIGHT-POINTING TRIANGLE +025B7 WHITE RIGHT-POINTING TRIANGLE +025B8 BLACK RIGHT-POINTING SMALL TRIANGLE +025B9 WHITE RIGHT-POINTING SMALL TRIANGLE +025BA BLACK RIGHT-POINTING POINTER +025BB WHITE RIGHT-POINTING POINTER +025BC BLACK DOWN-POINTING TRIANGLE +025BD WHITE DOWN-POINTING TRIANGLE +025BE BLACK DOWN-POINTING SMALL TRIANGLE +025BF WHITE DOWN-POINTING SMALL TRIANGLE +025C0 BLACK LEFT-POINTING TRIANGLE +025C1 WHITE LEFT-POINTING TRIANGLE +025C2 BLACK LEFT-POINTING SMALL TRIANGLE +025C3 WHITE LEFT-POINTING SMALL TRIANGLE +025C4 BLACK LEFT-POINTING POINTER +025C5 WHITE LEFT-POINTING POINTER +025C6 BLACK DIAMOND +025C7 WHITE DIAMOND +025C8 WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +025C9 FISHEYE +025CA LOZENGE +025CB WHITE CIRCLE +025CC DOTTED CIRCLE +025CD CIRCLE WITH VERTICAL FILL +025CE BULLSEYE +025CF BLACK CIRCLE +025D0 CIRCLE WITH LEFT HALF BLACK +025D1 CIRCLE WITH RIGHT HALF BLACK +025D2 CIRCLE WITH LOWER HALF BLACK +025D3 CIRCLE WITH UPPER HALF BLACK +025D4 CIRCLE WITH UPPER RIGHT QUADRANT BLACK +025D5 CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK +025D6 LEFT HALF BLACK CIRCLE +025D7 RIGHT HALF BLACK CIRCLE +025D8 INVERSE BULLET +025D9 INVERSE WHITE CIRCLE +025DA UPPER HALF INVERSE WHITE CIRCLE +025DB LOWER HALF INVERSE WHITE CIRCLE +025DC UPPER LEFT QUADRANT CIRCULAR ARC +025DD UPPER RIGHT QUADRANT CIRCULAR ARC +025DE LOWER RIGHT QUADRANT CIRCULAR ARC +025DF LOWER LEFT QUADRANT CIRCULAR ARC +025E0 UPPER HALF CIRCLE +025E1 LOWER HALF CIRCLE +025E2 BLACK LOWER RIGHT TRIANGLE +025E3 BLACK LOWER LEFT TRIANGLE +025E4 BLACK UPPER LEFT TRIANGLE +025E5 BLACK UPPER RIGHT TRIANGLE +025E6 WHITE BULLET +025E7 SQUARE WITH LEFT HALF BLACK +025E8 SQUARE WITH RIGHT HALF BLACK +025E9 SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK +025EA SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK +025EB WHITE SQUARE WITH VERTICAL BISECTING LINE +025EC WHITE UP-POINTING TRIANGLE WITH DOT +025ED UP-POINTING TRIANGLE WITH LEFT HALF BLACK +025EE UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +025EF LARGE CIRCLE +025F0 WHITE SQUARE WITH UPPER LEFT QUADRANT +025F1 WHITE SQUARE WITH LOWER LEFT QUADRANT +025F2 WHITE SQUARE WITH LOWER RIGHT QUADRANT +025F3 WHITE SQUARE WITH UPPER RIGHT QUADRANT +025F4 WHITE CIRCLE WITH UPPER LEFT QUADRANT +025F5 WHITE CIRCLE WITH LOWER LEFT QUADRANT +025F6 WHITE CIRCLE WITH LOWER RIGHT QUADRANT +025F7 WHITE CIRCLE WITH UPPER RIGHT QUADRANT +025F8 UPPER LEFT TRIANGLE +025F9 UPPER RIGHT TRIANGLE +025FA LOWER LEFT TRIANGLE +025FB WHITE MEDIUM SQUARE +025FC BLACK MEDIUM SQUARE +025FD WHITE MEDIUM SMALL SQUARE +025FE BLACK MEDIUM SMALL SQUARE +025FF LOWER RIGHT TRIANGLE +02600 BLACK SUN WITH RAYS +02601 CLOUD +02602 UMBRELLA +02603 SNOWMAN +02604 COMET +02605 BLACK STAR +02606 WHITE STAR +02607 LIGHTNING +02608 THUNDERSTORM +02609 SUN +0260A ASCENDING NODE +0260B DESCENDING NODE +0260C CONJUNCTION +0260D OPPOSITION +0260E BLACK TELEPHONE +0260F WHITE TELEPHONE +02610 BALLOT BOX +02611 BALLOT BOX WITH CHECK +02612 BALLOT BOX WITH X +02613 SALTIRE +02614 UMBRELLA WITH RAIN DROPS +02615 HOT BEVERAGE +02616 WHITE SHOGI PIECE +02617 BLACK SHOGI PIECE +02618 SHAMROCK +02619 REVERSED ROTATED FLORAL HEART BULLET +0261A BLACK LEFT POINTING INDEX +0261B BLACK RIGHT POINTING INDEX +0261C WHITE LEFT POINTING INDEX +0261D WHITE UP POINTING INDEX +0261E WHITE RIGHT POINTING INDEX +0261F WHITE DOWN POINTING INDEX +02620 SKULL AND CROSSBONES +02621 CAUTION SIGN +02622 RADIOACTIVE SIGN +02623 BIOHAZARD SIGN +02624 CADUCEUS +02625 ANKH +02626 ORTHODOX CROSS +02627 CHI RHO +02628 CROSS OF LORRAINE +02629 CROSS OF JERUSALEM +0262A STAR AND CRESCENT +0262B FARSI SYMBOL +0262C ADI SHAKTI +0262D HAMMER AND SICKLE +0262E PEACE SYMBOL +0262F YIN YANG +02630 TRIGRAM FOR HEAVEN +02631 TRIGRAM FOR LAKE +02632 TRIGRAM FOR FIRE +02633 TRIGRAM FOR THUNDER +02634 TRIGRAM FOR WIND +02635 TRIGRAM FOR WATER +02636 TRIGRAM FOR MOUNTAIN +02637 TRIGRAM FOR EARTH +02638 WHEEL OF DHARMA +02639 WHITE FROWNING FACE +0263A WHITE SMILING FACE +0263B BLACK SMILING FACE +0263C WHITE SUN WITH RAYS +0263D FIRST QUARTER MOON +0263E LAST QUARTER MOON +0263F MERCURY +02640 FEMALE SIGN +02641 EARTH +02642 MALE SIGN +02643 JUPITER +02644 SATURN +02645 URANUS +02646 NEPTUNE +02647 PLUTO +02648 ARIES +02649 TAURUS +0264A GEMINI +0264B CANCER +0264C LEO +0264D VIRGO +0264E LIBRA +0264F SCORPIUS +02650 SAGITTARIUS +02651 CAPRICORN +02652 AQUARIUS +02653 PISCES +02654 WHITE CHESS KING +02655 WHITE CHESS QUEEN +02656 WHITE CHESS ROOK +02657 WHITE CHESS BISHOP +02658 WHITE CHESS KNIGHT +02659 WHITE CHESS PAWN +0265A BLACK CHESS KING +0265B BLACK CHESS QUEEN +0265C BLACK CHESS ROOK +0265D BLACK CHESS BISHOP +0265E BLACK CHESS KNIGHT +0265F BLACK CHESS PAWN +02660 BLACK SPADE SUIT +02661 WHITE HEART SUIT +02662 WHITE DIAMOND SUIT +02663 BLACK CLUB SUIT +02664 WHITE SPADE SUIT +02665 BLACK HEART SUIT +02666 BLACK DIAMOND SUIT +02667 WHITE CLUB SUIT +02668 HOT SPRINGS +02669 QUARTER NOTE +0266A EIGHTH NOTE +0266B BEAMED EIGHTH NOTES +0266C BEAMED SIXTEENTH NOTES +0266D MUSIC FLAT SIGN +0266E MUSIC NATURAL SIGN +0266F MUSIC SHARP SIGN +02670 WEST SYRIAC CROSS +02671 EAST SYRIAC CROSS +02672 UNIVERSAL RECYCLING SYMBOL +02673 RECYCLING SYMBOL FOR TYPE-1 PLASTICS +02674 RECYCLING SYMBOL FOR TYPE-2 PLASTICS +02675 RECYCLING SYMBOL FOR TYPE-3 PLASTICS +02676 RECYCLING SYMBOL FOR TYPE-4 PLASTICS +02677 RECYCLING SYMBOL FOR TYPE-5 PLASTICS +02678 RECYCLING SYMBOL FOR TYPE-6 PLASTICS +02679 RECYCLING SYMBOL FOR TYPE-7 PLASTICS +0267A RECYCLING SYMBOL FOR GENERIC MATERIALS +0267B BLACK UNIVERSAL RECYCLING SYMBOL +0267C RECYCLED PAPER SYMBOL +0267D PARTIALLY-RECYCLED PAPER SYMBOL +0267E PERMANENT PAPER SIGN +0267F WHEELCHAIR SYMBOL +02680 DIE FACE-1 +02681 DIE FACE-2 +02682 DIE FACE-3 +02683 DIE FACE-4 +02684 DIE FACE-5 +02685 DIE FACE-6 +02686 WHITE CIRCLE WITH DOT RIGHT +02687 WHITE CIRCLE WITH TWO DOTS +02688 BLACK CIRCLE WITH WHITE DOT RIGHT +02689 BLACK CIRCLE WITH TWO WHITE DOTS +0268A MONOGRAM FOR YANG +0268B MONOGRAM FOR YIN +0268C DIGRAM FOR GREATER YANG +0268D DIGRAM FOR LESSER YIN +0268E DIGRAM FOR LESSER YANG +0268F DIGRAM FOR GREATER YIN +02690 WHITE FLAG +02691 BLACK FLAG +02692 HAMMER AND PICK +02693 ANCHOR +02694 CROSSED SWORDS +02695 STAFF OF AESCULAPIUS +02696 SCALES +02697 ALEMBIC +02698 FLOWER +02699 GEAR +0269A STAFF OF HERMES +0269B ATOM SYMBOL +0269C FLEUR-DE-LIS +0269D OUTLINED WHITE STAR +0269E THREE LINES CONVERGING RIGHT +0269F THREE LINES CONVERGING LEFT +026A0 WARNING SIGN +026A1 HIGH VOLTAGE SIGN +026A2 DOUBLED FEMALE SIGN +026A3 DOUBLED MALE SIGN +026A4 INTERLOCKED FEMALE AND MALE SIGN +026A5 MALE AND FEMALE SIGN +026A6 MALE WITH STROKE SIGN +026A7 MALE WITH STROKE AND MALE AND FEMALE SIGN +026A8 VERTICAL MALE WITH STROKE SIGN +026A9 HORIZONTAL MALE WITH STROKE SIGN +026AA MEDIUM WHITE CIRCLE +026AB MEDIUM BLACK CIRCLE +026AC MEDIUM SMALL WHITE CIRCLE +026AD MARRIAGE SYMBOL +026AE DIVORCE SYMBOL +026AF UNMARRIED PARTNERSHIP SYMBOL +026B0 COFFIN +026B1 FUNERAL URN +026B2 NEUTER +026B3 CERES +026B4 PALLAS +026B5 JUNO +026B6 VESTA +026B7 CHIRON +026B8 BLACK MOON LILITH +026B9 SEXTILE +026BA SEMISEXTILE +026BB QUINCUNX +026BC SESQUIQUADRATE +026BD SOCCER BALL +026BE BASEBALL +026BF SQUARED KEY +026C0 WHITE DRAUGHTS MAN +026C1 WHITE DRAUGHTS KING +026C2 BLACK DRAUGHTS MAN +026C3 BLACK DRAUGHTS KING +026C4 SNOWMAN WITHOUT SNOW +026C5 SUN BEHIND CLOUD +026C6 RAIN +026C7 BLACK SNOWMAN +026C8 THUNDER CLOUD AND RAIN +026C9 TURNED WHITE SHOGI PIECE +026CA TURNED BLACK SHOGI PIECE +026CB WHITE DIAMOND IN SQUARE +026CC CROSSING LANES +026CD DISABLED CAR +026CE OPHIUCHUS +026CF PICK +026D0 CAR SLIDING +026D1 HELMET WITH WHITE CROSS +026D2 CIRCLED CROSSING LANES +026D3 CHAINS +026D4 NO ENTRY +026D5 ALTERNATE ONE-WAY LEFT WAY TRAFFIC +026D6 BLACK TWO-WAY LEFT WAY TRAFFIC +026D7 WHITE TWO-WAY LEFT WAY TRAFFIC +026D8 BLACK LEFT LANE MERGE +026D9 WHITE LEFT LANE MERGE +026DA DRIVE SLOW SIGN +026DB HEAVY WHITE DOWN-POINTING TRIANGLE +026DC LEFT CLOSED ENTRY +026DD SQUARED SALTIRE +026DE FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE +026DF BLACK TRUCK +026E0 RESTRICTED LEFT ENTRY-1 +026E1 RESTRICTED LEFT ENTRY-2 +026E2 ASTRONOMICAL SYMBOL FOR URANUS +026E3 HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +026E4 PENTAGRAM +026E5 RIGHT-HANDED INTERLACED PENTAGRAM +026E6 LEFT-HANDED INTERLACED PENTAGRAM +026E7 INVERTED PENTAGRAM +026E8 BLACK CROSS ON SHIELD +026E9 SHINTO SHRINE +026EA CHURCH +026EB CASTLE +026EC HISTORIC SITE +026ED GEAR WITHOUT HUB +026EE GEAR WITH HANDLES +026EF MAP SYMBOL FOR LIGHTHOUSE +026F0 MOUNTAIN +026F1 UMBRELLA ON GROUND +026F2 FOUNTAIN +026F3 FLAG IN HOLE +026F4 FERRY +026F5 SAILBOAT +026F6 SQUARE FOUR CORNERS +026F7 SKIER +026F8 ICE SKATE +026F9 PERSON WITH BALL +026FA TENT +026FB JAPANESE BANK SYMBOL +026FC HEADSTONE GRAVEYARD SYMBOL +026FD FUEL PUMP +026FE CUP ON BLACK SQUARE +026FF WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +02700 BLACK SAFETY SCISSORS +02701 UPPER BLADE SCISSORS +02702 BLACK SCISSORS +02703 LOWER BLADE SCISSORS +02704 WHITE SCISSORS +02705 WHITE HEAVY CHECK MARK +02706 TELEPHONE LOCATION SIGN +02707 TAPE DRIVE +02708 AIRPLANE +02709 ENVELOPE +0270A RAISED FIST +0270B RAISED HAND +0270C VICTORY HAND +0270D WRITING HAND +0270E LOWER RIGHT PENCIL +0270F PENCIL +02710 UPPER RIGHT PENCIL +02711 WHITE NIB +02712 BLACK NIB +02713 CHECK MARK +02714 HEAVY CHECK MARK +02715 MULTIPLICATION X +02716 HEAVY MULTIPLICATION X +02717 BALLOT X +02718 HEAVY BALLOT X +02719 OUTLINED GREEK CROSS +0271A HEAVY GREEK CROSS +0271B OPEN CENTRE CROSS +0271C HEAVY OPEN CENTRE CROSS +0271D LATIN CROSS +0271E SHADOWED WHITE LATIN CROSS +0271F OUTLINED LATIN CROSS +02720 MALTESE CROSS +02721 STAR OF DAVID +02722 FOUR TEARDROP-SPOKED ASTERISK +02723 FOUR BALLOON-SPOKED ASTERISK +02724 HEAVY FOUR BALLOON-SPOKED ASTERISK +02725 FOUR CLUB-SPOKED ASTERISK +02726 BLACK FOUR POINTED STAR +02727 WHITE FOUR POINTED STAR +02728 SPARKLES +02729 STRESS OUTLINED WHITE STAR +0272A CIRCLED WHITE STAR +0272B OPEN CENTRE BLACK STAR +0272C BLACK CENTRE WHITE STAR +0272D OUTLINED BLACK STAR +0272E HEAVY OUTLINED BLACK STAR +0272F PINWHEEL STAR +02730 SHADOWED WHITE STAR +02731 HEAVY ASTERISK +02732 OPEN CENTRE ASTERISK +02733 EIGHT SPOKED ASTERISK +02734 EIGHT POINTED BLACK STAR +02735 EIGHT POINTED PINWHEEL STAR +02736 SIX POINTED BLACK STAR +02737 EIGHT POINTED RECTILINEAR BLACK STAR +02738 HEAVY EIGHT POINTED RECTILINEAR BLACK STAR +02739 TWELVE POINTED BLACK STAR +0273A SIXTEEN POINTED ASTERISK +0273B TEARDROP-SPOKED ASTERISK +0273C OPEN CENTRE TEARDROP-SPOKED ASTERISK +0273D HEAVY TEARDROP-SPOKED ASTERISK +0273E SIX PETALLED BLACK AND WHITE FLORETTE +0273F BLACK FLORETTE +02740 WHITE FLORETTE +02741 EIGHT PETALLED OUTLINED BLACK FLORETTE +02742 CIRCLED OPEN CENTRE EIGHT POINTED STAR +02743 HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK +02744 SNOWFLAKE +02745 TIGHT TRIFOLIATE SNOWFLAKE +02746 HEAVY CHEVRON SNOWFLAKE +02747 SPARKLE +02748 HEAVY SPARKLE +02749 BALLOON-SPOKED ASTERISK +0274A EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +0274B HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +0274C CROSS MARK +0274D SHADOWED WHITE CIRCLE +0274E NEGATIVE SQUARED CROSS MARK +0274F LOWER RIGHT DROP-SHADOWED WHITE SQUARE +02750 UPPER RIGHT DROP-SHADOWED WHITE SQUARE +02751 LOWER RIGHT SHADOWED WHITE SQUARE +02752 UPPER RIGHT SHADOWED WHITE SQUARE +02753 BLACK QUESTION MARK ORNAMENT +02754 WHITE QUESTION MARK ORNAMENT +02755 WHITE EXCLAMATION MARK ORNAMENT +02756 BLACK DIAMOND MINUS WHITE X +02757 HEAVY EXCLAMATION MARK SYMBOL +02758 LIGHT VERTICAL BAR +02759 MEDIUM VERTICAL BAR +0275A HEAVY VERTICAL BAR +0275B HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT +0275C HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT +0275D HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +0275E HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +0275F HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT +02760 HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +02761 CURVED STEM PARAGRAPH SIGN ORNAMENT +02762 HEAVY EXCLAMATION MARK ORNAMENT +02763 HEAVY HEART EXCLAMATION MARK ORNAMENT +02764 HEAVY BLACK HEART +02765 ROTATED HEAVY BLACK HEART BULLET +02766 FLORAL HEART +02767 ROTATED FLORAL HEART BULLET +02768 MEDIUM LEFT PARENTHESIS ORNAMENT +02769 MEDIUM RIGHT PARENTHESIS ORNAMENT +0276A MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +0276B MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +0276C MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +0276D MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +0276E HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +0276F HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +02770 HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +02771 HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +02772 LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +02773 LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +02774 MEDIUM LEFT CURLY BRACKET ORNAMENT +02775 MEDIUM RIGHT CURLY BRACKET ORNAMENT +02776 DINGBAT NEGATIVE CIRCLED DIGIT ONE +02777 DINGBAT NEGATIVE CIRCLED DIGIT TWO +02778 DINGBAT NEGATIVE CIRCLED DIGIT THREE +02779 DINGBAT NEGATIVE CIRCLED DIGIT FOUR +0277A DINGBAT NEGATIVE CIRCLED DIGIT FIVE +0277B DINGBAT NEGATIVE CIRCLED DIGIT SIX +0277C DINGBAT NEGATIVE CIRCLED DIGIT SEVEN +0277D DINGBAT NEGATIVE CIRCLED DIGIT EIGHT +0277E DINGBAT NEGATIVE CIRCLED DIGIT NINE +0277F DINGBAT NEGATIVE CIRCLED NUMBER TEN +02780 DINGBAT CIRCLED SANS-SERIF DIGIT ONE +02781 DINGBAT CIRCLED SANS-SERIF DIGIT TWO +02782 DINGBAT CIRCLED SANS-SERIF DIGIT THREE +02783 DINGBAT CIRCLED SANS-SERIF DIGIT FOUR +02784 DINGBAT CIRCLED SANS-SERIF DIGIT FIVE +02785 DINGBAT CIRCLED SANS-SERIF DIGIT SIX +02786 DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN +02787 DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT +02788 DINGBAT CIRCLED SANS-SERIF DIGIT NINE +02789 DINGBAT CIRCLED SANS-SERIF NUMBER TEN +0278A DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE +0278B DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO +0278C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE +0278D DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR +0278E DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE +0278F DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX +02790 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN +02791 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT +02792 DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE +02793 DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +02794 HEAVY WIDE-HEADED RIGHTWARDS ARROW +02795 HEAVY PLUS SIGN +02796 HEAVY MINUS SIGN +02797 HEAVY DIVISION SIGN +02798 HEAVY SOUTH EAST ARROW +02799 HEAVY RIGHTWARDS ARROW +0279A HEAVY NORTH EAST ARROW +0279B DRAFTING POINT RIGHTWARDS ARROW +0279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW +0279D TRIANGLE-HEADED RIGHTWARDS ARROW +0279E HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW +0279F DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +027A0 HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW +027A1 BLACK RIGHTWARDS ARROW +027A2 THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD +027A3 THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD +027A4 BLACK RIGHTWARDS ARROWHEAD +027A5 HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +027A6 HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +027A7 SQUAT BLACK RIGHTWARDS ARROW +027A8 HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW +027A9 RIGHT-SHADED WHITE RIGHTWARDS ARROW +027AA LEFT-SHADED WHITE RIGHTWARDS ARROW +027AB BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW +027AC FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW +027AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +027AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +027AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +027B0 CURLY LOOP +027B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +027B2 CIRCLED HEAVY WHITE RIGHTWARDS ARROW +027B3 WHITE-FEATHERED RIGHTWARDS ARROW +027B4 BLACK-FEATHERED SOUTH EAST ARROW +027B5 BLACK-FEATHERED RIGHTWARDS ARROW +027B6 BLACK-FEATHERED NORTH EAST ARROW +027B7 HEAVY BLACK-FEATHERED SOUTH EAST ARROW +027B8 HEAVY BLACK-FEATHERED RIGHTWARDS ARROW +027B9 HEAVY BLACK-FEATHERED NORTH EAST ARROW +027BA TEARDROP-BARBED RIGHTWARDS ARROW +027BB HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW +027BC WEDGE-TAILED RIGHTWARDS ARROW +027BD HEAVY WEDGE-TAILED RIGHTWARDS ARROW +027BE OPEN-OUTLINED RIGHTWARDS ARROW +027BF DOUBLE CURLY LOOP +027C0 THREE DIMENSIONAL ANGLE +027C1 WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE +027C2 PERPENDICULAR +027C3 OPEN SUBSET +027C4 OPEN SUPERSET +027C5 LEFT S-SHAPED BAG DELIMITER +027C6 RIGHT S-SHAPED BAG DELIMITER +027C7 OR WITH DOT INSIDE +027C8 REVERSE SOLIDUS PRECEDING SUBSET +027C9 SUPERSET PRECEDING SOLIDUS +027CA VERTICAL BAR WITH HORIZONTAL STROKE +027CB MATHEMATICAL RISING DIAGONAL +027CC LONG DIVISION +027CD MATHEMATICAL FALLING DIAGONAL +027CE SQUARED LOGICAL AND +027CF SQUARED LOGICAL OR +027D0 WHITE DIAMOND WITH CENTRED DOT +027D1 AND WITH DOT +027D2 ELEMENT OF OPENING UPWARDS +027D3 LOWER RIGHT CORNER WITH DOT +027D4 UPPER LEFT CORNER WITH DOT +027D5 LEFT OUTER JOIN +027D6 RIGHT OUTER JOIN +027D7 FULL OUTER JOIN +027D8 LARGE UP TACK +027D9 LARGE DOWN TACK +027DA LEFT AND RIGHT DOUBLE TURNSTILE +027DB LEFT AND RIGHT TACK +027DC LEFT MULTIMAP +027DD LONG RIGHT TACK +027DE LONG LEFT TACK +027DF UP TACK WITH CIRCLE ABOVE +027E0 LOZENGE DIVIDED BY HORIZONTAL RULE +027E1 WHITE CONCAVE-SIDED DIAMOND +027E2 WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK +027E3 WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK +027E4 WHITE SQUARE WITH LEFTWARDS TICK +027E5 WHITE SQUARE WITH RIGHTWARDS TICK +027E6 MATHEMATICAL LEFT WHITE SQUARE BRACKET +027E7 MATHEMATICAL RIGHT WHITE SQUARE BRACKET +027E8 MATHEMATICAL LEFT ANGLE BRACKET +027E9 MATHEMATICAL RIGHT ANGLE BRACKET +027EA MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +027EB MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +027EC MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +027ED MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +027EE MATHEMATICAL LEFT FLATTENED PARENTHESIS +027EF MATHEMATICAL RIGHT FLATTENED PARENTHESIS +027F0 UPWARDS QUADRUPLE ARROW +027F1 DOWNWARDS QUADRUPLE ARROW +027F2 ANTICLOCKWISE GAPPED CIRCLE ARROW +027F3 CLOCKWISE GAPPED CIRCLE ARROW +027F4 RIGHT ARROW WITH CIRCLED PLUS +027F5 LONG LEFTWARDS ARROW +027F6 LONG RIGHTWARDS ARROW +027F7 LONG LEFT RIGHT ARROW +027F8 LONG LEFTWARDS DOUBLE ARROW +027F9 LONG RIGHTWARDS DOUBLE ARROW +027FA LONG LEFT RIGHT DOUBLE ARROW +027FB LONG LEFTWARDS ARROW FROM BAR +027FC LONG RIGHTWARDS ARROW FROM BAR +027FD LONG LEFTWARDS DOUBLE ARROW FROM BAR +027FE LONG RIGHTWARDS DOUBLE ARROW FROM BAR +027FF LONG RIGHTWARDS SQUIGGLE ARROW +02800 BRAILLE PATTERN BLANK +02801 BRAILLE PATTERN DOTS-1 +02802 BRAILLE PATTERN DOTS-2 +02803 BRAILLE PATTERN DOTS-12 +02804 BRAILLE PATTERN DOTS-3 +02805 BRAILLE PATTERN DOTS-13 +02806 BRAILLE PATTERN DOTS-23 +02807 BRAILLE PATTERN DOTS-123 +02808 BRAILLE PATTERN DOTS-4 +02809 BRAILLE PATTERN DOTS-14 +0280A BRAILLE PATTERN DOTS-24 +0280B BRAILLE PATTERN DOTS-124 +0280C BRAILLE PATTERN DOTS-34 +0280D BRAILLE PATTERN DOTS-134 +0280E BRAILLE PATTERN DOTS-234 +0280F BRAILLE PATTERN DOTS-1234 +02810 BRAILLE PATTERN DOTS-5 +02811 BRAILLE PATTERN DOTS-15 +02812 BRAILLE PATTERN DOTS-25 +02813 BRAILLE PATTERN DOTS-125 +02814 BRAILLE PATTERN DOTS-35 +02815 BRAILLE PATTERN DOTS-135 +02816 BRAILLE PATTERN DOTS-235 +02817 BRAILLE PATTERN DOTS-1235 +02818 BRAILLE PATTERN DOTS-45 +02819 BRAILLE PATTERN DOTS-145 +0281A BRAILLE PATTERN DOTS-245 +0281B BRAILLE PATTERN DOTS-1245 +0281C BRAILLE PATTERN DOTS-345 +0281D BRAILLE PATTERN DOTS-1345 +0281E BRAILLE PATTERN DOTS-2345 +0281F BRAILLE PATTERN DOTS-12345 +02820 BRAILLE PATTERN DOTS-6 +02821 BRAILLE PATTERN DOTS-16 +02822 BRAILLE PATTERN DOTS-26 +02823 BRAILLE PATTERN DOTS-126 +02824 BRAILLE PATTERN DOTS-36 +02825 BRAILLE PATTERN DOTS-136 +02826 BRAILLE PATTERN DOTS-236 +02827 BRAILLE PATTERN DOTS-1236 +02828 BRAILLE PATTERN DOTS-46 +02829 BRAILLE PATTERN DOTS-146 +0282A BRAILLE PATTERN DOTS-246 +0282B BRAILLE PATTERN DOTS-1246 +0282C BRAILLE PATTERN DOTS-346 +0282D BRAILLE PATTERN DOTS-1346 +0282E BRAILLE PATTERN DOTS-2346 +0282F BRAILLE PATTERN DOTS-12346 +02830 BRAILLE PATTERN DOTS-56 +02831 BRAILLE PATTERN DOTS-156 +02832 BRAILLE PATTERN DOTS-256 +02833 BRAILLE PATTERN DOTS-1256 +02834 BRAILLE PATTERN DOTS-356 +02835 BRAILLE PATTERN DOTS-1356 +02836 BRAILLE PATTERN DOTS-2356 +02837 BRAILLE PATTERN DOTS-12356 +02838 BRAILLE PATTERN DOTS-456 +02839 BRAILLE PATTERN DOTS-1456 +0283A BRAILLE PATTERN DOTS-2456 +0283B BRAILLE PATTERN DOTS-12456 +0283C BRAILLE PATTERN DOTS-3456 +0283D BRAILLE PATTERN DOTS-13456 +0283E BRAILLE PATTERN DOTS-23456 +0283F BRAILLE PATTERN DOTS-123456 +02840 BRAILLE PATTERN DOTS-7 +02841 BRAILLE PATTERN DOTS-17 +02842 BRAILLE PATTERN DOTS-27 +02843 BRAILLE PATTERN DOTS-127 +02844 BRAILLE PATTERN DOTS-37 +02845 BRAILLE PATTERN DOTS-137 +02846 BRAILLE PATTERN DOTS-237 +02847 BRAILLE PATTERN DOTS-1237 +02848 BRAILLE PATTERN DOTS-47 +02849 BRAILLE PATTERN DOTS-147 +0284A BRAILLE PATTERN DOTS-247 +0284B BRAILLE PATTERN DOTS-1247 +0284C BRAILLE PATTERN DOTS-347 +0284D BRAILLE PATTERN DOTS-1347 +0284E BRAILLE PATTERN DOTS-2347 +0284F BRAILLE PATTERN DOTS-12347 +02850 BRAILLE PATTERN DOTS-57 +02851 BRAILLE PATTERN DOTS-157 +02852 BRAILLE PATTERN DOTS-257 +02853 BRAILLE PATTERN DOTS-1257 +02854 BRAILLE PATTERN DOTS-357 +02855 BRAILLE PATTERN DOTS-1357 +02856 BRAILLE PATTERN DOTS-2357 +02857 BRAILLE PATTERN DOTS-12357 +02858 BRAILLE PATTERN DOTS-457 +02859 BRAILLE PATTERN DOTS-1457 +0285A BRAILLE PATTERN DOTS-2457 +0285B BRAILLE PATTERN DOTS-12457 +0285C BRAILLE PATTERN DOTS-3457 +0285D BRAILLE PATTERN DOTS-13457 +0285E BRAILLE PATTERN DOTS-23457 +0285F BRAILLE PATTERN DOTS-123457 +02860 BRAILLE PATTERN DOTS-67 +02861 BRAILLE PATTERN DOTS-167 +02862 BRAILLE PATTERN DOTS-267 +02863 BRAILLE PATTERN DOTS-1267 +02864 BRAILLE PATTERN DOTS-367 +02865 BRAILLE PATTERN DOTS-1367 +02866 BRAILLE PATTERN DOTS-2367 +02867 BRAILLE PATTERN DOTS-12367 +02868 BRAILLE PATTERN DOTS-467 +02869 BRAILLE PATTERN DOTS-1467 +0286A BRAILLE PATTERN DOTS-2467 +0286B BRAILLE PATTERN DOTS-12467 +0286C BRAILLE PATTERN DOTS-3467 +0286D BRAILLE PATTERN DOTS-13467 +0286E BRAILLE PATTERN DOTS-23467 +0286F BRAILLE PATTERN DOTS-123467 +02870 BRAILLE PATTERN DOTS-567 +02871 BRAILLE PATTERN DOTS-1567 +02872 BRAILLE PATTERN DOTS-2567 +02873 BRAILLE PATTERN DOTS-12567 +02874 BRAILLE PATTERN DOTS-3567 +02875 BRAILLE PATTERN DOTS-13567 +02876 BRAILLE PATTERN DOTS-23567 +02877 BRAILLE PATTERN DOTS-123567 +02878 BRAILLE PATTERN DOTS-4567 +02879 BRAILLE PATTERN DOTS-14567 +0287A BRAILLE PATTERN DOTS-24567 +0287B BRAILLE PATTERN DOTS-124567 +0287C BRAILLE PATTERN DOTS-34567 +0287D BRAILLE PATTERN DOTS-134567 +0287E BRAILLE PATTERN DOTS-234567 +0287F BRAILLE PATTERN DOTS-1234567 +02880 BRAILLE PATTERN DOTS-8 +02881 BRAILLE PATTERN DOTS-18 +02882 BRAILLE PATTERN DOTS-28 +02883 BRAILLE PATTERN DOTS-128 +02884 BRAILLE PATTERN DOTS-38 +02885 BRAILLE PATTERN DOTS-138 +02886 BRAILLE PATTERN DOTS-238 +02887 BRAILLE PATTERN DOTS-1238 +02888 BRAILLE PATTERN DOTS-48 +02889 BRAILLE PATTERN DOTS-148 +0288A BRAILLE PATTERN DOTS-248 +0288B BRAILLE PATTERN DOTS-1248 +0288C BRAILLE PATTERN DOTS-348 +0288D BRAILLE PATTERN DOTS-1348 +0288E BRAILLE PATTERN DOTS-2348 +0288F BRAILLE PATTERN DOTS-12348 +02890 BRAILLE PATTERN DOTS-58 +02891 BRAILLE PATTERN DOTS-158 +02892 BRAILLE PATTERN DOTS-258 +02893 BRAILLE PATTERN DOTS-1258 +02894 BRAILLE PATTERN DOTS-358 +02895 BRAILLE PATTERN DOTS-1358 +02896 BRAILLE PATTERN DOTS-2358 +02897 BRAILLE PATTERN DOTS-12358 +02898 BRAILLE PATTERN DOTS-458 +02899 BRAILLE PATTERN DOTS-1458 +0289A BRAILLE PATTERN DOTS-2458 +0289B BRAILLE PATTERN DOTS-12458 +0289C BRAILLE PATTERN DOTS-3458 +0289D BRAILLE PATTERN DOTS-13458 +0289E BRAILLE PATTERN DOTS-23458 +0289F BRAILLE PATTERN DOTS-123458 +028A0 BRAILLE PATTERN DOTS-68 +028A1 BRAILLE PATTERN DOTS-168 +028A2 BRAILLE PATTERN DOTS-268 +028A3 BRAILLE PATTERN DOTS-1268 +028A4 BRAILLE PATTERN DOTS-368 +028A5 BRAILLE PATTERN DOTS-1368 +028A6 BRAILLE PATTERN DOTS-2368 +028A7 BRAILLE PATTERN DOTS-12368 +028A8 BRAILLE PATTERN DOTS-468 +028A9 BRAILLE PATTERN DOTS-1468 +028AA BRAILLE PATTERN DOTS-2468 +028AB BRAILLE PATTERN DOTS-12468 +028AC BRAILLE PATTERN DOTS-3468 +028AD BRAILLE PATTERN DOTS-13468 +028AE BRAILLE PATTERN DOTS-23468 +028AF BRAILLE PATTERN DOTS-123468 +028B0 BRAILLE PATTERN DOTS-568 +028B1 BRAILLE PATTERN DOTS-1568 +028B2 BRAILLE PATTERN DOTS-2568 +028B3 BRAILLE PATTERN DOTS-12568 +028B4 BRAILLE PATTERN DOTS-3568 +028B5 BRAILLE PATTERN DOTS-13568 +028B6 BRAILLE PATTERN DOTS-23568 +028B7 BRAILLE PATTERN DOTS-123568 +028B8 BRAILLE PATTERN DOTS-4568 +028B9 BRAILLE PATTERN DOTS-14568 +028BA BRAILLE PATTERN DOTS-24568 +028BB BRAILLE PATTERN DOTS-124568 +028BC BRAILLE PATTERN DOTS-34568 +028BD BRAILLE PATTERN DOTS-134568 +028BE BRAILLE PATTERN DOTS-234568 +028BF BRAILLE PATTERN DOTS-1234568 +028C0 BRAILLE PATTERN DOTS-78 +028C1 BRAILLE PATTERN DOTS-178 +028C2 BRAILLE PATTERN DOTS-278 +028C3 BRAILLE PATTERN DOTS-1278 +028C4 BRAILLE PATTERN DOTS-378 +028C5 BRAILLE PATTERN DOTS-1378 +028C6 BRAILLE PATTERN DOTS-2378 +028C7 BRAILLE PATTERN DOTS-12378 +028C8 BRAILLE PATTERN DOTS-478 +028C9 BRAILLE PATTERN DOTS-1478 +028CA BRAILLE PATTERN DOTS-2478 +028CB BRAILLE PATTERN DOTS-12478 +028CC BRAILLE PATTERN DOTS-3478 +028CD BRAILLE PATTERN DOTS-13478 +028CE BRAILLE PATTERN DOTS-23478 +028CF BRAILLE PATTERN DOTS-123478 +028D0 BRAILLE PATTERN DOTS-578 +028D1 BRAILLE PATTERN DOTS-1578 +028D2 BRAILLE PATTERN DOTS-2578 +028D3 BRAILLE PATTERN DOTS-12578 +028D4 BRAILLE PATTERN DOTS-3578 +028D5 BRAILLE PATTERN DOTS-13578 +028D6 BRAILLE PATTERN DOTS-23578 +028D7 BRAILLE PATTERN DOTS-123578 +028D8 BRAILLE PATTERN DOTS-4578 +028D9 BRAILLE PATTERN DOTS-14578 +028DA BRAILLE PATTERN DOTS-24578 +028DB BRAILLE PATTERN DOTS-124578 +028DC BRAILLE PATTERN DOTS-34578 +028DD BRAILLE PATTERN DOTS-134578 +028DE BRAILLE PATTERN DOTS-234578 +028DF BRAILLE PATTERN DOTS-1234578 +028E0 BRAILLE PATTERN DOTS-678 +028E1 BRAILLE PATTERN DOTS-1678 +028E2 BRAILLE PATTERN DOTS-2678 +028E3 BRAILLE PATTERN DOTS-12678 +028E4 BRAILLE PATTERN DOTS-3678 +028E5 BRAILLE PATTERN DOTS-13678 +028E6 BRAILLE PATTERN DOTS-23678 +028E7 BRAILLE PATTERN DOTS-123678 +028E8 BRAILLE PATTERN DOTS-4678 +028E9 BRAILLE PATTERN DOTS-14678 +028EA BRAILLE PATTERN DOTS-24678 +028EB BRAILLE PATTERN DOTS-124678 +028EC BRAILLE PATTERN DOTS-34678 +028ED BRAILLE PATTERN DOTS-134678 +028EE BRAILLE PATTERN DOTS-234678 +028EF BRAILLE PATTERN DOTS-1234678 +028F0 BRAILLE PATTERN DOTS-5678 +028F1 BRAILLE PATTERN DOTS-15678 +028F2 BRAILLE PATTERN DOTS-25678 +028F3 BRAILLE PATTERN DOTS-125678 +028F4 BRAILLE PATTERN DOTS-35678 +028F5 BRAILLE PATTERN DOTS-135678 +028F6 BRAILLE PATTERN DOTS-235678 +028F7 BRAILLE PATTERN DOTS-1235678 +028F8 BRAILLE PATTERN DOTS-45678 +028F9 BRAILLE PATTERN DOTS-145678 +028FA BRAILLE PATTERN DOTS-245678 +028FB BRAILLE PATTERN DOTS-1245678 +028FC BRAILLE PATTERN DOTS-345678 +028FD BRAILLE PATTERN DOTS-1345678 +028FE BRAILLE PATTERN DOTS-2345678 +028FF BRAILLE PATTERN DOTS-12345678 +02900 RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +02901 RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +02902 LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE +02903 RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE +02904 LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE +02905 RIGHTWARDS TWO-HEADED ARROW FROM BAR +02906 LEFTWARDS DOUBLE ARROW FROM BAR +02907 RIGHTWARDS DOUBLE ARROW FROM BAR +02908 DOWNWARDS ARROW WITH HORIZONTAL STROKE +02909 UPWARDS ARROW WITH HORIZONTAL STROKE +0290A UPWARDS TRIPLE ARROW +0290B DOWNWARDS TRIPLE ARROW +0290C LEFTWARDS DOUBLE DASH ARROW +0290D RIGHTWARDS DOUBLE DASH ARROW +0290E LEFTWARDS TRIPLE DASH ARROW +0290F RIGHTWARDS TRIPLE DASH ARROW +02910 RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW +02911 RIGHTWARDS ARROW WITH DOTTED STEM +02912 UPWARDS ARROW TO BAR +02913 DOWNWARDS ARROW TO BAR +02914 RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +02915 RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +02916 RIGHTWARDS TWO-HEADED ARROW WITH TAIL +02917 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +02918 RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +02919 LEFTWARDS ARROW-TAIL +0291A RIGHTWARDS ARROW-TAIL +0291B LEFTWARDS DOUBLE ARROW-TAIL +0291C RIGHTWARDS DOUBLE ARROW-TAIL +0291D LEFTWARDS ARROW TO BLACK DIAMOND +0291E RIGHTWARDS ARROW TO BLACK DIAMOND +0291F LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND +02920 RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND +02921 NORTH WEST AND SOUTH EAST ARROW +02922 NORTH EAST AND SOUTH WEST ARROW +02923 NORTH WEST ARROW WITH HOOK +02924 NORTH EAST ARROW WITH HOOK +02925 SOUTH EAST ARROW WITH HOOK +02926 SOUTH WEST ARROW WITH HOOK +02927 NORTH WEST ARROW AND NORTH EAST ARROW +02928 NORTH EAST ARROW AND SOUTH EAST ARROW +02929 SOUTH EAST ARROW AND SOUTH WEST ARROW +0292A SOUTH WEST ARROW AND NORTH WEST ARROW +0292B RISING DIAGONAL CROSSING FALLING DIAGONAL +0292C FALLING DIAGONAL CROSSING RISING DIAGONAL +0292D SOUTH EAST ARROW CROSSING NORTH EAST ARROW +0292E NORTH EAST ARROW CROSSING SOUTH EAST ARROW +0292F FALLING DIAGONAL CROSSING NORTH EAST ARROW +02930 RISING DIAGONAL CROSSING SOUTH EAST ARROW +02931 NORTH EAST ARROW CROSSING NORTH WEST ARROW +02932 NORTH WEST ARROW CROSSING NORTH EAST ARROW +02933 WAVE ARROW POINTING DIRECTLY RIGHT +02934 ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS +02935 ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS +02936 ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS +02937 ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS +02938 RIGHT-SIDE ARC CLOCKWISE ARROW +02939 LEFT-SIDE ARC ANTICLOCKWISE ARROW +0293A TOP ARC ANTICLOCKWISE ARROW +0293B BOTTOM ARC ANTICLOCKWISE ARROW +0293C TOP ARC CLOCKWISE ARROW WITH MINUS +0293D TOP ARC ANTICLOCKWISE ARROW WITH PLUS +0293E LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW +0293F LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW +02940 ANTICLOCKWISE CLOSED CIRCLE ARROW +02941 CLOCKWISE CLOSED CIRCLE ARROW +02942 RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW +02943 LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW +02944 SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW +02945 RIGHTWARDS ARROW WITH PLUS BELOW +02946 LEFTWARDS ARROW WITH PLUS BELOW +02947 RIGHTWARDS ARROW THROUGH X +02948 LEFT RIGHT ARROW THROUGH SMALL CIRCLE +02949 UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE +0294A LEFT BARB UP RIGHT BARB DOWN HARPOON +0294B LEFT BARB DOWN RIGHT BARB UP HARPOON +0294C UP BARB RIGHT DOWN BARB LEFT HARPOON +0294D UP BARB LEFT DOWN BARB RIGHT HARPOON +0294E LEFT BARB UP RIGHT BARB UP HARPOON +0294F UP BARB RIGHT DOWN BARB RIGHT HARPOON +02950 LEFT BARB DOWN RIGHT BARB DOWN HARPOON +02951 UP BARB LEFT DOWN BARB LEFT HARPOON +02952 LEFTWARDS HARPOON WITH BARB UP TO BAR +02953 RIGHTWARDS HARPOON WITH BARB UP TO BAR +02954 UPWARDS HARPOON WITH BARB RIGHT TO BAR +02955 DOWNWARDS HARPOON WITH BARB RIGHT TO BAR +02956 LEFTWARDS HARPOON WITH BARB DOWN TO BAR +02957 RIGHTWARDS HARPOON WITH BARB DOWN TO BAR +02958 UPWARDS HARPOON WITH BARB LEFT TO BAR +02959 DOWNWARDS HARPOON WITH BARB LEFT TO BAR +0295A LEFTWARDS HARPOON WITH BARB UP FROM BAR +0295B RIGHTWARDS HARPOON WITH BARB UP FROM BAR +0295C UPWARDS HARPOON WITH BARB RIGHT FROM BAR +0295D DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR +0295E LEFTWARDS HARPOON WITH BARB DOWN FROM BAR +0295F RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR +02960 UPWARDS HARPOON WITH BARB LEFT FROM BAR +02961 DOWNWARDS HARPOON WITH BARB LEFT FROM BAR +02962 LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN +02963 UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +02964 RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +02965 DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +02966 LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP +02967 LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN +02968 RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP +02969 RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN +0296A LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +0296B LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +0296C RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH +0296D RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH +0296E UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT +0296F DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT +02970 RIGHT DOUBLE ARROW WITH ROUNDED HEAD +02971 EQUALS SIGN ABOVE RIGHTWARDS ARROW +02972 TILDE OPERATOR ABOVE RIGHTWARDS ARROW +02973 LEFTWARDS ARROW ABOVE TILDE OPERATOR +02974 RIGHTWARDS ARROW ABOVE TILDE OPERATOR +02975 RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO +02976 LESS-THAN ABOVE LEFTWARDS ARROW +02977 LEFTWARDS ARROW THROUGH LESS-THAN +02978 GREATER-THAN ABOVE RIGHTWARDS ARROW +02979 SUBSET ABOVE RIGHTWARDS ARROW +0297A LEFTWARDS ARROW THROUGH SUBSET +0297B SUPERSET ABOVE LEFTWARDS ARROW +0297C LEFT FISH TAIL +0297D RIGHT FISH TAIL +0297E UP FISH TAIL +0297F DOWN FISH TAIL +02980 TRIPLE VERTICAL BAR DELIMITER +02981 Z NOTATION SPOT +02982 Z NOTATION TYPE COLON +02983 LEFT WHITE CURLY BRACKET +02984 RIGHT WHITE CURLY BRACKET +02985 LEFT WHITE PARENTHESIS +02986 RIGHT WHITE PARENTHESIS +02987 Z NOTATION LEFT IMAGE BRACKET +02988 Z NOTATION RIGHT IMAGE BRACKET +02989 Z NOTATION LEFT BINDING BRACKET +0298A Z NOTATION RIGHT BINDING BRACKET +0298B LEFT SQUARE BRACKET WITH UNDERBAR +0298C RIGHT SQUARE BRACKET WITH UNDERBAR +0298D LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +0298E RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +0298F LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +02990 RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +02991 LEFT ANGLE BRACKET WITH DOT +02992 RIGHT ANGLE BRACKET WITH DOT +02993 LEFT ARC LESS-THAN BRACKET +02994 RIGHT ARC GREATER-THAN BRACKET +02995 DOUBLE LEFT ARC GREATER-THAN BRACKET +02996 DOUBLE RIGHT ARC LESS-THAN BRACKET +02997 LEFT BLACK TORTOISE SHELL BRACKET +02998 RIGHT BLACK TORTOISE SHELL BRACKET +02999 DOTTED FENCE +0299A VERTICAL ZIGZAG LINE +0299B MEASURED ANGLE OPENING LEFT +0299C RIGHT ANGLE VARIANT WITH SQUARE +0299D MEASURED RIGHT ANGLE WITH DOT +0299E ANGLE WITH S INSIDE +0299F ACUTE ANGLE +029A0 SPHERICAL ANGLE OPENING LEFT +029A1 SPHERICAL ANGLE OPENING UP +029A2 TURNED ANGLE +029A3 REVERSED ANGLE +029A4 ANGLE WITH UNDERBAR +029A5 REVERSED ANGLE WITH UNDERBAR +029A6 OBLIQUE ANGLE OPENING UP +029A7 OBLIQUE ANGLE OPENING DOWN +029A8 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT +029A9 MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT +029AA MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT +029AB MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT +029AC MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP +029AD MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP +029AE MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN +029AF MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN +029B0 REVERSED EMPTY SET +029B1 EMPTY SET WITH OVERBAR +029B2 EMPTY SET WITH SMALL CIRCLE ABOVE +029B3 EMPTY SET WITH RIGHT ARROW ABOVE +029B4 EMPTY SET WITH LEFT ARROW ABOVE +029B5 CIRCLE WITH HORIZONTAL BAR +029B6 CIRCLED VERTICAL BAR +029B7 CIRCLED PARALLEL +029B8 CIRCLED REVERSE SOLIDUS +029B9 CIRCLED PERPENDICULAR +029BA CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR +029BB CIRCLE WITH SUPERIMPOSED X +029BC CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN +029BD UP ARROW THROUGH CIRCLE +029BE CIRCLED WHITE BULLET +029BF CIRCLED BULLET +029C0 CIRCLED LESS-THAN +029C1 CIRCLED GREATER-THAN +029C2 CIRCLE WITH SMALL CIRCLE TO THE RIGHT +029C3 CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT +029C4 SQUARED RISING DIAGONAL SLASH +029C5 SQUARED FALLING DIAGONAL SLASH +029C6 SQUARED ASTERISK +029C7 SQUARED SMALL CIRCLE +029C8 SQUARED SQUARE +029C9 TWO JOINED SQUARES +029CA TRIANGLE WITH DOT ABOVE +029CB TRIANGLE WITH UNDERBAR +029CC S IN TRIANGLE +029CD TRIANGLE WITH SERIFS AT BOTTOM +029CE RIGHT TRIANGLE ABOVE LEFT TRIANGLE +029CF LEFT TRIANGLE BESIDE VERTICAL BAR +029D0 VERTICAL BAR BESIDE RIGHT TRIANGLE +029D1 BOWTIE WITH LEFT HALF BLACK +029D2 BOWTIE WITH RIGHT HALF BLACK +029D3 BLACK BOWTIE +029D4 TIMES WITH LEFT HALF BLACK +029D5 TIMES WITH RIGHT HALF BLACK +029D6 WHITE HOURGLASS +029D7 BLACK HOURGLASS +029D8 LEFT WIGGLY FENCE +029D9 RIGHT WIGGLY FENCE +029DA LEFT DOUBLE WIGGLY FENCE +029DB RIGHT DOUBLE WIGGLY FENCE +029DC INCOMPLETE INFINITY +029DD TIE OVER INFINITY +029DE INFINITY NEGATED WITH VERTICAL BAR +029DF DOUBLE-ENDED MULTIMAP +029E0 SQUARE WITH CONTOURED OUTLINE +029E1 INCREASES AS +029E2 SHUFFLE PRODUCT +029E3 EQUALS SIGN AND SLANTED PARALLEL +029E4 EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE +029E5 IDENTICAL TO AND SLANTED PARALLEL +029E6 GLEICH STARK +029E7 THERMODYNAMIC +029E8 DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK +029E9 DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK +029EA BLACK DIAMOND WITH DOWN ARROW +029EB BLACK LOZENGE +029EC WHITE CIRCLE WITH DOWN ARROW +029ED BLACK CIRCLE WITH DOWN ARROW +029EE ERROR-BARRED WHITE SQUARE +029EF ERROR-BARRED BLACK SQUARE +029F0 ERROR-BARRED WHITE DIAMOND +029F1 ERROR-BARRED BLACK DIAMOND +029F2 ERROR-BARRED WHITE CIRCLE +029F3 ERROR-BARRED BLACK CIRCLE +029F4 RULE-DELAYED +029F5 REVERSE SOLIDUS OPERATOR +029F6 SOLIDUS WITH OVERBAR +029F7 REVERSE SOLIDUS WITH HORIZONTAL STROKE +029F8 BIG SOLIDUS +029F9 BIG REVERSE SOLIDUS +029FA DOUBLE PLUS +029FB TRIPLE PLUS +029FC LEFT-POINTING CURVED ANGLE BRACKET +029FD RIGHT-POINTING CURVED ANGLE BRACKET +029FE TINY +029FF MINY +02A00 N-ARY CIRCLED DOT OPERATOR +02A01 N-ARY CIRCLED PLUS OPERATOR +02A02 N-ARY CIRCLED TIMES OPERATOR +02A03 N-ARY UNION OPERATOR WITH DOT +02A04 N-ARY UNION OPERATOR WITH PLUS +02A05 N-ARY SQUARE INTERSECTION OPERATOR +02A06 N-ARY SQUARE UNION OPERATOR +02A07 TWO LOGICAL AND OPERATOR +02A08 TWO LOGICAL OR OPERATOR +02A09 N-ARY TIMES OPERATOR +02A0A MODULO TWO SUM +02A0B SUMMATION WITH INTEGRAL +02A0C QUADRUPLE INTEGRAL OPERATOR +02A0D FINITE PART INTEGRAL +02A0E INTEGRAL WITH DOUBLE STROKE +02A0F INTEGRAL AVERAGE WITH SLASH +02A10 CIRCULATION FUNCTION +02A11 ANTICLOCKWISE INTEGRATION +02A12 LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE +02A13 LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE +02A14 LINE INTEGRATION NOT INCLUDING THE POLE +02A15 INTEGRAL AROUND A POINT OPERATOR +02A16 QUATERNION INTEGRAL OPERATOR +02A17 INTEGRAL WITH LEFTWARDS ARROW WITH HOOK +02A18 INTEGRAL WITH TIMES SIGN +02A19 INTEGRAL WITH INTERSECTION +02A1A INTEGRAL WITH UNION +02A1B INTEGRAL WITH OVERBAR +02A1C INTEGRAL WITH UNDERBAR +02A1D JOIN +02A1E LARGE LEFT TRIANGLE OPERATOR +02A1F Z NOTATION SCHEMA COMPOSITION +02A20 Z NOTATION SCHEMA PIPING +02A21 Z NOTATION SCHEMA PROJECTION +02A22 PLUS SIGN WITH SMALL CIRCLE ABOVE +02A23 PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE +02A24 PLUS SIGN WITH TILDE ABOVE +02A25 PLUS SIGN WITH DOT BELOW +02A26 PLUS SIGN WITH TILDE BELOW +02A27 PLUS SIGN WITH SUBSCRIPT TWO +02A28 PLUS SIGN WITH BLACK TRIANGLE +02A29 MINUS SIGN WITH COMMA ABOVE +02A2A MINUS SIGN WITH DOT BELOW +02A2B MINUS SIGN WITH FALLING DOTS +02A2C MINUS SIGN WITH RISING DOTS +02A2D PLUS SIGN IN LEFT HALF CIRCLE +02A2E PLUS SIGN IN RIGHT HALF CIRCLE +02A2F VECTOR OR CROSS PRODUCT +02A30 MULTIPLICATION SIGN WITH DOT ABOVE +02A31 MULTIPLICATION SIGN WITH UNDERBAR +02A32 SEMIDIRECT PRODUCT WITH BOTTOM CLOSED +02A33 SMASH PRODUCT +02A34 MULTIPLICATION SIGN IN LEFT HALF CIRCLE +02A35 MULTIPLICATION SIGN IN RIGHT HALF CIRCLE +02A36 CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT +02A37 MULTIPLICATION SIGN IN DOUBLE CIRCLE +02A38 CIRCLED DIVISION SIGN +02A39 PLUS SIGN IN TRIANGLE +02A3A MINUS SIGN IN TRIANGLE +02A3B MULTIPLICATION SIGN IN TRIANGLE +02A3C INTERIOR PRODUCT +02A3D RIGHTHAND INTERIOR PRODUCT +02A3E Z NOTATION RELATIONAL COMPOSITION +02A3F AMALGAMATION OR COPRODUCT +02A40 INTERSECTION WITH DOT +02A41 UNION WITH MINUS SIGN +02A42 UNION WITH OVERBAR +02A43 INTERSECTION WITH OVERBAR +02A44 INTERSECTION WITH LOGICAL AND +02A45 UNION WITH LOGICAL OR +02A46 UNION ABOVE INTERSECTION +02A47 INTERSECTION ABOVE UNION +02A48 UNION ABOVE BAR ABOVE INTERSECTION +02A49 INTERSECTION ABOVE BAR ABOVE UNION +02A4A UNION BESIDE AND JOINED WITH UNION +02A4B INTERSECTION BESIDE AND JOINED WITH INTERSECTION +02A4C CLOSED UNION WITH SERIFS +02A4D CLOSED INTERSECTION WITH SERIFS +02A4E DOUBLE SQUARE INTERSECTION +02A4F DOUBLE SQUARE UNION +02A50 CLOSED UNION WITH SERIFS AND SMASH PRODUCT +02A51 LOGICAL AND WITH DOT ABOVE +02A52 LOGICAL OR WITH DOT ABOVE +02A53 DOUBLE LOGICAL AND +02A54 DOUBLE LOGICAL OR +02A55 TWO INTERSECTING LOGICAL AND +02A56 TWO INTERSECTING LOGICAL OR +02A57 SLOPING LARGE OR +02A58 SLOPING LARGE AND +02A59 LOGICAL OR OVERLAPPING LOGICAL AND +02A5A LOGICAL AND WITH MIDDLE STEM +02A5B LOGICAL OR WITH MIDDLE STEM +02A5C LOGICAL AND WITH HORIZONTAL DASH +02A5D LOGICAL OR WITH HORIZONTAL DASH +02A5E LOGICAL AND WITH DOUBLE OVERBAR +02A5F LOGICAL AND WITH UNDERBAR +02A60 LOGICAL AND WITH DOUBLE UNDERBAR +02A61 SMALL VEE WITH UNDERBAR +02A62 LOGICAL OR WITH DOUBLE OVERBAR +02A63 LOGICAL OR WITH DOUBLE UNDERBAR +02A64 Z NOTATION DOMAIN ANTIRESTRICTION +02A65 Z NOTATION RANGE ANTIRESTRICTION +02A66 EQUALS SIGN WITH DOT BELOW +02A67 IDENTICAL WITH DOT ABOVE +02A68 TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE +02A69 TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE +02A6A TILDE OPERATOR WITH DOT ABOVE +02A6B TILDE OPERATOR WITH RISING DOTS +02A6C SIMILAR MINUS SIMILAR +02A6D CONGRUENT WITH DOT ABOVE +02A6E EQUALS WITH ASTERISK +02A6F ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT +02A70 APPROXIMATELY EQUAL OR EQUAL TO +02A71 EQUALS SIGN ABOVE PLUS SIGN +02A72 PLUS SIGN ABOVE EQUALS SIGN +02A73 EQUALS SIGN ABOVE TILDE OPERATOR +02A74 DOUBLE COLON EQUAL +02A75 TWO CONSECUTIVE EQUALS SIGNS +02A76 THREE CONSECUTIVE EQUALS SIGNS +02A77 EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW +02A78 EQUIVALENT WITH FOUR DOTS ABOVE +02A79 LESS-THAN WITH CIRCLE INSIDE +02A7A GREATER-THAN WITH CIRCLE INSIDE +02A7B LESS-THAN WITH QUESTION MARK ABOVE +02A7C GREATER-THAN WITH QUESTION MARK ABOVE +02A7D LESS-THAN OR SLANTED EQUAL TO +02A7E GREATER-THAN OR SLANTED EQUAL TO +02A7F LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +02A80 GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE +02A81 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +02A82 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE +02A83 LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT +02A84 GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT +02A85 LESS-THAN OR APPROXIMATE +02A86 GREATER-THAN OR APPROXIMATE +02A87 LESS-THAN AND SINGLE-LINE NOT EQUAL TO +02A88 GREATER-THAN AND SINGLE-LINE NOT EQUAL TO +02A89 LESS-THAN AND NOT APPROXIMATE +02A8A GREATER-THAN AND NOT APPROXIMATE +02A8B LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN +02A8C GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN +02A8D LESS-THAN ABOVE SIMILAR OR EQUAL +02A8E GREATER-THAN ABOVE SIMILAR OR EQUAL +02A8F LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN +02A90 GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN +02A91 LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL +02A92 GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL +02A93 LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL +02A94 GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL +02A95 SLANTED EQUAL TO OR LESS-THAN +02A96 SLANTED EQUAL TO OR GREATER-THAN +02A97 SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE +02A98 SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE +02A99 DOUBLE-LINE EQUAL TO OR LESS-THAN +02A9A DOUBLE-LINE EQUAL TO OR GREATER-THAN +02A9B DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN +02A9C DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN +02A9D SIMILAR OR LESS-THAN +02A9E SIMILAR OR GREATER-THAN +02A9F SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN +02AA0 SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN +02AA1 DOUBLE NESTED LESS-THAN +02AA2 DOUBLE NESTED GREATER-THAN +02AA3 DOUBLE NESTED LESS-THAN WITH UNDERBAR +02AA4 GREATER-THAN OVERLAPPING LESS-THAN +02AA5 GREATER-THAN BESIDE LESS-THAN +02AA6 LESS-THAN CLOSED BY CURVE +02AA7 GREATER-THAN CLOSED BY CURVE +02AA8 LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +02AA9 GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL +02AAA SMALLER THAN +02AAB LARGER THAN +02AAC SMALLER THAN OR EQUAL TO +02AAD LARGER THAN OR EQUAL TO +02AAE EQUALS SIGN WITH BUMPY ABOVE +02AAF PRECEDES ABOVE SINGLE-LINE EQUALS SIGN +02AB0 SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN +02AB1 PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO +02AB2 SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO +02AB3 PRECEDES ABOVE EQUALS SIGN +02AB4 SUCCEEDS ABOVE EQUALS SIGN +02AB5 PRECEDES ABOVE NOT EQUAL TO +02AB6 SUCCEEDS ABOVE NOT EQUAL TO +02AB7 PRECEDES ABOVE ALMOST EQUAL TO +02AB8 SUCCEEDS ABOVE ALMOST EQUAL TO +02AB9 PRECEDES ABOVE NOT ALMOST EQUAL TO +02ABA SUCCEEDS ABOVE NOT ALMOST EQUAL TO +02ABB DOUBLE PRECEDES +02ABC DOUBLE SUCCEEDS +02ABD SUBSET WITH DOT +02ABE SUPERSET WITH DOT +02ABF SUBSET WITH PLUS SIGN BELOW +02AC0 SUPERSET WITH PLUS SIGN BELOW +02AC1 SUBSET WITH MULTIPLICATION SIGN BELOW +02AC2 SUPERSET WITH MULTIPLICATION SIGN BELOW +02AC3 SUBSET OF OR EQUAL TO WITH DOT ABOVE +02AC4 SUPERSET OF OR EQUAL TO WITH DOT ABOVE +02AC5 SUBSET OF ABOVE EQUALS SIGN +02AC6 SUPERSET OF ABOVE EQUALS SIGN +02AC7 SUBSET OF ABOVE TILDE OPERATOR +02AC8 SUPERSET OF ABOVE TILDE OPERATOR +02AC9 SUBSET OF ABOVE ALMOST EQUAL TO +02ACA SUPERSET OF ABOVE ALMOST EQUAL TO +02ACB SUBSET OF ABOVE NOT EQUAL TO +02ACC SUPERSET OF ABOVE NOT EQUAL TO +02ACD SQUARE LEFT OPEN BOX OPERATOR +02ACE SQUARE RIGHT OPEN BOX OPERATOR +02ACF CLOSED SUBSET +02AD0 CLOSED SUPERSET +02AD1 CLOSED SUBSET OR EQUAL TO +02AD2 CLOSED SUPERSET OR EQUAL TO +02AD3 SUBSET ABOVE SUPERSET +02AD4 SUPERSET ABOVE SUBSET +02AD5 SUBSET ABOVE SUBSET +02AD6 SUPERSET ABOVE SUPERSET +02AD7 SUPERSET BESIDE SUBSET +02AD8 SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET +02AD9 ELEMENT OF OPENING DOWNWARDS +02ADA PITCHFORK WITH TEE TOP +02ADB TRANSVERSAL INTERSECTION +02ADC FORKING +02ADD NONFORKING +02ADE SHORT LEFT TACK +02ADF SHORT DOWN TACK +02AE0 SHORT UP TACK +02AE1 PERPENDICULAR WITH S +02AE2 VERTICAL BAR TRIPLE RIGHT TURNSTILE +02AE3 DOUBLE VERTICAL BAR LEFT TURNSTILE +02AE4 VERTICAL BAR DOUBLE LEFT TURNSTILE +02AE5 DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE +02AE6 LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL +02AE7 SHORT DOWN TACK WITH OVERBAR +02AE8 SHORT UP TACK WITH UNDERBAR +02AE9 SHORT UP TACK ABOVE SHORT DOWN TACK +02AEA DOUBLE DOWN TACK +02AEB DOUBLE UP TACK +02AEC DOUBLE STROKE NOT SIGN +02AED REVERSED DOUBLE STROKE NOT SIGN +02AEE DOES NOT DIVIDE WITH REVERSED NEGATION SLASH +02AEF VERTICAL LINE WITH CIRCLE ABOVE +02AF0 VERTICAL LINE WITH CIRCLE BELOW +02AF1 DOWN TACK WITH CIRCLE BELOW +02AF2 PARALLEL WITH HORIZONTAL STROKE +02AF3 PARALLEL WITH TILDE OPERATOR +02AF4 TRIPLE VERTICAL BAR BINARY RELATION +02AF5 TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE +02AF6 TRIPLE COLON OPERATOR +02AF7 TRIPLE NESTED LESS-THAN +02AF8 TRIPLE NESTED GREATER-THAN +02AF9 DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO +02AFA DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO +02AFB TRIPLE SOLIDUS BINARY RELATION +02AFC LARGE TRIPLE VERTICAL BAR OPERATOR +02AFD DOUBLE SOLIDUS OPERATOR +02AFE WHITE VERTICAL BAR +02AFF N-ARY WHITE VERTICAL BAR +02B00 NORTH EAST WHITE ARROW +02B01 NORTH WEST WHITE ARROW +02B02 SOUTH EAST WHITE ARROW +02B03 SOUTH WEST WHITE ARROW +02B04 LEFT RIGHT WHITE ARROW +02B05 LEFTWARDS BLACK ARROW +02B06 UPWARDS BLACK ARROW +02B07 DOWNWARDS BLACK ARROW +02B08 NORTH EAST BLACK ARROW +02B09 NORTH WEST BLACK ARROW +02B0A SOUTH EAST BLACK ARROW +02B0B SOUTH WEST BLACK ARROW +02B0C LEFT RIGHT BLACK ARROW +02B0D UP DOWN BLACK ARROW +02B0E RIGHTWARDS ARROW WITH TIP DOWNWARDS +02B0F RIGHTWARDS ARROW WITH TIP UPWARDS +02B10 LEFTWARDS ARROW WITH TIP DOWNWARDS +02B11 LEFTWARDS ARROW WITH TIP UPWARDS +02B12 SQUARE WITH TOP HALF BLACK +02B13 SQUARE WITH BOTTOM HALF BLACK +02B14 SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK +02B15 SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK +02B16 DIAMOND WITH LEFT HALF BLACK +02B17 DIAMOND WITH RIGHT HALF BLACK +02B18 DIAMOND WITH TOP HALF BLACK +02B19 DIAMOND WITH BOTTOM HALF BLACK +02B1A DOTTED SQUARE +02B1B BLACK LARGE SQUARE +02B1C WHITE LARGE SQUARE +02B1D BLACK VERY SMALL SQUARE +02B1E WHITE VERY SMALL SQUARE +02B1F BLACK PENTAGON +02B20 WHITE PENTAGON +02B21 WHITE HEXAGON +02B22 BLACK HEXAGON +02B23 HORIZONTAL BLACK HEXAGON +02B24 BLACK LARGE CIRCLE +02B25 BLACK MEDIUM DIAMOND +02B26 WHITE MEDIUM DIAMOND +02B27 BLACK MEDIUM LOZENGE +02B28 WHITE MEDIUM LOZENGE +02B29 BLACK SMALL DIAMOND +02B2A BLACK SMALL LOZENGE +02B2B WHITE SMALL LOZENGE +02B2C BLACK HORIZONTAL ELLIPSE +02B2D WHITE HORIZONTAL ELLIPSE +02B2E BLACK VERTICAL ELLIPSE +02B2F WHITE VERTICAL ELLIPSE +02B30 LEFT ARROW WITH SMALL CIRCLE +02B31 THREE LEFTWARDS ARROWS +02B32 LEFT ARROW WITH CIRCLED PLUS +02B33 LONG LEFTWARDS SQUIGGLE ARROW +02B34 LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE +02B35 LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE +02B36 LEFTWARDS TWO-HEADED ARROW FROM BAR +02B37 LEFTWARDS TWO-HEADED TRIPLE DASH ARROW +02B38 LEFTWARDS ARROW WITH DOTTED STEM +02B39 LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE +02B3A LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +02B3B LEFTWARDS TWO-HEADED ARROW WITH TAIL +02B3C LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE +02B3D LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE +02B3E LEFTWARDS ARROW THROUGH X +02B3F WAVE ARROW POINTING DIRECTLY LEFT +02B40 EQUALS SIGN ABOVE LEFTWARDS ARROW +02B41 REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW +02B42 LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +02B43 RIGHTWARDS ARROW THROUGH GREATER-THAN +02B44 RIGHTWARDS ARROW THROUGH SUPERSET +02B45 LEFTWARDS QUADRUPLE ARROW +02B46 RIGHTWARDS QUADRUPLE ARROW +02B47 REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW +02B48 RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO +02B49 TILDE OPERATOR ABOVE LEFTWARDS ARROW +02B4A LEFTWARDS ARROW ABOVE ALMOST EQUAL TO +02B4B LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +02B4C RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +02B4D DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW +02B4E SHORT SLANTED NORTH ARROW +02B4F SHORT BACKSLANTED SOUTH ARROW +02B50 WHITE MEDIUM STAR +02B51 BLACK SMALL STAR +02B52 WHITE SMALL STAR +02B53 BLACK RIGHT-POINTING PENTAGON +02B54 WHITE RIGHT-POINTING PENTAGON +02B55 HEAVY LARGE CIRCLE +02B56 HEAVY OVAL WITH OVAL INSIDE +02B57 HEAVY CIRCLE WITH CIRCLE INSIDE +02B58 HEAVY CIRCLE +02B59 HEAVY CIRCLED SALTIRE +02B5A SLANTED NORTH ARROW WITH HOOKED HEAD +02B5B BACKSLANTED SOUTH ARROW WITH HOOKED TAIL +02B5C SLANTED NORTH ARROW WITH HORIZONTAL TAIL +02B5D BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL +02B5E BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +02B5F SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST +02B60 LEFTWARDS TRIANGLE-HEADED ARROW +02B61 UPWARDS TRIANGLE-HEADED ARROW +02B62 RIGHTWARDS TRIANGLE-HEADED ARROW +02B63 DOWNWARDS TRIANGLE-HEADED ARROW +02B64 LEFT RIGHT TRIANGLE-HEADED ARROW +02B65 UP DOWN TRIANGLE-HEADED ARROW +02B66 NORTH WEST TRIANGLE-HEADED ARROW +02B67 NORTH EAST TRIANGLE-HEADED ARROW +02B68 SOUTH EAST TRIANGLE-HEADED ARROW +02B69 SOUTH WEST TRIANGLE-HEADED ARROW +02B6A LEFTWARDS TRIANGLE-HEADED DASHED ARROW +02B6B UPWARDS TRIANGLE-HEADED DASHED ARROW +02B6C RIGHTWARDS TRIANGLE-HEADED DASHED ARROW +02B6D DOWNWARDS TRIANGLE-HEADED DASHED ARROW +02B6E CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +02B6F ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW +02B70 LEFTWARDS TRIANGLE-HEADED ARROW TO BAR +02B71 UPWARDS TRIANGLE-HEADED ARROW TO BAR +02B72 RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR +02B73 DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +02B76 NORTH WEST TRIANGLE-HEADED ARROW TO BAR +02B77 NORTH EAST TRIANGLE-HEADED ARROW TO BAR +02B78 SOUTH EAST TRIANGLE-HEADED ARROW TO BAR +02B79 SOUTH WEST TRIANGLE-HEADED ARROW TO BAR +02B7A LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE +02B7A LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +02B7B UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +02B7C RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE +02B7C RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +02B7D DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE +02B7E HORIZONTAL TAB KEY +02B7F VERTICAL TAB KEY +02B80 LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW +02B81 UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW +02B82 RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW +02B83 DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW +02B84 LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS +02B85 UPWARDS TRIANGLE-HEADED PAIRED ARROWS +02B86 RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS +02B87 DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS +02B88 LEFTWARDS BLACK CIRCLED WHITE ARROW +02B89 UPWARDS BLACK CIRCLED WHITE ARROW +02B8A RIGHTWARDS BLACK CIRCLED WHITE ARROW +02B8B DOWNWARDS BLACK CIRCLED WHITE ARROW +02B8C ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW +02B8D ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW +02B8E ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW +02B8F ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW +02B90 RETURN LEFT +02B91 RETURN RIGHT +02B92 NEWLINE LEFT +02B93 NEWLINE RIGHT +02B94 FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE +02B95 RIGHTWARDS BLACK ARROW +02B98 THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD +02B99 THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD +02B9A THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD +02B9B THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD +02B9C BLACK LEFTWARDS EQUILATERAL ARROWHEAD +02B9D BLACK UPWARDS EQUILATERAL ARROWHEAD +02B9E BLACK RIGHTWARDS EQUILATERAL ARROWHEAD +02B9F BLACK DOWNWARDS EQUILATERAL ARROWHEAD +02BA0 DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +02BA1 DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +02BA2 UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS +02BA3 UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS +02BA4 LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +02BA5 RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS +02BA6 LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +02BA7 RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS +02BA8 BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW +02BA9 BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW +02BAA BLACK CURVED UPWARDS AND LEFTWARDS ARROW +02BAB BLACK CURVED UPWARDS AND RIGHTWARDS ARROW +02BAC BLACK CURVED LEFTWARDS AND UPWARDS ARROW +02BAD BLACK CURVED RIGHTWARDS AND UPWARDS ARROW +02BAE BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW +02BAF BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW +02BB0 RIBBON ARROW DOWN LEFT +02BB1 RIBBON ARROW DOWN RIGHT +02BB2 RIBBON ARROW UP LEFT +02BB3 RIBBON ARROW UP RIGHT +02BB4 RIBBON ARROW LEFT UP +02BB5 RIBBON ARROW RIGHT UP +02BB6 RIBBON ARROW LEFT DOWN +02BB7 RIBBON ARROW RIGHT DOWN +02BB8 UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR +02BB9 UP ARROWHEAD IN A RECTANGLE BOX +02BBD BALLOT BOX WITH LIGHT X +02BBE CIRCLED X +02BBF CIRCLED BOLD X +02BC0 BLACK SQUARE CENTRED +02BC1 BLACK DIAMOND CENTRED +02BC2 TURNED BLACK PENTAGON +02BC3 HORIZONTAL BLACK OCTAGON +02BC4 BLACK OCTAGON +02BC5 BLACK MEDIUM UP-POINTING TRIANGLE CENTRED +02BC6 BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED +02BC7 BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED +02BC8 BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +02BCA TOP HALF BLACK CIRCLE +02BCB BOTTOM HALF BLACK CIRCLE +02BCC LIGHT FOUR POINTED BLACK CUSP +02BCD ROTATED LIGHT FOUR POINTED BLACK CUSP +02BCE WHITE FOUR POINTED CUSP +02BCF ROTATED WHITE FOUR POINTED CUSP +02BD0 SQUARE POSITION INDICATOR +02BD1 UNCERTAINTY SIGN +02BD2 GROUP MARK +02BEC LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +02BED UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +02BEE RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +02BEF DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +02C00 GLAGOLITIC CAPITAL LETTER AZU +02C01 GLAGOLITIC CAPITAL LETTER BUKY +02C02 GLAGOLITIC CAPITAL LETTER VEDE +02C03 GLAGOLITIC CAPITAL LETTER GLAGOLI +02C04 GLAGOLITIC CAPITAL LETTER DOBRO +02C05 GLAGOLITIC CAPITAL LETTER YESTU +02C06 GLAGOLITIC CAPITAL LETTER ZHIVETE +02C07 GLAGOLITIC CAPITAL LETTER DZELO +02C08 GLAGOLITIC CAPITAL LETTER ZEMLJA +02C09 GLAGOLITIC CAPITAL LETTER IZHE +02C0A GLAGOLITIC CAPITAL LETTER INITIAL IZHE +02C0B GLAGOLITIC CAPITAL LETTER I +02C0C GLAGOLITIC CAPITAL LETTER DJERVI +02C0D GLAGOLITIC CAPITAL LETTER KAKO +02C0E GLAGOLITIC CAPITAL LETTER LJUDIJE +02C0F GLAGOLITIC CAPITAL LETTER MYSLITE +02C10 GLAGOLITIC CAPITAL LETTER NASHI +02C11 GLAGOLITIC CAPITAL LETTER ONU +02C12 GLAGOLITIC CAPITAL LETTER POKOJI +02C13 GLAGOLITIC CAPITAL LETTER RITSI +02C14 GLAGOLITIC CAPITAL LETTER SLOVO +02C15 GLAGOLITIC CAPITAL LETTER TVRIDO +02C16 GLAGOLITIC CAPITAL LETTER UKU +02C17 GLAGOLITIC CAPITAL LETTER FRITU +02C18 GLAGOLITIC CAPITAL LETTER HERU +02C19 GLAGOLITIC CAPITAL LETTER OTU +02C1A GLAGOLITIC CAPITAL LETTER PE +02C1B GLAGOLITIC CAPITAL LETTER SHTA +02C1C GLAGOLITIC CAPITAL LETTER TSI +02C1D GLAGOLITIC CAPITAL LETTER CHRIVI +02C1E GLAGOLITIC CAPITAL LETTER SHA +02C1F GLAGOLITIC CAPITAL LETTER YERU +02C20 GLAGOLITIC CAPITAL LETTER YERI +02C21 GLAGOLITIC CAPITAL LETTER YATI +02C22 GLAGOLITIC CAPITAL LETTER SPIDERY HA +02C23 GLAGOLITIC CAPITAL LETTER YU +02C24 GLAGOLITIC CAPITAL LETTER SMALL YUS +02C25 GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +02C26 GLAGOLITIC CAPITAL LETTER YO +02C27 GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +02C28 GLAGOLITIC CAPITAL LETTER BIG YUS +02C29 GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +02C2A GLAGOLITIC CAPITAL LETTER FITA +02C2B GLAGOLITIC CAPITAL LETTER IZHITSA +02C2C GLAGOLITIC CAPITAL LETTER SHTAPIC +02C2D GLAGOLITIC CAPITAL LETTER TROKUTASTI A +02C2E GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +02C30 GLAGOLITIC SMALL LETTER AZU +02C31 GLAGOLITIC SMALL LETTER BUKY +02C32 GLAGOLITIC SMALL LETTER VEDE +02C33 GLAGOLITIC SMALL LETTER GLAGOLI +02C34 GLAGOLITIC SMALL LETTER DOBRO +02C35 GLAGOLITIC SMALL LETTER YESTU +02C36 GLAGOLITIC SMALL LETTER ZHIVETE +02C37 GLAGOLITIC SMALL LETTER DZELO +02C38 GLAGOLITIC SMALL LETTER ZEMLJA +02C39 GLAGOLITIC SMALL LETTER IZHE +02C3A GLAGOLITIC SMALL LETTER INITIAL IZHE +02C3B GLAGOLITIC SMALL LETTER I +02C3C GLAGOLITIC SMALL LETTER DJERVI +02C3D GLAGOLITIC SMALL LETTER KAKO +02C3E GLAGOLITIC SMALL LETTER LJUDIJE +02C3F GLAGOLITIC SMALL LETTER MYSLITE +02C40 GLAGOLITIC SMALL LETTER NASHI +02C41 GLAGOLITIC SMALL LETTER ONU +02C42 GLAGOLITIC SMALL LETTER POKOJI +02C43 GLAGOLITIC SMALL LETTER RITSI +02C44 GLAGOLITIC SMALL LETTER SLOVO +02C45 GLAGOLITIC SMALL LETTER TVRIDO +02C46 GLAGOLITIC SMALL LETTER UKU +02C47 GLAGOLITIC SMALL LETTER FRITU +02C48 GLAGOLITIC SMALL LETTER HERU +02C49 GLAGOLITIC SMALL LETTER OTU +02C4A GLAGOLITIC SMALL LETTER PE +02C4B GLAGOLITIC SMALL LETTER SHTA +02C4C GLAGOLITIC SMALL LETTER TSI +02C4D GLAGOLITIC SMALL LETTER CHRIVI +02C4E GLAGOLITIC SMALL LETTER SHA +02C4F GLAGOLITIC SMALL LETTER YERU +02C50 GLAGOLITIC SMALL LETTER YERI +02C51 GLAGOLITIC SMALL LETTER YATI +02C52 GLAGOLITIC SMALL LETTER SPIDERY HA +02C53 GLAGOLITIC SMALL LETTER YU +02C54 GLAGOLITIC SMALL LETTER SMALL YUS +02C55 GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL +02C56 GLAGOLITIC SMALL LETTER YO +02C57 GLAGOLITIC SMALL LETTER IOTATED SMALL YUS +02C58 GLAGOLITIC SMALL LETTER BIG YUS +02C59 GLAGOLITIC SMALL LETTER IOTATED BIG YUS +02C5A GLAGOLITIC SMALL LETTER FITA +02C5B GLAGOLITIC SMALL LETTER IZHITSA +02C5C GLAGOLITIC SMALL LETTER SHTAPIC +02C5D GLAGOLITIC SMALL LETTER TROKUTASTI A +02C5E GLAGOLITIC SMALL LETTER LATINATE MYSLITE +02C60 LATIN CAPITAL LETTER L WITH DOUBLE BAR +02C61 LATIN SMALL LETTER L WITH DOUBLE BAR +02C62 LATIN CAPITAL LETTER L WITH MIDDLE TILDE +02C63 LATIN CAPITAL LETTER P WITH STROKE +02C64 LATIN CAPITAL LETTER R WITH TAIL +02C65 LATIN SMALL LETTER A WITH STROKE +02C66 LATIN SMALL LETTER T WITH DIAGONAL STROKE +02C67 LATIN CAPITAL LETTER H WITH DESCENDER +02C68 LATIN SMALL LETTER H WITH DESCENDER +02C69 LATIN CAPITAL LETTER K WITH DESCENDER +02C6A LATIN SMALL LETTER K WITH DESCENDER +02C6B LATIN CAPITAL LETTER Z WITH DESCENDER +02C6C LATIN SMALL LETTER Z WITH DESCENDER +02C6D LATIN CAPITAL LETTER ALPHA +02C6E LATIN CAPITAL LETTER M WITH HOOK +02C6F LATIN CAPITAL LETTER TURNED A +02C70 LATIN CAPITAL LETTER TURNED ALPHA +02C71 LATIN SMALL LETTER V WITH RIGHT HOOK +02C72 LATIN CAPITAL LETTER W WITH HOOK +02C73 LATIN SMALL LETTER W WITH HOOK +02C74 LATIN SMALL LETTER V WITH CURL +02C75 LATIN CAPITAL LETTER HALF H +02C76 LATIN SMALL LETTER HALF H +02C77 LATIN SMALL LETTER TAILLESS PHI +02C78 LATIN SMALL LETTER E WITH NOTCH +02C79 LATIN SMALL LETTER TURNED R WITH TAIL +02C7A LATIN SMALL LETTER O WITH LOW RING INSIDE +02C7B LATIN LETTER SMALL CAPITAL TURNED E +02C7C LATIN SUBSCRIPT SMALL LETTER J +02C7D MODIFIER LETTER CAPITAL V +02C7E LATIN CAPITAL LETTER S WITH SWASH TAIL +02C7F LATIN CAPITAL LETTER Z WITH SWASH TAIL +02C80 COPTIC CAPITAL LETTER ALFA +02C81 COPTIC SMALL LETTER ALFA +02C82 COPTIC CAPITAL LETTER VIDA +02C83 COPTIC SMALL LETTER VIDA +02C84 COPTIC CAPITAL LETTER GAMMA +02C85 COPTIC SMALL LETTER GAMMA +02C86 COPTIC CAPITAL LETTER DALDA +02C87 COPTIC SMALL LETTER DALDA +02C88 COPTIC CAPITAL LETTER EIE +02C89 COPTIC SMALL LETTER EIE +02C8A COPTIC CAPITAL LETTER SOU +02C8B COPTIC SMALL LETTER SOU +02C8C COPTIC CAPITAL LETTER ZATA +02C8D COPTIC SMALL LETTER ZATA +02C8E COPTIC CAPITAL LETTER HATE +02C8F COPTIC SMALL LETTER HATE +02C90 COPTIC CAPITAL LETTER THETHE +02C91 COPTIC SMALL LETTER THETHE +02C92 COPTIC CAPITAL LETTER IAUDA +02C93 COPTIC SMALL LETTER IAUDA +02C94 COPTIC CAPITAL LETTER KAPA +02C95 COPTIC SMALL LETTER KAPA +02C96 COPTIC CAPITAL LETTER LAULA +02C97 COPTIC SMALL LETTER LAULA +02C98 COPTIC CAPITAL LETTER MI +02C99 COPTIC SMALL LETTER MI +02C9A COPTIC CAPITAL LETTER NI +02C9B COPTIC SMALL LETTER NI +02C9C COPTIC CAPITAL LETTER KSI +02C9D COPTIC SMALL LETTER KSI +02C9E COPTIC CAPITAL LETTER O +02C9F COPTIC SMALL LETTER O +02CA0 COPTIC CAPITAL LETTER PI +02CA1 COPTIC SMALL LETTER PI +02CA2 COPTIC CAPITAL LETTER RO +02CA3 COPTIC SMALL LETTER RO +02CA4 COPTIC CAPITAL LETTER SIMA +02CA5 COPTIC SMALL LETTER SIMA +02CA6 COPTIC CAPITAL LETTER TAU +02CA7 COPTIC SMALL LETTER TAU +02CA8 COPTIC CAPITAL LETTER UA +02CA9 COPTIC SMALL LETTER UA +02CAA COPTIC CAPITAL LETTER FI +02CAB COPTIC SMALL LETTER FI +02CAC COPTIC CAPITAL LETTER KHI +02CAD COPTIC SMALL LETTER KHI +02CAE COPTIC CAPITAL LETTER PSI +02CAF COPTIC SMALL LETTER PSI +02CB0 COPTIC CAPITAL LETTER OOU +02CB1 COPTIC SMALL LETTER OOU +02CB2 COPTIC CAPITAL LETTER DIALECT-P ALEF +02CB3 COPTIC SMALL LETTER DIALECT-P ALEF +02CB4 COPTIC CAPITAL LETTER OLD COPTIC AIN +02CB5 COPTIC SMALL LETTER OLD COPTIC AIN +02CB6 COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +02CB7 COPTIC SMALL LETTER CRYPTOGRAMMIC EIE +02CB8 COPTIC CAPITAL LETTER DIALECT-P KAPA +02CB9 COPTIC SMALL LETTER DIALECT-P KAPA +02CBA COPTIC CAPITAL LETTER DIALECT-P NI +02CBB COPTIC SMALL LETTER DIALECT-P NI +02CBC COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +02CBD COPTIC SMALL LETTER CRYPTOGRAMMIC NI +02CBE COPTIC CAPITAL LETTER OLD COPTIC OOU +02CBF COPTIC SMALL LETTER OLD COPTIC OOU +02CC0 COPTIC CAPITAL LETTER SAMPI +02CC1 COPTIC SMALL LETTER SAMPI +02CC2 COPTIC CAPITAL LETTER CROSSED SHEI +02CC3 COPTIC SMALL LETTER CROSSED SHEI +02CC4 COPTIC CAPITAL LETTER OLD COPTIC SHEI +02CC5 COPTIC SMALL LETTER OLD COPTIC SHEI +02CC6 COPTIC CAPITAL LETTER OLD COPTIC ESH +02CC7 COPTIC SMALL LETTER OLD COPTIC ESH +02CC8 COPTIC CAPITAL LETTER AKHMIMIC KHEI +02CC9 COPTIC SMALL LETTER AKHMIMIC KHEI +02CCA COPTIC CAPITAL LETTER DIALECT-P HORI +02CCB COPTIC SMALL LETTER DIALECT-P HORI +02CCC COPTIC CAPITAL LETTER OLD COPTIC HORI +02CCD COPTIC SMALL LETTER OLD COPTIC HORI +02CCE COPTIC CAPITAL LETTER OLD COPTIC HA +02CCF COPTIC SMALL LETTER OLD COPTIC HA +02CD0 COPTIC CAPITAL LETTER L-SHAPED HA +02CD1 COPTIC SMALL LETTER L-SHAPED HA +02CD2 COPTIC CAPITAL LETTER OLD COPTIC HEI +02CD3 COPTIC SMALL LETTER OLD COPTIC HEI +02CD4 COPTIC CAPITAL LETTER OLD COPTIC HAT +02CD5 COPTIC SMALL LETTER OLD COPTIC HAT +02CD6 COPTIC CAPITAL LETTER OLD COPTIC GANGIA +02CD7 COPTIC SMALL LETTER OLD COPTIC GANGIA +02CD8 COPTIC CAPITAL LETTER OLD COPTIC DJA +02CD9 COPTIC SMALL LETTER OLD COPTIC DJA +02CDA COPTIC CAPITAL LETTER OLD COPTIC SHIMA +02CDB COPTIC SMALL LETTER OLD COPTIC SHIMA +02CDC COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +02CDD COPTIC SMALL LETTER OLD NUBIAN SHIMA +02CDE COPTIC CAPITAL LETTER OLD NUBIAN NGI +02CDF COPTIC SMALL LETTER OLD NUBIAN NGI +02CE0 COPTIC CAPITAL LETTER OLD NUBIAN NYI +02CE1 COPTIC SMALL LETTER OLD NUBIAN NYI +02CE2 COPTIC CAPITAL LETTER OLD NUBIAN WAU +02CE3 COPTIC SMALL LETTER OLD NUBIAN WAU +02CE4 COPTIC SYMBOL KAI +02CE5 COPTIC SYMBOL MI RO +02CE6 COPTIC SYMBOL PI RO +02CE7 COPTIC SYMBOL STAUROS +02CE8 COPTIC SYMBOL TAU RO +02CE9 COPTIC SYMBOL KHI RO +02CEA COPTIC SYMBOL SHIMA SIMA +02CEB COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +02CEC COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI +02CED COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +02CEE COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +02CEF COPTIC COMBINING NI ABOVE +02CF0 COPTIC COMBINING SPIRITUS ASPER +02CF1 COPTIC COMBINING SPIRITUS LENIS +02CF2 COPTIC CAPITAL LETTER BOHAIRIC KHEI +02CF3 COPTIC SMALL LETTER BOHAIRIC KHEI +02CF9 COPTIC OLD NUBIAN FULL STOP +02CFA COPTIC OLD NUBIAN DIRECT QUESTION MARK +02CFB COPTIC OLD NUBIAN INDIRECT QUESTION MARK +02CFC COPTIC OLD NUBIAN VERSE DIVIDER +02CFD COPTIC FRACTION ONE HALF +02CFE COPTIC FULL STOP +02CFF COPTIC MORPHOLOGICAL DIVIDER +02D00 GEORGIAN SMALL LETTER AN +02D01 GEORGIAN SMALL LETTER BAN +02D02 GEORGIAN SMALL LETTER GAN +02D03 GEORGIAN SMALL LETTER DON +02D04 GEORGIAN SMALL LETTER EN +02D05 GEORGIAN SMALL LETTER VIN +02D06 GEORGIAN SMALL LETTER ZEN +02D07 GEORGIAN SMALL LETTER TAN +02D08 GEORGIAN SMALL LETTER IN +02D09 GEORGIAN SMALL LETTER KAN +02D0A GEORGIAN SMALL LETTER LAS +02D0B GEORGIAN SMALL LETTER MAN +02D0C GEORGIAN SMALL LETTER NAR +02D0D GEORGIAN SMALL LETTER ON +02D0E GEORGIAN SMALL LETTER PAR +02D0F GEORGIAN SMALL LETTER ZHAR +02D10 GEORGIAN SMALL LETTER RAE +02D11 GEORGIAN SMALL LETTER SAN +02D12 GEORGIAN SMALL LETTER TAR +02D13 GEORGIAN SMALL LETTER UN +02D14 GEORGIAN SMALL LETTER PHAR +02D15 GEORGIAN SMALL LETTER KHAR +02D16 GEORGIAN SMALL LETTER GHAN +02D17 GEORGIAN SMALL LETTER QAR +02D18 GEORGIAN SMALL LETTER SHIN +02D19 GEORGIAN SMALL LETTER CHIN +02D1A GEORGIAN SMALL LETTER CAN +02D1B GEORGIAN SMALL LETTER JIL +02D1C GEORGIAN SMALL LETTER CIL +02D1D GEORGIAN SMALL LETTER CHAR +02D1E GEORGIAN SMALL LETTER XAN +02D1F GEORGIAN SMALL LETTER JHAN +02D20 GEORGIAN SMALL LETTER HAE +02D21 GEORGIAN SMALL LETTER HE +02D22 GEORGIAN SMALL LETTER HIE +02D23 GEORGIAN SMALL LETTER WE +02D24 GEORGIAN SMALL LETTER HAR +02D25 GEORGIAN SMALL LETTER HOE +02D27 GEORGIAN SMALL LETTER YN +02D2D GEORGIAN SMALL LETTER AEN +02D30 TIFINAGH LETTER YA +02D31 TIFINAGH LETTER YAB +02D32 TIFINAGH LETTER YABH +02D33 TIFINAGH LETTER YAG +02D34 TIFINAGH LETTER YAGHH +02D35 TIFINAGH LETTER BERBER ACADEMY YAJ +02D36 TIFINAGH LETTER YAJ +02D37 TIFINAGH LETTER YAD +02D38 TIFINAGH LETTER YADH +02D39 TIFINAGH LETTER YADD +02D3A TIFINAGH LETTER YADDH +02D3B TIFINAGH LETTER YEY +02D3C TIFINAGH LETTER YAF +02D3D TIFINAGH LETTER YAK +02D3E TIFINAGH LETTER TUAREG YAK +02D3F TIFINAGH LETTER YAKHH +02D40 TIFINAGH LETTER YAH +02D41 TIFINAGH LETTER BERBER ACADEMY YAH +02D42 TIFINAGH LETTER TUAREG YAH +02D43 TIFINAGH LETTER YAHH +02D44 TIFINAGH LETTER YAA +02D45 TIFINAGH LETTER YAKH +02D46 TIFINAGH LETTER TUAREG YAKH +02D47 TIFINAGH LETTER YAQ +02D48 TIFINAGH LETTER TUAREG YAQ +02D49 TIFINAGH LETTER YI +02D4A TIFINAGH LETTER YAZH +02D4B TIFINAGH LETTER AHAGGAR YAZH +02D4C TIFINAGH LETTER TUAREG YAZH +02D4D TIFINAGH LETTER YAL +02D4E TIFINAGH LETTER YAM +02D4F TIFINAGH LETTER YAN +02D50 TIFINAGH LETTER TUAREG YAGN +02D51 TIFINAGH LETTER TUAREG YANG +02D52 TIFINAGH LETTER YAP +02D53 TIFINAGH LETTER YU +02D54 TIFINAGH LETTER YAR +02D55 TIFINAGH LETTER YARR +02D56 TIFINAGH LETTER YAGH +02D57 TIFINAGH LETTER TUAREG YAGH +02D58 TIFINAGH LETTER AYER YAGH +02D59 TIFINAGH LETTER YAS +02D5A TIFINAGH LETTER YASS +02D5B TIFINAGH LETTER YASH +02D5C TIFINAGH LETTER YAT +02D5D TIFINAGH LETTER YATH +02D5E TIFINAGH LETTER YACH +02D5F TIFINAGH LETTER YATT +02D60 TIFINAGH LETTER YAV +02D61 TIFINAGH LETTER YAW +02D62 TIFINAGH LETTER YAY +02D63 TIFINAGH LETTER YAZ +02D64 TIFINAGH LETTER TAWELLEMET YAZ +02D65 TIFINAGH LETTER YAZZ +02D66 TIFINAGH LETTER YE +02D67 TIFINAGH LETTER YO +02D6F TIFINAGH MODIFIER LETTER LABIALIZATION MARK +02D70 TIFINAGH SEPARATOR MARK +02D7F TIFINAGH CONSONANT JOINER +02D80 ETHIOPIC SYLLABLE LOA +02D81 ETHIOPIC SYLLABLE MOA +02D82 ETHIOPIC SYLLABLE ROA +02D83 ETHIOPIC SYLLABLE SOA +02D84 ETHIOPIC SYLLABLE SHOA +02D85 ETHIOPIC SYLLABLE BOA +02D86 ETHIOPIC SYLLABLE TOA +02D87 ETHIOPIC SYLLABLE COA +02D88 ETHIOPIC SYLLABLE NOA +02D89 ETHIOPIC SYLLABLE NYOA +02D8A ETHIOPIC SYLLABLE GLOTTAL OA +02D8B ETHIOPIC SYLLABLE ZOA +02D8C ETHIOPIC SYLLABLE DOA +02D8D ETHIOPIC SYLLABLE DDOA +02D8E ETHIOPIC SYLLABLE JOA +02D8F ETHIOPIC SYLLABLE THOA +02D90 ETHIOPIC SYLLABLE CHOA +02D91 ETHIOPIC SYLLABLE PHOA +02D92 ETHIOPIC SYLLABLE POA +02D93 ETHIOPIC SYLLABLE GGWA +02D94 ETHIOPIC SYLLABLE GGWI +02D95 ETHIOPIC SYLLABLE GGWEE +02D96 ETHIOPIC SYLLABLE GGWE +02DA0 ETHIOPIC SYLLABLE SSA +02DA1 ETHIOPIC SYLLABLE SSU +02DA2 ETHIOPIC SYLLABLE SSI +02DA3 ETHIOPIC SYLLABLE SSAA +02DA4 ETHIOPIC SYLLABLE SSEE +02DA5 ETHIOPIC SYLLABLE SSE +02DA6 ETHIOPIC SYLLABLE SSO +02DA8 ETHIOPIC SYLLABLE CCA +02DA9 ETHIOPIC SYLLABLE CCU +02DAA ETHIOPIC SYLLABLE CCI +02DAB ETHIOPIC SYLLABLE CCAA +02DAC ETHIOPIC SYLLABLE CCEE +02DAD ETHIOPIC SYLLABLE CCE +02DAE ETHIOPIC SYLLABLE CCO +02DB0 ETHIOPIC SYLLABLE ZZA +02DB1 ETHIOPIC SYLLABLE ZZU +02DB2 ETHIOPIC SYLLABLE ZZI +02DB3 ETHIOPIC SYLLABLE ZZAA +02DB4 ETHIOPIC SYLLABLE ZZEE +02DB5 ETHIOPIC SYLLABLE ZZE +02DB6 ETHIOPIC SYLLABLE ZZO +02DB8 ETHIOPIC SYLLABLE CCHA +02DB9 ETHIOPIC SYLLABLE CCHU +02DBA ETHIOPIC SYLLABLE CCHI +02DBB ETHIOPIC SYLLABLE CCHAA +02DBC ETHIOPIC SYLLABLE CCHEE +02DBD ETHIOPIC SYLLABLE CCHE +02DBE ETHIOPIC SYLLABLE CCHO +02DC0 ETHIOPIC SYLLABLE QYA +02DC1 ETHIOPIC SYLLABLE QYU +02DC2 ETHIOPIC SYLLABLE QYI +02DC3 ETHIOPIC SYLLABLE QYAA +02DC4 ETHIOPIC SYLLABLE QYEE +02DC5 ETHIOPIC SYLLABLE QYE +02DC6 ETHIOPIC SYLLABLE QYO +02DC8 ETHIOPIC SYLLABLE KYA +02DC9 ETHIOPIC SYLLABLE KYU +02DCA ETHIOPIC SYLLABLE KYI +02DCB ETHIOPIC SYLLABLE KYAA +02DCC ETHIOPIC SYLLABLE KYEE +02DCD ETHIOPIC SYLLABLE KYE +02DCE ETHIOPIC SYLLABLE KYO +02DD0 ETHIOPIC SYLLABLE XYA +02DD1 ETHIOPIC SYLLABLE XYU +02DD2 ETHIOPIC SYLLABLE XYI +02DD3 ETHIOPIC SYLLABLE XYAA +02DD4 ETHIOPIC SYLLABLE XYEE +02DD5 ETHIOPIC SYLLABLE XYE +02DD6 ETHIOPIC SYLLABLE XYO +02DD8 ETHIOPIC SYLLABLE GYA +02DD9 ETHIOPIC SYLLABLE GYU +02DDA ETHIOPIC SYLLABLE GYI +02DDB ETHIOPIC SYLLABLE GYAA +02DDC ETHIOPIC SYLLABLE GYEE +02DDD ETHIOPIC SYLLABLE GYE +02DDE ETHIOPIC SYLLABLE GYO +02DE0 COMBINING CYRILLIC LETTER BE +02DE1 COMBINING CYRILLIC LETTER VE +02DE2 COMBINING CYRILLIC LETTER GHE +02DE3 COMBINING CYRILLIC LETTER DE +02DE4 COMBINING CYRILLIC LETTER ZHE +02DE5 COMBINING CYRILLIC LETTER ZE +02DE6 COMBINING CYRILLIC LETTER KA +02DE7 COMBINING CYRILLIC LETTER EL +02DE8 COMBINING CYRILLIC LETTER EM +02DE9 COMBINING CYRILLIC LETTER EN +02DEA COMBINING CYRILLIC LETTER O +02DEB COMBINING CYRILLIC LETTER PE +02DEC COMBINING CYRILLIC LETTER ER +02DED COMBINING CYRILLIC LETTER ES +02DEE COMBINING CYRILLIC LETTER TE +02DEF COMBINING CYRILLIC LETTER HA +02DF0 COMBINING CYRILLIC LETTER TSE +02DF1 COMBINING CYRILLIC LETTER CHE +02DF2 COMBINING CYRILLIC LETTER SHA +02DF3 COMBINING CYRILLIC LETTER SHCHA +02DF4 COMBINING CYRILLIC LETTER FITA +02DF5 COMBINING CYRILLIC LETTER ES-TE +02DF6 COMBINING CYRILLIC LETTER A +02DF7 COMBINING CYRILLIC LETTER IE +02DF8 COMBINING CYRILLIC LETTER DJERV +02DF9 COMBINING CYRILLIC LETTER MONOGRAPH UK +02DFA COMBINING CYRILLIC LETTER YAT +02DFB COMBINING CYRILLIC LETTER YU +02DFC COMBINING CYRILLIC LETTER IOTIFIED A +02DFD COMBINING CYRILLIC LETTER LITTLE YUS +02DFE COMBINING CYRILLIC LETTER BIG YUS +02DFF COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +02E00 RIGHT ANGLE SUBSTITUTION MARKER +02E01 RIGHT ANGLE DOTTED SUBSTITUTION MARKER +02E02 LEFT SUBSTITUTION BRACKET +02E03 RIGHT SUBSTITUTION BRACKET +02E04 LEFT DOTTED SUBSTITUTION BRACKET +02E05 RIGHT DOTTED SUBSTITUTION BRACKET +02E06 RAISED INTERPOLATION MARKER +02E07 RAISED DOTTED INTERPOLATION MARKER +02E08 DOTTED TRANSPOSITION MARKER +02E09 LEFT TRANSPOSITION BRACKET +02E0A RIGHT TRANSPOSITION BRACKET +02E0B RAISED SQUARE +02E0C LEFT RAISED OMISSION BRACKET +02E0D RIGHT RAISED OMISSION BRACKET +02E0E EDITORIAL CORONIS +02E0F PARAGRAPHOS +02E10 FORKED PARAGRAPHOS +02E11 REVERSED FORKED PARAGRAPHOS +02E12 HYPODIASTOLE +02E13 DOTTED OBELOS +02E14 DOWNWARDS ANCORA +02E15 UPWARDS ANCORA +02E16 DOTTED RIGHT-POINTING ANGLE +02E17 DOUBLE OBLIQUE HYPHEN +02E18 INVERTED INTERROBANG +02E19 PALM BRANCH +02E1A HYPHEN WITH DIAERESIS +02E1B TILDE WITH RING ABOVE +02E1C LEFT LOW PARAPHRASE BRACKET +02E1D RIGHT LOW PARAPHRASE BRACKET +02E1E TILDE WITH DOT ABOVE +02E1F TILDE WITH DOT BELOW +02E20 LEFT VERTICAL BAR WITH QUILL +02E21 RIGHT VERTICAL BAR WITH QUILL +02E22 TOP LEFT HALF BRACKET +02E23 TOP RIGHT HALF BRACKET +02E24 BOTTOM LEFT HALF BRACKET +02E25 BOTTOM RIGHT HALF BRACKET +02E26 LEFT SIDEWAYS U BRACKET +02E27 RIGHT SIDEWAYS U BRACKET +02E28 LEFT DOUBLE PARENTHESIS +02E29 RIGHT DOUBLE PARENTHESIS +02E2A TWO DOTS OVER ONE DOT PUNCTUATION +02E2B ONE DOT OVER TWO DOTS PUNCTUATION +02E2C SQUARED FOUR DOT PUNCTUATION +02E2D FIVE DOT MARK +02E2E REVERSED QUESTION MARK +02E2F VERTICAL TILDE +02E30 RING POINT +02E31 WORD SEPARATOR MIDDLE DOT +02E32 TURNED COMMA +02E33 RAISED DOT +02E34 RAISED COMMA +02E35 TURNED SEMICOLON +02E36 DAGGER WITH LEFT GUARD +02E37 DAGGER WITH RIGHT GUARD +02E38 TURNED DAGGER +02E39 TOP HALF SECTION SIGN +02E3A TWO-EM DASH +02E3B THREE-EM DASH +02E3C STENOGRAPHIC FULL STOP +02E3D VERTICAL SIX DOTS +02E3E WIGGLY VERTICAL LINE +02E3F CAPITULUM +02E40 DOUBLE HYPHEN +02E41 REVERSED COMMA +02E42 DOUBLE LOW-REVERSED-9 QUOTATION MARK +02E43 DASH WITH LEFT UPTURN +02E44 DOUBLE SUSPENSION MARK +02E45 INVERTED LOW KAVYKA +02E46 INVERTED LOW KAVYKA WITH KAVYKA ABOVE +02E47 LOW KAVYKA +02E48 LOW KAVYKA WITH DOT +02E49 DOUBLE STACKED COMMA +02E80 CJK RADICAL REPEAT +02E81 CJK RADICAL CLIFF +02E82 CJK RADICAL SECOND ONE +02E83 CJK RADICAL SECOND TWO +02E84 CJK RADICAL SECOND THREE +02E85 CJK RADICAL PERSON +02E86 CJK RADICAL BOX +02E87 CJK RADICAL TABLE +02E88 CJK RADICAL KNIFE ONE +02E89 CJK RADICAL KNIFE TWO +02E8A CJK RADICAL DIVINATION +02E8B CJK RADICAL SEAL +02E8C CJK RADICAL SMALL ONE +02E8D CJK RADICAL SMALL TWO +02E8E CJK RADICAL LAME ONE +02E8F CJK RADICAL LAME TWO +02E90 CJK RADICAL LAME THREE +02E91 CJK RADICAL LAME FOUR +02E92 CJK RADICAL SNAKE +02E93 CJK RADICAL THREAD +02E94 CJK RADICAL SNOUT ONE +02E95 CJK RADICAL SNOUT TWO +02E96 CJK RADICAL HEART ONE +02E97 CJK RADICAL HEART TWO +02E98 CJK RADICAL HAND +02E99 CJK RADICAL RAP +02E9B CJK RADICAL CHOKE +02E9C CJK RADICAL SUN +02E9D CJK RADICAL MOON +02E9E CJK RADICAL DEATH +02E9F CJK RADICAL MOTHER +02EA0 CJK RADICAL CIVILIAN +02EA1 CJK RADICAL WATER ONE +02EA2 CJK RADICAL WATER TWO +02EA3 CJK RADICAL FIRE +02EA4 CJK RADICAL PAW ONE +02EA5 CJK RADICAL PAW TWO +02EA6 CJK RADICAL SIMPLIFIED HALF TREE TRUNK +02EA7 CJK RADICAL COW +02EA8 CJK RADICAL DOG +02EA9 CJK RADICAL JADE +02EAA CJK RADICAL BOLT OF CLOTH +02EAB CJK RADICAL EYE +02EAC CJK RADICAL SPIRIT ONE +02EAD CJK RADICAL SPIRIT TWO +02EAE CJK RADICAL BAMBOO +02EAF CJK RADICAL SILK +02EB0 CJK RADICAL C-SIMPLIFIED SILK +02EB1 CJK RADICAL NET ONE +02EB2 CJK RADICAL NET TWO +02EB3 CJK RADICAL NET THREE +02EB4 CJK RADICAL NET FOUR +02EB5 CJK RADICAL MESH +02EB6 CJK RADICAL SHEEP +02EB7 CJK RADICAL RAM +02EB8 CJK RADICAL EWE +02EB9 CJK RADICAL OLD +02EBA CJK RADICAL BRUSH ONE +02EBB CJK RADICAL BRUSH TWO +02EBC CJK RADICAL MEAT +02EBD CJK RADICAL MORTAR +02EBE CJK RADICAL GRASS ONE +02EBF CJK RADICAL GRASS TWO +02EC0 CJK RADICAL GRASS THREE +02EC1 CJK RADICAL TIGER +02EC2 CJK RADICAL CLOTHES +02EC3 CJK RADICAL WEST ONE +02EC4 CJK RADICAL WEST TWO +02EC5 CJK RADICAL C-SIMPLIFIED SEE +02EC6 CJK RADICAL SIMPLIFIED HORN +02EC7 CJK RADICAL HORN +02EC8 CJK RADICAL C-SIMPLIFIED SPEECH +02EC9 CJK RADICAL C-SIMPLIFIED SHELL +02ECA CJK RADICAL FOOT +02ECB CJK RADICAL C-SIMPLIFIED CART +02ECC CJK RADICAL SIMPLIFIED WALK +02ECD CJK RADICAL WALK ONE +02ECE CJK RADICAL WALK TWO +02ECF CJK RADICAL CITY +02ED0 CJK RADICAL C-SIMPLIFIED GOLD +02ED1 CJK RADICAL LONG ONE +02ED2 CJK RADICAL LONG TWO +02ED3 CJK RADICAL C-SIMPLIFIED LONG +02ED4 CJK RADICAL C-SIMPLIFIED GATE +02ED5 CJK RADICAL MOUND ONE +02ED6 CJK RADICAL MOUND TWO +02ED7 CJK RADICAL RAIN +02ED8 CJK RADICAL BLUE +02ED9 CJK RADICAL C-SIMPLIFIED TANNED LEATHER +02EDA CJK RADICAL C-SIMPLIFIED LEAF +02EDB CJK RADICAL C-SIMPLIFIED WIND +02EDC CJK RADICAL C-SIMPLIFIED FLY +02EDD CJK RADICAL EAT ONE +02EDE CJK RADICAL EAT TWO +02EDF CJK RADICAL EAT THREE +02EE0 CJK RADICAL C-SIMPLIFIED EAT +02EE1 CJK RADICAL HEAD +02EE2 CJK RADICAL C-SIMPLIFIED HORSE +02EE3 CJK RADICAL BONE +02EE4 CJK RADICAL GHOST +02EE5 CJK RADICAL C-SIMPLIFIED FISH +02EE6 CJK RADICAL C-SIMPLIFIED BIRD +02EE7 CJK RADICAL C-SIMPLIFIED SALT +02EE8 CJK RADICAL SIMPLIFIED WHEAT +02EE9 CJK RADICAL SIMPLIFIED YELLOW +02EEA CJK RADICAL C-SIMPLIFIED FROG +02EEB CJK RADICAL J-SIMPLIFIED EVEN +02EEC CJK RADICAL C-SIMPLIFIED EVEN +02EED CJK RADICAL J-SIMPLIFIED TOOTH +02EEE CJK RADICAL C-SIMPLIFIED TOOTH +02EEF CJK RADICAL J-SIMPLIFIED DRAGON +02EF0 CJK RADICAL C-SIMPLIFIED DRAGON +02EF1 CJK RADICAL TURTLE +02EF2 CJK RADICAL J-SIMPLIFIED TURTLE +02EF3 CJK RADICAL C-SIMPLIFIED TURTLE +02F00 KANGXI RADICAL ONE +02F01 KANGXI RADICAL LINE +02F02 KANGXI RADICAL DOT +02F03 KANGXI RADICAL SLASH +02F04 KANGXI RADICAL SECOND +02F05 KANGXI RADICAL HOOK +02F06 KANGXI RADICAL TWO +02F07 KANGXI RADICAL LID +02F08 KANGXI RADICAL MAN +02F09 KANGXI RADICAL LEGS +02F0A KANGXI RADICAL ENTER +02F0B KANGXI RADICAL EIGHT +02F0C KANGXI RADICAL DOWN BOX +02F0D KANGXI RADICAL COVER +02F0E KANGXI RADICAL ICE +02F0F KANGXI RADICAL TABLE +02F10 KANGXI RADICAL OPEN BOX +02F11 KANGXI RADICAL KNIFE +02F12 KANGXI RADICAL POWER +02F13 KANGXI RADICAL WRAP +02F14 KANGXI RADICAL SPOON +02F15 KANGXI RADICAL RIGHT OPEN BOX +02F16 KANGXI RADICAL HIDING ENCLOSURE +02F17 KANGXI RADICAL TEN +02F18 KANGXI RADICAL DIVINATION +02F19 KANGXI RADICAL SEAL +02F1A KANGXI RADICAL CLIFF +02F1B KANGXI RADICAL PRIVATE +02F1C KANGXI RADICAL AGAIN +02F1D KANGXI RADICAL MOUTH +02F1E KANGXI RADICAL ENCLOSURE +02F1F KANGXI RADICAL EARTH +02F20 KANGXI RADICAL SCHOLAR +02F21 KANGXI RADICAL GO +02F22 KANGXI RADICAL GO SLOWLY +02F23 KANGXI RADICAL EVENING +02F24 KANGXI RADICAL BIG +02F25 KANGXI RADICAL WOMAN +02F26 KANGXI RADICAL CHILD +02F27 KANGXI RADICAL ROOF +02F28 KANGXI RADICAL INCH +02F29 KANGXI RADICAL SMALL +02F2A KANGXI RADICAL LAME +02F2B KANGXI RADICAL CORPSE +02F2C KANGXI RADICAL SPROUT +02F2D KANGXI RADICAL MOUNTAIN +02F2E KANGXI RADICAL RIVER +02F2F KANGXI RADICAL WORK +02F30 KANGXI RADICAL ONESELF +02F31 KANGXI RADICAL TURBAN +02F32 KANGXI RADICAL DRY +02F33 KANGXI RADICAL SHORT THREAD +02F34 KANGXI RADICAL DOTTED CLIFF +02F35 KANGXI RADICAL LONG STRIDE +02F36 KANGXI RADICAL TWO HANDS +02F37 KANGXI RADICAL SHOOT +02F38 KANGXI RADICAL BOW +02F39 KANGXI RADICAL SNOUT +02F3A KANGXI RADICAL BRISTLE +02F3B KANGXI RADICAL STEP +02F3C KANGXI RADICAL HEART +02F3D KANGXI RADICAL HALBERD +02F3E KANGXI RADICAL DOOR +02F3F KANGXI RADICAL HAND +02F40 KANGXI RADICAL BRANCH +02F41 KANGXI RADICAL RAP +02F42 KANGXI RADICAL SCRIPT +02F43 KANGXI RADICAL DIPPER +02F44 KANGXI RADICAL AXE +02F45 KANGXI RADICAL SQUARE +02F46 KANGXI RADICAL NOT +02F47 KANGXI RADICAL SUN +02F48 KANGXI RADICAL SAY +02F49 KANGXI RADICAL MOON +02F4A KANGXI RADICAL TREE +02F4B KANGXI RADICAL LACK +02F4C KANGXI RADICAL STOP +02F4D KANGXI RADICAL DEATH +02F4E KANGXI RADICAL WEAPON +02F4F KANGXI RADICAL DO NOT +02F50 KANGXI RADICAL COMPARE +02F51 KANGXI RADICAL FUR +02F52 KANGXI RADICAL CLAN +02F53 KANGXI RADICAL STEAM +02F54 KANGXI RADICAL WATER +02F55 KANGXI RADICAL FIRE +02F56 KANGXI RADICAL CLAW +02F57 KANGXI RADICAL FATHER +02F58 KANGXI RADICAL DOUBLE X +02F59 KANGXI RADICAL HALF TREE TRUNK +02F5A KANGXI RADICAL SLICE +02F5B KANGXI RADICAL FANG +02F5C KANGXI RADICAL COW +02F5D KANGXI RADICAL DOG +02F5E KANGXI RADICAL PROFOUND +02F5F KANGXI RADICAL JADE +02F60 KANGXI RADICAL MELON +02F61 KANGXI RADICAL TILE +02F62 KANGXI RADICAL SWEET +02F63 KANGXI RADICAL LIFE +02F64 KANGXI RADICAL USE +02F65 KANGXI RADICAL FIELD +02F66 KANGXI RADICAL BOLT OF CLOTH +02F67 KANGXI RADICAL SICKNESS +02F68 KANGXI RADICAL DOTTED TENT +02F69 KANGXI RADICAL WHITE +02F6A KANGXI RADICAL SKIN +02F6B KANGXI RADICAL DISH +02F6C KANGXI RADICAL EYE +02F6D KANGXI RADICAL SPEAR +02F6E KANGXI RADICAL ARROW +02F6F KANGXI RADICAL STONE +02F70 KANGXI RADICAL SPIRIT +02F71 KANGXI RADICAL TRACK +02F72 KANGXI RADICAL GRAIN +02F73 KANGXI RADICAL CAVE +02F74 KANGXI RADICAL STAND +02F75 KANGXI RADICAL BAMBOO +02F76 KANGXI RADICAL RICE +02F77 KANGXI RADICAL SILK +02F78 KANGXI RADICAL JAR +02F79 KANGXI RADICAL NET +02F7A KANGXI RADICAL SHEEP +02F7B KANGXI RADICAL FEATHER +02F7C KANGXI RADICAL OLD +02F7D KANGXI RADICAL AND +02F7E KANGXI RADICAL PLOW +02F7F KANGXI RADICAL EAR +02F80 KANGXI RADICAL BRUSH +02F81 KANGXI RADICAL MEAT +02F82 KANGXI RADICAL MINISTER +02F83 KANGXI RADICAL SELF +02F84 KANGXI RADICAL ARRIVE +02F85 KANGXI RADICAL MORTAR +02F86 KANGXI RADICAL TONGUE +02F87 KANGXI RADICAL OPPOSE +02F88 KANGXI RADICAL BOAT +02F89 KANGXI RADICAL STOPPING +02F8A KANGXI RADICAL COLOR +02F8B KANGXI RADICAL GRASS +02F8C KANGXI RADICAL TIGER +02F8D KANGXI RADICAL INSECT +02F8E KANGXI RADICAL BLOOD +02F8F KANGXI RADICAL WALK ENCLOSURE +02F90 KANGXI RADICAL CLOTHES +02F91 KANGXI RADICAL WEST +02F92 KANGXI RADICAL SEE +02F93 KANGXI RADICAL HORN +02F94 KANGXI RADICAL SPEECH +02F95 KANGXI RADICAL VALLEY +02F96 KANGXI RADICAL BEAN +02F97 KANGXI RADICAL PIG +02F98 KANGXI RADICAL BADGER +02F99 KANGXI RADICAL SHELL +02F9A KANGXI RADICAL RED +02F9B KANGXI RADICAL RUN +02F9C KANGXI RADICAL FOOT +02F9D KANGXI RADICAL BODY +02F9E KANGXI RADICAL CART +02F9F KANGXI RADICAL BITTER +02FA0 KANGXI RADICAL MORNING +02FA1 KANGXI RADICAL WALK +02FA2 KANGXI RADICAL CITY +02FA3 KANGXI RADICAL WINE +02FA4 KANGXI RADICAL DISTINGUISH +02FA5 KANGXI RADICAL VILLAGE +02FA6 KANGXI RADICAL GOLD +02FA7 KANGXI RADICAL LONG +02FA8 KANGXI RADICAL GATE +02FA9 KANGXI RADICAL MOUND +02FAA KANGXI RADICAL SLAVE +02FAB KANGXI RADICAL SHORT TAILED BIRD +02FAC KANGXI RADICAL RAIN +02FAD KANGXI RADICAL BLUE +02FAE KANGXI RADICAL WRONG +02FAF KANGXI RADICAL FACE +02FB0 KANGXI RADICAL LEATHER +02FB1 KANGXI RADICAL TANNED LEATHER +02FB2 KANGXI RADICAL LEEK +02FB3 KANGXI RADICAL SOUND +02FB4 KANGXI RADICAL LEAF +02FB5 KANGXI RADICAL WIND +02FB6 KANGXI RADICAL FLY +02FB7 KANGXI RADICAL EAT +02FB8 KANGXI RADICAL HEAD +02FB9 KANGXI RADICAL FRAGRANT +02FBA KANGXI RADICAL HORSE +02FBB KANGXI RADICAL BONE +02FBC KANGXI RADICAL TALL +02FBD KANGXI RADICAL HAIR +02FBE KANGXI RADICAL FIGHT +02FBF KANGXI RADICAL SACRIFICIAL WINE +02FC0 KANGXI RADICAL CAULDRON +02FC1 KANGXI RADICAL GHOST +02FC2 KANGXI RADICAL FISH +02FC3 KANGXI RADICAL BIRD +02FC4 KANGXI RADICAL SALT +02FC5 KANGXI RADICAL DEER +02FC6 KANGXI RADICAL WHEAT +02FC7 KANGXI RADICAL HEMP +02FC8 KANGXI RADICAL YELLOW +02FC9 KANGXI RADICAL MILLET +02FCA KANGXI RADICAL BLACK +02FCB KANGXI RADICAL EMBROIDERY +02FCC KANGXI RADICAL FROG +02FCD KANGXI RADICAL TRIPOD +02FCE KANGXI RADICAL DRUM +02FCF KANGXI RADICAL RAT +02FD0 KANGXI RADICAL NOSE +02FD1 KANGXI RADICAL EVEN +02FD2 KANGXI RADICAL TOOTH +02FD3 KANGXI RADICAL DRAGON +02FD4 KANGXI RADICAL TURTLE +02FD5 KANGXI RADICAL FLUTE +02FF0 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT +02FF1 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW +02FF2 IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT +02FF3 IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW +02FF4 IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND +02FF5 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE +02FF6 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW +02FF7 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT +02FF8 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT +02FF9 IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT +02FFA IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT +02FFB IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID +03000 IDEOGRAPHIC SPACE +03001 IDEOGRAPHIC COMMA +03002 IDEOGRAPHIC FULL STOP +03003 DITTO MARK +03004 JAPANESE INDUSTRIAL STANDARD SYMBOL +03005 IDEOGRAPHIC ITERATION MARK +03006 IDEOGRAPHIC CLOSING MARK +03007 IDEOGRAPHIC NUMBER ZERO +03008 LEFT ANGLE BRACKET +03009 RIGHT ANGLE BRACKET +0300A LEFT DOUBLE ANGLE BRACKET +0300B RIGHT DOUBLE ANGLE BRACKET +0300C LEFT CORNER BRACKET +0300D RIGHT CORNER BRACKET +0300E LEFT WHITE CORNER BRACKET +0300F RIGHT WHITE CORNER BRACKET +03010 LEFT BLACK LENTICULAR BRACKET +03011 RIGHT BLACK LENTICULAR BRACKET +03012 POSTAL MARK +03013 GETA MARK +03014 LEFT TORTOISE SHELL BRACKET +03015 RIGHT TORTOISE SHELL BRACKET +03016 LEFT WHITE LENTICULAR BRACKET +03017 RIGHT WHITE LENTICULAR BRACKET +03018 LEFT WHITE TORTOISE SHELL BRACKET +03019 RIGHT WHITE TORTOISE SHELL BRACKET +0301A LEFT WHITE SQUARE BRACKET +0301B RIGHT WHITE SQUARE BRACKET +0301C WAVE DASH +0301D REVERSED DOUBLE PRIME QUOTATION MARK +0301E DOUBLE PRIME QUOTATION MARK +0301F LOW DOUBLE PRIME QUOTATION MARK +03020 POSTAL MARK FACE +03021 HANGZHOU NUMERAL ONE +03022 HANGZHOU NUMERAL TWO +03023 HANGZHOU NUMERAL THREE +03024 HANGZHOU NUMERAL FOUR +03025 HANGZHOU NUMERAL FIVE +03026 HANGZHOU NUMERAL SIX +03027 HANGZHOU NUMERAL SEVEN +03028 HANGZHOU NUMERAL EIGHT +03029 HANGZHOU NUMERAL NINE +0302A IDEOGRAPHIC LEVEL TONE MARK +0302B IDEOGRAPHIC RISING TONE MARK +0302C IDEOGRAPHIC DEPARTING TONE MARK +0302D IDEOGRAPHIC ENTERING TONE MARK +0302E HANGUL SINGLE DOT TONE MARK +0302F HANGUL DOUBLE DOT TONE MARK +03030 WAVY DASH +03031 VERTICAL KANA REPEAT MARK +03032 VERTICAL KANA REPEAT WITH VOICED SOUND MARK +03033 VERTICAL KANA REPEAT MARK UPPER HALF +03034 VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +03035 VERTICAL KANA REPEAT MARK LOWER HALF +03036 CIRCLED POSTAL MARK +03037 IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +03038 HANGZHOU NUMERAL TEN +03039 HANGZHOU NUMERAL TWENTY +0303A HANGZHOU NUMERAL THIRTY +0303B VERTICAL IDEOGRAPHIC ITERATION MARK +0303C MASU MARK +0303D PART ALTERNATION MARK +0303E IDEOGRAPHIC VARIATION INDICATOR +0303F IDEOGRAPHIC HALF FILL SPACE +03041 HIRAGANA LETTER SMALL A +03042 HIRAGANA LETTER A +03043 HIRAGANA LETTER SMALL I +03044 HIRAGANA LETTER I +03045 HIRAGANA LETTER SMALL U +03046 HIRAGANA LETTER U +03047 HIRAGANA LETTER SMALL E +03048 HIRAGANA LETTER E +03049 HIRAGANA LETTER SMALL O +0304A HIRAGANA LETTER O +0304B HIRAGANA LETTER KA +0304C HIRAGANA LETTER GA +0304D HIRAGANA LETTER KI +0304E HIRAGANA LETTER GI +0304F HIRAGANA LETTER KU +03050 HIRAGANA LETTER GU +03051 HIRAGANA LETTER KE +03052 HIRAGANA LETTER GE +03053 HIRAGANA LETTER KO +03054 HIRAGANA LETTER GO +03055 HIRAGANA LETTER SA +03056 HIRAGANA LETTER ZA +03057 HIRAGANA LETTER SI +03058 HIRAGANA LETTER ZI +03059 HIRAGANA LETTER SU +0305A HIRAGANA LETTER ZU +0305B HIRAGANA LETTER SE +0305C HIRAGANA LETTER ZE +0305D HIRAGANA LETTER SO +0305E HIRAGANA LETTER ZO +0305F HIRAGANA LETTER TA +03060 HIRAGANA LETTER DA +03061 HIRAGANA LETTER TI +03062 HIRAGANA LETTER DI +03063 HIRAGANA LETTER SMALL TU +03064 HIRAGANA LETTER TU +03065 HIRAGANA LETTER DU +03066 HIRAGANA LETTER TE +03067 HIRAGANA LETTER DE +03068 HIRAGANA LETTER TO +03069 HIRAGANA LETTER DO +0306A HIRAGANA LETTER NA +0306B HIRAGANA LETTER NI +0306C HIRAGANA LETTER NU +0306D HIRAGANA LETTER NE +0306E HIRAGANA LETTER NO +0306F HIRAGANA LETTER HA +03070 HIRAGANA LETTER BA +03071 HIRAGANA LETTER PA +03072 HIRAGANA LETTER HI +03073 HIRAGANA LETTER BI +03074 HIRAGANA LETTER PI +03075 HIRAGANA LETTER HU +03076 HIRAGANA LETTER BU +03077 HIRAGANA LETTER PU +03078 HIRAGANA LETTER HE +03079 HIRAGANA LETTER BE +0307A HIRAGANA LETTER PE +0307B HIRAGANA LETTER HO +0307C HIRAGANA LETTER BO +0307D HIRAGANA LETTER PO +0307E HIRAGANA LETTER MA +0307F HIRAGANA LETTER MI +03080 HIRAGANA LETTER MU +03081 HIRAGANA LETTER ME +03082 HIRAGANA LETTER MO +03083 HIRAGANA LETTER SMALL YA +03084 HIRAGANA LETTER YA +03085 HIRAGANA LETTER SMALL YU +03086 HIRAGANA LETTER YU +03087 HIRAGANA LETTER SMALL YO +03088 HIRAGANA LETTER YO +03089 HIRAGANA LETTER RA +0308A HIRAGANA LETTER RI +0308B HIRAGANA LETTER RU +0308C HIRAGANA LETTER RE +0308D HIRAGANA LETTER RO +0308E HIRAGANA LETTER SMALL WA +0308F HIRAGANA LETTER WA +03090 HIRAGANA LETTER WI +03091 HIRAGANA LETTER WE +03092 HIRAGANA LETTER WO +03093 HIRAGANA LETTER N +03094 HIRAGANA LETTER VU +03095 HIRAGANA LETTER SMALL KA +03096 HIRAGANA LETTER SMALL KE +03099 COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK +0309A COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0309B KATAKANA-HIRAGANA VOICED SOUND MARK +0309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0309D HIRAGANA ITERATION MARK +0309E HIRAGANA VOICED ITERATION MARK +0309F HIRAGANA DIGRAPH YORI +030A0 KATAKANA-HIRAGANA DOUBLE HYPHEN +030A1 KATAKANA LETTER SMALL A +030A2 KATAKANA LETTER A +030A3 KATAKANA LETTER SMALL I +030A4 KATAKANA LETTER I +030A5 KATAKANA LETTER SMALL U +030A6 KATAKANA LETTER U +030A7 KATAKANA LETTER SMALL E +030A8 KATAKANA LETTER E +030A9 KATAKANA LETTER SMALL O +030AA KATAKANA LETTER O +030AB KATAKANA LETTER KA +030AC KATAKANA LETTER GA +030AD KATAKANA LETTER KI +030AE KATAKANA LETTER GI +030AF KATAKANA LETTER KU +030B0 KATAKANA LETTER GU +030B1 KATAKANA LETTER KE +030B2 KATAKANA LETTER GE +030B3 KATAKANA LETTER KO +030B4 KATAKANA LETTER GO +030B5 KATAKANA LETTER SA +030B6 KATAKANA LETTER ZA +030B7 KATAKANA LETTER SI +030B8 KATAKANA LETTER ZI +030B9 KATAKANA LETTER SU +030BA KATAKANA LETTER ZU +030BB KATAKANA LETTER SE +030BC KATAKANA LETTER ZE +030BD KATAKANA LETTER SO +030BE KATAKANA LETTER ZO +030BF KATAKANA LETTER TA +030C0 KATAKANA LETTER DA +030C1 KATAKANA LETTER TI +030C2 KATAKANA LETTER DI +030C3 KATAKANA LETTER SMALL TU +030C4 KATAKANA LETTER TU +030C5 KATAKANA LETTER DU +030C6 KATAKANA LETTER TE +030C7 KATAKANA LETTER DE +030C8 KATAKANA LETTER TO +030C9 KATAKANA LETTER DO +030CA KATAKANA LETTER NA +030CB KATAKANA LETTER NI +030CC KATAKANA LETTER NU +030CD KATAKANA LETTER NE +030CE KATAKANA LETTER NO +030CF KATAKANA LETTER HA +030D0 KATAKANA LETTER BA +030D1 KATAKANA LETTER PA +030D2 KATAKANA LETTER HI +030D3 KATAKANA LETTER BI +030D4 KATAKANA LETTER PI +030D5 KATAKANA LETTER HU +030D6 KATAKANA LETTER BU +030D7 KATAKANA LETTER PU +030D8 KATAKANA LETTER HE +030D9 KATAKANA LETTER BE +030DA KATAKANA LETTER PE +030DB KATAKANA LETTER HO +030DC KATAKANA LETTER BO +030DD KATAKANA LETTER PO +030DE KATAKANA LETTER MA +030DF KATAKANA LETTER MI +030E0 KATAKANA LETTER MU +030E1 KATAKANA LETTER ME +030E2 KATAKANA LETTER MO +030E3 KATAKANA LETTER SMALL YA +030E4 KATAKANA LETTER YA +030E5 KATAKANA LETTER SMALL YU +030E6 KATAKANA LETTER YU +030E7 KATAKANA LETTER SMALL YO +030E8 KATAKANA LETTER YO +030E9 KATAKANA LETTER RA +030EA KATAKANA LETTER RI +030EB KATAKANA LETTER RU +030EC KATAKANA LETTER RE +030ED KATAKANA LETTER RO +030EE KATAKANA LETTER SMALL WA +030EF KATAKANA LETTER WA +030F0 KATAKANA LETTER WI +030F1 KATAKANA LETTER WE +030F2 KATAKANA LETTER WO +030F3 KATAKANA LETTER N +030F4 KATAKANA LETTER VU +030F5 KATAKANA LETTER SMALL KA +030F6 KATAKANA LETTER SMALL KE +030F7 KATAKANA LETTER VA +030F8 KATAKANA LETTER VI +030F9 KATAKANA LETTER VE +030FA KATAKANA LETTER VO +030FB KATAKANA MIDDLE DOT +030FC KATAKANA-HIRAGANA PROLONGED SOUND MARK +030FD KATAKANA ITERATION MARK +030FE KATAKANA VOICED ITERATION MARK +030FF KATAKANA DIGRAPH KOTO +03105 BOPOMOFO LETTER B +03106 BOPOMOFO LETTER P +03107 BOPOMOFO LETTER M +03108 BOPOMOFO LETTER F +03109 BOPOMOFO LETTER D +0310A BOPOMOFO LETTER T +0310B BOPOMOFO LETTER N +0310C BOPOMOFO LETTER L +0310D BOPOMOFO LETTER G +0310E BOPOMOFO LETTER K +0310F BOPOMOFO LETTER H +03110 BOPOMOFO LETTER J +03111 BOPOMOFO LETTER Q +03112 BOPOMOFO LETTER X +03113 BOPOMOFO LETTER ZH +03114 BOPOMOFO LETTER CH +03115 BOPOMOFO LETTER SH +03116 BOPOMOFO LETTER R +03117 BOPOMOFO LETTER Z +03118 BOPOMOFO LETTER C +03119 BOPOMOFO LETTER S +0311A BOPOMOFO LETTER A +0311B BOPOMOFO LETTER O +0311C BOPOMOFO LETTER E +0311D BOPOMOFO LETTER EH +0311E BOPOMOFO LETTER AI +0311F BOPOMOFO LETTER EI +03120 BOPOMOFO LETTER AU +03121 BOPOMOFO LETTER OU +03122 BOPOMOFO LETTER AN +03123 BOPOMOFO LETTER EN +03124 BOPOMOFO LETTER ANG +03125 BOPOMOFO LETTER ENG +03126 BOPOMOFO LETTER ER +03127 BOPOMOFO LETTER I +03128 BOPOMOFO LETTER U +03129 BOPOMOFO LETTER IU +0312A BOPOMOFO LETTER V +0312B BOPOMOFO LETTER NG +0312C BOPOMOFO LETTER GN +0312D BOPOMOFO LETTER IH +0312E BOPOMOFO LETTER O WITH DOT ABOVE +03131 HANGUL LETTER KIYEOK +03132 HANGUL LETTER SSANGKIYEOK +03133 HANGUL LETTER KIYEOK-SIOS +03134 HANGUL LETTER NIEUN +03135 HANGUL LETTER NIEUN-CIEUC +03136 HANGUL LETTER NIEUN-HIEUH +03137 HANGUL LETTER TIKEUT +03138 HANGUL LETTER SSANGTIKEUT +03139 HANGUL LETTER RIEUL +0313A HANGUL LETTER RIEUL-KIYEOK +0313B HANGUL LETTER RIEUL-MIEUM +0313C HANGUL LETTER RIEUL-PIEUP +0313D HANGUL LETTER RIEUL-SIOS +0313E HANGUL LETTER RIEUL-THIEUTH +0313F HANGUL LETTER RIEUL-PHIEUPH +03140 HANGUL LETTER RIEUL-HIEUH +03141 HANGUL LETTER MIEUM +03142 HANGUL LETTER PIEUP +03143 HANGUL LETTER SSANGPIEUP +03144 HANGUL LETTER PIEUP-SIOS +03145 HANGUL LETTER SIOS +03146 HANGUL LETTER SSANGSIOS +03147 HANGUL LETTER IEUNG +03148 HANGUL LETTER CIEUC +03149 HANGUL LETTER SSANGCIEUC +0314A HANGUL LETTER CHIEUCH +0314B HANGUL LETTER KHIEUKH +0314C HANGUL LETTER THIEUTH +0314D HANGUL LETTER PHIEUPH +0314E HANGUL LETTER HIEUH +0314F HANGUL LETTER A +03150 HANGUL LETTER AE +03151 HANGUL LETTER YA +03152 HANGUL LETTER YAE +03153 HANGUL LETTER EO +03154 HANGUL LETTER E +03155 HANGUL LETTER YEO +03156 HANGUL LETTER YE +03157 HANGUL LETTER O +03158 HANGUL LETTER WA +03159 HANGUL LETTER WAE +0315A HANGUL LETTER OE +0315B HANGUL LETTER YO +0315C HANGUL LETTER U +0315D HANGUL LETTER WEO +0315E HANGUL LETTER WE +0315F HANGUL LETTER WI +03160 HANGUL LETTER YU +03161 HANGUL LETTER EU +03162 HANGUL LETTER YI +03163 HANGUL LETTER I +03164 HANGUL FILLER +03165 HANGUL LETTER SSANGNIEUN +03166 HANGUL LETTER NIEUN-TIKEUT +03167 HANGUL LETTER NIEUN-SIOS +03168 HANGUL LETTER NIEUN-PANSIOS +03169 HANGUL LETTER RIEUL-KIYEOK-SIOS +0316A HANGUL LETTER RIEUL-TIKEUT +0316B HANGUL LETTER RIEUL-PIEUP-SIOS +0316C HANGUL LETTER RIEUL-PANSIOS +0316D HANGUL LETTER RIEUL-YEORINHIEUH +0316E HANGUL LETTER MIEUM-PIEUP +0316F HANGUL LETTER MIEUM-SIOS +03170 HANGUL LETTER MIEUM-PANSIOS +03171 HANGUL LETTER KAPYEOUNMIEUM +03172 HANGUL LETTER PIEUP-KIYEOK +03173 HANGUL LETTER PIEUP-TIKEUT +03174 HANGUL LETTER PIEUP-SIOS-KIYEOK +03175 HANGUL LETTER PIEUP-SIOS-TIKEUT +03176 HANGUL LETTER PIEUP-CIEUC +03177 HANGUL LETTER PIEUP-THIEUTH +03178 HANGUL LETTER KAPYEOUNPIEUP +03179 HANGUL LETTER KAPYEOUNSSANGPIEUP +0317A HANGUL LETTER SIOS-KIYEOK +0317B HANGUL LETTER SIOS-NIEUN +0317C HANGUL LETTER SIOS-TIKEUT +0317D HANGUL LETTER SIOS-PIEUP +0317E HANGUL LETTER SIOS-CIEUC +0317F HANGUL LETTER PANSIOS +03180 HANGUL LETTER SSANGIEUNG +03181 HANGUL LETTER YESIEUNG +03182 HANGUL LETTER YESIEUNG-SIOS +03183 HANGUL LETTER YESIEUNG-PANSIOS +03184 HANGUL LETTER KAPYEOUNPHIEUPH +03185 HANGUL LETTER SSANGHIEUH +03186 HANGUL LETTER YEORINHIEUH +03187 HANGUL LETTER YO-YA +03188 HANGUL LETTER YO-YAE +03189 HANGUL LETTER YO-I +0318A HANGUL LETTER YU-YEO +0318B HANGUL LETTER YU-YE +0318C HANGUL LETTER YU-I +0318D HANGUL LETTER ARAEA +0318E HANGUL LETTER ARAEAE +03190 IDEOGRAPHIC ANNOTATION LINKING MARK +03191 IDEOGRAPHIC ANNOTATION REVERSE MARK +03192 IDEOGRAPHIC ANNOTATION ONE MARK +03193 IDEOGRAPHIC ANNOTATION TWO MARK +03194 IDEOGRAPHIC ANNOTATION THREE MARK +03195 IDEOGRAPHIC ANNOTATION FOUR MARK +03196 IDEOGRAPHIC ANNOTATION TOP MARK +03197 IDEOGRAPHIC ANNOTATION MIDDLE MARK +03198 IDEOGRAPHIC ANNOTATION BOTTOM MARK +03199 IDEOGRAPHIC ANNOTATION FIRST MARK +0319A IDEOGRAPHIC ANNOTATION SECOND MARK +0319B IDEOGRAPHIC ANNOTATION THIRD MARK +0319C IDEOGRAPHIC ANNOTATION FOURTH MARK +0319D IDEOGRAPHIC ANNOTATION HEAVEN MARK +0319E IDEOGRAPHIC ANNOTATION EARTH MARK +0319F IDEOGRAPHIC ANNOTATION MAN MARK +031A0 BOPOMOFO LETTER BU +031A1 BOPOMOFO LETTER ZI +031A2 BOPOMOFO LETTER JI +031A3 BOPOMOFO LETTER GU +031A4 BOPOMOFO LETTER EE +031A5 BOPOMOFO LETTER ENN +031A6 BOPOMOFO LETTER OO +031A7 BOPOMOFO LETTER ONN +031A8 BOPOMOFO LETTER IR +031A9 BOPOMOFO LETTER ANN +031AA BOPOMOFO LETTER INN +031AB BOPOMOFO LETTER UNN +031AC BOPOMOFO LETTER IM +031AD BOPOMOFO LETTER NGG +031AE BOPOMOFO LETTER AINN +031AF BOPOMOFO LETTER AUNN +031B0 BOPOMOFO LETTER AM +031B1 BOPOMOFO LETTER OM +031B2 BOPOMOFO LETTER ONG +031B3 BOPOMOFO LETTER INNN +031B4 BOPOMOFO FINAL LETTER P +031B5 BOPOMOFO FINAL LETTER T +031B6 BOPOMOFO FINAL LETTER K +031B7 BOPOMOFO FINAL LETTER H +031B8 BOPOMOFO LETTER GH +031B9 BOPOMOFO LETTER LH +031BA BOPOMOFO LETTER ZY +031C0 CJK STROKE T +031C1 CJK STROKE WG +031C2 CJK STROKE XG +031C3 CJK STROKE BXG +031C4 CJK STROKE SW +031C5 CJK STROKE HZZ +031C6 CJK STROKE HZG +031C7 CJK STROKE HP +031C8 CJK STROKE HZWG +031C9 CJK STROKE SZWG +031CA CJK STROKE HZT +031CB CJK STROKE HZZP +031CC CJK STROKE HPWG +031CD CJK STROKE HZW +031CE CJK STROKE HZZZ +031CF CJK STROKE N +031D0 CJK STROKE H +031D1 CJK STROKE S +031D2 CJK STROKE P +031D3 CJK STROKE SP +031D4 CJK STROKE D +031D5 CJK STROKE HZ +031D6 CJK STROKE HG +031D7 CJK STROKE SZ +031D8 CJK STROKE SWZ +031D9 CJK STROKE ST +031DA CJK STROKE SG +031DB CJK STROKE PD +031DC CJK STROKE PZ +031DD CJK STROKE TN +031DE CJK STROKE SZZ +031DF CJK STROKE SWG +031E0 CJK STROKE HXWG +031E1 CJK STROKE HZZZG +031E2 CJK STROKE PG +031E3 CJK STROKE Q +031F0 KATAKANA LETTER SMALL KU +031F1 KATAKANA LETTER SMALL SI +031F2 KATAKANA LETTER SMALL SU +031F3 KATAKANA LETTER SMALL TO +031F4 KATAKANA LETTER SMALL NU +031F5 KATAKANA LETTER SMALL HA +031F6 KATAKANA LETTER SMALL HI +031F7 KATAKANA LETTER SMALL HU +031F8 KATAKANA LETTER SMALL HE +031F9 KATAKANA LETTER SMALL HO +031FA KATAKANA LETTER SMALL MU +031FB KATAKANA LETTER SMALL RA +031FC KATAKANA LETTER SMALL RI +031FD KATAKANA LETTER SMALL RU +031FE KATAKANA LETTER SMALL RE +031FF KATAKANA LETTER SMALL RO +03200 PARENTHESIZED HANGUL KIYEOK +03201 PARENTHESIZED HANGUL NIEUN +03202 PARENTHESIZED HANGUL TIKEUT +03203 PARENTHESIZED HANGUL RIEUL +03204 PARENTHESIZED HANGUL MIEUM +03205 PARENTHESIZED HANGUL PIEUP +03206 PARENTHESIZED HANGUL SIOS +03207 PARENTHESIZED HANGUL IEUNG +03208 PARENTHESIZED HANGUL CIEUC +03209 PARENTHESIZED HANGUL CHIEUCH +0320A PARENTHESIZED HANGUL KHIEUKH +0320B PARENTHESIZED HANGUL THIEUTH +0320C PARENTHESIZED HANGUL PHIEUPH +0320D PARENTHESIZED HANGUL HIEUH +0320E PARENTHESIZED HANGUL KIYEOK A +0320F PARENTHESIZED HANGUL NIEUN A +03210 PARENTHESIZED HANGUL TIKEUT A +03211 PARENTHESIZED HANGUL RIEUL A +03212 PARENTHESIZED HANGUL MIEUM A +03213 PARENTHESIZED HANGUL PIEUP A +03214 PARENTHESIZED HANGUL SIOS A +03215 PARENTHESIZED HANGUL IEUNG A +03216 PARENTHESIZED HANGUL CIEUC A +03217 PARENTHESIZED HANGUL CHIEUCH A +03218 PARENTHESIZED HANGUL KHIEUKH A +03219 PARENTHESIZED HANGUL THIEUTH A +0321A PARENTHESIZED HANGUL PHIEUPH A +0321B PARENTHESIZED HANGUL HIEUH A +0321C PARENTHESIZED HANGUL CIEUC U +0321D PARENTHESIZED KOREAN CHARACTER OJEON +0321E PARENTHESIZED KOREAN CHARACTER O HU +03220 PARENTHESIZED IDEOGRAPH ONE +03221 PARENTHESIZED IDEOGRAPH TWO +03222 PARENTHESIZED IDEOGRAPH THREE +03223 PARENTHESIZED IDEOGRAPH FOUR +03224 PARENTHESIZED IDEOGRAPH FIVE +03225 PARENTHESIZED IDEOGRAPH SIX +03226 PARENTHESIZED IDEOGRAPH SEVEN +03227 PARENTHESIZED IDEOGRAPH EIGHT +03228 PARENTHESIZED IDEOGRAPH NINE +03229 PARENTHESIZED IDEOGRAPH TEN +0322A PARENTHESIZED IDEOGRAPH MOON +0322B PARENTHESIZED IDEOGRAPH FIRE +0322C PARENTHESIZED IDEOGRAPH WATER +0322D PARENTHESIZED IDEOGRAPH WOOD +0322E PARENTHESIZED IDEOGRAPH METAL +0322F PARENTHESIZED IDEOGRAPH EARTH +03230 PARENTHESIZED IDEOGRAPH SUN +03231 PARENTHESIZED IDEOGRAPH STOCK +03232 PARENTHESIZED IDEOGRAPH HAVE +03233 PARENTHESIZED IDEOGRAPH SOCIETY +03234 PARENTHESIZED IDEOGRAPH NAME +03235 PARENTHESIZED IDEOGRAPH SPECIAL +03236 PARENTHESIZED IDEOGRAPH FINANCIAL +03237 PARENTHESIZED IDEOGRAPH CONGRATULATION +03238 PARENTHESIZED IDEOGRAPH LABOR +03239 PARENTHESIZED IDEOGRAPH REPRESENT +0323A PARENTHESIZED IDEOGRAPH CALL +0323B PARENTHESIZED IDEOGRAPH STUDY +0323C PARENTHESIZED IDEOGRAPH SUPERVISE +0323D PARENTHESIZED IDEOGRAPH ENTERPRISE +0323E PARENTHESIZED IDEOGRAPH RESOURCE +0323F PARENTHESIZED IDEOGRAPH ALLIANCE +03240 PARENTHESIZED IDEOGRAPH FESTIVAL +03241 PARENTHESIZED IDEOGRAPH REST +03242 PARENTHESIZED IDEOGRAPH SELF +03243 PARENTHESIZED IDEOGRAPH REACH +03244 CIRCLED IDEOGRAPH QUESTION +03245 CIRCLED IDEOGRAPH KINDERGARTEN +03246 CIRCLED IDEOGRAPH SCHOOL +03247 CIRCLED IDEOGRAPH KOTO +03248 CIRCLED NUMBER TEN ON BLACK SQUARE +03249 CIRCLED NUMBER TWENTY ON BLACK SQUARE +0324A CIRCLED NUMBER THIRTY ON BLACK SQUARE +0324B CIRCLED NUMBER FORTY ON BLACK SQUARE +0324C CIRCLED NUMBER FIFTY ON BLACK SQUARE +0324D CIRCLED NUMBER SIXTY ON BLACK SQUARE +0324E CIRCLED NUMBER SEVENTY ON BLACK SQUARE +0324F CIRCLED NUMBER EIGHTY ON BLACK SQUARE +03250 PARTNERSHIP SIGN +03251 CIRCLED NUMBER TWENTY ONE +03252 CIRCLED NUMBER TWENTY TWO +03253 CIRCLED NUMBER TWENTY THREE +03254 CIRCLED NUMBER TWENTY FOUR +03255 CIRCLED NUMBER TWENTY FIVE +03256 CIRCLED NUMBER TWENTY SIX +03257 CIRCLED NUMBER TWENTY SEVEN +03258 CIRCLED NUMBER TWENTY EIGHT +03259 CIRCLED NUMBER TWENTY NINE +0325A CIRCLED NUMBER THIRTY +0325B CIRCLED NUMBER THIRTY ONE +0325C CIRCLED NUMBER THIRTY TWO +0325D CIRCLED NUMBER THIRTY THREE +0325E CIRCLED NUMBER THIRTY FOUR +0325F CIRCLED NUMBER THIRTY FIVE +03260 CIRCLED HANGUL KIYEOK +03261 CIRCLED HANGUL NIEUN +03262 CIRCLED HANGUL TIKEUT +03263 CIRCLED HANGUL RIEUL +03264 CIRCLED HANGUL MIEUM +03265 CIRCLED HANGUL PIEUP +03266 CIRCLED HANGUL SIOS +03267 CIRCLED HANGUL IEUNG +03268 CIRCLED HANGUL CIEUC +03269 CIRCLED HANGUL CHIEUCH +0326A CIRCLED HANGUL KHIEUKH +0326B CIRCLED HANGUL THIEUTH +0326C CIRCLED HANGUL PHIEUPH +0326D CIRCLED HANGUL HIEUH +0326E CIRCLED HANGUL KIYEOK A +0326F CIRCLED HANGUL NIEUN A +03270 CIRCLED HANGUL TIKEUT A +03271 CIRCLED HANGUL RIEUL A +03272 CIRCLED HANGUL MIEUM A +03273 CIRCLED HANGUL PIEUP A +03274 CIRCLED HANGUL SIOS A +03275 CIRCLED HANGUL IEUNG A +03276 CIRCLED HANGUL CIEUC A +03277 CIRCLED HANGUL CHIEUCH A +03278 CIRCLED HANGUL KHIEUKH A +03279 CIRCLED HANGUL THIEUTH A +0327A CIRCLED HANGUL PHIEUPH A +0327B CIRCLED HANGUL HIEUH A +0327C CIRCLED KOREAN CHARACTER CHAMKO +0327D CIRCLED KOREAN CHARACTER JUEUI +0327E CIRCLED HANGUL IEUNG U +0327F KOREAN STANDARD SYMBOL +03280 CIRCLED IDEOGRAPH ONE +03281 CIRCLED IDEOGRAPH TWO +03282 CIRCLED IDEOGRAPH THREE +03283 CIRCLED IDEOGRAPH FOUR +03284 CIRCLED IDEOGRAPH FIVE +03285 CIRCLED IDEOGRAPH SIX +03286 CIRCLED IDEOGRAPH SEVEN +03287 CIRCLED IDEOGRAPH EIGHT +03288 CIRCLED IDEOGRAPH NINE +03289 CIRCLED IDEOGRAPH TEN +0328A CIRCLED IDEOGRAPH MOON +0328B CIRCLED IDEOGRAPH FIRE +0328C CIRCLED IDEOGRAPH WATER +0328D CIRCLED IDEOGRAPH WOOD +0328E CIRCLED IDEOGRAPH METAL +0328F CIRCLED IDEOGRAPH EARTH +03290 CIRCLED IDEOGRAPH SUN +03291 CIRCLED IDEOGRAPH STOCK +03292 CIRCLED IDEOGRAPH HAVE +03293 CIRCLED IDEOGRAPH SOCIETY +03294 CIRCLED IDEOGRAPH NAME +03295 CIRCLED IDEOGRAPH SPECIAL +03296 CIRCLED IDEOGRAPH FINANCIAL +03297 CIRCLED IDEOGRAPH CONGRATULATION +03298 CIRCLED IDEOGRAPH LABOR +03299 CIRCLED IDEOGRAPH SECRET +0329A CIRCLED IDEOGRAPH MALE +0329B CIRCLED IDEOGRAPH FEMALE +0329C CIRCLED IDEOGRAPH SUITABLE +0329D CIRCLED IDEOGRAPH EXCELLENT +0329E CIRCLED IDEOGRAPH PRINT +0329F CIRCLED IDEOGRAPH ATTENTION +032A0 CIRCLED IDEOGRAPH ITEM +032A1 CIRCLED IDEOGRAPH REST +032A2 CIRCLED IDEOGRAPH COPY +032A3 CIRCLED IDEOGRAPH CORRECT +032A4 CIRCLED IDEOGRAPH HIGH +032A5 CIRCLED IDEOGRAPH CENTRE +032A6 CIRCLED IDEOGRAPH LOW +032A7 CIRCLED IDEOGRAPH LEFT +032A8 CIRCLED IDEOGRAPH RIGHT +032A9 CIRCLED IDEOGRAPH MEDICINE +032AA CIRCLED IDEOGRAPH RELIGION +032AB CIRCLED IDEOGRAPH STUDY +032AC CIRCLED IDEOGRAPH SUPERVISE +032AD CIRCLED IDEOGRAPH ENTERPRISE +032AE CIRCLED IDEOGRAPH RESOURCE +032AF CIRCLED IDEOGRAPH ALLIANCE +032B0 CIRCLED IDEOGRAPH NIGHT +032B1 CIRCLED NUMBER THIRTY SIX +032B2 CIRCLED NUMBER THIRTY SEVEN +032B3 CIRCLED NUMBER THIRTY EIGHT +032B4 CIRCLED NUMBER THIRTY NINE +032B5 CIRCLED NUMBER FORTY +032B6 CIRCLED NUMBER FORTY ONE +032B7 CIRCLED NUMBER FORTY TWO +032B8 CIRCLED NUMBER FORTY THREE +032B9 CIRCLED NUMBER FORTY FOUR +032BA CIRCLED NUMBER FORTY FIVE +032BB CIRCLED NUMBER FORTY SIX +032BC CIRCLED NUMBER FORTY SEVEN +032BD CIRCLED NUMBER FORTY EIGHT +032BE CIRCLED NUMBER FORTY NINE +032BF CIRCLED NUMBER FIFTY +032C0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY +032C1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY +032C2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH +032C3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL +032C4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY +032C5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE +032C6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY +032C7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST +032C8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER +032C9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER +032CA IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER +032CB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER +032CC SQUARE HG +032CD SQUARE ERG +032CE SQUARE EV +032CF LIMITED LIABILITY SIGN +032D0 CIRCLED KATAKANA A +032D1 CIRCLED KATAKANA I +032D2 CIRCLED KATAKANA U +032D3 CIRCLED KATAKANA E +032D4 CIRCLED KATAKANA O +032D5 CIRCLED KATAKANA KA +032D6 CIRCLED KATAKANA KI +032D7 CIRCLED KATAKANA KU +032D8 CIRCLED KATAKANA KE +032D9 CIRCLED KATAKANA KO +032DA CIRCLED KATAKANA SA +032DB CIRCLED KATAKANA SI +032DC CIRCLED KATAKANA SU +032DD CIRCLED KATAKANA SE +032DE CIRCLED KATAKANA SO +032DF CIRCLED KATAKANA TA +032E0 CIRCLED KATAKANA TI +032E1 CIRCLED KATAKANA TU +032E2 CIRCLED KATAKANA TE +032E3 CIRCLED KATAKANA TO +032E4 CIRCLED KATAKANA NA +032E5 CIRCLED KATAKANA NI +032E6 CIRCLED KATAKANA NU +032E7 CIRCLED KATAKANA NE +032E8 CIRCLED KATAKANA NO +032E9 CIRCLED KATAKANA HA +032EA CIRCLED KATAKANA HI +032EB CIRCLED KATAKANA HU +032EC CIRCLED KATAKANA HE +032ED CIRCLED KATAKANA HO +032EE CIRCLED KATAKANA MA +032EF CIRCLED KATAKANA MI +032F0 CIRCLED KATAKANA MU +032F1 CIRCLED KATAKANA ME +032F2 CIRCLED KATAKANA MO +032F3 CIRCLED KATAKANA YA +032F4 CIRCLED KATAKANA YU +032F5 CIRCLED KATAKANA YO +032F6 CIRCLED KATAKANA RA +032F7 CIRCLED KATAKANA RI +032F8 CIRCLED KATAKANA RU +032F9 CIRCLED KATAKANA RE +032FA CIRCLED KATAKANA RO +032FB CIRCLED KATAKANA WA +032FC CIRCLED KATAKANA WI +032FD CIRCLED KATAKANA WE +032FE CIRCLED KATAKANA WO +03300 SQUARE APAATO +03301 SQUARE ARUHUA +03302 SQUARE ANPEA +03303 SQUARE AARU +03304 SQUARE ININGU +03305 SQUARE INTI +03306 SQUARE UON +03307 SQUARE ESUKUUDO +03308 SQUARE EEKAA +03309 SQUARE ONSU +0330A SQUARE OOMU +0330B SQUARE KAIRI +0330C SQUARE KARATTO +0330D SQUARE KARORII +0330E SQUARE GARON +0330F SQUARE GANMA +03310 SQUARE GIGA +03311 SQUARE GINII +03312 SQUARE KYURII +03313 SQUARE GIRUDAA +03314 SQUARE KIRO +03315 SQUARE KIROGURAMU +03316 SQUARE KIROMEETORU +03317 SQUARE KIROWATTO +03318 SQUARE GURAMU +03319 SQUARE GURAMUTON +0331A SQUARE KURUZEIRO +0331B SQUARE KUROONE +0331C SQUARE KEESU +0331D SQUARE KORUNA +0331E SQUARE KOOPO +0331F SQUARE SAIKURU +03320 SQUARE SANTIIMU +03321 SQUARE SIRINGU +03322 SQUARE SENTI +03323 SQUARE SENTO +03324 SQUARE DAASU +03325 SQUARE DESI +03326 SQUARE DORU +03327 SQUARE TON +03328 SQUARE NANO +03329 SQUARE NOTTO +0332A SQUARE HAITU +0332B SQUARE PAASENTO +0332C SQUARE PAATU +0332D SQUARE BAARERU +0332E SQUARE PIASUTORU +0332F SQUARE PIKURU +03330 SQUARE PIKO +03331 SQUARE BIRU +03332 SQUARE HUARADDO +03333 SQUARE HUIITO +03334 SQUARE BUSSYERU +03335 SQUARE HURAN +03336 SQUARE HEKUTAARU +03337 SQUARE PESO +03338 SQUARE PENIHI +03339 SQUARE HERUTU +0333A SQUARE PENSU +0333B SQUARE PEEZI +0333C SQUARE BEETA +0333D SQUARE POINTO +0333E SQUARE BORUTO +0333F SQUARE HON +03340 SQUARE PONDO +03341 SQUARE HOORU +03342 SQUARE HOON +03343 SQUARE MAIKURO +03344 SQUARE MAIRU +03345 SQUARE MAHHA +03346 SQUARE MARUKU +03347 SQUARE MANSYON +03348 SQUARE MIKURON +03349 SQUARE MIRI +0334A SQUARE MIRIBAARU +0334B SQUARE MEGA +0334C SQUARE MEGATON +0334D SQUARE MEETORU +0334E SQUARE YAADO +0334F SQUARE YAARU +03350 SQUARE YUAN +03351 SQUARE RITTORU +03352 SQUARE RIRA +03353 SQUARE RUPII +03354 SQUARE RUUBURU +03355 SQUARE REMU +03356 SQUARE RENTOGEN +03357 SQUARE WATTO +03358 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO +03359 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE +0335A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO +0335B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE +0335C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR +0335D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE +0335E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX +0335F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN +03360 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT +03361 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE +03362 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN +03363 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN +03364 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE +03365 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN +03366 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN +03367 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN +03368 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN +03369 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN +0336A IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN +0336B IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN +0336C IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY +0336D IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE +0336E IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO +0336F IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE +03370 IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR +03371 SQUARE HPA +03372 SQUARE DA +03373 SQUARE AU +03374 SQUARE BAR +03375 SQUARE OV +03376 SQUARE PC +03377 SQUARE DM +03378 SQUARE DM SQUARED +03379 SQUARE DM CUBED +0337A SQUARE IU +0337B SQUARE ERA NAME HEISEI +0337C SQUARE ERA NAME SYOUWA +0337D SQUARE ERA NAME TAISYOU +0337E SQUARE ERA NAME MEIZI +0337F SQUARE CORPORATION +03380 SQUARE PA AMPS +03381 SQUARE NA +03382 SQUARE MU A +03383 SQUARE MA +03384 SQUARE KA +03385 SQUARE KB +03386 SQUARE MB +03387 SQUARE GB +03388 SQUARE CAL +03389 SQUARE KCAL +0338A SQUARE PF +0338B SQUARE NF +0338C SQUARE MU F +0338D SQUARE MU G +0338E SQUARE MG +0338F SQUARE KG +03390 SQUARE HZ +03391 SQUARE KHZ +03392 SQUARE MHZ +03393 SQUARE GHZ +03394 SQUARE THZ +03395 SQUARE MU L +03396 SQUARE ML +03397 SQUARE DL +03398 SQUARE KL +03399 SQUARE FM +0339A SQUARE NM +0339B SQUARE MU M +0339C SQUARE MM +0339D SQUARE CM +0339E SQUARE KM +0339F SQUARE MM SQUARED +033A0 SQUARE CM SQUARED +033A1 SQUARE M SQUARED +033A2 SQUARE KM SQUARED +033A3 SQUARE MM CUBED +033A4 SQUARE CM CUBED +033A5 SQUARE M CUBED +033A6 SQUARE KM CUBED +033A7 SQUARE M OVER S +033A8 SQUARE M OVER S SQUARED +033A9 SQUARE PA +033AA SQUARE KPA +033AB SQUARE MPA +033AC SQUARE GPA +033AD SQUARE RAD +033AE SQUARE RAD OVER S +033AF SQUARE RAD OVER S SQUARED +033B0 SQUARE PS +033B1 SQUARE NS +033B2 SQUARE MU S +033B3 SQUARE MS +033B4 SQUARE PV +033B5 SQUARE NV +033B6 SQUARE MU V +033B7 SQUARE MV +033B8 SQUARE KV +033B9 SQUARE MV MEGA +033BA SQUARE PW +033BB SQUARE NW +033BC SQUARE MU W +033BD SQUARE MW +033BE SQUARE KW +033BF SQUARE MW MEGA +033C0 SQUARE K OHM +033C1 SQUARE M OHM +033C2 SQUARE AM +033C3 SQUARE BQ +033C4 SQUARE CC +033C5 SQUARE CD +033C6 SQUARE C OVER KG +033C7 SQUARE CO +033C8 SQUARE DB +033C9 SQUARE GY +033CA SQUARE HA +033CB SQUARE HP +033CC SQUARE IN +033CD SQUARE KK +033CE SQUARE KM CAPITAL +033CF SQUARE KT +033D0 SQUARE LM +033D1 SQUARE LN +033D2 SQUARE LOG +033D3 SQUARE LX +033D4 SQUARE MB SMALL +033D5 SQUARE MIL +033D6 SQUARE MOL +033D7 SQUARE PH +033D8 SQUARE PM +033D9 SQUARE PPM +033DA SQUARE PR +033DB SQUARE SR +033DC SQUARE SV +033DD SQUARE WB +033DE SQUARE V OVER M +033DF SQUARE A OVER M +033E0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE +033E1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO +033E2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE +033E3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR +033E4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE +033E5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX +033E6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN +033E7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT +033E8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE +033E9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN +033EA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN +033EB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE +033EC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN +033ED IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN +033EE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN +033EF IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN +033F0 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN +033F1 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN +033F2 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN +033F3 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY +033F4 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE +033F5 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO +033F6 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE +033F7 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR +033F8 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE +033F9 IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX +033FA IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN +033FB IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT +033FC IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE +033FD IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY +033FE IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE +033FF SQUARE GAL +04DC0 HEXAGRAM FOR THE CREATIVE HEAVEN +04DC1 HEXAGRAM FOR THE RECEPTIVE EARTH +04DC2 HEXAGRAM FOR DIFFICULTY AT THE BEGINNING +04DC3 HEXAGRAM FOR YOUTHFUL FOLLY +04DC4 HEXAGRAM FOR WAITING +04DC5 HEXAGRAM FOR CONFLICT +04DC6 HEXAGRAM FOR THE ARMY +04DC7 HEXAGRAM FOR HOLDING TOGETHER +04DC8 HEXAGRAM FOR SMALL TAMING +04DC9 HEXAGRAM FOR TREADING +04DCA HEXAGRAM FOR PEACE +04DCB HEXAGRAM FOR STANDSTILL +04DCC HEXAGRAM FOR FELLOWSHIP +04DCD HEXAGRAM FOR GREAT POSSESSION +04DCE HEXAGRAM FOR MODESTY +04DCF HEXAGRAM FOR ENTHUSIASM +04DD0 HEXAGRAM FOR FOLLOWING +04DD1 HEXAGRAM FOR WORK ON THE DECAYED +04DD2 HEXAGRAM FOR APPROACH +04DD3 HEXAGRAM FOR CONTEMPLATION +04DD4 HEXAGRAM FOR BITING THROUGH +04DD5 HEXAGRAM FOR GRACE +04DD6 HEXAGRAM FOR SPLITTING APART +04DD7 HEXAGRAM FOR RETURN +04DD8 HEXAGRAM FOR INNOCENCE +04DD9 HEXAGRAM FOR GREAT TAMING +04DDA HEXAGRAM FOR MOUTH CORNERS +04DDB HEXAGRAM FOR GREAT PREPONDERANCE +04DDC HEXAGRAM FOR THE ABYSMAL WATER +04DDD HEXAGRAM FOR THE CLINGING FIRE +04DDE HEXAGRAM FOR INFLUENCE +04DDF HEXAGRAM FOR DURATION +04DE0 HEXAGRAM FOR RETREAT +04DE1 HEXAGRAM FOR GREAT POWER +04DE2 HEXAGRAM FOR PROGRESS +04DE3 HEXAGRAM FOR DARKENING OF THE LIGHT +04DE4 HEXAGRAM FOR THE FAMILY +04DE5 HEXAGRAM FOR OPPOSITION +04DE6 HEXAGRAM FOR OBSTRUCTION +04DE7 HEXAGRAM FOR DELIVERANCE +04DE8 HEXAGRAM FOR DECREASE +04DE9 HEXAGRAM FOR INCREASE +04DEA HEXAGRAM FOR BREAKTHROUGH +04DEB HEXAGRAM FOR COMING TO MEET +04DEC HEXAGRAM FOR GATHERING TOGETHER +04DED HEXAGRAM FOR PUSHING UPWARD +04DEE HEXAGRAM FOR OPPRESSION +04DEF HEXAGRAM FOR THE WELL +04DF0 HEXAGRAM FOR REVOLUTION +04DF1 HEXAGRAM FOR THE CAULDRON +04DF2 HEXAGRAM FOR THE AROUSING THUNDER +04DF3 HEXAGRAM FOR THE KEEPING STILL MOUNTAIN +04DF4 HEXAGRAM FOR DEVELOPMENT +04DF5 HEXAGRAM FOR THE MARRYING MAIDEN +04DF6 HEXAGRAM FOR ABUNDANCE +04DF7 HEXAGRAM FOR THE WANDERER +04DF8 HEXAGRAM FOR THE GENTLE WIND +04DF9 HEXAGRAM FOR THE JOYOUS LAKE +04DFA HEXAGRAM FOR DISPERSION +04DFB HEXAGRAM FOR LIMITATION +04DFC HEXAGRAM FOR INNER TRUTH +04DFD HEXAGRAM FOR SMALL PREPONDERANCE +04DFE HEXAGRAM FOR AFTER COMPLETION +04DFF HEXAGRAM FOR BEFORE COMPLETION +0A000 YI SYLLABLE IT +0A001 YI SYLLABLE IX +0A002 YI SYLLABLE I +0A003 YI SYLLABLE IP +0A004 YI SYLLABLE IET +0A005 YI SYLLABLE IEX +0A006 YI SYLLABLE IE +0A007 YI SYLLABLE IEP +0A008 YI SYLLABLE AT +0A009 YI SYLLABLE AX +0A00A YI SYLLABLE A +0A00B YI SYLLABLE AP +0A00C YI SYLLABLE UOX +0A00D YI SYLLABLE UO +0A00E YI SYLLABLE UOP +0A00F YI SYLLABLE OT +0A010 YI SYLLABLE OX +0A011 YI SYLLABLE O +0A012 YI SYLLABLE OP +0A013 YI SYLLABLE EX +0A014 YI SYLLABLE E +0A015 YI SYLLABLE ITERATION MARK +0A015 YI SYLLABLE WU +0A016 YI SYLLABLE BIT +0A017 YI SYLLABLE BIX +0A018 YI SYLLABLE BI +0A019 YI SYLLABLE BIP +0A01A YI SYLLABLE BIET +0A01B YI SYLLABLE BIEX +0A01C YI SYLLABLE BIE +0A01D YI SYLLABLE BIEP +0A01E YI SYLLABLE BAT +0A01F YI SYLLABLE BAX +0A020 YI SYLLABLE BA +0A021 YI SYLLABLE BAP +0A022 YI SYLLABLE BUOX +0A023 YI SYLLABLE BUO +0A024 YI SYLLABLE BUOP +0A025 YI SYLLABLE BOT +0A026 YI SYLLABLE BOX +0A027 YI SYLLABLE BO +0A028 YI SYLLABLE BOP +0A029 YI SYLLABLE BEX +0A02A YI SYLLABLE BE +0A02B YI SYLLABLE BEP +0A02C YI SYLLABLE BUT +0A02D YI SYLLABLE BUX +0A02E YI SYLLABLE BU +0A02F YI SYLLABLE BUP +0A030 YI SYLLABLE BURX +0A031 YI SYLLABLE BUR +0A032 YI SYLLABLE BYT +0A033 YI SYLLABLE BYX +0A034 YI SYLLABLE BY +0A035 YI SYLLABLE BYP +0A036 YI SYLLABLE BYRX +0A037 YI SYLLABLE BYR +0A038 YI SYLLABLE PIT +0A039 YI SYLLABLE PIX +0A03A YI SYLLABLE PI +0A03B YI SYLLABLE PIP +0A03C YI SYLLABLE PIEX +0A03D YI SYLLABLE PIE +0A03E YI SYLLABLE PIEP +0A03F YI SYLLABLE PAT +0A040 YI SYLLABLE PAX +0A041 YI SYLLABLE PA +0A042 YI SYLLABLE PAP +0A043 YI SYLLABLE PUOX +0A044 YI SYLLABLE PUO +0A045 YI SYLLABLE PUOP +0A046 YI SYLLABLE POT +0A047 YI SYLLABLE POX +0A048 YI SYLLABLE PO +0A049 YI SYLLABLE POP +0A04A YI SYLLABLE PUT +0A04B YI SYLLABLE PUX +0A04C YI SYLLABLE PU +0A04D YI SYLLABLE PUP +0A04E YI SYLLABLE PURX +0A04F YI SYLLABLE PUR +0A050 YI SYLLABLE PYT +0A051 YI SYLLABLE PYX +0A052 YI SYLLABLE PY +0A053 YI SYLLABLE PYP +0A054 YI SYLLABLE PYRX +0A055 YI SYLLABLE PYR +0A056 YI SYLLABLE BBIT +0A057 YI SYLLABLE BBIX +0A058 YI SYLLABLE BBI +0A059 YI SYLLABLE BBIP +0A05A YI SYLLABLE BBIET +0A05B YI SYLLABLE BBIEX +0A05C YI SYLLABLE BBIE +0A05D YI SYLLABLE BBIEP +0A05E YI SYLLABLE BBAT +0A05F YI SYLLABLE BBAX +0A060 YI SYLLABLE BBA +0A061 YI SYLLABLE BBAP +0A062 YI SYLLABLE BBUOX +0A063 YI SYLLABLE BBUO +0A064 YI SYLLABLE BBUOP +0A065 YI SYLLABLE BBOT +0A066 YI SYLLABLE BBOX +0A067 YI SYLLABLE BBO +0A068 YI SYLLABLE BBOP +0A069 YI SYLLABLE BBEX +0A06A YI SYLLABLE BBE +0A06B YI SYLLABLE BBEP +0A06C YI SYLLABLE BBUT +0A06D YI SYLLABLE BBUX +0A06E YI SYLLABLE BBU +0A06F YI SYLLABLE BBUP +0A070 YI SYLLABLE BBURX +0A071 YI SYLLABLE BBUR +0A072 YI SYLLABLE BBYT +0A073 YI SYLLABLE BBYX +0A074 YI SYLLABLE BBY +0A075 YI SYLLABLE BBYP +0A076 YI SYLLABLE NBIT +0A077 YI SYLLABLE NBIX +0A078 YI SYLLABLE NBI +0A079 YI SYLLABLE NBIP +0A07A YI SYLLABLE NBIEX +0A07B YI SYLLABLE NBIE +0A07C YI SYLLABLE NBIEP +0A07D YI SYLLABLE NBAT +0A07E YI SYLLABLE NBAX +0A07F YI SYLLABLE NBA +0A080 YI SYLLABLE NBAP +0A081 YI SYLLABLE NBOT +0A082 YI SYLLABLE NBOX +0A083 YI SYLLABLE NBO +0A084 YI SYLLABLE NBOP +0A085 YI SYLLABLE NBUT +0A086 YI SYLLABLE NBUX +0A087 YI SYLLABLE NBU +0A088 YI SYLLABLE NBUP +0A089 YI SYLLABLE NBURX +0A08A YI SYLLABLE NBUR +0A08B YI SYLLABLE NBYT +0A08C YI SYLLABLE NBYX +0A08D YI SYLLABLE NBY +0A08E YI SYLLABLE NBYP +0A08F YI SYLLABLE NBYRX +0A090 YI SYLLABLE NBYR +0A091 YI SYLLABLE HMIT +0A092 YI SYLLABLE HMIX +0A093 YI SYLLABLE HMI +0A094 YI SYLLABLE HMIP +0A095 YI SYLLABLE HMIEX +0A096 YI SYLLABLE HMIE +0A097 YI SYLLABLE HMIEP +0A098 YI SYLLABLE HMAT +0A099 YI SYLLABLE HMAX +0A09A YI SYLLABLE HMA +0A09B YI SYLLABLE HMAP +0A09C YI SYLLABLE HMUOX +0A09D YI SYLLABLE HMUO +0A09E YI SYLLABLE HMUOP +0A09F YI SYLLABLE HMOT +0A0A0 YI SYLLABLE HMOX +0A0A1 YI SYLLABLE HMO +0A0A2 YI SYLLABLE HMOP +0A0A3 YI SYLLABLE HMUT +0A0A4 YI SYLLABLE HMUX +0A0A5 YI SYLLABLE HMU +0A0A6 YI SYLLABLE HMUP +0A0A7 YI SYLLABLE HMURX +0A0A8 YI SYLLABLE HMUR +0A0A9 YI SYLLABLE HMYX +0A0AA YI SYLLABLE HMY +0A0AB YI SYLLABLE HMYP +0A0AC YI SYLLABLE HMYRX +0A0AD YI SYLLABLE HMYR +0A0AE YI SYLLABLE MIT +0A0AF YI SYLLABLE MIX +0A0B0 YI SYLLABLE MI +0A0B1 YI SYLLABLE MIP +0A0B2 YI SYLLABLE MIEX +0A0B3 YI SYLLABLE MIE +0A0B4 YI SYLLABLE MIEP +0A0B5 YI SYLLABLE MAT +0A0B6 YI SYLLABLE MAX +0A0B7 YI SYLLABLE MA +0A0B8 YI SYLLABLE MAP +0A0B9 YI SYLLABLE MUOT +0A0BA YI SYLLABLE MUOX +0A0BB YI SYLLABLE MUO +0A0BC YI SYLLABLE MUOP +0A0BD YI SYLLABLE MOT +0A0BE YI SYLLABLE MOX +0A0BF YI SYLLABLE MO +0A0C0 YI SYLLABLE MOP +0A0C1 YI SYLLABLE MEX +0A0C2 YI SYLLABLE ME +0A0C3 YI SYLLABLE MUT +0A0C4 YI SYLLABLE MUX +0A0C5 YI SYLLABLE MU +0A0C6 YI SYLLABLE MUP +0A0C7 YI SYLLABLE MURX +0A0C8 YI SYLLABLE MUR +0A0C9 YI SYLLABLE MYT +0A0CA YI SYLLABLE MYX +0A0CB YI SYLLABLE MY +0A0CC YI SYLLABLE MYP +0A0CD YI SYLLABLE FIT +0A0CE YI SYLLABLE FIX +0A0CF YI SYLLABLE FI +0A0D0 YI SYLLABLE FIP +0A0D1 YI SYLLABLE FAT +0A0D2 YI SYLLABLE FAX +0A0D3 YI SYLLABLE FA +0A0D4 YI SYLLABLE FAP +0A0D5 YI SYLLABLE FOX +0A0D6 YI SYLLABLE FO +0A0D7 YI SYLLABLE FOP +0A0D8 YI SYLLABLE FUT +0A0D9 YI SYLLABLE FUX +0A0DA YI SYLLABLE FU +0A0DB YI SYLLABLE FUP +0A0DC YI SYLLABLE FURX +0A0DD YI SYLLABLE FUR +0A0DE YI SYLLABLE FYT +0A0DF YI SYLLABLE FYX +0A0E0 YI SYLLABLE FY +0A0E1 YI SYLLABLE FYP +0A0E2 YI SYLLABLE VIT +0A0E3 YI SYLLABLE VIX +0A0E4 YI SYLLABLE VI +0A0E5 YI SYLLABLE VIP +0A0E6 YI SYLLABLE VIET +0A0E7 YI SYLLABLE VIEX +0A0E8 YI SYLLABLE VIE +0A0E9 YI SYLLABLE VIEP +0A0EA YI SYLLABLE VAT +0A0EB YI SYLLABLE VAX +0A0EC YI SYLLABLE VA +0A0ED YI SYLLABLE VAP +0A0EE YI SYLLABLE VOT +0A0EF YI SYLLABLE VOX +0A0F0 YI SYLLABLE VO +0A0F1 YI SYLLABLE VOP +0A0F2 YI SYLLABLE VEX +0A0F3 YI SYLLABLE VEP +0A0F4 YI SYLLABLE VUT +0A0F5 YI SYLLABLE VUX +0A0F6 YI SYLLABLE VU +0A0F7 YI SYLLABLE VUP +0A0F8 YI SYLLABLE VURX +0A0F9 YI SYLLABLE VUR +0A0FA YI SYLLABLE VYT +0A0FB YI SYLLABLE VYX +0A0FC YI SYLLABLE VY +0A0FD YI SYLLABLE VYP +0A0FE YI SYLLABLE VYRX +0A0FF YI SYLLABLE VYR +0A100 YI SYLLABLE DIT +0A101 YI SYLLABLE DIX +0A102 YI SYLLABLE DI +0A103 YI SYLLABLE DIP +0A104 YI SYLLABLE DIEX +0A105 YI SYLLABLE DIE +0A106 YI SYLLABLE DIEP +0A107 YI SYLLABLE DAT +0A108 YI SYLLABLE DAX +0A109 YI SYLLABLE DA +0A10A YI SYLLABLE DAP +0A10B YI SYLLABLE DUOX +0A10C YI SYLLABLE DUO +0A10D YI SYLLABLE DOT +0A10E YI SYLLABLE DOX +0A10F YI SYLLABLE DO +0A110 YI SYLLABLE DOP +0A111 YI SYLLABLE DEX +0A112 YI SYLLABLE DE +0A113 YI SYLLABLE DEP +0A114 YI SYLLABLE DUT +0A115 YI SYLLABLE DUX +0A116 YI SYLLABLE DU +0A117 YI SYLLABLE DUP +0A118 YI SYLLABLE DURX +0A119 YI SYLLABLE DUR +0A11A YI SYLLABLE TIT +0A11B YI SYLLABLE TIX +0A11C YI SYLLABLE TI +0A11D YI SYLLABLE TIP +0A11E YI SYLLABLE TIEX +0A11F YI SYLLABLE TIE +0A120 YI SYLLABLE TIEP +0A121 YI SYLLABLE TAT +0A122 YI SYLLABLE TAX +0A123 YI SYLLABLE TA +0A124 YI SYLLABLE TAP +0A125 YI SYLLABLE TUOT +0A126 YI SYLLABLE TUOX +0A127 YI SYLLABLE TUO +0A128 YI SYLLABLE TUOP +0A129 YI SYLLABLE TOT +0A12A YI SYLLABLE TOX +0A12B YI SYLLABLE TO +0A12C YI SYLLABLE TOP +0A12D YI SYLLABLE TEX +0A12E YI SYLLABLE TE +0A12F YI SYLLABLE TEP +0A130 YI SYLLABLE TUT +0A131 YI SYLLABLE TUX +0A132 YI SYLLABLE TU +0A133 YI SYLLABLE TUP +0A134 YI SYLLABLE TURX +0A135 YI SYLLABLE TUR +0A136 YI SYLLABLE DDIT +0A137 YI SYLLABLE DDIX +0A138 YI SYLLABLE DDI +0A139 YI SYLLABLE DDIP +0A13A YI SYLLABLE DDIEX +0A13B YI SYLLABLE DDIE +0A13C YI SYLLABLE DDIEP +0A13D YI SYLLABLE DDAT +0A13E YI SYLLABLE DDAX +0A13F YI SYLLABLE DDA +0A140 YI SYLLABLE DDAP +0A141 YI SYLLABLE DDUOX +0A142 YI SYLLABLE DDUO +0A143 YI SYLLABLE DDUOP +0A144 YI SYLLABLE DDOT +0A145 YI SYLLABLE DDOX +0A146 YI SYLLABLE DDO +0A147 YI SYLLABLE DDOP +0A148 YI SYLLABLE DDEX +0A149 YI SYLLABLE DDE +0A14A YI SYLLABLE DDEP +0A14B YI SYLLABLE DDUT +0A14C YI SYLLABLE DDUX +0A14D YI SYLLABLE DDU +0A14E YI SYLLABLE DDUP +0A14F YI SYLLABLE DDURX +0A150 YI SYLLABLE DDUR +0A151 YI SYLLABLE NDIT +0A152 YI SYLLABLE NDIX +0A153 YI SYLLABLE NDI +0A154 YI SYLLABLE NDIP +0A155 YI SYLLABLE NDIEX +0A156 YI SYLLABLE NDIE +0A157 YI SYLLABLE NDAT +0A158 YI SYLLABLE NDAX +0A159 YI SYLLABLE NDA +0A15A YI SYLLABLE NDAP +0A15B YI SYLLABLE NDOT +0A15C YI SYLLABLE NDOX +0A15D YI SYLLABLE NDO +0A15E YI SYLLABLE NDOP +0A15F YI SYLLABLE NDEX +0A160 YI SYLLABLE NDE +0A161 YI SYLLABLE NDEP +0A162 YI SYLLABLE NDUT +0A163 YI SYLLABLE NDUX +0A164 YI SYLLABLE NDU +0A165 YI SYLLABLE NDUP +0A166 YI SYLLABLE NDURX +0A167 YI SYLLABLE NDUR +0A168 YI SYLLABLE HNIT +0A169 YI SYLLABLE HNIX +0A16A YI SYLLABLE HNI +0A16B YI SYLLABLE HNIP +0A16C YI SYLLABLE HNIET +0A16D YI SYLLABLE HNIEX +0A16E YI SYLLABLE HNIE +0A16F YI SYLLABLE HNIEP +0A170 YI SYLLABLE HNAT +0A171 YI SYLLABLE HNAX +0A172 YI SYLLABLE HNA +0A173 YI SYLLABLE HNAP +0A174 YI SYLLABLE HNUOX +0A175 YI SYLLABLE HNUO +0A176 YI SYLLABLE HNOT +0A177 YI SYLLABLE HNOX +0A178 YI SYLLABLE HNOP +0A179 YI SYLLABLE HNEX +0A17A YI SYLLABLE HNE +0A17B YI SYLLABLE HNEP +0A17C YI SYLLABLE HNUT +0A17D YI SYLLABLE NIT +0A17E YI SYLLABLE NIX +0A17F YI SYLLABLE NI +0A180 YI SYLLABLE NIP +0A181 YI SYLLABLE NIEX +0A182 YI SYLLABLE NIE +0A183 YI SYLLABLE NIEP +0A184 YI SYLLABLE NAX +0A185 YI SYLLABLE NA +0A186 YI SYLLABLE NAP +0A187 YI SYLLABLE NUOX +0A188 YI SYLLABLE NUO +0A189 YI SYLLABLE NUOP +0A18A YI SYLLABLE NOT +0A18B YI SYLLABLE NOX +0A18C YI SYLLABLE NO +0A18D YI SYLLABLE NOP +0A18E YI SYLLABLE NEX +0A18F YI SYLLABLE NE +0A190 YI SYLLABLE NEP +0A191 YI SYLLABLE NUT +0A192 YI SYLLABLE NUX +0A193 YI SYLLABLE NU +0A194 YI SYLLABLE NUP +0A195 YI SYLLABLE NURX +0A196 YI SYLLABLE NUR +0A197 YI SYLLABLE HLIT +0A198 YI SYLLABLE HLIX +0A199 YI SYLLABLE HLI +0A19A YI SYLLABLE HLIP +0A19B YI SYLLABLE HLIEX +0A19C YI SYLLABLE HLIE +0A19D YI SYLLABLE HLIEP +0A19E YI SYLLABLE HLAT +0A19F YI SYLLABLE HLAX +0A1A0 YI SYLLABLE HLA +0A1A1 YI SYLLABLE HLAP +0A1A2 YI SYLLABLE HLUOX +0A1A3 YI SYLLABLE HLUO +0A1A4 YI SYLLABLE HLUOP +0A1A5 YI SYLLABLE HLOX +0A1A6 YI SYLLABLE HLO +0A1A7 YI SYLLABLE HLOP +0A1A8 YI SYLLABLE HLEX +0A1A9 YI SYLLABLE HLE +0A1AA YI SYLLABLE HLEP +0A1AB YI SYLLABLE HLUT +0A1AC YI SYLLABLE HLUX +0A1AD YI SYLLABLE HLU +0A1AE YI SYLLABLE HLUP +0A1AF YI SYLLABLE HLURX +0A1B0 YI SYLLABLE HLUR +0A1B1 YI SYLLABLE HLYT +0A1B2 YI SYLLABLE HLYX +0A1B3 YI SYLLABLE HLY +0A1B4 YI SYLLABLE HLYP +0A1B5 YI SYLLABLE HLYRX +0A1B6 YI SYLLABLE HLYR +0A1B7 YI SYLLABLE LIT +0A1B8 YI SYLLABLE LIX +0A1B9 YI SYLLABLE LI +0A1BA YI SYLLABLE LIP +0A1BB YI SYLLABLE LIET +0A1BC YI SYLLABLE LIEX +0A1BD YI SYLLABLE LIE +0A1BE YI SYLLABLE LIEP +0A1BF YI SYLLABLE LAT +0A1C0 YI SYLLABLE LAX +0A1C1 YI SYLLABLE LA +0A1C2 YI SYLLABLE LAP +0A1C3 YI SYLLABLE LUOT +0A1C4 YI SYLLABLE LUOX +0A1C5 YI SYLLABLE LUO +0A1C6 YI SYLLABLE LUOP +0A1C7 YI SYLLABLE LOT +0A1C8 YI SYLLABLE LOX +0A1C9 YI SYLLABLE LO +0A1CA YI SYLLABLE LOP +0A1CB YI SYLLABLE LEX +0A1CC YI SYLLABLE LE +0A1CD YI SYLLABLE LEP +0A1CE YI SYLLABLE LUT +0A1CF YI SYLLABLE LUX +0A1D0 YI SYLLABLE LU +0A1D1 YI SYLLABLE LUP +0A1D2 YI SYLLABLE LURX +0A1D3 YI SYLLABLE LUR +0A1D4 YI SYLLABLE LYT +0A1D5 YI SYLLABLE LYX +0A1D6 YI SYLLABLE LY +0A1D7 YI SYLLABLE LYP +0A1D8 YI SYLLABLE LYRX +0A1D9 YI SYLLABLE LYR +0A1DA YI SYLLABLE GIT +0A1DB YI SYLLABLE GIX +0A1DC YI SYLLABLE GI +0A1DD YI SYLLABLE GIP +0A1DE YI SYLLABLE GIET +0A1DF YI SYLLABLE GIEX +0A1E0 YI SYLLABLE GIE +0A1E1 YI SYLLABLE GIEP +0A1E2 YI SYLLABLE GAT +0A1E3 YI SYLLABLE GAX +0A1E4 YI SYLLABLE GA +0A1E5 YI SYLLABLE GAP +0A1E6 YI SYLLABLE GUOT +0A1E7 YI SYLLABLE GUOX +0A1E8 YI SYLLABLE GUO +0A1E9 YI SYLLABLE GUOP +0A1EA YI SYLLABLE GOT +0A1EB YI SYLLABLE GOX +0A1EC YI SYLLABLE GO +0A1ED YI SYLLABLE GOP +0A1EE YI SYLLABLE GET +0A1EF YI SYLLABLE GEX +0A1F0 YI SYLLABLE GE +0A1F1 YI SYLLABLE GEP +0A1F2 YI SYLLABLE GUT +0A1F3 YI SYLLABLE GUX +0A1F4 YI SYLLABLE GU +0A1F5 YI SYLLABLE GUP +0A1F6 YI SYLLABLE GURX +0A1F7 YI SYLLABLE GUR +0A1F8 YI SYLLABLE KIT +0A1F9 YI SYLLABLE KIX +0A1FA YI SYLLABLE KI +0A1FB YI SYLLABLE KIP +0A1FC YI SYLLABLE KIEX +0A1FD YI SYLLABLE KIE +0A1FE YI SYLLABLE KIEP +0A1FF YI SYLLABLE KAT +0A200 YI SYLLABLE KAX +0A201 YI SYLLABLE KA +0A202 YI SYLLABLE KAP +0A203 YI SYLLABLE KUOX +0A204 YI SYLLABLE KUO +0A205 YI SYLLABLE KUOP +0A206 YI SYLLABLE KOT +0A207 YI SYLLABLE KOX +0A208 YI SYLLABLE KO +0A209 YI SYLLABLE KOP +0A20A YI SYLLABLE KET +0A20B YI SYLLABLE KEX +0A20C YI SYLLABLE KE +0A20D YI SYLLABLE KEP +0A20E YI SYLLABLE KUT +0A20F YI SYLLABLE KUX +0A210 YI SYLLABLE KU +0A211 YI SYLLABLE KUP +0A212 YI SYLLABLE KURX +0A213 YI SYLLABLE KUR +0A214 YI SYLLABLE GGIT +0A215 YI SYLLABLE GGIX +0A216 YI SYLLABLE GGI +0A217 YI SYLLABLE GGIEX +0A218 YI SYLLABLE GGIE +0A219 YI SYLLABLE GGIEP +0A21A YI SYLLABLE GGAT +0A21B YI SYLLABLE GGAX +0A21C YI SYLLABLE GGA +0A21D YI SYLLABLE GGAP +0A21E YI SYLLABLE GGUOT +0A21F YI SYLLABLE GGUOX +0A220 YI SYLLABLE GGUO +0A221 YI SYLLABLE GGUOP +0A222 YI SYLLABLE GGOT +0A223 YI SYLLABLE GGOX +0A224 YI SYLLABLE GGO +0A225 YI SYLLABLE GGOP +0A226 YI SYLLABLE GGET +0A227 YI SYLLABLE GGEX +0A228 YI SYLLABLE GGE +0A229 YI SYLLABLE GGEP +0A22A YI SYLLABLE GGUT +0A22B YI SYLLABLE GGUX +0A22C YI SYLLABLE GGU +0A22D YI SYLLABLE GGUP +0A22E YI SYLLABLE GGURX +0A22F YI SYLLABLE GGUR +0A230 YI SYLLABLE MGIEX +0A231 YI SYLLABLE MGIE +0A232 YI SYLLABLE MGAT +0A233 YI SYLLABLE MGAX +0A234 YI SYLLABLE MGA +0A235 YI SYLLABLE MGAP +0A236 YI SYLLABLE MGUOX +0A237 YI SYLLABLE MGUO +0A238 YI SYLLABLE MGUOP +0A239 YI SYLLABLE MGOT +0A23A YI SYLLABLE MGOX +0A23B YI SYLLABLE MGO +0A23C YI SYLLABLE MGOP +0A23D YI SYLLABLE MGEX +0A23E YI SYLLABLE MGE +0A23F YI SYLLABLE MGEP +0A240 YI SYLLABLE MGUT +0A241 YI SYLLABLE MGUX +0A242 YI SYLLABLE MGU +0A243 YI SYLLABLE MGUP +0A244 YI SYLLABLE MGURX +0A245 YI SYLLABLE MGUR +0A246 YI SYLLABLE HXIT +0A247 YI SYLLABLE HXIX +0A248 YI SYLLABLE HXI +0A249 YI SYLLABLE HXIP +0A24A YI SYLLABLE HXIET +0A24B YI SYLLABLE HXIEX +0A24C YI SYLLABLE HXIE +0A24D YI SYLLABLE HXIEP +0A24E YI SYLLABLE HXAT +0A24F YI SYLLABLE HXAX +0A250 YI SYLLABLE HXA +0A251 YI SYLLABLE HXAP +0A252 YI SYLLABLE HXUOT +0A253 YI SYLLABLE HXUOX +0A254 YI SYLLABLE HXUO +0A255 YI SYLLABLE HXUOP +0A256 YI SYLLABLE HXOT +0A257 YI SYLLABLE HXOX +0A258 YI SYLLABLE HXO +0A259 YI SYLLABLE HXOP +0A25A YI SYLLABLE HXEX +0A25B YI SYLLABLE HXE +0A25C YI SYLLABLE HXEP +0A25D YI SYLLABLE NGIEX +0A25E YI SYLLABLE NGIE +0A25F YI SYLLABLE NGIEP +0A260 YI SYLLABLE NGAT +0A261 YI SYLLABLE NGAX +0A262 YI SYLLABLE NGA +0A263 YI SYLLABLE NGAP +0A264 YI SYLLABLE NGUOT +0A265 YI SYLLABLE NGUOX +0A266 YI SYLLABLE NGUO +0A267 YI SYLLABLE NGOT +0A268 YI SYLLABLE NGOX +0A269 YI SYLLABLE NGO +0A26A YI SYLLABLE NGOP +0A26B YI SYLLABLE NGEX +0A26C YI SYLLABLE NGE +0A26D YI SYLLABLE NGEP +0A26E YI SYLLABLE HIT +0A26F YI SYLLABLE HIEX +0A270 YI SYLLABLE HIE +0A271 YI SYLLABLE HAT +0A272 YI SYLLABLE HAX +0A273 YI SYLLABLE HA +0A274 YI SYLLABLE HAP +0A275 YI SYLLABLE HUOT +0A276 YI SYLLABLE HUOX +0A277 YI SYLLABLE HUO +0A278 YI SYLLABLE HUOP +0A279 YI SYLLABLE HOT +0A27A YI SYLLABLE HOX +0A27B YI SYLLABLE HO +0A27C YI SYLLABLE HOP +0A27D YI SYLLABLE HEX +0A27E YI SYLLABLE HE +0A27F YI SYLLABLE HEP +0A280 YI SYLLABLE WAT +0A281 YI SYLLABLE WAX +0A282 YI SYLLABLE WA +0A283 YI SYLLABLE WAP +0A284 YI SYLLABLE WUOX +0A285 YI SYLLABLE WUO +0A286 YI SYLLABLE WUOP +0A287 YI SYLLABLE WOX +0A288 YI SYLLABLE WO +0A289 YI SYLLABLE WOP +0A28A YI SYLLABLE WEX +0A28B YI SYLLABLE WE +0A28C YI SYLLABLE WEP +0A28D YI SYLLABLE ZIT +0A28E YI SYLLABLE ZIX +0A28F YI SYLLABLE ZI +0A290 YI SYLLABLE ZIP +0A291 YI SYLLABLE ZIEX +0A292 YI SYLLABLE ZIE +0A293 YI SYLLABLE ZIEP +0A294 YI SYLLABLE ZAT +0A295 YI SYLLABLE ZAX +0A296 YI SYLLABLE ZA +0A297 YI SYLLABLE ZAP +0A298 YI SYLLABLE ZUOX +0A299 YI SYLLABLE ZUO +0A29A YI SYLLABLE ZUOP +0A29B YI SYLLABLE ZOT +0A29C YI SYLLABLE ZOX +0A29D YI SYLLABLE ZO +0A29E YI SYLLABLE ZOP +0A29F YI SYLLABLE ZEX +0A2A0 YI SYLLABLE ZE +0A2A1 YI SYLLABLE ZEP +0A2A2 YI SYLLABLE ZUT +0A2A3 YI SYLLABLE ZUX +0A2A4 YI SYLLABLE ZU +0A2A5 YI SYLLABLE ZUP +0A2A6 YI SYLLABLE ZURX +0A2A7 YI SYLLABLE ZUR +0A2A8 YI SYLLABLE ZYT +0A2A9 YI SYLLABLE ZYX +0A2AA YI SYLLABLE ZY +0A2AB YI SYLLABLE ZYP +0A2AC YI SYLLABLE ZYRX +0A2AD YI SYLLABLE ZYR +0A2AE YI SYLLABLE CIT +0A2AF YI SYLLABLE CIX +0A2B0 YI SYLLABLE CI +0A2B1 YI SYLLABLE CIP +0A2B2 YI SYLLABLE CIET +0A2B3 YI SYLLABLE CIEX +0A2B4 YI SYLLABLE CIE +0A2B5 YI SYLLABLE CIEP +0A2B6 YI SYLLABLE CAT +0A2B7 YI SYLLABLE CAX +0A2B8 YI SYLLABLE CA +0A2B9 YI SYLLABLE CAP +0A2BA YI SYLLABLE CUOX +0A2BB YI SYLLABLE CUO +0A2BC YI SYLLABLE CUOP +0A2BD YI SYLLABLE COT +0A2BE YI SYLLABLE COX +0A2BF YI SYLLABLE CO +0A2C0 YI SYLLABLE COP +0A2C1 YI SYLLABLE CEX +0A2C2 YI SYLLABLE CE +0A2C3 YI SYLLABLE CEP +0A2C4 YI SYLLABLE CUT +0A2C5 YI SYLLABLE CUX +0A2C6 YI SYLLABLE CU +0A2C7 YI SYLLABLE CUP +0A2C8 YI SYLLABLE CURX +0A2C9 YI SYLLABLE CUR +0A2CA YI SYLLABLE CYT +0A2CB YI SYLLABLE CYX +0A2CC YI SYLLABLE CY +0A2CD YI SYLLABLE CYP +0A2CE YI SYLLABLE CYRX +0A2CF YI SYLLABLE CYR +0A2D0 YI SYLLABLE ZZIT +0A2D1 YI SYLLABLE ZZIX +0A2D2 YI SYLLABLE ZZI +0A2D3 YI SYLLABLE ZZIP +0A2D4 YI SYLLABLE ZZIET +0A2D5 YI SYLLABLE ZZIEX +0A2D6 YI SYLLABLE ZZIE +0A2D7 YI SYLLABLE ZZIEP +0A2D8 YI SYLLABLE ZZAT +0A2D9 YI SYLLABLE ZZAX +0A2DA YI SYLLABLE ZZA +0A2DB YI SYLLABLE ZZAP +0A2DC YI SYLLABLE ZZOX +0A2DD YI SYLLABLE ZZO +0A2DE YI SYLLABLE ZZOP +0A2DF YI SYLLABLE ZZEX +0A2E0 YI SYLLABLE ZZE +0A2E1 YI SYLLABLE ZZEP +0A2E2 YI SYLLABLE ZZUX +0A2E3 YI SYLLABLE ZZU +0A2E4 YI SYLLABLE ZZUP +0A2E5 YI SYLLABLE ZZURX +0A2E6 YI SYLLABLE ZZUR +0A2E7 YI SYLLABLE ZZYT +0A2E8 YI SYLLABLE ZZYX +0A2E9 YI SYLLABLE ZZY +0A2EA YI SYLLABLE ZZYP +0A2EB YI SYLLABLE ZZYRX +0A2EC YI SYLLABLE ZZYR +0A2ED YI SYLLABLE NZIT +0A2EE YI SYLLABLE NZIX +0A2EF YI SYLLABLE NZI +0A2F0 YI SYLLABLE NZIP +0A2F1 YI SYLLABLE NZIEX +0A2F2 YI SYLLABLE NZIE +0A2F3 YI SYLLABLE NZIEP +0A2F4 YI SYLLABLE NZAT +0A2F5 YI SYLLABLE NZAX +0A2F6 YI SYLLABLE NZA +0A2F7 YI SYLLABLE NZAP +0A2F8 YI SYLLABLE NZUOX +0A2F9 YI SYLLABLE NZUO +0A2FA YI SYLLABLE NZOX +0A2FB YI SYLLABLE NZOP +0A2FC YI SYLLABLE NZEX +0A2FD YI SYLLABLE NZE +0A2FE YI SYLLABLE NZUX +0A2FF YI SYLLABLE NZU +0A300 YI SYLLABLE NZUP +0A301 YI SYLLABLE NZURX +0A302 YI SYLLABLE NZUR +0A303 YI SYLLABLE NZYT +0A304 YI SYLLABLE NZYX +0A305 YI SYLLABLE NZY +0A306 YI SYLLABLE NZYP +0A307 YI SYLLABLE NZYRX +0A308 YI SYLLABLE NZYR +0A309 YI SYLLABLE SIT +0A30A YI SYLLABLE SIX +0A30B YI SYLLABLE SI +0A30C YI SYLLABLE SIP +0A30D YI SYLLABLE SIEX +0A30E YI SYLLABLE SIE +0A30F YI SYLLABLE SIEP +0A310 YI SYLLABLE SAT +0A311 YI SYLLABLE SAX +0A312 YI SYLLABLE SA +0A313 YI SYLLABLE SAP +0A314 YI SYLLABLE SUOX +0A315 YI SYLLABLE SUO +0A316 YI SYLLABLE SUOP +0A317 YI SYLLABLE SOT +0A318 YI SYLLABLE SOX +0A319 YI SYLLABLE SO +0A31A YI SYLLABLE SOP +0A31B YI SYLLABLE SEX +0A31C YI SYLLABLE SE +0A31D YI SYLLABLE SEP +0A31E YI SYLLABLE SUT +0A31F YI SYLLABLE SUX +0A320 YI SYLLABLE SU +0A321 YI SYLLABLE SUP +0A322 YI SYLLABLE SURX +0A323 YI SYLLABLE SUR +0A324 YI SYLLABLE SYT +0A325 YI SYLLABLE SYX +0A326 YI SYLLABLE SY +0A327 YI SYLLABLE SYP +0A328 YI SYLLABLE SYRX +0A329 YI SYLLABLE SYR +0A32A YI SYLLABLE SSIT +0A32B YI SYLLABLE SSIX +0A32C YI SYLLABLE SSI +0A32D YI SYLLABLE SSIP +0A32E YI SYLLABLE SSIEX +0A32F YI SYLLABLE SSIE +0A330 YI SYLLABLE SSIEP +0A331 YI SYLLABLE SSAT +0A332 YI SYLLABLE SSAX +0A333 YI SYLLABLE SSA +0A334 YI SYLLABLE SSAP +0A335 YI SYLLABLE SSOT +0A336 YI SYLLABLE SSOX +0A337 YI SYLLABLE SSO +0A338 YI SYLLABLE SSOP +0A339 YI SYLLABLE SSEX +0A33A YI SYLLABLE SSE +0A33B YI SYLLABLE SSEP +0A33C YI SYLLABLE SSUT +0A33D YI SYLLABLE SSUX +0A33E YI SYLLABLE SSU +0A33F YI SYLLABLE SSUP +0A340 YI SYLLABLE SSYT +0A341 YI SYLLABLE SSYX +0A342 YI SYLLABLE SSY +0A343 YI SYLLABLE SSYP +0A344 YI SYLLABLE SSYRX +0A345 YI SYLLABLE SSYR +0A346 YI SYLLABLE ZHAT +0A347 YI SYLLABLE ZHAX +0A348 YI SYLLABLE ZHA +0A349 YI SYLLABLE ZHAP +0A34A YI SYLLABLE ZHUOX +0A34B YI SYLLABLE ZHUO +0A34C YI SYLLABLE ZHUOP +0A34D YI SYLLABLE ZHOT +0A34E YI SYLLABLE ZHOX +0A34F YI SYLLABLE ZHO +0A350 YI SYLLABLE ZHOP +0A351 YI SYLLABLE ZHET +0A352 YI SYLLABLE ZHEX +0A353 YI SYLLABLE ZHE +0A354 YI SYLLABLE ZHEP +0A355 YI SYLLABLE ZHUT +0A356 YI SYLLABLE ZHUX +0A357 YI SYLLABLE ZHU +0A358 YI SYLLABLE ZHUP +0A359 YI SYLLABLE ZHURX +0A35A YI SYLLABLE ZHUR +0A35B YI SYLLABLE ZHYT +0A35C YI SYLLABLE ZHYX +0A35D YI SYLLABLE ZHY +0A35E YI SYLLABLE ZHYP +0A35F YI SYLLABLE ZHYRX +0A360 YI SYLLABLE ZHYR +0A361 YI SYLLABLE CHAT +0A362 YI SYLLABLE CHAX +0A363 YI SYLLABLE CHA +0A364 YI SYLLABLE CHAP +0A365 YI SYLLABLE CHUOT +0A366 YI SYLLABLE CHUOX +0A367 YI SYLLABLE CHUO +0A368 YI SYLLABLE CHUOP +0A369 YI SYLLABLE CHOT +0A36A YI SYLLABLE CHOX +0A36B YI SYLLABLE CHO +0A36C YI SYLLABLE CHOP +0A36D YI SYLLABLE CHET +0A36E YI SYLLABLE CHEX +0A36F YI SYLLABLE CHE +0A370 YI SYLLABLE CHEP +0A371 YI SYLLABLE CHUX +0A372 YI SYLLABLE CHU +0A373 YI SYLLABLE CHUP +0A374 YI SYLLABLE CHURX +0A375 YI SYLLABLE CHUR +0A376 YI SYLLABLE CHYT +0A377 YI SYLLABLE CHYX +0A378 YI SYLLABLE CHY +0A379 YI SYLLABLE CHYP +0A37A YI SYLLABLE CHYRX +0A37B YI SYLLABLE CHYR +0A37C YI SYLLABLE RRAX +0A37D YI SYLLABLE RRA +0A37E YI SYLLABLE RRUOX +0A37F YI SYLLABLE RRUO +0A380 YI SYLLABLE RROT +0A381 YI SYLLABLE RROX +0A382 YI SYLLABLE RRO +0A383 YI SYLLABLE RROP +0A384 YI SYLLABLE RRET +0A385 YI SYLLABLE RREX +0A386 YI SYLLABLE RRE +0A387 YI SYLLABLE RREP +0A388 YI SYLLABLE RRUT +0A389 YI SYLLABLE RRUX +0A38A YI SYLLABLE RRU +0A38B YI SYLLABLE RRUP +0A38C YI SYLLABLE RRURX +0A38D YI SYLLABLE RRUR +0A38E YI SYLLABLE RRYT +0A38F YI SYLLABLE RRYX +0A390 YI SYLLABLE RRY +0A391 YI SYLLABLE RRYP +0A392 YI SYLLABLE RRYRX +0A393 YI SYLLABLE RRYR +0A394 YI SYLLABLE NRAT +0A395 YI SYLLABLE NRAX +0A396 YI SYLLABLE NRA +0A397 YI SYLLABLE NRAP +0A398 YI SYLLABLE NROX +0A399 YI SYLLABLE NRO +0A39A YI SYLLABLE NROP +0A39B YI SYLLABLE NRET +0A39C YI SYLLABLE NREX +0A39D YI SYLLABLE NRE +0A39E YI SYLLABLE NREP +0A39F YI SYLLABLE NRUT +0A3A0 YI SYLLABLE NRUX +0A3A1 YI SYLLABLE NRU +0A3A2 YI SYLLABLE NRUP +0A3A3 YI SYLLABLE NRURX +0A3A4 YI SYLLABLE NRUR +0A3A5 YI SYLLABLE NRYT +0A3A6 YI SYLLABLE NRYX +0A3A7 YI SYLLABLE NRY +0A3A8 YI SYLLABLE NRYP +0A3A9 YI SYLLABLE NRYRX +0A3AA YI SYLLABLE NRYR +0A3AB YI SYLLABLE SHAT +0A3AC YI SYLLABLE SHAX +0A3AD YI SYLLABLE SHA +0A3AE YI SYLLABLE SHAP +0A3AF YI SYLLABLE SHUOX +0A3B0 YI SYLLABLE SHUO +0A3B1 YI SYLLABLE SHUOP +0A3B2 YI SYLLABLE SHOT +0A3B3 YI SYLLABLE SHOX +0A3B4 YI SYLLABLE SHO +0A3B5 YI SYLLABLE SHOP +0A3B6 YI SYLLABLE SHET +0A3B7 YI SYLLABLE SHEX +0A3B8 YI SYLLABLE SHE +0A3B9 YI SYLLABLE SHEP +0A3BA YI SYLLABLE SHUT +0A3BB YI SYLLABLE SHUX +0A3BC YI SYLLABLE SHU +0A3BD YI SYLLABLE SHUP +0A3BE YI SYLLABLE SHURX +0A3BF YI SYLLABLE SHUR +0A3C0 YI SYLLABLE SHYT +0A3C1 YI SYLLABLE SHYX +0A3C2 YI SYLLABLE SHY +0A3C3 YI SYLLABLE SHYP +0A3C4 YI SYLLABLE SHYRX +0A3C5 YI SYLLABLE SHYR +0A3C6 YI SYLLABLE RAT +0A3C7 YI SYLLABLE RAX +0A3C8 YI SYLLABLE RA +0A3C9 YI SYLLABLE RAP +0A3CA YI SYLLABLE RUOX +0A3CB YI SYLLABLE RUO +0A3CC YI SYLLABLE RUOP +0A3CD YI SYLLABLE ROT +0A3CE YI SYLLABLE ROX +0A3CF YI SYLLABLE RO +0A3D0 YI SYLLABLE ROP +0A3D1 YI SYLLABLE REX +0A3D2 YI SYLLABLE RE +0A3D3 YI SYLLABLE REP +0A3D4 YI SYLLABLE RUT +0A3D5 YI SYLLABLE RUX +0A3D6 YI SYLLABLE RU +0A3D7 YI SYLLABLE RUP +0A3D8 YI SYLLABLE RURX +0A3D9 YI SYLLABLE RUR +0A3DA YI SYLLABLE RYT +0A3DB YI SYLLABLE RYX +0A3DC YI SYLLABLE RY +0A3DD YI SYLLABLE RYP +0A3DE YI SYLLABLE RYRX +0A3DF YI SYLLABLE RYR +0A3E0 YI SYLLABLE JIT +0A3E1 YI SYLLABLE JIX +0A3E2 YI SYLLABLE JI +0A3E3 YI SYLLABLE JIP +0A3E4 YI SYLLABLE JIET +0A3E5 YI SYLLABLE JIEX +0A3E6 YI SYLLABLE JIE +0A3E7 YI SYLLABLE JIEP +0A3E8 YI SYLLABLE JUOT +0A3E9 YI SYLLABLE JUOX +0A3EA YI SYLLABLE JUO +0A3EB YI SYLLABLE JUOP +0A3EC YI SYLLABLE JOT +0A3ED YI SYLLABLE JOX +0A3EE YI SYLLABLE JO +0A3EF YI SYLLABLE JOP +0A3F0 YI SYLLABLE JUT +0A3F1 YI SYLLABLE JUX +0A3F2 YI SYLLABLE JU +0A3F3 YI SYLLABLE JUP +0A3F4 YI SYLLABLE JURX +0A3F5 YI SYLLABLE JUR +0A3F6 YI SYLLABLE JYT +0A3F7 YI SYLLABLE JYX +0A3F8 YI SYLLABLE JY +0A3F9 YI SYLLABLE JYP +0A3FA YI SYLLABLE JYRX +0A3FB YI SYLLABLE JYR +0A3FC YI SYLLABLE QIT +0A3FD YI SYLLABLE QIX +0A3FE YI SYLLABLE QI +0A3FF YI SYLLABLE QIP +0A400 YI SYLLABLE QIET +0A401 YI SYLLABLE QIEX +0A402 YI SYLLABLE QIE +0A403 YI SYLLABLE QIEP +0A404 YI SYLLABLE QUOT +0A405 YI SYLLABLE QUOX +0A406 YI SYLLABLE QUO +0A407 YI SYLLABLE QUOP +0A408 YI SYLLABLE QOT +0A409 YI SYLLABLE QOX +0A40A YI SYLLABLE QO +0A40B YI SYLLABLE QOP +0A40C YI SYLLABLE QUT +0A40D YI SYLLABLE QUX +0A40E YI SYLLABLE QU +0A40F YI SYLLABLE QUP +0A410 YI SYLLABLE QURX +0A411 YI SYLLABLE QUR +0A412 YI SYLLABLE QYT +0A413 YI SYLLABLE QYX +0A414 YI SYLLABLE QY +0A415 YI SYLLABLE QYP +0A416 YI SYLLABLE QYRX +0A417 YI SYLLABLE QYR +0A418 YI SYLLABLE JJIT +0A419 YI SYLLABLE JJIX +0A41A YI SYLLABLE JJI +0A41B YI SYLLABLE JJIP +0A41C YI SYLLABLE JJIET +0A41D YI SYLLABLE JJIEX +0A41E YI SYLLABLE JJIE +0A41F YI SYLLABLE JJIEP +0A420 YI SYLLABLE JJUOX +0A421 YI SYLLABLE JJUO +0A422 YI SYLLABLE JJUOP +0A423 YI SYLLABLE JJOT +0A424 YI SYLLABLE JJOX +0A425 YI SYLLABLE JJO +0A426 YI SYLLABLE JJOP +0A427 YI SYLLABLE JJUT +0A428 YI SYLLABLE JJUX +0A429 YI SYLLABLE JJU +0A42A YI SYLLABLE JJUP +0A42B YI SYLLABLE JJURX +0A42C YI SYLLABLE JJUR +0A42D YI SYLLABLE JJYT +0A42E YI SYLLABLE JJYX +0A42F YI SYLLABLE JJY +0A430 YI SYLLABLE JJYP +0A431 YI SYLLABLE NJIT +0A432 YI SYLLABLE NJIX +0A433 YI SYLLABLE NJI +0A434 YI SYLLABLE NJIP +0A435 YI SYLLABLE NJIET +0A436 YI SYLLABLE NJIEX +0A437 YI SYLLABLE NJIE +0A438 YI SYLLABLE NJIEP +0A439 YI SYLLABLE NJUOX +0A43A YI SYLLABLE NJUO +0A43B YI SYLLABLE NJOT +0A43C YI SYLLABLE NJOX +0A43D YI SYLLABLE NJO +0A43E YI SYLLABLE NJOP +0A43F YI SYLLABLE NJUX +0A440 YI SYLLABLE NJU +0A441 YI SYLLABLE NJUP +0A442 YI SYLLABLE NJURX +0A443 YI SYLLABLE NJUR +0A444 YI SYLLABLE NJYT +0A445 YI SYLLABLE NJYX +0A446 YI SYLLABLE NJY +0A447 YI SYLLABLE NJYP +0A448 YI SYLLABLE NJYRX +0A449 YI SYLLABLE NJYR +0A44A YI SYLLABLE NYIT +0A44B YI SYLLABLE NYIX +0A44C YI SYLLABLE NYI +0A44D YI SYLLABLE NYIP +0A44E YI SYLLABLE NYIET +0A44F YI SYLLABLE NYIEX +0A450 YI SYLLABLE NYIE +0A451 YI SYLLABLE NYIEP +0A452 YI SYLLABLE NYUOX +0A453 YI SYLLABLE NYUO +0A454 YI SYLLABLE NYUOP +0A455 YI SYLLABLE NYOT +0A456 YI SYLLABLE NYOX +0A457 YI SYLLABLE NYO +0A458 YI SYLLABLE NYOP +0A459 YI SYLLABLE NYUT +0A45A YI SYLLABLE NYUX +0A45B YI SYLLABLE NYU +0A45C YI SYLLABLE NYUP +0A45D YI SYLLABLE XIT +0A45E YI SYLLABLE XIX +0A45F YI SYLLABLE XI +0A460 YI SYLLABLE XIP +0A461 YI SYLLABLE XIET +0A462 YI SYLLABLE XIEX +0A463 YI SYLLABLE XIE +0A464 YI SYLLABLE XIEP +0A465 YI SYLLABLE XUOX +0A466 YI SYLLABLE XUO +0A467 YI SYLLABLE XOT +0A468 YI SYLLABLE XOX +0A469 YI SYLLABLE XO +0A46A YI SYLLABLE XOP +0A46B YI SYLLABLE XYT +0A46C YI SYLLABLE XYX +0A46D YI SYLLABLE XY +0A46E YI SYLLABLE XYP +0A46F YI SYLLABLE XYRX +0A470 YI SYLLABLE XYR +0A471 YI SYLLABLE YIT +0A472 YI SYLLABLE YIX +0A473 YI SYLLABLE YI +0A474 YI SYLLABLE YIP +0A475 YI SYLLABLE YIET +0A476 YI SYLLABLE YIEX +0A477 YI SYLLABLE YIE +0A478 YI SYLLABLE YIEP +0A479 YI SYLLABLE YUOT +0A47A YI SYLLABLE YUOX +0A47B YI SYLLABLE YUO +0A47C YI SYLLABLE YUOP +0A47D YI SYLLABLE YOT +0A47E YI SYLLABLE YOX +0A47F YI SYLLABLE YO +0A480 YI SYLLABLE YOP +0A481 YI SYLLABLE YUT +0A482 YI SYLLABLE YUX +0A483 YI SYLLABLE YU +0A484 YI SYLLABLE YUP +0A485 YI SYLLABLE YURX +0A486 YI SYLLABLE YUR +0A487 YI SYLLABLE YYT +0A488 YI SYLLABLE YYX +0A489 YI SYLLABLE YY +0A48A YI SYLLABLE YYP +0A48B YI SYLLABLE YYRX +0A48C YI SYLLABLE YYR +0A490 YI RADICAL QOT +0A491 YI RADICAL LI +0A492 YI RADICAL KIT +0A493 YI RADICAL NYIP +0A494 YI RADICAL CYP +0A495 YI RADICAL SSI +0A496 YI RADICAL GGOP +0A497 YI RADICAL GEP +0A498 YI RADICAL MI +0A499 YI RADICAL HXIT +0A49A YI RADICAL LYR +0A49B YI RADICAL BBUT +0A49C YI RADICAL MOP +0A49D YI RADICAL YO +0A49E YI RADICAL PUT +0A49F YI RADICAL HXUO +0A4A0 YI RADICAL TAT +0A4A1 YI RADICAL GA +0A4A2 YI RADICAL ZUP +0A4A3 YI RADICAL CYT +0A4A4 YI RADICAL DDUR +0A4A5 YI RADICAL BUR +0A4A6 YI RADICAL GGUO +0A4A7 YI RADICAL NYOP +0A4A8 YI RADICAL TU +0A4A9 YI RADICAL OP +0A4AA YI RADICAL JJUT +0A4AB YI RADICAL ZOT +0A4AC YI RADICAL PYT +0A4AD YI RADICAL HMO +0A4AE YI RADICAL YIT +0A4AF YI RADICAL VUR +0A4B0 YI RADICAL SHY +0A4B1 YI RADICAL VEP +0A4B2 YI RADICAL ZA +0A4B3 YI RADICAL JO +0A4B4 YI RADICAL NZUP +0A4B5 YI RADICAL JJY +0A4B6 YI RADICAL GOT +0A4B7 YI RADICAL JJIE +0A4B8 YI RADICAL WO +0A4B9 YI RADICAL DU +0A4BA YI RADICAL SHUR +0A4BB YI RADICAL LIE +0A4BC YI RADICAL CY +0A4BD YI RADICAL CUOP +0A4BE YI RADICAL CIP +0A4BF YI RADICAL HXOP +0A4C0 YI RADICAL SHAT +0A4C1 YI RADICAL ZUR +0A4C2 YI RADICAL SHOP +0A4C3 YI RADICAL CHE +0A4C4 YI RADICAL ZZIET +0A4C5 YI RADICAL NBIE +0A4C6 YI RADICAL KE +0A4D0 LISU LETTER BA +0A4D1 LISU LETTER PA +0A4D2 LISU LETTER PHA +0A4D3 LISU LETTER DA +0A4D4 LISU LETTER TA +0A4D5 LISU LETTER THA +0A4D6 LISU LETTER GA +0A4D7 LISU LETTER KA +0A4D8 LISU LETTER KHA +0A4D9 LISU LETTER JA +0A4DA LISU LETTER CA +0A4DB LISU LETTER CHA +0A4DC LISU LETTER DZA +0A4DD LISU LETTER TSA +0A4DE LISU LETTER TSHA +0A4DF LISU LETTER MA +0A4E0 LISU LETTER NA +0A4E1 LISU LETTER LA +0A4E2 LISU LETTER SA +0A4E3 LISU LETTER ZHA +0A4E4 LISU LETTER ZA +0A4E5 LISU LETTER NGA +0A4E6 LISU LETTER HA +0A4E7 LISU LETTER XA +0A4E8 LISU LETTER HHA +0A4E9 LISU LETTER FA +0A4EA LISU LETTER WA +0A4EB LISU LETTER SHA +0A4EC LISU LETTER YA +0A4ED LISU LETTER GHA +0A4EE LISU LETTER A +0A4EF LISU LETTER AE +0A4F0 LISU LETTER E +0A4F1 LISU LETTER EU +0A4F2 LISU LETTER I +0A4F3 LISU LETTER O +0A4F4 LISU LETTER U +0A4F5 LISU LETTER UE +0A4F6 LISU LETTER UH +0A4F7 LISU LETTER OE +0A4F8 LISU LETTER TONE MYA TI +0A4F9 LISU LETTER TONE NA PO +0A4FA LISU LETTER TONE MYA CYA +0A4FB LISU LETTER TONE MYA BO +0A4FC LISU LETTER TONE MYA NA +0A4FD LISU LETTER TONE MYA JEU +0A4FE LISU PUNCTUATION COMMA +0A4FF LISU PUNCTUATION FULL STOP +0A500 VAI SYLLABLE EE +0A501 VAI SYLLABLE EEN +0A502 VAI SYLLABLE HEE +0A503 VAI SYLLABLE WEE +0A504 VAI SYLLABLE WEEN +0A505 VAI SYLLABLE PEE +0A506 VAI SYLLABLE BHEE +0A507 VAI SYLLABLE BEE +0A508 VAI SYLLABLE MBEE +0A509 VAI SYLLABLE KPEE +0A50A VAI SYLLABLE MGBEE +0A50B VAI SYLLABLE GBEE +0A50C VAI SYLLABLE FEE +0A50D VAI SYLLABLE VEE +0A50E VAI SYLLABLE TEE +0A50F VAI SYLLABLE THEE +0A510 VAI SYLLABLE DHEE +0A511 VAI SYLLABLE DHHEE +0A512 VAI SYLLABLE LEE +0A513 VAI SYLLABLE REE +0A514 VAI SYLLABLE DEE +0A515 VAI SYLLABLE NDEE +0A516 VAI SYLLABLE SEE +0A517 VAI SYLLABLE SHEE +0A518 VAI SYLLABLE ZEE +0A519 VAI SYLLABLE ZHEE +0A51A VAI SYLLABLE CEE +0A51B VAI SYLLABLE JEE +0A51C VAI SYLLABLE NJEE +0A51D VAI SYLLABLE YEE +0A51E VAI SYLLABLE KEE +0A51F VAI SYLLABLE NGGEE +0A520 VAI SYLLABLE GEE +0A521 VAI SYLLABLE MEE +0A522 VAI SYLLABLE NEE +0A523 VAI SYLLABLE NYEE +0A524 VAI SYLLABLE I +0A525 VAI SYLLABLE IN +0A526 VAI SYLLABLE HI +0A527 VAI SYLLABLE HIN +0A528 VAI SYLLABLE WI +0A529 VAI SYLLABLE WIN +0A52A VAI SYLLABLE PI +0A52B VAI SYLLABLE BHI +0A52C VAI SYLLABLE BI +0A52D VAI SYLLABLE MBI +0A52E VAI SYLLABLE KPI +0A52F VAI SYLLABLE MGBI +0A530 VAI SYLLABLE GBI +0A531 VAI SYLLABLE FI +0A532 VAI SYLLABLE VI +0A533 VAI SYLLABLE TI +0A534 VAI SYLLABLE THI +0A535 VAI SYLLABLE DHI +0A536 VAI SYLLABLE DHHI +0A537 VAI SYLLABLE LI +0A538 VAI SYLLABLE RI +0A539 VAI SYLLABLE DI +0A53A VAI SYLLABLE NDI +0A53B VAI SYLLABLE SI +0A53C VAI SYLLABLE SHI +0A53D VAI SYLLABLE ZI +0A53E VAI SYLLABLE ZHI +0A53F VAI SYLLABLE CI +0A540 VAI SYLLABLE JI +0A541 VAI SYLLABLE NJI +0A542 VAI SYLLABLE YI +0A543 VAI SYLLABLE KI +0A544 VAI SYLLABLE NGGI +0A545 VAI SYLLABLE GI +0A546 VAI SYLLABLE MI +0A547 VAI SYLLABLE NI +0A548 VAI SYLLABLE NYI +0A549 VAI SYLLABLE A +0A54A VAI SYLLABLE AN +0A54B VAI SYLLABLE NGAN +0A54C VAI SYLLABLE HA +0A54D VAI SYLLABLE HAN +0A54E VAI SYLLABLE WA +0A54F VAI SYLLABLE WAN +0A550 VAI SYLLABLE PA +0A551 VAI SYLLABLE BHA +0A552 VAI SYLLABLE BA +0A553 VAI SYLLABLE MBA +0A554 VAI SYLLABLE KPA +0A555 VAI SYLLABLE KPAN +0A556 VAI SYLLABLE MGBA +0A557 VAI SYLLABLE GBA +0A558 VAI SYLLABLE FA +0A559 VAI SYLLABLE VA +0A55A VAI SYLLABLE TA +0A55B VAI SYLLABLE THA +0A55C VAI SYLLABLE DHA +0A55D VAI SYLLABLE DHHA +0A55E VAI SYLLABLE LA +0A55F VAI SYLLABLE RA +0A560 VAI SYLLABLE DA +0A561 VAI SYLLABLE NDA +0A562 VAI SYLLABLE SA +0A563 VAI SYLLABLE SHA +0A564 VAI SYLLABLE ZA +0A565 VAI SYLLABLE ZHA +0A566 VAI SYLLABLE CA +0A567 VAI SYLLABLE JA +0A568 VAI SYLLABLE NJA +0A569 VAI SYLLABLE YA +0A56A VAI SYLLABLE KA +0A56B VAI SYLLABLE KAN +0A56C VAI SYLLABLE NGGA +0A56D VAI SYLLABLE GA +0A56E VAI SYLLABLE MA +0A56F VAI SYLLABLE NA +0A570 VAI SYLLABLE NYA +0A571 VAI SYLLABLE OO +0A572 VAI SYLLABLE OON +0A573 VAI SYLLABLE HOO +0A574 VAI SYLLABLE WOO +0A575 VAI SYLLABLE WOON +0A576 VAI SYLLABLE POO +0A577 VAI SYLLABLE BHOO +0A578 VAI SYLLABLE BOO +0A579 VAI SYLLABLE MBOO +0A57A VAI SYLLABLE KPOO +0A57B VAI SYLLABLE MGBOO +0A57C VAI SYLLABLE GBOO +0A57D VAI SYLLABLE FOO +0A57E VAI SYLLABLE VOO +0A57F VAI SYLLABLE TOO +0A580 VAI SYLLABLE THOO +0A581 VAI SYLLABLE DHOO +0A582 VAI SYLLABLE DHHOO +0A583 VAI SYLLABLE LOO +0A584 VAI SYLLABLE ROO +0A585 VAI SYLLABLE DOO +0A586 VAI SYLLABLE NDOO +0A587 VAI SYLLABLE SOO +0A588 VAI SYLLABLE SHOO +0A589 VAI SYLLABLE ZOO +0A58A VAI SYLLABLE ZHOO +0A58B VAI SYLLABLE COO +0A58C VAI SYLLABLE JOO +0A58D VAI SYLLABLE NJOO +0A58E VAI SYLLABLE YOO +0A58F VAI SYLLABLE KOO +0A590 VAI SYLLABLE NGGOO +0A591 VAI SYLLABLE GOO +0A592 VAI SYLLABLE MOO +0A593 VAI SYLLABLE NOO +0A594 VAI SYLLABLE NYOO +0A595 VAI SYLLABLE U +0A596 VAI SYLLABLE UN +0A597 VAI SYLLABLE HU +0A598 VAI SYLLABLE HUN +0A599 VAI SYLLABLE WU +0A59A VAI SYLLABLE WUN +0A59B VAI SYLLABLE PU +0A59C VAI SYLLABLE BHU +0A59D VAI SYLLABLE BU +0A59E VAI SYLLABLE MBU +0A59F VAI SYLLABLE KPU +0A5A0 VAI SYLLABLE MGBU +0A5A1 VAI SYLLABLE GBU +0A5A2 VAI SYLLABLE FU +0A5A3 VAI SYLLABLE VU +0A5A4 VAI SYLLABLE TU +0A5A5 VAI SYLLABLE THU +0A5A6 VAI SYLLABLE DHU +0A5A7 VAI SYLLABLE DHHU +0A5A8 VAI SYLLABLE LU +0A5A9 VAI SYLLABLE RU +0A5AA VAI SYLLABLE DU +0A5AB VAI SYLLABLE NDU +0A5AC VAI SYLLABLE SU +0A5AD VAI SYLLABLE SHU +0A5AE VAI SYLLABLE ZU +0A5AF VAI SYLLABLE ZHU +0A5B0 VAI SYLLABLE CU +0A5B1 VAI SYLLABLE JU +0A5B2 VAI SYLLABLE NJU +0A5B3 VAI SYLLABLE YU +0A5B4 VAI SYLLABLE KU +0A5B5 VAI SYLLABLE NGGU +0A5B6 VAI SYLLABLE GU +0A5B7 VAI SYLLABLE MU +0A5B8 VAI SYLLABLE NU +0A5B9 VAI SYLLABLE NYU +0A5BA VAI SYLLABLE O +0A5BB VAI SYLLABLE ON +0A5BC VAI SYLLABLE NGON +0A5BD VAI SYLLABLE HO +0A5BE VAI SYLLABLE HON +0A5BF VAI SYLLABLE WO +0A5C0 VAI SYLLABLE WON +0A5C1 VAI SYLLABLE PO +0A5C2 VAI SYLLABLE BHO +0A5C3 VAI SYLLABLE BO +0A5C4 VAI SYLLABLE MBO +0A5C5 VAI SYLLABLE KPO +0A5C6 VAI SYLLABLE MGBO +0A5C7 VAI SYLLABLE GBO +0A5C8 VAI SYLLABLE GBON +0A5C9 VAI SYLLABLE FO +0A5CA VAI SYLLABLE VO +0A5CB VAI SYLLABLE TO +0A5CC VAI SYLLABLE THO +0A5CD VAI SYLLABLE DHO +0A5CE VAI SYLLABLE DHHO +0A5CF VAI SYLLABLE LO +0A5D0 VAI SYLLABLE RO +0A5D1 VAI SYLLABLE DO +0A5D2 VAI SYLLABLE NDO +0A5D3 VAI SYLLABLE SO +0A5D4 VAI SYLLABLE SHO +0A5D5 VAI SYLLABLE ZO +0A5D6 VAI SYLLABLE ZHO +0A5D7 VAI SYLLABLE CO +0A5D8 VAI SYLLABLE JO +0A5D9 VAI SYLLABLE NJO +0A5DA VAI SYLLABLE YO +0A5DB VAI SYLLABLE KO +0A5DC VAI SYLLABLE NGGO +0A5DD VAI SYLLABLE GO +0A5DE VAI SYLLABLE MO +0A5DF VAI SYLLABLE NO +0A5E0 VAI SYLLABLE NYO +0A5E1 VAI SYLLABLE E +0A5E2 VAI SYLLABLE EN +0A5E3 VAI SYLLABLE NGEN +0A5E4 VAI SYLLABLE HE +0A5E5 VAI SYLLABLE HEN +0A5E6 VAI SYLLABLE WE +0A5E7 VAI SYLLABLE WEN +0A5E8 VAI SYLLABLE PE +0A5E9 VAI SYLLABLE BHE +0A5EA VAI SYLLABLE BE +0A5EB VAI SYLLABLE MBE +0A5EC VAI SYLLABLE KPE +0A5ED VAI SYLLABLE KPEN +0A5EE VAI SYLLABLE MGBE +0A5EF VAI SYLLABLE GBE +0A5F0 VAI SYLLABLE GBEN +0A5F1 VAI SYLLABLE FE +0A5F2 VAI SYLLABLE VE +0A5F3 VAI SYLLABLE TE +0A5F4 VAI SYLLABLE THE +0A5F5 VAI SYLLABLE DHE +0A5F6 VAI SYLLABLE DHHE +0A5F7 VAI SYLLABLE LE +0A5F8 VAI SYLLABLE RE +0A5F9 VAI SYLLABLE DE +0A5FA VAI SYLLABLE NDE +0A5FB VAI SYLLABLE SE +0A5FC VAI SYLLABLE SHE +0A5FD VAI SYLLABLE ZE +0A5FE VAI SYLLABLE ZHE +0A5FF VAI SYLLABLE CE +0A600 VAI SYLLABLE JE +0A601 VAI SYLLABLE NJE +0A602 VAI SYLLABLE YE +0A603 VAI SYLLABLE KE +0A604 VAI SYLLABLE NGGE +0A605 VAI SYLLABLE NGGEN +0A606 VAI SYLLABLE GE +0A607 VAI SYLLABLE GEN +0A608 VAI SYLLABLE ME +0A609 VAI SYLLABLE NE +0A60A VAI SYLLABLE NYE +0A60B VAI SYLLABLE NG +0A60C VAI SYLLABLE LENGTHENER +0A60D VAI COMMA +0A60E VAI FULL STOP +0A60F VAI QUESTION MARK +0A610 VAI SYLLABLE NDOLE FA +0A611 VAI SYLLABLE NDOLE KA +0A612 VAI SYLLABLE NDOLE SOO +0A613 VAI SYMBOL FEENG +0A614 VAI SYMBOL KEENG +0A615 VAI SYMBOL TING +0A616 VAI SYMBOL NII +0A617 VAI SYMBOL BANG +0A618 VAI SYMBOL FAA +0A619 VAI SYMBOL TAA +0A61A VAI SYMBOL DANG +0A61B VAI SYMBOL DOONG +0A61C VAI SYMBOL KUNG +0A61D VAI SYMBOL TONG +0A61E VAI SYMBOL DO-O +0A61F VAI SYMBOL JONG +0A620 VAI DIGIT ZERO +0A621 VAI DIGIT ONE +0A622 VAI DIGIT TWO +0A623 VAI DIGIT THREE +0A624 VAI DIGIT FOUR +0A625 VAI DIGIT FIVE +0A626 VAI DIGIT SIX +0A627 VAI DIGIT SEVEN +0A628 VAI DIGIT EIGHT +0A629 VAI DIGIT NINE +0A62A VAI SYLLABLE NDOLE MA +0A62B VAI SYLLABLE NDOLE DO +0A640 CYRILLIC CAPITAL LETTER ZEMLYA +0A641 CYRILLIC SMALL LETTER ZEMLYA +0A642 CYRILLIC CAPITAL LETTER DZELO +0A643 CYRILLIC SMALL LETTER DZELO +0A644 CYRILLIC CAPITAL LETTER REVERSED DZE +0A645 CYRILLIC SMALL LETTER REVERSED DZE +0A646 CYRILLIC CAPITAL LETTER IOTA +0A647 CYRILLIC SMALL LETTER IOTA +0A648 CYRILLIC CAPITAL LETTER DJERV +0A649 CYRILLIC SMALL LETTER DJERV +0A64A CYRILLIC CAPITAL LETTER MONOGRAPH UK +0A64B CYRILLIC SMALL LETTER MONOGRAPH UK +0A64C CYRILLIC CAPITAL LETTER BROAD OMEGA +0A64D CYRILLIC SMALL LETTER BROAD OMEGA +0A64E CYRILLIC CAPITAL LETTER NEUTRAL YER +0A64F CYRILLIC SMALL LETTER NEUTRAL YER +0A650 CYRILLIC CAPITAL LETTER YERU WITH BACK YER +0A651 CYRILLIC SMALL LETTER YERU WITH BACK YER +0A652 CYRILLIC CAPITAL LETTER IOTIFIED YAT +0A653 CYRILLIC SMALL LETTER IOTIFIED YAT +0A654 CYRILLIC CAPITAL LETTER REVERSED YU +0A655 CYRILLIC SMALL LETTER REVERSED YU +0A656 CYRILLIC CAPITAL LETTER IOTIFIED A +0A657 CYRILLIC SMALL LETTER IOTIFIED A +0A658 CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +0A659 CYRILLIC SMALL LETTER CLOSED LITTLE YUS +0A65A CYRILLIC CAPITAL LETTER BLENDED YUS +0A65B CYRILLIC SMALL LETTER BLENDED YUS +0A65C CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +0A65D CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS +0A65E CYRILLIC CAPITAL LETTER YN +0A65F CYRILLIC SMALL LETTER YN +0A660 CYRILLIC CAPITAL LETTER REVERSED TSE +0A661 CYRILLIC SMALL LETTER REVERSED TSE +0A662 CYRILLIC CAPITAL LETTER SOFT DE +0A663 CYRILLIC SMALL LETTER SOFT DE +0A664 CYRILLIC CAPITAL LETTER SOFT EL +0A665 CYRILLIC SMALL LETTER SOFT EL +0A666 CYRILLIC CAPITAL LETTER SOFT EM +0A667 CYRILLIC SMALL LETTER SOFT EM +0A668 CYRILLIC CAPITAL LETTER MONOCULAR O +0A669 CYRILLIC SMALL LETTER MONOCULAR O +0A66A CYRILLIC CAPITAL LETTER BINOCULAR O +0A66B CYRILLIC SMALL LETTER BINOCULAR O +0A66C CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +0A66D CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +0A66E CYRILLIC LETTER MULTIOCULAR O +0A66F COMBINING CYRILLIC VZMET +0A670 COMBINING CYRILLIC TEN MILLIONS SIGN +0A671 COMBINING CYRILLIC HUNDRED MILLIONS SIGN +0A672 COMBINING CYRILLIC THOUSAND MILLIONS SIGN +0A673 SLAVONIC ASTERISK +0A674 COMBINING CYRILLIC LETTER UKRAINIAN IE +0A675 COMBINING CYRILLIC LETTER I +0A676 COMBINING CYRILLIC LETTER YI +0A677 COMBINING CYRILLIC LETTER U +0A678 COMBINING CYRILLIC LETTER HARD SIGN +0A679 COMBINING CYRILLIC LETTER YERU +0A67A COMBINING CYRILLIC LETTER SOFT SIGN +0A67B COMBINING CYRILLIC LETTER OMEGA +0A67C COMBINING CYRILLIC KAVYKA +0A67D COMBINING CYRILLIC PAYEROK +0A67E CYRILLIC KAVYKA +0A67F CYRILLIC PAYEROK +0A680 CYRILLIC CAPITAL LETTER DWE +0A681 CYRILLIC SMALL LETTER DWE +0A682 CYRILLIC CAPITAL LETTER DZWE +0A683 CYRILLIC SMALL LETTER DZWE +0A684 CYRILLIC CAPITAL LETTER ZHWE +0A685 CYRILLIC SMALL LETTER ZHWE +0A686 CYRILLIC CAPITAL LETTER CCHE +0A687 CYRILLIC SMALL LETTER CCHE +0A688 CYRILLIC CAPITAL LETTER DZZE +0A689 CYRILLIC SMALL LETTER DZZE +0A68A CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +0A68B CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK +0A68C CYRILLIC CAPITAL LETTER TWE +0A68D CYRILLIC SMALL LETTER TWE +0A68E CYRILLIC CAPITAL LETTER TSWE +0A68F CYRILLIC SMALL LETTER TSWE +0A690 CYRILLIC CAPITAL LETTER TSSE +0A691 CYRILLIC SMALL LETTER TSSE +0A692 CYRILLIC CAPITAL LETTER TCHE +0A693 CYRILLIC SMALL LETTER TCHE +0A694 CYRILLIC CAPITAL LETTER HWE +0A695 CYRILLIC SMALL LETTER HWE +0A696 CYRILLIC CAPITAL LETTER SHWE +0A697 CYRILLIC SMALL LETTER SHWE +0A698 CYRILLIC CAPITAL LETTER DOUBLE O +0A699 CYRILLIC SMALL LETTER DOUBLE O +0A69A CYRILLIC CAPITAL LETTER CROSSED O +0A69B CYRILLIC SMALL LETTER CROSSED O +0A69C MODIFIER LETTER CYRILLIC HARD SIGN +0A69D MODIFIER LETTER CYRILLIC SOFT SIGN +0A69E COMBINING CYRILLIC LETTER EF +0A69F COMBINING CYRILLIC LETTER IOTIFIED E +0A6A0 BAMUM LETTER A +0A6A1 BAMUM LETTER KA +0A6A2 BAMUM LETTER U +0A6A3 BAMUM LETTER KU +0A6A4 BAMUM LETTER EE +0A6A5 BAMUM LETTER REE +0A6A6 BAMUM LETTER TAE +0A6A7 BAMUM LETTER O +0A6A8 BAMUM LETTER NYI +0A6A9 BAMUM LETTER I +0A6AA BAMUM LETTER LA +0A6AB BAMUM LETTER PA +0A6AC BAMUM LETTER RII +0A6AD BAMUM LETTER RIEE +0A6AE BAMUM LETTER LEEEE +0A6AF BAMUM LETTER MEEEE +0A6B0 BAMUM LETTER TAA +0A6B1 BAMUM LETTER NDAA +0A6B2 BAMUM LETTER NJAEM +0A6B3 BAMUM LETTER M +0A6B4 BAMUM LETTER SUU +0A6B5 BAMUM LETTER MU +0A6B6 BAMUM LETTER SHII +0A6B7 BAMUM LETTER SI +0A6B8 BAMUM LETTER SHEUX +0A6B9 BAMUM LETTER SEUX +0A6BA BAMUM LETTER KYEE +0A6BB BAMUM LETTER KET +0A6BC BAMUM LETTER NUAE +0A6BD BAMUM LETTER NU +0A6BE BAMUM LETTER NJUAE +0A6BF BAMUM LETTER YOQ +0A6C0 BAMUM LETTER SHU +0A6C1 BAMUM LETTER YUQ +0A6C2 BAMUM LETTER YA +0A6C3 BAMUM LETTER NSHA +0A6C4 BAMUM LETTER KEUX +0A6C5 BAMUM LETTER PEUX +0A6C6 BAMUM LETTER NJEE +0A6C7 BAMUM LETTER NTEE +0A6C8 BAMUM LETTER PUE +0A6C9 BAMUM LETTER WUE +0A6CA BAMUM LETTER PEE +0A6CB BAMUM LETTER FEE +0A6CC BAMUM LETTER RU +0A6CD BAMUM LETTER LU +0A6CE BAMUM LETTER MI +0A6CF BAMUM LETTER NI +0A6D0 BAMUM LETTER REUX +0A6D1 BAMUM LETTER RAE +0A6D2 BAMUM LETTER KEN +0A6D3 BAMUM LETTER NGKWAEN +0A6D4 BAMUM LETTER NGGA +0A6D5 BAMUM LETTER NGA +0A6D6 BAMUM LETTER SHO +0A6D7 BAMUM LETTER PUAE +0A6D8 BAMUM LETTER FU +0A6D9 BAMUM LETTER FOM +0A6DA BAMUM LETTER WA +0A6DB BAMUM LETTER NA +0A6DC BAMUM LETTER LI +0A6DD BAMUM LETTER PI +0A6DE BAMUM LETTER LOQ +0A6DF BAMUM LETTER KO +0A6E0 BAMUM LETTER MBEN +0A6E1 BAMUM LETTER REN +0A6E2 BAMUM LETTER MEN +0A6E3 BAMUM LETTER MA +0A6E4 BAMUM LETTER TI +0A6E5 BAMUM LETTER KI +0A6E6 BAMUM LETTER MO +0A6E7 BAMUM LETTER MBAA +0A6E8 BAMUM LETTER TET +0A6E9 BAMUM LETTER KPA +0A6EA BAMUM LETTER TEN +0A6EB BAMUM LETTER NTUU +0A6EC BAMUM LETTER SAMBA +0A6ED BAMUM LETTER FAAMAE +0A6EE BAMUM LETTER KOVUU +0A6EF BAMUM LETTER KOGHOM +0A6F0 BAMUM COMBINING MARK KOQNDON +0A6F1 BAMUM COMBINING MARK TUKWENTIS +0A6F2 BAMUM NJAEMLI +0A6F3 BAMUM FULL STOP +0A6F4 BAMUM COLON +0A6F5 BAMUM COMMA +0A6F6 BAMUM SEMICOLON +0A6F7 BAMUM QUESTION MARK +0A700 MODIFIER LETTER CHINESE TONE YIN PING +0A701 MODIFIER LETTER CHINESE TONE YANG PING +0A702 MODIFIER LETTER CHINESE TONE YIN SHANG +0A703 MODIFIER LETTER CHINESE TONE YANG SHANG +0A704 MODIFIER LETTER CHINESE TONE YIN QU +0A705 MODIFIER LETTER CHINESE TONE YANG QU +0A706 MODIFIER LETTER CHINESE TONE YIN RU +0A707 MODIFIER LETTER CHINESE TONE YANG RU +0A708 MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR +0A709 MODIFIER LETTER HIGH DOTTED TONE BAR +0A70A MODIFIER LETTER MID DOTTED TONE BAR +0A70B MODIFIER LETTER LOW DOTTED TONE BAR +0A70C MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR +0A70D MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR +0A70E MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR +0A70F MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR +0A710 MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR +0A711 MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR +0A712 MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR +0A713 MODIFIER LETTER HIGH LEFT-STEM TONE BAR +0A714 MODIFIER LETTER MID LEFT-STEM TONE BAR +0A715 MODIFIER LETTER LOW LEFT-STEM TONE BAR +0A716 MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +0A717 MODIFIER LETTER DOT VERTICAL BAR +0A718 MODIFIER LETTER DOT SLASH +0A719 MODIFIER LETTER DOT HORIZONTAL BAR +0A71A MODIFIER LETTER LOWER RIGHT CORNER ANGLE +0A71B MODIFIER LETTER RAISED UP ARROW +0A71C MODIFIER LETTER RAISED DOWN ARROW +0A71D MODIFIER LETTER RAISED EXCLAMATION MARK +0A71E MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK +0A71F MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +0A720 MODIFIER LETTER STRESS AND HIGH TONE +0A721 MODIFIER LETTER STRESS AND LOW TONE +0A722 LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +0A723 LATIN SMALL LETTER EGYPTOLOGICAL ALEF +0A724 LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +0A725 LATIN SMALL LETTER EGYPTOLOGICAL AIN +0A726 LATIN CAPITAL LETTER HENG +0A727 LATIN SMALL LETTER HENG +0A728 LATIN CAPITAL LETTER TZ +0A729 LATIN SMALL LETTER TZ +0A72A LATIN CAPITAL LETTER TRESILLO +0A72B LATIN SMALL LETTER TRESILLO +0A72C LATIN CAPITAL LETTER CUATRILLO +0A72D LATIN SMALL LETTER CUATRILLO +0A72E LATIN CAPITAL LETTER CUATRILLO WITH COMMA +0A72F LATIN SMALL LETTER CUATRILLO WITH COMMA +0A730 LATIN LETTER SMALL CAPITAL F +0A731 LATIN LETTER SMALL CAPITAL S +0A732 LATIN CAPITAL LETTER AA +0A733 LATIN SMALL LETTER AA +0A734 LATIN CAPITAL LETTER AO +0A735 LATIN SMALL LETTER AO +0A736 LATIN CAPITAL LETTER AU +0A737 LATIN SMALL LETTER AU +0A738 LATIN CAPITAL LETTER AV +0A739 LATIN SMALL LETTER AV +0A73A LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +0A73B LATIN SMALL LETTER AV WITH HORIZONTAL BAR +0A73C LATIN CAPITAL LETTER AY +0A73D LATIN SMALL LETTER AY +0A73E LATIN CAPITAL LETTER REVERSED C WITH DOT +0A73F LATIN SMALL LETTER REVERSED C WITH DOT +0A740 LATIN CAPITAL LETTER K WITH STROKE +0A741 LATIN SMALL LETTER K WITH STROKE +0A742 LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +0A743 LATIN SMALL LETTER K WITH DIAGONAL STROKE +0A744 LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +0A745 LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE +0A746 LATIN CAPITAL LETTER BROKEN L +0A747 LATIN SMALL LETTER BROKEN L +0A748 LATIN CAPITAL LETTER L WITH HIGH STROKE +0A749 LATIN SMALL LETTER L WITH HIGH STROKE +0A74A LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +0A74B LATIN SMALL LETTER O WITH LONG STROKE OVERLAY +0A74C LATIN CAPITAL LETTER O WITH LOOP +0A74D LATIN SMALL LETTER O WITH LOOP +0A74E LATIN CAPITAL LETTER OO +0A74F LATIN SMALL LETTER OO +0A750 LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +0A751 LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER +0A752 LATIN CAPITAL LETTER P WITH FLOURISH +0A753 LATIN SMALL LETTER P WITH FLOURISH +0A754 LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +0A755 LATIN SMALL LETTER P WITH SQUIRREL TAIL +0A756 LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +0A757 LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER +0A758 LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +0A759 LATIN SMALL LETTER Q WITH DIAGONAL STROKE +0A75A LATIN CAPITAL LETTER R ROTUNDA +0A75B LATIN SMALL LETTER R ROTUNDA +0A75C LATIN CAPITAL LETTER RUM ROTUNDA +0A75D LATIN SMALL LETTER RUM ROTUNDA +0A75E LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +0A75F LATIN SMALL LETTER V WITH DIAGONAL STROKE +0A760 LATIN CAPITAL LETTER VY +0A761 LATIN SMALL LETTER VY +0A762 LATIN CAPITAL LETTER VISIGOTHIC Z +0A763 LATIN SMALL LETTER VISIGOTHIC Z +0A764 LATIN CAPITAL LETTER THORN WITH STROKE +0A765 LATIN SMALL LETTER THORN WITH STROKE +0A766 LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +0A767 LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER +0A768 LATIN CAPITAL LETTER VEND +0A769 LATIN SMALL LETTER VEND +0A76A LATIN CAPITAL LETTER ET +0A76B LATIN SMALL LETTER ET +0A76C LATIN CAPITAL LETTER IS +0A76D LATIN SMALL LETTER IS +0A76E LATIN CAPITAL LETTER CON +0A76F LATIN SMALL LETTER CON +0A770 MODIFIER LETTER US +0A771 LATIN SMALL LETTER DUM +0A772 LATIN SMALL LETTER LUM +0A773 LATIN SMALL LETTER MUM +0A774 LATIN SMALL LETTER NUM +0A775 LATIN SMALL LETTER RUM +0A776 LATIN LETTER SMALL CAPITAL RUM +0A777 LATIN SMALL LETTER TUM +0A778 LATIN SMALL LETTER UM +0A779 LATIN CAPITAL LETTER INSULAR D +0A77A LATIN SMALL LETTER INSULAR D +0A77B LATIN CAPITAL LETTER INSULAR F +0A77C LATIN SMALL LETTER INSULAR F +0A77D LATIN CAPITAL LETTER INSULAR G +0A77E LATIN CAPITAL LETTER TURNED INSULAR G +0A77F LATIN SMALL LETTER TURNED INSULAR G +0A780 LATIN CAPITAL LETTER TURNED L +0A781 LATIN SMALL LETTER TURNED L +0A782 LATIN CAPITAL LETTER INSULAR R +0A783 LATIN SMALL LETTER INSULAR R +0A784 LATIN CAPITAL LETTER INSULAR S +0A785 LATIN SMALL LETTER INSULAR S +0A786 LATIN CAPITAL LETTER INSULAR T +0A787 LATIN SMALL LETTER INSULAR T +0A788 MODIFIER LETTER LOW CIRCUMFLEX ACCENT +0A789 MODIFIER LETTER COLON +0A78A MODIFIER LETTER SHORT EQUALS SIGN +0A78B LATIN CAPITAL LETTER SALTILLO +0A78C LATIN SMALL LETTER SALTILLO +0A78D LATIN CAPITAL LETTER TURNED H +0A78E LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +0A78F LATIN LETTER SINOLOGICAL DOT +0A790 LATIN CAPITAL LETTER N WITH DESCENDER +0A791 LATIN SMALL LETTER N WITH DESCENDER +0A792 LATIN CAPITAL LETTER C WITH BAR +0A793 LATIN SMALL LETTER C WITH BAR +0A794 LATIN SMALL LETTER C WITH PALATAL HOOK +0A795 LATIN SMALL LETTER H WITH PALATAL HOOK +0A796 LATIN CAPITAL LETTER B WITH FLOURISH +0A797 LATIN SMALL LETTER B WITH FLOURISH +0A798 LATIN CAPITAL LETTER F WITH STROKE +0A799 LATIN SMALL LETTER F WITH STROKE +0A79A LATIN CAPITAL LETTER VOLAPUK AE +0A79B LATIN SMALL LETTER VOLAPUK AE +0A79C LATIN CAPITAL LETTER VOLAPUK OE +0A79D LATIN SMALL LETTER VOLAPUK OE +0A79E LATIN CAPITAL LETTER VOLAPUK UE +0A79F LATIN SMALL LETTER VOLAPUK UE +0A7A0 LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +0A7A1 LATIN SMALL LETTER G WITH OBLIQUE STROKE +0A7A2 LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +0A7A3 LATIN SMALL LETTER K WITH OBLIQUE STROKE +0A7A4 LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +0A7A5 LATIN SMALL LETTER N WITH OBLIQUE STROKE +0A7A6 LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +0A7A7 LATIN SMALL LETTER R WITH OBLIQUE STROKE +0A7A8 LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +0A7A9 LATIN SMALL LETTER S WITH OBLIQUE STROKE +0A7AA LATIN CAPITAL LETTER H WITH HOOK +0A7AB LATIN CAPITAL LETTER REVERSED OPEN E +0A7AC LATIN CAPITAL LETTER SCRIPT G +0A7AD LATIN CAPITAL LETTER L WITH BELT +0A7AE LATIN CAPITAL LETTER SMALL CAPITAL I +0A7B0 LATIN CAPITAL LETTER TURNED K +0A7B1 LATIN CAPITAL LETTER TURNED T +0A7B2 LATIN CAPITAL LETTER J WITH CROSSED-TAIL +0A7B3 LATIN CAPITAL LETTER CHI +0A7B4 LATIN CAPITAL LETTER BETA +0A7B5 LATIN SMALL LETTER BETA +0A7B6 LATIN CAPITAL LETTER OMEGA +0A7B7 LATIN SMALL LETTER OMEGA +0A7F7 LATIN EPIGRAPHIC LETTER SIDEWAYS I +0A7F8 MODIFIER LETTER CAPITAL H WITH STROKE +0A7F9 MODIFIER LETTER SMALL LIGATURE OE +0A7FA LATIN LETTER SMALL CAPITAL TURNED M +0A7FB LATIN EPIGRAPHIC LETTER REVERSED F +0A7FC LATIN EPIGRAPHIC LETTER REVERSED P +0A7FD LATIN EPIGRAPHIC LETTER INVERTED M +0A7FE LATIN EPIGRAPHIC LETTER I LONGA +0A7FF LATIN EPIGRAPHIC LETTER ARCHAIC M +0A800 SYLOTI NAGRI LETTER A +0A801 SYLOTI NAGRI LETTER I +0A802 SYLOTI NAGRI SIGN DVISVARA +0A803 SYLOTI NAGRI LETTER U +0A804 SYLOTI NAGRI LETTER E +0A805 SYLOTI NAGRI LETTER O +0A806 SYLOTI NAGRI SIGN HASANTA +0A807 SYLOTI NAGRI LETTER KO +0A808 SYLOTI NAGRI LETTER KHO +0A809 SYLOTI NAGRI LETTER GO +0A80A SYLOTI NAGRI LETTER GHO +0A80B SYLOTI NAGRI SIGN ANUSVARA +0A80C SYLOTI NAGRI LETTER CO +0A80D SYLOTI NAGRI LETTER CHO +0A80E SYLOTI NAGRI LETTER JO +0A80F SYLOTI NAGRI LETTER JHO +0A810 SYLOTI NAGRI LETTER TTO +0A811 SYLOTI NAGRI LETTER TTHO +0A812 SYLOTI NAGRI LETTER DDO +0A813 SYLOTI NAGRI LETTER DDHO +0A814 SYLOTI NAGRI LETTER TO +0A815 SYLOTI NAGRI LETTER THO +0A816 SYLOTI NAGRI LETTER DO +0A817 SYLOTI NAGRI LETTER DHO +0A818 SYLOTI NAGRI LETTER NO +0A819 SYLOTI NAGRI LETTER PO +0A81A SYLOTI NAGRI LETTER PHO +0A81B SYLOTI NAGRI LETTER BO +0A81C SYLOTI NAGRI LETTER BHO +0A81D SYLOTI NAGRI LETTER MO +0A81E SYLOTI NAGRI LETTER RO +0A81F SYLOTI NAGRI LETTER LO +0A820 SYLOTI NAGRI LETTER RRO +0A821 SYLOTI NAGRI LETTER SO +0A822 SYLOTI NAGRI LETTER HO +0A823 SYLOTI NAGRI VOWEL SIGN A +0A824 SYLOTI NAGRI VOWEL SIGN I +0A825 SYLOTI NAGRI VOWEL SIGN U +0A826 SYLOTI NAGRI VOWEL SIGN E +0A827 SYLOTI NAGRI VOWEL SIGN OO +0A828 SYLOTI NAGRI POETRY MARK-1 +0A829 SYLOTI NAGRI POETRY MARK-2 +0A82A SYLOTI NAGRI POETRY MARK-3 +0A82B SYLOTI NAGRI POETRY MARK-4 +0A830 NORTH INDIC FRACTION ONE QUARTER +0A831 NORTH INDIC FRACTION ONE HALF +0A832 NORTH INDIC FRACTION THREE QUARTERS +0A833 NORTH INDIC FRACTION ONE SIXTEENTH +0A834 NORTH INDIC FRACTION ONE EIGHTH +0A835 NORTH INDIC FRACTION THREE SIXTEENTHS +0A836 NORTH INDIC QUARTER MARK +0A837 NORTH INDIC PLACEHOLDER MARK +0A838 NORTH INDIC RUPEE MARK +0A839 NORTH INDIC QUANTITY MARK +0A840 PHAGS-PA LETTER KA +0A841 PHAGS-PA LETTER KHA +0A842 PHAGS-PA LETTER GA +0A843 PHAGS-PA LETTER NGA +0A844 PHAGS-PA LETTER CA +0A845 PHAGS-PA LETTER CHA +0A846 PHAGS-PA LETTER JA +0A847 PHAGS-PA LETTER NYA +0A848 PHAGS-PA LETTER TA +0A849 PHAGS-PA LETTER THA +0A84A PHAGS-PA LETTER DA +0A84B PHAGS-PA LETTER NA +0A84C PHAGS-PA LETTER PA +0A84D PHAGS-PA LETTER PHA +0A84E PHAGS-PA LETTER BA +0A84F PHAGS-PA LETTER MA +0A850 PHAGS-PA LETTER TSA +0A851 PHAGS-PA LETTER TSHA +0A852 PHAGS-PA LETTER DZA +0A853 PHAGS-PA LETTER WA +0A854 PHAGS-PA LETTER ZHA +0A855 PHAGS-PA LETTER ZA +0A856 PHAGS-PA LETTER SMALL A +0A857 PHAGS-PA LETTER YA +0A858 PHAGS-PA LETTER RA +0A859 PHAGS-PA LETTER LA +0A85A PHAGS-PA LETTER SHA +0A85B PHAGS-PA LETTER SA +0A85C PHAGS-PA LETTER HA +0A85D PHAGS-PA LETTER A +0A85E PHAGS-PA LETTER I +0A85F PHAGS-PA LETTER U +0A860 PHAGS-PA LETTER E +0A861 PHAGS-PA LETTER O +0A862 PHAGS-PA LETTER QA +0A863 PHAGS-PA LETTER XA +0A864 PHAGS-PA LETTER FA +0A865 PHAGS-PA LETTER GGA +0A866 PHAGS-PA LETTER EE +0A867 PHAGS-PA SUBJOINED LETTER WA +0A868 PHAGS-PA SUBJOINED LETTER YA +0A869 PHAGS-PA LETTER TTA +0A86A PHAGS-PA LETTER TTHA +0A86B PHAGS-PA LETTER DDA +0A86C PHAGS-PA LETTER NNA +0A86D PHAGS-PA LETTER ALTERNATE YA +0A86E PHAGS-PA LETTER VOICELESS SHA +0A86F PHAGS-PA LETTER VOICED HA +0A870 PHAGS-PA LETTER ASPIRATED FA +0A871 PHAGS-PA SUBJOINED LETTER RA +0A872 PHAGS-PA SUPERFIXED LETTER RA +0A873 PHAGS-PA LETTER CANDRABINDU +0A874 PHAGS-PA SINGLE HEAD MARK +0A875 PHAGS-PA DOUBLE HEAD MARK +0A876 PHAGS-PA MARK SHAD +0A877 PHAGS-PA MARK DOUBLE SHAD +0A880 SAURASHTRA SIGN ANUSVARA +0A881 SAURASHTRA SIGN VISARGA +0A882 SAURASHTRA LETTER A +0A883 SAURASHTRA LETTER AA +0A884 SAURASHTRA LETTER I +0A885 SAURASHTRA LETTER II +0A886 SAURASHTRA LETTER U +0A887 SAURASHTRA LETTER UU +0A888 SAURASHTRA LETTER VOCALIC R +0A889 SAURASHTRA LETTER VOCALIC RR +0A88A SAURASHTRA LETTER VOCALIC L +0A88B SAURASHTRA LETTER VOCALIC LL +0A88C SAURASHTRA LETTER E +0A88D SAURASHTRA LETTER EE +0A88E SAURASHTRA LETTER AI +0A88F SAURASHTRA LETTER O +0A890 SAURASHTRA LETTER OO +0A891 SAURASHTRA LETTER AU +0A892 SAURASHTRA LETTER KA +0A893 SAURASHTRA LETTER KHA +0A894 SAURASHTRA LETTER GA +0A895 SAURASHTRA LETTER GHA +0A896 SAURASHTRA LETTER NGA +0A897 SAURASHTRA LETTER CA +0A898 SAURASHTRA LETTER CHA +0A899 SAURASHTRA LETTER JA +0A89A SAURASHTRA LETTER JHA +0A89B SAURASHTRA LETTER NYA +0A89C SAURASHTRA LETTER TTA +0A89D SAURASHTRA LETTER TTHA +0A89E SAURASHTRA LETTER DDA +0A89F SAURASHTRA LETTER DDHA +0A8A0 SAURASHTRA LETTER NNA +0A8A1 SAURASHTRA LETTER TA +0A8A2 SAURASHTRA LETTER THA +0A8A3 SAURASHTRA LETTER DA +0A8A4 SAURASHTRA LETTER DHA +0A8A5 SAURASHTRA LETTER NA +0A8A6 SAURASHTRA LETTER PA +0A8A7 SAURASHTRA LETTER PHA +0A8A8 SAURASHTRA LETTER BA +0A8A9 SAURASHTRA LETTER BHA +0A8AA SAURASHTRA LETTER MA +0A8AB SAURASHTRA LETTER YA +0A8AC SAURASHTRA LETTER RA +0A8AD SAURASHTRA LETTER LA +0A8AE SAURASHTRA LETTER VA +0A8AF SAURASHTRA LETTER SHA +0A8B0 SAURASHTRA LETTER SSA +0A8B1 SAURASHTRA LETTER SA +0A8B2 SAURASHTRA LETTER HA +0A8B3 SAURASHTRA LETTER LLA +0A8B4 SAURASHTRA CONSONANT SIGN HAARU +0A8B5 SAURASHTRA VOWEL SIGN AA +0A8B6 SAURASHTRA VOWEL SIGN I +0A8B7 SAURASHTRA VOWEL SIGN II +0A8B8 SAURASHTRA VOWEL SIGN U +0A8B9 SAURASHTRA VOWEL SIGN UU +0A8BA SAURASHTRA VOWEL SIGN VOCALIC R +0A8BB SAURASHTRA VOWEL SIGN VOCALIC RR +0A8BC SAURASHTRA VOWEL SIGN VOCALIC L +0A8BD SAURASHTRA VOWEL SIGN VOCALIC LL +0A8BE SAURASHTRA VOWEL SIGN E +0A8BF SAURASHTRA VOWEL SIGN EE +0A8C0 SAURASHTRA VOWEL SIGN AI +0A8C1 SAURASHTRA VOWEL SIGN O +0A8C2 SAURASHTRA VOWEL SIGN OO +0A8C3 SAURASHTRA VOWEL SIGN AU +0A8C4 SAURASHTRA SIGN VIRAMA +0A8C5 SAURASHTRA SIGN CANDRABINDU +0A8CE SAURASHTRA DANDA +0A8CF SAURASHTRA DOUBLE DANDA +0A8D0 SAURASHTRA DIGIT ZERO +0A8D1 SAURASHTRA DIGIT ONE +0A8D2 SAURASHTRA DIGIT TWO +0A8D3 SAURASHTRA DIGIT THREE +0A8D4 SAURASHTRA DIGIT FOUR +0A8D5 SAURASHTRA DIGIT FIVE +0A8D6 SAURASHTRA DIGIT SIX +0A8D7 SAURASHTRA DIGIT SEVEN +0A8D8 SAURASHTRA DIGIT EIGHT +0A8D9 SAURASHTRA DIGIT NINE +0A8E0 COMBINING DEVANAGARI DIGIT ZERO +0A8E1 COMBINING DEVANAGARI DIGIT ONE +0A8E2 COMBINING DEVANAGARI DIGIT TWO +0A8E3 COMBINING DEVANAGARI DIGIT THREE +0A8E4 COMBINING DEVANAGARI DIGIT FOUR +0A8E5 COMBINING DEVANAGARI DIGIT FIVE +0A8E6 COMBINING DEVANAGARI DIGIT SIX +0A8E7 COMBINING DEVANAGARI DIGIT SEVEN +0A8E8 COMBINING DEVANAGARI DIGIT EIGHT +0A8E9 COMBINING DEVANAGARI DIGIT NINE +0A8EA COMBINING DEVANAGARI LETTER A +0A8EB COMBINING DEVANAGARI LETTER U +0A8EC COMBINING DEVANAGARI LETTER KA +0A8ED COMBINING DEVANAGARI LETTER NA +0A8EE COMBINING DEVANAGARI LETTER PA +0A8EF COMBINING DEVANAGARI LETTER RA +0A8F0 COMBINING DEVANAGARI LETTER VI +0A8F1 COMBINING DEVANAGARI SIGN AVAGRAHA +0A8F2 DEVANAGARI SIGN SPACING CANDRABINDU +0A8F3 DEVANAGARI SIGN CANDRABINDU VIRAMA +0A8F4 DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA +0A8F5 DEVANAGARI SIGN CANDRABINDU TWO +0A8F6 DEVANAGARI SIGN CANDRABINDU THREE +0A8F7 DEVANAGARI SIGN CANDRABINDU AVAGRAHA +0A8F8 DEVANAGARI SIGN PUSHPIKA +0A8F9 DEVANAGARI GAP FILLER +0A8FA DEVANAGARI CARET +0A8FB DEVANAGARI HEADSTROKE +0A8FC DEVANAGARI SIGN SIDDHAM +0A8FD DEVANAGARI JAIN OM +0A900 KAYAH LI DIGIT ZERO +0A901 KAYAH LI DIGIT ONE +0A902 KAYAH LI DIGIT TWO +0A903 KAYAH LI DIGIT THREE +0A904 KAYAH LI DIGIT FOUR +0A905 KAYAH LI DIGIT FIVE +0A906 KAYAH LI DIGIT SIX +0A907 KAYAH LI DIGIT SEVEN +0A908 KAYAH LI DIGIT EIGHT +0A909 KAYAH LI DIGIT NINE +0A90A KAYAH LI LETTER KA +0A90B KAYAH LI LETTER KHA +0A90C KAYAH LI LETTER GA +0A90D KAYAH LI LETTER NGA +0A90E KAYAH LI LETTER SA +0A90F KAYAH LI LETTER SHA +0A910 KAYAH LI LETTER ZA +0A911 KAYAH LI LETTER NYA +0A912 KAYAH LI LETTER TA +0A913 KAYAH LI LETTER HTA +0A914 KAYAH LI LETTER NA +0A915 KAYAH LI LETTER PA +0A916 KAYAH LI LETTER PHA +0A917 KAYAH LI LETTER MA +0A918 KAYAH LI LETTER DA +0A919 KAYAH LI LETTER BA +0A91A KAYAH LI LETTER RA +0A91B KAYAH LI LETTER YA +0A91C KAYAH LI LETTER LA +0A91D KAYAH LI LETTER WA +0A91E KAYAH LI LETTER THA +0A91F KAYAH LI LETTER HA +0A920 KAYAH LI LETTER VA +0A921 KAYAH LI LETTER CA +0A922 KAYAH LI LETTER A +0A923 KAYAH LI LETTER OE +0A924 KAYAH LI LETTER I +0A925 KAYAH LI LETTER OO +0A926 KAYAH LI VOWEL UE +0A927 KAYAH LI VOWEL E +0A928 KAYAH LI VOWEL U +0A929 KAYAH LI VOWEL EE +0A92A KAYAH LI VOWEL O +0A92B KAYAH LI TONE PLOPHU +0A92C KAYAH LI TONE CALYA +0A92D KAYAH LI TONE CALYA PLOPHU +0A92E KAYAH LI SIGN CWI +0A92F KAYAH LI SIGN SHYA +0A930 REJANG LETTER KA +0A931 REJANG LETTER GA +0A932 REJANG LETTER NGA +0A933 REJANG LETTER TA +0A934 REJANG LETTER DA +0A935 REJANG LETTER NA +0A936 REJANG LETTER PA +0A937 REJANG LETTER BA +0A938 REJANG LETTER MA +0A939 REJANG LETTER CA +0A93A REJANG LETTER JA +0A93B REJANG LETTER NYA +0A93C REJANG LETTER SA +0A93D REJANG LETTER RA +0A93E REJANG LETTER LA +0A93F REJANG LETTER YA +0A940 REJANG LETTER WA +0A941 REJANG LETTER HA +0A942 REJANG LETTER MBA +0A943 REJANG LETTER NGGA +0A944 REJANG LETTER NDA +0A945 REJANG LETTER NYJA +0A946 REJANG LETTER A +0A947 REJANG VOWEL SIGN I +0A948 REJANG VOWEL SIGN U +0A949 REJANG VOWEL SIGN E +0A94A REJANG VOWEL SIGN AI +0A94B REJANG VOWEL SIGN O +0A94C REJANG VOWEL SIGN AU +0A94D REJANG VOWEL SIGN EU +0A94E REJANG VOWEL SIGN EA +0A94F REJANG CONSONANT SIGN NG +0A950 REJANG CONSONANT SIGN N +0A951 REJANG CONSONANT SIGN R +0A952 REJANG CONSONANT SIGN H +0A953 REJANG VIRAMA +0A95F REJANG SECTION MARK +0A960 HANGUL CHOSEONG TIKEUT-MIEUM +0A961 HANGUL CHOSEONG TIKEUT-PIEUP +0A962 HANGUL CHOSEONG TIKEUT-SIOS +0A963 HANGUL CHOSEONG TIKEUT-CIEUC +0A964 HANGUL CHOSEONG RIEUL-KIYEOK +0A965 HANGUL CHOSEONG RIEUL-SSANGKIYEOK +0A966 HANGUL CHOSEONG RIEUL-TIKEUT +0A967 HANGUL CHOSEONG RIEUL-SSANGTIKEUT +0A968 HANGUL CHOSEONG RIEUL-MIEUM +0A969 HANGUL CHOSEONG RIEUL-PIEUP +0A96A HANGUL CHOSEONG RIEUL-SSANGPIEUP +0A96B HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP +0A96C HANGUL CHOSEONG RIEUL-SIOS +0A96D HANGUL CHOSEONG RIEUL-CIEUC +0A96E HANGUL CHOSEONG RIEUL-KHIEUKH +0A96F HANGUL CHOSEONG MIEUM-KIYEOK +0A970 HANGUL CHOSEONG MIEUM-TIKEUT +0A971 HANGUL CHOSEONG MIEUM-SIOS +0A972 HANGUL CHOSEONG PIEUP-SIOS-THIEUTH +0A973 HANGUL CHOSEONG PIEUP-KHIEUKH +0A974 HANGUL CHOSEONG PIEUP-HIEUH +0A975 HANGUL CHOSEONG SSANGSIOS-PIEUP +0A976 HANGUL CHOSEONG IEUNG-RIEUL +0A977 HANGUL CHOSEONG IEUNG-HIEUH +0A978 HANGUL CHOSEONG SSANGCIEUC-HIEUH +0A979 HANGUL CHOSEONG SSANGTHIEUTH +0A97A HANGUL CHOSEONG PHIEUPH-HIEUH +0A97B HANGUL CHOSEONG HIEUH-SIOS +0A97C HANGUL CHOSEONG SSANGYEORINHIEUH +0A980 JAVANESE SIGN PANYANGGA +0A981 JAVANESE SIGN CECAK +0A982 JAVANESE SIGN LAYAR +0A983 JAVANESE SIGN WIGNYAN +0A984 JAVANESE LETTER A +0A985 JAVANESE LETTER I KAWI +0A986 JAVANESE LETTER I +0A987 JAVANESE LETTER II +0A988 JAVANESE LETTER U +0A989 JAVANESE LETTER PA CEREK +0A98A JAVANESE LETTER NGA LELET +0A98B JAVANESE LETTER NGA LELET RASWADI +0A98C JAVANESE LETTER E +0A98D JAVANESE LETTER AI +0A98E JAVANESE LETTER O +0A98F JAVANESE LETTER KA +0A990 JAVANESE LETTER KA SASAK +0A991 JAVANESE LETTER KA MURDA +0A992 JAVANESE LETTER GA +0A993 JAVANESE LETTER GA MURDA +0A994 JAVANESE LETTER NGA +0A995 JAVANESE LETTER CA +0A996 JAVANESE LETTER CA MURDA +0A997 JAVANESE LETTER JA +0A998 JAVANESE LETTER NYA MURDA +0A999 JAVANESE LETTER JA MAHAPRANA +0A99A JAVANESE LETTER NYA +0A99B JAVANESE LETTER TTA +0A99C JAVANESE LETTER TTA MAHAPRANA +0A99D JAVANESE LETTER DDA +0A99E JAVANESE LETTER DDA MAHAPRANA +0A99F JAVANESE LETTER NA MURDA +0A9A0 JAVANESE LETTER TA +0A9A1 JAVANESE LETTER TA MURDA +0A9A2 JAVANESE LETTER DA +0A9A3 JAVANESE LETTER DA MAHAPRANA +0A9A4 JAVANESE LETTER NA +0A9A5 JAVANESE LETTER PA +0A9A6 JAVANESE LETTER PA MURDA +0A9A7 JAVANESE LETTER BA +0A9A8 JAVANESE LETTER BA MURDA +0A9A9 JAVANESE LETTER MA +0A9AA JAVANESE LETTER YA +0A9AB JAVANESE LETTER RA +0A9AC JAVANESE LETTER RA AGUNG +0A9AD JAVANESE LETTER LA +0A9AE JAVANESE LETTER WA +0A9AF JAVANESE LETTER SA MURDA +0A9B0 JAVANESE LETTER SA MAHAPRANA +0A9B1 JAVANESE LETTER SA +0A9B2 JAVANESE LETTER HA +0A9B3 JAVANESE SIGN CECAK TELU +0A9B4 JAVANESE VOWEL SIGN TARUNG +0A9B5 JAVANESE VOWEL SIGN TOLONG +0A9B6 JAVANESE VOWEL SIGN WULU +0A9B7 JAVANESE VOWEL SIGN WULU MELIK +0A9B8 JAVANESE VOWEL SIGN SUKU +0A9B9 JAVANESE VOWEL SIGN SUKU MENDUT +0A9BA JAVANESE VOWEL SIGN TALING +0A9BB JAVANESE VOWEL SIGN DIRGA MURE +0A9BC JAVANESE VOWEL SIGN PEPET +0A9BD JAVANESE CONSONANT SIGN KERET +0A9BE JAVANESE CONSONANT SIGN PENGKAL +0A9BF JAVANESE CONSONANT SIGN CAKRA +0A9C0 JAVANESE PANGKON +0A9C1 JAVANESE LEFT RERENGGAN +0A9C2 JAVANESE RIGHT RERENGGAN +0A9C3 JAVANESE PADA ANDAP +0A9C4 JAVANESE PADA MADYA +0A9C5 JAVANESE PADA LUHUR +0A9C6 JAVANESE PADA WINDU +0A9C7 JAVANESE PADA PANGKAT +0A9C8 JAVANESE PADA LINGSA +0A9C9 JAVANESE PADA LUNGSI +0A9CA JAVANESE PADA ADEG +0A9CB JAVANESE PADA ADEG ADEG +0A9CC JAVANESE PADA PISELEH +0A9CD JAVANESE TURNED PADA PISELEH +0A9CF JAVANESE PANGRANGKEP +0A9D0 JAVANESE DIGIT ZERO +0A9D1 JAVANESE DIGIT ONE +0A9D2 JAVANESE DIGIT TWO +0A9D3 JAVANESE DIGIT THREE +0A9D4 JAVANESE DIGIT FOUR +0A9D5 JAVANESE DIGIT FIVE +0A9D6 JAVANESE DIGIT SIX +0A9D7 JAVANESE DIGIT SEVEN +0A9D8 JAVANESE DIGIT EIGHT +0A9D9 JAVANESE DIGIT NINE +0A9DE JAVANESE PADA TIRTA TUMETES +0A9DF JAVANESE PADA ISEN-ISEN +0A9E0 MYANMAR LETTER SHAN GHA +0A9E1 MYANMAR LETTER SHAN CHA +0A9E2 MYANMAR LETTER SHAN JHA +0A9E3 MYANMAR LETTER SHAN NNA +0A9E4 MYANMAR LETTER SHAN BHA +0A9E5 MYANMAR SIGN SHAN SAW +0A9E6 MYANMAR MODIFIER LETTER SHAN REDUPLICATION +0A9E7 MYANMAR LETTER TAI LAING NYA +0A9E8 MYANMAR LETTER TAI LAING FA +0A9E9 MYANMAR LETTER TAI LAING GA +0A9EA MYANMAR LETTER TAI LAING GHA +0A9EB MYANMAR LETTER TAI LAING JA +0A9EC MYANMAR LETTER TAI LAING JHA +0A9ED MYANMAR LETTER TAI LAING DDA +0A9EE MYANMAR LETTER TAI LAING DDHA +0A9EF MYANMAR LETTER TAI LAING NNA +0A9F0 MYANMAR TAI LAING DIGIT ZERO +0A9F1 MYANMAR TAI LAING DIGIT ONE +0A9F2 MYANMAR TAI LAING DIGIT TWO +0A9F3 MYANMAR TAI LAING DIGIT THREE +0A9F4 MYANMAR TAI LAING DIGIT FOUR +0A9F5 MYANMAR TAI LAING DIGIT FIVE +0A9F6 MYANMAR TAI LAING DIGIT SIX +0A9F7 MYANMAR TAI LAING DIGIT SEVEN +0A9F8 MYANMAR TAI LAING DIGIT EIGHT +0A9F9 MYANMAR TAI LAING DIGIT NINE +0A9FA MYANMAR LETTER TAI LAING LLA +0A9FB MYANMAR LETTER TAI LAING DA +0A9FC MYANMAR LETTER TAI LAING DHA +0A9FD MYANMAR LETTER TAI LAING BA +0A9FE MYANMAR LETTER TAI LAING BHA +0AA00 CHAM LETTER A +0AA01 CHAM LETTER I +0AA02 CHAM LETTER U +0AA03 CHAM LETTER E +0AA04 CHAM LETTER AI +0AA05 CHAM LETTER O +0AA06 CHAM LETTER KA +0AA07 CHAM LETTER KHA +0AA08 CHAM LETTER GA +0AA09 CHAM LETTER GHA +0AA0A CHAM LETTER NGUE +0AA0B CHAM LETTER NGA +0AA0C CHAM LETTER CHA +0AA0D CHAM LETTER CHHA +0AA0E CHAM LETTER JA +0AA0F CHAM LETTER JHA +0AA10 CHAM LETTER NHUE +0AA11 CHAM LETTER NHA +0AA12 CHAM LETTER NHJA +0AA13 CHAM LETTER TA +0AA14 CHAM LETTER THA +0AA15 CHAM LETTER DA +0AA16 CHAM LETTER DHA +0AA17 CHAM LETTER NUE +0AA18 CHAM LETTER NA +0AA19 CHAM LETTER DDA +0AA1A CHAM LETTER PA +0AA1B CHAM LETTER PPA +0AA1C CHAM LETTER PHA +0AA1D CHAM LETTER BA +0AA1E CHAM LETTER BHA +0AA1F CHAM LETTER MUE +0AA20 CHAM LETTER MA +0AA21 CHAM LETTER BBA +0AA22 CHAM LETTER YA +0AA23 CHAM LETTER RA +0AA24 CHAM LETTER LA +0AA25 CHAM LETTER VA +0AA26 CHAM LETTER SSA +0AA27 CHAM LETTER SA +0AA28 CHAM LETTER HA +0AA29 CHAM VOWEL SIGN AA +0AA2A CHAM VOWEL SIGN I +0AA2B CHAM VOWEL SIGN II +0AA2C CHAM VOWEL SIGN EI +0AA2D CHAM VOWEL SIGN U +0AA2E CHAM VOWEL SIGN OE +0AA2F CHAM VOWEL SIGN O +0AA30 CHAM VOWEL SIGN AI +0AA31 CHAM VOWEL SIGN AU +0AA32 CHAM VOWEL SIGN UE +0AA33 CHAM CONSONANT SIGN YA +0AA34 CHAM CONSONANT SIGN RA +0AA35 CHAM CONSONANT SIGN LA +0AA36 CHAM CONSONANT SIGN WA +0AA40 CHAM LETTER FINAL K +0AA41 CHAM LETTER FINAL G +0AA42 CHAM LETTER FINAL NG +0AA43 CHAM CONSONANT SIGN FINAL NG +0AA44 CHAM LETTER FINAL CH +0AA45 CHAM LETTER FINAL T +0AA46 CHAM LETTER FINAL N +0AA47 CHAM LETTER FINAL P +0AA48 CHAM LETTER FINAL Y +0AA49 CHAM LETTER FINAL R +0AA4A CHAM LETTER FINAL L +0AA4B CHAM LETTER FINAL SS +0AA4C CHAM CONSONANT SIGN FINAL M +0AA4D CHAM CONSONANT SIGN FINAL H +0AA50 CHAM DIGIT ZERO +0AA51 CHAM DIGIT ONE +0AA52 CHAM DIGIT TWO +0AA53 CHAM DIGIT THREE +0AA54 CHAM DIGIT FOUR +0AA55 CHAM DIGIT FIVE +0AA56 CHAM DIGIT SIX +0AA57 CHAM DIGIT SEVEN +0AA58 CHAM DIGIT EIGHT +0AA59 CHAM DIGIT NINE +0AA5C CHAM PUNCTUATION SPIRAL +0AA5D CHAM PUNCTUATION DANDA +0AA5E CHAM PUNCTUATION DOUBLE DANDA +0AA5F CHAM PUNCTUATION TRIPLE DANDA +0AA60 MYANMAR LETTER KHAMTI GA +0AA61 MYANMAR LETTER KHAMTI CA +0AA62 MYANMAR LETTER KHAMTI CHA +0AA63 MYANMAR LETTER KHAMTI JA +0AA64 MYANMAR LETTER KHAMTI JHA +0AA65 MYANMAR LETTER KHAMTI NYA +0AA66 MYANMAR LETTER KHAMTI TTA +0AA67 MYANMAR LETTER KHAMTI TTHA +0AA68 MYANMAR LETTER KHAMTI DDA +0AA69 MYANMAR LETTER KHAMTI DDHA +0AA6A MYANMAR LETTER KHAMTI DHA +0AA6B MYANMAR LETTER KHAMTI NA +0AA6C MYANMAR LETTER KHAMTI SA +0AA6D MYANMAR LETTER KHAMTI HA +0AA6E MYANMAR LETTER KHAMTI HHA +0AA6F MYANMAR LETTER KHAMTI FA +0AA70 MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +0AA71 MYANMAR LETTER KHAMTI XA +0AA72 MYANMAR LETTER KHAMTI ZA +0AA73 MYANMAR LETTER KHAMTI RA +0AA74 MYANMAR LOGOGRAM KHAMTI OAY +0AA75 MYANMAR LOGOGRAM KHAMTI QN +0AA76 MYANMAR LOGOGRAM KHAMTI HM +0AA77 MYANMAR SYMBOL AITON EXCLAMATION +0AA78 MYANMAR SYMBOL AITON ONE +0AA79 MYANMAR SYMBOL AITON TWO +0AA7A MYANMAR LETTER AITON RA +0AA7B MYANMAR SIGN PAO KAREN TONE +0AA7C MYANMAR SIGN TAI LAING TONE-2 +0AA7D MYANMAR SIGN TAI LAING TONE-5 +0AA7E MYANMAR LETTER SHWE PALAUNG CHA +0AA7F MYANMAR LETTER SHWE PALAUNG SHA +0AA80 TAI VIET LETTER LOW KO +0AA81 TAI VIET LETTER HIGH KO +0AA82 TAI VIET LETTER LOW KHO +0AA83 TAI VIET LETTER HIGH KHO +0AA84 TAI VIET LETTER LOW KHHO +0AA85 TAI VIET LETTER HIGH KHHO +0AA86 TAI VIET LETTER LOW GO +0AA87 TAI VIET LETTER HIGH GO +0AA88 TAI VIET LETTER LOW NGO +0AA89 TAI VIET LETTER HIGH NGO +0AA8A TAI VIET LETTER LOW CO +0AA8B TAI VIET LETTER HIGH CO +0AA8C TAI VIET LETTER LOW CHO +0AA8D TAI VIET LETTER HIGH CHO +0AA8E TAI VIET LETTER LOW SO +0AA8F TAI VIET LETTER HIGH SO +0AA90 TAI VIET LETTER LOW NYO +0AA91 TAI VIET LETTER HIGH NYO +0AA92 TAI VIET LETTER LOW DO +0AA93 TAI VIET LETTER HIGH DO +0AA94 TAI VIET LETTER LOW TO +0AA95 TAI VIET LETTER HIGH TO +0AA96 TAI VIET LETTER LOW THO +0AA97 TAI VIET LETTER HIGH THO +0AA98 TAI VIET LETTER LOW NO +0AA99 TAI VIET LETTER HIGH NO +0AA9A TAI VIET LETTER LOW BO +0AA9B TAI VIET LETTER HIGH BO +0AA9C TAI VIET LETTER LOW PO +0AA9D TAI VIET LETTER HIGH PO +0AA9E TAI VIET LETTER LOW PHO +0AA9F TAI VIET LETTER HIGH PHO +0AAA0 TAI VIET LETTER LOW FO +0AAA1 TAI VIET LETTER HIGH FO +0AAA2 TAI VIET LETTER LOW MO +0AAA3 TAI VIET LETTER HIGH MO +0AAA4 TAI VIET LETTER LOW YO +0AAA5 TAI VIET LETTER HIGH YO +0AAA6 TAI VIET LETTER LOW RO +0AAA7 TAI VIET LETTER HIGH RO +0AAA8 TAI VIET LETTER LOW LO +0AAA9 TAI VIET LETTER HIGH LO +0AAAA TAI VIET LETTER LOW VO +0AAAB TAI VIET LETTER HIGH VO +0AAAC TAI VIET LETTER LOW HO +0AAAD TAI VIET LETTER HIGH HO +0AAAE TAI VIET LETTER LOW O +0AAAF TAI VIET LETTER HIGH O +0AAB0 TAI VIET MAI KANG +0AAB1 TAI VIET VOWEL AA +0AAB2 TAI VIET VOWEL I +0AAB3 TAI VIET VOWEL UE +0AAB4 TAI VIET VOWEL U +0AAB5 TAI VIET VOWEL E +0AAB6 TAI VIET VOWEL O +0AAB7 TAI VIET MAI KHIT +0AAB8 TAI VIET VOWEL IA +0AAB9 TAI VIET VOWEL UEA +0AABA TAI VIET VOWEL UA +0AABB TAI VIET VOWEL AUE +0AABC TAI VIET VOWEL AY +0AABD TAI VIET VOWEL AN +0AABE TAI VIET VOWEL AM +0AABF TAI VIET TONE MAI EK +0AAC0 TAI VIET TONE MAI NUENG +0AAC1 TAI VIET TONE MAI THO +0AAC2 TAI VIET TONE MAI SONG +0AADB TAI VIET SYMBOL KON +0AADC TAI VIET SYMBOL NUENG +0AADD TAI VIET SYMBOL SAM +0AADE TAI VIET SYMBOL HO HOI +0AADF TAI VIET SYMBOL KOI KOI +0AAE0 MEETEI MAYEK LETTER E +0AAE1 MEETEI MAYEK LETTER O +0AAE2 MEETEI MAYEK LETTER CHA +0AAE3 MEETEI MAYEK LETTER NYA +0AAE4 MEETEI MAYEK LETTER TTA +0AAE5 MEETEI MAYEK LETTER TTHA +0AAE6 MEETEI MAYEK LETTER DDA +0AAE7 MEETEI MAYEK LETTER DDHA +0AAE8 MEETEI MAYEK LETTER NNA +0AAE9 MEETEI MAYEK LETTER SHA +0AAEA MEETEI MAYEK LETTER SSA +0AAEB MEETEI MAYEK VOWEL SIGN II +0AAEC MEETEI MAYEK VOWEL SIGN UU +0AAED MEETEI MAYEK VOWEL SIGN AAI +0AAEE MEETEI MAYEK VOWEL SIGN AU +0AAEF MEETEI MAYEK VOWEL SIGN AAU +0AAF0 MEETEI MAYEK CHEIKHAN +0AAF1 MEETEI MAYEK AHANG KHUDAM +0AAF2 MEETEI MAYEK ANJI +0AAF3 MEETEI MAYEK SYLLABLE REPETITION MARK +0AAF4 MEETEI MAYEK WORD REPETITION MARK +0AAF5 MEETEI MAYEK VOWEL SIGN VISARGA +0AAF6 MEETEI MAYEK VIRAMA +0AB01 ETHIOPIC SYLLABLE TTHU +0AB02 ETHIOPIC SYLLABLE TTHI +0AB03 ETHIOPIC SYLLABLE TTHAA +0AB04 ETHIOPIC SYLLABLE TTHEE +0AB05 ETHIOPIC SYLLABLE TTHE +0AB06 ETHIOPIC SYLLABLE TTHO +0AB09 ETHIOPIC SYLLABLE DDHU +0AB0A ETHIOPIC SYLLABLE DDHI +0AB0B ETHIOPIC SYLLABLE DDHAA +0AB0C ETHIOPIC SYLLABLE DDHEE +0AB0D ETHIOPIC SYLLABLE DDHE +0AB0E ETHIOPIC SYLLABLE DDHO +0AB11 ETHIOPIC SYLLABLE DZU +0AB12 ETHIOPIC SYLLABLE DZI +0AB13 ETHIOPIC SYLLABLE DZAA +0AB14 ETHIOPIC SYLLABLE DZEE +0AB15 ETHIOPIC SYLLABLE DZE +0AB16 ETHIOPIC SYLLABLE DZO +0AB20 ETHIOPIC SYLLABLE CCHHA +0AB21 ETHIOPIC SYLLABLE CCHHU +0AB22 ETHIOPIC SYLLABLE CCHHI +0AB23 ETHIOPIC SYLLABLE CCHHAA +0AB24 ETHIOPIC SYLLABLE CCHHEE +0AB25 ETHIOPIC SYLLABLE CCHHE +0AB26 ETHIOPIC SYLLABLE CCHHO +0AB28 ETHIOPIC SYLLABLE BBA +0AB29 ETHIOPIC SYLLABLE BBU +0AB2A ETHIOPIC SYLLABLE BBI +0AB2B ETHIOPIC SYLLABLE BBAA +0AB2C ETHIOPIC SYLLABLE BBEE +0AB2D ETHIOPIC SYLLABLE BBE +0AB2E ETHIOPIC SYLLABLE BBO +0AB30 LATIN SMALL LETTER BARRED ALPHA +0AB31 LATIN SMALL LETTER A REVERSED-SCHWA +0AB32 LATIN SMALL LETTER BLACKLETTER E +0AB33 LATIN SMALL LETTER BARRED E +0AB34 LATIN SMALL LETTER E WITH FLOURISH +0AB35 LATIN SMALL LETTER LENIS F +0AB36 LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL +0AB37 LATIN SMALL LETTER L WITH INVERTED LAZY S +0AB38 LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE +0AB39 LATIN SMALL LETTER L WITH MIDDLE RING +0AB3A LATIN SMALL LETTER M WITH CROSSED-TAIL +0AB3B LATIN SMALL LETTER N WITH CROSSED-TAIL +0AB3C LATIN SMALL LETTER ENG WITH CROSSED-TAIL +0AB3D LATIN SMALL LETTER BLACKLETTER O +0AB3E LATIN SMALL LETTER BLACKLETTER O WITH STROKE +0AB3F LATIN SMALL LETTER OPEN O WITH STROKE +0AB40 LATIN SMALL LETTER INVERTED OE +0AB41 LATIN SMALL LETTER TURNED OE WITH STROKE +0AB42 LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE +0AB43 LATIN SMALL LETTER TURNED O OPEN-O +0AB44 LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE +0AB45 LATIN SMALL LETTER STIRRUP R +0AB46 LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG +0AB47 LATIN SMALL LETTER R WITHOUT HANDLE +0AB48 LATIN SMALL LETTER DOUBLE R +0AB49 LATIN SMALL LETTER R WITH CROSSED-TAIL +0AB4A LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL +0AB4B LATIN SMALL LETTER SCRIPT R +0AB4C LATIN SMALL LETTER SCRIPT R WITH RING +0AB4D LATIN SMALL LETTER BASELINE ESH +0AB4E LATIN SMALL LETTER U WITH SHORT RIGHT LEG +0AB4F LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG +0AB50 LATIN SMALL LETTER UI +0AB51 LATIN SMALL LETTER TURNED UI +0AB52 LATIN SMALL LETTER U WITH LEFT HOOK +0AB53 LATIN SMALL LETTER CHI +0AB54 LATIN SMALL LETTER CHI WITH LOW RIGHT RING +0AB55 LATIN SMALL LETTER CHI WITH LOW LEFT SERIF +0AB56 LATIN SMALL LETTER X WITH LOW RIGHT RING +0AB57 LATIN SMALL LETTER X WITH LONG LEFT LEG +0AB58 LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING +0AB59 LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF +0AB5A LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +0AB5B MODIFIER BREVE WITH INVERTED BREVE +0AB5C MODIFIER LETTER SMALL HENG +0AB5D MODIFIER LETTER SMALL L WITH INVERTED LAZY S +0AB5E MODIFIER LETTER SMALL L WITH MIDDLE TILDE +0AB5F MODIFIER LETTER SMALL U WITH LEFT HOOK +0AB60 LATIN SMALL LETTER SAKHA YAT +0AB61 LATIN SMALL LETTER IOTIFIED E +0AB62 LATIN SMALL LETTER OPEN OE +0AB63 LATIN SMALL LETTER UO +0AB64 LATIN SMALL LETTER INVERTED ALPHA +0AB65 GREEK LETTER SMALL CAPITAL OMEGA +0AB70 CHEROKEE SMALL LETTER A +0AB71 CHEROKEE SMALL LETTER E +0AB72 CHEROKEE SMALL LETTER I +0AB73 CHEROKEE SMALL LETTER O +0AB74 CHEROKEE SMALL LETTER U +0AB75 CHEROKEE SMALL LETTER V +0AB76 CHEROKEE SMALL LETTER GA +0AB77 CHEROKEE SMALL LETTER KA +0AB78 CHEROKEE SMALL LETTER GE +0AB79 CHEROKEE SMALL LETTER GI +0AB7A CHEROKEE SMALL LETTER GO +0AB7B CHEROKEE SMALL LETTER GU +0AB7C CHEROKEE SMALL LETTER GV +0AB7D CHEROKEE SMALL LETTER HA +0AB7E CHEROKEE SMALL LETTER HE +0AB7F CHEROKEE SMALL LETTER HI +0AB80 CHEROKEE SMALL LETTER HO +0AB81 CHEROKEE SMALL LETTER HU +0AB82 CHEROKEE SMALL LETTER HV +0AB83 CHEROKEE SMALL LETTER LA +0AB84 CHEROKEE SMALL LETTER LE +0AB85 CHEROKEE SMALL LETTER LI +0AB86 CHEROKEE SMALL LETTER LO +0AB87 CHEROKEE SMALL LETTER LU +0AB88 CHEROKEE SMALL LETTER LV +0AB89 CHEROKEE SMALL LETTER MA +0AB8A CHEROKEE SMALL LETTER ME +0AB8B CHEROKEE SMALL LETTER MI +0AB8C CHEROKEE SMALL LETTER MO +0AB8D CHEROKEE SMALL LETTER MU +0AB8E CHEROKEE SMALL LETTER NA +0AB8F CHEROKEE SMALL LETTER HNA +0AB90 CHEROKEE SMALL LETTER NAH +0AB91 CHEROKEE SMALL LETTER NE +0AB92 CHEROKEE SMALL LETTER NI +0AB93 CHEROKEE SMALL LETTER NO +0AB94 CHEROKEE SMALL LETTER NU +0AB95 CHEROKEE SMALL LETTER NV +0AB96 CHEROKEE SMALL LETTER QUA +0AB97 CHEROKEE SMALL LETTER QUE +0AB98 CHEROKEE SMALL LETTER QUI +0AB99 CHEROKEE SMALL LETTER QUO +0AB9A CHEROKEE SMALL LETTER QUU +0AB9B CHEROKEE SMALL LETTER QUV +0AB9C CHEROKEE SMALL LETTER SA +0AB9D CHEROKEE SMALL LETTER S +0AB9E CHEROKEE SMALL LETTER SE +0AB9F CHEROKEE SMALL LETTER SI +0ABA0 CHEROKEE SMALL LETTER SO +0ABA1 CHEROKEE SMALL LETTER SU +0ABA2 CHEROKEE SMALL LETTER SV +0ABA3 CHEROKEE SMALL LETTER DA +0ABA4 CHEROKEE SMALL LETTER TA +0ABA5 CHEROKEE SMALL LETTER DE +0ABA6 CHEROKEE SMALL LETTER TE +0ABA7 CHEROKEE SMALL LETTER DI +0ABA8 CHEROKEE SMALL LETTER TI +0ABA9 CHEROKEE SMALL LETTER DO +0ABAA CHEROKEE SMALL LETTER DU +0ABAB CHEROKEE SMALL LETTER DV +0ABAC CHEROKEE SMALL LETTER DLA +0ABAD CHEROKEE SMALL LETTER TLA +0ABAE CHEROKEE SMALL LETTER TLE +0ABAF CHEROKEE SMALL LETTER TLI +0ABB0 CHEROKEE SMALL LETTER TLO +0ABB1 CHEROKEE SMALL LETTER TLU +0ABB2 CHEROKEE SMALL LETTER TLV +0ABB3 CHEROKEE SMALL LETTER TSA +0ABB4 CHEROKEE SMALL LETTER TSE +0ABB5 CHEROKEE SMALL LETTER TSI +0ABB6 CHEROKEE SMALL LETTER TSO +0ABB7 CHEROKEE SMALL LETTER TSU +0ABB8 CHEROKEE SMALL LETTER TSV +0ABB9 CHEROKEE SMALL LETTER WA +0ABBA CHEROKEE SMALL LETTER WE +0ABBB CHEROKEE SMALL LETTER WI +0ABBC CHEROKEE SMALL LETTER WO +0ABBD CHEROKEE SMALL LETTER WU +0ABBE CHEROKEE SMALL LETTER WV +0ABBF CHEROKEE SMALL LETTER YA +0ABC0 MEETEI MAYEK LETTER KOK +0ABC1 MEETEI MAYEK LETTER SAM +0ABC2 MEETEI MAYEK LETTER LAI +0ABC3 MEETEI MAYEK LETTER MIT +0ABC4 MEETEI MAYEK LETTER PA +0ABC5 MEETEI MAYEK LETTER NA +0ABC6 MEETEI MAYEK LETTER CHIL +0ABC7 MEETEI MAYEK LETTER TIL +0ABC8 MEETEI MAYEK LETTER KHOU +0ABC9 MEETEI MAYEK LETTER NGOU +0ABCA MEETEI MAYEK LETTER THOU +0ABCB MEETEI MAYEK LETTER WAI +0ABCC MEETEI MAYEK LETTER YANG +0ABCD MEETEI MAYEK LETTER HUK +0ABCE MEETEI MAYEK LETTER UN +0ABCF MEETEI MAYEK LETTER I +0ABD0 MEETEI MAYEK LETTER PHAM +0ABD1 MEETEI MAYEK LETTER ATIYA +0ABD2 MEETEI MAYEK LETTER GOK +0ABD3 MEETEI MAYEK LETTER JHAM +0ABD4 MEETEI MAYEK LETTER RAI +0ABD5 MEETEI MAYEK LETTER BA +0ABD6 MEETEI MAYEK LETTER JIL +0ABD7 MEETEI MAYEK LETTER DIL +0ABD8 MEETEI MAYEK LETTER GHOU +0ABD9 MEETEI MAYEK LETTER DHOU +0ABDA MEETEI MAYEK LETTER BHAM +0ABDB MEETEI MAYEK LETTER KOK LONSUM +0ABDC MEETEI MAYEK LETTER LAI LONSUM +0ABDD MEETEI MAYEK LETTER MIT LONSUM +0ABDE MEETEI MAYEK LETTER PA LONSUM +0ABDF MEETEI MAYEK LETTER NA LONSUM +0ABE0 MEETEI MAYEK LETTER TIL LONSUM +0ABE1 MEETEI MAYEK LETTER NGOU LONSUM +0ABE2 MEETEI MAYEK LETTER I LONSUM +0ABE3 MEETEI MAYEK VOWEL SIGN ONAP +0ABE4 MEETEI MAYEK VOWEL SIGN INAP +0ABE5 MEETEI MAYEK VOWEL SIGN ANAP +0ABE6 MEETEI MAYEK VOWEL SIGN YENAP +0ABE7 MEETEI MAYEK VOWEL SIGN SOUNAP +0ABE8 MEETEI MAYEK VOWEL SIGN UNAP +0ABE9 MEETEI MAYEK VOWEL SIGN CHEINAP +0ABEA MEETEI MAYEK VOWEL SIGN NUNG +0ABEB MEETEI MAYEK CHEIKHEI +0ABEC MEETEI MAYEK LUM IYEK +0ABED MEETEI MAYEK APUN IYEK +0ABF0 MEETEI MAYEK DIGIT ZERO +0ABF1 MEETEI MAYEK DIGIT ONE +0ABF2 MEETEI MAYEK DIGIT TWO +0ABF3 MEETEI MAYEK DIGIT THREE +0ABF4 MEETEI MAYEK DIGIT FOUR +0ABF5 MEETEI MAYEK DIGIT FIVE +0ABF6 MEETEI MAYEK DIGIT SIX +0ABF7 MEETEI MAYEK DIGIT SEVEN +0ABF8 MEETEI MAYEK DIGIT EIGHT +0ABF9 MEETEI MAYEK DIGIT NINE +0D7B0 HANGUL JUNGSEONG O-YEO +0D7B1 HANGUL JUNGSEONG O-O-I +0D7B2 HANGUL JUNGSEONG YO-A +0D7B3 HANGUL JUNGSEONG YO-AE +0D7B4 HANGUL JUNGSEONG YO-EO +0D7B5 HANGUL JUNGSEONG U-YEO +0D7B6 HANGUL JUNGSEONG U-I-I +0D7B7 HANGUL JUNGSEONG YU-AE +0D7B8 HANGUL JUNGSEONG YU-O +0D7B9 HANGUL JUNGSEONG EU-A +0D7BA HANGUL JUNGSEONG EU-EO +0D7BB HANGUL JUNGSEONG EU-E +0D7BC HANGUL JUNGSEONG EU-O +0D7BD HANGUL JUNGSEONG I-YA-O +0D7BE HANGUL JUNGSEONG I-YAE +0D7BF HANGUL JUNGSEONG I-YEO +0D7C0 HANGUL JUNGSEONG I-YE +0D7C1 HANGUL JUNGSEONG I-O-I +0D7C2 HANGUL JUNGSEONG I-YO +0D7C3 HANGUL JUNGSEONG I-YU +0D7C4 HANGUL JUNGSEONG I-I +0D7C5 HANGUL JUNGSEONG ARAEA-A +0D7C6 HANGUL JUNGSEONG ARAEA-E +0D7CB HANGUL JONGSEONG NIEUN-RIEUL +0D7CC HANGUL JONGSEONG NIEUN-CHIEUCH +0D7CD HANGUL JONGSEONG SSANGTIKEUT +0D7CE HANGUL JONGSEONG SSANGTIKEUT-PIEUP +0D7CF HANGUL JONGSEONG TIKEUT-PIEUP +0D7D0 HANGUL JONGSEONG TIKEUT-SIOS +0D7D1 HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK +0D7D2 HANGUL JONGSEONG TIKEUT-CIEUC +0D7D3 HANGUL JONGSEONG TIKEUT-CHIEUCH +0D7D4 HANGUL JONGSEONG TIKEUT-THIEUTH +0D7D5 HANGUL JONGSEONG RIEUL-SSANGKIYEOK +0D7D6 HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH +0D7D7 HANGUL JONGSEONG SSANGRIEUL-KHIEUKH +0D7D8 HANGUL JONGSEONG RIEUL-MIEUM-HIEUH +0D7D9 HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT +0D7DA HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH +0D7DB HANGUL JONGSEONG RIEUL-YESIEUNG +0D7DC HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH +0D7DD HANGUL JONGSEONG KAPYEOUNRIEUL +0D7DE HANGUL JONGSEONG MIEUM-NIEUN +0D7DF HANGUL JONGSEONG MIEUM-SSANGNIEUN +0D7E0 HANGUL JONGSEONG SSANGMIEUM +0D7E1 HANGUL JONGSEONG MIEUM-PIEUP-SIOS +0D7E2 HANGUL JONGSEONG MIEUM-CIEUC +0D7E3 HANGUL JONGSEONG PIEUP-TIKEUT +0D7E4 HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH +0D7E5 HANGUL JONGSEONG PIEUP-MIEUM +0D7E6 HANGUL JONGSEONG SSANGPIEUP +0D7E7 HANGUL JONGSEONG PIEUP-SIOS-TIKEUT +0D7E8 HANGUL JONGSEONG PIEUP-CIEUC +0D7E9 HANGUL JONGSEONG PIEUP-CHIEUCH +0D7EA HANGUL JONGSEONG SIOS-MIEUM +0D7EB HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP +0D7EC HANGUL JONGSEONG SSANGSIOS-KIYEOK +0D7ED HANGUL JONGSEONG SSANGSIOS-TIKEUT +0D7EE HANGUL JONGSEONG SIOS-PANSIOS +0D7EF HANGUL JONGSEONG SIOS-CIEUC +0D7F0 HANGUL JONGSEONG SIOS-CHIEUCH +0D7F1 HANGUL JONGSEONG SIOS-THIEUTH +0D7F2 HANGUL JONGSEONG SIOS-HIEUH +0D7F3 HANGUL JONGSEONG PANSIOS-PIEUP +0D7F4 HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP +0D7F5 HANGUL JONGSEONG YESIEUNG-MIEUM +0D7F6 HANGUL JONGSEONG YESIEUNG-HIEUH +0D7F7 HANGUL JONGSEONG CIEUC-PIEUP +0D7F8 HANGUL JONGSEONG CIEUC-SSANGPIEUP +0D7F9 HANGUL JONGSEONG SSANGCIEUC +0D7FA HANGUL JONGSEONG PHIEUPH-SIOS +0D7FB HANGUL JONGSEONG PHIEUPH-THIEUTH +0FB00 LATIN SMALL LIGATURE FF +0FB01 LATIN SMALL LIGATURE FI +0FB02 LATIN SMALL LIGATURE FL +0FB03 LATIN SMALL LIGATURE FFI +0FB04 LATIN SMALL LIGATURE FFL +0FB05 LATIN SMALL LIGATURE LONG S T +0FB06 LATIN SMALL LIGATURE ST +0FB13 ARMENIAN SMALL LIGATURE MEN NOW +0FB14 ARMENIAN SMALL LIGATURE MEN ECH +0FB15 ARMENIAN SMALL LIGATURE MEN INI +0FB16 ARMENIAN SMALL LIGATURE VEW NOW +0FB17 ARMENIAN SMALL LIGATURE MEN XEH +0FB1D HEBREW LETTER YOD WITH HIRIQ +0FB1E HEBREW POINT JUDEO-SPANISH VARIKA +0FB1F HEBREW LIGATURE YIDDISH YOD YOD PATAH +0FB20 HEBREW LETTER ALTERNATIVE AYIN +0FB21 HEBREW LETTER WIDE ALEF +0FB22 HEBREW LETTER WIDE DALET +0FB23 HEBREW LETTER WIDE HE +0FB24 HEBREW LETTER WIDE KAF +0FB25 HEBREW LETTER WIDE LAMED +0FB26 HEBREW LETTER WIDE FINAL MEM +0FB27 HEBREW LETTER WIDE RESH +0FB28 HEBREW LETTER WIDE TAV +0FB29 HEBREW LETTER ALTERNATIVE PLUS SIGN +0FB2A HEBREW LETTER SHIN WITH SHIN DOT +0FB2B HEBREW LETTER SHIN WITH SIN DOT +0FB2C HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +0FB2D HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +0FB2E HEBREW LETTER ALEF WITH PATAH +0FB2F HEBREW LETTER ALEF WITH QAMATS +0FB30 HEBREW LETTER ALEF WITH MAPIQ +0FB31 HEBREW LETTER BET WITH DAGESH +0FB32 HEBREW LETTER GIMEL WITH DAGESH +0FB33 HEBREW LETTER DALET WITH DAGESH +0FB34 HEBREW LETTER HE WITH MAPIQ +0FB35 HEBREW LETTER VAV WITH DAGESH +0FB36 HEBREW LETTER ZAYIN WITH DAGESH +0FB38 HEBREW LETTER TET WITH DAGESH +0FB39 HEBREW LETTER YOD WITH DAGESH +0FB3A HEBREW LETTER FINAL KAF WITH DAGESH +0FB3B HEBREW LETTER KAF WITH DAGESH +0FB3C HEBREW LETTER LAMED WITH DAGESH +0FB3E HEBREW LETTER MEM WITH DAGESH +0FB40 HEBREW LETTER NUN WITH DAGESH +0FB41 HEBREW LETTER SAMEKH WITH DAGESH +0FB43 HEBREW LETTER FINAL PE WITH DAGESH +0FB44 HEBREW LETTER PE WITH DAGESH +0FB46 HEBREW LETTER TSADI WITH DAGESH +0FB47 HEBREW LETTER QOF WITH DAGESH +0FB48 HEBREW LETTER RESH WITH DAGESH +0FB49 HEBREW LETTER SHIN WITH DAGESH +0FB4A HEBREW LETTER TAV WITH DAGESH +0FB4B HEBREW LETTER VAV WITH HOLAM +0FB4C HEBREW LETTER BET WITH RAFE +0FB4D HEBREW LETTER KAF WITH RAFE +0FB4E HEBREW LETTER PE WITH RAFE +0FB4F HEBREW LIGATURE ALEF LAMED +0FB50 ARABIC LETTER ALEF WASLA ISOLATED FORM +0FB51 ARABIC LETTER ALEF WASLA FINAL FORM +0FB52 ARABIC LETTER BEEH ISOLATED FORM +0FB53 ARABIC LETTER BEEH FINAL FORM +0FB54 ARABIC LETTER BEEH INITIAL FORM +0FB55 ARABIC LETTER BEEH MEDIAL FORM +0FB56 ARABIC LETTER PEH ISOLATED FORM +0FB57 ARABIC LETTER PEH FINAL FORM +0FB58 ARABIC LETTER PEH INITIAL FORM +0FB59 ARABIC LETTER PEH MEDIAL FORM +0FB5A ARABIC LETTER BEHEH ISOLATED FORM +0FB5B ARABIC LETTER BEHEH FINAL FORM +0FB5C ARABIC LETTER BEHEH INITIAL FORM +0FB5D ARABIC LETTER BEHEH MEDIAL FORM +0FB5E ARABIC LETTER TTEHEH ISOLATED FORM +0FB5F ARABIC LETTER TTEHEH FINAL FORM +0FB60 ARABIC LETTER TTEHEH INITIAL FORM +0FB61 ARABIC LETTER TTEHEH MEDIAL FORM +0FB62 ARABIC LETTER TEHEH ISOLATED FORM +0FB63 ARABIC LETTER TEHEH FINAL FORM +0FB64 ARABIC LETTER TEHEH INITIAL FORM +0FB65 ARABIC LETTER TEHEH MEDIAL FORM +0FB66 ARABIC LETTER TTEH ISOLATED FORM +0FB67 ARABIC LETTER TTEH FINAL FORM +0FB68 ARABIC LETTER TTEH INITIAL FORM +0FB69 ARABIC LETTER TTEH MEDIAL FORM +0FB6A ARABIC LETTER VEH ISOLATED FORM +0FB6B ARABIC LETTER VEH FINAL FORM +0FB6C ARABIC LETTER VEH INITIAL FORM +0FB6D ARABIC LETTER VEH MEDIAL FORM +0FB6E ARABIC LETTER PEHEH ISOLATED FORM +0FB6F ARABIC LETTER PEHEH FINAL FORM +0FB70 ARABIC LETTER PEHEH INITIAL FORM +0FB71 ARABIC LETTER PEHEH MEDIAL FORM +0FB72 ARABIC LETTER DYEH ISOLATED FORM +0FB73 ARABIC LETTER DYEH FINAL FORM +0FB74 ARABIC LETTER DYEH INITIAL FORM +0FB75 ARABIC LETTER DYEH MEDIAL FORM +0FB76 ARABIC LETTER NYEH ISOLATED FORM +0FB77 ARABIC LETTER NYEH FINAL FORM +0FB78 ARABIC LETTER NYEH INITIAL FORM +0FB79 ARABIC LETTER NYEH MEDIAL FORM +0FB7A ARABIC LETTER TCHEH ISOLATED FORM +0FB7B ARABIC LETTER TCHEH FINAL FORM +0FB7C ARABIC LETTER TCHEH INITIAL FORM +0FB7D ARABIC LETTER TCHEH MEDIAL FORM +0FB7E ARABIC LETTER TCHEHEH ISOLATED FORM +0FB7F ARABIC LETTER TCHEHEH FINAL FORM +0FB80 ARABIC LETTER TCHEHEH INITIAL FORM +0FB81 ARABIC LETTER TCHEHEH MEDIAL FORM +0FB82 ARABIC LETTER DDAHAL ISOLATED FORM +0FB83 ARABIC LETTER DDAHAL FINAL FORM +0FB84 ARABIC LETTER DAHAL ISOLATED FORM +0FB85 ARABIC LETTER DAHAL FINAL FORM +0FB86 ARABIC LETTER DUL ISOLATED FORM +0FB87 ARABIC LETTER DUL FINAL FORM +0FB88 ARABIC LETTER DDAL ISOLATED FORM +0FB89 ARABIC LETTER DDAL FINAL FORM +0FB8A ARABIC LETTER JEH ISOLATED FORM +0FB8B ARABIC LETTER JEH FINAL FORM +0FB8C ARABIC LETTER RREH ISOLATED FORM +0FB8D ARABIC LETTER RREH FINAL FORM +0FB8E ARABIC LETTER KEHEH ISOLATED FORM +0FB8F ARABIC LETTER KEHEH FINAL FORM +0FB90 ARABIC LETTER KEHEH INITIAL FORM +0FB91 ARABIC LETTER KEHEH MEDIAL FORM +0FB92 ARABIC LETTER GAF ISOLATED FORM +0FB93 ARABIC LETTER GAF FINAL FORM +0FB94 ARABIC LETTER GAF INITIAL FORM +0FB95 ARABIC LETTER GAF MEDIAL FORM +0FB96 ARABIC LETTER GUEH ISOLATED FORM +0FB97 ARABIC LETTER GUEH FINAL FORM +0FB98 ARABIC LETTER GUEH INITIAL FORM +0FB99 ARABIC LETTER GUEH MEDIAL FORM +0FB9A ARABIC LETTER NGOEH ISOLATED FORM +0FB9B ARABIC LETTER NGOEH FINAL FORM +0FB9C ARABIC LETTER NGOEH INITIAL FORM +0FB9D ARABIC LETTER NGOEH MEDIAL FORM +0FB9E ARABIC LETTER NOON GHUNNA ISOLATED FORM +0FB9F ARABIC LETTER NOON GHUNNA FINAL FORM +0FBA0 ARABIC LETTER RNOON ISOLATED FORM +0FBA1 ARABIC LETTER RNOON FINAL FORM +0FBA2 ARABIC LETTER RNOON INITIAL FORM +0FBA3 ARABIC LETTER RNOON MEDIAL FORM +0FBA4 ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM +0FBA5 ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM +0FBA6 ARABIC LETTER HEH GOAL ISOLATED FORM +0FBA7 ARABIC LETTER HEH GOAL FINAL FORM +0FBA8 ARABIC LETTER HEH GOAL INITIAL FORM +0FBA9 ARABIC LETTER HEH GOAL MEDIAL FORM +0FBAA ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM +0FBAB ARABIC LETTER HEH DOACHASHMEE FINAL FORM +0FBAC ARABIC LETTER HEH DOACHASHMEE INITIAL FORM +0FBAD ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM +0FBAE ARABIC LETTER YEH BARREE ISOLATED FORM +0FBAF ARABIC LETTER YEH BARREE FINAL FORM +0FBB0 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM +0FBB1 ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +0FBB2 ARABIC SYMBOL DOT ABOVE +0FBB3 ARABIC SYMBOL DOT BELOW +0FBB4 ARABIC SYMBOL TWO DOTS ABOVE +0FBB5 ARABIC SYMBOL TWO DOTS BELOW +0FBB6 ARABIC SYMBOL THREE DOTS ABOVE +0FBB7 ARABIC SYMBOL THREE DOTS BELOW +0FBB8 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE +0FBB9 ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW +0FBBA ARABIC SYMBOL FOUR DOTS ABOVE +0FBBB ARABIC SYMBOL FOUR DOTS BELOW +0FBBC ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW +0FBBD ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE +0FBBE ARABIC SYMBOL TWO DOTS VERTICALLY BELOW +0FBBF ARABIC SYMBOL RING +0FBC0 ARABIC SYMBOL SMALL TAH ABOVE +0FBC1 ARABIC SYMBOL SMALL TAH BELOW +0FBD3 ARABIC LETTER NG ISOLATED FORM +0FBD4 ARABIC LETTER NG FINAL FORM +0FBD5 ARABIC LETTER NG INITIAL FORM +0FBD6 ARABIC LETTER NG MEDIAL FORM +0FBD7 ARABIC LETTER U ISOLATED FORM +0FBD8 ARABIC LETTER U FINAL FORM +0FBD9 ARABIC LETTER OE ISOLATED FORM +0FBDA ARABIC LETTER OE FINAL FORM +0FBDB ARABIC LETTER YU ISOLATED FORM +0FBDC ARABIC LETTER YU FINAL FORM +0FBDD ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM +0FBDE ARABIC LETTER VE ISOLATED FORM +0FBDF ARABIC LETTER VE FINAL FORM +0FBE0 ARABIC LETTER KIRGHIZ OE ISOLATED FORM +0FBE1 ARABIC LETTER KIRGHIZ OE FINAL FORM +0FBE2 ARABIC LETTER KIRGHIZ YU ISOLATED FORM +0FBE3 ARABIC LETTER KIRGHIZ YU FINAL FORM +0FBE4 ARABIC LETTER E ISOLATED FORM +0FBE5 ARABIC LETTER E FINAL FORM +0FBE6 ARABIC LETTER E INITIAL FORM +0FBE7 ARABIC LETTER E MEDIAL FORM +0FBE8 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM +0FBE9 ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM +0FBEA ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM +0FBEB ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM +0FBEC ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM +0FBED ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM +0FBEE ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM +0FBEF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM +0FBF0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM +0FBF1 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM +0FBF2 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM +0FBF3 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM +0FBF4 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM +0FBF5 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM +0FBF6 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM +0FBF7 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM +0FBF8 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM +0FBF9 ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +0FBFA ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +0FBFB ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM +0FBFC ARABIC LETTER FARSI YEH ISOLATED FORM +0FBFD ARABIC LETTER FARSI YEH FINAL FORM +0FBFE ARABIC LETTER FARSI YEH INITIAL FORM +0FBFF ARABIC LETTER FARSI YEH MEDIAL FORM +0FC00 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM +0FC01 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM +0FC02 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM +0FC03 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM +0FC04 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM +0FC05 ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM +0FC06 ARABIC LIGATURE BEH WITH HAH ISOLATED FORM +0FC07 ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM +0FC08 ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM +0FC09 ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM +0FC0A ARABIC LIGATURE BEH WITH YEH ISOLATED FORM +0FC0B ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM +0FC0C ARABIC LIGATURE TEH WITH HAH ISOLATED FORM +0FC0D ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM +0FC0E ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM +0FC0F ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM +0FC10 ARABIC LIGATURE TEH WITH YEH ISOLATED FORM +0FC11 ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM +0FC12 ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM +0FC13 ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM +0FC14 ARABIC LIGATURE THEH WITH YEH ISOLATED FORM +0FC15 ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM +0FC16 ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM +0FC17 ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM +0FC18 ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM +0FC19 ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM +0FC1A ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM +0FC1B ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM +0FC1C ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM +0FC1D ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM +0FC1E ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM +0FC1F ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM +0FC20 ARABIC LIGATURE SAD WITH HAH ISOLATED FORM +0FC21 ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM +0FC22 ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM +0FC23 ARABIC LIGATURE DAD WITH HAH ISOLATED FORM +0FC24 ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM +0FC25 ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM +0FC26 ARABIC LIGATURE TAH WITH HAH ISOLATED FORM +0FC27 ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM +0FC28 ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM +0FC29 ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM +0FC2A ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM +0FC2B ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM +0FC2C ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM +0FC2D ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM +0FC2E ARABIC LIGATURE FEH WITH HAH ISOLATED FORM +0FC2F ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM +0FC30 ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM +0FC31 ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM +0FC32 ARABIC LIGATURE FEH WITH YEH ISOLATED FORM +0FC33 ARABIC LIGATURE QAF WITH HAH ISOLATED FORM +0FC34 ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM +0FC35 ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM +0FC36 ARABIC LIGATURE QAF WITH YEH ISOLATED FORM +0FC37 ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM +0FC38 ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM +0FC39 ARABIC LIGATURE KAF WITH HAH ISOLATED FORM +0FC3A ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM +0FC3B ARABIC LIGATURE KAF WITH LAM ISOLATED FORM +0FC3C ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM +0FC3D ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM +0FC3E ARABIC LIGATURE KAF WITH YEH ISOLATED FORM +0FC3F ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM +0FC40 ARABIC LIGATURE LAM WITH HAH ISOLATED FORM +0FC41 ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM +0FC42 ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM +0FC43 ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM +0FC44 ARABIC LIGATURE LAM WITH YEH ISOLATED FORM +0FC45 ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM +0FC46 ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM +0FC47 ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM +0FC48 ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM +0FC49 ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM +0FC4A ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM +0FC4B ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM +0FC4C ARABIC LIGATURE NOON WITH HAH ISOLATED FORM +0FC4D ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM +0FC4E ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM +0FC4F ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM +0FC50 ARABIC LIGATURE NOON WITH YEH ISOLATED FORM +0FC51 ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM +0FC52 ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM +0FC53 ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM +0FC54 ARABIC LIGATURE HEH WITH YEH ISOLATED FORM +0FC55 ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM +0FC56 ARABIC LIGATURE YEH WITH HAH ISOLATED FORM +0FC57 ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM +0FC58 ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM +0FC59 ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM +0FC5A ARABIC LIGATURE YEH WITH YEH ISOLATED FORM +0FC5B ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM +0FC5C ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM +0FC5D ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM +0FC5E ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM +0FC5F ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM +0FC60 ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM +0FC61 ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM +0FC62 ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM +0FC63 ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM +0FC64 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM +0FC65 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM +0FC66 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM +0FC67 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM +0FC68 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM +0FC69 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM +0FC6A ARABIC LIGATURE BEH WITH REH FINAL FORM +0FC6B ARABIC LIGATURE BEH WITH ZAIN FINAL FORM +0FC6C ARABIC LIGATURE BEH WITH MEEM FINAL FORM +0FC6D ARABIC LIGATURE BEH WITH NOON FINAL FORM +0FC6E ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM +0FC6F ARABIC LIGATURE BEH WITH YEH FINAL FORM +0FC70 ARABIC LIGATURE TEH WITH REH FINAL FORM +0FC71 ARABIC LIGATURE TEH WITH ZAIN FINAL FORM +0FC72 ARABIC LIGATURE TEH WITH MEEM FINAL FORM +0FC73 ARABIC LIGATURE TEH WITH NOON FINAL FORM +0FC74 ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM +0FC75 ARABIC LIGATURE TEH WITH YEH FINAL FORM +0FC76 ARABIC LIGATURE THEH WITH REH FINAL FORM +0FC77 ARABIC LIGATURE THEH WITH ZAIN FINAL FORM +0FC78 ARABIC LIGATURE THEH WITH MEEM FINAL FORM +0FC79 ARABIC LIGATURE THEH WITH NOON FINAL FORM +0FC7A ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM +0FC7B ARABIC LIGATURE THEH WITH YEH FINAL FORM +0FC7C ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM +0FC7D ARABIC LIGATURE FEH WITH YEH FINAL FORM +0FC7E ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM +0FC7F ARABIC LIGATURE QAF WITH YEH FINAL FORM +0FC80 ARABIC LIGATURE KAF WITH ALEF FINAL FORM +0FC81 ARABIC LIGATURE KAF WITH LAM FINAL FORM +0FC82 ARABIC LIGATURE KAF WITH MEEM FINAL FORM +0FC83 ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM +0FC84 ARABIC LIGATURE KAF WITH YEH FINAL FORM +0FC85 ARABIC LIGATURE LAM WITH MEEM FINAL FORM +0FC86 ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM +0FC87 ARABIC LIGATURE LAM WITH YEH FINAL FORM +0FC88 ARABIC LIGATURE MEEM WITH ALEF FINAL FORM +0FC89 ARABIC LIGATURE MEEM WITH MEEM FINAL FORM +0FC8A ARABIC LIGATURE NOON WITH REH FINAL FORM +0FC8B ARABIC LIGATURE NOON WITH ZAIN FINAL FORM +0FC8C ARABIC LIGATURE NOON WITH MEEM FINAL FORM +0FC8D ARABIC LIGATURE NOON WITH NOON FINAL FORM +0FC8E ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM +0FC8F ARABIC LIGATURE NOON WITH YEH FINAL FORM +0FC90 ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM +0FC91 ARABIC LIGATURE YEH WITH REH FINAL FORM +0FC92 ARABIC LIGATURE YEH WITH ZAIN FINAL FORM +0FC93 ARABIC LIGATURE YEH WITH MEEM FINAL FORM +0FC94 ARABIC LIGATURE YEH WITH NOON FINAL FORM +0FC95 ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM +0FC96 ARABIC LIGATURE YEH WITH YEH FINAL FORM +0FC97 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM +0FC98 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM +0FC99 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM +0FC9A ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM +0FC9B ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM +0FC9C ARABIC LIGATURE BEH WITH JEEM INITIAL FORM +0FC9D ARABIC LIGATURE BEH WITH HAH INITIAL FORM +0FC9E ARABIC LIGATURE BEH WITH KHAH INITIAL FORM +0FC9F ARABIC LIGATURE BEH WITH MEEM INITIAL FORM +0FCA0 ARABIC LIGATURE BEH WITH HEH INITIAL FORM +0FCA1 ARABIC LIGATURE TEH WITH JEEM INITIAL FORM +0FCA2 ARABIC LIGATURE TEH WITH HAH INITIAL FORM +0FCA3 ARABIC LIGATURE TEH WITH KHAH INITIAL FORM +0FCA4 ARABIC LIGATURE TEH WITH MEEM INITIAL FORM +0FCA5 ARABIC LIGATURE TEH WITH HEH INITIAL FORM +0FCA6 ARABIC LIGATURE THEH WITH MEEM INITIAL FORM +0FCA7 ARABIC LIGATURE JEEM WITH HAH INITIAL FORM +0FCA8 ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM +0FCA9 ARABIC LIGATURE HAH WITH JEEM INITIAL FORM +0FCAA ARABIC LIGATURE HAH WITH MEEM INITIAL FORM +0FCAB ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM +0FCAC ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM +0FCAD ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM +0FCAE ARABIC LIGATURE SEEN WITH HAH INITIAL FORM +0FCAF ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM +0FCB0 ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM +0FCB1 ARABIC LIGATURE SAD WITH HAH INITIAL FORM +0FCB2 ARABIC LIGATURE SAD WITH KHAH INITIAL FORM +0FCB3 ARABIC LIGATURE SAD WITH MEEM INITIAL FORM +0FCB4 ARABIC LIGATURE DAD WITH JEEM INITIAL FORM +0FCB5 ARABIC LIGATURE DAD WITH HAH INITIAL FORM +0FCB6 ARABIC LIGATURE DAD WITH KHAH INITIAL FORM +0FCB7 ARABIC LIGATURE DAD WITH MEEM INITIAL FORM +0FCB8 ARABIC LIGATURE TAH WITH HAH INITIAL FORM +0FCB9 ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM +0FCBA ARABIC LIGATURE AIN WITH JEEM INITIAL FORM +0FCBB ARABIC LIGATURE AIN WITH MEEM INITIAL FORM +0FCBC ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM +0FCBD ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM +0FCBE ARABIC LIGATURE FEH WITH JEEM INITIAL FORM +0FCBF ARABIC LIGATURE FEH WITH HAH INITIAL FORM +0FCC0 ARABIC LIGATURE FEH WITH KHAH INITIAL FORM +0FCC1 ARABIC LIGATURE FEH WITH MEEM INITIAL FORM +0FCC2 ARABIC LIGATURE QAF WITH HAH INITIAL FORM +0FCC3 ARABIC LIGATURE QAF WITH MEEM INITIAL FORM +0FCC4 ARABIC LIGATURE KAF WITH JEEM INITIAL FORM +0FCC5 ARABIC LIGATURE KAF WITH HAH INITIAL FORM +0FCC6 ARABIC LIGATURE KAF WITH KHAH INITIAL FORM +0FCC7 ARABIC LIGATURE KAF WITH LAM INITIAL FORM +0FCC8 ARABIC LIGATURE KAF WITH MEEM INITIAL FORM +0FCC9 ARABIC LIGATURE LAM WITH JEEM INITIAL FORM +0FCCA ARABIC LIGATURE LAM WITH HAH INITIAL FORM +0FCCB ARABIC LIGATURE LAM WITH KHAH INITIAL FORM +0FCCC ARABIC LIGATURE LAM WITH MEEM INITIAL FORM +0FCCD ARABIC LIGATURE LAM WITH HEH INITIAL FORM +0FCCE ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM +0FCCF ARABIC LIGATURE MEEM WITH HAH INITIAL FORM +0FCD0 ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM +0FCD1 ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM +0FCD2 ARABIC LIGATURE NOON WITH JEEM INITIAL FORM +0FCD3 ARABIC LIGATURE NOON WITH HAH INITIAL FORM +0FCD4 ARABIC LIGATURE NOON WITH KHAH INITIAL FORM +0FCD5 ARABIC LIGATURE NOON WITH MEEM INITIAL FORM +0FCD6 ARABIC LIGATURE NOON WITH HEH INITIAL FORM +0FCD7 ARABIC LIGATURE HEH WITH JEEM INITIAL FORM +0FCD8 ARABIC LIGATURE HEH WITH MEEM INITIAL FORM +0FCD9 ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM +0FCDA ARABIC LIGATURE YEH WITH JEEM INITIAL FORM +0FCDB ARABIC LIGATURE YEH WITH HAH INITIAL FORM +0FCDC ARABIC LIGATURE YEH WITH KHAH INITIAL FORM +0FCDD ARABIC LIGATURE YEH WITH MEEM INITIAL FORM +0FCDE ARABIC LIGATURE YEH WITH HEH INITIAL FORM +0FCDF ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM +0FCE0 ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM +0FCE1 ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM +0FCE2 ARABIC LIGATURE BEH WITH HEH MEDIAL FORM +0FCE3 ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM +0FCE4 ARABIC LIGATURE TEH WITH HEH MEDIAL FORM +0FCE5 ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM +0FCE6 ARABIC LIGATURE THEH WITH HEH MEDIAL FORM +0FCE7 ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM +0FCE8 ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM +0FCE9 ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM +0FCEA ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM +0FCEB ARABIC LIGATURE KAF WITH LAM MEDIAL FORM +0FCEC ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM +0FCED ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM +0FCEE ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM +0FCEF ARABIC LIGATURE NOON WITH HEH MEDIAL FORM +0FCF0 ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM +0FCF1 ARABIC LIGATURE YEH WITH HEH MEDIAL FORM +0FCF2 ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM +0FCF3 ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM +0FCF4 ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM +0FCF5 ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM +0FCF6 ARABIC LIGATURE TAH WITH YEH ISOLATED FORM +0FCF7 ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM +0FCF8 ARABIC LIGATURE AIN WITH YEH ISOLATED FORM +0FCF9 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM +0FCFA ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM +0FCFB ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM +0FCFC ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM +0FCFD ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM +0FCFE ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM +0FCFF ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM +0FD00 ARABIC LIGATURE HAH WITH YEH ISOLATED FORM +0FD01 ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM +0FD02 ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM +0FD03 ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM +0FD04 ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM +0FD05 ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM +0FD06 ARABIC LIGATURE SAD WITH YEH ISOLATED FORM +0FD07 ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM +0FD08 ARABIC LIGATURE DAD WITH YEH ISOLATED FORM +0FD09 ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM +0FD0A ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM +0FD0B ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM +0FD0C ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM +0FD0D ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM +0FD0E ARABIC LIGATURE SEEN WITH REH ISOLATED FORM +0FD0F ARABIC LIGATURE SAD WITH REH ISOLATED FORM +0FD10 ARABIC LIGATURE DAD WITH REH ISOLATED FORM +0FD11 ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM +0FD12 ARABIC LIGATURE TAH WITH YEH FINAL FORM +0FD13 ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM +0FD14 ARABIC LIGATURE AIN WITH YEH FINAL FORM +0FD15 ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM +0FD16 ARABIC LIGATURE GHAIN WITH YEH FINAL FORM +0FD17 ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM +0FD18 ARABIC LIGATURE SEEN WITH YEH FINAL FORM +0FD19 ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM +0FD1A ARABIC LIGATURE SHEEN WITH YEH FINAL FORM +0FD1B ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM +0FD1C ARABIC LIGATURE HAH WITH YEH FINAL FORM +0FD1D ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM +0FD1E ARABIC LIGATURE JEEM WITH YEH FINAL FORM +0FD1F ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM +0FD20 ARABIC LIGATURE KHAH WITH YEH FINAL FORM +0FD21 ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM +0FD22 ARABIC LIGATURE SAD WITH YEH FINAL FORM +0FD23 ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM +0FD24 ARABIC LIGATURE DAD WITH YEH FINAL FORM +0FD25 ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM +0FD26 ARABIC LIGATURE SHEEN WITH HAH FINAL FORM +0FD27 ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM +0FD28 ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM +0FD29 ARABIC LIGATURE SHEEN WITH REH FINAL FORM +0FD2A ARABIC LIGATURE SEEN WITH REH FINAL FORM +0FD2B ARABIC LIGATURE SAD WITH REH FINAL FORM +0FD2C ARABIC LIGATURE DAD WITH REH FINAL FORM +0FD2D ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM +0FD2E ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM +0FD2F ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM +0FD30 ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM +0FD31 ARABIC LIGATURE SEEN WITH HEH INITIAL FORM +0FD32 ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM +0FD33 ARABIC LIGATURE TAH WITH MEEM INITIAL FORM +0FD34 ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM +0FD35 ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM +0FD36 ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM +0FD37 ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM +0FD38 ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM +0FD39 ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM +0FD3A ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM +0FD3B ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM +0FD3C ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM +0FD3D ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +0FD3E ORNATE LEFT PARENTHESIS +0FD3F ORNATE RIGHT PARENTHESIS +0FD50 ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM +0FD51 ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM +0FD52 ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM +0FD53 ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM +0FD54 ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM +0FD55 ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM +0FD56 ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM +0FD57 ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM +0FD58 ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM +0FD59 ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM +0FD5A ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM +0FD5B ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM +0FD5C ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM +0FD5D ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM +0FD5E ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM +0FD5F ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM +0FD60 ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM +0FD61 ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM +0FD62 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM +0FD63 ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM +0FD64 ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM +0FD65 ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM +0FD66 ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM +0FD67 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM +0FD68 ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM +0FD69 ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM +0FD6A ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM +0FD6B ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM +0FD6C ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM +0FD6D ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM +0FD6E ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM +0FD6F ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM +0FD70 ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM +0FD71 ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM +0FD72 ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM +0FD73 ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM +0FD74 ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM +0FD75 ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM +0FD76 ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM +0FD77 ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM +0FD78 ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +0FD79 ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM +0FD7A ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM +0FD7B ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM +0FD7C ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM +0FD7D ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM +0FD7E ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM +0FD7F ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM +0FD80 ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM +0FD81 ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM +0FD82 ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM +0FD83 ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM +0FD84 ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM +0FD85 ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM +0FD86 ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM +0FD87 ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM +0FD88 ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM +0FD89 ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM +0FD8A ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM +0FD8B ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM +0FD8C ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM +0FD8D ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM +0FD8E ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM +0FD8F ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +0FD92 ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM +0FD93 ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM +0FD94 ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM +0FD95 ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM +0FD96 ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM +0FD97 ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM +0FD98 ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM +0FD99 ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM +0FD9A ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM +0FD9B ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM +0FD9C ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM +0FD9D ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM +0FD9E ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM +0FD9F ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM +0FDA0 ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM +0FDA1 ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM +0FDA2 ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM +0FDA3 ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM +0FDA4 ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM +0FDA5 ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM +0FDA6 ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM +0FDA7 ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM +0FDA8 ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM +0FDA9 ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM +0FDAA ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM +0FDAB ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM +0FDAC ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM +0FDAD ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM +0FDAE ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM +0FDAF ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM +0FDB0 ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM +0FDB1 ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM +0FDB2 ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM +0FDB3 ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM +0FDB4 ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM +0FDB5 ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM +0FDB6 ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM +0FDB7 ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM +0FDB8 ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM +0FDB9 ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM +0FDBA ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM +0FDBB ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM +0FDBC ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM +0FDBD ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM +0FDBE ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM +0FDBF ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM +0FDC0 ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM +0FDC1 ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM +0FDC2 ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM +0FDC3 ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM +0FDC4 ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM +0FDC5 ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM +0FDC6 ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM +0FDC7 ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +0FDF0 ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM +0FDF1 ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM +0FDF2 ARABIC LIGATURE ALLAH ISOLATED FORM +0FDF3 ARABIC LIGATURE AKBAR ISOLATED FORM +0FDF4 ARABIC LIGATURE MOHAMMAD ISOLATED FORM +0FDF5 ARABIC LIGATURE SALAM ISOLATED FORM +0FDF6 ARABIC LIGATURE RASOUL ISOLATED FORM +0FDF7 ARABIC LIGATURE ALAYHE ISOLATED FORM +0FDF8 ARABIC LIGATURE WASALLAM ISOLATED FORM +0FDF9 ARABIC LIGATURE SALLA ISOLATED FORM +0FDFA ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM +0FDFB ARABIC LIGATURE JALLAJALALOUHOU +0FDFC RIAL SIGN +0FDFD ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM +0FE00 VARIATION SELECTOR-1 +0FE00 VS1 +0FE01 VARIATION SELECTOR-2 +0FE01 VS2 +0FE02 VARIATION SELECTOR-3 +0FE02 VS3 +0FE03 VARIATION SELECTOR-4 +0FE03 VS4 +0FE04 VARIATION SELECTOR-5 +0FE04 VS5 +0FE05 VARIATION SELECTOR-6 +0FE05 VS6 +0FE06 VARIATION SELECTOR-7 +0FE06 VS7 +0FE07 VARIATION SELECTOR-8 +0FE07 VS8 +0FE08 VARIATION SELECTOR-9 +0FE08 VS9 +0FE09 VARIATION SELECTOR-10 +0FE09 VS10 +0FE0A VARIATION SELECTOR-11 +0FE0A VS11 +0FE0B VARIATION SELECTOR-12 +0FE0B VS12 +0FE0C VARIATION SELECTOR-13 +0FE0C VS13 +0FE0D VARIATION SELECTOR-14 +0FE0D VS14 +0FE0E VARIATION SELECTOR-15 +0FE0E VS15 +0FE0F VARIATION SELECTOR-16 +0FE0F VS16 +0FE10 PRESENTATION FORM FOR VERTICAL COMMA +0FE11 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA +0FE12 PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +0FE13 PRESENTATION FORM FOR VERTICAL COLON +0FE14 PRESENTATION FORM FOR VERTICAL SEMICOLON +0FE15 PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK +0FE16 PRESENTATION FORM FOR VERTICAL QUESTION MARK +0FE17 PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +0FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET +0FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +0FE19 PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +0FE20 COMBINING LIGATURE LEFT HALF +0FE21 COMBINING LIGATURE RIGHT HALF +0FE22 COMBINING DOUBLE TILDE LEFT HALF +0FE23 COMBINING DOUBLE TILDE RIGHT HALF +0FE24 COMBINING MACRON LEFT HALF +0FE25 COMBINING MACRON RIGHT HALF +0FE26 COMBINING CONJOINING MACRON +0FE27 COMBINING LIGATURE LEFT HALF BELOW +0FE28 COMBINING LIGATURE RIGHT HALF BELOW +0FE29 COMBINING TILDE LEFT HALF BELOW +0FE2A COMBINING TILDE RIGHT HALF BELOW +0FE2B COMBINING MACRON LEFT HALF BELOW +0FE2C COMBINING MACRON RIGHT HALF BELOW +0FE2D COMBINING CONJOINING MACRON BELOW +0FE2E COMBINING CYRILLIC TITLO LEFT HALF +0FE2F COMBINING CYRILLIC TITLO RIGHT HALF +0FE30 PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +0FE31 PRESENTATION FORM FOR VERTICAL EM DASH +0FE32 PRESENTATION FORM FOR VERTICAL EN DASH +0FE33 PRESENTATION FORM FOR VERTICAL LOW LINE +0FE34 PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +0FE35 PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +0FE36 PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +0FE37 PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +0FE38 PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +0FE39 PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +0FE3A PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +0FE3B PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +0FE3C PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +0FE3D PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +0FE3E PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +0FE3F PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +0FE40 PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +0FE41 PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +0FE42 PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +0FE43 PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +0FE44 PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +0FE45 SESAME DOT +0FE46 WHITE SESAME DOT +0FE47 PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +0FE48 PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +0FE49 DASHED OVERLINE +0FE4A CENTRELINE OVERLINE +0FE4B WAVY OVERLINE +0FE4C DOUBLE WAVY OVERLINE +0FE4D DASHED LOW LINE +0FE4E CENTRELINE LOW LINE +0FE4F WAVY LOW LINE +0FE50 SMALL COMMA +0FE51 SMALL IDEOGRAPHIC COMMA +0FE52 SMALL FULL STOP +0FE54 SMALL SEMICOLON +0FE55 SMALL COLON +0FE56 SMALL QUESTION MARK +0FE57 SMALL EXCLAMATION MARK +0FE58 SMALL EM DASH +0FE59 SMALL LEFT PARENTHESIS +0FE5A SMALL RIGHT PARENTHESIS +0FE5B SMALL LEFT CURLY BRACKET +0FE5C SMALL RIGHT CURLY BRACKET +0FE5D SMALL LEFT TORTOISE SHELL BRACKET +0FE5E SMALL RIGHT TORTOISE SHELL BRACKET +0FE5F SMALL NUMBER SIGN +0FE60 SMALL AMPERSAND +0FE61 SMALL ASTERISK +0FE62 SMALL PLUS SIGN +0FE63 SMALL HYPHEN-MINUS +0FE64 SMALL LESS-THAN SIGN +0FE65 SMALL GREATER-THAN SIGN +0FE66 SMALL EQUALS SIGN +0FE68 SMALL REVERSE SOLIDUS +0FE69 SMALL DOLLAR SIGN +0FE6A SMALL PERCENT SIGN +0FE6B SMALL COMMERCIAL AT +0FE70 ARABIC FATHATAN ISOLATED FORM +0FE71 ARABIC TATWEEL WITH FATHATAN ABOVE +0FE72 ARABIC DAMMATAN ISOLATED FORM +0FE73 ARABIC TAIL FRAGMENT +0FE74 ARABIC KASRATAN ISOLATED FORM +0FE76 ARABIC FATHA ISOLATED FORM +0FE77 ARABIC FATHA MEDIAL FORM +0FE78 ARABIC DAMMA ISOLATED FORM +0FE79 ARABIC DAMMA MEDIAL FORM +0FE7A ARABIC KASRA ISOLATED FORM +0FE7B ARABIC KASRA MEDIAL FORM +0FE7C ARABIC SHADDA ISOLATED FORM +0FE7D ARABIC SHADDA MEDIAL FORM +0FE7E ARABIC SUKUN ISOLATED FORM +0FE7F ARABIC SUKUN MEDIAL FORM +0FE80 ARABIC LETTER HAMZA ISOLATED FORM +0FE81 ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM +0FE82 ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM +0FE83 ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM +0FE84 ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM +0FE85 ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM +0FE86 ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM +0FE87 ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM +0FE88 ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM +0FE89 ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM +0FE8A ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM +0FE8B ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM +0FE8C ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM +0FE8D ARABIC LETTER ALEF ISOLATED FORM +0FE8E ARABIC LETTER ALEF FINAL FORM +0FE8F ARABIC LETTER BEH ISOLATED FORM +0FE90 ARABIC LETTER BEH FINAL FORM +0FE91 ARABIC LETTER BEH INITIAL FORM +0FE92 ARABIC LETTER BEH MEDIAL FORM +0FE93 ARABIC LETTER TEH MARBUTA ISOLATED FORM +0FE94 ARABIC LETTER TEH MARBUTA FINAL FORM +0FE95 ARABIC LETTER TEH ISOLATED FORM +0FE96 ARABIC LETTER TEH FINAL FORM +0FE97 ARABIC LETTER TEH INITIAL FORM +0FE98 ARABIC LETTER TEH MEDIAL FORM +0FE99 ARABIC LETTER THEH ISOLATED FORM +0FE9A ARABIC LETTER THEH FINAL FORM +0FE9B ARABIC LETTER THEH INITIAL FORM +0FE9C ARABIC LETTER THEH MEDIAL FORM +0FE9D ARABIC LETTER JEEM ISOLATED FORM +0FE9E ARABIC LETTER JEEM FINAL FORM +0FE9F ARABIC LETTER JEEM INITIAL FORM +0FEA0 ARABIC LETTER JEEM MEDIAL FORM +0FEA1 ARABIC LETTER HAH ISOLATED FORM +0FEA2 ARABIC LETTER HAH FINAL FORM +0FEA3 ARABIC LETTER HAH INITIAL FORM +0FEA4 ARABIC LETTER HAH MEDIAL FORM +0FEA5 ARABIC LETTER KHAH ISOLATED FORM +0FEA6 ARABIC LETTER KHAH FINAL FORM +0FEA7 ARABIC LETTER KHAH INITIAL FORM +0FEA8 ARABIC LETTER KHAH MEDIAL FORM +0FEA9 ARABIC LETTER DAL ISOLATED FORM +0FEAA ARABIC LETTER DAL FINAL FORM +0FEAB ARABIC LETTER THAL ISOLATED FORM +0FEAC ARABIC LETTER THAL FINAL FORM +0FEAD ARABIC LETTER REH ISOLATED FORM +0FEAE ARABIC LETTER REH FINAL FORM +0FEAF ARABIC LETTER ZAIN ISOLATED FORM +0FEB0 ARABIC LETTER ZAIN FINAL FORM +0FEB1 ARABIC LETTER SEEN ISOLATED FORM +0FEB2 ARABIC LETTER SEEN FINAL FORM +0FEB3 ARABIC LETTER SEEN INITIAL FORM +0FEB4 ARABIC LETTER SEEN MEDIAL FORM +0FEB5 ARABIC LETTER SHEEN ISOLATED FORM +0FEB6 ARABIC LETTER SHEEN FINAL FORM +0FEB7 ARABIC LETTER SHEEN INITIAL FORM +0FEB8 ARABIC LETTER SHEEN MEDIAL FORM +0FEB9 ARABIC LETTER SAD ISOLATED FORM +0FEBA ARABIC LETTER SAD FINAL FORM +0FEBB ARABIC LETTER SAD INITIAL FORM +0FEBC ARABIC LETTER SAD MEDIAL FORM +0FEBD ARABIC LETTER DAD ISOLATED FORM +0FEBE ARABIC LETTER DAD FINAL FORM +0FEBF ARABIC LETTER DAD INITIAL FORM +0FEC0 ARABIC LETTER DAD MEDIAL FORM +0FEC1 ARABIC LETTER TAH ISOLATED FORM +0FEC2 ARABIC LETTER TAH FINAL FORM +0FEC3 ARABIC LETTER TAH INITIAL FORM +0FEC4 ARABIC LETTER TAH MEDIAL FORM +0FEC5 ARABIC LETTER ZAH ISOLATED FORM +0FEC6 ARABIC LETTER ZAH FINAL FORM +0FEC7 ARABIC LETTER ZAH INITIAL FORM +0FEC8 ARABIC LETTER ZAH MEDIAL FORM +0FEC9 ARABIC LETTER AIN ISOLATED FORM +0FECA ARABIC LETTER AIN FINAL FORM +0FECB ARABIC LETTER AIN INITIAL FORM +0FECC ARABIC LETTER AIN MEDIAL FORM +0FECD ARABIC LETTER GHAIN ISOLATED FORM +0FECE ARABIC LETTER GHAIN FINAL FORM +0FECF ARABIC LETTER GHAIN INITIAL FORM +0FED0 ARABIC LETTER GHAIN MEDIAL FORM +0FED1 ARABIC LETTER FEH ISOLATED FORM +0FED2 ARABIC LETTER FEH FINAL FORM +0FED3 ARABIC LETTER FEH INITIAL FORM +0FED4 ARABIC LETTER FEH MEDIAL FORM +0FED5 ARABIC LETTER QAF ISOLATED FORM +0FED6 ARABIC LETTER QAF FINAL FORM +0FED7 ARABIC LETTER QAF INITIAL FORM +0FED8 ARABIC LETTER QAF MEDIAL FORM +0FED9 ARABIC LETTER KAF ISOLATED FORM +0FEDA ARABIC LETTER KAF FINAL FORM +0FEDB ARABIC LETTER KAF INITIAL FORM +0FEDC ARABIC LETTER KAF MEDIAL FORM +0FEDD ARABIC LETTER LAM ISOLATED FORM +0FEDE ARABIC LETTER LAM FINAL FORM +0FEDF ARABIC LETTER LAM INITIAL FORM +0FEE0 ARABIC LETTER LAM MEDIAL FORM +0FEE1 ARABIC LETTER MEEM ISOLATED FORM +0FEE2 ARABIC LETTER MEEM FINAL FORM +0FEE3 ARABIC LETTER MEEM INITIAL FORM +0FEE4 ARABIC LETTER MEEM MEDIAL FORM +0FEE5 ARABIC LETTER NOON ISOLATED FORM +0FEE6 ARABIC LETTER NOON FINAL FORM +0FEE7 ARABIC LETTER NOON INITIAL FORM +0FEE8 ARABIC LETTER NOON MEDIAL FORM +0FEE9 ARABIC LETTER HEH ISOLATED FORM +0FEEA ARABIC LETTER HEH FINAL FORM +0FEEB ARABIC LETTER HEH INITIAL FORM +0FEEC ARABIC LETTER HEH MEDIAL FORM +0FEED ARABIC LETTER WAW ISOLATED FORM +0FEEE ARABIC LETTER WAW FINAL FORM +0FEEF ARABIC LETTER ALEF MAKSURA ISOLATED FORM +0FEF0 ARABIC LETTER ALEF MAKSURA FINAL FORM +0FEF1 ARABIC LETTER YEH ISOLATED FORM +0FEF2 ARABIC LETTER YEH FINAL FORM +0FEF3 ARABIC LETTER YEH INITIAL FORM +0FEF4 ARABIC LETTER YEH MEDIAL FORM +0FEF5 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM +0FEF6 ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM +0FEF7 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM +0FEF8 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM +0FEF9 ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM +0FEFA ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM +0FEFB ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM +0FEFC ARABIC LIGATURE LAM WITH ALEF FINAL FORM +0FEFF ZERO WIDTH NO-BREAK SPACE +0FEFF BYTE ORDER MARK +0FEFF BOM +0FEFF ZWNBSP +0FF01 FULLWIDTH EXCLAMATION MARK +0FF02 FULLWIDTH QUOTATION MARK +0FF03 FULLWIDTH NUMBER SIGN +0FF04 FULLWIDTH DOLLAR SIGN +0FF05 FULLWIDTH PERCENT SIGN +0FF06 FULLWIDTH AMPERSAND +0FF07 FULLWIDTH APOSTROPHE +0FF08 FULLWIDTH LEFT PARENTHESIS +0FF09 FULLWIDTH RIGHT PARENTHESIS +0FF0A FULLWIDTH ASTERISK +0FF0B FULLWIDTH PLUS SIGN +0FF0C FULLWIDTH COMMA +0FF0D FULLWIDTH HYPHEN-MINUS +0FF0E FULLWIDTH FULL STOP +0FF0F FULLWIDTH SOLIDUS +0FF10 FULLWIDTH DIGIT ZERO +0FF11 FULLWIDTH DIGIT ONE +0FF12 FULLWIDTH DIGIT TWO +0FF13 FULLWIDTH DIGIT THREE +0FF14 FULLWIDTH DIGIT FOUR +0FF15 FULLWIDTH DIGIT FIVE +0FF16 FULLWIDTH DIGIT SIX +0FF17 FULLWIDTH DIGIT SEVEN +0FF18 FULLWIDTH DIGIT EIGHT +0FF19 FULLWIDTH DIGIT NINE +0FF1A FULLWIDTH COLON +0FF1B FULLWIDTH SEMICOLON +0FF1C FULLWIDTH LESS-THAN SIGN +0FF1D FULLWIDTH EQUALS SIGN +0FF1E FULLWIDTH GREATER-THAN SIGN +0FF1F FULLWIDTH QUESTION MARK +0FF20 FULLWIDTH COMMERCIAL AT +0FF21 FULLWIDTH LATIN CAPITAL LETTER A +0FF22 FULLWIDTH LATIN CAPITAL LETTER B +0FF23 FULLWIDTH LATIN CAPITAL LETTER C +0FF24 FULLWIDTH LATIN CAPITAL LETTER D +0FF25 FULLWIDTH LATIN CAPITAL LETTER E +0FF26 FULLWIDTH LATIN CAPITAL LETTER F +0FF27 FULLWIDTH LATIN CAPITAL LETTER G +0FF28 FULLWIDTH LATIN CAPITAL LETTER H +0FF29 FULLWIDTH LATIN CAPITAL LETTER I +0FF2A FULLWIDTH LATIN CAPITAL LETTER J +0FF2B FULLWIDTH LATIN CAPITAL LETTER K +0FF2C FULLWIDTH LATIN CAPITAL LETTER L +0FF2D FULLWIDTH LATIN CAPITAL LETTER M +0FF2E FULLWIDTH LATIN CAPITAL LETTER N +0FF2F FULLWIDTH LATIN CAPITAL LETTER O +0FF30 FULLWIDTH LATIN CAPITAL LETTER P +0FF31 FULLWIDTH LATIN CAPITAL LETTER Q +0FF32 FULLWIDTH LATIN CAPITAL LETTER R +0FF33 FULLWIDTH LATIN CAPITAL LETTER S +0FF34 FULLWIDTH LATIN CAPITAL LETTER T +0FF35 FULLWIDTH LATIN CAPITAL LETTER U +0FF36 FULLWIDTH LATIN CAPITAL LETTER V +0FF37 FULLWIDTH LATIN CAPITAL LETTER W +0FF38 FULLWIDTH LATIN CAPITAL LETTER X +0FF39 FULLWIDTH LATIN CAPITAL LETTER Y +0FF3A FULLWIDTH LATIN CAPITAL LETTER Z +0FF3B FULLWIDTH LEFT SQUARE BRACKET +0FF3C FULLWIDTH REVERSE SOLIDUS +0FF3D FULLWIDTH RIGHT SQUARE BRACKET +0FF3E FULLWIDTH CIRCUMFLEX ACCENT +0FF3F FULLWIDTH LOW LINE +0FF40 FULLWIDTH GRAVE ACCENT +0FF41 FULLWIDTH LATIN SMALL LETTER A +0FF42 FULLWIDTH LATIN SMALL LETTER B +0FF43 FULLWIDTH LATIN SMALL LETTER C +0FF44 FULLWIDTH LATIN SMALL LETTER D +0FF45 FULLWIDTH LATIN SMALL LETTER E +0FF46 FULLWIDTH LATIN SMALL LETTER F +0FF47 FULLWIDTH LATIN SMALL LETTER G +0FF48 FULLWIDTH LATIN SMALL LETTER H +0FF49 FULLWIDTH LATIN SMALL LETTER I +0FF4A FULLWIDTH LATIN SMALL LETTER J +0FF4B FULLWIDTH LATIN SMALL LETTER K +0FF4C FULLWIDTH LATIN SMALL LETTER L +0FF4D FULLWIDTH LATIN SMALL LETTER M +0FF4E FULLWIDTH LATIN SMALL LETTER N +0FF4F FULLWIDTH LATIN SMALL LETTER O +0FF50 FULLWIDTH LATIN SMALL LETTER P +0FF51 FULLWIDTH LATIN SMALL LETTER Q +0FF52 FULLWIDTH LATIN SMALL LETTER R +0FF53 FULLWIDTH LATIN SMALL LETTER S +0FF54 FULLWIDTH LATIN SMALL LETTER T +0FF55 FULLWIDTH LATIN SMALL LETTER U +0FF56 FULLWIDTH LATIN SMALL LETTER V +0FF57 FULLWIDTH LATIN SMALL LETTER W +0FF58 FULLWIDTH LATIN SMALL LETTER X +0FF59 FULLWIDTH LATIN SMALL LETTER Y +0FF5A FULLWIDTH LATIN SMALL LETTER Z +0FF5B FULLWIDTH LEFT CURLY BRACKET +0FF5C FULLWIDTH VERTICAL LINE +0FF5D FULLWIDTH RIGHT CURLY BRACKET +0FF5E FULLWIDTH TILDE +0FF5F FULLWIDTH LEFT WHITE PARENTHESIS +0FF60 FULLWIDTH RIGHT WHITE PARENTHESIS +0FF61 HALFWIDTH IDEOGRAPHIC FULL STOP +0FF62 HALFWIDTH LEFT CORNER BRACKET +0FF63 HALFWIDTH RIGHT CORNER BRACKET +0FF64 HALFWIDTH IDEOGRAPHIC COMMA +0FF65 HALFWIDTH KATAKANA MIDDLE DOT +0FF66 HALFWIDTH KATAKANA LETTER WO +0FF67 HALFWIDTH KATAKANA LETTER SMALL A +0FF68 HALFWIDTH KATAKANA LETTER SMALL I +0FF69 HALFWIDTH KATAKANA LETTER SMALL U +0FF6A HALFWIDTH KATAKANA LETTER SMALL E +0FF6B HALFWIDTH KATAKANA LETTER SMALL O +0FF6C HALFWIDTH KATAKANA LETTER SMALL YA +0FF6D HALFWIDTH KATAKANA LETTER SMALL YU +0FF6E HALFWIDTH KATAKANA LETTER SMALL YO +0FF6F HALFWIDTH KATAKANA LETTER SMALL TU +0FF70 HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +0FF71 HALFWIDTH KATAKANA LETTER A +0FF72 HALFWIDTH KATAKANA LETTER I +0FF73 HALFWIDTH KATAKANA LETTER U +0FF74 HALFWIDTH KATAKANA LETTER E +0FF75 HALFWIDTH KATAKANA LETTER O +0FF76 HALFWIDTH KATAKANA LETTER KA +0FF77 HALFWIDTH KATAKANA LETTER KI +0FF78 HALFWIDTH KATAKANA LETTER KU +0FF79 HALFWIDTH KATAKANA LETTER KE +0FF7A HALFWIDTH KATAKANA LETTER KO +0FF7B HALFWIDTH KATAKANA LETTER SA +0FF7C HALFWIDTH KATAKANA LETTER SI +0FF7D HALFWIDTH KATAKANA LETTER SU +0FF7E HALFWIDTH KATAKANA LETTER SE +0FF7F HALFWIDTH KATAKANA LETTER SO +0FF80 HALFWIDTH KATAKANA LETTER TA +0FF81 HALFWIDTH KATAKANA LETTER TI +0FF82 HALFWIDTH KATAKANA LETTER TU +0FF83 HALFWIDTH KATAKANA LETTER TE +0FF84 HALFWIDTH KATAKANA LETTER TO +0FF85 HALFWIDTH KATAKANA LETTER NA +0FF86 HALFWIDTH KATAKANA LETTER NI +0FF87 HALFWIDTH KATAKANA LETTER NU +0FF88 HALFWIDTH KATAKANA LETTER NE +0FF89 HALFWIDTH KATAKANA LETTER NO +0FF8A HALFWIDTH KATAKANA LETTER HA +0FF8B HALFWIDTH KATAKANA LETTER HI +0FF8C HALFWIDTH KATAKANA LETTER HU +0FF8D HALFWIDTH KATAKANA LETTER HE +0FF8E HALFWIDTH KATAKANA LETTER HO +0FF8F HALFWIDTH KATAKANA LETTER MA +0FF90 HALFWIDTH KATAKANA LETTER MI +0FF91 HALFWIDTH KATAKANA LETTER MU +0FF92 HALFWIDTH KATAKANA LETTER ME +0FF93 HALFWIDTH KATAKANA LETTER MO +0FF94 HALFWIDTH KATAKANA LETTER YA +0FF95 HALFWIDTH KATAKANA LETTER YU +0FF96 HALFWIDTH KATAKANA LETTER YO +0FF97 HALFWIDTH KATAKANA LETTER RA +0FF98 HALFWIDTH KATAKANA LETTER RI +0FF99 HALFWIDTH KATAKANA LETTER RU +0FF9A HALFWIDTH KATAKANA LETTER RE +0FF9B HALFWIDTH KATAKANA LETTER RO +0FF9C HALFWIDTH KATAKANA LETTER WA +0FF9D HALFWIDTH KATAKANA LETTER N +0FF9E HALFWIDTH KATAKANA VOICED SOUND MARK +0FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +0FFA0 HALFWIDTH HANGUL FILLER +0FFA1 HALFWIDTH HANGUL LETTER KIYEOK +0FFA2 HALFWIDTH HANGUL LETTER SSANGKIYEOK +0FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS +0FFA4 HALFWIDTH HANGUL LETTER NIEUN +0FFA5 HALFWIDTH HANGUL LETTER NIEUN-CIEUC +0FFA6 HALFWIDTH HANGUL LETTER NIEUN-HIEUH +0FFA7 HALFWIDTH HANGUL LETTER TIKEUT +0FFA8 HALFWIDTH HANGUL LETTER SSANGTIKEUT +0FFA9 HALFWIDTH HANGUL LETTER RIEUL +0FFAA HALFWIDTH HANGUL LETTER RIEUL-KIYEOK +0FFAB HALFWIDTH HANGUL LETTER RIEUL-MIEUM +0FFAC HALFWIDTH HANGUL LETTER RIEUL-PIEUP +0FFAD HALFWIDTH HANGUL LETTER RIEUL-SIOS +0FFAE HALFWIDTH HANGUL LETTER RIEUL-THIEUTH +0FFAF HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH +0FFB0 HALFWIDTH HANGUL LETTER RIEUL-HIEUH +0FFB1 HALFWIDTH HANGUL LETTER MIEUM +0FFB2 HALFWIDTH HANGUL LETTER PIEUP +0FFB3 HALFWIDTH HANGUL LETTER SSANGPIEUP +0FFB4 HALFWIDTH HANGUL LETTER PIEUP-SIOS +0FFB5 HALFWIDTH HANGUL LETTER SIOS +0FFB6 HALFWIDTH HANGUL LETTER SSANGSIOS +0FFB7 HALFWIDTH HANGUL LETTER IEUNG +0FFB8 HALFWIDTH HANGUL LETTER CIEUC +0FFB9 HALFWIDTH HANGUL LETTER SSANGCIEUC +0FFBA HALFWIDTH HANGUL LETTER CHIEUCH +0FFBB HALFWIDTH HANGUL LETTER KHIEUKH +0FFBC HALFWIDTH HANGUL LETTER THIEUTH +0FFBD HALFWIDTH HANGUL LETTER PHIEUPH +0FFBE HALFWIDTH HANGUL LETTER HIEUH +0FFC2 HALFWIDTH HANGUL LETTER A +0FFC3 HALFWIDTH HANGUL LETTER AE +0FFC4 HALFWIDTH HANGUL LETTER YA +0FFC5 HALFWIDTH HANGUL LETTER YAE +0FFC6 HALFWIDTH HANGUL LETTER EO +0FFC7 HALFWIDTH HANGUL LETTER E +0FFCA HALFWIDTH HANGUL LETTER YEO +0FFCB HALFWIDTH HANGUL LETTER YE +0FFCC HALFWIDTH HANGUL LETTER O +0FFCD HALFWIDTH HANGUL LETTER WA +0FFCE HALFWIDTH HANGUL LETTER WAE +0FFCF HALFWIDTH HANGUL LETTER OE +0FFD2 HALFWIDTH HANGUL LETTER YO +0FFD3 HALFWIDTH HANGUL LETTER U +0FFD4 HALFWIDTH HANGUL LETTER WEO +0FFD5 HALFWIDTH HANGUL LETTER WE +0FFD6 HALFWIDTH HANGUL LETTER WI +0FFD7 HALFWIDTH HANGUL LETTER YU +0FFDA HALFWIDTH HANGUL LETTER EU +0FFDB HALFWIDTH HANGUL LETTER YI +0FFDC HALFWIDTH HANGUL LETTER I +0FFE0 FULLWIDTH CENT SIGN +0FFE1 FULLWIDTH POUND SIGN +0FFE2 FULLWIDTH NOT SIGN +0FFE3 FULLWIDTH MACRON +0FFE4 FULLWIDTH BROKEN BAR +0FFE5 FULLWIDTH YEN SIGN +0FFE6 FULLWIDTH WON SIGN +0FFE8 HALFWIDTH FORMS LIGHT VERTICAL +0FFE9 HALFWIDTH LEFTWARDS ARROW +0FFEA HALFWIDTH UPWARDS ARROW +0FFEB HALFWIDTH RIGHTWARDS ARROW +0FFEC HALFWIDTH DOWNWARDS ARROW +0FFED HALFWIDTH BLACK SQUARE +0FFEE HALFWIDTH WHITE CIRCLE +0FFF9 INTERLINEAR ANNOTATION ANCHOR +0FFFA INTERLINEAR ANNOTATION SEPARATOR +0FFFB INTERLINEAR ANNOTATION TERMINATOR +0FFFC OBJECT REPLACEMENT CHARACTER +0FFFD REPLACEMENT CHARACTER +10000 LINEAR B SYLLABLE B008 A +10001 LINEAR B SYLLABLE B038 E +10002 LINEAR B SYLLABLE B028 I +10003 LINEAR B SYLLABLE B061 O +10004 LINEAR B SYLLABLE B010 U +10005 LINEAR B SYLLABLE B001 DA +10006 LINEAR B SYLLABLE B045 DE +10007 LINEAR B SYLLABLE B007 DI +10008 LINEAR B SYLLABLE B014 DO +10009 LINEAR B SYLLABLE B051 DU +1000A LINEAR B SYLLABLE B057 JA +1000B LINEAR B SYLLABLE B046 JE +1000D LINEAR B SYLLABLE B036 JO +1000E LINEAR B SYLLABLE B065 JU +1000F LINEAR B SYLLABLE B077 KA +10010 LINEAR B SYLLABLE B044 KE +10011 LINEAR B SYLLABLE B067 KI +10012 LINEAR B SYLLABLE B070 KO +10013 LINEAR B SYLLABLE B081 KU +10014 LINEAR B SYLLABLE B080 MA +10015 LINEAR B SYLLABLE B013 ME +10016 LINEAR B SYLLABLE B073 MI +10017 LINEAR B SYLLABLE B015 MO +10018 LINEAR B SYLLABLE B023 MU +10019 LINEAR B SYLLABLE B006 NA +1001A LINEAR B SYLLABLE B024 NE +1001B LINEAR B SYLLABLE B030 NI +1001C LINEAR B SYLLABLE B052 NO +1001D LINEAR B SYLLABLE B055 NU +1001E LINEAR B SYLLABLE B003 PA +1001F LINEAR B SYLLABLE B072 PE +10020 LINEAR B SYLLABLE B039 PI +10021 LINEAR B SYLLABLE B011 PO +10022 LINEAR B SYLLABLE B050 PU +10023 LINEAR B SYLLABLE B016 QA +10024 LINEAR B SYLLABLE B078 QE +10025 LINEAR B SYLLABLE B021 QI +10026 LINEAR B SYLLABLE B032 QO +10028 LINEAR B SYLLABLE B060 RA +10029 LINEAR B SYLLABLE B027 RE +1002A LINEAR B SYLLABLE B053 RI +1002B LINEAR B SYLLABLE B002 RO +1002C LINEAR B SYLLABLE B026 RU +1002D LINEAR B SYLLABLE B031 SA +1002E LINEAR B SYLLABLE B009 SE +1002F LINEAR B SYLLABLE B041 SI +10030 LINEAR B SYLLABLE B012 SO +10031 LINEAR B SYLLABLE B058 SU +10032 LINEAR B SYLLABLE B059 TA +10033 LINEAR B SYLLABLE B004 TE +10034 LINEAR B SYLLABLE B037 TI +10035 LINEAR B SYLLABLE B005 TO +10036 LINEAR B SYLLABLE B069 TU +10037 LINEAR B SYLLABLE B054 WA +10038 LINEAR B SYLLABLE B075 WE +10039 LINEAR B SYLLABLE B040 WI +1003A LINEAR B SYLLABLE B042 WO +1003C LINEAR B SYLLABLE B017 ZA +1003D LINEAR B SYLLABLE B074 ZE +1003F LINEAR B SYLLABLE B020 ZO +10040 LINEAR B SYLLABLE B025 A2 +10041 LINEAR B SYLLABLE B043 A3 +10042 LINEAR B SYLLABLE B085 AU +10043 LINEAR B SYLLABLE B071 DWE +10044 LINEAR B SYLLABLE B090 DWO +10045 LINEAR B SYLLABLE B048 NWA +10046 LINEAR B SYLLABLE B029 PU2 +10047 LINEAR B SYLLABLE B062 PTE +10048 LINEAR B SYLLABLE B076 RA2 +10049 LINEAR B SYLLABLE B033 RA3 +1004A LINEAR B SYLLABLE B068 RO2 +1004B LINEAR B SYLLABLE B066 TA2 +1004C LINEAR B SYLLABLE B087 TWE +1004D LINEAR B SYLLABLE B091 TWO +10050 LINEAR B SYMBOL B018 +10051 LINEAR B SYMBOL B019 +10052 LINEAR B SYMBOL B022 +10053 LINEAR B SYMBOL B034 +10054 LINEAR B SYMBOL B047 +10055 LINEAR B SYMBOL B049 +10056 LINEAR B SYMBOL B056 +10057 LINEAR B SYMBOL B063 +10058 LINEAR B SYMBOL B064 +10059 LINEAR B SYMBOL B079 +1005A LINEAR B SYMBOL B082 +1005B LINEAR B SYMBOL B083 +1005C LINEAR B SYMBOL B086 +1005D LINEAR B SYMBOL B089 +10080 LINEAR B IDEOGRAM B100 MAN +10081 LINEAR B IDEOGRAM B102 WOMAN +10082 LINEAR B IDEOGRAM B104 DEER +10083 LINEAR B IDEOGRAM B105 EQUID +10084 LINEAR B IDEOGRAM B105F MARE +10085 LINEAR B IDEOGRAM B105M STALLION +10086 LINEAR B IDEOGRAM B106F EWE +10087 LINEAR B IDEOGRAM B106M RAM +10088 LINEAR B IDEOGRAM B107F SHE-GOAT +10089 LINEAR B IDEOGRAM B107M HE-GOAT +1008A LINEAR B IDEOGRAM B108F SOW +1008B LINEAR B IDEOGRAM B108M BOAR +1008C LINEAR B IDEOGRAM B109F COW +1008D LINEAR B IDEOGRAM B109M BULL +1008E LINEAR B IDEOGRAM B120 WHEAT +1008F LINEAR B IDEOGRAM B121 BARLEY +10090 LINEAR B IDEOGRAM B122 OLIVE +10091 LINEAR B IDEOGRAM B123 SPICE +10092 LINEAR B IDEOGRAM B125 CYPERUS +10093 LINEAR B MONOGRAM B127 KAPO +10094 LINEAR B MONOGRAM B128 KANAKO +10095 LINEAR B IDEOGRAM B130 OIL +10096 LINEAR B IDEOGRAM B131 WINE +10097 LINEAR B IDEOGRAM B132 +10098 LINEAR B MONOGRAM B133 AREPA +10099 LINEAR B MONOGRAM B135 MERI +1009A LINEAR B IDEOGRAM B140 BRONZE +1009B LINEAR B IDEOGRAM B141 GOLD +1009C LINEAR B IDEOGRAM B142 +1009D LINEAR B IDEOGRAM B145 WOOL +1009E LINEAR B IDEOGRAM B146 +1009F LINEAR B IDEOGRAM B150 +100A0 LINEAR B IDEOGRAM B151 HORN +100A1 LINEAR B IDEOGRAM B152 +100A2 LINEAR B IDEOGRAM B153 +100A3 LINEAR B IDEOGRAM B154 +100A4 LINEAR B MONOGRAM B156 TURO2 +100A5 LINEAR B IDEOGRAM B157 +100A6 LINEAR B IDEOGRAM B158 +100A7 LINEAR B IDEOGRAM B159 CLOTH +100A8 LINEAR B IDEOGRAM B160 +100A9 LINEAR B IDEOGRAM B161 +100AA LINEAR B IDEOGRAM B162 GARMENT +100AB LINEAR B IDEOGRAM B163 ARMOUR +100AC LINEAR B IDEOGRAM B164 +100AD LINEAR B IDEOGRAM B165 +100AE LINEAR B IDEOGRAM B166 +100AF LINEAR B IDEOGRAM B167 +100B0 LINEAR B IDEOGRAM B168 +100B1 LINEAR B IDEOGRAM B169 +100B2 LINEAR B IDEOGRAM B170 +100B3 LINEAR B IDEOGRAM B171 +100B4 LINEAR B IDEOGRAM B172 +100B5 LINEAR B IDEOGRAM B173 MONTH +100B6 LINEAR B IDEOGRAM B174 +100B7 LINEAR B IDEOGRAM B176 TREE +100B8 LINEAR B IDEOGRAM B177 +100B9 LINEAR B IDEOGRAM B178 +100BA LINEAR B IDEOGRAM B179 +100BB LINEAR B IDEOGRAM B180 +100BC LINEAR B IDEOGRAM B181 +100BD LINEAR B IDEOGRAM B182 +100BE LINEAR B IDEOGRAM B183 +100BF LINEAR B IDEOGRAM B184 +100C0 LINEAR B IDEOGRAM B185 +100C1 LINEAR B IDEOGRAM B189 +100C2 LINEAR B IDEOGRAM B190 +100C3 LINEAR B IDEOGRAM B191 HELMET +100C4 LINEAR B IDEOGRAM B220 FOOTSTOOL +100C5 LINEAR B IDEOGRAM B225 BATHTUB +100C6 LINEAR B IDEOGRAM B230 SPEAR +100C7 LINEAR B IDEOGRAM B231 ARROW +100C8 LINEAR B IDEOGRAM B232 +100C9 LINEAR B IDEOGRAM B233 SWORD +100CA LINEAR B IDEOGRAM B234 +100CB LINEAR B IDEOGRAM B236 +100CC LINEAR B IDEOGRAM B240 WHEELED CHARIOT +100CD LINEAR B IDEOGRAM B241 CHARIOT +100CE LINEAR B IDEOGRAM B242 CHARIOT FRAME +100CF LINEAR B IDEOGRAM B243 WHEEL +100D0 LINEAR B IDEOGRAM B245 +100D1 LINEAR B IDEOGRAM B246 +100D2 LINEAR B MONOGRAM B247 DIPTE +100D3 LINEAR B IDEOGRAM B248 +100D4 LINEAR B IDEOGRAM B249 +100D5 LINEAR B IDEOGRAM B251 +100D6 LINEAR B IDEOGRAM B252 +100D7 LINEAR B IDEOGRAM B253 +100D8 LINEAR B IDEOGRAM B254 DART +100D9 LINEAR B IDEOGRAM B255 +100DA LINEAR B IDEOGRAM B256 +100DB LINEAR B IDEOGRAM B257 +100DC LINEAR B IDEOGRAM B258 +100DD LINEAR B IDEOGRAM B259 +100DE LINEAR B IDEOGRAM VESSEL B155 +100DF LINEAR B IDEOGRAM VESSEL B200 +100E0 LINEAR B IDEOGRAM VESSEL B201 +100E1 LINEAR B IDEOGRAM VESSEL B202 +100E2 LINEAR B IDEOGRAM VESSEL B203 +100E3 LINEAR B IDEOGRAM VESSEL B204 +100E4 LINEAR B IDEOGRAM VESSEL B205 +100E5 LINEAR B IDEOGRAM VESSEL B206 +100E6 LINEAR B IDEOGRAM VESSEL B207 +100E7 LINEAR B IDEOGRAM VESSEL B208 +100E8 LINEAR B IDEOGRAM VESSEL B209 +100E9 LINEAR B IDEOGRAM VESSEL B210 +100EA LINEAR B IDEOGRAM VESSEL B211 +100EB LINEAR B IDEOGRAM VESSEL B212 +100EC LINEAR B IDEOGRAM VESSEL B213 +100ED LINEAR B IDEOGRAM VESSEL B214 +100EE LINEAR B IDEOGRAM VESSEL B215 +100EF LINEAR B IDEOGRAM VESSEL B216 +100F0 LINEAR B IDEOGRAM VESSEL B217 +100F1 LINEAR B IDEOGRAM VESSEL B218 +100F2 LINEAR B IDEOGRAM VESSEL B219 +100F3 LINEAR B IDEOGRAM VESSEL B221 +100F4 LINEAR B IDEOGRAM VESSEL B222 +100F5 LINEAR B IDEOGRAM VESSEL B226 +100F6 LINEAR B IDEOGRAM VESSEL B227 +100F7 LINEAR B IDEOGRAM VESSEL B228 +100F8 LINEAR B IDEOGRAM VESSEL B229 +100F9 LINEAR B IDEOGRAM VESSEL B250 +100FA LINEAR B IDEOGRAM VESSEL B305 +10100 AEGEAN WORD SEPARATOR LINE +10101 AEGEAN WORD SEPARATOR DOT +10102 AEGEAN CHECK MARK +10107 AEGEAN NUMBER ONE +10108 AEGEAN NUMBER TWO +10109 AEGEAN NUMBER THREE +1010A AEGEAN NUMBER FOUR +1010B AEGEAN NUMBER FIVE +1010C AEGEAN NUMBER SIX +1010D AEGEAN NUMBER SEVEN +1010E AEGEAN NUMBER EIGHT +1010F AEGEAN NUMBER NINE +10110 AEGEAN NUMBER TEN +10111 AEGEAN NUMBER TWENTY +10112 AEGEAN NUMBER THIRTY +10113 AEGEAN NUMBER FORTY +10114 AEGEAN NUMBER FIFTY +10115 AEGEAN NUMBER SIXTY +10116 AEGEAN NUMBER SEVENTY +10117 AEGEAN NUMBER EIGHTY +10118 AEGEAN NUMBER NINETY +10119 AEGEAN NUMBER ONE HUNDRED +1011A AEGEAN NUMBER TWO HUNDRED +1011B AEGEAN NUMBER THREE HUNDRED +1011C AEGEAN NUMBER FOUR HUNDRED +1011D AEGEAN NUMBER FIVE HUNDRED +1011E AEGEAN NUMBER SIX HUNDRED +1011F AEGEAN NUMBER SEVEN HUNDRED +10120 AEGEAN NUMBER EIGHT HUNDRED +10121 AEGEAN NUMBER NINE HUNDRED +10122 AEGEAN NUMBER ONE THOUSAND +10123 AEGEAN NUMBER TWO THOUSAND +10124 AEGEAN NUMBER THREE THOUSAND +10125 AEGEAN NUMBER FOUR THOUSAND +10126 AEGEAN NUMBER FIVE THOUSAND +10127 AEGEAN NUMBER SIX THOUSAND +10128 AEGEAN NUMBER SEVEN THOUSAND +10129 AEGEAN NUMBER EIGHT THOUSAND +1012A AEGEAN NUMBER NINE THOUSAND +1012B AEGEAN NUMBER TEN THOUSAND +1012C AEGEAN NUMBER TWENTY THOUSAND +1012D AEGEAN NUMBER THIRTY THOUSAND +1012E AEGEAN NUMBER FORTY THOUSAND +1012F AEGEAN NUMBER FIFTY THOUSAND +10130 AEGEAN NUMBER SIXTY THOUSAND +10131 AEGEAN NUMBER SEVENTY THOUSAND +10132 AEGEAN NUMBER EIGHTY THOUSAND +10133 AEGEAN NUMBER NINETY THOUSAND +10137 AEGEAN WEIGHT BASE UNIT +10138 AEGEAN WEIGHT FIRST SUBUNIT +10139 AEGEAN WEIGHT SECOND SUBUNIT +1013A AEGEAN WEIGHT THIRD SUBUNIT +1013B AEGEAN WEIGHT FOURTH SUBUNIT +1013C AEGEAN DRY MEASURE FIRST SUBUNIT +1013D AEGEAN LIQUID MEASURE FIRST SUBUNIT +1013E AEGEAN MEASURE SECOND SUBUNIT +1013F AEGEAN MEASURE THIRD SUBUNIT +10140 GREEK ACROPHONIC ATTIC ONE QUARTER +10141 GREEK ACROPHONIC ATTIC ONE HALF +10142 GREEK ACROPHONIC ATTIC ONE DRACHMA +10143 GREEK ACROPHONIC ATTIC FIVE +10144 GREEK ACROPHONIC ATTIC FIFTY +10145 GREEK ACROPHONIC ATTIC FIVE HUNDRED +10146 GREEK ACROPHONIC ATTIC FIVE THOUSAND +10147 GREEK ACROPHONIC ATTIC FIFTY THOUSAND +10148 GREEK ACROPHONIC ATTIC FIVE TALENTS +10149 GREEK ACROPHONIC ATTIC TEN TALENTS +1014A GREEK ACROPHONIC ATTIC FIFTY TALENTS +1014B GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS +1014C GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS +1014D GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS +1014E GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS +1014F GREEK ACROPHONIC ATTIC FIVE STATERS +10150 GREEK ACROPHONIC ATTIC TEN STATERS +10151 GREEK ACROPHONIC ATTIC FIFTY STATERS +10152 GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS +10153 GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS +10154 GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS +10155 GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS +10156 GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS +10157 GREEK ACROPHONIC ATTIC TEN MNAS +10158 GREEK ACROPHONIC HERAEUM ONE PLETHRON +10159 GREEK ACROPHONIC THESPIAN ONE +1015A GREEK ACROPHONIC HERMIONIAN ONE +1015B GREEK ACROPHONIC EPIDAUREAN TWO +1015C GREEK ACROPHONIC THESPIAN TWO +1015D GREEK ACROPHONIC CYRENAIC TWO DRACHMAS +1015E GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS +1015F GREEK ACROPHONIC TROEZENIAN FIVE +10160 GREEK ACROPHONIC TROEZENIAN TEN +10161 GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM +10162 GREEK ACROPHONIC HERMIONIAN TEN +10163 GREEK ACROPHONIC MESSENIAN TEN +10164 GREEK ACROPHONIC THESPIAN TEN +10165 GREEK ACROPHONIC THESPIAN THIRTY +10166 GREEK ACROPHONIC TROEZENIAN FIFTY +10167 GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM +10168 GREEK ACROPHONIC HERMIONIAN FIFTY +10169 GREEK ACROPHONIC THESPIAN FIFTY +1016A GREEK ACROPHONIC THESPIAN ONE HUNDRED +1016B GREEK ACROPHONIC THESPIAN THREE HUNDRED +1016C GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED +1016D GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED +1016E GREEK ACROPHONIC THESPIAN FIVE HUNDRED +1016F GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED +10170 GREEK ACROPHONIC NAXIAN FIVE HUNDRED +10171 GREEK ACROPHONIC THESPIAN ONE THOUSAND +10172 GREEK ACROPHONIC THESPIAN FIVE THOUSAND +10173 GREEK ACROPHONIC DELPHIC FIVE MNAS +10174 GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175 GREEK ONE HALF SIGN +10176 GREEK ONE HALF SIGN ALTERNATE FORM +10177 GREEK TWO THIRDS SIGN +10178 GREEK THREE QUARTERS SIGN +10179 GREEK YEAR SIGN +1017A GREEK TALENT SIGN +1017B GREEK DRACHMA SIGN +1017C GREEK OBOL SIGN +1017D GREEK TWO OBOLS SIGN +1017E GREEK THREE OBOLS SIGN +1017F GREEK FOUR OBOLS SIGN +10180 GREEK FIVE OBOLS SIGN +10181 GREEK METRETES SIGN +10182 GREEK KYATHOS BASE SIGN +10183 GREEK LITRA SIGN +10184 GREEK OUNKIA SIGN +10185 GREEK XESTES SIGN +10186 GREEK ARTABE SIGN +10187 GREEK AROURA SIGN +10188 GREEK GRAMMA SIGN +10189 GREEK TRYBLION BASE SIGN +1018A GREEK ZERO SIGN +1018B GREEK ONE QUARTER SIGN +1018C GREEK SINUSOID SIGN +1018D GREEK INDICTION SIGN +1018E NOMISMA SIGN +10190 ROMAN SEXTANS SIGN +10191 ROMAN UNCIA SIGN +10192 ROMAN SEMUNCIA SIGN +10193 ROMAN SEXTULA SIGN +10194 ROMAN DIMIDIA SEXTULA SIGN +10195 ROMAN SILIQUA SIGN +10196 ROMAN DENARIUS SIGN +10197 ROMAN QUINARIUS SIGN +10198 ROMAN SESTERTIUS SIGN +10199 ROMAN DUPONDIUS SIGN +1019A ROMAN AS SIGN +1019B ROMAN CENTURIAL SIGN +101A0 GREEK SYMBOL TAU RHO +101D0 PHAISTOS DISC SIGN PEDESTRIAN +101D1 PHAISTOS DISC SIGN PLUMED HEAD +101D2 PHAISTOS DISC SIGN TATTOOED HEAD +101D3 PHAISTOS DISC SIGN CAPTIVE +101D4 PHAISTOS DISC SIGN CHILD +101D5 PHAISTOS DISC SIGN WOMAN +101D6 PHAISTOS DISC SIGN HELMET +101D7 PHAISTOS DISC SIGN GAUNTLET +101D8 PHAISTOS DISC SIGN TIARA +101D9 PHAISTOS DISC SIGN ARROW +101DA PHAISTOS DISC SIGN BOW +101DB PHAISTOS DISC SIGN SHIELD +101DC PHAISTOS DISC SIGN CLUB +101DD PHAISTOS DISC SIGN MANACLES +101DE PHAISTOS DISC SIGN MATTOCK +101DF PHAISTOS DISC SIGN SAW +101E0 PHAISTOS DISC SIGN LID +101E1 PHAISTOS DISC SIGN BOOMERANG +101E2 PHAISTOS DISC SIGN CARPENTRY PLANE +101E3 PHAISTOS DISC SIGN DOLIUM +101E4 PHAISTOS DISC SIGN COMB +101E5 PHAISTOS DISC SIGN SLING +101E6 PHAISTOS DISC SIGN COLUMN +101E7 PHAISTOS DISC SIGN BEEHIVE +101E8 PHAISTOS DISC SIGN SHIP +101E9 PHAISTOS DISC SIGN HORN +101EA PHAISTOS DISC SIGN HIDE +101EB PHAISTOS DISC SIGN BULLS LEG +101EC PHAISTOS DISC SIGN CAT +101ED PHAISTOS DISC SIGN RAM +101EE PHAISTOS DISC SIGN EAGLE +101EF PHAISTOS DISC SIGN DOVE +101F0 PHAISTOS DISC SIGN TUNNY +101F1 PHAISTOS DISC SIGN BEE +101F2 PHAISTOS DISC SIGN PLANE TREE +101F3 PHAISTOS DISC SIGN VINE +101F4 PHAISTOS DISC SIGN PAPYRUS +101F5 PHAISTOS DISC SIGN ROSETTE +101F6 PHAISTOS DISC SIGN LILY +101F7 PHAISTOS DISC SIGN OX BACK +101F8 PHAISTOS DISC SIGN FLUTE +101F9 PHAISTOS DISC SIGN GRATER +101FA PHAISTOS DISC SIGN STRAINER +101FB PHAISTOS DISC SIGN SMALL AXE +101FC PHAISTOS DISC SIGN WAVY BAND +101FD PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280 LYCIAN LETTER A +10281 LYCIAN LETTER E +10282 LYCIAN LETTER B +10283 LYCIAN LETTER BH +10284 LYCIAN LETTER G +10285 LYCIAN LETTER D +10286 LYCIAN LETTER I +10287 LYCIAN LETTER W +10288 LYCIAN LETTER Z +10289 LYCIAN LETTER TH +1028A LYCIAN LETTER J +1028B LYCIAN LETTER K +1028C LYCIAN LETTER Q +1028D LYCIAN LETTER L +1028E LYCIAN LETTER M +1028F LYCIAN LETTER N +10290 LYCIAN LETTER MM +10291 LYCIAN LETTER NN +10292 LYCIAN LETTER U +10293 LYCIAN LETTER P +10294 LYCIAN LETTER KK +10295 LYCIAN LETTER R +10296 LYCIAN LETTER S +10297 LYCIAN LETTER T +10298 LYCIAN LETTER TT +10299 LYCIAN LETTER AN +1029A LYCIAN LETTER EN +1029B LYCIAN LETTER H +1029C LYCIAN LETTER X +102A0 CARIAN LETTER A +102A1 CARIAN LETTER P2 +102A2 CARIAN LETTER D +102A3 CARIAN LETTER L +102A4 CARIAN LETTER UUU +102A5 CARIAN LETTER R +102A6 CARIAN LETTER LD +102A7 CARIAN LETTER A2 +102A8 CARIAN LETTER Q +102A9 CARIAN LETTER B +102AA CARIAN LETTER M +102AB CARIAN LETTER O +102AC CARIAN LETTER D2 +102AD CARIAN LETTER T +102AE CARIAN LETTER SH +102AF CARIAN LETTER SH2 +102B0 CARIAN LETTER S +102B1 CARIAN LETTER C-18 +102B2 CARIAN LETTER U +102B3 CARIAN LETTER NN +102B4 CARIAN LETTER X +102B5 CARIAN LETTER N +102B6 CARIAN LETTER TT2 +102B7 CARIAN LETTER P +102B8 CARIAN LETTER SS +102B9 CARIAN LETTER I +102BA CARIAN LETTER E +102BB CARIAN LETTER UUUU +102BC CARIAN LETTER K +102BD CARIAN LETTER K2 +102BE CARIAN LETTER ND +102BF CARIAN LETTER UU +102C0 CARIAN LETTER G +102C1 CARIAN LETTER G2 +102C2 CARIAN LETTER ST +102C3 CARIAN LETTER ST2 +102C4 CARIAN LETTER NG +102C5 CARIAN LETTER II +102C6 CARIAN LETTER C-39 +102C7 CARIAN LETTER TT +102C8 CARIAN LETTER UUU2 +102C9 CARIAN LETTER RR +102CA CARIAN LETTER MB +102CB CARIAN LETTER MB2 +102CC CARIAN LETTER MB3 +102CD CARIAN LETTER MB4 +102CE CARIAN LETTER LD2 +102CF CARIAN LETTER E2 +102D0 CARIAN LETTER UUU3 +102E0 COPTIC EPACT THOUSANDS MARK +102E1 COPTIC EPACT DIGIT ONE +102E2 COPTIC EPACT DIGIT TWO +102E3 COPTIC EPACT DIGIT THREE +102E4 COPTIC EPACT DIGIT FOUR +102E5 COPTIC EPACT DIGIT FIVE +102E6 COPTIC EPACT DIGIT SIX +102E7 COPTIC EPACT DIGIT SEVEN +102E8 COPTIC EPACT DIGIT EIGHT +102E9 COPTIC EPACT DIGIT NINE +102EA COPTIC EPACT NUMBER TEN +102EB COPTIC EPACT NUMBER TWENTY +102EC COPTIC EPACT NUMBER THIRTY +102ED COPTIC EPACT NUMBER FORTY +102EE COPTIC EPACT NUMBER FIFTY +102EF COPTIC EPACT NUMBER SIXTY +102F0 COPTIC EPACT NUMBER SEVENTY +102F1 COPTIC EPACT NUMBER EIGHTY +102F2 COPTIC EPACT NUMBER NINETY +102F3 COPTIC EPACT NUMBER ONE HUNDRED +102F4 COPTIC EPACT NUMBER TWO HUNDRED +102F5 COPTIC EPACT NUMBER THREE HUNDRED +102F6 COPTIC EPACT NUMBER FOUR HUNDRED +102F7 COPTIC EPACT NUMBER FIVE HUNDRED +102F8 COPTIC EPACT NUMBER SIX HUNDRED +102F9 COPTIC EPACT NUMBER SEVEN HUNDRED +102FA COPTIC EPACT NUMBER EIGHT HUNDRED +102FB COPTIC EPACT NUMBER NINE HUNDRED +10300 OLD ITALIC LETTER A +10301 OLD ITALIC LETTER BE +10302 OLD ITALIC LETTER KE +10303 OLD ITALIC LETTER DE +10304 OLD ITALIC LETTER E +10305 OLD ITALIC LETTER VE +10306 OLD ITALIC LETTER ZE +10307 OLD ITALIC LETTER HE +10308 OLD ITALIC LETTER THE +10309 OLD ITALIC LETTER I +1030A OLD ITALIC LETTER KA +1030B OLD ITALIC LETTER EL +1030C OLD ITALIC LETTER EM +1030D OLD ITALIC LETTER EN +1030E OLD ITALIC LETTER ESH +1030F OLD ITALIC LETTER O +10310 OLD ITALIC LETTER PE +10311 OLD ITALIC LETTER SHE +10312 OLD ITALIC LETTER KU +10313 OLD ITALIC LETTER ER +10314 OLD ITALIC LETTER ES +10315 OLD ITALIC LETTER TE +10316 OLD ITALIC LETTER U +10317 OLD ITALIC LETTER EKS +10318 OLD ITALIC LETTER PHE +10319 OLD ITALIC LETTER KHE +1031A OLD ITALIC LETTER EF +1031B OLD ITALIC LETTER ERS +1031C OLD ITALIC LETTER CHE +1031D OLD ITALIC LETTER II +1031E OLD ITALIC LETTER UU +1031F OLD ITALIC LETTER ESS +10320 OLD ITALIC NUMERAL ONE +10321 OLD ITALIC NUMERAL FIVE +10322 OLD ITALIC NUMERAL TEN +10323 OLD ITALIC NUMERAL FIFTY +1032D OLD ITALIC LETTER YE +1032E OLD ITALIC LETTER NORTHERN TSE +1032F OLD ITALIC LETTER SOUTHERN TSE +10330 GOTHIC LETTER AHSA +10331 GOTHIC LETTER BAIRKAN +10332 GOTHIC LETTER GIBA +10333 GOTHIC LETTER DAGS +10334 GOTHIC LETTER AIHVUS +10335 GOTHIC LETTER QAIRTHRA +10336 GOTHIC LETTER IUJA +10337 GOTHIC LETTER HAGL +10338 GOTHIC LETTER THIUTH +10339 GOTHIC LETTER EIS +1033A GOTHIC LETTER KUSMA +1033B GOTHIC LETTER LAGUS +1033C GOTHIC LETTER MANNA +1033D GOTHIC LETTER NAUTHS +1033E GOTHIC LETTER JER +1033F GOTHIC LETTER URUS +10340 GOTHIC LETTER PAIRTHRA +10341 GOTHIC LETTER NINETY +10342 GOTHIC LETTER RAIDA +10343 GOTHIC LETTER SAUIL +10344 GOTHIC LETTER TEIWS +10345 GOTHIC LETTER WINJA +10346 GOTHIC LETTER FAIHU +10347 GOTHIC LETTER IGGWS +10348 GOTHIC LETTER HWAIR +10349 GOTHIC LETTER OTHAL +1034A GOTHIC LETTER NINE HUNDRED +10350 OLD PERMIC LETTER AN +10351 OLD PERMIC LETTER BUR +10352 OLD PERMIC LETTER GAI +10353 OLD PERMIC LETTER DOI +10354 OLD PERMIC LETTER E +10355 OLD PERMIC LETTER ZHOI +10356 OLD PERMIC LETTER DZHOI +10357 OLD PERMIC LETTER ZATA +10358 OLD PERMIC LETTER DZITA +10359 OLD PERMIC LETTER I +1035A OLD PERMIC LETTER KOKE +1035B OLD PERMIC LETTER LEI +1035C OLD PERMIC LETTER MENOE +1035D OLD PERMIC LETTER NENOE +1035E OLD PERMIC LETTER VOOI +1035F OLD PERMIC LETTER PEEI +10360 OLD PERMIC LETTER REI +10361 OLD PERMIC LETTER SII +10362 OLD PERMIC LETTER TAI +10363 OLD PERMIC LETTER U +10364 OLD PERMIC LETTER CHERY +10365 OLD PERMIC LETTER SHOOI +10366 OLD PERMIC LETTER SHCHOOI +10367 OLD PERMIC LETTER YRY +10368 OLD PERMIC LETTER YERU +10369 OLD PERMIC LETTER O +1036A OLD PERMIC LETTER OO +1036B OLD PERMIC LETTER EF +1036C OLD PERMIC LETTER HA +1036D OLD PERMIC LETTER TSIU +1036E OLD PERMIC LETTER VER +1036F OLD PERMIC LETTER YER +10370 OLD PERMIC LETTER YERI +10371 OLD PERMIC LETTER YAT +10372 OLD PERMIC LETTER IE +10373 OLD PERMIC LETTER YU +10374 OLD PERMIC LETTER YA +10375 OLD PERMIC LETTER IA +10376 COMBINING OLD PERMIC LETTER AN +10377 COMBINING OLD PERMIC LETTER DOI +10378 COMBINING OLD PERMIC LETTER ZATA +10379 COMBINING OLD PERMIC LETTER NENOE +1037A COMBINING OLD PERMIC LETTER SII +10380 UGARITIC LETTER ALPA +10381 UGARITIC LETTER BETA +10382 UGARITIC LETTER GAMLA +10383 UGARITIC LETTER KHA +10384 UGARITIC LETTER DELTA +10385 UGARITIC LETTER HO +10386 UGARITIC LETTER WO +10387 UGARITIC LETTER ZETA +10388 UGARITIC LETTER HOTA +10389 UGARITIC LETTER TET +1038A UGARITIC LETTER YOD +1038B UGARITIC LETTER KAF +1038C UGARITIC LETTER SHIN +1038D UGARITIC LETTER LAMDA +1038E UGARITIC LETTER MEM +1038F UGARITIC LETTER DHAL +10390 UGARITIC LETTER NUN +10391 UGARITIC LETTER ZU +10392 UGARITIC LETTER SAMKA +10393 UGARITIC LETTER AIN +10394 UGARITIC LETTER PU +10395 UGARITIC LETTER SADE +10396 UGARITIC LETTER QOPA +10397 UGARITIC LETTER RASHA +10398 UGARITIC LETTER THANNA +10399 UGARITIC LETTER GHAIN +1039A UGARITIC LETTER TO +1039B UGARITIC LETTER I +1039C UGARITIC LETTER U +1039D UGARITIC LETTER SSU +1039F UGARITIC WORD DIVIDER +103A0 OLD PERSIAN SIGN A +103A1 OLD PERSIAN SIGN I +103A2 OLD PERSIAN SIGN U +103A3 OLD PERSIAN SIGN KA +103A4 OLD PERSIAN SIGN KU +103A5 OLD PERSIAN SIGN GA +103A6 OLD PERSIAN SIGN GU +103A7 OLD PERSIAN SIGN XA +103A8 OLD PERSIAN SIGN CA +103A9 OLD PERSIAN SIGN JA +103AA OLD PERSIAN SIGN JI +103AB OLD PERSIAN SIGN TA +103AC OLD PERSIAN SIGN TU +103AD OLD PERSIAN SIGN DA +103AE OLD PERSIAN SIGN DI +103AF OLD PERSIAN SIGN DU +103B0 OLD PERSIAN SIGN THA +103B1 OLD PERSIAN SIGN PA +103B2 OLD PERSIAN SIGN BA +103B3 OLD PERSIAN SIGN FA +103B4 OLD PERSIAN SIGN NA +103B5 OLD PERSIAN SIGN NU +103B6 OLD PERSIAN SIGN MA +103B7 OLD PERSIAN SIGN MI +103B8 OLD PERSIAN SIGN MU +103B9 OLD PERSIAN SIGN YA +103BA OLD PERSIAN SIGN VA +103BB OLD PERSIAN SIGN VI +103BC OLD PERSIAN SIGN RA +103BD OLD PERSIAN SIGN RU +103BE OLD PERSIAN SIGN LA +103BF OLD PERSIAN SIGN SA +103C0 OLD PERSIAN SIGN ZA +103C1 OLD PERSIAN SIGN SHA +103C2 OLD PERSIAN SIGN SSA +103C3 OLD PERSIAN SIGN HA +103C8 OLD PERSIAN SIGN AURAMAZDAA +103C9 OLD PERSIAN SIGN AURAMAZDAA-2 +103CA OLD PERSIAN SIGN AURAMAZDAAHA +103CB OLD PERSIAN SIGN XSHAAYATHIYA +103CC OLD PERSIAN SIGN DAHYAAUSH +103CD OLD PERSIAN SIGN DAHYAAUSH-2 +103CE OLD PERSIAN SIGN BAGA +103CF OLD PERSIAN SIGN BUUMISH +103D0 OLD PERSIAN WORD DIVIDER +103D1 OLD PERSIAN NUMBER ONE +103D2 OLD PERSIAN NUMBER TWO +103D3 OLD PERSIAN NUMBER TEN +103D4 OLD PERSIAN NUMBER TWENTY +103D5 OLD PERSIAN NUMBER HUNDRED +10400 DESERET CAPITAL LETTER LONG I +10401 DESERET CAPITAL LETTER LONG E +10402 DESERET CAPITAL LETTER LONG A +10403 DESERET CAPITAL LETTER LONG AH +10404 DESERET CAPITAL LETTER LONG O +10405 DESERET CAPITAL LETTER LONG OO +10406 DESERET CAPITAL LETTER SHORT I +10407 DESERET CAPITAL LETTER SHORT E +10408 DESERET CAPITAL LETTER SHORT A +10409 DESERET CAPITAL LETTER SHORT AH +1040A DESERET CAPITAL LETTER SHORT O +1040B DESERET CAPITAL LETTER SHORT OO +1040C DESERET CAPITAL LETTER AY +1040D DESERET CAPITAL LETTER OW +1040E DESERET CAPITAL LETTER WU +1040F DESERET CAPITAL LETTER YEE +10410 DESERET CAPITAL LETTER H +10411 DESERET CAPITAL LETTER PEE +10412 DESERET CAPITAL LETTER BEE +10413 DESERET CAPITAL LETTER TEE +10414 DESERET CAPITAL LETTER DEE +10415 DESERET CAPITAL LETTER CHEE +10416 DESERET CAPITAL LETTER JEE +10417 DESERET CAPITAL LETTER KAY +10418 DESERET CAPITAL LETTER GAY +10419 DESERET CAPITAL LETTER EF +1041A DESERET CAPITAL LETTER VEE +1041B DESERET CAPITAL LETTER ETH +1041C DESERET CAPITAL LETTER THEE +1041D DESERET CAPITAL LETTER ES +1041E DESERET CAPITAL LETTER ZEE +1041F DESERET CAPITAL LETTER ESH +10420 DESERET CAPITAL LETTER ZHEE +10421 DESERET CAPITAL LETTER ER +10422 DESERET CAPITAL LETTER EL +10423 DESERET CAPITAL LETTER EM +10424 DESERET CAPITAL LETTER EN +10425 DESERET CAPITAL LETTER ENG +10426 DESERET CAPITAL LETTER OI +10427 DESERET CAPITAL LETTER EW +10428 DESERET SMALL LETTER LONG I +10429 DESERET SMALL LETTER LONG E +1042A DESERET SMALL LETTER LONG A +1042B DESERET SMALL LETTER LONG AH +1042C DESERET SMALL LETTER LONG O +1042D DESERET SMALL LETTER LONG OO +1042E DESERET SMALL LETTER SHORT I +1042F DESERET SMALL LETTER SHORT E +10430 DESERET SMALL LETTER SHORT A +10431 DESERET SMALL LETTER SHORT AH +10432 DESERET SMALL LETTER SHORT O +10433 DESERET SMALL LETTER SHORT OO +10434 DESERET SMALL LETTER AY +10435 DESERET SMALL LETTER OW +10436 DESERET SMALL LETTER WU +10437 DESERET SMALL LETTER YEE +10438 DESERET SMALL LETTER H +10439 DESERET SMALL LETTER PEE +1043A DESERET SMALL LETTER BEE +1043B DESERET SMALL LETTER TEE +1043C DESERET SMALL LETTER DEE +1043D DESERET SMALL LETTER CHEE +1043E DESERET SMALL LETTER JEE +1043F DESERET SMALL LETTER KAY +10440 DESERET SMALL LETTER GAY +10441 DESERET SMALL LETTER EF +10442 DESERET SMALL LETTER VEE +10443 DESERET SMALL LETTER ETH +10444 DESERET SMALL LETTER THEE +10445 DESERET SMALL LETTER ES +10446 DESERET SMALL LETTER ZEE +10447 DESERET SMALL LETTER ESH +10448 DESERET SMALL LETTER ZHEE +10449 DESERET SMALL LETTER ER +1044A DESERET SMALL LETTER EL +1044B DESERET SMALL LETTER EM +1044C DESERET SMALL LETTER EN +1044D DESERET SMALL LETTER ENG +1044E DESERET SMALL LETTER OI +1044F DESERET SMALL LETTER EW +10450 SHAVIAN LETTER PEEP +10451 SHAVIAN LETTER TOT +10452 SHAVIAN LETTER KICK +10453 SHAVIAN LETTER FEE +10454 SHAVIAN LETTER THIGH +10455 SHAVIAN LETTER SO +10456 SHAVIAN LETTER SURE +10457 SHAVIAN LETTER CHURCH +10458 SHAVIAN LETTER YEA +10459 SHAVIAN LETTER HUNG +1045A SHAVIAN LETTER BIB +1045B SHAVIAN LETTER DEAD +1045C SHAVIAN LETTER GAG +1045D SHAVIAN LETTER VOW +1045E SHAVIAN LETTER THEY +1045F SHAVIAN LETTER ZOO +10460 SHAVIAN LETTER MEASURE +10461 SHAVIAN LETTER JUDGE +10462 SHAVIAN LETTER WOE +10463 SHAVIAN LETTER HA-HA +10464 SHAVIAN LETTER LOLL +10465 SHAVIAN LETTER MIME +10466 SHAVIAN LETTER IF +10467 SHAVIAN LETTER EGG +10468 SHAVIAN LETTER ASH +10469 SHAVIAN LETTER ADO +1046A SHAVIAN LETTER ON +1046B SHAVIAN LETTER WOOL +1046C SHAVIAN LETTER OUT +1046D SHAVIAN LETTER AH +1046E SHAVIAN LETTER ROAR +1046F SHAVIAN LETTER NUN +10470 SHAVIAN LETTER EAT +10471 SHAVIAN LETTER AGE +10472 SHAVIAN LETTER ICE +10473 SHAVIAN LETTER UP +10474 SHAVIAN LETTER OAK +10475 SHAVIAN LETTER OOZE +10476 SHAVIAN LETTER OIL +10477 SHAVIAN LETTER AWE +10478 SHAVIAN LETTER ARE +10479 SHAVIAN LETTER OR +1047A SHAVIAN LETTER AIR +1047B SHAVIAN LETTER ERR +1047C SHAVIAN LETTER ARRAY +1047D SHAVIAN LETTER EAR +1047E SHAVIAN LETTER IAN +1047F SHAVIAN LETTER YEW +10480 OSMANYA LETTER ALEF +10481 OSMANYA LETTER BA +10482 OSMANYA LETTER TA +10483 OSMANYA LETTER JA +10484 OSMANYA LETTER XA +10485 OSMANYA LETTER KHA +10486 OSMANYA LETTER DEEL +10487 OSMANYA LETTER RA +10488 OSMANYA LETTER SA +10489 OSMANYA LETTER SHIIN +1048A OSMANYA LETTER DHA +1048B OSMANYA LETTER CAYN +1048C OSMANYA LETTER GA +1048D OSMANYA LETTER FA +1048E OSMANYA LETTER QAAF +1048F OSMANYA LETTER KAAF +10490 OSMANYA LETTER LAAN +10491 OSMANYA LETTER MIIN +10492 OSMANYA LETTER NUUN +10493 OSMANYA LETTER WAW +10494 OSMANYA LETTER HA +10495 OSMANYA LETTER YA +10496 OSMANYA LETTER A +10497 OSMANYA LETTER E +10498 OSMANYA LETTER I +10499 OSMANYA LETTER O +1049A OSMANYA LETTER U +1049B OSMANYA LETTER AA +1049C OSMANYA LETTER EE +1049D OSMANYA LETTER OO +104A0 OSMANYA DIGIT ZERO +104A1 OSMANYA DIGIT ONE +104A2 OSMANYA DIGIT TWO +104A3 OSMANYA DIGIT THREE +104A4 OSMANYA DIGIT FOUR +104A5 OSMANYA DIGIT FIVE +104A6 OSMANYA DIGIT SIX +104A7 OSMANYA DIGIT SEVEN +104A8 OSMANYA DIGIT EIGHT +104A9 OSMANYA DIGIT NINE +104B0 OSAGE CAPITAL LETTER A +104B1 OSAGE CAPITAL LETTER AI +104B2 OSAGE CAPITAL LETTER AIN +104B3 OSAGE CAPITAL LETTER AH +104B4 OSAGE CAPITAL LETTER BRA +104B5 OSAGE CAPITAL LETTER CHA +104B6 OSAGE CAPITAL LETTER EHCHA +104B7 OSAGE CAPITAL LETTER E +104B8 OSAGE CAPITAL LETTER EIN +104B9 OSAGE CAPITAL LETTER HA +104BA OSAGE CAPITAL LETTER HYA +104BB OSAGE CAPITAL LETTER I +104BC OSAGE CAPITAL LETTER KA +104BD OSAGE CAPITAL LETTER EHKA +104BE OSAGE CAPITAL LETTER KYA +104BF OSAGE CAPITAL LETTER LA +104C0 OSAGE CAPITAL LETTER MA +104C1 OSAGE CAPITAL LETTER NA +104C2 OSAGE CAPITAL LETTER O +104C3 OSAGE CAPITAL LETTER OIN +104C4 OSAGE CAPITAL LETTER PA +104C5 OSAGE CAPITAL LETTER EHPA +104C6 OSAGE CAPITAL LETTER SA +104C7 OSAGE CAPITAL LETTER SHA +104C8 OSAGE CAPITAL LETTER TA +104C9 OSAGE CAPITAL LETTER EHTA +104CA OSAGE CAPITAL LETTER TSA +104CB OSAGE CAPITAL LETTER EHTSA +104CC OSAGE CAPITAL LETTER TSHA +104CD OSAGE CAPITAL LETTER DHA +104CE OSAGE CAPITAL LETTER U +104CF OSAGE CAPITAL LETTER WA +104D0 OSAGE CAPITAL LETTER KHA +104D1 OSAGE CAPITAL LETTER GHA +104D2 OSAGE CAPITAL LETTER ZA +104D3 OSAGE CAPITAL LETTER ZHA +104D8 OSAGE SMALL LETTER A +104D9 OSAGE SMALL LETTER AI +104DA OSAGE SMALL LETTER AIN +104DB OSAGE SMALL LETTER AH +104DC OSAGE SMALL LETTER BRA +104DD OSAGE SMALL LETTER CHA +104DE OSAGE SMALL LETTER EHCHA +104DF OSAGE SMALL LETTER E +104E0 OSAGE SMALL LETTER EIN +104E1 OSAGE SMALL LETTER HA +104E2 OSAGE SMALL LETTER HYA +104E3 OSAGE SMALL LETTER I +104E4 OSAGE SMALL LETTER KA +104E5 OSAGE SMALL LETTER EHKA +104E6 OSAGE SMALL LETTER KYA +104E7 OSAGE SMALL LETTER LA +104E8 OSAGE SMALL LETTER MA +104E9 OSAGE SMALL LETTER NA +104EA OSAGE SMALL LETTER O +104EB OSAGE SMALL LETTER OIN +104EC OSAGE SMALL LETTER PA +104ED OSAGE SMALL LETTER EHPA +104EE OSAGE SMALL LETTER SA +104EF OSAGE SMALL LETTER SHA +104F0 OSAGE SMALL LETTER TA +104F1 OSAGE SMALL LETTER EHTA +104F2 OSAGE SMALL LETTER TSA +104F3 OSAGE SMALL LETTER EHTSA +104F4 OSAGE SMALL LETTER TSHA +104F5 OSAGE SMALL LETTER DHA +104F6 OSAGE SMALL LETTER U +104F7 OSAGE SMALL LETTER WA +104F8 OSAGE SMALL LETTER KHA +104F9 OSAGE SMALL LETTER GHA +104FA OSAGE SMALL LETTER ZA +104FB OSAGE SMALL LETTER ZHA +10500 ELBASAN LETTER A +10501 ELBASAN LETTER BE +10502 ELBASAN LETTER CE +10503 ELBASAN LETTER CHE +10504 ELBASAN LETTER DE +10505 ELBASAN LETTER NDE +10506 ELBASAN LETTER DHE +10507 ELBASAN LETTER EI +10508 ELBASAN LETTER E +10509 ELBASAN LETTER FE +1050A ELBASAN LETTER GE +1050B ELBASAN LETTER GJE +1050C ELBASAN LETTER HE +1050D ELBASAN LETTER I +1050E ELBASAN LETTER JE +1050F ELBASAN LETTER KE +10510 ELBASAN LETTER LE +10511 ELBASAN LETTER LLE +10512 ELBASAN LETTER ME +10513 ELBASAN LETTER NE +10514 ELBASAN LETTER NA +10515 ELBASAN LETTER NJE +10516 ELBASAN LETTER O +10517 ELBASAN LETTER PE +10518 ELBASAN LETTER QE +10519 ELBASAN LETTER RE +1051A ELBASAN LETTER RRE +1051B ELBASAN LETTER SE +1051C ELBASAN LETTER SHE +1051D ELBASAN LETTER TE +1051E ELBASAN LETTER THE +1051F ELBASAN LETTER U +10520 ELBASAN LETTER VE +10521 ELBASAN LETTER XE +10522 ELBASAN LETTER Y +10523 ELBASAN LETTER ZE +10524 ELBASAN LETTER ZHE +10525 ELBASAN LETTER GHE +10526 ELBASAN LETTER GHAMMA +10527 ELBASAN LETTER KHE +10530 CAUCASIAN ALBANIAN LETTER ALT +10531 CAUCASIAN ALBANIAN LETTER BET +10532 CAUCASIAN ALBANIAN LETTER GIM +10533 CAUCASIAN ALBANIAN LETTER DAT +10534 CAUCASIAN ALBANIAN LETTER EB +10535 CAUCASIAN ALBANIAN LETTER ZARL +10536 CAUCASIAN ALBANIAN LETTER EYN +10537 CAUCASIAN ALBANIAN LETTER ZHIL +10538 CAUCASIAN ALBANIAN LETTER TAS +10539 CAUCASIAN ALBANIAN LETTER CHA +1053A CAUCASIAN ALBANIAN LETTER YOWD +1053B CAUCASIAN ALBANIAN LETTER ZHA +1053C CAUCASIAN ALBANIAN LETTER IRB +1053D CAUCASIAN ALBANIAN LETTER SHA +1053E CAUCASIAN ALBANIAN LETTER LAN +1053F CAUCASIAN ALBANIAN LETTER INYA +10540 CAUCASIAN ALBANIAN LETTER XEYN +10541 CAUCASIAN ALBANIAN LETTER DYAN +10542 CAUCASIAN ALBANIAN LETTER CAR +10543 CAUCASIAN ALBANIAN LETTER JHOX +10544 CAUCASIAN ALBANIAN LETTER KAR +10545 CAUCASIAN ALBANIAN LETTER LYIT +10546 CAUCASIAN ALBANIAN LETTER HEYT +10547 CAUCASIAN ALBANIAN LETTER QAY +10548 CAUCASIAN ALBANIAN LETTER AOR +10549 CAUCASIAN ALBANIAN LETTER CHOY +1054A CAUCASIAN ALBANIAN LETTER CHI +1054B CAUCASIAN ALBANIAN LETTER CYAY +1054C CAUCASIAN ALBANIAN LETTER MAQ +1054D CAUCASIAN ALBANIAN LETTER QAR +1054E CAUCASIAN ALBANIAN LETTER NOWC +1054F CAUCASIAN ALBANIAN LETTER DZYAY +10550 CAUCASIAN ALBANIAN LETTER SHAK +10551 CAUCASIAN ALBANIAN LETTER JAYN +10552 CAUCASIAN ALBANIAN LETTER ON +10553 CAUCASIAN ALBANIAN LETTER TYAY +10554 CAUCASIAN ALBANIAN LETTER FAM +10555 CAUCASIAN ALBANIAN LETTER DZAY +10556 CAUCASIAN ALBANIAN LETTER CHAT +10557 CAUCASIAN ALBANIAN LETTER PEN +10558 CAUCASIAN ALBANIAN LETTER GHEYS +10559 CAUCASIAN ALBANIAN LETTER RAT +1055A CAUCASIAN ALBANIAN LETTER SEYK +1055B CAUCASIAN ALBANIAN LETTER VEYZ +1055C CAUCASIAN ALBANIAN LETTER TIWR +1055D CAUCASIAN ALBANIAN LETTER SHOY +1055E CAUCASIAN ALBANIAN LETTER IWN +1055F CAUCASIAN ALBANIAN LETTER CYAW +10560 CAUCASIAN ALBANIAN LETTER CAYN +10561 CAUCASIAN ALBANIAN LETTER YAYD +10562 CAUCASIAN ALBANIAN LETTER PIWR +10563 CAUCASIAN ALBANIAN LETTER KIW +1056F CAUCASIAN ALBANIAN CITATION MARK +10600 LINEAR A SIGN AB001 +10601 LINEAR A SIGN AB002 +10602 LINEAR A SIGN AB003 +10603 LINEAR A SIGN AB004 +10604 LINEAR A SIGN AB005 +10605 LINEAR A SIGN AB006 +10606 LINEAR A SIGN AB007 +10607 LINEAR A SIGN AB008 +10608 LINEAR A SIGN AB009 +10609 LINEAR A SIGN AB010 +1060A LINEAR A SIGN AB011 +1060B LINEAR A SIGN AB013 +1060C LINEAR A SIGN AB016 +1060D LINEAR A SIGN AB017 +1060E LINEAR A SIGN AB020 +1060F LINEAR A SIGN AB021 +10610 LINEAR A SIGN AB021F +10611 LINEAR A SIGN AB021M +10612 LINEAR A SIGN AB022 +10613 LINEAR A SIGN AB022F +10614 LINEAR A SIGN AB022M +10615 LINEAR A SIGN AB023 +10616 LINEAR A SIGN AB023M +10617 LINEAR A SIGN AB024 +10618 LINEAR A SIGN AB026 +10619 LINEAR A SIGN AB027 +1061A LINEAR A SIGN AB028 +1061B LINEAR A SIGN A028B +1061C LINEAR A SIGN AB029 +1061D LINEAR A SIGN AB030 +1061E LINEAR A SIGN AB031 +1061F LINEAR A SIGN AB034 +10620 LINEAR A SIGN AB037 +10621 LINEAR A SIGN AB038 +10622 LINEAR A SIGN AB039 +10623 LINEAR A SIGN AB040 +10624 LINEAR A SIGN AB041 +10625 LINEAR A SIGN AB044 +10626 LINEAR A SIGN AB045 +10627 LINEAR A SIGN AB046 +10628 LINEAR A SIGN AB047 +10629 LINEAR A SIGN AB048 +1062A LINEAR A SIGN AB049 +1062B LINEAR A SIGN AB050 +1062C LINEAR A SIGN AB051 +1062D LINEAR A SIGN AB053 +1062E LINEAR A SIGN AB054 +1062F LINEAR A SIGN AB055 +10630 LINEAR A SIGN AB056 +10631 LINEAR A SIGN AB057 +10632 LINEAR A SIGN AB058 +10633 LINEAR A SIGN AB059 +10634 LINEAR A SIGN AB060 +10635 LINEAR A SIGN AB061 +10636 LINEAR A SIGN AB065 +10637 LINEAR A SIGN AB066 +10638 LINEAR A SIGN AB067 +10639 LINEAR A SIGN AB069 +1063A LINEAR A SIGN AB070 +1063B LINEAR A SIGN AB073 +1063C LINEAR A SIGN AB074 +1063D LINEAR A SIGN AB076 +1063E LINEAR A SIGN AB077 +1063F LINEAR A SIGN AB078 +10640 LINEAR A SIGN AB079 +10641 LINEAR A SIGN AB080 +10642 LINEAR A SIGN AB081 +10643 LINEAR A SIGN AB082 +10644 LINEAR A SIGN AB085 +10645 LINEAR A SIGN AB086 +10646 LINEAR A SIGN AB087 +10647 LINEAR A SIGN A100-102 +10648 LINEAR A SIGN AB118 +10649 LINEAR A SIGN AB120 +1064A LINEAR A SIGN A120B +1064B LINEAR A SIGN AB122 +1064C LINEAR A SIGN AB123 +1064D LINEAR A SIGN AB131A +1064E LINEAR A SIGN AB131B +1064F LINEAR A SIGN A131C +10650 LINEAR A SIGN AB164 +10651 LINEAR A SIGN AB171 +10652 LINEAR A SIGN AB180 +10653 LINEAR A SIGN AB188 +10654 LINEAR A SIGN AB191 +10655 LINEAR A SIGN A301 +10656 LINEAR A SIGN A302 +10657 LINEAR A SIGN A303 +10658 LINEAR A SIGN A304 +10659 LINEAR A SIGN A305 +1065A LINEAR A SIGN A306 +1065B LINEAR A SIGN A307 +1065C LINEAR A SIGN A308 +1065D LINEAR A SIGN A309A +1065E LINEAR A SIGN A309B +1065F LINEAR A SIGN A309C +10660 LINEAR A SIGN A310 +10661 LINEAR A SIGN A311 +10662 LINEAR A SIGN A312 +10663 LINEAR A SIGN A313A +10664 LINEAR A SIGN A313B +10665 LINEAR A SIGN A313C +10666 LINEAR A SIGN A314 +10667 LINEAR A SIGN A315 +10668 LINEAR A SIGN A316 +10669 LINEAR A SIGN A317 +1066A LINEAR A SIGN A318 +1066B LINEAR A SIGN A319 +1066C LINEAR A SIGN A320 +1066D LINEAR A SIGN A321 +1066E LINEAR A SIGN A322 +1066F LINEAR A SIGN A323 +10670 LINEAR A SIGN A324 +10671 LINEAR A SIGN A325 +10672 LINEAR A SIGN A326 +10673 LINEAR A SIGN A327 +10674 LINEAR A SIGN A328 +10675 LINEAR A SIGN A329 +10676 LINEAR A SIGN A330 +10677 LINEAR A SIGN A331 +10678 LINEAR A SIGN A332 +10679 LINEAR A SIGN A333 +1067A LINEAR A SIGN A334 +1067B LINEAR A SIGN A335 +1067C LINEAR A SIGN A336 +1067D LINEAR A SIGN A337 +1067E LINEAR A SIGN A338 +1067F LINEAR A SIGN A339 +10680 LINEAR A SIGN A340 +10681 LINEAR A SIGN A341 +10682 LINEAR A SIGN A342 +10683 LINEAR A SIGN A343 +10684 LINEAR A SIGN A344 +10685 LINEAR A SIGN A345 +10686 LINEAR A SIGN A346 +10687 LINEAR A SIGN A347 +10688 LINEAR A SIGN A348 +10689 LINEAR A SIGN A349 +1068A LINEAR A SIGN A350 +1068B LINEAR A SIGN A351 +1068C LINEAR A SIGN A352 +1068D LINEAR A SIGN A353 +1068E LINEAR A SIGN A354 +1068F LINEAR A SIGN A355 +10690 LINEAR A SIGN A356 +10691 LINEAR A SIGN A357 +10692 LINEAR A SIGN A358 +10693 LINEAR A SIGN A359 +10694 LINEAR A SIGN A360 +10695 LINEAR A SIGN A361 +10696 LINEAR A SIGN A362 +10697 LINEAR A SIGN A363 +10698 LINEAR A SIGN A364 +10699 LINEAR A SIGN A365 +1069A LINEAR A SIGN A366 +1069B LINEAR A SIGN A367 +1069C LINEAR A SIGN A368 +1069D LINEAR A SIGN A369 +1069E LINEAR A SIGN A370 +1069F LINEAR A SIGN A371 +106A0 LINEAR A SIGN A400-VAS +106A1 LINEAR A SIGN A401-VAS +106A2 LINEAR A SIGN A402-VAS +106A3 LINEAR A SIGN A403-VAS +106A4 LINEAR A SIGN A404-VAS +106A5 LINEAR A SIGN A405-VAS +106A6 LINEAR A SIGN A406-VAS +106A7 LINEAR A SIGN A407-VAS +106A8 LINEAR A SIGN A408-VAS +106A9 LINEAR A SIGN A409-VAS +106AA LINEAR A SIGN A410-VAS +106AB LINEAR A SIGN A411-VAS +106AC LINEAR A SIGN A412-VAS +106AD LINEAR A SIGN A413-VAS +106AE LINEAR A SIGN A414-VAS +106AF LINEAR A SIGN A415-VAS +106B0 LINEAR A SIGN A416-VAS +106B1 LINEAR A SIGN A417-VAS +106B2 LINEAR A SIGN A418-VAS +106B3 LINEAR A SIGN A501 +106B4 LINEAR A SIGN A502 +106B5 LINEAR A SIGN A503 +106B6 LINEAR A SIGN A504 +106B7 LINEAR A SIGN A505 +106B8 LINEAR A SIGN A506 +106B9 LINEAR A SIGN A508 +106BA LINEAR A SIGN A509 +106BB LINEAR A SIGN A510 +106BC LINEAR A SIGN A511 +106BD LINEAR A SIGN A512 +106BE LINEAR A SIGN A513 +106BF LINEAR A SIGN A515 +106C0 LINEAR A SIGN A516 +106C1 LINEAR A SIGN A520 +106C2 LINEAR A SIGN A521 +106C3 LINEAR A SIGN A523 +106C4 LINEAR A SIGN A524 +106C5 LINEAR A SIGN A525 +106C6 LINEAR A SIGN A526 +106C7 LINEAR A SIGN A527 +106C8 LINEAR A SIGN A528 +106C9 LINEAR A SIGN A529 +106CA LINEAR A SIGN A530 +106CB LINEAR A SIGN A531 +106CC LINEAR A SIGN A532 +106CD LINEAR A SIGN A534 +106CE LINEAR A SIGN A535 +106CF LINEAR A SIGN A536 +106D0 LINEAR A SIGN A537 +106D1 LINEAR A SIGN A538 +106D2 LINEAR A SIGN A539 +106D3 LINEAR A SIGN A540 +106D4 LINEAR A SIGN A541 +106D5 LINEAR A SIGN A542 +106D6 LINEAR A SIGN A545 +106D7 LINEAR A SIGN A547 +106D8 LINEAR A SIGN A548 +106D9 LINEAR A SIGN A549 +106DA LINEAR A SIGN A550 +106DB LINEAR A SIGN A551 +106DC LINEAR A SIGN A552 +106DD LINEAR A SIGN A553 +106DE LINEAR A SIGN A554 +106DF LINEAR A SIGN A555 +106E0 LINEAR A SIGN A556 +106E1 LINEAR A SIGN A557 +106E2 LINEAR A SIGN A559 +106E3 LINEAR A SIGN A563 +106E4 LINEAR A SIGN A564 +106E5 LINEAR A SIGN A565 +106E6 LINEAR A SIGN A566 +106E7 LINEAR A SIGN A568 +106E8 LINEAR A SIGN A569 +106E9 LINEAR A SIGN A570 +106EA LINEAR A SIGN A571 +106EB LINEAR A SIGN A572 +106EC LINEAR A SIGN A573 +106ED LINEAR A SIGN A574 +106EE LINEAR A SIGN A575 +106EF LINEAR A SIGN A576 +106F0 LINEAR A SIGN A577 +106F1 LINEAR A SIGN A578 +106F2 LINEAR A SIGN A579 +106F3 LINEAR A SIGN A580 +106F4 LINEAR A SIGN A581 +106F5 LINEAR A SIGN A582 +106F6 LINEAR A SIGN A583 +106F7 LINEAR A SIGN A584 +106F8 LINEAR A SIGN A585 +106F9 LINEAR A SIGN A586 +106FA LINEAR A SIGN A587 +106FB LINEAR A SIGN A588 +106FC LINEAR A SIGN A589 +106FD LINEAR A SIGN A591 +106FE LINEAR A SIGN A592 +106FF LINEAR A SIGN A594 +10700 LINEAR A SIGN A595 +10701 LINEAR A SIGN A596 +10702 LINEAR A SIGN A598 +10703 LINEAR A SIGN A600 +10704 LINEAR A SIGN A601 +10705 LINEAR A SIGN A602 +10706 LINEAR A SIGN A603 +10707 LINEAR A SIGN A604 +10708 LINEAR A SIGN A606 +10709 LINEAR A SIGN A608 +1070A LINEAR A SIGN A609 +1070B LINEAR A SIGN A610 +1070C LINEAR A SIGN A611 +1070D LINEAR A SIGN A612 +1070E LINEAR A SIGN A613 +1070F LINEAR A SIGN A614 +10710 LINEAR A SIGN A615 +10711 LINEAR A SIGN A616 +10712 LINEAR A SIGN A617 +10713 LINEAR A SIGN A618 +10714 LINEAR A SIGN A619 +10715 LINEAR A SIGN A620 +10716 LINEAR A SIGN A621 +10717 LINEAR A SIGN A622 +10718 LINEAR A SIGN A623 +10719 LINEAR A SIGN A624 +1071A LINEAR A SIGN A626 +1071B LINEAR A SIGN A627 +1071C LINEAR A SIGN A628 +1071D LINEAR A SIGN A629 +1071E LINEAR A SIGN A634 +1071F LINEAR A SIGN A637 +10720 LINEAR A SIGN A638 +10721 LINEAR A SIGN A640 +10722 LINEAR A SIGN A642 +10723 LINEAR A SIGN A643 +10724 LINEAR A SIGN A644 +10725 LINEAR A SIGN A645 +10726 LINEAR A SIGN A646 +10727 LINEAR A SIGN A648 +10728 LINEAR A SIGN A649 +10729 LINEAR A SIGN A651 +1072A LINEAR A SIGN A652 +1072B LINEAR A SIGN A653 +1072C LINEAR A SIGN A654 +1072D LINEAR A SIGN A655 +1072E LINEAR A SIGN A656 +1072F LINEAR A SIGN A657 +10730 LINEAR A SIGN A658 +10731 LINEAR A SIGN A659 +10732 LINEAR A SIGN A660 +10733 LINEAR A SIGN A661 +10734 LINEAR A SIGN A662 +10735 LINEAR A SIGN A663 +10736 LINEAR A SIGN A664 +10740 LINEAR A SIGN A701 A +10741 LINEAR A SIGN A702 B +10742 LINEAR A SIGN A703 D +10743 LINEAR A SIGN A704 E +10744 LINEAR A SIGN A705 F +10745 LINEAR A SIGN A706 H +10746 LINEAR A SIGN A707 J +10747 LINEAR A SIGN A708 K +10748 LINEAR A SIGN A709 L +10749 LINEAR A SIGN A709-2 L2 +1074A LINEAR A SIGN A709-3 L3 +1074B LINEAR A SIGN A709-4 L4 +1074C LINEAR A SIGN A709-6 L6 +1074D LINEAR A SIGN A710 W +1074E LINEAR A SIGN A711 X +1074F LINEAR A SIGN A712 Y +10750 LINEAR A SIGN A713 OMEGA +10751 LINEAR A SIGN A714 ABB +10752 LINEAR A SIGN A715 BB +10753 LINEAR A SIGN A717 DD +10754 LINEAR A SIGN A726 EYYY +10755 LINEAR A SIGN A732 JE +10760 LINEAR A SIGN A800 +10761 LINEAR A SIGN A801 +10762 LINEAR A SIGN A802 +10763 LINEAR A SIGN A803 +10764 LINEAR A SIGN A804 +10765 LINEAR A SIGN A805 +10766 LINEAR A SIGN A806 +10767 LINEAR A SIGN A807 +10800 CYPRIOT SYLLABLE A +10801 CYPRIOT SYLLABLE E +10802 CYPRIOT SYLLABLE I +10803 CYPRIOT SYLLABLE O +10804 CYPRIOT SYLLABLE U +10805 CYPRIOT SYLLABLE JA +10808 CYPRIOT SYLLABLE JO +1080A CYPRIOT SYLLABLE KA +1080B CYPRIOT SYLLABLE KE +1080C CYPRIOT SYLLABLE KI +1080D CYPRIOT SYLLABLE KO +1080E CYPRIOT SYLLABLE KU +1080F CYPRIOT SYLLABLE LA +10810 CYPRIOT SYLLABLE LE +10811 CYPRIOT SYLLABLE LI +10812 CYPRIOT SYLLABLE LO +10813 CYPRIOT SYLLABLE LU +10814 CYPRIOT SYLLABLE MA +10815 CYPRIOT SYLLABLE ME +10816 CYPRIOT SYLLABLE MI +10817 CYPRIOT SYLLABLE MO +10818 CYPRIOT SYLLABLE MU +10819 CYPRIOT SYLLABLE NA +1081A CYPRIOT SYLLABLE NE +1081B CYPRIOT SYLLABLE NI +1081C CYPRIOT SYLLABLE NO +1081D CYPRIOT SYLLABLE NU +1081E CYPRIOT SYLLABLE PA +1081F CYPRIOT SYLLABLE PE +10820 CYPRIOT SYLLABLE PI +10821 CYPRIOT SYLLABLE PO +10822 CYPRIOT SYLLABLE PU +10823 CYPRIOT SYLLABLE RA +10824 CYPRIOT SYLLABLE RE +10825 CYPRIOT SYLLABLE RI +10826 CYPRIOT SYLLABLE RO +10827 CYPRIOT SYLLABLE RU +10828 CYPRIOT SYLLABLE SA +10829 CYPRIOT SYLLABLE SE +1082A CYPRIOT SYLLABLE SI +1082B CYPRIOT SYLLABLE SO +1082C CYPRIOT SYLLABLE SU +1082D CYPRIOT SYLLABLE TA +1082E CYPRIOT SYLLABLE TE +1082F CYPRIOT SYLLABLE TI +10830 CYPRIOT SYLLABLE TO +10831 CYPRIOT SYLLABLE TU +10832 CYPRIOT SYLLABLE WA +10833 CYPRIOT SYLLABLE WE +10834 CYPRIOT SYLLABLE WI +10835 CYPRIOT SYLLABLE WO +10837 CYPRIOT SYLLABLE XA +10838 CYPRIOT SYLLABLE XE +1083C CYPRIOT SYLLABLE ZA +1083F CYPRIOT SYLLABLE ZO +10840 IMPERIAL ARAMAIC LETTER ALEPH +10841 IMPERIAL ARAMAIC LETTER BETH +10842 IMPERIAL ARAMAIC LETTER GIMEL +10843 IMPERIAL ARAMAIC LETTER DALETH +10844 IMPERIAL ARAMAIC LETTER HE +10845 IMPERIAL ARAMAIC LETTER WAW +10846 IMPERIAL ARAMAIC LETTER ZAYIN +10847 IMPERIAL ARAMAIC LETTER HETH +10848 IMPERIAL ARAMAIC LETTER TETH +10849 IMPERIAL ARAMAIC LETTER YODH +1084A IMPERIAL ARAMAIC LETTER KAPH +1084B IMPERIAL ARAMAIC LETTER LAMEDH +1084C IMPERIAL ARAMAIC LETTER MEM +1084D IMPERIAL ARAMAIC LETTER NUN +1084E IMPERIAL ARAMAIC LETTER SAMEKH +1084F IMPERIAL ARAMAIC LETTER AYIN +10850 IMPERIAL ARAMAIC LETTER PE +10851 IMPERIAL ARAMAIC LETTER SADHE +10852 IMPERIAL ARAMAIC LETTER QOPH +10853 IMPERIAL ARAMAIC LETTER RESH +10854 IMPERIAL ARAMAIC LETTER SHIN +10855 IMPERIAL ARAMAIC LETTER TAW +10857 IMPERIAL ARAMAIC SECTION SIGN +10858 IMPERIAL ARAMAIC NUMBER ONE +10859 IMPERIAL ARAMAIC NUMBER TWO +1085A IMPERIAL ARAMAIC NUMBER THREE +1085B IMPERIAL ARAMAIC NUMBER TEN +1085C IMPERIAL ARAMAIC NUMBER TWENTY +1085D IMPERIAL ARAMAIC NUMBER ONE HUNDRED +1085E IMPERIAL ARAMAIC NUMBER ONE THOUSAND +1085F IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860 PALMYRENE LETTER ALEPH +10861 PALMYRENE LETTER BETH +10862 PALMYRENE LETTER GIMEL +10863 PALMYRENE LETTER DALETH +10864 PALMYRENE LETTER HE +10865 PALMYRENE LETTER WAW +10866 PALMYRENE LETTER ZAYIN +10867 PALMYRENE LETTER HETH +10868 PALMYRENE LETTER TETH +10869 PALMYRENE LETTER YODH +1086A PALMYRENE LETTER KAPH +1086B PALMYRENE LETTER LAMEDH +1086C PALMYRENE LETTER MEM +1086D PALMYRENE LETTER FINAL NUN +1086E PALMYRENE LETTER NUN +1086F PALMYRENE LETTER SAMEKH +10870 PALMYRENE LETTER AYIN +10871 PALMYRENE LETTER PE +10872 PALMYRENE LETTER SADHE +10873 PALMYRENE LETTER QOPH +10874 PALMYRENE LETTER RESH +10875 PALMYRENE LETTER SHIN +10876 PALMYRENE LETTER TAW +10877 PALMYRENE LEFT-POINTING FLEURON +10878 PALMYRENE RIGHT-POINTING FLEURON +10879 PALMYRENE NUMBER ONE +1087A PALMYRENE NUMBER TWO +1087B PALMYRENE NUMBER THREE +1087C PALMYRENE NUMBER FOUR +1087D PALMYRENE NUMBER FIVE +1087E PALMYRENE NUMBER TEN +1087F PALMYRENE NUMBER TWENTY +10880 NABATAEAN LETTER FINAL ALEPH +10881 NABATAEAN LETTER ALEPH +10882 NABATAEAN LETTER FINAL BETH +10883 NABATAEAN LETTER BETH +10884 NABATAEAN LETTER GIMEL +10885 NABATAEAN LETTER DALETH +10886 NABATAEAN LETTER FINAL HE +10887 NABATAEAN LETTER HE +10888 NABATAEAN LETTER WAW +10889 NABATAEAN LETTER ZAYIN +1088A NABATAEAN LETTER HETH +1088B NABATAEAN LETTER TETH +1088C NABATAEAN LETTER FINAL YODH +1088D NABATAEAN LETTER YODH +1088E NABATAEAN LETTER FINAL KAPH +1088F NABATAEAN LETTER KAPH +10890 NABATAEAN LETTER FINAL LAMEDH +10891 NABATAEAN LETTER LAMEDH +10892 NABATAEAN LETTER FINAL MEM +10893 NABATAEAN LETTER MEM +10894 NABATAEAN LETTER FINAL NUN +10895 NABATAEAN LETTER NUN +10896 NABATAEAN LETTER SAMEKH +10897 NABATAEAN LETTER AYIN +10898 NABATAEAN LETTER PE +10899 NABATAEAN LETTER SADHE +1089A NABATAEAN LETTER QOPH +1089B NABATAEAN LETTER RESH +1089C NABATAEAN LETTER FINAL SHIN +1089D NABATAEAN LETTER SHIN +1089E NABATAEAN LETTER TAW +108A7 NABATAEAN NUMBER ONE +108A8 NABATAEAN NUMBER TWO +108A9 NABATAEAN NUMBER THREE +108AA NABATAEAN NUMBER FOUR +108AB NABATAEAN CRUCIFORM NUMBER FOUR +108AC NABATAEAN NUMBER FIVE +108AD NABATAEAN NUMBER TEN +108AE NABATAEAN NUMBER TWENTY +108AF NABATAEAN NUMBER ONE HUNDRED +108E0 HATRAN LETTER ALEPH +108E1 HATRAN LETTER BETH +108E2 HATRAN LETTER GIMEL +108E3 HATRAN LETTER DALETH-RESH +108E4 HATRAN LETTER HE +108E5 HATRAN LETTER WAW +108E6 HATRAN LETTER ZAYN +108E7 HATRAN LETTER HETH +108E8 HATRAN LETTER TETH +108E9 HATRAN LETTER YODH +108EA HATRAN LETTER KAPH +108EB HATRAN LETTER LAMEDH +108EC HATRAN LETTER MEM +108ED HATRAN LETTER NUN +108EE HATRAN LETTER SAMEKH +108EF HATRAN LETTER AYN +108F0 HATRAN LETTER PE +108F1 HATRAN LETTER SADHE +108F2 HATRAN LETTER QOPH +108F4 HATRAN LETTER SHIN +108F5 HATRAN LETTER TAW +108FB HATRAN NUMBER ONE +108FC HATRAN NUMBER FIVE +108FD HATRAN NUMBER TEN +108FE HATRAN NUMBER TWENTY +108FF HATRAN NUMBER ONE HUNDRED +10900 PHOENICIAN LETTER ALF +10901 PHOENICIAN LETTER BET +10902 PHOENICIAN LETTER GAML +10903 PHOENICIAN LETTER DELT +10904 PHOENICIAN LETTER HE +10905 PHOENICIAN LETTER WAU +10906 PHOENICIAN LETTER ZAI +10907 PHOENICIAN LETTER HET +10908 PHOENICIAN LETTER TET +10909 PHOENICIAN LETTER YOD +1090A PHOENICIAN LETTER KAF +1090B PHOENICIAN LETTER LAMD +1090C PHOENICIAN LETTER MEM +1090D PHOENICIAN LETTER NUN +1090E PHOENICIAN LETTER SEMK +1090F PHOENICIAN LETTER AIN +10910 PHOENICIAN LETTER PE +10911 PHOENICIAN LETTER SADE +10912 PHOENICIAN LETTER QOF +10913 PHOENICIAN LETTER ROSH +10914 PHOENICIAN LETTER SHIN +10915 PHOENICIAN LETTER TAU +10916 PHOENICIAN NUMBER ONE +10917 PHOENICIAN NUMBER TEN +10918 PHOENICIAN NUMBER TWENTY +10919 PHOENICIAN NUMBER ONE HUNDRED +1091A PHOENICIAN NUMBER TWO +1091B PHOENICIAN NUMBER THREE +1091F PHOENICIAN WORD SEPARATOR +10920 LYDIAN LETTER A +10921 LYDIAN LETTER B +10922 LYDIAN LETTER G +10923 LYDIAN LETTER D +10924 LYDIAN LETTER E +10925 LYDIAN LETTER V +10926 LYDIAN LETTER I +10927 LYDIAN LETTER Y +10928 LYDIAN LETTER K +10929 LYDIAN LETTER L +1092A LYDIAN LETTER M +1092B LYDIAN LETTER N +1092C LYDIAN LETTER O +1092D LYDIAN LETTER R +1092E LYDIAN LETTER SS +1092F LYDIAN LETTER T +10930 LYDIAN LETTER U +10931 LYDIAN LETTER F +10932 LYDIAN LETTER Q +10933 LYDIAN LETTER S +10934 LYDIAN LETTER TT +10935 LYDIAN LETTER AN +10936 LYDIAN LETTER EN +10937 LYDIAN LETTER LY +10938 LYDIAN LETTER NN +10939 LYDIAN LETTER C +1093F LYDIAN TRIANGULAR MARK +10980 MEROITIC HIEROGLYPHIC LETTER A +10981 MEROITIC HIEROGLYPHIC LETTER E +10982 MEROITIC HIEROGLYPHIC LETTER I +10983 MEROITIC HIEROGLYPHIC LETTER O +10984 MEROITIC HIEROGLYPHIC LETTER YA +10985 MEROITIC HIEROGLYPHIC LETTER WA +10986 MEROITIC HIEROGLYPHIC LETTER BA +10987 MEROITIC HIEROGLYPHIC LETTER BA-2 +10988 MEROITIC HIEROGLYPHIC LETTER PA +10989 MEROITIC HIEROGLYPHIC LETTER MA +1098A MEROITIC HIEROGLYPHIC LETTER NA +1098B MEROITIC HIEROGLYPHIC LETTER NA-2 +1098C MEROITIC HIEROGLYPHIC LETTER NE +1098D MEROITIC HIEROGLYPHIC LETTER NE-2 +1098E MEROITIC HIEROGLYPHIC LETTER RA +1098F MEROITIC HIEROGLYPHIC LETTER RA-2 +10990 MEROITIC HIEROGLYPHIC LETTER LA +10991 MEROITIC HIEROGLYPHIC LETTER KHA +10992 MEROITIC HIEROGLYPHIC LETTER HHA +10993 MEROITIC HIEROGLYPHIC LETTER SA +10994 MEROITIC HIEROGLYPHIC LETTER SA-2 +10995 MEROITIC HIEROGLYPHIC LETTER SE +10996 MEROITIC HIEROGLYPHIC LETTER KA +10997 MEROITIC HIEROGLYPHIC LETTER QA +10998 MEROITIC HIEROGLYPHIC LETTER TA +10999 MEROITIC HIEROGLYPHIC LETTER TA-2 +1099A MEROITIC HIEROGLYPHIC LETTER TE +1099B MEROITIC HIEROGLYPHIC LETTER TE-2 +1099C MEROITIC HIEROGLYPHIC LETTER TO +1099D MEROITIC HIEROGLYPHIC LETTER DA +1099E MEROITIC HIEROGLYPHIC SYMBOL VIDJ +1099F MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +109A0 MEROITIC CURSIVE LETTER A +109A1 MEROITIC CURSIVE LETTER E +109A2 MEROITIC CURSIVE LETTER I +109A3 MEROITIC CURSIVE LETTER O +109A4 MEROITIC CURSIVE LETTER YA +109A5 MEROITIC CURSIVE LETTER WA +109A6 MEROITIC CURSIVE LETTER BA +109A7 MEROITIC CURSIVE LETTER PA +109A8 MEROITIC CURSIVE LETTER MA +109A9 MEROITIC CURSIVE LETTER NA +109AA MEROITIC CURSIVE LETTER NE +109AB MEROITIC CURSIVE LETTER RA +109AC MEROITIC CURSIVE LETTER LA +109AD MEROITIC CURSIVE LETTER KHA +109AE MEROITIC CURSIVE LETTER HHA +109AF MEROITIC CURSIVE LETTER SA +109B0 MEROITIC CURSIVE LETTER ARCHAIC SA +109B1 MEROITIC CURSIVE LETTER SE +109B2 MEROITIC CURSIVE LETTER KA +109B3 MEROITIC CURSIVE LETTER QA +109B4 MEROITIC CURSIVE LETTER TA +109B5 MEROITIC CURSIVE LETTER TE +109B6 MEROITIC CURSIVE LETTER TO +109B7 MEROITIC CURSIVE LETTER DA +109BC MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS +109BD MEROITIC CURSIVE FRACTION ONE HALF +109BE MEROITIC CURSIVE LOGOGRAM RMT +109BF MEROITIC CURSIVE LOGOGRAM IMN +109C0 MEROITIC CURSIVE NUMBER ONE +109C1 MEROITIC CURSIVE NUMBER TWO +109C2 MEROITIC CURSIVE NUMBER THREE +109C3 MEROITIC CURSIVE NUMBER FOUR +109C4 MEROITIC CURSIVE NUMBER FIVE +109C5 MEROITIC CURSIVE NUMBER SIX +109C6 MEROITIC CURSIVE NUMBER SEVEN +109C7 MEROITIC CURSIVE NUMBER EIGHT +109C8 MEROITIC CURSIVE NUMBER NINE +109C9 MEROITIC CURSIVE NUMBER TEN +109CA MEROITIC CURSIVE NUMBER TWENTY +109CB MEROITIC CURSIVE NUMBER THIRTY +109CC MEROITIC CURSIVE NUMBER FORTY +109CD MEROITIC CURSIVE NUMBER FIFTY +109CE MEROITIC CURSIVE NUMBER SIXTY +109CF MEROITIC CURSIVE NUMBER SEVENTY +109D2 MEROITIC CURSIVE NUMBER ONE HUNDRED +109D3 MEROITIC CURSIVE NUMBER TWO HUNDRED +109D4 MEROITIC CURSIVE NUMBER THREE HUNDRED +109D5 MEROITIC CURSIVE NUMBER FOUR HUNDRED +109D6 MEROITIC CURSIVE NUMBER FIVE HUNDRED +109D7 MEROITIC CURSIVE NUMBER SIX HUNDRED +109D8 MEROITIC CURSIVE NUMBER SEVEN HUNDRED +109D9 MEROITIC CURSIVE NUMBER EIGHT HUNDRED +109DA MEROITIC CURSIVE NUMBER NINE HUNDRED +109DB MEROITIC CURSIVE NUMBER ONE THOUSAND +109DC MEROITIC CURSIVE NUMBER TWO THOUSAND +109DD MEROITIC CURSIVE NUMBER THREE THOUSAND +109DE MEROITIC CURSIVE NUMBER FOUR THOUSAND +109DF MEROITIC CURSIVE NUMBER FIVE THOUSAND +109E0 MEROITIC CURSIVE NUMBER SIX THOUSAND +109E1 MEROITIC CURSIVE NUMBER SEVEN THOUSAND +109E2 MEROITIC CURSIVE NUMBER EIGHT THOUSAND +109E3 MEROITIC CURSIVE NUMBER NINE THOUSAND +109E4 MEROITIC CURSIVE NUMBER TEN THOUSAND +109E5 MEROITIC CURSIVE NUMBER TWENTY THOUSAND +109E6 MEROITIC CURSIVE NUMBER THIRTY THOUSAND +109E7 MEROITIC CURSIVE NUMBER FORTY THOUSAND +109E8 MEROITIC CURSIVE NUMBER FIFTY THOUSAND +109E9 MEROITIC CURSIVE NUMBER SIXTY THOUSAND +109EA MEROITIC CURSIVE NUMBER SEVENTY THOUSAND +109EB MEROITIC CURSIVE NUMBER EIGHTY THOUSAND +109EC MEROITIC CURSIVE NUMBER NINETY THOUSAND +109ED MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND +109EE MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND +109EF MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND +109F0 MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND +109F1 MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND +109F2 MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND +109F3 MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND +109F4 MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND +109F5 MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND +109F6 MEROITIC CURSIVE FRACTION ONE TWELFTH +109F7 MEROITIC CURSIVE FRACTION TWO TWELFTHS +109F8 MEROITIC CURSIVE FRACTION THREE TWELFTHS +109F9 MEROITIC CURSIVE FRACTION FOUR TWELFTHS +109FA MEROITIC CURSIVE FRACTION FIVE TWELFTHS +109FB MEROITIC CURSIVE FRACTION SIX TWELFTHS +109FC MEROITIC CURSIVE FRACTION SEVEN TWELFTHS +109FD MEROITIC CURSIVE FRACTION EIGHT TWELFTHS +109FE MEROITIC CURSIVE FRACTION NINE TWELFTHS +109FF MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00 KHAROSHTHI LETTER A +10A01 KHAROSHTHI VOWEL SIGN I +10A02 KHAROSHTHI VOWEL SIGN U +10A03 KHAROSHTHI VOWEL SIGN VOCALIC R +10A05 KHAROSHTHI VOWEL SIGN E +10A06 KHAROSHTHI VOWEL SIGN O +10A0C KHAROSHTHI VOWEL LENGTH MARK +10A0D KHAROSHTHI SIGN DOUBLE RING BELOW +10A0E KHAROSHTHI SIGN ANUSVARA +10A0F KHAROSHTHI SIGN VISARGA +10A10 KHAROSHTHI LETTER KA +10A11 KHAROSHTHI LETTER KHA +10A12 KHAROSHTHI LETTER GA +10A13 KHAROSHTHI LETTER GHA +10A15 KHAROSHTHI LETTER CA +10A16 KHAROSHTHI LETTER CHA +10A17 KHAROSHTHI LETTER JA +10A19 KHAROSHTHI LETTER NYA +10A1A KHAROSHTHI LETTER TTA +10A1B KHAROSHTHI LETTER TTHA +10A1C KHAROSHTHI LETTER DDA +10A1D KHAROSHTHI LETTER DDHA +10A1E KHAROSHTHI LETTER NNA +10A1F KHAROSHTHI LETTER TA +10A20 KHAROSHTHI LETTER THA +10A21 KHAROSHTHI LETTER DA +10A22 KHAROSHTHI LETTER DHA +10A23 KHAROSHTHI LETTER NA +10A24 KHAROSHTHI LETTER PA +10A25 KHAROSHTHI LETTER PHA +10A26 KHAROSHTHI LETTER BA +10A27 KHAROSHTHI LETTER BHA +10A28 KHAROSHTHI LETTER MA +10A29 KHAROSHTHI LETTER YA +10A2A KHAROSHTHI LETTER RA +10A2B KHAROSHTHI LETTER LA +10A2C KHAROSHTHI LETTER VA +10A2D KHAROSHTHI LETTER SHA +10A2E KHAROSHTHI LETTER SSA +10A2F KHAROSHTHI LETTER SA +10A30 KHAROSHTHI LETTER ZA +10A31 KHAROSHTHI LETTER HA +10A32 KHAROSHTHI LETTER KKA +10A33 KHAROSHTHI LETTER TTTHA +10A38 KHAROSHTHI SIGN BAR ABOVE +10A39 KHAROSHTHI SIGN CAUDA +10A3A KHAROSHTHI SIGN DOT BELOW +10A3F KHAROSHTHI VIRAMA +10A40 KHAROSHTHI DIGIT ONE +10A41 KHAROSHTHI DIGIT TWO +10A42 KHAROSHTHI DIGIT THREE +10A43 KHAROSHTHI DIGIT FOUR +10A44 KHAROSHTHI NUMBER TEN +10A45 KHAROSHTHI NUMBER TWENTY +10A46 KHAROSHTHI NUMBER ONE HUNDRED +10A47 KHAROSHTHI NUMBER ONE THOUSAND +10A50 KHAROSHTHI PUNCTUATION DOT +10A51 KHAROSHTHI PUNCTUATION SMALL CIRCLE +10A52 KHAROSHTHI PUNCTUATION CIRCLE +10A53 KHAROSHTHI PUNCTUATION CRESCENT BAR +10A54 KHAROSHTHI PUNCTUATION MANGALAM +10A55 KHAROSHTHI PUNCTUATION LOTUS +10A56 KHAROSHTHI PUNCTUATION DANDA +10A57 KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 KHAROSHTHI PUNCTUATION LINES +10A60 OLD SOUTH ARABIAN LETTER HE +10A61 OLD SOUTH ARABIAN LETTER LAMEDH +10A62 OLD SOUTH ARABIAN LETTER HETH +10A63 OLD SOUTH ARABIAN LETTER MEM +10A64 OLD SOUTH ARABIAN LETTER QOPH +10A65 OLD SOUTH ARABIAN LETTER WAW +10A66 OLD SOUTH ARABIAN LETTER SHIN +10A67 OLD SOUTH ARABIAN LETTER RESH +10A68 OLD SOUTH ARABIAN LETTER BETH +10A69 OLD SOUTH ARABIAN LETTER TAW +10A6A OLD SOUTH ARABIAN LETTER SAT +10A6B OLD SOUTH ARABIAN LETTER KAPH +10A6C OLD SOUTH ARABIAN LETTER NUN +10A6D OLD SOUTH ARABIAN LETTER KHETH +10A6E OLD SOUTH ARABIAN LETTER SADHE +10A6F OLD SOUTH ARABIAN LETTER SAMEKH +10A70 OLD SOUTH ARABIAN LETTER FE +10A71 OLD SOUTH ARABIAN LETTER ALEF +10A72 OLD SOUTH ARABIAN LETTER AYN +10A73 OLD SOUTH ARABIAN LETTER DHADHE +10A74 OLD SOUTH ARABIAN LETTER GIMEL +10A75 OLD SOUTH ARABIAN LETTER DALETH +10A76 OLD SOUTH ARABIAN LETTER GHAYN +10A77 OLD SOUTH ARABIAN LETTER TETH +10A78 OLD SOUTH ARABIAN LETTER ZAYN +10A79 OLD SOUTH ARABIAN LETTER DHALETH +10A7A OLD SOUTH ARABIAN LETTER YODH +10A7B OLD SOUTH ARABIAN LETTER THAW +10A7C OLD SOUTH ARABIAN LETTER THETH +10A7D OLD SOUTH ARABIAN NUMBER ONE +10A7E OLD SOUTH ARABIAN NUMBER FIFTY +10A7F OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80 OLD NORTH ARABIAN LETTER HEH +10A81 OLD NORTH ARABIAN LETTER LAM +10A82 OLD NORTH ARABIAN LETTER HAH +10A83 OLD NORTH ARABIAN LETTER MEEM +10A84 OLD NORTH ARABIAN LETTER QAF +10A85 OLD NORTH ARABIAN LETTER WAW +10A86 OLD NORTH ARABIAN LETTER ES-2 +10A87 OLD NORTH ARABIAN LETTER REH +10A88 OLD NORTH ARABIAN LETTER BEH +10A89 OLD NORTH ARABIAN LETTER TEH +10A8A OLD NORTH ARABIAN LETTER ES-1 +10A8B OLD NORTH ARABIAN LETTER KAF +10A8C OLD NORTH ARABIAN LETTER NOON +10A8D OLD NORTH ARABIAN LETTER KHAH +10A8E OLD NORTH ARABIAN LETTER SAD +10A8F OLD NORTH ARABIAN LETTER ES-3 +10A90 OLD NORTH ARABIAN LETTER FEH +10A91 OLD NORTH ARABIAN LETTER ALEF +10A92 OLD NORTH ARABIAN LETTER AIN +10A93 OLD NORTH ARABIAN LETTER DAD +10A94 OLD NORTH ARABIAN LETTER GEEM +10A95 OLD NORTH ARABIAN LETTER DAL +10A96 OLD NORTH ARABIAN LETTER GHAIN +10A97 OLD NORTH ARABIAN LETTER TAH +10A98 OLD NORTH ARABIAN LETTER ZAIN +10A99 OLD NORTH ARABIAN LETTER THAL +10A9A OLD NORTH ARABIAN LETTER YEH +10A9B OLD NORTH ARABIAN LETTER THEH +10A9C OLD NORTH ARABIAN LETTER ZAH +10A9D OLD NORTH ARABIAN NUMBER ONE +10A9E OLD NORTH ARABIAN NUMBER TEN +10A9F OLD NORTH ARABIAN NUMBER TWENTY +10AC0 MANICHAEAN LETTER ALEPH +10AC1 MANICHAEAN LETTER BETH +10AC2 MANICHAEAN LETTER BHETH +10AC3 MANICHAEAN LETTER GIMEL +10AC4 MANICHAEAN LETTER GHIMEL +10AC5 MANICHAEAN LETTER DALETH +10AC6 MANICHAEAN LETTER HE +10AC7 MANICHAEAN LETTER WAW +10AC8 MANICHAEAN SIGN UD +10AC9 MANICHAEAN LETTER ZAYIN +10ACA MANICHAEAN LETTER ZHAYIN +10ACB MANICHAEAN LETTER JAYIN +10ACC MANICHAEAN LETTER JHAYIN +10ACD MANICHAEAN LETTER HETH +10ACE MANICHAEAN LETTER TETH +10ACF MANICHAEAN LETTER YODH +10AD0 MANICHAEAN LETTER KAPH +10AD1 MANICHAEAN LETTER XAPH +10AD2 MANICHAEAN LETTER KHAPH +10AD3 MANICHAEAN LETTER LAMEDH +10AD4 MANICHAEAN LETTER DHAMEDH +10AD5 MANICHAEAN LETTER THAMEDH +10AD6 MANICHAEAN LETTER MEM +10AD7 MANICHAEAN LETTER NUN +10AD8 MANICHAEAN LETTER SAMEKH +10AD9 MANICHAEAN LETTER AYIN +10ADA MANICHAEAN LETTER AAYIN +10ADB MANICHAEAN LETTER PE +10ADC MANICHAEAN LETTER FE +10ADD MANICHAEAN LETTER SADHE +10ADE MANICHAEAN LETTER QOPH +10ADF MANICHAEAN LETTER XOPH +10AE0 MANICHAEAN LETTER QHOPH +10AE1 MANICHAEAN LETTER RESH +10AE2 MANICHAEAN LETTER SHIN +10AE3 MANICHAEAN LETTER SSHIN +10AE4 MANICHAEAN LETTER TAW +10AE5 MANICHAEAN ABBREVIATION MARK ABOVE +10AE6 MANICHAEAN ABBREVIATION MARK BELOW +10AEB MANICHAEAN NUMBER ONE +10AEC MANICHAEAN NUMBER FIVE +10AED MANICHAEAN NUMBER TEN +10AEE MANICHAEAN NUMBER TWENTY +10AEF MANICHAEAN NUMBER ONE HUNDRED +10AF0 MANICHAEAN PUNCTUATION STAR +10AF1 MANICHAEAN PUNCTUATION FLEURON +10AF2 MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT +10AF3 MANICHAEAN PUNCTUATION DOT WITHIN DOT +10AF4 MANICHAEAN PUNCTUATION DOT +10AF5 MANICHAEAN PUNCTUATION TWO DOTS +10AF6 MANICHAEAN PUNCTUATION LINE FILLER +10B00 AVESTAN LETTER A +10B01 AVESTAN LETTER AA +10B02 AVESTAN LETTER AO +10B03 AVESTAN LETTER AAO +10B04 AVESTAN LETTER AN +10B05 AVESTAN LETTER AAN +10B06 AVESTAN LETTER AE +10B07 AVESTAN LETTER AEE +10B08 AVESTAN LETTER E +10B09 AVESTAN LETTER EE +10B0A AVESTAN LETTER O +10B0B AVESTAN LETTER OO +10B0C AVESTAN LETTER I +10B0D AVESTAN LETTER II +10B0E AVESTAN LETTER U +10B0F AVESTAN LETTER UU +10B10 AVESTAN LETTER KE +10B11 AVESTAN LETTER XE +10B12 AVESTAN LETTER XYE +10B13 AVESTAN LETTER XVE +10B14 AVESTAN LETTER GE +10B15 AVESTAN LETTER GGE +10B16 AVESTAN LETTER GHE +10B17 AVESTAN LETTER CE +10B18 AVESTAN LETTER JE +10B19 AVESTAN LETTER TE +10B1A AVESTAN LETTER THE +10B1B AVESTAN LETTER DE +10B1C AVESTAN LETTER DHE +10B1D AVESTAN LETTER TTE +10B1E AVESTAN LETTER PE +10B1F AVESTAN LETTER FE +10B20 AVESTAN LETTER BE +10B21 AVESTAN LETTER BHE +10B22 AVESTAN LETTER NGE +10B23 AVESTAN LETTER NGYE +10B24 AVESTAN LETTER NGVE +10B25 AVESTAN LETTER NE +10B26 AVESTAN LETTER NYE +10B27 AVESTAN LETTER NNE +10B28 AVESTAN LETTER ME +10B29 AVESTAN LETTER HME +10B2A AVESTAN LETTER YYE +10B2B AVESTAN LETTER YE +10B2C AVESTAN LETTER VE +10B2D AVESTAN LETTER RE +10B2E AVESTAN LETTER LE +10B2F AVESTAN LETTER SE +10B30 AVESTAN LETTER ZE +10B31 AVESTAN LETTER SHE +10B32 AVESTAN LETTER ZHE +10B33 AVESTAN LETTER SHYE +10B34 AVESTAN LETTER SSHE +10B35 AVESTAN LETTER HE +10B39 AVESTAN ABBREVIATION MARK +10B3A TINY TWO DOTS OVER ONE DOT PUNCTUATION +10B3B SMALL TWO DOTS OVER ONE DOT PUNCTUATION +10B3C LARGE TWO DOTS OVER ONE DOT PUNCTUATION +10B3D LARGE ONE DOT OVER TWO DOTS PUNCTUATION +10B3E LARGE TWO RINGS OVER ONE RING PUNCTUATION +10B3F LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40 INSCRIPTIONAL PARTHIAN LETTER ALEPH +10B41 INSCRIPTIONAL PARTHIAN LETTER BETH +10B42 INSCRIPTIONAL PARTHIAN LETTER GIMEL +10B43 INSCRIPTIONAL PARTHIAN LETTER DALETH +10B44 INSCRIPTIONAL PARTHIAN LETTER HE +10B45 INSCRIPTIONAL PARTHIAN LETTER WAW +10B46 INSCRIPTIONAL PARTHIAN LETTER ZAYIN +10B47 INSCRIPTIONAL PARTHIAN LETTER HETH +10B48 INSCRIPTIONAL PARTHIAN LETTER TETH +10B49 INSCRIPTIONAL PARTHIAN LETTER YODH +10B4A INSCRIPTIONAL PARTHIAN LETTER KAPH +10B4B INSCRIPTIONAL PARTHIAN LETTER LAMEDH +10B4C INSCRIPTIONAL PARTHIAN LETTER MEM +10B4D INSCRIPTIONAL PARTHIAN LETTER NUN +10B4E INSCRIPTIONAL PARTHIAN LETTER SAMEKH +10B4F INSCRIPTIONAL PARTHIAN LETTER AYIN +10B50 INSCRIPTIONAL PARTHIAN LETTER PE +10B51 INSCRIPTIONAL PARTHIAN LETTER SADHE +10B52 INSCRIPTIONAL PARTHIAN LETTER QOPH +10B53 INSCRIPTIONAL PARTHIAN LETTER RESH +10B54 INSCRIPTIONAL PARTHIAN LETTER SHIN +10B55 INSCRIPTIONAL PARTHIAN LETTER TAW +10B58 INSCRIPTIONAL PARTHIAN NUMBER ONE +10B59 INSCRIPTIONAL PARTHIAN NUMBER TWO +10B5A INSCRIPTIONAL PARTHIAN NUMBER THREE +10B5B INSCRIPTIONAL PARTHIAN NUMBER FOUR +10B5C INSCRIPTIONAL PARTHIAN NUMBER TEN +10B5D INSCRIPTIONAL PARTHIAN NUMBER TWENTY +10B5E INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED +10B5F INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60 INSCRIPTIONAL PAHLAVI LETTER ALEPH +10B61 INSCRIPTIONAL PAHLAVI LETTER BETH +10B62 INSCRIPTIONAL PAHLAVI LETTER GIMEL +10B63 INSCRIPTIONAL PAHLAVI LETTER DALETH +10B64 INSCRIPTIONAL PAHLAVI LETTER HE +10B65 INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH +10B66 INSCRIPTIONAL PAHLAVI LETTER ZAYIN +10B67 INSCRIPTIONAL PAHLAVI LETTER HETH +10B68 INSCRIPTIONAL PAHLAVI LETTER TETH +10B69 INSCRIPTIONAL PAHLAVI LETTER YODH +10B6A INSCRIPTIONAL PAHLAVI LETTER KAPH +10B6B INSCRIPTIONAL PAHLAVI LETTER LAMEDH +10B6C INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH +10B6D INSCRIPTIONAL PAHLAVI LETTER NUN +10B6E INSCRIPTIONAL PAHLAVI LETTER SAMEKH +10B6F INSCRIPTIONAL PAHLAVI LETTER PE +10B70 INSCRIPTIONAL PAHLAVI LETTER SADHE +10B71 INSCRIPTIONAL PAHLAVI LETTER SHIN +10B72 INSCRIPTIONAL PAHLAVI LETTER TAW +10B78 INSCRIPTIONAL PAHLAVI NUMBER ONE +10B79 INSCRIPTIONAL PAHLAVI NUMBER TWO +10B7A INSCRIPTIONAL PAHLAVI NUMBER THREE +10B7B INSCRIPTIONAL PAHLAVI NUMBER FOUR +10B7C INSCRIPTIONAL PAHLAVI NUMBER TEN +10B7D INSCRIPTIONAL PAHLAVI NUMBER TWENTY +10B7E INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED +10B7F INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80 PSALTER PAHLAVI LETTER ALEPH +10B81 PSALTER PAHLAVI LETTER BETH +10B82 PSALTER PAHLAVI LETTER GIMEL +10B83 PSALTER PAHLAVI LETTER DALETH +10B84 PSALTER PAHLAVI LETTER HE +10B85 PSALTER PAHLAVI LETTER WAW-AYIN-RESH +10B86 PSALTER PAHLAVI LETTER ZAYIN +10B87 PSALTER PAHLAVI LETTER HETH +10B88 PSALTER PAHLAVI LETTER YODH +10B89 PSALTER PAHLAVI LETTER KAPH +10B8A PSALTER PAHLAVI LETTER LAMEDH +10B8B PSALTER PAHLAVI LETTER MEM-QOPH +10B8C PSALTER PAHLAVI LETTER NUN +10B8D PSALTER PAHLAVI LETTER SAMEKH +10B8E PSALTER PAHLAVI LETTER PE +10B8F PSALTER PAHLAVI LETTER SADHE +10B90 PSALTER PAHLAVI LETTER SHIN +10B91 PSALTER PAHLAVI LETTER TAW +10B99 PSALTER PAHLAVI SECTION MARK +10B9A PSALTER PAHLAVI TURNED SECTION MARK +10B9B PSALTER PAHLAVI FOUR DOTS WITH CROSS +10B9C PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9 PSALTER PAHLAVI NUMBER ONE +10BAA PSALTER PAHLAVI NUMBER TWO +10BAB PSALTER PAHLAVI NUMBER THREE +10BAC PSALTER PAHLAVI NUMBER FOUR +10BAD PSALTER PAHLAVI NUMBER TEN +10BAE PSALTER PAHLAVI NUMBER TWENTY +10BAF PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00 OLD TURKIC LETTER ORKHON A +10C01 OLD TURKIC LETTER YENISEI A +10C02 OLD TURKIC LETTER YENISEI AE +10C03 OLD TURKIC LETTER ORKHON I +10C04 OLD TURKIC LETTER YENISEI I +10C05 OLD TURKIC LETTER YENISEI E +10C06 OLD TURKIC LETTER ORKHON O +10C07 OLD TURKIC LETTER ORKHON OE +10C08 OLD TURKIC LETTER YENISEI OE +10C09 OLD TURKIC LETTER ORKHON AB +10C0A OLD TURKIC LETTER YENISEI AB +10C0B OLD TURKIC LETTER ORKHON AEB +10C0C OLD TURKIC LETTER YENISEI AEB +10C0D OLD TURKIC LETTER ORKHON AG +10C0E OLD TURKIC LETTER YENISEI AG +10C0F OLD TURKIC LETTER ORKHON AEG +10C10 OLD TURKIC LETTER YENISEI AEG +10C11 OLD TURKIC LETTER ORKHON AD +10C12 OLD TURKIC LETTER YENISEI AD +10C13 OLD TURKIC LETTER ORKHON AED +10C14 OLD TURKIC LETTER ORKHON EZ +10C15 OLD TURKIC LETTER YENISEI EZ +10C16 OLD TURKIC LETTER ORKHON AY +10C17 OLD TURKIC LETTER YENISEI AY +10C18 OLD TURKIC LETTER ORKHON AEY +10C19 OLD TURKIC LETTER YENISEI AEY +10C1A OLD TURKIC LETTER ORKHON AEK +10C1B OLD TURKIC LETTER YENISEI AEK +10C1C OLD TURKIC LETTER ORKHON OEK +10C1D OLD TURKIC LETTER YENISEI OEK +10C1E OLD TURKIC LETTER ORKHON AL +10C1F OLD TURKIC LETTER YENISEI AL +10C20 OLD TURKIC LETTER ORKHON AEL +10C21 OLD TURKIC LETTER ORKHON ELT +10C22 OLD TURKIC LETTER ORKHON EM +10C23 OLD TURKIC LETTER ORKHON AN +10C24 OLD TURKIC LETTER ORKHON AEN +10C25 OLD TURKIC LETTER YENISEI AEN +10C26 OLD TURKIC LETTER ORKHON ENT +10C27 OLD TURKIC LETTER YENISEI ENT +10C28 OLD TURKIC LETTER ORKHON ENC +10C29 OLD TURKIC LETTER YENISEI ENC +10C2A OLD TURKIC LETTER ORKHON ENY +10C2B OLD TURKIC LETTER YENISEI ENY +10C2C OLD TURKIC LETTER YENISEI ANG +10C2D OLD TURKIC LETTER ORKHON ENG +10C2E OLD TURKIC LETTER YENISEI AENG +10C2F OLD TURKIC LETTER ORKHON EP +10C30 OLD TURKIC LETTER ORKHON OP +10C31 OLD TURKIC LETTER ORKHON IC +10C32 OLD TURKIC LETTER ORKHON EC +10C33 OLD TURKIC LETTER YENISEI EC +10C34 OLD TURKIC LETTER ORKHON AQ +10C35 OLD TURKIC LETTER YENISEI AQ +10C36 OLD TURKIC LETTER ORKHON IQ +10C37 OLD TURKIC LETTER YENISEI IQ +10C38 OLD TURKIC LETTER ORKHON OQ +10C39 OLD TURKIC LETTER YENISEI OQ +10C3A OLD TURKIC LETTER ORKHON AR +10C3B OLD TURKIC LETTER YENISEI AR +10C3C OLD TURKIC LETTER ORKHON AER +10C3D OLD TURKIC LETTER ORKHON AS +10C3E OLD TURKIC LETTER ORKHON AES +10C3F OLD TURKIC LETTER ORKHON ASH +10C40 OLD TURKIC LETTER YENISEI ASH +10C41 OLD TURKIC LETTER ORKHON ESH +10C42 OLD TURKIC LETTER YENISEI ESH +10C43 OLD TURKIC LETTER ORKHON AT +10C44 OLD TURKIC LETTER YENISEI AT +10C45 OLD TURKIC LETTER ORKHON AET +10C46 OLD TURKIC LETTER YENISEI AET +10C47 OLD TURKIC LETTER ORKHON OT +10C48 OLD TURKIC LETTER ORKHON BASH +10C80 OLD HUNGARIAN CAPITAL LETTER A +10C81 OLD HUNGARIAN CAPITAL LETTER AA +10C82 OLD HUNGARIAN CAPITAL LETTER EB +10C83 OLD HUNGARIAN CAPITAL LETTER AMB +10C84 OLD HUNGARIAN CAPITAL LETTER EC +10C85 OLD HUNGARIAN CAPITAL LETTER ENC +10C86 OLD HUNGARIAN CAPITAL LETTER ECS +10C87 OLD HUNGARIAN CAPITAL LETTER ED +10C88 OLD HUNGARIAN CAPITAL LETTER AND +10C89 OLD HUNGARIAN CAPITAL LETTER E +10C8A OLD HUNGARIAN CAPITAL LETTER CLOSE E +10C8B OLD HUNGARIAN CAPITAL LETTER EE +10C8C OLD HUNGARIAN CAPITAL LETTER EF +10C8D OLD HUNGARIAN CAPITAL LETTER EG +10C8E OLD HUNGARIAN CAPITAL LETTER EGY +10C8F OLD HUNGARIAN CAPITAL LETTER EH +10C90 OLD HUNGARIAN CAPITAL LETTER I +10C91 OLD HUNGARIAN CAPITAL LETTER II +10C92 OLD HUNGARIAN CAPITAL LETTER EJ +10C93 OLD HUNGARIAN CAPITAL LETTER EK +10C94 OLD HUNGARIAN CAPITAL LETTER AK +10C95 OLD HUNGARIAN CAPITAL LETTER UNK +10C96 OLD HUNGARIAN CAPITAL LETTER EL +10C97 OLD HUNGARIAN CAPITAL LETTER ELY +10C98 OLD HUNGARIAN CAPITAL LETTER EM +10C99 OLD HUNGARIAN CAPITAL LETTER EN +10C9A OLD HUNGARIAN CAPITAL LETTER ENY +10C9B OLD HUNGARIAN CAPITAL LETTER O +10C9C OLD HUNGARIAN CAPITAL LETTER OO +10C9D OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10C9E OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10C9F OLD HUNGARIAN CAPITAL LETTER OEE +10CA0 OLD HUNGARIAN CAPITAL LETTER EP +10CA1 OLD HUNGARIAN CAPITAL LETTER EMP +10CA2 OLD HUNGARIAN CAPITAL LETTER ER +10CA3 OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CA4 OLD HUNGARIAN CAPITAL LETTER ES +10CA5 OLD HUNGARIAN CAPITAL LETTER ESZ +10CA6 OLD HUNGARIAN CAPITAL LETTER ET +10CA7 OLD HUNGARIAN CAPITAL LETTER ENT +10CA8 OLD HUNGARIAN CAPITAL LETTER ETY +10CA9 OLD HUNGARIAN CAPITAL LETTER ECH +10CAA OLD HUNGARIAN CAPITAL LETTER U +10CAB OLD HUNGARIAN CAPITAL LETTER UU +10CAC OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CAD OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CAE OLD HUNGARIAN CAPITAL LETTER EV +10CAF OLD HUNGARIAN CAPITAL LETTER EZ +10CB0 OLD HUNGARIAN CAPITAL LETTER EZS +10CB1 OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CB2 OLD HUNGARIAN CAPITAL LETTER US +10CC0 OLD HUNGARIAN SMALL LETTER A +10CC1 OLD HUNGARIAN SMALL LETTER AA +10CC2 OLD HUNGARIAN SMALL LETTER EB +10CC3 OLD HUNGARIAN SMALL LETTER AMB +10CC4 OLD HUNGARIAN SMALL LETTER EC +10CC5 OLD HUNGARIAN SMALL LETTER ENC +10CC6 OLD HUNGARIAN SMALL LETTER ECS +10CC7 OLD HUNGARIAN SMALL LETTER ED +10CC8 OLD HUNGARIAN SMALL LETTER AND +10CC9 OLD HUNGARIAN SMALL LETTER E +10CCA OLD HUNGARIAN SMALL LETTER CLOSE E +10CCB OLD HUNGARIAN SMALL LETTER EE +10CCC OLD HUNGARIAN SMALL LETTER EF +10CCD OLD HUNGARIAN SMALL LETTER EG +10CCE OLD HUNGARIAN SMALL LETTER EGY +10CCF OLD HUNGARIAN SMALL LETTER EH +10CD0 OLD HUNGARIAN SMALL LETTER I +10CD1 OLD HUNGARIAN SMALL LETTER II +10CD2 OLD HUNGARIAN SMALL LETTER EJ +10CD3 OLD HUNGARIAN SMALL LETTER EK +10CD4 OLD HUNGARIAN SMALL LETTER AK +10CD5 OLD HUNGARIAN SMALL LETTER UNK +10CD6 OLD HUNGARIAN SMALL LETTER EL +10CD7 OLD HUNGARIAN SMALL LETTER ELY +10CD8 OLD HUNGARIAN SMALL LETTER EM +10CD9 OLD HUNGARIAN SMALL LETTER EN +10CDA OLD HUNGARIAN SMALL LETTER ENY +10CDB OLD HUNGARIAN SMALL LETTER O +10CDC OLD HUNGARIAN SMALL LETTER OO +10CDD OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE +10CDE OLD HUNGARIAN SMALL LETTER RUDIMENTA OE +10CDF OLD HUNGARIAN SMALL LETTER OEE +10CE0 OLD HUNGARIAN SMALL LETTER EP +10CE1 OLD HUNGARIAN SMALL LETTER EMP +10CE2 OLD HUNGARIAN SMALL LETTER ER +10CE3 OLD HUNGARIAN SMALL LETTER SHORT ER +10CE4 OLD HUNGARIAN SMALL LETTER ES +10CE5 OLD HUNGARIAN SMALL LETTER ESZ +10CE6 OLD HUNGARIAN SMALL LETTER ET +10CE7 OLD HUNGARIAN SMALL LETTER ENT +10CE8 OLD HUNGARIAN SMALL LETTER ETY +10CE9 OLD HUNGARIAN SMALL LETTER ECH +10CEA OLD HUNGARIAN SMALL LETTER U +10CEB OLD HUNGARIAN SMALL LETTER UU +10CEC OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE +10CED OLD HUNGARIAN SMALL LETTER RUDIMENTA UE +10CEE OLD HUNGARIAN SMALL LETTER EV +10CEF OLD HUNGARIAN SMALL LETTER EZ +10CF0 OLD HUNGARIAN SMALL LETTER EZS +10CF1 OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN +10CF2 OLD HUNGARIAN SMALL LETTER US +10CFA OLD HUNGARIAN NUMBER ONE +10CFB OLD HUNGARIAN NUMBER FIVE +10CFC OLD HUNGARIAN NUMBER TEN +10CFD OLD HUNGARIAN NUMBER FIFTY +10CFE OLD HUNGARIAN NUMBER ONE HUNDRED +10CFF OLD HUNGARIAN NUMBER ONE THOUSAND +10E60 RUMI DIGIT ONE +10E61 RUMI DIGIT TWO +10E62 RUMI DIGIT THREE +10E63 RUMI DIGIT FOUR +10E64 RUMI DIGIT FIVE +10E65 RUMI DIGIT SIX +10E66 RUMI DIGIT SEVEN +10E67 RUMI DIGIT EIGHT +10E68 RUMI DIGIT NINE +10E69 RUMI NUMBER TEN +10E6A RUMI NUMBER TWENTY +10E6B RUMI NUMBER THIRTY +10E6C RUMI NUMBER FORTY +10E6D RUMI NUMBER FIFTY +10E6E RUMI NUMBER SIXTY +10E6F RUMI NUMBER SEVENTY +10E70 RUMI NUMBER EIGHTY +10E71 RUMI NUMBER NINETY +10E72 RUMI NUMBER ONE HUNDRED +10E73 RUMI NUMBER TWO HUNDRED +10E74 RUMI NUMBER THREE HUNDRED +10E75 RUMI NUMBER FOUR HUNDRED +10E76 RUMI NUMBER FIVE HUNDRED +10E77 RUMI NUMBER SIX HUNDRED +10E78 RUMI NUMBER SEVEN HUNDRED +10E79 RUMI NUMBER EIGHT HUNDRED +10E7A RUMI NUMBER NINE HUNDRED +10E7B RUMI FRACTION ONE HALF +10E7C RUMI FRACTION ONE QUARTER +10E7D RUMI FRACTION ONE THIRD +10E7E RUMI FRACTION TWO THIRDS +11000 BRAHMI SIGN CANDRABINDU +11001 BRAHMI SIGN ANUSVARA +11002 BRAHMI SIGN VISARGA +11003 BRAHMI SIGN JIHVAMULIYA +11004 BRAHMI SIGN UPADHMANIYA +11005 BRAHMI LETTER A +11006 BRAHMI LETTER AA +11007 BRAHMI LETTER I +11008 BRAHMI LETTER II +11009 BRAHMI LETTER U +1100A BRAHMI LETTER UU +1100B BRAHMI LETTER VOCALIC R +1100C BRAHMI LETTER VOCALIC RR +1100D BRAHMI LETTER VOCALIC L +1100E BRAHMI LETTER VOCALIC LL +1100F BRAHMI LETTER E +11010 BRAHMI LETTER AI +11011 BRAHMI LETTER O +11012 BRAHMI LETTER AU +11013 BRAHMI LETTER KA +11014 BRAHMI LETTER KHA +11015 BRAHMI LETTER GA +11016 BRAHMI LETTER GHA +11017 BRAHMI LETTER NGA +11018 BRAHMI LETTER CA +11019 BRAHMI LETTER CHA +1101A BRAHMI LETTER JA +1101B BRAHMI LETTER JHA +1101C BRAHMI LETTER NYA +1101D BRAHMI LETTER TTA +1101E BRAHMI LETTER TTHA +1101F BRAHMI LETTER DDA +11020 BRAHMI LETTER DDHA +11021 BRAHMI LETTER NNA +11022 BRAHMI LETTER TA +11023 BRAHMI LETTER THA +11024 BRAHMI LETTER DA +11025 BRAHMI LETTER DHA +11026 BRAHMI LETTER NA +11027 BRAHMI LETTER PA +11028 BRAHMI LETTER PHA +11029 BRAHMI LETTER BA +1102A BRAHMI LETTER BHA +1102B BRAHMI LETTER MA +1102C BRAHMI LETTER YA +1102D BRAHMI LETTER RA +1102E BRAHMI LETTER LA +1102F BRAHMI LETTER VA +11030 BRAHMI LETTER SHA +11031 BRAHMI LETTER SSA +11032 BRAHMI LETTER SA +11033 BRAHMI LETTER HA +11034 BRAHMI LETTER LLA +11035 BRAHMI LETTER OLD TAMIL LLLA +11036 BRAHMI LETTER OLD TAMIL RRA +11037 BRAHMI LETTER OLD TAMIL NNNA +11038 BRAHMI VOWEL SIGN AA +11039 BRAHMI VOWEL SIGN BHATTIPROLU AA +1103A BRAHMI VOWEL SIGN I +1103B BRAHMI VOWEL SIGN II +1103C BRAHMI VOWEL SIGN U +1103D BRAHMI VOWEL SIGN UU +1103E BRAHMI VOWEL SIGN VOCALIC R +1103F BRAHMI VOWEL SIGN VOCALIC RR +11040 BRAHMI VOWEL SIGN VOCALIC L +11041 BRAHMI VOWEL SIGN VOCALIC LL +11042 BRAHMI VOWEL SIGN E +11043 BRAHMI VOWEL SIGN AI +11044 BRAHMI VOWEL SIGN O +11045 BRAHMI VOWEL SIGN AU +11046 BRAHMI VIRAMA +11047 BRAHMI DANDA +11048 BRAHMI DOUBLE DANDA +11049 BRAHMI PUNCTUATION DOT +1104A BRAHMI PUNCTUATION DOUBLE DOT +1104B BRAHMI PUNCTUATION LINE +1104C BRAHMI PUNCTUATION CRESCENT BAR +1104D BRAHMI PUNCTUATION LOTUS +11052 BRAHMI NUMBER ONE +11053 BRAHMI NUMBER TWO +11054 BRAHMI NUMBER THREE +11055 BRAHMI NUMBER FOUR +11056 BRAHMI NUMBER FIVE +11057 BRAHMI NUMBER SIX +11058 BRAHMI NUMBER SEVEN +11059 BRAHMI NUMBER EIGHT +1105A BRAHMI NUMBER NINE +1105B BRAHMI NUMBER TEN +1105C BRAHMI NUMBER TWENTY +1105D BRAHMI NUMBER THIRTY +1105E BRAHMI NUMBER FORTY +1105F BRAHMI NUMBER FIFTY +11060 BRAHMI NUMBER SIXTY +11061 BRAHMI NUMBER SEVENTY +11062 BRAHMI NUMBER EIGHTY +11063 BRAHMI NUMBER NINETY +11064 BRAHMI NUMBER ONE HUNDRED +11065 BRAHMI NUMBER ONE THOUSAND +11066 BRAHMI DIGIT ZERO +11067 BRAHMI DIGIT ONE +11068 BRAHMI DIGIT TWO +11069 BRAHMI DIGIT THREE +1106A BRAHMI DIGIT FOUR +1106B BRAHMI DIGIT FIVE +1106C BRAHMI DIGIT SIX +1106D BRAHMI DIGIT SEVEN +1106E BRAHMI DIGIT EIGHT +1106F BRAHMI DIGIT NINE +1107F BRAHMI NUMBER JOINER +11080 KAITHI SIGN CANDRABINDU +11081 KAITHI SIGN ANUSVARA +11082 KAITHI SIGN VISARGA +11083 KAITHI LETTER A +11084 KAITHI LETTER AA +11085 KAITHI LETTER I +11086 KAITHI LETTER II +11087 KAITHI LETTER U +11088 KAITHI LETTER UU +11089 KAITHI LETTER E +1108A KAITHI LETTER AI +1108B KAITHI LETTER O +1108C KAITHI LETTER AU +1108D KAITHI LETTER KA +1108E KAITHI LETTER KHA +1108F KAITHI LETTER GA +11090 KAITHI LETTER GHA +11091 KAITHI LETTER NGA +11092 KAITHI LETTER CA +11093 KAITHI LETTER CHA +11094 KAITHI LETTER JA +11095 KAITHI LETTER JHA +11096 KAITHI LETTER NYA +11097 KAITHI LETTER TTA +11098 KAITHI LETTER TTHA +11099 KAITHI LETTER DDA +1109A KAITHI LETTER DDDHA +1109B KAITHI LETTER DDHA +1109C KAITHI LETTER RHA +1109D KAITHI LETTER NNA +1109E KAITHI LETTER TA +1109F KAITHI LETTER THA +110A0 KAITHI LETTER DA +110A1 KAITHI LETTER DHA +110A2 KAITHI LETTER NA +110A3 KAITHI LETTER PA +110A4 KAITHI LETTER PHA +110A5 KAITHI LETTER BA +110A6 KAITHI LETTER BHA +110A7 KAITHI LETTER MA +110A8 KAITHI LETTER YA +110A9 KAITHI LETTER RA +110AA KAITHI LETTER LA +110AB KAITHI LETTER VA +110AC KAITHI LETTER SHA +110AD KAITHI LETTER SSA +110AE KAITHI LETTER SA +110AF KAITHI LETTER HA +110B0 KAITHI VOWEL SIGN AA +110B1 KAITHI VOWEL SIGN I +110B2 KAITHI VOWEL SIGN II +110B3 KAITHI VOWEL SIGN U +110B4 KAITHI VOWEL SIGN UU +110B5 KAITHI VOWEL SIGN E +110B6 KAITHI VOWEL SIGN AI +110B7 KAITHI VOWEL SIGN O +110B8 KAITHI VOWEL SIGN AU +110B9 KAITHI SIGN VIRAMA +110BA KAITHI SIGN NUKTA +110BB KAITHI ABBREVIATION SIGN +110BC KAITHI ENUMERATION SIGN +110BD KAITHI NUMBER SIGN +110BE KAITHI SECTION MARK +110BF KAITHI DOUBLE SECTION MARK +110C0 KAITHI DANDA +110C1 KAITHI DOUBLE DANDA +110D0 SORA SOMPENG LETTER SAH +110D1 SORA SOMPENG LETTER TAH +110D2 SORA SOMPENG LETTER BAH +110D3 SORA SOMPENG LETTER CAH +110D4 SORA SOMPENG LETTER DAH +110D5 SORA SOMPENG LETTER GAH +110D6 SORA SOMPENG LETTER MAH +110D7 SORA SOMPENG LETTER NGAH +110D8 SORA SOMPENG LETTER LAH +110D9 SORA SOMPENG LETTER NAH +110DA SORA SOMPENG LETTER VAH +110DB SORA SOMPENG LETTER PAH +110DC SORA SOMPENG LETTER YAH +110DD SORA SOMPENG LETTER RAH +110DE SORA SOMPENG LETTER HAH +110DF SORA SOMPENG LETTER KAH +110E0 SORA SOMPENG LETTER JAH +110E1 SORA SOMPENG LETTER NYAH +110E2 SORA SOMPENG LETTER AH +110E3 SORA SOMPENG LETTER EEH +110E4 SORA SOMPENG LETTER IH +110E5 SORA SOMPENG LETTER UH +110E6 SORA SOMPENG LETTER OH +110E7 SORA SOMPENG LETTER EH +110E8 SORA SOMPENG LETTER MAE +110F0 SORA SOMPENG DIGIT ZERO +110F1 SORA SOMPENG DIGIT ONE +110F2 SORA SOMPENG DIGIT TWO +110F3 SORA SOMPENG DIGIT THREE +110F4 SORA SOMPENG DIGIT FOUR +110F5 SORA SOMPENG DIGIT FIVE +110F6 SORA SOMPENG DIGIT SIX +110F7 SORA SOMPENG DIGIT SEVEN +110F8 SORA SOMPENG DIGIT EIGHT +110F9 SORA SOMPENG DIGIT NINE +11100 CHAKMA SIGN CANDRABINDU +11101 CHAKMA SIGN ANUSVARA +11102 CHAKMA SIGN VISARGA +11103 CHAKMA LETTER AA +11104 CHAKMA LETTER I +11105 CHAKMA LETTER U +11106 CHAKMA LETTER E +11107 CHAKMA LETTER KAA +11108 CHAKMA LETTER KHAA +11109 CHAKMA LETTER GAA +1110A CHAKMA LETTER GHAA +1110B CHAKMA LETTER NGAA +1110C CHAKMA LETTER CAA +1110D CHAKMA LETTER CHAA +1110E CHAKMA LETTER JAA +1110F CHAKMA LETTER JHAA +11110 CHAKMA LETTER NYAA +11111 CHAKMA LETTER TTAA +11112 CHAKMA LETTER TTHAA +11113 CHAKMA LETTER DDAA +11114 CHAKMA LETTER DDHAA +11115 CHAKMA LETTER NNAA +11116 CHAKMA LETTER TAA +11117 CHAKMA LETTER THAA +11118 CHAKMA LETTER DAA +11119 CHAKMA LETTER DHAA +1111A CHAKMA LETTER NAA +1111B CHAKMA LETTER PAA +1111C CHAKMA LETTER PHAA +1111D CHAKMA LETTER BAA +1111E CHAKMA LETTER BHAA +1111F CHAKMA LETTER MAA +11120 CHAKMA LETTER YYAA +11121 CHAKMA LETTER YAA +11122 CHAKMA LETTER RAA +11123 CHAKMA LETTER LAA +11124 CHAKMA LETTER WAA +11125 CHAKMA LETTER SAA +11126 CHAKMA LETTER HAA +11127 CHAKMA VOWEL SIGN A +11128 CHAKMA VOWEL SIGN I +11129 CHAKMA VOWEL SIGN II +1112A CHAKMA VOWEL SIGN U +1112B CHAKMA VOWEL SIGN UU +1112C CHAKMA VOWEL SIGN E +1112D CHAKMA VOWEL SIGN AI +1112E CHAKMA VOWEL SIGN O +1112F CHAKMA VOWEL SIGN AU +11130 CHAKMA VOWEL SIGN OI +11131 CHAKMA O MARK +11132 CHAKMA AU MARK +11133 CHAKMA VIRAMA +11134 CHAKMA MAAYYAA +11136 CHAKMA DIGIT ZERO +11137 CHAKMA DIGIT ONE +11138 CHAKMA DIGIT TWO +11139 CHAKMA DIGIT THREE +1113A CHAKMA DIGIT FOUR +1113B CHAKMA DIGIT FIVE +1113C CHAKMA DIGIT SIX +1113D CHAKMA DIGIT SEVEN +1113E CHAKMA DIGIT EIGHT +1113F CHAKMA DIGIT NINE +11140 CHAKMA SECTION MARK +11141 CHAKMA DANDA +11142 CHAKMA DOUBLE DANDA +11143 CHAKMA QUESTION MARK +11150 MAHAJANI LETTER A +11151 MAHAJANI LETTER I +11152 MAHAJANI LETTER U +11153 MAHAJANI LETTER E +11154 MAHAJANI LETTER O +11155 MAHAJANI LETTER KA +11156 MAHAJANI LETTER KHA +11157 MAHAJANI LETTER GA +11158 MAHAJANI LETTER GHA +11159 MAHAJANI LETTER CA +1115A MAHAJANI LETTER CHA +1115B MAHAJANI LETTER JA +1115C MAHAJANI LETTER JHA +1115D MAHAJANI LETTER NYA +1115E MAHAJANI LETTER TTA +1115F MAHAJANI LETTER TTHA +11160 MAHAJANI LETTER DDA +11161 MAHAJANI LETTER DDHA +11162 MAHAJANI LETTER NNA +11163 MAHAJANI LETTER TA +11164 MAHAJANI LETTER THA +11165 MAHAJANI LETTER DA +11166 MAHAJANI LETTER DHA +11167 MAHAJANI LETTER NA +11168 MAHAJANI LETTER PA +11169 MAHAJANI LETTER PHA +1116A MAHAJANI LETTER BA +1116B MAHAJANI LETTER BHA +1116C MAHAJANI LETTER MA +1116D MAHAJANI LETTER RA +1116E MAHAJANI LETTER LA +1116F MAHAJANI LETTER VA +11170 MAHAJANI LETTER SA +11171 MAHAJANI LETTER HA +11172 MAHAJANI LETTER RRA +11173 MAHAJANI SIGN NUKTA +11174 MAHAJANI ABBREVIATION SIGN +11175 MAHAJANI SECTION MARK +11176 MAHAJANI LIGATURE SHRI +11180 SHARADA SIGN CANDRABINDU +11181 SHARADA SIGN ANUSVARA +11182 SHARADA SIGN VISARGA +11183 SHARADA LETTER A +11184 SHARADA LETTER AA +11185 SHARADA LETTER I +11186 SHARADA LETTER II +11187 SHARADA LETTER U +11188 SHARADA LETTER UU +11189 SHARADA LETTER VOCALIC R +1118A SHARADA LETTER VOCALIC RR +1118B SHARADA LETTER VOCALIC L +1118C SHARADA LETTER VOCALIC LL +1118D SHARADA LETTER E +1118E SHARADA LETTER AI +1118F SHARADA LETTER O +11190 SHARADA LETTER AU +11191 SHARADA LETTER KA +11192 SHARADA LETTER KHA +11193 SHARADA LETTER GA +11194 SHARADA LETTER GHA +11195 SHARADA LETTER NGA +11196 SHARADA LETTER CA +11197 SHARADA LETTER CHA +11198 SHARADA LETTER JA +11199 SHARADA LETTER JHA +1119A SHARADA LETTER NYA +1119B SHARADA LETTER TTA +1119C SHARADA LETTER TTHA +1119D SHARADA LETTER DDA +1119E SHARADA LETTER DDHA +1119F SHARADA LETTER NNA +111A0 SHARADA LETTER TA +111A1 SHARADA LETTER THA +111A2 SHARADA LETTER DA +111A3 SHARADA LETTER DHA +111A4 SHARADA LETTER NA +111A5 SHARADA LETTER PA +111A6 SHARADA LETTER PHA +111A7 SHARADA LETTER BA +111A8 SHARADA LETTER BHA +111A9 SHARADA LETTER MA +111AA SHARADA LETTER YA +111AB SHARADA LETTER RA +111AC SHARADA LETTER LA +111AD SHARADA LETTER LLA +111AE SHARADA LETTER VA +111AF SHARADA LETTER SHA +111B0 SHARADA LETTER SSA +111B1 SHARADA LETTER SA +111B2 SHARADA LETTER HA +111B3 SHARADA VOWEL SIGN AA +111B4 SHARADA VOWEL SIGN I +111B5 SHARADA VOWEL SIGN II +111B6 SHARADA VOWEL SIGN U +111B7 SHARADA VOWEL SIGN UU +111B8 SHARADA VOWEL SIGN VOCALIC R +111B9 SHARADA VOWEL SIGN VOCALIC RR +111BA SHARADA VOWEL SIGN VOCALIC L +111BB SHARADA VOWEL SIGN VOCALIC LL +111BC SHARADA VOWEL SIGN E +111BD SHARADA VOWEL SIGN AI +111BE SHARADA VOWEL SIGN O +111BF SHARADA VOWEL SIGN AU +111C0 SHARADA SIGN VIRAMA +111C1 SHARADA SIGN AVAGRAHA +111C2 SHARADA SIGN JIHVAMULIYA +111C3 SHARADA SIGN UPADHMANIYA +111C4 SHARADA OM +111C5 SHARADA DANDA +111C6 SHARADA DOUBLE DANDA +111C7 SHARADA ABBREVIATION SIGN +111C8 SHARADA SEPARATOR +111C9 SHARADA SANDHI MARK +111CA SHARADA SIGN NUKTA +111CB SHARADA VOWEL MODIFIER MARK +111CC SHARADA EXTRA SHORT VOWEL MARK +111CD SHARADA SUTRA MARK +111D0 SHARADA DIGIT ZERO +111D1 SHARADA DIGIT ONE +111D2 SHARADA DIGIT TWO +111D3 SHARADA DIGIT THREE +111D4 SHARADA DIGIT FOUR +111D5 SHARADA DIGIT FIVE +111D6 SHARADA DIGIT SIX +111D7 SHARADA DIGIT SEVEN +111D8 SHARADA DIGIT EIGHT +111D9 SHARADA DIGIT NINE +111DA SHARADA EKAM +111DB SHARADA SIGN SIDDHAM +111DC SHARADA HEADSTROKE +111DD SHARADA CONTINUATION SIGN +111DE SHARADA SECTION MARK-1 +111DF SHARADA SECTION MARK-2 +111E1 SINHALA ARCHAIC DIGIT ONE +111E2 SINHALA ARCHAIC DIGIT TWO +111E3 SINHALA ARCHAIC DIGIT THREE +111E4 SINHALA ARCHAIC DIGIT FOUR +111E5 SINHALA ARCHAIC DIGIT FIVE +111E6 SINHALA ARCHAIC DIGIT SIX +111E7 SINHALA ARCHAIC DIGIT SEVEN +111E8 SINHALA ARCHAIC DIGIT EIGHT +111E9 SINHALA ARCHAIC DIGIT NINE +111EA SINHALA ARCHAIC NUMBER TEN +111EB SINHALA ARCHAIC NUMBER TWENTY +111EC SINHALA ARCHAIC NUMBER THIRTY +111ED SINHALA ARCHAIC NUMBER FORTY +111EE SINHALA ARCHAIC NUMBER FIFTY +111EF SINHALA ARCHAIC NUMBER SIXTY +111F0 SINHALA ARCHAIC NUMBER SEVENTY +111F1 SINHALA ARCHAIC NUMBER EIGHTY +111F2 SINHALA ARCHAIC NUMBER NINETY +111F3 SINHALA ARCHAIC NUMBER ONE HUNDRED +111F4 SINHALA ARCHAIC NUMBER ONE THOUSAND +11200 KHOJKI LETTER A +11201 KHOJKI LETTER AA +11202 KHOJKI LETTER I +11203 KHOJKI LETTER U +11204 KHOJKI LETTER E +11205 KHOJKI LETTER AI +11206 KHOJKI LETTER O +11207 KHOJKI LETTER AU +11208 KHOJKI LETTER KA +11209 KHOJKI LETTER KHA +1120A KHOJKI LETTER GA +1120B KHOJKI LETTER GGA +1120C KHOJKI LETTER GHA +1120D KHOJKI LETTER NGA +1120E KHOJKI LETTER CA +1120F KHOJKI LETTER CHA +11210 KHOJKI LETTER JA +11211 KHOJKI LETTER JJA +11213 KHOJKI LETTER NYA +11214 KHOJKI LETTER TTA +11215 KHOJKI LETTER TTHA +11216 KHOJKI LETTER DDA +11217 KHOJKI LETTER DDHA +11218 KHOJKI LETTER NNA +11219 KHOJKI LETTER TA +1121A KHOJKI LETTER THA +1121B KHOJKI LETTER DA +1121C KHOJKI LETTER DDDA +1121D KHOJKI LETTER DHA +1121E KHOJKI LETTER NA +1121F KHOJKI LETTER PA +11220 KHOJKI LETTER PHA +11221 KHOJKI LETTER BA +11222 KHOJKI LETTER BBA +11223 KHOJKI LETTER BHA +11224 KHOJKI LETTER MA +11225 KHOJKI LETTER YA +11226 KHOJKI LETTER RA +11227 KHOJKI LETTER LA +11228 KHOJKI LETTER VA +11229 KHOJKI LETTER SA +1122A KHOJKI LETTER HA +1122B KHOJKI LETTER LLA +1122C KHOJKI VOWEL SIGN AA +1122D KHOJKI VOWEL SIGN I +1122E KHOJKI VOWEL SIGN II +1122F KHOJKI VOWEL SIGN U +11230 KHOJKI VOWEL SIGN E +11231 KHOJKI VOWEL SIGN AI +11232 KHOJKI VOWEL SIGN O +11233 KHOJKI VOWEL SIGN AU +11234 KHOJKI SIGN ANUSVARA +11235 KHOJKI SIGN VIRAMA +11236 KHOJKI SIGN NUKTA +11237 KHOJKI SIGN SHADDA +11238 KHOJKI DANDA +11239 KHOJKI DOUBLE DANDA +1123A KHOJKI WORD SEPARATOR +1123B KHOJKI SECTION MARK +1123C KHOJKI DOUBLE SECTION MARK +1123D KHOJKI ABBREVIATION SIGN +1123E KHOJKI SIGN SUKUN +11280 MULTANI LETTER A +11281 MULTANI LETTER I +11282 MULTANI LETTER U +11283 MULTANI LETTER E +11284 MULTANI LETTER KA +11285 MULTANI LETTER KHA +11286 MULTANI LETTER GA +11288 MULTANI LETTER GHA +1128A MULTANI LETTER CA +1128B MULTANI LETTER CHA +1128C MULTANI LETTER JA +1128D MULTANI LETTER JJA +1128F MULTANI LETTER NYA +11290 MULTANI LETTER TTA +11291 MULTANI LETTER TTHA +11292 MULTANI LETTER DDA +11293 MULTANI LETTER DDDA +11294 MULTANI LETTER DDHA +11295 MULTANI LETTER NNA +11296 MULTANI LETTER TA +11297 MULTANI LETTER THA +11298 MULTANI LETTER DA +11299 MULTANI LETTER DHA +1129A MULTANI LETTER NA +1129B MULTANI LETTER PA +1129C MULTANI LETTER PHA +1129D MULTANI LETTER BA +1129F MULTANI LETTER BHA +112A0 MULTANI LETTER MA +112A1 MULTANI LETTER YA +112A2 MULTANI LETTER RA +112A3 MULTANI LETTER LA +112A4 MULTANI LETTER VA +112A5 MULTANI LETTER SA +112A6 MULTANI LETTER HA +112A7 MULTANI LETTER RRA +112A8 MULTANI LETTER RHA +112A9 MULTANI SECTION MARK +112B0 KHUDAWADI LETTER A +112B1 KHUDAWADI LETTER AA +112B2 KHUDAWADI LETTER I +112B3 KHUDAWADI LETTER II +112B4 KHUDAWADI LETTER U +112B5 KHUDAWADI LETTER UU +112B6 KHUDAWADI LETTER E +112B7 KHUDAWADI LETTER AI +112B8 KHUDAWADI LETTER O +112B9 KHUDAWADI LETTER AU +112BA KHUDAWADI LETTER KA +112BB KHUDAWADI LETTER KHA +112BC KHUDAWADI LETTER GA +112BD KHUDAWADI LETTER GGA +112BE KHUDAWADI LETTER GHA +112BF KHUDAWADI LETTER NGA +112C0 KHUDAWADI LETTER CA +112C1 KHUDAWADI LETTER CHA +112C2 KHUDAWADI LETTER JA +112C3 KHUDAWADI LETTER JJA +112C4 KHUDAWADI LETTER JHA +112C5 KHUDAWADI LETTER NYA +112C6 KHUDAWADI LETTER TTA +112C7 KHUDAWADI LETTER TTHA +112C8 KHUDAWADI LETTER DDA +112C9 KHUDAWADI LETTER DDDA +112CA KHUDAWADI LETTER RRA +112CB KHUDAWADI LETTER DDHA +112CC KHUDAWADI LETTER NNA +112CD KHUDAWADI LETTER TA +112CE KHUDAWADI LETTER THA +112CF KHUDAWADI LETTER DA +112D0 KHUDAWADI LETTER DHA +112D1 KHUDAWADI LETTER NA +112D2 KHUDAWADI LETTER PA +112D3 KHUDAWADI LETTER PHA +112D4 KHUDAWADI LETTER BA +112D5 KHUDAWADI LETTER BBA +112D6 KHUDAWADI LETTER BHA +112D7 KHUDAWADI LETTER MA +112D8 KHUDAWADI LETTER YA +112D9 KHUDAWADI LETTER RA +112DA KHUDAWADI LETTER LA +112DB KHUDAWADI LETTER VA +112DC KHUDAWADI LETTER SHA +112DD KHUDAWADI LETTER SA +112DE KHUDAWADI LETTER HA +112DF KHUDAWADI SIGN ANUSVARA +112E0 KHUDAWADI VOWEL SIGN AA +112E1 KHUDAWADI VOWEL SIGN I +112E2 KHUDAWADI VOWEL SIGN II +112E3 KHUDAWADI VOWEL SIGN U +112E4 KHUDAWADI VOWEL SIGN UU +112E5 KHUDAWADI VOWEL SIGN E +112E6 KHUDAWADI VOWEL SIGN AI +112E7 KHUDAWADI VOWEL SIGN O +112E8 KHUDAWADI VOWEL SIGN AU +112E9 KHUDAWADI SIGN NUKTA +112EA KHUDAWADI SIGN VIRAMA +112F0 KHUDAWADI DIGIT ZERO +112F1 KHUDAWADI DIGIT ONE +112F2 KHUDAWADI DIGIT TWO +112F3 KHUDAWADI DIGIT THREE +112F4 KHUDAWADI DIGIT FOUR +112F5 KHUDAWADI DIGIT FIVE +112F6 KHUDAWADI DIGIT SIX +112F7 KHUDAWADI DIGIT SEVEN +112F8 KHUDAWADI DIGIT EIGHT +112F9 KHUDAWADI DIGIT NINE +11300 GRANTHA SIGN COMBINING ANUSVARA ABOVE +11301 GRANTHA SIGN CANDRABINDU +11302 GRANTHA SIGN ANUSVARA +11303 GRANTHA SIGN VISARGA +11305 GRANTHA LETTER A +11306 GRANTHA LETTER AA +11307 GRANTHA LETTER I +11308 GRANTHA LETTER II +11309 GRANTHA LETTER U +1130A GRANTHA LETTER UU +1130B GRANTHA LETTER VOCALIC R +1130C GRANTHA LETTER VOCALIC L +1130F GRANTHA LETTER EE +11310 GRANTHA LETTER AI +11313 GRANTHA LETTER OO +11314 GRANTHA LETTER AU +11315 GRANTHA LETTER KA +11316 GRANTHA LETTER KHA +11317 GRANTHA LETTER GA +11318 GRANTHA LETTER GHA +11319 GRANTHA LETTER NGA +1131A GRANTHA LETTER CA +1131B GRANTHA LETTER CHA +1131C GRANTHA LETTER JA +1131D GRANTHA LETTER JHA +1131E GRANTHA LETTER NYA +1131F GRANTHA LETTER TTA +11320 GRANTHA LETTER TTHA +11321 GRANTHA LETTER DDA +11322 GRANTHA LETTER DDHA +11323 GRANTHA LETTER NNA +11324 GRANTHA LETTER TA +11325 GRANTHA LETTER THA +11326 GRANTHA LETTER DA +11327 GRANTHA LETTER DHA +11328 GRANTHA LETTER NA +1132A GRANTHA LETTER PA +1132B GRANTHA LETTER PHA +1132C GRANTHA LETTER BA +1132D GRANTHA LETTER BHA +1132E GRANTHA LETTER MA +1132F GRANTHA LETTER YA +11330 GRANTHA LETTER RA +11332 GRANTHA LETTER LA +11333 GRANTHA LETTER LLA +11335 GRANTHA LETTER VA +11336 GRANTHA LETTER SHA +11337 GRANTHA LETTER SSA +11338 GRANTHA LETTER SA +11339 GRANTHA LETTER HA +1133C GRANTHA SIGN NUKTA +1133D GRANTHA SIGN AVAGRAHA +1133E GRANTHA VOWEL SIGN AA +1133F GRANTHA VOWEL SIGN I +11340 GRANTHA VOWEL SIGN II +11341 GRANTHA VOWEL SIGN U +11342 GRANTHA VOWEL SIGN UU +11343 GRANTHA VOWEL SIGN VOCALIC R +11344 GRANTHA VOWEL SIGN VOCALIC RR +11347 GRANTHA VOWEL SIGN EE +11348 GRANTHA VOWEL SIGN AI +1134B GRANTHA VOWEL SIGN OO +1134C GRANTHA VOWEL SIGN AU +1134D GRANTHA SIGN VIRAMA +11350 GRANTHA OM +11357 GRANTHA AU LENGTH MARK +1135D GRANTHA SIGN PLUTA +1135E GRANTHA LETTER VEDIC ANUSVARA +1135F GRANTHA LETTER VEDIC DOUBLE ANUSVARA +11360 GRANTHA LETTER VOCALIC RR +11361 GRANTHA LETTER VOCALIC LL +11362 GRANTHA VOWEL SIGN VOCALIC L +11363 GRANTHA VOWEL SIGN VOCALIC LL +11366 COMBINING GRANTHA DIGIT ZERO +11367 COMBINING GRANTHA DIGIT ONE +11368 COMBINING GRANTHA DIGIT TWO +11369 COMBINING GRANTHA DIGIT THREE +1136A COMBINING GRANTHA DIGIT FOUR +1136B COMBINING GRANTHA DIGIT FIVE +1136C COMBINING GRANTHA DIGIT SIX +11370 COMBINING GRANTHA LETTER A +11371 COMBINING GRANTHA LETTER KA +11372 COMBINING GRANTHA LETTER NA +11373 COMBINING GRANTHA LETTER VI +11374 COMBINING GRANTHA LETTER PA +11400 NEWA LETTER A +11401 NEWA LETTER AA +11402 NEWA LETTER I +11403 NEWA LETTER II +11404 NEWA LETTER U +11405 NEWA LETTER UU +11406 NEWA LETTER VOCALIC R +11407 NEWA LETTER VOCALIC RR +11408 NEWA LETTER VOCALIC L +11409 NEWA LETTER VOCALIC LL +1140A NEWA LETTER E +1140B NEWA LETTER AI +1140C NEWA LETTER O +1140D NEWA LETTER AU +1140E NEWA LETTER KA +1140F NEWA LETTER KHA +11410 NEWA LETTER GA +11411 NEWA LETTER GHA +11412 NEWA LETTER NGA +11413 NEWA LETTER NGHA +11414 NEWA LETTER CA +11415 NEWA LETTER CHA +11416 NEWA LETTER JA +11417 NEWA LETTER JHA +11418 NEWA LETTER NYA +11419 NEWA LETTER NYHA +1141A NEWA LETTER TTA +1141B NEWA LETTER TTHA +1141C NEWA LETTER DDA +1141D NEWA LETTER DDHA +1141E NEWA LETTER NNA +1141F NEWA LETTER TA +11420 NEWA LETTER THA +11421 NEWA LETTER DA +11422 NEWA LETTER DHA +11423 NEWA LETTER NA +11424 NEWA LETTER NHA +11425 NEWA LETTER PA +11426 NEWA LETTER PHA +11427 NEWA LETTER BA +11428 NEWA LETTER BHA +11429 NEWA LETTER MA +1142A NEWA LETTER MHA +1142B NEWA LETTER YA +1142C NEWA LETTER RA +1142D NEWA LETTER RHA +1142E NEWA LETTER LA +1142F NEWA LETTER LHA +11430 NEWA LETTER WA +11431 NEWA LETTER SHA +11432 NEWA LETTER SSA +11433 NEWA LETTER SA +11434 NEWA LETTER HA +11435 NEWA VOWEL SIGN AA +11436 NEWA VOWEL SIGN I +11437 NEWA VOWEL SIGN II +11438 NEWA VOWEL SIGN U +11439 NEWA VOWEL SIGN UU +1143A NEWA VOWEL SIGN VOCALIC R +1143B NEWA VOWEL SIGN VOCALIC RR +1143C NEWA VOWEL SIGN VOCALIC L +1143D NEWA VOWEL SIGN VOCALIC LL +1143E NEWA VOWEL SIGN E +1143F NEWA VOWEL SIGN AI +11440 NEWA VOWEL SIGN O +11441 NEWA VOWEL SIGN AU +11442 NEWA SIGN VIRAMA +11443 NEWA SIGN CANDRABINDU +11444 NEWA SIGN ANUSVARA +11445 NEWA SIGN VISARGA +11446 NEWA SIGN NUKTA +11447 NEWA SIGN AVAGRAHA +11448 NEWA SIGN FINAL ANUSVARA +11449 NEWA OM +1144A NEWA SIDDHI +1144B NEWA DANDA +1144C NEWA DOUBLE DANDA +1144D NEWA COMMA +1144E NEWA GAP FILLER +1144F NEWA ABBREVIATION SIGN +11450 NEWA DIGIT ZERO +11451 NEWA DIGIT ONE +11452 NEWA DIGIT TWO +11453 NEWA DIGIT THREE +11454 NEWA DIGIT FOUR +11455 NEWA DIGIT FIVE +11456 NEWA DIGIT SIX +11457 NEWA DIGIT SEVEN +11458 NEWA DIGIT EIGHT +11459 NEWA DIGIT NINE +1145B NEWA PLACEHOLDER MARK +1145D NEWA INSERTION SIGN +11480 TIRHUTA ANJI +11481 TIRHUTA LETTER A +11482 TIRHUTA LETTER AA +11483 TIRHUTA LETTER I +11484 TIRHUTA LETTER II +11485 TIRHUTA LETTER U +11486 TIRHUTA LETTER UU +11487 TIRHUTA LETTER VOCALIC R +11488 TIRHUTA LETTER VOCALIC RR +11489 TIRHUTA LETTER VOCALIC L +1148A TIRHUTA LETTER VOCALIC LL +1148B TIRHUTA LETTER E +1148C TIRHUTA LETTER AI +1148D TIRHUTA LETTER O +1148E TIRHUTA LETTER AU +1148F TIRHUTA LETTER KA +11490 TIRHUTA LETTER KHA +11491 TIRHUTA LETTER GA +11492 TIRHUTA LETTER GHA +11493 TIRHUTA LETTER NGA +11494 TIRHUTA LETTER CA +11495 TIRHUTA LETTER CHA +11496 TIRHUTA LETTER JA +11497 TIRHUTA LETTER JHA +11498 TIRHUTA LETTER NYA +11499 TIRHUTA LETTER TTA +1149A TIRHUTA LETTER TTHA +1149B TIRHUTA LETTER DDA +1149C TIRHUTA LETTER DDHA +1149D TIRHUTA LETTER NNA +1149E TIRHUTA LETTER TA +1149F TIRHUTA LETTER THA +114A0 TIRHUTA LETTER DA +114A1 TIRHUTA LETTER DHA +114A2 TIRHUTA LETTER NA +114A3 TIRHUTA LETTER PA +114A4 TIRHUTA LETTER PHA +114A5 TIRHUTA LETTER BA +114A6 TIRHUTA LETTER BHA +114A7 TIRHUTA LETTER MA +114A8 TIRHUTA LETTER YA +114A9 TIRHUTA LETTER RA +114AA TIRHUTA LETTER LA +114AB TIRHUTA LETTER VA +114AC TIRHUTA LETTER SHA +114AD TIRHUTA LETTER SSA +114AE TIRHUTA LETTER SA +114AF TIRHUTA LETTER HA +114B0 TIRHUTA VOWEL SIGN AA +114B1 TIRHUTA VOWEL SIGN I +114B2 TIRHUTA VOWEL SIGN II +114B3 TIRHUTA VOWEL SIGN U +114B4 TIRHUTA VOWEL SIGN UU +114B5 TIRHUTA VOWEL SIGN VOCALIC R +114B6 TIRHUTA VOWEL SIGN VOCALIC RR +114B7 TIRHUTA VOWEL SIGN VOCALIC L +114B8 TIRHUTA VOWEL SIGN VOCALIC LL +114B9 TIRHUTA VOWEL SIGN E +114BA TIRHUTA VOWEL SIGN SHORT E +114BB TIRHUTA VOWEL SIGN AI +114BC TIRHUTA VOWEL SIGN O +114BD TIRHUTA VOWEL SIGN SHORT O +114BE TIRHUTA VOWEL SIGN AU +114BF TIRHUTA SIGN CANDRABINDU +114C0 TIRHUTA SIGN ANUSVARA +114C1 TIRHUTA SIGN VISARGA +114C2 TIRHUTA SIGN VIRAMA +114C3 TIRHUTA SIGN NUKTA +114C4 TIRHUTA SIGN AVAGRAHA +114C5 TIRHUTA GVANG +114C6 TIRHUTA ABBREVIATION SIGN +114C7 TIRHUTA OM +114D0 TIRHUTA DIGIT ZERO +114D1 TIRHUTA DIGIT ONE +114D2 TIRHUTA DIGIT TWO +114D3 TIRHUTA DIGIT THREE +114D4 TIRHUTA DIGIT FOUR +114D5 TIRHUTA DIGIT FIVE +114D6 TIRHUTA DIGIT SIX +114D7 TIRHUTA DIGIT SEVEN +114D8 TIRHUTA DIGIT EIGHT +114D9 TIRHUTA DIGIT NINE +11580 SIDDHAM LETTER A +11581 SIDDHAM LETTER AA +11582 SIDDHAM LETTER I +11583 SIDDHAM LETTER II +11584 SIDDHAM LETTER U +11585 SIDDHAM LETTER UU +11586 SIDDHAM LETTER VOCALIC R +11587 SIDDHAM LETTER VOCALIC RR +11588 SIDDHAM LETTER VOCALIC L +11589 SIDDHAM LETTER VOCALIC LL +1158A SIDDHAM LETTER E +1158B SIDDHAM LETTER AI +1158C SIDDHAM LETTER O +1158D SIDDHAM LETTER AU +1158E SIDDHAM LETTER KA +1158F SIDDHAM LETTER KHA +11590 SIDDHAM LETTER GA +11591 SIDDHAM LETTER GHA +11592 SIDDHAM LETTER NGA +11593 SIDDHAM LETTER CA +11594 SIDDHAM LETTER CHA +11595 SIDDHAM LETTER JA +11596 SIDDHAM LETTER JHA +11597 SIDDHAM LETTER NYA +11598 SIDDHAM LETTER TTA +11599 SIDDHAM LETTER TTHA +1159A SIDDHAM LETTER DDA +1159B SIDDHAM LETTER DDHA +1159C SIDDHAM LETTER NNA +1159D SIDDHAM LETTER TA +1159E SIDDHAM LETTER THA +1159F SIDDHAM LETTER DA +115A0 SIDDHAM LETTER DHA +115A1 SIDDHAM LETTER NA +115A2 SIDDHAM LETTER PA +115A3 SIDDHAM LETTER PHA +115A4 SIDDHAM LETTER BA +115A5 SIDDHAM LETTER BHA +115A6 SIDDHAM LETTER MA +115A7 SIDDHAM LETTER YA +115A8 SIDDHAM LETTER RA +115A9 SIDDHAM LETTER LA +115AA SIDDHAM LETTER VA +115AB SIDDHAM LETTER SHA +115AC SIDDHAM LETTER SSA +115AD SIDDHAM LETTER SA +115AE SIDDHAM LETTER HA +115AF SIDDHAM VOWEL SIGN AA +115B0 SIDDHAM VOWEL SIGN I +115B1 SIDDHAM VOWEL SIGN II +115B2 SIDDHAM VOWEL SIGN U +115B3 SIDDHAM VOWEL SIGN UU +115B4 SIDDHAM VOWEL SIGN VOCALIC R +115B5 SIDDHAM VOWEL SIGN VOCALIC RR +115B8 SIDDHAM VOWEL SIGN E +115B9 SIDDHAM VOWEL SIGN AI +115BA SIDDHAM VOWEL SIGN O +115BB SIDDHAM VOWEL SIGN AU +115BC SIDDHAM SIGN CANDRABINDU +115BD SIDDHAM SIGN ANUSVARA +115BE SIDDHAM SIGN VISARGA +115BF SIDDHAM SIGN VIRAMA +115C0 SIDDHAM SIGN NUKTA +115C1 SIDDHAM SIGN SIDDHAM +115C2 SIDDHAM DANDA +115C3 SIDDHAM DOUBLE DANDA +115C4 SIDDHAM SEPARATOR DOT +115C5 SIDDHAM SEPARATOR BAR +115C6 SIDDHAM REPETITION MARK-1 +115C7 SIDDHAM REPETITION MARK-2 +115C8 SIDDHAM REPETITION MARK-3 +115C9 SIDDHAM END OF TEXT MARK +115CA SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS +115CB SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS +115CC SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS +115CD SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS +115CE SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS +115CF SIDDHAM SECTION MARK DOUBLE RING +115D0 SIDDHAM SECTION MARK DOUBLE RING WITH RAYS +115D1 SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS +115D2 SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS +115D3 SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS +115D4 SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS +115D5 SIDDHAM SECTION MARK WITH CIRCLES AND RAYS +115D6 SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES +115D7 SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8 SIDDHAM LETTER THREE-CIRCLE ALTERNATE I +115D9 SIDDHAM LETTER TWO-CIRCLE ALTERNATE I +115DA SIDDHAM LETTER TWO-CIRCLE ALTERNATE II +115DB SIDDHAM LETTER ALTERNATE U +115DC SIDDHAM VOWEL SIGN ALTERNATE U +115DD SIDDHAM VOWEL SIGN ALTERNATE UU +11600 MODI LETTER A +11601 MODI LETTER AA +11602 MODI LETTER I +11603 MODI LETTER II +11604 MODI LETTER U +11605 MODI LETTER UU +11606 MODI LETTER VOCALIC R +11607 MODI LETTER VOCALIC RR +11608 MODI LETTER VOCALIC L +11609 MODI LETTER VOCALIC LL +1160A MODI LETTER E +1160B MODI LETTER AI +1160C MODI LETTER O +1160D MODI LETTER AU +1160E MODI LETTER KA +1160F MODI LETTER KHA +11610 MODI LETTER GA +11611 MODI LETTER GHA +11612 MODI LETTER NGA +11613 MODI LETTER CA +11614 MODI LETTER CHA +11615 MODI LETTER JA +11616 MODI LETTER JHA +11617 MODI LETTER NYA +11618 MODI LETTER TTA +11619 MODI LETTER TTHA +1161A MODI LETTER DDA +1161B MODI LETTER DDHA +1161C MODI LETTER NNA +1161D MODI LETTER TA +1161E MODI LETTER THA +1161F MODI LETTER DA +11620 MODI LETTER DHA +11621 MODI LETTER NA +11622 MODI LETTER PA +11623 MODI LETTER PHA +11624 MODI LETTER BA +11625 MODI LETTER BHA +11626 MODI LETTER MA +11627 MODI LETTER YA +11628 MODI LETTER RA +11629 MODI LETTER LA +1162A MODI LETTER VA +1162B MODI LETTER SHA +1162C MODI LETTER SSA +1162D MODI LETTER SA +1162E MODI LETTER HA +1162F MODI LETTER LLA +11630 MODI VOWEL SIGN AA +11631 MODI VOWEL SIGN I +11632 MODI VOWEL SIGN II +11633 MODI VOWEL SIGN U +11634 MODI VOWEL SIGN UU +11635 MODI VOWEL SIGN VOCALIC R +11636 MODI VOWEL SIGN VOCALIC RR +11637 MODI VOWEL SIGN VOCALIC L +11638 MODI VOWEL SIGN VOCALIC LL +11639 MODI VOWEL SIGN E +1163A MODI VOWEL SIGN AI +1163B MODI VOWEL SIGN O +1163C MODI VOWEL SIGN AU +1163D MODI SIGN ANUSVARA +1163E MODI SIGN VISARGA +1163F MODI SIGN VIRAMA +11640 MODI SIGN ARDHACANDRA +11641 MODI DANDA +11642 MODI DOUBLE DANDA +11643 MODI ABBREVIATION SIGN +11644 MODI SIGN HUVA +11650 MODI DIGIT ZERO +11651 MODI DIGIT ONE +11652 MODI DIGIT TWO +11653 MODI DIGIT THREE +11654 MODI DIGIT FOUR +11655 MODI DIGIT FIVE +11656 MODI DIGIT SIX +11657 MODI DIGIT SEVEN +11658 MODI DIGIT EIGHT +11659 MODI DIGIT NINE +11660 MONGOLIAN BIRGA WITH ORNAMENT +11661 MONGOLIAN ROTATED BIRGA +11662 MONGOLIAN DOUBLE BIRGA WITH ORNAMENT +11663 MONGOLIAN TRIPLE BIRGA WITH ORNAMENT +11664 MONGOLIAN BIRGA WITH DOUBLE ORNAMENT +11665 MONGOLIAN ROTATED BIRGA WITH ORNAMENT +11666 MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT +11667 MONGOLIAN INVERTED BIRGA +11668 MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT +11669 MONGOLIAN SWIRL BIRGA +1166A MONGOLIAN SWIRL BIRGA WITH ORNAMENT +1166B MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT +1166C MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11680 TAKRI LETTER A +11681 TAKRI LETTER AA +11682 TAKRI LETTER I +11683 TAKRI LETTER II +11684 TAKRI LETTER U +11685 TAKRI LETTER UU +11686 TAKRI LETTER E +11687 TAKRI LETTER AI +11688 TAKRI LETTER O +11689 TAKRI LETTER AU +1168A TAKRI LETTER KA +1168B TAKRI LETTER KHA +1168C TAKRI LETTER GA +1168D TAKRI LETTER GHA +1168E TAKRI LETTER NGA +1168F TAKRI LETTER CA +11690 TAKRI LETTER CHA +11691 TAKRI LETTER JA +11692 TAKRI LETTER JHA +11693 TAKRI LETTER NYA +11694 TAKRI LETTER TTA +11695 TAKRI LETTER TTHA +11696 TAKRI LETTER DDA +11697 TAKRI LETTER DDHA +11698 TAKRI LETTER NNA +11699 TAKRI LETTER TA +1169A TAKRI LETTER THA +1169B TAKRI LETTER DA +1169C TAKRI LETTER DHA +1169D TAKRI LETTER NA +1169E TAKRI LETTER PA +1169F TAKRI LETTER PHA +116A0 TAKRI LETTER BA +116A1 TAKRI LETTER BHA +116A2 TAKRI LETTER MA +116A3 TAKRI LETTER YA +116A4 TAKRI LETTER RA +116A5 TAKRI LETTER LA +116A6 TAKRI LETTER VA +116A7 TAKRI LETTER SHA +116A8 TAKRI LETTER SA +116A9 TAKRI LETTER HA +116AA TAKRI LETTER RRA +116AB TAKRI SIGN ANUSVARA +116AC TAKRI SIGN VISARGA +116AD TAKRI VOWEL SIGN AA +116AE TAKRI VOWEL SIGN I +116AF TAKRI VOWEL SIGN II +116B0 TAKRI VOWEL SIGN U +116B1 TAKRI VOWEL SIGN UU +116B2 TAKRI VOWEL SIGN E +116B3 TAKRI VOWEL SIGN AI +116B4 TAKRI VOWEL SIGN O +116B5 TAKRI VOWEL SIGN AU +116B6 TAKRI SIGN VIRAMA +116B7 TAKRI SIGN NUKTA +116C0 TAKRI DIGIT ZERO +116C1 TAKRI DIGIT ONE +116C2 TAKRI DIGIT TWO +116C3 TAKRI DIGIT THREE +116C4 TAKRI DIGIT FOUR +116C5 TAKRI DIGIT FIVE +116C6 TAKRI DIGIT SIX +116C7 TAKRI DIGIT SEVEN +116C8 TAKRI DIGIT EIGHT +116C9 TAKRI DIGIT NINE +11700 AHOM LETTER KA +11701 AHOM LETTER KHA +11702 AHOM LETTER NGA +11703 AHOM LETTER NA +11704 AHOM LETTER TA +11705 AHOM LETTER ALTERNATE TA +11706 AHOM LETTER PA +11707 AHOM LETTER PHA +11708 AHOM LETTER BA +11709 AHOM LETTER MA +1170A AHOM LETTER JA +1170B AHOM LETTER CHA +1170C AHOM LETTER THA +1170D AHOM LETTER RA +1170E AHOM LETTER LA +1170F AHOM LETTER SA +11710 AHOM LETTER NYA +11711 AHOM LETTER HA +11712 AHOM LETTER A +11713 AHOM LETTER DA +11714 AHOM LETTER DHA +11715 AHOM LETTER GA +11716 AHOM LETTER ALTERNATE GA +11717 AHOM LETTER GHA +11718 AHOM LETTER BHA +11719 AHOM LETTER JHA +1171D AHOM CONSONANT SIGN MEDIAL LA +1171E AHOM CONSONANT SIGN MEDIAL RA +1171F AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720 AHOM VOWEL SIGN A +11721 AHOM VOWEL SIGN AA +11722 AHOM VOWEL SIGN I +11723 AHOM VOWEL SIGN II +11724 AHOM VOWEL SIGN U +11725 AHOM VOWEL SIGN UU +11726 AHOM VOWEL SIGN E +11727 AHOM VOWEL SIGN AW +11728 AHOM VOWEL SIGN O +11729 AHOM VOWEL SIGN AI +1172A AHOM VOWEL SIGN AM +1172B AHOM SIGN KILLER +11730 AHOM DIGIT ZERO +11731 AHOM DIGIT ONE +11732 AHOM DIGIT TWO +11733 AHOM DIGIT THREE +11734 AHOM DIGIT FOUR +11735 AHOM DIGIT FIVE +11736 AHOM DIGIT SIX +11737 AHOM DIGIT SEVEN +11738 AHOM DIGIT EIGHT +11739 AHOM DIGIT NINE +1173A AHOM NUMBER TEN +1173B AHOM NUMBER TWENTY +1173C AHOM SIGN SMALL SECTION +1173D AHOM SIGN SECTION +1173E AHOM SIGN RULAI +1173F AHOM SYMBOL VI +118A0 WARANG CITI CAPITAL LETTER NGAA +118A1 WARANG CITI CAPITAL LETTER A +118A2 WARANG CITI CAPITAL LETTER WI +118A3 WARANG CITI CAPITAL LETTER YU +118A4 WARANG CITI CAPITAL LETTER YA +118A5 WARANG CITI CAPITAL LETTER YO +118A6 WARANG CITI CAPITAL LETTER II +118A7 WARANG CITI CAPITAL LETTER UU +118A8 WARANG CITI CAPITAL LETTER E +118A9 WARANG CITI CAPITAL LETTER O +118AA WARANG CITI CAPITAL LETTER ANG +118AB WARANG CITI CAPITAL LETTER GA +118AC WARANG CITI CAPITAL LETTER KO +118AD WARANG CITI CAPITAL LETTER ENY +118AE WARANG CITI CAPITAL LETTER YUJ +118AF WARANG CITI CAPITAL LETTER UC +118B0 WARANG CITI CAPITAL LETTER ENN +118B1 WARANG CITI CAPITAL LETTER ODD +118B2 WARANG CITI CAPITAL LETTER TTE +118B3 WARANG CITI CAPITAL LETTER NUNG +118B4 WARANG CITI CAPITAL LETTER DA +118B5 WARANG CITI CAPITAL LETTER AT +118B6 WARANG CITI CAPITAL LETTER AM +118B7 WARANG CITI CAPITAL LETTER BU +118B8 WARANG CITI CAPITAL LETTER PU +118B9 WARANG CITI CAPITAL LETTER HIYO +118BA WARANG CITI CAPITAL LETTER HOLO +118BB WARANG CITI CAPITAL LETTER HORR +118BC WARANG CITI CAPITAL LETTER HAR +118BD WARANG CITI CAPITAL LETTER SSUU +118BE WARANG CITI CAPITAL LETTER SII +118BF WARANG CITI CAPITAL LETTER VIYO +118C0 WARANG CITI SMALL LETTER NGAA +118C1 WARANG CITI SMALL LETTER A +118C2 WARANG CITI SMALL LETTER WI +118C3 WARANG CITI SMALL LETTER YU +118C4 WARANG CITI SMALL LETTER YA +118C5 WARANG CITI SMALL LETTER YO +118C6 WARANG CITI SMALL LETTER II +118C7 WARANG CITI SMALL LETTER UU +118C8 WARANG CITI SMALL LETTER E +118C9 WARANG CITI SMALL LETTER O +118CA WARANG CITI SMALL LETTER ANG +118CB WARANG CITI SMALL LETTER GA +118CC WARANG CITI SMALL LETTER KO +118CD WARANG CITI SMALL LETTER ENY +118CE WARANG CITI SMALL LETTER YUJ +118CF WARANG CITI SMALL LETTER UC +118D0 WARANG CITI SMALL LETTER ENN +118D1 WARANG CITI SMALL LETTER ODD +118D2 WARANG CITI SMALL LETTER TTE +118D3 WARANG CITI SMALL LETTER NUNG +118D4 WARANG CITI SMALL LETTER DA +118D5 WARANG CITI SMALL LETTER AT +118D6 WARANG CITI SMALL LETTER AM +118D7 WARANG CITI SMALL LETTER BU +118D8 WARANG CITI SMALL LETTER PU +118D9 WARANG CITI SMALL LETTER HIYO +118DA WARANG CITI SMALL LETTER HOLO +118DB WARANG CITI SMALL LETTER HORR +118DC WARANG CITI SMALL LETTER HAR +118DD WARANG CITI SMALL LETTER SSUU +118DE WARANG CITI SMALL LETTER SII +118DF WARANG CITI SMALL LETTER VIYO +118E0 WARANG CITI DIGIT ZERO +118E1 WARANG CITI DIGIT ONE +118E2 WARANG CITI DIGIT TWO +118E3 WARANG CITI DIGIT THREE +118E4 WARANG CITI DIGIT FOUR +118E5 WARANG CITI DIGIT FIVE +118E6 WARANG CITI DIGIT SIX +118E7 WARANG CITI DIGIT SEVEN +118E8 WARANG CITI DIGIT EIGHT +118E9 WARANG CITI DIGIT NINE +118EA WARANG CITI NUMBER TEN +118EB WARANG CITI NUMBER TWENTY +118EC WARANG CITI NUMBER THIRTY +118ED WARANG CITI NUMBER FORTY +118EE WARANG CITI NUMBER FIFTY +118EF WARANG CITI NUMBER SIXTY +118F0 WARANG CITI NUMBER SEVENTY +118F1 WARANG CITI NUMBER EIGHTY +118F2 WARANG CITI NUMBER NINETY +118FF WARANG CITI OM +11A00 ZANABAZAR SQUARE LETTER A +11A01 ZANABAZAR SQUARE VOWEL SIGN I +11A02 ZANABAZAR SQUARE VOWEL SIGN UE +11A03 ZANABAZAR SQUARE VOWEL SIGN U +11A04 ZANABAZAR SQUARE VOWEL SIGN E +11A05 ZANABAZAR SQUARE VOWEL SIGN OE +11A06 ZANABAZAR SQUARE VOWEL SIGN O +11A07 ZANABAZAR SQUARE VOWEL SIGN AI +11A08 ZANABAZAR SQUARE VOWEL SIGN AU +11A09 ZANABAZAR SQUARE VOWEL SIGN REVERSED I +11A0A ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B ZANABAZAR SQUARE LETTER KA +11A0C ZANABAZAR SQUARE LETTER KHA +11A0D ZANABAZAR SQUARE LETTER GA +11A0E ZANABAZAR SQUARE LETTER GHA +11A0F ZANABAZAR SQUARE LETTER NGA +11A10 ZANABAZAR SQUARE LETTER CA +11A11 ZANABAZAR SQUARE LETTER CHA +11A12 ZANABAZAR SQUARE LETTER JA +11A13 ZANABAZAR SQUARE LETTER NYA +11A14 ZANABAZAR SQUARE LETTER TTA +11A15 ZANABAZAR SQUARE LETTER TTHA +11A16 ZANABAZAR SQUARE LETTER DDA +11A17 ZANABAZAR SQUARE LETTER DDHA +11A18 ZANABAZAR SQUARE LETTER NNA +11A19 ZANABAZAR SQUARE LETTER TA +11A1A ZANABAZAR SQUARE LETTER THA +11A1B ZANABAZAR SQUARE LETTER DA +11A1C ZANABAZAR SQUARE LETTER DHA +11A1D ZANABAZAR SQUARE LETTER NA +11A1E ZANABAZAR SQUARE LETTER PA +11A1F ZANABAZAR SQUARE LETTER PHA +11A20 ZANABAZAR SQUARE LETTER BA +11A21 ZANABAZAR SQUARE LETTER BHA +11A22 ZANABAZAR SQUARE LETTER MA +11A23 ZANABAZAR SQUARE LETTER TSA +11A24 ZANABAZAR SQUARE LETTER TSHA +11A25 ZANABAZAR SQUARE LETTER DZA +11A26 ZANABAZAR SQUARE LETTER DZHA +11A27 ZANABAZAR SQUARE LETTER ZHA +11A28 ZANABAZAR SQUARE LETTER ZA +11A29 ZANABAZAR SQUARE LETTER -A +11A2A ZANABAZAR SQUARE LETTER YA +11A2B ZANABAZAR SQUARE LETTER RA +11A2C ZANABAZAR SQUARE LETTER LA +11A2D ZANABAZAR SQUARE LETTER VA +11A2E ZANABAZAR SQUARE LETTER SHA +11A2F ZANABAZAR SQUARE LETTER SSA +11A30 ZANABAZAR SQUARE LETTER SA +11A31 ZANABAZAR SQUARE LETTER HA +11A32 ZANABAZAR SQUARE LETTER KSSA +11A33 ZANABAZAR SQUARE FINAL CONSONANT MARK +11A34 ZANABAZAR SQUARE SIGN VIRAMA +11A35 ZANABAZAR SQUARE SIGN CANDRABINDU +11A36 ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT +11A37 ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT +11A38 ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ZANABAZAR SQUARE SIGN VISARGA +11A3A ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA +11A3C ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA +11A3D ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA +11A3E ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F ZANABAZAR SQUARE INITIAL HEAD MARK +11A40 ZANABAZAR SQUARE CLOSING HEAD MARK +11A41 ZANABAZAR SQUARE MARK TSHEG +11A42 ZANABAZAR SQUARE MARK SHAD +11A43 ZANABAZAR SQUARE MARK DOUBLE SHAD +11A44 ZANABAZAR SQUARE MARK LONG TSHEG +11A45 ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK +11A46 ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ZANABAZAR SQUARE SUBJOINER +11A50 SOYOMBO LETTER A +11A51 SOYOMBO VOWEL SIGN I +11A52 SOYOMBO VOWEL SIGN UE +11A53 SOYOMBO VOWEL SIGN U +11A54 SOYOMBO VOWEL SIGN E +11A55 SOYOMBO VOWEL SIGN O +11A56 SOYOMBO VOWEL SIGN OE +11A57 SOYOMBO VOWEL SIGN AI +11A58 SOYOMBO VOWEL SIGN AU +11A59 SOYOMBO VOWEL SIGN VOCALIC R +11A5A SOYOMBO VOWEL SIGN VOCALIC L +11A5B SOYOMBO VOWEL LENGTH MARK +11A5C SOYOMBO LETTER KA +11A5D SOYOMBO LETTER KHA +11A5E SOYOMBO LETTER GA +11A5F SOYOMBO LETTER GHA +11A60 SOYOMBO LETTER NGA +11A61 SOYOMBO LETTER CA +11A62 SOYOMBO LETTER CHA +11A63 SOYOMBO LETTER JA +11A64 SOYOMBO LETTER JHA +11A65 SOYOMBO LETTER NYA +11A66 SOYOMBO LETTER TTA +11A67 SOYOMBO LETTER TTHA +11A68 SOYOMBO LETTER DDA +11A69 SOYOMBO LETTER DDHA +11A6A SOYOMBO LETTER NNA +11A6B SOYOMBO LETTER TA +11A6C SOYOMBO LETTER THA +11A6D SOYOMBO LETTER DA +11A6E SOYOMBO LETTER DHA +11A6F SOYOMBO LETTER NA +11A70 SOYOMBO LETTER PA +11A71 SOYOMBO LETTER PHA +11A72 SOYOMBO LETTER BA +11A73 SOYOMBO LETTER BHA +11A74 SOYOMBO LETTER MA +11A75 SOYOMBO LETTER TSA +11A76 SOYOMBO LETTER TSHA +11A77 SOYOMBO LETTER DZA +11A78 SOYOMBO LETTER ZHA +11A79 SOYOMBO LETTER ZA +11A7A SOYOMBO LETTER -A +11A7B SOYOMBO LETTER YA +11A7C SOYOMBO LETTER RA +11A7D SOYOMBO LETTER LA +11A7E SOYOMBO LETTER VA +11A7F SOYOMBO LETTER SHA +11A80 SOYOMBO LETTER SSA +11A81 SOYOMBO LETTER SA +11A82 SOYOMBO LETTER HA +11A83 SOYOMBO LETTER KSSA +11A86 SOYOMBO CLUSTER-INITIAL LETTER RA +11A87 SOYOMBO CLUSTER-INITIAL LETTER LA +11A88 SOYOMBO CLUSTER-INITIAL LETTER SHA +11A89 SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A SOYOMBO FINAL CONSONANT SIGN G +11A8B SOYOMBO FINAL CONSONANT SIGN K +11A8C SOYOMBO FINAL CONSONANT SIGN NG +11A8D SOYOMBO FINAL CONSONANT SIGN D +11A8E SOYOMBO FINAL CONSONANT SIGN N +11A8F SOYOMBO FINAL CONSONANT SIGN B +11A90 SOYOMBO FINAL CONSONANT SIGN M +11A91 SOYOMBO FINAL CONSONANT SIGN R +11A92 SOYOMBO FINAL CONSONANT SIGN L +11A93 SOYOMBO FINAL CONSONANT SIGN SH +11A94 SOYOMBO FINAL CONSONANT SIGN S +11A95 SOYOMBO FINAL CONSONANT SIGN -A +11A96 SOYOMBO SIGN ANUSVARA +11A97 SOYOMBO SIGN VISARGA +11A98 SOYOMBO GEMINATION MARK +11A99 SOYOMBO SUBJOINER +11A9A SOYOMBO MARK TSHEG +11A9B SOYOMBO MARK SHAD +11A9C SOYOMBO MARK DOUBLE SHAD +11A9E SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME +11A9F SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME +11AA0 SOYOMBO HEAD MARK WITH MOON AND SUN +11AA1 SOYOMBO TERMINAL MARK-1 +11AA2 SOYOMBO TERMINAL MARK-2 +11AC0 PAU CIN HAU LETTER PA +11AC1 PAU CIN HAU LETTER KA +11AC2 PAU CIN HAU LETTER LA +11AC3 PAU CIN HAU LETTER MA +11AC4 PAU CIN HAU LETTER DA +11AC5 PAU CIN HAU LETTER ZA +11AC6 PAU CIN HAU LETTER VA +11AC7 PAU CIN HAU LETTER NGA +11AC8 PAU CIN HAU LETTER HA +11AC9 PAU CIN HAU LETTER GA +11ACA PAU CIN HAU LETTER KHA +11ACB PAU CIN HAU LETTER SA +11ACC PAU CIN HAU LETTER BA +11ACD PAU CIN HAU LETTER CA +11ACE PAU CIN HAU LETTER TA +11ACF PAU CIN HAU LETTER THA +11AD0 PAU CIN HAU LETTER NA +11AD1 PAU CIN HAU LETTER PHA +11AD2 PAU CIN HAU LETTER RA +11AD3 PAU CIN HAU LETTER FA +11AD4 PAU CIN HAU LETTER CHA +11AD5 PAU CIN HAU LETTER A +11AD6 PAU CIN HAU LETTER E +11AD7 PAU CIN HAU LETTER I +11AD8 PAU CIN HAU LETTER O +11AD9 PAU CIN HAU LETTER U +11ADA PAU CIN HAU LETTER UA +11ADB PAU CIN HAU LETTER IA +11ADC PAU CIN HAU LETTER FINAL P +11ADD PAU CIN HAU LETTER FINAL K +11ADE PAU CIN HAU LETTER FINAL T +11ADF PAU CIN HAU LETTER FINAL M +11AE0 PAU CIN HAU LETTER FINAL N +11AE1 PAU CIN HAU LETTER FINAL L +11AE2 PAU CIN HAU LETTER FINAL W +11AE3 PAU CIN HAU LETTER FINAL NG +11AE4 PAU CIN HAU LETTER FINAL Y +11AE5 PAU CIN HAU RISING TONE LONG +11AE6 PAU CIN HAU RISING TONE +11AE7 PAU CIN HAU SANDHI GLOTTAL STOP +11AE8 PAU CIN HAU RISING TONE LONG FINAL +11AE9 PAU CIN HAU RISING TONE FINAL +11AEA PAU CIN HAU SANDHI GLOTTAL STOP FINAL +11AEB PAU CIN HAU SANDHI TONE LONG +11AEC PAU CIN HAU SANDHI TONE +11AED PAU CIN HAU SANDHI TONE LONG FINAL +11AEE PAU CIN HAU SANDHI TONE FINAL +11AEF PAU CIN HAU MID-LEVEL TONE +11AF0 PAU CIN HAU GLOTTAL STOP VARIANT +11AF1 PAU CIN HAU MID-LEVEL TONE LONG FINAL +11AF2 PAU CIN HAU MID-LEVEL TONE FINAL +11AF3 PAU CIN HAU LOW-FALLING TONE LONG +11AF4 PAU CIN HAU LOW-FALLING TONE +11AF5 PAU CIN HAU GLOTTAL STOP +11AF6 PAU CIN HAU LOW-FALLING TONE LONG FINAL +11AF7 PAU CIN HAU LOW-FALLING TONE FINAL +11AF8 PAU CIN HAU GLOTTAL STOP FINAL +11C00 BHAIKSUKI LETTER A +11C01 BHAIKSUKI LETTER AA +11C02 BHAIKSUKI LETTER I +11C03 BHAIKSUKI LETTER II +11C04 BHAIKSUKI LETTER U +11C05 BHAIKSUKI LETTER UU +11C06 BHAIKSUKI LETTER VOCALIC R +11C07 BHAIKSUKI LETTER VOCALIC RR +11C08 BHAIKSUKI LETTER VOCALIC L +11C0A BHAIKSUKI LETTER E +11C0B BHAIKSUKI LETTER AI +11C0C BHAIKSUKI LETTER O +11C0D BHAIKSUKI LETTER AU +11C0E BHAIKSUKI LETTER KA +11C0F BHAIKSUKI LETTER KHA +11C10 BHAIKSUKI LETTER GA +11C11 BHAIKSUKI LETTER GHA +11C12 BHAIKSUKI LETTER NGA +11C13 BHAIKSUKI LETTER CA +11C14 BHAIKSUKI LETTER CHA +11C15 BHAIKSUKI LETTER JA +11C16 BHAIKSUKI LETTER JHA +11C17 BHAIKSUKI LETTER NYA +11C18 BHAIKSUKI LETTER TTA +11C19 BHAIKSUKI LETTER TTHA +11C1A BHAIKSUKI LETTER DDA +11C1B BHAIKSUKI LETTER DDHA +11C1C BHAIKSUKI LETTER NNA +11C1D BHAIKSUKI LETTER TA +11C1E BHAIKSUKI LETTER THA +11C1F BHAIKSUKI LETTER DA +11C20 BHAIKSUKI LETTER DHA +11C21 BHAIKSUKI LETTER NA +11C22 BHAIKSUKI LETTER PA +11C23 BHAIKSUKI LETTER PHA +11C24 BHAIKSUKI LETTER BA +11C25 BHAIKSUKI LETTER BHA +11C26 BHAIKSUKI LETTER MA +11C27 BHAIKSUKI LETTER YA +11C28 BHAIKSUKI LETTER RA +11C29 BHAIKSUKI LETTER LA +11C2A BHAIKSUKI LETTER VA +11C2B BHAIKSUKI LETTER SHA +11C2C BHAIKSUKI LETTER SSA +11C2D BHAIKSUKI LETTER SA +11C2E BHAIKSUKI LETTER HA +11C2F BHAIKSUKI VOWEL SIGN AA +11C30 BHAIKSUKI VOWEL SIGN I +11C31 BHAIKSUKI VOWEL SIGN II +11C32 BHAIKSUKI VOWEL SIGN U +11C33 BHAIKSUKI VOWEL SIGN UU +11C34 BHAIKSUKI VOWEL SIGN VOCALIC R +11C35 BHAIKSUKI VOWEL SIGN VOCALIC RR +11C36 BHAIKSUKI VOWEL SIGN VOCALIC L +11C38 BHAIKSUKI VOWEL SIGN E +11C39 BHAIKSUKI VOWEL SIGN AI +11C3A BHAIKSUKI VOWEL SIGN O +11C3B BHAIKSUKI VOWEL SIGN AU +11C3C BHAIKSUKI SIGN CANDRABINDU +11C3D BHAIKSUKI SIGN ANUSVARA +11C3E BHAIKSUKI SIGN VISARGA +11C3F BHAIKSUKI SIGN VIRAMA +11C40 BHAIKSUKI SIGN AVAGRAHA +11C41 BHAIKSUKI DANDA +11C42 BHAIKSUKI DOUBLE DANDA +11C43 BHAIKSUKI WORD SEPARATOR +11C44 BHAIKSUKI GAP FILLER-1 +11C45 BHAIKSUKI GAP FILLER-2 +11C50 BHAIKSUKI DIGIT ZERO +11C51 BHAIKSUKI DIGIT ONE +11C52 BHAIKSUKI DIGIT TWO +11C53 BHAIKSUKI DIGIT THREE +11C54 BHAIKSUKI DIGIT FOUR +11C55 BHAIKSUKI DIGIT FIVE +11C56 BHAIKSUKI DIGIT SIX +11C57 BHAIKSUKI DIGIT SEVEN +11C58 BHAIKSUKI DIGIT EIGHT +11C59 BHAIKSUKI DIGIT NINE +11C5A BHAIKSUKI NUMBER ONE +11C5B BHAIKSUKI NUMBER TWO +11C5C BHAIKSUKI NUMBER THREE +11C5D BHAIKSUKI NUMBER FOUR +11C5E BHAIKSUKI NUMBER FIVE +11C5F BHAIKSUKI NUMBER SIX +11C60 BHAIKSUKI NUMBER SEVEN +11C61 BHAIKSUKI NUMBER EIGHT +11C62 BHAIKSUKI NUMBER NINE +11C63 BHAIKSUKI NUMBER TEN +11C64 BHAIKSUKI NUMBER TWENTY +11C65 BHAIKSUKI NUMBER THIRTY +11C66 BHAIKSUKI NUMBER FORTY +11C67 BHAIKSUKI NUMBER FIFTY +11C68 BHAIKSUKI NUMBER SIXTY +11C69 BHAIKSUKI NUMBER SEVENTY +11C6A BHAIKSUKI NUMBER EIGHTY +11C6B BHAIKSUKI NUMBER NINETY +11C6C BHAIKSUKI HUNDREDS UNIT MARK +11C70 MARCHEN HEAD MARK +11C71 MARCHEN MARK SHAD +11C72 MARCHEN LETTER KA +11C73 MARCHEN LETTER KHA +11C74 MARCHEN LETTER GA +11C75 MARCHEN LETTER NGA +11C76 MARCHEN LETTER CA +11C77 MARCHEN LETTER CHA +11C78 MARCHEN LETTER JA +11C79 MARCHEN LETTER NYA +11C7A MARCHEN LETTER TA +11C7B MARCHEN LETTER THA +11C7C MARCHEN LETTER DA +11C7D MARCHEN LETTER NA +11C7E MARCHEN LETTER PA +11C7F MARCHEN LETTER PHA +11C80 MARCHEN LETTER BA +11C81 MARCHEN LETTER MA +11C82 MARCHEN LETTER TSA +11C83 MARCHEN LETTER TSHA +11C84 MARCHEN LETTER DZA +11C85 MARCHEN LETTER WA +11C86 MARCHEN LETTER ZHA +11C87 MARCHEN LETTER ZA +11C88 MARCHEN LETTER -A +11C89 MARCHEN LETTER YA +11C8A MARCHEN LETTER RA +11C8B MARCHEN LETTER LA +11C8C MARCHEN LETTER SHA +11C8D MARCHEN LETTER SA +11C8E MARCHEN LETTER HA +11C8F MARCHEN LETTER A +11C92 MARCHEN SUBJOINED LETTER KA +11C93 MARCHEN SUBJOINED LETTER KHA +11C94 MARCHEN SUBJOINED LETTER GA +11C95 MARCHEN SUBJOINED LETTER NGA +11C96 MARCHEN SUBJOINED LETTER CA +11C97 MARCHEN SUBJOINED LETTER CHA +11C98 MARCHEN SUBJOINED LETTER JA +11C99 MARCHEN SUBJOINED LETTER NYA +11C9A MARCHEN SUBJOINED LETTER TA +11C9B MARCHEN SUBJOINED LETTER THA +11C9C MARCHEN SUBJOINED LETTER DA +11C9D MARCHEN SUBJOINED LETTER NA +11C9E MARCHEN SUBJOINED LETTER PA +11C9F MARCHEN SUBJOINED LETTER PHA +11CA0 MARCHEN SUBJOINED LETTER BA +11CA1 MARCHEN SUBJOINED LETTER MA +11CA2 MARCHEN SUBJOINED LETTER TSA +11CA3 MARCHEN SUBJOINED LETTER TSHA +11CA4 MARCHEN SUBJOINED LETTER DZA +11CA5 MARCHEN SUBJOINED LETTER WA +11CA6 MARCHEN SUBJOINED LETTER ZHA +11CA7 MARCHEN SUBJOINED LETTER ZA +11CA9 MARCHEN SUBJOINED LETTER YA +11CAA MARCHEN SUBJOINED LETTER RA +11CAB MARCHEN SUBJOINED LETTER LA +11CAC MARCHEN SUBJOINED LETTER SHA +11CAD MARCHEN SUBJOINED LETTER SA +11CAE MARCHEN SUBJOINED LETTER HA +11CAF MARCHEN SUBJOINED LETTER A +11CB0 MARCHEN VOWEL SIGN AA +11CB1 MARCHEN VOWEL SIGN I +11CB2 MARCHEN VOWEL SIGN U +11CB3 MARCHEN VOWEL SIGN E +11CB4 MARCHEN VOWEL SIGN O +11CB5 MARCHEN SIGN ANUSVARA +11CB6 MARCHEN SIGN CANDRABINDU +11D00 MASARAM GONDI LETTER A +11D01 MASARAM GONDI LETTER AA +11D02 MASARAM GONDI LETTER I +11D03 MASARAM GONDI LETTER II +11D04 MASARAM GONDI LETTER U +11D05 MASARAM GONDI LETTER UU +11D06 MASARAM GONDI LETTER E +11D08 MASARAM GONDI LETTER AI +11D09 MASARAM GONDI LETTER O +11D0B MASARAM GONDI LETTER AU +11D0C MASARAM GONDI LETTER KA +11D0D MASARAM GONDI LETTER KHA +11D0E MASARAM GONDI LETTER GA +11D0F MASARAM GONDI LETTER GHA +11D10 MASARAM GONDI LETTER NGA +11D11 MASARAM GONDI LETTER CA +11D12 MASARAM GONDI LETTER CHA +11D13 MASARAM GONDI LETTER JA +11D14 MASARAM GONDI LETTER JHA +11D15 MASARAM GONDI LETTER NYA +11D16 MASARAM GONDI LETTER TTA +11D17 MASARAM GONDI LETTER TTHA +11D18 MASARAM GONDI LETTER DDA +11D19 MASARAM GONDI LETTER DDHA +11D1A MASARAM GONDI LETTER NNA +11D1B MASARAM GONDI LETTER TA +11D1C MASARAM GONDI LETTER THA +11D1D MASARAM GONDI LETTER DA +11D1E MASARAM GONDI LETTER DHA +11D1F MASARAM GONDI LETTER NA +11D20 MASARAM GONDI LETTER PA +11D21 MASARAM GONDI LETTER PHA +11D22 MASARAM GONDI LETTER BA +11D23 MASARAM GONDI LETTER BHA +11D24 MASARAM GONDI LETTER MA +11D25 MASARAM GONDI LETTER YA +11D26 MASARAM GONDI LETTER RA +11D27 MASARAM GONDI LETTER LA +11D28 MASARAM GONDI LETTER VA +11D29 MASARAM GONDI LETTER SHA +11D2A MASARAM GONDI LETTER SSA +11D2B MASARAM GONDI LETTER SA +11D2C MASARAM GONDI LETTER HA +11D2D MASARAM GONDI LETTER LLA +11D2E MASARAM GONDI LETTER KSSA +11D2F MASARAM GONDI LETTER JNYA +11D30 MASARAM GONDI LETTER TRA +11D31 MASARAM GONDI VOWEL SIGN AA +11D32 MASARAM GONDI VOWEL SIGN I +11D33 MASARAM GONDI VOWEL SIGN II +11D34 MASARAM GONDI VOWEL SIGN U +11D35 MASARAM GONDI VOWEL SIGN UU +11D36 MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A MASARAM GONDI VOWEL SIGN E +11D3C MASARAM GONDI VOWEL SIGN AI +11D3D MASARAM GONDI VOWEL SIGN O +11D3F MASARAM GONDI VOWEL SIGN AU +11D40 MASARAM GONDI SIGN ANUSVARA +11D41 MASARAM GONDI SIGN VISARGA +11D42 MASARAM GONDI SIGN NUKTA +11D43 MASARAM GONDI SIGN CANDRA +11D44 MASARAM GONDI SIGN HALANTA +11D45 MASARAM GONDI VIRAMA +11D46 MASARAM GONDI REPHA +11D47 MASARAM GONDI RA-KARA +11D50 MASARAM GONDI DIGIT ZERO +11D51 MASARAM GONDI DIGIT ONE +11D52 MASARAM GONDI DIGIT TWO +11D53 MASARAM GONDI DIGIT THREE +11D54 MASARAM GONDI DIGIT FOUR +11D55 MASARAM GONDI DIGIT FIVE +11D56 MASARAM GONDI DIGIT SIX +11D57 MASARAM GONDI DIGIT SEVEN +11D58 MASARAM GONDI DIGIT EIGHT +11D59 MASARAM GONDI DIGIT NINE +12000 CUNEIFORM SIGN A +12001 CUNEIFORM SIGN A TIMES A +12002 CUNEIFORM SIGN A TIMES BAD +12003 CUNEIFORM SIGN A TIMES GAN2 TENU +12004 CUNEIFORM SIGN A TIMES HA +12005 CUNEIFORM SIGN A TIMES IGI +12006 CUNEIFORM SIGN A TIMES LAGAR GUNU +12007 CUNEIFORM SIGN A TIMES MUSH +12008 CUNEIFORM SIGN A TIMES SAG +12009 CUNEIFORM SIGN A2 +1200A CUNEIFORM SIGN AB +1200B CUNEIFORM SIGN AB TIMES ASH2 +1200C CUNEIFORM SIGN AB TIMES DUN3 GUNU +1200D CUNEIFORM SIGN AB TIMES GAL +1200E CUNEIFORM SIGN AB TIMES GAN2 TENU +1200F CUNEIFORM SIGN AB TIMES HA +12010 CUNEIFORM SIGN AB TIMES IGI GUNU +12011 CUNEIFORM SIGN AB TIMES IMIN +12012 CUNEIFORM SIGN AB TIMES LAGAB +12013 CUNEIFORM SIGN AB TIMES SHESH +12014 CUNEIFORM SIGN AB TIMES U PLUS U PLUS U +12015 CUNEIFORM SIGN AB GUNU +12016 CUNEIFORM SIGN AB2 +12017 CUNEIFORM SIGN AB2 TIMES BALAG +12018 CUNEIFORM SIGN AB2 TIMES GAN2 TENU +12019 CUNEIFORM SIGN AB2 TIMES ME PLUS EN +1201A CUNEIFORM SIGN AB2 TIMES SHA3 +1201B CUNEIFORM SIGN AB2 TIMES TAK4 +1201C CUNEIFORM SIGN AD +1201D CUNEIFORM SIGN AK +1201E CUNEIFORM SIGN AK TIMES ERIN2 +1201F CUNEIFORM SIGN AK TIMES SHITA PLUS GISH +12020 CUNEIFORM SIGN AL +12021 CUNEIFORM SIGN AL TIMES AL +12022 CUNEIFORM SIGN AL TIMES DIM2 +12023 CUNEIFORM SIGN AL TIMES GISH +12024 CUNEIFORM SIGN AL TIMES HA +12025 CUNEIFORM SIGN AL TIMES KAD3 +12026 CUNEIFORM SIGN AL TIMES KI +12027 CUNEIFORM SIGN AL TIMES SHE +12028 CUNEIFORM SIGN AL TIMES USH +12029 CUNEIFORM SIGN ALAN +1202A CUNEIFORM SIGN ALEPH +1202B CUNEIFORM SIGN AMAR +1202C CUNEIFORM SIGN AMAR TIMES SHE +1202D CUNEIFORM SIGN AN +1202E CUNEIFORM SIGN AN OVER AN +1202F CUNEIFORM SIGN AN THREE TIMES +12030 CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA +12031 CUNEIFORM SIGN AN PLUS NAGA SQUARED +12032 CUNEIFORM SIGN ANSHE +12033 CUNEIFORM SIGN APIN +12034 CUNEIFORM SIGN ARAD +12035 CUNEIFORM SIGN ARAD TIMES KUR +12036 CUNEIFORM SIGN ARKAB +12037 CUNEIFORM SIGN ASAL2 +12038 CUNEIFORM SIGN ASH +12039 CUNEIFORM SIGN ASH ZIDA TENU +1203A CUNEIFORM SIGN ASH KABA TENU +1203B CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP +1203C CUNEIFORM SIGN ASH OVER ASH OVER ASH +1203D CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH +1203E CUNEIFORM SIGN ASH2 +1203F CUNEIFORM SIGN ASHGAB +12040 CUNEIFORM SIGN BA +12041 CUNEIFORM SIGN BAD +12042 CUNEIFORM SIGN BAG3 +12043 CUNEIFORM SIGN BAHAR2 +12044 CUNEIFORM SIGN BAL +12045 CUNEIFORM SIGN BAL OVER BAL +12046 CUNEIFORM SIGN BALAG +12047 CUNEIFORM SIGN BAR +12048 CUNEIFORM SIGN BARA2 +12049 CUNEIFORM SIGN BI +1204A CUNEIFORM SIGN BI TIMES A +1204B CUNEIFORM SIGN BI TIMES GAR +1204C CUNEIFORM SIGN BI TIMES IGI GUNU +1204D CUNEIFORM SIGN BU +1204E CUNEIFORM SIGN BU OVER BU AB +1204F CUNEIFORM SIGN BU OVER BU UN +12050 CUNEIFORM SIGN BU CROSSING BU +12051 CUNEIFORM SIGN BULUG +12052 CUNEIFORM SIGN BULUG OVER BULUG +12053 CUNEIFORM SIGN BUR +12054 CUNEIFORM SIGN BUR2 +12055 CUNEIFORM SIGN DA +12056 CUNEIFORM SIGN DAG +12057 CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH +12058 CUNEIFORM SIGN DAG KISIM5 TIMES AMAR +12059 CUNEIFORM SIGN DAG KISIM5 TIMES BALAG +1205A CUNEIFORM SIGN DAG KISIM5 TIMES BI +1205B CUNEIFORM SIGN DAG KISIM5 TIMES GA +1205C CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH +1205D CUNEIFORM SIGN DAG KISIM5 TIMES GI +1205E CUNEIFORM SIGN DAG KISIM5 TIMES GIR2 +1205F CUNEIFORM SIGN DAG KISIM5 TIMES GUD +12060 CUNEIFORM SIGN DAG KISIM5 TIMES HA +12061 CUNEIFORM SIGN DAG KISIM5 TIMES IR +12062 CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU +12063 CUNEIFORM SIGN DAG KISIM5 TIMES KAK +12064 CUNEIFORM SIGN DAG KISIM5 TIMES LA +12065 CUNEIFORM SIGN DAG KISIM5 TIMES LU +12066 CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2 +12067 CUNEIFORM SIGN DAG KISIM5 TIMES LUM +12068 CUNEIFORM SIGN DAG KISIM5 TIMES NE +12069 CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP +1206A CUNEIFORM SIGN DAG KISIM5 TIMES SI +1206B CUNEIFORM SIGN DAG KISIM5 TIMES TAK4 +1206C CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2 +1206D CUNEIFORM SIGN DAG KISIM5 TIMES USH +1206E CUNEIFORM SIGN DAM +1206F CUNEIFORM SIGN DAR +12070 CUNEIFORM SIGN DARA3 +12071 CUNEIFORM SIGN DARA4 +12072 CUNEIFORM SIGN DI +12073 CUNEIFORM SIGN DIB +12074 CUNEIFORM SIGN DIM +12075 CUNEIFORM SIGN DIM TIMES SHE +12076 CUNEIFORM SIGN DIM2 +12077 CUNEIFORM SIGN DIN +12078 CUNEIFORM SIGN DIN KASKAL U GUNU DISH +12079 CUNEIFORM SIGN DISH +1207A CUNEIFORM SIGN DU +1207B CUNEIFORM SIGN DU OVER DU +1207C CUNEIFORM SIGN DU GUNU +1207D CUNEIFORM SIGN DU SHESHIG +1207E CUNEIFORM SIGN DUB +1207F CUNEIFORM SIGN DUB TIMES ESH2 +12080 CUNEIFORM SIGN DUB2 +12081 CUNEIFORM SIGN DUG +12082 CUNEIFORM SIGN DUGUD +12083 CUNEIFORM SIGN DUH +12084 CUNEIFORM SIGN DUN +12085 CUNEIFORM SIGN DUN3 +12086 CUNEIFORM SIGN DUN3 GUNU +12087 CUNEIFORM SIGN DUN3 GUNU GUNU +12088 CUNEIFORM SIGN DUN4 +12089 CUNEIFORM SIGN DUR2 +1208A CUNEIFORM SIGN E +1208B CUNEIFORM SIGN E TIMES PAP +1208C CUNEIFORM SIGN E OVER E NUN OVER NUN +1208D CUNEIFORM SIGN E2 +1208E CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA +1208F CUNEIFORM SIGN E2 TIMES GAR +12090 CUNEIFORM SIGN E2 TIMES MI +12091 CUNEIFORM SIGN E2 TIMES SAL +12092 CUNEIFORM SIGN E2 TIMES SHE +12093 CUNEIFORM SIGN E2 TIMES U +12094 CUNEIFORM SIGN EDIN +12095 CUNEIFORM SIGN EGIR +12096 CUNEIFORM SIGN EL +12097 CUNEIFORM SIGN EN +12098 CUNEIFORM SIGN EN TIMES GAN2 +12099 CUNEIFORM SIGN EN TIMES GAN2 TENU +1209A CUNEIFORM SIGN EN TIMES ME +1209B CUNEIFORM SIGN EN CROSSING EN +1209C CUNEIFORM SIGN EN OPPOSING EN +1209D CUNEIFORM SIGN EN SQUARED +1209E CUNEIFORM SIGN EREN +1209F CUNEIFORM SIGN ERIN2 +120A0 CUNEIFORM SIGN ESH2 +120A1 CUNEIFORM SIGN EZEN +120A2 CUNEIFORM SIGN EZEN TIMES A +120A3 CUNEIFORM SIGN EZEN TIMES A PLUS LAL +120A4 CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL +120A5 CUNEIFORM SIGN EZEN TIMES AN +120A6 CUNEIFORM SIGN EZEN TIMES BAD +120A7 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU +120A8 CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU +120A9 CUNEIFORM SIGN EZEN TIMES HA +120AA CUNEIFORM SIGN EZEN TIMES HA GUNU +120AB CUNEIFORM SIGN EZEN TIMES IGI GUNU +120AC CUNEIFORM SIGN EZEN TIMES KASKAL +120AD CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED +120AE CUNEIFORM SIGN EZEN TIMES KU3 +120AF CUNEIFORM SIGN EZEN TIMES LA +120B0 CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL +120B1 CUNEIFORM SIGN EZEN TIMES LI +120B2 CUNEIFORM SIGN EZEN TIMES LU +120B3 CUNEIFORM SIGN EZEN TIMES U2 +120B4 CUNEIFORM SIGN EZEN TIMES UD +120B5 CUNEIFORM SIGN GA +120B6 CUNEIFORM SIGN GA GUNU +120B7 CUNEIFORM SIGN GA2 +120B8 CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA +120B9 CUNEIFORM SIGN GA2 TIMES A PLUS HA +120BA CUNEIFORM SIGN GA2 TIMES A PLUS IGI +120BB CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB +120BC CUNEIFORM SIGN GA2 TIMES AN +120BD CUNEIFORM SIGN GA2 TIMES ASH +120BE CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL +120BF CUNEIFORM SIGN GA2 TIMES BAD +120C0 CUNEIFORM SIGN GA2 TIMES BAR PLUS RA +120C1 CUNEIFORM SIGN GA2 TIMES BUR +120C2 CUNEIFORM SIGN GA2 TIMES BUR PLUS RA +120C3 CUNEIFORM SIGN GA2 TIMES DA +120C4 CUNEIFORM SIGN GA2 TIMES DI +120C5 CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE +120C6 CUNEIFORM SIGN GA2 TIMES DUB +120C7 CUNEIFORM SIGN GA2 TIMES EL +120C8 CUNEIFORM SIGN GA2 TIMES EL PLUS LA +120C9 CUNEIFORM SIGN GA2 TIMES EN +120CA CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU +120CB CUNEIFORM SIGN GA2 TIMES GAN2 TENU +120CC CUNEIFORM SIGN GA2 TIMES GAR +120CD CUNEIFORM SIGN GA2 TIMES GI +120CE CUNEIFORM SIGN GA2 TIMES GI4 +120CF CUNEIFORM SIGN GA2 TIMES GI4 PLUS A +120D0 CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU +120D1 CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2 +120D2 CUNEIFORM SIGN GA2 TIMES HAL +120D3 CUNEIFORM SIGN GA2 TIMES HAL PLUS LA +120D4 CUNEIFORM SIGN GA2 TIMES HI PLUS LI +120D5 CUNEIFORM SIGN GA2 TIMES HUB2 +120D6 CUNEIFORM SIGN GA2 TIMES IGI GUNU +120D7 CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH +120D8 CUNEIFORM SIGN GA2 TIMES KAK +120D9 CUNEIFORM SIGN GA2 TIMES KASKAL +120DA CUNEIFORM SIGN GA2 TIMES KID +120DB CUNEIFORM SIGN GA2 TIMES KID PLUS LAL +120DC CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN +120DD CUNEIFORM SIGN GA2 TIMES LA +120DE CUNEIFORM SIGN GA2 TIMES ME PLUS EN +120DF CUNEIFORM SIGN GA2 TIMES MI +120E0 CUNEIFORM SIGN GA2 TIMES NUN +120E1 CUNEIFORM SIGN GA2 TIMES NUN OVER NUN +120E2 CUNEIFORM SIGN GA2 TIMES PA +120E3 CUNEIFORM SIGN GA2 TIMES SAL +120E4 CUNEIFORM SIGN GA2 TIMES SAR +120E5 CUNEIFORM SIGN GA2 TIMES SHE +120E6 CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR +120E7 CUNEIFORM SIGN GA2 TIMES SHID +120E8 CUNEIFORM SIGN GA2 TIMES SUM +120E9 CUNEIFORM SIGN GA2 TIMES TAK4 +120EA CUNEIFORM SIGN GA2 TIMES U +120EB CUNEIFORM SIGN GA2 TIMES UD +120EC CUNEIFORM SIGN GA2 TIMES UD PLUS DU +120ED CUNEIFORM SIGN GA2 OVER GA2 +120EE CUNEIFORM SIGN GABA +120EF CUNEIFORM SIGN GABA CROSSING GABA +120F0 CUNEIFORM SIGN GAD +120F1 CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR +120F2 CUNEIFORM SIGN GAL +120F3 CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR +120F4 CUNEIFORM SIGN GALAM +120F5 CUNEIFORM SIGN GAM +120F6 CUNEIFORM SIGN GAN +120F7 CUNEIFORM SIGN GAN2 +120F8 CUNEIFORM SIGN GAN2 TENU +120F9 CUNEIFORM SIGN GAN2 OVER GAN2 +120FA CUNEIFORM SIGN GAN2 CROSSING GAN2 +120FB CUNEIFORM SIGN GAR +120FC CUNEIFORM SIGN GAR3 +120FD CUNEIFORM SIGN GASHAN +120FE CUNEIFORM SIGN GESHTIN +120FF CUNEIFORM SIGN GESHTIN TIMES KUR +12100 CUNEIFORM SIGN GI +12101 CUNEIFORM SIGN GI TIMES E +12102 CUNEIFORM SIGN GI TIMES U +12103 CUNEIFORM SIGN GI CROSSING GI +12104 CUNEIFORM SIGN GI4 +12105 CUNEIFORM SIGN GI4 OVER GI4 +12106 CUNEIFORM SIGN GI4 CROSSING GI4 +12107 CUNEIFORM SIGN GIDIM +12108 CUNEIFORM SIGN GIR2 +12109 CUNEIFORM SIGN GIR2 GUNU +1210A CUNEIFORM SIGN GIR3 +1210B CUNEIFORM SIGN GIR3 TIMES A PLUS IGI +1210C CUNEIFORM SIGN GIR3 TIMES GAN2 TENU +1210D CUNEIFORM SIGN GIR3 TIMES IGI +1210E CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI +1210F CUNEIFORM SIGN GIR3 TIMES PA +12110 CUNEIFORM SIGN GISAL +12111 CUNEIFORM SIGN GISH +12112 CUNEIFORM SIGN GISH CROSSING GISH +12113 CUNEIFORM SIGN GISH TIMES BAD +12114 CUNEIFORM SIGN GISH TIMES TAK4 +12115 CUNEIFORM SIGN GISH TENU +12116 CUNEIFORM SIGN GU +12117 CUNEIFORM SIGN GU CROSSING GU +12118 CUNEIFORM SIGN GU2 +12119 CUNEIFORM SIGN GU2 TIMES KAK +1211A CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU +1211B CUNEIFORM SIGN GU2 TIMES NUN +1211C CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2 +1211D CUNEIFORM SIGN GU2 GUNU +1211E CUNEIFORM SIGN GUD +1211F CUNEIFORM SIGN GUD TIMES A PLUS KUR +12120 CUNEIFORM SIGN GUD TIMES KUR +12121 CUNEIFORM SIGN GUD OVER GUD LUGAL +12122 CUNEIFORM SIGN GUL +12123 CUNEIFORM SIGN GUM +12124 CUNEIFORM SIGN GUM TIMES SHE +12125 CUNEIFORM SIGN GUR +12126 CUNEIFORM SIGN GUR7 +12127 CUNEIFORM SIGN GURUN +12128 CUNEIFORM SIGN GURUSH +12129 CUNEIFORM SIGN HA +1212A CUNEIFORM SIGN HA TENU +1212B CUNEIFORM SIGN HA GUNU +1212C CUNEIFORM SIGN HAL +1212D CUNEIFORM SIGN HI +1212E CUNEIFORM SIGN HI TIMES ASH +1212F CUNEIFORM SIGN HI TIMES ASH2 +12130 CUNEIFORM SIGN HI TIMES BAD +12131 CUNEIFORM SIGN HI TIMES DISH +12132 CUNEIFORM SIGN HI TIMES GAD +12133 CUNEIFORM SIGN HI TIMES KIN +12134 CUNEIFORM SIGN HI TIMES NUN +12135 CUNEIFORM SIGN HI TIMES SHE +12136 CUNEIFORM SIGN HI TIMES U +12137 CUNEIFORM SIGN HU +12138 CUNEIFORM SIGN HUB2 +12139 CUNEIFORM SIGN HUB2 TIMES AN +1213A CUNEIFORM SIGN HUB2 TIMES HAL +1213B CUNEIFORM SIGN HUB2 TIMES KASKAL +1213C CUNEIFORM SIGN HUB2 TIMES LISH +1213D CUNEIFORM SIGN HUB2 TIMES UD +1213E CUNEIFORM SIGN HUL2 +1213F CUNEIFORM SIGN I +12140 CUNEIFORM SIGN I A +12141 CUNEIFORM SIGN IB +12142 CUNEIFORM SIGN IDIM +12143 CUNEIFORM SIGN IDIM OVER IDIM BUR +12144 CUNEIFORM SIGN IDIM OVER IDIM SQUARED +12145 CUNEIFORM SIGN IG +12146 CUNEIFORM SIGN IGI +12147 CUNEIFORM SIGN IGI DIB +12148 CUNEIFORM SIGN IGI RI +12149 CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD +1214A CUNEIFORM SIGN IGI GUNU +1214B CUNEIFORM SIGN IL +1214C CUNEIFORM SIGN IL TIMES GAN2 TENU +1214D CUNEIFORM SIGN IL2 +1214E CUNEIFORM SIGN IM +1214F CUNEIFORM SIGN IM TIMES TAK4 +12150 CUNEIFORM SIGN IM CROSSING IM +12151 CUNEIFORM SIGN IM OPPOSING IM +12152 CUNEIFORM SIGN IM SQUARED +12153 CUNEIFORM SIGN IMIN +12154 CUNEIFORM SIGN IN +12155 CUNEIFORM SIGN IR +12156 CUNEIFORM SIGN ISH +12157 CUNEIFORM SIGN KA +12158 CUNEIFORM SIGN KA TIMES A +12159 CUNEIFORM SIGN KA TIMES AD +1215A CUNEIFORM SIGN KA TIMES AD PLUS KU3 +1215B CUNEIFORM SIGN KA TIMES ASH2 +1215C CUNEIFORM SIGN KA TIMES BAD +1215D CUNEIFORM SIGN KA TIMES BALAG +1215E CUNEIFORM SIGN KA TIMES BAR +1215F CUNEIFORM SIGN KA TIMES BI +12160 CUNEIFORM SIGN KA TIMES ERIN2 +12161 CUNEIFORM SIGN KA TIMES ESH2 +12162 CUNEIFORM SIGN KA TIMES GA +12163 CUNEIFORM SIGN KA TIMES GAL +12164 CUNEIFORM SIGN KA TIMES GAN2 TENU +12165 CUNEIFORM SIGN KA TIMES GAR +12166 CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A +12167 CUNEIFORM SIGN KA TIMES GI +12168 CUNEIFORM SIGN KA TIMES GIR2 +12169 CUNEIFORM SIGN KA TIMES GISH PLUS SAR +1216A CUNEIFORM SIGN KA TIMES GISH CROSSING GISH +1216B CUNEIFORM SIGN KA TIMES GU +1216C CUNEIFORM SIGN KA TIMES GUR7 +1216D CUNEIFORM SIGN KA TIMES IGI +1216E CUNEIFORM SIGN KA TIMES IM +1216F CUNEIFORM SIGN KA TIMES KAK +12170 CUNEIFORM SIGN KA TIMES KI +12171 CUNEIFORM SIGN KA TIMES KID +12172 CUNEIFORM SIGN KA TIMES LI +12173 CUNEIFORM SIGN KA TIMES LU +12174 CUNEIFORM SIGN KA TIMES ME +12175 CUNEIFORM SIGN KA TIMES ME PLUS DU +12176 CUNEIFORM SIGN KA TIMES ME PLUS GI +12177 CUNEIFORM SIGN KA TIMES ME PLUS TE +12178 CUNEIFORM SIGN KA TIMES MI +12179 CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ +1217A CUNEIFORM SIGN KA TIMES NE +1217B CUNEIFORM SIGN KA TIMES NUN +1217C CUNEIFORM SIGN KA TIMES PI +1217D CUNEIFORM SIGN KA TIMES RU +1217E CUNEIFORM SIGN KA TIMES SA +1217F CUNEIFORM SIGN KA TIMES SAR +12180 CUNEIFORM SIGN KA TIMES SHA +12181 CUNEIFORM SIGN KA TIMES SHE +12182 CUNEIFORM SIGN KA TIMES SHID +12183 CUNEIFORM SIGN KA TIMES SHU +12184 CUNEIFORM SIGN KA TIMES SIG +12185 CUNEIFORM SIGN KA TIMES SUHUR +12186 CUNEIFORM SIGN KA TIMES TAR +12187 CUNEIFORM SIGN KA TIMES U +12188 CUNEIFORM SIGN KA TIMES U2 +12189 CUNEIFORM SIGN KA TIMES UD +1218A CUNEIFORM SIGN KA TIMES UMUM TIMES PA +1218B CUNEIFORM SIGN KA TIMES USH +1218C CUNEIFORM SIGN KA TIMES ZI +1218D CUNEIFORM SIGN KA2 +1218E CUNEIFORM SIGN KA2 CROSSING KA2 +1218F CUNEIFORM SIGN KAB +12190 CUNEIFORM SIGN KAD2 +12191 CUNEIFORM SIGN KAD3 +12192 CUNEIFORM SIGN KAD4 +12193 CUNEIFORM SIGN KAD5 +12194 CUNEIFORM SIGN KAD5 OVER KAD5 +12195 CUNEIFORM SIGN KAK +12196 CUNEIFORM SIGN KAK TIMES IGI GUNU +12197 CUNEIFORM SIGN KAL +12198 CUNEIFORM SIGN KAL TIMES BAD +12199 CUNEIFORM SIGN KAL CROSSING KAL +1219A CUNEIFORM SIGN KAM2 +1219B CUNEIFORM SIGN KAM4 +1219C CUNEIFORM SIGN KASKAL +1219D CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219E CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U +1219F CUNEIFORM SIGN KESH2 +121A0 CUNEIFORM SIGN KI +121A1 CUNEIFORM SIGN KI TIMES BAD +121A2 CUNEIFORM SIGN KI TIMES U +121A3 CUNEIFORM SIGN KI TIMES UD +121A4 CUNEIFORM SIGN KID +121A5 CUNEIFORM SIGN KIN +121A6 CUNEIFORM SIGN KISAL +121A7 CUNEIFORM SIGN KISH +121A8 CUNEIFORM SIGN KISIM5 +121A9 CUNEIFORM SIGN KISIM5 OVER KISIM5 +121AA CUNEIFORM SIGN KU +121AB CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2 +121AC CUNEIFORM SIGN KU3 +121AD CUNEIFORM SIGN KU4 +121AE CUNEIFORM SIGN KU4 VARIANT FORM +121AF CUNEIFORM SIGN KU7 +121B0 CUNEIFORM SIGN KUL +121B1 CUNEIFORM SIGN KUL GUNU +121B2 CUNEIFORM SIGN KUN +121B3 CUNEIFORM SIGN KUR +121B4 CUNEIFORM SIGN KUR OPPOSING KUR +121B5 CUNEIFORM SIGN KUSHU2 +121B6 CUNEIFORM SIGN KWU318 +121B7 CUNEIFORM SIGN LA +121B8 CUNEIFORM SIGN LAGAB +121B9 CUNEIFORM SIGN LAGAB TIMES A +121BA CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA +121BB CUNEIFORM SIGN LAGAB TIMES A PLUS GAR +121BC CUNEIFORM SIGN LAGAB TIMES A PLUS LAL +121BD CUNEIFORM SIGN LAGAB TIMES AL +121BE CUNEIFORM SIGN LAGAB TIMES AN +121BF CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU +121C0 CUNEIFORM SIGN LAGAB TIMES BAD +121C1 CUNEIFORM SIGN LAGAB TIMES BI +121C2 CUNEIFORM SIGN LAGAB TIMES DAR +121C3 CUNEIFORM SIGN LAGAB TIMES EN +121C4 CUNEIFORM SIGN LAGAB TIMES GA +121C5 CUNEIFORM SIGN LAGAB TIMES GAR +121C6 CUNEIFORM SIGN LAGAB TIMES GUD +121C7 CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD +121C8 CUNEIFORM SIGN LAGAB TIMES HA +121C9 CUNEIFORM SIGN LAGAB TIMES HAL +121CA CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN +121CB CUNEIFORM SIGN LAGAB TIMES IGI GUNU +121CC CUNEIFORM SIGN LAGAB TIMES IM +121CD CUNEIFORM SIGN LAGAB TIMES IM PLUS HA +121CE CUNEIFORM SIGN LAGAB TIMES IM PLUS LU +121CF CUNEIFORM SIGN LAGAB TIMES KI +121D0 CUNEIFORM SIGN LAGAB TIMES KIN +121D1 CUNEIFORM SIGN LAGAB TIMES KU3 +121D2 CUNEIFORM SIGN LAGAB TIMES KUL +121D3 CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A +121D4 CUNEIFORM SIGN LAGAB TIMES LAGAB +121D5 CUNEIFORM SIGN LAGAB TIMES LISH +121D6 CUNEIFORM SIGN LAGAB TIMES LU +121D7 CUNEIFORM SIGN LAGAB TIMES LUL +121D8 CUNEIFORM SIGN LAGAB TIMES ME +121D9 CUNEIFORM SIGN LAGAB TIMES ME PLUS EN +121DA CUNEIFORM SIGN LAGAB TIMES MUSH +121DB CUNEIFORM SIGN LAGAB TIMES NE +121DC CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM +121DD CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2 +121DE CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU +121DF CUNEIFORM SIGN LAGAB TIMES SHU2 +121E0 CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2 +121E1 CUNEIFORM SIGN LAGAB TIMES SUM +121E2 CUNEIFORM SIGN LAGAB TIMES TAG +121E3 CUNEIFORM SIGN LAGAB TIMES TAK4 +121E4 CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA +121E5 CUNEIFORM SIGN LAGAB TIMES U +121E6 CUNEIFORM SIGN LAGAB TIMES U PLUS A +121E7 CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U +121E8 CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH +121E9 CUNEIFORM SIGN LAGAB TIMES UD +121EA CUNEIFORM SIGN LAGAB TIMES USH +121EB CUNEIFORM SIGN LAGAB SQUARED +121EC CUNEIFORM SIGN LAGAR +121ED CUNEIFORM SIGN LAGAR TIMES SHE +121EE CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM +121EF CUNEIFORM SIGN LAGAR GUNU +121F0 CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE +121F1 CUNEIFORM SIGN LAHSHU +121F2 CUNEIFORM SIGN LAL +121F3 CUNEIFORM SIGN LAL TIMES LAL +121F4 CUNEIFORM SIGN LAM +121F5 CUNEIFORM SIGN LAM TIMES KUR +121F6 CUNEIFORM SIGN LAM TIMES KUR PLUS RU +121F7 CUNEIFORM SIGN LI +121F8 CUNEIFORM SIGN LIL +121F9 CUNEIFORM SIGN LIMMU2 +121FA CUNEIFORM SIGN LISH +121FB CUNEIFORM SIGN LU +121FC CUNEIFORM SIGN LU TIMES BAD +121FD CUNEIFORM SIGN LU2 +121FE CUNEIFORM SIGN LU2 TIMES AL +121FF CUNEIFORM SIGN LU2 TIMES BAD +12200 CUNEIFORM SIGN LU2 TIMES ESH2 +12201 CUNEIFORM SIGN LU2 TIMES ESH2 TENU +12202 CUNEIFORM SIGN LU2 TIMES GAN2 TENU +12203 CUNEIFORM SIGN LU2 TIMES HI TIMES BAD +12204 CUNEIFORM SIGN LU2 TIMES IM +12205 CUNEIFORM SIGN LU2 TIMES KAD2 +12206 CUNEIFORM SIGN LU2 TIMES KAD3 +12207 CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH +12208 CUNEIFORM SIGN LU2 TIMES KI +12209 CUNEIFORM SIGN LU2 TIMES LA PLUS ASH +1220A CUNEIFORM SIGN LU2 TIMES LAGAB +1220B CUNEIFORM SIGN LU2 TIMES ME PLUS EN +1220C CUNEIFORM SIGN LU2 TIMES NE +1220D CUNEIFORM SIGN LU2 TIMES NU +1220E CUNEIFORM SIGN LU2 TIMES SI PLUS ASH +1220F CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU +12210 CUNEIFORM SIGN LU2 TIMES TUG2 +12211 CUNEIFORM SIGN LU2 TENU +12212 CUNEIFORM SIGN LU2 CROSSING LU2 +12213 CUNEIFORM SIGN LU2 OPPOSING LU2 +12214 CUNEIFORM SIGN LU2 SQUARED +12215 CUNEIFORM SIGN LU2 SHESHIG +12216 CUNEIFORM SIGN LU3 +12217 CUNEIFORM SIGN LUGAL +12218 CUNEIFORM SIGN LUGAL OVER LUGAL +12219 CUNEIFORM SIGN LUGAL OPPOSING LUGAL +1221A CUNEIFORM SIGN LUGAL SHESHIG +1221B CUNEIFORM SIGN LUH +1221C CUNEIFORM SIGN LUL +1221D CUNEIFORM SIGN LUM +1221E CUNEIFORM SIGN LUM OVER LUM +1221F CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR +12220 CUNEIFORM SIGN MA +12221 CUNEIFORM SIGN MA TIMES TAK4 +12222 CUNEIFORM SIGN MA GUNU +12223 CUNEIFORM SIGN MA2 +12224 CUNEIFORM SIGN MAH +12225 CUNEIFORM SIGN MAR +12226 CUNEIFORM SIGN MASH +12227 CUNEIFORM SIGN MASH2 +12228 CUNEIFORM SIGN ME +12229 CUNEIFORM SIGN MES +1222A CUNEIFORM SIGN MI +1222B CUNEIFORM SIGN MIN +1222C CUNEIFORM SIGN MU +1222D CUNEIFORM SIGN MU OVER MU +1222E CUNEIFORM SIGN MUG +1222F CUNEIFORM SIGN MUG GUNU +12230 CUNEIFORM SIGN MUNSUB +12231 CUNEIFORM SIGN MURGU2 +12232 CUNEIFORM SIGN MUSH +12233 CUNEIFORM SIGN MUSH TIMES A +12234 CUNEIFORM SIGN MUSH TIMES KUR +12235 CUNEIFORM SIGN MUSH TIMES ZA +12236 CUNEIFORM SIGN MUSH OVER MUSH +12237 CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA +12238 CUNEIFORM SIGN MUSH CROSSING MUSH +12239 CUNEIFORM SIGN MUSH3 +1223A CUNEIFORM SIGN MUSH3 TIMES A +1223B CUNEIFORM SIGN MUSH3 TIMES A PLUS DI +1223C CUNEIFORM SIGN MUSH3 TIMES DI +1223D CUNEIFORM SIGN MUSH3 GUNU +1223E CUNEIFORM SIGN NA +1223F CUNEIFORM SIGN NA2 +12240 CUNEIFORM SIGN NAGA +12241 CUNEIFORM SIGN NAGA INVERTED +12242 CUNEIFORM SIGN NAGA TIMES SHU TENU +12243 CUNEIFORM SIGN NAGA OPPOSING NAGA +12244 CUNEIFORM SIGN NAGAR +12245 CUNEIFORM SIGN NAM NUTILLU +12246 CUNEIFORM SIGN NAM +12247 CUNEIFORM SIGN NAM2 +12248 CUNEIFORM SIGN NE +12249 CUNEIFORM SIGN NE TIMES A +1224A CUNEIFORM SIGN NE TIMES UD +1224B CUNEIFORM SIGN NE SHESHIG +1224C CUNEIFORM SIGN NI +1224D CUNEIFORM SIGN NI TIMES E +1224E CUNEIFORM SIGN NI2 +1224F CUNEIFORM SIGN NIM +12250 CUNEIFORM SIGN NIM TIMES GAN2 TENU +12251 CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU +12252 CUNEIFORM SIGN NINDA2 +12253 CUNEIFORM SIGN NINDA2 TIMES AN +12254 CUNEIFORM SIGN NINDA2 TIMES ASH +12255 CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH +12256 CUNEIFORM SIGN NINDA2 TIMES GUD +12257 CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU +12258 CUNEIFORM SIGN NINDA2 TIMES NE +12259 CUNEIFORM SIGN NINDA2 TIMES NUN +1225A CUNEIFORM SIGN NINDA2 TIMES SHE +1225B CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN +1225C CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH +1225D CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH +1225E CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH +1225F CUNEIFORM SIGN NINDA2 TIMES USH +12260 CUNEIFORM SIGN NISAG +12261 CUNEIFORM SIGN NU +12262 CUNEIFORM SIGN NU11 +12263 CUNEIFORM SIGN NUN +12264 CUNEIFORM SIGN NUN LAGAR TIMES GAR +12265 CUNEIFORM SIGN NUN LAGAR TIMES MASH +12266 CUNEIFORM SIGN NUN LAGAR TIMES SAL +12267 CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL +12268 CUNEIFORM SIGN NUN LAGAR TIMES USH +12269 CUNEIFORM SIGN NUN TENU +1226A CUNEIFORM SIGN NUN OVER NUN +1226B CUNEIFORM SIGN NUN CROSSING NUN +1226C CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR +1226D CUNEIFORM SIGN NUNUZ +1226E CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB +1226F CUNEIFORM SIGN NUNUZ AB2 TIMES BI +12270 CUNEIFORM SIGN NUNUZ AB2 TIMES DUG +12271 CUNEIFORM SIGN NUNUZ AB2 TIMES GUD +12272 CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU +12273 CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3 +12274 CUNEIFORM SIGN NUNUZ AB2 TIMES LA +12275 CUNEIFORM SIGN NUNUZ AB2 TIMES NE +12276 CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3 +12277 CUNEIFORM SIGN NUNUZ AB2 TIMES U2 +12278 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI +12279 CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U +1227A CUNEIFORM SIGN PA +1227B CUNEIFORM SIGN PAD +1227C CUNEIFORM SIGN PAN +1227D CUNEIFORM SIGN PAP +1227E CUNEIFORM SIGN PESH2 +1227F CUNEIFORM SIGN PI +12280 CUNEIFORM SIGN PI TIMES A +12281 CUNEIFORM SIGN PI TIMES AB +12282 CUNEIFORM SIGN PI TIMES BI +12283 CUNEIFORM SIGN PI TIMES BU +12284 CUNEIFORM SIGN PI TIMES E +12285 CUNEIFORM SIGN PI TIMES I +12286 CUNEIFORM SIGN PI TIMES IB +12287 CUNEIFORM SIGN PI TIMES U +12288 CUNEIFORM SIGN PI TIMES U2 +12289 CUNEIFORM SIGN PI CROSSING PI +1228A CUNEIFORM SIGN PIRIG +1228B CUNEIFORM SIGN PIRIG TIMES KAL +1228C CUNEIFORM SIGN PIRIG TIMES UD +1228D CUNEIFORM SIGN PIRIG TIMES ZA +1228E CUNEIFORM SIGN PIRIG OPPOSING PIRIG +1228F CUNEIFORM SIGN RA +12290 CUNEIFORM SIGN RAB +12291 CUNEIFORM SIGN RI +12292 CUNEIFORM SIGN RU +12293 CUNEIFORM SIGN SA +12294 CUNEIFORM SIGN SAG NUTILLU +12295 CUNEIFORM SIGN SAG +12296 CUNEIFORM SIGN SAG TIMES A +12297 CUNEIFORM SIGN SAG TIMES DU +12298 CUNEIFORM SIGN SAG TIMES DUB +12299 CUNEIFORM SIGN SAG TIMES HA +1229A CUNEIFORM SIGN SAG TIMES KAK +1229B CUNEIFORM SIGN SAG TIMES KUR +1229C CUNEIFORM SIGN SAG TIMES LUM +1229D CUNEIFORM SIGN SAG TIMES MI +1229E CUNEIFORM SIGN SAG TIMES NUN +1229F CUNEIFORM SIGN SAG TIMES SAL +122A0 CUNEIFORM SIGN SAG TIMES SHID +122A1 CUNEIFORM SIGN SAG TIMES TAB +122A2 CUNEIFORM SIGN SAG TIMES U2 +122A3 CUNEIFORM SIGN SAG TIMES UB +122A4 CUNEIFORM SIGN SAG TIMES UM +122A5 CUNEIFORM SIGN SAG TIMES UR +122A6 CUNEIFORM SIGN SAG TIMES USH +122A7 CUNEIFORM SIGN SAG OVER SAG +122A8 CUNEIFORM SIGN SAG GUNU +122A9 CUNEIFORM SIGN SAL +122AA CUNEIFORM SIGN SAL LAGAB TIMES ASH2 +122AB CUNEIFORM SIGN SANGA2 +122AC CUNEIFORM SIGN SAR +122AD CUNEIFORM SIGN SHA +122AE CUNEIFORM SIGN SHA3 +122AF CUNEIFORM SIGN SHA3 TIMES A +122B0 CUNEIFORM SIGN SHA3 TIMES BAD +122B1 CUNEIFORM SIGN SHA3 TIMES GISH +122B2 CUNEIFORM SIGN SHA3 TIMES NE +122B3 CUNEIFORM SIGN SHA3 TIMES SHU2 +122B4 CUNEIFORM SIGN SHA3 TIMES TUR +122B5 CUNEIFORM SIGN SHA3 TIMES U +122B6 CUNEIFORM SIGN SHA3 TIMES U PLUS A +122B7 CUNEIFORM SIGN SHA6 +122B8 CUNEIFORM SIGN SHAB6 +122B9 CUNEIFORM SIGN SHAR2 +122BA CUNEIFORM SIGN SHE +122BB CUNEIFORM SIGN SHE HU +122BC CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR +122BD CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR +122BE CUNEIFORM SIGN SHEG9 +122BF CUNEIFORM SIGN SHEN +122C0 CUNEIFORM SIGN SHESH +122C1 CUNEIFORM SIGN SHESH2 +122C2 CUNEIFORM SIGN SHESHLAM +122C3 CUNEIFORM SIGN SHID +122C4 CUNEIFORM SIGN SHID TIMES A +122C5 CUNEIFORM SIGN SHID TIMES IM +122C6 CUNEIFORM SIGN SHIM +122C7 CUNEIFORM SIGN SHIM TIMES A +122C8 CUNEIFORM SIGN SHIM TIMES BAL +122C9 CUNEIFORM SIGN SHIM TIMES BULUG +122CA CUNEIFORM SIGN SHIM TIMES DIN +122CB CUNEIFORM SIGN SHIM TIMES GAR +122CC CUNEIFORM SIGN SHIM TIMES IGI +122CD CUNEIFORM SIGN SHIM TIMES IGI GUNU +122CE CUNEIFORM SIGN SHIM TIMES KUSHU2 +122CF CUNEIFORM SIGN SHIM TIMES LUL +122D0 CUNEIFORM SIGN SHIM TIMES MUG +122D1 CUNEIFORM SIGN SHIM TIMES SAL +122D2 CUNEIFORM SIGN SHINIG +122D3 CUNEIFORM SIGN SHIR +122D4 CUNEIFORM SIGN NU11 TENU +122D4 CUNEIFORM SIGN SHIR TENU +122D5 CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR +122D5 CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR +122D6 CUNEIFORM SIGN SHITA +122D7 CUNEIFORM SIGN SHU +122D8 CUNEIFORM SIGN SHU OVER INVERTED SHU +122D9 CUNEIFORM SIGN SHU2 +122DA CUNEIFORM SIGN SHUBUR +122DB CUNEIFORM SIGN SI +122DC CUNEIFORM SIGN SI GUNU +122DD CUNEIFORM SIGN SIG +122DE CUNEIFORM SIGN SIG4 +122DF CUNEIFORM SIGN SIG4 OVER SIG4 SHU2 +122E0 CUNEIFORM SIGN SIK2 +122E1 CUNEIFORM SIGN SILA3 +122E2 CUNEIFORM SIGN SU +122E3 CUNEIFORM SIGN SU OVER SU +122E4 CUNEIFORM SIGN SUD +122E5 CUNEIFORM SIGN SUD2 +122E6 CUNEIFORM SIGN SUHUR +122E7 CUNEIFORM SIGN SUM +122E8 CUNEIFORM SIGN SUMASH +122E9 CUNEIFORM SIGN SUR +122EA CUNEIFORM SIGN SUR9 +122EB CUNEIFORM SIGN TA +122EC CUNEIFORM SIGN TA ASTERISK +122ED CUNEIFORM SIGN TA TIMES HI +122EE CUNEIFORM SIGN TA TIMES MI +122EF CUNEIFORM SIGN TA GUNU +122F0 CUNEIFORM SIGN TAB +122F1 CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH +122F2 CUNEIFORM SIGN TAB SQUARED +122F3 CUNEIFORM SIGN TAG +122F4 CUNEIFORM SIGN TAG TIMES BI +122F5 CUNEIFORM SIGN TAG TIMES GUD +122F6 CUNEIFORM SIGN TAG TIMES SHE +122F7 CUNEIFORM SIGN TAG TIMES SHU +122F8 CUNEIFORM SIGN TAG TIMES TUG2 +122F9 CUNEIFORM SIGN TAG TIMES UD +122FA CUNEIFORM SIGN TAK4 +122FB CUNEIFORM SIGN TAR +122FC CUNEIFORM SIGN TE +122FD CUNEIFORM SIGN TE GUNU +122FE CUNEIFORM SIGN TI +122FF CUNEIFORM SIGN TI TENU +12300 CUNEIFORM SIGN TIL +12301 CUNEIFORM SIGN TIR +12302 CUNEIFORM SIGN TIR TIMES TAK4 +12303 CUNEIFORM SIGN TIR OVER TIR +12304 CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR +12305 CUNEIFORM SIGN TU +12306 CUNEIFORM SIGN TUG2 +12307 CUNEIFORM SIGN TUK +12308 CUNEIFORM SIGN TUM +12309 CUNEIFORM SIGN TUR +1230A CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA +1230B CUNEIFORM SIGN U +1230C CUNEIFORM SIGN U GUD +1230D CUNEIFORM SIGN U U U +1230E CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR +1230F CUNEIFORM SIGN U OVER U SUR OVER SUR +12310 CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED +12311 CUNEIFORM SIGN U2 +12312 CUNEIFORM SIGN UB +12313 CUNEIFORM SIGN UD +12314 CUNEIFORM SIGN UD KUSHU2 +12315 CUNEIFORM SIGN UD TIMES BAD +12316 CUNEIFORM SIGN UD TIMES MI +12317 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U +12318 CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU +12319 CUNEIFORM SIGN UD GUNU +1231A CUNEIFORM SIGN UD SHESHIG +1231B CUNEIFORM SIGN UD SHESHIG TIMES BAD +1231C CUNEIFORM SIGN UDUG +1231D CUNEIFORM SIGN UM +1231E CUNEIFORM SIGN UM TIMES LAGAB +1231F CUNEIFORM SIGN UM TIMES ME PLUS DA +12320 CUNEIFORM SIGN UM TIMES SHA3 +12321 CUNEIFORM SIGN UM TIMES U +12322 CUNEIFORM SIGN UMBIN +12323 CUNEIFORM SIGN UMUM +12324 CUNEIFORM SIGN UMUM TIMES KASKAL +12325 CUNEIFORM SIGN UMUM TIMES PA +12326 CUNEIFORM SIGN UN +12327 CUNEIFORM SIGN UN GUNU +12328 CUNEIFORM SIGN UR +12329 CUNEIFORM SIGN UR CROSSING UR +1232A CUNEIFORM SIGN UR SHESHIG +1232B CUNEIFORM SIGN UR2 +1232C CUNEIFORM SIGN UR2 TIMES A PLUS HA +1232D CUNEIFORM SIGN UR2 TIMES A PLUS NA +1232E CUNEIFORM SIGN UR2 TIMES AL +1232F CUNEIFORM SIGN UR2 TIMES HA +12330 CUNEIFORM SIGN UR2 TIMES NUN +12331 CUNEIFORM SIGN UR2 TIMES U2 +12332 CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH +12333 CUNEIFORM SIGN UR2 TIMES U2 PLUS BI +12334 CUNEIFORM SIGN UR4 +12335 CUNEIFORM SIGN URI +12336 CUNEIFORM SIGN URI3 +12337 CUNEIFORM SIGN URU +12338 CUNEIFORM SIGN URU TIMES A +12339 CUNEIFORM SIGN URU TIMES ASHGAB +1233A CUNEIFORM SIGN URU TIMES BAR +1233B CUNEIFORM SIGN URU TIMES DUN +1233C CUNEIFORM SIGN URU TIMES GA +1233D CUNEIFORM SIGN URU TIMES GAL +1233E CUNEIFORM SIGN URU TIMES GAN2 TENU +1233F CUNEIFORM SIGN URU TIMES GAR +12340 CUNEIFORM SIGN URU TIMES GU +12341 CUNEIFORM SIGN URU TIMES HA +12342 CUNEIFORM SIGN URU TIMES IGI +12343 CUNEIFORM SIGN URU TIMES IM +12344 CUNEIFORM SIGN URU TIMES ISH +12345 CUNEIFORM SIGN URU TIMES KI +12346 CUNEIFORM SIGN URU TIMES LUM +12347 CUNEIFORM SIGN URU TIMES MIN +12348 CUNEIFORM SIGN URU TIMES PA +12349 CUNEIFORM SIGN URU TIMES SHE +1234A CUNEIFORM SIGN URU TIMES SIG4 +1234B CUNEIFORM SIGN URU TIMES TU +1234C CUNEIFORM SIGN URU TIMES U PLUS GUD +1234D CUNEIFORM SIGN URU TIMES UD +1234E CUNEIFORM SIGN URU TIMES URUDA +1234F CUNEIFORM SIGN URUDA +12350 CUNEIFORM SIGN URUDA TIMES U +12351 CUNEIFORM SIGN USH +12352 CUNEIFORM SIGN USH TIMES A +12353 CUNEIFORM SIGN USH TIMES KU +12354 CUNEIFORM SIGN USH TIMES KUR +12355 CUNEIFORM SIGN USH TIMES TAK4 +12356 CUNEIFORM SIGN USHX +12357 CUNEIFORM SIGN USH2 +12358 CUNEIFORM SIGN USHUMX +12359 CUNEIFORM SIGN UTUKI +1235A CUNEIFORM SIGN UZ3 +1235B CUNEIFORM SIGN UZ3 TIMES KASKAL +1235C CUNEIFORM SIGN UZU +1235D CUNEIFORM SIGN ZA +1235E CUNEIFORM SIGN ZA TENU +1235F CUNEIFORM SIGN ZA SQUARED TIMES KUR +12360 CUNEIFORM SIGN ZAG +12361 CUNEIFORM SIGN ZAMX +12362 CUNEIFORM SIGN ZE2 +12363 CUNEIFORM SIGN ZI +12364 CUNEIFORM SIGN ZI OVER ZI +12365 CUNEIFORM SIGN ZI3 +12366 CUNEIFORM SIGN ZIB +12367 CUNEIFORM SIGN ZIB KABA TENU +12368 CUNEIFORM SIGN ZIG +12369 CUNEIFORM SIGN ZIZ2 +1236A CUNEIFORM SIGN ZU +1236B CUNEIFORM SIGN ZU5 +1236C CUNEIFORM SIGN ZU5 TIMES A +1236D CUNEIFORM SIGN ZUBUR +1236E CUNEIFORM SIGN ZUM +1236F CUNEIFORM SIGN KAP ELAMITE +12370 CUNEIFORM SIGN AB TIMES NUN +12371 CUNEIFORM SIGN AB2 TIMES A +12372 CUNEIFORM SIGN AMAR TIMES KUG +12373 CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH +12374 CUNEIFORM SIGN DAG3 +12375 CUNEIFORM SIGN DISH PLUS SHU +12376 CUNEIFORM SIGN DUB TIMES SHE +12377 CUNEIFORM SIGN EZEN TIMES GUD +12378 CUNEIFORM SIGN EZEN TIMES SHE +12379 CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A +1237A CUNEIFORM SIGN GA2 TIMES ASH2 +1237B CUNEIFORM SIGN GE22 +1237C CUNEIFORM SIGN GIG +1237D CUNEIFORM SIGN HUSH +1237E CUNEIFORM SIGN KA TIMES ANSHE +1237F CUNEIFORM SIGN KA TIMES ASH3 +12380 CUNEIFORM SIGN KA TIMES GISH +12381 CUNEIFORM SIGN KA TIMES GUD +12382 CUNEIFORM SIGN KA TIMES HI TIMES ASH2 +12383 CUNEIFORM SIGN KA TIMES LUM +12384 CUNEIFORM SIGN KA TIMES PA +12385 CUNEIFORM SIGN KA TIMES SHUL +12386 CUNEIFORM SIGN KA TIMES TU +12387 CUNEIFORM SIGN KA TIMES UR2 +12388 CUNEIFORM SIGN LAGAB TIMES GI +12389 CUNEIFORM SIGN LU2 SHESHIG TIMES BAD +1238A CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL +1238B CUNEIFORM SIGN LU2 TIMES SHU +1238C CUNEIFORM SIGN MESH +1238D CUNEIFORM SIGN MUSH3 TIMES ZA +1238E CUNEIFORM SIGN NA4 +1238F CUNEIFORM SIGN NIN +12390 CUNEIFORM SIGN NIN9 +12391 CUNEIFORM SIGN NINDA2 TIMES BAL +12392 CUNEIFORM SIGN NINDA2 TIMES GI +12393 CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES +12394 CUNEIFORM SIGN PESH2 ASTERISK +12395 CUNEIFORM SIGN PIR2 +12396 CUNEIFORM SIGN SAG TIMES IGI GUNU +12397 CUNEIFORM SIGN TI2 +12398 CUNEIFORM SIGN UM TIMES ME +12399 CUNEIFORM SIGN U U +12400 CUNEIFORM NUMERIC SIGN TWO ASH +12401 CUNEIFORM NUMERIC SIGN THREE ASH +12402 CUNEIFORM NUMERIC SIGN FOUR ASH +12403 CUNEIFORM NUMERIC SIGN FIVE ASH +12404 CUNEIFORM NUMERIC SIGN SIX ASH +12405 CUNEIFORM NUMERIC SIGN SEVEN ASH +12406 CUNEIFORM NUMERIC SIGN EIGHT ASH +12407 CUNEIFORM NUMERIC SIGN NINE ASH +12408 CUNEIFORM NUMERIC SIGN THREE DISH +12409 CUNEIFORM NUMERIC SIGN FOUR DISH +1240A CUNEIFORM NUMERIC SIGN FIVE DISH +1240B CUNEIFORM NUMERIC SIGN SIX DISH +1240C CUNEIFORM NUMERIC SIGN SEVEN DISH +1240D CUNEIFORM NUMERIC SIGN EIGHT DISH +1240E CUNEIFORM NUMERIC SIGN NINE DISH +1240F CUNEIFORM NUMERIC SIGN FOUR U +12410 CUNEIFORM NUMERIC SIGN FIVE U +12411 CUNEIFORM NUMERIC SIGN SIX U +12412 CUNEIFORM NUMERIC SIGN SEVEN U +12413 CUNEIFORM NUMERIC SIGN EIGHT U +12414 CUNEIFORM NUMERIC SIGN NINE U +12415 CUNEIFORM NUMERIC SIGN ONE GESH2 +12416 CUNEIFORM NUMERIC SIGN TWO GESH2 +12417 CUNEIFORM NUMERIC SIGN THREE GESH2 +12418 CUNEIFORM NUMERIC SIGN FOUR GESH2 +12419 CUNEIFORM NUMERIC SIGN FIVE GESH2 +1241A CUNEIFORM NUMERIC SIGN SIX GESH2 +1241B CUNEIFORM NUMERIC SIGN SEVEN GESH2 +1241C CUNEIFORM NUMERIC SIGN EIGHT GESH2 +1241D CUNEIFORM NUMERIC SIGN NINE GESH2 +1241E CUNEIFORM NUMERIC SIGN ONE GESHU +1241F CUNEIFORM NUMERIC SIGN TWO GESHU +12420 CUNEIFORM NUMERIC SIGN THREE GESHU +12421 CUNEIFORM NUMERIC SIGN FOUR GESHU +12422 CUNEIFORM NUMERIC SIGN FIVE GESHU +12423 CUNEIFORM NUMERIC SIGN TWO SHAR2 +12424 CUNEIFORM NUMERIC SIGN THREE SHAR2 +12425 CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM +12426 CUNEIFORM NUMERIC SIGN FOUR SHAR2 +12427 CUNEIFORM NUMERIC SIGN FIVE SHAR2 +12428 CUNEIFORM NUMERIC SIGN SIX SHAR2 +12429 CUNEIFORM NUMERIC SIGN SEVEN SHAR2 +1242A CUNEIFORM NUMERIC SIGN EIGHT SHAR2 +1242B CUNEIFORM NUMERIC SIGN NINE SHAR2 +1242C CUNEIFORM NUMERIC SIGN ONE SHARU +1242D CUNEIFORM NUMERIC SIGN TWO SHARU +1242E CUNEIFORM NUMERIC SIGN THREE SHARU +1242F CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM +12430 CUNEIFORM NUMERIC SIGN FOUR SHARU +12431 CUNEIFORM NUMERIC SIGN FIVE SHARU +12432 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH +12433 CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN +12434 CUNEIFORM NUMERIC SIGN ONE BURU +12435 CUNEIFORM NUMERIC SIGN TWO BURU +12436 CUNEIFORM NUMERIC SIGN THREE BURU +12437 CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM +12438 CUNEIFORM NUMERIC SIGN FOUR BURU +12439 CUNEIFORM NUMERIC SIGN FIVE BURU +1243A CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16 +1243B CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21 +1243C CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU +1243D CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4 +1243E CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A +1243F CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B +12440 CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9 +12441 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3 +12442 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A +12443 CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B +12444 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU +12445 CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3 +12446 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU +12447 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3 +12448 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4 +12449 CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A +1244A CUNEIFORM NUMERIC SIGN TWO ASH TENU +1244B CUNEIFORM NUMERIC SIGN THREE ASH TENU +1244C CUNEIFORM NUMERIC SIGN FOUR ASH TENU +1244D CUNEIFORM NUMERIC SIGN FIVE ASH TENU +1244E CUNEIFORM NUMERIC SIGN SIX ASH TENU +1244F CUNEIFORM NUMERIC SIGN ONE BAN2 +12450 CUNEIFORM NUMERIC SIGN TWO BAN2 +12451 CUNEIFORM NUMERIC SIGN THREE BAN2 +12452 CUNEIFORM NUMERIC SIGN FOUR BAN2 +12453 CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM +12454 CUNEIFORM NUMERIC SIGN FIVE BAN2 +12455 CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM +12456 CUNEIFORM NUMERIC SIGN NIGIDAMIN +12457 CUNEIFORM NUMERIC SIGN NIGIDAESH +12458 CUNEIFORM NUMERIC SIGN ONE ESHE3 +12459 CUNEIFORM NUMERIC SIGN TWO ESHE3 +1245A CUNEIFORM NUMERIC SIGN ONE THIRD DISH +1245B CUNEIFORM NUMERIC SIGN TWO THIRDS DISH +1245C CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH +1245D CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A +1245E CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A +1245F CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH +12460 CUNEIFORM NUMERIC SIGN ONE QUARTER ASH +12461 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH +12462 CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER +12463 CUNEIFORM NUMERIC SIGN ONE QUARTER GUR +12464 CUNEIFORM NUMERIC SIGN ONE HALF GUR +12465 CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD +12466 CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS +12467 CUNEIFORM NUMERIC SIGN ELAMITE FORTY +12468 CUNEIFORM NUMERIC SIGN ELAMITE FIFTY +12469 CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM +1246A CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM +1246B CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM +1246C CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM +1246D CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM +1246E CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470 CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER +12471 CUNEIFORM PUNCTUATION SIGN VERTICAL COLON +12472 CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON +12473 CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON +12474 CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480 CUNEIFORM SIGN AB TIMES NUN TENU +12481 CUNEIFORM SIGN AB TIMES SHU2 +12482 CUNEIFORM SIGN AD TIMES ESH2 +12483 CUNEIFORM SIGN BAD TIMES DISH TENU +12484 CUNEIFORM SIGN BAHAR2 TIMES AB2 +12485 CUNEIFORM SIGN BAHAR2 TIMES NI +12486 CUNEIFORM SIGN BAHAR2 TIMES ZA +12487 CUNEIFORM SIGN BU OVER BU TIMES NA2 +12488 CUNEIFORM SIGN DA TIMES TAK4 +12489 CUNEIFORM SIGN DAG TIMES KUR +1248A CUNEIFORM SIGN DIM TIMES IGI +1248B CUNEIFORM SIGN DIM TIMES U U U +1248C CUNEIFORM SIGN DIM2 TIMES UD +1248D CUNEIFORM SIGN DUG TIMES ANSHE +1248E CUNEIFORM SIGN DUG TIMES ASH +1248F CUNEIFORM SIGN DUG TIMES ASH AT LEFT +12490 CUNEIFORM SIGN DUG TIMES DIN +12491 CUNEIFORM SIGN DUG TIMES DUN +12492 CUNEIFORM SIGN DUG TIMES ERIN2 +12493 CUNEIFORM SIGN DUG TIMES GA +12494 CUNEIFORM SIGN DUG TIMES GI +12495 CUNEIFORM SIGN DUG TIMES GIR2 GUNU +12496 CUNEIFORM SIGN DUG TIMES GISH +12497 CUNEIFORM SIGN DUG TIMES HA +12498 CUNEIFORM SIGN DUG TIMES HI +12499 CUNEIFORM SIGN DUG TIMES IGI GUNU +1249A CUNEIFORM SIGN DUG TIMES KASKAL +1249B CUNEIFORM SIGN DUG TIMES KUR +1249C CUNEIFORM SIGN DUG TIMES KUSHU2 +1249D CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL +1249E CUNEIFORM SIGN DUG TIMES LAK-020 +1249F CUNEIFORM SIGN DUG TIMES LAM +124A0 CUNEIFORM SIGN DUG TIMES LAM TIMES KUR +124A1 CUNEIFORM SIGN DUG TIMES LUH PLUS GISH +124A2 CUNEIFORM SIGN DUG TIMES MASH +124A3 CUNEIFORM SIGN DUG TIMES MES +124A4 CUNEIFORM SIGN DUG TIMES MI +124A5 CUNEIFORM SIGN DUG TIMES NI +124A6 CUNEIFORM SIGN DUG TIMES PI +124A7 CUNEIFORM SIGN DUG TIMES SHE +124A8 CUNEIFORM SIGN DUG TIMES SI GUNU +124A9 CUNEIFORM SIGN E2 TIMES KUR +124AA CUNEIFORM SIGN E2 TIMES PAP +124AB CUNEIFORM SIGN ERIN2 X +124AC CUNEIFORM SIGN ESH2 CROSSING ESH2 +124AD CUNEIFORM SIGN EZEN SHESHIG TIMES ASH +124AE CUNEIFORM SIGN EZEN SHESHIG TIMES HI +124AF CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU +124B0 CUNEIFORM SIGN EZEN SHESHIG TIMES LA +124B1 CUNEIFORM SIGN EZEN SHESHIG TIMES LAL +124B2 CUNEIFORM SIGN EZEN SHESHIG TIMES ME +124B3 CUNEIFORM SIGN EZEN SHESHIG TIMES MES +124B4 CUNEIFORM SIGN EZEN SHESHIG TIMES SU +124B5 CUNEIFORM SIGN EZEN TIMES SU +124B6 CUNEIFORM SIGN GA2 TIMES BAHAR2 +124B7 CUNEIFORM SIGN GA2 TIMES DIM GUNU +124B8 CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU +124B9 CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL +124BA CUNEIFORM SIGN GA2 TIMES EREN +124BB CUNEIFORM SIGN GA2 TIMES GA +124BC CUNEIFORM SIGN GA2 TIMES GAR PLUS DI +124BD CUNEIFORM SIGN GA2 TIMES GAR PLUS NE +124BE CUNEIFORM SIGN GA2 TIMES HA PLUS A +124BF CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL +124C0 CUNEIFORM SIGN GA2 TIMES LAM +124C1 CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR +124C2 CUNEIFORM SIGN GA2 TIMES LUH +124C3 CUNEIFORM SIGN GA2 TIMES MUSH +124C4 CUNEIFORM SIGN GA2 TIMES NE +124C5 CUNEIFORM SIGN GA2 TIMES NE PLUS E2 +124C6 CUNEIFORM SIGN GA2 TIMES NE PLUS GI +124C7 CUNEIFORM SIGN GA2 TIMES SHIM +124C8 CUNEIFORM SIGN GA2 TIMES ZIZ2 +124C9 CUNEIFORM SIGN GABA ROTATED NINETY DEGREES +124CA CUNEIFORM SIGN GESHTIN TIMES U +124CB CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH +124CC CUNEIFORM SIGN GU2 TIMES IGI GUNU +124CD CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4 +124CE CUNEIFORM SIGN HA TENU GUNU +124CF CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH +124D0 CUNEIFORM SIGN KA TIMES BU +124D1 CUNEIFORM SIGN KA TIMES KA +124D2 CUNEIFORM SIGN KA TIMES U U U +124D3 CUNEIFORM SIGN KA TIMES UR +124D4 CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU +124D5 CUNEIFORM SIGN LAK-003 +124D6 CUNEIFORM SIGN LAK-021 +124D7 CUNEIFORM SIGN LAK-025 +124D8 CUNEIFORM SIGN LAK-030 +124D9 CUNEIFORM SIGN LAK-050 +124DA CUNEIFORM SIGN LAK-051 +124DB CUNEIFORM SIGN LAK-062 +124DC CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU +124DD CUNEIFORM SIGN LAK-080 +124DE CUNEIFORM SIGN LAK-081 OVER LAK-081 +124DF CUNEIFORM SIGN LAK-092 +124E0 CUNEIFORM SIGN LAK-130 +124E1 CUNEIFORM SIGN LAK-142 +124E2 CUNEIFORM SIGN LAK-210 +124E3 CUNEIFORM SIGN LAK-219 +124E4 CUNEIFORM SIGN LAK-220 +124E5 CUNEIFORM SIGN LAK-225 +124E6 CUNEIFORM SIGN LAK-228 +124E7 CUNEIFORM SIGN LAK-238 +124E8 CUNEIFORM SIGN LAK-265 +124E9 CUNEIFORM SIGN LAK-266 +124EA CUNEIFORM SIGN LAK-343 +124EB CUNEIFORM SIGN LAK-347 +124EC CUNEIFORM SIGN LAK-348 +124ED CUNEIFORM SIGN LAK-383 +124EE CUNEIFORM SIGN LAK-384 +124EF CUNEIFORM SIGN LAK-390 +124F0 CUNEIFORM SIGN LAK-441 +124F1 CUNEIFORM SIGN LAK-449 +124F2 CUNEIFORM SIGN LAK-449 TIMES GU +124F3 CUNEIFORM SIGN LAK-449 TIMES IGI +124F4 CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3 +124F5 CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3 +124F6 CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA +124F7 CUNEIFORM SIGN LAK-450 +124F8 CUNEIFORM SIGN LAK-457 +124F9 CUNEIFORM SIGN LAK-470 +124FA CUNEIFORM SIGN LAK-483 +124FB CUNEIFORM SIGN LAK-490 +124FC CUNEIFORM SIGN LAK-492 +124FD CUNEIFORM SIGN LAK-493 +124FE CUNEIFORM SIGN LAK-495 +124FF CUNEIFORM SIGN LAK-550 +12500 CUNEIFORM SIGN LAK-608 +12501 CUNEIFORM SIGN LAK-617 +12502 CUNEIFORM SIGN LAK-617 TIMES ASH +12503 CUNEIFORM SIGN LAK-617 TIMES BAD +12504 CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU +12505 CUNEIFORM SIGN LAK-617 TIMES KU3 +12506 CUNEIFORM SIGN LAK-617 TIMES LA +12507 CUNEIFORM SIGN LAK-617 TIMES TAR +12508 CUNEIFORM SIGN LAK-617 TIMES TE +12509 CUNEIFORM SIGN LAK-617 TIMES U2 +1250A CUNEIFORM SIGN LAK-617 TIMES UD +1250B CUNEIFORM SIGN LAK-617 TIMES URUDA +1250C CUNEIFORM SIGN LAK-636 +1250D CUNEIFORM SIGN LAK-648 +1250E CUNEIFORM SIGN LAK-648 TIMES DUB +1250F CUNEIFORM SIGN LAK-648 TIMES GA +12510 CUNEIFORM SIGN LAK-648 TIMES IGI +12511 CUNEIFORM SIGN LAK-648 TIMES IGI GUNU +12512 CUNEIFORM SIGN LAK-648 TIMES NI +12513 CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3 +12514 CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI +12515 CUNEIFORM SIGN LAK-648 TIMES UD +12516 CUNEIFORM SIGN LAK-648 TIMES URUDA +12517 CUNEIFORM SIGN LAK-724 +12518 CUNEIFORM SIGN LAK-749 +12519 CUNEIFORM SIGN LU2 GUNU TIMES ASH +1251A CUNEIFORM SIGN LU2 TIMES DISH +1251B CUNEIFORM SIGN LU2 TIMES HAL +1251C CUNEIFORM SIGN LU2 TIMES PAP +1251D CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3 +1251E CUNEIFORM SIGN LU2 TIMES TAK4 +1251F CUNEIFORM SIGN MI PLUS ZA7 +12520 CUNEIFORM SIGN MUSH OVER MUSH TIMES GA +12521 CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK +12522 CUNEIFORM SIGN NINDA2 TIMES DIM GUNU +12523 CUNEIFORM SIGN NINDA2 TIMES GISH +12524 CUNEIFORM SIGN NINDA2 TIMES GUL +12525 CUNEIFORM SIGN NINDA2 TIMES HI +12526 CUNEIFORM SIGN NINDA2 TIMES KESH2 +12527 CUNEIFORM SIGN NINDA2 TIMES LAK-050 +12528 CUNEIFORM SIGN NINDA2 TIMES MASH +12529 CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP +1252A CUNEIFORM SIGN NINDA2 TIMES U +1252B CUNEIFORM SIGN NINDA2 TIMES U PLUS U +1252C CUNEIFORM SIGN NINDA2 TIMES URUDA +1252D CUNEIFORM SIGN SAG GUNU TIMES HA +1252E CUNEIFORM SIGN SAG TIMES EN +1252F CUNEIFORM SIGN SAG TIMES SHE AT LEFT +12530 CUNEIFORM SIGN SAG TIMES TAK4 +12531 CUNEIFORM SIGN SHA6 TENU +12532 CUNEIFORM SIGN SHE OVER SHE +12533 CUNEIFORM SIGN SHE PLUS HUB2 +12534 CUNEIFORM SIGN SHE PLUS NAM2 +12535 CUNEIFORM SIGN SHE PLUS SAR +12536 CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI +12537 CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN +12538 CUNEIFORM SIGN SI TIMES TAK4 +12539 CUNEIFORM SIGN TAK4 PLUS SAG +1253A CUNEIFORM SIGN TUM TIMES GAN2 TENU +1253B CUNEIFORM SIGN TUM TIMES THREE DISH +1253C CUNEIFORM SIGN UR2 INVERTED +1253D CUNEIFORM SIGN UR2 TIMES UD +1253E CUNEIFORM SIGN URU TIMES DARA3 +1253F CUNEIFORM SIGN URU TIMES LAK-668 +12540 CUNEIFORM SIGN URU TIMES LU3 +12541 CUNEIFORM SIGN ZA7 +12542 CUNEIFORM SIGN ZU OVER ZU PLUS SAR +12543 CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +13000 EGYPTIAN HIEROGLYPH A001 +13001 EGYPTIAN HIEROGLYPH A002 +13002 EGYPTIAN HIEROGLYPH A003 +13003 EGYPTIAN HIEROGLYPH A004 +13004 EGYPTIAN HIEROGLYPH A005 +13005 EGYPTIAN HIEROGLYPH A005A +13006 EGYPTIAN HIEROGLYPH A006 +13007 EGYPTIAN HIEROGLYPH A006A +13008 EGYPTIAN HIEROGLYPH A006B +13009 EGYPTIAN HIEROGLYPH A007 +1300A EGYPTIAN HIEROGLYPH A008 +1300B EGYPTIAN HIEROGLYPH A009 +1300C EGYPTIAN HIEROGLYPH A010 +1300D EGYPTIAN HIEROGLYPH A011 +1300E EGYPTIAN HIEROGLYPH A012 +1300F EGYPTIAN HIEROGLYPH A013 +13010 EGYPTIAN HIEROGLYPH A014 +13011 EGYPTIAN HIEROGLYPH A014A +13012 EGYPTIAN HIEROGLYPH A015 +13013 EGYPTIAN HIEROGLYPH A016 +13014 EGYPTIAN HIEROGLYPH A017 +13015 EGYPTIAN HIEROGLYPH A017A +13016 EGYPTIAN HIEROGLYPH A018 +13017 EGYPTIAN HIEROGLYPH A019 +13018 EGYPTIAN HIEROGLYPH A020 +13019 EGYPTIAN HIEROGLYPH A021 +1301A EGYPTIAN HIEROGLYPH A022 +1301B EGYPTIAN HIEROGLYPH A023 +1301C EGYPTIAN HIEROGLYPH A024 +1301D EGYPTIAN HIEROGLYPH A025 +1301E EGYPTIAN HIEROGLYPH A026 +1301F EGYPTIAN HIEROGLYPH A027 +13020 EGYPTIAN HIEROGLYPH A028 +13021 EGYPTIAN HIEROGLYPH A029 +13022 EGYPTIAN HIEROGLYPH A030 +13023 EGYPTIAN HIEROGLYPH A031 +13024 EGYPTIAN HIEROGLYPH A032 +13025 EGYPTIAN HIEROGLYPH A032A +13026 EGYPTIAN HIEROGLYPH A033 +13027 EGYPTIAN HIEROGLYPH A034 +13028 EGYPTIAN HIEROGLYPH A035 +13029 EGYPTIAN HIEROGLYPH A036 +1302A EGYPTIAN HIEROGLYPH A037 +1302B EGYPTIAN HIEROGLYPH A038 +1302C EGYPTIAN HIEROGLYPH A039 +1302D EGYPTIAN HIEROGLYPH A040 +1302E EGYPTIAN HIEROGLYPH A040A +1302F EGYPTIAN HIEROGLYPH A041 +13030 EGYPTIAN HIEROGLYPH A042 +13031 EGYPTIAN HIEROGLYPH A042A +13032 EGYPTIAN HIEROGLYPH A043 +13033 EGYPTIAN HIEROGLYPH A043A +13034 EGYPTIAN HIEROGLYPH A044 +13035 EGYPTIAN HIEROGLYPH A045 +13036 EGYPTIAN HIEROGLYPH A045A +13037 EGYPTIAN HIEROGLYPH A046 +13038 EGYPTIAN HIEROGLYPH A047 +13039 EGYPTIAN HIEROGLYPH A048 +1303A EGYPTIAN HIEROGLYPH A049 +1303B EGYPTIAN HIEROGLYPH A050 +1303C EGYPTIAN HIEROGLYPH A051 +1303D EGYPTIAN HIEROGLYPH A052 +1303E EGYPTIAN HIEROGLYPH A053 +1303F EGYPTIAN HIEROGLYPH A054 +13040 EGYPTIAN HIEROGLYPH A055 +13041 EGYPTIAN HIEROGLYPH A056 +13042 EGYPTIAN HIEROGLYPH A057 +13043 EGYPTIAN HIEROGLYPH A058 +13044 EGYPTIAN HIEROGLYPH A059 +13045 EGYPTIAN HIEROGLYPH A060 +13046 EGYPTIAN HIEROGLYPH A061 +13047 EGYPTIAN HIEROGLYPH A062 +13048 EGYPTIAN HIEROGLYPH A063 +13049 EGYPTIAN HIEROGLYPH A064 +1304A EGYPTIAN HIEROGLYPH A065 +1304B EGYPTIAN HIEROGLYPH A066 +1304C EGYPTIAN HIEROGLYPH A067 +1304D EGYPTIAN HIEROGLYPH A068 +1304E EGYPTIAN HIEROGLYPH A069 +1304F EGYPTIAN HIEROGLYPH A070 +13050 EGYPTIAN HIEROGLYPH B001 +13051 EGYPTIAN HIEROGLYPH B002 +13052 EGYPTIAN HIEROGLYPH B003 +13053 EGYPTIAN HIEROGLYPH B004 +13054 EGYPTIAN HIEROGLYPH B005 +13055 EGYPTIAN HIEROGLYPH B005A +13056 EGYPTIAN HIEROGLYPH B006 +13057 EGYPTIAN HIEROGLYPH B007 +13058 EGYPTIAN HIEROGLYPH B008 +13059 EGYPTIAN HIEROGLYPH B009 +1305A EGYPTIAN HIEROGLYPH C001 +1305B EGYPTIAN HIEROGLYPH C002 +1305C EGYPTIAN HIEROGLYPH C002A +1305D EGYPTIAN HIEROGLYPH C002B +1305E EGYPTIAN HIEROGLYPH C002C +1305F EGYPTIAN HIEROGLYPH C003 +13060 EGYPTIAN HIEROGLYPH C004 +13061 EGYPTIAN HIEROGLYPH C005 +13062 EGYPTIAN HIEROGLYPH C006 +13063 EGYPTIAN HIEROGLYPH C007 +13064 EGYPTIAN HIEROGLYPH C008 +13065 EGYPTIAN HIEROGLYPH C009 +13066 EGYPTIAN HIEROGLYPH C010 +13067 EGYPTIAN HIEROGLYPH C010A +13068 EGYPTIAN HIEROGLYPH C011 +13069 EGYPTIAN HIEROGLYPH C012 +1306A EGYPTIAN HIEROGLYPH C013 +1306B EGYPTIAN HIEROGLYPH C014 +1306C EGYPTIAN HIEROGLYPH C015 +1306D EGYPTIAN HIEROGLYPH C016 +1306E EGYPTIAN HIEROGLYPH C017 +1306F EGYPTIAN HIEROGLYPH C018 +13070 EGYPTIAN HIEROGLYPH C019 +13071 EGYPTIAN HIEROGLYPH C020 +13072 EGYPTIAN HIEROGLYPH C021 +13073 EGYPTIAN HIEROGLYPH C022 +13074 EGYPTIAN HIEROGLYPH C023 +13075 EGYPTIAN HIEROGLYPH C024 +13076 EGYPTIAN HIEROGLYPH D001 +13077 EGYPTIAN HIEROGLYPH D002 +13078 EGYPTIAN HIEROGLYPH D003 +13079 EGYPTIAN HIEROGLYPH D004 +1307A EGYPTIAN HIEROGLYPH D005 +1307B EGYPTIAN HIEROGLYPH D006 +1307C EGYPTIAN HIEROGLYPH D007 +1307D EGYPTIAN HIEROGLYPH D008 +1307E EGYPTIAN HIEROGLYPH D008A +1307F EGYPTIAN HIEROGLYPH D009 +13080 EGYPTIAN HIEROGLYPH D010 +13081 EGYPTIAN HIEROGLYPH D011 +13082 EGYPTIAN HIEROGLYPH D012 +13083 EGYPTIAN HIEROGLYPH D013 +13084 EGYPTIAN HIEROGLYPH D014 +13085 EGYPTIAN HIEROGLYPH D015 +13086 EGYPTIAN HIEROGLYPH D016 +13087 EGYPTIAN HIEROGLYPH D017 +13088 EGYPTIAN HIEROGLYPH D018 +13089 EGYPTIAN HIEROGLYPH D019 +1308A EGYPTIAN HIEROGLYPH D020 +1308B EGYPTIAN HIEROGLYPH D021 +1308C EGYPTIAN HIEROGLYPH D022 +1308D EGYPTIAN HIEROGLYPH D023 +1308E EGYPTIAN HIEROGLYPH D024 +1308F EGYPTIAN HIEROGLYPH D025 +13090 EGYPTIAN HIEROGLYPH D026 +13091 EGYPTIAN HIEROGLYPH D027 +13092 EGYPTIAN HIEROGLYPH D027A +13093 EGYPTIAN HIEROGLYPH D028 +13094 EGYPTIAN HIEROGLYPH D029 +13095 EGYPTIAN HIEROGLYPH D030 +13096 EGYPTIAN HIEROGLYPH D031 +13097 EGYPTIAN HIEROGLYPH D031A +13098 EGYPTIAN HIEROGLYPH D032 +13099 EGYPTIAN HIEROGLYPH D033 +1309A EGYPTIAN HIEROGLYPH D034 +1309B EGYPTIAN HIEROGLYPH D034A +1309C EGYPTIAN HIEROGLYPH D035 +1309D EGYPTIAN HIEROGLYPH D036 +1309E EGYPTIAN HIEROGLYPH D037 +1309F EGYPTIAN HIEROGLYPH D038 +130A0 EGYPTIAN HIEROGLYPH D039 +130A1 EGYPTIAN HIEROGLYPH D040 +130A2 EGYPTIAN HIEROGLYPH D041 +130A3 EGYPTIAN HIEROGLYPH D042 +130A4 EGYPTIAN HIEROGLYPH D043 +130A5 EGYPTIAN HIEROGLYPH D044 +130A6 EGYPTIAN HIEROGLYPH D045 +130A7 EGYPTIAN HIEROGLYPH D046 +130A8 EGYPTIAN HIEROGLYPH D046A +130A9 EGYPTIAN HIEROGLYPH D047 +130AA EGYPTIAN HIEROGLYPH D048 +130AB EGYPTIAN HIEROGLYPH D048A +130AC EGYPTIAN HIEROGLYPH D049 +130AD EGYPTIAN HIEROGLYPH D050 +130AE EGYPTIAN HIEROGLYPH D050A +130AF EGYPTIAN HIEROGLYPH D050B +130B0 EGYPTIAN HIEROGLYPH D050C +130B1 EGYPTIAN HIEROGLYPH D050D +130B2 EGYPTIAN HIEROGLYPH D050E +130B3 EGYPTIAN HIEROGLYPH D050F +130B4 EGYPTIAN HIEROGLYPH D050G +130B5 EGYPTIAN HIEROGLYPH D050H +130B6 EGYPTIAN HIEROGLYPH D050I +130B7 EGYPTIAN HIEROGLYPH D051 +130B8 EGYPTIAN HIEROGLYPH D052 +130B9 EGYPTIAN HIEROGLYPH D052A +130BA EGYPTIAN HIEROGLYPH D053 +130BB EGYPTIAN HIEROGLYPH D054 +130BC EGYPTIAN HIEROGLYPH D054A +130BD EGYPTIAN HIEROGLYPH D055 +130BE EGYPTIAN HIEROGLYPH D056 +130BF EGYPTIAN HIEROGLYPH D057 +130C0 EGYPTIAN HIEROGLYPH D058 +130C1 EGYPTIAN HIEROGLYPH D059 +130C2 EGYPTIAN HIEROGLYPH D060 +130C3 EGYPTIAN HIEROGLYPH D061 +130C4 EGYPTIAN HIEROGLYPH D062 +130C5 EGYPTIAN HIEROGLYPH D063 +130C6 EGYPTIAN HIEROGLYPH D064 +130C7 EGYPTIAN HIEROGLYPH D065 +130C8 EGYPTIAN HIEROGLYPH D066 +130C9 EGYPTIAN HIEROGLYPH D067 +130CA EGYPTIAN HIEROGLYPH D067A +130CB EGYPTIAN HIEROGLYPH D067B +130CC EGYPTIAN HIEROGLYPH D067C +130CD EGYPTIAN HIEROGLYPH D067D +130CE EGYPTIAN HIEROGLYPH D067E +130CF EGYPTIAN HIEROGLYPH D067F +130D0 EGYPTIAN HIEROGLYPH D067G +130D1 EGYPTIAN HIEROGLYPH D067H +130D2 EGYPTIAN HIEROGLYPH E001 +130D3 EGYPTIAN HIEROGLYPH E002 +130D4 EGYPTIAN HIEROGLYPH E003 +130D5 EGYPTIAN HIEROGLYPH E004 +130D6 EGYPTIAN HIEROGLYPH E005 +130D7 EGYPTIAN HIEROGLYPH E006 +130D8 EGYPTIAN HIEROGLYPH E007 +130D9 EGYPTIAN HIEROGLYPH E008 +130DA EGYPTIAN HIEROGLYPH E008A +130DB EGYPTIAN HIEROGLYPH E009 +130DC EGYPTIAN HIEROGLYPH E009A +130DD EGYPTIAN HIEROGLYPH E010 +130DE EGYPTIAN HIEROGLYPH E011 +130DF EGYPTIAN HIEROGLYPH E012 +130E0 EGYPTIAN HIEROGLYPH E013 +130E1 EGYPTIAN HIEROGLYPH E014 +130E2 EGYPTIAN HIEROGLYPH E015 +130E3 EGYPTIAN HIEROGLYPH E016 +130E4 EGYPTIAN HIEROGLYPH E016A +130E5 EGYPTIAN HIEROGLYPH E017 +130E6 EGYPTIAN HIEROGLYPH E017A +130E7 EGYPTIAN HIEROGLYPH E018 +130E8 EGYPTIAN HIEROGLYPH E019 +130E9 EGYPTIAN HIEROGLYPH E020 +130EA EGYPTIAN HIEROGLYPH E020A +130EB EGYPTIAN HIEROGLYPH E021 +130EC EGYPTIAN HIEROGLYPH E022 +130ED EGYPTIAN HIEROGLYPH E023 +130EE EGYPTIAN HIEROGLYPH E024 +130EF EGYPTIAN HIEROGLYPH E025 +130F0 EGYPTIAN HIEROGLYPH E026 +130F1 EGYPTIAN HIEROGLYPH E027 +130F2 EGYPTIAN HIEROGLYPH E028 +130F3 EGYPTIAN HIEROGLYPH E028A +130F4 EGYPTIAN HIEROGLYPH E029 +130F5 EGYPTIAN HIEROGLYPH E030 +130F6 EGYPTIAN HIEROGLYPH E031 +130F7 EGYPTIAN HIEROGLYPH E032 +130F8 EGYPTIAN HIEROGLYPH E033 +130F9 EGYPTIAN HIEROGLYPH E034 +130FA EGYPTIAN HIEROGLYPH E034A +130FB EGYPTIAN HIEROGLYPH E036 +130FC EGYPTIAN HIEROGLYPH E037 +130FD EGYPTIAN HIEROGLYPH E038 +130FE EGYPTIAN HIEROGLYPH F001 +130FF EGYPTIAN HIEROGLYPH F001A +13100 EGYPTIAN HIEROGLYPH F002 +13101 EGYPTIAN HIEROGLYPH F003 +13102 EGYPTIAN HIEROGLYPH F004 +13103 EGYPTIAN HIEROGLYPH F005 +13104 EGYPTIAN HIEROGLYPH F006 +13105 EGYPTIAN HIEROGLYPH F007 +13106 EGYPTIAN HIEROGLYPH F008 +13107 EGYPTIAN HIEROGLYPH F009 +13108 EGYPTIAN HIEROGLYPH F010 +13109 EGYPTIAN HIEROGLYPH F011 +1310A EGYPTIAN HIEROGLYPH F012 +1310B EGYPTIAN HIEROGLYPH F013 +1310C EGYPTIAN HIEROGLYPH F013A +1310D EGYPTIAN HIEROGLYPH F014 +1310E EGYPTIAN HIEROGLYPH F015 +1310F EGYPTIAN HIEROGLYPH F016 +13110 EGYPTIAN HIEROGLYPH F017 +13111 EGYPTIAN HIEROGLYPH F018 +13112 EGYPTIAN HIEROGLYPH F019 +13113 EGYPTIAN HIEROGLYPH F020 +13114 EGYPTIAN HIEROGLYPH F021 +13115 EGYPTIAN HIEROGLYPH F021A +13116 EGYPTIAN HIEROGLYPH F022 +13117 EGYPTIAN HIEROGLYPH F023 +13118 EGYPTIAN HIEROGLYPH F024 +13119 EGYPTIAN HIEROGLYPH F025 +1311A EGYPTIAN HIEROGLYPH F026 +1311B EGYPTIAN HIEROGLYPH F027 +1311C EGYPTIAN HIEROGLYPH F028 +1311D EGYPTIAN HIEROGLYPH F029 +1311E EGYPTIAN HIEROGLYPH F030 +1311F EGYPTIAN HIEROGLYPH F031 +13120 EGYPTIAN HIEROGLYPH F031A +13121 EGYPTIAN HIEROGLYPH F032 +13122 EGYPTIAN HIEROGLYPH F033 +13123 EGYPTIAN HIEROGLYPH F034 +13124 EGYPTIAN HIEROGLYPH F035 +13125 EGYPTIAN HIEROGLYPH F036 +13126 EGYPTIAN HIEROGLYPH F037 +13127 EGYPTIAN HIEROGLYPH F037A +13128 EGYPTIAN HIEROGLYPH F038 +13129 EGYPTIAN HIEROGLYPH F038A +1312A EGYPTIAN HIEROGLYPH F039 +1312B EGYPTIAN HIEROGLYPH F040 +1312C EGYPTIAN HIEROGLYPH F041 +1312D EGYPTIAN HIEROGLYPH F042 +1312E EGYPTIAN HIEROGLYPH F043 +1312F EGYPTIAN HIEROGLYPH F044 +13130 EGYPTIAN HIEROGLYPH F045 +13131 EGYPTIAN HIEROGLYPH F045A +13132 EGYPTIAN HIEROGLYPH F046 +13133 EGYPTIAN HIEROGLYPH F046A +13134 EGYPTIAN HIEROGLYPH F047 +13135 EGYPTIAN HIEROGLYPH F047A +13136 EGYPTIAN HIEROGLYPH F048 +13137 EGYPTIAN HIEROGLYPH F049 +13138 EGYPTIAN HIEROGLYPH F050 +13139 EGYPTIAN HIEROGLYPH F051 +1313A EGYPTIAN HIEROGLYPH F051A +1313B EGYPTIAN HIEROGLYPH F051B +1313C EGYPTIAN HIEROGLYPH F051C +1313D EGYPTIAN HIEROGLYPH F052 +1313E EGYPTIAN HIEROGLYPH F053 +1313F EGYPTIAN HIEROGLYPH G001 +13140 EGYPTIAN HIEROGLYPH G002 +13141 EGYPTIAN HIEROGLYPH G003 +13142 EGYPTIAN HIEROGLYPH G004 +13143 EGYPTIAN HIEROGLYPH G005 +13144 EGYPTIAN HIEROGLYPH G006 +13145 EGYPTIAN HIEROGLYPH G006A +13146 EGYPTIAN HIEROGLYPH G007 +13147 EGYPTIAN HIEROGLYPH G007A +13148 EGYPTIAN HIEROGLYPH G007B +13149 EGYPTIAN HIEROGLYPH G008 +1314A EGYPTIAN HIEROGLYPH G009 +1314B EGYPTIAN HIEROGLYPH G010 +1314C EGYPTIAN HIEROGLYPH G011 +1314D EGYPTIAN HIEROGLYPH G011A +1314E EGYPTIAN HIEROGLYPH G012 +1314F EGYPTIAN HIEROGLYPH G013 +13150 EGYPTIAN HIEROGLYPH G014 +13151 EGYPTIAN HIEROGLYPH G015 +13152 EGYPTIAN HIEROGLYPH G016 +13153 EGYPTIAN HIEROGLYPH G017 +13154 EGYPTIAN HIEROGLYPH G018 +13155 EGYPTIAN HIEROGLYPH G019 +13156 EGYPTIAN HIEROGLYPH G020 +13157 EGYPTIAN HIEROGLYPH G020A +13158 EGYPTIAN HIEROGLYPH G021 +13159 EGYPTIAN HIEROGLYPH G022 +1315A EGYPTIAN HIEROGLYPH G023 +1315B EGYPTIAN HIEROGLYPH G024 +1315C EGYPTIAN HIEROGLYPH G025 +1315D EGYPTIAN HIEROGLYPH G026 +1315E EGYPTIAN HIEROGLYPH G026A +1315F EGYPTIAN HIEROGLYPH G027 +13160 EGYPTIAN HIEROGLYPH G028 +13161 EGYPTIAN HIEROGLYPH G029 +13162 EGYPTIAN HIEROGLYPH G030 +13163 EGYPTIAN HIEROGLYPH G031 +13164 EGYPTIAN HIEROGLYPH G032 +13165 EGYPTIAN HIEROGLYPH G033 +13166 EGYPTIAN HIEROGLYPH G034 +13167 EGYPTIAN HIEROGLYPH G035 +13168 EGYPTIAN HIEROGLYPH G036 +13169 EGYPTIAN HIEROGLYPH G036A +1316A EGYPTIAN HIEROGLYPH G037 +1316B EGYPTIAN HIEROGLYPH G037A +1316C EGYPTIAN HIEROGLYPH G038 +1316D EGYPTIAN HIEROGLYPH G039 +1316E EGYPTIAN HIEROGLYPH G040 +1316F EGYPTIAN HIEROGLYPH G041 +13170 EGYPTIAN HIEROGLYPH G042 +13171 EGYPTIAN HIEROGLYPH G043 +13172 EGYPTIAN HIEROGLYPH G043A +13173 EGYPTIAN HIEROGLYPH G044 +13174 EGYPTIAN HIEROGLYPH G045 +13175 EGYPTIAN HIEROGLYPH G045A +13176 EGYPTIAN HIEROGLYPH G046 +13177 EGYPTIAN HIEROGLYPH G047 +13178 EGYPTIAN HIEROGLYPH G048 +13179 EGYPTIAN HIEROGLYPH G049 +1317A EGYPTIAN HIEROGLYPH G050 +1317B EGYPTIAN HIEROGLYPH G051 +1317C EGYPTIAN HIEROGLYPH G052 +1317D EGYPTIAN HIEROGLYPH G053 +1317E EGYPTIAN HIEROGLYPH G054 +1317F EGYPTIAN HIEROGLYPH H001 +13180 EGYPTIAN HIEROGLYPH H002 +13181 EGYPTIAN HIEROGLYPH H003 +13182 EGYPTIAN HIEROGLYPH H004 +13183 EGYPTIAN HIEROGLYPH H005 +13184 EGYPTIAN HIEROGLYPH H006 +13185 EGYPTIAN HIEROGLYPH H006A +13186 EGYPTIAN HIEROGLYPH H007 +13187 EGYPTIAN HIEROGLYPH H008 +13188 EGYPTIAN HIEROGLYPH I001 +13189 EGYPTIAN HIEROGLYPH I002 +1318A EGYPTIAN HIEROGLYPH I003 +1318B EGYPTIAN HIEROGLYPH I004 +1318C EGYPTIAN HIEROGLYPH I005 +1318D EGYPTIAN HIEROGLYPH I005A +1318E EGYPTIAN HIEROGLYPH I006 +1318F EGYPTIAN HIEROGLYPH I007 +13190 EGYPTIAN HIEROGLYPH I008 +13191 EGYPTIAN HIEROGLYPH I009 +13192 EGYPTIAN HIEROGLYPH I009A +13193 EGYPTIAN HIEROGLYPH I010 +13194 EGYPTIAN HIEROGLYPH I010A +13195 EGYPTIAN HIEROGLYPH I011 +13196 EGYPTIAN HIEROGLYPH I011A +13197 EGYPTIAN HIEROGLYPH I012 +13198 EGYPTIAN HIEROGLYPH I013 +13199 EGYPTIAN HIEROGLYPH I014 +1319A EGYPTIAN HIEROGLYPH I015 +1319B EGYPTIAN HIEROGLYPH K001 +1319C EGYPTIAN HIEROGLYPH K002 +1319D EGYPTIAN HIEROGLYPH K003 +1319E EGYPTIAN HIEROGLYPH K004 +1319F EGYPTIAN HIEROGLYPH K005 +131A0 EGYPTIAN HIEROGLYPH K006 +131A1 EGYPTIAN HIEROGLYPH K007 +131A2 EGYPTIAN HIEROGLYPH K008 +131A3 EGYPTIAN HIEROGLYPH L001 +131A4 EGYPTIAN HIEROGLYPH L002 +131A5 EGYPTIAN HIEROGLYPH L002A +131A6 EGYPTIAN HIEROGLYPH L003 +131A7 EGYPTIAN HIEROGLYPH L004 +131A8 EGYPTIAN HIEROGLYPH L005 +131A9 EGYPTIAN HIEROGLYPH L006 +131AA EGYPTIAN HIEROGLYPH L006A +131AB EGYPTIAN HIEROGLYPH L007 +131AC EGYPTIAN HIEROGLYPH L008 +131AD EGYPTIAN HIEROGLYPH M001 +131AE EGYPTIAN HIEROGLYPH M001A +131AF EGYPTIAN HIEROGLYPH M001B +131B0 EGYPTIAN HIEROGLYPH M002 +131B1 EGYPTIAN HIEROGLYPH M003 +131B2 EGYPTIAN HIEROGLYPH M003A +131B3 EGYPTIAN HIEROGLYPH M004 +131B4 EGYPTIAN HIEROGLYPH M005 +131B5 EGYPTIAN HIEROGLYPH M006 +131B6 EGYPTIAN HIEROGLYPH M007 +131B7 EGYPTIAN HIEROGLYPH M008 +131B8 EGYPTIAN HIEROGLYPH M009 +131B9 EGYPTIAN HIEROGLYPH M010 +131BA EGYPTIAN HIEROGLYPH M010A +131BB EGYPTIAN HIEROGLYPH M011 +131BC EGYPTIAN HIEROGLYPH M012 +131BD EGYPTIAN HIEROGLYPH M012A +131BE EGYPTIAN HIEROGLYPH M012B +131BF EGYPTIAN HIEROGLYPH M012C +131C0 EGYPTIAN HIEROGLYPH M012D +131C1 EGYPTIAN HIEROGLYPH M012E +131C2 EGYPTIAN HIEROGLYPH M012F +131C3 EGYPTIAN HIEROGLYPH M012G +131C4 EGYPTIAN HIEROGLYPH M012H +131C5 EGYPTIAN HIEROGLYPH M013 +131C6 EGYPTIAN HIEROGLYPH M014 +131C7 EGYPTIAN HIEROGLYPH M015 +131C8 EGYPTIAN HIEROGLYPH M015A +131C9 EGYPTIAN HIEROGLYPH M016 +131CA EGYPTIAN HIEROGLYPH M016A +131CB EGYPTIAN HIEROGLYPH M017 +131CC EGYPTIAN HIEROGLYPH M017A +131CD EGYPTIAN HIEROGLYPH M018 +131CE EGYPTIAN HIEROGLYPH M019 +131CF EGYPTIAN HIEROGLYPH M020 +131D0 EGYPTIAN HIEROGLYPH M021 +131D1 EGYPTIAN HIEROGLYPH M022 +131D2 EGYPTIAN HIEROGLYPH M022A +131D3 EGYPTIAN HIEROGLYPH M023 +131D4 EGYPTIAN HIEROGLYPH M024 +131D5 EGYPTIAN HIEROGLYPH M024A +131D6 EGYPTIAN HIEROGLYPH M025 +131D7 EGYPTIAN HIEROGLYPH M026 +131D8 EGYPTIAN HIEROGLYPH M027 +131D9 EGYPTIAN HIEROGLYPH M028 +131DA EGYPTIAN HIEROGLYPH M028A +131DB EGYPTIAN HIEROGLYPH M029 +131DC EGYPTIAN HIEROGLYPH M030 +131DD EGYPTIAN HIEROGLYPH M031 +131DE EGYPTIAN HIEROGLYPH M031A +131DF EGYPTIAN HIEROGLYPH M032 +131E0 EGYPTIAN HIEROGLYPH M033 +131E1 EGYPTIAN HIEROGLYPH M033A +131E2 EGYPTIAN HIEROGLYPH M033B +131E3 EGYPTIAN HIEROGLYPH M034 +131E4 EGYPTIAN HIEROGLYPH M035 +131E5 EGYPTIAN HIEROGLYPH M036 +131E6 EGYPTIAN HIEROGLYPH M037 +131E7 EGYPTIAN HIEROGLYPH M038 +131E8 EGYPTIAN HIEROGLYPH M039 +131E9 EGYPTIAN HIEROGLYPH M040 +131EA EGYPTIAN HIEROGLYPH M040A +131EB EGYPTIAN HIEROGLYPH M041 +131EC EGYPTIAN HIEROGLYPH M042 +131ED EGYPTIAN HIEROGLYPH M043 +131EE EGYPTIAN HIEROGLYPH M044 +131EF EGYPTIAN HIEROGLYPH N001 +131F0 EGYPTIAN HIEROGLYPH N002 +131F1 EGYPTIAN HIEROGLYPH N003 +131F2 EGYPTIAN HIEROGLYPH N004 +131F3 EGYPTIAN HIEROGLYPH N005 +131F4 EGYPTIAN HIEROGLYPH N006 +131F5 EGYPTIAN HIEROGLYPH N007 +131F6 EGYPTIAN HIEROGLYPH N008 +131F7 EGYPTIAN HIEROGLYPH N009 +131F8 EGYPTIAN HIEROGLYPH N010 +131F9 EGYPTIAN HIEROGLYPH N011 +131FA EGYPTIAN HIEROGLYPH N012 +131FB EGYPTIAN HIEROGLYPH N013 +131FC EGYPTIAN HIEROGLYPH N014 +131FD EGYPTIAN HIEROGLYPH N015 +131FE EGYPTIAN HIEROGLYPH N016 +131FF EGYPTIAN HIEROGLYPH N017 +13200 EGYPTIAN HIEROGLYPH N018 +13201 EGYPTIAN HIEROGLYPH N018A +13202 EGYPTIAN HIEROGLYPH N018B +13203 EGYPTIAN HIEROGLYPH N019 +13204 EGYPTIAN HIEROGLYPH N020 +13205 EGYPTIAN HIEROGLYPH N021 +13206 EGYPTIAN HIEROGLYPH N022 +13207 EGYPTIAN HIEROGLYPH N023 +13208 EGYPTIAN HIEROGLYPH N024 +13209 EGYPTIAN HIEROGLYPH N025 +1320A EGYPTIAN HIEROGLYPH N025A +1320B EGYPTIAN HIEROGLYPH N026 +1320C EGYPTIAN HIEROGLYPH N027 +1320D EGYPTIAN HIEROGLYPH N028 +1320E EGYPTIAN HIEROGLYPH N029 +1320F EGYPTIAN HIEROGLYPH N030 +13210 EGYPTIAN HIEROGLYPH N031 +13211 EGYPTIAN HIEROGLYPH N032 +13212 EGYPTIAN HIEROGLYPH N033 +13213 EGYPTIAN HIEROGLYPH N033A +13214 EGYPTIAN HIEROGLYPH N034 +13215 EGYPTIAN HIEROGLYPH N034A +13216 EGYPTIAN HIEROGLYPH N035 +13217 EGYPTIAN HIEROGLYPH N035A +13218 EGYPTIAN HIEROGLYPH N036 +13219 EGYPTIAN HIEROGLYPH N037 +1321A EGYPTIAN HIEROGLYPH N037A +1321B EGYPTIAN HIEROGLYPH N038 +1321C EGYPTIAN HIEROGLYPH N039 +1321D EGYPTIAN HIEROGLYPH N040 +1321E EGYPTIAN HIEROGLYPH N041 +1321F EGYPTIAN HIEROGLYPH N042 +13220 EGYPTIAN HIEROGLYPH NL001 +13221 EGYPTIAN HIEROGLYPH NL002 +13222 EGYPTIAN HIEROGLYPH NL003 +13223 EGYPTIAN HIEROGLYPH NL004 +13224 EGYPTIAN HIEROGLYPH NL005 +13225 EGYPTIAN HIEROGLYPH NL005A +13226 EGYPTIAN HIEROGLYPH NL006 +13227 EGYPTIAN HIEROGLYPH NL007 +13228 EGYPTIAN HIEROGLYPH NL008 +13229 EGYPTIAN HIEROGLYPH NL009 +1322A EGYPTIAN HIEROGLYPH NL010 +1322B EGYPTIAN HIEROGLYPH NL011 +1322C EGYPTIAN HIEROGLYPH NL012 +1322D EGYPTIAN HIEROGLYPH NL013 +1322E EGYPTIAN HIEROGLYPH NL014 +1322F EGYPTIAN HIEROGLYPH NL015 +13230 EGYPTIAN HIEROGLYPH NL016 +13231 EGYPTIAN HIEROGLYPH NL017 +13232 EGYPTIAN HIEROGLYPH NL017A +13233 EGYPTIAN HIEROGLYPH NL018 +13234 EGYPTIAN HIEROGLYPH NL019 +13235 EGYPTIAN HIEROGLYPH NL020 +13236 EGYPTIAN HIEROGLYPH NU001 +13237 EGYPTIAN HIEROGLYPH NU002 +13238 EGYPTIAN HIEROGLYPH NU003 +13239 EGYPTIAN HIEROGLYPH NU004 +1323A EGYPTIAN HIEROGLYPH NU005 +1323B EGYPTIAN HIEROGLYPH NU006 +1323C EGYPTIAN HIEROGLYPH NU007 +1323D EGYPTIAN HIEROGLYPH NU008 +1323E EGYPTIAN HIEROGLYPH NU009 +1323F EGYPTIAN HIEROGLYPH NU010 +13240 EGYPTIAN HIEROGLYPH NU010A +13241 EGYPTIAN HIEROGLYPH NU011 +13242 EGYPTIAN HIEROGLYPH NU011A +13243 EGYPTIAN HIEROGLYPH NU012 +13244 EGYPTIAN HIEROGLYPH NU013 +13245 EGYPTIAN HIEROGLYPH NU014 +13246 EGYPTIAN HIEROGLYPH NU015 +13247 EGYPTIAN HIEROGLYPH NU016 +13248 EGYPTIAN HIEROGLYPH NU017 +13249 EGYPTIAN HIEROGLYPH NU018 +1324A EGYPTIAN HIEROGLYPH NU018A +1324B EGYPTIAN HIEROGLYPH NU019 +1324C EGYPTIAN HIEROGLYPH NU020 +1324D EGYPTIAN HIEROGLYPH NU021 +1324E EGYPTIAN HIEROGLYPH NU022 +1324F EGYPTIAN HIEROGLYPH NU022A +13250 EGYPTIAN HIEROGLYPH O001 +13251 EGYPTIAN HIEROGLYPH O001A +13252 EGYPTIAN HIEROGLYPH O002 +13253 EGYPTIAN HIEROGLYPH O003 +13254 EGYPTIAN HIEROGLYPH O004 +13255 EGYPTIAN HIEROGLYPH O005 +13256 EGYPTIAN HIEROGLYPH O005A +13257 EGYPTIAN HIEROGLYPH O006 +13258 EGYPTIAN HIEROGLYPH O006A +13259 EGYPTIAN HIEROGLYPH O006B +1325A EGYPTIAN HIEROGLYPH O006C +1325B EGYPTIAN HIEROGLYPH O006D +1325C EGYPTIAN HIEROGLYPH O006E +1325D EGYPTIAN HIEROGLYPH O006F +1325E EGYPTIAN HIEROGLYPH O007 +1325F EGYPTIAN HIEROGLYPH O008 +13260 EGYPTIAN HIEROGLYPH O009 +13261 EGYPTIAN HIEROGLYPH O010 +13262 EGYPTIAN HIEROGLYPH O010A +13263 EGYPTIAN HIEROGLYPH O010B +13264 EGYPTIAN HIEROGLYPH O010C +13265 EGYPTIAN HIEROGLYPH O011 +13266 EGYPTIAN HIEROGLYPH O012 +13267 EGYPTIAN HIEROGLYPH O013 +13268 EGYPTIAN HIEROGLYPH O014 +13269 EGYPTIAN HIEROGLYPH O015 +1326A EGYPTIAN HIEROGLYPH O016 +1326B EGYPTIAN HIEROGLYPH O017 +1326C EGYPTIAN HIEROGLYPH O018 +1326D EGYPTIAN HIEROGLYPH O019 +1326E EGYPTIAN HIEROGLYPH O019A +1326F EGYPTIAN HIEROGLYPH O020 +13270 EGYPTIAN HIEROGLYPH O020A +13271 EGYPTIAN HIEROGLYPH O021 +13272 EGYPTIAN HIEROGLYPH O022 +13273 EGYPTIAN HIEROGLYPH O023 +13274 EGYPTIAN HIEROGLYPH O024 +13275 EGYPTIAN HIEROGLYPH O024A +13276 EGYPTIAN HIEROGLYPH O025 +13277 EGYPTIAN HIEROGLYPH O025A +13278 EGYPTIAN HIEROGLYPH O026 +13279 EGYPTIAN HIEROGLYPH O027 +1327A EGYPTIAN HIEROGLYPH O028 +1327B EGYPTIAN HIEROGLYPH O029 +1327C EGYPTIAN HIEROGLYPH O029A +1327D EGYPTIAN HIEROGLYPH O030 +1327E EGYPTIAN HIEROGLYPH O030A +1327F EGYPTIAN HIEROGLYPH O031 +13280 EGYPTIAN HIEROGLYPH O032 +13281 EGYPTIAN HIEROGLYPH O033 +13282 EGYPTIAN HIEROGLYPH O033A +13283 EGYPTIAN HIEROGLYPH O034 +13284 EGYPTIAN HIEROGLYPH O035 +13285 EGYPTIAN HIEROGLYPH O036 +13286 EGYPTIAN HIEROGLYPH O036A +13287 EGYPTIAN HIEROGLYPH O036B +13288 EGYPTIAN HIEROGLYPH O036C +13289 EGYPTIAN HIEROGLYPH O036D +1328A EGYPTIAN HIEROGLYPH O037 +1328B EGYPTIAN HIEROGLYPH O038 +1328C EGYPTIAN HIEROGLYPH O039 +1328D EGYPTIAN HIEROGLYPH O040 +1328E EGYPTIAN HIEROGLYPH O041 +1328F EGYPTIAN HIEROGLYPH O042 +13290 EGYPTIAN HIEROGLYPH O043 +13291 EGYPTIAN HIEROGLYPH O044 +13292 EGYPTIAN HIEROGLYPH O045 +13293 EGYPTIAN HIEROGLYPH O046 +13294 EGYPTIAN HIEROGLYPH O047 +13295 EGYPTIAN HIEROGLYPH O048 +13296 EGYPTIAN HIEROGLYPH O049 +13297 EGYPTIAN HIEROGLYPH O050 +13298 EGYPTIAN HIEROGLYPH O050A +13299 EGYPTIAN HIEROGLYPH O050B +1329A EGYPTIAN HIEROGLYPH O051 +1329B EGYPTIAN HIEROGLYPH P001 +1329C EGYPTIAN HIEROGLYPH P001A +1329D EGYPTIAN HIEROGLYPH P002 +1329E EGYPTIAN HIEROGLYPH P003 +1329F EGYPTIAN HIEROGLYPH P003A +132A0 EGYPTIAN HIEROGLYPH P004 +132A1 EGYPTIAN HIEROGLYPH P005 +132A2 EGYPTIAN HIEROGLYPH P006 +132A3 EGYPTIAN HIEROGLYPH P007 +132A4 EGYPTIAN HIEROGLYPH P008 +132A5 EGYPTIAN HIEROGLYPH P009 +132A6 EGYPTIAN HIEROGLYPH P010 +132A7 EGYPTIAN HIEROGLYPH P011 +132A8 EGYPTIAN HIEROGLYPH Q001 +132A9 EGYPTIAN HIEROGLYPH Q002 +132AA EGYPTIAN HIEROGLYPH Q003 +132AB EGYPTIAN HIEROGLYPH Q004 +132AC EGYPTIAN HIEROGLYPH Q005 +132AD EGYPTIAN HIEROGLYPH Q006 +132AE EGYPTIAN HIEROGLYPH Q007 +132AF EGYPTIAN HIEROGLYPH R001 +132B0 EGYPTIAN HIEROGLYPH R002 +132B1 EGYPTIAN HIEROGLYPH R002A +132B2 EGYPTIAN HIEROGLYPH R003 +132B3 EGYPTIAN HIEROGLYPH R003A +132B4 EGYPTIAN HIEROGLYPH R003B +132B5 EGYPTIAN HIEROGLYPH R004 +132B6 EGYPTIAN HIEROGLYPH R005 +132B7 EGYPTIAN HIEROGLYPH R006 +132B8 EGYPTIAN HIEROGLYPH R007 +132B9 EGYPTIAN HIEROGLYPH R008 +132BA EGYPTIAN HIEROGLYPH R009 +132BB EGYPTIAN HIEROGLYPH R010 +132BC EGYPTIAN HIEROGLYPH R010A +132BD EGYPTIAN HIEROGLYPH R011 +132BE EGYPTIAN HIEROGLYPH R012 +132BF EGYPTIAN HIEROGLYPH R013 +132C0 EGYPTIAN HIEROGLYPH R014 +132C1 EGYPTIAN HIEROGLYPH R015 +132C2 EGYPTIAN HIEROGLYPH R016 +132C3 EGYPTIAN HIEROGLYPH R016A +132C4 EGYPTIAN HIEROGLYPH R017 +132C5 EGYPTIAN HIEROGLYPH R018 +132C6 EGYPTIAN HIEROGLYPH R019 +132C7 EGYPTIAN HIEROGLYPH R020 +132C8 EGYPTIAN HIEROGLYPH R021 +132C9 EGYPTIAN HIEROGLYPH R022 +132CA EGYPTIAN HIEROGLYPH R023 +132CB EGYPTIAN HIEROGLYPH R024 +132CC EGYPTIAN HIEROGLYPH R025 +132CD EGYPTIAN HIEROGLYPH R026 +132CE EGYPTIAN HIEROGLYPH R027 +132CF EGYPTIAN HIEROGLYPH R028 +132D0 EGYPTIAN HIEROGLYPH R029 +132D1 EGYPTIAN HIEROGLYPH S001 +132D2 EGYPTIAN HIEROGLYPH S002 +132D3 EGYPTIAN HIEROGLYPH S002A +132D4 EGYPTIAN HIEROGLYPH S003 +132D5 EGYPTIAN HIEROGLYPH S004 +132D6 EGYPTIAN HIEROGLYPH S005 +132D7 EGYPTIAN HIEROGLYPH S006 +132D8 EGYPTIAN HIEROGLYPH S006A +132D9 EGYPTIAN HIEROGLYPH S007 +132DA EGYPTIAN HIEROGLYPH S008 +132DB EGYPTIAN HIEROGLYPH S009 +132DC EGYPTIAN HIEROGLYPH S010 +132DD EGYPTIAN HIEROGLYPH S011 +132DE EGYPTIAN HIEROGLYPH S012 +132DF EGYPTIAN HIEROGLYPH S013 +132E0 EGYPTIAN HIEROGLYPH S014 +132E1 EGYPTIAN HIEROGLYPH S014A +132E2 EGYPTIAN HIEROGLYPH S014B +132E3 EGYPTIAN HIEROGLYPH S015 +132E4 EGYPTIAN HIEROGLYPH S016 +132E5 EGYPTIAN HIEROGLYPH S017 +132E6 EGYPTIAN HIEROGLYPH S017A +132E7 EGYPTIAN HIEROGLYPH S018 +132E8 EGYPTIAN HIEROGLYPH S019 +132E9 EGYPTIAN HIEROGLYPH S020 +132EA EGYPTIAN HIEROGLYPH S021 +132EB EGYPTIAN HIEROGLYPH S022 +132EC EGYPTIAN HIEROGLYPH S023 +132ED EGYPTIAN HIEROGLYPH S024 +132EE EGYPTIAN HIEROGLYPH S025 +132EF EGYPTIAN HIEROGLYPH S026 +132F0 EGYPTIAN HIEROGLYPH S026A +132F1 EGYPTIAN HIEROGLYPH S026B +132F2 EGYPTIAN HIEROGLYPH S027 +132F3 EGYPTIAN HIEROGLYPH S028 +132F4 EGYPTIAN HIEROGLYPH S029 +132F5 EGYPTIAN HIEROGLYPH S030 +132F6 EGYPTIAN HIEROGLYPH S031 +132F7 EGYPTIAN HIEROGLYPH S032 +132F8 EGYPTIAN HIEROGLYPH S033 +132F9 EGYPTIAN HIEROGLYPH S034 +132FA EGYPTIAN HIEROGLYPH S035 +132FB EGYPTIAN HIEROGLYPH S035A +132FC EGYPTIAN HIEROGLYPH S036 +132FD EGYPTIAN HIEROGLYPH S037 +132FE EGYPTIAN HIEROGLYPH S038 +132FF EGYPTIAN HIEROGLYPH S039 +13300 EGYPTIAN HIEROGLYPH S040 +13301 EGYPTIAN HIEROGLYPH S041 +13302 EGYPTIAN HIEROGLYPH S042 +13303 EGYPTIAN HIEROGLYPH S043 +13304 EGYPTIAN HIEROGLYPH S044 +13305 EGYPTIAN HIEROGLYPH S045 +13306 EGYPTIAN HIEROGLYPH S046 +13307 EGYPTIAN HIEROGLYPH T001 +13308 EGYPTIAN HIEROGLYPH T002 +13309 EGYPTIAN HIEROGLYPH T003 +1330A EGYPTIAN HIEROGLYPH T003A +1330B EGYPTIAN HIEROGLYPH T004 +1330C EGYPTIAN HIEROGLYPH T005 +1330D EGYPTIAN HIEROGLYPH T006 +1330E EGYPTIAN HIEROGLYPH T007 +1330F EGYPTIAN HIEROGLYPH T007A +13310 EGYPTIAN HIEROGLYPH T008 +13311 EGYPTIAN HIEROGLYPH T008A +13312 EGYPTIAN HIEROGLYPH T009 +13313 EGYPTIAN HIEROGLYPH T009A +13314 EGYPTIAN HIEROGLYPH T010 +13315 EGYPTIAN HIEROGLYPH T011 +13316 EGYPTIAN HIEROGLYPH T011A +13317 EGYPTIAN HIEROGLYPH T012 +13318 EGYPTIAN HIEROGLYPH T013 +13319 EGYPTIAN HIEROGLYPH T014 +1331A EGYPTIAN HIEROGLYPH T015 +1331B EGYPTIAN HIEROGLYPH T016 +1331C EGYPTIAN HIEROGLYPH T016A +1331D EGYPTIAN HIEROGLYPH T017 +1331E EGYPTIAN HIEROGLYPH T018 +1331F EGYPTIAN HIEROGLYPH T019 +13320 EGYPTIAN HIEROGLYPH T020 +13321 EGYPTIAN HIEROGLYPH T021 +13322 EGYPTIAN HIEROGLYPH T022 +13323 EGYPTIAN HIEROGLYPH T023 +13324 EGYPTIAN HIEROGLYPH T024 +13325 EGYPTIAN HIEROGLYPH T025 +13326 EGYPTIAN HIEROGLYPH T026 +13327 EGYPTIAN HIEROGLYPH T027 +13328 EGYPTIAN HIEROGLYPH T028 +13329 EGYPTIAN HIEROGLYPH T029 +1332A EGYPTIAN HIEROGLYPH T030 +1332B EGYPTIAN HIEROGLYPH T031 +1332C EGYPTIAN HIEROGLYPH T032 +1332D EGYPTIAN HIEROGLYPH T032A +1332E EGYPTIAN HIEROGLYPH T033 +1332F EGYPTIAN HIEROGLYPH T033A +13330 EGYPTIAN HIEROGLYPH T034 +13331 EGYPTIAN HIEROGLYPH T035 +13332 EGYPTIAN HIEROGLYPH T036 +13333 EGYPTIAN HIEROGLYPH U001 +13334 EGYPTIAN HIEROGLYPH U002 +13335 EGYPTIAN HIEROGLYPH U003 +13336 EGYPTIAN HIEROGLYPH U004 +13337 EGYPTIAN HIEROGLYPH U005 +13338 EGYPTIAN HIEROGLYPH U006 +13339 EGYPTIAN HIEROGLYPH U006A +1333A EGYPTIAN HIEROGLYPH U006B +1333B EGYPTIAN HIEROGLYPH U007 +1333C EGYPTIAN HIEROGLYPH U008 +1333D EGYPTIAN HIEROGLYPH U009 +1333E EGYPTIAN HIEROGLYPH U010 +1333F EGYPTIAN HIEROGLYPH U011 +13340 EGYPTIAN HIEROGLYPH U012 +13341 EGYPTIAN HIEROGLYPH U013 +13342 EGYPTIAN HIEROGLYPH U014 +13343 EGYPTIAN HIEROGLYPH U015 +13344 EGYPTIAN HIEROGLYPH U016 +13345 EGYPTIAN HIEROGLYPH U017 +13346 EGYPTIAN HIEROGLYPH U018 +13347 EGYPTIAN HIEROGLYPH U019 +13348 EGYPTIAN HIEROGLYPH U020 +13349 EGYPTIAN HIEROGLYPH U021 +1334A EGYPTIAN HIEROGLYPH U022 +1334B EGYPTIAN HIEROGLYPH U023 +1334C EGYPTIAN HIEROGLYPH U023A +1334D EGYPTIAN HIEROGLYPH U024 +1334E EGYPTIAN HIEROGLYPH U025 +1334F EGYPTIAN HIEROGLYPH U026 +13350 EGYPTIAN HIEROGLYPH U027 +13351 EGYPTIAN HIEROGLYPH U028 +13352 EGYPTIAN HIEROGLYPH U029 +13353 EGYPTIAN HIEROGLYPH U029A +13354 EGYPTIAN HIEROGLYPH U030 +13355 EGYPTIAN HIEROGLYPH U031 +13356 EGYPTIAN HIEROGLYPH U032 +13357 EGYPTIAN HIEROGLYPH U032A +13358 EGYPTIAN HIEROGLYPH U033 +13359 EGYPTIAN HIEROGLYPH U034 +1335A EGYPTIAN HIEROGLYPH U035 +1335B EGYPTIAN HIEROGLYPH U036 +1335C EGYPTIAN HIEROGLYPH U037 +1335D EGYPTIAN HIEROGLYPH U038 +1335E EGYPTIAN HIEROGLYPH U039 +1335F EGYPTIAN HIEROGLYPH U040 +13360 EGYPTIAN HIEROGLYPH U041 +13361 EGYPTIAN HIEROGLYPH U042 +13362 EGYPTIAN HIEROGLYPH V001 +13363 EGYPTIAN HIEROGLYPH V001A +13364 EGYPTIAN HIEROGLYPH V001B +13365 EGYPTIAN HIEROGLYPH V001C +13366 EGYPTIAN HIEROGLYPH V001D +13367 EGYPTIAN HIEROGLYPH V001E +13368 EGYPTIAN HIEROGLYPH V001F +13369 EGYPTIAN HIEROGLYPH V001G +1336A EGYPTIAN HIEROGLYPH V001H +1336B EGYPTIAN HIEROGLYPH V001I +1336C EGYPTIAN HIEROGLYPH V002 +1336D EGYPTIAN HIEROGLYPH V002A +1336E EGYPTIAN HIEROGLYPH V003 +1336F EGYPTIAN HIEROGLYPH V004 +13370 EGYPTIAN HIEROGLYPH V005 +13371 EGYPTIAN HIEROGLYPH V006 +13372 EGYPTIAN HIEROGLYPH V007 +13373 EGYPTIAN HIEROGLYPH V007A +13374 EGYPTIAN HIEROGLYPH V007B +13375 EGYPTIAN HIEROGLYPH V008 +13376 EGYPTIAN HIEROGLYPH V009 +13377 EGYPTIAN HIEROGLYPH V010 +13378 EGYPTIAN HIEROGLYPH V011 +13379 EGYPTIAN HIEROGLYPH V011A +1337A EGYPTIAN HIEROGLYPH V011B +1337B EGYPTIAN HIEROGLYPH V011C +1337C EGYPTIAN HIEROGLYPH V012 +1337D EGYPTIAN HIEROGLYPH V012A +1337E EGYPTIAN HIEROGLYPH V012B +1337F EGYPTIAN HIEROGLYPH V013 +13380 EGYPTIAN HIEROGLYPH V014 +13381 EGYPTIAN HIEROGLYPH V015 +13382 EGYPTIAN HIEROGLYPH V016 +13383 EGYPTIAN HIEROGLYPH V017 +13384 EGYPTIAN HIEROGLYPH V018 +13385 EGYPTIAN HIEROGLYPH V019 +13386 EGYPTIAN HIEROGLYPH V020 +13387 EGYPTIAN HIEROGLYPH V020A +13388 EGYPTIAN HIEROGLYPH V020B +13389 EGYPTIAN HIEROGLYPH V020C +1338A EGYPTIAN HIEROGLYPH V020D +1338B EGYPTIAN HIEROGLYPH V020E +1338C EGYPTIAN HIEROGLYPH V020F +1338D EGYPTIAN HIEROGLYPH V020G +1338E EGYPTIAN HIEROGLYPH V020H +1338F EGYPTIAN HIEROGLYPH V020I +13390 EGYPTIAN HIEROGLYPH V020J +13391 EGYPTIAN HIEROGLYPH V020K +13392 EGYPTIAN HIEROGLYPH V020L +13393 EGYPTIAN HIEROGLYPH V021 +13394 EGYPTIAN HIEROGLYPH V022 +13395 EGYPTIAN HIEROGLYPH V023 +13396 EGYPTIAN HIEROGLYPH V023A +13397 EGYPTIAN HIEROGLYPH V024 +13398 EGYPTIAN HIEROGLYPH V025 +13399 EGYPTIAN HIEROGLYPH V026 +1339A EGYPTIAN HIEROGLYPH V027 +1339B EGYPTIAN HIEROGLYPH V028 +1339C EGYPTIAN HIEROGLYPH V028A +1339D EGYPTIAN HIEROGLYPH V029 +1339E EGYPTIAN HIEROGLYPH V029A +1339F EGYPTIAN HIEROGLYPH V030 +133A0 EGYPTIAN HIEROGLYPH V030A +133A1 EGYPTIAN HIEROGLYPH V031 +133A2 EGYPTIAN HIEROGLYPH V031A +133A3 EGYPTIAN HIEROGLYPH V032 +133A4 EGYPTIAN HIEROGLYPH V033 +133A5 EGYPTIAN HIEROGLYPH V033A +133A6 EGYPTIAN HIEROGLYPH V034 +133A7 EGYPTIAN HIEROGLYPH V035 +133A8 EGYPTIAN HIEROGLYPH V036 +133A9 EGYPTIAN HIEROGLYPH V037 +133AA EGYPTIAN HIEROGLYPH V037A +133AB EGYPTIAN HIEROGLYPH V038 +133AC EGYPTIAN HIEROGLYPH V039 +133AD EGYPTIAN HIEROGLYPH V040 +133AE EGYPTIAN HIEROGLYPH V040A +133AF EGYPTIAN HIEROGLYPH W001 +133B0 EGYPTIAN HIEROGLYPH W002 +133B1 EGYPTIAN HIEROGLYPH W003 +133B2 EGYPTIAN HIEROGLYPH W003A +133B3 EGYPTIAN HIEROGLYPH W004 +133B4 EGYPTIAN HIEROGLYPH W005 +133B5 EGYPTIAN HIEROGLYPH W006 +133B6 EGYPTIAN HIEROGLYPH W007 +133B7 EGYPTIAN HIEROGLYPH W008 +133B8 EGYPTIAN HIEROGLYPH W009 +133B9 EGYPTIAN HIEROGLYPH W009A +133BA EGYPTIAN HIEROGLYPH W010 +133BB EGYPTIAN HIEROGLYPH W010A +133BC EGYPTIAN HIEROGLYPH W011 +133BD EGYPTIAN HIEROGLYPH W012 +133BE EGYPTIAN HIEROGLYPH W013 +133BF EGYPTIAN HIEROGLYPH W014 +133C0 EGYPTIAN HIEROGLYPH W014A +133C1 EGYPTIAN HIEROGLYPH W015 +133C2 EGYPTIAN HIEROGLYPH W016 +133C3 EGYPTIAN HIEROGLYPH W017 +133C4 EGYPTIAN HIEROGLYPH W017A +133C5 EGYPTIAN HIEROGLYPH W018 +133C6 EGYPTIAN HIEROGLYPH W018A +133C7 EGYPTIAN HIEROGLYPH W019 +133C8 EGYPTIAN HIEROGLYPH W020 +133C9 EGYPTIAN HIEROGLYPH W021 +133CA EGYPTIAN HIEROGLYPH W022 +133CB EGYPTIAN HIEROGLYPH W023 +133CC EGYPTIAN HIEROGLYPH W024 +133CD EGYPTIAN HIEROGLYPH W024A +133CE EGYPTIAN HIEROGLYPH W025 +133CF EGYPTIAN HIEROGLYPH X001 +133D0 EGYPTIAN HIEROGLYPH X002 +133D1 EGYPTIAN HIEROGLYPH X003 +133D2 EGYPTIAN HIEROGLYPH X004 +133D3 EGYPTIAN HIEROGLYPH X004A +133D4 EGYPTIAN HIEROGLYPH X004B +133D5 EGYPTIAN HIEROGLYPH X005 +133D6 EGYPTIAN HIEROGLYPH X006 +133D7 EGYPTIAN HIEROGLYPH X006A +133D8 EGYPTIAN HIEROGLYPH X007 +133D9 EGYPTIAN HIEROGLYPH X008 +133DA EGYPTIAN HIEROGLYPH X008A +133DB EGYPTIAN HIEROGLYPH Y001 +133DC EGYPTIAN HIEROGLYPH Y001A +133DD EGYPTIAN HIEROGLYPH Y002 +133DE EGYPTIAN HIEROGLYPH Y003 +133DF EGYPTIAN HIEROGLYPH Y004 +133E0 EGYPTIAN HIEROGLYPH Y005 +133E1 EGYPTIAN HIEROGLYPH Y006 +133E2 EGYPTIAN HIEROGLYPH Y007 +133E3 EGYPTIAN HIEROGLYPH Y008 +133E4 EGYPTIAN HIEROGLYPH Z001 +133E5 EGYPTIAN HIEROGLYPH Z002 +133E6 EGYPTIAN HIEROGLYPH Z002A +133E7 EGYPTIAN HIEROGLYPH Z002B +133E8 EGYPTIAN HIEROGLYPH Z002C +133E9 EGYPTIAN HIEROGLYPH Z002D +133EA EGYPTIAN HIEROGLYPH Z003 +133EB EGYPTIAN HIEROGLYPH Z003A +133EC EGYPTIAN HIEROGLYPH Z003B +133ED EGYPTIAN HIEROGLYPH Z004 +133EE EGYPTIAN HIEROGLYPH Z004A +133EF EGYPTIAN HIEROGLYPH Z005 +133F0 EGYPTIAN HIEROGLYPH Z005A +133F1 EGYPTIAN HIEROGLYPH Z006 +133F2 EGYPTIAN HIEROGLYPH Z007 +133F3 EGYPTIAN HIEROGLYPH Z008 +133F4 EGYPTIAN HIEROGLYPH Z009 +133F5 EGYPTIAN HIEROGLYPH Z010 +133F6 EGYPTIAN HIEROGLYPH Z011 +133F7 EGYPTIAN HIEROGLYPH Z012 +133F8 EGYPTIAN HIEROGLYPH Z013 +133F9 EGYPTIAN HIEROGLYPH Z014 +133FA EGYPTIAN HIEROGLYPH Z015 +133FB EGYPTIAN HIEROGLYPH Z015A +133FC EGYPTIAN HIEROGLYPH Z015B +133FD EGYPTIAN HIEROGLYPH Z015C +133FE EGYPTIAN HIEROGLYPH Z015D +133FF EGYPTIAN HIEROGLYPH Z015E +13400 EGYPTIAN HIEROGLYPH Z015F +13401 EGYPTIAN HIEROGLYPH Z015G +13402 EGYPTIAN HIEROGLYPH Z015H +13403 EGYPTIAN HIEROGLYPH Z015I +13404 EGYPTIAN HIEROGLYPH Z016 +13405 EGYPTIAN HIEROGLYPH Z016A +13406 EGYPTIAN HIEROGLYPH Z016B +13407 EGYPTIAN HIEROGLYPH Z016C +13408 EGYPTIAN HIEROGLYPH Z016D +13409 EGYPTIAN HIEROGLYPH Z016E +1340A EGYPTIAN HIEROGLYPH Z016F +1340B EGYPTIAN HIEROGLYPH Z016G +1340C EGYPTIAN HIEROGLYPH Z016H +1340D EGYPTIAN HIEROGLYPH AA001 +1340E EGYPTIAN HIEROGLYPH AA002 +1340F EGYPTIAN HIEROGLYPH AA003 +13410 EGYPTIAN HIEROGLYPH AA004 +13411 EGYPTIAN HIEROGLYPH AA005 +13412 EGYPTIAN HIEROGLYPH AA006 +13413 EGYPTIAN HIEROGLYPH AA007 +13414 EGYPTIAN HIEROGLYPH AA007A +13415 EGYPTIAN HIEROGLYPH AA007B +13416 EGYPTIAN HIEROGLYPH AA008 +13417 EGYPTIAN HIEROGLYPH AA009 +13418 EGYPTIAN HIEROGLYPH AA010 +13419 EGYPTIAN HIEROGLYPH AA011 +1341A EGYPTIAN HIEROGLYPH AA012 +1341B EGYPTIAN HIEROGLYPH AA013 +1341C EGYPTIAN HIEROGLYPH AA014 +1341D EGYPTIAN HIEROGLYPH AA015 +1341E EGYPTIAN HIEROGLYPH AA016 +1341F EGYPTIAN HIEROGLYPH AA017 +13420 EGYPTIAN HIEROGLYPH AA018 +13421 EGYPTIAN HIEROGLYPH AA019 +13422 EGYPTIAN HIEROGLYPH AA020 +13423 EGYPTIAN HIEROGLYPH AA021 +13424 EGYPTIAN HIEROGLYPH AA022 +13425 EGYPTIAN HIEROGLYPH AA023 +13426 EGYPTIAN HIEROGLYPH AA024 +13427 EGYPTIAN HIEROGLYPH AA025 +13428 EGYPTIAN HIEROGLYPH AA026 +13429 EGYPTIAN HIEROGLYPH AA027 +1342A EGYPTIAN HIEROGLYPH AA028 +1342B EGYPTIAN HIEROGLYPH AA029 +1342C EGYPTIAN HIEROGLYPH AA030 +1342D EGYPTIAN HIEROGLYPH AA031 +1342E EGYPTIAN HIEROGLYPH AA032 +14400 ANATOLIAN HIEROGLYPH A001 +14401 ANATOLIAN HIEROGLYPH A002 +14402 ANATOLIAN HIEROGLYPH A003 +14403 ANATOLIAN HIEROGLYPH A004 +14404 ANATOLIAN HIEROGLYPH A005 +14405 ANATOLIAN HIEROGLYPH A006 +14406 ANATOLIAN HIEROGLYPH A007 +14407 ANATOLIAN HIEROGLYPH A008 +14408 ANATOLIAN HIEROGLYPH A009 +14409 ANATOLIAN HIEROGLYPH A010 +1440A ANATOLIAN HIEROGLYPH A010A +1440B ANATOLIAN HIEROGLYPH A011 +1440C ANATOLIAN HIEROGLYPH A012 +1440D ANATOLIAN HIEROGLYPH A013 +1440E ANATOLIAN HIEROGLYPH A014 +1440F ANATOLIAN HIEROGLYPH A015 +14410 ANATOLIAN HIEROGLYPH A016 +14411 ANATOLIAN HIEROGLYPH A017 +14412 ANATOLIAN HIEROGLYPH A018 +14413 ANATOLIAN HIEROGLYPH A019 +14414 ANATOLIAN HIEROGLYPH A020 +14415 ANATOLIAN HIEROGLYPH A021 +14416 ANATOLIAN HIEROGLYPH A022 +14417 ANATOLIAN HIEROGLYPH A023 +14418 ANATOLIAN HIEROGLYPH A024 +14419 ANATOLIAN HIEROGLYPH A025 +1441A ANATOLIAN HIEROGLYPH A026 +1441B ANATOLIAN HIEROGLYPH A026A +1441C ANATOLIAN HIEROGLYPH A027 +1441D ANATOLIAN HIEROGLYPH A028 +1441E ANATOLIAN HIEROGLYPH A029 +1441F ANATOLIAN HIEROGLYPH A030 +14420 ANATOLIAN HIEROGLYPH A031 +14421 ANATOLIAN HIEROGLYPH A032 +14422 ANATOLIAN HIEROGLYPH A033 +14423 ANATOLIAN HIEROGLYPH A034 +14424 ANATOLIAN HIEROGLYPH A035 +14425 ANATOLIAN HIEROGLYPH A036 +14426 ANATOLIAN HIEROGLYPH A037 +14427 ANATOLIAN HIEROGLYPH A038 +14428 ANATOLIAN HIEROGLYPH A039 +14429 ANATOLIAN HIEROGLYPH A039A +1442A ANATOLIAN HIEROGLYPH A040 +1442B ANATOLIAN HIEROGLYPH A041 +1442C ANATOLIAN HIEROGLYPH A041A +1442D ANATOLIAN HIEROGLYPH A042 +1442E ANATOLIAN HIEROGLYPH A043 +1442F ANATOLIAN HIEROGLYPH A044 +14430 ANATOLIAN HIEROGLYPH A045 +14431 ANATOLIAN HIEROGLYPH A045A +14432 ANATOLIAN HIEROGLYPH A046 +14433 ANATOLIAN HIEROGLYPH A046A +14434 ANATOLIAN HIEROGLYPH A046B +14435 ANATOLIAN HIEROGLYPH A047 +14436 ANATOLIAN HIEROGLYPH A048 +14437 ANATOLIAN HIEROGLYPH A049 +14438 ANATOLIAN HIEROGLYPH A050 +14439 ANATOLIAN HIEROGLYPH A051 +1443A ANATOLIAN HIEROGLYPH A052 +1443B ANATOLIAN HIEROGLYPH A053 +1443C ANATOLIAN HIEROGLYPH A054 +1443D ANATOLIAN HIEROGLYPH A055 +1443E ANATOLIAN HIEROGLYPH A056 +1443F ANATOLIAN HIEROGLYPH A057 +14440 ANATOLIAN HIEROGLYPH A058 +14441 ANATOLIAN HIEROGLYPH A059 +14442 ANATOLIAN HIEROGLYPH A060 +14443 ANATOLIAN HIEROGLYPH A061 +14444 ANATOLIAN HIEROGLYPH A062 +14445 ANATOLIAN HIEROGLYPH A063 +14446 ANATOLIAN HIEROGLYPH A064 +14447 ANATOLIAN HIEROGLYPH A065 +14448 ANATOLIAN HIEROGLYPH A066 +14449 ANATOLIAN HIEROGLYPH A066A +1444A ANATOLIAN HIEROGLYPH A066B +1444B ANATOLIAN HIEROGLYPH A066C +1444C ANATOLIAN HIEROGLYPH A067 +1444D ANATOLIAN HIEROGLYPH A068 +1444E ANATOLIAN HIEROGLYPH A069 +1444F ANATOLIAN HIEROGLYPH A070 +14450 ANATOLIAN HIEROGLYPH A071 +14451 ANATOLIAN HIEROGLYPH A072 +14452 ANATOLIAN HIEROGLYPH A073 +14453 ANATOLIAN HIEROGLYPH A074 +14454 ANATOLIAN HIEROGLYPH A075 +14455 ANATOLIAN HIEROGLYPH A076 +14456 ANATOLIAN HIEROGLYPH A077 +14457 ANATOLIAN HIEROGLYPH A078 +14458 ANATOLIAN HIEROGLYPH A079 +14459 ANATOLIAN HIEROGLYPH A080 +1445A ANATOLIAN HIEROGLYPH A081 +1445B ANATOLIAN HIEROGLYPH A082 +1445C ANATOLIAN HIEROGLYPH A083 +1445D ANATOLIAN HIEROGLYPH A084 +1445E ANATOLIAN HIEROGLYPH A085 +1445F ANATOLIAN HIEROGLYPH A086 +14460 ANATOLIAN HIEROGLYPH A087 +14461 ANATOLIAN HIEROGLYPH A088 +14462 ANATOLIAN HIEROGLYPH A089 +14463 ANATOLIAN HIEROGLYPH A090 +14464 ANATOLIAN HIEROGLYPH A091 +14465 ANATOLIAN HIEROGLYPH A092 +14466 ANATOLIAN HIEROGLYPH A093 +14467 ANATOLIAN HIEROGLYPH A094 +14468 ANATOLIAN HIEROGLYPH A095 +14469 ANATOLIAN HIEROGLYPH A096 +1446A ANATOLIAN HIEROGLYPH A097 +1446B ANATOLIAN HIEROGLYPH A097A +1446C ANATOLIAN HIEROGLYPH A098 +1446D ANATOLIAN HIEROGLYPH A098A +1446E ANATOLIAN HIEROGLYPH A099 +1446F ANATOLIAN HIEROGLYPH A100 +14470 ANATOLIAN HIEROGLYPH A100A +14471 ANATOLIAN HIEROGLYPH A101 +14472 ANATOLIAN HIEROGLYPH A101A +14473 ANATOLIAN HIEROGLYPH A102 +14474 ANATOLIAN HIEROGLYPH A102A +14475 ANATOLIAN HIEROGLYPH A103 +14476 ANATOLIAN HIEROGLYPH A104 +14477 ANATOLIAN HIEROGLYPH A104A +14478 ANATOLIAN HIEROGLYPH A104B +14479 ANATOLIAN HIEROGLYPH A104C +1447A ANATOLIAN HIEROGLYPH A105 +1447B ANATOLIAN HIEROGLYPH A105A +1447C ANATOLIAN HIEROGLYPH A105B +1447D ANATOLIAN HIEROGLYPH A106 +1447E ANATOLIAN HIEROGLYPH A107 +1447F ANATOLIAN HIEROGLYPH A107A +14480 ANATOLIAN HIEROGLYPH A107B +14481 ANATOLIAN HIEROGLYPH A107C +14482 ANATOLIAN HIEROGLYPH A108 +14483 ANATOLIAN HIEROGLYPH A109 +14484 ANATOLIAN HIEROGLYPH A110 +14485 ANATOLIAN HIEROGLYPH A110A +14486 ANATOLIAN HIEROGLYPH A110B +14487 ANATOLIAN HIEROGLYPH A111 +14488 ANATOLIAN HIEROGLYPH A112 +14489 ANATOLIAN HIEROGLYPH A113 +1448A ANATOLIAN HIEROGLYPH A114 +1448B ANATOLIAN HIEROGLYPH A115 +1448C ANATOLIAN HIEROGLYPH A115A +1448D ANATOLIAN HIEROGLYPH A116 +1448E ANATOLIAN HIEROGLYPH A117 +1448F ANATOLIAN HIEROGLYPH A118 +14490 ANATOLIAN HIEROGLYPH A119 +14491 ANATOLIAN HIEROGLYPH A120 +14492 ANATOLIAN HIEROGLYPH A121 +14493 ANATOLIAN HIEROGLYPH A122 +14494 ANATOLIAN HIEROGLYPH A123 +14495 ANATOLIAN HIEROGLYPH A124 +14496 ANATOLIAN HIEROGLYPH A125 +14497 ANATOLIAN HIEROGLYPH A125A +14498 ANATOLIAN HIEROGLYPH A126 +14499 ANATOLIAN HIEROGLYPH A127 +1449A ANATOLIAN HIEROGLYPH A128 +1449B ANATOLIAN HIEROGLYPH A129 +1449C ANATOLIAN HIEROGLYPH A130 +1449D ANATOLIAN HIEROGLYPH A131 +1449E ANATOLIAN HIEROGLYPH A132 +1449F ANATOLIAN HIEROGLYPH A133 +144A0 ANATOLIAN HIEROGLYPH A134 +144A1 ANATOLIAN HIEROGLYPH A135 +144A2 ANATOLIAN HIEROGLYPH A135A +144A3 ANATOLIAN HIEROGLYPH A136 +144A4 ANATOLIAN HIEROGLYPH A137 +144A5 ANATOLIAN HIEROGLYPH A138 +144A6 ANATOLIAN HIEROGLYPH A139 +144A7 ANATOLIAN HIEROGLYPH A140 +144A8 ANATOLIAN HIEROGLYPH A141 +144A9 ANATOLIAN HIEROGLYPH A142 +144AA ANATOLIAN HIEROGLYPH A143 +144AB ANATOLIAN HIEROGLYPH A144 +144AC ANATOLIAN HIEROGLYPH A145 +144AD ANATOLIAN HIEROGLYPH A146 +144AE ANATOLIAN HIEROGLYPH A147 +144AF ANATOLIAN HIEROGLYPH A148 +144B0 ANATOLIAN HIEROGLYPH A149 +144B1 ANATOLIAN HIEROGLYPH A150 +144B2 ANATOLIAN HIEROGLYPH A151 +144B3 ANATOLIAN HIEROGLYPH A152 +144B4 ANATOLIAN HIEROGLYPH A153 +144B5 ANATOLIAN HIEROGLYPH A154 +144B6 ANATOLIAN HIEROGLYPH A155 +144B7 ANATOLIAN HIEROGLYPH A156 +144B8 ANATOLIAN HIEROGLYPH A157 +144B9 ANATOLIAN HIEROGLYPH A158 +144BA ANATOLIAN HIEROGLYPH A159 +144BB ANATOLIAN HIEROGLYPH A160 +144BC ANATOLIAN HIEROGLYPH A161 +144BD ANATOLIAN HIEROGLYPH A162 +144BE ANATOLIAN HIEROGLYPH A163 +144BF ANATOLIAN HIEROGLYPH A164 +144C0 ANATOLIAN HIEROGLYPH A165 +144C1 ANATOLIAN HIEROGLYPH A166 +144C2 ANATOLIAN HIEROGLYPH A167 +144C3 ANATOLIAN HIEROGLYPH A168 +144C4 ANATOLIAN HIEROGLYPH A169 +144C5 ANATOLIAN HIEROGLYPH A170 +144C6 ANATOLIAN HIEROGLYPH A171 +144C7 ANATOLIAN HIEROGLYPH A172 +144C8 ANATOLIAN HIEROGLYPH A173 +144C9 ANATOLIAN HIEROGLYPH A174 +144CA ANATOLIAN HIEROGLYPH A175 +144CB ANATOLIAN HIEROGLYPH A176 +144CC ANATOLIAN HIEROGLYPH A177 +144CD ANATOLIAN HIEROGLYPH A178 +144CE ANATOLIAN HIEROGLYPH A179 +144CF ANATOLIAN HIEROGLYPH A180 +144D0 ANATOLIAN HIEROGLYPH A181 +144D1 ANATOLIAN HIEROGLYPH A182 +144D2 ANATOLIAN HIEROGLYPH A183 +144D3 ANATOLIAN HIEROGLYPH A184 +144D4 ANATOLIAN HIEROGLYPH A185 +144D5 ANATOLIAN HIEROGLYPH A186 +144D6 ANATOLIAN HIEROGLYPH A187 +144D7 ANATOLIAN HIEROGLYPH A188 +144D8 ANATOLIAN HIEROGLYPH A189 +144D9 ANATOLIAN HIEROGLYPH A190 +144DA ANATOLIAN HIEROGLYPH A191 +144DB ANATOLIAN HIEROGLYPH A192 +144DC ANATOLIAN HIEROGLYPH A193 +144DD ANATOLIAN HIEROGLYPH A194 +144DE ANATOLIAN HIEROGLYPH A195 +144DF ANATOLIAN HIEROGLYPH A196 +144E0 ANATOLIAN HIEROGLYPH A197 +144E1 ANATOLIAN HIEROGLYPH A198 +144E2 ANATOLIAN HIEROGLYPH A199 +144E3 ANATOLIAN HIEROGLYPH A200 +144E4 ANATOLIAN HIEROGLYPH A201 +144E5 ANATOLIAN HIEROGLYPH A202 +144E6 ANATOLIAN HIEROGLYPH A202A +144E7 ANATOLIAN HIEROGLYPH A202B +144E8 ANATOLIAN HIEROGLYPH A203 +144E9 ANATOLIAN HIEROGLYPH A204 +144EA ANATOLIAN HIEROGLYPH A205 +144EB ANATOLIAN HIEROGLYPH A206 +144EC ANATOLIAN HIEROGLYPH A207 +144ED ANATOLIAN HIEROGLYPH A207A +144EE ANATOLIAN HIEROGLYPH A208 +144EF ANATOLIAN HIEROGLYPH A209 +144F0 ANATOLIAN HIEROGLYPH A209A +144F1 ANATOLIAN HIEROGLYPH A210 +144F2 ANATOLIAN HIEROGLYPH A211 +144F3 ANATOLIAN HIEROGLYPH A212 +144F4 ANATOLIAN HIEROGLYPH A213 +144F5 ANATOLIAN HIEROGLYPH A214 +144F6 ANATOLIAN HIEROGLYPH A215 +144F7 ANATOLIAN HIEROGLYPH A215A +144F8 ANATOLIAN HIEROGLYPH A216 +144F9 ANATOLIAN HIEROGLYPH A216A +144FA ANATOLIAN HIEROGLYPH A217 +144FB ANATOLIAN HIEROGLYPH A218 +144FC ANATOLIAN HIEROGLYPH A219 +144FD ANATOLIAN HIEROGLYPH A220 +144FE ANATOLIAN HIEROGLYPH A221 +144FF ANATOLIAN HIEROGLYPH A222 +14500 ANATOLIAN HIEROGLYPH A223 +14501 ANATOLIAN HIEROGLYPH A224 +14502 ANATOLIAN HIEROGLYPH A225 +14503 ANATOLIAN HIEROGLYPH A226 +14504 ANATOLIAN HIEROGLYPH A227 +14505 ANATOLIAN HIEROGLYPH A227A +14506 ANATOLIAN HIEROGLYPH A228 +14507 ANATOLIAN HIEROGLYPH A229 +14508 ANATOLIAN HIEROGLYPH A230 +14509 ANATOLIAN HIEROGLYPH A231 +1450A ANATOLIAN HIEROGLYPH A232 +1450B ANATOLIAN HIEROGLYPH A233 +1450C ANATOLIAN HIEROGLYPH A234 +1450D ANATOLIAN HIEROGLYPH A235 +1450E ANATOLIAN HIEROGLYPH A236 +1450F ANATOLIAN HIEROGLYPH A237 +14510 ANATOLIAN HIEROGLYPH A238 +14511 ANATOLIAN HIEROGLYPH A239 +14512 ANATOLIAN HIEROGLYPH A240 +14513 ANATOLIAN HIEROGLYPH A241 +14514 ANATOLIAN HIEROGLYPH A242 +14515 ANATOLIAN HIEROGLYPH A243 +14516 ANATOLIAN HIEROGLYPH A244 +14517 ANATOLIAN HIEROGLYPH A245 +14518 ANATOLIAN HIEROGLYPH A246 +14519 ANATOLIAN HIEROGLYPH A247 +1451A ANATOLIAN HIEROGLYPH A248 +1451B ANATOLIAN HIEROGLYPH A249 +1451C ANATOLIAN HIEROGLYPH A250 +1451D ANATOLIAN HIEROGLYPH A251 +1451E ANATOLIAN HIEROGLYPH A252 +1451F ANATOLIAN HIEROGLYPH A253 +14520 ANATOLIAN HIEROGLYPH A254 +14521 ANATOLIAN HIEROGLYPH A255 +14522 ANATOLIAN HIEROGLYPH A256 +14523 ANATOLIAN HIEROGLYPH A257 +14524 ANATOLIAN HIEROGLYPH A258 +14525 ANATOLIAN HIEROGLYPH A259 +14526 ANATOLIAN HIEROGLYPH A260 +14527 ANATOLIAN HIEROGLYPH A261 +14528 ANATOLIAN HIEROGLYPH A262 +14529 ANATOLIAN HIEROGLYPH A263 +1452A ANATOLIAN HIEROGLYPH A264 +1452B ANATOLIAN HIEROGLYPH A265 +1452C ANATOLIAN HIEROGLYPH A266 +1452D ANATOLIAN HIEROGLYPH A267 +1452E ANATOLIAN HIEROGLYPH A267A +1452F ANATOLIAN HIEROGLYPH A268 +14530 ANATOLIAN HIEROGLYPH A269 +14531 ANATOLIAN HIEROGLYPH A270 +14532 ANATOLIAN HIEROGLYPH A271 +14533 ANATOLIAN HIEROGLYPH A272 +14534 ANATOLIAN HIEROGLYPH A273 +14535 ANATOLIAN HIEROGLYPH A274 +14536 ANATOLIAN HIEROGLYPH A275 +14537 ANATOLIAN HIEROGLYPH A276 +14538 ANATOLIAN HIEROGLYPH A277 +14539 ANATOLIAN HIEROGLYPH A278 +1453A ANATOLIAN HIEROGLYPH A279 +1453B ANATOLIAN HIEROGLYPH A280 +1453C ANATOLIAN HIEROGLYPH A281 +1453D ANATOLIAN HIEROGLYPH A282 +1453E ANATOLIAN HIEROGLYPH A283 +1453F ANATOLIAN HIEROGLYPH A284 +14540 ANATOLIAN HIEROGLYPH A285 +14541 ANATOLIAN HIEROGLYPH A286 +14542 ANATOLIAN HIEROGLYPH A287 +14543 ANATOLIAN HIEROGLYPH A288 +14544 ANATOLIAN HIEROGLYPH A289 +14545 ANATOLIAN HIEROGLYPH A289A +14546 ANATOLIAN HIEROGLYPH A290 +14547 ANATOLIAN HIEROGLYPH A291 +14548 ANATOLIAN HIEROGLYPH A292 +14549 ANATOLIAN HIEROGLYPH A293 +1454A ANATOLIAN HIEROGLYPH A294 +1454B ANATOLIAN HIEROGLYPH A294A +1454C ANATOLIAN HIEROGLYPH A295 +1454D ANATOLIAN HIEROGLYPH A296 +1454E ANATOLIAN HIEROGLYPH A297 +1454F ANATOLIAN HIEROGLYPH A298 +14550 ANATOLIAN HIEROGLYPH A299 +14551 ANATOLIAN HIEROGLYPH A299A +14552 ANATOLIAN HIEROGLYPH A300 +14553 ANATOLIAN HIEROGLYPH A301 +14554 ANATOLIAN HIEROGLYPH A302 +14555 ANATOLIAN HIEROGLYPH A303 +14556 ANATOLIAN HIEROGLYPH A304 +14557 ANATOLIAN HIEROGLYPH A305 +14558 ANATOLIAN HIEROGLYPH A306 +14559 ANATOLIAN HIEROGLYPH A307 +1455A ANATOLIAN HIEROGLYPH A308 +1455B ANATOLIAN HIEROGLYPH A309 +1455C ANATOLIAN HIEROGLYPH A309A +1455D ANATOLIAN HIEROGLYPH A310 +1455E ANATOLIAN HIEROGLYPH A311 +1455F ANATOLIAN HIEROGLYPH A312 +14560 ANATOLIAN HIEROGLYPH A313 +14561 ANATOLIAN HIEROGLYPH A314 +14562 ANATOLIAN HIEROGLYPH A315 +14563 ANATOLIAN HIEROGLYPH A316 +14564 ANATOLIAN HIEROGLYPH A317 +14565 ANATOLIAN HIEROGLYPH A318 +14566 ANATOLIAN HIEROGLYPH A319 +14567 ANATOLIAN HIEROGLYPH A320 +14568 ANATOLIAN HIEROGLYPH A321 +14569 ANATOLIAN HIEROGLYPH A322 +1456A ANATOLIAN HIEROGLYPH A323 +1456B ANATOLIAN HIEROGLYPH A324 +1456C ANATOLIAN HIEROGLYPH A325 +1456D ANATOLIAN HIEROGLYPH A326 +1456E ANATOLIAN HIEROGLYPH A327 +1456F ANATOLIAN HIEROGLYPH A328 +14570 ANATOLIAN HIEROGLYPH A329 +14571 ANATOLIAN HIEROGLYPH A329A +14572 ANATOLIAN HIEROGLYPH A330 +14573 ANATOLIAN HIEROGLYPH A331 +14574 ANATOLIAN HIEROGLYPH A332A +14575 ANATOLIAN HIEROGLYPH A332B +14576 ANATOLIAN HIEROGLYPH A332C +14577 ANATOLIAN HIEROGLYPH A333 +14578 ANATOLIAN HIEROGLYPH A334 +14579 ANATOLIAN HIEROGLYPH A335 +1457A ANATOLIAN HIEROGLYPH A336 +1457B ANATOLIAN HIEROGLYPH A336A +1457C ANATOLIAN HIEROGLYPH A336B +1457D ANATOLIAN HIEROGLYPH A336C +1457E ANATOLIAN HIEROGLYPH A337 +1457F ANATOLIAN HIEROGLYPH A338 +14580 ANATOLIAN HIEROGLYPH A339 +14581 ANATOLIAN HIEROGLYPH A340 +14582 ANATOLIAN HIEROGLYPH A341 +14583 ANATOLIAN HIEROGLYPH A342 +14584 ANATOLIAN HIEROGLYPH A343 +14585 ANATOLIAN HIEROGLYPH A344 +14586 ANATOLIAN HIEROGLYPH A345 +14587 ANATOLIAN HIEROGLYPH A346 +14588 ANATOLIAN HIEROGLYPH A347 +14589 ANATOLIAN HIEROGLYPH A348 +1458A ANATOLIAN HIEROGLYPH A349 +1458B ANATOLIAN HIEROGLYPH A350 +1458C ANATOLIAN HIEROGLYPH A351 +1458D ANATOLIAN HIEROGLYPH A352 +1458E ANATOLIAN HIEROGLYPH A353 +1458F ANATOLIAN HIEROGLYPH A354 +14590 ANATOLIAN HIEROGLYPH A355 +14591 ANATOLIAN HIEROGLYPH A356 +14592 ANATOLIAN HIEROGLYPH A357 +14593 ANATOLIAN HIEROGLYPH A358 +14594 ANATOLIAN HIEROGLYPH A359 +14595 ANATOLIAN HIEROGLYPH A359A +14596 ANATOLIAN HIEROGLYPH A360 +14597 ANATOLIAN HIEROGLYPH A361 +14598 ANATOLIAN HIEROGLYPH A362 +14599 ANATOLIAN HIEROGLYPH A363 +1459A ANATOLIAN HIEROGLYPH A364 +1459B ANATOLIAN HIEROGLYPH A364A +1459C ANATOLIAN HIEROGLYPH A365 +1459D ANATOLIAN HIEROGLYPH A366 +1459E ANATOLIAN HIEROGLYPH A367 +1459F ANATOLIAN HIEROGLYPH A368 +145A0 ANATOLIAN HIEROGLYPH A368A +145A1 ANATOLIAN HIEROGLYPH A369 +145A2 ANATOLIAN HIEROGLYPH A370 +145A3 ANATOLIAN HIEROGLYPH A371 +145A4 ANATOLIAN HIEROGLYPH A371A +145A5 ANATOLIAN HIEROGLYPH A372 +145A6 ANATOLIAN HIEROGLYPH A373 +145A7 ANATOLIAN HIEROGLYPH A374 +145A8 ANATOLIAN HIEROGLYPH A375 +145A9 ANATOLIAN HIEROGLYPH A376 +145AA ANATOLIAN HIEROGLYPH A377 +145AB ANATOLIAN HIEROGLYPH A378 +145AC ANATOLIAN HIEROGLYPH A379 +145AD ANATOLIAN HIEROGLYPH A380 +145AE ANATOLIAN HIEROGLYPH A381 +145AF ANATOLIAN HIEROGLYPH A381A +145B0 ANATOLIAN HIEROGLYPH A382 +145B1 ANATOLIAN HIEROGLYPH A383 RA OR RI +145B2 ANATOLIAN HIEROGLYPH A383A +145B3 ANATOLIAN HIEROGLYPH A384 +145B4 ANATOLIAN HIEROGLYPH A385 +145B5 ANATOLIAN HIEROGLYPH A386 +145B6 ANATOLIAN HIEROGLYPH A386A +145B7 ANATOLIAN HIEROGLYPH A387 +145B8 ANATOLIAN HIEROGLYPH A388 +145B9 ANATOLIAN HIEROGLYPH A389 +145BA ANATOLIAN HIEROGLYPH A390 +145BB ANATOLIAN HIEROGLYPH A391 +145BC ANATOLIAN HIEROGLYPH A392 +145BD ANATOLIAN HIEROGLYPH A393 EIGHT +145BE ANATOLIAN HIEROGLYPH A394 +145BF ANATOLIAN HIEROGLYPH A395 +145C0 ANATOLIAN HIEROGLYPH A396 +145C1 ANATOLIAN HIEROGLYPH A397 +145C2 ANATOLIAN HIEROGLYPH A398 +145C3 ANATOLIAN HIEROGLYPH A399 +145C4 ANATOLIAN HIEROGLYPH A400 +145C5 ANATOLIAN HIEROGLYPH A401 +145C6 ANATOLIAN HIEROGLYPH A402 +145C7 ANATOLIAN HIEROGLYPH A403 +145C8 ANATOLIAN HIEROGLYPH A404 +145C9 ANATOLIAN HIEROGLYPH A405 +145CA ANATOLIAN HIEROGLYPH A406 +145CB ANATOLIAN HIEROGLYPH A407 +145CC ANATOLIAN HIEROGLYPH A408 +145CD ANATOLIAN HIEROGLYPH A409 +145CE ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK +145CF ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK +145D0 ANATOLIAN HIEROGLYPH A411 +145D1 ANATOLIAN HIEROGLYPH A412 +145D2 ANATOLIAN HIEROGLYPH A413 +145D3 ANATOLIAN HIEROGLYPH A414 +145D4 ANATOLIAN HIEROGLYPH A415 +145D5 ANATOLIAN HIEROGLYPH A416 +145D6 ANATOLIAN HIEROGLYPH A417 +145D7 ANATOLIAN HIEROGLYPH A418 +145D8 ANATOLIAN HIEROGLYPH A419 +145D9 ANATOLIAN HIEROGLYPH A420 +145DA ANATOLIAN HIEROGLYPH A421 +145DB ANATOLIAN HIEROGLYPH A422 +145DC ANATOLIAN HIEROGLYPH A423 +145DD ANATOLIAN HIEROGLYPH A424 +145DE ANATOLIAN HIEROGLYPH A425 +145DF ANATOLIAN HIEROGLYPH A426 +145E0 ANATOLIAN HIEROGLYPH A427 +145E1 ANATOLIAN HIEROGLYPH A428 +145E2 ANATOLIAN HIEROGLYPH A429 +145E3 ANATOLIAN HIEROGLYPH A430 +145E4 ANATOLIAN HIEROGLYPH A431 +145E5 ANATOLIAN HIEROGLYPH A432 +145E6 ANATOLIAN HIEROGLYPH A433 +145E7 ANATOLIAN HIEROGLYPH A434 +145E8 ANATOLIAN HIEROGLYPH A435 +145E9 ANATOLIAN HIEROGLYPH A436 +145EA ANATOLIAN HIEROGLYPH A437 +145EB ANATOLIAN HIEROGLYPH A438 +145EC ANATOLIAN HIEROGLYPH A439 +145ED ANATOLIAN HIEROGLYPH A440 +145EE ANATOLIAN HIEROGLYPH A441 +145EF ANATOLIAN HIEROGLYPH A442 +145F0 ANATOLIAN HIEROGLYPH A443 +145F1 ANATOLIAN HIEROGLYPH A444 +145F2 ANATOLIAN HIEROGLYPH A445 +145F3 ANATOLIAN HIEROGLYPH A446 +145F4 ANATOLIAN HIEROGLYPH A447 +145F5 ANATOLIAN HIEROGLYPH A448 +145F6 ANATOLIAN HIEROGLYPH A449 +145F7 ANATOLIAN HIEROGLYPH A450 +145F8 ANATOLIAN HIEROGLYPH A450A +145F9 ANATOLIAN HIEROGLYPH A451 +145FA ANATOLIAN HIEROGLYPH A452 +145FB ANATOLIAN HIEROGLYPH A453 +145FC ANATOLIAN HIEROGLYPH A454 +145FD ANATOLIAN HIEROGLYPH A455 +145FE ANATOLIAN HIEROGLYPH A456 +145FF ANATOLIAN HIEROGLYPH A457 +14600 ANATOLIAN HIEROGLYPH A457A +14601 ANATOLIAN HIEROGLYPH A458 +14602 ANATOLIAN HIEROGLYPH A459 +14603 ANATOLIAN HIEROGLYPH A460 +14604 ANATOLIAN HIEROGLYPH A461 +14605 ANATOLIAN HIEROGLYPH A462 +14606 ANATOLIAN HIEROGLYPH A463 +14607 ANATOLIAN HIEROGLYPH A464 +14608 ANATOLIAN HIEROGLYPH A465 +14609 ANATOLIAN HIEROGLYPH A466 +1460A ANATOLIAN HIEROGLYPH A467 +1460B ANATOLIAN HIEROGLYPH A468 +1460C ANATOLIAN HIEROGLYPH A469 +1460D ANATOLIAN HIEROGLYPH A470 +1460E ANATOLIAN HIEROGLYPH A471 +1460F ANATOLIAN HIEROGLYPH A472 +14610 ANATOLIAN HIEROGLYPH A473 +14611 ANATOLIAN HIEROGLYPH A474 +14612 ANATOLIAN HIEROGLYPH A475 +14613 ANATOLIAN HIEROGLYPH A476 +14614 ANATOLIAN HIEROGLYPH A477 +14615 ANATOLIAN HIEROGLYPH A478 +14616 ANATOLIAN HIEROGLYPH A479 +14617 ANATOLIAN HIEROGLYPH A480 +14618 ANATOLIAN HIEROGLYPH A481 +14619 ANATOLIAN HIEROGLYPH A482 +1461A ANATOLIAN HIEROGLYPH A483 +1461B ANATOLIAN HIEROGLYPH A484 +1461C ANATOLIAN HIEROGLYPH A485 +1461D ANATOLIAN HIEROGLYPH A486 +1461E ANATOLIAN HIEROGLYPH A487 +1461F ANATOLIAN HIEROGLYPH A488 +14620 ANATOLIAN HIEROGLYPH A489 +14621 ANATOLIAN HIEROGLYPH A490 +14622 ANATOLIAN HIEROGLYPH A491 +14623 ANATOLIAN HIEROGLYPH A492 +14624 ANATOLIAN HIEROGLYPH A493 +14625 ANATOLIAN HIEROGLYPH A494 +14626 ANATOLIAN HIEROGLYPH A495 +14627 ANATOLIAN HIEROGLYPH A496 +14628 ANATOLIAN HIEROGLYPH A497 +14629 ANATOLIAN HIEROGLYPH A501 +1462A ANATOLIAN HIEROGLYPH A502 +1462B ANATOLIAN HIEROGLYPH A503 +1462C ANATOLIAN HIEROGLYPH A504 +1462D ANATOLIAN HIEROGLYPH A505 +1462E ANATOLIAN HIEROGLYPH A506 +1462F ANATOLIAN HIEROGLYPH A507 +14630 ANATOLIAN HIEROGLYPH A508 +14631 ANATOLIAN HIEROGLYPH A509 +14632 ANATOLIAN HIEROGLYPH A510 +14633 ANATOLIAN HIEROGLYPH A511 +14634 ANATOLIAN HIEROGLYPH A512 +14635 ANATOLIAN HIEROGLYPH A513 +14636 ANATOLIAN HIEROGLYPH A514 +14637 ANATOLIAN HIEROGLYPH A515 +14638 ANATOLIAN HIEROGLYPH A516 +14639 ANATOLIAN HIEROGLYPH A517 +1463A ANATOLIAN HIEROGLYPH A518 +1463B ANATOLIAN HIEROGLYPH A519 +1463C ANATOLIAN HIEROGLYPH A520 +1463D ANATOLIAN HIEROGLYPH A521 +1463E ANATOLIAN HIEROGLYPH A522 +1463F ANATOLIAN HIEROGLYPH A523 +14640 ANATOLIAN HIEROGLYPH A524 +14641 ANATOLIAN HIEROGLYPH A525 +14642 ANATOLIAN HIEROGLYPH A526 +14643 ANATOLIAN HIEROGLYPH A527 +14644 ANATOLIAN HIEROGLYPH A528 +14645 ANATOLIAN HIEROGLYPH A529 +14646 ANATOLIAN HIEROGLYPH A530 +16800 BAMUM LETTER PHASE-A NGKUE MFON +16801 BAMUM LETTER PHASE-A GBIEE FON +16802 BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE +16803 BAMUM LETTER PHASE-A PON MFON PIPAEMBA +16804 BAMUM LETTER PHASE-A NAA MFON +16805 BAMUM LETTER PHASE-A SHUENSHUET +16806 BAMUM LETTER PHASE-A TITA MFON +16807 BAMUM LETTER PHASE-A NZA MFON +16808 BAMUM LETTER PHASE-A SHINDA PA NJI +16809 BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE +1680A BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA +1680B BAMUM LETTER PHASE-A MAEMBGBIEE +1680C BAMUM LETTER PHASE-A TU MAEMBA +1680D BAMUM LETTER PHASE-A NGANGU +1680E BAMUM LETTER PHASE-A MAEMVEUX +1680F BAMUM LETTER PHASE-A MANSUAE +16810 BAMUM LETTER PHASE-A MVEUAENGAM +16811 BAMUM LETTER PHASE-A SEUNYAM +16812 BAMUM LETTER PHASE-A NTOQPEN +16813 BAMUM LETTER PHASE-A KEUKEUTNDA +16814 BAMUM LETTER PHASE-A NKINDI +16815 BAMUM LETTER PHASE-A SUU +16816 BAMUM LETTER PHASE-A NGKUENZEUM +16817 BAMUM LETTER PHASE-A LAPAQ +16818 BAMUM LETTER PHASE-A LET KUT +16819 BAMUM LETTER PHASE-A NTAP MFAA +1681A BAMUM LETTER PHASE-A MAEKEUP +1681B BAMUM LETTER PHASE-A PASHAE +1681C BAMUM LETTER PHASE-A GHEUAERAE +1681D BAMUM LETTER PHASE-A PAMSHAE +1681E BAMUM LETTER PHASE-A MON NGGEUAET +1681F BAMUM LETTER PHASE-A NZUN MEUT +16820 BAMUM LETTER PHASE-A U YUQ NAE +16821 BAMUM LETTER PHASE-A GHEUAEGHEUAE +16822 BAMUM LETTER PHASE-A NTAP NTAA +16823 BAMUM LETTER PHASE-A SISA +16824 BAMUM LETTER PHASE-A MGBASA +16825 BAMUM LETTER PHASE-A MEUNJOMNDEUQ +16826 BAMUM LETTER PHASE-A MOOMPUQ +16827 BAMUM LETTER PHASE-A KAFA +16828 BAMUM LETTER PHASE-A PA LEERAEWA +16829 BAMUM LETTER PHASE-A NDA LEERAEWA +1682A BAMUM LETTER PHASE-A PET +1682B BAMUM LETTER PHASE-A MAEMKPEN +1682C BAMUM LETTER PHASE-A NIKA +1682D BAMUM LETTER PHASE-A PUP +1682E BAMUM LETTER PHASE-A TUAEP +1682F BAMUM LETTER PHASE-A LUAEP +16830 BAMUM LETTER PHASE-A SONJAM +16831 BAMUM LETTER PHASE-A TEUTEUWEN +16832 BAMUM LETTER PHASE-A MAENYI +16833 BAMUM LETTER PHASE-A KET +16834 BAMUM LETTER PHASE-A NDAANGGEUAET +16835 BAMUM LETTER PHASE-A KUOQ +16836 BAMUM LETTER PHASE-A MOOMEUT +16837 BAMUM LETTER PHASE-A SHUM +16838 BAMUM LETTER PHASE-A LOMMAE +16839 BAMUM LETTER PHASE-A FIRI +1683A BAMUM LETTER PHASE-A ROM +1683B BAMUM LETTER PHASE-A KPOQ +1683C BAMUM LETTER PHASE-A SOQ +1683D BAMUM LETTER PHASE-A MAP PIEET +1683E BAMUM LETTER PHASE-A SHIRAE +1683F BAMUM LETTER PHASE-A NTAP +16840 BAMUM LETTER PHASE-A SHOQ NSHUT YUM +16841 BAMUM LETTER PHASE-A NYIT MONGKEUAEQ +16842 BAMUM LETTER PHASE-A PAARAE +16843 BAMUM LETTER PHASE-A NKAARAE +16844 BAMUM LETTER PHASE-A UNKNOWN +16845 BAMUM LETTER PHASE-A NGGEN +16846 BAMUM LETTER PHASE-A MAESI +16847 BAMUM LETTER PHASE-A NJAM +16848 BAMUM LETTER PHASE-A MBANYI +16849 BAMUM LETTER PHASE-A NYET +1684A BAMUM LETTER PHASE-A TEUAEN +1684B BAMUM LETTER PHASE-A SOT +1684C BAMUM LETTER PHASE-A PAAM +1684D BAMUM LETTER PHASE-A NSHIEE +1684E BAMUM LETTER PHASE-A MAEM +1684F BAMUM LETTER PHASE-A NYI +16850 BAMUM LETTER PHASE-A KAQ +16851 BAMUM LETTER PHASE-A NSHA +16852 BAMUM LETTER PHASE-A VEE +16853 BAMUM LETTER PHASE-A LU +16854 BAMUM LETTER PHASE-A NEN +16855 BAMUM LETTER PHASE-A NAQ +16856 BAMUM LETTER PHASE-A MBAQ +16857 BAMUM LETTER PHASE-B NSHUET +16858 BAMUM LETTER PHASE-B TU MAEMGBIEE +16859 BAMUM LETTER PHASE-B SIEE +1685A BAMUM LETTER PHASE-B SET TU +1685B BAMUM LETTER PHASE-B LOM NTEUM +1685C BAMUM LETTER PHASE-B MBA MAELEE +1685D BAMUM LETTER PHASE-B KIEEM +1685E BAMUM LETTER PHASE-B YEURAE +1685F BAMUM LETTER PHASE-B MBAARAE +16860 BAMUM LETTER PHASE-B KAM +16861 BAMUM LETTER PHASE-B PEESHI +16862 BAMUM LETTER PHASE-B YAFU LEERAEWA +16863 BAMUM LETTER PHASE-B LAM NSHUT NYAM +16864 BAMUM LETTER PHASE-B NTIEE SHEUOQ +16865 BAMUM LETTER PHASE-B NDU NJAA +16866 BAMUM LETTER PHASE-B GHEUGHEUAEM +16867 BAMUM LETTER PHASE-B PIT +16868 BAMUM LETTER PHASE-B TU NSIEE +16869 BAMUM LETTER PHASE-B SHET NJAQ +1686A BAMUM LETTER PHASE-B SHEUAEQTU +1686B BAMUM LETTER PHASE-B MFON TEUAEQ +1686C BAMUM LETTER PHASE-B MBIT MBAAKET +1686D BAMUM LETTER PHASE-B NYI NTEUM +1686E BAMUM LETTER PHASE-B KEUPUQ +1686F BAMUM LETTER PHASE-B GHEUGHEN +16870 BAMUM LETTER PHASE-B KEUYEUX +16871 BAMUM LETTER PHASE-B LAANAE +16872 BAMUM LETTER PHASE-B PARUM +16873 BAMUM LETTER PHASE-B VEUM +16874 BAMUM LETTER PHASE-B NGKINDI MVOP +16875 BAMUM LETTER PHASE-B NGGEU MBU +16876 BAMUM LETTER PHASE-B WUAET +16877 BAMUM LETTER PHASE-B SAKEUAE +16878 BAMUM LETTER PHASE-B TAAM +16879 BAMUM LETTER PHASE-B MEUQ +1687A BAMUM LETTER PHASE-B NGGUOQ +1687B BAMUM LETTER PHASE-B NGGUOQ LARGE +1687C BAMUM LETTER PHASE-B MFIYAQ +1687D BAMUM LETTER PHASE-B SUE +1687E BAMUM LETTER PHASE-B MBEURI +1687F BAMUM LETTER PHASE-B MONTIEEN +16880 BAMUM LETTER PHASE-B NYAEMAE +16881 BAMUM LETTER PHASE-B PUNGAAM +16882 BAMUM LETTER PHASE-B MEUT NGGEET +16883 BAMUM LETTER PHASE-B FEUX +16884 BAMUM LETTER PHASE-B MBUOQ +16885 BAMUM LETTER PHASE-B FEE +16886 BAMUM LETTER PHASE-B KEUAEM +16887 BAMUM LETTER PHASE-B MA NJEUAENA +16888 BAMUM LETTER PHASE-B MA NJUQA +16889 BAMUM LETTER PHASE-B LET +1688A BAMUM LETTER PHASE-B NGGAAM +1688B BAMUM LETTER PHASE-B NSEN +1688C BAMUM LETTER PHASE-B MA +1688D BAMUM LETTER PHASE-B KIQ +1688E BAMUM LETTER PHASE-B NGOM +1688F BAMUM LETTER PHASE-C NGKUE MAEMBA +16890 BAMUM LETTER PHASE-C NZA +16891 BAMUM LETTER PHASE-C YUM +16892 BAMUM LETTER PHASE-C WANGKUOQ +16893 BAMUM LETTER PHASE-C NGGEN +16894 BAMUM LETTER PHASE-C NDEUAEREE +16895 BAMUM LETTER PHASE-C NGKAQ +16896 BAMUM LETTER PHASE-C GHARAE +16897 BAMUM LETTER PHASE-C MBEEKEET +16898 BAMUM LETTER PHASE-C GBAYI +16899 BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN +1689A BAMUM LETTER PHASE-C NTU MBIT +1689B BAMUM LETTER PHASE-C MBEUM +1689C BAMUM LETTER PHASE-C PIRIEEN +1689D BAMUM LETTER PHASE-C NDOMBU +1689E BAMUM LETTER PHASE-C MBAA CABBAGE-TREE +1689F BAMUM LETTER PHASE-C KEUSHEUAEP +168A0 BAMUM LETTER PHASE-C GHAP +168A1 BAMUM LETTER PHASE-C KEUKAQ +168A2 BAMUM LETTER PHASE-C YU MUOMAE +168A3 BAMUM LETTER PHASE-C NZEUM +168A4 BAMUM LETTER PHASE-C MBUE +168A5 BAMUM LETTER PHASE-C NSEUAEN +168A6 BAMUM LETTER PHASE-C MBIT +168A7 BAMUM LETTER PHASE-C YEUQ +168A8 BAMUM LETTER PHASE-C KPARAQ +168A9 BAMUM LETTER PHASE-C KAA +168AA BAMUM LETTER PHASE-C SEUX +168AB BAMUM LETTER PHASE-C NDIDA +168AC BAMUM LETTER PHASE-C TAASHAE +168AD BAMUM LETTER PHASE-C NJUEQ +168AE BAMUM LETTER PHASE-C TITA YUE +168AF BAMUM LETTER PHASE-C SUAET +168B0 BAMUM LETTER PHASE-C NGGUAEN NYAM +168B1 BAMUM LETTER PHASE-C VEUX +168B2 BAMUM LETTER PHASE-C NANSANAQ +168B3 BAMUM LETTER PHASE-C MA KEUAERI +168B4 BAMUM LETTER PHASE-C NTAA +168B5 BAMUM LETTER PHASE-C NGGUON +168B6 BAMUM LETTER PHASE-C LAP +168B7 BAMUM LETTER PHASE-C MBIRIEEN +168B8 BAMUM LETTER PHASE-C MGBASAQ +168B9 BAMUM LETTER PHASE-C NTEUNGBA +168BA BAMUM LETTER PHASE-C TEUTEUX +168BB BAMUM LETTER PHASE-C NGGUM +168BC BAMUM LETTER PHASE-C FUE +168BD BAMUM LETTER PHASE-C NDEUT +168BE BAMUM LETTER PHASE-C NSA +168BF BAMUM LETTER PHASE-C NSHAQ +168C0 BAMUM LETTER PHASE-C BUNG +168C1 BAMUM LETTER PHASE-C VEUAEPEN +168C2 BAMUM LETTER PHASE-C MBERAE +168C3 BAMUM LETTER PHASE-C RU +168C4 BAMUM LETTER PHASE-C NJAEM +168C5 BAMUM LETTER PHASE-C LAM +168C6 BAMUM LETTER PHASE-C TITUAEP +168C7 BAMUM LETTER PHASE-C NSUOT NGOM +168C8 BAMUM LETTER PHASE-C NJEEEE +168C9 BAMUM LETTER PHASE-C KET +168CA BAMUM LETTER PHASE-C NGGU +168CB BAMUM LETTER PHASE-C MAESI +168CC BAMUM LETTER PHASE-C MBUAEM +168CD BAMUM LETTER PHASE-C LU +168CE BAMUM LETTER PHASE-C KUT +168CF BAMUM LETTER PHASE-C NJAM +168D0 BAMUM LETTER PHASE-C NGOM +168D1 BAMUM LETTER PHASE-C WUP +168D2 BAMUM LETTER PHASE-C NGGUEET +168D3 BAMUM LETTER PHASE-C NSOM +168D4 BAMUM LETTER PHASE-C NTEN +168D5 BAMUM LETTER PHASE-C KUOP NKAARAE +168D6 BAMUM LETTER PHASE-C NSUN +168D7 BAMUM LETTER PHASE-C NDAM +168D8 BAMUM LETTER PHASE-C MA NSIEE +168D9 BAMUM LETTER PHASE-C YAA +168DA BAMUM LETTER PHASE-C NDAP +168DB BAMUM LETTER PHASE-C SHUEQ +168DC BAMUM LETTER PHASE-C SETFON +168DD BAMUM LETTER PHASE-C MBI +168DE BAMUM LETTER PHASE-C MAEMBA +168DF BAMUM LETTER PHASE-C MBANYI +168E0 BAMUM LETTER PHASE-C KEUSEUX +168E1 BAMUM LETTER PHASE-C MBEUX +168E2 BAMUM LETTER PHASE-C KEUM +168E3 BAMUM LETTER PHASE-C MBAA PICKET +168E4 BAMUM LETTER PHASE-C YUWOQ +168E5 BAMUM LETTER PHASE-C NJEUX +168E6 BAMUM LETTER PHASE-C MIEE +168E7 BAMUM LETTER PHASE-C MUAE +168E8 BAMUM LETTER PHASE-C SHIQ +168E9 BAMUM LETTER PHASE-C KEN LAW +168EA BAMUM LETTER PHASE-C KEN FATIGUE +168EB BAMUM LETTER PHASE-C NGAQ +168EC BAMUM LETTER PHASE-C NAQ +168ED BAMUM LETTER PHASE-C LIQ +168EE BAMUM LETTER PHASE-C PIN +168EF BAMUM LETTER PHASE-C PEN +168F0 BAMUM LETTER PHASE-C TET +168F1 BAMUM LETTER PHASE-D MBUO +168F2 BAMUM LETTER PHASE-D WAP +168F3 BAMUM LETTER PHASE-D NJI +168F4 BAMUM LETTER PHASE-D MFON +168F5 BAMUM LETTER PHASE-D NJIEE +168F6 BAMUM LETTER PHASE-D LIEE +168F7 BAMUM LETTER PHASE-D NJEUT +168F8 BAMUM LETTER PHASE-D NSHEE +168F9 BAMUM LETTER PHASE-D NGGAAMAE +168FA BAMUM LETTER PHASE-D NYAM +168FB BAMUM LETTER PHASE-D WUAEN +168FC BAMUM LETTER PHASE-D NGKUN +168FD BAMUM LETTER PHASE-D SHEE +168FE BAMUM LETTER PHASE-D NGKAP +168FF BAMUM LETTER PHASE-D KEUAETMEUN +16900 BAMUM LETTER PHASE-D TEUT +16901 BAMUM LETTER PHASE-D SHEUAE +16902 BAMUM LETTER PHASE-D NJAP +16903 BAMUM LETTER PHASE-D SUE +16904 BAMUM LETTER PHASE-D KET +16905 BAMUM LETTER PHASE-D YAEMMAE +16906 BAMUM LETTER PHASE-D KUOM +16907 BAMUM LETTER PHASE-D SAP +16908 BAMUM LETTER PHASE-D MFEUT +16909 BAMUM LETTER PHASE-D NDEUX +1690A BAMUM LETTER PHASE-D MALEERI +1690B BAMUM LETTER PHASE-D MEUT +1690C BAMUM LETTER PHASE-D SEUAEQ +1690D BAMUM LETTER PHASE-D YEN +1690E BAMUM LETTER PHASE-D NJEUAEM +1690F BAMUM LETTER PHASE-D KEUOT MBUAE +16910 BAMUM LETTER PHASE-D NGKEURI +16911 BAMUM LETTER PHASE-D TU +16912 BAMUM LETTER PHASE-D GHAA +16913 BAMUM LETTER PHASE-D NGKYEE +16914 BAMUM LETTER PHASE-D FEUFEUAET +16915 BAMUM LETTER PHASE-D NDEE +16916 BAMUM LETTER PHASE-D MGBOFUM +16917 BAMUM LETTER PHASE-D LEUAEP +16918 BAMUM LETTER PHASE-D NDON +16919 BAMUM LETTER PHASE-D MONI +1691A BAMUM LETTER PHASE-D MGBEUN +1691B BAMUM LETTER PHASE-D PUUT +1691C BAMUM LETTER PHASE-D MGBIEE +1691D BAMUM LETTER PHASE-D MFO +1691E BAMUM LETTER PHASE-D LUM +1691F BAMUM LETTER PHASE-D NSIEEP +16920 BAMUM LETTER PHASE-D MBAA +16921 BAMUM LETTER PHASE-D KWAET +16922 BAMUM LETTER PHASE-D NYET +16923 BAMUM LETTER PHASE-D TEUAEN +16924 BAMUM LETTER PHASE-D SOT +16925 BAMUM LETTER PHASE-D YUWOQ +16926 BAMUM LETTER PHASE-D KEUM +16927 BAMUM LETTER PHASE-D RAEM +16928 BAMUM LETTER PHASE-D TEEEE +16929 BAMUM LETTER PHASE-D NGKEUAEQ +1692A BAMUM LETTER PHASE-D MFEUAE +1692B BAMUM LETTER PHASE-D NSIEET +1692C BAMUM LETTER PHASE-D KEUP +1692D BAMUM LETTER PHASE-D PIP +1692E BAMUM LETTER PHASE-D PEUTAE +1692F BAMUM LETTER PHASE-D NYUE +16930 BAMUM LETTER PHASE-D LET +16931 BAMUM LETTER PHASE-D NGGAAM +16932 BAMUM LETTER PHASE-D MFIEE +16933 BAMUM LETTER PHASE-D NGGWAEN +16934 BAMUM LETTER PHASE-D YUOM +16935 BAMUM LETTER PHASE-D PAP +16936 BAMUM LETTER PHASE-D YUOP +16937 BAMUM LETTER PHASE-D NDAM +16938 BAMUM LETTER PHASE-D NTEUM +16939 BAMUM LETTER PHASE-D SUAE +1693A BAMUM LETTER PHASE-D KUN +1693B BAMUM LETTER PHASE-D NGGEUX +1693C BAMUM LETTER PHASE-D NGKIEE +1693D BAMUM LETTER PHASE-D TUOT +1693E BAMUM LETTER PHASE-D MEUN +1693F BAMUM LETTER PHASE-D KUQ +16940 BAMUM LETTER PHASE-D NSUM +16941 BAMUM LETTER PHASE-D TEUN +16942 BAMUM LETTER PHASE-D MAENJET +16943 BAMUM LETTER PHASE-D NGGAP +16944 BAMUM LETTER PHASE-D LEUM +16945 BAMUM LETTER PHASE-D NGGUOM +16946 BAMUM LETTER PHASE-D NSHUT +16947 BAMUM LETTER PHASE-D NJUEQ +16948 BAMUM LETTER PHASE-D GHEUAE +16949 BAMUM LETTER PHASE-D KU +1694A BAMUM LETTER PHASE-D REN OLD +1694B BAMUM LETTER PHASE-D TAE +1694C BAMUM LETTER PHASE-D TOQ +1694D BAMUM LETTER PHASE-D NYI +1694E BAMUM LETTER PHASE-D RII +1694F BAMUM LETTER PHASE-D LEEEE +16950 BAMUM LETTER PHASE-D MEEEE +16951 BAMUM LETTER PHASE-D M +16952 BAMUM LETTER PHASE-D SUU +16953 BAMUM LETTER PHASE-D MU +16954 BAMUM LETTER PHASE-D SHII +16955 BAMUM LETTER PHASE-D SHEUX +16956 BAMUM LETTER PHASE-D KYEE +16957 BAMUM LETTER PHASE-D NU +16958 BAMUM LETTER PHASE-D SHU +16959 BAMUM LETTER PHASE-D NTEE +1695A BAMUM LETTER PHASE-D PEE +1695B BAMUM LETTER PHASE-D NI +1695C BAMUM LETTER PHASE-D SHOQ +1695D BAMUM LETTER PHASE-D PUQ +1695E BAMUM LETTER PHASE-D MVOP +1695F BAMUM LETTER PHASE-D LOQ +16960 BAMUM LETTER PHASE-D REN MUCH +16961 BAMUM LETTER PHASE-D TI +16962 BAMUM LETTER PHASE-D NTUU +16963 BAMUM LETTER PHASE-D MBAA SEVEN +16964 BAMUM LETTER PHASE-D SAQ +16965 BAMUM LETTER PHASE-D FAA +16966 BAMUM LETTER PHASE-E NDAP +16967 BAMUM LETTER PHASE-E TOON +16968 BAMUM LETTER PHASE-E MBEUM +16969 BAMUM LETTER PHASE-E LAP +1696A BAMUM LETTER PHASE-E VOM +1696B BAMUM LETTER PHASE-E LOON +1696C BAMUM LETTER PHASE-E PAA +1696D BAMUM LETTER PHASE-E SOM +1696E BAMUM LETTER PHASE-E RAQ +1696F BAMUM LETTER PHASE-E NSHUOP +16970 BAMUM LETTER PHASE-E NDUN +16971 BAMUM LETTER PHASE-E PUAE +16972 BAMUM LETTER PHASE-E TAM +16973 BAMUM LETTER PHASE-E NGKA +16974 BAMUM LETTER PHASE-E KPEUX +16975 BAMUM LETTER PHASE-E WUO +16976 BAMUM LETTER PHASE-E SEE +16977 BAMUM LETTER PHASE-E NGGEUAET +16978 BAMUM LETTER PHASE-E PAAM +16979 BAMUM LETTER PHASE-E TOO +1697A BAMUM LETTER PHASE-E KUOP +1697B BAMUM LETTER PHASE-E LOM +1697C BAMUM LETTER PHASE-E NSHIEE +1697D BAMUM LETTER PHASE-E NGOP +1697E BAMUM LETTER PHASE-E MAEM +1697F BAMUM LETTER PHASE-E NGKEUX +16980 BAMUM LETTER PHASE-E NGOQ +16981 BAMUM LETTER PHASE-E NSHUE +16982 BAMUM LETTER PHASE-E RIMGBA +16983 BAMUM LETTER PHASE-E NJEUX +16984 BAMUM LETTER PHASE-E PEEM +16985 BAMUM LETTER PHASE-E SAA +16986 BAMUM LETTER PHASE-E NGGURAE +16987 BAMUM LETTER PHASE-E MGBA +16988 BAMUM LETTER PHASE-E GHEUX +16989 BAMUM LETTER PHASE-E NGKEUAEM +1698A BAMUM LETTER PHASE-E NJAEMLI +1698B BAMUM LETTER PHASE-E MAP +1698C BAMUM LETTER PHASE-E LOOT +1698D BAMUM LETTER PHASE-E NGGEEEE +1698E BAMUM LETTER PHASE-E NDIQ +1698F BAMUM LETTER PHASE-E TAEN NTEUM +16990 BAMUM LETTER PHASE-E SET +16991 BAMUM LETTER PHASE-E PUM +16992 BAMUM LETTER PHASE-E NDAA SOFTNESS +16993 BAMUM LETTER PHASE-E NGGUAESHAE NYAM +16994 BAMUM LETTER PHASE-E YIEE +16995 BAMUM LETTER PHASE-E GHEUN +16996 BAMUM LETTER PHASE-E TUAE +16997 BAMUM LETTER PHASE-E YEUAE +16998 BAMUM LETTER PHASE-E PO +16999 BAMUM LETTER PHASE-E TUMAE +1699A BAMUM LETTER PHASE-E KEUAE +1699B BAMUM LETTER PHASE-E SUAEN +1699C BAMUM LETTER PHASE-E TEUAEQ +1699D BAMUM LETTER PHASE-E VEUAE +1699E BAMUM LETTER PHASE-E WEUX +1699F BAMUM LETTER PHASE-E LAAM +169A0 BAMUM LETTER PHASE-E PU +169A1 BAMUM LETTER PHASE-E TAAQ +169A2 BAMUM LETTER PHASE-E GHAAMAE +169A3 BAMUM LETTER PHASE-E NGEUREUT +169A4 BAMUM LETTER PHASE-E SHEUAEQ +169A5 BAMUM LETTER PHASE-E MGBEN +169A6 BAMUM LETTER PHASE-E MBEE +169A7 BAMUM LETTER PHASE-E NZAQ +169A8 BAMUM LETTER PHASE-E NKOM +169A9 BAMUM LETTER PHASE-E GBET +169AA BAMUM LETTER PHASE-E TUM +169AB BAMUM LETTER PHASE-E KUET +169AC BAMUM LETTER PHASE-E YAP +169AD BAMUM LETTER PHASE-E NYI CLEAVER +169AE BAMUM LETTER PHASE-E YIT +169AF BAMUM LETTER PHASE-E MFEUQ +169B0 BAMUM LETTER PHASE-E NDIAQ +169B1 BAMUM LETTER PHASE-E PIEEQ +169B2 BAMUM LETTER PHASE-E YUEQ +169B3 BAMUM LETTER PHASE-E LEUAEM +169B4 BAMUM LETTER PHASE-E FUE +169B5 BAMUM LETTER PHASE-E GBEUX +169B6 BAMUM LETTER PHASE-E NGKUP +169B7 BAMUM LETTER PHASE-E KET +169B8 BAMUM LETTER PHASE-E MAE +169B9 BAMUM LETTER PHASE-E NGKAAMI +169BA BAMUM LETTER PHASE-E GHET +169BB BAMUM LETTER PHASE-E FA +169BC BAMUM LETTER PHASE-E NTUM +169BD BAMUM LETTER PHASE-E PEUT +169BE BAMUM LETTER PHASE-E YEUM +169BF BAMUM LETTER PHASE-E NGGEUAE +169C0 BAMUM LETTER PHASE-E NYI BETWEEN +169C1 BAMUM LETTER PHASE-E NZUQ +169C2 BAMUM LETTER PHASE-E POON +169C3 BAMUM LETTER PHASE-E MIEE +169C4 BAMUM LETTER PHASE-E FUET +169C5 BAMUM LETTER PHASE-E NAE +169C6 BAMUM LETTER PHASE-E MUAE +169C7 BAMUM LETTER PHASE-E GHEUAE +169C8 BAMUM LETTER PHASE-E FU I +169C9 BAMUM LETTER PHASE-E MVI +169CA BAMUM LETTER PHASE-E PUAQ +169CB BAMUM LETTER PHASE-E NGKUM +169CC BAMUM LETTER PHASE-E KUT +169CD BAMUM LETTER PHASE-E PIET +169CE BAMUM LETTER PHASE-E NTAP +169CF BAMUM LETTER PHASE-E YEUAET +169D0 BAMUM LETTER PHASE-E NGGUP +169D1 BAMUM LETTER PHASE-E PA PEOPLE +169D2 BAMUM LETTER PHASE-E FU CALL +169D3 BAMUM LETTER PHASE-E FOM +169D4 BAMUM LETTER PHASE-E NJEE +169D5 BAMUM LETTER PHASE-E A +169D6 BAMUM LETTER PHASE-E TOQ +169D7 BAMUM LETTER PHASE-E O +169D8 BAMUM LETTER PHASE-E I +169D9 BAMUM LETTER PHASE-E LAQ +169DA BAMUM LETTER PHASE-E PA PLURAL +169DB BAMUM LETTER PHASE-E TAA +169DC BAMUM LETTER PHASE-E TAQ +169DD BAMUM LETTER PHASE-E NDAA MY HOUSE +169DE BAMUM LETTER PHASE-E SHIQ +169DF BAMUM LETTER PHASE-E YEUX +169E0 BAMUM LETTER PHASE-E NGUAE +169E1 BAMUM LETTER PHASE-E YUAEN +169E2 BAMUM LETTER PHASE-E YOQ SWIMMING +169E3 BAMUM LETTER PHASE-E YOQ COVER +169E4 BAMUM LETTER PHASE-E YUQ +169E5 BAMUM LETTER PHASE-E YUN +169E6 BAMUM LETTER PHASE-E KEUX +169E7 BAMUM LETTER PHASE-E PEUX +169E8 BAMUM LETTER PHASE-E NJEE EPOCH +169E9 BAMUM LETTER PHASE-E PUE +169EA BAMUM LETTER PHASE-E WUE +169EB BAMUM LETTER PHASE-E FEE +169EC BAMUM LETTER PHASE-E VEE +169ED BAMUM LETTER PHASE-E LU +169EE BAMUM LETTER PHASE-E MI +169EF BAMUM LETTER PHASE-E REUX +169F0 BAMUM LETTER PHASE-E RAE +169F1 BAMUM LETTER PHASE-E NGUAET +169F2 BAMUM LETTER PHASE-E NGA +169F3 BAMUM LETTER PHASE-E SHO +169F4 BAMUM LETTER PHASE-E SHOQ +169F5 BAMUM LETTER PHASE-E FU REMEDY +169F6 BAMUM LETTER PHASE-E NA +169F7 BAMUM LETTER PHASE-E PI +169F8 BAMUM LETTER PHASE-E LOQ +169F9 BAMUM LETTER PHASE-E KO +169FA BAMUM LETTER PHASE-E MEN +169FB BAMUM LETTER PHASE-E MA +169FC BAMUM LETTER PHASE-E MAQ +169FD BAMUM LETTER PHASE-E TEU +169FE BAMUM LETTER PHASE-E KI +169FF BAMUM LETTER PHASE-E MON +16A00 BAMUM LETTER PHASE-E TEN +16A01 BAMUM LETTER PHASE-E FAQ +16A02 BAMUM LETTER PHASE-E GHOM +16A03 BAMUM LETTER PHASE-F KA +16A04 BAMUM LETTER PHASE-F U +16A05 BAMUM LETTER PHASE-F KU +16A06 BAMUM LETTER PHASE-F EE +16A07 BAMUM LETTER PHASE-F REE +16A08 BAMUM LETTER PHASE-F TAE +16A09 BAMUM LETTER PHASE-F NYI +16A0A BAMUM LETTER PHASE-F LA +16A0B BAMUM LETTER PHASE-F RII +16A0C BAMUM LETTER PHASE-F RIEE +16A0D BAMUM LETTER PHASE-F MEEEE +16A0E BAMUM LETTER PHASE-F TAA +16A0F BAMUM LETTER PHASE-F NDAA +16A10 BAMUM LETTER PHASE-F NJAEM +16A11 BAMUM LETTER PHASE-F M +16A12 BAMUM LETTER PHASE-F SUU +16A13 BAMUM LETTER PHASE-F SHII +16A14 BAMUM LETTER PHASE-F SI +16A15 BAMUM LETTER PHASE-F SEUX +16A16 BAMUM LETTER PHASE-F KYEE +16A17 BAMUM LETTER PHASE-F KET +16A18 BAMUM LETTER PHASE-F NUAE +16A19 BAMUM LETTER PHASE-F NU +16A1A BAMUM LETTER PHASE-F NJUAE +16A1B BAMUM LETTER PHASE-F YOQ +16A1C BAMUM LETTER PHASE-F SHU +16A1D BAMUM LETTER PHASE-F YA +16A1E BAMUM LETTER PHASE-F NSHA +16A1F BAMUM LETTER PHASE-F PEUX +16A20 BAMUM LETTER PHASE-F NTEE +16A21 BAMUM LETTER PHASE-F WUE +16A22 BAMUM LETTER PHASE-F PEE +16A23 BAMUM LETTER PHASE-F RU +16A24 BAMUM LETTER PHASE-F NI +16A25 BAMUM LETTER PHASE-F REUX +16A26 BAMUM LETTER PHASE-F KEN +16A27 BAMUM LETTER PHASE-F NGKWAEN +16A28 BAMUM LETTER PHASE-F NGGA +16A29 BAMUM LETTER PHASE-F SHO +16A2A BAMUM LETTER PHASE-F PUAE +16A2B BAMUM LETTER PHASE-F FOM +16A2C BAMUM LETTER PHASE-F WA +16A2D BAMUM LETTER PHASE-F LI +16A2E BAMUM LETTER PHASE-F LOQ +16A2F BAMUM LETTER PHASE-F KO +16A30 BAMUM LETTER PHASE-F MBEN +16A31 BAMUM LETTER PHASE-F REN +16A32 BAMUM LETTER PHASE-F MA +16A33 BAMUM LETTER PHASE-F MO +16A34 BAMUM LETTER PHASE-F MBAA +16A35 BAMUM LETTER PHASE-F TET +16A36 BAMUM LETTER PHASE-F KPA +16A37 BAMUM LETTER PHASE-F SAMBA +16A38 BAMUM LETTER PHASE-F VUEQ +16A40 MRO LETTER TA +16A41 MRO LETTER NGI +16A42 MRO LETTER YO +16A43 MRO LETTER MIM +16A44 MRO LETTER BA +16A45 MRO LETTER DA +16A46 MRO LETTER A +16A47 MRO LETTER PHI +16A48 MRO LETTER KHAI +16A49 MRO LETTER HAO +16A4A MRO LETTER DAI +16A4B MRO LETTER CHU +16A4C MRO LETTER KEAAE +16A4D MRO LETTER OL +16A4E MRO LETTER MAEM +16A4F MRO LETTER NIN +16A50 MRO LETTER PA +16A51 MRO LETTER OO +16A52 MRO LETTER O +16A53 MRO LETTER RO +16A54 MRO LETTER SHI +16A55 MRO LETTER THEA +16A56 MRO LETTER EA +16A57 MRO LETTER WA +16A58 MRO LETTER E +16A59 MRO LETTER KO +16A5A MRO LETTER LAN +16A5B MRO LETTER LA +16A5C MRO LETTER HAI +16A5D MRO LETTER RI +16A5E MRO LETTER TEK +16A60 MRO DIGIT ZERO +16A61 MRO DIGIT ONE +16A62 MRO DIGIT TWO +16A63 MRO DIGIT THREE +16A64 MRO DIGIT FOUR +16A65 MRO DIGIT FIVE +16A66 MRO DIGIT SIX +16A67 MRO DIGIT SEVEN +16A68 MRO DIGIT EIGHT +16A69 MRO DIGIT NINE +16A6E MRO DANDA +16A6F MRO DOUBLE DANDA +16AD0 BASSA VAH LETTER ENNI +16AD1 BASSA VAH LETTER KA +16AD2 BASSA VAH LETTER SE +16AD3 BASSA VAH LETTER FA +16AD4 BASSA VAH LETTER MBE +16AD5 BASSA VAH LETTER YIE +16AD6 BASSA VAH LETTER GAH +16AD7 BASSA VAH LETTER DHII +16AD8 BASSA VAH LETTER KPAH +16AD9 BASSA VAH LETTER JO +16ADA BASSA VAH LETTER HWAH +16ADB BASSA VAH LETTER WA +16ADC BASSA VAH LETTER ZO +16ADD BASSA VAH LETTER GBU +16ADE BASSA VAH LETTER DO +16ADF BASSA VAH LETTER CE +16AE0 BASSA VAH LETTER UWU +16AE1 BASSA VAH LETTER TO +16AE2 BASSA VAH LETTER BA +16AE3 BASSA VAH LETTER VU +16AE4 BASSA VAH LETTER YEIN +16AE5 BASSA VAH LETTER PA +16AE6 BASSA VAH LETTER WADDA +16AE7 BASSA VAH LETTER A +16AE8 BASSA VAH LETTER O +16AE9 BASSA VAH LETTER OO +16AEA BASSA VAH LETTER U +16AEB BASSA VAH LETTER EE +16AEC BASSA VAH LETTER E +16AED BASSA VAH LETTER I +16AF0 BASSA VAH COMBINING HIGH TONE +16AF1 BASSA VAH COMBINING LOW TONE +16AF2 BASSA VAH COMBINING MID TONE +16AF3 BASSA VAH COMBINING LOW-MID TONE +16AF4 BASSA VAH COMBINING HIGH-LOW TONE +16AF5 BASSA VAH FULL STOP +16B00 PAHAWH HMONG VOWEL KEEB +16B01 PAHAWH HMONG VOWEL KEEV +16B02 PAHAWH HMONG VOWEL KIB +16B03 PAHAWH HMONG VOWEL KIV +16B04 PAHAWH HMONG VOWEL KAUB +16B05 PAHAWH HMONG VOWEL KAUV +16B06 PAHAWH HMONG VOWEL KUB +16B07 PAHAWH HMONG VOWEL KUV +16B08 PAHAWH HMONG VOWEL KEB +16B09 PAHAWH HMONG VOWEL KEV +16B0A PAHAWH HMONG VOWEL KAIB +16B0B PAHAWH HMONG VOWEL KAIV +16B0C PAHAWH HMONG VOWEL KOOB +16B0D PAHAWH HMONG VOWEL KOOV +16B0E PAHAWH HMONG VOWEL KAWB +16B0F PAHAWH HMONG VOWEL KAWV +16B10 PAHAWH HMONG VOWEL KUAB +16B11 PAHAWH HMONG VOWEL KUAV +16B12 PAHAWH HMONG VOWEL KOB +16B13 PAHAWH HMONG VOWEL KOV +16B14 PAHAWH HMONG VOWEL KIAB +16B15 PAHAWH HMONG VOWEL KIAV +16B16 PAHAWH HMONG VOWEL KAB +16B17 PAHAWH HMONG VOWEL KAV +16B18 PAHAWH HMONG VOWEL KWB +16B19 PAHAWH HMONG VOWEL KWV +16B1A PAHAWH HMONG VOWEL KAAB +16B1B PAHAWH HMONG VOWEL KAAV +16B1C PAHAWH HMONG CONSONANT VAU +16B1D PAHAWH HMONG CONSONANT NTSAU +16B1E PAHAWH HMONG CONSONANT LAU +16B1F PAHAWH HMONG CONSONANT HAU +16B20 PAHAWH HMONG CONSONANT NLAU +16B21 PAHAWH HMONG CONSONANT RAU +16B22 PAHAWH HMONG CONSONANT NKAU +16B23 PAHAWH HMONG CONSONANT QHAU +16B24 PAHAWH HMONG CONSONANT YAU +16B25 PAHAWH HMONG CONSONANT HLAU +16B26 PAHAWH HMONG CONSONANT MAU +16B27 PAHAWH HMONG CONSONANT CHAU +16B28 PAHAWH HMONG CONSONANT NCHAU +16B29 PAHAWH HMONG CONSONANT HNAU +16B2A PAHAWH HMONG CONSONANT PLHAU +16B2B PAHAWH HMONG CONSONANT NTHAU +16B2C PAHAWH HMONG CONSONANT NAU +16B2D PAHAWH HMONG CONSONANT AU +16B2E PAHAWH HMONG CONSONANT XAU +16B2F PAHAWH HMONG CONSONANT CAU +16B30 PAHAWH HMONG MARK CIM TUB +16B31 PAHAWH HMONG MARK CIM SO +16B32 PAHAWH HMONG MARK CIM KES +16B33 PAHAWH HMONG MARK CIM KHAV +16B34 PAHAWH HMONG MARK CIM SUAM +16B35 PAHAWH HMONG MARK CIM HOM +16B36 PAHAWH HMONG MARK CIM TAUM +16B37 PAHAWH HMONG SIGN VOS THOM +16B38 PAHAWH HMONG SIGN VOS TSHAB CEEB +16B39 PAHAWH HMONG SIGN CIM CHEEM +16B3A PAHAWH HMONG SIGN VOS THIAB +16B3B PAHAWH HMONG SIGN VOS FEEM +16B3C PAHAWH HMONG SIGN XYEEM NTXIV +16B3D PAHAWH HMONG SIGN XYEEM RHO +16B3E PAHAWH HMONG SIGN XYEEM TOV +16B3F PAHAWH HMONG SIGN XYEEM FAIB +16B40 PAHAWH HMONG SIGN VOS SEEV +16B41 PAHAWH HMONG SIGN MEEJ SUAB +16B42 PAHAWH HMONG SIGN VOS NRUA +16B43 PAHAWH HMONG SIGN IB YAM +16B44 PAHAWH HMONG SIGN XAUS +16B45 PAHAWH HMONG SIGN CIM TSOV ROG +16B50 PAHAWH HMONG DIGIT ZERO +16B51 PAHAWH HMONG DIGIT ONE +16B52 PAHAWH HMONG DIGIT TWO +16B53 PAHAWH HMONG DIGIT THREE +16B54 PAHAWH HMONG DIGIT FOUR +16B55 PAHAWH HMONG DIGIT FIVE +16B56 PAHAWH HMONG DIGIT SIX +16B57 PAHAWH HMONG DIGIT SEVEN +16B58 PAHAWH HMONG DIGIT EIGHT +16B59 PAHAWH HMONG DIGIT NINE +16B5B PAHAWH HMONG NUMBER TENS +16B5C PAHAWH HMONG NUMBER HUNDREDS +16B5D PAHAWH HMONG NUMBER TEN THOUSANDS +16B5E PAHAWH HMONG NUMBER MILLIONS +16B5F PAHAWH HMONG NUMBER HUNDRED MILLIONS +16B60 PAHAWH HMONG NUMBER TEN BILLIONS +16B61 PAHAWH HMONG NUMBER TRILLIONS +16B63 PAHAWH HMONG SIGN VOS LUB +16B64 PAHAWH HMONG SIGN XYOO +16B65 PAHAWH HMONG SIGN HLI +16B66 PAHAWH HMONG SIGN THIRD-STAGE HLI +16B67 PAHAWH HMONG SIGN ZWJ THAJ +16B68 PAHAWH HMONG SIGN HNUB +16B69 PAHAWH HMONG SIGN NQIG +16B6A PAHAWH HMONG SIGN XIAB +16B6B PAHAWH HMONG SIGN NTUJ +16B6C PAHAWH HMONG SIGN AV +16B6D PAHAWH HMONG SIGN TXHEEJ CEEV +16B6E PAHAWH HMONG SIGN MEEJ TSEEB +16B6F PAHAWH HMONG SIGN TAU +16B70 PAHAWH HMONG SIGN LOS +16B71 PAHAWH HMONG SIGN MUS +16B72 PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG +16B73 PAHAWH HMONG SIGN CIM CUAM TSHOOJ +16B74 PAHAWH HMONG SIGN CIM TXWV +16B75 PAHAWH HMONG SIGN CIM TXWV CHWV +16B76 PAHAWH HMONG SIGN CIM PUB DAWB +16B77 PAHAWH HMONG SIGN CIM NRES TOS +16B7D PAHAWH HMONG CLAN SIGN TSHEEJ +16B7E PAHAWH HMONG CLAN SIGN YEEG +16B7F PAHAWH HMONG CLAN SIGN LIS +16B80 PAHAWH HMONG CLAN SIGN LAUJ +16B81 PAHAWH HMONG CLAN SIGN XYOOJ +16B82 PAHAWH HMONG CLAN SIGN KOO +16B83 PAHAWH HMONG CLAN SIGN HAWJ +16B84 PAHAWH HMONG CLAN SIGN MUAS +16B85 PAHAWH HMONG CLAN SIGN THOJ +16B86 PAHAWH HMONG CLAN SIGN TSAB +16B87 PAHAWH HMONG CLAN SIGN PHAB +16B88 PAHAWH HMONG CLAN SIGN KHAB +16B89 PAHAWH HMONG CLAN SIGN HAM +16B8A PAHAWH HMONG CLAN SIGN VAJ +16B8B PAHAWH HMONG CLAN SIGN FAJ +16B8C PAHAWH HMONG CLAN SIGN YAJ +16B8D PAHAWH HMONG CLAN SIGN TSWB +16B8E PAHAWH HMONG CLAN SIGN KWM +16B8F PAHAWH HMONG CLAN SIGN VWJ +16F00 MIAO LETTER PA +16F01 MIAO LETTER BA +16F02 MIAO LETTER YI PA +16F03 MIAO LETTER PLA +16F04 MIAO LETTER MA +16F05 MIAO LETTER MHA +16F06 MIAO LETTER ARCHAIC MA +16F07 MIAO LETTER FA +16F08 MIAO LETTER VA +16F09 MIAO LETTER VFA +16F0A MIAO LETTER TA +16F0B MIAO LETTER DA +16F0C MIAO LETTER YI TTA +16F0D MIAO LETTER YI TA +16F0E MIAO LETTER TTA +16F0F MIAO LETTER DDA +16F10 MIAO LETTER NA +16F11 MIAO LETTER NHA +16F12 MIAO LETTER YI NNA +16F13 MIAO LETTER ARCHAIC NA +16F14 MIAO LETTER NNA +16F15 MIAO LETTER NNHA +16F16 MIAO LETTER LA +16F17 MIAO LETTER LYA +16F18 MIAO LETTER LHA +16F19 MIAO LETTER LHYA +16F1A MIAO LETTER TLHA +16F1B MIAO LETTER DLHA +16F1C MIAO LETTER TLHYA +16F1D MIAO LETTER DLHYA +16F1E MIAO LETTER KA +16F1F MIAO LETTER GA +16F20 MIAO LETTER YI KA +16F21 MIAO LETTER QA +16F22 MIAO LETTER QGA +16F23 MIAO LETTER NGA +16F24 MIAO LETTER NGHA +16F25 MIAO LETTER ARCHAIC NGA +16F26 MIAO LETTER HA +16F27 MIAO LETTER XA +16F28 MIAO LETTER GHA +16F29 MIAO LETTER GHHA +16F2A MIAO LETTER TSSA +16F2B MIAO LETTER DZZA +16F2C MIAO LETTER NYA +16F2D MIAO LETTER NYHA +16F2E MIAO LETTER TSHA +16F2F MIAO LETTER DZHA +16F30 MIAO LETTER YI TSHA +16F31 MIAO LETTER YI DZHA +16F32 MIAO LETTER REFORMED TSHA +16F33 MIAO LETTER SHA +16F34 MIAO LETTER SSA +16F35 MIAO LETTER ZHA +16F36 MIAO LETTER ZSHA +16F37 MIAO LETTER TSA +16F38 MIAO LETTER DZA +16F39 MIAO LETTER YI TSA +16F3A MIAO LETTER SA +16F3B MIAO LETTER ZA +16F3C MIAO LETTER ZSA +16F3D MIAO LETTER ZZA +16F3E MIAO LETTER ZZSA +16F3F MIAO LETTER ARCHAIC ZZA +16F40 MIAO LETTER ZZYA +16F41 MIAO LETTER ZZSYA +16F42 MIAO LETTER WA +16F43 MIAO LETTER AH +16F44 MIAO LETTER HHA +16F50 MIAO LETTER NASALIZATION +16F51 MIAO SIGN ASPIRATION +16F52 MIAO SIGN REFORMED VOICING +16F53 MIAO SIGN REFORMED ASPIRATION +16F54 MIAO VOWEL SIGN A +16F55 MIAO VOWEL SIGN AA +16F56 MIAO VOWEL SIGN AHH +16F57 MIAO VOWEL SIGN AN +16F58 MIAO VOWEL SIGN ANG +16F59 MIAO VOWEL SIGN O +16F5A MIAO VOWEL SIGN OO +16F5B MIAO VOWEL SIGN WO +16F5C MIAO VOWEL SIGN W +16F5D MIAO VOWEL SIGN E +16F5E MIAO VOWEL SIGN EN +16F5F MIAO VOWEL SIGN ENG +16F60 MIAO VOWEL SIGN OEY +16F61 MIAO VOWEL SIGN I +16F62 MIAO VOWEL SIGN IA +16F63 MIAO VOWEL SIGN IAN +16F64 MIAO VOWEL SIGN IANG +16F65 MIAO VOWEL SIGN IO +16F66 MIAO VOWEL SIGN IE +16F67 MIAO VOWEL SIGN II +16F68 MIAO VOWEL SIGN IU +16F69 MIAO VOWEL SIGN ING +16F6A MIAO VOWEL SIGN U +16F6B MIAO VOWEL SIGN UA +16F6C MIAO VOWEL SIGN UAN +16F6D MIAO VOWEL SIGN UANG +16F6E MIAO VOWEL SIGN UU +16F6F MIAO VOWEL SIGN UEI +16F70 MIAO VOWEL SIGN UNG +16F71 MIAO VOWEL SIGN Y +16F72 MIAO VOWEL SIGN YI +16F73 MIAO VOWEL SIGN AE +16F74 MIAO VOWEL SIGN AEE +16F75 MIAO VOWEL SIGN ERR +16F76 MIAO VOWEL SIGN ROUNDED ERR +16F77 MIAO VOWEL SIGN ER +16F78 MIAO VOWEL SIGN ROUNDED ER +16F79 MIAO VOWEL SIGN AI +16F7A MIAO VOWEL SIGN EI +16F7B MIAO VOWEL SIGN AU +16F7C MIAO VOWEL SIGN OU +16F7D MIAO VOWEL SIGN N +16F7E MIAO VOWEL SIGN NG +16F8F MIAO TONE RIGHT +16F90 MIAO TONE TOP RIGHT +16F91 MIAO TONE ABOVE +16F92 MIAO TONE BELOW +16F93 MIAO LETTER TONE-2 +16F94 MIAO LETTER TONE-3 +16F95 MIAO LETTER TONE-4 +16F96 MIAO LETTER TONE-5 +16F97 MIAO LETTER TONE-6 +16F98 MIAO LETTER TONE-7 +16F99 MIAO LETTER TONE-8 +16F9A MIAO LETTER REFORMED TONE-1 +16F9B MIAO LETTER REFORMED TONE-2 +16F9C MIAO LETTER REFORMED TONE-4 +16F9D MIAO LETTER REFORMED TONE-5 +16F9E MIAO LETTER REFORMED TONE-6 +16F9F MIAO LETTER REFORMED TONE-8 +16FE0 TANGUT ITERATION MARK +16FE1 NUSHU ITERATION MARK +18800 TANGUT COMPONENT-001 +18801 TANGUT COMPONENT-002 +18802 TANGUT COMPONENT-003 +18803 TANGUT COMPONENT-004 +18804 TANGUT COMPONENT-005 +18805 TANGUT COMPONENT-006 +18806 TANGUT COMPONENT-007 +18807 TANGUT COMPONENT-008 +18808 TANGUT COMPONENT-009 +18809 TANGUT COMPONENT-010 +1880A TANGUT COMPONENT-011 +1880B TANGUT COMPONENT-012 +1880C TANGUT COMPONENT-013 +1880D TANGUT COMPONENT-014 +1880E TANGUT COMPONENT-015 +1880F TANGUT COMPONENT-016 +18810 TANGUT COMPONENT-017 +18811 TANGUT COMPONENT-018 +18812 TANGUT COMPONENT-019 +18813 TANGUT COMPONENT-020 +18814 TANGUT COMPONENT-021 +18815 TANGUT COMPONENT-022 +18816 TANGUT COMPONENT-023 +18817 TANGUT COMPONENT-024 +18818 TANGUT COMPONENT-025 +18819 TANGUT COMPONENT-026 +1881A TANGUT COMPONENT-027 +1881B TANGUT COMPONENT-028 +1881C TANGUT COMPONENT-029 +1881D TANGUT COMPONENT-030 +1881E TANGUT COMPONENT-031 +1881F TANGUT COMPONENT-032 +18820 TANGUT COMPONENT-033 +18821 TANGUT COMPONENT-034 +18822 TANGUT COMPONENT-035 +18823 TANGUT COMPONENT-036 +18824 TANGUT COMPONENT-037 +18825 TANGUT COMPONENT-038 +18826 TANGUT COMPONENT-039 +18827 TANGUT COMPONENT-040 +18828 TANGUT COMPONENT-041 +18829 TANGUT COMPONENT-042 +1882A TANGUT COMPONENT-043 +1882B TANGUT COMPONENT-044 +1882C TANGUT COMPONENT-045 +1882D TANGUT COMPONENT-046 +1882E TANGUT COMPONENT-047 +1882F TANGUT COMPONENT-048 +18830 TANGUT COMPONENT-049 +18831 TANGUT COMPONENT-050 +18832 TANGUT COMPONENT-051 +18833 TANGUT COMPONENT-052 +18834 TANGUT COMPONENT-053 +18835 TANGUT COMPONENT-054 +18836 TANGUT COMPONENT-055 +18837 TANGUT COMPONENT-056 +18838 TANGUT COMPONENT-057 +18839 TANGUT COMPONENT-058 +1883A TANGUT COMPONENT-059 +1883B TANGUT COMPONENT-060 +1883C TANGUT COMPONENT-061 +1883D TANGUT COMPONENT-062 +1883E TANGUT COMPONENT-063 +1883F TANGUT COMPONENT-064 +18840 TANGUT COMPONENT-065 +18841 TANGUT COMPONENT-066 +18842 TANGUT COMPONENT-067 +18843 TANGUT COMPONENT-068 +18844 TANGUT COMPONENT-069 +18845 TANGUT COMPONENT-070 +18846 TANGUT COMPONENT-071 +18847 TANGUT COMPONENT-072 +18848 TANGUT COMPONENT-073 +18849 TANGUT COMPONENT-074 +1884A TANGUT COMPONENT-075 +1884B TANGUT COMPONENT-076 +1884C TANGUT COMPONENT-077 +1884D TANGUT COMPONENT-078 +1884E TANGUT COMPONENT-079 +1884F TANGUT COMPONENT-080 +18850 TANGUT COMPONENT-081 +18851 TANGUT COMPONENT-082 +18852 TANGUT COMPONENT-083 +18853 TANGUT COMPONENT-084 +18854 TANGUT COMPONENT-085 +18855 TANGUT COMPONENT-086 +18856 TANGUT COMPONENT-087 +18857 TANGUT COMPONENT-088 +18858 TANGUT COMPONENT-089 +18859 TANGUT COMPONENT-090 +1885A TANGUT COMPONENT-091 +1885B TANGUT COMPONENT-092 +1885C TANGUT COMPONENT-093 +1885D TANGUT COMPONENT-094 +1885E TANGUT COMPONENT-095 +1885F TANGUT COMPONENT-096 +18860 TANGUT COMPONENT-097 +18861 TANGUT COMPONENT-098 +18862 TANGUT COMPONENT-099 +18863 TANGUT COMPONENT-100 +18864 TANGUT COMPONENT-101 +18865 TANGUT COMPONENT-102 +18866 TANGUT COMPONENT-103 +18867 TANGUT COMPONENT-104 +18868 TANGUT COMPONENT-105 +18869 TANGUT COMPONENT-106 +1886A TANGUT COMPONENT-107 +1886B TANGUT COMPONENT-108 +1886C TANGUT COMPONENT-109 +1886D TANGUT COMPONENT-110 +1886E TANGUT COMPONENT-111 +1886F TANGUT COMPONENT-112 +18870 TANGUT COMPONENT-113 +18871 TANGUT COMPONENT-114 +18872 TANGUT COMPONENT-115 +18873 TANGUT COMPONENT-116 +18874 TANGUT COMPONENT-117 +18875 TANGUT COMPONENT-118 +18876 TANGUT COMPONENT-119 +18877 TANGUT COMPONENT-120 +18878 TANGUT COMPONENT-121 +18879 TANGUT COMPONENT-122 +1887A TANGUT COMPONENT-123 +1887B TANGUT COMPONENT-124 +1887C TANGUT COMPONENT-125 +1887D TANGUT COMPONENT-126 +1887E TANGUT COMPONENT-127 +1887F TANGUT COMPONENT-128 +18880 TANGUT COMPONENT-129 +18881 TANGUT COMPONENT-130 +18882 TANGUT COMPONENT-131 +18883 TANGUT COMPONENT-132 +18884 TANGUT COMPONENT-133 +18885 TANGUT COMPONENT-134 +18886 TANGUT COMPONENT-135 +18887 TANGUT COMPONENT-136 +18888 TANGUT COMPONENT-137 +18889 TANGUT COMPONENT-138 +1888A TANGUT COMPONENT-139 +1888B TANGUT COMPONENT-140 +1888C TANGUT COMPONENT-141 +1888D TANGUT COMPONENT-142 +1888E TANGUT COMPONENT-143 +1888F TANGUT COMPONENT-144 +18890 TANGUT COMPONENT-145 +18891 TANGUT COMPONENT-146 +18892 TANGUT COMPONENT-147 +18893 TANGUT COMPONENT-148 +18894 TANGUT COMPONENT-149 +18895 TANGUT COMPONENT-150 +18896 TANGUT COMPONENT-151 +18897 TANGUT COMPONENT-152 +18898 TANGUT COMPONENT-153 +18899 TANGUT COMPONENT-154 +1889A TANGUT COMPONENT-155 +1889B TANGUT COMPONENT-156 +1889C TANGUT COMPONENT-157 +1889D TANGUT COMPONENT-158 +1889E TANGUT COMPONENT-159 +1889F TANGUT COMPONENT-160 +188A0 TANGUT COMPONENT-161 +188A1 TANGUT COMPONENT-162 +188A2 TANGUT COMPONENT-163 +188A3 TANGUT COMPONENT-164 +188A4 TANGUT COMPONENT-165 +188A5 TANGUT COMPONENT-166 +188A6 TANGUT COMPONENT-167 +188A7 TANGUT COMPONENT-168 +188A8 TANGUT COMPONENT-169 +188A9 TANGUT COMPONENT-170 +188AA TANGUT COMPONENT-171 +188AB TANGUT COMPONENT-172 +188AC TANGUT COMPONENT-173 +188AD TANGUT COMPONENT-174 +188AE TANGUT COMPONENT-175 +188AF TANGUT COMPONENT-176 +188B0 TANGUT COMPONENT-177 +188B1 TANGUT COMPONENT-178 +188B2 TANGUT COMPONENT-179 +188B3 TANGUT COMPONENT-180 +188B4 TANGUT COMPONENT-181 +188B5 TANGUT COMPONENT-182 +188B6 TANGUT COMPONENT-183 +188B7 TANGUT COMPONENT-184 +188B8 TANGUT COMPONENT-185 +188B9 TANGUT COMPONENT-186 +188BA TANGUT COMPONENT-187 +188BB TANGUT COMPONENT-188 +188BC TANGUT COMPONENT-189 +188BD TANGUT COMPONENT-190 +188BE TANGUT COMPONENT-191 +188BF TANGUT COMPONENT-192 +188C0 TANGUT COMPONENT-193 +188C1 TANGUT COMPONENT-194 +188C2 TANGUT COMPONENT-195 +188C3 TANGUT COMPONENT-196 +188C4 TANGUT COMPONENT-197 +188C5 TANGUT COMPONENT-198 +188C6 TANGUT COMPONENT-199 +188C7 TANGUT COMPONENT-200 +188C8 TANGUT COMPONENT-201 +188C9 TANGUT COMPONENT-202 +188CA TANGUT COMPONENT-203 +188CB TANGUT COMPONENT-204 +188CC TANGUT COMPONENT-205 +188CD TANGUT COMPONENT-206 +188CE TANGUT COMPONENT-207 +188CF TANGUT COMPONENT-208 +188D0 TANGUT COMPONENT-209 +188D1 TANGUT COMPONENT-210 +188D2 TANGUT COMPONENT-211 +188D3 TANGUT COMPONENT-212 +188D4 TANGUT COMPONENT-213 +188D5 TANGUT COMPONENT-214 +188D6 TANGUT COMPONENT-215 +188D7 TANGUT COMPONENT-216 +188D8 TANGUT COMPONENT-217 +188D9 TANGUT COMPONENT-218 +188DA TANGUT COMPONENT-219 +188DB TANGUT COMPONENT-220 +188DC TANGUT COMPONENT-221 +188DD TANGUT COMPONENT-222 +188DE TANGUT COMPONENT-223 +188DF TANGUT COMPONENT-224 +188E0 TANGUT COMPONENT-225 +188E1 TANGUT COMPONENT-226 +188E2 TANGUT COMPONENT-227 +188E3 TANGUT COMPONENT-228 +188E4 TANGUT COMPONENT-229 +188E5 TANGUT COMPONENT-230 +188E6 TANGUT COMPONENT-231 +188E7 TANGUT COMPONENT-232 +188E8 TANGUT COMPONENT-233 +188E9 TANGUT COMPONENT-234 +188EA TANGUT COMPONENT-235 +188EB TANGUT COMPONENT-236 +188EC TANGUT COMPONENT-237 +188ED TANGUT COMPONENT-238 +188EE TANGUT COMPONENT-239 +188EF TANGUT COMPONENT-240 +188F0 TANGUT COMPONENT-241 +188F1 TANGUT COMPONENT-242 +188F2 TANGUT COMPONENT-243 +188F3 TANGUT COMPONENT-244 +188F4 TANGUT COMPONENT-245 +188F5 TANGUT COMPONENT-246 +188F6 TANGUT COMPONENT-247 +188F7 TANGUT COMPONENT-248 +188F8 TANGUT COMPONENT-249 +188F9 TANGUT COMPONENT-250 +188FA TANGUT COMPONENT-251 +188FB TANGUT COMPONENT-252 +188FC TANGUT COMPONENT-253 +188FD TANGUT COMPONENT-254 +188FE TANGUT COMPONENT-255 +188FF TANGUT COMPONENT-256 +18900 TANGUT COMPONENT-257 +18901 TANGUT COMPONENT-258 +18902 TANGUT COMPONENT-259 +18903 TANGUT COMPONENT-260 +18904 TANGUT COMPONENT-261 +18905 TANGUT COMPONENT-262 +18906 TANGUT COMPONENT-263 +18907 TANGUT COMPONENT-264 +18908 TANGUT COMPONENT-265 +18909 TANGUT COMPONENT-266 +1890A TANGUT COMPONENT-267 +1890B TANGUT COMPONENT-268 +1890C TANGUT COMPONENT-269 +1890D TANGUT COMPONENT-270 +1890E TANGUT COMPONENT-271 +1890F TANGUT COMPONENT-272 +18910 TANGUT COMPONENT-273 +18911 TANGUT COMPONENT-274 +18912 TANGUT COMPONENT-275 +18913 TANGUT COMPONENT-276 +18914 TANGUT COMPONENT-277 +18915 TANGUT COMPONENT-278 +18916 TANGUT COMPONENT-279 +18917 TANGUT COMPONENT-280 +18918 TANGUT COMPONENT-281 +18919 TANGUT COMPONENT-282 +1891A TANGUT COMPONENT-283 +1891B TANGUT COMPONENT-284 +1891C TANGUT COMPONENT-285 +1891D TANGUT COMPONENT-286 +1891E TANGUT COMPONENT-287 +1891F TANGUT COMPONENT-288 +18920 TANGUT COMPONENT-289 +18921 TANGUT COMPONENT-290 +18922 TANGUT COMPONENT-291 +18923 TANGUT COMPONENT-292 +18924 TANGUT COMPONENT-293 +18925 TANGUT COMPONENT-294 +18926 TANGUT COMPONENT-295 +18927 TANGUT COMPONENT-296 +18928 TANGUT COMPONENT-297 +18929 TANGUT COMPONENT-298 +1892A TANGUT COMPONENT-299 +1892B TANGUT COMPONENT-300 +1892C TANGUT COMPONENT-301 +1892D TANGUT COMPONENT-302 +1892E TANGUT COMPONENT-303 +1892F TANGUT COMPONENT-304 +18930 TANGUT COMPONENT-305 +18931 TANGUT COMPONENT-306 +18932 TANGUT COMPONENT-307 +18933 TANGUT COMPONENT-308 +18934 TANGUT COMPONENT-309 +18935 TANGUT COMPONENT-310 +18936 TANGUT COMPONENT-311 +18937 TANGUT COMPONENT-312 +18938 TANGUT COMPONENT-313 +18939 TANGUT COMPONENT-314 +1893A TANGUT COMPONENT-315 +1893B TANGUT COMPONENT-316 +1893C TANGUT COMPONENT-317 +1893D TANGUT COMPONENT-318 +1893E TANGUT COMPONENT-319 +1893F TANGUT COMPONENT-320 +18940 TANGUT COMPONENT-321 +18941 TANGUT COMPONENT-322 +18942 TANGUT COMPONENT-323 +18943 TANGUT COMPONENT-324 +18944 TANGUT COMPONENT-325 +18945 TANGUT COMPONENT-326 +18946 TANGUT COMPONENT-327 +18947 TANGUT COMPONENT-328 +18948 TANGUT COMPONENT-329 +18949 TANGUT COMPONENT-330 +1894A TANGUT COMPONENT-331 +1894B TANGUT COMPONENT-332 +1894C TANGUT COMPONENT-333 +1894D TANGUT COMPONENT-334 +1894E TANGUT COMPONENT-335 +1894F TANGUT COMPONENT-336 +18950 TANGUT COMPONENT-337 +18951 TANGUT COMPONENT-338 +18952 TANGUT COMPONENT-339 +18953 TANGUT COMPONENT-340 +18954 TANGUT COMPONENT-341 +18955 TANGUT COMPONENT-342 +18956 TANGUT COMPONENT-343 +18957 TANGUT COMPONENT-344 +18958 TANGUT COMPONENT-345 +18959 TANGUT COMPONENT-346 +1895A TANGUT COMPONENT-347 +1895B TANGUT COMPONENT-348 +1895C TANGUT COMPONENT-349 +1895D TANGUT COMPONENT-350 +1895E TANGUT COMPONENT-351 +1895F TANGUT COMPONENT-352 +18960 TANGUT COMPONENT-353 +18961 TANGUT COMPONENT-354 +18962 TANGUT COMPONENT-355 +18963 TANGUT COMPONENT-356 +18964 TANGUT COMPONENT-357 +18965 TANGUT COMPONENT-358 +18966 TANGUT COMPONENT-359 +18967 TANGUT COMPONENT-360 +18968 TANGUT COMPONENT-361 +18969 TANGUT COMPONENT-362 +1896A TANGUT COMPONENT-363 +1896B TANGUT COMPONENT-364 +1896C TANGUT COMPONENT-365 +1896D TANGUT COMPONENT-366 +1896E TANGUT COMPONENT-367 +1896F TANGUT COMPONENT-368 +18970 TANGUT COMPONENT-369 +18971 TANGUT COMPONENT-370 +18972 TANGUT COMPONENT-371 +18973 TANGUT COMPONENT-372 +18974 TANGUT COMPONENT-373 +18975 TANGUT COMPONENT-374 +18976 TANGUT COMPONENT-375 +18977 TANGUT COMPONENT-376 +18978 TANGUT COMPONENT-377 +18979 TANGUT COMPONENT-378 +1897A TANGUT COMPONENT-379 +1897B TANGUT COMPONENT-380 +1897C TANGUT COMPONENT-381 +1897D TANGUT COMPONENT-382 +1897E TANGUT COMPONENT-383 +1897F TANGUT COMPONENT-384 +18980 TANGUT COMPONENT-385 +18981 TANGUT COMPONENT-386 +18982 TANGUT COMPONENT-387 +18983 TANGUT COMPONENT-388 +18984 TANGUT COMPONENT-389 +18985 TANGUT COMPONENT-390 +18986 TANGUT COMPONENT-391 +18987 TANGUT COMPONENT-392 +18988 TANGUT COMPONENT-393 +18989 TANGUT COMPONENT-394 +1898A TANGUT COMPONENT-395 +1898B TANGUT COMPONENT-396 +1898C TANGUT COMPONENT-397 +1898D TANGUT COMPONENT-398 +1898E TANGUT COMPONENT-399 +1898F TANGUT COMPONENT-400 +18990 TANGUT COMPONENT-401 +18991 TANGUT COMPONENT-402 +18992 TANGUT COMPONENT-403 +18993 TANGUT COMPONENT-404 +18994 TANGUT COMPONENT-405 +18995 TANGUT COMPONENT-406 +18996 TANGUT COMPONENT-407 +18997 TANGUT COMPONENT-408 +18998 TANGUT COMPONENT-409 +18999 TANGUT COMPONENT-410 +1899A TANGUT COMPONENT-411 +1899B TANGUT COMPONENT-412 +1899C TANGUT COMPONENT-413 +1899D TANGUT COMPONENT-414 +1899E TANGUT COMPONENT-415 +1899F TANGUT COMPONENT-416 +189A0 TANGUT COMPONENT-417 +189A1 TANGUT COMPONENT-418 +189A2 TANGUT COMPONENT-419 +189A3 TANGUT COMPONENT-420 +189A4 TANGUT COMPONENT-421 +189A5 TANGUT COMPONENT-422 +189A6 TANGUT COMPONENT-423 +189A7 TANGUT COMPONENT-424 +189A8 TANGUT COMPONENT-425 +189A9 TANGUT COMPONENT-426 +189AA TANGUT COMPONENT-427 +189AB TANGUT COMPONENT-428 +189AC TANGUT COMPONENT-429 +189AD TANGUT COMPONENT-430 +189AE TANGUT COMPONENT-431 +189AF TANGUT COMPONENT-432 +189B0 TANGUT COMPONENT-433 +189B1 TANGUT COMPONENT-434 +189B2 TANGUT COMPONENT-435 +189B3 TANGUT COMPONENT-436 +189B4 TANGUT COMPONENT-437 +189B5 TANGUT COMPONENT-438 +189B6 TANGUT COMPONENT-439 +189B7 TANGUT COMPONENT-440 +189B8 TANGUT COMPONENT-441 +189B9 TANGUT COMPONENT-442 +189BA TANGUT COMPONENT-443 +189BB TANGUT COMPONENT-444 +189BC TANGUT COMPONENT-445 +189BD TANGUT COMPONENT-446 +189BE TANGUT COMPONENT-447 +189BF TANGUT COMPONENT-448 +189C0 TANGUT COMPONENT-449 +189C1 TANGUT COMPONENT-450 +189C2 TANGUT COMPONENT-451 +189C3 TANGUT COMPONENT-452 +189C4 TANGUT COMPONENT-453 +189C5 TANGUT COMPONENT-454 +189C6 TANGUT COMPONENT-455 +189C7 TANGUT COMPONENT-456 +189C8 TANGUT COMPONENT-457 +189C9 TANGUT COMPONENT-458 +189CA TANGUT COMPONENT-459 +189CB TANGUT COMPONENT-460 +189CC TANGUT COMPONENT-461 +189CD TANGUT COMPONENT-462 +189CE TANGUT COMPONENT-463 +189CF TANGUT COMPONENT-464 +189D0 TANGUT COMPONENT-465 +189D1 TANGUT COMPONENT-466 +189D2 TANGUT COMPONENT-467 +189D3 TANGUT COMPONENT-468 +189D4 TANGUT COMPONENT-469 +189D5 TANGUT COMPONENT-470 +189D6 TANGUT COMPONENT-471 +189D7 TANGUT COMPONENT-472 +189D8 TANGUT COMPONENT-473 +189D9 TANGUT COMPONENT-474 +189DA TANGUT COMPONENT-475 +189DB TANGUT COMPONENT-476 +189DC TANGUT COMPONENT-477 +189DD TANGUT COMPONENT-478 +189DE TANGUT COMPONENT-479 +189DF TANGUT COMPONENT-480 +189E0 TANGUT COMPONENT-481 +189E1 TANGUT COMPONENT-482 +189E2 TANGUT COMPONENT-483 +189E3 TANGUT COMPONENT-484 +189E4 TANGUT COMPONENT-485 +189E5 TANGUT COMPONENT-486 +189E6 TANGUT COMPONENT-487 +189E7 TANGUT COMPONENT-488 +189E8 TANGUT COMPONENT-489 +189E9 TANGUT COMPONENT-490 +189EA TANGUT COMPONENT-491 +189EB TANGUT COMPONENT-492 +189EC TANGUT COMPONENT-493 +189ED TANGUT COMPONENT-494 +189EE TANGUT COMPONENT-495 +189EF TANGUT COMPONENT-496 +189F0 TANGUT COMPONENT-497 +189F1 TANGUT COMPONENT-498 +189F2 TANGUT COMPONENT-499 +189F3 TANGUT COMPONENT-500 +189F4 TANGUT COMPONENT-501 +189F5 TANGUT COMPONENT-502 +189F6 TANGUT COMPONENT-503 +189F7 TANGUT COMPONENT-504 +189F8 TANGUT COMPONENT-505 +189F9 TANGUT COMPONENT-506 +189FA TANGUT COMPONENT-507 +189FB TANGUT COMPONENT-508 +189FC TANGUT COMPONENT-509 +189FD TANGUT COMPONENT-510 +189FE TANGUT COMPONENT-511 +189FF TANGUT COMPONENT-512 +18A00 TANGUT COMPONENT-513 +18A01 TANGUT COMPONENT-514 +18A02 TANGUT COMPONENT-515 +18A03 TANGUT COMPONENT-516 +18A04 TANGUT COMPONENT-517 +18A05 TANGUT COMPONENT-518 +18A06 TANGUT COMPONENT-519 +18A07 TANGUT COMPONENT-520 +18A08 TANGUT COMPONENT-521 +18A09 TANGUT COMPONENT-522 +18A0A TANGUT COMPONENT-523 +18A0B TANGUT COMPONENT-524 +18A0C TANGUT COMPONENT-525 +18A0D TANGUT COMPONENT-526 +18A0E TANGUT COMPONENT-527 +18A0F TANGUT COMPONENT-528 +18A10 TANGUT COMPONENT-529 +18A11 TANGUT COMPONENT-530 +18A12 TANGUT COMPONENT-531 +18A13 TANGUT COMPONENT-532 +18A14 TANGUT COMPONENT-533 +18A15 TANGUT COMPONENT-534 +18A16 TANGUT COMPONENT-535 +18A17 TANGUT COMPONENT-536 +18A18 TANGUT COMPONENT-537 +18A19 TANGUT COMPONENT-538 +18A1A TANGUT COMPONENT-539 +18A1B TANGUT COMPONENT-540 +18A1C TANGUT COMPONENT-541 +18A1D TANGUT COMPONENT-542 +18A1E TANGUT COMPONENT-543 +18A1F TANGUT COMPONENT-544 +18A20 TANGUT COMPONENT-545 +18A21 TANGUT COMPONENT-546 +18A22 TANGUT COMPONENT-547 +18A23 TANGUT COMPONENT-548 +18A24 TANGUT COMPONENT-549 +18A25 TANGUT COMPONENT-550 +18A26 TANGUT COMPONENT-551 +18A27 TANGUT COMPONENT-552 +18A28 TANGUT COMPONENT-553 +18A29 TANGUT COMPONENT-554 +18A2A TANGUT COMPONENT-555 +18A2B TANGUT COMPONENT-556 +18A2C TANGUT COMPONENT-557 +18A2D TANGUT COMPONENT-558 +18A2E TANGUT COMPONENT-559 +18A2F TANGUT COMPONENT-560 +18A30 TANGUT COMPONENT-561 +18A31 TANGUT COMPONENT-562 +18A32 TANGUT COMPONENT-563 +18A33 TANGUT COMPONENT-564 +18A34 TANGUT COMPONENT-565 +18A35 TANGUT COMPONENT-566 +18A36 TANGUT COMPONENT-567 +18A37 TANGUT COMPONENT-568 +18A38 TANGUT COMPONENT-569 +18A39 TANGUT COMPONENT-570 +18A3A TANGUT COMPONENT-571 +18A3B TANGUT COMPONENT-572 +18A3C TANGUT COMPONENT-573 +18A3D TANGUT COMPONENT-574 +18A3E TANGUT COMPONENT-575 +18A3F TANGUT COMPONENT-576 +18A40 TANGUT COMPONENT-577 +18A41 TANGUT COMPONENT-578 +18A42 TANGUT COMPONENT-579 +18A43 TANGUT COMPONENT-580 +18A44 TANGUT COMPONENT-581 +18A45 TANGUT COMPONENT-582 +18A46 TANGUT COMPONENT-583 +18A47 TANGUT COMPONENT-584 +18A48 TANGUT COMPONENT-585 +18A49 TANGUT COMPONENT-586 +18A4A TANGUT COMPONENT-587 +18A4B TANGUT COMPONENT-588 +18A4C TANGUT COMPONENT-589 +18A4D TANGUT COMPONENT-590 +18A4E TANGUT COMPONENT-591 +18A4F TANGUT COMPONENT-592 +18A50 TANGUT COMPONENT-593 +18A51 TANGUT COMPONENT-594 +18A52 TANGUT COMPONENT-595 +18A53 TANGUT COMPONENT-596 +18A54 TANGUT COMPONENT-597 +18A55 TANGUT COMPONENT-598 +18A56 TANGUT COMPONENT-599 +18A57 TANGUT COMPONENT-600 +18A58 TANGUT COMPONENT-601 +18A59 TANGUT COMPONENT-602 +18A5A TANGUT COMPONENT-603 +18A5B TANGUT COMPONENT-604 +18A5C TANGUT COMPONENT-605 +18A5D TANGUT COMPONENT-606 +18A5E TANGUT COMPONENT-607 +18A5F TANGUT COMPONENT-608 +18A60 TANGUT COMPONENT-609 +18A61 TANGUT COMPONENT-610 +18A62 TANGUT COMPONENT-611 +18A63 TANGUT COMPONENT-612 +18A64 TANGUT COMPONENT-613 +18A65 TANGUT COMPONENT-614 +18A66 TANGUT COMPONENT-615 +18A67 TANGUT COMPONENT-616 +18A68 TANGUT COMPONENT-617 +18A69 TANGUT COMPONENT-618 +18A6A TANGUT COMPONENT-619 +18A6B TANGUT COMPONENT-620 +18A6C TANGUT COMPONENT-621 +18A6D TANGUT COMPONENT-622 +18A6E TANGUT COMPONENT-623 +18A6F TANGUT COMPONENT-624 +18A70 TANGUT COMPONENT-625 +18A71 TANGUT COMPONENT-626 +18A72 TANGUT COMPONENT-627 +18A73 TANGUT COMPONENT-628 +18A74 TANGUT COMPONENT-629 +18A75 TANGUT COMPONENT-630 +18A76 TANGUT COMPONENT-631 +18A77 TANGUT COMPONENT-632 +18A78 TANGUT COMPONENT-633 +18A79 TANGUT COMPONENT-634 +18A7A TANGUT COMPONENT-635 +18A7B TANGUT COMPONENT-636 +18A7C TANGUT COMPONENT-637 +18A7D TANGUT COMPONENT-638 +18A7E TANGUT COMPONENT-639 +18A7F TANGUT COMPONENT-640 +18A80 TANGUT COMPONENT-641 +18A81 TANGUT COMPONENT-642 +18A82 TANGUT COMPONENT-643 +18A83 TANGUT COMPONENT-644 +18A84 TANGUT COMPONENT-645 +18A85 TANGUT COMPONENT-646 +18A86 TANGUT COMPONENT-647 +18A87 TANGUT COMPONENT-648 +18A88 TANGUT COMPONENT-649 +18A89 TANGUT COMPONENT-650 +18A8A TANGUT COMPONENT-651 +18A8B TANGUT COMPONENT-652 +18A8C TANGUT COMPONENT-653 +18A8D TANGUT COMPONENT-654 +18A8E TANGUT COMPONENT-655 +18A8F TANGUT COMPONENT-656 +18A90 TANGUT COMPONENT-657 +18A91 TANGUT COMPONENT-658 +18A92 TANGUT COMPONENT-659 +18A93 TANGUT COMPONENT-660 +18A94 TANGUT COMPONENT-661 +18A95 TANGUT COMPONENT-662 +18A96 TANGUT COMPONENT-663 +18A97 TANGUT COMPONENT-664 +18A98 TANGUT COMPONENT-665 +18A99 TANGUT COMPONENT-666 +18A9A TANGUT COMPONENT-667 +18A9B TANGUT COMPONENT-668 +18A9C TANGUT COMPONENT-669 +18A9D TANGUT COMPONENT-670 +18A9E TANGUT COMPONENT-671 +18A9F TANGUT COMPONENT-672 +18AA0 TANGUT COMPONENT-673 +18AA1 TANGUT COMPONENT-674 +18AA2 TANGUT COMPONENT-675 +18AA3 TANGUT COMPONENT-676 +18AA4 TANGUT COMPONENT-677 +18AA5 TANGUT COMPONENT-678 +18AA6 TANGUT COMPONENT-679 +18AA7 TANGUT COMPONENT-680 +18AA8 TANGUT COMPONENT-681 +18AA9 TANGUT COMPONENT-682 +18AAA TANGUT COMPONENT-683 +18AAB TANGUT COMPONENT-684 +18AAC TANGUT COMPONENT-685 +18AAD TANGUT COMPONENT-686 +18AAE TANGUT COMPONENT-687 +18AAF TANGUT COMPONENT-688 +18AB0 TANGUT COMPONENT-689 +18AB1 TANGUT COMPONENT-690 +18AB2 TANGUT COMPONENT-691 +18AB3 TANGUT COMPONENT-692 +18AB4 TANGUT COMPONENT-693 +18AB5 TANGUT COMPONENT-694 +18AB6 TANGUT COMPONENT-695 +18AB7 TANGUT COMPONENT-696 +18AB8 TANGUT COMPONENT-697 +18AB9 TANGUT COMPONENT-698 +18ABA TANGUT COMPONENT-699 +18ABB TANGUT COMPONENT-700 +18ABC TANGUT COMPONENT-701 +18ABD TANGUT COMPONENT-702 +18ABE TANGUT COMPONENT-703 +18ABF TANGUT COMPONENT-704 +18AC0 TANGUT COMPONENT-705 +18AC1 TANGUT COMPONENT-706 +18AC2 TANGUT COMPONENT-707 +18AC3 TANGUT COMPONENT-708 +18AC4 TANGUT COMPONENT-709 +18AC5 TANGUT COMPONENT-710 +18AC6 TANGUT COMPONENT-711 +18AC7 TANGUT COMPONENT-712 +18AC8 TANGUT COMPONENT-713 +18AC9 TANGUT COMPONENT-714 +18ACA TANGUT COMPONENT-715 +18ACB TANGUT COMPONENT-716 +18ACC TANGUT COMPONENT-717 +18ACD TANGUT COMPONENT-718 +18ACE TANGUT COMPONENT-719 +18ACF TANGUT COMPONENT-720 +18AD0 TANGUT COMPONENT-721 +18AD1 TANGUT COMPONENT-722 +18AD2 TANGUT COMPONENT-723 +18AD3 TANGUT COMPONENT-724 +18AD4 TANGUT COMPONENT-725 +18AD5 TANGUT COMPONENT-726 +18AD6 TANGUT COMPONENT-727 +18AD7 TANGUT COMPONENT-728 +18AD8 TANGUT COMPONENT-729 +18AD9 TANGUT COMPONENT-730 +18ADA TANGUT COMPONENT-731 +18ADB TANGUT COMPONENT-732 +18ADC TANGUT COMPONENT-733 +18ADD TANGUT COMPONENT-734 +18ADE TANGUT COMPONENT-735 +18ADF TANGUT COMPONENT-736 +18AE0 TANGUT COMPONENT-737 +18AE1 TANGUT COMPONENT-738 +18AE2 TANGUT COMPONENT-739 +18AE3 TANGUT COMPONENT-740 +18AE4 TANGUT COMPONENT-741 +18AE5 TANGUT COMPONENT-742 +18AE6 TANGUT COMPONENT-743 +18AE7 TANGUT COMPONENT-744 +18AE8 TANGUT COMPONENT-745 +18AE9 TANGUT COMPONENT-746 +18AEA TANGUT COMPONENT-747 +18AEB TANGUT COMPONENT-748 +18AEC TANGUT COMPONENT-749 +18AED TANGUT COMPONENT-750 +18AEE TANGUT COMPONENT-751 +18AEF TANGUT COMPONENT-752 +18AF0 TANGUT COMPONENT-753 +18AF1 TANGUT COMPONENT-754 +18AF2 TANGUT COMPONENT-755 +1B000 KATAKANA LETTER ARCHAIC E +1B001 HENTAIGANA LETTER E-1 +1B001 HIRAGANA LETTER ARCHAIC YE +1B002 HENTAIGANA LETTER A-1 +1B003 HENTAIGANA LETTER A-2 +1B004 HENTAIGANA LETTER A-3 +1B005 HENTAIGANA LETTER A-WO +1B006 HENTAIGANA LETTER I-1 +1B007 HENTAIGANA LETTER I-2 +1B008 HENTAIGANA LETTER I-3 +1B009 HENTAIGANA LETTER I-4 +1B00A HENTAIGANA LETTER U-1 +1B00B HENTAIGANA LETTER U-2 +1B00C HENTAIGANA LETTER U-3 +1B00D HENTAIGANA LETTER U-4 +1B00E HENTAIGANA LETTER U-5 +1B00F HENTAIGANA LETTER E-2 +1B010 HENTAIGANA LETTER E-3 +1B011 HENTAIGANA LETTER E-4 +1B012 HENTAIGANA LETTER E-5 +1B013 HENTAIGANA LETTER E-6 +1B014 HENTAIGANA LETTER O-1 +1B015 HENTAIGANA LETTER O-2 +1B016 HENTAIGANA LETTER O-3 +1B017 HENTAIGANA LETTER KA-1 +1B018 HENTAIGANA LETTER KA-2 +1B019 HENTAIGANA LETTER KA-3 +1B01A HENTAIGANA LETTER KA-4 +1B01B HENTAIGANA LETTER KA-5 +1B01C HENTAIGANA LETTER KA-6 +1B01D HENTAIGANA LETTER KA-7 +1B01E HENTAIGANA LETTER KA-8 +1B01F HENTAIGANA LETTER KA-9 +1B020 HENTAIGANA LETTER KA-10 +1B021 HENTAIGANA LETTER KA-11 +1B022 HENTAIGANA LETTER KA-KE +1B023 HENTAIGANA LETTER KI-1 +1B024 HENTAIGANA LETTER KI-2 +1B025 HENTAIGANA LETTER KI-3 +1B026 HENTAIGANA LETTER KI-4 +1B027 HENTAIGANA LETTER KI-5 +1B028 HENTAIGANA LETTER KI-6 +1B029 HENTAIGANA LETTER KI-7 +1B02A HENTAIGANA LETTER KI-8 +1B02B HENTAIGANA LETTER KU-1 +1B02C HENTAIGANA LETTER KU-2 +1B02D HENTAIGANA LETTER KU-3 +1B02E HENTAIGANA LETTER KU-4 +1B02F HENTAIGANA LETTER KU-5 +1B030 HENTAIGANA LETTER KU-6 +1B031 HENTAIGANA LETTER KU-7 +1B032 HENTAIGANA LETTER KE-1 +1B033 HENTAIGANA LETTER KE-2 +1B034 HENTAIGANA LETTER KE-3 +1B035 HENTAIGANA LETTER KE-4 +1B036 HENTAIGANA LETTER KE-5 +1B037 HENTAIGANA LETTER KE-6 +1B038 HENTAIGANA LETTER KO-1 +1B039 HENTAIGANA LETTER KO-2 +1B03A HENTAIGANA LETTER KO-3 +1B03B HENTAIGANA LETTER KO-KI +1B03C HENTAIGANA LETTER SA-1 +1B03D HENTAIGANA LETTER SA-2 +1B03E HENTAIGANA LETTER SA-3 +1B03F HENTAIGANA LETTER SA-4 +1B040 HENTAIGANA LETTER SA-5 +1B041 HENTAIGANA LETTER SA-6 +1B042 HENTAIGANA LETTER SA-7 +1B043 HENTAIGANA LETTER SA-8 +1B044 HENTAIGANA LETTER SI-1 +1B045 HENTAIGANA LETTER SI-2 +1B046 HENTAIGANA LETTER SI-3 +1B047 HENTAIGANA LETTER SI-4 +1B048 HENTAIGANA LETTER SI-5 +1B049 HENTAIGANA LETTER SI-6 +1B04A HENTAIGANA LETTER SU-1 +1B04B HENTAIGANA LETTER SU-2 +1B04C HENTAIGANA LETTER SU-3 +1B04D HENTAIGANA LETTER SU-4 +1B04E HENTAIGANA LETTER SU-5 +1B04F HENTAIGANA LETTER SU-6 +1B050 HENTAIGANA LETTER SU-7 +1B051 HENTAIGANA LETTER SU-8 +1B052 HENTAIGANA LETTER SE-1 +1B053 HENTAIGANA LETTER SE-2 +1B054 HENTAIGANA LETTER SE-3 +1B055 HENTAIGANA LETTER SE-4 +1B056 HENTAIGANA LETTER SE-5 +1B057 HENTAIGANA LETTER SO-1 +1B058 HENTAIGANA LETTER SO-2 +1B059 HENTAIGANA LETTER SO-3 +1B05A HENTAIGANA LETTER SO-4 +1B05B HENTAIGANA LETTER SO-5 +1B05C HENTAIGANA LETTER SO-6 +1B05D HENTAIGANA LETTER SO-7 +1B05E HENTAIGANA LETTER TA-1 +1B05F HENTAIGANA LETTER TA-2 +1B060 HENTAIGANA LETTER TA-3 +1B061 HENTAIGANA LETTER TA-4 +1B062 HENTAIGANA LETTER TI-1 +1B063 HENTAIGANA LETTER TI-2 +1B064 HENTAIGANA LETTER TI-3 +1B065 HENTAIGANA LETTER TI-4 +1B066 HENTAIGANA LETTER TI-5 +1B067 HENTAIGANA LETTER TI-6 +1B068 HENTAIGANA LETTER TI-7 +1B069 HENTAIGANA LETTER TU-1 +1B06A HENTAIGANA LETTER TU-2 +1B06B HENTAIGANA LETTER TU-3 +1B06C HENTAIGANA LETTER TU-4 +1B06D HENTAIGANA LETTER TU-TO +1B06E HENTAIGANA LETTER TE-1 +1B06F HENTAIGANA LETTER TE-2 +1B070 HENTAIGANA LETTER TE-3 +1B071 HENTAIGANA LETTER TE-4 +1B072 HENTAIGANA LETTER TE-5 +1B073 HENTAIGANA LETTER TE-6 +1B074 HENTAIGANA LETTER TE-7 +1B075 HENTAIGANA LETTER TE-8 +1B076 HENTAIGANA LETTER TE-9 +1B077 HENTAIGANA LETTER TO-1 +1B078 HENTAIGANA LETTER TO-2 +1B079 HENTAIGANA LETTER TO-3 +1B07A HENTAIGANA LETTER TO-4 +1B07B HENTAIGANA LETTER TO-5 +1B07C HENTAIGANA LETTER TO-6 +1B07D HENTAIGANA LETTER TO-RA +1B07E HENTAIGANA LETTER NA-1 +1B07F HENTAIGANA LETTER NA-2 +1B080 HENTAIGANA LETTER NA-3 +1B081 HENTAIGANA LETTER NA-4 +1B082 HENTAIGANA LETTER NA-5 +1B083 HENTAIGANA LETTER NA-6 +1B084 HENTAIGANA LETTER NA-7 +1B085 HENTAIGANA LETTER NA-8 +1B086 HENTAIGANA LETTER NA-9 +1B087 HENTAIGANA LETTER NI-1 +1B088 HENTAIGANA LETTER NI-2 +1B089 HENTAIGANA LETTER NI-3 +1B08A HENTAIGANA LETTER NI-4 +1B08B HENTAIGANA LETTER NI-5 +1B08C HENTAIGANA LETTER NI-6 +1B08D HENTAIGANA LETTER NI-7 +1B08E HENTAIGANA LETTER NI-TE +1B08F HENTAIGANA LETTER NU-1 +1B090 HENTAIGANA LETTER NU-2 +1B091 HENTAIGANA LETTER NU-3 +1B092 HENTAIGANA LETTER NE-1 +1B093 HENTAIGANA LETTER NE-2 +1B094 HENTAIGANA LETTER NE-3 +1B095 HENTAIGANA LETTER NE-4 +1B096 HENTAIGANA LETTER NE-5 +1B097 HENTAIGANA LETTER NE-6 +1B098 HENTAIGANA LETTER NE-KO +1B099 HENTAIGANA LETTER NO-1 +1B09A HENTAIGANA LETTER NO-2 +1B09B HENTAIGANA LETTER NO-3 +1B09C HENTAIGANA LETTER NO-4 +1B09D HENTAIGANA LETTER NO-5 +1B09E HENTAIGANA LETTER HA-1 +1B09F HENTAIGANA LETTER HA-2 +1B0A0 HENTAIGANA LETTER HA-3 +1B0A1 HENTAIGANA LETTER HA-4 +1B0A2 HENTAIGANA LETTER HA-5 +1B0A3 HENTAIGANA LETTER HA-6 +1B0A4 HENTAIGANA LETTER HA-7 +1B0A5 HENTAIGANA LETTER HA-8 +1B0A6 HENTAIGANA LETTER HA-9 +1B0A7 HENTAIGANA LETTER HA-10 +1B0A8 HENTAIGANA LETTER HA-11 +1B0A9 HENTAIGANA LETTER HI-1 +1B0AA HENTAIGANA LETTER HI-2 +1B0AB HENTAIGANA LETTER HI-3 +1B0AC HENTAIGANA LETTER HI-4 +1B0AD HENTAIGANA LETTER HI-5 +1B0AE HENTAIGANA LETTER HI-6 +1B0AF HENTAIGANA LETTER HI-7 +1B0B0 HENTAIGANA LETTER HU-1 +1B0B1 HENTAIGANA LETTER HU-2 +1B0B2 HENTAIGANA LETTER HU-3 +1B0B3 HENTAIGANA LETTER HE-1 +1B0B4 HENTAIGANA LETTER HE-2 +1B0B5 HENTAIGANA LETTER HE-3 +1B0B6 HENTAIGANA LETTER HE-4 +1B0B7 HENTAIGANA LETTER HE-5 +1B0B8 HENTAIGANA LETTER HE-6 +1B0B9 HENTAIGANA LETTER HE-7 +1B0BA HENTAIGANA LETTER HO-1 +1B0BB HENTAIGANA LETTER HO-2 +1B0BC HENTAIGANA LETTER HO-3 +1B0BD HENTAIGANA LETTER HO-4 +1B0BE HENTAIGANA LETTER HO-5 +1B0BF HENTAIGANA LETTER HO-6 +1B0C0 HENTAIGANA LETTER HO-7 +1B0C1 HENTAIGANA LETTER HO-8 +1B0C2 HENTAIGANA LETTER MA-1 +1B0C3 HENTAIGANA LETTER MA-2 +1B0C4 HENTAIGANA LETTER MA-3 +1B0C5 HENTAIGANA LETTER MA-4 +1B0C6 HENTAIGANA LETTER MA-5 +1B0C7 HENTAIGANA LETTER MA-6 +1B0C8 HENTAIGANA LETTER MA-7 +1B0C9 HENTAIGANA LETTER MI-1 +1B0CA HENTAIGANA LETTER MI-2 +1B0CB HENTAIGANA LETTER MI-3 +1B0CC HENTAIGANA LETTER MI-4 +1B0CD HENTAIGANA LETTER MI-5 +1B0CE HENTAIGANA LETTER MI-6 +1B0CF HENTAIGANA LETTER MI-7 +1B0D0 HENTAIGANA LETTER MU-1 +1B0D1 HENTAIGANA LETTER MU-2 +1B0D2 HENTAIGANA LETTER MU-3 +1B0D3 HENTAIGANA LETTER MU-4 +1B0D4 HENTAIGANA LETTER ME-1 +1B0D5 HENTAIGANA LETTER ME-2 +1B0D6 HENTAIGANA LETTER ME-MA +1B0D7 HENTAIGANA LETTER MO-1 +1B0D8 HENTAIGANA LETTER MO-2 +1B0D9 HENTAIGANA LETTER MO-3 +1B0DA HENTAIGANA LETTER MO-4 +1B0DB HENTAIGANA LETTER MO-5 +1B0DC HENTAIGANA LETTER MO-6 +1B0DD HENTAIGANA LETTER YA-1 +1B0DE HENTAIGANA LETTER YA-2 +1B0DF HENTAIGANA LETTER YA-3 +1B0E0 HENTAIGANA LETTER YA-4 +1B0E1 HENTAIGANA LETTER YA-5 +1B0E2 HENTAIGANA LETTER YA-YO +1B0E3 HENTAIGANA LETTER YU-1 +1B0E4 HENTAIGANA LETTER YU-2 +1B0E5 HENTAIGANA LETTER YU-3 +1B0E6 HENTAIGANA LETTER YU-4 +1B0E7 HENTAIGANA LETTER YO-1 +1B0E8 HENTAIGANA LETTER YO-2 +1B0E9 HENTAIGANA LETTER YO-3 +1B0EA HENTAIGANA LETTER YO-4 +1B0EB HENTAIGANA LETTER YO-5 +1B0EC HENTAIGANA LETTER YO-6 +1B0ED HENTAIGANA LETTER RA-1 +1B0EE HENTAIGANA LETTER RA-2 +1B0EF HENTAIGANA LETTER RA-3 +1B0F0 HENTAIGANA LETTER RA-4 +1B0F1 HENTAIGANA LETTER RI-1 +1B0F2 HENTAIGANA LETTER RI-2 +1B0F3 HENTAIGANA LETTER RI-3 +1B0F4 HENTAIGANA LETTER RI-4 +1B0F5 HENTAIGANA LETTER RI-5 +1B0F6 HENTAIGANA LETTER RI-6 +1B0F7 HENTAIGANA LETTER RI-7 +1B0F8 HENTAIGANA LETTER RU-1 +1B0F9 HENTAIGANA LETTER RU-2 +1B0FA HENTAIGANA LETTER RU-3 +1B0FB HENTAIGANA LETTER RU-4 +1B0FC HENTAIGANA LETTER RU-5 +1B0FD HENTAIGANA LETTER RU-6 +1B0FE HENTAIGANA LETTER RE-1 +1B0FF HENTAIGANA LETTER RE-2 +1B100 HENTAIGANA LETTER RE-3 +1B101 HENTAIGANA LETTER RE-4 +1B102 HENTAIGANA LETTER RO-1 +1B103 HENTAIGANA LETTER RO-2 +1B104 HENTAIGANA LETTER RO-3 +1B105 HENTAIGANA LETTER RO-4 +1B106 HENTAIGANA LETTER RO-5 +1B107 HENTAIGANA LETTER RO-6 +1B108 HENTAIGANA LETTER WA-1 +1B109 HENTAIGANA LETTER WA-2 +1B10A HENTAIGANA LETTER WA-3 +1B10B HENTAIGANA LETTER WA-4 +1B10C HENTAIGANA LETTER WA-5 +1B10D HENTAIGANA LETTER WI-1 +1B10E HENTAIGANA LETTER WI-2 +1B10F HENTAIGANA LETTER WI-3 +1B110 HENTAIGANA LETTER WI-4 +1B111 HENTAIGANA LETTER WI-5 +1B112 HENTAIGANA LETTER WE-1 +1B113 HENTAIGANA LETTER WE-2 +1B114 HENTAIGANA LETTER WE-3 +1B115 HENTAIGANA LETTER WE-4 +1B116 HENTAIGANA LETTER WO-1 +1B117 HENTAIGANA LETTER WO-2 +1B118 HENTAIGANA LETTER WO-3 +1B119 HENTAIGANA LETTER WO-4 +1B11A HENTAIGANA LETTER WO-5 +1B11B HENTAIGANA LETTER WO-6 +1B11C HENTAIGANA LETTER WO-7 +1B11D HENTAIGANA LETTER N-MU-MO-1 +1B11E HENTAIGANA LETTER N-MU-MO-2 +1BC00 DUPLOYAN LETTER H +1BC01 DUPLOYAN LETTER X +1BC02 DUPLOYAN LETTER P +1BC03 DUPLOYAN LETTER T +1BC04 DUPLOYAN LETTER F +1BC05 DUPLOYAN LETTER K +1BC06 DUPLOYAN LETTER L +1BC07 DUPLOYAN LETTER B +1BC08 DUPLOYAN LETTER D +1BC09 DUPLOYAN LETTER V +1BC0A DUPLOYAN LETTER G +1BC0B DUPLOYAN LETTER R +1BC0C DUPLOYAN LETTER P N +1BC0D DUPLOYAN LETTER D S +1BC0E DUPLOYAN LETTER F N +1BC0F DUPLOYAN LETTER K M +1BC10 DUPLOYAN LETTER R S +1BC11 DUPLOYAN LETTER TH +1BC12 DUPLOYAN LETTER SLOAN DH +1BC13 DUPLOYAN LETTER DH +1BC14 DUPLOYAN LETTER KK +1BC15 DUPLOYAN LETTER SLOAN J +1BC16 DUPLOYAN LETTER HL +1BC17 DUPLOYAN LETTER LH +1BC18 DUPLOYAN LETTER RH +1BC19 DUPLOYAN LETTER M +1BC1A DUPLOYAN LETTER N +1BC1B DUPLOYAN LETTER J +1BC1C DUPLOYAN LETTER S +1BC1D DUPLOYAN LETTER M N +1BC1E DUPLOYAN LETTER N M +1BC1F DUPLOYAN LETTER J M +1BC20 DUPLOYAN LETTER S J +1BC21 DUPLOYAN LETTER M WITH DOT +1BC22 DUPLOYAN LETTER N WITH DOT +1BC23 DUPLOYAN LETTER J WITH DOT +1BC24 DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE +1BC25 DUPLOYAN LETTER S WITH DOT +1BC26 DUPLOYAN LETTER S WITH DOT BELOW +1BC27 DUPLOYAN LETTER M S +1BC28 DUPLOYAN LETTER N S +1BC29 DUPLOYAN LETTER J S +1BC2A DUPLOYAN LETTER S S +1BC2B DUPLOYAN LETTER M N S +1BC2C DUPLOYAN LETTER N M S +1BC2D DUPLOYAN LETTER J M S +1BC2E DUPLOYAN LETTER S J S +1BC2F DUPLOYAN LETTER J S WITH DOT +1BC30 DUPLOYAN LETTER J N +1BC31 DUPLOYAN LETTER J N S +1BC32 DUPLOYAN LETTER S T +1BC33 DUPLOYAN LETTER S T R +1BC34 DUPLOYAN LETTER S P +1BC35 DUPLOYAN LETTER S P R +1BC36 DUPLOYAN LETTER T S +1BC37 DUPLOYAN LETTER T R S +1BC38 DUPLOYAN LETTER W +1BC39 DUPLOYAN LETTER WH +1BC3A DUPLOYAN LETTER W R +1BC3B DUPLOYAN LETTER S N +1BC3C DUPLOYAN LETTER S M +1BC3D DUPLOYAN LETTER K R S +1BC3E DUPLOYAN LETTER G R S +1BC3F DUPLOYAN LETTER S K +1BC40 DUPLOYAN LETTER S K R +1BC41 DUPLOYAN LETTER A +1BC42 DUPLOYAN LETTER SLOAN OW +1BC43 DUPLOYAN LETTER OA +1BC44 DUPLOYAN LETTER O +1BC45 DUPLOYAN LETTER AOU +1BC46 DUPLOYAN LETTER I +1BC47 DUPLOYAN LETTER E +1BC48 DUPLOYAN LETTER IE +1BC49 DUPLOYAN LETTER SHORT I +1BC4A DUPLOYAN LETTER UI +1BC4B DUPLOYAN LETTER EE +1BC4C DUPLOYAN LETTER SLOAN EH +1BC4D DUPLOYAN LETTER ROMANIAN I +1BC4E DUPLOYAN LETTER SLOAN EE +1BC4F DUPLOYAN LETTER LONG I +1BC50 DUPLOYAN LETTER YE +1BC51 DUPLOYAN LETTER U +1BC52 DUPLOYAN LETTER EU +1BC53 DUPLOYAN LETTER XW +1BC54 DUPLOYAN LETTER U N +1BC55 DUPLOYAN LETTER LONG U +1BC56 DUPLOYAN LETTER ROMANIAN U +1BC57 DUPLOYAN LETTER UH +1BC58 DUPLOYAN LETTER SLOAN U +1BC59 DUPLOYAN LETTER OOH +1BC5A DUPLOYAN LETTER OW +1BC5B DUPLOYAN LETTER OU +1BC5C DUPLOYAN LETTER WA +1BC5D DUPLOYAN LETTER WO +1BC5E DUPLOYAN LETTER WI +1BC5F DUPLOYAN LETTER WEI +1BC60 DUPLOYAN LETTER WOW +1BC61 DUPLOYAN LETTER NASAL U +1BC62 DUPLOYAN LETTER NASAL O +1BC63 DUPLOYAN LETTER NASAL I +1BC64 DUPLOYAN LETTER NASAL A +1BC65 DUPLOYAN LETTER PERNIN AN +1BC66 DUPLOYAN LETTER PERNIN AM +1BC67 DUPLOYAN LETTER SLOAN EN +1BC68 DUPLOYAN LETTER SLOAN AN +1BC69 DUPLOYAN LETTER SLOAN ON +1BC6A DUPLOYAN LETTER VOCALIC M +1BC70 DUPLOYAN AFFIX LEFT HORIZONTAL SECANT +1BC71 DUPLOYAN AFFIX MID HORIZONTAL SECANT +1BC72 DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT +1BC73 DUPLOYAN AFFIX LOW VERTICAL SECANT +1BC74 DUPLOYAN AFFIX MID VERTICAL SECANT +1BC75 DUPLOYAN AFFIX HIGH VERTICAL SECANT +1BC76 DUPLOYAN AFFIX ATTACHED SECANT +1BC77 DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT +1BC78 DUPLOYAN AFFIX ATTACHED TANGENT +1BC79 DUPLOYAN AFFIX ATTACHED TAIL +1BC7A DUPLOYAN AFFIX ATTACHED E HOOK +1BC7B DUPLOYAN AFFIX ATTACHED I HOOK +1BC7C DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80 DUPLOYAN AFFIX HIGH ACUTE +1BC81 DUPLOYAN AFFIX HIGH TIGHT ACUTE +1BC82 DUPLOYAN AFFIX HIGH GRAVE +1BC83 DUPLOYAN AFFIX HIGH LONG GRAVE +1BC84 DUPLOYAN AFFIX HIGH DOT +1BC85 DUPLOYAN AFFIX HIGH CIRCLE +1BC86 DUPLOYAN AFFIX HIGH LINE +1BC87 DUPLOYAN AFFIX HIGH WAVE +1BC88 DUPLOYAN AFFIX HIGH VERTICAL +1BC90 DUPLOYAN AFFIX LOW ACUTE +1BC91 DUPLOYAN AFFIX LOW TIGHT ACUTE +1BC92 DUPLOYAN AFFIX LOW GRAVE +1BC93 DUPLOYAN AFFIX LOW LONG GRAVE +1BC94 DUPLOYAN AFFIX LOW DOT +1BC95 DUPLOYAN AFFIX LOW CIRCLE +1BC96 DUPLOYAN AFFIX LOW LINE +1BC97 DUPLOYAN AFFIX LOW WAVE +1BC98 DUPLOYAN AFFIX LOW VERTICAL +1BC99 DUPLOYAN AFFIX LOW ARROW +1BC9C DUPLOYAN SIGN O WITH CROSS +1BC9D DUPLOYAN THICK LETTER SELECTOR +1BC9E DUPLOYAN DOUBLE MARK +1BC9F DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0 SHORTHAND FORMAT LETTER OVERLAP +1BCA1 SHORTHAND FORMAT CONTINUING OVERLAP +1BCA2 SHORTHAND FORMAT DOWN STEP +1BCA3 SHORTHAND FORMAT UP STEP +1D000 BYZANTINE MUSICAL SYMBOL PSILI +1D001 BYZANTINE MUSICAL SYMBOL DASEIA +1D002 BYZANTINE MUSICAL SYMBOL PERISPOMENI +1D003 BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON +1D004 BYZANTINE MUSICAL SYMBOL OXEIA DIPLI +1D005 BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON +1D006 BYZANTINE MUSICAL SYMBOL VAREIA DIPLI +1D007 BYZANTINE MUSICAL SYMBOL KATHISTI +1D008 BYZANTINE MUSICAL SYMBOL SYRMATIKI +1D009 BYZANTINE MUSICAL SYMBOL PARAKLITIKI +1D00A BYZANTINE MUSICAL SYMBOL YPOKRISIS +1D00B BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI +1D00C BYZANTINE MUSICAL SYMBOL KREMASTI +1D00D BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON +1D00E BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON +1D00F BYZANTINE MUSICAL SYMBOL TELEIA +1D010 BYZANTINE MUSICAL SYMBOL KENTIMATA +1D011 BYZANTINE MUSICAL SYMBOL APOSTROFOS +1D012 BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI +1D013 BYZANTINE MUSICAL SYMBOL SYNEVMA +1D014 BYZANTINE MUSICAL SYMBOL THITA +1D015 BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION +1D016 BYZANTINE MUSICAL SYMBOL GORGON ARCHAION +1D017 BYZANTINE MUSICAL SYMBOL PSILON +1D018 BYZANTINE MUSICAL SYMBOL CHAMILON +1D019 BYZANTINE MUSICAL SYMBOL VATHY +1D01A BYZANTINE MUSICAL SYMBOL ISON ARCHAION +1D01B BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION +1D01C BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION +1D01D BYZANTINE MUSICAL SYMBOL SAXIMATA +1D01E BYZANTINE MUSICAL SYMBOL PARICHON +1D01F BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA +1D020 BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION +1D021 BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION +1D022 BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION +1D023 BYZANTINE MUSICAL SYMBOL APOTHEMA +1D024 BYZANTINE MUSICAL SYMBOL KLASMA +1D025 BYZANTINE MUSICAL SYMBOL REVMA +1D026 BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION +1D027 BYZANTINE MUSICAL SYMBOL TINAGMA +1D028 BYZANTINE MUSICAL SYMBOL ANATRICHISMA +1D029 BYZANTINE MUSICAL SYMBOL SEISMA +1D02A BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION +1D02B BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU +1D02C BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION +1D02D BYZANTINE MUSICAL SYMBOL THEMA +1D02E BYZANTINE MUSICAL SYMBOL LEMOI +1D02F BYZANTINE MUSICAL SYMBOL DYO +1D030 BYZANTINE MUSICAL SYMBOL TRIA +1D031 BYZANTINE MUSICAL SYMBOL TESSERA +1D032 BYZANTINE MUSICAL SYMBOL KRATIMATA +1D033 BYZANTINE MUSICAL SYMBOL APESO EXO NEO +1D034 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION +1D035 BYZANTINE MUSICAL SYMBOL IMIFTHORA +1D036 BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION +1D037 BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON +1D038 BYZANTINE MUSICAL SYMBOL PELASTON +1D039 BYZANTINE MUSICAL SYMBOL PSIFISTON +1D03A BYZANTINE MUSICAL SYMBOL KONTEVMA +1D03B BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION +1D03C BYZANTINE MUSICAL SYMBOL RAPISMA +1D03D BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION +1D03E BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION +1D03F BYZANTINE MUSICAL SYMBOL ICHADIN +1D040 BYZANTINE MUSICAL SYMBOL NANA +1D041 BYZANTINE MUSICAL SYMBOL PETASMA +1D042 BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO +1D043 BYZANTINE MUSICAL SYMBOL TROMIKON ALLO +1D044 BYZANTINE MUSICAL SYMBOL STRAGGISMATA +1D045 BYZANTINE MUSICAL SYMBOL GRONTHISMATA +1D046 BYZANTINE MUSICAL SYMBOL ISON NEO +1D047 BYZANTINE MUSICAL SYMBOL OLIGON NEO +1D048 BYZANTINE MUSICAL SYMBOL OXEIA NEO +1D049 BYZANTINE MUSICAL SYMBOL PETASTI +1D04A BYZANTINE MUSICAL SYMBOL KOUFISMA +1D04B BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA +1D04C BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA +1D04D BYZANTINE MUSICAL SYMBOL PELASTON NEO +1D04E BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO +1D04F BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO +1D050 BYZANTINE MUSICAL SYMBOL YPSILI +1D051 BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO +1D052 BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO +1D053 BYZANTINE MUSICAL SYMBOL YPORROI +1D054 BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON +1D055 BYZANTINE MUSICAL SYMBOL ELAFRON +1D056 BYZANTINE MUSICAL SYMBOL CHAMILI +1D057 BYZANTINE MUSICAL SYMBOL MIKRON ISON +1D058 BYZANTINE MUSICAL SYMBOL VAREIA NEO +1D059 BYZANTINE MUSICAL SYMBOL PIASMA NEO +1D05A BYZANTINE MUSICAL SYMBOL PSIFISTON NEO +1D05B BYZANTINE MUSICAL SYMBOL OMALON +1D05C BYZANTINE MUSICAL SYMBOL ANTIKENOMA +1D05D BYZANTINE MUSICAL SYMBOL LYGISMA +1D05E BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO +1D05F BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO +1D060 BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA +1D061 BYZANTINE MUSICAL SYMBOL KYLISMA +1D062 BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA +1D063 BYZANTINE MUSICAL SYMBOL TROMIKON NEO +1D064 BYZANTINE MUSICAL SYMBOL EKSTREPTON +1D065 BYZANTINE MUSICAL SYMBOL SYNAGMA NEO +1D066 BYZANTINE MUSICAL SYMBOL SYRMA +1D067 BYZANTINE MUSICAL SYMBOL CHOREVMA NEO +1D068 BYZANTINE MUSICAL SYMBOL EPEGERMA +1D069 BYZANTINE MUSICAL SYMBOL SEISMA NEO +1D06A BYZANTINE MUSICAL SYMBOL XIRON KLASMA +1D06B BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON +1D06C BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA +1D06D BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA +1D06E BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA +1D06F BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA +1D070 BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA +1D071 BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA +1D072 BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON +1D073 BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON +1D074 BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON +1D075 BYZANTINE MUSICAL SYMBOL OYRANISMA NEO +1D076 BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO +1D077 BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO +1D078 BYZANTINE MUSICAL SYMBOL THEMA APLOUN +1D079 BYZANTINE MUSICAL SYMBOL THES KAI APOTHES +1D07A BYZANTINE MUSICAL SYMBOL KATAVASMA +1D07B BYZANTINE MUSICAL SYMBOL ENDOFONON +1D07C BYZANTINE MUSICAL SYMBOL YFEN KATO +1D07D BYZANTINE MUSICAL SYMBOL YFEN ANO +1D07E BYZANTINE MUSICAL SYMBOL STAVROS +1D07F BYZANTINE MUSICAL SYMBOL KLASMA ANO +1D080 BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION +1D081 BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION +1D082 BYZANTINE MUSICAL SYMBOL KRATIMA ALLO +1D083 BYZANTINE MUSICAL SYMBOL KRATIMA NEO +1D084 BYZANTINE MUSICAL SYMBOL APODERMA NEO +1D085 BYZANTINE MUSICAL SYMBOL APLI +1D086 BYZANTINE MUSICAL SYMBOL DIPLI +1D087 BYZANTINE MUSICAL SYMBOL TRIPLI +1D088 BYZANTINE MUSICAL SYMBOL TETRAPLI +1D089 BYZANTINE MUSICAL SYMBOL KORONIS +1D08A BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU +1D08B BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON +1D08C BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON +1D08D BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON +1D08E BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU +1D08F BYZANTINE MUSICAL SYMBOL GORGON NEO ANO +1D090 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA +1D091 BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA +1D092 BYZANTINE MUSICAL SYMBOL DIGORGON +1D093 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO +1D094 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO +1D095 BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA +1D096 BYZANTINE MUSICAL SYMBOL TRIGORGON +1D097 BYZANTINE MUSICAL SYMBOL ARGON +1D098 BYZANTINE MUSICAL SYMBOL IMIDIARGON +1D099 BYZANTINE MUSICAL SYMBOL DIARGON +1D09A BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI +1D09B BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI +1D09C BYZANTINE MUSICAL SYMBOL AGOGI ARGI +1D09D BYZANTINE MUSICAL SYMBOL AGOGI METRIA +1D09E BYZANTINE MUSICAL SYMBOL AGOGI MESI +1D09F BYZANTINE MUSICAL SYMBOL AGOGI GORGI +1D0A0 BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI +1D0A1 BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI +1D0A2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS +1D0A3 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS +1D0A4 BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS +1D0A5 BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS +1D0A6 BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS +1D0A7 BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS +1D0A8 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS +1D0A9 BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS +1D0AA BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS +1D0AB BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS +1D0AC BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS +1D0AD BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS +1D0AE BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS +1D0AF BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS +1D0B0 BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS +1D0B1 BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS +1D0B2 BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS +1D0B3 BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS +1D0B4 BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN +1D0B5 BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN +1D0B6 BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU +1D0B7 BYZANTINE MUSICAL SYMBOL IMIFONON +1D0B8 BYZANTINE MUSICAL SYMBOL IMIFTHORON +1D0B9 BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU +1D0BA BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA +1D0BB BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA +1D0BC BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS +1D0BD BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI +1D0BE BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI +1D0BF BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE +1D0C0 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO +1D0C1 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO +1D0C2 BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO +1D0C3 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS +1D0C4 BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS +1D0C5 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS +1D0C5 BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS +1D0C6 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI +1D0C7 BYZANTINE MUSICAL SYMBOL FTHORA NENANO +1D0C8 BYZANTINE MUSICAL SYMBOL CHROA ZYGOS +1D0C9 BYZANTINE MUSICAL SYMBOL CHROA KLITON +1D0CA BYZANTINE MUSICAL SYMBOL CHROA SPATHI +1D0CB BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION +1D0CC BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA +1D0CD BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION +1D0CE BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION +1D0CF BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION +1D0D0 BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA +1D0D1 BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA +1D0D2 BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA +1D0D3 BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA +1D0D4 BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA +1D0D5 BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA +1D0D6 BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA +1D0D7 BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA +1D0D8 BYZANTINE MUSICAL SYMBOL GENIKI DIESIS +1D0D9 BYZANTINE MUSICAL SYMBOL GENIKI YFESIS +1D0DA BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI +1D0DB BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI +1D0DC BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI +1D0DD BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS +1D0DE BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS +1D0DF BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU +1D0E0 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU +1D0E1 BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU +1D0E2 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS +1D0E3 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU +1D0E4 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU +1D0E5 BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU +1D0E6 BYZANTINE MUSICAL SYMBOL DIGRAMMA GG +1D0E7 BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU +1D0E8 BYZANTINE MUSICAL SYMBOL STIGMA +1D0E9 BYZANTINE MUSICAL SYMBOL ARKTIKO PA +1D0EA BYZANTINE MUSICAL SYMBOL ARKTIKO VOU +1D0EB BYZANTINE MUSICAL SYMBOL ARKTIKO GA +1D0EC BYZANTINE MUSICAL SYMBOL ARKTIKO DI +1D0ED BYZANTINE MUSICAL SYMBOL ARKTIKO KE +1D0EE BYZANTINE MUSICAL SYMBOL ARKTIKO ZO +1D0EF BYZANTINE MUSICAL SYMBOL ARKTIKO NI +1D0F0 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO +1D0F1 BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO +1D0F2 BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO +1D0F3 BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO +1D0F4 BYZANTINE MUSICAL SYMBOL KLASMA KATO +1D0F5 BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100 MUSICAL SYMBOL SINGLE BARLINE +1D101 MUSICAL SYMBOL DOUBLE BARLINE +1D102 MUSICAL SYMBOL FINAL BARLINE +1D103 MUSICAL SYMBOL REVERSE FINAL BARLINE +1D104 MUSICAL SYMBOL DASHED BARLINE +1D105 MUSICAL SYMBOL SHORT BARLINE +1D106 MUSICAL SYMBOL LEFT REPEAT SIGN +1D107 MUSICAL SYMBOL RIGHT REPEAT SIGN +1D108 MUSICAL SYMBOL REPEAT DOTS +1D109 MUSICAL SYMBOL DAL SEGNO +1D10A MUSICAL SYMBOL DA CAPO +1D10B MUSICAL SYMBOL SEGNO +1D10C MUSICAL SYMBOL CODA +1D10D MUSICAL SYMBOL REPEATED FIGURE-1 +1D10E MUSICAL SYMBOL REPEATED FIGURE-2 +1D10F MUSICAL SYMBOL REPEATED FIGURE-3 +1D110 MUSICAL SYMBOL FERMATA +1D111 MUSICAL SYMBOL FERMATA BELOW +1D112 MUSICAL SYMBOL BREATH MARK +1D113 MUSICAL SYMBOL CAESURA +1D114 MUSICAL SYMBOL BRACE +1D115 MUSICAL SYMBOL BRACKET +1D116 MUSICAL SYMBOL ONE-LINE STAFF +1D117 MUSICAL SYMBOL TWO-LINE STAFF +1D118 MUSICAL SYMBOL THREE-LINE STAFF +1D119 MUSICAL SYMBOL FOUR-LINE STAFF +1D11A MUSICAL SYMBOL FIVE-LINE STAFF +1D11B MUSICAL SYMBOL SIX-LINE STAFF +1D11C MUSICAL SYMBOL SIX-STRING FRETBOARD +1D11D MUSICAL SYMBOL FOUR-STRING FRETBOARD +1D11E MUSICAL SYMBOL G CLEF +1D11F MUSICAL SYMBOL G CLEF OTTAVA ALTA +1D120 MUSICAL SYMBOL G CLEF OTTAVA BASSA +1D121 MUSICAL SYMBOL C CLEF +1D122 MUSICAL SYMBOL F CLEF +1D123 MUSICAL SYMBOL F CLEF OTTAVA ALTA +1D124 MUSICAL SYMBOL F CLEF OTTAVA BASSA +1D125 MUSICAL SYMBOL DRUM CLEF-1 +1D126 MUSICAL SYMBOL DRUM CLEF-2 +1D129 MUSICAL SYMBOL MULTIPLE MEASURE REST +1D12A MUSICAL SYMBOL DOUBLE SHARP +1D12B MUSICAL SYMBOL DOUBLE FLAT +1D12C MUSICAL SYMBOL FLAT UP +1D12D MUSICAL SYMBOL FLAT DOWN +1D12E MUSICAL SYMBOL NATURAL UP +1D12F MUSICAL SYMBOL NATURAL DOWN +1D130 MUSICAL SYMBOL SHARP UP +1D131 MUSICAL SYMBOL SHARP DOWN +1D132 MUSICAL SYMBOL QUARTER TONE SHARP +1D133 MUSICAL SYMBOL QUARTER TONE FLAT +1D134 MUSICAL SYMBOL COMMON TIME +1D135 MUSICAL SYMBOL CUT TIME +1D136 MUSICAL SYMBOL OTTAVA ALTA +1D137 MUSICAL SYMBOL OTTAVA BASSA +1D138 MUSICAL SYMBOL QUINDICESIMA ALTA +1D139 MUSICAL SYMBOL QUINDICESIMA BASSA +1D13A MUSICAL SYMBOL MULTI REST +1D13B MUSICAL SYMBOL WHOLE REST +1D13C MUSICAL SYMBOL HALF REST +1D13D MUSICAL SYMBOL QUARTER REST +1D13E MUSICAL SYMBOL EIGHTH REST +1D13F MUSICAL SYMBOL SIXTEENTH REST +1D140 MUSICAL SYMBOL THIRTY-SECOND REST +1D141 MUSICAL SYMBOL SIXTY-FOURTH REST +1D142 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST +1D143 MUSICAL SYMBOL X NOTEHEAD +1D144 MUSICAL SYMBOL PLUS NOTEHEAD +1D145 MUSICAL SYMBOL CIRCLE X NOTEHEAD +1D146 MUSICAL SYMBOL SQUARE NOTEHEAD WHITE +1D147 MUSICAL SYMBOL SQUARE NOTEHEAD BLACK +1D148 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE +1D149 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK +1D14A MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE +1D14B MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK +1D14C MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE +1D14D MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK +1D14E MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE +1D14F MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK +1D150 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE +1D151 MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK +1D152 MUSICAL SYMBOL MOON NOTEHEAD WHITE +1D153 MUSICAL SYMBOL MOON NOTEHEAD BLACK +1D154 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE +1D155 MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK +1D156 MUSICAL SYMBOL PARENTHESIS NOTEHEAD +1D157 MUSICAL SYMBOL VOID NOTEHEAD +1D158 MUSICAL SYMBOL NOTEHEAD BLACK +1D159 MUSICAL SYMBOL NULL NOTEHEAD +1D15A MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE +1D15B MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK +1D15C MUSICAL SYMBOL BREVE +1D15D MUSICAL SYMBOL WHOLE NOTE +1D15E MUSICAL SYMBOL HALF NOTE +1D15F MUSICAL SYMBOL QUARTER NOTE +1D160 MUSICAL SYMBOL EIGHTH NOTE +1D161 MUSICAL SYMBOL SIXTEENTH NOTE +1D162 MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165 MUSICAL SYMBOL COMBINING STEM +1D166 MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167 MUSICAL SYMBOL COMBINING TREMOLO-1 +1D168 MUSICAL SYMBOL COMBINING TREMOLO-2 +1D169 MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A MUSICAL SYMBOL FINGERED TREMOLO-1 +1D16B MUSICAL SYMBOL FINGERED TREMOLO-2 +1D16C MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D MUSICAL SYMBOL COMBINING AUGMENTATION DOT +1D16E MUSICAL SYMBOL COMBINING FLAG-1 +1D16F MUSICAL SYMBOL COMBINING FLAG-2 +1D170 MUSICAL SYMBOL COMBINING FLAG-3 +1D171 MUSICAL SYMBOL COMBINING FLAG-4 +1D172 MUSICAL SYMBOL COMBINING FLAG-5 +1D173 MUSICAL SYMBOL BEGIN BEAM +1D174 MUSICAL SYMBOL END BEAM +1D175 MUSICAL SYMBOL BEGIN TIE +1D176 MUSICAL SYMBOL END TIE +1D177 MUSICAL SYMBOL BEGIN SLUR +1D178 MUSICAL SYMBOL END SLUR +1D179 MUSICAL SYMBOL BEGIN PHRASE +1D17A MUSICAL SYMBOL END PHRASE +1D17B MUSICAL SYMBOL COMBINING ACCENT +1D17C MUSICAL SYMBOL COMBINING STACCATO +1D17D MUSICAL SYMBOL COMBINING TENUTO +1D17E MUSICAL SYMBOL COMBINING STACCATISSIMO +1D17F MUSICAL SYMBOL COMBINING MARCATO +1D180 MUSICAL SYMBOL COMBINING MARCATO-STACCATO +1D181 MUSICAL SYMBOL COMBINING ACCENT-STACCATO +1D182 MUSICAL SYMBOL COMBINING LOURE +1D183 MUSICAL SYMBOL ARPEGGIATO UP +1D184 MUSICAL SYMBOL ARPEGGIATO DOWN +1D185 MUSICAL SYMBOL COMBINING DOIT +1D186 MUSICAL SYMBOL COMBINING RIP +1D187 MUSICAL SYMBOL COMBINING FLIP +1D188 MUSICAL SYMBOL COMBINING SMEAR +1D189 MUSICAL SYMBOL COMBINING BEND +1D18A MUSICAL SYMBOL COMBINING DOUBLE TONGUE +1D18B MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C MUSICAL SYMBOL RINFORZANDO +1D18D MUSICAL SYMBOL SUBITO +1D18E MUSICAL SYMBOL Z +1D18F MUSICAL SYMBOL PIANO +1D190 MUSICAL SYMBOL MEZZO +1D191 MUSICAL SYMBOL FORTE +1D192 MUSICAL SYMBOL CRESCENDO +1D193 MUSICAL SYMBOL DECRESCENDO +1D194 MUSICAL SYMBOL GRACE NOTE SLASH +1D195 MUSICAL SYMBOL GRACE NOTE NO SLASH +1D196 MUSICAL SYMBOL TR +1D197 MUSICAL SYMBOL TURN +1D198 MUSICAL SYMBOL INVERTED TURN +1D199 MUSICAL SYMBOL TURN SLASH +1D19A MUSICAL SYMBOL TURN UP +1D19B MUSICAL SYMBOL ORNAMENT STROKE-1 +1D19C MUSICAL SYMBOL ORNAMENT STROKE-2 +1D19D MUSICAL SYMBOL ORNAMENT STROKE-3 +1D19E MUSICAL SYMBOL ORNAMENT STROKE-4 +1D19F MUSICAL SYMBOL ORNAMENT STROKE-5 +1D1A0 MUSICAL SYMBOL ORNAMENT STROKE-6 +1D1A1 MUSICAL SYMBOL ORNAMENT STROKE-7 +1D1A2 MUSICAL SYMBOL ORNAMENT STROKE-8 +1D1A3 MUSICAL SYMBOL ORNAMENT STROKE-9 +1D1A4 MUSICAL SYMBOL ORNAMENT STROKE-10 +1D1A5 MUSICAL SYMBOL ORNAMENT STROKE-11 +1D1A6 MUSICAL SYMBOL HAUPTSTIMME +1D1A7 MUSICAL SYMBOL NEBENSTIMME +1D1A8 MUSICAL SYMBOL END OF STIMME +1D1A9 MUSICAL SYMBOL DEGREE SLASH +1D1AA MUSICAL SYMBOL COMBINING DOWN BOW +1D1AB MUSICAL SYMBOL COMBINING UP BOW +1D1AC MUSICAL SYMBOL COMBINING HARMONIC +1D1AD MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE MUSICAL SYMBOL PEDAL MARK +1D1AF MUSICAL SYMBOL PEDAL UP MARK +1D1B0 MUSICAL SYMBOL HALF PEDAL MARK +1D1B1 MUSICAL SYMBOL GLISSANDO UP +1D1B2 MUSICAL SYMBOL GLISSANDO DOWN +1D1B3 MUSICAL SYMBOL WITH FINGERNAILS +1D1B4 MUSICAL SYMBOL DAMP +1D1B5 MUSICAL SYMBOL DAMP ALL +1D1B6 MUSICAL SYMBOL MAXIMA +1D1B7 MUSICAL SYMBOL LONGA +1D1B8 MUSICAL SYMBOL BREVIS +1D1B9 MUSICAL SYMBOL SEMIBREVIS WHITE +1D1BA MUSICAL SYMBOL SEMIBREVIS BLACK +1D1BB MUSICAL SYMBOL MINIMA +1D1BC MUSICAL SYMBOL MINIMA BLACK +1D1BD MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF MUSICAL SYMBOL FUSA WHITE +1D1C0 MUSICAL SYMBOL FUSA BLACK +1D1C1 MUSICAL SYMBOL LONGA PERFECTA REST +1D1C2 MUSICAL SYMBOL LONGA IMPERFECTA REST +1D1C3 MUSICAL SYMBOL BREVIS REST +1D1C4 MUSICAL SYMBOL SEMIBREVIS REST +1D1C5 MUSICAL SYMBOL MINIMA REST +1D1C6 MUSICAL SYMBOL SEMIMINIMA REST +1D1C7 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA +1D1C8 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA +1D1C9 MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1 +1D1CA MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA +1D1CB MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA +1D1CC MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1 +1D1CD MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2 +1D1CE MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3 +1D1CF MUSICAL SYMBOL CROIX +1D1D0 MUSICAL SYMBOL GREGORIAN C CLEF +1D1D1 MUSICAL SYMBOL GREGORIAN F CLEF +1D1D2 MUSICAL SYMBOL SQUARE B +1D1D3 MUSICAL SYMBOL VIRGA +1D1D4 MUSICAL SYMBOL PODATUS +1D1D5 MUSICAL SYMBOL CLIVIS +1D1D6 MUSICAL SYMBOL SCANDICUS +1D1D7 MUSICAL SYMBOL CLIMACUS +1D1D8 MUSICAL SYMBOL TORCULUS +1D1D9 MUSICAL SYMBOL PORRECTUS +1D1DA MUSICAL SYMBOL PORRECTUS FLEXUS +1D1DB MUSICAL SYMBOL SCANDICUS FLEXUS +1D1DC MUSICAL SYMBOL TORCULUS RESUPINUS +1D1DD MUSICAL SYMBOL PES SUBPUNCTIS +1D1DE MUSICAL SYMBOL KIEVAN C CLEF +1D1DF MUSICAL SYMBOL KIEVAN END OF PIECE +1D1E0 MUSICAL SYMBOL KIEVAN FINAL NOTE +1D1E1 MUSICAL SYMBOL KIEVAN RECITATIVE MARK +1D1E2 MUSICAL SYMBOL KIEVAN WHOLE NOTE +1D1E3 MUSICAL SYMBOL KIEVAN HALF NOTE +1D1E4 MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN +1D1E5 MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP +1D1E6 MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN +1D1E7 MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP +1D1E8 MUSICAL SYMBOL KIEVAN FLAT SIGN +1D200 GREEK VOCAL NOTATION SYMBOL-1 +1D201 GREEK VOCAL NOTATION SYMBOL-2 +1D202 GREEK VOCAL NOTATION SYMBOL-3 +1D203 GREEK VOCAL NOTATION SYMBOL-4 +1D204 GREEK VOCAL NOTATION SYMBOL-5 +1D205 GREEK VOCAL NOTATION SYMBOL-6 +1D206 GREEK VOCAL NOTATION SYMBOL-7 +1D207 GREEK VOCAL NOTATION SYMBOL-8 +1D208 GREEK VOCAL NOTATION SYMBOL-9 +1D209 GREEK VOCAL NOTATION SYMBOL-10 +1D20A GREEK VOCAL NOTATION SYMBOL-11 +1D20B GREEK VOCAL NOTATION SYMBOL-12 +1D20C GREEK VOCAL NOTATION SYMBOL-13 +1D20D GREEK VOCAL NOTATION SYMBOL-14 +1D20E GREEK VOCAL NOTATION SYMBOL-15 +1D20F GREEK VOCAL NOTATION SYMBOL-16 +1D210 GREEK VOCAL NOTATION SYMBOL-17 +1D211 GREEK VOCAL NOTATION SYMBOL-18 +1D212 GREEK VOCAL NOTATION SYMBOL-19 +1D213 GREEK VOCAL NOTATION SYMBOL-20 +1D214 GREEK VOCAL NOTATION SYMBOL-21 +1D215 GREEK VOCAL NOTATION SYMBOL-22 +1D216 GREEK VOCAL NOTATION SYMBOL-23 +1D217 GREEK VOCAL NOTATION SYMBOL-24 +1D218 GREEK VOCAL NOTATION SYMBOL-50 +1D219 GREEK VOCAL NOTATION SYMBOL-51 +1D21A GREEK VOCAL NOTATION SYMBOL-52 +1D21B GREEK VOCAL NOTATION SYMBOL-53 +1D21C GREEK VOCAL NOTATION SYMBOL-54 +1D21D GREEK INSTRUMENTAL NOTATION SYMBOL-1 +1D21E GREEK INSTRUMENTAL NOTATION SYMBOL-2 +1D21F GREEK INSTRUMENTAL NOTATION SYMBOL-4 +1D220 GREEK INSTRUMENTAL NOTATION SYMBOL-5 +1D221 GREEK INSTRUMENTAL NOTATION SYMBOL-7 +1D222 GREEK INSTRUMENTAL NOTATION SYMBOL-8 +1D223 GREEK INSTRUMENTAL NOTATION SYMBOL-11 +1D224 GREEK INSTRUMENTAL NOTATION SYMBOL-12 +1D225 GREEK INSTRUMENTAL NOTATION SYMBOL-13 +1D226 GREEK INSTRUMENTAL NOTATION SYMBOL-14 +1D227 GREEK INSTRUMENTAL NOTATION SYMBOL-17 +1D228 GREEK INSTRUMENTAL NOTATION SYMBOL-18 +1D229 GREEK INSTRUMENTAL NOTATION SYMBOL-19 +1D22A GREEK INSTRUMENTAL NOTATION SYMBOL-23 +1D22B GREEK INSTRUMENTAL NOTATION SYMBOL-24 +1D22C GREEK INSTRUMENTAL NOTATION SYMBOL-25 +1D22D GREEK INSTRUMENTAL NOTATION SYMBOL-26 +1D22E GREEK INSTRUMENTAL NOTATION SYMBOL-27 +1D22F GREEK INSTRUMENTAL NOTATION SYMBOL-29 +1D230 GREEK INSTRUMENTAL NOTATION SYMBOL-30 +1D231 GREEK INSTRUMENTAL NOTATION SYMBOL-32 +1D232 GREEK INSTRUMENTAL NOTATION SYMBOL-36 +1D233 GREEK INSTRUMENTAL NOTATION SYMBOL-37 +1D234 GREEK INSTRUMENTAL NOTATION SYMBOL-38 +1D235 GREEK INSTRUMENTAL NOTATION SYMBOL-39 +1D236 GREEK INSTRUMENTAL NOTATION SYMBOL-40 +1D237 GREEK INSTRUMENTAL NOTATION SYMBOL-42 +1D238 GREEK INSTRUMENTAL NOTATION SYMBOL-43 +1D239 GREEK INSTRUMENTAL NOTATION SYMBOL-45 +1D23A GREEK INSTRUMENTAL NOTATION SYMBOL-47 +1D23B GREEK INSTRUMENTAL NOTATION SYMBOL-48 +1D23C GREEK INSTRUMENTAL NOTATION SYMBOL-49 +1D23D GREEK INSTRUMENTAL NOTATION SYMBOL-50 +1D23E GREEK INSTRUMENTAL NOTATION SYMBOL-51 +1D23F GREEK INSTRUMENTAL NOTATION SYMBOL-52 +1D240 GREEK INSTRUMENTAL NOTATION SYMBOL-53 +1D241 GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242 COMBINING GREEK MUSICAL TRISEME +1D243 COMBINING GREEK MUSICAL TETRASEME +1D244 COMBINING GREEK MUSICAL PENTASEME +1D245 GREEK MUSICAL LEIMMA +1D300 MONOGRAM FOR EARTH +1D301 DIGRAM FOR HEAVENLY EARTH +1D302 DIGRAM FOR HUMAN EARTH +1D303 DIGRAM FOR EARTHLY HEAVEN +1D304 DIGRAM FOR EARTHLY HUMAN +1D305 DIGRAM FOR EARTH +1D306 TETRAGRAM FOR CENTRE +1D307 TETRAGRAM FOR FULL CIRCLE +1D308 TETRAGRAM FOR MIRED +1D309 TETRAGRAM FOR BARRIER +1D30A TETRAGRAM FOR KEEPING SMALL +1D30B TETRAGRAM FOR CONTRARIETY +1D30C TETRAGRAM FOR ASCENT +1D30D TETRAGRAM FOR OPPOSITION +1D30E TETRAGRAM FOR BRANCHING OUT +1D30F TETRAGRAM FOR DEFECTIVENESS OR DISTORTION +1D310 TETRAGRAM FOR DIVERGENCE +1D311 TETRAGRAM FOR YOUTHFULNESS +1D312 TETRAGRAM FOR INCREASE +1D313 TETRAGRAM FOR PENETRATION +1D314 TETRAGRAM FOR REACH +1D315 TETRAGRAM FOR CONTACT +1D316 TETRAGRAM FOR HOLDING BACK +1D317 TETRAGRAM FOR WAITING +1D318 TETRAGRAM FOR FOLLOWING +1D319 TETRAGRAM FOR ADVANCE +1D31A TETRAGRAM FOR RELEASE +1D31B TETRAGRAM FOR RESISTANCE +1D31C TETRAGRAM FOR EASE +1D31D TETRAGRAM FOR JOY +1D31E TETRAGRAM FOR CONTENTION +1D31F TETRAGRAM FOR ENDEAVOUR +1D320 TETRAGRAM FOR DUTIES +1D321 TETRAGRAM FOR CHANGE +1D322 TETRAGRAM FOR DECISIVENESS +1D323 TETRAGRAM FOR BOLD RESOLUTION +1D324 TETRAGRAM FOR PACKING +1D325 TETRAGRAM FOR LEGION +1D326 TETRAGRAM FOR CLOSENESS +1D327 TETRAGRAM FOR KINSHIP +1D328 TETRAGRAM FOR GATHERING +1D329 TETRAGRAM FOR STRENGTH +1D32A TETRAGRAM FOR PURITY +1D32B TETRAGRAM FOR FULLNESS +1D32C TETRAGRAM FOR RESIDENCE +1D32D TETRAGRAM FOR LAW OR MODEL +1D32E TETRAGRAM FOR RESPONSE +1D32F TETRAGRAM FOR GOING TO MEET +1D330 TETRAGRAM FOR ENCOUNTERS +1D331 TETRAGRAM FOR STOVE +1D332 TETRAGRAM FOR GREATNESS +1D333 TETRAGRAM FOR ENLARGEMENT +1D334 TETRAGRAM FOR PATTERN +1D335 TETRAGRAM FOR RITUAL +1D336 TETRAGRAM FOR FLIGHT +1D337 TETRAGRAM FOR VASTNESS OR WASTING +1D338 TETRAGRAM FOR CONSTANCY +1D339 TETRAGRAM FOR MEASURE +1D33A TETRAGRAM FOR ETERNITY +1D33B TETRAGRAM FOR UNITY +1D33C TETRAGRAM FOR DIMINISHMENT +1D33D TETRAGRAM FOR CLOSED MOUTH +1D33E TETRAGRAM FOR GUARDEDNESS +1D33F TETRAGRAM FOR GATHERING IN +1D340 TETRAGRAM FOR MASSING +1D341 TETRAGRAM FOR ACCUMULATION +1D342 TETRAGRAM FOR EMBELLISHMENT +1D343 TETRAGRAM FOR DOUBT +1D344 TETRAGRAM FOR WATCH +1D345 TETRAGRAM FOR SINKING +1D346 TETRAGRAM FOR INNER +1D347 TETRAGRAM FOR DEPARTURE +1D348 TETRAGRAM FOR DARKENING +1D349 TETRAGRAM FOR DIMMING +1D34A TETRAGRAM FOR EXHAUSTION +1D34B TETRAGRAM FOR SEVERANCE +1D34C TETRAGRAM FOR STOPPAGE +1D34D TETRAGRAM FOR HARDNESS +1D34E TETRAGRAM FOR COMPLETION +1D34F TETRAGRAM FOR CLOSURE +1D350 TETRAGRAM FOR FAILURE +1D351 TETRAGRAM FOR AGGRAVATION +1D352 TETRAGRAM FOR COMPLIANCE +1D353 TETRAGRAM FOR ON THE VERGE +1D354 TETRAGRAM FOR DIFFICULTIES +1D355 TETRAGRAM FOR LABOURING +1D356 TETRAGRAM FOR FOSTERING +1D360 COUNTING ROD UNIT DIGIT ONE +1D361 COUNTING ROD UNIT DIGIT TWO +1D362 COUNTING ROD UNIT DIGIT THREE +1D363 COUNTING ROD UNIT DIGIT FOUR +1D364 COUNTING ROD UNIT DIGIT FIVE +1D365 COUNTING ROD UNIT DIGIT SIX +1D366 COUNTING ROD UNIT DIGIT SEVEN +1D367 COUNTING ROD UNIT DIGIT EIGHT +1D368 COUNTING ROD UNIT DIGIT NINE +1D369 COUNTING ROD TENS DIGIT ONE +1D36A COUNTING ROD TENS DIGIT TWO +1D36B COUNTING ROD TENS DIGIT THREE +1D36C COUNTING ROD TENS DIGIT FOUR +1D36D COUNTING ROD TENS DIGIT FIVE +1D36E COUNTING ROD TENS DIGIT SIX +1D36F COUNTING ROD TENS DIGIT SEVEN +1D370 COUNTING ROD TENS DIGIT EIGHT +1D371 COUNTING ROD TENS DIGIT NINE +1D400 MATHEMATICAL BOLD CAPITAL A +1D401 MATHEMATICAL BOLD CAPITAL B +1D402 MATHEMATICAL BOLD CAPITAL C +1D403 MATHEMATICAL BOLD CAPITAL D +1D404 MATHEMATICAL BOLD CAPITAL E +1D405 MATHEMATICAL BOLD CAPITAL F +1D406 MATHEMATICAL BOLD CAPITAL G +1D407 MATHEMATICAL BOLD CAPITAL H +1D408 MATHEMATICAL BOLD CAPITAL I +1D409 MATHEMATICAL BOLD CAPITAL J +1D40A MATHEMATICAL BOLD CAPITAL K +1D40B MATHEMATICAL BOLD CAPITAL L +1D40C MATHEMATICAL BOLD CAPITAL M +1D40D MATHEMATICAL BOLD CAPITAL N +1D40E MATHEMATICAL BOLD CAPITAL O +1D40F MATHEMATICAL BOLD CAPITAL P +1D410 MATHEMATICAL BOLD CAPITAL Q +1D411 MATHEMATICAL BOLD CAPITAL R +1D412 MATHEMATICAL BOLD CAPITAL S +1D413 MATHEMATICAL BOLD CAPITAL T +1D414 MATHEMATICAL BOLD CAPITAL U +1D415 MATHEMATICAL BOLD CAPITAL V +1D416 MATHEMATICAL BOLD CAPITAL W +1D417 MATHEMATICAL BOLD CAPITAL X +1D418 MATHEMATICAL BOLD CAPITAL Y +1D419 MATHEMATICAL BOLD CAPITAL Z +1D41A MATHEMATICAL BOLD SMALL A +1D41B MATHEMATICAL BOLD SMALL B +1D41C MATHEMATICAL BOLD SMALL C +1D41D MATHEMATICAL BOLD SMALL D +1D41E MATHEMATICAL BOLD SMALL E +1D41F MATHEMATICAL BOLD SMALL F +1D420 MATHEMATICAL BOLD SMALL G +1D421 MATHEMATICAL BOLD SMALL H +1D422 MATHEMATICAL BOLD SMALL I +1D423 MATHEMATICAL BOLD SMALL J +1D424 MATHEMATICAL BOLD SMALL K +1D425 MATHEMATICAL BOLD SMALL L +1D426 MATHEMATICAL BOLD SMALL M +1D427 MATHEMATICAL BOLD SMALL N +1D428 MATHEMATICAL BOLD SMALL O +1D429 MATHEMATICAL BOLD SMALL P +1D42A MATHEMATICAL BOLD SMALL Q +1D42B MATHEMATICAL BOLD SMALL R +1D42C MATHEMATICAL BOLD SMALL S +1D42D MATHEMATICAL BOLD SMALL T +1D42E MATHEMATICAL BOLD SMALL U +1D42F MATHEMATICAL BOLD SMALL V +1D430 MATHEMATICAL BOLD SMALL W +1D431 MATHEMATICAL BOLD SMALL X +1D432 MATHEMATICAL BOLD SMALL Y +1D433 MATHEMATICAL BOLD SMALL Z +1D434 MATHEMATICAL ITALIC CAPITAL A +1D435 MATHEMATICAL ITALIC CAPITAL B +1D436 MATHEMATICAL ITALIC CAPITAL C +1D437 MATHEMATICAL ITALIC CAPITAL D +1D438 MATHEMATICAL ITALIC CAPITAL E +1D439 MATHEMATICAL ITALIC CAPITAL F +1D43A MATHEMATICAL ITALIC CAPITAL G +1D43B MATHEMATICAL ITALIC CAPITAL H +1D43C MATHEMATICAL ITALIC CAPITAL I +1D43D MATHEMATICAL ITALIC CAPITAL J +1D43E MATHEMATICAL ITALIC CAPITAL K +1D43F MATHEMATICAL ITALIC CAPITAL L +1D440 MATHEMATICAL ITALIC CAPITAL M +1D441 MATHEMATICAL ITALIC CAPITAL N +1D442 MATHEMATICAL ITALIC CAPITAL O +1D443 MATHEMATICAL ITALIC CAPITAL P +1D444 MATHEMATICAL ITALIC CAPITAL Q +1D445 MATHEMATICAL ITALIC CAPITAL R +1D446 MATHEMATICAL ITALIC CAPITAL S +1D447 MATHEMATICAL ITALIC CAPITAL T +1D448 MATHEMATICAL ITALIC CAPITAL U +1D449 MATHEMATICAL ITALIC CAPITAL V +1D44A MATHEMATICAL ITALIC CAPITAL W +1D44B MATHEMATICAL ITALIC CAPITAL X +1D44C MATHEMATICAL ITALIC CAPITAL Y +1D44D MATHEMATICAL ITALIC CAPITAL Z +1D44E MATHEMATICAL ITALIC SMALL A +1D44F MATHEMATICAL ITALIC SMALL B +1D450 MATHEMATICAL ITALIC SMALL C +1D451 MATHEMATICAL ITALIC SMALL D +1D452 MATHEMATICAL ITALIC SMALL E +1D453 MATHEMATICAL ITALIC SMALL F +1D454 MATHEMATICAL ITALIC SMALL G +1D456 MATHEMATICAL ITALIC SMALL I +1D457 MATHEMATICAL ITALIC SMALL J +1D458 MATHEMATICAL ITALIC SMALL K +1D459 MATHEMATICAL ITALIC SMALL L +1D45A MATHEMATICAL ITALIC SMALL M +1D45B MATHEMATICAL ITALIC SMALL N +1D45C MATHEMATICAL ITALIC SMALL O +1D45D MATHEMATICAL ITALIC SMALL P +1D45E MATHEMATICAL ITALIC SMALL Q +1D45F MATHEMATICAL ITALIC SMALL R +1D460 MATHEMATICAL ITALIC SMALL S +1D461 MATHEMATICAL ITALIC SMALL T +1D462 MATHEMATICAL ITALIC SMALL U +1D463 MATHEMATICAL ITALIC SMALL V +1D464 MATHEMATICAL ITALIC SMALL W +1D465 MATHEMATICAL ITALIC SMALL X +1D466 MATHEMATICAL ITALIC SMALL Y +1D467 MATHEMATICAL ITALIC SMALL Z +1D468 MATHEMATICAL BOLD ITALIC CAPITAL A +1D469 MATHEMATICAL BOLD ITALIC CAPITAL B +1D46A MATHEMATICAL BOLD ITALIC CAPITAL C +1D46B MATHEMATICAL BOLD ITALIC CAPITAL D +1D46C MATHEMATICAL BOLD ITALIC CAPITAL E +1D46D MATHEMATICAL BOLD ITALIC CAPITAL F +1D46E MATHEMATICAL BOLD ITALIC CAPITAL G +1D46F MATHEMATICAL BOLD ITALIC CAPITAL H +1D470 MATHEMATICAL BOLD ITALIC CAPITAL I +1D471 MATHEMATICAL BOLD ITALIC CAPITAL J +1D472 MATHEMATICAL BOLD ITALIC CAPITAL K +1D473 MATHEMATICAL BOLD ITALIC CAPITAL L +1D474 MATHEMATICAL BOLD ITALIC CAPITAL M +1D475 MATHEMATICAL BOLD ITALIC CAPITAL N +1D476 MATHEMATICAL BOLD ITALIC CAPITAL O +1D477 MATHEMATICAL BOLD ITALIC CAPITAL P +1D478 MATHEMATICAL BOLD ITALIC CAPITAL Q +1D479 MATHEMATICAL BOLD ITALIC CAPITAL R +1D47A MATHEMATICAL BOLD ITALIC CAPITAL S +1D47B MATHEMATICAL BOLD ITALIC CAPITAL T +1D47C MATHEMATICAL BOLD ITALIC CAPITAL U +1D47D MATHEMATICAL BOLD ITALIC CAPITAL V +1D47E MATHEMATICAL BOLD ITALIC CAPITAL W +1D47F MATHEMATICAL BOLD ITALIC CAPITAL X +1D480 MATHEMATICAL BOLD ITALIC CAPITAL Y +1D481 MATHEMATICAL BOLD ITALIC CAPITAL Z +1D482 MATHEMATICAL BOLD ITALIC SMALL A +1D483 MATHEMATICAL BOLD ITALIC SMALL B +1D484 MATHEMATICAL BOLD ITALIC SMALL C +1D485 MATHEMATICAL BOLD ITALIC SMALL D +1D486 MATHEMATICAL BOLD ITALIC SMALL E +1D487 MATHEMATICAL BOLD ITALIC SMALL F +1D488 MATHEMATICAL BOLD ITALIC SMALL G +1D489 MATHEMATICAL BOLD ITALIC SMALL H +1D48A MATHEMATICAL BOLD ITALIC SMALL I +1D48B MATHEMATICAL BOLD ITALIC SMALL J +1D48C MATHEMATICAL BOLD ITALIC SMALL K +1D48D MATHEMATICAL BOLD ITALIC SMALL L +1D48E MATHEMATICAL BOLD ITALIC SMALL M +1D48F MATHEMATICAL BOLD ITALIC SMALL N +1D490 MATHEMATICAL BOLD ITALIC SMALL O +1D491 MATHEMATICAL BOLD ITALIC SMALL P +1D492 MATHEMATICAL BOLD ITALIC SMALL Q +1D493 MATHEMATICAL BOLD ITALIC SMALL R +1D494 MATHEMATICAL BOLD ITALIC SMALL S +1D495 MATHEMATICAL BOLD ITALIC SMALL T +1D496 MATHEMATICAL BOLD ITALIC SMALL U +1D497 MATHEMATICAL BOLD ITALIC SMALL V +1D498 MATHEMATICAL BOLD ITALIC SMALL W +1D499 MATHEMATICAL BOLD ITALIC SMALL X +1D49A MATHEMATICAL BOLD ITALIC SMALL Y +1D49B MATHEMATICAL BOLD ITALIC SMALL Z +1D49C MATHEMATICAL SCRIPT CAPITAL A +1D49E MATHEMATICAL SCRIPT CAPITAL C +1D49F MATHEMATICAL SCRIPT CAPITAL D +1D4A2 MATHEMATICAL SCRIPT CAPITAL G +1D4A5 MATHEMATICAL SCRIPT CAPITAL J +1D4A6 MATHEMATICAL SCRIPT CAPITAL K +1D4A9 MATHEMATICAL SCRIPT CAPITAL N +1D4AA MATHEMATICAL SCRIPT CAPITAL O +1D4AB MATHEMATICAL SCRIPT CAPITAL P +1D4AC MATHEMATICAL SCRIPT CAPITAL Q +1D4AE MATHEMATICAL SCRIPT CAPITAL S +1D4AF MATHEMATICAL SCRIPT CAPITAL T +1D4B0 MATHEMATICAL SCRIPT CAPITAL U +1D4B1 MATHEMATICAL SCRIPT CAPITAL V +1D4B2 MATHEMATICAL SCRIPT CAPITAL W +1D4B3 MATHEMATICAL SCRIPT CAPITAL X +1D4B4 MATHEMATICAL SCRIPT CAPITAL Y +1D4B5 MATHEMATICAL SCRIPT CAPITAL Z +1D4B6 MATHEMATICAL SCRIPT SMALL A +1D4B7 MATHEMATICAL SCRIPT SMALL B +1D4B8 MATHEMATICAL SCRIPT SMALL C +1D4B9 MATHEMATICAL SCRIPT SMALL D +1D4BB MATHEMATICAL SCRIPT SMALL F +1D4BD MATHEMATICAL SCRIPT SMALL H +1D4BE MATHEMATICAL SCRIPT SMALL I +1D4BF MATHEMATICAL SCRIPT SMALL J +1D4C0 MATHEMATICAL SCRIPT SMALL K +1D4C1 MATHEMATICAL SCRIPT SMALL L +1D4C2 MATHEMATICAL SCRIPT SMALL M +1D4C3 MATHEMATICAL SCRIPT SMALL N +1D4C5 MATHEMATICAL SCRIPT SMALL P +1D4C6 MATHEMATICAL SCRIPT SMALL Q +1D4C7 MATHEMATICAL SCRIPT SMALL R +1D4C8 MATHEMATICAL SCRIPT SMALL S +1D4C9 MATHEMATICAL SCRIPT SMALL T +1D4CA MATHEMATICAL SCRIPT SMALL U +1D4CB MATHEMATICAL SCRIPT SMALL V +1D4CC MATHEMATICAL SCRIPT SMALL W +1D4CD MATHEMATICAL SCRIPT SMALL X +1D4CE MATHEMATICAL SCRIPT SMALL Y +1D4CF MATHEMATICAL SCRIPT SMALL Z +1D4D0 MATHEMATICAL BOLD SCRIPT CAPITAL A +1D4D1 MATHEMATICAL BOLD SCRIPT CAPITAL B +1D4D2 MATHEMATICAL BOLD SCRIPT CAPITAL C +1D4D3 MATHEMATICAL BOLD SCRIPT CAPITAL D +1D4D4 MATHEMATICAL BOLD SCRIPT CAPITAL E +1D4D5 MATHEMATICAL BOLD SCRIPT CAPITAL F +1D4D6 MATHEMATICAL BOLD SCRIPT CAPITAL G +1D4D7 MATHEMATICAL BOLD SCRIPT CAPITAL H +1D4D8 MATHEMATICAL BOLD SCRIPT CAPITAL I +1D4D9 MATHEMATICAL BOLD SCRIPT CAPITAL J +1D4DA MATHEMATICAL BOLD SCRIPT CAPITAL K +1D4DB MATHEMATICAL BOLD SCRIPT CAPITAL L +1D4DC MATHEMATICAL BOLD SCRIPT CAPITAL M +1D4DD MATHEMATICAL BOLD SCRIPT CAPITAL N +1D4DE MATHEMATICAL BOLD SCRIPT CAPITAL O +1D4DF MATHEMATICAL BOLD SCRIPT CAPITAL P +1D4E0 MATHEMATICAL BOLD SCRIPT CAPITAL Q +1D4E1 MATHEMATICAL BOLD SCRIPT CAPITAL R +1D4E2 MATHEMATICAL BOLD SCRIPT CAPITAL S +1D4E3 MATHEMATICAL BOLD SCRIPT CAPITAL T +1D4E4 MATHEMATICAL BOLD SCRIPT CAPITAL U +1D4E5 MATHEMATICAL BOLD SCRIPT CAPITAL V +1D4E6 MATHEMATICAL BOLD SCRIPT CAPITAL W +1D4E7 MATHEMATICAL BOLD SCRIPT CAPITAL X +1D4E8 MATHEMATICAL BOLD SCRIPT CAPITAL Y +1D4E9 MATHEMATICAL BOLD SCRIPT CAPITAL Z +1D4EA MATHEMATICAL BOLD SCRIPT SMALL A +1D4EB MATHEMATICAL BOLD SCRIPT SMALL B +1D4EC MATHEMATICAL BOLD SCRIPT SMALL C +1D4ED MATHEMATICAL BOLD SCRIPT SMALL D +1D4EE MATHEMATICAL BOLD SCRIPT SMALL E +1D4EF MATHEMATICAL BOLD SCRIPT SMALL F +1D4F0 MATHEMATICAL BOLD SCRIPT SMALL G +1D4F1 MATHEMATICAL BOLD SCRIPT SMALL H +1D4F2 MATHEMATICAL BOLD SCRIPT SMALL I +1D4F3 MATHEMATICAL BOLD SCRIPT SMALL J +1D4F4 MATHEMATICAL BOLD SCRIPT SMALL K +1D4F5 MATHEMATICAL BOLD SCRIPT SMALL L +1D4F6 MATHEMATICAL BOLD SCRIPT SMALL M +1D4F7 MATHEMATICAL BOLD SCRIPT SMALL N +1D4F8 MATHEMATICAL BOLD SCRIPT SMALL O +1D4F9 MATHEMATICAL BOLD SCRIPT SMALL P +1D4FA MATHEMATICAL BOLD SCRIPT SMALL Q +1D4FB MATHEMATICAL BOLD SCRIPT SMALL R +1D4FC MATHEMATICAL BOLD SCRIPT SMALL S +1D4FD MATHEMATICAL BOLD SCRIPT SMALL T +1D4FE MATHEMATICAL BOLD SCRIPT SMALL U +1D4FF MATHEMATICAL BOLD SCRIPT SMALL V +1D500 MATHEMATICAL BOLD SCRIPT SMALL W +1D501 MATHEMATICAL BOLD SCRIPT SMALL X +1D502 MATHEMATICAL BOLD SCRIPT SMALL Y +1D503 MATHEMATICAL BOLD SCRIPT SMALL Z +1D504 MATHEMATICAL FRAKTUR CAPITAL A +1D505 MATHEMATICAL FRAKTUR CAPITAL B +1D507 MATHEMATICAL FRAKTUR CAPITAL D +1D508 MATHEMATICAL FRAKTUR CAPITAL E +1D509 MATHEMATICAL FRAKTUR CAPITAL F +1D50A MATHEMATICAL FRAKTUR CAPITAL G +1D50D MATHEMATICAL FRAKTUR CAPITAL J +1D50E MATHEMATICAL FRAKTUR CAPITAL K +1D50F MATHEMATICAL FRAKTUR CAPITAL L +1D510 MATHEMATICAL FRAKTUR CAPITAL M +1D511 MATHEMATICAL FRAKTUR CAPITAL N +1D512 MATHEMATICAL FRAKTUR CAPITAL O +1D513 MATHEMATICAL FRAKTUR CAPITAL P +1D514 MATHEMATICAL FRAKTUR CAPITAL Q +1D516 MATHEMATICAL FRAKTUR CAPITAL S +1D517 MATHEMATICAL FRAKTUR CAPITAL T +1D518 MATHEMATICAL FRAKTUR CAPITAL U +1D519 MATHEMATICAL FRAKTUR CAPITAL V +1D51A MATHEMATICAL FRAKTUR CAPITAL W +1D51B MATHEMATICAL FRAKTUR CAPITAL X +1D51C MATHEMATICAL FRAKTUR CAPITAL Y +1D51E MATHEMATICAL FRAKTUR SMALL A +1D51F MATHEMATICAL FRAKTUR SMALL B +1D520 MATHEMATICAL FRAKTUR SMALL C +1D521 MATHEMATICAL FRAKTUR SMALL D +1D522 MATHEMATICAL FRAKTUR SMALL E +1D523 MATHEMATICAL FRAKTUR SMALL F +1D524 MATHEMATICAL FRAKTUR SMALL G +1D525 MATHEMATICAL FRAKTUR SMALL H +1D526 MATHEMATICAL FRAKTUR SMALL I +1D527 MATHEMATICAL FRAKTUR SMALL J +1D528 MATHEMATICAL FRAKTUR SMALL K +1D529 MATHEMATICAL FRAKTUR SMALL L +1D52A MATHEMATICAL FRAKTUR SMALL M +1D52B MATHEMATICAL FRAKTUR SMALL N +1D52C MATHEMATICAL FRAKTUR SMALL O +1D52D MATHEMATICAL FRAKTUR SMALL P +1D52E MATHEMATICAL FRAKTUR SMALL Q +1D52F MATHEMATICAL FRAKTUR SMALL R +1D530 MATHEMATICAL FRAKTUR SMALL S +1D531 MATHEMATICAL FRAKTUR SMALL T +1D532 MATHEMATICAL FRAKTUR SMALL U +1D533 MATHEMATICAL FRAKTUR SMALL V +1D534 MATHEMATICAL FRAKTUR SMALL W +1D535 MATHEMATICAL FRAKTUR SMALL X +1D536 MATHEMATICAL FRAKTUR SMALL Y +1D537 MATHEMATICAL FRAKTUR SMALL Z +1D538 MATHEMATICAL DOUBLE-STRUCK CAPITAL A +1D539 MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B MATHEMATICAL DOUBLE-STRUCK CAPITAL D +1D53C MATHEMATICAL DOUBLE-STRUCK CAPITAL E +1D53D MATHEMATICAL DOUBLE-STRUCK CAPITAL F +1D53E MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540 MATHEMATICAL DOUBLE-STRUCK CAPITAL I +1D541 MATHEMATICAL DOUBLE-STRUCK CAPITAL J +1D542 MATHEMATICAL DOUBLE-STRUCK CAPITAL K +1D543 MATHEMATICAL DOUBLE-STRUCK CAPITAL L +1D544 MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A MATHEMATICAL DOUBLE-STRUCK CAPITAL S +1D54B MATHEMATICAL DOUBLE-STRUCK CAPITAL T +1D54C MATHEMATICAL DOUBLE-STRUCK CAPITAL U +1D54D MATHEMATICAL DOUBLE-STRUCK CAPITAL V +1D54E MATHEMATICAL DOUBLE-STRUCK CAPITAL W +1D54F MATHEMATICAL DOUBLE-STRUCK CAPITAL X +1D550 MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552 MATHEMATICAL DOUBLE-STRUCK SMALL A +1D553 MATHEMATICAL DOUBLE-STRUCK SMALL B +1D554 MATHEMATICAL DOUBLE-STRUCK SMALL C +1D555 MATHEMATICAL DOUBLE-STRUCK SMALL D +1D556 MATHEMATICAL DOUBLE-STRUCK SMALL E +1D557 MATHEMATICAL DOUBLE-STRUCK SMALL F +1D558 MATHEMATICAL DOUBLE-STRUCK SMALL G +1D559 MATHEMATICAL DOUBLE-STRUCK SMALL H +1D55A MATHEMATICAL DOUBLE-STRUCK SMALL I +1D55B MATHEMATICAL DOUBLE-STRUCK SMALL J +1D55C MATHEMATICAL DOUBLE-STRUCK SMALL K +1D55D MATHEMATICAL DOUBLE-STRUCK SMALL L +1D55E MATHEMATICAL DOUBLE-STRUCK SMALL M +1D55F MATHEMATICAL DOUBLE-STRUCK SMALL N +1D560 MATHEMATICAL DOUBLE-STRUCK SMALL O +1D561 MATHEMATICAL DOUBLE-STRUCK SMALL P +1D562 MATHEMATICAL DOUBLE-STRUCK SMALL Q +1D563 MATHEMATICAL DOUBLE-STRUCK SMALL R +1D564 MATHEMATICAL DOUBLE-STRUCK SMALL S +1D565 MATHEMATICAL DOUBLE-STRUCK SMALL T +1D566 MATHEMATICAL DOUBLE-STRUCK SMALL U +1D567 MATHEMATICAL DOUBLE-STRUCK SMALL V +1D568 MATHEMATICAL DOUBLE-STRUCK SMALL W +1D569 MATHEMATICAL DOUBLE-STRUCK SMALL X +1D56A MATHEMATICAL DOUBLE-STRUCK SMALL Y +1D56B MATHEMATICAL DOUBLE-STRUCK SMALL Z +1D56C MATHEMATICAL BOLD FRAKTUR CAPITAL A +1D56D MATHEMATICAL BOLD FRAKTUR CAPITAL B +1D56E MATHEMATICAL BOLD FRAKTUR CAPITAL C +1D56F MATHEMATICAL BOLD FRAKTUR CAPITAL D +1D570 MATHEMATICAL BOLD FRAKTUR CAPITAL E +1D571 MATHEMATICAL BOLD FRAKTUR CAPITAL F +1D572 MATHEMATICAL BOLD FRAKTUR CAPITAL G +1D573 MATHEMATICAL BOLD FRAKTUR CAPITAL H +1D574 MATHEMATICAL BOLD FRAKTUR CAPITAL I +1D575 MATHEMATICAL BOLD FRAKTUR CAPITAL J +1D576 MATHEMATICAL BOLD FRAKTUR CAPITAL K +1D577 MATHEMATICAL BOLD FRAKTUR CAPITAL L +1D578 MATHEMATICAL BOLD FRAKTUR CAPITAL M +1D579 MATHEMATICAL BOLD FRAKTUR CAPITAL N +1D57A MATHEMATICAL BOLD FRAKTUR CAPITAL O +1D57B MATHEMATICAL BOLD FRAKTUR CAPITAL P +1D57C MATHEMATICAL BOLD FRAKTUR CAPITAL Q +1D57D MATHEMATICAL BOLD FRAKTUR CAPITAL R +1D57E MATHEMATICAL BOLD FRAKTUR CAPITAL S +1D57F MATHEMATICAL BOLD FRAKTUR CAPITAL T +1D580 MATHEMATICAL BOLD FRAKTUR CAPITAL U +1D581 MATHEMATICAL BOLD FRAKTUR CAPITAL V +1D582 MATHEMATICAL BOLD FRAKTUR CAPITAL W +1D583 MATHEMATICAL BOLD FRAKTUR CAPITAL X +1D584 MATHEMATICAL BOLD FRAKTUR CAPITAL Y +1D585 MATHEMATICAL BOLD FRAKTUR CAPITAL Z +1D586 MATHEMATICAL BOLD FRAKTUR SMALL A +1D587 MATHEMATICAL BOLD FRAKTUR SMALL B +1D588 MATHEMATICAL BOLD FRAKTUR SMALL C +1D589 MATHEMATICAL BOLD FRAKTUR SMALL D +1D58A MATHEMATICAL BOLD FRAKTUR SMALL E +1D58B MATHEMATICAL BOLD FRAKTUR SMALL F +1D58C MATHEMATICAL BOLD FRAKTUR SMALL G +1D58D MATHEMATICAL BOLD FRAKTUR SMALL H +1D58E MATHEMATICAL BOLD FRAKTUR SMALL I +1D58F MATHEMATICAL BOLD FRAKTUR SMALL J +1D590 MATHEMATICAL BOLD FRAKTUR SMALL K +1D591 MATHEMATICAL BOLD FRAKTUR SMALL L +1D592 MATHEMATICAL BOLD FRAKTUR SMALL M +1D593 MATHEMATICAL BOLD FRAKTUR SMALL N +1D594 MATHEMATICAL BOLD FRAKTUR SMALL O +1D595 MATHEMATICAL BOLD FRAKTUR SMALL P +1D596 MATHEMATICAL BOLD FRAKTUR SMALL Q +1D597 MATHEMATICAL BOLD FRAKTUR SMALL R +1D598 MATHEMATICAL BOLD FRAKTUR SMALL S +1D599 MATHEMATICAL BOLD FRAKTUR SMALL T +1D59A MATHEMATICAL BOLD FRAKTUR SMALL U +1D59B MATHEMATICAL BOLD FRAKTUR SMALL V +1D59C MATHEMATICAL BOLD FRAKTUR SMALL W +1D59D MATHEMATICAL BOLD FRAKTUR SMALL X +1D59E MATHEMATICAL BOLD FRAKTUR SMALL Y +1D59F MATHEMATICAL BOLD FRAKTUR SMALL Z +1D5A0 MATHEMATICAL SANS-SERIF CAPITAL A +1D5A1 MATHEMATICAL SANS-SERIF CAPITAL B +1D5A2 MATHEMATICAL SANS-SERIF CAPITAL C +1D5A3 MATHEMATICAL SANS-SERIF CAPITAL D +1D5A4 MATHEMATICAL SANS-SERIF CAPITAL E +1D5A5 MATHEMATICAL SANS-SERIF CAPITAL F +1D5A6 MATHEMATICAL SANS-SERIF CAPITAL G +1D5A7 MATHEMATICAL SANS-SERIF CAPITAL H +1D5A8 MATHEMATICAL SANS-SERIF CAPITAL I +1D5A9 MATHEMATICAL SANS-SERIF CAPITAL J +1D5AA MATHEMATICAL SANS-SERIF CAPITAL K +1D5AB MATHEMATICAL SANS-SERIF CAPITAL L +1D5AC MATHEMATICAL SANS-SERIF CAPITAL M +1D5AD MATHEMATICAL SANS-SERIF CAPITAL N +1D5AE MATHEMATICAL SANS-SERIF CAPITAL O +1D5AF MATHEMATICAL SANS-SERIF CAPITAL P +1D5B0 MATHEMATICAL SANS-SERIF CAPITAL Q +1D5B1 MATHEMATICAL SANS-SERIF CAPITAL R +1D5B2 MATHEMATICAL SANS-SERIF CAPITAL S +1D5B3 MATHEMATICAL SANS-SERIF CAPITAL T +1D5B4 MATHEMATICAL SANS-SERIF CAPITAL U +1D5B5 MATHEMATICAL SANS-SERIF CAPITAL V +1D5B6 MATHEMATICAL SANS-SERIF CAPITAL W +1D5B7 MATHEMATICAL SANS-SERIF CAPITAL X +1D5B8 MATHEMATICAL SANS-SERIF CAPITAL Y +1D5B9 MATHEMATICAL SANS-SERIF CAPITAL Z +1D5BA MATHEMATICAL SANS-SERIF SMALL A +1D5BB MATHEMATICAL SANS-SERIF SMALL B +1D5BC MATHEMATICAL SANS-SERIF SMALL C +1D5BD MATHEMATICAL SANS-SERIF SMALL D +1D5BE MATHEMATICAL SANS-SERIF SMALL E +1D5BF MATHEMATICAL SANS-SERIF SMALL F +1D5C0 MATHEMATICAL SANS-SERIF SMALL G +1D5C1 MATHEMATICAL SANS-SERIF SMALL H +1D5C2 MATHEMATICAL SANS-SERIF SMALL I +1D5C3 MATHEMATICAL SANS-SERIF SMALL J +1D5C4 MATHEMATICAL SANS-SERIF SMALL K +1D5C5 MATHEMATICAL SANS-SERIF SMALL L +1D5C6 MATHEMATICAL SANS-SERIF SMALL M +1D5C7 MATHEMATICAL SANS-SERIF SMALL N +1D5C8 MATHEMATICAL SANS-SERIF SMALL O +1D5C9 MATHEMATICAL SANS-SERIF SMALL P +1D5CA MATHEMATICAL SANS-SERIF SMALL Q +1D5CB MATHEMATICAL SANS-SERIF SMALL R +1D5CC MATHEMATICAL SANS-SERIF SMALL S +1D5CD MATHEMATICAL SANS-SERIF SMALL T +1D5CE MATHEMATICAL SANS-SERIF SMALL U +1D5CF MATHEMATICAL SANS-SERIF SMALL V +1D5D0 MATHEMATICAL SANS-SERIF SMALL W +1D5D1 MATHEMATICAL SANS-SERIF SMALL X +1D5D2 MATHEMATICAL SANS-SERIF SMALL Y +1D5D3 MATHEMATICAL SANS-SERIF SMALL Z +1D5D4 MATHEMATICAL SANS-SERIF BOLD CAPITAL A +1D5D5 MATHEMATICAL SANS-SERIF BOLD CAPITAL B +1D5D6 MATHEMATICAL SANS-SERIF BOLD CAPITAL C +1D5D7 MATHEMATICAL SANS-SERIF BOLD CAPITAL D +1D5D8 MATHEMATICAL SANS-SERIF BOLD CAPITAL E +1D5D9 MATHEMATICAL SANS-SERIF BOLD CAPITAL F +1D5DA MATHEMATICAL SANS-SERIF BOLD CAPITAL G +1D5DB MATHEMATICAL SANS-SERIF BOLD CAPITAL H +1D5DC MATHEMATICAL SANS-SERIF BOLD CAPITAL I +1D5DD MATHEMATICAL SANS-SERIF BOLD CAPITAL J +1D5DE MATHEMATICAL SANS-SERIF BOLD CAPITAL K +1D5DF MATHEMATICAL SANS-SERIF BOLD CAPITAL L +1D5E0 MATHEMATICAL SANS-SERIF BOLD CAPITAL M +1D5E1 MATHEMATICAL SANS-SERIF BOLD CAPITAL N +1D5E2 MATHEMATICAL SANS-SERIF BOLD CAPITAL O +1D5E3 MATHEMATICAL SANS-SERIF BOLD CAPITAL P +1D5E4 MATHEMATICAL SANS-SERIF BOLD CAPITAL Q +1D5E5 MATHEMATICAL SANS-SERIF BOLD CAPITAL R +1D5E6 MATHEMATICAL SANS-SERIF BOLD CAPITAL S +1D5E7 MATHEMATICAL SANS-SERIF BOLD CAPITAL T +1D5E8 MATHEMATICAL SANS-SERIF BOLD CAPITAL U +1D5E9 MATHEMATICAL SANS-SERIF BOLD CAPITAL V +1D5EA MATHEMATICAL SANS-SERIF BOLD CAPITAL W +1D5EB MATHEMATICAL SANS-SERIF BOLD CAPITAL X +1D5EC MATHEMATICAL SANS-SERIF BOLD CAPITAL Y +1D5ED MATHEMATICAL SANS-SERIF BOLD CAPITAL Z +1D5EE MATHEMATICAL SANS-SERIF BOLD SMALL A +1D5EF MATHEMATICAL SANS-SERIF BOLD SMALL B +1D5F0 MATHEMATICAL SANS-SERIF BOLD SMALL C +1D5F1 MATHEMATICAL SANS-SERIF BOLD SMALL D +1D5F2 MATHEMATICAL SANS-SERIF BOLD SMALL E +1D5F3 MATHEMATICAL SANS-SERIF BOLD SMALL F +1D5F4 MATHEMATICAL SANS-SERIF BOLD SMALL G +1D5F5 MATHEMATICAL SANS-SERIF BOLD SMALL H +1D5F6 MATHEMATICAL SANS-SERIF BOLD SMALL I +1D5F7 MATHEMATICAL SANS-SERIF BOLD SMALL J +1D5F8 MATHEMATICAL SANS-SERIF BOLD SMALL K +1D5F9 MATHEMATICAL SANS-SERIF BOLD SMALL L +1D5FA MATHEMATICAL SANS-SERIF BOLD SMALL M +1D5FB MATHEMATICAL SANS-SERIF BOLD SMALL N +1D5FC MATHEMATICAL SANS-SERIF BOLD SMALL O +1D5FD MATHEMATICAL SANS-SERIF BOLD SMALL P +1D5FE MATHEMATICAL SANS-SERIF BOLD SMALL Q +1D5FF MATHEMATICAL SANS-SERIF BOLD SMALL R +1D600 MATHEMATICAL SANS-SERIF BOLD SMALL S +1D601 MATHEMATICAL SANS-SERIF BOLD SMALL T +1D602 MATHEMATICAL SANS-SERIF BOLD SMALL U +1D603 MATHEMATICAL SANS-SERIF BOLD SMALL V +1D604 MATHEMATICAL SANS-SERIF BOLD SMALL W +1D605 MATHEMATICAL SANS-SERIF BOLD SMALL X +1D606 MATHEMATICAL SANS-SERIF BOLD SMALL Y +1D607 MATHEMATICAL SANS-SERIF BOLD SMALL Z +1D608 MATHEMATICAL SANS-SERIF ITALIC CAPITAL A +1D609 MATHEMATICAL SANS-SERIF ITALIC CAPITAL B +1D60A MATHEMATICAL SANS-SERIF ITALIC CAPITAL C +1D60B MATHEMATICAL SANS-SERIF ITALIC CAPITAL D +1D60C MATHEMATICAL SANS-SERIF ITALIC CAPITAL E +1D60D MATHEMATICAL SANS-SERIF ITALIC CAPITAL F +1D60E MATHEMATICAL SANS-SERIF ITALIC CAPITAL G +1D60F MATHEMATICAL SANS-SERIF ITALIC CAPITAL H +1D610 MATHEMATICAL SANS-SERIF ITALIC CAPITAL I +1D611 MATHEMATICAL SANS-SERIF ITALIC CAPITAL J +1D612 MATHEMATICAL SANS-SERIF ITALIC CAPITAL K +1D613 MATHEMATICAL SANS-SERIF ITALIC CAPITAL L +1D614 MATHEMATICAL SANS-SERIF ITALIC CAPITAL M +1D615 MATHEMATICAL SANS-SERIF ITALIC CAPITAL N +1D616 MATHEMATICAL SANS-SERIF ITALIC CAPITAL O +1D617 MATHEMATICAL SANS-SERIF ITALIC CAPITAL P +1D618 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q +1D619 MATHEMATICAL SANS-SERIF ITALIC CAPITAL R +1D61A MATHEMATICAL SANS-SERIF ITALIC CAPITAL S +1D61B MATHEMATICAL SANS-SERIF ITALIC CAPITAL T +1D61C MATHEMATICAL SANS-SERIF ITALIC CAPITAL U +1D61D MATHEMATICAL SANS-SERIF ITALIC CAPITAL V +1D61E MATHEMATICAL SANS-SERIF ITALIC CAPITAL W +1D61F MATHEMATICAL SANS-SERIF ITALIC CAPITAL X +1D620 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y +1D621 MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z +1D622 MATHEMATICAL SANS-SERIF ITALIC SMALL A +1D623 MATHEMATICAL SANS-SERIF ITALIC SMALL B +1D624 MATHEMATICAL SANS-SERIF ITALIC SMALL C +1D625 MATHEMATICAL SANS-SERIF ITALIC SMALL D +1D626 MATHEMATICAL SANS-SERIF ITALIC SMALL E +1D627 MATHEMATICAL SANS-SERIF ITALIC SMALL F +1D628 MATHEMATICAL SANS-SERIF ITALIC SMALL G +1D629 MATHEMATICAL SANS-SERIF ITALIC SMALL H +1D62A MATHEMATICAL SANS-SERIF ITALIC SMALL I +1D62B MATHEMATICAL SANS-SERIF ITALIC SMALL J +1D62C MATHEMATICAL SANS-SERIF ITALIC SMALL K +1D62D MATHEMATICAL SANS-SERIF ITALIC SMALL L +1D62E MATHEMATICAL SANS-SERIF ITALIC SMALL M +1D62F MATHEMATICAL SANS-SERIF ITALIC SMALL N +1D630 MATHEMATICAL SANS-SERIF ITALIC SMALL O +1D631 MATHEMATICAL SANS-SERIF ITALIC SMALL P +1D632 MATHEMATICAL SANS-SERIF ITALIC SMALL Q +1D633 MATHEMATICAL SANS-SERIF ITALIC SMALL R +1D634 MATHEMATICAL SANS-SERIF ITALIC SMALL S +1D635 MATHEMATICAL SANS-SERIF ITALIC SMALL T +1D636 MATHEMATICAL SANS-SERIF ITALIC SMALL U +1D637 MATHEMATICAL SANS-SERIF ITALIC SMALL V +1D638 MATHEMATICAL SANS-SERIF ITALIC SMALL W +1D639 MATHEMATICAL SANS-SERIF ITALIC SMALL X +1D63A MATHEMATICAL SANS-SERIF ITALIC SMALL Y +1D63B MATHEMATICAL SANS-SERIF ITALIC SMALL Z +1D63C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A +1D63D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B +1D63E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C +1D63F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D +1D640 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E +1D641 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F +1D642 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G +1D643 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H +1D644 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I +1D645 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J +1D646 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K +1D647 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L +1D648 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M +1D649 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N +1D64A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O +1D64B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P +1D64C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q +1D64D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R +1D64E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S +1D64F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T +1D650 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U +1D651 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V +1D652 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W +1D653 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X +1D654 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y +1D655 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z +1D656 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A +1D657 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B +1D658 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C +1D659 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D +1D65A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E +1D65B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F +1D65C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G +1D65D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H +1D65E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I +1D65F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J +1D660 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K +1D661 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L +1D662 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M +1D663 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N +1D664 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O +1D665 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P +1D666 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q +1D667 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R +1D668 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S +1D669 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T +1D66A MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U +1D66B MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V +1D66C MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W +1D66D MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X +1D66E MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y +1D66F MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z +1D670 MATHEMATICAL MONOSPACE CAPITAL A +1D671 MATHEMATICAL MONOSPACE CAPITAL B +1D672 MATHEMATICAL MONOSPACE CAPITAL C +1D673 MATHEMATICAL MONOSPACE CAPITAL D +1D674 MATHEMATICAL MONOSPACE CAPITAL E +1D675 MATHEMATICAL MONOSPACE CAPITAL F +1D676 MATHEMATICAL MONOSPACE CAPITAL G +1D677 MATHEMATICAL MONOSPACE CAPITAL H +1D678 MATHEMATICAL MONOSPACE CAPITAL I +1D679 MATHEMATICAL MONOSPACE CAPITAL J +1D67A MATHEMATICAL MONOSPACE CAPITAL K +1D67B MATHEMATICAL MONOSPACE CAPITAL L +1D67C MATHEMATICAL MONOSPACE CAPITAL M +1D67D MATHEMATICAL MONOSPACE CAPITAL N +1D67E MATHEMATICAL MONOSPACE CAPITAL O +1D67F MATHEMATICAL MONOSPACE CAPITAL P +1D680 MATHEMATICAL MONOSPACE CAPITAL Q +1D681 MATHEMATICAL MONOSPACE CAPITAL R +1D682 MATHEMATICAL MONOSPACE CAPITAL S +1D683 MATHEMATICAL MONOSPACE CAPITAL T +1D684 MATHEMATICAL MONOSPACE CAPITAL U +1D685 MATHEMATICAL MONOSPACE CAPITAL V +1D686 MATHEMATICAL MONOSPACE CAPITAL W +1D687 MATHEMATICAL MONOSPACE CAPITAL X +1D688 MATHEMATICAL MONOSPACE CAPITAL Y +1D689 MATHEMATICAL MONOSPACE CAPITAL Z +1D68A MATHEMATICAL MONOSPACE SMALL A +1D68B MATHEMATICAL MONOSPACE SMALL B +1D68C MATHEMATICAL MONOSPACE SMALL C +1D68D MATHEMATICAL MONOSPACE SMALL D +1D68E MATHEMATICAL MONOSPACE SMALL E +1D68F MATHEMATICAL MONOSPACE SMALL F +1D690 MATHEMATICAL MONOSPACE SMALL G +1D691 MATHEMATICAL MONOSPACE SMALL H +1D692 MATHEMATICAL MONOSPACE SMALL I +1D693 MATHEMATICAL MONOSPACE SMALL J +1D694 MATHEMATICAL MONOSPACE SMALL K +1D695 MATHEMATICAL MONOSPACE SMALL L +1D696 MATHEMATICAL MONOSPACE SMALL M +1D697 MATHEMATICAL MONOSPACE SMALL N +1D698 MATHEMATICAL MONOSPACE SMALL O +1D699 MATHEMATICAL MONOSPACE SMALL P +1D69A MATHEMATICAL MONOSPACE SMALL Q +1D69B MATHEMATICAL MONOSPACE SMALL R +1D69C MATHEMATICAL MONOSPACE SMALL S +1D69D MATHEMATICAL MONOSPACE SMALL T +1D69E MATHEMATICAL MONOSPACE SMALL U +1D69F MATHEMATICAL MONOSPACE SMALL V +1D6A0 MATHEMATICAL MONOSPACE SMALL W +1D6A1 MATHEMATICAL MONOSPACE SMALL X +1D6A2 MATHEMATICAL MONOSPACE SMALL Y +1D6A3 MATHEMATICAL MONOSPACE SMALL Z +1D6A4 MATHEMATICAL ITALIC SMALL DOTLESS I +1D6A5 MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8 MATHEMATICAL BOLD CAPITAL ALPHA +1D6A9 MATHEMATICAL BOLD CAPITAL BETA +1D6AA MATHEMATICAL BOLD CAPITAL GAMMA +1D6AB MATHEMATICAL BOLD CAPITAL DELTA +1D6AC MATHEMATICAL BOLD CAPITAL EPSILON +1D6AD MATHEMATICAL BOLD CAPITAL ZETA +1D6AE MATHEMATICAL BOLD CAPITAL ETA +1D6AF MATHEMATICAL BOLD CAPITAL THETA +1D6B0 MATHEMATICAL BOLD CAPITAL IOTA +1D6B1 MATHEMATICAL BOLD CAPITAL KAPPA +1D6B2 MATHEMATICAL BOLD CAPITAL LAMDA +1D6B3 MATHEMATICAL BOLD CAPITAL MU +1D6B4 MATHEMATICAL BOLD CAPITAL NU +1D6B5 MATHEMATICAL BOLD CAPITAL XI +1D6B6 MATHEMATICAL BOLD CAPITAL OMICRON +1D6B7 MATHEMATICAL BOLD CAPITAL PI +1D6B8 MATHEMATICAL BOLD CAPITAL RHO +1D6B9 MATHEMATICAL BOLD CAPITAL THETA SYMBOL +1D6BA MATHEMATICAL BOLD CAPITAL SIGMA +1D6BB MATHEMATICAL BOLD CAPITAL TAU +1D6BC MATHEMATICAL BOLD CAPITAL UPSILON +1D6BD MATHEMATICAL BOLD CAPITAL PHI +1D6BE MATHEMATICAL BOLD CAPITAL CHI +1D6BF MATHEMATICAL BOLD CAPITAL PSI +1D6C0 MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 MATHEMATICAL BOLD NABLA +1D6C2 MATHEMATICAL BOLD SMALL ALPHA +1D6C3 MATHEMATICAL BOLD SMALL BETA +1D6C4 MATHEMATICAL BOLD SMALL GAMMA +1D6C5 MATHEMATICAL BOLD SMALL DELTA +1D6C6 MATHEMATICAL BOLD SMALL EPSILON +1D6C7 MATHEMATICAL BOLD SMALL ZETA +1D6C8 MATHEMATICAL BOLD SMALL ETA +1D6C9 MATHEMATICAL BOLD SMALL THETA +1D6CA MATHEMATICAL BOLD SMALL IOTA +1D6CB MATHEMATICAL BOLD SMALL KAPPA +1D6CC MATHEMATICAL BOLD SMALL LAMDA +1D6CD MATHEMATICAL BOLD SMALL MU +1D6CE MATHEMATICAL BOLD SMALL NU +1D6CF MATHEMATICAL BOLD SMALL XI +1D6D0 MATHEMATICAL BOLD SMALL OMICRON +1D6D1 MATHEMATICAL BOLD SMALL PI +1D6D2 MATHEMATICAL BOLD SMALL RHO +1D6D3 MATHEMATICAL BOLD SMALL FINAL SIGMA +1D6D4 MATHEMATICAL BOLD SMALL SIGMA +1D6D5 MATHEMATICAL BOLD SMALL TAU +1D6D6 MATHEMATICAL BOLD SMALL UPSILON +1D6D7 MATHEMATICAL BOLD SMALL PHI +1D6D8 MATHEMATICAL BOLD SMALL CHI +1D6D9 MATHEMATICAL BOLD SMALL PSI +1D6DA MATHEMATICAL BOLD SMALL OMEGA +1D6DB MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC MATHEMATICAL BOLD EPSILON SYMBOL +1D6DD MATHEMATICAL BOLD THETA SYMBOL +1D6DE MATHEMATICAL BOLD KAPPA SYMBOL +1D6DF MATHEMATICAL BOLD PHI SYMBOL +1D6E0 MATHEMATICAL BOLD RHO SYMBOL +1D6E1 MATHEMATICAL BOLD PI SYMBOL +1D6E2 MATHEMATICAL ITALIC CAPITAL ALPHA +1D6E3 MATHEMATICAL ITALIC CAPITAL BETA +1D6E4 MATHEMATICAL ITALIC CAPITAL GAMMA +1D6E5 MATHEMATICAL ITALIC CAPITAL DELTA +1D6E6 MATHEMATICAL ITALIC CAPITAL EPSILON +1D6E7 MATHEMATICAL ITALIC CAPITAL ZETA +1D6E8 MATHEMATICAL ITALIC CAPITAL ETA +1D6E9 MATHEMATICAL ITALIC CAPITAL THETA +1D6EA MATHEMATICAL ITALIC CAPITAL IOTA +1D6EB MATHEMATICAL ITALIC CAPITAL KAPPA +1D6EC MATHEMATICAL ITALIC CAPITAL LAMDA +1D6ED MATHEMATICAL ITALIC CAPITAL MU +1D6EE MATHEMATICAL ITALIC CAPITAL NU +1D6EF MATHEMATICAL ITALIC CAPITAL XI +1D6F0 MATHEMATICAL ITALIC CAPITAL OMICRON +1D6F1 MATHEMATICAL ITALIC CAPITAL PI +1D6F2 MATHEMATICAL ITALIC CAPITAL RHO +1D6F3 MATHEMATICAL ITALIC CAPITAL THETA SYMBOL +1D6F4 MATHEMATICAL ITALIC CAPITAL SIGMA +1D6F5 MATHEMATICAL ITALIC CAPITAL TAU +1D6F6 MATHEMATICAL ITALIC CAPITAL UPSILON +1D6F7 MATHEMATICAL ITALIC CAPITAL PHI +1D6F8 MATHEMATICAL ITALIC CAPITAL CHI +1D6F9 MATHEMATICAL ITALIC CAPITAL PSI +1D6FA MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB MATHEMATICAL ITALIC NABLA +1D6FC MATHEMATICAL ITALIC SMALL ALPHA +1D6FD MATHEMATICAL ITALIC SMALL BETA +1D6FE MATHEMATICAL ITALIC SMALL GAMMA +1D6FF MATHEMATICAL ITALIC SMALL DELTA +1D700 MATHEMATICAL ITALIC SMALL EPSILON +1D701 MATHEMATICAL ITALIC SMALL ZETA +1D702 MATHEMATICAL ITALIC SMALL ETA +1D703 MATHEMATICAL ITALIC SMALL THETA +1D704 MATHEMATICAL ITALIC SMALL IOTA +1D705 MATHEMATICAL ITALIC SMALL KAPPA +1D706 MATHEMATICAL ITALIC SMALL LAMDA +1D707 MATHEMATICAL ITALIC SMALL MU +1D708 MATHEMATICAL ITALIC SMALL NU +1D709 MATHEMATICAL ITALIC SMALL XI +1D70A MATHEMATICAL ITALIC SMALL OMICRON +1D70B MATHEMATICAL ITALIC SMALL PI +1D70C MATHEMATICAL ITALIC SMALL RHO +1D70D MATHEMATICAL ITALIC SMALL FINAL SIGMA +1D70E MATHEMATICAL ITALIC SMALL SIGMA +1D70F MATHEMATICAL ITALIC SMALL TAU +1D710 MATHEMATICAL ITALIC SMALL UPSILON +1D711 MATHEMATICAL ITALIC SMALL PHI +1D712 MATHEMATICAL ITALIC SMALL CHI +1D713 MATHEMATICAL ITALIC SMALL PSI +1D714 MATHEMATICAL ITALIC SMALL OMEGA +1D715 MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716 MATHEMATICAL ITALIC EPSILON SYMBOL +1D717 MATHEMATICAL ITALIC THETA SYMBOL +1D718 MATHEMATICAL ITALIC KAPPA SYMBOL +1D719 MATHEMATICAL ITALIC PHI SYMBOL +1D71A MATHEMATICAL ITALIC RHO SYMBOL +1D71B MATHEMATICAL ITALIC PI SYMBOL +1D71C MATHEMATICAL BOLD ITALIC CAPITAL ALPHA +1D71D MATHEMATICAL BOLD ITALIC CAPITAL BETA +1D71E MATHEMATICAL BOLD ITALIC CAPITAL GAMMA +1D71F MATHEMATICAL BOLD ITALIC CAPITAL DELTA +1D720 MATHEMATICAL BOLD ITALIC CAPITAL EPSILON +1D721 MATHEMATICAL BOLD ITALIC CAPITAL ZETA +1D722 MATHEMATICAL BOLD ITALIC CAPITAL ETA +1D723 MATHEMATICAL BOLD ITALIC CAPITAL THETA +1D724 MATHEMATICAL BOLD ITALIC CAPITAL IOTA +1D725 MATHEMATICAL BOLD ITALIC CAPITAL KAPPA +1D726 MATHEMATICAL BOLD ITALIC CAPITAL LAMDA +1D727 MATHEMATICAL BOLD ITALIC CAPITAL MU +1D728 MATHEMATICAL BOLD ITALIC CAPITAL NU +1D729 MATHEMATICAL BOLD ITALIC CAPITAL XI +1D72A MATHEMATICAL BOLD ITALIC CAPITAL OMICRON +1D72B MATHEMATICAL BOLD ITALIC CAPITAL PI +1D72C MATHEMATICAL BOLD ITALIC CAPITAL RHO +1D72D MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL +1D72E MATHEMATICAL BOLD ITALIC CAPITAL SIGMA +1D72F MATHEMATICAL BOLD ITALIC CAPITAL TAU +1D730 MATHEMATICAL BOLD ITALIC CAPITAL UPSILON +1D731 MATHEMATICAL BOLD ITALIC CAPITAL PHI +1D732 MATHEMATICAL BOLD ITALIC CAPITAL CHI +1D733 MATHEMATICAL BOLD ITALIC CAPITAL PSI +1D734 MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 MATHEMATICAL BOLD ITALIC NABLA +1D736 MATHEMATICAL BOLD ITALIC SMALL ALPHA +1D737 MATHEMATICAL BOLD ITALIC SMALL BETA +1D738 MATHEMATICAL BOLD ITALIC SMALL GAMMA +1D739 MATHEMATICAL BOLD ITALIC SMALL DELTA +1D73A MATHEMATICAL BOLD ITALIC SMALL EPSILON +1D73B MATHEMATICAL BOLD ITALIC SMALL ZETA +1D73C MATHEMATICAL BOLD ITALIC SMALL ETA +1D73D MATHEMATICAL BOLD ITALIC SMALL THETA +1D73E MATHEMATICAL BOLD ITALIC SMALL IOTA +1D73F MATHEMATICAL BOLD ITALIC SMALL KAPPA +1D740 MATHEMATICAL BOLD ITALIC SMALL LAMDA +1D741 MATHEMATICAL BOLD ITALIC SMALL MU +1D742 MATHEMATICAL BOLD ITALIC SMALL NU +1D743 MATHEMATICAL BOLD ITALIC SMALL XI +1D744 MATHEMATICAL BOLD ITALIC SMALL OMICRON +1D745 MATHEMATICAL BOLD ITALIC SMALL PI +1D746 MATHEMATICAL BOLD ITALIC SMALL RHO +1D747 MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA +1D748 MATHEMATICAL BOLD ITALIC SMALL SIGMA +1D749 MATHEMATICAL BOLD ITALIC SMALL TAU +1D74A MATHEMATICAL BOLD ITALIC SMALL UPSILON +1D74B MATHEMATICAL BOLD ITALIC SMALL PHI +1D74C MATHEMATICAL BOLD ITALIC SMALL CHI +1D74D MATHEMATICAL BOLD ITALIC SMALL PSI +1D74E MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750 MATHEMATICAL BOLD ITALIC EPSILON SYMBOL +1D751 MATHEMATICAL BOLD ITALIC THETA SYMBOL +1D752 MATHEMATICAL BOLD ITALIC KAPPA SYMBOL +1D753 MATHEMATICAL BOLD ITALIC PHI SYMBOL +1D754 MATHEMATICAL BOLD ITALIC RHO SYMBOL +1D755 MATHEMATICAL BOLD ITALIC PI SYMBOL +1D756 MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA +1D757 MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA +1D758 MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA +1D759 MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA +1D75A MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON +1D75B MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA +1D75C MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA +1D75D MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA +1D75E MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA +1D75F MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA +1D760 MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA +1D761 MATHEMATICAL SANS-SERIF BOLD CAPITAL MU +1D762 MATHEMATICAL SANS-SERIF BOLD CAPITAL NU +1D763 MATHEMATICAL SANS-SERIF BOLD CAPITAL XI +1D764 MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON +1D765 MATHEMATICAL SANS-SERIF BOLD CAPITAL PI +1D766 MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO +1D767 MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL +1D768 MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA +1D769 MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU +1D76A MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON +1D76B MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI +1D76C MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI +1D76D MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI +1D76E MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F MATHEMATICAL SANS-SERIF BOLD NABLA +1D770 MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA +1D771 MATHEMATICAL SANS-SERIF BOLD SMALL BETA +1D772 MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA +1D773 MATHEMATICAL SANS-SERIF BOLD SMALL DELTA +1D774 MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON +1D775 MATHEMATICAL SANS-SERIF BOLD SMALL ZETA +1D776 MATHEMATICAL SANS-SERIF BOLD SMALL ETA +1D777 MATHEMATICAL SANS-SERIF BOLD SMALL THETA +1D778 MATHEMATICAL SANS-SERIF BOLD SMALL IOTA +1D779 MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA +1D77A MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA +1D77B MATHEMATICAL SANS-SERIF BOLD SMALL MU +1D77C MATHEMATICAL SANS-SERIF BOLD SMALL NU +1D77D MATHEMATICAL SANS-SERIF BOLD SMALL XI +1D77E MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON +1D77F MATHEMATICAL SANS-SERIF BOLD SMALL PI +1D780 MATHEMATICAL SANS-SERIF BOLD SMALL RHO +1D781 MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA +1D782 MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA +1D783 MATHEMATICAL SANS-SERIF BOLD SMALL TAU +1D784 MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON +1D785 MATHEMATICAL SANS-SERIF BOLD SMALL PHI +1D786 MATHEMATICAL SANS-SERIF BOLD SMALL CHI +1D787 MATHEMATICAL SANS-SERIF BOLD SMALL PSI +1D788 MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL +1D78B MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL +1D78C MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL +1D78D MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL +1D78E MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL +1D78F MATHEMATICAL SANS-SERIF BOLD PI SYMBOL +1D790 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA +1D791 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA +1D792 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA +1D793 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA +1D794 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON +1D795 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA +1D796 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA +1D797 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA +1D798 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA +1D799 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA +1D79A MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA +1D79B MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU +1D79C MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU +1D79D MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI +1D79E MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON +1D79F MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI +1D7A0 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO +1D7A1 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL +1D7A2 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA +1D7A3 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU +1D7A4 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON +1D7A5 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI +1D7A6 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI +1D7A7 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI +1D7A8 MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA +1D7AB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA +1D7AC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA +1D7AD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA +1D7AE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON +1D7AF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA +1D7B0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA +1D7B1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA +1D7B2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA +1D7B3 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA +1D7B4 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA +1D7B5 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU +1D7B6 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU +1D7B7 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI +1D7B8 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON +1D7B9 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI +1D7BA MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO +1D7BB MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA +1D7BC MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA +1D7BD MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU +1D7BE MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON +1D7BF MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI +1D7C0 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI +1D7C1 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI +1D7C2 MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4 MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL +1D7C5 MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL +1D7C6 MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL +1D7C7 MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL +1D7C8 MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL +1D7C9 MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL +1D7CA MATHEMATICAL BOLD CAPITAL DIGAMMA +1D7CB MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE MATHEMATICAL BOLD DIGIT ZERO +1D7CF MATHEMATICAL BOLD DIGIT ONE +1D7D0 MATHEMATICAL BOLD DIGIT TWO +1D7D1 MATHEMATICAL BOLD DIGIT THREE +1D7D2 MATHEMATICAL BOLD DIGIT FOUR +1D7D3 MATHEMATICAL BOLD DIGIT FIVE +1D7D4 MATHEMATICAL BOLD DIGIT SIX +1D7D5 MATHEMATICAL BOLD DIGIT SEVEN +1D7D6 MATHEMATICAL BOLD DIGIT EIGHT +1D7D7 MATHEMATICAL BOLD DIGIT NINE +1D7D8 MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO +1D7D9 MATHEMATICAL DOUBLE-STRUCK DIGIT ONE +1D7DA MATHEMATICAL DOUBLE-STRUCK DIGIT TWO +1D7DB MATHEMATICAL DOUBLE-STRUCK DIGIT THREE +1D7DC MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR +1D7DD MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE +1D7DE MATHEMATICAL DOUBLE-STRUCK DIGIT SIX +1D7DF MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN +1D7E0 MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT +1D7E1 MATHEMATICAL DOUBLE-STRUCK DIGIT NINE +1D7E2 MATHEMATICAL SANS-SERIF DIGIT ZERO +1D7E3 MATHEMATICAL SANS-SERIF DIGIT ONE +1D7E4 MATHEMATICAL SANS-SERIF DIGIT TWO +1D7E5 MATHEMATICAL SANS-SERIF DIGIT THREE +1D7E6 MATHEMATICAL SANS-SERIF DIGIT FOUR +1D7E7 MATHEMATICAL SANS-SERIF DIGIT FIVE +1D7E8 MATHEMATICAL SANS-SERIF DIGIT SIX +1D7E9 MATHEMATICAL SANS-SERIF DIGIT SEVEN +1D7EA MATHEMATICAL SANS-SERIF DIGIT EIGHT +1D7EB MATHEMATICAL SANS-SERIF DIGIT NINE +1D7EC MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO +1D7ED MATHEMATICAL SANS-SERIF BOLD DIGIT ONE +1D7EE MATHEMATICAL SANS-SERIF BOLD DIGIT TWO +1D7EF MATHEMATICAL SANS-SERIF BOLD DIGIT THREE +1D7F0 MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR +1D7F1 MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE +1D7F2 MATHEMATICAL SANS-SERIF BOLD DIGIT SIX +1D7F3 MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN +1D7F4 MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT +1D7F5 MATHEMATICAL SANS-SERIF BOLD DIGIT NINE +1D7F6 MATHEMATICAL MONOSPACE DIGIT ZERO +1D7F7 MATHEMATICAL MONOSPACE DIGIT ONE +1D7F8 MATHEMATICAL MONOSPACE DIGIT TWO +1D7F9 MATHEMATICAL MONOSPACE DIGIT THREE +1D7FA MATHEMATICAL MONOSPACE DIGIT FOUR +1D7FB MATHEMATICAL MONOSPACE DIGIT FIVE +1D7FC MATHEMATICAL MONOSPACE DIGIT SIX +1D7FD MATHEMATICAL MONOSPACE DIGIT SEVEN +1D7FE MATHEMATICAL MONOSPACE DIGIT EIGHT +1D7FF MATHEMATICAL MONOSPACE DIGIT NINE +1D800 SIGNWRITING HAND-FIST INDEX +1D801 SIGNWRITING HAND-CIRCLE INDEX +1D802 SIGNWRITING HAND-CUP INDEX +1D803 SIGNWRITING HAND-OVAL INDEX +1D804 SIGNWRITING HAND-HINGE INDEX +1D805 SIGNWRITING HAND-ANGLE INDEX +1D806 SIGNWRITING HAND-FIST INDEX BENT +1D807 SIGNWRITING HAND-CIRCLE INDEX BENT +1D808 SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT +1D809 SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE +1D80A SIGNWRITING HAND-FIST INDEX CUPPED +1D80B SIGNWRITING HAND-FIST INDEX HINGED +1D80C SIGNWRITING HAND-FIST INDEX HINGED LOW +1D80D SIGNWRITING HAND-CIRCLE INDEX HINGE +1D80E SIGNWRITING HAND-FIST INDEX MIDDLE +1D80F SIGNWRITING HAND-CIRCLE INDEX MIDDLE +1D810 SIGNWRITING HAND-FIST INDEX MIDDLE BENT +1D811 SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES +1D812 SIGNWRITING HAND-FIST INDEX MIDDLE HINGED +1D813 SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED +1D814 SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP +1D815 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED +1D816 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT +1D817 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT +1D818 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED +1D819 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED +1D81A SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED +1D81B SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED +1D81C SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX +1D81D SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE +1D81E SIGNWRITING HAND-FIST INDEX MIDDLE THUMB +1D81F SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB +1D820 SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT +1D821 SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT +1D822 SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT +1D823 SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE +1D824 SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE +1D825 SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED +1D826 SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE +1D827 SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD +1D828 SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED +1D829 SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED +1D82A SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED +1D82B SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED +1D82C SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT +1D82D SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE +1D82E SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED +1D82F SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT +1D830 SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP +1D831 SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP +1D832 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE +1D833 SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE +1D834 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD +1D835 SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD +1D836 SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP +1D837 SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP +1D838 SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP +1D839 SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED +1D83A SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP +1D83B SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP +1D83C SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP +1D83D SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED +1D83E SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT +1D83F SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED +1D840 SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP +1D841 SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED +1D842 SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP +1D843 SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED +1D844 SIGNWRITING HAND-FLAT FOUR FINGERS +1D845 SIGNWRITING HAND-FLAT FOUR FINGERS BENT +1D846 SIGNWRITING HAND-FLAT FOUR FINGERS HINGED +1D847 SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED +1D848 SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT +1D849 SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED +1D84A SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT +1D84B SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED +1D84C SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD +1D84D SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD +1D84E SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT +1D84F SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT +1D850 SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT +1D851 SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT +1D852 SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD +1D853 SIGNWRITING HAND-CUP FIVE FINGERS SPREAD +1D854 SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN +1D855 SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN +1D856 SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD +1D857 SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED +1D858 SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE +1D859 SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB +1D85A SIGNWRITING HAND-FLAT +1D85B SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS +1D85C SIGNWRITING HAND-FLAT HEEL +1D85D SIGNWRITING HAND-FLAT THUMB SIDE +1D85E SIGNWRITING HAND-FLAT HEEL THUMB SIDE +1D85F SIGNWRITING HAND-FLAT THUMB BENT +1D860 SIGNWRITING HAND-FLAT THUMB FORWARD +1D861 SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE +1D862 SIGNWRITING HAND-FLAT SPLIT CENTRE +1D863 SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE +1D864 SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT +1D865 SIGNWRITING HAND-FLAT SPLIT LITTLE +1D866 SIGNWRITING HAND-CLAW +1D867 SIGNWRITING HAND-CLAW THUMB SIDE +1D868 SIGNWRITING HAND-CLAW NO THUMB +1D869 SIGNWRITING HAND-CLAW THUMB FORWARD +1D86A SIGNWRITING HAND-HOOK CURLICUE +1D86B SIGNWRITING HAND-HOOK +1D86C SIGNWRITING HAND-CUP OPEN +1D86D SIGNWRITING HAND-CUP +1D86E SIGNWRITING HAND-CUP OPEN THUMB SIDE +1D86F SIGNWRITING HAND-CUP THUMB SIDE +1D870 SIGNWRITING HAND-CUP OPEN NO THUMB +1D871 SIGNWRITING HAND-CUP NO THUMB +1D872 SIGNWRITING HAND-CUP OPEN THUMB FORWARD +1D873 SIGNWRITING HAND-CUP THUMB FORWARD +1D874 SIGNWRITING HAND-CURLICUE OPEN +1D875 SIGNWRITING HAND-CURLICUE +1D876 SIGNWRITING HAND-CIRCLE +1D877 SIGNWRITING HAND-OVAL +1D878 SIGNWRITING HAND-OVAL THUMB SIDE +1D879 SIGNWRITING HAND-OVAL NO THUMB +1D87A SIGNWRITING HAND-OVAL THUMB FORWARD +1D87B SIGNWRITING HAND-HINGE OPEN +1D87C SIGNWRITING HAND-HINGE OPEN THUMB FORWARD +1D87D SIGNWRITING HAND-HINGE +1D87E SIGNWRITING HAND-HINGE SMALL +1D87F SIGNWRITING HAND-HINGE OPEN THUMB SIDE +1D880 SIGNWRITING HAND-HINGE THUMB SIDE +1D881 SIGNWRITING HAND-HINGE OPEN NO THUMB +1D882 SIGNWRITING HAND-HINGE NO THUMB +1D883 SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX +1D884 SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING +1D885 SIGNWRITING HAND-ANGLE +1D886 SIGNWRITING HAND-FIST INDEX MIDDLE RING +1D887 SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING +1D888 SIGNWRITING HAND-HINGE INDEX MIDDLE RING +1D889 SIGNWRITING HAND-ANGLE INDEX MIDDLE RING +1D88A SIGNWRITING HAND-HINGE LITTLE +1D88B SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT +1D88C SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED +1D88D SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED +1D88E SIGNWRITING HAND-FIST LITTLE DOWN +1D88F SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT +1D890 SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED +1D891 SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED +1D892 SIGNWRITING HAND-FIST LITTLE UP +1D893 SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP +1D894 SIGNWRITING HAND-CIRCLE LITTLE UP +1D895 SIGNWRITING HAND-OVAL LITTLE UP +1D896 SIGNWRITING HAND-ANGLE LITTLE UP +1D897 SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE +1D898 SIGNWRITING HAND-FIST LITTLE BENT +1D899 SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB +1D89A SIGNWRITING HAND-FIST LITTLE THUMB +1D89B SIGNWRITING HAND-HINGE LITTLE THUMB +1D89C SIGNWRITING HAND-FIST LITTLE INDEX THUMB +1D89D SIGNWRITING HAND-HINGE LITTLE INDEX THUMB +1D89E SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT +1D89F SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB +1D8A0 SIGNWRITING HAND-FIST LITTLE INDEX +1D8A1 SIGNWRITING HAND-CIRCLE LITTLE INDEX +1D8A2 SIGNWRITING HAND-HINGE LITTLE INDEX +1D8A3 SIGNWRITING HAND-ANGLE LITTLE INDEX +1D8A4 SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE +1D8A5 SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE +1D8A6 SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE +1D8A7 SIGNWRITING HAND-HINGE RING +1D8A8 SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE +1D8A9 SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE +1D8AA SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE +1D8AB SIGNWRITING HAND-FIST RING DOWN +1D8AC SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE +1D8AD SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS +1D8AE SIGNWRITING HAND-FIST RING UP +1D8AF SIGNWRITING HAND-FIST RING RAISED KNUCKLE +1D8B0 SIGNWRITING HAND-FIST RING LITTLE +1D8B1 SIGNWRITING HAND-CIRCLE RING LITTLE +1D8B2 SIGNWRITING HAND-OVAL RING LITTLE +1D8B3 SIGNWRITING HAND-ANGLE RING LITTLE +1D8B4 SIGNWRITING HAND-FIST RING MIDDLE +1D8B5 SIGNWRITING HAND-FIST RING MIDDLE CONJOINED +1D8B6 SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES +1D8B7 SIGNWRITING HAND-FIST RING INDEX +1D8B8 SIGNWRITING HAND-FIST RING THUMB +1D8B9 SIGNWRITING HAND-HOOK RING THUMB +1D8BA SIGNWRITING HAND-FIST INDEX RING LITTLE +1D8BB SIGNWRITING HAND-CIRCLE INDEX RING LITTLE +1D8BC SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON +1D8BD SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT +1D8BE SIGNWRITING HAND-HOOK INDEX RING LITTLE IN +1D8BF SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER +1D8C0 SIGNWRITING HAND-CUP INDEX RING LITTLE +1D8C1 SIGNWRITING HAND-HINGE INDEX RING LITTLE +1D8C2 SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT +1D8C3 SIGNWRITING HAND-ANGLE INDEX RING LITTLE +1D8C4 SIGNWRITING HAND-FIST MIDDLE DOWN +1D8C5 SIGNWRITING HAND-HINGE MIDDLE +1D8C6 SIGNWRITING HAND-FIST MIDDLE UP +1D8C7 SIGNWRITING HAND-CIRCLE MIDDLE UP +1D8C8 SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE +1D8C9 SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE +1D8CA SIGNWRITING HAND-HOOK MIDDLE THUMB +1D8CB SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE +1D8CC SIGNWRITING HAND-FIST MIDDLE LITTLE +1D8CD SIGNWRITING HAND-FIST MIDDLE RING LITTLE +1D8CE SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE +1D8CF SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON +1D8D0 SIGNWRITING HAND-CUP MIDDLE RING LITTLE +1D8D1 SIGNWRITING HAND-HINGE MIDDLE RING LITTLE +1D8D2 SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT +1D8D3 SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN +1D8D4 SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE +1D8D5 SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT +1D8D6 SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED +1D8D7 SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE +1D8D8 SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT +1D8D9 SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN +1D8DA SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED +1D8DB SIGNWRITING HAND-HINGE INDEX HINGED +1D8DC SIGNWRITING HAND-FIST INDEX THUMB SIDE +1D8DD SIGNWRITING HAND-HINGE INDEX THUMB SIDE +1D8DE SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL +1D8DF SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED +1D8E0 SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT +1D8E1 SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT +1D8E2 SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT +1D8E3 SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE +1D8E4 SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT +1D8E5 SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT +1D8E6 SIGNWRITING HAND-FIST INDEX THUMB HOOK +1D8E7 SIGNWRITING HAND-FIST INDEX THUMB CURLICUE +1D8E8 SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE +1D8E9 SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE +1D8EA SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER +1D8EB SIGNWRITING HAND-FIST INDEX THUMB CIRCLE +1D8EC SIGNWRITING HAND-CUP INDEX THUMB +1D8ED SIGNWRITING HAND-CUP INDEX THUMB OPEN +1D8EE SIGNWRITING HAND-HINGE INDEX THUMB OPEN +1D8EF SIGNWRITING HAND-HINGE INDEX THUMB LARGE +1D8F0 SIGNWRITING HAND-HINGE INDEX THUMB +1D8F1 SIGNWRITING HAND-HINGE INDEX THUMB SMALL +1D8F2 SIGNWRITING HAND-ANGLE INDEX THUMB OUT +1D8F3 SIGNWRITING HAND-ANGLE INDEX THUMB IN +1D8F4 SIGNWRITING HAND-ANGLE INDEX THUMB +1D8F5 SIGNWRITING HAND-FIST THUMB +1D8F6 SIGNWRITING HAND-FIST THUMB HEEL +1D8F7 SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL +1D8F8 SIGNWRITING HAND-FIST THUMB SIDE CONJOINED +1D8F9 SIGNWRITING HAND-FIST THUMB SIDE BENT +1D8FA SIGNWRITING HAND-FIST THUMB FORWARD +1D8FB SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE +1D8FC SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING +1D8FD SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE +1D8FE SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS +1D8FF SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS +1D900 SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS +1D901 SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS +1D902 SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES +1D903 SIGNWRITING HAND-FIST +1D904 SIGNWRITING HAND-FIST HEEL +1D905 SIGNWRITING TOUCH SINGLE +1D906 SIGNWRITING TOUCH MULTIPLE +1D907 SIGNWRITING TOUCH BETWEEN +1D908 SIGNWRITING GRASP SINGLE +1D909 SIGNWRITING GRASP MULTIPLE +1D90A SIGNWRITING GRASP BETWEEN +1D90B SIGNWRITING STRIKE SINGLE +1D90C SIGNWRITING STRIKE MULTIPLE +1D90D SIGNWRITING STRIKE BETWEEN +1D90E SIGNWRITING BRUSH SINGLE +1D90F SIGNWRITING BRUSH MULTIPLE +1D910 SIGNWRITING BRUSH BETWEEN +1D911 SIGNWRITING RUB SINGLE +1D912 SIGNWRITING RUB MULTIPLE +1D913 SIGNWRITING RUB BETWEEN +1D914 SIGNWRITING SURFACE SYMBOLS +1D915 SIGNWRITING SURFACE BETWEEN +1D916 SIGNWRITING SQUEEZE LARGE SINGLE +1D917 SIGNWRITING SQUEEZE SMALL SINGLE +1D918 SIGNWRITING SQUEEZE LARGE MULTIPLE +1D919 SIGNWRITING SQUEEZE SMALL MULTIPLE +1D91A SIGNWRITING SQUEEZE SEQUENTIAL +1D91B SIGNWRITING FLICK LARGE SINGLE +1D91C SIGNWRITING FLICK SMALL SINGLE +1D91D SIGNWRITING FLICK LARGE MULTIPLE +1D91E SIGNWRITING FLICK SMALL MULTIPLE +1D91F SIGNWRITING FLICK SEQUENTIAL +1D920 SIGNWRITING SQUEEZE FLICK ALTERNATING +1D921 SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE +1D922 SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL +1D923 SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL +1D924 SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL +1D925 SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE +1D926 SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL +1D927 SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS +1D928 SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT +1D929 SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT +1D92A SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL +1D92B SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM +1D92C SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE +1D92D SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST +1D92E SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX +1D92F SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT +1D930 SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX +1D931 SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING +1D932 SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX +1D933 SIGNWRITING MOVEMENT-WALLPLANE CROSS +1D934 SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT +1D935 SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX +1D936 SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING +1D937 SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX +1D938 SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL +1D939 SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM +1D93A SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE +1D93B SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL +1D93C SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM +1D93D SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE +1D93E SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION +1D93F SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL +1D940 SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM +1D941 SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE +1D942 SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL +1D943 SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM +1D944 SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE +1D945 SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL +1D946 SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM +1D947 SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE +1D948 SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL +1D949 SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM +1D94A SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE +1D94B SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE +1D94C SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE +1D94D SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING +1D94E SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE +1D94F SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE +1D950 SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING +1D951 SIGNWRITING TRAVEL-WALLPLANE SHAKING +1D952 SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE +1D953 SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE +1D954 SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE +1D955 SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL +1D956 SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM +1D957 SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE +1D958 SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST +1D959 SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL +1D95A SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM +1D95B SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE +1D95C SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST +1D95D SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL +1D95E SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM +1D95F SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE +1D960 SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST +1D961 SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL +1D962 SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM +1D963 SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE +1D964 SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST +1D965 SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL +1D966 SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM +1D967 SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE +1D968 SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST +1D969 SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX +1D96A SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT +1D96B SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX +1D96C SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING +1D96D SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX +1D96E SIGNWRITING MOVEMENT-FLOORPLANE CROSS +1D96F SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT +1D970 SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX +1D971 SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT +1D972 SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX +1D973 SIGNWRITING MOVEMENT-FLOORPLANE BEND +1D974 SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL +1D975 SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM +1D976 SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE +1D977 SIGNWRITING MOVEMENT-FLOORPLANE CHECK +1D978 SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL +1D979 SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM +1D97A SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE +1D97B SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL +1D97C SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM +1D97D SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE +1D97E SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL +1D97F SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM +1D980 SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE +1D981 SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE +1D982 SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE +1D983 SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING +1D984 SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE +1D985 SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE +1D986 SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING +1D987 SIGNWRITING TRAVEL-FLOORPLANE SHAKING +1D988 SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL +1D989 SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM +1D98A SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE +1D98B SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST +1D98C SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL +1D98D SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM +1D98E SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE +1D98F SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST +1D990 SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL +1D991 SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM +1D992 SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL +1D993 SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM +1D994 SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE +1D995 SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL +1D996 SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM +1D997 SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE +1D998 SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE +1D999 SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL +1D99A SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM +1D99B SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE +1D99C SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL +1D99D SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM +1D99E SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE +1D99F SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT +1D9A0 SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL +1D9A1 SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM +1D9A2 SIGNWRITING ROTATION-WALLPLANE SINGLE +1D9A3 SIGNWRITING ROTATION-WALLPLANE DOUBLE +1D9A4 SIGNWRITING ROTATION-WALLPLANE ALTERNATE +1D9A5 SIGNWRITING MOVEMENT-WALLPLANE SHAKING +1D9A6 SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL +1D9A7 SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL +1D9A8 SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL +1D9A9 SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL +1D9AA SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL +1D9AB SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL +1D9AC SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL +1D9AD SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST +1D9AE SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST +1D9AF SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST +1D9B0 SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST +1D9B1 SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST +1D9B2 SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST +1D9B3 SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST +1D9B4 SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL +1D9B5 SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM +1D9B6 SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE +1D9B7 SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL +1D9B8 SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE +1D9B9 SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE +1D9BA SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE +1D9BB SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE +1D9BC SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE +1D9BD SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE +1D9BE SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE +1D9BF SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE +1D9C0 SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE +1D9C1 SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL +1D9C2 SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE +1D9C3 SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING +1D9C4 SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING +1D9C5 SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING +1D9C6 SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL +1D9C7 SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE +1D9C8 SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE +1D9C9 SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE +1D9CA SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE +1D9CB SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE +1D9CC SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE +1D9CD SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE +1D9CE SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE +1D9CF SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE +1D9D0 SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL +1D9D1 SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE +1D9D2 SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR +1D9D3 SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR +1D9D4 SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR +1D9D5 SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL +1D9D6 SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM +1D9D7 SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE +1D9D8 SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST +1D9D9 SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED +1D9DA SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL +1D9DB SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL +1D9DC SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE +1D9DD SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL +1D9DE SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE +1D9DF SIGNWRITING ROTATION-FLOORPLANE SINGLE +1D9E0 SIGNWRITING ROTATION-FLOORPLANE DOUBLE +1D9E1 SIGNWRITING ROTATION-FLOORPLANE ALTERNATING +1D9E2 SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL +1D9E3 SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE +1D9E4 SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE +1D9E5 SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE +1D9E6 SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE +1D9E7 SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE +1D9E8 SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE +1D9E9 SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE +1D9EA SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE +1D9EB SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE +1D9EC SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE +1D9ED SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE +1D9EE SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE +1D9EF SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE +1D9F0 SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE +1D9F1 SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE +1D9F2 SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE +1D9F3 SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE +1D9F4 SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE +1D9F5 SIGNWRITING DYNAMIC ARROWHEAD SMALL +1D9F6 SIGNWRITING DYNAMIC ARROWHEAD LARGE +1D9F7 SIGNWRITING DYNAMIC FAST +1D9F8 SIGNWRITING DYNAMIC SLOW +1D9F9 SIGNWRITING DYNAMIC TENSE +1D9FA SIGNWRITING DYNAMIC RELAXED +1D9FB SIGNWRITING DYNAMIC SIMULTANEOUS +1D9FC SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING +1D9FD SIGNWRITING DYNAMIC EVERY OTHER TIME +1D9FE SIGNWRITING DYNAMIC GRADUAL +1D9FF SIGNWRITING HEAD +1DA00 SIGNWRITING HEAD RIM +1DA01 SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT +1DA02 SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT +1DA03 SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT +1DA04 SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE +1DA05 SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE +1DA06 SIGNWRITING HEAD MOVEMENT CIRCLE +1DA07 SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING +1DA08 SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN +1DA09 SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING +1DA0A SIGNWRITING EYEBROWS STRAIGHT UP +1DA0B SIGNWRITING EYEBROWS STRAIGHT NEUTRAL +1DA0C SIGNWRITING EYEBROWS STRAIGHT DOWN +1DA0D SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN +1DA0E SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL +1DA0F SIGNWRITING DREAMY EYEBROWS UP NEUTRAL +1DA10 SIGNWRITING DREAMY EYEBROWS NEUTRAL UP +1DA11 SIGNWRITING FOREHEAD NEUTRAL +1DA12 SIGNWRITING FOREHEAD CONTACT +1DA13 SIGNWRITING FOREHEAD WRINKLED +1DA14 SIGNWRITING EYES OPEN +1DA15 SIGNWRITING EYES SQUEEZED +1DA16 SIGNWRITING EYES CLOSED +1DA17 SIGNWRITING EYE BLINK SINGLE +1DA18 SIGNWRITING EYE BLINK MULTIPLE +1DA19 SIGNWRITING EYES HALF OPEN +1DA1A SIGNWRITING EYES WIDE OPEN +1DA1B SIGNWRITING EYES HALF CLOSED +1DA1C SIGNWRITING EYES WIDENING MOVEMENT +1DA1D SIGNWRITING EYE WINK +1DA1E SIGNWRITING EYELASHES UP +1DA1F SIGNWRITING EYELASHES DOWN +1DA20 SIGNWRITING EYELASHES FLUTTERING +1DA21 SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT +1DA22 SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE +1DA23 SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING +1DA24 SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT +1DA25 SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE +1DA26 SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING +1DA27 SIGNWRITING EYEGAZE-WALLPLANE CURVED +1DA28 SIGNWRITING EYEGAZE-FLOORPLANE CURVED +1DA29 SIGNWRITING EYEGAZE-WALLPLANE CIRCLING +1DA2A SIGNWRITING CHEEKS PUFFED +1DA2B SIGNWRITING CHEEKS NEUTRAL +1DA2C SIGNWRITING CHEEKS SUCKED +1DA2D SIGNWRITING TENSE CHEEKS HIGH +1DA2E SIGNWRITING TENSE CHEEKS MIDDLE +1DA2F SIGNWRITING TENSE CHEEKS LOW +1DA30 SIGNWRITING EARS +1DA31 SIGNWRITING NOSE NEUTRAL +1DA32 SIGNWRITING NOSE CONTACT +1DA33 SIGNWRITING NOSE WRINKLES +1DA34 SIGNWRITING NOSE WIGGLES +1DA35 SIGNWRITING AIR BLOWING OUT +1DA36 SIGNWRITING AIR SUCKING IN +1DA37 SIGNWRITING AIR BLOW SMALL ROTATIONS +1DA38 SIGNWRITING AIR SUCK SMALL ROTATIONS +1DA39 SIGNWRITING BREATH INHALE +1DA3A SIGNWRITING BREATH EXHALE +1DA3B SIGNWRITING MOUTH CLOSED NEUTRAL +1DA3C SIGNWRITING MOUTH CLOSED FORWARD +1DA3D SIGNWRITING MOUTH CLOSED CONTACT +1DA3E SIGNWRITING MOUTH SMILE +1DA3F SIGNWRITING MOUTH SMILE WRINKLED +1DA40 SIGNWRITING MOUTH SMILE OPEN +1DA41 SIGNWRITING MOUTH FROWN +1DA42 SIGNWRITING MOUTH FROWN WRINKLED +1DA43 SIGNWRITING MOUTH FROWN OPEN +1DA44 SIGNWRITING MOUTH OPEN CIRCLE +1DA45 SIGNWRITING MOUTH OPEN FORWARD +1DA46 SIGNWRITING MOUTH OPEN WRINKLED +1DA47 SIGNWRITING MOUTH OPEN OVAL +1DA48 SIGNWRITING MOUTH OPEN OVAL WRINKLED +1DA49 SIGNWRITING MOUTH OPEN OVAL YAWN +1DA4A SIGNWRITING MOUTH OPEN RECTANGLE +1DA4B SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED +1DA4C SIGNWRITING MOUTH OPEN RECTANGLE YAWN +1DA4D SIGNWRITING MOUTH KISS +1DA4E SIGNWRITING MOUTH KISS FORWARD +1DA4F SIGNWRITING MOUTH KISS WRINKLED +1DA50 SIGNWRITING MOUTH TENSE +1DA51 SIGNWRITING MOUTH TENSE FORWARD +1DA52 SIGNWRITING MOUTH TENSE SUCKED +1DA53 SIGNWRITING LIPS PRESSED TOGETHER +1DA54 SIGNWRITING LIP LOWER OVER UPPER +1DA55 SIGNWRITING LIP UPPER OVER LOWER +1DA56 SIGNWRITING MOUTH CORNERS +1DA57 SIGNWRITING MOUTH WRINKLES SINGLE +1DA58 SIGNWRITING MOUTH WRINKLES DOUBLE +1DA59 SIGNWRITING TONGUE STICKING OUT FAR +1DA5A SIGNWRITING TONGUE LICKING LIPS +1DA5B SIGNWRITING TONGUE TIP BETWEEN LIPS +1DA5C SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH +1DA5D SIGNWRITING TONGUE INSIDE MOUTH RELAXED +1DA5E SIGNWRITING TONGUE MOVES AGAINST CHEEK +1DA5F SIGNWRITING TONGUE CENTRE STICKING OUT +1DA60 SIGNWRITING TONGUE CENTRE INSIDE MOUTH +1DA61 SIGNWRITING TEETH +1DA62 SIGNWRITING TEETH MOVEMENT +1DA63 SIGNWRITING TEETH ON TONGUE +1DA64 SIGNWRITING TEETH ON TONGUE MOVEMENT +1DA65 SIGNWRITING TEETH ON LIPS +1DA66 SIGNWRITING TEETH ON LIPS MOVEMENT +1DA67 SIGNWRITING TEETH BITE LIPS +1DA68 SIGNWRITING MOVEMENT-WALLPLANE JAW +1DA69 SIGNWRITING MOVEMENT-FLOORPLANE JAW +1DA6A SIGNWRITING NECK +1DA6B SIGNWRITING HAIR +1DA6C SIGNWRITING EXCITEMENT +1DA6D SIGNWRITING SHOULDER HIP SPINE +1DA6E SIGNWRITING SHOULDER HIP POSITIONS +1DA6F SIGNWRITING WALLPLANE SHOULDER HIP MOVE +1DA70 SIGNWRITING FLOORPLANE SHOULDER HIP MOVE +1DA71 SIGNWRITING SHOULDER TILTING FROM WAIST +1DA72 SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH +1DA73 SIGNWRITING TORSO-WALLPLANE CURVED BEND +1DA74 SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76 SIGNWRITING LIMB COMBINATION +1DA77 SIGNWRITING LIMB LENGTH-1 +1DA78 SIGNWRITING LIMB LENGTH-2 +1DA79 SIGNWRITING LIMB LENGTH-3 +1DA7A SIGNWRITING LIMB LENGTH-4 +1DA7B SIGNWRITING LIMB LENGTH-5 +1DA7C SIGNWRITING LIMB LENGTH-6 +1DA7D SIGNWRITING LIMB LENGTH-7 +1DA7E SIGNWRITING FINGER +1DA7F SIGNWRITING LOCATION-WALLPLANE SPACE +1DA80 SIGNWRITING LOCATION-FLOORPLANE SPACE +1DA81 SIGNWRITING LOCATION HEIGHT +1DA82 SIGNWRITING LOCATION WIDTH +1DA83 SIGNWRITING LOCATION DEPTH +1DA84 SIGNWRITING LOCATION HEAD NECK +1DA85 SIGNWRITING LOCATION TORSO +1DA86 SIGNWRITING LOCATION LIMBS DIGITS +1DA87 SIGNWRITING COMMA +1DA88 SIGNWRITING FULL STOP +1DA89 SIGNWRITING SEMICOLON +1DA8A SIGNWRITING COLON +1DA8B SIGNWRITING PARENTHESIS +1DA9B SIGNWRITING FILL MODIFIER-2 +1DA9C SIGNWRITING FILL MODIFIER-3 +1DA9D SIGNWRITING FILL MODIFIER-4 +1DA9E SIGNWRITING FILL MODIFIER-5 +1DA9F SIGNWRITING FILL MODIFIER-6 +1DAA1 SIGNWRITING ROTATION MODIFIER-2 +1DAA2 SIGNWRITING ROTATION MODIFIER-3 +1DAA3 SIGNWRITING ROTATION MODIFIER-4 +1DAA4 SIGNWRITING ROTATION MODIFIER-5 +1DAA5 SIGNWRITING ROTATION MODIFIER-6 +1DAA6 SIGNWRITING ROTATION MODIFIER-7 +1DAA7 SIGNWRITING ROTATION MODIFIER-8 +1DAA8 SIGNWRITING ROTATION MODIFIER-9 +1DAA9 SIGNWRITING ROTATION MODIFIER-10 +1DAAA SIGNWRITING ROTATION MODIFIER-11 +1DAAB SIGNWRITING ROTATION MODIFIER-12 +1DAAC SIGNWRITING ROTATION MODIFIER-13 +1DAAD SIGNWRITING ROTATION MODIFIER-14 +1DAAE SIGNWRITING ROTATION MODIFIER-15 +1DAAF SIGNWRITING ROTATION MODIFIER-16 +1E000 COMBINING GLAGOLITIC LETTER AZU +1E001 COMBINING GLAGOLITIC LETTER BUKY +1E002 COMBINING GLAGOLITIC LETTER VEDE +1E003 COMBINING GLAGOLITIC LETTER GLAGOLI +1E004 COMBINING GLAGOLITIC LETTER DOBRO +1E005 COMBINING GLAGOLITIC LETTER YESTU +1E006 COMBINING GLAGOLITIC LETTER ZHIVETE +1E008 COMBINING GLAGOLITIC LETTER ZEMLJA +1E009 COMBINING GLAGOLITIC LETTER IZHE +1E00A COMBINING GLAGOLITIC LETTER INITIAL IZHE +1E00B COMBINING GLAGOLITIC LETTER I +1E00C COMBINING GLAGOLITIC LETTER DJERVI +1E00D COMBINING GLAGOLITIC LETTER KAKO +1E00E COMBINING GLAGOLITIC LETTER LJUDIJE +1E00F COMBINING GLAGOLITIC LETTER MYSLITE +1E010 COMBINING GLAGOLITIC LETTER NASHI +1E011 COMBINING GLAGOLITIC LETTER ONU +1E012 COMBINING GLAGOLITIC LETTER POKOJI +1E013 COMBINING GLAGOLITIC LETTER RITSI +1E014 COMBINING GLAGOLITIC LETTER SLOVO +1E015 COMBINING GLAGOLITIC LETTER TVRIDO +1E016 COMBINING GLAGOLITIC LETTER UKU +1E017 COMBINING GLAGOLITIC LETTER FRITU +1E018 COMBINING GLAGOLITIC LETTER HERU +1E01B COMBINING GLAGOLITIC LETTER SHTA +1E01C COMBINING GLAGOLITIC LETTER TSI +1E01D COMBINING GLAGOLITIC LETTER CHRIVI +1E01E COMBINING GLAGOLITIC LETTER SHA +1E01F COMBINING GLAGOLITIC LETTER YERU +1E020 COMBINING GLAGOLITIC LETTER YERI +1E021 COMBINING GLAGOLITIC LETTER YATI +1E023 COMBINING GLAGOLITIC LETTER YU +1E024 COMBINING GLAGOLITIC LETTER SMALL YUS +1E026 COMBINING GLAGOLITIC LETTER YO +1E027 COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS +1E028 COMBINING GLAGOLITIC LETTER BIG YUS +1E029 COMBINING GLAGOLITIC LETTER IOTATED BIG YUS +1E02A COMBINING GLAGOLITIC LETTER FITA +1E800 MENDE KIKAKUI SYLLABLE M001 KI +1E801 MENDE KIKAKUI SYLLABLE M002 KA +1E802 MENDE KIKAKUI SYLLABLE M003 KU +1E803 MENDE KIKAKUI SYLLABLE M065 KEE +1E804 MENDE KIKAKUI SYLLABLE M095 KE +1E805 MENDE KIKAKUI SYLLABLE M076 KOO +1E806 MENDE KIKAKUI SYLLABLE M048 KO +1E807 MENDE KIKAKUI SYLLABLE M179 KUA +1E808 MENDE KIKAKUI SYLLABLE M004 WI +1E809 MENDE KIKAKUI SYLLABLE M005 WA +1E80A MENDE KIKAKUI SYLLABLE M006 WU +1E80B MENDE KIKAKUI SYLLABLE M126 WEE +1E80C MENDE KIKAKUI SYLLABLE M118 WE +1E80D MENDE KIKAKUI SYLLABLE M114 WOO +1E80E MENDE KIKAKUI SYLLABLE M045 WO +1E80F MENDE KIKAKUI SYLLABLE M194 WUI +1E810 MENDE KIKAKUI SYLLABLE M143 WEI +1E811 MENDE KIKAKUI SYLLABLE M061 WVI +1E812 MENDE KIKAKUI SYLLABLE M049 WVA +1E813 MENDE KIKAKUI SYLLABLE M139 WVE +1E814 MENDE KIKAKUI SYLLABLE M007 MIN +1E815 MENDE KIKAKUI SYLLABLE M008 MAN +1E816 MENDE KIKAKUI SYLLABLE M009 MUN +1E817 MENDE KIKAKUI SYLLABLE M059 MEN +1E818 MENDE KIKAKUI SYLLABLE M094 MON +1E819 MENDE KIKAKUI SYLLABLE M154 MUAN +1E81A MENDE KIKAKUI SYLLABLE M189 MUEN +1E81B MENDE KIKAKUI SYLLABLE M010 BI +1E81C MENDE KIKAKUI SYLLABLE M011 BA +1E81D MENDE KIKAKUI SYLLABLE M012 BU +1E81E MENDE KIKAKUI SYLLABLE M150 BEE +1E81F MENDE KIKAKUI SYLLABLE M097 BE +1E820 MENDE KIKAKUI SYLLABLE M103 BOO +1E821 MENDE KIKAKUI SYLLABLE M138 BO +1E822 MENDE KIKAKUI SYLLABLE M013 I +1E823 MENDE KIKAKUI SYLLABLE M014 A +1E824 MENDE KIKAKUI SYLLABLE M015 U +1E825 MENDE KIKAKUI SYLLABLE M163 EE +1E826 MENDE KIKAKUI SYLLABLE M100 E +1E827 MENDE KIKAKUI SYLLABLE M165 OO +1E828 MENDE KIKAKUI SYLLABLE M147 O +1E829 MENDE KIKAKUI SYLLABLE M137 EI +1E82A MENDE KIKAKUI SYLLABLE M131 IN +1E82B MENDE KIKAKUI SYLLABLE M135 IN +1E82C MENDE KIKAKUI SYLLABLE M195 AN +1E82D MENDE KIKAKUI SYLLABLE M178 EN +1E82E MENDE KIKAKUI SYLLABLE M019 SI +1E82F MENDE KIKAKUI SYLLABLE M020 SA +1E830 MENDE KIKAKUI SYLLABLE M021 SU +1E831 MENDE KIKAKUI SYLLABLE M162 SEE +1E832 MENDE KIKAKUI SYLLABLE M116 SE +1E833 MENDE KIKAKUI SYLLABLE M136 SOO +1E834 MENDE KIKAKUI SYLLABLE M079 SO +1E835 MENDE KIKAKUI SYLLABLE M196 SIA +1E836 MENDE KIKAKUI SYLLABLE M025 LI +1E837 MENDE KIKAKUI SYLLABLE M026 LA +1E838 MENDE KIKAKUI SYLLABLE M027 LU +1E839 MENDE KIKAKUI SYLLABLE M084 LEE +1E83A MENDE KIKAKUI SYLLABLE M073 LE +1E83B MENDE KIKAKUI SYLLABLE M054 LOO +1E83C MENDE KIKAKUI SYLLABLE M153 LO +1E83D MENDE KIKAKUI SYLLABLE M110 LONG LE +1E83E MENDE KIKAKUI SYLLABLE M016 DI +1E83F MENDE KIKAKUI SYLLABLE M017 DA +1E840 MENDE KIKAKUI SYLLABLE M018 DU +1E841 MENDE KIKAKUI SYLLABLE M089 DEE +1E842 MENDE KIKAKUI SYLLABLE M180 DOO +1E843 MENDE KIKAKUI SYLLABLE M181 DO +1E844 MENDE KIKAKUI SYLLABLE M022 TI +1E845 MENDE KIKAKUI SYLLABLE M023 TA +1E846 MENDE KIKAKUI SYLLABLE M024 TU +1E847 MENDE KIKAKUI SYLLABLE M091 TEE +1E848 MENDE KIKAKUI SYLLABLE M055 TE +1E849 MENDE KIKAKUI SYLLABLE M104 TOO +1E84A MENDE KIKAKUI SYLLABLE M069 TO +1E84B MENDE KIKAKUI SYLLABLE M028 JI +1E84C MENDE KIKAKUI SYLLABLE M029 JA +1E84D MENDE KIKAKUI SYLLABLE M030 JU +1E84E MENDE KIKAKUI SYLLABLE M157 JEE +1E84F MENDE KIKAKUI SYLLABLE M113 JE +1E850 MENDE KIKAKUI SYLLABLE M160 JOO +1E851 MENDE KIKAKUI SYLLABLE M063 JO +1E852 MENDE KIKAKUI SYLLABLE M175 LONG JO +1E853 MENDE KIKAKUI SYLLABLE M031 YI +1E854 MENDE KIKAKUI SYLLABLE M032 YA +1E855 MENDE KIKAKUI SYLLABLE M033 YU +1E856 MENDE KIKAKUI SYLLABLE M109 YEE +1E857 MENDE KIKAKUI SYLLABLE M080 YE +1E858 MENDE KIKAKUI SYLLABLE M141 YOO +1E859 MENDE KIKAKUI SYLLABLE M121 YO +1E85A MENDE KIKAKUI SYLLABLE M034 FI +1E85B MENDE KIKAKUI SYLLABLE M035 FA +1E85C MENDE KIKAKUI SYLLABLE M036 FU +1E85D MENDE KIKAKUI SYLLABLE M078 FEE +1E85E MENDE KIKAKUI SYLLABLE M075 FE +1E85F MENDE KIKAKUI SYLLABLE M133 FOO +1E860 MENDE KIKAKUI SYLLABLE M088 FO +1E861 MENDE KIKAKUI SYLLABLE M197 FUA +1E862 MENDE KIKAKUI SYLLABLE M101 FAN +1E863 MENDE KIKAKUI SYLLABLE M037 NIN +1E864 MENDE KIKAKUI SYLLABLE M038 NAN +1E865 MENDE KIKAKUI SYLLABLE M039 NUN +1E866 MENDE KIKAKUI SYLLABLE M117 NEN +1E867 MENDE KIKAKUI SYLLABLE M169 NON +1E868 MENDE KIKAKUI SYLLABLE M176 HI +1E869 MENDE KIKAKUI SYLLABLE M041 HA +1E86A MENDE KIKAKUI SYLLABLE M186 HU +1E86B MENDE KIKAKUI SYLLABLE M040 HEE +1E86C MENDE KIKAKUI SYLLABLE M096 HE +1E86D MENDE KIKAKUI SYLLABLE M042 HOO +1E86E MENDE KIKAKUI SYLLABLE M140 HO +1E86F MENDE KIKAKUI SYLLABLE M083 HEEI +1E870 MENDE KIKAKUI SYLLABLE M128 HOOU +1E871 MENDE KIKAKUI SYLLABLE M053 HIN +1E872 MENDE KIKAKUI SYLLABLE M130 HAN +1E873 MENDE KIKAKUI SYLLABLE M087 HUN +1E874 MENDE KIKAKUI SYLLABLE M052 HEN +1E875 MENDE KIKAKUI SYLLABLE M193 HON +1E876 MENDE KIKAKUI SYLLABLE M046 HUAN +1E877 MENDE KIKAKUI SYLLABLE M090 NGGI +1E878 MENDE KIKAKUI SYLLABLE M043 NGGA +1E879 MENDE KIKAKUI SYLLABLE M082 NGGU +1E87A MENDE KIKAKUI SYLLABLE M115 NGGEE +1E87B MENDE KIKAKUI SYLLABLE M146 NGGE +1E87C MENDE KIKAKUI SYLLABLE M156 NGGOO +1E87D MENDE KIKAKUI SYLLABLE M120 NGGO +1E87E MENDE KIKAKUI SYLLABLE M159 NGGAA +1E87F MENDE KIKAKUI SYLLABLE M127 NGGUA +1E880 MENDE KIKAKUI SYLLABLE M086 LONG NGGE +1E881 MENDE KIKAKUI SYLLABLE M106 LONG NGGOO +1E882 MENDE KIKAKUI SYLLABLE M183 LONG NGGO +1E883 MENDE KIKAKUI SYLLABLE M155 GI +1E884 MENDE KIKAKUI SYLLABLE M111 GA +1E885 MENDE KIKAKUI SYLLABLE M168 GU +1E886 MENDE KIKAKUI SYLLABLE M190 GEE +1E887 MENDE KIKAKUI SYLLABLE M166 GUEI +1E888 MENDE KIKAKUI SYLLABLE M167 GUAN +1E889 MENDE KIKAKUI SYLLABLE M184 NGEN +1E88A MENDE KIKAKUI SYLLABLE M057 NGON +1E88B MENDE KIKAKUI SYLLABLE M177 NGUAN +1E88C MENDE KIKAKUI SYLLABLE M068 PI +1E88D MENDE KIKAKUI SYLLABLE M099 PA +1E88E MENDE KIKAKUI SYLLABLE M050 PU +1E88F MENDE KIKAKUI SYLLABLE M081 PEE +1E890 MENDE KIKAKUI SYLLABLE M051 PE +1E891 MENDE KIKAKUI SYLLABLE M102 POO +1E892 MENDE KIKAKUI SYLLABLE M066 PO +1E893 MENDE KIKAKUI SYLLABLE M145 MBI +1E894 MENDE KIKAKUI SYLLABLE M062 MBA +1E895 MENDE KIKAKUI SYLLABLE M122 MBU +1E896 MENDE KIKAKUI SYLLABLE M047 MBEE +1E897 MENDE KIKAKUI SYLLABLE M188 MBEE +1E898 MENDE KIKAKUI SYLLABLE M072 MBE +1E899 MENDE KIKAKUI SYLLABLE M172 MBOO +1E89A MENDE KIKAKUI SYLLABLE M174 MBO +1E89B MENDE KIKAKUI SYLLABLE M187 MBUU +1E89C MENDE KIKAKUI SYLLABLE M161 LONG MBE +1E89D MENDE KIKAKUI SYLLABLE M105 LONG MBOO +1E89E MENDE KIKAKUI SYLLABLE M142 LONG MBO +1E89F MENDE KIKAKUI SYLLABLE M132 KPI +1E8A0 MENDE KIKAKUI SYLLABLE M092 KPA +1E8A1 MENDE KIKAKUI SYLLABLE M074 KPU +1E8A2 MENDE KIKAKUI SYLLABLE M044 KPEE +1E8A3 MENDE KIKAKUI SYLLABLE M108 KPE +1E8A4 MENDE KIKAKUI SYLLABLE M112 KPOO +1E8A5 MENDE KIKAKUI SYLLABLE M158 KPO +1E8A6 MENDE KIKAKUI SYLLABLE M124 GBI +1E8A7 MENDE KIKAKUI SYLLABLE M056 GBA +1E8A8 MENDE KIKAKUI SYLLABLE M148 GBU +1E8A9 MENDE KIKAKUI SYLLABLE M093 GBEE +1E8AA MENDE KIKAKUI SYLLABLE M107 GBE +1E8AB MENDE KIKAKUI SYLLABLE M071 GBOO +1E8AC MENDE KIKAKUI SYLLABLE M070 GBO +1E8AD MENDE KIKAKUI SYLLABLE M171 RA +1E8AE MENDE KIKAKUI SYLLABLE M123 NDI +1E8AF MENDE KIKAKUI SYLLABLE M129 NDA +1E8B0 MENDE KIKAKUI SYLLABLE M125 NDU +1E8B1 MENDE KIKAKUI SYLLABLE M191 NDEE +1E8B2 MENDE KIKAKUI SYLLABLE M119 NDE +1E8B3 MENDE KIKAKUI SYLLABLE M067 NDOO +1E8B4 MENDE KIKAKUI SYLLABLE M064 NDO +1E8B5 MENDE KIKAKUI SYLLABLE M152 NJA +1E8B6 MENDE KIKAKUI SYLLABLE M192 NJU +1E8B7 MENDE KIKAKUI SYLLABLE M149 NJEE +1E8B8 MENDE KIKAKUI SYLLABLE M134 NJOO +1E8B9 MENDE KIKAKUI SYLLABLE M182 VI +1E8BA MENDE KIKAKUI SYLLABLE M185 VA +1E8BB MENDE KIKAKUI SYLLABLE M151 VU +1E8BC MENDE KIKAKUI SYLLABLE M173 VEE +1E8BD MENDE KIKAKUI SYLLABLE M085 VE +1E8BE MENDE KIKAKUI SYLLABLE M144 VOO +1E8BF MENDE KIKAKUI SYLLABLE M077 VO +1E8C0 MENDE KIKAKUI SYLLABLE M164 NYIN +1E8C1 MENDE KIKAKUI SYLLABLE M058 NYAN +1E8C2 MENDE KIKAKUI SYLLABLE M170 NYUN +1E8C3 MENDE KIKAKUI SYLLABLE M098 NYEN +1E8C4 MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7 MENDE KIKAKUI DIGIT ONE +1E8C8 MENDE KIKAKUI DIGIT TWO +1E8C9 MENDE KIKAKUI DIGIT THREE +1E8CA MENDE KIKAKUI DIGIT FOUR +1E8CB MENDE KIKAKUI DIGIT FIVE +1E8CC MENDE KIKAKUI DIGIT SIX +1E8CD MENDE KIKAKUI DIGIT SEVEN +1E8CE MENDE KIKAKUI DIGIT EIGHT +1E8CF MENDE KIKAKUI DIGIT NINE +1E8D0 MENDE KIKAKUI COMBINING NUMBER TEENS +1E8D1 MENDE KIKAKUI COMBINING NUMBER TENS +1E8D2 MENDE KIKAKUI COMBINING NUMBER HUNDREDS +1E8D3 MENDE KIKAKUI COMBINING NUMBER THOUSANDS +1E8D4 MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS +1E8D5 MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS +1E8D6 MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900 ADLAM CAPITAL LETTER ALIF +1E901 ADLAM CAPITAL LETTER DAALI +1E902 ADLAM CAPITAL LETTER LAAM +1E903 ADLAM CAPITAL LETTER MIIM +1E904 ADLAM CAPITAL LETTER BA +1E905 ADLAM CAPITAL LETTER SINNYIIYHE +1E906 ADLAM CAPITAL LETTER PE +1E907 ADLAM CAPITAL LETTER BHE +1E908 ADLAM CAPITAL LETTER RA +1E909 ADLAM CAPITAL LETTER E +1E90A ADLAM CAPITAL LETTER FA +1E90B ADLAM CAPITAL LETTER I +1E90C ADLAM CAPITAL LETTER O +1E90D ADLAM CAPITAL LETTER DHA +1E90E ADLAM CAPITAL LETTER YHE +1E90F ADLAM CAPITAL LETTER WAW +1E910 ADLAM CAPITAL LETTER NUN +1E911 ADLAM CAPITAL LETTER KAF +1E912 ADLAM CAPITAL LETTER YA +1E913 ADLAM CAPITAL LETTER U +1E914 ADLAM CAPITAL LETTER JIIM +1E915 ADLAM CAPITAL LETTER CHI +1E916 ADLAM CAPITAL LETTER HA +1E917 ADLAM CAPITAL LETTER QAAF +1E918 ADLAM CAPITAL LETTER GA +1E919 ADLAM CAPITAL LETTER NYA +1E91A ADLAM CAPITAL LETTER TU +1E91B ADLAM CAPITAL LETTER NHA +1E91C ADLAM CAPITAL LETTER VA +1E91D ADLAM CAPITAL LETTER KHA +1E91E ADLAM CAPITAL LETTER GBE +1E91F ADLAM CAPITAL LETTER ZAL +1E920 ADLAM CAPITAL LETTER KPO +1E921 ADLAM CAPITAL LETTER SHA +1E922 ADLAM SMALL LETTER ALIF +1E923 ADLAM SMALL LETTER DAALI +1E924 ADLAM SMALL LETTER LAAM +1E925 ADLAM SMALL LETTER MIIM +1E926 ADLAM SMALL LETTER BA +1E927 ADLAM SMALL LETTER SINNYIIYHE +1E928 ADLAM SMALL LETTER PE +1E929 ADLAM SMALL LETTER BHE +1E92A ADLAM SMALL LETTER RA +1E92B ADLAM SMALL LETTER E +1E92C ADLAM SMALL LETTER FA +1E92D ADLAM SMALL LETTER I +1E92E ADLAM SMALL LETTER O +1E92F ADLAM SMALL LETTER DHA +1E930 ADLAM SMALL LETTER YHE +1E931 ADLAM SMALL LETTER WAW +1E932 ADLAM SMALL LETTER NUN +1E933 ADLAM SMALL LETTER KAF +1E934 ADLAM SMALL LETTER YA +1E935 ADLAM SMALL LETTER U +1E936 ADLAM SMALL LETTER JIIM +1E937 ADLAM SMALL LETTER CHI +1E938 ADLAM SMALL LETTER HA +1E939 ADLAM SMALL LETTER QAAF +1E93A ADLAM SMALL LETTER GA +1E93B ADLAM SMALL LETTER NYA +1E93C ADLAM SMALL LETTER TU +1E93D ADLAM SMALL LETTER NHA +1E93E ADLAM SMALL LETTER VA +1E93F ADLAM SMALL LETTER KHA +1E940 ADLAM SMALL LETTER GBE +1E941 ADLAM SMALL LETTER ZAL +1E942 ADLAM SMALL LETTER KPO +1E943 ADLAM SMALL LETTER SHA +1E944 ADLAM ALIF LENGTHENER +1E945 ADLAM VOWEL LENGTHENER +1E946 ADLAM GEMINATION MARK +1E947 ADLAM HAMZA +1E948 ADLAM CONSONANT MODIFIER +1E949 ADLAM GEMINATE CONSONANT MODIFIER +1E94A ADLAM NUKTA +1E950 ADLAM DIGIT ZERO +1E951 ADLAM DIGIT ONE +1E952 ADLAM DIGIT TWO +1E953 ADLAM DIGIT THREE +1E954 ADLAM DIGIT FOUR +1E955 ADLAM DIGIT FIVE +1E956 ADLAM DIGIT SIX +1E957 ADLAM DIGIT SEVEN +1E958 ADLAM DIGIT EIGHT +1E959 ADLAM DIGIT NINE +1E95E ADLAM INITIAL EXCLAMATION MARK +1E95F ADLAM INITIAL QUESTION MARK +1EE00 ARABIC MATHEMATICAL ALEF +1EE01 ARABIC MATHEMATICAL BEH +1EE02 ARABIC MATHEMATICAL JEEM +1EE03 ARABIC MATHEMATICAL DAL +1EE05 ARABIC MATHEMATICAL WAW +1EE06 ARABIC MATHEMATICAL ZAIN +1EE07 ARABIC MATHEMATICAL HAH +1EE08 ARABIC MATHEMATICAL TAH +1EE09 ARABIC MATHEMATICAL YEH +1EE0A ARABIC MATHEMATICAL KAF +1EE0B ARABIC MATHEMATICAL LAM +1EE0C ARABIC MATHEMATICAL MEEM +1EE0D ARABIC MATHEMATICAL NOON +1EE0E ARABIC MATHEMATICAL SEEN +1EE0F ARABIC MATHEMATICAL AIN +1EE10 ARABIC MATHEMATICAL FEH +1EE11 ARABIC MATHEMATICAL SAD +1EE12 ARABIC MATHEMATICAL QAF +1EE13 ARABIC MATHEMATICAL REH +1EE14 ARABIC MATHEMATICAL SHEEN +1EE15 ARABIC MATHEMATICAL TEH +1EE16 ARABIC MATHEMATICAL THEH +1EE17 ARABIC MATHEMATICAL KHAH +1EE18 ARABIC MATHEMATICAL THAL +1EE19 ARABIC MATHEMATICAL DAD +1EE1A ARABIC MATHEMATICAL ZAH +1EE1B ARABIC MATHEMATICAL GHAIN +1EE1C ARABIC MATHEMATICAL DOTLESS BEH +1EE1D ARABIC MATHEMATICAL DOTLESS NOON +1EE1E ARABIC MATHEMATICAL DOTLESS FEH +1EE1F ARABIC MATHEMATICAL DOTLESS QAF +1EE21 ARABIC MATHEMATICAL INITIAL BEH +1EE22 ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ARABIC MATHEMATICAL INITIAL HEH +1EE27 ARABIC MATHEMATICAL INITIAL HAH +1EE29 ARABIC MATHEMATICAL INITIAL YEH +1EE2A ARABIC MATHEMATICAL INITIAL KAF +1EE2B ARABIC MATHEMATICAL INITIAL LAM +1EE2C ARABIC MATHEMATICAL INITIAL MEEM +1EE2D ARABIC MATHEMATICAL INITIAL NOON +1EE2E ARABIC MATHEMATICAL INITIAL SEEN +1EE2F ARABIC MATHEMATICAL INITIAL AIN +1EE30 ARABIC MATHEMATICAL INITIAL FEH +1EE31 ARABIC MATHEMATICAL INITIAL SAD +1EE32 ARABIC MATHEMATICAL INITIAL QAF +1EE34 ARABIC MATHEMATICAL INITIAL SHEEN +1EE35 ARABIC MATHEMATICAL INITIAL TEH +1EE36 ARABIC MATHEMATICAL INITIAL THEH +1EE37 ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ARABIC MATHEMATICAL INITIAL DAD +1EE3B ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ARABIC MATHEMATICAL TAILED JEEM +1EE47 ARABIC MATHEMATICAL TAILED HAH +1EE49 ARABIC MATHEMATICAL TAILED YEH +1EE4B ARABIC MATHEMATICAL TAILED LAM +1EE4D ARABIC MATHEMATICAL TAILED NOON +1EE4E ARABIC MATHEMATICAL TAILED SEEN +1EE4F ARABIC MATHEMATICAL TAILED AIN +1EE51 ARABIC MATHEMATICAL TAILED SAD +1EE52 ARABIC MATHEMATICAL TAILED QAF +1EE54 ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ARABIC MATHEMATICAL TAILED KHAH +1EE59 ARABIC MATHEMATICAL TAILED DAD +1EE5B ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61 ARABIC MATHEMATICAL STRETCHED BEH +1EE62 ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ARABIC MATHEMATICAL STRETCHED HEH +1EE67 ARABIC MATHEMATICAL STRETCHED HAH +1EE68 ARABIC MATHEMATICAL STRETCHED TAH +1EE69 ARABIC MATHEMATICAL STRETCHED YEH +1EE6A ARABIC MATHEMATICAL STRETCHED KAF +1EE6C ARABIC MATHEMATICAL STRETCHED MEEM +1EE6D ARABIC MATHEMATICAL STRETCHED NOON +1EE6E ARABIC MATHEMATICAL STRETCHED SEEN +1EE6F ARABIC MATHEMATICAL STRETCHED AIN +1EE70 ARABIC MATHEMATICAL STRETCHED FEH +1EE71 ARABIC MATHEMATICAL STRETCHED SAD +1EE72 ARABIC MATHEMATICAL STRETCHED QAF +1EE74 ARABIC MATHEMATICAL STRETCHED SHEEN +1EE75 ARABIC MATHEMATICAL STRETCHED TEH +1EE76 ARABIC MATHEMATICAL STRETCHED THEH +1EE77 ARABIC MATHEMATICAL STRETCHED KHAH +1EE79 ARABIC MATHEMATICAL STRETCHED DAD +1EE7A ARABIC MATHEMATICAL STRETCHED ZAH +1EE7B ARABIC MATHEMATICAL STRETCHED GHAIN +1EE7C ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80 ARABIC MATHEMATICAL LOOPED ALEF +1EE81 ARABIC MATHEMATICAL LOOPED BEH +1EE82 ARABIC MATHEMATICAL LOOPED JEEM +1EE83 ARABIC MATHEMATICAL LOOPED DAL +1EE84 ARABIC MATHEMATICAL LOOPED HEH +1EE85 ARABIC MATHEMATICAL LOOPED WAW +1EE86 ARABIC MATHEMATICAL LOOPED ZAIN +1EE87 ARABIC MATHEMATICAL LOOPED HAH +1EE88 ARABIC MATHEMATICAL LOOPED TAH +1EE89 ARABIC MATHEMATICAL LOOPED YEH +1EE8B ARABIC MATHEMATICAL LOOPED LAM +1EE8C ARABIC MATHEMATICAL LOOPED MEEM +1EE8D ARABIC MATHEMATICAL LOOPED NOON +1EE8E ARABIC MATHEMATICAL LOOPED SEEN +1EE8F ARABIC MATHEMATICAL LOOPED AIN +1EE90 ARABIC MATHEMATICAL LOOPED FEH +1EE91 ARABIC MATHEMATICAL LOOPED SAD +1EE92 ARABIC MATHEMATICAL LOOPED QAF +1EE93 ARABIC MATHEMATICAL LOOPED REH +1EE94 ARABIC MATHEMATICAL LOOPED SHEEN +1EE95 ARABIC MATHEMATICAL LOOPED TEH +1EE96 ARABIC MATHEMATICAL LOOPED THEH +1EE97 ARABIC MATHEMATICAL LOOPED KHAH +1EE98 ARABIC MATHEMATICAL LOOPED THAL +1EE99 ARABIC MATHEMATICAL LOOPED DAD +1EE9A ARABIC MATHEMATICAL LOOPED ZAH +1EE9B ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1 ARABIC MATHEMATICAL DOUBLE-STRUCK BEH +1EEA2 ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM +1EEA3 ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5 ARABIC MATHEMATICAL DOUBLE-STRUCK WAW +1EEA6 ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN +1EEA7 ARABIC MATHEMATICAL DOUBLE-STRUCK HAH +1EEA8 ARABIC MATHEMATICAL DOUBLE-STRUCK TAH +1EEA9 ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB ARABIC MATHEMATICAL DOUBLE-STRUCK LAM +1EEAC ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM +1EEAD ARABIC MATHEMATICAL DOUBLE-STRUCK NOON +1EEAE ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN +1EEAF ARABIC MATHEMATICAL DOUBLE-STRUCK AIN +1EEB0 ARABIC MATHEMATICAL DOUBLE-STRUCK FEH +1EEB1 ARABIC MATHEMATICAL DOUBLE-STRUCK SAD +1EEB2 ARABIC MATHEMATICAL DOUBLE-STRUCK QAF +1EEB3 ARABIC MATHEMATICAL DOUBLE-STRUCK REH +1EEB4 ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN +1EEB5 ARABIC MATHEMATICAL DOUBLE-STRUCK TEH +1EEB6 ARABIC MATHEMATICAL DOUBLE-STRUCK THEH +1EEB7 ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH +1EEB8 ARABIC MATHEMATICAL DOUBLE-STRUCK THAL +1EEB9 ARABIC MATHEMATICAL DOUBLE-STRUCK DAD +1EEBA ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH +1EEBB ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0 ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL +1EEF1 ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000 MAHJONG TILE EAST WIND +1F001 MAHJONG TILE SOUTH WIND +1F002 MAHJONG TILE WEST WIND +1F003 MAHJONG TILE NORTH WIND +1F004 MAHJONG TILE RED DRAGON +1F005 MAHJONG TILE GREEN DRAGON +1F006 MAHJONG TILE WHITE DRAGON +1F007 MAHJONG TILE ONE OF CHARACTERS +1F008 MAHJONG TILE TWO OF CHARACTERS +1F009 MAHJONG TILE THREE OF CHARACTERS +1F00A MAHJONG TILE FOUR OF CHARACTERS +1F00B MAHJONG TILE FIVE OF CHARACTERS +1F00C MAHJONG TILE SIX OF CHARACTERS +1F00D MAHJONG TILE SEVEN OF CHARACTERS +1F00E MAHJONG TILE EIGHT OF CHARACTERS +1F00F MAHJONG TILE NINE OF CHARACTERS +1F010 MAHJONG TILE ONE OF BAMBOOS +1F011 MAHJONG TILE TWO OF BAMBOOS +1F012 MAHJONG TILE THREE OF BAMBOOS +1F013 MAHJONG TILE FOUR OF BAMBOOS +1F014 MAHJONG TILE FIVE OF BAMBOOS +1F015 MAHJONG TILE SIX OF BAMBOOS +1F016 MAHJONG TILE SEVEN OF BAMBOOS +1F017 MAHJONG TILE EIGHT OF BAMBOOS +1F018 MAHJONG TILE NINE OF BAMBOOS +1F019 MAHJONG TILE ONE OF CIRCLES +1F01A MAHJONG TILE TWO OF CIRCLES +1F01B MAHJONG TILE THREE OF CIRCLES +1F01C MAHJONG TILE FOUR OF CIRCLES +1F01D MAHJONG TILE FIVE OF CIRCLES +1F01E MAHJONG TILE SIX OF CIRCLES +1F01F MAHJONG TILE SEVEN OF CIRCLES +1F020 MAHJONG TILE EIGHT OF CIRCLES +1F021 MAHJONG TILE NINE OF CIRCLES +1F022 MAHJONG TILE PLUM +1F023 MAHJONG TILE ORCHID +1F024 MAHJONG TILE BAMBOO +1F025 MAHJONG TILE CHRYSANTHEMUM +1F026 MAHJONG TILE SPRING +1F027 MAHJONG TILE SUMMER +1F028 MAHJONG TILE AUTUMN +1F029 MAHJONG TILE WINTER +1F02A MAHJONG TILE JOKER +1F02B MAHJONG TILE BACK +1F030 DOMINO TILE HORIZONTAL BACK +1F031 DOMINO TILE HORIZONTAL-00-00 +1F032 DOMINO TILE HORIZONTAL-00-01 +1F033 DOMINO TILE HORIZONTAL-00-02 +1F034 DOMINO TILE HORIZONTAL-00-03 +1F035 DOMINO TILE HORIZONTAL-00-04 +1F036 DOMINO TILE HORIZONTAL-00-05 +1F037 DOMINO TILE HORIZONTAL-00-06 +1F038 DOMINO TILE HORIZONTAL-01-00 +1F039 DOMINO TILE HORIZONTAL-01-01 +1F03A DOMINO TILE HORIZONTAL-01-02 +1F03B DOMINO TILE HORIZONTAL-01-03 +1F03C DOMINO TILE HORIZONTAL-01-04 +1F03D DOMINO TILE HORIZONTAL-01-05 +1F03E DOMINO TILE HORIZONTAL-01-06 +1F03F DOMINO TILE HORIZONTAL-02-00 +1F040 DOMINO TILE HORIZONTAL-02-01 +1F041 DOMINO TILE HORIZONTAL-02-02 +1F042 DOMINO TILE HORIZONTAL-02-03 +1F043 DOMINO TILE HORIZONTAL-02-04 +1F044 DOMINO TILE HORIZONTAL-02-05 +1F045 DOMINO TILE HORIZONTAL-02-06 +1F046 DOMINO TILE HORIZONTAL-03-00 +1F047 DOMINO TILE HORIZONTAL-03-01 +1F048 DOMINO TILE HORIZONTAL-03-02 +1F049 DOMINO TILE HORIZONTAL-03-03 +1F04A DOMINO TILE HORIZONTAL-03-04 +1F04B DOMINO TILE HORIZONTAL-03-05 +1F04C DOMINO TILE HORIZONTAL-03-06 +1F04D DOMINO TILE HORIZONTAL-04-00 +1F04E DOMINO TILE HORIZONTAL-04-01 +1F04F DOMINO TILE HORIZONTAL-04-02 +1F050 DOMINO TILE HORIZONTAL-04-03 +1F051 DOMINO TILE HORIZONTAL-04-04 +1F052 DOMINO TILE HORIZONTAL-04-05 +1F053 DOMINO TILE HORIZONTAL-04-06 +1F054 DOMINO TILE HORIZONTAL-05-00 +1F055 DOMINO TILE HORIZONTAL-05-01 +1F056 DOMINO TILE HORIZONTAL-05-02 +1F057 DOMINO TILE HORIZONTAL-05-03 +1F058 DOMINO TILE HORIZONTAL-05-04 +1F059 DOMINO TILE HORIZONTAL-05-05 +1F05A DOMINO TILE HORIZONTAL-05-06 +1F05B DOMINO TILE HORIZONTAL-06-00 +1F05C DOMINO TILE HORIZONTAL-06-01 +1F05D DOMINO TILE HORIZONTAL-06-02 +1F05E DOMINO TILE HORIZONTAL-06-03 +1F05F DOMINO TILE HORIZONTAL-06-04 +1F060 DOMINO TILE HORIZONTAL-06-05 +1F061 DOMINO TILE HORIZONTAL-06-06 +1F062 DOMINO TILE VERTICAL BACK +1F063 DOMINO TILE VERTICAL-00-00 +1F064 DOMINO TILE VERTICAL-00-01 +1F065 DOMINO TILE VERTICAL-00-02 +1F066 DOMINO TILE VERTICAL-00-03 +1F067 DOMINO TILE VERTICAL-00-04 +1F068 DOMINO TILE VERTICAL-00-05 +1F069 DOMINO TILE VERTICAL-00-06 +1F06A DOMINO TILE VERTICAL-01-00 +1F06B DOMINO TILE VERTICAL-01-01 +1F06C DOMINO TILE VERTICAL-01-02 +1F06D DOMINO TILE VERTICAL-01-03 +1F06E DOMINO TILE VERTICAL-01-04 +1F06F DOMINO TILE VERTICAL-01-05 +1F070 DOMINO TILE VERTICAL-01-06 +1F071 DOMINO TILE VERTICAL-02-00 +1F072 DOMINO TILE VERTICAL-02-01 +1F073 DOMINO TILE VERTICAL-02-02 +1F074 DOMINO TILE VERTICAL-02-03 +1F075 DOMINO TILE VERTICAL-02-04 +1F076 DOMINO TILE VERTICAL-02-05 +1F077 DOMINO TILE VERTICAL-02-06 +1F078 DOMINO TILE VERTICAL-03-00 +1F079 DOMINO TILE VERTICAL-03-01 +1F07A DOMINO TILE VERTICAL-03-02 +1F07B DOMINO TILE VERTICAL-03-03 +1F07C DOMINO TILE VERTICAL-03-04 +1F07D DOMINO TILE VERTICAL-03-05 +1F07E DOMINO TILE VERTICAL-03-06 +1F07F DOMINO TILE VERTICAL-04-00 +1F080 DOMINO TILE VERTICAL-04-01 +1F081 DOMINO TILE VERTICAL-04-02 +1F082 DOMINO TILE VERTICAL-04-03 +1F083 DOMINO TILE VERTICAL-04-04 +1F084 DOMINO TILE VERTICAL-04-05 +1F085 DOMINO TILE VERTICAL-04-06 +1F086 DOMINO TILE VERTICAL-05-00 +1F087 DOMINO TILE VERTICAL-05-01 +1F088 DOMINO TILE VERTICAL-05-02 +1F089 DOMINO TILE VERTICAL-05-03 +1F08A DOMINO TILE VERTICAL-05-04 +1F08B DOMINO TILE VERTICAL-05-05 +1F08C DOMINO TILE VERTICAL-05-06 +1F08D DOMINO TILE VERTICAL-06-00 +1F08E DOMINO TILE VERTICAL-06-01 +1F08F DOMINO TILE VERTICAL-06-02 +1F090 DOMINO TILE VERTICAL-06-03 +1F091 DOMINO TILE VERTICAL-06-04 +1F092 DOMINO TILE VERTICAL-06-05 +1F093 DOMINO TILE VERTICAL-06-06 +1F0A0 PLAYING CARD BACK +1F0A1 PLAYING CARD ACE OF SPADES +1F0A2 PLAYING CARD TWO OF SPADES +1F0A3 PLAYING CARD THREE OF SPADES +1F0A4 PLAYING CARD FOUR OF SPADES +1F0A5 PLAYING CARD FIVE OF SPADES +1F0A6 PLAYING CARD SIX OF SPADES +1F0A7 PLAYING CARD SEVEN OF SPADES +1F0A8 PLAYING CARD EIGHT OF SPADES +1F0A9 PLAYING CARD NINE OF SPADES +1F0AA PLAYING CARD TEN OF SPADES +1F0AB PLAYING CARD JACK OF SPADES +1F0AC PLAYING CARD KNIGHT OF SPADES +1F0AD PLAYING CARD QUEEN OF SPADES +1F0AE PLAYING CARD KING OF SPADES +1F0B1 PLAYING CARD ACE OF HEARTS +1F0B2 PLAYING CARD TWO OF HEARTS +1F0B3 PLAYING CARD THREE OF HEARTS +1F0B4 PLAYING CARD FOUR OF HEARTS +1F0B5 PLAYING CARD FIVE OF HEARTS +1F0B6 PLAYING CARD SIX OF HEARTS +1F0B7 PLAYING CARD SEVEN OF HEARTS +1F0B8 PLAYING CARD EIGHT OF HEARTS +1F0B9 PLAYING CARD NINE OF HEARTS +1F0BA PLAYING CARD TEN OF HEARTS +1F0BB PLAYING CARD JACK OF HEARTS +1F0BC PLAYING CARD KNIGHT OF HEARTS +1F0BD PLAYING CARD QUEEN OF HEARTS +1F0BE PLAYING CARD KING OF HEARTS +1F0BF PLAYING CARD RED JOKER +1F0C1 PLAYING CARD ACE OF DIAMONDS +1F0C2 PLAYING CARD TWO OF DIAMONDS +1F0C3 PLAYING CARD THREE OF DIAMONDS +1F0C4 PLAYING CARD FOUR OF DIAMONDS +1F0C5 PLAYING CARD FIVE OF DIAMONDS +1F0C6 PLAYING CARD SIX OF DIAMONDS +1F0C7 PLAYING CARD SEVEN OF DIAMONDS +1F0C8 PLAYING CARD EIGHT OF DIAMONDS +1F0C9 PLAYING CARD NINE OF DIAMONDS +1F0CA PLAYING CARD TEN OF DIAMONDS +1F0CB PLAYING CARD JACK OF DIAMONDS +1F0CC PLAYING CARD KNIGHT OF DIAMONDS +1F0CD PLAYING CARD QUEEN OF DIAMONDS +1F0CE PLAYING CARD KING OF DIAMONDS +1F0CF PLAYING CARD BLACK JOKER +1F0D1 PLAYING CARD ACE OF CLUBS +1F0D2 PLAYING CARD TWO OF CLUBS +1F0D3 PLAYING CARD THREE OF CLUBS +1F0D4 PLAYING CARD FOUR OF CLUBS +1F0D5 PLAYING CARD FIVE OF CLUBS +1F0D6 PLAYING CARD SIX OF CLUBS +1F0D7 PLAYING CARD SEVEN OF CLUBS +1F0D8 PLAYING CARD EIGHT OF CLUBS +1F0D9 PLAYING CARD NINE OF CLUBS +1F0DA PLAYING CARD TEN OF CLUBS +1F0DB PLAYING CARD JACK OF CLUBS +1F0DC PLAYING CARD KNIGHT OF CLUBS +1F0DD PLAYING CARD QUEEN OF CLUBS +1F0DE PLAYING CARD KING OF CLUBS +1F0DF PLAYING CARD WHITE JOKER +1F0E0 PLAYING CARD FOOL +1F0E1 PLAYING CARD TRUMP-1 +1F0E2 PLAYING CARD TRUMP-2 +1F0E3 PLAYING CARD TRUMP-3 +1F0E4 PLAYING CARD TRUMP-4 +1F0E5 PLAYING CARD TRUMP-5 +1F0E6 PLAYING CARD TRUMP-6 +1F0E7 PLAYING CARD TRUMP-7 +1F0E8 PLAYING CARD TRUMP-8 +1F0E9 PLAYING CARD TRUMP-9 +1F0EA PLAYING CARD TRUMP-10 +1F0EB PLAYING CARD TRUMP-11 +1F0EC PLAYING CARD TRUMP-12 +1F0ED PLAYING CARD TRUMP-13 +1F0EE PLAYING CARD TRUMP-14 +1F0EF PLAYING CARD TRUMP-15 +1F0F0 PLAYING CARD TRUMP-16 +1F0F1 PLAYING CARD TRUMP-17 +1F0F2 PLAYING CARD TRUMP-18 +1F0F3 PLAYING CARD TRUMP-19 +1F0F4 PLAYING CARD TRUMP-20 +1F0F5 PLAYING CARD TRUMP-21 +1F100 DIGIT ZERO FULL STOP +1F101 DIGIT ZERO COMMA +1F102 DIGIT ONE COMMA +1F103 DIGIT TWO COMMA +1F104 DIGIT THREE COMMA +1F105 DIGIT FOUR COMMA +1F106 DIGIT FIVE COMMA +1F107 DIGIT SIX COMMA +1F108 DIGIT SEVEN COMMA +1F109 DIGIT EIGHT COMMA +1F10A DIGIT NINE COMMA +1F10B DINGBAT CIRCLED SANS-SERIF DIGIT ZERO +1F10C DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F110 PARENTHESIZED LATIN CAPITAL LETTER A +1F111 PARENTHESIZED LATIN CAPITAL LETTER B +1F112 PARENTHESIZED LATIN CAPITAL LETTER C +1F113 PARENTHESIZED LATIN CAPITAL LETTER D +1F114 PARENTHESIZED LATIN CAPITAL LETTER E +1F115 PARENTHESIZED LATIN CAPITAL LETTER F +1F116 PARENTHESIZED LATIN CAPITAL LETTER G +1F117 PARENTHESIZED LATIN CAPITAL LETTER H +1F118 PARENTHESIZED LATIN CAPITAL LETTER I +1F119 PARENTHESIZED LATIN CAPITAL LETTER J +1F11A PARENTHESIZED LATIN CAPITAL LETTER K +1F11B PARENTHESIZED LATIN CAPITAL LETTER L +1F11C PARENTHESIZED LATIN CAPITAL LETTER M +1F11D PARENTHESIZED LATIN CAPITAL LETTER N +1F11E PARENTHESIZED LATIN CAPITAL LETTER O +1F11F PARENTHESIZED LATIN CAPITAL LETTER P +1F120 PARENTHESIZED LATIN CAPITAL LETTER Q +1F121 PARENTHESIZED LATIN CAPITAL LETTER R +1F122 PARENTHESIZED LATIN CAPITAL LETTER S +1F123 PARENTHESIZED LATIN CAPITAL LETTER T +1F124 PARENTHESIZED LATIN CAPITAL LETTER U +1F125 PARENTHESIZED LATIN CAPITAL LETTER V +1F126 PARENTHESIZED LATIN CAPITAL LETTER W +1F127 PARENTHESIZED LATIN CAPITAL LETTER X +1F128 PARENTHESIZED LATIN CAPITAL LETTER Y +1F129 PARENTHESIZED LATIN CAPITAL LETTER Z +1F12A TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S +1F12B CIRCLED ITALIC LATIN CAPITAL LETTER C +1F12C CIRCLED ITALIC LATIN CAPITAL LETTER R +1F12D CIRCLED CD +1F12E CIRCLED WZ +1F130 SQUARED LATIN CAPITAL LETTER A +1F131 SQUARED LATIN CAPITAL LETTER B +1F132 SQUARED LATIN CAPITAL LETTER C +1F133 SQUARED LATIN CAPITAL LETTER D +1F134 SQUARED LATIN CAPITAL LETTER E +1F135 SQUARED LATIN CAPITAL LETTER F +1F136 SQUARED LATIN CAPITAL LETTER G +1F137 SQUARED LATIN CAPITAL LETTER H +1F138 SQUARED LATIN CAPITAL LETTER I +1F139 SQUARED LATIN CAPITAL LETTER J +1F13A SQUARED LATIN CAPITAL LETTER K +1F13B SQUARED LATIN CAPITAL LETTER L +1F13C SQUARED LATIN CAPITAL LETTER M +1F13D SQUARED LATIN CAPITAL LETTER N +1F13E SQUARED LATIN CAPITAL LETTER O +1F13F SQUARED LATIN CAPITAL LETTER P +1F140 SQUARED LATIN CAPITAL LETTER Q +1F141 SQUARED LATIN CAPITAL LETTER R +1F142 SQUARED LATIN CAPITAL LETTER S +1F143 SQUARED LATIN CAPITAL LETTER T +1F144 SQUARED LATIN CAPITAL LETTER U +1F145 SQUARED LATIN CAPITAL LETTER V +1F146 SQUARED LATIN CAPITAL LETTER W +1F147 SQUARED LATIN CAPITAL LETTER X +1F148 SQUARED LATIN CAPITAL LETTER Y +1F149 SQUARED LATIN CAPITAL LETTER Z +1F14A SQUARED HV +1F14B SQUARED MV +1F14C SQUARED SD +1F14D SQUARED SS +1F14E SQUARED PPV +1F14F SQUARED WC +1F150 NEGATIVE CIRCLED LATIN CAPITAL LETTER A +1F151 NEGATIVE CIRCLED LATIN CAPITAL LETTER B +1F152 NEGATIVE CIRCLED LATIN CAPITAL LETTER C +1F153 NEGATIVE CIRCLED LATIN CAPITAL LETTER D +1F154 NEGATIVE CIRCLED LATIN CAPITAL LETTER E +1F155 NEGATIVE CIRCLED LATIN CAPITAL LETTER F +1F156 NEGATIVE CIRCLED LATIN CAPITAL LETTER G +1F157 NEGATIVE CIRCLED LATIN CAPITAL LETTER H +1F158 NEGATIVE CIRCLED LATIN CAPITAL LETTER I +1F159 NEGATIVE CIRCLED LATIN CAPITAL LETTER J +1F15A NEGATIVE CIRCLED LATIN CAPITAL LETTER K +1F15B NEGATIVE CIRCLED LATIN CAPITAL LETTER L +1F15C NEGATIVE CIRCLED LATIN CAPITAL LETTER M +1F15D NEGATIVE CIRCLED LATIN CAPITAL LETTER N +1F15E NEGATIVE CIRCLED LATIN CAPITAL LETTER O +1F15F NEGATIVE CIRCLED LATIN CAPITAL LETTER P +1F160 NEGATIVE CIRCLED LATIN CAPITAL LETTER Q +1F161 NEGATIVE CIRCLED LATIN CAPITAL LETTER R +1F162 NEGATIVE CIRCLED LATIN CAPITAL LETTER S +1F163 NEGATIVE CIRCLED LATIN CAPITAL LETTER T +1F164 NEGATIVE CIRCLED LATIN CAPITAL LETTER U +1F165 NEGATIVE CIRCLED LATIN CAPITAL LETTER V +1F166 NEGATIVE CIRCLED LATIN CAPITAL LETTER W +1F167 NEGATIVE CIRCLED LATIN CAPITAL LETTER X +1F168 NEGATIVE CIRCLED LATIN CAPITAL LETTER Y +1F169 NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F16A RAISED MC SIGN +1F16B RAISED MD SIGN +1F170 NEGATIVE SQUARED LATIN CAPITAL LETTER A +1F171 NEGATIVE SQUARED LATIN CAPITAL LETTER B +1F172 NEGATIVE SQUARED LATIN CAPITAL LETTER C +1F173 NEGATIVE SQUARED LATIN CAPITAL LETTER D +1F174 NEGATIVE SQUARED LATIN CAPITAL LETTER E +1F175 NEGATIVE SQUARED LATIN CAPITAL LETTER F +1F176 NEGATIVE SQUARED LATIN CAPITAL LETTER G +1F177 NEGATIVE SQUARED LATIN CAPITAL LETTER H +1F178 NEGATIVE SQUARED LATIN CAPITAL LETTER I +1F179 NEGATIVE SQUARED LATIN CAPITAL LETTER J +1F17A NEGATIVE SQUARED LATIN CAPITAL LETTER K +1F17B NEGATIVE SQUARED LATIN CAPITAL LETTER L +1F17C NEGATIVE SQUARED LATIN CAPITAL LETTER M +1F17D NEGATIVE SQUARED LATIN CAPITAL LETTER N +1F17E NEGATIVE SQUARED LATIN CAPITAL LETTER O +1F17F NEGATIVE SQUARED LATIN CAPITAL LETTER P +1F180 NEGATIVE SQUARED LATIN CAPITAL LETTER Q +1F181 NEGATIVE SQUARED LATIN CAPITAL LETTER R +1F182 NEGATIVE SQUARED LATIN CAPITAL LETTER S +1F183 NEGATIVE SQUARED LATIN CAPITAL LETTER T +1F184 NEGATIVE SQUARED LATIN CAPITAL LETTER U +1F185 NEGATIVE SQUARED LATIN CAPITAL LETTER V +1F186 NEGATIVE SQUARED LATIN CAPITAL LETTER W +1F187 NEGATIVE SQUARED LATIN CAPITAL LETTER X +1F188 NEGATIVE SQUARED LATIN CAPITAL LETTER Y +1F189 NEGATIVE SQUARED LATIN CAPITAL LETTER Z +1F18A CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P +1F18B NEGATIVE SQUARED IC +1F18C NEGATIVE SQUARED PA +1F18D NEGATIVE SQUARED SA +1F18E NEGATIVE SQUARED AB +1F18F NEGATIVE SQUARED WC +1F190 SQUARE DJ +1F191 SQUARED CL +1F192 SQUARED COOL +1F193 SQUARED FREE +1F194 SQUARED ID +1F195 SQUARED NEW +1F196 SQUARED NG +1F197 SQUARED OK +1F198 SQUARED SOS +1F199 SQUARED UP WITH EXCLAMATION MARK +1F19A SQUARED VS +1F19B SQUARED THREE D +1F19C SQUARED SECOND SCREEN +1F19D SQUARED TWO K +1F19E SQUARED FOUR K +1F19F SQUARED EIGHT K +1F1A0 SQUARED FIVE POINT ONE +1F1A1 SQUARED SEVEN POINT ONE +1F1A2 SQUARED TWENTY-TWO POINT TWO +1F1A3 SQUARED SIXTY P +1F1A4 SQUARED ONE HUNDRED TWENTY P +1F1A5 SQUARED LATIN SMALL LETTER D +1F1A6 SQUARED HC +1F1A7 SQUARED HDR +1F1A8 SQUARED HI-RES +1F1A9 SQUARED LOSSLESS +1F1AA SQUARED SHV +1F1AB SQUARED UHD +1F1AC SQUARED VOD +1F1E6 REGIONAL INDICATOR SYMBOL LETTER A +1F1E7 REGIONAL INDICATOR SYMBOL LETTER B +1F1E8 REGIONAL INDICATOR SYMBOL LETTER C +1F1E9 REGIONAL INDICATOR SYMBOL LETTER D +1F1EA REGIONAL INDICATOR SYMBOL LETTER E +1F1EB REGIONAL INDICATOR SYMBOL LETTER F +1F1EC REGIONAL INDICATOR SYMBOL LETTER G +1F1ED REGIONAL INDICATOR SYMBOL LETTER H +1F1EE REGIONAL INDICATOR SYMBOL LETTER I +1F1EF REGIONAL INDICATOR SYMBOL LETTER J +1F1F0 REGIONAL INDICATOR SYMBOL LETTER K +1F1F1 REGIONAL INDICATOR SYMBOL LETTER L +1F1F2 REGIONAL INDICATOR SYMBOL LETTER M +1F1F3 REGIONAL INDICATOR SYMBOL LETTER N +1F1F4 REGIONAL INDICATOR SYMBOL LETTER O +1F1F5 REGIONAL INDICATOR SYMBOL LETTER P +1F1F6 REGIONAL INDICATOR SYMBOL LETTER Q +1F1F7 REGIONAL INDICATOR SYMBOL LETTER R +1F1F8 REGIONAL INDICATOR SYMBOL LETTER S +1F1F9 REGIONAL INDICATOR SYMBOL LETTER T +1F1FA REGIONAL INDICATOR SYMBOL LETTER U +1F1FB REGIONAL INDICATOR SYMBOL LETTER V +1F1FC REGIONAL INDICATOR SYMBOL LETTER W +1F1FD REGIONAL INDICATOR SYMBOL LETTER X +1F1FE REGIONAL INDICATOR SYMBOL LETTER Y +1F1FF REGIONAL INDICATOR SYMBOL LETTER Z +1F200 SQUARE HIRAGANA HOKA +1F201 SQUARED KATAKANA KOKO +1F202 SQUARED KATAKANA SA +1F210 SQUARED CJK UNIFIED IDEOGRAPH-624B +1F211 SQUARED CJK UNIFIED IDEOGRAPH-5B57 +1F212 SQUARED CJK UNIFIED IDEOGRAPH-53CC +1F213 SQUARED KATAKANA DE +1F214 SQUARED CJK UNIFIED IDEOGRAPH-4E8C +1F215 SQUARED CJK UNIFIED IDEOGRAPH-591A +1F216 SQUARED CJK UNIFIED IDEOGRAPH-89E3 +1F217 SQUARED CJK UNIFIED IDEOGRAPH-5929 +1F218 SQUARED CJK UNIFIED IDEOGRAPH-4EA4 +1F219 SQUARED CJK UNIFIED IDEOGRAPH-6620 +1F21A SQUARED CJK UNIFIED IDEOGRAPH-7121 +1F21B SQUARED CJK UNIFIED IDEOGRAPH-6599 +1F21C SQUARED CJK UNIFIED IDEOGRAPH-524D +1F21D SQUARED CJK UNIFIED IDEOGRAPH-5F8C +1F21E SQUARED CJK UNIFIED IDEOGRAPH-518D +1F21F SQUARED CJK UNIFIED IDEOGRAPH-65B0 +1F220 SQUARED CJK UNIFIED IDEOGRAPH-521D +1F221 SQUARED CJK UNIFIED IDEOGRAPH-7D42 +1F222 SQUARED CJK UNIFIED IDEOGRAPH-751F +1F223 SQUARED CJK UNIFIED IDEOGRAPH-8CA9 +1F224 SQUARED CJK UNIFIED IDEOGRAPH-58F0 +1F225 SQUARED CJK UNIFIED IDEOGRAPH-5439 +1F226 SQUARED CJK UNIFIED IDEOGRAPH-6F14 +1F227 SQUARED CJK UNIFIED IDEOGRAPH-6295 +1F228 SQUARED CJK UNIFIED IDEOGRAPH-6355 +1F229 SQUARED CJK UNIFIED IDEOGRAPH-4E00 +1F22A SQUARED CJK UNIFIED IDEOGRAPH-4E09 +1F22B SQUARED CJK UNIFIED IDEOGRAPH-904A +1F22C SQUARED CJK UNIFIED IDEOGRAPH-5DE6 +1F22D SQUARED CJK UNIFIED IDEOGRAPH-4E2D +1F22E SQUARED CJK UNIFIED IDEOGRAPH-53F3 +1F22F SQUARED CJK UNIFIED IDEOGRAPH-6307 +1F230 SQUARED CJK UNIFIED IDEOGRAPH-8D70 +1F231 SQUARED CJK UNIFIED IDEOGRAPH-6253 +1F232 SQUARED CJK UNIFIED IDEOGRAPH-7981 +1F233 SQUARED CJK UNIFIED IDEOGRAPH-7A7A +1F234 SQUARED CJK UNIFIED IDEOGRAPH-5408 +1F235 SQUARED CJK UNIFIED IDEOGRAPH-6E80 +1F236 SQUARED CJK UNIFIED IDEOGRAPH-6709 +1F237 SQUARED CJK UNIFIED IDEOGRAPH-6708 +1F238 SQUARED CJK UNIFIED IDEOGRAPH-7533 +1F239 SQUARED CJK UNIFIED IDEOGRAPH-5272 +1F23A SQUARED CJK UNIFIED IDEOGRAPH-55B6 +1F23B SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C +1F241 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09 +1F242 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C +1F243 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89 +1F244 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9 +1F245 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253 +1F246 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7 +1F247 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD +1F248 TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250 CIRCLED IDEOGRAPH ADVANTAGE +1F251 CIRCLED IDEOGRAPH ACCEPT +1F260 ROUNDED SYMBOL FOR FU +1F261 ROUNDED SYMBOL FOR LU +1F262 ROUNDED SYMBOL FOR SHOU +1F263 ROUNDED SYMBOL FOR XI +1F264 ROUNDED SYMBOL FOR SHUANGXI +1F265 ROUNDED SYMBOL FOR CAI +1F300 CYCLONE +1F301 FOGGY +1F302 CLOSED UMBRELLA +1F303 NIGHT WITH STARS +1F304 SUNRISE OVER MOUNTAINS +1F305 SUNRISE +1F306 CITYSCAPE AT DUSK +1F307 SUNSET OVER BUILDINGS +1F308 RAINBOW +1F309 BRIDGE AT NIGHT +1F30A WATER WAVE +1F30B VOLCANO +1F30C MILKY WAY +1F30D EARTH GLOBE EUROPE-AFRICA +1F30E EARTH GLOBE AMERICAS +1F30F EARTH GLOBE ASIA-AUSTRALIA +1F310 GLOBE WITH MERIDIANS +1F311 NEW MOON SYMBOL +1F312 WAXING CRESCENT MOON SYMBOL +1F313 FIRST QUARTER MOON SYMBOL +1F314 WAXING GIBBOUS MOON SYMBOL +1F315 FULL MOON SYMBOL +1F316 WANING GIBBOUS MOON SYMBOL +1F317 LAST QUARTER MOON SYMBOL +1F318 WANING CRESCENT MOON SYMBOL +1F319 CRESCENT MOON +1F31A NEW MOON WITH FACE +1F31B FIRST QUARTER MOON WITH FACE +1F31C LAST QUARTER MOON WITH FACE +1F31D FULL MOON WITH FACE +1F31E SUN WITH FACE +1F31F GLOWING STAR +1F320 SHOOTING STAR +1F321 THERMOMETER +1F322 BLACK DROPLET +1F323 WHITE SUN +1F324 WHITE SUN WITH SMALL CLOUD +1F325 WHITE SUN BEHIND CLOUD +1F326 WHITE SUN BEHIND CLOUD WITH RAIN +1F327 CLOUD WITH RAIN +1F328 CLOUD WITH SNOW +1F329 CLOUD WITH LIGHTNING +1F32A CLOUD WITH TORNADO +1F32B FOG +1F32C WIND BLOWING FACE +1F32D HOT DOG +1F32E TACO +1F32F BURRITO +1F330 CHESTNUT +1F331 SEEDLING +1F332 EVERGREEN TREE +1F333 DECIDUOUS TREE +1F334 PALM TREE +1F335 CACTUS +1F336 HOT PEPPER +1F337 TULIP +1F338 CHERRY BLOSSOM +1F339 ROSE +1F33A HIBISCUS +1F33B SUNFLOWER +1F33C BLOSSOM +1F33D EAR OF MAIZE +1F33E EAR OF RICE +1F33F HERB +1F340 FOUR LEAF CLOVER +1F341 MAPLE LEAF +1F342 FALLEN LEAF +1F343 LEAF FLUTTERING IN WIND +1F344 MUSHROOM +1F345 TOMATO +1F346 AUBERGINE +1F347 GRAPES +1F348 MELON +1F349 WATERMELON +1F34A TANGERINE +1F34B LEMON +1F34C BANANA +1F34D PINEAPPLE +1F34E RED APPLE +1F34F GREEN APPLE +1F350 PEAR +1F351 PEACH +1F352 CHERRIES +1F353 STRAWBERRY +1F354 HAMBURGER +1F355 SLICE OF PIZZA +1F356 MEAT ON BONE +1F357 POULTRY LEG +1F358 RICE CRACKER +1F359 RICE BALL +1F35A COOKED RICE +1F35B CURRY AND RICE +1F35C STEAMING BOWL +1F35D SPAGHETTI +1F35E BREAD +1F35F FRENCH FRIES +1F360 ROASTED SWEET POTATO +1F361 DANGO +1F362 ODEN +1F363 SUSHI +1F364 FRIED SHRIMP +1F365 FISH CAKE WITH SWIRL DESIGN +1F366 SOFT ICE CREAM +1F367 SHAVED ICE +1F368 ICE CREAM +1F369 DOUGHNUT +1F36A COOKIE +1F36B CHOCOLATE BAR +1F36C CANDY +1F36D LOLLIPOP +1F36E CUSTARD +1F36F HONEY POT +1F370 SHORTCAKE +1F371 BENTO BOX +1F372 POT OF FOOD +1F373 COOKING +1F374 FORK AND KNIFE +1F375 TEACUP WITHOUT HANDLE +1F376 SAKE BOTTLE AND CUP +1F377 WINE GLASS +1F378 COCKTAIL GLASS +1F379 TROPICAL DRINK +1F37A BEER MUG +1F37B CLINKING BEER MUGS +1F37C BABY BOTTLE +1F37D FORK AND KNIFE WITH PLATE +1F37E BOTTLE WITH POPPING CORK +1F37F POPCORN +1F380 RIBBON +1F381 WRAPPED PRESENT +1F382 BIRTHDAY CAKE +1F383 JACK-O-LANTERN +1F384 CHRISTMAS TREE +1F385 FATHER CHRISTMAS +1F386 FIREWORKS +1F387 FIREWORK SPARKLER +1F388 BALLOON +1F389 PARTY POPPER +1F38A CONFETTI BALL +1F38B TANABATA TREE +1F38C CROSSED FLAGS +1F38D PINE DECORATION +1F38E JAPANESE DOLLS +1F38F CARP STREAMER +1F390 WIND CHIME +1F391 MOON VIEWING CEREMONY +1F392 SCHOOL SATCHEL +1F393 GRADUATION CAP +1F394 HEART WITH TIP ON THE LEFT +1F395 BOUQUET OF FLOWERS +1F396 MILITARY MEDAL +1F397 REMINDER RIBBON +1F398 MUSICAL KEYBOARD WITH JACKS +1F399 STUDIO MICROPHONE +1F39A LEVEL SLIDER +1F39B CONTROL KNOBS +1F39C BEAMED ASCENDING MUSICAL NOTES +1F39D BEAMED DESCENDING MUSICAL NOTES +1F39E FILM FRAMES +1F39F ADMISSION TICKETS +1F3A0 CAROUSEL HORSE +1F3A1 FERRIS WHEEL +1F3A2 ROLLER COASTER +1F3A3 FISHING POLE AND FISH +1F3A4 MICROPHONE +1F3A5 MOVIE CAMERA +1F3A6 CINEMA +1F3A7 HEADPHONE +1F3A8 ARTIST PALETTE +1F3A9 TOP HAT +1F3AA CIRCUS TENT +1F3AB TICKET +1F3AC CLAPPER BOARD +1F3AD PERFORMING ARTS +1F3AE VIDEO GAME +1F3AF DIRECT HIT +1F3B0 SLOT MACHINE +1F3B1 BILLIARDS +1F3B2 GAME DIE +1F3B3 BOWLING +1F3B4 FLOWER PLAYING CARDS +1F3B5 MUSICAL NOTE +1F3B6 MULTIPLE MUSICAL NOTES +1F3B7 SAXOPHONE +1F3B8 GUITAR +1F3B9 MUSICAL KEYBOARD +1F3BA TRUMPET +1F3BB VIOLIN +1F3BC MUSICAL SCORE +1F3BD RUNNING SHIRT WITH SASH +1F3BE TENNIS RACQUET AND BALL +1F3BF SKI AND SKI BOOT +1F3C0 BASKETBALL AND HOOP +1F3C1 CHEQUERED FLAG +1F3C2 SNOWBOARDER +1F3C3 RUNNER +1F3C4 SURFER +1F3C5 SPORTS MEDAL +1F3C6 TROPHY +1F3C7 HORSE RACING +1F3C8 AMERICAN FOOTBALL +1F3C9 RUGBY FOOTBALL +1F3CA SWIMMER +1F3CB WEIGHT LIFTER +1F3CC GOLFER +1F3CD RACING MOTORCYCLE +1F3CE RACING CAR +1F3CF CRICKET BAT AND BALL +1F3D0 VOLLEYBALL +1F3D1 FIELD HOCKEY STICK AND BALL +1F3D2 ICE HOCKEY STICK AND PUCK +1F3D3 TABLE TENNIS PADDLE AND BALL +1F3D4 SNOW CAPPED MOUNTAIN +1F3D5 CAMPING +1F3D6 BEACH WITH UMBRELLA +1F3D7 BUILDING CONSTRUCTION +1F3D8 HOUSE BUILDINGS +1F3D9 CITYSCAPE +1F3DA DERELICT HOUSE BUILDING +1F3DB CLASSICAL BUILDING +1F3DC DESERT +1F3DD DESERT ISLAND +1F3DE NATIONAL PARK +1F3DF STADIUM +1F3E0 HOUSE BUILDING +1F3E1 HOUSE WITH GARDEN +1F3E2 OFFICE BUILDING +1F3E3 JAPANESE POST OFFICE +1F3E4 EUROPEAN POST OFFICE +1F3E5 HOSPITAL +1F3E6 BANK +1F3E7 AUTOMATED TELLER MACHINE +1F3E8 HOTEL +1F3E9 LOVE HOTEL +1F3EA CONVENIENCE STORE +1F3EB SCHOOL +1F3EC DEPARTMENT STORE +1F3ED FACTORY +1F3EE IZAKAYA LANTERN +1F3EF JAPANESE CASTLE +1F3F0 EUROPEAN CASTLE +1F3F1 WHITE PENNANT +1F3F2 BLACK PENNANT +1F3F3 WAVING WHITE FLAG +1F3F4 WAVING BLACK FLAG +1F3F5 ROSETTE +1F3F6 BLACK ROSETTE +1F3F7 LABEL +1F3F8 BADMINTON RACQUET AND SHUTTLECOCK +1F3F9 BOW AND ARROW +1F3FA AMPHORA +1F3FB EMOJI MODIFIER FITZPATRICK TYPE-1-2 +1F3FC EMOJI MODIFIER FITZPATRICK TYPE-3 +1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4 +1F3FE EMOJI MODIFIER FITZPATRICK TYPE-5 +1F3FF EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400 RAT +1F401 MOUSE +1F402 OX +1F403 WATER BUFFALO +1F404 COW +1F405 TIGER +1F406 LEOPARD +1F407 RABBIT +1F408 CAT +1F409 DRAGON +1F40A CROCODILE +1F40B WHALE +1F40C SNAIL +1F40D SNAKE +1F40E HORSE +1F40F RAM +1F410 GOAT +1F411 SHEEP +1F412 MONKEY +1F413 ROOSTER +1F414 CHICKEN +1F415 DOG +1F416 PIG +1F417 BOAR +1F418 ELEPHANT +1F419 OCTOPUS +1F41A SPIRAL SHELL +1F41B BUG +1F41C ANT +1F41D HONEYBEE +1F41E LADY BEETLE +1F41F FISH +1F420 TROPICAL FISH +1F421 BLOWFISH +1F422 TURTLE +1F423 HATCHING CHICK +1F424 BABY CHICK +1F425 FRONT-FACING BABY CHICK +1F426 BIRD +1F427 PENGUIN +1F428 KOALA +1F429 POODLE +1F42A DROMEDARY CAMEL +1F42B BACTRIAN CAMEL +1F42C DOLPHIN +1F42D MOUSE FACE +1F42E COW FACE +1F42F TIGER FACE +1F430 RABBIT FACE +1F431 CAT FACE +1F432 DRAGON FACE +1F433 SPOUTING WHALE +1F434 HORSE FACE +1F435 MONKEY FACE +1F436 DOG FACE +1F437 PIG FACE +1F438 FROG FACE +1F439 HAMSTER FACE +1F43A WOLF FACE +1F43B BEAR FACE +1F43C PANDA FACE +1F43D PIG NOSE +1F43E PAW PRINTS +1F43F CHIPMUNK +1F440 EYES +1F441 EYE +1F442 EAR +1F443 NOSE +1F444 MOUTH +1F445 TONGUE +1F446 WHITE UP POINTING BACKHAND INDEX +1F447 WHITE DOWN POINTING BACKHAND INDEX +1F448 WHITE LEFT POINTING BACKHAND INDEX +1F449 WHITE RIGHT POINTING BACKHAND INDEX +1F44A FISTED HAND SIGN +1F44B WAVING HAND SIGN +1F44C OK HAND SIGN +1F44D THUMBS UP SIGN +1F44E THUMBS DOWN SIGN +1F44F CLAPPING HANDS SIGN +1F450 OPEN HANDS SIGN +1F451 CROWN +1F452 WOMANS HAT +1F453 EYEGLASSES +1F454 NECKTIE +1F455 T-SHIRT +1F456 JEANS +1F457 DRESS +1F458 KIMONO +1F459 BIKINI +1F45A WOMANS CLOTHES +1F45B PURSE +1F45C HANDBAG +1F45D POUCH +1F45E MANS SHOE +1F45F ATHLETIC SHOE +1F460 HIGH-HEELED SHOE +1F461 WOMANS SANDAL +1F462 WOMANS BOOTS +1F463 FOOTPRINTS +1F464 BUST IN SILHOUETTE +1F465 BUSTS IN SILHOUETTE +1F466 BOY +1F467 GIRL +1F468 MAN +1F469 WOMAN +1F46A FAMILY +1F46B MAN AND WOMAN HOLDING HANDS +1F46C TWO MEN HOLDING HANDS +1F46D TWO WOMEN HOLDING HANDS +1F46E POLICE OFFICER +1F46F WOMAN WITH BUNNY EARS +1F470 BRIDE WITH VEIL +1F471 PERSON WITH BLOND HAIR +1F472 MAN WITH GUA PI MAO +1F473 MAN WITH TURBAN +1F474 OLDER MAN +1F475 OLDER WOMAN +1F476 BABY +1F477 CONSTRUCTION WORKER +1F478 PRINCESS +1F479 JAPANESE OGRE +1F47A JAPANESE GOBLIN +1F47B GHOST +1F47C BABY ANGEL +1F47D EXTRATERRESTRIAL ALIEN +1F47E ALIEN MONSTER +1F47F IMP +1F480 SKULL +1F481 INFORMATION DESK PERSON +1F482 GUARDSMAN +1F483 DANCER +1F484 LIPSTICK +1F485 NAIL POLISH +1F486 FACE MASSAGE +1F487 HAIRCUT +1F488 BARBER POLE +1F489 SYRINGE +1F48A PILL +1F48B KISS MARK +1F48C LOVE LETTER +1F48D RING +1F48E GEM STONE +1F48F KISS +1F490 BOUQUET +1F491 COUPLE WITH HEART +1F492 WEDDING +1F493 BEATING HEART +1F494 BROKEN HEART +1F495 TWO HEARTS +1F496 SPARKLING HEART +1F497 GROWING HEART +1F498 HEART WITH ARROW +1F499 BLUE HEART +1F49A GREEN HEART +1F49B YELLOW HEART +1F49C PURPLE HEART +1F49D HEART WITH RIBBON +1F49E REVOLVING HEARTS +1F49F HEART DECORATION +1F4A0 DIAMOND SHAPE WITH A DOT INSIDE +1F4A1 ELECTRIC LIGHT BULB +1F4A2 ANGER SYMBOL +1F4A3 BOMB +1F4A4 SLEEPING SYMBOL +1F4A5 COLLISION SYMBOL +1F4A6 SPLASHING SWEAT SYMBOL +1F4A7 DROPLET +1F4A8 DASH SYMBOL +1F4A9 PILE OF POO +1F4AA FLEXED BICEPS +1F4AB DIZZY SYMBOL +1F4AC SPEECH BALLOON +1F4AD THOUGHT BALLOON +1F4AE WHITE FLOWER +1F4AF HUNDRED POINTS SYMBOL +1F4B0 MONEY BAG +1F4B1 CURRENCY EXCHANGE +1F4B2 HEAVY DOLLAR SIGN +1F4B3 CREDIT CARD +1F4B4 BANKNOTE WITH YEN SIGN +1F4B5 BANKNOTE WITH DOLLAR SIGN +1F4B6 BANKNOTE WITH EURO SIGN +1F4B7 BANKNOTE WITH POUND SIGN +1F4B8 MONEY WITH WINGS +1F4B9 CHART WITH UPWARDS TREND AND YEN SIGN +1F4BA SEAT +1F4BB PERSONAL COMPUTER +1F4BC BRIEFCASE +1F4BD MINIDISC +1F4BE FLOPPY DISK +1F4BF OPTICAL DISC +1F4C0 DVD +1F4C1 FILE FOLDER +1F4C2 OPEN FILE FOLDER +1F4C3 PAGE WITH CURL +1F4C4 PAGE FACING UP +1F4C5 CALENDAR +1F4C6 TEAR-OFF CALENDAR +1F4C7 CARD INDEX +1F4C8 CHART WITH UPWARDS TREND +1F4C9 CHART WITH DOWNWARDS TREND +1F4CA BAR CHART +1F4CB CLIPBOARD +1F4CC PUSHPIN +1F4CD ROUND PUSHPIN +1F4CE PAPERCLIP +1F4CF STRAIGHT RULER +1F4D0 TRIANGULAR RULER +1F4D1 BOOKMARK TABS +1F4D2 LEDGER +1F4D3 NOTEBOOK +1F4D4 NOTEBOOK WITH DECORATIVE COVER +1F4D5 CLOSED BOOK +1F4D6 OPEN BOOK +1F4D7 GREEN BOOK +1F4D8 BLUE BOOK +1F4D9 ORANGE BOOK +1F4DA BOOKS +1F4DB NAME BADGE +1F4DC SCROLL +1F4DD MEMO +1F4DE TELEPHONE RECEIVER +1F4DF PAGER +1F4E0 FAX MACHINE +1F4E1 SATELLITE ANTENNA +1F4E2 PUBLIC ADDRESS LOUDSPEAKER +1F4E3 CHEERING MEGAPHONE +1F4E4 OUTBOX TRAY +1F4E5 INBOX TRAY +1F4E6 PACKAGE +1F4E7 E-MAIL SYMBOL +1F4E8 INCOMING ENVELOPE +1F4E9 ENVELOPE WITH DOWNWARDS ARROW ABOVE +1F4EA CLOSED MAILBOX WITH LOWERED FLAG +1F4EB CLOSED MAILBOX WITH RAISED FLAG +1F4EC OPEN MAILBOX WITH RAISED FLAG +1F4ED OPEN MAILBOX WITH LOWERED FLAG +1F4EE POSTBOX +1F4EF POSTAL HORN +1F4F0 NEWSPAPER +1F4F1 MOBILE PHONE +1F4F2 MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT +1F4F3 VIBRATION MODE +1F4F4 MOBILE PHONE OFF +1F4F5 NO MOBILE PHONES +1F4F6 ANTENNA WITH BARS +1F4F7 CAMERA +1F4F8 CAMERA WITH FLASH +1F4F9 VIDEO CAMERA +1F4FA TELEVISION +1F4FB RADIO +1F4FC VIDEOCASSETTE +1F4FD FILM PROJECTOR +1F4FE PORTABLE STEREO +1F4FF PRAYER BEADS +1F500 TWISTED RIGHTWARDS ARROWS +1F501 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS +1F502 CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY +1F503 CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F504 ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS +1F505 LOW BRIGHTNESS SYMBOL +1F506 HIGH BRIGHTNESS SYMBOL +1F507 SPEAKER WITH CANCELLATION STROKE +1F508 SPEAKER +1F509 SPEAKER WITH ONE SOUND WAVE +1F50A SPEAKER WITH THREE SOUND WAVES +1F50B BATTERY +1F50C ELECTRIC PLUG +1F50D LEFT-POINTING MAGNIFYING GLASS +1F50E RIGHT-POINTING MAGNIFYING GLASS +1F50F LOCK WITH INK PEN +1F510 CLOSED LOCK WITH KEY +1F511 KEY +1F512 LOCK +1F513 OPEN LOCK +1F514 BELL +1F515 BELL WITH CANCELLATION STROKE +1F516 BOOKMARK +1F517 LINK SYMBOL +1F518 RADIO BUTTON +1F519 BACK WITH LEFTWARDS ARROW ABOVE +1F51A END WITH LEFTWARDS ARROW ABOVE +1F51B ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE +1F51C SOON WITH RIGHTWARDS ARROW ABOVE +1F51D TOP WITH UPWARDS ARROW ABOVE +1F51E NO ONE UNDER EIGHTEEN SYMBOL +1F51F KEYCAP TEN +1F520 INPUT SYMBOL FOR LATIN CAPITAL LETTERS +1F521 INPUT SYMBOL FOR LATIN SMALL LETTERS +1F522 INPUT SYMBOL FOR NUMBERS +1F523 INPUT SYMBOL FOR SYMBOLS +1F524 INPUT SYMBOL FOR LATIN LETTERS +1F525 FIRE +1F526 ELECTRIC TORCH +1F527 WRENCH +1F528 HAMMER +1F529 NUT AND BOLT +1F52A HOCHO +1F52B PISTOL +1F52C MICROSCOPE +1F52D TELESCOPE +1F52E CRYSTAL BALL +1F52F SIX POINTED STAR WITH MIDDLE DOT +1F530 JAPANESE SYMBOL FOR BEGINNER +1F531 TRIDENT EMBLEM +1F532 BLACK SQUARE BUTTON +1F533 WHITE SQUARE BUTTON +1F534 LARGE RED CIRCLE +1F535 LARGE BLUE CIRCLE +1F536 LARGE ORANGE DIAMOND +1F537 LARGE BLUE DIAMOND +1F538 SMALL ORANGE DIAMOND +1F539 SMALL BLUE DIAMOND +1F53A UP-POINTING RED TRIANGLE +1F53B DOWN-POINTING RED TRIANGLE +1F53C UP-POINTING SMALL RED TRIANGLE +1F53D DOWN-POINTING SMALL RED TRIANGLE +1F53E LOWER RIGHT SHADOWED WHITE CIRCLE +1F53F UPPER RIGHT SHADOWED WHITE CIRCLE +1F540 CIRCLED CROSS POMMEE +1F541 CROSS POMMEE WITH HALF-CIRCLE BELOW +1F542 CROSS POMMEE +1F543 NOTCHED LEFT SEMICIRCLE WITH THREE DOTS +1F544 NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS +1F545 SYMBOL FOR MARKS CHAPTER +1F546 WHITE LATIN CROSS +1F547 HEAVY LATIN CROSS +1F548 CELTIC CROSS +1F549 OM SYMBOL +1F54A DOVE OF PEACE +1F54B KAABA +1F54C MOSQUE +1F54D SYNAGOGUE +1F54E MENORAH WITH NINE BRANCHES +1F54F BOWL OF HYGIEIA +1F550 CLOCK FACE ONE OCLOCK +1F551 CLOCK FACE TWO OCLOCK +1F552 CLOCK FACE THREE OCLOCK +1F553 CLOCK FACE FOUR OCLOCK +1F554 CLOCK FACE FIVE OCLOCK +1F555 CLOCK FACE SIX OCLOCK +1F556 CLOCK FACE SEVEN OCLOCK +1F557 CLOCK FACE EIGHT OCLOCK +1F558 CLOCK FACE NINE OCLOCK +1F559 CLOCK FACE TEN OCLOCK +1F55A CLOCK FACE ELEVEN OCLOCK +1F55B CLOCK FACE TWELVE OCLOCK +1F55C CLOCK FACE ONE-THIRTY +1F55D CLOCK FACE TWO-THIRTY +1F55E CLOCK FACE THREE-THIRTY +1F55F CLOCK FACE FOUR-THIRTY +1F560 CLOCK FACE FIVE-THIRTY +1F561 CLOCK FACE SIX-THIRTY +1F562 CLOCK FACE SEVEN-THIRTY +1F563 CLOCK FACE EIGHT-THIRTY +1F564 CLOCK FACE NINE-THIRTY +1F565 CLOCK FACE TEN-THIRTY +1F566 CLOCK FACE ELEVEN-THIRTY +1F567 CLOCK FACE TWELVE-THIRTY +1F568 RIGHT SPEAKER +1F569 RIGHT SPEAKER WITH ONE SOUND WAVE +1F56A RIGHT SPEAKER WITH THREE SOUND WAVES +1F56B BULLHORN +1F56C BULLHORN WITH SOUND WAVES +1F56D RINGING BELL +1F56E BOOK +1F56F CANDLE +1F570 MANTELPIECE CLOCK +1F571 BLACK SKULL AND CROSSBONES +1F572 NO PIRACY +1F573 HOLE +1F574 MAN IN BUSINESS SUIT LEVITATING +1F575 SLEUTH OR SPY +1F576 DARK SUNGLASSES +1F577 SPIDER +1F578 SPIDER WEB +1F579 JOYSTICK +1F57A MAN DANCING +1F57B LEFT HAND TELEPHONE RECEIVER +1F57C TELEPHONE RECEIVER WITH PAGE +1F57D RIGHT HAND TELEPHONE RECEIVER +1F57E WHITE TOUCHTONE TELEPHONE +1F57F BLACK TOUCHTONE TELEPHONE +1F580 TELEPHONE ON TOP OF MODEM +1F581 CLAMSHELL MOBILE PHONE +1F582 BACK OF ENVELOPE +1F583 STAMPED ENVELOPE +1F584 ENVELOPE WITH LIGHTNING +1F585 FLYING ENVELOPE +1F586 PEN OVER STAMPED ENVELOPE +1F587 LINKED PAPERCLIPS +1F588 BLACK PUSHPIN +1F589 LOWER LEFT PENCIL +1F58A LOWER LEFT BALLPOINT PEN +1F58B LOWER LEFT FOUNTAIN PEN +1F58C LOWER LEFT PAINTBRUSH +1F58D LOWER LEFT CRAYON +1F58E LEFT WRITING HAND +1F58F TURNED OK HAND SIGN +1F590 RAISED HAND WITH FINGERS SPLAYED +1F591 REVERSED RAISED HAND WITH FINGERS SPLAYED +1F592 REVERSED THUMBS UP SIGN +1F593 REVERSED THUMBS DOWN SIGN +1F594 REVERSED VICTORY HAND +1F595 REVERSED HAND WITH MIDDLE FINGER EXTENDED +1F596 RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597 WHITE DOWN POINTING LEFT HAND INDEX +1F598 SIDEWAYS WHITE LEFT POINTING INDEX +1F599 SIDEWAYS WHITE RIGHT POINTING INDEX +1F59A SIDEWAYS BLACK LEFT POINTING INDEX +1F59B SIDEWAYS BLACK RIGHT POINTING INDEX +1F59C BLACK LEFT POINTING BACKHAND INDEX +1F59D BLACK RIGHT POINTING BACKHAND INDEX +1F59E SIDEWAYS WHITE UP POINTING INDEX +1F59F SIDEWAYS WHITE DOWN POINTING INDEX +1F5A0 SIDEWAYS BLACK UP POINTING INDEX +1F5A1 SIDEWAYS BLACK DOWN POINTING INDEX +1F5A2 BLACK UP POINTING BACKHAND INDEX +1F5A3 BLACK DOWN POINTING BACKHAND INDEX +1F5A4 BLACK HEART +1F5A5 DESKTOP COMPUTER +1F5A6 KEYBOARD AND MOUSE +1F5A7 THREE NETWORKED COMPUTERS +1F5A8 PRINTER +1F5A9 POCKET CALCULATOR +1F5AA BLACK HARD SHELL FLOPPY DISK +1F5AB WHITE HARD SHELL FLOPPY DISK +1F5AC SOFT SHELL FLOPPY DISK +1F5AD TAPE CARTRIDGE +1F5AE WIRED KEYBOARD +1F5AF ONE BUTTON MOUSE +1F5B0 TWO BUTTON MOUSE +1F5B1 THREE BUTTON MOUSE +1F5B2 TRACKBALL +1F5B3 OLD PERSONAL COMPUTER +1F5B4 HARD DISK +1F5B5 SCREEN +1F5B6 PRINTER ICON +1F5B7 FAX ICON +1F5B8 OPTICAL DISC ICON +1F5B9 DOCUMENT WITH TEXT +1F5BA DOCUMENT WITH TEXT AND PICTURE +1F5BB DOCUMENT WITH PICTURE +1F5BC FRAME WITH PICTURE +1F5BD FRAME WITH TILES +1F5BE FRAME WITH AN X +1F5BF BLACK FOLDER +1F5C0 FOLDER +1F5C1 OPEN FOLDER +1F5C2 CARD INDEX DIVIDERS +1F5C3 CARD FILE BOX +1F5C4 FILE CABINET +1F5C5 EMPTY NOTE +1F5C6 EMPTY NOTE PAGE +1F5C7 EMPTY NOTE PAD +1F5C8 NOTE +1F5C9 NOTE PAGE +1F5CA NOTE PAD +1F5CB EMPTY DOCUMENT +1F5CC EMPTY PAGE +1F5CD EMPTY PAGES +1F5CE DOCUMENT +1F5CF PAGE +1F5D0 PAGES +1F5D1 WASTEBASKET +1F5D2 SPIRAL NOTE PAD +1F5D3 SPIRAL CALENDAR PAD +1F5D4 DESKTOP WINDOW +1F5D5 MINIMIZE +1F5D6 MAXIMIZE +1F5D7 OVERLAP +1F5D8 CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS +1F5D9 CANCELLATION X +1F5DA INCREASE FONT SIZE SYMBOL +1F5DB DECREASE FONT SIZE SYMBOL +1F5DC COMPRESSION +1F5DD OLD KEY +1F5DE ROLLED-UP NEWSPAPER +1F5DF PAGE WITH CIRCLED TEXT +1F5E0 STOCK CHART +1F5E1 DAGGER KNIFE +1F5E2 LIPS +1F5E3 SPEAKING HEAD IN SILHOUETTE +1F5E4 THREE RAYS ABOVE +1F5E5 THREE RAYS BELOW +1F5E6 THREE RAYS LEFT +1F5E7 THREE RAYS RIGHT +1F5E8 LEFT SPEECH BUBBLE +1F5E9 RIGHT SPEECH BUBBLE +1F5EA TWO SPEECH BUBBLES +1F5EB THREE SPEECH BUBBLES +1F5EC LEFT THOUGHT BUBBLE +1F5ED RIGHT THOUGHT BUBBLE +1F5EE LEFT ANGER BUBBLE +1F5EF RIGHT ANGER BUBBLE +1F5F0 MOOD BUBBLE +1F5F1 LIGHTNING MOOD BUBBLE +1F5F2 LIGHTNING MOOD +1F5F3 BALLOT BOX WITH BALLOT +1F5F4 BALLOT SCRIPT X +1F5F5 BALLOT BOX WITH SCRIPT X +1F5F6 BALLOT BOLD SCRIPT X +1F5F7 BALLOT BOX WITH BOLD SCRIPT X +1F5F8 LIGHT CHECK MARK +1F5F9 BALLOT BOX WITH BOLD CHECK +1F5FA WORLD MAP +1F5FB MOUNT FUJI +1F5FC TOKYO TOWER +1F5FD STATUE OF LIBERTY +1F5FE SILHOUETTE OF JAPAN +1F5FF MOYAI +1F600 GRINNING FACE +1F601 GRINNING FACE WITH SMILING EYES +1F602 FACE WITH TEARS OF JOY +1F603 SMILING FACE WITH OPEN MOUTH +1F604 SMILING FACE WITH OPEN MOUTH AND SMILING EYES +1F605 SMILING FACE WITH OPEN MOUTH AND COLD SWEAT +1F606 SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES +1F607 SMILING FACE WITH HALO +1F608 SMILING FACE WITH HORNS +1F609 WINKING FACE +1F60A SMILING FACE WITH SMILING EYES +1F60B FACE SAVOURING DELICIOUS FOOD +1F60C RELIEVED FACE +1F60D SMILING FACE WITH HEART-SHAPED EYES +1F60E SMILING FACE WITH SUNGLASSES +1F60F SMIRKING FACE +1F610 NEUTRAL FACE +1F611 EXPRESSIONLESS FACE +1F612 UNAMUSED FACE +1F613 FACE WITH COLD SWEAT +1F614 PENSIVE FACE +1F615 CONFUSED FACE +1F616 CONFOUNDED FACE +1F617 KISSING FACE +1F618 FACE THROWING A KISS +1F619 KISSING FACE WITH SMILING EYES +1F61A KISSING FACE WITH CLOSED EYES +1F61B FACE WITH STUCK-OUT TONGUE +1F61C FACE WITH STUCK-OUT TONGUE AND WINKING EYE +1F61D FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES +1F61E DISAPPOINTED FACE +1F61F WORRIED FACE +1F620 ANGRY FACE +1F621 POUTING FACE +1F622 CRYING FACE +1F623 PERSEVERING FACE +1F624 FACE WITH LOOK OF TRIUMPH +1F625 DISAPPOINTED BUT RELIEVED FACE +1F626 FROWNING FACE WITH OPEN MOUTH +1F627 ANGUISHED FACE +1F628 FEARFUL FACE +1F629 WEARY FACE +1F62A SLEEPY FACE +1F62B TIRED FACE +1F62C GRIMACING FACE +1F62D LOUDLY CRYING FACE +1F62E FACE WITH OPEN MOUTH +1F62F HUSHED FACE +1F630 FACE WITH OPEN MOUTH AND COLD SWEAT +1F631 FACE SCREAMING IN FEAR +1F632 ASTONISHED FACE +1F633 FLUSHED FACE +1F634 SLEEPING FACE +1F635 DIZZY FACE +1F636 FACE WITHOUT MOUTH +1F637 FACE WITH MEDICAL MASK +1F638 GRINNING CAT FACE WITH SMILING EYES +1F639 CAT FACE WITH TEARS OF JOY +1F63A SMILING CAT FACE WITH OPEN MOUTH +1F63B SMILING CAT FACE WITH HEART-SHAPED EYES +1F63C CAT FACE WITH WRY SMILE +1F63D KISSING CAT FACE WITH CLOSED EYES +1F63E POUTING CAT FACE +1F63F CRYING CAT FACE +1F640 WEARY CAT FACE +1F641 SLIGHTLY FROWNING FACE +1F642 SLIGHTLY SMILING FACE +1F643 UPSIDE-DOWN FACE +1F644 FACE WITH ROLLING EYES +1F645 FACE WITH NO GOOD GESTURE +1F646 FACE WITH OK GESTURE +1F647 PERSON BOWING DEEPLY +1F648 SEE-NO-EVIL MONKEY +1F649 HEAR-NO-EVIL MONKEY +1F64A SPEAK-NO-EVIL MONKEY +1F64B HAPPY PERSON RAISING ONE HAND +1F64C PERSON RAISING BOTH HANDS IN CELEBRATION +1F64D PERSON FROWNING +1F64E PERSON WITH POUTING FACE +1F64F PERSON WITH FOLDED HANDS +1F650 NORTH WEST POINTING LEAF +1F651 SOUTH WEST POINTING LEAF +1F652 NORTH EAST POINTING LEAF +1F653 SOUTH EAST POINTING LEAF +1F654 TURNED NORTH WEST POINTING LEAF +1F655 TURNED SOUTH WEST POINTING LEAF +1F656 TURNED NORTH EAST POINTING LEAF +1F657 TURNED SOUTH EAST POINTING LEAF +1F658 NORTH WEST POINTING VINE LEAF +1F659 SOUTH WEST POINTING VINE LEAF +1F65A NORTH EAST POINTING VINE LEAF +1F65B SOUTH EAST POINTING VINE LEAF +1F65C HEAVY NORTH WEST POINTING VINE LEAF +1F65D HEAVY SOUTH WEST POINTING VINE LEAF +1F65E HEAVY NORTH EAST POINTING VINE LEAF +1F65F HEAVY SOUTH EAST POINTING VINE LEAF +1F660 NORTH WEST POINTING BUD +1F661 SOUTH WEST POINTING BUD +1F662 NORTH EAST POINTING BUD +1F663 SOUTH EAST POINTING BUD +1F664 HEAVY NORTH WEST POINTING BUD +1F665 HEAVY SOUTH WEST POINTING BUD +1F666 HEAVY NORTH EAST POINTING BUD +1F667 HEAVY SOUTH EAST POINTING BUD +1F668 HOLLOW QUILT SQUARE ORNAMENT +1F669 HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66A SOLID QUILT SQUARE ORNAMENT +1F66B SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE +1F66C LEFTWARDS ROCKET +1F66D UPWARDS ROCKET +1F66E RIGHTWARDS ROCKET +1F66F DOWNWARDS ROCKET +1F670 SCRIPT LIGATURE ET ORNAMENT +1F671 HEAVY SCRIPT LIGATURE ET ORNAMENT +1F672 LIGATURE OPEN ET ORNAMENT +1F673 HEAVY LIGATURE OPEN ET ORNAMENT +1F674 HEAVY AMPERSAND ORNAMENT +1F675 SWASH AMPERSAND ORNAMENT +1F676 SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT +1F677 SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT +1F678 SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +1F679 HEAVY INTERROBANG ORNAMENT +1F67A SANS-SERIF INTERROBANG ORNAMENT +1F67B HEAVY SANS-SERIF INTERROBANG ORNAMENT +1F67C VERY HEAVY SOLIDUS +1F67D VERY HEAVY REVERSE SOLIDUS +1F67E CHECKER BOARD +1F67F REVERSE CHECKER BOARD +1F680 ROCKET +1F681 HELICOPTER +1F682 STEAM LOCOMOTIVE +1F683 RAILWAY CAR +1F684 HIGH-SPEED TRAIN +1F685 HIGH-SPEED TRAIN WITH BULLET NOSE +1F686 TRAIN +1F687 METRO +1F688 LIGHT RAIL +1F689 STATION +1F68A TRAM +1F68B TRAM CAR +1F68C BUS +1F68D ONCOMING BUS +1F68E TROLLEYBUS +1F68F BUS STOP +1F690 MINIBUS +1F691 AMBULANCE +1F692 FIRE ENGINE +1F693 POLICE CAR +1F694 ONCOMING POLICE CAR +1F695 TAXI +1F696 ONCOMING TAXI +1F697 AUTOMOBILE +1F698 ONCOMING AUTOMOBILE +1F699 RECREATIONAL VEHICLE +1F69A DELIVERY TRUCK +1F69B ARTICULATED LORRY +1F69C TRACTOR +1F69D MONORAIL +1F69E MOUNTAIN RAILWAY +1F69F SUSPENSION RAILWAY +1F6A0 MOUNTAIN CABLEWAY +1F6A1 AERIAL TRAMWAY +1F6A2 SHIP +1F6A3 ROWBOAT +1F6A4 SPEEDBOAT +1F6A5 HORIZONTAL TRAFFIC LIGHT +1F6A6 VERTICAL TRAFFIC LIGHT +1F6A7 CONSTRUCTION SIGN +1F6A8 POLICE CARS REVOLVING LIGHT +1F6A9 TRIANGULAR FLAG ON POST +1F6AA DOOR +1F6AB NO ENTRY SIGN +1F6AC SMOKING SYMBOL +1F6AD NO SMOKING SYMBOL +1F6AE PUT LITTER IN ITS PLACE SYMBOL +1F6AF DO NOT LITTER SYMBOL +1F6B0 POTABLE WATER SYMBOL +1F6B1 NON-POTABLE WATER SYMBOL +1F6B2 BICYCLE +1F6B3 NO BICYCLES +1F6B4 BICYCLIST +1F6B5 MOUNTAIN BICYCLIST +1F6B6 PEDESTRIAN +1F6B7 NO PEDESTRIANS +1F6B8 CHILDREN CROSSING +1F6B9 MENS SYMBOL +1F6BA WOMENS SYMBOL +1F6BB RESTROOM +1F6BC BABY SYMBOL +1F6BD TOILET +1F6BE WATER CLOSET +1F6BF SHOWER +1F6C0 BATH +1F6C1 BATHTUB +1F6C2 PASSPORT CONTROL +1F6C3 CUSTOMS +1F6C4 BAGGAGE CLAIM +1F6C5 LEFT LUGGAGE +1F6C6 TRIANGLE WITH ROUNDED CORNERS +1F6C7 PROHIBITED SIGN +1F6C8 CIRCLED INFORMATION SOURCE +1F6C9 BOYS SYMBOL +1F6CA GIRLS SYMBOL +1F6CB COUCH AND LAMP +1F6CC SLEEPING ACCOMMODATION +1F6CD SHOPPING BAGS +1F6CE BELLHOP BELL +1F6CF BED +1F6D0 PLACE OF WORSHIP +1F6D1 OCTAGONAL SIGN +1F6D2 SHOPPING TROLLEY +1F6D3 STUPA +1F6D4 PAGODA +1F6E0 HAMMER AND WRENCH +1F6E1 SHIELD +1F6E2 OIL DRUM +1F6E3 MOTORWAY +1F6E4 RAILWAY TRACK +1F6E5 MOTOR BOAT +1F6E6 UP-POINTING MILITARY AIRPLANE +1F6E7 UP-POINTING AIRPLANE +1F6E8 UP-POINTING SMALL AIRPLANE +1F6E9 SMALL AIRPLANE +1F6EA NORTHEAST-POINTING AIRPLANE +1F6EB AIRPLANE DEPARTURE +1F6EC AIRPLANE ARRIVING +1F6F0 SATELLITE +1F6F1 ONCOMING FIRE ENGINE +1F6F2 DIESEL LOCOMOTIVE +1F6F3 PASSENGER SHIP +1F6F4 SCOOTER +1F6F5 MOTOR SCOOTER +1F6F6 CANOE +1F6F7 SLED +1F6F8 FLYING SAUCER +1F700 ALCHEMICAL SYMBOL FOR QUINTESSENCE +1F701 ALCHEMICAL SYMBOL FOR AIR +1F702 ALCHEMICAL SYMBOL FOR FIRE +1F703 ALCHEMICAL SYMBOL FOR EARTH +1F704 ALCHEMICAL SYMBOL FOR WATER +1F705 ALCHEMICAL SYMBOL FOR AQUAFORTIS +1F706 ALCHEMICAL SYMBOL FOR AQUA REGIA +1F707 ALCHEMICAL SYMBOL FOR AQUA REGIA-2 +1F708 ALCHEMICAL SYMBOL FOR AQUA VITAE +1F709 ALCHEMICAL SYMBOL FOR AQUA VITAE-2 +1F70A ALCHEMICAL SYMBOL FOR VINEGAR +1F70B ALCHEMICAL SYMBOL FOR VINEGAR-2 +1F70C ALCHEMICAL SYMBOL FOR VINEGAR-3 +1F70D ALCHEMICAL SYMBOL FOR SULFUR +1F70E ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR +1F70F ALCHEMICAL SYMBOL FOR BLACK SULFUR +1F710 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE +1F711 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2 +1F712 ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3 +1F713 ALCHEMICAL SYMBOL FOR CINNABAR +1F714 ALCHEMICAL SYMBOL FOR SALT +1F715 ALCHEMICAL SYMBOL FOR NITRE +1F716 ALCHEMICAL SYMBOL FOR VITRIOL +1F717 ALCHEMICAL SYMBOL FOR VITRIOL-2 +1F718 ALCHEMICAL SYMBOL FOR ROCK SALT +1F719 ALCHEMICAL SYMBOL FOR ROCK SALT-2 +1F71A ALCHEMICAL SYMBOL FOR GOLD +1F71B ALCHEMICAL SYMBOL FOR SILVER +1F71C ALCHEMICAL SYMBOL FOR IRON ORE +1F71D ALCHEMICAL SYMBOL FOR IRON ORE-2 +1F71E ALCHEMICAL SYMBOL FOR CROCUS OF IRON +1F71F ALCHEMICAL SYMBOL FOR REGULUS OF IRON +1F720 ALCHEMICAL SYMBOL FOR COPPER ORE +1F721 ALCHEMICAL SYMBOL FOR IRON-COPPER ORE +1F722 ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER +1F723 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER +1F724 ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2 +1F725 ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE +1F726 ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE +1F727 ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER +1F728 ALCHEMICAL SYMBOL FOR VERDIGRIS +1F729 ALCHEMICAL SYMBOL FOR TIN ORE +1F72A ALCHEMICAL SYMBOL FOR LEAD ORE +1F72B ALCHEMICAL SYMBOL FOR ANTIMONY ORE +1F72C ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY +1F72D ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY +1F72E ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY +1F72F ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY +1F730 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY +1F731 ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2 +1F732 ALCHEMICAL SYMBOL FOR REGULUS +1F733 ALCHEMICAL SYMBOL FOR REGULUS-2 +1F734 ALCHEMICAL SYMBOL FOR REGULUS-3 +1F735 ALCHEMICAL SYMBOL FOR REGULUS-4 +1F736 ALCHEMICAL SYMBOL FOR ALKALI +1F737 ALCHEMICAL SYMBOL FOR ALKALI-2 +1F738 ALCHEMICAL SYMBOL FOR MARCASITE +1F739 ALCHEMICAL SYMBOL FOR SAL-AMMONIAC +1F73A ALCHEMICAL SYMBOL FOR ARSENIC +1F73B ALCHEMICAL SYMBOL FOR REALGAR +1F73C ALCHEMICAL SYMBOL FOR REALGAR-2 +1F73D ALCHEMICAL SYMBOL FOR AURIPIGMENT +1F73E ALCHEMICAL SYMBOL FOR BISMUTH ORE +1F73F ALCHEMICAL SYMBOL FOR TARTAR +1F740 ALCHEMICAL SYMBOL FOR TARTAR-2 +1F741 ALCHEMICAL SYMBOL FOR QUICK LIME +1F742 ALCHEMICAL SYMBOL FOR BORAX +1F743 ALCHEMICAL SYMBOL FOR BORAX-2 +1F744 ALCHEMICAL SYMBOL FOR BORAX-3 +1F745 ALCHEMICAL SYMBOL FOR ALUM +1F746 ALCHEMICAL SYMBOL FOR OIL +1F747 ALCHEMICAL SYMBOL FOR SPIRIT +1F748 ALCHEMICAL SYMBOL FOR TINCTURE +1F749 ALCHEMICAL SYMBOL FOR GUM +1F74A ALCHEMICAL SYMBOL FOR WAX +1F74B ALCHEMICAL SYMBOL FOR POWDER +1F74C ALCHEMICAL SYMBOL FOR CALX +1F74D ALCHEMICAL SYMBOL FOR TUTTY +1F74E ALCHEMICAL SYMBOL FOR CAPUT MORTUUM +1F74F ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE +1F750 ALCHEMICAL SYMBOL FOR CADUCEUS +1F751 ALCHEMICAL SYMBOL FOR TRIDENT +1F752 ALCHEMICAL SYMBOL FOR STARRED TRIDENT +1F753 ALCHEMICAL SYMBOL FOR LODESTONE +1F754 ALCHEMICAL SYMBOL FOR SOAP +1F755 ALCHEMICAL SYMBOL FOR URINE +1F756 ALCHEMICAL SYMBOL FOR HORSE DUNG +1F757 ALCHEMICAL SYMBOL FOR ASHES +1F758 ALCHEMICAL SYMBOL FOR POT ASHES +1F759 ALCHEMICAL SYMBOL FOR BRICK +1F75A ALCHEMICAL SYMBOL FOR POWDERED BRICK +1F75B ALCHEMICAL SYMBOL FOR AMALGAM +1F75C ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM +1F75D ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2 +1F75E ALCHEMICAL SYMBOL FOR SUBLIMATION +1F75F ALCHEMICAL SYMBOL FOR PRECIPITATE +1F760 ALCHEMICAL SYMBOL FOR DISTILL +1F761 ALCHEMICAL SYMBOL FOR DISSOLVE +1F762 ALCHEMICAL SYMBOL FOR DISSOLVE-2 +1F763 ALCHEMICAL SYMBOL FOR PURIFY +1F764 ALCHEMICAL SYMBOL FOR PUTREFACTION +1F765 ALCHEMICAL SYMBOL FOR CRUCIBLE +1F766 ALCHEMICAL SYMBOL FOR CRUCIBLE-2 +1F767 ALCHEMICAL SYMBOL FOR CRUCIBLE-3 +1F768 ALCHEMICAL SYMBOL FOR CRUCIBLE-4 +1F769 ALCHEMICAL SYMBOL FOR CRUCIBLE-5 +1F76A ALCHEMICAL SYMBOL FOR ALEMBIC +1F76B ALCHEMICAL SYMBOL FOR BATH OF MARY +1F76C ALCHEMICAL SYMBOL FOR BATH OF VAPOURS +1F76D ALCHEMICAL SYMBOL FOR RETORT +1F76E ALCHEMICAL SYMBOL FOR HOUR +1F76F ALCHEMICAL SYMBOL FOR NIGHT +1F770 ALCHEMICAL SYMBOL FOR DAY-NIGHT +1F771 ALCHEMICAL SYMBOL FOR MONTH +1F772 ALCHEMICAL SYMBOL FOR HALF DRAM +1F773 ALCHEMICAL SYMBOL FOR HALF OUNCE +1F780 BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE +1F781 BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE +1F782 BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE +1F783 BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE +1F784 BLACK SLIGHTLY SMALL CIRCLE +1F785 MEDIUM BOLD WHITE CIRCLE +1F786 BOLD WHITE CIRCLE +1F787 HEAVY WHITE CIRCLE +1F788 VERY HEAVY WHITE CIRCLE +1F789 EXTREMELY HEAVY WHITE CIRCLE +1F78A WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE +1F78B ROUND TARGET +1F78C BLACK TINY SQUARE +1F78D BLACK SLIGHTLY SMALL SQUARE +1F78E LIGHT WHITE SQUARE +1F78F MEDIUM WHITE SQUARE +1F790 BOLD WHITE SQUARE +1F791 HEAVY WHITE SQUARE +1F792 VERY HEAVY WHITE SQUARE +1F793 EXTREMELY HEAVY WHITE SQUARE +1F794 WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE +1F795 WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE +1F796 SQUARE TARGET +1F797 BLACK TINY DIAMOND +1F798 BLACK VERY SMALL DIAMOND +1F799 BLACK MEDIUM SMALL DIAMOND +1F79A WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND +1F79B WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND +1F79C DIAMOND TARGET +1F79D BLACK TINY LOZENGE +1F79E BLACK VERY SMALL LOZENGE +1F79F BLACK MEDIUM SMALL LOZENGE +1F7A0 WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE +1F7A1 THIN GREEK CROSS +1F7A2 LIGHT GREEK CROSS +1F7A3 MEDIUM GREEK CROSS +1F7A4 BOLD GREEK CROSS +1F7A5 VERY BOLD GREEK CROSS +1F7A6 VERY HEAVY GREEK CROSS +1F7A7 EXTREMELY HEAVY GREEK CROSS +1F7A8 THIN SALTIRE +1F7A9 LIGHT SALTIRE +1F7AA MEDIUM SALTIRE +1F7AB BOLD SALTIRE +1F7AC HEAVY SALTIRE +1F7AD VERY HEAVY SALTIRE +1F7AE EXTREMELY HEAVY SALTIRE +1F7AF LIGHT FIVE SPOKED ASTERISK +1F7B0 MEDIUM FIVE SPOKED ASTERISK +1F7B1 BOLD FIVE SPOKED ASTERISK +1F7B2 HEAVY FIVE SPOKED ASTERISK +1F7B3 VERY HEAVY FIVE SPOKED ASTERISK +1F7B4 EXTREMELY HEAVY FIVE SPOKED ASTERISK +1F7B5 LIGHT SIX SPOKED ASTERISK +1F7B6 MEDIUM SIX SPOKED ASTERISK +1F7B7 BOLD SIX SPOKED ASTERISK +1F7B8 HEAVY SIX SPOKED ASTERISK +1F7B9 VERY HEAVY SIX SPOKED ASTERISK +1F7BA EXTREMELY HEAVY SIX SPOKED ASTERISK +1F7BB LIGHT EIGHT SPOKED ASTERISK +1F7BC MEDIUM EIGHT SPOKED ASTERISK +1F7BD BOLD EIGHT SPOKED ASTERISK +1F7BE HEAVY EIGHT SPOKED ASTERISK +1F7BF VERY HEAVY EIGHT SPOKED ASTERISK +1F7C0 LIGHT THREE POINTED BLACK STAR +1F7C1 MEDIUM THREE POINTED BLACK STAR +1F7C2 THREE POINTED BLACK STAR +1F7C3 MEDIUM THREE POINTED PINWHEEL STAR +1F7C4 LIGHT FOUR POINTED BLACK STAR +1F7C5 MEDIUM FOUR POINTED BLACK STAR +1F7C6 FOUR POINTED BLACK STAR +1F7C7 MEDIUM FOUR POINTED PINWHEEL STAR +1F7C8 REVERSE LIGHT FOUR POINTED PINWHEEL STAR +1F7C9 LIGHT FIVE POINTED BLACK STAR +1F7CA HEAVY FIVE POINTED BLACK STAR +1F7CB MEDIUM SIX POINTED BLACK STAR +1F7CC HEAVY SIX POINTED BLACK STAR +1F7CD SIX POINTED PINWHEEL STAR +1F7CE MEDIUM EIGHT POINTED BLACK STAR +1F7CF HEAVY EIGHT POINTED BLACK STAR +1F7D0 VERY HEAVY EIGHT POINTED BLACK STAR +1F7D1 HEAVY EIGHT POINTED PINWHEEL STAR +1F7D2 LIGHT TWELVE POINTED BLACK STAR +1F7D3 HEAVY TWELVE POINTED BLACK STAR +1F7D4 HEAVY TWELVE POINTED PINWHEEL STAR +1F800 LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F801 UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F802 RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F803 DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD +1F804 LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F805 UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F806 RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F807 DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD +1F808 LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F809 UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80A RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80B DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810 LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F811 UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F812 RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F813 DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD +1F814 LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F815 UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F816 RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F817 DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F818 HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F819 HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81A HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81B HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD +1F81C HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81D HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81E HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F81F HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD +1F820 LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F821 UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F822 RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F823 DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT +1F824 LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F825 UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F826 RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F827 DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT +1F828 LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F829 UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82A RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82B DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT +1F82C LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82D UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82E RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F82F DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT +1F830 LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F831 UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F832 RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F833 DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT +1F834 LEFTWARDS FINGER-POST ARROW +1F835 UPWARDS FINGER-POST ARROW +1F836 RIGHTWARDS FINGER-POST ARROW +1F837 DOWNWARDS FINGER-POST ARROW +1F838 LEFTWARDS SQUARED ARROW +1F839 UPWARDS SQUARED ARROW +1F83A RIGHTWARDS SQUARED ARROW +1F83B DOWNWARDS SQUARED ARROW +1F83C LEFTWARDS COMPRESSED ARROW +1F83D UPWARDS COMPRESSED ARROW +1F83E RIGHTWARDS COMPRESSED ARROW +1F83F DOWNWARDS COMPRESSED ARROW +1F840 LEFTWARDS HEAVY COMPRESSED ARROW +1F841 UPWARDS HEAVY COMPRESSED ARROW +1F842 RIGHTWARDS HEAVY COMPRESSED ARROW +1F843 DOWNWARDS HEAVY COMPRESSED ARROW +1F844 LEFTWARDS HEAVY ARROW +1F845 UPWARDS HEAVY ARROW +1F846 RIGHTWARDS HEAVY ARROW +1F847 DOWNWARDS HEAVY ARROW +1F850 LEFTWARDS SANS-SERIF ARROW +1F851 UPWARDS SANS-SERIF ARROW +1F852 RIGHTWARDS SANS-SERIF ARROW +1F853 DOWNWARDS SANS-SERIF ARROW +1F854 NORTH WEST SANS-SERIF ARROW +1F855 NORTH EAST SANS-SERIF ARROW +1F856 SOUTH EAST SANS-SERIF ARROW +1F857 SOUTH WEST SANS-SERIF ARROW +1F858 LEFT RIGHT SANS-SERIF ARROW +1F859 UP DOWN SANS-SERIF ARROW +1F860 WIDE-HEADED LEFTWARDS LIGHT BARB ARROW +1F861 WIDE-HEADED UPWARDS LIGHT BARB ARROW +1F862 WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW +1F863 WIDE-HEADED DOWNWARDS LIGHT BARB ARROW +1F864 WIDE-HEADED NORTH WEST LIGHT BARB ARROW +1F865 WIDE-HEADED NORTH EAST LIGHT BARB ARROW +1F866 WIDE-HEADED SOUTH EAST LIGHT BARB ARROW +1F867 WIDE-HEADED SOUTH WEST LIGHT BARB ARROW +1F868 WIDE-HEADED LEFTWARDS BARB ARROW +1F869 WIDE-HEADED UPWARDS BARB ARROW +1F86A WIDE-HEADED RIGHTWARDS BARB ARROW +1F86B WIDE-HEADED DOWNWARDS BARB ARROW +1F86C WIDE-HEADED NORTH WEST BARB ARROW +1F86D WIDE-HEADED NORTH EAST BARB ARROW +1F86E WIDE-HEADED SOUTH EAST BARB ARROW +1F86F WIDE-HEADED SOUTH WEST BARB ARROW +1F870 WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW +1F871 WIDE-HEADED UPWARDS MEDIUM BARB ARROW +1F872 WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW +1F873 WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW +1F874 WIDE-HEADED NORTH WEST MEDIUM BARB ARROW +1F875 WIDE-HEADED NORTH EAST MEDIUM BARB ARROW +1F876 WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW +1F877 WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW +1F878 WIDE-HEADED LEFTWARDS HEAVY BARB ARROW +1F879 WIDE-HEADED UPWARDS HEAVY BARB ARROW +1F87A WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW +1F87B WIDE-HEADED DOWNWARDS HEAVY BARB ARROW +1F87C WIDE-HEADED NORTH WEST HEAVY BARB ARROW +1F87D WIDE-HEADED NORTH EAST HEAVY BARB ARROW +1F87E WIDE-HEADED SOUTH EAST HEAVY BARB ARROW +1F87F WIDE-HEADED SOUTH WEST HEAVY BARB ARROW +1F880 WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW +1F881 WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW +1F882 WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW +1F883 WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW +1F884 WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW +1F885 WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW +1F886 WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW +1F887 WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890 LEFTWARDS TRIANGLE ARROWHEAD +1F891 UPWARDS TRIANGLE ARROWHEAD +1F892 RIGHTWARDS TRIANGLE ARROWHEAD +1F893 DOWNWARDS TRIANGLE ARROWHEAD +1F894 LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F895 UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F896 RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F897 DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD +1F898 LEFTWARDS ARROW WITH NOTCHED TAIL +1F899 UPWARDS ARROW WITH NOTCHED TAIL +1F89A RIGHTWARDS ARROW WITH NOTCHED TAIL +1F89B DOWNWARDS ARROW WITH NOTCHED TAIL +1F89C HEAVY ARROW SHAFT WIDTH ONE +1F89D HEAVY ARROW SHAFT WIDTH TWO THIRDS +1F89E HEAVY ARROW SHAFT WIDTH ONE HALF +1F89F HEAVY ARROW SHAFT WIDTH ONE THIRD +1F8A0 LEFTWARDS BOTTOM-SHADED WHITE ARROW +1F8A1 RIGHTWARDS BOTTOM SHADED WHITE ARROW +1F8A2 LEFTWARDS TOP SHADED WHITE ARROW +1F8A3 RIGHTWARDS TOP SHADED WHITE ARROW +1F8A4 LEFTWARDS LEFT-SHADED WHITE ARROW +1F8A5 RIGHTWARDS RIGHT-SHADED WHITE ARROW +1F8A6 LEFTWARDS RIGHT-SHADED WHITE ARROW +1F8A7 RIGHTWARDS LEFT-SHADED WHITE ARROW +1F8A8 LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8A9 RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW +1F8AA LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AB RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW +1F8AC WHITE ARROW SHAFT WIDTH ONE +1F8AD WHITE ARROW SHAFT WIDTH TWO THIRDS +1F900 CIRCLED CROSS FORMEE WITH FOUR DOTS +1F901 CIRCLED CROSS FORMEE WITH TWO DOTS +1F902 CIRCLED CROSS FORMEE +1F903 LEFT HALF CIRCLE WITH FOUR DOTS +1F904 LEFT HALF CIRCLE WITH THREE DOTS +1F905 LEFT HALF CIRCLE WITH TWO DOTS +1F906 LEFT HALF CIRCLE WITH DOT +1F907 LEFT HALF CIRCLE +1F908 DOWNWARD FACING HOOK +1F909 DOWNWARD FACING NOTCHED HOOK +1F90A DOWNWARD FACING HOOK WITH DOT +1F90B DOWNWARD FACING NOTCHED HOOK WITH DOT +1F910 ZIPPER-MOUTH FACE +1F911 MONEY-MOUTH FACE +1F912 FACE WITH THERMOMETER +1F913 NERD FACE +1F914 THINKING FACE +1F915 FACE WITH HEAD-BANDAGE +1F916 ROBOT FACE +1F917 HUGGING FACE +1F918 SIGN OF THE HORNS +1F919 CALL ME HAND +1F91A RAISED BACK OF HAND +1F91B LEFT-FACING FIST +1F91C RIGHT-FACING FIST +1F91D HANDSHAKE +1F91E HAND WITH INDEX AND MIDDLE FINGERS CROSSED +1F91F I LOVE YOU HAND SIGN +1F920 FACE WITH COWBOY HAT +1F921 CLOWN FACE +1F922 NAUSEATED FACE +1F923 ROLLING ON THE FLOOR LAUGHING +1F924 DROOLING FACE +1F925 LYING FACE +1F926 FACE PALM +1F927 SNEEZING FACE +1F928 FACE WITH ONE EYEBROW RAISED +1F929 GRINNING FACE WITH STAR EYES +1F92A GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE +1F92B FACE WITH FINGER COVERING CLOSED LIPS +1F92C SERIOUS FACE WITH SYMBOLS COVERING MOUTH +1F92D SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH +1F92E FACE WITH OPEN MOUTH VOMITING +1F92F SHOCKED FACE WITH EXPLODING HEAD +1F930 PREGNANT WOMAN +1F931 BREAST-FEEDING +1F932 PALMS UP TOGETHER +1F933 SELFIE +1F934 PRINCE +1F935 MAN IN TUXEDO +1F936 MOTHER CHRISTMAS +1F937 SHRUG +1F938 PERSON DOING CARTWHEEL +1F939 JUGGLING +1F93A FENCER +1F93B MODERN PENTATHLON +1F93C WRESTLERS +1F93D WATER POLO +1F93E HANDBALL +1F940 WILTED FLOWER +1F941 DRUM WITH DRUMSTICKS +1F942 CLINKING GLASSES +1F943 TUMBLER GLASS +1F944 SPOON +1F945 GOAL NET +1F946 RIFLE +1F947 FIRST PLACE MEDAL +1F948 SECOND PLACE MEDAL +1F949 THIRD PLACE MEDAL +1F94A BOXING GLOVE +1F94B MARTIAL ARTS UNIFORM +1F94C CURLING STONE +1F950 CROISSANT +1F951 AVOCADO +1F952 CUCUMBER +1F953 BACON +1F954 POTATO +1F955 CARROT +1F956 BAGUETTE BREAD +1F957 GREEN SALAD +1F958 SHALLOW PAN OF FOOD +1F959 STUFFED FLATBREAD +1F95A EGG +1F95B GLASS OF MILK +1F95C PEANUTS +1F95D KIWIFRUIT +1F95E PANCAKES +1F95F DUMPLING +1F960 FORTUNE COOKIE +1F961 TAKEOUT BOX +1F962 CHOPSTICKS +1F963 BOWL WITH SPOON +1F964 CUP WITH STRAW +1F965 COCONUT +1F966 BROCCOLI +1F967 PIE +1F968 PRETZEL +1F969 CUT OF MEAT +1F96A SANDWICH +1F96B CANNED FOOD +1F980 CRAB +1F981 LION FACE +1F982 SCORPION +1F983 TURKEY +1F984 UNICORN FACE +1F985 EAGLE +1F986 DUCK +1F987 BAT +1F988 SHARK +1F989 OWL +1F98A FOX FACE +1F98B BUTTERFLY +1F98C DEER +1F98D GORILLA +1F98E LIZARD +1F98F RHINOCEROS +1F990 SHRIMP +1F991 SQUID +1F992 GIRAFFE FACE +1F993 ZEBRA FACE +1F994 HEDGEHOG +1F995 SAUROPOD +1F996 T-REX +1F997 CRICKET +1F9C0 CHEESE WEDGE +1F9D0 FACE WITH MONOCLE +1F9D1 ADULT +1F9D2 CHILD +1F9D3 OLDER ADULT +1F9D4 BEARDED PERSON +1F9D5 PERSON WITH HEADSCARF +1F9D6 PERSON IN STEAMY ROOM +1F9D7 PERSON CLIMBING +1F9D8 PERSON IN LOTUS POSITION +1F9D9 MAGE +1F9DA FAIRY +1F9DB VAMPIRE +1F9DC MERPERSON +1F9DD ELF +1F9DE GENIE +1F9DF ZOMBIE +1F9E0 BRAIN +1F9E1 ORANGE HEART +1F9E2 BILLED CAP +1F9E3 SCARF +1F9E4 GLOVES +1F9E5 COAT +1F9E6 SOCKS +E0001 LANGUAGE TAG +E0020 TAG SPACE +E0021 TAG EXCLAMATION MARK +E0022 TAG QUOTATION MARK +E0023 TAG NUMBER SIGN +E0024 TAG DOLLAR SIGN +E0025 TAG PERCENT SIGN +E0026 TAG AMPERSAND +E0027 TAG APOSTROPHE +E0028 TAG LEFT PARENTHESIS +E0029 TAG RIGHT PARENTHESIS +E002A TAG ASTERISK +E002B TAG PLUS SIGN +E002C TAG COMMA +E002D TAG HYPHEN-MINUS +E002E TAG FULL STOP +E002F TAG SOLIDUS +E0030 TAG DIGIT ZERO +E0031 TAG DIGIT ONE +E0032 TAG DIGIT TWO +E0033 TAG DIGIT THREE +E0034 TAG DIGIT FOUR +E0035 TAG DIGIT FIVE +E0036 TAG DIGIT SIX +E0037 TAG DIGIT SEVEN +E0038 TAG DIGIT EIGHT +E0039 TAG DIGIT NINE +E003A TAG COLON +E003B TAG SEMICOLON +E003C TAG LESS-THAN SIGN +E003D TAG EQUALS SIGN +E003E TAG GREATER-THAN SIGN +E003F TAG QUESTION MARK +E0040 TAG COMMERCIAL AT +E0041 TAG LATIN CAPITAL LETTER A +E0042 TAG LATIN CAPITAL LETTER B +E0043 TAG LATIN CAPITAL LETTER C +E0044 TAG LATIN CAPITAL LETTER D +E0045 TAG LATIN CAPITAL LETTER E +E0046 TAG LATIN CAPITAL LETTER F +E0047 TAG LATIN CAPITAL LETTER G +E0048 TAG LATIN CAPITAL LETTER H +E0049 TAG LATIN CAPITAL LETTER I +E004A TAG LATIN CAPITAL LETTER J +E004B TAG LATIN CAPITAL LETTER K +E004C TAG LATIN CAPITAL LETTER L +E004D TAG LATIN CAPITAL LETTER M +E004E TAG LATIN CAPITAL LETTER N +E004F TAG LATIN CAPITAL LETTER O +E0050 TAG LATIN CAPITAL LETTER P +E0051 TAG LATIN CAPITAL LETTER Q +E0052 TAG LATIN CAPITAL LETTER R +E0053 TAG LATIN CAPITAL LETTER S +E0054 TAG LATIN CAPITAL LETTER T +E0055 TAG LATIN CAPITAL LETTER U +E0056 TAG LATIN CAPITAL LETTER V +E0057 TAG LATIN CAPITAL LETTER W +E0058 TAG LATIN CAPITAL LETTER X +E0059 TAG LATIN CAPITAL LETTER Y +E005A TAG LATIN CAPITAL LETTER Z +E005B TAG LEFT SQUARE BRACKET +E005C TAG REVERSE SOLIDUS +E005D TAG RIGHT SQUARE BRACKET +E005E TAG CIRCUMFLEX ACCENT +E005F TAG LOW LINE +E0060 TAG GRAVE ACCENT +E0061 TAG LATIN SMALL LETTER A +E0062 TAG LATIN SMALL LETTER B +E0063 TAG LATIN SMALL LETTER C +E0064 TAG LATIN SMALL LETTER D +E0065 TAG LATIN SMALL LETTER E +E0066 TAG LATIN SMALL LETTER F +E0067 TAG LATIN SMALL LETTER G +E0068 TAG LATIN SMALL LETTER H +E0069 TAG LATIN SMALL LETTER I +E006A TAG LATIN SMALL LETTER J +E006B TAG LATIN SMALL LETTER K +E006C TAG LATIN SMALL LETTER L +E006D TAG LATIN SMALL LETTER M +E006E TAG LATIN SMALL LETTER N +E006F TAG LATIN SMALL LETTER O +E0070 TAG LATIN SMALL LETTER P +E0071 TAG LATIN SMALL LETTER Q +E0072 TAG LATIN SMALL LETTER R +E0073 TAG LATIN SMALL LETTER S +E0074 TAG LATIN SMALL LETTER T +E0075 TAG LATIN SMALL LETTER U +E0076 TAG LATIN SMALL LETTER V +E0077 TAG LATIN SMALL LETTER W +E0078 TAG LATIN SMALL LETTER X +E0079 TAG LATIN SMALL LETTER Y +E007A TAG LATIN SMALL LETTER Z +E007B TAG LEFT CURLY BRACKET +E007C TAG VERTICAL LINE +E007D TAG RIGHT CURLY BRACKET +E007E TAG TILDE +E007F CANCEL TAG +E0100 VARIATION SELECTOR-17 +E0100 VS17 +E0101 VARIATION SELECTOR-18 +E0101 VS18 +E0102 VARIATION SELECTOR-19 +E0102 VS19 +E0103 VARIATION SELECTOR-20 +E0103 VS20 +E0104 VARIATION SELECTOR-21 +E0104 VS21 +E0105 VARIATION SELECTOR-22 +E0105 VS22 +E0106 VARIATION SELECTOR-23 +E0106 VS23 +E0107 VARIATION SELECTOR-24 +E0107 VS24 +E0108 VARIATION SELECTOR-25 +E0108 VS25 +E0109 VARIATION SELECTOR-26 +E0109 VS26 +E010A VARIATION SELECTOR-27 +E010A VS27 +E010B VARIATION SELECTOR-28 +E010B VS28 +E010C VARIATION SELECTOR-29 +E010C VS29 +E010D VARIATION SELECTOR-30 +E010D VS30 +E010E VARIATION SELECTOR-31 +E010E VS31 +E010F VARIATION SELECTOR-32 +E010F VS32 +E0110 VARIATION SELECTOR-33 +E0110 VS33 +E0111 VARIATION SELECTOR-34 +E0111 VS34 +E0112 VARIATION SELECTOR-35 +E0112 VS35 +E0113 VARIATION SELECTOR-36 +E0113 VS36 +E0114 VARIATION SELECTOR-37 +E0114 VS37 +E0115 VARIATION SELECTOR-38 +E0115 VS38 +E0116 VARIATION SELECTOR-39 +E0116 VS39 +E0117 VARIATION SELECTOR-40 +E0117 VS40 +E0118 VARIATION SELECTOR-41 +E0118 VS41 +E0119 VARIATION SELECTOR-42 +E0119 VS42 +E011A VARIATION SELECTOR-43 +E011A VS43 +E011B VARIATION SELECTOR-44 +E011B VS44 +E011C VARIATION SELECTOR-45 +E011C VS45 +E011D VARIATION SELECTOR-46 +E011D VS46 +E011E VARIATION SELECTOR-47 +E011E VS47 +E011F VARIATION SELECTOR-48 +E011F VS48 +E0120 VARIATION SELECTOR-49 +E0120 VS49 +E0121 VARIATION SELECTOR-50 +E0121 VS50 +E0122 VARIATION SELECTOR-51 +E0122 VS51 +E0123 VARIATION SELECTOR-52 +E0123 VS52 +E0124 VARIATION SELECTOR-53 +E0124 VS53 +E0125 VARIATION SELECTOR-54 +E0125 VS54 +E0126 VARIATION SELECTOR-55 +E0126 VS55 +E0127 VARIATION SELECTOR-56 +E0127 VS56 +E0128 VARIATION SELECTOR-57 +E0128 VS57 +E0129 VARIATION SELECTOR-58 +E0129 VS58 +E012A VARIATION SELECTOR-59 +E012A VS59 +E012B VARIATION SELECTOR-60 +E012B VS60 +E012C VARIATION SELECTOR-61 +E012C VS61 +E012D VARIATION SELECTOR-62 +E012D VS62 +E012E VARIATION SELECTOR-63 +E012E VS63 +E012F VARIATION SELECTOR-64 +E012F VS64 +E0130 VARIATION SELECTOR-65 +E0130 VS65 +E0131 VARIATION SELECTOR-66 +E0131 VS66 +E0132 VARIATION SELECTOR-67 +E0132 VS67 +E0133 VARIATION SELECTOR-68 +E0133 VS68 +E0134 VARIATION SELECTOR-69 +E0134 VS69 +E0135 VARIATION SELECTOR-70 +E0135 VS70 +E0136 VARIATION SELECTOR-71 +E0136 VS71 +E0137 VARIATION SELECTOR-72 +E0137 VS72 +E0138 VARIATION SELECTOR-73 +E0138 VS73 +E0139 VARIATION SELECTOR-74 +E0139 VS74 +E013A VARIATION SELECTOR-75 +E013A VS75 +E013B VARIATION SELECTOR-76 +E013B VS76 +E013C VARIATION SELECTOR-77 +E013C VS77 +E013D VARIATION SELECTOR-78 +E013D VS78 +E013E VARIATION SELECTOR-79 +E013E VS79 +E013F VARIATION SELECTOR-80 +E013F VS80 +E0140 VARIATION SELECTOR-81 +E0140 VS81 +E0141 VARIATION SELECTOR-82 +E0141 VS82 +E0142 VARIATION SELECTOR-83 +E0142 VS83 +E0143 VARIATION SELECTOR-84 +E0143 VS84 +E0144 VARIATION SELECTOR-85 +E0144 VS85 +E0145 VARIATION SELECTOR-86 +E0145 VS86 +E0146 VARIATION SELECTOR-87 +E0146 VS87 +E0147 VARIATION SELECTOR-88 +E0147 VS88 +E0148 VARIATION SELECTOR-89 +E0148 VS89 +E0149 VARIATION SELECTOR-90 +E0149 VS90 +E014A VARIATION SELECTOR-91 +E014A VS91 +E014B VARIATION SELECTOR-92 +E014B VS92 +E014C VARIATION SELECTOR-93 +E014C VS93 +E014D VARIATION SELECTOR-94 +E014D VS94 +E014E VARIATION SELECTOR-95 +E014E VS95 +E014F VARIATION SELECTOR-96 +E014F VS96 +E0150 VARIATION SELECTOR-97 +E0150 VS97 +E0151 VARIATION SELECTOR-98 +E0151 VS98 +E0152 VARIATION SELECTOR-99 +E0152 VS99 +E0153 VARIATION SELECTOR-100 +E0153 VS100 +E0154 VARIATION SELECTOR-101 +E0154 VS101 +E0155 VARIATION SELECTOR-102 +E0155 VS102 +E0156 VARIATION SELECTOR-103 +E0156 VS103 +E0157 VARIATION SELECTOR-104 +E0157 VS104 +E0158 VARIATION SELECTOR-105 +E0158 VS105 +E0159 VARIATION SELECTOR-106 +E0159 VS106 +E015A VARIATION SELECTOR-107 +E015A VS107 +E015B VARIATION SELECTOR-108 +E015B VS108 +E015C VARIATION SELECTOR-109 +E015C VS109 +E015D VARIATION SELECTOR-110 +E015D VS110 +E015E VARIATION SELECTOR-111 +E015E VS111 +E015F VARIATION SELECTOR-112 +E015F VS112 +E0160 VARIATION SELECTOR-113 +E0160 VS113 +E0161 VARIATION SELECTOR-114 +E0161 VS114 +E0162 VARIATION SELECTOR-115 +E0162 VS115 +E0163 VARIATION SELECTOR-116 +E0163 VS116 +E0164 VARIATION SELECTOR-117 +E0164 VS117 +E0165 VARIATION SELECTOR-118 +E0165 VS118 +E0166 VARIATION SELECTOR-119 +E0166 VS119 +E0167 VARIATION SELECTOR-120 +E0167 VS120 +E0168 VARIATION SELECTOR-121 +E0168 VS121 +E0169 VARIATION SELECTOR-122 +E0169 VS122 +E016A VARIATION SELECTOR-123 +E016A VS123 +E016B VARIATION SELECTOR-124 +E016B VS124 +E016C VARIATION SELECTOR-125 +E016C VS125 +E016D VARIATION SELECTOR-126 +E016D VS126 +E016E VARIATION SELECTOR-127 +E016E VS127 +E016F VARIATION SELECTOR-128 +E016F VS128 +E0170 VARIATION SELECTOR-129 +E0170 VS129 +E0171 VARIATION SELECTOR-130 +E0171 VS130 +E0172 VARIATION SELECTOR-131 +E0172 VS131 +E0173 VARIATION SELECTOR-132 +E0173 VS132 +E0174 VARIATION SELECTOR-133 +E0174 VS133 +E0175 VARIATION SELECTOR-134 +E0175 VS134 +E0176 VARIATION SELECTOR-135 +E0176 VS135 +E0177 VARIATION SELECTOR-136 +E0177 VS136 +E0178 VARIATION SELECTOR-137 +E0178 VS137 +E0179 VARIATION SELECTOR-138 +E0179 VS138 +E017A VARIATION SELECTOR-139 +E017A VS139 +E017B VARIATION SELECTOR-140 +E017B VS140 +E017C VARIATION SELECTOR-141 +E017C VS141 +E017D VARIATION SELECTOR-142 +E017D VS142 +E017E VARIATION SELECTOR-143 +E017E VS143 +E017F VARIATION SELECTOR-144 +E017F VS144 +E0180 VARIATION SELECTOR-145 +E0180 VS145 +E0181 VARIATION SELECTOR-146 +E0181 VS146 +E0182 VARIATION SELECTOR-147 +E0182 VS147 +E0183 VARIATION SELECTOR-148 +E0183 VS148 +E0184 VARIATION SELECTOR-149 +E0184 VS149 +E0185 VARIATION SELECTOR-150 +E0185 VS150 +E0186 VARIATION SELECTOR-151 +E0186 VS151 +E0187 VARIATION SELECTOR-152 +E0187 VS152 +E0188 VARIATION SELECTOR-153 +E0188 VS153 +E0189 VARIATION SELECTOR-154 +E0189 VS154 +E018A VARIATION SELECTOR-155 +E018A VS155 +E018B VARIATION SELECTOR-156 +E018B VS156 +E018C VARIATION SELECTOR-157 +E018C VS157 +E018D VARIATION SELECTOR-158 +E018D VS158 +E018E VARIATION SELECTOR-159 +E018E VS159 +E018F VARIATION SELECTOR-160 +E018F VS160 +E0190 VARIATION SELECTOR-161 +E0190 VS161 +E0191 VARIATION SELECTOR-162 +E0191 VS162 +E0192 VARIATION SELECTOR-163 +E0192 VS163 +E0193 VARIATION SELECTOR-164 +E0193 VS164 +E0194 VARIATION SELECTOR-165 +E0194 VS165 +E0195 VARIATION SELECTOR-166 +E0195 VS166 +E0196 VARIATION SELECTOR-167 +E0196 VS167 +E0197 VARIATION SELECTOR-168 +E0197 VS168 +E0198 VARIATION SELECTOR-169 +E0198 VS169 +E0199 VARIATION SELECTOR-170 +E0199 VS170 +E019A VARIATION SELECTOR-171 +E019A VS171 +E019B VARIATION SELECTOR-172 +E019B VS172 +E019C VARIATION SELECTOR-173 +E019C VS173 +E019D VARIATION SELECTOR-174 +E019D VS174 +E019E VARIATION SELECTOR-175 +E019E VS175 +E019F VARIATION SELECTOR-176 +E019F VS176 +E01A0 VARIATION SELECTOR-177 +E01A0 VS177 +E01A1 VARIATION SELECTOR-178 +E01A1 VS178 +E01A2 VARIATION SELECTOR-179 +E01A2 VS179 +E01A3 VARIATION SELECTOR-180 +E01A3 VS180 +E01A4 VARIATION SELECTOR-181 +E01A4 VS181 +E01A5 VARIATION SELECTOR-182 +E01A5 VS182 +E01A6 VARIATION SELECTOR-183 +E01A6 VS183 +E01A7 VARIATION SELECTOR-184 +E01A7 VS184 +E01A8 VARIATION SELECTOR-185 +E01A8 VS185 +E01A9 VARIATION SELECTOR-186 +E01A9 VS186 +E01AA VARIATION SELECTOR-187 +E01AA VS187 +E01AB VARIATION SELECTOR-188 +E01AB VS188 +E01AC VARIATION SELECTOR-189 +E01AC VS189 +E01AD VARIATION SELECTOR-190 +E01AD VS190 +E01AE VARIATION SELECTOR-191 +E01AE VS191 +E01AF VARIATION SELECTOR-192 +E01AF VS192 +E01B0 VARIATION SELECTOR-193 +E01B0 VS193 +E01B1 VARIATION SELECTOR-194 +E01B1 VS194 +E01B2 VARIATION SELECTOR-195 +E01B2 VS195 +E01B3 VARIATION SELECTOR-196 +E01B3 VS196 +E01B4 VARIATION SELECTOR-197 +E01B4 VS197 +E01B5 VARIATION SELECTOR-198 +E01B5 VS198 +E01B6 VARIATION SELECTOR-199 +E01B6 VS199 +E01B7 VARIATION SELECTOR-200 +E01B7 VS200 +E01B8 VARIATION SELECTOR-201 +E01B8 VS201 +E01B9 VARIATION SELECTOR-202 +E01B9 VS202 +E01BA VARIATION SELECTOR-203 +E01BA VS203 +E01BB VARIATION SELECTOR-204 +E01BB VS204 +E01BC VARIATION SELECTOR-205 +E01BC VS205 +E01BD VARIATION SELECTOR-206 +E01BD VS206 +E01BE VARIATION SELECTOR-207 +E01BE VS207 +E01BF VARIATION SELECTOR-208 +E01BF VS208 +E01C0 VARIATION SELECTOR-209 +E01C0 VS209 +E01C1 VARIATION SELECTOR-210 +E01C1 VS210 +E01C2 VARIATION SELECTOR-211 +E01C2 VS211 +E01C3 VARIATION SELECTOR-212 +E01C3 VS212 +E01C4 VARIATION SELECTOR-213 +E01C4 VS213 +E01C5 VARIATION SELECTOR-214 +E01C5 VS214 +E01C6 VARIATION SELECTOR-215 +E01C6 VS215 +E01C7 VARIATION SELECTOR-216 +E01C7 VS216 +E01C8 VARIATION SELECTOR-217 +E01C8 VS217 +E01C9 VARIATION SELECTOR-218 +E01C9 VS218 +E01CA VARIATION SELECTOR-219 +E01CA VS219 +E01CB VARIATION SELECTOR-220 +E01CB VS220 +E01CC VARIATION SELECTOR-221 +E01CC VS221 +E01CD VARIATION SELECTOR-222 +E01CD VS222 +E01CE VARIATION SELECTOR-223 +E01CE VS223 +E01CF VARIATION SELECTOR-224 +E01CF VS224 +E01D0 VARIATION SELECTOR-225 +E01D0 VS225 +E01D1 VARIATION SELECTOR-226 +E01D1 VS226 +E01D2 VARIATION SELECTOR-227 +E01D2 VS227 +E01D3 VARIATION SELECTOR-228 +E01D3 VS228 +E01D4 VARIATION SELECTOR-229 +E01D4 VS229 +E01D5 VARIATION SELECTOR-230 +E01D5 VS230 +E01D6 VARIATION SELECTOR-231 +E01D6 VS231 +E01D7 VARIATION SELECTOR-232 +E01D7 VS232 +E01D8 VARIATION SELECTOR-233 +E01D8 VS233 +E01D9 VARIATION SELECTOR-234 +E01D9 VS234 +E01DA VARIATION SELECTOR-235 +E01DA VS235 +E01DB VARIATION SELECTOR-236 +E01DB VS236 +E01DC VARIATION SELECTOR-237 +E01DC VS237 +E01DD VARIATION SELECTOR-238 +E01DD VS238 +E01DE VARIATION SELECTOR-239 +E01DE VS239 +E01DF VARIATION SELECTOR-240 +E01DF VS240 +E01E0 VARIATION SELECTOR-241 +E01E0 VS241 +E01E1 VARIATION SELECTOR-242 +E01E1 VS242 +E01E2 VARIATION SELECTOR-243 +E01E2 VS243 +E01E3 VARIATION SELECTOR-244 +E01E3 VS244 +E01E4 VARIATION SELECTOR-245 +E01E4 VS245 +E01E5 VARIATION SELECTOR-246 +E01E5 VS246 +E01E6 VARIATION SELECTOR-247 +E01E6 VS247 +E01E7 VARIATION SELECTOR-248 +E01E7 VS248 +E01E8 VARIATION SELECTOR-249 +E01E8 VS249 +E01E9 VARIATION SELECTOR-250 +E01E9 VS250 +E01EA VARIATION SELECTOR-251 +E01EA VS251 +E01EB VARIATION SELECTOR-252 +E01EB VS252 +E01EC VARIATION SELECTOR-253 +E01EC VS253 +E01ED VARIATION SELECTOR-254 +E01ED VS254 +E01EE VARIATION SELECTOR-255 +E01EE VS255 +E01EF VARIATION SELECTOR-256 +E01EF VS256 +0023 FE0F 20E3 KEYCAP NUMBER SIGN +002A FE0F 20E3 KEYCAP ASTERISK +0030 FE0F 20E3 KEYCAP DIGIT ZERO +0031 FE0F 20E3 KEYCAP DIGIT ONE +0032 FE0F 20E3 KEYCAP DIGIT TWO +0033 FE0F 20E3 KEYCAP DIGIT THREE +0034 FE0F 20E3 KEYCAP DIGIT FOUR +0035 FE0F 20E3 KEYCAP DIGIT FIVE +0036 FE0F 20E3 KEYCAP DIGIT SIX +0037 FE0F 20E3 KEYCAP DIGIT SEVEN +0038 FE0F 20E3 KEYCAP DIGIT EIGHT +0039 FE0F 20E3 KEYCAP DIGIT NINE +0100 0300 LATIN CAPITAL LETTER A WITH MACRON AND GRAVE +0101 0300 LATIN SMALL LETTER A WITH MACRON AND GRAVE +0045 0329 LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW +0065 0329 LATIN SMALL LETTER E WITH VERTICAL LINE BELOW +00C8 0329 LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND GRAVE +00E8 0329 LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND GRAVE +00C9 0329 LATIN CAPITAL LETTER E WITH VERTICAL LINE BELOW AND ACUTE +00E9 0329 LATIN SMALL LETTER E WITH VERTICAL LINE BELOW AND ACUTE +00CA 0304 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON +00EA 0304 LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON +00CA 030C LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON +00EA 030C LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON +012A 0300 LATIN CAPITAL LETTER I WITH MACRON AND GRAVE +012B 0300 LATIN SMALL LETTER I WITH MACRON AND GRAVE +0069 0307 0301 LATIN SMALL LETTER I WITH DOT ABOVE AND ACUTE +006E 0360 0067 LATIN SMALL LETTER NG WITH TILDE ABOVE +004F 0329 LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW +006F 0329 LATIN SMALL LETTER O WITH VERTICAL LINE BELOW +00D2 0329 LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND GRAVE +00F2 0329 LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND GRAVE +00D3 0329 LATIN CAPITAL LETTER O WITH VERTICAL LINE BELOW AND ACUTE +00F3 0329 LATIN SMALL LETTER O WITH VERTICAL LINE BELOW AND ACUTE +0053 0329 LATIN CAPITAL LETTER S WITH VERTICAL LINE BELOW +0073 0329 LATIN SMALL LETTER S WITH VERTICAL LINE BELOW +016A 0300 LATIN CAPITAL LETTER U WITH MACRON AND GRAVE +016B 0300 LATIN SMALL LETTER U WITH MACRON AND GRAVE +0104 0301 LATIN CAPITAL LETTER A WITH OGONEK AND ACUTE +0105 0301 LATIN SMALL LETTER A WITH OGONEK AND ACUTE +0104 0303 LATIN CAPITAL LETTER A WITH OGONEK AND TILDE +0105 0303 LATIN SMALL LETTER A WITH OGONEK AND TILDE +0118 0301 LATIN CAPITAL LETTER E WITH OGONEK AND ACUTE +0119 0301 LATIN SMALL LETTER E WITH OGONEK AND ACUTE +0118 0303 LATIN CAPITAL LETTER E WITH OGONEK AND TILDE +0119 0303 LATIN SMALL LETTER E WITH OGONEK AND TILDE +0116 0301 LATIN CAPITAL LETTER E WITH DOT ABOVE AND ACUTE +0117 0301 LATIN SMALL LETTER E WITH DOT ABOVE AND ACUTE +0116 0303 LATIN CAPITAL LETTER E WITH DOT ABOVE AND TILDE +0117 0303 LATIN SMALL LETTER E WITH DOT ABOVE AND TILDE +0069 0307 0300 LATIN SMALL LETTER I WITH DOT ABOVE AND GRAVE +0069 0307 0303 LATIN SMALL LETTER I WITH DOT ABOVE AND TILDE +012E 0301 LATIN CAPITAL LETTER I WITH OGONEK AND ACUTE +012F 0307 0301 LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND ACUTE +012E 0303 LATIN CAPITAL LETTER I WITH OGONEK AND TILDE +012F 0307 0303 LATIN SMALL LETTER I WITH OGONEK AND DOT ABOVE AND TILDE +004A 0303 LATIN CAPITAL LETTER J WITH TILDE +006A 0307 0303 LATIN SMALL LETTER J WITH DOT ABOVE AND TILDE +004C 0303 LATIN CAPITAL LETTER L WITH TILDE +006C 0303 LATIN SMALL LETTER L WITH TILDE +004D 0303 LATIN CAPITAL LETTER M WITH TILDE +006D 0303 LATIN SMALL LETTER M WITH TILDE +0052 0303 LATIN CAPITAL LETTER R WITH TILDE +0072 0303 LATIN SMALL LETTER R WITH TILDE +0172 0301 LATIN CAPITAL LETTER U WITH OGONEK AND ACUTE +0173 0301 LATIN SMALL LETTER U WITH OGONEK AND ACUTE +0172 0303 LATIN CAPITAL LETTER U WITH OGONEK AND TILDE +0173 0303 LATIN SMALL LETTER U WITH OGONEK AND TILDE +016A 0301 LATIN CAPITAL LETTER U WITH MACRON AND ACUTE +016B 0301 LATIN SMALL LETTER U WITH MACRON AND ACUTE +016A 0303 LATIN CAPITAL LETTER U WITH MACRON AND TILDE +016B 0303 LATIN SMALL LETTER U WITH MACRON AND TILDE +00E6 0300 LATIN SMALL LETTER AE WITH GRAVE +0254 0300 LATIN SMALL LETTER OPEN O WITH GRAVE +0254 0301 LATIN SMALL LETTER OPEN O WITH ACUTE +028C 0300 LATIN SMALL LETTER TURNED V WITH GRAVE +028C 0301 LATIN SMALL LETTER TURNED V WITH ACUTE +0259 0300 LATIN SMALL LETTER SCHWA WITH GRAVE +0259 0301 LATIN SMALL LETTER SCHWA WITH ACUTE +025A 0300 LATIN SMALL LETTER HOOKED SCHWA WITH GRAVE +025A 0301 LATIN SMALL LETTER HOOKED SCHWA WITH ACUTE +0626 0627 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF +0626 0648 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH WAW +0626 0649 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA +0626 06C6 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH OE +0626 06C7 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH U +0626 06C8 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH YU +0626 06D0 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH E +0626 06D5 ARABIC SEQUENCE YEH WITH HAMZA ABOVE WITH AE +0646 06A9 ARABIC SEQUENCE NOON WITH KEHEH +0995 09CD 09B7 BENGALI LETTER KHINYA +0B95 0BCD TAMIL CONSONANT K +0B99 0BCD TAMIL CONSONANT NG +0B9A 0BCD TAMIL CONSONANT C +0B9E 0BCD TAMIL CONSONANT NY +0B9F 0BCD TAMIL CONSONANT TT +0BA3 0BCD TAMIL CONSONANT NN +0BA4 0BCD TAMIL CONSONANT T +0BA8 0BCD TAMIL CONSONANT N +0BAA 0BCD TAMIL CONSONANT P +0BAE 0BCD TAMIL CONSONANT M +0BAF 0BCD TAMIL CONSONANT Y +0BB0 0BCD TAMIL CONSONANT R +0BB2 0BCD TAMIL CONSONANT L +0BB5 0BCD TAMIL CONSONANT V +0BB4 0BCD TAMIL CONSONANT LLL +0BB3 0BCD TAMIL CONSONANT LL +0BB1 0BCD TAMIL CONSONANT RR +0BA9 0BCD TAMIL CONSONANT NNN +0B9C 0BCD TAMIL CONSONANT J +0BB6 0BCD TAMIL CONSONANT SH +0BB7 0BCD TAMIL CONSONANT SS +0BB8 0BCD TAMIL CONSONANT S +0BB9 0BCD TAMIL CONSONANT H +0B95 0BCD 0BB7 0BCD TAMIL CONSONANT KSS +0B95 0BBE TAMIL SYLLABLE KAA +0B95 0BBF TAMIL SYLLABLE KI +0B95 0BC0 TAMIL SYLLABLE KII +0B95 0BC1 TAMIL SYLLABLE KU +0B95 0BC2 TAMIL SYLLABLE KUU +0B95 0BC6 TAMIL SYLLABLE KE +0B95 0BC7 TAMIL SYLLABLE KEE +0B95 0BC8 TAMIL SYLLABLE KAI +0B95 0BCA TAMIL SYLLABLE KO +0B95 0BCB TAMIL SYLLABLE KOO +0B95 0BCC TAMIL SYLLABLE KAU +0B99 0BBE TAMIL SYLLABLE NGAA +0B99 0BBF TAMIL SYLLABLE NGI +0B99 0BC0 TAMIL SYLLABLE NGII +0B99 0BC1 TAMIL SYLLABLE NGU +0B99 0BC2 TAMIL SYLLABLE NGUU +0B99 0BC6 TAMIL SYLLABLE NGE +0B99 0BC7 TAMIL SYLLABLE NGEE +0B99 0BC8 TAMIL SYLLABLE NGAI +0B99 0BCA TAMIL SYLLABLE NGO +0B99 0BCB TAMIL SYLLABLE NGOO +0B99 0BCC TAMIL SYLLABLE NGAU +0B9A 0BBE TAMIL SYLLABLE CAA +0B9A 0BBF TAMIL SYLLABLE CI +0B9A 0BC0 TAMIL SYLLABLE CII +0B9A 0BC1 TAMIL SYLLABLE CU +0B9A 0BC2 TAMIL SYLLABLE CUU +0B9A 0BC6 TAMIL SYLLABLE CE +0B9A 0BC7 TAMIL SYLLABLE CEE +0B9A 0BC8 TAMIL SYLLABLE CAI +0B9A 0BCA TAMIL SYLLABLE CO +0B9A 0BCB TAMIL SYLLABLE COO +0B9A 0BCC TAMIL SYLLABLE CAU +0B9E 0BBE TAMIL SYLLABLE NYAA +0B9E 0BBF TAMIL SYLLABLE NYI +0B9E 0BC0 TAMIL SYLLABLE NYII +0B9E 0BC1 TAMIL SYLLABLE NYU +0B9E 0BC2 TAMIL SYLLABLE NYUU +0B9E 0BC6 TAMIL SYLLABLE NYE +0B9E 0BC7 TAMIL SYLLABLE NYEE +0B9E 0BC8 TAMIL SYLLABLE NYAI +0B9E 0BCA TAMIL SYLLABLE NYO +0B9E 0BCB TAMIL SYLLABLE NYOO +0B9E 0BCC TAMIL SYLLABLE NYAU +0B9F 0BBE TAMIL SYLLABLE TTAA +0B9F 0BBF TAMIL SYLLABLE TTI +0B9F 0BC0 TAMIL SYLLABLE TTII +0B9F 0BC1 TAMIL SYLLABLE TTU +0B9F 0BC2 TAMIL SYLLABLE TTUU +0B9F 0BC6 TAMIL SYLLABLE TTE +0B9F 0BC7 TAMIL SYLLABLE TTEE +0B9F 0BC8 TAMIL SYLLABLE TTAI +0B9F 0BCA TAMIL SYLLABLE TTO +0B9F 0BCB TAMIL SYLLABLE TTOO +0B9F 0BCC TAMIL SYLLABLE TTAU +0BA3 0BBE TAMIL SYLLABLE NNAA +0BA3 0BBF TAMIL SYLLABLE NNI +0BA3 0BC0 TAMIL SYLLABLE NNII +0BA3 0BC1 TAMIL SYLLABLE NNU +0BA3 0BC2 TAMIL SYLLABLE NNUU +0BA3 0BC6 TAMIL SYLLABLE NNE +0BA3 0BC7 TAMIL SYLLABLE NNEE +0BA3 0BC8 TAMIL SYLLABLE NNAI +0BA3 0BCA TAMIL SYLLABLE NNO +0BA3 0BCB TAMIL SYLLABLE NNOO +0BA3 0BCC TAMIL SYLLABLE NNAU +0BA4 0BBE TAMIL SYLLABLE TAA +0BA4 0BBF TAMIL SYLLABLE TI +0BA4 0BC0 TAMIL SYLLABLE TII +0BA4 0BC1 TAMIL SYLLABLE TU +0BA4 0BC2 TAMIL SYLLABLE TUU +0BA4 0BC6 TAMIL SYLLABLE TE +0BA4 0BC7 TAMIL SYLLABLE TEE +0BA4 0BC8 TAMIL SYLLABLE TAI +0BA4 0BCA TAMIL SYLLABLE TO +0BA4 0BCB TAMIL SYLLABLE TOO +0BA4 0BCC TAMIL SYLLABLE TAU +0BA8 0BBE TAMIL SYLLABLE NAA +0BA8 0BBF TAMIL SYLLABLE NI +0BA8 0BC0 TAMIL SYLLABLE NII +0BA8 0BC1 TAMIL SYLLABLE NU +0BA8 0BC2 TAMIL SYLLABLE NUU +0BA8 0BC6 TAMIL SYLLABLE NE +0BA8 0BC7 TAMIL SYLLABLE NEE +0BA8 0BC8 TAMIL SYLLABLE NAI +0BA8 0BCA TAMIL SYLLABLE NO +0BA8 0BCB TAMIL SYLLABLE NOO +0BA8 0BCC TAMIL SYLLABLE NAU +0BAA 0BBE TAMIL SYLLABLE PAA +0BAA 0BBF TAMIL SYLLABLE PI +0BAA 0BC0 TAMIL SYLLABLE PII +0BAA 0BC1 TAMIL SYLLABLE PU +0BAA 0BC2 TAMIL SYLLABLE PUU +0BAA 0BC6 TAMIL SYLLABLE PE +0BAA 0BC7 TAMIL SYLLABLE PEE +0BAA 0BC8 TAMIL SYLLABLE PAI +0BAA 0BCA TAMIL SYLLABLE PO +0BAA 0BCB TAMIL SYLLABLE POO +0BAA 0BCC TAMIL SYLLABLE PAU +0BAE 0BBE TAMIL SYLLABLE MAA +0BAE 0BBF TAMIL SYLLABLE MI +0BAE 0BC0 TAMIL SYLLABLE MII +0BAE 0BC1 TAMIL SYLLABLE MU +0BAE 0BC2 TAMIL SYLLABLE MUU +0BAE 0BC6 TAMIL SYLLABLE ME +0BAE 0BC7 TAMIL SYLLABLE MEE +0BAE 0BC8 TAMIL SYLLABLE MAI +0BAE 0BCA TAMIL SYLLABLE MO +0BAE 0BCB TAMIL SYLLABLE MOO +0BAE 0BCC TAMIL SYLLABLE MAU +0BAF 0BBE TAMIL SYLLABLE YAA +0BAF 0BBF TAMIL SYLLABLE YI +0BAF 0BC0 TAMIL SYLLABLE YII +0BAF 0BC1 TAMIL SYLLABLE YU +0BAF 0BC2 TAMIL SYLLABLE YUU +0BAF 0BC6 TAMIL SYLLABLE YE +0BAF 0BC7 TAMIL SYLLABLE YEE +0BAF 0BC8 TAMIL SYLLABLE YAI +0BAF 0BCA TAMIL SYLLABLE YO +0BAF 0BCB TAMIL SYLLABLE YOO +0BAF 0BCC TAMIL SYLLABLE YAU +0BB0 0BBE TAMIL SYLLABLE RAA +0BB0 0BBF TAMIL SYLLABLE RI +0BB0 0BC0 TAMIL SYLLABLE RII +0BB0 0BC1 TAMIL SYLLABLE RU +0BB0 0BC2 TAMIL SYLLABLE RUU +0BB0 0BC6 TAMIL SYLLABLE RE +0BB0 0BC7 TAMIL SYLLABLE REE +0BB0 0BC8 TAMIL SYLLABLE RAI +0BB0 0BCA TAMIL SYLLABLE RO +0BB0 0BCB TAMIL SYLLABLE ROO +0BB0 0BCC TAMIL SYLLABLE RAU +0BB2 0BBE TAMIL SYLLABLE LAA +0BB2 0BBF TAMIL SYLLABLE LI +0BB2 0BC0 TAMIL SYLLABLE LII +0BB2 0BC1 TAMIL SYLLABLE LU +0BB2 0BC2 TAMIL SYLLABLE LUU +0BB2 0BC6 TAMIL SYLLABLE LE +0BB2 0BC7 TAMIL SYLLABLE LEE +0BB2 0BC8 TAMIL SYLLABLE LAI +0BB2 0BCA TAMIL SYLLABLE LO +0BB2 0BCB TAMIL SYLLABLE LOO +0BB2 0BCC TAMIL SYLLABLE LAU +0BB5 0BBE TAMIL SYLLABLE VAA +0BB5 0BBF TAMIL SYLLABLE VI +0BB5 0BC0 TAMIL SYLLABLE VII +0BB5 0BC1 TAMIL SYLLABLE VU +0BB5 0BC2 TAMIL SYLLABLE VUU +0BB5 0BC6 TAMIL SYLLABLE VE +0BB5 0BC7 TAMIL SYLLABLE VEE +0BB5 0BC8 TAMIL SYLLABLE VAI +0BB5 0BCA TAMIL SYLLABLE VO +0BB5 0BCB TAMIL SYLLABLE VOO +0BB5 0BCC TAMIL SYLLABLE VAU +0BB4 0BBE TAMIL SYLLABLE LLLAA +0BB4 0BBF TAMIL SYLLABLE LLLI +0BB4 0BC0 TAMIL SYLLABLE LLLII +0BB4 0BC1 TAMIL SYLLABLE LLLU +0BB4 0BC2 TAMIL SYLLABLE LLLUU +0BB4 0BC6 TAMIL SYLLABLE LLLE +0BB4 0BC7 TAMIL SYLLABLE LLLEE +0BB4 0BC8 TAMIL SYLLABLE LLLAI +0BB4 0BCA TAMIL SYLLABLE LLLO +0BB4 0BCB TAMIL SYLLABLE LLLOO +0BB4 0BCC TAMIL SYLLABLE LLLAU +0BB3 0BBE TAMIL SYLLABLE LLAA +0BB3 0BBF TAMIL SYLLABLE LLI +0BB3 0BC0 TAMIL SYLLABLE LLII +0BB3 0BC1 TAMIL SYLLABLE LLU +0BB3 0BC2 TAMIL SYLLABLE LLUU +0BB3 0BC6 TAMIL SYLLABLE LLE +0BB3 0BC7 TAMIL SYLLABLE LLEE +0BB3 0BC8 TAMIL SYLLABLE LLAI +0BB3 0BCA TAMIL SYLLABLE LLO +0BB3 0BCB TAMIL SYLLABLE LLOO +0BB3 0BCC TAMIL SYLLABLE LLAU +0BB1 0BBE TAMIL SYLLABLE RRAA +0BB1 0BBF TAMIL SYLLABLE RRI +0BB1 0BC0 TAMIL SYLLABLE RRII +0BB1 0BC1 TAMIL SYLLABLE RRU +0BB1 0BC2 TAMIL SYLLABLE RRUU +0BB1 0BC6 TAMIL SYLLABLE RRE +0BB1 0BC7 TAMIL SYLLABLE RREE +0BB1 0BC8 TAMIL SYLLABLE RRAI +0BB1 0BCA TAMIL SYLLABLE RRO +0BB1 0BCB TAMIL SYLLABLE RROO +0BB1 0BCC TAMIL SYLLABLE RRAU +0BA9 0BBE TAMIL SYLLABLE NNNAA +0BA9 0BBF TAMIL SYLLABLE NNNI +0BA9 0BC0 TAMIL SYLLABLE NNNII +0BA9 0BC1 TAMIL SYLLABLE NNNU +0BA9 0BC2 TAMIL SYLLABLE NNNUU +0BA9 0BC6 TAMIL SYLLABLE NNNE +0BA9 0BC7 TAMIL SYLLABLE NNNEE +0BA9 0BC8 TAMIL SYLLABLE NNNAI +0BA9 0BCA TAMIL SYLLABLE NNNO +0BA9 0BCB TAMIL SYLLABLE NNNOO +0BA9 0BCC TAMIL SYLLABLE NNNAU +0B9C 0BBE TAMIL SYLLABLE JAA +0B9C 0BBF TAMIL SYLLABLE JI +0B9C 0BC0 TAMIL SYLLABLE JII +0B9C 0BC1 TAMIL SYLLABLE JU +0B9C 0BC2 TAMIL SYLLABLE JUU +0B9C 0BC6 TAMIL SYLLABLE JE +0B9C 0BC7 TAMIL SYLLABLE JEE +0B9C 0BC8 TAMIL SYLLABLE JAI +0B9C 0BCA TAMIL SYLLABLE JO +0B9C 0BCB TAMIL SYLLABLE JOO +0B9C 0BCC TAMIL SYLLABLE JAU +0BB6 0BBE TAMIL SYLLABLE SHAA +0BB6 0BBF TAMIL SYLLABLE SHI +0BB6 0BC0 TAMIL SYLLABLE SHII +0BB6 0BC1 TAMIL SYLLABLE SHU +0BB6 0BC2 TAMIL SYLLABLE SHUU +0BB6 0BC6 TAMIL SYLLABLE SHE +0BB6 0BC7 TAMIL SYLLABLE SHEE +0BB6 0BC8 TAMIL SYLLABLE SHAI +0BB6 0BCA TAMIL SYLLABLE SHO +0BB6 0BCB TAMIL SYLLABLE SHOO +0BB6 0BCC TAMIL SYLLABLE SHAU +0BB7 0BBE TAMIL SYLLABLE SSAA +0BB7 0BBF TAMIL SYLLABLE SSI +0BB7 0BC0 TAMIL SYLLABLE SSII +0BB7 0BC1 TAMIL SYLLABLE SSU +0BB7 0BC2 TAMIL SYLLABLE SSUU +0BB7 0BC6 TAMIL SYLLABLE SSE +0BB7 0BC7 TAMIL SYLLABLE SSEE +0BB7 0BC8 TAMIL SYLLABLE SSAI +0BB7 0BCA TAMIL SYLLABLE SSO +0BB7 0BCB TAMIL SYLLABLE SSOO +0BB7 0BCC TAMIL SYLLABLE SSAU +0BB8 0BBE TAMIL SYLLABLE SAA +0BB8 0BBF TAMIL SYLLABLE SI +0BB8 0BC0 TAMIL SYLLABLE SII +0BB8 0BC1 TAMIL SYLLABLE SU +0BB8 0BC2 TAMIL SYLLABLE SUU +0BB8 0BC6 TAMIL SYLLABLE SE +0BB8 0BC7 TAMIL SYLLABLE SEE +0BB8 0BC8 TAMIL SYLLABLE SAI +0BB8 0BCA TAMIL SYLLABLE SO +0BB8 0BCB TAMIL SYLLABLE SOO +0BB8 0BCC TAMIL SYLLABLE SAU +0BB9 0BBE TAMIL SYLLABLE HAA +0BB9 0BBF TAMIL SYLLABLE HI +0BB9 0BC0 TAMIL SYLLABLE HII +0BB9 0BC1 TAMIL SYLLABLE HU +0BB9 0BC2 TAMIL SYLLABLE HUU +0BB9 0BC6 TAMIL SYLLABLE HE +0BB9 0BC7 TAMIL SYLLABLE HEE +0BB9 0BC8 TAMIL SYLLABLE HAI +0BB9 0BCA TAMIL SYLLABLE HO +0BB9 0BCB TAMIL SYLLABLE HOO +0BB9 0BCC TAMIL SYLLABLE HAU +0B95 0BCD 0BB7 TAMIL SYLLABLE KSSA +0B95 0BCD 0BB7 0BBE TAMIL SYLLABLE KSSAA +0B95 0BCD 0BB7 0BBF TAMIL SYLLABLE KSSI +0B95 0BCD 0BB7 0BC0 TAMIL SYLLABLE KSSII +0B95 0BCD 0BB7 0BC1 TAMIL SYLLABLE KSSU +0B95 0BCD 0BB7 0BC2 TAMIL SYLLABLE KSSUU +0B95 0BCD 0BB7 0BC6 TAMIL SYLLABLE KSSE +0B95 0BCD 0BB7 0BC7 TAMIL SYLLABLE KSSEE +0B95 0BCD 0BB7 0BC8 TAMIL SYLLABLE KSSAI +0B95 0BCD 0BB7 0BCA TAMIL SYLLABLE KSSO +0B95 0BCD 0BB7 0BCB TAMIL SYLLABLE KSSOO +0B95 0BCD 0BB7 0BCC TAMIL SYLLABLE KSSAU +0BB6 0BCD 0BB0 0BC0 TAMIL SYLLABLE SHRII +0DCA 200D 0DBA SINHALA CONSONANT SIGN YANSAYA +0DCA 200D 0DBB SINHALA CONSONANT SIGN RAKAARAANSAYA +0DBB 0DCA 200D SINHALA CONSONANT SIGN REPAYA +10E3 0302 GEORGIAN LETTER U-BRJGU +17D2 1780 KHMER CONSONANT SIGN COENG KA +17D2 1781 KHMER CONSONANT SIGN COENG KHA +17D2 1782 KHMER CONSONANT SIGN COENG KO +17D2 1783 KHMER CONSONANT SIGN COENG KHO +17D2 1784 KHMER CONSONANT SIGN COENG NGO +17D2 1785 KHMER CONSONANT SIGN COENG CA +17D2 1786 KHMER CONSONANT SIGN COENG CHA +17D2 1787 KHMER CONSONANT SIGN COENG CO +17D2 1788 KHMER CONSONANT SIGN COENG CHO +17D2 1789 KHMER CONSONANT SIGN COENG NYO +17D2 178A KHMER CONSONANT SIGN COENG DA +17D2 178B KHMER CONSONANT SIGN COENG TTHA +17D2 178C KHMER CONSONANT SIGN COENG DO +17D2 178D KHMER CONSONANT SIGN COENG TTHO +17D2 178E KHMER CONSONANT SIGN COENG NA +17D2 178F KHMER CONSONANT SIGN COENG TA +17D2 1790 KHMER CONSONANT SIGN COENG THA +17D2 1791 KHMER CONSONANT SIGN COENG TO +17D2 1792 KHMER CONSONANT SIGN COENG THO +17D2 1793 KHMER CONSONANT SIGN COENG NO +17D2 1794 KHMER CONSONANT SIGN COENG BA +17D2 1795 KHMER CONSONANT SIGN COENG PHA +17D2 1796 KHMER CONSONANT SIGN COENG PO +17D2 1797 KHMER CONSONANT SIGN COENG PHO +17D2 1798 KHMER CONSONANT SIGN COENG MO +17D2 1799 KHMER CONSONANT SIGN COENG YO +17D2 179A KHMER CONSONANT SIGN COENG RO +17D2 179B KHMER CONSONANT SIGN COENG LO +17D2 179C KHMER CONSONANT SIGN COENG VO +17D2 179D KHMER CONSONANT SIGN COENG SHA +17D2 179E KHMER CONSONANT SIGN COENG SSA +17D2 179F KHMER CONSONANT SIGN COENG SA +17D2 17A0 KHMER CONSONANT SIGN COENG HA +17D2 17A1 KHMER CONSONANT SIGN COENG LA +17D2 17A2 KHMER VOWEL SIGN COENG QA +17D2 17A7 KHMER INDEPENDENT VOWEL SIGN COENG QU +17D2 17AB KHMER INDEPENDENT VOWEL SIGN COENG RY +17D2 17AC KHMER INDEPENDENT VOWEL SIGN COENG RYY +17D2 17AF KHMER INDEPENDENT VOWEL SIGN COENG QE +17BB 17C6 KHMER VOWEL SIGN OM +17B6 17C6 KHMER VOWEL SIGN AAM +304B 309A HIRAGANA LETTER BIDAKUON NGA +304D 309A HIRAGANA LETTER BIDAKUON NGI +304F 309A HIRAGANA LETTER BIDAKUON NGU +3051 309A HIRAGANA LETTER BIDAKUON NGE +3053 309A HIRAGANA LETTER BIDAKUON NGO +30AB 309A KATAKANA LETTER BIDAKUON NGA +30AD 309A KATAKANA LETTER BIDAKUON NGI +30AF 309A KATAKANA LETTER BIDAKUON NGU +30B1 309A KATAKANA LETTER BIDAKUON NGE +30B3 309A KATAKANA LETTER BIDAKUON NGO +30BB 309A KATAKANA LETTER AINU CE +30C4 309A KATAKANA LETTER AINU TU +30C8 309A KATAKANA LETTER AINU TO +31F7 309A KATAKANA LETTER AINU P +02E5 02E9 MODIFIER LETTER EXTRA-HIGH EXTRA-LOW CONTOUR TONE BAR +02E9 02E5 MODIFIER LETTER EXTRA-LOW EXTRA-HIGH CONTOUR TONE BAR +END +10.0.0 +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +package charnames; + +# This module contains machine-generated tables and code for the +# algorithmically-determinable Unicode character names. The following +# routines can be used to translate between name and code point and vice versa + +{ # Closure + + # Matches legal code point. 4-6 hex numbers, If there are 6, the first + # two must be 10; if there are 5, the first must not be a 0. Written this + # way to decrease backtracking. The first regex allows the code point to + # be at the end of a word, but to work properly, the word shouldn't end + # with a valid hex character. The second one won't match a code point at + # the end of a word, and doesn't have the run-on issue + my $run_on_code_point_re = qr/(?^aax: (?: 10[0-9A-F]{4} | [1-9A-F][0-9A-F]{4} | [0-9A-F]{4} ) \b)/; + my $code_point_re = qr/(?^aa:\b(?^aax: (?: 10[0-9A-F]{4} | [1-9A-F][0-9A-F]{4} | [0-9A-F]{4} ) \b))/; + + # In the following hash, the keys are the bases of names which include + # the code point in the name, like CJK UNIFIED IDEOGRAPH-4E01. The value + # of each key is another hash which is used to get the low and high ends + # for each range of code points that apply to the name. + my %names_ending_in_code_point = ( +'CJK COMPATIBILITY IDEOGRAPH' => +{ +'high' => +[ +64109, +64217, +195101, +], +'low' => +[ +63744, +64112, +194560, +], +}, +'CJK UNIFIED IDEOGRAPH' => +{ +'high' => +[ +19893, +40938, +173782, +177972, +178205, +183969, +191456, +], +'low' => +[ +13312, +19968, +131072, +173824, +177984, +178208, +183984, +], +}, +'NUSHU CHARACTER' => +{ +'high' => +[ +111355, +], +'low' => +[ +110960, +], +}, +'TANGUT IDEOGRAPH' => +{ +'high' => +[ +100332, +], +'low' => +[ +94208, +], +}, + + ); + + # The following hash is a copy of the previous one, except is for loose + # matching, so each name has blanks and dashes squeezed out + my %loose_names_ending_in_code_point = ( +'CJKCOMPATIBILITYIDEOGRAPH' => +{ +'high' => +[ +64109, +64217, +195101, +], +'low' => +[ +63744, +64112, +194560, +], +}, +'CJKUNIFIEDIDEOGRAPH' => +{ +'high' => +[ +19893, +40938, +173782, +177972, +178205, +183969, +191456, +], +'low' => +[ +13312, +19968, +131072, +173824, +177984, +178208, +183984, +], +}, +'NUSHUCHARACTER' => +{ +'high' => +[ +111355, +], +'low' => +[ +110960, +], +}, +'TANGUTIDEOGRAPH' => +{ +'high' => +[ +100332, +], +'low' => +[ +94208, +], +}, + + ); + + # And the following array gives the inverse mapping from code points to + # names. Lowest code points are first + my @code_points_ending_in_code_point = ( + +{ +'high' => 19893, +'low' => 13312, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 40938, +'low' => 19968, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 64109, +'low' => 63744, +'name' => 'CJK COMPATIBILITY IDEOGRAPH', +}, +{ +'high' => 64217, +'low' => 64112, +'name' => 'CJK COMPATIBILITY IDEOGRAPH', +}, +{ +'high' => 100332, +'low' => 94208, +'name' => 'TANGUT IDEOGRAPH', +}, +{ +'high' => 111355, +'low' => 110960, +'name' => 'NUSHU CHARACTER', +}, +{ +'high' => 173782, +'low' => 131072, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 177972, +'low' => 173824, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 178205, +'low' => 177984, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 183969, +'low' => 178208, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 191456, +'low' => 183984, +'name' => 'CJK UNIFIED IDEOGRAPH', +}, +{ +'high' => 195101, +'low' => 194560, +'name' => 'CJK COMPATIBILITY IDEOGRAPH', +}, +, + + ); + + # Convert from code point to Jamo short name for use in composing Hangul + # syllable names + my %Jamo = ( +4352 => 'G', +4353 => 'GG', +4354 => 'N', +4355 => 'D', +4356 => 'DD', +4357 => 'R', +4358 => 'M', +4359 => 'B', +4360 => 'BB', +4361 => 'S', +4362 => 'SS', +4363 => '', +4364 => 'J', +4365 => 'JJ', +4366 => 'C', +4367 => 'K', +4368 => 'T', +4369 => 'P', +4370 => 'H', +4449 => 'A', +4450 => 'AE', +4451 => 'YA', +4452 => 'YAE', +4453 => 'EO', +4454 => 'E', +4455 => 'YEO', +4456 => 'YE', +4457 => 'O', +4458 => 'WA', +4459 => 'WAE', +4460 => 'OE', +4461 => 'YO', +4462 => 'U', +4463 => 'WEO', +4464 => 'WE', +4465 => 'WI', +4466 => 'YU', +4467 => 'EU', +4468 => 'YI', +4469 => 'I', +4520 => 'G', +4521 => 'GG', +4522 => 'GS', +4523 => 'N', +4524 => 'NJ', +4525 => 'NH', +4526 => 'D', +4527 => 'L', +4528 => 'LG', +4529 => 'LM', +4530 => 'LB', +4531 => 'LS', +4532 => 'LT', +4533 => 'LP', +4534 => 'LH', +4535 => 'M', +4536 => 'B', +4537 => 'BS', +4538 => 'S', +4539 => 'SS', +4540 => 'NG', +4541 => 'J', +4542 => 'C', +4543 => 'K', +4544 => 'T', +4545 => 'P', +4546 => 'H', + + ); + + # Leading consonant (can be null) + my %Jamo_L = ( +'' => 11, +'B' => 7, +'BB' => 8, +'C' => 14, +'D' => 3, +'DD' => 4, +'G' => 0, +'GG' => 1, +'H' => 18, +'J' => 12, +'JJ' => 13, +'K' => 15, +'M' => 6, +'N' => 2, +'P' => 17, +'R' => 5, +'S' => 9, +'SS' => 10, +'T' => 16, + + ); + + # Vowel + my %Jamo_V = ( +'A' => 0, +'AE' => 1, +'E' => 5, +'EO' => 4, +'EU' => 18, +'I' => 20, +'O' => 8, +'OE' => 11, +'U' => 13, +'WA' => 9, +'WAE' => 10, +'WE' => 15, +'WEO' => 14, +'WI' => 16, +'YA' => 2, +'YAE' => 3, +'YE' => 7, +'YEO' => 6, +'YI' => 19, +'YO' => 12, +'YU' => 17, + + ); + + # Optional trailing consonant + my %Jamo_T = ( +'B' => 17, +'BS' => 18, +'C' => 23, +'D' => 7, +'G' => 1, +'GG' => 2, +'GS' => 3, +'H' => 27, +'J' => 22, +'K' => 24, +'L' => 8, +'LB' => 11, +'LG' => 9, +'LH' => 15, +'LM' => 10, +'LP' => 14, +'LS' => 12, +'LT' => 13, +'M' => 16, +'N' => 4, +'NG' => 21, +'NH' => 6, +'NJ' => 5, +'P' => 26, +'S' => 19, +'SS' => 20, +'T' => 25, + + ); + + # Computed re that splits up a Hangul name into LVT or LV syllables + my $syllable_re = qr/(|B|BB|C|D|DD|G|GG|H|J|JJ|K|M|N|P|R|S|SS|T)(A|AE|E|EO|EU|I|O|OE|U|WA|WAE|WE|WEO|WI|YA|YAE|YE|YEO|YI|YO|YU)(B|BS|C|D|G|GG|GS|H|J|K|L|LB|LG|LH|LM|LP|LS|LT|M|N|NG|NH|NJ|P|S|SS|T)?/; + + my $HANGUL_SYLLABLE = "HANGUL SYLLABLE "; + my $loose_HANGUL_SYLLABLE = "HANGULSYLLABLE"; + + # These constants names and values were taken from the Unicode standard, + # version 5.1, section 3.12. They are used in conjunction with Hangul + # syllables + my $SBase = 0xAC00; + my $LBase = 0x1100; + my $VBase = 0x1161; + my $TBase = 0x11A7; + my $SCount = 11172; + my $LCount = 19; + my $VCount = 21; + my $TCount = 28; + my $NCount = $VCount * $TCount; + + sub name_to_code_point_special { + my ($name, $loose) = @_; + + # Returns undef if not one of the specially handled names; otherwise + # returns the code point equivalent to the input name + # $loose is non-zero if to use loose matching, 'name' in that case + # must be input as upper case with all blanks and dashes squeezed out. + + if ((! $loose && $name =~ s/$HANGUL_SYLLABLE//) + || ($loose && $name =~ s/$loose_HANGUL_SYLLABLE//)) + { + return if $name !~ qr/^$syllable_re$/; + my $L = $Jamo_L{$1}; + my $V = $Jamo_V{$2}; + my $T = (defined $3) ? $Jamo_T{$3} : 0; + return ($L * $VCount + $V) * $TCount + $T + $SBase; + } + + # Name must end in 'code_point' for this to handle. + return if (($loose && $name !~ /^ (.*?) ($run_on_code_point_re) $/x) + || (! $loose && $name !~ /^ (.*) ($code_point_re) $/x)); + + my $base = $1; + my $code_point = CORE::hex $2; + my $names_ref; + + if ($loose) { + $names_ref = \%loose_names_ending_in_code_point; + } + else { + return if $base !~ s/-$//; + $names_ref = \%names_ending_in_code_point; + } + + # Name must be one of the ones which has the code point in it. + return if ! $names_ref->{$base}; + + # Look through the list of ranges that apply to this name to see if + # the code point is in one of them. + for (my $i = 0; $i < scalar @{$names_ref->{$base}{'low'}}; $i++) { + return if $names_ref->{$base}{'low'}->[$i] > $code_point; + next if $names_ref->{$base}{'high'}->[$i] < $code_point; + + # Here, the code point is in the range. + return $code_point; + } + + # Here, looked like the name had a code point number in it, but + # did not match one of the valid ones. + return; + } + + sub code_point_to_name_special { + my $code_point = shift; + + # Returns the name of a code point if algorithmically determinable; + # undef if not + + # If in the Hangul range, calculate the name based on Unicode's + # algorithm + if ($code_point >= $SBase && $code_point <= $SBase + $SCount -1) { + use integer; + my $SIndex = $code_point - $SBase; + my $L = $LBase + $SIndex / $NCount; + my $V = $VBase + ($SIndex % $NCount) / $TCount; + my $T = $TBase + $SIndex % $TCount; + $name = "$HANGUL_SYLLABLE$Jamo{$L}$Jamo{$V}"; + $name .= $Jamo{$T} if $T != $TBase; + return $name; + } + + # Look through list of these code points for one in range. + foreach my $hash (@code_points_ending_in_code_point) { + return if $code_point < $hash->{'low'}; + if ($code_point <= $hash->{'high'}) { + return sprintf("%s-%04X", $hash->{'name'}, $code_point); + } + } + return; # None found + } +} # End closure + +1; +# Blocks-10.0.0.txt +# Date: 2017-04-12, 17:30:00 GMT [KW] +# © 2017 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Format: +# Start Code..End Code; Block Name + +# ================================================ + +# Note: When comparing block names, casing, whitespace, hyphens, +# and underbars are ignored. +# For example, "Latin Extended-A" and "latin extended a" are equivalent. +# For more information on the comparison of property values, +# see UAX #44: http://www.unicode.org/reports/tr44/ +# +# All block ranges start with a value where (cp MOD 16) = 0, +# and end with a value where (cp MOD 16) = 15. In other words, +# the last hexadecimal digit of the start of range is ...0 +# and the last hexadecimal digit of the end of range is ...F. +# This constraint on block ranges guarantees that allocations +# are done in terms of whole columns, and that code chart display +# never involves splitting columns in the charts. +# +# All code points not explicitly listed for Block +# have the value No_Block. + +# Property: Block +# +# @missing: 0000..10FFFF; No_Block + +0000..007F; Basic Latin +0080..00FF; Latin-1 Supplement +0100..017F; Latin Extended-A +0180..024F; Latin Extended-B +0250..02AF; IPA Extensions +02B0..02FF; Spacing Modifier Letters +0300..036F; Combining Diacritical Marks +0370..03FF; Greek and Coptic +0400..04FF; Cyrillic +0500..052F; Cyrillic Supplement +0530..058F; Armenian +0590..05FF; Hebrew +0600..06FF; Arabic +0700..074F; Syriac +0750..077F; Arabic Supplement +0780..07BF; Thaana +07C0..07FF; NKo +0800..083F; Samaritan +0840..085F; Mandaic +0860..086F; Syriac Supplement +08A0..08FF; Arabic Extended-A +0900..097F; Devanagari +0980..09FF; Bengali +0A00..0A7F; Gurmukhi +0A80..0AFF; Gujarati +0B00..0B7F; Oriya +0B80..0BFF; Tamil +0C00..0C7F; Telugu +0C80..0CFF; Kannada +0D00..0D7F; Malayalam +0D80..0DFF; Sinhala +0E00..0E7F; Thai +0E80..0EFF; Lao +0F00..0FFF; Tibetan +1000..109F; Myanmar +10A0..10FF; Georgian +1100..11FF; Hangul Jamo +1200..137F; Ethiopic +1380..139F; Ethiopic Supplement +13A0..13FF; Cherokee +1400..167F; Unified Canadian Aboriginal Syllabics +1680..169F; Ogham +16A0..16FF; Runic +1700..171F; Tagalog +1720..173F; Hanunoo +1740..175F; Buhid +1760..177F; Tagbanwa +1780..17FF; Khmer +1800..18AF; Mongolian +18B0..18FF; Unified Canadian Aboriginal Syllabics Extended +1900..194F; Limbu +1950..197F; Tai Le +1980..19DF; New Tai Lue +19E0..19FF; Khmer Symbols +1A00..1A1F; Buginese +1A20..1AAF; Tai Tham +1AB0..1AFF; Combining Diacritical Marks Extended +1B00..1B7F; Balinese +1B80..1BBF; Sundanese +1BC0..1BFF; Batak +1C00..1C4F; Lepcha +1C50..1C7F; Ol Chiki +1C80..1C8F; Cyrillic Extended-C +1CC0..1CCF; Sundanese Supplement +1CD0..1CFF; Vedic Extensions +1D00..1D7F; Phonetic Extensions +1D80..1DBF; Phonetic Extensions Supplement +1DC0..1DFF; Combining Diacritical Marks Supplement +1E00..1EFF; Latin Extended Additional +1F00..1FFF; Greek Extended +2000..206F; General Punctuation +2070..209F; Superscripts and Subscripts +20A0..20CF; Currency Symbols +20D0..20FF; Combining Diacritical Marks for Symbols +2100..214F; Letterlike Symbols +2150..218F; Number Forms +2190..21FF; Arrows +2200..22FF; Mathematical Operators +2300..23FF; Miscellaneous Technical +2400..243F; Control Pictures +2440..245F; Optical Character Recognition +2460..24FF; Enclosed Alphanumerics +2500..257F; Box Drawing +2580..259F; Block Elements +25A0..25FF; Geometric Shapes +2600..26FF; Miscellaneous Symbols +2700..27BF; Dingbats +27C0..27EF; Miscellaneous Mathematical Symbols-A +27F0..27FF; Supplemental Arrows-A +2800..28FF; Braille Patterns +2900..297F; Supplemental Arrows-B +2980..29FF; Miscellaneous Mathematical Symbols-B +2A00..2AFF; Supplemental Mathematical Operators +2B00..2BFF; Miscellaneous Symbols and Arrows +2C00..2C5F; Glagolitic +2C60..2C7F; Latin Extended-C +2C80..2CFF; Coptic +2D00..2D2F; Georgian Supplement +2D30..2D7F; Tifinagh +2D80..2DDF; Ethiopic Extended +2DE0..2DFF; Cyrillic Extended-A +2E00..2E7F; Supplemental Punctuation +2E80..2EFF; CJK Radicals Supplement +2F00..2FDF; Kangxi Radicals +2FF0..2FFF; Ideographic Description Characters +3000..303F; CJK Symbols and Punctuation +3040..309F; Hiragana +30A0..30FF; Katakana +3100..312F; Bopomofo +3130..318F; Hangul Compatibility Jamo +3190..319F; Kanbun +31A0..31BF; Bopomofo Extended +31C0..31EF; CJK Strokes +31F0..31FF; Katakana Phonetic Extensions +3200..32FF; Enclosed CJK Letters and Months +3300..33FF; CJK Compatibility +3400..4DBF; CJK Unified Ideographs Extension A +4DC0..4DFF; Yijing Hexagram Symbols +4E00..9FFF; CJK Unified Ideographs +A000..A48F; Yi Syllables +A490..A4CF; Yi Radicals +A4D0..A4FF; Lisu +A500..A63F; Vai +A640..A69F; Cyrillic Extended-B +A6A0..A6FF; Bamum +A700..A71F; Modifier Tone Letters +A720..A7FF; Latin Extended-D +A800..A82F; Syloti Nagri +A830..A83F; Common Indic Number Forms +A840..A87F; Phags-pa +A880..A8DF; Saurashtra +A8E0..A8FF; Devanagari Extended +A900..A92F; Kayah Li +A930..A95F; Rejang +A960..A97F; Hangul Jamo Extended-A +A980..A9DF; Javanese +A9E0..A9FF; Myanmar Extended-B +AA00..AA5F; Cham +AA60..AA7F; Myanmar Extended-A +AA80..AADF; Tai Viet +AAE0..AAFF; Meetei Mayek Extensions +AB00..AB2F; Ethiopic Extended-A +AB30..AB6F; Latin Extended-E +AB70..ABBF; Cherokee Supplement +ABC0..ABFF; Meetei Mayek +AC00..D7AF; Hangul Syllables +D7B0..D7FF; Hangul Jamo Extended-B +D800..DB7F; High Surrogates +DB80..DBFF; High Private Use Surrogates +DC00..DFFF; Low Surrogates +E000..F8FF; Private Use Area +F900..FAFF; CJK Compatibility Ideographs +FB00..FB4F; Alphabetic Presentation Forms +FB50..FDFF; Arabic Presentation Forms-A +FE00..FE0F; Variation Selectors +FE10..FE1F; Vertical Forms +FE20..FE2F; Combining Half Marks +FE30..FE4F; CJK Compatibility Forms +FE50..FE6F; Small Form Variants +FE70..FEFF; Arabic Presentation Forms-B +FF00..FFEF; Halfwidth and Fullwidth Forms +FFF0..FFFF; Specials +10000..1007F; Linear B Syllabary +10080..100FF; Linear B Ideograms +10100..1013F; Aegean Numbers +10140..1018F; Ancient Greek Numbers +10190..101CF; Ancient Symbols +101D0..101FF; Phaistos Disc +10280..1029F; Lycian +102A0..102DF; Carian +102E0..102FF; Coptic Epact Numbers +10300..1032F; Old Italic +10330..1034F; Gothic +10350..1037F; Old Permic +10380..1039F; Ugaritic +103A0..103DF; Old Persian +10400..1044F; Deseret +10450..1047F; Shavian +10480..104AF; Osmanya +104B0..104FF; Osage +10500..1052F; Elbasan +10530..1056F; Caucasian Albanian +10600..1077F; Linear A +10800..1083F; Cypriot Syllabary +10840..1085F; Imperial Aramaic +10860..1087F; Palmyrene +10880..108AF; Nabataean +108E0..108FF; Hatran +10900..1091F; Phoenician +10920..1093F; Lydian +10980..1099F; Meroitic Hieroglyphs +109A0..109FF; Meroitic Cursive +10A00..10A5F; Kharoshthi +10A60..10A7F; Old South Arabian +10A80..10A9F; Old North Arabian +10AC0..10AFF; Manichaean +10B00..10B3F; Avestan +10B40..10B5F; Inscriptional Parthian +10B60..10B7F; Inscriptional Pahlavi +10B80..10BAF; Psalter Pahlavi +10C00..10C4F; Old Turkic +10C80..10CFF; Old Hungarian +10E60..10E7F; Rumi Numeral Symbols +11000..1107F; Brahmi +11080..110CF; Kaithi +110D0..110FF; Sora Sompeng +11100..1114F; Chakma +11150..1117F; Mahajani +11180..111DF; Sharada +111E0..111FF; Sinhala Archaic Numbers +11200..1124F; Khojki +11280..112AF; Multani +112B0..112FF; Khudawadi +11300..1137F; Grantha +11400..1147F; Newa +11480..114DF; Tirhuta +11580..115FF; Siddham +11600..1165F; Modi +11660..1167F; Mongolian Supplement +11680..116CF; Takri +11700..1173F; Ahom +118A0..118FF; Warang Citi +11A00..11A4F; Zanabazar Square +11A50..11AAF; Soyombo +11AC0..11AFF; Pau Cin Hau +11C00..11C6F; Bhaiksuki +11C70..11CBF; Marchen +11D00..11D5F; Masaram Gondi +12000..123FF; Cuneiform +12400..1247F; Cuneiform Numbers and Punctuation +12480..1254F; Early Dynastic Cuneiform +13000..1342F; Egyptian Hieroglyphs +14400..1467F; Anatolian Hieroglyphs +16800..16A3F; Bamum Supplement +16A40..16A6F; Mro +16AD0..16AFF; Bassa Vah +16B00..16B8F; Pahawh Hmong +16F00..16F9F; Miao +16FE0..16FFF; Ideographic Symbols and Punctuation +17000..187FF; Tangut +18800..18AFF; Tangut Components +1B000..1B0FF; Kana Supplement +1B100..1B12F; Kana Extended-A +1B170..1B2FF; Nushu +1BC00..1BC9F; Duployan +1BCA0..1BCAF; Shorthand Format Controls +1D000..1D0FF; Byzantine Musical Symbols +1D100..1D1FF; Musical Symbols +1D200..1D24F; Ancient Greek Musical Notation +1D300..1D35F; Tai Xuan Jing Symbols +1D360..1D37F; Counting Rod Numerals +1D400..1D7FF; Mathematical Alphanumeric Symbols +1D800..1DAAF; Sutton SignWriting +1E000..1E02F; Glagolitic Supplement +1E800..1E8DF; Mende Kikakui +1E900..1E95F; Adlam +1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols +1F000..1F02F; Mahjong Tiles +1F030..1F09F; Domino Tiles +1F0A0..1F0FF; Playing Cards +1F100..1F1FF; Enclosed Alphanumeric Supplement +1F200..1F2FF; Enclosed Ideographic Supplement +1F300..1F5FF; Miscellaneous Symbols and Pictographs +1F600..1F64F; Emoticons +1F650..1F67F; Ornamental Dingbats +1F680..1F6FF; Transport and Map Symbols +1F700..1F77F; Alchemical Symbols +1F780..1F7FF; Geometric Shapes Extended +1F800..1F8FF; Supplemental Arrows-C +1F900..1F9FF; Supplemental Symbols and Pictographs +20000..2A6DF; CJK Unified Ideographs Extension B +2A700..2B73F; CJK Unified Ideographs Extension C +2B740..2B81F; CJK Unified Ideographs Extension D +2B820..2CEAF; CJK Unified Ideographs Extension E +2CEB0..2EBEF; CJK Unified Ideographs Extension F +2F800..2FA1F; CJK Compatibility Ideographs Supplement +E0000..E007F; Tags +E0100..E01EF; Variation Selectors Supplement +F0000..FFFFF; Supplementary Private Use Area-A +100000..10FFFF; Supplementary Private Use Area-B + +# EOF +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# This file is for the use of utf8_heavy.pl and Unicode::UCD + +# Maps Unicode (not Perl single-form extensions) property names in loose +# standard form to their corresponding standard names +%utf8::loose_property_name_of = ( +'age' => 'age', +'ahex' => 'ahex', +'alpha' => 'alpha', +'alphabetic' => 'alpha', +'asciihexdigit' => 'ahex', +'bc' => 'bc', +'bidic' => 'bidic', +'bidiclass' => 'bc', +'bidicontrol' => 'bidic', +'bidim' => 'bidim', +'bidimirrored' => 'bidim', +'bidipairedbrackettype' => 'bpt', +'blk' => 'blk', +'block' => 'blk', +'bpt' => 'bpt', +'canonicalcombiningclass' => 'ccc', +'cased' => 'cased', +'caseignorable' => 'ci', +'category' => 'gc', +'ccc' => 'ccc', +'ce' => 'ce', +'changeswhencasefolded' => 'cwcf', +'changeswhencasemapped' => 'cwcm', +'changeswhenlowercased' => 'cwl', +'changeswhennfkccasefolded' => 'cwkcf', +'changeswhentitlecased' => 'cwt', +'changeswhenuppercased' => 'cwu', +'ci' => 'ci', +'compex' => 'compex', +'compositionexclusion' => 'ce', +'cwcf' => 'cwcf', +'cwcm' => 'cwcm', +'cwkcf' => 'cwkcf', +'cwl' => 'cwl', +'cwt' => 'cwt', +'cwu' => 'cwu', +'dash' => 'dash', +'decompositiontype' => 'dt', +'defaultignorablecodepoint' => 'di', +'dep' => 'dep', +'deprecated' => 'dep', +'di' => 'di', +'dia' => 'dia', +'diacritic' => 'dia', +'dt' => 'dt', +'ea' => 'ea', +'eastasianwidth' => 'ea', +'ext' => 'ext', +'extender' => 'ext', +'fullcompositionexclusion' => 'compex', +'gc' => 'gc', +'gcb' => 'gcb', +'generalcategory' => 'gc', +'graphemebase' => 'grbase', +'graphemeclusterbreak' => 'gcb', +'graphemeextend' => 'grext', +'grbase' => 'grbase', +'grext' => 'grext', +'hangulsyllabletype' => 'hst', +'hex' => 'hex', +'hexdigit' => 'hex', +'hst' => 'hst', +'hyphen' => 'hyphen', +'idc' => 'idc', +'idcontinue' => 'idc', +'ideo' => 'ideo', +'ideographic' => 'ideo', +'ids' => 'ids', +'idsb' => 'idsb', +'idsbinaryoperator' => 'idsb', +'idst' => 'idst', +'idstart' => 'ids', +'idstrinaryoperator' => 'idst', +'in' => 'in', +'indicpositionalcategory' => 'inpc', +'indicsyllabiccategory' => 'insc', +'inpc' => 'inpc', +'insc' => 'insc', +'jg' => 'jg', +'joinc' => 'joinc', +'joincontrol' => 'joinc', +'joininggroup' => 'jg', +'joiningtype' => 'jt', +'jt' => 'jt', +'lb' => 'lb', +'linebreak' => 'lb', +'loe' => 'loe', +'logicalorderexception' => 'loe', +'lower' => 'lower', +'lowercase' => 'lower', +'math' => 'math', +'nchar' => 'nchar', +'nfcqc' => 'nfcqc', +'nfcquickcheck' => 'nfcqc', +'nfdqc' => 'nfdqc', +'nfdquickcheck' => 'nfdqc', +'nfkcqc' => 'nfkcqc', +'nfkcquickcheck' => 'nfkcqc', +'nfkdqc' => 'nfkdqc', +'nfkdquickcheck' => 'nfkdqc', +'noncharactercodepoint' => 'nchar', +'nt' => 'nt', +'numerictype' => 'nt', +'numericvalue' => 'nv', +'nv' => 'nv', +'patsyn' => 'patsyn', +'patternsyntax' => 'patsyn', +'patternwhitespace' => 'patws', +'patws' => 'patws', +'pcm' => 'pcm', +'prependedconcatenationmark' => 'pcm', +'presentin' => 'in', +'qmark' => 'qmark', +'quotationmark' => 'qmark', +'radical' => 'radical', +'regionalindicator' => 'ri', +'ri' => 'ri', +'sb' => 'sb', +'sc' => 'sc', +'script' => 'sc', +'scriptextensions' => 'scx', +'scx' => 'scx', +'sd' => 'sd', +'sentencebreak' => 'sb', +'sentenceterminal' => 'sterm', +'softdotted' => 'sd', +'space' => 'wspace', +'sterm' => 'sterm', +'term' => 'term', +'terminalpunctuation' => 'term', +'uideo' => 'uideo', +'unifiedideograph' => 'uideo', +'upper' => 'upper', +'uppercase' => 'upper', +'variationselector' => 'vs', +'verticalorientation' => 'vo', +'vo' => 'vo', +'vs' => 'vs', +'wb' => 'wb', +'whitespace' => 'wspace', +'wordbreak' => 'wb', +'wspace' => 'wspace', +'xidc' => 'xidc', +'xidcontinue' => 'xidc', +'xids' => 'xids', +'xidstart' => 'xids', +); + +# Same, but strict names +%utf8::strict_property_name_of = ( +'_perlgcb' => 'gcb', +'_perlsb' => 'sb', +'_perlscx' => '_perlscx', +); + +# Gives the definitions (in the form of inversion lists) for those properties +# whose definitions aren't kept in files +@utf8::inline_definitions = ( + +'V0', +'V1 +0', +'V2 +0 +1114112', +'V4 +9 +14 +32 +33', +'V6 +10 +14 +133 +134 +8232 +8234', +'V6 +48 +58 +65 +91 +97 +123', +'V4 +65 +91 +97 +123', +'V4 +9 +10 +32 +33', +'V4 +0 +32 +127 +128', +'V2 +48 +58', +'V2 +33 +127', +'V2 +97 +123', +'V2 +32 +127', +'V2 +65 +91', +'V2 +55296 +57344', +'V2 +12334 +12336', +'V2 +119149 +119150', +'V2 +12330 +12331', +'V6 +861 +863 +864 +866 +7629 +7630', +'V2 +837 +838', +'V2 +12441 +12443', +'V2 +7630 +7631', +'V6 +801 +803 +807 +809 +7632 +7633', +'V2 +1456 +1457', +'V2 +1457 +1458', +'V2 +1458 +1459', +'V2 +1459 +1460', +'V2 +1460 +1461', +'V2 +1461 +1462', +'V2 +1462 +1463', +'V2 +1463 +1464', +'V4 +1464 +1465 +1479 +1480', +'V2 +1465 +1467', +'V2 +1467 +1468', +'V2 +1468 +1469', +'V2 +1469 +1470', +'V2 +1471 +1472', +'V2 +1473 +1474', +'V2 +1474 +1475', +'V2 +64286 +64287', +'V4 +1611 +1612 +2288 +2289', +'V4 +1612 +1613 +2289 +2290', +'V4 +1613 +1614 +2290 +2291', +'V4 +1560 +1561 +1614 +1615', +'V4 +1561 +1562 +1615 +1616', +'V4 +1562 +1563 +1616 +1617', +'V2 +1617 +1618', +'V2 +1618 +1619', +'V2 +1648 +1649', +'V2 +1809 +1810', +'V2 +3157 +3158', +'V2 +3158 +3159', +'V2 +3640 +3642', +'V2 +3656 +3660', +'V2 +3768 +3770', +'V2 +3784 +3788', +'V2 +3953 +3954', +'V6 +3954 +3955 +3962 +3966 +3968 +3969', +'V2 +3956 +3957', +'V6 +48 +58 +65 +71 +97 +103', +'V4 +4352 +4448 +43360 +43389', +'V4 +4520 +4608 +55243 +55292', +'V4 +4448 +4520 +55216 +55239', +'V2 +13 +14', +'V2 +127995 +128000', +'V2 +10 +11', +'V2 +127462 +127488', +'V2 +128102 +128106', +'V2 +8205 +8206', +'V4 +12272 +12274 +12276 +12284', +'V5 +0 +12272 +12274 +12276 +12284', +'V2 +12274 +12276', +'V3 +0 +12274 +12276', +'V2 +43455 +43456', +'V4 +6971 +6972 +43456 +43457', +'V2 +6973 +6974', +'V2 +8204 +8205', +'V6 +6512 +6517 +43712 +43713 +43714 +43715', +'V2 +69759 +69760', +'V6 +2510 +2511 +3412 +3415 +3450 +3456', +'V6 +2673 +2674 +70199 +70200 +72344 +72345', +'V4 +3660 +3661 +6093 +6094', +'V2 +2947 +2948', +'V2 +6089 +6091', +'V6 +70082 +70084 +72250 +72251 +72326 +72330', +'V2 +69714 +69734', +'V2 +3976 +3981', +'V4 +3313 +3315 +69635 +69637', +'V4 +3406 +3407 +73030 +73031', +'V2 +8204 +8206', +'V3 +0 +8204 +8206', +'V3 +0 +127462 +127488', +'V6 +11904 +11930 +11931 +12020 +12032 +12246', +'V4 +133 +134 +8232 +8234', +'V6 +6155 +6158 +65024 +65040 +917760 +918000', +'V2 +34 +35', +'V6 +11 +13 +133 +134 +8232 +8234', +'V2 +39 +40', +'V4 +8364 +8365 +65532 +65533', +'V2 +8378 +8379', +'V4 +1564 +1565 +8294 +8298', +'V6 +9 +10 +11 +12 +31 +32', +'V2 +8296 +8297', +'V2 +8234 +8235', +'V2 +8294 +8295', +'V2 +8237 +8238', +'V2 +8236 +8237', +'V2 +8297 +8298', +'V2 +8235 +8236', +'V2 +8295 +8296', +'V2 +8238 +8239', +'V2 +65024 +65040', +'V2 +19968 +40960', +'V2 +12272 +12288', +'V2 +3712 +3840', +'V2 +92736 +92784', +'V2 +1984 +2048', +'V2 +9280 +9312', +'V2 +57344 +63744', +'V2 +42240 +42560', +'V2 +71424 +71488', +'V2 +43520 +43616', +'V2 +4352 +4608', +'V2 +42192 +42240', +'V2 +93952 +94112', +'V2 +71168 +71264', +'V2 +70656 +70784', +'V2 +69216 +69248', +'V2 +917504 +917632', +'V2 +3584 +3712', +'V2 +5120 +5760', +'V2 +0 +128', +'V2 +125184 +125280', +'V2 +42656 +42752', +'V2 +7104 +7168', +'V2 +5952 +5984', +'V2 +880 +1024', +'V2 +6016 +6144', +'V2 +6400 +6480', +'V2 +119040 +119296', +'V2 +110960 +111360', +'V2 +5760 +5792', +'V2 +2816 +2944', +'V2 +66736 +66816', +'V2 +5792 +5888', +'V2 +6480 +6528', +'V2 +71296 +71376', +'V2 +2944 +3072', +'V2 +917760 +918000', +'V2 +1536 +1792', +'V2 +8592 +8704', +'V2 +69632 +69760', +'V2 +66208 +66272', +'V2 +69888 +69968', +'V2 +11392 +11520', +'V2 +127024 +127136', +'V2 +66352 +66384', +'V2 +44032 +55216', +'V2 +67808 +67840', +'V2 +1424 +1536', +'V2 +592 +688', +'V2 +69760 +69840', +'V2 +12688 +12704', +'V2 +12032 +12256', +'V2 +70144 +70224', +'V2 +128 +256', +'V2 +7168 +7248', +'V2 +66176 +66208', +'V2 +67872 +67904', +'V2 +43312 +43360', +'V2 +1792 +1872', +'V2 +94208 +100352', +'V2 +3072 +3200', +'V2 +1920 +1984', +'V2 +19904 +19968', +'V2 +68352 +68416', +'V2 +2432 +2560', +'V2 +10240 +10496', +'V2 +13312 +19904', +'V2 +131072 +173792', +'V2 +173824 +177984', +'V2 +177984 +178208', +'V2 +178208 +183984', +'V2 +183984 +191472', +'V2 +66560 +66640', +'V2 +66816 +66864', +'V2 +70400 +70528', +'V2 +5920 +5952', +'V2 +110592 +110848', +'V2 +3200 +3328', +'V2 +43264 +43312', +'V2 +67072 +67456', +'V2 +126976 +127024', +'V2 +2112 +2144', +'V2 +72816 +72896', +'V2 +70272 +70320', +'V2 +4096 +4256', +'V2 +7248 +7296', +'V2 +66688 +66736', +'V2 +43072 +43136', +'V2 +70016 +70112', +'V2 +66640 +66688', +'V2 +71040 +71168', +'V2 +3456 +3584', +'V2 +72272 +72368', +'V2 +983040 +1048576', +'V2 +1048576 +1114112', +'V2 +5888 +5920', +'V2 +6688 +6832', +'V2 +43648 +43744', +'V2 +3840 +4096', +'V2 +70784 +70880', +'V2 +6320 +6400', +'V2 +1328 +1424', +'V2 +6912 +7040', +'V2 +92160 +92736', +'V2 +92880 +92928', +'V2 +12544 +12592', +'V2 +6656 +6688', +'V2 +5024 +5120', +'V2 +1024 +1280', +'V2 +9984 +10176', +'V2 +113664 +113824', +'V2 +4608 +4992', +'V2 +4256 +4352', +'V2 +7936 +8192', +'V2 +2688 +2816', +'V2 +2560 +2688', +'V2 +12352 +12448', +'V2 +43360 +43392', +'V2 +55216 +55296', +'V2 +43392 +43488', +'V2 +110848 +110896', +'V2 +12448 +12544', +'V2 +69968 +70016', +'V2 +66000 +66048', +'V2 +65520 +65536', +'V2 +5984 +6016', +'V2 +11568 +11648', +'V2 +66432 +66464', +'V2 +7376 +7424', +'V2 +64336 +65024', +'V2 +65136 +65280', +'V2 +1872 +1920', +'V2 +72704 +72816', +'V2 +13056 +13312', +'V2 +73728 +74752', +'V2 +128512 +128592', +'V2 +65056 +65072', +'V2 +70320 +70400', +'V2 +256 +384', +'V2 +384 +592', +'V2 +11360 +11392', +'V2 +42784 +43008', +'V2 +43824 +43888', +'V2 +3328 +3456', +'V2 +6144 +6320', +'V2 +67712 +67760', +'V2 +6528 +6624', +'V2 +66304 +66352', +'V2 +66384 +66432', +'V2 +68608 +68688', +'V2 +67680 +67712', +'V2 +72384 +72448', +'V2 +2048 +2112', +'V2 +7040 +7104', +'V2 +2144 +2160', +'V2 +128768 +128896', +'V2 +2208 +2304', +'V2 +126464 +126720', +'V2 +9472 +9600', +'V2 +12736 +12784', +'V2 +12288 +12352', +'V2 +12592 +12688', +'V2 +2304 +2432', +'V2 +11264 +11360', +'V2 +68096 +68192', +'V2 +68288 +68352', +'V2 +11008 +11264', +'V2 +66464 +66528', +'V2 +67840 +67872', +'V2 +43136 +43232', +'V2 +65104 +65136', +'V2 +10224 +10240', +'V2 +10496 +10624', +'V2 +129024 +129280', +'V2 +71840 +71936', +'V2 +42128 +42192', +'V2 +12704 +12736', +'V2 +43888 +43968', +'V2 +119648 +119680', +'V2 +1280 +1328', +'V2 +12800 +13056', +'V2 +11648 +11744', +'V2 +4992 +5024', +'V2 +11520 +11568', +'V2 +12784 +12800', +'V2 +43968 +44032', +'V2 +9728 +9984', +'V2 +43616 +43648', +'V2 +43488 +43520', +'V2 +8528 +8592', +'V2 +92928 +93072', +'V2 +7424 +7552', +'V2 +8192 +8304', +'V2 +69840 +69888', +'V2 +8304 +8352', +'V2 +43008 +43056', +'V2 +119552 +119648', +'V2 +40960 +42128', +'V2 +64256 +64336', +'V2 +11744 +11776', +'V2 +42560 +42656', +'V2 +7296 +7312', +'V2 +768 +880', +'V2 +43776 +43824', +'V2 +6624 +6656', +'V2 +72960 +73056', +'V2 +119808 +120832', +'V2 +124928 +125152', +'V2 +71264 +71296', +'V2 +68736 +68864', +'V2 +127136 +127232', +'V2 +7360 +7376', +'V2 +65792 +65856', +'V2 +9600 +9632', +'V2 +43232 +43264', +'V2 +122880 +122928', +'V2 +56320 +57344', +'V2 +8704 +8960', +'V2 +8960 +9216', +'V2 +65040 +65056', +'V2 +65936 +66000', +'V2 +118784 +119040', +'V2 +65072 +65104', +'V2 +11904 +12032', +'V2 +55296 +56192', +'V2 +43744 +43776', +'V2 +7552 +7616', +'V2 +68480 +68528', +'V2 +11776 +11904', +'V2 +9216 +9280', +'V2 +8352 +8400', +'V2 +6832 +6912', +'V2 +7616 +7680', +'V2 +9632 +9728', +'V2 +67648 +67680', +'V2 +68000 +68096', +'V2 +127744 +128512', +'V2 +688 +768', +'V2 +68224 +68256', +'V2 +68192 +68224', +'V2 +128640 +128768', +'V2 +72192 +72272', +'V2 +74752 +74880', +'V2 +67584 +67648', +'V2 +9312 +9472', +'V2 +65280 +65520', +'V2 +56192 +56320', +'V2 +43056 +43072', +'V2 +65664 +65792', +'V2 +65536 +65664', +'V2 +10176 +10224', +'V2 +10624 +10752', +'V2 +10752 +11008', +'V2 +100352 +101120', +'V2 +119296 +119376', +'V2 +66864 +66928', +'V2 +8448 +8528', +'V2 +120832 +121520', +'V2 +66272 +66304', +'V2 +128896 +129024', +'V2 +94176 +94208', +'V2 +7680 +7936', +'V2 +128592 +128640', +'V2 +65856 +65936', +'V2 +63744 +64256', +'V2 +77824 +78896', +'V2 +127232 +127488', +'V2 +67968 +68000', +'V2 +42752 +42784', +'V2 +82944 +83584', +'V2 +68448 +68480', +'V2 +68416 +68448', +'V2 +70112 +70144', +'V2 +194560 +195104', +'V2 +8400 +8448', +'V2 +74880 +75088', +'V2 +127488 +127744', +'V2 +113824 +113840', +'V2 +129280 +129536', +'V6 +188 +191 +8528 +8544 +8585 +8586', +'V6 +65104 +65107 +65108 +65127 +65128 +65132', +'V6 +12288 +12289 +65281 +65377 +65504 +65511', +'V4 +0 +32 +127 +160', +'V6 +57344 +63744 +983040 +1048574 +1048576 +1114110', +'V2 +8232 +8233', +'V2 +8233 +8234', +'V2 +1829 +1830', +'V2 +1871 +1872', +'V2 +1815 +1816', +'V2 +1830 +1831', +'V2 +1607 +1608', +'V2 +1825 +1826', +'V2 +1826 +1827', +'V2 +1725 +1726', +'V6 +1591 +1593 +1695 +1696 +2211 +2212', +'V2 +1836 +1837', +'V4 +1810 +1811 +1837 +1838', +'V2 +1818 +1819', +'V2 +1823 +1824', +'V6 +1605 +1606 +1893 +1895 +2215 +2216', +'V6 +1606 +1607 +1721 +1725 +1895 +1898', +'V2 +1833 +1834', +'V2 +1835 +1836', +'V2 +1819 +1821', +'V2 +1821 +1822', +'V2 +1817 +1818', +'V2 +1808 +1809', +'V4 +1811 +1813 +1838 +1839', +'V2 +1870 +1871', +'V2 +1832 +1833', +'V2 +1869 +1870', +'V2 +1824 +1825', +'V2 +1822 +1823', +'V2 +1729 +1731', +'V2 +1827 +1828', +'V2 +1706 +1707', +'V2 +1816 +1817', +'V2 +1746 +1748', +'V2 +2235 +2236', +'V2 +2236 +2237', +'V6 +1813 +1815 +1834 +1835 +1839 +1840', +'V4 +1726 +1727 +1791 +1792', +'V2 +1831 +1832', +'V6 +1577 +1578 +1728 +1729 +1749 +1750', +'V2 +2237 +2238', +'V2 +2145 +2146', +'V2 +2151 +2152', +'V2 +2220 +2221', +'V2 +2225 +2226', +'V2 +1741 +1742', +'V2 +1828 +1829', +'V2 +2150 +2151', +'V2 +2152 +2153', +'V2 +2144 +2145', +'V2 +2148 +2149', +'V2 +2146 +2147', +'V2 +2154 +2155', +'V2 +2147 +2148', +'V2 +68315 +68317', +'V2 +2153 +2154', +'V2 +2149 +2150', +'V2 +68310 +68311', +'V2 +68311 +68312', +'V2 +68331 +68332', +'V2 +68324 +68325', +'V2 +68333 +68334', +'V2 +68295 +68296', +'V2 +1731 +1732', +'V2 +68313 +68315', +'V2 +68289 +68291', +'V2 +68332 +68333', +'V2 +68301 +68302', +'V2 +68304 +68307', +'V2 +68318 +68321', +'V2 +68321 +68322', +'V2 +68302 +68303', +'V2 +68303 +68304', +'V2 +68288 +68289', +'V2 +68291 +68293', +'V2 +68317 +68318', +'V2 +68297 +68299', +'V2 +68293 +68294', +'V2 +68307 +68308', +'V2 +68312 +68313', +'V2 +68334 +68335', +'V2 +68308 +68309', +'V2 +68335 +68336', +'V2 +68309 +68310', +'V2 +1914 +1916', +'V6 +43122 +43123 +68301 +68302 +68311 +68312', +'V4 +8212 +8213 +11834 +11836', +'V4 +11 +13 +8232 +8234', +'V2 +65532 +65533', +'V4 +41 +42 +93 +94', +'V2 +45 +46', +'V2 +133 +134', +'V2 +55296 +57344', +'V2 +32 +33', +'V2 +47 +48', +'V4 +8288 +8289 +65279 +65280', +'V2 +8203 +8204', +'V2 +12881 +12882', +'V2 +12882 +12883', +'V2 +12883 +12884', +'V2 +12884 +12885', +'V2 +12885 +12886', +'V2 +12886 +12887', +'V2 +12887 +12888', +'V2 +12888 +12889', +'V2 +12889 +12890', +'V2 +12891 +12892', +'V2 +12892 +12893', +'V2 +12893 +12894', +'V2 +12894 +12895', +'V2 +12895 +12896', +'V2 +12977 +12978', +'V2 +12978 +12979', +'V2 +12979 +12980', +'V2 +12980 +12981', +'V2 +12982 +12983', +'V2 +12983 +12984', +'V2 +12984 +12985', +'V2 +12985 +12986', +'V2 +12986 +12987', +'V2 +12987 +12988', +'V2 +12988 +12989', +'V2 +12989 +12990', +'V2 +12990 +12991', +'V4 +3422 +3423 +8533 +8534', +'V6 +8537 +8538 +68087 +68088 +74849 +74850', +'V2 +8528 +8529', +'V2 +8529 +8530', +'V2 +8534 +8535', +'V2 +3883 +3884', +'V2 +8535 +8536', +'V2 +8540 +8541', +'V2 +8536 +8537', +'V2 +3884 +3885', +'V6 +8538 +8539 +68095 +68096 +74844 +74845', +'V2 +8541 +8542', +'V2 +3885 +3886', +'V2 +8542 +8543', +'V2 +3886 +3887', +'V2 +3891 +3892', +'V4 +3420 +3421 +8530 +8531', +'V2 +68086 +68087', +'V2 +3419 +3420', +'V2 +3417 +3418', +'V2 +3887 +3888', +'V2 +3888 +3889', +'V2 +3889 +3890', +'V2 +3890 +3891', +'V4 +65827 +65828 +68060 +68061', +'V2 +3421 +3422', +'V2 +3418 +3419', +'V4 +65828 +65829 +68061 +68062', +'V4 +65829 +65830 +68062 +68063', +'V2 +68090 +68091', +'V4 +65831 +65832 +68064 +68065', +'V2 +68092 +68093', +'V4 +65832 +65833 +68065 +68066', +'V4 +65833 +65834 +68066 +68067', +'V4 +65834 +65835 +68067 +68068', +'V2 +3416 +3417', +'V2 +68028 +68029', +'V4 +65836 +65837 +68069 +68070', +'V4 +65837 +65838 +68070 +68071', +'V4 +65838 +65839 +68071 +68072', +'V4 +65840 +65841 +68073 +68074', +'V4 +65841 +65842 +68074 +68075', +'V4 +65842 +65843 +68075 +68076', +'V4 +65843 +65844 +68076 +68077', +'V4 +8584 +8585 +68077 +68078', +'V2 +68078 +68079', +'V2 +74802 +74803', +'V2 +68079 +68080', +'V2 +68080 +68081', +'V2 +74803 +74804', +'V2 +68081 +68082', +'V2 +68082 +68083', +'V2 +68083 +68084', +'V2 +68084 +68085', +'V2 +68085 +68086', +'V2 +93022 +93023', +'V6 +20159 +20160 +20740 +20741 +93023 +93024', +'V2 +93024 +93025', +'V4 +20806 +20807 +93025 +93026', +'V4 +40960 +42125 +42128 +42183', +'V6 +125184 +125259 +125264 +125274 +125278 +125280', +'V6 +746 +748 +12549 +12591 +12704 +12731', +'V4 +6656 +6684 +6686 +6688', +'V2 +5952 +5972', +'V4 +69888 +69941 +69942 +69956', +'V6 +994 +1008 +11392 +11508 +11513 +11520', +'V2 +5920 +5941', +'V6 +43392 +43470 +43472 +43482 +43486 +43488', +'V4 +43264 +43310 +43311 +43312', +'V4 +70144 +70162 +70163 +70207', +'V2 +69760 +69826', +'V6 +67072 +67383 +67392 +67414 +67424 +67432', +'V2 +69968 +70007', +'V4 +2112 +2140 +2142 +2143', +'V4 +68288 +68327 +68331 +68343', +'V4 +71168 +71237 +71248 +71258', +'V6 +4096 +4256 +43488 +43519 +43616 +43648', +'V2 +66384 +66427', +'V2 +43072 +43128', +'V6 +68480 +68498 +68505 +68509 +68521 +68528', +'V4 +70016 +70094 +70096 +70112', +'V4 +70320 +70379 +70384 +70394', +'V2 +43008 +43052', +'V6 +5984 +5997 +5998 +6001 +6002 +6004', +'V4 +71296 +71352 +71360 +71370', +'V4 +6480 +6510 +6512 +6517', +'V4 +5888 +5901 +5902 +5909', +'V2 +1920 +1970', +'V4 +70784 +70856 +70864 +70874', +'V6 +92736 +92767 +92768 +92778 +92782 +92784', +'V2 +1984 +2043', +'V2 +42240 +42540', +'V4 +66864 +66916 +66927 +66928', +'V6 +71424 +71450 +71453 +71468 +71472 +71488', +'V4 +67648 +67670 +67671 +67680', +'V4 +68352 +68406 +68409 +68416', +'V4 +6912 +6988 +6992 +7037', +'V4 +42656 +42744 +92160 +92729', +'V4 +92880 +92910 +92912 +92918', +'V4 +7104 +7156 +7164 +7168', +'V6 +69632 +69710 +69714 +69744 +69759 +69760', +'V6 +6656 +6684 +6686 +6688 +43471 +43472', +'V4 +5941 +5943 +5952 +5972', +'V4 +5120 +5760 +6320 +6390', +'V2 +66208 +66257', +'V6 +5024 +5110 +5112 +5118 +43888 +43968', +'V2 +77824 +78895', +'V2 +66816 +66856', +'V2 +66352 +66379', +'V2 +5920 +5943', +'V6 +67808 +67827 +67828 +67830 +67835 +67840', +'V2 +82944 +83527', +'V6 +68736 +68787 +68800 +68851 +68858 +68864', +'V4 +66304 +66340 +66349 +66352', +'V6 +43392 +43470 +43471 +43482 +43486 +43488', +'V6 +2790 +2800 +70144 +70162 +70163 +70207', +'V6 +2406 +2416 +43056 +43066 +69760 +69826', +'V6 +7168 +7224 +7227 +7242 +7245 +7248', +'V2 +66176 +66205', +'V4 +67872 +67898 +67903 +67904', +'V6 +2404 +2416 +43056 +43066 +69968 +70007', +'V6 +1600 +1601 +2112 +2140 +2142 +2143', +'V6 +1600 +1601 +68288 +68327 +68331 +68343', +'V6 +72816 +72848 +72850 +72872 +72873 +72887', +'V4 +124928 +125125 +125127 +125143', +'V6 +68000 +68024 +68028 +68048 +68050 +68096', +'V6 +93952 +94021 +94032 +94079 +94095 +94112', +'V6 +43056 +43066 +71168 +71237 +71248 +71258', +'V6 +43744 +43767 +43968 +44014 +44016 +44026', +'V4 +67712 +67743 +67751 +67760', +'V6 +70656 +70746 +70747 +70748 +70749 +70750', +'V4 +94177 +94178 +110960 +111356', +'V2 +5760 +5789', +'V2 +68608 +68681', +'V4 +66736 +66772 +66776 +66812', +'V4 +66688 +66718 +66720 +66730', +'V2 +72384 +72441', +'V4 +1155 +1156 +66384 +66427', +'V6 +6146 +6148 +6149 +6150 +43072 +43128', +'V4 +68448 +68467 +68472 +68480', +'V4 +67840 +67868 +67871 +67872', +'V4 +68416 +68438 +68440 +68448', +'V4 +43312 +43348 +43359 +43360', +'V4 +5792 +5867 +5870 +5881', +'V4 +2048 +2094 +2096 +2111', +'V4 +43136 +43206 +43214 +43226', +'V6 +120832 +121484 +121499 +121504 +121505 +121520', +'V4 +71040 +71094 +71096 +71134', +'V4 +69840 +69865 +69872 +69882', +'V6 +72272 +72324 +72326 +72349 +72350 +72355', +'V4 +7040 +7104 +7360 +7368', +'V6 +2404 +2406 +2534 +2544 +43008 +43052', +'V6 +4160 +4170 +6480 +6510 +6512 +6517', +'V6 +94176 +94177 +94208 +100333 +100352 +101107', +'V4 +43648 +43715 +43739 +43744', +'V6 +11568 +11624 +11631 +11633 +11647 +11648', +'V6 +5888 +5901 +5902 +5909 +5941 +5943', +'V4 +3585 +3643 +3648 +3676', +'V4 +66432 +66462 +66463 +66464', +'V4 +71840 +71923 +71935 +71936', +'V4 +66464 +66500 +66504 +66518', +'V2 +72192 +72264', +, +); + +# Maps property, table to file for those using stricter matching. For paths +# whose directory is '#', the file is in the form of a numeric index into +# @inline_definitions +%utf8::stricter_to_file_of = ( +'_canondcij' => 'SD/Y', +'_case_ignorable' => 'CI/Y', +'_combabove' => 'Ccc/A', +'_perl_any_folds' => 'Perl/_PerlAny', +'_perl_charname_begin' => 'Perl/_PerlCha', +'_perl_charname_continue' => 'Perl/_PerlCh2', +'_perl_folds_to_multi_char' => 'Perl/_PerlFol', +'_perl_idcont' => 'Perl/_PerlIDC', +'_perl_idstart' => 'Perl/_PerlIDS', +'_perl_nchar' => 'Perl/_PerlNch', +'_perl_patws' => 'Perl/_PerlPat', +'_perl_problematic_locale_foldeds_start' => 'Perl/_PerlPr2', +'_perl_problematic_locale_folds' => 'Perl/_PerlPro', +'_perl_quotemeta' => 'Perl/_PerlQuo', +'_perl_surrogate' => '#/14', +'age=1.1' => 'Age/V11', +'age=10' => 'Age/V100', +'age=10.0' => 'Age/V100', +'age=2' => 'Age/V20', +'age=2.0' => 'Age/V20', +'age=2.1' => '#/98', +'age=3' => 'Age/V30', +'age=3.0' => 'Age/V30', +'age=3.1' => 'Age/V31', +'age=3.2' => 'Age/V32', +'age=4' => 'Age/V40', +'age=4.0' => 'Age/V40', +'age=4.1' => 'Age/V41', +'age=5' => 'Age/V50', +'age=5.0' => 'Age/V50', +'age=5.1' => 'Age/V51', +'age=5.2' => 'Age/V52', +'age=6' => 'Age/V60', +'age=6.0' => 'Age/V60', +'age=6.1' => 'Age/V61', +'age=6.2' => '#/99', +'age=6.3' => '#/100', +'age=7' => 'Age/V70', +'age=7.0' => 'Age/V70', +'age=8' => 'Age/V80', +'age=8.0' => 'Age/V80', +'age=9' => 'Age/V90', +'age=9.0' => 'Age/V90', +'ccc=0' => 'Ccc/NR', +'ccc=1' => 'Ccc/OV', +'ccc=10' => '#/23', +'ccc=103' => '#/52', +'ccc=107' => '#/53', +'ccc=11' => '#/24', +'ccc=118' => '#/54', +'ccc=12' => '#/25', +'ccc=122' => '#/55', +'ccc=129' => '#/56', +'ccc=13' => '#/26', +'ccc=130' => '#/57', +'ccc=132' => '#/58', +'ccc=133' => '#/0', +'ccc=14' => '#/27', +'ccc=15' => '#/28', +'ccc=16' => '#/29', +'ccc=17' => '#/30', +'ccc=18' => '#/31', +'ccc=19' => '#/32', +'ccc=20' => '#/33', +'ccc=200' => '#/0', +'ccc=202' => '#/22', +'ccc=21' => '#/34', +'ccc=214' => '#/21', +'ccc=216' => 'Ccc/ATAR', +'ccc=218' => '#/17', +'ccc=22' => '#/35', +'ccc=220' => 'Ccc/B', +'ccc=222' => 'Ccc/BR', +'ccc=224' => '#/15', +'ccc=226' => '#/16', +'ccc=228' => 'Ccc/AL', +'ccc=23' => '#/36', +'ccc=230' => 'Ccc/A', +'ccc=232' => 'Ccc/AR', +'ccc=233' => 'Ccc/DB', +'ccc=234' => '#/18', +'ccc=24' => '#/37', +'ccc=240' => '#/19', +'ccc=25' => '#/38', +'ccc=26' => '#/39', +'ccc=27' => '#/40', +'ccc=28' => '#/41', +'ccc=29' => '#/42', +'ccc=30' => '#/43', +'ccc=31' => '#/44', +'ccc=32' => '#/45', +'ccc=33' => '#/46', +'ccc=34' => '#/47', +'ccc=35' => '#/48', +'ccc=36' => '#/49', +'ccc=7' => 'Ccc/NK', +'ccc=8' => '#/20', +'ccc=84' => '#/50', +'ccc=9' => 'Ccc/VR', +'ccc=91' => '#/51', +'in=1.1' => 'Age/V11', +'in=10' => 'In/10_0', +'in=10.0' => 'In/10_0', +'in=2' => 'In/2_0', +'in=2.0' => 'In/2_0', +'in=2.1' => 'In/2_1', +'in=3' => 'In/3_0', +'in=3.0' => 'In/3_0', +'in=3.1' => 'In/3_1', +'in=3.2' => 'In/3_2', +'in=4' => 'In/4_0', +'in=4.0' => 'In/4_0', +'in=4.1' => 'In/4_1', +'in=5' => 'In/5_0', +'in=5.0' => 'In/5_0', +'in=5.1' => 'In/5_1', +'in=5.2' => 'In/5_2', +'in=6' => 'In/6_0', +'in=6.0' => 'In/6_0', +'in=6.1' => 'In/6_1', +'in=6.2' => 'In/6_2', +'in=6.3' => 'In/6_3', +'in=7' => 'In/7_0', +'in=7.0' => 'In/7_0', +'in=8' => 'In/8_0', +'in=8.0' => 'In/8_0', +'in=9' => 'In/9_0', +'in=9.0' => 'In/9_0', +'nv=-1/2' => '#/535', +'nv=0' => 'Nv/0', +'nv=1' => 'Nv/1', +'nv=1/10' => '#/536', +'nv=1/12' => '#/537', +'nv=1/16' => 'Nv/1_16', +'nv=1/160' => '#/555', +'nv=1/2' => 'Nv/1_2', +'nv=1/20' => '#/538', +'nv=1/3' => 'Nv/1_3', +'nv=1/4' => 'Nv/1_4', +'nv=1/40' => '#/539', +'nv=1/5' => '#/520', +'nv=1/6' => '#/521', +'nv=1/7' => '#/522', +'nv=1/8' => 'Nv/1_8', +'nv=1/9' => '#/523', +'nv=10' => 'Nv/10', +'nv=100' => 'Nv/100', +'nv=1000' => 'Nv/1000', +'nv=10000' => 'Nv/10000', +'nv=100000' => '#/564', +'nv=1000000' => '#/575', +'nv=100000000' => '#/576', +'nv=10000000000' => '#/577', +'nv=1000000000000' => '#/578', +'nv=11' => 'Nv/11', +'nv=11/12' => '#/556', +'nv=11/2' => '#/540', +'nv=12' => 'Nv/12', +'nv=13' => 'Nv/13', +'nv=13/2' => '#/541', +'nv=14' => 'Nv/14', +'nv=15' => 'Nv/15', +'nv=15/2' => '#/542', +'nv=16' => 'Nv/16', +'nv=17' => 'Nv/17', +'nv=17/2' => '#/543', +'nv=18' => 'Nv/18', +'nv=19' => 'Nv/19', +'nv=2' => 'Nv/2', +'nv=2/3' => 'Nv/2_3', +'nv=2/5' => '#/524', +'nv=20' => 'Nv/20', +'nv=200' => 'Nv/200', +'nv=2000' => '#/544', +'nv=20000' => '#/557', +'nv=200000' => '#/565', +'nv=21' => '#/493', +'nv=216000' => '#/566', +'nv=22' => '#/494', +'nv=23' => '#/495', +'nv=24' => '#/496', +'nv=25' => '#/497', +'nv=26' => '#/498', +'nv=27' => '#/499', +'nv=28' => '#/500', +'nv=29' => '#/501', +'nv=3' => 'Nv/3', +'nv=3/16' => 'Nv/3_16', +'nv=3/2' => '#/525', +'nv=3/20' => '#/545', +'nv=3/4' => 'Nv/3_4', +'nv=3/5' => '#/526', +'nv=3/8' => '#/527', +'nv=3/80' => '#/546', +'nv=30' => 'Nv/30', +'nv=300' => 'Nv/300', +'nv=3000' => '#/547', +'nv=30000' => '#/558', +'nv=300000' => '#/567', +'nv=31' => '#/502', +'nv=32' => '#/503', +'nv=33' => '#/504', +'nv=34' => '#/505', +'nv=35' => '#/506', +'nv=36' => '#/507', +'nv=37' => '#/508', +'nv=38' => '#/509', +'nv=39' => '#/510', +'nv=4' => 'Nv/4', +'nv=4/5' => '#/528', +'nv=40' => 'Nv/40', +'nv=400' => 'Nv/400', +'nv=4000' => '#/548', +'nv=40000' => '#/559', +'nv=400000' => '#/568', +'nv=41' => '#/511', +'nv=42' => '#/512', +'nv=43' => '#/513', +'nv=432000' => '#/569', +'nv=44' => '#/514', +'nv=45' => '#/515', +'nv=46' => '#/516', +'nv=47' => '#/517', +'nv=48' => '#/518', +'nv=49' => '#/519', +'nv=5' => 'Nv/5', +'nv=5/12' => '#/549', +'nv=5/2' => '#/529', +'nv=5/6' => '#/530', +'nv=5/8' => '#/531', +'nv=50' => 'Nv/50', +'nv=500' => 'Nv/500', +'nv=5000' => 'Nv/5000', +'nv=50000' => 'Nv/50000', +'nv=500000' => '#/570', +'nv=6' => 'Nv/6', +'nv=60' => 'Nv/60', +'nv=600' => 'Nv/600', +'nv=6000' => '#/550', +'nv=60000' => '#/560', +'nv=600000' => '#/571', +'nv=7' => 'Nv/7', +'nv=7/12' => '#/551', +'nv=7/2' => '#/532', +'nv=7/8' => '#/533', +'nv=70' => 'Nv/70', +'nv=700' => 'Nv/700', +'nv=7000' => '#/552', +'nv=70000' => '#/561', +'nv=700000' => '#/572', +'nv=8' => 'Nv/8', +'nv=80' => 'Nv/80', +'nv=800' => 'Nv/800', +'nv=8000' => '#/553', +'nv=80000' => '#/562', +'nv=800000' => '#/573', +'nv=9' => 'Nv/9', +'nv=9/2' => '#/534', +'nv=90' => 'Nv/90', +'nv=900' => 'Nv/900', +'nv=9000' => '#/554', +'nv=90000' => '#/563', +'nv=900000' => '#/574', +); + +# Maps property, table to file for those using loose matching. For paths +# whose directory is '#', the file is in the form of a numeric index into +# @inline_definitions +%utf8::loose_to_file_of = ( +'adlam' => 'Scx/Adlm', +'adlm' => 'Scx/Adlm', +'aegeannumbers' => '#/324', +'age=na' => 'Age/NA', +'age=unassigned' => 'Age/NA', +'age=v100' => 'Age/V100', +'age=v11' => 'Age/V11', +'age=v20' => 'Age/V20', +'age=v21' => '#/98', +'age=v30' => 'Age/V30', +'age=v31' => 'Age/V31', +'age=v32' => 'Age/V32', +'age=v40' => 'Age/V40', +'age=v41' => 'Age/V41', +'age=v50' => 'Age/V50', +'age=v51' => 'Age/V51', +'age=v52' => 'Age/V52', +'age=v60' => 'Age/V60', +'age=v61' => 'Age/V61', +'age=v62' => '#/99', +'age=v63' => '#/100', +'age=v70' => 'Age/V70', +'age=v80' => 'Age/V80', +'age=v90' => 'Age/V90', +'aghb' => '#/612', +'ahex' => '#/59', +'ahex=f' => '#/!59', +'ahex=false' => '#/!59', +'ahex=n' => '#/!59', +'ahex=no' => '#/!59', +'ahex=t' => '#/59', +'ahex=true' => '#/59', +'ahex=y' => '#/59', +'ahex=yes' => '#/59', +'ahom' => '#/613', +'alchemical' => '#/267', +'alchemicalsymbols' => '#/267', +'all' => '#/1', +'alnum' => 'Perl/Alnum', +'alpha' => 'Alpha/Y', +'alpha=f' => '!Alpha/Y', +'alpha=false' => '!Alpha/Y', +'alpha=n' => '!Alpha/Y', +'alpha=no' => '!Alpha/Y', +'alpha=t' => 'Alpha/Y', +'alpha=true' => 'Alpha/Y', +'alpha=y' => 'Alpha/Y', +'alpha=yes' => 'Alpha/Y', +'alphabetic' => 'Alpha/Y', +'alphabeticpf' => '#/310', +'alphabeticpresentationforms' => '#/310', +'anatolianhieroglyphs' => '#/631', +'ancientgreekmusic' => '#/366', +'ancientgreekmusicalnotation' => '#/366', +'ancientgreeknumbers' => '#/375', +'ancientsymbols' => '#/332', +'any' => '#/2', +'arab' => 'Scx/Arab', +'arabic' => 'Scx/Arab', +'arabicexta' => '#/268', +'arabicextendeda' => '#/268', +'arabicmath' => '#/269', +'arabicmathematicalalphabeticsymbols' => '#/269', +'arabicpfa' => '#/241', +'arabicpfb' => '#/242', +'arabicpresentationformsa' => '#/241', +'arabicpresentationformsb' => '#/242', +'arabicsup' => '#/243', +'arabicsupplement' => '#/243', +'armenian' => 'Scx/Armn', +'armi' => '#/614', +'armn' => 'Scx/Armn', +'arrows' => '#/150', +'ascii' => '#/131', +'asciihexdigit' => '#/59', +'assigned' => 'Perl/Assigned', +'avestan' => '#/615', +'avst' => '#/615', +'bali' => '#/616', +'balinese' => '#/616', +'bamu' => '#/617', +'bamum' => '#/617', +'bamumsup' => '#/215', +'bamumsupplement' => '#/215', +'basiclatin' => '#/131', +'bass' => '#/618', +'bassavah' => '#/618', +'batak' => '#/619', +'batk' => '#/619', +'bc=al' => 'Bc/AL', +'bc=an' => 'Bc/AN', +'bc=arabicletter' => 'Bc/AL', +'bc=arabicnumber' => 'Bc/AN', +'bc=b' => 'Bc/B', +'bc=bn' => 'Bc/BN', +'bc=boundaryneutral' => 'Bc/BN', +'bc=commonseparator' => 'Bc/CS', +'bc=cs' => 'Bc/CS', +'bc=en' => 'Bc/EN', +'bc=es' => 'Bc/ES', +'bc=et' => 'Bc/ET', +'bc=europeannumber' => 'Bc/EN', +'bc=europeanseparator' => 'Bc/ES', +'bc=europeanterminator' => 'Bc/ET', +'bc=firststrongisolate' => '#/102', +'bc=fsi' => '#/102', +'bc=l' => 'Bc/L', +'bc=lefttoright' => 'Bc/L', +'bc=lefttorightembedding' => '#/103', +'bc=lefttorightisolate' => '#/104', +'bc=lefttorightoverride' => '#/105', +'bc=lre' => '#/103', +'bc=lri' => '#/104', +'bc=lro' => '#/105', +'bc=nonspacingmark' => 'Bc/NSM', +'bc=nsm' => 'Bc/NSM', +'bc=on' => 'Bc/ON', +'bc=otherneutral' => 'Bc/ON', +'bc=paragraphseparator' => 'Bc/B', +'bc=pdf' => '#/106', +'bc=pdi' => '#/107', +'bc=popdirectionalformat' => '#/106', +'bc=popdirectionalisolate' => '#/107', +'bc=r' => 'Bc/R', +'bc=righttoleft' => 'Bc/R', +'bc=righttoleftembedding' => '#/108', +'bc=righttoleftisolate' => '#/109', +'bc=righttoleftoverride' => '#/110', +'bc=rle' => '#/108', +'bc=rli' => '#/109', +'bc=rlo' => '#/110', +'bc=s' => '#/101', +'bc=segmentseparator' => '#/101', +'bc=whitespace' => 'Bc/WS', +'bc=ws' => 'Bc/WS', +'beng' => 'Scx/Beng', +'bengali' => 'Scx/Beng', +'bhaiksuki' => 'Scx/Bhks', +'bhks' => 'Scx/Bhks', +'bidic' => 'BidiC/Y', +'bidic=f' => '!BidiC/Y', +'bidic=false' => '!BidiC/Y', +'bidic=n' => '!BidiC/Y', +'bidic=no' => '!BidiC/Y', +'bidic=t' => 'BidiC/Y', +'bidic=true' => 'BidiC/Y', +'bidic=y' => 'BidiC/Y', +'bidic=yes' => 'BidiC/Y', +'bidicontrol' => 'BidiC/Y', +'bidim' => 'BidiM/Y', +'bidim=f' => '!BidiM/Y', +'bidim=false' => '!BidiM/Y', +'bidim=n' => '!BidiM/Y', +'bidim=no' => '!BidiM/Y', +'bidim=t' => 'BidiM/Y', +'bidim=true' => 'BidiM/Y', +'bidim=y' => 'BidiM/Y', +'bidim=yes' => 'BidiM/Y', +'bidimirrored' => 'BidiM/Y', +'blank' => 'Perl/Blank', +'blk=adlam' => '#/132', +'blk=aegeannumbers' => '#/324', +'blk=ahom' => '#/120', +'blk=alchemical' => '#/267', +'blk=alchemicalsymbols' => '#/267', +'blk=alphabeticpf' => '#/310', +'blk=alphabeticpresentationforms' => '#/310', +'blk=anatolianhieroglyphs' => '#/381', +'blk=ancientgreekmusic' => '#/366', +'blk=ancientgreekmusicalnotation' => '#/366', +'blk=ancientgreeknumbers' => '#/375', +'blk=ancientsymbols' => '#/332', +'blk=arabic' => '#/149', +'blk=arabicexta' => '#/268', +'blk=arabicextendeda' => '#/268', +'blk=arabicmath' => '#/269', +'blk=arabicmathematicalalphabeticsymbols' => '#/269', +'blk=arabicpfa' => '#/241', +'blk=arabicpfb' => '#/242', +'blk=arabicpresentationformsa' => '#/241', +'blk=arabicpresentationformsb' => '#/242', +'blk=arabicsup' => '#/243', +'blk=arabicsupplement' => '#/243', +'blk=armenian' => '#/213', +'blk=arrows' => '#/150', +'blk=ascii' => '#/131', +'blk=avestan' => '#/175', +'blk=balinese' => '#/214', +'blk=bamum' => '#/133', +'blk=bamumsup' => '#/215', +'blk=bamumsupplement' => '#/215', +'blk=basiclatin' => '#/131', +'blk=bassavah' => '#/216', +'blk=batak' => '#/134', +'blk=bengali' => '#/176', +'blk=bhaiksuki' => '#/244', +'blk=blockelements' => '#/325', +'blk=bopomofo' => '#/217', +'blk=bopomofoext' => '#/288', +'blk=bopomofoextended' => '#/288', +'blk=boxdrawing' => '#/270', +'blk=brahmi' => '#/151', +'blk=braille' => '#/177', +'blk=braillepatterns' => '#/177', +'blk=buginese' => '#/218', +'blk=buhid' => '#/135', +'blk=byzantinemusic' => '#/333', +'blk=byzantinemusicalsymbols' => '#/333', +'blk=canadiansyllabics' => '#/130', +'blk=carian' => '#/152', +'blk=caucasianalbanian' => '#/367', +'blk=chakma' => '#/153', +'blk=cham' => '#/121', +'blk=cherokee' => '#/219', +'blk=cherokeesup' => '#/289', +'blk=cherokeesupplement' => '#/289', +'blk=cjk' => '#/112', +'blk=cjkcompat' => '#/245', +'blk=cjkcompatforms' => '#/334', +'blk=cjkcompatibility' => '#/245', +'blk=cjkcompatibilityforms' => '#/334', +'blk=cjkcompatibilityideographs' => '#/376', +'blk=cjkcompatibilityideographssupplement' => '#/385', +'blk=cjkcompatideographs' => '#/376', +'blk=cjkcompatideographssup' => '#/385', +'blk=cjkexta' => '#/178', +'blk=cjkextb' => '#/179', +'blk=cjkextc' => '#/180', +'blk=cjkextd' => '#/181', +'blk=cjkexte' => '#/182', +'blk=cjkextf' => '#/183', +'blk=cjkradicalssup' => '#/335', +'blk=cjkradicalssupplement' => '#/335', +'blk=cjkstrokes' => '#/271', +'blk=cjksymbols' => '#/272', +'blk=cjksymbolsandpunctuation' => '#/272', +'blk=cjkunifiedideographs' => '#/112', +'blk=cjkunifiedideographsextensiona' => '#/178', +'blk=cjkunifiedideographsextensionb' => '#/179', +'blk=cjkunifiedideographsextensionc' => '#/180', +'blk=cjkunifiedideographsextensiond' => '#/181', +'blk=cjkunifiedideographsextensione' => '#/182', +'blk=cjkunifiedideographsextensionf' => '#/183', +'blk=combiningdiacriticalmarks' => '#/314', +'blk=combiningdiacriticalmarksextended' => '#/343', +'blk=combiningdiacriticalmarksforsymbols' => '#/386', +'blk=combiningdiacriticalmarkssupplement' => '#/344', +'blk=combininghalfmarks' => '#/248', +'blk=combiningmarksforsymbols' => '#/386', +'blk=commonindicnumberforms' => '#/359', +'blk=compatjamo' => '#/273', +'blk=controlpictures' => '#/341', +'blk=coptic' => '#/154', +'blk=copticepactnumbers' => '#/370', +'blk=countingrod' => '#/290', +'blk=countingrodnumerals' => '#/290', +'blk=cuneiform' => '#/246', +'blk=cuneiformnumbers' => '#/354', +'blk=cuneiformnumbersandpunctuation' => '#/354', +'blk=currencysymbols' => '#/342', +'blk=cypriotsyllabary' => '#/355', +'blk=cyrillic' => '#/220', +'blk=cyrillicexta' => '#/311', +'blk=cyrillicextb' => '#/312', +'blk=cyrillicextc' => '#/313', +'blk=cyrillicextendeda' => '#/311', +'blk=cyrillicextendedb' => '#/312', +'blk=cyrillicextendedc' => '#/313', +'blk=cyrillicsup' => '#/291', +'blk=cyrillicsupplement' => '#/291', +'blk=cyrillicsupplementary' => '#/291', +'blk=deseret' => '#/184', +'blk=devanagari' => '#/274', +'blk=devanagariext' => '#/326', +'blk=devanagariextended' => '#/326', +'blk=diacriticals' => '#/314', +'blk=diacriticalsext' => '#/343', +'blk=diacriticalsforsymbols' => '#/386', +'blk=diacriticalssup' => '#/344', +'blk=dingbats' => '#/221', +'blk=domino' => '#/155', +'blk=dominotiles' => '#/155', +'blk=duployan' => '#/222', +'blk=earlydynasticcuneiform' => '#/387', +'blk=egyptianhieroglyphs' => '#/377', +'blk=elbasan' => '#/185', +'blk=emoticons' => '#/247', +'blk=enclosedalphanum' => '#/356', +'blk=enclosedalphanumerics' => '#/356', +'blk=enclosedalphanumericsupplement' => '#/378', +'blk=enclosedalphanumsup' => '#/378', +'blk=enclosedcjk' => '#/292', +'blk=enclosedcjklettersandmonths' => '#/292', +'blk=enclosedideographicsup' => '#/388', +'blk=enclosedideographicsupplement' => '#/388', +'blk=ethiopic' => '#/223', +'blk=ethiopicext' => '#/293', +'blk=ethiopicexta' => '#/315', +'blk=ethiopicextended' => '#/293', +'blk=ethiopicextendeda' => '#/315', +'blk=ethiopicsup' => '#/294', +'blk=ethiopicsupplement' => '#/294', +'blk=generalpunctuation' => '#/304', +'blk=geometricshapes' => '#/345', +'blk=geometricshapesext' => '#/371', +'blk=geometricshapesextended' => '#/371', +'blk=georgian' => '#/224', +'blk=georgiansup' => '#/295', +'blk=georgiansupplement' => '#/295', +'blk=glagolitic' => '#/275', +'blk=glagoliticsup' => '#/327', +'blk=glagoliticsupplement' => '#/327', +'blk=gothic' => '#/156', +'blk=grantha' => '#/186', +'blk=greek' => '#/136', +'blk=greekandcoptic' => '#/136', +'blk=greekext' => '#/225', +'blk=greekextended' => '#/225', +'blk=gujarati' => '#/226', +'blk=gurmukhi' => '#/227', +'blk=halfandfullforms' => '#/357', +'blk=halfmarks' => '#/248', +'blk=halfwidthandfullwidthforms' => '#/357', +'blk=hangul' => '#/157', +'blk=hangulcompatibilityjamo' => '#/273', +'blk=hanguljamo' => '#/122', +'blk=hanguljamoextendeda' => '#/229', +'blk=hanguljamoextendedb' => '#/230', +'blk=hangulsyllables' => '#/157', +'blk=hanunoo' => '#/187', +'blk=hatran' => '#/158', +'blk=hebrew' => '#/159', +'blk=highprivateusesurrogates' => '#/358', +'blk=highpusurrogates' => '#/358', +'blk=highsurrogates' => '#/336', +'blk=hiragana' => '#/228', +'blk=idc' => '#/113', +'blk=ideographicdescriptioncharacters' => '#/113', +'blk=ideographicsymbols' => '#/372', +'blk=ideographicsymbolsandpunctuation' => '#/372', +'blk=imperialaramaic' => '#/346', +'blk=indicnumberforms' => '#/359', +'blk=inscriptionalpahlavi' => '#/382', +'blk=inscriptionalparthian' => '#/383', +'blk=ipaext' => '#/160', +'blk=ipaextensions' => '#/160', +'blk=jamo' => '#/122', +'blk=jamoexta' => '#/229', +'blk=jamoextb' => '#/230', +'blk=javanese' => '#/231', +'blk=kaithi' => '#/161', +'blk=kanaexta' => '#/232', +'blk=kanaextendeda' => '#/232', +'blk=kanasup' => '#/188', +'blk=kanasupplement' => '#/188', +'blk=kanbun' => '#/162', +'blk=kangxi' => '#/163', +'blk=kangxiradicals' => '#/163', +'blk=kannada' => '#/189', +'blk=katakana' => '#/233', +'blk=katakanaext' => '#/296', +'blk=katakanaphoneticextensions' => '#/296', +'blk=kayahli' => '#/190', +'blk=kharoshthi' => '#/276', +'blk=khmer' => '#/137', +'blk=khmersymbols' => '#/316', +'blk=khojki' => '#/164', +'blk=khudawadi' => '#/249', +'blk=lao' => '#/114', +'blk=latin1' => '#/165', +'blk=latin1sup' => '#/165', +'blk=latin1supplement' => '#/165', +'blk=latinexta' => '#/250', +'blk=latinextadditional' => '#/373', +'blk=latinextb' => '#/251', +'blk=latinextc' => '#/252', +'blk=latinextd' => '#/253', +'blk=latinexte' => '#/254', +'blk=latinextendeda' => '#/250', +'blk=latinextendedadditional' => '#/373', +'blk=latinextendedb' => '#/251', +'blk=latinextendedc' => '#/252', +'blk=latinextendedd' => '#/253', +'blk=latinextendede' => '#/254', +'blk=lepcha' => '#/166', +'blk=letterlikesymbols' => '#/368', +'blk=limbu' => '#/138', +'blk=lineara' => '#/191', +'blk=linearbideograms' => '#/360', +'blk=linearbsyllabary' => '#/361', +'blk=lisu' => '#/123', +'blk=lowsurrogates' => '#/328', +'blk=lycian' => '#/167', +'blk=lydian' => '#/168', +'blk=mahajani' => '#/234', +'blk=mahjong' => '#/192', +'blk=mahjongtiles' => '#/192', +'blk=malayalam' => '#/255', +'blk=mandaic' => '#/193', +'blk=manichaean' => '#/277', +'blk=marchen' => '#/194', +'blk=masaramgondi' => '#/317', +'blk=mathalphanum' => '#/318', +'blk=mathematicalalphanumericsymbols' => '#/318', +'blk=mathematicaloperators' => '#/329', +'blk=mathoperators' => '#/329', +'blk=meeteimayek' => '#/297', +'blk=meeteimayekext' => '#/337', +'blk=meeteimayekextensions' => '#/337', +'blk=mendekikakui' => '#/319', +'blk=meroiticcursive' => '#/347', +'blk=meroitichieroglyphs' => '#/379', +'blk=miao' => '#/124', +'blk=miscarrows' => '#/278', +'blk=miscellaneousmathematicalsymbolsa' => '#/362', +'blk=miscellaneousmathematicalsymbolsb' => '#/363', +'blk=miscellaneoussymbols' => '#/298', +'blk=miscellaneoussymbolsandarrows' => '#/278', +'blk=miscellaneoussymbolsandpictographs' => '#/348', +'blk=miscellaneoustechnical' => '#/330', +'blk=miscmathsymbolsa' => '#/362', +'blk=miscmathsymbolsb' => '#/363', +'blk=miscpictographs' => '#/348', +'blk=miscsymbols' => '#/298', +'blk=misctechnical' => '#/330', +'blk=modi' => '#/125', +'blk=modifierletters' => '#/349', +'blk=modifiertoneletters' => '#/380', +'blk=mongolian' => '#/256', +'blk=mongoliansup' => '#/320', +'blk=mongoliansupplement' => '#/320', +'blk=mro' => '#/115', +'blk=multani' => '#/195', +'blk=music' => '#/139', +'blk=musicalsymbols' => '#/139', +'blk=myanmar' => '#/196', +'blk=myanmarexta' => '#/299', +'blk=myanmarextb' => '#/300', +'blk=myanmarextendeda' => '#/299', +'blk=myanmarextendedb' => '#/300', +'blk=nabataean' => '#/257', +'blk=nb' => 'Blk/NB', +'blk=newa' => '#/126', +'blk=newtailue' => '#/258', +'blk=nko' => '#/116', +'blk=noblock' => 'Blk/NB', +'blk=numberforms' => '#/301', +'blk=nushu' => '#/140', +'blk=ocr' => '#/117', +'blk=ogham' => '#/141', +'blk=olchiki' => '#/197', +'blk=oldhungarian' => '#/321', +'blk=olditalic' => '#/259', +'blk=oldnortharabian' => '#/350', +'blk=oldpermic' => '#/260', +'blk=oldpersian' => '#/279', +'blk=oldsoutharabian' => '#/351', +'blk=oldturkic' => '#/261', +'blk=opticalcharacterrecognition' => '#/117', +'blk=oriya' => '#/142', +'blk=ornamentaldingbats' => '#/374', +'blk=osage' => '#/143', +'blk=osmanya' => '#/198', +'blk=pahawhhmong' => '#/302', +'blk=palmyrene' => '#/262', +'blk=paucinhau' => '#/263', +'blk=phagspa' => '#/199', +'blk=phaistos' => '#/235', +'blk=phaistosdisc' => '#/235', +'blk=phoenician' => '#/280', +'blk=phoneticext' => '#/303', +'blk=phoneticextensions' => '#/303', +'blk=phoneticextensionssupplement' => '#/338', +'blk=phoneticextsup' => '#/338', +'blk=playingcards' => '#/322', +'blk=privateuse' => '#/118', +'blk=privateusearea' => '#/118', +'blk=psalterpahlavi' => '#/339', +'blk=pua' => '#/118', +'blk=punctuation' => '#/304', +'blk=rejang' => '#/169', +'blk=rumi' => '#/127', +'blk=ruminumeralsymbols' => '#/127', +'blk=runic' => '#/144', +'blk=samaritan' => '#/264', +'blk=saurashtra' => '#/281', +'blk=sharada' => '#/200', +'blk=shavian' => '#/201', +'blk=shorthandformatcontrols' => '#/389', +'blk=siddham' => '#/202', +'blk=sinhala' => '#/203', +'blk=sinhalaarchaicnumbers' => '#/384', +'blk=smallforms' => '#/282', +'blk=smallformvariants' => '#/282', +'blk=sorasompeng' => '#/305', +'blk=soyombo' => '#/204', +'blk=spacingmodifierletters' => '#/349', +'blk=specials' => '#/236', +'blk=sundanese' => '#/265', +'blk=sundanesesup' => '#/323', +'blk=sundanesesupplement' => '#/323', +'blk=suparrowsa' => '#/283', +'blk=suparrowsb' => '#/284', +'blk=suparrowsc' => '#/285', +'blk=superandsub' => '#/306', +'blk=superscriptsandsubscripts' => '#/306', +'blk=supmathoperators' => '#/364', +'blk=supplementalarrowsa' => '#/283', +'blk=supplementalarrowsb' => '#/284', +'blk=supplementalarrowsc' => '#/285', +'blk=supplementalmathematicaloperators' => '#/364', +'blk=supplementalpunctuation' => '#/340', +'blk=supplementalsymbolsandpictographs' => '#/390', +'blk=supplementaryprivateuseareaa' => '#/205', +'blk=supplementaryprivateuseareab' => '#/206', +'blk=suppuaa' => '#/205', +'blk=suppuab' => '#/206', +'blk=suppunctuation' => '#/340', +'blk=supsymbolsandpictographs' => '#/390', +'blk=suttonsignwriting' => '#/369', +'blk=sylotinagri' => '#/307', +'blk=syriac' => '#/170', +'blk=syriacsup' => '#/266', +'blk=syriacsupplement' => '#/266', +'blk=tagalog' => '#/207', +'blk=tagbanwa' => '#/237', +'blk=tags' => '#/128', +'blk=taile' => '#/145', +'blk=taitham' => '#/208', +'blk=taiviet' => '#/209', +'blk=taixuanjing' => '#/308', +'blk=taixuanjingsymbols' => '#/308', +'blk=takri' => '#/146', +'blk=tamil' => '#/147', +'blk=tangut' => '#/171', +'blk=tangutcomponents' => '#/365', +'blk=telugu' => '#/172', +'blk=thaana' => '#/173', +'blk=thai' => '#/129', +'blk=tibetan' => '#/210', +'blk=tifinagh' => '#/238', +'blk=tirhuta' => '#/211', +'blk=transportandmap' => '#/352', +'blk=transportandmapsymbols' => '#/352', +'blk=ucas' => '#/130', +'blk=ucasext' => '#/212', +'blk=ugaritic' => '#/239', +'blk=unifiedcanadianaboriginalsyllabics' => '#/130', +'blk=unifiedcanadianaboriginalsyllabicsextended' => '#/212', +'blk=vai' => '#/119', +'blk=variationselectors' => '#/111', +'blk=variationselectorssupplement' => '#/148', +'blk=vedicext' => '#/240', +'blk=vedicextensions' => '#/240', +'blk=verticalforms' => '#/331', +'blk=vs' => '#/111', +'blk=vssup' => '#/148', +'blk=warangciti' => '#/286', +'blk=yijing' => '#/174', +'blk=yijinghexagramsymbols' => '#/174', +'blk=yiradicals' => '#/287', +'blk=yisyllables' => '#/309', +'blk=zanabazarsquare' => '#/353', +'blockelements' => '#/325', +'bopo' => 'Scx/Bopo', +'bopomofo' => 'Scx/Bopo', +'bopomofoext' => '#/288', +'bopomofoextended' => '#/288', +'boxdrawing' => '#/270', +'bpt=c' => 'Bpt/C', +'bpt=close' => 'Bpt/C', +'bpt=n' => 'Bpt/N', +'bpt=none' => 'Bpt/N', +'bpt=o' => 'Bpt/O', +'bpt=open' => 'Bpt/O', +'brah' => '#/620', +'brahmi' => '#/620', +'brai' => '#/177', +'braille' => '#/177', +'braillepatterns' => '#/177', +'bugi' => '#/621', +'buginese' => '#/621', +'buhd' => '#/622', +'buhid' => '#/622', +'byzantinemusic' => '#/333', +'byzantinemusicalsymbols' => '#/333', +'c' => 'Gc/C', +'cakm' => 'Scx/Cakm', +'canadianaboriginal' => '#/623', +'canadiansyllabics' => '#/130', +'cans' => '#/623', +'cari' => '#/624', +'carian' => '#/624', +'cased' => 'Cased/Y', +'cased=f' => '!Cased/Y', +'cased=false' => '!Cased/Y', +'cased=n' => '!Cased/Y', +'cased=no' => '!Cased/Y', +'cased=t' => 'Cased/Y', +'cased=true' => 'Cased/Y', +'cased=y' => 'Cased/Y', +'cased=yes' => 'Cased/Y', +'casedletter' => 'Gc/LC', +'caseignorable' => 'CI/Y', +'caucasianalbanian' => '#/612', +'cc' => '#/394', +'ccc=a' => 'Ccc/A', +'ccc=above' => 'Ccc/A', +'ccc=aboveleft' => 'Ccc/AL', +'ccc=aboveright' => 'Ccc/AR', +'ccc=al' => 'Ccc/AL', +'ccc=ar' => 'Ccc/AR', +'ccc=ata' => '#/21', +'ccc=atar' => 'Ccc/ATAR', +'ccc=atb' => '#/22', +'ccc=atbl' => '#/0', +'ccc=attachedabove' => '#/21', +'ccc=attachedaboveright' => 'Ccc/ATAR', +'ccc=attachedbelow' => '#/22', +'ccc=attachedbelowleft' => '#/0', +'ccc=b' => 'Ccc/B', +'ccc=below' => 'Ccc/B', +'ccc=belowleft' => '#/17', +'ccc=belowright' => 'Ccc/BR', +'ccc=bl' => '#/17', +'ccc=br' => 'Ccc/BR', +'ccc=ccc10' => '#/23', +'ccc=ccc103' => '#/52', +'ccc=ccc107' => '#/53', +'ccc=ccc11' => '#/24', +'ccc=ccc118' => '#/54', +'ccc=ccc12' => '#/25', +'ccc=ccc122' => '#/55', +'ccc=ccc129' => '#/56', +'ccc=ccc13' => '#/26', +'ccc=ccc130' => '#/57', +'ccc=ccc132' => '#/58', +'ccc=ccc133' => '#/0', +'ccc=ccc14' => '#/27', +'ccc=ccc15' => '#/28', +'ccc=ccc16' => '#/29', +'ccc=ccc17' => '#/30', +'ccc=ccc18' => '#/31', +'ccc=ccc19' => '#/32', +'ccc=ccc20' => '#/33', +'ccc=ccc21' => '#/34', +'ccc=ccc22' => '#/35', +'ccc=ccc23' => '#/36', +'ccc=ccc24' => '#/37', +'ccc=ccc25' => '#/38', +'ccc=ccc26' => '#/39', +'ccc=ccc27' => '#/40', +'ccc=ccc28' => '#/41', +'ccc=ccc29' => '#/42', +'ccc=ccc30' => '#/43', +'ccc=ccc31' => '#/44', +'ccc=ccc32' => '#/45', +'ccc=ccc33' => '#/46', +'ccc=ccc34' => '#/47', +'ccc=ccc35' => '#/48', +'ccc=ccc36' => '#/49', +'ccc=ccc84' => '#/50', +'ccc=ccc91' => '#/51', +'ccc=da' => '#/18', +'ccc=db' => 'Ccc/DB', +'ccc=doubleabove' => '#/18', +'ccc=doublebelow' => 'Ccc/DB', +'ccc=iotasubscript' => '#/19', +'ccc=is' => '#/19', +'ccc=kanavoicing' => '#/20', +'ccc=kv' => '#/20', +'ccc=l' => '#/15', +'ccc=left' => '#/15', +'ccc=nk' => 'Ccc/NK', +'ccc=notreordered' => 'Ccc/NR', +'ccc=nr' => 'Ccc/NR', +'ccc=nukta' => 'Ccc/NK', +'ccc=ov' => 'Ccc/OV', +'ccc=overlay' => 'Ccc/OV', +'ccc=r' => '#/16', +'ccc=right' => '#/16', +'ccc=virama' => 'Ccc/VR', +'ccc=vr' => 'Ccc/VR', +'ce' => 'CE/Y', +'ce=f' => '!CE/Y', +'ce=false' => '!CE/Y', +'ce=n' => '!CE/Y', +'ce=no' => '!CE/Y', +'ce=t' => 'CE/Y', +'ce=true' => 'CE/Y', +'ce=y' => 'CE/Y', +'ce=yes' => 'CE/Y', +'cf' => 'Gc/Cf', +'chakma' => 'Scx/Cakm', +'cham' => 'Scx/Cham', +'changeswhencasefolded' => 'CWCF/Y', +'changeswhencasemapped' => 'CWCM/Y', +'changeswhenlowercased' => 'CWL/Y', +'changeswhennfkccasefolded' => 'CWKCF/Y', +'changeswhentitlecased' => 'CWT/Y', +'changeswhenuppercased' => 'CWU/Y', +'cher' => '#/625', +'cherokee' => '#/625', +'cherokeesup' => '#/289', +'cherokeesupplement' => '#/289', +'ci' => 'CI/Y', +'ci=f' => '!CI/Y', +'ci=false' => '!CI/Y', +'ci=n' => '!CI/Y', +'ci=no' => '!CI/Y', +'ci=t' => 'CI/Y', +'ci=true' => 'CI/Y', +'ci=y' => 'CI/Y', +'ci=yes' => 'CI/Y', +'cjk' => '#/112', +'cjkcompat' => '#/245', +'cjkcompatforms' => '#/334', +'cjkcompatibility' => '#/245', +'cjkcompatibilityforms' => '#/334', +'cjkcompatibilityideographs' => '#/376', +'cjkcompatibilityideographssupplement' => '#/385', +'cjkcompatideographs' => '#/376', +'cjkcompatideographssup' => '#/385', +'cjkexta' => '#/178', +'cjkextb' => '#/179', +'cjkextc' => '#/180', +'cjkextd' => '#/181', +'cjkexte' => '#/182', +'cjkextf' => '#/183', +'cjkradicalssup' => '#/335', +'cjkradicalssupplement' => '#/335', +'cjkstrokes' => '#/271', +'cjksymbols' => '#/272', +'cjksymbolsandpunctuation' => '#/272', +'cjkunifiedideographs' => '#/112', +'cjkunifiedideographsextensiona' => '#/178', +'cjkunifiedideographsextensionb' => '#/179', +'cjkunifiedideographsextensionc' => '#/180', +'cjkunifiedideographsextensiond' => '#/181', +'cjkunifiedideographsextensione' => '#/182', +'cjkunifiedideographsextensionf' => '#/183', +'closepunctuation' => 'Gc/Pe', +'cn' => 'Gc/Cn', +'cntrl' => '#/394', +'co' => '#/395', +'combiningdiacriticalmarks' => '#/314', +'combiningdiacriticalmarksextended' => '#/343', +'combiningdiacriticalmarksforsymbols' => '#/386', +'combiningdiacriticalmarkssupplement' => '#/344', +'combininghalfmarks' => '#/248', +'combiningmark' => 'Gc/M', +'combiningmarksforsymbols' => '#/386', +'common' => 'Scx/Zyyy', +'commonindicnumberforms' => '#/359', +'compatjamo' => '#/273', +'compex' => 'CompEx/Y', +'compex=f' => '!CompEx/Y', +'compex=false' => '!CompEx/Y', +'compex=n' => '!CompEx/Y', +'compex=no' => '!CompEx/Y', +'compex=t' => 'CompEx/Y', +'compex=true' => 'CompEx/Y', +'compex=y' => 'CompEx/Y', +'compex=yes' => 'CompEx/Y', +'compositionexclusion' => 'CE/Y', +'connectorpunctuation' => 'Gc/Pc', +'control' => '#/394', +'controlpictures' => '#/341', +'copt' => 'Scx/Copt', +'coptic' => 'Scx/Copt', +'copticepactnumbers' => '#/370', +'countingrod' => '#/290', +'countingrodnumerals' => '#/290', +'cprt' => 'Scx/Cprt', +'cs' => '#/14', +'cuneiform' => 'Scx/Xsux', +'cuneiformnumbers' => '#/354', +'cuneiformnumbersandpunctuation' => '#/354', +'currencysymbol' => 'Gc/Sc', +'currencysymbols' => '#/342', +'cwcf' => 'CWCF/Y', +'cwcf=f' => '!CWCF/Y', +'cwcf=false' => '!CWCF/Y', +'cwcf=n' => '!CWCF/Y', +'cwcf=no' => '!CWCF/Y', +'cwcf=t' => 'CWCF/Y', +'cwcf=true' => 'CWCF/Y', +'cwcf=y' => 'CWCF/Y', +'cwcf=yes' => 'CWCF/Y', +'cwcm' => 'CWCM/Y', +'cwcm=f' => '!CWCM/Y', +'cwcm=false' => '!CWCM/Y', +'cwcm=n' => '!CWCM/Y', +'cwcm=no' => '!CWCM/Y', +'cwcm=t' => 'CWCM/Y', +'cwcm=true' => 'CWCM/Y', +'cwcm=y' => 'CWCM/Y', +'cwcm=yes' => 'CWCM/Y', +'cwkcf' => 'CWKCF/Y', +'cwkcf=f' => '!CWKCF/Y', +'cwkcf=false' => '!CWKCF/Y', +'cwkcf=n' => '!CWKCF/Y', +'cwkcf=no' => '!CWKCF/Y', +'cwkcf=t' => 'CWKCF/Y', +'cwkcf=true' => 'CWKCF/Y', +'cwkcf=y' => 'CWKCF/Y', +'cwkcf=yes' => 'CWKCF/Y', +'cwl' => 'CWL/Y', +'cwl=f' => '!CWL/Y', +'cwl=false' => '!CWL/Y', +'cwl=n' => '!CWL/Y', +'cwl=no' => '!CWL/Y', +'cwl=t' => 'CWL/Y', +'cwl=true' => 'CWL/Y', +'cwl=y' => 'CWL/Y', +'cwl=yes' => 'CWL/Y', +'cwt' => 'CWT/Y', +'cwt=f' => '!CWT/Y', +'cwt=false' => '!CWT/Y', +'cwt=n' => '!CWT/Y', +'cwt=no' => '!CWT/Y', +'cwt=t' => 'CWT/Y', +'cwt=true' => 'CWT/Y', +'cwt=y' => 'CWT/Y', +'cwt=yes' => 'CWT/Y', +'cwu' => 'CWU/Y', +'cwu=f' => '!CWU/Y', +'cwu=false' => '!CWU/Y', +'cwu=n' => '!CWU/Y', +'cwu=no' => '!CWU/Y', +'cwu=t' => 'CWU/Y', +'cwu=true' => 'CWU/Y', +'cwu=y' => 'CWU/Y', +'cwu=yes' => 'CWU/Y', +'cypriot' => 'Scx/Cprt', +'cypriotsyllabary' => '#/355', +'cyrillic' => 'Scx/Cyrl', +'cyrillicexta' => '#/311', +'cyrillicextb' => '#/312', +'cyrillicextc' => '#/313', +'cyrillicextendeda' => '#/311', +'cyrillicextendedb' => '#/312', +'cyrillicextendedc' => '#/313', +'cyrillicsup' => '#/291', +'cyrillicsupplement' => '#/291', +'cyrillicsupplementary' => '#/291', +'cyrl' => 'Scx/Cyrl', +'dash' => 'Dash/Y', +'dash=f' => '!Dash/Y', +'dash=false' => '!Dash/Y', +'dash=n' => '!Dash/Y', +'dash=no' => '!Dash/Y', +'dash=t' => 'Dash/Y', +'dash=true' => 'Dash/Y', +'dash=y' => 'Dash/Y', +'dash=yes' => 'Dash/Y', +'dashpunctuation' => 'Gc/Pd', +'decimalnumber' => 'Gc/Nd', +'defaultignorablecodepoint' => 'DI/Y', +'dep' => 'Dep/Y', +'dep=f' => '!Dep/Y', +'dep=false' => '!Dep/Y', +'dep=n' => '!Dep/Y', +'dep=no' => '!Dep/Y', +'dep=t' => 'Dep/Y', +'dep=true' => 'Dep/Y', +'dep=y' => 'Dep/Y', +'dep=yes' => 'Dep/Y', +'deprecated' => 'Dep/Y', +'deseret' => '#/184', +'deva' => 'Scx/Deva', +'devanagari' => 'Scx/Deva', +'devanagariext' => '#/326', +'devanagariextended' => '#/326', +'di' => 'DI/Y', +'di=f' => '!DI/Y', +'di=false' => '!DI/Y', +'di=n' => '!DI/Y', +'di=no' => '!DI/Y', +'di=t' => 'DI/Y', +'di=true' => 'DI/Y', +'di=y' => 'DI/Y', +'di=yes' => 'DI/Y', +'dia' => 'Dia/Y', +'dia=f' => '!Dia/Y', +'dia=false' => '!Dia/Y', +'dia=n' => '!Dia/Y', +'dia=no' => '!Dia/Y', +'dia=t' => 'Dia/Y', +'dia=true' => 'Dia/Y', +'dia=y' => 'Dia/Y', +'dia=yes' => 'Dia/Y', +'diacritic' => 'Dia/Y', +'diacriticals' => '#/314', +'diacriticalsext' => '#/343', +'diacriticalsforsymbols' => '#/386', +'diacriticalssup' => '#/344', +'digit' => 'Gc/Nd', +'dingbats' => '#/221', +'domino' => '#/155', +'dominotiles' => '#/155', +'dsrt' => '#/184', +'dt=can' => 'NFDQC/N', +'dt=canonical' => 'NFDQC/N', +'dt=circle' => 'Dt/Enc', +'dt=com' => 'Dt/Com', +'dt=compat' => 'Dt/Com', +'dt=enc' => 'Dt/Enc', +'dt=fin' => 'Dt/Fin', +'dt=final' => 'Dt/Fin', +'dt=font' => 'Dt/Font', +'dt=fra' => '#/391', +'dt=fraction' => '#/391', +'dt=init' => 'Dt/Init', +'dt=initial' => 'Dt/Init', +'dt=iso' => 'Dt/Iso', +'dt=isolated' => 'Dt/Iso', +'dt=med' => 'Dt/Med', +'dt=medial' => 'Dt/Med', +'dt=nar' => 'Dt/Nar', +'dt=narrow' => 'Dt/Nar', +'dt=nb' => 'Dt/Nb', +'dt=nobreak' => 'Dt/Nb', +'dt=noncanon' => 'Dt/NonCanon', +'dt=noncanonical' => 'Dt/NonCanon', +'dt=none' => 'NFKDQC/Y', +'dt=small' => '#/392', +'dt=sml' => '#/392', +'dt=sqr' => 'Dt/Sqr', +'dt=square' => 'Dt/Sqr', +'dt=sub' => 'Dt/Sub', +'dt=sup' => 'Dt/Sup', +'dt=super' => 'Dt/Sup', +'dt=vert' => 'Dt/Vert', +'dt=vertical' => 'Dt/Vert', +'dt=wide' => '#/393', +'dupl' => 'Scx/Dupl', +'duployan' => 'Scx/Dupl', +'ea=a' => 'Ea/A', +'ea=ambiguous' => 'Ea/A', +'ea=f' => '#/393', +'ea=fullwidth' => '#/393', +'ea=h' => 'Ea/H', +'ea=halfwidth' => 'Ea/H', +'ea=n' => 'Ea/N', +'ea=na' => 'Ea/Na', +'ea=narrow' => 'Ea/Na', +'ea=neutral' => 'Ea/N', +'ea=w' => 'Ea/W', +'ea=wide' => 'Ea/W', +'earlydynasticcuneiform' => '#/387', +'egyp' => '#/626', +'egyptianhieroglyphs' => '#/626', +'elba' => '#/627', +'elbasan' => '#/627', +'emoticons' => '#/247', +'enclosedalphanum' => '#/356', +'enclosedalphanumerics' => '#/356', +'enclosedalphanumericsupplement' => '#/378', +'enclosedalphanumsup' => '#/378', +'enclosedcjk' => '#/292', +'enclosedcjklettersandmonths' => '#/292', +'enclosedideographicsup' => '#/388', +'enclosedideographicsupplement' => '#/388', +'enclosingmark' => 'Gc/Me', +'ethi' => 'Scx/Ethi', +'ethiopic' => 'Scx/Ethi', +'ethiopicext' => '#/293', +'ethiopicexta' => '#/315', +'ethiopicextended' => '#/293', +'ethiopicextendeda' => '#/315', +'ethiopicsup' => '#/294', +'ethiopicsupplement' => '#/294', +'ext' => 'Ext/Y', +'ext=f' => '!Ext/Y', +'ext=false' => '!Ext/Y', +'ext=n' => '!Ext/Y', +'ext=no' => '!Ext/Y', +'ext=t' => 'Ext/Y', +'ext=true' => 'Ext/Y', +'ext=y' => 'Ext/Y', +'ext=yes' => 'Ext/Y', +'extender' => 'Ext/Y', +'finalpunctuation' => 'Gc/Pf', +'format' => 'Gc/Cf', +'fullcompositionexclusion' => 'CompEx/Y', +'gc=c' => 'Gc/C', +'gc=casedletter' => 'Gc/LC', +'gc=cc' => '#/394', +'gc=cf' => 'Gc/Cf', +'gc=closepunctuation' => 'Gc/Pe', +'gc=cn' => 'Gc/Cn', +'gc=cntrl' => '#/394', +'gc=co' => '#/395', +'gc=combiningmark' => 'Gc/M', +'gc=connectorpunctuation' => 'Gc/Pc', +'gc=control' => '#/394', +'gc=cs' => '#/14', +'gc=currencysymbol' => 'Gc/Sc', +'gc=dashpunctuation' => 'Gc/Pd', +'gc=decimalnumber' => 'Gc/Nd', +'gc=digit' => 'Gc/Nd', +'gc=enclosingmark' => 'Gc/Me', +'gc=finalpunctuation' => 'Gc/Pf', +'gc=format' => 'Gc/Cf', +'gc=initialpunctuation' => 'Gc/Pi', +'gc=l' => 'Gc/L', +'gc=l&' => 'Gc/LC', +'gc=l_' => 'Gc/LC', +'gc=lc' => 'Gc/LC', +'gc=letter' => 'Gc/L', +'gc=letternumber' => 'Gc/Nl', +'gc=lineseparator' => '#/396', +'gc=ll' => 'Gc/Ll', +'gc=lm' => 'Gc/Lm', +'gc=lo' => 'Gc/Lo', +'gc=lowercaseletter' => 'Gc/Ll', +'gc=lt' => 'Perl/Title', +'gc=lu' => 'Gc/Lu', +'gc=m' => 'Gc/M', +'gc=mark' => 'Gc/M', +'gc=mathsymbol' => 'Gc/Sm', +'gc=mc' => 'Gc/Mc', +'gc=me' => 'Gc/Me', +'gc=mn' => 'Gc/Mn', +'gc=modifierletter' => 'Gc/Lm', +'gc=modifiersymbol' => 'Gc/Sk', +'gc=n' => 'Gc/N', +'gc=nd' => 'Gc/Nd', +'gc=nl' => 'Gc/Nl', +'gc=no' => 'Gc/No', +'gc=nonspacingmark' => 'Gc/Mn', +'gc=number' => 'Gc/N', +'gc=openpunctuation' => 'Gc/Ps', +'gc=other' => 'Gc/C', +'gc=otherletter' => 'Gc/Lo', +'gc=othernumber' => 'Gc/No', +'gc=otherpunctuation' => 'Gc/Po', +'gc=othersymbol' => 'Gc/So', +'gc=p' => 'Gc/P', +'gc=paragraphseparator' => '#/397', +'gc=pc' => 'Gc/Pc', +'gc=pd' => 'Gc/Pd', +'gc=pe' => 'Gc/Pe', +'gc=pf' => 'Gc/Pf', +'gc=pi' => 'Gc/Pi', +'gc=po' => 'Gc/Po', +'gc=privateuse' => '#/395', +'gc=ps' => 'Gc/Ps', +'gc=punct' => 'Gc/P', +'gc=punctuation' => 'Gc/P', +'gc=s' => 'Gc/S', +'gc=sc' => 'Gc/Sc', +'gc=separator' => 'Gc/Z', +'gc=sk' => 'Gc/Sk', +'gc=sm' => 'Gc/Sm', +'gc=so' => 'Gc/So', +'gc=spaceseparator' => 'Gc/Zs', +'gc=spacingmark' => 'Gc/Mc', +'gc=surrogate' => '#/14', +'gc=symbol' => 'Gc/S', +'gc=titlecaseletter' => 'Perl/Title', +'gc=unassigned' => 'Gc/Cn', +'gc=uppercaseletter' => 'Gc/Lu', +'gc=z' => 'Gc/Z', +'gc=zl' => '#/396', +'gc=zp' => '#/397', +'gc=zs' => 'Gc/Zs', +'gcb=cn' => 'GCB/CN', +'gcb=control' => 'GCB/CN', +'gcb=cr' => '#/63', +'gcb=eb' => 'GCB/EB', +'gcb=ebase' => 'GCB/EB', +'gcb=ebasegaz' => '#/67', +'gcb=ebg' => '#/67', +'gcb=em' => '#/64', +'gcb=emodifier' => '#/64', +'gcb=ex' => 'GCB/EX', +'gcb=extend' => 'GCB/EX', +'gcb=gaz' => 'GCB/GAZ', +'gcb=glueafterzwj' => 'GCB/GAZ', +'gcb=l' => '#/60', +'gcb=lf' => '#/65', +'gcb=lv' => 'GCB/LV', +'gcb=lvt' => 'GCB/LVT', +'gcb=other' => 'GCB/XX', +'gcb=pp' => 'GCB/PP', +'gcb=prepend' => 'GCB/PP', +'gcb=regionalindicator' => '#/66', +'gcb=ri' => '#/66', +'gcb=sm' => 'GCB/SM', +'gcb=spacingmark' => 'GCB/SM', +'gcb=t' => '#/61', +'gcb=v' => '#/62', +'gcb=xx' => 'GCB/XX', +'gcb=zwj' => '#/68', +'generalpunctuation' => '#/304', +'geometricshapes' => '#/345', +'geometricshapesext' => '#/371', +'geometricshapesextended' => '#/371', +'geor' => 'Scx/Geor', +'georgian' => 'Scx/Geor', +'georgiansup' => '#/295', +'georgiansupplement' => '#/295', +'glag' => 'Scx/Glag', +'glagolitic' => 'Scx/Glag', +'glagoliticsup' => '#/327', +'glagoliticsupplement' => '#/327', +'gonm' => 'Scx/Gonm', +'goth' => '#/628', +'gothic' => '#/628', +'gran' => 'Scx/Gran', +'grantha' => 'Scx/Gran', +'graph' => 'Perl/Graph', +'graphemebase' => 'GrBase/Y', +'graphemeextend' => 'GCB/EX', +'grbase' => 'GrBase/Y', +'grbase=f' => '!GrBase/Y', +'grbase=false' => '!GrBase/Y', +'grbase=n' => '!GrBase/Y', +'grbase=no' => '!GrBase/Y', +'grbase=t' => 'GrBase/Y', +'grbase=true' => 'GrBase/Y', +'grbase=y' => 'GrBase/Y', +'grbase=yes' => 'GrBase/Y', +'greek' => 'Scx/Grek', +'greekandcoptic' => '#/136', +'greekext' => '#/225', +'greekextended' => '#/225', +'grek' => 'Scx/Grek', +'grext' => 'GCB/EX', +'grext=f' => '!GCB/EX', +'grext=false' => '!GCB/EX', +'grext=n' => '!GCB/EX', +'grext=no' => '!GCB/EX', +'grext=t' => 'GCB/EX', +'grext=true' => 'GCB/EX', +'grext=y' => 'GCB/EX', +'grext=yes' => 'GCB/EX', +'gujarati' => 'Scx/Gujr', +'gujr' => 'Scx/Gujr', +'gurmukhi' => 'Scx/Guru', +'guru' => 'Scx/Guru', +'halfandfullforms' => '#/357', +'halfmarks' => '#/248', +'halfwidthandfullwidthforms' => '#/357', +'han' => 'Scx/Han', +'hang' => 'Scx/Hang', +'hangul' => 'Scx/Hang', +'hangulcompatibilityjamo' => '#/273', +'hanguljamo' => '#/122', +'hanguljamoextendeda' => '#/229', +'hanguljamoextendedb' => '#/230', +'hangulsyllables' => '#/157', +'hani' => 'Scx/Han', +'hano' => '#/629', +'hanunoo' => '#/629', +'hatr' => '#/630', +'hatran' => '#/630', +'hebr' => 'Scx/Hebr', +'hebrew' => 'Scx/Hebr', +'hex' => 'Hex/Y', +'hex=f' => '!Hex/Y', +'hex=false' => '!Hex/Y', +'hex=n' => '!Hex/Y', +'hex=no' => '!Hex/Y', +'hex=t' => 'Hex/Y', +'hex=true' => 'Hex/Y', +'hex=y' => 'Hex/Y', +'hex=yes' => 'Hex/Y', +'hexdigit' => 'Hex/Y', +'highprivateusesurrogates' => '#/358', +'highpusurrogates' => '#/358', +'highsurrogates' => '#/336', +'hira' => 'Scx/Hira', +'hiragana' => 'Scx/Hira', +'hluw' => '#/631', +'hmng' => 'Scx/Hmng', +'horizspace' => 'Perl/Blank', +'hst=l' => '#/60', +'hst=leadingjamo' => '#/60', +'hst=lv' => 'GCB/LV', +'hst=lvsyllable' => 'GCB/LV', +'hst=lvt' => 'GCB/LVT', +'hst=lvtsyllable' => 'GCB/LVT', +'hst=na' => 'Hst/NA', +'hst=notapplicable' => 'Hst/NA', +'hst=t' => '#/61', +'hst=trailingjamo' => '#/61', +'hst=v' => '#/62', +'hst=voweljamo' => '#/62', +'hung' => '#/632', +'hyphen' => 'Hyphen/T', +'hyphen=f' => '!Hyphen/T', +'hyphen=false' => '!Hyphen/T', +'hyphen=n' => '!Hyphen/T', +'hyphen=no' => '!Hyphen/T', +'hyphen=t' => 'Hyphen/T', +'hyphen=true' => 'Hyphen/T', +'hyphen=y' => 'Hyphen/T', +'hyphen=yes' => 'Hyphen/T', +'idc' => 'IDC/Y', +'idc=f' => '!IDC/Y', +'idc=false' => '!IDC/Y', +'idc=n' => '!IDC/Y', +'idc=no' => '!IDC/Y', +'idc=t' => 'IDC/Y', +'idc=true' => 'IDC/Y', +'idc=y' => 'IDC/Y', +'idc=yes' => 'IDC/Y', +'idcontinue' => 'IDC/Y', +'ideo' => 'Ideo/Y', +'ideo=f' => '!Ideo/Y', +'ideo=false' => '!Ideo/Y', +'ideo=n' => '!Ideo/Y', +'ideo=no' => '!Ideo/Y', +'ideo=t' => 'Ideo/Y', +'ideo=true' => 'Ideo/Y', +'ideo=y' => 'Ideo/Y', +'ideo=yes' => 'Ideo/Y', +'ideographic' => 'Ideo/Y', +'ideographicdescriptioncharacters' => '#/113', +'ideographicsymbols' => '#/372', +'ideographicsymbolsandpunctuation' => '#/372', +'ids' => 'IDS/Y', +'ids=f' => '!IDS/Y', +'ids=false' => '!IDS/Y', +'ids=n' => '!IDS/Y', +'ids=no' => '!IDS/Y', +'ids=t' => 'IDS/Y', +'ids=true' => 'IDS/Y', +'ids=y' => 'IDS/Y', +'ids=yes' => 'IDS/Y', +'idsb' => '#/69', +'idsb=f' => '#/!69', +'idsb=false' => '#/!69', +'idsb=n' => '#/!69', +'idsb=no' => '#/!69', +'idsb=t' => '#/69', +'idsb=true' => '#/69', +'idsb=y' => '#/69', +'idsb=yes' => '#/69', +'idsbinaryoperator' => '#/69', +'idst' => '#/71', +'idst=f' => '#/!71', +'idst=false' => '#/!71', +'idst=n' => '#/!71', +'idst=no' => '#/!71', +'idst=t' => '#/71', +'idst=true' => '#/71', +'idst=y' => '#/71', +'idst=yes' => '#/71', +'idstart' => 'IDS/Y', +'idstrinaryoperator' => '#/71', +'imperialaramaic' => '#/614', +'in=unassigned' => 'Age/NA', +'in=v100' => 'In/10_0', +'in=v20' => 'In/2_0', +'in=v21' => 'In/2_1', +'in=v30' => 'In/3_0', +'in=v31' => 'In/3_1', +'in=v32' => 'In/3_2', +'in=v40' => 'In/4_0', +'in=v41' => 'In/4_1', +'in=v50' => 'In/5_0', +'in=v51' => 'In/5_1', +'in=v52' => 'In/5_2', +'in=v60' => 'In/6_0', +'in=v61' => 'In/6_1', +'in=v62' => 'In/6_2', +'in=v63' => 'In/6_3', +'in=v70' => 'In/7_0', +'in=v80' => 'In/8_0', +'in=v90' => 'In/9_0', +'inadlam' => '#/132', +'inaegeannumbers' => '#/324', +'inahom' => '#/120', +'inalchemical' => '#/267', +'inalchemicalsymbols' => '#/267', +'inalphabeticpf' => '#/310', +'inalphabeticpresentationforms' => '#/310', +'inanatolianhieroglyphs' => '#/381', +'inancientgreekmusic' => '#/366', +'inancientgreekmusicalnotation' => '#/366', +'inancientgreeknumbers' => '#/375', +'inancientsymbols' => '#/332', +'inarabic' => '#/149', +'inarabicexta' => '#/268', +'inarabicextendeda' => '#/268', +'inarabicmath' => '#/269', +'inarabicmathematicalalphabeticsymbols' => '#/269', +'inarabicpfa' => '#/241', +'inarabicpfb' => '#/242', +'inarabicpresentationformsa' => '#/241', +'inarabicpresentationformsb' => '#/242', +'inarabicsup' => '#/243', +'inarabicsupplement' => '#/243', +'inarmenian' => '#/213', +'inarrows' => '#/150', +'inascii' => '#/131', +'inavestan' => '#/175', +'inbalinese' => '#/214', +'inbamum' => '#/133', +'inbamumsup' => '#/215', +'inbamumsupplement' => '#/215', +'inbasiclatin' => '#/131', +'inbassavah' => '#/216', +'inbatak' => '#/134', +'inbengali' => '#/176', +'inbhaiksuki' => '#/244', +'inblockelements' => '#/325', +'inbopomofo' => '#/217', +'inbopomofoext' => '#/288', +'inbopomofoextended' => '#/288', +'inboxdrawing' => '#/270', +'inbrahmi' => '#/151', +'inbraille' => '#/177', +'inbraillepatterns' => '#/177', +'inbuginese' => '#/218', +'inbuhid' => '#/135', +'inbyzantinemusic' => '#/333', +'inbyzantinemusicalsymbols' => '#/333', +'incanadiansyllabics' => '#/130', +'incarian' => '#/152', +'incaucasianalbanian' => '#/367', +'inchakma' => '#/153', +'incham' => '#/121', +'incherokee' => '#/219', +'incherokeesup' => '#/289', +'incherokeesupplement' => '#/289', +'incjk' => '#/112', +'incjkcompat' => '#/245', +'incjkcompatforms' => '#/334', +'incjkcompatibility' => '#/245', +'incjkcompatibilityforms' => '#/334', +'incjkcompatibilityideographs' => '#/376', +'incjkcompatibilityideographssupplement' => '#/385', +'incjkcompatideographs' => '#/376', +'incjkcompatideographssup' => '#/385', +'incjkexta' => '#/178', +'incjkextb' => '#/179', +'incjkextc' => '#/180', +'incjkextd' => '#/181', +'incjkexte' => '#/182', +'incjkextf' => '#/183', +'incjkradicalssup' => '#/335', +'incjkradicalssupplement' => '#/335', +'incjkstrokes' => '#/271', +'incjksymbols' => '#/272', +'incjksymbolsandpunctuation' => '#/272', +'incjkunifiedideographs' => '#/112', +'incjkunifiedideographsextensiona' => '#/178', +'incjkunifiedideographsextensionb' => '#/179', +'incjkunifiedideographsextensionc' => '#/180', +'incjkunifiedideographsextensiond' => '#/181', +'incjkunifiedideographsextensione' => '#/182', +'incjkunifiedideographsextensionf' => '#/183', +'incombiningdiacriticalmarks' => '#/314', +'incombiningdiacriticalmarksextended' => '#/343', +'incombiningdiacriticalmarksforsymbols' => '#/386', +'incombiningdiacriticalmarkssupplement' => '#/344', +'incombininghalfmarks' => '#/248', +'incombiningmarksforsymbols' => '#/386', +'incommonindicnumberforms' => '#/359', +'incompatjamo' => '#/273', +'incontrolpictures' => '#/341', +'incoptic' => '#/154', +'incopticepactnumbers' => '#/370', +'incountingrod' => '#/290', +'incountingrodnumerals' => '#/290', +'incuneiform' => '#/246', +'incuneiformnumbers' => '#/354', +'incuneiformnumbersandpunctuation' => '#/354', +'incurrencysymbols' => '#/342', +'incypriotsyllabary' => '#/355', +'incyrillic' => '#/220', +'incyrillicexta' => '#/311', +'incyrillicextb' => '#/312', +'incyrillicextc' => '#/313', +'incyrillicextendeda' => '#/311', +'incyrillicextendedb' => '#/312', +'incyrillicextendedc' => '#/313', +'incyrillicsup' => '#/291', +'incyrillicsupplement' => '#/291', +'incyrillicsupplementary' => '#/291', +'indeseret' => '#/184', +'indevanagari' => '#/274', +'indevanagariext' => '#/326', +'indevanagariextended' => '#/326', +'indiacriticals' => '#/314', +'indiacriticalsext' => '#/343', +'indiacriticalsforsymbols' => '#/386', +'indiacriticalssup' => '#/344', +'indicnumberforms' => '#/359', +'indingbats' => '#/221', +'indomino' => '#/155', +'indominotiles' => '#/155', +'induployan' => '#/222', +'inearlydynasticcuneiform' => '#/387', +'inegyptianhieroglyphs' => '#/377', +'inelbasan' => '#/185', +'inemoticons' => '#/247', +'inenclosedalphanum' => '#/356', +'inenclosedalphanumerics' => '#/356', +'inenclosedalphanumericsupplement' => '#/378', +'inenclosedalphanumsup' => '#/378', +'inenclosedcjk' => '#/292', +'inenclosedcjklettersandmonths' => '#/292', +'inenclosedideographicsup' => '#/388', +'inenclosedideographicsupplement' => '#/388', +'inethiopic' => '#/223', +'inethiopicext' => '#/293', +'inethiopicexta' => '#/315', +'inethiopicextended' => '#/293', +'inethiopicextendeda' => '#/315', +'inethiopicsup' => '#/294', +'inethiopicsupplement' => '#/294', +'ingeneralpunctuation' => '#/304', +'ingeometricshapes' => '#/345', +'ingeometricshapesext' => '#/371', +'ingeometricshapesextended' => '#/371', +'ingeorgian' => '#/224', +'ingeorgiansup' => '#/295', +'ingeorgiansupplement' => '#/295', +'inglagolitic' => '#/275', +'inglagoliticsup' => '#/327', +'inglagoliticsupplement' => '#/327', +'ingothic' => '#/156', +'ingrantha' => '#/186', +'ingreek' => '#/136', +'ingreekandcoptic' => '#/136', +'ingreekext' => '#/225', +'ingreekextended' => '#/225', +'ingujarati' => '#/226', +'ingurmukhi' => '#/227', +'inhalfandfullforms' => '#/357', +'inhalfmarks' => '#/248', +'inhalfwidthandfullwidthforms' => '#/357', +'inhangul' => '#/157', +'inhangulcompatibilityjamo' => '#/273', +'inhanguljamo' => '#/122', +'inhanguljamoextendeda' => '#/229', +'inhanguljamoextendedb' => '#/230', +'inhangulsyllables' => '#/157', +'inhanunoo' => '#/187', +'inhatran' => '#/158', +'inhebrew' => '#/159', +'inherited' => 'Scx/Zinh', +'inhighprivateusesurrogates' => '#/358', +'inhighpusurrogates' => '#/358', +'inhighsurrogates' => '#/336', +'inhiragana' => '#/228', +'inidc' => '#/113', +'inideographicdescriptioncharacters' => '#/113', +'inideographicsymbols' => '#/372', +'inideographicsymbolsandpunctuation' => '#/372', +'inimperialaramaic' => '#/346', +'inindicnumberforms' => '#/359', +'ininscriptionalpahlavi' => '#/382', +'ininscriptionalparthian' => '#/383', +'inipaext' => '#/160', +'inipaextensions' => '#/160', +'initialpunctuation' => 'Gc/Pi', +'injamo' => '#/122', +'injamoexta' => '#/229', +'injamoextb' => '#/230', +'injavanese' => '#/231', +'inkaithi' => '#/161', +'inkanaexta' => '#/232', +'inkanaextendeda' => '#/232', +'inkanasup' => '#/188', +'inkanasupplement' => '#/188', +'inkanbun' => '#/162', +'inkangxi' => '#/163', +'inkangxiradicals' => '#/163', +'inkannada' => '#/189', +'inkatakana' => '#/233', +'inkatakanaext' => '#/296', +'inkatakanaphoneticextensions' => '#/296', +'inkayahli' => '#/190', +'inkharoshthi' => '#/276', +'inkhmer' => '#/137', +'inkhmersymbols' => '#/316', +'inkhojki' => '#/164', +'inkhudawadi' => '#/249', +'inlao' => '#/114', +'inlatin1' => '#/165', +'inlatin1sup' => '#/165', +'inlatin1supplement' => '#/165', +'inlatinexta' => '#/250', +'inlatinextadditional' => '#/373', +'inlatinextb' => '#/251', +'inlatinextc' => '#/252', +'inlatinextd' => '#/253', +'inlatinexte' => '#/254', +'inlatinextendeda' => '#/250', +'inlatinextendedadditional' => '#/373', +'inlatinextendedb' => '#/251', +'inlatinextendedc' => '#/252', +'inlatinextendedd' => '#/253', +'inlatinextendede' => '#/254', +'inlepcha' => '#/166', +'inletterlikesymbols' => '#/368', +'inlimbu' => '#/138', +'inlineara' => '#/191', +'inlinearbideograms' => '#/360', +'inlinearbsyllabary' => '#/361', +'inlisu' => '#/123', +'inlowsurrogates' => '#/328', +'inlycian' => '#/167', +'inlydian' => '#/168', +'inmahajani' => '#/234', +'inmahjong' => '#/192', +'inmahjongtiles' => '#/192', +'inmalayalam' => '#/255', +'inmandaic' => '#/193', +'inmanichaean' => '#/277', +'inmarchen' => '#/194', +'inmasaramgondi' => '#/317', +'inmathalphanum' => '#/318', +'inmathematicalalphanumericsymbols' => '#/318', +'inmathematicaloperators' => '#/329', +'inmathoperators' => '#/329', +'inmeeteimayek' => '#/297', +'inmeeteimayekext' => '#/337', +'inmeeteimayekextensions' => '#/337', +'inmendekikakui' => '#/319', +'inmeroiticcursive' => '#/347', +'inmeroitichieroglyphs' => '#/379', +'inmiao' => '#/124', +'inmiscarrows' => '#/278', +'inmiscellaneousmathematicalsymbolsa' => '#/362', +'inmiscellaneousmathematicalsymbolsb' => '#/363', +'inmiscellaneoussymbols' => '#/298', +'inmiscellaneoussymbolsandarrows' => '#/278', +'inmiscellaneoussymbolsandpictographs' => '#/348', +'inmiscellaneoustechnical' => '#/330', +'inmiscmathsymbolsa' => '#/362', +'inmiscmathsymbolsb' => '#/363', +'inmiscpictographs' => '#/348', +'inmiscsymbols' => '#/298', +'inmisctechnical' => '#/330', +'inmodi' => '#/125', +'inmodifierletters' => '#/349', +'inmodifiertoneletters' => '#/380', +'inmongolian' => '#/256', +'inmongoliansup' => '#/320', +'inmongoliansupplement' => '#/320', +'inmro' => '#/115', +'inmultani' => '#/195', +'inmusic' => '#/139', +'inmusicalsymbols' => '#/139', +'inmyanmar' => '#/196', +'inmyanmarexta' => '#/299', +'inmyanmarextb' => '#/300', +'inmyanmarextendeda' => '#/299', +'inmyanmarextendedb' => '#/300', +'innabataean' => '#/257', +'innb' => 'Blk/NB', +'innewa' => '#/126', +'innewtailue' => '#/258', +'innko' => '#/116', +'innoblock' => 'Blk/NB', +'innumberforms' => '#/301', +'innushu' => '#/140', +'inocr' => '#/117', +'inogham' => '#/141', +'inolchiki' => '#/197', +'inoldhungarian' => '#/321', +'inolditalic' => '#/259', +'inoldnortharabian' => '#/350', +'inoldpermic' => '#/260', +'inoldpersian' => '#/279', +'inoldsoutharabian' => '#/351', +'inoldturkic' => '#/261', +'inopticalcharacterrecognition' => '#/117', +'inoriya' => '#/142', +'inornamentaldingbats' => '#/374', +'inosage' => '#/143', +'inosmanya' => '#/198', +'inpahawhhmong' => '#/302', +'inpalmyrene' => '#/262', +'inpaucinhau' => '#/263', +'inpc=bottom' => 'InPC/Bottom', +'inpc=bottomandleft' => '#/73', +'inpc=bottomandright' => '#/74', +'inpc=left' => 'InPC/Left', +'inpc=leftandright' => 'InPC/LeftAndR', +'inpc=na' => 'InPC/NA', +'inpc=overstruck' => 'InPC/Overstru', +'inpc=right' => 'InPC/Right', +'inpc=top' => 'InPC/Top', +'inpc=topandbottom' => 'InPC/TopAndBo', +'inpc=topandbottomandright' => '#/75', +'inpc=topandleft' => 'InPC/TopAndLe', +'inpc=topandleftandright' => 'InPC/TopAndL2', +'inpc=topandright' => 'InPC/TopAndRi', +'inpc=visualorderleft' => 'InPC/VisualOr', +'inphagspa' => '#/199', +'inphaistos' => '#/235', +'inphaistosdisc' => '#/235', +'inphoenician' => '#/280', +'inphoneticext' => '#/303', +'inphoneticextensions' => '#/303', +'inphoneticextensionssupplement' => '#/338', +'inphoneticextsup' => '#/338', +'inplayingcards' => '#/322', +'inprivateuse' => '#/118', +'inprivateusearea' => '#/118', +'inpsalterpahlavi' => '#/339', +'inpua' => '#/118', +'inpunctuation' => '#/304', +'inrejang' => '#/169', +'inrumi' => '#/127', +'inruminumeralsymbols' => '#/127', +'inrunic' => '#/144', +'insamaritan' => '#/264', +'insaurashtra' => '#/281', +'insc=avagraha' => 'InSC/Avagraha', +'insc=bindu' => 'InSC/Bindu', +'insc=brahmijoiningnumber' => '#/85', +'insc=cantillationmark' => 'InSC/Cantilla', +'insc=consonant' => 'InSC/Consonan', +'insc=consonantdead' => '#/79', +'insc=consonantfinal' => 'InSC/Consona2', +'insc=consonantheadletter' => '#/86', +'insc=consonantkiller' => '#/81', +'insc=consonantmedial' => 'InSC/Consona3', +'insc=consonantplaceholder' => 'InSC/Consona5', +'insc=consonantprecedingrepha' => '#/88', +'insc=consonantprefixed' => '#/84', +'insc=consonantsubjoined' => 'InSC/Consona4', +'insc=consonantsucceedingrepha' => 'InSC/Consona6', +'insc=consonantwithstacker' => '#/87', +'insc=geminationmark' => '#/80', +'insc=invisiblestacker' => 'InSC/Invisibl', +'insc=joiner' => '#/68', +'insc=modifyingletter' => '#/82', +'insc=nonjoiner' => '#/76', +'insc=nukta' => 'InSC/Nukta', +'insc=number' => 'InSC/Number', +'insc=numberjoiner' => '#/78', +'insc=other' => 'InSC/Other', +'insc=purekiller' => 'InSC/PureKill', +'insc=registershifter' => '#/83', +'insc=syllablemodifier' => 'InSC/Syllable', +'insc=toneletter' => '#/77', +'insc=tonemark' => 'InSC/ToneMark', +'insc=virama' => 'InSC/Virama', +'insc=visarga' => 'InSC/Visarga', +'insc=vowel' => 'InSC/Vowel', +'insc=voweldependent' => 'InSC/VowelDep', +'insc=vowelindependent' => 'InSC/VowelInd', +'inscriptionalpahlavi' => '#/659', +'inscriptionalparthian' => '#/661', +'insharada' => '#/200', +'inshavian' => '#/201', +'inshorthandformatcontrols' => '#/389', +'insiddham' => '#/202', +'insinhala' => '#/203', +'insinhalaarchaicnumbers' => '#/384', +'insmallforms' => '#/282', +'insmallformvariants' => '#/282', +'insorasompeng' => '#/305', +'insoyombo' => '#/204', +'inspacingmodifierletters' => '#/349', +'inspecials' => '#/236', +'insundanese' => '#/265', +'insundanesesup' => '#/323', +'insundanesesupplement' => '#/323', +'insuparrowsa' => '#/283', +'insuparrowsb' => '#/284', +'insuparrowsc' => '#/285', +'insuperandsub' => '#/306', +'insuperscriptsandsubscripts' => '#/306', +'insupmathoperators' => '#/364', +'insupplementalarrowsa' => '#/283', +'insupplementalarrowsb' => '#/284', +'insupplementalarrowsc' => '#/285', +'insupplementalmathematicaloperators' => '#/364', +'insupplementalpunctuation' => '#/340', +'insupplementalsymbolsandpictographs' => '#/390', +'insupplementaryprivateuseareaa' => '#/205', +'insupplementaryprivateuseareab' => '#/206', +'insuppuaa' => '#/205', +'insuppuab' => '#/206', +'insuppunctuation' => '#/340', +'insupsymbolsandpictographs' => '#/390', +'insuttonsignwriting' => '#/369', +'insylotinagri' => '#/307', +'insyriac' => '#/170', +'insyriacsup' => '#/266', +'insyriacsupplement' => '#/266', +'intagalog' => '#/207', +'intagbanwa' => '#/237', +'intags' => '#/128', +'intaile' => '#/145', +'intaitham' => '#/208', +'intaiviet' => '#/209', +'intaixuanjing' => '#/308', +'intaixuanjingsymbols' => '#/308', +'intakri' => '#/146', +'intamil' => '#/147', +'intangut' => '#/171', +'intangutcomponents' => '#/365', +'intelugu' => '#/172', +'inthaana' => '#/173', +'inthai' => '#/129', +'intibetan' => '#/210', +'intifinagh' => '#/238', +'intirhuta' => '#/211', +'intransportandmap' => '#/352', +'intransportandmapsymbols' => '#/352', +'inucas' => '#/130', +'inucasext' => '#/212', +'inugaritic' => '#/239', +'inunifiedcanadianaboriginalsyllabics' => '#/130', +'inunifiedcanadianaboriginalsyllabicsextended' => '#/212', +'invai' => '#/119', +'invariationselectors' => '#/111', +'invariationselectorssupplement' => '#/148', +'invedicext' => '#/240', +'invedicextensions' => '#/240', +'inverticalforms' => '#/331', +'invs' => '#/111', +'invssup' => '#/148', +'inwarangciti' => '#/286', +'inyijing' => '#/174', +'inyijinghexagramsymbols' => '#/174', +'inyiradicals' => '#/287', +'inyisyllables' => '#/309', +'inzanabazarsquare' => '#/353', +'ipaext' => '#/160', +'ipaextensions' => '#/160', +'isadlam' => 'Scx/Adlm', +'isadlm' => 'Scx/Adlm', +'isaegeannumbers' => '#/324', +'isaghb' => '#/612', +'isahex' => '#/59', +'isahom' => '#/613', +'isalchemical' => '#/267', +'isalchemicalsymbols' => '#/267', +'isall' => '#/1', +'isalnum' => 'Perl/Alnum', +'isalpha' => 'Alpha/Y', +'isalphabetic' => 'Alpha/Y', +'isalphabeticpf' => '#/310', +'isalphabeticpresentationforms' => '#/310', +'isanatolianhieroglyphs' => '#/631', +'isancientgreekmusic' => '#/366', +'isancientgreekmusicalnotation' => '#/366', +'isancientgreeknumbers' => '#/375', +'isancientsymbols' => '#/332', +'isany' => '#/2', +'isarab' => 'Scx/Arab', +'isarabic' => 'Scx/Arab', +'isarabicexta' => '#/268', +'isarabicextendeda' => '#/268', +'isarabicmath' => '#/269', +'isarabicmathematicalalphabeticsymbols' => '#/269', +'isarabicpfa' => '#/241', +'isarabicpfb' => '#/242', +'isarabicpresentationformsa' => '#/241', +'isarabicpresentationformsb' => '#/242', +'isarabicsup' => '#/243', +'isarabicsupplement' => '#/243', +'isarmenian' => 'Scx/Armn', +'isarmi' => '#/614', +'isarmn' => 'Scx/Armn', +'isarrows' => '#/150', +'isascii' => '#/131', +'isasciihexdigit' => '#/59', +'isassigned' => 'Perl/Assigned', +'isavestan' => '#/615', +'isavst' => '#/615', +'isbali' => '#/616', +'isbalinese' => '#/616', +'isbamu' => '#/617', +'isbamum' => '#/617', +'isbamumsup' => '#/215', +'isbamumsupplement' => '#/215', +'isbasiclatin' => '#/131', +'isbass' => '#/618', +'isbassavah' => '#/618', +'isbatak' => '#/619', +'isbatk' => '#/619', +'isbeng' => 'Scx/Beng', +'isbengali' => 'Scx/Beng', +'isbhaiksuki' => 'Scx/Bhks', +'isbhks' => 'Scx/Bhks', +'isbidic' => 'BidiC/Y', +'isbidicontrol' => 'BidiC/Y', +'isbidim' => 'BidiM/Y', +'isbidimirrored' => 'BidiM/Y', +'isblank' => 'Perl/Blank', +'isblockelements' => '#/325', +'isbopo' => 'Scx/Bopo', +'isbopomofo' => 'Scx/Bopo', +'isbopomofoext' => '#/288', +'isbopomofoextended' => '#/288', +'isboxdrawing' => '#/270', +'isbrah' => '#/620', +'isbrahmi' => '#/620', +'isbrai' => '#/177', +'isbraille' => '#/177', +'isbraillepatterns' => '#/177', +'isbugi' => '#/621', +'isbuginese' => '#/621', +'isbuhd' => '#/622', +'isbuhid' => '#/622', +'isbyzantinemusic' => '#/333', +'isbyzantinemusicalsymbols' => '#/333', +'isc' => 'Gc/C', +'iscakm' => 'Scx/Cakm', +'iscanadianaboriginal' => '#/623', +'iscanadiansyllabics' => '#/130', +'iscans' => '#/623', +'iscari' => '#/624', +'iscarian' => '#/624', +'iscased' => 'Cased/Y', +'iscasedletter' => 'Gc/LC', +'iscaseignorable' => 'CI/Y', +'iscaucasianalbanian' => '#/612', +'iscc' => '#/394', +'isce' => 'CE/Y', +'iscf' => 'Gc/Cf', +'ischakma' => 'Scx/Cakm', +'ischam' => 'Scx/Cham', +'ischangeswhencasefolded' => 'CWCF/Y', +'ischangeswhencasemapped' => 'CWCM/Y', +'ischangeswhenlowercased' => 'CWL/Y', +'ischangeswhennfkccasefolded' => 'CWKCF/Y', +'ischangeswhentitlecased' => 'CWT/Y', +'ischangeswhenuppercased' => 'CWU/Y', +'ischer' => '#/625', +'ischerokee' => '#/625', +'ischerokeesup' => '#/289', +'ischerokeesupplement' => '#/289', +'isci' => 'CI/Y', +'iscjk' => '#/112', +'iscjkcompat' => '#/245', +'iscjkcompatforms' => '#/334', +'iscjkcompatibility' => '#/245', +'iscjkcompatibilityforms' => '#/334', +'iscjkcompatibilityideographs' => '#/376', +'iscjkcompatibilityideographssupplement' => '#/385', +'iscjkcompatideographs' => '#/376', +'iscjkcompatideographssup' => '#/385', +'iscjkexta' => '#/178', +'iscjkextb' => '#/179', +'iscjkextc' => '#/180', +'iscjkextd' => '#/181', +'iscjkexte' => '#/182', +'iscjkextf' => '#/183', +'iscjkradicalssup' => '#/335', +'iscjkradicalssupplement' => '#/335', +'iscjkstrokes' => '#/271', +'iscjksymbols' => '#/272', +'iscjksymbolsandpunctuation' => '#/272', +'iscjkunifiedideographs' => '#/112', +'iscjkunifiedideographsextensiona' => '#/178', +'iscjkunifiedideographsextensionb' => '#/179', +'iscjkunifiedideographsextensionc' => '#/180', +'iscjkunifiedideographsextensiond' => '#/181', +'iscjkunifiedideographsextensione' => '#/182', +'iscjkunifiedideographsextensionf' => '#/183', +'isclosepunctuation' => 'Gc/Pe', +'iscn' => 'Gc/Cn', +'iscntrl' => '#/394', +'isco' => '#/395', +'iscombiningdiacriticalmarks' => '#/314', +'iscombiningdiacriticalmarksextended' => '#/343', +'iscombiningdiacriticalmarksforsymbols' => '#/386', +'iscombiningdiacriticalmarkssupplement' => '#/344', +'iscombininghalfmarks' => '#/248', +'iscombiningmark' => 'Gc/M', +'iscombiningmarksforsymbols' => '#/386', +'iscommon' => 'Scx/Zyyy', +'iscommonindicnumberforms' => '#/359', +'iscompatjamo' => '#/273', +'iscompex' => 'CompEx/Y', +'iscompositionexclusion' => 'CE/Y', +'isconnectorpunctuation' => 'Gc/Pc', +'iscontrol' => '#/394', +'iscontrolpictures' => '#/341', +'iscopt' => 'Scx/Copt', +'iscoptic' => 'Scx/Copt', +'iscopticepactnumbers' => '#/370', +'iscountingrod' => '#/290', +'iscountingrodnumerals' => '#/290', +'iscprt' => 'Scx/Cprt', +'iscs' => '#/14', +'iscuneiform' => 'Scx/Xsux', +'iscuneiformnumbers' => '#/354', +'iscuneiformnumbersandpunctuation' => '#/354', +'iscurrencysymbol' => 'Gc/Sc', +'iscurrencysymbols' => '#/342', +'iscwcf' => 'CWCF/Y', +'iscwcm' => 'CWCM/Y', +'iscwkcf' => 'CWKCF/Y', +'iscwl' => 'CWL/Y', +'iscwt' => 'CWT/Y', +'iscwu' => 'CWU/Y', +'iscypriot' => 'Scx/Cprt', +'iscypriotsyllabary' => '#/355', +'iscyrillic' => 'Scx/Cyrl', +'iscyrillicexta' => '#/311', +'iscyrillicextb' => '#/312', +'iscyrillicextc' => '#/313', +'iscyrillicextendeda' => '#/311', +'iscyrillicextendedb' => '#/312', +'iscyrillicextendedc' => '#/313', +'iscyrillicsup' => '#/291', +'iscyrillicsupplement' => '#/291', +'iscyrillicsupplementary' => '#/291', +'iscyrl' => 'Scx/Cyrl', +'isdash' => 'Dash/Y', +'isdashpunctuation' => 'Gc/Pd', +'isdecimalnumber' => 'Gc/Nd', +'isdefaultignorablecodepoint' => 'DI/Y', +'isdep' => 'Dep/Y', +'isdeprecated' => 'Dep/Y', +'isdeseret' => '#/184', +'isdeva' => 'Scx/Deva', +'isdevanagari' => 'Scx/Deva', +'isdevanagariext' => '#/326', +'isdevanagariextended' => '#/326', +'isdi' => 'DI/Y', +'isdia' => 'Dia/Y', +'isdiacritic' => 'Dia/Y', +'isdiacriticals' => '#/314', +'isdiacriticalsext' => '#/343', +'isdiacriticalsforsymbols' => '#/386', +'isdiacriticalssup' => '#/344', +'isdigit' => 'Gc/Nd', +'isdingbats' => '#/221', +'isdomino' => '#/155', +'isdominotiles' => '#/155', +'isdsrt' => '#/184', +'isdupl' => 'Scx/Dupl', +'isduployan' => 'Scx/Dupl', +'isearlydynasticcuneiform' => '#/387', +'isegyp' => '#/626', +'isegyptianhieroglyphs' => '#/626', +'iselba' => '#/627', +'iselbasan' => '#/627', +'isemoticons' => '#/247', +'isenclosedalphanum' => '#/356', +'isenclosedalphanumerics' => '#/356', +'isenclosedalphanumericsupplement' => '#/378', +'isenclosedalphanumsup' => '#/378', +'isenclosedcjk' => '#/292', +'isenclosedcjklettersandmonths' => '#/292', +'isenclosedideographicsup' => '#/388', +'isenclosedideographicsupplement' => '#/388', +'isenclosingmark' => 'Gc/Me', +'isethi' => 'Scx/Ethi', +'isethiopic' => 'Scx/Ethi', +'isethiopicext' => '#/293', +'isethiopicexta' => '#/315', +'isethiopicextended' => '#/293', +'isethiopicextendeda' => '#/315', +'isethiopicsup' => '#/294', +'isethiopicsupplement' => '#/294', +'isext' => 'Ext/Y', +'isextender' => 'Ext/Y', +'isfinalpunctuation' => 'Gc/Pf', +'isformat' => 'Gc/Cf', +'isfullcompositionexclusion' => 'CompEx/Y', +'isgeneralpunctuation' => '#/304', +'isgeometricshapes' => '#/345', +'isgeometricshapesext' => '#/371', +'isgeometricshapesextended' => '#/371', +'isgeor' => 'Scx/Geor', +'isgeorgian' => 'Scx/Geor', +'isgeorgiansup' => '#/295', +'isgeorgiansupplement' => '#/295', +'isglag' => 'Scx/Glag', +'isglagolitic' => 'Scx/Glag', +'isglagoliticsup' => '#/327', +'isglagoliticsupplement' => '#/327', +'isgonm' => 'Scx/Gonm', +'isgoth' => '#/628', +'isgothic' => '#/628', +'isgran' => 'Scx/Gran', +'isgrantha' => 'Scx/Gran', +'isgraph' => 'Perl/Graph', +'isgraphemebase' => 'GrBase/Y', +'isgraphemeextend' => 'GCB/EX', +'isgrbase' => 'GrBase/Y', +'isgreek' => 'Scx/Grek', +'isgreekandcoptic' => '#/136', +'isgreekext' => '#/225', +'isgreekextended' => '#/225', +'isgrek' => 'Scx/Grek', +'isgrext' => 'GCB/EX', +'isgujarati' => 'Scx/Gujr', +'isgujr' => 'Scx/Gujr', +'isgurmukhi' => 'Scx/Guru', +'isguru' => 'Scx/Guru', +'ishalfandfullforms' => '#/357', +'ishalfmarks' => '#/248', +'ishalfwidthandfullwidthforms' => '#/357', +'ishan' => 'Scx/Han', +'ishang' => 'Scx/Hang', +'ishangul' => 'Scx/Hang', +'ishangulcompatibilityjamo' => '#/273', +'ishanguljamo' => '#/122', +'ishanguljamoextendeda' => '#/229', +'ishanguljamoextendedb' => '#/230', +'ishangulsyllables' => '#/157', +'ishani' => 'Scx/Han', +'ishano' => '#/629', +'ishanunoo' => '#/629', +'ishatr' => '#/630', +'ishatran' => '#/630', +'ishebr' => 'Scx/Hebr', +'ishebrew' => 'Scx/Hebr', +'ishex' => 'Hex/Y', +'ishexdigit' => 'Hex/Y', +'ishighprivateusesurrogates' => '#/358', +'ishighpusurrogates' => '#/358', +'ishighsurrogates' => '#/336', +'ishira' => 'Scx/Hira', +'ishiragana' => 'Scx/Hira', +'ishluw' => '#/631', +'ishmng' => 'Scx/Hmng', +'ishorizspace' => 'Perl/Blank', +'ishung' => '#/632', +'ishyphen' => 'Hyphen/T', +'isidc' => 'IDC/Y', +'isidcontinue' => 'IDC/Y', +'isideo' => 'Ideo/Y', +'isideographic' => 'Ideo/Y', +'isideographicdescriptioncharacters' => '#/113', +'isideographicsymbols' => '#/372', +'isideographicsymbolsandpunctuation' => '#/372', +'isids' => 'IDS/Y', +'isidsb' => '#/69', +'isidsbinaryoperator' => '#/69', +'isidst' => '#/71', +'isidstart' => 'IDS/Y', +'isidstrinaryoperator' => '#/71', +'isimperialaramaic' => '#/614', +'isindicnumberforms' => '#/359', +'isinherited' => 'Scx/Zinh', +'isinitialpunctuation' => 'Gc/Pi', +'isinscriptionalpahlavi' => '#/659', +'isinscriptionalparthian' => '#/661', +'isipaext' => '#/160', +'isipaextensions' => '#/160', +'isital' => '#/633', +'isjamo' => '#/122', +'isjamoexta' => '#/229', +'isjamoextb' => '#/230', +'isjava' => '#/634', +'isjavanese' => '#/634', +'isjoinc' => '#/89', +'isjoincontrol' => '#/89', +'iskaithi' => '#/636', +'iskali' => '#/190', +'iskana' => 'Scx/Kana', +'iskanaexta' => '#/232', +'iskanaextendeda' => '#/232', +'iskanasup' => '#/188', +'iskanasupplement' => '#/188', +'iskanbun' => '#/162', +'iskangxi' => '#/163', +'iskangxiradicals' => '#/163', +'iskannada' => 'Scx/Knda', +'iskatakana' => 'Scx/Kana', +'iskatakanaext' => '#/296', +'iskatakanaphoneticextensions' => '#/296', +'iskayahli' => '#/190', +'iskhar' => 'Scx/Khar', +'iskharoshthi' => 'Scx/Khar', +'iskhmer' => 'Scx/Khmr', +'iskhmersymbols' => '#/316', +'iskhmr' => 'Scx/Khmr', +'iskhoj' => '#/635', +'iskhojki' => '#/635', +'iskhudawadi' => 'Scx/Sind', +'isknda' => 'Scx/Knda', +'iskthi' => '#/636', +'isl' => 'Gc/L', +'isl&' => 'Gc/LC', +'isl_' => 'Gc/LC', +'islana' => 'Scx/Lana', +'islao' => 'Scx/Lao', +'islaoo' => 'Scx/Lao', +'islatin' => 'Scx/Latn', +'islatin1' => '#/165', +'islatin1sup' => '#/165', +'islatin1supplement' => '#/165', +'islatinexta' => '#/250', +'islatinextadditional' => '#/373', +'islatinextb' => '#/251', +'islatinextc' => '#/252', +'islatinextd' => '#/253', +'islatinexte' => '#/254', +'islatinextendeda' => '#/250', +'islatinextendedadditional' => '#/373', +'islatinextendedb' => '#/251', +'islatinextendedc' => '#/252', +'islatinextendedd' => '#/253', +'islatinextendede' => '#/254', +'islatn' => 'Scx/Latn', +'islc' => 'Gc/LC', +'islepc' => '#/637', +'islepcha' => '#/637', +'isletter' => 'Gc/L', +'isletterlikesymbols' => '#/368', +'isletternumber' => 'Gc/Nl', +'islimb' => 'Scx/Limb', +'islimbu' => 'Scx/Limb', +'islina' => 'Scx/Lina', +'islinb' => 'Scx/Linb', +'islineara' => 'Scx/Lina', +'islinearb' => 'Scx/Linb', +'islinearbideograms' => '#/360', +'islinearbsyllabary' => '#/361', +'islineseparator' => '#/396', +'islisu' => '#/123', +'isll' => 'Gc/Ll', +'islm' => 'Gc/Lm', +'islo' => 'Gc/Lo', +'isloe' => 'InPC/VisualOr', +'islogicalorderexception' => 'InPC/VisualOr', +'islower' => 'Lower/Y', +'islowercase' => 'Lower/Y', +'islowercaseletter' => 'Gc/Ll', +'islowsurrogates' => '#/328', +'islt' => 'Perl/Title', +'islu' => 'Gc/Lu', +'islyci' => '#/638', +'islycian' => '#/638', +'islydi' => '#/639', +'islydian' => '#/639', +'ism' => 'Gc/M', +'ismahajani' => '#/640', +'ismahj' => '#/640', +'ismahjong' => '#/192', +'ismahjongtiles' => '#/192', +'ismalayalam' => 'Scx/Mlym', +'ismand' => '#/641', +'ismandaic' => '#/641', +'ismani' => '#/642', +'ismanichaean' => '#/642', +'ismarc' => '#/643', +'ismarchen' => '#/643', +'ismark' => 'Gc/M', +'ismasaramgondi' => 'Scx/Gonm', +'ismath' => 'Math/Y', +'ismathalphanum' => '#/318', +'ismathematicalalphanumericsymbols' => '#/318', +'ismathematicaloperators' => '#/329', +'ismathoperators' => '#/329', +'ismathsymbol' => 'Gc/Sm', +'ismc' => 'Gc/Mc', +'isme' => 'Gc/Me', +'ismeeteimayek' => '#/648', +'ismeeteimayekext' => '#/337', +'ismeeteimayekextensions' => '#/337', +'ismend' => '#/644', +'ismendekikakui' => '#/644', +'ismerc' => '#/645', +'ismero' => '#/379', +'ismeroiticcursive' => '#/645', +'ismeroitichieroglyphs' => '#/379', +'ismiao' => '#/646', +'ismiscarrows' => '#/278', +'ismiscellaneousmathematicalsymbolsa' => '#/362', +'ismiscellaneousmathematicalsymbolsb' => '#/363', +'ismiscellaneoussymbols' => '#/298', +'ismiscellaneoussymbolsandarrows' => '#/278', +'ismiscellaneoussymbolsandpictographs' => '#/348', +'ismiscellaneoustechnical' => '#/330', +'ismiscmathsymbolsa' => '#/362', +'ismiscmathsymbolsb' => '#/363', +'ismiscpictographs' => '#/348', +'ismiscsymbols' => '#/298', +'ismisctechnical' => '#/330', +'ismlym' => 'Scx/Mlym', +'ismn' => 'Gc/Mn', +'ismodi' => '#/647', +'ismodifierletter' => 'Gc/Lm', +'ismodifierletters' => '#/349', +'ismodifiersymbol' => 'Gc/Sk', +'ismodifiertoneletters' => '#/380', +'ismong' => 'Scx/Mong', +'ismongolian' => 'Scx/Mong', +'ismongoliansup' => '#/320', +'ismongoliansupplement' => '#/320', +'ismro' => '#/609', +'ismroo' => '#/609', +'ismtei' => '#/648', +'ismult' => 'Scx/Mult', +'ismultani' => 'Scx/Mult', +'ismusic' => '#/139', +'ismusicalsymbols' => '#/139', +'ismyanmar' => 'Scx/Mymr', +'ismyanmarexta' => '#/299', +'ismyanmarextb' => '#/300', +'ismyanmarextendeda' => '#/299', +'ismyanmarextendedb' => '#/300', +'ismymr' => 'Scx/Mymr', +'isn' => 'Gc/N', +'isnabataean' => '#/649', +'isnarb' => '#/350', +'isnb' => 'Blk/NB', +'isnbat' => '#/649', +'isnchar' => 'Perl/_PerlNch', +'isnd' => 'Gc/Nd', +'isnewa' => '#/650', +'isnewtailue' => 'Scx/Talu', +'isnko' => '#/610', +'isnkoo' => '#/610', +'isnl' => 'Gc/Nl', +'isno' => 'Gc/No', +'isnoblock' => 'Blk/NB', +'isnoncharactercodepoint' => 'Perl/_PerlNch', +'isnonspacingmark' => 'Gc/Mn', +'isnshu' => '#/651', +'isnumber' => 'Gc/N', +'isnumberforms' => '#/301', +'isnushu' => '#/651', +'isocr' => '#/117', +'isogam' => '#/652', +'isogham' => '#/652', +'isolchiki' => '#/197', +'isolck' => '#/197', +'isoldhungarian' => '#/632', +'isolditalic' => '#/633', +'isoldnortharabian' => '#/350', +'isoldpermic' => '#/657', +'isoldpersian' => '#/680', +'isoldsoutharabian' => '#/351', +'isoldturkic' => '#/653', +'isopenpunctuation' => 'Gc/Ps', +'isopticalcharacterrecognition' => '#/117', +'isoriya' => 'Scx/Orya', +'isorkh' => '#/653', +'isornamentaldingbats' => '#/374', +'isorya' => 'Scx/Orya', +'isosage' => '#/654', +'isosge' => '#/654', +'isosma' => '#/655', +'isosmanya' => '#/655', +'isother' => 'Gc/C', +'isotherletter' => 'Gc/Lo', +'isothernumber' => 'Gc/No', +'isotherpunctuation' => 'Gc/Po', +'isothersymbol' => 'Gc/So', +'isp' => 'Gc/P', +'ispahawhhmong' => 'Scx/Hmng', +'ispalm' => '#/262', +'ispalmyrene' => '#/262', +'isparagraphseparator' => '#/397', +'ispatsyn' => 'PatSyn/Y', +'ispatternsyntax' => 'PatSyn/Y', +'ispatternwhitespace' => 'Perl/_PerlPat', +'ispatws' => 'Perl/_PerlPat', +'ispauc' => '#/656', +'ispaucinhau' => '#/656', +'ispc' => 'Gc/Pc', +'ispcm' => 'PCM/Y', +'ispd' => 'Gc/Pd', +'ispe' => 'Gc/Pe', +'isperlspace' => '#/3', +'isperlword' => 'Perl/PerlWord', +'isperm' => '#/657', +'ispf' => 'Gc/Pf', +'isphag' => '#/658', +'isphagspa' => '#/658', +'isphaistos' => '#/235', +'isphaistosdisc' => '#/235', +'isphli' => '#/659', +'isphlp' => 'Scx/Phlp', +'isphnx' => '#/660', +'isphoenician' => '#/660', +'isphoneticext' => '#/303', +'isphoneticextensions' => '#/303', +'isphoneticextensionssupplement' => '#/338', +'isphoneticextsup' => '#/338', +'ispi' => 'Gc/Pi', +'isplayingcards' => '#/322', +'isplrd' => '#/646', +'ispo' => 'Gc/Po', +'isposixalnum' => '#/5', +'isposixalpha' => '#/6', +'isposixblank' => '#/7', +'isposixcntrl' => '#/8', +'isposixdigit' => '#/9', +'isposixgraph' => '#/10', +'isposixlower' => '#/11', +'isposixprint' => '#/12', +'isposixpunct' => 'Perl/PosixPun', +'isposixspace' => '#/3', +'isposixupper' => '#/13', +'isposixword' => 'Perl/PerlWord', +'isposixxdigit' => '#/59', +'isprependedconcatenationmark' => 'PCM/Y', +'isprint' => 'Perl/Print', +'isprivateuse' => '#/395', +'isprivateusearea' => '#/118', +'isprti' => '#/661', +'isps' => 'Gc/Ps', +'ispsalterpahlavi' => 'Scx/Phlp', +'ispua' => '#/118', +'ispunct' => 'Gc/P', +'ispunctuation' => 'Gc/P', +'isqaac' => 'Scx/Copt', +'isqaai' => 'Scx/Zinh', +'isqmark' => 'QMark/Y', +'isquotationmark' => 'QMark/Y', +'isradical' => '#/92', +'isregionalindicator' => '#/66', +'isrejang' => '#/662', +'isri' => '#/66', +'isrjng' => '#/662', +'isrumi' => '#/127', +'isruminumeralsymbols' => '#/127', +'isrunic' => '#/663', +'isrunr' => '#/663', +'iss' => 'Gc/S', +'issamaritan' => '#/664', +'issamr' => '#/664', +'issarb' => '#/351', +'issaur' => '#/665', +'issaurashtra' => '#/665', +'issc' => 'Gc/Sc', +'issd' => 'SD/Y', +'issentenceterminal' => 'STerm/Y', +'isseparator' => 'Gc/Z', +'issgnw' => '#/666', +'issharada' => 'Scx/Shrd', +'isshavian' => '#/201', +'isshaw' => '#/201', +'isshorthandformatcontrols' => '#/389', +'isshrd' => 'Scx/Shrd', +'issidd' => '#/667', +'issiddham' => '#/667', +'issignwriting' => '#/666', +'issind' => 'Scx/Sind', +'issinh' => 'Scx/Sinh', +'issinhala' => 'Scx/Sinh', +'issinhalaarchaicnumbers' => '#/384', +'issk' => 'Gc/Sk', +'issm' => 'Gc/Sm', +'issmallforms' => '#/282', +'issmallformvariants' => '#/282', +'isso' => 'Gc/So', +'issoftdotted' => 'SD/Y', +'issora' => '#/668', +'issorasompeng' => '#/668', +'issoyo' => '#/669', +'issoyombo' => '#/669', +'isspace' => 'Perl/SpacePer', +'isspaceperl' => 'Perl/SpacePer', +'isspaceseparator' => 'Gc/Zs', +'isspacingmark' => 'Gc/Mc', +'isspacingmodifierletters' => '#/349', +'isspecials' => '#/236', +'issterm' => 'STerm/Y', +'issund' => '#/670', +'issundanese' => '#/670', +'issundanesesup' => '#/323', +'issundanesesupplement' => '#/323', +'issuparrowsa' => '#/283', +'issuparrowsb' => '#/284', +'issuparrowsc' => '#/285', +'issuperandsub' => '#/306', +'issuperscriptsandsubscripts' => '#/306', +'issupmathoperators' => '#/364', +'issupplementalarrowsa' => '#/283', +'issupplementalarrowsb' => '#/284', +'issupplementalarrowsc' => '#/285', +'issupplementalmathematicaloperators' => '#/364', +'issupplementalpunctuation' => '#/340', +'issupplementalsymbolsandpictographs' => '#/390', +'issupplementaryprivateuseareaa' => '#/205', +'issupplementaryprivateuseareab' => '#/206', +'issuppuaa' => '#/205', +'issuppuab' => '#/206', +'issuppunctuation' => '#/340', +'issupsymbolsandpictographs' => '#/390', +'issurrogate' => '#/14', +'issuttonsignwriting' => '#/369', +'issylo' => '#/671', +'issylotinagri' => '#/671', +'issymbol' => 'Gc/S', +'issyrc' => 'Scx/Syrc', +'issyriac' => 'Scx/Syrc', +'issyriacsup' => '#/266', +'issyriacsupplement' => '#/266', +'istagalog' => '#/676', +'istagb' => 'Scx/Tagb', +'istagbanwa' => 'Scx/Tagb', +'istags' => '#/128', +'istaile' => '#/672', +'istaitham' => 'Scx/Lana', +'istaiviet' => '#/674', +'istaixuanjing' => '#/308', +'istaixuanjingsymbols' => '#/308', +'istakr' => 'Scx/Takr', +'istakri' => 'Scx/Takr', +'istale' => '#/672', +'istalu' => 'Scx/Talu', +'istamil' => 'Scx/Taml', +'istaml' => 'Scx/Taml', +'istang' => '#/673', +'istangut' => '#/673', +'istangutcomponents' => '#/365', +'istavt' => '#/674', +'istelu' => 'Scx/Telu', +'istelugu' => 'Scx/Telu', +'isterm' => 'Term/Y', +'isterminalpunctuation' => 'Term/Y', +'istfng' => '#/675', +'istglg' => '#/676', +'isthaa' => 'Scx/Thaa', +'isthaana' => 'Scx/Thaa', +'isthai' => '#/677', +'istibetan' => 'Scx/Tibt', +'istibt' => 'Scx/Tibt', +'istifinagh' => '#/675', +'istirh' => 'Scx/Tirh', +'istirhuta' => 'Scx/Tirh', +'istitle' => 'Perl/Title', +'istitlecase' => 'Perl/Title', +'istitlecaseletter' => 'Perl/Title', +'istransportandmap' => '#/352', +'istransportandmapsymbols' => '#/352', +'isucas' => '#/130', +'isucasext' => '#/212', +'isugar' => '#/678', +'isugaritic' => '#/678', +'isuideo' => 'UIdeo/Y', +'isunassigned' => 'Gc/Cn', +'isunicode' => '#/2', +'isunifiedcanadianaboriginalsyllabics' => '#/130', +'isunifiedcanadianaboriginalsyllabicsextended' => '#/212', +'isunifiedideograph' => 'UIdeo/Y', +'isunknown' => 'Scx/Zzzz', +'isupper' => 'Upper/Y', +'isuppercase' => 'Upper/Y', +'isuppercaseletter' => 'Gc/Lu', +'isvai' => '#/611', +'isvaii' => '#/611', +'isvariationselector' => '#/94', +'isvariationselectors' => '#/111', +'isvariationselectorssupplement' => '#/148', +'isvedicext' => '#/240', +'isvedicextensions' => '#/240', +'isverticalforms' => '#/331', +'isvertspace' => '#/4', +'isvs' => '#/94', +'isvssup' => '#/148', +'iswara' => '#/679', +'iswarangciti' => '#/679', +'iswhitespace' => 'Perl/SpacePer', +'isword' => 'Perl/Word', +'iswspace' => 'Perl/SpacePer', +'isxdigit' => 'Hex/Y', +'isxidc' => 'XIDC/Y', +'isxidcontinue' => 'XIDC/Y', +'isxids' => 'XIDS/Y', +'isxidstart' => 'XIDS/Y', +'isxpeo' => '#/680', +'isxperlspace' => 'Perl/SpacePer', +'isxposixalnum' => 'Perl/Alnum', +'isxposixalpha' => 'Alpha/Y', +'isxposixblank' => 'Perl/Blank', +'isxposixcntrl' => '#/394', +'isxposixdigit' => 'Gc/Nd', +'isxposixgraph' => 'Perl/Graph', +'isxposixlower' => 'Lower/Y', +'isxposixprint' => 'Perl/Print', +'isxposixpunct' => 'Perl/XPosixPu', +'isxposixspace' => 'Perl/SpacePer', +'isxposixupper' => 'Upper/Y', +'isxposixword' => 'Perl/Word', +'isxposixxdigit' => 'Hex/Y', +'isxsux' => 'Scx/Xsux', +'isyi' => 'Scx/Yi', +'isyiii' => 'Scx/Yi', +'isyijing' => '#/174', +'isyijinghexagramsymbols' => '#/174', +'isyiradicals' => '#/287', +'isyisyllables' => '#/309', +'isz' => 'Gc/Z', +'iszanabazarsquare' => '#/681', +'iszanb' => '#/681', +'iszinh' => 'Scx/Zinh', +'iszl' => '#/396', +'iszp' => '#/397', +'iszs' => 'Gc/Zs', +'iszyyy' => 'Scx/Zyyy', +'iszzzz' => 'Scx/Zzzz', +'ital' => '#/633', +'jamo' => '#/122', +'jamoexta' => '#/229', +'jamoextb' => '#/230', +'java' => '#/634', +'javanese' => '#/634', +'jg=africanfeh' => '#/430', +'jg=africannoon' => '#/436', +'jg=africanqaf' => '#/431', +'jg=ain' => 'Jg/Ain', +'jg=alaph' => '#/418', +'jg=alef' => 'Jg/Alef', +'jg=beh' => 'Jg/Beh', +'jg=beth' => '#/408', +'jg=burushaskiyehbarree' => '#/480', +'jg=dal' => 'Jg/Dal', +'jg=dalathrish' => '#/432', +'jg=e' => '#/398', +'jg=farsiyeh' => 'Jg/FarsiYeh', +'jg=fe' => '#/399', +'jg=feh' => 'Jg/Feh', +'jg=finalsemkath' => '#/442', +'jg=gaf' => 'Jg/Gaf', +'jg=gamal' => '#/419', +'jg=hah' => 'Jg/Hah', +'jg=hamzaonhehgoal' => '#/459', +'jg=he' => '#/400', +'jg=heh' => '#/402', +'jg=hehgoal' => '#/425', +'jg=heth' => '#/409', +'jg=kaf' => 'Jg/Kaf', +'jg=kaph' => '#/410', +'jg=khaph' => '#/420', +'jg=knottedheh' => '#/433', +'jg=lam' => 'Jg/Lam', +'jg=lamadh' => '#/423', +'jg=malayalambha' => '#/443', +'jg=malayalamja' => '#/437', +'jg=malayalamlla' => '#/444', +'jg=malayalamllla' => '#/451', +'jg=malayalamnga' => '#/445', +'jg=malayalamnna' => '#/446', +'jg=malayalamnnna' => '#/452', +'jg=malayalamnya' => '#/447', +'jg=malayalamra' => '#/438', +'jg=malayalamssa' => '#/448', +'jg=malayalamtta' => '#/449', +'jg=manichaeanaleph' => '#/469', +'jg=manichaeanayin' => '#/460', +'jg=manichaeanbeth' => '#/461', +'jg=manichaeandaleth' => '#/473', +'jg=manichaeandhamedh' => '#/477', +'jg=manichaeanfive' => '#/462', +'jg=manichaeangimel' => '#/470', +'jg=manichaeanheth' => '#/463', +'jg=manichaeanhundred' => '#/478', +'jg=manichaeankaph' => '#/464', +'jg=manichaeanlamedh' => '#/474', +'jg=manichaeanmem' => '#/453', +'jg=manichaeannun' => '#/454', +'jg=manichaeanone' => '#/455', +'jg=manichaeanpe' => '#/450', +'jg=manichaeanqoph' => '#/465', +'jg=manichaeanresh' => '#/466', +'jg=manichaeansadhe' => '#/471', +'jg=manichaeansamekh' => '#/475', +'jg=manichaeantaw' => '#/456', +'jg=manichaeanten' => '#/457', +'jg=manichaeanteth' => '#/467', +'jg=manichaeanthamedh' => '#/479', +'jg=manichaeantwenty' => '#/476', +'jg=manichaeanwaw' => '#/458', +'jg=manichaeanyodh' => '#/468', +'jg=manichaeanzayin' => '#/472', +'jg=meem' => '#/411', +'jg=mim' => '#/403', +'jg=nojoininggroup' => 'Jg/NoJoinin', +'jg=noon' => '#/412', +'jg=nun' => '#/404', +'jg=nya' => '#/405', +'jg=pe' => '#/401', +'jg=qaf' => 'Jg/Qaf', +'jg=qaph' => '#/413', +'jg=reh' => 'Jg/Reh', +'jg=reversedpe' => '#/434', +'jg=rohingyayeh' => '#/439', +'jg=sad' => 'Jg/Sad', +'jg=sadhe' => '#/421', +'jg=seen' => 'Jg/Seen', +'jg=semkath' => '#/426', +'jg=shin' => '#/414', +'jg=straightwaw' => '#/440', +'jg=swashkaf' => '#/427', +'jg=syriacwaw' => '#/428', +'jg=tah' => '#/406', +'jg=taw' => '#/407', +'jg=tehmarbuta' => '#/435', +'jg=tehmarbutagoal' => '#/459', +'jg=teth' => '#/415', +'jg=waw' => 'Jg/Waw', +'jg=yeh' => 'Jg/Yeh', +'jg=yehbarree' => '#/429', +'jg=yehwithtail' => '#/441', +'jg=yudh' => '#/416', +'jg=yudhhe' => '#/424', +'jg=zain' => '#/417', +'jg=zhain' => '#/422', +'joinc' => '#/89', +'joinc=f' => '#/!89', +'joinc=false' => '#/!89', +'joinc=n' => '#/!89', +'joinc=no' => '#/!89', +'joinc=t' => '#/89', +'joinc=true' => '#/89', +'joinc=y' => '#/89', +'joinc=yes' => '#/89', +'joincontrol' => '#/89', +'jt=c' => 'Jt/C', +'jt=d' => 'Jt/D', +'jt=dualjoining' => 'Jt/D', +'jt=joincausing' => 'Jt/C', +'jt=l' => '#/481', +'jt=leftjoining' => '#/481', +'jt=nonjoining' => 'Jt/U', +'jt=r' => 'Jt/R', +'jt=rightjoining' => 'Jt/R', +'jt=t' => 'Jt/T', +'jt=transparent' => 'Jt/T', +'jt=u' => 'Jt/U', +'kaithi' => '#/636', +'kali' => '#/190', +'kana' => 'Scx/Kana', +'kanaexta' => '#/232', +'kanaextendeda' => '#/232', +'kanasup' => '#/188', +'kanasupplement' => '#/188', +'kanbun' => '#/162', +'kangxi' => '#/163', +'kangxiradicals' => '#/163', +'kannada' => 'Scx/Knda', +'katakana' => 'Scx/Kana', +'katakanaext' => '#/296', +'katakanaphoneticextensions' => '#/296', +'kayahli' => '#/190', +'khar' => 'Scx/Khar', +'kharoshthi' => 'Scx/Khar', +'khmer' => 'Scx/Khmr', +'khmersymbols' => '#/316', +'khmr' => 'Scx/Khmr', +'khoj' => '#/635', +'khojki' => '#/635', +'khudawadi' => 'Scx/Sind', +'knda' => 'Scx/Knda', +'kthi' => '#/636', +'l' => 'Gc/L', +'l&' => 'Gc/LC', +'l_' => 'Gc/LC', +'lana' => 'Scx/Lana', +'lao' => 'Scx/Lao', +'laoo' => 'Scx/Lao', +'latin' => 'Scx/Latn', +'latin1' => '#/165', +'latin1sup' => '#/165', +'latin1supplement' => '#/165', +'latinexta' => '#/250', +'latinextadditional' => '#/373', +'latinextb' => '#/251', +'latinextc' => '#/252', +'latinextd' => '#/253', +'latinexte' => '#/254', +'latinextendeda' => '#/250', +'latinextendedadditional' => '#/373', +'latinextendedb' => '#/251', +'latinextendedc' => '#/252', +'latinextendedd' => '#/253', +'latinextendede' => '#/254', +'latn' => 'Scx/Latn', +'lb=ai' => 'Lb/AI', +'lb=al' => 'Lb/AL', +'lb=alphabetic' => 'Lb/AL', +'lb=ambiguous' => 'Lb/AI', +'lb=b2' => '#/482', +'lb=ba' => 'Lb/BA', +'lb=bb' => 'Lb/BB', +'lb=bk' => '#/483', +'lb=breakafter' => 'Lb/BA', +'lb=breakbefore' => 'Lb/BB', +'lb=breakboth' => '#/482', +'lb=breaksymbols' => '#/490', +'lb=carriagereturn' => '#/63', +'lb=cb' => '#/484', +'lb=cj' => 'Lb/CJ', +'lb=cl' => 'Lb/CL', +'lb=closeparenthesis' => '#/485', +'lb=closepunctuation' => 'Lb/CL', +'lb=cm' => 'Lb/CM', +'lb=combiningmark' => 'Lb/CM', +'lb=complexcontext' => 'Lb/SA', +'lb=conditionaljapanesestarter' => 'Lb/CJ', +'lb=contingentbreak' => '#/484', +'lb=cp' => '#/485', +'lb=cr' => '#/63', +'lb=eb' => 'Lb/EB', +'lb=ebase' => 'Lb/EB', +'lb=em' => '#/64', +'lb=emodifier' => '#/64', +'lb=ex' => 'Lb/EX', +'lb=exclamation' => 'Lb/EX', +'lb=gl' => 'Lb/GL', +'lb=glue' => 'Lb/GL', +'lb=h2' => 'GCB/LV', +'lb=h3' => 'GCB/LVT', +'lb=hebrewletter' => 'WB/HL', +'lb=hl' => 'WB/HL', +'lb=hy' => '#/486', +'lb=hyphen' => '#/486', +'lb=id' => 'Lb/ID', +'lb=ideographic' => 'Lb/ID', +'lb=in' => 'Lb/IN', +'lb=infixnumeric' => 'Lb/IS', +'lb=inseparable' => 'Lb/IN', +'lb=inseperable' => 'Lb/IN', +'lb=is' => 'Lb/IS', +'lb=jl' => '#/60', +'lb=jt' => '#/61', +'lb=jv' => '#/62', +'lb=lf' => '#/65', +'lb=linefeed' => '#/65', +'lb=mandatorybreak' => '#/483', +'lb=nextline' => '#/487', +'lb=nl' => '#/487', +'lb=nonstarter' => 'Lb/NS', +'lb=ns' => 'Lb/NS', +'lb=nu' => 'SB/NU', +'lb=numeric' => 'SB/NU', +'lb=op' => 'Lb/OP', +'lb=openpunctuation' => 'Lb/OP', +'lb=po' => 'Lb/PO', +'lb=postfixnumeric' => 'Lb/PO', +'lb=pr' => 'Lb/PR', +'lb=prefixnumeric' => 'Lb/PR', +'lb=qu' => 'Lb/QU', +'lb=quotation' => 'Lb/QU', +'lb=regionalindicator' => '#/66', +'lb=ri' => '#/66', +'lb=sa' => 'Lb/SA', +'lb=sg' => '#/488', +'lb=sp' => '#/489', +'lb=space' => '#/489', +'lb=surrogate' => '#/488', +'lb=sy' => '#/490', +'lb=unknown' => 'Lb/XX', +'lb=wj' => '#/491', +'lb=wordjoiner' => '#/491', +'lb=xx' => 'Lb/XX', +'lb=zw' => '#/492', +'lb=zwj' => '#/68', +'lb=zwspace' => '#/492', +'lc' => 'Gc/LC', +'lepc' => '#/637', +'lepcha' => '#/637', +'letter' => 'Gc/L', +'letterlikesymbols' => '#/368', +'letternumber' => 'Gc/Nl', +'limb' => 'Scx/Limb', +'limbu' => 'Scx/Limb', +'lina' => 'Scx/Lina', +'linb' => 'Scx/Linb', +'lineara' => 'Scx/Lina', +'linearb' => 'Scx/Linb', +'linearbideograms' => '#/360', +'linearbsyllabary' => '#/361', +'lineseparator' => '#/396', +'lisu' => '#/123', +'ll' => 'Gc/Ll', +'lm' => 'Gc/Lm', +'lo' => 'Gc/Lo', +'loe' => 'InPC/VisualOr', +'loe=f' => '!InPC/VisualOr', +'loe=false' => '!InPC/VisualOr', +'loe=n' => '!InPC/VisualOr', +'loe=no' => '!InPC/VisualOr', +'loe=t' => 'InPC/VisualOr', +'loe=true' => 'InPC/VisualOr', +'loe=y' => 'InPC/VisualOr', +'loe=yes' => 'InPC/VisualOr', +'logicalorderexception' => 'InPC/VisualOr', +'lower' => 'Lower/Y', +'lower=f' => '!Lower/Y', +'lower=false' => '!Lower/Y', +'lower=n' => '!Lower/Y', +'lower=no' => '!Lower/Y', +'lower=t' => 'Lower/Y', +'lower=true' => 'Lower/Y', +'lower=y' => 'Lower/Y', +'lower=yes' => 'Lower/Y', +'lowercase' => 'Lower/Y', +'lowercaseletter' => 'Gc/Ll', +'lowsurrogates' => '#/328', +'lt' => 'Perl/Title', +'lu' => 'Gc/Lu', +'lyci' => '#/638', +'lycian' => '#/638', +'lydi' => '#/639', +'lydian' => '#/639', +'m' => 'Gc/M', +'mahajani' => '#/640', +'mahj' => '#/640', +'mahjong' => '#/192', +'mahjongtiles' => '#/192', +'malayalam' => 'Scx/Mlym', +'mand' => '#/641', +'mandaic' => '#/641', +'mani' => '#/642', +'manichaean' => '#/642', +'marc' => '#/643', +'marchen' => '#/643', +'mark' => 'Gc/M', +'masaramgondi' => 'Scx/Gonm', +'math' => 'Math/Y', +'math=f' => '!Math/Y', +'math=false' => '!Math/Y', +'math=n' => '!Math/Y', +'math=no' => '!Math/Y', +'math=t' => 'Math/Y', +'math=true' => 'Math/Y', +'math=y' => 'Math/Y', +'math=yes' => 'Math/Y', +'mathalphanum' => '#/318', +'mathematicalalphanumericsymbols' => '#/318', +'mathematicaloperators' => '#/329', +'mathoperators' => '#/329', +'mathsymbol' => 'Gc/Sm', +'mc' => 'Gc/Mc', +'me' => 'Gc/Me', +'meeteimayek' => '#/648', +'meeteimayekext' => '#/337', +'meeteimayekextensions' => '#/337', +'mend' => '#/644', +'mendekikakui' => '#/644', +'merc' => '#/645', +'mero' => '#/379', +'meroiticcursive' => '#/645', +'meroitichieroglyphs' => '#/379', +'miao' => '#/646', +'miscarrows' => '#/278', +'miscellaneousmathematicalsymbolsa' => '#/362', +'miscellaneousmathematicalsymbolsb' => '#/363', +'miscellaneoussymbols' => '#/298', +'miscellaneoussymbolsandarrows' => '#/278', +'miscellaneoussymbolsandpictographs' => '#/348', +'miscellaneoustechnical' => '#/330', +'miscmathsymbolsa' => '#/362', +'miscmathsymbolsb' => '#/363', +'miscpictographs' => '#/348', +'miscsymbols' => '#/298', +'misctechnical' => '#/330', +'mlym' => 'Scx/Mlym', +'mn' => 'Gc/Mn', +'modi' => '#/647', +'modifierletter' => 'Gc/Lm', +'modifierletters' => '#/349', +'modifiersymbol' => 'Gc/Sk', +'modifiertoneletters' => '#/380', +'mong' => 'Scx/Mong', +'mongolian' => 'Scx/Mong', +'mongoliansup' => '#/320', +'mongoliansupplement' => '#/320', +'mro' => '#/609', +'mroo' => '#/609', +'mtei' => '#/648', +'mult' => 'Scx/Mult', +'multani' => 'Scx/Mult', +'music' => '#/139', +'musicalsymbols' => '#/139', +'myanmar' => 'Scx/Mymr', +'myanmarexta' => '#/299', +'myanmarextb' => '#/300', +'myanmarextendeda' => '#/299', +'myanmarextendedb' => '#/300', +'mymr' => 'Scx/Mymr', +'n' => 'Gc/N', +'nabataean' => '#/649', +'narb' => '#/350', +'nb' => 'Blk/NB', +'nbat' => '#/649', +'nchar' => 'Perl/_PerlNch', +'nchar=f' => '!Perl/_PerlNch', +'nchar=false' => '!Perl/_PerlNch', +'nchar=n' => '!Perl/_PerlNch', +'nchar=no' => '!Perl/_PerlNch', +'nchar=t' => 'Perl/_PerlNch', +'nchar=true' => 'Perl/_PerlNch', +'nchar=y' => 'Perl/_PerlNch', +'nchar=yes' => 'Perl/_PerlNch', +'nd' => 'Gc/Nd', +'newa' => '#/650', +'newtailue' => 'Scx/Talu', +'nfcqc=m' => 'NFCQC/M', +'nfcqc=maybe' => 'NFCQC/M', +'nfcqc=n' => 'CompEx/Y', +'nfcqc=no' => 'CompEx/Y', +'nfcqc=y' => 'NFCQC/Y', +'nfcqc=yes' => 'NFCQC/Y', +'nfdqc=n' => 'NFDQC/N', +'nfdqc=no' => 'NFDQC/N', +'nfdqc=y' => 'NFDQC/Y', +'nfdqc=yes' => 'NFDQC/Y', +'nfkcqc=m' => 'NFCQC/M', +'nfkcqc=maybe' => 'NFCQC/M', +'nfkcqc=n' => 'NFKCQC/N', +'nfkcqc=no' => 'NFKCQC/N', +'nfkcqc=y' => 'NFKCQC/Y', +'nfkcqc=yes' => 'NFKCQC/Y', +'nfkdqc=n' => 'NFKDQC/N', +'nfkdqc=no' => 'NFKDQC/N', +'nfkdqc=y' => 'NFKDQC/Y', +'nfkdqc=yes' => 'NFKDQC/Y', +'nko' => '#/610', +'nkoo' => '#/610', +'nl' => 'Gc/Nl', +'no' => 'Gc/No', +'noblock' => 'Blk/NB', +'noncharactercodepoint' => 'Perl/_PerlNch', +'nonspacingmark' => 'Gc/Mn', +'nshu' => '#/651', +'nt=de' => 'Gc/Nd', +'nt=decimal' => 'Gc/Nd', +'nt=di' => 'Nt/Di', +'nt=digit' => 'Nt/Di', +'nt=none' => 'Nt/None', +'nt=nu' => 'Nt/Nu', +'nt=numeric' => 'Nt/Nu', +'number' => 'Gc/N', +'numberforms' => '#/301', +'nushu' => '#/651', +'nv=nan' => 'Nt/None', +'ocr' => '#/117', +'ogam' => '#/652', +'ogham' => '#/652', +'olchiki' => '#/197', +'olck' => '#/197', +'oldhungarian' => '#/632', +'olditalic' => '#/633', +'oldnortharabian' => '#/350', +'oldpermic' => '#/657', +'oldpersian' => '#/680', +'oldsoutharabian' => '#/351', +'oldturkic' => '#/653', +'openpunctuation' => 'Gc/Ps', +'opticalcharacterrecognition' => '#/117', +'oriya' => 'Scx/Orya', +'orkh' => '#/653', +'ornamentaldingbats' => '#/374', +'orya' => 'Scx/Orya', +'osage' => '#/654', +'osge' => '#/654', +'osma' => '#/655', +'osmanya' => '#/655', +'other' => 'Gc/C', +'otherletter' => 'Gc/Lo', +'othernumber' => 'Gc/No', +'otherpunctuation' => 'Gc/Po', +'othersymbol' => 'Gc/So', +'p' => 'Gc/P', +'pahawhhmong' => 'Scx/Hmng', +'palm' => '#/262', +'palmyrene' => '#/262', +'paragraphseparator' => '#/397', +'patsyn' => 'PatSyn/Y', +'patsyn=f' => '!PatSyn/Y', +'patsyn=false' => '!PatSyn/Y', +'patsyn=n' => '!PatSyn/Y', +'patsyn=no' => '!PatSyn/Y', +'patsyn=t' => 'PatSyn/Y', +'patsyn=true' => 'PatSyn/Y', +'patsyn=y' => 'PatSyn/Y', +'patsyn=yes' => 'PatSyn/Y', +'patternsyntax' => 'PatSyn/Y', +'patternwhitespace' => 'Perl/_PerlPat', +'patws' => 'Perl/_PerlPat', +'patws=f' => '!Perl/_PerlPat', +'patws=false' => '!Perl/_PerlPat', +'patws=n' => '!Perl/_PerlPat', +'patws=no' => '!Perl/_PerlPat', +'patws=t' => 'Perl/_PerlPat', +'patws=true' => 'Perl/_PerlPat', +'patws=y' => 'Perl/_PerlPat', +'patws=yes' => 'Perl/_PerlPat', +'pauc' => '#/656', +'paucinhau' => '#/656', +'pc' => 'Gc/Pc', +'pcm' => 'PCM/Y', +'pcm=f' => '!PCM/Y', +'pcm=false' => '!PCM/Y', +'pcm=n' => '!PCM/Y', +'pcm=no' => '!PCM/Y', +'pcm=t' => 'PCM/Y', +'pcm=true' => 'PCM/Y', +'pcm=y' => 'PCM/Y', +'pcm=yes' => 'PCM/Y', +'pd' => 'Gc/Pd', +'pe' => 'Gc/Pe', +'perlspace' => '#/3', +'perlword' => 'Perl/PerlWord', +'perm' => '#/657', +'pf' => 'Gc/Pf', +'phag' => '#/658', +'phagspa' => '#/658', +'phaistos' => '#/235', +'phaistosdisc' => '#/235', +'phli' => '#/659', +'phlp' => 'Scx/Phlp', +'phnx' => '#/660', +'phoenician' => '#/660', +'phoneticext' => '#/303', +'phoneticextensions' => '#/303', +'phoneticextensionssupplement' => '#/338', +'phoneticextsup' => '#/338', +'pi' => 'Gc/Pi', +'playingcards' => '#/322', +'plrd' => '#/646', +'po' => 'Gc/Po', +'posixalnum' => '#/5', +'posixalpha' => '#/6', +'posixblank' => '#/7', +'posixcntrl' => '#/8', +'posixdigit' => '#/9', +'posixgraph' => '#/10', +'posixlower' => '#/11', +'posixprint' => '#/12', +'posixpunct' => 'Perl/PosixPun', +'posixspace' => '#/3', +'posixupper' => '#/13', +'posixword' => 'Perl/PerlWord', +'posixxdigit' => '#/59', +'prependedconcatenationmark' => 'PCM/Y', +'print' => 'Perl/Print', +'privateuse' => '#/395', +'privateusearea' => '#/118', +'prti' => '#/661', +'ps' => 'Gc/Ps', +'psalterpahlavi' => 'Scx/Phlp', +'pua' => '#/118', +'punct' => 'Gc/P', +'punctuation' => 'Gc/P', +'qaac' => 'Scx/Copt', +'qaai' => 'Scx/Zinh', +'qmark' => 'QMark/Y', +'qmark=f' => '!QMark/Y', +'qmark=false' => '!QMark/Y', +'qmark=n' => '!QMark/Y', +'qmark=no' => '!QMark/Y', +'qmark=t' => 'QMark/Y', +'qmark=true' => 'QMark/Y', +'qmark=y' => 'QMark/Y', +'qmark=yes' => 'QMark/Y', +'quotationmark' => 'QMark/Y', +'radical' => '#/92', +'radical=f' => '#/!92', +'radical=false' => '#/!92', +'radical=n' => '#/!92', +'radical=no' => '#/!92', +'radical=t' => '#/92', +'radical=true' => '#/92', +'radical=y' => '#/92', +'radical=yes' => '#/92', +'regionalindicator' => '#/66', +'rejang' => '#/662', +'ri' => '#/66', +'ri=f' => '#/!66', +'ri=false' => '#/!66', +'ri=n' => '#/!66', +'ri=no' => '#/!66', +'ri=t' => '#/66', +'ri=true' => '#/66', +'ri=y' => '#/66', +'ri=yes' => '#/66', +'rjng' => '#/662', +'rumi' => '#/127', +'ruminumeralsymbols' => '#/127', +'runic' => '#/663', +'runr' => '#/663', +'s' => 'Gc/S', +'samaritan' => '#/664', +'samr' => '#/664', +'sarb' => '#/351', +'saur' => '#/665', +'saurashtra' => '#/665', +'sb=at' => 'SB/AT', +'sb=aterm' => 'SB/AT', +'sb=cl' => 'SB/CL', +'sb=close' => 'SB/CL', +'sb=cr' => '#/63', +'sb=ex' => 'SB/EX', +'sb=extend' => 'SB/EX', +'sb=fo' => 'SB/FO', +'sb=format' => 'SB/FO', +'sb=le' => 'SB/LE', +'sb=lf' => '#/65', +'sb=lo' => 'SB/LO', +'sb=lower' => 'SB/LO', +'sb=nu' => 'SB/NU', +'sb=numeric' => 'SB/NU', +'sb=oletter' => 'SB/LE', +'sb=other' => 'SB/XX', +'sb=sc' => 'SB/SC', +'sb=scontinue' => 'SB/SC', +'sb=se' => '#/93', +'sb=sep' => '#/93', +'sb=sp' => 'SB/Sp', +'sb=st' => 'SB/ST', +'sb=sterm' => 'SB/ST', +'sb=up' => 'SB/UP', +'sb=upper' => 'SB/UP', +'sb=xx' => 'SB/XX', +'sc' => 'Gc/Sc', +'sc=adlam' => '#/580', +'sc=adlm' => '#/580', +'sc=aghb' => '#/612', +'sc=ahom' => '#/613', +'sc=anatolianhieroglyphs' => '#/631', +'sc=arab' => 'Sc/Arab', +'sc=arabic' => 'Sc/Arab', +'sc=armenian' => 'Sc/Armn', +'sc=armi' => '#/614', +'sc=armn' => 'Sc/Armn', +'sc=avestan' => '#/615', +'sc=avst' => '#/615', +'sc=bali' => '#/616', +'sc=balinese' => '#/616', +'sc=bamu' => '#/617', +'sc=bamum' => '#/617', +'sc=bass' => '#/618', +'sc=bassavah' => '#/618', +'sc=batak' => '#/619', +'sc=batk' => '#/619', +'sc=beng' => 'Sc/Beng', +'sc=bengali' => 'Sc/Beng', +'sc=bhaiksuki' => 'Scx/Bhks', +'sc=bhks' => 'Scx/Bhks', +'sc=bopo' => '#/581', +'sc=bopomofo' => '#/581', +'sc=brah' => '#/620', +'sc=brahmi' => '#/620', +'sc=brai' => '#/177', +'sc=braille' => '#/177', +'sc=bugi' => '#/582', +'sc=buginese' => '#/582', +'sc=buhd' => '#/583', +'sc=buhid' => '#/583', +'sc=cakm' => '#/584', +'sc=canadianaboriginal' => '#/623', +'sc=cans' => '#/623', +'sc=cari' => '#/624', +'sc=carian' => '#/624', +'sc=caucasianalbanian' => '#/612', +'sc=chakma' => '#/584', +'sc=cham' => 'Scx/Cham', +'sc=cher' => '#/625', +'sc=cherokee' => '#/625', +'sc=common' => 'Sc/Zyyy', +'sc=copt' => '#/585', +'sc=coptic' => '#/585', +'sc=cprt' => 'Sc/Cprt', +'sc=cuneiform' => 'Scx/Xsux', +'sc=cypriot' => 'Sc/Cprt', +'sc=cyrillic' => 'Sc/Cyrl', +'sc=cyrl' => 'Sc/Cyrl', +'sc=deseret' => '#/184', +'sc=deva' => 'Sc/Deva', +'sc=devanagari' => 'Sc/Deva', +'sc=dsrt' => '#/184', +'sc=dupl' => 'Sc/Dupl', +'sc=duployan' => 'Sc/Dupl', +'sc=egyp' => '#/626', +'sc=egyptianhieroglyphs' => '#/626', +'sc=elba' => '#/627', +'sc=elbasan' => '#/627', +'sc=ethi' => 'Scx/Ethi', +'sc=ethiopic' => 'Scx/Ethi', +'sc=geor' => 'Sc/Geor', +'sc=georgian' => 'Sc/Geor', +'sc=glag' => 'Sc/Glag', +'sc=glagolitic' => 'Sc/Glag', +'sc=gonm' => 'Scx/Gonm', +'sc=goth' => '#/628', +'sc=gothic' => '#/628', +'sc=gran' => 'Sc/Gran', +'sc=grantha' => 'Sc/Gran', +'sc=greek' => 'Sc/Grek', +'sc=grek' => 'Sc/Grek', +'sc=gujarati' => 'Sc/Gujr', +'sc=gujr' => 'Sc/Gujr', +'sc=gurmukhi' => 'Sc/Guru', +'sc=guru' => 'Sc/Guru', +'sc=han' => 'Sc/Han', +'sc=hang' => 'Sc/Hang', +'sc=hangul' => 'Sc/Hang', +'sc=hani' => 'Sc/Han', +'sc=hano' => '#/586', +'sc=hanunoo' => '#/586', +'sc=hatr' => '#/630', +'sc=hatran' => '#/630', +'sc=hebr' => 'Scx/Hebr', +'sc=hebrew' => 'Scx/Hebr', +'sc=hira' => 'Sc/Hira', +'sc=hiragana' => 'Sc/Hira', +'sc=hluw' => '#/631', +'sc=hmng' => 'Scx/Hmng', +'sc=hung' => '#/632', +'sc=imperialaramaic' => '#/614', +'sc=inherited' => 'Sc/Zinh', +'sc=inscriptionalpahlavi' => '#/659', +'sc=inscriptionalparthian' => '#/661', +'sc=ital' => '#/633', +'sc=java' => '#/587', +'sc=javanese' => '#/587', +'sc=kaithi' => '#/590', +'sc=kali' => '#/588', +'sc=kana' => 'Sc/Kana', +'sc=kannada' => 'Sc/Knda', +'sc=katakana' => 'Sc/Kana', +'sc=kayahli' => '#/588', +'sc=khar' => 'Scx/Khar', +'sc=kharoshthi' => 'Scx/Khar', +'sc=khmer' => 'Scx/Khmr', +'sc=khmr' => 'Scx/Khmr', +'sc=khoj' => '#/589', +'sc=khojki' => '#/589', +'sc=khudawadi' => '#/601', +'sc=knda' => 'Sc/Knda', +'sc=kthi' => '#/590', +'sc=lana' => 'Scx/Lana', +'sc=lao' => 'Scx/Lao', +'sc=laoo' => 'Scx/Lao', +'sc=latin' => 'Sc/Latn', +'sc=latn' => 'Sc/Latn', +'sc=lepc' => '#/637', +'sc=lepcha' => '#/637', +'sc=limb' => 'Sc/Limb', +'sc=limbu' => 'Sc/Limb', +'sc=lina' => '#/591', +'sc=linb' => 'Sc/Linb', +'sc=lineara' => '#/591', +'sc=linearb' => 'Sc/Linb', +'sc=lisu' => '#/123', +'sc=lyci' => '#/638', +'sc=lycian' => '#/638', +'sc=lydi' => '#/639', +'sc=lydian' => '#/639', +'sc=mahajani' => '#/592', +'sc=mahj' => '#/592', +'sc=malayalam' => 'Sc/Mlym', +'sc=mand' => '#/593', +'sc=mandaic' => '#/593', +'sc=mani' => '#/594', +'sc=manichaean' => '#/594', +'sc=marc' => '#/643', +'sc=marchen' => '#/643', +'sc=masaramgondi' => 'Scx/Gonm', +'sc=meeteimayek' => '#/648', +'sc=mend' => '#/644', +'sc=mendekikakui' => '#/644', +'sc=merc' => '#/645', +'sc=mero' => '#/379', +'sc=meroiticcursive' => '#/645', +'sc=meroitichieroglyphs' => '#/379', +'sc=miao' => '#/646', +'sc=mlym' => 'Sc/Mlym', +'sc=modi' => '#/595', +'sc=mong' => 'Sc/Mong', +'sc=mongolian' => 'Sc/Mong', +'sc=mro' => '#/609', +'sc=mroo' => '#/609', +'sc=mtei' => '#/648', +'sc=mult' => 'Sc/Mult', +'sc=multani' => 'Sc/Mult', +'sc=myanmar' => '#/596', +'sc=mymr' => '#/596', +'sc=nabataean' => '#/649', +'sc=narb' => '#/350', +'sc=nbat' => '#/649', +'sc=newa' => '#/650', +'sc=newtailue' => 'Scx/Talu', +'sc=nko' => '#/610', +'sc=nkoo' => '#/610', +'sc=nshu' => '#/651', +'sc=nushu' => '#/651', +'sc=ogam' => '#/652', +'sc=ogham' => '#/652', +'sc=olchiki' => '#/197', +'sc=olck' => '#/197', +'sc=oldhungarian' => '#/632', +'sc=olditalic' => '#/633', +'sc=oldnortharabian' => '#/350', +'sc=oldpermic' => '#/597', +'sc=oldpersian' => '#/680', +'sc=oldsoutharabian' => '#/351', +'sc=oldturkic' => '#/653', +'sc=oriya' => 'Sc/Orya', +'sc=orkh' => '#/653', +'sc=orya' => 'Sc/Orya', +'sc=osage' => '#/654', +'sc=osge' => '#/654', +'sc=osma' => '#/655', +'sc=osmanya' => '#/655', +'sc=pahawhhmong' => 'Scx/Hmng', +'sc=palm' => '#/262', +'sc=palmyrene' => '#/262', +'sc=pauc' => '#/656', +'sc=paucinhau' => '#/656', +'sc=perm' => '#/597', +'sc=phag' => '#/598', +'sc=phagspa' => '#/598', +'sc=phli' => '#/659', +'sc=phlp' => '#/599', +'sc=phnx' => '#/660', +'sc=phoenician' => '#/660', +'sc=plrd' => '#/646', +'sc=prti' => '#/661', +'sc=psalterpahlavi' => '#/599', +'sc=qaac' => '#/585', +'sc=qaai' => 'Sc/Zinh', +'sc=rejang' => '#/662', +'sc=rjng' => '#/662', +'sc=runic' => '#/663', +'sc=runr' => '#/663', +'sc=samaritan' => '#/664', +'sc=samr' => '#/664', +'sc=sarb' => '#/351', +'sc=saur' => '#/665', +'sc=saurashtra' => '#/665', +'sc=sgnw' => '#/666', +'sc=sharada' => '#/600', +'sc=shavian' => '#/201', +'sc=shaw' => '#/201', +'sc=shrd' => '#/600', +'sc=sidd' => '#/667', +'sc=siddham' => '#/667', +'sc=signwriting' => '#/666', +'sc=sind' => '#/601', +'sc=sinh' => 'Sc/Sinh', +'sc=sinhala' => 'Sc/Sinh', +'sc=sora' => '#/668', +'sc=sorasompeng' => '#/668', +'sc=soyo' => '#/669', +'sc=soyombo' => '#/669', +'sc=sund' => '#/670', +'sc=sundanese' => '#/670', +'sc=sylo' => '#/602', +'sc=sylotinagri' => '#/602', +'sc=syrc' => 'Sc/Syrc', +'sc=syriac' => 'Sc/Syrc', +'sc=tagalog' => '#/606', +'sc=tagb' => '#/603', +'sc=tagbanwa' => '#/603', +'sc=taile' => '#/605', +'sc=taitham' => 'Scx/Lana', +'sc=taiviet' => '#/674', +'sc=takr' => '#/604', +'sc=takri' => '#/604', +'sc=tale' => '#/605', +'sc=talu' => 'Scx/Talu', +'sc=tamil' => 'Sc/Taml', +'sc=taml' => 'Sc/Taml', +'sc=tang' => '#/673', +'sc=tangut' => '#/673', +'sc=tavt' => '#/674', +'sc=telu' => 'Sc/Telu', +'sc=telugu' => 'Sc/Telu', +'sc=tfng' => '#/675', +'sc=tglg' => '#/606', +'sc=thaa' => '#/607', +'sc=thaana' => '#/607', +'sc=thai' => '#/677', +'sc=tibetan' => 'Scx/Tibt', +'sc=tibt' => 'Scx/Tibt', +'sc=tifinagh' => '#/675', +'sc=tirh' => '#/608', +'sc=tirhuta' => '#/608', +'sc=ugar' => '#/678', +'sc=ugaritic' => '#/678', +'sc=unknown' => 'Scx/Zzzz', +'sc=vai' => '#/611', +'sc=vaii' => '#/611', +'sc=wara' => '#/679', +'sc=warangciti' => '#/679', +'sc=xpeo' => '#/680', +'sc=xsux' => 'Scx/Xsux', +'sc=yi' => '#/579', +'sc=yiii' => '#/579', +'sc=zanabazarsquare' => '#/681', +'sc=zanb' => '#/681', +'sc=zinh' => 'Sc/Zinh', +'sc=zyyy' => 'Sc/Zyyy', +'sc=zzzz' => 'Scx/Zzzz', +'scx=adlam' => 'Scx/Adlm', +'scx=adlm' => 'Scx/Adlm', +'scx=aghb' => '#/612', +'scx=ahom' => '#/613', +'scx=anatolianhieroglyphs' => '#/631', +'scx=arab' => 'Scx/Arab', +'scx=arabic' => 'Scx/Arab', +'scx=armenian' => 'Scx/Armn', +'scx=armi' => '#/614', +'scx=armn' => 'Scx/Armn', +'scx=avestan' => '#/615', +'scx=avst' => '#/615', +'scx=bali' => '#/616', +'scx=balinese' => '#/616', +'scx=bamu' => '#/617', +'scx=bamum' => '#/617', +'scx=bass' => '#/618', +'scx=bassavah' => '#/618', +'scx=batak' => '#/619', +'scx=batk' => '#/619', +'scx=beng' => 'Scx/Beng', +'scx=bengali' => 'Scx/Beng', +'scx=bhaiksuki' => 'Scx/Bhks', +'scx=bhks' => 'Scx/Bhks', +'scx=bopo' => 'Scx/Bopo', +'scx=bopomofo' => 'Scx/Bopo', +'scx=brah' => '#/620', +'scx=brahmi' => '#/620', +'scx=brai' => '#/177', +'scx=braille' => '#/177', +'scx=bugi' => '#/621', +'scx=buginese' => '#/621', +'scx=buhd' => '#/622', +'scx=buhid' => '#/622', +'scx=cakm' => 'Scx/Cakm', +'scx=canadianaboriginal' => '#/623', +'scx=cans' => '#/623', +'scx=cari' => '#/624', +'scx=carian' => '#/624', +'scx=caucasianalbanian' => '#/612', +'scx=chakma' => 'Scx/Cakm', +'scx=cham' => 'Scx/Cham', +'scx=cher' => '#/625', +'scx=cherokee' => '#/625', +'scx=common' => 'Scx/Zyyy', +'scx=copt' => 'Scx/Copt', +'scx=coptic' => 'Scx/Copt', +'scx=cprt' => 'Scx/Cprt', +'scx=cuneiform' => 'Scx/Xsux', +'scx=cypriot' => 'Scx/Cprt', +'scx=cyrillic' => 'Scx/Cyrl', +'scx=cyrl' => 'Scx/Cyrl', +'scx=deseret' => '#/184', +'scx=deva' => 'Scx/Deva', +'scx=devanagari' => 'Scx/Deva', +'scx=dsrt' => '#/184', +'scx=dupl' => 'Scx/Dupl', +'scx=duployan' => 'Scx/Dupl', +'scx=egyp' => '#/626', +'scx=egyptianhieroglyphs' => '#/626', +'scx=elba' => '#/627', +'scx=elbasan' => '#/627', +'scx=ethi' => 'Scx/Ethi', +'scx=ethiopic' => 'Scx/Ethi', +'scx=geor' => 'Scx/Geor', +'scx=georgian' => 'Scx/Geor', +'scx=glag' => 'Scx/Glag', +'scx=glagolitic' => 'Scx/Glag', +'scx=gonm' => 'Scx/Gonm', +'scx=goth' => '#/628', +'scx=gothic' => '#/628', +'scx=gran' => 'Scx/Gran', +'scx=grantha' => 'Scx/Gran', +'scx=greek' => 'Scx/Grek', +'scx=grek' => 'Scx/Grek', +'scx=gujarati' => 'Scx/Gujr', +'scx=gujr' => 'Scx/Gujr', +'scx=gurmukhi' => 'Scx/Guru', +'scx=guru' => 'Scx/Guru', +'scx=han' => 'Scx/Han', +'scx=hang' => 'Scx/Hang', +'scx=hangul' => 'Scx/Hang', +'scx=hani' => 'Scx/Han', +'scx=hano' => '#/629', +'scx=hanunoo' => '#/629', +'scx=hatr' => '#/630', +'scx=hatran' => '#/630', +'scx=hebr' => 'Scx/Hebr', +'scx=hebrew' => 'Scx/Hebr', +'scx=hira' => 'Scx/Hira', +'scx=hiragana' => 'Scx/Hira', +'scx=hluw' => '#/631', +'scx=hmng' => 'Scx/Hmng', +'scx=hung' => '#/632', +'scx=imperialaramaic' => '#/614', +'scx=inherited' => 'Scx/Zinh', +'scx=inscriptionalpahlavi' => '#/659', +'scx=inscriptionalparthian' => '#/661', +'scx=ital' => '#/633', +'scx=java' => '#/634', +'scx=javanese' => '#/634', +'scx=kaithi' => '#/636', +'scx=kali' => '#/190', +'scx=kana' => 'Scx/Kana', +'scx=kannada' => 'Scx/Knda', +'scx=katakana' => 'Scx/Kana', +'scx=kayahli' => '#/190', +'scx=khar' => 'Scx/Khar', +'scx=kharoshthi' => 'Scx/Khar', +'scx=khmer' => 'Scx/Khmr', +'scx=khmr' => 'Scx/Khmr', +'scx=khoj' => '#/635', +'scx=khojki' => '#/635', +'scx=khudawadi' => 'Scx/Sind', +'scx=knda' => 'Scx/Knda', +'scx=kthi' => '#/636', +'scx=lana' => 'Scx/Lana', +'scx=lao' => 'Scx/Lao', +'scx=laoo' => 'Scx/Lao', +'scx=latin' => 'Scx/Latn', +'scx=latn' => 'Scx/Latn', +'scx=lepc' => '#/637', +'scx=lepcha' => '#/637', +'scx=limb' => 'Scx/Limb', +'scx=limbu' => 'Scx/Limb', +'scx=lina' => 'Scx/Lina', +'scx=linb' => 'Scx/Linb', +'scx=lineara' => 'Scx/Lina', +'scx=linearb' => 'Scx/Linb', +'scx=lisu' => '#/123', +'scx=lyci' => '#/638', +'scx=lycian' => '#/638', +'scx=lydi' => '#/639', +'scx=lydian' => '#/639', +'scx=mahajani' => '#/640', +'scx=mahj' => '#/640', +'scx=malayalam' => 'Scx/Mlym', +'scx=mand' => '#/641', +'scx=mandaic' => '#/641', +'scx=mani' => '#/642', +'scx=manichaean' => '#/642', +'scx=marc' => '#/643', +'scx=marchen' => '#/643', +'scx=masaramgondi' => 'Scx/Gonm', +'scx=meeteimayek' => '#/648', +'scx=mend' => '#/644', +'scx=mendekikakui' => '#/644', +'scx=merc' => '#/645', +'scx=mero' => '#/379', +'scx=meroiticcursive' => '#/645', +'scx=meroitichieroglyphs' => '#/379', +'scx=miao' => '#/646', +'scx=mlym' => 'Scx/Mlym', +'scx=modi' => '#/647', +'scx=mong' => 'Scx/Mong', +'scx=mongolian' => 'Scx/Mong', +'scx=mro' => '#/609', +'scx=mroo' => '#/609', +'scx=mtei' => '#/648', +'scx=mult' => 'Scx/Mult', +'scx=multani' => 'Scx/Mult', +'scx=myanmar' => 'Scx/Mymr', +'scx=mymr' => 'Scx/Mymr', +'scx=nabataean' => '#/649', +'scx=narb' => '#/350', +'scx=nbat' => '#/649', +'scx=newa' => '#/650', +'scx=newtailue' => 'Scx/Talu', +'scx=nko' => '#/610', +'scx=nkoo' => '#/610', +'scx=nshu' => '#/651', +'scx=nushu' => '#/651', +'scx=ogam' => '#/652', +'scx=ogham' => '#/652', +'scx=olchiki' => '#/197', +'scx=olck' => '#/197', +'scx=oldhungarian' => '#/632', +'scx=olditalic' => '#/633', +'scx=oldnortharabian' => '#/350', +'scx=oldpermic' => '#/657', +'scx=oldpersian' => '#/680', +'scx=oldsoutharabian' => '#/351', +'scx=oldturkic' => '#/653', +'scx=oriya' => 'Scx/Orya', +'scx=orkh' => '#/653', +'scx=orya' => 'Scx/Orya', +'scx=osage' => '#/654', +'scx=osge' => '#/654', +'scx=osma' => '#/655', +'scx=osmanya' => '#/655', +'scx=pahawhhmong' => 'Scx/Hmng', +'scx=palm' => '#/262', +'scx=palmyrene' => '#/262', +'scx=pauc' => '#/656', +'scx=paucinhau' => '#/656', +'scx=perm' => '#/657', +'scx=phag' => '#/658', +'scx=phagspa' => '#/658', +'scx=phli' => '#/659', +'scx=phlp' => 'Scx/Phlp', +'scx=phnx' => '#/660', +'scx=phoenician' => '#/660', +'scx=plrd' => '#/646', +'scx=prti' => '#/661', +'scx=psalterpahlavi' => 'Scx/Phlp', +'scx=qaac' => 'Scx/Copt', +'scx=qaai' => 'Scx/Zinh', +'scx=rejang' => '#/662', +'scx=rjng' => '#/662', +'scx=runic' => '#/663', +'scx=runr' => '#/663', +'scx=samaritan' => '#/664', +'scx=samr' => '#/664', +'scx=sarb' => '#/351', +'scx=saur' => '#/665', +'scx=saurashtra' => '#/665', +'scx=sgnw' => '#/666', +'scx=sharada' => 'Scx/Shrd', +'scx=shavian' => '#/201', +'scx=shaw' => '#/201', +'scx=shrd' => 'Scx/Shrd', +'scx=sidd' => '#/667', +'scx=siddham' => '#/667', +'scx=signwriting' => '#/666', +'scx=sind' => 'Scx/Sind', +'scx=sinh' => 'Scx/Sinh', +'scx=sinhala' => 'Scx/Sinh', +'scx=sora' => '#/668', +'scx=sorasompeng' => '#/668', +'scx=soyo' => '#/669', +'scx=soyombo' => '#/669', +'scx=sund' => '#/670', +'scx=sundanese' => '#/670', +'scx=sylo' => '#/671', +'scx=sylotinagri' => '#/671', +'scx=syrc' => 'Scx/Syrc', +'scx=syriac' => 'Scx/Syrc', +'scx=tagalog' => '#/676', +'scx=tagb' => 'Scx/Tagb', +'scx=tagbanwa' => 'Scx/Tagb', +'scx=taile' => '#/672', +'scx=taitham' => 'Scx/Lana', +'scx=taiviet' => '#/674', +'scx=takr' => 'Scx/Takr', +'scx=takri' => 'Scx/Takr', +'scx=tale' => '#/672', +'scx=talu' => 'Scx/Talu', +'scx=tamil' => 'Scx/Taml', +'scx=taml' => 'Scx/Taml', +'scx=tang' => '#/673', +'scx=tangut' => '#/673', +'scx=tavt' => '#/674', +'scx=telu' => 'Scx/Telu', +'scx=telugu' => 'Scx/Telu', +'scx=tfng' => '#/675', +'scx=tglg' => '#/676', +'scx=thaa' => 'Scx/Thaa', +'scx=thaana' => 'Scx/Thaa', +'scx=thai' => '#/677', +'scx=tibetan' => 'Scx/Tibt', +'scx=tibt' => 'Scx/Tibt', +'scx=tifinagh' => '#/675', +'scx=tirh' => 'Scx/Tirh', +'scx=tirhuta' => 'Scx/Tirh', +'scx=ugar' => '#/678', +'scx=ugaritic' => '#/678', +'scx=unknown' => 'Scx/Zzzz', +'scx=vai' => '#/611', +'scx=vaii' => '#/611', +'scx=wara' => '#/679', +'scx=warangciti' => '#/679', +'scx=xpeo' => '#/680', +'scx=xsux' => 'Scx/Xsux', +'scx=yi' => 'Scx/Yi', +'scx=yiii' => 'Scx/Yi', +'scx=zanabazarsquare' => '#/681', +'scx=zanb' => '#/681', +'scx=zinh' => 'Scx/Zinh', +'scx=zyyy' => 'Scx/Zyyy', +'scx=zzzz' => 'Scx/Zzzz', +'sd' => 'SD/Y', +'sd=f' => '!SD/Y', +'sd=false' => '!SD/Y', +'sd=n' => '!SD/Y', +'sd=no' => '!SD/Y', +'sd=t' => 'SD/Y', +'sd=true' => 'SD/Y', +'sd=y' => 'SD/Y', +'sd=yes' => 'SD/Y', +'sentenceterminal' => 'STerm/Y', +'separator' => 'Gc/Z', +'sgnw' => '#/666', +'sharada' => 'Scx/Shrd', +'shavian' => '#/201', +'shaw' => '#/201', +'shorthandformatcontrols' => '#/389', +'shrd' => 'Scx/Shrd', +'sidd' => '#/667', +'siddham' => '#/667', +'signwriting' => '#/666', +'sind' => 'Scx/Sind', +'sinh' => 'Scx/Sinh', +'sinhala' => 'Scx/Sinh', +'sinhalaarchaicnumbers' => '#/384', +'sk' => 'Gc/Sk', +'sm' => 'Gc/Sm', +'smallforms' => '#/282', +'smallformvariants' => '#/282', +'so' => 'Gc/So', +'softdotted' => 'SD/Y', +'sora' => '#/668', +'sorasompeng' => '#/668', +'soyo' => '#/669', +'soyombo' => '#/669', +'space' => 'Perl/SpacePer', +'spaceperl' => 'Perl/SpacePer', +'spaceseparator' => 'Gc/Zs', +'spacingmark' => 'Gc/Mc', +'spacingmodifierletters' => '#/349', +'specials' => '#/236', +'sterm' => 'STerm/Y', +'sterm=f' => '!STerm/Y', +'sterm=false' => '!STerm/Y', +'sterm=n' => '!STerm/Y', +'sterm=no' => '!STerm/Y', +'sterm=t' => 'STerm/Y', +'sterm=true' => 'STerm/Y', +'sterm=y' => 'STerm/Y', +'sterm=yes' => 'STerm/Y', +'sund' => '#/670', +'sundanese' => '#/670', +'sundanesesup' => '#/323', +'sundanesesupplement' => '#/323', +'suparrowsa' => '#/283', +'suparrowsb' => '#/284', +'suparrowsc' => '#/285', +'superandsub' => '#/306', +'superscriptsandsubscripts' => '#/306', +'supmathoperators' => '#/364', +'supplementalarrowsa' => '#/283', +'supplementalarrowsb' => '#/284', +'supplementalarrowsc' => '#/285', +'supplementalmathematicaloperators' => '#/364', +'supplementalpunctuation' => '#/340', +'supplementalsymbolsandpictographs' => '#/390', +'supplementaryprivateuseareaa' => '#/205', +'supplementaryprivateuseareab' => '#/206', +'suppuaa' => '#/205', +'suppuab' => '#/206', +'suppunctuation' => '#/340', +'supsymbolsandpictographs' => '#/390', +'surrogate' => '#/14', +'suttonsignwriting' => '#/369', +'sylo' => '#/671', +'sylotinagri' => '#/671', +'symbol' => 'Gc/S', +'syrc' => 'Scx/Syrc', +'syriac' => 'Scx/Syrc', +'syriacsup' => '#/266', +'syriacsupplement' => '#/266', +'tagalog' => '#/676', +'tagb' => 'Scx/Tagb', +'tagbanwa' => 'Scx/Tagb', +'tags' => '#/128', +'taile' => '#/672', +'taitham' => 'Scx/Lana', +'taiviet' => '#/674', +'taixuanjing' => '#/308', +'taixuanjingsymbols' => '#/308', +'takr' => 'Scx/Takr', +'takri' => 'Scx/Takr', +'tale' => '#/672', +'talu' => 'Scx/Talu', +'tamil' => 'Scx/Taml', +'taml' => 'Scx/Taml', +'tang' => '#/673', +'tangut' => '#/673', +'tangutcomponents' => '#/365', +'tavt' => '#/674', +'telu' => 'Scx/Telu', +'telugu' => 'Scx/Telu', +'term' => 'Term/Y', +'term=f' => '!Term/Y', +'term=false' => '!Term/Y', +'term=n' => '!Term/Y', +'term=no' => '!Term/Y', +'term=t' => 'Term/Y', +'term=true' => 'Term/Y', +'term=y' => 'Term/Y', +'term=yes' => 'Term/Y', +'terminalpunctuation' => 'Term/Y', +'tfng' => '#/675', +'tglg' => '#/676', +'thaa' => 'Scx/Thaa', +'thaana' => 'Scx/Thaa', +'thai' => '#/677', +'tibetan' => 'Scx/Tibt', +'tibt' => 'Scx/Tibt', +'tifinagh' => '#/675', +'tirh' => 'Scx/Tirh', +'tirhuta' => 'Scx/Tirh', +'title' => 'Perl/Title', +'titlecase' => 'Perl/Title', +'titlecaseletter' => 'Perl/Title', +'transportandmap' => '#/352', +'transportandmapsymbols' => '#/352', +'ucas' => '#/130', +'ucasext' => '#/212', +'ugar' => '#/678', +'ugaritic' => '#/678', +'uideo' => 'UIdeo/Y', +'uideo=f' => '!UIdeo/Y', +'uideo=false' => '!UIdeo/Y', +'uideo=n' => '!UIdeo/Y', +'uideo=no' => '!UIdeo/Y', +'uideo=t' => 'UIdeo/Y', +'uideo=true' => 'UIdeo/Y', +'uideo=y' => 'UIdeo/Y', +'uideo=yes' => 'UIdeo/Y', +'unassigned' => 'Gc/Cn', +'unicode' => '#/2', +'unifiedcanadianaboriginalsyllabics' => '#/130', +'unifiedcanadianaboriginalsyllabicsextended' => '#/212', +'unifiedideograph' => 'UIdeo/Y', +'unknown' => 'Scx/Zzzz', +'upper' => 'Upper/Y', +'upper=f' => '!Upper/Y', +'upper=false' => '!Upper/Y', +'upper=n' => '!Upper/Y', +'upper=no' => '!Upper/Y', +'upper=t' => 'Upper/Y', +'upper=true' => 'Upper/Y', +'upper=y' => 'Upper/Y', +'upper=yes' => 'Upper/Y', +'uppercase' => 'Upper/Y', +'uppercaseletter' => 'Gc/Lu', +'vai' => '#/611', +'vaii' => '#/611', +'variationselector' => '#/94', +'variationselectors' => '#/111', +'variationselectorssupplement' => '#/148', +'vedicext' => '#/240', +'vedicextensions' => '#/240', +'verticalforms' => '#/331', +'vertspace' => '#/4', +'vo=r' => 'Vo/R', +'vo=rotated' => 'Vo/R', +'vo=tr' => 'Vo/Tr', +'vo=transformedrotated' => 'Vo/Tr', +'vo=transformedupright' => 'Vo/Tu', +'vo=tu' => 'Vo/Tu', +'vo=u' => 'Vo/U', +'vo=upright' => 'Vo/U', +'vs' => '#/94', +'vs=f' => '#/!94', +'vs=false' => '#/!94', +'vs=n' => '#/!94', +'vs=no' => '#/!94', +'vs=t' => '#/94', +'vs=true' => '#/94', +'vs=y' => '#/94', +'vs=yes' => '#/94', +'vssup' => '#/148', +'wara' => '#/679', +'warangciti' => '#/679', +'wb=aletter' => 'WB/LE', +'wb=cr' => '#/63', +'wb=doublequote' => '#/95', +'wb=dq' => '#/95', +'wb=eb' => 'GCB/EB', +'wb=ebase' => 'GCB/EB', +'wb=ebasegaz' => '#/67', +'wb=ebg' => '#/67', +'wb=em' => '#/64', +'wb=emodifier' => '#/64', +'wb=ex' => 'WB/EX', +'wb=extend' => 'WB/Extend', +'wb=extendnumlet' => 'WB/EX', +'wb=fo' => 'WB/FO', +'wb=format' => 'WB/FO', +'wb=gaz' => 'GCB/GAZ', +'wb=glueafterzwj' => 'GCB/GAZ', +'wb=hebrewletter' => 'WB/HL', +'wb=hl' => 'WB/HL', +'wb=ka' => 'WB/KA', +'wb=katakana' => 'WB/KA', +'wb=le' => 'WB/LE', +'wb=lf' => '#/65', +'wb=mb' => 'WB/MB', +'wb=midletter' => 'WB/ML', +'wb=midnum' => 'WB/MN', +'wb=midnumlet' => 'WB/MB', +'wb=ml' => 'WB/ML', +'wb=mn' => 'WB/MN', +'wb=newline' => '#/96', +'wb=nl' => '#/96', +'wb=nu' => 'WB/NU', +'wb=numeric' => 'WB/NU', +'wb=other' => 'WB/XX', +'wb=regionalindicator' => '#/66', +'wb=ri' => '#/66', +'wb=singlequote' => '#/97', +'wb=sq' => '#/97', +'wb=xx' => 'WB/XX', +'wb=zwj' => '#/68', +'whitespace' => 'Perl/SpacePer', +'word' => 'Perl/Word', +'wspace' => 'Perl/SpacePer', +'wspace=f' => '!Perl/SpacePer', +'wspace=false' => '!Perl/SpacePer', +'wspace=n' => '!Perl/SpacePer', +'wspace=no' => '!Perl/SpacePer', +'wspace=t' => 'Perl/SpacePer', +'wspace=true' => 'Perl/SpacePer', +'wspace=y' => 'Perl/SpacePer', +'wspace=yes' => 'Perl/SpacePer', +'xdigit' => 'Hex/Y', +'xidc' => 'XIDC/Y', +'xidc=f' => '!XIDC/Y', +'xidc=false' => '!XIDC/Y', +'xidc=n' => '!XIDC/Y', +'xidc=no' => '!XIDC/Y', +'xidc=t' => 'XIDC/Y', +'xidc=true' => 'XIDC/Y', +'xidc=y' => 'XIDC/Y', +'xidc=yes' => 'XIDC/Y', +'xidcontinue' => 'XIDC/Y', +'xids' => 'XIDS/Y', +'xids=f' => '!XIDS/Y', +'xids=false' => '!XIDS/Y', +'xids=n' => '!XIDS/Y', +'xids=no' => '!XIDS/Y', +'xids=t' => 'XIDS/Y', +'xids=true' => 'XIDS/Y', +'xids=y' => 'XIDS/Y', +'xids=yes' => 'XIDS/Y', +'xidstart' => 'XIDS/Y', +'xpeo' => '#/680', +'xperlspace' => 'Perl/SpacePer', +'xposixalnum' => 'Perl/Alnum', +'xposixalpha' => 'Alpha/Y', +'xposixblank' => 'Perl/Blank', +'xposixcntrl' => '#/394', +'xposixdigit' => 'Gc/Nd', +'xposixgraph' => 'Perl/Graph', +'xposixlower' => 'Lower/Y', +'xposixprint' => 'Perl/Print', +'xposixpunct' => 'Perl/XPosixPu', +'xposixspace' => 'Perl/SpacePer', +'xposixupper' => 'Upper/Y', +'xposixword' => 'Perl/Word', +'xposixxdigit' => 'Hex/Y', +'xsux' => 'Scx/Xsux', +'yi' => 'Scx/Yi', +'yiii' => 'Scx/Yi', +'yijing' => '#/174', +'yijinghexagramsymbols' => '#/174', +'yiradicals' => '#/287', +'yisyllables' => '#/309', +'z' => 'Gc/Z', +'zanabazarsquare' => '#/681', +'zanb' => '#/681', +'zinh' => 'Scx/Zinh', +'zl' => '#/396', +'zp' => '#/397', +'zs' => 'Gc/Zs', +'zyyy' => 'Scx/Zyyy', +'zzzz' => 'Scx/Zzzz', +); + +# Maps floating point to fractional form +%utf8::nv_floating_to_rational = ( +'-0.5' => '-1/2', +'0.00625' => '1/160', +'0.025' => '1/40', +'0.0375' => '3/80', +'0.05' => '1/20', +'0.0625' => '1/16', +'0.0833333333333333' => '1/12', +'0.1' => '1/10', +'0.111111111111111' => '1/9', +'0.125' => '1/8', +'0.142857142857143' => '1/7', +'0.15' => '3/20', +'0.166666666666667' => '1/6', +'0.1875' => '3/16', +'0.2' => '1/5', +'0.25' => '1/4', +'0.333333333333333' => '1/3', +'0.375' => '3/8', +'0.4' => '2/5', +'0.416666666666667' => '5/12', +'0.5' => '1/2', +'0.583333333333333' => '7/12', +'0.6' => '3/5', +'0.625' => '5/8', +'0.666666666666667' => '2/3', +'0.75' => '3/4', +'0.8' => '4/5', +'0.833333333333333' => '5/6', +'0.875' => '7/8', +'0.916666666666667' => '11/12', +'1.5' => '3/2', +'2.5' => '5/2', +'3.5' => '7/2', +'4.5' => '9/2', +'5.5' => '11/2', +'6.5' => '13/2', +'7.5' => '15/2', +'8.5' => '17/2', +); + +# If a floating point number doesn't have enough digits in it to get this +# close to a fraction, it isn't considered to be that fraction even if all the +# digits it does have match. +$utf8::max_floating_slop = 0.001; + +# Deprecated tables to generate a warning for. The key is the file containing +# the table, so as to avoid duplication, as many property names can map to the +# file, but we only need one entry for all of them. +%utf8::why_deprecated = ( +'#/488' => 'Deprecated by Unicode because surrogates should never appear in well-formed text, and therefore shouldn\'t be the basis for line breaking', +'Hyphen/T' => 'Supplanted by Line_Break property values; see www.unicode.org/reports/tr14', +); + +# A few properties have different behavior under /i matching. This maps +# those to substitute files to use under /i. +%utf8::caseless_equivalent = ( +'gc=ll' => 'Gc/LC', +'gc=lowercaseletter' => 'Gc/LC', +'gc=lt' => 'Gc/LC', +'gc=lu' => 'Gc/LC', +'gc=titlecaseletter' => 'Gc/LC', +'gc=uppercaseletter' => 'Gc/LC', +'isll' => 'Gc/LC', +'islower' => 'Cased/Y', +'islowercase' => 'Cased/Y', +'islowercaseletter' => 'Gc/LC', +'islt' => 'Gc/LC', +'islu' => 'Gc/LC', +'isposixlower' => '#/6', +'isposixupper' => '#/6', +'istitle' => 'Cased/Y', +'istitlecase' => 'Cased/Y', +'istitlecaseletter' => 'Gc/LC', +'isupper' => 'Cased/Y', +'isuppercase' => 'Cased/Y', +'isuppercaseletter' => 'Gc/LC', +'isxposixlower' => 'Cased/Y', +'isxposixupper' => 'Cased/Y', +'ll' => 'Gc/LC', +'lower' => 'Cased/Y', +'lower=f' => '!Cased/Y', +'lower=false' => '!Cased/Y', +'lower=n' => '!Cased/Y', +'lower=no' => '!Cased/Y', +'lower=t' => 'Cased/Y', +'lower=true' => 'Cased/Y', +'lower=y' => 'Cased/Y', +'lower=yes' => 'Cased/Y', +'lowercase' => 'Cased/Y', +'lowercaseletter' => 'Gc/LC', +'lt' => 'Gc/LC', +'lu' => 'Gc/LC', +'posixlower' => '#/6', +'posixupper' => '#/6', +'title' => 'Cased/Y', +'titlecase' => 'Cased/Y', +'titlecaseletter' => 'Gc/LC', +'upper' => 'Cased/Y', +'upper=f' => '!Cased/Y', +'upper=false' => '!Cased/Y', +'upper=n' => '!Cased/Y', +'upper=no' => '!Cased/Y', +'upper=t' => 'Cased/Y', +'upper=true' => 'Cased/Y', +'upper=y' => 'Cased/Y', +'upper=yes' => 'Cased/Y', +'uppercase' => 'Cased/Y', +'uppercaseletter' => 'Gc/LC', +'xposixlower' => 'Cased/Y', +'xposixupper' => 'Cased/Y', +); + +# Property names to mapping files +%utf8::loose_property_to_file_of = ( +'age' => 'To/Age', +'bc' => 'To/Bc', +'bidiclass' => 'To/Bc', +'bidimirroringglyph' => 'To/Bmg', +'bidipairedbracket' => 'To/Bpb', +'bidipairedbrackettype' => 'To/Bpt', +'bmg' => 'To/Bmg', +'bpb' => 'To/Bpb', +'bpt' => 'To/Bpt', +'canonicalcombiningclass' => 'CombiningClass', +'casefolding' => 'To/Cf', +'category' => 'To/Gc', +'ccc' => 'CombiningClass', +'cf' => 'To/Cf', +'ea' => 'To/Ea', +'eastasianwidth' => 'To/Ea', +'gc' => 'To/Gc', +'gcb' => 'To/GCB', +'generalcategory' => 'To/Gc', +'graphemeclusterbreak' => 'To/GCB', +'hangulsyllabletype' => 'To/Hst', +'hst' => 'To/Hst', +'indicpositionalcategory' => 'To/InPC', +'indicsyllabiccategory' => 'To/InSC', +'inpc' => 'To/InPC', +'insc' => 'To/InSC', +'isc' => 'To/Isc', +'isocomment' => 'To/Isc', +'jg' => 'To/Jg', +'joininggroup' => 'To/Jg', +'joiningtype' => 'To/Jt', +'jt' => 'To/Jt', +'lb' => 'To/Lb', +'lc' => 'To/Lc', +'linebreak' => 'To/Lb', +'lowercasemapping' => 'To/Lc', +'na1' => 'To/Na1', +'namealias' => 'To/NameAlia', +'nfcqc' => 'To/NFCQC', +'nfcquickcheck' => 'To/NFCQC', +'nfdqc' => 'To/NFDQC', +'nfdquickcheck' => 'To/NFDQC', +'nfkccasefold' => 'To/NFKCCF', +'nfkccf' => 'To/NFKCCF', +'nfkcqc' => 'To/NFKCQC', +'nfkcquickcheck' => 'To/NFKCQC', +'nfkdqc' => 'To/NFKDQC', +'nfkdquickcheck' => 'To/NFKDQC', +'nt' => 'To/Nt', +'numerictype' => 'To/Nt', +'numericvalue' => 'To/Nv', +'nv' => 'To/Nv', +'perldecimaldigit' => 'To/PerlDeci', +'sb' => 'To/SB', +'sc' => 'To/Sc', +'script' => 'To/Sc', +'scriptextensions' => 'To/Scx', +'scx' => 'To/Scx', +'sentencebreak' => 'To/SB', +'tc' => 'To/Tc', +'titlecasemapping' => 'To/Tc', +'uc' => 'To/Uc', +'unicode1name' => 'To/Na1', +'uppercasemapping' => 'To/Uc', +'verticalorientation' => 'To/Vo', +'vo' => 'To/Vo', +'wb' => 'To/WB', +'wordbreak' => 'To/WB', +); + +# Property names to mapping files +%utf8::strict_property_to_file_of = ( +'_perl_gcb' => 'To/GCB', +'_perl_lb' => 'To/_PerlLB', +'_perl_name_alias' => 'To/NameAlia', +'_perl_sb' => 'To/SB', +'_perl_scx' => 'To/_PerlSCX', +'_perl_wb' => 'To/_PerlWB', +); + +# Files to the swash names within them. +%utf8::file_to_swash_name = ( +'CombiningClass' => 'ToCombiningClass', +'To/_PerlLB' => 'To_PerlLB', +'To/_PerlSCX' => 'To_PerlSCX', +'To/_PerlWB' => 'To_PerlWB', +'To/Age' => 'ToAge', +'To/Bc' => 'ToBc', +'To/Bmg' => 'ToBmg', +'To/Bpb' => 'ToBpb', +'To/Bpt' => 'ToBpt', +'To/Cf' => 'ToCf', +'To/Ea' => 'ToEa', +'To/Gc' => 'ToGc', +'To/GCB' => 'ToGCB', +'To/Hst' => 'ToHst', +'To/InPC' => 'ToInPC', +'To/InSC' => 'ToInSC', +'To/Isc' => 'ToIsc', +'To/Jg' => 'ToJg', +'To/Jt' => 'ToJt', +'To/Lb' => 'ToLb', +'To/Lc' => 'ToLc', +'To/Na1' => 'ToNa1', +'To/NameAlia' => 'ToNameAlias', +'To/NFCQC' => 'ToNFCQC', +'To/NFDQC' => 'ToNFDQC', +'To/NFKCCF' => 'ToNFKCCF', +'To/NFKCQC' => 'ToNFKCQC', +'To/NFKDQC' => 'ToNFKDQC', +'To/Nt' => 'ToNt', +'To/Nv' => 'ToNv', +'To/PerlDeci' => 'ToPerlDecimalDigit', +'To/SB' => 'ToSB', +'To/Sc' => 'ToSc', +'To/Scx' => 'ToScx', +'To/Tc' => 'ToTc', +'To/Uc' => 'ToUc', +'To/Vo' => 'ToVo', +'To/WB' => 'ToWB', +); + +1; +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +A0 <noBreak> 0020 +A8 <compat> 0020 0308 +AA <super> 0061 +AF <compat> 0020 0304 +B2 <super> 0032 +B3 <super> 0033 +B4 <compat> 0020 0301 +B5 <compat> 03BC +B8 <compat> 0020 0327 +B9 <super> 0031 +BA <super> 006F +BC <fraction> 0031 2044 0034 +BD <fraction> 0031 2044 0032 +BE <fraction> 0033 2044 0034 +C0 0041 0300 +C1 0041 0301 +C2 0041 0302 +C3 0041 0303 +C4 0041 0308 +C5 0041 030A +C7 0043 0327 +C8 0045 0300 +C9 0045 0301 +CA 0045 0302 +CB 0045 0308 +CC 0049 0300 +CD 0049 0301 +CE 0049 0302 +CF 0049 0308 +D1 004E 0303 +D2 004F 0300 +D3 004F 0301 +D4 004F 0302 +D5 004F 0303 +D6 004F 0308 +D9 0055 0300 +DA 0055 0301 +DB 0055 0302 +DC 0055 0308 +DD 0059 0301 +E0 0061 0300 +E1 0061 0301 +E2 0061 0302 +E3 0061 0303 +E4 0061 0308 +E5 0061 030A +E7 0063 0327 +E8 0065 0300 +E9 0065 0301 +EA 0065 0302 +EB 0065 0308 +EC 0069 0300 +ED 0069 0301 +EE 0069 0302 +EF 0069 0308 +F1 006E 0303 +F2 006F 0300 +F3 006F 0301 +F4 006F 0302 +F5 006F 0303 +F6 006F 0308 +F9 0075 0300 +FA 0075 0301 +FB 0075 0302 +FC 0075 0308 +FD 0079 0301 +FF 0079 0308 +100 0041 0304 +101 0061 0304 +102 0041 0306 +103 0061 0306 +104 0041 0328 +105 0061 0328 +106 0043 0301 +107 0063 0301 +108 0043 0302 +109 0063 0302 +10A 0043 0307 +10B 0063 0307 +10C 0043 030C +10D 0063 030C +10E 0044 030C +10F 0064 030C +112 0045 0304 +113 0065 0304 +114 0045 0306 +115 0065 0306 +116 0045 0307 +117 0065 0307 +118 0045 0328 +119 0065 0328 +11A 0045 030C +11B 0065 030C +11C 0047 0302 +11D 0067 0302 +11E 0047 0306 +11F 0067 0306 +120 0047 0307 +121 0067 0307 +122 0047 0327 +123 0067 0327 +124 0048 0302 +125 0068 0302 +128 0049 0303 +129 0069 0303 +12A 0049 0304 +12B 0069 0304 +12C 0049 0306 +12D 0069 0306 +12E 0049 0328 +12F 0069 0328 +130 0049 0307 +132 <compat> 0049 004A +133 <compat> 0069 006A +134 004A 0302 +135 006A 0302 +136 004B 0327 +137 006B 0327 +139 004C 0301 +13A 006C 0301 +13B 004C 0327 +13C 006C 0327 +13D 004C 030C +13E 006C 030C +13F <compat> 004C 00B7 +140 <compat> 006C 00B7 +143 004E 0301 +144 006E 0301 +145 004E 0327 +146 006E 0327 +147 004E 030C +148 006E 030C +149 <compat> 02BC 006E +14C 004F 0304 +14D 006F 0304 +14E 004F 0306 +14F 006F 0306 +150 004F 030B +151 006F 030B +154 0052 0301 +155 0072 0301 +156 0052 0327 +157 0072 0327 +158 0052 030C +159 0072 030C +15A 0053 0301 +15B 0073 0301 +15C 0053 0302 +15D 0073 0302 +15E 0053 0327 +15F 0073 0327 +160 0053 030C +161 0073 030C +162 0054 0327 +163 0074 0327 +164 0054 030C +165 0074 030C +168 0055 0303 +169 0075 0303 +16A 0055 0304 +16B 0075 0304 +16C 0055 0306 +16D 0075 0306 +16E 0055 030A +16F 0075 030A +170 0055 030B +171 0075 030B +172 0055 0328 +173 0075 0328 +174 0057 0302 +175 0077 0302 +176 0059 0302 +177 0079 0302 +178 0059 0308 +179 005A 0301 +17A 007A 0301 +17B 005A 0307 +17C 007A 0307 +17D 005A 030C +17E 007A 030C +17F <compat> 0073 +1A0 004F 031B +1A1 006F 031B +1AF 0055 031B +1B0 0075 031B +1C4 <compat> 0044 017D +1C5 <compat> 0044 017E +1C6 <compat> 0064 017E +1C7 <compat> 004C 004A +1C8 <compat> 004C 006A +1C9 <compat> 006C 006A +1CA <compat> 004E 004A +1CB <compat> 004E 006A +1CC <compat> 006E 006A +1CD 0041 030C +1CE 0061 030C +1CF 0049 030C +1D0 0069 030C +1D1 004F 030C +1D2 006F 030C +1D3 0055 030C +1D4 0075 030C +1D5 00DC 0304 +1D6 00FC 0304 +1D7 00DC 0301 +1D8 00FC 0301 +1D9 00DC 030C +1DA 00FC 030C +1DB 00DC 0300 +1DC 00FC 0300 +1DE 00C4 0304 +1DF 00E4 0304 +1E0 0226 0304 +1E1 0227 0304 +1E2 00C6 0304 +1E3 00E6 0304 +1E6 0047 030C +1E7 0067 030C +1E8 004B 030C +1E9 006B 030C +1EA 004F 0328 +1EB 006F 0328 +1EC 01EA 0304 +1ED 01EB 0304 +1EE 01B7 030C +1EF 0292 030C +1F0 006A 030C +1F1 <compat> 0044 005A +1F2 <compat> 0044 007A +1F3 <compat> 0064 007A +1F4 0047 0301 +1F5 0067 0301 +1F8 004E 0300 +1F9 006E 0300 +1FA 00C5 0301 +1FB 00E5 0301 +1FC 00C6 0301 +1FD 00E6 0301 +1FE 00D8 0301 +1FF 00F8 0301 +200 0041 030F +201 0061 030F +202 0041 0311 +203 0061 0311 +204 0045 030F +205 0065 030F +206 0045 0311 +207 0065 0311 +208 0049 030F +209 0069 030F +20A 0049 0311 +20B 0069 0311 +20C 004F 030F +20D 006F 030F +20E 004F 0311 +20F 006F 0311 +210 0052 030F +211 0072 030F +212 0052 0311 +213 0072 0311 +214 0055 030F +215 0075 030F +216 0055 0311 +217 0075 0311 +218 0053 0326 +219 0073 0326 +21A 0054 0326 +21B 0074 0326 +21E 0048 030C +21F 0068 030C +226 0041 0307 +227 0061 0307 +228 0045 0327 +229 0065 0327 +22A 00D6 0304 +22B 00F6 0304 +22C 00D5 0304 +22D 00F5 0304 +22E 004F 0307 +22F 006F 0307 +230 022E 0304 +231 022F 0304 +232 0059 0304 +233 0079 0304 +2B0 <super> 0068 +2B1 <super> 0266 +2B2 <super> 006A +2B3 <super> 0072 +2B4 <super> 0279 +2B5 <super> 027B +2B6 <super> 0281 +2B7 <super> 0077 +2B8 <super> 0079 +2D8 <compat> 0020 0306 +2D9 <compat> 0020 0307 +2DA <compat> 0020 030A +2DB <compat> 0020 0328 +2DC <compat> 0020 0303 +2DD <compat> 0020 030B +2E0 <super> 0263 +2E1 <super> 006C +2E2 <super> 0073 +2E3 <super> 0078 +2E4 <super> 0295 +340 0300 +341 0301 +343 0313 +344 0308 0301 +374 02B9 +37A <compat> 0020 0345 +37E 003B +384 <compat> 0020 0301 +385 00A8 0301 +386 0391 0301 +387 00B7 +388 0395 0301 +389 0397 0301 +38A 0399 0301 +38C 039F 0301 +38E 03A5 0301 +38F 03A9 0301 +390 03CA 0301 +3AA 0399 0308 +3AB 03A5 0308 +3AC 03B1 0301 +3AD 03B5 0301 +3AE 03B7 0301 +3AF 03B9 0301 +3B0 03CB 0301 +3CA 03B9 0308 +3CB 03C5 0308 +3CC 03BF 0301 +3CD 03C5 0301 +3CE 03C9 0301 +3D0 <compat> 03B2 +3D1 <compat> 03B8 +3D2 <compat> 03A5 +3D3 03D2 0301 +3D4 03D2 0308 +3D5 <compat> 03C6 +3D6 <compat> 03C0 +3F0 <compat> 03BA +3F1 <compat> 03C1 +3F2 <compat> 03C2 +3F4 <compat> 0398 +3F5 <compat> 03B5 +3F9 <compat> 03A3 +400 0415 0300 +401 0415 0308 +403 0413 0301 +407 0406 0308 +40C 041A 0301 +40D 0418 0300 +40E 0423 0306 +419 0418 0306 +439 0438 0306 +450 0435 0300 +451 0435 0308 +453 0433 0301 +457 0456 0308 +45C 043A 0301 +45D 0438 0300 +45E 0443 0306 +476 0474 030F +477 0475 030F +4C1 0416 0306 +4C2 0436 0306 +4D0 0410 0306 +4D1 0430 0306 +4D2 0410 0308 +4D3 0430 0308 +4D6 0415 0306 +4D7 0435 0306 +4DA 04D8 0308 +4DB 04D9 0308 +4DC 0416 0308 +4DD 0436 0308 +4DE 0417 0308 +4DF 0437 0308 +4E2 0418 0304 +4E3 0438 0304 +4E4 0418 0308 +4E5 0438 0308 +4E6 041E 0308 +4E7 043E 0308 +4EA 04E8 0308 +4EB 04E9 0308 +4EC 042D 0308 +4ED 044D 0308 +4EE 0423 0304 +4EF 0443 0304 +4F0 0423 0308 +4F1 0443 0308 +4F2 0423 030B +4F3 0443 030B +4F4 0427 0308 +4F5 0447 0308 +4F8 042B 0308 +4F9 044B 0308 +587 <compat> 0565 0582 +622 0627 0653 +623 0627 0654 +624 0648 0654 +625 0627 0655 +626 064A 0654 +675 <compat> 0627 0674 +676 <compat> 0648 0674 +677 <compat> 06C7 0674 +678 <compat> 064A 0674 +6C0 06D5 0654 +6C2 06C1 0654 +6D3 06D2 0654 +929 0928 093C +931 0930 093C +934 0933 093C +958 0915 093C +959 0916 093C +95A 0917 093C +95B 091C 093C +95C 0921 093C +95D 0922 093C +95E 092B 093C +95F 092F 093C +9CB 09C7 09BE +9CC 09C7 09D7 +9DC 09A1 09BC +9DD 09A2 09BC +9DF 09AF 09BC +A33 0A32 0A3C +A36 0A38 0A3C +A59 0A16 0A3C +A5A 0A17 0A3C +A5B 0A1C 0A3C +A5E 0A2B 0A3C +B48 0B47 0B56 +B4B 0B47 0B3E +B4C 0B47 0B57 +B5C 0B21 0B3C +B5D 0B22 0B3C +B94 0B92 0BD7 +BCA 0BC6 0BBE +BCB 0BC7 0BBE +BCC 0BC6 0BD7 +C48 0C46 0C56 +CC0 0CBF 0CD5 +CC7 0CC6 0CD5 +CC8 0CC6 0CD6 +CCA 0CC6 0CC2 +CCB 0CCA 0CD5 +D4A 0D46 0D3E +D4B 0D47 0D3E +D4C 0D46 0D57 +DDA 0DD9 0DCA +DDC 0DD9 0DCF +DDD 0DDC 0DCA +DDE 0DD9 0DDF +E33 <compat> 0E4D 0E32 +EB3 <compat> 0ECD 0EB2 +EDC <compat> 0EAB 0E99 +EDD <compat> 0EAB 0EA1 +F0C <noBreak> 0F0B +F43 0F42 0FB7 +F4D 0F4C 0FB7 +F52 0F51 0FB7 +F57 0F56 0FB7 +F5C 0F5B 0FB7 +F69 0F40 0FB5 +F73 0F71 0F72 +F75 0F71 0F74 +F76 0FB2 0F80 +F77 <compat> 0FB2 0F81 +F78 0FB3 0F80 +F79 <compat> 0FB3 0F81 +F81 0F71 0F80 +F93 0F92 0FB7 +F9D 0F9C 0FB7 +FA2 0FA1 0FB7 +FA7 0FA6 0FB7 +FAC 0FAB 0FB7 +FB9 0F90 0FB5 +1026 1025 102E +10FC <super> 10DC +1B06 1B05 1B35 +1B08 1B07 1B35 +1B0A 1B09 1B35 +1B0C 1B0B 1B35 +1B0E 1B0D 1B35 +1B12 1B11 1B35 +1B3B 1B3A 1B35 +1B3D 1B3C 1B35 +1B40 1B3E 1B35 +1B41 1B3F 1B35 +1B43 1B42 1B35 +1D2C <super> 0041 +1D2D <super> 00C6 +1D2E <super> 0042 +1D30 <super> 0044 +1D31 <super> 0045 +1D32 <super> 018E +1D33 <super> 0047 +1D34 <super> 0048 +1D35 <super> 0049 +1D36 <super> 004A +1D37 <super> 004B +1D38 <super> 004C +1D39 <super> 004D +1D3A <super> 004E +1D3C <super> 004F +1D3D <super> 0222 +1D3E <super> 0050 +1D3F <super> 0052 +1D40 <super> 0054 +1D41 <super> 0055 +1D42 <super> 0057 +1D43 <super> 0061 +1D44 <super> 0250 +1D45 <super> 0251 +1D46 <super> 1D02 +1D47 <super> 0062 +1D48 <super> 0064 +1D49 <super> 0065 +1D4A <super> 0259 +1D4B <super> 025B +1D4C <super> 025C +1D4D <super> 0067 +1D4F <super> 006B +1D50 <super> 006D +1D51 <super> 014B +1D52 <super> 006F +1D53 <super> 0254 +1D54 <super> 1D16 +1D55 <super> 1D17 +1D56 <super> 0070 +1D57 <super> 0074 +1D58 <super> 0075 +1D59 <super> 1D1D +1D5A <super> 026F +1D5B <super> 0076 +1D5C <super> 1D25 +1D5D <super> 03B2 +1D5E <super> 03B3 +1D5F <super> 03B4 +1D60 <super> 03C6 +1D61 <super> 03C7 +1D62 <sub> 0069 +1D63 <sub> 0072 +1D64 <sub> 0075 +1D65 <sub> 0076 +1D66 <sub> 03B2 +1D67 <sub> 03B3 +1D68 <sub> 03C1 +1D69 <sub> 03C6 +1D6A <sub> 03C7 +1D78 <super> 043D +1D9B <super> 0252 +1D9C <super> 0063 +1D9D <super> 0255 +1D9E <super> 00F0 +1D9F <super> 025C +1DA0 <super> 0066 +1DA1 <super> 025F +1DA2 <super> 0261 +1DA3 <super> 0265 +1DA4 <super> 0268 +1DA5 <super> 0269 +1DA6 <super> 026A +1DA7 <super> 1D7B +1DA8 <super> 029D +1DA9 <super> 026D +1DAA <super> 1D85 +1DAB <super> 029F +1DAC <super> 0271 +1DAD <super> 0270 +1DAE <super> 0272 +1DAF <super> 0273 +1DB0 <super> 0274 +1DB1 <super> 0275 +1DB2 <super> 0278 +1DB3 <super> 0282 +1DB4 <super> 0283 +1DB5 <super> 01AB +1DB6 <super> 0289 +1DB7 <super> 028A +1DB8 <super> 1D1C +1DB9 <super> 028B +1DBA <super> 028C +1DBB <super> 007A +1DBC <super> 0290 +1DBD <super> 0291 +1DBE <super> 0292 +1DBF <super> 03B8 +1E00 0041 0325 +1E01 0061 0325 +1E02 0042 0307 +1E03 0062 0307 +1E04 0042 0323 +1E05 0062 0323 +1E06 0042 0331 +1E07 0062 0331 +1E08 00C7 0301 +1E09 00E7 0301 +1E0A 0044 0307 +1E0B 0064 0307 +1E0C 0044 0323 +1E0D 0064 0323 +1E0E 0044 0331 +1E0F 0064 0331 +1E10 0044 0327 +1E11 0064 0327 +1E12 0044 032D +1E13 0064 032D +1E14 0112 0300 +1E15 0113 0300 +1E16 0112 0301 +1E17 0113 0301 +1E18 0045 032D +1E19 0065 032D +1E1A 0045 0330 +1E1B 0065 0330 +1E1C 0228 0306 +1E1D 0229 0306 +1E1E 0046 0307 +1E1F 0066 0307 +1E20 0047 0304 +1E21 0067 0304 +1E22 0048 0307 +1E23 0068 0307 +1E24 0048 0323 +1E25 0068 0323 +1E26 0048 0308 +1E27 0068 0308 +1E28 0048 0327 +1E29 0068 0327 +1E2A 0048 032E +1E2B 0068 032E +1E2C 0049 0330 +1E2D 0069 0330 +1E2E 00CF 0301 +1E2F 00EF 0301 +1E30 004B 0301 +1E31 006B 0301 +1E32 004B 0323 +1E33 006B 0323 +1E34 004B 0331 +1E35 006B 0331 +1E36 004C 0323 +1E37 006C 0323 +1E38 1E36 0304 +1E39 1E37 0304 +1E3A 004C 0331 +1E3B 006C 0331 +1E3C 004C 032D +1E3D 006C 032D +1E3E 004D 0301 +1E3F 006D 0301 +1E40 004D 0307 +1E41 006D 0307 +1E42 004D 0323 +1E43 006D 0323 +1E44 004E 0307 +1E45 006E 0307 +1E46 004E 0323 +1E47 006E 0323 +1E48 004E 0331 +1E49 006E 0331 +1E4A 004E 032D +1E4B 006E 032D +1E4C 00D5 0301 +1E4D 00F5 0301 +1E4E 00D5 0308 +1E4F 00F5 0308 +1E50 014C 0300 +1E51 014D 0300 +1E52 014C 0301 +1E53 014D 0301 +1E54 0050 0301 +1E55 0070 0301 +1E56 0050 0307 +1E57 0070 0307 +1E58 0052 0307 +1E59 0072 0307 +1E5A 0052 0323 +1E5B 0072 0323 +1E5C 1E5A 0304 +1E5D 1E5B 0304 +1E5E 0052 0331 +1E5F 0072 0331 +1E60 0053 0307 +1E61 0073 0307 +1E62 0053 0323 +1E63 0073 0323 +1E64 015A 0307 +1E65 015B 0307 +1E66 0160 0307 +1E67 0161 0307 +1E68 1E62 0307 +1E69 1E63 0307 +1E6A 0054 0307 +1E6B 0074 0307 +1E6C 0054 0323 +1E6D 0074 0323 +1E6E 0054 0331 +1E6F 0074 0331 +1E70 0054 032D +1E71 0074 032D +1E72 0055 0324 +1E73 0075 0324 +1E74 0055 0330 +1E75 0075 0330 +1E76 0055 032D +1E77 0075 032D +1E78 0168 0301 +1E79 0169 0301 +1E7A 016A 0308 +1E7B 016B 0308 +1E7C 0056 0303 +1E7D 0076 0303 +1E7E 0056 0323 +1E7F 0076 0323 +1E80 0057 0300 +1E81 0077 0300 +1E82 0057 0301 +1E83 0077 0301 +1E84 0057 0308 +1E85 0077 0308 +1E86 0057 0307 +1E87 0077 0307 +1E88 0057 0323 +1E89 0077 0323 +1E8A 0058 0307 +1E8B 0078 0307 +1E8C 0058 0308 +1E8D 0078 0308 +1E8E 0059 0307 +1E8F 0079 0307 +1E90 005A 0302 +1E91 007A 0302 +1E92 005A 0323 +1E93 007A 0323 +1E94 005A 0331 +1E95 007A 0331 +1E96 0068 0331 +1E97 0074 0308 +1E98 0077 030A +1E99 0079 030A +1E9A <compat> 0061 02BE +1E9B 017F 0307 +1EA0 0041 0323 +1EA1 0061 0323 +1EA2 0041 0309 +1EA3 0061 0309 +1EA4 00C2 0301 +1EA5 00E2 0301 +1EA6 00C2 0300 +1EA7 00E2 0300 +1EA8 00C2 0309 +1EA9 00E2 0309 +1EAA 00C2 0303 +1EAB 00E2 0303 +1EAC 1EA0 0302 +1EAD 1EA1 0302 +1EAE 0102 0301 +1EAF 0103 0301 +1EB0 0102 0300 +1EB1 0103 0300 +1EB2 0102 0309 +1EB3 0103 0309 +1EB4 0102 0303 +1EB5 0103 0303 +1EB6 1EA0 0306 +1EB7 1EA1 0306 +1EB8 0045 0323 +1EB9 0065 0323 +1EBA 0045 0309 +1EBB 0065 0309 +1EBC 0045 0303 +1EBD 0065 0303 +1EBE 00CA 0301 +1EBF 00EA 0301 +1EC0 00CA 0300 +1EC1 00EA 0300 +1EC2 00CA 0309 +1EC3 00EA 0309 +1EC4 00CA 0303 +1EC5 00EA 0303 +1EC6 1EB8 0302 +1EC7 1EB9 0302 +1EC8 0049 0309 +1EC9 0069 0309 +1ECA 0049 0323 +1ECB 0069 0323 +1ECC 004F 0323 +1ECD 006F 0323 +1ECE 004F 0309 +1ECF 006F 0309 +1ED0 00D4 0301 +1ED1 00F4 0301 +1ED2 00D4 0300 +1ED3 00F4 0300 +1ED4 00D4 0309 +1ED5 00F4 0309 +1ED6 00D4 0303 +1ED7 00F4 0303 +1ED8 1ECC 0302 +1ED9 1ECD 0302 +1EDA 01A0 0301 +1EDB 01A1 0301 +1EDC 01A0 0300 +1EDD 01A1 0300 +1EDE 01A0 0309 +1EDF 01A1 0309 +1EE0 01A0 0303 +1EE1 01A1 0303 +1EE2 01A0 0323 +1EE3 01A1 0323 +1EE4 0055 0323 +1EE5 0075 0323 +1EE6 0055 0309 +1EE7 0075 0309 +1EE8 01AF 0301 +1EE9 01B0 0301 +1EEA 01AF 0300 +1EEB 01B0 0300 +1EEC 01AF 0309 +1EED 01B0 0309 +1EEE 01AF 0303 +1EEF 01B0 0303 +1EF0 01AF 0323 +1EF1 01B0 0323 +1EF2 0059 0300 +1EF3 0079 0300 +1EF4 0059 0323 +1EF5 0079 0323 +1EF6 0059 0309 +1EF7 0079 0309 +1EF8 0059 0303 +1EF9 0079 0303 +1F00 03B1 0313 +1F01 03B1 0314 +1F02 1F00 0300 +1F03 1F01 0300 +1F04 1F00 0301 +1F05 1F01 0301 +1F06 1F00 0342 +1F07 1F01 0342 +1F08 0391 0313 +1F09 0391 0314 +1F0A 1F08 0300 +1F0B 1F09 0300 +1F0C 1F08 0301 +1F0D 1F09 0301 +1F0E 1F08 0342 +1F0F 1F09 0342 +1F10 03B5 0313 +1F11 03B5 0314 +1F12 1F10 0300 +1F13 1F11 0300 +1F14 1F10 0301 +1F15 1F11 0301 +1F18 0395 0313 +1F19 0395 0314 +1F1A 1F18 0300 +1F1B 1F19 0300 +1F1C 1F18 0301 +1F1D 1F19 0301 +1F20 03B7 0313 +1F21 03B7 0314 +1F22 1F20 0300 +1F23 1F21 0300 +1F24 1F20 0301 +1F25 1F21 0301 +1F26 1F20 0342 +1F27 1F21 0342 +1F28 0397 0313 +1F29 0397 0314 +1F2A 1F28 0300 +1F2B 1F29 0300 +1F2C 1F28 0301 +1F2D 1F29 0301 +1F2E 1F28 0342 +1F2F 1F29 0342 +1F30 03B9 0313 +1F31 03B9 0314 +1F32 1F30 0300 +1F33 1F31 0300 +1F34 1F30 0301 +1F35 1F31 0301 +1F36 1F30 0342 +1F37 1F31 0342 +1F38 0399 0313 +1F39 0399 0314 +1F3A 1F38 0300 +1F3B 1F39 0300 +1F3C 1F38 0301 +1F3D 1F39 0301 +1F3E 1F38 0342 +1F3F 1F39 0342 +1F40 03BF 0313 +1F41 03BF 0314 +1F42 1F40 0300 +1F43 1F41 0300 +1F44 1F40 0301 +1F45 1F41 0301 +1F48 039F 0313 +1F49 039F 0314 +1F4A 1F48 0300 +1F4B 1F49 0300 +1F4C 1F48 0301 +1F4D 1F49 0301 +1F50 03C5 0313 +1F51 03C5 0314 +1F52 1F50 0300 +1F53 1F51 0300 +1F54 1F50 0301 +1F55 1F51 0301 +1F56 1F50 0342 +1F57 1F51 0342 +1F59 03A5 0314 +1F5B 1F59 0300 +1F5D 1F59 0301 +1F5F 1F59 0342 +1F60 03C9 0313 +1F61 03C9 0314 +1F62 1F60 0300 +1F63 1F61 0300 +1F64 1F60 0301 +1F65 1F61 0301 +1F66 1F60 0342 +1F67 1F61 0342 +1F68 03A9 0313 +1F69 03A9 0314 +1F6A 1F68 0300 +1F6B 1F69 0300 +1F6C 1F68 0301 +1F6D 1F69 0301 +1F6E 1F68 0342 +1F6F 1F69 0342 +1F70 03B1 0300 +1F71 03AC +1F72 03B5 0300 +1F73 03AD +1F74 03B7 0300 +1F75 03AE +1F76 03B9 0300 +1F77 03AF +1F78 03BF 0300 +1F79 03CC +1F7A 03C5 0300 +1F7B 03CD +1F7C 03C9 0300 +1F7D 03CE +1F80 1F00 0345 +1F81 1F01 0345 +1F82 1F02 0345 +1F83 1F03 0345 +1F84 1F04 0345 +1F85 1F05 0345 +1F86 1F06 0345 +1F87 1F07 0345 +1F88 1F08 0345 +1F89 1F09 0345 +1F8A 1F0A 0345 +1F8B 1F0B 0345 +1F8C 1F0C 0345 +1F8D 1F0D 0345 +1F8E 1F0E 0345 +1F8F 1F0F 0345 +1F90 1F20 0345 +1F91 1F21 0345 +1F92 1F22 0345 +1F93 1F23 0345 +1F94 1F24 0345 +1F95 1F25 0345 +1F96 1F26 0345 +1F97 1F27 0345 +1F98 1F28 0345 +1F99 1F29 0345 +1F9A 1F2A 0345 +1F9B 1F2B 0345 +1F9C 1F2C 0345 +1F9D 1F2D 0345 +1F9E 1F2E 0345 +1F9F 1F2F 0345 +1FA0 1F60 0345 +1FA1 1F61 0345 +1FA2 1F62 0345 +1FA3 1F63 0345 +1FA4 1F64 0345 +1FA5 1F65 0345 +1FA6 1F66 0345 +1FA7 1F67 0345 +1FA8 1F68 0345 +1FA9 1F69 0345 +1FAA 1F6A 0345 +1FAB 1F6B 0345 +1FAC 1F6C 0345 +1FAD 1F6D 0345 +1FAE 1F6E 0345 +1FAF 1F6F 0345 +1FB0 03B1 0306 +1FB1 03B1 0304 +1FB2 1F70 0345 +1FB3 03B1 0345 +1FB4 03AC 0345 +1FB6 03B1 0342 +1FB7 1FB6 0345 +1FB8 0391 0306 +1FB9 0391 0304 +1FBA 0391 0300 +1FBB 0386 +1FBC 0391 0345 +1FBD <compat> 0020 0313 +1FBE 03B9 +1FBF <compat> 0020 0313 +1FC0 <compat> 0020 0342 +1FC1 00A8 0342 +1FC2 1F74 0345 +1FC3 03B7 0345 +1FC4 03AE 0345 +1FC6 03B7 0342 +1FC7 1FC6 0345 +1FC8 0395 0300 +1FC9 0388 +1FCA 0397 0300 +1FCB 0389 +1FCC 0397 0345 +1FCD 1FBF 0300 +1FCE 1FBF 0301 +1FCF 1FBF 0342 +1FD0 03B9 0306 +1FD1 03B9 0304 +1FD2 03CA 0300 +1FD3 0390 +1FD6 03B9 0342 +1FD7 03CA 0342 +1FD8 0399 0306 +1FD9 0399 0304 +1FDA 0399 0300 +1FDB 038A +1FDD 1FFE 0300 +1FDE 1FFE 0301 +1FDF 1FFE 0342 +1FE0 03C5 0306 +1FE1 03C5 0304 +1FE2 03CB 0300 +1FE3 03B0 +1FE4 03C1 0313 +1FE5 03C1 0314 +1FE6 03C5 0342 +1FE7 03CB 0342 +1FE8 03A5 0306 +1FE9 03A5 0304 +1FEA 03A5 0300 +1FEB 038E +1FEC 03A1 0314 +1FED 00A8 0300 +1FEE 0385 +1FEF 0060 +1FF2 1F7C 0345 +1FF3 03C9 0345 +1FF4 03CE 0345 +1FF6 03C9 0342 +1FF7 1FF6 0345 +1FF8 039F 0300 +1FF9 038C +1FFA 03A9 0300 +1FFB 038F +1FFC 03A9 0345 +1FFD 00B4 +1FFE <compat> 0020 0314 +2000 2002 +2001 2003 +2002 2006 <compat> 0020 +2007 <noBreak> 0020 +2008 200A <compat> 0020 +2011 <noBreak> 2010 +2017 <compat> 0020 0333 +2024 <compat> 002E +2025 <compat> 002E 002E +2026 <compat> 002E 002E 002E +202F <noBreak> 0020 +2033 <compat> 2032 2032 +2034 <compat> 2032 2032 2032 +2036 <compat> 2035 2035 +2037 <compat> 2035 2035 2035 +203C <compat> 0021 0021 +203E <compat> 0020 0305 +2047 <compat> 003F 003F +2048 <compat> 003F 0021 +2049 <compat> 0021 003F +2057 <compat> 2032 2032 2032 2032 +205F <compat> 0020 +2070 <super> 0030 +2071 <super> 0069 +2074 <super> 0034 +2075 <super> 0035 +2076 <super> 0036 +2077 <super> 0037 +2078 <super> 0038 +2079 <super> 0039 +207A <super> 002B +207B <super> 2212 +207C <super> 003D +207D <super> 0028 +207E <super> 0029 +207F <super> 006E +2080 <sub> 0030 +2081 <sub> 0031 +2082 <sub> 0032 +2083 <sub> 0033 +2084 <sub> 0034 +2085 <sub> 0035 +2086 <sub> 0036 +2087 <sub> 0037 +2088 <sub> 0038 +2089 <sub> 0039 +208A <sub> 002B +208B <sub> 2212 +208C <sub> 003D +208D <sub> 0028 +208E <sub> 0029 +2090 <sub> 0061 +2091 <sub> 0065 +2092 <sub> 006F +2093 <sub> 0078 +2094 <sub> 0259 +2095 <sub> 0068 +2096 <sub> 006B +2097 <sub> 006C +2098 <sub> 006D +2099 <sub> 006E +209A <sub> 0070 +209B <sub> 0073 +209C <sub> 0074 +20A8 <compat> 0052 0073 +2100 <compat> 0061 002F 0063 +2101 <compat> 0061 002F 0073 +2102 <font> 0043 +2103 <compat> 00B0 0043 +2105 <compat> 0063 002F 006F +2106 <compat> 0063 002F 0075 +2107 <compat> 0190 +2109 <compat> 00B0 0046 +210A <font> 0067 +210B 210D <font> 0048 +210E <font> 0068 +210F <font> 0127 +2110 2111 <font> 0049 +2112 <font> 004C +2113 <font> 006C +2115 <font> 004E +2116 <compat> 004E 006F +2119 <font> 0050 +211A <font> 0051 +211B 211D <font> 0052 +2120 <super> 0053 004D +2121 <compat> 0054 0045 004C +2122 <super> 0054 004D +2124 <font> 005A +2126 03A9 +2128 <font> 005A +212A 004B +212B 00C5 +212C <font> 0042 +212D <font> 0043 +212F <font> 0065 +2130 <font> 0045 +2131 <font> 0046 +2133 <font> 004D +2134 <font> 006F +2135 <compat> 05D0 +2136 <compat> 05D1 +2137 <compat> 05D2 +2138 <compat> 05D3 +2139 <font> 0069 +213B <compat> 0046 0041 0058 +213C <font> 03C0 +213D <font> 03B3 +213E <font> 0393 +213F <font> 03A0 +2140 <font> 2211 +2145 <font> 0044 +2146 <font> 0064 +2147 <font> 0065 +2148 <font> 0069 +2149 <font> 006A +2150 <fraction> 0031 2044 0037 +2151 <fraction> 0031 2044 0039 +2152 <fraction> 0031 2044 0031 0030 +2153 <fraction> 0031 2044 0033 +2154 <fraction> 0032 2044 0033 +2155 <fraction> 0031 2044 0035 +2156 <fraction> 0032 2044 0035 +2157 <fraction> 0033 2044 0035 +2158 <fraction> 0034 2044 0035 +2159 <fraction> 0031 2044 0036 +215A <fraction> 0035 2044 0036 +215B <fraction> 0031 2044 0038 +215C <fraction> 0033 2044 0038 +215D <fraction> 0035 2044 0038 +215E <fraction> 0037 2044 0038 +215F <fraction> 0031 2044 +2160 <compat> 0049 +2161 <compat> 0049 0049 +2162 <compat> 0049 0049 0049 +2163 <compat> 0049 0056 +2164 <compat> 0056 +2165 <compat> 0056 0049 +2166 <compat> 0056 0049 0049 +2167 <compat> 0056 0049 0049 0049 +2168 <compat> 0049 0058 +2169 <compat> 0058 +216A <compat> 0058 0049 +216B <compat> 0058 0049 0049 +216C <compat> 004C +216D <compat> 0043 +216E <compat> 0044 +216F <compat> 004D +2170 <compat> 0069 +2171 <compat> 0069 0069 +2172 <compat> 0069 0069 0069 +2173 <compat> 0069 0076 +2174 <compat> 0076 +2175 <compat> 0076 0069 +2176 <compat> 0076 0069 0069 +2177 <compat> 0076 0069 0069 0069 +2178 <compat> 0069 0078 +2179 <compat> 0078 +217A <compat> 0078 0069 +217B <compat> 0078 0069 0069 +217C <compat> 006C +217D <compat> 0063 +217E <compat> 0064 +217F <compat> 006D +2189 <fraction> 0030 2044 0033 +219A 2190 0338 +219B 2192 0338 +21AE 2194 0338 +21CD 21D0 0338 +21CE 21D4 0338 +21CF 21D2 0338 +2204 2203 0338 +2209 2208 0338 +220C 220B 0338 +2224 2223 0338 +2226 2225 0338 +222C <compat> 222B 222B +222D <compat> 222B 222B 222B +222F <compat> 222E 222E +2230 <compat> 222E 222E 222E +2241 223C 0338 +2244 2243 0338 +2247 2245 0338 +2249 2248 0338 +2260 003D 0338 +2262 2261 0338 +226D 224D 0338 +226E 003C 0338 +226F 003E 0338 +2270 2264 0338 +2271 2265 0338 +2274 2272 0338 +2275 2273 0338 +2278 2276 0338 +2279 2277 0338 +2280 227A 0338 +2281 227B 0338 +2284 2282 0338 +2285 2283 0338 +2288 2286 0338 +2289 2287 0338 +22AC 22A2 0338 +22AD 22A8 0338 +22AE 22A9 0338 +22AF 22AB 0338 +22E0 227C 0338 +22E1 227D 0338 +22E2 2291 0338 +22E3 2292 0338 +22EA 22B2 0338 +22EB 22B3 0338 +22EC 22B4 0338 +22ED 22B5 0338 +2329 3008 +232A 3009 +2460 <circle> 0031 +2461 <circle> 0032 +2462 <circle> 0033 +2463 <circle> 0034 +2464 <circle> 0035 +2465 <circle> 0036 +2466 <circle> 0037 +2467 <circle> 0038 +2468 <circle> 0039 +2469 <circle> 0031 0030 +246A <circle> 0031 0031 +246B <circle> 0031 0032 +246C <circle> 0031 0033 +246D <circle> 0031 0034 +246E <circle> 0031 0035 +246F <circle> 0031 0036 +2470 <circle> 0031 0037 +2471 <circle> 0031 0038 +2472 <circle> 0031 0039 +2473 <circle> 0032 0030 +2474 <compat> 0028 0031 0029 +2475 <compat> 0028 0032 0029 +2476 <compat> 0028 0033 0029 +2477 <compat> 0028 0034 0029 +2478 <compat> 0028 0035 0029 +2479 <compat> 0028 0036 0029 +247A <compat> 0028 0037 0029 +247B <compat> 0028 0038 0029 +247C <compat> 0028 0039 0029 +247D <compat> 0028 0031 0030 0029 +247E <compat> 0028 0031 0031 0029 +247F <compat> 0028 0031 0032 0029 +2480 <compat> 0028 0031 0033 0029 +2481 <compat> 0028 0031 0034 0029 +2482 <compat> 0028 0031 0035 0029 +2483 <compat> 0028 0031 0036 0029 +2484 <compat> 0028 0031 0037 0029 +2485 <compat> 0028 0031 0038 0029 +2486 <compat> 0028 0031 0039 0029 +2487 <compat> 0028 0032 0030 0029 +2488 <compat> 0031 002E +2489 <compat> 0032 002E +248A <compat> 0033 002E +248B <compat> 0034 002E +248C <compat> 0035 002E +248D <compat> 0036 002E +248E <compat> 0037 002E +248F <compat> 0038 002E +2490 <compat> 0039 002E +2491 <compat> 0031 0030 002E +2492 <compat> 0031 0031 002E +2493 <compat> 0031 0032 002E +2494 <compat> 0031 0033 002E +2495 <compat> 0031 0034 002E +2496 <compat> 0031 0035 002E +2497 <compat> 0031 0036 002E +2498 <compat> 0031 0037 002E +2499 <compat> 0031 0038 002E +249A <compat> 0031 0039 002E +249B <compat> 0032 0030 002E +249C <compat> 0028 0061 0029 +249D <compat> 0028 0062 0029 +249E <compat> 0028 0063 0029 +249F <compat> 0028 0064 0029 +24A0 <compat> 0028 0065 0029 +24A1 <compat> 0028 0066 0029 +24A2 <compat> 0028 0067 0029 +24A3 <compat> 0028 0068 0029 +24A4 <compat> 0028 0069 0029 +24A5 <compat> 0028 006A 0029 +24A6 <compat> 0028 006B 0029 +24A7 <compat> 0028 006C 0029 +24A8 <compat> 0028 006D 0029 +24A9 <compat> 0028 006E 0029 +24AA <compat> 0028 006F 0029 +24AB <compat> 0028 0070 0029 +24AC <compat> 0028 0071 0029 +24AD <compat> 0028 0072 0029 +24AE <compat> 0028 0073 0029 +24AF <compat> 0028 0074 0029 +24B0 <compat> 0028 0075 0029 +24B1 <compat> 0028 0076 0029 +24B2 <compat> 0028 0077 0029 +24B3 <compat> 0028 0078 0029 +24B4 <compat> 0028 0079 0029 +24B5 <compat> 0028 007A 0029 +24B6 <circle> 0041 +24B7 <circle> 0042 +24B8 <circle> 0043 +24B9 <circle> 0044 +24BA <circle> 0045 +24BB <circle> 0046 +24BC <circle> 0047 +24BD <circle> 0048 +24BE <circle> 0049 +24BF <circle> 004A +24C0 <circle> 004B +24C1 <circle> 004C +24C2 <circle> 004D +24C3 <circle> 004E +24C4 <circle> 004F +24C5 <circle> 0050 +24C6 <circle> 0051 +24C7 <circle> 0052 +24C8 <circle> 0053 +24C9 <circle> 0054 +24CA <circle> 0055 +24CB <circle> 0056 +24CC <circle> 0057 +24CD <circle> 0058 +24CE <circle> 0059 +24CF <circle> 005A +24D0 <circle> 0061 +24D1 <circle> 0062 +24D2 <circle> 0063 +24D3 <circle> 0064 +24D4 <circle> 0065 +24D5 <circle> 0066 +24D6 <circle> 0067 +24D7 <circle> 0068 +24D8 <circle> 0069 +24D9 <circle> 006A +24DA <circle> 006B +24DB <circle> 006C +24DC <circle> 006D +24DD <circle> 006E +24DE <circle> 006F +24DF <circle> 0070 +24E0 <circle> 0071 +24E1 <circle> 0072 +24E2 <circle> 0073 +24E3 <circle> 0074 +24E4 <circle> 0075 +24E5 <circle> 0076 +24E6 <circle> 0077 +24E7 <circle> 0078 +24E8 <circle> 0079 +24E9 <circle> 007A +24EA <circle> 0030 +2A0C <compat> 222B 222B 222B 222B +2A74 <compat> 003A 003A 003D +2A75 <compat> 003D 003D +2A76 <compat> 003D 003D 003D +2ADC 2ADD 0338 +2C7C <sub> 006A +2C7D <super> 0056 +2D6F <super> 2D61 +2E9F <compat> 6BCD +2EF3 <compat> 9F9F +2F00 <compat> 4E00 +2F01 <compat> 4E28 +2F02 <compat> 4E36 +2F03 <compat> 4E3F +2F04 <compat> 4E59 +2F05 <compat> 4E85 +2F06 <compat> 4E8C +2F07 <compat> 4EA0 +2F08 <compat> 4EBA +2F09 <compat> 513F +2F0A <compat> 5165 +2F0B <compat> 516B +2F0C <compat> 5182 +2F0D <compat> 5196 +2F0E <compat> 51AB +2F0F <compat> 51E0 +2F10 <compat> 51F5 +2F11 <compat> 5200 +2F12 <compat> 529B +2F13 <compat> 52F9 +2F14 <compat> 5315 +2F15 <compat> 531A +2F16 <compat> 5338 +2F17 <compat> 5341 +2F18 <compat> 535C +2F19 <compat> 5369 +2F1A <compat> 5382 +2F1B <compat> 53B6 +2F1C <compat> 53C8 +2F1D <compat> 53E3 +2F1E <compat> 56D7 +2F1F <compat> 571F +2F20 <compat> 58EB +2F21 <compat> 5902 +2F22 <compat> 590A +2F23 <compat> 5915 +2F24 <compat> 5927 +2F25 <compat> 5973 +2F26 <compat> 5B50 +2F27 <compat> 5B80 +2F28 <compat> 5BF8 +2F29 <compat> 5C0F +2F2A <compat> 5C22 +2F2B <compat> 5C38 +2F2C <compat> 5C6E +2F2D <compat> 5C71 +2F2E <compat> 5DDB +2F2F <compat> 5DE5 +2F30 <compat> 5DF1 +2F31 <compat> 5DFE +2F32 <compat> 5E72 +2F33 <compat> 5E7A +2F34 <compat> 5E7F +2F35 <compat> 5EF4 +2F36 <compat> 5EFE +2F37 <compat> 5F0B +2F38 <compat> 5F13 +2F39 <compat> 5F50 +2F3A <compat> 5F61 +2F3B <compat> 5F73 +2F3C <compat> 5FC3 +2F3D <compat> 6208 +2F3E <compat> 6236 +2F3F <compat> 624B +2F40 <compat> 652F +2F41 <compat> 6534 +2F42 <compat> 6587 +2F43 <compat> 6597 +2F44 <compat> 65A4 +2F45 <compat> 65B9 +2F46 <compat> 65E0 +2F47 <compat> 65E5 +2F48 <compat> 66F0 +2F49 <compat> 6708 +2F4A <compat> 6728 +2F4B <compat> 6B20 +2F4C <compat> 6B62 +2F4D <compat> 6B79 +2F4E <compat> 6BB3 +2F4F <compat> 6BCB +2F50 <compat> 6BD4 +2F51 <compat> 6BDB +2F52 <compat> 6C0F +2F53 <compat> 6C14 +2F54 <compat> 6C34 +2F55 <compat> 706B +2F56 <compat> 722A +2F57 <compat> 7236 +2F58 <compat> 723B +2F59 <compat> 723F +2F5A <compat> 7247 +2F5B <compat> 7259 +2F5C <compat> 725B +2F5D <compat> 72AC +2F5E <compat> 7384 +2F5F <compat> 7389 +2F60 <compat> 74DC +2F61 <compat> 74E6 +2F62 <compat> 7518 +2F63 <compat> 751F +2F64 <compat> 7528 +2F65 <compat> 7530 +2F66 <compat> 758B +2F67 <compat> 7592 +2F68 <compat> 7676 +2F69 <compat> 767D +2F6A <compat> 76AE +2F6B <compat> 76BF +2F6C <compat> 76EE +2F6D <compat> 77DB +2F6E <compat> 77E2 +2F6F <compat> 77F3 +2F70 <compat> 793A +2F71 <compat> 79B8 +2F72 <compat> 79BE +2F73 <compat> 7A74 +2F74 <compat> 7ACB +2F75 <compat> 7AF9 +2F76 <compat> 7C73 +2F77 <compat> 7CF8 +2F78 <compat> 7F36 +2F79 <compat> 7F51 +2F7A <compat> 7F8A +2F7B <compat> 7FBD +2F7C <compat> 8001 +2F7D <compat> 800C +2F7E <compat> 8012 +2F7F <compat> 8033 +2F80 <compat> 807F +2F81 <compat> 8089 +2F82 <compat> 81E3 +2F83 <compat> 81EA +2F84 <compat> 81F3 +2F85 <compat> 81FC +2F86 <compat> 820C +2F87 <compat> 821B +2F88 <compat> 821F +2F89 <compat> 826E +2F8A <compat> 8272 +2F8B <compat> 8278 +2F8C <compat> 864D +2F8D <compat> 866B +2F8E <compat> 8840 +2F8F <compat> 884C +2F90 <compat> 8863 +2F91 <compat> 897E +2F92 <compat> 898B +2F93 <compat> 89D2 +2F94 <compat> 8A00 +2F95 <compat> 8C37 +2F96 <compat> 8C46 +2F97 <compat> 8C55 +2F98 <compat> 8C78 +2F99 <compat> 8C9D +2F9A <compat> 8D64 +2F9B <compat> 8D70 +2F9C <compat> 8DB3 +2F9D <compat> 8EAB +2F9E <compat> 8ECA +2F9F <compat> 8F9B +2FA0 <compat> 8FB0 +2FA1 <compat> 8FB5 +2FA2 <compat> 9091 +2FA3 <compat> 9149 +2FA4 <compat> 91C6 +2FA5 <compat> 91CC +2FA6 <compat> 91D1 +2FA7 <compat> 9577 +2FA8 <compat> 9580 +2FA9 <compat> 961C +2FAA <compat> 96B6 +2FAB <compat> 96B9 +2FAC <compat> 96E8 +2FAD <compat> 9751 +2FAE <compat> 975E +2FAF <compat> 9762 +2FB0 <compat> 9769 +2FB1 <compat> 97CB +2FB2 <compat> 97ED +2FB3 <compat> 97F3 +2FB4 <compat> 9801 +2FB5 <compat> 98A8 +2FB6 <compat> 98DB +2FB7 <compat> 98DF +2FB8 <compat> 9996 +2FB9 <compat> 9999 +2FBA <compat> 99AC +2FBB <compat> 9AA8 +2FBC <compat> 9AD8 +2FBD <compat> 9ADF +2FBE <compat> 9B25 +2FBF <compat> 9B2F +2FC0 <compat> 9B32 +2FC1 <compat> 9B3C +2FC2 <compat> 9B5A +2FC3 <compat> 9CE5 +2FC4 <compat> 9E75 +2FC5 <compat> 9E7F +2FC6 <compat> 9EA5 +2FC7 <compat> 9EBB +2FC8 <compat> 9EC3 +2FC9 <compat> 9ECD +2FCA <compat> 9ED1 +2FCB <compat> 9EF9 +2FCC <compat> 9EFD +2FCD <compat> 9F0E +2FCE <compat> 9F13 +2FCF <compat> 9F20 +2FD0 <compat> 9F3B +2FD1 <compat> 9F4A +2FD2 <compat> 9F52 +2FD3 <compat> 9F8D +2FD4 <compat> 9F9C +2FD5 <compat> 9FA0 +3000 <wide> 0020 +3036 <compat> 3012 +3038 <compat> 5341 +3039 <compat> 5344 +303A <compat> 5345 +304C 304B 3099 +304E 304D 3099 +3050 304F 3099 +3052 3051 3099 +3054 3053 3099 +3056 3055 3099 +3058 3057 3099 +305A 3059 3099 +305C 305B 3099 +305E 305D 3099 +3060 305F 3099 +3062 3061 3099 +3065 3064 3099 +3067 3066 3099 +3069 3068 3099 +3070 306F 3099 +3071 306F 309A +3073 3072 3099 +3074 3072 309A +3076 3075 3099 +3077 3075 309A +3079 3078 3099 +307A 3078 309A +307C 307B 3099 +307D 307B 309A +3094 3046 3099 +309B <compat> 0020 3099 +309C <compat> 0020 309A +309E 309D 3099 +309F <vertical> 3088 308A +30AC 30AB 3099 +30AE 30AD 3099 +30B0 30AF 3099 +30B2 30B1 3099 +30B4 30B3 3099 +30B6 30B5 3099 +30B8 30B7 3099 +30BA 30B9 3099 +30BC 30BB 3099 +30BE 30BD 3099 +30C0 30BF 3099 +30C2 30C1 3099 +30C5 30C4 3099 +30C7 30C6 3099 +30C9 30C8 3099 +30D0 30CF 3099 +30D1 30CF 309A +30D3 30D2 3099 +30D4 30D2 309A +30D6 30D5 3099 +30D7 30D5 309A +30D9 30D8 3099 +30DA 30D8 309A +30DC 30DB 3099 +30DD 30DB 309A +30F4 30A6 3099 +30F7 30EF 3099 +30F8 30F0 3099 +30F9 30F1 3099 +30FA 30F2 3099 +30FE 30FD 3099 +30FF <vertical> 30B3 30C8 +3131 <compat> 1100 +3132 <compat> 1101 +3133 <compat> 11AA +3134 <compat> 1102 +3135 <compat> 11AC +3136 <compat> 11AD +3137 <compat> 1103 +3138 <compat> 1104 +3139 <compat> 1105 +313A <compat> 11B0 +313B <compat> 11B1 +313C <compat> 11B2 +313D <compat> 11B3 +313E <compat> 11B4 +313F <compat> 11B5 +3140 <compat> 111A +3141 <compat> 1106 +3142 <compat> 1107 +3143 <compat> 1108 +3144 <compat> 1121 +3145 <compat> 1109 +3146 <compat> 110A +3147 <compat> 110B +3148 <compat> 110C +3149 <compat> 110D +314A <compat> 110E +314B <compat> 110F +314C <compat> 1110 +314D <compat> 1111 +314E <compat> 1112 +314F <compat> 1161 +3150 <compat> 1162 +3151 <compat> 1163 +3152 <compat> 1164 +3153 <compat> 1165 +3154 <compat> 1166 +3155 <compat> 1167 +3156 <compat> 1168 +3157 <compat> 1169 +3158 <compat> 116A +3159 <compat> 116B +315A <compat> 116C +315B <compat> 116D +315C <compat> 116E +315D <compat> 116F +315E <compat> 1170 +315F <compat> 1171 +3160 <compat> 1172 +3161 <compat> 1173 +3162 <compat> 1174 +3163 <compat> 1175 +3164 <compat> 1160 +3165 <compat> 1114 +3166 <compat> 1115 +3167 <compat> 11C7 +3168 <compat> 11C8 +3169 <compat> 11CC +316A <compat> 11CE +316B <compat> 11D3 +316C <compat> 11D7 +316D <compat> 11D9 +316E <compat> 111C +316F <compat> 11DD +3170 <compat> 11DF +3171 <compat> 111D +3172 <compat> 111E +3173 <compat> 1120 +3174 <compat> 1122 +3175 <compat> 1123 +3176 <compat> 1127 +3177 <compat> 1129 +3178 <compat> 112B +3179 <compat> 112C +317A <compat> 112D +317B <compat> 112E +317C <compat> 112F +317D <compat> 1132 +317E <compat> 1136 +317F <compat> 1140 +3180 <compat> 1147 +3181 <compat> 114C +3182 <compat> 11F1 +3183 <compat> 11F2 +3184 <compat> 1157 +3185 <compat> 1158 +3186 <compat> 1159 +3187 <compat> 1184 +3188 <compat> 1185 +3189 <compat> 1188 +318A <compat> 1191 +318B <compat> 1192 +318C <compat> 1194 +318D <compat> 119E +318E <compat> 11A1 +3192 <super> 4E00 +3193 <super> 4E8C +3194 <super> 4E09 +3195 <super> 56DB +3196 <super> 4E0A +3197 <super> 4E2D +3198 <super> 4E0B +3199 <super> 7532 +319A <super> 4E59 +319B <super> 4E19 +319C <super> 4E01 +319D <super> 5929 +319E <super> 5730 +319F <super> 4EBA +3200 <compat> 0028 1100 0029 +3201 <compat> 0028 1102 0029 +3202 <compat> 0028 1103 0029 +3203 <compat> 0028 1105 0029 +3204 <compat> 0028 1106 0029 +3205 <compat> 0028 1107 0029 +3206 <compat> 0028 1109 0029 +3207 <compat> 0028 110B 0029 +3208 <compat> 0028 110C 0029 +3209 <compat> 0028 110E 0029 +320A <compat> 0028 110F 0029 +320B <compat> 0028 1110 0029 +320C <compat> 0028 1111 0029 +320D <compat> 0028 1112 0029 +320E <compat> 0028 1100 1161 0029 +320F <compat> 0028 1102 1161 0029 +3210 <compat> 0028 1103 1161 0029 +3211 <compat> 0028 1105 1161 0029 +3212 <compat> 0028 1106 1161 0029 +3213 <compat> 0028 1107 1161 0029 +3214 <compat> 0028 1109 1161 0029 +3215 <compat> 0028 110B 1161 0029 +3216 <compat> 0028 110C 1161 0029 +3217 <compat> 0028 110E 1161 0029 +3218 <compat> 0028 110F 1161 0029 +3219 <compat> 0028 1110 1161 0029 +321A <compat> 0028 1111 1161 0029 +321B <compat> 0028 1112 1161 0029 +321C <compat> 0028 110C 116E 0029 +321D <compat> 0028 110B 1169 110C 1165 11AB 0029 +321E <compat> 0028 110B 1169 1112 116E 0029 +3220 <compat> 0028 4E00 0029 +3221 <compat> 0028 4E8C 0029 +3222 <compat> 0028 4E09 0029 +3223 <compat> 0028 56DB 0029 +3224 <compat> 0028 4E94 0029 +3225 <compat> 0028 516D 0029 +3226 <compat> 0028 4E03 0029 +3227 <compat> 0028 516B 0029 +3228 <compat> 0028 4E5D 0029 +3229 <compat> 0028 5341 0029 +322A <compat> 0028 6708 0029 +322B <compat> 0028 706B 0029 +322C <compat> 0028 6C34 0029 +322D <compat> 0028 6728 0029 +322E <compat> 0028 91D1 0029 +322F <compat> 0028 571F 0029 +3230 <compat> 0028 65E5 0029 +3231 <compat> 0028 682A 0029 +3232 <compat> 0028 6709 0029 +3233 <compat> 0028 793E 0029 +3234 <compat> 0028 540D 0029 +3235 <compat> 0028 7279 0029 +3236 <compat> 0028 8CA1 0029 +3237 <compat> 0028 795D 0029 +3238 <compat> 0028 52B4 0029 +3239 <compat> 0028 4EE3 0029 +323A <compat> 0028 547C 0029 +323B <compat> 0028 5B66 0029 +323C <compat> 0028 76E3 0029 +323D <compat> 0028 4F01 0029 +323E <compat> 0028 8CC7 0029 +323F <compat> 0028 5354 0029 +3240 <compat> 0028 796D 0029 +3241 <compat> 0028 4F11 0029 +3242 <compat> 0028 81EA 0029 +3243 <compat> 0028 81F3 0029 +3244 <circle> 554F +3245 <circle> 5E7C +3246 <circle> 6587 +3247 <circle> 7B8F +3250 <square> 0050 0054 0045 +3251 <circle> 0032 0031 +3252 <circle> 0032 0032 +3253 <circle> 0032 0033 +3254 <circle> 0032 0034 +3255 <circle> 0032 0035 +3256 <circle> 0032 0036 +3257 <circle> 0032 0037 +3258 <circle> 0032 0038 +3259 <circle> 0032 0039 +325A <circle> 0033 0030 +325B <circle> 0033 0031 +325C <circle> 0033 0032 +325D <circle> 0033 0033 +325E <circle> 0033 0034 +325F <circle> 0033 0035 +3260 <circle> 1100 +3261 <circle> 1102 +3262 <circle> 1103 +3263 <circle> 1105 +3264 <circle> 1106 +3265 <circle> 1107 +3266 <circle> 1109 +3267 <circle> 110B +3268 <circle> 110C +3269 <circle> 110E +326A <circle> 110F +326B <circle> 1110 +326C <circle> 1111 +326D <circle> 1112 +326E <circle> 1100 1161 +326F <circle> 1102 1161 +3270 <circle> 1103 1161 +3271 <circle> 1105 1161 +3272 <circle> 1106 1161 +3273 <circle> 1107 1161 +3274 <circle> 1109 1161 +3275 <circle> 110B 1161 +3276 <circle> 110C 1161 +3277 <circle> 110E 1161 +3278 <circle> 110F 1161 +3279 <circle> 1110 1161 +327A <circle> 1111 1161 +327B <circle> 1112 1161 +327C <circle> 110E 1161 11B7 1100 1169 +327D <circle> 110C 116E 110B 1174 +327E <circle> 110B 116E +3280 <circle> 4E00 +3281 <circle> 4E8C +3282 <circle> 4E09 +3283 <circle> 56DB +3284 <circle> 4E94 +3285 <circle> 516D +3286 <circle> 4E03 +3287 <circle> 516B +3288 <circle> 4E5D +3289 <circle> 5341 +328A <circle> 6708 +328B <circle> 706B +328C <circle> 6C34 +328D <circle> 6728 +328E <circle> 91D1 +328F <circle> 571F +3290 <circle> 65E5 +3291 <circle> 682A +3292 <circle> 6709 +3293 <circle> 793E +3294 <circle> 540D +3295 <circle> 7279 +3296 <circle> 8CA1 +3297 <circle> 795D +3298 <circle> 52B4 +3299 <circle> 79D8 +329A <circle> 7537 +329B <circle> 5973 +329C <circle> 9069 +329D <circle> 512A +329E <circle> 5370 +329F <circle> 6CE8 +32A0 <circle> 9805 +32A1 <circle> 4F11 +32A2 <circle> 5199 +32A3 <circle> 6B63 +32A4 <circle> 4E0A +32A5 <circle> 4E2D +32A6 <circle> 4E0B +32A7 <circle> 5DE6 +32A8 <circle> 53F3 +32A9 <circle> 533B +32AA <circle> 5B97 +32AB <circle> 5B66 +32AC <circle> 76E3 +32AD <circle> 4F01 +32AE <circle> 8CC7 +32AF <circle> 5354 +32B0 <circle> 591C +32B1 <circle> 0033 0036 +32B2 <circle> 0033 0037 +32B3 <circle> 0033 0038 +32B4 <circle> 0033 0039 +32B5 <circle> 0034 0030 +32B6 <circle> 0034 0031 +32B7 <circle> 0034 0032 +32B8 <circle> 0034 0033 +32B9 <circle> 0034 0034 +32BA <circle> 0034 0035 +32BB <circle> 0034 0036 +32BC <circle> 0034 0037 +32BD <circle> 0034 0038 +32BE <circle> 0034 0039 +32BF <circle> 0035 0030 +32C0 <compat> 0031 6708 +32C1 <compat> 0032 6708 +32C2 <compat> 0033 6708 +32C3 <compat> 0034 6708 +32C4 <compat> 0035 6708 +32C5 <compat> 0036 6708 +32C6 <compat> 0037 6708 +32C7 <compat> 0038 6708 +32C8 <compat> 0039 6708 +32C9 <compat> 0031 0030 6708 +32CA <compat> 0031 0031 6708 +32CB <compat> 0031 0032 6708 +32CC <square> 0048 0067 +32CD <square> 0065 0072 0067 +32CE <square> 0065 0056 +32CF <square> 004C 0054 0044 +32D0 <circle> 30A2 +32D1 <circle> 30A4 +32D2 <circle> 30A6 +32D3 <circle> 30A8 +32D4 <circle> 30AA +32D5 <circle> 30AB +32D6 <circle> 30AD +32D7 <circle> 30AF +32D8 <circle> 30B1 +32D9 <circle> 30B3 +32DA <circle> 30B5 +32DB <circle> 30B7 +32DC <circle> 30B9 +32DD <circle> 30BB +32DE <circle> 30BD +32DF <circle> 30BF +32E0 <circle> 30C1 +32E1 <circle> 30C4 +32E2 <circle> 30C6 +32E3 <circle> 30C8 +32E4 <circle> 30CA +32E5 <circle> 30CB +32E6 <circle> 30CC +32E7 <circle> 30CD +32E8 <circle> 30CE +32E9 <circle> 30CF +32EA <circle> 30D2 +32EB <circle> 30D5 +32EC <circle> 30D8 +32ED <circle> 30DB +32EE <circle> 30DE +32EF <circle> 30DF +32F0 <circle> 30E0 +32F1 <circle> 30E1 +32F2 <circle> 30E2 +32F3 <circle> 30E4 +32F4 <circle> 30E6 +32F5 <circle> 30E8 +32F6 <circle> 30E9 +32F7 <circle> 30EA +32F8 <circle> 30EB +32F9 <circle> 30EC +32FA <circle> 30ED +32FB <circle> 30EF +32FC <circle> 30F0 +32FD <circle> 30F1 +32FE <circle> 30F2 +3300 <square> 30A2 30D1 30FC 30C8 +3301 <square> 30A2 30EB 30D5 30A1 +3302 <square> 30A2 30F3 30DA 30A2 +3303 <square> 30A2 30FC 30EB +3304 <square> 30A4 30CB 30F3 30B0 +3305 <square> 30A4 30F3 30C1 +3306 <square> 30A6 30A9 30F3 +3307 <square> 30A8 30B9 30AF 30FC 30C9 +3308 <square> 30A8 30FC 30AB 30FC +3309 <square> 30AA 30F3 30B9 +330A <square> 30AA 30FC 30E0 +330B <square> 30AB 30A4 30EA +330C <square> 30AB 30E9 30C3 30C8 +330D <square> 30AB 30ED 30EA 30FC +330E <square> 30AC 30ED 30F3 +330F <square> 30AC 30F3 30DE +3310 <square> 30AE 30AC +3311 <square> 30AE 30CB 30FC +3312 <square> 30AD 30E5 30EA 30FC +3313 <square> 30AE 30EB 30C0 30FC +3314 <square> 30AD 30ED +3315 <square> 30AD 30ED 30B0 30E9 30E0 +3316 <square> 30AD 30ED 30E1 30FC 30C8 30EB +3317 <square> 30AD 30ED 30EF 30C3 30C8 +3318 <square> 30B0 30E9 30E0 +3319 <square> 30B0 30E9 30E0 30C8 30F3 +331A <square> 30AF 30EB 30BC 30A4 30ED +331B <square> 30AF 30ED 30FC 30CD +331C <square> 30B1 30FC 30B9 +331D <square> 30B3 30EB 30CA +331E <square> 30B3 30FC 30DD +331F <square> 30B5 30A4 30AF 30EB +3320 <square> 30B5 30F3 30C1 30FC 30E0 +3321 <square> 30B7 30EA 30F3 30B0 +3322 <square> 30BB 30F3 30C1 +3323 <square> 30BB 30F3 30C8 +3324 <square> 30C0 30FC 30B9 +3325 <square> 30C7 30B7 +3326 <square> 30C9 30EB +3327 <square> 30C8 30F3 +3328 <square> 30CA 30CE +3329 <square> 30CE 30C3 30C8 +332A <square> 30CF 30A4 30C4 +332B <square> 30D1 30FC 30BB 30F3 30C8 +332C <square> 30D1 30FC 30C4 +332D <square> 30D0 30FC 30EC 30EB +332E <square> 30D4 30A2 30B9 30C8 30EB +332F <square> 30D4 30AF 30EB +3330 <square> 30D4 30B3 +3331 <square> 30D3 30EB +3332 <square> 30D5 30A1 30E9 30C3 30C9 +3333 <square> 30D5 30A3 30FC 30C8 +3334 <square> 30D6 30C3 30B7 30A7 30EB +3335 <square> 30D5 30E9 30F3 +3336 <square> 30D8 30AF 30BF 30FC 30EB +3337 <square> 30DA 30BD +3338 <square> 30DA 30CB 30D2 +3339 <square> 30D8 30EB 30C4 +333A <square> 30DA 30F3 30B9 +333B <square> 30DA 30FC 30B8 +333C <square> 30D9 30FC 30BF +333D <square> 30DD 30A4 30F3 30C8 +333E <square> 30DC 30EB 30C8 +333F <square> 30DB 30F3 +3340 <square> 30DD 30F3 30C9 +3341 <square> 30DB 30FC 30EB +3342 <square> 30DB 30FC 30F3 +3343 <square> 30DE 30A4 30AF 30ED +3344 <square> 30DE 30A4 30EB +3345 <square> 30DE 30C3 30CF +3346 <square> 30DE 30EB 30AF +3347 <square> 30DE 30F3 30B7 30E7 30F3 +3348 <square> 30DF 30AF 30ED 30F3 +3349 <square> 30DF 30EA +334A <square> 30DF 30EA 30D0 30FC 30EB +334B <square> 30E1 30AC +334C <square> 30E1 30AC 30C8 30F3 +334D <square> 30E1 30FC 30C8 30EB +334E <square> 30E4 30FC 30C9 +334F <square> 30E4 30FC 30EB +3350 <square> 30E6 30A2 30F3 +3351 <square> 30EA 30C3 30C8 30EB +3352 <square> 30EA 30E9 +3353 <square> 30EB 30D4 30FC +3354 <square> 30EB 30FC 30D6 30EB +3355 <square> 30EC 30E0 +3356 <square> 30EC 30F3 30C8 30B2 30F3 +3357 <square> 30EF 30C3 30C8 +3358 <compat> 0030 70B9 +3359 <compat> 0031 70B9 +335A <compat> 0032 70B9 +335B <compat> 0033 70B9 +335C <compat> 0034 70B9 +335D <compat> 0035 70B9 +335E <compat> 0036 70B9 +335F <compat> 0037 70B9 +3360 <compat> 0038 70B9 +3361 <compat> 0039 70B9 +3362 <compat> 0031 0030 70B9 +3363 <compat> 0031 0031 70B9 +3364 <compat> 0031 0032 70B9 +3365 <compat> 0031 0033 70B9 +3366 <compat> 0031 0034 70B9 +3367 <compat> 0031 0035 70B9 +3368 <compat> 0031 0036 70B9 +3369 <compat> 0031 0037 70B9 +336A <compat> 0031 0038 70B9 +336B <compat> 0031 0039 70B9 +336C <compat> 0032 0030 70B9 +336D <compat> 0032 0031 70B9 +336E <compat> 0032 0032 70B9 +336F <compat> 0032 0033 70B9 +3370 <compat> 0032 0034 70B9 +3371 <square> 0068 0050 0061 +3372 <square> 0064 0061 +3373 <square> 0041 0055 +3374 <square> 0062 0061 0072 +3375 <square> 006F 0056 +3376 <square> 0070 0063 +3377 <square> 0064 006D +3378 <square> 0064 006D 00B2 +3379 <square> 0064 006D 00B3 +337A <square> 0049 0055 +337B <square> 5E73 6210 +337C <square> 662D 548C +337D <square> 5927 6B63 +337E <square> 660E 6CBB +337F <square> 682A 5F0F 4F1A 793E +3380 <square> 0070 0041 +3381 <square> 006E 0041 +3382 <square> 03BC 0041 +3383 <square> 006D 0041 +3384 <square> 006B 0041 +3385 <square> 004B 0042 +3386 <square> 004D 0042 +3387 <square> 0047 0042 +3388 <square> 0063 0061 006C +3389 <square> 006B 0063 0061 006C +338A <square> 0070 0046 +338B <square> 006E 0046 +338C <square> 03BC 0046 +338D <square> 03BC 0067 +338E <square> 006D 0067 +338F <square> 006B 0067 +3390 <square> 0048 007A +3391 <square> 006B 0048 007A +3392 <square> 004D 0048 007A +3393 <square> 0047 0048 007A +3394 <square> 0054 0048 007A +3395 <square> 03BC 2113 +3396 <square> 006D 2113 +3397 <square> 0064 2113 +3398 <square> 006B 2113 +3399 <square> 0066 006D +339A <square> 006E 006D +339B <square> 03BC 006D +339C <square> 006D 006D +339D <square> 0063 006D +339E <square> 006B 006D +339F <square> 006D 006D 00B2 +33A0 <square> 0063 006D 00B2 +33A1 <square> 006D 00B2 +33A2 <square> 006B 006D 00B2 +33A3 <square> 006D 006D 00B3 +33A4 <square> 0063 006D 00B3 +33A5 <square> 006D 00B3 +33A6 <square> 006B 006D 00B3 +33A7 <square> 006D 2215 0073 +33A8 <square> 006D 2215 0073 00B2 +33A9 <square> 0050 0061 +33AA <square> 006B 0050 0061 +33AB <square> 004D 0050 0061 +33AC <square> 0047 0050 0061 +33AD <square> 0072 0061 0064 +33AE <square> 0072 0061 0064 2215 0073 +33AF <square> 0072 0061 0064 2215 0073 00B2 +33B0 <square> 0070 0073 +33B1 <square> 006E 0073 +33B2 <square> 03BC 0073 +33B3 <square> 006D 0073 +33B4 <square> 0070 0056 +33B5 <square> 006E 0056 +33B6 <square> 03BC 0056 +33B7 <square> 006D 0056 +33B8 <square> 006B 0056 +33B9 <square> 004D 0056 +33BA <square> 0070 0057 +33BB <square> 006E 0057 +33BC <square> 03BC 0057 +33BD <square> 006D 0057 +33BE <square> 006B 0057 +33BF <square> 004D 0057 +33C0 <square> 006B 03A9 +33C1 <square> 004D 03A9 +33C2 <square> 0061 002E 006D 002E +33C3 <square> 0042 0071 +33C4 <square> 0063 0063 +33C5 <square> 0063 0064 +33C6 <square> 0043 2215 006B 0067 +33C7 <square> 0043 006F 002E +33C8 <square> 0064 0042 +33C9 <square> 0047 0079 +33CA <square> 0068 0061 +33CB <square> 0048 0050 +33CC <square> 0069 006E +33CD <square> 004B 004B +33CE <square> 004B 004D +33CF <square> 006B 0074 +33D0 <square> 006C 006D +33D1 <square> 006C 006E +33D2 <square> 006C 006F 0067 +33D3 <square> 006C 0078 +33D4 <square> 006D 0062 +33D5 <square> 006D 0069 006C +33D6 <square> 006D 006F 006C +33D7 <square> 0050 0048 +33D8 <square> 0070 002E 006D 002E +33D9 <square> 0050 0050 004D +33DA <square> 0050 0052 +33DB <square> 0073 0072 +33DC <square> 0053 0076 +33DD <square> 0057 0062 +33DE <square> 0056 2215 006D +33DF <square> 0041 2215 006D +33E0 <compat> 0031 65E5 +33E1 <compat> 0032 65E5 +33E2 <compat> 0033 65E5 +33E3 <compat> 0034 65E5 +33E4 <compat> 0035 65E5 +33E5 <compat> 0036 65E5 +33E6 <compat> 0037 65E5 +33E7 <compat> 0038 65E5 +33E8 <compat> 0039 65E5 +33E9 <compat> 0031 0030 65E5 +33EA <compat> 0031 0031 65E5 +33EB <compat> 0031 0032 65E5 +33EC <compat> 0031 0033 65E5 +33ED <compat> 0031 0034 65E5 +33EE <compat> 0031 0035 65E5 +33EF <compat> 0031 0036 65E5 +33F0 <compat> 0031 0037 65E5 +33F1 <compat> 0031 0038 65E5 +33F2 <compat> 0031 0039 65E5 +33F3 <compat> 0032 0030 65E5 +33F4 <compat> 0032 0031 65E5 +33F5 <compat> 0032 0032 65E5 +33F6 <compat> 0032 0033 65E5 +33F7 <compat> 0032 0034 65E5 +33F8 <compat> 0032 0035 65E5 +33F9 <compat> 0032 0036 65E5 +33FA <compat> 0032 0037 65E5 +33FB <compat> 0032 0038 65E5 +33FC <compat> 0032 0039 65E5 +33FD <compat> 0033 0030 65E5 +33FE <compat> 0033 0031 65E5 +33FF <square> 0067 0061 006C +A69C <super> 044A +A69D <super> 044C +A770 <super> A76F +A7F8 <super> 0126 +A7F9 <super> 0153 +AB5C <super> A727 +AB5D <super> AB37 +AB5E <super> 026B +AB5F <super> AB52 +F900 8C48 +F901 66F4 +F902 8ECA +F903 8CC8 +F904 6ED1 +F905 4E32 +F906 53E5 +F907 F908 9F9C +F909 5951 +F90A 91D1 +F90B 5587 +F90C 5948 +F90D 61F6 +F90E 7669 +F90F 7F85 +F910 863F +F911 87BA +F912 88F8 +F913 908F +F914 6A02 +F915 6D1B +F916 70D9 +F917 73DE +F918 843D +F919 916A +F91A 99F1 +F91B 4E82 +F91C 5375 +F91D 6B04 +F91E 721B +F91F 862D +F920 9E1E +F921 5D50 +F922 6FEB +F923 85CD +F924 8964 +F925 62C9 +F926 81D8 +F927 881F +F928 5ECA +F929 6717 +F92A 6D6A +F92B 72FC +F92C 90CE +F92D 4F86 +F92E 51B7 +F92F 52DE +F930 64C4 +F931 6AD3 +F932 7210 +F933 76E7 +F934 8001 +F935 8606 +F936 865C +F937 8DEF +F938 9732 +F939 9B6F +F93A 9DFA +F93B 788C +F93C 797F +F93D 7DA0 +F93E 83C9 +F93F 9304 +F940 9E7F +F941 8AD6 +F942 58DF +F943 5F04 +F944 7C60 +F945 807E +F946 7262 +F947 78CA +F948 8CC2 +F949 96F7 +F94A 58D8 +F94B 5C62 +F94C 6A13 +F94D 6DDA +F94E 6F0F +F94F 7D2F +F950 7E37 +F951 964B +F952 52D2 +F953 808B +F954 51DC +F955 51CC +F956 7A1C +F957 7DBE +F958 83F1 +F959 9675 +F95A 8B80 +F95B 62CF +F95C 6A02 +F95D 8AFE +F95E 4E39 +F95F 5BE7 +F960 6012 +F961 7387 +F962 7570 +F963 5317 +F964 78FB +F965 4FBF +F966 5FA9 +F967 4E0D +F968 6CCC +F969 6578 +F96A 7D22 +F96B 53C3 +F96C 585E +F96D 7701 +F96E 8449 +F96F 8AAA +F970 6BBA +F971 8FB0 +F972 6C88 +F973 62FE +F974 82E5 +F975 63A0 +F976 7565 +F977 4EAE +F978 5169 +F979 51C9 +F97A 6881 +F97B 7CE7 +F97C 826F +F97D 8AD2 +F97E 91CF +F97F 52F5 +F980 5442 +F981 5973 +F982 5EEC +F983 65C5 +F984 6FFE +F985 792A +F986 95AD +F987 9A6A +F988 9E97 +F989 9ECE +F98A 529B +F98B 66C6 +F98C 6B77 +F98D 8F62 +F98E 5E74 +F98F 6190 +F990 6200 +F991 649A +F992 6F23 +F993 7149 +F994 7489 +F995 79CA +F996 7DF4 +F997 806F +F998 8F26 +F999 84EE +F99A 9023 +F99B 934A +F99C 5217 +F99D 52A3 +F99E 54BD +F99F 70C8 +F9A0 88C2 +F9A1 8AAA +F9A2 5EC9 +F9A3 5FF5 +F9A4 637B +F9A5 6BAE +F9A6 7C3E +F9A7 7375 +F9A8 4EE4 +F9A9 56F9 +F9AA 5BE7 +F9AB 5DBA +F9AC 601C +F9AD 73B2 +F9AE 7469 +F9AF 7F9A +F9B0 8046 +F9B1 9234 +F9B2 96F6 +F9B3 9748 +F9B4 9818 +F9B5 4F8B +F9B6 79AE +F9B7 91B4 +F9B8 96B8 +F9B9 60E1 +F9BA 4E86 +F9BB 50DA +F9BC 5BEE +F9BD 5C3F +F9BE 6599 +F9BF 6A02 +F9C0 71CE +F9C1 7642 +F9C2 84FC +F9C3 907C +F9C4 9F8D +F9C5 6688 +F9C6 962E +F9C7 5289 +F9C8 677B +F9C9 67F3 +F9CA 6D41 +F9CB 6E9C +F9CC 7409 +F9CD 7559 +F9CE 786B +F9CF 7D10 +F9D0 985E +F9D1 516D +F9D2 622E +F9D3 9678 +F9D4 502B +F9D5 5D19 +F9D6 6DEA +F9D7 8F2A +F9D8 5F8B +F9D9 6144 +F9DA 6817 +F9DB 7387 +F9DC 9686 +F9DD 5229 +F9DE 540F +F9DF 5C65 +F9E0 6613 +F9E1 674E +F9E2 68A8 +F9E3 6CE5 +F9E4 7406 +F9E5 75E2 +F9E6 7F79 +F9E7 88CF +F9E8 88E1 +F9E9 91CC +F9EA 96E2 +F9EB 533F +F9EC 6EBA +F9ED 541D +F9EE 71D0 +F9EF 7498 +F9F0 85FA +F9F1 96A3 +F9F2 9C57 +F9F3 9E9F +F9F4 6797 +F9F5 6DCB +F9F6 81E8 +F9F7 7ACB +F9F8 7B20 +F9F9 7C92 +F9FA 72C0 +F9FB 7099 +F9FC 8B58 +F9FD 4EC0 +F9FE 8336 +F9FF 523A +FA00 5207 +FA01 5EA6 +FA02 62D3 +FA03 7CD6 +FA04 5B85 +FA05 6D1E +FA06 66B4 +FA07 8F3B +FA08 884C +FA09 964D +FA0A 898B +FA0B 5ED3 +FA0C 5140 +FA0D 55C0 +FA10 585A +FA12 6674 +FA15 51DE +FA16 732A +FA17 76CA +FA18 793C +FA19 795E +FA1A 7965 +FA1B 798F +FA1C 9756 +FA1D 7CBE +FA1E 7FBD +FA20 8612 +FA22 8AF8 +FA25 9038 +FA26 90FD +FA2A 98EF +FA2B 98FC +FA2C 9928 +FA2D 9DB4 +FA2E 90DE +FA2F 96B7 +FA30 4FAE +FA31 50E7 +FA32 514D +FA33 52C9 +FA34 52E4 +FA35 5351 +FA36 559D +FA37 5606 +FA38 5668 +FA39 5840 +FA3A 58A8 +FA3B 5C64 +FA3C 5C6E +FA3D 6094 +FA3E 6168 +FA3F 618E +FA40 61F2 +FA41 654F +FA42 65E2 +FA43 6691 +FA44 6885 +FA45 6D77 +FA46 6E1A +FA47 6F22 +FA48 716E +FA49 722B +FA4A 7422 +FA4B 7891 +FA4C 793E +FA4D 7949 +FA4E 7948 +FA4F 7950 +FA50 7956 +FA51 795D +FA52 798D +FA53 798E +FA54 7A40 +FA55 7A81 +FA56 7BC0 +FA57 7DF4 +FA58 7E09 +FA59 7E41 +FA5A 7F72 +FA5B 8005 +FA5C 81ED +FA5D FA5E 8279 +FA5F 8457 +FA60 8910 +FA61 8996 +FA62 8B01 +FA63 8B39 +FA64 8CD3 +FA65 8D08 +FA66 8FB6 +FA67 9038 +FA68 96E3 +FA69 97FF +FA6A 983B +FA6B 6075 +FA6C 242EE +FA6D 8218 +FA70 4E26 +FA71 51B5 +FA72 5168 +FA73 4F80 +FA74 5145 +FA75 5180 +FA76 52C7 +FA77 52FA +FA78 559D +FA79 5555 +FA7A 5599 +FA7B 55E2 +FA7C 585A +FA7D 58B3 +FA7E 5944 +FA7F 5954 +FA80 5A62 +FA81 5B28 +FA82 5ED2 +FA83 5ED9 +FA84 5F69 +FA85 5FAD +FA86 60D8 +FA87 614E +FA88 6108 +FA89 618E +FA8A 6160 +FA8B 61F2 +FA8C 6234 +FA8D 63C4 +FA8E 641C +FA8F 6452 +FA90 6556 +FA91 6674 +FA92 6717 +FA93 671B +FA94 6756 +FA95 6B79 +FA96 6BBA +FA97 6D41 +FA98 6EDB +FA99 6ECB +FA9A 6F22 +FA9B 701E +FA9C 716E +FA9D 77A7 +FA9E 7235 +FA9F 72AF +FAA0 732A +FAA1 7471 +FAA2 7506 +FAA3 753B +FAA4 761D +FAA5 761F +FAA6 76CA +FAA7 76DB +FAA8 76F4 +FAA9 774A +FAAA 7740 +FAAB 78CC +FAAC 7AB1 +FAAD 7BC0 +FAAE 7C7B +FAAF 7D5B +FAB0 7DF4 +FAB1 7F3E +FAB2 8005 +FAB3 8352 +FAB4 83EF +FAB5 8779 +FAB6 8941 +FAB7 8986 +FAB8 8996 +FAB9 8ABF +FABA 8AF8 +FABB 8ACB +FABC 8B01 +FABD 8AFE +FABE 8AED +FABF 8B39 +FAC0 8B8A +FAC1 8D08 +FAC2 8F38 +FAC3 9072 +FAC4 9199 +FAC5 9276 +FAC6 967C +FAC7 96E3 +FAC8 9756 +FAC9 97DB +FACA 97FF +FACB 980B +FACC 983B +FACD 9B12 +FACE 9F9C +FACF 2284A +FAD0 22844 +FAD1 233D5 +FAD2 3B9D +FAD3 4018 +FAD4 4039 +FAD5 25249 +FAD6 25CD0 +FAD7 27ED3 +FAD8 9F43 +FAD9 9F8E +FB00 <compat> 0066 0066 +FB01 <compat> 0066 0069 +FB02 <compat> 0066 006C +FB03 <compat> 0066 0066 0069 +FB04 <compat> 0066 0066 006C +FB05 <compat> 017F 0074 +FB06 <compat> 0073 0074 +FB13 <compat> 0574 0576 +FB14 <compat> 0574 0565 +FB15 <compat> 0574 056B +FB16 <compat> 057E 0576 +FB17 <compat> 0574 056D +FB1D 05D9 05B4 +FB1F 05F2 05B7 +FB20 <font> 05E2 +FB21 <font> 05D0 +FB22 <font> 05D3 +FB23 <font> 05D4 +FB24 <font> 05DB +FB25 <font> 05DC +FB26 <font> 05DD +FB27 <font> 05E8 +FB28 <font> 05EA +FB29 <font> 002B +FB2A 05E9 05C1 +FB2B 05E9 05C2 +FB2C FB49 05C1 +FB2D FB49 05C2 +FB2E 05D0 05B7 +FB2F 05D0 05B8 +FB30 05D0 05BC +FB31 05D1 05BC +FB32 05D2 05BC +FB33 05D3 05BC +FB34 05D4 05BC +FB35 05D5 05BC +FB36 05D6 05BC +FB38 05D8 05BC +FB39 05D9 05BC +FB3A 05DA 05BC +FB3B 05DB 05BC +FB3C 05DC 05BC +FB3E 05DE 05BC +FB40 05E0 05BC +FB41 05E1 05BC +FB43 05E3 05BC +FB44 05E4 05BC +FB46 05E6 05BC +FB47 05E7 05BC +FB48 05E8 05BC +FB49 05E9 05BC +FB4A 05EA 05BC +FB4B 05D5 05B9 +FB4C 05D1 05BF +FB4D 05DB 05BF +FB4E 05E4 05BF +FB4F <compat> 05D0 05DC +FB50 <isolated> 0671 +FB51 <final> 0671 +FB52 <isolated> 067B +FB53 <final> 067B +FB54 <initial> 067B +FB55 <medial> 067B +FB56 <isolated> 067E +FB57 <final> 067E +FB58 <initial> 067E +FB59 <medial> 067E +FB5A <isolated> 0680 +FB5B <final> 0680 +FB5C <initial> 0680 +FB5D <medial> 0680 +FB5E <isolated> 067A +FB5F <final> 067A +FB60 <initial> 067A +FB61 <medial> 067A +FB62 <isolated> 067F +FB63 <final> 067F +FB64 <initial> 067F +FB65 <medial> 067F +FB66 <isolated> 0679 +FB67 <final> 0679 +FB68 <initial> 0679 +FB69 <medial> 0679 +FB6A <isolated> 06A4 +FB6B <final> 06A4 +FB6C <initial> 06A4 +FB6D <medial> 06A4 +FB6E <isolated> 06A6 +FB6F <final> 06A6 +FB70 <initial> 06A6 +FB71 <medial> 06A6 +FB72 <isolated> 0684 +FB73 <final> 0684 +FB74 <initial> 0684 +FB75 <medial> 0684 +FB76 <isolated> 0683 +FB77 <final> 0683 +FB78 <initial> 0683 +FB79 <medial> 0683 +FB7A <isolated> 0686 +FB7B <final> 0686 +FB7C <initial> 0686 +FB7D <medial> 0686 +FB7E <isolated> 0687 +FB7F <final> 0687 +FB80 <initial> 0687 +FB81 <medial> 0687 +FB82 <isolated> 068D +FB83 <final> 068D +FB84 <isolated> 068C +FB85 <final> 068C +FB86 <isolated> 068E +FB87 <final> 068E +FB88 <isolated> 0688 +FB89 <final> 0688 +FB8A <isolated> 0698 +FB8B <final> 0698 +FB8C <isolated> 0691 +FB8D <final> 0691 +FB8E <isolated> 06A9 +FB8F <final> 06A9 +FB90 <initial> 06A9 +FB91 <medial> 06A9 +FB92 <isolated> 06AF +FB93 <final> 06AF +FB94 <initial> 06AF +FB95 <medial> 06AF +FB96 <isolated> 06B3 +FB97 <final> 06B3 +FB98 <initial> 06B3 +FB99 <medial> 06B3 +FB9A <isolated> 06B1 +FB9B <final> 06B1 +FB9C <initial> 06B1 +FB9D <medial> 06B1 +FB9E <isolated> 06BA +FB9F <final> 06BA +FBA0 <isolated> 06BB +FBA1 <final> 06BB +FBA2 <initial> 06BB +FBA3 <medial> 06BB +FBA4 <isolated> 06C0 +FBA5 <final> 06C0 +FBA6 <isolated> 06C1 +FBA7 <final> 06C1 +FBA8 <initial> 06C1 +FBA9 <medial> 06C1 +FBAA <isolated> 06BE +FBAB <final> 06BE +FBAC <initial> 06BE +FBAD <medial> 06BE +FBAE <isolated> 06D2 +FBAF <final> 06D2 +FBB0 <isolated> 06D3 +FBB1 <final> 06D3 +FBD3 <isolated> 06AD +FBD4 <final> 06AD +FBD5 <initial> 06AD +FBD6 <medial> 06AD +FBD7 <isolated> 06C7 +FBD8 <final> 06C7 +FBD9 <isolated> 06C6 +FBDA <final> 06C6 +FBDB <isolated> 06C8 +FBDC <final> 06C8 +FBDD <isolated> 0677 +FBDE <isolated> 06CB +FBDF <final> 06CB +FBE0 <isolated> 06C5 +FBE1 <final> 06C5 +FBE2 <isolated> 06C9 +FBE3 <final> 06C9 +FBE4 <isolated> 06D0 +FBE5 <final> 06D0 +FBE6 <initial> 06D0 +FBE7 <medial> 06D0 +FBE8 <initial> 0649 +FBE9 <medial> 0649 +FBEA <isolated> 0626 0627 +FBEB <final> 0626 0627 +FBEC <isolated> 0626 06D5 +FBED <final> 0626 06D5 +FBEE <isolated> 0626 0648 +FBEF <final> 0626 0648 +FBF0 <isolated> 0626 06C7 +FBF1 <final> 0626 06C7 +FBF2 <isolated> 0626 06C6 +FBF3 <final> 0626 06C6 +FBF4 <isolated> 0626 06C8 +FBF5 <final> 0626 06C8 +FBF6 <isolated> 0626 06D0 +FBF7 <final> 0626 06D0 +FBF8 <initial> 0626 06D0 +FBF9 <isolated> 0626 0649 +FBFA <final> 0626 0649 +FBFB <initial> 0626 0649 +FBFC <isolated> 06CC +FBFD <final> 06CC +FBFE <initial> 06CC +FBFF <medial> 06CC +FC00 <isolated> 0626 062C +FC01 <isolated> 0626 062D +FC02 <isolated> 0626 0645 +FC03 <isolated> 0626 0649 +FC04 <isolated> 0626 064A +FC05 <isolated> 0628 062C +FC06 <isolated> 0628 062D +FC07 <isolated> 0628 062E +FC08 <isolated> 0628 0645 +FC09 <isolated> 0628 0649 +FC0A <isolated> 0628 064A +FC0B <isolated> 062A 062C +FC0C <isolated> 062A 062D +FC0D <isolated> 062A 062E +FC0E <isolated> 062A 0645 +FC0F <isolated> 062A 0649 +FC10 <isolated> 062A 064A +FC11 <isolated> 062B 062C +FC12 <isolated> 062B 0645 +FC13 <isolated> 062B 0649 +FC14 <isolated> 062B 064A +FC15 <isolated> 062C 062D +FC16 <isolated> 062C 0645 +FC17 <isolated> 062D 062C +FC18 <isolated> 062D 0645 +FC19 <isolated> 062E 062C +FC1A <isolated> 062E 062D +FC1B <isolated> 062E 0645 +FC1C <isolated> 0633 062C +FC1D <isolated> 0633 062D +FC1E <isolated> 0633 062E +FC1F <isolated> 0633 0645 +FC20 <isolated> 0635 062D +FC21 <isolated> 0635 0645 +FC22 <isolated> 0636 062C +FC23 <isolated> 0636 062D +FC24 <isolated> 0636 062E +FC25 <isolated> 0636 0645 +FC26 <isolated> 0637 062D +FC27 <isolated> 0637 0645 +FC28 <isolated> 0638 0645 +FC29 <isolated> 0639 062C +FC2A <isolated> 0639 0645 +FC2B <isolated> 063A 062C +FC2C <isolated> 063A 0645 +FC2D <isolated> 0641 062C +FC2E <isolated> 0641 062D +FC2F <isolated> 0641 062E +FC30 <isolated> 0641 0645 +FC31 <isolated> 0641 0649 +FC32 <isolated> 0641 064A +FC33 <isolated> 0642 062D +FC34 <isolated> 0642 0645 +FC35 <isolated> 0642 0649 +FC36 <isolated> 0642 064A +FC37 <isolated> 0643 0627 +FC38 <isolated> 0643 062C +FC39 <isolated> 0643 062D +FC3A <isolated> 0643 062E +FC3B <isolated> 0643 0644 +FC3C <isolated> 0643 0645 +FC3D <isolated> 0643 0649 +FC3E <isolated> 0643 064A +FC3F <isolated> 0644 062C +FC40 <isolated> 0644 062D +FC41 <isolated> 0644 062E +FC42 <isolated> 0644 0645 +FC43 <isolated> 0644 0649 +FC44 <isolated> 0644 064A +FC45 <isolated> 0645 062C +FC46 <isolated> 0645 062D +FC47 <isolated> 0645 062E +FC48 <isolated> 0645 0645 +FC49 <isolated> 0645 0649 +FC4A <isolated> 0645 064A +FC4B <isolated> 0646 062C +FC4C <isolated> 0646 062D +FC4D <isolated> 0646 062E +FC4E <isolated> 0646 0645 +FC4F <isolated> 0646 0649 +FC50 <isolated> 0646 064A +FC51 <isolated> 0647 062C +FC52 <isolated> 0647 0645 +FC53 <isolated> 0647 0649 +FC54 <isolated> 0647 064A +FC55 <isolated> 064A 062C +FC56 <isolated> 064A 062D +FC57 <isolated> 064A 062E +FC58 <isolated> 064A 0645 +FC59 <isolated> 064A 0649 +FC5A <isolated> 064A 064A +FC5B <isolated> 0630 0670 +FC5C <isolated> 0631 0670 +FC5D <isolated> 0649 0670 +FC5E <isolated> 0020 064C 0651 +FC5F <isolated> 0020 064D 0651 +FC60 <isolated> 0020 064E 0651 +FC61 <isolated> 0020 064F 0651 +FC62 <isolated> 0020 0650 0651 +FC63 <isolated> 0020 0651 0670 +FC64 <final> 0626 0631 +FC65 <final> 0626 0632 +FC66 <final> 0626 0645 +FC67 <final> 0626 0646 +FC68 <final> 0626 0649 +FC69 <final> 0626 064A +FC6A <final> 0628 0631 +FC6B <final> 0628 0632 +FC6C <final> 0628 0645 +FC6D <final> 0628 0646 +FC6E <final> 0628 0649 +FC6F <final> 0628 064A +FC70 <final> 062A 0631 +FC71 <final> 062A 0632 +FC72 <final> 062A 0645 +FC73 <final> 062A 0646 +FC74 <final> 062A 0649 +FC75 <final> 062A 064A +FC76 <final> 062B 0631 +FC77 <final> 062B 0632 +FC78 <final> 062B 0645 +FC79 <final> 062B 0646 +FC7A <final> 062B 0649 +FC7B <final> 062B 064A +FC7C <final> 0641 0649 +FC7D <final> 0641 064A +FC7E <final> 0642 0649 +FC7F <final> 0642 064A +FC80 <final> 0643 0627 +FC81 <final> 0643 0644 +FC82 <final> 0643 0645 +FC83 <final> 0643 0649 +FC84 <final> 0643 064A +FC85 <final> 0644 0645 +FC86 <final> 0644 0649 +FC87 <final> 0644 064A +FC88 <final> 0645 0627 +FC89 <final> 0645 0645 +FC8A <final> 0646 0631 +FC8B <final> 0646 0632 +FC8C <final> 0646 0645 +FC8D <final> 0646 0646 +FC8E <final> 0646 0649 +FC8F <final> 0646 064A +FC90 <final> 0649 0670 +FC91 <final> 064A 0631 +FC92 <final> 064A 0632 +FC93 <final> 064A 0645 +FC94 <final> 064A 0646 +FC95 <final> 064A 0649 +FC96 <final> 064A 064A +FC97 <initial> 0626 062C +FC98 <initial> 0626 062D +FC99 <initial> 0626 062E +FC9A <initial> 0626 0645 +FC9B <initial> 0626 0647 +FC9C <initial> 0628 062C +FC9D <initial> 0628 062D +FC9E <initial> 0628 062E +FC9F <initial> 0628 0645 +FCA0 <initial> 0628 0647 +FCA1 <initial> 062A 062C +FCA2 <initial> 062A 062D +FCA3 <initial> 062A 062E +FCA4 <initial> 062A 0645 +FCA5 <initial> 062A 0647 +FCA6 <initial> 062B 0645 +FCA7 <initial> 062C 062D +FCA8 <initial> 062C 0645 +FCA9 <initial> 062D 062C +FCAA <initial> 062D 0645 +FCAB <initial> 062E 062C +FCAC <initial> 062E 0645 +FCAD <initial> 0633 062C +FCAE <initial> 0633 062D +FCAF <initial> 0633 062E +FCB0 <initial> 0633 0645 +FCB1 <initial> 0635 062D +FCB2 <initial> 0635 062E +FCB3 <initial> 0635 0645 +FCB4 <initial> 0636 062C +FCB5 <initial> 0636 062D +FCB6 <initial> 0636 062E +FCB7 <initial> 0636 0645 +FCB8 <initial> 0637 062D +FCB9 <initial> 0638 0645 +FCBA <initial> 0639 062C +FCBB <initial> 0639 0645 +FCBC <initial> 063A 062C +FCBD <initial> 063A 0645 +FCBE <initial> 0641 062C +FCBF <initial> 0641 062D +FCC0 <initial> 0641 062E +FCC1 <initial> 0641 0645 +FCC2 <initial> 0642 062D +FCC3 <initial> 0642 0645 +FCC4 <initial> 0643 062C +FCC5 <initial> 0643 062D +FCC6 <initial> 0643 062E +FCC7 <initial> 0643 0644 +FCC8 <initial> 0643 0645 +FCC9 <initial> 0644 062C +FCCA <initial> 0644 062D +FCCB <initial> 0644 062E +FCCC <initial> 0644 0645 +FCCD <initial> 0644 0647 +FCCE <initial> 0645 062C +FCCF <initial> 0645 062D +FCD0 <initial> 0645 062E +FCD1 <initial> 0645 0645 +FCD2 <initial> 0646 062C +FCD3 <initial> 0646 062D +FCD4 <initial> 0646 062E +FCD5 <initial> 0646 0645 +FCD6 <initial> 0646 0647 +FCD7 <initial> 0647 062C +FCD8 <initial> 0647 0645 +FCD9 <initial> 0647 0670 +FCDA <initial> 064A 062C +FCDB <initial> 064A 062D +FCDC <initial> 064A 062E +FCDD <initial> 064A 0645 +FCDE <initial> 064A 0647 +FCDF <medial> 0626 0645 +FCE0 <medial> 0626 0647 +FCE1 <medial> 0628 0645 +FCE2 <medial> 0628 0647 +FCE3 <medial> 062A 0645 +FCE4 <medial> 062A 0647 +FCE5 <medial> 062B 0645 +FCE6 <medial> 062B 0647 +FCE7 <medial> 0633 0645 +FCE8 <medial> 0633 0647 +FCE9 <medial> 0634 0645 +FCEA <medial> 0634 0647 +FCEB <medial> 0643 0644 +FCEC <medial> 0643 0645 +FCED <medial> 0644 0645 +FCEE <medial> 0646 0645 +FCEF <medial> 0646 0647 +FCF0 <medial> 064A 0645 +FCF1 <medial> 064A 0647 +FCF2 <medial> 0640 064E 0651 +FCF3 <medial> 0640 064F 0651 +FCF4 <medial> 0640 0650 0651 +FCF5 <isolated> 0637 0649 +FCF6 <isolated> 0637 064A +FCF7 <isolated> 0639 0649 +FCF8 <isolated> 0639 064A +FCF9 <isolated> 063A 0649 +FCFA <isolated> 063A 064A +FCFB <isolated> 0633 0649 +FCFC <isolated> 0633 064A +FCFD <isolated> 0634 0649 +FCFE <isolated> 0634 064A +FCFF <isolated> 062D 0649 +FD00 <isolated> 062D 064A +FD01 <isolated> 062C 0649 +FD02 <isolated> 062C 064A +FD03 <isolated> 062E 0649 +FD04 <isolated> 062E 064A +FD05 <isolated> 0635 0649 +FD06 <isolated> 0635 064A +FD07 <isolated> 0636 0649 +FD08 <isolated> 0636 064A +FD09 <isolated> 0634 062C +FD0A <isolated> 0634 062D +FD0B <isolated> 0634 062E +FD0C <isolated> 0634 0645 +FD0D <isolated> 0634 0631 +FD0E <isolated> 0633 0631 +FD0F <isolated> 0635 0631 +FD10 <isolated> 0636 0631 +FD11 <final> 0637 0649 +FD12 <final> 0637 064A +FD13 <final> 0639 0649 +FD14 <final> 0639 064A +FD15 <final> 063A 0649 +FD16 <final> 063A 064A +FD17 <final> 0633 0649 +FD18 <final> 0633 064A +FD19 <final> 0634 0649 +FD1A <final> 0634 064A +FD1B <final> 062D 0649 +FD1C <final> 062D 064A +FD1D <final> 062C 0649 +FD1E <final> 062C 064A +FD1F <final> 062E 0649 +FD20 <final> 062E 064A +FD21 <final> 0635 0649 +FD22 <final> 0635 064A +FD23 <final> 0636 0649 +FD24 <final> 0636 064A +FD25 <final> 0634 062C +FD26 <final> 0634 062D +FD27 <final> 0634 062E +FD28 <final> 0634 0645 +FD29 <final> 0634 0631 +FD2A <final> 0633 0631 +FD2B <final> 0635 0631 +FD2C <final> 0636 0631 +FD2D <initial> 0634 062C +FD2E <initial> 0634 062D +FD2F <initial> 0634 062E +FD30 <initial> 0634 0645 +FD31 <initial> 0633 0647 +FD32 <initial> 0634 0647 +FD33 <initial> 0637 0645 +FD34 <medial> 0633 062C +FD35 <medial> 0633 062D +FD36 <medial> 0633 062E +FD37 <medial> 0634 062C +FD38 <medial> 0634 062D +FD39 <medial> 0634 062E +FD3A <medial> 0637 0645 +FD3B <medial> 0638 0645 +FD3C <final> 0627 064B +FD3D <isolated> 0627 064B +FD50 <initial> 062A 062C 0645 +FD51 <final> 062A 062D 062C +FD52 <initial> 062A 062D 062C +FD53 <initial> 062A 062D 0645 +FD54 <initial> 062A 062E 0645 +FD55 <initial> 062A 0645 062C +FD56 <initial> 062A 0645 062D +FD57 <initial> 062A 0645 062E +FD58 <final> 062C 0645 062D +FD59 <initial> 062C 0645 062D +FD5A <final> 062D 0645 064A +FD5B <final> 062D 0645 0649 +FD5C <initial> 0633 062D 062C +FD5D <initial> 0633 062C 062D +FD5E <final> 0633 062C 0649 +FD5F <final> 0633 0645 062D +FD60 <initial> 0633 0645 062D +FD61 <initial> 0633 0645 062C +FD62 <final> 0633 0645 0645 +FD63 <initial> 0633 0645 0645 +FD64 <final> 0635 062D 062D +FD65 <initial> 0635 062D 062D +FD66 <final> 0635 0645 0645 +FD67 <final> 0634 062D 0645 +FD68 <initial> 0634 062D 0645 +FD69 <final> 0634 062C 064A +FD6A <final> 0634 0645 062E +FD6B <initial> 0634 0645 062E +FD6C <final> 0634 0645 0645 +FD6D <initial> 0634 0645 0645 +FD6E <final> 0636 062D 0649 +FD6F <final> 0636 062E 0645 +FD70 <initial> 0636 062E 0645 +FD71 <final> 0637 0645 062D +FD72 <initial> 0637 0645 062D +FD73 <initial> 0637 0645 0645 +FD74 <final> 0637 0645 064A +FD75 <final> 0639 062C 0645 +FD76 <final> 0639 0645 0645 +FD77 <initial> 0639 0645 0645 +FD78 <final> 0639 0645 0649 +FD79 <final> 063A 0645 0645 +FD7A <final> 063A 0645 064A +FD7B <final> 063A 0645 0649 +FD7C <final> 0641 062E 0645 +FD7D <initial> 0641 062E 0645 +FD7E <final> 0642 0645 062D +FD7F <final> 0642 0645 0645 +FD80 <final> 0644 062D 0645 +FD81 <final> 0644 062D 064A +FD82 <final> 0644 062D 0649 +FD83 <initial> 0644 062C 062C +FD84 <final> 0644 062C 062C +FD85 <final> 0644 062E 0645 +FD86 <initial> 0644 062E 0645 +FD87 <final> 0644 0645 062D +FD88 <initial> 0644 0645 062D +FD89 <initial> 0645 062D 062C +FD8A <initial> 0645 062D 0645 +FD8B <final> 0645 062D 064A +FD8C <initial> 0645 062C 062D +FD8D <initial> 0645 062C 0645 +FD8E <initial> 0645 062E 062C +FD8F <initial> 0645 062E 0645 +FD92 <initial> 0645 062C 062E +FD93 <initial> 0647 0645 062C +FD94 <initial> 0647 0645 0645 +FD95 <initial> 0646 062D 0645 +FD96 <final> 0646 062D 0649 +FD97 <final> 0646 062C 0645 +FD98 <initial> 0646 062C 0645 +FD99 <final> 0646 062C 0649 +FD9A <final> 0646 0645 064A +FD9B <final> 0646 0645 0649 +FD9C <final> 064A 0645 0645 +FD9D <initial> 064A 0645 0645 +FD9E <final> 0628 062E 064A +FD9F <final> 062A 062C 064A +FDA0 <final> 062A 062C 0649 +FDA1 <final> 062A 062E 064A +FDA2 <final> 062A 062E 0649 +FDA3 <final> 062A 0645 064A +FDA4 <final> 062A 0645 0649 +FDA5 <final> 062C 0645 064A +FDA6 <final> 062C 062D 0649 +FDA7 <final> 062C 0645 0649 +FDA8 <final> 0633 062E 0649 +FDA9 <final> 0635 062D 064A +FDAA <final> 0634 062D 064A +FDAB <final> 0636 062D 064A +FDAC <final> 0644 062C 064A +FDAD <final> 0644 0645 064A +FDAE <final> 064A 062D 064A +FDAF <final> 064A 062C 064A +FDB0 <final> 064A 0645 064A +FDB1 <final> 0645 0645 064A +FDB2 <final> 0642 0645 064A +FDB3 <final> 0646 062D 064A +FDB4 <initial> 0642 0645 062D +FDB5 <initial> 0644 062D 0645 +FDB6 <final> 0639 0645 064A +FDB7 <final> 0643 0645 064A +FDB8 <initial> 0646 062C 062D +FDB9 <final> 0645 062E 064A +FDBA <initial> 0644 062C 0645 +FDBB <final> 0643 0645 0645 +FDBC <final> 0644 062C 0645 +FDBD <final> 0646 062C 062D +FDBE <final> 062C 062D 064A +FDBF <final> 062D 062C 064A +FDC0 <final> 0645 062C 064A +FDC1 <final> 0641 0645 064A +FDC2 <final> 0628 062D 064A +FDC3 <initial> 0643 0645 0645 +FDC4 <initial> 0639 062C 0645 +FDC5 <initial> 0635 0645 0645 +FDC6 <final> 0633 062E 064A +FDC7 <final> 0646 062C 064A +FDF0 <isolated> 0635 0644 06D2 +FDF1 <isolated> 0642 0644 06D2 +FDF2 <isolated> 0627 0644 0644 0647 +FDF3 <isolated> 0627 0643 0628 0631 +FDF4 <isolated> 0645 062D 0645 062F +FDF5 <isolated> 0635 0644 0639 0645 +FDF6 <isolated> 0631 0633 0648 0644 +FDF7 <isolated> 0639 0644 064A 0647 +FDF8 <isolated> 0648 0633 0644 0645 +FDF9 <isolated> 0635 0644 0649 +FDFA <isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645 +FDFB <isolated> 062C 0644 0020 062C 0644 0627 0644 0647 +FDFC <isolated> 0631 06CC 0627 0644 +FE10 <vertical> 002C +FE11 <vertical> 3001 +FE12 <vertical> 3002 +FE13 <vertical> 003A +FE14 <vertical> 003B +FE15 <vertical> 0021 +FE16 <vertical> 003F +FE17 <vertical> 3016 +FE18 <vertical> 3017 +FE19 <vertical> 2026 +FE30 <vertical> 2025 +FE31 <vertical> 2014 +FE32 <vertical> 2013 +FE33 FE34 <vertical> 005F +FE35 <vertical> 0028 +FE36 <vertical> 0029 +FE37 <vertical> 007B +FE38 <vertical> 007D +FE39 <vertical> 3014 +FE3A <vertical> 3015 +FE3B <vertical> 3010 +FE3C <vertical> 3011 +FE3D <vertical> 300A +FE3E <vertical> 300B +FE3F <vertical> 3008 +FE40 <vertical> 3009 +FE41 <vertical> 300C +FE42 <vertical> 300D +FE43 <vertical> 300E +FE44 <vertical> 300F +FE47 <vertical> 005B +FE48 <vertical> 005D +FE49 FE4C <compat> 203E +FE4D FE4F <compat> 005F +FE50 <small> 002C +FE51 <small> 3001 +FE52 <small> 002E +FE54 <small> 003B +FE55 <small> 003A +FE56 <small> 003F +FE57 <small> 0021 +FE58 <small> 2014 +FE59 <small> 0028 +FE5A <small> 0029 +FE5B <small> 007B +FE5C <small> 007D +FE5D <small> 3014 +FE5E <small> 3015 +FE5F <small> 0023 +FE60 <small> 0026 +FE61 <small> 002A +FE62 <small> 002B +FE63 <small> 002D +FE64 <small> 003C +FE65 <small> 003E +FE66 <small> 003D +FE68 <small> 005C +FE69 <small> 0024 +FE6A <small> 0025 +FE6B <small> 0040 +FE70 <isolated> 0020 064B +FE71 <medial> 0640 064B +FE72 <isolated> 0020 064C +FE74 <isolated> 0020 064D +FE76 <isolated> 0020 064E +FE77 <medial> 0640 064E +FE78 <isolated> 0020 064F +FE79 <medial> 0640 064F +FE7A <isolated> 0020 0650 +FE7B <medial> 0640 0650 +FE7C <isolated> 0020 0651 +FE7D <medial> 0640 0651 +FE7E <isolated> 0020 0652 +FE7F <medial> 0640 0652 +FE80 <isolated> 0621 +FE81 <isolated> 0622 +FE82 <final> 0622 +FE83 <isolated> 0623 +FE84 <final> 0623 +FE85 <isolated> 0624 +FE86 <final> 0624 +FE87 <isolated> 0625 +FE88 <final> 0625 +FE89 <isolated> 0626 +FE8A <final> 0626 +FE8B <initial> 0626 +FE8C <medial> 0626 +FE8D <isolated> 0627 +FE8E <final> 0627 +FE8F <isolated> 0628 +FE90 <final> 0628 +FE91 <initial> 0628 +FE92 <medial> 0628 +FE93 <isolated> 0629 +FE94 <final> 0629 +FE95 <isolated> 062A +FE96 <final> 062A +FE97 <initial> 062A +FE98 <medial> 062A +FE99 <isolated> 062B +FE9A <final> 062B +FE9B <initial> 062B +FE9C <medial> 062B +FE9D <isolated> 062C +FE9E <final> 062C +FE9F <initial> 062C +FEA0 <medial> 062C +FEA1 <isolated> 062D +FEA2 <final> 062D +FEA3 <initial> 062D +FEA4 <medial> 062D +FEA5 <isolated> 062E +FEA6 <final> 062E +FEA7 <initial> 062E +FEA8 <medial> 062E +FEA9 <isolated> 062F +FEAA <final> 062F +FEAB <isolated> 0630 +FEAC <final> 0630 +FEAD <isolated> 0631 +FEAE <final> 0631 +FEAF <isolated> 0632 +FEB0 <final> 0632 +FEB1 <isolated> 0633 +FEB2 <final> 0633 +FEB3 <initial> 0633 +FEB4 <medial> 0633 +FEB5 <isolated> 0634 +FEB6 <final> 0634 +FEB7 <initial> 0634 +FEB8 <medial> 0634 +FEB9 <isolated> 0635 +FEBA <final> 0635 +FEBB <initial> 0635 +FEBC <medial> 0635 +FEBD <isolated> 0636 +FEBE <final> 0636 +FEBF <initial> 0636 +FEC0 <medial> 0636 +FEC1 <isolated> 0637 +FEC2 <final> 0637 +FEC3 <initial> 0637 +FEC4 <medial> 0637 +FEC5 <isolated> 0638 +FEC6 <final> 0638 +FEC7 <initial> 0638 +FEC8 <medial> 0638 +FEC9 <isolated> 0639 +FECA <final> 0639 +FECB <initial> 0639 +FECC <medial> 0639 +FECD <isolated> 063A +FECE <final> 063A +FECF <initial> 063A +FED0 <medial> 063A +FED1 <isolated> 0641 +FED2 <final> 0641 +FED3 <initial> 0641 +FED4 <medial> 0641 +FED5 <isolated> 0642 +FED6 <final> 0642 +FED7 <initial> 0642 +FED8 <medial> 0642 +FED9 <isolated> 0643 +FEDA <final> 0643 +FEDB <initial> 0643 +FEDC <medial> 0643 +FEDD <isolated> 0644 +FEDE <final> 0644 +FEDF <initial> 0644 +FEE0 <medial> 0644 +FEE1 <isolated> 0645 +FEE2 <final> 0645 +FEE3 <initial> 0645 +FEE4 <medial> 0645 +FEE5 <isolated> 0646 +FEE6 <final> 0646 +FEE7 <initial> 0646 +FEE8 <medial> 0646 +FEE9 <isolated> 0647 +FEEA <final> 0647 +FEEB <initial> 0647 +FEEC <medial> 0647 +FEED <isolated> 0648 +FEEE <final> 0648 +FEEF <isolated> 0649 +FEF0 <final> 0649 +FEF1 <isolated> 064A +FEF2 <final> 064A +FEF3 <initial> 064A +FEF4 <medial> 064A +FEF5 <isolated> 0644 0622 +FEF6 <final> 0644 0622 +FEF7 <isolated> 0644 0623 +FEF8 <final> 0644 0623 +FEF9 <isolated> 0644 0625 +FEFA <final> 0644 0625 +FEFB <isolated> 0644 0627 +FEFC <final> 0644 0627 +FF01 <wide> 0021 +FF02 <wide> 0022 +FF03 <wide> 0023 +FF04 <wide> 0024 +FF05 <wide> 0025 +FF06 <wide> 0026 +FF07 <wide> 0027 +FF08 <wide> 0028 +FF09 <wide> 0029 +FF0A <wide> 002A +FF0B <wide> 002B +FF0C <wide> 002C +FF0D <wide> 002D +FF0E <wide> 002E +FF0F <wide> 002F +FF10 <wide> 0030 +FF11 <wide> 0031 +FF12 <wide> 0032 +FF13 <wide> 0033 +FF14 <wide> 0034 +FF15 <wide> 0035 +FF16 <wide> 0036 +FF17 <wide> 0037 +FF18 <wide> 0038 +FF19 <wide> 0039 +FF1A <wide> 003A +FF1B <wide> 003B +FF1C <wide> 003C +FF1D <wide> 003D +FF1E <wide> 003E +FF1F <wide> 003F +FF20 <wide> 0040 +FF21 <wide> 0041 +FF22 <wide> 0042 +FF23 <wide> 0043 +FF24 <wide> 0044 +FF25 <wide> 0045 +FF26 <wide> 0046 +FF27 <wide> 0047 +FF28 <wide> 0048 +FF29 <wide> 0049 +FF2A <wide> 004A +FF2B <wide> 004B +FF2C <wide> 004C +FF2D <wide> 004D +FF2E <wide> 004E +FF2F <wide> 004F +FF30 <wide> 0050 +FF31 <wide> 0051 +FF32 <wide> 0052 +FF33 <wide> 0053 +FF34 <wide> 0054 +FF35 <wide> 0055 +FF36 <wide> 0056 +FF37 <wide> 0057 +FF38 <wide> 0058 +FF39 <wide> 0059 +FF3A <wide> 005A +FF3B <wide> 005B +FF3C <wide> 005C +FF3D <wide> 005D +FF3E <wide> 005E +FF3F <wide> 005F +FF40 <wide> 0060 +FF41 <wide> 0061 +FF42 <wide> 0062 +FF43 <wide> 0063 +FF44 <wide> 0064 +FF45 <wide> 0065 +FF46 <wide> 0066 +FF47 <wide> 0067 +FF48 <wide> 0068 +FF49 <wide> 0069 +FF4A <wide> 006A +FF4B <wide> 006B +FF4C <wide> 006C +FF4D <wide> 006D +FF4E <wide> 006E +FF4F <wide> 006F +FF50 <wide> 0070 +FF51 <wide> 0071 +FF52 <wide> 0072 +FF53 <wide> 0073 +FF54 <wide> 0074 +FF55 <wide> 0075 +FF56 <wide> 0076 +FF57 <wide> 0077 +FF58 <wide> 0078 +FF59 <wide> 0079 +FF5A <wide> 007A +FF5B <wide> 007B +FF5C <wide> 007C +FF5D <wide> 007D +FF5E <wide> 007E +FF5F <wide> 2985 +FF60 <wide> 2986 +FF61 <narrow> 3002 +FF62 <narrow> 300C +FF63 <narrow> 300D +FF64 <narrow> 3001 +FF65 <narrow> 30FB +FF66 <narrow> 30F2 +FF67 <narrow> 30A1 +FF68 <narrow> 30A3 +FF69 <narrow> 30A5 +FF6A <narrow> 30A7 +FF6B <narrow> 30A9 +FF6C <narrow> 30E3 +FF6D <narrow> 30E5 +FF6E <narrow> 30E7 +FF6F <narrow> 30C3 +FF70 <narrow> 30FC +FF71 <narrow> 30A2 +FF72 <narrow> 30A4 +FF73 <narrow> 30A6 +FF74 <narrow> 30A8 +FF75 <narrow> 30AA +FF76 <narrow> 30AB +FF77 <narrow> 30AD +FF78 <narrow> 30AF +FF79 <narrow> 30B1 +FF7A <narrow> 30B3 +FF7B <narrow> 30B5 +FF7C <narrow> 30B7 +FF7D <narrow> 30B9 +FF7E <narrow> 30BB +FF7F <narrow> 30BD +FF80 <narrow> 30BF +FF81 <narrow> 30C1 +FF82 <narrow> 30C4 +FF83 <narrow> 30C6 +FF84 <narrow> 30C8 +FF85 <narrow> 30CA +FF86 <narrow> 30CB +FF87 <narrow> 30CC +FF88 <narrow> 30CD +FF89 <narrow> 30CE +FF8A <narrow> 30CF +FF8B <narrow> 30D2 +FF8C <narrow> 30D5 +FF8D <narrow> 30D8 +FF8E <narrow> 30DB +FF8F <narrow> 30DE +FF90 <narrow> 30DF +FF91 <narrow> 30E0 +FF92 <narrow> 30E1 +FF93 <narrow> 30E2 +FF94 <narrow> 30E4 +FF95 <narrow> 30E6 +FF96 <narrow> 30E8 +FF97 <narrow> 30E9 +FF98 <narrow> 30EA +FF99 <narrow> 30EB +FF9A <narrow> 30EC +FF9B <narrow> 30ED +FF9C <narrow> 30EF +FF9D <narrow> 30F3 +FF9E <narrow> 3099 +FF9F <narrow> 309A +FFA0 <narrow> 3164 +FFA1 <narrow> 3131 +FFA2 <narrow> 3132 +FFA3 <narrow> 3133 +FFA4 <narrow> 3134 +FFA5 <narrow> 3135 +FFA6 <narrow> 3136 +FFA7 <narrow> 3137 +FFA8 <narrow> 3138 +FFA9 <narrow> 3139 +FFAA <narrow> 313A +FFAB <narrow> 313B +FFAC <narrow> 313C +FFAD <narrow> 313D +FFAE <narrow> 313E +FFAF <narrow> 313F +FFB0 <narrow> 3140 +FFB1 <narrow> 3141 +FFB2 <narrow> 3142 +FFB3 <narrow> 3143 +FFB4 <narrow> 3144 +FFB5 <narrow> 3145 +FFB6 <narrow> 3146 +FFB7 <narrow> 3147 +FFB8 <narrow> 3148 +FFB9 <narrow> 3149 +FFBA <narrow> 314A +FFBB <narrow> 314B +FFBC <narrow> 314C +FFBD <narrow> 314D +FFBE <narrow> 314E +FFC2 <narrow> 314F +FFC3 <narrow> 3150 +FFC4 <narrow> 3151 +FFC5 <narrow> 3152 +FFC6 <narrow> 3153 +FFC7 <narrow> 3154 +FFCA <narrow> 3155 +FFCB <narrow> 3156 +FFCC <narrow> 3157 +FFCD <narrow> 3158 +FFCE <narrow> 3159 +FFCF <narrow> 315A +FFD2 <narrow> 315B +FFD3 <narrow> 315C +FFD4 <narrow> 315D +FFD5 <narrow> 315E +FFD6 <narrow> 315F +FFD7 <narrow> 3160 +FFDA <narrow> 3161 +FFDB <narrow> 3162 +FFDC <narrow> 3163 +FFE0 <wide> 00A2 +FFE1 <wide> 00A3 +FFE2 <wide> 00AC +FFE3 <wide> 00AF +FFE4 <wide> 00A6 +FFE5 <wide> 00A5 +FFE6 <wide> 20A9 +FFE8 <narrow> 2502 +FFE9 <narrow> 2190 +FFEA <narrow> 2191 +FFEB <narrow> 2192 +FFEC <narrow> 2193 +FFED <narrow> 25A0 +FFEE <narrow> 25CB +1109A 11099 110BA +1109C 1109B 110BA +110AB 110A5 110BA +1112E 11131 11127 +1112F 11132 11127 +1134B 11347 1133E +1134C 11347 11357 +114BB 114B9 114BA +114BC 114B9 114B0 +114BE 114B9 114BD +115BA 115B8 115AF +115BB 115B9 115AF +1D15E 1D157 1D165 +1D15F 1D158 1D165 +1D160 1D15F 1D16E +1D161 1D15F 1D16F +1D162 1D15F 1D170 +1D163 1D15F 1D171 +1D164 1D15F 1D172 +1D1BB 1D1B9 1D165 +1D1BC 1D1BA 1D165 +1D1BD 1D1BB 1D16E +1D1BE 1D1BC 1D16E +1D1BF 1D1BB 1D16F +1D1C0 1D1BC 1D16F +1D400 <font> 0041 +1D401 <font> 0042 +1D402 <font> 0043 +1D403 <font> 0044 +1D404 <font> 0045 +1D405 <font> 0046 +1D406 <font> 0047 +1D407 <font> 0048 +1D408 <font> 0049 +1D409 <font> 004A +1D40A <font> 004B +1D40B <font> 004C +1D40C <font> 004D +1D40D <font> 004E +1D40E <font> 004F +1D40F <font> 0050 +1D410 <font> 0051 +1D411 <font> 0052 +1D412 <font> 0053 +1D413 <font> 0054 +1D414 <font> 0055 +1D415 <font> 0056 +1D416 <font> 0057 +1D417 <font> 0058 +1D418 <font> 0059 +1D419 <font> 005A +1D41A <font> 0061 +1D41B <font> 0062 +1D41C <font> 0063 +1D41D <font> 0064 +1D41E <font> 0065 +1D41F <font> 0066 +1D420 <font> 0067 +1D421 <font> 0068 +1D422 <font> 0069 +1D423 <font> 006A +1D424 <font> 006B +1D425 <font> 006C +1D426 <font> 006D +1D427 <font> 006E +1D428 <font> 006F +1D429 <font> 0070 +1D42A <font> 0071 +1D42B <font> 0072 +1D42C <font> 0073 +1D42D <font> 0074 +1D42E <font> 0075 +1D42F <font> 0076 +1D430 <font> 0077 +1D431 <font> 0078 +1D432 <font> 0079 +1D433 <font> 007A +1D434 <font> 0041 +1D435 <font> 0042 +1D436 <font> 0043 +1D437 <font> 0044 +1D438 <font> 0045 +1D439 <font> 0046 +1D43A <font> 0047 +1D43B <font> 0048 +1D43C <font> 0049 +1D43D <font> 004A +1D43E <font> 004B +1D43F <font> 004C +1D440 <font> 004D +1D441 <font> 004E +1D442 <font> 004F +1D443 <font> 0050 +1D444 <font> 0051 +1D445 <font> 0052 +1D446 <font> 0053 +1D447 <font> 0054 +1D448 <font> 0055 +1D449 <font> 0056 +1D44A <font> 0057 +1D44B <font> 0058 +1D44C <font> 0059 +1D44D <font> 005A +1D44E <font> 0061 +1D44F <font> 0062 +1D450 <font> 0063 +1D451 <font> 0064 +1D452 <font> 0065 +1D453 <font> 0066 +1D454 <font> 0067 +1D456 <font> 0069 +1D457 <font> 006A +1D458 <font> 006B +1D459 <font> 006C +1D45A <font> 006D +1D45B <font> 006E +1D45C <font> 006F +1D45D <font> 0070 +1D45E <font> 0071 +1D45F <font> 0072 +1D460 <font> 0073 +1D461 <font> 0074 +1D462 <font> 0075 +1D463 <font> 0076 +1D464 <font> 0077 +1D465 <font> 0078 +1D466 <font> 0079 +1D467 <font> 007A +1D468 <font> 0041 +1D469 <font> 0042 +1D46A <font> 0043 +1D46B <font> 0044 +1D46C <font> 0045 +1D46D <font> 0046 +1D46E <font> 0047 +1D46F <font> 0048 +1D470 <font> 0049 +1D471 <font> 004A +1D472 <font> 004B +1D473 <font> 004C +1D474 <font> 004D +1D475 <font> 004E +1D476 <font> 004F +1D477 <font> 0050 +1D478 <font> 0051 +1D479 <font> 0052 +1D47A <font> 0053 +1D47B <font> 0054 +1D47C <font> 0055 +1D47D <font> 0056 +1D47E <font> 0057 +1D47F <font> 0058 +1D480 <font> 0059 +1D481 <font> 005A +1D482 <font> 0061 +1D483 <font> 0062 +1D484 <font> 0063 +1D485 <font> 0064 +1D486 <font> 0065 +1D487 <font> 0066 +1D488 <font> 0067 +1D489 <font> 0068 +1D48A <font> 0069 +1D48B <font> 006A +1D48C <font> 006B +1D48D <font> 006C +1D48E <font> 006D +1D48F <font> 006E +1D490 <font> 006F +1D491 <font> 0070 +1D492 <font> 0071 +1D493 <font> 0072 +1D494 <font> 0073 +1D495 <font> 0074 +1D496 <font> 0075 +1D497 <font> 0076 +1D498 <font> 0077 +1D499 <font> 0078 +1D49A <font> 0079 +1D49B <font> 007A +1D49C <font> 0041 +1D49E <font> 0043 +1D49F <font> 0044 +1D4A2 <font> 0047 +1D4A5 <font> 004A +1D4A6 <font> 004B +1D4A9 <font> 004E +1D4AA <font> 004F +1D4AB <font> 0050 +1D4AC <font> 0051 +1D4AE <font> 0053 +1D4AF <font> 0054 +1D4B0 <font> 0055 +1D4B1 <font> 0056 +1D4B2 <font> 0057 +1D4B3 <font> 0058 +1D4B4 <font> 0059 +1D4B5 <font> 005A +1D4B6 <font> 0061 +1D4B7 <font> 0062 +1D4B8 <font> 0063 +1D4B9 <font> 0064 +1D4BB <font> 0066 +1D4BD <font> 0068 +1D4BE <font> 0069 +1D4BF <font> 006A +1D4C0 <font> 006B +1D4C1 <font> 006C +1D4C2 <font> 006D +1D4C3 <font> 006E +1D4C5 <font> 0070 +1D4C6 <font> 0071 +1D4C7 <font> 0072 +1D4C8 <font> 0073 +1D4C9 <font> 0074 +1D4CA <font> 0075 +1D4CB <font> 0076 +1D4CC <font> 0077 +1D4CD <font> 0078 +1D4CE <font> 0079 +1D4CF <font> 007A +1D4D0 <font> 0041 +1D4D1 <font> 0042 +1D4D2 <font> 0043 +1D4D3 <font> 0044 +1D4D4 <font> 0045 +1D4D5 <font> 0046 +1D4D6 <font> 0047 +1D4D7 <font> 0048 +1D4D8 <font> 0049 +1D4D9 <font> 004A +1D4DA <font> 004B +1D4DB <font> 004C +1D4DC <font> 004D +1D4DD <font> 004E +1D4DE <font> 004F +1D4DF <font> 0050 +1D4E0 <font> 0051 +1D4E1 <font> 0052 +1D4E2 <font> 0053 +1D4E3 <font> 0054 +1D4E4 <font> 0055 +1D4E5 <font> 0056 +1D4E6 <font> 0057 +1D4E7 <font> 0058 +1D4E8 <font> 0059 +1D4E9 <font> 005A +1D4EA <font> 0061 +1D4EB <font> 0062 +1D4EC <font> 0063 +1D4ED <font> 0064 +1D4EE <font> 0065 +1D4EF <font> 0066 +1D4F0 <font> 0067 +1D4F1 <font> 0068 +1D4F2 <font> 0069 +1D4F3 <font> 006A +1D4F4 <font> 006B +1D4F5 <font> 006C +1D4F6 <font> 006D +1D4F7 <font> 006E +1D4F8 <font> 006F +1D4F9 <font> 0070 +1D4FA <font> 0071 +1D4FB <font> 0072 +1D4FC <font> 0073 +1D4FD <font> 0074 +1D4FE <font> 0075 +1D4FF <font> 0076 +1D500 <font> 0077 +1D501 <font> 0078 +1D502 <font> 0079 +1D503 <font> 007A +1D504 <font> 0041 +1D505 <font> 0042 +1D507 <font> 0044 +1D508 <font> 0045 +1D509 <font> 0046 +1D50A <font> 0047 +1D50D <font> 004A +1D50E <font> 004B +1D50F <font> 004C +1D510 <font> 004D +1D511 <font> 004E +1D512 <font> 004F +1D513 <font> 0050 +1D514 <font> 0051 +1D516 <font> 0053 +1D517 <font> 0054 +1D518 <font> 0055 +1D519 <font> 0056 +1D51A <font> 0057 +1D51B <font> 0058 +1D51C <font> 0059 +1D51E <font> 0061 +1D51F <font> 0062 +1D520 <font> 0063 +1D521 <font> 0064 +1D522 <font> 0065 +1D523 <font> 0066 +1D524 <font> 0067 +1D525 <font> 0068 +1D526 <font> 0069 +1D527 <font> 006A +1D528 <font> 006B +1D529 <font> 006C +1D52A <font> 006D +1D52B <font> 006E +1D52C <font> 006F +1D52D <font> 0070 +1D52E <font> 0071 +1D52F <font> 0072 +1D530 <font> 0073 +1D531 <font> 0074 +1D532 <font> 0075 +1D533 <font> 0076 +1D534 <font> 0077 +1D535 <font> 0078 +1D536 <font> 0079 +1D537 <font> 007A +1D538 <font> 0041 +1D539 <font> 0042 +1D53B <font> 0044 +1D53C <font> 0045 +1D53D <font> 0046 +1D53E <font> 0047 +1D540 <font> 0049 +1D541 <font> 004A +1D542 <font> 004B +1D543 <font> 004C +1D544 <font> 004D +1D546 <font> 004F +1D54A <font> 0053 +1D54B <font> 0054 +1D54C <font> 0055 +1D54D <font> 0056 +1D54E <font> 0057 +1D54F <font> 0058 +1D550 <font> 0059 +1D552 <font> 0061 +1D553 <font> 0062 +1D554 <font> 0063 +1D555 <font> 0064 +1D556 <font> 0065 +1D557 <font> 0066 +1D558 <font> 0067 +1D559 <font> 0068 +1D55A <font> 0069 +1D55B <font> 006A +1D55C <font> 006B +1D55D <font> 006C +1D55E <font> 006D +1D55F <font> 006E +1D560 <font> 006F +1D561 <font> 0070 +1D562 <font> 0071 +1D563 <font> 0072 +1D564 <font> 0073 +1D565 <font> 0074 +1D566 <font> 0075 +1D567 <font> 0076 +1D568 <font> 0077 +1D569 <font> 0078 +1D56A <font> 0079 +1D56B <font> 007A +1D56C <font> 0041 +1D56D <font> 0042 +1D56E <font> 0043 +1D56F <font> 0044 +1D570 <font> 0045 +1D571 <font> 0046 +1D572 <font> 0047 +1D573 <font> 0048 +1D574 <font> 0049 +1D575 <font> 004A +1D576 <font> 004B +1D577 <font> 004C +1D578 <font> 004D +1D579 <font> 004E +1D57A <font> 004F +1D57B <font> 0050 +1D57C <font> 0051 +1D57D <font> 0052 +1D57E <font> 0053 +1D57F <font> 0054 +1D580 <font> 0055 +1D581 <font> 0056 +1D582 <font> 0057 +1D583 <font> 0058 +1D584 <font> 0059 +1D585 <font> 005A +1D586 <font> 0061 +1D587 <font> 0062 +1D588 <font> 0063 +1D589 <font> 0064 +1D58A <font> 0065 +1D58B <font> 0066 +1D58C <font> 0067 +1D58D <font> 0068 +1D58E <font> 0069 +1D58F <font> 006A +1D590 <font> 006B +1D591 <font> 006C +1D592 <font> 006D +1D593 <font> 006E +1D594 <font> 006F +1D595 <font> 0070 +1D596 <font> 0071 +1D597 <font> 0072 +1D598 <font> 0073 +1D599 <font> 0074 +1D59A <font> 0075 +1D59B <font> 0076 +1D59C <font> 0077 +1D59D <font> 0078 +1D59E <font> 0079 +1D59F <font> 007A +1D5A0 <font> 0041 +1D5A1 <font> 0042 +1D5A2 <font> 0043 +1D5A3 <font> 0044 +1D5A4 <font> 0045 +1D5A5 <font> 0046 +1D5A6 <font> 0047 +1D5A7 <font> 0048 +1D5A8 <font> 0049 +1D5A9 <font> 004A +1D5AA <font> 004B +1D5AB <font> 004C +1D5AC <font> 004D +1D5AD <font> 004E +1D5AE <font> 004F +1D5AF <font> 0050 +1D5B0 <font> 0051 +1D5B1 <font> 0052 +1D5B2 <font> 0053 +1D5B3 <font> 0054 +1D5B4 <font> 0055 +1D5B5 <font> 0056 +1D5B6 <font> 0057 +1D5B7 <font> 0058 +1D5B8 <font> 0059 +1D5B9 <font> 005A +1D5BA <font> 0061 +1D5BB <font> 0062 +1D5BC <font> 0063 +1D5BD <font> 0064 +1D5BE <font> 0065 +1D5BF <font> 0066 +1D5C0 <font> 0067 +1D5C1 <font> 0068 +1D5C2 <font> 0069 +1D5C3 <font> 006A +1D5C4 <font> 006B +1D5C5 <font> 006C +1D5C6 <font> 006D +1D5C7 <font> 006E +1D5C8 <font> 006F +1D5C9 <font> 0070 +1D5CA <font> 0071 +1D5CB <font> 0072 +1D5CC <font> 0073 +1D5CD <font> 0074 +1D5CE <font> 0075 +1D5CF <font> 0076 +1D5D0 <font> 0077 +1D5D1 <font> 0078 +1D5D2 <font> 0079 +1D5D3 <font> 007A +1D5D4 <font> 0041 +1D5D5 <font> 0042 +1D5D6 <font> 0043 +1D5D7 <font> 0044 +1D5D8 <font> 0045 +1D5D9 <font> 0046 +1D5DA <font> 0047 +1D5DB <font> 0048 +1D5DC <font> 0049 +1D5DD <font> 004A +1D5DE <font> 004B +1D5DF <font> 004C +1D5E0 <font> 004D +1D5E1 <font> 004E +1D5E2 <font> 004F +1D5E3 <font> 0050 +1D5E4 <font> 0051 +1D5E5 <font> 0052 +1D5E6 <font> 0053 +1D5E7 <font> 0054 +1D5E8 <font> 0055 +1D5E9 <font> 0056 +1D5EA <font> 0057 +1D5EB <font> 0058 +1D5EC <font> 0059 +1D5ED <font> 005A +1D5EE <font> 0061 +1D5EF <font> 0062 +1D5F0 <font> 0063 +1D5F1 <font> 0064 +1D5F2 <font> 0065 +1D5F3 <font> 0066 +1D5F4 <font> 0067 +1D5F5 <font> 0068 +1D5F6 <font> 0069 +1D5F7 <font> 006A +1D5F8 <font> 006B +1D5F9 <font> 006C +1D5FA <font> 006D +1D5FB <font> 006E +1D5FC <font> 006F +1D5FD <font> 0070 +1D5FE <font> 0071 +1D5FF <font> 0072 +1D600 <font> 0073 +1D601 <font> 0074 +1D602 <font> 0075 +1D603 <font> 0076 +1D604 <font> 0077 +1D605 <font> 0078 +1D606 <font> 0079 +1D607 <font> 007A +1D608 <font> 0041 +1D609 <font> 0042 +1D60A <font> 0043 +1D60B <font> 0044 +1D60C <font> 0045 +1D60D <font> 0046 +1D60E <font> 0047 +1D60F <font> 0048 +1D610 <font> 0049 +1D611 <font> 004A +1D612 <font> 004B +1D613 <font> 004C +1D614 <font> 004D +1D615 <font> 004E +1D616 <font> 004F +1D617 <font> 0050 +1D618 <font> 0051 +1D619 <font> 0052 +1D61A <font> 0053 +1D61B <font> 0054 +1D61C <font> 0055 +1D61D <font> 0056 +1D61E <font> 0057 +1D61F <font> 0058 +1D620 <font> 0059 +1D621 <font> 005A +1D622 <font> 0061 +1D623 <font> 0062 +1D624 <font> 0063 +1D625 <font> 0064 +1D626 <font> 0065 +1D627 <font> 0066 +1D628 <font> 0067 +1D629 <font> 0068 +1D62A <font> 0069 +1D62B <font> 006A +1D62C <font> 006B +1D62D <font> 006C +1D62E <font> 006D +1D62F <font> 006E +1D630 <font> 006F +1D631 <font> 0070 +1D632 <font> 0071 +1D633 <font> 0072 +1D634 <font> 0073 +1D635 <font> 0074 +1D636 <font> 0075 +1D637 <font> 0076 +1D638 <font> 0077 +1D639 <font> 0078 +1D63A <font> 0079 +1D63B <font> 007A +1D63C <font> 0041 +1D63D <font> 0042 +1D63E <font> 0043 +1D63F <font> 0044 +1D640 <font> 0045 +1D641 <font> 0046 +1D642 <font> 0047 +1D643 <font> 0048 +1D644 <font> 0049 +1D645 <font> 004A +1D646 <font> 004B +1D647 <font> 004C +1D648 <font> 004D +1D649 <font> 004E +1D64A <font> 004F +1D64B <font> 0050 +1D64C <font> 0051 +1D64D <font> 0052 +1D64E <font> 0053 +1D64F <font> 0054 +1D650 <font> 0055 +1D651 <font> 0056 +1D652 <font> 0057 +1D653 <font> 0058 +1D654 <font> 0059 +1D655 <font> 005A +1D656 <font> 0061 +1D657 <font> 0062 +1D658 <font> 0063 +1D659 <font> 0064 +1D65A <font> 0065 +1D65B <font> 0066 +1D65C <font> 0067 +1D65D <font> 0068 +1D65E <font> 0069 +1D65F <font> 006A +1D660 <font> 006B +1D661 <font> 006C +1D662 <font> 006D +1D663 <font> 006E +1D664 <font> 006F +1D665 <font> 0070 +1D666 <font> 0071 +1D667 <font> 0072 +1D668 <font> 0073 +1D669 <font> 0074 +1D66A <font> 0075 +1D66B <font> 0076 +1D66C <font> 0077 +1D66D <font> 0078 +1D66E <font> 0079 +1D66F <font> 007A +1D670 <font> 0041 +1D671 <font> 0042 +1D672 <font> 0043 +1D673 <font> 0044 +1D674 <font> 0045 +1D675 <font> 0046 +1D676 <font> 0047 +1D677 <font> 0048 +1D678 <font> 0049 +1D679 <font> 004A +1D67A <font> 004B +1D67B <font> 004C +1D67C <font> 004D +1D67D <font> 004E +1D67E <font> 004F +1D67F <font> 0050 +1D680 <font> 0051 +1D681 <font> 0052 +1D682 <font> 0053 +1D683 <font> 0054 +1D684 <font> 0055 +1D685 <font> 0056 +1D686 <font> 0057 +1D687 <font> 0058 +1D688 <font> 0059 +1D689 <font> 005A +1D68A <font> 0061 +1D68B <font> 0062 +1D68C <font> 0063 +1D68D <font> 0064 +1D68E <font> 0065 +1D68F <font> 0066 +1D690 <font> 0067 +1D691 <font> 0068 +1D692 <font> 0069 +1D693 <font> 006A +1D694 <font> 006B +1D695 <font> 006C +1D696 <font> 006D +1D697 <font> 006E +1D698 <font> 006F +1D699 <font> 0070 +1D69A <font> 0071 +1D69B <font> 0072 +1D69C <font> 0073 +1D69D <font> 0074 +1D69E <font> 0075 +1D69F <font> 0076 +1D6A0 <font> 0077 +1D6A1 <font> 0078 +1D6A2 <font> 0079 +1D6A3 <font> 007A +1D6A4 <font> 0131 +1D6A5 <font> 0237 +1D6A8 <font> 0391 +1D6A9 <font> 0392 +1D6AA <font> 0393 +1D6AB <font> 0394 +1D6AC <font> 0395 +1D6AD <font> 0396 +1D6AE <font> 0397 +1D6AF <font> 0398 +1D6B0 <font> 0399 +1D6B1 <font> 039A +1D6B2 <font> 039B +1D6B3 <font> 039C +1D6B4 <font> 039D +1D6B5 <font> 039E +1D6B6 <font> 039F +1D6B7 <font> 03A0 +1D6B8 <font> 03A1 +1D6B9 <font> 03F4 +1D6BA <font> 03A3 +1D6BB <font> 03A4 +1D6BC <font> 03A5 +1D6BD <font> 03A6 +1D6BE <font> 03A7 +1D6BF <font> 03A8 +1D6C0 <font> 03A9 +1D6C1 <font> 2207 +1D6C2 <font> 03B1 +1D6C3 <font> 03B2 +1D6C4 <font> 03B3 +1D6C5 <font> 03B4 +1D6C6 <font> 03B5 +1D6C7 <font> 03B6 +1D6C8 <font> 03B7 +1D6C9 <font> 03B8 +1D6CA <font> 03B9 +1D6CB <font> 03BA +1D6CC <font> 03BB +1D6CD <font> 03BC +1D6CE <font> 03BD +1D6CF <font> 03BE +1D6D0 <font> 03BF +1D6D1 <font> 03C0 +1D6D2 <font> 03C1 +1D6D3 <font> 03C2 +1D6D4 <font> 03C3 +1D6D5 <font> 03C4 +1D6D6 <font> 03C5 +1D6D7 <font> 03C6 +1D6D8 <font> 03C7 +1D6D9 <font> 03C8 +1D6DA <font> 03C9 +1D6DB <font> 2202 +1D6DC <font> 03F5 +1D6DD <font> 03D1 +1D6DE <font> 03F0 +1D6DF <font> 03D5 +1D6E0 <font> 03F1 +1D6E1 <font> 03D6 +1D6E2 <font> 0391 +1D6E3 <font> 0392 +1D6E4 <font> 0393 +1D6E5 <font> 0394 +1D6E6 <font> 0395 +1D6E7 <font> 0396 +1D6E8 <font> 0397 +1D6E9 <font> 0398 +1D6EA <font> 0399 +1D6EB <font> 039A +1D6EC <font> 039B +1D6ED <font> 039C +1D6EE <font> 039D +1D6EF <font> 039E +1D6F0 <font> 039F +1D6F1 <font> 03A0 +1D6F2 <font> 03A1 +1D6F3 <font> 03F4 +1D6F4 <font> 03A3 +1D6F5 <font> 03A4 +1D6F6 <font> 03A5 +1D6F7 <font> 03A6 +1D6F8 <font> 03A7 +1D6F9 <font> 03A8 +1D6FA <font> 03A9 +1D6FB <font> 2207 +1D6FC <font> 03B1 +1D6FD <font> 03B2 +1D6FE <font> 03B3 +1D6FF <font> 03B4 +1D700 <font> 03B5 +1D701 <font> 03B6 +1D702 <font> 03B7 +1D703 <font> 03B8 +1D704 <font> 03B9 +1D705 <font> 03BA +1D706 <font> 03BB +1D707 <font> 03BC +1D708 <font> 03BD +1D709 <font> 03BE +1D70A <font> 03BF +1D70B <font> 03C0 +1D70C <font> 03C1 +1D70D <font> 03C2 +1D70E <font> 03C3 +1D70F <font> 03C4 +1D710 <font> 03C5 +1D711 <font> 03C6 +1D712 <font> 03C7 +1D713 <font> 03C8 +1D714 <font> 03C9 +1D715 <font> 2202 +1D716 <font> 03F5 +1D717 <font> 03D1 +1D718 <font> 03F0 +1D719 <font> 03D5 +1D71A <font> 03F1 +1D71B <font> 03D6 +1D71C <font> 0391 +1D71D <font> 0392 +1D71E <font> 0393 +1D71F <font> 0394 +1D720 <font> 0395 +1D721 <font> 0396 +1D722 <font> 0397 +1D723 <font> 0398 +1D724 <font> 0399 +1D725 <font> 039A +1D726 <font> 039B +1D727 <font> 039C +1D728 <font> 039D +1D729 <font> 039E +1D72A <font> 039F +1D72B <font> 03A0 +1D72C <font> 03A1 +1D72D <font> 03F4 +1D72E <font> 03A3 +1D72F <font> 03A4 +1D730 <font> 03A5 +1D731 <font> 03A6 +1D732 <font> 03A7 +1D733 <font> 03A8 +1D734 <font> 03A9 +1D735 <font> 2207 +1D736 <font> 03B1 +1D737 <font> 03B2 +1D738 <font> 03B3 +1D739 <font> 03B4 +1D73A <font> 03B5 +1D73B <font> 03B6 +1D73C <font> 03B7 +1D73D <font> 03B8 +1D73E <font> 03B9 +1D73F <font> 03BA +1D740 <font> 03BB +1D741 <font> 03BC +1D742 <font> 03BD +1D743 <font> 03BE +1D744 <font> 03BF +1D745 <font> 03C0 +1D746 <font> 03C1 +1D747 <font> 03C2 +1D748 <font> 03C3 +1D749 <font> 03C4 +1D74A <font> 03C5 +1D74B <font> 03C6 +1D74C <font> 03C7 +1D74D <font> 03C8 +1D74E <font> 03C9 +1D74F <font> 2202 +1D750 <font> 03F5 +1D751 <font> 03D1 +1D752 <font> 03F0 +1D753 <font> 03D5 +1D754 <font> 03F1 +1D755 <font> 03D6 +1D756 <font> 0391 +1D757 <font> 0392 +1D758 <font> 0393 +1D759 <font> 0394 +1D75A <font> 0395 +1D75B <font> 0396 +1D75C <font> 0397 +1D75D <font> 0398 +1D75E <font> 0399 +1D75F <font> 039A +1D760 <font> 039B +1D761 <font> 039C +1D762 <font> 039D +1D763 <font> 039E +1D764 <font> 039F +1D765 <font> 03A0 +1D766 <font> 03A1 +1D767 <font> 03F4 +1D768 <font> 03A3 +1D769 <font> 03A4 +1D76A <font> 03A5 +1D76B <font> 03A6 +1D76C <font> 03A7 +1D76D <font> 03A8 +1D76E <font> 03A9 +1D76F <font> 2207 +1D770 <font> 03B1 +1D771 <font> 03B2 +1D772 <font> 03B3 +1D773 <font> 03B4 +1D774 <font> 03B5 +1D775 <font> 03B6 +1D776 <font> 03B7 +1D777 <font> 03B8 +1D778 <font> 03B9 +1D779 <font> 03BA +1D77A <font> 03BB +1D77B <font> 03BC +1D77C <font> 03BD +1D77D <font> 03BE +1D77E <font> 03BF +1D77F <font> 03C0 +1D780 <font> 03C1 +1D781 <font> 03C2 +1D782 <font> 03C3 +1D783 <font> 03C4 +1D784 <font> 03C5 +1D785 <font> 03C6 +1D786 <font> 03C7 +1D787 <font> 03C8 +1D788 <font> 03C9 +1D789 <font> 2202 +1D78A <font> 03F5 +1D78B <font> 03D1 +1D78C <font> 03F0 +1D78D <font> 03D5 +1D78E <font> 03F1 +1D78F <font> 03D6 +1D790 <font> 0391 +1D791 <font> 0392 +1D792 <font> 0393 +1D793 <font> 0394 +1D794 <font> 0395 +1D795 <font> 0396 +1D796 <font> 0397 +1D797 <font> 0398 +1D798 <font> 0399 +1D799 <font> 039A +1D79A <font> 039B +1D79B <font> 039C +1D79C <font> 039D +1D79D <font> 039E +1D79E <font> 039F +1D79F <font> 03A0 +1D7A0 <font> 03A1 +1D7A1 <font> 03F4 +1D7A2 <font> 03A3 +1D7A3 <font> 03A4 +1D7A4 <font> 03A5 +1D7A5 <font> 03A6 +1D7A6 <font> 03A7 +1D7A7 <font> 03A8 +1D7A8 <font> 03A9 +1D7A9 <font> 2207 +1D7AA <font> 03B1 +1D7AB <font> 03B2 +1D7AC <font> 03B3 +1D7AD <font> 03B4 +1D7AE <font> 03B5 +1D7AF <font> 03B6 +1D7B0 <font> 03B7 +1D7B1 <font> 03B8 +1D7B2 <font> 03B9 +1D7B3 <font> 03BA +1D7B4 <font> 03BB +1D7B5 <font> 03BC +1D7B6 <font> 03BD +1D7B7 <font> 03BE +1D7B8 <font> 03BF +1D7B9 <font> 03C0 +1D7BA <font> 03C1 +1D7BB <font> 03C2 +1D7BC <font> 03C3 +1D7BD <font> 03C4 +1D7BE <font> 03C5 +1D7BF <font> 03C6 +1D7C0 <font> 03C7 +1D7C1 <font> 03C8 +1D7C2 <font> 03C9 +1D7C3 <font> 2202 +1D7C4 <font> 03F5 +1D7C5 <font> 03D1 +1D7C6 <font> 03F0 +1D7C7 <font> 03D5 +1D7C8 <font> 03F1 +1D7C9 <font> 03D6 +1D7CA <font> 03DC +1D7CB <font> 03DD +1D7CE <font> 0030 +1D7CF <font> 0031 +1D7D0 <font> 0032 +1D7D1 <font> 0033 +1D7D2 <font> 0034 +1D7D3 <font> 0035 +1D7D4 <font> 0036 +1D7D5 <font> 0037 +1D7D6 <font> 0038 +1D7D7 <font> 0039 +1D7D8 <font> 0030 +1D7D9 <font> 0031 +1D7DA <font> 0032 +1D7DB <font> 0033 +1D7DC <font> 0034 +1D7DD <font> 0035 +1D7DE <font> 0036 +1D7DF <font> 0037 +1D7E0 <font> 0038 +1D7E1 <font> 0039 +1D7E2 <font> 0030 +1D7E3 <font> 0031 +1D7E4 <font> 0032 +1D7E5 <font> 0033 +1D7E6 <font> 0034 +1D7E7 <font> 0035 +1D7E8 <font> 0036 +1D7E9 <font> 0037 +1D7EA <font> 0038 +1D7EB <font> 0039 +1D7EC <font> 0030 +1D7ED <font> 0031 +1D7EE <font> 0032 +1D7EF <font> 0033 +1D7F0 <font> 0034 +1D7F1 <font> 0035 +1D7F2 <font> 0036 +1D7F3 <font> 0037 +1D7F4 <font> 0038 +1D7F5 <font> 0039 +1D7F6 <font> 0030 +1D7F7 <font> 0031 +1D7F8 <font> 0032 +1D7F9 <font> 0033 +1D7FA <font> 0034 +1D7FB <font> 0035 +1D7FC <font> 0036 +1D7FD <font> 0037 +1D7FE <font> 0038 +1D7FF <font> 0039 +1EE00 <font> 0627 +1EE01 <font> 0628 +1EE02 <font> 062C +1EE03 <font> 062F +1EE05 <font> 0648 +1EE06 <font> 0632 +1EE07 <font> 062D +1EE08 <font> 0637 +1EE09 <font> 064A +1EE0A <font> 0643 +1EE0B <font> 0644 +1EE0C <font> 0645 +1EE0D <font> 0646 +1EE0E <font> 0633 +1EE0F <font> 0639 +1EE10 <font> 0641 +1EE11 <font> 0635 +1EE12 <font> 0642 +1EE13 <font> 0631 +1EE14 <font> 0634 +1EE15 <font> 062A +1EE16 <font> 062B +1EE17 <font> 062E +1EE18 <font> 0630 +1EE19 <font> 0636 +1EE1A <font> 0638 +1EE1B <font> 063A +1EE1C <font> 066E +1EE1D <font> 06BA +1EE1E <font> 06A1 +1EE1F <font> 066F +1EE21 <font> 0628 +1EE22 <font> 062C +1EE24 <font> 0647 +1EE27 <font> 062D +1EE29 <font> 064A +1EE2A <font> 0643 +1EE2B <font> 0644 +1EE2C <font> 0645 +1EE2D <font> 0646 +1EE2E <font> 0633 +1EE2F <font> 0639 +1EE30 <font> 0641 +1EE31 <font> 0635 +1EE32 <font> 0642 +1EE34 <font> 0634 +1EE35 <font> 062A +1EE36 <font> 062B +1EE37 <font> 062E +1EE39 <font> 0636 +1EE3B <font> 063A +1EE42 <font> 062C +1EE47 <font> 062D +1EE49 <font> 064A +1EE4B <font> 0644 +1EE4D <font> 0646 +1EE4E <font> 0633 +1EE4F <font> 0639 +1EE51 <font> 0635 +1EE52 <font> 0642 +1EE54 <font> 0634 +1EE57 <font> 062E +1EE59 <font> 0636 +1EE5B <font> 063A +1EE5D <font> 06BA +1EE5F <font> 066F +1EE61 <font> 0628 +1EE62 <font> 062C +1EE64 <font> 0647 +1EE67 <font> 062D +1EE68 <font> 0637 +1EE69 <font> 064A +1EE6A <font> 0643 +1EE6C <font> 0645 +1EE6D <font> 0646 +1EE6E <font> 0633 +1EE6F <font> 0639 +1EE70 <font> 0641 +1EE71 <font> 0635 +1EE72 <font> 0642 +1EE74 <font> 0634 +1EE75 <font> 062A +1EE76 <font> 062B +1EE77 <font> 062E +1EE79 <font> 0636 +1EE7A <font> 0638 +1EE7B <font> 063A +1EE7C <font> 066E +1EE7E <font> 06A1 +1EE80 <font> 0627 +1EE81 <font> 0628 +1EE82 <font> 062C +1EE83 <font> 062F +1EE84 <font> 0647 +1EE85 <font> 0648 +1EE86 <font> 0632 +1EE87 <font> 062D +1EE88 <font> 0637 +1EE89 <font> 064A +1EE8B <font> 0644 +1EE8C <font> 0645 +1EE8D <font> 0646 +1EE8E <font> 0633 +1EE8F <font> 0639 +1EE90 <font> 0641 +1EE91 <font> 0635 +1EE92 <font> 0642 +1EE93 <font> 0631 +1EE94 <font> 0634 +1EE95 <font> 062A +1EE96 <font> 062B +1EE97 <font> 062E +1EE98 <font> 0630 +1EE99 <font> 0636 +1EE9A <font> 0638 +1EE9B <font> 063A +1EEA1 <font> 0628 +1EEA2 <font> 062C +1EEA3 <font> 062F +1EEA5 <font> 0648 +1EEA6 <font> 0632 +1EEA7 <font> 062D +1EEA8 <font> 0637 +1EEA9 <font> 064A +1EEAB <font> 0644 +1EEAC <font> 0645 +1EEAD <font> 0646 +1EEAE <font> 0633 +1EEAF <font> 0639 +1EEB0 <font> 0641 +1EEB1 <font> 0635 +1EEB2 <font> 0642 +1EEB3 <font> 0631 +1EEB4 <font> 0634 +1EEB5 <font> 062A +1EEB6 <font> 062B +1EEB7 <font> 062E +1EEB8 <font> 0630 +1EEB9 <font> 0636 +1EEBA <font> 0638 +1EEBB <font> 063A +1F100 <compat> 0030 002E +1F101 <compat> 0030 002C +1F102 <compat> 0031 002C +1F103 <compat> 0032 002C +1F104 <compat> 0033 002C +1F105 <compat> 0034 002C +1F106 <compat> 0035 002C +1F107 <compat> 0036 002C +1F108 <compat> 0037 002C +1F109 <compat> 0038 002C +1F10A <compat> 0039 002C +1F110 <compat> 0028 0041 0029 +1F111 <compat> 0028 0042 0029 +1F112 <compat> 0028 0043 0029 +1F113 <compat> 0028 0044 0029 +1F114 <compat> 0028 0045 0029 +1F115 <compat> 0028 0046 0029 +1F116 <compat> 0028 0047 0029 +1F117 <compat> 0028 0048 0029 +1F118 <compat> 0028 0049 0029 +1F119 <compat> 0028 004A 0029 +1F11A <compat> 0028 004B 0029 +1F11B <compat> 0028 004C 0029 +1F11C <compat> 0028 004D 0029 +1F11D <compat> 0028 004E 0029 +1F11E <compat> 0028 004F 0029 +1F11F <compat> 0028 0050 0029 +1F120 <compat> 0028 0051 0029 +1F121 <compat> 0028 0052 0029 +1F122 <compat> 0028 0053 0029 +1F123 <compat> 0028 0054 0029 +1F124 <compat> 0028 0055 0029 +1F125 <compat> 0028 0056 0029 +1F126 <compat> 0028 0057 0029 +1F127 <compat> 0028 0058 0029 +1F128 <compat> 0028 0059 0029 +1F129 <compat> 0028 005A 0029 +1F12A <compat> 3014 0053 3015 +1F12B <circle> 0043 +1F12C <circle> 0052 +1F12D <circle> 0043 0044 +1F12E <circle> 0057 005A +1F130 <square> 0041 +1F131 <square> 0042 +1F132 <square> 0043 +1F133 <square> 0044 +1F134 <square> 0045 +1F135 <square> 0046 +1F136 <square> 0047 +1F137 <square> 0048 +1F138 <square> 0049 +1F139 <square> 004A +1F13A <square> 004B +1F13B <square> 004C +1F13C <square> 004D +1F13D <square> 004E +1F13E <square> 004F +1F13F <square> 0050 +1F140 <square> 0051 +1F141 <square> 0052 +1F142 <square> 0053 +1F143 <square> 0054 +1F144 <square> 0055 +1F145 <square> 0056 +1F146 <square> 0057 +1F147 <square> 0058 +1F148 <square> 0059 +1F149 <square> 005A +1F14A <square> 0048 0056 +1F14B <square> 004D 0056 +1F14C <square> 0053 0044 +1F14D <square> 0053 0053 +1F14E <square> 0050 0050 0056 +1F14F <square> 0057 0043 +1F16A <super> 004D 0043 +1F16B <super> 004D 0044 +1F190 <square> 0044 004A +1F200 <square> 307B 304B +1F201 <square> 30B3 30B3 +1F202 <square> 30B5 +1F210 <square> 624B +1F211 <square> 5B57 +1F212 <square> 53CC +1F213 <square> 30C7 +1F214 <square> 4E8C +1F215 <square> 591A +1F216 <square> 89E3 +1F217 <square> 5929 +1F218 <square> 4EA4 +1F219 <square> 6620 +1F21A <square> 7121 +1F21B <square> 6599 +1F21C <square> 524D +1F21D <square> 5F8C +1F21E <square> 518D +1F21F <square> 65B0 +1F220 <square> 521D +1F221 <square> 7D42 +1F222 <square> 751F +1F223 <square> 8CA9 +1F224 <square> 58F0 +1F225 <square> 5439 +1F226 <square> 6F14 +1F227 <square> 6295 +1F228 <square> 6355 +1F229 <square> 4E00 +1F22A <square> 4E09 +1F22B <square> 904A +1F22C <square> 5DE6 +1F22D <square> 4E2D +1F22E <square> 53F3 +1F22F <square> 6307 +1F230 <square> 8D70 +1F231 <square> 6253 +1F232 <square> 7981 +1F233 <square> 7A7A +1F234 <square> 5408 +1F235 <square> 6E80 +1F236 <square> 6709 +1F237 <square> 6708 +1F238 <square> 7533 +1F239 <square> 5272 +1F23A <square> 55B6 +1F23B <square> 914D +1F240 <compat> 3014 672C 3015 +1F241 <compat> 3014 4E09 3015 +1F242 <compat> 3014 4E8C 3015 +1F243 <compat> 3014 5B89 3015 +1F244 <compat> 3014 70B9 3015 +1F245 <compat> 3014 6253 3015 +1F246 <compat> 3014 76D7 3015 +1F247 <compat> 3014 52DD 3015 +1F248 <compat> 3014 6557 3015 +1F250 <circle> 5F97 +1F251 <circle> 53EF +2F800 4E3D +2F801 4E38 +2F802 4E41 +2F803 20122 +2F804 4F60 +2F805 4FAE +2F806 4FBB +2F807 5002 +2F808 507A +2F809 5099 +2F80A 50E7 +2F80B 50CF +2F80C 349E +2F80D 2063A +2F80E 514D +2F80F 5154 +2F810 5164 +2F811 5177 +2F812 2051C +2F813 34B9 +2F814 5167 +2F815 518D +2F816 2054B +2F817 5197 +2F818 51A4 +2F819 4ECC +2F81A 51AC +2F81B 51B5 +2F81C 291DF +2F81D 51F5 +2F81E 5203 +2F81F 34DF +2F820 523B +2F821 5246 +2F822 5272 +2F823 5277 +2F824 3515 +2F825 52C7 +2F826 52C9 +2F827 52E4 +2F828 52FA +2F829 5305 +2F82A 5306 +2F82B 5317 +2F82C 5349 +2F82D 5351 +2F82E 535A +2F82F 5373 +2F830 537D +2F831 2F833 537F +2F834 20A2C +2F835 7070 +2F836 53CA +2F837 53DF +2F838 20B63 +2F839 53EB +2F83A 53F1 +2F83B 5406 +2F83C 549E +2F83D 5438 +2F83E 5448 +2F83F 5468 +2F840 54A2 +2F841 54F6 +2F842 5510 +2F843 5553 +2F844 5563 +2F845 2F846 5584 +2F847 5599 +2F848 55AB +2F849 55B3 +2F84A 55C2 +2F84B 5716 +2F84C 5606 +2F84D 5717 +2F84E 5651 +2F84F 5674 +2F850 5207 +2F851 58EE +2F852 57CE +2F853 57F4 +2F854 580D +2F855 578B +2F856 5832 +2F857 5831 +2F858 58AC +2F859 214E4 +2F85A 58F2 +2F85B 58F7 +2F85C 5906 +2F85D 591A +2F85E 5922 +2F85F 5962 +2F860 216A8 +2F861 216EA +2F862 59EC +2F863 5A1B +2F864 5A27 +2F865 59D8 +2F866 5A66 +2F867 36EE +2F868 36FC +2F869 5B08 +2F86A 2F86B 5B3E +2F86C 219C8 +2F86D 5BC3 +2F86E 5BD8 +2F86F 5BE7 +2F870 5BF3 +2F871 21B18 +2F872 5BFF +2F873 5C06 +2F874 5F53 +2F875 5C22 +2F876 3781 +2F877 5C60 +2F878 5C6E +2F879 5CC0 +2F87A 5C8D +2F87B 21DE4 +2F87C 5D43 +2F87D 21DE6 +2F87E 5D6E +2F87F 5D6B +2F880 5D7C +2F881 5DE1 +2F882 5DE2 +2F883 382F +2F884 5DFD +2F885 5E28 +2F886 5E3D +2F887 5E69 +2F888 3862 +2F889 22183 +2F88A 387C +2F88B 5EB0 +2F88C 5EB3 +2F88D 5EB6 +2F88E 5ECA +2F88F 2A392 +2F890 5EFE +2F891 2F892 22331 +2F893 8201 +2F894 2F895 5F22 +2F896 38C7 +2F897 232B8 +2F898 261DA +2F899 5F62 +2F89A 5F6B +2F89B 38E3 +2F89C 5F9A +2F89D 5FCD +2F89E 5FD7 +2F89F 5FF9 +2F8A0 6081 +2F8A1 393A +2F8A2 391C +2F8A3 6094 +2F8A4 226D4 +2F8A5 60C7 +2F8A6 6148 +2F8A7 614C +2F8A8 614E +2F8A9 614C +2F8AA 617A +2F8AB 618E +2F8AC 61B2 +2F8AD 61A4 +2F8AE 61AF +2F8AF 61DE +2F8B0 61F2 +2F8B1 61F6 +2F8B2 6210 +2F8B3 621B +2F8B4 625D +2F8B5 62B1 +2F8B6 62D4 +2F8B7 6350 +2F8B8 22B0C +2F8B9 633D +2F8BA 62FC +2F8BB 6368 +2F8BC 6383 +2F8BD 63E4 +2F8BE 22BF1 +2F8BF 6422 +2F8C0 63C5 +2F8C1 63A9 +2F8C2 3A2E +2F8C3 6469 +2F8C4 647E +2F8C5 649D +2F8C6 6477 +2F8C7 3A6C +2F8C8 654F +2F8C9 656C +2F8CA 2300A +2F8CB 65E3 +2F8CC 66F8 +2F8CD 6649 +2F8CE 3B19 +2F8CF 6691 +2F8D0 3B08 +2F8D1 3AE4 +2F8D2 5192 +2F8D3 5195 +2F8D4 6700 +2F8D5 669C +2F8D6 80AD +2F8D7 43D9 +2F8D8 6717 +2F8D9 671B +2F8DA 6721 +2F8DB 675E +2F8DC 6753 +2F8DD 233C3 +2F8DE 3B49 +2F8DF 67FA +2F8E0 6785 +2F8E1 6852 +2F8E2 6885 +2F8E3 2346D +2F8E4 688E +2F8E5 681F +2F8E6 6914 +2F8E7 3B9D +2F8E8 6942 +2F8E9 69A3 +2F8EA 69EA +2F8EB 6AA8 +2F8EC 236A3 +2F8ED 6ADB +2F8EE 3C18 +2F8EF 6B21 +2F8F0 238A7 +2F8F1 6B54 +2F8F2 3C4E +2F8F3 6B72 +2F8F4 6B9F +2F8F5 6BBA +2F8F6 6BBB +2F8F7 23A8D +2F8F8 21D0B +2F8F9 23AFA +2F8FA 6C4E +2F8FB 23CBC +2F8FC 6CBF +2F8FD 6CCD +2F8FE 6C67 +2F8FF 6D16 +2F900 6D3E +2F901 6D77 +2F902 6D41 +2F903 6D69 +2F904 6D78 +2F905 6D85 +2F906 23D1E +2F907 6D34 +2F908 6E2F +2F909 6E6E +2F90A 3D33 +2F90B 6ECB +2F90C 6EC7 +2F90D 23ED1 +2F90E 6DF9 +2F90F 6F6E +2F910 23F5E +2F911 23F8E +2F912 6FC6 +2F913 7039 +2F914 701E +2F915 701B +2F916 3D96 +2F917 704A +2F918 707D +2F919 7077 +2F91A 70AD +2F91B 20525 +2F91C 7145 +2F91D 24263 +2F91E 719C +2F91F 243AB +2F920 7228 +2F921 7235 +2F922 7250 +2F923 24608 +2F924 7280 +2F925 7295 +2F926 24735 +2F927 24814 +2F928 737A +2F929 738B +2F92A 3EAC +2F92B 73A5 +2F92C 2F92D 3EB8 +2F92E 7447 +2F92F 745C +2F930 7471 +2F931 7485 +2F932 74CA +2F933 3F1B +2F934 7524 +2F935 24C36 +2F936 753E +2F937 24C92 +2F938 7570 +2F939 2219F +2F93A 7610 +2F93B 24FA1 +2F93C 24FB8 +2F93D 25044 +2F93E 3FFC +2F93F 4008 +2F940 76F4 +2F941 250F3 +2F942 250F2 +2F943 25119 +2F944 25133 +2F945 771E +2F946 2F947 771F +2F948 774A +2F949 4039 +2F94A 778B +2F94B 4046 +2F94C 4096 +2F94D 2541D +2F94E 784E +2F94F 788C +2F950 78CC +2F951 40E3 +2F952 25626 +2F953 7956 +2F954 2569A +2F955 256C5 +2F956 798F +2F957 79EB +2F958 412F +2F959 7A40 +2F95A 7A4A +2F95B 7A4F +2F95C 2597C +2F95D 2F95E 25AA7 +2F95F 7AEE +2F960 4202 +2F961 25BAB +2F962 7BC6 +2F963 7BC9 +2F964 4227 +2F965 25C80 +2F966 7CD2 +2F967 42A0 +2F968 7CE8 +2F969 7CE3 +2F96A 7D00 +2F96B 25F86 +2F96C 7D63 +2F96D 4301 +2F96E 7DC7 +2F96F 7E02 +2F970 7E45 +2F971 4334 +2F972 26228 +2F973 26247 +2F974 4359 +2F975 262D9 +2F976 7F7A +2F977 2633E +2F978 7F95 +2F979 7FFA +2F97A 8005 +2F97B 264DA +2F97C 26523 +2F97D 8060 +2F97E 265A8 +2F97F 8070 +2F980 2335F +2F981 43D5 +2F982 80B2 +2F983 8103 +2F984 440B +2F985 813E +2F986 5AB5 +2F987 267A7 +2F988 267B5 +2F989 23393 +2F98A 2339C +2F98B 8201 +2F98C 8204 +2F98D 8F9E +2F98E 446B +2F98F 8291 +2F990 828B +2F991 829D +2F992 52B3 +2F993 82B1 +2F994 82B3 +2F995 82BD +2F996 82E6 +2F997 26B3C +2F998 82E5 +2F999 831D +2F99A 8363 +2F99B 83AD +2F99C 8323 +2F99D 83BD +2F99E 83E7 +2F99F 8457 +2F9A0 8353 +2F9A1 83CA +2F9A2 83CC +2F9A3 83DC +2F9A4 26C36 +2F9A5 26D6B +2F9A6 26CD5 +2F9A7 452B +2F9A8 84F1 +2F9A9 84F3 +2F9AA 8516 +2F9AB 273CA +2F9AC 8564 +2F9AD 26F2C +2F9AE 455D +2F9AF 4561 +2F9B0 26FB1 +2F9B1 270D2 +2F9B2 456B +2F9B3 8650 +2F9B4 865C +2F9B5 8667 +2F9B6 8669 +2F9B7 86A9 +2F9B8 8688 +2F9B9 870E +2F9BA 86E2 +2F9BB 8779 +2F9BC 8728 +2F9BD 876B +2F9BE 8786 +2F9BF 45D7 +2F9C0 87E1 +2F9C1 8801 +2F9C2 45F9 +2F9C3 8860 +2F9C4 8863 +2F9C5 27667 +2F9C6 88D7 +2F9C7 88DE +2F9C8 4635 +2F9C9 88FA +2F9CA 34BB +2F9CB 278AE +2F9CC 27966 +2F9CD 46BE +2F9CE 46C7 +2F9CF 8AA0 +2F9D0 8AED +2F9D1 8B8A +2F9D2 8C55 +2F9D3 27CA8 +2F9D4 8CAB +2F9D5 8CC1 +2F9D6 8D1B +2F9D7 8D77 +2F9D8 27F2F +2F9D9 20804 +2F9DA 8DCB +2F9DB 8DBC +2F9DC 8DF0 +2F9DD 208DE +2F9DE 8ED4 +2F9DF 8F38 +2F9E0 285D2 +2F9E1 285ED +2F9E2 9094 +2F9E3 90F1 +2F9E4 9111 +2F9E5 2872E +2F9E6 911B +2F9E7 9238 +2F9E8 92D7 +2F9E9 92D8 +2F9EA 927C +2F9EB 93F9 +2F9EC 9415 +2F9ED 28BFA +2F9EE 958B +2F9EF 4995 +2F9F0 95B7 +2F9F1 28D77 +2F9F2 49E6 +2F9F3 96C3 +2F9F4 5DB2 +2F9F5 9723 +2F9F6 29145 +2F9F7 2921A +2F9F8 4A6E +2F9F9 4A76 +2F9FA 97E0 +2F9FB 2940A +2F9FC 4AB2 +2F9FD 29496 +2F9FE 2F9FF 980B +2FA00 9829 +2FA01 295B6 +2FA02 98E2 +2FA03 4B33 +2FA04 9929 +2FA05 99A7 +2FA06 99C2 +2FA07 99FE +2FA08 4BCE +2FA09 29B30 +2FA0A 9B12 +2FA0B 9C40 +2FA0C 9CFD +2FA0D 4CCE +2FA0E 4CED +2FA0F 9D67 +2FA10 2A0CE +2FA11 4CF8 +2FA12 2A105 +2FA13 2A20E +2FA14 2A291 +2FA15 9EBB +2FA16 4D56 +2FA17 9EF9 +2FA18 9EFE +2FA19 9F05 +2FA1A 9F0F +2FA1B 9F16 +2FA1C 9F3B +2FA1D 2A600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToCombiningClass'}{'format'} = 'i'; # integer +$utf8::SwashInfo{'ToCombiningClass'}{'missing'} = '0'; + +return <<'END'; +300 314 230 +315 232 +316 319 220 +31A 232 +31B 216 +31C 320 220 +321 322 202 +323 326 220 +327 328 202 +329 333 220 +334 338 1 +339 33C 220 +33D 344 230 +345 240 +346 230 +347 349 220 +34A 34C 230 +34D 34E 220 +350 352 230 +353 356 220 +357 230 +358 232 +359 35A 220 +35B 230 +35C 233 +35D 35E 234 +35F 233 +360 361 234 +362 233 +363 36F 230 +483 487 230 +591 220 +592 595 230 +596 220 +597 599 230 +59A 222 +59B 220 +59C 5A1 230 +5A2 5A7 220 +5A8 5A9 230 +5AA 220 +5AB 5AC 230 +5AD 222 +5AE 228 +5AF 230 +5B0 10 +5B1 11 +5B2 12 +5B3 13 +5B4 14 +5B5 15 +5B6 16 +5B7 17 +5B8 18 +5B9 5BA 19 +5BB 20 +5BC 21 +5BD 22 +5BF 23 +5C1 24 +5C2 25 +5C4 230 +5C5 220 +5C7 18 +610 617 230 +618 30 +619 31 +61A 32 +64B 27 +64C 28 +64D 29 +64E 30 +64F 31 +650 32 +651 33 +652 34 +653 654 230 +655 656 220 +657 65B 230 +65C 220 +65D 65E 230 +65F 220 +670 35 +6D6 6DC 230 +6DF 6E2 230 +6E3 220 +6E4 230 +6E7 6E8 230 +6EA 220 +6EB 6EC 230 +6ED 220 +711 36 +730 230 +731 220 +732 733 230 +734 220 +735 736 230 +737 739 220 +73A 230 +73B 73C 220 +73D 230 +73E 220 +73F 741 230 +742 220 +743 230 +744 220 +745 230 +746 220 +747 230 +748 220 +749 74A 230 +7EB 7F1 230 +7F2 220 +7F3 230 +816 819 230 +81B 823 230 +825 827 230 +829 82D 230 +859 85B 220 +8D4 8E1 230 +8E3 220 +8E4 8E5 230 +8E6 220 +8E7 8E8 230 +8E9 220 +8EA 8EC 230 +8ED 8EF 220 +8F0 27 +8F1 28 +8F2 29 +8F3 8F5 230 +8F6 220 +8F7 8F8 230 +8F9 8FA 220 +8FB 8FF 230 +93C 7 +94D 9 +951 230 +952 220 +953 954 230 +9BC 7 +9CD 9 +A3C 7 +A4D 9 +ABC 7 +ACD 9 +B3C 7 +B4D 9 +BCD 9 +C4D 9 +C55 84 +C56 91 +CBC 7 +CCD 9 +D3B D3C 9 +D4D 9 +DCA 9 +E38 E39 103 +E3A 9 +E48 E4B 107 +EB8 EB9 118 +EC8 ECB 122 +F18 F19 220 +F35 220 +F37 220 +F39 216 +F71 129 +F72 130 +F74 132 +F7A F7D 130 +F80 130 +F82 F83 230 +F84 9 +F86 F87 230 +FC6 220 +1037 7 +1039 103A 9 +108D 220 +135D 135F 230 +1714 9 +1734 9 +17D2 9 +17DD 230 +18A9 228 +1939 222 +193A 230 +193B 220 +1A17 230 +1A18 220 +1A60 9 +1A75 1A7C 230 +1A7F 220 +1AB0 1AB4 230 +1AB5 1ABA 220 +1ABB 1ABC 230 +1ABD 220 +1B34 7 +1B44 9 +1B6B 230 +1B6C 220 +1B6D 1B73 230 +1BAA 1BAB 9 +1BE6 7 +1BF2 1BF3 9 +1C37 7 +1CD0 1CD2 230 +1CD4 1 +1CD5 1CD9 220 +1CDA 1CDB 230 +1CDC 1CDF 220 +1CE0 230 +1CE2 1CE8 1 +1CED 220 +1CF4 230 +1CF8 1CF9 230 +1DC0 1DC1 230 +1DC2 220 +1DC3 1DC9 230 +1DCA 220 +1DCB 1DCC 230 +1DCD 234 +1DCE 214 +1DCF 220 +1DD0 202 +1DD1 1DF5 230 +1DF6 232 +1DF7 1DF8 228 +1DF9 220 +1DFB 230 +1DFC 233 +1DFD 220 +1DFE 230 +1DFF 220 +20D0 20D1 230 +20D2 20D3 1 +20D4 20D7 230 +20D8 20DA 1 +20DB 20DC 230 +20E1 230 +20E5 20E6 1 +20E7 230 +20E8 220 +20E9 230 +20EA 20EB 1 +20EC 20EF 220 +20F0 230 +2CEF 2CF1 230 +2D7F 9 +2DE0 2DFF 230 +302A 218 +302B 228 +302C 232 +302D 222 +302E 302F 224 +3099 309A 8 +A66F 230 +A674 A67D 230 +A69E A69F 230 +A6F0 A6F1 230 +A806 9 +A8C4 9 +A8E0 A8F1 230 +A92B A92D 220 +A953 9 +A9B3 7 +A9C0 9 +AAB0 230 +AAB2 AAB3 230 +AAB4 220 +AAB7 AAB8 230 +AABE AABF 230 +AAC1 230 +AAF6 9 +ABED 9 +FB1E 26 +FE20 FE26 230 +FE27 FE2D 220 +FE2E FE2F 230 +101FD 220 +102E0 220 +10376 1037A 230 +10A0D 220 +10A0F 230 +10A38 230 +10A39 1 +10A3A 220 +10A3F 9 +10AE5 230 +10AE6 220 +11046 9 +1107F 9 +110B9 9 +110BA 7 +11100 11102 230 +11133 11134 9 +11173 7 +111C0 9 +111CA 7 +11235 9 +11236 7 +112E9 7 +112EA 9 +1133C 7 +1134D 9 +11366 1136C 230 +11370 11374 230 +11442 9 +11446 7 +114C2 9 +114C3 7 +115BF 9 +115C0 7 +1163F 9 +116B6 9 +116B7 7 +1172B 9 +11A34 9 +11A47 9 +11A99 9 +11C3F 9 +11D42 7 +11D44 11D45 9 +16AF0 16AF4 1 +16B30 16B36 230 +1BC9E 1 +1D165 1D166 216 +1D167 1D169 1 +1D16D 226 +1D16E 1D172 216 +1D17B 1D182 220 +1D185 1D189 230 +1D18A 1D18B 220 +1D1AA 1D1AD 230 +1D242 1D244 230 +1E000 1E006 230 +1E008 1E018 230 +1E01B 1E021 230 +1E023 1E024 230 +1E026 1E02A 230 +1E8D0 1E8D6 220 +1E944 1E949 230 +1E94A 7 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# The mappings in the non-hash portion of this file must be modified to get the +# correct values by adding the code point ordinal number to each one that is +# numeric. + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToCf'}{'format'} = 'ax'; # mapped value in hex; some entries need adjustment +$utf8::SwashInfo{'ToCf'}{'specials_name'} = 'utf8::ToSpecCf'; # Name of hash of special mappings +$utf8::SwashInfo{'ToCf'}{'missing'} = '0'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecCf = ( +"\xC3\x9F" => "\x{0073}\x{0073}", # U+00DF => 0073 0073 +"\xC4\xB0" => "\x{0069}\x{0307}", # U+0130 => 0069 0307 +"\xC5\x89" => "\x{02BC}\x{006E}", # U+0149 => 02BC 006E +"\xC7\xB0" => "\x{006A}\x{030C}", # U+01F0 => 006A 030C +"\xCE\x90" => "\x{03B9}\x{0308}\x{0301}", # U+0390 => 03B9 0308 0301 +"\xCE\xB0" => "\x{03C5}\x{0308}\x{0301}", # U+03B0 => 03C5 0308 0301 +"\xD6\x87" => "\x{0565}\x{0582}", # U+0587 => 0565 0582 +"\xE1\xBA\x96" => "\x{0068}\x{0331}", # U+1E96 => 0068 0331 +"\xE1\xBA\x97" => "\x{0074}\x{0308}", # U+1E97 => 0074 0308 +"\xE1\xBA\x98" => "\x{0077}\x{030A}", # U+1E98 => 0077 030A +"\xE1\xBA\x99" => "\x{0079}\x{030A}", # U+1E99 => 0079 030A +"\xE1\xBA\x9A" => "\x{0061}\x{02BE}", # U+1E9A => 0061 02BE +"\xE1\xBA\x9E" => "\x{0073}\x{0073}", # U+1E9E => 0073 0073 +"\xE1\xBD\x90" => "\x{03C5}\x{0313}", # U+1F50 => 03C5 0313 +"\xE1\xBD\x92" => "\x{03C5}\x{0313}\x{0300}", # U+1F52 => 03C5 0313 0300 +"\xE1\xBD\x94" => "\x{03C5}\x{0313}\x{0301}", # U+1F54 => 03C5 0313 0301 +"\xE1\xBD\x96" => "\x{03C5}\x{0313}\x{0342}", # U+1F56 => 03C5 0313 0342 +"\xE1\xBE\x80" => "\x{1F00}\x{03B9}", # U+1F80 => 1F00 03B9 +"\xE1\xBE\x81" => "\x{1F01}\x{03B9}", # U+1F81 => 1F01 03B9 +"\xE1\xBE\x82" => "\x{1F02}\x{03B9}", # U+1F82 => 1F02 03B9 +"\xE1\xBE\x83" => "\x{1F03}\x{03B9}", # U+1F83 => 1F03 03B9 +"\xE1\xBE\x84" => "\x{1F04}\x{03B9}", # U+1F84 => 1F04 03B9 +"\xE1\xBE\x85" => "\x{1F05}\x{03B9}", # U+1F85 => 1F05 03B9 +"\xE1\xBE\x86" => "\x{1F06}\x{03B9}", # U+1F86 => 1F06 03B9 +"\xE1\xBE\x87" => "\x{1F07}\x{03B9}", # U+1F87 => 1F07 03B9 +"\xE1\xBE\x88" => "\x{1F00}\x{03B9}", # U+1F88 => 1F00 03B9 +"\xE1\xBE\x89" => "\x{1F01}\x{03B9}", # U+1F89 => 1F01 03B9 +"\xE1\xBE\x8A" => "\x{1F02}\x{03B9}", # U+1F8A => 1F02 03B9 +"\xE1\xBE\x8B" => "\x{1F03}\x{03B9}", # U+1F8B => 1F03 03B9 +"\xE1\xBE\x8C" => "\x{1F04}\x{03B9}", # U+1F8C => 1F04 03B9 +"\xE1\xBE\x8D" => "\x{1F05}\x{03B9}", # U+1F8D => 1F05 03B9 +"\xE1\xBE\x8E" => "\x{1F06}\x{03B9}", # U+1F8E => 1F06 03B9 +"\xE1\xBE\x8F" => "\x{1F07}\x{03B9}", # U+1F8F => 1F07 03B9 +"\xE1\xBE\x90" => "\x{1F20}\x{03B9}", # U+1F90 => 1F20 03B9 +"\xE1\xBE\x91" => "\x{1F21}\x{03B9}", # U+1F91 => 1F21 03B9 +"\xE1\xBE\x92" => "\x{1F22}\x{03B9}", # U+1F92 => 1F22 03B9 +"\xE1\xBE\x93" => "\x{1F23}\x{03B9}", # U+1F93 => 1F23 03B9 +"\xE1\xBE\x94" => "\x{1F24}\x{03B9}", # U+1F94 => 1F24 03B9 +"\xE1\xBE\x95" => "\x{1F25}\x{03B9}", # U+1F95 => 1F25 03B9 +"\xE1\xBE\x96" => "\x{1F26}\x{03B9}", # U+1F96 => 1F26 03B9 +"\xE1\xBE\x97" => "\x{1F27}\x{03B9}", # U+1F97 => 1F27 03B9 +"\xE1\xBE\x98" => "\x{1F20}\x{03B9}", # U+1F98 => 1F20 03B9 +"\xE1\xBE\x99" => "\x{1F21}\x{03B9}", # U+1F99 => 1F21 03B9 +"\xE1\xBE\x9A" => "\x{1F22}\x{03B9}", # U+1F9A => 1F22 03B9 +"\xE1\xBE\x9B" => "\x{1F23}\x{03B9}", # U+1F9B => 1F23 03B9 +"\xE1\xBE\x9C" => "\x{1F24}\x{03B9}", # U+1F9C => 1F24 03B9 +"\xE1\xBE\x9D" => "\x{1F25}\x{03B9}", # U+1F9D => 1F25 03B9 +"\xE1\xBE\x9E" => "\x{1F26}\x{03B9}", # U+1F9E => 1F26 03B9 +"\xE1\xBE\x9F" => "\x{1F27}\x{03B9}", # U+1F9F => 1F27 03B9 +"\xE1\xBE\xA0" => "\x{1F60}\x{03B9}", # U+1FA0 => 1F60 03B9 +"\xE1\xBE\xA1" => "\x{1F61}\x{03B9}", # U+1FA1 => 1F61 03B9 +"\xE1\xBE\xA2" => "\x{1F62}\x{03B9}", # U+1FA2 => 1F62 03B9 +"\xE1\xBE\xA3" => "\x{1F63}\x{03B9}", # U+1FA3 => 1F63 03B9 +"\xE1\xBE\xA4" => "\x{1F64}\x{03B9}", # U+1FA4 => 1F64 03B9 +"\xE1\xBE\xA5" => "\x{1F65}\x{03B9}", # U+1FA5 => 1F65 03B9 +"\xE1\xBE\xA6" => "\x{1F66}\x{03B9}", # U+1FA6 => 1F66 03B9 +"\xE1\xBE\xA7" => "\x{1F67}\x{03B9}", # U+1FA7 => 1F67 03B9 +"\xE1\xBE\xA8" => "\x{1F60}\x{03B9}", # U+1FA8 => 1F60 03B9 +"\xE1\xBE\xA9" => "\x{1F61}\x{03B9}", # U+1FA9 => 1F61 03B9 +"\xE1\xBE\xAA" => "\x{1F62}\x{03B9}", # U+1FAA => 1F62 03B9 +"\xE1\xBE\xAB" => "\x{1F63}\x{03B9}", # U+1FAB => 1F63 03B9 +"\xE1\xBE\xAC" => "\x{1F64}\x{03B9}", # U+1FAC => 1F64 03B9 +"\xE1\xBE\xAD" => "\x{1F65}\x{03B9}", # U+1FAD => 1F65 03B9 +"\xE1\xBE\xAE" => "\x{1F66}\x{03B9}", # U+1FAE => 1F66 03B9 +"\xE1\xBE\xAF" => "\x{1F67}\x{03B9}", # U+1FAF => 1F67 03B9 +"\xE1\xBE\xB2" => "\x{1F70}\x{03B9}", # U+1FB2 => 1F70 03B9 +"\xE1\xBE\xB3" => "\x{03B1}\x{03B9}", # U+1FB3 => 03B1 03B9 +"\xE1\xBE\xB4" => "\x{03AC}\x{03B9}", # U+1FB4 => 03AC 03B9 +"\xE1\xBE\xB6" => "\x{03B1}\x{0342}", # U+1FB6 => 03B1 0342 +"\xE1\xBE\xB7" => "\x{03B1}\x{0342}\x{03B9}", # U+1FB7 => 03B1 0342 03B9 +"\xE1\xBE\xBC" => "\x{03B1}\x{03B9}", # U+1FBC => 03B1 03B9 +"\xE1\xBF\x82" => "\x{1F74}\x{03B9}", # U+1FC2 => 1F74 03B9 +"\xE1\xBF\x83" => "\x{03B7}\x{03B9}", # U+1FC3 => 03B7 03B9 +"\xE1\xBF\x84" => "\x{03AE}\x{03B9}", # U+1FC4 => 03AE 03B9 +"\xE1\xBF\x86" => "\x{03B7}\x{0342}", # U+1FC6 => 03B7 0342 +"\xE1\xBF\x87" => "\x{03B7}\x{0342}\x{03B9}", # U+1FC7 => 03B7 0342 03B9 +"\xE1\xBF\x8C" => "\x{03B7}\x{03B9}", # U+1FCC => 03B7 03B9 +"\xE1\xBF\x92" => "\x{03B9}\x{0308}\x{0300}", # U+1FD2 => 03B9 0308 0300 +"\xE1\xBF\x93" => "\x{03B9}\x{0308}\x{0301}", # U+1FD3 => 03B9 0308 0301 +"\xE1\xBF\x96" => "\x{03B9}\x{0342}", # U+1FD6 => 03B9 0342 +"\xE1\xBF\x97" => "\x{03B9}\x{0308}\x{0342}", # U+1FD7 => 03B9 0308 0342 +"\xE1\xBF\xA2" => "\x{03C5}\x{0308}\x{0300}", # U+1FE2 => 03C5 0308 0300 +"\xE1\xBF\xA3" => "\x{03C5}\x{0308}\x{0301}", # U+1FE3 => 03C5 0308 0301 +"\xE1\xBF\xA4" => "\x{03C1}\x{0313}", # U+1FE4 => 03C1 0313 +"\xE1\xBF\xA6" => "\x{03C5}\x{0342}", # U+1FE6 => 03C5 0342 +"\xE1\xBF\xA7" => "\x{03C5}\x{0308}\x{0342}", # U+1FE7 => 03C5 0308 0342 +"\xE1\xBF\xB2" => "\x{1F7C}\x{03B9}", # U+1FF2 => 1F7C 03B9 +"\xE1\xBF\xB3" => "\x{03C9}\x{03B9}", # U+1FF3 => 03C9 03B9 +"\xE1\xBF\xB4" => "\x{03CE}\x{03B9}", # U+1FF4 => 03CE 03B9 +"\xE1\xBF\xB6" => "\x{03C9}\x{0342}", # U+1FF6 => 03C9 0342 +"\xE1\xBF\xB7" => "\x{03C9}\x{0342}\x{03B9}", # U+1FF7 => 03C9 0342 03B9 +"\xE1\xBF\xBC" => "\x{03C9}\x{03B9}", # U+1FFC => 03C9 03B9 +"\xEF\xAC\x80" => "\x{0066}\x{0066}", # U+FB00 => 0066 0066 +"\xEF\xAC\x81" => "\x{0066}\x{0069}", # U+FB01 => 0066 0069 +"\xEF\xAC\x82" => "\x{0066}\x{006C}", # U+FB02 => 0066 006C +"\xEF\xAC\x83" => "\x{0066}\x{0066}\x{0069}", # U+FB03 => 0066 0066 0069 +"\xEF\xAC\x84" => "\x{0066}\x{0066}\x{006C}", # U+FB04 => 0066 0066 006C +"\xEF\xAC\x85" => "\x{0073}\x{0074}", # U+FB05 => 0073 0074 +"\xEF\xAC\x86" => "\x{0073}\x{0074}", # U+FB06 => 0073 0074 +"\xEF\xAC\x93" => "\x{0574}\x{0576}", # U+FB13 => 0574 0576 +"\xEF\xAC\x94" => "\x{0574}\x{0565}", # U+FB14 => 0574 0565 +"\xEF\xAC\x95" => "\x{0574}\x{056B}", # U+FB15 => 0574 056B +"\xEF\xAC\x96" => "\x{057E}\x{0576}", # U+FB16 => 057E 0576 +"\xEF\xAC\x97" => "\x{0574}\x{056D}", # U+FB17 => 0574 056D +); + +return <<'END'; +41 5A 61 +B5 3BC +C0 D6 E0 +D8 DE F8 +100 101 +102 103 +104 105 +106 107 +108 109 +10A 10B +10C 10D +10E 10F +110 111 +112 113 +114 115 +116 117 +118 119 +11A 11B +11C 11D +11E 11F +120 121 +122 123 +124 125 +126 127 +128 129 +12A 12B +12C 12D +12E 12F +132 133 +134 135 +136 137 +139 13A +13B 13C +13D 13E +13F 140 +141 142 +143 144 +145 146 +147 148 +14A 14B +14C 14D +14E 14F +150 151 +152 153 +154 155 +156 157 +158 159 +15A 15B +15C 15D +15E 15F +160 161 +162 163 +164 165 +166 167 +168 169 +16A 16B +16C 16D +16E 16F +170 171 +172 173 +174 175 +176 177 +178 FF +179 17A +17B 17C +17D 17E +17F 73 +181 253 +182 183 +184 185 +186 254 +187 188 +189 18A 256 +18B 18C +18E 1DD +18F 259 +190 25B +191 192 +193 260 +194 263 +196 269 +197 268 +198 199 +19C 26F +19D 272 +19F 275 +1A0 1A1 +1A2 1A3 +1A4 1A5 +1A6 280 +1A7 1A8 +1A9 283 +1AC 1AD +1AE 288 +1AF 1B0 +1B1 1B2 28A +1B3 1B4 +1B5 1B6 +1B7 292 +1B8 1B9 +1BC 1BD +1C4 1C6 +1C5 1C6 +1C7 1C9 +1C8 1C9 +1CA 1CC +1CB 1CC +1CD 1CE +1CF 1D0 +1D1 1D2 +1D3 1D4 +1D5 1D6 +1D7 1D8 +1D9 1DA +1DB 1DC +1DE 1DF +1E0 1E1 +1E2 1E3 +1E4 1E5 +1E6 1E7 +1E8 1E9 +1EA 1EB +1EC 1ED +1EE 1EF +1F1 1F3 +1F2 1F3 +1F4 1F5 +1F6 195 +1F7 1BF +1F8 1F9 +1FA 1FB +1FC 1FD +1FE 1FF +200 201 +202 203 +204 205 +206 207 +208 209 +20A 20B +20C 20D +20E 20F +210 211 +212 213 +214 215 +216 217 +218 219 +21A 21B +21C 21D +21E 21F +220 19E +222 223 +224 225 +226 227 +228 229 +22A 22B +22C 22D +22E 22F +230 231 +232 233 +23A 2C65 +23B 23C +23D 19A +23E 2C66 +241 242 +243 180 +244 289 +245 28C +246 247 +248 249 +24A 24B +24C 24D +24E 24F +345 3B9 +370 371 +372 373 +376 377 +37F 3F3 +386 3AC +388 38A 3AD +38C 3CC +38E 38F 3CD +391 3A1 3B1 +3A3 3AB 3C3 +3C2 3C3 +3CF 3D7 +3D0 3B2 +3D1 3B8 +3D5 3C6 +3D6 3C0 +3D8 3D9 +3DA 3DB +3DC 3DD +3DE 3DF +3E0 3E1 +3E2 3E3 +3E4 3E5 +3E6 3E7 +3E8 3E9 +3EA 3EB +3EC 3ED +3EE 3EF +3F0 3BA +3F1 3C1 +3F4 3B8 +3F5 3B5 +3F7 3F8 +3F9 3F2 +3FA 3FB +3FD 3FF 37B +400 40F 450 +410 42F 430 +460 461 +462 463 +464 465 +466 467 +468 469 +46A 46B +46C 46D +46E 46F +470 471 +472 473 +474 475 +476 477 +478 479 +47A 47B +47C 47D +47E 47F +480 481 +48A 48B +48C 48D +48E 48F +490 491 +492 493 +494 495 +496 497 +498 499 +49A 49B +49C 49D +49E 49F +4A0 4A1 +4A2 4A3 +4A4 4A5 +4A6 4A7 +4A8 4A9 +4AA 4AB +4AC 4AD +4AE 4AF +4B0 4B1 +4B2 4B3 +4B4 4B5 +4B6 4B7 +4B8 4B9 +4BA 4BB +4BC 4BD +4BE 4BF +4C0 4CF +4C1 4C2 +4C3 4C4 +4C5 4C6 +4C7 4C8 +4C9 4CA +4CB 4CC +4CD 4CE +4D0 4D1 +4D2 4D3 +4D4 4D5 +4D6 4D7 +4D8 4D9 +4DA 4DB +4DC 4DD +4DE 4DF +4E0 4E1 +4E2 4E3 +4E4 4E5 +4E6 4E7 +4E8 4E9 +4EA 4EB +4EC 4ED +4EE 4EF +4F0 4F1 +4F2 4F3 +4F4 4F5 +4F6 4F7 +4F8 4F9 +4FA 4FB +4FC 4FD +4FE 4FF +500 501 +502 503 +504 505 +506 507 +508 509 +50A 50B +50C 50D +50E 50F +510 511 +512 513 +514 515 +516 517 +518 519 +51A 51B +51C 51D +51E 51F +520 521 +522 523 +524 525 +526 527 +528 529 +52A 52B +52C 52D +52E 52F +531 556 561 +10A0 10C5 2D00 +10C7 2D27 +10CD 2D2D +13F8 13FD 13F0 +1C80 432 +1C81 434 +1C82 43E +1C83 1C84 441 +1C85 442 +1C86 44A +1C87 463 +1C88 A64B +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1E9B 1E61 +1E9E DF +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1EFA 1EFB +1EFC 1EFD +1EFE 1EFF +1F08 1F0F 1F00 +1F18 1F1D 1F10 +1F28 1F2F 1F20 +1F38 1F3F 1F30 +1F48 1F4D 1F40 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F6F 1F60 +1F88 1F8F 1F80 +1F98 1F9F 1F90 +1FA8 1FAF 1FA0 +1FB8 1FB9 1FB0 +1FBA 1FBB 1F70 +1FBC 1FB3 +1FBE 3B9 +1FC8 1FCB 1F72 +1FCC 1FC3 +1FD8 1FD9 1FD0 +1FDA 1FDB 1F76 +1FE8 1FE9 1FE0 +1FEA 1FEB 1F7A +1FEC 1FE5 +1FF8 1FF9 1F78 +1FFA 1FFB 1F7C +1FFC 1FF3 +2126 3C9 +212A 6B +212B E5 +2132 214E +2160 216F 2170 +2183 2184 +24B6 24CF 24D0 +2C00 2C2E 2C30 +2C60 2C61 +2C62 26B +2C63 1D7D +2C64 27D +2C67 2C68 +2C69 2C6A +2C6B 2C6C +2C6D 251 +2C6E 271 +2C6F 250 +2C70 252 +2C72 2C73 +2C75 2C76 +2C7E 2C7F 23F +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +2CEB 2CEC +2CED 2CEE +2CF2 2CF3 +A640 A641 +A642 A643 +A644 A645 +A646 A647 +A648 A649 +A64A A64B +A64C A64D +A64E A64F +A650 A651 +A652 A653 +A654 A655 +A656 A657 +A658 A659 +A65A A65B +A65C A65D +A65E A65F +A660 A661 +A662 A663 +A664 A665 +A666 A667 +A668 A669 +A66A A66B +A66C A66D +A680 A681 +A682 A683 +A684 A685 +A686 A687 +A688 A689 +A68A A68B +A68C A68D +A68E A68F +A690 A691 +A692 A693 +A694 A695 +A696 A697 +A698 A699 +A69A A69B +A722 A723 +A724 A725 +A726 A727 +A728 A729 +A72A A72B +A72C A72D +A72E A72F +A732 A733 +A734 A735 +A736 A737 +A738 A739 +A73A A73B +A73C A73D +A73E A73F +A740 A741 +A742 A743 +A744 A745 +A746 A747 +A748 A749 +A74A A74B +A74C A74D +A74E A74F +A750 A751 +A752 A753 +A754 A755 +A756 A757 +A758 A759 +A75A A75B +A75C A75D +A75E A75F +A760 A761 +A762 A763 +A764 A765 +A766 A767 +A768 A769 +A76A A76B +A76C A76D +A76E A76F +A779 A77A +A77B A77C +A77D 1D79 +A77E A77F +A780 A781 +A782 A783 +A784 A785 +A786 A787 +A78B A78C +A78D 265 +A790 A791 +A792 A793 +A796 A797 +A798 A799 +A79A A79B +A79C A79D +A79E A79F +A7A0 A7A1 +A7A2 A7A3 +A7A4 A7A5 +A7A6 A7A7 +A7A8 A7A9 +A7AA 266 +A7AB 25C +A7AC 261 +A7AD 26C +A7AE 26A +A7B0 29E +A7B1 287 +A7B2 29D +A7B3 AB53 +A7B4 A7B5 +A7B6 A7B7 +AB70 ABBF 13A0 +FF21 FF3A FF41 +10400 10427 10428 +104B0 104D3 104D8 +10C80 10CB2 10CC0 +118A0 118BF 118C0 +1E900 1E921 1E922 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('Case_Folding') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToFold'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToFold'}{'specials_name'} = 'utf8::ToSpecFold'; # Name of hash of special mappings +$utf8::SwashInfo{'ToFold'}{'missing'} = '<code point>'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecFold = ( +"\xC3\x9F" => "\x{0073}\x{0073}", # U+00DF => 0073 0073 +"\xC4\xB0" => "\x{0069}\x{0307}", # U+0130 => 0069 0307 +"\xC5\x89" => "\x{02BC}\x{006E}", # U+0149 => 02BC 006E +"\xC7\xB0" => "\x{006A}\x{030C}", # U+01F0 => 006A 030C +"\xCE\x90" => "\x{03B9}\x{0308}\x{0301}", # U+0390 => 03B9 0308 0301 +"\xCE\xB0" => "\x{03C5}\x{0308}\x{0301}", # U+03B0 => 03C5 0308 0301 +"\xD6\x87" => "\x{0565}\x{0582}", # U+0587 => 0565 0582 +"\xE1\xBA\x96" => "\x{0068}\x{0331}", # U+1E96 => 0068 0331 +"\xE1\xBA\x97" => "\x{0074}\x{0308}", # U+1E97 => 0074 0308 +"\xE1\xBA\x98" => "\x{0077}\x{030A}", # U+1E98 => 0077 030A +"\xE1\xBA\x99" => "\x{0079}\x{030A}", # U+1E99 => 0079 030A +"\xE1\xBA\x9A" => "\x{0061}\x{02BE}", # U+1E9A => 0061 02BE +"\xE1\xBA\x9E" => "\x{0073}\x{0073}", # U+1E9E => 0073 0073 +"\xE1\xBD\x90" => "\x{03C5}\x{0313}", # U+1F50 => 03C5 0313 +"\xE1\xBD\x92" => "\x{03C5}\x{0313}\x{0300}", # U+1F52 => 03C5 0313 0300 +"\xE1\xBD\x94" => "\x{03C5}\x{0313}\x{0301}", # U+1F54 => 03C5 0313 0301 +"\xE1\xBD\x96" => "\x{03C5}\x{0313}\x{0342}", # U+1F56 => 03C5 0313 0342 +"\xE1\xBE\x80" => "\x{1F00}\x{03B9}", # U+1F80 => 1F00 03B9 +"\xE1\xBE\x81" => "\x{1F01}\x{03B9}", # U+1F81 => 1F01 03B9 +"\xE1\xBE\x82" => "\x{1F02}\x{03B9}", # U+1F82 => 1F02 03B9 +"\xE1\xBE\x83" => "\x{1F03}\x{03B9}", # U+1F83 => 1F03 03B9 +"\xE1\xBE\x84" => "\x{1F04}\x{03B9}", # U+1F84 => 1F04 03B9 +"\xE1\xBE\x85" => "\x{1F05}\x{03B9}", # U+1F85 => 1F05 03B9 +"\xE1\xBE\x86" => "\x{1F06}\x{03B9}", # U+1F86 => 1F06 03B9 +"\xE1\xBE\x87" => "\x{1F07}\x{03B9}", # U+1F87 => 1F07 03B9 +"\xE1\xBE\x88" => "\x{1F00}\x{03B9}", # U+1F88 => 1F00 03B9 +"\xE1\xBE\x89" => "\x{1F01}\x{03B9}", # U+1F89 => 1F01 03B9 +"\xE1\xBE\x8A" => "\x{1F02}\x{03B9}", # U+1F8A => 1F02 03B9 +"\xE1\xBE\x8B" => "\x{1F03}\x{03B9}", # U+1F8B => 1F03 03B9 +"\xE1\xBE\x8C" => "\x{1F04}\x{03B9}", # U+1F8C => 1F04 03B9 +"\xE1\xBE\x8D" => "\x{1F05}\x{03B9}", # U+1F8D => 1F05 03B9 +"\xE1\xBE\x8E" => "\x{1F06}\x{03B9}", # U+1F8E => 1F06 03B9 +"\xE1\xBE\x8F" => "\x{1F07}\x{03B9}", # U+1F8F => 1F07 03B9 +"\xE1\xBE\x90" => "\x{1F20}\x{03B9}", # U+1F90 => 1F20 03B9 +"\xE1\xBE\x91" => "\x{1F21}\x{03B9}", # U+1F91 => 1F21 03B9 +"\xE1\xBE\x92" => "\x{1F22}\x{03B9}", # U+1F92 => 1F22 03B9 +"\xE1\xBE\x93" => "\x{1F23}\x{03B9}", # U+1F93 => 1F23 03B9 +"\xE1\xBE\x94" => "\x{1F24}\x{03B9}", # U+1F94 => 1F24 03B9 +"\xE1\xBE\x95" => "\x{1F25}\x{03B9}", # U+1F95 => 1F25 03B9 +"\xE1\xBE\x96" => "\x{1F26}\x{03B9}", # U+1F96 => 1F26 03B9 +"\xE1\xBE\x97" => "\x{1F27}\x{03B9}", # U+1F97 => 1F27 03B9 +"\xE1\xBE\x98" => "\x{1F20}\x{03B9}", # U+1F98 => 1F20 03B9 +"\xE1\xBE\x99" => "\x{1F21}\x{03B9}", # U+1F99 => 1F21 03B9 +"\xE1\xBE\x9A" => "\x{1F22}\x{03B9}", # U+1F9A => 1F22 03B9 +"\xE1\xBE\x9B" => "\x{1F23}\x{03B9}", # U+1F9B => 1F23 03B9 +"\xE1\xBE\x9C" => "\x{1F24}\x{03B9}", # U+1F9C => 1F24 03B9 +"\xE1\xBE\x9D" => "\x{1F25}\x{03B9}", # U+1F9D => 1F25 03B9 +"\xE1\xBE\x9E" => "\x{1F26}\x{03B9}", # U+1F9E => 1F26 03B9 +"\xE1\xBE\x9F" => "\x{1F27}\x{03B9}", # U+1F9F => 1F27 03B9 +"\xE1\xBE\xA0" => "\x{1F60}\x{03B9}", # U+1FA0 => 1F60 03B9 +"\xE1\xBE\xA1" => "\x{1F61}\x{03B9}", # U+1FA1 => 1F61 03B9 +"\xE1\xBE\xA2" => "\x{1F62}\x{03B9}", # U+1FA2 => 1F62 03B9 +"\xE1\xBE\xA3" => "\x{1F63}\x{03B9}", # U+1FA3 => 1F63 03B9 +"\xE1\xBE\xA4" => "\x{1F64}\x{03B9}", # U+1FA4 => 1F64 03B9 +"\xE1\xBE\xA5" => "\x{1F65}\x{03B9}", # U+1FA5 => 1F65 03B9 +"\xE1\xBE\xA6" => "\x{1F66}\x{03B9}", # U+1FA6 => 1F66 03B9 +"\xE1\xBE\xA7" => "\x{1F67}\x{03B9}", # U+1FA7 => 1F67 03B9 +"\xE1\xBE\xA8" => "\x{1F60}\x{03B9}", # U+1FA8 => 1F60 03B9 +"\xE1\xBE\xA9" => "\x{1F61}\x{03B9}", # U+1FA9 => 1F61 03B9 +"\xE1\xBE\xAA" => "\x{1F62}\x{03B9}", # U+1FAA => 1F62 03B9 +"\xE1\xBE\xAB" => "\x{1F63}\x{03B9}", # U+1FAB => 1F63 03B9 +"\xE1\xBE\xAC" => "\x{1F64}\x{03B9}", # U+1FAC => 1F64 03B9 +"\xE1\xBE\xAD" => "\x{1F65}\x{03B9}", # U+1FAD => 1F65 03B9 +"\xE1\xBE\xAE" => "\x{1F66}\x{03B9}", # U+1FAE => 1F66 03B9 +"\xE1\xBE\xAF" => "\x{1F67}\x{03B9}", # U+1FAF => 1F67 03B9 +"\xE1\xBE\xB2" => "\x{1F70}\x{03B9}", # U+1FB2 => 1F70 03B9 +"\xE1\xBE\xB3" => "\x{03B1}\x{03B9}", # U+1FB3 => 03B1 03B9 +"\xE1\xBE\xB4" => "\x{03AC}\x{03B9}", # U+1FB4 => 03AC 03B9 +"\xE1\xBE\xB6" => "\x{03B1}\x{0342}", # U+1FB6 => 03B1 0342 +"\xE1\xBE\xB7" => "\x{03B1}\x{0342}\x{03B9}", # U+1FB7 => 03B1 0342 03B9 +"\xE1\xBE\xBC" => "\x{03B1}\x{03B9}", # U+1FBC => 03B1 03B9 +"\xE1\xBF\x82" => "\x{1F74}\x{03B9}", # U+1FC2 => 1F74 03B9 +"\xE1\xBF\x83" => "\x{03B7}\x{03B9}", # U+1FC3 => 03B7 03B9 +"\xE1\xBF\x84" => "\x{03AE}\x{03B9}", # U+1FC4 => 03AE 03B9 +"\xE1\xBF\x86" => "\x{03B7}\x{0342}", # U+1FC6 => 03B7 0342 +"\xE1\xBF\x87" => "\x{03B7}\x{0342}\x{03B9}", # U+1FC7 => 03B7 0342 03B9 +"\xE1\xBF\x8C" => "\x{03B7}\x{03B9}", # U+1FCC => 03B7 03B9 +"\xE1\xBF\x92" => "\x{03B9}\x{0308}\x{0300}", # U+1FD2 => 03B9 0308 0300 +"\xE1\xBF\x93" => "\x{03B9}\x{0308}\x{0301}", # U+1FD3 => 03B9 0308 0301 +"\xE1\xBF\x96" => "\x{03B9}\x{0342}", # U+1FD6 => 03B9 0342 +"\xE1\xBF\x97" => "\x{03B9}\x{0308}\x{0342}", # U+1FD7 => 03B9 0308 0342 +"\xE1\xBF\xA2" => "\x{03C5}\x{0308}\x{0300}", # U+1FE2 => 03C5 0308 0300 +"\xE1\xBF\xA3" => "\x{03C5}\x{0308}\x{0301}", # U+1FE3 => 03C5 0308 0301 +"\xE1\xBF\xA4" => "\x{03C1}\x{0313}", # U+1FE4 => 03C1 0313 +"\xE1\xBF\xA6" => "\x{03C5}\x{0342}", # U+1FE6 => 03C5 0342 +"\xE1\xBF\xA7" => "\x{03C5}\x{0308}\x{0342}", # U+1FE7 => 03C5 0308 0342 +"\xE1\xBF\xB2" => "\x{1F7C}\x{03B9}", # U+1FF2 => 1F7C 03B9 +"\xE1\xBF\xB3" => "\x{03C9}\x{03B9}", # U+1FF3 => 03C9 03B9 +"\xE1\xBF\xB4" => "\x{03CE}\x{03B9}", # U+1FF4 => 03CE 03B9 +"\xE1\xBF\xB6" => "\x{03C9}\x{0342}", # U+1FF6 => 03C9 0342 +"\xE1\xBF\xB7" => "\x{03C9}\x{0342}\x{03B9}", # U+1FF7 => 03C9 0342 03B9 +"\xE1\xBF\xBC" => "\x{03C9}\x{03B9}", # U+1FFC => 03C9 03B9 +"\xEF\xAC\x80" => "\x{0066}\x{0066}", # U+FB00 => 0066 0066 +"\xEF\xAC\x81" => "\x{0066}\x{0069}", # U+FB01 => 0066 0069 +"\xEF\xAC\x82" => "\x{0066}\x{006C}", # U+FB02 => 0066 006C +"\xEF\xAC\x83" => "\x{0066}\x{0066}\x{0069}", # U+FB03 => 0066 0066 0069 +"\xEF\xAC\x84" => "\x{0066}\x{0066}\x{006C}", # U+FB04 => 0066 0066 006C +"\xEF\xAC\x85" => "\x{0073}\x{0074}", # U+FB05 => 0073 0074 +"\xEF\xAC\x86" => "\x{0073}\x{0074}", # U+FB06 => 0073 0074 +"\xEF\xAC\x93" => "\x{0574}\x{0576}", # U+FB13 => 0574 0576 +"\xEF\xAC\x94" => "\x{0574}\x{0565}", # U+FB14 => 0574 0565 +"\xEF\xAC\x95" => "\x{0574}\x{056B}", # U+FB15 => 0574 056B +"\xEF\xAC\x96" => "\x{057E}\x{0576}", # U+FB16 => 057E 0576 +"\xEF\xAC\x97" => "\x{0574}\x{056D}", # U+FB17 => 0574 056D +); + +return <<'END'; +0041 0061 +0042 0062 +0043 0063 +0044 0064 +0045 0065 +0046 0066 +0047 0067 +0048 0068 +0049 0069 +004A 006A +004B 006B +004C 006C +004D 006D +004E 006E +004F 006F +0050 0070 +0051 0071 +0052 0072 +0053 0073 +0054 0074 +0055 0075 +0056 0076 +0057 0077 +0058 0078 +0059 0079 +005A 007A +00B5 03BC +00C0 00E0 +00C1 00E1 +00C2 00E2 +00C3 00E3 +00C4 00E4 +00C5 00E5 +00C6 00E6 +00C7 00E7 +00C8 00E8 +00C9 00E9 +00CA 00EA +00CB 00EB +00CC 00EC +00CD 00ED +00CE 00EE +00CF 00EF +00D0 00F0 +00D1 00F1 +00D2 00F2 +00D3 00F3 +00D4 00F4 +00D5 00F5 +00D6 00F6 +00D8 00F8 +00D9 00F9 +00DA 00FA +00DB 00FB +00DC 00FC +00DD 00FD +00DE 00FE +0100 0101 +0102 0103 +0104 0105 +0106 0107 +0108 0109 +010A 010B +010C 010D +010E 010F +0110 0111 +0112 0113 +0114 0115 +0116 0117 +0118 0119 +011A 011B +011C 011D +011E 011F +0120 0121 +0122 0123 +0124 0125 +0126 0127 +0128 0129 +012A 012B +012C 012D +012E 012F +0132 0133 +0134 0135 +0136 0137 +0139 013A +013B 013C +013D 013E +013F 0140 +0141 0142 +0143 0144 +0145 0146 +0147 0148 +014A 014B +014C 014D +014E 014F +0150 0151 +0152 0153 +0154 0155 +0156 0157 +0158 0159 +015A 015B +015C 015D +015E 015F +0160 0161 +0162 0163 +0164 0165 +0166 0167 +0168 0169 +016A 016B +016C 016D +016E 016F +0170 0171 +0172 0173 +0174 0175 +0176 0177 +0178 00FF +0179 017A +017B 017C +017D 017E +017F 0073 +0181 0253 +0182 0183 +0184 0185 +0186 0254 +0187 0188 +0189 0256 +018A 0257 +018B 018C +018E 01DD +018F 0259 +0190 025B +0191 0192 +0193 0260 +0194 0263 +0196 0269 +0197 0268 +0198 0199 +019C 026F +019D 0272 +019F 0275 +01A0 01A1 +01A2 01A3 +01A4 01A5 +01A6 0280 +01A7 01A8 +01A9 0283 +01AC 01AD +01AE 0288 +01AF 01B0 +01B1 028A +01B2 028B +01B3 01B4 +01B5 01B6 +01B7 0292 +01B8 01B9 +01BC 01BD +01C4 01C6 +01C5 01C6 +01C7 01C9 +01C8 01C9 +01CA 01CC +01CB 01CC +01CD 01CE +01CF 01D0 +01D1 01D2 +01D3 01D4 +01D5 01D6 +01D7 01D8 +01D9 01DA +01DB 01DC +01DE 01DF +01E0 01E1 +01E2 01E3 +01E4 01E5 +01E6 01E7 +01E8 01E9 +01EA 01EB +01EC 01ED +01EE 01EF +01F1 01F3 +01F2 01F3 +01F4 01F5 +01F6 0195 +01F7 01BF +01F8 01F9 +01FA 01FB +01FC 01FD +01FE 01FF +0200 0201 +0202 0203 +0204 0205 +0206 0207 +0208 0209 +020A 020B +020C 020D +020E 020F +0210 0211 +0212 0213 +0214 0215 +0216 0217 +0218 0219 +021A 021B +021C 021D +021E 021F +0220 019E +0222 0223 +0224 0225 +0226 0227 +0228 0229 +022A 022B +022C 022D +022E 022F +0230 0231 +0232 0233 +023A 2C65 +023B 023C +023D 019A +023E 2C66 +0241 0242 +0243 0180 +0244 0289 +0245 028C +0246 0247 +0248 0249 +024A 024B +024C 024D +024E 024F +0345 03B9 +0370 0371 +0372 0373 +0376 0377 +037F 03F3 +0386 03AC +0388 03AD +0389 03AE +038A 03AF +038C 03CC +038E 03CD +038F 03CE +0391 03B1 +0392 03B2 +0393 03B3 +0394 03B4 +0395 03B5 +0396 03B6 +0397 03B7 +0398 03B8 +0399 03B9 +039A 03BA +039B 03BB +039C 03BC +039D 03BD +039E 03BE +039F 03BF +03A0 03C0 +03A1 03C1 +03A3 03C3 +03A4 03C4 +03A5 03C5 +03A6 03C6 +03A7 03C7 +03A8 03C8 +03A9 03C9 +03AA 03CA +03AB 03CB +03C2 03C3 +03CF 03D7 +03D0 03B2 +03D1 03B8 +03D5 03C6 +03D6 03C0 +03D8 03D9 +03DA 03DB +03DC 03DD +03DE 03DF +03E0 03E1 +03E2 03E3 +03E4 03E5 +03E6 03E7 +03E8 03E9 +03EA 03EB +03EC 03ED +03EE 03EF +03F0 03BA +03F1 03C1 +03F4 03B8 +03F5 03B5 +03F7 03F8 +03F9 03F2 +03FA 03FB +03FD 037B +03FE 037C +03FF 037D +0400 0450 +0401 0451 +0402 0452 +0403 0453 +0404 0454 +0405 0455 +0406 0456 +0407 0457 +0408 0458 +0409 0459 +040A 045A +040B 045B +040C 045C +040D 045D +040E 045E +040F 045F +0410 0430 +0411 0431 +0412 0432 +0413 0433 +0414 0434 +0415 0435 +0416 0436 +0417 0437 +0418 0438 +0419 0439 +041A 043A +041B 043B +041C 043C +041D 043D +041E 043E +041F 043F +0420 0440 +0421 0441 +0422 0442 +0423 0443 +0424 0444 +0425 0445 +0426 0446 +0427 0447 +0428 0448 +0429 0449 +042A 044A +042B 044B +042C 044C +042D 044D +042E 044E +042F 044F +0460 0461 +0462 0463 +0464 0465 +0466 0467 +0468 0469 +046A 046B +046C 046D +046E 046F +0470 0471 +0472 0473 +0474 0475 +0476 0477 +0478 0479 +047A 047B +047C 047D +047E 047F +0480 0481 +048A 048B +048C 048D +048E 048F +0490 0491 +0492 0493 +0494 0495 +0496 0497 +0498 0499 +049A 049B +049C 049D +049E 049F +04A0 04A1 +04A2 04A3 +04A4 04A5 +04A6 04A7 +04A8 04A9 +04AA 04AB +04AC 04AD +04AE 04AF +04B0 04B1 +04B2 04B3 +04B4 04B5 +04B6 04B7 +04B8 04B9 +04BA 04BB +04BC 04BD +04BE 04BF +04C0 04CF +04C1 04C2 +04C3 04C4 +04C5 04C6 +04C7 04C8 +04C9 04CA +04CB 04CC +04CD 04CE +04D0 04D1 +04D2 04D3 +04D4 04D5 +04D6 04D7 +04D8 04D9 +04DA 04DB +04DC 04DD +04DE 04DF +04E0 04E1 +04E2 04E3 +04E4 04E5 +04E6 04E7 +04E8 04E9 +04EA 04EB +04EC 04ED +04EE 04EF +04F0 04F1 +04F2 04F3 +04F4 04F5 +04F6 04F7 +04F8 04F9 +04FA 04FB +04FC 04FD +04FE 04FF +0500 0501 +0502 0503 +0504 0505 +0506 0507 +0508 0509 +050A 050B +050C 050D +050E 050F +0510 0511 +0512 0513 +0514 0515 +0516 0517 +0518 0519 +051A 051B +051C 051D +051E 051F +0520 0521 +0522 0523 +0524 0525 +0526 0527 +0528 0529 +052A 052B +052C 052D +052E 052F +0531 0561 +0532 0562 +0533 0563 +0534 0564 +0535 0565 +0536 0566 +0537 0567 +0538 0568 +0539 0569 +053A 056A +053B 056B +053C 056C +053D 056D +053E 056E +053F 056F +0540 0570 +0541 0571 +0542 0572 +0543 0573 +0544 0574 +0545 0575 +0546 0576 +0547 0577 +0548 0578 +0549 0579 +054A 057A +054B 057B +054C 057C +054D 057D +054E 057E +054F 057F +0550 0580 +0551 0581 +0552 0582 +0553 0583 +0554 0584 +0555 0585 +0556 0586 +10A0 2D00 +10A1 2D01 +10A2 2D02 +10A3 2D03 +10A4 2D04 +10A5 2D05 +10A6 2D06 +10A7 2D07 +10A8 2D08 +10A9 2D09 +10AA 2D0A +10AB 2D0B +10AC 2D0C +10AD 2D0D +10AE 2D0E +10AF 2D0F +10B0 2D10 +10B1 2D11 +10B2 2D12 +10B3 2D13 +10B4 2D14 +10B5 2D15 +10B6 2D16 +10B7 2D17 +10B8 2D18 +10B9 2D19 +10BA 2D1A +10BB 2D1B +10BC 2D1C +10BD 2D1D +10BE 2D1E +10BF 2D1F +10C0 2D20 +10C1 2D21 +10C2 2D22 +10C3 2D23 +10C4 2D24 +10C5 2D25 +10C7 2D27 +10CD 2D2D +13F8 13F0 +13F9 13F1 +13FA 13F2 +13FB 13F3 +13FC 13F4 +13FD 13F5 +1C80 0432 +1C81 0434 +1C82 043E +1C83 0441 +1C84 0442 +1C85 0442 +1C86 044A +1C87 0463 +1C88 A64B +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1E9B 1E61 +1E9E 00DF +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1EFA 1EFB +1EFC 1EFD +1EFE 1EFF +1F08 1F00 +1F09 1F01 +1F0A 1F02 +1F0B 1F03 +1F0C 1F04 +1F0D 1F05 +1F0E 1F06 +1F0F 1F07 +1F18 1F10 +1F19 1F11 +1F1A 1F12 +1F1B 1F13 +1F1C 1F14 +1F1D 1F15 +1F28 1F20 +1F29 1F21 +1F2A 1F22 +1F2B 1F23 +1F2C 1F24 +1F2D 1F25 +1F2E 1F26 +1F2F 1F27 +1F38 1F30 +1F39 1F31 +1F3A 1F32 +1F3B 1F33 +1F3C 1F34 +1F3D 1F35 +1F3E 1F36 +1F3F 1F37 +1F48 1F40 +1F49 1F41 +1F4A 1F42 +1F4B 1F43 +1F4C 1F44 +1F4D 1F45 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F60 +1F69 1F61 +1F6A 1F62 +1F6B 1F63 +1F6C 1F64 +1F6D 1F65 +1F6E 1F66 +1F6F 1F67 +1F88 1F80 +1F89 1F81 +1F8A 1F82 +1F8B 1F83 +1F8C 1F84 +1F8D 1F85 +1F8E 1F86 +1F8F 1F87 +1F98 1F90 +1F99 1F91 +1F9A 1F92 +1F9B 1F93 +1F9C 1F94 +1F9D 1F95 +1F9E 1F96 +1F9F 1F97 +1FA8 1FA0 +1FA9 1FA1 +1FAA 1FA2 +1FAB 1FA3 +1FAC 1FA4 +1FAD 1FA5 +1FAE 1FA6 +1FAF 1FA7 +1FB8 1FB0 +1FB9 1FB1 +1FBA 1F70 +1FBB 1F71 +1FBC 1FB3 +1FBE 03B9 +1FC8 1F72 +1FC9 1F73 +1FCA 1F74 +1FCB 1F75 +1FCC 1FC3 +1FD8 1FD0 +1FD9 1FD1 +1FDA 1F76 +1FDB 1F77 +1FE8 1FE0 +1FE9 1FE1 +1FEA 1F7A +1FEB 1F7B +1FEC 1FE5 +1FF8 1F78 +1FF9 1F79 +1FFA 1F7C +1FFB 1F7D +1FFC 1FF3 +2126 03C9 +212A 006B +212B 00E5 +2132 214E +2160 2170 +2161 2171 +2162 2172 +2163 2173 +2164 2174 +2165 2175 +2166 2176 +2167 2177 +2168 2178 +2169 2179 +216A 217A +216B 217B +216C 217C +216D 217D +216E 217E +216F 217F +2183 2184 +24B6 24D0 +24B7 24D1 +24B8 24D2 +24B9 24D3 +24BA 24D4 +24BB 24D5 +24BC 24D6 +24BD 24D7 +24BE 24D8 +24BF 24D9 +24C0 24DA +24C1 24DB +24C2 24DC +24C3 24DD +24C4 24DE +24C5 24DF +24C6 24E0 +24C7 24E1 +24C8 24E2 +24C9 24E3 +24CA 24E4 +24CB 24E5 +24CC 24E6 +24CD 24E7 +24CE 24E8 +24CF 24E9 +2C00 2C30 +2C01 2C31 +2C02 2C32 +2C03 2C33 +2C04 2C34 +2C05 2C35 +2C06 2C36 +2C07 2C37 +2C08 2C38 +2C09 2C39 +2C0A 2C3A +2C0B 2C3B +2C0C 2C3C +2C0D 2C3D +2C0E 2C3E +2C0F 2C3F +2C10 2C40 +2C11 2C41 +2C12 2C42 +2C13 2C43 +2C14 2C44 +2C15 2C45 +2C16 2C46 +2C17 2C47 +2C18 2C48 +2C19 2C49 +2C1A 2C4A +2C1B 2C4B +2C1C 2C4C +2C1D 2C4D +2C1E 2C4E +2C1F 2C4F +2C20 2C50 +2C21 2C51 +2C22 2C52 +2C23 2C53 +2C24 2C54 +2C25 2C55 +2C26 2C56 +2C27 2C57 +2C28 2C58 +2C29 2C59 +2C2A 2C5A +2C2B 2C5B +2C2C 2C5C +2C2D 2C5D +2C2E 2C5E +2C60 2C61 +2C62 026B +2C63 1D7D +2C64 027D +2C67 2C68 +2C69 2C6A +2C6B 2C6C +2C6D 0251 +2C6E 0271 +2C6F 0250 +2C70 0252 +2C72 2C73 +2C75 2C76 +2C7E 023F +2C7F 0240 +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +2CEB 2CEC +2CED 2CEE +2CF2 2CF3 +A640 A641 +A642 A643 +A644 A645 +A646 A647 +A648 A649 +A64A A64B +A64C A64D +A64E A64F +A650 A651 +A652 A653 +A654 A655 +A656 A657 +A658 A659 +A65A A65B +A65C A65D +A65E A65F +A660 A661 +A662 A663 +A664 A665 +A666 A667 +A668 A669 +A66A A66B +A66C A66D +A680 A681 +A682 A683 +A684 A685 +A686 A687 +A688 A689 +A68A A68B +A68C A68D +A68E A68F +A690 A691 +A692 A693 +A694 A695 +A696 A697 +A698 A699 +A69A A69B +A722 A723 +A724 A725 +A726 A727 +A728 A729 +A72A A72B +A72C A72D +A72E A72F +A732 A733 +A734 A735 +A736 A737 +A738 A739 +A73A A73B +A73C A73D +A73E A73F +A740 A741 +A742 A743 +A744 A745 +A746 A747 +A748 A749 +A74A A74B +A74C A74D +A74E A74F +A750 A751 +A752 A753 +A754 A755 +A756 A757 +A758 A759 +A75A A75B +A75C A75D +A75E A75F +A760 A761 +A762 A763 +A764 A765 +A766 A767 +A768 A769 +A76A A76B +A76C A76D +A76E A76F +A779 A77A +A77B A77C +A77D 1D79 +A77E A77F +A780 A781 +A782 A783 +A784 A785 +A786 A787 +A78B A78C +A78D 0265 +A790 A791 +A792 A793 +A796 A797 +A798 A799 +A79A A79B +A79C A79D +A79E A79F +A7A0 A7A1 +A7A2 A7A3 +A7A4 A7A5 +A7A6 A7A7 +A7A8 A7A9 +A7AA 0266 +A7AB 025C +A7AC 0261 +A7AD 026C +A7AE 026A +A7B0 029E +A7B1 0287 +A7B2 029D +A7B3 AB53 +A7B4 A7B5 +A7B6 A7B7 +AB70 13A0 +AB71 13A1 +AB72 13A2 +AB73 13A3 +AB74 13A4 +AB75 13A5 +AB76 13A6 +AB77 13A7 +AB78 13A8 +AB79 13A9 +AB7A 13AA +AB7B 13AB +AB7C 13AC +AB7D 13AD +AB7E 13AE +AB7F 13AF +AB80 13B0 +AB81 13B1 +AB82 13B2 +AB83 13B3 +AB84 13B4 +AB85 13B5 +AB86 13B6 +AB87 13B7 +AB88 13B8 +AB89 13B9 +AB8A 13BA +AB8B 13BB +AB8C 13BC +AB8D 13BD +AB8E 13BE +AB8F 13BF +AB90 13C0 +AB91 13C1 +AB92 13C2 +AB93 13C3 +AB94 13C4 +AB95 13C5 +AB96 13C6 +AB97 13C7 +AB98 13C8 +AB99 13C9 +AB9A 13CA +AB9B 13CB +AB9C 13CC +AB9D 13CD +AB9E 13CE +AB9F 13CF +ABA0 13D0 +ABA1 13D1 +ABA2 13D2 +ABA3 13D3 +ABA4 13D4 +ABA5 13D5 +ABA6 13D6 +ABA7 13D7 +ABA8 13D8 +ABA9 13D9 +ABAA 13DA +ABAB 13DB +ABAC 13DC +ABAD 13DD +ABAE 13DE +ABAF 13DF +ABB0 13E0 +ABB1 13E1 +ABB2 13E2 +ABB3 13E3 +ABB4 13E4 +ABB5 13E5 +ABB6 13E6 +ABB7 13E7 +ABB8 13E8 +ABB9 13E9 +ABBA 13EA +ABBB 13EB +ABBC 13EC +ABBD 13ED +ABBE 13EE +ABBF 13EF +FF21 FF41 +FF22 FF42 +FF23 FF43 +FF24 FF44 +FF25 FF45 +FF26 FF46 +FF27 FF47 +FF28 FF48 +FF29 FF49 +FF2A FF4A +FF2B FF4B +FF2C FF4C +FF2D FF4D +FF2E FF4E +FF2F FF4F +FF30 FF50 +FF31 FF51 +FF32 FF52 +FF33 FF53 +FF34 FF54 +FF35 FF55 +FF36 FF56 +FF37 FF57 +FF38 FF58 +FF39 FF59 +FF3A FF5A +10400 10428 +10401 10429 +10402 1042A +10403 1042B +10404 1042C +10405 1042D +10406 1042E +10407 1042F +10408 10430 +10409 10431 +1040A 10432 +1040B 10433 +1040C 10434 +1040D 10435 +1040E 10436 +1040F 10437 +10410 10438 +10411 10439 +10412 1043A +10413 1043B +10414 1043C +10415 1043D +10416 1043E +10417 1043F +10418 10440 +10419 10441 +1041A 10442 +1041B 10443 +1041C 10444 +1041D 10445 +1041E 10446 +1041F 10447 +10420 10448 +10421 10449 +10422 1044A +10423 1044B +10424 1044C +10425 1044D +10426 1044E +10427 1044F +104B0 104D8 +104B1 104D9 +104B2 104DA +104B3 104DB +104B4 104DC +104B5 104DD +104B6 104DE +104B7 104DF +104B8 104E0 +104B9 104E1 +104BA 104E2 +104BB 104E3 +104BC 104E4 +104BD 104E5 +104BE 104E6 +104BF 104E7 +104C0 104E8 +104C1 104E9 +104C2 104EA +104C3 104EB +104C4 104EC +104C5 104ED +104C6 104EE +104C7 104EF +104C8 104F0 +104C9 104F1 +104CA 104F2 +104CB 104F3 +104CC 104F4 +104CD 104F5 +104CE 104F6 +104CF 104F7 +104D0 104F8 +104D1 104F9 +104D2 104FA +104D3 104FB +10C80 10CC0 +10C81 10CC1 +10C82 10CC2 +10C83 10CC3 +10C84 10CC4 +10C85 10CC5 +10C86 10CC6 +10C87 10CC7 +10C88 10CC8 +10C89 10CC9 +10C8A 10CCA +10C8B 10CCB +10C8C 10CCC +10C8D 10CCD +10C8E 10CCE +10C8F 10CCF +10C90 10CD0 +10C91 10CD1 +10C92 10CD2 +10C93 10CD3 +10C94 10CD4 +10C95 10CD5 +10C96 10CD6 +10C97 10CD7 +10C98 10CD8 +10C99 10CD9 +10C9A 10CDA +10C9B 10CDB +10C9C 10CDC +10C9D 10CDD +10C9E 10CDE +10C9F 10CDF +10CA0 10CE0 +10CA1 10CE1 +10CA2 10CE2 +10CA3 10CE3 +10CA4 10CE4 +10CA5 10CE5 +10CA6 10CE6 +10CA7 10CE7 +10CA8 10CE8 +10CA9 10CE9 +10CAA 10CEA +10CAB 10CEB +10CAC 10CEC +10CAD 10CED +10CAE 10CEE +10CAF 10CEF +10CB0 10CF0 +10CB1 10CF1 +10CB2 10CF2 +118A0 118C0 +118A1 118C1 +118A2 118C2 +118A3 118C3 +118A4 118C4 +118A5 118C5 +118A6 118C6 +118A7 118C7 +118A8 118C8 +118A9 118C9 +118AA 118CA +118AB 118CB +118AC 118CC +118AD 118CD +118AE 118CE +118AF 118CF +118B0 118D0 +118B1 118D1 +118B2 118D2 +118B3 118D3 +118B4 118D4 +118B5 118D5 +118B6 118D6 +118B7 118D7 +118B8 118D8 +118B9 118D9 +118BA 118DA +118BB 118DB +118BC 118DC +118BD 118DD +118BE 118DE +118BF 118DF +1E900 1E922 +1E901 1E923 +1E902 1E924 +1E903 1E925 +1E904 1E926 +1E905 1E927 +1E906 1E928 +1E907 1E929 +1E908 1E92A +1E909 1E92B +1E90A 1E92C +1E90B 1E92D +1E90C 1E92E +1E90D 1E92F +1E90E 1E930 +1E90F 1E931 +1E910 1E932 +1E911 1E933 +1E912 1E934 +1E913 1E935 +1E914 1E936 +1E915 1E937 +1E916 1E938 +1E917 1E939 +1E918 1E93A +1E919 1E93B +1E91A 1E93C +1E91B 1E93D +1E91C 1E93E +1E91D 1E93F +1E91E 1E940 +1E91F 1E941 +1E920 1E942 +1E921 1E943 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'To_PerlSCX'}{'format'} = 'sw'; # string, but some elements are interpreted as a list; white space occurs only as list item separators +$utf8::SwashInfo{'To_PerlSCX'}{'missing'} = 'Unknown'; + +return <<'END'; +0 40 Common +41 5A Latin +5B 60 Common +61 7A Latin +7B A9 Common +AA Latin +AB B9 Common +BA Latin +BB BF Common +C0 D6 Latin +D7 Common +D8 F6 Latin +F7 Common +F8 2B8 Latin +2B9 2DF Common +2E0 2E4 Latin +2E5 2E9 Common +2EA 2EB Bopomofo Hanb +2EC 2FF Common +300 341 Inherited +342 Greek +343 344 Inherited +345 Greek +346 362 Inherited +363 36F Latin +370 373 Greek +374 Common +375 377 Greek +37A 37D Greek +37E Common +37F Greek +384 Greek +385 Common +386 Greek +387 Common +388 38A Greek +38C Greek +38E 3A1 Greek +3A3 3E1 Greek +3E2 3EF Coptic +3F0 3FF Greek +400 482 Cyrillic +483 Cyrillic Old_Permic +484 Cyrillic Glagolitic +485 486 Cyrillic Latin +487 Cyrillic Glagolitic +488 52F Cyrillic +531 556 Armenian +559 55F Armenian +561 587 Armenian +589 Armenian Georgian +58A Armenian +58D 58F Armenian +591 5C7 Hebrew +5D0 5EA Hebrew +5F0 5F4 Hebrew +600 604 Arabic +605 Common +606 60B Arabic +60C Arabic Syriac Thaana +60D 61A Arabic +61B 61C Arabic Syriac Thaana +61E Arabic +61F Arabic Syriac Thaana +620 63F Arabic +640 Adlam Arabic Mandaic Manichaean Psalter_Pahlavi Syriac +641 64A Arabic +64B 655 Arabic Syriac +656 65F Arabic +660 669 Arabic Thaana +66A 66F Arabic +670 Arabic Syriac +671 6DC Arabic +6DD Common +6DE 6FF Arabic +700 70D Syriac +70F 74A Syriac +74D 74F Syriac +750 77F Arabic +780 7B1 Thaana +7C0 7FA Nko +800 82D Samaritan +830 83E Samaritan +840 85B Mandaic +85E Mandaic +860 86A Syriac +8A0 8B4 Arabic +8B6 8BD Arabic +8D4 8E1 Arabic +8E2 Common +8E3 8FF Arabic +900 950 Devanagari +951 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Latin Malayalam Oriya Sharada Tamil Telugu +952 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Latin Malayalam Oriya Tamil Telugu +953 963 Devanagari +964 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Mahajani Malayalam Oriya Khudawadi Sinhala Syloti_Nagri Takri Tamil Telugu Tirhuta +965 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Limbu Mahajani Malayalam Oriya Khudawadi Sinhala Syloti_Nagri Takri Tamil Telugu Tirhuta +966 96F Devanagari Kaithi Mahajani +970 97F Devanagari +980 983 Bengali +985 98C Bengali +98F 990 Bengali +993 9A8 Bengali +9AA 9B0 Bengali +9B2 Bengali +9B6 9B9 Bengali +9BC 9C4 Bengali +9C7 9C8 Bengali +9CB 9CE Bengali +9D7 Bengali +9DC 9DD Bengali +9DF 9E3 Bengali +9E6 9EF Bengali Chakma Syloti_Nagri +9F0 9FD Bengali +A01 A03 Gurmukhi +A05 A0A Gurmukhi +A0F A10 Gurmukhi +A13 A28 Gurmukhi +A2A A30 Gurmukhi +A32 A33 Gurmukhi +A35 A36 Gurmukhi +A38 A39 Gurmukhi +A3C Gurmukhi +A3E A42 Gurmukhi +A47 A48 Gurmukhi +A4B A4D Gurmukhi +A51 Gurmukhi +A59 A5C Gurmukhi +A5E Gurmukhi +A66 A6F Gurmukhi Multani +A70 A75 Gurmukhi +A81 A83 Gujarati +A85 A8D Gujarati +A8F A91 Gujarati +A93 AA8 Gujarati +AAA AB0 Gujarati +AB2 AB3 Gujarati +AB5 AB9 Gujarati +ABC AC5 Gujarati +AC7 AC9 Gujarati +ACB ACD Gujarati +AD0 Gujarati +AE0 AE3 Gujarati +AE6 AEF Gujarati Khojki +AF0 AF1 Gujarati +AF9 AFF Gujarati +B01 B03 Oriya +B05 B0C Oriya +B0F B10 Oriya +B13 B28 Oriya +B2A B30 Oriya +B32 B33 Oriya +B35 B39 Oriya +B3C B44 Oriya +B47 B48 Oriya +B4B B4D Oriya +B56 B57 Oriya +B5C B5D Oriya +B5F B63 Oriya +B66 B77 Oriya +B82 B83 Tamil +B85 B8A Tamil +B8E B90 Tamil +B92 B95 Tamil +B99 B9A Tamil +B9C Tamil +B9E B9F Tamil +BA3 BA4 Tamil +BA8 BA9 Tamil +BAA Grantha Tamil +BAE BB4 Tamil +BB5 Grantha Tamil +BB6 BB9 Tamil +BBE BC2 Tamil +BC6 BC8 Tamil +BCA BCD Tamil +BD0 Tamil +BD7 Tamil +BE6 BF2 Grantha Tamil +BF3 BFA Tamil +C00 C03 Telugu +C05 C0C Telugu +C0E C10 Telugu +C12 C28 Telugu +C2A C39 Telugu +C3D C44 Telugu +C46 C48 Telugu +C4A C4D Telugu +C55 C56 Telugu +C58 C5A Telugu +C60 C63 Telugu +C66 C6F Telugu +C78 C7F Telugu +C80 C83 Kannada +C85 C8C Kannada +C8E C90 Kannada +C92 CA8 Kannada +CAA CB3 Kannada +CB5 CB9 Kannada +CBC CC4 Kannada +CC6 CC8 Kannada +CCA CCD Kannada +CD5 CD6 Kannada +CDE Kannada +CE0 CE3 Kannada +CE6 CEF Kannada +CF1 CF2 Kannada +D00 D03 Malayalam +D05 D0C Malayalam +D0E D10 Malayalam +D12 D44 Malayalam +D46 D48 Malayalam +D4A D4F Malayalam +D54 D63 Malayalam +D66 D7F Malayalam +D82 D83 Sinhala +D85 D96 Sinhala +D9A DB1 Sinhala +DB3 DBB Sinhala +DBD Sinhala +DC0 DC6 Sinhala +DCA Sinhala +DCF DD4 Sinhala +DD6 Sinhala +DD8 DDF Sinhala +DE6 DEF Sinhala +DF2 DF4 Sinhala +E01 E3A Thai +E3F Common +E40 E5B Thai +E81 E82 Lao +E84 Lao +E87 E88 Lao +E8A Lao +E8D Lao +E94 E97 Lao +E99 E9F Lao +EA1 EA3 Lao +EA5 Lao +EA7 Lao +EAA EAB Lao +EAD EB9 Lao +EBB EBD Lao +EC0 EC4 Lao +EC6 Lao +EC8 ECD Lao +ED0 ED9 Lao +EDC EDF Lao +F00 F47 Tibetan +F49 F6C Tibetan +F71 F97 Tibetan +F99 FBC Tibetan +FBE FCC Tibetan +FCE FD4 Tibetan +FD5 FD8 Common +FD9 FDA Tibetan +1000 103F Myanmar +1040 1049 Chakma Myanmar Tai_Le +104A 109F Myanmar +10A0 10C5 Georgian +10C7 Georgian +10CD Georgian +10D0 10FA Georgian +10FB Georgian Latin +10FC 10FF Georgian +1100 11FF Hangul Kore +1200 1248 Ethiopic +124A 124D Ethiopic +1250 1256 Ethiopic +1258 Ethiopic +125A 125D Ethiopic +1260 1288 Ethiopic +128A 128D Ethiopic +1290 12B0 Ethiopic +12B2 12B5 Ethiopic +12B8 12BE Ethiopic +12C0 Ethiopic +12C2 12C5 Ethiopic +12C8 12D6 Ethiopic +12D8 1310 Ethiopic +1312 1315 Ethiopic +1318 135A Ethiopic +135D 137C Ethiopic +1380 1399 Ethiopic +13A0 13F5 Cherokee +13F8 13FD Cherokee +1400 167F Canadian_Aboriginal +1680 169C Ogham +16A0 16EA Runic +16EB 16ED Common +16EE 16F8 Runic +1700 170C Tagalog +170E 1714 Tagalog +1720 1734 Hanunoo +1735 1736 Buhid Hanunoo Tagbanwa Tagalog +1740 1753 Buhid +1760 176C Tagbanwa +176E 1770 Tagbanwa +1772 1773 Tagbanwa +1780 17DD Khmer +17E0 17E9 Khmer +17F0 17F9 Khmer +1800 1801 Mongolian +1802 1803 Mongolian Phags_Pa +1804 Mongolian +1805 Mongolian Phags_Pa +1806 180E Mongolian +1810 1819 Mongolian +1820 1877 Mongolian +1880 18AA Mongolian +18B0 18F5 Canadian_Aboriginal +1900 191E Limbu +1920 192B Limbu +1930 193B Limbu +1940 Limbu +1944 194F Limbu +1950 196D Tai_Le +1970 1974 Tai_Le +1980 19AB New_Tai_Lue +19B0 19C9 New_Tai_Lue +19D0 19DA New_Tai_Lue +19DE 19DF New_Tai_Lue +19E0 19FF Khmer +1A00 1A1B Buginese +1A1E 1A1F Buginese +1A20 1A5E Tai_Tham +1A60 1A7C Tai_Tham +1A7F 1A89 Tai_Tham +1A90 1A99 Tai_Tham +1AA0 1AAD Tai_Tham +1AB0 1ABE Inherited +1B00 1B4B Balinese +1B50 1B7C Balinese +1B80 1BBF Sundanese +1BC0 1BF3 Batak +1BFC 1BFF Batak +1C00 1C37 Lepcha +1C3B 1C49 Lepcha +1C4D 1C4F Lepcha +1C50 1C7F Ol_Chiki +1C80 1C88 Cyrillic +1CC0 1CC7 Sundanese +1CD0 Devanagari Grantha +1CD1 Devanagari +1CD2 1CD3 Devanagari Grantha +1CD4 1CD6 Devanagari +1CD7 Devanagari Sharada +1CD8 Devanagari +1CD9 Devanagari Sharada +1CDA Devanagari Kannada Malayalam Tamil Telugu +1CDB Devanagari +1CDC 1CDD Devanagari Sharada +1CDE 1CDF Devanagari +1CE0 Devanagari Sharada +1CE1 1CF1 Devanagari +1CF2 1CF4 Devanagari Grantha +1CF5 Devanagari Kannada +1CF6 Devanagari +1CF7 Bengali +1CF8 1CF9 Devanagari Grantha +1D00 1D25 Latin +1D26 1D2A Greek +1D2B Cyrillic +1D2C 1D5C Latin +1D5D 1D61 Greek +1D62 1D65 Latin +1D66 1D6A Greek +1D6B 1D77 Latin +1D78 Cyrillic +1D79 1DBE Latin +1DBF 1DC1 Greek +1DC2 1DF9 Inherited +1DFB 1DFF Inherited +1E00 1EFF Latin +1F00 1F15 Greek +1F18 1F1D Greek +1F20 1F45 Greek +1F48 1F4D Greek +1F50 1F57 Greek +1F59 Greek +1F5B Greek +1F5D Greek +1F5F 1F7D Greek +1F80 1FB4 Greek +1FB6 1FC4 Greek +1FC6 1FD3 Greek +1FD6 1FDB Greek +1FDD 1FEF Greek +1FF2 1FF4 Greek +1FF6 1FFE Greek +2000 200B Common +200C 200D Inherited +200E 2064 Common +2066 2070 Common +2071 Latin +2074 207E Common +207F Latin +2080 208E Common +2090 209C Latin +20A0 20BF Common +20D0 20EF Inherited +20F0 Devanagari Grantha Latin +2100 2125 Common +2126 Greek +2127 2129 Common +212A 212B Latin +212C 2131 Common +2132 Latin +2133 214D Common +214E Latin +214F 215F Common +2160 2188 Latin +2189 218B Common +2190 2426 Common +2440 244A Common +2460 27FF Common +2800 28FF Braille +2900 2B73 Common +2B76 2B95 Common +2B98 2BB9 Common +2BBD 2BC8 Common +2BCA 2BD2 Common +2BEC 2BEF Common +2C00 2C2E Glagolitic +2C30 2C5E Glagolitic +2C60 2C7F Latin +2C80 2CF3 Coptic +2CF9 2CFF Coptic +2D00 2D25 Georgian +2D27 Georgian +2D2D Georgian +2D30 2D67 Tifinagh +2D6F 2D70 Tifinagh +2D7F Tifinagh +2D80 2D96 Ethiopic +2DA0 2DA6 Ethiopic +2DA8 2DAE Ethiopic +2DB0 2DB6 Ethiopic +2DB8 2DBE Ethiopic +2DC0 2DC6 Ethiopic +2DC8 2DCE Ethiopic +2DD0 2DD6 Ethiopic +2DD8 2DDE Ethiopic +2DE0 2DFF Cyrillic +2E00 2E42 Common +2E43 Cyrillic Glagolitic +2E44 2E49 Common +2E80 2E99 Han Hanb Jpan Kore +2E9B 2EF3 Han Hanb Jpan Kore +2F00 2FD5 Han Hanb Jpan Kore +2FF0 2FFB Common +3000 Common +3001 3002 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana Yi +3003 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana +3004 Common +3005 3007 Han Hanb Jpan Kore +3008 3011 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana Yi +3012 Common +3013 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana +3014 301B Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana Yi +301C 301F Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana +3020 Common +3021 3029 Han Hanb Jpan Kore +302A 302D Bopomofo Hanb Han Jpan Kore +302E 302F Hangul Kore +3030 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana +3031 3035 Hiragana Jpan Katakana +3036 Common +3037 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana +3038 303B Han Hanb Jpan Kore +303C 303D Han Hanb Jpan Kore Hiragana Katakana +303E 303F Han Hanb Jpan Kore +3041 3096 Hiragana Jpan +3099 309C Hiragana Jpan Katakana +309D 309F Hiragana Jpan +30A0 Hiragana Jpan Katakana +30A1 30FA Katakana Jpan +30FB Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana Yi +30FC Hiragana Jpan Katakana +30FD 30FF Katakana Jpan +3105 312E Bopomofo Hanb +3131 318E Hangul Kore +3190 319F Han Hanb Jpan Kore +31A0 31BA Bopomofo Hanb +31C0 31E3 Han Hanb Jpan Kore +31F0 31FF Katakana Jpan +3200 321E Hangul Kore +3220 3247 Han Hanb Jpan Kore +3248 325F Common +3260 327E Hangul Kore +327F Common +3280 32B0 Han Hanb Jpan Kore +32B1 32BF Common +32C0 32CB Han Hanb Jpan Kore +32CC 32CF Common +32D0 32FE Katakana Jpan +3300 3357 Katakana Jpan +3358 3370 Han Hanb Jpan Kore +3371 337A Common +337B 337F Han Hanb Jpan Kore +3380 33DF Common +33E0 33FE Han Hanb Jpan Kore +33FF Common +3400 4DB5 Han Hanb Jpan Kore +4DC0 4DFF Common +4E00 9FEA Han Hanb Jpan Kore +A000 A48C Yi +A490 A4C6 Yi +A4D0 A4FF Lisu +A500 A62B Vai +A640 A66E Cyrillic +A66F Cyrillic Glagolitic +A670 A69F Cyrillic +A6A0 A6F7 Bamum +A700 A721 Common +A722 A787 Latin +A788 A78A Common +A78B A7AE Latin +A7B0 A7B7 Latin +A7F7 A7FF Latin +A800 A82B Syloti_Nagri +A830 A835 Devanagari Gujarati Gurmukhi Kannada Kaithi Mahajani Modi Khudawadi Takri Tirhuta +A836 A839 Devanagari Gujarati Gurmukhi Kaithi Mahajani Modi Khudawadi Takri Tirhuta +A840 A877 Phags_Pa +A880 A8C5 Saurashtra +A8CE A8D9 Saurashtra +A8E0 A8F0 Devanagari +A8F1 Bengali Devanagari +A8F2 Devanagari +A8F3 Devanagari Tamil +A8F4 A8FD Devanagari +A900 A92D Kayah_Li +A92E Kayah_Li Latin Myanmar +A92F Kayah_Li +A930 A953 Rejang +A95F Rejang +A960 A97C Hangul Kore +A980 A9CD Javanese +A9CF Buginese Javanese +A9D0 A9D9 Javanese +A9DE A9DF Javanese +A9E0 A9FE Myanmar +AA00 AA36 Cham +AA40 AA4D Cham +AA50 AA59 Cham +AA5C AA5F Cham +AA60 AA7F Myanmar +AA80 AAC2 Tai_Viet +AADB AADF Tai_Viet +AAE0 AAF6 Meetei_Mayek +AB01 AB06 Ethiopic +AB09 AB0E Ethiopic +AB11 AB16 Ethiopic +AB20 AB26 Ethiopic +AB28 AB2E Ethiopic +AB30 AB5A Latin +AB5B Common +AB5C AB64 Latin +AB65 Greek +AB70 ABBF Cherokee +ABC0 ABED Meetei_Mayek +ABF0 ABF9 Meetei_Mayek +AC00 D7A3 Hangul Kore +D7B0 D7C6 Hangul Kore +D7CB D7FB Hangul Kore +F900 FA6D Han Hanb Jpan Kore +FA70 FAD9 Han Hanb Jpan Kore +FB00 FB06 Latin +FB13 FB17 Armenian +FB1D FB36 Hebrew +FB38 FB3C Hebrew +FB3E Hebrew +FB40 FB41 Hebrew +FB43 FB44 Hebrew +FB46 FB4F Hebrew +FB50 FBC1 Arabic +FBD3 FD3D Arabic +FD3E FD3F Common +FD50 FD8F Arabic +FD92 FDC7 Arabic +FDF0 FDF1 Arabic +FDF2 Arabic Thaana +FDF3 FDFC Arabic +FDFD Arabic Thaana +FE00 FE0F Inherited +FE10 FE19 Common +FE20 FE2D Inherited +FE2E FE2F Cyrillic +FE30 FE44 Common +FE45 FE46 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana +FE47 FE52 Common +FE54 FE66 Common +FE68 FE6B Common +FE70 FE74 Arabic +FE76 FEFC Arabic +FEFF Common +FF01 FF20 Common +FF21 FF3A Latin +FF3B FF40 Common +FF41 FF5A Latin +FF5B FF60 Common +FF61 FF65 Bopomofo Hanb Hangul Kore Han Jpan Hiragana Katakana Yi +FF66 FF6F Katakana Jpan +FF70 Hiragana Jpan Katakana +FF71 FF9D Katakana Jpan +FF9E FF9F Hiragana Jpan Katakana +FFA0 FFBE Hangul Kore +FFC2 FFC7 Hangul Kore +FFCA FFCF Hangul Kore +FFD2 FFD7 Hangul Kore +FFDA FFDC Hangul Kore +FFE0 FFE6 Common +FFE8 FFEE Common +FFF9 FFFD Common +10000 1000B Linear_B +1000D 10026 Linear_B +10028 1003A Linear_B +1003C 1003D Linear_B +1003F 1004D Linear_B +10050 1005D Linear_B +10080 100FA Linear_B +10100 10102 Cypriot Linear_B +10107 10133 Cypriot Linear_A Linear_B +10137 1013F Cypriot Linear_B +10140 1018E Greek +10190 1019B Common +101A0 Greek +101D0 101FC Common +101FD Inherited +10280 1029C Lycian +102A0 102D0 Carian +102E0 102FB Arabic Coptic +10300 10323 Old_Italic +1032D 1032F Old_Italic +10330 1034A Gothic +10350 1037A Old_Permic +10380 1039D Ugaritic +1039F Ugaritic +103A0 103C3 Old_Persian +103C8 103D5 Old_Persian +10400 1044F Deseret +10450 1047F Shavian +10480 1049D Osmanya +104A0 104A9 Osmanya +104B0 104D3 Osage +104D8 104FB Osage +10500 10527 Elbasan +10530 10563 Caucasian_Albanian +1056F Caucasian_Albanian +10600 10736 Linear_A +10740 10755 Linear_A +10760 10767 Linear_A +10800 10805 Cypriot +10808 Cypriot +1080A 10835 Cypriot +10837 10838 Cypriot +1083C Cypriot +1083F Cypriot +10840 10855 Imperial_Aramaic +10857 1085F Imperial_Aramaic +10860 1087F Palmyrene +10880 1089E Nabataean +108A7 108AF Nabataean +108E0 108F2 Hatran +108F4 108F5 Hatran +108FB 108FF Hatran +10900 1091B Phoenician +1091F Phoenician +10920 10939 Lydian +1093F Lydian +10980 1099F Meroitic_Hieroglyphs +109A0 109B7 Meroitic_Cursive +109BC 109CF Meroitic_Cursive +109D2 109FF Meroitic_Cursive +10A00 10A03 Kharoshthi +10A05 10A06 Kharoshthi +10A0C 10A13 Kharoshthi +10A15 10A17 Kharoshthi +10A19 10A33 Kharoshthi +10A38 10A3A Kharoshthi +10A3F 10A47 Kharoshthi +10A50 10A58 Kharoshthi +10A60 10A7F Old_South_Arabian +10A80 10A9F Old_North_Arabian +10AC0 10AE6 Manichaean +10AEB 10AF6 Manichaean +10B00 10B35 Avestan +10B39 10B3F Avestan +10B40 10B55 Inscriptional_Parthian +10B58 10B5F Inscriptional_Parthian +10B60 10B72 Inscriptional_Pahlavi +10B78 10B7F Inscriptional_Pahlavi +10B80 10B91 Psalter_Pahlavi +10B99 10B9C Psalter_Pahlavi +10BA9 10BAF Psalter_Pahlavi +10C00 10C48 Old_Turkic +10C80 10CB2 Old_Hungarian +10CC0 10CF2 Old_Hungarian +10CFA 10CFF Old_Hungarian +10E60 10E7E Arabic +11000 1104D Brahmi +11052 1106F Brahmi +1107F Brahmi +11080 110C1 Kaithi +110D0 110E8 Sora_Sompeng +110F0 110F9 Sora_Sompeng +11100 11134 Chakma +11136 11143 Chakma +11150 11176 Mahajani +11180 111CD Sharada +111D0 111DF Sharada +111E1 111F4 Sinhala +11200 11211 Khojki +11213 1123E Khojki +11280 11286 Multani +11288 Multani +1128A 1128D Multani +1128F 1129D Multani +1129F 112A9 Multani +112B0 112EA Khudawadi +112F0 112F9 Khudawadi +11300 Grantha +11301 Grantha Tamil +11302 Grantha +11303 Grantha Tamil +11305 1130C Grantha +1130F 11310 Grantha +11313 11328 Grantha +1132A 11330 Grantha +11332 11333 Grantha +11335 11339 Grantha +1133C Grantha Tamil +1133D 11344 Grantha +11347 11348 Grantha +1134B 1134D Grantha +11350 Grantha +11357 Grantha +1135D 11363 Grantha +11366 1136C Grantha +11370 11374 Grantha +11400 11459 Newa +1145B Newa +1145D Newa +11480 114C7 Tirhuta +114D0 114D9 Tirhuta +11580 115B5 Siddham +115B8 115DD Siddham +11600 11644 Modi +11650 11659 Modi +11660 1166C Mongolian +11680 116B7 Takri +116C0 116C9 Takri +11700 11719 Ahom +1171D 1172B Ahom +11730 1173F Ahom +118A0 118F2 Warang_Citi +118FF Warang_Citi +11A00 11A47 Zanabazar_Square +11A50 11A83 Soyombo +11A86 11A9C Soyombo +11A9E 11AA2 Soyombo +11AC0 11AF8 Pau_Cin_Hau +11C00 11C08 Bhaiksuki +11C0A 11C36 Bhaiksuki +11C38 11C45 Bhaiksuki +11C50 11C6C Bhaiksuki +11C70 11C8F Marchen +11C92 11CA7 Marchen +11CA9 11CB6 Marchen +11D00 11D06 Masaram_Gondi +11D08 11D09 Masaram_Gondi +11D0B 11D36 Masaram_Gondi +11D3A Masaram_Gondi +11D3C 11D3D Masaram_Gondi +11D3F 11D47 Masaram_Gondi +11D50 11D59 Masaram_Gondi +12000 12399 Cuneiform +12400 1246E Cuneiform +12470 12474 Cuneiform +12480 12543 Cuneiform +13000 1342E Egyptian_Hieroglyphs +14400 14646 Anatolian_Hieroglyphs +16800 16A38 Bamum +16A40 16A5E Mro +16A60 16A69 Mro +16A6E 16A6F Mro +16AD0 16AED Bassa_Vah +16AF0 16AF5 Bassa_Vah +16B00 16B45 Pahawh_Hmong +16B50 16B59 Pahawh_Hmong +16B5B 16B61 Pahawh_Hmong +16B63 16B77 Pahawh_Hmong +16B7D 16B8F Pahawh_Hmong +16F00 16F44 Miao +16F50 16F7E Miao +16F8F 16F9F Miao +16FE0 Tangut +16FE1 Nushu +17000 187EC Tangut +18800 18AF2 Tangut +1B000 Katakana Jpan +1B001 1B11E Hiragana Jpan +1B170 1B2FB Nushu +1BC00 1BC6A Duployan +1BC70 1BC7C Duployan +1BC80 1BC88 Duployan +1BC90 1BC99 Duployan +1BC9C 1BCA3 Duployan +1D000 1D0F5 Common +1D100 1D126 Common +1D129 1D166 Common +1D167 1D169 Inherited +1D16A 1D17A Common +1D17B 1D182 Inherited +1D183 1D184 Common +1D185 1D18B Inherited +1D18C 1D1A9 Common +1D1AA 1D1AD Inherited +1D1AE 1D1E8 Common +1D200 1D245 Greek +1D300 1D356 Common +1D360 1D371 Han Hanb Jpan Kore +1D400 1D454 Common +1D456 1D49C Common +1D49E 1D49F Common +1D4A2 Common +1D4A5 1D4A6 Common +1D4A9 1D4AC Common +1D4AE 1D4B9 Common +1D4BB Common +1D4BD 1D4C3 Common +1D4C5 1D505 Common +1D507 1D50A Common +1D50D 1D514 Common +1D516 1D51C Common +1D51E 1D539 Common +1D53B 1D53E Common +1D540 1D544 Common +1D546 Common +1D54A 1D550 Common +1D552 1D6A5 Common +1D6A8 1D7CB Common +1D7CE 1D7FF Common +1D800 1DA8B SignWriting +1DA9B 1DA9F SignWriting +1DAA1 1DAAF SignWriting +1E000 1E006 Glagolitic +1E008 1E018 Glagolitic +1E01B 1E021 Glagolitic +1E023 1E024 Glagolitic +1E026 1E02A Glagolitic +1E800 1E8C4 Mende_Kikakui +1E8C7 1E8D6 Mende_Kikakui +1E900 1E94A Adlam +1E950 1E959 Adlam +1E95E 1E95F Adlam +1EE00 1EE03 Arabic +1EE05 1EE1F Arabic +1EE21 1EE22 Arabic +1EE24 Arabic +1EE27 Arabic +1EE29 1EE32 Arabic +1EE34 1EE37 Arabic +1EE39 Arabic +1EE3B Arabic +1EE42 Arabic +1EE47 Arabic +1EE49 Arabic +1EE4B Arabic +1EE4D 1EE4F Arabic +1EE51 1EE52 Arabic +1EE54 Arabic +1EE57 Arabic +1EE59 Arabic +1EE5B Arabic +1EE5D Arabic +1EE5F Arabic +1EE61 1EE62 Arabic +1EE64 Arabic +1EE67 1EE6A Arabic +1EE6C 1EE72 Arabic +1EE74 1EE77 Arabic +1EE79 1EE7C Arabic +1EE7E Arabic +1EE80 1EE89 Arabic +1EE8B 1EE9B Arabic +1EEA1 1EEA3 Arabic +1EEA5 1EEA9 Arabic +1EEAB 1EEBB Arabic +1EEF0 1EEF1 Arabic +1F000 1F02B Common +1F030 1F093 Common +1F0A0 1F0AE Common +1F0B1 1F0BF Common +1F0C1 1F0CF Common +1F0D1 1F0F5 Common +1F100 1F10C Common +1F110 1F12E Common +1F130 1F16B Common +1F170 1F1AC Common +1F1E6 1F1FF Common +1F200 Hiragana Jpan +1F201 1F202 Common +1F210 1F23B Common +1F240 1F248 Common +1F250 1F251 Han Hanb Jpan Kore +1F260 1F265 Common +1F300 1F6D4 Common +1F6E0 1F6EC Common +1F6F0 1F6F8 Common +1F700 1F773 Common +1F780 1F7D4 Common +1F800 1F80B Common +1F810 1F847 Common +1F850 1F859 Common +1F860 1F887 Common +1F890 1F8AD Common +1F900 1F90B Common +1F910 1F93E Common +1F940 1F94C Common +1F950 1F96B Common +1F980 1F997 Common +1F9C0 Common +1F9D0 1F9E6 Common +20000 2A6D6 Han Hanb Jpan Kore +2A700 2B734 Han Hanb Jpan Kore +2B740 2B81D Han Hanb Jpan Kore +2B820 2CEA1 Han Hanb Jpan Kore +2CEB0 2EBE0 Han Hanb Jpan Kore +2F800 2FA1D Han Hanb Jpan Kore +E0001 Common +E0020 E007F Common +E0100 E01EF Inherited +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToGCB'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToGCB'}{'missing'} = 'Other'; + +return <<'END'; +0 9 Control +A LF +B C Control +D CR +E 1F Control +7F 9F Control +AD Control +300 36F Extend +483 489 Extend +591 5BD Extend +5BF Extend +5C1 5C2 Extend +5C4 5C5 Extend +5C7 Extend +600 605 Prepend +610 61A Extend +61C Control +64B 65F Extend +670 Extend +6D6 6DC Extend +6DD Prepend +6DF 6E4 Extend +6E7 6E8 Extend +6EA 6ED Extend +70F Prepend +711 Extend +730 74A Extend +7A6 7B0 Extend +7EB 7F3 Extend +816 819 Extend +81B 823 Extend +825 827 Extend +829 82D Extend +859 85B Extend +8D4 8E1 Extend +8E2 Prepend +8E3 902 Extend +903 SpacingMark +93A Extend +93B SpacingMark +93C Extend +93E 940 SpacingMark +941 948 Extend +949 94C SpacingMark +94D Extend +94E 94F SpacingMark +951 957 Extend +962 963 Extend +981 Extend +982 983 SpacingMark +9BC Extend +9BE Extend +9BF 9C0 SpacingMark +9C1 9C4 Extend +9C7 9C8 SpacingMark +9CB 9CC SpacingMark +9CD Extend +9D7 Extend +9E2 9E3 Extend +A01 A02 Extend +A03 SpacingMark +A3C Extend +A3E A40 SpacingMark +A41 A42 Extend +A47 A48 Extend +A4B A4D Extend +A51 Extend +A70 A71 Extend +A75 Extend +A81 A82 Extend +A83 SpacingMark +ABC Extend +ABE AC0 SpacingMark +AC1 AC5 Extend +AC7 AC8 Extend +AC9 SpacingMark +ACB ACC SpacingMark +ACD Extend +AE2 AE3 Extend +AFA AFF Extend +B01 Extend +B02 B03 SpacingMark +B3C Extend +B3E B3F Extend +B40 SpacingMark +B41 B44 Extend +B47 B48 SpacingMark +B4B B4C SpacingMark +B4D Extend +B56 B57 Extend +B62 B63 Extend +B82 Extend +BBE Extend +BBF SpacingMark +BC0 Extend +BC1 BC2 SpacingMark +BC6 BC8 SpacingMark +BCA BCC SpacingMark +BCD Extend +BD7 Extend +C00 Extend +C01 C03 SpacingMark +C3E C40 Extend +C41 C44 SpacingMark +C46 C48 Extend +C4A C4D Extend +C55 C56 Extend +C62 C63 Extend +C81 Extend +C82 C83 SpacingMark +CBC Extend +CBE SpacingMark +CBF Extend +CC0 CC1 SpacingMark +CC2 Extend +CC3 CC4 SpacingMark +CC6 Extend +CC7 CC8 SpacingMark +CCA CCB SpacingMark +CCC CCD Extend +CD5 CD6 Extend +CE2 CE3 Extend +D00 D01 Extend +D02 D03 SpacingMark +D3B D3C Extend +D3E Extend +D3F D40 SpacingMark +D41 D44 Extend +D46 D48 SpacingMark +D4A D4C SpacingMark +D4D Extend +D4E Prepend +D57 Extend +D62 D63 Extend +D82 D83 SpacingMark +DCA Extend +DCF Extend +DD0 DD1 SpacingMark +DD2 DD4 Extend +DD6 Extend +DD8 DDE SpacingMark +DDF Extend +DF2 DF3 SpacingMark +E31 Extend +E33 SpacingMark +E34 E3A Extend +E47 E4E Extend +EB1 Extend +EB3 SpacingMark +EB4 EB9 Extend +EBB EBC Extend +EC8 ECD Extend +F18 F19 Extend +F35 Extend +F37 Extend +F39 Extend +F3E F3F SpacingMark +F71 F7E Extend +F7F SpacingMark +F80 F84 Extend +F86 F87 Extend +F8D F97 Extend +F99 FBC Extend +FC6 Extend +102D 1030 Extend +1031 SpacingMark +1032 1037 Extend +1039 103A Extend +103B 103C SpacingMark +103D 103E Extend +1056 1057 SpacingMark +1058 1059 Extend +105E 1060 Extend +1071 1074 Extend +1082 Extend +1084 SpacingMark +1085 1086 Extend +108D Extend +109D Extend +1100 115F L +1160 11A7 V +11A8 11FF T +135D 135F Extend +1712 1714 Extend +1732 1734 Extend +1752 1753 Extend +1772 1773 Extend +17B4 17B5 Extend +17B6 SpacingMark +17B7 17BD Extend +17BE 17C5 SpacingMark +17C6 Extend +17C7 17C8 SpacingMark +17C9 17D3 Extend +17DD Extend +180B 180D Extend +180E Control +1885 1886 Extend +18A9 Extend +1920 1922 Extend +1923 1926 SpacingMark +1927 1928 Extend +1929 192B SpacingMark +1930 1931 SpacingMark +1932 Extend +1933 1938 SpacingMark +1939 193B Extend +1A17 1A18 Extend +1A19 1A1A SpacingMark +1A1B Extend +1A55 SpacingMark +1A56 Extend +1A57 SpacingMark +1A58 1A5E Extend +1A60 Extend +1A62 Extend +1A65 1A6C Extend +1A6D 1A72 SpacingMark +1A73 1A7C Extend +1A7F Extend +1AB0 1ABE Extend +1B00 1B03 Extend +1B04 SpacingMark +1B34 Extend +1B35 SpacingMark +1B36 1B3A Extend +1B3B SpacingMark +1B3C Extend +1B3D 1B41 SpacingMark +1B42 Extend +1B43 1B44 SpacingMark +1B6B 1B73 Extend +1B80 1B81 Extend +1B82 SpacingMark +1BA1 SpacingMark +1BA2 1BA5 Extend +1BA6 1BA7 SpacingMark +1BA8 1BA9 Extend +1BAA SpacingMark +1BAB 1BAD Extend +1BE6 Extend +1BE7 SpacingMark +1BE8 1BE9 Extend +1BEA 1BEC SpacingMark +1BED Extend +1BEE SpacingMark +1BEF 1BF1 Extend +1BF2 1BF3 SpacingMark +1C24 1C2B SpacingMark +1C2C 1C33 Extend +1C34 1C35 SpacingMark +1C36 1C37 Extend +1CD0 1CD2 Extend +1CD4 1CE0 Extend +1CE1 SpacingMark +1CE2 1CE8 Extend +1CED Extend +1CF2 1CF3 SpacingMark +1CF4 Extend +1CF7 SpacingMark +1CF8 1CF9 Extend +1DC0 1DF9 Extend +1DFB 1DFF Extend +200B Control +200C Extend +200D ZWJ +200E 200F Control +2028 202E Control +2060 206F Control +20D0 20F0 Extend +261D E_Base +2640 Glue_After_Zwj +2642 Glue_After_Zwj +2695 2696 Glue_After_Zwj +26F9 E_Base +2708 Glue_After_Zwj +270A 270D E_Base +2764 Glue_After_Zwj +2CEF 2CF1 Extend +2D7F Extend +2DE0 2DFF Extend +302A 302F Extend +3099 309A Extend +A66F A672 Extend +A674 A67D Extend +A69E A69F Extend +A6F0 A6F1 Extend +A802 Extend +A806 Extend +A80B Extend +A823 A824 SpacingMark +A825 A826 Extend +A827 SpacingMark +A880 A881 SpacingMark +A8B4 A8C3 SpacingMark +A8C4 A8C5 Extend +A8E0 A8F1 Extend +A926 A92D Extend +A947 A951 Extend +A952 A953 SpacingMark +A960 A97C L +A980 A982 Extend +A983 SpacingMark +A9B3 Extend +A9B4 A9B5 SpacingMark +A9B6 A9B9 Extend +A9BA A9BB SpacingMark +A9BC Extend +A9BD A9C0 SpacingMark +A9E5 Extend +AA29 AA2E Extend +AA2F AA30 SpacingMark +AA31 AA32 Extend +AA33 AA34 SpacingMark +AA35 AA36 Extend +AA43 Extend +AA4C Extend +AA4D SpacingMark +AA7C Extend +AAB0 Extend +AAB2 AAB4 Extend +AAB7 AAB8 Extend +AABE AABF Extend +AAC1 Extend +AAEB SpacingMark +AAEC AAED Extend +AAEE AAEF SpacingMark +AAF5 SpacingMark +AAF6 Extend +ABE3 ABE4 SpacingMark +ABE5 Extend +ABE6 ABE7 SpacingMark +ABE8 Extend +ABE9 ABEA SpacingMark +ABEC SpacingMark +ABED Extend +AC00 LV +AC01 AC1B LVT +AC1C LV +AC1D AC37 LVT +AC38 LV +AC39 AC53 LVT +AC54 LV +AC55 AC6F LVT +AC70 LV +AC71 AC8B LVT +AC8C LV +AC8D ACA7 LVT +ACA8 LV +ACA9 ACC3 LVT +ACC4 LV +ACC5 ACDF LVT +ACE0 LV +ACE1 ACFB LVT +ACFC LV +ACFD AD17 LVT +AD18 LV +AD19 AD33 LVT +AD34 LV +AD35 AD4F LVT +AD50 LV +AD51 AD6B LVT +AD6C LV +AD6D AD87 LVT +AD88 LV +AD89 ADA3 LVT +ADA4 LV +ADA5 ADBF LVT +ADC0 LV +ADC1 ADDB LVT +ADDC LV +ADDD ADF7 LVT +ADF8 LV +ADF9 AE13 LVT +AE14 LV +AE15 AE2F LVT +AE30 LV +AE31 AE4B LVT +AE4C LV +AE4D AE67 LVT +AE68 LV +AE69 AE83 LVT +AE84 LV +AE85 AE9F LVT +AEA0 LV +AEA1 AEBB LVT +AEBC LV +AEBD AED7 LVT +AED8 LV +AED9 AEF3 LVT +AEF4 LV +AEF5 AF0F LVT +AF10 LV +AF11 AF2B LVT +AF2C LV +AF2D AF47 LVT +AF48 LV +AF49 AF63 LVT +AF64 LV +AF65 AF7F LVT +AF80 LV +AF81 AF9B LVT +AF9C LV +AF9D AFB7 LVT +AFB8 LV +AFB9 AFD3 LVT +AFD4 LV +AFD5 AFEF LVT +AFF0 LV +AFF1 B00B LVT +B00C LV +B00D B027 LVT +B028 LV +B029 B043 LVT +B044 LV +B045 B05F LVT +B060 LV +B061 B07B LVT +B07C LV +B07D B097 LVT +B098 LV +B099 B0B3 LVT +B0B4 LV +B0B5 B0CF LVT +B0D0 LV +B0D1 B0EB LVT +B0EC LV +B0ED B107 LVT +B108 LV +B109 B123 LVT +B124 LV +B125 B13F LVT +B140 LV +B141 B15B LVT +B15C LV +B15D B177 LVT +B178 LV +B179 B193 LVT +B194 LV +B195 B1AF LVT +B1B0 LV +B1B1 B1CB LVT +B1CC LV +B1CD B1E7 LVT +B1E8 LV +B1E9 B203 LVT +B204 LV +B205 B21F LVT +B220 LV +B221 B23B LVT +B23C LV +B23D B257 LVT +B258 LV +B259 B273 LVT +B274 LV +B275 B28F LVT +B290 LV +B291 B2AB LVT +B2AC LV +B2AD B2C7 LVT +B2C8 LV +B2C9 B2E3 LVT +B2E4 LV +B2E5 B2FF LVT +B300 LV +B301 B31B LVT +B31C LV +B31D B337 LVT +B338 LV +B339 B353 LVT +B354 LV +B355 B36F LVT +B370 LV +B371 B38B LVT +B38C LV +B38D B3A7 LVT +B3A8 LV +B3A9 B3C3 LVT +B3C4 LV +B3C5 B3DF LVT +B3E0 LV +B3E1 B3FB LVT +B3FC LV +B3FD B417 LVT +B418 LV +B419 B433 LVT +B434 LV +B435 B44F LVT +B450 LV +B451 B46B LVT +B46C LV +B46D B487 LVT +B488 LV +B489 B4A3 LVT +B4A4 LV +B4A5 B4BF LVT +B4C0 LV +B4C1 B4DB LVT +B4DC LV +B4DD B4F7 LVT +B4F8 LV +B4F9 B513 LVT +B514 LV +B515 B52F LVT +B530 LV +B531 B54B LVT +B54C LV +B54D B567 LVT +B568 LV +B569 B583 LVT +B584 LV +B585 B59F LVT +B5A0 LV +B5A1 B5BB LVT +B5BC LV +B5BD B5D7 LVT +B5D8 LV +B5D9 B5F3 LVT +B5F4 LV +B5F5 B60F LVT +B610 LV +B611 B62B LVT +B62C LV +B62D B647 LVT +B648 LV +B649 B663 LVT +B664 LV +B665 B67F LVT +B680 LV +B681 B69B LVT +B69C LV +B69D B6B7 LVT +B6B8 LV +B6B9 B6D3 LVT +B6D4 LV +B6D5 B6EF LVT +B6F0 LV +B6F1 B70B LVT +B70C LV +B70D B727 LVT +B728 LV +B729 B743 LVT +B744 LV +B745 B75F LVT +B760 LV +B761 B77B LVT +B77C LV +B77D B797 LVT +B798 LV +B799 B7B3 LVT +B7B4 LV +B7B5 B7CF LVT +B7D0 LV +B7D1 B7EB LVT +B7EC LV +B7ED B807 LVT +B808 LV +B809 B823 LVT +B824 LV +B825 B83F LVT +B840 LV +B841 B85B LVT +B85C LV +B85D B877 LVT +B878 LV +B879 B893 LVT +B894 LV +B895 B8AF LVT +B8B0 LV +B8B1 B8CB LVT +B8CC LV +B8CD B8E7 LVT +B8E8 LV +B8E9 B903 LVT +B904 LV +B905 B91F LVT +B920 LV +B921 B93B LVT +B93C LV +B93D B957 LVT +B958 LV +B959 B973 LVT +B974 LV +B975 B98F LVT +B990 LV +B991 B9AB LVT +B9AC LV +B9AD B9C7 LVT +B9C8 LV +B9C9 B9E3 LVT +B9E4 LV +B9E5 B9FF LVT +BA00 LV +BA01 BA1B LVT +BA1C LV +BA1D BA37 LVT +BA38 LV +BA39 BA53 LVT +BA54 LV +BA55 BA6F LVT +BA70 LV +BA71 BA8B LVT +BA8C LV +BA8D BAA7 LVT +BAA8 LV +BAA9 BAC3 LVT +BAC4 LV +BAC5 BADF LVT +BAE0 LV +BAE1 BAFB LVT +BAFC LV +BAFD BB17 LVT +BB18 LV +BB19 BB33 LVT +BB34 LV +BB35 BB4F LVT +BB50 LV +BB51 BB6B LVT +BB6C LV +BB6D BB87 LVT +BB88 LV +BB89 BBA3 LVT +BBA4 LV +BBA5 BBBF LVT +BBC0 LV +BBC1 BBDB LVT +BBDC LV +BBDD BBF7 LVT +BBF8 LV +BBF9 BC13 LVT +BC14 LV +BC15 BC2F LVT +BC30 LV +BC31 BC4B LVT +BC4C LV +BC4D BC67 LVT +BC68 LV +BC69 BC83 LVT +BC84 LV +BC85 BC9F LVT +BCA0 LV +BCA1 BCBB LVT +BCBC LV +BCBD BCD7 LVT +BCD8 LV +BCD9 BCF3 LVT +BCF4 LV +BCF5 BD0F LVT +BD10 LV +BD11 BD2B LVT +BD2C LV +BD2D BD47 LVT +BD48 LV +BD49 BD63 LVT +BD64 LV +BD65 BD7F LVT +BD80 LV +BD81 BD9B LVT +BD9C LV +BD9D BDB7 LVT +BDB8 LV +BDB9 BDD3 LVT +BDD4 LV +BDD5 BDEF LVT +BDF0 LV +BDF1 BE0B LVT +BE0C LV +BE0D BE27 LVT +BE28 LV +BE29 BE43 LVT +BE44 LV +BE45 BE5F LVT +BE60 LV +BE61 BE7B LVT +BE7C LV +BE7D BE97 LVT +BE98 LV +BE99 BEB3 LVT +BEB4 LV +BEB5 BECF LVT +BED0 LV +BED1 BEEB LVT +BEEC LV +BEED BF07 LVT +BF08 LV +BF09 BF23 LVT +BF24 LV +BF25 BF3F LVT +BF40 LV +BF41 BF5B LVT +BF5C LV +BF5D BF77 LVT +BF78 LV +BF79 BF93 LVT +BF94 LV +BF95 BFAF LVT +BFB0 LV +BFB1 BFCB LVT +BFCC LV +BFCD BFE7 LVT +BFE8 LV +BFE9 C003 LVT +C004 LV +C005 C01F LVT +C020 LV +C021 C03B LVT +C03C LV +C03D C057 LVT +C058 LV +C059 C073 LVT +C074 LV +C075 C08F LVT +C090 LV +C091 C0AB LVT +C0AC LV +C0AD C0C7 LVT +C0C8 LV +C0C9 C0E3 LVT +C0E4 LV +C0E5 C0FF LVT +C100 LV +C101 C11B LVT +C11C LV +C11D C137 LVT +C138 LV +C139 C153 LVT +C154 LV +C155 C16F LVT +C170 LV +C171 C18B LVT +C18C LV +C18D C1A7 LVT +C1A8 LV +C1A9 C1C3 LVT +C1C4 LV +C1C5 C1DF LVT +C1E0 LV +C1E1 C1FB LVT +C1FC LV +C1FD C217 LVT +C218 LV +C219 C233 LVT +C234 LV +C235 C24F LVT +C250 LV +C251 C26B LVT +C26C LV +C26D C287 LVT +C288 LV +C289 C2A3 LVT +C2A4 LV +C2A5 C2BF LVT +C2C0 LV +C2C1 C2DB LVT +C2DC LV +C2DD C2F7 LVT +C2F8 LV +C2F9 C313 LVT +C314 LV +C315 C32F LVT +C330 LV +C331 C34B LVT +C34C LV +C34D C367 LVT +C368 LV +C369 C383 LVT +C384 LV +C385 C39F LVT +C3A0 LV +C3A1 C3BB LVT +C3BC LV +C3BD C3D7 LVT +C3D8 LV +C3D9 C3F3 LVT +C3F4 LV +C3F5 C40F LVT +C410 LV +C411 C42B LVT +C42C LV +C42D C447 LVT +C448 LV +C449 C463 LVT +C464 LV +C465 C47F LVT +C480 LV +C481 C49B LVT +C49C LV +C49D C4B7 LVT +C4B8 LV +C4B9 C4D3 LVT +C4D4 LV +C4D5 C4EF LVT +C4F0 LV +C4F1 C50B LVT +C50C LV +C50D C527 LVT +C528 LV +C529 C543 LVT +C544 LV +C545 C55F LVT +C560 LV +C561 C57B LVT +C57C LV +C57D C597 LVT +C598 LV +C599 C5B3 LVT +C5B4 LV +C5B5 C5CF LVT +C5D0 LV +C5D1 C5EB LVT +C5EC LV +C5ED C607 LVT +C608 LV +C609 C623 LVT +C624 LV +C625 C63F LVT +C640 LV +C641 C65B LVT +C65C LV +C65D C677 LVT +C678 LV +C679 C693 LVT +C694 LV +C695 C6AF LVT +C6B0 LV +C6B1 C6CB LVT +C6CC LV +C6CD C6E7 LVT +C6E8 LV +C6E9 C703 LVT +C704 LV +C705 C71F LVT +C720 LV +C721 C73B LVT +C73C LV +C73D C757 LVT +C758 LV +C759 C773 LVT +C774 LV +C775 C78F LVT +C790 LV +C791 C7AB LVT +C7AC LV +C7AD C7C7 LVT +C7C8 LV +C7C9 C7E3 LVT +C7E4 LV +C7E5 C7FF LVT +C800 LV +C801 C81B LVT +C81C LV +C81D C837 LVT +C838 LV +C839 C853 LVT +C854 LV +C855 C86F LVT +C870 LV +C871 C88B LVT +C88C LV +C88D C8A7 LVT +C8A8 LV +C8A9 C8C3 LVT +C8C4 LV +C8C5 C8DF LVT +C8E0 LV +C8E1 C8FB LVT +C8FC LV +C8FD C917 LVT +C918 LV +C919 C933 LVT +C934 LV +C935 C94F LVT +C950 LV +C951 C96B LVT +C96C LV +C96D C987 LVT +C988 LV +C989 C9A3 LVT +C9A4 LV +C9A5 C9BF LVT +C9C0 LV +C9C1 C9DB LVT +C9DC LV +C9DD C9F7 LVT +C9F8 LV +C9F9 CA13 LVT +CA14 LV +CA15 CA2F LVT +CA30 LV +CA31 CA4B LVT +CA4C LV +CA4D CA67 LVT +CA68 LV +CA69 CA83 LVT +CA84 LV +CA85 CA9F LVT +CAA0 LV +CAA1 CABB LVT +CABC LV +CABD CAD7 LVT +CAD8 LV +CAD9 CAF3 LVT +CAF4 LV +CAF5 CB0F LVT +CB10 LV +CB11 CB2B LVT +CB2C LV +CB2D CB47 LVT +CB48 LV +CB49 CB63 LVT +CB64 LV +CB65 CB7F LVT +CB80 LV +CB81 CB9B LVT +CB9C LV +CB9D CBB7 LVT +CBB8 LV +CBB9 CBD3 LVT +CBD4 LV +CBD5 CBEF LVT +CBF0 LV +CBF1 CC0B LVT +CC0C LV +CC0D CC27 LVT +CC28 LV +CC29 CC43 LVT +CC44 LV +CC45 CC5F LVT +CC60 LV +CC61 CC7B LVT +CC7C LV +CC7D CC97 LVT +CC98 LV +CC99 CCB3 LVT +CCB4 LV +CCB5 CCCF LVT +CCD0 LV +CCD1 CCEB LVT +CCEC LV +CCED CD07 LVT +CD08 LV +CD09 CD23 LVT +CD24 LV +CD25 CD3F LVT +CD40 LV +CD41 CD5B LVT +CD5C LV +CD5D CD77 LVT +CD78 LV +CD79 CD93 LVT +CD94 LV +CD95 CDAF LVT +CDB0 LV +CDB1 CDCB LVT +CDCC LV +CDCD CDE7 LVT +CDE8 LV +CDE9 CE03 LVT +CE04 LV +CE05 CE1F LVT +CE20 LV +CE21 CE3B LVT +CE3C LV +CE3D CE57 LVT +CE58 LV +CE59 CE73 LVT +CE74 LV +CE75 CE8F LVT +CE90 LV +CE91 CEAB LVT +CEAC LV +CEAD CEC7 LVT +CEC8 LV +CEC9 CEE3 LVT +CEE4 LV +CEE5 CEFF LVT +CF00 LV +CF01 CF1B LVT +CF1C LV +CF1D CF37 LVT +CF38 LV +CF39 CF53 LVT +CF54 LV +CF55 CF6F LVT +CF70 LV +CF71 CF8B LVT +CF8C LV +CF8D CFA7 LVT +CFA8 LV +CFA9 CFC3 LVT +CFC4 LV +CFC5 CFDF LVT +CFE0 LV +CFE1 CFFB LVT +CFFC LV +CFFD D017 LVT +D018 LV +D019 D033 LVT +D034 LV +D035 D04F LVT +D050 LV +D051 D06B LVT +D06C LV +D06D D087 LVT +D088 LV +D089 D0A3 LVT +D0A4 LV +D0A5 D0BF LVT +D0C0 LV +D0C1 D0DB LVT +D0DC LV +D0DD D0F7 LVT +D0F8 LV +D0F9 D113 LVT +D114 LV +D115 D12F LVT +D130 LV +D131 D14B LVT +D14C LV +D14D D167 LVT +D168 LV +D169 D183 LVT +D184 LV +D185 D19F LVT +D1A0 LV +D1A1 D1BB LVT +D1BC LV +D1BD D1D7 LVT +D1D8 LV +D1D9 D1F3 LVT +D1F4 LV +D1F5 D20F LVT +D210 LV +D211 D22B LVT +D22C LV +D22D D247 LVT +D248 LV +D249 D263 LVT +D264 LV +D265 D27F LVT +D280 LV +D281 D29B LVT +D29C LV +D29D D2B7 LVT +D2B8 LV +D2B9 D2D3 LVT +D2D4 LV +D2D5 D2EF LVT +D2F0 LV +D2F1 D30B LVT +D30C LV +D30D D327 LVT +D328 LV +D329 D343 LVT +D344 LV +D345 D35F LVT +D360 LV +D361 D37B LVT +D37C LV +D37D D397 LVT +D398 LV +D399 D3B3 LVT +D3B4 LV +D3B5 D3CF LVT +D3D0 LV +D3D1 D3EB LVT +D3EC LV +D3ED D407 LVT +D408 LV +D409 D423 LVT +D424 LV +D425 D43F LVT +D440 LV +D441 D45B LVT +D45C LV +D45D D477 LVT +D478 LV +D479 D493 LVT +D494 LV +D495 D4AF LVT +D4B0 LV +D4B1 D4CB LVT +D4CC LV +D4CD D4E7 LVT +D4E8 LV +D4E9 D503 LVT +D504 LV +D505 D51F LVT +D520 LV +D521 D53B LVT +D53C LV +D53D D557 LVT +D558 LV +D559 D573 LVT +D574 LV +D575 D58F LVT +D590 LV +D591 D5AB LVT +D5AC LV +D5AD D5C7 LVT +D5C8 LV +D5C9 D5E3 LVT +D5E4 LV +D5E5 D5FF LVT +D600 LV +D601 D61B LVT +D61C LV +D61D D637 LVT +D638 LV +D639 D653 LVT +D654 LV +D655 D66F LVT +D670 LV +D671 D68B LVT +D68C LV +D68D D6A7 LVT +D6A8 LV +D6A9 D6C3 LVT +D6C4 LV +D6C5 D6DF LVT +D6E0 LV +D6E1 D6FB LVT +D6FC LV +D6FD D717 LVT +D718 LV +D719 D733 LVT +D734 LV +D735 D74F LVT +D750 LV +D751 D76B LVT +D76C LV +D76D D787 LVT +D788 LV +D789 D7A3 LVT +D7B0 D7C6 V +D7CB D7FB T +D800 DFFF Control +FB1E Extend +FE00 FE0F Extend +FE20 FE2F Extend +FEFF Control +FF9E FF9F Extend +FFF0 FFFB Control +101FD Extend +102E0 Extend +10376 1037A Extend +10A01 10A03 Extend +10A05 10A06 Extend +10A0C 10A0F Extend +10A38 10A3A Extend +10A3F Extend +10AE5 10AE6 Extend +11000 SpacingMark +11001 Extend +11002 SpacingMark +11038 11046 Extend +1107F 11081 Extend +11082 SpacingMark +110B0 110B2 SpacingMark +110B3 110B6 Extend +110B7 110B8 SpacingMark +110B9 110BA Extend +110BD Prepend +11100 11102 Extend +11127 1112B Extend +1112C SpacingMark +1112D 11134 Extend +11173 Extend +11180 11181 Extend +11182 SpacingMark +111B3 111B5 SpacingMark +111B6 111BE Extend +111BF 111C0 SpacingMark +111C2 111C3 Prepend +111CA 111CC Extend +1122C 1122E SpacingMark +1122F 11231 Extend +11232 11233 SpacingMark +11234 Extend +11235 SpacingMark +11236 11237 Extend +1123E Extend +112DF Extend +112E0 112E2 SpacingMark +112E3 112EA Extend +11300 11301 Extend +11302 11303 SpacingMark +1133C Extend +1133E Extend +1133F SpacingMark +11340 Extend +11341 11344 SpacingMark +11347 11348 SpacingMark +1134B 1134D SpacingMark +11357 Extend +11362 11363 SpacingMark +11366 1136C Extend +11370 11374 Extend +11435 11437 SpacingMark +11438 1143F Extend +11440 11441 SpacingMark +11442 11444 Extend +11445 SpacingMark +11446 Extend +114B0 Extend +114B1 114B2 SpacingMark +114B3 114B8 Extend +114B9 SpacingMark +114BA Extend +114BB 114BC SpacingMark +114BD Extend +114BE SpacingMark +114BF 114C0 Extend +114C1 SpacingMark +114C2 114C3 Extend +115AF Extend +115B0 115B1 SpacingMark +115B2 115B5 Extend +115B8 115BB SpacingMark +115BC 115BD Extend +115BE SpacingMark +115BF 115C0 Extend +115DC 115DD Extend +11630 11632 SpacingMark +11633 1163A Extend +1163B 1163C SpacingMark +1163D Extend +1163E SpacingMark +1163F 11640 Extend +116AB Extend +116AC SpacingMark +116AD Extend +116AE 116AF SpacingMark +116B0 116B5 Extend +116B6 SpacingMark +116B7 Extend +1171D 1171F Extend +11720 11721 SpacingMark +11722 11725 Extend +11726 SpacingMark +11727 1172B Extend +11A01 11A06 Extend +11A07 11A08 SpacingMark +11A09 11A0A Extend +11A33 11A38 Extend +11A39 SpacingMark +11A3A Prepend +11A3B 11A3E Extend +11A47 Extend +11A51 11A56 Extend +11A57 11A58 SpacingMark +11A59 11A5B Extend +11A86 11A89 Prepend +11A8A 11A96 Extend +11A97 SpacingMark +11A98 11A99 Extend +11C2F SpacingMark +11C30 11C36 Extend +11C38 11C3D Extend +11C3E SpacingMark +11C3F Extend +11C92 11CA7 Extend +11CA9 SpacingMark +11CAA 11CB0 Extend +11CB1 SpacingMark +11CB2 11CB3 Extend +11CB4 SpacingMark +11CB5 11CB6 Extend +11D31 11D36 Extend +11D3A Extend +11D3C 11D3D Extend +11D3F 11D45 Extend +11D46 Prepend +11D47 Extend +16AF0 16AF4 Extend +16B30 16B36 Extend +16F51 16F7E SpacingMark +16F8F 16F92 Extend +1BC9D 1BC9E Extend +1BCA0 1BCA3 Control +1D165 Extend +1D166 SpacingMark +1D167 1D169 Extend +1D16D SpacingMark +1D16E 1D172 Extend +1D173 1D17A Control +1D17B 1D182 Extend +1D185 1D18B Extend +1D1AA 1D1AD Extend +1D242 1D244 Extend +1DA00 1DA36 Extend +1DA3B 1DA6C Extend +1DA75 Extend +1DA84 Extend +1DA9B 1DA9F Extend +1DAA1 1DAAF Extend +1E000 1E006 Extend +1E008 1E018 Extend +1E01B 1E021 Extend +1E023 1E024 Extend +1E026 1E02A Extend +1E8D0 1E8D6 Extend +1E944 1E94A Extend +1F1E6 1F1FF Regional_Indicator +1F308 Glue_After_Zwj +1F33E Glue_After_Zwj +1F373 Glue_After_Zwj +1F385 E_Base +1F393 Glue_After_Zwj +1F3A4 Glue_After_Zwj +1F3A8 Glue_After_Zwj +1F3C2 1F3C4 E_Base +1F3C7 E_Base +1F3CA 1F3CC E_Base +1F3EB Glue_After_Zwj +1F3ED Glue_After_Zwj +1F3FB 1F3FF E_Modifier +1F442 1F443 E_Base +1F446 1F450 E_Base +1F466 1F469 E_Base_GAZ +1F46E E_Base +1F470 1F478 E_Base +1F47C E_Base +1F481 1F483 E_Base +1F485 1F487 E_Base +1F48B Glue_After_Zwj +1F4AA E_Base +1F4BB 1F4BC Glue_After_Zwj +1F527 Glue_After_Zwj +1F52C Glue_After_Zwj +1F574 1F575 E_Base +1F57A E_Base +1F590 E_Base +1F595 1F596 E_Base +1F5E8 Glue_After_Zwj +1F645 1F647 E_Base +1F64B 1F64F E_Base +1F680 Glue_After_Zwj +1F692 Glue_After_Zwj +1F6A3 E_Base +1F6B4 1F6B6 E_Base +1F6C0 E_Base +1F6CC E_Base +1F918 1F91C E_Base +1F91E 1F91F E_Base +1F926 E_Base +1F930 1F939 E_Base +1F93D 1F93E E_Base +1F9D1 1F9DD E_Base +E0000 E001F Control +E0020 E007F Extend +E0080 E00FF Control +E0100 E01EF Extend +E01F0 E0FFF Control +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'To_PerlLB'}{'format'} = 's'; # string +$utf8::SwashInfo{'To_PerlLB'}{'missing'} = 'Alphabetic'; + +return <<'END'; +0 8 Combining_Mark +9 Break_After +A Line_Feed +B C Mandatory_Break +D Carriage_Return +E 1F Combining_Mark +20 Space +21 Exclamation +22 Quotation +24 Prefix_Numeric +25 Postfix_Numeric +27 Quotation +28 Open_Punctuation +29 Close_Parenthesis +2B Prefix_Numeric +2C Infix_Numeric +2D Hyphen +2E Infix_Numeric +2F Break_Symbols +30 39 Numeric +3A 3B Infix_Numeric +3F Exclamation +5B Open_Punctuation +5C Prefix_Numeric +5D Close_Parenthesis +7B Open_Punctuation +7C Break_After +7D Close_Punctuation +7F 84 Combining_Mark +85 Next_Line +86 9F Combining_Mark +A0 Glue +A1 Open_Punctuation +A2 Postfix_Numeric +A3 A5 Prefix_Numeric +AB Quotation +AD Break_After +B0 Postfix_Numeric +B1 Prefix_Numeric +B4 Break_Before +BB Quotation +BF Open_Punctuation +2C8 Break_Before +2CC Break_Before +2DF Break_Before +300 34E Combining_Mark +34F Glue +350 35B Combining_Mark +35C 362 Glue +363 36F Combining_Mark +37E Infix_Numeric +483 489 Combining_Mark +589 Infix_Numeric +58A Break_After +58F Prefix_Numeric +591 5BD Combining_Mark +5BE Break_After +5BF Combining_Mark +5C1 5C2 Combining_Mark +5C4 5C5 Combining_Mark +5C6 Exclamation +5C7 Combining_Mark +5D0 5EA Hebrew_Letter +5F0 5F2 Hebrew_Letter +609 60B Postfix_Numeric +60C 60D Infix_Numeric +610 61A Combining_Mark +61B Exclamation +61C Combining_Mark +61E 61F Exclamation +64B 65F Combining_Mark +660 669 Numeric +66A Postfix_Numeric +66B 66C Numeric +670 Combining_Mark +6D4 Exclamation +6D6 6DC Combining_Mark +6DF 6E4 Combining_Mark +6E7 6E8 Combining_Mark +6EA 6ED Combining_Mark +6F0 6F9 Numeric +711 Combining_Mark +730 74A Combining_Mark +7A6 7B0 Combining_Mark +7C0 7C9 Numeric +7EB 7F3 Combining_Mark +7F8 Infix_Numeric +7F9 Exclamation +816 819 Combining_Mark +81B 823 Combining_Mark +825 827 Combining_Mark +829 82D Combining_Mark +859 85B Combining_Mark +8D4 8E1 Combining_Mark +8E3 903 Combining_Mark +93A 93C Combining_Mark +93E 94F Combining_Mark +951 957 Combining_Mark +962 963 Combining_Mark +964 965 Break_After +966 96F Numeric +981 983 Combining_Mark +9BC Combining_Mark +9BE 9C4 Combining_Mark +9C7 9C8 Combining_Mark +9CB 9CD Combining_Mark +9D7 Combining_Mark +9E2 9E3 Combining_Mark +9E6 9EF Numeric +9F2 9F3 Postfix_Numeric +9F9 Postfix_Numeric +9FB Prefix_Numeric +A01 A03 Combining_Mark +A3C Combining_Mark +A3E A42 Combining_Mark +A47 A48 Combining_Mark +A4B A4D Combining_Mark +A51 Combining_Mark +A66 A6F Numeric +A70 A71 Combining_Mark +A75 Combining_Mark +A81 A83 Combining_Mark +ABC Combining_Mark +ABE AC5 Combining_Mark +AC7 AC9 Combining_Mark +ACB ACD Combining_Mark +AE2 AE3 Combining_Mark +AE6 AEF Numeric +AF1 Prefix_Numeric +AFA AFF Combining_Mark +B01 B03 Combining_Mark +B3C Combining_Mark +B3E B44 Combining_Mark +B47 B48 Combining_Mark +B4B B4D Combining_Mark +B56 B57 Combining_Mark +B62 B63 Combining_Mark +B66 B6F Numeric +B82 Combining_Mark +BBE BC2 Combining_Mark +BC6 BC8 Combining_Mark +BCA BCD Combining_Mark +BD7 Combining_Mark +BE6 BEF Numeric +BF9 Prefix_Numeric +C00 C03 Combining_Mark +C3E C44 Combining_Mark +C46 C48 Combining_Mark +C4A C4D Combining_Mark +C55 C56 Combining_Mark +C62 C63 Combining_Mark +C66 C6F Numeric +C81 C83 Combining_Mark +CBC Combining_Mark +CBE CC4 Combining_Mark +CC6 CC8 Combining_Mark +CCA CCD Combining_Mark +CD5 CD6 Combining_Mark +CE2 CE3 Combining_Mark +CE6 CEF Numeric +D00 D03 Combining_Mark +D3B D3C Combining_Mark +D3E D44 Combining_Mark +D46 D48 Combining_Mark +D4A D4D Combining_Mark +D57 Combining_Mark +D62 D63 Combining_Mark +D66 D6F Numeric +D79 Postfix_Numeric +D82 D83 Combining_Mark +DCA Combining_Mark +DCF DD4 Combining_Mark +DD6 Combining_Mark +DD8 DDF Combining_Mark +DE6 DEF Numeric +DF2 DF3 Combining_Mark +E31 Combining_Mark +E34 E3A Combining_Mark +E3F Prefix_Numeric +E47 E4E Combining_Mark +E50 E59 Numeric +E5A E5B Break_After +EB1 Combining_Mark +EB4 EB9 Combining_Mark +EBB EBC Combining_Mark +EC8 ECD Combining_Mark +ED0 ED9 Numeric +F01 F04 Break_Before +F06 F07 Break_Before +F08 Glue +F09 F0A Break_Before +F0B Break_After +F0C Glue +F0D F11 Exclamation +F12 Glue +F14 Exclamation +F18 F19 Combining_Mark +F20 F29 Numeric +F34 Break_After +F35 Combining_Mark +F37 Combining_Mark +F39 Combining_Mark +F3A Open_Punctuation +F3B Close_Punctuation +F3C Open_Punctuation +F3D Close_Punctuation +F3E F3F Combining_Mark +F71 F7E Combining_Mark +F7F Break_After +F80 F84 Combining_Mark +F85 Break_After +F86 F87 Combining_Mark +F8D F97 Combining_Mark +F99 FBC Combining_Mark +FBE FBF Break_After +FC6 Combining_Mark +FD0 FD1 Break_Before +FD2 Break_After +FD3 Break_Before +FD9 FDA Glue +102B 103E Combining_Mark +1040 1049 Numeric +104A 104B Break_After +1056 1059 Combining_Mark +105E 1060 Combining_Mark +1062 1064 Combining_Mark +1067 106D Combining_Mark +1071 1074 Combining_Mark +1082 108D Combining_Mark +108F Combining_Mark +1090 1099 Numeric +109A 109D Combining_Mark +1100 115F JL +1160 11A7 JV +11A8 11FF JT +135D 135F Combining_Mark +1361 Break_After +1400 Break_After +1680 Break_After +169B Open_Punctuation +169C Close_Punctuation +16EB 16ED Break_After +1712 1714 Combining_Mark +1732 1734 Combining_Mark +1735 1736 Break_After +1752 1753 Combining_Mark +1772 1773 Combining_Mark +17B4 17D3 Combining_Mark +17D4 17D5 Break_After +17D6 Nonstarter +17D8 Break_After +17DA Break_After +17DB Prefix_Numeric +17DD Combining_Mark +17E0 17E9 Numeric +1802 1803 Exclamation +1804 1805 Break_After +1806 Break_Before +1808 1809 Exclamation +180B 180D Combining_Mark +180E Glue +1810 1819 Numeric +1885 1886 Combining_Mark +18A9 Combining_Mark +1920 192B Combining_Mark +1930 193B Combining_Mark +1944 1945 Exclamation +1946 194F Numeric +19D0 19D9 Numeric +1A17 1A1B Combining_Mark +1A55 1A5E Combining_Mark +1A60 1A7C Combining_Mark +1A7F Combining_Mark +1A80 1A89 Numeric +1A90 1A99 Numeric +1AB0 1ABE Combining_Mark +1B00 1B04 Combining_Mark +1B34 1B44 Combining_Mark +1B50 1B59 Numeric +1B5A 1B5B Break_After +1B5D 1B60 Break_After +1B6B 1B73 Combining_Mark +1B80 1B82 Combining_Mark +1BA1 1BAD Combining_Mark +1BB0 1BB9 Numeric +1BE6 1BF3 Combining_Mark +1C24 1C37 Combining_Mark +1C3B 1C3F Break_After +1C40 1C49 Numeric +1C50 1C59 Numeric +1C7E 1C7F Break_After +1CD0 1CD2 Combining_Mark +1CD4 1CE8 Combining_Mark +1CED Combining_Mark +1CF2 1CF4 Combining_Mark +1CF7 1CF9 Combining_Mark +1DC0 1DF9 Combining_Mark +1DFB 1DFF Combining_Mark +1FFD Break_Before +2000 2006 Break_After +2007 Glue +2008 200A Break_After +200B ZWSpace +200C Combining_Mark +200D ZWJ +200E 200F Combining_Mark +2010 Break_After +2011 Glue +2012 2013 Break_After +2014 Break_Both +2018 2019 Quotation +201A Open_Punctuation +201B 201D Quotation +201E Open_Punctuation +201F Quotation +2024 2026 Inseparable +2027 Break_After +2028 2029 Mandatory_Break +202A 202E Combining_Mark +202F Glue +2030 2037 Postfix_Numeric +2039 203A Quotation +203C 203D Nonstarter +2044 Infix_Numeric +2045 Open_Punctuation +2046 Close_Punctuation +2047 2049 Nonstarter +2056 Break_After +2058 205B Break_After +205D 205F Break_After +2060 Word_Joiner +2066 206F Combining_Mark +207D Open_Punctuation +207E Close_Punctuation +208D Open_Punctuation +208E Close_Punctuation +20A0 20A6 Prefix_Numeric +20A7 Postfix_Numeric +20A8 20B5 Prefix_Numeric +20B6 Postfix_Numeric +20B7 20BA Prefix_Numeric +20BB Postfix_Numeric +20BC 20BD Prefix_Numeric +20BE Postfix_Numeric +20BF 20CF Prefix_Numeric +20D0 20F0 Combining_Mark +2103 Postfix_Numeric +2109 Postfix_Numeric +2116 Prefix_Numeric +2212 2213 Prefix_Numeric +22EF Inseparable +2308 Open_Punctuation +2309 Close_Punctuation +230A Open_Punctuation +230B Close_Punctuation +231A 231B Ideographic +2329 Open_Punctuation +232A Close_Punctuation +23F0 23F3 Ideographic +2600 2603 Ideographic +2614 2615 Ideographic +2618 Ideographic +261A 261C Ideographic +261D E_Base +261E 261F Ideographic +2639 263B Ideographic +2668 Ideographic +267F Ideographic +26BD 26C8 Ideographic +26CD Ideographic +26CF 26D1 Ideographic +26D3 26D4 Ideographic +26D8 26D9 Ideographic +26DC Ideographic +26DF 26E1 Ideographic +26EA Ideographic +26F1 26F5 Ideographic +26F7 26F8 Ideographic +26F9 E_Base +26FA Ideographic +26FD 2704 Ideographic +2708 2709 Ideographic +270A 270D E_Base +275B 2760 Quotation +2762 2763 Exclamation +2764 Ideographic +2768 Open_Punctuation +2769 Close_Punctuation +276A Open_Punctuation +276B Close_Punctuation +276C Open_Punctuation +276D Close_Punctuation +276E Open_Punctuation +276F Close_Punctuation +2770 Open_Punctuation +2771 Close_Punctuation +2772 Open_Punctuation +2773 Close_Punctuation +2774 Open_Punctuation +2775 Close_Punctuation +27C5 Open_Punctuation +27C6 Close_Punctuation +27E6 Open_Punctuation +27E7 Close_Punctuation +27E8 Open_Punctuation +27E9 Close_Punctuation +27EA Open_Punctuation +27EB Close_Punctuation +27EC Open_Punctuation +27ED Close_Punctuation +27EE Open_Punctuation +27EF Close_Punctuation +2983 Open_Punctuation +2984 Close_Punctuation +2985 Open_Punctuation +2986 Close_Punctuation +2987 Open_Punctuation +2988 Close_Punctuation +2989 Open_Punctuation +298A Close_Punctuation +298B Open_Punctuation +298C Close_Punctuation +298D Open_Punctuation +298E Close_Punctuation +298F Open_Punctuation +2990 Close_Punctuation +2991 Open_Punctuation +2992 Close_Punctuation +2993 Open_Punctuation +2994 Close_Punctuation +2995 Open_Punctuation +2996 Close_Punctuation +2997 Open_Punctuation +2998 Close_Punctuation +29D8 Open_Punctuation +29D9 Close_Punctuation +29DA Open_Punctuation +29DB Close_Punctuation +29FC Open_Punctuation +29FD Close_Punctuation +2CEF 2CF1 Combining_Mark +2CF9 Exclamation +2CFA 2CFC Break_After +2CFE Exclamation +2CFF Break_After +2D70 Break_After +2D7F Combining_Mark +2DE0 2DFF Combining_Mark +2E00 2E0D Quotation +2E0E 2E15 Break_After +2E17 Break_After +2E18 Open_Punctuation +2E19 Break_After +2E1C 2E1D Quotation +2E20 2E21 Quotation +2E22 Open_Punctuation +2E23 Close_Punctuation +2E24 Open_Punctuation +2E25 Close_Punctuation +2E26 Open_Punctuation +2E27 Close_Punctuation +2E28 Open_Punctuation +2E29 Close_Punctuation +2E2A 2E2D Break_After +2E2E Exclamation +2E30 2E31 Break_After +2E33 2E34 Break_After +2E3A 2E3B Break_Both +2E3C 2E3E Break_After +2E40 2E41 Break_After +2E42 Open_Punctuation +2E43 2E49 Break_After +2E80 2E99 Ideographic +2E9B 2EF3 Ideographic +2F00 2FD5 Ideographic +2FF0 2FFB Ideographic +3000 Break_After +3001 3002 Close_Punctuation +3003 3004 Ideographic +3005 Nonstarter +3006 3007 Ideographic +3008 Open_Punctuation +3009 Close_Punctuation +300A Open_Punctuation +300B Close_Punctuation +300C Open_Punctuation +300D Close_Punctuation +300E Open_Punctuation +300F Close_Punctuation +3010 Open_Punctuation +3011 Close_Punctuation +3012 3013 Ideographic +3014 Open_Punctuation +3015 Close_Punctuation +3016 Open_Punctuation +3017 Close_Punctuation +3018 Open_Punctuation +3019 Close_Punctuation +301A Open_Punctuation +301B Close_Punctuation +301C Nonstarter +301D Open_Punctuation +301E 301F Close_Punctuation +3020 3029 Ideographic +302A 302F Combining_Mark +3030 3034 Ideographic +3035 Combining_Mark +3036 303A Ideographic +303B 303C Nonstarter +303D 303F Ideographic +3041 Nonstarter +3042 Ideographic +3043 Nonstarter +3044 Ideographic +3045 Nonstarter +3046 Ideographic +3047 Nonstarter +3048 Ideographic +3049 Nonstarter +304A 3062 Ideographic +3063 Nonstarter +3064 3082 Ideographic +3083 Nonstarter +3084 Ideographic +3085 Nonstarter +3086 Ideographic +3087 Nonstarter +3088 308D Ideographic +308E Nonstarter +308F 3094 Ideographic +3095 3096 Nonstarter +3099 309A Combining_Mark +309B 309E Nonstarter +309F Ideographic +30A0 30A1 Nonstarter +30A2 Ideographic +30A3 Nonstarter +30A4 Ideographic +30A5 Nonstarter +30A6 Ideographic +30A7 Nonstarter +30A8 Ideographic +30A9 Nonstarter +30AA 30C2 Ideographic +30C3 Nonstarter +30C4 30E2 Ideographic +30E3 Nonstarter +30E4 Ideographic +30E5 Nonstarter +30E6 Ideographic +30E7 Nonstarter +30E8 30ED Ideographic +30EE Nonstarter +30EF 30F4 Ideographic +30F5 30F6 Nonstarter +30F7 30FA Ideographic +30FB 30FE Nonstarter +30FF Ideographic +3105 312E Ideographic +3131 318E Ideographic +3190 31BA Ideographic +31C0 31E3 Ideographic +31F0 31FF Nonstarter +3200 321E Ideographic +3220 3247 Ideographic +3250 32FE Ideographic +3300 4DBF Ideographic +4E00 A014 Ideographic +A015 Nonstarter +A016 A48C Ideographic +A490 A4C6 Ideographic +A4FE A4FF Break_After +A60D Break_After +A60E Exclamation +A60F Break_After +A620 A629 Numeric +A66F A672 Combining_Mark +A674 A67D Combining_Mark +A69E A69F Combining_Mark +A6F0 A6F1 Combining_Mark +A6F3 A6F7 Break_After +A802 Combining_Mark +A806 Combining_Mark +A80B Combining_Mark +A823 A827 Combining_Mark +A838 Postfix_Numeric +A874 A875 Break_Before +A876 A877 Exclamation +A880 A881 Combining_Mark +A8B4 A8C5 Combining_Mark +A8CE A8CF Break_After +A8D0 A8D9 Numeric +A8E0 A8F1 Combining_Mark +A8FC Break_Before +A900 A909 Numeric +A926 A92D Combining_Mark +A92E A92F Break_After +A947 A953 Combining_Mark +A960 A97C JL +A980 A983 Combining_Mark +A9B3 A9C0 Combining_Mark +A9C7 A9C9 Break_After +A9D0 A9D9 Numeric +A9E5 Combining_Mark +A9F0 A9F9 Numeric +AA29 AA36 Combining_Mark +AA43 Combining_Mark +AA4C AA4D Combining_Mark +AA50 AA59 Numeric +AA5D AA5F Break_After +AA7B AA7D Combining_Mark +AAB0 Combining_Mark +AAB2 AAB4 Combining_Mark +AAB7 AAB8 Combining_Mark +AABE AABF Combining_Mark +AAC1 Combining_Mark +AAEB AAEF Combining_Mark +AAF0 AAF1 Break_After +AAF5 AAF6 Combining_Mark +ABE3 ABEA Combining_Mark +ABEB Break_After +ABEC ABED Combining_Mark +ABF0 ABF9 Numeric +AC00 H2 +AC01 AC1B H3 +AC1C H2 +AC1D AC37 H3 +AC38 H2 +AC39 AC53 H3 +AC54 H2 +AC55 AC6F H3 +AC70 H2 +AC71 AC8B H3 +AC8C H2 +AC8D ACA7 H3 +ACA8 H2 +ACA9 ACC3 H3 +ACC4 H2 +ACC5 ACDF H3 +ACE0 H2 +ACE1 ACFB H3 +ACFC H2 +ACFD AD17 H3 +AD18 H2 +AD19 AD33 H3 +AD34 H2 +AD35 AD4F H3 +AD50 H2 +AD51 AD6B H3 +AD6C H2 +AD6D AD87 H3 +AD88 H2 +AD89 ADA3 H3 +ADA4 H2 +ADA5 ADBF H3 +ADC0 H2 +ADC1 ADDB H3 +ADDC H2 +ADDD ADF7 H3 +ADF8 H2 +ADF9 AE13 H3 +AE14 H2 +AE15 AE2F H3 +AE30 H2 +AE31 AE4B H3 +AE4C H2 +AE4D AE67 H3 +AE68 H2 +AE69 AE83 H3 +AE84 H2 +AE85 AE9F H3 +AEA0 H2 +AEA1 AEBB H3 +AEBC H2 +AEBD AED7 H3 +AED8 H2 +AED9 AEF3 H3 +AEF4 H2 +AEF5 AF0F H3 +AF10 H2 +AF11 AF2B H3 +AF2C H2 +AF2D AF47 H3 +AF48 H2 +AF49 AF63 H3 +AF64 H2 +AF65 AF7F H3 +AF80 H2 +AF81 AF9B H3 +AF9C H2 +AF9D AFB7 H3 +AFB8 H2 +AFB9 AFD3 H3 +AFD4 H2 +AFD5 AFEF H3 +AFF0 H2 +AFF1 B00B H3 +B00C H2 +B00D B027 H3 +B028 H2 +B029 B043 H3 +B044 H2 +B045 B05F H3 +B060 H2 +B061 B07B H3 +B07C H2 +B07D B097 H3 +B098 H2 +B099 B0B3 H3 +B0B4 H2 +B0B5 B0CF H3 +B0D0 H2 +B0D1 B0EB H3 +B0EC H2 +B0ED B107 H3 +B108 H2 +B109 B123 H3 +B124 H2 +B125 B13F H3 +B140 H2 +B141 B15B H3 +B15C H2 +B15D B177 H3 +B178 H2 +B179 B193 H3 +B194 H2 +B195 B1AF H3 +B1B0 H2 +B1B1 B1CB H3 +B1CC H2 +B1CD B1E7 H3 +B1E8 H2 +B1E9 B203 H3 +B204 H2 +B205 B21F H3 +B220 H2 +B221 B23B H3 +B23C H2 +B23D B257 H3 +B258 H2 +B259 B273 H3 +B274 H2 +B275 B28F H3 +B290 H2 +B291 B2AB H3 +B2AC H2 +B2AD B2C7 H3 +B2C8 H2 +B2C9 B2E3 H3 +B2E4 H2 +B2E5 B2FF H3 +B300 H2 +B301 B31B H3 +B31C H2 +B31D B337 H3 +B338 H2 +B339 B353 H3 +B354 H2 +B355 B36F H3 +B370 H2 +B371 B38B H3 +B38C H2 +B38D B3A7 H3 +B3A8 H2 +B3A9 B3C3 H3 +B3C4 H2 +B3C5 B3DF H3 +B3E0 H2 +B3E1 B3FB H3 +B3FC H2 +B3FD B417 H3 +B418 H2 +B419 B433 H3 +B434 H2 +B435 B44F H3 +B450 H2 +B451 B46B H3 +B46C H2 +B46D B487 H3 +B488 H2 +B489 B4A3 H3 +B4A4 H2 +B4A5 B4BF H3 +B4C0 H2 +B4C1 B4DB H3 +B4DC H2 +B4DD B4F7 H3 +B4F8 H2 +B4F9 B513 H3 +B514 H2 +B515 B52F H3 +B530 H2 +B531 B54B H3 +B54C H2 +B54D B567 H3 +B568 H2 +B569 B583 H3 +B584 H2 +B585 B59F H3 +B5A0 H2 +B5A1 B5BB H3 +B5BC H2 +B5BD B5D7 H3 +B5D8 H2 +B5D9 B5F3 H3 +B5F4 H2 +B5F5 B60F H3 +B610 H2 +B611 B62B H3 +B62C H2 +B62D B647 H3 +B648 H2 +B649 B663 H3 +B664 H2 +B665 B67F H3 +B680 H2 +B681 B69B H3 +B69C H2 +B69D B6B7 H3 +B6B8 H2 +B6B9 B6D3 H3 +B6D4 H2 +B6D5 B6EF H3 +B6F0 H2 +B6F1 B70B H3 +B70C H2 +B70D B727 H3 +B728 H2 +B729 B743 H3 +B744 H2 +B745 B75F H3 +B760 H2 +B761 B77B H3 +B77C H2 +B77D B797 H3 +B798 H2 +B799 B7B3 H3 +B7B4 H2 +B7B5 B7CF H3 +B7D0 H2 +B7D1 B7EB H3 +B7EC H2 +B7ED B807 H3 +B808 H2 +B809 B823 H3 +B824 H2 +B825 B83F H3 +B840 H2 +B841 B85B H3 +B85C H2 +B85D B877 H3 +B878 H2 +B879 B893 H3 +B894 H2 +B895 B8AF H3 +B8B0 H2 +B8B1 B8CB H3 +B8CC H2 +B8CD B8E7 H3 +B8E8 H2 +B8E9 B903 H3 +B904 H2 +B905 B91F H3 +B920 H2 +B921 B93B H3 +B93C H2 +B93D B957 H3 +B958 H2 +B959 B973 H3 +B974 H2 +B975 B98F H3 +B990 H2 +B991 B9AB H3 +B9AC H2 +B9AD B9C7 H3 +B9C8 H2 +B9C9 B9E3 H3 +B9E4 H2 +B9E5 B9FF H3 +BA00 H2 +BA01 BA1B H3 +BA1C H2 +BA1D BA37 H3 +BA38 H2 +BA39 BA53 H3 +BA54 H2 +BA55 BA6F H3 +BA70 H2 +BA71 BA8B H3 +BA8C H2 +BA8D BAA7 H3 +BAA8 H2 +BAA9 BAC3 H3 +BAC4 H2 +BAC5 BADF H3 +BAE0 H2 +BAE1 BAFB H3 +BAFC H2 +BAFD BB17 H3 +BB18 H2 +BB19 BB33 H3 +BB34 H2 +BB35 BB4F H3 +BB50 H2 +BB51 BB6B H3 +BB6C H2 +BB6D BB87 H3 +BB88 H2 +BB89 BBA3 H3 +BBA4 H2 +BBA5 BBBF H3 +BBC0 H2 +BBC1 BBDB H3 +BBDC H2 +BBDD BBF7 H3 +BBF8 H2 +BBF9 BC13 H3 +BC14 H2 +BC15 BC2F H3 +BC30 H2 +BC31 BC4B H3 +BC4C H2 +BC4D BC67 H3 +BC68 H2 +BC69 BC83 H3 +BC84 H2 +BC85 BC9F H3 +BCA0 H2 +BCA1 BCBB H3 +BCBC H2 +BCBD BCD7 H3 +BCD8 H2 +BCD9 BCF3 H3 +BCF4 H2 +BCF5 BD0F H3 +BD10 H2 +BD11 BD2B H3 +BD2C H2 +BD2D BD47 H3 +BD48 H2 +BD49 BD63 H3 +BD64 H2 +BD65 BD7F H3 +BD80 H2 +BD81 BD9B H3 +BD9C H2 +BD9D BDB7 H3 +BDB8 H2 +BDB9 BDD3 H3 +BDD4 H2 +BDD5 BDEF H3 +BDF0 H2 +BDF1 BE0B H3 +BE0C H2 +BE0D BE27 H3 +BE28 H2 +BE29 BE43 H3 +BE44 H2 +BE45 BE5F H3 +BE60 H2 +BE61 BE7B H3 +BE7C H2 +BE7D BE97 H3 +BE98 H2 +BE99 BEB3 H3 +BEB4 H2 +BEB5 BECF H3 +BED0 H2 +BED1 BEEB H3 +BEEC H2 +BEED BF07 H3 +BF08 H2 +BF09 BF23 H3 +BF24 H2 +BF25 BF3F H3 +BF40 H2 +BF41 BF5B H3 +BF5C H2 +BF5D BF77 H3 +BF78 H2 +BF79 BF93 H3 +BF94 H2 +BF95 BFAF H3 +BFB0 H2 +BFB1 BFCB H3 +BFCC H2 +BFCD BFE7 H3 +BFE8 H2 +BFE9 C003 H3 +C004 H2 +C005 C01F H3 +C020 H2 +C021 C03B H3 +C03C H2 +C03D C057 H3 +C058 H2 +C059 C073 H3 +C074 H2 +C075 C08F H3 +C090 H2 +C091 C0AB H3 +C0AC H2 +C0AD C0C7 H3 +C0C8 H2 +C0C9 C0E3 H3 +C0E4 H2 +C0E5 C0FF H3 +C100 H2 +C101 C11B H3 +C11C H2 +C11D C137 H3 +C138 H2 +C139 C153 H3 +C154 H2 +C155 C16F H3 +C170 H2 +C171 C18B H3 +C18C H2 +C18D C1A7 H3 +C1A8 H2 +C1A9 C1C3 H3 +C1C4 H2 +C1C5 C1DF H3 +C1E0 H2 +C1E1 C1FB H3 +C1FC H2 +C1FD C217 H3 +C218 H2 +C219 C233 H3 +C234 H2 +C235 C24F H3 +C250 H2 +C251 C26B H3 +C26C H2 +C26D C287 H3 +C288 H2 +C289 C2A3 H3 +C2A4 H2 +C2A5 C2BF H3 +C2C0 H2 +C2C1 C2DB H3 +C2DC H2 +C2DD C2F7 H3 +C2F8 H2 +C2F9 C313 H3 +C314 H2 +C315 C32F H3 +C330 H2 +C331 C34B H3 +C34C H2 +C34D C367 H3 +C368 H2 +C369 C383 H3 +C384 H2 +C385 C39F H3 +C3A0 H2 +C3A1 C3BB H3 +C3BC H2 +C3BD C3D7 H3 +C3D8 H2 +C3D9 C3F3 H3 +C3F4 H2 +C3F5 C40F H3 +C410 H2 +C411 C42B H3 +C42C H2 +C42D C447 H3 +C448 H2 +C449 C463 H3 +C464 H2 +C465 C47F H3 +C480 H2 +C481 C49B H3 +C49C H2 +C49D C4B7 H3 +C4B8 H2 +C4B9 C4D3 H3 +C4D4 H2 +C4D5 C4EF H3 +C4F0 H2 +C4F1 C50B H3 +C50C H2 +C50D C527 H3 +C528 H2 +C529 C543 H3 +C544 H2 +C545 C55F H3 +C560 H2 +C561 C57B H3 +C57C H2 +C57D C597 H3 +C598 H2 +C599 C5B3 H3 +C5B4 H2 +C5B5 C5CF H3 +C5D0 H2 +C5D1 C5EB H3 +C5EC H2 +C5ED C607 H3 +C608 H2 +C609 C623 H3 +C624 H2 +C625 C63F H3 +C640 H2 +C641 C65B H3 +C65C H2 +C65D C677 H3 +C678 H2 +C679 C693 H3 +C694 H2 +C695 C6AF H3 +C6B0 H2 +C6B1 C6CB H3 +C6CC H2 +C6CD C6E7 H3 +C6E8 H2 +C6E9 C703 H3 +C704 H2 +C705 C71F H3 +C720 H2 +C721 C73B H3 +C73C H2 +C73D C757 H3 +C758 H2 +C759 C773 H3 +C774 H2 +C775 C78F H3 +C790 H2 +C791 C7AB H3 +C7AC H2 +C7AD C7C7 H3 +C7C8 H2 +C7C9 C7E3 H3 +C7E4 H2 +C7E5 C7FF H3 +C800 H2 +C801 C81B H3 +C81C H2 +C81D C837 H3 +C838 H2 +C839 C853 H3 +C854 H2 +C855 C86F H3 +C870 H2 +C871 C88B H3 +C88C H2 +C88D C8A7 H3 +C8A8 H2 +C8A9 C8C3 H3 +C8C4 H2 +C8C5 C8DF H3 +C8E0 H2 +C8E1 C8FB H3 +C8FC H2 +C8FD C917 H3 +C918 H2 +C919 C933 H3 +C934 H2 +C935 C94F H3 +C950 H2 +C951 C96B H3 +C96C H2 +C96D C987 H3 +C988 H2 +C989 C9A3 H3 +C9A4 H2 +C9A5 C9BF H3 +C9C0 H2 +C9C1 C9DB H3 +C9DC H2 +C9DD C9F7 H3 +C9F8 H2 +C9F9 CA13 H3 +CA14 H2 +CA15 CA2F H3 +CA30 H2 +CA31 CA4B H3 +CA4C H2 +CA4D CA67 H3 +CA68 H2 +CA69 CA83 H3 +CA84 H2 +CA85 CA9F H3 +CAA0 H2 +CAA1 CABB H3 +CABC H2 +CABD CAD7 H3 +CAD8 H2 +CAD9 CAF3 H3 +CAF4 H2 +CAF5 CB0F H3 +CB10 H2 +CB11 CB2B H3 +CB2C H2 +CB2D CB47 H3 +CB48 H2 +CB49 CB63 H3 +CB64 H2 +CB65 CB7F H3 +CB80 H2 +CB81 CB9B H3 +CB9C H2 +CB9D CBB7 H3 +CBB8 H2 +CBB9 CBD3 H3 +CBD4 H2 +CBD5 CBEF H3 +CBF0 H2 +CBF1 CC0B H3 +CC0C H2 +CC0D CC27 H3 +CC28 H2 +CC29 CC43 H3 +CC44 H2 +CC45 CC5F H3 +CC60 H2 +CC61 CC7B H3 +CC7C H2 +CC7D CC97 H3 +CC98 H2 +CC99 CCB3 H3 +CCB4 H2 +CCB5 CCCF H3 +CCD0 H2 +CCD1 CCEB H3 +CCEC H2 +CCED CD07 H3 +CD08 H2 +CD09 CD23 H3 +CD24 H2 +CD25 CD3F H3 +CD40 H2 +CD41 CD5B H3 +CD5C H2 +CD5D CD77 H3 +CD78 H2 +CD79 CD93 H3 +CD94 H2 +CD95 CDAF H3 +CDB0 H2 +CDB1 CDCB H3 +CDCC H2 +CDCD CDE7 H3 +CDE8 H2 +CDE9 CE03 H3 +CE04 H2 +CE05 CE1F H3 +CE20 H2 +CE21 CE3B H3 +CE3C H2 +CE3D CE57 H3 +CE58 H2 +CE59 CE73 H3 +CE74 H2 +CE75 CE8F H3 +CE90 H2 +CE91 CEAB H3 +CEAC H2 +CEAD CEC7 H3 +CEC8 H2 +CEC9 CEE3 H3 +CEE4 H2 +CEE5 CEFF H3 +CF00 H2 +CF01 CF1B H3 +CF1C H2 +CF1D CF37 H3 +CF38 H2 +CF39 CF53 H3 +CF54 H2 +CF55 CF6F H3 +CF70 H2 +CF71 CF8B H3 +CF8C H2 +CF8D CFA7 H3 +CFA8 H2 +CFA9 CFC3 H3 +CFC4 H2 +CFC5 CFDF H3 +CFE0 H2 +CFE1 CFFB H3 +CFFC H2 +CFFD D017 H3 +D018 H2 +D019 D033 H3 +D034 H2 +D035 D04F H3 +D050 H2 +D051 D06B H3 +D06C H2 +D06D D087 H3 +D088 H2 +D089 D0A3 H3 +D0A4 H2 +D0A5 D0BF H3 +D0C0 H2 +D0C1 D0DB H3 +D0DC H2 +D0DD D0F7 H3 +D0F8 H2 +D0F9 D113 H3 +D114 H2 +D115 D12F H3 +D130 H2 +D131 D14B H3 +D14C H2 +D14D D167 H3 +D168 H2 +D169 D183 H3 +D184 H2 +D185 D19F H3 +D1A0 H2 +D1A1 D1BB H3 +D1BC H2 +D1BD D1D7 H3 +D1D8 H2 +D1D9 D1F3 H3 +D1F4 H2 +D1F5 D20F H3 +D210 H2 +D211 D22B H3 +D22C H2 +D22D D247 H3 +D248 H2 +D249 D263 H3 +D264 H2 +D265 D27F H3 +D280 H2 +D281 D29B H3 +D29C H2 +D29D D2B7 H3 +D2B8 H2 +D2B9 D2D3 H3 +D2D4 H2 +D2D5 D2EF H3 +D2F0 H2 +D2F1 D30B H3 +D30C H2 +D30D D327 H3 +D328 H2 +D329 D343 H3 +D344 H2 +D345 D35F H3 +D360 H2 +D361 D37B H3 +D37C H2 +D37D D397 H3 +D398 H2 +D399 D3B3 H3 +D3B4 H2 +D3B5 D3CF H3 +D3D0 H2 +D3D1 D3EB H3 +D3EC H2 +D3ED D407 H3 +D408 H2 +D409 D423 H3 +D424 H2 +D425 D43F H3 +D440 H2 +D441 D45B H3 +D45C H2 +D45D D477 H3 +D478 H2 +D479 D493 H3 +D494 H2 +D495 D4AF H3 +D4B0 H2 +D4B1 D4CB H3 +D4CC H2 +D4CD D4E7 H3 +D4E8 H2 +D4E9 D503 H3 +D504 H2 +D505 D51F H3 +D520 H2 +D521 D53B H3 +D53C H2 +D53D D557 H3 +D558 H2 +D559 D573 H3 +D574 H2 +D575 D58F H3 +D590 H2 +D591 D5AB H3 +D5AC H2 +D5AD D5C7 H3 +D5C8 H2 +D5C9 D5E3 H3 +D5E4 H2 +D5E5 D5FF H3 +D600 H2 +D601 D61B H3 +D61C H2 +D61D D637 H3 +D638 H2 +D639 D653 H3 +D654 H2 +D655 D66F H3 +D670 H2 +D671 D68B H3 +D68C H2 +D68D D6A7 H3 +D6A8 H2 +D6A9 D6C3 H3 +D6C4 H2 +D6C5 D6DF H3 +D6E0 H2 +D6E1 D6FB H3 +D6FC H2 +D6FD D717 H3 +D718 H2 +D719 D733 H3 +D734 H2 +D735 D74F H3 +D750 H2 +D751 D76B H3 +D76C H2 +D76D D787 H3 +D788 H2 +D789 D7A3 H3 +D7B0 D7C6 JV +D7CB D7FB JT +F900 FAFF Ideographic +FB1D Hebrew_Letter +FB1E Combining_Mark +FB1F FB28 Hebrew_Letter +FB2A FB36 Hebrew_Letter +FB38 FB3C Hebrew_Letter +FB3E Hebrew_Letter +FB40 FB41 Hebrew_Letter +FB43 FB44 Hebrew_Letter +FB46 FB4F Hebrew_Letter +FD3E Close_Punctuation +FD3F Open_Punctuation +FDFC Postfix_Numeric +FE00 FE0F Combining_Mark +FE10 Infix_Numeric +FE11 FE12 Close_Punctuation +FE13 FE14 Infix_Numeric +FE15 FE16 Exclamation +FE17 Open_Punctuation +FE18 Close_Punctuation +FE19 Inseparable +FE20 FE2F Combining_Mark +FE30 FE34 Ideographic +FE35 Open_Punctuation +FE36 Close_Punctuation +FE37 Open_Punctuation +FE38 Close_Punctuation +FE39 Open_Punctuation +FE3A Close_Punctuation +FE3B Open_Punctuation +FE3C Close_Punctuation +FE3D Open_Punctuation +FE3E Close_Punctuation +FE3F Open_Punctuation +FE40 Close_Punctuation +FE41 Open_Punctuation +FE42 Close_Punctuation +FE43 Open_Punctuation +FE44 Close_Punctuation +FE45 FE46 Ideographic +FE47 Open_Punctuation +FE48 Close_Punctuation +FE49 FE4F Ideographic +FE50 Close_Punctuation +FE51 Ideographic +FE52 Close_Punctuation +FE54 FE55 Nonstarter +FE56 FE57 Exclamation +FE58 Ideographic +FE59 Open_Punctuation +FE5A Close_Punctuation +FE5B Open_Punctuation +FE5C Close_Punctuation +FE5D Open_Punctuation +FE5E Close_Punctuation +FE5F FE66 Ideographic +FE68 Ideographic +FE69 Prefix_Numeric +FE6A Postfix_Numeric +FE6B Ideographic +FEFF Word_Joiner +FF01 Exclamation +FF02 FF03 Ideographic +FF04 Prefix_Numeric +FF05 Postfix_Numeric +FF06 FF07 Ideographic +FF08 Open_Punctuation +FF09 Close_Punctuation +FF0A FF0B Ideographic +FF0C Close_Punctuation +FF0D Ideographic +FF0E Close_Punctuation +FF0F FF19 Ideographic +FF1A FF1B Nonstarter +FF1C FF1E Ideographic +FF1F Exclamation +FF20 FF3A Ideographic +FF3B Open_Punctuation +FF3C Ideographic +FF3D Close_Punctuation +FF3E FF5A Ideographic +FF5B Open_Punctuation +FF5C Ideographic +FF5D Close_Punctuation +FF5E Ideographic +FF5F Open_Punctuation +FF60 FF61 Close_Punctuation +FF62 Open_Punctuation +FF63 FF64 Close_Punctuation +FF65 Nonstarter +FF66 Ideographic +FF67 FF70 Nonstarter +FF71 FF9D Ideographic +FF9E FF9F Nonstarter +FFA0 FFBE Ideographic +FFC2 FFC7 Ideographic +FFCA FFCF Ideographic +FFD2 FFD7 Ideographic +FFDA FFDC Ideographic +FFE0 Postfix_Numeric +FFE1 Prefix_Numeric +FFE2 FFE4 Ideographic +FFE5 FFE6 Prefix_Numeric +FFF9 FFFB Combining_Mark +FFFC Contingent_Break +10100 10102 Break_After +101FD Combining_Mark +102E0 Combining_Mark +10376 1037A Combining_Mark +1039F Break_After +103D0 Break_After +104A0 104A9 Numeric +10857 Break_After +1091F Break_After +10A01 10A03 Combining_Mark +10A05 10A06 Combining_Mark +10A0C 10A0F Combining_Mark +10A38 10A3A Combining_Mark +10A3F Combining_Mark +10A50 10A57 Break_After +10AE5 10AE6 Combining_Mark +10AF0 10AF5 Break_After +10AF6 Inseparable +10B39 10B3F Break_After +11000 11002 Combining_Mark +11038 11046 Combining_Mark +11047 11048 Break_After +11066 1106F Numeric +1107F 11082 Combining_Mark +110B0 110BA Combining_Mark +110BE 110C1 Break_After +110F0 110F9 Numeric +11100 11102 Combining_Mark +11127 11134 Combining_Mark +11136 1113F Numeric +11140 11143 Break_After +11173 Combining_Mark +11175 Break_Before +11180 11182 Combining_Mark +111B3 111C0 Combining_Mark +111C5 111C6 Break_After +111C8 Break_After +111CA 111CC Combining_Mark +111D0 111D9 Numeric +111DB Break_Before +111DD 111DF Break_After +1122C 11237 Combining_Mark +11238 11239 Break_After +1123B 1123C Break_After +1123E Combining_Mark +112A9 Break_After +112DF 112EA Combining_Mark +112F0 112F9 Numeric +11300 11303 Combining_Mark +1133C Combining_Mark +1133E 11344 Combining_Mark +11347 11348 Combining_Mark +1134B 1134D Combining_Mark +11357 Combining_Mark +11362 11363 Combining_Mark +11366 1136C Combining_Mark +11370 11374 Combining_Mark +11435 11446 Combining_Mark +1144B 1144E Break_After +11450 11459 Numeric +1145B Break_After +114B0 114C3 Combining_Mark +114D0 114D9 Numeric +115AF 115B5 Combining_Mark +115B8 115C0 Combining_Mark +115C1 Break_Before +115C2 115C3 Break_After +115C4 115C5 Exclamation +115C9 115D7 Break_After +115DC 115DD Combining_Mark +11630 11640 Combining_Mark +11641 11642 Break_After +11650 11659 Numeric +11660 1166C Break_Before +116AB 116B7 Combining_Mark +116C0 116C9 Numeric +1171D 1172B Combining_Mark +11730 11739 Numeric +1173C 1173E Break_After +118E0 118E9 Numeric +11A01 11A0A Combining_Mark +11A33 11A39 Combining_Mark +11A3B 11A3E Combining_Mark +11A3F Break_Before +11A41 11A44 Break_After +11A45 Break_Before +11A47 Combining_Mark +11A51 11A5B Combining_Mark +11A8A 11A99 Combining_Mark +11A9A 11A9C Break_After +11A9E 11AA0 Break_Before +11AA1 11AA2 Break_After +11C2F 11C36 Combining_Mark +11C38 11C3F Combining_Mark +11C41 11C45 Break_After +11C50 11C59 Numeric +11C70 Break_Before +11C71 Exclamation +11C92 11CA7 Combining_Mark +11CA9 11CB6 Combining_Mark +11D31 11D36 Combining_Mark +11D3A Combining_Mark +11D3C 11D3D Combining_Mark +11D3F 11D45 Combining_Mark +11D47 Combining_Mark +11D50 11D59 Numeric +12470 12474 Break_After +13258 1325A Open_Punctuation +1325B 1325D Close_Punctuation +13282 Close_Punctuation +13286 Open_Punctuation +13287 Close_Punctuation +13288 Open_Punctuation +13289 Close_Punctuation +13379 Open_Punctuation +1337A 1337B Close_Punctuation +145CE Open_Punctuation +145CF Close_Punctuation +16A60 16A69 Numeric +16A6E 16A6F Break_After +16AF0 16AF4 Combining_Mark +16AF5 Break_After +16B30 16B36 Combining_Mark +16B37 16B39 Break_After +16B44 Break_After +16B50 16B59 Numeric +16F51 16F7E Combining_Mark +16F8F 16F92 Combining_Mark +16FE0 16FE1 Nonstarter +17000 187EC Ideographic +18800 18AF2 Ideographic +1B000 1B11E Ideographic +1B170 1B2FB Ideographic +1BC9D 1BC9E Combining_Mark +1BC9F Break_After +1BCA0 1BCA3 Combining_Mark +1D165 1D169 Combining_Mark +1D16D 1D182 Combining_Mark +1D185 1D18B Combining_Mark +1D1AA 1D1AD Combining_Mark +1D242 1D244 Combining_Mark +1D7CE 1D7FF Numeric +1DA00 1DA36 Combining_Mark +1DA3B 1DA6C Combining_Mark +1DA75 Combining_Mark +1DA84 Combining_Mark +1DA87 1DA8A Break_After +1DA9B 1DA9F Combining_Mark +1DAA1 1DAAF Combining_Mark +1E000 1E006 Combining_Mark +1E008 1E018 Combining_Mark +1E01B 1E021 Combining_Mark +1E023 1E024 Combining_Mark +1E026 1E02A Combining_Mark +1E8D0 1E8D6 Combining_Mark +1E944 1E94A Combining_Mark +1E950 1E959 Numeric +1E95E 1E95F Open_Punctuation +1F000 1F0FF Ideographic +1F10D 1F10F Ideographic +1F12F Ideographic +1F16C 1F16F Ideographic +1F1AD 1F1E5 Ideographic +1F1E6 1F1FF Regional_Indicator +1F200 1F384 Ideographic +1F385 E_Base +1F386 1F39B Ideographic +1F39E 1F3B4 Ideographic +1F3B7 1F3BB Ideographic +1F3BD 1F3C1 Ideographic +1F3C2 1F3C4 E_Base +1F3C5 1F3C6 Ideographic +1F3C7 E_Base +1F3C8 1F3C9 Ideographic +1F3CA 1F3CC E_Base +1F3CD 1F3FA Ideographic +1F3FB 1F3FF E_Modifier +1F400 1F441 Ideographic +1F442 1F443 E_Base +1F444 1F445 Ideographic +1F446 1F450 E_Base +1F451 1F465 Ideographic +1F466 1F469 E_Base +1F46A 1F46D Ideographic +1F46E E_Base +1F46F Ideographic +1F470 1F478 E_Base +1F479 1F47B Ideographic +1F47C E_Base +1F47D 1F480 Ideographic +1F481 1F483 E_Base +1F484 Ideographic +1F485 1F487 E_Base +1F488 1F49F Ideographic +1F4A1 Ideographic +1F4A3 Ideographic +1F4A5 1F4A9 Ideographic +1F4AA E_Base +1F4AB 1F4AE Ideographic +1F4B0 Ideographic +1F4B3 1F4FF Ideographic +1F507 1F516 Ideographic +1F525 1F531 Ideographic +1F54A 1F573 Ideographic +1F574 1F575 E_Base +1F576 1F579 Ideographic +1F57A E_Base +1F57B 1F58F Ideographic +1F590 E_Base +1F591 1F594 Ideographic +1F595 1F596 E_Base +1F597 1F5D3 Ideographic +1F5DC 1F5F3 Ideographic +1F5FA 1F644 Ideographic +1F645 1F647 E_Base +1F648 1F64A Ideographic +1F64B 1F64F E_Base +1F676 1F678 Quotation +1F679 1F67B Nonstarter +1F680 1F6A2 Ideographic +1F6A3 E_Base +1F6A4 1F6B3 Ideographic +1F6B4 1F6B6 E_Base +1F6B7 1F6BF Ideographic +1F6C0 E_Base +1F6C1 1F6CB Ideographic +1F6CC E_Base +1F6CD 1F6FF Ideographic +1F774 1F77F Ideographic +1F7D5 1F7FF Ideographic +1F80C 1F80F Ideographic +1F848 1F84F Ideographic +1F85A 1F85F Ideographic +1F888 1F88F Ideographic +1F8AE 1F8FF Ideographic +1F90C 1F917 Ideographic +1F918 1F91C E_Base +1F91D Ideographic +1F91E 1F91F E_Base +1F920 1F925 Ideographic +1F926 E_Base +1F927 1F92F Ideographic +1F930 1F939 E_Base +1F93A 1F93C Ideographic +1F93D 1F93E E_Base +1F93F 1F9D0 Ideographic +1F9D1 1F9DD E_Base +1F9DE 1FFFD Ideographic +20000 2FFFD Ideographic +30000 3FFFD Ideographic +E0001 Combining_Mark +E0020 E007F Combining_Mark +E0100 E01EF Combining_Mark +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('NFKC_Casefold') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNFKCCF'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToNFKCCF'}{'specials_name'} = 'utf8::ToSpecNFKCCF'; # Name of hash of special mappings +$utf8::SwashInfo{'ToNFKCCF'}{'missing'} = '<code point>'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecNFKCCF = ( +"\xC2\xA8" => "\x{0020}\x{0308}", # U+00A8 => 0020 0308 +"\xC2\xAD" => "", # U+00AD => +"\xC2\xAF" => "\x{0020}\x{0304}", # U+00AF => 0020 0304 +"\xC2\xB4" => "\x{0020}\x{0301}", # U+00B4 => 0020 0301 +"\xC2\xB8" => "\x{0020}\x{0327}", # U+00B8 => 0020 0327 +"\xC2\xBC" => "\x{0031}\x{2044}\x{0034}", # U+00BC => 0031 2044 0034 +"\xC2\xBD" => "\x{0031}\x{2044}\x{0032}", # U+00BD => 0031 2044 0032 +"\xC2\xBE" => "\x{0033}\x{2044}\x{0034}", # U+00BE => 0033 2044 0034 +"\xC3\x9F" => "\x{0073}\x{0073}", # U+00DF => 0073 0073 +"\xC4\xB0" => "\x{0069}\x{0307}", # U+0130 => 0069 0307 +"\xC4\xB2" => "\x{0069}\x{006A}", # U+0132 => 0069 006A +"\xC4\xB3" => "\x{0069}\x{006A}", # U+0133 => 0069 006A +"\xC4\xBF" => "\x{006C}\x{00B7}", # U+013F => 006C 00B7 +"\xC5\x80" => "\x{006C}\x{00B7}", # U+0140 => 006C 00B7 +"\xC5\x89" => "\x{02BC}\x{006E}", # U+0149 => 02BC 006E +"\xC7\x84" => "\x{0064}\x{017E}", # U+01C4 => 0064 017E +"\xC7\x85" => "\x{0064}\x{017E}", # U+01C5 => 0064 017E +"\xC7\x86" => "\x{0064}\x{017E}", # U+01C6 => 0064 017E +"\xC7\x87" => "\x{006C}\x{006A}", # U+01C7 => 006C 006A +"\xC7\x88" => "\x{006C}\x{006A}", # U+01C8 => 006C 006A +"\xC7\x89" => "\x{006C}\x{006A}", # U+01C9 => 006C 006A +"\xC7\x8A" => "\x{006E}\x{006A}", # U+01CA => 006E 006A +"\xC7\x8B" => "\x{006E}\x{006A}", # U+01CB => 006E 006A +"\xC7\x8C" => "\x{006E}\x{006A}", # U+01CC => 006E 006A +"\xC7\xB1" => "\x{0064}\x{007A}", # U+01F1 => 0064 007A +"\xC7\xB2" => "\x{0064}\x{007A}", # U+01F2 => 0064 007A +"\xC7\xB3" => "\x{0064}\x{007A}", # U+01F3 => 0064 007A +"\xCB\x98" => "\x{0020}\x{0306}", # U+02D8 => 0020 0306 +"\xCB\x99" => "\x{0020}\x{0307}", # U+02D9 => 0020 0307 +"\xCB\x9A" => "\x{0020}\x{030A}", # U+02DA => 0020 030A +"\xCB\x9B" => "\x{0020}\x{0328}", # U+02DB => 0020 0328 +"\xCB\x9C" => "\x{0020}\x{0303}", # U+02DC => 0020 0303 +"\xCB\x9D" => "\x{0020}\x{030B}", # U+02DD => 0020 030B +"\xCD\x84" => "\x{0308}\x{0301}", # U+0344 => 0308 0301 +"\xCD\x8F" => "", # U+034F => +"\xCD\xBA" => "\x{0020}\x{03B9}", # U+037A => 0020 03B9 +"\xCE\x84" => "\x{0020}\x{0301}", # U+0384 => 0020 0301 +"\xCE\x85" => "\x{0020}\x{0308}\x{0301}", # U+0385 => 0020 0308 0301 +"\xD6\x87" => "\x{0565}\x{0582}", # U+0587 => 0565 0582 +"\xD8\x9C" => "", # U+061C => +"\xD9\xB5" => "\x{0627}\x{0674}", # U+0675 => 0627 0674 +"\xD9\xB6" => "\x{0648}\x{0674}", # U+0676 => 0648 0674 +"\xD9\xB7" => "\x{06C7}\x{0674}", # U+0677 => 06C7 0674 +"\xD9\xB8" => "\x{064A}\x{0674}", # U+0678 => 064A 0674 +"\xE0\xA5\x98" => "\x{0915}\x{093C}", # U+0958 => 0915 093C +"\xE0\xA5\x99" => "\x{0916}\x{093C}", # U+0959 => 0916 093C +"\xE0\xA5\x9A" => "\x{0917}\x{093C}", # U+095A => 0917 093C +"\xE0\xA5\x9B" => "\x{091C}\x{093C}", # U+095B => 091C 093C +"\xE0\xA5\x9C" => "\x{0921}\x{093C}", # U+095C => 0921 093C +"\xE0\xA5\x9D" => "\x{0922}\x{093C}", # U+095D => 0922 093C +"\xE0\xA5\x9E" => "\x{092B}\x{093C}", # U+095E => 092B 093C +"\xE0\xA5\x9F" => "\x{092F}\x{093C}", # U+095F => 092F 093C +"\xE0\xA7\x9C" => "\x{09A1}\x{09BC}", # U+09DC => 09A1 09BC +"\xE0\xA7\x9D" => "\x{09A2}\x{09BC}", # U+09DD => 09A2 09BC +"\xE0\xA7\x9F" => "\x{09AF}\x{09BC}", # U+09DF => 09AF 09BC +"\xE0\xA8\xB3" => "\x{0A32}\x{0A3C}", # U+0A33 => 0A32 0A3C +"\xE0\xA8\xB6" => "\x{0A38}\x{0A3C}", # U+0A36 => 0A38 0A3C +"\xE0\xA9\x99" => "\x{0A16}\x{0A3C}", # U+0A59 => 0A16 0A3C +"\xE0\xA9\x9A" => "\x{0A17}\x{0A3C}", # U+0A5A => 0A17 0A3C +"\xE0\xA9\x9B" => "\x{0A1C}\x{0A3C}", # U+0A5B => 0A1C 0A3C +"\xE0\xA9\x9E" => "\x{0A2B}\x{0A3C}", # U+0A5E => 0A2B 0A3C +"\xE0\xAD\x9C" => "\x{0B21}\x{0B3C}", # U+0B5C => 0B21 0B3C +"\xE0\xAD\x9D" => "\x{0B22}\x{0B3C}", # U+0B5D => 0B22 0B3C +"\xE0\xB8\xB3" => "\x{0E4D}\x{0E32}", # U+0E33 => 0E4D 0E32 +"\xE0\xBA\xB3" => "\x{0ECD}\x{0EB2}", # U+0EB3 => 0ECD 0EB2 +"\xE0\xBB\x9C" => "\x{0EAB}\x{0E99}", # U+0EDC => 0EAB 0E99 +"\xE0\xBB\x9D" => "\x{0EAB}\x{0EA1}", # U+0EDD => 0EAB 0EA1 +"\xE0\xBD\x83" => "\x{0F42}\x{0FB7}", # U+0F43 => 0F42 0FB7 +"\xE0\xBD\x8D" => "\x{0F4C}\x{0FB7}", # U+0F4D => 0F4C 0FB7 +"\xE0\xBD\x92" => "\x{0F51}\x{0FB7}", # U+0F52 => 0F51 0FB7 +"\xE0\xBD\x97" => "\x{0F56}\x{0FB7}", # U+0F57 => 0F56 0FB7 +"\xE0\xBD\x9C" => "\x{0F5B}\x{0FB7}", # U+0F5C => 0F5B 0FB7 +"\xE0\xBD\xA9" => "\x{0F40}\x{0FB5}", # U+0F69 => 0F40 0FB5 +"\xE0\xBD\xB3" => "\x{0F71}\x{0F72}", # U+0F73 => 0F71 0F72 +"\xE0\xBD\xB5" => "\x{0F71}\x{0F74}", # U+0F75 => 0F71 0F74 +"\xE0\xBD\xB6" => "\x{0FB2}\x{0F80}", # U+0F76 => 0FB2 0F80 +"\xE0\xBD\xB7" => "\x{0FB2}\x{0F71}\x{0F80}", # U+0F77 => 0FB2 0F71 0F80 +"\xE0\xBD\xB8" => "\x{0FB3}\x{0F80}", # U+0F78 => 0FB3 0F80 +"\xE0\xBD\xB9" => "\x{0FB3}\x{0F71}\x{0F80}", # U+0F79 => 0FB3 0F71 0F80 +"\xE0\xBE\x81" => "\x{0F71}\x{0F80}", # U+0F81 => 0F71 0F80 +"\xE0\xBE\x93" => "\x{0F92}\x{0FB7}", # U+0F93 => 0F92 0FB7 +"\xE0\xBE\x9D" => "\x{0F9C}\x{0FB7}", # U+0F9D => 0F9C 0FB7 +"\xE0\xBE\xA2" => "\x{0FA1}\x{0FB7}", # U+0FA2 => 0FA1 0FB7 +"\xE0\xBE\xA7" => "\x{0FA6}\x{0FB7}", # U+0FA7 => 0FA6 0FB7 +"\xE0\xBE\xAC" => "\x{0FAB}\x{0FB7}", # U+0FAC => 0FAB 0FB7 +"\xE0\xBE\xB9" => "\x{0F90}\x{0FB5}", # U+0FB9 => 0F90 0FB5 +"\xE1\x85\x9F" => "", # U+115F => +"\xE1\x85\xA0" => "", # U+1160 => +"\xE1\x9E\xB4" => "", # U+17B4 => +"\xE1\x9E\xB5" => "", # U+17B5 => +"\xE1\xA0\x8B" => "", # U+180B => +"\xE1\xA0\x8C" => "", # U+180C => +"\xE1\xA0\x8D" => "", # U+180D => +"\xE1\xA0\x8E" => "", # U+180E => +"\xE1\xBA\x9A" => "\x{0061}\x{02BE}", # U+1E9A => 0061 02BE +"\xE1\xBA\x9E" => "\x{0073}\x{0073}", # U+1E9E => 0073 0073 +"\xE1\xBE\x80" => "\x{1F00}\x{03B9}", # U+1F80 => 1F00 03B9 +"\xE1\xBE\x81" => "\x{1F01}\x{03B9}", # U+1F81 => 1F01 03B9 +"\xE1\xBE\x82" => "\x{1F02}\x{03B9}", # U+1F82 => 1F02 03B9 +"\xE1\xBE\x83" => "\x{1F03}\x{03B9}", # U+1F83 => 1F03 03B9 +"\xE1\xBE\x84" => "\x{1F04}\x{03B9}", # U+1F84 => 1F04 03B9 +"\xE1\xBE\x85" => "\x{1F05}\x{03B9}", # U+1F85 => 1F05 03B9 +"\xE1\xBE\x86" => "\x{1F06}\x{03B9}", # U+1F86 => 1F06 03B9 +"\xE1\xBE\x87" => "\x{1F07}\x{03B9}", # U+1F87 => 1F07 03B9 +"\xE1\xBE\x88" => "\x{1F00}\x{03B9}", # U+1F88 => 1F00 03B9 +"\xE1\xBE\x89" => "\x{1F01}\x{03B9}", # U+1F89 => 1F01 03B9 +"\xE1\xBE\x8A" => "\x{1F02}\x{03B9}", # U+1F8A => 1F02 03B9 +"\xE1\xBE\x8B" => "\x{1F03}\x{03B9}", # U+1F8B => 1F03 03B9 +"\xE1\xBE\x8C" => "\x{1F04}\x{03B9}", # U+1F8C => 1F04 03B9 +"\xE1\xBE\x8D" => "\x{1F05}\x{03B9}", # U+1F8D => 1F05 03B9 +"\xE1\xBE\x8E" => "\x{1F06}\x{03B9}", # U+1F8E => 1F06 03B9 +"\xE1\xBE\x8F" => "\x{1F07}\x{03B9}", # U+1F8F => 1F07 03B9 +"\xE1\xBE\x90" => "\x{1F20}\x{03B9}", # U+1F90 => 1F20 03B9 +"\xE1\xBE\x91" => "\x{1F21}\x{03B9}", # U+1F91 => 1F21 03B9 +"\xE1\xBE\x92" => "\x{1F22}\x{03B9}", # U+1F92 => 1F22 03B9 +"\xE1\xBE\x93" => "\x{1F23}\x{03B9}", # U+1F93 => 1F23 03B9 +"\xE1\xBE\x94" => "\x{1F24}\x{03B9}", # U+1F94 => 1F24 03B9 +"\xE1\xBE\x95" => "\x{1F25}\x{03B9}", # U+1F95 => 1F25 03B9 +"\xE1\xBE\x96" => "\x{1F26}\x{03B9}", # U+1F96 => 1F26 03B9 +"\xE1\xBE\x97" => "\x{1F27}\x{03B9}", # U+1F97 => 1F27 03B9 +"\xE1\xBE\x98" => "\x{1F20}\x{03B9}", # U+1F98 => 1F20 03B9 +"\xE1\xBE\x99" => "\x{1F21}\x{03B9}", # U+1F99 => 1F21 03B9 +"\xE1\xBE\x9A" => "\x{1F22}\x{03B9}", # U+1F9A => 1F22 03B9 +"\xE1\xBE\x9B" => "\x{1F23}\x{03B9}", # U+1F9B => 1F23 03B9 +"\xE1\xBE\x9C" => "\x{1F24}\x{03B9}", # U+1F9C => 1F24 03B9 +"\xE1\xBE\x9D" => "\x{1F25}\x{03B9}", # U+1F9D => 1F25 03B9 +"\xE1\xBE\x9E" => "\x{1F26}\x{03B9}", # U+1F9E => 1F26 03B9 +"\xE1\xBE\x9F" => "\x{1F27}\x{03B9}", # U+1F9F => 1F27 03B9 +"\xE1\xBE\xA0" => "\x{1F60}\x{03B9}", # U+1FA0 => 1F60 03B9 +"\xE1\xBE\xA1" => "\x{1F61}\x{03B9}", # U+1FA1 => 1F61 03B9 +"\xE1\xBE\xA2" => "\x{1F62}\x{03B9}", # U+1FA2 => 1F62 03B9 +"\xE1\xBE\xA3" => "\x{1F63}\x{03B9}", # U+1FA3 => 1F63 03B9 +"\xE1\xBE\xA4" => "\x{1F64}\x{03B9}", # U+1FA4 => 1F64 03B9 +"\xE1\xBE\xA5" => "\x{1F65}\x{03B9}", # U+1FA5 => 1F65 03B9 +"\xE1\xBE\xA6" => "\x{1F66}\x{03B9}", # U+1FA6 => 1F66 03B9 +"\xE1\xBE\xA7" => "\x{1F67}\x{03B9}", # U+1FA7 => 1F67 03B9 +"\xE1\xBE\xA8" => "\x{1F60}\x{03B9}", # U+1FA8 => 1F60 03B9 +"\xE1\xBE\xA9" => "\x{1F61}\x{03B9}", # U+1FA9 => 1F61 03B9 +"\xE1\xBE\xAA" => "\x{1F62}\x{03B9}", # U+1FAA => 1F62 03B9 +"\xE1\xBE\xAB" => "\x{1F63}\x{03B9}", # U+1FAB => 1F63 03B9 +"\xE1\xBE\xAC" => "\x{1F64}\x{03B9}", # U+1FAC => 1F64 03B9 +"\xE1\xBE\xAD" => "\x{1F65}\x{03B9}", # U+1FAD => 1F65 03B9 +"\xE1\xBE\xAE" => "\x{1F66}\x{03B9}", # U+1FAE => 1F66 03B9 +"\xE1\xBE\xAF" => "\x{1F67}\x{03B9}", # U+1FAF => 1F67 03B9 +"\xE1\xBE\xB2" => "\x{1F70}\x{03B9}", # U+1FB2 => 1F70 03B9 +"\xE1\xBE\xB3" => "\x{03B1}\x{03B9}", # U+1FB3 => 03B1 03B9 +"\xE1\xBE\xB4" => "\x{03AC}\x{03B9}", # U+1FB4 => 03AC 03B9 +"\xE1\xBE\xB7" => "\x{1FB6}\x{03B9}", # U+1FB7 => 1FB6 03B9 +"\xE1\xBE\xBC" => "\x{03B1}\x{03B9}", # U+1FBC => 03B1 03B9 +"\xE1\xBE\xBD" => "\x{0020}\x{0313}", # U+1FBD => 0020 0313 +"\xE1\xBE\xBF" => "\x{0020}\x{0313}", # U+1FBF => 0020 0313 +"\xE1\xBF\x80" => "\x{0020}\x{0342}", # U+1FC0 => 0020 0342 +"\xE1\xBF\x81" => "\x{0020}\x{0308}\x{0342}", # U+1FC1 => 0020 0308 0342 +"\xE1\xBF\x82" => "\x{1F74}\x{03B9}", # U+1FC2 => 1F74 03B9 +"\xE1\xBF\x83" => "\x{03B7}\x{03B9}", # U+1FC3 => 03B7 03B9 +"\xE1\xBF\x84" => "\x{03AE}\x{03B9}", # U+1FC4 => 03AE 03B9 +"\xE1\xBF\x87" => "\x{1FC6}\x{03B9}", # U+1FC7 => 1FC6 03B9 +"\xE1\xBF\x8C" => "\x{03B7}\x{03B9}", # U+1FCC => 03B7 03B9 +"\xE1\xBF\x8D" => "\x{0020}\x{0313}\x{0300}", # U+1FCD => 0020 0313 0300 +"\xE1\xBF\x8E" => "\x{0020}\x{0313}\x{0301}", # U+1FCE => 0020 0313 0301 +"\xE1\xBF\x8F" => "\x{0020}\x{0313}\x{0342}", # U+1FCF => 0020 0313 0342 +"\xE1\xBF\x9D" => "\x{0020}\x{0314}\x{0300}", # U+1FDD => 0020 0314 0300 +"\xE1\xBF\x9E" => "\x{0020}\x{0314}\x{0301}", # U+1FDE => 0020 0314 0301 +"\xE1\xBF\x9F" => "\x{0020}\x{0314}\x{0342}", # U+1FDF => 0020 0314 0342 +"\xE1\xBF\xAD" => "\x{0020}\x{0308}\x{0300}", # U+1FED => 0020 0308 0300 +"\xE1\xBF\xAE" => "\x{0020}\x{0308}\x{0301}", # U+1FEE => 0020 0308 0301 +"\xE1\xBF\xB2" => "\x{1F7C}\x{03B9}", # U+1FF2 => 1F7C 03B9 +"\xE1\xBF\xB3" => "\x{03C9}\x{03B9}", # U+1FF3 => 03C9 03B9 +"\xE1\xBF\xB4" => "\x{03CE}\x{03B9}", # U+1FF4 => 03CE 03B9 +"\xE1\xBF\xB7" => "\x{1FF6}\x{03B9}", # U+1FF7 => 1FF6 03B9 +"\xE1\xBF\xBC" => "\x{03C9}\x{03B9}", # U+1FFC => 03C9 03B9 +"\xE1\xBF\xBD" => "\x{0020}\x{0301}", # U+1FFD => 0020 0301 +"\xE1\xBF\xBE" => "\x{0020}\x{0314}", # U+1FFE => 0020 0314 +"\xE2\x80\x8B" => "", # U+200B => +"\xE2\x80\x8C" => "", # U+200C => +"\xE2\x80\x8D" => "", # U+200D => +"\xE2\x80\x8E" => "", # U+200E => +"\xE2\x80\x8F" => "", # U+200F => +"\xE2\x80\x97" => "\x{0020}\x{0333}", # U+2017 => 0020 0333 +"\xE2\x80\xA5" => "\x{002E}\x{002E}", # U+2025 => 002E 002E +"\xE2\x80\xA6" => "\x{002E}\x{002E}\x{002E}", # U+2026 => 002E 002E 002E +"\xE2\x80\xAA" => "", # U+202A => +"\xE2\x80\xAB" => "", # U+202B => +"\xE2\x80\xAC" => "", # U+202C => +"\xE2\x80\xAD" => "", # U+202D => +"\xE2\x80\xAE" => "", # U+202E => +"\xE2\x80\xB3" => "\x{2032}\x{2032}", # U+2033 => 2032 2032 +"\xE2\x80\xB4" => "\x{2032}\x{2032}\x{2032}", # U+2034 => 2032 2032 2032 +"\xE2\x80\xB6" => "\x{2035}\x{2035}", # U+2036 => 2035 2035 +"\xE2\x80\xB7" => "\x{2035}\x{2035}\x{2035}", # U+2037 => 2035 2035 2035 +"\xE2\x80\xBC" => "\x{0021}\x{0021}", # U+203C => 0021 0021 +"\xE2\x80\xBE" => "\x{0020}\x{0305}", # U+203E => 0020 0305 +"\xE2\x81\x87" => "\x{003F}\x{003F}", # U+2047 => 003F 003F +"\xE2\x81\x88" => "\x{003F}\x{0021}", # U+2048 => 003F 0021 +"\xE2\x81\x89" => "\x{0021}\x{003F}", # U+2049 => 0021 003F +"\xE2\x81\x97" => "\x{2032}\x{2032}\x{2032}\x{2032}", # U+2057 => 2032 2032 2032 2032 +"\xE2\x81\xA0" => "", # U+2060 => +"\xE2\x81\xA1" => "", # U+2061 => +"\xE2\x81\xA2" => "", # U+2062 => +"\xE2\x81\xA3" => "", # U+2063 => +"\xE2\x81\xA4" => "", # U+2064 => +"\xE2\x81\xA5" => "", # U+2065 => +"\xE2\x81\xA6" => "", # U+2066 => +"\xE2\x81\xA7" => "", # U+2067 => +"\xE2\x81\xA8" => "", # U+2068 => +"\xE2\x81\xA9" => "", # U+2069 => +"\xE2\x81\xAA" => "", # U+206A => +"\xE2\x81\xAB" => "", # U+206B => +"\xE2\x81\xAC" => "", # U+206C => +"\xE2\x81\xAD" => "", # U+206D => +"\xE2\x81\xAE" => "", # U+206E => +"\xE2\x81\xAF" => "", # U+206F => +"\xE2\x82\xA8" => "\x{0072}\x{0073}", # U+20A8 => 0072 0073 +"\xE2\x84\x80" => "\x{0061}\x{002F}\x{0063}", # U+2100 => 0061 002F 0063 +"\xE2\x84\x81" => "\x{0061}\x{002F}\x{0073}", # U+2101 => 0061 002F 0073 +"\xE2\x84\x83" => "\x{00B0}\x{0063}", # U+2103 => 00B0 0063 +"\xE2\x84\x85" => "\x{0063}\x{002F}\x{006F}", # U+2105 => 0063 002F 006F +"\xE2\x84\x86" => "\x{0063}\x{002F}\x{0075}", # U+2106 => 0063 002F 0075 +"\xE2\x84\x89" => "\x{00B0}\x{0066}", # U+2109 => 00B0 0066 +"\xE2\x84\x96" => "\x{006E}\x{006F}", # U+2116 => 006E 006F +"\xE2\x84\xA0" => "\x{0073}\x{006D}", # U+2120 => 0073 006D +"\xE2\x84\xA1" => "\x{0074}\x{0065}\x{006C}", # U+2121 => 0074 0065 006C +"\xE2\x84\xA2" => "\x{0074}\x{006D}", # U+2122 => 0074 006D +"\xE2\x84\xBB" => "\x{0066}\x{0061}\x{0078}", # U+213B => 0066 0061 0078 +"\xE2\x85\x90" => "\x{0031}\x{2044}\x{0037}", # U+2150 => 0031 2044 0037 +"\xE2\x85\x91" => "\x{0031}\x{2044}\x{0039}", # U+2151 => 0031 2044 0039 +"\xE2\x85\x92" => "\x{0031}\x{2044}\x{0031}\x{0030}", # U+2152 => 0031 2044 0031 0030 +"\xE2\x85\x93" => "\x{0031}\x{2044}\x{0033}", # U+2153 => 0031 2044 0033 +"\xE2\x85\x94" => "\x{0032}\x{2044}\x{0033}", # U+2154 => 0032 2044 0033 +"\xE2\x85\x95" => "\x{0031}\x{2044}\x{0035}", # U+2155 => 0031 2044 0035 +"\xE2\x85\x96" => "\x{0032}\x{2044}\x{0035}", # U+2156 => 0032 2044 0035 +"\xE2\x85\x97" => "\x{0033}\x{2044}\x{0035}", # U+2157 => 0033 2044 0035 +"\xE2\x85\x98" => "\x{0034}\x{2044}\x{0035}", # U+2158 => 0034 2044 0035 +"\xE2\x85\x99" => "\x{0031}\x{2044}\x{0036}", # U+2159 => 0031 2044 0036 +"\xE2\x85\x9A" => "\x{0035}\x{2044}\x{0036}", # U+215A => 0035 2044 0036 +"\xE2\x85\x9B" => "\x{0031}\x{2044}\x{0038}", # U+215B => 0031 2044 0038 +"\xE2\x85\x9C" => "\x{0033}\x{2044}\x{0038}", # U+215C => 0033 2044 0038 +"\xE2\x85\x9D" => "\x{0035}\x{2044}\x{0038}", # U+215D => 0035 2044 0038 +"\xE2\x85\x9E" => "\x{0037}\x{2044}\x{0038}", # U+215E => 0037 2044 0038 +"\xE2\x85\x9F" => "\x{0031}\x{2044}", # U+215F => 0031 2044 +"\xE2\x85\xA1" => "\x{0069}\x{0069}", # U+2161 => 0069 0069 +"\xE2\x85\xA2" => "\x{0069}\x{0069}\x{0069}", # U+2162 => 0069 0069 0069 +"\xE2\x85\xA3" => "\x{0069}\x{0076}", # U+2163 => 0069 0076 +"\xE2\x85\xA5" => "\x{0076}\x{0069}", # U+2165 => 0076 0069 +"\xE2\x85\xA6" => "\x{0076}\x{0069}\x{0069}", # U+2166 => 0076 0069 0069 +"\xE2\x85\xA7" => "\x{0076}\x{0069}\x{0069}\x{0069}", # U+2167 => 0076 0069 0069 0069 +"\xE2\x85\xA8" => "\x{0069}\x{0078}", # U+2168 => 0069 0078 +"\xE2\x85\xAA" => "\x{0078}\x{0069}", # U+216A => 0078 0069 +"\xE2\x85\xAB" => "\x{0078}\x{0069}\x{0069}", # U+216B => 0078 0069 0069 +"\xE2\x85\xB1" => "\x{0069}\x{0069}", # U+2171 => 0069 0069 +"\xE2\x85\xB2" => "\x{0069}\x{0069}\x{0069}", # U+2172 => 0069 0069 0069 +"\xE2\x85\xB3" => "\x{0069}\x{0076}", # U+2173 => 0069 0076 +"\xE2\x85\xB5" => "\x{0076}\x{0069}", # U+2175 => 0076 0069 +"\xE2\x85\xB6" => "\x{0076}\x{0069}\x{0069}", # U+2176 => 0076 0069 0069 +"\xE2\x85\xB7" => "\x{0076}\x{0069}\x{0069}\x{0069}", # U+2177 => 0076 0069 0069 0069 +"\xE2\x85\xB8" => "\x{0069}\x{0078}", # U+2178 => 0069 0078 +"\xE2\x85\xBA" => "\x{0078}\x{0069}", # U+217A => 0078 0069 +"\xE2\x85\xBB" => "\x{0078}\x{0069}\x{0069}", # U+217B => 0078 0069 0069 +"\xE2\x86\x89" => "\x{0030}\x{2044}\x{0033}", # U+2189 => 0030 2044 0033 +"\xE2\x88\xAC" => "\x{222B}\x{222B}", # U+222C => 222B 222B +"\xE2\x88\xAD" => "\x{222B}\x{222B}\x{222B}", # U+222D => 222B 222B 222B +"\xE2\x88\xAF" => "\x{222E}\x{222E}", # U+222F => 222E 222E +"\xE2\x88\xB0" => "\x{222E}\x{222E}\x{222E}", # U+2230 => 222E 222E 222E +"\xE2\x91\xA9" => "\x{0031}\x{0030}", # U+2469 => 0031 0030 +"\xE2\x91\xAA" => "\x{0031}\x{0031}", # U+246A => 0031 0031 +"\xE2\x91\xAB" => "\x{0031}\x{0032}", # U+246B => 0031 0032 +"\xE2\x91\xAC" => "\x{0031}\x{0033}", # U+246C => 0031 0033 +"\xE2\x91\xAD" => "\x{0031}\x{0034}", # U+246D => 0031 0034 +"\xE2\x91\xAE" => "\x{0031}\x{0035}", # U+246E => 0031 0035 +"\xE2\x91\xAF" => "\x{0031}\x{0036}", # U+246F => 0031 0036 +"\xE2\x91\xB0" => "\x{0031}\x{0037}", # U+2470 => 0031 0037 +"\xE2\x91\xB1" => "\x{0031}\x{0038}", # U+2471 => 0031 0038 +"\xE2\x91\xB2" => "\x{0031}\x{0039}", # U+2472 => 0031 0039 +"\xE2\x91\xB3" => "\x{0032}\x{0030}", # U+2473 => 0032 0030 +"\xE2\x91\xB4" => "\x{0028}\x{0031}\x{0029}", # U+2474 => 0028 0031 0029 +"\xE2\x91\xB5" => "\x{0028}\x{0032}\x{0029}", # U+2475 => 0028 0032 0029 +"\xE2\x91\xB6" => "\x{0028}\x{0033}\x{0029}", # U+2476 => 0028 0033 0029 +"\xE2\x91\xB7" => "\x{0028}\x{0034}\x{0029}", # U+2477 => 0028 0034 0029 +"\xE2\x91\xB8" => "\x{0028}\x{0035}\x{0029}", # U+2478 => 0028 0035 0029 +"\xE2\x91\xB9" => "\x{0028}\x{0036}\x{0029}", # U+2479 => 0028 0036 0029 +"\xE2\x91\xBA" => "\x{0028}\x{0037}\x{0029}", # U+247A => 0028 0037 0029 +"\xE2\x91\xBB" => "\x{0028}\x{0038}\x{0029}", # U+247B => 0028 0038 0029 +"\xE2\x91\xBC" => "\x{0028}\x{0039}\x{0029}", # U+247C => 0028 0039 0029 +"\xE2\x91\xBD" => "\x{0028}\x{0031}\x{0030}\x{0029}", # U+247D => 0028 0031 0030 0029 +"\xE2\x91\xBE" => "\x{0028}\x{0031}\x{0031}\x{0029}", # U+247E => 0028 0031 0031 0029 +"\xE2\x91\xBF" => "\x{0028}\x{0031}\x{0032}\x{0029}", # U+247F => 0028 0031 0032 0029 +"\xE2\x92\x80" => "\x{0028}\x{0031}\x{0033}\x{0029}", # U+2480 => 0028 0031 0033 0029 +"\xE2\x92\x81" => "\x{0028}\x{0031}\x{0034}\x{0029}", # U+2481 => 0028 0031 0034 0029 +"\xE2\x92\x82" => "\x{0028}\x{0031}\x{0035}\x{0029}", # U+2482 => 0028 0031 0035 0029 +"\xE2\x92\x83" => "\x{0028}\x{0031}\x{0036}\x{0029}", # U+2483 => 0028 0031 0036 0029 +"\xE2\x92\x84" => "\x{0028}\x{0031}\x{0037}\x{0029}", # U+2484 => 0028 0031 0037 0029 +"\xE2\x92\x85" => "\x{0028}\x{0031}\x{0038}\x{0029}", # U+2485 => 0028 0031 0038 0029 +"\xE2\x92\x86" => "\x{0028}\x{0031}\x{0039}\x{0029}", # U+2486 => 0028 0031 0039 0029 +"\xE2\x92\x87" => "\x{0028}\x{0032}\x{0030}\x{0029}", # U+2487 => 0028 0032 0030 0029 +"\xE2\x92\x88" => "\x{0031}\x{002E}", # U+2488 => 0031 002E +"\xE2\x92\x89" => "\x{0032}\x{002E}", # U+2489 => 0032 002E +"\xE2\x92\x8A" => "\x{0033}\x{002E}", # U+248A => 0033 002E +"\xE2\x92\x8B" => "\x{0034}\x{002E}", # U+248B => 0034 002E +"\xE2\x92\x8C" => "\x{0035}\x{002E}", # U+248C => 0035 002E +"\xE2\x92\x8D" => "\x{0036}\x{002E}", # U+248D => 0036 002E +"\xE2\x92\x8E" => "\x{0037}\x{002E}", # U+248E => 0037 002E +"\xE2\x92\x8F" => "\x{0038}\x{002E}", # U+248F => 0038 002E +"\xE2\x92\x90" => "\x{0039}\x{002E}", # U+2490 => 0039 002E +"\xE2\x92\x91" => "\x{0031}\x{0030}\x{002E}", # U+2491 => 0031 0030 002E +"\xE2\x92\x92" => "\x{0031}\x{0031}\x{002E}", # U+2492 => 0031 0031 002E +"\xE2\x92\x93" => "\x{0031}\x{0032}\x{002E}", # U+2493 => 0031 0032 002E +"\xE2\x92\x94" => "\x{0031}\x{0033}\x{002E}", # U+2494 => 0031 0033 002E +"\xE2\x92\x95" => "\x{0031}\x{0034}\x{002E}", # U+2495 => 0031 0034 002E +"\xE2\x92\x96" => "\x{0031}\x{0035}\x{002E}", # U+2496 => 0031 0035 002E +"\xE2\x92\x97" => "\x{0031}\x{0036}\x{002E}", # U+2497 => 0031 0036 002E +"\xE2\x92\x98" => "\x{0031}\x{0037}\x{002E}", # U+2498 => 0031 0037 002E +"\xE2\x92\x99" => "\x{0031}\x{0038}\x{002E}", # U+2499 => 0031 0038 002E +"\xE2\x92\x9A" => "\x{0031}\x{0039}\x{002E}", # U+249A => 0031 0039 002E +"\xE2\x92\x9B" => "\x{0032}\x{0030}\x{002E}", # U+249B => 0032 0030 002E +"\xE2\x92\x9C" => "\x{0028}\x{0061}\x{0029}", # U+249C => 0028 0061 0029 +"\xE2\x92\x9D" => "\x{0028}\x{0062}\x{0029}", # U+249D => 0028 0062 0029 +"\xE2\x92\x9E" => "\x{0028}\x{0063}\x{0029}", # U+249E => 0028 0063 0029 +"\xE2\x92\x9F" => "\x{0028}\x{0064}\x{0029}", # U+249F => 0028 0064 0029 +"\xE2\x92\xA0" => "\x{0028}\x{0065}\x{0029}", # U+24A0 => 0028 0065 0029 +"\xE2\x92\xA1" => "\x{0028}\x{0066}\x{0029}", # U+24A1 => 0028 0066 0029 +"\xE2\x92\xA2" => "\x{0028}\x{0067}\x{0029}", # U+24A2 => 0028 0067 0029 +"\xE2\x92\xA3" => "\x{0028}\x{0068}\x{0029}", # U+24A3 => 0028 0068 0029 +"\xE2\x92\xA4" => "\x{0028}\x{0069}\x{0029}", # U+24A4 => 0028 0069 0029 +"\xE2\x92\xA5" => "\x{0028}\x{006A}\x{0029}", # U+24A5 => 0028 006A 0029 +"\xE2\x92\xA6" => "\x{0028}\x{006B}\x{0029}", # U+24A6 => 0028 006B 0029 +"\xE2\x92\xA7" => "\x{0028}\x{006C}\x{0029}", # U+24A7 => 0028 006C 0029 +"\xE2\x92\xA8" => "\x{0028}\x{006D}\x{0029}", # U+24A8 => 0028 006D 0029 +"\xE2\x92\xA9" => "\x{0028}\x{006E}\x{0029}", # U+24A9 => 0028 006E 0029 +"\xE2\x92\xAA" => "\x{0028}\x{006F}\x{0029}", # U+24AA => 0028 006F 0029 +"\xE2\x92\xAB" => "\x{0028}\x{0070}\x{0029}", # U+24AB => 0028 0070 0029 +"\xE2\x92\xAC" => "\x{0028}\x{0071}\x{0029}", # U+24AC => 0028 0071 0029 +"\xE2\x92\xAD" => "\x{0028}\x{0072}\x{0029}", # U+24AD => 0028 0072 0029 +"\xE2\x92\xAE" => "\x{0028}\x{0073}\x{0029}", # U+24AE => 0028 0073 0029 +"\xE2\x92\xAF" => "\x{0028}\x{0074}\x{0029}", # U+24AF => 0028 0074 0029 +"\xE2\x92\xB0" => "\x{0028}\x{0075}\x{0029}", # U+24B0 => 0028 0075 0029 +"\xE2\x92\xB1" => "\x{0028}\x{0076}\x{0029}", # U+24B1 => 0028 0076 0029 +"\xE2\x92\xB2" => "\x{0028}\x{0077}\x{0029}", # U+24B2 => 0028 0077 0029 +"\xE2\x92\xB3" => "\x{0028}\x{0078}\x{0029}", # U+24B3 => 0028 0078 0029 +"\xE2\x92\xB4" => "\x{0028}\x{0079}\x{0029}", # U+24B4 => 0028 0079 0029 +"\xE2\x92\xB5" => "\x{0028}\x{007A}\x{0029}", # U+24B5 => 0028 007A 0029 +"\xE2\xA8\x8C" => "\x{222B}\x{222B}\x{222B}\x{222B}", # U+2A0C => 222B 222B 222B 222B +"\xE2\xA9\xB4" => "\x{003A}\x{003A}\x{003D}", # U+2A74 => 003A 003A 003D +"\xE2\xA9\xB5" => "\x{003D}\x{003D}", # U+2A75 => 003D 003D +"\xE2\xA9\xB6" => "\x{003D}\x{003D}\x{003D}", # U+2A76 => 003D 003D 003D +"\xE2\xAB\x9C" => "\x{2ADD}\x{0338}", # U+2ADC => 2ADD 0338 +"\xE3\x82\x9B" => "\x{0020}\x{3099}", # U+309B => 0020 3099 +"\xE3\x82\x9C" => "\x{0020}\x{309A}", # U+309C => 0020 309A +"\xE3\x82\x9F" => "\x{3088}\x{308A}", # U+309F => 3088 308A +"\xE3\x83\xBF" => "\x{30B3}\x{30C8}", # U+30FF => 30B3 30C8 +"\xE3\x85\xA4" => "", # U+3164 => +"\xE3\x88\x80" => "\x{0028}\x{1100}\x{0029}", # U+3200 => 0028 1100 0029 +"\xE3\x88\x81" => "\x{0028}\x{1102}\x{0029}", # U+3201 => 0028 1102 0029 +"\xE3\x88\x82" => "\x{0028}\x{1103}\x{0029}", # U+3202 => 0028 1103 0029 +"\xE3\x88\x83" => "\x{0028}\x{1105}\x{0029}", # U+3203 => 0028 1105 0029 +"\xE3\x88\x84" => "\x{0028}\x{1106}\x{0029}", # U+3204 => 0028 1106 0029 +"\xE3\x88\x85" => "\x{0028}\x{1107}\x{0029}", # U+3205 => 0028 1107 0029 +"\xE3\x88\x86" => "\x{0028}\x{1109}\x{0029}", # U+3206 => 0028 1109 0029 +"\xE3\x88\x87" => "\x{0028}\x{110B}\x{0029}", # U+3207 => 0028 110B 0029 +"\xE3\x88\x88" => "\x{0028}\x{110C}\x{0029}", # U+3208 => 0028 110C 0029 +"\xE3\x88\x89" => "\x{0028}\x{110E}\x{0029}", # U+3209 => 0028 110E 0029 +"\xE3\x88\x8A" => "\x{0028}\x{110F}\x{0029}", # U+320A => 0028 110F 0029 +"\xE3\x88\x8B" => "\x{0028}\x{1110}\x{0029}", # U+320B => 0028 1110 0029 +"\xE3\x88\x8C" => "\x{0028}\x{1111}\x{0029}", # U+320C => 0028 1111 0029 +"\xE3\x88\x8D" => "\x{0028}\x{1112}\x{0029}", # U+320D => 0028 1112 0029 +"\xE3\x88\x8E" => "\x{0028}\x{AC00}\x{0029}", # U+320E => 0028 AC00 0029 +"\xE3\x88\x8F" => "\x{0028}\x{B098}\x{0029}", # U+320F => 0028 B098 0029 +"\xE3\x88\x90" => "\x{0028}\x{B2E4}\x{0029}", # U+3210 => 0028 B2E4 0029 +"\xE3\x88\x91" => "\x{0028}\x{B77C}\x{0029}", # U+3211 => 0028 B77C 0029 +"\xE3\x88\x92" => "\x{0028}\x{B9C8}\x{0029}", # U+3212 => 0028 B9C8 0029 +"\xE3\x88\x93" => "\x{0028}\x{BC14}\x{0029}", # U+3213 => 0028 BC14 0029 +"\xE3\x88\x94" => "\x{0028}\x{C0AC}\x{0029}", # U+3214 => 0028 C0AC 0029 +"\xE3\x88\x95" => "\x{0028}\x{C544}\x{0029}", # U+3215 => 0028 C544 0029 +"\xE3\x88\x96" => "\x{0028}\x{C790}\x{0029}", # U+3216 => 0028 C790 0029 +"\xE3\x88\x97" => "\x{0028}\x{CC28}\x{0029}", # U+3217 => 0028 CC28 0029 +"\xE3\x88\x98" => "\x{0028}\x{CE74}\x{0029}", # U+3218 => 0028 CE74 0029 +"\xE3\x88\x99" => "\x{0028}\x{D0C0}\x{0029}", # U+3219 => 0028 D0C0 0029 +"\xE3\x88\x9A" => "\x{0028}\x{D30C}\x{0029}", # U+321A => 0028 D30C 0029 +"\xE3\x88\x9B" => "\x{0028}\x{D558}\x{0029}", # U+321B => 0028 D558 0029 +"\xE3\x88\x9C" => "\x{0028}\x{C8FC}\x{0029}", # U+321C => 0028 C8FC 0029 +"\xE3\x88\x9D" => "\x{0028}\x{C624}\x{C804}\x{0029}", # U+321D => 0028 C624 C804 0029 +"\xE3\x88\x9E" => "\x{0028}\x{C624}\x{D6C4}\x{0029}", # U+321E => 0028 C624 D6C4 0029 +"\xE3\x88\xA0" => "\x{0028}\x{4E00}\x{0029}", # U+3220 => 0028 4E00 0029 +"\xE3\x88\xA1" => "\x{0028}\x{4E8C}\x{0029}", # U+3221 => 0028 4E8C 0029 +"\xE3\x88\xA2" => "\x{0028}\x{4E09}\x{0029}", # U+3222 => 0028 4E09 0029 +"\xE3\x88\xA3" => "\x{0028}\x{56DB}\x{0029}", # U+3223 => 0028 56DB 0029 +"\xE3\x88\xA4" => "\x{0028}\x{4E94}\x{0029}", # U+3224 => 0028 4E94 0029 +"\xE3\x88\xA5" => "\x{0028}\x{516D}\x{0029}", # U+3225 => 0028 516D 0029 +"\xE3\x88\xA6" => "\x{0028}\x{4E03}\x{0029}", # U+3226 => 0028 4E03 0029 +"\xE3\x88\xA7" => "\x{0028}\x{516B}\x{0029}", # U+3227 => 0028 516B 0029 +"\xE3\x88\xA8" => "\x{0028}\x{4E5D}\x{0029}", # U+3228 => 0028 4E5D 0029 +"\xE3\x88\xA9" => "\x{0028}\x{5341}\x{0029}", # U+3229 => 0028 5341 0029 +"\xE3\x88\xAA" => "\x{0028}\x{6708}\x{0029}", # U+322A => 0028 6708 0029 +"\xE3\x88\xAB" => "\x{0028}\x{706B}\x{0029}", # U+322B => 0028 706B 0029 +"\xE3\x88\xAC" => "\x{0028}\x{6C34}\x{0029}", # U+322C => 0028 6C34 0029 +"\xE3\x88\xAD" => "\x{0028}\x{6728}\x{0029}", # U+322D => 0028 6728 0029 +"\xE3\x88\xAE" => "\x{0028}\x{91D1}\x{0029}", # U+322E => 0028 91D1 0029 +"\xE3\x88\xAF" => "\x{0028}\x{571F}\x{0029}", # U+322F => 0028 571F 0029 +"\xE3\x88\xB0" => "\x{0028}\x{65E5}\x{0029}", # U+3230 => 0028 65E5 0029 +"\xE3\x88\xB1" => "\x{0028}\x{682A}\x{0029}", # U+3231 => 0028 682A 0029 +"\xE3\x88\xB2" => "\x{0028}\x{6709}\x{0029}", # U+3232 => 0028 6709 0029 +"\xE3\x88\xB3" => "\x{0028}\x{793E}\x{0029}", # U+3233 => 0028 793E 0029 +"\xE3\x88\xB4" => "\x{0028}\x{540D}\x{0029}", # U+3234 => 0028 540D 0029 +"\xE3\x88\xB5" => "\x{0028}\x{7279}\x{0029}", # U+3235 => 0028 7279 0029 +"\xE3\x88\xB6" => "\x{0028}\x{8CA1}\x{0029}", # U+3236 => 0028 8CA1 0029 +"\xE3\x88\xB7" => "\x{0028}\x{795D}\x{0029}", # U+3237 => 0028 795D 0029 +"\xE3\x88\xB8" => "\x{0028}\x{52B4}\x{0029}", # U+3238 => 0028 52B4 0029 +"\xE3\x88\xB9" => "\x{0028}\x{4EE3}\x{0029}", # U+3239 => 0028 4EE3 0029 +"\xE3\x88\xBA" => "\x{0028}\x{547C}\x{0029}", # U+323A => 0028 547C 0029 +"\xE3\x88\xBB" => "\x{0028}\x{5B66}\x{0029}", # U+323B => 0028 5B66 0029 +"\xE3\x88\xBC" => "\x{0028}\x{76E3}\x{0029}", # U+323C => 0028 76E3 0029 +"\xE3\x88\xBD" => "\x{0028}\x{4F01}\x{0029}", # U+323D => 0028 4F01 0029 +"\xE3\x88\xBE" => "\x{0028}\x{8CC7}\x{0029}", # U+323E => 0028 8CC7 0029 +"\xE3\x88\xBF" => "\x{0028}\x{5354}\x{0029}", # U+323F => 0028 5354 0029 +"\xE3\x89\x80" => "\x{0028}\x{796D}\x{0029}", # U+3240 => 0028 796D 0029 +"\xE3\x89\x81" => "\x{0028}\x{4F11}\x{0029}", # U+3241 => 0028 4F11 0029 +"\xE3\x89\x82" => "\x{0028}\x{81EA}\x{0029}", # U+3242 => 0028 81EA 0029 +"\xE3\x89\x83" => "\x{0028}\x{81F3}\x{0029}", # U+3243 => 0028 81F3 0029 +"\xE3\x89\x90" => "\x{0070}\x{0074}\x{0065}", # U+3250 => 0070 0074 0065 +"\xE3\x89\x91" => "\x{0032}\x{0031}", # U+3251 => 0032 0031 +"\xE3\x89\x92" => "\x{0032}\x{0032}", # U+3252 => 0032 0032 +"\xE3\x89\x93" => "\x{0032}\x{0033}", # U+3253 => 0032 0033 +"\xE3\x89\x94" => "\x{0032}\x{0034}", # U+3254 => 0032 0034 +"\xE3\x89\x95" => "\x{0032}\x{0035}", # U+3255 => 0032 0035 +"\xE3\x89\x96" => "\x{0032}\x{0036}", # U+3256 => 0032 0036 +"\xE3\x89\x97" => "\x{0032}\x{0037}", # U+3257 => 0032 0037 +"\xE3\x89\x98" => "\x{0032}\x{0038}", # U+3258 => 0032 0038 +"\xE3\x89\x99" => "\x{0032}\x{0039}", # U+3259 => 0032 0039 +"\xE3\x89\x9A" => "\x{0033}\x{0030}", # U+325A => 0033 0030 +"\xE3\x89\x9B" => "\x{0033}\x{0031}", # U+325B => 0033 0031 +"\xE3\x89\x9C" => "\x{0033}\x{0032}", # U+325C => 0033 0032 +"\xE3\x89\x9D" => "\x{0033}\x{0033}", # U+325D => 0033 0033 +"\xE3\x89\x9E" => "\x{0033}\x{0034}", # U+325E => 0033 0034 +"\xE3\x89\x9F" => "\x{0033}\x{0035}", # U+325F => 0033 0035 +"\xE3\x89\xBC" => "\x{CC38}\x{ACE0}", # U+327C => CC38 ACE0 +"\xE3\x89\xBD" => "\x{C8FC}\x{C758}", # U+327D => C8FC C758 +"\xE3\x8A\xB1" => "\x{0033}\x{0036}", # U+32B1 => 0033 0036 +"\xE3\x8A\xB2" => "\x{0033}\x{0037}", # U+32B2 => 0033 0037 +"\xE3\x8A\xB3" => "\x{0033}\x{0038}", # U+32B3 => 0033 0038 +"\xE3\x8A\xB4" => "\x{0033}\x{0039}", # U+32B4 => 0033 0039 +"\xE3\x8A\xB5" => "\x{0034}\x{0030}", # U+32B5 => 0034 0030 +"\xE3\x8A\xB6" => "\x{0034}\x{0031}", # U+32B6 => 0034 0031 +"\xE3\x8A\xB7" => "\x{0034}\x{0032}", # U+32B7 => 0034 0032 +"\xE3\x8A\xB8" => "\x{0034}\x{0033}", # U+32B8 => 0034 0033 +"\xE3\x8A\xB9" => "\x{0034}\x{0034}", # U+32B9 => 0034 0034 +"\xE3\x8A\xBA" => "\x{0034}\x{0035}", # U+32BA => 0034 0035 +"\xE3\x8A\xBB" => "\x{0034}\x{0036}", # U+32BB => 0034 0036 +"\xE3\x8A\xBC" => "\x{0034}\x{0037}", # U+32BC => 0034 0037 +"\xE3\x8A\xBD" => "\x{0034}\x{0038}", # U+32BD => 0034 0038 +"\xE3\x8A\xBE" => "\x{0034}\x{0039}", # U+32BE => 0034 0039 +"\xE3\x8A\xBF" => "\x{0035}\x{0030}", # U+32BF => 0035 0030 +"\xE3\x8B\x80" => "\x{0031}\x{6708}", # U+32C0 => 0031 6708 +"\xE3\x8B\x81" => "\x{0032}\x{6708}", # U+32C1 => 0032 6708 +"\xE3\x8B\x82" => "\x{0033}\x{6708}", # U+32C2 => 0033 6708 +"\xE3\x8B\x83" => "\x{0034}\x{6708}", # U+32C3 => 0034 6708 +"\xE3\x8B\x84" => "\x{0035}\x{6708}", # U+32C4 => 0035 6708 +"\xE3\x8B\x85" => "\x{0036}\x{6708}", # U+32C5 => 0036 6708 +"\xE3\x8B\x86" => "\x{0037}\x{6708}", # U+32C6 => 0037 6708 +"\xE3\x8B\x87" => "\x{0038}\x{6708}", # U+32C7 => 0038 6708 +"\xE3\x8B\x88" => "\x{0039}\x{6708}", # U+32C8 => 0039 6708 +"\xE3\x8B\x89" => "\x{0031}\x{0030}\x{6708}", # U+32C9 => 0031 0030 6708 +"\xE3\x8B\x8A" => "\x{0031}\x{0031}\x{6708}", # U+32CA => 0031 0031 6708 +"\xE3\x8B\x8B" => "\x{0031}\x{0032}\x{6708}", # U+32CB => 0031 0032 6708 +"\xE3\x8B\x8C" => "\x{0068}\x{0067}", # U+32CC => 0068 0067 +"\xE3\x8B\x8D" => "\x{0065}\x{0072}\x{0067}", # U+32CD => 0065 0072 0067 +"\xE3\x8B\x8E" => "\x{0065}\x{0076}", # U+32CE => 0065 0076 +"\xE3\x8B\x8F" => "\x{006C}\x{0074}\x{0064}", # U+32CF => 006C 0074 0064 +"\xE3\x8C\x80" => "\x{30A2}\x{30D1}\x{30FC}\x{30C8}", # U+3300 => 30A2 30D1 30FC 30C8 +"\xE3\x8C\x81" => "\x{30A2}\x{30EB}\x{30D5}\x{30A1}", # U+3301 => 30A2 30EB 30D5 30A1 +"\xE3\x8C\x82" => "\x{30A2}\x{30F3}\x{30DA}\x{30A2}", # U+3302 => 30A2 30F3 30DA 30A2 +"\xE3\x8C\x83" => "\x{30A2}\x{30FC}\x{30EB}", # U+3303 => 30A2 30FC 30EB +"\xE3\x8C\x84" => "\x{30A4}\x{30CB}\x{30F3}\x{30B0}", # U+3304 => 30A4 30CB 30F3 30B0 +"\xE3\x8C\x85" => "\x{30A4}\x{30F3}\x{30C1}", # U+3305 => 30A4 30F3 30C1 +"\xE3\x8C\x86" => "\x{30A6}\x{30A9}\x{30F3}", # U+3306 => 30A6 30A9 30F3 +"\xE3\x8C\x87" => "\x{30A8}\x{30B9}\x{30AF}\x{30FC}\x{30C9}", # U+3307 => 30A8 30B9 30AF 30FC 30C9 +"\xE3\x8C\x88" => "\x{30A8}\x{30FC}\x{30AB}\x{30FC}", # U+3308 => 30A8 30FC 30AB 30FC +"\xE3\x8C\x89" => "\x{30AA}\x{30F3}\x{30B9}", # U+3309 => 30AA 30F3 30B9 +"\xE3\x8C\x8A" => "\x{30AA}\x{30FC}\x{30E0}", # U+330A => 30AA 30FC 30E0 +"\xE3\x8C\x8B" => "\x{30AB}\x{30A4}\x{30EA}", # U+330B => 30AB 30A4 30EA +"\xE3\x8C\x8C" => "\x{30AB}\x{30E9}\x{30C3}\x{30C8}", # U+330C => 30AB 30E9 30C3 30C8 +"\xE3\x8C\x8D" => "\x{30AB}\x{30ED}\x{30EA}\x{30FC}", # U+330D => 30AB 30ED 30EA 30FC +"\xE3\x8C\x8E" => "\x{30AC}\x{30ED}\x{30F3}", # U+330E => 30AC 30ED 30F3 +"\xE3\x8C\x8F" => "\x{30AC}\x{30F3}\x{30DE}", # U+330F => 30AC 30F3 30DE +"\xE3\x8C\x90" => "\x{30AE}\x{30AC}", # U+3310 => 30AE 30AC +"\xE3\x8C\x91" => "\x{30AE}\x{30CB}\x{30FC}", # U+3311 => 30AE 30CB 30FC +"\xE3\x8C\x92" => "\x{30AD}\x{30E5}\x{30EA}\x{30FC}", # U+3312 => 30AD 30E5 30EA 30FC +"\xE3\x8C\x93" => "\x{30AE}\x{30EB}\x{30C0}\x{30FC}", # U+3313 => 30AE 30EB 30C0 30FC +"\xE3\x8C\x94" => "\x{30AD}\x{30ED}", # U+3314 => 30AD 30ED +"\xE3\x8C\x95" => "\x{30AD}\x{30ED}\x{30B0}\x{30E9}\x{30E0}", # U+3315 => 30AD 30ED 30B0 30E9 30E0 +"\xE3\x8C\x96" => "\x{30AD}\x{30ED}\x{30E1}\x{30FC}\x{30C8}\x{30EB}", # U+3316 => 30AD 30ED 30E1 30FC 30C8 30EB +"\xE3\x8C\x97" => "\x{30AD}\x{30ED}\x{30EF}\x{30C3}\x{30C8}", # U+3317 => 30AD 30ED 30EF 30C3 30C8 +"\xE3\x8C\x98" => "\x{30B0}\x{30E9}\x{30E0}", # U+3318 => 30B0 30E9 30E0 +"\xE3\x8C\x99" => "\x{30B0}\x{30E9}\x{30E0}\x{30C8}\x{30F3}", # U+3319 => 30B0 30E9 30E0 30C8 30F3 +"\xE3\x8C\x9A" => "\x{30AF}\x{30EB}\x{30BC}\x{30A4}\x{30ED}", # U+331A => 30AF 30EB 30BC 30A4 30ED +"\xE3\x8C\x9B" => "\x{30AF}\x{30ED}\x{30FC}\x{30CD}", # U+331B => 30AF 30ED 30FC 30CD +"\xE3\x8C\x9C" => "\x{30B1}\x{30FC}\x{30B9}", # U+331C => 30B1 30FC 30B9 +"\xE3\x8C\x9D" => "\x{30B3}\x{30EB}\x{30CA}", # U+331D => 30B3 30EB 30CA +"\xE3\x8C\x9E" => "\x{30B3}\x{30FC}\x{30DD}", # U+331E => 30B3 30FC 30DD +"\xE3\x8C\x9F" => "\x{30B5}\x{30A4}\x{30AF}\x{30EB}", # U+331F => 30B5 30A4 30AF 30EB +"\xE3\x8C\xA0" => "\x{30B5}\x{30F3}\x{30C1}\x{30FC}\x{30E0}", # U+3320 => 30B5 30F3 30C1 30FC 30E0 +"\xE3\x8C\xA1" => "\x{30B7}\x{30EA}\x{30F3}\x{30B0}", # U+3321 => 30B7 30EA 30F3 30B0 +"\xE3\x8C\xA2" => "\x{30BB}\x{30F3}\x{30C1}", # U+3322 => 30BB 30F3 30C1 +"\xE3\x8C\xA3" => "\x{30BB}\x{30F3}\x{30C8}", # U+3323 => 30BB 30F3 30C8 +"\xE3\x8C\xA4" => "\x{30C0}\x{30FC}\x{30B9}", # U+3324 => 30C0 30FC 30B9 +"\xE3\x8C\xA5" => "\x{30C7}\x{30B7}", # U+3325 => 30C7 30B7 +"\xE3\x8C\xA6" => "\x{30C9}\x{30EB}", # U+3326 => 30C9 30EB +"\xE3\x8C\xA7" => "\x{30C8}\x{30F3}", # U+3327 => 30C8 30F3 +"\xE3\x8C\xA8" => "\x{30CA}\x{30CE}", # U+3328 => 30CA 30CE +"\xE3\x8C\xA9" => "\x{30CE}\x{30C3}\x{30C8}", # U+3329 => 30CE 30C3 30C8 +"\xE3\x8C\xAA" => "\x{30CF}\x{30A4}\x{30C4}", # U+332A => 30CF 30A4 30C4 +"\xE3\x8C\xAB" => "\x{30D1}\x{30FC}\x{30BB}\x{30F3}\x{30C8}", # U+332B => 30D1 30FC 30BB 30F3 30C8 +"\xE3\x8C\xAC" => "\x{30D1}\x{30FC}\x{30C4}", # U+332C => 30D1 30FC 30C4 +"\xE3\x8C\xAD" => "\x{30D0}\x{30FC}\x{30EC}\x{30EB}", # U+332D => 30D0 30FC 30EC 30EB +"\xE3\x8C\xAE" => "\x{30D4}\x{30A2}\x{30B9}\x{30C8}\x{30EB}", # U+332E => 30D4 30A2 30B9 30C8 30EB +"\xE3\x8C\xAF" => "\x{30D4}\x{30AF}\x{30EB}", # U+332F => 30D4 30AF 30EB +"\xE3\x8C\xB0" => "\x{30D4}\x{30B3}", # U+3330 => 30D4 30B3 +"\xE3\x8C\xB1" => "\x{30D3}\x{30EB}", # U+3331 => 30D3 30EB +"\xE3\x8C\xB2" => "\x{30D5}\x{30A1}\x{30E9}\x{30C3}\x{30C9}", # U+3332 => 30D5 30A1 30E9 30C3 30C9 +"\xE3\x8C\xB3" => "\x{30D5}\x{30A3}\x{30FC}\x{30C8}", # U+3333 => 30D5 30A3 30FC 30C8 +"\xE3\x8C\xB4" => "\x{30D6}\x{30C3}\x{30B7}\x{30A7}\x{30EB}", # U+3334 => 30D6 30C3 30B7 30A7 30EB +"\xE3\x8C\xB5" => "\x{30D5}\x{30E9}\x{30F3}", # U+3335 => 30D5 30E9 30F3 +"\xE3\x8C\xB6" => "\x{30D8}\x{30AF}\x{30BF}\x{30FC}\x{30EB}", # U+3336 => 30D8 30AF 30BF 30FC 30EB +"\xE3\x8C\xB7" => "\x{30DA}\x{30BD}", # U+3337 => 30DA 30BD +"\xE3\x8C\xB8" => "\x{30DA}\x{30CB}\x{30D2}", # U+3338 => 30DA 30CB 30D2 +"\xE3\x8C\xB9" => "\x{30D8}\x{30EB}\x{30C4}", # U+3339 => 30D8 30EB 30C4 +"\xE3\x8C\xBA" => "\x{30DA}\x{30F3}\x{30B9}", # U+333A => 30DA 30F3 30B9 +"\xE3\x8C\xBB" => "\x{30DA}\x{30FC}\x{30B8}", # U+333B => 30DA 30FC 30B8 +"\xE3\x8C\xBC" => "\x{30D9}\x{30FC}\x{30BF}", # U+333C => 30D9 30FC 30BF +"\xE3\x8C\xBD" => "\x{30DD}\x{30A4}\x{30F3}\x{30C8}", # U+333D => 30DD 30A4 30F3 30C8 +"\xE3\x8C\xBE" => "\x{30DC}\x{30EB}\x{30C8}", # U+333E => 30DC 30EB 30C8 +"\xE3\x8C\xBF" => "\x{30DB}\x{30F3}", # U+333F => 30DB 30F3 +"\xE3\x8D\x80" => "\x{30DD}\x{30F3}\x{30C9}", # U+3340 => 30DD 30F3 30C9 +"\xE3\x8D\x81" => "\x{30DB}\x{30FC}\x{30EB}", # U+3341 => 30DB 30FC 30EB +"\xE3\x8D\x82" => "\x{30DB}\x{30FC}\x{30F3}", # U+3342 => 30DB 30FC 30F3 +"\xE3\x8D\x83" => "\x{30DE}\x{30A4}\x{30AF}\x{30ED}", # U+3343 => 30DE 30A4 30AF 30ED +"\xE3\x8D\x84" => "\x{30DE}\x{30A4}\x{30EB}", # U+3344 => 30DE 30A4 30EB +"\xE3\x8D\x85" => "\x{30DE}\x{30C3}\x{30CF}", # U+3345 => 30DE 30C3 30CF +"\xE3\x8D\x86" => "\x{30DE}\x{30EB}\x{30AF}", # U+3346 => 30DE 30EB 30AF +"\xE3\x8D\x87" => "\x{30DE}\x{30F3}\x{30B7}\x{30E7}\x{30F3}", # U+3347 => 30DE 30F3 30B7 30E7 30F3 +"\xE3\x8D\x88" => "\x{30DF}\x{30AF}\x{30ED}\x{30F3}", # U+3348 => 30DF 30AF 30ED 30F3 +"\xE3\x8D\x89" => "\x{30DF}\x{30EA}", # U+3349 => 30DF 30EA +"\xE3\x8D\x8A" => "\x{30DF}\x{30EA}\x{30D0}\x{30FC}\x{30EB}", # U+334A => 30DF 30EA 30D0 30FC 30EB +"\xE3\x8D\x8B" => "\x{30E1}\x{30AC}", # U+334B => 30E1 30AC +"\xE3\x8D\x8C" => "\x{30E1}\x{30AC}\x{30C8}\x{30F3}", # U+334C => 30E1 30AC 30C8 30F3 +"\xE3\x8D\x8D" => "\x{30E1}\x{30FC}\x{30C8}\x{30EB}", # U+334D => 30E1 30FC 30C8 30EB +"\xE3\x8D\x8E" => "\x{30E4}\x{30FC}\x{30C9}", # U+334E => 30E4 30FC 30C9 +"\xE3\x8D\x8F" => "\x{30E4}\x{30FC}\x{30EB}", # U+334F => 30E4 30FC 30EB +"\xE3\x8D\x90" => "\x{30E6}\x{30A2}\x{30F3}", # U+3350 => 30E6 30A2 30F3 +"\xE3\x8D\x91" => "\x{30EA}\x{30C3}\x{30C8}\x{30EB}", # U+3351 => 30EA 30C3 30C8 30EB +"\xE3\x8D\x92" => "\x{30EA}\x{30E9}", # U+3352 => 30EA 30E9 +"\xE3\x8D\x93" => "\x{30EB}\x{30D4}\x{30FC}", # U+3353 => 30EB 30D4 30FC +"\xE3\x8D\x94" => "\x{30EB}\x{30FC}\x{30D6}\x{30EB}", # U+3354 => 30EB 30FC 30D6 30EB +"\xE3\x8D\x95" => "\x{30EC}\x{30E0}", # U+3355 => 30EC 30E0 +"\xE3\x8D\x96" => "\x{30EC}\x{30F3}\x{30C8}\x{30B2}\x{30F3}", # U+3356 => 30EC 30F3 30C8 30B2 30F3 +"\xE3\x8D\x97" => "\x{30EF}\x{30C3}\x{30C8}", # U+3357 => 30EF 30C3 30C8 +"\xE3\x8D\x98" => "\x{0030}\x{70B9}", # U+3358 => 0030 70B9 +"\xE3\x8D\x99" => "\x{0031}\x{70B9}", # U+3359 => 0031 70B9 +"\xE3\x8D\x9A" => "\x{0032}\x{70B9}", # U+335A => 0032 70B9 +"\xE3\x8D\x9B" => "\x{0033}\x{70B9}", # U+335B => 0033 70B9 +"\xE3\x8D\x9C" => "\x{0034}\x{70B9}", # U+335C => 0034 70B9 +"\xE3\x8D\x9D" => "\x{0035}\x{70B9}", # U+335D => 0035 70B9 +"\xE3\x8D\x9E" => "\x{0036}\x{70B9}", # U+335E => 0036 70B9 +"\xE3\x8D\x9F" => "\x{0037}\x{70B9}", # U+335F => 0037 70B9 +"\xE3\x8D\xA0" => "\x{0038}\x{70B9}", # U+3360 => 0038 70B9 +"\xE3\x8D\xA1" => "\x{0039}\x{70B9}", # U+3361 => 0039 70B9 +"\xE3\x8D\xA2" => "\x{0031}\x{0030}\x{70B9}", # U+3362 => 0031 0030 70B9 +"\xE3\x8D\xA3" => "\x{0031}\x{0031}\x{70B9}", # U+3363 => 0031 0031 70B9 +"\xE3\x8D\xA4" => "\x{0031}\x{0032}\x{70B9}", # U+3364 => 0031 0032 70B9 +"\xE3\x8D\xA5" => "\x{0031}\x{0033}\x{70B9}", # U+3365 => 0031 0033 70B9 +"\xE3\x8D\xA6" => "\x{0031}\x{0034}\x{70B9}", # U+3366 => 0031 0034 70B9 +"\xE3\x8D\xA7" => "\x{0031}\x{0035}\x{70B9}", # U+3367 => 0031 0035 70B9 +"\xE3\x8D\xA8" => "\x{0031}\x{0036}\x{70B9}", # U+3368 => 0031 0036 70B9 +"\xE3\x8D\xA9" => "\x{0031}\x{0037}\x{70B9}", # U+3369 => 0031 0037 70B9 +"\xE3\x8D\xAA" => "\x{0031}\x{0038}\x{70B9}", # U+336A => 0031 0038 70B9 +"\xE3\x8D\xAB" => "\x{0031}\x{0039}\x{70B9}", # U+336B => 0031 0039 70B9 +"\xE3\x8D\xAC" => "\x{0032}\x{0030}\x{70B9}", # U+336C => 0032 0030 70B9 +"\xE3\x8D\xAD" => "\x{0032}\x{0031}\x{70B9}", # U+336D => 0032 0031 70B9 +"\xE3\x8D\xAE" => "\x{0032}\x{0032}\x{70B9}", # U+336E => 0032 0032 70B9 +"\xE3\x8D\xAF" => "\x{0032}\x{0033}\x{70B9}", # U+336F => 0032 0033 70B9 +"\xE3\x8D\xB0" => "\x{0032}\x{0034}\x{70B9}", # U+3370 => 0032 0034 70B9 +"\xE3\x8D\xB1" => "\x{0068}\x{0070}\x{0061}", # U+3371 => 0068 0070 0061 +"\xE3\x8D\xB2" => "\x{0064}\x{0061}", # U+3372 => 0064 0061 +"\xE3\x8D\xB3" => "\x{0061}\x{0075}", # U+3373 => 0061 0075 +"\xE3\x8D\xB4" => "\x{0062}\x{0061}\x{0072}", # U+3374 => 0062 0061 0072 +"\xE3\x8D\xB5" => "\x{006F}\x{0076}", # U+3375 => 006F 0076 +"\xE3\x8D\xB6" => "\x{0070}\x{0063}", # U+3376 => 0070 0063 +"\xE3\x8D\xB7" => "\x{0064}\x{006D}", # U+3377 => 0064 006D +"\xE3\x8D\xB8" => "\x{0064}\x{006D}\x{0032}", # U+3378 => 0064 006D 0032 +"\xE3\x8D\xB9" => "\x{0064}\x{006D}\x{0033}", # U+3379 => 0064 006D 0033 +"\xE3\x8D\xBA" => "\x{0069}\x{0075}", # U+337A => 0069 0075 +"\xE3\x8D\xBB" => "\x{5E73}\x{6210}", # U+337B => 5E73 6210 +"\xE3\x8D\xBC" => "\x{662D}\x{548C}", # U+337C => 662D 548C +"\xE3\x8D\xBD" => "\x{5927}\x{6B63}", # U+337D => 5927 6B63 +"\xE3\x8D\xBE" => "\x{660E}\x{6CBB}", # U+337E => 660E 6CBB +"\xE3\x8D\xBF" => "\x{682A}\x{5F0F}\x{4F1A}\x{793E}", # U+337F => 682A 5F0F 4F1A 793E +"\xE3\x8E\x80" => "\x{0070}\x{0061}", # U+3380 => 0070 0061 +"\xE3\x8E\x81" => "\x{006E}\x{0061}", # U+3381 => 006E 0061 +"\xE3\x8E\x82" => "\x{03BC}\x{0061}", # U+3382 => 03BC 0061 +"\xE3\x8E\x83" => "\x{006D}\x{0061}", # U+3383 => 006D 0061 +"\xE3\x8E\x84" => "\x{006B}\x{0061}", # U+3384 => 006B 0061 +"\xE3\x8E\x85" => "\x{006B}\x{0062}", # U+3385 => 006B 0062 +"\xE3\x8E\x86" => "\x{006D}\x{0062}", # U+3386 => 006D 0062 +"\xE3\x8E\x87" => "\x{0067}\x{0062}", # U+3387 => 0067 0062 +"\xE3\x8E\x88" => "\x{0063}\x{0061}\x{006C}", # U+3388 => 0063 0061 006C +"\xE3\x8E\x89" => "\x{006B}\x{0063}\x{0061}\x{006C}", # U+3389 => 006B 0063 0061 006C +"\xE3\x8E\x8A" => "\x{0070}\x{0066}", # U+338A => 0070 0066 +"\xE3\x8E\x8B" => "\x{006E}\x{0066}", # U+338B => 006E 0066 +"\xE3\x8E\x8C" => "\x{03BC}\x{0066}", # U+338C => 03BC 0066 +"\xE3\x8E\x8D" => "\x{03BC}\x{0067}", # U+338D => 03BC 0067 +"\xE3\x8E\x8E" => "\x{006D}\x{0067}", # U+338E => 006D 0067 +"\xE3\x8E\x8F" => "\x{006B}\x{0067}", # U+338F => 006B 0067 +"\xE3\x8E\x90" => "\x{0068}\x{007A}", # U+3390 => 0068 007A +"\xE3\x8E\x91" => "\x{006B}\x{0068}\x{007A}", # U+3391 => 006B 0068 007A +"\xE3\x8E\x92" => "\x{006D}\x{0068}\x{007A}", # U+3392 => 006D 0068 007A +"\xE3\x8E\x93" => "\x{0067}\x{0068}\x{007A}", # U+3393 => 0067 0068 007A +"\xE3\x8E\x94" => "\x{0074}\x{0068}\x{007A}", # U+3394 => 0074 0068 007A +"\xE3\x8E\x95" => "\x{03BC}\x{006C}", # U+3395 => 03BC 006C +"\xE3\x8E\x96" => "\x{006D}\x{006C}", # U+3396 => 006D 006C +"\xE3\x8E\x97" => "\x{0064}\x{006C}", # U+3397 => 0064 006C +"\xE3\x8E\x98" => "\x{006B}\x{006C}", # U+3398 => 006B 006C +"\xE3\x8E\x99" => "\x{0066}\x{006D}", # U+3399 => 0066 006D +"\xE3\x8E\x9A" => "\x{006E}\x{006D}", # U+339A => 006E 006D +"\xE3\x8E\x9B" => "\x{03BC}\x{006D}", # U+339B => 03BC 006D +"\xE3\x8E\x9C" => "\x{006D}\x{006D}", # U+339C => 006D 006D +"\xE3\x8E\x9D" => "\x{0063}\x{006D}", # U+339D => 0063 006D +"\xE3\x8E\x9E" => "\x{006B}\x{006D}", # U+339E => 006B 006D +"\xE3\x8E\x9F" => "\x{006D}\x{006D}\x{0032}", # U+339F => 006D 006D 0032 +"\xE3\x8E\xA0" => "\x{0063}\x{006D}\x{0032}", # U+33A0 => 0063 006D 0032 +"\xE3\x8E\xA1" => "\x{006D}\x{0032}", # U+33A1 => 006D 0032 +"\xE3\x8E\xA2" => "\x{006B}\x{006D}\x{0032}", # U+33A2 => 006B 006D 0032 +"\xE3\x8E\xA3" => "\x{006D}\x{006D}\x{0033}", # U+33A3 => 006D 006D 0033 +"\xE3\x8E\xA4" => "\x{0063}\x{006D}\x{0033}", # U+33A4 => 0063 006D 0033 +"\xE3\x8E\xA5" => "\x{006D}\x{0033}", # U+33A5 => 006D 0033 +"\xE3\x8E\xA6" => "\x{006B}\x{006D}\x{0033}", # U+33A6 => 006B 006D 0033 +"\xE3\x8E\xA7" => "\x{006D}\x{2215}\x{0073}", # U+33A7 => 006D 2215 0073 +"\xE3\x8E\xA8" => "\x{006D}\x{2215}\x{0073}\x{0032}", # U+33A8 => 006D 2215 0073 0032 +"\xE3\x8E\xA9" => "\x{0070}\x{0061}", # U+33A9 => 0070 0061 +"\xE3\x8E\xAA" => "\x{006B}\x{0070}\x{0061}", # U+33AA => 006B 0070 0061 +"\xE3\x8E\xAB" => "\x{006D}\x{0070}\x{0061}", # U+33AB => 006D 0070 0061 +"\xE3\x8E\xAC" => "\x{0067}\x{0070}\x{0061}", # U+33AC => 0067 0070 0061 +"\xE3\x8E\xAD" => "\x{0072}\x{0061}\x{0064}", # U+33AD => 0072 0061 0064 +"\xE3\x8E\xAE" => "\x{0072}\x{0061}\x{0064}\x{2215}\x{0073}", # U+33AE => 0072 0061 0064 2215 0073 +"\xE3\x8E\xAF" => "\x{0072}\x{0061}\x{0064}\x{2215}\x{0073}\x{0032}", # U+33AF => 0072 0061 0064 2215 0073 0032 +"\xE3\x8E\xB0" => "\x{0070}\x{0073}", # U+33B0 => 0070 0073 +"\xE3\x8E\xB1" => "\x{006E}\x{0073}", # U+33B1 => 006E 0073 +"\xE3\x8E\xB2" => "\x{03BC}\x{0073}", # U+33B2 => 03BC 0073 +"\xE3\x8E\xB3" => "\x{006D}\x{0073}", # U+33B3 => 006D 0073 +"\xE3\x8E\xB4" => "\x{0070}\x{0076}", # U+33B4 => 0070 0076 +"\xE3\x8E\xB5" => "\x{006E}\x{0076}", # U+33B5 => 006E 0076 +"\xE3\x8E\xB6" => "\x{03BC}\x{0076}", # U+33B6 => 03BC 0076 +"\xE3\x8E\xB7" => "\x{006D}\x{0076}", # U+33B7 => 006D 0076 +"\xE3\x8E\xB8" => "\x{006B}\x{0076}", # U+33B8 => 006B 0076 +"\xE3\x8E\xB9" => "\x{006D}\x{0076}", # U+33B9 => 006D 0076 +"\xE3\x8E\xBA" => "\x{0070}\x{0077}", # U+33BA => 0070 0077 +"\xE3\x8E\xBB" => "\x{006E}\x{0077}", # U+33BB => 006E 0077 +"\xE3\x8E\xBC" => "\x{03BC}\x{0077}", # U+33BC => 03BC 0077 +"\xE3\x8E\xBD" => "\x{006D}\x{0077}", # U+33BD => 006D 0077 +"\xE3\x8E\xBE" => "\x{006B}\x{0077}", # U+33BE => 006B 0077 +"\xE3\x8E\xBF" => "\x{006D}\x{0077}", # U+33BF => 006D 0077 +"\xE3\x8F\x80" => "\x{006B}\x{03C9}", # U+33C0 => 006B 03C9 +"\xE3\x8F\x81" => "\x{006D}\x{03C9}", # U+33C1 => 006D 03C9 +"\xE3\x8F\x82" => "\x{0061}\x{002E}\x{006D}\x{002E}", # U+33C2 => 0061 002E 006D 002E +"\xE3\x8F\x83" => "\x{0062}\x{0071}", # U+33C3 => 0062 0071 +"\xE3\x8F\x84" => "\x{0063}\x{0063}", # U+33C4 => 0063 0063 +"\xE3\x8F\x85" => "\x{0063}\x{0064}", # U+33C5 => 0063 0064 +"\xE3\x8F\x86" => "\x{0063}\x{2215}\x{006B}\x{0067}", # U+33C6 => 0063 2215 006B 0067 +"\xE3\x8F\x87" => "\x{0063}\x{006F}\x{002E}", # U+33C7 => 0063 006F 002E +"\xE3\x8F\x88" => "\x{0064}\x{0062}", # U+33C8 => 0064 0062 +"\xE3\x8F\x89" => "\x{0067}\x{0079}", # U+33C9 => 0067 0079 +"\xE3\x8F\x8A" => "\x{0068}\x{0061}", # U+33CA => 0068 0061 +"\xE3\x8F\x8B" => "\x{0068}\x{0070}", # U+33CB => 0068 0070 +"\xE3\x8F\x8C" => "\x{0069}\x{006E}", # U+33CC => 0069 006E +"\xE3\x8F\x8D" => "\x{006B}\x{006B}", # U+33CD => 006B 006B +"\xE3\x8F\x8E" => "\x{006B}\x{006D}", # U+33CE => 006B 006D +"\xE3\x8F\x8F" => "\x{006B}\x{0074}", # U+33CF => 006B 0074 +"\xE3\x8F\x90" => "\x{006C}\x{006D}", # U+33D0 => 006C 006D +"\xE3\x8F\x91" => "\x{006C}\x{006E}", # U+33D1 => 006C 006E +"\xE3\x8F\x92" => "\x{006C}\x{006F}\x{0067}", # U+33D2 => 006C 006F 0067 +"\xE3\x8F\x93" => "\x{006C}\x{0078}", # U+33D3 => 006C 0078 +"\xE3\x8F\x94" => "\x{006D}\x{0062}", # U+33D4 => 006D 0062 +"\xE3\x8F\x95" => "\x{006D}\x{0069}\x{006C}", # U+33D5 => 006D 0069 006C +"\xE3\x8F\x96" => "\x{006D}\x{006F}\x{006C}", # U+33D6 => 006D 006F 006C +"\xE3\x8F\x97" => "\x{0070}\x{0068}", # U+33D7 => 0070 0068 +"\xE3\x8F\x98" => "\x{0070}\x{002E}\x{006D}\x{002E}", # U+33D8 => 0070 002E 006D 002E +"\xE3\x8F\x99" => "\x{0070}\x{0070}\x{006D}", # U+33D9 => 0070 0070 006D +"\xE3\x8F\x9A" => "\x{0070}\x{0072}", # U+33DA => 0070 0072 +"\xE3\x8F\x9B" => "\x{0073}\x{0072}", # U+33DB => 0073 0072 +"\xE3\x8F\x9C" => "\x{0073}\x{0076}", # U+33DC => 0073 0076 +"\xE3\x8F\x9D" => "\x{0077}\x{0062}", # U+33DD => 0077 0062 +"\xE3\x8F\x9E" => "\x{0076}\x{2215}\x{006D}", # U+33DE => 0076 2215 006D +"\xE3\x8F\x9F" => "\x{0061}\x{2215}\x{006D}", # U+33DF => 0061 2215 006D +"\xE3\x8F\xA0" => "\x{0031}\x{65E5}", # U+33E0 => 0031 65E5 +"\xE3\x8F\xA1" => "\x{0032}\x{65E5}", # U+33E1 => 0032 65E5 +"\xE3\x8F\xA2" => "\x{0033}\x{65E5}", # U+33E2 => 0033 65E5 +"\xE3\x8F\xA3" => "\x{0034}\x{65E5}", # U+33E3 => 0034 65E5 +"\xE3\x8F\xA4" => "\x{0035}\x{65E5}", # U+33E4 => 0035 65E5 +"\xE3\x8F\xA5" => "\x{0036}\x{65E5}", # U+33E5 => 0036 65E5 +"\xE3\x8F\xA6" => "\x{0037}\x{65E5}", # U+33E6 => 0037 65E5 +"\xE3\x8F\xA7" => "\x{0038}\x{65E5}", # U+33E7 => 0038 65E5 +"\xE3\x8F\xA8" => "\x{0039}\x{65E5}", # U+33E8 => 0039 65E5 +"\xE3\x8F\xA9" => "\x{0031}\x{0030}\x{65E5}", # U+33E9 => 0031 0030 65E5 +"\xE3\x8F\xAA" => "\x{0031}\x{0031}\x{65E5}", # U+33EA => 0031 0031 65E5 +"\xE3\x8F\xAB" => "\x{0031}\x{0032}\x{65E5}", # U+33EB => 0031 0032 65E5 +"\xE3\x8F\xAC" => "\x{0031}\x{0033}\x{65E5}", # U+33EC => 0031 0033 65E5 +"\xE3\x8F\xAD" => "\x{0031}\x{0034}\x{65E5}", # U+33ED => 0031 0034 65E5 +"\xE3\x8F\xAE" => "\x{0031}\x{0035}\x{65E5}", # U+33EE => 0031 0035 65E5 +"\xE3\x8F\xAF" => "\x{0031}\x{0036}\x{65E5}", # U+33EF => 0031 0036 65E5 +"\xE3\x8F\xB0" => "\x{0031}\x{0037}\x{65E5}", # U+33F0 => 0031 0037 65E5 +"\xE3\x8F\xB1" => "\x{0031}\x{0038}\x{65E5}", # U+33F1 => 0031 0038 65E5 +"\xE3\x8F\xB2" => "\x{0031}\x{0039}\x{65E5}", # U+33F2 => 0031 0039 65E5 +"\xE3\x8F\xB3" => "\x{0032}\x{0030}\x{65E5}", # U+33F3 => 0032 0030 65E5 +"\xE3\x8F\xB4" => "\x{0032}\x{0031}\x{65E5}", # U+33F4 => 0032 0031 65E5 +"\xE3\x8F\xB5" => "\x{0032}\x{0032}\x{65E5}", # U+33F5 => 0032 0032 65E5 +"\xE3\x8F\xB6" => "\x{0032}\x{0033}\x{65E5}", # U+33F6 => 0032 0033 65E5 +"\xE3\x8F\xB7" => "\x{0032}\x{0034}\x{65E5}", # U+33F7 => 0032 0034 65E5 +"\xE3\x8F\xB8" => "\x{0032}\x{0035}\x{65E5}", # U+33F8 => 0032 0035 65E5 +"\xE3\x8F\xB9" => "\x{0032}\x{0036}\x{65E5}", # U+33F9 => 0032 0036 65E5 +"\xE3\x8F\xBA" => "\x{0032}\x{0037}\x{65E5}", # U+33FA => 0032 0037 65E5 +"\xE3\x8F\xBB" => "\x{0032}\x{0038}\x{65E5}", # U+33FB => 0032 0038 65E5 +"\xE3\x8F\xBC" => "\x{0032}\x{0039}\x{65E5}", # U+33FC => 0032 0039 65E5 +"\xE3\x8F\xBD" => "\x{0033}\x{0030}\x{65E5}", # U+33FD => 0033 0030 65E5 +"\xE3\x8F\xBE" => "\x{0033}\x{0031}\x{65E5}", # U+33FE => 0033 0031 65E5 +"\xE3\x8F\xBF" => "\x{0067}\x{0061}\x{006C}", # U+33FF => 0067 0061 006C +"\xEF\xAC\x80" => "\x{0066}\x{0066}", # U+FB00 => 0066 0066 +"\xEF\xAC\x81" => "\x{0066}\x{0069}", # U+FB01 => 0066 0069 +"\xEF\xAC\x82" => "\x{0066}\x{006C}", # U+FB02 => 0066 006C +"\xEF\xAC\x83" => "\x{0066}\x{0066}\x{0069}", # U+FB03 => 0066 0066 0069 +"\xEF\xAC\x84" => "\x{0066}\x{0066}\x{006C}", # U+FB04 => 0066 0066 006C +"\xEF\xAC\x85" => "\x{0073}\x{0074}", # U+FB05 => 0073 0074 +"\xEF\xAC\x86" => "\x{0073}\x{0074}", # U+FB06 => 0073 0074 +"\xEF\xAC\x93" => "\x{0574}\x{0576}", # U+FB13 => 0574 0576 +"\xEF\xAC\x94" => "\x{0574}\x{0565}", # U+FB14 => 0574 0565 +"\xEF\xAC\x95" => "\x{0574}\x{056B}", # U+FB15 => 0574 056B +"\xEF\xAC\x96" => "\x{057E}\x{0576}", # U+FB16 => 057E 0576 +"\xEF\xAC\x97" => "\x{0574}\x{056D}", # U+FB17 => 0574 056D +"\xEF\xAC\x9D" => "\x{05D9}\x{05B4}", # U+FB1D => 05D9 05B4 +"\xEF\xAC\x9F" => "\x{05F2}\x{05B7}", # U+FB1F => 05F2 05B7 +"\xEF\xAC\xAA" => "\x{05E9}\x{05C1}", # U+FB2A => 05E9 05C1 +"\xEF\xAC\xAB" => "\x{05E9}\x{05C2}", # U+FB2B => 05E9 05C2 +"\xEF\xAC\xAC" => "\x{05E9}\x{05BC}\x{05C1}", # U+FB2C => 05E9 05BC 05C1 +"\xEF\xAC\xAD" => "\x{05E9}\x{05BC}\x{05C2}", # U+FB2D => 05E9 05BC 05C2 +"\xEF\xAC\xAE" => "\x{05D0}\x{05B7}", # U+FB2E => 05D0 05B7 +"\xEF\xAC\xAF" => "\x{05D0}\x{05B8}", # U+FB2F => 05D0 05B8 +"\xEF\xAC\xB0" => "\x{05D0}\x{05BC}", # U+FB30 => 05D0 05BC +"\xEF\xAC\xB1" => "\x{05D1}\x{05BC}", # U+FB31 => 05D1 05BC +"\xEF\xAC\xB2" => "\x{05D2}\x{05BC}", # U+FB32 => 05D2 05BC +"\xEF\xAC\xB3" => "\x{05D3}\x{05BC}", # U+FB33 => 05D3 05BC +"\xEF\xAC\xB4" => "\x{05D4}\x{05BC}", # U+FB34 => 05D4 05BC +"\xEF\xAC\xB5" => "\x{05D5}\x{05BC}", # U+FB35 => 05D5 05BC +"\xEF\xAC\xB6" => "\x{05D6}\x{05BC}", # U+FB36 => 05D6 05BC +"\xEF\xAC\xB8" => "\x{05D8}\x{05BC}", # U+FB38 => 05D8 05BC +"\xEF\xAC\xB9" => "\x{05D9}\x{05BC}", # U+FB39 => 05D9 05BC +"\xEF\xAC\xBA" => "\x{05DA}\x{05BC}", # U+FB3A => 05DA 05BC +"\xEF\xAC\xBB" => "\x{05DB}\x{05BC}", # U+FB3B => 05DB 05BC +"\xEF\xAC\xBC" => "\x{05DC}\x{05BC}", # U+FB3C => 05DC 05BC +"\xEF\xAC\xBE" => "\x{05DE}\x{05BC}", # U+FB3E => 05DE 05BC +"\xEF\xAD\x80" => "\x{05E0}\x{05BC}", # U+FB40 => 05E0 05BC +"\xEF\xAD\x81" => "\x{05E1}\x{05BC}", # U+FB41 => 05E1 05BC +"\xEF\xAD\x83" => "\x{05E3}\x{05BC}", # U+FB43 => 05E3 05BC +"\xEF\xAD\x84" => "\x{05E4}\x{05BC}", # U+FB44 => 05E4 05BC +"\xEF\xAD\x86" => "\x{05E6}\x{05BC}", # U+FB46 => 05E6 05BC +"\xEF\xAD\x87" => "\x{05E7}\x{05BC}", # U+FB47 => 05E7 05BC +"\xEF\xAD\x88" => "\x{05E8}\x{05BC}", # U+FB48 => 05E8 05BC +"\xEF\xAD\x89" => "\x{05E9}\x{05BC}", # U+FB49 => 05E9 05BC +"\xEF\xAD\x8A" => "\x{05EA}\x{05BC}", # U+FB4A => 05EA 05BC +"\xEF\xAD\x8B" => "\x{05D5}\x{05B9}", # U+FB4B => 05D5 05B9 +"\xEF\xAD\x8C" => "\x{05D1}\x{05BF}", # U+FB4C => 05D1 05BF +"\xEF\xAD\x8D" => "\x{05DB}\x{05BF}", # U+FB4D => 05DB 05BF +"\xEF\xAD\x8E" => "\x{05E4}\x{05BF}", # U+FB4E => 05E4 05BF +"\xEF\xAD\x8F" => "\x{05D0}\x{05DC}", # U+FB4F => 05D0 05DC +"\xEF\xAF\x9D" => "\x{06C7}\x{0674}", # U+FBDD => 06C7 0674 +"\xEF\xAF\xAA" => "\x{0626}\x{0627}", # U+FBEA => 0626 0627 +"\xEF\xAF\xAB" => "\x{0626}\x{0627}", # U+FBEB => 0626 0627 +"\xEF\xAF\xAC" => "\x{0626}\x{06D5}", # U+FBEC => 0626 06D5 +"\xEF\xAF\xAD" => "\x{0626}\x{06D5}", # U+FBED => 0626 06D5 +"\xEF\xAF\xAE" => "\x{0626}\x{0648}", # U+FBEE => 0626 0648 +"\xEF\xAF\xAF" => "\x{0626}\x{0648}", # U+FBEF => 0626 0648 +"\xEF\xAF\xB0" => "\x{0626}\x{06C7}", # U+FBF0 => 0626 06C7 +"\xEF\xAF\xB1" => "\x{0626}\x{06C7}", # U+FBF1 => 0626 06C7 +"\xEF\xAF\xB2" => "\x{0626}\x{06C6}", # U+FBF2 => 0626 06C6 +"\xEF\xAF\xB3" => "\x{0626}\x{06C6}", # U+FBF3 => 0626 06C6 +"\xEF\xAF\xB4" => "\x{0626}\x{06C8}", # U+FBF4 => 0626 06C8 +"\xEF\xAF\xB5" => "\x{0626}\x{06C8}", # U+FBF5 => 0626 06C8 +"\xEF\xAF\xB6" => "\x{0626}\x{06D0}", # U+FBF6 => 0626 06D0 +"\xEF\xAF\xB7" => "\x{0626}\x{06D0}", # U+FBF7 => 0626 06D0 +"\xEF\xAF\xB8" => "\x{0626}\x{06D0}", # U+FBF8 => 0626 06D0 +"\xEF\xAF\xB9" => "\x{0626}\x{0649}", # U+FBF9 => 0626 0649 +"\xEF\xAF\xBA" => "\x{0626}\x{0649}", # U+FBFA => 0626 0649 +"\xEF\xAF\xBB" => "\x{0626}\x{0649}", # U+FBFB => 0626 0649 +"\xEF\xB0\x80" => "\x{0626}\x{062C}", # U+FC00 => 0626 062C +"\xEF\xB0\x81" => "\x{0626}\x{062D}", # U+FC01 => 0626 062D +"\xEF\xB0\x82" => "\x{0626}\x{0645}", # U+FC02 => 0626 0645 +"\xEF\xB0\x83" => "\x{0626}\x{0649}", # U+FC03 => 0626 0649 +"\xEF\xB0\x84" => "\x{0626}\x{064A}", # U+FC04 => 0626 064A +"\xEF\xB0\x85" => "\x{0628}\x{062C}", # U+FC05 => 0628 062C +"\xEF\xB0\x86" => "\x{0628}\x{062D}", # U+FC06 => 0628 062D +"\xEF\xB0\x87" => "\x{0628}\x{062E}", # U+FC07 => 0628 062E +"\xEF\xB0\x88" => "\x{0628}\x{0645}", # U+FC08 => 0628 0645 +"\xEF\xB0\x89" => "\x{0628}\x{0649}", # U+FC09 => 0628 0649 +"\xEF\xB0\x8A" => "\x{0628}\x{064A}", # U+FC0A => 0628 064A +"\xEF\xB0\x8B" => "\x{062A}\x{062C}", # U+FC0B => 062A 062C +"\xEF\xB0\x8C" => "\x{062A}\x{062D}", # U+FC0C => 062A 062D +"\xEF\xB0\x8D" => "\x{062A}\x{062E}", # U+FC0D => 062A 062E +"\xEF\xB0\x8E" => "\x{062A}\x{0645}", # U+FC0E => 062A 0645 +"\xEF\xB0\x8F" => "\x{062A}\x{0649}", # U+FC0F => 062A 0649 +"\xEF\xB0\x90" => "\x{062A}\x{064A}", # U+FC10 => 062A 064A +"\xEF\xB0\x91" => "\x{062B}\x{062C}", # U+FC11 => 062B 062C +"\xEF\xB0\x92" => "\x{062B}\x{0645}", # U+FC12 => 062B 0645 +"\xEF\xB0\x93" => "\x{062B}\x{0649}", # U+FC13 => 062B 0649 +"\xEF\xB0\x94" => "\x{062B}\x{064A}", # U+FC14 => 062B 064A +"\xEF\xB0\x95" => "\x{062C}\x{062D}", # U+FC15 => 062C 062D +"\xEF\xB0\x96" => "\x{062C}\x{0645}", # U+FC16 => 062C 0645 +"\xEF\xB0\x97" => "\x{062D}\x{062C}", # U+FC17 => 062D 062C +"\xEF\xB0\x98" => "\x{062D}\x{0645}", # U+FC18 => 062D 0645 +"\xEF\xB0\x99" => "\x{062E}\x{062C}", # U+FC19 => 062E 062C +"\xEF\xB0\x9A" => "\x{062E}\x{062D}", # U+FC1A => 062E 062D +"\xEF\xB0\x9B" => "\x{062E}\x{0645}", # U+FC1B => 062E 0645 +"\xEF\xB0\x9C" => "\x{0633}\x{062C}", # U+FC1C => 0633 062C +"\xEF\xB0\x9D" => "\x{0633}\x{062D}", # U+FC1D => 0633 062D +"\xEF\xB0\x9E" => "\x{0633}\x{062E}", # U+FC1E => 0633 062E +"\xEF\xB0\x9F" => "\x{0633}\x{0645}", # U+FC1F => 0633 0645 +"\xEF\xB0\xA0" => "\x{0635}\x{062D}", # U+FC20 => 0635 062D +"\xEF\xB0\xA1" => "\x{0635}\x{0645}", # U+FC21 => 0635 0645 +"\xEF\xB0\xA2" => "\x{0636}\x{062C}", # U+FC22 => 0636 062C +"\xEF\xB0\xA3" => "\x{0636}\x{062D}", # U+FC23 => 0636 062D +"\xEF\xB0\xA4" => "\x{0636}\x{062E}", # U+FC24 => 0636 062E +"\xEF\xB0\xA5" => "\x{0636}\x{0645}", # U+FC25 => 0636 0645 +"\xEF\xB0\xA6" => "\x{0637}\x{062D}", # U+FC26 => 0637 062D +"\xEF\xB0\xA7" => "\x{0637}\x{0645}", # U+FC27 => 0637 0645 +"\xEF\xB0\xA8" => "\x{0638}\x{0645}", # U+FC28 => 0638 0645 +"\xEF\xB0\xA9" => "\x{0639}\x{062C}", # U+FC29 => 0639 062C +"\xEF\xB0\xAA" => "\x{0639}\x{0645}", # U+FC2A => 0639 0645 +"\xEF\xB0\xAB" => "\x{063A}\x{062C}", # U+FC2B => 063A 062C +"\xEF\xB0\xAC" => "\x{063A}\x{0645}", # U+FC2C => 063A 0645 +"\xEF\xB0\xAD" => "\x{0641}\x{062C}", # U+FC2D => 0641 062C +"\xEF\xB0\xAE" => "\x{0641}\x{062D}", # U+FC2E => 0641 062D +"\xEF\xB0\xAF" => "\x{0641}\x{062E}", # U+FC2F => 0641 062E +"\xEF\xB0\xB0" => "\x{0641}\x{0645}", # U+FC30 => 0641 0645 +"\xEF\xB0\xB1" => "\x{0641}\x{0649}", # U+FC31 => 0641 0649 +"\xEF\xB0\xB2" => "\x{0641}\x{064A}", # U+FC32 => 0641 064A +"\xEF\xB0\xB3" => "\x{0642}\x{062D}", # U+FC33 => 0642 062D +"\xEF\xB0\xB4" => "\x{0642}\x{0645}", # U+FC34 => 0642 0645 +"\xEF\xB0\xB5" => "\x{0642}\x{0649}", # U+FC35 => 0642 0649 +"\xEF\xB0\xB6" => "\x{0642}\x{064A}", # U+FC36 => 0642 064A +"\xEF\xB0\xB7" => "\x{0643}\x{0627}", # U+FC37 => 0643 0627 +"\xEF\xB0\xB8" => "\x{0643}\x{062C}", # U+FC38 => 0643 062C +"\xEF\xB0\xB9" => "\x{0643}\x{062D}", # U+FC39 => 0643 062D +"\xEF\xB0\xBA" => "\x{0643}\x{062E}", # U+FC3A => 0643 062E +"\xEF\xB0\xBB" => "\x{0643}\x{0644}", # U+FC3B => 0643 0644 +"\xEF\xB0\xBC" => "\x{0643}\x{0645}", # U+FC3C => 0643 0645 +"\xEF\xB0\xBD" => "\x{0643}\x{0649}", # U+FC3D => 0643 0649 +"\xEF\xB0\xBE" => "\x{0643}\x{064A}", # U+FC3E => 0643 064A +"\xEF\xB0\xBF" => "\x{0644}\x{062C}", # U+FC3F => 0644 062C +"\xEF\xB1\x80" => "\x{0644}\x{062D}", # U+FC40 => 0644 062D +"\xEF\xB1\x81" => "\x{0644}\x{062E}", # U+FC41 => 0644 062E +"\xEF\xB1\x82" => "\x{0644}\x{0645}", # U+FC42 => 0644 0645 +"\xEF\xB1\x83" => "\x{0644}\x{0649}", # U+FC43 => 0644 0649 +"\xEF\xB1\x84" => "\x{0644}\x{064A}", # U+FC44 => 0644 064A +"\xEF\xB1\x85" => "\x{0645}\x{062C}", # U+FC45 => 0645 062C +"\xEF\xB1\x86" => "\x{0645}\x{062D}", # U+FC46 => 0645 062D +"\xEF\xB1\x87" => "\x{0645}\x{062E}", # U+FC47 => 0645 062E +"\xEF\xB1\x88" => "\x{0645}\x{0645}", # U+FC48 => 0645 0645 +"\xEF\xB1\x89" => "\x{0645}\x{0649}", # U+FC49 => 0645 0649 +"\xEF\xB1\x8A" => "\x{0645}\x{064A}", # U+FC4A => 0645 064A +"\xEF\xB1\x8B" => "\x{0646}\x{062C}", # U+FC4B => 0646 062C +"\xEF\xB1\x8C" => "\x{0646}\x{062D}", # U+FC4C => 0646 062D +"\xEF\xB1\x8D" => "\x{0646}\x{062E}", # U+FC4D => 0646 062E +"\xEF\xB1\x8E" => "\x{0646}\x{0645}", # U+FC4E => 0646 0645 +"\xEF\xB1\x8F" => "\x{0646}\x{0649}", # U+FC4F => 0646 0649 +"\xEF\xB1\x90" => "\x{0646}\x{064A}", # U+FC50 => 0646 064A +"\xEF\xB1\x91" => "\x{0647}\x{062C}", # U+FC51 => 0647 062C +"\xEF\xB1\x92" => "\x{0647}\x{0645}", # U+FC52 => 0647 0645 +"\xEF\xB1\x93" => "\x{0647}\x{0649}", # U+FC53 => 0647 0649 +"\xEF\xB1\x94" => "\x{0647}\x{064A}", # U+FC54 => 0647 064A +"\xEF\xB1\x95" => "\x{064A}\x{062C}", # U+FC55 => 064A 062C +"\xEF\xB1\x96" => "\x{064A}\x{062D}", # U+FC56 => 064A 062D +"\xEF\xB1\x97" => "\x{064A}\x{062E}", # U+FC57 => 064A 062E +"\xEF\xB1\x98" => "\x{064A}\x{0645}", # U+FC58 => 064A 0645 +"\xEF\xB1\x99" => "\x{064A}\x{0649}", # U+FC59 => 064A 0649 +"\xEF\xB1\x9A" => "\x{064A}\x{064A}", # U+FC5A => 064A 064A +"\xEF\xB1\x9B" => "\x{0630}\x{0670}", # U+FC5B => 0630 0670 +"\xEF\xB1\x9C" => "\x{0631}\x{0670}", # U+FC5C => 0631 0670 +"\xEF\xB1\x9D" => "\x{0649}\x{0670}", # U+FC5D => 0649 0670 +"\xEF\xB1\x9E" => "\x{0020}\x{064C}\x{0651}", # U+FC5E => 0020 064C 0651 +"\xEF\xB1\x9F" => "\x{0020}\x{064D}\x{0651}", # U+FC5F => 0020 064D 0651 +"\xEF\xB1\xA0" => "\x{0020}\x{064E}\x{0651}", # U+FC60 => 0020 064E 0651 +"\xEF\xB1\xA1" => "\x{0020}\x{064F}\x{0651}", # U+FC61 => 0020 064F 0651 +"\xEF\xB1\xA2" => "\x{0020}\x{0650}\x{0651}", # U+FC62 => 0020 0650 0651 +"\xEF\xB1\xA3" => "\x{0020}\x{0651}\x{0670}", # U+FC63 => 0020 0651 0670 +"\xEF\xB1\xA4" => "\x{0626}\x{0631}", # U+FC64 => 0626 0631 +"\xEF\xB1\xA5" => "\x{0626}\x{0632}", # U+FC65 => 0626 0632 +"\xEF\xB1\xA6" => "\x{0626}\x{0645}", # U+FC66 => 0626 0645 +"\xEF\xB1\xA7" => "\x{0626}\x{0646}", # U+FC67 => 0626 0646 +"\xEF\xB1\xA8" => "\x{0626}\x{0649}", # U+FC68 => 0626 0649 +"\xEF\xB1\xA9" => "\x{0626}\x{064A}", # U+FC69 => 0626 064A +"\xEF\xB1\xAA" => "\x{0628}\x{0631}", # U+FC6A => 0628 0631 +"\xEF\xB1\xAB" => "\x{0628}\x{0632}", # U+FC6B => 0628 0632 +"\xEF\xB1\xAC" => "\x{0628}\x{0645}", # U+FC6C => 0628 0645 +"\xEF\xB1\xAD" => "\x{0628}\x{0646}", # U+FC6D => 0628 0646 +"\xEF\xB1\xAE" => "\x{0628}\x{0649}", # U+FC6E => 0628 0649 +"\xEF\xB1\xAF" => "\x{0628}\x{064A}", # U+FC6F => 0628 064A +"\xEF\xB1\xB0" => "\x{062A}\x{0631}", # U+FC70 => 062A 0631 +"\xEF\xB1\xB1" => "\x{062A}\x{0632}", # U+FC71 => 062A 0632 +"\xEF\xB1\xB2" => "\x{062A}\x{0645}", # U+FC72 => 062A 0645 +"\xEF\xB1\xB3" => "\x{062A}\x{0646}", # U+FC73 => 062A 0646 +"\xEF\xB1\xB4" => "\x{062A}\x{0649}", # U+FC74 => 062A 0649 +"\xEF\xB1\xB5" => "\x{062A}\x{064A}", # U+FC75 => 062A 064A +"\xEF\xB1\xB6" => "\x{062B}\x{0631}", # U+FC76 => 062B 0631 +"\xEF\xB1\xB7" => "\x{062B}\x{0632}", # U+FC77 => 062B 0632 +"\xEF\xB1\xB8" => "\x{062B}\x{0645}", # U+FC78 => 062B 0645 +"\xEF\xB1\xB9" => "\x{062B}\x{0646}", # U+FC79 => 062B 0646 +"\xEF\xB1\xBA" => "\x{062B}\x{0649}", # U+FC7A => 062B 0649 +"\xEF\xB1\xBB" => "\x{062B}\x{064A}", # U+FC7B => 062B 064A +"\xEF\xB1\xBC" => "\x{0641}\x{0649}", # U+FC7C => 0641 0649 +"\xEF\xB1\xBD" => "\x{0641}\x{064A}", # U+FC7D => 0641 064A +"\xEF\xB1\xBE" => "\x{0642}\x{0649}", # U+FC7E => 0642 0649 +"\xEF\xB1\xBF" => "\x{0642}\x{064A}", # U+FC7F => 0642 064A +"\xEF\xB2\x80" => "\x{0643}\x{0627}", # U+FC80 => 0643 0627 +"\xEF\xB2\x81" => "\x{0643}\x{0644}", # U+FC81 => 0643 0644 +"\xEF\xB2\x82" => "\x{0643}\x{0645}", # U+FC82 => 0643 0645 +"\xEF\xB2\x83" => "\x{0643}\x{0649}", # U+FC83 => 0643 0649 +"\xEF\xB2\x84" => "\x{0643}\x{064A}", # U+FC84 => 0643 064A +"\xEF\xB2\x85" => "\x{0644}\x{0645}", # U+FC85 => 0644 0645 +"\xEF\xB2\x86" => "\x{0644}\x{0649}", # U+FC86 => 0644 0649 +"\xEF\xB2\x87" => "\x{0644}\x{064A}", # U+FC87 => 0644 064A +"\xEF\xB2\x88" => "\x{0645}\x{0627}", # U+FC88 => 0645 0627 +"\xEF\xB2\x89" => "\x{0645}\x{0645}", # U+FC89 => 0645 0645 +"\xEF\xB2\x8A" => "\x{0646}\x{0631}", # U+FC8A => 0646 0631 +"\xEF\xB2\x8B" => "\x{0646}\x{0632}", # U+FC8B => 0646 0632 +"\xEF\xB2\x8C" => "\x{0646}\x{0645}", # U+FC8C => 0646 0645 +"\xEF\xB2\x8D" => "\x{0646}\x{0646}", # U+FC8D => 0646 0646 +"\xEF\xB2\x8E" => "\x{0646}\x{0649}", # U+FC8E => 0646 0649 +"\xEF\xB2\x8F" => "\x{0646}\x{064A}", # U+FC8F => 0646 064A +"\xEF\xB2\x90" => "\x{0649}\x{0670}", # U+FC90 => 0649 0670 +"\xEF\xB2\x91" => "\x{064A}\x{0631}", # U+FC91 => 064A 0631 +"\xEF\xB2\x92" => "\x{064A}\x{0632}", # U+FC92 => 064A 0632 +"\xEF\xB2\x93" => "\x{064A}\x{0645}", # U+FC93 => 064A 0645 +"\xEF\xB2\x94" => "\x{064A}\x{0646}", # U+FC94 => 064A 0646 +"\xEF\xB2\x95" => "\x{064A}\x{0649}", # U+FC95 => 064A 0649 +"\xEF\xB2\x96" => "\x{064A}\x{064A}", # U+FC96 => 064A 064A +"\xEF\xB2\x97" => "\x{0626}\x{062C}", # U+FC97 => 0626 062C +"\xEF\xB2\x98" => "\x{0626}\x{062D}", # U+FC98 => 0626 062D +"\xEF\xB2\x99" => "\x{0626}\x{062E}", # U+FC99 => 0626 062E +"\xEF\xB2\x9A" => "\x{0626}\x{0645}", # U+FC9A => 0626 0645 +"\xEF\xB2\x9B" => "\x{0626}\x{0647}", # U+FC9B => 0626 0647 +"\xEF\xB2\x9C" => "\x{0628}\x{062C}", # U+FC9C => 0628 062C +"\xEF\xB2\x9D" => "\x{0628}\x{062D}", # U+FC9D => 0628 062D +"\xEF\xB2\x9E" => "\x{0628}\x{062E}", # U+FC9E => 0628 062E +"\xEF\xB2\x9F" => "\x{0628}\x{0645}", # U+FC9F => 0628 0645 +"\xEF\xB2\xA0" => "\x{0628}\x{0647}", # U+FCA0 => 0628 0647 +"\xEF\xB2\xA1" => "\x{062A}\x{062C}", # U+FCA1 => 062A 062C +"\xEF\xB2\xA2" => "\x{062A}\x{062D}", # U+FCA2 => 062A 062D +"\xEF\xB2\xA3" => "\x{062A}\x{062E}", # U+FCA3 => 062A 062E +"\xEF\xB2\xA4" => "\x{062A}\x{0645}", # U+FCA4 => 062A 0645 +"\xEF\xB2\xA5" => "\x{062A}\x{0647}", # U+FCA5 => 062A 0647 +"\xEF\xB2\xA6" => "\x{062B}\x{0645}", # U+FCA6 => 062B 0645 +"\xEF\xB2\xA7" => "\x{062C}\x{062D}", # U+FCA7 => 062C 062D +"\xEF\xB2\xA8" => "\x{062C}\x{0645}", # U+FCA8 => 062C 0645 +"\xEF\xB2\xA9" => "\x{062D}\x{062C}", # U+FCA9 => 062D 062C +"\xEF\xB2\xAA" => "\x{062D}\x{0645}", # U+FCAA => 062D 0645 +"\xEF\xB2\xAB" => "\x{062E}\x{062C}", # U+FCAB => 062E 062C +"\xEF\xB2\xAC" => "\x{062E}\x{0645}", # U+FCAC => 062E 0645 +"\xEF\xB2\xAD" => "\x{0633}\x{062C}", # U+FCAD => 0633 062C +"\xEF\xB2\xAE" => "\x{0633}\x{062D}", # U+FCAE => 0633 062D +"\xEF\xB2\xAF" => "\x{0633}\x{062E}", # U+FCAF => 0633 062E +"\xEF\xB2\xB0" => "\x{0633}\x{0645}", # U+FCB0 => 0633 0645 +"\xEF\xB2\xB1" => "\x{0635}\x{062D}", # U+FCB1 => 0635 062D +"\xEF\xB2\xB2" => "\x{0635}\x{062E}", # U+FCB2 => 0635 062E +"\xEF\xB2\xB3" => "\x{0635}\x{0645}", # U+FCB3 => 0635 0645 +"\xEF\xB2\xB4" => "\x{0636}\x{062C}", # U+FCB4 => 0636 062C +"\xEF\xB2\xB5" => "\x{0636}\x{062D}", # U+FCB5 => 0636 062D +"\xEF\xB2\xB6" => "\x{0636}\x{062E}", # U+FCB6 => 0636 062E +"\xEF\xB2\xB7" => "\x{0636}\x{0645}", # U+FCB7 => 0636 0645 +"\xEF\xB2\xB8" => "\x{0637}\x{062D}", # U+FCB8 => 0637 062D +"\xEF\xB2\xB9" => "\x{0638}\x{0645}", # U+FCB9 => 0638 0645 +"\xEF\xB2\xBA" => "\x{0639}\x{062C}", # U+FCBA => 0639 062C +"\xEF\xB2\xBB" => "\x{0639}\x{0645}", # U+FCBB => 0639 0645 +"\xEF\xB2\xBC" => "\x{063A}\x{062C}", # U+FCBC => 063A 062C +"\xEF\xB2\xBD" => "\x{063A}\x{0645}", # U+FCBD => 063A 0645 +"\xEF\xB2\xBE" => "\x{0641}\x{062C}", # U+FCBE => 0641 062C +"\xEF\xB2\xBF" => "\x{0641}\x{062D}", # U+FCBF => 0641 062D +"\xEF\xB3\x80" => "\x{0641}\x{062E}", # U+FCC0 => 0641 062E +"\xEF\xB3\x81" => "\x{0641}\x{0645}", # U+FCC1 => 0641 0645 +"\xEF\xB3\x82" => "\x{0642}\x{062D}", # U+FCC2 => 0642 062D +"\xEF\xB3\x83" => "\x{0642}\x{0645}", # U+FCC3 => 0642 0645 +"\xEF\xB3\x84" => "\x{0643}\x{062C}", # U+FCC4 => 0643 062C +"\xEF\xB3\x85" => "\x{0643}\x{062D}", # U+FCC5 => 0643 062D +"\xEF\xB3\x86" => "\x{0643}\x{062E}", # U+FCC6 => 0643 062E +"\xEF\xB3\x87" => "\x{0643}\x{0644}", # U+FCC7 => 0643 0644 +"\xEF\xB3\x88" => "\x{0643}\x{0645}", # U+FCC8 => 0643 0645 +"\xEF\xB3\x89" => "\x{0644}\x{062C}", # U+FCC9 => 0644 062C +"\xEF\xB3\x8A" => "\x{0644}\x{062D}", # U+FCCA => 0644 062D +"\xEF\xB3\x8B" => "\x{0644}\x{062E}", # U+FCCB => 0644 062E +"\xEF\xB3\x8C" => "\x{0644}\x{0645}", # U+FCCC => 0644 0645 +"\xEF\xB3\x8D" => "\x{0644}\x{0647}", # U+FCCD => 0644 0647 +"\xEF\xB3\x8E" => "\x{0645}\x{062C}", # U+FCCE => 0645 062C +"\xEF\xB3\x8F" => "\x{0645}\x{062D}", # U+FCCF => 0645 062D +"\xEF\xB3\x90" => "\x{0645}\x{062E}", # U+FCD0 => 0645 062E +"\xEF\xB3\x91" => "\x{0645}\x{0645}", # U+FCD1 => 0645 0645 +"\xEF\xB3\x92" => "\x{0646}\x{062C}", # U+FCD2 => 0646 062C +"\xEF\xB3\x93" => "\x{0646}\x{062D}", # U+FCD3 => 0646 062D +"\xEF\xB3\x94" => "\x{0646}\x{062E}", # U+FCD4 => 0646 062E +"\xEF\xB3\x95" => "\x{0646}\x{0645}", # U+FCD5 => 0646 0645 +"\xEF\xB3\x96" => "\x{0646}\x{0647}", # U+FCD6 => 0646 0647 +"\xEF\xB3\x97" => "\x{0647}\x{062C}", # U+FCD7 => 0647 062C +"\xEF\xB3\x98" => "\x{0647}\x{0645}", # U+FCD8 => 0647 0645 +"\xEF\xB3\x99" => "\x{0647}\x{0670}", # U+FCD9 => 0647 0670 +"\xEF\xB3\x9A" => "\x{064A}\x{062C}", # U+FCDA => 064A 062C +"\xEF\xB3\x9B" => "\x{064A}\x{062D}", # U+FCDB => 064A 062D +"\xEF\xB3\x9C" => "\x{064A}\x{062E}", # U+FCDC => 064A 062E +"\xEF\xB3\x9D" => "\x{064A}\x{0645}", # U+FCDD => 064A 0645 +"\xEF\xB3\x9E" => "\x{064A}\x{0647}", # U+FCDE => 064A 0647 +"\xEF\xB3\x9F" => "\x{0626}\x{0645}", # U+FCDF => 0626 0645 +"\xEF\xB3\xA0" => "\x{0626}\x{0647}", # U+FCE0 => 0626 0647 +"\xEF\xB3\xA1" => "\x{0628}\x{0645}", # U+FCE1 => 0628 0645 +"\xEF\xB3\xA2" => "\x{0628}\x{0647}", # U+FCE2 => 0628 0647 +"\xEF\xB3\xA3" => "\x{062A}\x{0645}", # U+FCE3 => 062A 0645 +"\xEF\xB3\xA4" => "\x{062A}\x{0647}", # U+FCE4 => 062A 0647 +"\xEF\xB3\xA5" => "\x{062B}\x{0645}", # U+FCE5 => 062B 0645 +"\xEF\xB3\xA6" => "\x{062B}\x{0647}", # U+FCE6 => 062B 0647 +"\xEF\xB3\xA7" => "\x{0633}\x{0645}", # U+FCE7 => 0633 0645 +"\xEF\xB3\xA8" => "\x{0633}\x{0647}", # U+FCE8 => 0633 0647 +"\xEF\xB3\xA9" => "\x{0634}\x{0645}", # U+FCE9 => 0634 0645 +"\xEF\xB3\xAA" => "\x{0634}\x{0647}", # U+FCEA => 0634 0647 +"\xEF\xB3\xAB" => "\x{0643}\x{0644}", # U+FCEB => 0643 0644 +"\xEF\xB3\xAC" => "\x{0643}\x{0645}", # U+FCEC => 0643 0645 +"\xEF\xB3\xAD" => "\x{0644}\x{0645}", # U+FCED => 0644 0645 +"\xEF\xB3\xAE" => "\x{0646}\x{0645}", # U+FCEE => 0646 0645 +"\xEF\xB3\xAF" => "\x{0646}\x{0647}", # U+FCEF => 0646 0647 +"\xEF\xB3\xB0" => "\x{064A}\x{0645}", # U+FCF0 => 064A 0645 +"\xEF\xB3\xB1" => "\x{064A}\x{0647}", # U+FCF1 => 064A 0647 +"\xEF\xB3\xB2" => "\x{0640}\x{064E}\x{0651}", # U+FCF2 => 0640 064E 0651 +"\xEF\xB3\xB3" => "\x{0640}\x{064F}\x{0651}", # U+FCF3 => 0640 064F 0651 +"\xEF\xB3\xB4" => "\x{0640}\x{0650}\x{0651}", # U+FCF4 => 0640 0650 0651 +"\xEF\xB3\xB5" => "\x{0637}\x{0649}", # U+FCF5 => 0637 0649 +"\xEF\xB3\xB6" => "\x{0637}\x{064A}", # U+FCF6 => 0637 064A +"\xEF\xB3\xB7" => "\x{0639}\x{0649}", # U+FCF7 => 0639 0649 +"\xEF\xB3\xB8" => "\x{0639}\x{064A}", # U+FCF8 => 0639 064A +"\xEF\xB3\xB9" => "\x{063A}\x{0649}", # U+FCF9 => 063A 0649 +"\xEF\xB3\xBA" => "\x{063A}\x{064A}", # U+FCFA => 063A 064A +"\xEF\xB3\xBB" => "\x{0633}\x{0649}", # U+FCFB => 0633 0649 +"\xEF\xB3\xBC" => "\x{0633}\x{064A}", # U+FCFC => 0633 064A +"\xEF\xB3\xBD" => "\x{0634}\x{0649}", # U+FCFD => 0634 0649 +"\xEF\xB3\xBE" => "\x{0634}\x{064A}", # U+FCFE => 0634 064A +"\xEF\xB3\xBF" => "\x{062D}\x{0649}", # U+FCFF => 062D 0649 +"\xEF\xB4\x80" => "\x{062D}\x{064A}", # U+FD00 => 062D 064A +"\xEF\xB4\x81" => "\x{062C}\x{0649}", # U+FD01 => 062C 0649 +"\xEF\xB4\x82" => "\x{062C}\x{064A}", # U+FD02 => 062C 064A +"\xEF\xB4\x83" => "\x{062E}\x{0649}", # U+FD03 => 062E 0649 +"\xEF\xB4\x84" => "\x{062E}\x{064A}", # U+FD04 => 062E 064A +"\xEF\xB4\x85" => "\x{0635}\x{0649}", # U+FD05 => 0635 0649 +"\xEF\xB4\x86" => "\x{0635}\x{064A}", # U+FD06 => 0635 064A +"\xEF\xB4\x87" => "\x{0636}\x{0649}", # U+FD07 => 0636 0649 +"\xEF\xB4\x88" => "\x{0636}\x{064A}", # U+FD08 => 0636 064A +"\xEF\xB4\x89" => "\x{0634}\x{062C}", # U+FD09 => 0634 062C +"\xEF\xB4\x8A" => "\x{0634}\x{062D}", # U+FD0A => 0634 062D +"\xEF\xB4\x8B" => "\x{0634}\x{062E}", # U+FD0B => 0634 062E +"\xEF\xB4\x8C" => "\x{0634}\x{0645}", # U+FD0C => 0634 0645 +"\xEF\xB4\x8D" => "\x{0634}\x{0631}", # U+FD0D => 0634 0631 +"\xEF\xB4\x8E" => "\x{0633}\x{0631}", # U+FD0E => 0633 0631 +"\xEF\xB4\x8F" => "\x{0635}\x{0631}", # U+FD0F => 0635 0631 +"\xEF\xB4\x90" => "\x{0636}\x{0631}", # U+FD10 => 0636 0631 +"\xEF\xB4\x91" => "\x{0637}\x{0649}", # U+FD11 => 0637 0649 +"\xEF\xB4\x92" => "\x{0637}\x{064A}", # U+FD12 => 0637 064A +"\xEF\xB4\x93" => "\x{0639}\x{0649}", # U+FD13 => 0639 0649 +"\xEF\xB4\x94" => "\x{0639}\x{064A}", # U+FD14 => 0639 064A +"\xEF\xB4\x95" => "\x{063A}\x{0649}", # U+FD15 => 063A 0649 +"\xEF\xB4\x96" => "\x{063A}\x{064A}", # U+FD16 => 063A 064A +"\xEF\xB4\x97" => "\x{0633}\x{0649}", # U+FD17 => 0633 0649 +"\xEF\xB4\x98" => "\x{0633}\x{064A}", # U+FD18 => 0633 064A +"\xEF\xB4\x99" => "\x{0634}\x{0649}", # U+FD19 => 0634 0649 +"\xEF\xB4\x9A" => "\x{0634}\x{064A}", # U+FD1A => 0634 064A +"\xEF\xB4\x9B" => "\x{062D}\x{0649}", # U+FD1B => 062D 0649 +"\xEF\xB4\x9C" => "\x{062D}\x{064A}", # U+FD1C => 062D 064A +"\xEF\xB4\x9D" => "\x{062C}\x{0649}", # U+FD1D => 062C 0649 +"\xEF\xB4\x9E" => "\x{062C}\x{064A}", # U+FD1E => 062C 064A +"\xEF\xB4\x9F" => "\x{062E}\x{0649}", # U+FD1F => 062E 0649 +"\xEF\xB4\xA0" => "\x{062E}\x{064A}", # U+FD20 => 062E 064A +"\xEF\xB4\xA1" => "\x{0635}\x{0649}", # U+FD21 => 0635 0649 +"\xEF\xB4\xA2" => "\x{0635}\x{064A}", # U+FD22 => 0635 064A +"\xEF\xB4\xA3" => "\x{0636}\x{0649}", # U+FD23 => 0636 0649 +"\xEF\xB4\xA4" => "\x{0636}\x{064A}", # U+FD24 => 0636 064A +"\xEF\xB4\xA5" => "\x{0634}\x{062C}", # U+FD25 => 0634 062C +"\xEF\xB4\xA6" => "\x{0634}\x{062D}", # U+FD26 => 0634 062D +"\xEF\xB4\xA7" => "\x{0634}\x{062E}", # U+FD27 => 0634 062E +"\xEF\xB4\xA8" => "\x{0634}\x{0645}", # U+FD28 => 0634 0645 +"\xEF\xB4\xA9" => "\x{0634}\x{0631}", # U+FD29 => 0634 0631 +"\xEF\xB4\xAA" => "\x{0633}\x{0631}", # U+FD2A => 0633 0631 +"\xEF\xB4\xAB" => "\x{0635}\x{0631}", # U+FD2B => 0635 0631 +"\xEF\xB4\xAC" => "\x{0636}\x{0631}", # U+FD2C => 0636 0631 +"\xEF\xB4\xAD" => "\x{0634}\x{062C}", # U+FD2D => 0634 062C +"\xEF\xB4\xAE" => "\x{0634}\x{062D}", # U+FD2E => 0634 062D +"\xEF\xB4\xAF" => "\x{0634}\x{062E}", # U+FD2F => 0634 062E +"\xEF\xB4\xB0" => "\x{0634}\x{0645}", # U+FD30 => 0634 0645 +"\xEF\xB4\xB1" => "\x{0633}\x{0647}", # U+FD31 => 0633 0647 +"\xEF\xB4\xB2" => "\x{0634}\x{0647}", # U+FD32 => 0634 0647 +"\xEF\xB4\xB3" => "\x{0637}\x{0645}", # U+FD33 => 0637 0645 +"\xEF\xB4\xB4" => "\x{0633}\x{062C}", # U+FD34 => 0633 062C +"\xEF\xB4\xB5" => "\x{0633}\x{062D}", # U+FD35 => 0633 062D +"\xEF\xB4\xB6" => "\x{0633}\x{062E}", # U+FD36 => 0633 062E +"\xEF\xB4\xB7" => "\x{0634}\x{062C}", # U+FD37 => 0634 062C +"\xEF\xB4\xB8" => "\x{0634}\x{062D}", # U+FD38 => 0634 062D +"\xEF\xB4\xB9" => "\x{0634}\x{062E}", # U+FD39 => 0634 062E +"\xEF\xB4\xBA" => "\x{0637}\x{0645}", # U+FD3A => 0637 0645 +"\xEF\xB4\xBB" => "\x{0638}\x{0645}", # U+FD3B => 0638 0645 +"\xEF\xB4\xBC" => "\x{0627}\x{064B}", # U+FD3C => 0627 064B +"\xEF\xB4\xBD" => "\x{0627}\x{064B}", # U+FD3D => 0627 064B +"\xEF\xB5\x90" => "\x{062A}\x{062C}\x{0645}", # U+FD50 => 062A 062C 0645 +"\xEF\xB5\x91" => "\x{062A}\x{062D}\x{062C}", # U+FD51 => 062A 062D 062C +"\xEF\xB5\x92" => "\x{062A}\x{062D}\x{062C}", # U+FD52 => 062A 062D 062C +"\xEF\xB5\x93" => "\x{062A}\x{062D}\x{0645}", # U+FD53 => 062A 062D 0645 +"\xEF\xB5\x94" => "\x{062A}\x{062E}\x{0645}", # U+FD54 => 062A 062E 0645 +"\xEF\xB5\x95" => "\x{062A}\x{0645}\x{062C}", # U+FD55 => 062A 0645 062C +"\xEF\xB5\x96" => "\x{062A}\x{0645}\x{062D}", # U+FD56 => 062A 0645 062D +"\xEF\xB5\x97" => "\x{062A}\x{0645}\x{062E}", # U+FD57 => 062A 0645 062E +"\xEF\xB5\x98" => "\x{062C}\x{0645}\x{062D}", # U+FD58 => 062C 0645 062D +"\xEF\xB5\x99" => "\x{062C}\x{0645}\x{062D}", # U+FD59 => 062C 0645 062D +"\xEF\xB5\x9A" => "\x{062D}\x{0645}\x{064A}", # U+FD5A => 062D 0645 064A +"\xEF\xB5\x9B" => "\x{062D}\x{0645}\x{0649}", # U+FD5B => 062D 0645 0649 +"\xEF\xB5\x9C" => "\x{0633}\x{062D}\x{062C}", # U+FD5C => 0633 062D 062C +"\xEF\xB5\x9D" => "\x{0633}\x{062C}\x{062D}", # U+FD5D => 0633 062C 062D +"\xEF\xB5\x9E" => "\x{0633}\x{062C}\x{0649}", # U+FD5E => 0633 062C 0649 +"\xEF\xB5\x9F" => "\x{0633}\x{0645}\x{062D}", # U+FD5F => 0633 0645 062D +"\xEF\xB5\xA0" => "\x{0633}\x{0645}\x{062D}", # U+FD60 => 0633 0645 062D +"\xEF\xB5\xA1" => "\x{0633}\x{0645}\x{062C}", # U+FD61 => 0633 0645 062C +"\xEF\xB5\xA2" => "\x{0633}\x{0645}\x{0645}", # U+FD62 => 0633 0645 0645 +"\xEF\xB5\xA3" => "\x{0633}\x{0645}\x{0645}", # U+FD63 => 0633 0645 0645 +"\xEF\xB5\xA4" => "\x{0635}\x{062D}\x{062D}", # U+FD64 => 0635 062D 062D +"\xEF\xB5\xA5" => "\x{0635}\x{062D}\x{062D}", # U+FD65 => 0635 062D 062D +"\xEF\xB5\xA6" => "\x{0635}\x{0645}\x{0645}", # U+FD66 => 0635 0645 0645 +"\xEF\xB5\xA7" => "\x{0634}\x{062D}\x{0645}", # U+FD67 => 0634 062D 0645 +"\xEF\xB5\xA8" => "\x{0634}\x{062D}\x{0645}", # U+FD68 => 0634 062D 0645 +"\xEF\xB5\xA9" => "\x{0634}\x{062C}\x{064A}", # U+FD69 => 0634 062C 064A +"\xEF\xB5\xAA" => "\x{0634}\x{0645}\x{062E}", # U+FD6A => 0634 0645 062E +"\xEF\xB5\xAB" => "\x{0634}\x{0645}\x{062E}", # U+FD6B => 0634 0645 062E +"\xEF\xB5\xAC" => "\x{0634}\x{0645}\x{0645}", # U+FD6C => 0634 0645 0645 +"\xEF\xB5\xAD" => "\x{0634}\x{0645}\x{0645}", # U+FD6D => 0634 0645 0645 +"\xEF\xB5\xAE" => "\x{0636}\x{062D}\x{0649}", # U+FD6E => 0636 062D 0649 +"\xEF\xB5\xAF" => "\x{0636}\x{062E}\x{0645}", # U+FD6F => 0636 062E 0645 +"\xEF\xB5\xB0" => "\x{0636}\x{062E}\x{0645}", # U+FD70 => 0636 062E 0645 +"\xEF\xB5\xB1" => "\x{0637}\x{0645}\x{062D}", # U+FD71 => 0637 0645 062D +"\xEF\xB5\xB2" => "\x{0637}\x{0645}\x{062D}", # U+FD72 => 0637 0645 062D +"\xEF\xB5\xB3" => "\x{0637}\x{0645}\x{0645}", # U+FD73 => 0637 0645 0645 +"\xEF\xB5\xB4" => "\x{0637}\x{0645}\x{064A}", # U+FD74 => 0637 0645 064A +"\xEF\xB5\xB5" => "\x{0639}\x{062C}\x{0645}", # U+FD75 => 0639 062C 0645 +"\xEF\xB5\xB6" => "\x{0639}\x{0645}\x{0645}", # U+FD76 => 0639 0645 0645 +"\xEF\xB5\xB7" => "\x{0639}\x{0645}\x{0645}", # U+FD77 => 0639 0645 0645 +"\xEF\xB5\xB8" => "\x{0639}\x{0645}\x{0649}", # U+FD78 => 0639 0645 0649 +"\xEF\xB5\xB9" => "\x{063A}\x{0645}\x{0645}", # U+FD79 => 063A 0645 0645 +"\xEF\xB5\xBA" => "\x{063A}\x{0645}\x{064A}", # U+FD7A => 063A 0645 064A +"\xEF\xB5\xBB" => "\x{063A}\x{0645}\x{0649}", # U+FD7B => 063A 0645 0649 +"\xEF\xB5\xBC" => "\x{0641}\x{062E}\x{0645}", # U+FD7C => 0641 062E 0645 +"\xEF\xB5\xBD" => "\x{0641}\x{062E}\x{0645}", # U+FD7D => 0641 062E 0645 +"\xEF\xB5\xBE" => "\x{0642}\x{0645}\x{062D}", # U+FD7E => 0642 0645 062D +"\xEF\xB5\xBF" => "\x{0642}\x{0645}\x{0645}", # U+FD7F => 0642 0645 0645 +"\xEF\xB6\x80" => "\x{0644}\x{062D}\x{0645}", # U+FD80 => 0644 062D 0645 +"\xEF\xB6\x81" => "\x{0644}\x{062D}\x{064A}", # U+FD81 => 0644 062D 064A +"\xEF\xB6\x82" => "\x{0644}\x{062D}\x{0649}", # U+FD82 => 0644 062D 0649 +"\xEF\xB6\x83" => "\x{0644}\x{062C}\x{062C}", # U+FD83 => 0644 062C 062C +"\xEF\xB6\x84" => "\x{0644}\x{062C}\x{062C}", # U+FD84 => 0644 062C 062C +"\xEF\xB6\x85" => "\x{0644}\x{062E}\x{0645}", # U+FD85 => 0644 062E 0645 +"\xEF\xB6\x86" => "\x{0644}\x{062E}\x{0645}", # U+FD86 => 0644 062E 0645 +"\xEF\xB6\x87" => "\x{0644}\x{0645}\x{062D}", # U+FD87 => 0644 0645 062D +"\xEF\xB6\x88" => "\x{0644}\x{0645}\x{062D}", # U+FD88 => 0644 0645 062D +"\xEF\xB6\x89" => "\x{0645}\x{062D}\x{062C}", # U+FD89 => 0645 062D 062C +"\xEF\xB6\x8A" => "\x{0645}\x{062D}\x{0645}", # U+FD8A => 0645 062D 0645 +"\xEF\xB6\x8B" => "\x{0645}\x{062D}\x{064A}", # U+FD8B => 0645 062D 064A +"\xEF\xB6\x8C" => "\x{0645}\x{062C}\x{062D}", # U+FD8C => 0645 062C 062D +"\xEF\xB6\x8D" => "\x{0645}\x{062C}\x{0645}", # U+FD8D => 0645 062C 0645 +"\xEF\xB6\x8E" => "\x{0645}\x{062E}\x{062C}", # U+FD8E => 0645 062E 062C +"\xEF\xB6\x8F" => "\x{0645}\x{062E}\x{0645}", # U+FD8F => 0645 062E 0645 +"\xEF\xB6\x92" => "\x{0645}\x{062C}\x{062E}", # U+FD92 => 0645 062C 062E +"\xEF\xB6\x93" => "\x{0647}\x{0645}\x{062C}", # U+FD93 => 0647 0645 062C +"\xEF\xB6\x94" => "\x{0647}\x{0645}\x{0645}", # U+FD94 => 0647 0645 0645 +"\xEF\xB6\x95" => "\x{0646}\x{062D}\x{0645}", # U+FD95 => 0646 062D 0645 +"\xEF\xB6\x96" => "\x{0646}\x{062D}\x{0649}", # U+FD96 => 0646 062D 0649 +"\xEF\xB6\x97" => "\x{0646}\x{062C}\x{0645}", # U+FD97 => 0646 062C 0645 +"\xEF\xB6\x98" => "\x{0646}\x{062C}\x{0645}", # U+FD98 => 0646 062C 0645 +"\xEF\xB6\x99" => "\x{0646}\x{062C}\x{0649}", # U+FD99 => 0646 062C 0649 +"\xEF\xB6\x9A" => "\x{0646}\x{0645}\x{064A}", # U+FD9A => 0646 0645 064A +"\xEF\xB6\x9B" => "\x{0646}\x{0645}\x{0649}", # U+FD9B => 0646 0645 0649 +"\xEF\xB6\x9C" => "\x{064A}\x{0645}\x{0645}", # U+FD9C => 064A 0645 0645 +"\xEF\xB6\x9D" => "\x{064A}\x{0645}\x{0645}", # U+FD9D => 064A 0645 0645 +"\xEF\xB6\x9E" => "\x{0628}\x{062E}\x{064A}", # U+FD9E => 0628 062E 064A +"\xEF\xB6\x9F" => "\x{062A}\x{062C}\x{064A}", # U+FD9F => 062A 062C 064A +"\xEF\xB6\xA0" => "\x{062A}\x{062C}\x{0649}", # U+FDA0 => 062A 062C 0649 +"\xEF\xB6\xA1" => "\x{062A}\x{062E}\x{064A}", # U+FDA1 => 062A 062E 064A +"\xEF\xB6\xA2" => "\x{062A}\x{062E}\x{0649}", # U+FDA2 => 062A 062E 0649 +"\xEF\xB6\xA3" => "\x{062A}\x{0645}\x{064A}", # U+FDA3 => 062A 0645 064A +"\xEF\xB6\xA4" => "\x{062A}\x{0645}\x{0649}", # U+FDA4 => 062A 0645 0649 +"\xEF\xB6\xA5" => "\x{062C}\x{0645}\x{064A}", # U+FDA5 => 062C 0645 064A +"\xEF\xB6\xA6" => "\x{062C}\x{062D}\x{0649}", # U+FDA6 => 062C 062D 0649 +"\xEF\xB6\xA7" => "\x{062C}\x{0645}\x{0649}", # U+FDA7 => 062C 0645 0649 +"\xEF\xB6\xA8" => "\x{0633}\x{062E}\x{0649}", # U+FDA8 => 0633 062E 0649 +"\xEF\xB6\xA9" => "\x{0635}\x{062D}\x{064A}", # U+FDA9 => 0635 062D 064A +"\xEF\xB6\xAA" => "\x{0634}\x{062D}\x{064A}", # U+FDAA => 0634 062D 064A +"\xEF\xB6\xAB" => "\x{0636}\x{062D}\x{064A}", # U+FDAB => 0636 062D 064A +"\xEF\xB6\xAC" => "\x{0644}\x{062C}\x{064A}", # U+FDAC => 0644 062C 064A +"\xEF\xB6\xAD" => "\x{0644}\x{0645}\x{064A}", # U+FDAD => 0644 0645 064A +"\xEF\xB6\xAE" => "\x{064A}\x{062D}\x{064A}", # U+FDAE => 064A 062D 064A +"\xEF\xB6\xAF" => "\x{064A}\x{062C}\x{064A}", # U+FDAF => 064A 062C 064A +"\xEF\xB6\xB0" => "\x{064A}\x{0645}\x{064A}", # U+FDB0 => 064A 0645 064A +"\xEF\xB6\xB1" => "\x{0645}\x{0645}\x{064A}", # U+FDB1 => 0645 0645 064A +"\xEF\xB6\xB2" => "\x{0642}\x{0645}\x{064A}", # U+FDB2 => 0642 0645 064A +"\xEF\xB6\xB3" => "\x{0646}\x{062D}\x{064A}", # U+FDB3 => 0646 062D 064A +"\xEF\xB6\xB4" => "\x{0642}\x{0645}\x{062D}", # U+FDB4 => 0642 0645 062D +"\xEF\xB6\xB5" => "\x{0644}\x{062D}\x{0645}", # U+FDB5 => 0644 062D 0645 +"\xEF\xB6\xB6" => "\x{0639}\x{0645}\x{064A}", # U+FDB6 => 0639 0645 064A +"\xEF\xB6\xB7" => "\x{0643}\x{0645}\x{064A}", # U+FDB7 => 0643 0645 064A +"\xEF\xB6\xB8" => "\x{0646}\x{062C}\x{062D}", # U+FDB8 => 0646 062C 062D +"\xEF\xB6\xB9" => "\x{0645}\x{062E}\x{064A}", # U+FDB9 => 0645 062E 064A +"\xEF\xB6\xBA" => "\x{0644}\x{062C}\x{0645}", # U+FDBA => 0644 062C 0645 +"\xEF\xB6\xBB" => "\x{0643}\x{0645}\x{0645}", # U+FDBB => 0643 0645 0645 +"\xEF\xB6\xBC" => "\x{0644}\x{062C}\x{0645}", # U+FDBC => 0644 062C 0645 +"\xEF\xB6\xBD" => "\x{0646}\x{062C}\x{062D}", # U+FDBD => 0646 062C 062D +"\xEF\xB6\xBE" => "\x{062C}\x{062D}\x{064A}", # U+FDBE => 062C 062D 064A +"\xEF\xB6\xBF" => "\x{062D}\x{062C}\x{064A}", # U+FDBF => 062D 062C 064A +"\xEF\xB7\x80" => "\x{0645}\x{062C}\x{064A}", # U+FDC0 => 0645 062C 064A +"\xEF\xB7\x81" => "\x{0641}\x{0645}\x{064A}", # U+FDC1 => 0641 0645 064A +"\xEF\xB7\x82" => "\x{0628}\x{062D}\x{064A}", # U+FDC2 => 0628 062D 064A +"\xEF\xB7\x83" => "\x{0643}\x{0645}\x{0645}", # U+FDC3 => 0643 0645 0645 +"\xEF\xB7\x84" => "\x{0639}\x{062C}\x{0645}", # U+FDC4 => 0639 062C 0645 +"\xEF\xB7\x85" => "\x{0635}\x{0645}\x{0645}", # U+FDC5 => 0635 0645 0645 +"\xEF\xB7\x86" => "\x{0633}\x{062E}\x{064A}", # U+FDC6 => 0633 062E 064A +"\xEF\xB7\x87" => "\x{0646}\x{062C}\x{064A}", # U+FDC7 => 0646 062C 064A +"\xEF\xB7\xB0" => "\x{0635}\x{0644}\x{06D2}", # U+FDF0 => 0635 0644 06D2 +"\xEF\xB7\xB1" => "\x{0642}\x{0644}\x{06D2}", # U+FDF1 => 0642 0644 06D2 +"\xEF\xB7\xB2" => "\x{0627}\x{0644}\x{0644}\x{0647}", # U+FDF2 => 0627 0644 0644 0647 +"\xEF\xB7\xB3" => "\x{0627}\x{0643}\x{0628}\x{0631}", # U+FDF3 => 0627 0643 0628 0631 +"\xEF\xB7\xB4" => "\x{0645}\x{062D}\x{0645}\x{062F}", # U+FDF4 => 0645 062D 0645 062F +"\xEF\xB7\xB5" => "\x{0635}\x{0644}\x{0639}\x{0645}", # U+FDF5 => 0635 0644 0639 0645 +"\xEF\xB7\xB6" => "\x{0631}\x{0633}\x{0648}\x{0644}", # U+FDF6 => 0631 0633 0648 0644 +"\xEF\xB7\xB7" => "\x{0639}\x{0644}\x{064A}\x{0647}", # U+FDF7 => 0639 0644 064A 0647 +"\xEF\xB7\xB8" => "\x{0648}\x{0633}\x{0644}\x{0645}", # U+FDF8 => 0648 0633 0644 0645 +"\xEF\xB7\xB9" => "\x{0635}\x{0644}\x{0649}", # U+FDF9 => 0635 0644 0649 +"\xEF\xB7\xBA" => "\x{0635}\x{0644}\x{0649}\x{0020}\x{0627}\x{0644}\x{0644}\x{0647}\x{0020}\x{0639}\x{0644}\x{064A}\x{0647}\x{0020}\x{0648}\x{0633}\x{0644}\x{0645}", # U+FDFA => 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645 +"\xEF\xB7\xBB" => "\x{062C}\x{0644}\x{0020}\x{062C}\x{0644}\x{0627}\x{0644}\x{0647}", # U+FDFB => 062C 0644 0020 062C 0644 0627 0644 0647 +"\xEF\xB7\xBC" => "\x{0631}\x{06CC}\x{0627}\x{0644}", # U+FDFC => 0631 06CC 0627 0644 +"\xEF\xB8\x80" => "", # U+FE00 => +"\xEF\xB8\x81" => "", # U+FE01 => +"\xEF\xB8\x82" => "", # U+FE02 => +"\xEF\xB8\x83" => "", # U+FE03 => +"\xEF\xB8\x84" => "", # U+FE04 => +"\xEF\xB8\x85" => "", # U+FE05 => +"\xEF\xB8\x86" => "", # U+FE06 => +"\xEF\xB8\x87" => "", # U+FE07 => +"\xEF\xB8\x88" => "", # U+FE08 => +"\xEF\xB8\x89" => "", # U+FE09 => +"\xEF\xB8\x8A" => "", # U+FE0A => +"\xEF\xB8\x8B" => "", # U+FE0B => +"\xEF\xB8\x8C" => "", # U+FE0C => +"\xEF\xB8\x8D" => "", # U+FE0D => +"\xEF\xB8\x8E" => "", # U+FE0E => +"\xEF\xB8\x8F" => "", # U+FE0F => +"\xEF\xB8\x99" => "\x{002E}\x{002E}\x{002E}", # U+FE19 => 002E 002E 002E +"\xEF\xB8\xB0" => "\x{002E}\x{002E}", # U+FE30 => 002E 002E +"\xEF\xB9\x89" => "\x{0020}\x{0305}", # U+FE49 => 0020 0305 +"\xEF\xB9\x8A" => "\x{0020}\x{0305}", # U+FE4A => 0020 0305 +"\xEF\xB9\x8B" => "\x{0020}\x{0305}", # U+FE4B => 0020 0305 +"\xEF\xB9\x8C" => "\x{0020}\x{0305}", # U+FE4C => 0020 0305 +"\xEF\xB9\xB0" => "\x{0020}\x{064B}", # U+FE70 => 0020 064B +"\xEF\xB9\xB1" => "\x{0640}\x{064B}", # U+FE71 => 0640 064B +"\xEF\xB9\xB2" => "\x{0020}\x{064C}", # U+FE72 => 0020 064C +"\xEF\xB9\xB4" => "\x{0020}\x{064D}", # U+FE74 => 0020 064D +"\xEF\xB9\xB6" => "\x{0020}\x{064E}", # U+FE76 => 0020 064E +"\xEF\xB9\xB7" => "\x{0640}\x{064E}", # U+FE77 => 0640 064E +"\xEF\xB9\xB8" => "\x{0020}\x{064F}", # U+FE78 => 0020 064F +"\xEF\xB9\xB9" => "\x{0640}\x{064F}", # U+FE79 => 0640 064F +"\xEF\xB9\xBA" => "\x{0020}\x{0650}", # U+FE7A => 0020 0650 +"\xEF\xB9\xBB" => "\x{0640}\x{0650}", # U+FE7B => 0640 0650 +"\xEF\xB9\xBC" => "\x{0020}\x{0651}", # U+FE7C => 0020 0651 +"\xEF\xB9\xBD" => "\x{0640}\x{0651}", # U+FE7D => 0640 0651 +"\xEF\xB9\xBE" => "\x{0020}\x{0652}", # U+FE7E => 0020 0652 +"\xEF\xB9\xBF" => "\x{0640}\x{0652}", # U+FE7F => 0640 0652 +"\xEF\xBB\xB5" => "\x{0644}\x{0622}", # U+FEF5 => 0644 0622 +"\xEF\xBB\xB6" => "\x{0644}\x{0622}", # U+FEF6 => 0644 0622 +"\xEF\xBB\xB7" => "\x{0644}\x{0623}", # U+FEF7 => 0644 0623 +"\xEF\xBB\xB8" => "\x{0644}\x{0623}", # U+FEF8 => 0644 0623 +"\xEF\xBB\xB9" => "\x{0644}\x{0625}", # U+FEF9 => 0644 0625 +"\xEF\xBB\xBA" => "\x{0644}\x{0625}", # U+FEFA => 0644 0625 +"\xEF\xBB\xBB" => "\x{0644}\x{0627}", # U+FEFB => 0644 0627 +"\xEF\xBB\xBC" => "\x{0644}\x{0627}", # U+FEFC => 0644 0627 +"\xEF\xBB\xBF" => "", # U+FEFF => +"\xEF\xBE\xA0" => "", # U+FFA0 => +"\xEF\xBF\xA3" => "\x{0020}\x{0304}", # U+FFE3 => 0020 0304 +"\xEF\xBF\xB0" => "", # U+FFF0 => +"\xEF\xBF\xB1" => "", # U+FFF1 => +"\xEF\xBF\xB2" => "", # U+FFF2 => +"\xEF\xBF\xB3" => "", # U+FFF3 => +"\xEF\xBF\xB4" => "", # U+FFF4 => +"\xEF\xBF\xB5" => "", # U+FFF5 => +"\xEF\xBF\xB6" => "", # U+FFF6 => +"\xEF\xBF\xB7" => "", # U+FFF7 => +"\xEF\xBF\xB8" => "", # U+FFF8 => +"\xF0\x9B\xB2\xA0" => "", # U+1BCA0 => +"\xF0\x9B\xB2\xA1" => "", # U+1BCA1 => +"\xF0\x9B\xB2\xA2" => "", # U+1BCA2 => +"\xF0\x9B\xB2\xA3" => "", # U+1BCA3 => +"\xF0\x9D\x85\x9E" => "\x{1D157}\x{1D165}", # U+1D15E => 1D157 1D165 +"\xF0\x9D\x85\x9F" => "\x{1D158}\x{1D165}", # U+1D15F => 1D158 1D165 +"\xF0\x9D\x85\xA0" => "\x{1D158}\x{1D165}\x{1D16E}", # U+1D160 => 1D158 1D165 1D16E +"\xF0\x9D\x85\xA1" => "\x{1D158}\x{1D165}\x{1D16F}", # U+1D161 => 1D158 1D165 1D16F +"\xF0\x9D\x85\xA2" => "\x{1D158}\x{1D165}\x{1D170}", # U+1D162 => 1D158 1D165 1D170 +"\xF0\x9D\x85\xA3" => "\x{1D158}\x{1D165}\x{1D171}", # U+1D163 => 1D158 1D165 1D171 +"\xF0\x9D\x85\xA4" => "\x{1D158}\x{1D165}\x{1D172}", # U+1D164 => 1D158 1D165 1D172 +"\xF0\x9D\x85\xB3" => "", # U+1D173 => +"\xF0\x9D\x85\xB4" => "", # U+1D174 => +"\xF0\x9D\x85\xB5" => "", # U+1D175 => +"\xF0\x9D\x85\xB6" => "", # U+1D176 => +"\xF0\x9D\x85\xB7" => "", # U+1D177 => +"\xF0\x9D\x85\xB8" => "", # U+1D178 => +"\xF0\x9D\x85\xB9" => "", # U+1D179 => +"\xF0\x9D\x85\xBA" => "", # U+1D17A => +"\xF0\x9D\x86\xBB" => "\x{1D1B9}\x{1D165}", # U+1D1BB => 1D1B9 1D165 +"\xF0\x9D\x86\xBC" => "\x{1D1BA}\x{1D165}", # U+1D1BC => 1D1BA 1D165 +"\xF0\x9D\x86\xBD" => "\x{1D1B9}\x{1D165}\x{1D16E}", # U+1D1BD => 1D1B9 1D165 1D16E +"\xF0\x9D\x86\xBE" => "\x{1D1BA}\x{1D165}\x{1D16E}", # U+1D1BE => 1D1BA 1D165 1D16E +"\xF0\x9D\x86\xBF" => "\x{1D1B9}\x{1D165}\x{1D16F}", # U+1D1BF => 1D1B9 1D165 1D16F +"\xF0\x9D\x87\x80" => "\x{1D1BA}\x{1D165}\x{1D16F}", # U+1D1C0 => 1D1BA 1D165 1D16F +"\xF0\x9F\x84\x80" => "\x{0030}\x{002E}", # U+1F100 => 0030 002E +"\xF0\x9F\x84\x81" => "\x{0030}\x{002C}", # U+1F101 => 0030 002C +"\xF0\x9F\x84\x82" => "\x{0031}\x{002C}", # U+1F102 => 0031 002C +"\xF0\x9F\x84\x83" => "\x{0032}\x{002C}", # U+1F103 => 0032 002C +"\xF0\x9F\x84\x84" => "\x{0033}\x{002C}", # U+1F104 => 0033 002C +"\xF0\x9F\x84\x85" => "\x{0034}\x{002C}", # U+1F105 => 0034 002C +"\xF0\x9F\x84\x86" => "\x{0035}\x{002C}", # U+1F106 => 0035 002C +"\xF0\x9F\x84\x87" => "\x{0036}\x{002C}", # U+1F107 => 0036 002C +"\xF0\x9F\x84\x88" => "\x{0037}\x{002C}", # U+1F108 => 0037 002C +"\xF0\x9F\x84\x89" => "\x{0038}\x{002C}", # U+1F109 => 0038 002C +"\xF0\x9F\x84\x8A" => "\x{0039}\x{002C}", # U+1F10A => 0039 002C +"\xF0\x9F\x84\x90" => "\x{0028}\x{0061}\x{0029}", # U+1F110 => 0028 0061 0029 +"\xF0\x9F\x84\x91" => "\x{0028}\x{0062}\x{0029}", # U+1F111 => 0028 0062 0029 +"\xF0\x9F\x84\x92" => "\x{0028}\x{0063}\x{0029}", # U+1F112 => 0028 0063 0029 +"\xF0\x9F\x84\x93" => "\x{0028}\x{0064}\x{0029}", # U+1F113 => 0028 0064 0029 +"\xF0\x9F\x84\x94" => "\x{0028}\x{0065}\x{0029}", # U+1F114 => 0028 0065 0029 +"\xF0\x9F\x84\x95" => "\x{0028}\x{0066}\x{0029}", # U+1F115 => 0028 0066 0029 +"\xF0\x9F\x84\x96" => "\x{0028}\x{0067}\x{0029}", # U+1F116 => 0028 0067 0029 +"\xF0\x9F\x84\x97" => "\x{0028}\x{0068}\x{0029}", # U+1F117 => 0028 0068 0029 +"\xF0\x9F\x84\x98" => "\x{0028}\x{0069}\x{0029}", # U+1F118 => 0028 0069 0029 +"\xF0\x9F\x84\x99" => "\x{0028}\x{006A}\x{0029}", # U+1F119 => 0028 006A 0029 +"\xF0\x9F\x84\x9A" => "\x{0028}\x{006B}\x{0029}", # U+1F11A => 0028 006B 0029 +"\xF0\x9F\x84\x9B" => "\x{0028}\x{006C}\x{0029}", # U+1F11B => 0028 006C 0029 +"\xF0\x9F\x84\x9C" => "\x{0028}\x{006D}\x{0029}", # U+1F11C => 0028 006D 0029 +"\xF0\x9F\x84\x9D" => "\x{0028}\x{006E}\x{0029}", # U+1F11D => 0028 006E 0029 +"\xF0\x9F\x84\x9E" => "\x{0028}\x{006F}\x{0029}", # U+1F11E => 0028 006F 0029 +"\xF0\x9F\x84\x9F" => "\x{0028}\x{0070}\x{0029}", # U+1F11F => 0028 0070 0029 +"\xF0\x9F\x84\xA0" => "\x{0028}\x{0071}\x{0029}", # U+1F120 => 0028 0071 0029 +"\xF0\x9F\x84\xA1" => "\x{0028}\x{0072}\x{0029}", # U+1F121 => 0028 0072 0029 +"\xF0\x9F\x84\xA2" => "\x{0028}\x{0073}\x{0029}", # U+1F122 => 0028 0073 0029 +"\xF0\x9F\x84\xA3" => "\x{0028}\x{0074}\x{0029}", # U+1F123 => 0028 0074 0029 +"\xF0\x9F\x84\xA4" => "\x{0028}\x{0075}\x{0029}", # U+1F124 => 0028 0075 0029 +"\xF0\x9F\x84\xA5" => "\x{0028}\x{0076}\x{0029}", # U+1F125 => 0028 0076 0029 +"\xF0\x9F\x84\xA6" => "\x{0028}\x{0077}\x{0029}", # U+1F126 => 0028 0077 0029 +"\xF0\x9F\x84\xA7" => "\x{0028}\x{0078}\x{0029}", # U+1F127 => 0028 0078 0029 +"\xF0\x9F\x84\xA8" => "\x{0028}\x{0079}\x{0029}", # U+1F128 => 0028 0079 0029 +"\xF0\x9F\x84\xA9" => "\x{0028}\x{007A}\x{0029}", # U+1F129 => 0028 007A 0029 +"\xF0\x9F\x84\xAA" => "\x{3014}\x{0073}\x{3015}", # U+1F12A => 3014 0073 3015 +"\xF0\x9F\x84\xAD" => "\x{0063}\x{0064}", # U+1F12D => 0063 0064 +"\xF0\x9F\x84\xAE" => "\x{0077}\x{007A}", # U+1F12E => 0077 007A +"\xF0\x9F\x85\x8A" => "\x{0068}\x{0076}", # U+1F14A => 0068 0076 +"\xF0\x9F\x85\x8B" => "\x{006D}\x{0076}", # U+1F14B => 006D 0076 +"\xF0\x9F\x85\x8C" => "\x{0073}\x{0064}", # U+1F14C => 0073 0064 +"\xF0\x9F\x85\x8D" => "\x{0073}\x{0073}", # U+1F14D => 0073 0073 +"\xF0\x9F\x85\x8E" => "\x{0070}\x{0070}\x{0076}", # U+1F14E => 0070 0070 0076 +"\xF0\x9F\x85\x8F" => "\x{0077}\x{0063}", # U+1F14F => 0077 0063 +"\xF0\x9F\x85\xAA" => "\x{006D}\x{0063}", # U+1F16A => 006D 0063 +"\xF0\x9F\x85\xAB" => "\x{006D}\x{0064}", # U+1F16B => 006D 0064 +"\xF0\x9F\x86\x90" => "\x{0064}\x{006A}", # U+1F190 => 0064 006A +"\xF0\x9F\x88\x80" => "\x{307B}\x{304B}", # U+1F200 => 307B 304B +"\xF0\x9F\x88\x81" => "\x{30B3}\x{30B3}", # U+1F201 => 30B3 30B3 +"\xF0\x9F\x89\x80" => "\x{3014}\x{672C}\x{3015}", # U+1F240 => 3014 672C 3015 +"\xF0\x9F\x89\x81" => "\x{3014}\x{4E09}\x{3015}", # U+1F241 => 3014 4E09 3015 +"\xF0\x9F\x89\x82" => "\x{3014}\x{4E8C}\x{3015}", # U+1F242 => 3014 4E8C 3015 +"\xF0\x9F\x89\x83" => "\x{3014}\x{5B89}\x{3015}", # U+1F243 => 3014 5B89 3015 +"\xF0\x9F\x89\x84" => "\x{3014}\x{70B9}\x{3015}", # U+1F244 => 3014 70B9 3015 +"\xF0\x9F\x89\x85" => "\x{3014}\x{6253}\x{3015}", # U+1F245 => 3014 6253 3015 +"\xF0\x9F\x89\x86" => "\x{3014}\x{76D7}\x{3015}", # U+1F246 => 3014 76D7 3015 +"\xF0\x9F\x89\x87" => "\x{3014}\x{52DD}\x{3015}", # U+1F247 => 3014 52DD 3015 +"\xF0\x9F\x89\x88" => "\x{3014}\x{6557}\x{3015}", # U+1F248 => 3014 6557 3015 +"\xF3\xA0\x80\x80" => "", # U+E0000 => +"\xF3\xA0\x80\x81" => "", # U+E0001 => +"\xF3\xA0\x80\x82" => "", # U+E0002 => +"\xF3\xA0\x80\x83" => "", # U+E0003 => +"\xF3\xA0\x80\x84" => "", # U+E0004 => +"\xF3\xA0\x80\x85" => "", # U+E0005 => +"\xF3\xA0\x80\x86" => "", # U+E0006 => +"\xF3\xA0\x80\x87" => "", # U+E0007 => +"\xF3\xA0\x80\x88" => "", # U+E0008 => +"\xF3\xA0\x80\x89" => "", # U+E0009 => +"\xF3\xA0\x80\x8A" => "", # U+E000A => +"\xF3\xA0\x80\x8B" => "", # U+E000B => +"\xF3\xA0\x80\x8C" => "", # U+E000C => +"\xF3\xA0\x80\x8D" => "", # U+E000D => +"\xF3\xA0\x80\x8E" => "", # U+E000E => +"\xF3\xA0\x80\x8F" => "", # U+E000F => +"\xF3\xA0\x80\x90" => "", # U+E0010 => +"\xF3\xA0\x80\x91" => "", # U+E0011 => +"\xF3\xA0\x80\x92" => "", # U+E0012 => +"\xF3\xA0\x80\x93" => "", # U+E0013 => +"\xF3\xA0\x80\x94" => "", # U+E0014 => +"\xF3\xA0\x80\x95" => "", # U+E0015 => +"\xF3\xA0\x80\x96" => "", # U+E0016 => +"\xF3\xA0\x80\x97" => "", # U+E0017 => +"\xF3\xA0\x80\x98" => "", # U+E0018 => +"\xF3\xA0\x80\x99" => "", # U+E0019 => +"\xF3\xA0\x80\x9A" => "", # U+E001A => +"\xF3\xA0\x80\x9B" => "", # U+E001B => +"\xF3\xA0\x80\x9C" => "", # U+E001C => +"\xF3\xA0\x80\x9D" => "", # U+E001D => +"\xF3\xA0\x80\x9E" => "", # U+E001E => +"\xF3\xA0\x80\x9F" => "", # U+E001F => +"\xF3\xA0\x80\xA0" => "", # U+E0020 => +"\xF3\xA0\x80\xA1" => "", # U+E0021 => +"\xF3\xA0\x80\xA2" => "", # U+E0022 => +"\xF3\xA0\x80\xA3" => "", # U+E0023 => +"\xF3\xA0\x80\xA4" => "", # U+E0024 => +"\xF3\xA0\x80\xA5" => "", # U+E0025 => +"\xF3\xA0\x80\xA6" => "", # U+E0026 => +"\xF3\xA0\x80\xA7" => "", # U+E0027 => +"\xF3\xA0\x80\xA8" => "", # U+E0028 => +"\xF3\xA0\x80\xA9" => "", # U+E0029 => +"\xF3\xA0\x80\xAA" => "", # U+E002A => +"\xF3\xA0\x80\xAB" => "", # U+E002B => +"\xF3\xA0\x80\xAC" => "", # U+E002C => +"\xF3\xA0\x80\xAD" => "", # U+E002D => +"\xF3\xA0\x80\xAE" => "", # U+E002E => +"\xF3\xA0\x80\xAF" => "", # U+E002F => +"\xF3\xA0\x80\xB0" => "", # U+E0030 => +"\xF3\xA0\x80\xB1" => "", # U+E0031 => +"\xF3\xA0\x80\xB2" => "", # U+E0032 => +"\xF3\xA0\x80\xB3" => "", # U+E0033 => +"\xF3\xA0\x80\xB4" => "", # U+E0034 => +"\xF3\xA0\x80\xB5" => "", # U+E0035 => +"\xF3\xA0\x80\xB6" => "", # U+E0036 => +"\xF3\xA0\x80\xB7" => "", # U+E0037 => +"\xF3\xA0\x80\xB8" => "", # U+E0038 => +"\xF3\xA0\x80\xB9" => "", # U+E0039 => +"\xF3\xA0\x80\xBA" => "", # U+E003A => +"\xF3\xA0\x80\xBB" => "", # U+E003B => +"\xF3\xA0\x80\xBC" => "", # U+E003C => +"\xF3\xA0\x80\xBD" => "", # U+E003D => +"\xF3\xA0\x80\xBE" => "", # U+E003E => +"\xF3\xA0\x80\xBF" => "", # U+E003F => +"\xF3\xA0\x81\x80" => "", # U+E0040 => +"\xF3\xA0\x81\x81" => "", # U+E0041 => +"\xF3\xA0\x81\x82" => "", # U+E0042 => +"\xF3\xA0\x81\x83" => "", # U+E0043 => +"\xF3\xA0\x81\x84" => "", # U+E0044 => +"\xF3\xA0\x81\x85" => "", # U+E0045 => +"\xF3\xA0\x81\x86" => "", # U+E0046 => +"\xF3\xA0\x81\x87" => "", # U+E0047 => +"\xF3\xA0\x81\x88" => "", # U+E0048 => +"\xF3\xA0\x81\x89" => "", # U+E0049 => +"\xF3\xA0\x81\x8A" => "", # U+E004A => +"\xF3\xA0\x81\x8B" => "", # U+E004B => +"\xF3\xA0\x81\x8C" => "", # U+E004C => +"\xF3\xA0\x81\x8D" => "", # U+E004D => +"\xF3\xA0\x81\x8E" => "", # U+E004E => +"\xF3\xA0\x81\x8F" => "", # U+E004F => +"\xF3\xA0\x81\x90" => "", # U+E0050 => +"\xF3\xA0\x81\x91" => "", # U+E0051 => +"\xF3\xA0\x81\x92" => "", # U+E0052 => +"\xF3\xA0\x81\x93" => "", # U+E0053 => +"\xF3\xA0\x81\x94" => "", # U+E0054 => +"\xF3\xA0\x81\x95" => "", # U+E0055 => +"\xF3\xA0\x81\x96" => "", # U+E0056 => +"\xF3\xA0\x81\x97" => "", # U+E0057 => +"\xF3\xA0\x81\x98" => "", # U+E0058 => +"\xF3\xA0\x81\x99" => "", # U+E0059 => +"\xF3\xA0\x81\x9A" => "", # U+E005A => +"\xF3\xA0\x81\x9B" => "", # U+E005B => +"\xF3\xA0\x81\x9C" => "", # U+E005C => +"\xF3\xA0\x81\x9D" => "", # U+E005D => +"\xF3\xA0\x81\x9E" => "", # U+E005E => +"\xF3\xA0\x81\x9F" => "", # U+E005F => +"\xF3\xA0\x81\xA0" => "", # U+E0060 => +"\xF3\xA0\x81\xA1" => "", # U+E0061 => +"\xF3\xA0\x81\xA2" => "", # U+E0062 => +"\xF3\xA0\x81\xA3" => "", # U+E0063 => +"\xF3\xA0\x81\xA4" => "", # U+E0064 => +"\xF3\xA0\x81\xA5" => "", # U+E0065 => +"\xF3\xA0\x81\xA6" => "", # U+E0066 => +"\xF3\xA0\x81\xA7" => "", # U+E0067 => +"\xF3\xA0\x81\xA8" => "", # U+E0068 => +"\xF3\xA0\x81\xA9" => "", # U+E0069 => +"\xF3\xA0\x81\xAA" => "", # U+E006A => +"\xF3\xA0\x81\xAB" => "", # U+E006B => +"\xF3\xA0\x81\xAC" => "", # U+E006C => +"\xF3\xA0\x81\xAD" => "", # U+E006D => +"\xF3\xA0\x81\xAE" => "", # U+E006E => +"\xF3\xA0\x81\xAF" => "", # U+E006F => +"\xF3\xA0\x81\xB0" => "", # U+E0070 => +"\xF3\xA0\x81\xB1" => "", # U+E0071 => +"\xF3\xA0\x81\xB2" => "", # U+E0072 => +"\xF3\xA0\x81\xB3" => "", # U+E0073 => +"\xF3\xA0\x81\xB4" => "", # U+E0074 => +"\xF3\xA0\x81\xB5" => "", # U+E0075 => +"\xF3\xA0\x81\xB6" => "", # U+E0076 => +"\xF3\xA0\x81\xB7" => "", # U+E0077 => +"\xF3\xA0\x81\xB8" => "", # U+E0078 => +"\xF3\xA0\x81\xB9" => "", # U+E0079 => +"\xF3\xA0\x81\xBA" => "", # U+E007A => +"\xF3\xA0\x81\xBB" => "", # U+E007B => +"\xF3\xA0\x81\xBC" => "", # U+E007C => +"\xF3\xA0\x81\xBD" => "", # U+E007D => +"\xF3\xA0\x81\xBE" => "", # U+E007E => +"\xF3\xA0\x81\xBF" => "", # U+E007F => +"\xF3\xA0\x82\x80" => "", # U+E0080 => +"\xF3\xA0\x82\x81" => "", # U+E0081 => +"\xF3\xA0\x82\x82" => "", # U+E0082 => +"\xF3\xA0\x82\x83" => "", # U+E0083 => +"\xF3\xA0\x82\x84" => "", # U+E0084 => +"\xF3\xA0\x82\x85" => "", # U+E0085 => +"\xF3\xA0\x82\x86" => "", # U+E0086 => +"\xF3\xA0\x82\x87" => "", # U+E0087 => +"\xF3\xA0\x82\x88" => "", # U+E0088 => +"\xF3\xA0\x82\x89" => "", # U+E0089 => +"\xF3\xA0\x82\x8A" => "", # U+E008A => +"\xF3\xA0\x82\x8B" => "", # U+E008B => +"\xF3\xA0\x82\x8C" => "", # U+E008C => +"\xF3\xA0\x82\x8D" => "", # U+E008D => +"\xF3\xA0\x82\x8E" => "", # U+E008E => +"\xF3\xA0\x82\x8F" => "", # U+E008F => +"\xF3\xA0\x82\x90" => "", # U+E0090 => +"\xF3\xA0\x82\x91" => "", # U+E0091 => +"\xF3\xA0\x82\x92" => "", # U+E0092 => +"\xF3\xA0\x82\x93" => "", # U+E0093 => +"\xF3\xA0\x82\x94" => "", # U+E0094 => +"\xF3\xA0\x82\x95" => "", # U+E0095 => +"\xF3\xA0\x82\x96" => "", # U+E0096 => +"\xF3\xA0\x82\x97" => "", # U+E0097 => +"\xF3\xA0\x82\x98" => "", # U+E0098 => +"\xF3\xA0\x82\x99" => "", # U+E0099 => +"\xF3\xA0\x82\x9A" => "", # U+E009A => +"\xF3\xA0\x82\x9B" => "", # U+E009B => +"\xF3\xA0\x82\x9C" => "", # U+E009C => +"\xF3\xA0\x82\x9D" => "", # U+E009D => +"\xF3\xA0\x82\x9E" => "", # U+E009E => +"\xF3\xA0\x82\x9F" => "", # U+E009F => +"\xF3\xA0\x82\xA0" => "", # U+E00A0 => +"\xF3\xA0\x82\xA1" => "", # U+E00A1 => +"\xF3\xA0\x82\xA2" => "", # U+E00A2 => +"\xF3\xA0\x82\xA3" => "", # U+E00A3 => +"\xF3\xA0\x82\xA4" => "", # U+E00A4 => +"\xF3\xA0\x82\xA5" => "", # U+E00A5 => +"\xF3\xA0\x82\xA6" => "", # U+E00A6 => +"\xF3\xA0\x82\xA7" => "", # U+E00A7 => +"\xF3\xA0\x82\xA8" => "", # U+E00A8 => +"\xF3\xA0\x82\xA9" => "", # U+E00A9 => +"\xF3\xA0\x82\xAA" => "", # U+E00AA => +"\xF3\xA0\x82\xAB" => "", # U+E00AB => +"\xF3\xA0\x82\xAC" => "", # U+E00AC => +"\xF3\xA0\x82\xAD" => "", # U+E00AD => +"\xF3\xA0\x82\xAE" => "", # U+E00AE => +"\xF3\xA0\x82\xAF" => "", # U+E00AF => +"\xF3\xA0\x82\xB0" => "", # U+E00B0 => +"\xF3\xA0\x82\xB1" => "", # U+E00B1 => +"\xF3\xA0\x82\xB2" => "", # U+E00B2 => +"\xF3\xA0\x82\xB3" => "", # U+E00B3 => +"\xF3\xA0\x82\xB4" => "", # U+E00B4 => +"\xF3\xA0\x82\xB5" => "", # U+E00B5 => +"\xF3\xA0\x82\xB6" => "", # U+E00B6 => +"\xF3\xA0\x82\xB7" => "", # U+E00B7 => +"\xF3\xA0\x82\xB8" => "", # U+E00B8 => +"\xF3\xA0\x82\xB9" => "", # U+E00B9 => +"\xF3\xA0\x82\xBA" => "", # U+E00BA => +"\xF3\xA0\x82\xBB" => "", # U+E00BB => +"\xF3\xA0\x82\xBC" => "", # U+E00BC => +"\xF3\xA0\x82\xBD" => "", # U+E00BD => +"\xF3\xA0\x82\xBE" => "", # U+E00BE => +"\xF3\xA0\x82\xBF" => "", # U+E00BF => +"\xF3\xA0\x83\x80" => "", # U+E00C0 => +"\xF3\xA0\x83\x81" => "", # U+E00C1 => +"\xF3\xA0\x83\x82" => "", # U+E00C2 => +"\xF3\xA0\x83\x83" => "", # U+E00C3 => +"\xF3\xA0\x83\x84" => "", # U+E00C4 => +"\xF3\xA0\x83\x85" => "", # U+E00C5 => +"\xF3\xA0\x83\x86" => "", # U+E00C6 => +"\xF3\xA0\x83\x87" => "", # U+E00C7 => +"\xF3\xA0\x83\x88" => "", # U+E00C8 => +"\xF3\xA0\x83\x89" => "", # U+E00C9 => +"\xF3\xA0\x83\x8A" => "", # U+E00CA => +"\xF3\xA0\x83\x8B" => "", # U+E00CB => +"\xF3\xA0\x83\x8C" => "", # U+E00CC => +"\xF3\xA0\x83\x8D" => "", # U+E00CD => +"\xF3\xA0\x83\x8E" => "", # U+E00CE => +"\xF3\xA0\x83\x8F" => "", # U+E00CF => +"\xF3\xA0\x83\x90" => "", # U+E00D0 => +"\xF3\xA0\x83\x91" => "", # U+E00D1 => +"\xF3\xA0\x83\x92" => "", # U+E00D2 => +"\xF3\xA0\x83\x93" => "", # U+E00D3 => +"\xF3\xA0\x83\x94" => "", # U+E00D4 => +"\xF3\xA0\x83\x95" => "", # U+E00D5 => +"\xF3\xA0\x83\x96" => "", # U+E00D6 => +"\xF3\xA0\x83\x97" => "", # U+E00D7 => +"\xF3\xA0\x83\x98" => "", # U+E00D8 => +"\xF3\xA0\x83\x99" => "", # U+E00D9 => +"\xF3\xA0\x83\x9A" => "", # U+E00DA => +"\xF3\xA0\x83\x9B" => "", # U+E00DB => +"\xF3\xA0\x83\x9C" => "", # U+E00DC => +"\xF3\xA0\x83\x9D" => "", # U+E00DD => +"\xF3\xA0\x83\x9E" => "", # U+E00DE => +"\xF3\xA0\x83\x9F" => "", # U+E00DF => +"\xF3\xA0\x83\xA0" => "", # U+E00E0 => +"\xF3\xA0\x83\xA1" => "", # U+E00E1 => +"\xF3\xA0\x83\xA2" => "", # U+E00E2 => +"\xF3\xA0\x83\xA3" => "", # U+E00E3 => +"\xF3\xA0\x83\xA4" => "", # U+E00E4 => +"\xF3\xA0\x83\xA5" => "", # U+E00E5 => +"\xF3\xA0\x83\xA6" => "", # U+E00E6 => +"\xF3\xA0\x83\xA7" => "", # U+E00E7 => +"\xF3\xA0\x83\xA8" => "", # U+E00E8 => +"\xF3\xA0\x83\xA9" => "", # U+E00E9 => +"\xF3\xA0\x83\xAA" => "", # U+E00EA => +"\xF3\xA0\x83\xAB" => "", # U+E00EB => +"\xF3\xA0\x83\xAC" => "", # U+E00EC => +"\xF3\xA0\x83\xAD" => "", # U+E00ED => +"\xF3\xA0\x83\xAE" => "", # U+E00EE => +"\xF3\xA0\x83\xAF" => "", # U+E00EF => +"\xF3\xA0\x83\xB0" => "", # U+E00F0 => +"\xF3\xA0\x83\xB1" => "", # U+E00F1 => +"\xF3\xA0\x83\xB2" => "", # U+E00F2 => +"\xF3\xA0\x83\xB3" => "", # U+E00F3 => +"\xF3\xA0\x83\xB4" => "", # U+E00F4 => +"\xF3\xA0\x83\xB5" => "", # U+E00F5 => +"\xF3\xA0\x83\xB6" => "", # U+E00F6 => +"\xF3\xA0\x83\xB7" => "", # U+E00F7 => +"\xF3\xA0\x83\xB8" => "", # U+E00F8 => +"\xF3\xA0\x83\xB9" => "", # U+E00F9 => +"\xF3\xA0\x83\xBA" => "", # U+E00FA => +"\xF3\xA0\x83\xBB" => "", # U+E00FB => +"\xF3\xA0\x83\xBC" => "", # U+E00FC => +"\xF3\xA0\x83\xBD" => "", # U+E00FD => +"\xF3\xA0\x83\xBE" => "", # U+E00FE => +"\xF3\xA0\x83\xBF" => "", # U+E00FF => +"\xF3\xA0\x84\x80" => "", # U+E0100 => +"\xF3\xA0\x84\x81" => "", # U+E0101 => +"\xF3\xA0\x84\x82" => "", # U+E0102 => +"\xF3\xA0\x84\x83" => "", # U+E0103 => +"\xF3\xA0\x84\x84" => "", # U+E0104 => +"\xF3\xA0\x84\x85" => "", # U+E0105 => +"\xF3\xA0\x84\x86" => "", # U+E0106 => +"\xF3\xA0\x84\x87" => "", # U+E0107 => +"\xF3\xA0\x84\x88" => "", # U+E0108 => +"\xF3\xA0\x84\x89" => "", # U+E0109 => +"\xF3\xA0\x84\x8A" => "", # U+E010A => +"\xF3\xA0\x84\x8B" => "", # U+E010B => +"\xF3\xA0\x84\x8C" => "", # U+E010C => +"\xF3\xA0\x84\x8D" => "", # U+E010D => +"\xF3\xA0\x84\x8E" => "", # U+E010E => +"\xF3\xA0\x84\x8F" => "", # U+E010F => +"\xF3\xA0\x84\x90" => "", # U+E0110 => +"\xF3\xA0\x84\x91" => "", # U+E0111 => +"\xF3\xA0\x84\x92" => "", # U+E0112 => +"\xF3\xA0\x84\x93" => "", # U+E0113 => +"\xF3\xA0\x84\x94" => "", # U+E0114 => +"\xF3\xA0\x84\x95" => "", # U+E0115 => +"\xF3\xA0\x84\x96" => "", # U+E0116 => +"\xF3\xA0\x84\x97" => "", # U+E0117 => +"\xF3\xA0\x84\x98" => "", # U+E0118 => +"\xF3\xA0\x84\x99" => "", # U+E0119 => +"\xF3\xA0\x84\x9A" => "", # U+E011A => +"\xF3\xA0\x84\x9B" => "", # U+E011B => +"\xF3\xA0\x84\x9C" => "", # U+E011C => +"\xF3\xA0\x84\x9D" => "", # U+E011D => +"\xF3\xA0\x84\x9E" => "", # U+E011E => +"\xF3\xA0\x84\x9F" => "", # U+E011F => +"\xF3\xA0\x84\xA0" => "", # U+E0120 => +"\xF3\xA0\x84\xA1" => "", # U+E0121 => +"\xF3\xA0\x84\xA2" => "", # U+E0122 => +"\xF3\xA0\x84\xA3" => "", # U+E0123 => +"\xF3\xA0\x84\xA4" => "", # U+E0124 => +"\xF3\xA0\x84\xA5" => "", # U+E0125 => +"\xF3\xA0\x84\xA6" => "", # U+E0126 => +"\xF3\xA0\x84\xA7" => "", # U+E0127 => +"\xF3\xA0\x84\xA8" => "", # U+E0128 => +"\xF3\xA0\x84\xA9" => "", # U+E0129 => +"\xF3\xA0\x84\xAA" => "", # U+E012A => +"\xF3\xA0\x84\xAB" => "", # U+E012B => +"\xF3\xA0\x84\xAC" => "", # U+E012C => +"\xF3\xA0\x84\xAD" => "", # U+E012D => +"\xF3\xA0\x84\xAE" => "", # U+E012E => +"\xF3\xA0\x84\xAF" => "", # U+E012F => +"\xF3\xA0\x84\xB0" => "", # U+E0130 => +"\xF3\xA0\x84\xB1" => "", # U+E0131 => +"\xF3\xA0\x84\xB2" => "", # U+E0132 => +"\xF3\xA0\x84\xB3" => "", # U+E0133 => +"\xF3\xA0\x84\xB4" => "", # U+E0134 => +"\xF3\xA0\x84\xB5" => "", # U+E0135 => +"\xF3\xA0\x84\xB6" => "", # U+E0136 => +"\xF3\xA0\x84\xB7" => "", # U+E0137 => +"\xF3\xA0\x84\xB8" => "", # U+E0138 => +"\xF3\xA0\x84\xB9" => "", # U+E0139 => +"\xF3\xA0\x84\xBA" => "", # U+E013A => +"\xF3\xA0\x84\xBB" => "", # U+E013B => +"\xF3\xA0\x84\xBC" => "", # U+E013C => +"\xF3\xA0\x84\xBD" => "", # U+E013D => +"\xF3\xA0\x84\xBE" => "", # U+E013E => +"\xF3\xA0\x84\xBF" => "", # U+E013F => +"\xF3\xA0\x85\x80" => "", # U+E0140 => +"\xF3\xA0\x85\x81" => "", # U+E0141 => +"\xF3\xA0\x85\x82" => "", # U+E0142 => +"\xF3\xA0\x85\x83" => "", # U+E0143 => +"\xF3\xA0\x85\x84" => "", # U+E0144 => +"\xF3\xA0\x85\x85" => "", # U+E0145 => +"\xF3\xA0\x85\x86" => "", # U+E0146 => +"\xF3\xA0\x85\x87" => "", # U+E0147 => +"\xF3\xA0\x85\x88" => "", # U+E0148 => +"\xF3\xA0\x85\x89" => "", # U+E0149 => +"\xF3\xA0\x85\x8A" => "", # U+E014A => +"\xF3\xA0\x85\x8B" => "", # U+E014B => +"\xF3\xA0\x85\x8C" => "", # U+E014C => +"\xF3\xA0\x85\x8D" => "", # U+E014D => +"\xF3\xA0\x85\x8E" => "", # U+E014E => +"\xF3\xA0\x85\x8F" => "", # U+E014F => +"\xF3\xA0\x85\x90" => "", # U+E0150 => +"\xF3\xA0\x85\x91" => "", # U+E0151 => +"\xF3\xA0\x85\x92" => "", # U+E0152 => +"\xF3\xA0\x85\x93" => "", # U+E0153 => +"\xF3\xA0\x85\x94" => "", # U+E0154 => +"\xF3\xA0\x85\x95" => "", # U+E0155 => +"\xF3\xA0\x85\x96" => "", # U+E0156 => +"\xF3\xA0\x85\x97" => "", # U+E0157 => +"\xF3\xA0\x85\x98" => "", # U+E0158 => +"\xF3\xA0\x85\x99" => "", # U+E0159 => +"\xF3\xA0\x85\x9A" => "", # U+E015A => +"\xF3\xA0\x85\x9B" => "", # U+E015B => +"\xF3\xA0\x85\x9C" => "", # U+E015C => +"\xF3\xA0\x85\x9D" => "", # U+E015D => +"\xF3\xA0\x85\x9E" => "", # U+E015E => +"\xF3\xA0\x85\x9F" => "", # U+E015F => +"\xF3\xA0\x85\xA0" => "", # U+E0160 => +"\xF3\xA0\x85\xA1" => "", # U+E0161 => +"\xF3\xA0\x85\xA2" => "", # U+E0162 => +"\xF3\xA0\x85\xA3" => "", # U+E0163 => +"\xF3\xA0\x85\xA4" => "", # U+E0164 => +"\xF3\xA0\x85\xA5" => "", # U+E0165 => +"\xF3\xA0\x85\xA6" => "", # U+E0166 => +"\xF3\xA0\x85\xA7" => "", # U+E0167 => +"\xF3\xA0\x85\xA8" => "", # U+E0168 => +"\xF3\xA0\x85\xA9" => "", # U+E0169 => +"\xF3\xA0\x85\xAA" => "", # U+E016A => +"\xF3\xA0\x85\xAB" => "", # U+E016B => +"\xF3\xA0\x85\xAC" => "", # U+E016C => +"\xF3\xA0\x85\xAD" => "", # U+E016D => +"\xF3\xA0\x85\xAE" => "", # U+E016E => +"\xF3\xA0\x85\xAF" => "", # U+E016F => +"\xF3\xA0\x85\xB0" => "", # U+E0170 => +"\xF3\xA0\x85\xB1" => "", # U+E0171 => +"\xF3\xA0\x85\xB2" => "", # U+E0172 => +"\xF3\xA0\x85\xB3" => "", # U+E0173 => +"\xF3\xA0\x85\xB4" => "", # U+E0174 => +"\xF3\xA0\x85\xB5" => "", # U+E0175 => +"\xF3\xA0\x85\xB6" => "", # U+E0176 => +"\xF3\xA0\x85\xB7" => "", # U+E0177 => +"\xF3\xA0\x85\xB8" => "", # U+E0178 => +"\xF3\xA0\x85\xB9" => "", # U+E0179 => +"\xF3\xA0\x85\xBA" => "", # U+E017A => +"\xF3\xA0\x85\xBB" => "", # U+E017B => +"\xF3\xA0\x85\xBC" => "", # U+E017C => +"\xF3\xA0\x85\xBD" => "", # U+E017D => +"\xF3\xA0\x85\xBE" => "", # U+E017E => +"\xF3\xA0\x85\xBF" => "", # U+E017F => +"\xF3\xA0\x86\x80" => "", # U+E0180 => +"\xF3\xA0\x86\x81" => "", # U+E0181 => +"\xF3\xA0\x86\x82" => "", # U+E0182 => +"\xF3\xA0\x86\x83" => "", # U+E0183 => +"\xF3\xA0\x86\x84" => "", # U+E0184 => +"\xF3\xA0\x86\x85" => "", # U+E0185 => +"\xF3\xA0\x86\x86" => "", # U+E0186 => +"\xF3\xA0\x86\x87" => "", # U+E0187 => +"\xF3\xA0\x86\x88" => "", # U+E0188 => +"\xF3\xA0\x86\x89" => "", # U+E0189 => +"\xF3\xA0\x86\x8A" => "", # U+E018A => +"\xF3\xA0\x86\x8B" => "", # U+E018B => +"\xF3\xA0\x86\x8C" => "", # U+E018C => +"\xF3\xA0\x86\x8D" => "", # U+E018D => +"\xF3\xA0\x86\x8E" => "", # U+E018E => +"\xF3\xA0\x86\x8F" => "", # U+E018F => +"\xF3\xA0\x86\x90" => "", # U+E0190 => +"\xF3\xA0\x86\x91" => "", # U+E0191 => +"\xF3\xA0\x86\x92" => "", # U+E0192 => +"\xF3\xA0\x86\x93" => "", # U+E0193 => +"\xF3\xA0\x86\x94" => "", # U+E0194 => +"\xF3\xA0\x86\x95" => "", # U+E0195 => +"\xF3\xA0\x86\x96" => "", # U+E0196 => +"\xF3\xA0\x86\x97" => "", # U+E0197 => +"\xF3\xA0\x86\x98" => "", # U+E0198 => +"\xF3\xA0\x86\x99" => "", # U+E0199 => +"\xF3\xA0\x86\x9A" => "", # U+E019A => +"\xF3\xA0\x86\x9B" => "", # U+E019B => +"\xF3\xA0\x86\x9C" => "", # U+E019C => +"\xF3\xA0\x86\x9D" => "", # U+E019D => +"\xF3\xA0\x86\x9E" => "", # U+E019E => +"\xF3\xA0\x86\x9F" => "", # U+E019F => +"\xF3\xA0\x86\xA0" => "", # U+E01A0 => +"\xF3\xA0\x86\xA1" => "", # U+E01A1 => +"\xF3\xA0\x86\xA2" => "", # U+E01A2 => +"\xF3\xA0\x86\xA3" => "", # U+E01A3 => +"\xF3\xA0\x86\xA4" => "", # U+E01A4 => +"\xF3\xA0\x86\xA5" => "", # U+E01A5 => +"\xF3\xA0\x86\xA6" => "", # U+E01A6 => +"\xF3\xA0\x86\xA7" => "", # U+E01A7 => +"\xF3\xA0\x86\xA8" => "", # U+E01A8 => +"\xF3\xA0\x86\xA9" => "", # U+E01A9 => +"\xF3\xA0\x86\xAA" => "", # U+E01AA => +"\xF3\xA0\x86\xAB" => "", # U+E01AB => +"\xF3\xA0\x86\xAC" => "", # U+E01AC => +"\xF3\xA0\x86\xAD" => "", # U+E01AD => +"\xF3\xA0\x86\xAE" => "", # U+E01AE => +"\xF3\xA0\x86\xAF" => "", # U+E01AF => +"\xF3\xA0\x86\xB0" => "", # U+E01B0 => +"\xF3\xA0\x86\xB1" => "", # U+E01B1 => +"\xF3\xA0\x86\xB2" => "", # U+E01B2 => +"\xF3\xA0\x86\xB3" => "", # U+E01B3 => +"\xF3\xA0\x86\xB4" => "", # U+E01B4 => +"\xF3\xA0\x86\xB5" => "", # U+E01B5 => +"\xF3\xA0\x86\xB6" => "", # U+E01B6 => +"\xF3\xA0\x86\xB7" => "", # U+E01B7 => +"\xF3\xA0\x86\xB8" => "", # U+E01B8 => +"\xF3\xA0\x86\xB9" => "", # U+E01B9 => +"\xF3\xA0\x86\xBA" => "", # U+E01BA => +"\xF3\xA0\x86\xBB" => "", # U+E01BB => +"\xF3\xA0\x86\xBC" => "", # U+E01BC => +"\xF3\xA0\x86\xBD" => "", # U+E01BD => +"\xF3\xA0\x86\xBE" => "", # U+E01BE => +"\xF3\xA0\x86\xBF" => "", # U+E01BF => +"\xF3\xA0\x87\x80" => "", # U+E01C0 => +"\xF3\xA0\x87\x81" => "", # U+E01C1 => +"\xF3\xA0\x87\x82" => "", # U+E01C2 => +"\xF3\xA0\x87\x83" => "", # U+E01C3 => +"\xF3\xA0\x87\x84" => "", # U+E01C4 => +"\xF3\xA0\x87\x85" => "", # U+E01C5 => +"\xF3\xA0\x87\x86" => "", # U+E01C6 => +"\xF3\xA0\x87\x87" => "", # U+E01C7 => +"\xF3\xA0\x87\x88" => "", # U+E01C8 => +"\xF3\xA0\x87\x89" => "", # U+E01C9 => +"\xF3\xA0\x87\x8A" => "", # U+E01CA => +"\xF3\xA0\x87\x8B" => "", # U+E01CB => +"\xF3\xA0\x87\x8C" => "", # U+E01CC => +"\xF3\xA0\x87\x8D" => "", # U+E01CD => +"\xF3\xA0\x87\x8E" => "", # U+E01CE => +"\xF3\xA0\x87\x8F" => "", # U+E01CF => +"\xF3\xA0\x87\x90" => "", # U+E01D0 => +"\xF3\xA0\x87\x91" => "", # U+E01D1 => +"\xF3\xA0\x87\x92" => "", # U+E01D2 => +"\xF3\xA0\x87\x93" => "", # U+E01D3 => +"\xF3\xA0\x87\x94" => "", # U+E01D4 => +"\xF3\xA0\x87\x95" => "", # U+E01D5 => +"\xF3\xA0\x87\x96" => "", # U+E01D6 => +"\xF3\xA0\x87\x97" => "", # U+E01D7 => +"\xF3\xA0\x87\x98" => "", # U+E01D8 => +"\xF3\xA0\x87\x99" => "", # U+E01D9 => +"\xF3\xA0\x87\x9A" => "", # U+E01DA => +"\xF3\xA0\x87\x9B" => "", # U+E01DB => +"\xF3\xA0\x87\x9C" => "", # U+E01DC => +"\xF3\xA0\x87\x9D" => "", # U+E01DD => +"\xF3\xA0\x87\x9E" => "", # U+E01DE => +"\xF3\xA0\x87\x9F" => "", # U+E01DF => +"\xF3\xA0\x87\xA0" => "", # U+E01E0 => +"\xF3\xA0\x87\xA1" => "", # U+E01E1 => +"\xF3\xA0\x87\xA2" => "", # U+E01E2 => +"\xF3\xA0\x87\xA3" => "", # U+E01E3 => +"\xF3\xA0\x87\xA4" => "", # U+E01E4 => +"\xF3\xA0\x87\xA5" => "", # U+E01E5 => +"\xF3\xA0\x87\xA6" => "", # U+E01E6 => +"\xF3\xA0\x87\xA7" => "", # U+E01E7 => +"\xF3\xA0\x87\xA8" => "", # U+E01E8 => +"\xF3\xA0\x87\xA9" => "", # U+E01E9 => +"\xF3\xA0\x87\xAA" => "", # U+E01EA => +"\xF3\xA0\x87\xAB" => "", # U+E01EB => +"\xF3\xA0\x87\xAC" => "", # U+E01EC => +"\xF3\xA0\x87\xAD" => "", # U+E01ED => +"\xF3\xA0\x87\xAE" => "", # U+E01EE => +"\xF3\xA0\x87\xAF" => "", # U+E01EF => +"\xF3\xA0\x87\xB0" => "", # U+E01F0 => +"\xF3\xA0\x87\xB1" => "", # U+E01F1 => +"\xF3\xA0\x87\xB2" => "", # U+E01F2 => +"\xF3\xA0\x87\xB3" => "", # U+E01F3 => +"\xF3\xA0\x87\xB4" => "", # U+E01F4 => +"\xF3\xA0\x87\xB5" => "", # U+E01F5 => +"\xF3\xA0\x87\xB6" => "", # U+E01F6 => +"\xF3\xA0\x87\xB7" => "", # U+E01F7 => +"\xF3\xA0\x87\xB8" => "", # U+E01F8 => +"\xF3\xA0\x87\xB9" => "", # U+E01F9 => +"\xF3\xA0\x87\xBA" => "", # U+E01FA => +"\xF3\xA0\x87\xBB" => "", # U+E01FB => +"\xF3\xA0\x87\xBC" => "", # U+E01FC => +"\xF3\xA0\x87\xBD" => "", # U+E01FD => +"\xF3\xA0\x87\xBE" => "", # U+E01FE => +"\xF3\xA0\x87\xBF" => "", # U+E01FF => +"\xF3\xA0\x88\x80" => "", # U+E0200 => +"\xF3\xA0\x88\x81" => "", # U+E0201 => +"\xF3\xA0\x88\x82" => "", # U+E0202 => +"\xF3\xA0\x88\x83" => "", # U+E0203 => +"\xF3\xA0\x88\x84" => "", # U+E0204 => +"\xF3\xA0\x88\x85" => "", # U+E0205 => +"\xF3\xA0\x88\x86" => "", # U+E0206 => +"\xF3\xA0\x88\x87" => "", # U+E0207 => +"\xF3\xA0\x88\x88" => "", # U+E0208 => +"\xF3\xA0\x88\x89" => "", # U+E0209 => +"\xF3\xA0\x88\x8A" => "", # U+E020A => +"\xF3\xA0\x88\x8B" => "", # U+E020B => +"\xF3\xA0\x88\x8C" => "", # U+E020C => +"\xF3\xA0\x88\x8D" => "", # U+E020D => +"\xF3\xA0\x88\x8E" => "", # U+E020E => +"\xF3\xA0\x88\x8F" => "", # U+E020F => +"\xF3\xA0\x88\x90" => "", # U+E0210 => +"\xF3\xA0\x88\x91" => "", # U+E0211 => +"\xF3\xA0\x88\x92" => "", # U+E0212 => +"\xF3\xA0\x88\x93" => "", # U+E0213 => +"\xF3\xA0\x88\x94" => "", # U+E0214 => +"\xF3\xA0\x88\x95" => "", # U+E0215 => +"\xF3\xA0\x88\x96" => "", # U+E0216 => +"\xF3\xA0\x88\x97" => "", # U+E0217 => +"\xF3\xA0\x88\x98" => "", # U+E0218 => +"\xF3\xA0\x88\x99" => "", # U+E0219 => +"\xF3\xA0\x88\x9A" => "", # U+E021A => +"\xF3\xA0\x88\x9B" => "", # U+E021B => +"\xF3\xA0\x88\x9C" => "", # U+E021C => +"\xF3\xA0\x88\x9D" => "", # U+E021D => +"\xF3\xA0\x88\x9E" => "", # U+E021E => +"\xF3\xA0\x88\x9F" => "", # U+E021F => +"\xF3\xA0\x88\xA0" => "", # U+E0220 => +"\xF3\xA0\x88\xA1" => "", # U+E0221 => +"\xF3\xA0\x88\xA2" => "", # U+E0222 => +"\xF3\xA0\x88\xA3" => "", # U+E0223 => +"\xF3\xA0\x88\xA4" => "", # U+E0224 => +"\xF3\xA0\x88\xA5" => "", # U+E0225 => +"\xF3\xA0\x88\xA6" => "", # U+E0226 => +"\xF3\xA0\x88\xA7" => "", # U+E0227 => +"\xF3\xA0\x88\xA8" => "", # U+E0228 => +"\xF3\xA0\x88\xA9" => "", # U+E0229 => +"\xF3\xA0\x88\xAA" => "", # U+E022A => +"\xF3\xA0\x88\xAB" => "", # U+E022B => +"\xF3\xA0\x88\xAC" => "", # U+E022C => +"\xF3\xA0\x88\xAD" => "", # U+E022D => +"\xF3\xA0\x88\xAE" => "", # U+E022E => +"\xF3\xA0\x88\xAF" => "", # U+E022F => +"\xF3\xA0\x88\xB0" => "", # U+E0230 => +"\xF3\xA0\x88\xB1" => "", # U+E0231 => +"\xF3\xA0\x88\xB2" => "", # U+E0232 => +"\xF3\xA0\x88\xB3" => "", # U+E0233 => +"\xF3\xA0\x88\xB4" => "", # U+E0234 => +"\xF3\xA0\x88\xB5" => "", # U+E0235 => +"\xF3\xA0\x88\xB6" => "", # U+E0236 => +"\xF3\xA0\x88\xB7" => "", # U+E0237 => +"\xF3\xA0\x88\xB8" => "", # U+E0238 => +"\xF3\xA0\x88\xB9" => "", # U+E0239 => +"\xF3\xA0\x88\xBA" => "", # U+E023A => +"\xF3\xA0\x88\xBB" => "", # U+E023B => +"\xF3\xA0\x88\xBC" => "", # U+E023C => +"\xF3\xA0\x88\xBD" => "", # U+E023D => +"\xF3\xA0\x88\xBE" => "", # U+E023E => +"\xF3\xA0\x88\xBF" => "", # U+E023F => +"\xF3\xA0\x89\x80" => "", # U+E0240 => +"\xF3\xA0\x89\x81" => "", # U+E0241 => +"\xF3\xA0\x89\x82" => "", # U+E0242 => +"\xF3\xA0\x89\x83" => "", # U+E0243 => +"\xF3\xA0\x89\x84" => "", # U+E0244 => +"\xF3\xA0\x89\x85" => "", # U+E0245 => +"\xF3\xA0\x89\x86" => "", # U+E0246 => +"\xF3\xA0\x89\x87" => "", # U+E0247 => +"\xF3\xA0\x89\x88" => "", # U+E0248 => +"\xF3\xA0\x89\x89" => "", # U+E0249 => +"\xF3\xA0\x89\x8A" => "", # U+E024A => +"\xF3\xA0\x89\x8B" => "", # U+E024B => +"\xF3\xA0\x89\x8C" => "", # U+E024C => +"\xF3\xA0\x89\x8D" => "", # U+E024D => +"\xF3\xA0\x89\x8E" => "", # U+E024E => +"\xF3\xA0\x89\x8F" => "", # U+E024F => +"\xF3\xA0\x89\x90" => "", # U+E0250 => +"\xF3\xA0\x89\x91" => "", # U+E0251 => +"\xF3\xA0\x89\x92" => "", # U+E0252 => +"\xF3\xA0\x89\x93" => "", # U+E0253 => +"\xF3\xA0\x89\x94" => "", # U+E0254 => +"\xF3\xA0\x89\x95" => "", # U+E0255 => +"\xF3\xA0\x89\x96" => "", # U+E0256 => +"\xF3\xA0\x89\x97" => "", # U+E0257 => +"\xF3\xA0\x89\x98" => "", # U+E0258 => +"\xF3\xA0\x89\x99" => "", # U+E0259 => +"\xF3\xA0\x89\x9A" => "", # U+E025A => +"\xF3\xA0\x89\x9B" => "", # U+E025B => +"\xF3\xA0\x89\x9C" => "", # U+E025C => +"\xF3\xA0\x89\x9D" => "", # U+E025D => +"\xF3\xA0\x89\x9E" => "", # U+E025E => +"\xF3\xA0\x89\x9F" => "", # U+E025F => +"\xF3\xA0\x89\xA0" => "", # U+E0260 => +"\xF3\xA0\x89\xA1" => "", # U+E0261 => +"\xF3\xA0\x89\xA2" => "", # U+E0262 => +"\xF3\xA0\x89\xA3" => "", # U+E0263 => +"\xF3\xA0\x89\xA4" => "", # U+E0264 => +"\xF3\xA0\x89\xA5" => "", # U+E0265 => +"\xF3\xA0\x89\xA6" => "", # U+E0266 => +"\xF3\xA0\x89\xA7" => "", # U+E0267 => +"\xF3\xA0\x89\xA8" => "", # U+E0268 => +"\xF3\xA0\x89\xA9" => "", # U+E0269 => +"\xF3\xA0\x89\xAA" => "", # U+E026A => +"\xF3\xA0\x89\xAB" => "", # U+E026B => +"\xF3\xA0\x89\xAC" => "", # U+E026C => +"\xF3\xA0\x89\xAD" => "", # U+E026D => +"\xF3\xA0\x89\xAE" => "", # U+E026E => +"\xF3\xA0\x89\xAF" => "", # U+E026F => +"\xF3\xA0\x89\xB0" => "", # U+E0270 => +"\xF3\xA0\x89\xB1" => "", # U+E0271 => +"\xF3\xA0\x89\xB2" => "", # U+E0272 => +"\xF3\xA0\x89\xB3" => "", # U+E0273 => +"\xF3\xA0\x89\xB4" => "", # U+E0274 => +"\xF3\xA0\x89\xB5" => "", # U+E0275 => +"\xF3\xA0\x89\xB6" => "", # U+E0276 => +"\xF3\xA0\x89\xB7" => "", # U+E0277 => +"\xF3\xA0\x89\xB8" => "", # U+E0278 => +"\xF3\xA0\x89\xB9" => "", # U+E0279 => +"\xF3\xA0\x89\xBA" => "", # U+E027A => +"\xF3\xA0\x89\xBB" => "", # U+E027B => +"\xF3\xA0\x89\xBC" => "", # U+E027C => +"\xF3\xA0\x89\xBD" => "", # U+E027D => +"\xF3\xA0\x89\xBE" => "", # U+E027E => +"\xF3\xA0\x89\xBF" => "", # U+E027F => +"\xF3\xA0\x8A\x80" => "", # U+E0280 => +"\xF3\xA0\x8A\x81" => "", # U+E0281 => +"\xF3\xA0\x8A\x82" => "", # U+E0282 => +"\xF3\xA0\x8A\x83" => "", # U+E0283 => +"\xF3\xA0\x8A\x84" => "", # U+E0284 => +"\xF3\xA0\x8A\x85" => "", # U+E0285 => +"\xF3\xA0\x8A\x86" => "", # U+E0286 => +"\xF3\xA0\x8A\x87" => "", # U+E0287 => +"\xF3\xA0\x8A\x88" => "", # U+E0288 => +"\xF3\xA0\x8A\x89" => "", # U+E0289 => +"\xF3\xA0\x8A\x8A" => "", # U+E028A => +"\xF3\xA0\x8A\x8B" => "", # U+E028B => +"\xF3\xA0\x8A\x8C" => "", # U+E028C => +"\xF3\xA0\x8A\x8D" => "", # U+E028D => +"\xF3\xA0\x8A\x8E" => "", # U+E028E => +"\xF3\xA0\x8A\x8F" => "", # U+E028F => +"\xF3\xA0\x8A\x90" => "", # U+E0290 => +"\xF3\xA0\x8A\x91" => "", # U+E0291 => +"\xF3\xA0\x8A\x92" => "", # U+E0292 => +"\xF3\xA0\x8A\x93" => "", # U+E0293 => +"\xF3\xA0\x8A\x94" => "", # U+E0294 => +"\xF3\xA0\x8A\x95" => "", # U+E0295 => +"\xF3\xA0\x8A\x96" => "", # U+E0296 => +"\xF3\xA0\x8A\x97" => "", # U+E0297 => +"\xF3\xA0\x8A\x98" => "", # U+E0298 => +"\xF3\xA0\x8A\x99" => "", # U+E0299 => +"\xF3\xA0\x8A\x9A" => "", # U+E029A => +"\xF3\xA0\x8A\x9B" => "", # U+E029B => +"\xF3\xA0\x8A\x9C" => "", # U+E029C => +"\xF3\xA0\x8A\x9D" => "", # U+E029D => +"\xF3\xA0\x8A\x9E" => "", # U+E029E => +"\xF3\xA0\x8A\x9F" => "", # U+E029F => +"\xF3\xA0\x8A\xA0" => "", # U+E02A0 => +"\xF3\xA0\x8A\xA1" => "", # U+E02A1 => +"\xF3\xA0\x8A\xA2" => "", # U+E02A2 => +"\xF3\xA0\x8A\xA3" => "", # U+E02A3 => +"\xF3\xA0\x8A\xA4" => "", # U+E02A4 => +"\xF3\xA0\x8A\xA5" => "", # U+E02A5 => +"\xF3\xA0\x8A\xA6" => "", # U+E02A6 => +"\xF3\xA0\x8A\xA7" => "", # U+E02A7 => +"\xF3\xA0\x8A\xA8" => "", # U+E02A8 => +"\xF3\xA0\x8A\xA9" => "", # U+E02A9 => +"\xF3\xA0\x8A\xAA" => "", # U+E02AA => +"\xF3\xA0\x8A\xAB" => "", # U+E02AB => +"\xF3\xA0\x8A\xAC" => "", # U+E02AC => +"\xF3\xA0\x8A\xAD" => "", # U+E02AD => +"\xF3\xA0\x8A\xAE" => "", # U+E02AE => +"\xF3\xA0\x8A\xAF" => "", # U+E02AF => +"\xF3\xA0\x8A\xB0" => "", # U+E02B0 => +"\xF3\xA0\x8A\xB1" => "", # U+E02B1 => +"\xF3\xA0\x8A\xB2" => "", # U+E02B2 => +"\xF3\xA0\x8A\xB3" => "", # U+E02B3 => +"\xF3\xA0\x8A\xB4" => "", # U+E02B4 => +"\xF3\xA0\x8A\xB5" => "", # U+E02B5 => +"\xF3\xA0\x8A\xB6" => "", # U+E02B6 => +"\xF3\xA0\x8A\xB7" => "", # U+E02B7 => +"\xF3\xA0\x8A\xB8" => "", # U+E02B8 => +"\xF3\xA0\x8A\xB9" => "", # U+E02B9 => +"\xF3\xA0\x8A\xBA" => "", # U+E02BA => +"\xF3\xA0\x8A\xBB" => "", # U+E02BB => +"\xF3\xA0\x8A\xBC" => "", # U+E02BC => +"\xF3\xA0\x8A\xBD" => "", # U+E02BD => +"\xF3\xA0\x8A\xBE" => "", # U+E02BE => +"\xF3\xA0\x8A\xBF" => "", # U+E02BF => +"\xF3\xA0\x8B\x80" => "", # U+E02C0 => +"\xF3\xA0\x8B\x81" => "", # U+E02C1 => +"\xF3\xA0\x8B\x82" => "", # U+E02C2 => +"\xF3\xA0\x8B\x83" => "", # U+E02C3 => +"\xF3\xA0\x8B\x84" => "", # U+E02C4 => +"\xF3\xA0\x8B\x85" => "", # U+E02C5 => +"\xF3\xA0\x8B\x86" => "", # U+E02C6 => +"\xF3\xA0\x8B\x87" => "", # U+E02C7 => +"\xF3\xA0\x8B\x88" => "", # U+E02C8 => +"\xF3\xA0\x8B\x89" => "", # U+E02C9 => +"\xF3\xA0\x8B\x8A" => "", # U+E02CA => +"\xF3\xA0\x8B\x8B" => "", # U+E02CB => +"\xF3\xA0\x8B\x8C" => "", # U+E02CC => +"\xF3\xA0\x8B\x8D" => "", # U+E02CD => +"\xF3\xA0\x8B\x8E" => "", # U+E02CE => +"\xF3\xA0\x8B\x8F" => "", # U+E02CF => +"\xF3\xA0\x8B\x90" => "", # U+E02D0 => +"\xF3\xA0\x8B\x91" => "", # U+E02D1 => +"\xF3\xA0\x8B\x92" => "", # U+E02D2 => +"\xF3\xA0\x8B\x93" => "", # U+E02D3 => +"\xF3\xA0\x8B\x94" => "", # U+E02D4 => +"\xF3\xA0\x8B\x95" => "", # U+E02D5 => +"\xF3\xA0\x8B\x96" => "", # U+E02D6 => +"\xF3\xA0\x8B\x97" => "", # U+E02D7 => +"\xF3\xA0\x8B\x98" => "", # U+E02D8 => +"\xF3\xA0\x8B\x99" => "", # U+E02D9 => +"\xF3\xA0\x8B\x9A" => "", # U+E02DA => +"\xF3\xA0\x8B\x9B" => "", # U+E02DB => +"\xF3\xA0\x8B\x9C" => "", # U+E02DC => +"\xF3\xA0\x8B\x9D" => "", # U+E02DD => +"\xF3\xA0\x8B\x9E" => "", # U+E02DE => +"\xF3\xA0\x8B\x9F" => "", # U+E02DF => +"\xF3\xA0\x8B\xA0" => "", # U+E02E0 => +"\xF3\xA0\x8B\xA1" => "", # U+E02E1 => +"\xF3\xA0\x8B\xA2" => "", # U+E02E2 => +"\xF3\xA0\x8B\xA3" => "", # U+E02E3 => +"\xF3\xA0\x8B\xA4" => "", # U+E02E4 => +"\xF3\xA0\x8B\xA5" => "", # U+E02E5 => +"\xF3\xA0\x8B\xA6" => "", # U+E02E6 => +"\xF3\xA0\x8B\xA7" => "", # U+E02E7 => +"\xF3\xA0\x8B\xA8" => "", # U+E02E8 => +"\xF3\xA0\x8B\xA9" => "", # U+E02E9 => +"\xF3\xA0\x8B\xAA" => "", # U+E02EA => +"\xF3\xA0\x8B\xAB" => "", # U+E02EB => +"\xF3\xA0\x8B\xAC" => "", # U+E02EC => +"\xF3\xA0\x8B\xAD" => "", # U+E02ED => +"\xF3\xA0\x8B\xAE" => "", # U+E02EE => +"\xF3\xA0\x8B\xAF" => "", # U+E02EF => +"\xF3\xA0\x8B\xB0" => "", # U+E02F0 => +"\xF3\xA0\x8B\xB1" => "", # U+E02F1 => +"\xF3\xA0\x8B\xB2" => "", # U+E02F2 => +"\xF3\xA0\x8B\xB3" => "", # U+E02F3 => +"\xF3\xA0\x8B\xB4" => "", # U+E02F4 => +"\xF3\xA0\x8B\xB5" => "", # U+E02F5 => +"\xF3\xA0\x8B\xB6" => "", # U+E02F6 => +"\xF3\xA0\x8B\xB7" => "", # U+E02F7 => +"\xF3\xA0\x8B\xB8" => "", # U+E02F8 => +"\xF3\xA0\x8B\xB9" => "", # U+E02F9 => +"\xF3\xA0\x8B\xBA" => "", # U+E02FA => +"\xF3\xA0\x8B\xBB" => "", # U+E02FB => +"\xF3\xA0\x8B\xBC" => "", # U+E02FC => +"\xF3\xA0\x8B\xBD" => "", # U+E02FD => +"\xF3\xA0\x8B\xBE" => "", # U+E02FE => +"\xF3\xA0\x8B\xBF" => "", # U+E02FF => +"\xF3\xA0\x8C\x80" => "", # U+E0300 => +"\xF3\xA0\x8C\x81" => "", # U+E0301 => +"\xF3\xA0\x8C\x82" => "", # U+E0302 => +"\xF3\xA0\x8C\x83" => "", # U+E0303 => +"\xF3\xA0\x8C\x84" => "", # U+E0304 => +"\xF3\xA0\x8C\x85" => "", # U+E0305 => +"\xF3\xA0\x8C\x86" => "", # U+E0306 => +"\xF3\xA0\x8C\x87" => "", # U+E0307 => +"\xF3\xA0\x8C\x88" => "", # U+E0308 => +"\xF3\xA0\x8C\x89" => "", # U+E0309 => +"\xF3\xA0\x8C\x8A" => "", # U+E030A => +"\xF3\xA0\x8C\x8B" => "", # U+E030B => +"\xF3\xA0\x8C\x8C" => "", # U+E030C => +"\xF3\xA0\x8C\x8D" => "", # U+E030D => +"\xF3\xA0\x8C\x8E" => "", # U+E030E => +"\xF3\xA0\x8C\x8F" => "", # U+E030F => +"\xF3\xA0\x8C\x90" => "", # U+E0310 => +"\xF3\xA0\x8C\x91" => "", # U+E0311 => +"\xF3\xA0\x8C\x92" => "", # U+E0312 => +"\xF3\xA0\x8C\x93" => "", # U+E0313 => +"\xF3\xA0\x8C\x94" => "", # U+E0314 => +"\xF3\xA0\x8C\x95" => "", # U+E0315 => +"\xF3\xA0\x8C\x96" => "", # U+E0316 => +"\xF3\xA0\x8C\x97" => "", # U+E0317 => +"\xF3\xA0\x8C\x98" => "", # U+E0318 => +"\xF3\xA0\x8C\x99" => "", # U+E0319 => +"\xF3\xA0\x8C\x9A" => "", # U+E031A => +"\xF3\xA0\x8C\x9B" => "", # U+E031B => +"\xF3\xA0\x8C\x9C" => "", # U+E031C => +"\xF3\xA0\x8C\x9D" => "", # U+E031D => +"\xF3\xA0\x8C\x9E" => "", # U+E031E => +"\xF3\xA0\x8C\x9F" => "", # U+E031F => +"\xF3\xA0\x8C\xA0" => "", # U+E0320 => +"\xF3\xA0\x8C\xA1" => "", # U+E0321 => +"\xF3\xA0\x8C\xA2" => "", # U+E0322 => +"\xF3\xA0\x8C\xA3" => "", # U+E0323 => +"\xF3\xA0\x8C\xA4" => "", # U+E0324 => +"\xF3\xA0\x8C\xA5" => "", # U+E0325 => +"\xF3\xA0\x8C\xA6" => "", # U+E0326 => +"\xF3\xA0\x8C\xA7" => "", # U+E0327 => +"\xF3\xA0\x8C\xA8" => "", # U+E0328 => +"\xF3\xA0\x8C\xA9" => "", # U+E0329 => +"\xF3\xA0\x8C\xAA" => "", # U+E032A => +"\xF3\xA0\x8C\xAB" => "", # U+E032B => +"\xF3\xA0\x8C\xAC" => "", # U+E032C => +"\xF3\xA0\x8C\xAD" => "", # U+E032D => +"\xF3\xA0\x8C\xAE" => "", # U+E032E => +"\xF3\xA0\x8C\xAF" => "", # U+E032F => +"\xF3\xA0\x8C\xB0" => "", # U+E0330 => +"\xF3\xA0\x8C\xB1" => "", # U+E0331 => +"\xF3\xA0\x8C\xB2" => "", # U+E0332 => +"\xF3\xA0\x8C\xB3" => "", # U+E0333 => +"\xF3\xA0\x8C\xB4" => "", # U+E0334 => +"\xF3\xA0\x8C\xB5" => "", # U+E0335 => +"\xF3\xA0\x8C\xB6" => "", # U+E0336 => +"\xF3\xA0\x8C\xB7" => "", # U+E0337 => +"\xF3\xA0\x8C\xB8" => "", # U+E0338 => +"\xF3\xA0\x8C\xB9" => "", # U+E0339 => +"\xF3\xA0\x8C\xBA" => "", # U+E033A => +"\xF3\xA0\x8C\xBB" => "", # U+E033B => +"\xF3\xA0\x8C\xBC" => "", # U+E033C => +"\xF3\xA0\x8C\xBD" => "", # U+E033D => +"\xF3\xA0\x8C\xBE" => "", # U+E033E => +"\xF3\xA0\x8C\xBF" => "", # U+E033F => +"\xF3\xA0\x8D\x80" => "", # U+E0340 => +"\xF3\xA0\x8D\x81" => "", # U+E0341 => +"\xF3\xA0\x8D\x82" => "", # U+E0342 => +"\xF3\xA0\x8D\x83" => "", # U+E0343 => +"\xF3\xA0\x8D\x84" => "", # U+E0344 => +"\xF3\xA0\x8D\x85" => "", # U+E0345 => +"\xF3\xA0\x8D\x86" => "", # U+E0346 => +"\xF3\xA0\x8D\x87" => "", # U+E0347 => +"\xF3\xA0\x8D\x88" => "", # U+E0348 => +"\xF3\xA0\x8D\x89" => "", # U+E0349 => +"\xF3\xA0\x8D\x8A" => "", # U+E034A => +"\xF3\xA0\x8D\x8B" => "", # U+E034B => +"\xF3\xA0\x8D\x8C" => "", # U+E034C => +"\xF3\xA0\x8D\x8D" => "", # U+E034D => +"\xF3\xA0\x8D\x8E" => "", # U+E034E => +"\xF3\xA0\x8D\x8F" => "", # U+E034F => +"\xF3\xA0\x8D\x90" => "", # U+E0350 => +"\xF3\xA0\x8D\x91" => "", # U+E0351 => +"\xF3\xA0\x8D\x92" => "", # U+E0352 => +"\xF3\xA0\x8D\x93" => "", # U+E0353 => +"\xF3\xA0\x8D\x94" => "", # U+E0354 => +"\xF3\xA0\x8D\x95" => "", # U+E0355 => +"\xF3\xA0\x8D\x96" => "", # U+E0356 => +"\xF3\xA0\x8D\x97" => "", # U+E0357 => +"\xF3\xA0\x8D\x98" => "", # U+E0358 => +"\xF3\xA0\x8D\x99" => "", # U+E0359 => +"\xF3\xA0\x8D\x9A" => "", # U+E035A => +"\xF3\xA0\x8D\x9B" => "", # U+E035B => +"\xF3\xA0\x8D\x9C" => "", # U+E035C => +"\xF3\xA0\x8D\x9D" => "", # U+E035D => +"\xF3\xA0\x8D\x9E" => "", # U+E035E => +"\xF3\xA0\x8D\x9F" => "", # U+E035F => +"\xF3\xA0\x8D\xA0" => "", # U+E0360 => +"\xF3\xA0\x8D\xA1" => "", # U+E0361 => +"\xF3\xA0\x8D\xA2" => "", # U+E0362 => +"\xF3\xA0\x8D\xA3" => "", # U+E0363 => +"\xF3\xA0\x8D\xA4" => "", # U+E0364 => +"\xF3\xA0\x8D\xA5" => "", # U+E0365 => +"\xF3\xA0\x8D\xA6" => "", # U+E0366 => +"\xF3\xA0\x8D\xA7" => "", # U+E0367 => +"\xF3\xA0\x8D\xA8" => "", # U+E0368 => +"\xF3\xA0\x8D\xA9" => "", # U+E0369 => +"\xF3\xA0\x8D\xAA" => "", # U+E036A => +"\xF3\xA0\x8D\xAB" => "", # U+E036B => +"\xF3\xA0\x8D\xAC" => "", # U+E036C => +"\xF3\xA0\x8D\xAD" => "", # U+E036D => +"\xF3\xA0\x8D\xAE" => "", # U+E036E => +"\xF3\xA0\x8D\xAF" => "", # U+E036F => +"\xF3\xA0\x8D\xB0" => "", # U+E0370 => +"\xF3\xA0\x8D\xB1" => "", # U+E0371 => +"\xF3\xA0\x8D\xB2" => "", # U+E0372 => +"\xF3\xA0\x8D\xB3" => "", # U+E0373 => +"\xF3\xA0\x8D\xB4" => "", # U+E0374 => +"\xF3\xA0\x8D\xB5" => "", # U+E0375 => +"\xF3\xA0\x8D\xB6" => "", # U+E0376 => +"\xF3\xA0\x8D\xB7" => "", # U+E0377 => +"\xF3\xA0\x8D\xB8" => "", # U+E0378 => +"\xF3\xA0\x8D\xB9" => "", # U+E0379 => +"\xF3\xA0\x8D\xBA" => "", # U+E037A => +"\xF3\xA0\x8D\xBB" => "", # U+E037B => +"\xF3\xA0\x8D\xBC" => "", # U+E037C => +"\xF3\xA0\x8D\xBD" => "", # U+E037D => +"\xF3\xA0\x8D\xBE" => "", # U+E037E => +"\xF3\xA0\x8D\xBF" => "", # U+E037F => +"\xF3\xA0\x8E\x80" => "", # U+E0380 => +"\xF3\xA0\x8E\x81" => "", # U+E0381 => +"\xF3\xA0\x8E\x82" => "", # U+E0382 => +"\xF3\xA0\x8E\x83" => "", # U+E0383 => +"\xF3\xA0\x8E\x84" => "", # U+E0384 => +"\xF3\xA0\x8E\x85" => "", # U+E0385 => +"\xF3\xA0\x8E\x86" => "", # U+E0386 => +"\xF3\xA0\x8E\x87" => "", # U+E0387 => +"\xF3\xA0\x8E\x88" => "", # U+E0388 => +"\xF3\xA0\x8E\x89" => "", # U+E0389 => +"\xF3\xA0\x8E\x8A" => "", # U+E038A => +"\xF3\xA0\x8E\x8B" => "", # U+E038B => +"\xF3\xA0\x8E\x8C" => "", # U+E038C => +"\xF3\xA0\x8E\x8D" => "", # U+E038D => +"\xF3\xA0\x8E\x8E" => "", # U+E038E => +"\xF3\xA0\x8E\x8F" => "", # U+E038F => +"\xF3\xA0\x8E\x90" => "", # U+E0390 => +"\xF3\xA0\x8E\x91" => "", # U+E0391 => +"\xF3\xA0\x8E\x92" => "", # U+E0392 => +"\xF3\xA0\x8E\x93" => "", # U+E0393 => +"\xF3\xA0\x8E\x94" => "", # U+E0394 => +"\xF3\xA0\x8E\x95" => "", # U+E0395 => +"\xF3\xA0\x8E\x96" => "", # U+E0396 => +"\xF3\xA0\x8E\x97" => "", # U+E0397 => +"\xF3\xA0\x8E\x98" => "", # U+E0398 => +"\xF3\xA0\x8E\x99" => "", # U+E0399 => +"\xF3\xA0\x8E\x9A" => "", # U+E039A => +"\xF3\xA0\x8E\x9B" => "", # U+E039B => +"\xF3\xA0\x8E\x9C" => "", # U+E039C => +"\xF3\xA0\x8E\x9D" => "", # U+E039D => +"\xF3\xA0\x8E\x9E" => "", # U+E039E => +"\xF3\xA0\x8E\x9F" => "", # U+E039F => +"\xF3\xA0\x8E\xA0" => "", # U+E03A0 => +"\xF3\xA0\x8E\xA1" => "", # U+E03A1 => +"\xF3\xA0\x8E\xA2" => "", # U+E03A2 => +"\xF3\xA0\x8E\xA3" => "", # U+E03A3 => +"\xF3\xA0\x8E\xA4" => "", # U+E03A4 => +"\xF3\xA0\x8E\xA5" => "", # U+E03A5 => +"\xF3\xA0\x8E\xA6" => "", # U+E03A6 => +"\xF3\xA0\x8E\xA7" => "", # U+E03A7 => +"\xF3\xA0\x8E\xA8" => "", # U+E03A8 => +"\xF3\xA0\x8E\xA9" => "", # U+E03A9 => +"\xF3\xA0\x8E\xAA" => "", # U+E03AA => +"\xF3\xA0\x8E\xAB" => "", # U+E03AB => +"\xF3\xA0\x8E\xAC" => "", # U+E03AC => +"\xF3\xA0\x8E\xAD" => "", # U+E03AD => +"\xF3\xA0\x8E\xAE" => "", # U+E03AE => +"\xF3\xA0\x8E\xAF" => "", # U+E03AF => +"\xF3\xA0\x8E\xB0" => "", # U+E03B0 => +"\xF3\xA0\x8E\xB1" => "", # U+E03B1 => +"\xF3\xA0\x8E\xB2" => "", # U+E03B2 => +"\xF3\xA0\x8E\xB3" => "", # U+E03B3 => +"\xF3\xA0\x8E\xB4" => "", # U+E03B4 => +"\xF3\xA0\x8E\xB5" => "", # U+E03B5 => +"\xF3\xA0\x8E\xB6" => "", # U+E03B6 => +"\xF3\xA0\x8E\xB7" => "", # U+E03B7 => +"\xF3\xA0\x8E\xB8" => "", # U+E03B8 => +"\xF3\xA0\x8E\xB9" => "", # U+E03B9 => +"\xF3\xA0\x8E\xBA" => "", # U+E03BA => +"\xF3\xA0\x8E\xBB" => "", # U+E03BB => +"\xF3\xA0\x8E\xBC" => "", # U+E03BC => +"\xF3\xA0\x8E\xBD" => "", # U+E03BD => +"\xF3\xA0\x8E\xBE" => "", # U+E03BE => +"\xF3\xA0\x8E\xBF" => "", # U+E03BF => +"\xF3\xA0\x8F\x80" => "", # U+E03C0 => +"\xF3\xA0\x8F\x81" => "", # U+E03C1 => +"\xF3\xA0\x8F\x82" => "", # U+E03C2 => +"\xF3\xA0\x8F\x83" => "", # U+E03C3 => +"\xF3\xA0\x8F\x84" => "", # U+E03C4 => +"\xF3\xA0\x8F\x85" => "", # U+E03C5 => +"\xF3\xA0\x8F\x86" => "", # U+E03C6 => +"\xF3\xA0\x8F\x87" => "", # U+E03C7 => +"\xF3\xA0\x8F\x88" => "", # U+E03C8 => +"\xF3\xA0\x8F\x89" => "", # U+E03C9 => +"\xF3\xA0\x8F\x8A" => "", # U+E03CA => +"\xF3\xA0\x8F\x8B" => "", # U+E03CB => +"\xF3\xA0\x8F\x8C" => "", # U+E03CC => +"\xF3\xA0\x8F\x8D" => "", # U+E03CD => +"\xF3\xA0\x8F\x8E" => "", # U+E03CE => +"\xF3\xA0\x8F\x8F" => "", # U+E03CF => +"\xF3\xA0\x8F\x90" => "", # U+E03D0 => +"\xF3\xA0\x8F\x91" => "", # U+E03D1 => +"\xF3\xA0\x8F\x92" => "", # U+E03D2 => +"\xF3\xA0\x8F\x93" => "", # U+E03D3 => +"\xF3\xA0\x8F\x94" => "", # U+E03D4 => +"\xF3\xA0\x8F\x95" => "", # U+E03D5 => +"\xF3\xA0\x8F\x96" => "", # U+E03D6 => +"\xF3\xA0\x8F\x97" => "", # U+E03D7 => +"\xF3\xA0\x8F\x98" => "", # U+E03D8 => +"\xF3\xA0\x8F\x99" => "", # U+E03D9 => +"\xF3\xA0\x8F\x9A" => "", # U+E03DA => +"\xF3\xA0\x8F\x9B" => "", # U+E03DB => +"\xF3\xA0\x8F\x9C" => "", # U+E03DC => +"\xF3\xA0\x8F\x9D" => "", # U+E03DD => +"\xF3\xA0\x8F\x9E" => "", # U+E03DE => +"\xF3\xA0\x8F\x9F" => "", # U+E03DF => +"\xF3\xA0\x8F\xA0" => "", # U+E03E0 => +"\xF3\xA0\x8F\xA1" => "", # U+E03E1 => +"\xF3\xA0\x8F\xA2" => "", # U+E03E2 => +"\xF3\xA0\x8F\xA3" => "", # U+E03E3 => +"\xF3\xA0\x8F\xA4" => "", # U+E03E4 => +"\xF3\xA0\x8F\xA5" => "", # U+E03E5 => +"\xF3\xA0\x8F\xA6" => "", # U+E03E6 => +"\xF3\xA0\x8F\xA7" => "", # U+E03E7 => +"\xF3\xA0\x8F\xA8" => "", # U+E03E8 => +"\xF3\xA0\x8F\xA9" => "", # U+E03E9 => +"\xF3\xA0\x8F\xAA" => "", # U+E03EA => +"\xF3\xA0\x8F\xAB" => "", # U+E03EB => +"\xF3\xA0\x8F\xAC" => "", # U+E03EC => +"\xF3\xA0\x8F\xAD" => "", # U+E03ED => +"\xF3\xA0\x8F\xAE" => "", # U+E03EE => +"\xF3\xA0\x8F\xAF" => "", # U+E03EF => +"\xF3\xA0\x8F\xB0" => "", # U+E03F0 => +"\xF3\xA0\x8F\xB1" => "", # U+E03F1 => +"\xF3\xA0\x8F\xB2" => "", # U+E03F2 => +"\xF3\xA0\x8F\xB3" => "", # U+E03F3 => +"\xF3\xA0\x8F\xB4" => "", # U+E03F4 => +"\xF3\xA0\x8F\xB5" => "", # U+E03F5 => +"\xF3\xA0\x8F\xB6" => "", # U+E03F6 => +"\xF3\xA0\x8F\xB7" => "", # U+E03F7 => +"\xF3\xA0\x8F\xB8" => "", # U+E03F8 => +"\xF3\xA0\x8F\xB9" => "", # U+E03F9 => +"\xF3\xA0\x8F\xBA" => "", # U+E03FA => +"\xF3\xA0\x8F\xBB" => "", # U+E03FB => +"\xF3\xA0\x8F\xBC" => "", # U+E03FC => +"\xF3\xA0\x8F\xBD" => "", # U+E03FD => +"\xF3\xA0\x8F\xBE" => "", # U+E03FE => +"\xF3\xA0\x8F\xBF" => "", # U+E03FF => +"\xF3\xA0\x90\x80" => "", # U+E0400 => +"\xF3\xA0\x90\x81" => "", # U+E0401 => +"\xF3\xA0\x90\x82" => "", # U+E0402 => +"\xF3\xA0\x90\x83" => "", # U+E0403 => +"\xF3\xA0\x90\x84" => "", # U+E0404 => +"\xF3\xA0\x90\x85" => "", # U+E0405 => +"\xF3\xA0\x90\x86" => "", # U+E0406 => +"\xF3\xA0\x90\x87" => "", # U+E0407 => +"\xF3\xA0\x90\x88" => "", # U+E0408 => +"\xF3\xA0\x90\x89" => "", # U+E0409 => +"\xF3\xA0\x90\x8A" => "", # U+E040A => +"\xF3\xA0\x90\x8B" => "", # U+E040B => +"\xF3\xA0\x90\x8C" => "", # U+E040C => +"\xF3\xA0\x90\x8D" => "", # U+E040D => +"\xF3\xA0\x90\x8E" => "", # U+E040E => +"\xF3\xA0\x90\x8F" => "", # U+E040F => +"\xF3\xA0\x90\x90" => "", # U+E0410 => +"\xF3\xA0\x90\x91" => "", # U+E0411 => +"\xF3\xA0\x90\x92" => "", # U+E0412 => +"\xF3\xA0\x90\x93" => "", # U+E0413 => +"\xF3\xA0\x90\x94" => "", # U+E0414 => +"\xF3\xA0\x90\x95" => "", # U+E0415 => +"\xF3\xA0\x90\x96" => "", # U+E0416 => +"\xF3\xA0\x90\x97" => "", # U+E0417 => +"\xF3\xA0\x90\x98" => "", # U+E0418 => +"\xF3\xA0\x90\x99" => "", # U+E0419 => +"\xF3\xA0\x90\x9A" => "", # U+E041A => +"\xF3\xA0\x90\x9B" => "", # U+E041B => +"\xF3\xA0\x90\x9C" => "", # U+E041C => +"\xF3\xA0\x90\x9D" => "", # U+E041D => +"\xF3\xA0\x90\x9E" => "", # U+E041E => +"\xF3\xA0\x90\x9F" => "", # U+E041F => +"\xF3\xA0\x90\xA0" => "", # U+E0420 => +"\xF3\xA0\x90\xA1" => "", # U+E0421 => +"\xF3\xA0\x90\xA2" => "", # U+E0422 => +"\xF3\xA0\x90\xA3" => "", # U+E0423 => +"\xF3\xA0\x90\xA4" => "", # U+E0424 => +"\xF3\xA0\x90\xA5" => "", # U+E0425 => +"\xF3\xA0\x90\xA6" => "", # U+E0426 => +"\xF3\xA0\x90\xA7" => "", # U+E0427 => +"\xF3\xA0\x90\xA8" => "", # U+E0428 => +"\xF3\xA0\x90\xA9" => "", # U+E0429 => +"\xF3\xA0\x90\xAA" => "", # U+E042A => +"\xF3\xA0\x90\xAB" => "", # U+E042B => +"\xF3\xA0\x90\xAC" => "", # U+E042C => +"\xF3\xA0\x90\xAD" => "", # U+E042D => +"\xF3\xA0\x90\xAE" => "", # U+E042E => +"\xF3\xA0\x90\xAF" => "", # U+E042F => +"\xF3\xA0\x90\xB0" => "", # U+E0430 => +"\xF3\xA0\x90\xB1" => "", # U+E0431 => +"\xF3\xA0\x90\xB2" => "", # U+E0432 => +"\xF3\xA0\x90\xB3" => "", # U+E0433 => +"\xF3\xA0\x90\xB4" => "", # U+E0434 => +"\xF3\xA0\x90\xB5" => "", # U+E0435 => +"\xF3\xA0\x90\xB6" => "", # U+E0436 => +"\xF3\xA0\x90\xB7" => "", # U+E0437 => +"\xF3\xA0\x90\xB8" => "", # U+E0438 => +"\xF3\xA0\x90\xB9" => "", # U+E0439 => +"\xF3\xA0\x90\xBA" => "", # U+E043A => +"\xF3\xA0\x90\xBB" => "", # U+E043B => +"\xF3\xA0\x90\xBC" => "", # U+E043C => +"\xF3\xA0\x90\xBD" => "", # U+E043D => +"\xF3\xA0\x90\xBE" => "", # U+E043E => +"\xF3\xA0\x90\xBF" => "", # U+E043F => +"\xF3\xA0\x91\x80" => "", # U+E0440 => +"\xF3\xA0\x91\x81" => "", # U+E0441 => +"\xF3\xA0\x91\x82" => "", # U+E0442 => +"\xF3\xA0\x91\x83" => "", # U+E0443 => +"\xF3\xA0\x91\x84" => "", # U+E0444 => +"\xF3\xA0\x91\x85" => "", # U+E0445 => +"\xF3\xA0\x91\x86" => "", # U+E0446 => +"\xF3\xA0\x91\x87" => "", # U+E0447 => +"\xF3\xA0\x91\x88" => "", # U+E0448 => +"\xF3\xA0\x91\x89" => "", # U+E0449 => +"\xF3\xA0\x91\x8A" => "", # U+E044A => +"\xF3\xA0\x91\x8B" => "", # U+E044B => +"\xF3\xA0\x91\x8C" => "", # U+E044C => +"\xF3\xA0\x91\x8D" => "", # U+E044D => +"\xF3\xA0\x91\x8E" => "", # U+E044E => +"\xF3\xA0\x91\x8F" => "", # U+E044F => +"\xF3\xA0\x91\x90" => "", # U+E0450 => +"\xF3\xA0\x91\x91" => "", # U+E0451 => +"\xF3\xA0\x91\x92" => "", # U+E0452 => +"\xF3\xA0\x91\x93" => "", # U+E0453 => +"\xF3\xA0\x91\x94" => "", # U+E0454 => +"\xF3\xA0\x91\x95" => "", # U+E0455 => +"\xF3\xA0\x91\x96" => "", # U+E0456 => +"\xF3\xA0\x91\x97" => "", # U+E0457 => +"\xF3\xA0\x91\x98" => "", # U+E0458 => +"\xF3\xA0\x91\x99" => "", # U+E0459 => +"\xF3\xA0\x91\x9A" => "", # U+E045A => +"\xF3\xA0\x91\x9B" => "", # U+E045B => +"\xF3\xA0\x91\x9C" => "", # U+E045C => +"\xF3\xA0\x91\x9D" => "", # U+E045D => +"\xF3\xA0\x91\x9E" => "", # U+E045E => +"\xF3\xA0\x91\x9F" => "", # U+E045F => +"\xF3\xA0\x91\xA0" => "", # U+E0460 => +"\xF3\xA0\x91\xA1" => "", # U+E0461 => +"\xF3\xA0\x91\xA2" => "", # U+E0462 => +"\xF3\xA0\x91\xA3" => "", # U+E0463 => +"\xF3\xA0\x91\xA4" => "", # U+E0464 => +"\xF3\xA0\x91\xA5" => "", # U+E0465 => +"\xF3\xA0\x91\xA6" => "", # U+E0466 => +"\xF3\xA0\x91\xA7" => "", # U+E0467 => +"\xF3\xA0\x91\xA8" => "", # U+E0468 => +"\xF3\xA0\x91\xA9" => "", # U+E0469 => +"\xF3\xA0\x91\xAA" => "", # U+E046A => +"\xF3\xA0\x91\xAB" => "", # U+E046B => +"\xF3\xA0\x91\xAC" => "", # U+E046C => +"\xF3\xA0\x91\xAD" => "", # U+E046D => +"\xF3\xA0\x91\xAE" => "", # U+E046E => +"\xF3\xA0\x91\xAF" => "", # U+E046F => +"\xF3\xA0\x91\xB0" => "", # U+E0470 => +"\xF3\xA0\x91\xB1" => "", # U+E0471 => +"\xF3\xA0\x91\xB2" => "", # U+E0472 => +"\xF3\xA0\x91\xB3" => "", # U+E0473 => +"\xF3\xA0\x91\xB4" => "", # U+E0474 => +"\xF3\xA0\x91\xB5" => "", # U+E0475 => +"\xF3\xA0\x91\xB6" => "", # U+E0476 => +"\xF3\xA0\x91\xB7" => "", # U+E0477 => +"\xF3\xA0\x91\xB8" => "", # U+E0478 => +"\xF3\xA0\x91\xB9" => "", # U+E0479 => +"\xF3\xA0\x91\xBA" => "", # U+E047A => +"\xF3\xA0\x91\xBB" => "", # U+E047B => +"\xF3\xA0\x91\xBC" => "", # U+E047C => +"\xF3\xA0\x91\xBD" => "", # U+E047D => +"\xF3\xA0\x91\xBE" => "", # U+E047E => +"\xF3\xA0\x91\xBF" => "", # U+E047F => +"\xF3\xA0\x92\x80" => "", # U+E0480 => +"\xF3\xA0\x92\x81" => "", # U+E0481 => +"\xF3\xA0\x92\x82" => "", # U+E0482 => +"\xF3\xA0\x92\x83" => "", # U+E0483 => +"\xF3\xA0\x92\x84" => "", # U+E0484 => +"\xF3\xA0\x92\x85" => "", # U+E0485 => +"\xF3\xA0\x92\x86" => "", # U+E0486 => +"\xF3\xA0\x92\x87" => "", # U+E0487 => +"\xF3\xA0\x92\x88" => "", # U+E0488 => +"\xF3\xA0\x92\x89" => "", # U+E0489 => +"\xF3\xA0\x92\x8A" => "", # U+E048A => +"\xF3\xA0\x92\x8B" => "", # U+E048B => +"\xF3\xA0\x92\x8C" => "", # U+E048C => +"\xF3\xA0\x92\x8D" => "", # U+E048D => +"\xF3\xA0\x92\x8E" => "", # U+E048E => +"\xF3\xA0\x92\x8F" => "", # U+E048F => +"\xF3\xA0\x92\x90" => "", # U+E0490 => +"\xF3\xA0\x92\x91" => "", # U+E0491 => +"\xF3\xA0\x92\x92" => "", # U+E0492 => +"\xF3\xA0\x92\x93" => "", # U+E0493 => +"\xF3\xA0\x92\x94" => "", # U+E0494 => +"\xF3\xA0\x92\x95" => "", # U+E0495 => +"\xF3\xA0\x92\x96" => "", # U+E0496 => +"\xF3\xA0\x92\x97" => "", # U+E0497 => +"\xF3\xA0\x92\x98" => "", # U+E0498 => +"\xF3\xA0\x92\x99" => "", # U+E0499 => +"\xF3\xA0\x92\x9A" => "", # U+E049A => +"\xF3\xA0\x92\x9B" => "", # U+E049B => +"\xF3\xA0\x92\x9C" => "", # U+E049C => +"\xF3\xA0\x92\x9D" => "", # U+E049D => +"\xF3\xA0\x92\x9E" => "", # U+E049E => +"\xF3\xA0\x92\x9F" => "", # U+E049F => +"\xF3\xA0\x92\xA0" => "", # U+E04A0 => +"\xF3\xA0\x92\xA1" => "", # U+E04A1 => +"\xF3\xA0\x92\xA2" => "", # U+E04A2 => +"\xF3\xA0\x92\xA3" => "", # U+E04A3 => +"\xF3\xA0\x92\xA4" => "", # U+E04A4 => +"\xF3\xA0\x92\xA5" => "", # U+E04A5 => +"\xF3\xA0\x92\xA6" => "", # U+E04A6 => +"\xF3\xA0\x92\xA7" => "", # U+E04A7 => +"\xF3\xA0\x92\xA8" => "", # U+E04A8 => +"\xF3\xA0\x92\xA9" => "", # U+E04A9 => +"\xF3\xA0\x92\xAA" => "", # U+E04AA => +"\xF3\xA0\x92\xAB" => "", # U+E04AB => +"\xF3\xA0\x92\xAC" => "", # U+E04AC => +"\xF3\xA0\x92\xAD" => "", # U+E04AD => +"\xF3\xA0\x92\xAE" => "", # U+E04AE => +"\xF3\xA0\x92\xAF" => "", # U+E04AF => +"\xF3\xA0\x92\xB0" => "", # U+E04B0 => +"\xF3\xA0\x92\xB1" => "", # U+E04B1 => +"\xF3\xA0\x92\xB2" => "", # U+E04B2 => +"\xF3\xA0\x92\xB3" => "", # U+E04B3 => +"\xF3\xA0\x92\xB4" => "", # U+E04B4 => +"\xF3\xA0\x92\xB5" => "", # U+E04B5 => +"\xF3\xA0\x92\xB6" => "", # U+E04B6 => +"\xF3\xA0\x92\xB7" => "", # U+E04B7 => +"\xF3\xA0\x92\xB8" => "", # U+E04B8 => +"\xF3\xA0\x92\xB9" => "", # U+E04B9 => +"\xF3\xA0\x92\xBA" => "", # U+E04BA => +"\xF3\xA0\x92\xBB" => "", # U+E04BB => +"\xF3\xA0\x92\xBC" => "", # U+E04BC => +"\xF3\xA0\x92\xBD" => "", # U+E04BD => +"\xF3\xA0\x92\xBE" => "", # U+E04BE => +"\xF3\xA0\x92\xBF" => "", # U+E04BF => +"\xF3\xA0\x93\x80" => "", # U+E04C0 => +"\xF3\xA0\x93\x81" => "", # U+E04C1 => +"\xF3\xA0\x93\x82" => "", # U+E04C2 => +"\xF3\xA0\x93\x83" => "", # U+E04C3 => +"\xF3\xA0\x93\x84" => "", # U+E04C4 => +"\xF3\xA0\x93\x85" => "", # U+E04C5 => +"\xF3\xA0\x93\x86" => "", # U+E04C6 => +"\xF3\xA0\x93\x87" => "", # U+E04C7 => +"\xF3\xA0\x93\x88" => "", # U+E04C8 => +"\xF3\xA0\x93\x89" => "", # U+E04C9 => +"\xF3\xA0\x93\x8A" => "", # U+E04CA => +"\xF3\xA0\x93\x8B" => "", # U+E04CB => +"\xF3\xA0\x93\x8C" => "", # U+E04CC => +"\xF3\xA0\x93\x8D" => "", # U+E04CD => +"\xF3\xA0\x93\x8E" => "", # U+E04CE => +"\xF3\xA0\x93\x8F" => "", # U+E04CF => +"\xF3\xA0\x93\x90" => "", # U+E04D0 => +"\xF3\xA0\x93\x91" => "", # U+E04D1 => +"\xF3\xA0\x93\x92" => "", # U+E04D2 => +"\xF3\xA0\x93\x93" => "", # U+E04D3 => +"\xF3\xA0\x93\x94" => "", # U+E04D4 => +"\xF3\xA0\x93\x95" => "", # U+E04D5 => +"\xF3\xA0\x93\x96" => "", # U+E04D6 => +"\xF3\xA0\x93\x97" => "", # U+E04D7 => +"\xF3\xA0\x93\x98" => "", # U+E04D8 => +"\xF3\xA0\x93\x99" => "", # U+E04D9 => +"\xF3\xA0\x93\x9A" => "", # U+E04DA => +"\xF3\xA0\x93\x9B" => "", # U+E04DB => +"\xF3\xA0\x93\x9C" => "", # U+E04DC => +"\xF3\xA0\x93\x9D" => "", # U+E04DD => +"\xF3\xA0\x93\x9E" => "", # U+E04DE => +"\xF3\xA0\x93\x9F" => "", # U+E04DF => +"\xF3\xA0\x93\xA0" => "", # U+E04E0 => +"\xF3\xA0\x93\xA1" => "", # U+E04E1 => +"\xF3\xA0\x93\xA2" => "", # U+E04E2 => +"\xF3\xA0\x93\xA3" => "", # U+E04E3 => +"\xF3\xA0\x93\xA4" => "", # U+E04E4 => +"\xF3\xA0\x93\xA5" => "", # U+E04E5 => +"\xF3\xA0\x93\xA6" => "", # U+E04E6 => +"\xF3\xA0\x93\xA7" => "", # U+E04E7 => +"\xF3\xA0\x93\xA8" => "", # U+E04E8 => +"\xF3\xA0\x93\xA9" => "", # U+E04E9 => +"\xF3\xA0\x93\xAA" => "", # U+E04EA => +"\xF3\xA0\x93\xAB" => "", # U+E04EB => +"\xF3\xA0\x93\xAC" => "", # U+E04EC => +"\xF3\xA0\x93\xAD" => "", # U+E04ED => +"\xF3\xA0\x93\xAE" => "", # U+E04EE => +"\xF3\xA0\x93\xAF" => "", # U+E04EF => +"\xF3\xA0\x93\xB0" => "", # U+E04F0 => +"\xF3\xA0\x93\xB1" => "", # U+E04F1 => +"\xF3\xA0\x93\xB2" => "", # U+E04F2 => +"\xF3\xA0\x93\xB3" => "", # U+E04F3 => +"\xF3\xA0\x93\xB4" => "", # U+E04F4 => +"\xF3\xA0\x93\xB5" => "", # U+E04F5 => +"\xF3\xA0\x93\xB6" => "", # U+E04F6 => +"\xF3\xA0\x93\xB7" => "", # U+E04F7 => +"\xF3\xA0\x93\xB8" => "", # U+E04F8 => +"\xF3\xA0\x93\xB9" => "", # U+E04F9 => +"\xF3\xA0\x93\xBA" => "", # U+E04FA => +"\xF3\xA0\x93\xBB" => "", # U+E04FB => +"\xF3\xA0\x93\xBC" => "", # U+E04FC => +"\xF3\xA0\x93\xBD" => "", # U+E04FD => +"\xF3\xA0\x93\xBE" => "", # U+E04FE => +"\xF3\xA0\x93\xBF" => "", # U+E04FF => +"\xF3\xA0\x94\x80" => "", # U+E0500 => +"\xF3\xA0\x94\x81" => "", # U+E0501 => +"\xF3\xA0\x94\x82" => "", # U+E0502 => +"\xF3\xA0\x94\x83" => "", # U+E0503 => +"\xF3\xA0\x94\x84" => "", # U+E0504 => +"\xF3\xA0\x94\x85" => "", # U+E0505 => +"\xF3\xA0\x94\x86" => "", # U+E0506 => +"\xF3\xA0\x94\x87" => "", # U+E0507 => +"\xF3\xA0\x94\x88" => "", # U+E0508 => +"\xF3\xA0\x94\x89" => "", # U+E0509 => +"\xF3\xA0\x94\x8A" => "", # U+E050A => +"\xF3\xA0\x94\x8B" => "", # U+E050B => +"\xF3\xA0\x94\x8C" => "", # U+E050C => +"\xF3\xA0\x94\x8D" => "", # U+E050D => +"\xF3\xA0\x94\x8E" => "", # U+E050E => +"\xF3\xA0\x94\x8F" => "", # U+E050F => +"\xF3\xA0\x94\x90" => "", # U+E0510 => +"\xF3\xA0\x94\x91" => "", # U+E0511 => +"\xF3\xA0\x94\x92" => "", # U+E0512 => +"\xF3\xA0\x94\x93" => "", # U+E0513 => +"\xF3\xA0\x94\x94" => "", # U+E0514 => +"\xF3\xA0\x94\x95" => "", # U+E0515 => +"\xF3\xA0\x94\x96" => "", # U+E0516 => +"\xF3\xA0\x94\x97" => "", # U+E0517 => +"\xF3\xA0\x94\x98" => "", # U+E0518 => +"\xF3\xA0\x94\x99" => "", # U+E0519 => +"\xF3\xA0\x94\x9A" => "", # U+E051A => +"\xF3\xA0\x94\x9B" => "", # U+E051B => +"\xF3\xA0\x94\x9C" => "", # U+E051C => +"\xF3\xA0\x94\x9D" => "", # U+E051D => +"\xF3\xA0\x94\x9E" => "", # U+E051E => +"\xF3\xA0\x94\x9F" => "", # U+E051F => +"\xF3\xA0\x94\xA0" => "", # U+E0520 => +"\xF3\xA0\x94\xA1" => "", # U+E0521 => +"\xF3\xA0\x94\xA2" => "", # U+E0522 => +"\xF3\xA0\x94\xA3" => "", # U+E0523 => +"\xF3\xA0\x94\xA4" => "", # U+E0524 => +"\xF3\xA0\x94\xA5" => "", # U+E0525 => +"\xF3\xA0\x94\xA6" => "", # U+E0526 => +"\xF3\xA0\x94\xA7" => "", # U+E0527 => +"\xF3\xA0\x94\xA8" => "", # U+E0528 => +"\xF3\xA0\x94\xA9" => "", # U+E0529 => +"\xF3\xA0\x94\xAA" => "", # U+E052A => +"\xF3\xA0\x94\xAB" => "", # U+E052B => +"\xF3\xA0\x94\xAC" => "", # U+E052C => +"\xF3\xA0\x94\xAD" => "", # U+E052D => +"\xF3\xA0\x94\xAE" => "", # U+E052E => +"\xF3\xA0\x94\xAF" => "", # U+E052F => +"\xF3\xA0\x94\xB0" => "", # U+E0530 => +"\xF3\xA0\x94\xB1" => "", # U+E0531 => +"\xF3\xA0\x94\xB2" => "", # U+E0532 => +"\xF3\xA0\x94\xB3" => "", # U+E0533 => +"\xF3\xA0\x94\xB4" => "", # U+E0534 => +"\xF3\xA0\x94\xB5" => "", # U+E0535 => +"\xF3\xA0\x94\xB6" => "", # U+E0536 => +"\xF3\xA0\x94\xB7" => "", # U+E0537 => +"\xF3\xA0\x94\xB8" => "", # U+E0538 => +"\xF3\xA0\x94\xB9" => "", # U+E0539 => +"\xF3\xA0\x94\xBA" => "", # U+E053A => +"\xF3\xA0\x94\xBB" => "", # U+E053B => +"\xF3\xA0\x94\xBC" => "", # U+E053C => +"\xF3\xA0\x94\xBD" => "", # U+E053D => +"\xF3\xA0\x94\xBE" => "", # U+E053E => +"\xF3\xA0\x94\xBF" => "", # U+E053F => +"\xF3\xA0\x95\x80" => "", # U+E0540 => +"\xF3\xA0\x95\x81" => "", # U+E0541 => +"\xF3\xA0\x95\x82" => "", # U+E0542 => +"\xF3\xA0\x95\x83" => "", # U+E0543 => +"\xF3\xA0\x95\x84" => "", # U+E0544 => +"\xF3\xA0\x95\x85" => "", # U+E0545 => +"\xF3\xA0\x95\x86" => "", # U+E0546 => +"\xF3\xA0\x95\x87" => "", # U+E0547 => +"\xF3\xA0\x95\x88" => "", # U+E0548 => +"\xF3\xA0\x95\x89" => "", # U+E0549 => +"\xF3\xA0\x95\x8A" => "", # U+E054A => +"\xF3\xA0\x95\x8B" => "", # U+E054B => +"\xF3\xA0\x95\x8C" => "", # U+E054C => +"\xF3\xA0\x95\x8D" => "", # U+E054D => +"\xF3\xA0\x95\x8E" => "", # U+E054E => +"\xF3\xA0\x95\x8F" => "", # U+E054F => +"\xF3\xA0\x95\x90" => "", # U+E0550 => +"\xF3\xA0\x95\x91" => "", # U+E0551 => +"\xF3\xA0\x95\x92" => "", # U+E0552 => +"\xF3\xA0\x95\x93" => "", # U+E0553 => +"\xF3\xA0\x95\x94" => "", # U+E0554 => +"\xF3\xA0\x95\x95" => "", # U+E0555 => +"\xF3\xA0\x95\x96" => "", # U+E0556 => +"\xF3\xA0\x95\x97" => "", # U+E0557 => +"\xF3\xA0\x95\x98" => "", # U+E0558 => +"\xF3\xA0\x95\x99" => "", # U+E0559 => +"\xF3\xA0\x95\x9A" => "", # U+E055A => +"\xF3\xA0\x95\x9B" => "", # U+E055B => +"\xF3\xA0\x95\x9C" => "", # U+E055C => +"\xF3\xA0\x95\x9D" => "", # U+E055D => +"\xF3\xA0\x95\x9E" => "", # U+E055E => +"\xF3\xA0\x95\x9F" => "", # U+E055F => +"\xF3\xA0\x95\xA0" => "", # U+E0560 => +"\xF3\xA0\x95\xA1" => "", # U+E0561 => +"\xF3\xA0\x95\xA2" => "", # U+E0562 => +"\xF3\xA0\x95\xA3" => "", # U+E0563 => +"\xF3\xA0\x95\xA4" => "", # U+E0564 => +"\xF3\xA0\x95\xA5" => "", # U+E0565 => +"\xF3\xA0\x95\xA6" => "", # U+E0566 => +"\xF3\xA0\x95\xA7" => "", # U+E0567 => +"\xF3\xA0\x95\xA8" => "", # U+E0568 => +"\xF3\xA0\x95\xA9" => "", # U+E0569 => +"\xF3\xA0\x95\xAA" => "", # U+E056A => +"\xF3\xA0\x95\xAB" => "", # U+E056B => +"\xF3\xA0\x95\xAC" => "", # U+E056C => +"\xF3\xA0\x95\xAD" => "", # U+E056D => +"\xF3\xA0\x95\xAE" => "", # U+E056E => +"\xF3\xA0\x95\xAF" => "", # U+E056F => +"\xF3\xA0\x95\xB0" => "", # U+E0570 => +"\xF3\xA0\x95\xB1" => "", # U+E0571 => +"\xF3\xA0\x95\xB2" => "", # U+E0572 => +"\xF3\xA0\x95\xB3" => "", # U+E0573 => +"\xF3\xA0\x95\xB4" => "", # U+E0574 => +"\xF3\xA0\x95\xB5" => "", # U+E0575 => +"\xF3\xA0\x95\xB6" => "", # U+E0576 => +"\xF3\xA0\x95\xB7" => "", # U+E0577 => +"\xF3\xA0\x95\xB8" => "", # U+E0578 => +"\xF3\xA0\x95\xB9" => "", # U+E0579 => +"\xF3\xA0\x95\xBA" => "", # U+E057A => +"\xF3\xA0\x95\xBB" => "", # U+E057B => +"\xF3\xA0\x95\xBC" => "", # U+E057C => +"\xF3\xA0\x95\xBD" => "", # U+E057D => +"\xF3\xA0\x95\xBE" => "", # U+E057E => +"\xF3\xA0\x95\xBF" => "", # U+E057F => +"\xF3\xA0\x96\x80" => "", # U+E0580 => +"\xF3\xA0\x96\x81" => "", # U+E0581 => +"\xF3\xA0\x96\x82" => "", # U+E0582 => +"\xF3\xA0\x96\x83" => "", # U+E0583 => +"\xF3\xA0\x96\x84" => "", # U+E0584 => +"\xF3\xA0\x96\x85" => "", # U+E0585 => +"\xF3\xA0\x96\x86" => "", # U+E0586 => +"\xF3\xA0\x96\x87" => "", # U+E0587 => +"\xF3\xA0\x96\x88" => "", # U+E0588 => +"\xF3\xA0\x96\x89" => "", # U+E0589 => +"\xF3\xA0\x96\x8A" => "", # U+E058A => +"\xF3\xA0\x96\x8B" => "", # U+E058B => +"\xF3\xA0\x96\x8C" => "", # U+E058C => +"\xF3\xA0\x96\x8D" => "", # U+E058D => +"\xF3\xA0\x96\x8E" => "", # U+E058E => +"\xF3\xA0\x96\x8F" => "", # U+E058F => +"\xF3\xA0\x96\x90" => "", # U+E0590 => +"\xF3\xA0\x96\x91" => "", # U+E0591 => +"\xF3\xA0\x96\x92" => "", # U+E0592 => +"\xF3\xA0\x96\x93" => "", # U+E0593 => +"\xF3\xA0\x96\x94" => "", # U+E0594 => +"\xF3\xA0\x96\x95" => "", # U+E0595 => +"\xF3\xA0\x96\x96" => "", # U+E0596 => +"\xF3\xA0\x96\x97" => "", # U+E0597 => +"\xF3\xA0\x96\x98" => "", # U+E0598 => +"\xF3\xA0\x96\x99" => "", # U+E0599 => +"\xF3\xA0\x96\x9A" => "", # U+E059A => +"\xF3\xA0\x96\x9B" => "", # U+E059B => +"\xF3\xA0\x96\x9C" => "", # U+E059C => +"\xF3\xA0\x96\x9D" => "", # U+E059D => +"\xF3\xA0\x96\x9E" => "", # U+E059E => +"\xF3\xA0\x96\x9F" => "", # U+E059F => +"\xF3\xA0\x96\xA0" => "", # U+E05A0 => +"\xF3\xA0\x96\xA1" => "", # U+E05A1 => +"\xF3\xA0\x96\xA2" => "", # U+E05A2 => +"\xF3\xA0\x96\xA3" => "", # U+E05A3 => +"\xF3\xA0\x96\xA4" => "", # U+E05A4 => +"\xF3\xA0\x96\xA5" => "", # U+E05A5 => +"\xF3\xA0\x96\xA6" => "", # U+E05A6 => +"\xF3\xA0\x96\xA7" => "", # U+E05A7 => +"\xF3\xA0\x96\xA8" => "", # U+E05A8 => +"\xF3\xA0\x96\xA9" => "", # U+E05A9 => +"\xF3\xA0\x96\xAA" => "", # U+E05AA => +"\xF3\xA0\x96\xAB" => "", # U+E05AB => +"\xF3\xA0\x96\xAC" => "", # U+E05AC => +"\xF3\xA0\x96\xAD" => "", # U+E05AD => +"\xF3\xA0\x96\xAE" => "", # U+E05AE => +"\xF3\xA0\x96\xAF" => "", # U+E05AF => +"\xF3\xA0\x96\xB0" => "", # U+E05B0 => +"\xF3\xA0\x96\xB1" => "", # U+E05B1 => +"\xF3\xA0\x96\xB2" => "", # U+E05B2 => +"\xF3\xA0\x96\xB3" => "", # U+E05B3 => +"\xF3\xA0\x96\xB4" => "", # U+E05B4 => +"\xF3\xA0\x96\xB5" => "", # U+E05B5 => +"\xF3\xA0\x96\xB6" => "", # U+E05B6 => +"\xF3\xA0\x96\xB7" => "", # U+E05B7 => +"\xF3\xA0\x96\xB8" => "", # U+E05B8 => +"\xF3\xA0\x96\xB9" => "", # U+E05B9 => +"\xF3\xA0\x96\xBA" => "", # U+E05BA => +"\xF3\xA0\x96\xBB" => "", # U+E05BB => +"\xF3\xA0\x96\xBC" => "", # U+E05BC => +"\xF3\xA0\x96\xBD" => "", # U+E05BD => +"\xF3\xA0\x96\xBE" => "", # U+E05BE => +"\xF3\xA0\x96\xBF" => "", # U+E05BF => +"\xF3\xA0\x97\x80" => "", # U+E05C0 => +"\xF3\xA0\x97\x81" => "", # U+E05C1 => +"\xF3\xA0\x97\x82" => "", # U+E05C2 => +"\xF3\xA0\x97\x83" => "", # U+E05C3 => +"\xF3\xA0\x97\x84" => "", # U+E05C4 => +"\xF3\xA0\x97\x85" => "", # U+E05C5 => +"\xF3\xA0\x97\x86" => "", # U+E05C6 => +"\xF3\xA0\x97\x87" => "", # U+E05C7 => +"\xF3\xA0\x97\x88" => "", # U+E05C8 => +"\xF3\xA0\x97\x89" => "", # U+E05C9 => +"\xF3\xA0\x97\x8A" => "", # U+E05CA => +"\xF3\xA0\x97\x8B" => "", # U+E05CB => +"\xF3\xA0\x97\x8C" => "", # U+E05CC => +"\xF3\xA0\x97\x8D" => "", # U+E05CD => +"\xF3\xA0\x97\x8E" => "", # U+E05CE => +"\xF3\xA0\x97\x8F" => "", # U+E05CF => +"\xF3\xA0\x97\x90" => "", # U+E05D0 => +"\xF3\xA0\x97\x91" => "", # U+E05D1 => +"\xF3\xA0\x97\x92" => "", # U+E05D2 => +"\xF3\xA0\x97\x93" => "", # U+E05D3 => +"\xF3\xA0\x97\x94" => "", # U+E05D4 => +"\xF3\xA0\x97\x95" => "", # U+E05D5 => +"\xF3\xA0\x97\x96" => "", # U+E05D6 => +"\xF3\xA0\x97\x97" => "", # U+E05D7 => +"\xF3\xA0\x97\x98" => "", # U+E05D8 => +"\xF3\xA0\x97\x99" => "", # U+E05D9 => +"\xF3\xA0\x97\x9A" => "", # U+E05DA => +"\xF3\xA0\x97\x9B" => "", # U+E05DB => +"\xF3\xA0\x97\x9C" => "", # U+E05DC => +"\xF3\xA0\x97\x9D" => "", # U+E05DD => +"\xF3\xA0\x97\x9E" => "", # U+E05DE => +"\xF3\xA0\x97\x9F" => "", # U+E05DF => +"\xF3\xA0\x97\xA0" => "", # U+E05E0 => +"\xF3\xA0\x97\xA1" => "", # U+E05E1 => +"\xF3\xA0\x97\xA2" => "", # U+E05E2 => +"\xF3\xA0\x97\xA3" => "", # U+E05E3 => +"\xF3\xA0\x97\xA4" => "", # U+E05E4 => +"\xF3\xA0\x97\xA5" => "", # U+E05E5 => +"\xF3\xA0\x97\xA6" => "", # U+E05E6 => +"\xF3\xA0\x97\xA7" => "", # U+E05E7 => +"\xF3\xA0\x97\xA8" => "", # U+E05E8 => +"\xF3\xA0\x97\xA9" => "", # U+E05E9 => +"\xF3\xA0\x97\xAA" => "", # U+E05EA => +"\xF3\xA0\x97\xAB" => "", # U+E05EB => +"\xF3\xA0\x97\xAC" => "", # U+E05EC => +"\xF3\xA0\x97\xAD" => "", # U+E05ED => +"\xF3\xA0\x97\xAE" => "", # U+E05EE => +"\xF3\xA0\x97\xAF" => "", # U+E05EF => +"\xF3\xA0\x97\xB0" => "", # U+E05F0 => +"\xF3\xA0\x97\xB1" => "", # U+E05F1 => +"\xF3\xA0\x97\xB2" => "", # U+E05F2 => +"\xF3\xA0\x97\xB3" => "", # U+E05F3 => +"\xF3\xA0\x97\xB4" => "", # U+E05F4 => +"\xF3\xA0\x97\xB5" => "", # U+E05F5 => +"\xF3\xA0\x97\xB6" => "", # U+E05F6 => +"\xF3\xA0\x97\xB7" => "", # U+E05F7 => +"\xF3\xA0\x97\xB8" => "", # U+E05F8 => +"\xF3\xA0\x97\xB9" => "", # U+E05F9 => +"\xF3\xA0\x97\xBA" => "", # U+E05FA => +"\xF3\xA0\x97\xBB" => "", # U+E05FB => +"\xF3\xA0\x97\xBC" => "", # U+E05FC => +"\xF3\xA0\x97\xBD" => "", # U+E05FD => +"\xF3\xA0\x97\xBE" => "", # U+E05FE => +"\xF3\xA0\x97\xBF" => "", # U+E05FF => +"\xF3\xA0\x98\x80" => "", # U+E0600 => +"\xF3\xA0\x98\x81" => "", # U+E0601 => +"\xF3\xA0\x98\x82" => "", # U+E0602 => +"\xF3\xA0\x98\x83" => "", # U+E0603 => +"\xF3\xA0\x98\x84" => "", # U+E0604 => +"\xF3\xA0\x98\x85" => "", # U+E0605 => +"\xF3\xA0\x98\x86" => "", # U+E0606 => +"\xF3\xA0\x98\x87" => "", # U+E0607 => +"\xF3\xA0\x98\x88" => "", # U+E0608 => +"\xF3\xA0\x98\x89" => "", # U+E0609 => +"\xF3\xA0\x98\x8A" => "", # U+E060A => +"\xF3\xA0\x98\x8B" => "", # U+E060B => +"\xF3\xA0\x98\x8C" => "", # U+E060C => +"\xF3\xA0\x98\x8D" => "", # U+E060D => +"\xF3\xA0\x98\x8E" => "", # U+E060E => +"\xF3\xA0\x98\x8F" => "", # U+E060F => +"\xF3\xA0\x98\x90" => "", # U+E0610 => +"\xF3\xA0\x98\x91" => "", # U+E0611 => +"\xF3\xA0\x98\x92" => "", # U+E0612 => +"\xF3\xA0\x98\x93" => "", # U+E0613 => +"\xF3\xA0\x98\x94" => "", # U+E0614 => +"\xF3\xA0\x98\x95" => "", # U+E0615 => +"\xF3\xA0\x98\x96" => "", # U+E0616 => +"\xF3\xA0\x98\x97" => "", # U+E0617 => +"\xF3\xA0\x98\x98" => "", # U+E0618 => +"\xF3\xA0\x98\x99" => "", # U+E0619 => +"\xF3\xA0\x98\x9A" => "", # U+E061A => +"\xF3\xA0\x98\x9B" => "", # U+E061B => +"\xF3\xA0\x98\x9C" => "", # U+E061C => +"\xF3\xA0\x98\x9D" => "", # U+E061D => +"\xF3\xA0\x98\x9E" => "", # U+E061E => +"\xF3\xA0\x98\x9F" => "", # U+E061F => +"\xF3\xA0\x98\xA0" => "", # U+E0620 => +"\xF3\xA0\x98\xA1" => "", # U+E0621 => +"\xF3\xA0\x98\xA2" => "", # U+E0622 => +"\xF3\xA0\x98\xA3" => "", # U+E0623 => +"\xF3\xA0\x98\xA4" => "", # U+E0624 => +"\xF3\xA0\x98\xA5" => "", # U+E0625 => +"\xF3\xA0\x98\xA6" => "", # U+E0626 => +"\xF3\xA0\x98\xA7" => "", # U+E0627 => +"\xF3\xA0\x98\xA8" => "", # U+E0628 => +"\xF3\xA0\x98\xA9" => "", # U+E0629 => +"\xF3\xA0\x98\xAA" => "", # U+E062A => +"\xF3\xA0\x98\xAB" => "", # U+E062B => +"\xF3\xA0\x98\xAC" => "", # U+E062C => +"\xF3\xA0\x98\xAD" => "", # U+E062D => +"\xF3\xA0\x98\xAE" => "", # U+E062E => +"\xF3\xA0\x98\xAF" => "", # U+E062F => +"\xF3\xA0\x98\xB0" => "", # U+E0630 => +"\xF3\xA0\x98\xB1" => "", # U+E0631 => +"\xF3\xA0\x98\xB2" => "", # U+E0632 => +"\xF3\xA0\x98\xB3" => "", # U+E0633 => +"\xF3\xA0\x98\xB4" => "", # U+E0634 => +"\xF3\xA0\x98\xB5" => "", # U+E0635 => +"\xF3\xA0\x98\xB6" => "", # U+E0636 => +"\xF3\xA0\x98\xB7" => "", # U+E0637 => +"\xF3\xA0\x98\xB8" => "", # U+E0638 => +"\xF3\xA0\x98\xB9" => "", # U+E0639 => +"\xF3\xA0\x98\xBA" => "", # U+E063A => +"\xF3\xA0\x98\xBB" => "", # U+E063B => +"\xF3\xA0\x98\xBC" => "", # U+E063C => +"\xF3\xA0\x98\xBD" => "", # U+E063D => +"\xF3\xA0\x98\xBE" => "", # U+E063E => +"\xF3\xA0\x98\xBF" => "", # U+E063F => +"\xF3\xA0\x99\x80" => "", # U+E0640 => +"\xF3\xA0\x99\x81" => "", # U+E0641 => +"\xF3\xA0\x99\x82" => "", # U+E0642 => +"\xF3\xA0\x99\x83" => "", # U+E0643 => +"\xF3\xA0\x99\x84" => "", # U+E0644 => +"\xF3\xA0\x99\x85" => "", # U+E0645 => +"\xF3\xA0\x99\x86" => "", # U+E0646 => +"\xF3\xA0\x99\x87" => "", # U+E0647 => +"\xF3\xA0\x99\x88" => "", # U+E0648 => +"\xF3\xA0\x99\x89" => "", # U+E0649 => +"\xF3\xA0\x99\x8A" => "", # U+E064A => +"\xF3\xA0\x99\x8B" => "", # U+E064B => +"\xF3\xA0\x99\x8C" => "", # U+E064C => +"\xF3\xA0\x99\x8D" => "", # U+E064D => +"\xF3\xA0\x99\x8E" => "", # U+E064E => +"\xF3\xA0\x99\x8F" => "", # U+E064F => +"\xF3\xA0\x99\x90" => "", # U+E0650 => +"\xF3\xA0\x99\x91" => "", # U+E0651 => +"\xF3\xA0\x99\x92" => "", # U+E0652 => +"\xF3\xA0\x99\x93" => "", # U+E0653 => +"\xF3\xA0\x99\x94" => "", # U+E0654 => +"\xF3\xA0\x99\x95" => "", # U+E0655 => +"\xF3\xA0\x99\x96" => "", # U+E0656 => +"\xF3\xA0\x99\x97" => "", # U+E0657 => +"\xF3\xA0\x99\x98" => "", # U+E0658 => +"\xF3\xA0\x99\x99" => "", # U+E0659 => +"\xF3\xA0\x99\x9A" => "", # U+E065A => +"\xF3\xA0\x99\x9B" => "", # U+E065B => +"\xF3\xA0\x99\x9C" => "", # U+E065C => +"\xF3\xA0\x99\x9D" => "", # U+E065D => +"\xF3\xA0\x99\x9E" => "", # U+E065E => +"\xF3\xA0\x99\x9F" => "", # U+E065F => +"\xF3\xA0\x99\xA0" => "", # U+E0660 => +"\xF3\xA0\x99\xA1" => "", # U+E0661 => +"\xF3\xA0\x99\xA2" => "", # U+E0662 => +"\xF3\xA0\x99\xA3" => "", # U+E0663 => +"\xF3\xA0\x99\xA4" => "", # U+E0664 => +"\xF3\xA0\x99\xA5" => "", # U+E0665 => +"\xF3\xA0\x99\xA6" => "", # U+E0666 => +"\xF3\xA0\x99\xA7" => "", # U+E0667 => +"\xF3\xA0\x99\xA8" => "", # U+E0668 => +"\xF3\xA0\x99\xA9" => "", # U+E0669 => +"\xF3\xA0\x99\xAA" => "", # U+E066A => +"\xF3\xA0\x99\xAB" => "", # U+E066B => +"\xF3\xA0\x99\xAC" => "", # U+E066C => +"\xF3\xA0\x99\xAD" => "", # U+E066D => +"\xF3\xA0\x99\xAE" => "", # U+E066E => +"\xF3\xA0\x99\xAF" => "", # U+E066F => +"\xF3\xA0\x99\xB0" => "", # U+E0670 => +"\xF3\xA0\x99\xB1" => "", # U+E0671 => +"\xF3\xA0\x99\xB2" => "", # U+E0672 => +"\xF3\xA0\x99\xB3" => "", # U+E0673 => +"\xF3\xA0\x99\xB4" => "", # U+E0674 => +"\xF3\xA0\x99\xB5" => "", # U+E0675 => +"\xF3\xA0\x99\xB6" => "", # U+E0676 => +"\xF3\xA0\x99\xB7" => "", # U+E0677 => +"\xF3\xA0\x99\xB8" => "", # U+E0678 => +"\xF3\xA0\x99\xB9" => "", # U+E0679 => +"\xF3\xA0\x99\xBA" => "", # U+E067A => +"\xF3\xA0\x99\xBB" => "", # U+E067B => +"\xF3\xA0\x99\xBC" => "", # U+E067C => +"\xF3\xA0\x99\xBD" => "", # U+E067D => +"\xF3\xA0\x99\xBE" => "", # U+E067E => +"\xF3\xA0\x99\xBF" => "", # U+E067F => +"\xF3\xA0\x9A\x80" => "", # U+E0680 => +"\xF3\xA0\x9A\x81" => "", # U+E0681 => +"\xF3\xA0\x9A\x82" => "", # U+E0682 => +"\xF3\xA0\x9A\x83" => "", # U+E0683 => +"\xF3\xA0\x9A\x84" => "", # U+E0684 => +"\xF3\xA0\x9A\x85" => "", # U+E0685 => +"\xF3\xA0\x9A\x86" => "", # U+E0686 => +"\xF3\xA0\x9A\x87" => "", # U+E0687 => +"\xF3\xA0\x9A\x88" => "", # U+E0688 => +"\xF3\xA0\x9A\x89" => "", # U+E0689 => +"\xF3\xA0\x9A\x8A" => "", # U+E068A => +"\xF3\xA0\x9A\x8B" => "", # U+E068B => +"\xF3\xA0\x9A\x8C" => "", # U+E068C => +"\xF3\xA0\x9A\x8D" => "", # U+E068D => +"\xF3\xA0\x9A\x8E" => "", # U+E068E => +"\xF3\xA0\x9A\x8F" => "", # U+E068F => +"\xF3\xA0\x9A\x90" => "", # U+E0690 => +"\xF3\xA0\x9A\x91" => "", # U+E0691 => +"\xF3\xA0\x9A\x92" => "", # U+E0692 => +"\xF3\xA0\x9A\x93" => "", # U+E0693 => +"\xF3\xA0\x9A\x94" => "", # U+E0694 => +"\xF3\xA0\x9A\x95" => "", # U+E0695 => +"\xF3\xA0\x9A\x96" => "", # U+E0696 => +"\xF3\xA0\x9A\x97" => "", # U+E0697 => +"\xF3\xA0\x9A\x98" => "", # U+E0698 => +"\xF3\xA0\x9A\x99" => "", # U+E0699 => +"\xF3\xA0\x9A\x9A" => "", # U+E069A => +"\xF3\xA0\x9A\x9B" => "", # U+E069B => +"\xF3\xA0\x9A\x9C" => "", # U+E069C => +"\xF3\xA0\x9A\x9D" => "", # U+E069D => +"\xF3\xA0\x9A\x9E" => "", # U+E069E => +"\xF3\xA0\x9A\x9F" => "", # U+E069F => +"\xF3\xA0\x9A\xA0" => "", # U+E06A0 => +"\xF3\xA0\x9A\xA1" => "", # U+E06A1 => +"\xF3\xA0\x9A\xA2" => "", # U+E06A2 => +"\xF3\xA0\x9A\xA3" => "", # U+E06A3 => +"\xF3\xA0\x9A\xA4" => "", # U+E06A4 => +"\xF3\xA0\x9A\xA5" => "", # U+E06A5 => +"\xF3\xA0\x9A\xA6" => "", # U+E06A6 => +"\xF3\xA0\x9A\xA7" => "", # U+E06A7 => +"\xF3\xA0\x9A\xA8" => "", # U+E06A8 => +"\xF3\xA0\x9A\xA9" => "", # U+E06A9 => +"\xF3\xA0\x9A\xAA" => "", # U+E06AA => +"\xF3\xA0\x9A\xAB" => "", # U+E06AB => +"\xF3\xA0\x9A\xAC" => "", # U+E06AC => +"\xF3\xA0\x9A\xAD" => "", # U+E06AD => +"\xF3\xA0\x9A\xAE" => "", # U+E06AE => +"\xF3\xA0\x9A\xAF" => "", # U+E06AF => +"\xF3\xA0\x9A\xB0" => "", # U+E06B0 => +"\xF3\xA0\x9A\xB1" => "", # U+E06B1 => +"\xF3\xA0\x9A\xB2" => "", # U+E06B2 => +"\xF3\xA0\x9A\xB3" => "", # U+E06B3 => +"\xF3\xA0\x9A\xB4" => "", # U+E06B4 => +"\xF3\xA0\x9A\xB5" => "", # U+E06B5 => +"\xF3\xA0\x9A\xB6" => "", # U+E06B6 => +"\xF3\xA0\x9A\xB7" => "", # U+E06B7 => +"\xF3\xA0\x9A\xB8" => "", # U+E06B8 => +"\xF3\xA0\x9A\xB9" => "", # U+E06B9 => +"\xF3\xA0\x9A\xBA" => "", # U+E06BA => +"\xF3\xA0\x9A\xBB" => "", # U+E06BB => +"\xF3\xA0\x9A\xBC" => "", # U+E06BC => +"\xF3\xA0\x9A\xBD" => "", # U+E06BD => +"\xF3\xA0\x9A\xBE" => "", # U+E06BE => +"\xF3\xA0\x9A\xBF" => "", # U+E06BF => +"\xF3\xA0\x9B\x80" => "", # U+E06C0 => +"\xF3\xA0\x9B\x81" => "", # U+E06C1 => +"\xF3\xA0\x9B\x82" => "", # U+E06C2 => +"\xF3\xA0\x9B\x83" => "", # U+E06C3 => +"\xF3\xA0\x9B\x84" => "", # U+E06C4 => +"\xF3\xA0\x9B\x85" => "", # U+E06C5 => +"\xF3\xA0\x9B\x86" => "", # U+E06C6 => +"\xF3\xA0\x9B\x87" => "", # U+E06C7 => +"\xF3\xA0\x9B\x88" => "", # U+E06C8 => +"\xF3\xA0\x9B\x89" => "", # U+E06C9 => +"\xF3\xA0\x9B\x8A" => "", # U+E06CA => +"\xF3\xA0\x9B\x8B" => "", # U+E06CB => +"\xF3\xA0\x9B\x8C" => "", # U+E06CC => +"\xF3\xA0\x9B\x8D" => "", # U+E06CD => +"\xF3\xA0\x9B\x8E" => "", # U+E06CE => +"\xF3\xA0\x9B\x8F" => "", # U+E06CF => +"\xF3\xA0\x9B\x90" => "", # U+E06D0 => +"\xF3\xA0\x9B\x91" => "", # U+E06D1 => +"\xF3\xA0\x9B\x92" => "", # U+E06D2 => +"\xF3\xA0\x9B\x93" => "", # U+E06D3 => +"\xF3\xA0\x9B\x94" => "", # U+E06D4 => +"\xF3\xA0\x9B\x95" => "", # U+E06D5 => +"\xF3\xA0\x9B\x96" => "", # U+E06D6 => +"\xF3\xA0\x9B\x97" => "", # U+E06D7 => +"\xF3\xA0\x9B\x98" => "", # U+E06D8 => +"\xF3\xA0\x9B\x99" => "", # U+E06D9 => +"\xF3\xA0\x9B\x9A" => "", # U+E06DA => +"\xF3\xA0\x9B\x9B" => "", # U+E06DB => +"\xF3\xA0\x9B\x9C" => "", # U+E06DC => +"\xF3\xA0\x9B\x9D" => "", # U+E06DD => +"\xF3\xA0\x9B\x9E" => "", # U+E06DE => +"\xF3\xA0\x9B\x9F" => "", # U+E06DF => +"\xF3\xA0\x9B\xA0" => "", # U+E06E0 => +"\xF3\xA0\x9B\xA1" => "", # U+E06E1 => +"\xF3\xA0\x9B\xA2" => "", # U+E06E2 => +"\xF3\xA0\x9B\xA3" => "", # U+E06E3 => +"\xF3\xA0\x9B\xA4" => "", # U+E06E4 => +"\xF3\xA0\x9B\xA5" => "", # U+E06E5 => +"\xF3\xA0\x9B\xA6" => "", # U+E06E6 => +"\xF3\xA0\x9B\xA7" => "", # U+E06E7 => +"\xF3\xA0\x9B\xA8" => "", # U+E06E8 => +"\xF3\xA0\x9B\xA9" => "", # U+E06E9 => +"\xF3\xA0\x9B\xAA" => "", # U+E06EA => +"\xF3\xA0\x9B\xAB" => "", # U+E06EB => +"\xF3\xA0\x9B\xAC" => "", # U+E06EC => +"\xF3\xA0\x9B\xAD" => "", # U+E06ED => +"\xF3\xA0\x9B\xAE" => "", # U+E06EE => +"\xF3\xA0\x9B\xAF" => "", # U+E06EF => +"\xF3\xA0\x9B\xB0" => "", # U+E06F0 => +"\xF3\xA0\x9B\xB1" => "", # U+E06F1 => +"\xF3\xA0\x9B\xB2" => "", # U+E06F2 => +"\xF3\xA0\x9B\xB3" => "", # U+E06F3 => +"\xF3\xA0\x9B\xB4" => "", # U+E06F4 => +"\xF3\xA0\x9B\xB5" => "", # U+E06F5 => +"\xF3\xA0\x9B\xB6" => "", # U+E06F6 => +"\xF3\xA0\x9B\xB7" => "", # U+E06F7 => +"\xF3\xA0\x9B\xB8" => "", # U+E06F8 => +"\xF3\xA0\x9B\xB9" => "", # U+E06F9 => +"\xF3\xA0\x9B\xBA" => "", # U+E06FA => +"\xF3\xA0\x9B\xBB" => "", # U+E06FB => +"\xF3\xA0\x9B\xBC" => "", # U+E06FC => +"\xF3\xA0\x9B\xBD" => "", # U+E06FD => +"\xF3\xA0\x9B\xBE" => "", # U+E06FE => +"\xF3\xA0\x9B\xBF" => "", # U+E06FF => +"\xF3\xA0\x9C\x80" => "", # U+E0700 => +"\xF3\xA0\x9C\x81" => "", # U+E0701 => +"\xF3\xA0\x9C\x82" => "", # U+E0702 => +"\xF3\xA0\x9C\x83" => "", # U+E0703 => +"\xF3\xA0\x9C\x84" => "", # U+E0704 => +"\xF3\xA0\x9C\x85" => "", # U+E0705 => +"\xF3\xA0\x9C\x86" => "", # U+E0706 => +"\xF3\xA0\x9C\x87" => "", # U+E0707 => +"\xF3\xA0\x9C\x88" => "", # U+E0708 => +"\xF3\xA0\x9C\x89" => "", # U+E0709 => +"\xF3\xA0\x9C\x8A" => "", # U+E070A => +"\xF3\xA0\x9C\x8B" => "", # U+E070B => +"\xF3\xA0\x9C\x8C" => "", # U+E070C => +"\xF3\xA0\x9C\x8D" => "", # U+E070D => +"\xF3\xA0\x9C\x8E" => "", # U+E070E => +"\xF3\xA0\x9C\x8F" => "", # U+E070F => +"\xF3\xA0\x9C\x90" => "", # U+E0710 => +"\xF3\xA0\x9C\x91" => "", # U+E0711 => +"\xF3\xA0\x9C\x92" => "", # U+E0712 => +"\xF3\xA0\x9C\x93" => "", # U+E0713 => +"\xF3\xA0\x9C\x94" => "", # U+E0714 => +"\xF3\xA0\x9C\x95" => "", # U+E0715 => +"\xF3\xA0\x9C\x96" => "", # U+E0716 => +"\xF3\xA0\x9C\x97" => "", # U+E0717 => +"\xF3\xA0\x9C\x98" => "", # U+E0718 => +"\xF3\xA0\x9C\x99" => "", # U+E0719 => +"\xF3\xA0\x9C\x9A" => "", # U+E071A => +"\xF3\xA0\x9C\x9B" => "", # U+E071B => +"\xF3\xA0\x9C\x9C" => "", # U+E071C => +"\xF3\xA0\x9C\x9D" => "", # U+E071D => +"\xF3\xA0\x9C\x9E" => "", # U+E071E => +"\xF3\xA0\x9C\x9F" => "", # U+E071F => +"\xF3\xA0\x9C\xA0" => "", # U+E0720 => +"\xF3\xA0\x9C\xA1" => "", # U+E0721 => +"\xF3\xA0\x9C\xA2" => "", # U+E0722 => +"\xF3\xA0\x9C\xA3" => "", # U+E0723 => +"\xF3\xA0\x9C\xA4" => "", # U+E0724 => +"\xF3\xA0\x9C\xA5" => "", # U+E0725 => +"\xF3\xA0\x9C\xA6" => "", # U+E0726 => +"\xF3\xA0\x9C\xA7" => "", # U+E0727 => +"\xF3\xA0\x9C\xA8" => "", # U+E0728 => +"\xF3\xA0\x9C\xA9" => "", # U+E0729 => +"\xF3\xA0\x9C\xAA" => "", # U+E072A => +"\xF3\xA0\x9C\xAB" => "", # U+E072B => +"\xF3\xA0\x9C\xAC" => "", # U+E072C => +"\xF3\xA0\x9C\xAD" => "", # U+E072D => +"\xF3\xA0\x9C\xAE" => "", # U+E072E => +"\xF3\xA0\x9C\xAF" => "", # U+E072F => +"\xF3\xA0\x9C\xB0" => "", # U+E0730 => +"\xF3\xA0\x9C\xB1" => "", # U+E0731 => +"\xF3\xA0\x9C\xB2" => "", # U+E0732 => +"\xF3\xA0\x9C\xB3" => "", # U+E0733 => +"\xF3\xA0\x9C\xB4" => "", # U+E0734 => +"\xF3\xA0\x9C\xB5" => "", # U+E0735 => +"\xF3\xA0\x9C\xB6" => "", # U+E0736 => +"\xF3\xA0\x9C\xB7" => "", # U+E0737 => +"\xF3\xA0\x9C\xB8" => "", # U+E0738 => +"\xF3\xA0\x9C\xB9" => "", # U+E0739 => +"\xF3\xA0\x9C\xBA" => "", # U+E073A => +"\xF3\xA0\x9C\xBB" => "", # U+E073B => +"\xF3\xA0\x9C\xBC" => "", # U+E073C => +"\xF3\xA0\x9C\xBD" => "", # U+E073D => +"\xF3\xA0\x9C\xBE" => "", # U+E073E => +"\xF3\xA0\x9C\xBF" => "", # U+E073F => +"\xF3\xA0\x9D\x80" => "", # U+E0740 => +"\xF3\xA0\x9D\x81" => "", # U+E0741 => +"\xF3\xA0\x9D\x82" => "", # U+E0742 => +"\xF3\xA0\x9D\x83" => "", # U+E0743 => +"\xF3\xA0\x9D\x84" => "", # U+E0744 => +"\xF3\xA0\x9D\x85" => "", # U+E0745 => +"\xF3\xA0\x9D\x86" => "", # U+E0746 => +"\xF3\xA0\x9D\x87" => "", # U+E0747 => +"\xF3\xA0\x9D\x88" => "", # U+E0748 => +"\xF3\xA0\x9D\x89" => "", # U+E0749 => +"\xF3\xA0\x9D\x8A" => "", # U+E074A => +"\xF3\xA0\x9D\x8B" => "", # U+E074B => +"\xF3\xA0\x9D\x8C" => "", # U+E074C => +"\xF3\xA0\x9D\x8D" => "", # U+E074D => +"\xF3\xA0\x9D\x8E" => "", # U+E074E => +"\xF3\xA0\x9D\x8F" => "", # U+E074F => +"\xF3\xA0\x9D\x90" => "", # U+E0750 => +"\xF3\xA0\x9D\x91" => "", # U+E0751 => +"\xF3\xA0\x9D\x92" => "", # U+E0752 => +"\xF3\xA0\x9D\x93" => "", # U+E0753 => +"\xF3\xA0\x9D\x94" => "", # U+E0754 => +"\xF3\xA0\x9D\x95" => "", # U+E0755 => +"\xF3\xA0\x9D\x96" => "", # U+E0756 => +"\xF3\xA0\x9D\x97" => "", # U+E0757 => +"\xF3\xA0\x9D\x98" => "", # U+E0758 => +"\xF3\xA0\x9D\x99" => "", # U+E0759 => +"\xF3\xA0\x9D\x9A" => "", # U+E075A => +"\xF3\xA0\x9D\x9B" => "", # U+E075B => +"\xF3\xA0\x9D\x9C" => "", # U+E075C => +"\xF3\xA0\x9D\x9D" => "", # U+E075D => +"\xF3\xA0\x9D\x9E" => "", # U+E075E => +"\xF3\xA0\x9D\x9F" => "", # U+E075F => +"\xF3\xA0\x9D\xA0" => "", # U+E0760 => +"\xF3\xA0\x9D\xA1" => "", # U+E0761 => +"\xF3\xA0\x9D\xA2" => "", # U+E0762 => +"\xF3\xA0\x9D\xA3" => "", # U+E0763 => +"\xF3\xA0\x9D\xA4" => "", # U+E0764 => +"\xF3\xA0\x9D\xA5" => "", # U+E0765 => +"\xF3\xA0\x9D\xA6" => "", # U+E0766 => +"\xF3\xA0\x9D\xA7" => "", # U+E0767 => +"\xF3\xA0\x9D\xA8" => "", # U+E0768 => +"\xF3\xA0\x9D\xA9" => "", # U+E0769 => +"\xF3\xA0\x9D\xAA" => "", # U+E076A => +"\xF3\xA0\x9D\xAB" => "", # U+E076B => +"\xF3\xA0\x9D\xAC" => "", # U+E076C => +"\xF3\xA0\x9D\xAD" => "", # U+E076D => +"\xF3\xA0\x9D\xAE" => "", # U+E076E => +"\xF3\xA0\x9D\xAF" => "", # U+E076F => +"\xF3\xA0\x9D\xB0" => "", # U+E0770 => +"\xF3\xA0\x9D\xB1" => "", # U+E0771 => +"\xF3\xA0\x9D\xB2" => "", # U+E0772 => +"\xF3\xA0\x9D\xB3" => "", # U+E0773 => +"\xF3\xA0\x9D\xB4" => "", # U+E0774 => +"\xF3\xA0\x9D\xB5" => "", # U+E0775 => +"\xF3\xA0\x9D\xB6" => "", # U+E0776 => +"\xF3\xA0\x9D\xB7" => "", # U+E0777 => +"\xF3\xA0\x9D\xB8" => "", # U+E0778 => +"\xF3\xA0\x9D\xB9" => "", # U+E0779 => +"\xF3\xA0\x9D\xBA" => "", # U+E077A => +"\xF3\xA0\x9D\xBB" => "", # U+E077B => +"\xF3\xA0\x9D\xBC" => "", # U+E077C => +"\xF3\xA0\x9D\xBD" => "", # U+E077D => +"\xF3\xA0\x9D\xBE" => "", # U+E077E => +"\xF3\xA0\x9D\xBF" => "", # U+E077F => +"\xF3\xA0\x9E\x80" => "", # U+E0780 => +"\xF3\xA0\x9E\x81" => "", # U+E0781 => +"\xF3\xA0\x9E\x82" => "", # U+E0782 => +"\xF3\xA0\x9E\x83" => "", # U+E0783 => +"\xF3\xA0\x9E\x84" => "", # U+E0784 => +"\xF3\xA0\x9E\x85" => "", # U+E0785 => +"\xF3\xA0\x9E\x86" => "", # U+E0786 => +"\xF3\xA0\x9E\x87" => "", # U+E0787 => +"\xF3\xA0\x9E\x88" => "", # U+E0788 => +"\xF3\xA0\x9E\x89" => "", # U+E0789 => +"\xF3\xA0\x9E\x8A" => "", # U+E078A => +"\xF3\xA0\x9E\x8B" => "", # U+E078B => +"\xF3\xA0\x9E\x8C" => "", # U+E078C => +"\xF3\xA0\x9E\x8D" => "", # U+E078D => +"\xF3\xA0\x9E\x8E" => "", # U+E078E => +"\xF3\xA0\x9E\x8F" => "", # U+E078F => +"\xF3\xA0\x9E\x90" => "", # U+E0790 => +"\xF3\xA0\x9E\x91" => "", # U+E0791 => +"\xF3\xA0\x9E\x92" => "", # U+E0792 => +"\xF3\xA0\x9E\x93" => "", # U+E0793 => +"\xF3\xA0\x9E\x94" => "", # U+E0794 => +"\xF3\xA0\x9E\x95" => "", # U+E0795 => +"\xF3\xA0\x9E\x96" => "", # U+E0796 => +"\xF3\xA0\x9E\x97" => "", # U+E0797 => +"\xF3\xA0\x9E\x98" => "", # U+E0798 => +"\xF3\xA0\x9E\x99" => "", # U+E0799 => +"\xF3\xA0\x9E\x9A" => "", # U+E079A => +"\xF3\xA0\x9E\x9B" => "", # U+E079B => +"\xF3\xA0\x9E\x9C" => "", # U+E079C => +"\xF3\xA0\x9E\x9D" => "", # U+E079D => +"\xF3\xA0\x9E\x9E" => "", # U+E079E => +"\xF3\xA0\x9E\x9F" => "", # U+E079F => +"\xF3\xA0\x9E\xA0" => "", # U+E07A0 => +"\xF3\xA0\x9E\xA1" => "", # U+E07A1 => +"\xF3\xA0\x9E\xA2" => "", # U+E07A2 => +"\xF3\xA0\x9E\xA3" => "", # U+E07A3 => +"\xF3\xA0\x9E\xA4" => "", # U+E07A4 => +"\xF3\xA0\x9E\xA5" => "", # U+E07A5 => +"\xF3\xA0\x9E\xA6" => "", # U+E07A6 => +"\xF3\xA0\x9E\xA7" => "", # U+E07A7 => +"\xF3\xA0\x9E\xA8" => "", # U+E07A8 => +"\xF3\xA0\x9E\xA9" => "", # U+E07A9 => +"\xF3\xA0\x9E\xAA" => "", # U+E07AA => +"\xF3\xA0\x9E\xAB" => "", # U+E07AB => +"\xF3\xA0\x9E\xAC" => "", # U+E07AC => +"\xF3\xA0\x9E\xAD" => "", # U+E07AD => +"\xF3\xA0\x9E\xAE" => "", # U+E07AE => +"\xF3\xA0\x9E\xAF" => "", # U+E07AF => +"\xF3\xA0\x9E\xB0" => "", # U+E07B0 => +"\xF3\xA0\x9E\xB1" => "", # U+E07B1 => +"\xF3\xA0\x9E\xB2" => "", # U+E07B2 => +"\xF3\xA0\x9E\xB3" => "", # U+E07B3 => +"\xF3\xA0\x9E\xB4" => "", # U+E07B4 => +"\xF3\xA0\x9E\xB5" => "", # U+E07B5 => +"\xF3\xA0\x9E\xB6" => "", # U+E07B6 => +"\xF3\xA0\x9E\xB7" => "", # U+E07B7 => +"\xF3\xA0\x9E\xB8" => "", # U+E07B8 => +"\xF3\xA0\x9E\xB9" => "", # U+E07B9 => +"\xF3\xA0\x9E\xBA" => "", # U+E07BA => +"\xF3\xA0\x9E\xBB" => "", # U+E07BB => +"\xF3\xA0\x9E\xBC" => "", # U+E07BC => +"\xF3\xA0\x9E\xBD" => "", # U+E07BD => +"\xF3\xA0\x9E\xBE" => "", # U+E07BE => +"\xF3\xA0\x9E\xBF" => "", # U+E07BF => +"\xF3\xA0\x9F\x80" => "", # U+E07C0 => +"\xF3\xA0\x9F\x81" => "", # U+E07C1 => +"\xF3\xA0\x9F\x82" => "", # U+E07C2 => +"\xF3\xA0\x9F\x83" => "", # U+E07C3 => +"\xF3\xA0\x9F\x84" => "", # U+E07C4 => +"\xF3\xA0\x9F\x85" => "", # U+E07C5 => +"\xF3\xA0\x9F\x86" => "", # U+E07C6 => +"\xF3\xA0\x9F\x87" => "", # U+E07C7 => +"\xF3\xA0\x9F\x88" => "", # U+E07C8 => +"\xF3\xA0\x9F\x89" => "", # U+E07C9 => +"\xF3\xA0\x9F\x8A" => "", # U+E07CA => +"\xF3\xA0\x9F\x8B" => "", # U+E07CB => +"\xF3\xA0\x9F\x8C" => "", # U+E07CC => +"\xF3\xA0\x9F\x8D" => "", # U+E07CD => +"\xF3\xA0\x9F\x8E" => "", # U+E07CE => +"\xF3\xA0\x9F\x8F" => "", # U+E07CF => +"\xF3\xA0\x9F\x90" => "", # U+E07D0 => +"\xF3\xA0\x9F\x91" => "", # U+E07D1 => +"\xF3\xA0\x9F\x92" => "", # U+E07D2 => +"\xF3\xA0\x9F\x93" => "", # U+E07D3 => +"\xF3\xA0\x9F\x94" => "", # U+E07D4 => +"\xF3\xA0\x9F\x95" => "", # U+E07D5 => +"\xF3\xA0\x9F\x96" => "", # U+E07D6 => +"\xF3\xA0\x9F\x97" => "", # U+E07D7 => +"\xF3\xA0\x9F\x98" => "", # U+E07D8 => +"\xF3\xA0\x9F\x99" => "", # U+E07D9 => +"\xF3\xA0\x9F\x9A" => "", # U+E07DA => +"\xF3\xA0\x9F\x9B" => "", # U+E07DB => +"\xF3\xA0\x9F\x9C" => "", # U+E07DC => +"\xF3\xA0\x9F\x9D" => "", # U+E07DD => +"\xF3\xA0\x9F\x9E" => "", # U+E07DE => +"\xF3\xA0\x9F\x9F" => "", # U+E07DF => +"\xF3\xA0\x9F\xA0" => "", # U+E07E0 => +"\xF3\xA0\x9F\xA1" => "", # U+E07E1 => +"\xF3\xA0\x9F\xA2" => "", # U+E07E2 => +"\xF3\xA0\x9F\xA3" => "", # U+E07E3 => +"\xF3\xA0\x9F\xA4" => "", # U+E07E4 => +"\xF3\xA0\x9F\xA5" => "", # U+E07E5 => +"\xF3\xA0\x9F\xA6" => "", # U+E07E6 => +"\xF3\xA0\x9F\xA7" => "", # U+E07E7 => +"\xF3\xA0\x9F\xA8" => "", # U+E07E8 => +"\xF3\xA0\x9F\xA9" => "", # U+E07E9 => +"\xF3\xA0\x9F\xAA" => "", # U+E07EA => +"\xF3\xA0\x9F\xAB" => "", # U+E07EB => +"\xF3\xA0\x9F\xAC" => "", # U+E07EC => +"\xF3\xA0\x9F\xAD" => "", # U+E07ED => +"\xF3\xA0\x9F\xAE" => "", # U+E07EE => +"\xF3\xA0\x9F\xAF" => "", # U+E07EF => +"\xF3\xA0\x9F\xB0" => "", # U+E07F0 => +"\xF3\xA0\x9F\xB1" => "", # U+E07F1 => +"\xF3\xA0\x9F\xB2" => "", # U+E07F2 => +"\xF3\xA0\x9F\xB3" => "", # U+E07F3 => +"\xF3\xA0\x9F\xB4" => "", # U+E07F4 => +"\xF3\xA0\x9F\xB5" => "", # U+E07F5 => +"\xF3\xA0\x9F\xB6" => "", # U+E07F6 => +"\xF3\xA0\x9F\xB7" => "", # U+E07F7 => +"\xF3\xA0\x9F\xB8" => "", # U+E07F8 => +"\xF3\xA0\x9F\xB9" => "", # U+E07F9 => +"\xF3\xA0\x9F\xBA" => "", # U+E07FA => +"\xF3\xA0\x9F\xBB" => "", # U+E07FB => +"\xF3\xA0\x9F\xBC" => "", # U+E07FC => +"\xF3\xA0\x9F\xBD" => "", # U+E07FD => +"\xF3\xA0\x9F\xBE" => "", # U+E07FE => +"\xF3\xA0\x9F\xBF" => "", # U+E07FF => +"\xF3\xA0\xA0\x80" => "", # U+E0800 => +"\xF3\xA0\xA0\x81" => "", # U+E0801 => +"\xF3\xA0\xA0\x82" => "", # U+E0802 => +"\xF3\xA0\xA0\x83" => "", # U+E0803 => +"\xF3\xA0\xA0\x84" => "", # U+E0804 => +"\xF3\xA0\xA0\x85" => "", # U+E0805 => +"\xF3\xA0\xA0\x86" => "", # U+E0806 => +"\xF3\xA0\xA0\x87" => "", # U+E0807 => +"\xF3\xA0\xA0\x88" => "", # U+E0808 => +"\xF3\xA0\xA0\x89" => "", # U+E0809 => +"\xF3\xA0\xA0\x8A" => "", # U+E080A => +"\xF3\xA0\xA0\x8B" => "", # U+E080B => +"\xF3\xA0\xA0\x8C" => "", # U+E080C => +"\xF3\xA0\xA0\x8D" => "", # U+E080D => +"\xF3\xA0\xA0\x8E" => "", # U+E080E => +"\xF3\xA0\xA0\x8F" => "", # U+E080F => +"\xF3\xA0\xA0\x90" => "", # U+E0810 => +"\xF3\xA0\xA0\x91" => "", # U+E0811 => +"\xF3\xA0\xA0\x92" => "", # U+E0812 => +"\xF3\xA0\xA0\x93" => "", # U+E0813 => +"\xF3\xA0\xA0\x94" => "", # U+E0814 => +"\xF3\xA0\xA0\x95" => "", # U+E0815 => +"\xF3\xA0\xA0\x96" => "", # U+E0816 => +"\xF3\xA0\xA0\x97" => "", # U+E0817 => +"\xF3\xA0\xA0\x98" => "", # U+E0818 => +"\xF3\xA0\xA0\x99" => "", # U+E0819 => +"\xF3\xA0\xA0\x9A" => "", # U+E081A => +"\xF3\xA0\xA0\x9B" => "", # U+E081B => +"\xF3\xA0\xA0\x9C" => "", # U+E081C => +"\xF3\xA0\xA0\x9D" => "", # U+E081D => +"\xF3\xA0\xA0\x9E" => "", # U+E081E => +"\xF3\xA0\xA0\x9F" => "", # U+E081F => +"\xF3\xA0\xA0\xA0" => "", # U+E0820 => +"\xF3\xA0\xA0\xA1" => "", # U+E0821 => +"\xF3\xA0\xA0\xA2" => "", # U+E0822 => +"\xF3\xA0\xA0\xA3" => "", # U+E0823 => +"\xF3\xA0\xA0\xA4" => "", # U+E0824 => +"\xF3\xA0\xA0\xA5" => "", # U+E0825 => +"\xF3\xA0\xA0\xA6" => "", # U+E0826 => +"\xF3\xA0\xA0\xA7" => "", # U+E0827 => +"\xF3\xA0\xA0\xA8" => "", # U+E0828 => +"\xF3\xA0\xA0\xA9" => "", # U+E0829 => +"\xF3\xA0\xA0\xAA" => "", # U+E082A => +"\xF3\xA0\xA0\xAB" => "", # U+E082B => +"\xF3\xA0\xA0\xAC" => "", # U+E082C => +"\xF3\xA0\xA0\xAD" => "", # U+E082D => +"\xF3\xA0\xA0\xAE" => "", # U+E082E => +"\xF3\xA0\xA0\xAF" => "", # U+E082F => +"\xF3\xA0\xA0\xB0" => "", # U+E0830 => +"\xF3\xA0\xA0\xB1" => "", # U+E0831 => +"\xF3\xA0\xA0\xB2" => "", # U+E0832 => +"\xF3\xA0\xA0\xB3" => "", # U+E0833 => +"\xF3\xA0\xA0\xB4" => "", # U+E0834 => +"\xF3\xA0\xA0\xB5" => "", # U+E0835 => +"\xF3\xA0\xA0\xB6" => "", # U+E0836 => +"\xF3\xA0\xA0\xB7" => "", # U+E0837 => +"\xF3\xA0\xA0\xB8" => "", # U+E0838 => +"\xF3\xA0\xA0\xB9" => "", # U+E0839 => +"\xF3\xA0\xA0\xBA" => "", # U+E083A => +"\xF3\xA0\xA0\xBB" => "", # U+E083B => +"\xF3\xA0\xA0\xBC" => "", # U+E083C => +"\xF3\xA0\xA0\xBD" => "", # U+E083D => +"\xF3\xA0\xA0\xBE" => "", # U+E083E => +"\xF3\xA0\xA0\xBF" => "", # U+E083F => +"\xF3\xA0\xA1\x80" => "", # U+E0840 => +"\xF3\xA0\xA1\x81" => "", # U+E0841 => +"\xF3\xA0\xA1\x82" => "", # U+E0842 => +"\xF3\xA0\xA1\x83" => "", # U+E0843 => +"\xF3\xA0\xA1\x84" => "", # U+E0844 => +"\xF3\xA0\xA1\x85" => "", # U+E0845 => +"\xF3\xA0\xA1\x86" => "", # U+E0846 => +"\xF3\xA0\xA1\x87" => "", # U+E0847 => +"\xF3\xA0\xA1\x88" => "", # U+E0848 => +"\xF3\xA0\xA1\x89" => "", # U+E0849 => +"\xF3\xA0\xA1\x8A" => "", # U+E084A => +"\xF3\xA0\xA1\x8B" => "", # U+E084B => +"\xF3\xA0\xA1\x8C" => "", # U+E084C => +"\xF3\xA0\xA1\x8D" => "", # U+E084D => +"\xF3\xA0\xA1\x8E" => "", # U+E084E => +"\xF3\xA0\xA1\x8F" => "", # U+E084F => +"\xF3\xA0\xA1\x90" => "", # U+E0850 => +"\xF3\xA0\xA1\x91" => "", # U+E0851 => +"\xF3\xA0\xA1\x92" => "", # U+E0852 => +"\xF3\xA0\xA1\x93" => "", # U+E0853 => +"\xF3\xA0\xA1\x94" => "", # U+E0854 => +"\xF3\xA0\xA1\x95" => "", # U+E0855 => +"\xF3\xA0\xA1\x96" => "", # U+E0856 => +"\xF3\xA0\xA1\x97" => "", # U+E0857 => +"\xF3\xA0\xA1\x98" => "", # U+E0858 => +"\xF3\xA0\xA1\x99" => "", # U+E0859 => +"\xF3\xA0\xA1\x9A" => "", # U+E085A => +"\xF3\xA0\xA1\x9B" => "", # U+E085B => +"\xF3\xA0\xA1\x9C" => "", # U+E085C => +"\xF3\xA0\xA1\x9D" => "", # U+E085D => +"\xF3\xA0\xA1\x9E" => "", # U+E085E => +"\xF3\xA0\xA1\x9F" => "", # U+E085F => +"\xF3\xA0\xA1\xA0" => "", # U+E0860 => +"\xF3\xA0\xA1\xA1" => "", # U+E0861 => +"\xF3\xA0\xA1\xA2" => "", # U+E0862 => +"\xF3\xA0\xA1\xA3" => "", # U+E0863 => +"\xF3\xA0\xA1\xA4" => "", # U+E0864 => +"\xF3\xA0\xA1\xA5" => "", # U+E0865 => +"\xF3\xA0\xA1\xA6" => "", # U+E0866 => +"\xF3\xA0\xA1\xA7" => "", # U+E0867 => +"\xF3\xA0\xA1\xA8" => "", # U+E0868 => +"\xF3\xA0\xA1\xA9" => "", # U+E0869 => +"\xF3\xA0\xA1\xAA" => "", # U+E086A => +"\xF3\xA0\xA1\xAB" => "", # U+E086B => +"\xF3\xA0\xA1\xAC" => "", # U+E086C => +"\xF3\xA0\xA1\xAD" => "", # U+E086D => +"\xF3\xA0\xA1\xAE" => "", # U+E086E => +"\xF3\xA0\xA1\xAF" => "", # U+E086F => +"\xF3\xA0\xA1\xB0" => "", # U+E0870 => +"\xF3\xA0\xA1\xB1" => "", # U+E0871 => +"\xF3\xA0\xA1\xB2" => "", # U+E0872 => +"\xF3\xA0\xA1\xB3" => "", # U+E0873 => +"\xF3\xA0\xA1\xB4" => "", # U+E0874 => +"\xF3\xA0\xA1\xB5" => "", # U+E0875 => +"\xF3\xA0\xA1\xB6" => "", # U+E0876 => +"\xF3\xA0\xA1\xB7" => "", # U+E0877 => +"\xF3\xA0\xA1\xB8" => "", # U+E0878 => +"\xF3\xA0\xA1\xB9" => "", # U+E0879 => +"\xF3\xA0\xA1\xBA" => "", # U+E087A => +"\xF3\xA0\xA1\xBB" => "", # U+E087B => +"\xF3\xA0\xA1\xBC" => "", # U+E087C => +"\xF3\xA0\xA1\xBD" => "", # U+E087D => +"\xF3\xA0\xA1\xBE" => "", # U+E087E => +"\xF3\xA0\xA1\xBF" => "", # U+E087F => +"\xF3\xA0\xA2\x80" => "", # U+E0880 => +"\xF3\xA0\xA2\x81" => "", # U+E0881 => +"\xF3\xA0\xA2\x82" => "", # U+E0882 => +"\xF3\xA0\xA2\x83" => "", # U+E0883 => +"\xF3\xA0\xA2\x84" => "", # U+E0884 => +"\xF3\xA0\xA2\x85" => "", # U+E0885 => +"\xF3\xA0\xA2\x86" => "", # U+E0886 => +"\xF3\xA0\xA2\x87" => "", # U+E0887 => +"\xF3\xA0\xA2\x88" => "", # U+E0888 => +"\xF3\xA0\xA2\x89" => "", # U+E0889 => +"\xF3\xA0\xA2\x8A" => "", # U+E088A => +"\xF3\xA0\xA2\x8B" => "", # U+E088B => +"\xF3\xA0\xA2\x8C" => "", # U+E088C => +"\xF3\xA0\xA2\x8D" => "", # U+E088D => +"\xF3\xA0\xA2\x8E" => "", # U+E088E => +"\xF3\xA0\xA2\x8F" => "", # U+E088F => +"\xF3\xA0\xA2\x90" => "", # U+E0890 => +"\xF3\xA0\xA2\x91" => "", # U+E0891 => +"\xF3\xA0\xA2\x92" => "", # U+E0892 => +"\xF3\xA0\xA2\x93" => "", # U+E0893 => +"\xF3\xA0\xA2\x94" => "", # U+E0894 => +"\xF3\xA0\xA2\x95" => "", # U+E0895 => +"\xF3\xA0\xA2\x96" => "", # U+E0896 => +"\xF3\xA0\xA2\x97" => "", # U+E0897 => +"\xF3\xA0\xA2\x98" => "", # U+E0898 => +"\xF3\xA0\xA2\x99" => "", # U+E0899 => +"\xF3\xA0\xA2\x9A" => "", # U+E089A => +"\xF3\xA0\xA2\x9B" => "", # U+E089B => +"\xF3\xA0\xA2\x9C" => "", # U+E089C => +"\xF3\xA0\xA2\x9D" => "", # U+E089D => +"\xF3\xA0\xA2\x9E" => "", # U+E089E => +"\xF3\xA0\xA2\x9F" => "", # U+E089F => +"\xF3\xA0\xA2\xA0" => "", # U+E08A0 => +"\xF3\xA0\xA2\xA1" => "", # U+E08A1 => +"\xF3\xA0\xA2\xA2" => "", # U+E08A2 => +"\xF3\xA0\xA2\xA3" => "", # U+E08A3 => +"\xF3\xA0\xA2\xA4" => "", # U+E08A4 => +"\xF3\xA0\xA2\xA5" => "", # U+E08A5 => +"\xF3\xA0\xA2\xA6" => "", # U+E08A6 => +"\xF3\xA0\xA2\xA7" => "", # U+E08A7 => +"\xF3\xA0\xA2\xA8" => "", # U+E08A8 => +"\xF3\xA0\xA2\xA9" => "", # U+E08A9 => +"\xF3\xA0\xA2\xAA" => "", # U+E08AA => +"\xF3\xA0\xA2\xAB" => "", # U+E08AB => +"\xF3\xA0\xA2\xAC" => "", # U+E08AC => +"\xF3\xA0\xA2\xAD" => "", # U+E08AD => +"\xF3\xA0\xA2\xAE" => "", # U+E08AE => +"\xF3\xA0\xA2\xAF" => "", # U+E08AF => +"\xF3\xA0\xA2\xB0" => "", # U+E08B0 => +"\xF3\xA0\xA2\xB1" => "", # U+E08B1 => +"\xF3\xA0\xA2\xB2" => "", # U+E08B2 => +"\xF3\xA0\xA2\xB3" => "", # U+E08B3 => +"\xF3\xA0\xA2\xB4" => "", # U+E08B4 => +"\xF3\xA0\xA2\xB5" => "", # U+E08B5 => +"\xF3\xA0\xA2\xB6" => "", # U+E08B6 => +"\xF3\xA0\xA2\xB7" => "", # U+E08B7 => +"\xF3\xA0\xA2\xB8" => "", # U+E08B8 => +"\xF3\xA0\xA2\xB9" => "", # U+E08B9 => +"\xF3\xA0\xA2\xBA" => "", # U+E08BA => +"\xF3\xA0\xA2\xBB" => "", # U+E08BB => +"\xF3\xA0\xA2\xBC" => "", # U+E08BC => +"\xF3\xA0\xA2\xBD" => "", # U+E08BD => +"\xF3\xA0\xA2\xBE" => "", # U+E08BE => +"\xF3\xA0\xA2\xBF" => "", # U+E08BF => +"\xF3\xA0\xA3\x80" => "", # U+E08C0 => +"\xF3\xA0\xA3\x81" => "", # U+E08C1 => +"\xF3\xA0\xA3\x82" => "", # U+E08C2 => +"\xF3\xA0\xA3\x83" => "", # U+E08C3 => +"\xF3\xA0\xA3\x84" => "", # U+E08C4 => +"\xF3\xA0\xA3\x85" => "", # U+E08C5 => +"\xF3\xA0\xA3\x86" => "", # U+E08C6 => +"\xF3\xA0\xA3\x87" => "", # U+E08C7 => +"\xF3\xA0\xA3\x88" => "", # U+E08C8 => +"\xF3\xA0\xA3\x89" => "", # U+E08C9 => +"\xF3\xA0\xA3\x8A" => "", # U+E08CA => +"\xF3\xA0\xA3\x8B" => "", # U+E08CB => +"\xF3\xA0\xA3\x8C" => "", # U+E08CC => +"\xF3\xA0\xA3\x8D" => "", # U+E08CD => +"\xF3\xA0\xA3\x8E" => "", # U+E08CE => +"\xF3\xA0\xA3\x8F" => "", # U+E08CF => +"\xF3\xA0\xA3\x90" => "", # U+E08D0 => +"\xF3\xA0\xA3\x91" => "", # U+E08D1 => +"\xF3\xA0\xA3\x92" => "", # U+E08D2 => +"\xF3\xA0\xA3\x93" => "", # U+E08D3 => +"\xF3\xA0\xA3\x94" => "", # U+E08D4 => +"\xF3\xA0\xA3\x95" => "", # U+E08D5 => +"\xF3\xA0\xA3\x96" => "", # U+E08D6 => +"\xF3\xA0\xA3\x97" => "", # U+E08D7 => +"\xF3\xA0\xA3\x98" => "", # U+E08D8 => +"\xF3\xA0\xA3\x99" => "", # U+E08D9 => +"\xF3\xA0\xA3\x9A" => "", # U+E08DA => +"\xF3\xA0\xA3\x9B" => "", # U+E08DB => +"\xF3\xA0\xA3\x9C" => "", # U+E08DC => +"\xF3\xA0\xA3\x9D" => "", # U+E08DD => +"\xF3\xA0\xA3\x9E" => "", # U+E08DE => +"\xF3\xA0\xA3\x9F" => "", # U+E08DF => +"\xF3\xA0\xA3\xA0" => "", # U+E08E0 => +"\xF3\xA0\xA3\xA1" => "", # U+E08E1 => +"\xF3\xA0\xA3\xA2" => "", # U+E08E2 => +"\xF3\xA0\xA3\xA3" => "", # U+E08E3 => +"\xF3\xA0\xA3\xA4" => "", # U+E08E4 => +"\xF3\xA0\xA3\xA5" => "", # U+E08E5 => +"\xF3\xA0\xA3\xA6" => "", # U+E08E6 => +"\xF3\xA0\xA3\xA7" => "", # U+E08E7 => +"\xF3\xA0\xA3\xA8" => "", # U+E08E8 => +"\xF3\xA0\xA3\xA9" => "", # U+E08E9 => +"\xF3\xA0\xA3\xAA" => "", # U+E08EA => +"\xF3\xA0\xA3\xAB" => "", # U+E08EB => +"\xF3\xA0\xA3\xAC" => "", # U+E08EC => +"\xF3\xA0\xA3\xAD" => "", # U+E08ED => +"\xF3\xA0\xA3\xAE" => "", # U+E08EE => +"\xF3\xA0\xA3\xAF" => "", # U+E08EF => +"\xF3\xA0\xA3\xB0" => "", # U+E08F0 => +"\xF3\xA0\xA3\xB1" => "", # U+E08F1 => +"\xF3\xA0\xA3\xB2" => "", # U+E08F2 => +"\xF3\xA0\xA3\xB3" => "", # U+E08F3 => +"\xF3\xA0\xA3\xB4" => "", # U+E08F4 => +"\xF3\xA0\xA3\xB5" => "", # U+E08F5 => +"\xF3\xA0\xA3\xB6" => "", # U+E08F6 => +"\xF3\xA0\xA3\xB7" => "", # U+E08F7 => +"\xF3\xA0\xA3\xB8" => "", # U+E08F8 => +"\xF3\xA0\xA3\xB9" => "", # U+E08F9 => +"\xF3\xA0\xA3\xBA" => "", # U+E08FA => +"\xF3\xA0\xA3\xBB" => "", # U+E08FB => +"\xF3\xA0\xA3\xBC" => "", # U+E08FC => +"\xF3\xA0\xA3\xBD" => "", # U+E08FD => +"\xF3\xA0\xA3\xBE" => "", # U+E08FE => +"\xF3\xA0\xA3\xBF" => "", # U+E08FF => +"\xF3\xA0\xA4\x80" => "", # U+E0900 => +"\xF3\xA0\xA4\x81" => "", # U+E0901 => +"\xF3\xA0\xA4\x82" => "", # U+E0902 => +"\xF3\xA0\xA4\x83" => "", # U+E0903 => +"\xF3\xA0\xA4\x84" => "", # U+E0904 => +"\xF3\xA0\xA4\x85" => "", # U+E0905 => +"\xF3\xA0\xA4\x86" => "", # U+E0906 => +"\xF3\xA0\xA4\x87" => "", # U+E0907 => +"\xF3\xA0\xA4\x88" => "", # U+E0908 => +"\xF3\xA0\xA4\x89" => "", # U+E0909 => +"\xF3\xA0\xA4\x8A" => "", # U+E090A => +"\xF3\xA0\xA4\x8B" => "", # U+E090B => +"\xF3\xA0\xA4\x8C" => "", # U+E090C => +"\xF3\xA0\xA4\x8D" => "", # U+E090D => +"\xF3\xA0\xA4\x8E" => "", # U+E090E => +"\xF3\xA0\xA4\x8F" => "", # U+E090F => +"\xF3\xA0\xA4\x90" => "", # U+E0910 => +"\xF3\xA0\xA4\x91" => "", # U+E0911 => +"\xF3\xA0\xA4\x92" => "", # U+E0912 => +"\xF3\xA0\xA4\x93" => "", # U+E0913 => +"\xF3\xA0\xA4\x94" => "", # U+E0914 => +"\xF3\xA0\xA4\x95" => "", # U+E0915 => +"\xF3\xA0\xA4\x96" => "", # U+E0916 => +"\xF3\xA0\xA4\x97" => "", # U+E0917 => +"\xF3\xA0\xA4\x98" => "", # U+E0918 => +"\xF3\xA0\xA4\x99" => "", # U+E0919 => +"\xF3\xA0\xA4\x9A" => "", # U+E091A => +"\xF3\xA0\xA4\x9B" => "", # U+E091B => +"\xF3\xA0\xA4\x9C" => "", # U+E091C => +"\xF3\xA0\xA4\x9D" => "", # U+E091D => +"\xF3\xA0\xA4\x9E" => "", # U+E091E => +"\xF3\xA0\xA4\x9F" => "", # U+E091F => +"\xF3\xA0\xA4\xA0" => "", # U+E0920 => +"\xF3\xA0\xA4\xA1" => "", # U+E0921 => +"\xF3\xA0\xA4\xA2" => "", # U+E0922 => +"\xF3\xA0\xA4\xA3" => "", # U+E0923 => +"\xF3\xA0\xA4\xA4" => "", # U+E0924 => +"\xF3\xA0\xA4\xA5" => "", # U+E0925 => +"\xF3\xA0\xA4\xA6" => "", # U+E0926 => +"\xF3\xA0\xA4\xA7" => "", # U+E0927 => +"\xF3\xA0\xA4\xA8" => "", # U+E0928 => +"\xF3\xA0\xA4\xA9" => "", # U+E0929 => +"\xF3\xA0\xA4\xAA" => "", # U+E092A => +"\xF3\xA0\xA4\xAB" => "", # U+E092B => +"\xF3\xA0\xA4\xAC" => "", # U+E092C => +"\xF3\xA0\xA4\xAD" => "", # U+E092D => +"\xF3\xA0\xA4\xAE" => "", # U+E092E => +"\xF3\xA0\xA4\xAF" => "", # U+E092F => +"\xF3\xA0\xA4\xB0" => "", # U+E0930 => +"\xF3\xA0\xA4\xB1" => "", # U+E0931 => +"\xF3\xA0\xA4\xB2" => "", # U+E0932 => +"\xF3\xA0\xA4\xB3" => "", # U+E0933 => +"\xF3\xA0\xA4\xB4" => "", # U+E0934 => +"\xF3\xA0\xA4\xB5" => "", # U+E0935 => +"\xF3\xA0\xA4\xB6" => "", # U+E0936 => +"\xF3\xA0\xA4\xB7" => "", # U+E0937 => +"\xF3\xA0\xA4\xB8" => "", # U+E0938 => +"\xF3\xA0\xA4\xB9" => "", # U+E0939 => +"\xF3\xA0\xA4\xBA" => "", # U+E093A => +"\xF3\xA0\xA4\xBB" => "", # U+E093B => +"\xF3\xA0\xA4\xBC" => "", # U+E093C => +"\xF3\xA0\xA4\xBD" => "", # U+E093D => +"\xF3\xA0\xA4\xBE" => "", # U+E093E => +"\xF3\xA0\xA4\xBF" => "", # U+E093F => +"\xF3\xA0\xA5\x80" => "", # U+E0940 => +"\xF3\xA0\xA5\x81" => "", # U+E0941 => +"\xF3\xA0\xA5\x82" => "", # U+E0942 => +"\xF3\xA0\xA5\x83" => "", # U+E0943 => +"\xF3\xA0\xA5\x84" => "", # U+E0944 => +"\xF3\xA0\xA5\x85" => "", # U+E0945 => +"\xF3\xA0\xA5\x86" => "", # U+E0946 => +"\xF3\xA0\xA5\x87" => "", # U+E0947 => +"\xF3\xA0\xA5\x88" => "", # U+E0948 => +"\xF3\xA0\xA5\x89" => "", # U+E0949 => +"\xF3\xA0\xA5\x8A" => "", # U+E094A => +"\xF3\xA0\xA5\x8B" => "", # U+E094B => +"\xF3\xA0\xA5\x8C" => "", # U+E094C => +"\xF3\xA0\xA5\x8D" => "", # U+E094D => +"\xF3\xA0\xA5\x8E" => "", # U+E094E => +"\xF3\xA0\xA5\x8F" => "", # U+E094F => +"\xF3\xA0\xA5\x90" => "", # U+E0950 => +"\xF3\xA0\xA5\x91" => "", # U+E0951 => +"\xF3\xA0\xA5\x92" => "", # U+E0952 => +"\xF3\xA0\xA5\x93" => "", # U+E0953 => +"\xF3\xA0\xA5\x94" => "", # U+E0954 => +"\xF3\xA0\xA5\x95" => "", # U+E0955 => +"\xF3\xA0\xA5\x96" => "", # U+E0956 => +"\xF3\xA0\xA5\x97" => "", # U+E0957 => +"\xF3\xA0\xA5\x98" => "", # U+E0958 => +"\xF3\xA0\xA5\x99" => "", # U+E0959 => +"\xF3\xA0\xA5\x9A" => "", # U+E095A => +"\xF3\xA0\xA5\x9B" => "", # U+E095B => +"\xF3\xA0\xA5\x9C" => "", # U+E095C => +"\xF3\xA0\xA5\x9D" => "", # U+E095D => +"\xF3\xA0\xA5\x9E" => "", # U+E095E => +"\xF3\xA0\xA5\x9F" => "", # U+E095F => +"\xF3\xA0\xA5\xA0" => "", # U+E0960 => +"\xF3\xA0\xA5\xA1" => "", # U+E0961 => +"\xF3\xA0\xA5\xA2" => "", # U+E0962 => +"\xF3\xA0\xA5\xA3" => "", # U+E0963 => +"\xF3\xA0\xA5\xA4" => "", # U+E0964 => +"\xF3\xA0\xA5\xA5" => "", # U+E0965 => +"\xF3\xA0\xA5\xA6" => "", # U+E0966 => +"\xF3\xA0\xA5\xA7" => "", # U+E0967 => +"\xF3\xA0\xA5\xA8" => "", # U+E0968 => +"\xF3\xA0\xA5\xA9" => "", # U+E0969 => +"\xF3\xA0\xA5\xAA" => "", # U+E096A => +"\xF3\xA0\xA5\xAB" => "", # U+E096B => +"\xF3\xA0\xA5\xAC" => "", # U+E096C => +"\xF3\xA0\xA5\xAD" => "", # U+E096D => +"\xF3\xA0\xA5\xAE" => "", # U+E096E => +"\xF3\xA0\xA5\xAF" => "", # U+E096F => +"\xF3\xA0\xA5\xB0" => "", # U+E0970 => +"\xF3\xA0\xA5\xB1" => "", # U+E0971 => +"\xF3\xA0\xA5\xB2" => "", # U+E0972 => +"\xF3\xA0\xA5\xB3" => "", # U+E0973 => +"\xF3\xA0\xA5\xB4" => "", # U+E0974 => +"\xF3\xA0\xA5\xB5" => "", # U+E0975 => +"\xF3\xA0\xA5\xB6" => "", # U+E0976 => +"\xF3\xA0\xA5\xB7" => "", # U+E0977 => +"\xF3\xA0\xA5\xB8" => "", # U+E0978 => +"\xF3\xA0\xA5\xB9" => "", # U+E0979 => +"\xF3\xA0\xA5\xBA" => "", # U+E097A => +"\xF3\xA0\xA5\xBB" => "", # U+E097B => +"\xF3\xA0\xA5\xBC" => "", # U+E097C => +"\xF3\xA0\xA5\xBD" => "", # U+E097D => +"\xF3\xA0\xA5\xBE" => "", # U+E097E => +"\xF3\xA0\xA5\xBF" => "", # U+E097F => +"\xF3\xA0\xA6\x80" => "", # U+E0980 => +"\xF3\xA0\xA6\x81" => "", # U+E0981 => +"\xF3\xA0\xA6\x82" => "", # U+E0982 => +"\xF3\xA0\xA6\x83" => "", # U+E0983 => +"\xF3\xA0\xA6\x84" => "", # U+E0984 => +"\xF3\xA0\xA6\x85" => "", # U+E0985 => +"\xF3\xA0\xA6\x86" => "", # U+E0986 => +"\xF3\xA0\xA6\x87" => "", # U+E0987 => +"\xF3\xA0\xA6\x88" => "", # U+E0988 => +"\xF3\xA0\xA6\x89" => "", # U+E0989 => +"\xF3\xA0\xA6\x8A" => "", # U+E098A => +"\xF3\xA0\xA6\x8B" => "", # U+E098B => +"\xF3\xA0\xA6\x8C" => "", # U+E098C => +"\xF3\xA0\xA6\x8D" => "", # U+E098D => +"\xF3\xA0\xA6\x8E" => "", # U+E098E => +"\xF3\xA0\xA6\x8F" => "", # U+E098F => +"\xF3\xA0\xA6\x90" => "", # U+E0990 => +"\xF3\xA0\xA6\x91" => "", # U+E0991 => +"\xF3\xA0\xA6\x92" => "", # U+E0992 => +"\xF3\xA0\xA6\x93" => "", # U+E0993 => +"\xF3\xA0\xA6\x94" => "", # U+E0994 => +"\xF3\xA0\xA6\x95" => "", # U+E0995 => +"\xF3\xA0\xA6\x96" => "", # U+E0996 => +"\xF3\xA0\xA6\x97" => "", # U+E0997 => +"\xF3\xA0\xA6\x98" => "", # U+E0998 => +"\xF3\xA0\xA6\x99" => "", # U+E0999 => +"\xF3\xA0\xA6\x9A" => "", # U+E099A => +"\xF3\xA0\xA6\x9B" => "", # U+E099B => +"\xF3\xA0\xA6\x9C" => "", # U+E099C => +"\xF3\xA0\xA6\x9D" => "", # U+E099D => +"\xF3\xA0\xA6\x9E" => "", # U+E099E => +"\xF3\xA0\xA6\x9F" => "", # U+E099F => +"\xF3\xA0\xA6\xA0" => "", # U+E09A0 => +"\xF3\xA0\xA6\xA1" => "", # U+E09A1 => +"\xF3\xA0\xA6\xA2" => "", # U+E09A2 => +"\xF3\xA0\xA6\xA3" => "", # U+E09A3 => +"\xF3\xA0\xA6\xA4" => "", # U+E09A4 => +"\xF3\xA0\xA6\xA5" => "", # U+E09A5 => +"\xF3\xA0\xA6\xA6" => "", # U+E09A6 => +"\xF3\xA0\xA6\xA7" => "", # U+E09A7 => +"\xF3\xA0\xA6\xA8" => "", # U+E09A8 => +"\xF3\xA0\xA6\xA9" => "", # U+E09A9 => +"\xF3\xA0\xA6\xAA" => "", # U+E09AA => +"\xF3\xA0\xA6\xAB" => "", # U+E09AB => +"\xF3\xA0\xA6\xAC" => "", # U+E09AC => +"\xF3\xA0\xA6\xAD" => "", # U+E09AD => +"\xF3\xA0\xA6\xAE" => "", # U+E09AE => +"\xF3\xA0\xA6\xAF" => "", # U+E09AF => +"\xF3\xA0\xA6\xB0" => "", # U+E09B0 => +"\xF3\xA0\xA6\xB1" => "", # U+E09B1 => +"\xF3\xA0\xA6\xB2" => "", # U+E09B2 => +"\xF3\xA0\xA6\xB3" => "", # U+E09B3 => +"\xF3\xA0\xA6\xB4" => "", # U+E09B4 => +"\xF3\xA0\xA6\xB5" => "", # U+E09B5 => +"\xF3\xA0\xA6\xB6" => "", # U+E09B6 => +"\xF3\xA0\xA6\xB7" => "", # U+E09B7 => +"\xF3\xA0\xA6\xB8" => "", # U+E09B8 => +"\xF3\xA0\xA6\xB9" => "", # U+E09B9 => +"\xF3\xA0\xA6\xBA" => "", # U+E09BA => +"\xF3\xA0\xA6\xBB" => "", # U+E09BB => +"\xF3\xA0\xA6\xBC" => "", # U+E09BC => +"\xF3\xA0\xA6\xBD" => "", # U+E09BD => +"\xF3\xA0\xA6\xBE" => "", # U+E09BE => +"\xF3\xA0\xA6\xBF" => "", # U+E09BF => +"\xF3\xA0\xA7\x80" => "", # U+E09C0 => +"\xF3\xA0\xA7\x81" => "", # U+E09C1 => +"\xF3\xA0\xA7\x82" => "", # U+E09C2 => +"\xF3\xA0\xA7\x83" => "", # U+E09C3 => +"\xF3\xA0\xA7\x84" => "", # U+E09C4 => +"\xF3\xA0\xA7\x85" => "", # U+E09C5 => +"\xF3\xA0\xA7\x86" => "", # U+E09C6 => +"\xF3\xA0\xA7\x87" => "", # U+E09C7 => +"\xF3\xA0\xA7\x88" => "", # U+E09C8 => +"\xF3\xA0\xA7\x89" => "", # U+E09C9 => +"\xF3\xA0\xA7\x8A" => "", # U+E09CA => +"\xF3\xA0\xA7\x8B" => "", # U+E09CB => +"\xF3\xA0\xA7\x8C" => "", # U+E09CC => +"\xF3\xA0\xA7\x8D" => "", # U+E09CD => +"\xF3\xA0\xA7\x8E" => "", # U+E09CE => +"\xF3\xA0\xA7\x8F" => "", # U+E09CF => +"\xF3\xA0\xA7\x90" => "", # U+E09D0 => +"\xF3\xA0\xA7\x91" => "", # U+E09D1 => +"\xF3\xA0\xA7\x92" => "", # U+E09D2 => +"\xF3\xA0\xA7\x93" => "", # U+E09D3 => +"\xF3\xA0\xA7\x94" => "", # U+E09D4 => +"\xF3\xA0\xA7\x95" => "", # U+E09D5 => +"\xF3\xA0\xA7\x96" => "", # U+E09D6 => +"\xF3\xA0\xA7\x97" => "", # U+E09D7 => +"\xF3\xA0\xA7\x98" => "", # U+E09D8 => +"\xF3\xA0\xA7\x99" => "", # U+E09D9 => +"\xF3\xA0\xA7\x9A" => "", # U+E09DA => +"\xF3\xA0\xA7\x9B" => "", # U+E09DB => +"\xF3\xA0\xA7\x9C" => "", # U+E09DC => +"\xF3\xA0\xA7\x9D" => "", # U+E09DD => +"\xF3\xA0\xA7\x9E" => "", # U+E09DE => +"\xF3\xA0\xA7\x9F" => "", # U+E09DF => +"\xF3\xA0\xA7\xA0" => "", # U+E09E0 => +"\xF3\xA0\xA7\xA1" => "", # U+E09E1 => +"\xF3\xA0\xA7\xA2" => "", # U+E09E2 => +"\xF3\xA0\xA7\xA3" => "", # U+E09E3 => +"\xF3\xA0\xA7\xA4" => "", # U+E09E4 => +"\xF3\xA0\xA7\xA5" => "", # U+E09E5 => +"\xF3\xA0\xA7\xA6" => "", # U+E09E6 => +"\xF3\xA0\xA7\xA7" => "", # U+E09E7 => +"\xF3\xA0\xA7\xA8" => "", # U+E09E8 => +"\xF3\xA0\xA7\xA9" => "", # U+E09E9 => +"\xF3\xA0\xA7\xAA" => "", # U+E09EA => +"\xF3\xA0\xA7\xAB" => "", # U+E09EB => +"\xF3\xA0\xA7\xAC" => "", # U+E09EC => +"\xF3\xA0\xA7\xAD" => "", # U+E09ED => +"\xF3\xA0\xA7\xAE" => "", # U+E09EE => +"\xF3\xA0\xA7\xAF" => "", # U+E09EF => +"\xF3\xA0\xA7\xB0" => "", # U+E09F0 => +"\xF3\xA0\xA7\xB1" => "", # U+E09F1 => +"\xF3\xA0\xA7\xB2" => "", # U+E09F2 => +"\xF3\xA0\xA7\xB3" => "", # U+E09F3 => +"\xF3\xA0\xA7\xB4" => "", # U+E09F4 => +"\xF3\xA0\xA7\xB5" => "", # U+E09F5 => +"\xF3\xA0\xA7\xB6" => "", # U+E09F6 => +"\xF3\xA0\xA7\xB7" => "", # U+E09F7 => +"\xF3\xA0\xA7\xB8" => "", # U+E09F8 => +"\xF3\xA0\xA7\xB9" => "", # U+E09F9 => +"\xF3\xA0\xA7\xBA" => "", # U+E09FA => +"\xF3\xA0\xA7\xBB" => "", # U+E09FB => +"\xF3\xA0\xA7\xBC" => "", # U+E09FC => +"\xF3\xA0\xA7\xBD" => "", # U+E09FD => +"\xF3\xA0\xA7\xBE" => "", # U+E09FE => +"\xF3\xA0\xA7\xBF" => "", # U+E09FF => +"\xF3\xA0\xA8\x80" => "", # U+E0A00 => +"\xF3\xA0\xA8\x81" => "", # U+E0A01 => +"\xF3\xA0\xA8\x82" => "", # U+E0A02 => +"\xF3\xA0\xA8\x83" => "", # U+E0A03 => +"\xF3\xA0\xA8\x84" => "", # U+E0A04 => +"\xF3\xA0\xA8\x85" => "", # U+E0A05 => +"\xF3\xA0\xA8\x86" => "", # U+E0A06 => +"\xF3\xA0\xA8\x87" => "", # U+E0A07 => +"\xF3\xA0\xA8\x88" => "", # U+E0A08 => +"\xF3\xA0\xA8\x89" => "", # U+E0A09 => +"\xF3\xA0\xA8\x8A" => "", # U+E0A0A => +"\xF3\xA0\xA8\x8B" => "", # U+E0A0B => +"\xF3\xA0\xA8\x8C" => "", # U+E0A0C => +"\xF3\xA0\xA8\x8D" => "", # U+E0A0D => +"\xF3\xA0\xA8\x8E" => "", # U+E0A0E => +"\xF3\xA0\xA8\x8F" => "", # U+E0A0F => +"\xF3\xA0\xA8\x90" => "", # U+E0A10 => +"\xF3\xA0\xA8\x91" => "", # U+E0A11 => +"\xF3\xA0\xA8\x92" => "", # U+E0A12 => +"\xF3\xA0\xA8\x93" => "", # U+E0A13 => +"\xF3\xA0\xA8\x94" => "", # U+E0A14 => +"\xF3\xA0\xA8\x95" => "", # U+E0A15 => +"\xF3\xA0\xA8\x96" => "", # U+E0A16 => +"\xF3\xA0\xA8\x97" => "", # U+E0A17 => +"\xF3\xA0\xA8\x98" => "", # U+E0A18 => +"\xF3\xA0\xA8\x99" => "", # U+E0A19 => +"\xF3\xA0\xA8\x9A" => "", # U+E0A1A => +"\xF3\xA0\xA8\x9B" => "", # U+E0A1B => +"\xF3\xA0\xA8\x9C" => "", # U+E0A1C => +"\xF3\xA0\xA8\x9D" => "", # U+E0A1D => +"\xF3\xA0\xA8\x9E" => "", # U+E0A1E => +"\xF3\xA0\xA8\x9F" => "", # U+E0A1F => +"\xF3\xA0\xA8\xA0" => "", # U+E0A20 => +"\xF3\xA0\xA8\xA1" => "", # U+E0A21 => +"\xF3\xA0\xA8\xA2" => "", # U+E0A22 => +"\xF3\xA0\xA8\xA3" => "", # U+E0A23 => +"\xF3\xA0\xA8\xA4" => "", # U+E0A24 => +"\xF3\xA0\xA8\xA5" => "", # U+E0A25 => +"\xF3\xA0\xA8\xA6" => "", # U+E0A26 => +"\xF3\xA0\xA8\xA7" => "", # U+E0A27 => +"\xF3\xA0\xA8\xA8" => "", # U+E0A28 => +"\xF3\xA0\xA8\xA9" => "", # U+E0A29 => +"\xF3\xA0\xA8\xAA" => "", # U+E0A2A => +"\xF3\xA0\xA8\xAB" => "", # U+E0A2B => +"\xF3\xA0\xA8\xAC" => "", # U+E0A2C => +"\xF3\xA0\xA8\xAD" => "", # U+E0A2D => +"\xF3\xA0\xA8\xAE" => "", # U+E0A2E => +"\xF3\xA0\xA8\xAF" => "", # U+E0A2F => +"\xF3\xA0\xA8\xB0" => "", # U+E0A30 => +"\xF3\xA0\xA8\xB1" => "", # U+E0A31 => +"\xF3\xA0\xA8\xB2" => "", # U+E0A32 => +"\xF3\xA0\xA8\xB3" => "", # U+E0A33 => +"\xF3\xA0\xA8\xB4" => "", # U+E0A34 => +"\xF3\xA0\xA8\xB5" => "", # U+E0A35 => +"\xF3\xA0\xA8\xB6" => "", # U+E0A36 => +"\xF3\xA0\xA8\xB7" => "", # U+E0A37 => +"\xF3\xA0\xA8\xB8" => "", # U+E0A38 => +"\xF3\xA0\xA8\xB9" => "", # U+E0A39 => +"\xF3\xA0\xA8\xBA" => "", # U+E0A3A => +"\xF3\xA0\xA8\xBB" => "", # U+E0A3B => +"\xF3\xA0\xA8\xBC" => "", # U+E0A3C => +"\xF3\xA0\xA8\xBD" => "", # U+E0A3D => +"\xF3\xA0\xA8\xBE" => "", # U+E0A3E => +"\xF3\xA0\xA8\xBF" => "", # U+E0A3F => +"\xF3\xA0\xA9\x80" => "", # U+E0A40 => +"\xF3\xA0\xA9\x81" => "", # U+E0A41 => +"\xF3\xA0\xA9\x82" => "", # U+E0A42 => +"\xF3\xA0\xA9\x83" => "", # U+E0A43 => +"\xF3\xA0\xA9\x84" => "", # U+E0A44 => +"\xF3\xA0\xA9\x85" => "", # U+E0A45 => +"\xF3\xA0\xA9\x86" => "", # U+E0A46 => +"\xF3\xA0\xA9\x87" => "", # U+E0A47 => +"\xF3\xA0\xA9\x88" => "", # U+E0A48 => +"\xF3\xA0\xA9\x89" => "", # U+E0A49 => +"\xF3\xA0\xA9\x8A" => "", # U+E0A4A => +"\xF3\xA0\xA9\x8B" => "", # U+E0A4B => +"\xF3\xA0\xA9\x8C" => "", # U+E0A4C => +"\xF3\xA0\xA9\x8D" => "", # U+E0A4D => +"\xF3\xA0\xA9\x8E" => "", # U+E0A4E => +"\xF3\xA0\xA9\x8F" => "", # U+E0A4F => +"\xF3\xA0\xA9\x90" => "", # U+E0A50 => +"\xF3\xA0\xA9\x91" => "", # U+E0A51 => +"\xF3\xA0\xA9\x92" => "", # U+E0A52 => +"\xF3\xA0\xA9\x93" => "", # U+E0A53 => +"\xF3\xA0\xA9\x94" => "", # U+E0A54 => +"\xF3\xA0\xA9\x95" => "", # U+E0A55 => +"\xF3\xA0\xA9\x96" => "", # U+E0A56 => +"\xF3\xA0\xA9\x97" => "", # U+E0A57 => +"\xF3\xA0\xA9\x98" => "", # U+E0A58 => +"\xF3\xA0\xA9\x99" => "", # U+E0A59 => +"\xF3\xA0\xA9\x9A" => "", # U+E0A5A => +"\xF3\xA0\xA9\x9B" => "", # U+E0A5B => +"\xF3\xA0\xA9\x9C" => "", # U+E0A5C => +"\xF3\xA0\xA9\x9D" => "", # U+E0A5D => +"\xF3\xA0\xA9\x9E" => "", # U+E0A5E => +"\xF3\xA0\xA9\x9F" => "", # U+E0A5F => +"\xF3\xA0\xA9\xA0" => "", # U+E0A60 => +"\xF3\xA0\xA9\xA1" => "", # U+E0A61 => +"\xF3\xA0\xA9\xA2" => "", # U+E0A62 => +"\xF3\xA0\xA9\xA3" => "", # U+E0A63 => +"\xF3\xA0\xA9\xA4" => "", # U+E0A64 => +"\xF3\xA0\xA9\xA5" => "", # U+E0A65 => +"\xF3\xA0\xA9\xA6" => "", # U+E0A66 => +"\xF3\xA0\xA9\xA7" => "", # U+E0A67 => +"\xF3\xA0\xA9\xA8" => "", # U+E0A68 => +"\xF3\xA0\xA9\xA9" => "", # U+E0A69 => +"\xF3\xA0\xA9\xAA" => "", # U+E0A6A => +"\xF3\xA0\xA9\xAB" => "", # U+E0A6B => +"\xF3\xA0\xA9\xAC" => "", # U+E0A6C => +"\xF3\xA0\xA9\xAD" => "", # U+E0A6D => +"\xF3\xA0\xA9\xAE" => "", # U+E0A6E => +"\xF3\xA0\xA9\xAF" => "", # U+E0A6F => +"\xF3\xA0\xA9\xB0" => "", # U+E0A70 => +"\xF3\xA0\xA9\xB1" => "", # U+E0A71 => +"\xF3\xA0\xA9\xB2" => "", # U+E0A72 => +"\xF3\xA0\xA9\xB3" => "", # U+E0A73 => +"\xF3\xA0\xA9\xB4" => "", # U+E0A74 => +"\xF3\xA0\xA9\xB5" => "", # U+E0A75 => +"\xF3\xA0\xA9\xB6" => "", # U+E0A76 => +"\xF3\xA0\xA9\xB7" => "", # U+E0A77 => +"\xF3\xA0\xA9\xB8" => "", # U+E0A78 => +"\xF3\xA0\xA9\xB9" => "", # U+E0A79 => +"\xF3\xA0\xA9\xBA" => "", # U+E0A7A => +"\xF3\xA0\xA9\xBB" => "", # U+E0A7B => +"\xF3\xA0\xA9\xBC" => "", # U+E0A7C => +"\xF3\xA0\xA9\xBD" => "", # U+E0A7D => +"\xF3\xA0\xA9\xBE" => "", # U+E0A7E => +"\xF3\xA0\xA9\xBF" => "", # U+E0A7F => +"\xF3\xA0\xAA\x80" => "", # U+E0A80 => +"\xF3\xA0\xAA\x81" => "", # U+E0A81 => +"\xF3\xA0\xAA\x82" => "", # U+E0A82 => +"\xF3\xA0\xAA\x83" => "", # U+E0A83 => +"\xF3\xA0\xAA\x84" => "", # U+E0A84 => +"\xF3\xA0\xAA\x85" => "", # U+E0A85 => +"\xF3\xA0\xAA\x86" => "", # U+E0A86 => +"\xF3\xA0\xAA\x87" => "", # U+E0A87 => +"\xF3\xA0\xAA\x88" => "", # U+E0A88 => +"\xF3\xA0\xAA\x89" => "", # U+E0A89 => +"\xF3\xA0\xAA\x8A" => "", # U+E0A8A => +"\xF3\xA0\xAA\x8B" => "", # U+E0A8B => +"\xF3\xA0\xAA\x8C" => "", # U+E0A8C => +"\xF3\xA0\xAA\x8D" => "", # U+E0A8D => +"\xF3\xA0\xAA\x8E" => "", # U+E0A8E => +"\xF3\xA0\xAA\x8F" => "", # U+E0A8F => +"\xF3\xA0\xAA\x90" => "", # U+E0A90 => +"\xF3\xA0\xAA\x91" => "", # U+E0A91 => +"\xF3\xA0\xAA\x92" => "", # U+E0A92 => +"\xF3\xA0\xAA\x93" => "", # U+E0A93 => +"\xF3\xA0\xAA\x94" => "", # U+E0A94 => +"\xF3\xA0\xAA\x95" => "", # U+E0A95 => +"\xF3\xA0\xAA\x96" => "", # U+E0A96 => +"\xF3\xA0\xAA\x97" => "", # U+E0A97 => +"\xF3\xA0\xAA\x98" => "", # U+E0A98 => +"\xF3\xA0\xAA\x99" => "", # U+E0A99 => +"\xF3\xA0\xAA\x9A" => "", # U+E0A9A => +"\xF3\xA0\xAA\x9B" => "", # U+E0A9B => +"\xF3\xA0\xAA\x9C" => "", # U+E0A9C => +"\xF3\xA0\xAA\x9D" => "", # U+E0A9D => +"\xF3\xA0\xAA\x9E" => "", # U+E0A9E => +"\xF3\xA0\xAA\x9F" => "", # U+E0A9F => +"\xF3\xA0\xAA\xA0" => "", # U+E0AA0 => +"\xF3\xA0\xAA\xA1" => "", # U+E0AA1 => +"\xF3\xA0\xAA\xA2" => "", # U+E0AA2 => +"\xF3\xA0\xAA\xA3" => "", # U+E0AA3 => +"\xF3\xA0\xAA\xA4" => "", # U+E0AA4 => +"\xF3\xA0\xAA\xA5" => "", # U+E0AA5 => +"\xF3\xA0\xAA\xA6" => "", # U+E0AA6 => +"\xF3\xA0\xAA\xA7" => "", # U+E0AA7 => +"\xF3\xA0\xAA\xA8" => "", # U+E0AA8 => +"\xF3\xA0\xAA\xA9" => "", # U+E0AA9 => +"\xF3\xA0\xAA\xAA" => "", # U+E0AAA => +"\xF3\xA0\xAA\xAB" => "", # U+E0AAB => +"\xF3\xA0\xAA\xAC" => "", # U+E0AAC => +"\xF3\xA0\xAA\xAD" => "", # U+E0AAD => +"\xF3\xA0\xAA\xAE" => "", # U+E0AAE => +"\xF3\xA0\xAA\xAF" => "", # U+E0AAF => +"\xF3\xA0\xAA\xB0" => "", # U+E0AB0 => +"\xF3\xA0\xAA\xB1" => "", # U+E0AB1 => +"\xF3\xA0\xAA\xB2" => "", # U+E0AB2 => +"\xF3\xA0\xAA\xB3" => "", # U+E0AB3 => +"\xF3\xA0\xAA\xB4" => "", # U+E0AB4 => +"\xF3\xA0\xAA\xB5" => "", # U+E0AB5 => +"\xF3\xA0\xAA\xB6" => "", # U+E0AB6 => +"\xF3\xA0\xAA\xB7" => "", # U+E0AB7 => +"\xF3\xA0\xAA\xB8" => "", # U+E0AB8 => +"\xF3\xA0\xAA\xB9" => "", # U+E0AB9 => +"\xF3\xA0\xAA\xBA" => "", # U+E0ABA => +"\xF3\xA0\xAA\xBB" => "", # U+E0ABB => +"\xF3\xA0\xAA\xBC" => "", # U+E0ABC => +"\xF3\xA0\xAA\xBD" => "", # U+E0ABD => +"\xF3\xA0\xAA\xBE" => "", # U+E0ABE => +"\xF3\xA0\xAA\xBF" => "", # U+E0ABF => +"\xF3\xA0\xAB\x80" => "", # U+E0AC0 => +"\xF3\xA0\xAB\x81" => "", # U+E0AC1 => +"\xF3\xA0\xAB\x82" => "", # U+E0AC2 => +"\xF3\xA0\xAB\x83" => "", # U+E0AC3 => +"\xF3\xA0\xAB\x84" => "", # U+E0AC4 => +"\xF3\xA0\xAB\x85" => "", # U+E0AC5 => +"\xF3\xA0\xAB\x86" => "", # U+E0AC6 => +"\xF3\xA0\xAB\x87" => "", # U+E0AC7 => +"\xF3\xA0\xAB\x88" => "", # U+E0AC8 => +"\xF3\xA0\xAB\x89" => "", # U+E0AC9 => +"\xF3\xA0\xAB\x8A" => "", # U+E0ACA => +"\xF3\xA0\xAB\x8B" => "", # U+E0ACB => +"\xF3\xA0\xAB\x8C" => "", # U+E0ACC => +"\xF3\xA0\xAB\x8D" => "", # U+E0ACD => +"\xF3\xA0\xAB\x8E" => "", # U+E0ACE => +"\xF3\xA0\xAB\x8F" => "", # U+E0ACF => +"\xF3\xA0\xAB\x90" => "", # U+E0AD0 => +"\xF3\xA0\xAB\x91" => "", # U+E0AD1 => +"\xF3\xA0\xAB\x92" => "", # U+E0AD2 => +"\xF3\xA0\xAB\x93" => "", # U+E0AD3 => +"\xF3\xA0\xAB\x94" => "", # U+E0AD4 => +"\xF3\xA0\xAB\x95" => "", # U+E0AD5 => +"\xF3\xA0\xAB\x96" => "", # U+E0AD6 => +"\xF3\xA0\xAB\x97" => "", # U+E0AD7 => +"\xF3\xA0\xAB\x98" => "", # U+E0AD8 => +"\xF3\xA0\xAB\x99" => "", # U+E0AD9 => +"\xF3\xA0\xAB\x9A" => "", # U+E0ADA => +"\xF3\xA0\xAB\x9B" => "", # U+E0ADB => +"\xF3\xA0\xAB\x9C" => "", # U+E0ADC => +"\xF3\xA0\xAB\x9D" => "", # U+E0ADD => +"\xF3\xA0\xAB\x9E" => "", # U+E0ADE => +"\xF3\xA0\xAB\x9F" => "", # U+E0ADF => +"\xF3\xA0\xAB\xA0" => "", # U+E0AE0 => +"\xF3\xA0\xAB\xA1" => "", # U+E0AE1 => +"\xF3\xA0\xAB\xA2" => "", # U+E0AE2 => +"\xF3\xA0\xAB\xA3" => "", # U+E0AE3 => +"\xF3\xA0\xAB\xA4" => "", # U+E0AE4 => +"\xF3\xA0\xAB\xA5" => "", # U+E0AE5 => +"\xF3\xA0\xAB\xA6" => "", # U+E0AE6 => +"\xF3\xA0\xAB\xA7" => "", # U+E0AE7 => +"\xF3\xA0\xAB\xA8" => "", # U+E0AE8 => +"\xF3\xA0\xAB\xA9" => "", # U+E0AE9 => +"\xF3\xA0\xAB\xAA" => "", # U+E0AEA => +"\xF3\xA0\xAB\xAB" => "", # U+E0AEB => +"\xF3\xA0\xAB\xAC" => "", # U+E0AEC => +"\xF3\xA0\xAB\xAD" => "", # U+E0AED => +"\xF3\xA0\xAB\xAE" => "", # U+E0AEE => +"\xF3\xA0\xAB\xAF" => "", # U+E0AEF => +"\xF3\xA0\xAB\xB0" => "", # U+E0AF0 => +"\xF3\xA0\xAB\xB1" => "", # U+E0AF1 => +"\xF3\xA0\xAB\xB2" => "", # U+E0AF2 => +"\xF3\xA0\xAB\xB3" => "", # U+E0AF3 => +"\xF3\xA0\xAB\xB4" => "", # U+E0AF4 => +"\xF3\xA0\xAB\xB5" => "", # U+E0AF5 => +"\xF3\xA0\xAB\xB6" => "", # U+E0AF6 => +"\xF3\xA0\xAB\xB7" => "", # U+E0AF7 => +"\xF3\xA0\xAB\xB8" => "", # U+E0AF8 => +"\xF3\xA0\xAB\xB9" => "", # U+E0AF9 => +"\xF3\xA0\xAB\xBA" => "", # U+E0AFA => +"\xF3\xA0\xAB\xBB" => "", # U+E0AFB => +"\xF3\xA0\xAB\xBC" => "", # U+E0AFC => +"\xF3\xA0\xAB\xBD" => "", # U+E0AFD => +"\xF3\xA0\xAB\xBE" => "", # U+E0AFE => +"\xF3\xA0\xAB\xBF" => "", # U+E0AFF => +"\xF3\xA0\xAC\x80" => "", # U+E0B00 => +"\xF3\xA0\xAC\x81" => "", # U+E0B01 => +"\xF3\xA0\xAC\x82" => "", # U+E0B02 => +"\xF3\xA0\xAC\x83" => "", # U+E0B03 => +"\xF3\xA0\xAC\x84" => "", # U+E0B04 => +"\xF3\xA0\xAC\x85" => "", # U+E0B05 => +"\xF3\xA0\xAC\x86" => "", # U+E0B06 => +"\xF3\xA0\xAC\x87" => "", # U+E0B07 => +"\xF3\xA0\xAC\x88" => "", # U+E0B08 => +"\xF3\xA0\xAC\x89" => "", # U+E0B09 => +"\xF3\xA0\xAC\x8A" => "", # U+E0B0A => +"\xF3\xA0\xAC\x8B" => "", # U+E0B0B => +"\xF3\xA0\xAC\x8C" => "", # U+E0B0C => +"\xF3\xA0\xAC\x8D" => "", # U+E0B0D => +"\xF3\xA0\xAC\x8E" => "", # U+E0B0E => +"\xF3\xA0\xAC\x8F" => "", # U+E0B0F => +"\xF3\xA0\xAC\x90" => "", # U+E0B10 => +"\xF3\xA0\xAC\x91" => "", # U+E0B11 => +"\xF3\xA0\xAC\x92" => "", # U+E0B12 => +"\xF3\xA0\xAC\x93" => "", # U+E0B13 => +"\xF3\xA0\xAC\x94" => "", # U+E0B14 => +"\xF3\xA0\xAC\x95" => "", # U+E0B15 => +"\xF3\xA0\xAC\x96" => "", # U+E0B16 => +"\xF3\xA0\xAC\x97" => "", # U+E0B17 => +"\xF3\xA0\xAC\x98" => "", # U+E0B18 => +"\xF3\xA0\xAC\x99" => "", # U+E0B19 => +"\xF3\xA0\xAC\x9A" => "", # U+E0B1A => +"\xF3\xA0\xAC\x9B" => "", # U+E0B1B => +"\xF3\xA0\xAC\x9C" => "", # U+E0B1C => +"\xF3\xA0\xAC\x9D" => "", # U+E0B1D => +"\xF3\xA0\xAC\x9E" => "", # U+E0B1E => +"\xF3\xA0\xAC\x9F" => "", # U+E0B1F => +"\xF3\xA0\xAC\xA0" => "", # U+E0B20 => +"\xF3\xA0\xAC\xA1" => "", # U+E0B21 => +"\xF3\xA0\xAC\xA2" => "", # U+E0B22 => +"\xF3\xA0\xAC\xA3" => "", # U+E0B23 => +"\xF3\xA0\xAC\xA4" => "", # U+E0B24 => +"\xF3\xA0\xAC\xA5" => "", # U+E0B25 => +"\xF3\xA0\xAC\xA6" => "", # U+E0B26 => +"\xF3\xA0\xAC\xA7" => "", # U+E0B27 => +"\xF3\xA0\xAC\xA8" => "", # U+E0B28 => +"\xF3\xA0\xAC\xA9" => "", # U+E0B29 => +"\xF3\xA0\xAC\xAA" => "", # U+E0B2A => +"\xF3\xA0\xAC\xAB" => "", # U+E0B2B => +"\xF3\xA0\xAC\xAC" => "", # U+E0B2C => +"\xF3\xA0\xAC\xAD" => "", # U+E0B2D => +"\xF3\xA0\xAC\xAE" => "", # U+E0B2E => +"\xF3\xA0\xAC\xAF" => "", # U+E0B2F => +"\xF3\xA0\xAC\xB0" => "", # U+E0B30 => +"\xF3\xA0\xAC\xB1" => "", # U+E0B31 => +"\xF3\xA0\xAC\xB2" => "", # U+E0B32 => +"\xF3\xA0\xAC\xB3" => "", # U+E0B33 => +"\xF3\xA0\xAC\xB4" => "", # U+E0B34 => +"\xF3\xA0\xAC\xB5" => "", # U+E0B35 => +"\xF3\xA0\xAC\xB6" => "", # U+E0B36 => +"\xF3\xA0\xAC\xB7" => "", # U+E0B37 => +"\xF3\xA0\xAC\xB8" => "", # U+E0B38 => +"\xF3\xA0\xAC\xB9" => "", # U+E0B39 => +"\xF3\xA0\xAC\xBA" => "", # U+E0B3A => +"\xF3\xA0\xAC\xBB" => "", # U+E0B3B => +"\xF3\xA0\xAC\xBC" => "", # U+E0B3C => +"\xF3\xA0\xAC\xBD" => "", # U+E0B3D => +"\xF3\xA0\xAC\xBE" => "", # U+E0B3E => +"\xF3\xA0\xAC\xBF" => "", # U+E0B3F => +"\xF3\xA0\xAD\x80" => "", # U+E0B40 => +"\xF3\xA0\xAD\x81" => "", # U+E0B41 => +"\xF3\xA0\xAD\x82" => "", # U+E0B42 => +"\xF3\xA0\xAD\x83" => "", # U+E0B43 => +"\xF3\xA0\xAD\x84" => "", # U+E0B44 => +"\xF3\xA0\xAD\x85" => "", # U+E0B45 => +"\xF3\xA0\xAD\x86" => "", # U+E0B46 => +"\xF3\xA0\xAD\x87" => "", # U+E0B47 => +"\xF3\xA0\xAD\x88" => "", # U+E0B48 => +"\xF3\xA0\xAD\x89" => "", # U+E0B49 => +"\xF3\xA0\xAD\x8A" => "", # U+E0B4A => +"\xF3\xA0\xAD\x8B" => "", # U+E0B4B => +"\xF3\xA0\xAD\x8C" => "", # U+E0B4C => +"\xF3\xA0\xAD\x8D" => "", # U+E0B4D => +"\xF3\xA0\xAD\x8E" => "", # U+E0B4E => +"\xF3\xA0\xAD\x8F" => "", # U+E0B4F => +"\xF3\xA0\xAD\x90" => "", # U+E0B50 => +"\xF3\xA0\xAD\x91" => "", # U+E0B51 => +"\xF3\xA0\xAD\x92" => "", # U+E0B52 => +"\xF3\xA0\xAD\x93" => "", # U+E0B53 => +"\xF3\xA0\xAD\x94" => "", # U+E0B54 => +"\xF3\xA0\xAD\x95" => "", # U+E0B55 => +"\xF3\xA0\xAD\x96" => "", # U+E0B56 => +"\xF3\xA0\xAD\x97" => "", # U+E0B57 => +"\xF3\xA0\xAD\x98" => "", # U+E0B58 => +"\xF3\xA0\xAD\x99" => "", # U+E0B59 => +"\xF3\xA0\xAD\x9A" => "", # U+E0B5A => +"\xF3\xA0\xAD\x9B" => "", # U+E0B5B => +"\xF3\xA0\xAD\x9C" => "", # U+E0B5C => +"\xF3\xA0\xAD\x9D" => "", # U+E0B5D => +"\xF3\xA0\xAD\x9E" => "", # U+E0B5E => +"\xF3\xA0\xAD\x9F" => "", # U+E0B5F => +"\xF3\xA0\xAD\xA0" => "", # U+E0B60 => +"\xF3\xA0\xAD\xA1" => "", # U+E0B61 => +"\xF3\xA0\xAD\xA2" => "", # U+E0B62 => +"\xF3\xA0\xAD\xA3" => "", # U+E0B63 => +"\xF3\xA0\xAD\xA4" => "", # U+E0B64 => +"\xF3\xA0\xAD\xA5" => "", # U+E0B65 => +"\xF3\xA0\xAD\xA6" => "", # U+E0B66 => +"\xF3\xA0\xAD\xA7" => "", # U+E0B67 => +"\xF3\xA0\xAD\xA8" => "", # U+E0B68 => +"\xF3\xA0\xAD\xA9" => "", # U+E0B69 => +"\xF3\xA0\xAD\xAA" => "", # U+E0B6A => +"\xF3\xA0\xAD\xAB" => "", # U+E0B6B => +"\xF3\xA0\xAD\xAC" => "", # U+E0B6C => +"\xF3\xA0\xAD\xAD" => "", # U+E0B6D => +"\xF3\xA0\xAD\xAE" => "", # U+E0B6E => +"\xF3\xA0\xAD\xAF" => "", # U+E0B6F => +"\xF3\xA0\xAD\xB0" => "", # U+E0B70 => +"\xF3\xA0\xAD\xB1" => "", # U+E0B71 => +"\xF3\xA0\xAD\xB2" => "", # U+E0B72 => +"\xF3\xA0\xAD\xB3" => "", # U+E0B73 => +"\xF3\xA0\xAD\xB4" => "", # U+E0B74 => +"\xF3\xA0\xAD\xB5" => "", # U+E0B75 => +"\xF3\xA0\xAD\xB6" => "", # U+E0B76 => +"\xF3\xA0\xAD\xB7" => "", # U+E0B77 => +"\xF3\xA0\xAD\xB8" => "", # U+E0B78 => +"\xF3\xA0\xAD\xB9" => "", # U+E0B79 => +"\xF3\xA0\xAD\xBA" => "", # U+E0B7A => +"\xF3\xA0\xAD\xBB" => "", # U+E0B7B => +"\xF3\xA0\xAD\xBC" => "", # U+E0B7C => +"\xF3\xA0\xAD\xBD" => "", # U+E0B7D => +"\xF3\xA0\xAD\xBE" => "", # U+E0B7E => +"\xF3\xA0\xAD\xBF" => "", # U+E0B7F => +"\xF3\xA0\xAE\x80" => "", # U+E0B80 => +"\xF3\xA0\xAE\x81" => "", # U+E0B81 => +"\xF3\xA0\xAE\x82" => "", # U+E0B82 => +"\xF3\xA0\xAE\x83" => "", # U+E0B83 => +"\xF3\xA0\xAE\x84" => "", # U+E0B84 => +"\xF3\xA0\xAE\x85" => "", # U+E0B85 => +"\xF3\xA0\xAE\x86" => "", # U+E0B86 => +"\xF3\xA0\xAE\x87" => "", # U+E0B87 => +"\xF3\xA0\xAE\x88" => "", # U+E0B88 => +"\xF3\xA0\xAE\x89" => "", # U+E0B89 => +"\xF3\xA0\xAE\x8A" => "", # U+E0B8A => +"\xF3\xA0\xAE\x8B" => "", # U+E0B8B => +"\xF3\xA0\xAE\x8C" => "", # U+E0B8C => +"\xF3\xA0\xAE\x8D" => "", # U+E0B8D => +"\xF3\xA0\xAE\x8E" => "", # U+E0B8E => +"\xF3\xA0\xAE\x8F" => "", # U+E0B8F => +"\xF3\xA0\xAE\x90" => "", # U+E0B90 => +"\xF3\xA0\xAE\x91" => "", # U+E0B91 => +"\xF3\xA0\xAE\x92" => "", # U+E0B92 => +"\xF3\xA0\xAE\x93" => "", # U+E0B93 => +"\xF3\xA0\xAE\x94" => "", # U+E0B94 => +"\xF3\xA0\xAE\x95" => "", # U+E0B95 => +"\xF3\xA0\xAE\x96" => "", # U+E0B96 => +"\xF3\xA0\xAE\x97" => "", # U+E0B97 => +"\xF3\xA0\xAE\x98" => "", # U+E0B98 => +"\xF3\xA0\xAE\x99" => "", # U+E0B99 => +"\xF3\xA0\xAE\x9A" => "", # U+E0B9A => +"\xF3\xA0\xAE\x9B" => "", # U+E0B9B => +"\xF3\xA0\xAE\x9C" => "", # U+E0B9C => +"\xF3\xA0\xAE\x9D" => "", # U+E0B9D => +"\xF3\xA0\xAE\x9E" => "", # U+E0B9E => +"\xF3\xA0\xAE\x9F" => "", # U+E0B9F => +"\xF3\xA0\xAE\xA0" => "", # U+E0BA0 => +"\xF3\xA0\xAE\xA1" => "", # U+E0BA1 => +"\xF3\xA0\xAE\xA2" => "", # U+E0BA2 => +"\xF3\xA0\xAE\xA3" => "", # U+E0BA3 => +"\xF3\xA0\xAE\xA4" => "", # U+E0BA4 => +"\xF3\xA0\xAE\xA5" => "", # U+E0BA5 => +"\xF3\xA0\xAE\xA6" => "", # U+E0BA6 => +"\xF3\xA0\xAE\xA7" => "", # U+E0BA7 => +"\xF3\xA0\xAE\xA8" => "", # U+E0BA8 => +"\xF3\xA0\xAE\xA9" => "", # U+E0BA9 => +"\xF3\xA0\xAE\xAA" => "", # U+E0BAA => +"\xF3\xA0\xAE\xAB" => "", # U+E0BAB => +"\xF3\xA0\xAE\xAC" => "", # U+E0BAC => +"\xF3\xA0\xAE\xAD" => "", # U+E0BAD => +"\xF3\xA0\xAE\xAE" => "", # U+E0BAE => +"\xF3\xA0\xAE\xAF" => "", # U+E0BAF => +"\xF3\xA0\xAE\xB0" => "", # U+E0BB0 => +"\xF3\xA0\xAE\xB1" => "", # U+E0BB1 => +"\xF3\xA0\xAE\xB2" => "", # U+E0BB2 => +"\xF3\xA0\xAE\xB3" => "", # U+E0BB3 => +"\xF3\xA0\xAE\xB4" => "", # U+E0BB4 => +"\xF3\xA0\xAE\xB5" => "", # U+E0BB5 => +"\xF3\xA0\xAE\xB6" => "", # U+E0BB6 => +"\xF3\xA0\xAE\xB7" => "", # U+E0BB7 => +"\xF3\xA0\xAE\xB8" => "", # U+E0BB8 => +"\xF3\xA0\xAE\xB9" => "", # U+E0BB9 => +"\xF3\xA0\xAE\xBA" => "", # U+E0BBA => +"\xF3\xA0\xAE\xBB" => "", # U+E0BBB => +"\xF3\xA0\xAE\xBC" => "", # U+E0BBC => +"\xF3\xA0\xAE\xBD" => "", # U+E0BBD => +"\xF3\xA0\xAE\xBE" => "", # U+E0BBE => +"\xF3\xA0\xAE\xBF" => "", # U+E0BBF => +"\xF3\xA0\xAF\x80" => "", # U+E0BC0 => +"\xF3\xA0\xAF\x81" => "", # U+E0BC1 => +"\xF3\xA0\xAF\x82" => "", # U+E0BC2 => +"\xF3\xA0\xAF\x83" => "", # U+E0BC3 => +"\xF3\xA0\xAF\x84" => "", # U+E0BC4 => +"\xF3\xA0\xAF\x85" => "", # U+E0BC5 => +"\xF3\xA0\xAF\x86" => "", # U+E0BC6 => +"\xF3\xA0\xAF\x87" => "", # U+E0BC7 => +"\xF3\xA0\xAF\x88" => "", # U+E0BC8 => +"\xF3\xA0\xAF\x89" => "", # U+E0BC9 => +"\xF3\xA0\xAF\x8A" => "", # U+E0BCA => +"\xF3\xA0\xAF\x8B" => "", # U+E0BCB => +"\xF3\xA0\xAF\x8C" => "", # U+E0BCC => +"\xF3\xA0\xAF\x8D" => "", # U+E0BCD => +"\xF3\xA0\xAF\x8E" => "", # U+E0BCE => +"\xF3\xA0\xAF\x8F" => "", # U+E0BCF => +"\xF3\xA0\xAF\x90" => "", # U+E0BD0 => +"\xF3\xA0\xAF\x91" => "", # U+E0BD1 => +"\xF3\xA0\xAF\x92" => "", # U+E0BD2 => +"\xF3\xA0\xAF\x93" => "", # U+E0BD3 => +"\xF3\xA0\xAF\x94" => "", # U+E0BD4 => +"\xF3\xA0\xAF\x95" => "", # U+E0BD5 => +"\xF3\xA0\xAF\x96" => "", # U+E0BD6 => +"\xF3\xA0\xAF\x97" => "", # U+E0BD7 => +"\xF3\xA0\xAF\x98" => "", # U+E0BD8 => +"\xF3\xA0\xAF\x99" => "", # U+E0BD9 => +"\xF3\xA0\xAF\x9A" => "", # U+E0BDA => +"\xF3\xA0\xAF\x9B" => "", # U+E0BDB => +"\xF3\xA0\xAF\x9C" => "", # U+E0BDC => +"\xF3\xA0\xAF\x9D" => "", # U+E0BDD => +"\xF3\xA0\xAF\x9E" => "", # U+E0BDE => +"\xF3\xA0\xAF\x9F" => "", # U+E0BDF => +"\xF3\xA0\xAF\xA0" => "", # U+E0BE0 => +"\xF3\xA0\xAF\xA1" => "", # U+E0BE1 => +"\xF3\xA0\xAF\xA2" => "", # U+E0BE2 => +"\xF3\xA0\xAF\xA3" => "", # U+E0BE3 => +"\xF3\xA0\xAF\xA4" => "", # U+E0BE4 => +"\xF3\xA0\xAF\xA5" => "", # U+E0BE5 => +"\xF3\xA0\xAF\xA6" => "", # U+E0BE6 => +"\xF3\xA0\xAF\xA7" => "", # U+E0BE7 => +"\xF3\xA0\xAF\xA8" => "", # U+E0BE8 => +"\xF3\xA0\xAF\xA9" => "", # U+E0BE9 => +"\xF3\xA0\xAF\xAA" => "", # U+E0BEA => +"\xF3\xA0\xAF\xAB" => "", # U+E0BEB => +"\xF3\xA0\xAF\xAC" => "", # U+E0BEC => +"\xF3\xA0\xAF\xAD" => "", # U+E0BED => +"\xF3\xA0\xAF\xAE" => "", # U+E0BEE => +"\xF3\xA0\xAF\xAF" => "", # U+E0BEF => +"\xF3\xA0\xAF\xB0" => "", # U+E0BF0 => +"\xF3\xA0\xAF\xB1" => "", # U+E0BF1 => +"\xF3\xA0\xAF\xB2" => "", # U+E0BF2 => +"\xF3\xA0\xAF\xB3" => "", # U+E0BF3 => +"\xF3\xA0\xAF\xB4" => "", # U+E0BF4 => +"\xF3\xA0\xAF\xB5" => "", # U+E0BF5 => +"\xF3\xA0\xAF\xB6" => "", # U+E0BF6 => +"\xF3\xA0\xAF\xB7" => "", # U+E0BF7 => +"\xF3\xA0\xAF\xB8" => "", # U+E0BF8 => +"\xF3\xA0\xAF\xB9" => "", # U+E0BF9 => +"\xF3\xA0\xAF\xBA" => "", # U+E0BFA => +"\xF3\xA0\xAF\xBB" => "", # U+E0BFB => +"\xF3\xA0\xAF\xBC" => "", # U+E0BFC => +"\xF3\xA0\xAF\xBD" => "", # U+E0BFD => +"\xF3\xA0\xAF\xBE" => "", # U+E0BFE => +"\xF3\xA0\xAF\xBF" => "", # U+E0BFF => +"\xF3\xA0\xB0\x80" => "", # U+E0C00 => +"\xF3\xA0\xB0\x81" => "", # U+E0C01 => +"\xF3\xA0\xB0\x82" => "", # U+E0C02 => +"\xF3\xA0\xB0\x83" => "", # U+E0C03 => +"\xF3\xA0\xB0\x84" => "", # U+E0C04 => +"\xF3\xA0\xB0\x85" => "", # U+E0C05 => +"\xF3\xA0\xB0\x86" => "", # U+E0C06 => +"\xF3\xA0\xB0\x87" => "", # U+E0C07 => +"\xF3\xA0\xB0\x88" => "", # U+E0C08 => +"\xF3\xA0\xB0\x89" => "", # U+E0C09 => +"\xF3\xA0\xB0\x8A" => "", # U+E0C0A => +"\xF3\xA0\xB0\x8B" => "", # U+E0C0B => +"\xF3\xA0\xB0\x8C" => "", # U+E0C0C => +"\xF3\xA0\xB0\x8D" => "", # U+E0C0D => +"\xF3\xA0\xB0\x8E" => "", # U+E0C0E => +"\xF3\xA0\xB0\x8F" => "", # U+E0C0F => +"\xF3\xA0\xB0\x90" => "", # U+E0C10 => +"\xF3\xA0\xB0\x91" => "", # U+E0C11 => +"\xF3\xA0\xB0\x92" => "", # U+E0C12 => +"\xF3\xA0\xB0\x93" => "", # U+E0C13 => +"\xF3\xA0\xB0\x94" => "", # U+E0C14 => +"\xF3\xA0\xB0\x95" => "", # U+E0C15 => +"\xF3\xA0\xB0\x96" => "", # U+E0C16 => +"\xF3\xA0\xB0\x97" => "", # U+E0C17 => +"\xF3\xA0\xB0\x98" => "", # U+E0C18 => +"\xF3\xA0\xB0\x99" => "", # U+E0C19 => +"\xF3\xA0\xB0\x9A" => "", # U+E0C1A => +"\xF3\xA0\xB0\x9B" => "", # U+E0C1B => +"\xF3\xA0\xB0\x9C" => "", # U+E0C1C => +"\xF3\xA0\xB0\x9D" => "", # U+E0C1D => +"\xF3\xA0\xB0\x9E" => "", # U+E0C1E => +"\xF3\xA0\xB0\x9F" => "", # U+E0C1F => +"\xF3\xA0\xB0\xA0" => "", # U+E0C20 => +"\xF3\xA0\xB0\xA1" => "", # U+E0C21 => +"\xF3\xA0\xB0\xA2" => "", # U+E0C22 => +"\xF3\xA0\xB0\xA3" => "", # U+E0C23 => +"\xF3\xA0\xB0\xA4" => "", # U+E0C24 => +"\xF3\xA0\xB0\xA5" => "", # U+E0C25 => +"\xF3\xA0\xB0\xA6" => "", # U+E0C26 => +"\xF3\xA0\xB0\xA7" => "", # U+E0C27 => +"\xF3\xA0\xB0\xA8" => "", # U+E0C28 => +"\xF3\xA0\xB0\xA9" => "", # U+E0C29 => +"\xF3\xA0\xB0\xAA" => "", # U+E0C2A => +"\xF3\xA0\xB0\xAB" => "", # U+E0C2B => +"\xF3\xA0\xB0\xAC" => "", # U+E0C2C => +"\xF3\xA0\xB0\xAD" => "", # U+E0C2D => +"\xF3\xA0\xB0\xAE" => "", # U+E0C2E => +"\xF3\xA0\xB0\xAF" => "", # U+E0C2F => +"\xF3\xA0\xB0\xB0" => "", # U+E0C30 => +"\xF3\xA0\xB0\xB1" => "", # U+E0C31 => +"\xF3\xA0\xB0\xB2" => "", # U+E0C32 => +"\xF3\xA0\xB0\xB3" => "", # U+E0C33 => +"\xF3\xA0\xB0\xB4" => "", # U+E0C34 => +"\xF3\xA0\xB0\xB5" => "", # U+E0C35 => +"\xF3\xA0\xB0\xB6" => "", # U+E0C36 => +"\xF3\xA0\xB0\xB7" => "", # U+E0C37 => +"\xF3\xA0\xB0\xB8" => "", # U+E0C38 => +"\xF3\xA0\xB0\xB9" => "", # U+E0C39 => +"\xF3\xA0\xB0\xBA" => "", # U+E0C3A => +"\xF3\xA0\xB0\xBB" => "", # U+E0C3B => +"\xF3\xA0\xB0\xBC" => "", # U+E0C3C => +"\xF3\xA0\xB0\xBD" => "", # U+E0C3D => +"\xF3\xA0\xB0\xBE" => "", # U+E0C3E => +"\xF3\xA0\xB0\xBF" => "", # U+E0C3F => +"\xF3\xA0\xB1\x80" => "", # U+E0C40 => +"\xF3\xA0\xB1\x81" => "", # U+E0C41 => +"\xF3\xA0\xB1\x82" => "", # U+E0C42 => +"\xF3\xA0\xB1\x83" => "", # U+E0C43 => +"\xF3\xA0\xB1\x84" => "", # U+E0C44 => +"\xF3\xA0\xB1\x85" => "", # U+E0C45 => +"\xF3\xA0\xB1\x86" => "", # U+E0C46 => +"\xF3\xA0\xB1\x87" => "", # U+E0C47 => +"\xF3\xA0\xB1\x88" => "", # U+E0C48 => +"\xF3\xA0\xB1\x89" => "", # U+E0C49 => +"\xF3\xA0\xB1\x8A" => "", # U+E0C4A => +"\xF3\xA0\xB1\x8B" => "", # U+E0C4B => +"\xF3\xA0\xB1\x8C" => "", # U+E0C4C => +"\xF3\xA0\xB1\x8D" => "", # U+E0C4D => +"\xF3\xA0\xB1\x8E" => "", # U+E0C4E => +"\xF3\xA0\xB1\x8F" => "", # U+E0C4F => +"\xF3\xA0\xB1\x90" => "", # U+E0C50 => +"\xF3\xA0\xB1\x91" => "", # U+E0C51 => +"\xF3\xA0\xB1\x92" => "", # U+E0C52 => +"\xF3\xA0\xB1\x93" => "", # U+E0C53 => +"\xF3\xA0\xB1\x94" => "", # U+E0C54 => +"\xF3\xA0\xB1\x95" => "", # U+E0C55 => +"\xF3\xA0\xB1\x96" => "", # U+E0C56 => +"\xF3\xA0\xB1\x97" => "", # U+E0C57 => +"\xF3\xA0\xB1\x98" => "", # U+E0C58 => +"\xF3\xA0\xB1\x99" => "", # U+E0C59 => +"\xF3\xA0\xB1\x9A" => "", # U+E0C5A => +"\xF3\xA0\xB1\x9B" => "", # U+E0C5B => +"\xF3\xA0\xB1\x9C" => "", # U+E0C5C => +"\xF3\xA0\xB1\x9D" => "", # U+E0C5D => +"\xF3\xA0\xB1\x9E" => "", # U+E0C5E => +"\xF3\xA0\xB1\x9F" => "", # U+E0C5F => +"\xF3\xA0\xB1\xA0" => "", # U+E0C60 => +"\xF3\xA0\xB1\xA1" => "", # U+E0C61 => +"\xF3\xA0\xB1\xA2" => "", # U+E0C62 => +"\xF3\xA0\xB1\xA3" => "", # U+E0C63 => +"\xF3\xA0\xB1\xA4" => "", # U+E0C64 => +"\xF3\xA0\xB1\xA5" => "", # U+E0C65 => +"\xF3\xA0\xB1\xA6" => "", # U+E0C66 => +"\xF3\xA0\xB1\xA7" => "", # U+E0C67 => +"\xF3\xA0\xB1\xA8" => "", # U+E0C68 => +"\xF3\xA0\xB1\xA9" => "", # U+E0C69 => +"\xF3\xA0\xB1\xAA" => "", # U+E0C6A => +"\xF3\xA0\xB1\xAB" => "", # U+E0C6B => +"\xF3\xA0\xB1\xAC" => "", # U+E0C6C => +"\xF3\xA0\xB1\xAD" => "", # U+E0C6D => +"\xF3\xA0\xB1\xAE" => "", # U+E0C6E => +"\xF3\xA0\xB1\xAF" => "", # U+E0C6F => +"\xF3\xA0\xB1\xB0" => "", # U+E0C70 => +"\xF3\xA0\xB1\xB1" => "", # U+E0C71 => +"\xF3\xA0\xB1\xB2" => "", # U+E0C72 => +"\xF3\xA0\xB1\xB3" => "", # U+E0C73 => +"\xF3\xA0\xB1\xB4" => "", # U+E0C74 => +"\xF3\xA0\xB1\xB5" => "", # U+E0C75 => +"\xF3\xA0\xB1\xB6" => "", # U+E0C76 => +"\xF3\xA0\xB1\xB7" => "", # U+E0C77 => +"\xF3\xA0\xB1\xB8" => "", # U+E0C78 => +"\xF3\xA0\xB1\xB9" => "", # U+E0C79 => +"\xF3\xA0\xB1\xBA" => "", # U+E0C7A => +"\xF3\xA0\xB1\xBB" => "", # U+E0C7B => +"\xF3\xA0\xB1\xBC" => "", # U+E0C7C => +"\xF3\xA0\xB1\xBD" => "", # U+E0C7D => +"\xF3\xA0\xB1\xBE" => "", # U+E0C7E => +"\xF3\xA0\xB1\xBF" => "", # U+E0C7F => +"\xF3\xA0\xB2\x80" => "", # U+E0C80 => +"\xF3\xA0\xB2\x81" => "", # U+E0C81 => +"\xF3\xA0\xB2\x82" => "", # U+E0C82 => +"\xF3\xA0\xB2\x83" => "", # U+E0C83 => +"\xF3\xA0\xB2\x84" => "", # U+E0C84 => +"\xF3\xA0\xB2\x85" => "", # U+E0C85 => +"\xF3\xA0\xB2\x86" => "", # U+E0C86 => +"\xF3\xA0\xB2\x87" => "", # U+E0C87 => +"\xF3\xA0\xB2\x88" => "", # U+E0C88 => +"\xF3\xA0\xB2\x89" => "", # U+E0C89 => +"\xF3\xA0\xB2\x8A" => "", # U+E0C8A => +"\xF3\xA0\xB2\x8B" => "", # U+E0C8B => +"\xF3\xA0\xB2\x8C" => "", # U+E0C8C => +"\xF3\xA0\xB2\x8D" => "", # U+E0C8D => +"\xF3\xA0\xB2\x8E" => "", # U+E0C8E => +"\xF3\xA0\xB2\x8F" => "", # U+E0C8F => +"\xF3\xA0\xB2\x90" => "", # U+E0C90 => +"\xF3\xA0\xB2\x91" => "", # U+E0C91 => +"\xF3\xA0\xB2\x92" => "", # U+E0C92 => +"\xF3\xA0\xB2\x93" => "", # U+E0C93 => +"\xF3\xA0\xB2\x94" => "", # U+E0C94 => +"\xF3\xA0\xB2\x95" => "", # U+E0C95 => +"\xF3\xA0\xB2\x96" => "", # U+E0C96 => +"\xF3\xA0\xB2\x97" => "", # U+E0C97 => +"\xF3\xA0\xB2\x98" => "", # U+E0C98 => +"\xF3\xA0\xB2\x99" => "", # U+E0C99 => +"\xF3\xA0\xB2\x9A" => "", # U+E0C9A => +"\xF3\xA0\xB2\x9B" => "", # U+E0C9B => +"\xF3\xA0\xB2\x9C" => "", # U+E0C9C => +"\xF3\xA0\xB2\x9D" => "", # U+E0C9D => +"\xF3\xA0\xB2\x9E" => "", # U+E0C9E => +"\xF3\xA0\xB2\x9F" => "", # U+E0C9F => +"\xF3\xA0\xB2\xA0" => "", # U+E0CA0 => +"\xF3\xA0\xB2\xA1" => "", # U+E0CA1 => +"\xF3\xA0\xB2\xA2" => "", # U+E0CA2 => +"\xF3\xA0\xB2\xA3" => "", # U+E0CA3 => +"\xF3\xA0\xB2\xA4" => "", # U+E0CA4 => +"\xF3\xA0\xB2\xA5" => "", # U+E0CA5 => +"\xF3\xA0\xB2\xA6" => "", # U+E0CA6 => +"\xF3\xA0\xB2\xA7" => "", # U+E0CA7 => +"\xF3\xA0\xB2\xA8" => "", # U+E0CA8 => +"\xF3\xA0\xB2\xA9" => "", # U+E0CA9 => +"\xF3\xA0\xB2\xAA" => "", # U+E0CAA => +"\xF3\xA0\xB2\xAB" => "", # U+E0CAB => +"\xF3\xA0\xB2\xAC" => "", # U+E0CAC => +"\xF3\xA0\xB2\xAD" => "", # U+E0CAD => +"\xF3\xA0\xB2\xAE" => "", # U+E0CAE => +"\xF3\xA0\xB2\xAF" => "", # U+E0CAF => +"\xF3\xA0\xB2\xB0" => "", # U+E0CB0 => +"\xF3\xA0\xB2\xB1" => "", # U+E0CB1 => +"\xF3\xA0\xB2\xB2" => "", # U+E0CB2 => +"\xF3\xA0\xB2\xB3" => "", # U+E0CB3 => +"\xF3\xA0\xB2\xB4" => "", # U+E0CB4 => +"\xF3\xA0\xB2\xB5" => "", # U+E0CB5 => +"\xF3\xA0\xB2\xB6" => "", # U+E0CB6 => +"\xF3\xA0\xB2\xB7" => "", # U+E0CB7 => +"\xF3\xA0\xB2\xB8" => "", # U+E0CB8 => +"\xF3\xA0\xB2\xB9" => "", # U+E0CB9 => +"\xF3\xA0\xB2\xBA" => "", # U+E0CBA => +"\xF3\xA0\xB2\xBB" => "", # U+E0CBB => +"\xF3\xA0\xB2\xBC" => "", # U+E0CBC => +"\xF3\xA0\xB2\xBD" => "", # U+E0CBD => +"\xF3\xA0\xB2\xBE" => "", # U+E0CBE => +"\xF3\xA0\xB2\xBF" => "", # U+E0CBF => +"\xF3\xA0\xB3\x80" => "", # U+E0CC0 => +"\xF3\xA0\xB3\x81" => "", # U+E0CC1 => +"\xF3\xA0\xB3\x82" => "", # U+E0CC2 => +"\xF3\xA0\xB3\x83" => "", # U+E0CC3 => +"\xF3\xA0\xB3\x84" => "", # U+E0CC4 => +"\xF3\xA0\xB3\x85" => "", # U+E0CC5 => +"\xF3\xA0\xB3\x86" => "", # U+E0CC6 => +"\xF3\xA0\xB3\x87" => "", # U+E0CC7 => +"\xF3\xA0\xB3\x88" => "", # U+E0CC8 => +"\xF3\xA0\xB3\x89" => "", # U+E0CC9 => +"\xF3\xA0\xB3\x8A" => "", # U+E0CCA => +"\xF3\xA0\xB3\x8B" => "", # U+E0CCB => +"\xF3\xA0\xB3\x8C" => "", # U+E0CCC => +"\xF3\xA0\xB3\x8D" => "", # U+E0CCD => +"\xF3\xA0\xB3\x8E" => "", # U+E0CCE => +"\xF3\xA0\xB3\x8F" => "", # U+E0CCF => +"\xF3\xA0\xB3\x90" => "", # U+E0CD0 => +"\xF3\xA0\xB3\x91" => "", # U+E0CD1 => +"\xF3\xA0\xB3\x92" => "", # U+E0CD2 => +"\xF3\xA0\xB3\x93" => "", # U+E0CD3 => +"\xF3\xA0\xB3\x94" => "", # U+E0CD4 => +"\xF3\xA0\xB3\x95" => "", # U+E0CD5 => +"\xF3\xA0\xB3\x96" => "", # U+E0CD6 => +"\xF3\xA0\xB3\x97" => "", # U+E0CD7 => +"\xF3\xA0\xB3\x98" => "", # U+E0CD8 => +"\xF3\xA0\xB3\x99" => "", # U+E0CD9 => +"\xF3\xA0\xB3\x9A" => "", # U+E0CDA => +"\xF3\xA0\xB3\x9B" => "", # U+E0CDB => +"\xF3\xA0\xB3\x9C" => "", # U+E0CDC => +"\xF3\xA0\xB3\x9D" => "", # U+E0CDD => +"\xF3\xA0\xB3\x9E" => "", # U+E0CDE => +"\xF3\xA0\xB3\x9F" => "", # U+E0CDF => +"\xF3\xA0\xB3\xA0" => "", # U+E0CE0 => +"\xF3\xA0\xB3\xA1" => "", # U+E0CE1 => +"\xF3\xA0\xB3\xA2" => "", # U+E0CE2 => +"\xF3\xA0\xB3\xA3" => "", # U+E0CE3 => +"\xF3\xA0\xB3\xA4" => "", # U+E0CE4 => +"\xF3\xA0\xB3\xA5" => "", # U+E0CE5 => +"\xF3\xA0\xB3\xA6" => "", # U+E0CE6 => +"\xF3\xA0\xB3\xA7" => "", # U+E0CE7 => +"\xF3\xA0\xB3\xA8" => "", # U+E0CE8 => +"\xF3\xA0\xB3\xA9" => "", # U+E0CE9 => +"\xF3\xA0\xB3\xAA" => "", # U+E0CEA => +"\xF3\xA0\xB3\xAB" => "", # U+E0CEB => +"\xF3\xA0\xB3\xAC" => "", # U+E0CEC => +"\xF3\xA0\xB3\xAD" => "", # U+E0CED => +"\xF3\xA0\xB3\xAE" => "", # U+E0CEE => +"\xF3\xA0\xB3\xAF" => "", # U+E0CEF => +"\xF3\xA0\xB3\xB0" => "", # U+E0CF0 => +"\xF3\xA0\xB3\xB1" => "", # U+E0CF1 => +"\xF3\xA0\xB3\xB2" => "", # U+E0CF2 => +"\xF3\xA0\xB3\xB3" => "", # U+E0CF3 => +"\xF3\xA0\xB3\xB4" => "", # U+E0CF4 => +"\xF3\xA0\xB3\xB5" => "", # U+E0CF5 => +"\xF3\xA0\xB3\xB6" => "", # U+E0CF6 => +"\xF3\xA0\xB3\xB7" => "", # U+E0CF7 => +"\xF3\xA0\xB3\xB8" => "", # U+E0CF8 => +"\xF3\xA0\xB3\xB9" => "", # U+E0CF9 => +"\xF3\xA0\xB3\xBA" => "", # U+E0CFA => +"\xF3\xA0\xB3\xBB" => "", # U+E0CFB => +"\xF3\xA0\xB3\xBC" => "", # U+E0CFC => +"\xF3\xA0\xB3\xBD" => "", # U+E0CFD => +"\xF3\xA0\xB3\xBE" => "", # U+E0CFE => +"\xF3\xA0\xB3\xBF" => "", # U+E0CFF => +"\xF3\xA0\xB4\x80" => "", # U+E0D00 => +"\xF3\xA0\xB4\x81" => "", # U+E0D01 => +"\xF3\xA0\xB4\x82" => "", # U+E0D02 => +"\xF3\xA0\xB4\x83" => "", # U+E0D03 => +"\xF3\xA0\xB4\x84" => "", # U+E0D04 => +"\xF3\xA0\xB4\x85" => "", # U+E0D05 => +"\xF3\xA0\xB4\x86" => "", # U+E0D06 => +"\xF3\xA0\xB4\x87" => "", # U+E0D07 => +"\xF3\xA0\xB4\x88" => "", # U+E0D08 => +"\xF3\xA0\xB4\x89" => "", # U+E0D09 => +"\xF3\xA0\xB4\x8A" => "", # U+E0D0A => +"\xF3\xA0\xB4\x8B" => "", # U+E0D0B => +"\xF3\xA0\xB4\x8C" => "", # U+E0D0C => +"\xF3\xA0\xB4\x8D" => "", # U+E0D0D => +"\xF3\xA0\xB4\x8E" => "", # U+E0D0E => +"\xF3\xA0\xB4\x8F" => "", # U+E0D0F => +"\xF3\xA0\xB4\x90" => "", # U+E0D10 => +"\xF3\xA0\xB4\x91" => "", # U+E0D11 => +"\xF3\xA0\xB4\x92" => "", # U+E0D12 => +"\xF3\xA0\xB4\x93" => "", # U+E0D13 => +"\xF3\xA0\xB4\x94" => "", # U+E0D14 => +"\xF3\xA0\xB4\x95" => "", # U+E0D15 => +"\xF3\xA0\xB4\x96" => "", # U+E0D16 => +"\xF3\xA0\xB4\x97" => "", # U+E0D17 => +"\xF3\xA0\xB4\x98" => "", # U+E0D18 => +"\xF3\xA0\xB4\x99" => "", # U+E0D19 => +"\xF3\xA0\xB4\x9A" => "", # U+E0D1A => +"\xF3\xA0\xB4\x9B" => "", # U+E0D1B => +"\xF3\xA0\xB4\x9C" => "", # U+E0D1C => +"\xF3\xA0\xB4\x9D" => "", # U+E0D1D => +"\xF3\xA0\xB4\x9E" => "", # U+E0D1E => +"\xF3\xA0\xB4\x9F" => "", # U+E0D1F => +"\xF3\xA0\xB4\xA0" => "", # U+E0D20 => +"\xF3\xA0\xB4\xA1" => "", # U+E0D21 => +"\xF3\xA0\xB4\xA2" => "", # U+E0D22 => +"\xF3\xA0\xB4\xA3" => "", # U+E0D23 => +"\xF3\xA0\xB4\xA4" => "", # U+E0D24 => +"\xF3\xA0\xB4\xA5" => "", # U+E0D25 => +"\xF3\xA0\xB4\xA6" => "", # U+E0D26 => +"\xF3\xA0\xB4\xA7" => "", # U+E0D27 => +"\xF3\xA0\xB4\xA8" => "", # U+E0D28 => +"\xF3\xA0\xB4\xA9" => "", # U+E0D29 => +"\xF3\xA0\xB4\xAA" => "", # U+E0D2A => +"\xF3\xA0\xB4\xAB" => "", # U+E0D2B => +"\xF3\xA0\xB4\xAC" => "", # U+E0D2C => +"\xF3\xA0\xB4\xAD" => "", # U+E0D2D => +"\xF3\xA0\xB4\xAE" => "", # U+E0D2E => +"\xF3\xA0\xB4\xAF" => "", # U+E0D2F => +"\xF3\xA0\xB4\xB0" => "", # U+E0D30 => +"\xF3\xA0\xB4\xB1" => "", # U+E0D31 => +"\xF3\xA0\xB4\xB2" => "", # U+E0D32 => +"\xF3\xA0\xB4\xB3" => "", # U+E0D33 => +"\xF3\xA0\xB4\xB4" => "", # U+E0D34 => +"\xF3\xA0\xB4\xB5" => "", # U+E0D35 => +"\xF3\xA0\xB4\xB6" => "", # U+E0D36 => +"\xF3\xA0\xB4\xB7" => "", # U+E0D37 => +"\xF3\xA0\xB4\xB8" => "", # U+E0D38 => +"\xF3\xA0\xB4\xB9" => "", # U+E0D39 => +"\xF3\xA0\xB4\xBA" => "", # U+E0D3A => +"\xF3\xA0\xB4\xBB" => "", # U+E0D3B => +"\xF3\xA0\xB4\xBC" => "", # U+E0D3C => +"\xF3\xA0\xB4\xBD" => "", # U+E0D3D => +"\xF3\xA0\xB4\xBE" => "", # U+E0D3E => +"\xF3\xA0\xB4\xBF" => "", # U+E0D3F => +"\xF3\xA0\xB5\x80" => "", # U+E0D40 => +"\xF3\xA0\xB5\x81" => "", # U+E0D41 => +"\xF3\xA0\xB5\x82" => "", # U+E0D42 => +"\xF3\xA0\xB5\x83" => "", # U+E0D43 => +"\xF3\xA0\xB5\x84" => "", # U+E0D44 => +"\xF3\xA0\xB5\x85" => "", # U+E0D45 => +"\xF3\xA0\xB5\x86" => "", # U+E0D46 => +"\xF3\xA0\xB5\x87" => "", # U+E0D47 => +"\xF3\xA0\xB5\x88" => "", # U+E0D48 => +"\xF3\xA0\xB5\x89" => "", # U+E0D49 => +"\xF3\xA0\xB5\x8A" => "", # U+E0D4A => +"\xF3\xA0\xB5\x8B" => "", # U+E0D4B => +"\xF3\xA0\xB5\x8C" => "", # U+E0D4C => +"\xF3\xA0\xB5\x8D" => "", # U+E0D4D => +"\xF3\xA0\xB5\x8E" => "", # U+E0D4E => +"\xF3\xA0\xB5\x8F" => "", # U+E0D4F => +"\xF3\xA0\xB5\x90" => "", # U+E0D50 => +"\xF3\xA0\xB5\x91" => "", # U+E0D51 => +"\xF3\xA0\xB5\x92" => "", # U+E0D52 => +"\xF3\xA0\xB5\x93" => "", # U+E0D53 => +"\xF3\xA0\xB5\x94" => "", # U+E0D54 => +"\xF3\xA0\xB5\x95" => "", # U+E0D55 => +"\xF3\xA0\xB5\x96" => "", # U+E0D56 => +"\xF3\xA0\xB5\x97" => "", # U+E0D57 => +"\xF3\xA0\xB5\x98" => "", # U+E0D58 => +"\xF3\xA0\xB5\x99" => "", # U+E0D59 => +"\xF3\xA0\xB5\x9A" => "", # U+E0D5A => +"\xF3\xA0\xB5\x9B" => "", # U+E0D5B => +"\xF3\xA0\xB5\x9C" => "", # U+E0D5C => +"\xF3\xA0\xB5\x9D" => "", # U+E0D5D => +"\xF3\xA0\xB5\x9E" => "", # U+E0D5E => +"\xF3\xA0\xB5\x9F" => "", # U+E0D5F => +"\xF3\xA0\xB5\xA0" => "", # U+E0D60 => +"\xF3\xA0\xB5\xA1" => "", # U+E0D61 => +"\xF3\xA0\xB5\xA2" => "", # U+E0D62 => +"\xF3\xA0\xB5\xA3" => "", # U+E0D63 => +"\xF3\xA0\xB5\xA4" => "", # U+E0D64 => +"\xF3\xA0\xB5\xA5" => "", # U+E0D65 => +"\xF3\xA0\xB5\xA6" => "", # U+E0D66 => +"\xF3\xA0\xB5\xA7" => "", # U+E0D67 => +"\xF3\xA0\xB5\xA8" => "", # U+E0D68 => +"\xF3\xA0\xB5\xA9" => "", # U+E0D69 => +"\xF3\xA0\xB5\xAA" => "", # U+E0D6A => +"\xF3\xA0\xB5\xAB" => "", # U+E0D6B => +"\xF3\xA0\xB5\xAC" => "", # U+E0D6C => +"\xF3\xA0\xB5\xAD" => "", # U+E0D6D => +"\xF3\xA0\xB5\xAE" => "", # U+E0D6E => +"\xF3\xA0\xB5\xAF" => "", # U+E0D6F => +"\xF3\xA0\xB5\xB0" => "", # U+E0D70 => +"\xF3\xA0\xB5\xB1" => "", # U+E0D71 => +"\xF3\xA0\xB5\xB2" => "", # U+E0D72 => +"\xF3\xA0\xB5\xB3" => "", # U+E0D73 => +"\xF3\xA0\xB5\xB4" => "", # U+E0D74 => +"\xF3\xA0\xB5\xB5" => "", # U+E0D75 => +"\xF3\xA0\xB5\xB6" => "", # U+E0D76 => +"\xF3\xA0\xB5\xB7" => "", # U+E0D77 => +"\xF3\xA0\xB5\xB8" => "", # U+E0D78 => +"\xF3\xA0\xB5\xB9" => "", # U+E0D79 => +"\xF3\xA0\xB5\xBA" => "", # U+E0D7A => +"\xF3\xA0\xB5\xBB" => "", # U+E0D7B => +"\xF3\xA0\xB5\xBC" => "", # U+E0D7C => +"\xF3\xA0\xB5\xBD" => "", # U+E0D7D => +"\xF3\xA0\xB5\xBE" => "", # U+E0D7E => +"\xF3\xA0\xB5\xBF" => "", # U+E0D7F => +"\xF3\xA0\xB6\x80" => "", # U+E0D80 => +"\xF3\xA0\xB6\x81" => "", # U+E0D81 => +"\xF3\xA0\xB6\x82" => "", # U+E0D82 => +"\xF3\xA0\xB6\x83" => "", # U+E0D83 => +"\xF3\xA0\xB6\x84" => "", # U+E0D84 => +"\xF3\xA0\xB6\x85" => "", # U+E0D85 => +"\xF3\xA0\xB6\x86" => "", # U+E0D86 => +"\xF3\xA0\xB6\x87" => "", # U+E0D87 => +"\xF3\xA0\xB6\x88" => "", # U+E0D88 => +"\xF3\xA0\xB6\x89" => "", # U+E0D89 => +"\xF3\xA0\xB6\x8A" => "", # U+E0D8A => +"\xF3\xA0\xB6\x8B" => "", # U+E0D8B => +"\xF3\xA0\xB6\x8C" => "", # U+E0D8C => +"\xF3\xA0\xB6\x8D" => "", # U+E0D8D => +"\xF3\xA0\xB6\x8E" => "", # U+E0D8E => +"\xF3\xA0\xB6\x8F" => "", # U+E0D8F => +"\xF3\xA0\xB6\x90" => "", # U+E0D90 => +"\xF3\xA0\xB6\x91" => "", # U+E0D91 => +"\xF3\xA0\xB6\x92" => "", # U+E0D92 => +"\xF3\xA0\xB6\x93" => "", # U+E0D93 => +"\xF3\xA0\xB6\x94" => "", # U+E0D94 => +"\xF3\xA0\xB6\x95" => "", # U+E0D95 => +"\xF3\xA0\xB6\x96" => "", # U+E0D96 => +"\xF3\xA0\xB6\x97" => "", # U+E0D97 => +"\xF3\xA0\xB6\x98" => "", # U+E0D98 => +"\xF3\xA0\xB6\x99" => "", # U+E0D99 => +"\xF3\xA0\xB6\x9A" => "", # U+E0D9A => +"\xF3\xA0\xB6\x9B" => "", # U+E0D9B => +"\xF3\xA0\xB6\x9C" => "", # U+E0D9C => +"\xF3\xA0\xB6\x9D" => "", # U+E0D9D => +"\xF3\xA0\xB6\x9E" => "", # U+E0D9E => +"\xF3\xA0\xB6\x9F" => "", # U+E0D9F => +"\xF3\xA0\xB6\xA0" => "", # U+E0DA0 => +"\xF3\xA0\xB6\xA1" => "", # U+E0DA1 => +"\xF3\xA0\xB6\xA2" => "", # U+E0DA2 => +"\xF3\xA0\xB6\xA3" => "", # U+E0DA3 => +"\xF3\xA0\xB6\xA4" => "", # U+E0DA4 => +"\xF3\xA0\xB6\xA5" => "", # U+E0DA5 => +"\xF3\xA0\xB6\xA6" => "", # U+E0DA6 => +"\xF3\xA0\xB6\xA7" => "", # U+E0DA7 => +"\xF3\xA0\xB6\xA8" => "", # U+E0DA8 => +"\xF3\xA0\xB6\xA9" => "", # U+E0DA9 => +"\xF3\xA0\xB6\xAA" => "", # U+E0DAA => +"\xF3\xA0\xB6\xAB" => "", # U+E0DAB => +"\xF3\xA0\xB6\xAC" => "", # U+E0DAC => +"\xF3\xA0\xB6\xAD" => "", # U+E0DAD => +"\xF3\xA0\xB6\xAE" => "", # U+E0DAE => +"\xF3\xA0\xB6\xAF" => "", # U+E0DAF => +"\xF3\xA0\xB6\xB0" => "", # U+E0DB0 => +"\xF3\xA0\xB6\xB1" => "", # U+E0DB1 => +"\xF3\xA0\xB6\xB2" => "", # U+E0DB2 => +"\xF3\xA0\xB6\xB3" => "", # U+E0DB3 => +"\xF3\xA0\xB6\xB4" => "", # U+E0DB4 => +"\xF3\xA0\xB6\xB5" => "", # U+E0DB5 => +"\xF3\xA0\xB6\xB6" => "", # U+E0DB6 => +"\xF3\xA0\xB6\xB7" => "", # U+E0DB7 => +"\xF3\xA0\xB6\xB8" => "", # U+E0DB8 => +"\xF3\xA0\xB6\xB9" => "", # U+E0DB9 => +"\xF3\xA0\xB6\xBA" => "", # U+E0DBA => +"\xF3\xA0\xB6\xBB" => "", # U+E0DBB => +"\xF3\xA0\xB6\xBC" => "", # U+E0DBC => +"\xF3\xA0\xB6\xBD" => "", # U+E0DBD => +"\xF3\xA0\xB6\xBE" => "", # U+E0DBE => +"\xF3\xA0\xB6\xBF" => "", # U+E0DBF => +"\xF3\xA0\xB7\x80" => "", # U+E0DC0 => +"\xF3\xA0\xB7\x81" => "", # U+E0DC1 => +"\xF3\xA0\xB7\x82" => "", # U+E0DC2 => +"\xF3\xA0\xB7\x83" => "", # U+E0DC3 => +"\xF3\xA0\xB7\x84" => "", # U+E0DC4 => +"\xF3\xA0\xB7\x85" => "", # U+E0DC5 => +"\xF3\xA0\xB7\x86" => "", # U+E0DC6 => +"\xF3\xA0\xB7\x87" => "", # U+E0DC7 => +"\xF3\xA0\xB7\x88" => "", # U+E0DC8 => +"\xF3\xA0\xB7\x89" => "", # U+E0DC9 => +"\xF3\xA0\xB7\x8A" => "", # U+E0DCA => +"\xF3\xA0\xB7\x8B" => "", # U+E0DCB => +"\xF3\xA0\xB7\x8C" => "", # U+E0DCC => +"\xF3\xA0\xB7\x8D" => "", # U+E0DCD => +"\xF3\xA0\xB7\x8E" => "", # U+E0DCE => +"\xF3\xA0\xB7\x8F" => "", # U+E0DCF => +"\xF3\xA0\xB7\x90" => "", # U+E0DD0 => +"\xF3\xA0\xB7\x91" => "", # U+E0DD1 => +"\xF3\xA0\xB7\x92" => "", # U+E0DD2 => +"\xF3\xA0\xB7\x93" => "", # U+E0DD3 => +"\xF3\xA0\xB7\x94" => "", # U+E0DD4 => +"\xF3\xA0\xB7\x95" => "", # U+E0DD5 => +"\xF3\xA0\xB7\x96" => "", # U+E0DD6 => +"\xF3\xA0\xB7\x97" => "", # U+E0DD7 => +"\xF3\xA0\xB7\x98" => "", # U+E0DD8 => +"\xF3\xA0\xB7\x99" => "", # U+E0DD9 => +"\xF3\xA0\xB7\x9A" => "", # U+E0DDA => +"\xF3\xA0\xB7\x9B" => "", # U+E0DDB => +"\xF3\xA0\xB7\x9C" => "", # U+E0DDC => +"\xF3\xA0\xB7\x9D" => "", # U+E0DDD => +"\xF3\xA0\xB7\x9E" => "", # U+E0DDE => +"\xF3\xA0\xB7\x9F" => "", # U+E0DDF => +"\xF3\xA0\xB7\xA0" => "", # U+E0DE0 => +"\xF3\xA0\xB7\xA1" => "", # U+E0DE1 => +"\xF3\xA0\xB7\xA2" => "", # U+E0DE2 => +"\xF3\xA0\xB7\xA3" => "", # U+E0DE3 => +"\xF3\xA0\xB7\xA4" => "", # U+E0DE4 => +"\xF3\xA0\xB7\xA5" => "", # U+E0DE5 => +"\xF3\xA0\xB7\xA6" => "", # U+E0DE6 => +"\xF3\xA0\xB7\xA7" => "", # U+E0DE7 => +"\xF3\xA0\xB7\xA8" => "", # U+E0DE8 => +"\xF3\xA0\xB7\xA9" => "", # U+E0DE9 => +"\xF3\xA0\xB7\xAA" => "", # U+E0DEA => +"\xF3\xA0\xB7\xAB" => "", # U+E0DEB => +"\xF3\xA0\xB7\xAC" => "", # U+E0DEC => +"\xF3\xA0\xB7\xAD" => "", # U+E0DED => +"\xF3\xA0\xB7\xAE" => "", # U+E0DEE => +"\xF3\xA0\xB7\xAF" => "", # U+E0DEF => +"\xF3\xA0\xB7\xB0" => "", # U+E0DF0 => +"\xF3\xA0\xB7\xB1" => "", # U+E0DF1 => +"\xF3\xA0\xB7\xB2" => "", # U+E0DF2 => +"\xF3\xA0\xB7\xB3" => "", # U+E0DF3 => +"\xF3\xA0\xB7\xB4" => "", # U+E0DF4 => +"\xF3\xA0\xB7\xB5" => "", # U+E0DF5 => +"\xF3\xA0\xB7\xB6" => "", # U+E0DF6 => +"\xF3\xA0\xB7\xB7" => "", # U+E0DF7 => +"\xF3\xA0\xB7\xB8" => "", # U+E0DF8 => +"\xF3\xA0\xB7\xB9" => "", # U+E0DF9 => +"\xF3\xA0\xB7\xBA" => "", # U+E0DFA => +"\xF3\xA0\xB7\xBB" => "", # U+E0DFB => +"\xF3\xA0\xB7\xBC" => "", # U+E0DFC => +"\xF3\xA0\xB7\xBD" => "", # U+E0DFD => +"\xF3\xA0\xB7\xBE" => "", # U+E0DFE => +"\xF3\xA0\xB7\xBF" => "", # U+E0DFF => +"\xF3\xA0\xB8\x80" => "", # U+E0E00 => +"\xF3\xA0\xB8\x81" => "", # U+E0E01 => +"\xF3\xA0\xB8\x82" => "", # U+E0E02 => +"\xF3\xA0\xB8\x83" => "", # U+E0E03 => +"\xF3\xA0\xB8\x84" => "", # U+E0E04 => +"\xF3\xA0\xB8\x85" => "", # U+E0E05 => +"\xF3\xA0\xB8\x86" => "", # U+E0E06 => +"\xF3\xA0\xB8\x87" => "", # U+E0E07 => +"\xF3\xA0\xB8\x88" => "", # U+E0E08 => +"\xF3\xA0\xB8\x89" => "", # U+E0E09 => +"\xF3\xA0\xB8\x8A" => "", # U+E0E0A => +"\xF3\xA0\xB8\x8B" => "", # U+E0E0B => +"\xF3\xA0\xB8\x8C" => "", # U+E0E0C => +"\xF3\xA0\xB8\x8D" => "", # U+E0E0D => +"\xF3\xA0\xB8\x8E" => "", # U+E0E0E => +"\xF3\xA0\xB8\x8F" => "", # U+E0E0F => +"\xF3\xA0\xB8\x90" => "", # U+E0E10 => +"\xF3\xA0\xB8\x91" => "", # U+E0E11 => +"\xF3\xA0\xB8\x92" => "", # U+E0E12 => +"\xF3\xA0\xB8\x93" => "", # U+E0E13 => +"\xF3\xA0\xB8\x94" => "", # U+E0E14 => +"\xF3\xA0\xB8\x95" => "", # U+E0E15 => +"\xF3\xA0\xB8\x96" => "", # U+E0E16 => +"\xF3\xA0\xB8\x97" => "", # U+E0E17 => +"\xF3\xA0\xB8\x98" => "", # U+E0E18 => +"\xF3\xA0\xB8\x99" => "", # U+E0E19 => +"\xF3\xA0\xB8\x9A" => "", # U+E0E1A => +"\xF3\xA0\xB8\x9B" => "", # U+E0E1B => +"\xF3\xA0\xB8\x9C" => "", # U+E0E1C => +"\xF3\xA0\xB8\x9D" => "", # U+E0E1D => +"\xF3\xA0\xB8\x9E" => "", # U+E0E1E => +"\xF3\xA0\xB8\x9F" => "", # U+E0E1F => +"\xF3\xA0\xB8\xA0" => "", # U+E0E20 => +"\xF3\xA0\xB8\xA1" => "", # U+E0E21 => +"\xF3\xA0\xB8\xA2" => "", # U+E0E22 => +"\xF3\xA0\xB8\xA3" => "", # U+E0E23 => +"\xF3\xA0\xB8\xA4" => "", # U+E0E24 => +"\xF3\xA0\xB8\xA5" => "", # U+E0E25 => +"\xF3\xA0\xB8\xA6" => "", # U+E0E26 => +"\xF3\xA0\xB8\xA7" => "", # U+E0E27 => +"\xF3\xA0\xB8\xA8" => "", # U+E0E28 => +"\xF3\xA0\xB8\xA9" => "", # U+E0E29 => +"\xF3\xA0\xB8\xAA" => "", # U+E0E2A => +"\xF3\xA0\xB8\xAB" => "", # U+E0E2B => +"\xF3\xA0\xB8\xAC" => "", # U+E0E2C => +"\xF3\xA0\xB8\xAD" => "", # U+E0E2D => +"\xF3\xA0\xB8\xAE" => "", # U+E0E2E => +"\xF3\xA0\xB8\xAF" => "", # U+E0E2F => +"\xF3\xA0\xB8\xB0" => "", # U+E0E30 => +"\xF3\xA0\xB8\xB1" => "", # U+E0E31 => +"\xF3\xA0\xB8\xB2" => "", # U+E0E32 => +"\xF3\xA0\xB8\xB3" => "", # U+E0E33 => +"\xF3\xA0\xB8\xB4" => "", # U+E0E34 => +"\xF3\xA0\xB8\xB5" => "", # U+E0E35 => +"\xF3\xA0\xB8\xB6" => "", # U+E0E36 => +"\xF3\xA0\xB8\xB7" => "", # U+E0E37 => +"\xF3\xA0\xB8\xB8" => "", # U+E0E38 => +"\xF3\xA0\xB8\xB9" => "", # U+E0E39 => +"\xF3\xA0\xB8\xBA" => "", # U+E0E3A => +"\xF3\xA0\xB8\xBB" => "", # U+E0E3B => +"\xF3\xA0\xB8\xBC" => "", # U+E0E3C => +"\xF3\xA0\xB8\xBD" => "", # U+E0E3D => +"\xF3\xA0\xB8\xBE" => "", # U+E0E3E => +"\xF3\xA0\xB8\xBF" => "", # U+E0E3F => +"\xF3\xA0\xB9\x80" => "", # U+E0E40 => +"\xF3\xA0\xB9\x81" => "", # U+E0E41 => +"\xF3\xA0\xB9\x82" => "", # U+E0E42 => +"\xF3\xA0\xB9\x83" => "", # U+E0E43 => +"\xF3\xA0\xB9\x84" => "", # U+E0E44 => +"\xF3\xA0\xB9\x85" => "", # U+E0E45 => +"\xF3\xA0\xB9\x86" => "", # U+E0E46 => +"\xF3\xA0\xB9\x87" => "", # U+E0E47 => +"\xF3\xA0\xB9\x88" => "", # U+E0E48 => +"\xF3\xA0\xB9\x89" => "", # U+E0E49 => +"\xF3\xA0\xB9\x8A" => "", # U+E0E4A => +"\xF3\xA0\xB9\x8B" => "", # U+E0E4B => +"\xF3\xA0\xB9\x8C" => "", # U+E0E4C => +"\xF3\xA0\xB9\x8D" => "", # U+E0E4D => +"\xF3\xA0\xB9\x8E" => "", # U+E0E4E => +"\xF3\xA0\xB9\x8F" => "", # U+E0E4F => +"\xF3\xA0\xB9\x90" => "", # U+E0E50 => +"\xF3\xA0\xB9\x91" => "", # U+E0E51 => +"\xF3\xA0\xB9\x92" => "", # U+E0E52 => +"\xF3\xA0\xB9\x93" => "", # U+E0E53 => +"\xF3\xA0\xB9\x94" => "", # U+E0E54 => +"\xF3\xA0\xB9\x95" => "", # U+E0E55 => +"\xF3\xA0\xB9\x96" => "", # U+E0E56 => +"\xF3\xA0\xB9\x97" => "", # U+E0E57 => +"\xF3\xA0\xB9\x98" => "", # U+E0E58 => +"\xF3\xA0\xB9\x99" => "", # U+E0E59 => +"\xF3\xA0\xB9\x9A" => "", # U+E0E5A => +"\xF3\xA0\xB9\x9B" => "", # U+E0E5B => +"\xF3\xA0\xB9\x9C" => "", # U+E0E5C => +"\xF3\xA0\xB9\x9D" => "", # U+E0E5D => +"\xF3\xA0\xB9\x9E" => "", # U+E0E5E => +"\xF3\xA0\xB9\x9F" => "", # U+E0E5F => +"\xF3\xA0\xB9\xA0" => "", # U+E0E60 => +"\xF3\xA0\xB9\xA1" => "", # U+E0E61 => +"\xF3\xA0\xB9\xA2" => "", # U+E0E62 => +"\xF3\xA0\xB9\xA3" => "", # U+E0E63 => +"\xF3\xA0\xB9\xA4" => "", # U+E0E64 => +"\xF3\xA0\xB9\xA5" => "", # U+E0E65 => +"\xF3\xA0\xB9\xA6" => "", # U+E0E66 => +"\xF3\xA0\xB9\xA7" => "", # U+E0E67 => +"\xF3\xA0\xB9\xA8" => "", # U+E0E68 => +"\xF3\xA0\xB9\xA9" => "", # U+E0E69 => +"\xF3\xA0\xB9\xAA" => "", # U+E0E6A => +"\xF3\xA0\xB9\xAB" => "", # U+E0E6B => +"\xF3\xA0\xB9\xAC" => "", # U+E0E6C => +"\xF3\xA0\xB9\xAD" => "", # U+E0E6D => +"\xF3\xA0\xB9\xAE" => "", # U+E0E6E => +"\xF3\xA0\xB9\xAF" => "", # U+E0E6F => +"\xF3\xA0\xB9\xB0" => "", # U+E0E70 => +"\xF3\xA0\xB9\xB1" => "", # U+E0E71 => +"\xF3\xA0\xB9\xB2" => "", # U+E0E72 => +"\xF3\xA0\xB9\xB3" => "", # U+E0E73 => +"\xF3\xA0\xB9\xB4" => "", # U+E0E74 => +"\xF3\xA0\xB9\xB5" => "", # U+E0E75 => +"\xF3\xA0\xB9\xB6" => "", # U+E0E76 => +"\xF3\xA0\xB9\xB7" => "", # U+E0E77 => +"\xF3\xA0\xB9\xB8" => "", # U+E0E78 => +"\xF3\xA0\xB9\xB9" => "", # U+E0E79 => +"\xF3\xA0\xB9\xBA" => "", # U+E0E7A => +"\xF3\xA0\xB9\xBB" => "", # U+E0E7B => +"\xF3\xA0\xB9\xBC" => "", # U+E0E7C => +"\xF3\xA0\xB9\xBD" => "", # U+E0E7D => +"\xF3\xA0\xB9\xBE" => "", # U+E0E7E => +"\xF3\xA0\xB9\xBF" => "", # U+E0E7F => +"\xF3\xA0\xBA\x80" => "", # U+E0E80 => +"\xF3\xA0\xBA\x81" => "", # U+E0E81 => +"\xF3\xA0\xBA\x82" => "", # U+E0E82 => +"\xF3\xA0\xBA\x83" => "", # U+E0E83 => +"\xF3\xA0\xBA\x84" => "", # U+E0E84 => +"\xF3\xA0\xBA\x85" => "", # U+E0E85 => +"\xF3\xA0\xBA\x86" => "", # U+E0E86 => +"\xF3\xA0\xBA\x87" => "", # U+E0E87 => +"\xF3\xA0\xBA\x88" => "", # U+E0E88 => +"\xF3\xA0\xBA\x89" => "", # U+E0E89 => +"\xF3\xA0\xBA\x8A" => "", # U+E0E8A => +"\xF3\xA0\xBA\x8B" => "", # U+E0E8B => +"\xF3\xA0\xBA\x8C" => "", # U+E0E8C => +"\xF3\xA0\xBA\x8D" => "", # U+E0E8D => +"\xF3\xA0\xBA\x8E" => "", # U+E0E8E => +"\xF3\xA0\xBA\x8F" => "", # U+E0E8F => +"\xF3\xA0\xBA\x90" => "", # U+E0E90 => +"\xF3\xA0\xBA\x91" => "", # U+E0E91 => +"\xF3\xA0\xBA\x92" => "", # U+E0E92 => +"\xF3\xA0\xBA\x93" => "", # U+E0E93 => +"\xF3\xA0\xBA\x94" => "", # U+E0E94 => +"\xF3\xA0\xBA\x95" => "", # U+E0E95 => +"\xF3\xA0\xBA\x96" => "", # U+E0E96 => +"\xF3\xA0\xBA\x97" => "", # U+E0E97 => +"\xF3\xA0\xBA\x98" => "", # U+E0E98 => +"\xF3\xA0\xBA\x99" => "", # U+E0E99 => +"\xF3\xA0\xBA\x9A" => "", # U+E0E9A => +"\xF3\xA0\xBA\x9B" => "", # U+E0E9B => +"\xF3\xA0\xBA\x9C" => "", # U+E0E9C => +"\xF3\xA0\xBA\x9D" => "", # U+E0E9D => +"\xF3\xA0\xBA\x9E" => "", # U+E0E9E => +"\xF3\xA0\xBA\x9F" => "", # U+E0E9F => +"\xF3\xA0\xBA\xA0" => "", # U+E0EA0 => +"\xF3\xA0\xBA\xA1" => "", # U+E0EA1 => +"\xF3\xA0\xBA\xA2" => "", # U+E0EA2 => +"\xF3\xA0\xBA\xA3" => "", # U+E0EA3 => +"\xF3\xA0\xBA\xA4" => "", # U+E0EA4 => +"\xF3\xA0\xBA\xA5" => "", # U+E0EA5 => +"\xF3\xA0\xBA\xA6" => "", # U+E0EA6 => +"\xF3\xA0\xBA\xA7" => "", # U+E0EA7 => +"\xF3\xA0\xBA\xA8" => "", # U+E0EA8 => +"\xF3\xA0\xBA\xA9" => "", # U+E0EA9 => +"\xF3\xA0\xBA\xAA" => "", # U+E0EAA => +"\xF3\xA0\xBA\xAB" => "", # U+E0EAB => +"\xF3\xA0\xBA\xAC" => "", # U+E0EAC => +"\xF3\xA0\xBA\xAD" => "", # U+E0EAD => +"\xF3\xA0\xBA\xAE" => "", # U+E0EAE => +"\xF3\xA0\xBA\xAF" => "", # U+E0EAF => +"\xF3\xA0\xBA\xB0" => "", # U+E0EB0 => +"\xF3\xA0\xBA\xB1" => "", # U+E0EB1 => +"\xF3\xA0\xBA\xB2" => "", # U+E0EB2 => +"\xF3\xA0\xBA\xB3" => "", # U+E0EB3 => +"\xF3\xA0\xBA\xB4" => "", # U+E0EB4 => +"\xF3\xA0\xBA\xB5" => "", # U+E0EB5 => +"\xF3\xA0\xBA\xB6" => "", # U+E0EB6 => +"\xF3\xA0\xBA\xB7" => "", # U+E0EB7 => +"\xF3\xA0\xBA\xB8" => "", # U+E0EB8 => +"\xF3\xA0\xBA\xB9" => "", # U+E0EB9 => +"\xF3\xA0\xBA\xBA" => "", # U+E0EBA => +"\xF3\xA0\xBA\xBB" => "", # U+E0EBB => +"\xF3\xA0\xBA\xBC" => "", # U+E0EBC => +"\xF3\xA0\xBA\xBD" => "", # U+E0EBD => +"\xF3\xA0\xBA\xBE" => "", # U+E0EBE => +"\xF3\xA0\xBA\xBF" => "", # U+E0EBF => +"\xF3\xA0\xBB\x80" => "", # U+E0EC0 => +"\xF3\xA0\xBB\x81" => "", # U+E0EC1 => +"\xF3\xA0\xBB\x82" => "", # U+E0EC2 => +"\xF3\xA0\xBB\x83" => "", # U+E0EC3 => +"\xF3\xA0\xBB\x84" => "", # U+E0EC4 => +"\xF3\xA0\xBB\x85" => "", # U+E0EC5 => +"\xF3\xA0\xBB\x86" => "", # U+E0EC6 => +"\xF3\xA0\xBB\x87" => "", # U+E0EC7 => +"\xF3\xA0\xBB\x88" => "", # U+E0EC8 => +"\xF3\xA0\xBB\x89" => "", # U+E0EC9 => +"\xF3\xA0\xBB\x8A" => "", # U+E0ECA => +"\xF3\xA0\xBB\x8B" => "", # U+E0ECB => +"\xF3\xA0\xBB\x8C" => "", # U+E0ECC => +"\xF3\xA0\xBB\x8D" => "", # U+E0ECD => +"\xF3\xA0\xBB\x8E" => "", # U+E0ECE => +"\xF3\xA0\xBB\x8F" => "", # U+E0ECF => +"\xF3\xA0\xBB\x90" => "", # U+E0ED0 => +"\xF3\xA0\xBB\x91" => "", # U+E0ED1 => +"\xF3\xA0\xBB\x92" => "", # U+E0ED2 => +"\xF3\xA0\xBB\x93" => "", # U+E0ED3 => +"\xF3\xA0\xBB\x94" => "", # U+E0ED4 => +"\xF3\xA0\xBB\x95" => "", # U+E0ED5 => +"\xF3\xA0\xBB\x96" => "", # U+E0ED6 => +"\xF3\xA0\xBB\x97" => "", # U+E0ED7 => +"\xF3\xA0\xBB\x98" => "", # U+E0ED8 => +"\xF3\xA0\xBB\x99" => "", # U+E0ED9 => +"\xF3\xA0\xBB\x9A" => "", # U+E0EDA => +"\xF3\xA0\xBB\x9B" => "", # U+E0EDB => +"\xF3\xA0\xBB\x9C" => "", # U+E0EDC => +"\xF3\xA0\xBB\x9D" => "", # U+E0EDD => +"\xF3\xA0\xBB\x9E" => "", # U+E0EDE => +"\xF3\xA0\xBB\x9F" => "", # U+E0EDF => +"\xF3\xA0\xBB\xA0" => "", # U+E0EE0 => +"\xF3\xA0\xBB\xA1" => "", # U+E0EE1 => +"\xF3\xA0\xBB\xA2" => "", # U+E0EE2 => +"\xF3\xA0\xBB\xA3" => "", # U+E0EE3 => +"\xF3\xA0\xBB\xA4" => "", # U+E0EE4 => +"\xF3\xA0\xBB\xA5" => "", # U+E0EE5 => +"\xF3\xA0\xBB\xA6" => "", # U+E0EE6 => +"\xF3\xA0\xBB\xA7" => "", # U+E0EE7 => +"\xF3\xA0\xBB\xA8" => "", # U+E0EE8 => +"\xF3\xA0\xBB\xA9" => "", # U+E0EE9 => +"\xF3\xA0\xBB\xAA" => "", # U+E0EEA => +"\xF3\xA0\xBB\xAB" => "", # U+E0EEB => +"\xF3\xA0\xBB\xAC" => "", # U+E0EEC => +"\xF3\xA0\xBB\xAD" => "", # U+E0EED => +"\xF3\xA0\xBB\xAE" => "", # U+E0EEE => +"\xF3\xA0\xBB\xAF" => "", # U+E0EEF => +"\xF3\xA0\xBB\xB0" => "", # U+E0EF0 => +"\xF3\xA0\xBB\xB1" => "", # U+E0EF1 => +"\xF3\xA0\xBB\xB2" => "", # U+E0EF2 => +"\xF3\xA0\xBB\xB3" => "", # U+E0EF3 => +"\xF3\xA0\xBB\xB4" => "", # U+E0EF4 => +"\xF3\xA0\xBB\xB5" => "", # U+E0EF5 => +"\xF3\xA0\xBB\xB6" => "", # U+E0EF6 => +"\xF3\xA0\xBB\xB7" => "", # U+E0EF7 => +"\xF3\xA0\xBB\xB8" => "", # U+E0EF8 => +"\xF3\xA0\xBB\xB9" => "", # U+E0EF9 => +"\xF3\xA0\xBB\xBA" => "", # U+E0EFA => +"\xF3\xA0\xBB\xBB" => "", # U+E0EFB => +"\xF3\xA0\xBB\xBC" => "", # U+E0EFC => +"\xF3\xA0\xBB\xBD" => "", # U+E0EFD => +"\xF3\xA0\xBB\xBE" => "", # U+E0EFE => +"\xF3\xA0\xBB\xBF" => "", # U+E0EFF => +"\xF3\xA0\xBC\x80" => "", # U+E0F00 => +"\xF3\xA0\xBC\x81" => "", # U+E0F01 => +"\xF3\xA0\xBC\x82" => "", # U+E0F02 => +"\xF3\xA0\xBC\x83" => "", # U+E0F03 => +"\xF3\xA0\xBC\x84" => "", # U+E0F04 => +"\xF3\xA0\xBC\x85" => "", # U+E0F05 => +"\xF3\xA0\xBC\x86" => "", # U+E0F06 => +"\xF3\xA0\xBC\x87" => "", # U+E0F07 => +"\xF3\xA0\xBC\x88" => "", # U+E0F08 => +"\xF3\xA0\xBC\x89" => "", # U+E0F09 => +"\xF3\xA0\xBC\x8A" => "", # U+E0F0A => +"\xF3\xA0\xBC\x8B" => "", # U+E0F0B => +"\xF3\xA0\xBC\x8C" => "", # U+E0F0C => +"\xF3\xA0\xBC\x8D" => "", # U+E0F0D => +"\xF3\xA0\xBC\x8E" => "", # U+E0F0E => +"\xF3\xA0\xBC\x8F" => "", # U+E0F0F => +"\xF3\xA0\xBC\x90" => "", # U+E0F10 => +"\xF3\xA0\xBC\x91" => "", # U+E0F11 => +"\xF3\xA0\xBC\x92" => "", # U+E0F12 => +"\xF3\xA0\xBC\x93" => "", # U+E0F13 => +"\xF3\xA0\xBC\x94" => "", # U+E0F14 => +"\xF3\xA0\xBC\x95" => "", # U+E0F15 => +"\xF3\xA0\xBC\x96" => "", # U+E0F16 => +"\xF3\xA0\xBC\x97" => "", # U+E0F17 => +"\xF3\xA0\xBC\x98" => "", # U+E0F18 => +"\xF3\xA0\xBC\x99" => "", # U+E0F19 => +"\xF3\xA0\xBC\x9A" => "", # U+E0F1A => +"\xF3\xA0\xBC\x9B" => "", # U+E0F1B => +"\xF3\xA0\xBC\x9C" => "", # U+E0F1C => +"\xF3\xA0\xBC\x9D" => "", # U+E0F1D => +"\xF3\xA0\xBC\x9E" => "", # U+E0F1E => +"\xF3\xA0\xBC\x9F" => "", # U+E0F1F => +"\xF3\xA0\xBC\xA0" => "", # U+E0F20 => +"\xF3\xA0\xBC\xA1" => "", # U+E0F21 => +"\xF3\xA0\xBC\xA2" => "", # U+E0F22 => +"\xF3\xA0\xBC\xA3" => "", # U+E0F23 => +"\xF3\xA0\xBC\xA4" => "", # U+E0F24 => +"\xF3\xA0\xBC\xA5" => "", # U+E0F25 => +"\xF3\xA0\xBC\xA6" => "", # U+E0F26 => +"\xF3\xA0\xBC\xA7" => "", # U+E0F27 => +"\xF3\xA0\xBC\xA8" => "", # U+E0F28 => +"\xF3\xA0\xBC\xA9" => "", # U+E0F29 => +"\xF3\xA0\xBC\xAA" => "", # U+E0F2A => +"\xF3\xA0\xBC\xAB" => "", # U+E0F2B => +"\xF3\xA0\xBC\xAC" => "", # U+E0F2C => +"\xF3\xA0\xBC\xAD" => "", # U+E0F2D => +"\xF3\xA0\xBC\xAE" => "", # U+E0F2E => +"\xF3\xA0\xBC\xAF" => "", # U+E0F2F => +"\xF3\xA0\xBC\xB0" => "", # U+E0F30 => +"\xF3\xA0\xBC\xB1" => "", # U+E0F31 => +"\xF3\xA0\xBC\xB2" => "", # U+E0F32 => +"\xF3\xA0\xBC\xB3" => "", # U+E0F33 => +"\xF3\xA0\xBC\xB4" => "", # U+E0F34 => +"\xF3\xA0\xBC\xB5" => "", # U+E0F35 => +"\xF3\xA0\xBC\xB6" => "", # U+E0F36 => +"\xF3\xA0\xBC\xB7" => "", # U+E0F37 => +"\xF3\xA0\xBC\xB8" => "", # U+E0F38 => +"\xF3\xA0\xBC\xB9" => "", # U+E0F39 => +"\xF3\xA0\xBC\xBA" => "", # U+E0F3A => +"\xF3\xA0\xBC\xBB" => "", # U+E0F3B => +"\xF3\xA0\xBC\xBC" => "", # U+E0F3C => +"\xF3\xA0\xBC\xBD" => "", # U+E0F3D => +"\xF3\xA0\xBC\xBE" => "", # U+E0F3E => +"\xF3\xA0\xBC\xBF" => "", # U+E0F3F => +"\xF3\xA0\xBD\x80" => "", # U+E0F40 => +"\xF3\xA0\xBD\x81" => "", # U+E0F41 => +"\xF3\xA0\xBD\x82" => "", # U+E0F42 => +"\xF3\xA0\xBD\x83" => "", # U+E0F43 => +"\xF3\xA0\xBD\x84" => "", # U+E0F44 => +"\xF3\xA0\xBD\x85" => "", # U+E0F45 => +"\xF3\xA0\xBD\x86" => "", # U+E0F46 => +"\xF3\xA0\xBD\x87" => "", # U+E0F47 => +"\xF3\xA0\xBD\x88" => "", # U+E0F48 => +"\xF3\xA0\xBD\x89" => "", # U+E0F49 => +"\xF3\xA0\xBD\x8A" => "", # U+E0F4A => +"\xF3\xA0\xBD\x8B" => "", # U+E0F4B => +"\xF3\xA0\xBD\x8C" => "", # U+E0F4C => +"\xF3\xA0\xBD\x8D" => "", # U+E0F4D => +"\xF3\xA0\xBD\x8E" => "", # U+E0F4E => +"\xF3\xA0\xBD\x8F" => "", # U+E0F4F => +"\xF3\xA0\xBD\x90" => "", # U+E0F50 => +"\xF3\xA0\xBD\x91" => "", # U+E0F51 => +"\xF3\xA0\xBD\x92" => "", # U+E0F52 => +"\xF3\xA0\xBD\x93" => "", # U+E0F53 => +"\xF3\xA0\xBD\x94" => "", # U+E0F54 => +"\xF3\xA0\xBD\x95" => "", # U+E0F55 => +"\xF3\xA0\xBD\x96" => "", # U+E0F56 => +"\xF3\xA0\xBD\x97" => "", # U+E0F57 => +"\xF3\xA0\xBD\x98" => "", # U+E0F58 => +"\xF3\xA0\xBD\x99" => "", # U+E0F59 => +"\xF3\xA0\xBD\x9A" => "", # U+E0F5A => +"\xF3\xA0\xBD\x9B" => "", # U+E0F5B => +"\xF3\xA0\xBD\x9C" => "", # U+E0F5C => +"\xF3\xA0\xBD\x9D" => "", # U+E0F5D => +"\xF3\xA0\xBD\x9E" => "", # U+E0F5E => +"\xF3\xA0\xBD\x9F" => "", # U+E0F5F => +"\xF3\xA0\xBD\xA0" => "", # U+E0F60 => +"\xF3\xA0\xBD\xA1" => "", # U+E0F61 => +"\xF3\xA0\xBD\xA2" => "", # U+E0F62 => +"\xF3\xA0\xBD\xA3" => "", # U+E0F63 => +"\xF3\xA0\xBD\xA4" => "", # U+E0F64 => +"\xF3\xA0\xBD\xA5" => "", # U+E0F65 => +"\xF3\xA0\xBD\xA6" => "", # U+E0F66 => +"\xF3\xA0\xBD\xA7" => "", # U+E0F67 => +"\xF3\xA0\xBD\xA8" => "", # U+E0F68 => +"\xF3\xA0\xBD\xA9" => "", # U+E0F69 => +"\xF3\xA0\xBD\xAA" => "", # U+E0F6A => +"\xF3\xA0\xBD\xAB" => "", # U+E0F6B => +"\xF3\xA0\xBD\xAC" => "", # U+E0F6C => +"\xF3\xA0\xBD\xAD" => "", # U+E0F6D => +"\xF3\xA0\xBD\xAE" => "", # U+E0F6E => +"\xF3\xA0\xBD\xAF" => "", # U+E0F6F => +"\xF3\xA0\xBD\xB0" => "", # U+E0F70 => +"\xF3\xA0\xBD\xB1" => "", # U+E0F71 => +"\xF3\xA0\xBD\xB2" => "", # U+E0F72 => +"\xF3\xA0\xBD\xB3" => "", # U+E0F73 => +"\xF3\xA0\xBD\xB4" => "", # U+E0F74 => +"\xF3\xA0\xBD\xB5" => "", # U+E0F75 => +"\xF3\xA0\xBD\xB6" => "", # U+E0F76 => +"\xF3\xA0\xBD\xB7" => "", # U+E0F77 => +"\xF3\xA0\xBD\xB8" => "", # U+E0F78 => +"\xF3\xA0\xBD\xB9" => "", # U+E0F79 => +"\xF3\xA0\xBD\xBA" => "", # U+E0F7A => +"\xF3\xA0\xBD\xBB" => "", # U+E0F7B => +"\xF3\xA0\xBD\xBC" => "", # U+E0F7C => +"\xF3\xA0\xBD\xBD" => "", # U+E0F7D => +"\xF3\xA0\xBD\xBE" => "", # U+E0F7E => +"\xF3\xA0\xBD\xBF" => "", # U+E0F7F => +"\xF3\xA0\xBE\x80" => "", # U+E0F80 => +"\xF3\xA0\xBE\x81" => "", # U+E0F81 => +"\xF3\xA0\xBE\x82" => "", # U+E0F82 => +"\xF3\xA0\xBE\x83" => "", # U+E0F83 => +"\xF3\xA0\xBE\x84" => "", # U+E0F84 => +"\xF3\xA0\xBE\x85" => "", # U+E0F85 => +"\xF3\xA0\xBE\x86" => "", # U+E0F86 => +"\xF3\xA0\xBE\x87" => "", # U+E0F87 => +"\xF3\xA0\xBE\x88" => "", # U+E0F88 => +"\xF3\xA0\xBE\x89" => "", # U+E0F89 => +"\xF3\xA0\xBE\x8A" => "", # U+E0F8A => +"\xF3\xA0\xBE\x8B" => "", # U+E0F8B => +"\xF3\xA0\xBE\x8C" => "", # U+E0F8C => +"\xF3\xA0\xBE\x8D" => "", # U+E0F8D => +"\xF3\xA0\xBE\x8E" => "", # U+E0F8E => +"\xF3\xA0\xBE\x8F" => "", # U+E0F8F => +"\xF3\xA0\xBE\x90" => "", # U+E0F90 => +"\xF3\xA0\xBE\x91" => "", # U+E0F91 => +"\xF3\xA0\xBE\x92" => "", # U+E0F92 => +"\xF3\xA0\xBE\x93" => "", # U+E0F93 => +"\xF3\xA0\xBE\x94" => "", # U+E0F94 => +"\xF3\xA0\xBE\x95" => "", # U+E0F95 => +"\xF3\xA0\xBE\x96" => "", # U+E0F96 => +"\xF3\xA0\xBE\x97" => "", # U+E0F97 => +"\xF3\xA0\xBE\x98" => "", # U+E0F98 => +"\xF3\xA0\xBE\x99" => "", # U+E0F99 => +"\xF3\xA0\xBE\x9A" => "", # U+E0F9A => +"\xF3\xA0\xBE\x9B" => "", # U+E0F9B => +"\xF3\xA0\xBE\x9C" => "", # U+E0F9C => +"\xF3\xA0\xBE\x9D" => "", # U+E0F9D => +"\xF3\xA0\xBE\x9E" => "", # U+E0F9E => +"\xF3\xA0\xBE\x9F" => "", # U+E0F9F => +"\xF3\xA0\xBE\xA0" => "", # U+E0FA0 => +"\xF3\xA0\xBE\xA1" => "", # U+E0FA1 => +"\xF3\xA0\xBE\xA2" => "", # U+E0FA2 => +"\xF3\xA0\xBE\xA3" => "", # U+E0FA3 => +"\xF3\xA0\xBE\xA4" => "", # U+E0FA4 => +"\xF3\xA0\xBE\xA5" => "", # U+E0FA5 => +"\xF3\xA0\xBE\xA6" => "", # U+E0FA6 => +"\xF3\xA0\xBE\xA7" => "", # U+E0FA7 => +"\xF3\xA0\xBE\xA8" => "", # U+E0FA8 => +"\xF3\xA0\xBE\xA9" => "", # U+E0FA9 => +"\xF3\xA0\xBE\xAA" => "", # U+E0FAA => +"\xF3\xA0\xBE\xAB" => "", # U+E0FAB => +"\xF3\xA0\xBE\xAC" => "", # U+E0FAC => +"\xF3\xA0\xBE\xAD" => "", # U+E0FAD => +"\xF3\xA0\xBE\xAE" => "", # U+E0FAE => +"\xF3\xA0\xBE\xAF" => "", # U+E0FAF => +"\xF3\xA0\xBE\xB0" => "", # U+E0FB0 => +"\xF3\xA0\xBE\xB1" => "", # U+E0FB1 => +"\xF3\xA0\xBE\xB2" => "", # U+E0FB2 => +"\xF3\xA0\xBE\xB3" => "", # U+E0FB3 => +"\xF3\xA0\xBE\xB4" => "", # U+E0FB4 => +"\xF3\xA0\xBE\xB5" => "", # U+E0FB5 => +"\xF3\xA0\xBE\xB6" => "", # U+E0FB6 => +"\xF3\xA0\xBE\xB7" => "", # U+E0FB7 => +"\xF3\xA0\xBE\xB8" => "", # U+E0FB8 => +"\xF3\xA0\xBE\xB9" => "", # U+E0FB9 => +"\xF3\xA0\xBE\xBA" => "", # U+E0FBA => +"\xF3\xA0\xBE\xBB" => "", # U+E0FBB => +"\xF3\xA0\xBE\xBC" => "", # U+E0FBC => +"\xF3\xA0\xBE\xBD" => "", # U+E0FBD => +"\xF3\xA0\xBE\xBE" => "", # U+E0FBE => +"\xF3\xA0\xBE\xBF" => "", # U+E0FBF => +"\xF3\xA0\xBF\x80" => "", # U+E0FC0 => +"\xF3\xA0\xBF\x81" => "", # U+E0FC1 => +"\xF3\xA0\xBF\x82" => "", # U+E0FC2 => +"\xF3\xA0\xBF\x83" => "", # U+E0FC3 => +"\xF3\xA0\xBF\x84" => "", # U+E0FC4 => +"\xF3\xA0\xBF\x85" => "", # U+E0FC5 => +"\xF3\xA0\xBF\x86" => "", # U+E0FC6 => +"\xF3\xA0\xBF\x87" => "", # U+E0FC7 => +"\xF3\xA0\xBF\x88" => "", # U+E0FC8 => +"\xF3\xA0\xBF\x89" => "", # U+E0FC9 => +"\xF3\xA0\xBF\x8A" => "", # U+E0FCA => +"\xF3\xA0\xBF\x8B" => "", # U+E0FCB => +"\xF3\xA0\xBF\x8C" => "", # U+E0FCC => +"\xF3\xA0\xBF\x8D" => "", # U+E0FCD => +"\xF3\xA0\xBF\x8E" => "", # U+E0FCE => +"\xF3\xA0\xBF\x8F" => "", # U+E0FCF => +"\xF3\xA0\xBF\x90" => "", # U+E0FD0 => +"\xF3\xA0\xBF\x91" => "", # U+E0FD1 => +"\xF3\xA0\xBF\x92" => "", # U+E0FD2 => +"\xF3\xA0\xBF\x93" => "", # U+E0FD3 => +"\xF3\xA0\xBF\x94" => "", # U+E0FD4 => +"\xF3\xA0\xBF\x95" => "", # U+E0FD5 => +"\xF3\xA0\xBF\x96" => "", # U+E0FD6 => +"\xF3\xA0\xBF\x97" => "", # U+E0FD7 => +"\xF3\xA0\xBF\x98" => "", # U+E0FD8 => +"\xF3\xA0\xBF\x99" => "", # U+E0FD9 => +"\xF3\xA0\xBF\x9A" => "", # U+E0FDA => +"\xF3\xA0\xBF\x9B" => "", # U+E0FDB => +"\xF3\xA0\xBF\x9C" => "", # U+E0FDC => +"\xF3\xA0\xBF\x9D" => "", # U+E0FDD => +"\xF3\xA0\xBF\x9E" => "", # U+E0FDE => +"\xF3\xA0\xBF\x9F" => "", # U+E0FDF => +"\xF3\xA0\xBF\xA0" => "", # U+E0FE0 => +"\xF3\xA0\xBF\xA1" => "", # U+E0FE1 => +"\xF3\xA0\xBF\xA2" => "", # U+E0FE2 => +"\xF3\xA0\xBF\xA3" => "", # U+E0FE3 => +"\xF3\xA0\xBF\xA4" => "", # U+E0FE4 => +"\xF3\xA0\xBF\xA5" => "", # U+E0FE5 => +"\xF3\xA0\xBF\xA6" => "", # U+E0FE6 => +"\xF3\xA0\xBF\xA7" => "", # U+E0FE7 => +"\xF3\xA0\xBF\xA8" => "", # U+E0FE8 => +"\xF3\xA0\xBF\xA9" => "", # U+E0FE9 => +"\xF3\xA0\xBF\xAA" => "", # U+E0FEA => +"\xF3\xA0\xBF\xAB" => "", # U+E0FEB => +"\xF3\xA0\xBF\xAC" => "", # U+E0FEC => +"\xF3\xA0\xBF\xAD" => "", # U+E0FED => +"\xF3\xA0\xBF\xAE" => "", # U+E0FEE => +"\xF3\xA0\xBF\xAF" => "", # U+E0FEF => +"\xF3\xA0\xBF\xB0" => "", # U+E0FF0 => +"\xF3\xA0\xBF\xB1" => "", # U+E0FF1 => +"\xF3\xA0\xBF\xB2" => "", # U+E0FF2 => +"\xF3\xA0\xBF\xB3" => "", # U+E0FF3 => +"\xF3\xA0\xBF\xB4" => "", # U+E0FF4 => +"\xF3\xA0\xBF\xB5" => "", # U+E0FF5 => +"\xF3\xA0\xBF\xB6" => "", # U+E0FF6 => +"\xF3\xA0\xBF\xB7" => "", # U+E0FF7 => +"\xF3\xA0\xBF\xB8" => "", # U+E0FF8 => +"\xF3\xA0\xBF\xB9" => "", # U+E0FF9 => +"\xF3\xA0\xBF\xBA" => "", # U+E0FFA => +"\xF3\xA0\xBF\xBB" => "", # U+E0FFB => +"\xF3\xA0\xBF\xBC" => "", # U+E0FFC => +"\xF3\xA0\xBF\xBD" => "", # U+E0FFD => +"\xF3\xA0\xBF\xBE" => "", # U+E0FFE => +"\xF3\xA0\xBF\xBF" => "", # U+E0FFF => +); + +return <<'END'; +0041 0061 +0042 0062 +0043 0063 +0044 0064 +0045 0065 +0046 0066 +0047 0067 +0048 0068 +0049 0069 +004A 006A +004B 006B +004C 006C +004D 006D +004E 006E +004F 006F +0050 0070 +0051 0071 +0052 0072 +0053 0073 +0054 0074 +0055 0075 +0056 0076 +0057 0077 +0058 0078 +0059 0079 +005A 007A +00A0 0020 +00AA 0061 +00B2 0032 +00B3 0033 +00B5 03BC +00B9 0031 +00BA 006F +00C0 00E0 +00C1 00E1 +00C2 00E2 +00C3 00E3 +00C4 00E4 +00C5 00E5 +00C6 00E6 +00C7 00E7 +00C8 00E8 +00C9 00E9 +00CA 00EA +00CB 00EB +00CC 00EC +00CD 00ED +00CE 00EE +00CF 00EF +00D0 00F0 +00D1 00F1 +00D2 00F2 +00D3 00F3 +00D4 00F4 +00D5 00F5 +00D6 00F6 +00D8 00F8 +00D9 00F9 +00DA 00FA +00DB 00FB +00DC 00FC +00DD 00FD +00DE 00FE +0100 0101 +0102 0103 +0104 0105 +0106 0107 +0108 0109 +010A 010B +010C 010D +010E 010F +0110 0111 +0112 0113 +0114 0115 +0116 0117 +0118 0119 +011A 011B +011C 011D +011E 011F +0120 0121 +0122 0123 +0124 0125 +0126 0127 +0128 0129 +012A 012B +012C 012D +012E 012F +0134 0135 +0136 0137 +0139 013A +013B 013C +013D 013E +0141 0142 +0143 0144 +0145 0146 +0147 0148 +014A 014B +014C 014D +014E 014F +0150 0151 +0152 0153 +0154 0155 +0156 0157 +0158 0159 +015A 015B +015C 015D +015E 015F +0160 0161 +0162 0163 +0164 0165 +0166 0167 +0168 0169 +016A 016B +016C 016D +016E 016F +0170 0171 +0172 0173 +0174 0175 +0176 0177 +0178 00FF +0179 017A +017B 017C +017D 017E +017F 0073 +0181 0253 +0182 0183 +0184 0185 +0186 0254 +0187 0188 +0189 0256 +018A 0257 +018B 018C +018E 01DD +018F 0259 +0190 025B +0191 0192 +0193 0260 +0194 0263 +0196 0269 +0197 0268 +0198 0199 +019C 026F +019D 0272 +019F 0275 +01A0 01A1 +01A2 01A3 +01A4 01A5 +01A6 0280 +01A7 01A8 +01A9 0283 +01AC 01AD +01AE 0288 +01AF 01B0 +01B1 028A +01B2 028B +01B3 01B4 +01B5 01B6 +01B7 0292 +01B8 01B9 +01BC 01BD +01CD 01CE +01CF 01D0 +01D1 01D2 +01D3 01D4 +01D5 01D6 +01D7 01D8 +01D9 01DA +01DB 01DC +01DE 01DF +01E0 01E1 +01E2 01E3 +01E4 01E5 +01E6 01E7 +01E8 01E9 +01EA 01EB +01EC 01ED +01EE 01EF +01F4 01F5 +01F6 0195 +01F7 01BF +01F8 01F9 +01FA 01FB +01FC 01FD +01FE 01FF +0200 0201 +0202 0203 +0204 0205 +0206 0207 +0208 0209 +020A 020B +020C 020D +020E 020F +0210 0211 +0212 0213 +0214 0215 +0216 0217 +0218 0219 +021A 021B +021C 021D +021E 021F +0220 019E +0222 0223 +0224 0225 +0226 0227 +0228 0229 +022A 022B +022C 022D +022E 022F +0230 0231 +0232 0233 +023A 2C65 +023B 023C +023D 019A +023E 2C66 +0241 0242 +0243 0180 +0244 0289 +0245 028C +0246 0247 +0248 0249 +024A 024B +024C 024D +024E 024F +02B0 0068 +02B1 0266 +02B2 006A +02B3 0072 +02B4 0279 +02B5 027B +02B6 0281 +02B7 0077 +02B8 0079 +02E0 0263 +02E1 006C +02E2 0073 +02E3 0078 +02E4 0295 +0340 0300 +0341 0301 +0343 0313 +0345 03B9 +0370 0371 +0372 0373 +0374 02B9 +0376 0377 +037E 003B +037F 03F3 +0386 03AC +0387 00B7 +0388 03AD +0389 03AE +038A 03AF +038C 03CC +038E 03CD +038F 03CE +0391 03B1 +0392 03B2 +0393 03B3 +0394 03B4 +0395 03B5 +0396 03B6 +0397 03B7 +0398 03B8 +0399 03B9 +039A 03BA +039B 03BB +039C 03BC +039D 03BD +039E 03BE +039F 03BF +03A0 03C0 +03A1 03C1 +03A3 03C3 +03A4 03C4 +03A5 03C5 +03A6 03C6 +03A7 03C7 +03A8 03C8 +03A9 03C9 +03AA 03CA +03AB 03CB +03C2 03C3 +03CF 03D7 +03D0 03B2 +03D1 03B8 +03D2 03C5 +03D3 03CD +03D4 03CB +03D5 03C6 +03D6 03C0 +03D8 03D9 +03DA 03DB +03DC 03DD +03DE 03DF +03E0 03E1 +03E2 03E3 +03E4 03E5 +03E6 03E7 +03E8 03E9 +03EA 03EB +03EC 03ED +03EE 03EF +03F0 03BA +03F1 03C1 +03F2 03C3 +03F4 03B8 +03F5 03B5 +03F7 03F8 +03F9 03C3 +03FA 03FB +03FD 037B +03FE 037C +03FF 037D +0400 0450 +0401 0451 +0402 0452 +0403 0453 +0404 0454 +0405 0455 +0406 0456 +0407 0457 +0408 0458 +0409 0459 +040A 045A +040B 045B +040C 045C +040D 045D +040E 045E +040F 045F +0410 0430 +0411 0431 +0412 0432 +0413 0433 +0414 0434 +0415 0435 +0416 0436 +0417 0437 +0418 0438 +0419 0439 +041A 043A +041B 043B +041C 043C +041D 043D +041E 043E +041F 043F +0420 0440 +0421 0441 +0422 0442 +0423 0443 +0424 0444 +0425 0445 +0426 0446 +0427 0447 +0428 0448 +0429 0449 +042A 044A +042B 044B +042C 044C +042D 044D +042E 044E +042F 044F +0460 0461 +0462 0463 +0464 0465 +0466 0467 +0468 0469 +046A 046B +046C 046D +046E 046F +0470 0471 +0472 0473 +0474 0475 +0476 0477 +0478 0479 +047A 047B +047C 047D +047E 047F +0480 0481 +048A 048B +048C 048D +048E 048F +0490 0491 +0492 0493 +0494 0495 +0496 0497 +0498 0499 +049A 049B +049C 049D +049E 049F +04A0 04A1 +04A2 04A3 +04A4 04A5 +04A6 04A7 +04A8 04A9 +04AA 04AB +04AC 04AD +04AE 04AF +04B0 04B1 +04B2 04B3 +04B4 04B5 +04B6 04B7 +04B8 04B9 +04BA 04BB +04BC 04BD +04BE 04BF +04C0 04CF +04C1 04C2 +04C3 04C4 +04C5 04C6 +04C7 04C8 +04C9 04CA +04CB 04CC +04CD 04CE +04D0 04D1 +04D2 04D3 +04D4 04D5 +04D6 04D7 +04D8 04D9 +04DA 04DB +04DC 04DD +04DE 04DF +04E0 04E1 +04E2 04E3 +04E4 04E5 +04E6 04E7 +04E8 04E9 +04EA 04EB +04EC 04ED +04EE 04EF +04F0 04F1 +04F2 04F3 +04F4 04F5 +04F6 04F7 +04F8 04F9 +04FA 04FB +04FC 04FD +04FE 04FF +0500 0501 +0502 0503 +0504 0505 +0506 0507 +0508 0509 +050A 050B +050C 050D +050E 050F +0510 0511 +0512 0513 +0514 0515 +0516 0517 +0518 0519 +051A 051B +051C 051D +051E 051F +0520 0521 +0522 0523 +0524 0525 +0526 0527 +0528 0529 +052A 052B +052C 052D +052E 052F +0531 0561 +0532 0562 +0533 0563 +0534 0564 +0535 0565 +0536 0566 +0537 0567 +0538 0568 +0539 0569 +053A 056A +053B 056B +053C 056C +053D 056D +053E 056E +053F 056F +0540 0570 +0541 0571 +0542 0572 +0543 0573 +0544 0574 +0545 0575 +0546 0576 +0547 0577 +0548 0578 +0549 0579 +054A 057A +054B 057B +054C 057C +054D 057D +054E 057E +054F 057F +0550 0580 +0551 0581 +0552 0582 +0553 0583 +0554 0584 +0555 0585 +0556 0586 +0F0C 0F0B +10A0 2D00 +10A1 2D01 +10A2 2D02 +10A3 2D03 +10A4 2D04 +10A5 2D05 +10A6 2D06 +10A7 2D07 +10A8 2D08 +10A9 2D09 +10AA 2D0A +10AB 2D0B +10AC 2D0C +10AD 2D0D +10AE 2D0E +10AF 2D0F +10B0 2D10 +10B1 2D11 +10B2 2D12 +10B3 2D13 +10B4 2D14 +10B5 2D15 +10B6 2D16 +10B7 2D17 +10B8 2D18 +10B9 2D19 +10BA 2D1A +10BB 2D1B +10BC 2D1C +10BD 2D1D +10BE 2D1E +10BF 2D1F +10C0 2D20 +10C1 2D21 +10C2 2D22 +10C3 2D23 +10C4 2D24 +10C5 2D25 +10C7 2D27 +10CD 2D2D +10FC 10DC +13F8 13F0 +13F9 13F1 +13FA 13F2 +13FB 13F3 +13FC 13F4 +13FD 13F5 +1C80 0432 +1C81 0434 +1C82 043E +1C83 0441 +1C84 0442 +1C85 0442 +1C86 044A +1C87 0463 +1C88 A64B +1D2C 0061 +1D2D 00E6 +1D2E 0062 +1D30 0064 +1D31 0065 +1D32 01DD +1D33 0067 +1D34 0068 +1D35 0069 +1D36 006A +1D37 006B +1D38 006C +1D39 006D +1D3A 006E +1D3C 006F +1D3D 0223 +1D3E 0070 +1D3F 0072 +1D40 0074 +1D41 0075 +1D42 0077 +1D43 0061 +1D44 0250 +1D45 0251 +1D46 1D02 +1D47 0062 +1D48 0064 +1D49 0065 +1D4A 0259 +1D4B 025B +1D4C 025C +1D4D 0067 +1D4F 006B +1D50 006D +1D51 014B +1D52 006F +1D53 0254 +1D54 1D16 +1D55 1D17 +1D56 0070 +1D57 0074 +1D58 0075 +1D59 1D1D +1D5A 026F +1D5B 0076 +1D5C 1D25 +1D5D 03B2 +1D5E 03B3 +1D5F 03B4 +1D60 03C6 +1D61 03C7 +1D62 0069 +1D63 0072 +1D64 0075 +1D65 0076 +1D66 03B2 +1D67 03B3 +1D68 03C1 +1D69 03C6 +1D6A 03C7 +1D78 043D +1D9B 0252 +1D9C 0063 +1D9D 0255 +1D9E 00F0 +1D9F 025C +1DA0 0066 +1DA1 025F +1DA2 0261 +1DA3 0265 +1DA4 0268 +1DA5 0269 +1DA6 026A +1DA7 1D7B +1DA8 029D +1DA9 026D +1DAA 1D85 +1DAB 029F +1DAC 0271 +1DAD 0270 +1DAE 0272 +1DAF 0273 +1DB0 0274 +1DB1 0275 +1DB2 0278 +1DB3 0282 +1DB4 0283 +1DB5 01AB +1DB6 0289 +1DB7 028A +1DB8 1D1C +1DB9 028B +1DBA 028C +1DBB 007A +1DBC 0290 +1DBD 0291 +1DBE 0292 +1DBF 03B8 +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1E9B 1E61 +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1EFA 1EFB +1EFC 1EFD +1EFE 1EFF +1F08 1F00 +1F09 1F01 +1F0A 1F02 +1F0B 1F03 +1F0C 1F04 +1F0D 1F05 +1F0E 1F06 +1F0F 1F07 +1F18 1F10 +1F19 1F11 +1F1A 1F12 +1F1B 1F13 +1F1C 1F14 +1F1D 1F15 +1F28 1F20 +1F29 1F21 +1F2A 1F22 +1F2B 1F23 +1F2C 1F24 +1F2D 1F25 +1F2E 1F26 +1F2F 1F27 +1F38 1F30 +1F39 1F31 +1F3A 1F32 +1F3B 1F33 +1F3C 1F34 +1F3D 1F35 +1F3E 1F36 +1F3F 1F37 +1F48 1F40 +1F49 1F41 +1F4A 1F42 +1F4B 1F43 +1F4C 1F44 +1F4D 1F45 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F60 +1F69 1F61 +1F6A 1F62 +1F6B 1F63 +1F6C 1F64 +1F6D 1F65 +1F6E 1F66 +1F6F 1F67 +1F71 03AC +1F73 03AD +1F75 03AE +1F77 03AF +1F79 03CC +1F7B 03CD +1F7D 03CE +1FB8 1FB0 +1FB9 1FB1 +1FBA 1F70 +1FBB 03AC +1FBE 03B9 +1FC8 1F72 +1FC9 03AD +1FCA 1F74 +1FCB 03AE +1FD3 0390 +1FD8 1FD0 +1FD9 1FD1 +1FDA 1F76 +1FDB 03AF +1FE3 03B0 +1FE8 1FE0 +1FE9 1FE1 +1FEA 1F7A +1FEB 03CD +1FEC 1FE5 +1FEF 0060 +1FF8 1F78 +1FF9 03CC +1FFA 1F7C +1FFB 03CE +2000 0020 +2001 0020 +2002 0020 +2003 0020 +2004 0020 +2005 0020 +2006 0020 +2007 0020 +2008 0020 +2009 0020 +200A 0020 +2011 2010 +2024 002E +202F 0020 +205F 0020 +2070 0030 +2071 0069 +2074 0034 +2075 0035 +2076 0036 +2077 0037 +2078 0038 +2079 0039 +207A 002B +207B 2212 +207C 003D +207D 0028 +207E 0029 +207F 006E +2080 0030 +2081 0031 +2082 0032 +2083 0033 +2084 0034 +2085 0035 +2086 0036 +2087 0037 +2088 0038 +2089 0039 +208A 002B +208B 2212 +208C 003D +208D 0028 +208E 0029 +2090 0061 +2091 0065 +2092 006F +2093 0078 +2094 0259 +2095 0068 +2096 006B +2097 006C +2098 006D +2099 006E +209A 0070 +209B 0073 +209C 0074 +2102 0063 +2107 025B +210A 0067 +210B 0068 +210C 0068 +210D 0068 +210E 0068 +210F 0127 +2110 0069 +2111 0069 +2112 006C +2113 006C +2115 006E +2119 0070 +211A 0071 +211B 0072 +211C 0072 +211D 0072 +2124 007A +2126 03C9 +2128 007A +212A 006B +212B 00E5 +212C 0062 +212D 0063 +212F 0065 +2130 0065 +2131 0066 +2132 214E +2133 006D +2134 006F +2135 05D0 +2136 05D1 +2137 05D2 +2138 05D3 +2139 0069 +213C 03C0 +213D 03B3 +213E 03B3 +213F 03C0 +2140 2211 +2145 0064 +2146 0064 +2147 0065 +2148 0069 +2149 006A +2160 0069 +2164 0076 +2169 0078 +216C 006C +216D 0063 +216E 0064 +216F 006D +2170 0069 +2174 0076 +2179 0078 +217C 006C +217D 0063 +217E 0064 +217F 006D +2183 2184 +2329 3008 +232A 3009 +2460 0031 +2461 0032 +2462 0033 +2463 0034 +2464 0035 +2465 0036 +2466 0037 +2467 0038 +2468 0039 +24B6 0061 +24B7 0062 +24B8 0063 +24B9 0064 +24BA 0065 +24BB 0066 +24BC 0067 +24BD 0068 +24BE 0069 +24BF 006A +24C0 006B +24C1 006C +24C2 006D +24C3 006E +24C4 006F +24C5 0070 +24C6 0071 +24C7 0072 +24C8 0073 +24C9 0074 +24CA 0075 +24CB 0076 +24CC 0077 +24CD 0078 +24CE 0079 +24CF 007A +24D0 0061 +24D1 0062 +24D2 0063 +24D3 0064 +24D4 0065 +24D5 0066 +24D6 0067 +24D7 0068 +24D8 0069 +24D9 006A +24DA 006B +24DB 006C +24DC 006D +24DD 006E +24DE 006F +24DF 0070 +24E0 0071 +24E1 0072 +24E2 0073 +24E3 0074 +24E4 0075 +24E5 0076 +24E6 0077 +24E7 0078 +24E8 0079 +24E9 007A +24EA 0030 +2C00 2C30 +2C01 2C31 +2C02 2C32 +2C03 2C33 +2C04 2C34 +2C05 2C35 +2C06 2C36 +2C07 2C37 +2C08 2C38 +2C09 2C39 +2C0A 2C3A +2C0B 2C3B +2C0C 2C3C +2C0D 2C3D +2C0E 2C3E +2C0F 2C3F +2C10 2C40 +2C11 2C41 +2C12 2C42 +2C13 2C43 +2C14 2C44 +2C15 2C45 +2C16 2C46 +2C17 2C47 +2C18 2C48 +2C19 2C49 +2C1A 2C4A +2C1B 2C4B +2C1C 2C4C +2C1D 2C4D +2C1E 2C4E +2C1F 2C4F +2C20 2C50 +2C21 2C51 +2C22 2C52 +2C23 2C53 +2C24 2C54 +2C25 2C55 +2C26 2C56 +2C27 2C57 +2C28 2C58 +2C29 2C59 +2C2A 2C5A +2C2B 2C5B +2C2C 2C5C +2C2D 2C5D +2C2E 2C5E +2C60 2C61 +2C62 026B +2C63 1D7D +2C64 027D +2C67 2C68 +2C69 2C6A +2C6B 2C6C +2C6D 0251 +2C6E 0271 +2C6F 0250 +2C70 0252 +2C72 2C73 +2C75 2C76 +2C7C 006A +2C7D 0076 +2C7E 023F +2C7F 0240 +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +2CEB 2CEC +2CED 2CEE +2CF2 2CF3 +2D6F 2D61 +2E9F 6BCD +2EF3 9F9F +2F00 4E00 +2F01 4E28 +2F02 4E36 +2F03 4E3F +2F04 4E59 +2F05 4E85 +2F06 4E8C +2F07 4EA0 +2F08 4EBA +2F09 513F +2F0A 5165 +2F0B 516B +2F0C 5182 +2F0D 5196 +2F0E 51AB +2F0F 51E0 +2F10 51F5 +2F11 5200 +2F12 529B +2F13 52F9 +2F14 5315 +2F15 531A +2F16 5338 +2F17 5341 +2F18 535C +2F19 5369 +2F1A 5382 +2F1B 53B6 +2F1C 53C8 +2F1D 53E3 +2F1E 56D7 +2F1F 571F +2F20 58EB +2F21 5902 +2F22 590A +2F23 5915 +2F24 5927 +2F25 5973 +2F26 5B50 +2F27 5B80 +2F28 5BF8 +2F29 5C0F +2F2A 5C22 +2F2B 5C38 +2F2C 5C6E +2F2D 5C71 +2F2E 5DDB +2F2F 5DE5 +2F30 5DF1 +2F31 5DFE +2F32 5E72 +2F33 5E7A +2F34 5E7F +2F35 5EF4 +2F36 5EFE +2F37 5F0B +2F38 5F13 +2F39 5F50 +2F3A 5F61 +2F3B 5F73 +2F3C 5FC3 +2F3D 6208 +2F3E 6236 +2F3F 624B +2F40 652F +2F41 6534 +2F42 6587 +2F43 6597 +2F44 65A4 +2F45 65B9 +2F46 65E0 +2F47 65E5 +2F48 66F0 +2F49 6708 +2F4A 6728 +2F4B 6B20 +2F4C 6B62 +2F4D 6B79 +2F4E 6BB3 +2F4F 6BCB +2F50 6BD4 +2F51 6BDB +2F52 6C0F +2F53 6C14 +2F54 6C34 +2F55 706B +2F56 722A +2F57 7236 +2F58 723B +2F59 723F +2F5A 7247 +2F5B 7259 +2F5C 725B +2F5D 72AC +2F5E 7384 +2F5F 7389 +2F60 74DC +2F61 74E6 +2F62 7518 +2F63 751F +2F64 7528 +2F65 7530 +2F66 758B +2F67 7592 +2F68 7676 +2F69 767D +2F6A 76AE +2F6B 76BF +2F6C 76EE +2F6D 77DB +2F6E 77E2 +2F6F 77F3 +2F70 793A +2F71 79B8 +2F72 79BE +2F73 7A74 +2F74 7ACB +2F75 7AF9 +2F76 7C73 +2F77 7CF8 +2F78 7F36 +2F79 7F51 +2F7A 7F8A +2F7B 7FBD +2F7C 8001 +2F7D 800C +2F7E 8012 +2F7F 8033 +2F80 807F +2F81 8089 +2F82 81E3 +2F83 81EA +2F84 81F3 +2F85 81FC +2F86 820C +2F87 821B +2F88 821F +2F89 826E +2F8A 8272 +2F8B 8278 +2F8C 864D +2F8D 866B +2F8E 8840 +2F8F 884C +2F90 8863 +2F91 897E +2F92 898B +2F93 89D2 +2F94 8A00 +2F95 8C37 +2F96 8C46 +2F97 8C55 +2F98 8C78 +2F99 8C9D +2F9A 8D64 +2F9B 8D70 +2F9C 8DB3 +2F9D 8EAB +2F9E 8ECA +2F9F 8F9B +2FA0 8FB0 +2FA1 8FB5 +2FA2 9091 +2FA3 9149 +2FA4 91C6 +2FA5 91CC +2FA6 91D1 +2FA7 9577 +2FA8 9580 +2FA9 961C +2FAA 96B6 +2FAB 96B9 +2FAC 96E8 +2FAD 9751 +2FAE 975E +2FAF 9762 +2FB0 9769 +2FB1 97CB +2FB2 97ED +2FB3 97F3 +2FB4 9801 +2FB5 98A8 +2FB6 98DB +2FB7 98DF +2FB8 9996 +2FB9 9999 +2FBA 99AC +2FBB 9AA8 +2FBC 9AD8 +2FBD 9ADF +2FBE 9B25 +2FBF 9B2F +2FC0 9B32 +2FC1 9B3C +2FC2 9B5A +2FC3 9CE5 +2FC4 9E75 +2FC5 9E7F +2FC6 9EA5 +2FC7 9EBB +2FC8 9EC3 +2FC9 9ECD +2FCA 9ED1 +2FCB 9EF9 +2FCC 9EFD +2FCD 9F0E +2FCE 9F13 +2FCF 9F20 +2FD0 9F3B +2FD1 9F4A +2FD2 9F52 +2FD3 9F8D +2FD4 9F9C +2FD5 9FA0 +3000 0020 +3036 3012 +3038 5341 +3039 5344 +303A 5345 +3131 1100 +3132 1101 +3133 11AA +3134 1102 +3135 11AC +3136 11AD +3137 1103 +3138 1104 +3139 1105 +313A 11B0 +313B 11B1 +313C 11B2 +313D 11B3 +313E 11B4 +313F 11B5 +3140 111A +3141 1106 +3142 1107 +3143 1108 +3144 1121 +3145 1109 +3146 110A +3147 110B +3148 110C +3149 110D +314A 110E +314B 110F +314C 1110 +314D 1111 +314E 1112 +314F 1161 +3150 1162 +3151 1163 +3152 1164 +3153 1165 +3154 1166 +3155 1167 +3156 1168 +3157 1169 +3158 116A +3159 116B +315A 116C +315B 116D +315C 116E +315D 116F +315E 1170 +315F 1171 +3160 1172 +3161 1173 +3162 1174 +3163 1175 +3165 1114 +3166 1115 +3167 11C7 +3168 11C8 +3169 11CC +316A 11CE +316B 11D3 +316C 11D7 +316D 11D9 +316E 111C +316F 11DD +3170 11DF +3171 111D +3172 111E +3173 1120 +3174 1122 +3175 1123 +3176 1127 +3177 1129 +3178 112B +3179 112C +317A 112D +317B 112E +317C 112F +317D 1132 +317E 1136 +317F 1140 +3180 1147 +3181 114C +3182 11F1 +3183 11F2 +3184 1157 +3185 1158 +3186 1159 +3187 1184 +3188 1185 +3189 1188 +318A 1191 +318B 1192 +318C 1194 +318D 119E +318E 11A1 +3192 4E00 +3193 4E8C +3194 4E09 +3195 56DB +3196 4E0A +3197 4E2D +3198 4E0B +3199 7532 +319A 4E59 +319B 4E19 +319C 4E01 +319D 5929 +319E 5730 +319F 4EBA +3244 554F +3245 5E7C +3246 6587 +3247 7B8F +3260 1100 +3261 1102 +3262 1103 +3263 1105 +3264 1106 +3265 1107 +3266 1109 +3267 110B +3268 110C +3269 110E +326A 110F +326B 1110 +326C 1111 +326D 1112 +326E AC00 +326F B098 +3270 B2E4 +3271 B77C +3272 B9C8 +3273 BC14 +3274 C0AC +3275 C544 +3276 C790 +3277 CC28 +3278 CE74 +3279 D0C0 +327A D30C +327B D558 +327E C6B0 +3280 4E00 +3281 4E8C +3282 4E09 +3283 56DB +3284 4E94 +3285 516D +3286 4E03 +3287 516B +3288 4E5D +3289 5341 +328A 6708 +328B 706B +328C 6C34 +328D 6728 +328E 91D1 +328F 571F +3290 65E5 +3291 682A +3292 6709 +3293 793E +3294 540D +3295 7279 +3296 8CA1 +3297 795D +3298 52B4 +3299 79D8 +329A 7537 +329B 5973 +329C 9069 +329D 512A +329E 5370 +329F 6CE8 +32A0 9805 +32A1 4F11 +32A2 5199 +32A3 6B63 +32A4 4E0A +32A5 4E2D +32A6 4E0B +32A7 5DE6 +32A8 53F3 +32A9 533B +32AA 5B97 +32AB 5B66 +32AC 76E3 +32AD 4F01 +32AE 8CC7 +32AF 5354 +32B0 591C +32D0 30A2 +32D1 30A4 +32D2 30A6 +32D3 30A8 +32D4 30AA +32D5 30AB +32D6 30AD +32D7 30AF +32D8 30B1 +32D9 30B3 +32DA 30B5 +32DB 30B7 +32DC 30B9 +32DD 30BB +32DE 30BD +32DF 30BF +32E0 30C1 +32E1 30C4 +32E2 30C6 +32E3 30C8 +32E4 30CA +32E5 30CB +32E6 30CC +32E7 30CD +32E8 30CE +32E9 30CF +32EA 30D2 +32EB 30D5 +32EC 30D8 +32ED 30DB +32EE 30DE +32EF 30DF +32F0 30E0 +32F1 30E1 +32F2 30E2 +32F3 30E4 +32F4 30E6 +32F5 30E8 +32F6 30E9 +32F7 30EA +32F8 30EB +32F9 30EC +32FA 30ED +32FB 30EF +32FC 30F0 +32FD 30F1 +32FE 30F2 +A640 A641 +A642 A643 +A644 A645 +A646 A647 +A648 A649 +A64A A64B +A64C A64D +A64E A64F +A650 A651 +A652 A653 +A654 A655 +A656 A657 +A658 A659 +A65A A65B +A65C A65D +A65E A65F +A660 A661 +A662 A663 +A664 A665 +A666 A667 +A668 A669 +A66A A66B +A66C A66D +A680 A681 +A682 A683 +A684 A685 +A686 A687 +A688 A689 +A68A A68B +A68C A68D +A68E A68F +A690 A691 +A692 A693 +A694 A695 +A696 A697 +A698 A699 +A69A A69B +A69C 044A +A69D 044C +A722 A723 +A724 A725 +A726 A727 +A728 A729 +A72A A72B +A72C A72D +A72E A72F +A732 A733 +A734 A735 +A736 A737 +A738 A739 +A73A A73B +A73C A73D +A73E A73F +A740 A741 +A742 A743 +A744 A745 +A746 A747 +A748 A749 +A74A A74B +A74C A74D +A74E A74F +A750 A751 +A752 A753 +A754 A755 +A756 A757 +A758 A759 +A75A A75B +A75C A75D +A75E A75F +A760 A761 +A762 A763 +A764 A765 +A766 A767 +A768 A769 +A76A A76B +A76C A76D +A76E A76F +A770 A76F +A779 A77A +A77B A77C +A77D 1D79 +A77E A77F +A780 A781 +A782 A783 +A784 A785 +A786 A787 +A78B A78C +A78D 0265 +A790 A791 +A792 A793 +A796 A797 +A798 A799 +A79A A79B +A79C A79D +A79E A79F +A7A0 A7A1 +A7A2 A7A3 +A7A4 A7A5 +A7A6 A7A7 +A7A8 A7A9 +A7AA 0266 +A7AB 025C +A7AC 0261 +A7AD 026C +A7AE 026A +A7B0 029E +A7B1 0287 +A7B2 029D +A7B3 AB53 +A7B4 A7B5 +A7B6 A7B7 +A7F8 0127 +A7F9 0153 +AB5C A727 +AB5D AB37 +AB5E 026B +AB5F AB52 +AB70 13A0 +AB71 13A1 +AB72 13A2 +AB73 13A3 +AB74 13A4 +AB75 13A5 +AB76 13A6 +AB77 13A7 +AB78 13A8 +AB79 13A9 +AB7A 13AA +AB7B 13AB +AB7C 13AC +AB7D 13AD +AB7E 13AE +AB7F 13AF +AB80 13B0 +AB81 13B1 +AB82 13B2 +AB83 13B3 +AB84 13B4 +AB85 13B5 +AB86 13B6 +AB87 13B7 +AB88 13B8 +AB89 13B9 +AB8A 13BA +AB8B 13BB +AB8C 13BC +AB8D 13BD +AB8E 13BE +AB8F 13BF +AB90 13C0 +AB91 13C1 +AB92 13C2 +AB93 13C3 +AB94 13C4 +AB95 13C5 +AB96 13C6 +AB97 13C7 +AB98 13C8 +AB99 13C9 +AB9A 13CA +AB9B 13CB +AB9C 13CC +AB9D 13CD +AB9E 13CE +AB9F 13CF +ABA0 13D0 +ABA1 13D1 +ABA2 13D2 +ABA3 13D3 +ABA4 13D4 +ABA5 13D5 +ABA6 13D6 +ABA7 13D7 +ABA8 13D8 +ABA9 13D9 +ABAA 13DA +ABAB 13DB +ABAC 13DC +ABAD 13DD +ABAE 13DE +ABAF 13DF +ABB0 13E0 +ABB1 13E1 +ABB2 13E2 +ABB3 13E3 +ABB4 13E4 +ABB5 13E5 +ABB6 13E6 +ABB7 13E7 +ABB8 13E8 +ABB9 13E9 +ABBA 13EA +ABBB 13EB +ABBC 13EC +ABBD 13ED +ABBE 13EE +ABBF 13EF +F900 8C48 +F901 66F4 +F902 8ECA +F903 8CC8 +F904 6ED1 +F905 4E32 +F906 53E5 +F907 9F9C +F908 9F9C +F909 5951 +F90A 91D1 +F90B 5587 +F90C 5948 +F90D 61F6 +F90E 7669 +F90F 7F85 +F910 863F +F911 87BA +F912 88F8 +F913 908F +F914 6A02 +F915 6D1B +F916 70D9 +F917 73DE +F918 843D +F919 916A +F91A 99F1 +F91B 4E82 +F91C 5375 +F91D 6B04 +F91E 721B +F91F 862D +F920 9E1E +F921 5D50 +F922 6FEB +F923 85CD +F924 8964 +F925 62C9 +F926 81D8 +F927 881F +F928 5ECA +F929 6717 +F92A 6D6A +F92B 72FC +F92C 90CE +F92D 4F86 +F92E 51B7 +F92F 52DE +F930 64C4 +F931 6AD3 +F932 7210 +F933 76E7 +F934 8001 +F935 8606 +F936 865C +F937 8DEF +F938 9732 +F939 9B6F +F93A 9DFA +F93B 788C +F93C 797F +F93D 7DA0 +F93E 83C9 +F93F 9304 +F940 9E7F +F941 8AD6 +F942 58DF +F943 5F04 +F944 7C60 +F945 807E +F946 7262 +F947 78CA +F948 8CC2 +F949 96F7 +F94A 58D8 +F94B 5C62 +F94C 6A13 +F94D 6DDA +F94E 6F0F +F94F 7D2F +F950 7E37 +F951 964B +F952 52D2 +F953 808B +F954 51DC +F955 51CC +F956 7A1C +F957 7DBE +F958 83F1 +F959 9675 +F95A 8B80 +F95B 62CF +F95C 6A02 +F95D 8AFE +F95E 4E39 +F95F 5BE7 +F960 6012 +F961 7387 +F962 7570 +F963 5317 +F964 78FB +F965 4FBF +F966 5FA9 +F967 4E0D +F968 6CCC +F969 6578 +F96A 7D22 +F96B 53C3 +F96C 585E +F96D 7701 +F96E 8449 +F96F 8AAA +F970 6BBA +F971 8FB0 +F972 6C88 +F973 62FE +F974 82E5 +F975 63A0 +F976 7565 +F977 4EAE +F978 5169 +F979 51C9 +F97A 6881 +F97B 7CE7 +F97C 826F +F97D 8AD2 +F97E 91CF +F97F 52F5 +F980 5442 +F981 5973 +F982 5EEC +F983 65C5 +F984 6FFE +F985 792A +F986 95AD +F987 9A6A +F988 9E97 +F989 9ECE +F98A 529B +F98B 66C6 +F98C 6B77 +F98D 8F62 +F98E 5E74 +F98F 6190 +F990 6200 +F991 649A +F992 6F23 +F993 7149 +F994 7489 +F995 79CA +F996 7DF4 +F997 806F +F998 8F26 +F999 84EE +F99A 9023 +F99B 934A +F99C 5217 +F99D 52A3 +F99E 54BD +F99F 70C8 +F9A0 88C2 +F9A1 8AAA +F9A2 5EC9 +F9A3 5FF5 +F9A4 637B +F9A5 6BAE +F9A6 7C3E +F9A7 7375 +F9A8 4EE4 +F9A9 56F9 +F9AA 5BE7 +F9AB 5DBA +F9AC 601C +F9AD 73B2 +F9AE 7469 +F9AF 7F9A +F9B0 8046 +F9B1 9234 +F9B2 96F6 +F9B3 9748 +F9B4 9818 +F9B5 4F8B +F9B6 79AE +F9B7 91B4 +F9B8 96B8 +F9B9 60E1 +F9BA 4E86 +F9BB 50DA +F9BC 5BEE +F9BD 5C3F +F9BE 6599 +F9BF 6A02 +F9C0 71CE +F9C1 7642 +F9C2 84FC +F9C3 907C +F9C4 9F8D +F9C5 6688 +F9C6 962E +F9C7 5289 +F9C8 677B +F9C9 67F3 +F9CA 6D41 +F9CB 6E9C +F9CC 7409 +F9CD 7559 +F9CE 786B +F9CF 7D10 +F9D0 985E +F9D1 516D +F9D2 622E +F9D3 9678 +F9D4 502B +F9D5 5D19 +F9D6 6DEA +F9D7 8F2A +F9D8 5F8B +F9D9 6144 +F9DA 6817 +F9DB 7387 +F9DC 9686 +F9DD 5229 +F9DE 540F +F9DF 5C65 +F9E0 6613 +F9E1 674E +F9E2 68A8 +F9E3 6CE5 +F9E4 7406 +F9E5 75E2 +F9E6 7F79 +F9E7 88CF +F9E8 88E1 +F9E9 91CC +F9EA 96E2 +F9EB 533F +F9EC 6EBA +F9ED 541D +F9EE 71D0 +F9EF 7498 +F9F0 85FA +F9F1 96A3 +F9F2 9C57 +F9F3 9E9F +F9F4 6797 +F9F5 6DCB +F9F6 81E8 +F9F7 7ACB +F9F8 7B20 +F9F9 7C92 +F9FA 72C0 +F9FB 7099 +F9FC 8B58 +F9FD 4EC0 +F9FE 8336 +F9FF 523A +FA00 5207 +FA01 5EA6 +FA02 62D3 +FA03 7CD6 +FA04 5B85 +FA05 6D1E +FA06 66B4 +FA07 8F3B +FA08 884C +FA09 964D +FA0A 898B +FA0B 5ED3 +FA0C 5140 +FA0D 55C0 +FA10 585A +FA12 6674 +FA15 51DE +FA16 732A +FA17 76CA +FA18 793C +FA19 795E +FA1A 7965 +FA1B 798F +FA1C 9756 +FA1D 7CBE +FA1E 7FBD +FA20 8612 +FA22 8AF8 +FA25 9038 +FA26 90FD +FA2A 98EF +FA2B 98FC +FA2C 9928 +FA2D 9DB4 +FA2E 90DE +FA2F 96B7 +FA30 4FAE +FA31 50E7 +FA32 514D +FA33 52C9 +FA34 52E4 +FA35 5351 +FA36 559D +FA37 5606 +FA38 5668 +FA39 5840 +FA3A 58A8 +FA3B 5C64 +FA3C 5C6E +FA3D 6094 +FA3E 6168 +FA3F 618E +FA40 61F2 +FA41 654F +FA42 65E2 +FA43 6691 +FA44 6885 +FA45 6D77 +FA46 6E1A +FA47 6F22 +FA48 716E +FA49 722B +FA4A 7422 +FA4B 7891 +FA4C 793E +FA4D 7949 +FA4E 7948 +FA4F 7950 +FA50 7956 +FA51 795D +FA52 798D +FA53 798E +FA54 7A40 +FA55 7A81 +FA56 7BC0 +FA57 7DF4 +FA58 7E09 +FA59 7E41 +FA5A 7F72 +FA5B 8005 +FA5C 81ED +FA5D 8279 +FA5E 8279 +FA5F 8457 +FA60 8910 +FA61 8996 +FA62 8B01 +FA63 8B39 +FA64 8CD3 +FA65 8D08 +FA66 8FB6 +FA67 9038 +FA68 96E3 +FA69 97FF +FA6A 983B +FA6B 6075 +FA6C 242EE +FA6D 8218 +FA70 4E26 +FA71 51B5 +FA72 5168 +FA73 4F80 +FA74 5145 +FA75 5180 +FA76 52C7 +FA77 52FA +FA78 559D +FA79 5555 +FA7A 5599 +FA7B 55E2 +FA7C 585A +FA7D 58B3 +FA7E 5944 +FA7F 5954 +FA80 5A62 +FA81 5B28 +FA82 5ED2 +FA83 5ED9 +FA84 5F69 +FA85 5FAD +FA86 60D8 +FA87 614E +FA88 6108 +FA89 618E +FA8A 6160 +FA8B 61F2 +FA8C 6234 +FA8D 63C4 +FA8E 641C +FA8F 6452 +FA90 6556 +FA91 6674 +FA92 6717 +FA93 671B +FA94 6756 +FA95 6B79 +FA96 6BBA +FA97 6D41 +FA98 6EDB +FA99 6ECB +FA9A 6F22 +FA9B 701E +FA9C 716E +FA9D 77A7 +FA9E 7235 +FA9F 72AF +FAA0 732A +FAA1 7471 +FAA2 7506 +FAA3 753B +FAA4 761D +FAA5 761F +FAA6 76CA +FAA7 76DB +FAA8 76F4 +FAA9 774A +FAAA 7740 +FAAB 78CC +FAAC 7AB1 +FAAD 7BC0 +FAAE 7C7B +FAAF 7D5B +FAB0 7DF4 +FAB1 7F3E +FAB2 8005 +FAB3 8352 +FAB4 83EF +FAB5 8779 +FAB6 8941 +FAB7 8986 +FAB8 8996 +FAB9 8ABF +FABA 8AF8 +FABB 8ACB +FABC 8B01 +FABD 8AFE +FABE 8AED +FABF 8B39 +FAC0 8B8A +FAC1 8D08 +FAC2 8F38 +FAC3 9072 +FAC4 9199 +FAC5 9276 +FAC6 967C +FAC7 96E3 +FAC8 9756 +FAC9 97DB +FACA 97FF +FACB 980B +FACC 983B +FACD 9B12 +FACE 9F9C +FACF 2284A +FAD0 22844 +FAD1 233D5 +FAD2 3B9D +FAD3 4018 +FAD4 4039 +FAD5 25249 +FAD6 25CD0 +FAD7 27ED3 +FAD8 9F43 +FAD9 9F8E +FB20 05E2 +FB21 05D0 +FB22 05D3 +FB23 05D4 +FB24 05DB +FB25 05DC +FB26 05DD +FB27 05E8 +FB28 05EA +FB29 002B +FB50 0671 +FB51 0671 +FB52 067B +FB53 067B +FB54 067B +FB55 067B +FB56 067E +FB57 067E +FB58 067E +FB59 067E +FB5A 0680 +FB5B 0680 +FB5C 0680 +FB5D 0680 +FB5E 067A +FB5F 067A +FB60 067A +FB61 067A +FB62 067F +FB63 067F +FB64 067F +FB65 067F +FB66 0679 +FB67 0679 +FB68 0679 +FB69 0679 +FB6A 06A4 +FB6B 06A4 +FB6C 06A4 +FB6D 06A4 +FB6E 06A6 +FB6F 06A6 +FB70 06A6 +FB71 06A6 +FB72 0684 +FB73 0684 +FB74 0684 +FB75 0684 +FB76 0683 +FB77 0683 +FB78 0683 +FB79 0683 +FB7A 0686 +FB7B 0686 +FB7C 0686 +FB7D 0686 +FB7E 0687 +FB7F 0687 +FB80 0687 +FB81 0687 +FB82 068D +FB83 068D +FB84 068C +FB85 068C +FB86 068E +FB87 068E +FB88 0688 +FB89 0688 +FB8A 0698 +FB8B 0698 +FB8C 0691 +FB8D 0691 +FB8E 06A9 +FB8F 06A9 +FB90 06A9 +FB91 06A9 +FB92 06AF +FB93 06AF +FB94 06AF +FB95 06AF +FB96 06B3 +FB97 06B3 +FB98 06B3 +FB99 06B3 +FB9A 06B1 +FB9B 06B1 +FB9C 06B1 +FB9D 06B1 +FB9E 06BA +FB9F 06BA +FBA0 06BB +FBA1 06BB +FBA2 06BB +FBA3 06BB +FBA4 06C0 +FBA5 06C0 +FBA6 06C1 +FBA7 06C1 +FBA8 06C1 +FBA9 06C1 +FBAA 06BE +FBAB 06BE +FBAC 06BE +FBAD 06BE +FBAE 06D2 +FBAF 06D2 +FBB0 06D3 +FBB1 06D3 +FBD3 06AD +FBD4 06AD +FBD5 06AD +FBD6 06AD +FBD7 06C7 +FBD8 06C7 +FBD9 06C6 +FBDA 06C6 +FBDB 06C8 +FBDC 06C8 +FBDE 06CB +FBDF 06CB +FBE0 06C5 +FBE1 06C5 +FBE2 06C9 +FBE3 06C9 +FBE4 06D0 +FBE5 06D0 +FBE6 06D0 +FBE7 06D0 +FBE8 0649 +FBE9 0649 +FBFC 06CC +FBFD 06CC +FBFE 06CC +FBFF 06CC +FE10 002C +FE11 3001 +FE12 3002 +FE13 003A +FE14 003B +FE15 0021 +FE16 003F +FE17 3016 +FE18 3017 +FE31 2014 +FE32 2013 +FE33 005F +FE34 005F +FE35 0028 +FE36 0029 +FE37 007B +FE38 007D +FE39 3014 +FE3A 3015 +FE3B 3010 +FE3C 3011 +FE3D 300A +FE3E 300B +FE3F 3008 +FE40 3009 +FE41 300C +FE42 300D +FE43 300E +FE44 300F +FE47 005B +FE48 005D +FE4D 005F +FE4E 005F +FE4F 005F +FE50 002C +FE51 3001 +FE52 002E +FE54 003B +FE55 003A +FE56 003F +FE57 0021 +FE58 2014 +FE59 0028 +FE5A 0029 +FE5B 007B +FE5C 007D +FE5D 3014 +FE5E 3015 +FE5F 0023 +FE60 0026 +FE61 002A +FE62 002B +FE63 002D +FE64 003C +FE65 003E +FE66 003D +FE68 005C +FE69 0024 +FE6A 0025 +FE6B 0040 +FE80 0621 +FE81 0622 +FE82 0622 +FE83 0623 +FE84 0623 +FE85 0624 +FE86 0624 +FE87 0625 +FE88 0625 +FE89 0626 +FE8A 0626 +FE8B 0626 +FE8C 0626 +FE8D 0627 +FE8E 0627 +FE8F 0628 +FE90 0628 +FE91 0628 +FE92 0628 +FE93 0629 +FE94 0629 +FE95 062A +FE96 062A +FE97 062A +FE98 062A +FE99 062B +FE9A 062B +FE9B 062B +FE9C 062B +FE9D 062C +FE9E 062C +FE9F 062C +FEA0 062C +FEA1 062D +FEA2 062D +FEA3 062D +FEA4 062D +FEA5 062E +FEA6 062E +FEA7 062E +FEA8 062E +FEA9 062F +FEAA 062F +FEAB 0630 +FEAC 0630 +FEAD 0631 +FEAE 0631 +FEAF 0632 +FEB0 0632 +FEB1 0633 +FEB2 0633 +FEB3 0633 +FEB4 0633 +FEB5 0634 +FEB6 0634 +FEB7 0634 +FEB8 0634 +FEB9 0635 +FEBA 0635 +FEBB 0635 +FEBC 0635 +FEBD 0636 +FEBE 0636 +FEBF 0636 +FEC0 0636 +FEC1 0637 +FEC2 0637 +FEC3 0637 +FEC4 0637 +FEC5 0638 +FEC6 0638 +FEC7 0638 +FEC8 0638 +FEC9 0639 +FECA 0639 +FECB 0639 +FECC 0639 +FECD 063A +FECE 063A +FECF 063A +FED0 063A +FED1 0641 +FED2 0641 +FED3 0641 +FED4 0641 +FED5 0642 +FED6 0642 +FED7 0642 +FED8 0642 +FED9 0643 +FEDA 0643 +FEDB 0643 +FEDC 0643 +FEDD 0644 +FEDE 0644 +FEDF 0644 +FEE0 0644 +FEE1 0645 +FEE2 0645 +FEE3 0645 +FEE4 0645 +FEE5 0646 +FEE6 0646 +FEE7 0646 +FEE8 0646 +FEE9 0647 +FEEA 0647 +FEEB 0647 +FEEC 0647 +FEED 0648 +FEEE 0648 +FEEF 0649 +FEF0 0649 +FEF1 064A +FEF2 064A +FEF3 064A +FEF4 064A +FF01 0021 +FF02 0022 +FF03 0023 +FF04 0024 +FF05 0025 +FF06 0026 +FF07 0027 +FF08 0028 +FF09 0029 +FF0A 002A +FF0B 002B +FF0C 002C +FF0D 002D +FF0E 002E +FF0F 002F +FF10 0030 +FF11 0031 +FF12 0032 +FF13 0033 +FF14 0034 +FF15 0035 +FF16 0036 +FF17 0037 +FF18 0038 +FF19 0039 +FF1A 003A +FF1B 003B +FF1C 003C +FF1D 003D +FF1E 003E +FF1F 003F +FF20 0040 +FF21 0061 +FF22 0062 +FF23 0063 +FF24 0064 +FF25 0065 +FF26 0066 +FF27 0067 +FF28 0068 +FF29 0069 +FF2A 006A +FF2B 006B +FF2C 006C +FF2D 006D +FF2E 006E +FF2F 006F +FF30 0070 +FF31 0071 +FF32 0072 +FF33 0073 +FF34 0074 +FF35 0075 +FF36 0076 +FF37 0077 +FF38 0078 +FF39 0079 +FF3A 007A +FF3B 005B +FF3C 005C +FF3D 005D +FF3E 005E +FF3F 005F +FF40 0060 +FF41 0061 +FF42 0062 +FF43 0063 +FF44 0064 +FF45 0065 +FF46 0066 +FF47 0067 +FF48 0068 +FF49 0069 +FF4A 006A +FF4B 006B +FF4C 006C +FF4D 006D +FF4E 006E +FF4F 006F +FF50 0070 +FF51 0071 +FF52 0072 +FF53 0073 +FF54 0074 +FF55 0075 +FF56 0076 +FF57 0077 +FF58 0078 +FF59 0079 +FF5A 007A +FF5B 007B +FF5C 007C +FF5D 007D +FF5E 007E +FF5F 2985 +FF60 2986 +FF61 3002 +FF62 300C +FF63 300D +FF64 3001 +FF65 30FB +FF66 30F2 +FF67 30A1 +FF68 30A3 +FF69 30A5 +FF6A 30A7 +FF6B 30A9 +FF6C 30E3 +FF6D 30E5 +FF6E 30E7 +FF6F 30C3 +FF70 30FC +FF71 30A2 +FF72 30A4 +FF73 30A6 +FF74 30A8 +FF75 30AA +FF76 30AB +FF77 30AD +FF78 30AF +FF79 30B1 +FF7A 30B3 +FF7B 30B5 +FF7C 30B7 +FF7D 30B9 +FF7E 30BB +FF7F 30BD +FF80 30BF +FF81 30C1 +FF82 30C4 +FF83 30C6 +FF84 30C8 +FF85 30CA +FF86 30CB +FF87 30CC +FF88 30CD +FF89 30CE +FF8A 30CF +FF8B 30D2 +FF8C 30D5 +FF8D 30D8 +FF8E 30DB +FF8F 30DE +FF90 30DF +FF91 30E0 +FF92 30E1 +FF93 30E2 +FF94 30E4 +FF95 30E6 +FF96 30E8 +FF97 30E9 +FF98 30EA +FF99 30EB +FF9A 30EC +FF9B 30ED +FF9C 30EF +FF9D 30F3 +FF9E 3099 +FF9F 309A +FFA1 1100 +FFA2 1101 +FFA3 11AA +FFA4 1102 +FFA5 11AC +FFA6 11AD +FFA7 1103 +FFA8 1104 +FFA9 1105 +FFAA 11B0 +FFAB 11B1 +FFAC 11B2 +FFAD 11B3 +FFAE 11B4 +FFAF 11B5 +FFB0 111A +FFB1 1106 +FFB2 1107 +FFB3 1108 +FFB4 1121 +FFB5 1109 +FFB6 110A +FFB7 110B +FFB8 110C +FFB9 110D +FFBA 110E +FFBB 110F +FFBC 1110 +FFBD 1111 +FFBE 1112 +FFC2 1161 +FFC3 1162 +FFC4 1163 +FFC5 1164 +FFC6 1165 +FFC7 1166 +FFCA 1167 +FFCB 1168 +FFCC 1169 +FFCD 116A +FFCE 116B +FFCF 116C +FFD2 116D +FFD3 116E +FFD4 116F +FFD5 1170 +FFD6 1171 +FFD7 1172 +FFDA 1173 +FFDB 1174 +FFDC 1175 +FFE0 00A2 +FFE1 00A3 +FFE2 00AC +FFE4 00A6 +FFE5 00A5 +FFE6 20A9 +FFE8 2502 +FFE9 2190 +FFEA 2191 +FFEB 2192 +FFEC 2193 +FFED 25A0 +FFEE 25CB +10400 10428 +10401 10429 +10402 1042A +10403 1042B +10404 1042C +10405 1042D +10406 1042E +10407 1042F +10408 10430 +10409 10431 +1040A 10432 +1040B 10433 +1040C 10434 +1040D 10435 +1040E 10436 +1040F 10437 +10410 10438 +10411 10439 +10412 1043A +10413 1043B +10414 1043C +10415 1043D +10416 1043E +10417 1043F +10418 10440 +10419 10441 +1041A 10442 +1041B 10443 +1041C 10444 +1041D 10445 +1041E 10446 +1041F 10447 +10420 10448 +10421 10449 +10422 1044A +10423 1044B +10424 1044C +10425 1044D +10426 1044E +10427 1044F +104B0 104D8 +104B1 104D9 +104B2 104DA +104B3 104DB +104B4 104DC +104B5 104DD +104B6 104DE +104B7 104DF +104B8 104E0 +104B9 104E1 +104BA 104E2 +104BB 104E3 +104BC 104E4 +104BD 104E5 +104BE 104E6 +104BF 104E7 +104C0 104E8 +104C1 104E9 +104C2 104EA +104C3 104EB +104C4 104EC +104C5 104ED +104C6 104EE +104C7 104EF +104C8 104F0 +104C9 104F1 +104CA 104F2 +104CB 104F3 +104CC 104F4 +104CD 104F5 +104CE 104F6 +104CF 104F7 +104D0 104F8 +104D1 104F9 +104D2 104FA +104D3 104FB +10C80 10CC0 +10C81 10CC1 +10C82 10CC2 +10C83 10CC3 +10C84 10CC4 +10C85 10CC5 +10C86 10CC6 +10C87 10CC7 +10C88 10CC8 +10C89 10CC9 +10C8A 10CCA +10C8B 10CCB +10C8C 10CCC +10C8D 10CCD +10C8E 10CCE +10C8F 10CCF +10C90 10CD0 +10C91 10CD1 +10C92 10CD2 +10C93 10CD3 +10C94 10CD4 +10C95 10CD5 +10C96 10CD6 +10C97 10CD7 +10C98 10CD8 +10C99 10CD9 +10C9A 10CDA +10C9B 10CDB +10C9C 10CDC +10C9D 10CDD +10C9E 10CDE +10C9F 10CDF +10CA0 10CE0 +10CA1 10CE1 +10CA2 10CE2 +10CA3 10CE3 +10CA4 10CE4 +10CA5 10CE5 +10CA6 10CE6 +10CA7 10CE7 +10CA8 10CE8 +10CA9 10CE9 +10CAA 10CEA +10CAB 10CEB +10CAC 10CEC +10CAD 10CED +10CAE 10CEE +10CAF 10CEF +10CB0 10CF0 +10CB1 10CF1 +10CB2 10CF2 +118A0 118C0 +118A1 118C1 +118A2 118C2 +118A3 118C3 +118A4 118C4 +118A5 118C5 +118A6 118C6 +118A7 118C7 +118A8 118C8 +118A9 118C9 +118AA 118CA +118AB 118CB +118AC 118CC +118AD 118CD +118AE 118CE +118AF 118CF +118B0 118D0 +118B1 118D1 +118B2 118D2 +118B3 118D3 +118B4 118D4 +118B5 118D5 +118B6 118D6 +118B7 118D7 +118B8 118D8 +118B9 118D9 +118BA 118DA +118BB 118DB +118BC 118DC +118BD 118DD +118BE 118DE +118BF 118DF +1D400 0061 +1D401 0062 +1D402 0063 +1D403 0064 +1D404 0065 +1D405 0066 +1D406 0067 +1D407 0068 +1D408 0069 +1D409 006A +1D40A 006B +1D40B 006C +1D40C 006D +1D40D 006E +1D40E 006F +1D40F 0070 +1D410 0071 +1D411 0072 +1D412 0073 +1D413 0074 +1D414 0075 +1D415 0076 +1D416 0077 +1D417 0078 +1D418 0079 +1D419 007A +1D41A 0061 +1D41B 0062 +1D41C 0063 +1D41D 0064 +1D41E 0065 +1D41F 0066 +1D420 0067 +1D421 0068 +1D422 0069 +1D423 006A +1D424 006B +1D425 006C +1D426 006D +1D427 006E +1D428 006F +1D429 0070 +1D42A 0071 +1D42B 0072 +1D42C 0073 +1D42D 0074 +1D42E 0075 +1D42F 0076 +1D430 0077 +1D431 0078 +1D432 0079 +1D433 007A +1D434 0061 +1D435 0062 +1D436 0063 +1D437 0064 +1D438 0065 +1D439 0066 +1D43A 0067 +1D43B 0068 +1D43C 0069 +1D43D 006A +1D43E 006B +1D43F 006C +1D440 006D +1D441 006E +1D442 006F +1D443 0070 +1D444 0071 +1D445 0072 +1D446 0073 +1D447 0074 +1D448 0075 +1D449 0076 +1D44A 0077 +1D44B 0078 +1D44C 0079 +1D44D 007A +1D44E 0061 +1D44F 0062 +1D450 0063 +1D451 0064 +1D452 0065 +1D453 0066 +1D454 0067 +1D456 0069 +1D457 006A +1D458 006B +1D459 006C +1D45A 006D +1D45B 006E +1D45C 006F +1D45D 0070 +1D45E 0071 +1D45F 0072 +1D460 0073 +1D461 0074 +1D462 0075 +1D463 0076 +1D464 0077 +1D465 0078 +1D466 0079 +1D467 007A +1D468 0061 +1D469 0062 +1D46A 0063 +1D46B 0064 +1D46C 0065 +1D46D 0066 +1D46E 0067 +1D46F 0068 +1D470 0069 +1D471 006A +1D472 006B +1D473 006C +1D474 006D +1D475 006E +1D476 006F +1D477 0070 +1D478 0071 +1D479 0072 +1D47A 0073 +1D47B 0074 +1D47C 0075 +1D47D 0076 +1D47E 0077 +1D47F 0078 +1D480 0079 +1D481 007A +1D482 0061 +1D483 0062 +1D484 0063 +1D485 0064 +1D486 0065 +1D487 0066 +1D488 0067 +1D489 0068 +1D48A 0069 +1D48B 006A +1D48C 006B +1D48D 006C +1D48E 006D +1D48F 006E +1D490 006F +1D491 0070 +1D492 0071 +1D493 0072 +1D494 0073 +1D495 0074 +1D496 0075 +1D497 0076 +1D498 0077 +1D499 0078 +1D49A 0079 +1D49B 007A +1D49C 0061 +1D49E 0063 +1D49F 0064 +1D4A2 0067 +1D4A5 006A +1D4A6 006B +1D4A9 006E +1D4AA 006F +1D4AB 0070 +1D4AC 0071 +1D4AE 0073 +1D4AF 0074 +1D4B0 0075 +1D4B1 0076 +1D4B2 0077 +1D4B3 0078 +1D4B4 0079 +1D4B5 007A +1D4B6 0061 +1D4B7 0062 +1D4B8 0063 +1D4B9 0064 +1D4BB 0066 +1D4BD 0068 +1D4BE 0069 +1D4BF 006A +1D4C0 006B +1D4C1 006C +1D4C2 006D +1D4C3 006E +1D4C5 0070 +1D4C6 0071 +1D4C7 0072 +1D4C8 0073 +1D4C9 0074 +1D4CA 0075 +1D4CB 0076 +1D4CC 0077 +1D4CD 0078 +1D4CE 0079 +1D4CF 007A +1D4D0 0061 +1D4D1 0062 +1D4D2 0063 +1D4D3 0064 +1D4D4 0065 +1D4D5 0066 +1D4D6 0067 +1D4D7 0068 +1D4D8 0069 +1D4D9 006A +1D4DA 006B +1D4DB 006C +1D4DC 006D +1D4DD 006E +1D4DE 006F +1D4DF 0070 +1D4E0 0071 +1D4E1 0072 +1D4E2 0073 +1D4E3 0074 +1D4E4 0075 +1D4E5 0076 +1D4E6 0077 +1D4E7 0078 +1D4E8 0079 +1D4E9 007A +1D4EA 0061 +1D4EB 0062 +1D4EC 0063 +1D4ED 0064 +1D4EE 0065 +1D4EF 0066 +1D4F0 0067 +1D4F1 0068 +1D4F2 0069 +1D4F3 006A +1D4F4 006B +1D4F5 006C +1D4F6 006D +1D4F7 006E +1D4F8 006F +1D4F9 0070 +1D4FA 0071 +1D4FB 0072 +1D4FC 0073 +1D4FD 0074 +1D4FE 0075 +1D4FF 0076 +1D500 0077 +1D501 0078 +1D502 0079 +1D503 007A +1D504 0061 +1D505 0062 +1D507 0064 +1D508 0065 +1D509 0066 +1D50A 0067 +1D50D 006A +1D50E 006B +1D50F 006C +1D510 006D +1D511 006E +1D512 006F +1D513 0070 +1D514 0071 +1D516 0073 +1D517 0074 +1D518 0075 +1D519 0076 +1D51A 0077 +1D51B 0078 +1D51C 0079 +1D51E 0061 +1D51F 0062 +1D520 0063 +1D521 0064 +1D522 0065 +1D523 0066 +1D524 0067 +1D525 0068 +1D526 0069 +1D527 006A +1D528 006B +1D529 006C +1D52A 006D +1D52B 006E +1D52C 006F +1D52D 0070 +1D52E 0071 +1D52F 0072 +1D530 0073 +1D531 0074 +1D532 0075 +1D533 0076 +1D534 0077 +1D535 0078 +1D536 0079 +1D537 007A +1D538 0061 +1D539 0062 +1D53B 0064 +1D53C 0065 +1D53D 0066 +1D53E 0067 +1D540 0069 +1D541 006A +1D542 006B +1D543 006C +1D544 006D +1D546 006F +1D54A 0073 +1D54B 0074 +1D54C 0075 +1D54D 0076 +1D54E 0077 +1D54F 0078 +1D550 0079 +1D552 0061 +1D553 0062 +1D554 0063 +1D555 0064 +1D556 0065 +1D557 0066 +1D558 0067 +1D559 0068 +1D55A 0069 +1D55B 006A +1D55C 006B +1D55D 006C +1D55E 006D +1D55F 006E +1D560 006F +1D561 0070 +1D562 0071 +1D563 0072 +1D564 0073 +1D565 0074 +1D566 0075 +1D567 0076 +1D568 0077 +1D569 0078 +1D56A 0079 +1D56B 007A +1D56C 0061 +1D56D 0062 +1D56E 0063 +1D56F 0064 +1D570 0065 +1D571 0066 +1D572 0067 +1D573 0068 +1D574 0069 +1D575 006A +1D576 006B +1D577 006C +1D578 006D +1D579 006E +1D57A 006F +1D57B 0070 +1D57C 0071 +1D57D 0072 +1D57E 0073 +1D57F 0074 +1D580 0075 +1D581 0076 +1D582 0077 +1D583 0078 +1D584 0079 +1D585 007A +1D586 0061 +1D587 0062 +1D588 0063 +1D589 0064 +1D58A 0065 +1D58B 0066 +1D58C 0067 +1D58D 0068 +1D58E 0069 +1D58F 006A +1D590 006B +1D591 006C +1D592 006D +1D593 006E +1D594 006F +1D595 0070 +1D596 0071 +1D597 0072 +1D598 0073 +1D599 0074 +1D59A 0075 +1D59B 0076 +1D59C 0077 +1D59D 0078 +1D59E 0079 +1D59F 007A +1D5A0 0061 +1D5A1 0062 +1D5A2 0063 +1D5A3 0064 +1D5A4 0065 +1D5A5 0066 +1D5A6 0067 +1D5A7 0068 +1D5A8 0069 +1D5A9 006A +1D5AA 006B +1D5AB 006C +1D5AC 006D +1D5AD 006E +1D5AE 006F +1D5AF 0070 +1D5B0 0071 +1D5B1 0072 +1D5B2 0073 +1D5B3 0074 +1D5B4 0075 +1D5B5 0076 +1D5B6 0077 +1D5B7 0078 +1D5B8 0079 +1D5B9 007A +1D5BA 0061 +1D5BB 0062 +1D5BC 0063 +1D5BD 0064 +1D5BE 0065 +1D5BF 0066 +1D5C0 0067 +1D5C1 0068 +1D5C2 0069 +1D5C3 006A +1D5C4 006B +1D5C5 006C +1D5C6 006D +1D5C7 006E +1D5C8 006F +1D5C9 0070 +1D5CA 0071 +1D5CB 0072 +1D5CC 0073 +1D5CD 0074 +1D5CE 0075 +1D5CF 0076 +1D5D0 0077 +1D5D1 0078 +1D5D2 0079 +1D5D3 007A +1D5D4 0061 +1D5D5 0062 +1D5D6 0063 +1D5D7 0064 +1D5D8 0065 +1D5D9 0066 +1D5DA 0067 +1D5DB 0068 +1D5DC 0069 +1D5DD 006A +1D5DE 006B +1D5DF 006C +1D5E0 006D +1D5E1 006E +1D5E2 006F +1D5E3 0070 +1D5E4 0071 +1D5E5 0072 +1D5E6 0073 +1D5E7 0074 +1D5E8 0075 +1D5E9 0076 +1D5EA 0077 +1D5EB 0078 +1D5EC 0079 +1D5ED 007A +1D5EE 0061 +1D5EF 0062 +1D5F0 0063 +1D5F1 0064 +1D5F2 0065 +1D5F3 0066 +1D5F4 0067 +1D5F5 0068 +1D5F6 0069 +1D5F7 006A +1D5F8 006B +1D5F9 006C +1D5FA 006D +1D5FB 006E +1D5FC 006F +1D5FD 0070 +1D5FE 0071 +1D5FF 0072 +1D600 0073 +1D601 0074 +1D602 0075 +1D603 0076 +1D604 0077 +1D605 0078 +1D606 0079 +1D607 007A +1D608 0061 +1D609 0062 +1D60A 0063 +1D60B 0064 +1D60C 0065 +1D60D 0066 +1D60E 0067 +1D60F 0068 +1D610 0069 +1D611 006A +1D612 006B +1D613 006C +1D614 006D +1D615 006E +1D616 006F +1D617 0070 +1D618 0071 +1D619 0072 +1D61A 0073 +1D61B 0074 +1D61C 0075 +1D61D 0076 +1D61E 0077 +1D61F 0078 +1D620 0079 +1D621 007A +1D622 0061 +1D623 0062 +1D624 0063 +1D625 0064 +1D626 0065 +1D627 0066 +1D628 0067 +1D629 0068 +1D62A 0069 +1D62B 006A +1D62C 006B +1D62D 006C +1D62E 006D +1D62F 006E +1D630 006F +1D631 0070 +1D632 0071 +1D633 0072 +1D634 0073 +1D635 0074 +1D636 0075 +1D637 0076 +1D638 0077 +1D639 0078 +1D63A 0079 +1D63B 007A +1D63C 0061 +1D63D 0062 +1D63E 0063 +1D63F 0064 +1D640 0065 +1D641 0066 +1D642 0067 +1D643 0068 +1D644 0069 +1D645 006A +1D646 006B +1D647 006C +1D648 006D +1D649 006E +1D64A 006F +1D64B 0070 +1D64C 0071 +1D64D 0072 +1D64E 0073 +1D64F 0074 +1D650 0075 +1D651 0076 +1D652 0077 +1D653 0078 +1D654 0079 +1D655 007A +1D656 0061 +1D657 0062 +1D658 0063 +1D659 0064 +1D65A 0065 +1D65B 0066 +1D65C 0067 +1D65D 0068 +1D65E 0069 +1D65F 006A +1D660 006B +1D661 006C +1D662 006D +1D663 006E +1D664 006F +1D665 0070 +1D666 0071 +1D667 0072 +1D668 0073 +1D669 0074 +1D66A 0075 +1D66B 0076 +1D66C 0077 +1D66D 0078 +1D66E 0079 +1D66F 007A +1D670 0061 +1D671 0062 +1D672 0063 +1D673 0064 +1D674 0065 +1D675 0066 +1D676 0067 +1D677 0068 +1D678 0069 +1D679 006A +1D67A 006B +1D67B 006C +1D67C 006D +1D67D 006E +1D67E 006F +1D67F 0070 +1D680 0071 +1D681 0072 +1D682 0073 +1D683 0074 +1D684 0075 +1D685 0076 +1D686 0077 +1D687 0078 +1D688 0079 +1D689 007A +1D68A 0061 +1D68B 0062 +1D68C 0063 +1D68D 0064 +1D68E 0065 +1D68F 0066 +1D690 0067 +1D691 0068 +1D692 0069 +1D693 006A +1D694 006B +1D695 006C +1D696 006D +1D697 006E +1D698 006F +1D699 0070 +1D69A 0071 +1D69B 0072 +1D69C 0073 +1D69D 0074 +1D69E 0075 +1D69F 0076 +1D6A0 0077 +1D6A1 0078 +1D6A2 0079 +1D6A3 007A +1D6A4 0131 +1D6A5 0237 +1D6A8 03B1 +1D6A9 03B2 +1D6AA 03B3 +1D6AB 03B4 +1D6AC 03B5 +1D6AD 03B6 +1D6AE 03B7 +1D6AF 03B8 +1D6B0 03B9 +1D6B1 03BA +1D6B2 03BB +1D6B3 03BC +1D6B4 03BD +1D6B5 03BE +1D6B6 03BF +1D6B7 03C0 +1D6B8 03C1 +1D6B9 03B8 +1D6BA 03C3 +1D6BB 03C4 +1D6BC 03C5 +1D6BD 03C6 +1D6BE 03C7 +1D6BF 03C8 +1D6C0 03C9 +1D6C1 2207 +1D6C2 03B1 +1D6C3 03B2 +1D6C4 03B3 +1D6C5 03B4 +1D6C6 03B5 +1D6C7 03B6 +1D6C8 03B7 +1D6C9 03B8 +1D6CA 03B9 +1D6CB 03BA +1D6CC 03BB +1D6CD 03BC +1D6CE 03BD +1D6CF 03BE +1D6D0 03BF +1D6D1 03C0 +1D6D2 03C1 +1D6D3 03C3 +1D6D4 03C3 +1D6D5 03C4 +1D6D6 03C5 +1D6D7 03C6 +1D6D8 03C7 +1D6D9 03C8 +1D6DA 03C9 +1D6DB 2202 +1D6DC 03B5 +1D6DD 03B8 +1D6DE 03BA +1D6DF 03C6 +1D6E0 03C1 +1D6E1 03C0 +1D6E2 03B1 +1D6E3 03B2 +1D6E4 03B3 +1D6E5 03B4 +1D6E6 03B5 +1D6E7 03B6 +1D6E8 03B7 +1D6E9 03B8 +1D6EA 03B9 +1D6EB 03BA +1D6EC 03BB +1D6ED 03BC +1D6EE 03BD +1D6EF 03BE +1D6F0 03BF +1D6F1 03C0 +1D6F2 03C1 +1D6F3 03B8 +1D6F4 03C3 +1D6F5 03C4 +1D6F6 03C5 +1D6F7 03C6 +1D6F8 03C7 +1D6F9 03C8 +1D6FA 03C9 +1D6FB 2207 +1D6FC 03B1 +1D6FD 03B2 +1D6FE 03B3 +1D6FF 03B4 +1D700 03B5 +1D701 03B6 +1D702 03B7 +1D703 03B8 +1D704 03B9 +1D705 03BA +1D706 03BB +1D707 03BC +1D708 03BD +1D709 03BE +1D70A 03BF +1D70B 03C0 +1D70C 03C1 +1D70D 03C3 +1D70E 03C3 +1D70F 03C4 +1D710 03C5 +1D711 03C6 +1D712 03C7 +1D713 03C8 +1D714 03C9 +1D715 2202 +1D716 03B5 +1D717 03B8 +1D718 03BA +1D719 03C6 +1D71A 03C1 +1D71B 03C0 +1D71C 03B1 +1D71D 03B2 +1D71E 03B3 +1D71F 03B4 +1D720 03B5 +1D721 03B6 +1D722 03B7 +1D723 03B8 +1D724 03B9 +1D725 03BA +1D726 03BB +1D727 03BC +1D728 03BD +1D729 03BE +1D72A 03BF +1D72B 03C0 +1D72C 03C1 +1D72D 03B8 +1D72E 03C3 +1D72F 03C4 +1D730 03C5 +1D731 03C6 +1D732 03C7 +1D733 03C8 +1D734 03C9 +1D735 2207 +1D736 03B1 +1D737 03B2 +1D738 03B3 +1D739 03B4 +1D73A 03B5 +1D73B 03B6 +1D73C 03B7 +1D73D 03B8 +1D73E 03B9 +1D73F 03BA +1D740 03BB +1D741 03BC +1D742 03BD +1D743 03BE +1D744 03BF +1D745 03C0 +1D746 03C1 +1D747 03C3 +1D748 03C3 +1D749 03C4 +1D74A 03C5 +1D74B 03C6 +1D74C 03C7 +1D74D 03C8 +1D74E 03C9 +1D74F 2202 +1D750 03B5 +1D751 03B8 +1D752 03BA +1D753 03C6 +1D754 03C1 +1D755 03C0 +1D756 03B1 +1D757 03B2 +1D758 03B3 +1D759 03B4 +1D75A 03B5 +1D75B 03B6 +1D75C 03B7 +1D75D 03B8 +1D75E 03B9 +1D75F 03BA +1D760 03BB +1D761 03BC +1D762 03BD +1D763 03BE +1D764 03BF +1D765 03C0 +1D766 03C1 +1D767 03B8 +1D768 03C3 +1D769 03C4 +1D76A 03C5 +1D76B 03C6 +1D76C 03C7 +1D76D 03C8 +1D76E 03C9 +1D76F 2207 +1D770 03B1 +1D771 03B2 +1D772 03B3 +1D773 03B4 +1D774 03B5 +1D775 03B6 +1D776 03B7 +1D777 03B8 +1D778 03B9 +1D779 03BA +1D77A 03BB +1D77B 03BC +1D77C 03BD +1D77D 03BE +1D77E 03BF +1D77F 03C0 +1D780 03C1 +1D781 03C3 +1D782 03C3 +1D783 03C4 +1D784 03C5 +1D785 03C6 +1D786 03C7 +1D787 03C8 +1D788 03C9 +1D789 2202 +1D78A 03B5 +1D78B 03B8 +1D78C 03BA +1D78D 03C6 +1D78E 03C1 +1D78F 03C0 +1D790 03B1 +1D791 03B2 +1D792 03B3 +1D793 03B4 +1D794 03B5 +1D795 03B6 +1D796 03B7 +1D797 03B8 +1D798 03B9 +1D799 03BA +1D79A 03BB +1D79B 03BC +1D79C 03BD +1D79D 03BE +1D79E 03BF +1D79F 03C0 +1D7A0 03C1 +1D7A1 03B8 +1D7A2 03C3 +1D7A3 03C4 +1D7A4 03C5 +1D7A5 03C6 +1D7A6 03C7 +1D7A7 03C8 +1D7A8 03C9 +1D7A9 2207 +1D7AA 03B1 +1D7AB 03B2 +1D7AC 03B3 +1D7AD 03B4 +1D7AE 03B5 +1D7AF 03B6 +1D7B0 03B7 +1D7B1 03B8 +1D7B2 03B9 +1D7B3 03BA +1D7B4 03BB +1D7B5 03BC +1D7B6 03BD +1D7B7 03BE +1D7B8 03BF +1D7B9 03C0 +1D7BA 03C1 +1D7BB 03C3 +1D7BC 03C3 +1D7BD 03C4 +1D7BE 03C5 +1D7BF 03C6 +1D7C0 03C7 +1D7C1 03C8 +1D7C2 03C9 +1D7C3 2202 +1D7C4 03B5 +1D7C5 03B8 +1D7C6 03BA +1D7C7 03C6 +1D7C8 03C1 +1D7C9 03C0 +1D7CA 03DD +1D7CB 03DD +1D7CE 0030 +1D7CF 0031 +1D7D0 0032 +1D7D1 0033 +1D7D2 0034 +1D7D3 0035 +1D7D4 0036 +1D7D5 0037 +1D7D6 0038 +1D7D7 0039 +1D7D8 0030 +1D7D9 0031 +1D7DA 0032 +1D7DB 0033 +1D7DC 0034 +1D7DD 0035 +1D7DE 0036 +1D7DF 0037 +1D7E0 0038 +1D7E1 0039 +1D7E2 0030 +1D7E3 0031 +1D7E4 0032 +1D7E5 0033 +1D7E6 0034 +1D7E7 0035 +1D7E8 0036 +1D7E9 0037 +1D7EA 0038 +1D7EB 0039 +1D7EC 0030 +1D7ED 0031 +1D7EE 0032 +1D7EF 0033 +1D7F0 0034 +1D7F1 0035 +1D7F2 0036 +1D7F3 0037 +1D7F4 0038 +1D7F5 0039 +1D7F6 0030 +1D7F7 0031 +1D7F8 0032 +1D7F9 0033 +1D7FA 0034 +1D7FB 0035 +1D7FC 0036 +1D7FD 0037 +1D7FE 0038 +1D7FF 0039 +1E900 1E922 +1E901 1E923 +1E902 1E924 +1E903 1E925 +1E904 1E926 +1E905 1E927 +1E906 1E928 +1E907 1E929 +1E908 1E92A +1E909 1E92B +1E90A 1E92C +1E90B 1E92D +1E90C 1E92E +1E90D 1E92F +1E90E 1E930 +1E90F 1E931 +1E910 1E932 +1E911 1E933 +1E912 1E934 +1E913 1E935 +1E914 1E936 +1E915 1E937 +1E916 1E938 +1E917 1E939 +1E918 1E93A +1E919 1E93B +1E91A 1E93C +1E91B 1E93D +1E91C 1E93E +1E91D 1E93F +1E91E 1E940 +1E91F 1E941 +1E920 1E942 +1E921 1E943 +1EE00 0627 +1EE01 0628 +1EE02 062C +1EE03 062F +1EE05 0648 +1EE06 0632 +1EE07 062D +1EE08 0637 +1EE09 064A +1EE0A 0643 +1EE0B 0644 +1EE0C 0645 +1EE0D 0646 +1EE0E 0633 +1EE0F 0639 +1EE10 0641 +1EE11 0635 +1EE12 0642 +1EE13 0631 +1EE14 0634 +1EE15 062A +1EE16 062B +1EE17 062E +1EE18 0630 +1EE19 0636 +1EE1A 0638 +1EE1B 063A +1EE1C 066E +1EE1D 06BA +1EE1E 06A1 +1EE1F 066F +1EE21 0628 +1EE22 062C +1EE24 0647 +1EE27 062D +1EE29 064A +1EE2A 0643 +1EE2B 0644 +1EE2C 0645 +1EE2D 0646 +1EE2E 0633 +1EE2F 0639 +1EE30 0641 +1EE31 0635 +1EE32 0642 +1EE34 0634 +1EE35 062A +1EE36 062B +1EE37 062E +1EE39 0636 +1EE3B 063A +1EE42 062C +1EE47 062D +1EE49 064A +1EE4B 0644 +1EE4D 0646 +1EE4E 0633 +1EE4F 0639 +1EE51 0635 +1EE52 0642 +1EE54 0634 +1EE57 062E +1EE59 0636 +1EE5B 063A +1EE5D 06BA +1EE5F 066F +1EE61 0628 +1EE62 062C +1EE64 0647 +1EE67 062D +1EE68 0637 +1EE69 064A +1EE6A 0643 +1EE6C 0645 +1EE6D 0646 +1EE6E 0633 +1EE6F 0639 +1EE70 0641 +1EE71 0635 +1EE72 0642 +1EE74 0634 +1EE75 062A +1EE76 062B +1EE77 062E +1EE79 0636 +1EE7A 0638 +1EE7B 063A +1EE7C 066E +1EE7E 06A1 +1EE80 0627 +1EE81 0628 +1EE82 062C +1EE83 062F +1EE84 0647 +1EE85 0648 +1EE86 0632 +1EE87 062D +1EE88 0637 +1EE89 064A +1EE8B 0644 +1EE8C 0645 +1EE8D 0646 +1EE8E 0633 +1EE8F 0639 +1EE90 0641 +1EE91 0635 +1EE92 0642 +1EE93 0631 +1EE94 0634 +1EE95 062A +1EE96 062B +1EE97 062E +1EE98 0630 +1EE99 0636 +1EE9A 0638 +1EE9B 063A +1EEA1 0628 +1EEA2 062C +1EEA3 062F +1EEA5 0648 +1EEA6 0632 +1EEA7 062D +1EEA8 0637 +1EEA9 064A +1EEAB 0644 +1EEAC 0645 +1EEAD 0646 +1EEAE 0633 +1EEAF 0639 +1EEB0 0641 +1EEB1 0635 +1EEB2 0642 +1EEB3 0631 +1EEB4 0634 +1EEB5 062A +1EEB6 062B +1EEB7 062E +1EEB8 0630 +1EEB9 0636 +1EEBA 0638 +1EEBB 063A +1F12B 0063 +1F12C 0072 +1F130 0061 +1F131 0062 +1F132 0063 +1F133 0064 +1F134 0065 +1F135 0066 +1F136 0067 +1F137 0068 +1F138 0069 +1F139 006A +1F13A 006B +1F13B 006C +1F13C 006D +1F13D 006E +1F13E 006F +1F13F 0070 +1F140 0071 +1F141 0072 +1F142 0073 +1F143 0074 +1F144 0075 +1F145 0076 +1F146 0077 +1F147 0078 +1F148 0079 +1F149 007A +1F202 30B5 +1F210 624B +1F211 5B57 +1F212 53CC +1F213 30C7 +1F214 4E8C +1F215 591A +1F216 89E3 +1F217 5929 +1F218 4EA4 +1F219 6620 +1F21A 7121 +1F21B 6599 +1F21C 524D +1F21D 5F8C +1F21E 518D +1F21F 65B0 +1F220 521D +1F221 7D42 +1F222 751F +1F223 8CA9 +1F224 58F0 +1F225 5439 +1F226 6F14 +1F227 6295 +1F228 6355 +1F229 4E00 +1F22A 4E09 +1F22B 904A +1F22C 5DE6 +1F22D 4E2D +1F22E 53F3 +1F22F 6307 +1F230 8D70 +1F231 6253 +1F232 7981 +1F233 7A7A +1F234 5408 +1F235 6E80 +1F236 6709 +1F237 6708 +1F238 7533 +1F239 5272 +1F23A 55B6 +1F23B 914D +1F250 5F97 +1F251 53EF +2F800 4E3D +2F801 4E38 +2F802 4E41 +2F803 20122 +2F804 4F60 +2F805 4FAE +2F806 4FBB +2F807 5002 +2F808 507A +2F809 5099 +2F80A 50E7 +2F80B 50CF +2F80C 349E +2F80D 2063A +2F80E 514D +2F80F 5154 +2F810 5164 +2F811 5177 +2F812 2051C +2F813 34B9 +2F814 5167 +2F815 518D +2F816 2054B +2F817 5197 +2F818 51A4 +2F819 4ECC +2F81A 51AC +2F81B 51B5 +2F81C 291DF +2F81D 51F5 +2F81E 5203 +2F81F 34DF +2F820 523B +2F821 5246 +2F822 5272 +2F823 5277 +2F824 3515 +2F825 52C7 +2F826 52C9 +2F827 52E4 +2F828 52FA +2F829 5305 +2F82A 5306 +2F82B 5317 +2F82C 5349 +2F82D 5351 +2F82E 535A +2F82F 5373 +2F830 537D +2F831 537F +2F832 537F +2F833 537F +2F834 20A2C +2F835 7070 +2F836 53CA +2F837 53DF +2F838 20B63 +2F839 53EB +2F83A 53F1 +2F83B 5406 +2F83C 549E +2F83D 5438 +2F83E 5448 +2F83F 5468 +2F840 54A2 +2F841 54F6 +2F842 5510 +2F843 5553 +2F844 5563 +2F845 5584 +2F846 5584 +2F847 5599 +2F848 55AB +2F849 55B3 +2F84A 55C2 +2F84B 5716 +2F84C 5606 +2F84D 5717 +2F84E 5651 +2F84F 5674 +2F850 5207 +2F851 58EE +2F852 57CE +2F853 57F4 +2F854 580D +2F855 578B +2F856 5832 +2F857 5831 +2F858 58AC +2F859 214E4 +2F85A 58F2 +2F85B 58F7 +2F85C 5906 +2F85D 591A +2F85E 5922 +2F85F 5962 +2F860 216A8 +2F861 216EA +2F862 59EC +2F863 5A1B +2F864 5A27 +2F865 59D8 +2F866 5A66 +2F867 36EE +2F868 36FC +2F869 5B08 +2F86A 5B3E +2F86B 5B3E +2F86C 219C8 +2F86D 5BC3 +2F86E 5BD8 +2F86F 5BE7 +2F870 5BF3 +2F871 21B18 +2F872 5BFF +2F873 5C06 +2F874 5F53 +2F875 5C22 +2F876 3781 +2F877 5C60 +2F878 5C6E +2F879 5CC0 +2F87A 5C8D +2F87B 21DE4 +2F87C 5D43 +2F87D 21DE6 +2F87E 5D6E +2F87F 5D6B +2F880 5D7C +2F881 5DE1 +2F882 5DE2 +2F883 382F +2F884 5DFD +2F885 5E28 +2F886 5E3D +2F887 5E69 +2F888 3862 +2F889 22183 +2F88A 387C +2F88B 5EB0 +2F88C 5EB3 +2F88D 5EB6 +2F88E 5ECA +2F88F 2A392 +2F890 5EFE +2F891 22331 +2F892 22331 +2F893 8201 +2F894 5F22 +2F895 5F22 +2F896 38C7 +2F897 232B8 +2F898 261DA +2F899 5F62 +2F89A 5F6B +2F89B 38E3 +2F89C 5F9A +2F89D 5FCD +2F89E 5FD7 +2F89F 5FF9 +2F8A0 6081 +2F8A1 393A +2F8A2 391C +2F8A3 6094 +2F8A4 226D4 +2F8A5 60C7 +2F8A6 6148 +2F8A7 614C +2F8A8 614E +2F8A9 614C +2F8AA 617A +2F8AB 618E +2F8AC 61B2 +2F8AD 61A4 +2F8AE 61AF +2F8AF 61DE +2F8B0 61F2 +2F8B1 61F6 +2F8B2 6210 +2F8B3 621B +2F8B4 625D +2F8B5 62B1 +2F8B6 62D4 +2F8B7 6350 +2F8B8 22B0C +2F8B9 633D +2F8BA 62FC +2F8BB 6368 +2F8BC 6383 +2F8BD 63E4 +2F8BE 22BF1 +2F8BF 6422 +2F8C0 63C5 +2F8C1 63A9 +2F8C2 3A2E +2F8C3 6469 +2F8C4 647E +2F8C5 649D +2F8C6 6477 +2F8C7 3A6C +2F8C8 654F +2F8C9 656C +2F8CA 2300A +2F8CB 65E3 +2F8CC 66F8 +2F8CD 6649 +2F8CE 3B19 +2F8CF 6691 +2F8D0 3B08 +2F8D1 3AE4 +2F8D2 5192 +2F8D3 5195 +2F8D4 6700 +2F8D5 669C +2F8D6 80AD +2F8D7 43D9 +2F8D8 6717 +2F8D9 671B +2F8DA 6721 +2F8DB 675E +2F8DC 6753 +2F8DD 233C3 +2F8DE 3B49 +2F8DF 67FA +2F8E0 6785 +2F8E1 6852 +2F8E2 6885 +2F8E3 2346D +2F8E4 688E +2F8E5 681F +2F8E6 6914 +2F8E7 3B9D +2F8E8 6942 +2F8E9 69A3 +2F8EA 69EA +2F8EB 6AA8 +2F8EC 236A3 +2F8ED 6ADB +2F8EE 3C18 +2F8EF 6B21 +2F8F0 238A7 +2F8F1 6B54 +2F8F2 3C4E +2F8F3 6B72 +2F8F4 6B9F +2F8F5 6BBA +2F8F6 6BBB +2F8F7 23A8D +2F8F8 21D0B +2F8F9 23AFA +2F8FA 6C4E +2F8FB 23CBC +2F8FC 6CBF +2F8FD 6CCD +2F8FE 6C67 +2F8FF 6D16 +2F900 6D3E +2F901 6D77 +2F902 6D41 +2F903 6D69 +2F904 6D78 +2F905 6D85 +2F906 23D1E +2F907 6D34 +2F908 6E2F +2F909 6E6E +2F90A 3D33 +2F90B 6ECB +2F90C 6EC7 +2F90D 23ED1 +2F90E 6DF9 +2F90F 6F6E +2F910 23F5E +2F911 23F8E +2F912 6FC6 +2F913 7039 +2F914 701E +2F915 701B +2F916 3D96 +2F917 704A +2F918 707D +2F919 7077 +2F91A 70AD +2F91B 20525 +2F91C 7145 +2F91D 24263 +2F91E 719C +2F91F 243AB +2F920 7228 +2F921 7235 +2F922 7250 +2F923 24608 +2F924 7280 +2F925 7295 +2F926 24735 +2F927 24814 +2F928 737A +2F929 738B +2F92A 3EAC +2F92B 73A5 +2F92C 3EB8 +2F92D 3EB8 +2F92E 7447 +2F92F 745C +2F930 7471 +2F931 7485 +2F932 74CA +2F933 3F1B +2F934 7524 +2F935 24C36 +2F936 753E +2F937 24C92 +2F938 7570 +2F939 2219F +2F93A 7610 +2F93B 24FA1 +2F93C 24FB8 +2F93D 25044 +2F93E 3FFC +2F93F 4008 +2F940 76F4 +2F941 250F3 +2F942 250F2 +2F943 25119 +2F944 25133 +2F945 771E +2F946 771F +2F947 771F +2F948 774A +2F949 4039 +2F94A 778B +2F94B 4046 +2F94C 4096 +2F94D 2541D +2F94E 784E +2F94F 788C +2F950 78CC +2F951 40E3 +2F952 25626 +2F953 7956 +2F954 2569A +2F955 256C5 +2F956 798F +2F957 79EB +2F958 412F +2F959 7A40 +2F95A 7A4A +2F95B 7A4F +2F95C 2597C +2F95D 25AA7 +2F95E 25AA7 +2F95F 7AEE +2F960 4202 +2F961 25BAB +2F962 7BC6 +2F963 7BC9 +2F964 4227 +2F965 25C80 +2F966 7CD2 +2F967 42A0 +2F968 7CE8 +2F969 7CE3 +2F96A 7D00 +2F96B 25F86 +2F96C 7D63 +2F96D 4301 +2F96E 7DC7 +2F96F 7E02 +2F970 7E45 +2F971 4334 +2F972 26228 +2F973 26247 +2F974 4359 +2F975 262D9 +2F976 7F7A +2F977 2633E +2F978 7F95 +2F979 7FFA +2F97A 8005 +2F97B 264DA +2F97C 26523 +2F97D 8060 +2F97E 265A8 +2F97F 8070 +2F980 2335F +2F981 43D5 +2F982 80B2 +2F983 8103 +2F984 440B +2F985 813E +2F986 5AB5 +2F987 267A7 +2F988 267B5 +2F989 23393 +2F98A 2339C +2F98B 8201 +2F98C 8204 +2F98D 8F9E +2F98E 446B +2F98F 8291 +2F990 828B +2F991 829D +2F992 52B3 +2F993 82B1 +2F994 82B3 +2F995 82BD +2F996 82E6 +2F997 26B3C +2F998 82E5 +2F999 831D +2F99A 8363 +2F99B 83AD +2F99C 8323 +2F99D 83BD +2F99E 83E7 +2F99F 8457 +2F9A0 8353 +2F9A1 83CA +2F9A2 83CC +2F9A3 83DC +2F9A4 26C36 +2F9A5 26D6B +2F9A6 26CD5 +2F9A7 452B +2F9A8 84F1 +2F9A9 84F3 +2F9AA 8516 +2F9AB 273CA +2F9AC 8564 +2F9AD 26F2C +2F9AE 455D +2F9AF 4561 +2F9B0 26FB1 +2F9B1 270D2 +2F9B2 456B +2F9B3 8650 +2F9B4 865C +2F9B5 8667 +2F9B6 8669 +2F9B7 86A9 +2F9B8 8688 +2F9B9 870E +2F9BA 86E2 +2F9BB 8779 +2F9BC 8728 +2F9BD 876B +2F9BE 8786 +2F9BF 45D7 +2F9C0 87E1 +2F9C1 8801 +2F9C2 45F9 +2F9C3 8860 +2F9C4 8863 +2F9C5 27667 +2F9C6 88D7 +2F9C7 88DE +2F9C8 4635 +2F9C9 88FA +2F9CA 34BB +2F9CB 278AE +2F9CC 27966 +2F9CD 46BE +2F9CE 46C7 +2F9CF 8AA0 +2F9D0 8AED +2F9D1 8B8A +2F9D2 8C55 +2F9D3 27CA8 +2F9D4 8CAB +2F9D5 8CC1 +2F9D6 8D1B +2F9D7 8D77 +2F9D8 27F2F +2F9D9 20804 +2F9DA 8DCB +2F9DB 8DBC +2F9DC 8DF0 +2F9DD 208DE +2F9DE 8ED4 +2F9DF 8F38 +2F9E0 285D2 +2F9E1 285ED +2F9E2 9094 +2F9E3 90F1 +2F9E4 9111 +2F9E5 2872E +2F9E6 911B +2F9E7 9238 +2F9E8 92D7 +2F9E9 92D8 +2F9EA 927C +2F9EB 93F9 +2F9EC 9415 +2F9ED 28BFA +2F9EE 958B +2F9EF 4995 +2F9F0 95B7 +2F9F1 28D77 +2F9F2 49E6 +2F9F3 96C3 +2F9F4 5DB2 +2F9F5 9723 +2F9F6 29145 +2F9F7 2921A +2F9F8 4A6E +2F9F9 4A76 +2F9FA 97E0 +2F9FB 2940A +2F9FC 4AB2 +2F9FD 29496 +2F9FE 980B +2F9FF 980B +2FA00 9829 +2FA01 295B6 +2FA02 98E2 +2FA03 4B33 +2FA04 9929 +2FA05 99A7 +2FA06 99C2 +2FA07 99FE +2FA08 4BCE +2FA09 29B30 +2FA0A 9B12 +2FA0B 9C40 +2FA0C 9CFD +2FA0D 4CCE +2FA0E 4CED +2FA0F 9D67 +2FA10 2A0CE +2FA11 4CF8 +2FA12 2A105 +2FA13 2A20E +2FA14 2A291 +2FA15 9EBB +2FA16 4D56 +2FA17 9EF9 +2FA18 9EFE +2FA19 9F05 +2FA1A 9F0F +2FA1B 9F16 +2FA1C 9F3B +2FA1D 2A600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToVo'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToVo'}{'missing'} = 'R'; + +return <<'END'; +0 A6 Rotated +A7 U +A8 Rotated +A9 U +AA AD Rotated +AE U +AF B0 Rotated +B1 U +B2 BB Rotated +BC BE U +BF D6 Rotated +D7 U +D8 F6 Rotated +F7 U +F8 2E9 Rotated +2EA 2EB U +2EC 377 Rotated +37A 37F Rotated +384 38A Rotated +38C Rotated +38E 3A1 Rotated +3A3 52F Rotated +531 556 Rotated +559 55F Rotated +561 587 Rotated +589 58A Rotated +58D 58F Rotated +591 5C7 Rotated +5D0 5EA Rotated +5F0 5F4 Rotated +600 61C Rotated +61E 70D Rotated +70F 74A Rotated +74D 7B1 Rotated +7C0 7FA Rotated +800 82D Rotated +830 83E Rotated +840 85B Rotated +85E Rotated +860 86A Rotated +8A0 8B4 Rotated +8B6 8BD Rotated +8D4 983 Rotated +985 98C Rotated +98F 990 Rotated +993 9A8 Rotated +9AA 9B0 Rotated +9B2 Rotated +9B6 9B9 Rotated +9BC 9C4 Rotated +9C7 9C8 Rotated +9CB 9CE Rotated +9D7 Rotated +9DC 9DD Rotated +9DF 9E3 Rotated +9E6 9FD Rotated +A01 A03 Rotated +A05 A0A Rotated +A0F A10 Rotated +A13 A28 Rotated +A2A A30 Rotated +A32 A33 Rotated +A35 A36 Rotated +A38 A39 Rotated +A3C Rotated +A3E A42 Rotated +A47 A48 Rotated +A4B A4D Rotated +A51 Rotated +A59 A5C Rotated +A5E Rotated +A66 A75 Rotated +A81 A83 Rotated +A85 A8D Rotated +A8F A91 Rotated +A93 AA8 Rotated +AAA AB0 Rotated +AB2 AB3 Rotated +AB5 AB9 Rotated +ABC AC5 Rotated +AC7 AC9 Rotated +ACB ACD Rotated +AD0 Rotated +AE0 AE3 Rotated +AE6 AF1 Rotated +AF9 AFF Rotated +B01 B03 Rotated +B05 B0C Rotated +B0F B10 Rotated +B13 B28 Rotated +B2A B30 Rotated +B32 B33 Rotated +B35 B39 Rotated +B3C B44 Rotated +B47 B48 Rotated +B4B B4D Rotated +B56 B57 Rotated +B5C B5D Rotated +B5F B63 Rotated +B66 B77 Rotated +B82 B83 Rotated +B85 B8A Rotated +B8E B90 Rotated +B92 B95 Rotated +B99 B9A Rotated +B9C Rotated +B9E B9F Rotated +BA3 BA4 Rotated +BA8 BAA Rotated +BAE BB9 Rotated +BBE BC2 Rotated +BC6 BC8 Rotated +BCA BCD Rotated +BD0 Rotated +BD7 Rotated +BE6 BFA Rotated +C00 C03 Rotated +C05 C0C Rotated +C0E C10 Rotated +C12 C28 Rotated +C2A C39 Rotated +C3D C44 Rotated +C46 C48 Rotated +C4A C4D Rotated +C55 C56 Rotated +C58 C5A Rotated +C60 C63 Rotated +C66 C6F Rotated +C78 C83 Rotated +C85 C8C Rotated +C8E C90 Rotated +C92 CA8 Rotated +CAA CB3 Rotated +CB5 CB9 Rotated +CBC CC4 Rotated +CC6 CC8 Rotated +CCA CCD Rotated +CD5 CD6 Rotated +CDE Rotated +CE0 CE3 Rotated +CE6 CEF Rotated +CF1 CF2 Rotated +D00 D03 Rotated +D05 D0C Rotated +D0E D10 Rotated +D12 D44 Rotated +D46 D48 Rotated +D4A D4F Rotated +D54 D63 Rotated +D66 D7F Rotated +D82 D83 Rotated +D85 D96 Rotated +D9A DB1 Rotated +DB3 DBB Rotated +DBD Rotated +DC0 DC6 Rotated +DCA Rotated +DCF DD4 Rotated +DD6 Rotated +DD8 DDF Rotated +DE6 DEF Rotated +DF2 DF4 Rotated +E01 E3A Rotated +E3F E5B Rotated +E81 E82 Rotated +E84 Rotated +E87 E88 Rotated +E8A Rotated +E8D Rotated +E94 E97 Rotated +E99 E9F Rotated +EA1 EA3 Rotated +EA5 Rotated +EA7 Rotated +EAA EAB Rotated +EAD EB9 Rotated +EBB EBD Rotated +EC0 EC4 Rotated +EC6 Rotated +EC8 ECD Rotated +ED0 ED9 Rotated +EDC EDF Rotated +F00 F47 Rotated +F49 F6C Rotated +F71 F97 Rotated +F99 FBC Rotated +FBE FCC Rotated +FCE FDA Rotated +1000 10C5 Rotated +10C7 Rotated +10CD Rotated +10D0 10FF Rotated +1100 11FF U +1200 1248 Rotated +124A 124D Rotated +1250 1256 Rotated +1258 Rotated +125A 125D Rotated +1260 1288 Rotated +128A 128D Rotated +1290 12B0 Rotated +12B2 12B5 Rotated +12B8 12BE Rotated +12C0 Rotated +12C2 12C5 Rotated +12C8 12D6 Rotated +12D8 1310 Rotated +1312 1315 Rotated +1318 135A Rotated +135D 137C Rotated +1380 1399 Rotated +13A0 13F5 Rotated +13F8 13FD Rotated +1400 Rotated +1401 167F U +1680 169C Rotated +16A0 16F8 Rotated +1700 170C Rotated +170E 1714 Rotated +1720 1736 Rotated +1740 1753 Rotated +1760 176C Rotated +176E 1770 Rotated +1772 1773 Rotated +1780 17DD Rotated +17E0 17E9 Rotated +17F0 17F9 Rotated +1800 180E Rotated +1810 1819 Rotated +1820 1877 Rotated +1880 18AA Rotated +18B0 18FF U +1900 191E Rotated +1920 192B Rotated +1930 193B Rotated +1940 Rotated +1944 196D Rotated +1970 1974 Rotated +1980 19AB Rotated +19B0 19C9 Rotated +19D0 19DA Rotated +19DE 1A1B Rotated +1A1E 1A5E Rotated +1A60 1A7C Rotated +1A7F 1A89 Rotated +1A90 1A99 Rotated +1AA0 1AAD Rotated +1AB0 1ABE Rotated +1B00 1B4B Rotated +1B50 1B7C Rotated +1B80 1BF3 Rotated +1BFC 1C37 Rotated +1C3B 1C49 Rotated +1C4D 1C88 Rotated +1CC0 1CC7 Rotated +1CD0 1CF9 Rotated +1D00 1DF9 Rotated +1DFB 1F15 Rotated +1F18 1F1D Rotated +1F20 1F45 Rotated +1F48 1F4D Rotated +1F50 1F57 Rotated +1F59 Rotated +1F5B Rotated +1F5D Rotated +1F5F 1F7D Rotated +1F80 1FB4 Rotated +1FB6 1FC4 Rotated +1FC6 1FD3 Rotated +1FD6 1FDB Rotated +1FDD 1FEF Rotated +1FF2 1FF4 Rotated +1FF6 1FFE Rotated +2000 2015 Rotated +2016 U +2017 201F Rotated +2020 2021 U +2022 202F Rotated +2030 2031 U +2032 203A Rotated +203B 203C U +203D 2041 Rotated +2042 U +2043 2046 Rotated +2047 2049 U +204A 2050 Rotated +2051 U +2052 2064 Rotated +2065 U +2066 2071 Rotated +2074 208E Rotated +2090 209C Rotated +20A0 20BF Rotated +20D0 20DC Rotated +20DD 20E0 U +20E1 Rotated +20E2 20E4 U +20E5 20F0 Rotated +2100 2101 U +2102 Rotated +2103 2109 U +210A 210E Rotated +210F U +2110 2112 Rotated +2113 2114 U +2115 Rotated +2116 2117 U +2118 211D Rotated +211E 2123 U +2124 Rotated +2125 U +2126 Rotated +2127 U +2128 Rotated +2129 U +212A 212D Rotated +212E U +212F 2134 Rotated +2135 213F U +2140 2144 Rotated +2145 214A U +214B Rotated +214C 214D U +214E Rotated +214F 2189 U +218A 218B Rotated +218C 218F U +2190 221D Rotated +221E U +221F 2233 Rotated +2234 2235 U +2236 22FF Rotated +2300 2307 U +2308 230B Rotated +230C 231F U +2320 2323 Rotated +2324 2328 U +2329 232A Tr +232B U +232C 237C Rotated +237D 239A U +239B 23BD Rotated +23BE 23CD U +23CE Rotated +23CF U +23D0 Rotated +23D1 23DB U +23DC 23E1 Rotated +23E2 2422 U +2423 Rotated +2424 24FF U +2500 259F Rotated +25A0 2619 U +261A 261F Rotated +2620 2767 U +2768 2775 Rotated +2776 2793 U +2794 2B11 Rotated +2B12 2B2F U +2B30 2B4F Rotated +2B50 2B59 U +2B5A 2B73 Rotated +2B76 2B95 Rotated +2B98 2BB7 Rotated +2BB8 2BD1 U +2BD2 Rotated +2BD3 2BEB U +2BEC 2BEF Rotated +2BF0 2BFF U +2C00 2C2E Rotated +2C30 2C5E Rotated +2C60 2CF3 Rotated +2CF9 2D25 Rotated +2D27 Rotated +2D2D Rotated +2D30 2D67 Rotated +2D6F 2D70 Rotated +2D7F 2D96 Rotated +2DA0 2DA6 Rotated +2DA8 2DAE Rotated +2DB0 2DB6 Rotated +2DB8 2DBE Rotated +2DC0 2DC6 Rotated +2DC8 2DCE Rotated +2DD0 2DD6 Rotated +2DD8 2DDE Rotated +2DE0 2E49 Rotated +2E80 3000 U +3001 3002 Tu +3003 3007 U +3008 3011 Tr +3012 3013 U +3014 301F Tr +3020 302F U +3030 Tr +3031 3040 U +3041 Tu +3042 U +3043 Tu +3044 U +3045 Tu +3046 U +3047 Tu +3048 U +3049 Tu +304A 3062 U +3063 Tu +3064 3082 U +3083 Tu +3084 U +3085 Tu +3086 U +3087 Tu +3088 308D U +308E Tu +308F 3094 U +3095 3096 Tu +3097 309A U +309B 309C Tu +309D 309F U +30A0 Tr +30A1 Tu +30A2 U +30A3 Tu +30A4 U +30A5 Tu +30A6 U +30A7 Tu +30A8 U +30A9 Tu +30AA 30C2 U +30C3 Tu +30C4 30E2 U +30E3 Tu +30E4 U +30E5 Tu +30E6 U +30E7 Tu +30E8 30ED U +30EE Tu +30EF 30F4 U +30F5 30F6 Tu +30F7 30FB U +30FC Tr +30FD 3126 U +3127 Tu +3128 31EF U +31F0 31FF Tu +3200 32FF U +3300 3357 Tu +3358 337A U +337B 337F Tu +3380 A4CF U +A4D0 A62B Rotated +A640 A6F7 Rotated +A700 A7AE Rotated +A7B0 A7B7 Rotated +A7F7 A82B Rotated +A830 A839 Rotated +A840 A877 Rotated +A880 A8C5 Rotated +A8CE A8D9 Rotated +A8E0 A8FD Rotated +A900 A953 Rotated +A95F Rotated +A960 A97F U +A980 A9CD Rotated +A9CF A9D9 Rotated +A9DE A9FE Rotated +AA00 AA36 Rotated +AA40 AA4D Rotated +AA50 AA59 Rotated +AA5C AAC2 Rotated +AADB AAF6 Rotated +AB01 AB06 Rotated +AB09 AB0E Rotated +AB11 AB16 Rotated +AB20 AB26 Rotated +AB28 AB2E Rotated +AB30 AB65 Rotated +AB70 ABED Rotated +ABF0 ABF9 Rotated +AC00 D7FF U +D800 DFFF Rotated +E000 FAFF U +FB00 FB06 Rotated +FB13 FB17 Rotated +FB1D FB36 Rotated +FB38 FB3C Rotated +FB3E Rotated +FB40 FB41 Rotated +FB43 FB44 Rotated +FB46 FBC1 Rotated +FBD3 FD3F Rotated +FD50 FD8F Rotated +FD92 FDC7 Rotated +FDF0 FDFD Rotated +FE00 FE0F Rotated +FE10 FE1F U +FE20 FE2F Rotated +FE30 FE48 U +FE49 FE4F Rotated +FE50 FE52 Tu +FE53 FE57 U +FE58 Rotated +FE59 FE5E Tr +FE5F FE62 U +FE63 FE66 Rotated +FE67 FE6F U +FE70 FE74 Rotated +FE76 FEFC Rotated +FEFF Rotated +FF01 Tu +FF02 FF07 U +FF08 FF09 Tr +FF0A FF0B U +FF0C Tu +FF0D Rotated +FF0E Tu +FF0F FF19 U +FF1A FF1B Tr +FF1C FF1E Rotated +FF1F Tu +FF20 FF3A U +FF3B Tr +FF3C U +FF3D Tr +FF3E U +FF3F Tr +FF40 FF5A U +FF5B FF60 Tr +FF61 FFBE Rotated +FFC2 FFC7 Rotated +FFCA FFCF Rotated +FFD2 FFD7 Rotated +FFDA FFDC Rotated +FFE0 FFE2 U +FFE3 Tr +FFE4 FFE7 U +FFE8 FFEE Rotated +FFF0 FFF8 U +FFF9 FFFB Rotated +FFFC FFFD U +10000 1000B Rotated +1000D 10026 Rotated +10028 1003A Rotated +1003C 1003D Rotated +1003F 1004D Rotated +10050 1005D Rotated +10080 100FA Rotated +10100 10102 Rotated +10107 10133 Rotated +10137 1018E Rotated +10190 1019B Rotated +101A0 Rotated +101D0 101FD Rotated +10280 1029C Rotated +102A0 102D0 Rotated +102E0 102FB Rotated +10300 10323 Rotated +1032D 1034A Rotated +10350 1037A Rotated +10380 1039D Rotated +1039F 103C3 Rotated +103C8 103D5 Rotated +10400 1049D Rotated +104A0 104A9 Rotated +104B0 104D3 Rotated +104D8 104FB Rotated +10500 10527 Rotated +10530 10563 Rotated +1056F Rotated +10600 10736 Rotated +10740 10755 Rotated +10760 10767 Rotated +10800 10805 Rotated +10808 Rotated +1080A 10835 Rotated +10837 10838 Rotated +1083C Rotated +1083F 10855 Rotated +10857 1089E Rotated +108A7 108AF Rotated +108E0 108F2 Rotated +108F4 108F5 Rotated +108FB 1091B Rotated +1091F 10939 Rotated +1093F Rotated +10980 1099F U +109A0 109B7 Rotated +109BC 109CF Rotated +109D2 10A03 Rotated +10A05 10A06 Rotated +10A0C 10A13 Rotated +10A15 10A17 Rotated +10A19 10A33 Rotated +10A38 10A3A Rotated +10A3F 10A47 Rotated +10A50 10A58 Rotated +10A60 10A9F Rotated +10AC0 10AE6 Rotated +10AEB 10AF6 Rotated +10B00 10B35 Rotated +10B39 10B55 Rotated +10B58 10B72 Rotated +10B78 10B91 Rotated +10B99 10B9C Rotated +10BA9 10BAF Rotated +10C00 10C48 Rotated +10C80 10CB2 Rotated +10CC0 10CF2 Rotated +10CFA 10CFF Rotated +10E60 10E7E Rotated +11000 1104D Rotated +11052 1106F Rotated +1107F 110C1 Rotated +110D0 110E8 Rotated +110F0 110F9 Rotated +11100 11134 Rotated +11136 11143 Rotated +11150 11176 Rotated +11180 111CD Rotated +111D0 111DF Rotated +111E1 111F4 Rotated +11200 11211 Rotated +11213 1123E Rotated +11280 11286 Rotated +11288 Rotated +1128A 1128D Rotated +1128F 1129D Rotated +1129F 112A9 Rotated +112B0 112EA Rotated +112F0 112F9 Rotated +11300 11303 Rotated +11305 1130C Rotated +1130F 11310 Rotated +11313 11328 Rotated +1132A 11330 Rotated +11332 11333 Rotated +11335 11339 Rotated +1133C 11344 Rotated +11347 11348 Rotated +1134B 1134D Rotated +11350 Rotated +11357 Rotated +1135D 11363 Rotated +11366 1136C Rotated +11370 11374 Rotated +11400 11459 Rotated +1145B Rotated +1145D Rotated +11480 114C7 Rotated +114D0 114D9 Rotated +11580 115FF U +11600 11644 Rotated +11650 11659 Rotated +11660 1166C Rotated +11680 116B7 Rotated +116C0 116C9 Rotated +11700 11719 Rotated +1171D 1172B Rotated +11730 1173F Rotated +118A0 118F2 Rotated +118FF Rotated +11A00 11AAF U +11AC0 11AF8 Rotated +11C00 11C08 Rotated +11C0A 11C36 Rotated +11C38 11C45 Rotated +11C50 11C6C Rotated +11C70 11C8F Rotated +11C92 11CA7 Rotated +11CA9 11CB6 Rotated +11D00 11D06 Rotated +11D08 11D09 Rotated +11D0B 11D36 Rotated +11D3A Rotated +11D3C 11D3D Rotated +11D3F 11D47 Rotated +11D50 11D59 Rotated +12000 12399 Rotated +12400 1246E Rotated +12470 12474 Rotated +12480 12543 Rotated +13000 1342F U +14400 1467F U +16800 16A38 Rotated +16A40 16A5E Rotated +16A60 16A69 Rotated +16A6E 16A6F Rotated +16AD0 16AED Rotated +16AF0 16AF5 Rotated +16B00 16B45 Rotated +16B50 16B59 Rotated +16B5B 16B61 Rotated +16B63 16B77 Rotated +16B7D 16B8F Rotated +16F00 16F44 Rotated +16F50 16F7E Rotated +16F8F 16F9F Rotated +16FE0 18AFF U +1B000 1B12F U +1B170 1B2FF U +1BC00 1BC6A Rotated +1BC70 1BC7C Rotated +1BC80 1BC88 Rotated +1BC90 1BC99 Rotated +1BC9C 1BCA3 Rotated +1D000 1D1FF U +1D200 1D245 Rotated +1D300 1D37F U +1D400 1D454 Rotated +1D456 1D49C Rotated +1D49E 1D49F Rotated +1D4A2 Rotated +1D4A5 1D4A6 Rotated +1D4A9 1D4AC Rotated +1D4AE 1D4B9 Rotated +1D4BB Rotated +1D4BD 1D4C3 Rotated +1D4C5 1D505 Rotated +1D507 1D50A Rotated +1D50D 1D514 Rotated +1D516 1D51C Rotated +1D51E 1D539 Rotated +1D53B 1D53E Rotated +1D540 1D544 Rotated +1D546 Rotated +1D54A 1D550 Rotated +1D552 1D6A5 Rotated +1D6A8 1D7CB Rotated +1D7CE 1D7FF Rotated +1D800 1DAAF U +1E000 1E006 Rotated +1E008 1E018 Rotated +1E01B 1E021 Rotated +1E023 1E024 Rotated +1E026 1E02A Rotated +1E800 1E8C4 Rotated +1E8C7 1E8D6 Rotated +1E900 1E94A Rotated +1E950 1E959 Rotated +1E95E 1E95F Rotated +1EE00 1EE03 Rotated +1EE05 1EE1F Rotated +1EE21 1EE22 Rotated +1EE24 Rotated +1EE27 Rotated +1EE29 1EE32 Rotated +1EE34 1EE37 Rotated +1EE39 Rotated +1EE3B Rotated +1EE42 Rotated +1EE47 Rotated +1EE49 Rotated +1EE4B Rotated +1EE4D 1EE4F Rotated +1EE51 1EE52 Rotated +1EE54 Rotated +1EE57 Rotated +1EE59 Rotated +1EE5B Rotated +1EE5D Rotated +1EE5F Rotated +1EE61 1EE62 Rotated +1EE64 Rotated +1EE67 1EE6A Rotated +1EE6C 1EE72 Rotated +1EE74 1EE77 Rotated +1EE79 1EE7C Rotated +1EE7E Rotated +1EE80 1EE89 Rotated +1EE8B 1EE9B Rotated +1EEA1 1EEA3 Rotated +1EEA5 1EEA9 Rotated +1EEAB 1EEBB Rotated +1EEF0 1EEF1 Rotated +1F000 1F1FF U +1F200 1F201 Tu +1F202 1F7FF U +1F800 1F80B Rotated +1F810 1F847 Rotated +1F850 1F859 Rotated +1F860 1F887 Rotated +1F890 1F8AD Rotated +1F900 1F9FF U +20000 2FFFD U +30000 3FFFD U +E0001 Rotated +E0020 E007F Rotated +E0100 E01EF Rotated +F0000 FFFFD U +100000 10FFFD U +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToEa'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToEa'}{'missing'} = 'Neutral'; + +return <<'END'; +20 7E Na +A1 A +A2 A3 Na +A4 A +A5 A6 Na +A7 A8 A +AA A +AC Na +AD AE A +AF Na +B0 B4 A +B6 BA A +BC BF A +C6 A +D0 A +D7 D8 A +DE E1 A +E6 A +E8 EA A +EC ED A +F0 A +F2 F3 A +F7 FA A +FC A +FE A +101 A +111 A +113 A +11B A +126 127 A +12B A +131 133 A +138 A +13F 142 A +144 A +148 14B A +14D A +152 153 A +166 167 A +16B A +1CE A +1D0 A +1D2 A +1D4 A +1D6 A +1D8 A +1DA A +1DC A +251 A +261 A +2C4 A +2C7 A +2C9 2CB A +2CD A +2D0 A +2D8 2DB A +2DD A +2DF A +300 36F A +391 3A1 A +3A3 3A9 A +3B1 3C1 A +3C3 3C9 A +401 A +410 44F A +451 A +1100 115F W +2010 A +2013 2016 A +2018 2019 A +201C 201D A +2020 2022 A +2024 2027 A +2030 A +2032 2033 A +2035 A +203B A +203E A +2074 A +207F A +2081 2084 A +20A9 H +20AC A +2103 A +2105 A +2109 A +2113 A +2116 A +2121 2122 A +2126 A +212B A +2153 2154 A +215B 215E A +2160 216B A +2170 2179 A +2189 A +2190 2199 A +21B8 21B9 A +21D2 A +21D4 A +21E7 A +2200 A +2202 2203 A +2207 2208 A +220B A +220F A +2211 A +2215 A +221A A +221D 2220 A +2223 A +2225 A +2227 222C A +222E A +2234 2237 A +223C 223D A +2248 A +224C A +2252 A +2260 2261 A +2264 2267 A +226A 226B A +226E 226F A +2282 2283 A +2286 2287 A +2295 A +2299 A +22A5 A +22BF A +2312 A +231A 231B W +2329 232A W +23E9 23EC W +23F0 W +23F3 W +2460 24E9 A +24EB 254B A +2550 2573 A +2580 258F A +2592 2595 A +25A0 25A1 A +25A3 25A9 A +25B2 25B3 A +25B6 25B7 A +25BC 25BD A +25C0 25C1 A +25C6 25C8 A +25CB A +25CE 25D1 A +25E2 25E5 A +25EF A +25FD 25FE W +2605 2606 A +2609 A +260E 260F A +2614 2615 W +261C A +261E A +2640 A +2642 A +2648 2653 W +2660 2661 A +2663 2665 A +2667 266A A +266C 266D A +266F A +267F W +2693 W +269E 269F A +26A1 W +26AA 26AB W +26BD 26BE W +26BF A +26C4 26C5 W +26C6 26CD A +26CE W +26CF 26D3 A +26D4 W +26D5 26E1 A +26E3 A +26E8 26E9 A +26EA W +26EB 26F1 A +26F2 26F3 W +26F4 A +26F5 W +26F6 26F9 A +26FA W +26FB 26FC A +26FD W +26FE 26FF A +2705 W +270A 270B W +2728 W +273D A +274C W +274E W +2753 2755 W +2757 W +2776 277F A +2795 2797 W +27B0 W +27BF W +27E6 27ED Na +2985 2986 Na +2B1B 2B1C W +2B50 W +2B55 W +2B56 2B59 A +2E80 2E99 W +2E9B 2EF3 W +2F00 2FD5 W +2FF0 2FFB W +3000 F +3001 303E W +3041 3096 W +3099 30FF W +3105 312E W +3131 318E W +3190 31BA W +31C0 31E3 W +31F0 321E W +3220 3247 W +3248 324F A +3250 32FE W +3300 4DBF W +4E00 A48C W +A490 A4C6 W +A960 A97C W +AC00 D7A3 W +E000 F8FF A +F900 FAFF W +FE00 FE0F A +FE10 FE19 W +FE30 FE52 W +FE54 FE66 W +FE68 FE6B W +FF01 FF60 F +FF61 FFBE H +FFC2 FFC7 H +FFCA FFCF H +FFD2 FFD7 H +FFDA FFDC H +FFE0 FFE6 F +FFE8 FFEE H +FFFD A +16FE0 16FE1 W +17000 187EC W +18800 18AF2 W +1B000 1B11E W +1B170 1B2FB W +1F004 W +1F0CF W +1F100 1F10A A +1F110 1F12D A +1F130 1F169 A +1F170 1F18D A +1F18E W +1F18F 1F190 A +1F191 1F19A W +1F19B 1F1AC A +1F200 1F202 W +1F210 1F23B W +1F240 1F248 W +1F250 1F251 W +1F260 1F265 W +1F300 1F320 W +1F32D 1F335 W +1F337 1F37C W +1F37E 1F393 W +1F3A0 1F3CA W +1F3CF 1F3D3 W +1F3E0 1F3F0 W +1F3F4 W +1F3F8 1F43E W +1F440 W +1F442 1F4FC W +1F4FF 1F53D W +1F54B 1F54E W +1F550 1F567 W +1F57A W +1F595 1F596 W +1F5A4 W +1F5FB 1F64F W +1F680 1F6C5 W +1F6CC W +1F6D0 1F6D2 W +1F6EB 1F6EC W +1F6F4 1F6F8 W +1F910 1F93E W +1F940 1F94C W +1F950 1F96B W +1F980 1F997 W +1F9C0 W +1F9D0 1F9E6 W +20000 2FFFD W +30000 3FFFD W +E0100 E01EF A +F0000 FFFFD A +100000 10FFFD A +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# The mappings in the non-hash portion of this file must be modified to get the +# correct values by adding the code point ordinal number to each one that is +# numeric. + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToUc'}{'format'} = 'ax'; # mapped value in hex; some entries need adjustment +$utf8::SwashInfo{'ToUc'}{'specials_name'} = 'utf8::ToSpecUc'; # Name of hash of special mappings +$utf8::SwashInfo{'ToUc'}{'missing'} = '0'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecUc = ( +"\xC3\x9F" => "\x{0053}\x{0053}", # U+00DF => 0053 0053 +"\xC5\x89" => "\x{02BC}\x{004E}", # U+0149 => 02BC 004E +"\xC7\xB0" => "\x{004A}\x{030C}", # U+01F0 => 004A 030C +"\xCE\x90" => "\x{0399}\x{0308}\x{0301}", # U+0390 => 0399 0308 0301 +"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}", # U+03B0 => 03A5 0308 0301 +"\xD6\x87" => "\x{0535}\x{0552}", # U+0587 => 0535 0552 +"\xE1\xBA\x96" => "\x{0048}\x{0331}", # U+1E96 => 0048 0331 +"\xE1\xBA\x97" => "\x{0054}\x{0308}", # U+1E97 => 0054 0308 +"\xE1\xBA\x98" => "\x{0057}\x{030A}", # U+1E98 => 0057 030A +"\xE1\xBA\x99" => "\x{0059}\x{030A}", # U+1E99 => 0059 030A +"\xE1\xBA\x9A" => "\x{0041}\x{02BE}", # U+1E9A => 0041 02BE +"\xE1\xBD\x90" => "\x{03A5}\x{0313}", # U+1F50 => 03A5 0313 +"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}", # U+1F52 => 03A5 0313 0300 +"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}", # U+1F54 => 03A5 0313 0301 +"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}", # U+1F56 => 03A5 0313 0342 +"\xE1\xBE\x80" => "\x{1F08}\x{0399}", # U+1F80 => 1F08 0399 +"\xE1\xBE\x81" => "\x{1F09}\x{0399}", # U+1F81 => 1F09 0399 +"\xE1\xBE\x82" => "\x{1F0A}\x{0399}", # U+1F82 => 1F0A 0399 +"\xE1\xBE\x83" => "\x{1F0B}\x{0399}", # U+1F83 => 1F0B 0399 +"\xE1\xBE\x84" => "\x{1F0C}\x{0399}", # U+1F84 => 1F0C 0399 +"\xE1\xBE\x85" => "\x{1F0D}\x{0399}", # U+1F85 => 1F0D 0399 +"\xE1\xBE\x86" => "\x{1F0E}\x{0399}", # U+1F86 => 1F0E 0399 +"\xE1\xBE\x87" => "\x{1F0F}\x{0399}", # U+1F87 => 1F0F 0399 +"\xE1\xBE\x88" => "\x{1F08}\x{0399}", # U+1F88 => 1F08 0399 +"\xE1\xBE\x89" => "\x{1F09}\x{0399}", # U+1F89 => 1F09 0399 +"\xE1\xBE\x8A" => "\x{1F0A}\x{0399}", # U+1F8A => 1F0A 0399 +"\xE1\xBE\x8B" => "\x{1F0B}\x{0399}", # U+1F8B => 1F0B 0399 +"\xE1\xBE\x8C" => "\x{1F0C}\x{0399}", # U+1F8C => 1F0C 0399 +"\xE1\xBE\x8D" => "\x{1F0D}\x{0399}", # U+1F8D => 1F0D 0399 +"\xE1\xBE\x8E" => "\x{1F0E}\x{0399}", # U+1F8E => 1F0E 0399 +"\xE1\xBE\x8F" => "\x{1F0F}\x{0399}", # U+1F8F => 1F0F 0399 +"\xE1\xBE\x90" => "\x{1F28}\x{0399}", # U+1F90 => 1F28 0399 +"\xE1\xBE\x91" => "\x{1F29}\x{0399}", # U+1F91 => 1F29 0399 +"\xE1\xBE\x92" => "\x{1F2A}\x{0399}", # U+1F92 => 1F2A 0399 +"\xE1\xBE\x93" => "\x{1F2B}\x{0399}", # U+1F93 => 1F2B 0399 +"\xE1\xBE\x94" => "\x{1F2C}\x{0399}", # U+1F94 => 1F2C 0399 +"\xE1\xBE\x95" => "\x{1F2D}\x{0399}", # U+1F95 => 1F2D 0399 +"\xE1\xBE\x96" => "\x{1F2E}\x{0399}", # U+1F96 => 1F2E 0399 +"\xE1\xBE\x97" => "\x{1F2F}\x{0399}", # U+1F97 => 1F2F 0399 +"\xE1\xBE\x98" => "\x{1F28}\x{0399}", # U+1F98 => 1F28 0399 +"\xE1\xBE\x99" => "\x{1F29}\x{0399}", # U+1F99 => 1F29 0399 +"\xE1\xBE\x9A" => "\x{1F2A}\x{0399}", # U+1F9A => 1F2A 0399 +"\xE1\xBE\x9B" => "\x{1F2B}\x{0399}", # U+1F9B => 1F2B 0399 +"\xE1\xBE\x9C" => "\x{1F2C}\x{0399}", # U+1F9C => 1F2C 0399 +"\xE1\xBE\x9D" => "\x{1F2D}\x{0399}", # U+1F9D => 1F2D 0399 +"\xE1\xBE\x9E" => "\x{1F2E}\x{0399}", # U+1F9E => 1F2E 0399 +"\xE1\xBE\x9F" => "\x{1F2F}\x{0399}", # U+1F9F => 1F2F 0399 +"\xE1\xBE\xA0" => "\x{1F68}\x{0399}", # U+1FA0 => 1F68 0399 +"\xE1\xBE\xA1" => "\x{1F69}\x{0399}", # U+1FA1 => 1F69 0399 +"\xE1\xBE\xA2" => "\x{1F6A}\x{0399}", # U+1FA2 => 1F6A 0399 +"\xE1\xBE\xA3" => "\x{1F6B}\x{0399}", # U+1FA3 => 1F6B 0399 +"\xE1\xBE\xA4" => "\x{1F6C}\x{0399}", # U+1FA4 => 1F6C 0399 +"\xE1\xBE\xA5" => "\x{1F6D}\x{0399}", # U+1FA5 => 1F6D 0399 +"\xE1\xBE\xA6" => "\x{1F6E}\x{0399}", # U+1FA6 => 1F6E 0399 +"\xE1\xBE\xA7" => "\x{1F6F}\x{0399}", # U+1FA7 => 1F6F 0399 +"\xE1\xBE\xA8" => "\x{1F68}\x{0399}", # U+1FA8 => 1F68 0399 +"\xE1\xBE\xA9" => "\x{1F69}\x{0399}", # U+1FA9 => 1F69 0399 +"\xE1\xBE\xAA" => "\x{1F6A}\x{0399}", # U+1FAA => 1F6A 0399 +"\xE1\xBE\xAB" => "\x{1F6B}\x{0399}", # U+1FAB => 1F6B 0399 +"\xE1\xBE\xAC" => "\x{1F6C}\x{0399}", # U+1FAC => 1F6C 0399 +"\xE1\xBE\xAD" => "\x{1F6D}\x{0399}", # U+1FAD => 1F6D 0399 +"\xE1\xBE\xAE" => "\x{1F6E}\x{0399}", # U+1FAE => 1F6E 0399 +"\xE1\xBE\xAF" => "\x{1F6F}\x{0399}", # U+1FAF => 1F6F 0399 +"\xE1\xBE\xB2" => "\x{1FBA}\x{0399}", # U+1FB2 => 1FBA 0399 +"\xE1\xBE\xB3" => "\x{0391}\x{0399}", # U+1FB3 => 0391 0399 +"\xE1\xBE\xB4" => "\x{0386}\x{0399}", # U+1FB4 => 0386 0399 +"\xE1\xBE\xB6" => "\x{0391}\x{0342}", # U+1FB6 => 0391 0342 +"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0399}", # U+1FB7 => 0391 0342 0399 +"\xE1\xBE\xBC" => "\x{0391}\x{0399}", # U+1FBC => 0391 0399 +"\xE1\xBF\x82" => "\x{1FCA}\x{0399}", # U+1FC2 => 1FCA 0399 +"\xE1\xBF\x83" => "\x{0397}\x{0399}", # U+1FC3 => 0397 0399 +"\xE1\xBF\x84" => "\x{0389}\x{0399}", # U+1FC4 => 0389 0399 +"\xE1\xBF\x86" => "\x{0397}\x{0342}", # U+1FC6 => 0397 0342 +"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0399}", # U+1FC7 => 0397 0342 0399 +"\xE1\xBF\x8C" => "\x{0397}\x{0399}", # U+1FCC => 0397 0399 +"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}", # U+1FD2 => 0399 0308 0300 +"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}", # U+1FD3 => 0399 0308 0301 +"\xE1\xBF\x96" => "\x{0399}\x{0342}", # U+1FD6 => 0399 0342 +"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}", # U+1FD7 => 0399 0308 0342 +"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}", # U+1FE2 => 03A5 0308 0300 +"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}", # U+1FE3 => 03A5 0308 0301 +"\xE1\xBF\xA4" => "\x{03A1}\x{0313}", # U+1FE4 => 03A1 0313 +"\xE1\xBF\xA6" => "\x{03A5}\x{0342}", # U+1FE6 => 03A5 0342 +"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}", # U+1FE7 => 03A5 0308 0342 +"\xE1\xBF\xB2" => "\x{1FFA}\x{0399}", # U+1FF2 => 1FFA 0399 +"\xE1\xBF\xB3" => "\x{03A9}\x{0399}", # U+1FF3 => 03A9 0399 +"\xE1\xBF\xB4" => "\x{038F}\x{0399}", # U+1FF4 => 038F 0399 +"\xE1\xBF\xB6" => "\x{03A9}\x{0342}", # U+1FF6 => 03A9 0342 +"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0399}", # U+1FF7 => 03A9 0342 0399 +"\xE1\xBF\xBC" => "\x{03A9}\x{0399}", # U+1FFC => 03A9 0399 +"\xEF\xAC\x80" => "\x{0046}\x{0046}", # U+FB00 => 0046 0046 +"\xEF\xAC\x81" => "\x{0046}\x{0049}", # U+FB01 => 0046 0049 +"\xEF\xAC\x82" => "\x{0046}\x{004C}", # U+FB02 => 0046 004C +"\xEF\xAC\x83" => "\x{0046}\x{0046}\x{0049}", # U+FB03 => 0046 0046 0049 +"\xEF\xAC\x84" => "\x{0046}\x{0046}\x{004C}", # U+FB04 => 0046 0046 004C +"\xEF\xAC\x85" => "\x{0053}\x{0054}", # U+FB05 => 0053 0054 +"\xEF\xAC\x86" => "\x{0053}\x{0054}", # U+FB06 => 0053 0054 +"\xEF\xAC\x93" => "\x{0544}\x{0546}", # U+FB13 => 0544 0546 +"\xEF\xAC\x94" => "\x{0544}\x{0535}", # U+FB14 => 0544 0535 +"\xEF\xAC\x95" => "\x{0544}\x{053B}", # U+FB15 => 0544 053B +"\xEF\xAC\x96" => "\x{054E}\x{0546}", # U+FB16 => 054E 0546 +"\xEF\xAC\x97" => "\x{0544}\x{053D}", # U+FB17 => 0544 053D +); + +return <<'END'; +61 7A 41 +B5 39C +E0 F6 C0 +F8 FE D8 +FF 178 +101 100 +103 102 +105 104 +107 106 +109 108 +10B 10A +10D 10C +10F 10E +111 110 +113 112 +115 114 +117 116 +119 118 +11B 11A +11D 11C +11F 11E +121 120 +123 122 +125 124 +127 126 +129 128 +12B 12A +12D 12C +12F 12E +131 49 +133 132 +135 134 +137 136 +13A 139 +13C 13B +13E 13D +140 13F +142 141 +144 143 +146 145 +148 147 +14B 14A +14D 14C +14F 14E +151 150 +153 152 +155 154 +157 156 +159 158 +15B 15A +15D 15C +15F 15E +161 160 +163 162 +165 164 +167 166 +169 168 +16B 16A +16D 16C +16F 16E +171 170 +173 172 +175 174 +177 176 +17A 179 +17C 17B +17E 17D +17F 53 +180 243 +183 182 +185 184 +188 187 +18C 18B +192 191 +195 1F6 +199 198 +19A 23D +19E 220 +1A1 1A0 +1A3 1A2 +1A5 1A4 +1A8 1A7 +1AD 1AC +1B0 1AF +1B4 1B3 +1B6 1B5 +1B9 1B8 +1BD 1BC +1BF 1F7 +1C5 1C4 +1C6 1C4 +1C8 1C7 +1C9 1C7 +1CB 1CA +1CC 1CA +1CE 1CD +1D0 1CF +1D2 1D1 +1D4 1D3 +1D6 1D5 +1D8 1D7 +1DA 1D9 +1DC 1DB +1DD 18E +1DF 1DE +1E1 1E0 +1E3 1E2 +1E5 1E4 +1E7 1E6 +1E9 1E8 +1EB 1EA +1ED 1EC +1EF 1EE +1F2 1F1 +1F3 1F1 +1F5 1F4 +1F9 1F8 +1FB 1FA +1FD 1FC +1FF 1FE +201 200 +203 202 +205 204 +207 206 +209 208 +20B 20A +20D 20C +20F 20E +211 210 +213 212 +215 214 +217 216 +219 218 +21B 21A +21D 21C +21F 21E +223 222 +225 224 +227 226 +229 228 +22B 22A +22D 22C +22F 22E +231 230 +233 232 +23C 23B +23F 240 2C7E +242 241 +247 246 +249 248 +24B 24A +24D 24C +24F 24E +250 2C6F +251 2C6D +252 2C70 +253 181 +254 186 +256 257 189 +259 18F +25B 190 +25C A7AB +260 193 +261 A7AC +263 194 +265 A78D +266 A7AA +268 197 +269 196 +26A A7AE +26B 2C62 +26C A7AD +26F 19C +271 2C6E +272 19D +275 19F +27D 2C64 +280 1A6 +283 1A9 +287 A7B1 +288 1AE +289 244 +28A 28B 1B1 +28C 245 +292 1B7 +29D A7B2 +29E A7B0 +345 399 +371 370 +373 372 +377 376 +37B 37D 3FD +3AC 386 +3AD 3AF 388 +3B1 3C1 391 +3C2 3A3 +3C3 3CB 3A3 +3CC 38C +3CD 3CE 38E +3D0 392 +3D1 398 +3D5 3A6 +3D6 3A0 +3D7 3CF +3D9 3D8 +3DB 3DA +3DD 3DC +3DF 3DE +3E1 3E0 +3E3 3E2 +3E5 3E4 +3E7 3E6 +3E9 3E8 +3EB 3EA +3ED 3EC +3EF 3EE +3F0 39A +3F1 3A1 +3F2 3F9 +3F3 37F +3F5 395 +3F8 3F7 +3FB 3FA +430 44F 410 +450 45F 400 +461 460 +463 462 +465 464 +467 466 +469 468 +46B 46A +46D 46C +46F 46E +471 470 +473 472 +475 474 +477 476 +479 478 +47B 47A +47D 47C +47F 47E +481 480 +48B 48A +48D 48C +48F 48E +491 490 +493 492 +495 494 +497 496 +499 498 +49B 49A +49D 49C +49F 49E +4A1 4A0 +4A3 4A2 +4A5 4A4 +4A7 4A6 +4A9 4A8 +4AB 4AA +4AD 4AC +4AF 4AE +4B1 4B0 +4B3 4B2 +4B5 4B4 +4B7 4B6 +4B9 4B8 +4BB 4BA +4BD 4BC +4BF 4BE +4C2 4C1 +4C4 4C3 +4C6 4C5 +4C8 4C7 +4CA 4C9 +4CC 4CB +4CE 4CD +4CF 4C0 +4D1 4D0 +4D3 4D2 +4D5 4D4 +4D7 4D6 +4D9 4D8 +4DB 4DA +4DD 4DC +4DF 4DE +4E1 4E0 +4E3 4E2 +4E5 4E4 +4E7 4E6 +4E9 4E8 +4EB 4EA +4ED 4EC +4EF 4EE +4F1 4F0 +4F3 4F2 +4F5 4F4 +4F7 4F6 +4F9 4F8 +4FB 4FA +4FD 4FC +4FF 4FE +501 500 +503 502 +505 504 +507 506 +509 508 +50B 50A +50D 50C +50F 50E +511 510 +513 512 +515 514 +517 516 +519 518 +51B 51A +51D 51C +51F 51E +521 520 +523 522 +525 524 +527 526 +529 528 +52B 52A +52D 52C +52F 52E +561 586 531 +13F8 13FD 13F0 +1C80 412 +1C81 414 +1C82 41E +1C83 1C84 421 +1C85 422 +1C86 42A +1C87 462 +1C88 A64A +1D79 A77D +1D7D 2C63 +1E01 1E00 +1E03 1E02 +1E05 1E04 +1E07 1E06 +1E09 1E08 +1E0B 1E0A +1E0D 1E0C +1E0F 1E0E +1E11 1E10 +1E13 1E12 +1E15 1E14 +1E17 1E16 +1E19 1E18 +1E1B 1E1A +1E1D 1E1C +1E1F 1E1E +1E21 1E20 +1E23 1E22 +1E25 1E24 +1E27 1E26 +1E29 1E28 +1E2B 1E2A +1E2D 1E2C +1E2F 1E2E +1E31 1E30 +1E33 1E32 +1E35 1E34 +1E37 1E36 +1E39 1E38 +1E3B 1E3A +1E3D 1E3C +1E3F 1E3E +1E41 1E40 +1E43 1E42 +1E45 1E44 +1E47 1E46 +1E49 1E48 +1E4B 1E4A +1E4D 1E4C +1E4F 1E4E +1E51 1E50 +1E53 1E52 +1E55 1E54 +1E57 1E56 +1E59 1E58 +1E5B 1E5A +1E5D 1E5C +1E5F 1E5E +1E61 1E60 +1E63 1E62 +1E65 1E64 +1E67 1E66 +1E69 1E68 +1E6B 1E6A +1E6D 1E6C +1E6F 1E6E +1E71 1E70 +1E73 1E72 +1E75 1E74 +1E77 1E76 +1E79 1E78 +1E7B 1E7A +1E7D 1E7C +1E7F 1E7E +1E81 1E80 +1E83 1E82 +1E85 1E84 +1E87 1E86 +1E89 1E88 +1E8B 1E8A +1E8D 1E8C +1E8F 1E8E +1E91 1E90 +1E93 1E92 +1E95 1E94 +1E9B 1E60 +1EA1 1EA0 +1EA3 1EA2 +1EA5 1EA4 +1EA7 1EA6 +1EA9 1EA8 +1EAB 1EAA +1EAD 1EAC +1EAF 1EAE +1EB1 1EB0 +1EB3 1EB2 +1EB5 1EB4 +1EB7 1EB6 +1EB9 1EB8 +1EBB 1EBA +1EBD 1EBC +1EBF 1EBE +1EC1 1EC0 +1EC3 1EC2 +1EC5 1EC4 +1EC7 1EC6 +1EC9 1EC8 +1ECB 1ECA +1ECD 1ECC +1ECF 1ECE +1ED1 1ED0 +1ED3 1ED2 +1ED5 1ED4 +1ED7 1ED6 +1ED9 1ED8 +1EDB 1EDA +1EDD 1EDC +1EDF 1EDE +1EE1 1EE0 +1EE3 1EE2 +1EE5 1EE4 +1EE7 1EE6 +1EE9 1EE8 +1EEB 1EEA +1EED 1EEC +1EEF 1EEE +1EF1 1EF0 +1EF3 1EF2 +1EF5 1EF4 +1EF7 1EF6 +1EF9 1EF8 +1EFB 1EFA +1EFD 1EFC +1EFF 1EFE +1F00 1F07 1F08 +1F10 1F15 1F18 +1F20 1F27 1F28 +1F30 1F37 1F38 +1F40 1F45 1F48 +1F51 1F59 +1F53 1F5B +1F55 1F5D +1F57 1F5F +1F60 1F67 1F68 +1F70 1F71 1FBA +1F72 1F75 1FC8 +1F76 1F77 1FDA +1F78 1F79 1FF8 +1F7A 1F7B 1FEA +1F7C 1F7D 1FFA +1F80 1F87 1F88 +1F90 1F97 1F98 +1FA0 1FA7 1FA8 +1FB0 1FB1 1FB8 +1FB3 1FBC +1FBE 399 +1FC3 1FCC +1FD0 1FD1 1FD8 +1FE0 1FE1 1FE8 +1FE5 1FEC +1FF3 1FFC +214E 2132 +2170 217F 2160 +2184 2183 +24D0 24E9 24B6 +2C30 2C5E 2C00 +2C61 2C60 +2C65 23A +2C66 23E +2C68 2C67 +2C6A 2C69 +2C6C 2C6B +2C73 2C72 +2C76 2C75 +2C81 2C80 +2C83 2C82 +2C85 2C84 +2C87 2C86 +2C89 2C88 +2C8B 2C8A +2C8D 2C8C +2C8F 2C8E +2C91 2C90 +2C93 2C92 +2C95 2C94 +2C97 2C96 +2C99 2C98 +2C9B 2C9A +2C9D 2C9C +2C9F 2C9E +2CA1 2CA0 +2CA3 2CA2 +2CA5 2CA4 +2CA7 2CA6 +2CA9 2CA8 +2CAB 2CAA +2CAD 2CAC +2CAF 2CAE +2CB1 2CB0 +2CB3 2CB2 +2CB5 2CB4 +2CB7 2CB6 +2CB9 2CB8 +2CBB 2CBA +2CBD 2CBC +2CBF 2CBE +2CC1 2CC0 +2CC3 2CC2 +2CC5 2CC4 +2CC7 2CC6 +2CC9 2CC8 +2CCB 2CCA +2CCD 2CCC +2CCF 2CCE +2CD1 2CD0 +2CD3 2CD2 +2CD5 2CD4 +2CD7 2CD6 +2CD9 2CD8 +2CDB 2CDA +2CDD 2CDC +2CDF 2CDE +2CE1 2CE0 +2CE3 2CE2 +2CEC 2CEB +2CEE 2CED +2CF3 2CF2 +2D00 2D25 10A0 +2D27 10C7 +2D2D 10CD +A641 A640 +A643 A642 +A645 A644 +A647 A646 +A649 A648 +A64B A64A +A64D A64C +A64F A64E +A651 A650 +A653 A652 +A655 A654 +A657 A656 +A659 A658 +A65B A65A +A65D A65C +A65F A65E +A661 A660 +A663 A662 +A665 A664 +A667 A666 +A669 A668 +A66B A66A +A66D A66C +A681 A680 +A683 A682 +A685 A684 +A687 A686 +A689 A688 +A68B A68A +A68D A68C +A68F A68E +A691 A690 +A693 A692 +A695 A694 +A697 A696 +A699 A698 +A69B A69A +A723 A722 +A725 A724 +A727 A726 +A729 A728 +A72B A72A +A72D A72C +A72F A72E +A733 A732 +A735 A734 +A737 A736 +A739 A738 +A73B A73A +A73D A73C +A73F A73E +A741 A740 +A743 A742 +A745 A744 +A747 A746 +A749 A748 +A74B A74A +A74D A74C +A74F A74E +A751 A750 +A753 A752 +A755 A754 +A757 A756 +A759 A758 +A75B A75A +A75D A75C +A75F A75E +A761 A760 +A763 A762 +A765 A764 +A767 A766 +A769 A768 +A76B A76A +A76D A76C +A76F A76E +A77A A779 +A77C A77B +A77F A77E +A781 A780 +A783 A782 +A785 A784 +A787 A786 +A78C A78B +A791 A790 +A793 A792 +A797 A796 +A799 A798 +A79B A79A +A79D A79C +A79F A79E +A7A1 A7A0 +A7A3 A7A2 +A7A5 A7A4 +A7A7 A7A6 +A7A9 A7A8 +A7B5 A7B4 +A7B7 A7B6 +AB53 A7B3 +AB70 ABBF 13A0 +FF41 FF5A FF21 +10428 1044F 10400 +104D8 104FB 104B0 +10CC0 10CF2 10C80 +118C0 118DF 118A0 +1E922 1E943 1E900 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToWB'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToWB'}{'missing'} = 'Other'; + +return <<'END'; +A LF +B C Newline +D CR +22 Double_Quote +27 Single_Quote +2C MidNum +2E MidNumLet +30 39 Numeric +3A MidLetter +3B MidNum +41 5A ALetter +5F ExtendNumLet +61 7A ALetter +85 Newline +AA ALetter +AD Format +B5 ALetter +B7 MidLetter +BA ALetter +C0 D6 ALetter +D8 F6 ALetter +F8 2D7 ALetter +2DE 2E4 ALetter +2EC 2FF ALetter +300 36F Extend +370 374 ALetter +376 377 ALetter +37A 37D ALetter +37E MidNum +37F ALetter +386 ALetter +387 MidLetter +388 38A ALetter +38C ALetter +38E 3A1 ALetter +3A3 3F5 ALetter +3F7 481 ALetter +483 489 Extend +48A 52F ALetter +531 556 ALetter +559 ALetter +561 587 ALetter +589 MidNum +591 5BD Extend +5BF Extend +5C1 5C2 Extend +5C4 5C5 Extend +5C7 Extend +5D0 5EA Hebrew_Letter +5F0 5F2 Hebrew_Letter +5F3 ALetter +5F4 MidLetter +600 605 Format +60C 60D MidNum +610 61A Extend +61C Format +620 64A ALetter +64B 65F Extend +660 669 Numeric +66B Numeric +66C MidNum +66E 66F ALetter +670 Extend +671 6D3 ALetter +6D5 ALetter +6D6 6DC Extend +6DD Format +6DF 6E4 Extend +6E5 6E6 ALetter +6E7 6E8 Extend +6EA 6ED Extend +6EE 6EF ALetter +6F0 6F9 Numeric +6FA 6FC ALetter +6FF ALetter +70F Format +710 ALetter +711 Extend +712 72F ALetter +730 74A Extend +74D 7A5 ALetter +7A6 7B0 Extend +7B1 ALetter +7C0 7C9 Numeric +7CA 7EA ALetter +7EB 7F3 Extend +7F4 7F5 ALetter +7F8 MidNum +7FA ALetter +800 815 ALetter +816 819 Extend +81A ALetter +81B 823 Extend +824 ALetter +825 827 Extend +828 ALetter +829 82D Extend +840 858 ALetter +859 85B Extend +860 86A ALetter +8A0 8B4 ALetter +8B6 8BD ALetter +8D4 8E1 Extend +8E2 Format +8E3 903 Extend +904 939 ALetter +93A 93C Extend +93D ALetter +93E 94F Extend +950 ALetter +951 957 Extend +958 961 ALetter +962 963 Extend +966 96F Numeric +971 980 ALetter +981 983 Extend +985 98C ALetter +98F 990 ALetter +993 9A8 ALetter +9AA 9B0 ALetter +9B2 ALetter +9B6 9B9 ALetter +9BC Extend +9BD ALetter +9BE 9C4 Extend +9C7 9C8 Extend +9CB 9CD Extend +9CE ALetter +9D7 Extend +9DC 9DD ALetter +9DF 9E1 ALetter +9E2 9E3 Extend +9E6 9EF Numeric +9F0 9F1 ALetter +9FC ALetter +A01 A03 Extend +A05 A0A ALetter +A0F A10 ALetter +A13 A28 ALetter +A2A A30 ALetter +A32 A33 ALetter +A35 A36 ALetter +A38 A39 ALetter +A3C Extend +A3E A42 Extend +A47 A48 Extend +A4B A4D Extend +A51 Extend +A59 A5C ALetter +A5E ALetter +A66 A6F Numeric +A70 A71 Extend +A72 A74 ALetter +A75 Extend +A81 A83 Extend +A85 A8D ALetter +A8F A91 ALetter +A93 AA8 ALetter +AAA AB0 ALetter +AB2 AB3 ALetter +AB5 AB9 ALetter +ABC Extend +ABD ALetter +ABE AC5 Extend +AC7 AC9 Extend +ACB ACD Extend +AD0 ALetter +AE0 AE1 ALetter +AE2 AE3 Extend +AE6 AEF Numeric +AF9 ALetter +AFA AFF Extend +B01 B03 Extend +B05 B0C ALetter +B0F B10 ALetter +B13 B28 ALetter +B2A B30 ALetter +B32 B33 ALetter +B35 B39 ALetter +B3C Extend +B3D ALetter +B3E B44 Extend +B47 B48 Extend +B4B B4D Extend +B56 B57 Extend +B5C B5D ALetter +B5F B61 ALetter +B62 B63 Extend +B66 B6F Numeric +B71 ALetter +B82 Extend +B83 ALetter +B85 B8A ALetter +B8E B90 ALetter +B92 B95 ALetter +B99 B9A ALetter +B9C ALetter +B9E B9F ALetter +BA3 BA4 ALetter +BA8 BAA ALetter +BAE BB9 ALetter +BBE BC2 Extend +BC6 BC8 Extend +BCA BCD Extend +BD0 ALetter +BD7 Extend +BE6 BEF Numeric +C00 C03 Extend +C05 C0C ALetter +C0E C10 ALetter +C12 C28 ALetter +C2A C39 ALetter +C3D ALetter +C3E C44 Extend +C46 C48 Extend +C4A C4D Extend +C55 C56 Extend +C58 C5A ALetter +C60 C61 ALetter +C62 C63 Extend +C66 C6F Numeric +C80 ALetter +C81 C83 Extend +C85 C8C ALetter +C8E C90 ALetter +C92 CA8 ALetter +CAA CB3 ALetter +CB5 CB9 ALetter +CBC Extend +CBD ALetter +CBE CC4 Extend +CC6 CC8 Extend +CCA CCD Extend +CD5 CD6 Extend +CDE ALetter +CE0 CE1 ALetter +CE2 CE3 Extend +CE6 CEF Numeric +CF1 CF2 ALetter +D00 D03 Extend +D05 D0C ALetter +D0E D10 ALetter +D12 D3A ALetter +D3B D3C Extend +D3D ALetter +D3E D44 Extend +D46 D48 Extend +D4A D4D Extend +D4E ALetter +D54 D56 ALetter +D57 Extend +D5F D61 ALetter +D62 D63 Extend +D66 D6F Numeric +D7A D7F ALetter +D82 D83 Extend +D85 D96 ALetter +D9A DB1 ALetter +DB3 DBB ALetter +DBD ALetter +DC0 DC6 ALetter +DCA Extend +DCF DD4 Extend +DD6 Extend +DD8 DDF Extend +DE6 DEF Numeric +DF2 DF3 Extend +E31 Extend +E34 E3A Extend +E47 E4E Extend +E50 E59 Numeric +EB1 Extend +EB4 EB9 Extend +EBB EBC Extend +EC8 ECD Extend +ED0 ED9 Numeric +F00 ALetter +F18 F19 Extend +F20 F29 Numeric +F35 Extend +F37 Extend +F39 Extend +F3E F3F Extend +F40 F47 ALetter +F49 F6C ALetter +F71 F84 Extend +F86 F87 Extend +F88 F8C ALetter +F8D F97 Extend +F99 FBC Extend +FC6 Extend +102B 103E Extend +1040 1049 Numeric +1056 1059 Extend +105E 1060 Extend +1062 1064 Extend +1067 106D Extend +1071 1074 Extend +1082 108D Extend +108F Extend +1090 1099 Numeric +109A 109D Extend +10A0 10C5 ALetter +10C7 ALetter +10CD ALetter +10D0 10FA ALetter +10FC 1248 ALetter +124A 124D ALetter +1250 1256 ALetter +1258 ALetter +125A 125D ALetter +1260 1288 ALetter +128A 128D ALetter +1290 12B0 ALetter +12B2 12B5 ALetter +12B8 12BE ALetter +12C0 ALetter +12C2 12C5 ALetter +12C8 12D6 ALetter +12D8 1310 ALetter +1312 1315 ALetter +1318 135A ALetter +135D 135F Extend +1380 138F ALetter +13A0 13F5 ALetter +13F8 13FD ALetter +1401 166C ALetter +166F 167F ALetter +1681 169A ALetter +16A0 16EA ALetter +16EE 16F8 ALetter +1700 170C ALetter +170E 1711 ALetter +1712 1714 Extend +1720 1731 ALetter +1732 1734 Extend +1740 1751 ALetter +1752 1753 Extend +1760 176C ALetter +176E 1770 ALetter +1772 1773 Extend +17B4 17D3 Extend +17DD Extend +17E0 17E9 Numeric +180B 180D Extend +180E Format +1810 1819 Numeric +1820 1877 ALetter +1880 1884 ALetter +1885 1886 Extend +1887 18A8 ALetter +18A9 Extend +18AA ALetter +18B0 18F5 ALetter +1900 191E ALetter +1920 192B Extend +1930 193B Extend +1946 194F Numeric +19D0 19D9 Numeric +1A00 1A16 ALetter +1A17 1A1B Extend +1A55 1A5E Extend +1A60 1A7C Extend +1A7F Extend +1A80 1A89 Numeric +1A90 1A99 Numeric +1AB0 1ABE Extend +1B00 1B04 Extend +1B05 1B33 ALetter +1B34 1B44 Extend +1B45 1B4B ALetter +1B50 1B59 Numeric +1B6B 1B73 Extend +1B80 1B82 Extend +1B83 1BA0 ALetter +1BA1 1BAD Extend +1BAE 1BAF ALetter +1BB0 1BB9 Numeric +1BBA 1BE5 ALetter +1BE6 1BF3 Extend +1C00 1C23 ALetter +1C24 1C37 Extend +1C40 1C49 Numeric +1C4D 1C4F ALetter +1C50 1C59 Numeric +1C5A 1C7D ALetter +1C80 1C88 ALetter +1CD0 1CD2 Extend +1CD4 1CE8 Extend +1CE9 1CEC ALetter +1CED Extend +1CEE 1CF1 ALetter +1CF2 1CF4 Extend +1CF5 1CF6 ALetter +1CF7 1CF9 Extend +1D00 1DBF ALetter +1DC0 1DF9 Extend +1DFB 1DFF Extend +1E00 1F15 ALetter +1F18 1F1D ALetter +1F20 1F45 ALetter +1F48 1F4D ALetter +1F50 1F57 ALetter +1F59 ALetter +1F5B ALetter +1F5D ALetter +1F5F 1F7D ALetter +1F80 1FB4 ALetter +1FB6 1FBC ALetter +1FBE ALetter +1FC2 1FC4 ALetter +1FC6 1FCC ALetter +1FD0 1FD3 ALetter +1FD6 1FDB ALetter +1FE0 1FEC ALetter +1FF2 1FF4 ALetter +1FF6 1FFC ALetter +200C Extend +200D ZWJ +200E 200F Format +2018 2019 MidNumLet +2024 MidNumLet +2027 MidLetter +2028 2029 Newline +202A 202E Format +202F ExtendNumLet +203F 2040 ExtendNumLet +2044 MidNum +2054 ExtendNumLet +2060 2064 Format +2066 206F Format +2071 ALetter +207F ALetter +2090 209C ALetter +20D0 20F0 Extend +2102 ALetter +2107 ALetter +210A 2113 ALetter +2115 ALetter +2119 211D ALetter +2124 ALetter +2126 ALetter +2128 ALetter +212A 212D ALetter +212F 2139 ALetter +213C 213F ALetter +2145 2149 ALetter +214E ALetter +2160 2188 ALetter +24B6 24E9 ALetter +261D E_Base +2640 Glue_After_Zwj +2642 Glue_After_Zwj +2695 2696 Glue_After_Zwj +26F9 E_Base +2708 Glue_After_Zwj +270A 270D E_Base +2764 Glue_After_Zwj +2C00 2C2E ALetter +2C30 2C5E ALetter +2C60 2CE4 ALetter +2CEB 2CEE ALetter +2CEF 2CF1 Extend +2CF2 2CF3 ALetter +2D00 2D25 ALetter +2D27 ALetter +2D2D ALetter +2D30 2D67 ALetter +2D6F ALetter +2D7F Extend +2D80 2D96 ALetter +2DA0 2DA6 ALetter +2DA8 2DAE ALetter +2DB0 2DB6 ALetter +2DB8 2DBE ALetter +2DC0 2DC6 ALetter +2DC8 2DCE ALetter +2DD0 2DD6 ALetter +2DD8 2DDE ALetter +2DE0 2DFF Extend +2E2F ALetter +3005 ALetter +302A 302F Extend +3031 3035 Katakana +303B 303C ALetter +3099 309A Extend +309B 309C Katakana +30A0 30FA Katakana +30FC 30FF Katakana +3105 312E ALetter +3131 318E ALetter +31A0 31BA ALetter +31F0 31FF Katakana +32D0 32FE Katakana +3300 3357 Katakana +A000 A48C ALetter +A4D0 A4FD ALetter +A500 A60C ALetter +A610 A61F ALetter +A620 A629 Numeric +A62A A62B ALetter +A640 A66E ALetter +A66F A672 Extend +A674 A67D Extend +A67F A69D ALetter +A69E A69F Extend +A6A0 A6EF ALetter +A6F0 A6F1 Extend +A717 A7AE ALetter +A7B0 A7B7 ALetter +A7F7 A801 ALetter +A802 Extend +A803 A805 ALetter +A806 Extend +A807 A80A ALetter +A80B Extend +A80C A822 ALetter +A823 A827 Extend +A840 A873 ALetter +A880 A881 Extend +A882 A8B3 ALetter +A8B4 A8C5 Extend +A8D0 A8D9 Numeric +A8E0 A8F1 Extend +A8F2 A8F7 ALetter +A8FB ALetter +A8FD ALetter +A900 A909 Numeric +A90A A925 ALetter +A926 A92D Extend +A930 A946 ALetter +A947 A953 Extend +A960 A97C ALetter +A980 A983 Extend +A984 A9B2 ALetter +A9B3 A9C0 Extend +A9CF ALetter +A9D0 A9D9 Numeric +A9E5 Extend +A9F0 A9F9 Numeric +AA00 AA28 ALetter +AA29 AA36 Extend +AA40 AA42 ALetter +AA43 Extend +AA44 AA4B ALetter +AA4C AA4D Extend +AA50 AA59 Numeric +AA7B AA7D Extend +AAB0 Extend +AAB2 AAB4 Extend +AAB7 AAB8 Extend +AABE AABF Extend +AAC1 Extend +AAE0 AAEA ALetter +AAEB AAEF Extend +AAF2 AAF4 ALetter +AAF5 AAF6 Extend +AB01 AB06 ALetter +AB09 AB0E ALetter +AB11 AB16 ALetter +AB20 AB26 ALetter +AB28 AB2E ALetter +AB30 AB65 ALetter +AB70 ABE2 ALetter +ABE3 ABEA Extend +ABEC ABED Extend +ABF0 ABF9 Numeric +AC00 D7A3 ALetter +D7B0 D7C6 ALetter +D7CB D7FB ALetter +FB00 FB06 ALetter +FB13 FB17 ALetter +FB1D Hebrew_Letter +FB1E Extend +FB1F FB28 Hebrew_Letter +FB2A FB36 Hebrew_Letter +FB38 FB3C Hebrew_Letter +FB3E Hebrew_Letter +FB40 FB41 Hebrew_Letter +FB43 FB44 Hebrew_Letter +FB46 FB4F Hebrew_Letter +FB50 FBB1 ALetter +FBD3 FD3D ALetter +FD50 FD8F ALetter +FD92 FDC7 ALetter +FDF0 FDFB ALetter +FE00 FE0F Extend +FE10 MidNum +FE13 MidLetter +FE14 MidNum +FE20 FE2F Extend +FE33 FE34 ExtendNumLet +FE4D FE4F ExtendNumLet +FE50 MidNum +FE52 MidNumLet +FE54 MidNum +FE55 MidLetter +FE70 FE74 ALetter +FE76 FEFC ALetter +FEFF Format +FF07 MidNumLet +FF0C MidNum +FF0E MidNumLet +FF1A MidLetter +FF1B MidNum +FF21 FF3A ALetter +FF3F ExtendNumLet +FF41 FF5A ALetter +FF66 FF9D Katakana +FF9E FF9F Extend +FFA0 FFBE ALetter +FFC2 FFC7 ALetter +FFCA FFCF ALetter +FFD2 FFD7 ALetter +FFDA FFDC ALetter +FFF9 FFFB Format +10000 1000B ALetter +1000D 10026 ALetter +10028 1003A ALetter +1003C 1003D ALetter +1003F 1004D ALetter +10050 1005D ALetter +10080 100FA ALetter +10140 10174 ALetter +101FD Extend +10280 1029C ALetter +102A0 102D0 ALetter +102E0 Extend +10300 1031F ALetter +1032D 1034A ALetter +10350 10375 ALetter +10376 1037A Extend +10380 1039D ALetter +103A0 103C3 ALetter +103C8 103CF ALetter +103D1 103D5 ALetter +10400 1049D ALetter +104A0 104A9 Numeric +104B0 104D3 ALetter +104D8 104FB ALetter +10500 10527 ALetter +10530 10563 ALetter +10600 10736 ALetter +10740 10755 ALetter +10760 10767 ALetter +10800 10805 ALetter +10808 ALetter +1080A 10835 ALetter +10837 10838 ALetter +1083C ALetter +1083F 10855 ALetter +10860 10876 ALetter +10880 1089E ALetter +108E0 108F2 ALetter +108F4 108F5 ALetter +10900 10915 ALetter +10920 10939 ALetter +10980 109B7 ALetter +109BE 109BF ALetter +10A00 ALetter +10A01 10A03 Extend +10A05 10A06 Extend +10A0C 10A0F Extend +10A10 10A13 ALetter +10A15 10A17 ALetter +10A19 10A33 ALetter +10A38 10A3A Extend +10A3F Extend +10A60 10A7C ALetter +10A80 10A9C ALetter +10AC0 10AC7 ALetter +10AC9 10AE4 ALetter +10AE5 10AE6 Extend +10B00 10B35 ALetter +10B40 10B55 ALetter +10B60 10B72 ALetter +10B80 10B91 ALetter +10C00 10C48 ALetter +10C80 10CB2 ALetter +10CC0 10CF2 ALetter +11000 11002 Extend +11003 11037 ALetter +11038 11046 Extend +11066 1106F Numeric +1107F 11082 Extend +11083 110AF ALetter +110B0 110BA Extend +110BD Format +110D0 110E8 ALetter +110F0 110F9 Numeric +11100 11102 Extend +11103 11126 ALetter +11127 11134 Extend +11136 1113F Numeric +11150 11172 ALetter +11173 Extend +11176 ALetter +11180 11182 Extend +11183 111B2 ALetter +111B3 111C0 Extend +111C1 111C4 ALetter +111CA 111CC Extend +111D0 111D9 Numeric +111DA ALetter +111DC ALetter +11200 11211 ALetter +11213 1122B ALetter +1122C 11237 Extend +1123E Extend +11280 11286 ALetter +11288 ALetter +1128A 1128D ALetter +1128F 1129D ALetter +1129F 112A8 ALetter +112B0 112DE ALetter +112DF 112EA Extend +112F0 112F9 Numeric +11300 11303 Extend +11305 1130C ALetter +1130F 11310 ALetter +11313 11328 ALetter +1132A 11330 ALetter +11332 11333 ALetter +11335 11339 ALetter +1133C Extend +1133D ALetter +1133E 11344 Extend +11347 11348 Extend +1134B 1134D Extend +11350 ALetter +11357 Extend +1135D 11361 ALetter +11362 11363 Extend +11366 1136C Extend +11370 11374 Extend +11400 11434 ALetter +11435 11446 Extend +11447 1144A ALetter +11450 11459 Numeric +11480 114AF ALetter +114B0 114C3 Extend +114C4 114C5 ALetter +114C7 ALetter +114D0 114D9 Numeric +11580 115AE ALetter +115AF 115B5 Extend +115B8 115C0 Extend +115D8 115DB ALetter +115DC 115DD Extend +11600 1162F ALetter +11630 11640 Extend +11644 ALetter +11650 11659 Numeric +11680 116AA ALetter +116AB 116B7 Extend +116C0 116C9 Numeric +1171D 1172B Extend +11730 11739 Numeric +118A0 118DF ALetter +118E0 118E9 Numeric +118FF ALetter +11A00 ALetter +11A01 11A0A Extend +11A0B 11A32 ALetter +11A33 11A39 Extend +11A3A ALetter +11A3B 11A3E Extend +11A47 Extend +11A50 ALetter +11A51 11A5B Extend +11A5C 11A83 ALetter +11A86 11A89 ALetter +11A8A 11A99 Extend +11AC0 11AF8 ALetter +11C00 11C08 ALetter +11C0A 11C2E ALetter +11C2F 11C36 Extend +11C38 11C3F Extend +11C40 ALetter +11C50 11C59 Numeric +11C72 11C8F ALetter +11C92 11CA7 Extend +11CA9 11CB6 Extend +11D00 11D06 ALetter +11D08 11D09 ALetter +11D0B 11D30 ALetter +11D31 11D36 Extend +11D3A Extend +11D3C 11D3D Extend +11D3F 11D45 Extend +11D46 ALetter +11D47 Extend +11D50 11D59 Numeric +12000 12399 ALetter +12400 1246E ALetter +12480 12543 ALetter +13000 1342E ALetter +14400 14646 ALetter +16800 16A38 ALetter +16A40 16A5E ALetter +16A60 16A69 Numeric +16AD0 16AED ALetter +16AF0 16AF4 Extend +16B00 16B2F ALetter +16B30 16B36 Extend +16B40 16B43 ALetter +16B50 16B59 Numeric +16B63 16B77 ALetter +16B7D 16B8F ALetter +16F00 16F44 ALetter +16F50 ALetter +16F51 16F7E Extend +16F8F 16F92 Extend +16F93 16F9F ALetter +16FE0 16FE1 ALetter +1B000 Katakana +1BC00 1BC6A ALetter +1BC70 1BC7C ALetter +1BC80 1BC88 ALetter +1BC90 1BC99 ALetter +1BC9D 1BC9E Extend +1BCA0 1BCA3 Format +1D165 1D169 Extend +1D16D 1D172 Extend +1D173 1D17A Format +1D17B 1D182 Extend +1D185 1D18B Extend +1D1AA 1D1AD Extend +1D242 1D244 Extend +1D400 1D454 ALetter +1D456 1D49C ALetter +1D49E 1D49F ALetter +1D4A2 ALetter +1D4A5 1D4A6 ALetter +1D4A9 1D4AC ALetter +1D4AE 1D4B9 ALetter +1D4BB ALetter +1D4BD 1D4C3 ALetter +1D4C5 1D505 ALetter +1D507 1D50A ALetter +1D50D 1D514 ALetter +1D516 1D51C ALetter +1D51E 1D539 ALetter +1D53B 1D53E ALetter +1D540 1D544 ALetter +1D546 ALetter +1D54A 1D550 ALetter +1D552 1D6A5 ALetter +1D6A8 1D6C0 ALetter +1D6C2 1D6DA ALetter +1D6DC 1D6FA ALetter +1D6FC 1D714 ALetter +1D716 1D734 ALetter +1D736 1D74E ALetter +1D750 1D76E ALetter +1D770 1D788 ALetter +1D78A 1D7A8 ALetter +1D7AA 1D7C2 ALetter +1D7C4 1D7CB ALetter +1D7CE 1D7FF Numeric +1DA00 1DA36 Extend +1DA3B 1DA6C Extend +1DA75 Extend +1DA84 Extend +1DA9B 1DA9F Extend +1DAA1 1DAAF Extend +1E000 1E006 Extend +1E008 1E018 Extend +1E01B 1E021 Extend +1E023 1E024 Extend +1E026 1E02A Extend +1E800 1E8C4 ALetter +1E8D0 1E8D6 Extend +1E900 1E943 ALetter +1E944 1E94A Extend +1E950 1E959 Numeric +1EE00 1EE03 ALetter +1EE05 1EE1F ALetter +1EE21 1EE22 ALetter +1EE24 ALetter +1EE27 ALetter +1EE29 1EE32 ALetter +1EE34 1EE37 ALetter +1EE39 ALetter +1EE3B ALetter +1EE42 ALetter +1EE47 ALetter +1EE49 ALetter +1EE4B ALetter +1EE4D 1EE4F ALetter +1EE51 1EE52 ALetter +1EE54 ALetter +1EE57 ALetter +1EE59 ALetter +1EE5B ALetter +1EE5D ALetter +1EE5F ALetter +1EE61 1EE62 ALetter +1EE64 ALetter +1EE67 1EE6A ALetter +1EE6C 1EE72 ALetter +1EE74 1EE77 ALetter +1EE79 1EE7C ALetter +1EE7E ALetter +1EE80 1EE89 ALetter +1EE8B 1EE9B ALetter +1EEA1 1EEA3 ALetter +1EEA5 1EEA9 ALetter +1EEAB 1EEBB ALetter +1F130 1F149 ALetter +1F150 1F169 ALetter +1F170 1F189 ALetter +1F1E6 1F1FF Regional_Indicator +1F308 Glue_After_Zwj +1F33E Glue_After_Zwj +1F373 Glue_After_Zwj +1F385 E_Base +1F393 Glue_After_Zwj +1F3A4 Glue_After_Zwj +1F3A8 Glue_After_Zwj +1F3C2 1F3C4 E_Base +1F3C7 E_Base +1F3CA 1F3CC E_Base +1F3EB Glue_After_Zwj +1F3ED Glue_After_Zwj +1F3FB 1F3FF E_Modifier +1F442 1F443 E_Base +1F446 1F450 E_Base +1F466 1F469 E_Base_GAZ +1F46E E_Base +1F470 1F478 E_Base +1F47C E_Base +1F481 1F483 E_Base +1F485 1F487 E_Base +1F48B Glue_After_Zwj +1F4AA E_Base +1F4BB 1F4BC Glue_After_Zwj +1F527 Glue_After_Zwj +1F52C Glue_After_Zwj +1F574 1F575 E_Base +1F57A E_Base +1F590 E_Base +1F595 1F596 E_Base +1F5E8 Glue_After_Zwj +1F645 1F647 E_Base +1F64B 1F64F E_Base +1F680 Glue_After_Zwj +1F692 Glue_After_Zwj +1F6A3 E_Base +1F6B4 1F6B6 E_Base +1F6C0 E_Base +1F6CC E_Base +1F918 1F91C E_Base +1F91E 1F91F E_Base +1F926 E_Base +1F930 1F939 E_Base +1F93D 1F93E E_Base +1F9D1 1F9DD E_Base +E0001 Format +E0020 E007F Extend +E0100 E01EF Extend +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToGc'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToGc'}{'missing'} = 'Cn'; + +return <<'END'; +0 1F Cc +20 Zs +21 23 Po +24 Sc +25 27 Po +28 Ps +29 Pe +2A Po +2B Sm +2C Po +2D Pd +2E 2F Po +30 39 Nd +3A 3B Po +3C 3E Sm +3F 40 Po +41 5A Lu +5B Ps +5C Po +5D Pe +5E Sk +5F Pc +60 Sk +61 7A Ll +7B Ps +7C Sm +7D Pe +7E Sm +7F 9F Cc +A0 Zs +A1 Po +A2 A5 Sc +A6 So +A7 Po +A8 Sk +A9 So +AA Lo +AB Pi +AC Sm +AD Cf +AE So +AF Sk +B0 So +B1 Sm +B2 B3 No +B4 Sk +B5 Ll +B6 B7 Po +B8 Sk +B9 No +BA Lo +BB Pf +BC BE No +BF Po +C0 D6 Lu +D7 Sm +D8 DE Lu +DF F6 Ll +F7 Sm +F8 FF Ll +100 Lu +101 Ll +102 Lu +103 Ll +104 Lu +105 Ll +106 Lu +107 Ll +108 Lu +109 Ll +10A Lu +10B Ll +10C Lu +10D Ll +10E Lu +10F Ll +110 Lu +111 Ll +112 Lu +113 Ll +114 Lu +115 Ll +116 Lu +117 Ll +118 Lu +119 Ll +11A Lu +11B Ll +11C Lu +11D Ll +11E Lu +11F Ll +120 Lu +121 Ll +122 Lu +123 Ll +124 Lu +125 Ll +126 Lu +127 Ll +128 Lu +129 Ll +12A Lu +12B Ll +12C Lu +12D Ll +12E Lu +12F Ll +130 Lu +131 Ll +132 Lu +133 Ll +134 Lu +135 Ll +136 Lu +137 138 Ll +139 Lu +13A Ll +13B Lu +13C Ll +13D Lu +13E Ll +13F Lu +140 Ll +141 Lu +142 Ll +143 Lu +144 Ll +145 Lu +146 Ll +147 Lu +148 149 Ll +14A Lu +14B Ll +14C Lu +14D Ll +14E Lu +14F Ll +150 Lu +151 Ll +152 Lu +153 Ll +154 Lu +155 Ll +156 Lu +157 Ll +158 Lu +159 Ll +15A Lu +15B Ll +15C Lu +15D Ll +15E Lu +15F Ll +160 Lu +161 Ll +162 Lu +163 Ll +164 Lu +165 Ll +166 Lu +167 Ll +168 Lu +169 Ll +16A Lu +16B Ll +16C Lu +16D Ll +16E Lu +16F Ll +170 Lu +171 Ll +172 Lu +173 Ll +174 Lu +175 Ll +176 Lu +177 Ll +178 179 Lu +17A Ll +17B Lu +17C Ll +17D Lu +17E 180 Ll +181 182 Lu +183 Ll +184 Lu +185 Ll +186 187 Lu +188 Ll +189 18B Lu +18C 18D Ll +18E 191 Lu +192 Ll +193 194 Lu +195 Ll +196 198 Lu +199 19B Ll +19C 19D Lu +19E Ll +19F 1A0 Lu +1A1 Ll +1A2 Lu +1A3 Ll +1A4 Lu +1A5 Ll +1A6 1A7 Lu +1A8 Ll +1A9 Lu +1AA 1AB Ll +1AC Lu +1AD Ll +1AE 1AF Lu +1B0 Ll +1B1 1B3 Lu +1B4 Ll +1B5 Lu +1B6 Ll +1B7 1B8 Lu +1B9 1BA Ll +1BB Lo +1BC Lu +1BD 1BF Ll +1C0 1C3 Lo +1C4 Lu +1C5 Lt +1C6 Ll +1C7 Lu +1C8 Lt +1C9 Ll +1CA Lu +1CB Lt +1CC Ll +1CD Lu +1CE Ll +1CF Lu +1D0 Ll +1D1 Lu +1D2 Ll +1D3 Lu +1D4 Ll +1D5 Lu +1D6 Ll +1D7 Lu +1D8 Ll +1D9 Lu +1DA Ll +1DB Lu +1DC 1DD Ll +1DE Lu +1DF Ll +1E0 Lu +1E1 Ll +1E2 Lu +1E3 Ll +1E4 Lu +1E5 Ll +1E6 Lu +1E7 Ll +1E8 Lu +1E9 Ll +1EA Lu +1EB Ll +1EC Lu +1ED Ll +1EE Lu +1EF 1F0 Ll +1F1 Lu +1F2 Lt +1F3 Ll +1F4 Lu +1F5 Ll +1F6 1F8 Lu +1F9 Ll +1FA Lu +1FB Ll +1FC Lu +1FD Ll +1FE Lu +1FF Ll +200 Lu +201 Ll +202 Lu +203 Ll +204 Lu +205 Ll +206 Lu +207 Ll +208 Lu +209 Ll +20A Lu +20B Ll +20C Lu +20D Ll +20E Lu +20F Ll +210 Lu +211 Ll +212 Lu +213 Ll +214 Lu +215 Ll +216 Lu +217 Ll +218 Lu +219 Ll +21A Lu +21B Ll +21C Lu +21D Ll +21E Lu +21F Ll +220 Lu +221 Ll +222 Lu +223 Ll +224 Lu +225 Ll +226 Lu +227 Ll +228 Lu +229 Ll +22A Lu +22B Ll +22C Lu +22D Ll +22E Lu +22F Ll +230 Lu +231 Ll +232 Lu +233 239 Ll +23A 23B Lu +23C Ll +23D 23E Lu +23F 240 Ll +241 Lu +242 Ll +243 246 Lu +247 Ll +248 Lu +249 Ll +24A Lu +24B Ll +24C Lu +24D Ll +24E Lu +24F 293 Ll +294 Lo +295 2AF Ll +2B0 2C1 Lm +2C2 2C5 Sk +2C6 2D1 Lm +2D2 2DF Sk +2E0 2E4 Lm +2E5 2EB Sk +2EC Lm +2ED Sk +2EE Lm +2EF 2FF Sk +300 36F Mn +370 Lu +371 Ll +372 Lu +373 Ll +374 Lm +375 Sk +376 Lu +377 Ll +37A Lm +37B 37D Ll +37E Po +37F Lu +384 385 Sk +386 Lu +387 Po +388 38A Lu +38C Lu +38E 38F Lu +390 Ll +391 3A1 Lu +3A3 3AB Lu +3AC 3CE Ll +3CF Lu +3D0 3D1 Ll +3D2 3D4 Lu +3D5 3D7 Ll +3D8 Lu +3D9 Ll +3DA Lu +3DB Ll +3DC Lu +3DD Ll +3DE Lu +3DF Ll +3E0 Lu +3E1 Ll +3E2 Lu +3E3 Ll +3E4 Lu +3E5 Ll +3E6 Lu +3E7 Ll +3E8 Lu +3E9 Ll +3EA Lu +3EB Ll +3EC Lu +3ED Ll +3EE Lu +3EF 3F3 Ll +3F4 Lu +3F5 Ll +3F6 Sm +3F7 Lu +3F8 Ll +3F9 3FA Lu +3FB 3FC Ll +3FD 42F Lu +430 45F Ll +460 Lu +461 Ll +462 Lu +463 Ll +464 Lu +465 Ll +466 Lu +467 Ll +468 Lu +469 Ll +46A Lu +46B Ll +46C Lu +46D Ll +46E Lu +46F Ll +470 Lu +471 Ll +472 Lu +473 Ll +474 Lu +475 Ll +476 Lu +477 Ll +478 Lu +479 Ll +47A Lu +47B Ll +47C Lu +47D Ll +47E Lu +47F Ll +480 Lu +481 Ll +482 So +483 487 Mn +488 489 Me +48A Lu +48B Ll +48C Lu +48D Ll +48E Lu +48F Ll +490 Lu +491 Ll +492 Lu +493 Ll +494 Lu +495 Ll +496 Lu +497 Ll +498 Lu +499 Ll +49A Lu +49B Ll +49C Lu +49D Ll +49E Lu +49F Ll +4A0 Lu +4A1 Ll +4A2 Lu +4A3 Ll +4A4 Lu +4A5 Ll +4A6 Lu +4A7 Ll +4A8 Lu +4A9 Ll +4AA Lu +4AB Ll +4AC Lu +4AD Ll +4AE Lu +4AF Ll +4B0 Lu +4B1 Ll +4B2 Lu +4B3 Ll +4B4 Lu +4B5 Ll +4B6 Lu +4B7 Ll +4B8 Lu +4B9 Ll +4BA Lu +4BB Ll +4BC Lu +4BD Ll +4BE Lu +4BF Ll +4C0 4C1 Lu +4C2 Ll +4C3 Lu +4C4 Ll +4C5 Lu +4C6 Ll +4C7 Lu +4C8 Ll +4C9 Lu +4CA Ll +4CB Lu +4CC Ll +4CD Lu +4CE 4CF Ll +4D0 Lu +4D1 Ll +4D2 Lu +4D3 Ll +4D4 Lu +4D5 Ll +4D6 Lu +4D7 Ll +4D8 Lu +4D9 Ll +4DA Lu +4DB Ll +4DC Lu +4DD Ll +4DE Lu +4DF Ll +4E0 Lu +4E1 Ll +4E2 Lu +4E3 Ll +4E4 Lu +4E5 Ll +4E6 Lu +4E7 Ll +4E8 Lu +4E9 Ll +4EA Lu +4EB Ll +4EC Lu +4ED Ll +4EE Lu +4EF Ll +4F0 Lu +4F1 Ll +4F2 Lu +4F3 Ll +4F4 Lu +4F5 Ll +4F6 Lu +4F7 Ll +4F8 Lu +4F9 Ll +4FA Lu +4FB Ll +4FC Lu +4FD Ll +4FE Lu +4FF Ll +500 Lu +501 Ll +502 Lu +503 Ll +504 Lu +505 Ll +506 Lu +507 Ll +508 Lu +509 Ll +50A Lu +50B Ll +50C Lu +50D Ll +50E Lu +50F Ll +510 Lu +511 Ll +512 Lu +513 Ll +514 Lu +515 Ll +516 Lu +517 Ll +518 Lu +519 Ll +51A Lu +51B Ll +51C Lu +51D Ll +51E Lu +51F Ll +520 Lu +521 Ll +522 Lu +523 Ll +524 Lu +525 Ll +526 Lu +527 Ll +528 Lu +529 Ll +52A Lu +52B Ll +52C Lu +52D Ll +52E Lu +52F Ll +531 556 Lu +559 Lm +55A 55F Po +561 587 Ll +589 Po +58A Pd +58D 58E So +58F Sc +591 5BD Mn +5BE Pd +5BF Mn +5C0 Po +5C1 5C2 Mn +5C3 Po +5C4 5C5 Mn +5C6 Po +5C7 Mn +5D0 5EA Lo +5F0 5F2 Lo +5F3 5F4 Po +600 605 Cf +606 608 Sm +609 60A Po +60B Sc +60C 60D Po +60E 60F So +610 61A Mn +61B Po +61C Cf +61E 61F Po +620 63F Lo +640 Lm +641 64A Lo +64B 65F Mn +660 669 Nd +66A 66D Po +66E 66F Lo +670 Mn +671 6D3 Lo +6D4 Po +6D5 Lo +6D6 6DC Mn +6DD Cf +6DE So +6DF 6E4 Mn +6E5 6E6 Lm +6E7 6E8 Mn +6E9 So +6EA 6ED Mn +6EE 6EF Lo +6F0 6F9 Nd +6FA 6FC Lo +6FD 6FE So +6FF Lo +700 70D Po +70F Cf +710 Lo +711 Mn +712 72F Lo +730 74A Mn +74D 7A5 Lo +7A6 7B0 Mn +7B1 Lo +7C0 7C9 Nd +7CA 7EA Lo +7EB 7F3 Mn +7F4 7F5 Lm +7F6 So +7F7 7F9 Po +7FA Lm +800 815 Lo +816 819 Mn +81A Lm +81B 823 Mn +824 Lm +825 827 Mn +828 Lm +829 82D Mn +830 83E Po +840 858 Lo +859 85B Mn +85E Po +860 86A Lo +8A0 8B4 Lo +8B6 8BD Lo +8D4 8E1 Mn +8E2 Cf +8E3 902 Mn +903 Mc +904 939 Lo +93A Mn +93B Mc +93C Mn +93D Lo +93E 940 Mc +941 948 Mn +949 94C Mc +94D Mn +94E 94F Mc +950 Lo +951 957 Mn +958 961 Lo +962 963 Mn +964 965 Po +966 96F Nd +970 Po +971 Lm +972 980 Lo +981 Mn +982 983 Mc +985 98C Lo +98F 990 Lo +993 9A8 Lo +9AA 9B0 Lo +9B2 Lo +9B6 9B9 Lo +9BC Mn +9BD Lo +9BE 9C0 Mc +9C1 9C4 Mn +9C7 9C8 Mc +9CB 9CC Mc +9CD Mn +9CE Lo +9D7 Mc +9DC 9DD Lo +9DF 9E1 Lo +9E2 9E3 Mn +9E6 9EF Nd +9F0 9F1 Lo +9F2 9F3 Sc +9F4 9F9 No +9FA So +9FB Sc +9FC Lo +9FD Po +A01 A02 Mn +A03 Mc +A05 A0A Lo +A0F A10 Lo +A13 A28 Lo +A2A A30 Lo +A32 A33 Lo +A35 A36 Lo +A38 A39 Lo +A3C Mn +A3E A40 Mc +A41 A42 Mn +A47 A48 Mn +A4B A4D Mn +A51 Mn +A59 A5C Lo +A5E Lo +A66 A6F Nd +A70 A71 Mn +A72 A74 Lo +A75 Mn +A81 A82 Mn +A83 Mc +A85 A8D Lo +A8F A91 Lo +A93 AA8 Lo +AAA AB0 Lo +AB2 AB3 Lo +AB5 AB9 Lo +ABC Mn +ABD Lo +ABE AC0 Mc +AC1 AC5 Mn +AC7 AC8 Mn +AC9 Mc +ACB ACC Mc +ACD Mn +AD0 Lo +AE0 AE1 Lo +AE2 AE3 Mn +AE6 AEF Nd +AF0 Po +AF1 Sc +AF9 Lo +AFA AFF Mn +B01 Mn +B02 B03 Mc +B05 B0C Lo +B0F B10 Lo +B13 B28 Lo +B2A B30 Lo +B32 B33 Lo +B35 B39 Lo +B3C Mn +B3D Lo +B3E Mc +B3F Mn +B40 Mc +B41 B44 Mn +B47 B48 Mc +B4B B4C Mc +B4D Mn +B56 Mn +B57 Mc +B5C B5D Lo +B5F B61 Lo +B62 B63 Mn +B66 B6F Nd +B70 So +B71 Lo +B72 B77 No +B82 Mn +B83 Lo +B85 B8A Lo +B8E B90 Lo +B92 B95 Lo +B99 B9A Lo +B9C Lo +B9E B9F Lo +BA3 BA4 Lo +BA8 BAA Lo +BAE BB9 Lo +BBE BBF Mc +BC0 Mn +BC1 BC2 Mc +BC6 BC8 Mc +BCA BCC Mc +BCD Mn +BD0 Lo +BD7 Mc +BE6 BEF Nd +BF0 BF2 No +BF3 BF8 So +BF9 Sc +BFA So +C00 Mn +C01 C03 Mc +C05 C0C Lo +C0E C10 Lo +C12 C28 Lo +C2A C39 Lo +C3D Lo +C3E C40 Mn +C41 C44 Mc +C46 C48 Mn +C4A C4D Mn +C55 C56 Mn +C58 C5A Lo +C60 C61 Lo +C62 C63 Mn +C66 C6F Nd +C78 C7E No +C7F So +C80 Lo +C81 Mn +C82 C83 Mc +C85 C8C Lo +C8E C90 Lo +C92 CA8 Lo +CAA CB3 Lo +CB5 CB9 Lo +CBC Mn +CBD Lo +CBE Mc +CBF Mn +CC0 CC4 Mc +CC6 Mn +CC7 CC8 Mc +CCA CCB Mc +CCC CCD Mn +CD5 CD6 Mc +CDE Lo +CE0 CE1 Lo +CE2 CE3 Mn +CE6 CEF Nd +CF1 CF2 Lo +D00 D01 Mn +D02 D03 Mc +D05 D0C Lo +D0E D10 Lo +D12 D3A Lo +D3B D3C Mn +D3D Lo +D3E D40 Mc +D41 D44 Mn +D46 D48 Mc +D4A D4C Mc +D4D Mn +D4E Lo +D4F So +D54 D56 Lo +D57 Mc +D58 D5E No +D5F D61 Lo +D62 D63 Mn +D66 D6F Nd +D70 D78 No +D79 So +D7A D7F Lo +D82 D83 Mc +D85 D96 Lo +D9A DB1 Lo +DB3 DBB Lo +DBD Lo +DC0 DC6 Lo +DCA Mn +DCF DD1 Mc +DD2 DD4 Mn +DD6 Mn +DD8 DDF Mc +DE6 DEF Nd +DF2 DF3 Mc +DF4 Po +E01 E30 Lo +E31 Mn +E32 E33 Lo +E34 E3A Mn +E3F Sc +E40 E45 Lo +E46 Lm +E47 E4E Mn +E4F Po +E50 E59 Nd +E5A E5B Po +E81 E82 Lo +E84 Lo +E87 E88 Lo +E8A Lo +E8D Lo +E94 E97 Lo +E99 E9F Lo +EA1 EA3 Lo +EA5 Lo +EA7 Lo +EAA EAB Lo +EAD EB0 Lo +EB1 Mn +EB2 EB3 Lo +EB4 EB9 Mn +EBB EBC Mn +EBD Lo +EC0 EC4 Lo +EC6 Lm +EC8 ECD Mn +ED0 ED9 Nd +EDC EDF Lo +F00 Lo +F01 F03 So +F04 F12 Po +F13 So +F14 Po +F15 F17 So +F18 F19 Mn +F1A F1F So +F20 F29 Nd +F2A F33 No +F34 So +F35 Mn +F36 So +F37 Mn +F38 So +F39 Mn +F3A Ps +F3B Pe +F3C Ps +F3D Pe +F3E F3F Mc +F40 F47 Lo +F49 F6C Lo +F71 F7E Mn +F7F Mc +F80 F84 Mn +F85 Po +F86 F87 Mn +F88 F8C Lo +F8D F97 Mn +F99 FBC Mn +FBE FC5 So +FC6 Mn +FC7 FCC So +FCE FCF So +FD0 FD4 Po +FD5 FD8 So +FD9 FDA Po +1000 102A Lo +102B 102C Mc +102D 1030 Mn +1031 Mc +1032 1037 Mn +1038 Mc +1039 103A Mn +103B 103C Mc +103D 103E Mn +103F Lo +1040 1049 Nd +104A 104F Po +1050 1055 Lo +1056 1057 Mc +1058 1059 Mn +105A 105D Lo +105E 1060 Mn +1061 Lo +1062 1064 Mc +1065 1066 Lo +1067 106D Mc +106E 1070 Lo +1071 1074 Mn +1075 1081 Lo +1082 Mn +1083 1084 Mc +1085 1086 Mn +1087 108C Mc +108D Mn +108E Lo +108F Mc +1090 1099 Nd +109A 109C Mc +109D Mn +109E 109F So +10A0 10C5 Lu +10C7 Lu +10CD Lu +10D0 10FA Lo +10FB Po +10FC Lm +10FD 1248 Lo +124A 124D Lo +1250 1256 Lo +1258 Lo +125A 125D Lo +1260 1288 Lo +128A 128D Lo +1290 12B0 Lo +12B2 12B5 Lo +12B8 12BE Lo +12C0 Lo +12C2 12C5 Lo +12C8 12D6 Lo +12D8 1310 Lo +1312 1315 Lo +1318 135A Lo +135D 135F Mn +1360 1368 Po +1369 137C No +1380 138F Lo +1390 1399 So +13A0 13F5 Lu +13F8 13FD Ll +1400 Pd +1401 166C Lo +166D 166E Po +166F 167F Lo +1680 Zs +1681 169A Lo +169B Ps +169C Pe +16A0 16EA Lo +16EB 16ED Po +16EE 16F0 Nl +16F1 16F8 Lo +1700 170C Lo +170E 1711 Lo +1712 1714 Mn +1720 1731 Lo +1732 1734 Mn +1735 1736 Po +1740 1751 Lo +1752 1753 Mn +1760 176C Lo +176E 1770 Lo +1772 1773 Mn +1780 17B3 Lo +17B4 17B5 Mn +17B6 Mc +17B7 17BD Mn +17BE 17C5 Mc +17C6 Mn +17C7 17C8 Mc +17C9 17D3 Mn +17D4 17D6 Po +17D7 Lm +17D8 17DA Po +17DB Sc +17DC Lo +17DD Mn +17E0 17E9 Nd +17F0 17F9 No +1800 1805 Po +1806 Pd +1807 180A Po +180B 180D Mn +180E Cf +1810 1819 Nd +1820 1842 Lo +1843 Lm +1844 1877 Lo +1880 1884 Lo +1885 1886 Mn +1887 18A8 Lo +18A9 Mn +18AA Lo +18B0 18F5 Lo +1900 191E Lo +1920 1922 Mn +1923 1926 Mc +1927 1928 Mn +1929 192B Mc +1930 1931 Mc +1932 Mn +1933 1938 Mc +1939 193B Mn +1940 So +1944 1945 Po +1946 194F Nd +1950 196D Lo +1970 1974 Lo +1980 19AB Lo +19B0 19C9 Lo +19D0 19D9 Nd +19DA No +19DE 19FF So +1A00 1A16 Lo +1A17 1A18 Mn +1A19 1A1A Mc +1A1B Mn +1A1E 1A1F Po +1A20 1A54 Lo +1A55 Mc +1A56 Mn +1A57 Mc +1A58 1A5E Mn +1A60 Mn +1A61 Mc +1A62 Mn +1A63 1A64 Mc +1A65 1A6C Mn +1A6D 1A72 Mc +1A73 1A7C Mn +1A7F Mn +1A80 1A89 Nd +1A90 1A99 Nd +1AA0 1AA6 Po +1AA7 Lm +1AA8 1AAD Po +1AB0 1ABD Mn +1ABE Me +1B00 1B03 Mn +1B04 Mc +1B05 1B33 Lo +1B34 Mn +1B35 Mc +1B36 1B3A Mn +1B3B Mc +1B3C Mn +1B3D 1B41 Mc +1B42 Mn +1B43 1B44 Mc +1B45 1B4B Lo +1B50 1B59 Nd +1B5A 1B60 Po +1B61 1B6A So +1B6B 1B73 Mn +1B74 1B7C So +1B80 1B81 Mn +1B82 Mc +1B83 1BA0 Lo +1BA1 Mc +1BA2 1BA5 Mn +1BA6 1BA7 Mc +1BA8 1BA9 Mn +1BAA Mc +1BAB 1BAD Mn +1BAE 1BAF Lo +1BB0 1BB9 Nd +1BBA 1BE5 Lo +1BE6 Mn +1BE7 Mc +1BE8 1BE9 Mn +1BEA 1BEC Mc +1BED Mn +1BEE Mc +1BEF 1BF1 Mn +1BF2 1BF3 Mc +1BFC 1BFF Po +1C00 1C23 Lo +1C24 1C2B Mc +1C2C 1C33 Mn +1C34 1C35 Mc +1C36 1C37 Mn +1C3B 1C3F Po +1C40 1C49 Nd +1C4D 1C4F Lo +1C50 1C59 Nd +1C5A 1C77 Lo +1C78 1C7D Lm +1C7E 1C7F Po +1C80 1C88 Ll +1CC0 1CC7 Po +1CD0 1CD2 Mn +1CD3 Po +1CD4 1CE0 Mn +1CE1 Mc +1CE2 1CE8 Mn +1CE9 1CEC Lo +1CED Mn +1CEE 1CF1 Lo +1CF2 1CF3 Mc +1CF4 Mn +1CF5 1CF6 Lo +1CF7 Mc +1CF8 1CF9 Mn +1D00 1D2B Ll +1D2C 1D6A Lm +1D6B 1D77 Ll +1D78 Lm +1D79 1D9A Ll +1D9B 1DBF Lm +1DC0 1DF9 Mn +1DFB 1DFF Mn +1E00 Lu +1E01 Ll +1E02 Lu +1E03 Ll +1E04 Lu +1E05 Ll +1E06 Lu +1E07 Ll +1E08 Lu +1E09 Ll +1E0A Lu +1E0B Ll +1E0C Lu +1E0D Ll +1E0E Lu +1E0F Ll +1E10 Lu +1E11 Ll +1E12 Lu +1E13 Ll +1E14 Lu +1E15 Ll +1E16 Lu +1E17 Ll +1E18 Lu +1E19 Ll +1E1A Lu +1E1B Ll +1E1C Lu +1E1D Ll +1E1E Lu +1E1F Ll +1E20 Lu +1E21 Ll +1E22 Lu +1E23 Ll +1E24 Lu +1E25 Ll +1E26 Lu +1E27 Ll +1E28 Lu +1E29 Ll +1E2A Lu +1E2B Ll +1E2C Lu +1E2D Ll +1E2E Lu +1E2F Ll +1E30 Lu +1E31 Ll +1E32 Lu +1E33 Ll +1E34 Lu +1E35 Ll +1E36 Lu +1E37 Ll +1E38 Lu +1E39 Ll +1E3A Lu +1E3B Ll +1E3C Lu +1E3D Ll +1E3E Lu +1E3F Ll +1E40 Lu +1E41 Ll +1E42 Lu +1E43 Ll +1E44 Lu +1E45 Ll +1E46 Lu +1E47 Ll +1E48 Lu +1E49 Ll +1E4A Lu +1E4B Ll +1E4C Lu +1E4D Ll +1E4E Lu +1E4F Ll +1E50 Lu +1E51 Ll +1E52 Lu +1E53 Ll +1E54 Lu +1E55 Ll +1E56 Lu +1E57 Ll +1E58 Lu +1E59 Ll +1E5A Lu +1E5B Ll +1E5C Lu +1E5D Ll +1E5E Lu +1E5F Ll +1E60 Lu +1E61 Ll +1E62 Lu +1E63 Ll +1E64 Lu +1E65 Ll +1E66 Lu +1E67 Ll +1E68 Lu +1E69 Ll +1E6A Lu +1E6B Ll +1E6C Lu +1E6D Ll +1E6E Lu +1E6F Ll +1E70 Lu +1E71 Ll +1E72 Lu +1E73 Ll +1E74 Lu +1E75 Ll +1E76 Lu +1E77 Ll +1E78 Lu +1E79 Ll +1E7A Lu +1E7B Ll +1E7C Lu +1E7D Ll +1E7E Lu +1E7F Ll +1E80 Lu +1E81 Ll +1E82 Lu +1E83 Ll +1E84 Lu +1E85 Ll +1E86 Lu +1E87 Ll +1E88 Lu +1E89 Ll +1E8A Lu +1E8B Ll +1E8C Lu +1E8D Ll +1E8E Lu +1E8F Ll +1E90 Lu +1E91 Ll +1E92 Lu +1E93 Ll +1E94 Lu +1E95 1E9D Ll +1E9E Lu +1E9F Ll +1EA0 Lu +1EA1 Ll +1EA2 Lu +1EA3 Ll +1EA4 Lu +1EA5 Ll +1EA6 Lu +1EA7 Ll +1EA8 Lu +1EA9 Ll +1EAA Lu +1EAB Ll +1EAC Lu +1EAD Ll +1EAE Lu +1EAF Ll +1EB0 Lu +1EB1 Ll +1EB2 Lu +1EB3 Ll +1EB4 Lu +1EB5 Ll +1EB6 Lu +1EB7 Ll +1EB8 Lu +1EB9 Ll +1EBA Lu +1EBB Ll +1EBC Lu +1EBD Ll +1EBE Lu +1EBF Ll +1EC0 Lu +1EC1 Ll +1EC2 Lu +1EC3 Ll +1EC4 Lu +1EC5 Ll +1EC6 Lu +1EC7 Ll +1EC8 Lu +1EC9 Ll +1ECA Lu +1ECB Ll +1ECC Lu +1ECD Ll +1ECE Lu +1ECF Ll +1ED0 Lu +1ED1 Ll +1ED2 Lu +1ED3 Ll +1ED4 Lu +1ED5 Ll +1ED6 Lu +1ED7 Ll +1ED8 Lu +1ED9 Ll +1EDA Lu +1EDB Ll +1EDC Lu +1EDD Ll +1EDE Lu +1EDF Ll +1EE0 Lu +1EE1 Ll +1EE2 Lu +1EE3 Ll +1EE4 Lu +1EE5 Ll +1EE6 Lu +1EE7 Ll +1EE8 Lu +1EE9 Ll +1EEA Lu +1EEB Ll +1EEC Lu +1EED Ll +1EEE Lu +1EEF Ll +1EF0 Lu +1EF1 Ll +1EF2 Lu +1EF3 Ll +1EF4 Lu +1EF5 Ll +1EF6 Lu +1EF7 Ll +1EF8 Lu +1EF9 Ll +1EFA Lu +1EFB Ll +1EFC Lu +1EFD Ll +1EFE Lu +1EFF 1F07 Ll +1F08 1F0F Lu +1F10 1F15 Ll +1F18 1F1D Lu +1F20 1F27 Ll +1F28 1F2F Lu +1F30 1F37 Ll +1F38 1F3F Lu +1F40 1F45 Ll +1F48 1F4D Lu +1F50 1F57 Ll +1F59 Lu +1F5B Lu +1F5D Lu +1F5F Lu +1F60 1F67 Ll +1F68 1F6F Lu +1F70 1F7D Ll +1F80 1F87 Ll +1F88 1F8F Lt +1F90 1F97 Ll +1F98 1F9F Lt +1FA0 1FA7 Ll +1FA8 1FAF Lt +1FB0 1FB4 Ll +1FB6 1FB7 Ll +1FB8 1FBB Lu +1FBC Lt +1FBD Sk +1FBE Ll +1FBF 1FC1 Sk +1FC2 1FC4 Ll +1FC6 1FC7 Ll +1FC8 1FCB Lu +1FCC Lt +1FCD 1FCF Sk +1FD0 1FD3 Ll +1FD6 1FD7 Ll +1FD8 1FDB Lu +1FDD 1FDF Sk +1FE0 1FE7 Ll +1FE8 1FEC Lu +1FED 1FEF Sk +1FF2 1FF4 Ll +1FF6 1FF7 Ll +1FF8 1FFB Lu +1FFC Lt +1FFD 1FFE Sk +2000 200A Zs +200B 200F Cf +2010 2015 Pd +2016 2017 Po +2018 Pi +2019 Pf +201A Ps +201B 201C Pi +201D Pf +201E Ps +201F Pi +2020 2027 Po +2028 Zl +2029 Zp +202A 202E Cf +202F Zs +2030 2038 Po +2039 Pi +203A Pf +203B 203E Po +203F 2040 Pc +2041 2043 Po +2044 Sm +2045 Ps +2046 Pe +2047 2051 Po +2052 Sm +2053 Po +2054 Pc +2055 205E Po +205F Zs +2060 2064 Cf +2066 206F Cf +2070 No +2071 Lm +2074 2079 No +207A 207C Sm +207D Ps +207E Pe +207F Lm +2080 2089 No +208A 208C Sm +208D Ps +208E Pe +2090 209C Lm +20A0 20BF Sc +20D0 20DC Mn +20DD 20E0 Me +20E1 Mn +20E2 20E4 Me +20E5 20F0 Mn +2100 2101 So +2102 Lu +2103 2106 So +2107 Lu +2108 2109 So +210A Ll +210B 210D Lu +210E 210F Ll +2110 2112 Lu +2113 Ll +2114 So +2115 Lu +2116 2117 So +2118 Sm +2119 211D Lu +211E 2123 So +2124 Lu +2125 So +2126 Lu +2127 So +2128 Lu +2129 So +212A 212D Lu +212E So +212F Ll +2130 2133 Lu +2134 Ll +2135 2138 Lo +2139 Ll +213A 213B So +213C 213D Ll +213E 213F Lu +2140 2144 Sm +2145 Lu +2146 2149 Ll +214A So +214B Sm +214C 214D So +214E Ll +214F So +2150 215F No +2160 2182 Nl +2183 Lu +2184 Ll +2185 2188 Nl +2189 No +218A 218B So +2190 2194 Sm +2195 2199 So +219A 219B Sm +219C 219F So +21A0 Sm +21A1 21A2 So +21A3 Sm +21A4 21A5 So +21A6 Sm +21A7 21AD So +21AE Sm +21AF 21CD So +21CE 21CF Sm +21D0 21D1 So +21D2 Sm +21D3 So +21D4 Sm +21D5 21F3 So +21F4 22FF Sm +2300 2307 So +2308 Ps +2309 Pe +230A Ps +230B Pe +230C 231F So +2320 2321 Sm +2322 2328 So +2329 Ps +232A Pe +232B 237B So +237C Sm +237D 239A So +239B 23B3 Sm +23B4 23DB So +23DC 23E1 Sm +23E2 2426 So +2440 244A So +2460 249B No +249C 24E9 So +24EA 24FF No +2500 25B6 So +25B7 Sm +25B8 25C0 So +25C1 Sm +25C2 25F7 So +25F8 25FF Sm +2600 266E So +266F Sm +2670 2767 So +2768 Ps +2769 Pe +276A Ps +276B Pe +276C Ps +276D Pe +276E Ps +276F Pe +2770 Ps +2771 Pe +2772 Ps +2773 Pe +2774 Ps +2775 Pe +2776 2793 No +2794 27BF So +27C0 27C4 Sm +27C5 Ps +27C6 Pe +27C7 27E5 Sm +27E6 Ps +27E7 Pe +27E8 Ps +27E9 Pe +27EA Ps +27EB Pe +27EC Ps +27ED Pe +27EE Ps +27EF Pe +27F0 27FF Sm +2800 28FF So +2900 2982 Sm +2983 Ps +2984 Pe +2985 Ps +2986 Pe +2987 Ps +2988 Pe +2989 Ps +298A Pe +298B Ps +298C Pe +298D Ps +298E Pe +298F Ps +2990 Pe +2991 Ps +2992 Pe +2993 Ps +2994 Pe +2995 Ps +2996 Pe +2997 Ps +2998 Pe +2999 29D7 Sm +29D8 Ps +29D9 Pe +29DA Ps +29DB Pe +29DC 29FB Sm +29FC Ps +29FD Pe +29FE 2AFF Sm +2B00 2B2F So +2B30 2B44 Sm +2B45 2B46 So +2B47 2B4C Sm +2B4D 2B73 So +2B76 2B95 So +2B98 2BB9 So +2BBD 2BC8 So +2BCA 2BD2 So +2BEC 2BEF So +2C00 2C2E Lu +2C30 2C5E Ll +2C60 Lu +2C61 Ll +2C62 2C64 Lu +2C65 2C66 Ll +2C67 Lu +2C68 Ll +2C69 Lu +2C6A Ll +2C6B Lu +2C6C Ll +2C6D 2C70 Lu +2C71 Ll +2C72 Lu +2C73 2C74 Ll +2C75 Lu +2C76 2C7B Ll +2C7C 2C7D Lm +2C7E 2C80 Lu +2C81 Ll +2C82 Lu +2C83 Ll +2C84 Lu +2C85 Ll +2C86 Lu +2C87 Ll +2C88 Lu +2C89 Ll +2C8A Lu +2C8B Ll +2C8C Lu +2C8D Ll +2C8E Lu +2C8F Ll +2C90 Lu +2C91 Ll +2C92 Lu +2C93 Ll +2C94 Lu +2C95 Ll +2C96 Lu +2C97 Ll +2C98 Lu +2C99 Ll +2C9A Lu +2C9B Ll +2C9C Lu +2C9D Ll +2C9E Lu +2C9F Ll +2CA0 Lu +2CA1 Ll +2CA2 Lu +2CA3 Ll +2CA4 Lu +2CA5 Ll +2CA6 Lu +2CA7 Ll +2CA8 Lu +2CA9 Ll +2CAA Lu +2CAB Ll +2CAC Lu +2CAD Ll +2CAE Lu +2CAF Ll +2CB0 Lu +2CB1 Ll +2CB2 Lu +2CB3 Ll +2CB4 Lu +2CB5 Ll +2CB6 Lu +2CB7 Ll +2CB8 Lu +2CB9 Ll +2CBA Lu +2CBB Ll +2CBC Lu +2CBD Ll +2CBE Lu +2CBF Ll +2CC0 Lu +2CC1 Ll +2CC2 Lu +2CC3 Ll +2CC4 Lu +2CC5 Ll +2CC6 Lu +2CC7 Ll +2CC8 Lu +2CC9 Ll +2CCA Lu +2CCB Ll +2CCC Lu +2CCD Ll +2CCE Lu +2CCF Ll +2CD0 Lu +2CD1 Ll +2CD2 Lu +2CD3 Ll +2CD4 Lu +2CD5 Ll +2CD6 Lu +2CD7 Ll +2CD8 Lu +2CD9 Ll +2CDA Lu +2CDB Ll +2CDC Lu +2CDD Ll +2CDE Lu +2CDF Ll +2CE0 Lu +2CE1 Ll +2CE2 Lu +2CE3 2CE4 Ll +2CE5 2CEA So +2CEB Lu +2CEC Ll +2CED Lu +2CEE Ll +2CEF 2CF1 Mn +2CF2 Lu +2CF3 Ll +2CF9 2CFC Po +2CFD No +2CFE 2CFF Po +2D00 2D25 Ll +2D27 Ll +2D2D Ll +2D30 2D67 Lo +2D6F Lm +2D70 Po +2D7F Mn +2D80 2D96 Lo +2DA0 2DA6 Lo +2DA8 2DAE Lo +2DB0 2DB6 Lo +2DB8 2DBE Lo +2DC0 2DC6 Lo +2DC8 2DCE Lo +2DD0 2DD6 Lo +2DD8 2DDE Lo +2DE0 2DFF Mn +2E00 2E01 Po +2E02 Pi +2E03 Pf +2E04 Pi +2E05 Pf +2E06 2E08 Po +2E09 Pi +2E0A Pf +2E0B Po +2E0C Pi +2E0D Pf +2E0E 2E16 Po +2E17 Pd +2E18 2E19 Po +2E1A Pd +2E1B Po +2E1C Pi +2E1D Pf +2E1E 2E1F Po +2E20 Pi +2E21 Pf +2E22 Ps +2E23 Pe +2E24 Ps +2E25 Pe +2E26 Ps +2E27 Pe +2E28 Ps +2E29 Pe +2E2A 2E2E Po +2E2F Lm +2E30 2E39 Po +2E3A 2E3B Pd +2E3C 2E3F Po +2E40 Pd +2E41 Po +2E42 Ps +2E43 2E49 Po +2E80 2E99 So +2E9B 2EF3 So +2F00 2FD5 So +2FF0 2FFB So +3000 Zs +3001 3003 Po +3004 So +3005 Lm +3006 Lo +3007 Nl +3008 Ps +3009 Pe +300A Ps +300B Pe +300C Ps +300D Pe +300E Ps +300F Pe +3010 Ps +3011 Pe +3012 3013 So +3014 Ps +3015 Pe +3016 Ps +3017 Pe +3018 Ps +3019 Pe +301A Ps +301B Pe +301C Pd +301D Ps +301E 301F Pe +3020 So +3021 3029 Nl +302A 302D Mn +302E 302F Mc +3030 Pd +3031 3035 Lm +3036 3037 So +3038 303A Nl +303B Lm +303C Lo +303D Po +303E 303F So +3041 3096 Lo +3099 309A Mn +309B 309C Sk +309D 309E Lm +309F Lo +30A0 Pd +30A1 30FA Lo +30FB Po +30FC 30FE Lm +30FF Lo +3105 312E Lo +3131 318E Lo +3190 3191 So +3192 3195 No +3196 319F So +31A0 31BA Lo +31C0 31E3 So +31F0 31FF Lo +3200 321E So +3220 3229 No +322A 3247 So +3248 324F No +3250 So +3251 325F No +3260 327F So +3280 3289 No +328A 32B0 So +32B1 32BF No +32C0 32FE So +3300 33FF So +3400 4DB5 Lo +4DC0 4DFF So +4E00 9FEA Lo +A000 A014 Lo +A015 Lm +A016 A48C Lo +A490 A4C6 So +A4D0 A4F7 Lo +A4F8 A4FD Lm +A4FE A4FF Po +A500 A60B Lo +A60C Lm +A60D A60F Po +A610 A61F Lo +A620 A629 Nd +A62A A62B Lo +A640 Lu +A641 Ll +A642 Lu +A643 Ll +A644 Lu +A645 Ll +A646 Lu +A647 Ll +A648 Lu +A649 Ll +A64A Lu +A64B Ll +A64C Lu +A64D Ll +A64E Lu +A64F Ll +A650 Lu +A651 Ll +A652 Lu +A653 Ll +A654 Lu +A655 Ll +A656 Lu +A657 Ll +A658 Lu +A659 Ll +A65A Lu +A65B Ll +A65C Lu +A65D Ll +A65E Lu +A65F Ll +A660 Lu +A661 Ll +A662 Lu +A663 Ll +A664 Lu +A665 Ll +A666 Lu +A667 Ll +A668 Lu +A669 Ll +A66A Lu +A66B Ll +A66C Lu +A66D Ll +A66E Lo +A66F Mn +A670 A672 Me +A673 Po +A674 A67D Mn +A67E Po +A67F Lm +A680 Lu +A681 Ll +A682 Lu +A683 Ll +A684 Lu +A685 Ll +A686 Lu +A687 Ll +A688 Lu +A689 Ll +A68A Lu +A68B Ll +A68C Lu +A68D Ll +A68E Lu +A68F Ll +A690 Lu +A691 Ll +A692 Lu +A693 Ll +A694 Lu +A695 Ll +A696 Lu +A697 Ll +A698 Lu +A699 Ll +A69A Lu +A69B Ll +A69C A69D Lm +A69E A69F Mn +A6A0 A6E5 Lo +A6E6 A6EF Nl +A6F0 A6F1 Mn +A6F2 A6F7 Po +A700 A716 Sk +A717 A71F Lm +A720 A721 Sk +A722 Lu +A723 Ll +A724 Lu +A725 Ll +A726 Lu +A727 Ll +A728 Lu +A729 Ll +A72A Lu +A72B Ll +A72C Lu +A72D Ll +A72E Lu +A72F A731 Ll +A732 Lu +A733 Ll +A734 Lu +A735 Ll +A736 Lu +A737 Ll +A738 Lu +A739 Ll +A73A Lu +A73B Ll +A73C Lu +A73D Ll +A73E Lu +A73F Ll +A740 Lu +A741 Ll +A742 Lu +A743 Ll +A744 Lu +A745 Ll +A746 Lu +A747 Ll +A748 Lu +A749 Ll +A74A Lu +A74B Ll +A74C Lu +A74D Ll +A74E Lu +A74F Ll +A750 Lu +A751 Ll +A752 Lu +A753 Ll +A754 Lu +A755 Ll +A756 Lu +A757 Ll +A758 Lu +A759 Ll +A75A Lu +A75B Ll +A75C Lu +A75D Ll +A75E Lu +A75F Ll +A760 Lu +A761 Ll +A762 Lu +A763 Ll +A764 Lu +A765 Ll +A766 Lu +A767 Ll +A768 Lu +A769 Ll +A76A Lu +A76B Ll +A76C Lu +A76D Ll +A76E Lu +A76F Ll +A770 Lm +A771 A778 Ll +A779 Lu +A77A Ll +A77B Lu +A77C Ll +A77D A77E Lu +A77F Ll +A780 Lu +A781 Ll +A782 Lu +A783 Ll +A784 Lu +A785 Ll +A786 Lu +A787 Ll +A788 Lm +A789 A78A Sk +A78B Lu +A78C Ll +A78D Lu +A78E Ll +A78F Lo +A790 Lu +A791 Ll +A792 Lu +A793 A795 Ll +A796 Lu +A797 Ll +A798 Lu +A799 Ll +A79A Lu +A79B Ll +A79C Lu +A79D Ll +A79E Lu +A79F Ll +A7A0 Lu +A7A1 Ll +A7A2 Lu +A7A3 Ll +A7A4 Lu +A7A5 Ll +A7A6 Lu +A7A7 Ll +A7A8 Lu +A7A9 Ll +A7AA A7AE Lu +A7B0 A7B4 Lu +A7B5 Ll +A7B6 Lu +A7B7 Ll +A7F7 Lo +A7F8 A7F9 Lm +A7FA Ll +A7FB A801 Lo +A802 Mn +A803 A805 Lo +A806 Mn +A807 A80A Lo +A80B Mn +A80C A822 Lo +A823 A824 Mc +A825 A826 Mn +A827 Mc +A828 A82B So +A830 A835 No +A836 A837 So +A838 Sc +A839 So +A840 A873 Lo +A874 A877 Po +A880 A881 Mc +A882 A8B3 Lo +A8B4 A8C3 Mc +A8C4 A8C5 Mn +A8CE A8CF Po +A8D0 A8D9 Nd +A8E0 A8F1 Mn +A8F2 A8F7 Lo +A8F8 A8FA Po +A8FB Lo +A8FC Po +A8FD Lo +A900 A909 Nd +A90A A925 Lo +A926 A92D Mn +A92E A92F Po +A930 A946 Lo +A947 A951 Mn +A952 A953 Mc +A95F Po +A960 A97C Lo +A980 A982 Mn +A983 Mc +A984 A9B2 Lo +A9B3 Mn +A9B4 A9B5 Mc +A9B6 A9B9 Mn +A9BA A9BB Mc +A9BC Mn +A9BD A9C0 Mc +A9C1 A9CD Po +A9CF Lm +A9D0 A9D9 Nd +A9DE A9DF Po +A9E0 A9E4 Lo +A9E5 Mn +A9E6 Lm +A9E7 A9EF Lo +A9F0 A9F9 Nd +A9FA A9FE Lo +AA00 AA28 Lo +AA29 AA2E Mn +AA2F AA30 Mc +AA31 AA32 Mn +AA33 AA34 Mc +AA35 AA36 Mn +AA40 AA42 Lo +AA43 Mn +AA44 AA4B Lo +AA4C Mn +AA4D Mc +AA50 AA59 Nd +AA5C AA5F Po +AA60 AA6F Lo +AA70 Lm +AA71 AA76 Lo +AA77 AA79 So +AA7A Lo +AA7B Mc +AA7C Mn +AA7D Mc +AA7E AAAF Lo +AAB0 Mn +AAB1 Lo +AAB2 AAB4 Mn +AAB5 AAB6 Lo +AAB7 AAB8 Mn +AAB9 AABD Lo +AABE AABF Mn +AAC0 Lo +AAC1 Mn +AAC2 Lo +AADB AADC Lo +AADD Lm +AADE AADF Po +AAE0 AAEA Lo +AAEB Mc +AAEC AAED Mn +AAEE AAEF Mc +AAF0 AAF1 Po +AAF2 Lo +AAF3 AAF4 Lm +AAF5 Mc +AAF6 Mn +AB01 AB06 Lo +AB09 AB0E Lo +AB11 AB16 Lo +AB20 AB26 Lo +AB28 AB2E Lo +AB30 AB5A Ll +AB5B Sk +AB5C AB5F Lm +AB60 AB65 Ll +AB70 ABBF Ll +ABC0 ABE2 Lo +ABE3 ABE4 Mc +ABE5 Mn +ABE6 ABE7 Mc +ABE8 Mn +ABE9 ABEA Mc +ABEB Po +ABEC Mc +ABED Mn +ABF0 ABF9 Nd +AC00 D7A3 Lo +D7B0 D7C6 Lo +D7CB D7FB Lo +D800 DFFF Cs +E000 F8FF Co +F900 FA6D Lo +FA70 FAD9 Lo +FB00 FB06 Ll +FB13 FB17 Ll +FB1D Lo +FB1E Mn +FB1F FB28 Lo +FB29 Sm +FB2A FB36 Lo +FB38 FB3C Lo +FB3E Lo +FB40 FB41 Lo +FB43 FB44 Lo +FB46 FBB1 Lo +FBB2 FBC1 Sk +FBD3 FD3D Lo +FD3E Pe +FD3F Ps +FD50 FD8F Lo +FD92 FDC7 Lo +FDF0 FDFB Lo +FDFC Sc +FDFD So +FE00 FE0F Mn +FE10 FE16 Po +FE17 Ps +FE18 Pe +FE19 Po +FE20 FE2F Mn +FE30 Po +FE31 FE32 Pd +FE33 FE34 Pc +FE35 Ps +FE36 Pe +FE37 Ps +FE38 Pe +FE39 Ps +FE3A Pe +FE3B Ps +FE3C Pe +FE3D Ps +FE3E Pe +FE3F Ps +FE40 Pe +FE41 Ps +FE42 Pe +FE43 Ps +FE44 Pe +FE45 FE46 Po +FE47 Ps +FE48 Pe +FE49 FE4C Po +FE4D FE4F Pc +FE50 FE52 Po +FE54 FE57 Po +FE58 Pd +FE59 Ps +FE5A Pe +FE5B Ps +FE5C Pe +FE5D Ps +FE5E Pe +FE5F FE61 Po +FE62 Sm +FE63 Pd +FE64 FE66 Sm +FE68 Po +FE69 Sc +FE6A FE6B Po +FE70 FE74 Lo +FE76 FEFC Lo +FEFF Cf +FF01 FF03 Po +FF04 Sc +FF05 FF07 Po +FF08 Ps +FF09 Pe +FF0A Po +FF0B Sm +FF0C Po +FF0D Pd +FF0E FF0F Po +FF10 FF19 Nd +FF1A FF1B Po +FF1C FF1E Sm +FF1F FF20 Po +FF21 FF3A Lu +FF3B Ps +FF3C Po +FF3D Pe +FF3E Sk +FF3F Pc +FF40 Sk +FF41 FF5A Ll +FF5B Ps +FF5C Sm +FF5D Pe +FF5E Sm +FF5F Ps +FF60 Pe +FF61 Po +FF62 Ps +FF63 Pe +FF64 FF65 Po +FF66 FF6F Lo +FF70 Lm +FF71 FF9D Lo +FF9E FF9F Lm +FFA0 FFBE Lo +FFC2 FFC7 Lo +FFCA FFCF Lo +FFD2 FFD7 Lo +FFDA FFDC Lo +FFE0 FFE1 Sc +FFE2 Sm +FFE3 Sk +FFE4 So +FFE5 FFE6 Sc +FFE8 So +FFE9 FFEC Sm +FFED FFEE So +FFF9 FFFB Cf +FFFC FFFD So +10000 1000B Lo +1000D 10026 Lo +10028 1003A Lo +1003C 1003D Lo +1003F 1004D Lo +10050 1005D Lo +10080 100FA Lo +10100 10102 Po +10107 10133 No +10137 1013F So +10140 10174 Nl +10175 10178 No +10179 10189 So +1018A 1018B No +1018C 1018E So +10190 1019B So +101A0 So +101D0 101FC So +101FD Mn +10280 1029C Lo +102A0 102D0 Lo +102E0 Mn +102E1 102FB No +10300 1031F Lo +10320 10323 No +1032D 10340 Lo +10341 Nl +10342 10349 Lo +1034A Nl +10350 10375 Lo +10376 1037A Mn +10380 1039D Lo +1039F Po +103A0 103C3 Lo +103C8 103CF Lo +103D0 Po +103D1 103D5 Nl +10400 10427 Lu +10428 1044F Ll +10450 1049D Lo +104A0 104A9 Nd +104B0 104D3 Lu +104D8 104FB Ll +10500 10527 Lo +10530 10563 Lo +1056F Po +10600 10736 Lo +10740 10755 Lo +10760 10767 Lo +10800 10805 Lo +10808 Lo +1080A 10835 Lo +10837 10838 Lo +1083C Lo +1083F 10855 Lo +10857 Po +10858 1085F No +10860 10876 Lo +10877 10878 So +10879 1087F No +10880 1089E Lo +108A7 108AF No +108E0 108F2 Lo +108F4 108F5 Lo +108FB 108FF No +10900 10915 Lo +10916 1091B No +1091F Po +10920 10939 Lo +1093F Po +10980 109B7 Lo +109BC 109BD No +109BE 109BF Lo +109C0 109CF No +109D2 109FF No +10A00 Lo +10A01 10A03 Mn +10A05 10A06 Mn +10A0C 10A0F Mn +10A10 10A13 Lo +10A15 10A17 Lo +10A19 10A33 Lo +10A38 10A3A Mn +10A3F Mn +10A40 10A47 No +10A50 10A58 Po +10A60 10A7C Lo +10A7D 10A7E No +10A7F Po +10A80 10A9C Lo +10A9D 10A9F No +10AC0 10AC7 Lo +10AC8 So +10AC9 10AE4 Lo +10AE5 10AE6 Mn +10AEB 10AEF No +10AF0 10AF6 Po +10B00 10B35 Lo +10B39 10B3F Po +10B40 10B55 Lo +10B58 10B5F No +10B60 10B72 Lo +10B78 10B7F No +10B80 10B91 Lo +10B99 10B9C Po +10BA9 10BAF No +10C00 10C48 Lo +10C80 10CB2 Lu +10CC0 10CF2 Ll +10CFA 10CFF No +10E60 10E7E No +11000 Mc +11001 Mn +11002 Mc +11003 11037 Lo +11038 11046 Mn +11047 1104D Po +11052 11065 No +11066 1106F Nd +1107F 11081 Mn +11082 Mc +11083 110AF Lo +110B0 110B2 Mc +110B3 110B6 Mn +110B7 110B8 Mc +110B9 110BA Mn +110BB 110BC Po +110BD Cf +110BE 110C1 Po +110D0 110E8 Lo +110F0 110F9 Nd +11100 11102 Mn +11103 11126 Lo +11127 1112B Mn +1112C Mc +1112D 11134 Mn +11136 1113F Nd +11140 11143 Po +11150 11172 Lo +11173 Mn +11174 11175 Po +11176 Lo +11180 11181 Mn +11182 Mc +11183 111B2 Lo +111B3 111B5 Mc +111B6 111BE Mn +111BF 111C0 Mc +111C1 111C4 Lo +111C5 111C9 Po +111CA 111CC Mn +111CD Po +111D0 111D9 Nd +111DA Lo +111DB Po +111DC Lo +111DD 111DF Po +111E1 111F4 No +11200 11211 Lo +11213 1122B Lo +1122C 1122E Mc +1122F 11231 Mn +11232 11233 Mc +11234 Mn +11235 Mc +11236 11237 Mn +11238 1123D Po +1123E Mn +11280 11286 Lo +11288 Lo +1128A 1128D Lo +1128F 1129D Lo +1129F 112A8 Lo +112A9 Po +112B0 112DE Lo +112DF Mn +112E0 112E2 Mc +112E3 112EA Mn +112F0 112F9 Nd +11300 11301 Mn +11302 11303 Mc +11305 1130C Lo +1130F 11310 Lo +11313 11328 Lo +1132A 11330 Lo +11332 11333 Lo +11335 11339 Lo +1133C Mn +1133D Lo +1133E 1133F Mc +11340 Mn +11341 11344 Mc +11347 11348 Mc +1134B 1134D Mc +11350 Lo +11357 Mc +1135D 11361 Lo +11362 11363 Mc +11366 1136C Mn +11370 11374 Mn +11400 11434 Lo +11435 11437 Mc +11438 1143F Mn +11440 11441 Mc +11442 11444 Mn +11445 Mc +11446 Mn +11447 1144A Lo +1144B 1144F Po +11450 11459 Nd +1145B Po +1145D Po +11480 114AF Lo +114B0 114B2 Mc +114B3 114B8 Mn +114B9 Mc +114BA Mn +114BB 114BE Mc +114BF 114C0 Mn +114C1 Mc +114C2 114C3 Mn +114C4 114C5 Lo +114C6 Po +114C7 Lo +114D0 114D9 Nd +11580 115AE Lo +115AF 115B1 Mc +115B2 115B5 Mn +115B8 115BB Mc +115BC 115BD Mn +115BE Mc +115BF 115C0 Mn +115C1 115D7 Po +115D8 115DB Lo +115DC 115DD Mn +11600 1162F Lo +11630 11632 Mc +11633 1163A Mn +1163B 1163C Mc +1163D Mn +1163E Mc +1163F 11640 Mn +11641 11643 Po +11644 Lo +11650 11659 Nd +11660 1166C Po +11680 116AA Lo +116AB Mn +116AC Mc +116AD Mn +116AE 116AF Mc +116B0 116B5 Mn +116B6 Mc +116B7 Mn +116C0 116C9 Nd +11700 11719 Lo +1171D 1171F Mn +11720 11721 Mc +11722 11725 Mn +11726 Mc +11727 1172B Mn +11730 11739 Nd +1173A 1173B No +1173C 1173E Po +1173F So +118A0 118BF Lu +118C0 118DF Ll +118E0 118E9 Nd +118EA 118F2 No +118FF Lo +11A00 Lo +11A01 11A06 Mn +11A07 11A08 Mc +11A09 11A0A Mn +11A0B 11A32 Lo +11A33 11A38 Mn +11A39 Mc +11A3A Lo +11A3B 11A3E Mn +11A3F 11A46 Po +11A47 Mn +11A50 Lo +11A51 11A56 Mn +11A57 11A58 Mc +11A59 11A5B Mn +11A5C 11A83 Lo +11A86 11A89 Lo +11A8A 11A96 Mn +11A97 Mc +11A98 11A99 Mn +11A9A 11A9C Po +11A9E 11AA2 Po +11AC0 11AF8 Lo +11C00 11C08 Lo +11C0A 11C2E Lo +11C2F Mc +11C30 11C36 Mn +11C38 11C3D Mn +11C3E Mc +11C3F Mn +11C40 Lo +11C41 11C45 Po +11C50 11C59 Nd +11C5A 11C6C No +11C70 11C71 Po +11C72 11C8F Lo +11C92 11CA7 Mn +11CA9 Mc +11CAA 11CB0 Mn +11CB1 Mc +11CB2 11CB3 Mn +11CB4 Mc +11CB5 11CB6 Mn +11D00 11D06 Lo +11D08 11D09 Lo +11D0B 11D30 Lo +11D31 11D36 Mn +11D3A Mn +11D3C 11D3D Mn +11D3F 11D45 Mn +11D46 Lo +11D47 Mn +11D50 11D59 Nd +12000 12399 Lo +12400 1246E Nl +12470 12474 Po +12480 12543 Lo +13000 1342E Lo +14400 14646 Lo +16800 16A38 Lo +16A40 16A5E Lo +16A60 16A69 Nd +16A6E 16A6F Po +16AD0 16AED Lo +16AF0 16AF4 Mn +16AF5 Po +16B00 16B2F Lo +16B30 16B36 Mn +16B37 16B3B Po +16B3C 16B3F So +16B40 16B43 Lm +16B44 Po +16B45 So +16B50 16B59 Nd +16B5B 16B61 No +16B63 16B77 Lo +16B7D 16B8F Lo +16F00 16F44 Lo +16F50 Lo +16F51 16F7E Mc +16F8F 16F92 Mn +16F93 16F9F Lm +16FE0 16FE1 Lm +17000 187EC Lo +18800 18AF2 Lo +1B000 1B11E Lo +1B170 1B2FB Lo +1BC00 1BC6A Lo +1BC70 1BC7C Lo +1BC80 1BC88 Lo +1BC90 1BC99 Lo +1BC9C So +1BC9D 1BC9E Mn +1BC9F Po +1BCA0 1BCA3 Cf +1D000 1D0F5 So +1D100 1D126 So +1D129 1D164 So +1D165 1D166 Mc +1D167 1D169 Mn +1D16A 1D16C So +1D16D 1D172 Mc +1D173 1D17A Cf +1D17B 1D182 Mn +1D183 1D184 So +1D185 1D18B Mn +1D18C 1D1A9 So +1D1AA 1D1AD Mn +1D1AE 1D1E8 So +1D200 1D241 So +1D242 1D244 Mn +1D245 So +1D300 1D356 So +1D360 1D371 No +1D400 1D419 Lu +1D41A 1D433 Ll +1D434 1D44D Lu +1D44E 1D454 Ll +1D456 1D467 Ll +1D468 1D481 Lu +1D482 1D49B Ll +1D49C Lu +1D49E 1D49F Lu +1D4A2 Lu +1D4A5 1D4A6 Lu +1D4A9 1D4AC Lu +1D4AE 1D4B5 Lu +1D4B6 1D4B9 Ll +1D4BB Ll +1D4BD 1D4C3 Ll +1D4C5 1D4CF Ll +1D4D0 1D4E9 Lu +1D4EA 1D503 Ll +1D504 1D505 Lu +1D507 1D50A Lu +1D50D 1D514 Lu +1D516 1D51C Lu +1D51E 1D537 Ll +1D538 1D539 Lu +1D53B 1D53E Lu +1D540 1D544 Lu +1D546 Lu +1D54A 1D550 Lu +1D552 1D56B Ll +1D56C 1D585 Lu +1D586 1D59F Ll +1D5A0 1D5B9 Lu +1D5BA 1D5D3 Ll +1D5D4 1D5ED Lu +1D5EE 1D607 Ll +1D608 1D621 Lu +1D622 1D63B Ll +1D63C 1D655 Lu +1D656 1D66F Ll +1D670 1D689 Lu +1D68A 1D6A5 Ll +1D6A8 1D6C0 Lu +1D6C1 Sm +1D6C2 1D6DA Ll +1D6DB Sm +1D6DC 1D6E1 Ll +1D6E2 1D6FA Lu +1D6FB Sm +1D6FC 1D714 Ll +1D715 Sm +1D716 1D71B Ll +1D71C 1D734 Lu +1D735 Sm +1D736 1D74E Ll +1D74F Sm +1D750 1D755 Ll +1D756 1D76E Lu +1D76F Sm +1D770 1D788 Ll +1D789 Sm +1D78A 1D78F Ll +1D790 1D7A8 Lu +1D7A9 Sm +1D7AA 1D7C2 Ll +1D7C3 Sm +1D7C4 1D7C9 Ll +1D7CA Lu +1D7CB Ll +1D7CE 1D7FF Nd +1D800 1D9FF So +1DA00 1DA36 Mn +1DA37 1DA3A So +1DA3B 1DA6C Mn +1DA6D 1DA74 So +1DA75 Mn +1DA76 1DA83 So +1DA84 Mn +1DA85 1DA86 So +1DA87 1DA8B Po +1DA9B 1DA9F Mn +1DAA1 1DAAF Mn +1E000 1E006 Mn +1E008 1E018 Mn +1E01B 1E021 Mn +1E023 1E024 Mn +1E026 1E02A Mn +1E800 1E8C4 Lo +1E8C7 1E8CF No +1E8D0 1E8D6 Mn +1E900 1E921 Lu +1E922 1E943 Ll +1E944 1E94A Mn +1E950 1E959 Nd +1E95E 1E95F Po +1EE00 1EE03 Lo +1EE05 1EE1F Lo +1EE21 1EE22 Lo +1EE24 Lo +1EE27 Lo +1EE29 1EE32 Lo +1EE34 1EE37 Lo +1EE39 Lo +1EE3B Lo +1EE42 Lo +1EE47 Lo +1EE49 Lo +1EE4B Lo +1EE4D 1EE4F Lo +1EE51 1EE52 Lo +1EE54 Lo +1EE57 Lo +1EE59 Lo +1EE5B Lo +1EE5D Lo +1EE5F Lo +1EE61 1EE62 Lo +1EE64 Lo +1EE67 1EE6A Lo +1EE6C 1EE72 Lo +1EE74 1EE77 Lo +1EE79 1EE7C Lo +1EE7E Lo +1EE80 1EE89 Lo +1EE8B 1EE9B Lo +1EEA1 1EEA3 Lo +1EEA5 1EEA9 Lo +1EEAB 1EEBB Lo +1EEF0 1EEF1 Sm +1F000 1F02B So +1F030 1F093 So +1F0A0 1F0AE So +1F0B1 1F0BF So +1F0C1 1F0CF So +1F0D1 1F0F5 So +1F100 1F10C No +1F110 1F12E So +1F130 1F16B So +1F170 1F1AC So +1F1E6 1F202 So +1F210 1F23B So +1F240 1F248 So +1F250 1F251 So +1F260 1F265 So +1F300 1F3FA So +1F3FB 1F3FF Sk +1F400 1F6D4 So +1F6E0 1F6EC So +1F6F0 1F6F8 So +1F700 1F773 So +1F780 1F7D4 So +1F800 1F80B So +1F810 1F847 So +1F850 1F859 So +1F860 1F887 So +1F890 1F8AD So +1F900 1F90B So +1F910 1F93E So +1F940 1F94C So +1F950 1F96B So +1F980 1F997 So +1F9C0 So +1F9D0 1F9E6 So +20000 2A6D6 Lo +2A700 2B734 Lo +2B740 2B81D Lo +2B820 2CEA1 Lo +2CEB0 2EBE0 Lo +2F800 2FA1D Lo +E0001 Cf +E0020 E007F Cf +E0100 E01EF Mn +F0000 FFFFD Co +100000 10FFFD Co +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNFKCQC'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNFKCQC'}{'missing'} = 'Yes'; + +return <<'END'; +A0 N +A8 N +AA N +AF N +B2 B5 N +B8 BA N +BC BE N +132 133 N +13F 140 N +149 N +17F N +1C4 1CC N +1F1 1F3 N +2B0 2B8 N +2D8 2DD N +2E0 2E4 N +300 304 M +306 30C M +30F M +311 M +313 314 M +31B M +323 328 M +32D 32E M +330 331 M +338 M +340 341 N +342 M +343 344 N +345 M +374 N +37A N +37E N +384 385 N +387 N +3D0 3D6 N +3F0 3F2 N +3F4 3F5 N +3F9 N +587 N +653 655 M +675 678 N +93C M +958 95F N +9BE M +9D7 M +9DC 9DD N +9DF N +A33 N +A36 N +A59 A5B N +A5E N +B3E M +B56 B57 M +B5C B5D N +BBE M +BD7 M +C56 M +CC2 M +CD5 CD6 M +D3E M +D57 M +DCA M +DCF M +DDF M +E33 N +EB3 N +EDC EDD N +F0C N +F43 N +F4D N +F52 N +F57 N +F5C N +F69 N +F73 N +F75 F79 N +F81 N +F93 N +F9D N +FA2 N +FA7 N +FAC N +FB9 N +102E M +10FC N +1161 1175 M +11A8 11C2 M +1B35 M +1D2C 1D2E N +1D30 1D3A N +1D3C 1D4D N +1D4F 1D6A N +1D78 N +1D9B 1DBF N +1E9A 1E9B N +1F71 N +1F73 N +1F75 N +1F77 N +1F79 N +1F7B N +1F7D N +1FBB N +1FBD 1FC1 N +1FC9 N +1FCB N +1FCD 1FCF N +1FD3 N +1FDB N +1FDD 1FDF N +1FE3 N +1FEB N +1FED 1FEF N +1FF9 N +1FFB N +1FFD 1FFE N +2000 200A N +2011 N +2017 N +2024 2026 N +202F N +2033 2034 N +2036 2037 N +203C N +203E N +2047 2049 N +2057 N +205F N +2070 2071 N +2074 208E N +2090 209C N +20A8 N +2100 2103 N +2105 2107 N +2109 2113 N +2115 2116 N +2119 211D N +2120 2122 N +2124 N +2126 N +2128 N +212A 212D N +212F 2131 N +2133 2139 N +213B 2140 N +2145 2149 N +2150 217F N +2189 N +222C 222D N +222F 2230 N +2329 232A N +2460 24EA N +2A0C N +2A74 2A76 N +2ADC N +2C7C 2C7D N +2D6F N +2E9F N +2EF3 N +2F00 2FD5 N +3000 N +3036 N +3038 303A N +3099 309A M +309B 309C N +309F N +30FF N +3131 318E N +3192 319F N +3200 321E N +3220 3247 N +3250 327E N +3280 32FE N +3300 33FF N +A69C A69D N +A770 N +A7F8 A7F9 N +AB5C AB5F N +F900 FA0D N +FA10 N +FA12 N +FA15 FA1E N +FA20 N +FA22 N +FA25 FA26 N +FA2A FA6D N +FA70 FAD9 N +FB00 FB06 N +FB13 FB17 N +FB1D N +FB1F FB36 N +FB38 FB3C N +FB3E N +FB40 FB41 N +FB43 FB44 N +FB46 FBB1 N +FBD3 FD3D N +FD50 FD8F N +FD92 FDC7 N +FDF0 FDFC N +FE10 FE19 N +FE30 FE44 N +FE47 FE52 N +FE54 FE66 N +FE68 FE6B N +FE70 FE72 N +FE74 N +FE76 FEFC N +FF01 FFBE N +FFC2 FFC7 N +FFCA FFCF N +FFD2 FFD7 N +FFDA FFDC N +FFE0 FFE6 N +FFE8 FFEE N +110BA M +11127 M +1133E M +11357 M +114B0 M +114BA M +114BD M +115AF M +1D15E 1D164 N +1D1BB 1D1C0 N +1D400 1D454 N +1D456 1D49C N +1D49E 1D49F N +1D4A2 N +1D4A5 1D4A6 N +1D4A9 1D4AC N +1D4AE 1D4B9 N +1D4BB N +1D4BD 1D4C3 N +1D4C5 1D505 N +1D507 1D50A N +1D50D 1D514 N +1D516 1D51C N +1D51E 1D539 N +1D53B 1D53E N +1D540 1D544 N +1D546 N +1D54A 1D550 N +1D552 1D6A5 N +1D6A8 1D7CB N +1D7CE 1D7FF N +1EE00 1EE03 N +1EE05 1EE1F N +1EE21 1EE22 N +1EE24 N +1EE27 N +1EE29 1EE32 N +1EE34 1EE37 N +1EE39 N +1EE3B N +1EE42 N +1EE47 N +1EE49 N +1EE4B N +1EE4D 1EE4F N +1EE51 1EE52 N +1EE54 N +1EE57 N +1EE59 N +1EE5B N +1EE5D N +1EE5F N +1EE61 1EE62 N +1EE64 N +1EE67 1EE6A N +1EE6C 1EE72 N +1EE74 1EE77 N +1EE79 1EE7C N +1EE7E N +1EE80 1EE89 N +1EE8B 1EE9B N +1EEA1 1EEA3 N +1EEA5 1EEA9 N +1EEAB 1EEBB N +1F100 1F10A N +1F110 1F12E N +1F130 1F14F N +1F16A 1F16B N +1F190 N +1F200 1F202 N +1F210 1F23B N +1F240 1F248 N +1F250 1F251 N +2F800 2FA1D N +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNameAlias'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNameAlias'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +0 NULL: control +0 NUL: abbreviation +1 START OF HEADING: control +1 SOH: abbreviation +2 START OF TEXT: control +2 STX: abbreviation +3 END OF TEXT: control +3 ETX: abbreviation +4 END OF TRANSMISSION: control +4 EOT: abbreviation +5 ENQUIRY: control +5 ENQ: abbreviation +6 ACKNOWLEDGE: control +6 ACK: abbreviation +7 ALERT: control +7 BEL: abbreviation +8 BACKSPACE: control +8 BS: abbreviation +9 CHARACTER TABULATION: control +9 HORIZONTAL TABULATION: control +9 HT: abbreviation +9 TAB: abbreviation +A LINE FEED: control +A NEW LINE: control +A END OF LINE: control +A LF: abbreviation +A NL: abbreviation +A EOL: abbreviation +B LINE TABULATION: control +B VERTICAL TABULATION: control +B VT: abbreviation +C FORM FEED: control +C FF: abbreviation +D CARRIAGE RETURN: control +D CR: abbreviation +E SHIFT OUT: control +E LOCKING-SHIFT ONE: control +E SO: abbreviation +F SHIFT IN: control +F LOCKING-SHIFT ZERO: control +F SI: abbreviation +10 DATA LINK ESCAPE: control +10 DLE: abbreviation +11 DEVICE CONTROL ONE: control +11 DC1: abbreviation +12 DEVICE CONTROL TWO: control +12 DC2: abbreviation +13 DEVICE CONTROL THREE: control +13 DC3: abbreviation +14 DEVICE CONTROL FOUR: control +14 DC4: abbreviation +15 NEGATIVE ACKNOWLEDGE: control +15 NAK: abbreviation +16 SYNCHRONOUS IDLE: control +16 SYN: abbreviation +17 END OF TRANSMISSION BLOCK: control +17 ETB: abbreviation +18 CANCEL: control +18 CAN: abbreviation +19 END OF MEDIUM: control +19 EOM: abbreviation +1A SUBSTITUTE: control +1A SUB: abbreviation +1B ESCAPE: control +1B ESC: abbreviation +1C INFORMATION SEPARATOR FOUR: control +1C FILE SEPARATOR: control +1C FS: abbreviation +1D INFORMATION SEPARATOR THREE: control +1D GROUP SEPARATOR: control +1D GS: abbreviation +1E INFORMATION SEPARATOR TWO: control +1E RECORD SEPARATOR: control +1E RS: abbreviation +1F INFORMATION SEPARATOR ONE: control +1F UNIT SEPARATOR: control +1F US: abbreviation +20 SP: abbreviation +7F DELETE: control +7F DEL: abbreviation +80 PADDING CHARACTER: figment +80 PAD: abbreviation +81 HIGH OCTET PRESET: figment +81 HOP: abbreviation +82 BREAK PERMITTED HERE: control +82 BPH: abbreviation +83 NO BREAK HERE: control +83 NBH: abbreviation +84 INDEX: control +84 IND: abbreviation +85 NEXT LINE: control +85 NEL: abbreviation +86 START OF SELECTED AREA: control +86 SSA: abbreviation +87 END OF SELECTED AREA: control +87 ESA: abbreviation +88 CHARACTER TABULATION SET: control +88 HORIZONTAL TABULATION SET: control +88 HTS: abbreviation +89 CHARACTER TABULATION WITH JUSTIFICATION: control +89 HORIZONTAL TABULATION WITH JUSTIFICATION: control +89 HTJ: abbreviation +8A LINE TABULATION SET: control +8A VERTICAL TABULATION SET: control +8A VTS: abbreviation +8B PARTIAL LINE FORWARD: control +8B PARTIAL LINE DOWN: control +8B PLD: abbreviation +8C PARTIAL LINE BACKWARD: control +8C PARTIAL LINE UP: control +8C PLU: abbreviation +8D REVERSE LINE FEED: control +8D REVERSE INDEX: control +8D RI: abbreviation +8E SINGLE SHIFT TWO: control +8E SINGLE-SHIFT-2: control +8E SS2: abbreviation +8F SINGLE SHIFT THREE: control +8F SINGLE-SHIFT-3: control +8F SS3: abbreviation +90 DEVICE CONTROL STRING: control +90 DCS: abbreviation +91 PRIVATE USE ONE: control +91 PRIVATE USE-1: control +91 PU1: abbreviation +92 PRIVATE USE TWO: control +92 PRIVATE USE-2: control +92 PU2: abbreviation +93 SET TRANSMIT STATE: control +93 STS: abbreviation +94 CANCEL CHARACTER: control +94 CCH: abbreviation +95 MESSAGE WAITING: control +95 MW: abbreviation +96 START OF GUARDED AREA: control +96 START OF PROTECTED AREA: control +96 SPA: abbreviation +97 END OF GUARDED AREA: control +97 END OF PROTECTED AREA: control +97 EPA: abbreviation +98 START OF STRING: control +98 SOS: abbreviation +99 SINGLE GRAPHIC CHARACTER INTRODUCER: figment +99 SGC: abbreviation +9A SINGLE CHARACTER INTRODUCER: control +9A SCI: abbreviation +9B CONTROL SEQUENCE INTRODUCER: control +9B CSI: abbreviation +9C STRING TERMINATOR: control +9C ST: abbreviation +9D OPERATING SYSTEM COMMAND: control +9D OSC: abbreviation +9E PRIVACY MESSAGE: control +9E PM: abbreviation +9F APPLICATION PROGRAM COMMAND: control +9F APC: abbreviation +A0 NBSP: abbreviation +AD SHY: abbreviation +1A2 LATIN CAPITAL LETTER GHA: correction +1A3 LATIN SMALL LETTER GHA: correction +34F CGJ: abbreviation +61C ALM: abbreviation +709 SYRIAC SUBLINEAR COLON SKEWED LEFT: correction +CDE KANNADA LETTER LLLA: correction +E9D LAO LETTER FO FON: correction +E9F LAO LETTER FO FAY: correction +EA3 LAO LETTER RO: correction +EA5 LAO LETTER LO: correction +FD0 TIBETAN MARK BKA- SHOG GI MGO RGYAN: correction +11EC HANGUL JONGSEONG YESIEUNG-KIYEOK: correction +11ED HANGUL JONGSEONG YESIEUNG-SSANGKIYEOK: correction +11EE HANGUL JONGSEONG SSANGYESIEUNG: correction +11EF HANGUL JONGSEONG YESIEUNG-KHIEUKH: correction +180B FVS1: abbreviation +180C FVS2: abbreviation +180D FVS3: abbreviation +180E MVS: abbreviation +200B ZWSP: abbreviation +200C ZWNJ: abbreviation +200D ZWJ: abbreviation +200E LRM: abbreviation +200F RLM: abbreviation +202A LRE: abbreviation +202B RLE: abbreviation +202C PDF: abbreviation +202D LRO: abbreviation +202E RLO: abbreviation +202F NNBSP: abbreviation +205F MMSP: abbreviation +2060 WJ: abbreviation +2066 LRI: abbreviation +2067 RLI: abbreviation +2068 FSI: abbreviation +2069 PDI: abbreviation +2118 WEIERSTRASS ELLIPTIC FUNCTION: correction +2448 MICR ON US SYMBOL: correction +2449 MICR DASH SYMBOL: correction +2B7A LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE: correction +2B7C RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE VERTICAL STROKE: correction +A015 YI SYLLABLE ITERATION MARK: correction +FE00 VS1: abbreviation +FE01 VS2: abbreviation +FE02 VS3: abbreviation +FE03 VS4: abbreviation +FE04 VS5: abbreviation +FE05 VS6: abbreviation +FE06 VS7: abbreviation +FE07 VS8: abbreviation +FE08 VS9: abbreviation +FE09 VS10: abbreviation +FE0A VS11: abbreviation +FE0B VS12: abbreviation +FE0C VS13: abbreviation +FE0D VS14: abbreviation +FE0E VS15: abbreviation +FE0F VS16: abbreviation +FE18 PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRACKET: correction +FEFF BYTE ORDER MARK: alternate +FEFF BOM: abbreviation +FEFF ZWNBSP: abbreviation +122D4 CUNEIFORM SIGN NU11 TENU: correction +122D5 CUNEIFORM SIGN NU11 OVER NU11 BUR OVER BUR: correction +1B001 HENTAIGANA LETTER E-1: correction +1D0C5 BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA VASIS: correction +E0100 VS17: abbreviation +E0101 VS18: abbreviation +E0102 VS19: abbreviation +E0103 VS20: abbreviation +E0104 VS21: abbreviation +E0105 VS22: abbreviation +E0106 VS23: abbreviation +E0107 VS24: abbreviation +E0108 VS25: abbreviation +E0109 VS26: abbreviation +E010A VS27: abbreviation +E010B VS28: abbreviation +E010C VS29: abbreviation +E010D VS30: abbreviation +E010E VS31: abbreviation +E010F VS32: abbreviation +E0110 VS33: abbreviation +E0111 VS34: abbreviation +E0112 VS35: abbreviation +E0113 VS36: abbreviation +E0114 VS37: abbreviation +E0115 VS38: abbreviation +E0116 VS39: abbreviation +E0117 VS40: abbreviation +E0118 VS41: abbreviation +E0119 VS42: abbreviation +E011A VS43: abbreviation +E011B VS44: abbreviation +E011C VS45: abbreviation +E011D VS46: abbreviation +E011E VS47: abbreviation +E011F VS48: abbreviation +E0120 VS49: abbreviation +E0121 VS50: abbreviation +E0122 VS51: abbreviation +E0123 VS52: abbreviation +E0124 VS53: abbreviation +E0125 VS54: abbreviation +E0126 VS55: abbreviation +E0127 VS56: abbreviation +E0128 VS57: abbreviation +E0129 VS58: abbreviation +E012A VS59: abbreviation +E012B VS60: abbreviation +E012C VS61: abbreviation +E012D VS62: abbreviation +E012E VS63: abbreviation +E012F VS64: abbreviation +E0130 VS65: abbreviation +E0131 VS66: abbreviation +E0132 VS67: abbreviation +E0133 VS68: abbreviation +E0134 VS69: abbreviation +E0135 VS70: abbreviation +E0136 VS71: abbreviation +E0137 VS72: abbreviation +E0138 VS73: abbreviation +E0139 VS74: abbreviation +E013A VS75: abbreviation +E013B VS76: abbreviation +E013C VS77: abbreviation +E013D VS78: abbreviation +E013E VS79: abbreviation +E013F VS80: abbreviation +E0140 VS81: abbreviation +E0141 VS82: abbreviation +E0142 VS83: abbreviation +E0143 VS84: abbreviation +E0144 VS85: abbreviation +E0145 VS86: abbreviation +E0146 VS87: abbreviation +E0147 VS88: abbreviation +E0148 VS89: abbreviation +E0149 VS90: abbreviation +E014A VS91: abbreviation +E014B VS92: abbreviation +E014C VS93: abbreviation +E014D VS94: abbreviation +E014E VS95: abbreviation +E014F VS96: abbreviation +E0150 VS97: abbreviation +E0151 VS98: abbreviation +E0152 VS99: abbreviation +E0153 VS100: abbreviation +E0154 VS101: abbreviation +E0155 VS102: abbreviation +E0156 VS103: abbreviation +E0157 VS104: abbreviation +E0158 VS105: abbreviation +E0159 VS106: abbreviation +E015A VS107: abbreviation +E015B VS108: abbreviation +E015C VS109: abbreviation +E015D VS110: abbreviation +E015E VS111: abbreviation +E015F VS112: abbreviation +E0160 VS113: abbreviation +E0161 VS114: abbreviation +E0162 VS115: abbreviation +E0163 VS116: abbreviation +E0164 VS117: abbreviation +E0165 VS118: abbreviation +E0166 VS119: abbreviation +E0167 VS120: abbreviation +E0168 VS121: abbreviation +E0169 VS122: abbreviation +E016A VS123: abbreviation +E016B VS124: abbreviation +E016C VS125: abbreviation +E016D VS126: abbreviation +E016E VS127: abbreviation +E016F VS128: abbreviation +E0170 VS129: abbreviation +E0171 VS130: abbreviation +E0172 VS131: abbreviation +E0173 VS132: abbreviation +E0174 VS133: abbreviation +E0175 VS134: abbreviation +E0176 VS135: abbreviation +E0177 VS136: abbreviation +E0178 VS137: abbreviation +E0179 VS138: abbreviation +E017A VS139: abbreviation +E017B VS140: abbreviation +E017C VS141: abbreviation +E017D VS142: abbreviation +E017E VS143: abbreviation +E017F VS144: abbreviation +E0180 VS145: abbreviation +E0181 VS146: abbreviation +E0182 VS147: abbreviation +E0183 VS148: abbreviation +E0184 VS149: abbreviation +E0185 VS150: abbreviation +E0186 VS151: abbreviation +E0187 VS152: abbreviation +E0188 VS153: abbreviation +E0189 VS154: abbreviation +E018A VS155: abbreviation +E018B VS156: abbreviation +E018C VS157: abbreviation +E018D VS158: abbreviation +E018E VS159: abbreviation +E018F VS160: abbreviation +E0190 VS161: abbreviation +E0191 VS162: abbreviation +E0192 VS163: abbreviation +E0193 VS164: abbreviation +E0194 VS165: abbreviation +E0195 VS166: abbreviation +E0196 VS167: abbreviation +E0197 VS168: abbreviation +E0198 VS169: abbreviation +E0199 VS170: abbreviation +E019A VS171: abbreviation +E019B VS172: abbreviation +E019C VS173: abbreviation +E019D VS174: abbreviation +E019E VS175: abbreviation +E019F VS176: abbreviation +E01A0 VS177: abbreviation +E01A1 VS178: abbreviation +E01A2 VS179: abbreviation +E01A3 VS180: abbreviation +E01A4 VS181: abbreviation +E01A5 VS182: abbreviation +E01A6 VS183: abbreviation +E01A7 VS184: abbreviation +E01A8 VS185: abbreviation +E01A9 VS186: abbreviation +E01AA VS187: abbreviation +E01AB VS188: abbreviation +E01AC VS189: abbreviation +E01AD VS190: abbreviation +E01AE VS191: abbreviation +E01AF VS192: abbreviation +E01B0 VS193: abbreviation +E01B1 VS194: abbreviation +E01B2 VS195: abbreviation +E01B3 VS196: abbreviation +E01B4 VS197: abbreviation +E01B5 VS198: abbreviation +E01B6 VS199: abbreviation +E01B7 VS200: abbreviation +E01B8 VS201: abbreviation +E01B9 VS202: abbreviation +E01BA VS203: abbreviation +E01BB VS204: abbreviation +E01BC VS205: abbreviation +E01BD VS206: abbreviation +E01BE VS207: abbreviation +E01BF VS208: abbreviation +E01C0 VS209: abbreviation +E01C1 VS210: abbreviation +E01C2 VS211: abbreviation +E01C3 VS212: abbreviation +E01C4 VS213: abbreviation +E01C5 VS214: abbreviation +E01C6 VS215: abbreviation +E01C7 VS216: abbreviation +E01C8 VS217: abbreviation +E01C9 VS218: abbreviation +E01CA VS219: abbreviation +E01CB VS220: abbreviation +E01CC VS221: abbreviation +E01CD VS222: abbreviation +E01CE VS223: abbreviation +E01CF VS224: abbreviation +E01D0 VS225: abbreviation +E01D1 VS226: abbreviation +E01D2 VS227: abbreviation +E01D3 VS228: abbreviation +E01D4 VS229: abbreviation +E01D5 VS230: abbreviation +E01D6 VS231: abbreviation +E01D7 VS232: abbreviation +E01D8 VS233: abbreviation +E01D9 VS234: abbreviation +E01DA VS235: abbreviation +E01DB VS236: abbreviation +E01DC VS237: abbreviation +E01DD VS238: abbreviation +E01DE VS239: abbreviation +E01DF VS240: abbreviation +E01E0 VS241: abbreviation +E01E1 VS242: abbreviation +E01E2 VS243: abbreviation +E01E3 VS244: abbreviation +E01E4 VS245: abbreviation +E01E5 VS246: abbreviation +E01E6 VS247: abbreviation +E01E7 VS248: abbreviation +E01E8 VS249: abbreviation +E01E9 VS250: abbreviation +E01EA VS251: abbreviation +E01EB VS252: abbreviation +E01EC VS253: abbreviation +E01ED VS254: abbreviation +E01EE VS255: abbreviation +E01EF VS256: abbreviation +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToInPC'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToInPC'}{'missing'} = 'NA'; + +return <<'END'; +900 902 Top +903 Right +93A Top +93B Right +93C Bottom +93E Right +93F Left +940 Right +941 944 Bottom +945 948 Top +949 94C Right +94D Bottom +94E Left +94F Right +951 Top +952 Bottom +953 955 Top +956 957 Bottom +962 963 Bottom +981 Top +982 983 Right +9BC Bottom +9BE Right +9BF Left +9C0 Right +9C1 9C4 Bottom +9C7 9C8 Left +9CB 9CC Left_And_Right +9CD Bottom +9D7 Right +9E2 9E3 Bottom +A01 A02 Top +A03 Right +A3C Bottom +A3E Right +A3F Left +A40 Right +A41 A42 Bottom +A47 A48 Top +A4B A4C Top +A4D Bottom +A70 A71 Top +A75 Bottom +A81 A82 Top +A83 Right +ABC Bottom +ABE Right +ABF Left +AC0 Right +AC1 AC4 Bottom +AC5 Top +AC7 AC8 Top +AC9 Top_And_Right +ACB ACC Right +ACD Bottom +AE2 AE3 Bottom +AFA AFF Top +B01 Top +B02 B03 Right +B3C Bottom +B3E Right +B3F Top +B40 Right +B41 B44 Bottom +B47 Left +B48 Top_And_Left +B4B Left_And_Right +B4C Top_And_Left_And_Right +B4D Bottom +B56 Top +B57 Top_And_Right +B62 B63 Bottom +B82 Top +BBE BBF Right +BC0 Top +BC1 BC2 Right +BC6 BC8 Left +BCA BCC Left_And_Right +BCD Top +BD7 Right +C00 Top +C01 C03 Right +C3E C40 Top +C41 C44 Right +C46 C47 Top +C48 Top_And_Bottom +C4A C4D Top +C55 Top +C56 Bottom +C62 C63 Bottom +C81 Top +C82 C83 Right +CBC Bottom +CBE Right +CBF Top +CC0 Top_And_Right +CC1 CC4 Right +CC6 Top +CC7 CC8 Top_And_Right +CCA CCB Top_And_Right +CCC CCD Top +CD5 CD6 Right +CE2 CE3 Bottom +D00 D01 Top +D02 D03 Right +D3B D3C Top +D3E D42 Right +D43 D44 Bottom +D46 D48 Left +D4A D4C Left_And_Right +D4D Top +D57 Right +D62 D63 Bottom +D82 D83 Right +DCA Top +DCF DD1 Right +DD2 DD3 Top +DD4 Bottom +DD6 Bottom +DD8 Right +DD9 Left +DDA Top_And_Left +DDB Left +DDC Left_And_Right +DDD Top_And_Left_And_Right +DDE Left_And_Right +DDF Right +DF2 DF3 Right +E30 Right +E31 Top +E32 E33 Right +E34 E37 Top +E38 E3A Bottom +E40 E44 Visual_Order_Left +E45 Right +E47 E4E Top +EB0 Right +EB1 Top +EB2 EB3 Right +EB4 EB7 Top +EB8 EB9 Bottom +EBB Top +EBC Bottom +EC0 EC4 Visual_Order_Left +EC8 ECD Top +F18 F19 Bottom +F35 Bottom +F37 Bottom +F39 Top +F3E Right +F3F Left +F71 Bottom +F72 Top +F73 Top_And_Bottom +F74 F75 Bottom +F76 F79 Top_And_Bottom +F7A F7E Top +F7F Right +F80 Top +F81 Top_And_Bottom +F82 F83 Top +F84 Bottom +F86 F87 Top +F8D F97 Bottom +F99 FBC Bottom +FC6 Bottom +102B 102C Right +102D 102E Top +102F 1030 Bottom +1031 Left +1032 1036 Top +1037 Bottom +1038 Right +103A Top +103B Right +103D 103E Bottom +1056 1057 Right +1058 1059 Bottom +105E 1060 Bottom +1062 1064 Right +1067 106D Right +1071 1074 Top +1082 Bottom +1083 Right +1084 Left +1085 1086 Top +1087 108C Right +108D Bottom +108F Right +109A 109C Right +109D Top +1712 Top +1713 1714 Bottom +1732 Top +1733 1734 Bottom +1752 Top +1753 Bottom +1772 Top +1773 Bottom +17B6 Right +17B7 17BA Top +17BB 17BD Bottom +17BE Top_And_Left +17BF Top_And_Left_And_Right +17C0 Left_And_Right +17C1 17C3 Left +17C4 17C5 Left_And_Right +17C6 Top +17C7 17C8 Right +17C9 17D1 Top +17D3 Top +17DD Top +1920 1921 Top +1922 Bottom +1923 1924 Right +1925 1926 Top_And_Right +1927 1928 Top +1929 192B Right +1930 1931 Right +1932 Bottom +1933 1938 Right +1939 Bottom +193A Top +193B Bottom +19B0 19B4 Right +19B5 19B7 Visual_Order_Left +19B8 19B9 Right +19BA Visual_Order_Left +19BB 19C0 Right +19C8 19C9 Right +1A17 Top +1A18 Bottom +1A19 Left +1A1A Right +1A1B Top +1A55 Left +1A56 Bottom +1A57 Right +1A58 1A5A Top +1A5B 1A5E Bottom +1A61 Right +1A62 Top +1A63 1A64 Right +1A65 1A68 Top +1A69 1A6A Bottom +1A6B Top +1A6C Bottom +1A6D Right +1A6E 1A72 Left +1A73 1A7C Top +1A7F Bottom +1B00 1B03 Top +1B04 Right +1B34 Top +1B35 Right +1B36 1B37 Top +1B38 1B3A Bottom +1B3B Bottom_And_Right +1B3C Top_And_Bottom +1B3D Top_And_Bottom_And_Right +1B3E 1B3F Left +1B40 1B41 Left_And_Right +1B42 Top +1B43 Top_And_Right +1B44 Right +1B6B Top +1B6C Bottom +1B6D 1B73 Top +1B80 1B81 Top +1B82 Right +1BA1 Right +1BA2 1BA3 Bottom +1BA4 Top +1BA5 Bottom +1BA6 Left +1BA7 Right +1BA8 1BA9 Top +1BAA Right +1BAC 1BAD Bottom +1BE6 Top +1BE7 Right +1BE8 1BE9 Top +1BEA 1BEC Right +1BED Top +1BEE Right +1BEF 1BF1 Top +1BF2 1BF3 Right +1C24 1C26 Right +1C27 1C28 Left +1C29 Top_And_Left +1C2A 1C2B Right +1C2C Bottom +1C2D 1C33 Top +1C34 1C35 Left +1C36 Top +1C37 Bottom +1CD0 1CD2 Top +1CD4 Overstruck +1CD5 1CD9 Bottom +1CDA 1CDB Top +1CDC 1CDF Bottom +1CE0 Top +1CE1 Right +1CE2 1CE8 Overstruck +1CED Bottom +1CF4 Top +1CF7 Right +1DFB Top +A806 Top +A80B Top +A823 A824 Right +A825 Bottom +A826 Top +A827 Right +A880 A881 Right +A8B4 A8C3 Right +A8C4 Bottom +A8C5 Top +A8E0 A8F1 Top +A92B A92D Bottom +A947 A949 Bottom +A94A Top +A94B A94E Bottom +A94F A951 Top +A952 A953 Right +A980 A982 Top +A983 Right +A9B3 Top +A9B4 A9B5 Right +A9B6 A9B7 Top +A9B8 A9B9 Bottom +A9BA A9BB Left +A9BC Top +A9BD A9BE Right +A9BF Bottom_And_Left +A9C0 Bottom_And_Right +A9E5 Top +AA29 AA2C Top +AA2D Bottom +AA2E Top +AA2F AA30 Left +AA31 Top +AA32 Bottom +AA33 Right +AA34 Left +AA35 AA36 Bottom +AA43 Top +AA4C Top +AA4D Right +AA7B Right +AA7C Top +AA7D Right +AAB0 Top +AAB1 Right +AAB2 AAB3 Top +AAB4 Bottom +AAB5 AAB6 Visual_Order_Left +AAB7 AAB8 Top +AAB9 Visual_Order_Left +AABA Right +AABB AABC Visual_Order_Left +AABD Right +AABE AABF Top +AAC1 Top +AAEB Left +AAEC Bottom +AAED Top +AAEE Left +AAEF Right +AAF5 Right +ABE3 ABE4 Right +ABE5 Top +ABE6 ABE7 Right +ABE8 Bottom +ABE9 ABEA Right +ABEC Right +ABED Bottom +10A01 Overstruck +10A02 10A03 Bottom +10A05 Top +10A06 Overstruck +10A0C 10A0E Bottom +10A0F Top +10A38 Top +10A39 10A3A Bottom +11000 Right +11001 Top +11002 Right +11038 1103B Top +1103C 11041 Bottom +11042 11046 Top +11080 11081 Top +11082 Right +110B0 Right +110B1 Left +110B2 Right +110B3 110B4 Bottom +110B5 110B6 Top +110B7 110B8 Right +110B9 110BA Bottom +11100 11102 Top +11127 11129 Top +1112A 1112B Bottom +1112C Left +1112D Top +1112E 1112F Top_And_Bottom +11130 Top +11131 11132 Bottom +11134 Top +11173 Bottom +11180 11181 Top +11182 Right +111B3 Right +111B4 Left +111B5 Right +111B6 111BB Bottom +111BC 111BE Top +111BF Top_And_Right +111C0 Right +111CB Top +111CC Bottom +1122C 1122E Right +1122F Bottom +11230 11231 Top +11232 11233 Top_And_Right +11234 Top +11235 Right +11236 11237 Top +1123E Top +112DF Top +112E0 Right +112E1 Left +112E2 Right +112E3 112E4 Bottom +112E5 112E8 Top +112E9 112EA Bottom +11301 Top +11302 11303 Right +1133E 1133F Right +11340 Top +11341 11344 Right +11347 11348 Left +1134B 1134C Left_And_Right +1134D Right +11357 Right +11362 11363 Right +11366 1136C Top +11370 11374 Top +11435 Right +11436 Left +11437 Right +11438 1143D Bottom +1143E 1143F Top +11440 11441 Right +11442 Bottom +11443 11444 Top +11445 Right +11446 Bottom +114B0 Right +114B1 Left +114B2 Right +114B3 114B8 Bottom +114B9 Left +114BA Top +114BB Top_And_Left +114BC Left_And_Right +114BD Right +114BE Left_And_Right +114BF 114C0 Top +114C1 Right +114C2 114C3 Bottom +115AF Right +115B0 Left +115B1 Right +115B2 115B5 Bottom +115B8 Left +115B9 Top_And_Left +115BA Left_And_Right +115BB Top_And_Left_And_Right +115BC 115BD Top +115BE Right +115BF 115C0 Bottom +115DC 115DD Bottom +11630 11632 Right +11633 11638 Bottom +11639 1163A Top +1163B 1163C Right +1163D Top +1163E Right +1163F Bottom +11640 Top +116AB Top +116AC Right +116AD Top +116AE Left +116AF Right +116B0 116B1 Bottom +116B2 116B5 Top +116B6 Right +116B7 Bottom +1171D Bottom +1171F Top +11720 11721 Right +11722 11723 Top +11724 11725 Bottom +11726 Left +11727 Top +11728 Bottom +11729 1172B Top +11A01 Top +11A02 11A03 Bottom +11A04 11A09 Top +11A0A Bottom +11A33 11A34 Bottom +11A35 11A38 Top +11A39 Right +11A3B 11A3E Bottom +11A51 Top +11A52 11A53 Bottom +11A54 11A56 Top +11A57 11A58 Right +11A59 11A5B Bottom +11A8A 11A95 Bottom +11A96 Top +11A97 Right +11A98 Top +11C2F Right +11C30 11C31 Top +11C32 11C36 Bottom +11C38 11C3D Top +11C3E Right +11C3F Bottom +11C92 11CA7 Bottom +11CA9 Right +11CAA 11CB0 Bottom +11CB1 Left +11CB2 Bottom +11CB3 Top +11CB4 Right +11CB5 11CB6 Top +11D31 11D35 Top +11D36 Bottom +11D3A Top +11D3C 11D3D Top +11D3F 11D41 Top +11D42 Bottom +11D43 Top +11D44 Bottom +11D47 Bottom +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToBc'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToBc'}{'missing'} = 'L'; + +return <<'END'; +0 8 BN +9 S +A B +B S +C WS +D B +E 1B BN +1C 1E B +1F S +20 WS +21 22 ON +23 25 ET +26 2A ON +2B ES +2C CS +2D ES +2E 2F CS +30 39 EN +3A CS +3B 40 ON +5B 60 ON +7B 7E ON +7F 84 BN +85 B +86 9F BN +A0 CS +A1 ON +A2 A5 ET +A6 A9 ON +AB AC ON +AD BN +AE AF ON +B0 B1 ET +B2 B3 EN +B4 ON +B6 B8 ON +B9 EN +BB BF ON +D7 ON +F7 ON +2B9 2BA ON +2C2 2CF ON +2D2 2DF ON +2E5 2ED ON +2EF 2FF ON +300 36F NSM +374 375 ON +37E ON +384 385 ON +387 ON +3F6 ON +483 489 NSM +58A ON +58D 58E ON +58F ET +590 R +591 5BD NSM +5BE R +5BF NSM +5C0 R +5C1 5C2 NSM +5C3 R +5C4 5C5 NSM +5C6 R +5C7 NSM +5C8 5FF R +600 605 AN +606 607 ON +608 AL +609 60A ET +60B AL +60C CS +60D AL +60E 60F ON +610 61A NSM +61B 64A AL +64B 65F NSM +660 669 AN +66A ET +66B 66C AN +66D 66F AL +670 NSM +671 6D5 AL +6D6 6DC NSM +6DD AN +6DE ON +6DF 6E4 NSM +6E5 6E6 AL +6E7 6E8 NSM +6E9 ON +6EA 6ED NSM +6EE 6EF AL +6F0 6F9 EN +6FA 710 AL +711 NSM +712 72F AL +730 74A NSM +74B 7A5 AL +7A6 7B0 NSM +7B1 7BF AL +7C0 7EA R +7EB 7F3 NSM +7F4 7F5 R +7F6 7F9 ON +7FA 815 R +816 819 NSM +81A R +81B 823 NSM +824 R +825 827 NSM +828 R +829 82D NSM +82E 858 R +859 85B NSM +85C 85F R +860 86F AL +870 89F R +8A0 8D3 AL +8D4 8E1 NSM +8E2 AN +8E3 902 NSM +93A NSM +93C NSM +941 948 NSM +94D NSM +951 957 NSM +962 963 NSM +981 NSM +9BC NSM +9C1 9C4 NSM +9CD NSM +9E2 9E3 NSM +9F2 9F3 ET +9FB ET +A01 A02 NSM +A3C NSM +A41 A42 NSM +A47 A48 NSM +A4B A4D NSM +A51 NSM +A70 A71 NSM +A75 NSM +A81 A82 NSM +ABC NSM +AC1 AC5 NSM +AC7 AC8 NSM +ACD NSM +AE2 AE3 NSM +AF1 ET +AFA AFF NSM +B01 NSM +B3C NSM +B3F NSM +B41 B44 NSM +B4D NSM +B56 NSM +B62 B63 NSM +B82 NSM +BC0 NSM +BCD NSM +BF3 BF8 ON +BF9 ET +BFA ON +C00 NSM +C3E C40 NSM +C46 C48 NSM +C4A C4D NSM +C55 C56 NSM +C62 C63 NSM +C78 C7E ON +C81 NSM +CBC NSM +CCC CCD NSM +CE2 CE3 NSM +D00 D01 NSM +D3B D3C NSM +D41 D44 NSM +D4D NSM +D62 D63 NSM +DCA NSM +DD2 DD4 NSM +DD6 NSM +E31 NSM +E34 E3A NSM +E3F ET +E47 E4E NSM +EB1 NSM +EB4 EB9 NSM +EBB EBC NSM +EC8 ECD NSM +F18 F19 NSM +F35 NSM +F37 NSM +F39 NSM +F3A F3D ON +F71 F7E NSM +F80 F84 NSM +F86 F87 NSM +F8D F97 NSM +F99 FBC NSM +FC6 NSM +102D 1030 NSM +1032 1037 NSM +1039 103A NSM +103D 103E NSM +1058 1059 NSM +105E 1060 NSM +1071 1074 NSM +1082 NSM +1085 1086 NSM +108D NSM +109D NSM +135D 135F NSM +1390 1399 ON +1400 ON +1680 WS +169B 169C ON +1712 1714 NSM +1732 1734 NSM +1752 1753 NSM +1772 1773 NSM +17B4 17B5 NSM +17B7 17BD NSM +17C6 NSM +17C9 17D3 NSM +17DB ET +17DD NSM +17F0 17F9 ON +1800 180A ON +180B 180D NSM +180E BN +1885 1886 NSM +18A9 NSM +1920 1922 NSM +1927 1928 NSM +1932 NSM +1939 193B NSM +1940 ON +1944 1945 ON +19DE 19FF ON +1A17 1A18 NSM +1A1B NSM +1A56 NSM +1A58 1A5E NSM +1A60 NSM +1A62 NSM +1A65 1A6C NSM +1A73 1A7C NSM +1A7F NSM +1AB0 1ABE NSM +1B00 1B03 NSM +1B34 NSM +1B36 1B3A NSM +1B3C NSM +1B42 NSM +1B6B 1B73 NSM +1B80 1B81 NSM +1BA2 1BA5 NSM +1BA8 1BA9 NSM +1BAB 1BAD NSM +1BE6 NSM +1BE8 1BE9 NSM +1BED NSM +1BEF 1BF1 NSM +1C2C 1C33 NSM +1C36 1C37 NSM +1CD0 1CD2 NSM +1CD4 1CE0 NSM +1CE2 1CE8 NSM +1CED NSM +1CF4 NSM +1CF8 1CF9 NSM +1DC0 1DF9 NSM +1DFB 1DFF NSM +1FBD ON +1FBF 1FC1 ON +1FCD 1FCF ON +1FDD 1FDF ON +1FED 1FEF ON +1FFD 1FFE ON +2000 200A WS +200B 200D BN +200F R +2010 2027 ON +2028 WS +2029 B +202A LRE +202B RLE +202C PDF +202D LRO +202E RLO +202F CS +2030 2034 ET +2035 2043 ON +2044 CS +2045 205E ON +205F WS +2060 2065 BN +2066 LRI +2067 RLI +2068 FSI +2069 PDI +206A 206F BN +2070 EN +2074 2079 EN +207A 207B ES +207C 207E ON +2080 2089 EN +208A 208B ES +208C 208E ON +20A0 20CF ET +20D0 20F0 NSM +2100 2101 ON +2103 2106 ON +2108 2109 ON +2114 ON +2116 2118 ON +211E 2123 ON +2125 ON +2127 ON +2129 ON +212E ET +213A 213B ON +2140 2144 ON +214A 214D ON +2150 215F ON +2189 218B ON +2190 2211 ON +2212 ES +2213 ET +2214 2335 ON +237B 2394 ON +2396 2426 ON +2440 244A ON +2460 2487 ON +2488 249B EN +24EA 26AB ON +26AD 27FF ON +2900 2B73 ON +2B76 2B95 ON +2B98 2BB9 ON +2BBD 2BC8 ON +2BCA 2BD2 ON +2BEC 2BEF ON +2CE5 2CEA ON +2CEF 2CF1 NSM +2CF9 2CFF ON +2D7F NSM +2DE0 2DFF NSM +2E00 2E49 ON +2E80 2E99 ON +2E9B 2EF3 ON +2F00 2FD5 ON +2FF0 2FFB ON +3000 WS +3001 3004 ON +3008 3020 ON +302A 302D NSM +3030 ON +3036 3037 ON +303D 303F ON +3099 309A NSM +309B 309C ON +30A0 ON +30FB ON +31C0 31E3 ON +321D 321E ON +3250 325F ON +327C 327E ON +32B1 32BF ON +32CC 32CF ON +3377 337A ON +33DE 33DF ON +33FF ON +4DC0 4DFF ON +A490 A4C6 ON +A60D A60F ON +A66F A672 NSM +A673 ON +A674 A67D NSM +A67E A67F ON +A69E A69F NSM +A6F0 A6F1 NSM +A700 A721 ON +A788 ON +A802 NSM +A806 NSM +A80B NSM +A825 A826 NSM +A828 A82B ON +A838 A839 ET +A874 A877 ON +A8C4 A8C5 NSM +A8E0 A8F1 NSM +A926 A92D NSM +A947 A951 NSM +A980 A982 NSM +A9B3 NSM +A9B6 A9B9 NSM +A9BC NSM +A9E5 NSM +AA29 AA2E NSM +AA31 AA32 NSM +AA35 AA36 NSM +AA43 NSM +AA4C NSM +AA7C NSM +AAB0 NSM +AAB2 AAB4 NSM +AAB7 AAB8 NSM +AABE AABF NSM +AAC1 NSM +AAEC AAED NSM +AAF6 NSM +ABE5 NSM +ABE8 NSM +ABED NSM +FB1D R +FB1E NSM +FB1F FB28 R +FB29 ES +FB2A FB4F R +FB50 FD3D AL +FD3E FD3F ON +FD40 FDCF AL +FDD0 FDEF BN +FDF0 FDFC AL +FDFD ON +FDFE FDFF AL +FE00 FE0F NSM +FE10 FE19 ON +FE20 FE2F NSM +FE30 FE4F ON +FE50 CS +FE51 ON +FE52 CS +FE54 ON +FE55 CS +FE56 FE5E ON +FE5F ET +FE60 FE61 ON +FE62 FE63 ES +FE64 FE66 ON +FE68 ON +FE69 FE6A ET +FE6B ON +FE70 FEFE AL +FEFF BN +FF01 FF02 ON +FF03 FF05 ET +FF06 FF0A ON +FF0B ES +FF0C CS +FF0D ES +FF0E FF0F CS +FF10 FF19 EN +FF1A CS +FF1B FF20 ON +FF3B FF40 ON +FF5B FF65 ON +FFE0 FFE1 ET +FFE2 FFE4 ON +FFE5 FFE6 ET +FFE8 FFEE ON +FFF0 FFF8 BN +FFF9 FFFD ON +FFFE FFFF BN +10101 ON +10140 1018C ON +10190 1019B ON +101A0 ON +101FD NSM +102E0 NSM +102E1 102FB EN +10376 1037A NSM +10800 1091E R +1091F ON +10920 10A00 R +10A01 10A03 NSM +10A04 R +10A05 10A06 NSM +10A07 10A0B R +10A0C 10A0F NSM +10A10 10A37 R +10A38 10A3A NSM +10A3B 10A3E R +10A3F NSM +10A40 10AE4 R +10AE5 10AE6 NSM +10AE7 10B38 R +10B39 10B3F ON +10B40 10E5F R +10E60 10E7E AN +10E7F 10FFF R +11001 NSM +11038 11046 NSM +11052 11065 ON +1107F 11081 NSM +110B3 110B6 NSM +110B9 110BA NSM +11100 11102 NSM +11127 1112B NSM +1112D 11134 NSM +11173 NSM +11180 11181 NSM +111B6 111BE NSM +111CA 111CC NSM +1122F 11231 NSM +11234 NSM +11236 11237 NSM +1123E NSM +112DF NSM +112E3 112EA NSM +11300 11301 NSM +1133C NSM +11340 NSM +11366 1136C NSM +11370 11374 NSM +11438 1143F NSM +11442 11444 NSM +11446 NSM +114B3 114B8 NSM +114BA NSM +114BF 114C0 NSM +114C2 114C3 NSM +115B2 115B5 NSM +115BC 115BD NSM +115BF 115C0 NSM +115DC 115DD NSM +11633 1163A NSM +1163D NSM +1163F 11640 NSM +11660 1166C ON +116AB NSM +116AD NSM +116B0 116B5 NSM +116B7 NSM +1171D 1171F NSM +11722 11725 NSM +11727 1172B NSM +11A01 11A06 NSM +11A09 11A0A NSM +11A33 11A38 NSM +11A3B 11A3E NSM +11A47 NSM +11A51 11A56 NSM +11A59 11A5B NSM +11A8A 11A96 NSM +11A98 11A99 NSM +11C30 11C36 NSM +11C38 11C3D NSM +11C92 11CA7 NSM +11CAA 11CB0 NSM +11CB2 11CB3 NSM +11CB5 11CB6 NSM +11D31 11D36 NSM +11D3A NSM +11D3C 11D3D NSM +11D3F 11D45 NSM +11D47 NSM +16AF0 16AF4 NSM +16B30 16B36 NSM +16F8F 16F92 NSM +1BC9D 1BC9E NSM +1BCA0 1BCA3 BN +1D167 1D169 NSM +1D173 1D17A BN +1D17B 1D182 NSM +1D185 1D18B NSM +1D1AA 1D1AD NSM +1D200 1D241 ON +1D242 1D244 NSM +1D245 ON +1D300 1D356 ON +1D6DB ON +1D715 ON +1D74F ON +1D789 ON +1D7C3 ON +1D7CE 1D7FF EN +1DA00 1DA36 NSM +1DA3B 1DA6C NSM +1DA75 NSM +1DA84 NSM +1DA9B 1DA9F NSM +1DAA1 1DAAF NSM +1E000 1E006 NSM +1E008 1E018 NSM +1E01B 1E021 NSM +1E023 1E024 NSM +1E026 1E02A NSM +1E800 1E8CF R +1E8D0 1E8D6 NSM +1E8D7 1E943 R +1E944 1E94A NSM +1E94B 1EDFF R +1EE00 1EEEF AL +1EEF0 1EEF1 ON +1EEF2 1EEFF AL +1EF00 1EFFF R +1F000 1F02B ON +1F030 1F093 ON +1F0A0 1F0AE ON +1F0B1 1F0BF ON +1F0C1 1F0CF ON +1F0D1 1F0F5 ON +1F100 1F10A EN +1F10B 1F10C ON +1F16A 1F16B ON +1F260 1F265 ON +1F300 1F6D4 ON +1F6E0 1F6EC ON +1F6F0 1F6F8 ON +1F700 1F773 ON +1F780 1F7D4 ON +1F800 1F80B ON +1F810 1F847 ON +1F850 1F859 ON +1F860 1F887 ON +1F890 1F8AD ON +1F900 1F90B ON +1F910 1F93E ON +1F940 1F94C ON +1F950 1F96B ON +1F980 1F997 ON +1F9C0 ON +1F9D0 1F9E6 ON +1FFFE 1FFFF BN +2FFFE 2FFFF BN +3FFFE 3FFFF BN +4FFFE 4FFFF BN +5FFFE 5FFFF BN +6FFFE 6FFFF BN +7FFFE 7FFFF BN +8FFFE 8FFFF BN +9FFFE 9FFFF BN +AFFFE AFFFF BN +BFFFE BFFFF BN +CFFFE CFFFF BN +DFFFE E00FF BN +E0100 E01EF NSM +E01F0 E0FFF BN +EFFFE EFFFF BN +FFFFE FFFFF BN +10FFFE 10FFFF BN +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToSc'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToSc'}{'missing'} = 'Unknown'; + +return <<'END'; +0 40 Common +41 5A Latin +5B 60 Common +61 7A Latin +7B A9 Common +AA Latin +AB B9 Common +BA Latin +BB BF Common +C0 D6 Latin +D7 Common +D8 F6 Latin +F7 Common +F8 2B8 Latin +2B9 2DF Common +2E0 2E4 Latin +2E5 2E9 Common +2EA 2EB Bopomofo +2EC 2FF Common +300 36F Inherited +370 373 Greek +374 Common +375 377 Greek +37A 37D Greek +37E Common +37F Greek +384 Greek +385 Common +386 Greek +387 Common +388 38A Greek +38C Greek +38E 3A1 Greek +3A3 3E1 Greek +3E2 3EF Coptic +3F0 3FF Greek +400 484 Cyrillic +485 486 Inherited +487 52F Cyrillic +531 556 Armenian +559 55F Armenian +561 587 Armenian +589 Common +58A Armenian +58D 58F Armenian +591 5C7 Hebrew +5D0 5EA Hebrew +5F0 5F4 Hebrew +600 604 Arabic +605 Common +606 60B Arabic +60C Common +60D 61A Arabic +61B Common +61C Arabic +61E Arabic +61F Common +620 63F Arabic +640 Common +641 64A Arabic +64B 655 Inherited +656 66F Arabic +670 Inherited +671 6DC Arabic +6DD Common +6DE 6FF Arabic +700 70D Syriac +70F 74A Syriac +74D 74F Syriac +750 77F Arabic +780 7B1 Thaana +7C0 7FA Nko +800 82D Samaritan +830 83E Samaritan +840 85B Mandaic +85E Mandaic +860 86A Syriac +8A0 8B4 Arabic +8B6 8BD Arabic +8D4 8E1 Arabic +8E2 Common +8E3 8FF Arabic +900 950 Devanagari +951 952 Inherited +953 963 Devanagari +964 965 Common +966 97F Devanagari +980 983 Bengali +985 98C Bengali +98F 990 Bengali +993 9A8 Bengali +9AA 9B0 Bengali +9B2 Bengali +9B6 9B9 Bengali +9BC 9C4 Bengali +9C7 9C8 Bengali +9CB 9CE Bengali +9D7 Bengali +9DC 9DD Bengali +9DF 9E3 Bengali +9E6 9FD Bengali +A01 A03 Gurmukhi +A05 A0A Gurmukhi +A0F A10 Gurmukhi +A13 A28 Gurmukhi +A2A A30 Gurmukhi +A32 A33 Gurmukhi +A35 A36 Gurmukhi +A38 A39 Gurmukhi +A3C Gurmukhi +A3E A42 Gurmukhi +A47 A48 Gurmukhi +A4B A4D Gurmukhi +A51 Gurmukhi +A59 A5C Gurmukhi +A5E Gurmukhi +A66 A75 Gurmukhi +A81 A83 Gujarati +A85 A8D Gujarati +A8F A91 Gujarati +A93 AA8 Gujarati +AAA AB0 Gujarati +AB2 AB3 Gujarati +AB5 AB9 Gujarati +ABC AC5 Gujarati +AC7 AC9 Gujarati +ACB ACD Gujarati +AD0 Gujarati +AE0 AE3 Gujarati +AE6 AF1 Gujarati +AF9 AFF Gujarati +B01 B03 Oriya +B05 B0C Oriya +B0F B10 Oriya +B13 B28 Oriya +B2A B30 Oriya +B32 B33 Oriya +B35 B39 Oriya +B3C B44 Oriya +B47 B48 Oriya +B4B B4D Oriya +B56 B57 Oriya +B5C B5D Oriya +B5F B63 Oriya +B66 B77 Oriya +B82 B83 Tamil +B85 B8A Tamil +B8E B90 Tamil +B92 B95 Tamil +B99 B9A Tamil +B9C Tamil +B9E B9F Tamil +BA3 BA4 Tamil +BA8 BAA Tamil +BAE BB9 Tamil +BBE BC2 Tamil +BC6 BC8 Tamil +BCA BCD Tamil +BD0 Tamil +BD7 Tamil +BE6 BFA Tamil +C00 C03 Telugu +C05 C0C Telugu +C0E C10 Telugu +C12 C28 Telugu +C2A C39 Telugu +C3D C44 Telugu +C46 C48 Telugu +C4A C4D Telugu +C55 C56 Telugu +C58 C5A Telugu +C60 C63 Telugu +C66 C6F Telugu +C78 C7F Telugu +C80 C83 Kannada +C85 C8C Kannada +C8E C90 Kannada +C92 CA8 Kannada +CAA CB3 Kannada +CB5 CB9 Kannada +CBC CC4 Kannada +CC6 CC8 Kannada +CCA CCD Kannada +CD5 CD6 Kannada +CDE Kannada +CE0 CE3 Kannada +CE6 CEF Kannada +CF1 CF2 Kannada +D00 D03 Malayalam +D05 D0C Malayalam +D0E D10 Malayalam +D12 D44 Malayalam +D46 D48 Malayalam +D4A D4F Malayalam +D54 D63 Malayalam +D66 D7F Malayalam +D82 D83 Sinhala +D85 D96 Sinhala +D9A DB1 Sinhala +DB3 DBB Sinhala +DBD Sinhala +DC0 DC6 Sinhala +DCA Sinhala +DCF DD4 Sinhala +DD6 Sinhala +DD8 DDF Sinhala +DE6 DEF Sinhala +DF2 DF4 Sinhala +E01 E3A Thai +E3F Common +E40 E5B Thai +E81 E82 Lao +E84 Lao +E87 E88 Lao +E8A Lao +E8D Lao +E94 E97 Lao +E99 E9F Lao +EA1 EA3 Lao +EA5 Lao +EA7 Lao +EAA EAB Lao +EAD EB9 Lao +EBB EBD Lao +EC0 EC4 Lao +EC6 Lao +EC8 ECD Lao +ED0 ED9 Lao +EDC EDF Lao +F00 F47 Tibetan +F49 F6C Tibetan +F71 F97 Tibetan +F99 FBC Tibetan +FBE FCC Tibetan +FCE FD4 Tibetan +FD5 FD8 Common +FD9 FDA Tibetan +1000 109F Myanmar +10A0 10C5 Georgian +10C7 Georgian +10CD Georgian +10D0 10FA Georgian +10FB Common +10FC 10FF Georgian +1100 11FF Hangul +1200 1248 Ethiopic +124A 124D Ethiopic +1250 1256 Ethiopic +1258 Ethiopic +125A 125D Ethiopic +1260 1288 Ethiopic +128A 128D Ethiopic +1290 12B0 Ethiopic +12B2 12B5 Ethiopic +12B8 12BE Ethiopic +12C0 Ethiopic +12C2 12C5 Ethiopic +12C8 12D6 Ethiopic +12D8 1310 Ethiopic +1312 1315 Ethiopic +1318 135A Ethiopic +135D 137C Ethiopic +1380 1399 Ethiopic +13A0 13F5 Cherokee +13F8 13FD Cherokee +1400 167F Canadian_Aboriginal +1680 169C Ogham +16A0 16EA Runic +16EB 16ED Common +16EE 16F8 Runic +1700 170C Tagalog +170E 1714 Tagalog +1720 1734 Hanunoo +1735 1736 Common +1740 1753 Buhid +1760 176C Tagbanwa +176E 1770 Tagbanwa +1772 1773 Tagbanwa +1780 17DD Khmer +17E0 17E9 Khmer +17F0 17F9 Khmer +1800 1801 Mongolian +1802 1803 Common +1804 Mongolian +1805 Common +1806 180E Mongolian +1810 1819 Mongolian +1820 1877 Mongolian +1880 18AA Mongolian +18B0 18F5 Canadian_Aboriginal +1900 191E Limbu +1920 192B Limbu +1930 193B Limbu +1940 Limbu +1944 194F Limbu +1950 196D Tai_Le +1970 1974 Tai_Le +1980 19AB New_Tai_Lue +19B0 19C9 New_Tai_Lue +19D0 19DA New_Tai_Lue +19DE 19DF New_Tai_Lue +19E0 19FF Khmer +1A00 1A1B Buginese +1A1E 1A1F Buginese +1A20 1A5E Tai_Tham +1A60 1A7C Tai_Tham +1A7F 1A89 Tai_Tham +1A90 1A99 Tai_Tham +1AA0 1AAD Tai_Tham +1AB0 1ABE Inherited +1B00 1B4B Balinese +1B50 1B7C Balinese +1B80 1BBF Sundanese +1BC0 1BF3 Batak +1BFC 1BFF Batak +1C00 1C37 Lepcha +1C3B 1C49 Lepcha +1C4D 1C4F Lepcha +1C50 1C7F Ol_Chiki +1C80 1C88 Cyrillic +1CC0 1CC7 Sundanese +1CD0 1CD2 Inherited +1CD3 Common +1CD4 1CE0 Inherited +1CE1 Common +1CE2 1CE8 Inherited +1CE9 1CEC Common +1CED Inherited +1CEE 1CF3 Common +1CF4 Inherited +1CF5 1CF7 Common +1CF8 1CF9 Inherited +1D00 1D25 Latin +1D26 1D2A Greek +1D2B Cyrillic +1D2C 1D5C Latin +1D5D 1D61 Greek +1D62 1D65 Latin +1D66 1D6A Greek +1D6B 1D77 Latin +1D78 Cyrillic +1D79 1DBE Latin +1DBF Greek +1DC0 1DF9 Inherited +1DFB 1DFF Inherited +1E00 1EFF Latin +1F00 1F15 Greek +1F18 1F1D Greek +1F20 1F45 Greek +1F48 1F4D Greek +1F50 1F57 Greek +1F59 Greek +1F5B Greek +1F5D Greek +1F5F 1F7D Greek +1F80 1FB4 Greek +1FB6 1FC4 Greek +1FC6 1FD3 Greek +1FD6 1FDB Greek +1FDD 1FEF Greek +1FF2 1FF4 Greek +1FF6 1FFE Greek +2000 200B Common +200C 200D Inherited +200E 2064 Common +2066 2070 Common +2071 Latin +2074 207E Common +207F Latin +2080 208E Common +2090 209C Latin +20A0 20BF Common +20D0 20F0 Inherited +2100 2125 Common +2126 Greek +2127 2129 Common +212A 212B Latin +212C 2131 Common +2132 Latin +2133 214D Common +214E Latin +214F 215F Common +2160 2188 Latin +2189 218B Common +2190 2426 Common +2440 244A Common +2460 27FF Common +2800 28FF Braille +2900 2B73 Common +2B76 2B95 Common +2B98 2BB9 Common +2BBD 2BC8 Common +2BCA 2BD2 Common +2BEC 2BEF Common +2C00 2C2E Glagolitic +2C30 2C5E Glagolitic +2C60 2C7F Latin +2C80 2CF3 Coptic +2CF9 2CFF Coptic +2D00 2D25 Georgian +2D27 Georgian +2D2D Georgian +2D30 2D67 Tifinagh +2D6F 2D70 Tifinagh +2D7F Tifinagh +2D80 2D96 Ethiopic +2DA0 2DA6 Ethiopic +2DA8 2DAE Ethiopic +2DB0 2DB6 Ethiopic +2DB8 2DBE Ethiopic +2DC0 2DC6 Ethiopic +2DC8 2DCE Ethiopic +2DD0 2DD6 Ethiopic +2DD8 2DDE Ethiopic +2DE0 2DFF Cyrillic +2E00 2E49 Common +2E80 2E99 Han +2E9B 2EF3 Han +2F00 2FD5 Han +2FF0 2FFB Common +3000 3004 Common +3005 Han +3006 Common +3007 Han +3008 3020 Common +3021 3029 Han +302A 302D Inherited +302E 302F Hangul +3030 3037 Common +3038 303B Han +303C 303F Common +3041 3096 Hiragana +3099 309A Inherited +309B 309C Common +309D 309F Hiragana +30A0 Common +30A1 30FA Katakana +30FB 30FC Common +30FD 30FF Katakana +3105 312E Bopomofo +3131 318E Hangul +3190 319F Common +31A0 31BA Bopomofo +31C0 31E3 Common +31F0 31FF Katakana +3200 321E Hangul +3220 325F Common +3260 327E Hangul +327F 32CF Common +32D0 32FE Katakana +3300 3357 Katakana +3358 33FF Common +3400 4DB5 Han +4DC0 4DFF Common +4E00 9FEA Han +A000 A48C Yi +A490 A4C6 Yi +A4D0 A4FF Lisu +A500 A62B Vai +A640 A69F Cyrillic +A6A0 A6F7 Bamum +A700 A721 Common +A722 A787 Latin +A788 A78A Common +A78B A7AE Latin +A7B0 A7B7 Latin +A7F7 A7FF Latin +A800 A82B Syloti_Nagri +A830 A839 Common +A840 A877 Phags_Pa +A880 A8C5 Saurashtra +A8CE A8D9 Saurashtra +A8E0 A8FD Devanagari +A900 A92D Kayah_Li +A92E Common +A92F Kayah_Li +A930 A953 Rejang +A95F Rejang +A960 A97C Hangul +A980 A9CD Javanese +A9CF Common +A9D0 A9D9 Javanese +A9DE A9DF Javanese +A9E0 A9FE Myanmar +AA00 AA36 Cham +AA40 AA4D Cham +AA50 AA59 Cham +AA5C AA5F Cham +AA60 AA7F Myanmar +AA80 AAC2 Tai_Viet +AADB AADF Tai_Viet +AAE0 AAF6 Meetei_Mayek +AB01 AB06 Ethiopic +AB09 AB0E Ethiopic +AB11 AB16 Ethiopic +AB20 AB26 Ethiopic +AB28 AB2E Ethiopic +AB30 AB5A Latin +AB5B Common +AB5C AB64 Latin +AB65 Greek +AB70 ABBF Cherokee +ABC0 ABED Meetei_Mayek +ABF0 ABF9 Meetei_Mayek +AC00 D7A3 Hangul +D7B0 D7C6 Hangul +D7CB D7FB Hangul +F900 FA6D Han +FA70 FAD9 Han +FB00 FB06 Latin +FB13 FB17 Armenian +FB1D FB36 Hebrew +FB38 FB3C Hebrew +FB3E Hebrew +FB40 FB41 Hebrew +FB43 FB44 Hebrew +FB46 FB4F Hebrew +FB50 FBC1 Arabic +FBD3 FD3D Arabic +FD3E FD3F Common +FD50 FD8F Arabic +FD92 FDC7 Arabic +FDF0 FDFD Arabic +FE00 FE0F Inherited +FE10 FE19 Common +FE20 FE2D Inherited +FE2E FE2F Cyrillic +FE30 FE52 Common +FE54 FE66 Common +FE68 FE6B Common +FE70 FE74 Arabic +FE76 FEFC Arabic +FEFF Common +FF01 FF20 Common +FF21 FF3A Latin +FF3B FF40 Common +FF41 FF5A Latin +FF5B FF65 Common +FF66 FF6F Katakana +FF70 Common +FF71 FF9D Katakana +FF9E FF9F Common +FFA0 FFBE Hangul +FFC2 FFC7 Hangul +FFCA FFCF Hangul +FFD2 FFD7 Hangul +FFDA FFDC Hangul +FFE0 FFE6 Common +FFE8 FFEE Common +FFF9 FFFD Common +10000 1000B Linear_B +1000D 10026 Linear_B +10028 1003A Linear_B +1003C 1003D Linear_B +1003F 1004D Linear_B +10050 1005D Linear_B +10080 100FA Linear_B +10100 10102 Common +10107 10133 Common +10137 1013F Common +10140 1018E Greek +10190 1019B Common +101A0 Greek +101D0 101FC Common +101FD Inherited +10280 1029C Lycian +102A0 102D0 Carian +102E0 Inherited +102E1 102FB Common +10300 10323 Old_Italic +1032D 1032F Old_Italic +10330 1034A Gothic +10350 1037A Old_Permic +10380 1039D Ugaritic +1039F Ugaritic +103A0 103C3 Old_Persian +103C8 103D5 Old_Persian +10400 1044F Deseret +10450 1047F Shavian +10480 1049D Osmanya +104A0 104A9 Osmanya +104B0 104D3 Osage +104D8 104FB Osage +10500 10527 Elbasan +10530 10563 Caucasian_Albanian +1056F Caucasian_Albanian +10600 10736 Linear_A +10740 10755 Linear_A +10760 10767 Linear_A +10800 10805 Cypriot +10808 Cypriot +1080A 10835 Cypriot +10837 10838 Cypriot +1083C Cypriot +1083F Cypriot +10840 10855 Imperial_Aramaic +10857 1085F Imperial_Aramaic +10860 1087F Palmyrene +10880 1089E Nabataean +108A7 108AF Nabataean +108E0 108F2 Hatran +108F4 108F5 Hatran +108FB 108FF Hatran +10900 1091B Phoenician +1091F Phoenician +10920 10939 Lydian +1093F Lydian +10980 1099F Meroitic_Hieroglyphs +109A0 109B7 Meroitic_Cursive +109BC 109CF Meroitic_Cursive +109D2 109FF Meroitic_Cursive +10A00 10A03 Kharoshthi +10A05 10A06 Kharoshthi +10A0C 10A13 Kharoshthi +10A15 10A17 Kharoshthi +10A19 10A33 Kharoshthi +10A38 10A3A Kharoshthi +10A3F 10A47 Kharoshthi +10A50 10A58 Kharoshthi +10A60 10A7F Old_South_Arabian +10A80 10A9F Old_North_Arabian +10AC0 10AE6 Manichaean +10AEB 10AF6 Manichaean +10B00 10B35 Avestan +10B39 10B3F Avestan +10B40 10B55 Inscriptional_Parthian +10B58 10B5F Inscriptional_Parthian +10B60 10B72 Inscriptional_Pahlavi +10B78 10B7F Inscriptional_Pahlavi +10B80 10B91 Psalter_Pahlavi +10B99 10B9C Psalter_Pahlavi +10BA9 10BAF Psalter_Pahlavi +10C00 10C48 Old_Turkic +10C80 10CB2 Old_Hungarian +10CC0 10CF2 Old_Hungarian +10CFA 10CFF Old_Hungarian +10E60 10E7E Arabic +11000 1104D Brahmi +11052 1106F Brahmi +1107F Brahmi +11080 110C1 Kaithi +110D0 110E8 Sora_Sompeng +110F0 110F9 Sora_Sompeng +11100 11134 Chakma +11136 11143 Chakma +11150 11176 Mahajani +11180 111CD Sharada +111D0 111DF Sharada +111E1 111F4 Sinhala +11200 11211 Khojki +11213 1123E Khojki +11280 11286 Multani +11288 Multani +1128A 1128D Multani +1128F 1129D Multani +1129F 112A9 Multani +112B0 112EA Khudawadi +112F0 112F9 Khudawadi +11300 11303 Grantha +11305 1130C Grantha +1130F 11310 Grantha +11313 11328 Grantha +1132A 11330 Grantha +11332 11333 Grantha +11335 11339 Grantha +1133C 11344 Grantha +11347 11348 Grantha +1134B 1134D Grantha +11350 Grantha +11357 Grantha +1135D 11363 Grantha +11366 1136C Grantha +11370 11374 Grantha +11400 11459 Newa +1145B Newa +1145D Newa +11480 114C7 Tirhuta +114D0 114D9 Tirhuta +11580 115B5 Siddham +115B8 115DD Siddham +11600 11644 Modi +11650 11659 Modi +11660 1166C Mongolian +11680 116B7 Takri +116C0 116C9 Takri +11700 11719 Ahom +1171D 1172B Ahom +11730 1173F Ahom +118A0 118F2 Warang_Citi +118FF Warang_Citi +11A00 11A47 Zanabazar_Square +11A50 11A83 Soyombo +11A86 11A9C Soyombo +11A9E 11AA2 Soyombo +11AC0 11AF8 Pau_Cin_Hau +11C00 11C08 Bhaiksuki +11C0A 11C36 Bhaiksuki +11C38 11C45 Bhaiksuki +11C50 11C6C Bhaiksuki +11C70 11C8F Marchen +11C92 11CA7 Marchen +11CA9 11CB6 Marchen +11D00 11D06 Masaram_Gondi +11D08 11D09 Masaram_Gondi +11D0B 11D36 Masaram_Gondi +11D3A Masaram_Gondi +11D3C 11D3D Masaram_Gondi +11D3F 11D47 Masaram_Gondi +11D50 11D59 Masaram_Gondi +12000 12399 Cuneiform +12400 1246E Cuneiform +12470 12474 Cuneiform +12480 12543 Cuneiform +13000 1342E Egyptian_Hieroglyphs +14400 14646 Anatolian_Hieroglyphs +16800 16A38 Bamum +16A40 16A5E Mro +16A60 16A69 Mro +16A6E 16A6F Mro +16AD0 16AED Bassa_Vah +16AF0 16AF5 Bassa_Vah +16B00 16B45 Pahawh_Hmong +16B50 16B59 Pahawh_Hmong +16B5B 16B61 Pahawh_Hmong +16B63 16B77 Pahawh_Hmong +16B7D 16B8F Pahawh_Hmong +16F00 16F44 Miao +16F50 16F7E Miao +16F8F 16F9F Miao +16FE0 Tangut +16FE1 Nushu +17000 187EC Tangut +18800 18AF2 Tangut +1B000 Katakana +1B001 1B11E Hiragana +1B170 1B2FB Nushu +1BC00 1BC6A Duployan +1BC70 1BC7C Duployan +1BC80 1BC88 Duployan +1BC90 1BC99 Duployan +1BC9C 1BC9F Duployan +1BCA0 1BCA3 Common +1D000 1D0F5 Common +1D100 1D126 Common +1D129 1D166 Common +1D167 1D169 Inherited +1D16A 1D17A Common +1D17B 1D182 Inherited +1D183 1D184 Common +1D185 1D18B Inherited +1D18C 1D1A9 Common +1D1AA 1D1AD Inherited +1D1AE 1D1E8 Common +1D200 1D245 Greek +1D300 1D356 Common +1D360 1D371 Common +1D400 1D454 Common +1D456 1D49C Common +1D49E 1D49F Common +1D4A2 Common +1D4A5 1D4A6 Common +1D4A9 1D4AC Common +1D4AE 1D4B9 Common +1D4BB Common +1D4BD 1D4C3 Common +1D4C5 1D505 Common +1D507 1D50A Common +1D50D 1D514 Common +1D516 1D51C Common +1D51E 1D539 Common +1D53B 1D53E Common +1D540 1D544 Common +1D546 Common +1D54A 1D550 Common +1D552 1D6A5 Common +1D6A8 1D7CB Common +1D7CE 1D7FF Common +1D800 1DA8B SignWriting +1DA9B 1DA9F SignWriting +1DAA1 1DAAF SignWriting +1E000 1E006 Glagolitic +1E008 1E018 Glagolitic +1E01B 1E021 Glagolitic +1E023 1E024 Glagolitic +1E026 1E02A Glagolitic +1E800 1E8C4 Mende_Kikakui +1E8C7 1E8D6 Mende_Kikakui +1E900 1E94A Adlam +1E950 1E959 Adlam +1E95E 1E95F Adlam +1EE00 1EE03 Arabic +1EE05 1EE1F Arabic +1EE21 1EE22 Arabic +1EE24 Arabic +1EE27 Arabic +1EE29 1EE32 Arabic +1EE34 1EE37 Arabic +1EE39 Arabic +1EE3B Arabic +1EE42 Arabic +1EE47 Arabic +1EE49 Arabic +1EE4B Arabic +1EE4D 1EE4F Arabic +1EE51 1EE52 Arabic +1EE54 Arabic +1EE57 Arabic +1EE59 Arabic +1EE5B Arabic +1EE5D Arabic +1EE5F Arabic +1EE61 1EE62 Arabic +1EE64 Arabic +1EE67 1EE6A Arabic +1EE6C 1EE72 Arabic +1EE74 1EE77 Arabic +1EE79 1EE7C Arabic +1EE7E Arabic +1EE80 1EE89 Arabic +1EE8B 1EE9B Arabic +1EEA1 1EEA3 Arabic +1EEA5 1EEA9 Arabic +1EEAB 1EEBB Arabic +1EEF0 1EEF1 Arabic +1F000 1F02B Common +1F030 1F093 Common +1F0A0 1F0AE Common +1F0B1 1F0BF Common +1F0C1 1F0CF Common +1F0D1 1F0F5 Common +1F100 1F10C Common +1F110 1F12E Common +1F130 1F16B Common +1F170 1F1AC Common +1F1E6 1F1FF Common +1F200 Hiragana +1F201 1F202 Common +1F210 1F23B Common +1F240 1F248 Common +1F250 1F251 Common +1F260 1F265 Common +1F300 1F6D4 Common +1F6E0 1F6EC Common +1F6F0 1F6F8 Common +1F700 1F773 Common +1F780 1F7D4 Common +1F800 1F80B Common +1F810 1F847 Common +1F850 1F859 Common +1F860 1F887 Common +1F890 1F8AD Common +1F900 1F90B Common +1F910 1F93E Common +1F940 1F94C Common +1F950 1F96B Common +1F980 1F997 Common +1F9C0 Common +1F9D0 1F9E6 Common +20000 2A6D6 Han +2A700 2B734 Han +2B740 2B81D Han +2B820 2CEA1 Han +2CEB0 2EBE0 Han +2F800 2FA1D Han +E0001 Common +E0020 E007F Common +E0100 E01EF Inherited +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToScx'}{'format'} = 'sw'; # string, but some elements are interpreted as a list; white space occurs only as list item separators +$utf8::SwashInfo{'ToScx'}{'missing'} = 'Unknown'; + +return <<'END'; +0 40 Common +41 5A Latin +5B 60 Common +61 7A Latin +7B A9 Common +AA Latin +AB B9 Common +BA Latin +BB BF Common +C0 D6 Latin +D7 Common +D8 F6 Latin +F7 Common +F8 2B8 Latin +2B9 2DF Common +2E0 2E4 Latin +2E5 2E9 Common +2EA 2EB Bopomofo +2EC 2FF Common +300 341 Inherited +342 Greek +343 344 Inherited +345 Greek +346 362 Inherited +363 36F Latin +370 373 Greek +374 Common +375 377 Greek +37A 37D Greek +37E Common +37F Greek +384 Greek +385 Common +386 Greek +387 Common +388 38A Greek +38C Greek +38E 3A1 Greek +3A3 3E1 Greek +3E2 3EF Coptic +3F0 3FF Greek +400 482 Cyrillic +483 Cyrillic Old_Permic +484 Cyrillic Glagolitic +485 486 Cyrillic Latin +487 Cyrillic Glagolitic +488 52F Cyrillic +531 556 Armenian +559 55F Armenian +561 587 Armenian +589 Armenian Georgian +58A Armenian +58D 58F Armenian +591 5C7 Hebrew +5D0 5EA Hebrew +5F0 5F4 Hebrew +600 604 Arabic +605 Common +606 60B Arabic +60C Arabic Syriac Thaana +60D 61A Arabic +61B 61C Arabic Syriac Thaana +61E Arabic +61F Arabic Syriac Thaana +620 63F Arabic +640 Adlam Arabic Mandaic Manichaean Psalter_Pahlavi Syriac +641 64A Arabic +64B 655 Arabic Syriac +656 65F Arabic +660 669 Arabic Thaana +66A 66F Arabic +670 Arabic Syriac +671 6DC Arabic +6DD Common +6DE 6FF Arabic +700 70D Syriac +70F 74A Syriac +74D 74F Syriac +750 77F Arabic +780 7B1 Thaana +7C0 7FA Nko +800 82D Samaritan +830 83E Samaritan +840 85B Mandaic +85E Mandaic +860 86A Syriac +8A0 8B4 Arabic +8B6 8BD Arabic +8D4 8E1 Arabic +8E2 Common +8E3 8FF Arabic +900 950 Devanagari +951 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Latin Malayalam Oriya Sharada Tamil Telugu +952 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Latin Malayalam Oriya Tamil Telugu +953 963 Devanagari +964 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Mahajani Malayalam Oriya Khudawadi Sinhala Syloti_Nagri Takri Tamil Telugu Tirhuta +965 Bengali Devanagari Grantha Gujarati Gurmukhi Kannada Limbu Mahajani Malayalam Oriya Khudawadi Sinhala Syloti_Nagri Takri Tamil Telugu Tirhuta +966 96F Devanagari Kaithi Mahajani +970 97F Devanagari +980 983 Bengali +985 98C Bengali +98F 990 Bengali +993 9A8 Bengali +9AA 9B0 Bengali +9B2 Bengali +9B6 9B9 Bengali +9BC 9C4 Bengali +9C7 9C8 Bengali +9CB 9CE Bengali +9D7 Bengali +9DC 9DD Bengali +9DF 9E3 Bengali +9E6 9EF Bengali Chakma Syloti_Nagri +9F0 9FD Bengali +A01 A03 Gurmukhi +A05 A0A Gurmukhi +A0F A10 Gurmukhi +A13 A28 Gurmukhi +A2A A30 Gurmukhi +A32 A33 Gurmukhi +A35 A36 Gurmukhi +A38 A39 Gurmukhi +A3C Gurmukhi +A3E A42 Gurmukhi +A47 A48 Gurmukhi +A4B A4D Gurmukhi +A51 Gurmukhi +A59 A5C Gurmukhi +A5E Gurmukhi +A66 A6F Gurmukhi Multani +A70 A75 Gurmukhi +A81 A83 Gujarati +A85 A8D Gujarati +A8F A91 Gujarati +A93 AA8 Gujarati +AAA AB0 Gujarati +AB2 AB3 Gujarati +AB5 AB9 Gujarati +ABC AC5 Gujarati +AC7 AC9 Gujarati +ACB ACD Gujarati +AD0 Gujarati +AE0 AE3 Gujarati +AE6 AEF Gujarati Khojki +AF0 AF1 Gujarati +AF9 AFF Gujarati +B01 B03 Oriya +B05 B0C Oriya +B0F B10 Oriya +B13 B28 Oriya +B2A B30 Oriya +B32 B33 Oriya +B35 B39 Oriya +B3C B44 Oriya +B47 B48 Oriya +B4B B4D Oriya +B56 B57 Oriya +B5C B5D Oriya +B5F B63 Oriya +B66 B77 Oriya +B82 B83 Tamil +B85 B8A Tamil +B8E B90 Tamil +B92 B95 Tamil +B99 B9A Tamil +B9C Tamil +B9E B9F Tamil +BA3 BA4 Tamil +BA8 BA9 Tamil +BAA Grantha Tamil +BAE BB4 Tamil +BB5 Grantha Tamil +BB6 BB9 Tamil +BBE BC2 Tamil +BC6 BC8 Tamil +BCA BCD Tamil +BD0 Tamil +BD7 Tamil +BE6 BF2 Grantha Tamil +BF3 BFA Tamil +C00 C03 Telugu +C05 C0C Telugu +C0E C10 Telugu +C12 C28 Telugu +C2A C39 Telugu +C3D C44 Telugu +C46 C48 Telugu +C4A C4D Telugu +C55 C56 Telugu +C58 C5A Telugu +C60 C63 Telugu +C66 C6F Telugu +C78 C7F Telugu +C80 C83 Kannada +C85 C8C Kannada +C8E C90 Kannada +C92 CA8 Kannada +CAA CB3 Kannada +CB5 CB9 Kannada +CBC CC4 Kannada +CC6 CC8 Kannada +CCA CCD Kannada +CD5 CD6 Kannada +CDE Kannada +CE0 CE3 Kannada +CE6 CEF Kannada +CF1 CF2 Kannada +D00 D03 Malayalam +D05 D0C Malayalam +D0E D10 Malayalam +D12 D44 Malayalam +D46 D48 Malayalam +D4A D4F Malayalam +D54 D63 Malayalam +D66 D7F Malayalam +D82 D83 Sinhala +D85 D96 Sinhala +D9A DB1 Sinhala +DB3 DBB Sinhala +DBD Sinhala +DC0 DC6 Sinhala +DCA Sinhala +DCF DD4 Sinhala +DD6 Sinhala +DD8 DDF Sinhala +DE6 DEF Sinhala +DF2 DF4 Sinhala +E01 E3A Thai +E3F Common +E40 E5B Thai +E81 E82 Lao +E84 Lao +E87 E88 Lao +E8A Lao +E8D Lao +E94 E97 Lao +E99 E9F Lao +EA1 EA3 Lao +EA5 Lao +EA7 Lao +EAA EAB Lao +EAD EB9 Lao +EBB EBD Lao +EC0 EC4 Lao +EC6 Lao +EC8 ECD Lao +ED0 ED9 Lao +EDC EDF Lao +F00 F47 Tibetan +F49 F6C Tibetan +F71 F97 Tibetan +F99 FBC Tibetan +FBE FCC Tibetan +FCE FD4 Tibetan +FD5 FD8 Common +FD9 FDA Tibetan +1000 103F Myanmar +1040 1049 Chakma Myanmar Tai_Le +104A 109F Myanmar +10A0 10C5 Georgian +10C7 Georgian +10CD Georgian +10D0 10FA Georgian +10FB Georgian Latin +10FC 10FF Georgian +1100 11FF Hangul +1200 1248 Ethiopic +124A 124D Ethiopic +1250 1256 Ethiopic +1258 Ethiopic +125A 125D Ethiopic +1260 1288 Ethiopic +128A 128D Ethiopic +1290 12B0 Ethiopic +12B2 12B5 Ethiopic +12B8 12BE Ethiopic +12C0 Ethiopic +12C2 12C5 Ethiopic +12C8 12D6 Ethiopic +12D8 1310 Ethiopic +1312 1315 Ethiopic +1318 135A Ethiopic +135D 137C Ethiopic +1380 1399 Ethiopic +13A0 13F5 Cherokee +13F8 13FD Cherokee +1400 167F Canadian_Aboriginal +1680 169C Ogham +16A0 16EA Runic +16EB 16ED Common +16EE 16F8 Runic +1700 170C Tagalog +170E 1714 Tagalog +1720 1734 Hanunoo +1735 1736 Buhid Hanunoo Tagbanwa Tagalog +1740 1753 Buhid +1760 176C Tagbanwa +176E 1770 Tagbanwa +1772 1773 Tagbanwa +1780 17DD Khmer +17E0 17E9 Khmer +17F0 17F9 Khmer +1800 1801 Mongolian +1802 1803 Mongolian Phags_Pa +1804 Mongolian +1805 Mongolian Phags_Pa +1806 180E Mongolian +1810 1819 Mongolian +1820 1877 Mongolian +1880 18AA Mongolian +18B0 18F5 Canadian_Aboriginal +1900 191E Limbu +1920 192B Limbu +1930 193B Limbu +1940 Limbu +1944 194F Limbu +1950 196D Tai_Le +1970 1974 Tai_Le +1980 19AB New_Tai_Lue +19B0 19C9 New_Tai_Lue +19D0 19DA New_Tai_Lue +19DE 19DF New_Tai_Lue +19E0 19FF Khmer +1A00 1A1B Buginese +1A1E 1A1F Buginese +1A20 1A5E Tai_Tham +1A60 1A7C Tai_Tham +1A7F 1A89 Tai_Tham +1A90 1A99 Tai_Tham +1AA0 1AAD Tai_Tham +1AB0 1ABE Inherited +1B00 1B4B Balinese +1B50 1B7C Balinese +1B80 1BBF Sundanese +1BC0 1BF3 Batak +1BFC 1BFF Batak +1C00 1C37 Lepcha +1C3B 1C49 Lepcha +1C4D 1C4F Lepcha +1C50 1C7F Ol_Chiki +1C80 1C88 Cyrillic +1CC0 1CC7 Sundanese +1CD0 Devanagari Grantha +1CD1 Devanagari +1CD2 1CD3 Devanagari Grantha +1CD4 1CD6 Devanagari +1CD7 Devanagari Sharada +1CD8 Devanagari +1CD9 Devanagari Sharada +1CDA Devanagari Kannada Malayalam Tamil Telugu +1CDB Devanagari +1CDC 1CDD Devanagari Sharada +1CDE 1CDF Devanagari +1CE0 Devanagari Sharada +1CE1 1CF1 Devanagari +1CF2 1CF4 Devanagari Grantha +1CF5 Devanagari Kannada +1CF6 Devanagari +1CF7 Bengali +1CF8 1CF9 Devanagari Grantha +1D00 1D25 Latin +1D26 1D2A Greek +1D2B Cyrillic +1D2C 1D5C Latin +1D5D 1D61 Greek +1D62 1D65 Latin +1D66 1D6A Greek +1D6B 1D77 Latin +1D78 Cyrillic +1D79 1DBE Latin +1DBF 1DC1 Greek +1DC2 1DF9 Inherited +1DFB 1DFF Inherited +1E00 1EFF Latin +1F00 1F15 Greek +1F18 1F1D Greek +1F20 1F45 Greek +1F48 1F4D Greek +1F50 1F57 Greek +1F59 Greek +1F5B Greek +1F5D Greek +1F5F 1F7D Greek +1F80 1FB4 Greek +1FB6 1FC4 Greek +1FC6 1FD3 Greek +1FD6 1FDB Greek +1FDD 1FEF Greek +1FF2 1FF4 Greek +1FF6 1FFE Greek +2000 200B Common +200C 200D Inherited +200E 2064 Common +2066 2070 Common +2071 Latin +2074 207E Common +207F Latin +2080 208E Common +2090 209C Latin +20A0 20BF Common +20D0 20EF Inherited +20F0 Devanagari Grantha Latin +2100 2125 Common +2126 Greek +2127 2129 Common +212A 212B Latin +212C 2131 Common +2132 Latin +2133 214D Common +214E Latin +214F 215F Common +2160 2188 Latin +2189 218B Common +2190 2426 Common +2440 244A Common +2460 27FF Common +2800 28FF Braille +2900 2B73 Common +2B76 2B95 Common +2B98 2BB9 Common +2BBD 2BC8 Common +2BCA 2BD2 Common +2BEC 2BEF Common +2C00 2C2E Glagolitic +2C30 2C5E Glagolitic +2C60 2C7F Latin +2C80 2CF3 Coptic +2CF9 2CFF Coptic +2D00 2D25 Georgian +2D27 Georgian +2D2D Georgian +2D30 2D67 Tifinagh +2D6F 2D70 Tifinagh +2D7F Tifinagh +2D80 2D96 Ethiopic +2DA0 2DA6 Ethiopic +2DA8 2DAE Ethiopic +2DB0 2DB6 Ethiopic +2DB8 2DBE Ethiopic +2DC0 2DC6 Ethiopic +2DC8 2DCE Ethiopic +2DD0 2DD6 Ethiopic +2DD8 2DDE Ethiopic +2DE0 2DFF Cyrillic +2E00 2E42 Common +2E43 Cyrillic Glagolitic +2E44 2E49 Common +2E80 2E99 Han +2E9B 2EF3 Han +2F00 2FD5 Han +2FF0 2FFB Common +3000 Common +3001 3002 Bopomofo Hangul Han Hiragana Katakana Yi +3003 Bopomofo Hangul Han Hiragana Katakana +3004 Common +3005 3007 Han +3008 3011 Bopomofo Hangul Han Hiragana Katakana Yi +3012 Common +3013 Bopomofo Hangul Han Hiragana Katakana +3014 301B Bopomofo Hangul Han Hiragana Katakana Yi +301C 301F Bopomofo Hangul Han Hiragana Katakana +3020 Common +3021 3029 Han +302A 302D Bopomofo Han +302E 302F Hangul +3030 Bopomofo Hangul Han Hiragana Katakana +3031 3035 Hiragana Katakana +3036 Common +3037 Bopomofo Hangul Han Hiragana Katakana +3038 303B Han +303C 303D Han Hiragana Katakana +303E 303F Han +3041 3096 Hiragana +3099 309C Hiragana Katakana +309D 309F Hiragana +30A0 Hiragana Katakana +30A1 30FA Katakana +30FB Bopomofo Hangul Han Hiragana Katakana Yi +30FC Hiragana Katakana +30FD 30FF Katakana +3105 312E Bopomofo +3131 318E Hangul +3190 319F Han +31A0 31BA Bopomofo +31C0 31E3 Han +31F0 31FF Katakana +3200 321E Hangul +3220 3247 Han +3248 325F Common +3260 327E Hangul +327F Common +3280 32B0 Han +32B1 32BF Common +32C0 32CB Han +32CC 32CF Common +32D0 32FE Katakana +3300 3357 Katakana +3358 3370 Han +3371 337A Common +337B 337F Han +3380 33DF Common +33E0 33FE Han +33FF Common +3400 4DB5 Han +4DC0 4DFF Common +4E00 9FEA Han +A000 A48C Yi +A490 A4C6 Yi +A4D0 A4FF Lisu +A500 A62B Vai +A640 A66E Cyrillic +A66F Cyrillic Glagolitic +A670 A69F Cyrillic +A6A0 A6F7 Bamum +A700 A721 Common +A722 A787 Latin +A788 A78A Common +A78B A7AE Latin +A7B0 A7B7 Latin +A7F7 A7FF Latin +A800 A82B Syloti_Nagri +A830 A835 Devanagari Gujarati Gurmukhi Kannada Kaithi Mahajani Modi Khudawadi Takri Tirhuta +A836 A839 Devanagari Gujarati Gurmukhi Kaithi Mahajani Modi Khudawadi Takri Tirhuta +A840 A877 Phags_Pa +A880 A8C5 Saurashtra +A8CE A8D9 Saurashtra +A8E0 A8F0 Devanagari +A8F1 Bengali Devanagari +A8F2 Devanagari +A8F3 Devanagari Tamil +A8F4 A8FD Devanagari +A900 A92D Kayah_Li +A92E Kayah_Li Latin Myanmar +A92F Kayah_Li +A930 A953 Rejang +A95F Rejang +A960 A97C Hangul +A980 A9CD Javanese +A9CF Buginese Javanese +A9D0 A9D9 Javanese +A9DE A9DF Javanese +A9E0 A9FE Myanmar +AA00 AA36 Cham +AA40 AA4D Cham +AA50 AA59 Cham +AA5C AA5F Cham +AA60 AA7F Myanmar +AA80 AAC2 Tai_Viet +AADB AADF Tai_Viet +AAE0 AAF6 Meetei_Mayek +AB01 AB06 Ethiopic +AB09 AB0E Ethiopic +AB11 AB16 Ethiopic +AB20 AB26 Ethiopic +AB28 AB2E Ethiopic +AB30 AB5A Latin +AB5B Common +AB5C AB64 Latin +AB65 Greek +AB70 ABBF Cherokee +ABC0 ABED Meetei_Mayek +ABF0 ABF9 Meetei_Mayek +AC00 D7A3 Hangul +D7B0 D7C6 Hangul +D7CB D7FB Hangul +F900 FA6D Han +FA70 FAD9 Han +FB00 FB06 Latin +FB13 FB17 Armenian +FB1D FB36 Hebrew +FB38 FB3C Hebrew +FB3E Hebrew +FB40 FB41 Hebrew +FB43 FB44 Hebrew +FB46 FB4F Hebrew +FB50 FBC1 Arabic +FBD3 FD3D Arabic +FD3E FD3F Common +FD50 FD8F Arabic +FD92 FDC7 Arabic +FDF0 FDF1 Arabic +FDF2 Arabic Thaana +FDF3 FDFC Arabic +FDFD Arabic Thaana +FE00 FE0F Inherited +FE10 FE19 Common +FE20 FE2D Inherited +FE2E FE2F Cyrillic +FE30 FE44 Common +FE45 FE46 Bopomofo Hangul Han Hiragana Katakana +FE47 FE52 Common +FE54 FE66 Common +FE68 FE6B Common +FE70 FE74 Arabic +FE76 FEFC Arabic +FEFF Common +FF01 FF20 Common +FF21 FF3A Latin +FF3B FF40 Common +FF41 FF5A Latin +FF5B FF60 Common +FF61 FF65 Bopomofo Hangul Han Hiragana Katakana Yi +FF66 FF6F Katakana +FF70 Hiragana Katakana +FF71 FF9D Katakana +FF9E FF9F Hiragana Katakana +FFA0 FFBE Hangul +FFC2 FFC7 Hangul +FFCA FFCF Hangul +FFD2 FFD7 Hangul +FFDA FFDC Hangul +FFE0 FFE6 Common +FFE8 FFEE Common +FFF9 FFFD Common +10000 1000B Linear_B +1000D 10026 Linear_B +10028 1003A Linear_B +1003C 1003D Linear_B +1003F 1004D Linear_B +10050 1005D Linear_B +10080 100FA Linear_B +10100 10102 Cypriot Linear_B +10107 10133 Cypriot Linear_A Linear_B +10137 1013F Cypriot Linear_B +10140 1018E Greek +10190 1019B Common +101A0 Greek +101D0 101FC Common +101FD Inherited +10280 1029C Lycian +102A0 102D0 Carian +102E0 102FB Arabic Coptic +10300 10323 Old_Italic +1032D 1032F Old_Italic +10330 1034A Gothic +10350 1037A Old_Permic +10380 1039D Ugaritic +1039F Ugaritic +103A0 103C3 Old_Persian +103C8 103D5 Old_Persian +10400 1044F Deseret +10450 1047F Shavian +10480 1049D Osmanya +104A0 104A9 Osmanya +104B0 104D3 Osage +104D8 104FB Osage +10500 10527 Elbasan +10530 10563 Caucasian_Albanian +1056F Caucasian_Albanian +10600 10736 Linear_A +10740 10755 Linear_A +10760 10767 Linear_A +10800 10805 Cypriot +10808 Cypriot +1080A 10835 Cypriot +10837 10838 Cypriot +1083C Cypriot +1083F Cypriot +10840 10855 Imperial_Aramaic +10857 1085F Imperial_Aramaic +10860 1087F Palmyrene +10880 1089E Nabataean +108A7 108AF Nabataean +108E0 108F2 Hatran +108F4 108F5 Hatran +108FB 108FF Hatran +10900 1091B Phoenician +1091F Phoenician +10920 10939 Lydian +1093F Lydian +10980 1099F Meroitic_Hieroglyphs +109A0 109B7 Meroitic_Cursive +109BC 109CF Meroitic_Cursive +109D2 109FF Meroitic_Cursive +10A00 10A03 Kharoshthi +10A05 10A06 Kharoshthi +10A0C 10A13 Kharoshthi +10A15 10A17 Kharoshthi +10A19 10A33 Kharoshthi +10A38 10A3A Kharoshthi +10A3F 10A47 Kharoshthi +10A50 10A58 Kharoshthi +10A60 10A7F Old_South_Arabian +10A80 10A9F Old_North_Arabian +10AC0 10AE6 Manichaean +10AEB 10AF6 Manichaean +10B00 10B35 Avestan +10B39 10B3F Avestan +10B40 10B55 Inscriptional_Parthian +10B58 10B5F Inscriptional_Parthian +10B60 10B72 Inscriptional_Pahlavi +10B78 10B7F Inscriptional_Pahlavi +10B80 10B91 Psalter_Pahlavi +10B99 10B9C Psalter_Pahlavi +10BA9 10BAF Psalter_Pahlavi +10C00 10C48 Old_Turkic +10C80 10CB2 Old_Hungarian +10CC0 10CF2 Old_Hungarian +10CFA 10CFF Old_Hungarian +10E60 10E7E Arabic +11000 1104D Brahmi +11052 1106F Brahmi +1107F Brahmi +11080 110C1 Kaithi +110D0 110E8 Sora_Sompeng +110F0 110F9 Sora_Sompeng +11100 11134 Chakma +11136 11143 Chakma +11150 11176 Mahajani +11180 111CD Sharada +111D0 111DF Sharada +111E1 111F4 Sinhala +11200 11211 Khojki +11213 1123E Khojki +11280 11286 Multani +11288 Multani +1128A 1128D Multani +1128F 1129D Multani +1129F 112A9 Multani +112B0 112EA Khudawadi +112F0 112F9 Khudawadi +11300 Grantha +11301 Grantha Tamil +11302 Grantha +11303 Grantha Tamil +11305 1130C Grantha +1130F 11310 Grantha +11313 11328 Grantha +1132A 11330 Grantha +11332 11333 Grantha +11335 11339 Grantha +1133C Grantha Tamil +1133D 11344 Grantha +11347 11348 Grantha +1134B 1134D Grantha +11350 Grantha +11357 Grantha +1135D 11363 Grantha +11366 1136C Grantha +11370 11374 Grantha +11400 11459 Newa +1145B Newa +1145D Newa +11480 114C7 Tirhuta +114D0 114D9 Tirhuta +11580 115B5 Siddham +115B8 115DD Siddham +11600 11644 Modi +11650 11659 Modi +11660 1166C Mongolian +11680 116B7 Takri +116C0 116C9 Takri +11700 11719 Ahom +1171D 1172B Ahom +11730 1173F Ahom +118A0 118F2 Warang_Citi +118FF Warang_Citi +11A00 11A47 Zanabazar_Square +11A50 11A83 Soyombo +11A86 11A9C Soyombo +11A9E 11AA2 Soyombo +11AC0 11AF8 Pau_Cin_Hau +11C00 11C08 Bhaiksuki +11C0A 11C36 Bhaiksuki +11C38 11C45 Bhaiksuki +11C50 11C6C Bhaiksuki +11C70 11C8F Marchen +11C92 11CA7 Marchen +11CA9 11CB6 Marchen +11D00 11D06 Masaram_Gondi +11D08 11D09 Masaram_Gondi +11D0B 11D36 Masaram_Gondi +11D3A Masaram_Gondi +11D3C 11D3D Masaram_Gondi +11D3F 11D47 Masaram_Gondi +11D50 11D59 Masaram_Gondi +12000 12399 Cuneiform +12400 1246E Cuneiform +12470 12474 Cuneiform +12480 12543 Cuneiform +13000 1342E Egyptian_Hieroglyphs +14400 14646 Anatolian_Hieroglyphs +16800 16A38 Bamum +16A40 16A5E Mro +16A60 16A69 Mro +16A6E 16A6F Mro +16AD0 16AED Bassa_Vah +16AF0 16AF5 Bassa_Vah +16B00 16B45 Pahawh_Hmong +16B50 16B59 Pahawh_Hmong +16B5B 16B61 Pahawh_Hmong +16B63 16B77 Pahawh_Hmong +16B7D 16B8F Pahawh_Hmong +16F00 16F44 Miao +16F50 16F7E Miao +16F8F 16F9F Miao +16FE0 Tangut +16FE1 Nushu +17000 187EC Tangut +18800 18AF2 Tangut +1B000 Katakana +1B001 1B11E Hiragana +1B170 1B2FB Nushu +1BC00 1BC6A Duployan +1BC70 1BC7C Duployan +1BC80 1BC88 Duployan +1BC90 1BC99 Duployan +1BC9C 1BCA3 Duployan +1D000 1D0F5 Common +1D100 1D126 Common +1D129 1D166 Common +1D167 1D169 Inherited +1D16A 1D17A Common +1D17B 1D182 Inherited +1D183 1D184 Common +1D185 1D18B Inherited +1D18C 1D1A9 Common +1D1AA 1D1AD Inherited +1D1AE 1D1E8 Common +1D200 1D245 Greek +1D300 1D356 Common +1D360 1D371 Han +1D400 1D454 Common +1D456 1D49C Common +1D49E 1D49F Common +1D4A2 Common +1D4A5 1D4A6 Common +1D4A9 1D4AC Common +1D4AE 1D4B9 Common +1D4BB Common +1D4BD 1D4C3 Common +1D4C5 1D505 Common +1D507 1D50A Common +1D50D 1D514 Common +1D516 1D51C Common +1D51E 1D539 Common +1D53B 1D53E Common +1D540 1D544 Common +1D546 Common +1D54A 1D550 Common +1D552 1D6A5 Common +1D6A8 1D7CB Common +1D7CE 1D7FF Common +1D800 1DA8B SignWriting +1DA9B 1DA9F SignWriting +1DAA1 1DAAF SignWriting +1E000 1E006 Glagolitic +1E008 1E018 Glagolitic +1E01B 1E021 Glagolitic +1E023 1E024 Glagolitic +1E026 1E02A Glagolitic +1E800 1E8C4 Mende_Kikakui +1E8C7 1E8D6 Mende_Kikakui +1E900 1E94A Adlam +1E950 1E959 Adlam +1E95E 1E95F Adlam +1EE00 1EE03 Arabic +1EE05 1EE1F Arabic +1EE21 1EE22 Arabic +1EE24 Arabic +1EE27 Arabic +1EE29 1EE32 Arabic +1EE34 1EE37 Arabic +1EE39 Arabic +1EE3B Arabic +1EE42 Arabic +1EE47 Arabic +1EE49 Arabic +1EE4B Arabic +1EE4D 1EE4F Arabic +1EE51 1EE52 Arabic +1EE54 Arabic +1EE57 Arabic +1EE59 Arabic +1EE5B Arabic +1EE5D Arabic +1EE5F Arabic +1EE61 1EE62 Arabic +1EE64 Arabic +1EE67 1EE6A Arabic +1EE6C 1EE72 Arabic +1EE74 1EE77 Arabic +1EE79 1EE7C Arabic +1EE7E Arabic +1EE80 1EE89 Arabic +1EE8B 1EE9B Arabic +1EEA1 1EEA3 Arabic +1EEA5 1EEA9 Arabic +1EEAB 1EEBB Arabic +1EEF0 1EEF1 Arabic +1F000 1F02B Common +1F030 1F093 Common +1F0A0 1F0AE Common +1F0B1 1F0BF Common +1F0C1 1F0CF Common +1F0D1 1F0F5 Common +1F100 1F10C Common +1F110 1F12E Common +1F130 1F16B Common +1F170 1F1AC Common +1F1E6 1F1FF Common +1F200 Hiragana +1F201 1F202 Common +1F210 1F23B Common +1F240 1F248 Common +1F250 1F251 Han +1F260 1F265 Common +1F300 1F6D4 Common +1F6E0 1F6EC Common +1F6F0 1F6F8 Common +1F700 1F773 Common +1F780 1F7D4 Common +1F800 1F80B Common +1F810 1F847 Common +1F850 1F859 Common +1F860 1F887 Common +1F890 1F8AD Common +1F900 1F90B Common +1F910 1F93E Common +1F940 1F94C Common +1F950 1F96B Common +1F980 1F997 Common +1F9C0 Common +1F9D0 1F9E6 Common +20000 2A6D6 Han +2A700 2B734 Han +2B740 2B81D Han +2B820 2CEA1 Han +2CEB0 2EBE0 Han +2F800 2FA1D Han +E0001 Common +E0020 E007F Common +E0100 E01EF Inherited +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToJg'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToJg'}{'missing'} = 'No_Joining_Group'; + +return <<'END'; +620 Yeh +622 623 Alef +624 Waw +625 Alef +626 Yeh +627 Alef +628 Beh +629 Teh_Marbuta +62A 62B Beh +62C 62E Hah +62F 630 Dal +631 632 Reh +633 634 Seen +635 636 Sad +637 638 Tah +639 63A Ain +63B 63C Gaf +63D 63F Farsi_Yeh +641 Feh +642 Qaf +643 Kaf +644 Lam +645 Meem +646 Noon +647 Heh +648 Waw +649 64A Yeh +66E Beh +66F Qaf +671 673 Alef +675 Alef +676 677 Waw +678 Yeh +679 680 Beh +681 687 Hah +688 690 Dal +691 699 Reh +69A 69C Seen +69D 69E Sad +69F Tah +6A0 Ain +6A1 6A6 Feh +6A7 6A8 Qaf +6A9 Gaf +6AA Swash_Kaf +6AB Gaf +6AC 6AE Kaf +6AF 6B4 Gaf +6B5 6B8 Lam +6B9 6BC Noon +6BD Nya +6BE Knotted_Heh +6BF Hah +6C0 Teh_Marbuta +6C1 6C2 Heh_Goal +6C3 Teh_Marbuta_Goal +6C4 6CB Waw +6CC Farsi_Yeh +6CD Yeh_With_Tail +6CE Farsi_Yeh +6CF Waw +6D0 6D1 Yeh +6D2 6D3 Yeh_Barree +6D5 Teh_Marbuta +6EE Dal +6EF Reh +6FA Seen +6FB Sad +6FC Ain +6FF Knotted_Heh +710 Alaph +712 Beth +713 714 Gamal +715 716 Dalath_Rish +717 He +718 Syriac_Waw +719 Zain +71A Heth +71B 71C Teth +71D Yudh +71E Yudh_He +71F Kaph +720 Lamadh +721 Mim +722 Nun +723 Semkath +724 Final_Semkath +725 E +726 Pe +727 Reversed_Pe +728 Sadhe +729 Qaph +72A Dalath_Rish +72B Shin +72C Taw +72D Beth +72E Gamal +72F Dalath_Rish +74D Zhain +74E Khaph +74F Fe +750 756 Beh +757 758 Hah +759 75A Dal +75B Reh +75C Seen +75D 75F Ain +760 761 Feh +762 764 Gaf +765 766 Meem +767 769 Noon +76A Lam +76B 76C Reh +76D Seen +76E 76F Hah +770 Seen +771 Reh +772 Hah +773 774 Alef +775 776 Farsi_Yeh +777 Yeh +778 779 Waw +77A 77B Burushaski_Yeh_Barree +77C Hah +77D 77E Seen +77F Kaf +860 Malayalam_Nga +861 Malayalam_Ja +862 Malayalam_Nya +863 Malayalam_Tta +864 Malayalam_Nna +865 Malayalam_Nnna +866 Malayalam_Bha +867 Malayalam_Ra +868 Malayalam_Lla +869 Malayalam_Llla +86A Malayalam_Ssa +8A0 8A1 Beh +8A2 Hah +8A3 Tah +8A4 Feh +8A5 Qaf +8A6 Lam +8A7 Meem +8A8 8A9 Yeh +8AA Reh +8AB Waw +8AC Rohingya_Yeh +8AE Dal +8AF Sad +8B0 Gaf +8B1 Straight_Waw +8B2 Reh +8B3 Ain +8B4 Kaf +8B6 8B8 Beh +8B9 Reh +8BA Yeh +8BB African_Feh +8BC African_Qaf +8BD African_Noon +10AC0 Manichaean_Aleph +10AC1 10AC2 Manichaean_Beth +10AC3 10AC4 Manichaean_Gimel +10AC5 Manichaean_Daleth +10AC7 Manichaean_Waw +10AC9 10ACA Manichaean_Zayin +10ACD Manichaean_Heth +10ACE Manichaean_Teth +10ACF Manichaean_Yodh +10AD0 10AD2 Manichaean_Kaph +10AD3 Manichaean_Lamedh +10AD4 Manichaean_Dhamedh +10AD5 Manichaean_Thamedh +10AD6 Manichaean_Mem +10AD7 Manichaean_Nun +10AD8 Manichaean_Samekh +10AD9 10ADA Manichaean_Ayin +10ADB 10ADC Manichaean_Pe +10ADD Manichaean_Sadhe +10ADE 10AE0 Manichaean_Qoph +10AE1 Manichaean_Resh +10AE4 Manichaean_Taw +10AEB Manichaean_One +10AEC Manichaean_Five +10AED Manichaean_Ten +10AEE Manichaean_Twenty +10AEF Manichaean_Hundred +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToInSC'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToInSC'}{'missing'} = 'Other'; + +return <<'END'; +2D Consonant_Placeholder +30 39 Number +A0 Consonant_Placeholder +B2 B3 Syllable_Modifier +D7 Consonant_Placeholder +900 902 Bindu +903 Visarga +904 914 Vowel_Independent +915 939 Consonant +93A 93B Vowel_Dependent +93C Nukta +93D Avagraha +93E 94C Vowel_Dependent +94D Virama +94E 94F Vowel_Dependent +951 952 Cantillation_Mark +955 957 Vowel_Dependent +958 95F Consonant +960 961 Vowel_Independent +962 963 Vowel_Dependent +966 96F Number +972 977 Vowel_Independent +978 97F Consonant +981 982 Bindu +983 Visarga +985 98C Vowel_Independent +98F 990 Vowel_Independent +993 994 Vowel_Independent +995 9A8 Consonant +9AA 9B0 Consonant +9B2 Consonant +9B6 9B9 Consonant +9BC Nukta +9BD Avagraha +9BE 9C4 Vowel_Dependent +9C7 9C8 Vowel_Dependent +9CB 9CC Vowel_Dependent +9CD Virama +9CE Consonant_Dead +9D7 Vowel_Dependent +9DC 9DD Consonant +9DF Consonant +9E0 9E1 Vowel_Independent +9E2 9E3 Vowel_Dependent +9E6 9EF Number +9F0 9F1 Consonant +9FC Bindu +A01 A02 Bindu +A03 Visarga +A05 A0A Vowel_Independent +A0F A10 Vowel_Independent +A13 A14 Vowel_Independent +A15 A28 Consonant +A2A A30 Consonant +A32 A33 Consonant +A35 A36 Consonant +A38 A39 Consonant +A3C Nukta +A3E A42 Vowel_Dependent +A47 A48 Vowel_Dependent +A4B A4C Vowel_Dependent +A4D Virama +A59 A5C Consonant +A5E Consonant +A66 A6F Number +A70 Bindu +A71 Gemination_Mark +A72 A73 Consonant_Placeholder +A75 Consonant_Medial +A81 A82 Bindu +A83 Visarga +A85 A8D Vowel_Independent +A8F A91 Vowel_Independent +A93 A94 Vowel_Independent +A95 AA8 Consonant +AAA AB0 Consonant +AB2 AB3 Consonant +AB5 AB9 Consonant +ABC Nukta +ABD Avagraha +ABE AC5 Vowel_Dependent +AC7 AC9 Vowel_Dependent +ACB ACC Vowel_Dependent +ACD Virama +AE0 AE1 Vowel_Independent +AE2 AE3 Vowel_Dependent +AE6 AEF Number +AF9 Consonant +AFA AFC Cantillation_Mark +AFD AFF Nukta +B01 B02 Bindu +B03 Visarga +B05 B0C Vowel_Independent +B0F B10 Vowel_Independent +B13 B14 Vowel_Independent +B15 B28 Consonant +B2A B30 Consonant +B32 B33 Consonant +B35 B39 Consonant +B3C Nukta +B3D Avagraha +B3E B44 Vowel_Dependent +B47 B48 Vowel_Dependent +B4B B4C Vowel_Dependent +B4D Virama +B56 B57 Vowel_Dependent +B5C B5D Consonant +B5F Consonant +B60 B61 Vowel_Independent +B62 B63 Vowel_Dependent +B66 B6F Number +B71 Consonant +B82 Bindu +B83 Modifying_Letter +B85 B8A Vowel_Independent +B8E B90 Vowel_Independent +B92 B94 Vowel_Independent +B95 Consonant +B99 B9A Consonant +B9C Consonant +B9E B9F Consonant +BA3 BA4 Consonant +BA8 BAA Consonant +BAE BB9 Consonant +BBE BC2 Vowel_Dependent +BC6 BC8 Vowel_Dependent +BCA BCC Vowel_Dependent +BCD Virama +BD7 Vowel_Dependent +BE6 BEF Number +C00 C02 Bindu +C03 Visarga +C05 C0C Vowel_Independent +C0E C10 Vowel_Independent +C12 C14 Vowel_Independent +C15 C28 Consonant +C2A C39 Consonant +C3D Avagraha +C3E C44 Vowel_Dependent +C46 C48 Vowel_Dependent +C4A C4C Vowel_Dependent +C4D Virama +C55 C56 Vowel_Dependent +C58 C5A Consonant +C60 C61 Vowel_Independent +C62 C63 Vowel_Dependent +C66 C6F Number +C81 C82 Bindu +C83 Visarga +C85 C8C Vowel_Independent +C8E C90 Vowel_Independent +C92 C94 Vowel_Independent +C95 CA8 Consonant +CAA CB3 Consonant +CB5 CB9 Consonant +CBC Nukta +CBD Avagraha +CBE CC4 Vowel_Dependent +CC6 CC8 Vowel_Dependent +CCA CCC Vowel_Dependent +CCD Virama +CD5 CD6 Vowel_Dependent +CDE Consonant +CE0 CE1 Vowel_Independent +CE2 CE3 Vowel_Dependent +CE6 CEF Number +CF1 CF2 Consonant_With_Stacker +D00 D02 Bindu +D03 Visarga +D05 D0C Vowel_Independent +D0E D10 Vowel_Independent +D12 D14 Vowel_Independent +D15 D3A Consonant +D3B D3C Pure_Killer +D3D Avagraha +D3E D44 Vowel_Dependent +D46 D48 Vowel_Dependent +D4A D4C Vowel_Dependent +D4D Virama +D4E Consonant_Preceding_Repha +D54 D56 Consonant_Dead +D57 Vowel_Dependent +D5F D61 Vowel_Independent +D62 D63 Vowel_Dependent +D66 D6F Number +D7A D7F Consonant_Dead +D82 Bindu +D83 Visarga +D85 D96 Vowel_Independent +D9A DB1 Consonant +DB3 DBB Consonant +DBD Consonant +DC0 DC6 Consonant +DCA Virama +DCF DD4 Vowel_Dependent +DD6 Vowel_Dependent +DD8 DDF Vowel_Dependent +DE6 DEF Number +DF2 DF3 Vowel_Dependent +E01 E2E Consonant +E30 E39 Vowel_Dependent +E3A Pure_Killer +E40 E45 Vowel_Dependent +E47 Vowel_Dependent +E48 E4B Tone_Mark +E4C Consonant_Killer +E4D Bindu +E4E Pure_Killer +E50 E59 Number +E81 E82 Consonant +E84 Consonant +E87 E88 Consonant +E8A Consonant +E8D Consonant +E94 E97 Consonant +E99 E9F Consonant +EA1 EA3 Consonant +EA5 Consonant +EA7 Consonant +EAA EAB Consonant +EAD EAE Consonant +EB0 EB9 Vowel_Dependent +EBB Vowel_Dependent +EBC EBD Consonant_Medial +EC0 EC4 Vowel_Dependent +EC8 ECB Tone_Mark +ECD Bindu +ED0 ED9 Number +EDC EDF Consonant +F20 F33 Number +F35 Syllable_Modifier +F37 Syllable_Modifier +F39 Nukta +F40 F47 Consonant +F49 F6C Consonant +F71 F7D Vowel_Dependent +F7E Bindu +F7F Visarga +F80 F81 Vowel_Dependent +F82 F83 Bindu +F84 Pure_Killer +F85 Avagraha +F88 F8C Consonant_Head_Letter +F8D F97 Consonant_Subjoined +F99 FBC Consonant_Subjoined +FC6 Syllable_Modifier +1000 1020 Consonant +1021 102A Vowel_Independent +102B 1035 Vowel_Dependent +1036 Bindu +1037 Tone_Mark +1038 Visarga +1039 Invisible_Stacker +103A Pure_Killer +103B 103E Consonant_Medial +103F Consonant +1040 1049 Number +104E Consonant_Placeholder +1050 1051 Consonant +1052 1055 Vowel_Independent +1056 1059 Vowel_Dependent +105A 105D Consonant +105E 1060 Consonant_Medial +1061 Consonant +1062 Vowel_Dependent +1063 1064 Tone_Mark +1065 1066 Consonant +1067 1068 Vowel_Dependent +1069 106D Tone_Mark +106E 1070 Consonant +1071 1074 Vowel_Dependent +1075 1081 Consonant +1082 Consonant_Medial +1083 1086 Vowel_Dependent +1087 108D Tone_Mark +108E Consonant +108F Tone_Mark +1090 1099 Number +109A 109B Tone_Mark +109C 109D Vowel_Dependent +1700 1702 Vowel_Independent +1703 170C Consonant +170E 1711 Consonant +1712 1713 Vowel_Dependent +1714 Pure_Killer +1720 1722 Vowel_Independent +1723 1731 Consonant +1732 1733 Vowel_Dependent +1734 Pure_Killer +1740 1742 Vowel_Independent +1743 1751 Consonant +1752 1753 Vowel_Dependent +1760 1762 Vowel_Independent +1763 176C Consonant +176E 1770 Consonant +1772 1773 Vowel_Dependent +1780 17A2 Consonant +17A3 17B3 Vowel_Independent +17B6 17C5 Vowel_Dependent +17C6 Bindu +17C7 Visarga +17C8 Vowel_Dependent +17C9 17CA Register_Shifter +17CB Syllable_Modifier +17CC Consonant_Succeeding_Repha +17CD Consonant_Killer +17CE 17D0 Syllable_Modifier +17D1 Pure_Killer +17D2 Invisible_Stacker +17D3 Syllable_Modifier +17DC Avagraha +17DD Syllable_Modifier +17E0 17E9 Number +1900 Consonant_Placeholder +1901 191E Consonant +1920 1928 Vowel_Dependent +1929 192B Consonant_Subjoined +1930 1931 Consonant_Final +1932 Bindu +1933 1939 Consonant_Final +193A Vowel_Dependent +193B Syllable_Modifier +1946 194F Number +1950 1962 Consonant +1963 196D Vowel +1970 1974 Tone_Letter +1980 19AB Consonant +19B0 19C0 Vowel_Dependent +19C1 19C7 Consonant_Final +19C8 19C9 Tone_Mark +19D0 19D9 Number +1A00 1A16 Consonant +1A17 1A1B Vowel_Dependent +1A20 1A4C Consonant +1A4D 1A52 Vowel_Independent +1A53 1A54 Consonant +1A55 1A56 Consonant_Medial +1A57 Consonant_Subjoined +1A58 1A59 Consonant_Final +1A5A Consonant_Succeeding_Repha +1A5B 1A5E Consonant_Subjoined +1A60 Invisible_Stacker +1A61 1A73 Vowel_Dependent +1A74 Bindu +1A75 1A79 Tone_Mark +1A7A Pure_Killer +1A7B 1A7C Syllable_Modifier +1A7F Syllable_Modifier +1A80 1A89 Number +1A90 1A99 Number +1B00 1B02 Bindu +1B03 Consonant_Succeeding_Repha +1B04 Visarga +1B05 1B12 Vowel_Independent +1B13 1B33 Consonant +1B34 Nukta +1B35 1B43 Vowel_Dependent +1B44 Virama +1B45 1B4B Consonant +1B50 1B59 Number +1B80 Bindu +1B81 Consonant_Succeeding_Repha +1B82 Visarga +1B83 1B89 Vowel_Independent +1B8A 1BA0 Consonant +1BA1 1BA3 Consonant_Subjoined +1BA4 1BA9 Vowel_Dependent +1BAA Pure_Killer +1BAB Invisible_Stacker +1BAC 1BAD Consonant_Subjoined +1BAE 1BAF Consonant +1BB0 1BB9 Number +1BBA Avagraha +1BBB 1BBD Consonant +1BBE 1BBF Consonant_Final +1BC0 1BE3 Consonant +1BE4 1BE5 Vowel_Independent +1BE6 Nukta +1BE7 1BEF Vowel_Dependent +1BF0 1BF1 Consonant_Final +1BF2 1BF3 Pure_Killer +1C00 1C23 Consonant +1C24 1C25 Consonant_Subjoined +1C26 1C2C Vowel_Dependent +1C2D 1C33 Consonant_Final +1C34 1C35 Bindu +1C36 Syllable_Modifier +1C37 Nukta +1C40 1C49 Number +1C4D 1C4F Consonant +1CD0 1CD2 Cantillation_Mark +1CD4 1CE1 Cantillation_Mark +1CF2 1CF3 Visarga +1CF4 Cantillation_Mark +1CF7 1CF9 Cantillation_Mark +1DFB Syllable_Modifier +200C Non_Joiner +200D Joiner +2010 2014 Consonant_Placeholder +2074 Syllable_Modifier +2082 2084 Syllable_Modifier +25CC Consonant_Placeholder +A800 A801 Vowel_Independent +A803 A805 Vowel_Independent +A806 Pure_Killer +A807 A80A Consonant +A80B Bindu +A80C A822 Consonant +A823 A827 Vowel_Dependent +A840 A85D Consonant +A85E A861 Vowel +A862 A865 Consonant +A866 Vowel +A867 A868 Consonant_Subjoined +A869 A870 Consonant +A871 Consonant_Subjoined +A872 Consonant +A873 Bindu +A880 Bindu +A881 Visarga +A882 A891 Vowel_Independent +A892 A8B3 Consonant +A8B4 Consonant_Final +A8B5 A8C3 Vowel_Dependent +A8C4 Virama +A8C5 Bindu +A8D0 A8D9 Number +A8E0 A8F1 Cantillation_Mark +A8F2 A8F3 Bindu +A900 A909 Number +A90A A921 Consonant +A922 A92A Vowel +A92B A92D Tone_Mark +A930 A946 Consonant +A947 A94E Vowel_Dependent +A94F A952 Consonant_Final +A953 Pure_Killer +A980 A981 Bindu +A982 Consonant_Succeeding_Repha +A983 Visarga +A984 A988 Vowel_Independent +A989 A98B Consonant +A98C A98E Vowel_Independent +A98F A9B2 Consonant +A9B3 Nukta +A9B4 A9BC Vowel_Dependent +A9BD Consonant_Subjoined +A9BE A9BF Consonant_Medial +A9C0 Virama +A9D0 A9D9 Number +A9E0 A9E4 Consonant +A9E5 Vowel_Dependent +A9E7 A9EF Consonant +A9F0 A9F9 Number +A9FA A9FE Consonant +AA00 AA05 Vowel_Independent +AA06 AA28 Consonant +AA29 AA32 Vowel_Dependent +AA33 AA36 Consonant_Medial +AA40 AA4D Consonant_Final +AA50 AA59 Number +AA60 AA6F Consonant +AA71 AA73 Consonant +AA74 AA76 Consonant_Placeholder +AA7A Consonant +AA7B AA7D Tone_Mark +AA7E AAAF Consonant +AAB0 AABE Vowel_Dependent +AABF Tone_Mark +AAC0 Tone_Letter +AAC1 Tone_Mark +AAC2 Tone_Letter +AAE0 AAE1 Vowel_Independent +AAE2 AAEA Consonant +AAEB AAEF Vowel_Dependent +AAF5 Visarga +AAF6 Invisible_Stacker +ABC0 ABCD Consonant +ABCE ABCF Vowel_Independent +ABD0 Consonant +ABD1 Vowel_Independent +ABD2 ABDA Consonant +ABDB ABE2 Consonant_Final +ABE3 ABEA Vowel_Dependent +ABEC Tone_Mark +ABED Pure_Killer +ABF0 ABF9 Number +10A00 Consonant +10A01 10A03 Vowel_Dependent +10A05 10A06 Vowel_Dependent +10A0C 10A0D Vowel_Dependent +10A0E Bindu +10A0F Visarga +10A10 10A13 Consonant +10A15 10A17 Consonant +10A19 10A33 Consonant +10A38 10A3A Nukta +10A3F Invisible_Stacker +10A40 10A47 Number +11000 11001 Bindu +11002 Visarga +11003 11004 Consonant_With_Stacker +11005 11012 Vowel_Independent +11013 11037 Consonant +11038 11045 Vowel_Dependent +11046 Virama +11052 11065 Brahmi_Joining_Number +11066 1106F Number +1107F Number_Joiner +11080 11081 Bindu +11082 Visarga +11083 1108C Vowel_Independent +1108D 110AF Consonant +110B0 110B8 Vowel_Dependent +110B9 Virama +110BA Nukta +11100 11101 Bindu +11102 Visarga +11103 11106 Vowel_Independent +11107 11126 Consonant +11127 11132 Vowel_Dependent +11133 Invisible_Stacker +11134 Pure_Killer +11136 1113F Number +11150 11154 Vowel +11155 11172 Consonant +11173 Nukta +11180 11181 Bindu +11182 Visarga +11183 11190 Vowel_Independent +11191 111B2 Consonant +111B3 111BF Vowel_Dependent +111C0 Virama +111C1 Avagraha +111C2 111C3 Consonant_Prefixed +111CA Nukta +111CB 111CC Vowel_Dependent +111D0 111D9 Number +111E1 111F4 Number +11200 11207 Vowel_Independent +11208 11211 Consonant +11213 1122B Consonant +1122C 11233 Vowel_Dependent +11234 Bindu +11235 Virama +11236 Nukta +11237 Gemination_Mark +1123E Cantillation_Mark +11280 11283 Vowel_Independent +11284 11286 Consonant +11288 Consonant +1128A 1128D Consonant +1128F 1129D Consonant +1129F 112A8 Consonant +112B0 112B9 Vowel_Independent +112BA 112DE Consonant +112DF Bindu +112E0 112E8 Vowel_Dependent +112E9 Nukta +112EA Pure_Killer +112F0 112F9 Number +11300 11302 Bindu +11303 Visarga +11305 1130C Vowel_Independent +1130F 11310 Vowel_Independent +11313 11314 Vowel_Independent +11315 11328 Consonant +1132A 11330 Consonant +11332 11333 Consonant +11335 11339 Consonant +1133C Nukta +1133D Avagraha +1133E 11344 Vowel_Dependent +11347 11348 Vowel_Dependent +1134B 1134C Vowel_Dependent +1134D Virama +11357 Vowel_Dependent +1135E 1135F Bindu +11360 11361 Vowel_Independent +11362 11363 Vowel_Dependent +11366 1136C Cantillation_Mark +11370 11374 Cantillation_Mark +11400 1140D Vowel_Independent +1140E 11434 Consonant +11435 11441 Vowel_Dependent +11442 Virama +11443 11444 Bindu +11445 Visarga +11446 Nukta +11447 Avagraha +11450 11459 Number +11481 1148E Vowel_Independent +1148F 114AF Consonant +114B0 114BE Vowel_Dependent +114BF 114C0 Bindu +114C1 Visarga +114C2 Virama +114C3 Nukta +114C4 Avagraha +114D0 114D9 Number +11580 1158D Vowel_Independent +1158E 115AE Consonant +115AF 115B5 Vowel_Dependent +115B8 115BB Vowel_Dependent +115BC 115BD Bindu +115BE Visarga +115BF Virama +115C0 Nukta +115D8 115DB Vowel_Independent +115DC 115DD Vowel_Dependent +11600 1160D Vowel_Independent +1160E 1162F Consonant +11630 1163C Vowel_Dependent +1163D Bindu +1163E Visarga +1163F Virama +11640 Vowel_Dependent +11650 11659 Number +11680 11689 Vowel_Independent +1168A 116AA Consonant +116AB Bindu +116AC Visarga +116AD 116B5 Vowel_Dependent +116B6 Virama +116B7 Nukta +116C0 116C9 Number +11700 11719 Consonant +1171D 1171F Consonant_Medial +11720 1172A Vowel_Dependent +1172B Pure_Killer +11730 1173B Number +11A00 Vowel_Independent +11A01 11A0A Vowel_Dependent +11A0B 11A32 Consonant +11A33 Syllable_Modifier +11A34 Pure_Killer +11A35 11A38 Bindu +11A39 Visarga +11A3A Consonant_Prefixed +11A3B 11A3E Consonant_Medial +11A3F Consonant_Placeholder +11A45 Consonant_Placeholder +11A47 Invisible_Stacker +11A50 Vowel_Independent +11A51 11A5B Vowel_Dependent +11A5C 11A83 Consonant +11A86 11A89 Consonant_Prefixed +11A8A 11A95 Consonant_Final +11A96 Bindu +11A97 Visarga +11A98 Gemination_Mark +11A99 Invisible_Stacker +11C00 11C08 Vowel_Independent +11C0A 11C0D Vowel_Independent +11C0E 11C2E Consonant +11C2F 11C36 Vowel_Dependent +11C38 11C3B Vowel_Dependent +11C3C 11C3D Bindu +11C3E Visarga +11C3F Virama +11C40 Avagraha +11C50 11C6C Number +11C72 11C8F Consonant +11C92 11CA7 Consonant_Subjoined +11CA9 11CAF Consonant_Subjoined +11CB0 11CB4 Vowel_Dependent +11CB5 11CB6 Bindu +11D00 11D06 Vowel_Independent +11D08 11D09 Vowel_Independent +11D0B Vowel_Independent +11D0C 11D30 Consonant +11D31 11D36 Vowel_Dependent +11D3A Vowel_Dependent +11D3C 11D3D Vowel_Dependent +11D3F Vowel_Dependent +11D40 Bindu +11D41 Visarga +11D42 Nukta +11D43 Vowel_Dependent +11D44 Pure_Killer +11D45 Invisible_Stacker +11D46 Consonant_Preceding_Repha +11D47 Consonant_Medial +11D50 11D59 Number +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('Perl_Decimal_Digit') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToDigit'}{'format'} = 'd'; # single decimal digit +$utf8::SwashInfo{'ToDigit'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +0030 0 +0031 1 +0032 2 +0033 3 +0034 4 +0035 5 +0036 6 +0037 7 +0038 8 +0039 9 +0660 0 +0661 1 +0662 2 +0663 3 +0664 4 +0665 5 +0666 6 +0667 7 +0668 8 +0669 9 +06F0 0 +06F1 1 +06F2 2 +06F3 3 +06F4 4 +06F5 5 +06F6 6 +06F7 7 +06F8 8 +06F9 9 +07C0 0 +07C1 1 +07C2 2 +07C3 3 +07C4 4 +07C5 5 +07C6 6 +07C7 7 +07C8 8 +07C9 9 +0966 0 +0967 1 +0968 2 +0969 3 +096A 4 +096B 5 +096C 6 +096D 7 +096E 8 +096F 9 +09E6 0 +09E7 1 +09E8 2 +09E9 3 +09EA 4 +09EB 5 +09EC 6 +09ED 7 +09EE 8 +09EF 9 +0A66 0 +0A67 1 +0A68 2 +0A69 3 +0A6A 4 +0A6B 5 +0A6C 6 +0A6D 7 +0A6E 8 +0A6F 9 +0AE6 0 +0AE7 1 +0AE8 2 +0AE9 3 +0AEA 4 +0AEB 5 +0AEC 6 +0AED 7 +0AEE 8 +0AEF 9 +0B66 0 +0B67 1 +0B68 2 +0B69 3 +0B6A 4 +0B6B 5 +0B6C 6 +0B6D 7 +0B6E 8 +0B6F 9 +0BE6 0 +0BE7 1 +0BE8 2 +0BE9 3 +0BEA 4 +0BEB 5 +0BEC 6 +0BED 7 +0BEE 8 +0BEF 9 +0C66 0 +0C67 1 +0C68 2 +0C69 3 +0C6A 4 +0C6B 5 +0C6C 6 +0C6D 7 +0C6E 8 +0C6F 9 +0CE6 0 +0CE7 1 +0CE8 2 +0CE9 3 +0CEA 4 +0CEB 5 +0CEC 6 +0CED 7 +0CEE 8 +0CEF 9 +0D66 0 +0D67 1 +0D68 2 +0D69 3 +0D6A 4 +0D6B 5 +0D6C 6 +0D6D 7 +0D6E 8 +0D6F 9 +0DE6 0 +0DE7 1 +0DE8 2 +0DE9 3 +0DEA 4 +0DEB 5 +0DEC 6 +0DED 7 +0DEE 8 +0DEF 9 +0E50 0 +0E51 1 +0E52 2 +0E53 3 +0E54 4 +0E55 5 +0E56 6 +0E57 7 +0E58 8 +0E59 9 +0ED0 0 +0ED1 1 +0ED2 2 +0ED3 3 +0ED4 4 +0ED5 5 +0ED6 6 +0ED7 7 +0ED8 8 +0ED9 9 +0F20 0 +0F21 1 +0F22 2 +0F23 3 +0F24 4 +0F25 5 +0F26 6 +0F27 7 +0F28 8 +0F29 9 +1040 0 +1041 1 +1042 2 +1043 3 +1044 4 +1045 5 +1046 6 +1047 7 +1048 8 +1049 9 +1090 0 +1091 1 +1092 2 +1093 3 +1094 4 +1095 5 +1096 6 +1097 7 +1098 8 +1099 9 +17E0 0 +17E1 1 +17E2 2 +17E3 3 +17E4 4 +17E5 5 +17E6 6 +17E7 7 +17E8 8 +17E9 9 +1810 0 +1811 1 +1812 2 +1813 3 +1814 4 +1815 5 +1816 6 +1817 7 +1818 8 +1819 9 +1946 0 +1947 1 +1948 2 +1949 3 +194A 4 +194B 5 +194C 6 +194D 7 +194E 8 +194F 9 +19D0 0 +19D1 1 +19D2 2 +19D3 3 +19D4 4 +19D5 5 +19D6 6 +19D7 7 +19D8 8 +19D9 9 +1A80 0 +1A81 1 +1A82 2 +1A83 3 +1A84 4 +1A85 5 +1A86 6 +1A87 7 +1A88 8 +1A89 9 +1A90 0 +1A91 1 +1A92 2 +1A93 3 +1A94 4 +1A95 5 +1A96 6 +1A97 7 +1A98 8 +1A99 9 +1B50 0 +1B51 1 +1B52 2 +1B53 3 +1B54 4 +1B55 5 +1B56 6 +1B57 7 +1B58 8 +1B59 9 +1BB0 0 +1BB1 1 +1BB2 2 +1BB3 3 +1BB4 4 +1BB5 5 +1BB6 6 +1BB7 7 +1BB8 8 +1BB9 9 +1C40 0 +1C41 1 +1C42 2 +1C43 3 +1C44 4 +1C45 5 +1C46 6 +1C47 7 +1C48 8 +1C49 9 +1C50 0 +1C51 1 +1C52 2 +1C53 3 +1C54 4 +1C55 5 +1C56 6 +1C57 7 +1C58 8 +1C59 9 +A620 0 +A621 1 +A622 2 +A623 3 +A624 4 +A625 5 +A626 6 +A627 7 +A628 8 +A629 9 +A8D0 0 +A8D1 1 +A8D2 2 +A8D3 3 +A8D4 4 +A8D5 5 +A8D6 6 +A8D7 7 +A8D8 8 +A8D9 9 +A900 0 +A901 1 +A902 2 +A903 3 +A904 4 +A905 5 +A906 6 +A907 7 +A908 8 +A909 9 +A9D0 0 +A9D1 1 +A9D2 2 +A9D3 3 +A9D4 4 +A9D5 5 +A9D6 6 +A9D7 7 +A9D8 8 +A9D9 9 +A9F0 0 +A9F1 1 +A9F2 2 +A9F3 3 +A9F4 4 +A9F5 5 +A9F6 6 +A9F7 7 +A9F8 8 +A9F9 9 +AA50 0 +AA51 1 +AA52 2 +AA53 3 +AA54 4 +AA55 5 +AA56 6 +AA57 7 +AA58 8 +AA59 9 +ABF0 0 +ABF1 1 +ABF2 2 +ABF3 3 +ABF4 4 +ABF5 5 +ABF6 6 +ABF7 7 +ABF8 8 +ABF9 9 +FF10 0 +FF11 1 +FF12 2 +FF13 3 +FF14 4 +FF15 5 +FF16 6 +FF17 7 +FF18 8 +FF19 9 +104A0 0 +104A1 1 +104A2 2 +104A3 3 +104A4 4 +104A5 5 +104A6 6 +104A7 7 +104A8 8 +104A9 9 +11066 0 +11067 1 +11068 2 +11069 3 +1106A 4 +1106B 5 +1106C 6 +1106D 7 +1106E 8 +1106F 9 +110F0 0 +110F1 1 +110F2 2 +110F3 3 +110F4 4 +110F5 5 +110F6 6 +110F7 7 +110F8 8 +110F9 9 +11136 0 +11137 1 +11138 2 +11139 3 +1113A 4 +1113B 5 +1113C 6 +1113D 7 +1113E 8 +1113F 9 +111D0 0 +111D1 1 +111D2 2 +111D3 3 +111D4 4 +111D5 5 +111D6 6 +111D7 7 +111D8 8 +111D9 9 +112F0 0 +112F1 1 +112F2 2 +112F3 3 +112F4 4 +112F5 5 +112F6 6 +112F7 7 +112F8 8 +112F9 9 +11450 0 +11451 1 +11452 2 +11453 3 +11454 4 +11455 5 +11456 6 +11457 7 +11458 8 +11459 9 +114D0 0 +114D1 1 +114D2 2 +114D3 3 +114D4 4 +114D5 5 +114D6 6 +114D7 7 +114D8 8 +114D9 9 +11650 0 +11651 1 +11652 2 +11653 3 +11654 4 +11655 5 +11656 6 +11657 7 +11658 8 +11659 9 +116C0 0 +116C1 1 +116C2 2 +116C3 3 +116C4 4 +116C5 5 +116C6 6 +116C7 7 +116C8 8 +116C9 9 +11730 0 +11731 1 +11732 2 +11733 3 +11734 4 +11735 5 +11736 6 +11737 7 +11738 8 +11739 9 +118E0 0 +118E1 1 +118E2 2 +118E3 3 +118E4 4 +118E5 5 +118E6 6 +118E7 7 +118E8 8 +118E9 9 +11C50 0 +11C51 1 +11C52 2 +11C53 3 +11C54 4 +11C55 5 +11C56 6 +11C57 7 +11C58 8 +11C59 9 +11D50 0 +11D51 1 +11D52 2 +11D53 3 +11D54 4 +11D55 5 +11D56 6 +11D57 7 +11D58 8 +11D59 9 +16A60 0 +16A61 1 +16A62 2 +16A63 3 +16A64 4 +16A65 5 +16A66 6 +16A67 7 +16A68 8 +16A69 9 +16B50 0 +16B51 1 +16B52 2 +16B53 3 +16B54 4 +16B55 5 +16B56 6 +16B57 7 +16B58 8 +16B59 9 +1D7CE 0 +1D7CF 1 +1D7D0 2 +1D7D1 3 +1D7D2 4 +1D7D3 5 +1D7D4 6 +1D7D5 7 +1D7D6 8 +1D7D7 9 +1D7D8 0 +1D7D9 1 +1D7DA 2 +1D7DB 3 +1D7DC 4 +1D7DD 5 +1D7DE 6 +1D7DF 7 +1D7E0 8 +1D7E1 9 +1D7E2 0 +1D7E3 1 +1D7E4 2 +1D7E5 3 +1D7E6 4 +1D7E7 5 +1D7E8 6 +1D7E9 7 +1D7EA 8 +1D7EB 9 +1D7EC 0 +1D7ED 1 +1D7EE 2 +1D7EF 3 +1D7F0 4 +1D7F1 5 +1D7F2 6 +1D7F3 7 +1D7F4 8 +1D7F5 9 +1D7F6 0 +1D7F7 1 +1D7F8 2 +1D7F9 3 +1D7FA 4 +1D7FB 5 +1D7FC 6 +1D7FD 7 +1D7FE 8 +1D7FF 9 +1E950 0 +1E951 1 +1E952 2 +1E953 3 +1E954 4 +1E955 5 +1E956 6 +1E957 7 +1E958 8 +1E959 9 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToIsc'}{'format'} = 'd'; # single decimal digit +$utf8::SwashInfo{'ToIsc'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# The mappings must be modified to get the correct values by adding the code +# point ordinal number to each one that is numeric. + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToPerlDecimalDigit'}{'format'} = 'a'; # some entries need adjustment +$utf8::SwashInfo{'ToPerlDecimalDigit'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +30 39 0 +660 669 0 +6F0 6F9 0 +7C0 7C9 0 +966 96F 0 +9E6 9EF 0 +A66 A6F 0 +AE6 AEF 0 +B66 B6F 0 +BE6 BEF 0 +C66 C6F 0 +CE6 CEF 0 +D66 D6F 0 +DE6 DEF 0 +E50 E59 0 +ED0 ED9 0 +F20 F29 0 +1040 1049 0 +1090 1099 0 +17E0 17E9 0 +1810 1819 0 +1946 194F 0 +19D0 19D9 0 +1A80 1A89 0 +1A90 1A99 0 +1B50 1B59 0 +1BB0 1BB9 0 +1C40 1C49 0 +1C50 1C59 0 +A620 A629 0 +A8D0 A8D9 0 +A900 A909 0 +A9D0 A9D9 0 +A9F0 A9F9 0 +AA50 AA59 0 +ABF0 ABF9 0 +FF10 FF19 0 +104A0 104A9 0 +11066 1106F 0 +110F0 110F9 0 +11136 1113F 0 +111D0 111D9 0 +112F0 112F9 0 +11450 11459 0 +114D0 114D9 0 +11650 11659 0 +116C0 116C9 0 +11730 11739 0 +118E0 118E9 0 +11C50 11C59 0 +11D50 11D59 0 +16A60 16A69 0 +16B50 16B59 0 +1D7CE 1D7D7 0 +1D7D8 1D7E1 0 +1D7E2 1D7EB 0 +1D7EC 1D7F5 0 +1D7F6 1D7FF 0 +1E950 1E959 0 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToBpt'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToBpt'}{'missing'} = 'n'; + +return <<'END'; +28 o +29 c +5B o +5D c +7B o +7D c +F3A o +F3B c +F3C o +F3D c +169B o +169C c +2045 o +2046 c +207D o +207E c +208D o +208E c +2308 o +2309 c +230A o +230B c +2329 o +232A c +2768 o +2769 c +276A o +276B c +276C o +276D c +276E o +276F c +2770 o +2771 c +2772 o +2773 c +2774 o +2775 c +27C5 o +27C6 c +27E6 o +27E7 c +27E8 o +27E9 c +27EA o +27EB c +27EC o +27ED c +27EE o +27EF c +2983 o +2984 c +2985 o +2986 c +2987 o +2988 c +2989 o +298A c +298B o +298C c +298D o +298E c +298F o +2990 c +2991 o +2992 c +2993 o +2994 c +2995 o +2996 c +2997 o +2998 c +29D8 o +29D9 c +29DA o +29DB c +29FC o +29FD c +2E22 o +2E23 c +2E24 o +2E25 c +2E26 o +2E27 c +2E28 o +2E29 c +3008 o +3009 c +300A o +300B c +300C o +300D c +300E o +300F c +3010 o +3011 c +3014 o +3015 c +3016 o +3017 c +3018 o +3019 c +301A o +301B c +FE59 o +FE5A c +FE5B o +FE5C c +FE5D o +FE5E c +FF08 o +FF09 c +FF3B o +FF3D c +FF5B o +FF5D c +FF5F o +FF60 c +FF62 o +FF63 c +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# The mappings must be modified to get the correct values by adding the code +# point ordinal number to each one that is numeric. + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNv'}{'format'} = 'a'; # some entries need adjustment +$utf8::SwashInfo{'ToNv'}{'missing'} = 'NaN'; + +return <<'END'; +30 39 0 +B2 B3 2 +B9 1 +BC 1/4 +BD 1/2 +BE 3/4 +660 669 0 +6F0 6F9 0 +7C0 7C9 0 +966 96F 0 +9E6 9EF 0 +9F4 1/16 +9F5 1/8 +9F6 3/16 +9F7 1/4 +9F8 3/4 +9F9 16 +A66 A6F 0 +AE6 AEF 0 +B66 B6F 0 +B72 1/4 +B73 1/2 +B74 3/4 +B75 1/16 +B76 1/8 +B77 3/16 +BE6 BF0 0 +BF1 100 +BF2 1000 +C66 C6F 0 +C78 C7B 0 +C7C C7E 1 +CE6 CEF 0 +D58 1/160 +D59 1/40 +D5A 3/80 +D5B 1/20 +D5C 1/10 +D5D 3/20 +D5E 1/5 +D66 D70 0 +D71 100 +D72 1000 +D73 1/4 +D74 1/2 +D75 3/4 +D76 1/16 +D77 1/8 +D78 3/16 +DE6 DEF 0 +E50 E59 0 +ED0 ED9 0 +F20 F29 0 +F2A 1/2 +F2B 3/2 +F2C 5/2 +F2D 7/2 +F2E 9/2 +F2F 11/2 +F30 13/2 +F31 15/2 +F32 17/2 +F33 -1/2 +1040 1049 0 +1090 1099 0 +1369 1372 1 +1373 20 +1374 30 +1375 40 +1376 50 +1377 60 +1378 70 +1379 80 +137A 90 +137B 100 +137C 10000 +16EE 16F0 17 +17E0 17E9 0 +17F0 17F9 0 +1810 1819 0 +1946 194F 0 +19D0 19D9 0 +19DA 1 +1A80 1A89 0 +1A90 1A99 0 +1B50 1B59 0 +1BB0 1BB9 0 +1C40 1C49 0 +1C50 1C59 0 +2070 0 +2074 2079 4 +2080 2089 0 +2150 1/7 +2151 1/9 +2152 1/10 +2153 1/3 +2154 2/3 +2155 1/5 +2156 2/5 +2157 3/5 +2158 4/5 +2159 1/6 +215A 5/6 +215B 1/8 +215C 3/8 +215D 5/8 +215E 7/8 +215F 1 +2160 216B 1 +216C 50 +216D 100 +216E 500 +216F 1000 +2170 217B 1 +217C 50 +217D 100 +217E 500 +217F 1000 +2180 1000 +2181 5000 +2182 10000 +2185 6 +2186 50 +2187 50000 +2188 100000 +2189 0 +2460 2473 1 +2474 2487 1 +2488 249B 1 +24EA 0 +24EB 24F4 11 +24F5 24FE 1 +24FF 0 +2776 277F 1 +2780 2789 1 +278A 2793 1 +2CFD 1/2 +3007 0 +3021 3029 1 +3038 10 +3039 20 +303A 30 +3192 3195 1 +3220 3229 1 +3248 10 +3249 20 +324A 30 +324B 40 +324C 50 +324D 60 +324E 70 +324F 80 +3251 325F 21 +3280 3289 1 +32B1 32BF 36 +3405 5 +3483 2 +382A 5 +3B4D 7 +4E00 1 +4E03 7 +4E07 10000 +4E09 3 +4E5D 9 +4E8C 2 +4E94 5 +4E96 4 +4EBF 100000000 +4EC0 10 +4EDF 1000 +4EE8 3 +4F0D 5 +4F70 100 +5104 100000000 +5146 1000000000000 +5169 2 +516B 8 +516D 6 +5341 10 +5343 1000 +5344 20 +5345 30 +534C 40 +53C1 3 +53C2 3 +53C3 3 +53C4 3 +56DB 4 +58F1 1 +58F9 1 +5E7A 1 +5EFE 9 +5EFF 20 +5F0C 5F0E 1 +5F10 2 +62FE 10 +634C 8 +67D2 7 +6F06 7 +7396 9 +767E 100 +8086 4 +842C 10000 +8CAE 2 +8CB3 2 +8D30 2 +9621 1000 +9646 6 +964C 100 +9678 6 +96F6 0 +A620 A629 0 +A6E6 A6EE 1 +A6EF 0 +A830 1/4 +A831 1/2 +A832 3/4 +A833 1/16 +A834 1/8 +A835 3/16 +A8D0 A8D9 0 +A900 A909 0 +A9D0 A9D9 0 +A9F0 A9F9 0 +AA50 AA59 0 +ABF0 ABF9 0 +F96B 3 +F973 10 +F978 2 +F9B2 0 +F9D1 6 +F9D3 6 +F9FD 10 +FF10 FF19 0 +10107 10110 1 +10111 20 +10112 30 +10113 40 +10114 50 +10115 60 +10116 70 +10117 80 +10118 90 +10119 100 +1011A 200 +1011B 300 +1011C 400 +1011D 500 +1011E 600 +1011F 700 +10120 800 +10121 900 +10122 1000 +10123 2000 +10124 3000 +10125 4000 +10126 5000 +10127 6000 +10128 7000 +10129 8000 +1012A 9000 +1012B 10000 +1012C 20000 +1012D 30000 +1012E 40000 +1012F 50000 +10130 60000 +10131 70000 +10132 80000 +10133 90000 +10140 1/4 +10141 1/2 +10142 1 +10143 5 +10144 50 +10145 500 +10146 5000 +10147 50000 +10148 5 +10149 10 +1014A 50 +1014B 100 +1014C 500 +1014D 1000 +1014E 5000 +1014F 5 +10150 10 +10151 50 +10152 100 +10153 500 +10154 1000 +10155 10000 +10156 50000 +10157 10 +10158 1 +10159 1 +1015A 1015B 1 +1015C 2 +1015D 2 +1015E 2 +1015F 5 +10160 10 +10161 10 +10162 10 +10163 10 +10164 10 +10165 30 +10166 50 +10167 50 +10168 50 +10169 50 +1016A 100 +1016B 300 +1016C 500 +1016D 500 +1016E 500 +1016F 500 +10170 500 +10171 1000 +10172 5000 +10173 5 +10174 50 +10175 1/2 +10176 1/2 +10177 2/3 +10178 3/4 +1018A 0 +1018B 1/4 +102E1 102EA 1 +102EB 20 +102EC 30 +102ED 40 +102EE 50 +102EF 60 +102F0 70 +102F1 80 +102F2 90 +102F3 100 +102F4 200 +102F5 300 +102F6 400 +102F7 500 +102F8 600 +102F9 700 +102FA 800 +102FB 900 +10320 1 +10321 5 +10322 10 +10323 50 +10341 90 +1034A 900 +103D1 103D2 1 +103D3 10 +103D4 20 +103D5 100 +104A0 104A9 0 +10858 1085A 1 +1085B 10 +1085C 20 +1085D 100 +1085E 1000 +1085F 10000 +10879 1087D 1 +1087E 10 +1087F 20 +108A7 108AA 1 +108AB 108AC 4 +108AD 10 +108AE 20 +108AF 100 +108FB 1 +108FC 5 +108FD 10 +108FE 20 +108FF 100 +10916 1 +10917 10 +10918 20 +10919 100 +1091A 1091B 2 +109BC 11/12 +109BD 1/2 +109C0 109C9 1 +109CA 20 +109CB 30 +109CC 40 +109CD 50 +109CE 60 +109CF 70 +109D2 100 +109D3 200 +109D4 300 +109D5 400 +109D6 500 +109D7 600 +109D8 700 +109D9 800 +109DA 900 +109DB 1000 +109DC 2000 +109DD 3000 +109DE 4000 +109DF 5000 +109E0 6000 +109E1 7000 +109E2 8000 +109E3 9000 +109E4 10000 +109E5 20000 +109E6 30000 +109E7 40000 +109E8 50000 +109E9 60000 +109EA 70000 +109EB 80000 +109EC 90000 +109ED 100000 +109EE 200000 +109EF 300000 +109F0 400000 +109F1 500000 +109F2 600000 +109F3 700000 +109F4 800000 +109F5 900000 +109F6 1/12 +109F7 1/6 +109F8 1/4 +109F9 1/3 +109FA 5/12 +109FB 1/2 +109FC 7/12 +109FD 2/3 +109FE 3/4 +109FF 5/6 +10A40 10A43 1 +10A44 10 +10A45 20 +10A46 100 +10A47 1000 +10A7D 1 +10A7E 50 +10A9D 1 +10A9E 10 +10A9F 20 +10AEB 1 +10AEC 5 +10AED 10 +10AEE 20 +10AEF 100 +10B58 10B5B 1 +10B5C 10 +10B5D 20 +10B5E 100 +10B5F 1000 +10B78 10B7B 1 +10B7C 10 +10B7D 20 +10B7E 100 +10B7F 1000 +10BA9 10BAC 1 +10BAD 10 +10BAE 20 +10BAF 100 +10CFA 1 +10CFB 5 +10CFC 10 +10CFD 50 +10CFE 100 +10CFF 1000 +10E60 10E69 1 +10E6A 20 +10E6B 30 +10E6C 40 +10E6D 50 +10E6E 60 +10E6F 70 +10E70 80 +10E71 90 +10E72 100 +10E73 200 +10E74 300 +10E75 400 +10E76 500 +10E77 600 +10E78 700 +10E79 800 +10E7A 900 +10E7B 1/2 +10E7C 1/4 +10E7D 1/3 +10E7E 2/3 +11052 1105B 1 +1105C 20 +1105D 30 +1105E 40 +1105F 50 +11060 60 +11061 70 +11062 80 +11063 90 +11064 100 +11065 1000 +11066 1106F 0 +110F0 110F9 0 +11136 1113F 0 +111D0 111D9 0 +111E1 111EA 1 +111EB 20 +111EC 30 +111ED 40 +111EE 50 +111EF 60 +111F0 70 +111F1 80 +111F2 90 +111F3 100 +111F4 1000 +112F0 112F9 0 +11450 11459 0 +114D0 114D9 0 +11650 11659 0 +116C0 116C9 0 +11730 1173A 0 +1173B 20 +118E0 118EA 0 +118EB 20 +118EC 30 +118ED 40 +118EE 50 +118EF 60 +118F0 70 +118F1 80 +118F2 90 +11C50 11C59 0 +11C5A 11C63 1 +11C64 20 +11C65 30 +11C66 40 +11C67 50 +11C68 60 +11C69 70 +11C6A 80 +11C6B 90 +11C6C 100 +11D50 11D59 0 +12400 12407 2 +12408 1240E 3 +1240F 12414 4 +12415 1241D 1 +1241E 12422 1 +12423 12424 2 +12425 1242B 3 +1242C 1242E 1 +1242F 12431 3 +12432 216000 +12433 432000 +12434 12436 1 +12437 12439 3 +1243A 3 +1243B 1243C 3 +1243D 4 +1243E 4 +1243F 4 +12440 12441 6 +12442 7 +12443 12444 7 +12445 12446 8 +12447 9 +12448 9 +12449 9 +1244A 1244E 2 +1244F 12452 1 +12453 12454 4 +12455 5 +12456 12457 2 +12458 12459 1 +1245A 1/3 +1245B 2/3 +1245C 5/6 +1245D 1/3 +1245E 2/3 +1245F 1/8 +12460 1/4 +12461 1/6 +12462 1/4 +12463 1/4 +12464 1/2 +12465 1/3 +12466 2/3 +12467 40 +12468 50 +12469 1246E 4 +16A60 16A69 0 +16B50 16B59 0 +16B5B 10 +16B5C 100 +16B5D 10000 +16B5E 1000000 +16B5F 100000000 +16B60 10000000000 +16B61 1000000000000 +1D360 1D369 1 +1D36A 20 +1D36B 30 +1D36C 40 +1D36D 50 +1D36E 60 +1D36F 70 +1D370 80 +1D371 90 +1D7CE 1D7D7 0 +1D7D8 1D7E1 0 +1D7E2 1D7EB 0 +1D7EC 1D7F5 0 +1D7F6 1D7FF 0 +1E8C7 1E8CF 1 +1E950 1E959 0 +1F100 0 +1F101 1F10A 0 +1F10B 0 +1F10C 0 +20001 7 +20064 4 +200E2 4 +20121 5 +2092A 1 +20983 30 +2098C 40 +2099C 40 +20AEA 6 +20AFD 3 +20B19 3 +22390 2 +22998 3 +23B1B 3 +2626D 4 +2F890 9 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('Titlecase_Mapping') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToTitle'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToTitle'}{'specials_name'} = 'utf8::ToSpecTitle'; # Name of hash of special mappings +$utf8::SwashInfo{'ToTitle'}{'missing'} = '<code point>'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecTitle = ( +"\xC3\x9F" => "\x{0053}\x{0073}", # U+00DF => 0053 0073 +"\xC5\x89" => "\x{02BC}\x{004E}", # U+0149 => 02BC 004E +"\xC7\xB0" => "\x{004A}\x{030C}", # U+01F0 => 004A 030C +"\xCE\x90" => "\x{0399}\x{0308}\x{0301}", # U+0390 => 0399 0308 0301 +"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}", # U+03B0 => 03A5 0308 0301 +"\xD6\x87" => "\x{0535}\x{0582}", # U+0587 => 0535 0582 +"\xE1\xBA\x96" => "\x{0048}\x{0331}", # U+1E96 => 0048 0331 +"\xE1\xBA\x97" => "\x{0054}\x{0308}", # U+1E97 => 0054 0308 +"\xE1\xBA\x98" => "\x{0057}\x{030A}", # U+1E98 => 0057 030A +"\xE1\xBA\x99" => "\x{0059}\x{030A}", # U+1E99 => 0059 030A +"\xE1\xBA\x9A" => "\x{0041}\x{02BE}", # U+1E9A => 0041 02BE +"\xE1\xBD\x90" => "\x{03A5}\x{0313}", # U+1F50 => 03A5 0313 +"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}", # U+1F52 => 03A5 0313 0300 +"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}", # U+1F54 => 03A5 0313 0301 +"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}", # U+1F56 => 03A5 0313 0342 +"\xE1\xBE\xB2" => "\x{1FBA}\x{0345}", # U+1FB2 => 1FBA 0345 +"\xE1\xBE\xB4" => "\x{0386}\x{0345}", # U+1FB4 => 0386 0345 +"\xE1\xBE\xB6" => "\x{0391}\x{0342}", # U+1FB6 => 0391 0342 +"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0345}", # U+1FB7 => 0391 0342 0345 +"\xE1\xBF\x82" => "\x{1FCA}\x{0345}", # U+1FC2 => 1FCA 0345 +"\xE1\xBF\x84" => "\x{0389}\x{0345}", # U+1FC4 => 0389 0345 +"\xE1\xBF\x86" => "\x{0397}\x{0342}", # U+1FC6 => 0397 0342 +"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0345}", # U+1FC7 => 0397 0342 0345 +"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}", # U+1FD2 => 0399 0308 0300 +"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}", # U+1FD3 => 0399 0308 0301 +"\xE1\xBF\x96" => "\x{0399}\x{0342}", # U+1FD6 => 0399 0342 +"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}", # U+1FD7 => 0399 0308 0342 +"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}", # U+1FE2 => 03A5 0308 0300 +"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}", # U+1FE3 => 03A5 0308 0301 +"\xE1\xBF\xA4" => "\x{03A1}\x{0313}", # U+1FE4 => 03A1 0313 +"\xE1\xBF\xA6" => "\x{03A5}\x{0342}", # U+1FE6 => 03A5 0342 +"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}", # U+1FE7 => 03A5 0308 0342 +"\xE1\xBF\xB2" => "\x{1FFA}\x{0345}", # U+1FF2 => 1FFA 0345 +"\xE1\xBF\xB4" => "\x{038F}\x{0345}", # U+1FF4 => 038F 0345 +"\xE1\xBF\xB6" => "\x{03A9}\x{0342}", # U+1FF6 => 03A9 0342 +"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0345}", # U+1FF7 => 03A9 0342 0345 +"\xEF\xAC\x80" => "\x{0046}\x{0066}", # U+FB00 => 0046 0066 +"\xEF\xAC\x81" => "\x{0046}\x{0069}", # U+FB01 => 0046 0069 +"\xEF\xAC\x82" => "\x{0046}\x{006C}", # U+FB02 => 0046 006C +"\xEF\xAC\x83" => "\x{0046}\x{0066}\x{0069}", # U+FB03 => 0046 0066 0069 +"\xEF\xAC\x84" => "\x{0046}\x{0066}\x{006C}", # U+FB04 => 0046 0066 006C +"\xEF\xAC\x85" => "\x{0053}\x{0074}", # U+FB05 => 0053 0074 +"\xEF\xAC\x86" => "\x{0053}\x{0074}", # U+FB06 => 0053 0074 +"\xEF\xAC\x93" => "\x{0544}\x{0576}", # U+FB13 => 0544 0576 +"\xEF\xAC\x94" => "\x{0544}\x{0565}", # U+FB14 => 0544 0565 +"\xEF\xAC\x95" => "\x{0544}\x{056B}", # U+FB15 => 0544 056B +"\xEF\xAC\x96" => "\x{054E}\x{0576}", # U+FB16 => 054E 0576 +"\xEF\xAC\x97" => "\x{0544}\x{056D}", # U+FB17 => 0544 056D +); + +return <<'END'; +0061 0041 +0062 0042 +0063 0043 +0064 0044 +0065 0045 +0066 0046 +0067 0047 +0068 0048 +0069 0049 +006A 004A +006B 004B +006C 004C +006D 004D +006E 004E +006F 004F +0070 0050 +0071 0051 +0072 0052 +0073 0053 +0074 0054 +0075 0055 +0076 0056 +0077 0057 +0078 0058 +0079 0059 +007A 005A +00B5 039C +00E0 00C0 +00E1 00C1 +00E2 00C2 +00E3 00C3 +00E4 00C4 +00E5 00C5 +00E6 00C6 +00E7 00C7 +00E8 00C8 +00E9 00C9 +00EA 00CA +00EB 00CB +00EC 00CC +00ED 00CD +00EE 00CE +00EF 00CF +00F0 00D0 +00F1 00D1 +00F2 00D2 +00F3 00D3 +00F4 00D4 +00F5 00D5 +00F6 00D6 +00F8 00D8 +00F9 00D9 +00FA 00DA +00FB 00DB +00FC 00DC +00FD 00DD +00FE 00DE +00FF 0178 +0101 0100 +0103 0102 +0105 0104 +0107 0106 +0109 0108 +010B 010A +010D 010C +010F 010E +0111 0110 +0113 0112 +0115 0114 +0117 0116 +0119 0118 +011B 011A +011D 011C +011F 011E +0121 0120 +0123 0122 +0125 0124 +0127 0126 +0129 0128 +012B 012A +012D 012C +012F 012E +0131 0049 +0133 0132 +0135 0134 +0137 0136 +013A 0139 +013C 013B +013E 013D +0140 013F +0142 0141 +0144 0143 +0146 0145 +0148 0147 +014B 014A +014D 014C +014F 014E +0151 0150 +0153 0152 +0155 0154 +0157 0156 +0159 0158 +015B 015A +015D 015C +015F 015E +0161 0160 +0163 0162 +0165 0164 +0167 0166 +0169 0168 +016B 016A +016D 016C +016F 016E +0171 0170 +0173 0172 +0175 0174 +0177 0176 +017A 0179 +017C 017B +017E 017D +017F 0053 +0180 0243 +0183 0182 +0185 0184 +0188 0187 +018C 018B +0192 0191 +0195 01F6 +0199 0198 +019A 023D +019E 0220 +01A1 01A0 +01A3 01A2 +01A5 01A4 +01A8 01A7 +01AD 01AC +01B0 01AF +01B4 01B3 +01B6 01B5 +01B9 01B8 +01BD 01BC +01BF 01F7 +01C4 01C5 +01C6 01C5 +01C7 01C8 +01C9 01C8 +01CA 01CB +01CC 01CB +01CE 01CD +01D0 01CF +01D2 01D1 +01D4 01D3 +01D6 01D5 +01D8 01D7 +01DA 01D9 +01DC 01DB +01DD 018E +01DF 01DE +01E1 01E0 +01E3 01E2 +01E5 01E4 +01E7 01E6 +01E9 01E8 +01EB 01EA +01ED 01EC +01EF 01EE +01F1 01F2 +01F3 01F2 +01F5 01F4 +01F9 01F8 +01FB 01FA +01FD 01FC +01FF 01FE +0201 0200 +0203 0202 +0205 0204 +0207 0206 +0209 0208 +020B 020A +020D 020C +020F 020E +0211 0210 +0213 0212 +0215 0214 +0217 0216 +0219 0218 +021B 021A +021D 021C +021F 021E +0223 0222 +0225 0224 +0227 0226 +0229 0228 +022B 022A +022D 022C +022F 022E +0231 0230 +0233 0232 +023C 023B +023F 2C7E +0240 2C7F +0242 0241 +0247 0246 +0249 0248 +024B 024A +024D 024C +024F 024E +0250 2C6F +0251 2C6D +0252 2C70 +0253 0181 +0254 0186 +0256 0189 +0257 018A +0259 018F +025B 0190 +025C A7AB +0260 0193 +0261 A7AC +0263 0194 +0265 A78D +0266 A7AA +0268 0197 +0269 0196 +026A A7AE +026B 2C62 +026C A7AD +026F 019C +0271 2C6E +0272 019D +0275 019F +027D 2C64 +0280 01A6 +0283 01A9 +0287 A7B1 +0288 01AE +0289 0244 +028A 01B1 +028B 01B2 +028C 0245 +0292 01B7 +029D A7B2 +029E A7B0 +0345 0399 +0371 0370 +0373 0372 +0377 0376 +037B 03FD +037C 03FE +037D 03FF +03AC 0386 +03AD 0388 +03AE 0389 +03AF 038A +03B1 0391 +03B2 0392 +03B3 0393 +03B4 0394 +03B5 0395 +03B6 0396 +03B7 0397 +03B8 0398 +03B9 0399 +03BA 039A +03BB 039B +03BC 039C +03BD 039D +03BE 039E +03BF 039F +03C0 03A0 +03C1 03A1 +03C2 03A3 +03C3 03A3 +03C4 03A4 +03C5 03A5 +03C6 03A6 +03C7 03A7 +03C8 03A8 +03C9 03A9 +03CA 03AA +03CB 03AB +03CC 038C +03CD 038E +03CE 038F +03D0 0392 +03D1 0398 +03D5 03A6 +03D6 03A0 +03D7 03CF +03D9 03D8 +03DB 03DA +03DD 03DC +03DF 03DE +03E1 03E0 +03E3 03E2 +03E5 03E4 +03E7 03E6 +03E9 03E8 +03EB 03EA +03ED 03EC +03EF 03EE +03F0 039A +03F1 03A1 +03F2 03F9 +03F3 037F +03F5 0395 +03F8 03F7 +03FB 03FA +0430 0410 +0431 0411 +0432 0412 +0433 0413 +0434 0414 +0435 0415 +0436 0416 +0437 0417 +0438 0418 +0439 0419 +043A 041A +043B 041B +043C 041C +043D 041D +043E 041E +043F 041F +0440 0420 +0441 0421 +0442 0422 +0443 0423 +0444 0424 +0445 0425 +0446 0426 +0447 0427 +0448 0428 +0449 0429 +044A 042A +044B 042B +044C 042C +044D 042D +044E 042E +044F 042F +0450 0400 +0451 0401 +0452 0402 +0453 0403 +0454 0404 +0455 0405 +0456 0406 +0457 0407 +0458 0408 +0459 0409 +045A 040A +045B 040B +045C 040C +045D 040D +045E 040E +045F 040F +0461 0460 +0463 0462 +0465 0464 +0467 0466 +0469 0468 +046B 046A +046D 046C +046F 046E +0471 0470 +0473 0472 +0475 0474 +0477 0476 +0479 0478 +047B 047A +047D 047C +047F 047E +0481 0480 +048B 048A +048D 048C +048F 048E +0491 0490 +0493 0492 +0495 0494 +0497 0496 +0499 0498 +049B 049A +049D 049C +049F 049E +04A1 04A0 +04A3 04A2 +04A5 04A4 +04A7 04A6 +04A9 04A8 +04AB 04AA +04AD 04AC +04AF 04AE +04B1 04B0 +04B3 04B2 +04B5 04B4 +04B7 04B6 +04B9 04B8 +04BB 04BA +04BD 04BC +04BF 04BE +04C2 04C1 +04C4 04C3 +04C6 04C5 +04C8 04C7 +04CA 04C9 +04CC 04CB +04CE 04CD +04CF 04C0 +04D1 04D0 +04D3 04D2 +04D5 04D4 +04D7 04D6 +04D9 04D8 +04DB 04DA +04DD 04DC +04DF 04DE +04E1 04E0 +04E3 04E2 +04E5 04E4 +04E7 04E6 +04E9 04E8 +04EB 04EA +04ED 04EC +04EF 04EE +04F1 04F0 +04F3 04F2 +04F5 04F4 +04F7 04F6 +04F9 04F8 +04FB 04FA +04FD 04FC +04FF 04FE +0501 0500 +0503 0502 +0505 0504 +0507 0506 +0509 0508 +050B 050A +050D 050C +050F 050E +0511 0510 +0513 0512 +0515 0514 +0517 0516 +0519 0518 +051B 051A +051D 051C +051F 051E +0521 0520 +0523 0522 +0525 0524 +0527 0526 +0529 0528 +052B 052A +052D 052C +052F 052E +0561 0531 +0562 0532 +0563 0533 +0564 0534 +0565 0535 +0566 0536 +0567 0537 +0568 0538 +0569 0539 +056A 053A +056B 053B +056C 053C +056D 053D +056E 053E +056F 053F +0570 0540 +0571 0541 +0572 0542 +0573 0543 +0574 0544 +0575 0545 +0576 0546 +0577 0547 +0578 0548 +0579 0549 +057A 054A +057B 054B +057C 054C +057D 054D +057E 054E +057F 054F +0580 0550 +0581 0551 +0582 0552 +0583 0553 +0584 0554 +0585 0555 +0586 0556 +13F8 13F0 +13F9 13F1 +13FA 13F2 +13FB 13F3 +13FC 13F4 +13FD 13F5 +1C80 0412 +1C81 0414 +1C82 041E +1C83 0421 +1C84 0422 +1C85 0422 +1C86 042A +1C87 0462 +1C88 A64A +1D79 A77D +1D7D 2C63 +1E01 1E00 +1E03 1E02 +1E05 1E04 +1E07 1E06 +1E09 1E08 +1E0B 1E0A +1E0D 1E0C +1E0F 1E0E +1E11 1E10 +1E13 1E12 +1E15 1E14 +1E17 1E16 +1E19 1E18 +1E1B 1E1A +1E1D 1E1C +1E1F 1E1E +1E21 1E20 +1E23 1E22 +1E25 1E24 +1E27 1E26 +1E29 1E28 +1E2B 1E2A +1E2D 1E2C +1E2F 1E2E +1E31 1E30 +1E33 1E32 +1E35 1E34 +1E37 1E36 +1E39 1E38 +1E3B 1E3A +1E3D 1E3C +1E3F 1E3E +1E41 1E40 +1E43 1E42 +1E45 1E44 +1E47 1E46 +1E49 1E48 +1E4B 1E4A +1E4D 1E4C +1E4F 1E4E +1E51 1E50 +1E53 1E52 +1E55 1E54 +1E57 1E56 +1E59 1E58 +1E5B 1E5A +1E5D 1E5C +1E5F 1E5E +1E61 1E60 +1E63 1E62 +1E65 1E64 +1E67 1E66 +1E69 1E68 +1E6B 1E6A +1E6D 1E6C +1E6F 1E6E +1E71 1E70 +1E73 1E72 +1E75 1E74 +1E77 1E76 +1E79 1E78 +1E7B 1E7A +1E7D 1E7C +1E7F 1E7E +1E81 1E80 +1E83 1E82 +1E85 1E84 +1E87 1E86 +1E89 1E88 +1E8B 1E8A +1E8D 1E8C +1E8F 1E8E +1E91 1E90 +1E93 1E92 +1E95 1E94 +1E9B 1E60 +1EA1 1EA0 +1EA3 1EA2 +1EA5 1EA4 +1EA7 1EA6 +1EA9 1EA8 +1EAB 1EAA +1EAD 1EAC +1EAF 1EAE +1EB1 1EB0 +1EB3 1EB2 +1EB5 1EB4 +1EB7 1EB6 +1EB9 1EB8 +1EBB 1EBA +1EBD 1EBC +1EBF 1EBE +1EC1 1EC0 +1EC3 1EC2 +1EC5 1EC4 +1EC7 1EC6 +1EC9 1EC8 +1ECB 1ECA +1ECD 1ECC +1ECF 1ECE +1ED1 1ED0 +1ED3 1ED2 +1ED5 1ED4 +1ED7 1ED6 +1ED9 1ED8 +1EDB 1EDA +1EDD 1EDC +1EDF 1EDE +1EE1 1EE0 +1EE3 1EE2 +1EE5 1EE4 +1EE7 1EE6 +1EE9 1EE8 +1EEB 1EEA +1EED 1EEC +1EEF 1EEE +1EF1 1EF0 +1EF3 1EF2 +1EF5 1EF4 +1EF7 1EF6 +1EF9 1EF8 +1EFB 1EFA +1EFD 1EFC +1EFF 1EFE +1F00 1F08 +1F01 1F09 +1F02 1F0A +1F03 1F0B +1F04 1F0C +1F05 1F0D +1F06 1F0E +1F07 1F0F +1F10 1F18 +1F11 1F19 +1F12 1F1A +1F13 1F1B +1F14 1F1C +1F15 1F1D +1F20 1F28 +1F21 1F29 +1F22 1F2A +1F23 1F2B +1F24 1F2C +1F25 1F2D +1F26 1F2E +1F27 1F2F +1F30 1F38 +1F31 1F39 +1F32 1F3A +1F33 1F3B +1F34 1F3C +1F35 1F3D +1F36 1F3E +1F37 1F3F +1F40 1F48 +1F41 1F49 +1F42 1F4A +1F43 1F4B +1F44 1F4C +1F45 1F4D +1F51 1F59 +1F53 1F5B +1F55 1F5D +1F57 1F5F +1F60 1F68 +1F61 1F69 +1F62 1F6A +1F63 1F6B +1F64 1F6C +1F65 1F6D +1F66 1F6E +1F67 1F6F +1F70 1FBA +1F71 1FBB +1F72 1FC8 +1F73 1FC9 +1F74 1FCA +1F75 1FCB +1F76 1FDA +1F77 1FDB +1F78 1FF8 +1F79 1FF9 +1F7A 1FEA +1F7B 1FEB +1F7C 1FFA +1F7D 1FFB +1F80 1F88 +1F81 1F89 +1F82 1F8A +1F83 1F8B +1F84 1F8C +1F85 1F8D +1F86 1F8E +1F87 1F8F +1F90 1F98 +1F91 1F99 +1F92 1F9A +1F93 1F9B +1F94 1F9C +1F95 1F9D +1F96 1F9E +1F97 1F9F +1FA0 1FA8 +1FA1 1FA9 +1FA2 1FAA +1FA3 1FAB +1FA4 1FAC +1FA5 1FAD +1FA6 1FAE +1FA7 1FAF +1FB0 1FB8 +1FB1 1FB9 +1FB3 1FBC +1FBE 0399 +1FC3 1FCC +1FD0 1FD8 +1FD1 1FD9 +1FE0 1FE8 +1FE1 1FE9 +1FE5 1FEC +1FF3 1FFC +214E 2132 +2170 2160 +2171 2161 +2172 2162 +2173 2163 +2174 2164 +2175 2165 +2176 2166 +2177 2167 +2178 2168 +2179 2169 +217A 216A +217B 216B +217C 216C +217D 216D +217E 216E +217F 216F +2184 2183 +24D0 24B6 +24D1 24B7 +24D2 24B8 +24D3 24B9 +24D4 24BA +24D5 24BB +24D6 24BC +24D7 24BD +24D8 24BE +24D9 24BF +24DA 24C0 +24DB 24C1 +24DC 24C2 +24DD 24C3 +24DE 24C4 +24DF 24C5 +24E0 24C6 +24E1 24C7 +24E2 24C8 +24E3 24C9 +24E4 24CA +24E5 24CB +24E6 24CC +24E7 24CD +24E8 24CE +24E9 24CF +2C30 2C00 +2C31 2C01 +2C32 2C02 +2C33 2C03 +2C34 2C04 +2C35 2C05 +2C36 2C06 +2C37 2C07 +2C38 2C08 +2C39 2C09 +2C3A 2C0A +2C3B 2C0B +2C3C 2C0C +2C3D 2C0D +2C3E 2C0E +2C3F 2C0F +2C40 2C10 +2C41 2C11 +2C42 2C12 +2C43 2C13 +2C44 2C14 +2C45 2C15 +2C46 2C16 +2C47 2C17 +2C48 2C18 +2C49 2C19 +2C4A 2C1A +2C4B 2C1B +2C4C 2C1C +2C4D 2C1D +2C4E 2C1E +2C4F 2C1F +2C50 2C20 +2C51 2C21 +2C52 2C22 +2C53 2C23 +2C54 2C24 +2C55 2C25 +2C56 2C26 +2C57 2C27 +2C58 2C28 +2C59 2C29 +2C5A 2C2A +2C5B 2C2B +2C5C 2C2C +2C5D 2C2D +2C5E 2C2E +2C61 2C60 +2C65 023A +2C66 023E +2C68 2C67 +2C6A 2C69 +2C6C 2C6B +2C73 2C72 +2C76 2C75 +2C81 2C80 +2C83 2C82 +2C85 2C84 +2C87 2C86 +2C89 2C88 +2C8B 2C8A +2C8D 2C8C +2C8F 2C8E +2C91 2C90 +2C93 2C92 +2C95 2C94 +2C97 2C96 +2C99 2C98 +2C9B 2C9A +2C9D 2C9C +2C9F 2C9E +2CA1 2CA0 +2CA3 2CA2 +2CA5 2CA4 +2CA7 2CA6 +2CA9 2CA8 +2CAB 2CAA +2CAD 2CAC +2CAF 2CAE +2CB1 2CB0 +2CB3 2CB2 +2CB5 2CB4 +2CB7 2CB6 +2CB9 2CB8 +2CBB 2CBA +2CBD 2CBC +2CBF 2CBE +2CC1 2CC0 +2CC3 2CC2 +2CC5 2CC4 +2CC7 2CC6 +2CC9 2CC8 +2CCB 2CCA +2CCD 2CCC +2CCF 2CCE +2CD1 2CD0 +2CD3 2CD2 +2CD5 2CD4 +2CD7 2CD6 +2CD9 2CD8 +2CDB 2CDA +2CDD 2CDC +2CDF 2CDE +2CE1 2CE0 +2CE3 2CE2 +2CEC 2CEB +2CEE 2CED +2CF3 2CF2 +2D00 10A0 +2D01 10A1 +2D02 10A2 +2D03 10A3 +2D04 10A4 +2D05 10A5 +2D06 10A6 +2D07 10A7 +2D08 10A8 +2D09 10A9 +2D0A 10AA +2D0B 10AB +2D0C 10AC +2D0D 10AD +2D0E 10AE +2D0F 10AF +2D10 10B0 +2D11 10B1 +2D12 10B2 +2D13 10B3 +2D14 10B4 +2D15 10B5 +2D16 10B6 +2D17 10B7 +2D18 10B8 +2D19 10B9 +2D1A 10BA +2D1B 10BB +2D1C 10BC +2D1D 10BD +2D1E 10BE +2D1F 10BF +2D20 10C0 +2D21 10C1 +2D22 10C2 +2D23 10C3 +2D24 10C4 +2D25 10C5 +2D27 10C7 +2D2D 10CD +A641 A640 +A643 A642 +A645 A644 +A647 A646 +A649 A648 +A64B A64A +A64D A64C +A64F A64E +A651 A650 +A653 A652 +A655 A654 +A657 A656 +A659 A658 +A65B A65A +A65D A65C +A65F A65E +A661 A660 +A663 A662 +A665 A664 +A667 A666 +A669 A668 +A66B A66A +A66D A66C +A681 A680 +A683 A682 +A685 A684 +A687 A686 +A689 A688 +A68B A68A +A68D A68C +A68F A68E +A691 A690 +A693 A692 +A695 A694 +A697 A696 +A699 A698 +A69B A69A +A723 A722 +A725 A724 +A727 A726 +A729 A728 +A72B A72A +A72D A72C +A72F A72E +A733 A732 +A735 A734 +A737 A736 +A739 A738 +A73B A73A +A73D A73C +A73F A73E +A741 A740 +A743 A742 +A745 A744 +A747 A746 +A749 A748 +A74B A74A +A74D A74C +A74F A74E +A751 A750 +A753 A752 +A755 A754 +A757 A756 +A759 A758 +A75B A75A +A75D A75C +A75F A75E +A761 A760 +A763 A762 +A765 A764 +A767 A766 +A769 A768 +A76B A76A +A76D A76C +A76F A76E +A77A A779 +A77C A77B +A77F A77E +A781 A780 +A783 A782 +A785 A784 +A787 A786 +A78C A78B +A791 A790 +A793 A792 +A797 A796 +A799 A798 +A79B A79A +A79D A79C +A79F A79E +A7A1 A7A0 +A7A3 A7A2 +A7A5 A7A4 +A7A7 A7A6 +A7A9 A7A8 +A7B5 A7B4 +A7B7 A7B6 +AB53 A7B3 +AB70 13A0 +AB71 13A1 +AB72 13A2 +AB73 13A3 +AB74 13A4 +AB75 13A5 +AB76 13A6 +AB77 13A7 +AB78 13A8 +AB79 13A9 +AB7A 13AA +AB7B 13AB +AB7C 13AC +AB7D 13AD +AB7E 13AE +AB7F 13AF +AB80 13B0 +AB81 13B1 +AB82 13B2 +AB83 13B3 +AB84 13B4 +AB85 13B5 +AB86 13B6 +AB87 13B7 +AB88 13B8 +AB89 13B9 +AB8A 13BA +AB8B 13BB +AB8C 13BC +AB8D 13BD +AB8E 13BE +AB8F 13BF +AB90 13C0 +AB91 13C1 +AB92 13C2 +AB93 13C3 +AB94 13C4 +AB95 13C5 +AB96 13C6 +AB97 13C7 +AB98 13C8 +AB99 13C9 +AB9A 13CA +AB9B 13CB +AB9C 13CC +AB9D 13CD +AB9E 13CE +AB9F 13CF +ABA0 13D0 +ABA1 13D1 +ABA2 13D2 +ABA3 13D3 +ABA4 13D4 +ABA5 13D5 +ABA6 13D6 +ABA7 13D7 +ABA8 13D8 +ABA9 13D9 +ABAA 13DA +ABAB 13DB +ABAC 13DC +ABAD 13DD +ABAE 13DE +ABAF 13DF +ABB0 13E0 +ABB1 13E1 +ABB2 13E2 +ABB3 13E3 +ABB4 13E4 +ABB5 13E5 +ABB6 13E6 +ABB7 13E7 +ABB8 13E8 +ABB9 13E9 +ABBA 13EA +ABBB 13EB +ABBC 13EC +ABBD 13ED +ABBE 13EE +ABBF 13EF +FF41 FF21 +FF42 FF22 +FF43 FF23 +FF44 FF24 +FF45 FF25 +FF46 FF26 +FF47 FF27 +FF48 FF28 +FF49 FF29 +FF4A FF2A +FF4B FF2B +FF4C FF2C +FF4D FF2D +FF4E FF2E +FF4F FF2F +FF50 FF30 +FF51 FF31 +FF52 FF32 +FF53 FF33 +FF54 FF34 +FF55 FF35 +FF56 FF36 +FF57 FF37 +FF58 FF38 +FF59 FF39 +FF5A FF3A +10428 10400 +10429 10401 +1042A 10402 +1042B 10403 +1042C 10404 +1042D 10405 +1042E 10406 +1042F 10407 +10430 10408 +10431 10409 +10432 1040A +10433 1040B +10434 1040C +10435 1040D +10436 1040E +10437 1040F +10438 10410 +10439 10411 +1043A 10412 +1043B 10413 +1043C 10414 +1043D 10415 +1043E 10416 +1043F 10417 +10440 10418 +10441 10419 +10442 1041A +10443 1041B +10444 1041C +10445 1041D +10446 1041E +10447 1041F +10448 10420 +10449 10421 +1044A 10422 +1044B 10423 +1044C 10424 +1044D 10425 +1044E 10426 +1044F 10427 +104D8 104B0 +104D9 104B1 +104DA 104B2 +104DB 104B3 +104DC 104B4 +104DD 104B5 +104DE 104B6 +104DF 104B7 +104E0 104B8 +104E1 104B9 +104E2 104BA +104E3 104BB +104E4 104BC +104E5 104BD +104E6 104BE +104E7 104BF +104E8 104C0 +104E9 104C1 +104EA 104C2 +104EB 104C3 +104EC 104C4 +104ED 104C5 +104EE 104C6 +104EF 104C7 +104F0 104C8 +104F1 104C9 +104F2 104CA +104F3 104CB +104F4 104CC +104F5 104CD +104F6 104CE +104F7 104CF +104F8 104D0 +104F9 104D1 +104FA 104D2 +104FB 104D3 +10CC0 10C80 +10CC1 10C81 +10CC2 10C82 +10CC3 10C83 +10CC4 10C84 +10CC5 10C85 +10CC6 10C86 +10CC7 10C87 +10CC8 10C88 +10CC9 10C89 +10CCA 10C8A +10CCB 10C8B +10CCC 10C8C +10CCD 10C8D +10CCE 10C8E +10CCF 10C8F +10CD0 10C90 +10CD1 10C91 +10CD2 10C92 +10CD3 10C93 +10CD4 10C94 +10CD5 10C95 +10CD6 10C96 +10CD7 10C97 +10CD8 10C98 +10CD9 10C99 +10CDA 10C9A +10CDB 10C9B +10CDC 10C9C +10CDD 10C9D +10CDE 10C9E +10CDF 10C9F +10CE0 10CA0 +10CE1 10CA1 +10CE2 10CA2 +10CE3 10CA3 +10CE4 10CA4 +10CE5 10CA5 +10CE6 10CA6 +10CE7 10CA7 +10CE8 10CA8 +10CE9 10CA9 +10CEA 10CAA +10CEB 10CAB +10CEC 10CAC +10CED 10CAD +10CEE 10CAE +10CEF 10CAF +10CF0 10CB0 +10CF1 10CB1 +10CF2 10CB2 +118C0 118A0 +118C1 118A1 +118C2 118A2 +118C3 118A3 +118C4 118A4 +118C5 118A5 +118C6 118A6 +118C7 118A7 +118C8 118A8 +118C9 118A9 +118CA 118AA +118CB 118AB +118CC 118AC +118CD 118AD +118CE 118AE +118CF 118AF +118D0 118B0 +118D1 118B1 +118D2 118B2 +118D3 118B3 +118D4 118B4 +118D5 118B5 +118D6 118B6 +118D7 118B7 +118D8 118B8 +118D9 118B9 +118DA 118BA +118DB 118BB +118DC 118BC +118DD 118BD +118DE 118BE +118DF 118BF +1E922 1E900 +1E923 1E901 +1E924 1E902 +1E925 1E903 +1E926 1E904 +1E927 1E905 +1E928 1E906 +1E929 1E907 +1E92A 1E908 +1E92B 1E909 +1E92C 1E90A +1E92D 1E90B +1E92E 1E90C +1E92F 1E90D +1E930 1E90E +1E931 1E90F +1E932 1E910 +1E933 1E911 +1E934 1E912 +1E935 1E913 +1E936 1E914 +1E937 1E915 +1E938 1E916 +1E939 1E917 +1E93A 1E918 +1E93B 1E919 +1E93C 1E91A +1E93D 1E91B +1E93E 1E91C +1E93F 1E91D +1E940 1E91E +1E941 1E91F +1E942 1E920 +1E943 1E921 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('Bidi_Mirroring_Glyph') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToBmg'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToBmg'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +0028 0029 +0029 0028 +003C 003E +003E 003C +005B 005D +005D 005B +007B 007D +007D 007B +00AB 00BB +00BB 00AB +0F3A 0F3B +0F3B 0F3A +0F3C 0F3D +0F3D 0F3C +169B 169C +169C 169B +2039 203A +203A 2039 +2045 2046 +2046 2045 +207D 207E +207E 207D +208D 208E +208E 208D +2208 220B +2209 220C +220A 220D +220B 2208 +220C 2209 +220D 220A +2215 29F5 +223C 223D +223D 223C +2243 22CD +2252 2253 +2253 2252 +2254 2255 +2255 2254 +2264 2265 +2265 2264 +2266 2267 +2267 2266 +2268 2269 +2269 2268 +226A 226B +226B 226A +226E 226F +226F 226E +2270 2271 +2271 2270 +2272 2273 +2273 2272 +2274 2275 +2275 2274 +2276 2277 +2277 2276 +2278 2279 +2279 2278 +227A 227B +227B 227A +227C 227D +227D 227C +227E 227F +227F 227E +2280 2281 +2281 2280 +2282 2283 +2283 2282 +2284 2285 +2285 2284 +2286 2287 +2287 2286 +2288 2289 +2289 2288 +228A 228B +228B 228A +228F 2290 +2290 228F +2291 2292 +2292 2291 +2298 29B8 +22A2 22A3 +22A3 22A2 +22A6 2ADE +22A8 2AE4 +22A9 2AE3 +22AB 2AE5 +22B0 22B1 +22B1 22B0 +22B2 22B3 +22B3 22B2 +22B4 22B5 +22B5 22B4 +22B6 22B7 +22B7 22B6 +22C9 22CA +22CA 22C9 +22CB 22CC +22CC 22CB +22CD 2243 +22D0 22D1 +22D1 22D0 +22D6 22D7 +22D7 22D6 +22D8 22D9 +22D9 22D8 +22DA 22DB +22DB 22DA +22DC 22DD +22DD 22DC +22DE 22DF +22DF 22DE +22E0 22E1 +22E1 22E0 +22E2 22E3 +22E3 22E2 +22E4 22E5 +22E5 22E4 +22E6 22E7 +22E7 22E6 +22E8 22E9 +22E9 22E8 +22EA 22EB +22EB 22EA +22EC 22ED +22ED 22EC +22F0 22F1 +22F1 22F0 +22F2 22FA +22F3 22FB +22F4 22FC +22F6 22FD +22F7 22FE +22FA 22F2 +22FB 22F3 +22FC 22F4 +22FD 22F6 +22FE 22F7 +2308 2309 +2309 2308 +230A 230B +230B 230A +2329 232A +232A 2329 +2768 2769 +2769 2768 +276A 276B +276B 276A +276C 276D +276D 276C +276E 276F +276F 276E +2770 2771 +2771 2770 +2772 2773 +2773 2772 +2774 2775 +2775 2774 +27C3 27C4 +27C4 27C3 +27C5 27C6 +27C6 27C5 +27C8 27C9 +27C9 27C8 +27CB 27CD +27CD 27CB +27D5 27D6 +27D6 27D5 +27DD 27DE +27DE 27DD +27E2 27E3 +27E3 27E2 +27E4 27E5 +27E5 27E4 +27E6 27E7 +27E7 27E6 +27E8 27E9 +27E9 27E8 +27EA 27EB +27EB 27EA +27EC 27ED +27ED 27EC +27EE 27EF +27EF 27EE +2983 2984 +2984 2983 +2985 2986 +2986 2985 +2987 2988 +2988 2987 +2989 298A +298A 2989 +298B 298C +298C 298B +298D 2990 +298E 298F +298F 298E +2990 298D +2991 2992 +2992 2991 +2993 2994 +2994 2993 +2995 2996 +2996 2995 +2997 2998 +2998 2997 +29B8 2298 +29C0 29C1 +29C1 29C0 +29C4 29C5 +29C5 29C4 +29CF 29D0 +29D0 29CF +29D1 29D2 +29D2 29D1 +29D4 29D5 +29D5 29D4 +29D8 29D9 +29D9 29D8 +29DA 29DB +29DB 29DA +29F5 2215 +29F8 29F9 +29F9 29F8 +29FC 29FD +29FD 29FC +2A2B 2A2C +2A2C 2A2B +2A2D 2A2E +2A2E 2A2D +2A34 2A35 +2A35 2A34 +2A3C 2A3D +2A3D 2A3C +2A64 2A65 +2A65 2A64 +2A79 2A7A +2A7A 2A79 +2A7D 2A7E +2A7E 2A7D +2A7F 2A80 +2A80 2A7F +2A81 2A82 +2A82 2A81 +2A83 2A84 +2A84 2A83 +2A8B 2A8C +2A8C 2A8B +2A91 2A92 +2A92 2A91 +2A93 2A94 +2A94 2A93 +2A95 2A96 +2A96 2A95 +2A97 2A98 +2A98 2A97 +2A99 2A9A +2A9A 2A99 +2A9B 2A9C +2A9C 2A9B +2AA1 2AA2 +2AA2 2AA1 +2AA6 2AA7 +2AA7 2AA6 +2AA8 2AA9 +2AA9 2AA8 +2AAA 2AAB +2AAB 2AAA +2AAC 2AAD +2AAD 2AAC +2AAF 2AB0 +2AB0 2AAF +2AB3 2AB4 +2AB4 2AB3 +2ABB 2ABC +2ABC 2ABB +2ABD 2ABE +2ABE 2ABD +2ABF 2AC0 +2AC0 2ABF +2AC1 2AC2 +2AC2 2AC1 +2AC3 2AC4 +2AC4 2AC3 +2AC5 2AC6 +2AC6 2AC5 +2ACD 2ACE +2ACE 2ACD +2ACF 2AD0 +2AD0 2ACF +2AD1 2AD2 +2AD2 2AD1 +2AD3 2AD4 +2AD4 2AD3 +2AD5 2AD6 +2AD6 2AD5 +2ADE 22A6 +2AE3 22A9 +2AE4 22A8 +2AE5 22AB +2AEC 2AED +2AED 2AEC +2AF7 2AF8 +2AF8 2AF7 +2AF9 2AFA +2AFA 2AF9 +2E02 2E03 +2E03 2E02 +2E04 2E05 +2E05 2E04 +2E09 2E0A +2E0A 2E09 +2E0C 2E0D +2E0D 2E0C +2E1C 2E1D +2E1D 2E1C +2E20 2E21 +2E21 2E20 +2E22 2E23 +2E23 2E22 +2E24 2E25 +2E25 2E24 +2E26 2E27 +2E27 2E26 +2E28 2E29 +2E29 2E28 +3008 3009 +3009 3008 +300A 300B +300B 300A +300C 300D +300D 300C +300E 300F +300F 300E +3010 3011 +3011 3010 +3014 3015 +3015 3014 +3016 3017 +3017 3016 +3018 3019 +3019 3018 +301A 301B +301B 301A +FE59 FE5A +FE5A FE59 +FE5B FE5C +FE5C FE5B +FE5D FE5E +FE5E FE5D +FE64 FE65 +FE65 FE64 +FF08 FF09 +FF09 FF08 +FF1C FF1E +FF1E FF1C +FF3B FF3D +FF3D FF3B +FF5B FF5D +FF5D FF5B +FF5F FF60 +FF60 FF5F +FF62 FF63 +FF63 FF62 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToSB'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToSB'}{'missing'} = 'Other'; + +return <<'END'; +9 Sp +A LF +B C Sp +D CR +20 Sp +21 STerm +22 Close +27 29 Close +2C 2D SContinue +2E ATerm +30 39 Numeric +3A SContinue +3F STerm +41 5A Upper +5B Close +5D Close +61 7A Lower +7B Close +7D Close +85 Sep +A0 Sp +AA Lower +AB Close +AD Format +B5 Lower +BA Lower +BB Close +C0 D6 Upper +D8 DE Upper +DF F6 Lower +F8 FF Lower +100 Upper +101 Lower +102 Upper +103 Lower +104 Upper +105 Lower +106 Upper +107 Lower +108 Upper +109 Lower +10A Upper +10B Lower +10C Upper +10D Lower +10E Upper +10F Lower +110 Upper +111 Lower +112 Upper +113 Lower +114 Upper +115 Lower +116 Upper +117 Lower +118 Upper +119 Lower +11A Upper +11B Lower +11C Upper +11D Lower +11E Upper +11F Lower +120 Upper +121 Lower +122 Upper +123 Lower +124 Upper +125 Lower +126 Upper +127 Lower +128 Upper +129 Lower +12A Upper +12B Lower +12C Upper +12D Lower +12E Upper +12F Lower +130 Upper +131 Lower +132 Upper +133 Lower +134 Upper +135 Lower +136 Upper +137 138 Lower +139 Upper +13A Lower +13B Upper +13C Lower +13D Upper +13E Lower +13F Upper +140 Lower +141 Upper +142 Lower +143 Upper +144 Lower +145 Upper +146 Lower +147 Upper +148 149 Lower +14A Upper +14B Lower +14C Upper +14D Lower +14E Upper +14F Lower +150 Upper +151 Lower +152 Upper +153 Lower +154 Upper +155 Lower +156 Upper +157 Lower +158 Upper +159 Lower +15A Upper +15B Lower +15C Upper +15D Lower +15E Upper +15F Lower +160 Upper +161 Lower +162 Upper +163 Lower +164 Upper +165 Lower +166 Upper +167 Lower +168 Upper +169 Lower +16A Upper +16B Lower +16C Upper +16D Lower +16E Upper +16F Lower +170 Upper +171 Lower +172 Upper +173 Lower +174 Upper +175 Lower +176 Upper +177 Lower +178 179 Upper +17A Lower +17B Upper +17C Lower +17D Upper +17E 180 Lower +181 182 Upper +183 Lower +184 Upper +185 Lower +186 187 Upper +188 Lower +189 18B Upper +18C 18D Lower +18E 191 Upper +192 Lower +193 194 Upper +195 Lower +196 198 Upper +199 19B Lower +19C 19D Upper +19E Lower +19F 1A0 Upper +1A1 Lower +1A2 Upper +1A3 Lower +1A4 Upper +1A5 Lower +1A6 1A7 Upper +1A8 Lower +1A9 Upper +1AA 1AB Lower +1AC Upper +1AD Lower +1AE 1AF Upper +1B0 Lower +1B1 1B3 Upper +1B4 Lower +1B5 Upper +1B6 Lower +1B7 1B8 Upper +1B9 1BA Lower +1BB OLetter +1BC Upper +1BD 1BF Lower +1C0 1C3 OLetter +1C4 1C5 Upper +1C6 Lower +1C7 1C8 Upper +1C9 Lower +1CA 1CB Upper +1CC Lower +1CD Upper +1CE Lower +1CF Upper +1D0 Lower +1D1 Upper +1D2 Lower +1D3 Upper +1D4 Lower +1D5 Upper +1D6 Lower +1D7 Upper +1D8 Lower +1D9 Upper +1DA Lower +1DB Upper +1DC 1DD Lower +1DE Upper +1DF Lower +1E0 Upper +1E1 Lower +1E2 Upper +1E3 Lower +1E4 Upper +1E5 Lower +1E6 Upper +1E7 Lower +1E8 Upper +1E9 Lower +1EA Upper +1EB Lower +1EC Upper +1ED Lower +1EE Upper +1EF 1F0 Lower +1F1 1F2 Upper +1F3 Lower +1F4 Upper +1F5 Lower +1F6 1F8 Upper +1F9 Lower +1FA Upper +1FB Lower +1FC Upper +1FD Lower +1FE Upper +1FF Lower +200 Upper +201 Lower +202 Upper +203 Lower +204 Upper +205 Lower +206 Upper +207 Lower +208 Upper +209 Lower +20A Upper +20B Lower +20C Upper +20D Lower +20E Upper +20F Lower +210 Upper +211 Lower +212 Upper +213 Lower +214 Upper +215 Lower +216 Upper +217 Lower +218 Upper +219 Lower +21A Upper +21B Lower +21C Upper +21D Lower +21E Upper +21F Lower +220 Upper +221 Lower +222 Upper +223 Lower +224 Upper +225 Lower +226 Upper +227 Lower +228 Upper +229 Lower +22A Upper +22B Lower +22C Upper +22D Lower +22E Upper +22F Lower +230 Upper +231 Lower +232 Upper +233 239 Lower +23A 23B Upper +23C Lower +23D 23E Upper +23F 240 Lower +241 Upper +242 Lower +243 246 Upper +247 Lower +248 Upper +249 Lower +24A Upper +24B Lower +24C Upper +24D Lower +24E Upper +24F 293 Lower +294 OLetter +295 2B8 Lower +2B9 2BF OLetter +2C0 2C1 Lower +2C6 2D1 OLetter +2E0 2E4 Lower +2EC OLetter +2EE OLetter +300 36F Extend +370 Upper +371 Lower +372 Upper +373 Lower +374 OLetter +376 Upper +377 Lower +37A 37D Lower +37F Upper +386 Upper +388 38A Upper +38C Upper +38E 38F Upper +390 Lower +391 3A1 Upper +3A3 3AB Upper +3AC 3CE Lower +3CF Upper +3D0 3D1 Lower +3D2 3D4 Upper +3D5 3D7 Lower +3D8 Upper +3D9 Lower +3DA Upper +3DB Lower +3DC Upper +3DD Lower +3DE Upper +3DF Lower +3E0 Upper +3E1 Lower +3E2 Upper +3E3 Lower +3E4 Upper +3E5 Lower +3E6 Upper +3E7 Lower +3E8 Upper +3E9 Lower +3EA Upper +3EB Lower +3EC Upper +3ED Lower +3EE Upper +3EF 3F3 Lower +3F4 Upper +3F5 Lower +3F7 Upper +3F8 Lower +3F9 3FA Upper +3FB 3FC Lower +3FD 42F Upper +430 45F Lower +460 Upper +461 Lower +462 Upper +463 Lower +464 Upper +465 Lower +466 Upper +467 Lower +468 Upper +469 Lower +46A Upper +46B Lower +46C Upper +46D Lower +46E Upper +46F Lower +470 Upper +471 Lower +472 Upper +473 Lower +474 Upper +475 Lower +476 Upper +477 Lower +478 Upper +479 Lower +47A Upper +47B Lower +47C Upper +47D Lower +47E Upper +47F Lower +480 Upper +481 Lower +483 489 Extend +48A Upper +48B Lower +48C Upper +48D Lower +48E Upper +48F Lower +490 Upper +491 Lower +492 Upper +493 Lower +494 Upper +495 Lower +496 Upper +497 Lower +498 Upper +499 Lower +49A Upper +49B Lower +49C Upper +49D Lower +49E Upper +49F Lower +4A0 Upper +4A1 Lower +4A2 Upper +4A3 Lower +4A4 Upper +4A5 Lower +4A6 Upper +4A7 Lower +4A8 Upper +4A9 Lower +4AA Upper +4AB Lower +4AC Upper +4AD Lower +4AE Upper +4AF Lower +4B0 Upper +4B1 Lower +4B2 Upper +4B3 Lower +4B4 Upper +4B5 Lower +4B6 Upper +4B7 Lower +4B8 Upper +4B9 Lower +4BA Upper +4BB Lower +4BC Upper +4BD Lower +4BE Upper +4BF Lower +4C0 4C1 Upper +4C2 Lower +4C3 Upper +4C4 Lower +4C5 Upper +4C6 Lower +4C7 Upper +4C8 Lower +4C9 Upper +4CA Lower +4CB Upper +4CC Lower +4CD Upper +4CE 4CF Lower +4D0 Upper +4D1 Lower +4D2 Upper +4D3 Lower +4D4 Upper +4D5 Lower +4D6 Upper +4D7 Lower +4D8 Upper +4D9 Lower +4DA Upper +4DB Lower +4DC Upper +4DD Lower +4DE Upper +4DF Lower +4E0 Upper +4E1 Lower +4E2 Upper +4E3 Lower +4E4 Upper +4E5 Lower +4E6 Upper +4E7 Lower +4E8 Upper +4E9 Lower +4EA Upper +4EB Lower +4EC Upper +4ED Lower +4EE Upper +4EF Lower +4F0 Upper +4F1 Lower +4F2 Upper +4F3 Lower +4F4 Upper +4F5 Lower +4F6 Upper +4F7 Lower +4F8 Upper +4F9 Lower +4FA Upper +4FB Lower +4FC Upper +4FD Lower +4FE Upper +4FF Lower +500 Upper +501 Lower +502 Upper +503 Lower +504 Upper +505 Lower +506 Upper +507 Lower +508 Upper +509 Lower +50A Upper +50B Lower +50C Upper +50D Lower +50E Upper +50F Lower +510 Upper +511 Lower +512 Upper +513 Lower +514 Upper +515 Lower +516 Upper +517 Lower +518 Upper +519 Lower +51A Upper +51B Lower +51C Upper +51D Lower +51E Upper +51F Lower +520 Upper +521 Lower +522 Upper +523 Lower +524 Upper +525 Lower +526 Upper +527 Lower +528 Upper +529 Lower +52A Upper +52B Lower +52C Upper +52D Lower +52E Upper +52F Lower +531 556 Upper +559 OLetter +55D SContinue +561 587 Lower +589 STerm +591 5BD Extend +5BF Extend +5C1 5C2 Extend +5C4 5C5 Extend +5C7 Extend +5D0 5EA OLetter +5F0 5F3 OLetter +600 605 Format +60C 60D SContinue +610 61A Extend +61C Format +61F STerm +620 64A OLetter +64B 65F Extend +660 669 Numeric +66B 66C Numeric +66E 66F OLetter +670 Extend +671 6D3 OLetter +6D4 STerm +6D5 OLetter +6D6 6DC Extend +6DD Format +6DF 6E4 Extend +6E5 6E6 OLetter +6E7 6E8 Extend +6EA 6ED Extend +6EE 6EF OLetter +6F0 6F9 Numeric +6FA 6FC OLetter +6FF OLetter +700 702 STerm +70F Format +710 OLetter +711 Extend +712 72F OLetter +730 74A Extend +74D 7A5 OLetter +7A6 7B0 Extend +7B1 OLetter +7C0 7C9 Numeric +7CA 7EA OLetter +7EB 7F3 Extend +7F4 7F5 OLetter +7F8 SContinue +7F9 STerm +7FA OLetter +800 815 OLetter +816 819 Extend +81A OLetter +81B 823 Extend +824 OLetter +825 827 Extend +828 OLetter +829 82D Extend +840 858 OLetter +859 85B Extend +860 86A OLetter +8A0 8B4 OLetter +8B6 8BD OLetter +8D4 8E1 Extend +8E2 Format +8E3 903 Extend +904 939 OLetter +93A 93C Extend +93D OLetter +93E 94F Extend +950 OLetter +951 957 Extend +958 961 OLetter +962 963 Extend +964 965 STerm +966 96F Numeric +971 980 OLetter +981 983 Extend +985 98C OLetter +98F 990 OLetter +993 9A8 OLetter +9AA 9B0 OLetter +9B2 OLetter +9B6 9B9 OLetter +9BC Extend +9BD OLetter +9BE 9C4 Extend +9C7 9C8 Extend +9CB 9CD Extend +9CE OLetter +9D7 Extend +9DC 9DD OLetter +9DF 9E1 OLetter +9E2 9E3 Extend +9E6 9EF Numeric +9F0 9F1 OLetter +9FC OLetter +A01 A03 Extend +A05 A0A OLetter +A0F A10 OLetter +A13 A28 OLetter +A2A A30 OLetter +A32 A33 OLetter +A35 A36 OLetter +A38 A39 OLetter +A3C Extend +A3E A42 Extend +A47 A48 Extend +A4B A4D Extend +A51 Extend +A59 A5C OLetter +A5E OLetter +A66 A6F Numeric +A70 A71 Extend +A72 A74 OLetter +A75 Extend +A81 A83 Extend +A85 A8D OLetter +A8F A91 OLetter +A93 AA8 OLetter +AAA AB0 OLetter +AB2 AB3 OLetter +AB5 AB9 OLetter +ABC Extend +ABD OLetter +ABE AC5 Extend +AC7 AC9 Extend +ACB ACD Extend +AD0 OLetter +AE0 AE1 OLetter +AE2 AE3 Extend +AE6 AEF Numeric +AF9 OLetter +AFA AFF Extend +B01 B03 Extend +B05 B0C OLetter +B0F B10 OLetter +B13 B28 OLetter +B2A B30 OLetter +B32 B33 OLetter +B35 B39 OLetter +B3C Extend +B3D OLetter +B3E B44 Extend +B47 B48 Extend +B4B B4D Extend +B56 B57 Extend +B5C B5D OLetter +B5F B61 OLetter +B62 B63 Extend +B66 B6F Numeric +B71 OLetter +B82 Extend +B83 OLetter +B85 B8A OLetter +B8E B90 OLetter +B92 B95 OLetter +B99 B9A OLetter +B9C OLetter +B9E B9F OLetter +BA3 BA4 OLetter +BA8 BAA OLetter +BAE BB9 OLetter +BBE BC2 Extend +BC6 BC8 Extend +BCA BCD Extend +BD0 OLetter +BD7 Extend +BE6 BEF Numeric +C00 C03 Extend +C05 C0C OLetter +C0E C10 OLetter +C12 C28 OLetter +C2A C39 OLetter +C3D OLetter +C3E C44 Extend +C46 C48 Extend +C4A C4D Extend +C55 C56 Extend +C58 C5A OLetter +C60 C61 OLetter +C62 C63 Extend +C66 C6F Numeric +C80 OLetter +C81 C83 Extend +C85 C8C OLetter +C8E C90 OLetter +C92 CA8 OLetter +CAA CB3 OLetter +CB5 CB9 OLetter +CBC Extend +CBD OLetter +CBE CC4 Extend +CC6 CC8 Extend +CCA CCD Extend +CD5 CD6 Extend +CDE OLetter +CE0 CE1 OLetter +CE2 CE3 Extend +CE6 CEF Numeric +CF1 CF2 OLetter +D00 D03 Extend +D05 D0C OLetter +D0E D10 OLetter +D12 D3A OLetter +D3B D3C Extend +D3D OLetter +D3E D44 Extend +D46 D48 Extend +D4A D4D Extend +D4E OLetter +D54 D56 OLetter +D57 Extend +D5F D61 OLetter +D62 D63 Extend +D66 D6F Numeric +D7A D7F OLetter +D82 D83 Extend +D85 D96 OLetter +D9A DB1 OLetter +DB3 DBB OLetter +DBD OLetter +DC0 DC6 OLetter +DCA Extend +DCF DD4 Extend +DD6 Extend +DD8 DDF Extend +DE6 DEF Numeric +DF2 DF3 Extend +E01 E30 OLetter +E31 Extend +E32 E33 OLetter +E34 E3A Extend +E40 E46 OLetter +E47 E4E Extend +E50 E59 Numeric +E81 E82 OLetter +E84 OLetter +E87 E88 OLetter +E8A OLetter +E8D OLetter +E94 E97 OLetter +E99 E9F OLetter +EA1 EA3 OLetter +EA5 OLetter +EA7 OLetter +EAA EAB OLetter +EAD EB0 OLetter +EB1 Extend +EB2 EB3 OLetter +EB4 EB9 Extend +EBB EBC Extend +EBD OLetter +EC0 EC4 OLetter +EC6 OLetter +EC8 ECD Extend +ED0 ED9 Numeric +EDC EDF OLetter +F00 OLetter +F18 F19 Extend +F20 F29 Numeric +F35 Extend +F37 Extend +F39 Extend +F3A F3D Close +F3E F3F Extend +F40 F47 OLetter +F49 F6C OLetter +F71 F84 Extend +F86 F87 Extend +F88 F8C OLetter +F8D F97 Extend +F99 FBC Extend +FC6 Extend +1000 102A OLetter +102B 103E Extend +103F OLetter +1040 1049 Numeric +104A 104B STerm +1050 1055 OLetter +1056 1059 Extend +105A 105D OLetter +105E 1060 Extend +1061 OLetter +1062 1064 Extend +1065 1066 OLetter +1067 106D Extend +106E 1070 OLetter +1071 1074 Extend +1075 1081 OLetter +1082 108D Extend +108E OLetter +108F Extend +1090 1099 Numeric +109A 109D Extend +10A0 10C5 Upper +10C7 Upper +10CD Upper +10D0 10FA OLetter +10FC 1248 OLetter +124A 124D OLetter +1250 1256 OLetter +1258 OLetter +125A 125D OLetter +1260 1288 OLetter +128A 128D OLetter +1290 12B0 OLetter +12B2 12B5 OLetter +12B8 12BE OLetter +12C0 OLetter +12C2 12C5 OLetter +12C8 12D6 OLetter +12D8 1310 OLetter +1312 1315 OLetter +1318 135A OLetter +135D 135F Extend +1362 STerm +1367 1368 STerm +1380 138F OLetter +13A0 13F5 Upper +13F8 13FD Lower +1401 166C OLetter +166E STerm +166F 167F OLetter +1680 Sp +1681 169A OLetter +169B 169C Close +16A0 16EA OLetter +16EE 16F8 OLetter +1700 170C OLetter +170E 1711 OLetter +1712 1714 Extend +1720 1731 OLetter +1732 1734 Extend +1735 1736 STerm +1740 1751 OLetter +1752 1753 Extend +1760 176C OLetter +176E 1770 OLetter +1772 1773 Extend +1780 17B3 OLetter +17B4 17D3 Extend +17D7 OLetter +17DC OLetter +17DD Extend +17E0 17E9 Numeric +1802 SContinue +1803 STerm +1808 SContinue +1809 STerm +180B 180D Extend +180E Format +1810 1819 Numeric +1820 1877 OLetter +1880 1884 OLetter +1885 1886 Extend +1887 18A8 OLetter +18A9 Extend +18AA OLetter +18B0 18F5 OLetter +1900 191E OLetter +1920 192B Extend +1930 193B Extend +1944 1945 STerm +1946 194F Numeric +1950 196D OLetter +1970 1974 OLetter +1980 19AB OLetter +19B0 19C9 OLetter +19D0 19D9 Numeric +1A00 1A16 OLetter +1A17 1A1B Extend +1A20 1A54 OLetter +1A55 1A5E Extend +1A60 1A7C Extend +1A7F Extend +1A80 1A89 Numeric +1A90 1A99 Numeric +1AA7 OLetter +1AA8 1AAB STerm +1AB0 1ABE Extend +1B00 1B04 Extend +1B05 1B33 OLetter +1B34 1B44 Extend +1B45 1B4B OLetter +1B50 1B59 Numeric +1B5A 1B5B STerm +1B5E 1B5F STerm +1B6B 1B73 Extend +1B80 1B82 Extend +1B83 1BA0 OLetter +1BA1 1BAD Extend +1BAE 1BAF OLetter +1BB0 1BB9 Numeric +1BBA 1BE5 OLetter +1BE6 1BF3 Extend +1C00 1C23 OLetter +1C24 1C37 Extend +1C3B 1C3C STerm +1C40 1C49 Numeric +1C4D 1C4F OLetter +1C50 1C59 Numeric +1C5A 1C7D OLetter +1C7E 1C7F STerm +1C80 1C88 Lower +1CD0 1CD2 Extend +1CD4 1CE8 Extend +1CE9 1CEC OLetter +1CED Extend +1CEE 1CF1 OLetter +1CF2 1CF4 Extend +1CF5 1CF6 OLetter +1CF7 1CF9 Extend +1D00 1DBF Lower +1DC0 1DF9 Extend +1DFB 1DFF Extend +1E00 Upper +1E01 Lower +1E02 Upper +1E03 Lower +1E04 Upper +1E05 Lower +1E06 Upper +1E07 Lower +1E08 Upper +1E09 Lower +1E0A Upper +1E0B Lower +1E0C Upper +1E0D Lower +1E0E Upper +1E0F Lower +1E10 Upper +1E11 Lower +1E12 Upper +1E13 Lower +1E14 Upper +1E15 Lower +1E16 Upper +1E17 Lower +1E18 Upper +1E19 Lower +1E1A Upper +1E1B Lower +1E1C Upper +1E1D Lower +1E1E Upper +1E1F Lower +1E20 Upper +1E21 Lower +1E22 Upper +1E23 Lower +1E24 Upper +1E25 Lower +1E26 Upper +1E27 Lower +1E28 Upper +1E29 Lower +1E2A Upper +1E2B Lower +1E2C Upper +1E2D Lower +1E2E Upper +1E2F Lower +1E30 Upper +1E31 Lower +1E32 Upper +1E33 Lower +1E34 Upper +1E35 Lower +1E36 Upper +1E37 Lower +1E38 Upper +1E39 Lower +1E3A Upper +1E3B Lower +1E3C Upper +1E3D Lower +1E3E Upper +1E3F Lower +1E40 Upper +1E41 Lower +1E42 Upper +1E43 Lower +1E44 Upper +1E45 Lower +1E46 Upper +1E47 Lower +1E48 Upper +1E49 Lower +1E4A Upper +1E4B Lower +1E4C Upper +1E4D Lower +1E4E Upper +1E4F Lower +1E50 Upper +1E51 Lower +1E52 Upper +1E53 Lower +1E54 Upper +1E55 Lower +1E56 Upper +1E57 Lower +1E58 Upper +1E59 Lower +1E5A Upper +1E5B Lower +1E5C Upper +1E5D Lower +1E5E Upper +1E5F Lower +1E60 Upper +1E61 Lower +1E62 Upper +1E63 Lower +1E64 Upper +1E65 Lower +1E66 Upper +1E67 Lower +1E68 Upper +1E69 Lower +1E6A Upper +1E6B Lower +1E6C Upper +1E6D Lower +1E6E Upper +1E6F Lower +1E70 Upper +1E71 Lower +1E72 Upper +1E73 Lower +1E74 Upper +1E75 Lower +1E76 Upper +1E77 Lower +1E78 Upper +1E79 Lower +1E7A Upper +1E7B Lower +1E7C Upper +1E7D Lower +1E7E Upper +1E7F Lower +1E80 Upper +1E81 Lower +1E82 Upper +1E83 Lower +1E84 Upper +1E85 Lower +1E86 Upper +1E87 Lower +1E88 Upper +1E89 Lower +1E8A Upper +1E8B Lower +1E8C Upper +1E8D Lower +1E8E Upper +1E8F Lower +1E90 Upper +1E91 Lower +1E92 Upper +1E93 Lower +1E94 Upper +1E95 1E9D Lower +1E9E Upper +1E9F Lower +1EA0 Upper +1EA1 Lower +1EA2 Upper +1EA3 Lower +1EA4 Upper +1EA5 Lower +1EA6 Upper +1EA7 Lower +1EA8 Upper +1EA9 Lower +1EAA Upper +1EAB Lower +1EAC Upper +1EAD Lower +1EAE Upper +1EAF Lower +1EB0 Upper +1EB1 Lower +1EB2 Upper +1EB3 Lower +1EB4 Upper +1EB5 Lower +1EB6 Upper +1EB7 Lower +1EB8 Upper +1EB9 Lower +1EBA Upper +1EBB Lower +1EBC Upper +1EBD Lower +1EBE Upper +1EBF Lower +1EC0 Upper +1EC1 Lower +1EC2 Upper +1EC3 Lower +1EC4 Upper +1EC5 Lower +1EC6 Upper +1EC7 Lower +1EC8 Upper +1EC9 Lower +1ECA Upper +1ECB Lower +1ECC Upper +1ECD Lower +1ECE Upper +1ECF Lower +1ED0 Upper +1ED1 Lower +1ED2 Upper +1ED3 Lower +1ED4 Upper +1ED5 Lower +1ED6 Upper +1ED7 Lower +1ED8 Upper +1ED9 Lower +1EDA Upper +1EDB Lower +1EDC Upper +1EDD Lower +1EDE Upper +1EDF Lower +1EE0 Upper +1EE1 Lower +1EE2 Upper +1EE3 Lower +1EE4 Upper +1EE5 Lower +1EE6 Upper +1EE7 Lower +1EE8 Upper +1EE9 Lower +1EEA Upper +1EEB Lower +1EEC Upper +1EED Lower +1EEE Upper +1EEF Lower +1EF0 Upper +1EF1 Lower +1EF2 Upper +1EF3 Lower +1EF4 Upper +1EF5 Lower +1EF6 Upper +1EF7 Lower +1EF8 Upper +1EF9 Lower +1EFA Upper +1EFB Lower +1EFC Upper +1EFD Lower +1EFE Upper +1EFF 1F07 Lower +1F08 1F0F Upper +1F10 1F15 Lower +1F18 1F1D Upper +1F20 1F27 Lower +1F28 1F2F Upper +1F30 1F37 Lower +1F38 1F3F Upper +1F40 1F45 Lower +1F48 1F4D Upper +1F50 1F57 Lower +1F59 Upper +1F5B Upper +1F5D Upper +1F5F Upper +1F60 1F67 Lower +1F68 1F6F Upper +1F70 1F7D Lower +1F80 1F87 Lower +1F88 1F8F Upper +1F90 1F97 Lower +1F98 1F9F Upper +1FA0 1FA7 Lower +1FA8 1FAF Upper +1FB0 1FB4 Lower +1FB6 1FB7 Lower +1FB8 1FBC Upper +1FBE Lower +1FC2 1FC4 Lower +1FC6 1FC7 Lower +1FC8 1FCC Upper +1FD0 1FD3 Lower +1FD6 1FD7 Lower +1FD8 1FDB Upper +1FE0 1FE7 Lower +1FE8 1FEC Upper +1FF2 1FF4 Lower +1FF6 1FF7 Lower +1FF8 1FFC Upper +2000 200A Sp +200B Format +200C 200D Extend +200E 200F Format +2013 2014 SContinue +2018 201F Close +2024 ATerm +2028 2029 Sep +202A 202E Format +202F Sp +2039 203A Close +203C 203D STerm +2045 2046 Close +2047 2049 STerm +205F Sp +2060 2064 Format +2066 206F Format +2071 Lower +207D 207E Close +207F Lower +208D 208E Close +2090 209C Lower +20D0 20F0 Extend +2102 Upper +2107 Upper +210A Lower +210B 210D Upper +210E 210F Lower +2110 2112 Upper +2113 Lower +2115 Upper +2119 211D Upper +2124 Upper +2126 Upper +2128 Upper +212A 212D Upper +212F Lower +2130 2133 Upper +2134 Lower +2135 2138 OLetter +2139 Lower +213C 213D Lower +213E 213F Upper +2145 Upper +2146 2149 Lower +214E Lower +2160 216F Upper +2170 217F Lower +2180 2182 OLetter +2183 Upper +2184 Lower +2185 2188 OLetter +2308 230B Close +2329 232A Close +24B6 24CF Upper +24D0 24E9 Lower +275B 2760 Close +2768 2775 Close +27C5 27C6 Close +27E6 27EF Close +2983 2998 Close +29D8 29DB Close +29FC 29FD Close +2C00 2C2E Upper +2C30 2C5E Lower +2C60 Upper +2C61 Lower +2C62 2C64 Upper +2C65 2C66 Lower +2C67 Upper +2C68 Lower +2C69 Upper +2C6A Lower +2C6B Upper +2C6C Lower +2C6D 2C70 Upper +2C71 Lower +2C72 Upper +2C73 2C74 Lower +2C75 Upper +2C76 2C7D Lower +2C7E 2C80 Upper +2C81 Lower +2C82 Upper +2C83 Lower +2C84 Upper +2C85 Lower +2C86 Upper +2C87 Lower +2C88 Upper +2C89 Lower +2C8A Upper +2C8B Lower +2C8C Upper +2C8D Lower +2C8E Upper +2C8F Lower +2C90 Upper +2C91 Lower +2C92 Upper +2C93 Lower +2C94 Upper +2C95 Lower +2C96 Upper +2C97 Lower +2C98 Upper +2C99 Lower +2C9A Upper +2C9B Lower +2C9C Upper +2C9D Lower +2C9E Upper +2C9F Lower +2CA0 Upper +2CA1 Lower +2CA2 Upper +2CA3 Lower +2CA4 Upper +2CA5 Lower +2CA6 Upper +2CA7 Lower +2CA8 Upper +2CA9 Lower +2CAA Upper +2CAB Lower +2CAC Upper +2CAD Lower +2CAE Upper +2CAF Lower +2CB0 Upper +2CB1 Lower +2CB2 Upper +2CB3 Lower +2CB4 Upper +2CB5 Lower +2CB6 Upper +2CB7 Lower +2CB8 Upper +2CB9 Lower +2CBA Upper +2CBB Lower +2CBC Upper +2CBD Lower +2CBE Upper +2CBF Lower +2CC0 Upper +2CC1 Lower +2CC2 Upper +2CC3 Lower +2CC4 Upper +2CC5 Lower +2CC6 Upper +2CC7 Lower +2CC8 Upper +2CC9 Lower +2CCA Upper +2CCB Lower +2CCC Upper +2CCD Lower +2CCE Upper +2CCF Lower +2CD0 Upper +2CD1 Lower +2CD2 Upper +2CD3 Lower +2CD4 Upper +2CD5 Lower +2CD6 Upper +2CD7 Lower +2CD8 Upper +2CD9 Lower +2CDA Upper +2CDB Lower +2CDC Upper +2CDD Lower +2CDE Upper +2CDF Lower +2CE0 Upper +2CE1 Lower +2CE2 Upper +2CE3 2CE4 Lower +2CEB Upper +2CEC Lower +2CED Upper +2CEE Lower +2CEF 2CF1 Extend +2CF2 Upper +2CF3 Lower +2D00 2D25 Lower +2D27 Lower +2D2D Lower +2D30 2D67 OLetter +2D6F OLetter +2D7F Extend +2D80 2D96 OLetter +2DA0 2DA6 OLetter +2DA8 2DAE OLetter +2DB0 2DB6 OLetter +2DB8 2DBE OLetter +2DC0 2DC6 OLetter +2DC8 2DCE OLetter +2DD0 2DD6 OLetter +2DD8 2DDE OLetter +2DE0 2DFF Extend +2E00 2E0D Close +2E1C 2E1D Close +2E20 2E29 Close +2E2E STerm +2E2F OLetter +2E3C STerm +2E42 Close +3000 Sp +3001 SContinue +3002 STerm +3005 3007 OLetter +3008 3011 Close +3014 301B Close +301D 301F Close +3021 3029 OLetter +302A 302F Extend +3031 3035 OLetter +3038 303C OLetter +3041 3096 OLetter +3099 309A Extend +309D 309F OLetter +30A1 30FA OLetter +30FC 30FF OLetter +3105 312E OLetter +3131 318E OLetter +31A0 31BA OLetter +31F0 31FF OLetter +3400 4DB5 OLetter +4E00 9FEA OLetter +A000 A48C OLetter +A4D0 A4FD OLetter +A4FF STerm +A500 A60C OLetter +A60E A60F STerm +A610 A61F OLetter +A620 A629 Numeric +A62A A62B OLetter +A640 Upper +A641 Lower +A642 Upper +A643 Lower +A644 Upper +A645 Lower +A646 Upper +A647 Lower +A648 Upper +A649 Lower +A64A Upper +A64B Lower +A64C Upper +A64D Lower +A64E Upper +A64F Lower +A650 Upper +A651 Lower +A652 Upper +A653 Lower +A654 Upper +A655 Lower +A656 Upper +A657 Lower +A658 Upper +A659 Lower +A65A Upper +A65B Lower +A65C Upper +A65D Lower +A65E Upper +A65F Lower +A660 Upper +A661 Lower +A662 Upper +A663 Lower +A664 Upper +A665 Lower +A666 Upper +A667 Lower +A668 Upper +A669 Lower +A66A Upper +A66B Lower +A66C Upper +A66D Lower +A66E OLetter +A66F A672 Extend +A674 A67D Extend +A67F OLetter +A680 Upper +A681 Lower +A682 Upper +A683 Lower +A684 Upper +A685 Lower +A686 Upper +A687 Lower +A688 Upper +A689 Lower +A68A Upper +A68B Lower +A68C Upper +A68D Lower +A68E Upper +A68F Lower +A690 Upper +A691 Lower +A692 Upper +A693 Lower +A694 Upper +A695 Lower +A696 Upper +A697 Lower +A698 Upper +A699 Lower +A69A Upper +A69B A69D Lower +A69E A69F Extend +A6A0 A6EF OLetter +A6F0 A6F1 Extend +A6F3 STerm +A6F7 STerm +A717 A71F OLetter +A722 Upper +A723 Lower +A724 Upper +A725 Lower +A726 Upper +A727 Lower +A728 Upper +A729 Lower +A72A Upper +A72B Lower +A72C Upper +A72D Lower +A72E Upper +A72F A731 Lower +A732 Upper +A733 Lower +A734 Upper +A735 Lower +A736 Upper +A737 Lower +A738 Upper +A739 Lower +A73A Upper +A73B Lower +A73C Upper +A73D Lower +A73E Upper +A73F Lower +A740 Upper +A741 Lower +A742 Upper +A743 Lower +A744 Upper +A745 Lower +A746 Upper +A747 Lower +A748 Upper +A749 Lower +A74A Upper +A74B Lower +A74C Upper +A74D Lower +A74E Upper +A74F Lower +A750 Upper +A751 Lower +A752 Upper +A753 Lower +A754 Upper +A755 Lower +A756 Upper +A757 Lower +A758 Upper +A759 Lower +A75A Upper +A75B Lower +A75C Upper +A75D Lower +A75E Upper +A75F Lower +A760 Upper +A761 Lower +A762 Upper +A763 Lower +A764 Upper +A765 Lower +A766 Upper +A767 Lower +A768 Upper +A769 Lower +A76A Upper +A76B Lower +A76C Upper +A76D Lower +A76E Upper +A76F A778 Lower +A779 Upper +A77A Lower +A77B Upper +A77C Lower +A77D A77E Upper +A77F Lower +A780 Upper +A781 Lower +A782 Upper +A783 Lower +A784 Upper +A785 Lower +A786 Upper +A787 Lower +A788 OLetter +A78B Upper +A78C Lower +A78D Upper +A78E Lower +A78F OLetter +A790 Upper +A791 Lower +A792 Upper +A793 A795 Lower +A796 Upper +A797 Lower +A798 Upper +A799 Lower +A79A Upper +A79B Lower +A79C Upper +A79D Lower +A79E Upper +A79F Lower +A7A0 Upper +A7A1 Lower +A7A2 Upper +A7A3 Lower +A7A4 Upper +A7A5 Lower +A7A6 Upper +A7A7 Lower +A7A8 Upper +A7A9 Lower +A7AA A7AE Upper +A7B0 A7B4 Upper +A7B5 Lower +A7B6 Upper +A7B7 Lower +A7F7 OLetter +A7F8 A7FA Lower +A7FB A801 OLetter +A802 Extend +A803 A805 OLetter +A806 Extend +A807 A80A OLetter +A80B Extend +A80C A822 OLetter +A823 A827 Extend +A840 A873 OLetter +A876 A877 STerm +A880 A881 Extend +A882 A8B3 OLetter +A8B4 A8C5 Extend +A8CE A8CF STerm +A8D0 A8D9 Numeric +A8E0 A8F1 Extend +A8F2 A8F7 OLetter +A8FB OLetter +A8FD OLetter +A900 A909 Numeric +A90A A925 OLetter +A926 A92D Extend +A92F STerm +A930 A946 OLetter +A947 A953 Extend +A960 A97C OLetter +A980 A983 Extend +A984 A9B2 OLetter +A9B3 A9C0 Extend +A9C8 A9C9 STerm +A9CF OLetter +A9D0 A9D9 Numeric +A9E0 A9E4 OLetter +A9E5 Extend +A9E6 A9EF OLetter +A9F0 A9F9 Numeric +A9FA A9FE OLetter +AA00 AA28 OLetter +AA29 AA36 Extend +AA40 AA42 OLetter +AA43 Extend +AA44 AA4B OLetter +AA4C AA4D Extend +AA50 AA59 Numeric +AA5D AA5F STerm +AA60 AA76 OLetter +AA7A OLetter +AA7B AA7D Extend +AA7E AAAF OLetter +AAB0 Extend +AAB1 OLetter +AAB2 AAB4 Extend +AAB5 AAB6 OLetter +AAB7 AAB8 Extend +AAB9 AABD OLetter +AABE AABF Extend +AAC0 OLetter +AAC1 Extend +AAC2 OLetter +AADB AADD OLetter +AAE0 AAEA OLetter +AAEB AAEF Extend +AAF0 AAF1 STerm +AAF2 AAF4 OLetter +AAF5 AAF6 Extend +AB01 AB06 OLetter +AB09 AB0E OLetter +AB11 AB16 OLetter +AB20 AB26 OLetter +AB28 AB2E OLetter +AB30 AB5A Lower +AB5C AB65 Lower +AB70 ABBF Lower +ABC0 ABE2 OLetter +ABE3 ABEA Extend +ABEB STerm +ABEC ABED Extend +ABF0 ABF9 Numeric +AC00 D7A3 OLetter +D7B0 D7C6 OLetter +D7CB D7FB OLetter +F900 FA6D OLetter +FA70 FAD9 OLetter +FB00 FB06 Lower +FB13 FB17 Lower +FB1D OLetter +FB1E Extend +FB1F FB28 OLetter +FB2A FB36 OLetter +FB38 FB3C OLetter +FB3E OLetter +FB40 FB41 OLetter +FB43 FB44 OLetter +FB46 FBB1 OLetter +FBD3 FD3D OLetter +FD3E FD3F Close +FD50 FD8F OLetter +FD92 FDC7 OLetter +FDF0 FDFB OLetter +FE00 FE0F Extend +FE10 FE11 SContinue +FE13 SContinue +FE17 FE18 Close +FE20 FE2F Extend +FE31 FE32 SContinue +FE35 FE44 Close +FE47 FE48 Close +FE50 FE51 SContinue +FE52 ATerm +FE55 SContinue +FE56 FE57 STerm +FE58 SContinue +FE59 FE5E Close +FE63 SContinue +FE70 FE74 OLetter +FE76 FEFC OLetter +FEFF Format +FF01 STerm +FF08 FF09 Close +FF0C FF0D SContinue +FF0E ATerm +FF1A SContinue +FF1F STerm +FF21 FF3A Upper +FF3B Close +FF3D Close +FF41 FF5A Lower +FF5B Close +FF5D Close +FF5F FF60 Close +FF61 STerm +FF62 FF63 Close +FF64 SContinue +FF66 FF9D OLetter +FF9E FF9F Extend +FFA0 FFBE OLetter +FFC2 FFC7 OLetter +FFCA FFCF OLetter +FFD2 FFD7 OLetter +FFDA FFDC OLetter +FFF9 FFFB Format +10000 1000B OLetter +1000D 10026 OLetter +10028 1003A OLetter +1003C 1003D OLetter +1003F 1004D OLetter +10050 1005D OLetter +10080 100FA OLetter +10140 10174 OLetter +101FD Extend +10280 1029C OLetter +102A0 102D0 OLetter +102E0 Extend +10300 1031F OLetter +1032D 1034A OLetter +10350 10375 OLetter +10376 1037A Extend +10380 1039D OLetter +103A0 103C3 OLetter +103C8 103CF OLetter +103D1 103D5 OLetter +10400 10427 Upper +10428 1044F Lower +10450 1049D OLetter +104A0 104A9 Numeric +104B0 104D3 Upper +104D8 104FB Lower +10500 10527 OLetter +10530 10563 OLetter +10600 10736 OLetter +10740 10755 OLetter +10760 10767 OLetter +10800 10805 OLetter +10808 OLetter +1080A 10835 OLetter +10837 10838 OLetter +1083C OLetter +1083F 10855 OLetter +10860 10876 OLetter +10880 1089E OLetter +108E0 108F2 OLetter +108F4 108F5 OLetter +10900 10915 OLetter +10920 10939 OLetter +10980 109B7 OLetter +109BE 109BF OLetter +10A00 OLetter +10A01 10A03 Extend +10A05 10A06 Extend +10A0C 10A0F Extend +10A10 10A13 OLetter +10A15 10A17 OLetter +10A19 10A33 OLetter +10A38 10A3A Extend +10A3F Extend +10A56 10A57 STerm +10A60 10A7C OLetter +10A80 10A9C OLetter +10AC0 10AC7 OLetter +10AC9 10AE4 OLetter +10AE5 10AE6 Extend +10B00 10B35 OLetter +10B40 10B55 OLetter +10B60 10B72 OLetter +10B80 10B91 OLetter +10C00 10C48 OLetter +10C80 10CB2 Upper +10CC0 10CF2 Lower +11000 11002 Extend +11003 11037 OLetter +11038 11046 Extend +11047 11048 STerm +11066 1106F Numeric +1107F 11082 Extend +11083 110AF OLetter +110B0 110BA Extend +110BD Format +110BE 110C1 STerm +110D0 110E8 OLetter +110F0 110F9 Numeric +11100 11102 Extend +11103 11126 OLetter +11127 11134 Extend +11136 1113F Numeric +11141 11143 STerm +11150 11172 OLetter +11173 Extend +11176 OLetter +11180 11182 Extend +11183 111B2 OLetter +111B3 111C0 Extend +111C1 111C4 OLetter +111C5 111C6 STerm +111CA 111CC Extend +111CD STerm +111D0 111D9 Numeric +111DA OLetter +111DC OLetter +111DE 111DF STerm +11200 11211 OLetter +11213 1122B OLetter +1122C 11237 Extend +11238 11239 STerm +1123B 1123C STerm +1123E Extend +11280 11286 OLetter +11288 OLetter +1128A 1128D OLetter +1128F 1129D OLetter +1129F 112A8 OLetter +112A9 STerm +112B0 112DE OLetter +112DF 112EA Extend +112F0 112F9 Numeric +11300 11303 Extend +11305 1130C OLetter +1130F 11310 OLetter +11313 11328 OLetter +1132A 11330 OLetter +11332 11333 OLetter +11335 11339 OLetter +1133C Extend +1133D OLetter +1133E 11344 Extend +11347 11348 Extend +1134B 1134D Extend +11350 OLetter +11357 Extend +1135D 11361 OLetter +11362 11363 Extend +11366 1136C Extend +11370 11374 Extend +11400 11434 OLetter +11435 11446 Extend +11447 1144A OLetter +1144B 1144C STerm +11450 11459 Numeric +11480 114AF OLetter +114B0 114C3 Extend +114C4 114C5 OLetter +114C7 OLetter +114D0 114D9 Numeric +11580 115AE OLetter +115AF 115B5 Extend +115B8 115C0 Extend +115C2 115C3 STerm +115C9 115D7 STerm +115D8 115DB OLetter +115DC 115DD Extend +11600 1162F OLetter +11630 11640 Extend +11641 11642 STerm +11644 OLetter +11650 11659 Numeric +11680 116AA OLetter +116AB 116B7 Extend +116C0 116C9 Numeric +11700 11719 OLetter +1171D 1172B Extend +11730 11739 Numeric +1173C 1173E STerm +118A0 118BF Upper +118C0 118DF Lower +118E0 118E9 Numeric +118FF OLetter +11A00 OLetter +11A01 11A0A Extend +11A0B 11A32 OLetter +11A33 11A39 Extend +11A3A OLetter +11A3B 11A3E Extend +11A42 11A43 STerm +11A47 Extend +11A50 OLetter +11A51 11A5B Extend +11A5C 11A83 OLetter +11A86 11A89 OLetter +11A8A 11A99 Extend +11A9B 11A9C STerm +11AC0 11AF8 OLetter +11C00 11C08 OLetter +11C0A 11C2E OLetter +11C2F 11C36 Extend +11C38 11C3F Extend +11C40 OLetter +11C41 11C42 STerm +11C50 11C59 Numeric +11C72 11C8F OLetter +11C92 11CA7 Extend +11CA9 11CB6 Extend +11D00 11D06 OLetter +11D08 11D09 OLetter +11D0B 11D30 OLetter +11D31 11D36 Extend +11D3A Extend +11D3C 11D3D Extend +11D3F 11D45 Extend +11D46 OLetter +11D47 Extend +11D50 11D59 Numeric +12000 12399 OLetter +12400 1246E OLetter +12480 12543 OLetter +13000 1342E OLetter +14400 14646 OLetter +16800 16A38 OLetter +16A40 16A5E OLetter +16A60 16A69 Numeric +16A6E 16A6F STerm +16AD0 16AED OLetter +16AF0 16AF4 Extend +16AF5 STerm +16B00 16B2F OLetter +16B30 16B36 Extend +16B37 16B38 STerm +16B40 16B43 OLetter +16B44 STerm +16B50 16B59 Numeric +16B63 16B77 OLetter +16B7D 16B8F OLetter +16F00 16F44 OLetter +16F50 OLetter +16F51 16F7E Extend +16F8F 16F92 Extend +16F93 16F9F OLetter +16FE0 16FE1 OLetter +17000 187EC OLetter +18800 18AF2 OLetter +1B000 1B11E OLetter +1B170 1B2FB OLetter +1BC00 1BC6A OLetter +1BC70 1BC7C OLetter +1BC80 1BC88 OLetter +1BC90 1BC99 OLetter +1BC9D 1BC9E Extend +1BC9F STerm +1BCA0 1BCA3 Format +1D165 1D169 Extend +1D16D 1D172 Extend +1D173 1D17A Format +1D17B 1D182 Extend +1D185 1D18B Extend +1D1AA 1D1AD Extend +1D242 1D244 Extend +1D400 1D419 Upper +1D41A 1D433 Lower +1D434 1D44D Upper +1D44E 1D454 Lower +1D456 1D467 Lower +1D468 1D481 Upper +1D482 1D49B Lower +1D49C Upper +1D49E 1D49F Upper +1D4A2 Upper +1D4A5 1D4A6 Upper +1D4A9 1D4AC Upper +1D4AE 1D4B5 Upper +1D4B6 1D4B9 Lower +1D4BB Lower +1D4BD 1D4C3 Lower +1D4C5 1D4CF Lower +1D4D0 1D4E9 Upper +1D4EA 1D503 Lower +1D504 1D505 Upper +1D507 1D50A Upper +1D50D 1D514 Upper +1D516 1D51C Upper +1D51E 1D537 Lower +1D538 1D539 Upper +1D53B 1D53E Upper +1D540 1D544 Upper +1D546 Upper +1D54A 1D550 Upper +1D552 1D56B Lower +1D56C 1D585 Upper +1D586 1D59F Lower +1D5A0 1D5B9 Upper +1D5BA 1D5D3 Lower +1D5D4 1D5ED Upper +1D5EE 1D607 Lower +1D608 1D621 Upper +1D622 1D63B Lower +1D63C 1D655 Upper +1D656 1D66F Lower +1D670 1D689 Upper +1D68A 1D6A5 Lower +1D6A8 1D6C0 Upper +1D6C2 1D6DA Lower +1D6DC 1D6E1 Lower +1D6E2 1D6FA Upper +1D6FC 1D714 Lower +1D716 1D71B Lower +1D71C 1D734 Upper +1D736 1D74E Lower +1D750 1D755 Lower +1D756 1D76E Upper +1D770 1D788 Lower +1D78A 1D78F Lower +1D790 1D7A8 Upper +1D7AA 1D7C2 Lower +1D7C4 1D7C9 Lower +1D7CA Upper +1D7CB Lower +1D7CE 1D7FF Numeric +1DA00 1DA36 Extend +1DA3B 1DA6C Extend +1DA75 Extend +1DA84 Extend +1DA88 STerm +1DA9B 1DA9F Extend +1DAA1 1DAAF Extend +1E000 1E006 Extend +1E008 1E018 Extend +1E01B 1E021 Extend +1E023 1E024 Extend +1E026 1E02A Extend +1E800 1E8C4 OLetter +1E8D0 1E8D6 Extend +1E900 1E921 Upper +1E922 1E943 Lower +1E944 1E94A Extend +1E950 1E959 Numeric +1EE00 1EE03 OLetter +1EE05 1EE1F OLetter +1EE21 1EE22 OLetter +1EE24 OLetter +1EE27 OLetter +1EE29 1EE32 OLetter +1EE34 1EE37 OLetter +1EE39 OLetter +1EE3B OLetter +1EE42 OLetter +1EE47 OLetter +1EE49 OLetter +1EE4B OLetter +1EE4D 1EE4F OLetter +1EE51 1EE52 OLetter +1EE54 OLetter +1EE57 OLetter +1EE59 OLetter +1EE5B OLetter +1EE5D OLetter +1EE5F OLetter +1EE61 1EE62 OLetter +1EE64 OLetter +1EE67 1EE6A OLetter +1EE6C 1EE72 OLetter +1EE74 1EE77 OLetter +1EE79 1EE7C OLetter +1EE7E OLetter +1EE80 1EE89 OLetter +1EE8B 1EE9B OLetter +1EEA1 1EEA3 OLetter +1EEA5 1EEA9 OLetter +1EEAB 1EEBB OLetter +1F130 1F149 Upper +1F150 1F169 Upper +1F170 1F189 Upper +1F676 1F678 Close +20000 2A6D6 OLetter +2A700 2B734 OLetter +2B740 2B81D OLetter +2B820 2CEA1 OLetter +2CEB0 2EBE0 OLetter +2F800 2FA1D OLetter +E0001 Format +E0020 E007F Extend +E0100 E01EF Extend +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('Uppercase_Mapping') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToUpper'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToUpper'}{'specials_name'} = 'utf8::ToSpecUpper'; # Name of hash of special mappings +$utf8::SwashInfo{'ToUpper'}{'missing'} = '<code point>'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecUpper = ( +"\xC3\x9F" => "\x{0053}\x{0053}", # U+00DF => 0053 0053 +"\xC5\x89" => "\x{02BC}\x{004E}", # U+0149 => 02BC 004E +"\xC7\xB0" => "\x{004A}\x{030C}", # U+01F0 => 004A 030C +"\xCE\x90" => "\x{0399}\x{0308}\x{0301}", # U+0390 => 0399 0308 0301 +"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}", # U+03B0 => 03A5 0308 0301 +"\xD6\x87" => "\x{0535}\x{0552}", # U+0587 => 0535 0552 +"\xE1\xBA\x96" => "\x{0048}\x{0331}", # U+1E96 => 0048 0331 +"\xE1\xBA\x97" => "\x{0054}\x{0308}", # U+1E97 => 0054 0308 +"\xE1\xBA\x98" => "\x{0057}\x{030A}", # U+1E98 => 0057 030A +"\xE1\xBA\x99" => "\x{0059}\x{030A}", # U+1E99 => 0059 030A +"\xE1\xBA\x9A" => "\x{0041}\x{02BE}", # U+1E9A => 0041 02BE +"\xE1\xBD\x90" => "\x{03A5}\x{0313}", # U+1F50 => 03A5 0313 +"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}", # U+1F52 => 03A5 0313 0300 +"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}", # U+1F54 => 03A5 0313 0301 +"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}", # U+1F56 => 03A5 0313 0342 +"\xE1\xBE\x80" => "\x{1F08}\x{0399}", # U+1F80 => 1F08 0399 +"\xE1\xBE\x81" => "\x{1F09}\x{0399}", # U+1F81 => 1F09 0399 +"\xE1\xBE\x82" => "\x{1F0A}\x{0399}", # U+1F82 => 1F0A 0399 +"\xE1\xBE\x83" => "\x{1F0B}\x{0399}", # U+1F83 => 1F0B 0399 +"\xE1\xBE\x84" => "\x{1F0C}\x{0399}", # U+1F84 => 1F0C 0399 +"\xE1\xBE\x85" => "\x{1F0D}\x{0399}", # U+1F85 => 1F0D 0399 +"\xE1\xBE\x86" => "\x{1F0E}\x{0399}", # U+1F86 => 1F0E 0399 +"\xE1\xBE\x87" => "\x{1F0F}\x{0399}", # U+1F87 => 1F0F 0399 +"\xE1\xBE\x88" => "\x{1F08}\x{0399}", # U+1F88 => 1F08 0399 +"\xE1\xBE\x89" => "\x{1F09}\x{0399}", # U+1F89 => 1F09 0399 +"\xE1\xBE\x8A" => "\x{1F0A}\x{0399}", # U+1F8A => 1F0A 0399 +"\xE1\xBE\x8B" => "\x{1F0B}\x{0399}", # U+1F8B => 1F0B 0399 +"\xE1\xBE\x8C" => "\x{1F0C}\x{0399}", # U+1F8C => 1F0C 0399 +"\xE1\xBE\x8D" => "\x{1F0D}\x{0399}", # U+1F8D => 1F0D 0399 +"\xE1\xBE\x8E" => "\x{1F0E}\x{0399}", # U+1F8E => 1F0E 0399 +"\xE1\xBE\x8F" => "\x{1F0F}\x{0399}", # U+1F8F => 1F0F 0399 +"\xE1\xBE\x90" => "\x{1F28}\x{0399}", # U+1F90 => 1F28 0399 +"\xE1\xBE\x91" => "\x{1F29}\x{0399}", # U+1F91 => 1F29 0399 +"\xE1\xBE\x92" => "\x{1F2A}\x{0399}", # U+1F92 => 1F2A 0399 +"\xE1\xBE\x93" => "\x{1F2B}\x{0399}", # U+1F93 => 1F2B 0399 +"\xE1\xBE\x94" => "\x{1F2C}\x{0399}", # U+1F94 => 1F2C 0399 +"\xE1\xBE\x95" => "\x{1F2D}\x{0399}", # U+1F95 => 1F2D 0399 +"\xE1\xBE\x96" => "\x{1F2E}\x{0399}", # U+1F96 => 1F2E 0399 +"\xE1\xBE\x97" => "\x{1F2F}\x{0399}", # U+1F97 => 1F2F 0399 +"\xE1\xBE\x98" => "\x{1F28}\x{0399}", # U+1F98 => 1F28 0399 +"\xE1\xBE\x99" => "\x{1F29}\x{0399}", # U+1F99 => 1F29 0399 +"\xE1\xBE\x9A" => "\x{1F2A}\x{0399}", # U+1F9A => 1F2A 0399 +"\xE1\xBE\x9B" => "\x{1F2B}\x{0399}", # U+1F9B => 1F2B 0399 +"\xE1\xBE\x9C" => "\x{1F2C}\x{0399}", # U+1F9C => 1F2C 0399 +"\xE1\xBE\x9D" => "\x{1F2D}\x{0399}", # U+1F9D => 1F2D 0399 +"\xE1\xBE\x9E" => "\x{1F2E}\x{0399}", # U+1F9E => 1F2E 0399 +"\xE1\xBE\x9F" => "\x{1F2F}\x{0399}", # U+1F9F => 1F2F 0399 +"\xE1\xBE\xA0" => "\x{1F68}\x{0399}", # U+1FA0 => 1F68 0399 +"\xE1\xBE\xA1" => "\x{1F69}\x{0399}", # U+1FA1 => 1F69 0399 +"\xE1\xBE\xA2" => "\x{1F6A}\x{0399}", # U+1FA2 => 1F6A 0399 +"\xE1\xBE\xA3" => "\x{1F6B}\x{0399}", # U+1FA3 => 1F6B 0399 +"\xE1\xBE\xA4" => "\x{1F6C}\x{0399}", # U+1FA4 => 1F6C 0399 +"\xE1\xBE\xA5" => "\x{1F6D}\x{0399}", # U+1FA5 => 1F6D 0399 +"\xE1\xBE\xA6" => "\x{1F6E}\x{0399}", # U+1FA6 => 1F6E 0399 +"\xE1\xBE\xA7" => "\x{1F6F}\x{0399}", # U+1FA7 => 1F6F 0399 +"\xE1\xBE\xA8" => "\x{1F68}\x{0399}", # U+1FA8 => 1F68 0399 +"\xE1\xBE\xA9" => "\x{1F69}\x{0399}", # U+1FA9 => 1F69 0399 +"\xE1\xBE\xAA" => "\x{1F6A}\x{0399}", # U+1FAA => 1F6A 0399 +"\xE1\xBE\xAB" => "\x{1F6B}\x{0399}", # U+1FAB => 1F6B 0399 +"\xE1\xBE\xAC" => "\x{1F6C}\x{0399}", # U+1FAC => 1F6C 0399 +"\xE1\xBE\xAD" => "\x{1F6D}\x{0399}", # U+1FAD => 1F6D 0399 +"\xE1\xBE\xAE" => "\x{1F6E}\x{0399}", # U+1FAE => 1F6E 0399 +"\xE1\xBE\xAF" => "\x{1F6F}\x{0399}", # U+1FAF => 1F6F 0399 +"\xE1\xBE\xB2" => "\x{1FBA}\x{0399}", # U+1FB2 => 1FBA 0399 +"\xE1\xBE\xB3" => "\x{0391}\x{0399}", # U+1FB3 => 0391 0399 +"\xE1\xBE\xB4" => "\x{0386}\x{0399}", # U+1FB4 => 0386 0399 +"\xE1\xBE\xB6" => "\x{0391}\x{0342}", # U+1FB6 => 0391 0342 +"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0399}", # U+1FB7 => 0391 0342 0399 +"\xE1\xBE\xBC" => "\x{0391}\x{0399}", # U+1FBC => 0391 0399 +"\xE1\xBF\x82" => "\x{1FCA}\x{0399}", # U+1FC2 => 1FCA 0399 +"\xE1\xBF\x83" => "\x{0397}\x{0399}", # U+1FC3 => 0397 0399 +"\xE1\xBF\x84" => "\x{0389}\x{0399}", # U+1FC4 => 0389 0399 +"\xE1\xBF\x86" => "\x{0397}\x{0342}", # U+1FC6 => 0397 0342 +"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0399}", # U+1FC7 => 0397 0342 0399 +"\xE1\xBF\x8C" => "\x{0397}\x{0399}", # U+1FCC => 0397 0399 +"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}", # U+1FD2 => 0399 0308 0300 +"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}", # U+1FD3 => 0399 0308 0301 +"\xE1\xBF\x96" => "\x{0399}\x{0342}", # U+1FD6 => 0399 0342 +"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}", # U+1FD7 => 0399 0308 0342 +"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}", # U+1FE2 => 03A5 0308 0300 +"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}", # U+1FE3 => 03A5 0308 0301 +"\xE1\xBF\xA4" => "\x{03A1}\x{0313}", # U+1FE4 => 03A1 0313 +"\xE1\xBF\xA6" => "\x{03A5}\x{0342}", # U+1FE6 => 03A5 0342 +"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}", # U+1FE7 => 03A5 0308 0342 +"\xE1\xBF\xB2" => "\x{1FFA}\x{0399}", # U+1FF2 => 1FFA 0399 +"\xE1\xBF\xB3" => "\x{03A9}\x{0399}", # U+1FF3 => 03A9 0399 +"\xE1\xBF\xB4" => "\x{038F}\x{0399}", # U+1FF4 => 038F 0399 +"\xE1\xBF\xB6" => "\x{03A9}\x{0342}", # U+1FF6 => 03A9 0342 +"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0399}", # U+1FF7 => 03A9 0342 0399 +"\xE1\xBF\xBC" => "\x{03A9}\x{0399}", # U+1FFC => 03A9 0399 +"\xEF\xAC\x80" => "\x{0046}\x{0046}", # U+FB00 => 0046 0046 +"\xEF\xAC\x81" => "\x{0046}\x{0049}", # U+FB01 => 0046 0049 +"\xEF\xAC\x82" => "\x{0046}\x{004C}", # U+FB02 => 0046 004C +"\xEF\xAC\x83" => "\x{0046}\x{0046}\x{0049}", # U+FB03 => 0046 0046 0049 +"\xEF\xAC\x84" => "\x{0046}\x{0046}\x{004C}", # U+FB04 => 0046 0046 004C +"\xEF\xAC\x85" => "\x{0053}\x{0054}", # U+FB05 => 0053 0054 +"\xEF\xAC\x86" => "\x{0053}\x{0054}", # U+FB06 => 0053 0054 +"\xEF\xAC\x93" => "\x{0544}\x{0546}", # U+FB13 => 0544 0546 +"\xEF\xAC\x94" => "\x{0544}\x{0535}", # U+FB14 => 0544 0535 +"\xEF\xAC\x95" => "\x{0544}\x{053B}", # U+FB15 => 0544 053B +"\xEF\xAC\x96" => "\x{054E}\x{0546}", # U+FB16 => 054E 0546 +"\xEF\xAC\x97" => "\x{0544}\x{053D}", # U+FB17 => 0544 053D +); + +return <<'END'; +0061 0041 +0062 0042 +0063 0043 +0064 0044 +0065 0045 +0066 0046 +0067 0047 +0068 0048 +0069 0049 +006A 004A +006B 004B +006C 004C +006D 004D +006E 004E +006F 004F +0070 0050 +0071 0051 +0072 0052 +0073 0053 +0074 0054 +0075 0055 +0076 0056 +0077 0057 +0078 0058 +0079 0059 +007A 005A +00B5 039C +00E0 00C0 +00E1 00C1 +00E2 00C2 +00E3 00C3 +00E4 00C4 +00E5 00C5 +00E6 00C6 +00E7 00C7 +00E8 00C8 +00E9 00C9 +00EA 00CA +00EB 00CB +00EC 00CC +00ED 00CD +00EE 00CE +00EF 00CF +00F0 00D0 +00F1 00D1 +00F2 00D2 +00F3 00D3 +00F4 00D4 +00F5 00D5 +00F6 00D6 +00F8 00D8 +00F9 00D9 +00FA 00DA +00FB 00DB +00FC 00DC +00FD 00DD +00FE 00DE +00FF 0178 +0101 0100 +0103 0102 +0105 0104 +0107 0106 +0109 0108 +010B 010A +010D 010C +010F 010E +0111 0110 +0113 0112 +0115 0114 +0117 0116 +0119 0118 +011B 011A +011D 011C +011F 011E +0121 0120 +0123 0122 +0125 0124 +0127 0126 +0129 0128 +012B 012A +012D 012C +012F 012E +0131 0049 +0133 0132 +0135 0134 +0137 0136 +013A 0139 +013C 013B +013E 013D +0140 013F +0142 0141 +0144 0143 +0146 0145 +0148 0147 +014B 014A +014D 014C +014F 014E +0151 0150 +0153 0152 +0155 0154 +0157 0156 +0159 0158 +015B 015A +015D 015C +015F 015E +0161 0160 +0163 0162 +0165 0164 +0167 0166 +0169 0168 +016B 016A +016D 016C +016F 016E +0171 0170 +0173 0172 +0175 0174 +0177 0176 +017A 0179 +017C 017B +017E 017D +017F 0053 +0180 0243 +0183 0182 +0185 0184 +0188 0187 +018C 018B +0192 0191 +0195 01F6 +0199 0198 +019A 023D +019E 0220 +01A1 01A0 +01A3 01A2 +01A5 01A4 +01A8 01A7 +01AD 01AC +01B0 01AF +01B4 01B3 +01B6 01B5 +01B9 01B8 +01BD 01BC +01BF 01F7 +01C5 01C4 +01C6 01C4 +01C8 01C7 +01C9 01C7 +01CB 01CA +01CC 01CA +01CE 01CD +01D0 01CF +01D2 01D1 +01D4 01D3 +01D6 01D5 +01D8 01D7 +01DA 01D9 +01DC 01DB +01DD 018E +01DF 01DE +01E1 01E0 +01E3 01E2 +01E5 01E4 +01E7 01E6 +01E9 01E8 +01EB 01EA +01ED 01EC +01EF 01EE +01F2 01F1 +01F3 01F1 +01F5 01F4 +01F9 01F8 +01FB 01FA +01FD 01FC +01FF 01FE +0201 0200 +0203 0202 +0205 0204 +0207 0206 +0209 0208 +020B 020A +020D 020C +020F 020E +0211 0210 +0213 0212 +0215 0214 +0217 0216 +0219 0218 +021B 021A +021D 021C +021F 021E +0223 0222 +0225 0224 +0227 0226 +0229 0228 +022B 022A +022D 022C +022F 022E +0231 0230 +0233 0232 +023C 023B +023F 2C7E +0240 2C7F +0242 0241 +0247 0246 +0249 0248 +024B 024A +024D 024C +024F 024E +0250 2C6F +0251 2C6D +0252 2C70 +0253 0181 +0254 0186 +0256 0189 +0257 018A +0259 018F +025B 0190 +025C A7AB +0260 0193 +0261 A7AC +0263 0194 +0265 A78D +0266 A7AA +0268 0197 +0269 0196 +026A A7AE +026B 2C62 +026C A7AD +026F 019C +0271 2C6E +0272 019D +0275 019F +027D 2C64 +0280 01A6 +0283 01A9 +0287 A7B1 +0288 01AE +0289 0244 +028A 01B1 +028B 01B2 +028C 0245 +0292 01B7 +029D A7B2 +029E A7B0 +0345 0399 +0371 0370 +0373 0372 +0377 0376 +037B 03FD +037C 03FE +037D 03FF +03AC 0386 +03AD 0388 +03AE 0389 +03AF 038A +03B1 0391 +03B2 0392 +03B3 0393 +03B4 0394 +03B5 0395 +03B6 0396 +03B7 0397 +03B8 0398 +03B9 0399 +03BA 039A +03BB 039B +03BC 039C +03BD 039D +03BE 039E +03BF 039F +03C0 03A0 +03C1 03A1 +03C2 03A3 +03C3 03A3 +03C4 03A4 +03C5 03A5 +03C6 03A6 +03C7 03A7 +03C8 03A8 +03C9 03A9 +03CA 03AA +03CB 03AB +03CC 038C +03CD 038E +03CE 038F +03D0 0392 +03D1 0398 +03D5 03A6 +03D6 03A0 +03D7 03CF +03D9 03D8 +03DB 03DA +03DD 03DC +03DF 03DE +03E1 03E0 +03E3 03E2 +03E5 03E4 +03E7 03E6 +03E9 03E8 +03EB 03EA +03ED 03EC +03EF 03EE +03F0 039A +03F1 03A1 +03F2 03F9 +03F3 037F +03F5 0395 +03F8 03F7 +03FB 03FA +0430 0410 +0431 0411 +0432 0412 +0433 0413 +0434 0414 +0435 0415 +0436 0416 +0437 0417 +0438 0418 +0439 0419 +043A 041A +043B 041B +043C 041C +043D 041D +043E 041E +043F 041F +0440 0420 +0441 0421 +0442 0422 +0443 0423 +0444 0424 +0445 0425 +0446 0426 +0447 0427 +0448 0428 +0449 0429 +044A 042A +044B 042B +044C 042C +044D 042D +044E 042E +044F 042F +0450 0400 +0451 0401 +0452 0402 +0453 0403 +0454 0404 +0455 0405 +0456 0406 +0457 0407 +0458 0408 +0459 0409 +045A 040A +045B 040B +045C 040C +045D 040D +045E 040E +045F 040F +0461 0460 +0463 0462 +0465 0464 +0467 0466 +0469 0468 +046B 046A +046D 046C +046F 046E +0471 0470 +0473 0472 +0475 0474 +0477 0476 +0479 0478 +047B 047A +047D 047C +047F 047E +0481 0480 +048B 048A +048D 048C +048F 048E +0491 0490 +0493 0492 +0495 0494 +0497 0496 +0499 0498 +049B 049A +049D 049C +049F 049E +04A1 04A0 +04A3 04A2 +04A5 04A4 +04A7 04A6 +04A9 04A8 +04AB 04AA +04AD 04AC +04AF 04AE +04B1 04B0 +04B3 04B2 +04B5 04B4 +04B7 04B6 +04B9 04B8 +04BB 04BA +04BD 04BC +04BF 04BE +04C2 04C1 +04C4 04C3 +04C6 04C5 +04C8 04C7 +04CA 04C9 +04CC 04CB +04CE 04CD +04CF 04C0 +04D1 04D0 +04D3 04D2 +04D5 04D4 +04D7 04D6 +04D9 04D8 +04DB 04DA +04DD 04DC +04DF 04DE +04E1 04E0 +04E3 04E2 +04E5 04E4 +04E7 04E6 +04E9 04E8 +04EB 04EA +04ED 04EC +04EF 04EE +04F1 04F0 +04F3 04F2 +04F5 04F4 +04F7 04F6 +04F9 04F8 +04FB 04FA +04FD 04FC +04FF 04FE +0501 0500 +0503 0502 +0505 0504 +0507 0506 +0509 0508 +050B 050A +050D 050C +050F 050E +0511 0510 +0513 0512 +0515 0514 +0517 0516 +0519 0518 +051B 051A +051D 051C +051F 051E +0521 0520 +0523 0522 +0525 0524 +0527 0526 +0529 0528 +052B 052A +052D 052C +052F 052E +0561 0531 +0562 0532 +0563 0533 +0564 0534 +0565 0535 +0566 0536 +0567 0537 +0568 0538 +0569 0539 +056A 053A +056B 053B +056C 053C +056D 053D +056E 053E +056F 053F +0570 0540 +0571 0541 +0572 0542 +0573 0543 +0574 0544 +0575 0545 +0576 0546 +0577 0547 +0578 0548 +0579 0549 +057A 054A +057B 054B +057C 054C +057D 054D +057E 054E +057F 054F +0580 0550 +0581 0551 +0582 0552 +0583 0553 +0584 0554 +0585 0555 +0586 0556 +13F8 13F0 +13F9 13F1 +13FA 13F2 +13FB 13F3 +13FC 13F4 +13FD 13F5 +1C80 0412 +1C81 0414 +1C82 041E +1C83 0421 +1C84 0422 +1C85 0422 +1C86 042A +1C87 0462 +1C88 A64A +1D79 A77D +1D7D 2C63 +1E01 1E00 +1E03 1E02 +1E05 1E04 +1E07 1E06 +1E09 1E08 +1E0B 1E0A +1E0D 1E0C +1E0F 1E0E +1E11 1E10 +1E13 1E12 +1E15 1E14 +1E17 1E16 +1E19 1E18 +1E1B 1E1A +1E1D 1E1C +1E1F 1E1E +1E21 1E20 +1E23 1E22 +1E25 1E24 +1E27 1E26 +1E29 1E28 +1E2B 1E2A +1E2D 1E2C +1E2F 1E2E +1E31 1E30 +1E33 1E32 +1E35 1E34 +1E37 1E36 +1E39 1E38 +1E3B 1E3A +1E3D 1E3C +1E3F 1E3E +1E41 1E40 +1E43 1E42 +1E45 1E44 +1E47 1E46 +1E49 1E48 +1E4B 1E4A +1E4D 1E4C +1E4F 1E4E +1E51 1E50 +1E53 1E52 +1E55 1E54 +1E57 1E56 +1E59 1E58 +1E5B 1E5A +1E5D 1E5C +1E5F 1E5E +1E61 1E60 +1E63 1E62 +1E65 1E64 +1E67 1E66 +1E69 1E68 +1E6B 1E6A +1E6D 1E6C +1E6F 1E6E +1E71 1E70 +1E73 1E72 +1E75 1E74 +1E77 1E76 +1E79 1E78 +1E7B 1E7A +1E7D 1E7C +1E7F 1E7E +1E81 1E80 +1E83 1E82 +1E85 1E84 +1E87 1E86 +1E89 1E88 +1E8B 1E8A +1E8D 1E8C +1E8F 1E8E +1E91 1E90 +1E93 1E92 +1E95 1E94 +1E9B 1E60 +1EA1 1EA0 +1EA3 1EA2 +1EA5 1EA4 +1EA7 1EA6 +1EA9 1EA8 +1EAB 1EAA +1EAD 1EAC +1EAF 1EAE +1EB1 1EB0 +1EB3 1EB2 +1EB5 1EB4 +1EB7 1EB6 +1EB9 1EB8 +1EBB 1EBA +1EBD 1EBC +1EBF 1EBE +1EC1 1EC0 +1EC3 1EC2 +1EC5 1EC4 +1EC7 1EC6 +1EC9 1EC8 +1ECB 1ECA +1ECD 1ECC +1ECF 1ECE +1ED1 1ED0 +1ED3 1ED2 +1ED5 1ED4 +1ED7 1ED6 +1ED9 1ED8 +1EDB 1EDA +1EDD 1EDC +1EDF 1EDE +1EE1 1EE0 +1EE3 1EE2 +1EE5 1EE4 +1EE7 1EE6 +1EE9 1EE8 +1EEB 1EEA +1EED 1EEC +1EEF 1EEE +1EF1 1EF0 +1EF3 1EF2 +1EF5 1EF4 +1EF7 1EF6 +1EF9 1EF8 +1EFB 1EFA +1EFD 1EFC +1EFF 1EFE +1F00 1F08 +1F01 1F09 +1F02 1F0A +1F03 1F0B +1F04 1F0C +1F05 1F0D +1F06 1F0E +1F07 1F0F +1F10 1F18 +1F11 1F19 +1F12 1F1A +1F13 1F1B +1F14 1F1C +1F15 1F1D +1F20 1F28 +1F21 1F29 +1F22 1F2A +1F23 1F2B +1F24 1F2C +1F25 1F2D +1F26 1F2E +1F27 1F2F +1F30 1F38 +1F31 1F39 +1F32 1F3A +1F33 1F3B +1F34 1F3C +1F35 1F3D +1F36 1F3E +1F37 1F3F +1F40 1F48 +1F41 1F49 +1F42 1F4A +1F43 1F4B +1F44 1F4C +1F45 1F4D +1F51 1F59 +1F53 1F5B +1F55 1F5D +1F57 1F5F +1F60 1F68 +1F61 1F69 +1F62 1F6A +1F63 1F6B +1F64 1F6C +1F65 1F6D +1F66 1F6E +1F67 1F6F +1F70 1FBA +1F71 1FBB +1F72 1FC8 +1F73 1FC9 +1F74 1FCA +1F75 1FCB +1F76 1FDA +1F77 1FDB +1F78 1FF8 +1F79 1FF9 +1F7A 1FEA +1F7B 1FEB +1F7C 1FFA +1F7D 1FFB +1FB0 1FB8 +1FB1 1FB9 +1FBE 0399 +1FD0 1FD8 +1FD1 1FD9 +1FE0 1FE8 +1FE1 1FE9 +1FE5 1FEC +214E 2132 +2170 2160 +2171 2161 +2172 2162 +2173 2163 +2174 2164 +2175 2165 +2176 2166 +2177 2167 +2178 2168 +2179 2169 +217A 216A +217B 216B +217C 216C +217D 216D +217E 216E +217F 216F +2184 2183 +24D0 24B6 +24D1 24B7 +24D2 24B8 +24D3 24B9 +24D4 24BA +24D5 24BB +24D6 24BC +24D7 24BD +24D8 24BE +24D9 24BF +24DA 24C0 +24DB 24C1 +24DC 24C2 +24DD 24C3 +24DE 24C4 +24DF 24C5 +24E0 24C6 +24E1 24C7 +24E2 24C8 +24E3 24C9 +24E4 24CA +24E5 24CB +24E6 24CC +24E7 24CD +24E8 24CE +24E9 24CF +2C30 2C00 +2C31 2C01 +2C32 2C02 +2C33 2C03 +2C34 2C04 +2C35 2C05 +2C36 2C06 +2C37 2C07 +2C38 2C08 +2C39 2C09 +2C3A 2C0A +2C3B 2C0B +2C3C 2C0C +2C3D 2C0D +2C3E 2C0E +2C3F 2C0F +2C40 2C10 +2C41 2C11 +2C42 2C12 +2C43 2C13 +2C44 2C14 +2C45 2C15 +2C46 2C16 +2C47 2C17 +2C48 2C18 +2C49 2C19 +2C4A 2C1A +2C4B 2C1B +2C4C 2C1C +2C4D 2C1D +2C4E 2C1E +2C4F 2C1F +2C50 2C20 +2C51 2C21 +2C52 2C22 +2C53 2C23 +2C54 2C24 +2C55 2C25 +2C56 2C26 +2C57 2C27 +2C58 2C28 +2C59 2C29 +2C5A 2C2A +2C5B 2C2B +2C5C 2C2C +2C5D 2C2D +2C5E 2C2E +2C61 2C60 +2C65 023A +2C66 023E +2C68 2C67 +2C6A 2C69 +2C6C 2C6B +2C73 2C72 +2C76 2C75 +2C81 2C80 +2C83 2C82 +2C85 2C84 +2C87 2C86 +2C89 2C88 +2C8B 2C8A +2C8D 2C8C +2C8F 2C8E +2C91 2C90 +2C93 2C92 +2C95 2C94 +2C97 2C96 +2C99 2C98 +2C9B 2C9A +2C9D 2C9C +2C9F 2C9E +2CA1 2CA0 +2CA3 2CA2 +2CA5 2CA4 +2CA7 2CA6 +2CA9 2CA8 +2CAB 2CAA +2CAD 2CAC +2CAF 2CAE +2CB1 2CB0 +2CB3 2CB2 +2CB5 2CB4 +2CB7 2CB6 +2CB9 2CB8 +2CBB 2CBA +2CBD 2CBC +2CBF 2CBE +2CC1 2CC0 +2CC3 2CC2 +2CC5 2CC4 +2CC7 2CC6 +2CC9 2CC8 +2CCB 2CCA +2CCD 2CCC +2CCF 2CCE +2CD1 2CD0 +2CD3 2CD2 +2CD5 2CD4 +2CD7 2CD6 +2CD9 2CD8 +2CDB 2CDA +2CDD 2CDC +2CDF 2CDE +2CE1 2CE0 +2CE3 2CE2 +2CEC 2CEB +2CEE 2CED +2CF3 2CF2 +2D00 10A0 +2D01 10A1 +2D02 10A2 +2D03 10A3 +2D04 10A4 +2D05 10A5 +2D06 10A6 +2D07 10A7 +2D08 10A8 +2D09 10A9 +2D0A 10AA +2D0B 10AB +2D0C 10AC +2D0D 10AD +2D0E 10AE +2D0F 10AF +2D10 10B0 +2D11 10B1 +2D12 10B2 +2D13 10B3 +2D14 10B4 +2D15 10B5 +2D16 10B6 +2D17 10B7 +2D18 10B8 +2D19 10B9 +2D1A 10BA +2D1B 10BB +2D1C 10BC +2D1D 10BD +2D1E 10BE +2D1F 10BF +2D20 10C0 +2D21 10C1 +2D22 10C2 +2D23 10C3 +2D24 10C4 +2D25 10C5 +2D27 10C7 +2D2D 10CD +A641 A640 +A643 A642 +A645 A644 +A647 A646 +A649 A648 +A64B A64A +A64D A64C +A64F A64E +A651 A650 +A653 A652 +A655 A654 +A657 A656 +A659 A658 +A65B A65A +A65D A65C +A65F A65E +A661 A660 +A663 A662 +A665 A664 +A667 A666 +A669 A668 +A66B A66A +A66D A66C +A681 A680 +A683 A682 +A685 A684 +A687 A686 +A689 A688 +A68B A68A +A68D A68C +A68F A68E +A691 A690 +A693 A692 +A695 A694 +A697 A696 +A699 A698 +A69B A69A +A723 A722 +A725 A724 +A727 A726 +A729 A728 +A72B A72A +A72D A72C +A72F A72E +A733 A732 +A735 A734 +A737 A736 +A739 A738 +A73B A73A +A73D A73C +A73F A73E +A741 A740 +A743 A742 +A745 A744 +A747 A746 +A749 A748 +A74B A74A +A74D A74C +A74F A74E +A751 A750 +A753 A752 +A755 A754 +A757 A756 +A759 A758 +A75B A75A +A75D A75C +A75F A75E +A761 A760 +A763 A762 +A765 A764 +A767 A766 +A769 A768 +A76B A76A +A76D A76C +A76F A76E +A77A A779 +A77C A77B +A77F A77E +A781 A780 +A783 A782 +A785 A784 +A787 A786 +A78C A78B +A791 A790 +A793 A792 +A797 A796 +A799 A798 +A79B A79A +A79D A79C +A79F A79E +A7A1 A7A0 +A7A3 A7A2 +A7A5 A7A4 +A7A7 A7A6 +A7A9 A7A8 +A7B5 A7B4 +A7B7 A7B6 +AB53 A7B3 +AB70 13A0 +AB71 13A1 +AB72 13A2 +AB73 13A3 +AB74 13A4 +AB75 13A5 +AB76 13A6 +AB77 13A7 +AB78 13A8 +AB79 13A9 +AB7A 13AA +AB7B 13AB +AB7C 13AC +AB7D 13AD +AB7E 13AE +AB7F 13AF +AB80 13B0 +AB81 13B1 +AB82 13B2 +AB83 13B3 +AB84 13B4 +AB85 13B5 +AB86 13B6 +AB87 13B7 +AB88 13B8 +AB89 13B9 +AB8A 13BA +AB8B 13BB +AB8C 13BC +AB8D 13BD +AB8E 13BE +AB8F 13BF +AB90 13C0 +AB91 13C1 +AB92 13C2 +AB93 13C3 +AB94 13C4 +AB95 13C5 +AB96 13C6 +AB97 13C7 +AB98 13C8 +AB99 13C9 +AB9A 13CA +AB9B 13CB +AB9C 13CC +AB9D 13CD +AB9E 13CE +AB9F 13CF +ABA0 13D0 +ABA1 13D1 +ABA2 13D2 +ABA3 13D3 +ABA4 13D4 +ABA5 13D5 +ABA6 13D6 +ABA7 13D7 +ABA8 13D8 +ABA9 13D9 +ABAA 13DA +ABAB 13DB +ABAC 13DC +ABAD 13DD +ABAE 13DE +ABAF 13DF +ABB0 13E0 +ABB1 13E1 +ABB2 13E2 +ABB3 13E3 +ABB4 13E4 +ABB5 13E5 +ABB6 13E6 +ABB7 13E7 +ABB8 13E8 +ABB9 13E9 +ABBA 13EA +ABBB 13EB +ABBC 13EC +ABBD 13ED +ABBE 13EE +ABBF 13EF +FF41 FF21 +FF42 FF22 +FF43 FF23 +FF44 FF24 +FF45 FF25 +FF46 FF26 +FF47 FF27 +FF48 FF28 +FF49 FF29 +FF4A FF2A +FF4B FF2B +FF4C FF2C +FF4D FF2D +FF4E FF2E +FF4F FF2F +FF50 FF30 +FF51 FF31 +FF52 FF32 +FF53 FF33 +FF54 FF34 +FF55 FF35 +FF56 FF36 +FF57 FF37 +FF58 FF38 +FF59 FF39 +FF5A FF3A +10428 10400 +10429 10401 +1042A 10402 +1042B 10403 +1042C 10404 +1042D 10405 +1042E 10406 +1042F 10407 +10430 10408 +10431 10409 +10432 1040A +10433 1040B +10434 1040C +10435 1040D +10436 1040E +10437 1040F +10438 10410 +10439 10411 +1043A 10412 +1043B 10413 +1043C 10414 +1043D 10415 +1043E 10416 +1043F 10417 +10440 10418 +10441 10419 +10442 1041A +10443 1041B +10444 1041C +10445 1041D +10446 1041E +10447 1041F +10448 10420 +10449 10421 +1044A 10422 +1044B 10423 +1044C 10424 +1044D 10425 +1044E 10426 +1044F 10427 +104D8 104B0 +104D9 104B1 +104DA 104B2 +104DB 104B3 +104DC 104B4 +104DD 104B5 +104DE 104B6 +104DF 104B7 +104E0 104B8 +104E1 104B9 +104E2 104BA +104E3 104BB +104E4 104BC +104E5 104BD +104E6 104BE +104E7 104BF +104E8 104C0 +104E9 104C1 +104EA 104C2 +104EB 104C3 +104EC 104C4 +104ED 104C5 +104EE 104C6 +104EF 104C7 +104F0 104C8 +104F1 104C9 +104F2 104CA +104F3 104CB +104F4 104CC +104F5 104CD +104F6 104CE +104F7 104CF +104F8 104D0 +104F9 104D1 +104FA 104D2 +104FB 104D3 +10CC0 10C80 +10CC1 10C81 +10CC2 10C82 +10CC3 10C83 +10CC4 10C84 +10CC5 10C85 +10CC6 10C86 +10CC7 10C87 +10CC8 10C88 +10CC9 10C89 +10CCA 10C8A +10CCB 10C8B +10CCC 10C8C +10CCD 10C8D +10CCE 10C8E +10CCF 10C8F +10CD0 10C90 +10CD1 10C91 +10CD2 10C92 +10CD3 10C93 +10CD4 10C94 +10CD5 10C95 +10CD6 10C96 +10CD7 10C97 +10CD8 10C98 +10CD9 10C99 +10CDA 10C9A +10CDB 10C9B +10CDC 10C9C +10CDD 10C9D +10CDE 10C9E +10CDF 10C9F +10CE0 10CA0 +10CE1 10CA1 +10CE2 10CA2 +10CE3 10CA3 +10CE4 10CA4 +10CE5 10CA5 +10CE6 10CA6 +10CE7 10CA7 +10CE8 10CA8 +10CE9 10CA9 +10CEA 10CAA +10CEB 10CAB +10CEC 10CAC +10CED 10CAD +10CEE 10CAE +10CEF 10CAF +10CF0 10CB0 +10CF1 10CB1 +10CF2 10CB2 +118C0 118A0 +118C1 118A1 +118C2 118A2 +118C3 118A3 +118C4 118A4 +118C5 118A5 +118C6 118A6 +118C7 118A7 +118C8 118A8 +118C9 118A9 +118CA 118AA +118CB 118AB +118CC 118AC +118CD 118AD +118CE 118AE +118CF 118AF +118D0 118B0 +118D1 118B1 +118D2 118B2 +118D3 118B3 +118D4 118B4 +118D5 118B5 +118D6 118B6 +118D7 118B7 +118D8 118B8 +118D9 118B9 +118DA 118BA +118DB 118BB +118DC 118BC +118DD 118BD +118DE 118BE +118DF 118BF +1E922 1E900 +1E923 1E901 +1E924 1E902 +1E925 1E903 +1E926 1E904 +1E927 1E905 +1E928 1E906 +1E929 1E907 +1E92A 1E908 +1E92B 1E909 +1E92C 1E90A +1E92D 1E90B +1E92E 1E90C +1E92F 1E90D +1E930 1E90E +1E931 1E90F +1E932 1E910 +1E933 1E911 +1E934 1E912 +1E935 1E913 +1E936 1E914 +1E937 1E915 +1E938 1E916 +1E939 1E917 +1E93A 1E918 +1E93B 1E919 +1E93C 1E91A +1E93D 1E91B +1E93E 1E91C +1E93F 1E91D +1E940 1E91E +1E941 1E91F +1E942 1E920 +1E943 1E921 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNFKDQC'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNFKDQC'}{'missing'} = 'Yes'; + +return <<'END'; +A0 N +A8 N +AA N +AF N +B2 B5 N +B8 BA N +BC BE N +C0 C5 N +C7 CF N +D1 D6 N +D9 DD N +E0 E5 N +E7 EF N +F1 F6 N +F9 FD N +FF 10F N +112 125 N +128 130 N +132 137 N +139 140 N +143 149 N +14C 151 N +154 165 N +168 17F N +1A0 1A1 N +1AF 1B0 N +1C4 1DC N +1DE 1E3 N +1E6 1F5 N +1F8 21B N +21E 21F N +226 233 N +2B0 2B8 N +2D8 2DD N +2E0 2E4 N +340 341 N +343 344 N +374 N +37A N +37E N +384 38A N +38C N +38E 390 N +3AA 3B0 N +3CA 3CE N +3D0 3D6 N +3F0 3F2 N +3F4 3F5 N +3F9 N +400 401 N +403 N +407 N +40C 40E N +419 N +439 N +450 451 N +453 N +457 N +45C 45E N +476 477 N +4C1 4C2 N +4D0 4D3 N +4D6 4D7 N +4DA 4DF N +4E2 4E7 N +4EA 4F5 N +4F8 4F9 N +587 N +622 626 N +675 678 N +6C0 N +6C2 N +6D3 N +929 N +931 N +934 N +958 95F N +9CB 9CC N +9DC 9DD N +9DF N +A33 N +A36 N +A59 A5B N +A5E N +B48 N +B4B B4C N +B5C B5D N +B94 N +BCA BCC N +C48 N +CC0 N +CC7 CC8 N +CCA CCB N +D4A D4C N +DDA N +DDC DDE N +E33 N +EB3 N +EDC EDD N +F0C N +F43 N +F4D N +F52 N +F57 N +F5C N +F69 N +F73 N +F75 F79 N +F81 N +F93 N +F9D N +FA2 N +FA7 N +FAC N +FB9 N +1026 N +10FC N +1B06 N +1B08 N +1B0A N +1B0C N +1B0E N +1B12 N +1B3B N +1B3D N +1B40 1B41 N +1B43 N +1D2C 1D2E N +1D30 1D3A N +1D3C 1D4D N +1D4F 1D6A N +1D78 N +1D9B 1DBF N +1E00 1E9B N +1EA0 1EF9 N +1F00 1F15 N +1F18 1F1D N +1F20 1F45 N +1F48 1F4D N +1F50 1F57 N +1F59 N +1F5B N +1F5D N +1F5F 1F7D N +1F80 1FB4 N +1FB6 1FC4 N +1FC6 1FD3 N +1FD6 1FDB N +1FDD 1FEF N +1FF2 1FF4 N +1FF6 1FFE N +2000 200A N +2011 N +2017 N +2024 2026 N +202F N +2033 2034 N +2036 2037 N +203C N +203E N +2047 2049 N +2057 N +205F N +2070 2071 N +2074 208E N +2090 209C N +20A8 N +2100 2103 N +2105 2107 N +2109 2113 N +2115 2116 N +2119 211D N +2120 2122 N +2124 N +2126 N +2128 N +212A 212D N +212F 2131 N +2133 2139 N +213B 2140 N +2145 2149 N +2150 217F N +2189 N +219A 219B N +21AE N +21CD 21CF N +2204 N +2209 N +220C N +2224 N +2226 N +222C 222D N +222F 2230 N +2241 N +2244 N +2247 N +2249 N +2260 N +2262 N +226D 2271 N +2274 2275 N +2278 2279 N +2280 2281 N +2284 2285 N +2288 2289 N +22AC 22AF N +22E0 22E3 N +22EA 22ED N +2329 232A N +2460 24EA N +2A0C N +2A74 2A76 N +2ADC N +2C7C 2C7D N +2D6F N +2E9F N +2EF3 N +2F00 2FD5 N +3000 N +3036 N +3038 303A N +304C N +304E N +3050 N +3052 N +3054 N +3056 N +3058 N +305A N +305C N +305E N +3060 N +3062 N +3065 N +3067 N +3069 N +3070 3071 N +3073 3074 N +3076 3077 N +3079 307A N +307C 307D N +3094 N +309B 309C N +309E 309F N +30AC N +30AE N +30B0 N +30B2 N +30B4 N +30B6 N +30B8 N +30BA N +30BC N +30BE N +30C0 N +30C2 N +30C5 N +30C7 N +30C9 N +30D0 30D1 N +30D3 30D4 N +30D6 30D7 N +30D9 30DA N +30DC 30DD N +30F4 N +30F7 30FA N +30FE 30FF N +3131 318E N +3192 319F N +3200 321E N +3220 3247 N +3250 327E N +3280 32FE N +3300 33FF N +A69C A69D N +A770 N +A7F8 A7F9 N +AB5C AB5F N +AC00 D7A3 N +F900 FA0D N +FA10 N +FA12 N +FA15 FA1E N +FA20 N +FA22 N +FA25 FA26 N +FA2A FA6D N +FA70 FAD9 N +FB00 FB06 N +FB13 FB17 N +FB1D N +FB1F FB36 N +FB38 FB3C N +FB3E N +FB40 FB41 N +FB43 FB44 N +FB46 FBB1 N +FBD3 FD3D N +FD50 FD8F N +FD92 FDC7 N +FDF0 FDFC N +FE10 FE19 N +FE30 FE44 N +FE47 FE52 N +FE54 FE66 N +FE68 FE6B N +FE70 FE72 N +FE74 N +FE76 FEFC N +FF01 FFBE N +FFC2 FFC7 N +FFCA FFCF N +FFD2 FFD7 N +FFDA FFDC N +FFE0 FFE6 N +FFE8 FFEE N +1109A N +1109C N +110AB N +1112E 1112F N +1134B 1134C N +114BB 114BC N +114BE N +115BA 115BB N +1D15E 1D164 N +1D1BB 1D1C0 N +1D400 1D454 N +1D456 1D49C N +1D49E 1D49F N +1D4A2 N +1D4A5 1D4A6 N +1D4A9 1D4AC N +1D4AE 1D4B9 N +1D4BB N +1D4BD 1D4C3 N +1D4C5 1D505 N +1D507 1D50A N +1D50D 1D514 N +1D516 1D51C N +1D51E 1D539 N +1D53B 1D53E N +1D540 1D544 N +1D546 N +1D54A 1D550 N +1D552 1D6A5 N +1D6A8 1D7CB N +1D7CE 1D7FF N +1EE00 1EE03 N +1EE05 1EE1F N +1EE21 1EE22 N +1EE24 N +1EE27 N +1EE29 1EE32 N +1EE34 1EE37 N +1EE39 N +1EE3B N +1EE42 N +1EE47 N +1EE49 N +1EE4B N +1EE4D 1EE4F N +1EE51 1EE52 N +1EE54 N +1EE57 N +1EE59 N +1EE5B N +1EE5D N +1EE5F N +1EE61 1EE62 N +1EE64 N +1EE67 1EE6A N +1EE6C 1EE72 N +1EE74 1EE77 N +1EE79 1EE7C N +1EE7E N +1EE80 1EE89 N +1EE8B 1EE9B N +1EEA1 1EEA3 N +1EEA5 1EEA9 N +1EEAB 1EEBB N +1F100 1F10A N +1F110 1F12E N +1F130 1F14F N +1F16A 1F16B N +1F190 N +1F200 1F202 N +1F210 1F23B N +1F240 1F248 N +1F250 1F251 N +2F800 2FA1D N +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'To_PerlWB'}{'format'} = 's'; # string +$utf8::SwashInfo{'To_PerlWB'}{'missing'} = 'Other'; + +return <<'END'; +9 Perl_Tailored_HSpace +A LF +B C Newline +D CR +20 Perl_Tailored_HSpace +22 Double_Quote +27 Single_Quote +2C MidNum +2E MidNumLet +30 39 Numeric +3A MidLetter +3B MidNum +41 5A ALetter +5F ExtendNumLet +61 7A ALetter +85 Newline +A0 Perl_Tailored_HSpace +AA ALetter +AD Format +B5 ALetter +B7 MidLetter +BA ALetter +C0 D6 ALetter +D8 F6 ALetter +F8 2D7 ALetter +2DE 2E4 ALetter +2EC 2FF ALetter +300 36F Extend +370 374 ALetter +376 377 ALetter +37A 37D ALetter +37E MidNum +37F ALetter +386 ALetter +387 MidLetter +388 38A ALetter +38C ALetter +38E 3A1 ALetter +3A3 3F5 ALetter +3F7 481 ALetter +483 489 Extend +48A 52F ALetter +531 556 ALetter +559 ALetter +561 587 ALetter +589 MidNum +591 5BD Extend +5BF Extend +5C1 5C2 Extend +5C4 5C5 Extend +5C7 Extend +5D0 5EA Hebrew_Letter +5F0 5F2 Hebrew_Letter +5F3 ALetter +5F4 MidLetter +600 605 Format +60C 60D MidNum +610 61A Extend +61C Format +620 64A ALetter +64B 65F Extend +660 669 Numeric +66B Numeric +66C MidNum +66E 66F ALetter +670 Extend +671 6D3 ALetter +6D5 ALetter +6D6 6DC Extend +6DD Format +6DF 6E4 Extend +6E5 6E6 ALetter +6E7 6E8 Extend +6EA 6ED Extend +6EE 6EF ALetter +6F0 6F9 Numeric +6FA 6FC ALetter +6FF ALetter +70F Format +710 ALetter +711 Extend +712 72F ALetter +730 74A Extend +74D 7A5 ALetter +7A6 7B0 Extend +7B1 ALetter +7C0 7C9 Numeric +7CA 7EA ALetter +7EB 7F3 Extend +7F4 7F5 ALetter +7F8 MidNum +7FA ALetter +800 815 ALetter +816 819 Extend +81A ALetter +81B 823 Extend +824 ALetter +825 827 Extend +828 ALetter +829 82D Extend +840 858 ALetter +859 85B Extend +860 86A ALetter +8A0 8B4 ALetter +8B6 8BD ALetter +8D4 8E1 Extend +8E2 Format +8E3 903 Extend +904 939 ALetter +93A 93C Extend +93D ALetter +93E 94F Extend +950 ALetter +951 957 Extend +958 961 ALetter +962 963 Extend +966 96F Numeric +971 980 ALetter +981 983 Extend +985 98C ALetter +98F 990 ALetter +993 9A8 ALetter +9AA 9B0 ALetter +9B2 ALetter +9B6 9B9 ALetter +9BC Extend +9BD ALetter +9BE 9C4 Extend +9C7 9C8 Extend +9CB 9CD Extend +9CE ALetter +9D7 Extend +9DC 9DD ALetter +9DF 9E1 ALetter +9E2 9E3 Extend +9E6 9EF Numeric +9F0 9F1 ALetter +9FC ALetter +A01 A03 Extend +A05 A0A ALetter +A0F A10 ALetter +A13 A28 ALetter +A2A A30 ALetter +A32 A33 ALetter +A35 A36 ALetter +A38 A39 ALetter +A3C Extend +A3E A42 Extend +A47 A48 Extend +A4B A4D Extend +A51 Extend +A59 A5C ALetter +A5E ALetter +A66 A6F Numeric +A70 A71 Extend +A72 A74 ALetter +A75 Extend +A81 A83 Extend +A85 A8D ALetter +A8F A91 ALetter +A93 AA8 ALetter +AAA AB0 ALetter +AB2 AB3 ALetter +AB5 AB9 ALetter +ABC Extend +ABD ALetter +ABE AC5 Extend +AC7 AC9 Extend +ACB ACD Extend +AD0 ALetter +AE0 AE1 ALetter +AE2 AE3 Extend +AE6 AEF Numeric +AF9 ALetter +AFA AFF Extend +B01 B03 Extend +B05 B0C ALetter +B0F B10 ALetter +B13 B28 ALetter +B2A B30 ALetter +B32 B33 ALetter +B35 B39 ALetter +B3C Extend +B3D ALetter +B3E B44 Extend +B47 B48 Extend +B4B B4D Extend +B56 B57 Extend +B5C B5D ALetter +B5F B61 ALetter +B62 B63 Extend +B66 B6F Numeric +B71 ALetter +B82 Extend +B83 ALetter +B85 B8A ALetter +B8E B90 ALetter +B92 B95 ALetter +B99 B9A ALetter +B9C ALetter +B9E B9F ALetter +BA3 BA4 ALetter +BA8 BAA ALetter +BAE BB9 ALetter +BBE BC2 Extend +BC6 BC8 Extend +BCA BCD Extend +BD0 ALetter +BD7 Extend +BE6 BEF Numeric +C00 C03 Extend +C05 C0C ALetter +C0E C10 ALetter +C12 C28 ALetter +C2A C39 ALetter +C3D ALetter +C3E C44 Extend +C46 C48 Extend +C4A C4D Extend +C55 C56 Extend +C58 C5A ALetter +C60 C61 ALetter +C62 C63 Extend +C66 C6F Numeric +C80 ALetter +C81 C83 Extend +C85 C8C ALetter +C8E C90 ALetter +C92 CA8 ALetter +CAA CB3 ALetter +CB5 CB9 ALetter +CBC Extend +CBD ALetter +CBE CC4 Extend +CC6 CC8 Extend +CCA CCD Extend +CD5 CD6 Extend +CDE ALetter +CE0 CE1 ALetter +CE2 CE3 Extend +CE6 CEF Numeric +CF1 CF2 ALetter +D00 D03 Extend +D05 D0C ALetter +D0E D10 ALetter +D12 D3A ALetter +D3B D3C Extend +D3D ALetter +D3E D44 Extend +D46 D48 Extend +D4A D4D Extend +D4E ALetter +D54 D56 ALetter +D57 Extend +D5F D61 ALetter +D62 D63 Extend +D66 D6F Numeric +D7A D7F ALetter +D82 D83 Extend +D85 D96 ALetter +D9A DB1 ALetter +DB3 DBB ALetter +DBD ALetter +DC0 DC6 ALetter +DCA Extend +DCF DD4 Extend +DD6 Extend +DD8 DDF Extend +DE6 DEF Numeric +DF2 DF3 Extend +E31 Extend +E34 E3A Extend +E47 E4E Extend +E50 E59 Numeric +EB1 Extend +EB4 EB9 Extend +EBB EBC Extend +EC8 ECD Extend +ED0 ED9 Numeric +F00 ALetter +F18 F19 Extend +F20 F29 Numeric +F35 Extend +F37 Extend +F39 Extend +F3E F3F Extend +F40 F47 ALetter +F49 F6C ALetter +F71 F84 Extend +F86 F87 Extend +F88 F8C ALetter +F8D F97 Extend +F99 FBC Extend +FC6 Extend +102B 103E Extend +1040 1049 Numeric +1056 1059 Extend +105E 1060 Extend +1062 1064 Extend +1067 106D Extend +1071 1074 Extend +1082 108D Extend +108F Extend +1090 1099 Numeric +109A 109D Extend +10A0 10C5 ALetter +10C7 ALetter +10CD ALetter +10D0 10FA ALetter +10FC 1248 ALetter +124A 124D ALetter +1250 1256 ALetter +1258 ALetter +125A 125D ALetter +1260 1288 ALetter +128A 128D ALetter +1290 12B0 ALetter +12B2 12B5 ALetter +12B8 12BE ALetter +12C0 ALetter +12C2 12C5 ALetter +12C8 12D6 ALetter +12D8 1310 ALetter +1312 1315 ALetter +1318 135A ALetter +135D 135F Extend +1380 138F ALetter +13A0 13F5 ALetter +13F8 13FD ALetter +1401 166C ALetter +166F 167F ALetter +1680 Perl_Tailored_HSpace +1681 169A ALetter +16A0 16EA ALetter +16EE 16F8 ALetter +1700 170C ALetter +170E 1711 ALetter +1712 1714 Extend +1720 1731 ALetter +1732 1734 Extend +1740 1751 ALetter +1752 1753 Extend +1760 176C ALetter +176E 1770 ALetter +1772 1773 Extend +17B4 17D3 Extend +17DD Extend +17E0 17E9 Numeric +180B 180D Extend +180E Format +1810 1819 Numeric +1820 1877 ALetter +1880 1884 ALetter +1885 1886 Extend +1887 18A8 ALetter +18A9 Extend +18AA ALetter +18B0 18F5 ALetter +1900 191E ALetter +1920 192B Extend +1930 193B Extend +1946 194F Numeric +19D0 19D9 Numeric +1A00 1A16 ALetter +1A17 1A1B Extend +1A55 1A5E Extend +1A60 1A7C Extend +1A7F Extend +1A80 1A89 Numeric +1A90 1A99 Numeric +1AB0 1ABE Extend +1B00 1B04 Extend +1B05 1B33 ALetter +1B34 1B44 Extend +1B45 1B4B ALetter +1B50 1B59 Numeric +1B6B 1B73 Extend +1B80 1B82 Extend +1B83 1BA0 ALetter +1BA1 1BAD Extend +1BAE 1BAF ALetter +1BB0 1BB9 Numeric +1BBA 1BE5 ALetter +1BE6 1BF3 Extend +1C00 1C23 ALetter +1C24 1C37 Extend +1C40 1C49 Numeric +1C4D 1C4F ALetter +1C50 1C59 Numeric +1C5A 1C7D ALetter +1C80 1C88 ALetter +1CD0 1CD2 Extend +1CD4 1CE8 Extend +1CE9 1CEC ALetter +1CED Extend +1CEE 1CF1 ALetter +1CF2 1CF4 Extend +1CF5 1CF6 ALetter +1CF7 1CF9 Extend +1D00 1DBF ALetter +1DC0 1DF9 Extend +1DFB 1DFF Extend +1E00 1F15 ALetter +1F18 1F1D ALetter +1F20 1F45 ALetter +1F48 1F4D ALetter +1F50 1F57 ALetter +1F59 ALetter +1F5B ALetter +1F5D ALetter +1F5F 1F7D ALetter +1F80 1FB4 ALetter +1FB6 1FBC ALetter +1FBE ALetter +1FC2 1FC4 ALetter +1FC6 1FCC ALetter +1FD0 1FD3 ALetter +1FD6 1FDB ALetter +1FE0 1FEC ALetter +1FF2 1FF4 ALetter +1FF6 1FFC ALetter +2000 200A Perl_Tailored_HSpace +200C Extend +200D ZWJ +200E 200F Format +2018 2019 MidNumLet +2024 MidNumLet +2027 MidLetter +2028 2029 Newline +202A 202E Format +202F ExtendNumLet +203F 2040 ExtendNumLet +2044 MidNum +2054 ExtendNumLet +205F Perl_Tailored_HSpace +2060 2064 Format +2066 206F Format +2071 ALetter +207F ALetter +2090 209C ALetter +20D0 20F0 Extend +2102 ALetter +2107 ALetter +210A 2113 ALetter +2115 ALetter +2119 211D ALetter +2124 ALetter +2126 ALetter +2128 ALetter +212A 212D ALetter +212F 2139 ALetter +213C 213F ALetter +2145 2149 ALetter +214E ALetter +2160 2188 ALetter +24B6 24E9 ALetter +261D E_Base +2640 Glue_After_Zwj +2642 Glue_After_Zwj +2695 2696 Glue_After_Zwj +26F9 E_Base +2708 Glue_After_Zwj +270A 270D E_Base +2764 Glue_After_Zwj +2C00 2C2E ALetter +2C30 2C5E ALetter +2C60 2CE4 ALetter +2CEB 2CEE ALetter +2CEF 2CF1 Extend +2CF2 2CF3 ALetter +2D00 2D25 ALetter +2D27 ALetter +2D2D ALetter +2D30 2D67 ALetter +2D6F ALetter +2D7F Extend +2D80 2D96 ALetter +2DA0 2DA6 ALetter +2DA8 2DAE ALetter +2DB0 2DB6 ALetter +2DB8 2DBE ALetter +2DC0 2DC6 ALetter +2DC8 2DCE ALetter +2DD0 2DD6 ALetter +2DD8 2DDE ALetter +2DE0 2DFF Extend +2E2F ALetter +3000 Perl_Tailored_HSpace +3005 ALetter +302A 302F Extend +3031 3035 Katakana +303B 303C ALetter +3099 309A Extend +309B 309C Katakana +30A0 30FA Katakana +30FC 30FF Katakana +3105 312E ALetter +3131 318E ALetter +31A0 31BA ALetter +31F0 31FF Katakana +32D0 32FE Katakana +3300 3357 Katakana +A000 A48C ALetter +A4D0 A4FD ALetter +A500 A60C ALetter +A610 A61F ALetter +A620 A629 Numeric +A62A A62B ALetter +A640 A66E ALetter +A66F A672 Extend +A674 A67D Extend +A67F A69D ALetter +A69E A69F Extend +A6A0 A6EF ALetter +A6F0 A6F1 Extend +A717 A7AE ALetter +A7B0 A7B7 ALetter +A7F7 A801 ALetter +A802 Extend +A803 A805 ALetter +A806 Extend +A807 A80A ALetter +A80B Extend +A80C A822 ALetter +A823 A827 Extend +A840 A873 ALetter +A880 A881 Extend +A882 A8B3 ALetter +A8B4 A8C5 Extend +A8D0 A8D9 Numeric +A8E0 A8F1 Extend +A8F2 A8F7 ALetter +A8FB ALetter +A8FD ALetter +A900 A909 Numeric +A90A A925 ALetter +A926 A92D Extend +A930 A946 ALetter +A947 A953 Extend +A960 A97C ALetter +A980 A983 Extend +A984 A9B2 ALetter +A9B3 A9C0 Extend +A9CF ALetter +A9D0 A9D9 Numeric +A9E5 Extend +A9F0 A9F9 Numeric +AA00 AA28 ALetter +AA29 AA36 Extend +AA40 AA42 ALetter +AA43 Extend +AA44 AA4B ALetter +AA4C AA4D Extend +AA50 AA59 Numeric +AA7B AA7D Extend +AAB0 Extend +AAB2 AAB4 Extend +AAB7 AAB8 Extend +AABE AABF Extend +AAC1 Extend +AAE0 AAEA ALetter +AAEB AAEF Extend +AAF2 AAF4 ALetter +AAF5 AAF6 Extend +AB01 AB06 ALetter +AB09 AB0E ALetter +AB11 AB16 ALetter +AB20 AB26 ALetter +AB28 AB2E ALetter +AB30 AB65 ALetter +AB70 ABE2 ALetter +ABE3 ABEA Extend +ABEC ABED Extend +ABF0 ABF9 Numeric +AC00 D7A3 ALetter +D7B0 D7C6 ALetter +D7CB D7FB ALetter +FB00 FB06 ALetter +FB13 FB17 ALetter +FB1D Hebrew_Letter +FB1E Extend +FB1F FB28 Hebrew_Letter +FB2A FB36 Hebrew_Letter +FB38 FB3C Hebrew_Letter +FB3E Hebrew_Letter +FB40 FB41 Hebrew_Letter +FB43 FB44 Hebrew_Letter +FB46 FB4F Hebrew_Letter +FB50 FBB1 ALetter +FBD3 FD3D ALetter +FD50 FD8F ALetter +FD92 FDC7 ALetter +FDF0 FDFB ALetter +FE00 FE0F Extend +FE10 MidNum +FE13 MidLetter +FE14 MidNum +FE20 FE2F Extend +FE33 FE34 ExtendNumLet +FE4D FE4F ExtendNumLet +FE50 MidNum +FE52 MidNumLet +FE54 MidNum +FE55 MidLetter +FE70 FE74 ALetter +FE76 FEFC ALetter +FEFF Format +FF07 MidNumLet +FF0C MidNum +FF0E MidNumLet +FF1A MidLetter +FF1B MidNum +FF21 FF3A ALetter +FF3F ExtendNumLet +FF41 FF5A ALetter +FF66 FF9D Katakana +FF9E FF9F Extend +FFA0 FFBE ALetter +FFC2 FFC7 ALetter +FFCA FFCF ALetter +FFD2 FFD7 ALetter +FFDA FFDC ALetter +FFF9 FFFB Format +10000 1000B ALetter +1000D 10026 ALetter +10028 1003A ALetter +1003C 1003D ALetter +1003F 1004D ALetter +10050 1005D ALetter +10080 100FA ALetter +10140 10174 ALetter +101FD Extend +10280 1029C ALetter +102A0 102D0 ALetter +102E0 Extend +10300 1031F ALetter +1032D 1034A ALetter +10350 10375 ALetter +10376 1037A Extend +10380 1039D ALetter +103A0 103C3 ALetter +103C8 103CF ALetter +103D1 103D5 ALetter +10400 1049D ALetter +104A0 104A9 Numeric +104B0 104D3 ALetter +104D8 104FB ALetter +10500 10527 ALetter +10530 10563 ALetter +10600 10736 ALetter +10740 10755 ALetter +10760 10767 ALetter +10800 10805 ALetter +10808 ALetter +1080A 10835 ALetter +10837 10838 ALetter +1083C ALetter +1083F 10855 ALetter +10860 10876 ALetter +10880 1089E ALetter +108E0 108F2 ALetter +108F4 108F5 ALetter +10900 10915 ALetter +10920 10939 ALetter +10980 109B7 ALetter +109BE 109BF ALetter +10A00 ALetter +10A01 10A03 Extend +10A05 10A06 Extend +10A0C 10A0F Extend +10A10 10A13 ALetter +10A15 10A17 ALetter +10A19 10A33 ALetter +10A38 10A3A Extend +10A3F Extend +10A60 10A7C ALetter +10A80 10A9C ALetter +10AC0 10AC7 ALetter +10AC9 10AE4 ALetter +10AE5 10AE6 Extend +10B00 10B35 ALetter +10B40 10B55 ALetter +10B60 10B72 ALetter +10B80 10B91 ALetter +10C00 10C48 ALetter +10C80 10CB2 ALetter +10CC0 10CF2 ALetter +11000 11002 Extend +11003 11037 ALetter +11038 11046 Extend +11066 1106F Numeric +1107F 11082 Extend +11083 110AF ALetter +110B0 110BA Extend +110BD Format +110D0 110E8 ALetter +110F0 110F9 Numeric +11100 11102 Extend +11103 11126 ALetter +11127 11134 Extend +11136 1113F Numeric +11150 11172 ALetter +11173 Extend +11176 ALetter +11180 11182 Extend +11183 111B2 ALetter +111B3 111C0 Extend +111C1 111C4 ALetter +111CA 111CC Extend +111D0 111D9 Numeric +111DA ALetter +111DC ALetter +11200 11211 ALetter +11213 1122B ALetter +1122C 11237 Extend +1123E Extend +11280 11286 ALetter +11288 ALetter +1128A 1128D ALetter +1128F 1129D ALetter +1129F 112A8 ALetter +112B0 112DE ALetter +112DF 112EA Extend +112F0 112F9 Numeric +11300 11303 Extend +11305 1130C ALetter +1130F 11310 ALetter +11313 11328 ALetter +1132A 11330 ALetter +11332 11333 ALetter +11335 11339 ALetter +1133C Extend +1133D ALetter +1133E 11344 Extend +11347 11348 Extend +1134B 1134D Extend +11350 ALetter +11357 Extend +1135D 11361 ALetter +11362 11363 Extend +11366 1136C Extend +11370 11374 Extend +11400 11434 ALetter +11435 11446 Extend +11447 1144A ALetter +11450 11459 Numeric +11480 114AF ALetter +114B0 114C3 Extend +114C4 114C5 ALetter +114C7 ALetter +114D0 114D9 Numeric +11580 115AE ALetter +115AF 115B5 Extend +115B8 115C0 Extend +115D8 115DB ALetter +115DC 115DD Extend +11600 1162F ALetter +11630 11640 Extend +11644 ALetter +11650 11659 Numeric +11680 116AA ALetter +116AB 116B7 Extend +116C0 116C9 Numeric +1171D 1172B Extend +11730 11739 Numeric +118A0 118DF ALetter +118E0 118E9 Numeric +118FF ALetter +11A00 ALetter +11A01 11A0A Extend +11A0B 11A32 ALetter +11A33 11A39 Extend +11A3A ALetter +11A3B 11A3E Extend +11A47 Extend +11A50 ALetter +11A51 11A5B Extend +11A5C 11A83 ALetter +11A86 11A89 ALetter +11A8A 11A99 Extend +11AC0 11AF8 ALetter +11C00 11C08 ALetter +11C0A 11C2E ALetter +11C2F 11C36 Extend +11C38 11C3F Extend +11C40 ALetter +11C50 11C59 Numeric +11C72 11C8F ALetter +11C92 11CA7 Extend +11CA9 11CB6 Extend +11D00 11D06 ALetter +11D08 11D09 ALetter +11D0B 11D30 ALetter +11D31 11D36 Extend +11D3A Extend +11D3C 11D3D Extend +11D3F 11D45 Extend +11D46 ALetter +11D47 Extend +11D50 11D59 Numeric +12000 12399 ALetter +12400 1246E ALetter +12480 12543 ALetter +13000 1342E ALetter +14400 14646 ALetter +16800 16A38 ALetter +16A40 16A5E ALetter +16A60 16A69 Numeric +16AD0 16AED ALetter +16AF0 16AF4 Extend +16B00 16B2F ALetter +16B30 16B36 Extend +16B40 16B43 ALetter +16B50 16B59 Numeric +16B63 16B77 ALetter +16B7D 16B8F ALetter +16F00 16F44 ALetter +16F50 ALetter +16F51 16F7E Extend +16F8F 16F92 Extend +16F93 16F9F ALetter +16FE0 16FE1 ALetter +1B000 Katakana +1BC00 1BC6A ALetter +1BC70 1BC7C ALetter +1BC80 1BC88 ALetter +1BC90 1BC99 ALetter +1BC9D 1BC9E Extend +1BCA0 1BCA3 Format +1D165 1D169 Extend +1D16D 1D172 Extend +1D173 1D17A Format +1D17B 1D182 Extend +1D185 1D18B Extend +1D1AA 1D1AD Extend +1D242 1D244 Extend +1D400 1D454 ALetter +1D456 1D49C ALetter +1D49E 1D49F ALetter +1D4A2 ALetter +1D4A5 1D4A6 ALetter +1D4A9 1D4AC ALetter +1D4AE 1D4B9 ALetter +1D4BB ALetter +1D4BD 1D4C3 ALetter +1D4C5 1D505 ALetter +1D507 1D50A ALetter +1D50D 1D514 ALetter +1D516 1D51C ALetter +1D51E 1D539 ALetter +1D53B 1D53E ALetter +1D540 1D544 ALetter +1D546 ALetter +1D54A 1D550 ALetter +1D552 1D6A5 ALetter +1D6A8 1D6C0 ALetter +1D6C2 1D6DA ALetter +1D6DC 1D6FA ALetter +1D6FC 1D714 ALetter +1D716 1D734 ALetter +1D736 1D74E ALetter +1D750 1D76E ALetter +1D770 1D788 ALetter +1D78A 1D7A8 ALetter +1D7AA 1D7C2 ALetter +1D7C4 1D7CB ALetter +1D7CE 1D7FF Numeric +1DA00 1DA36 Extend +1DA3B 1DA6C Extend +1DA75 Extend +1DA84 Extend +1DA9B 1DA9F Extend +1DAA1 1DAAF Extend +1E000 1E006 Extend +1E008 1E018 Extend +1E01B 1E021 Extend +1E023 1E024 Extend +1E026 1E02A Extend +1E800 1E8C4 ALetter +1E8D0 1E8D6 Extend +1E900 1E943 ALetter +1E944 1E94A Extend +1E950 1E959 Numeric +1EE00 1EE03 ALetter +1EE05 1EE1F ALetter +1EE21 1EE22 ALetter +1EE24 ALetter +1EE27 ALetter +1EE29 1EE32 ALetter +1EE34 1EE37 ALetter +1EE39 ALetter +1EE3B ALetter +1EE42 ALetter +1EE47 ALetter +1EE49 ALetter +1EE4B ALetter +1EE4D 1EE4F ALetter +1EE51 1EE52 ALetter +1EE54 ALetter +1EE57 ALetter +1EE59 ALetter +1EE5B ALetter +1EE5D ALetter +1EE5F ALetter +1EE61 1EE62 ALetter +1EE64 ALetter +1EE67 1EE6A ALetter +1EE6C 1EE72 ALetter +1EE74 1EE77 ALetter +1EE79 1EE7C ALetter +1EE7E ALetter +1EE80 1EE89 ALetter +1EE8B 1EE9B ALetter +1EEA1 1EEA3 ALetter +1EEA5 1EEA9 ALetter +1EEAB 1EEBB ALetter +1F130 1F149 ALetter +1F150 1F169 ALetter +1F170 1F189 ALetter +1F1E6 1F1FF Regional_Indicator +1F308 Glue_After_Zwj +1F33E Glue_After_Zwj +1F373 Glue_After_Zwj +1F385 E_Base +1F393 Glue_After_Zwj +1F3A4 Glue_After_Zwj +1F3A8 Glue_After_Zwj +1F3C2 1F3C4 E_Base +1F3C7 E_Base +1F3CA 1F3CC E_Base +1F3EB Glue_After_Zwj +1F3ED Glue_After_Zwj +1F3FB 1F3FF E_Modifier +1F442 1F443 E_Base +1F446 1F450 E_Base +1F466 1F469 E_Base_GAZ +1F46E E_Base +1F470 1F478 E_Base +1F47C E_Base +1F481 1F483 E_Base +1F485 1F487 E_Base +1F48B Glue_After_Zwj +1F4AA E_Base +1F4BB 1F4BC Glue_After_Zwj +1F527 Glue_After_Zwj +1F52C Glue_After_Zwj +1F574 1F575 E_Base +1F57A E_Base +1F590 E_Base +1F595 1F596 E_Base +1F5E8 Glue_After_Zwj +1F645 1F647 E_Base +1F64B 1F64F E_Base +1F680 Glue_After_Zwj +1F692 Glue_After_Zwj +1F6A3 E_Base +1F6B4 1F6B6 E_Base +1F6C0 E_Base +1F6CC E_Base +1F918 1F91C E_Base +1F91E 1F91F E_Base +1F926 E_Base +1F930 1F939 E_Base +1F93D 1F93E E_Base +1F9D1 1F9DD E_Base +E0001 Format +E0020 E007F Extend +E0100 E01EF Extend +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToBpb'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToBpb'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +28 0029 +29 0028 +5B 005D +5D 005B +7B 007D +7D 007B +F3A 0F3B +F3B 0F3A +F3C 0F3D +F3D 0F3C +169B 169C +169C 169B +2045 2046 +2046 2045 +207D 207E +207E 207D +208D 208E +208E 208D +2308 2309 +2309 2308 +230A 230B +230B 230A +2329 232A +232A 2329 +2768 2769 +2769 2768 +276A 276B +276B 276A +276C 276D +276D 276C +276E 276F +276F 276E +2770 2771 +2771 2770 +2772 2773 +2773 2772 +2774 2775 +2775 2774 +27C5 27C6 +27C6 27C5 +27E6 27E7 +27E7 27E6 +27E8 27E9 +27E9 27E8 +27EA 27EB +27EB 27EA +27EC 27ED +27ED 27EC +27EE 27EF +27EF 27EE +2983 2984 +2984 2983 +2985 2986 +2986 2985 +2987 2988 +2988 2987 +2989 298A +298A 2989 +298B 298C +298C 298B +298D 2990 +298E 298F +298F 298E +2990 298D +2991 2992 +2992 2991 +2993 2994 +2994 2993 +2995 2996 +2996 2995 +2997 2998 +2998 2997 +29D8 29D9 +29D9 29D8 +29DA 29DB +29DB 29DA +29FC 29FD +29FD 29FC +2E22 2E23 +2E23 2E22 +2E24 2E25 +2E25 2E24 +2E26 2E27 +2E27 2E26 +2E28 2E29 +2E29 2E28 +3008 3009 +3009 3008 +300A 300B +300B 300A +300C 300D +300D 300C +300E 300F +300F 300E +3010 3011 +3011 3010 +3014 3015 +3015 3014 +3016 3017 +3017 3016 +3018 3019 +3019 3018 +301A 301B +301B 301A +FE59 FE5A +FE5A FE59 +FE5B FE5C +FE5C FE5B +FE5D FE5E +FE5E FE5D +FF08 FF09 +FF09 FF08 +FF3B FF3D +FF3D FF3B +FF5B FF5D +FF5D FF5B +FF5F FF60 +FF60 FF5F +FF62 FF63 +FF63 FF62 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# The mappings in the non-hash portion of this file must be modified to get the +# correct values by adding the code point ordinal number to each one that is +# numeric. + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToTc'}{'format'} = 'ax'; # mapped value in hex; some entries need adjustment +$utf8::SwashInfo{'ToTc'}{'specials_name'} = 'utf8::ToSpecTc'; # Name of hash of special mappings +$utf8::SwashInfo{'ToTc'}{'missing'} = '0'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecTc = ( +"\xC3\x9F" => "\x{0053}\x{0073}", # U+00DF => 0053 0073 +"\xC5\x89" => "\x{02BC}\x{004E}", # U+0149 => 02BC 004E +"\xC7\xB0" => "\x{004A}\x{030C}", # U+01F0 => 004A 030C +"\xCE\x90" => "\x{0399}\x{0308}\x{0301}", # U+0390 => 0399 0308 0301 +"\xCE\xB0" => "\x{03A5}\x{0308}\x{0301}", # U+03B0 => 03A5 0308 0301 +"\xD6\x87" => "\x{0535}\x{0582}", # U+0587 => 0535 0582 +"\xE1\xBA\x96" => "\x{0048}\x{0331}", # U+1E96 => 0048 0331 +"\xE1\xBA\x97" => "\x{0054}\x{0308}", # U+1E97 => 0054 0308 +"\xE1\xBA\x98" => "\x{0057}\x{030A}", # U+1E98 => 0057 030A +"\xE1\xBA\x99" => "\x{0059}\x{030A}", # U+1E99 => 0059 030A +"\xE1\xBA\x9A" => "\x{0041}\x{02BE}", # U+1E9A => 0041 02BE +"\xE1\xBD\x90" => "\x{03A5}\x{0313}", # U+1F50 => 03A5 0313 +"\xE1\xBD\x92" => "\x{03A5}\x{0313}\x{0300}", # U+1F52 => 03A5 0313 0300 +"\xE1\xBD\x94" => "\x{03A5}\x{0313}\x{0301}", # U+1F54 => 03A5 0313 0301 +"\xE1\xBD\x96" => "\x{03A5}\x{0313}\x{0342}", # U+1F56 => 03A5 0313 0342 +"\xE1\xBE\xB2" => "\x{1FBA}\x{0345}", # U+1FB2 => 1FBA 0345 +"\xE1\xBE\xB4" => "\x{0386}\x{0345}", # U+1FB4 => 0386 0345 +"\xE1\xBE\xB6" => "\x{0391}\x{0342}", # U+1FB6 => 0391 0342 +"\xE1\xBE\xB7" => "\x{0391}\x{0342}\x{0345}", # U+1FB7 => 0391 0342 0345 +"\xE1\xBF\x82" => "\x{1FCA}\x{0345}", # U+1FC2 => 1FCA 0345 +"\xE1\xBF\x84" => "\x{0389}\x{0345}", # U+1FC4 => 0389 0345 +"\xE1\xBF\x86" => "\x{0397}\x{0342}", # U+1FC6 => 0397 0342 +"\xE1\xBF\x87" => "\x{0397}\x{0342}\x{0345}", # U+1FC7 => 0397 0342 0345 +"\xE1\xBF\x92" => "\x{0399}\x{0308}\x{0300}", # U+1FD2 => 0399 0308 0300 +"\xE1\xBF\x93" => "\x{0399}\x{0308}\x{0301}", # U+1FD3 => 0399 0308 0301 +"\xE1\xBF\x96" => "\x{0399}\x{0342}", # U+1FD6 => 0399 0342 +"\xE1\xBF\x97" => "\x{0399}\x{0308}\x{0342}", # U+1FD7 => 0399 0308 0342 +"\xE1\xBF\xA2" => "\x{03A5}\x{0308}\x{0300}", # U+1FE2 => 03A5 0308 0300 +"\xE1\xBF\xA3" => "\x{03A5}\x{0308}\x{0301}", # U+1FE3 => 03A5 0308 0301 +"\xE1\xBF\xA4" => "\x{03A1}\x{0313}", # U+1FE4 => 03A1 0313 +"\xE1\xBF\xA6" => "\x{03A5}\x{0342}", # U+1FE6 => 03A5 0342 +"\xE1\xBF\xA7" => "\x{03A5}\x{0308}\x{0342}", # U+1FE7 => 03A5 0308 0342 +"\xE1\xBF\xB2" => "\x{1FFA}\x{0345}", # U+1FF2 => 1FFA 0345 +"\xE1\xBF\xB4" => "\x{038F}\x{0345}", # U+1FF4 => 038F 0345 +"\xE1\xBF\xB6" => "\x{03A9}\x{0342}", # U+1FF6 => 03A9 0342 +"\xE1\xBF\xB7" => "\x{03A9}\x{0342}\x{0345}", # U+1FF7 => 03A9 0342 0345 +"\xEF\xAC\x80" => "\x{0046}\x{0066}", # U+FB00 => 0046 0066 +"\xEF\xAC\x81" => "\x{0046}\x{0069}", # U+FB01 => 0046 0069 +"\xEF\xAC\x82" => "\x{0046}\x{006C}", # U+FB02 => 0046 006C +"\xEF\xAC\x83" => "\x{0046}\x{0066}\x{0069}", # U+FB03 => 0046 0066 0069 +"\xEF\xAC\x84" => "\x{0046}\x{0066}\x{006C}", # U+FB04 => 0046 0066 006C +"\xEF\xAC\x85" => "\x{0053}\x{0074}", # U+FB05 => 0053 0074 +"\xEF\xAC\x86" => "\x{0053}\x{0074}", # U+FB06 => 0053 0074 +"\xEF\xAC\x93" => "\x{0544}\x{0576}", # U+FB13 => 0544 0576 +"\xEF\xAC\x94" => "\x{0544}\x{0565}", # U+FB14 => 0544 0565 +"\xEF\xAC\x95" => "\x{0544}\x{056B}", # U+FB15 => 0544 056B +"\xEF\xAC\x96" => "\x{054E}\x{0576}", # U+FB16 => 054E 0576 +"\xEF\xAC\x97" => "\x{0544}\x{056D}", # U+FB17 => 0544 056D +); + +return <<'END'; +61 7A 41 +B5 39C +E0 F6 C0 +F8 FE D8 +FF 178 +101 100 +103 102 +105 104 +107 106 +109 108 +10B 10A +10D 10C +10F 10E +111 110 +113 112 +115 114 +117 116 +119 118 +11B 11A +11D 11C +11F 11E +121 120 +123 122 +125 124 +127 126 +129 128 +12B 12A +12D 12C +12F 12E +131 49 +133 132 +135 134 +137 136 +13A 139 +13C 13B +13E 13D +140 13F +142 141 +144 143 +146 145 +148 147 +14B 14A +14D 14C +14F 14E +151 150 +153 152 +155 154 +157 156 +159 158 +15B 15A +15D 15C +15F 15E +161 160 +163 162 +165 164 +167 166 +169 168 +16B 16A +16D 16C +16F 16E +171 170 +173 172 +175 174 +177 176 +17A 179 +17C 17B +17E 17D +17F 53 +180 243 +183 182 +185 184 +188 187 +18C 18B +192 191 +195 1F6 +199 198 +19A 23D +19E 220 +1A1 1A0 +1A3 1A2 +1A5 1A4 +1A8 1A7 +1AD 1AC +1B0 1AF +1B4 1B3 +1B6 1B5 +1B9 1B8 +1BD 1BC +1BF 1F7 +1C4 1C5 +1C6 1C5 +1C7 1C8 +1C9 1C8 +1CA 1CB +1CC 1CB +1CE 1CD +1D0 1CF +1D2 1D1 +1D4 1D3 +1D6 1D5 +1D8 1D7 +1DA 1D9 +1DC 1DB +1DD 18E +1DF 1DE +1E1 1E0 +1E3 1E2 +1E5 1E4 +1E7 1E6 +1E9 1E8 +1EB 1EA +1ED 1EC +1EF 1EE +1F1 1F2 +1F3 1F2 +1F5 1F4 +1F9 1F8 +1FB 1FA +1FD 1FC +1FF 1FE +201 200 +203 202 +205 204 +207 206 +209 208 +20B 20A +20D 20C +20F 20E +211 210 +213 212 +215 214 +217 216 +219 218 +21B 21A +21D 21C +21F 21E +223 222 +225 224 +227 226 +229 228 +22B 22A +22D 22C +22F 22E +231 230 +233 232 +23C 23B +23F 240 2C7E +242 241 +247 246 +249 248 +24B 24A +24D 24C +24F 24E +250 2C6F +251 2C6D +252 2C70 +253 181 +254 186 +256 257 189 +259 18F +25B 190 +25C A7AB +260 193 +261 A7AC +263 194 +265 A78D +266 A7AA +268 197 +269 196 +26A A7AE +26B 2C62 +26C A7AD +26F 19C +271 2C6E +272 19D +275 19F +27D 2C64 +280 1A6 +283 1A9 +287 A7B1 +288 1AE +289 244 +28A 28B 1B1 +28C 245 +292 1B7 +29D A7B2 +29E A7B0 +345 399 +371 370 +373 372 +377 376 +37B 37D 3FD +3AC 386 +3AD 3AF 388 +3B1 3C1 391 +3C2 3A3 +3C3 3CB 3A3 +3CC 38C +3CD 3CE 38E +3D0 392 +3D1 398 +3D5 3A6 +3D6 3A0 +3D7 3CF +3D9 3D8 +3DB 3DA +3DD 3DC +3DF 3DE +3E1 3E0 +3E3 3E2 +3E5 3E4 +3E7 3E6 +3E9 3E8 +3EB 3EA +3ED 3EC +3EF 3EE +3F0 39A +3F1 3A1 +3F2 3F9 +3F3 37F +3F5 395 +3F8 3F7 +3FB 3FA +430 44F 410 +450 45F 400 +461 460 +463 462 +465 464 +467 466 +469 468 +46B 46A +46D 46C +46F 46E +471 470 +473 472 +475 474 +477 476 +479 478 +47B 47A +47D 47C +47F 47E +481 480 +48B 48A +48D 48C +48F 48E +491 490 +493 492 +495 494 +497 496 +499 498 +49B 49A +49D 49C +49F 49E +4A1 4A0 +4A3 4A2 +4A5 4A4 +4A7 4A6 +4A9 4A8 +4AB 4AA +4AD 4AC +4AF 4AE +4B1 4B0 +4B3 4B2 +4B5 4B4 +4B7 4B6 +4B9 4B8 +4BB 4BA +4BD 4BC +4BF 4BE +4C2 4C1 +4C4 4C3 +4C6 4C5 +4C8 4C7 +4CA 4C9 +4CC 4CB +4CE 4CD +4CF 4C0 +4D1 4D0 +4D3 4D2 +4D5 4D4 +4D7 4D6 +4D9 4D8 +4DB 4DA +4DD 4DC +4DF 4DE +4E1 4E0 +4E3 4E2 +4E5 4E4 +4E7 4E6 +4E9 4E8 +4EB 4EA +4ED 4EC +4EF 4EE +4F1 4F0 +4F3 4F2 +4F5 4F4 +4F7 4F6 +4F9 4F8 +4FB 4FA +4FD 4FC +4FF 4FE +501 500 +503 502 +505 504 +507 506 +509 508 +50B 50A +50D 50C +50F 50E +511 510 +513 512 +515 514 +517 516 +519 518 +51B 51A +51D 51C +51F 51E +521 520 +523 522 +525 524 +527 526 +529 528 +52B 52A +52D 52C +52F 52E +561 586 531 +13F8 13FD 13F0 +1C80 412 +1C81 414 +1C82 41E +1C83 1C84 421 +1C85 422 +1C86 42A +1C87 462 +1C88 A64A +1D79 A77D +1D7D 2C63 +1E01 1E00 +1E03 1E02 +1E05 1E04 +1E07 1E06 +1E09 1E08 +1E0B 1E0A +1E0D 1E0C +1E0F 1E0E +1E11 1E10 +1E13 1E12 +1E15 1E14 +1E17 1E16 +1E19 1E18 +1E1B 1E1A +1E1D 1E1C +1E1F 1E1E +1E21 1E20 +1E23 1E22 +1E25 1E24 +1E27 1E26 +1E29 1E28 +1E2B 1E2A +1E2D 1E2C +1E2F 1E2E +1E31 1E30 +1E33 1E32 +1E35 1E34 +1E37 1E36 +1E39 1E38 +1E3B 1E3A +1E3D 1E3C +1E3F 1E3E +1E41 1E40 +1E43 1E42 +1E45 1E44 +1E47 1E46 +1E49 1E48 +1E4B 1E4A +1E4D 1E4C +1E4F 1E4E +1E51 1E50 +1E53 1E52 +1E55 1E54 +1E57 1E56 +1E59 1E58 +1E5B 1E5A +1E5D 1E5C +1E5F 1E5E +1E61 1E60 +1E63 1E62 +1E65 1E64 +1E67 1E66 +1E69 1E68 +1E6B 1E6A +1E6D 1E6C +1E6F 1E6E +1E71 1E70 +1E73 1E72 +1E75 1E74 +1E77 1E76 +1E79 1E78 +1E7B 1E7A +1E7D 1E7C +1E7F 1E7E +1E81 1E80 +1E83 1E82 +1E85 1E84 +1E87 1E86 +1E89 1E88 +1E8B 1E8A +1E8D 1E8C +1E8F 1E8E +1E91 1E90 +1E93 1E92 +1E95 1E94 +1E9B 1E60 +1EA1 1EA0 +1EA3 1EA2 +1EA5 1EA4 +1EA7 1EA6 +1EA9 1EA8 +1EAB 1EAA +1EAD 1EAC +1EAF 1EAE +1EB1 1EB0 +1EB3 1EB2 +1EB5 1EB4 +1EB7 1EB6 +1EB9 1EB8 +1EBB 1EBA +1EBD 1EBC +1EBF 1EBE +1EC1 1EC0 +1EC3 1EC2 +1EC5 1EC4 +1EC7 1EC6 +1EC9 1EC8 +1ECB 1ECA +1ECD 1ECC +1ECF 1ECE +1ED1 1ED0 +1ED3 1ED2 +1ED5 1ED4 +1ED7 1ED6 +1ED9 1ED8 +1EDB 1EDA +1EDD 1EDC +1EDF 1EDE +1EE1 1EE0 +1EE3 1EE2 +1EE5 1EE4 +1EE7 1EE6 +1EE9 1EE8 +1EEB 1EEA +1EED 1EEC +1EEF 1EEE +1EF1 1EF0 +1EF3 1EF2 +1EF5 1EF4 +1EF7 1EF6 +1EF9 1EF8 +1EFB 1EFA +1EFD 1EFC +1EFF 1EFE +1F00 1F07 1F08 +1F10 1F15 1F18 +1F20 1F27 1F28 +1F30 1F37 1F38 +1F40 1F45 1F48 +1F51 1F59 +1F53 1F5B +1F55 1F5D +1F57 1F5F +1F60 1F67 1F68 +1F70 1F71 1FBA +1F72 1F75 1FC8 +1F76 1F77 1FDA +1F78 1F79 1FF8 +1F7A 1F7B 1FEA +1F7C 1F7D 1FFA +1F80 1F87 1F88 +1F90 1F97 1F98 +1FA0 1FA7 1FA8 +1FB0 1FB1 1FB8 +1FB3 1FBC +1FBE 399 +1FC3 1FCC +1FD0 1FD1 1FD8 +1FE0 1FE1 1FE8 +1FE5 1FEC +1FF3 1FFC +214E 2132 +2170 217F 2160 +2184 2183 +24D0 24E9 24B6 +2C30 2C5E 2C00 +2C61 2C60 +2C65 23A +2C66 23E +2C68 2C67 +2C6A 2C69 +2C6C 2C6B +2C73 2C72 +2C76 2C75 +2C81 2C80 +2C83 2C82 +2C85 2C84 +2C87 2C86 +2C89 2C88 +2C8B 2C8A +2C8D 2C8C +2C8F 2C8E +2C91 2C90 +2C93 2C92 +2C95 2C94 +2C97 2C96 +2C99 2C98 +2C9B 2C9A +2C9D 2C9C +2C9F 2C9E +2CA1 2CA0 +2CA3 2CA2 +2CA5 2CA4 +2CA7 2CA6 +2CA9 2CA8 +2CAB 2CAA +2CAD 2CAC +2CAF 2CAE +2CB1 2CB0 +2CB3 2CB2 +2CB5 2CB4 +2CB7 2CB6 +2CB9 2CB8 +2CBB 2CBA +2CBD 2CBC +2CBF 2CBE +2CC1 2CC0 +2CC3 2CC2 +2CC5 2CC4 +2CC7 2CC6 +2CC9 2CC8 +2CCB 2CCA +2CCD 2CCC +2CCF 2CCE +2CD1 2CD0 +2CD3 2CD2 +2CD5 2CD4 +2CD7 2CD6 +2CD9 2CD8 +2CDB 2CDA +2CDD 2CDC +2CDF 2CDE +2CE1 2CE0 +2CE3 2CE2 +2CEC 2CEB +2CEE 2CED +2CF3 2CF2 +2D00 2D25 10A0 +2D27 10C7 +2D2D 10CD +A641 A640 +A643 A642 +A645 A644 +A647 A646 +A649 A648 +A64B A64A +A64D A64C +A64F A64E +A651 A650 +A653 A652 +A655 A654 +A657 A656 +A659 A658 +A65B A65A +A65D A65C +A65F A65E +A661 A660 +A663 A662 +A665 A664 +A667 A666 +A669 A668 +A66B A66A +A66D A66C +A681 A680 +A683 A682 +A685 A684 +A687 A686 +A689 A688 +A68B A68A +A68D A68C +A68F A68E +A691 A690 +A693 A692 +A695 A694 +A697 A696 +A699 A698 +A69B A69A +A723 A722 +A725 A724 +A727 A726 +A729 A728 +A72B A72A +A72D A72C +A72F A72E +A733 A732 +A735 A734 +A737 A736 +A739 A738 +A73B A73A +A73D A73C +A73F A73E +A741 A740 +A743 A742 +A745 A744 +A747 A746 +A749 A748 +A74B A74A +A74D A74C +A74F A74E +A751 A750 +A753 A752 +A755 A754 +A757 A756 +A759 A758 +A75B A75A +A75D A75C +A75F A75E +A761 A760 +A763 A762 +A765 A764 +A767 A766 +A769 A768 +A76B A76A +A76D A76C +A76F A76E +A77A A779 +A77C A77B +A77F A77E +A781 A780 +A783 A782 +A785 A784 +A787 A786 +A78C A78B +A791 A790 +A793 A792 +A797 A796 +A799 A798 +A79B A79A +A79D A79C +A79F A79E +A7A1 A7A0 +A7A3 A7A2 +A7A5 A7A4 +A7A7 A7A6 +A7A9 A7A8 +A7B5 A7B4 +A7B7 A7B6 +AB53 A7B3 +AB70 ABBF 13A0 +FF41 FF5A FF21 +10428 1044F 10400 +104D8 104FB 104B0 +10CC0 10CF2 10C80 +118C0 118DF 118A0 +1E922 1E943 1E900 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToHst'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToHst'}{'missing'} = 'NA'; + +return <<'END'; +1100 115F L +1160 11A7 V +11A8 11FF T +A960 A97C L +AC00 LV +AC01 AC1B LVT +AC1C LV +AC1D AC37 LVT +AC38 LV +AC39 AC53 LVT +AC54 LV +AC55 AC6F LVT +AC70 LV +AC71 AC8B LVT +AC8C LV +AC8D ACA7 LVT +ACA8 LV +ACA9 ACC3 LVT +ACC4 LV +ACC5 ACDF LVT +ACE0 LV +ACE1 ACFB LVT +ACFC LV +ACFD AD17 LVT +AD18 LV +AD19 AD33 LVT +AD34 LV +AD35 AD4F LVT +AD50 LV +AD51 AD6B LVT +AD6C LV +AD6D AD87 LVT +AD88 LV +AD89 ADA3 LVT +ADA4 LV +ADA5 ADBF LVT +ADC0 LV +ADC1 ADDB LVT +ADDC LV +ADDD ADF7 LVT +ADF8 LV +ADF9 AE13 LVT +AE14 LV +AE15 AE2F LVT +AE30 LV +AE31 AE4B LVT +AE4C LV +AE4D AE67 LVT +AE68 LV +AE69 AE83 LVT +AE84 LV +AE85 AE9F LVT +AEA0 LV +AEA1 AEBB LVT +AEBC LV +AEBD AED7 LVT +AED8 LV +AED9 AEF3 LVT +AEF4 LV +AEF5 AF0F LVT +AF10 LV +AF11 AF2B LVT +AF2C LV +AF2D AF47 LVT +AF48 LV +AF49 AF63 LVT +AF64 LV +AF65 AF7F LVT +AF80 LV +AF81 AF9B LVT +AF9C LV +AF9D AFB7 LVT +AFB8 LV +AFB9 AFD3 LVT +AFD4 LV +AFD5 AFEF LVT +AFF0 LV +AFF1 B00B LVT +B00C LV +B00D B027 LVT +B028 LV +B029 B043 LVT +B044 LV +B045 B05F LVT +B060 LV +B061 B07B LVT +B07C LV +B07D B097 LVT +B098 LV +B099 B0B3 LVT +B0B4 LV +B0B5 B0CF LVT +B0D0 LV +B0D1 B0EB LVT +B0EC LV +B0ED B107 LVT +B108 LV +B109 B123 LVT +B124 LV +B125 B13F LVT +B140 LV +B141 B15B LVT +B15C LV +B15D B177 LVT +B178 LV +B179 B193 LVT +B194 LV +B195 B1AF LVT +B1B0 LV +B1B1 B1CB LVT +B1CC LV +B1CD B1E7 LVT +B1E8 LV +B1E9 B203 LVT +B204 LV +B205 B21F LVT +B220 LV +B221 B23B LVT +B23C LV +B23D B257 LVT +B258 LV +B259 B273 LVT +B274 LV +B275 B28F LVT +B290 LV +B291 B2AB LVT +B2AC LV +B2AD B2C7 LVT +B2C8 LV +B2C9 B2E3 LVT +B2E4 LV +B2E5 B2FF LVT +B300 LV +B301 B31B LVT +B31C LV +B31D B337 LVT +B338 LV +B339 B353 LVT +B354 LV +B355 B36F LVT +B370 LV +B371 B38B LVT +B38C LV +B38D B3A7 LVT +B3A8 LV +B3A9 B3C3 LVT +B3C4 LV +B3C5 B3DF LVT +B3E0 LV +B3E1 B3FB LVT +B3FC LV +B3FD B417 LVT +B418 LV +B419 B433 LVT +B434 LV +B435 B44F LVT +B450 LV +B451 B46B LVT +B46C LV +B46D B487 LVT +B488 LV +B489 B4A3 LVT +B4A4 LV +B4A5 B4BF LVT +B4C0 LV +B4C1 B4DB LVT +B4DC LV +B4DD B4F7 LVT +B4F8 LV +B4F9 B513 LVT +B514 LV +B515 B52F LVT +B530 LV +B531 B54B LVT +B54C LV +B54D B567 LVT +B568 LV +B569 B583 LVT +B584 LV +B585 B59F LVT +B5A0 LV +B5A1 B5BB LVT +B5BC LV +B5BD B5D7 LVT +B5D8 LV +B5D9 B5F3 LVT +B5F4 LV +B5F5 B60F LVT +B610 LV +B611 B62B LVT +B62C LV +B62D B647 LVT +B648 LV +B649 B663 LVT +B664 LV +B665 B67F LVT +B680 LV +B681 B69B LVT +B69C LV +B69D B6B7 LVT +B6B8 LV +B6B9 B6D3 LVT +B6D4 LV +B6D5 B6EF LVT +B6F0 LV +B6F1 B70B LVT +B70C LV +B70D B727 LVT +B728 LV +B729 B743 LVT +B744 LV +B745 B75F LVT +B760 LV +B761 B77B LVT +B77C LV +B77D B797 LVT +B798 LV +B799 B7B3 LVT +B7B4 LV +B7B5 B7CF LVT +B7D0 LV +B7D1 B7EB LVT +B7EC LV +B7ED B807 LVT +B808 LV +B809 B823 LVT +B824 LV +B825 B83F LVT +B840 LV +B841 B85B LVT +B85C LV +B85D B877 LVT +B878 LV +B879 B893 LVT +B894 LV +B895 B8AF LVT +B8B0 LV +B8B1 B8CB LVT +B8CC LV +B8CD B8E7 LVT +B8E8 LV +B8E9 B903 LVT +B904 LV +B905 B91F LVT +B920 LV +B921 B93B LVT +B93C LV +B93D B957 LVT +B958 LV +B959 B973 LVT +B974 LV +B975 B98F LVT +B990 LV +B991 B9AB LVT +B9AC LV +B9AD B9C7 LVT +B9C8 LV +B9C9 B9E3 LVT +B9E4 LV +B9E5 B9FF LVT +BA00 LV +BA01 BA1B LVT +BA1C LV +BA1D BA37 LVT +BA38 LV +BA39 BA53 LVT +BA54 LV +BA55 BA6F LVT +BA70 LV +BA71 BA8B LVT +BA8C LV +BA8D BAA7 LVT +BAA8 LV +BAA9 BAC3 LVT +BAC4 LV +BAC5 BADF LVT +BAE0 LV +BAE1 BAFB LVT +BAFC LV +BAFD BB17 LVT +BB18 LV +BB19 BB33 LVT +BB34 LV +BB35 BB4F LVT +BB50 LV +BB51 BB6B LVT +BB6C LV +BB6D BB87 LVT +BB88 LV +BB89 BBA3 LVT +BBA4 LV +BBA5 BBBF LVT +BBC0 LV +BBC1 BBDB LVT +BBDC LV +BBDD BBF7 LVT +BBF8 LV +BBF9 BC13 LVT +BC14 LV +BC15 BC2F LVT +BC30 LV +BC31 BC4B LVT +BC4C LV +BC4D BC67 LVT +BC68 LV +BC69 BC83 LVT +BC84 LV +BC85 BC9F LVT +BCA0 LV +BCA1 BCBB LVT +BCBC LV +BCBD BCD7 LVT +BCD8 LV +BCD9 BCF3 LVT +BCF4 LV +BCF5 BD0F LVT +BD10 LV +BD11 BD2B LVT +BD2C LV +BD2D BD47 LVT +BD48 LV +BD49 BD63 LVT +BD64 LV +BD65 BD7F LVT +BD80 LV +BD81 BD9B LVT +BD9C LV +BD9D BDB7 LVT +BDB8 LV +BDB9 BDD3 LVT +BDD4 LV +BDD5 BDEF LVT +BDF0 LV +BDF1 BE0B LVT +BE0C LV +BE0D BE27 LVT +BE28 LV +BE29 BE43 LVT +BE44 LV +BE45 BE5F LVT +BE60 LV +BE61 BE7B LVT +BE7C LV +BE7D BE97 LVT +BE98 LV +BE99 BEB3 LVT +BEB4 LV +BEB5 BECF LVT +BED0 LV +BED1 BEEB LVT +BEEC LV +BEED BF07 LVT +BF08 LV +BF09 BF23 LVT +BF24 LV +BF25 BF3F LVT +BF40 LV +BF41 BF5B LVT +BF5C LV +BF5D BF77 LVT +BF78 LV +BF79 BF93 LVT +BF94 LV +BF95 BFAF LVT +BFB0 LV +BFB1 BFCB LVT +BFCC LV +BFCD BFE7 LVT +BFE8 LV +BFE9 C003 LVT +C004 LV +C005 C01F LVT +C020 LV +C021 C03B LVT +C03C LV +C03D C057 LVT +C058 LV +C059 C073 LVT +C074 LV +C075 C08F LVT +C090 LV +C091 C0AB LVT +C0AC LV +C0AD C0C7 LVT +C0C8 LV +C0C9 C0E3 LVT +C0E4 LV +C0E5 C0FF LVT +C100 LV +C101 C11B LVT +C11C LV +C11D C137 LVT +C138 LV +C139 C153 LVT +C154 LV +C155 C16F LVT +C170 LV +C171 C18B LVT +C18C LV +C18D C1A7 LVT +C1A8 LV +C1A9 C1C3 LVT +C1C4 LV +C1C5 C1DF LVT +C1E0 LV +C1E1 C1FB LVT +C1FC LV +C1FD C217 LVT +C218 LV +C219 C233 LVT +C234 LV +C235 C24F LVT +C250 LV +C251 C26B LVT +C26C LV +C26D C287 LVT +C288 LV +C289 C2A3 LVT +C2A4 LV +C2A5 C2BF LVT +C2C0 LV +C2C1 C2DB LVT +C2DC LV +C2DD C2F7 LVT +C2F8 LV +C2F9 C313 LVT +C314 LV +C315 C32F LVT +C330 LV +C331 C34B LVT +C34C LV +C34D C367 LVT +C368 LV +C369 C383 LVT +C384 LV +C385 C39F LVT +C3A0 LV +C3A1 C3BB LVT +C3BC LV +C3BD C3D7 LVT +C3D8 LV +C3D9 C3F3 LVT +C3F4 LV +C3F5 C40F LVT +C410 LV +C411 C42B LVT +C42C LV +C42D C447 LVT +C448 LV +C449 C463 LVT +C464 LV +C465 C47F LVT +C480 LV +C481 C49B LVT +C49C LV +C49D C4B7 LVT +C4B8 LV +C4B9 C4D3 LVT +C4D4 LV +C4D5 C4EF LVT +C4F0 LV +C4F1 C50B LVT +C50C LV +C50D C527 LVT +C528 LV +C529 C543 LVT +C544 LV +C545 C55F LVT +C560 LV +C561 C57B LVT +C57C LV +C57D C597 LVT +C598 LV +C599 C5B3 LVT +C5B4 LV +C5B5 C5CF LVT +C5D0 LV +C5D1 C5EB LVT +C5EC LV +C5ED C607 LVT +C608 LV +C609 C623 LVT +C624 LV +C625 C63F LVT +C640 LV +C641 C65B LVT +C65C LV +C65D C677 LVT +C678 LV +C679 C693 LVT +C694 LV +C695 C6AF LVT +C6B0 LV +C6B1 C6CB LVT +C6CC LV +C6CD C6E7 LVT +C6E8 LV +C6E9 C703 LVT +C704 LV +C705 C71F LVT +C720 LV +C721 C73B LVT +C73C LV +C73D C757 LVT +C758 LV +C759 C773 LVT +C774 LV +C775 C78F LVT +C790 LV +C791 C7AB LVT +C7AC LV +C7AD C7C7 LVT +C7C8 LV +C7C9 C7E3 LVT +C7E4 LV +C7E5 C7FF LVT +C800 LV +C801 C81B LVT +C81C LV +C81D C837 LVT +C838 LV +C839 C853 LVT +C854 LV +C855 C86F LVT +C870 LV +C871 C88B LVT +C88C LV +C88D C8A7 LVT +C8A8 LV +C8A9 C8C3 LVT +C8C4 LV +C8C5 C8DF LVT +C8E0 LV +C8E1 C8FB LVT +C8FC LV +C8FD C917 LVT +C918 LV +C919 C933 LVT +C934 LV +C935 C94F LVT +C950 LV +C951 C96B LVT +C96C LV +C96D C987 LVT +C988 LV +C989 C9A3 LVT +C9A4 LV +C9A5 C9BF LVT +C9C0 LV +C9C1 C9DB LVT +C9DC LV +C9DD C9F7 LVT +C9F8 LV +C9F9 CA13 LVT +CA14 LV +CA15 CA2F LVT +CA30 LV +CA31 CA4B LVT +CA4C LV +CA4D CA67 LVT +CA68 LV +CA69 CA83 LVT +CA84 LV +CA85 CA9F LVT +CAA0 LV +CAA1 CABB LVT +CABC LV +CABD CAD7 LVT +CAD8 LV +CAD9 CAF3 LVT +CAF4 LV +CAF5 CB0F LVT +CB10 LV +CB11 CB2B LVT +CB2C LV +CB2D CB47 LVT +CB48 LV +CB49 CB63 LVT +CB64 LV +CB65 CB7F LVT +CB80 LV +CB81 CB9B LVT +CB9C LV +CB9D CBB7 LVT +CBB8 LV +CBB9 CBD3 LVT +CBD4 LV +CBD5 CBEF LVT +CBF0 LV +CBF1 CC0B LVT +CC0C LV +CC0D CC27 LVT +CC28 LV +CC29 CC43 LVT +CC44 LV +CC45 CC5F LVT +CC60 LV +CC61 CC7B LVT +CC7C LV +CC7D CC97 LVT +CC98 LV +CC99 CCB3 LVT +CCB4 LV +CCB5 CCCF LVT +CCD0 LV +CCD1 CCEB LVT +CCEC LV +CCED CD07 LVT +CD08 LV +CD09 CD23 LVT +CD24 LV +CD25 CD3F LVT +CD40 LV +CD41 CD5B LVT +CD5C LV +CD5D CD77 LVT +CD78 LV +CD79 CD93 LVT +CD94 LV +CD95 CDAF LVT +CDB0 LV +CDB1 CDCB LVT +CDCC LV +CDCD CDE7 LVT +CDE8 LV +CDE9 CE03 LVT +CE04 LV +CE05 CE1F LVT +CE20 LV +CE21 CE3B LVT +CE3C LV +CE3D CE57 LVT +CE58 LV +CE59 CE73 LVT +CE74 LV +CE75 CE8F LVT +CE90 LV +CE91 CEAB LVT +CEAC LV +CEAD CEC7 LVT +CEC8 LV +CEC9 CEE3 LVT +CEE4 LV +CEE5 CEFF LVT +CF00 LV +CF01 CF1B LVT +CF1C LV +CF1D CF37 LVT +CF38 LV +CF39 CF53 LVT +CF54 LV +CF55 CF6F LVT +CF70 LV +CF71 CF8B LVT +CF8C LV +CF8D CFA7 LVT +CFA8 LV +CFA9 CFC3 LVT +CFC4 LV +CFC5 CFDF LVT +CFE0 LV +CFE1 CFFB LVT +CFFC LV +CFFD D017 LVT +D018 LV +D019 D033 LVT +D034 LV +D035 D04F LVT +D050 LV +D051 D06B LVT +D06C LV +D06D D087 LVT +D088 LV +D089 D0A3 LVT +D0A4 LV +D0A5 D0BF LVT +D0C0 LV +D0C1 D0DB LVT +D0DC LV +D0DD D0F7 LVT +D0F8 LV +D0F9 D113 LVT +D114 LV +D115 D12F LVT +D130 LV +D131 D14B LVT +D14C LV +D14D D167 LVT +D168 LV +D169 D183 LVT +D184 LV +D185 D19F LVT +D1A0 LV +D1A1 D1BB LVT +D1BC LV +D1BD D1D7 LVT +D1D8 LV +D1D9 D1F3 LVT +D1F4 LV +D1F5 D20F LVT +D210 LV +D211 D22B LVT +D22C LV +D22D D247 LVT +D248 LV +D249 D263 LVT +D264 LV +D265 D27F LVT +D280 LV +D281 D29B LVT +D29C LV +D29D D2B7 LVT +D2B8 LV +D2B9 D2D3 LVT +D2D4 LV +D2D5 D2EF LVT +D2F0 LV +D2F1 D30B LVT +D30C LV +D30D D327 LVT +D328 LV +D329 D343 LVT +D344 LV +D345 D35F LVT +D360 LV +D361 D37B LVT +D37C LV +D37D D397 LVT +D398 LV +D399 D3B3 LVT +D3B4 LV +D3B5 D3CF LVT +D3D0 LV +D3D1 D3EB LVT +D3EC LV +D3ED D407 LVT +D408 LV +D409 D423 LVT +D424 LV +D425 D43F LVT +D440 LV +D441 D45B LVT +D45C LV +D45D D477 LVT +D478 LV +D479 D493 LVT +D494 LV +D495 D4AF LVT +D4B0 LV +D4B1 D4CB LVT +D4CC LV +D4CD D4E7 LVT +D4E8 LV +D4E9 D503 LVT +D504 LV +D505 D51F LVT +D520 LV +D521 D53B LVT +D53C LV +D53D D557 LVT +D558 LV +D559 D573 LVT +D574 LV +D575 D58F LVT +D590 LV +D591 D5AB LVT +D5AC LV +D5AD D5C7 LVT +D5C8 LV +D5C9 D5E3 LVT +D5E4 LV +D5E5 D5FF LVT +D600 LV +D601 D61B LVT +D61C LV +D61D D637 LVT +D638 LV +D639 D653 LVT +D654 LV +D655 D66F LVT +D670 LV +D671 D68B LVT +D68C LV +D68D D6A7 LVT +D6A8 LV +D6A9 D6C3 LVT +D6C4 LV +D6C5 D6DF LVT +D6E0 LV +D6E1 D6FB LVT +D6FC LV +D6FD D717 LVT +D718 LV +D719 D733 LVT +D734 LV +D735 D74F LVT +D750 LV +D751 D76B LVT +D76C LV +D76D D787 LVT +D788 LV +D789 D7A3 LVT +D7B0 D7C6 V +D7CB D7FB T +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToJt'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToJt'}{'missing'} = 'Non_Joining'; + +return <<'END'; +AD T +300 36F T +483 489 T +591 5BD T +5BF T +5C1 5C2 T +5C4 5C5 T +5C7 T +610 61A T +61C T +620 D +622 625 R +626 D +627 R +628 D +629 R +62A 62E D +62F 632 R +633 63F D +640 C +641 647 D +648 R +649 64A D +64B 65F T +66E 66F D +670 T +671 673 R +675 677 R +678 687 D +688 699 R +69A 6BF D +6C0 R +6C1 6C2 D +6C3 6CB R +6CC D +6CD R +6CE D +6CF R +6D0 6D1 D +6D2 6D3 R +6D5 R +6D6 6DC T +6DF 6E4 T +6E7 6E8 T +6EA 6ED T +6EE 6EF R +6FA 6FC D +6FF D +70F T +710 R +711 T +712 714 D +715 719 R +71A 71D D +71E R +71F 727 D +728 R +729 D +72A R +72B D +72C R +72D 72E D +72F R +730 74A T +74D R +74E 758 D +759 75B R +75C 76A D +76B 76C R +76D 770 D +771 R +772 D +773 774 R +775 777 D +778 779 R +77A 77F D +7A6 7B0 T +7CA 7EA D +7EB 7F3 T +7FA C +816 819 T +81B 823 T +825 827 T +829 82D T +840 R +841 845 D +846 847 R +848 D +849 R +84A 853 D +854 R +855 D +859 85B T +860 D +862 865 D +867 R +868 D +869 86A R +8A0 8A9 D +8AA 8AC R +8AE R +8AF 8B0 D +8B1 8B2 R +8B3 8B4 D +8B6 8B8 D +8B9 R +8BA 8BD D +8D4 8E1 T +8E3 902 T +93A T +93C T +941 948 T +94D T +951 957 T +962 963 T +981 T +9BC T +9C1 9C4 T +9CD T +9E2 9E3 T +A01 A02 T +A3C T +A41 A42 T +A47 A48 T +A4B A4D T +A51 T +A70 A71 T +A75 T +A81 A82 T +ABC T +AC1 AC5 T +AC7 AC8 T +ACD T +AE2 AE3 T +AFA AFF T +B01 T +B3C T +B3F T +B41 B44 T +B4D T +B56 T +B62 B63 T +B82 T +BC0 T +BCD T +C00 T +C3E C40 T +C46 C48 T +C4A C4D T +C55 C56 T +C62 C63 T +C81 T +CBC T +CBF T +CC6 T +CCC CCD T +CE2 CE3 T +D00 D01 T +D3B D3C T +D41 D44 T +D4D T +D62 D63 T +DCA T +DD2 DD4 T +DD6 T +E31 T +E34 E3A T +E47 E4E T +EB1 T +EB4 EB9 T +EBB EBC T +EC8 ECD T +F18 F19 T +F35 T +F37 T +F39 T +F71 F7E T +F80 F84 T +F86 F87 T +F8D F97 T +F99 FBC T +FC6 T +102D 1030 T +1032 1037 T +1039 103A T +103D 103E T +1058 1059 T +105E 1060 T +1071 1074 T +1082 T +1085 1086 T +108D T +109D T +135D 135F T +1712 1714 T +1732 1734 T +1752 1753 T +1772 1773 T +17B4 17B5 T +17B7 17BD T +17C6 T +17C9 17D3 T +17DD T +1807 D +180A C +180B 180D T +1820 1877 D +1885 1886 T +1887 18A8 D +18A9 T +18AA D +1920 1922 T +1927 1928 T +1932 T +1939 193B T +1A17 1A18 T +1A1B T +1A56 T +1A58 1A5E T +1A60 T +1A62 T +1A65 1A6C T +1A73 1A7C T +1A7F T +1AB0 1ABE T +1B00 1B03 T +1B34 T +1B36 1B3A T +1B3C T +1B42 T +1B6B 1B73 T +1B80 1B81 T +1BA2 1BA5 T +1BA8 1BA9 T +1BAB 1BAD T +1BE6 T +1BE8 1BE9 T +1BED T +1BEF 1BF1 T +1C2C 1C33 T +1C36 1C37 T +1CD0 1CD2 T +1CD4 1CE0 T +1CE2 1CE8 T +1CED T +1CF4 T +1CF8 1CF9 T +1DC0 1DF9 T +1DFB 1DFF T +200B T +200D C +200E 200F T +202A 202E T +2060 2064 T +206A 206F T +20D0 20F0 T +2CEF 2CF1 T +2D7F T +2DE0 2DFF T +302A 302D T +3099 309A T +A66F A672 T +A674 A67D T +A69E A69F T +A6F0 A6F1 T +A802 T +A806 T +A80B T +A825 A826 T +A840 A871 D +A872 L +A8C4 A8C5 T +A8E0 A8F1 T +A926 A92D T +A947 A951 T +A980 A982 T +A9B3 T +A9B6 A9B9 T +A9BC T +A9E5 T +AA29 AA2E T +AA31 AA32 T +AA35 AA36 T +AA43 T +AA4C T +AA7C T +AAB0 T +AAB2 AAB4 T +AAB7 AAB8 T +AABE AABF T +AAC1 T +AAEC AAED T +AAF6 T +ABE5 T +ABE8 T +ABED T +FB1E T +FE00 FE0F T +FE20 FE2F T +FEFF T +FFF9 FFFB T +101FD T +102E0 T +10376 1037A T +10A01 10A03 T +10A05 10A06 T +10A0C 10A0F T +10A38 10A3A T +10A3F T +10AC0 10AC4 D +10AC5 R +10AC7 R +10AC9 10ACA R +10ACD L +10ACE 10AD2 R +10AD3 10AD6 D +10AD7 L +10AD8 10ADC D +10ADD R +10ADE 10AE0 D +10AE1 R +10AE4 R +10AE5 10AE6 T +10AEB 10AEE D +10AEF R +10B80 D +10B81 R +10B82 D +10B83 10B85 R +10B86 10B88 D +10B89 R +10B8A 10B8B D +10B8C R +10B8D D +10B8E 10B8F R +10B90 D +10B91 R +10BA9 10BAC R +10BAD 10BAE D +11001 T +11038 11046 T +1107F 11081 T +110B3 110B6 T +110B9 110BA T +110BD T +11100 11102 T +11127 1112B T +1112D 11134 T +11173 T +11180 11181 T +111B6 111BE T +111CA 111CC T +1122F 11231 T +11234 T +11236 11237 T +1123E T +112DF T +112E3 112EA T +11300 11301 T +1133C T +11340 T +11366 1136C T +11370 11374 T +11438 1143F T +11442 11444 T +11446 T +114B3 114B8 T +114BA T +114BF 114C0 T +114C2 114C3 T +115B2 115B5 T +115BC 115BD T +115BF 115C0 T +115DC 115DD T +11633 1163A T +1163D T +1163F 11640 T +116AB T +116AD T +116B0 116B5 T +116B7 T +1171D 1171F T +11722 11725 T +11727 1172B T +11A01 11A06 T +11A09 11A0A T +11A33 11A38 T +11A3B 11A3E T +11A47 T +11A51 11A56 T +11A59 11A5B T +11A8A 11A96 T +11A98 11A99 T +11C30 11C36 T +11C38 11C3D T +11C3F T +11C92 11CA7 T +11CAA 11CB0 T +11CB2 11CB3 T +11CB5 11CB6 T +11D31 11D36 T +11D3A T +11D3C 11D3D T +11D3F 11D45 T +11D47 T +16AF0 16AF4 T +16B30 16B36 T +16F8F 16F92 T +1BC9D 1BC9E T +1BCA0 1BCA3 T +1D167 1D169 T +1D173 1D182 T +1D185 1D18B T +1D1AA 1D1AD T +1D242 1D244 T +1DA00 1DA36 T +1DA3B 1DA6C T +1DA75 T +1DA84 T +1DA9B 1DA9F T +1DAA1 1DAAF T +1E000 1E006 T +1E008 1E018 T +1E01B 1E021 T +1E023 1E024 T +1E026 1E02A T +1E8D0 1E8D6 T +1E900 1E943 D +1E944 1E94A T +E0001 T +E0020 E007F T +E0100 E01EF T +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNa1'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNa1'}{'missing'} = ''; # code point maps to the null string + +return <<'END'; +0 NULL +1 START OF HEADING +2 START OF TEXT +3 END OF TEXT +4 END OF TRANSMISSION +5 ENQUIRY +6 ACKNOWLEDGE +7 BELL +8 BACKSPACE +9 CHARACTER TABULATION +A LINE FEED (LF) +B LINE TABULATION +C FORM FEED (FF) +D CARRIAGE RETURN (CR) +E SHIFT OUT +F SHIFT IN +10 DATA LINK ESCAPE +11 DEVICE CONTROL ONE +12 DEVICE CONTROL TWO +13 DEVICE CONTROL THREE +14 DEVICE CONTROL FOUR +15 NEGATIVE ACKNOWLEDGE +16 SYNCHRONOUS IDLE +17 END OF TRANSMISSION BLOCK +18 CANCEL +19 END OF MEDIUM +1A SUBSTITUTE +1B ESCAPE +1C INFORMATION SEPARATOR FOUR +1D INFORMATION SEPARATOR THREE +1E INFORMATION SEPARATOR TWO +1F INFORMATION SEPARATOR ONE +27 APOSTROPHE-QUOTE +28 OPENING PARENTHESIS +29 CLOSING PARENTHESIS +2E PERIOD +2F SLASH +5B OPENING SQUARE BRACKET +5C BACKSLASH +5D CLOSING SQUARE BRACKET +5E SPACING CIRCUMFLEX +5F SPACING UNDERSCORE +60 SPACING GRAVE +7B OPENING CURLY BRACKET +7C VERTICAL BAR +7D CLOSING CURLY BRACKET +7F DELETE +82 BREAK PERMITTED HERE +83 NO BREAK HERE +85 NEXT LINE (NEL) +86 START OF SELECTED AREA +87 END OF SELECTED AREA +88 CHARACTER TABULATION SET +89 CHARACTER TABULATION WITH JUSTIFICATION +8A LINE TABULATION SET +8B PARTIAL LINE FORWARD +8C PARTIAL LINE BACKWARD +8D REVERSE LINE FEED +8E SINGLE SHIFT TWO +8F SINGLE SHIFT THREE +90 DEVICE CONTROL STRING +91 PRIVATE USE ONE +92 PRIVATE USE TWO +93 SET TRANSMIT STATE +94 CANCEL CHARACTER +95 MESSAGE WAITING +96 START OF GUARDED AREA +97 END OF GUARDED AREA +98 START OF STRING +9A SINGLE CHARACTER INTRODUCER +9B CONTROL SEQUENCE INTRODUCER +9C STRING TERMINATOR +9D OPERATING SYSTEM COMMAND +9E PRIVACY MESSAGE +9F APPLICATION PROGRAM COMMAND +A0 NON-BREAKING SPACE +A6 BROKEN VERTICAL BAR +A8 SPACING DIAERESIS +AB LEFT POINTING GUILLEMET +AE REGISTERED TRADE MARK SIGN +AF SPACING MACRON +B1 PLUS-OR-MINUS SIGN +B2 SUPERSCRIPT DIGIT TWO +B3 SUPERSCRIPT DIGIT THREE +B4 SPACING ACUTE +B6 PARAGRAPH SIGN +B8 SPACING CEDILLA +B9 SUPERSCRIPT DIGIT ONE +BB RIGHT POINTING GUILLEMET +BC FRACTION ONE QUARTER +BD FRACTION ONE HALF +BE FRACTION THREE QUARTERS +C0 LATIN CAPITAL LETTER A GRAVE +C1 LATIN CAPITAL LETTER A ACUTE +C2 LATIN CAPITAL LETTER A CIRCUMFLEX +C3 LATIN CAPITAL LETTER A TILDE +C4 LATIN CAPITAL LETTER A DIAERESIS +C5 LATIN CAPITAL LETTER A RING +C6 LATIN CAPITAL LETTER A E +C7 LATIN CAPITAL LETTER C CEDILLA +C8 LATIN CAPITAL LETTER E GRAVE +C9 LATIN CAPITAL LETTER E ACUTE +CA LATIN CAPITAL LETTER E CIRCUMFLEX +CB LATIN CAPITAL LETTER E DIAERESIS +CC LATIN CAPITAL LETTER I GRAVE +CD LATIN CAPITAL LETTER I ACUTE +CE LATIN CAPITAL LETTER I CIRCUMFLEX +CF LATIN CAPITAL LETTER I DIAERESIS +D1 LATIN CAPITAL LETTER N TILDE +D2 LATIN CAPITAL LETTER O GRAVE +D3 LATIN CAPITAL LETTER O ACUTE +D4 LATIN CAPITAL LETTER O CIRCUMFLEX +D5 LATIN CAPITAL LETTER O TILDE +D6 LATIN CAPITAL LETTER O DIAERESIS +D8 LATIN CAPITAL LETTER O SLASH +D9 LATIN CAPITAL LETTER U GRAVE +DA LATIN CAPITAL LETTER U ACUTE +DB LATIN CAPITAL LETTER U CIRCUMFLEX +DC LATIN CAPITAL LETTER U DIAERESIS +DD LATIN CAPITAL LETTER Y ACUTE +E0 LATIN SMALL LETTER A GRAVE +E1 LATIN SMALL LETTER A ACUTE +E2 LATIN SMALL LETTER A CIRCUMFLEX +E3 LATIN SMALL LETTER A TILDE +E4 LATIN SMALL LETTER A DIAERESIS +E5 LATIN SMALL LETTER A RING +E6 LATIN SMALL LETTER A E +E7 LATIN SMALL LETTER C CEDILLA +E8 LATIN SMALL LETTER E GRAVE +E9 LATIN SMALL LETTER E ACUTE +EA LATIN SMALL LETTER E CIRCUMFLEX +EB LATIN SMALL LETTER E DIAERESIS +EC LATIN SMALL LETTER I GRAVE +ED LATIN SMALL LETTER I ACUTE +EE LATIN SMALL LETTER I CIRCUMFLEX +EF LATIN SMALL LETTER I DIAERESIS +F1 LATIN SMALL LETTER N TILDE +F2 LATIN SMALL LETTER O GRAVE +F3 LATIN SMALL LETTER O ACUTE +F4 LATIN SMALL LETTER O CIRCUMFLEX +F5 LATIN SMALL LETTER O TILDE +F6 LATIN SMALL LETTER O DIAERESIS +F8 LATIN SMALL LETTER O SLASH +F9 LATIN SMALL LETTER U GRAVE +FA LATIN SMALL LETTER U ACUTE +FB LATIN SMALL LETTER U CIRCUMFLEX +FC LATIN SMALL LETTER U DIAERESIS +FD LATIN SMALL LETTER Y ACUTE +FF LATIN SMALL LETTER Y DIAERESIS +100 LATIN CAPITAL LETTER A MACRON +101 LATIN SMALL LETTER A MACRON +102 LATIN CAPITAL LETTER A BREVE +103 LATIN SMALL LETTER A BREVE +104 LATIN CAPITAL LETTER A OGONEK +105 LATIN SMALL LETTER A OGONEK +106 LATIN CAPITAL LETTER C ACUTE +107 LATIN SMALL LETTER C ACUTE +108 LATIN CAPITAL LETTER C CIRCUMFLEX +109 LATIN SMALL LETTER C CIRCUMFLEX +10A LATIN CAPITAL LETTER C DOT +10B LATIN SMALL LETTER C DOT +10C LATIN CAPITAL LETTER C HACEK +10D LATIN SMALL LETTER C HACEK +10E LATIN CAPITAL LETTER D HACEK +10F LATIN SMALL LETTER D HACEK +110 LATIN CAPITAL LETTER D BAR +111 LATIN SMALL LETTER D BAR +112 LATIN CAPITAL LETTER E MACRON +113 LATIN SMALL LETTER E MACRON +114 LATIN CAPITAL LETTER E BREVE +115 LATIN SMALL LETTER E BREVE +116 LATIN CAPITAL LETTER E DOT +117 LATIN SMALL LETTER E DOT +118 LATIN CAPITAL LETTER E OGONEK +119 LATIN SMALL LETTER E OGONEK +11A LATIN CAPITAL LETTER E HACEK +11B LATIN SMALL LETTER E HACEK +11C LATIN CAPITAL LETTER G CIRCUMFLEX +11D LATIN SMALL LETTER G CIRCUMFLEX +11E LATIN CAPITAL LETTER G BREVE +11F LATIN SMALL LETTER G BREVE +120 LATIN CAPITAL LETTER G DOT +121 LATIN SMALL LETTER G DOT +122 LATIN CAPITAL LETTER G CEDILLA +123 LATIN SMALL LETTER G CEDILLA +124 LATIN CAPITAL LETTER H CIRCUMFLEX +125 LATIN SMALL LETTER H CIRCUMFLEX +126 LATIN CAPITAL LETTER H BAR +127 LATIN SMALL LETTER H BAR +128 LATIN CAPITAL LETTER I TILDE +129 LATIN SMALL LETTER I TILDE +12A LATIN CAPITAL LETTER I MACRON +12B LATIN SMALL LETTER I MACRON +12C LATIN CAPITAL LETTER I BREVE +12D LATIN SMALL LETTER I BREVE +12E LATIN CAPITAL LETTER I OGONEK +12F LATIN SMALL LETTER I OGONEK +130 LATIN CAPITAL LETTER I DOT +132 LATIN CAPITAL LETTER I J +133 LATIN SMALL LETTER I J +134 LATIN CAPITAL LETTER J CIRCUMFLEX +135 LATIN SMALL LETTER J CIRCUMFLEX +136 LATIN CAPITAL LETTER K CEDILLA +137 LATIN SMALL LETTER K CEDILLA +139 LATIN CAPITAL LETTER L ACUTE +13A LATIN SMALL LETTER L ACUTE +13B LATIN CAPITAL LETTER L CEDILLA +13C LATIN SMALL LETTER L CEDILLA +13D LATIN CAPITAL LETTER L HACEK +13E LATIN SMALL LETTER L HACEK +141 LATIN CAPITAL LETTER L SLASH +142 LATIN SMALL LETTER L SLASH +143 LATIN CAPITAL LETTER N ACUTE +144 LATIN SMALL LETTER N ACUTE +145 LATIN CAPITAL LETTER N CEDILLA +146 LATIN SMALL LETTER N CEDILLA +147 LATIN CAPITAL LETTER N HACEK +148 LATIN SMALL LETTER N HACEK +149 LATIN SMALL LETTER APOSTROPHE N +14C LATIN CAPITAL LETTER O MACRON +14D LATIN SMALL LETTER O MACRON +14E LATIN CAPITAL LETTER O BREVE +14F LATIN SMALL LETTER O BREVE +150 LATIN CAPITAL LETTER O DOUBLE ACUTE +151 LATIN SMALL LETTER O DOUBLE ACUTE +152 LATIN CAPITAL LETTER O E +153 LATIN SMALL LETTER O E +154 LATIN CAPITAL LETTER R ACUTE +155 LATIN SMALL LETTER R ACUTE +156 LATIN CAPITAL LETTER R CEDILLA +157 LATIN SMALL LETTER R CEDILLA +158 LATIN CAPITAL LETTER R HACEK +159 LATIN SMALL LETTER R HACEK +15A LATIN CAPITAL LETTER S ACUTE +15B LATIN SMALL LETTER S ACUTE +15C LATIN CAPITAL LETTER S CIRCUMFLEX +15D LATIN SMALL LETTER S CIRCUMFLEX +15E LATIN CAPITAL LETTER S CEDILLA +15F LATIN SMALL LETTER S CEDILLA +160 LATIN CAPITAL LETTER S HACEK +161 LATIN SMALL LETTER S HACEK +162 LATIN CAPITAL LETTER T CEDILLA +163 LATIN SMALL LETTER T CEDILLA +164 LATIN CAPITAL LETTER T HACEK +165 LATIN SMALL LETTER T HACEK +166 LATIN CAPITAL LETTER T BAR +167 LATIN SMALL LETTER T BAR +168 LATIN CAPITAL LETTER U TILDE +169 LATIN SMALL LETTER U TILDE +16A LATIN CAPITAL LETTER U MACRON +16B LATIN SMALL LETTER U MACRON +16C LATIN CAPITAL LETTER U BREVE +16D LATIN SMALL LETTER U BREVE +16E LATIN CAPITAL LETTER U RING +16F LATIN SMALL LETTER U RING +170 LATIN CAPITAL LETTER U DOUBLE ACUTE +171 LATIN SMALL LETTER U DOUBLE ACUTE +172 LATIN CAPITAL LETTER U OGONEK +173 LATIN SMALL LETTER U OGONEK +174 LATIN CAPITAL LETTER W CIRCUMFLEX +175 LATIN SMALL LETTER W CIRCUMFLEX +176 LATIN CAPITAL LETTER Y CIRCUMFLEX +177 LATIN SMALL LETTER Y CIRCUMFLEX +178 LATIN CAPITAL LETTER Y DIAERESIS +179 LATIN CAPITAL LETTER Z ACUTE +17A LATIN SMALL LETTER Z ACUTE +17B LATIN CAPITAL LETTER Z DOT +17C LATIN SMALL LETTER Z DOT +17D LATIN CAPITAL LETTER Z HACEK +17E LATIN SMALL LETTER Z HACEK +180 LATIN SMALL LETTER B BAR +181 LATIN CAPITAL LETTER B HOOK +182 LATIN CAPITAL LETTER B TOPBAR +183 LATIN SMALL LETTER B TOPBAR +187 LATIN CAPITAL LETTER C HOOK +188 LATIN SMALL LETTER C HOOK +18A LATIN CAPITAL LETTER D HOOK +18B LATIN CAPITAL LETTER D TOPBAR +18C LATIN SMALL LETTER D TOPBAR +18E LATIN CAPITAL LETTER TURNED E +190 LATIN CAPITAL LETTER EPSILON +191 LATIN CAPITAL LETTER F HOOK +192 LATIN SMALL LETTER SCRIPT F +193 LATIN CAPITAL LETTER G HOOK +195 LATIN SMALL LETTER H V +197 LATIN CAPITAL LETTER BARRED I +198 LATIN CAPITAL LETTER K HOOK +199 LATIN SMALL LETTER K HOOK +19A LATIN SMALL LETTER BARRED L +19B LATIN SMALL LETTER BARRED LAMBDA +19D LATIN CAPITAL LETTER N HOOK +19F LATIN CAPITAL LETTER BARRED O +1A0 LATIN CAPITAL LETTER O HORN +1A1 LATIN SMALL LETTER O HORN +1A2 LATIN CAPITAL LETTER O I +1A3 LATIN SMALL LETTER O I +1A4 LATIN CAPITAL LETTER P HOOK +1A5 LATIN SMALL LETTER P HOOK +1A6 LATIN LETTER Y R +1AB LATIN SMALL LETTER T PALATAL HOOK +1AC LATIN CAPITAL LETTER T HOOK +1AD LATIN SMALL LETTER T HOOK +1AE LATIN CAPITAL LETTER T RETROFLEX HOOK +1AF LATIN CAPITAL LETTER U HORN +1B0 LATIN SMALL LETTER U HORN +1B2 LATIN CAPITAL LETTER SCRIPT V +1B3 LATIN CAPITAL LETTER Y HOOK +1B4 LATIN SMALL LETTER Y HOOK +1B5 LATIN CAPITAL LETTER Z BAR +1B6 LATIN SMALL LETTER Z BAR +1B7 LATIN CAPITAL LETTER YOGH +1B8 LATIN CAPITAL LETTER REVERSED YOGH +1B9 LATIN SMALL LETTER REVERSED YOGH +1BA LATIN SMALL LETTER YOGH WITH TAIL +1BB LATIN LETTER TWO BAR +1BE LATIN LETTER INVERTED GLOTTAL STOP BAR +1C0 LATIN LETTER PIPE +1C1 LATIN LETTER DOUBLE PIPE +1C2 LATIN LETTER PIPE DOUBLE BAR +1C3 LATIN LETTER EXCLAMATION MARK +1C4 LATIN CAPITAL LETTER D Z HACEK +1C5 LATIN LETTER CAPITAL D SMALL Z HACEK +1C6 LATIN SMALL LETTER D Z HACEK +1C7 LATIN CAPITAL LETTER L J +1C8 LATIN LETTER CAPITAL L SMALL J +1C9 LATIN SMALL LETTER L J +1CA LATIN CAPITAL LETTER N J +1CB LATIN LETTER CAPITAL N SMALL J +1CC LATIN SMALL LETTER N J +1CD LATIN CAPITAL LETTER A HACEK +1CE LATIN SMALL LETTER A HACEK +1CF LATIN CAPITAL LETTER I HACEK +1D0 LATIN SMALL LETTER I HACEK +1D1 LATIN CAPITAL LETTER O HACEK +1D2 LATIN SMALL LETTER O HACEK +1D3 LATIN CAPITAL LETTER U HACEK +1D4 LATIN SMALL LETTER U HACEK +1D5 LATIN CAPITAL LETTER U DIAERESIS MACRON +1D6 LATIN SMALL LETTER U DIAERESIS MACRON +1D7 LATIN CAPITAL LETTER U DIAERESIS ACUTE +1D8 LATIN SMALL LETTER U DIAERESIS ACUTE +1D9 LATIN CAPITAL LETTER U DIAERESIS HACEK +1DA LATIN SMALL LETTER U DIAERESIS HACEK +1DB LATIN CAPITAL LETTER U DIAERESIS GRAVE +1DC LATIN SMALL LETTER U DIAERESIS GRAVE +1DE LATIN CAPITAL LETTER A DIAERESIS MACRON +1DF LATIN SMALL LETTER A DIAERESIS MACRON +1E0 LATIN CAPITAL LETTER A DOT MACRON +1E1 LATIN SMALL LETTER A DOT MACRON +1E2 LATIN CAPITAL LETTER A E MACRON +1E3 LATIN SMALL LETTER A E MACRON +1E4 LATIN CAPITAL LETTER G BAR +1E5 LATIN SMALL LETTER G BAR +1E6 LATIN CAPITAL LETTER G HACEK +1E7 LATIN SMALL LETTER G HACEK +1E8 LATIN CAPITAL LETTER K HACEK +1E9 LATIN SMALL LETTER K HACEK +1EA LATIN CAPITAL LETTER O OGONEK +1EB LATIN SMALL LETTER O OGONEK +1EC LATIN CAPITAL LETTER O OGONEK MACRON +1ED LATIN SMALL LETTER O OGONEK MACRON +1EE LATIN CAPITAL LETTER YOGH HACEK +1EF LATIN SMALL LETTER YOGH HACEK +1F0 LATIN SMALL LETTER J HACEK +251 LATIN SMALL LETTER SCRIPT A +252 LATIN SMALL LETTER TURNED SCRIPT A +253 LATIN SMALL LETTER B HOOK +255 LATIN SMALL LETTER C CURL +256 LATIN SMALL LETTER D RETROFLEX HOOK +257 LATIN SMALL LETTER D HOOK +25A LATIN SMALL LETTER SCHWA HOOK +25B LATIN SMALL LETTER EPSILON +25C LATIN SMALL LETTER REVERSED EPSILON +25D LATIN SMALL LETTER REVERSED EPSILON HOOK +25E LATIN SMALL LETTER CLOSED REVERSED EPSILON +25F LATIN SMALL LETTER DOTLESS J BAR +260 LATIN SMALL LETTER G HOOK +264 LATIN SMALL LETTER BABY GAMMA +266 LATIN SMALL LETTER H HOOK +267 LATIN SMALL LETTER HENG HOOK +268 LATIN SMALL LETTER BARRED I +26C LATIN SMALL LETTER L BELT +26D LATIN SMALL LETTER L RETROFLEX HOOK +26E LATIN SMALL LETTER L YOGH +271 LATIN SMALL LETTER M HOOK +272 LATIN SMALL LETTER N HOOK +273 LATIN SMALL LETTER N RETROFLEX HOOK +276 LATIN LETTER SMALL CAPITAL O E +27B LATIN SMALL LETTER TURNED R HOOK +27D LATIN SMALL LETTER R HOOK +27E LATIN SMALL LETTER FISHHOOK R +27F LATIN SMALL LETTER REVERSED FISHHOOK R +282 LATIN SMALL LETTER S HOOK +284 LATIN SMALL LETTER DOTLESS J BAR HOOK +286 LATIN SMALL LETTER ESH CURL +288 LATIN SMALL LETTER T RETROFLEX HOOK +28B LATIN SMALL LETTER SCRIPT V +290 LATIN SMALL LETTER Z RETROFLEX HOOK +291 LATIN SMALL LETTER Z CURL +292 LATIN SMALL LETTER YOGH +293 LATIN SMALL LETTER YOGH CURL +295 LATIN LETTER REVERSED GLOTTAL STOP +298 LATIN LETTER BULLSEYE +29A LATIN SMALL LETTER CLOSED EPSILON +29B LATIN LETTER SMALL CAPITAL G HOOK +29D LATIN SMALL LETTER CROSSED-TAIL J +2A0 LATIN SMALL LETTER Q HOOK +2A1 LATIN LETTER GLOTTAL STOP BAR +2A2 LATIN LETTER REVERSED GLOTTAL STOP BAR +2A3 LATIN SMALL LETTER D Z +2A4 LATIN SMALL LETTER D YOGH +2A5 LATIN SMALL LETTER D Z CURL +2A6 LATIN SMALL LETTER T S +2A7 LATIN SMALL LETTER T ESH +2A8 LATIN SMALL LETTER T C CURL +2B1 MODIFIER LETTER SMALL H HOOK +2B5 MODIFIER LETTER SMALL TURNED R HOOK +2C6 MODIFIER LETTER CIRCUMFLEX +2C7 MODIFIER LETTER HACEK +2CA MODIFIER LETTER ACUTE +2CB MODIFIER LETTER GRAVE +2CE MODIFIER LETTER LOW GRAVE +2CF MODIFIER LETTER LOW ACUTE +2D2 MODIFIER LETTER CENTERED RIGHT HALF RING +2D3 MODIFIER LETTER CENTERED LEFT HALF RING +2D8 SPACING BREVE +2D9 SPACING DOT ABOVE +2DA SPACING RING ABOVE +2DB SPACING OGONEK +2DC SPACING TILDE +2DD SPACING DOUBLE ACUTE +300 NON-SPACING GRAVE +301 NON-SPACING ACUTE +302 NON-SPACING CIRCUMFLEX +303 NON-SPACING TILDE +304 NON-SPACING MACRON +305 NON-SPACING OVERSCORE +306 NON-SPACING BREVE +307 NON-SPACING DOT ABOVE +308 NON-SPACING DIAERESIS +309 NON-SPACING HOOK ABOVE +30A NON-SPACING RING ABOVE +30B NON-SPACING DOUBLE ACUTE +30C NON-SPACING HACEK +30D NON-SPACING VERTICAL LINE ABOVE +30E NON-SPACING DOUBLE VERTICAL LINE ABOVE +30F NON-SPACING DOUBLE GRAVE +310 NON-SPACING CANDRABINDU +311 NON-SPACING INVERTED BREVE +312 NON-SPACING TURNED COMMA ABOVE +313 NON-SPACING COMMA ABOVE +314 NON-SPACING REVERSED COMMA ABOVE +315 NON-SPACING COMMA ABOVE RIGHT +316 NON-SPACING GRAVE BELOW +317 NON-SPACING ACUTE BELOW +318 NON-SPACING LEFT TACK BELOW +319 NON-SPACING RIGHT TACK BELOW +31A NON-SPACING LEFT ANGLE ABOVE +31B NON-SPACING HORN +31C NON-SPACING LEFT HALF RING BELOW +31D NON-SPACING UP TACK BELOW +31E NON-SPACING DOWN TACK BELOW +31F NON-SPACING PLUS SIGN BELOW +320 NON-SPACING MINUS SIGN BELOW +321 NON-SPACING PALATALIZED HOOK BELOW +322 NON-SPACING RETROFLEX HOOK BELOW +323 NON-SPACING DOT BELOW +324 NON-SPACING DOUBLE DOT BELOW +325 NON-SPACING RING BELOW +326 NON-SPACING COMMA BELOW +327 NON-SPACING CEDILLA +328 NON-SPACING OGONEK +329 NON-SPACING VERTICAL LINE BELOW +32A NON-SPACING BRIDGE BELOW +32B NON-SPACING INVERTED DOUBLE ARCH BELOW +32C NON-SPACING HACEK BELOW +32D NON-SPACING CIRCUMFLEX BELOW +32E NON-SPACING BREVE BELOW +32F NON-SPACING INVERTED BREVE BELOW +330 NON-SPACING TILDE BELOW +331 NON-SPACING MACRON BELOW +332 NON-SPACING UNDERSCORE +333 NON-SPACING DOUBLE UNDERSCORE +334 NON-SPACING TILDE OVERLAY +335 NON-SPACING SHORT BAR OVERLAY +336 NON-SPACING LONG BAR OVERLAY +337 NON-SPACING SHORT SLASH OVERLAY +338 NON-SPACING LONG SLASH OVERLAY +339 NON-SPACING RIGHT HALF RING BELOW +33A NON-SPACING INVERTED BRIDGE BELOW +33B NON-SPACING SQUARE BELOW +33C NON-SPACING SEAGULL BELOW +33D NON-SPACING X ABOVE +33E NON-SPACING VERTICAL TILDE +33F NON-SPACING DOUBLE OVERSCORE +340 NON-SPACING GRAVE TONE MARK +341 NON-SPACING ACUTE TONE MARK +344 GREEK NON-SPACING DIAERESIS TONOS +345 GREEK NON-SPACING IOTA BELOW +374 GREEK UPPER NUMERAL SIGN +37A GREEK SPACING IOTA BELOW +384 GREEK SPACING TONOS +385 GREEK SPACING DIAERESIS TONOS +386 GREEK CAPITAL LETTER ALPHA TONOS +388 GREEK CAPITAL LETTER EPSILON TONOS +389 GREEK CAPITAL LETTER ETA TONOS +38A GREEK CAPITAL LETTER IOTA TONOS +38C GREEK CAPITAL LETTER OMICRON TONOS +38E GREEK CAPITAL LETTER UPSILON TONOS +38F GREEK CAPITAL LETTER OMEGA TONOS +390 GREEK SMALL LETTER IOTA DIAERESIS TONOS +39B GREEK CAPITAL LETTER LAMBDA +3AA GREEK CAPITAL LETTER IOTA DIAERESIS +3AB GREEK CAPITAL LETTER UPSILON DIAERESIS +3AC GREEK SMALL LETTER ALPHA TONOS +3AD GREEK SMALL LETTER EPSILON TONOS +3AE GREEK SMALL LETTER ETA TONOS +3AF GREEK SMALL LETTER IOTA TONOS +3B0 GREEK SMALL LETTER UPSILON DIAERESIS TONOS +3BB GREEK SMALL LETTER LAMBDA +3CA GREEK SMALL LETTER IOTA DIAERESIS +3CB GREEK SMALL LETTER UPSILON DIAERESIS +3CC GREEK SMALL LETTER OMICRON TONOS +3CD GREEK SMALL LETTER UPSILON TONOS +3CE GREEK SMALL LETTER OMEGA TONOS +3D0 GREEK SMALL LETTER CURLED BETA +3D1 GREEK SMALL LETTER SCRIPT THETA +3D2 GREEK CAPITAL LETTER UPSILON HOOK +3D3 GREEK CAPITAL LETTER UPSILON HOOK TONOS +3D4 GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS +3D5 GREEK SMALL LETTER SCRIPT PHI +3D6 GREEK SMALL LETTER OMEGA PI +3DA GREEK CAPITAL LETTER STIGMA +3DC GREEK CAPITAL LETTER DIGAMMA +3DE GREEK CAPITAL LETTER KOPPA +3E0 GREEK CAPITAL LETTER SAMPI +3E2 GREEK CAPITAL LETTER SHEI +3E3 GREEK SMALL LETTER SHEI +3E4 GREEK CAPITAL LETTER FEI +3E5 GREEK SMALL LETTER FEI +3E6 GREEK CAPITAL LETTER KHEI +3E7 GREEK SMALL LETTER KHEI +3E8 GREEK CAPITAL LETTER HORI +3E9 GREEK SMALL LETTER HORI +3EA GREEK CAPITAL LETTER GANGIA +3EB GREEK SMALL LETTER GANGIA +3EC GREEK CAPITAL LETTER SHIMA +3ED GREEK SMALL LETTER SHIMA +3EE GREEK CAPITAL LETTER DEI +3EF GREEK SMALL LETTER DEI +3F0 GREEK SMALL LETTER SCRIPT KAPPA +3F1 GREEK SMALL LETTER TAILED RHO +3F2 GREEK SMALL LETTER LUNATE SIGMA +404 CYRILLIC CAPITAL LETTER E +406 CYRILLIC CAPITAL LETTER I +413 CYRILLIC CAPITAL LETTER GE +418 CYRILLIC CAPITAL LETTER II +419 CYRILLIC CAPITAL LETTER SHORT II +425 CYRILLIC CAPITAL LETTER KHA +42B CYRILLIC CAPITAL LETTER YERI +42D CYRILLIC CAPITAL LETTER REVERSED E +42E CYRILLIC CAPITAL LETTER IU +42F CYRILLIC CAPITAL LETTER IA +433 CYRILLIC SMALL LETTER GE +438 CYRILLIC SMALL LETTER II +439 CYRILLIC SMALL LETTER SHORT II +445 CYRILLIC SMALL LETTER KHA +44B CYRILLIC SMALL LETTER YERI +44D CYRILLIC SMALL LETTER REVERSED E +44E CYRILLIC SMALL LETTER IU +44F CYRILLIC SMALL LETTER IA +454 CYRILLIC SMALL LETTER E +456 CYRILLIC SMALL LETTER I +476 CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE +477 CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE +478 CYRILLIC CAPITAL LETTER UK DIGRAPH +479 CYRILLIC SMALL LETTER UK DIGRAPH +47C CYRILLIC CAPITAL LETTER OMEGA TITLO +47D CYRILLIC SMALL LETTER OMEGA TITLO +483 CYRILLIC NON-SPACING TITLO +484 CYRILLIC NON-SPACING PALATALIZATION +485 CYRILLIC NON-SPACING DASIA PNEUMATA +486 CYRILLIC NON-SPACING PSILI PNEUMATA +490 CYRILLIC CAPITAL LETTER GE WITH UPTURN +491 CYRILLIC SMALL LETTER GE WITH UPTURN +492 CYRILLIC CAPITAL LETTER GE BAR +493 CYRILLIC SMALL LETTER GE BAR +494 CYRILLIC CAPITAL LETTER GE HOOK +495 CYRILLIC SMALL LETTER GE HOOK +496 CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER +497 CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER +498 CYRILLIC CAPITAL LETTER ZE CEDILLA +499 CYRILLIC SMALL LETTER ZE CEDILLA +49A CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER +49B CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER +49C CYRILLIC CAPITAL LETTER KA VERTICAL BAR +49D CYRILLIC SMALL LETTER KA VERTICAL BAR +49E CYRILLIC CAPITAL LETTER KA BAR +49F CYRILLIC SMALL LETTER KA BAR +4A0 CYRILLIC CAPITAL LETTER REVERSED GE KA +4A1 CYRILLIC SMALL LETTER REVERSED GE KA +4A2 CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER +4A3 CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER +4A4 CYRILLIC CAPITAL LETTER EN GE +4A5 CYRILLIC SMALL LETTER EN GE +4A6 CYRILLIC CAPITAL LETTER PE HOOK +4A7 CYRILLIC SMALL LETTER PE HOOK +4A8 CYRILLIC CAPITAL LETTER O HOOK +4A9 CYRILLIC SMALL LETTER O HOOK +4AA CYRILLIC CAPITAL LETTER ES CEDILLA +4AB CYRILLIC SMALL LETTER ES CEDILLA +4AC CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER +4AD CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER +4B0 CYRILLIC CAPITAL LETTER STRAIGHT U BAR +4B1 CYRILLIC SMALL LETTER STRAIGHT U BAR +4B2 CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER +4B3 CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER +4B4 CYRILLIC CAPITAL LETTER TE TSE +4B5 CYRILLIC SMALL LETTER TE TSE +4B6 CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER +4B7 CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER +4B8 CYRILLIC CAPITAL LETTER CHE VERTICAL BAR +4B9 CYRILLIC SMALL LETTER CHE VERTICAL BAR +4BA CYRILLIC CAPITAL LETTER H +4BB CYRILLIC SMALL LETTER H +4BC CYRILLIC CAPITAL LETTER IE HOOK +4BD CYRILLIC SMALL LETTER IE HOOK +4BE CYRILLIC CAPITAL LETTER IE HOOK OGONEK +4BF CYRILLIC SMALL LETTER IE HOOK OGONEK +4C0 CYRILLIC LETTER I +4C1 CYRILLIC CAPITAL LETTER SHORT ZHE +4C2 CYRILLIC SMALL LETTER SHORT ZHE +4C3 CYRILLIC CAPITAL LETTER KA HOOK +4C4 CYRILLIC SMALL LETTER KA HOOK +4C7 CYRILLIC CAPITAL LETTER EN HOOK +4C8 CYRILLIC SMALL LETTER EN HOOK +4CB CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER +4CC CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER +542 ARMENIAN CAPITAL LETTER LAD +55A ARMENIAN MODIFIER LETTER RIGHT HALF RING +572 ARMENIAN SMALL LETTER LAD +589 ARMENIAN PERIOD +5BC HEBREW POINT DAGESH +5C0 HEBREW POINT PASEQ +5F0 HEBREW LETTER DOUBLE VAV +5F1 HEBREW LETTER VAV YOD +5F2 HEBREW LETTER DOUBLE YOD +621 ARABIC LETTER HAMZAH +622 ARABIC LETTER MADDAH ON ALEF +623 ARABIC LETTER HAMZAH ON ALEF +624 ARABIC LETTER HAMZAH ON WAW +625 ARABIC LETTER HAMZAH UNDER ALEF +626 ARABIC LETTER HAMZAH ON YA +628 ARABIC LETTER BAA +629 ARABIC LETTER TAA MARBUTAH +62A ARABIC LETTER TAA +62B ARABIC LETTER THAA +62D ARABIC LETTER HAA +62E ARABIC LETTER KHAA +631 ARABIC LETTER RA +638 ARABIC LETTER DHAH +641 ARABIC LETTER FA +643 ARABIC LETTER CAF +647 ARABIC LETTER HA +649 ARABIC LETTER ALEF MAQSURAH +64A ARABIC LETTER YA +64E ARABIC FATHAH +64F ARABIC DAMMAH +650 ARABIC KASRAH +651 ARABIC SHADDAH +670 ARABIC ALEF ABOVE +671 ARABIC LETTER HAMZAT WASL ON ALEF +672 ARABIC LETTER WAVY HAMZAH ON ALEF +673 ARABIC LETTER WAVY HAMZAH UNDER ALEF +674 ARABIC LETTER HIGH HAMZAH +675 ARABIC LETTER HIGH HAMZAH ALEF +676 ARABIC LETTER HIGH HAMZAH WAW +677 ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH +678 ARABIC LETTER HIGH HAMZAH YA +679 ARABIC LETTER TAA WITH SMALL TAH +67A ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE +67B ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW +67C ARABIC LETTER TAA WITH RING +67D ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD +67E ARABIC LETTER TAA WITH THREE DOTS BELOW +67F ARABIC LETTER TAA WITH FOUR DOTS ABOVE +680 ARABIC LETTER BAA WITH FOUR DOTS BELOW +681 ARABIC LETTER HAMZAH ON HAA +682 ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE +683 ARABIC LETTER HAA WITH MIDDLE TWO DOTS +684 ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL +685 ARABIC LETTER HAA WITH THREE DOTS ABOVE +686 ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD +687 ARABIC LETTER HAA WITH MIDDLE FOUR DOTS +688 ARABIC LETTER DAL WITH SMALL TAH +68C ARABIC LETTER DAL WITH TWO DOTS ABOVE +68D ARABIC LETTER DAL WITH TWO DOTS BELOW +68E ARABIC LETTER DAL WITH THREE DOTS ABOVE +68F ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD +691 ARABIC LETTER RA WITH SMALL TAH +692 ARABIC LETTER RA WITH SMALL V +693 ARABIC LETTER RA WITH RING +694 ARABIC LETTER RA WITH DOT BELOW +695 ARABIC LETTER RA WITH SMALL V BELOW +696 ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE +697 ARABIC LETTER RA WITH TWO DOTS ABOVE +698 ARABIC LETTER RA WITH THREE DOTS ABOVE +699 ARABIC LETTER RA WITH FOUR DOTS ABOVE +6A1 ARABIC LETTER DOTLESS FA +6A2 ARABIC LETTER FA WITH DOT MOVED BELOW +6A3 ARABIC LETTER FA WITH DOT BELOW +6A4 ARABIC LETTER FA WITH THREE DOTS ABOVE +6A5 ARABIC LETTER FA WITH THREE DOTS BELOW +6A6 ARABIC LETTER FA WITH FOUR DOTS ABOVE +6A9 ARABIC LETTER OPEN CAF +6AA ARABIC LETTER SWASH CAF +6AB ARABIC LETTER CAF WITH RING +6AC ARABIC LETTER CAF WITH DOT ABOVE +6AD ARABIC LETTER CAF WITH THREE DOTS ABOVE +6AE ARABIC LETTER CAF WITH THREE DOTS BELOW +6B1 ARABIC LETTER GAF WITH TWO DOTS ABOVE +6B3 ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW +6BA ARABIC LETTER DOTLESS NOON +6BB ARABIC LETTER DOTLESS NOON WITH SMALL TAH +6BE ARABIC LETTER KNOTTED HA +6C0 ARABIC LETTER HAMZAH ON HA +6C1 ARABIC LETTER HA GOAL +6C2 ARABIC LETTER HAMZAH ON HA GOAL +6C3 ARABIC LETTER TAA MARBUTAH GOAL +6C5 ARABIC LETTER WAW WITH BAR +6C6 ARABIC LETTER WAW WITH SMALL V +6C7 ARABIC LETTER WAW WITH DAMMAH +6C8 ARABIC LETTER WAW WITH ALEF ABOVE +6C9 ARABIC LETTER WAW WITH INVERTED SMALL V +6CB ARABIC LETTER WAW WITH THREE DOTS ABOVE +6CC ARABIC LETTER DOTLESS YA +6CD ARABIC LETTER YA WITH TAIL +6CE ARABIC LETTER YA WITH SMALL V +6D0 ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW +6D1 ARABIC LETTER YA WITH THREE DOTS BELOW +6D2 ARABIC LETTER YA BARREE +6D3 ARABIC LETTER HAMZAH ON YA BARREE +6D4 ARABIC PERIOD +6F0 EASTERN ARABIC-INDIC DIGIT ZERO +6F1 EASTERN ARABIC-INDIC DIGIT ONE +6F2 EASTERN ARABIC-INDIC DIGIT TWO +6F3 EASTERN ARABIC-INDIC DIGIT THREE +6F4 EASTERN ARABIC-INDIC DIGIT FOUR +6F5 EASTERN ARABIC-INDIC DIGIT FIVE +6F6 EASTERN ARABIC-INDIC DIGIT SIX +6F7 EASTERN ARABIC-INDIC DIGIT SEVEN +6F8 EASTERN ARABIC-INDIC DIGIT EIGHT +6F9 EASTERN ARABIC-INDIC DIGIT NINE +9F1 BENGALI LETTER VA WITH LOWER DIAGONAL +E01 THAI LETTER KO KAI +E02 THAI LETTER KHO KHAI +E03 THAI LETTER KHO KHUAT +E04 THAI LETTER KHO KHWAI +E05 THAI LETTER KHO KHON +E06 THAI LETTER KHO RAKHANG +E07 THAI LETTER NGO NGU +E08 THAI LETTER CHO CHAN +E09 THAI LETTER CHO CHING +E0A THAI LETTER CHO CHANG +E0B THAI LETTER SO SO +E0C THAI LETTER CHO CHOE +E0D THAI LETTER YO YING +E0E THAI LETTER DO CHADA +E0F THAI LETTER TO PATAK +E10 THAI LETTER THO THAN +E11 THAI LETTER THO NANGMONTHO +E12 THAI LETTER THO PHUTHAO +E13 THAI LETTER NO NEN +E14 THAI LETTER DO DEK +E15 THAI LETTER TO TAO +E16 THAI LETTER THO THUNG +E17 THAI LETTER THO THAHAN +E18 THAI LETTER THO THONG +E19 THAI LETTER NO NU +E1A THAI LETTER BO BAIMAI +E1B THAI LETTER PO PLA +E1C THAI LETTER PHO PHUNG +E1D THAI LETTER FO FA +E1E THAI LETTER PHO PHAN +E1F THAI LETTER FO FAN +E20 THAI LETTER PHO SAMPHAO +E21 THAI LETTER MO MA +E22 THAI LETTER YO YAK +E23 THAI LETTER RO RUA +E24 THAI LETTER RU +E25 THAI LETTER LO LING +E26 THAI LETTER LU +E27 THAI LETTER WO WAEN +E28 THAI LETTER SO SALA +E29 THAI LETTER SO RUSI +E2A THAI LETTER SO SUA +E2B THAI LETTER HO HIP +E2C THAI LETTER LO CHULA +E2D THAI LETTER O ANG +E2E THAI LETTER HO NOK HUK +E2F THAI PAI YAN NOI +E30 THAI VOWEL SIGN SARA A +E31 THAI VOWEL SIGN MAI HAN-AKAT +E32 THAI VOWEL SIGN SARA AA +E33 THAI VOWEL SIGN SARA AM +E34 THAI VOWEL SIGN SARA I +E35 THAI VOWEL SIGN SARA II +E36 THAI VOWEL SIGN SARA UE +E37 THAI VOWEL SIGN SARA UEE +E38 THAI VOWEL SIGN SARA U +E39 THAI VOWEL SIGN SARA UU +E3A THAI VOWEL SIGN PHINTHU +E3F THAI BAHT SIGN +E40 THAI VOWEL SIGN SARA E +E41 THAI VOWEL SIGN SARA AE +E42 THAI VOWEL SIGN SARA O +E43 THAI VOWEL SIGN SARA MAI MUAN +E44 THAI VOWEL SIGN SARA MAI MALAI +E45 THAI LAK KHANG YAO +E46 THAI MAI YAMOK +E47 THAI VOWEL SIGN MAI TAI KHU +E48 THAI TONE MAI EK +E49 THAI TONE MAI THO +E4A THAI TONE MAI TRI +E4B THAI TONE MAI CHATTAWA +E4C THAI THANTHAKHAT +E4D THAI NIKKHAHIT +E4E THAI YAMAKKAN +E4F THAI FONGMAN +E5A THAI ANGKHANKHU +E5B THAI KHOMUT +F04 TIBETAN SINGLE ORNAMENT +F08 TIBETAN RGYANSHAD +F0B TIBETAN TSEG +F0D TIBETAN SHAD +F0E TIBETAN DOUBLE SHAD +F11 TIBETAN RINCHANPHUNGSHAD +F14 TIBETAN COMMA +F35 TIBETAN HONORIFIC UNDER RING +F37 TIBETAN UNDER RING +F39 TIBETAN LENITION MARK +F3C TIBETAN LEFT BRACE +F3D TIBETAN RIGHT BRACE +F4A TIBETAN LETTER REVERSED TA +F4B TIBETAN LETTER REVERSED THA +F4C TIBETAN LETTER REVERSED DA +F4E TIBETAN LETTER REVERSED NA +F60 TIBETAN LETTER AA +F65 TIBETAN LETTER REVERSED SHA +F7B TIBETAN VOWEL SIGN AI +F7D TIBETAN VOWEL SIGN AU +F7E TIBETAN ANUSVARA +F7F TIBETAN VISARGA +F80 TIBETAN VOWEL SIGN SHORT I +F82 TIBETAN CANDRABINDU WITH ORNAMENT +F83 TIBETAN CANDRABINDU +F84 TIBETAN VIRAMA +F85 TIBETAN CHUCHENYIGE +10D0 GEORGIAN SMALL LETTER AN +10D1 GEORGIAN SMALL LETTER BAN +10D2 GEORGIAN SMALL LETTER GAN +10D3 GEORGIAN SMALL LETTER DON +10D4 GEORGIAN SMALL LETTER EN +10D5 GEORGIAN SMALL LETTER VIN +10D6 GEORGIAN SMALL LETTER ZEN +10D7 GEORGIAN SMALL LETTER TAN +10D8 GEORGIAN SMALL LETTER IN +10D9 GEORGIAN SMALL LETTER KAN +10DA GEORGIAN SMALL LETTER LAS +10DB GEORGIAN SMALL LETTER MAN +10DC GEORGIAN SMALL LETTER NAR +10DD GEORGIAN SMALL LETTER ON +10DE GEORGIAN SMALL LETTER PAR +10DF GEORGIAN SMALL LETTER ZHAR +10E0 GEORGIAN SMALL LETTER RAE +10E1 GEORGIAN SMALL LETTER SAN +10E2 GEORGIAN SMALL LETTER TAR +10E3 GEORGIAN SMALL LETTER UN +10E4 GEORGIAN SMALL LETTER PHAR +10E5 GEORGIAN SMALL LETTER KHAR +10E6 GEORGIAN SMALL LETTER GHAN +10E7 GEORGIAN SMALL LETTER QAR +10E8 GEORGIAN SMALL LETTER SHIN +10E9 GEORGIAN SMALL LETTER CHIN +10EA GEORGIAN SMALL LETTER CAN +10EB GEORGIAN SMALL LETTER JIL +10EC GEORGIAN SMALL LETTER CIL +10ED GEORGIAN SMALL LETTER CHAR +10EE GEORGIAN SMALL LETTER XAN +10EF GEORGIAN SMALL LETTER JHAN +10F0 GEORGIAN SMALL LETTER HAE +10F1 GEORGIAN SMALL LETTER HE +10F2 GEORGIAN SMALL LETTER HIE +10F3 GEORGIAN SMALL LETTER WE +10F4 GEORGIAN SMALL LETTER HAR +10F5 GEORGIAN SMALL LETTER HOE +10F6 GEORGIAN SMALL LETTER FI +2015 QUOTATION DASH +2016 DOUBLE VERTICAL BAR +2017 SPACING DOUBLE UNDERSCORE +2018 SINGLE TURNED COMMA QUOTATION MARK +2019 SINGLE COMMA QUOTATION MARK +201A LOW SINGLE COMMA QUOTATION MARK +201B SINGLE REVERSED COMMA QUOTATION MARK +201C DOUBLE TURNED COMMA QUOTATION MARK +201D DOUBLE COMMA QUOTATION MARK +201E LOW DOUBLE COMMA QUOTATION MARK +201F DOUBLE REVERSED COMMA QUOTATION MARK +2039 LEFT POINTING SINGLE GUILLEMET +203A RIGHT POINTING SINGLE GUILLEMET +203E SPACING OVERSCORE +2070 SUPERSCRIPT DIGIT ZERO +2074 SUPERSCRIPT DIGIT FOUR +2075 SUPERSCRIPT DIGIT FIVE +2076 SUPERSCRIPT DIGIT SIX +2077 SUPERSCRIPT DIGIT SEVEN +2078 SUPERSCRIPT DIGIT EIGHT +2079 SUPERSCRIPT DIGIT NINE +207B SUPERSCRIPT HYPHEN-MINUS +207D SUPERSCRIPT OPENING PARENTHESIS +207E SUPERSCRIPT CLOSING PARENTHESIS +2080 SUBSCRIPT DIGIT ZERO +2081 SUBSCRIPT DIGIT ONE +2082 SUBSCRIPT DIGIT TWO +2083 SUBSCRIPT DIGIT THREE +2084 SUBSCRIPT DIGIT FOUR +2085 SUBSCRIPT DIGIT FIVE +2086 SUBSCRIPT DIGIT SIX +2087 SUBSCRIPT DIGIT SEVEN +2088 SUBSCRIPT DIGIT EIGHT +2089 SUBSCRIPT DIGIT NINE +208B SUBSCRIPT HYPHEN-MINUS +208D SUBSCRIPT OPENING PARENTHESIS +208E SUBSCRIPT CLOSING PARENTHESIS +20D0 NON-SPACING LEFT HARPOON ABOVE +20D1 NON-SPACING RIGHT HARPOON ABOVE +20D2 NON-SPACING LONG VERTICAL BAR OVERLAY +20D3 NON-SPACING SHORT VERTICAL BAR OVERLAY +20D4 NON-SPACING ANTICLOCKWISE ARROW ABOVE +20D5 NON-SPACING CLOCKWISE ARROW ABOVE +20D6 NON-SPACING LEFT ARROW ABOVE +20D7 NON-SPACING RIGHT ARROW ABOVE +20D8 NON-SPACING RING OVERLAY +20D9 NON-SPACING CLOCKWISE RING OVERLAY +20DA NON-SPACING ANTICLOCKWISE RING OVERLAY +20DB NON-SPACING THREE DOTS ABOVE +20DC NON-SPACING FOUR DOTS ABOVE +20DD ENCLOSING CIRCLE +20DE ENCLOSING SQUARE +20DF ENCLOSING DIAMOND +20E0 ENCLOSING CIRCLE SLASH +20E1 NON-SPACING LEFT RIGHT ARROW ABOVE +2102 DOUBLE-STRUCK C +2103 DEGREES CENTIGRADE +2104 C L SYMBOL +2107 EULERS +2109 DEGREES FAHRENHEIT +210B SCRIPT H +210C BLACK-LETTER H +210D DOUBLE-STRUCK H +210F PLANCK CONSTANT OVER 2 PI +2110 SCRIPT I +2111 BLACK-LETTER I +2112 SCRIPT L +2115 DOUBLE-STRUCK N +2116 NUMERO +2118 SCRIPT P +2119 DOUBLE-STRUCK P +211A DOUBLE-STRUCK Q +211B SCRIPT R +211C BLACK-LETTER R +211D DOUBLE-STRUCK R +2121 T E L SYMBOL +2122 TRADEMARK +2124 DOUBLE-STRUCK Z +2125 OUNCE +2126 OHM +2127 MHO +2128 BLACK-LETTER Z +212A DEGREES KELVIN +212B ANGSTROM UNIT +212C SCRIPT B +212D BLACK-LETTER C +2130 SCRIPT E +2131 SCRIPT F +2132 TURNED F +2133 SCRIPT M +2135 FIRST TRANSFINITE CARDINAL +2136 SECOND TRANSFINITE CARDINAL +2137 THIRD TRANSFINITE CARDINAL +2138 FOURTH TRANSFINITE CARDINAL +2153 FRACTION ONE THIRD +2154 FRACTION TWO THIRDS +2155 FRACTION ONE FIFTH +2156 FRACTION TWO FIFTHS +2157 FRACTION THREE FIFTHS +2158 FRACTION FOUR FIFTHS +2159 FRACTION ONE SIXTH +215A FRACTION FIVE SIXTHS +215B FRACTION ONE EIGHTH +215C FRACTION THREE EIGHTHS +215D FRACTION FIVE EIGHTHS +215E FRACTION SEVEN EIGHTHS +2190 LEFT ARROW +2191 UP ARROW +2192 RIGHT ARROW +2193 DOWN ARROW +2196 UPPER LEFT ARROW +2197 UPPER RIGHT ARROW +2198 LOWER RIGHT ARROW +2199 LOWER LEFT ARROW +219A LEFT ARROW WITH STROKE +219B RIGHT ARROW WITH STROKE +219C LEFT WAVE ARROW +219D RIGHT WAVE ARROW +219E LEFT TWO HEADED ARROW +219F UP TWO HEADED ARROW +21A0 RIGHT TWO HEADED ARROW +21A1 DOWN TWO HEADED ARROW +21A2 LEFT ARROW WITH TAIL +21A3 RIGHT ARROW WITH TAIL +21A4 LEFT ARROW FROM BAR +21A5 UP ARROW FROM BAR +21A6 RIGHT ARROW FROM BAR +21A7 DOWN ARROW FROM BAR +21A9 LEFT ARROW WITH HOOK +21AA RIGHT ARROW WITH HOOK +21AB LEFT ARROW WITH LOOP +21AC RIGHT ARROW WITH LOOP +21AF DOWN ZIGZAG ARROW +21B0 UP ARROW WITH TIP LEFT +21B1 UP ARROW WITH TIP RIGHT +21B2 DOWN ARROW WITH TIP LEFT +21B3 DOWN ARROW WITH TIP RIGHT +21B4 RIGHT ARROW WITH CORNER DOWN +21B5 DOWN ARROW WITH CORNER LEFT +21B8 UPPER LEFT ARROW TO LONG BAR +21B9 LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR +21BC LEFT HARPOON WITH BARB UP +21BD LEFT HARPOON WITH BARB DOWN +21BE UP HARPOON WITH BARB RIGHT +21BF UP HARPOON WITH BARB LEFT +21C0 RIGHT HARPOON WITH BARB UP +21C1 RIGHT HARPOON WITH BARB DOWN +21C2 DOWN HARPOON WITH BARB RIGHT +21C3 DOWN HARPOON WITH BARB LEFT +21C4 RIGHT ARROW OVER LEFT ARROW +21C5 UP ARROW LEFT OF DOWN ARROW +21C6 LEFT ARROW OVER RIGHT ARROW +21C7 LEFT PAIRED ARROWS +21C8 UP PAIRED ARROWS +21C9 RIGHT PAIRED ARROWS +21CA DOWN PAIRED ARROWS +21CB LEFT HARPOON OVER RIGHT HARPOON +21CC RIGHT HARPOON OVER LEFT HARPOON +21CD LEFT DOUBLE ARROW WITH STROKE +21CF RIGHT DOUBLE ARROW WITH STROKE +21D0 LEFT DOUBLE ARROW +21D1 UP DOUBLE ARROW +21D2 RIGHT DOUBLE ARROW +21D3 DOWN DOUBLE ARROW +21D6 UPPER LEFT DOUBLE ARROW +21D7 UPPER RIGHT DOUBLE ARROW +21D8 LOWER RIGHT DOUBLE ARROW +21D9 LOWER LEFT DOUBLE ARROW +21DA LEFT TRIPLE ARROW +21DB RIGHT TRIPLE ARROW +21DC LEFT SQUIGGLE ARROW +21DD RIGHT SQUIGGLE ARROW +21DE UP ARROW WITH DOUBLE STROKE +21DF DOWN ARROW WITH DOUBLE STROKE +21E0 LEFT DASHED ARROW +21E1 UP DASHED ARROW +21E2 RIGHT DASHED ARROW +21E3 DOWN DASHED ARROW +21E4 LEFT ARROW TO BAR +21E5 RIGHT ARROW TO BAR +21E6 WHITE LEFT ARROW +21E7 WHITE UP ARROW +21E8 WHITE RIGHT ARROW +21E9 WHITE DOWN ARROW +21EA WHITE UP ARROW FROM BAR +2254 COLON EQUAL +2255 EQUAL COLON +2264 LESS THAN OR EQUAL TO +2265 GREATER THAN OR EQUAL TO +2266 LESS THAN OVER EQUAL TO +2267 GREATER THAN OVER EQUAL TO +2268 LESS THAN BUT NOT EQUAL TO +2269 GREATER THAN BUT NOT EQUAL TO +226A MUCH LESS THAN +226B MUCH GREATER THAN +226E NOT LESS THAN +226F NOT GREATER THAN +2270 NEITHER LESS THAN NOR EQUAL TO +2271 NEITHER GREATER THAN NOR EQUAL TO +2272 LESS THAN OR EQUIVALENT TO +2273 GREATER THAN OR EQUIVALENT TO +2274 NEITHER LESS THAN NOR EQUIVALENT TO +2275 NEITHER GREATER THAN NOR EQUIVALENT TO +2276 LESS THAN OR GREATER THAN +2277 GREATER THAN OR LESS THAN +2278 NEITHER LESS THAN NOR GREATER THAN +2279 NEITHER GREATER THAN NOR LESS THAN +228A SUBSET OF OR NOT EQUAL TO +228B SUPERSET OF OR NOT EQUAL TO +22D6 LESS THAN WITH DOT +22D7 GREATER THAN WITH DOT +22D8 VERY MUCH LESS THAN +22D9 VERY MUCH GREATER THAN +22DA LESS THAN EQUAL TO OR GREATER THAN +22DB GREATER THAN EQUAL TO OR LESS THAN +22DC EQUAL TO OR LESS THAN +22DD EQUAL TO OR GREATER THAN +22E6 LESS THAN BUT NOT EQUIVALENT TO +22E7 GREATER THAN BUT NOT EQUIVALENT TO +2318 COMMAND KEY +2324 ENTER KEY +2326 DELETE TO THE RIGHT KEY +2327 CLEAR KEY +2329 BRA +232A KET +232B DELETE TO THE LEFT KEY +2400 GRAPHIC FOR NULL +2401 GRAPHIC FOR START OF HEADING +2402 GRAPHIC FOR START OF TEXT +2403 GRAPHIC FOR END OF TEXT +2404 GRAPHIC FOR END OF TRANSMISSION +2405 GRAPHIC FOR ENQUIRY +2406 GRAPHIC FOR ACKNOWLEDGE +2407 GRAPHIC FOR BELL +2408 GRAPHIC FOR BACKSPACE +2409 GRAPHIC FOR HORIZONTAL TABULATION +240A GRAPHIC FOR LINE FEED +240B GRAPHIC FOR VERTICAL TABULATION +240C GRAPHIC FOR FORM FEED +240D GRAPHIC FOR CARRIAGE RETURN +240E GRAPHIC FOR SHIFT OUT +240F GRAPHIC FOR SHIFT IN +2410 GRAPHIC FOR DATA LINK ESCAPE +2411 GRAPHIC FOR DEVICE CONTROL ONE +2412 GRAPHIC FOR DEVICE CONTROL TWO +2413 GRAPHIC FOR DEVICE CONTROL THREE +2414 GRAPHIC FOR DEVICE CONTROL FOUR +2415 GRAPHIC FOR NEGATIVE ACKNOWLEDGE +2416 GRAPHIC FOR SYNCHRONOUS IDLE +2417 GRAPHIC FOR END OF TRANSMISSION BLOCK +2418 GRAPHIC FOR CANCEL +2419 GRAPHIC FOR END OF MEDIUM +241A GRAPHIC FOR SUBSTITUTE +241B GRAPHIC FOR ESCAPE +241C GRAPHIC FOR FILE SEPARATOR +241D GRAPHIC FOR GROUP SEPARATOR +241E GRAPHIC FOR RECORD SEPARATOR +241F GRAPHIC FOR UNIT SEPARATOR +2420 GRAPHIC FOR SPACE +2421 GRAPHIC FOR DELETE +2422 BLANK +2424 GRAPHIC FOR NEWLINE +2488 DIGIT ONE PERIOD +2489 DIGIT TWO PERIOD +248A DIGIT THREE PERIOD +248B DIGIT FOUR PERIOD +248C DIGIT FIVE PERIOD +248D DIGIT SIX PERIOD +248E DIGIT SEVEN PERIOD +248F DIGIT EIGHT PERIOD +2490 DIGIT NINE PERIOD +2491 NUMBER TEN PERIOD +2492 NUMBER ELEVEN PERIOD +2493 NUMBER TWELVE PERIOD +2494 NUMBER THIRTEEN PERIOD +2495 NUMBER FOURTEEN PERIOD +2496 NUMBER FIFTEEN PERIOD +2497 NUMBER SIXTEEN PERIOD +2498 NUMBER SEVENTEEN PERIOD +2499 NUMBER EIGHTEEN PERIOD +249A NUMBER NINETEEN PERIOD +249B NUMBER TWENTY PERIOD +2500 FORMS LIGHT HORIZONTAL +2501 FORMS HEAVY HORIZONTAL +2502 FORMS LIGHT VERTICAL +2503 FORMS HEAVY VERTICAL +2504 FORMS LIGHT TRIPLE DASH HORIZONTAL +2505 FORMS HEAVY TRIPLE DASH HORIZONTAL +2506 FORMS LIGHT TRIPLE DASH VERTICAL +2507 FORMS HEAVY TRIPLE DASH VERTICAL +2508 FORMS LIGHT QUADRUPLE DASH HORIZONTAL +2509 FORMS HEAVY QUADRUPLE DASH HORIZONTAL +250A FORMS LIGHT QUADRUPLE DASH VERTICAL +250B FORMS HEAVY QUADRUPLE DASH VERTICAL +250C FORMS LIGHT DOWN AND RIGHT +250D FORMS DOWN LIGHT AND RIGHT HEAVY +250E FORMS DOWN HEAVY AND RIGHT LIGHT +250F FORMS HEAVY DOWN AND RIGHT +2510 FORMS LIGHT DOWN AND LEFT +2511 FORMS DOWN LIGHT AND LEFT HEAVY +2512 FORMS DOWN HEAVY AND LEFT LIGHT +2513 FORMS HEAVY DOWN AND LEFT +2514 FORMS LIGHT UP AND RIGHT +2515 FORMS UP LIGHT AND RIGHT HEAVY +2516 FORMS UP HEAVY AND RIGHT LIGHT +2517 FORMS HEAVY UP AND RIGHT +2518 FORMS LIGHT UP AND LEFT +2519 FORMS UP LIGHT AND LEFT HEAVY +251A FORMS UP HEAVY AND LEFT LIGHT +251B FORMS HEAVY UP AND LEFT +251C FORMS LIGHT VERTICAL AND RIGHT +251D FORMS VERTICAL LIGHT AND RIGHT HEAVY +251E FORMS UP HEAVY AND RIGHT DOWN LIGHT +251F FORMS DOWN HEAVY AND RIGHT UP LIGHT +2520 FORMS VERTICAL HEAVY AND RIGHT LIGHT +2521 FORMS DOWN LIGHT AND RIGHT UP HEAVY +2522 FORMS UP LIGHT AND RIGHT DOWN HEAVY +2523 FORMS HEAVY VERTICAL AND RIGHT +2524 FORMS LIGHT VERTICAL AND LEFT +2525 FORMS VERTICAL LIGHT AND LEFT HEAVY +2526 FORMS UP HEAVY AND LEFT DOWN LIGHT +2527 FORMS DOWN HEAVY AND LEFT UP LIGHT +2528 FORMS VERTICAL HEAVY AND LEFT LIGHT +2529 FORMS DOWN LIGHT AND LEFT UP HEAVY +252A FORMS UP LIGHT AND LEFT DOWN HEAVY +252B FORMS HEAVY VERTICAL AND LEFT +252C FORMS LIGHT DOWN AND HORIZONTAL +252D FORMS LEFT HEAVY AND RIGHT DOWN LIGHT +252E FORMS RIGHT HEAVY AND LEFT DOWN LIGHT +252F FORMS DOWN LIGHT AND HORIZONTAL HEAVY +2530 FORMS DOWN HEAVY AND HORIZONTAL LIGHT +2531 FORMS RIGHT LIGHT AND LEFT DOWN HEAVY +2532 FORMS LEFT LIGHT AND RIGHT DOWN HEAVY +2533 FORMS HEAVY DOWN AND HORIZONTAL +2534 FORMS LIGHT UP AND HORIZONTAL +2535 FORMS LEFT HEAVY AND RIGHT UP LIGHT +2536 FORMS RIGHT HEAVY AND LEFT UP LIGHT +2537 FORMS UP LIGHT AND HORIZONTAL HEAVY +2538 FORMS UP HEAVY AND HORIZONTAL LIGHT +2539 FORMS RIGHT LIGHT AND LEFT UP HEAVY +253A FORMS LEFT LIGHT AND RIGHT UP HEAVY +253B FORMS HEAVY UP AND HORIZONTAL +253C FORMS LIGHT VERTICAL AND HORIZONTAL +253D FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT +253E FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT +253F FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY +2540 FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT +2541 FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT +2542 FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT +2543 FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT +2544 FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT +2545 FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT +2546 FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT +2547 FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY +2548 FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY +2549 FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY +254A FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY +254B FORMS HEAVY VERTICAL AND HORIZONTAL +254C FORMS LIGHT DOUBLE DASH HORIZONTAL +254D FORMS HEAVY DOUBLE DASH HORIZONTAL +254E FORMS LIGHT DOUBLE DASH VERTICAL +254F FORMS HEAVY DOUBLE DASH VERTICAL +2550 FORMS DOUBLE HORIZONTAL +2551 FORMS DOUBLE VERTICAL +2552 FORMS DOWN SINGLE AND RIGHT DOUBLE +2553 FORMS DOWN DOUBLE AND RIGHT SINGLE +2554 FORMS DOUBLE DOWN AND RIGHT +2555 FORMS DOWN SINGLE AND LEFT DOUBLE +2556 FORMS DOWN DOUBLE AND LEFT SINGLE +2557 FORMS DOUBLE DOWN AND LEFT +2558 FORMS UP SINGLE AND RIGHT DOUBLE +2559 FORMS UP DOUBLE AND RIGHT SINGLE +255A FORMS DOUBLE UP AND RIGHT +255B FORMS UP SINGLE AND LEFT DOUBLE +255C FORMS UP DOUBLE AND LEFT SINGLE +255D FORMS DOUBLE UP AND LEFT +255E FORMS VERTICAL SINGLE AND RIGHT DOUBLE +255F FORMS VERTICAL DOUBLE AND RIGHT SINGLE +2560 FORMS DOUBLE VERTICAL AND RIGHT +2561 FORMS VERTICAL SINGLE AND LEFT DOUBLE +2562 FORMS VERTICAL DOUBLE AND LEFT SINGLE +2563 FORMS DOUBLE VERTICAL AND LEFT +2564 FORMS DOWN SINGLE AND HORIZONTAL DOUBLE +2565 FORMS DOWN DOUBLE AND HORIZONTAL SINGLE +2566 FORMS DOUBLE DOWN AND HORIZONTAL +2567 FORMS UP SINGLE AND HORIZONTAL DOUBLE +2568 FORMS UP DOUBLE AND HORIZONTAL SINGLE +2569 FORMS DOUBLE UP AND HORIZONTAL +256A FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE +256B FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE +256C FORMS DOUBLE VERTICAL AND HORIZONTAL +256D FORMS LIGHT ARC DOWN AND RIGHT +256E FORMS LIGHT ARC DOWN AND LEFT +256F FORMS LIGHT ARC UP AND LEFT +2570 FORMS LIGHT ARC UP AND RIGHT +2571 FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +2572 FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +2573 FORMS LIGHT DIAGONAL CROSS +2574 FORMS LIGHT LEFT +2575 FORMS LIGHT UP +2576 FORMS LIGHT RIGHT +2577 FORMS LIGHT DOWN +2578 FORMS HEAVY LEFT +2579 FORMS HEAVY UP +257A FORMS HEAVY RIGHT +257B FORMS HEAVY DOWN +257C FORMS LIGHT LEFT AND HEAVY RIGHT +257D FORMS LIGHT UP AND HEAVY DOWN +257E FORMS HEAVY LEFT AND LIGHT RIGHT +257F FORMS HEAVY UP AND LIGHT DOWN +2586 LOWER THREE QUARTER BLOCK +258A LEFT THREE QUARTER BLOCK +25B2 BLACK UP POINTING TRIANGLE +25B3 WHITE UP POINTING TRIANGLE +25B4 BLACK UP POINTING SMALL TRIANGLE +25B5 WHITE UP POINTING SMALL TRIANGLE +25B6 BLACK RIGHT POINTING TRIANGLE +25B7 WHITE RIGHT POINTING TRIANGLE +25B8 BLACK RIGHT POINTING SMALL TRIANGLE +25B9 WHITE RIGHT POINTING SMALL TRIANGLE +25BA BLACK RIGHT POINTING POINTER +25BB WHITE RIGHT POINTING POINTER +25BC BLACK DOWN POINTING TRIANGLE +25BD WHITE DOWN POINTING TRIANGLE +25BE BLACK DOWN POINTING SMALL TRIANGLE +25BF WHITE DOWN POINTING SMALL TRIANGLE +25C0 BLACK LEFT POINTING TRIANGLE +25C1 WHITE LEFT POINTING TRIANGLE +25C2 BLACK LEFT POINTING SMALL TRIANGLE +25C3 WHITE LEFT POINTING SMALL TRIANGLE +25C4 BLACK LEFT POINTING POINTER +25C5 WHITE LEFT POINTING POINTER +25EC WHITE UP POINTING TRIANGLE WITH DOT +25ED UP POINTING TRIANGLE WITH LEFT HALF BLACK +25EE UP POINTING TRIANGLE WITH RIGHT HALF BLACK +262B SYMBOL OF IRAN +266B BARRED EIGHTH NOTES +266C BARRED SIXTEENTH NOTES +266D FLAT +266E NATURAL +266F SHARP +271B OPEN CENTER CROSS +271C HEAVY OPEN CENTER CROSS +272B OPEN CENTER BLACK STAR +272C BLACK CENTER WHITE STAR +2732 OPEN CENTER ASTERISK +273C OPEN CENTER TEARDROP-SPOKED ASTERISK +2742 CIRCLED OPEN CENTER EIGHT POINTED STAR +2776 INVERSE CIRCLED DIGIT ONE +2777 INVERSE CIRCLED DIGIT TWO +2778 INVERSE CIRCLED DIGIT THREE +2779 INVERSE CIRCLED DIGIT FOUR +277A INVERSE CIRCLED DIGIT FIVE +277B INVERSE CIRCLED DIGIT SIX +277C INVERSE CIRCLED DIGIT SEVEN +277D INVERSE CIRCLED DIGIT EIGHT +277E INVERSE CIRCLED DIGIT NINE +277F INVERSE CIRCLED NUMBER TEN +2780 CIRCLED SANS-SERIF DIGIT ONE +2781 CIRCLED SANS-SERIF DIGIT TWO +2782 CIRCLED SANS-SERIF DIGIT THREE +2783 CIRCLED SANS-SERIF DIGIT FOUR +2784 CIRCLED SANS-SERIF DIGIT FIVE +2785 CIRCLED SANS-SERIF DIGIT SIX +2786 CIRCLED SANS-SERIF DIGIT SEVEN +2787 CIRCLED SANS-SERIF DIGIT EIGHT +2788 CIRCLED SANS-SERIF DIGIT NINE +2789 CIRCLED SANS-SERIF NUMBER TEN +278A INVERSE CIRCLED SANS-SERIF DIGIT ONE +278B INVERSE CIRCLED SANS-SERIF DIGIT TWO +278C INVERSE CIRCLED SANS-SERIF DIGIT THREE +278D INVERSE CIRCLED SANS-SERIF DIGIT FOUR +278E INVERSE CIRCLED SANS-SERIF DIGIT FIVE +278F INVERSE CIRCLED SANS-SERIF DIGIT SIX +2790 INVERSE CIRCLED SANS-SERIF DIGIT SEVEN +2791 INVERSE CIRCLED SANS-SERIF DIGIT EIGHT +2792 INVERSE CIRCLED SANS-SERIF DIGIT NINE +2793 INVERSE CIRCLED SANS-SERIF NUMBER TEN +2794 HEAVY WIDE-HEADED RIGHT ARROW +2798 HEAVY LOWER RIGHT ARROW +2799 HEAVY RIGHT ARROW +279A HEAVY UPPER RIGHT ARROW +279B DRAFTING POINT RIGHT ARROW +279C HEAVY ROUND-TIPPED RIGHT ARROW +279D TRIANGLE-HEADED RIGHT ARROW +279E HEAVY TRIANGLE-HEADED RIGHT ARROW +279F DASHED TRIANGLE-HEADED RIGHT ARROW +27A0 HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW +27A1 BLACK RIGHT ARROW +27A2 THREE-D TOP-LIGHTED RIGHT ARROWHEAD +27A3 THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD +27A4 BLACK RIGHT ARROWHEAD +27A5 HEAVY BLACK CURVED DOWN AND RIGHT ARROW +27A6 HEAVY BLACK CURVED UP AND RIGHT ARROW +27A7 SQUAT BLACK RIGHT ARROW +27A8 HEAVY CONCAVE-POINTED BLACK RIGHT ARROW +27A9 RIGHT-SHADED WHITE RIGHT ARROW +27AA LEFT-SHADED WHITE RIGHT ARROW +27AB BACK-TILTED SHADOWED WHITE RIGHT ARROW +27AC FRONT-TILTED SHADOWED WHITE RIGHT ARROW +27AD HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW +27AE HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW +27AF NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW +27B1 NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW +27B2 CIRCLED HEAVY WHITE RIGHT ARROW +27B3 WHITE-FEATHERED RIGHT ARROW +27B4 BLACK-FEATHERED LOWER RIGHT ARROW +27B5 BLACK-FEATHERED RIGHT ARROW +27B6 BLACK-FEATHERED UPPER RIGHT ARROW +27B7 HEAVY BLACK-FEATHERED LOWER RIGHT ARROW +27B8 HEAVY BLACK-FEATHERED RIGHT ARROW +27B9 HEAVY BLACK-FEATHERED UPPER RIGHT ARROW +27BA TEARDROP-BARBED RIGHT ARROW +27BB HEAVY TEARDROP-SHANKED RIGHT ARROW +27BC WEDGE-TAILED RIGHT ARROW +27BD HEAVY WEDGE-TAILED RIGHT ARROW +27BE OPEN-OUTLINED RIGHT ARROW +3002 IDEOGRAPHIC PERIOD +3008 OPENING ANGLE BRACKET +3009 CLOSING ANGLE BRACKET +300A OPENING DOUBLE ANGLE BRACKET +300B CLOSING DOUBLE ANGLE BRACKET +300C OPENING CORNER BRACKET +300D CLOSING CORNER BRACKET +300E OPENING WHITE CORNER BRACKET +300F CLOSING WHITE CORNER BRACKET +3010 OPENING BLACK LENTICULAR BRACKET +3011 CLOSING BLACK LENTICULAR BRACKET +3014 OPENING TORTOISE SHELL BRACKET +3015 CLOSING TORTOISE SHELL BRACKET +3016 OPENING WHITE LENTICULAR BRACKET +3017 CLOSING WHITE LENTICULAR BRACKET +3018 OPENING WHITE TORTOISE SHELL BRACKET +3019 CLOSING WHITE TORTOISE SHELL BRACKET +301A OPENING WHITE SQUARE BRACKET +301B CLOSING WHITE SQUARE BRACKET +3099 NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK +309A NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +3131 HANGUL LETTER GIYEOG +3132 HANGUL LETTER SSANG GIYEOG +3133 HANGUL LETTER GIYEOG SIOS +3135 HANGUL LETTER NIEUN JIEUJ +3136 HANGUL LETTER NIEUN HIEUH +3137 HANGUL LETTER DIGEUD +3138 HANGUL LETTER SSANG DIGEUD +3139 HANGUL LETTER LIEUL +313A HANGUL LETTER LIEUL GIYEOG +313B HANGUL LETTER LIEUL MIEUM +313C HANGUL LETTER LIEUL BIEUB +313D HANGUL LETTER LIEUL SIOS +313E HANGUL LETTER LIEUL TIEUT +313F HANGUL LETTER LIEUL PIEUP +3140 HANGUL LETTER LIEUL HIEUH +3142 HANGUL LETTER BIEUB +3143 HANGUL LETTER SSANG BIEUB +3144 HANGUL LETTER BIEUB SIOS +3146 HANGUL LETTER SSANG SIOS +3148 HANGUL LETTER JIEUJ +3149 HANGUL LETTER SSANG JIEUJ +314A HANGUL LETTER CIEUC +314B HANGUL LETTER KIYEOK +314C HANGUL LETTER TIEUT +314D HANGUL LETTER PIEUP +3164 HANGUL CAE OM +3165 HANGUL LETTER SSANG NIEUN +3166 HANGUL LETTER NIEUN DIGEUD +3167 HANGUL LETTER NIEUN SIOS +3168 HANGUL LETTER NIEUN BAN CHI EUM +3169 HANGUL LETTER LIEUL GIYEOG SIOS +316A HANGUL LETTER LIEUL DIGEUD +316B HANGUL LETTER LIEUL BIEUB SIOS +316C HANGUL LETTER LIEUL BAN CHI EUM +316D HANGUL LETTER LIEUL YEOLIN HIEUH +316E HANGUL LETTER MIEUM BIEUB +316F HANGUL LETTER MIEUM SIOS +3170 HANGUL LETTER BIEUB BAN CHI EUM +3171 HANGUL LETTER MIEUM SUN GYEONG EUM +3172 HANGUL LETTER BIEUB GIYEOG +3173 HANGUL LETTER BIEUB DIGEUD +3174 HANGUL LETTER BIEUB SIOS GIYEOG +3175 HANGUL LETTER BIEUB SIOS DIGEUD +3176 HANGUL LETTER BIEUB JIEUJ +3177 HANGUL LETTER BIEUB TIEUT +3178 HANGUL LETTER BIEUB SUN GYEONG EUM +3179 HANGUL LETTER SSANG BIEUB SUN GYEONG EUM +317A HANGUL LETTER SIOS GIYEOG +317B HANGUL LETTER SIOS NIEUN +317C HANGUL LETTER SIOS DIGEUD +317D HANGUL LETTER SIOS BIEUB +317E HANGUL LETTER SIOS JIEUJ +317F HANGUL LETTER BAN CHI EUM +3180 HANGUL LETTER SSANG IEUNG +3181 HANGUL LETTER NGIEUNG +3182 HANGUL LETTER NGIEUNG SIOS +3183 HANGUL LETTER NGIEUNG BAN CHI EUM +3184 HANGUL LETTER PIEUP SUN GYEONG EUM +3185 HANGUL LETTER SSANG HIEUH +3186 HANGUL LETTER YEOLIN HIEUH +3187 HANGUL LETTER YOYA +3188 HANGUL LETTER YOYAE +3189 HANGUL LETTER YOI +318A HANGUL LETTER YUYEO +318B HANGUL LETTER YUYE +318C HANGUL LETTER YUI +318D HANGUL LETTER ALAE A +318E HANGUL LETTER ALAE AE +3190 KANBUN TATETEN +3191 KAERITEN RE +3192 KAERITEN ITI +3193 KAERITEN NI +3194 KAERITEN SAN +3195 KAERITEN SI +3196 KAERITEN ZYOU +3197 KAERITEN TYUU +3198 KAERITEN GE +3199 KAERITEN KOU +319A KAERITEN OTU +319B KAERITEN HEI +319C KAERITEN TEI +319D KAERITEN TEN +319E KAERITEN TI +319F KAERITEN ZIN +3200 PARENTHESIZED HANGUL GIYEOG +3202 PARENTHESIZED HANGUL DIGEUD +3203 PARENTHESIZED HANGUL LIEUL +3205 PARENTHESIZED HANGUL BIEUB +3208 PARENTHESIZED HANGUL JIEUJ +3209 PARENTHESIZED HANGUL CIEUC +320A PARENTHESIZED HANGUL KIYEOK +320B PARENTHESIZED HANGUL TIEUT +320C PARENTHESIZED HANGUL PIEUP +320E PARENTHESIZED HANGUL GA +320F PARENTHESIZED HANGUL NA +3210 PARENTHESIZED HANGUL DA +3211 PARENTHESIZED HANGUL LA +3212 PARENTHESIZED HANGUL MA +3213 PARENTHESIZED HANGUL BA +3214 PARENTHESIZED HANGUL SA +3215 PARENTHESIZED HANGUL A +3216 PARENTHESIZED HANGUL JA +3217 PARENTHESIZED HANGUL CA +3218 PARENTHESIZED HANGUL KA +3219 PARENTHESIZED HANGUL TA +321A PARENTHESIZED HANGUL PA +321B PARENTHESIZED HANGUL HA +321C PARENTHESIZED HANGUL JU +3260 CIRCLED HANGUL GIYEOG +3262 CIRCLED HANGUL DIGEUD +3263 CIRCLED HANGUL LIEUL +3265 CIRCLED HANGUL BIEUB +3268 CIRCLED HANGUL JIEUJ +3269 CIRCLED HANGUL CIEUC +326A CIRCLED HANGUL KIYEOK +326B CIRCLED HANGUL TIEUT +326C CIRCLED HANGUL PIEUP +326E CIRCLED HANGUL GA +326F CIRCLED HANGUL NA +3270 CIRCLED HANGUL DA +3271 CIRCLED HANGUL LA +3272 CIRCLED HANGUL MA +3273 CIRCLED HANGUL BA +3274 CIRCLED HANGUL SA +3275 CIRCLED HANGUL A +3276 CIRCLED HANGUL JA +3277 CIRCLED HANGUL CA +3278 CIRCLED HANGUL KA +3279 CIRCLED HANGUL TA +327A CIRCLED HANGUL PA +327B CIRCLED HANGUL HA +32A5 CIRCLED IDEOGRAPH CENTER +3300 SQUARED APAATO +3301 SQUARED ARUHUA +3302 SQUARED ANPEA +3303 SQUARED AARU +3304 SQUARED ININGU +3305 SQUARED INTI +3306 SQUARED UON +3307 SQUARED ESUKUUDO +3308 SQUARED EEKAA +3309 SQUARED ONSU +330A SQUARED OOMU +330B SQUARED KAIRI +330C SQUARED KARATTO +330D SQUARED KARORII +330E SQUARED GARON +330F SQUARED GANMA +3310 SQUARED GIGA +3311 SQUARED GINII +3312 SQUARED KYURII +3313 SQUARED GIRUDAA +3314 SQUARED KIRO +3315 SQUARED KIROGURAMU +3316 SQUARED KIROMEETORU +3317 SQUARED KIROWATTO +3318 SQUARED GURAMU +3319 SQUARED GURAMUTON +331A SQUARED KURUZEIRO +331B SQUARED KUROONE +331C SQUARED KEESU +331D SQUARED KORUNA +331E SQUARED KOOPO +331F SQUARED SAIKURU +3320 SQUARED SANTIIMU +3321 SQUARED SIRINGU +3322 SQUARED SENTI +3323 SQUARED SENTO +3324 SQUARED DAASU +3325 SQUARED DESI +3326 SQUARED DORU +3327 SQUARED TON +3328 SQUARED NANO +3329 SQUARED NOTTO +332A SQUARED HAITU +332B SQUARED PAASENTO +332C SQUARED PAATU +332D SQUARED BAARERU +332E SQUARED PIASUTORU +332F SQUARED PIKURU +3330 SQUARED PIKO +3331 SQUARED BIRU +3332 SQUARED HUARADDO +3333 SQUARED HUIITO +3334 SQUARED BUSSYERU +3335 SQUARED HURAN +3336 SQUARED HEKUTAARU +3337 SQUARED PESO +3338 SQUARED PENIHI +3339 SQUARED HERUTU +333A SQUARED PENSU +333B SQUARED PEEZI +333C SQUARED BEETA +333D SQUARED POINTO +333E SQUARED BORUTO +333F SQUARED HON +3340 SQUARED PONDO +3341 SQUARED HOORU +3342 SQUARED HOON +3343 SQUARED MAIKURO +3344 SQUARED MAIRU +3345 SQUARED MAHHA +3346 SQUARED MARUKU +3347 SQUARED MANSYON +3348 SQUARED MIKURON +3349 SQUARED MIRI +334A SQUARED MIRIBAARU +334B SQUARED MEGA +334C SQUARED MEGATON +334D SQUARED MEETORU +334E SQUARED YAADO +334F SQUARED YAARU +3350 SQUARED YUAN +3351 SQUARED RITTORU +3352 SQUARED RIRA +3353 SQUARED RUPII +3354 SQUARED RUUBURU +3355 SQUARED REMU +3356 SQUARED RENTOGEN +3357 SQUARED WATTO +337B SQUARED TWO IDEOGRAPHS ERA NAME HEISEI +337C SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA +337D SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU +337E SQUARED TWO IDEOGRAPHS ERA NAME MEIZI +337F SQUARED FOUR IDEOGRAPHS CORPORATION +3380 SQUARED PA AMPS +3381 SQUARED NA +3382 SQUARED MU A +3383 SQUARED MA +3384 SQUARED KA +3385 SQUARED KB +3386 SQUARED MB +3387 SQUARED GB +3388 SQUARED CAL +3389 SQUARED KCAL +338A SQUARED PF +338B SQUARED NF +338C SQUARED MU F +338D SQUARED MU G +338E SQUARED MG +338F SQUARED KG +3390 SQUARED HZ +3391 SQUARED KHZ +3392 SQUARED MHZ +3393 SQUARED GHZ +3394 SQUARED THZ +3395 SQUARED MU L +3396 SQUARED ML +3397 SQUARED DL +3398 SQUARED KL +3399 SQUARED FM +339A SQUARED NM +339B SQUARED MU M +339C SQUARED MM +339D SQUARED CM +339E SQUARED KM +339F SQUARED MM SQUARED +33A0 SQUARED CM SQUARED +33A1 SQUARED M SQUARED +33A2 SQUARED KM SQUARED +33A3 SQUARED MM CUBED +33A4 SQUARED CM CUBED +33A5 SQUARED M CUBED +33A6 SQUARED KM CUBED +33A7 SQUARED M OVER S +33A8 SQUARED M OVER S SQUARED +33A9 SQUARED PA +33AA SQUARED KPA +33AB SQUARED MPA +33AC SQUARED GPA +33AD SQUARED RAD +33AE SQUARED RAD OVER S +33AF SQUARED RAD OVER S SQUARED +33B0 SQUARED PS +33B1 SQUARED NS +33B2 SQUARED MU S +33B3 SQUARED MS +33B4 SQUARED PV +33B5 SQUARED NV +33B6 SQUARED MU V +33B7 SQUARED MV +33B8 SQUARED KV +33B9 SQUARED MV MEGA +33BA SQUARED PW +33BB SQUARED NW +33BC SQUARED MU W +33BD SQUARED MW +33BE SQUARED KW +33BF SQUARED MW MEGA +33C0 SQUARED K OHM +33C1 SQUARED M OHM +33C2 SQUARED AM +33C3 SQUARED BQ +33C4 SQUARED CC +33C5 SQUARED CD +33C6 SQUARED C OVER KG +33C7 SQUARED CO +33C8 SQUARED DB +33C9 SQUARED GY +33CA SQUARED HA +33CB SQUARED HP +33CC SQUARED IN +33CD SQUARED KK +33CE SQUARED KM CAPITAL +33CF SQUARED KT +33D0 SQUARED LM +33D1 SQUARED LN +33D2 SQUARED LOG +33D3 SQUARED LX +33D4 SQUARED MB SMALL +33D5 SQUARED MIL +33D6 SQUARED MOL +33D7 SQUARED PH +33D8 SQUARED PM +33D9 SQUARED PPM +33DA SQUARED PR +33DB SQUARED SR +33DC SQUARED SV +33DD SQUARED WB +FB1E HEBREW POINT VARIKA +FDFA ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM +FDFB ARABIC LETTER JALLAJALALOUHOU +FE30 GLYPH FOR VERTICAL TWO DOT LEADER +FE31 GLYPH FOR VERTICAL EM DASH +FE32 GLYPH FOR VERTICAL EN DASH +FE33 GLYPH FOR VERTICAL SPACING UNDERSCORE +FE34 GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE +FE35 GLYPH FOR VERTICAL OPENING PARENTHESIS +FE36 GLYPH FOR VERTICAL CLOSING PARENTHESIS +FE37 GLYPH FOR VERTICAL OPENING CURLY BRACKET +FE38 GLYPH FOR VERTICAL CLOSING CURLY BRACKET +FE39 GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET +FE3A GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET +FE3B GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET +FE3C GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET +FE3D GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET +FE3E GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET +FE3F GLYPH FOR VERTICAL OPENING ANGLE BRACKET +FE40 GLYPH FOR VERTICAL CLOSING ANGLE BRACKET +FE41 GLYPH FOR VERTICAL OPENING CORNER BRACKET +FE42 GLYPH FOR VERTICAL CLOSING CORNER BRACKET +FE43 GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET +FE44 GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET +FE49 SPACING DASHED OVERSCORE +FE4A SPACING CENTERLINE OVERSCORE +FE4B SPACING WAVY OVERSCORE +FE4C SPACING DOUBLE WAVY OVERSCORE +FE4D SPACING DASHED UNDERSCORE +FE4E SPACING CENTERLINE UNDERSCORE +FE4F SPACING WAVY UNDERSCORE +FE52 SMALL PERIOD +FE59 SMALL OPENING PARENTHESIS +FE5A SMALL CLOSING PARENTHESIS +FE5B SMALL OPENING CURLY BRACKET +FE5C SMALL CLOSING CURLY BRACKET +FE5D SMALL OPENING TORTOISE SHELL BRACKET +FE5E SMALL CLOSING TORTOISE SHELL BRACKET +FE68 SMALL BACKSLASH +FE70 ARABIC SPACING FATHATAN +FE71 ARABIC FATHATAN ON TATWEEL +FE72 ARABIC SPACING DAMMATAN +FE74 ARABIC SPACING KASRATAN +FE76 ARABIC SPACING FATHAH +FE77 ARABIC FATHAH ON TATWEEL +FE78 ARABIC SPACING DAMMAH +FE79 ARABIC DAMMAH ON TATWEEL +FE7A ARABIC SPACING KASRAH +FE7B ARABIC KASRAH ON TATWEEL +FE7C ARABIC SPACING SHADDAH +FE7D ARABIC SHADDAH ON TATWEEL +FE7E ARABIC SPACING SUKUN +FE7F ARABIC SUKUN ON TATWEEL +FE80 GLYPH FOR ISOLATE ARABIC HAMZAH +FE81 GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF +FE82 GLYPH FOR FINAL ARABIC MADDAH ON ALEF +FE83 GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF +FE84 GLYPH FOR FINAL ARABIC HAMZAH ON ALEF +FE85 GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW +FE86 GLYPH FOR FINAL ARABIC HAMZAH ON WAW +FE87 GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF +FE88 GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF +FE89 GLYPH FOR ISOLATE ARABIC HAMZAH ON YA +FE8A GLYPH FOR FINAL ARABIC HAMZAH ON YA +FE8B GLYPH FOR INITIAL ARABIC HAMZAH ON YA +FE8C GLYPH FOR MEDIAL ARABIC HAMZAH ON YA +FE8D GLYPH FOR ISOLATE ARABIC ALEF +FE8E GLYPH FOR FINAL ARABIC ALEF +FE8F GLYPH FOR ISOLATE ARABIC BAA +FE90 GLYPH FOR FINAL ARABIC BAA +FE91 GLYPH FOR INITIAL ARABIC BAA +FE92 GLYPH FOR MEDIAL ARABIC BAA +FE93 GLYPH FOR ISOLATE ARABIC TAA MARBUTAH +FE94 GLYPH FOR FINAL ARABIC TAA MARBUTAH +FE95 GLYPH FOR ISOLATE ARABIC TAA +FE96 GLYPH FOR FINAL ARABIC TAA +FE97 GLYPH FOR INITIAL ARABIC TAA +FE98 GLYPH FOR MEDIAL ARABIC TAA +FE99 GLYPH FOR ISOLATE ARABIC THAA +FE9A GLYPH FOR FINAL ARABIC THAA +FE9B GLYPH FOR INITIAL ARABIC THAA +FE9C GLYPH FOR MEDIAL ARABIC THAA +FE9D GLYPH FOR ISOLATE ARABIC JEEM +FE9E GLYPH FOR FINAL ARABIC JEEM +FE9F GLYPH FOR INITIAL ARABIC JEEM +FEA0 GLYPH FOR MEDIAL ARABIC JEEM +FEA1 GLYPH FOR ISOLATE ARABIC HAA +FEA2 GLYPH FOR FINAL ARABIC HAA +FEA3 GLYPH FOR INITIAL ARABIC HAA +FEA4 GLYPH FOR MEDIAL ARABIC HAA +FEA5 GLYPH FOR ISOLATE ARABIC KHAA +FEA6 GLYPH FOR FINAL ARABIC KHAA +FEA7 GLYPH FOR INITIAL ARABIC KHAA +FEA8 GLYPH FOR MEDIAL ARABIC KHAA +FEA9 GLYPH FOR ISOLATE ARABIC DAL +FEAA GLYPH FOR FINAL ARABIC DAL +FEAB GLYPH FOR ISOLATE ARABIC THAL +FEAC GLYPH FOR FINAL ARABIC THAL +FEAD GLYPH FOR ISOLATE ARABIC RA +FEAE GLYPH FOR FINAL ARABIC RA +FEAF GLYPH FOR ISOLATE ARABIC ZAIN +FEB0 GLYPH FOR FINAL ARABIC ZAIN +FEB1 GLYPH FOR ISOLATE ARABIC SEEN +FEB2 GLYPH FOR FINAL ARABIC SEEN +FEB3 GLYPH FOR INITIAL ARABIC SEEN +FEB4 GLYPH FOR MEDIAL ARABIC SEEN +FEB5 GLYPH FOR ISOLATE ARABIC SHEEN +FEB6 GLYPH FOR FINAL ARABIC SHEEN +FEB7 GLYPH FOR INITIAL ARABIC SHEEN +FEB8 GLYPH FOR MEDIAL ARABIC SHEEN +FEB9 GLYPH FOR ISOLATE ARABIC SAD +FEBA GLYPH FOR FINAL ARABIC SAD +FEBB GLYPH FOR INITIAL ARABIC SAD +FEBC GLYPH FOR MEDIAL ARABIC SAD +FEBD GLYPH FOR ISOLATE ARABIC DAD +FEBE GLYPH FOR FINAL ARABIC DAD +FEBF GLYPH FOR INITIAL ARABIC DAD +FEC0 GLYPH FOR MEDIAL ARABIC DAD +FEC1 GLYPH FOR ISOLATE ARABIC TAH +FEC2 GLYPH FOR FINAL ARABIC TAH +FEC3 GLYPH FOR INITIAL ARABIC TAH +FEC4 GLYPH FOR MEDIAL ARABIC TAH +FEC5 GLYPH FOR ISOLATE ARABIC DHAH +FEC6 GLYPH FOR FINAL ARABIC DHAH +FEC7 GLYPH FOR INITIAL ARABIC DHAH +FEC8 GLYPH FOR MEDIAL ARABIC DHAH +FEC9 GLYPH FOR ISOLATE ARABIC AIN +FECA GLYPH FOR FINAL ARABIC AIN +FECB GLYPH FOR INITIAL ARABIC AIN +FECC GLYPH FOR MEDIAL ARABIC AIN +FECD GLYPH FOR ISOLATE ARABIC GHAIN +FECE GLYPH FOR FINAL ARABIC GHAIN +FECF GLYPH FOR INITIAL ARABIC GHAIN +FED0 GLYPH FOR MEDIAL ARABIC GHAIN +FED1 GLYPH FOR ISOLATE ARABIC FA +FED2 GLYPH FOR FINAL ARABIC FA +FED3 GLYPH FOR INITIAL ARABIC FA +FED4 GLYPH FOR MEDIAL ARABIC FA +FED5 GLYPH FOR ISOLATE ARABIC QAF +FED6 GLYPH FOR FINAL ARABIC QAF +FED7 GLYPH FOR INITIAL ARABIC QAF +FED8 GLYPH FOR MEDIAL ARABIC QAF +FED9 GLYPH FOR ISOLATE ARABIC CAF +FEDA GLYPH FOR FINAL ARABIC CAF +FEDB GLYPH FOR INITIAL ARABIC CAF +FEDC GLYPH FOR MEDIAL ARABIC CAF +FEDD GLYPH FOR ISOLATE ARABIC LAM +FEDE GLYPH FOR FINAL ARABIC LAM +FEDF GLYPH FOR INITIAL ARABIC LAM +FEE0 GLYPH FOR MEDIAL ARABIC LAM +FEE1 GLYPH FOR ISOLATE ARABIC MEEM +FEE2 GLYPH FOR FINAL ARABIC MEEM +FEE3 GLYPH FOR INITIAL ARABIC MEEM +FEE4 GLYPH FOR MEDIAL ARABIC MEEM +FEE5 GLYPH FOR ISOLATE ARABIC NOON +FEE6 GLYPH FOR FINAL ARABIC NOON +FEE7 GLYPH FOR INITIAL ARABIC NOON +FEE8 GLYPH FOR MEDIAL ARABIC NOON +FEE9 GLYPH FOR ISOLATE ARABIC HA +FEEA GLYPH FOR FINAL ARABIC HA +FEEB GLYPH FOR INITIAL ARABIC HA +FEEC GLYPH FOR MEDIAL ARABIC HA +FEED GLYPH FOR ISOLATE ARABIC WAW +FEEE GLYPH FOR FINAL ARABIC WAW +FEEF GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH +FEF0 GLYPH FOR FINAL ARABIC ALEF MAQSURAH +FEF1 GLYPH FOR ISOLATE ARABIC YA +FEF2 GLYPH FOR FINAL ARABIC YA +FEF3 GLYPH FOR INITIAL ARABIC YA +FEF4 GLYPH FOR MEDIAL ARABIC YA +FEF5 GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF +FEF6 GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF +FEF7 GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF +FEF8 GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF +FEF9 GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF +FEFA GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF +FEFB GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF +FEFC GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF +FEFF BYTE ORDER MARK +FF08 FULLWIDTH OPENING PARENTHESIS +FF09 FULLWIDTH CLOSING PARENTHESIS +FF0E FULLWIDTH PERIOD +FF0F FULLWIDTH SLASH +FF3B FULLWIDTH OPENING SQUARE BRACKET +FF3C FULLWIDTH BACKSLASH +FF3D FULLWIDTH CLOSING SQUARE BRACKET +FF3E FULLWIDTH SPACING CIRCUMFLEX +FF3F FULLWIDTH SPACING UNDERSCORE +FF40 FULLWIDTH SPACING GRAVE +FF5B FULLWIDTH OPENING CURLY BRACKET +FF5C FULLWIDTH VERTICAL BAR +FF5D FULLWIDTH CLOSING CURLY BRACKET +FF5E FULLWIDTH SPACING TILDE +FF61 HALFWIDTH IDEOGRAPHIC PERIOD +FF62 HALFWIDTH OPENING CORNER BRACKET +FF63 HALFWIDTH CLOSING CORNER BRACKET +FFA0 HALFWIDTH HANGUL CAE OM +FFA1 HALFWIDTH HANGUL LETTER GIYEOG +FFA2 HALFWIDTH HANGUL LETTER SSANG GIYEOG +FFA3 HALFWIDTH HANGUL LETTER GIYEOG SIOS +FFA5 HALFWIDTH HANGUL LETTER NIEUN JIEUJ +FFA6 HALFWIDTH HANGUL LETTER NIEUN HIEUH +FFA7 HALFWIDTH HANGUL LETTER DIGEUD +FFA8 HALFWIDTH HANGUL LETTER SSANG DIGEUD +FFA9 HALFWIDTH HANGUL LETTER LIEUL +FFAA HALFWIDTH HANGUL LETTER LIEUL GIYEOG +FFAB HALFWIDTH HANGUL LETTER LIEUL MIEUM +FFAC HALFWIDTH HANGUL LETTER LIEUL BIEUB +FFAD HALFWIDTH HANGUL LETTER LIEUL SIOS +FFAE HALFWIDTH HANGUL LETTER LIEUL TIEUT +FFAF HALFWIDTH HANGUL LETTER LIEUL PIEUP +FFB0 HALFWIDTH HANGUL LETTER LIEUL HIEUH +FFB2 HALFWIDTH HANGUL LETTER BIEUB +FFB3 HALFWIDTH HANGUL LETTER SSANG BIEUB +FFB4 HALFWIDTH HANGUL LETTER BIEUB SIOS +FFB6 HALFWIDTH HANGUL LETTER SSANG SIOS +FFB8 HALFWIDTH HANGUL LETTER JIEUJ +FFB9 HALFWIDTH HANGUL LETTER SSANG JIEUJ +FFBA HALFWIDTH HANGUL LETTER CIEUC +FFBB HALFWIDTH HANGUL LETTER KIYEOK +FFBC HALFWIDTH HANGUL LETTER TIEUT +FFBD HALFWIDTH HANGUL LETTER PIEUP +FFE3 FULLWIDTH SPACING MACRON +FFE4 FULLWIDTH BROKEN VERTICAL BAR +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNFDQC'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNFDQC'}{'missing'} = 'Yes'; + +return <<'END'; +C0 C5 N +C7 CF N +D1 D6 N +D9 DD N +E0 E5 N +E7 EF N +F1 F6 N +F9 FD N +FF 10F N +112 125 N +128 130 N +134 137 N +139 13E N +143 148 N +14C 151 N +154 165 N +168 17E N +1A0 1A1 N +1AF 1B0 N +1CD 1DC N +1DE 1E3 N +1E6 1F0 N +1F4 1F5 N +1F8 21B N +21E 21F N +226 233 N +340 341 N +343 344 N +374 N +37E N +385 38A N +38C N +38E 390 N +3AA 3B0 N +3CA 3CE N +3D3 3D4 N +400 401 N +403 N +407 N +40C 40E N +419 N +439 N +450 451 N +453 N +457 N +45C 45E N +476 477 N +4C1 4C2 N +4D0 4D3 N +4D6 4D7 N +4DA 4DF N +4E2 4E7 N +4EA 4F5 N +4F8 4F9 N +622 626 N +6C0 N +6C2 N +6D3 N +929 N +931 N +934 N +958 95F N +9CB 9CC N +9DC 9DD N +9DF N +A33 N +A36 N +A59 A5B N +A5E N +B48 N +B4B B4C N +B5C B5D N +B94 N +BCA BCC N +C48 N +CC0 N +CC7 CC8 N +CCA CCB N +D4A D4C N +DDA N +DDC DDE N +F43 N +F4D N +F52 N +F57 N +F5C N +F69 N +F73 N +F75 F76 N +F78 N +F81 N +F93 N +F9D N +FA2 N +FA7 N +FAC N +FB9 N +1026 N +1B06 N +1B08 N +1B0A N +1B0C N +1B0E N +1B12 N +1B3B N +1B3D N +1B40 1B41 N +1B43 N +1E00 1E99 N +1E9B N +1EA0 1EF9 N +1F00 1F15 N +1F18 1F1D N +1F20 1F45 N +1F48 1F4D N +1F50 1F57 N +1F59 N +1F5B N +1F5D N +1F5F 1F7D N +1F80 1FB4 N +1FB6 1FBC N +1FBE N +1FC1 1FC4 N +1FC6 1FD3 N +1FD6 1FDB N +1FDD 1FEF N +1FF2 1FF4 N +1FF6 1FFD N +2000 2001 N +2126 N +212A 212B N +219A 219B N +21AE N +21CD 21CF N +2204 N +2209 N +220C N +2224 N +2226 N +2241 N +2244 N +2247 N +2249 N +2260 N +2262 N +226D 2271 N +2274 2275 N +2278 2279 N +2280 2281 N +2284 2285 N +2288 2289 N +22AC 22AF N +22E0 22E3 N +22EA 22ED N +2329 232A N +2ADC N +304C N +304E N +3050 N +3052 N +3054 N +3056 N +3058 N +305A N +305C N +305E N +3060 N +3062 N +3065 N +3067 N +3069 N +3070 3071 N +3073 3074 N +3076 3077 N +3079 307A N +307C 307D N +3094 N +309E N +30AC N +30AE N +30B0 N +30B2 N +30B4 N +30B6 N +30B8 N +30BA N +30BC N +30BE N +30C0 N +30C2 N +30C5 N +30C7 N +30C9 N +30D0 30D1 N +30D3 30D4 N +30D6 30D7 N +30D9 30DA N +30DC 30DD N +30F4 N +30F7 30FA N +30FE N +AC00 D7A3 N +F900 FA0D N +FA10 N +FA12 N +FA15 FA1E N +FA20 N +FA22 N +FA25 FA26 N +FA2A FA6D N +FA70 FAD9 N +FB1D N +FB1F N +FB2A FB36 N +FB38 FB3C N +FB3E N +FB40 FB41 N +FB43 FB44 N +FB46 FB4E N +1109A N +1109C N +110AB N +1112E 1112F N +1134B 1134C N +114BB 114BC N +114BE N +115BA 115BB N +1D15E 1D164 N +1D1BB 1D1C0 N +2F800 2FA1D N +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNFCQC'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNFCQC'}{'missing'} = 'Yes'; + +return <<'END'; +300 304 M +306 30C M +30F M +311 M +313 314 M +31B M +323 328 M +32D 32E M +330 331 M +338 M +340 341 N +342 M +343 344 N +345 M +374 N +37E N +387 N +653 655 M +93C M +958 95F N +9BE M +9D7 M +9DC 9DD N +9DF N +A33 N +A36 N +A59 A5B N +A5E N +B3E M +B56 B57 M +B5C B5D N +BBE M +BD7 M +C56 M +CC2 M +CD5 CD6 M +D3E M +D57 M +DCA M +DCF M +DDF M +F43 N +F4D N +F52 N +F57 N +F5C N +F69 N +F73 N +F75 F76 N +F78 N +F81 N +F93 N +F9D N +FA2 N +FA7 N +FAC N +FB9 N +102E M +1161 1175 M +11A8 11C2 M +1B35 M +1F71 N +1F73 N +1F75 N +1F77 N +1F79 N +1F7B N +1F7D N +1FBB N +1FBE N +1FC9 N +1FCB N +1FD3 N +1FDB N +1FE3 N +1FEB N +1FEE 1FEF N +1FF9 N +1FFB N +1FFD N +2000 2001 N +2126 N +212A 212B N +2329 232A N +2ADC N +3099 309A M +F900 FA0D N +FA10 N +FA12 N +FA15 FA1E N +FA20 N +FA22 N +FA25 FA26 N +FA2A FA6D N +FA70 FAD9 N +FB1D N +FB1F N +FB2A FB36 N +FB38 FB3C N +FB3E N +FB40 FB41 N +FB43 FB44 N +FB46 FB4E N +110BA M +11127 M +1133E M +11357 M +114B0 M +114BA M +114BD M +115AF M +1D15E 1D164 N +1D1BB 1D1C0 N +2F800 2FA1D N +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToLb'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToLb'}{'missing'} = 'Unknown'; + +return <<'END'; +0 8 CM +9 BA +A LF +B C BK +D CR +E 1F CM +20 SP +21 EX +22 QU +23 AL +24 PR +25 PO +26 AL +27 QU +28 OP +29 CP +2A AL +2B PR +2C IS +2D HY +2E IS +2F SY +30 39 NU +3A 3B IS +3C 3E AL +3F EX +40 5A AL +5B OP +5C PR +5D CP +5E 7A AL +7B OP +7C BA +7D CL +7E AL +7F 84 CM +85 NL +86 9F CM +A0 GL +A1 OP +A2 PO +A3 A5 PR +A6 AL +A7 A8 AI +A9 AL +AA AI +AB QU +AC AL +AD BA +AE AF AL +B0 PO +B1 PR +B2 B3 AI +B4 BB +B5 AL +B6 BA AI +BB QU +BC BE AI +BF OP +C0 D6 AL +D7 AI +D8 F6 AL +F7 AI +F8 2C6 AL +2C7 AI +2C8 BB +2C9 2CB AI +2CC BB +2CD AI +2CE 2CF AL +2D0 AI +2D1 2D7 AL +2D8 2DB AI +2DC AL +2DD AI +2DE AL +2DF BB +2E0 2FF AL +300 34E CM +34F GL +350 35B CM +35C 362 GL +363 36F CM +370 377 AL +37A 37D AL +37E IS +37F AL +384 38A AL +38C AL +38E 3A1 AL +3A3 482 AL +483 489 CM +48A 52F AL +531 556 AL +559 55F AL +561 587 AL +589 IS +58A BA +58D 58E AL +58F PR +591 5BD CM +5BE BA +5BF CM +5C0 AL +5C1 5C2 CM +5C3 AL +5C4 5C5 CM +5C6 EX +5C7 CM +5D0 5EA HL +5F0 5F2 HL +5F3 5F4 AL +600 608 AL +609 60B PO +60C 60D IS +60E 60F AL +610 61A CM +61B EX +61C CM +61E 61F EX +620 64A AL +64B 65F CM +660 669 NU +66A PO +66B 66C NU +66D 66F AL +670 CM +671 6D3 AL +6D4 EX +6D5 AL +6D6 6DC CM +6DD 6DE AL +6DF 6E4 CM +6E5 6E6 AL +6E7 6E8 CM +6E9 AL +6EA 6ED CM +6EE 6EF AL +6F0 6F9 NU +6FA 70D AL +70F 710 AL +711 CM +712 72F AL +730 74A CM +74D 7A5 AL +7A6 7B0 CM +7B1 AL +7C0 7C9 NU +7CA 7EA AL +7EB 7F3 CM +7F4 7F7 AL +7F8 IS +7F9 EX +7FA AL +800 815 AL +816 819 CM +81A AL +81B 823 CM +824 AL +825 827 CM +828 AL +829 82D CM +830 83E AL +840 858 AL +859 85B CM +85E AL +860 86A AL +8A0 8B4 AL +8B6 8BD AL +8D4 8E1 CM +8E2 AL +8E3 903 CM +904 939 AL +93A 93C CM +93D AL +93E 94F CM +950 AL +951 957 CM +958 961 AL +962 963 CM +964 965 BA +966 96F NU +970 980 AL +981 983 CM +985 98C AL +98F 990 AL +993 9A8 AL +9AA 9B0 AL +9B2 AL +9B6 9B9 AL +9BC CM +9BD AL +9BE 9C4 CM +9C7 9C8 CM +9CB 9CD CM +9CE AL +9D7 CM +9DC 9DD AL +9DF 9E1 AL +9E2 9E3 CM +9E6 9EF NU +9F0 9F1 AL +9F2 9F3 PO +9F4 9F8 AL +9F9 PO +9FA AL +9FB PR +9FC 9FD AL +A01 A03 CM +A05 A0A AL +A0F A10 AL +A13 A28 AL +A2A A30 AL +A32 A33 AL +A35 A36 AL +A38 A39 AL +A3C CM +A3E A42 CM +A47 A48 CM +A4B A4D CM +A51 CM +A59 A5C AL +A5E AL +A66 A6F NU +A70 A71 CM +A72 A74 AL +A75 CM +A81 A83 CM +A85 A8D AL +A8F A91 AL +A93 AA8 AL +AAA AB0 AL +AB2 AB3 AL +AB5 AB9 AL +ABC CM +ABD AL +ABE AC5 CM +AC7 AC9 CM +ACB ACD CM +AD0 AL +AE0 AE1 AL +AE2 AE3 CM +AE6 AEF NU +AF0 AL +AF1 PR +AF9 AL +AFA AFF CM +B01 B03 CM +B05 B0C AL +B0F B10 AL +B13 B28 AL +B2A B30 AL +B32 B33 AL +B35 B39 AL +B3C CM +B3D AL +B3E B44 CM +B47 B48 CM +B4B B4D CM +B56 B57 CM +B5C B5D AL +B5F B61 AL +B62 B63 CM +B66 B6F NU +B70 B77 AL +B82 CM +B83 AL +B85 B8A AL +B8E B90 AL +B92 B95 AL +B99 B9A AL +B9C AL +B9E B9F AL +BA3 BA4 AL +BA8 BAA AL +BAE BB9 AL +BBE BC2 CM +BC6 BC8 CM +BCA BCD CM +BD0 AL +BD7 CM +BE6 BEF NU +BF0 BF8 AL +BF9 PR +BFA AL +C00 C03 CM +C05 C0C AL +C0E C10 AL +C12 C28 AL +C2A C39 AL +C3D AL +C3E C44 CM +C46 C48 CM +C4A C4D CM +C55 C56 CM +C58 C5A AL +C60 C61 AL +C62 C63 CM +C66 C6F NU +C78 C80 AL +C81 C83 CM +C85 C8C AL +C8E C90 AL +C92 CA8 AL +CAA CB3 AL +CB5 CB9 AL +CBC CM +CBD AL +CBE CC4 CM +CC6 CC8 CM +CCA CCD CM +CD5 CD6 CM +CDE AL +CE0 CE1 AL +CE2 CE3 CM +CE6 CEF NU +CF1 CF2 AL +D00 D03 CM +D05 D0C AL +D0E D10 AL +D12 D3A AL +D3B D3C CM +D3D AL +D3E D44 CM +D46 D48 CM +D4A D4D CM +D4E D4F AL +D54 D56 AL +D57 CM +D58 D61 AL +D62 D63 CM +D66 D6F NU +D70 D78 AL +D79 PO +D7A D7F AL +D82 D83 CM +D85 D96 AL +D9A DB1 AL +DB3 DBB AL +DBD AL +DC0 DC6 AL +DCA CM +DCF DD4 CM +DD6 CM +DD8 DDF CM +DE6 DEF NU +DF2 DF3 CM +DF4 AL +E01 E3A SA +E3F PR +E40 E4E SA +E4F AL +E50 E59 NU +E5A E5B BA +E81 E82 SA +E84 SA +E87 E88 SA +E8A SA +E8D SA +E94 E97 SA +E99 E9F SA +EA1 EA3 SA +EA5 SA +EA7 SA +EAA EAB SA +EAD EB9 SA +EBB EBD SA +EC0 EC4 SA +EC6 SA +EC8 ECD SA +ED0 ED9 NU +EDC EDF SA +F00 AL +F01 F04 BB +F05 AL +F06 F07 BB +F08 GL +F09 F0A BB +F0B BA +F0C GL +F0D F11 EX +F12 GL +F13 AL +F14 EX +F15 F17 AL +F18 F19 CM +F1A F1F AL +F20 F29 NU +F2A F33 AL +F34 BA +F35 CM +F36 AL +F37 CM +F38 AL +F39 CM +F3A OP +F3B CL +F3C OP +F3D CL +F3E F3F CM +F40 F47 AL +F49 F6C AL +F71 F7E CM +F7F BA +F80 F84 CM +F85 BA +F86 F87 CM +F88 F8C AL +F8D F97 CM +F99 FBC CM +FBE FBF BA +FC0 FC5 AL +FC6 CM +FC7 FCC AL +FCE FCF AL +FD0 FD1 BB +FD2 BA +FD3 BB +FD4 FD8 AL +FD9 FDA GL +1000 103F SA +1040 1049 NU +104A 104B BA +104C 104F AL +1050 108F SA +1090 1099 NU +109A 109F SA +10A0 10C5 AL +10C7 AL +10CD AL +10D0 10FF AL +1100 115F JL +1160 11A7 JV +11A8 11FF JT +1200 1248 AL +124A 124D AL +1250 1256 AL +1258 AL +125A 125D AL +1260 1288 AL +128A 128D AL +1290 12B0 AL +12B2 12B5 AL +12B8 12BE AL +12C0 AL +12C2 12C5 AL +12C8 12D6 AL +12D8 1310 AL +1312 1315 AL +1318 135A AL +135D 135F CM +1360 AL +1361 BA +1362 137C AL +1380 1399 AL +13A0 13F5 AL +13F8 13FD AL +1400 BA +1401 167F AL +1680 BA +1681 169A AL +169B OP +169C CL +16A0 16EA AL +16EB 16ED BA +16EE 16F8 AL +1700 170C AL +170E 1711 AL +1712 1714 CM +1720 1731 AL +1732 1734 CM +1735 1736 BA +1740 1751 AL +1752 1753 CM +1760 176C AL +176E 1770 AL +1772 1773 CM +1780 17D3 SA +17D4 17D5 BA +17D6 NS +17D7 SA +17D8 BA +17D9 AL +17DA BA +17DB PR +17DC 17DD SA +17E0 17E9 NU +17F0 17F9 AL +1800 1801 AL +1802 1803 EX +1804 1805 BA +1806 BB +1807 AL +1808 1809 EX +180A AL +180B 180D CM +180E GL +1810 1819 NU +1820 1877 AL +1880 1884 AL +1885 1886 CM +1887 18A8 AL +18A9 CM +18AA AL +18B0 18F5 AL +1900 191E AL +1920 192B CM +1930 193B CM +1940 AL +1944 1945 EX +1946 194F NU +1950 196D SA +1970 1974 SA +1980 19AB SA +19B0 19C9 SA +19D0 19D9 NU +19DA SA +19DE 19DF SA +19E0 1A16 AL +1A17 1A1B CM +1A1E 1A1F AL +1A20 1A5E SA +1A60 1A7C SA +1A7F CM +1A80 1A89 NU +1A90 1A99 NU +1AA0 1AAD SA +1AB0 1ABE CM +1B00 1B04 CM +1B05 1B33 AL +1B34 1B44 CM +1B45 1B4B AL +1B50 1B59 NU +1B5A 1B5B BA +1B5C AL +1B5D 1B60 BA +1B61 1B6A AL +1B6B 1B73 CM +1B74 1B7C AL +1B80 1B82 CM +1B83 1BA0 AL +1BA1 1BAD CM +1BAE 1BAF AL +1BB0 1BB9 NU +1BBA 1BE5 AL +1BE6 1BF3 CM +1BFC 1C23 AL +1C24 1C37 CM +1C3B 1C3F BA +1C40 1C49 NU +1C4D 1C4F AL +1C50 1C59 NU +1C5A 1C7D AL +1C7E 1C7F BA +1C80 1C88 AL +1CC0 1CC7 AL +1CD0 1CD2 CM +1CD3 AL +1CD4 1CE8 CM +1CE9 1CEC AL +1CED CM +1CEE 1CF1 AL +1CF2 1CF4 CM +1CF5 1CF6 AL +1CF7 1CF9 CM +1D00 1DBF AL +1DC0 1DF9 CM +1DFB 1DFF CM +1E00 1F15 AL +1F18 1F1D AL +1F20 1F45 AL +1F48 1F4D AL +1F50 1F57 AL +1F59 AL +1F5B AL +1F5D AL +1F5F 1F7D AL +1F80 1FB4 AL +1FB6 1FC4 AL +1FC6 1FD3 AL +1FD6 1FDB AL +1FDD 1FEF AL +1FF2 1FF4 AL +1FF6 1FFC AL +1FFD BB +1FFE AL +2000 2006 BA +2007 GL +2008 200A BA +200B ZW +200C CM +200D ZWJ +200E 200F CM +2010 BA +2011 GL +2012 2013 BA +2014 B2 +2015 2016 AI +2017 AL +2018 2019 QU +201A OP +201B 201D QU +201E OP +201F QU +2020 2021 AI +2022 2023 AL +2024 2026 IN +2027 BA +2028 2029 BK +202A 202E CM +202F GL +2030 2037 PO +2038 AL +2039 203A QU +203B AI +203C 203D NS +203E 2043 AL +2044 IS +2045 OP +2046 CL +2047 2049 NS +204A 2055 AL +2056 BA +2057 AL +2058 205B BA +205C AL +205D 205F BA +2060 WJ +2061 2064 AL +2066 206F CM +2070 2071 AL +2074 AI +2075 207C AL +207D OP +207E CL +207F AI +2080 AL +2081 2084 AI +2085 208C AL +208D OP +208E CL +2090 209C AL +20A0 20A6 PR +20A7 PO +20A8 20B5 PR +20B6 PO +20B7 20BA PR +20BB PO +20BC 20BD PR +20BE PO +20BF 20CF PR +20D0 20F0 CM +2100 2102 AL +2103 PO +2104 AL +2105 AI +2106 2108 AL +2109 PO +210A 2112 AL +2113 AI +2114 2115 AL +2116 PR +2117 2120 AL +2121 2122 AI +2123 212A AL +212B AI +212C 2153 AL +2154 2155 AI +2156 215A AL +215B AI +215C 215D AL +215E AI +215F AL +2160 216B AI +216C 216F AL +2170 2179 AI +217A 2188 AL +2189 AI +218A 218B AL +2190 2199 AI +219A 21D1 AL +21D2 AI +21D3 AL +21D4 AI +21D5 21FF AL +2200 AI +2201 AL +2202 2203 AI +2204 2206 AL +2207 2208 AI +2209 220A AL +220B AI +220C 220E AL +220F AI +2210 AL +2211 AI +2212 2213 PR +2214 AL +2215 AI +2216 2219 AL +221A AI +221B 221C AL +221D 2220 AI +2221 2222 AL +2223 AI +2224 AL +2225 AI +2226 AL +2227 222C AI +222D AL +222E AI +222F 2233 AL +2234 2237 AI +2238 223B AL +223C 223D AI +223E 2247 AL +2248 AI +2249 224B AL +224C AI +224D 2251 AL +2252 AI +2253 225F AL +2260 2261 AI +2262 2263 AL +2264 2267 AI +2268 2269 AL +226A 226B AI +226C 226D AL +226E 226F AI +2270 2281 AL +2282 2283 AI +2284 2285 AL +2286 2287 AI +2288 2294 AL +2295 AI +2296 2298 AL +2299 AI +229A 22A4 AL +22A5 AI +22A6 22BE AL +22BF AI +22C0 22EE AL +22EF IN +22F0 2307 AL +2308 OP +2309 CL +230A OP +230B CL +230C 2311 AL +2312 AI +2313 2319 AL +231A 231B ID +231C 2328 AL +2329 OP +232A CL +232B 23EF AL +23F0 23F3 ID +23F4 2426 AL +2440 244A AL +2460 24FE AI +24FF AL +2500 254B AI +254C 254F AL +2550 2574 AI +2575 257F AL +2580 258F AI +2590 2591 AL +2592 2595 AI +2596 259F AL +25A0 25A1 AI +25A2 AL +25A3 25A9 AI +25AA 25B1 AL +25B2 25B3 AI +25B4 25B5 AL +25B6 25B7 AI +25B8 25BB AL +25BC 25BD AI +25BE 25BF AL +25C0 25C1 AI +25C2 25C5 AL +25C6 25C8 AI +25C9 25CA AL +25CB AI +25CC 25CD AL +25CE 25D1 AI +25D2 25E1 AL +25E2 25E5 AI +25E6 25EE AL +25EF AI +25F0 25FF AL +2600 2603 ID +2604 AL +2605 2606 AI +2607 2608 AL +2609 AI +260A 260D AL +260E 260F AI +2610 2613 AL +2614 2615 ID +2616 2617 AI +2618 ID +2619 AL +261A 261C ID +261D EB +261E 261F ID +2620 2638 AL +2639 263B ID +263C 263F AL +2640 AI +2641 AL +2642 AI +2643 265F AL +2660 2661 AI +2662 AL +2663 2665 AI +2666 AL +2667 AI +2668 ID +2669 266A AI +266B AL +266C 266D AI +266E AL +266F AI +2670 267E AL +267F ID +2680 269D AL +269E 269F AI +26A0 26BC AL +26BD 26C8 ID +26C9 26CC AI +26CD ID +26CE AL +26CF 26D1 ID +26D2 AI +26D3 26D4 ID +26D5 26D7 AI +26D8 26D9 ID +26DA 26DB AI +26DC ID +26DD 26DE AI +26DF 26E1 ID +26E2 AL +26E3 AI +26E4 26E7 AL +26E8 26E9 AI +26EA ID +26EB 26F0 AI +26F1 26F5 ID +26F6 AI +26F7 26F8 ID +26F9 EB +26FA ID +26FB 26FC AI +26FD 2704 ID +2705 2707 AL +2708 2709 ID +270A 270D EB +270E 2756 AL +2757 AI +2758 275A AL +275B 2760 QU +2761 AL +2762 2763 EX +2764 ID +2765 2767 AL +2768 OP +2769 CL +276A OP +276B CL +276C OP +276D CL +276E OP +276F CL +2770 OP +2771 CL +2772 OP +2773 CL +2774 OP +2775 CL +2776 2793 AI +2794 27C4 AL +27C5 OP +27C6 CL +27C7 27E5 AL +27E6 OP +27E7 CL +27E8 OP +27E9 CL +27EA OP +27EB CL +27EC OP +27ED CL +27EE OP +27EF CL +27F0 2982 AL +2983 OP +2984 CL +2985 OP +2986 CL +2987 OP +2988 CL +2989 OP +298A CL +298B OP +298C CL +298D OP +298E CL +298F OP +2990 CL +2991 OP +2992 CL +2993 OP +2994 CL +2995 OP +2996 CL +2997 OP +2998 CL +2999 29D7 AL +29D8 OP +29D9 CL +29DA OP +29DB CL +29DC 29FB AL +29FC OP +29FD CL +29FE 2B54 AL +2B55 2B59 AI +2B5A 2B73 AL +2B76 2B95 AL +2B98 2BB9 AL +2BBD 2BC8 AL +2BCA 2BD2 AL +2BEC 2BEF AL +2C00 2C2E AL +2C30 2C5E AL +2C60 2CEE AL +2CEF 2CF1 CM +2CF2 2CF3 AL +2CF9 EX +2CFA 2CFC BA +2CFD AL +2CFE EX +2CFF BA +2D00 2D25 AL +2D27 AL +2D2D AL +2D30 2D67 AL +2D6F AL +2D70 BA +2D7F CM +2D80 2D96 AL +2DA0 2DA6 AL +2DA8 2DAE AL +2DB0 2DB6 AL +2DB8 2DBE AL +2DC0 2DC6 AL +2DC8 2DCE AL +2DD0 2DD6 AL +2DD8 2DDE AL +2DE0 2DFF CM +2E00 2E0D QU +2E0E 2E15 BA +2E16 AL +2E17 BA +2E18 OP +2E19 BA +2E1A 2E1B AL +2E1C 2E1D QU +2E1E 2E1F AL +2E20 2E21 QU +2E22 OP +2E23 CL +2E24 OP +2E25 CL +2E26 OP +2E27 CL +2E28 OP +2E29 CL +2E2A 2E2D BA +2E2E EX +2E2F AL +2E30 2E31 BA +2E32 AL +2E33 2E34 BA +2E35 2E39 AL +2E3A 2E3B B2 +2E3C 2E3E BA +2E3F AL +2E40 2E41 BA +2E42 OP +2E43 2E49 BA +2E80 2E99 ID +2E9B 2EF3 ID +2F00 2FD5 ID +2FF0 2FFB ID +3000 BA +3001 3002 CL +3003 3004 ID +3005 NS +3006 3007 ID +3008 OP +3009 CL +300A OP +300B CL +300C OP +300D CL +300E OP +300F CL +3010 OP +3011 CL +3012 3013 ID +3014 OP +3015 CL +3016 OP +3017 CL +3018 OP +3019 CL +301A OP +301B CL +301C NS +301D OP +301E 301F CL +3020 3029 ID +302A 302F CM +3030 3034 ID +3035 CM +3036 303A ID +303B 303C NS +303D 303F ID +3041 CJ +3042 ID +3043 CJ +3044 ID +3045 CJ +3046 ID +3047 CJ +3048 ID +3049 CJ +304A 3062 ID +3063 CJ +3064 3082 ID +3083 CJ +3084 ID +3085 CJ +3086 ID +3087 CJ +3088 308D ID +308E CJ +308F 3094 ID +3095 3096 CJ +3099 309A CM +309B 309E NS +309F ID +30A0 NS +30A1 CJ +30A2 ID +30A3 CJ +30A4 ID +30A5 CJ +30A6 ID +30A7 CJ +30A8 ID +30A9 CJ +30AA 30C2 ID +30C3 CJ +30C4 30E2 ID +30E3 CJ +30E4 ID +30E5 CJ +30E6 ID +30E7 CJ +30E8 30ED ID +30EE CJ +30EF 30F4 ID +30F5 30F6 CJ +30F7 30FA ID +30FB NS +30FC CJ +30FD 30FE NS +30FF ID +3105 312E ID +3131 318E ID +3190 31BA ID +31C0 31E3 ID +31F0 31FF CJ +3200 321E ID +3220 3247 ID +3248 324F AI +3250 32FE ID +3300 4DBF ID +4DC0 4DFF AL +4E00 A014 ID +A015 NS +A016 A48C ID +A490 A4C6 ID +A4D0 A4FD AL +A4FE A4FF BA +A500 A60C AL +A60D BA +A60E EX +A60F BA +A610 A61F AL +A620 A629 NU +A62A A62B AL +A640 A66E AL +A66F A672 CM +A673 AL +A674 A67D CM +A67E A69D AL +A69E A69F CM +A6A0 A6EF AL +A6F0 A6F1 CM +A6F2 AL +A6F3 A6F7 BA +A700 A7AE AL +A7B0 A7B7 AL +A7F7 A801 AL +A802 CM +A803 A805 AL +A806 CM +A807 A80A AL +A80B CM +A80C A822 AL +A823 A827 CM +A828 A82B AL +A830 A837 AL +A838 PO +A839 AL +A840 A873 AL +A874 A875 BB +A876 A877 EX +A880 A881 CM +A882 A8B3 AL +A8B4 A8C5 CM +A8CE A8CF BA +A8D0 A8D9 NU +A8E0 A8F1 CM +A8F2 A8FB AL +A8FC BB +A8FD AL +A900 A909 NU +A90A A925 AL +A926 A92D CM +A92E A92F BA +A930 A946 AL +A947 A953 CM +A95F AL +A960 A97C JL +A980 A983 CM +A984 A9B2 AL +A9B3 A9C0 CM +A9C1 A9C6 AL +A9C7 A9C9 BA +A9CA A9CD AL +A9CF AL +A9D0 A9D9 NU +A9DE A9DF AL +A9E0 A9EF SA +A9F0 A9F9 NU +A9FA A9FE SA +AA00 AA28 AL +AA29 AA36 CM +AA40 AA42 AL +AA43 CM +AA44 AA4B AL +AA4C AA4D CM +AA50 AA59 NU +AA5C AL +AA5D AA5F BA +AA60 AAC2 SA +AADB AADF SA +AAE0 AAEA AL +AAEB AAEF CM +AAF0 AAF1 BA +AAF2 AAF4 AL +AAF5 AAF6 CM +AB01 AB06 AL +AB09 AB0E AL +AB11 AB16 AL +AB20 AB26 AL +AB28 AB2E AL +AB30 AB65 AL +AB70 ABE2 AL +ABE3 ABEA CM +ABEB BA +ABEC ABED CM +ABF0 ABF9 NU +AC00 H2 +AC01 AC1B H3 +AC1C H2 +AC1D AC37 H3 +AC38 H2 +AC39 AC53 H3 +AC54 H2 +AC55 AC6F H3 +AC70 H2 +AC71 AC8B H3 +AC8C H2 +AC8D ACA7 H3 +ACA8 H2 +ACA9 ACC3 H3 +ACC4 H2 +ACC5 ACDF H3 +ACE0 H2 +ACE1 ACFB H3 +ACFC H2 +ACFD AD17 H3 +AD18 H2 +AD19 AD33 H3 +AD34 H2 +AD35 AD4F H3 +AD50 H2 +AD51 AD6B H3 +AD6C H2 +AD6D AD87 H3 +AD88 H2 +AD89 ADA3 H3 +ADA4 H2 +ADA5 ADBF H3 +ADC0 H2 +ADC1 ADDB H3 +ADDC H2 +ADDD ADF7 H3 +ADF8 H2 +ADF9 AE13 H3 +AE14 H2 +AE15 AE2F H3 +AE30 H2 +AE31 AE4B H3 +AE4C H2 +AE4D AE67 H3 +AE68 H2 +AE69 AE83 H3 +AE84 H2 +AE85 AE9F H3 +AEA0 H2 +AEA1 AEBB H3 +AEBC H2 +AEBD AED7 H3 +AED8 H2 +AED9 AEF3 H3 +AEF4 H2 +AEF5 AF0F H3 +AF10 H2 +AF11 AF2B H3 +AF2C H2 +AF2D AF47 H3 +AF48 H2 +AF49 AF63 H3 +AF64 H2 +AF65 AF7F H3 +AF80 H2 +AF81 AF9B H3 +AF9C H2 +AF9D AFB7 H3 +AFB8 H2 +AFB9 AFD3 H3 +AFD4 H2 +AFD5 AFEF H3 +AFF0 H2 +AFF1 B00B H3 +B00C H2 +B00D B027 H3 +B028 H2 +B029 B043 H3 +B044 H2 +B045 B05F H3 +B060 H2 +B061 B07B H3 +B07C H2 +B07D B097 H3 +B098 H2 +B099 B0B3 H3 +B0B4 H2 +B0B5 B0CF H3 +B0D0 H2 +B0D1 B0EB H3 +B0EC H2 +B0ED B107 H3 +B108 H2 +B109 B123 H3 +B124 H2 +B125 B13F H3 +B140 H2 +B141 B15B H3 +B15C H2 +B15D B177 H3 +B178 H2 +B179 B193 H3 +B194 H2 +B195 B1AF H3 +B1B0 H2 +B1B1 B1CB H3 +B1CC H2 +B1CD B1E7 H3 +B1E8 H2 +B1E9 B203 H3 +B204 H2 +B205 B21F H3 +B220 H2 +B221 B23B H3 +B23C H2 +B23D B257 H3 +B258 H2 +B259 B273 H3 +B274 H2 +B275 B28F H3 +B290 H2 +B291 B2AB H3 +B2AC H2 +B2AD B2C7 H3 +B2C8 H2 +B2C9 B2E3 H3 +B2E4 H2 +B2E5 B2FF H3 +B300 H2 +B301 B31B H3 +B31C H2 +B31D B337 H3 +B338 H2 +B339 B353 H3 +B354 H2 +B355 B36F H3 +B370 H2 +B371 B38B H3 +B38C H2 +B38D B3A7 H3 +B3A8 H2 +B3A9 B3C3 H3 +B3C4 H2 +B3C5 B3DF H3 +B3E0 H2 +B3E1 B3FB H3 +B3FC H2 +B3FD B417 H3 +B418 H2 +B419 B433 H3 +B434 H2 +B435 B44F H3 +B450 H2 +B451 B46B H3 +B46C H2 +B46D B487 H3 +B488 H2 +B489 B4A3 H3 +B4A4 H2 +B4A5 B4BF H3 +B4C0 H2 +B4C1 B4DB H3 +B4DC H2 +B4DD B4F7 H3 +B4F8 H2 +B4F9 B513 H3 +B514 H2 +B515 B52F H3 +B530 H2 +B531 B54B H3 +B54C H2 +B54D B567 H3 +B568 H2 +B569 B583 H3 +B584 H2 +B585 B59F H3 +B5A0 H2 +B5A1 B5BB H3 +B5BC H2 +B5BD B5D7 H3 +B5D8 H2 +B5D9 B5F3 H3 +B5F4 H2 +B5F5 B60F H3 +B610 H2 +B611 B62B H3 +B62C H2 +B62D B647 H3 +B648 H2 +B649 B663 H3 +B664 H2 +B665 B67F H3 +B680 H2 +B681 B69B H3 +B69C H2 +B69D B6B7 H3 +B6B8 H2 +B6B9 B6D3 H3 +B6D4 H2 +B6D5 B6EF H3 +B6F0 H2 +B6F1 B70B H3 +B70C H2 +B70D B727 H3 +B728 H2 +B729 B743 H3 +B744 H2 +B745 B75F H3 +B760 H2 +B761 B77B H3 +B77C H2 +B77D B797 H3 +B798 H2 +B799 B7B3 H3 +B7B4 H2 +B7B5 B7CF H3 +B7D0 H2 +B7D1 B7EB H3 +B7EC H2 +B7ED B807 H3 +B808 H2 +B809 B823 H3 +B824 H2 +B825 B83F H3 +B840 H2 +B841 B85B H3 +B85C H2 +B85D B877 H3 +B878 H2 +B879 B893 H3 +B894 H2 +B895 B8AF H3 +B8B0 H2 +B8B1 B8CB H3 +B8CC H2 +B8CD B8E7 H3 +B8E8 H2 +B8E9 B903 H3 +B904 H2 +B905 B91F H3 +B920 H2 +B921 B93B H3 +B93C H2 +B93D B957 H3 +B958 H2 +B959 B973 H3 +B974 H2 +B975 B98F H3 +B990 H2 +B991 B9AB H3 +B9AC H2 +B9AD B9C7 H3 +B9C8 H2 +B9C9 B9E3 H3 +B9E4 H2 +B9E5 B9FF H3 +BA00 H2 +BA01 BA1B H3 +BA1C H2 +BA1D BA37 H3 +BA38 H2 +BA39 BA53 H3 +BA54 H2 +BA55 BA6F H3 +BA70 H2 +BA71 BA8B H3 +BA8C H2 +BA8D BAA7 H3 +BAA8 H2 +BAA9 BAC3 H3 +BAC4 H2 +BAC5 BADF H3 +BAE0 H2 +BAE1 BAFB H3 +BAFC H2 +BAFD BB17 H3 +BB18 H2 +BB19 BB33 H3 +BB34 H2 +BB35 BB4F H3 +BB50 H2 +BB51 BB6B H3 +BB6C H2 +BB6D BB87 H3 +BB88 H2 +BB89 BBA3 H3 +BBA4 H2 +BBA5 BBBF H3 +BBC0 H2 +BBC1 BBDB H3 +BBDC H2 +BBDD BBF7 H3 +BBF8 H2 +BBF9 BC13 H3 +BC14 H2 +BC15 BC2F H3 +BC30 H2 +BC31 BC4B H3 +BC4C H2 +BC4D BC67 H3 +BC68 H2 +BC69 BC83 H3 +BC84 H2 +BC85 BC9F H3 +BCA0 H2 +BCA1 BCBB H3 +BCBC H2 +BCBD BCD7 H3 +BCD8 H2 +BCD9 BCF3 H3 +BCF4 H2 +BCF5 BD0F H3 +BD10 H2 +BD11 BD2B H3 +BD2C H2 +BD2D BD47 H3 +BD48 H2 +BD49 BD63 H3 +BD64 H2 +BD65 BD7F H3 +BD80 H2 +BD81 BD9B H3 +BD9C H2 +BD9D BDB7 H3 +BDB8 H2 +BDB9 BDD3 H3 +BDD4 H2 +BDD5 BDEF H3 +BDF0 H2 +BDF1 BE0B H3 +BE0C H2 +BE0D BE27 H3 +BE28 H2 +BE29 BE43 H3 +BE44 H2 +BE45 BE5F H3 +BE60 H2 +BE61 BE7B H3 +BE7C H2 +BE7D BE97 H3 +BE98 H2 +BE99 BEB3 H3 +BEB4 H2 +BEB5 BECF H3 +BED0 H2 +BED1 BEEB H3 +BEEC H2 +BEED BF07 H3 +BF08 H2 +BF09 BF23 H3 +BF24 H2 +BF25 BF3F H3 +BF40 H2 +BF41 BF5B H3 +BF5C H2 +BF5D BF77 H3 +BF78 H2 +BF79 BF93 H3 +BF94 H2 +BF95 BFAF H3 +BFB0 H2 +BFB1 BFCB H3 +BFCC H2 +BFCD BFE7 H3 +BFE8 H2 +BFE9 C003 H3 +C004 H2 +C005 C01F H3 +C020 H2 +C021 C03B H3 +C03C H2 +C03D C057 H3 +C058 H2 +C059 C073 H3 +C074 H2 +C075 C08F H3 +C090 H2 +C091 C0AB H3 +C0AC H2 +C0AD C0C7 H3 +C0C8 H2 +C0C9 C0E3 H3 +C0E4 H2 +C0E5 C0FF H3 +C100 H2 +C101 C11B H3 +C11C H2 +C11D C137 H3 +C138 H2 +C139 C153 H3 +C154 H2 +C155 C16F H3 +C170 H2 +C171 C18B H3 +C18C H2 +C18D C1A7 H3 +C1A8 H2 +C1A9 C1C3 H3 +C1C4 H2 +C1C5 C1DF H3 +C1E0 H2 +C1E1 C1FB H3 +C1FC H2 +C1FD C217 H3 +C218 H2 +C219 C233 H3 +C234 H2 +C235 C24F H3 +C250 H2 +C251 C26B H3 +C26C H2 +C26D C287 H3 +C288 H2 +C289 C2A3 H3 +C2A4 H2 +C2A5 C2BF H3 +C2C0 H2 +C2C1 C2DB H3 +C2DC H2 +C2DD C2F7 H3 +C2F8 H2 +C2F9 C313 H3 +C314 H2 +C315 C32F H3 +C330 H2 +C331 C34B H3 +C34C H2 +C34D C367 H3 +C368 H2 +C369 C383 H3 +C384 H2 +C385 C39F H3 +C3A0 H2 +C3A1 C3BB H3 +C3BC H2 +C3BD C3D7 H3 +C3D8 H2 +C3D9 C3F3 H3 +C3F4 H2 +C3F5 C40F H3 +C410 H2 +C411 C42B H3 +C42C H2 +C42D C447 H3 +C448 H2 +C449 C463 H3 +C464 H2 +C465 C47F H3 +C480 H2 +C481 C49B H3 +C49C H2 +C49D C4B7 H3 +C4B8 H2 +C4B9 C4D3 H3 +C4D4 H2 +C4D5 C4EF H3 +C4F0 H2 +C4F1 C50B H3 +C50C H2 +C50D C527 H3 +C528 H2 +C529 C543 H3 +C544 H2 +C545 C55F H3 +C560 H2 +C561 C57B H3 +C57C H2 +C57D C597 H3 +C598 H2 +C599 C5B3 H3 +C5B4 H2 +C5B5 C5CF H3 +C5D0 H2 +C5D1 C5EB H3 +C5EC H2 +C5ED C607 H3 +C608 H2 +C609 C623 H3 +C624 H2 +C625 C63F H3 +C640 H2 +C641 C65B H3 +C65C H2 +C65D C677 H3 +C678 H2 +C679 C693 H3 +C694 H2 +C695 C6AF H3 +C6B0 H2 +C6B1 C6CB H3 +C6CC H2 +C6CD C6E7 H3 +C6E8 H2 +C6E9 C703 H3 +C704 H2 +C705 C71F H3 +C720 H2 +C721 C73B H3 +C73C H2 +C73D C757 H3 +C758 H2 +C759 C773 H3 +C774 H2 +C775 C78F H3 +C790 H2 +C791 C7AB H3 +C7AC H2 +C7AD C7C7 H3 +C7C8 H2 +C7C9 C7E3 H3 +C7E4 H2 +C7E5 C7FF H3 +C800 H2 +C801 C81B H3 +C81C H2 +C81D C837 H3 +C838 H2 +C839 C853 H3 +C854 H2 +C855 C86F H3 +C870 H2 +C871 C88B H3 +C88C H2 +C88D C8A7 H3 +C8A8 H2 +C8A9 C8C3 H3 +C8C4 H2 +C8C5 C8DF H3 +C8E0 H2 +C8E1 C8FB H3 +C8FC H2 +C8FD C917 H3 +C918 H2 +C919 C933 H3 +C934 H2 +C935 C94F H3 +C950 H2 +C951 C96B H3 +C96C H2 +C96D C987 H3 +C988 H2 +C989 C9A3 H3 +C9A4 H2 +C9A5 C9BF H3 +C9C0 H2 +C9C1 C9DB H3 +C9DC H2 +C9DD C9F7 H3 +C9F8 H2 +C9F9 CA13 H3 +CA14 H2 +CA15 CA2F H3 +CA30 H2 +CA31 CA4B H3 +CA4C H2 +CA4D CA67 H3 +CA68 H2 +CA69 CA83 H3 +CA84 H2 +CA85 CA9F H3 +CAA0 H2 +CAA1 CABB H3 +CABC H2 +CABD CAD7 H3 +CAD8 H2 +CAD9 CAF3 H3 +CAF4 H2 +CAF5 CB0F H3 +CB10 H2 +CB11 CB2B H3 +CB2C H2 +CB2D CB47 H3 +CB48 H2 +CB49 CB63 H3 +CB64 H2 +CB65 CB7F H3 +CB80 H2 +CB81 CB9B H3 +CB9C H2 +CB9D CBB7 H3 +CBB8 H2 +CBB9 CBD3 H3 +CBD4 H2 +CBD5 CBEF H3 +CBF0 H2 +CBF1 CC0B H3 +CC0C H2 +CC0D CC27 H3 +CC28 H2 +CC29 CC43 H3 +CC44 H2 +CC45 CC5F H3 +CC60 H2 +CC61 CC7B H3 +CC7C H2 +CC7D CC97 H3 +CC98 H2 +CC99 CCB3 H3 +CCB4 H2 +CCB5 CCCF H3 +CCD0 H2 +CCD1 CCEB H3 +CCEC H2 +CCED CD07 H3 +CD08 H2 +CD09 CD23 H3 +CD24 H2 +CD25 CD3F H3 +CD40 H2 +CD41 CD5B H3 +CD5C H2 +CD5D CD77 H3 +CD78 H2 +CD79 CD93 H3 +CD94 H2 +CD95 CDAF H3 +CDB0 H2 +CDB1 CDCB H3 +CDCC H2 +CDCD CDE7 H3 +CDE8 H2 +CDE9 CE03 H3 +CE04 H2 +CE05 CE1F H3 +CE20 H2 +CE21 CE3B H3 +CE3C H2 +CE3D CE57 H3 +CE58 H2 +CE59 CE73 H3 +CE74 H2 +CE75 CE8F H3 +CE90 H2 +CE91 CEAB H3 +CEAC H2 +CEAD CEC7 H3 +CEC8 H2 +CEC9 CEE3 H3 +CEE4 H2 +CEE5 CEFF H3 +CF00 H2 +CF01 CF1B H3 +CF1C H2 +CF1D CF37 H3 +CF38 H2 +CF39 CF53 H3 +CF54 H2 +CF55 CF6F H3 +CF70 H2 +CF71 CF8B H3 +CF8C H2 +CF8D CFA7 H3 +CFA8 H2 +CFA9 CFC3 H3 +CFC4 H2 +CFC5 CFDF H3 +CFE0 H2 +CFE1 CFFB H3 +CFFC H2 +CFFD D017 H3 +D018 H2 +D019 D033 H3 +D034 H2 +D035 D04F H3 +D050 H2 +D051 D06B H3 +D06C H2 +D06D D087 H3 +D088 H2 +D089 D0A3 H3 +D0A4 H2 +D0A5 D0BF H3 +D0C0 H2 +D0C1 D0DB H3 +D0DC H2 +D0DD D0F7 H3 +D0F8 H2 +D0F9 D113 H3 +D114 H2 +D115 D12F H3 +D130 H2 +D131 D14B H3 +D14C H2 +D14D D167 H3 +D168 H2 +D169 D183 H3 +D184 H2 +D185 D19F H3 +D1A0 H2 +D1A1 D1BB H3 +D1BC H2 +D1BD D1D7 H3 +D1D8 H2 +D1D9 D1F3 H3 +D1F4 H2 +D1F5 D20F H3 +D210 H2 +D211 D22B H3 +D22C H2 +D22D D247 H3 +D248 H2 +D249 D263 H3 +D264 H2 +D265 D27F H3 +D280 H2 +D281 D29B H3 +D29C H2 +D29D D2B7 H3 +D2B8 H2 +D2B9 D2D3 H3 +D2D4 H2 +D2D5 D2EF H3 +D2F0 H2 +D2F1 D30B H3 +D30C H2 +D30D D327 H3 +D328 H2 +D329 D343 H3 +D344 H2 +D345 D35F H3 +D360 H2 +D361 D37B H3 +D37C H2 +D37D D397 H3 +D398 H2 +D399 D3B3 H3 +D3B4 H2 +D3B5 D3CF H3 +D3D0 H2 +D3D1 D3EB H3 +D3EC H2 +D3ED D407 H3 +D408 H2 +D409 D423 H3 +D424 H2 +D425 D43F H3 +D440 H2 +D441 D45B H3 +D45C H2 +D45D D477 H3 +D478 H2 +D479 D493 H3 +D494 H2 +D495 D4AF H3 +D4B0 H2 +D4B1 D4CB H3 +D4CC H2 +D4CD D4E7 H3 +D4E8 H2 +D4E9 D503 H3 +D504 H2 +D505 D51F H3 +D520 H2 +D521 D53B H3 +D53C H2 +D53D D557 H3 +D558 H2 +D559 D573 H3 +D574 H2 +D575 D58F H3 +D590 H2 +D591 D5AB H3 +D5AC H2 +D5AD D5C7 H3 +D5C8 H2 +D5C9 D5E3 H3 +D5E4 H2 +D5E5 D5FF H3 +D600 H2 +D601 D61B H3 +D61C H2 +D61D D637 H3 +D638 H2 +D639 D653 H3 +D654 H2 +D655 D66F H3 +D670 H2 +D671 D68B H3 +D68C H2 +D68D D6A7 H3 +D6A8 H2 +D6A9 D6C3 H3 +D6C4 H2 +D6C5 D6DF H3 +D6E0 H2 +D6E1 D6FB H3 +D6FC H2 +D6FD D717 H3 +D718 H2 +D719 D733 H3 +D734 H2 +D735 D74F H3 +D750 H2 +D751 D76B H3 +D76C H2 +D76D D787 H3 +D788 H2 +D789 D7A3 H3 +D7B0 D7C6 JV +D7CB D7FB JT +D800 DFFF SG +F900 FAFF ID +FB00 FB06 AL +FB13 FB17 AL +FB1D HL +FB1E CM +FB1F FB28 HL +FB29 AL +FB2A FB36 HL +FB38 FB3C HL +FB3E HL +FB40 FB41 HL +FB43 FB44 HL +FB46 FB4F HL +FB50 FBC1 AL +FBD3 FD3D AL +FD3E CL +FD3F OP +FD50 FD8F AL +FD92 FDC7 AL +FDF0 FDFB AL +FDFC PO +FDFD AL +FE00 FE0F CM +FE10 IS +FE11 FE12 CL +FE13 FE14 IS +FE15 FE16 EX +FE17 OP +FE18 CL +FE19 IN +FE20 FE2F CM +FE30 FE34 ID +FE35 OP +FE36 CL +FE37 OP +FE38 CL +FE39 OP +FE3A CL +FE3B OP +FE3C CL +FE3D OP +FE3E CL +FE3F OP +FE40 CL +FE41 OP +FE42 CL +FE43 OP +FE44 CL +FE45 FE46 ID +FE47 OP +FE48 CL +FE49 FE4F ID +FE50 CL +FE51 ID +FE52 CL +FE54 FE55 NS +FE56 FE57 EX +FE58 ID +FE59 OP +FE5A CL +FE5B OP +FE5C CL +FE5D OP +FE5E CL +FE5F FE66 ID +FE68 ID +FE69 PR +FE6A PO +FE6B ID +FE70 FE74 AL +FE76 FEFC AL +FEFF WJ +FF01 EX +FF02 FF03 ID +FF04 PR +FF05 PO +FF06 FF07 ID +FF08 OP +FF09 CL +FF0A FF0B ID +FF0C CL +FF0D ID +FF0E CL +FF0F FF19 ID +FF1A FF1B NS +FF1C FF1E ID +FF1F EX +FF20 FF3A ID +FF3B OP +FF3C ID +FF3D CL +FF3E FF5A ID +FF5B OP +FF5C ID +FF5D CL +FF5E ID +FF5F OP +FF60 FF61 CL +FF62 OP +FF63 FF64 CL +FF65 NS +FF66 ID +FF67 FF70 CJ +FF71 FF9D ID +FF9E FF9F NS +FFA0 FFBE ID +FFC2 FFC7 ID +FFCA FFCF ID +FFD2 FFD7 ID +FFDA FFDC ID +FFE0 PO +FFE1 PR +FFE2 FFE4 ID +FFE5 FFE6 PR +FFE8 FFEE AL +FFF9 FFFB CM +FFFC CB +FFFD AI +10000 1000B AL +1000D 10026 AL +10028 1003A AL +1003C 1003D AL +1003F 1004D AL +10050 1005D AL +10080 100FA AL +10100 10102 BA +10107 10133 AL +10137 1018E AL +10190 1019B AL +101A0 AL +101D0 101FC AL +101FD CM +10280 1029C AL +102A0 102D0 AL +102E0 CM +102E1 102FB AL +10300 10323 AL +1032D 1034A AL +10350 10375 AL +10376 1037A CM +10380 1039D AL +1039F BA +103A0 103C3 AL +103C8 103CF AL +103D0 BA +103D1 103D5 AL +10400 1049D AL +104A0 104A9 NU +104B0 104D3 AL +104D8 104FB AL +10500 10527 AL +10530 10563 AL +1056F AL +10600 10736 AL +10740 10755 AL +10760 10767 AL +10800 10805 AL +10808 AL +1080A 10835 AL +10837 10838 AL +1083C AL +1083F 10855 AL +10857 BA +10858 1089E AL +108A7 108AF AL +108E0 108F2 AL +108F4 108F5 AL +108FB 1091B AL +1091F BA +10920 10939 AL +1093F AL +10980 109B7 AL +109BC 109CF AL +109D2 10A00 AL +10A01 10A03 CM +10A05 10A06 CM +10A0C 10A0F CM +10A10 10A13 AL +10A15 10A17 AL +10A19 10A33 AL +10A38 10A3A CM +10A3F CM +10A40 10A47 AL +10A50 10A57 BA +10A58 AL +10A60 10A9F AL +10AC0 10AE4 AL +10AE5 10AE6 CM +10AEB 10AEF AL +10AF0 10AF5 BA +10AF6 IN +10B00 10B35 AL +10B39 10B3F BA +10B40 10B55 AL +10B58 10B72 AL +10B78 10B91 AL +10B99 10B9C AL +10BA9 10BAF AL +10C00 10C48 AL +10C80 10CB2 AL +10CC0 10CF2 AL +10CFA 10CFF AL +10E60 10E7E AL +11000 11002 CM +11003 11037 AL +11038 11046 CM +11047 11048 BA +11049 1104D AL +11052 11065 AL +11066 1106F NU +1107F 11082 CM +11083 110AF AL +110B0 110BA CM +110BB 110BD AL +110BE 110C1 BA +110D0 110E8 AL +110F0 110F9 NU +11100 11102 CM +11103 11126 AL +11127 11134 CM +11136 1113F NU +11140 11143 BA +11150 11172 AL +11173 CM +11174 AL +11175 BB +11176 AL +11180 11182 CM +11183 111B2 AL +111B3 111C0 CM +111C1 111C4 AL +111C5 111C6 BA +111C7 AL +111C8 BA +111C9 AL +111CA 111CC CM +111CD AL +111D0 111D9 NU +111DA AL +111DB BB +111DC AL +111DD 111DF BA +111E1 111F4 AL +11200 11211 AL +11213 1122B AL +1122C 11237 CM +11238 11239 BA +1123A AL +1123B 1123C BA +1123D AL +1123E CM +11280 11286 AL +11288 AL +1128A 1128D AL +1128F 1129D AL +1129F 112A8 AL +112A9 BA +112B0 112DE AL +112DF 112EA CM +112F0 112F9 NU +11300 11303 CM +11305 1130C AL +1130F 11310 AL +11313 11328 AL +1132A 11330 AL +11332 11333 AL +11335 11339 AL +1133C CM +1133D AL +1133E 11344 CM +11347 11348 CM +1134B 1134D CM +11350 AL +11357 CM +1135D 11361 AL +11362 11363 CM +11366 1136C CM +11370 11374 CM +11400 11434 AL +11435 11446 CM +11447 1144A AL +1144B 1144E BA +1144F AL +11450 11459 NU +1145B BA +1145D AL +11480 114AF AL +114B0 114C3 CM +114C4 114C7 AL +114D0 114D9 NU +11580 115AE AL +115AF 115B5 CM +115B8 115C0 CM +115C1 BB +115C2 115C3 BA +115C4 115C5 EX +115C6 115C8 AL +115C9 115D7 BA +115D8 115DB AL +115DC 115DD CM +11600 1162F AL +11630 11640 CM +11641 11642 BA +11643 11644 AL +11650 11659 NU +11660 1166C BB +11680 116AA AL +116AB 116B7 CM +116C0 116C9 NU +11700 11719 SA +1171D 1172B SA +11730 11739 NU +1173A 1173B SA +1173C 1173E BA +1173F SA +118A0 118DF AL +118E0 118E9 NU +118EA 118F2 AL +118FF AL +11A00 AL +11A01 11A0A CM +11A0B 11A32 AL +11A33 11A39 CM +11A3A AL +11A3B 11A3E CM +11A3F BB +11A40 AL +11A41 11A44 BA +11A45 BB +11A46 AL +11A47 CM +11A50 AL +11A51 11A5B CM +11A5C 11A83 AL +11A86 11A89 AL +11A8A 11A99 CM +11A9A 11A9C BA +11A9E 11AA0 BB +11AA1 11AA2 BA +11AC0 11AF8 AL +11C00 11C08 AL +11C0A 11C2E AL +11C2F 11C36 CM +11C38 11C3F CM +11C40 AL +11C41 11C45 BA +11C50 11C59 NU +11C5A 11C6C AL +11C70 BB +11C71 EX +11C72 11C8F AL +11C92 11CA7 CM +11CA9 11CB6 CM +11D00 11D06 AL +11D08 11D09 AL +11D0B 11D30 AL +11D31 11D36 CM +11D3A CM +11D3C 11D3D CM +11D3F 11D45 CM +11D46 AL +11D47 CM +11D50 11D59 NU +12000 12399 AL +12400 1246E AL +12470 12474 BA +12480 12543 AL +13000 13257 AL +13258 1325A OP +1325B 1325D CL +1325E 13281 AL +13282 CL +13283 13285 AL +13286 OP +13287 CL +13288 OP +13289 CL +1328A 13378 AL +13379 OP +1337A 1337B CL +1337C 1342E AL +14400 145CD AL +145CE OP +145CF CL +145D0 14646 AL +16800 16A38 AL +16A40 16A5E AL +16A60 16A69 NU +16A6E 16A6F BA +16AD0 16AED AL +16AF0 16AF4 CM +16AF5 BA +16B00 16B2F AL +16B30 16B36 CM +16B37 16B39 BA +16B3A 16B43 AL +16B44 BA +16B45 AL +16B50 16B59 NU +16B5B 16B61 AL +16B63 16B77 AL +16B7D 16B8F AL +16F00 16F44 AL +16F50 AL +16F51 16F7E CM +16F8F 16F92 CM +16F93 16F9F AL +16FE0 16FE1 NS +17000 187EC ID +18800 18AF2 ID +1B000 1B11E ID +1B170 1B2FB ID +1BC00 1BC6A AL +1BC70 1BC7C AL +1BC80 1BC88 AL +1BC90 1BC99 AL +1BC9C AL +1BC9D 1BC9E CM +1BC9F BA +1BCA0 1BCA3 CM +1D000 1D0F5 AL +1D100 1D126 AL +1D129 1D164 AL +1D165 1D169 CM +1D16A 1D16C AL +1D16D 1D182 CM +1D183 1D184 AL +1D185 1D18B CM +1D18C 1D1A9 AL +1D1AA 1D1AD CM +1D1AE 1D1E8 AL +1D200 1D241 AL +1D242 1D244 CM +1D245 AL +1D300 1D356 AL +1D360 1D371 AL +1D400 1D454 AL +1D456 1D49C AL +1D49E 1D49F AL +1D4A2 AL +1D4A5 1D4A6 AL +1D4A9 1D4AC AL +1D4AE 1D4B9 AL +1D4BB AL +1D4BD 1D4C3 AL +1D4C5 1D505 AL +1D507 1D50A AL +1D50D 1D514 AL +1D516 1D51C AL +1D51E 1D539 AL +1D53B 1D53E AL +1D540 1D544 AL +1D546 AL +1D54A 1D550 AL +1D552 1D6A5 AL +1D6A8 1D7CB AL +1D7CE 1D7FF NU +1D800 1D9FF AL +1DA00 1DA36 CM +1DA37 1DA3A AL +1DA3B 1DA6C CM +1DA6D 1DA74 AL +1DA75 CM +1DA76 1DA83 AL +1DA84 CM +1DA85 1DA86 AL +1DA87 1DA8A BA +1DA8B AL +1DA9B 1DA9F CM +1DAA1 1DAAF CM +1E000 1E006 CM +1E008 1E018 CM +1E01B 1E021 CM +1E023 1E024 CM +1E026 1E02A CM +1E800 1E8C4 AL +1E8C7 1E8CF AL +1E8D0 1E8D6 CM +1E900 1E943 AL +1E944 1E94A CM +1E950 1E959 NU +1E95E 1E95F OP +1EE00 1EE03 AL +1EE05 1EE1F AL +1EE21 1EE22 AL +1EE24 AL +1EE27 AL +1EE29 1EE32 AL +1EE34 1EE37 AL +1EE39 AL +1EE3B AL +1EE42 AL +1EE47 AL +1EE49 AL +1EE4B AL +1EE4D 1EE4F AL +1EE51 1EE52 AL +1EE54 AL +1EE57 AL +1EE59 AL +1EE5B AL +1EE5D AL +1EE5F AL +1EE61 1EE62 AL +1EE64 AL +1EE67 1EE6A AL +1EE6C 1EE72 AL +1EE74 1EE77 AL +1EE79 1EE7C AL +1EE7E AL +1EE80 1EE89 AL +1EE8B 1EE9B AL +1EEA1 1EEA3 AL +1EEA5 1EEA9 AL +1EEAB 1EEBB AL +1EEF0 1EEF1 AL +1F000 1F0FF ID +1F100 1F10C AI +1F10D 1F10F ID +1F110 1F12D AI +1F12E AL +1F12F ID +1F130 1F169 AI +1F16A 1F16B AL +1F16C 1F16F ID +1F170 1F1AC AI +1F1AD 1F1E5 ID +1F1E6 1F1FF RI +1F200 1F384 ID +1F385 EB +1F386 1F39B ID +1F39C 1F39D AL +1F39E 1F3B4 ID +1F3B5 1F3B6 AL +1F3B7 1F3BB ID +1F3BC AL +1F3BD 1F3C1 ID +1F3C2 1F3C4 EB +1F3C5 1F3C6 ID +1F3C7 EB +1F3C8 1F3C9 ID +1F3CA 1F3CC EB +1F3CD 1F3FA ID +1F3FB 1F3FF EM +1F400 1F441 ID +1F442 1F443 EB +1F444 1F445 ID +1F446 1F450 EB +1F451 1F465 ID +1F466 1F469 EB +1F46A 1F46D ID +1F46E EB +1F46F ID +1F470 1F478 EB +1F479 1F47B ID +1F47C EB +1F47D 1F480 ID +1F481 1F483 EB +1F484 ID +1F485 1F487 EB +1F488 1F49F ID +1F4A0 AL +1F4A1 ID +1F4A2 AL +1F4A3 ID +1F4A4 AL +1F4A5 1F4A9 ID +1F4AA EB +1F4AB 1F4AE ID +1F4AF AL +1F4B0 ID +1F4B1 1F4B2 AL +1F4B3 1F4FF ID +1F500 1F506 AL +1F507 1F516 ID +1F517 1F524 AL +1F525 1F531 ID +1F532 1F549 AL +1F54A 1F573 ID +1F574 1F575 EB +1F576 1F579 ID +1F57A EB +1F57B 1F58F ID +1F590 EB +1F591 1F594 ID +1F595 1F596 EB +1F597 1F5D3 ID +1F5D4 1F5DB AL +1F5DC 1F5F3 ID +1F5F4 1F5F9 AL +1F5FA 1F644 ID +1F645 1F647 EB +1F648 1F64A ID +1F64B 1F64F EB +1F650 1F675 AL +1F676 1F678 QU +1F679 1F67B NS +1F67C 1F67F AL +1F680 1F6A2 ID +1F6A3 EB +1F6A4 1F6B3 ID +1F6B4 1F6B6 EB +1F6B7 1F6BF ID +1F6C0 EB +1F6C1 1F6CB ID +1F6CC EB +1F6CD 1F6FF ID +1F700 1F773 AL +1F774 1F77F ID +1F780 1F7D4 AL +1F7D5 1F7FF ID +1F800 1F80B AL +1F80C 1F80F ID +1F810 1F847 AL +1F848 1F84F ID +1F850 1F859 AL +1F85A 1F85F ID +1F860 1F887 AL +1F888 1F88F ID +1F890 1F8AD AL +1F8AE 1F8FF ID +1F900 1F90B AL +1F90C 1F917 ID +1F918 1F91C EB +1F91D ID +1F91E 1F91F EB +1F920 1F925 ID +1F926 EB +1F927 1F92F ID +1F930 1F939 EB +1F93A 1F93C ID +1F93D 1F93E EB +1F93F 1F9D0 ID +1F9D1 1F9DD EB +1F9DE 1FFFD ID +20000 2FFFD ID +30000 3FFFD ID +E0001 CM +E0020 E007F CM +E0100 E01EF CM +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToAge'}{'format'} = 'f'; # floating point number +$utf8::SwashInfo{'ToAge'}{'missing'} = 'Unassigned'; + +return <<'END'; +0 1F5 1.1 +1F6 1F9 3.0 +1FA 217 1.1 +218 21F 3.0 +220 3.2 +221 4.0 +222 233 3.0 +234 236 4.0 +237 241 4.1 +242 24F 5.0 +250 2A8 1.1 +2A9 2AD 3.0 +2AE 2AF 4.0 +2B0 2DE 1.1 +2DF 3.0 +2E0 2E9 1.1 +2EA 2EE 3.0 +2EF 2FF 4.0 +300 345 1.1 +346 34E 3.0 +34F 3.2 +350 357 4.0 +358 35C 4.1 +35D 35F 4.0 +360 361 1.1 +362 3.0 +363 36F 3.2 +370 373 5.1 +374 375 1.1 +376 377 5.1 +37A 1.1 +37B 37D 5.0 +37E 1.1 +37F 7.0 +384 38A 1.1 +38C 1.1 +38E 3A1 1.1 +3A3 3CE 1.1 +3CF 5.1 +3D0 3D6 1.1 +3D7 3.0 +3D8 3D9 3.2 +3DA 1.1 +3DB 3.0 +3DC 1.1 +3DD 3.0 +3DE 1.1 +3DF 3.0 +3E0 1.1 +3E1 3.0 +3E2 3F3 1.1 +3F4 3F5 3.1 +3F6 3.2 +3F7 3FB 4.0 +3FC 3FF 4.1 +400 3.0 +401 40C 1.1 +40D 3.0 +40E 44F 1.1 +450 3.0 +451 45C 1.1 +45D 3.0 +45E 486 1.1 +487 5.1 +488 489 3.0 +48A 48B 3.2 +48C 48F 3.0 +490 4C4 1.1 +4C5 4C6 3.2 +4C7 4C8 1.1 +4C9 4CA 3.2 +4CB 4CC 1.1 +4CD 4CE 3.2 +4CF 5.0 +4D0 4EB 1.1 +4EC 4ED 3.0 +4EE 4F5 1.1 +4F6 4F7 4.1 +4F8 4F9 1.1 +4FA 4FF 5.0 +500 50F 3.2 +510 513 5.0 +514 523 5.1 +524 525 5.2 +526 527 6.0 +528 52F 7.0 +531 556 1.1 +559 55F 1.1 +561 587 1.1 +589 1.1 +58A 3.0 +58D 58E 7.0 +58F 6.1 +591 5A1 2.0 +5A2 4.1 +5A3 5AF 2.0 +5B0 5B9 1.1 +5BA 5.0 +5BB 5C3 1.1 +5C4 2.0 +5C5 5C7 4.1 +5D0 5EA 1.1 +5F0 5F4 1.1 +600 603 4.0 +604 6.1 +605 7.0 +606 60A 5.1 +60B 4.1 +60C 1.1 +60D 615 4.0 +616 61A 5.1 +61B 1.1 +61C 6.3 +61E 4.1 +61F 1.1 +620 6.0 +621 63A 1.1 +63B 63F 5.1 +640 652 1.1 +653 655 3.0 +656 658 4.0 +659 65E 4.1 +65F 6.0 +660 66D 1.1 +66E 66F 3.2 +670 6B7 1.1 +6B8 6B9 3.0 +6BA 6BE 1.1 +6BF 3.0 +6C0 6CE 1.1 +6CF 3.0 +6D0 6ED 1.1 +6EE 6EF 4.0 +6F0 6F9 1.1 +6FA 6FE 3.0 +6FF 4.0 +700 70D 3.0 +70F 72C 3.0 +72D 72F 4.0 +730 74A 3.0 +74D 74F 4.0 +750 76D 4.1 +76E 77F 5.1 +780 7B0 3.0 +7B1 3.2 +7C0 7FA 5.0 +800 82D 5.2 +830 83E 5.2 +840 85B 6.0 +85E 6.0 +860 86A 10.0 +8A0 6.1 +8A1 7.0 +8A2 8AC 6.1 +8AD 8B2 7.0 +8B3 8B4 8.0 +8B6 8BD 9.0 +8D4 8E2 9.0 +8E3 8.0 +8E4 8FE 6.1 +8FF 7.0 +900 5.2 +901 903 1.1 +904 4.0 +905 939 1.1 +93A 93B 6.0 +93C 94D 1.1 +94E 5.2 +94F 6.0 +950 954 1.1 +955 5.2 +956 957 6.0 +958 970 1.1 +971 972 5.1 +973 977 6.0 +978 7.0 +979 97A 5.2 +97B 97C 5.0 +97D 4.1 +97E 97F 5.0 +980 7.0 +981 983 1.1 +985 98C 1.1 +98F 990 1.1 +993 9A8 1.1 +9AA 9B0 1.1 +9B2 1.1 +9B6 9B9 1.1 +9BC 1.1 +9BD 4.0 +9BE 9C4 1.1 +9C7 9C8 1.1 +9CB 9CD 1.1 +9CE 4.1 +9D7 1.1 +9DC 9DD 1.1 +9DF 9E3 1.1 +9E6 9FA 1.1 +9FB 5.2 +9FC 9FD 10.0 +A01 4.0 +A02 1.1 +A03 4.0 +A05 A0A 1.1 +A0F A10 1.1 +A13 A28 1.1 +A2A A30 1.1 +A32 A33 1.1 +A35 A36 1.1 +A38 A39 1.1 +A3C 1.1 +A3E A42 1.1 +A47 A48 1.1 +A4B A4D 1.1 +A51 5.1 +A59 A5C 1.1 +A5E 1.1 +A66 A74 1.1 +A75 5.1 +A81 A83 1.1 +A85 A8B 1.1 +A8C 4.0 +A8D 1.1 +A8F A91 1.1 +A93 AA8 1.1 +AAA AB0 1.1 +AB2 AB3 1.1 +AB5 AB9 1.1 +ABC AC5 1.1 +AC7 AC9 1.1 +ACB ACD 1.1 +AD0 1.1 +AE0 1.1 +AE1 AE3 4.0 +AE6 AEF 1.1 +AF0 6.1 +AF1 4.0 +AF9 8.0 +AFA AFF 10.0 +B01 B03 1.1 +B05 B0C 1.1 +B0F B10 1.1 +B13 B28 1.1 +B2A B30 1.1 +B32 B33 1.1 +B35 4.0 +B36 B39 1.1 +B3C B43 1.1 +B44 5.1 +B47 B48 1.1 +B4B B4D 1.1 +B56 B57 1.1 +B5C B5D 1.1 +B5F B61 1.1 +B62 B63 5.1 +B66 B70 1.1 +B71 4.0 +B72 B77 6.0 +B82 B83 1.1 +B85 B8A 1.1 +B8E B90 1.1 +B92 B95 1.1 +B99 B9A 1.1 +B9C 1.1 +B9E B9F 1.1 +BA3 BA4 1.1 +BA8 BAA 1.1 +BAE BB5 1.1 +BB6 4.1 +BB7 BB9 1.1 +BBE BC2 1.1 +BC6 BC8 1.1 +BCA BCD 1.1 +BD0 5.1 +BD7 1.1 +BE6 4.1 +BE7 BF2 1.1 +BF3 BFA 4.0 +C00 7.0 +C01 C03 1.1 +C05 C0C 1.1 +C0E C10 1.1 +C12 C28 1.1 +C2A C33 1.1 +C34 7.0 +C35 C39 1.1 +C3D 5.1 +C3E C44 1.1 +C46 C48 1.1 +C4A C4D 1.1 +C55 C56 1.1 +C58 C59 5.1 +C5A 8.0 +C60 C61 1.1 +C62 C63 5.1 +C66 C6F 1.1 +C78 C7F 5.1 +C80 9.0 +C81 7.0 +C82 C83 1.1 +C85 C8C 1.1 +C8E C90 1.1 +C92 CA8 1.1 +CAA CB3 1.1 +CB5 CB9 1.1 +CBC CBD 4.0 +CBE CC4 1.1 +CC6 CC8 1.1 +CCA CCD 1.1 +CD5 CD6 1.1 +CDE 1.1 +CE0 CE1 1.1 +CE2 CE3 5.0 +CE6 CEF 1.1 +CF1 CF2 5.0 +D00 10.0 +D01 7.0 +D02 D03 1.1 +D05 D0C 1.1 +D0E D10 1.1 +D12 D28 1.1 +D29 6.0 +D2A D39 1.1 +D3A 6.0 +D3B D3C 10.0 +D3D 5.1 +D3E D43 1.1 +D44 5.1 +D46 D48 1.1 +D4A D4D 1.1 +D4E 6.0 +D4F 9.0 +D54 D56 9.0 +D57 1.1 +D58 D5E 9.0 +D5F 8.0 +D60 D61 1.1 +D62 D63 5.1 +D66 D6F 1.1 +D70 D75 5.1 +D76 D78 9.0 +D79 D7F 5.1 +D82 D83 3.0 +D85 D96 3.0 +D9A DB1 3.0 +DB3 DBB 3.0 +DBD 3.0 +DC0 DC6 3.0 +DCA 3.0 +DCF DD4 3.0 +DD6 3.0 +DD8 DDF 3.0 +DE6 DEF 7.0 +DF2 DF4 3.0 +E01 E3A 1.1 +E3F E5B 1.1 +E81 E82 1.1 +E84 1.1 +E87 E88 1.1 +E8A 1.1 +E8D 1.1 +E94 E97 1.1 +E99 E9F 1.1 +EA1 EA3 1.1 +EA5 1.1 +EA7 1.1 +EAA EAB 1.1 +EAD EB9 1.1 +EBB EBD 1.1 +EC0 EC4 1.1 +EC6 1.1 +EC8 ECD 1.1 +ED0 ED9 1.1 +EDC EDD 1.1 +EDE EDF 6.1 +F00 F47 2.0 +F49 F69 2.0 +F6A 3.0 +F6B F6C 5.1 +F71 F8B 2.0 +F8C F8F 6.0 +F90 F95 2.0 +F96 3.0 +F97 2.0 +F99 FAD 2.0 +FAE FB0 3.0 +FB1 FB7 2.0 +FB8 3.0 +FB9 2.0 +FBA FBC 3.0 +FBE FCC 3.0 +FCE 5.1 +FCF 3.0 +FD0 FD1 4.1 +FD2 FD4 5.1 +FD5 FD8 5.2 +FD9 FDA 6.0 +1000 1021 3.0 +1022 5.1 +1023 1027 3.0 +1028 5.1 +1029 102A 3.0 +102B 5.1 +102C 1032 3.0 +1033 1035 5.1 +1036 1039 3.0 +103A 103F 5.1 +1040 1059 3.0 +105A 1099 5.1 +109A 109D 5.2 +109E 109F 5.1 +10A0 10C5 1.1 +10C7 6.1 +10CD 6.1 +10D0 10F6 1.1 +10F7 10F8 3.2 +10F9 10FA 4.1 +10FB 1.1 +10FC 4.1 +10FD 10FF 6.1 +1100 1159 1.1 +115A 115E 5.2 +115F 11A2 1.1 +11A3 11A7 5.2 +11A8 11F9 1.1 +11FA 11FF 5.2 +1200 1206 3.0 +1207 4.1 +1208 1246 3.0 +1247 4.1 +1248 3.0 +124A 124D 3.0 +1250 1256 3.0 +1258 3.0 +125A 125D 3.0 +1260 1286 3.0 +1287 4.1 +1288 3.0 +128A 128D 3.0 +1290 12AE 3.0 +12AF 4.1 +12B0 3.0 +12B2 12B5 3.0 +12B8 12BE 3.0 +12C0 3.0 +12C2 12C5 3.0 +12C8 12CE 3.0 +12CF 4.1 +12D0 12D6 3.0 +12D8 12EE 3.0 +12EF 4.1 +12F0 130E 3.0 +130F 4.1 +1310 3.0 +1312 1315 3.0 +1318 131E 3.0 +131F 4.1 +1320 1346 3.0 +1347 4.1 +1348 135A 3.0 +135D 135E 6.0 +135F 1360 4.1 +1361 137C 3.0 +1380 1399 4.1 +13A0 13F4 3.0 +13F5 8.0 +13F8 13FD 8.0 +1400 5.2 +1401 1676 3.0 +1677 167F 5.2 +1680 169C 3.0 +16A0 16F0 3.0 +16F1 16F8 7.0 +1700 170C 3.2 +170E 1714 3.2 +1720 1736 3.2 +1740 1753 3.2 +1760 176C 3.2 +176E 1770 3.2 +1772 1773 3.2 +1780 17DC 3.0 +17DD 4.0 +17E0 17E9 3.0 +17F0 17F9 4.0 +1800 180E 3.0 +1810 1819 3.0 +1820 1877 3.0 +1880 18A9 3.0 +18AA 5.1 +18B0 18F5 5.2 +1900 191C 4.0 +191D 191E 7.0 +1920 192B 4.0 +1930 193B 4.0 +1940 4.0 +1944 196D 4.0 +1970 1974 4.0 +1980 19A9 4.1 +19AA 19AB 5.2 +19B0 19C9 4.1 +19D0 19D9 4.1 +19DA 5.2 +19DE 19DF 4.1 +19E0 19FF 4.0 +1A00 1A1B 4.1 +1A1E 1A1F 4.1 +1A20 1A5E 5.2 +1A60 1A7C 5.2 +1A7F 1A89 5.2 +1A90 1A99 5.2 +1AA0 1AAD 5.2 +1AB0 1ABE 7.0 +1B00 1B4B 5.0 +1B50 1B7C 5.0 +1B80 1BAA 5.1 +1BAB 1BAD 6.1 +1BAE 1BB9 5.1 +1BBA 1BBF 6.1 +1BC0 1BF3 6.0 +1BFC 1BFF 6.0 +1C00 1C37 5.1 +1C3B 1C49 5.1 +1C4D 1C7F 5.1 +1C80 1C88 9.0 +1CC0 1CC7 6.1 +1CD0 1CF2 5.2 +1CF3 1CF6 6.1 +1CF7 10.0 +1CF8 1CF9 7.0 +1D00 1D6B 4.0 +1D6C 1DC3 4.1 +1DC4 1DCA 5.0 +1DCB 1DE6 5.1 +1DE7 1DF5 7.0 +1DF6 1DF9 10.0 +1DFB 9.0 +1DFC 6.0 +1DFD 5.2 +1DFE 1DFF 5.0 +1E00 1E9A 1.1 +1E9B 2.0 +1E9C 1E9F 5.1 +1EA0 1EF9 1.1 +1EFA 1EFF 5.1 +1F00 1F15 1.1 +1F18 1F1D 1.1 +1F20 1F45 1.1 +1F48 1F4D 1.1 +1F50 1F57 1.1 +1F59 1.1 +1F5B 1.1 +1F5D 1.1 +1F5F 1F7D 1.1 +1F80 1FB4 1.1 +1FB6 1FC4 1.1 +1FC6 1FD3 1.1 +1FD6 1FDB 1.1 +1FDD 1FEF 1.1 +1FF2 1FF4 1.1 +1FF6 1FFE 1.1 +2000 202E 1.1 +202F 3.0 +2030 2046 1.1 +2047 3.2 +2048 204D 3.0 +204E 2052 3.2 +2053 2054 4.0 +2055 2056 4.1 +2057 3.2 +2058 205E 4.1 +205F 2063 3.2 +2064 5.1 +2066 2069 6.3 +206A 2070 1.1 +2071 3.2 +2074 208E 1.1 +2090 2094 4.1 +2095 209C 6.0 +20A0 20AA 1.1 +20AB 2.0 +20AC 2.1 +20AD 20AF 3.0 +20B0 20B1 3.2 +20B2 20B5 4.1 +20B6 20B8 5.2 +20B9 6.0 +20BA 6.2 +20BB 20BD 7.0 +20BE 8.0 +20BF 10.0 +20D0 20E1 1.1 +20E2 20E3 3.0 +20E4 20EA 3.2 +20EB 4.1 +20EC 20EF 5.0 +20F0 5.1 +2100 2138 1.1 +2139 213A 3.0 +213B 4.0 +213C 4.1 +213D 214B 3.2 +214C 4.1 +214D 214E 5.0 +214F 5.1 +2150 2152 5.2 +2153 2182 1.1 +2183 3.0 +2184 5.0 +2185 2188 5.1 +2189 5.2 +218A 218B 8.0 +2190 21EA 1.1 +21EB 21F3 3.0 +21F4 21FF 3.2 +2200 22F1 1.1 +22F2 22FF 3.2 +2300 1.1 +2301 3.0 +2302 237A 1.1 +237B 3.0 +237C 3.2 +237D 239A 3.0 +239B 23CE 3.2 +23CF 23D0 4.0 +23D1 23DB 4.1 +23DC 23E7 5.0 +23E8 5.2 +23E9 23F3 6.0 +23F4 23FA 7.0 +23FB 23FE 9.0 +23FF 10.0 +2400 2424 1.1 +2425 2426 3.0 +2440 244A 1.1 +2460 24EA 1.1 +24EB 24FE 3.2 +24FF 4.0 +2500 2595 1.1 +2596 259F 3.2 +25A0 25EF 1.1 +25F0 25F7 3.0 +25F8 25FF 3.2 +2600 2613 1.1 +2614 2615 4.0 +2616 2617 3.2 +2618 4.1 +2619 3.0 +261A 266F 1.1 +2670 2671 3.0 +2672 267D 3.2 +267E 267F 4.1 +2680 2689 3.2 +268A 2691 4.0 +2692 269C 4.1 +269D 5.1 +269E 269F 5.2 +26A0 26A1 4.0 +26A2 26B1 4.1 +26B2 5.0 +26B3 26BC 5.1 +26BD 26BF 5.2 +26C0 26C3 5.1 +26C4 26CD 5.2 +26CE 6.0 +26CF 26E1 5.2 +26E2 6.0 +26E3 5.2 +26E4 26E7 6.0 +26E8 26FF 5.2 +2700 7.0 +2701 2704 1.1 +2705 6.0 +2706 2709 1.1 +270A 270B 6.0 +270C 2727 1.1 +2728 6.0 +2729 274B 1.1 +274C 6.0 +274D 1.1 +274E 6.0 +274F 2752 1.1 +2753 2755 6.0 +2756 1.1 +2757 5.2 +2758 275E 1.1 +275F 2760 6.0 +2761 2767 1.1 +2768 2775 3.2 +2776 2794 1.1 +2795 2797 6.0 +2798 27AF 1.1 +27B0 6.0 +27B1 27BE 1.1 +27BF 6.0 +27C0 27C6 4.1 +27C7 27CA 5.0 +27CB 6.1 +27CC 5.1 +27CD 6.1 +27CE 27CF 6.0 +27D0 27EB 3.2 +27EC 27EF 5.1 +27F0 27FF 3.2 +2800 28FF 3.0 +2900 2AFF 3.2 +2B00 2B0D 4.0 +2B0E 2B13 4.1 +2B14 2B1A 5.0 +2B1B 2B1F 5.1 +2B20 2B23 5.0 +2B24 2B4C 5.1 +2B4D 2B4F 7.0 +2B50 2B54 5.1 +2B55 2B59 5.2 +2B5A 2B73 7.0 +2B76 2B95 7.0 +2B98 2BB9 7.0 +2BBD 2BC8 7.0 +2BCA 2BD1 7.0 +2BD2 10.0 +2BEC 2BEF 8.0 +2C00 2C2E 4.1 +2C30 2C5E 4.1 +2C60 2C6C 5.0 +2C6D 2C6F 5.1 +2C70 5.2 +2C71 2C73 5.1 +2C74 2C77 5.0 +2C78 2C7D 5.1 +2C7E 2C7F 5.2 +2C80 2CEA 4.1 +2CEB 2CF1 5.2 +2CF2 2CF3 6.1 +2CF9 2D25 4.1 +2D27 6.1 +2D2D 6.1 +2D30 2D65 4.1 +2D66 2D67 6.1 +2D6F 4.1 +2D70 6.0 +2D7F 6.0 +2D80 2D96 4.1 +2DA0 2DA6 4.1 +2DA8 2DAE 4.1 +2DB0 2DB6 4.1 +2DB8 2DBE 4.1 +2DC0 2DC6 4.1 +2DC8 2DCE 4.1 +2DD0 2DD6 4.1 +2DD8 2DDE 4.1 +2DE0 2DFF 5.1 +2E00 2E17 4.1 +2E18 2E1B 5.1 +2E1C 2E1D 4.1 +2E1E 2E30 5.1 +2E31 5.2 +2E32 2E3B 6.1 +2E3C 2E42 7.0 +2E43 2E44 9.0 +2E45 2E49 10.0 +2E80 2E99 3.0 +2E9B 2EF3 3.0 +2F00 2FD5 3.0 +2FF0 2FFB 3.0 +3000 3037 1.1 +3038 303A 3.0 +303B 303D 3.2 +303E 3.0 +303F 1.1 +3041 3094 1.1 +3095 3096 3.2 +3099 309E 1.1 +309F 30A0 3.2 +30A1 30FE 1.1 +30FF 3.2 +3105 312C 1.1 +312D 5.1 +312E 10.0 +3131 318E 1.1 +3190 319F 1.1 +31A0 31B7 3.0 +31B8 31BA 6.0 +31C0 31CF 4.1 +31D0 31E3 5.1 +31F0 31FF 3.2 +3200 321C 1.1 +321D 321E 4.0 +3220 3243 1.1 +3244 324F 5.2 +3250 4.0 +3251 325F 3.2 +3260 327B 1.1 +327C 327D 4.0 +327E 4.1 +327F 32B0 1.1 +32B1 32BF 3.2 +32C0 32CB 1.1 +32CC 32CF 4.0 +32D0 32FE 1.1 +3300 3376 1.1 +3377 337A 4.0 +337B 33DD 1.1 +33DE 33DF 4.0 +33E0 33FE 1.1 +33FF 4.0 +3400 4DB5 3.0 +4DC0 4DFF 4.0 +4E00 9FA5 1.1 +9FA6 9FBB 4.1 +9FBC 9FC3 5.1 +9FC4 9FCB 5.2 +9FCC 6.1 +9FCD 9FD5 8.0 +9FD6 9FEA 10.0 +A000 A48C 3.0 +A490 A4A1 3.0 +A4A2 A4A3 3.2 +A4A4 A4B3 3.0 +A4B4 3.2 +A4B5 A4C0 3.0 +A4C1 3.2 +A4C2 A4C4 3.0 +A4C5 3.2 +A4C6 3.0 +A4D0 A4FF 5.2 +A500 A62B 5.1 +A640 A65F 5.1 +A660 A661 6.0 +A662 A673 5.1 +A674 A67B 6.1 +A67C A697 5.1 +A698 A69D 7.0 +A69E 8.0 +A69F 6.1 +A6A0 A6F7 5.2 +A700 A716 4.1 +A717 A71A 5.0 +A71B A71F 5.1 +A720 A721 5.0 +A722 A78C 5.1 +A78D A78E 6.0 +A78F 8.0 +A790 A791 6.0 +A792 A793 6.1 +A794 A79F 7.0 +A7A0 A7A9 6.0 +A7AA 6.1 +A7AB A7AD 7.0 +A7AE 9.0 +A7B0 A7B1 7.0 +A7B2 A7B7 8.0 +A7F7 7.0 +A7F8 A7F9 6.1 +A7FA 6.0 +A7FB A7FF 5.1 +A800 A82B 4.1 +A830 A839 5.2 +A840 A877 5.0 +A880 A8C4 5.1 +A8C5 9.0 +A8CE A8D9 5.1 +A8E0 A8FB 5.2 +A8FC A8FD 8.0 +A900 A953 5.1 +A95F 5.1 +A960 A97C 5.2 +A980 A9CD 5.2 +A9CF A9D9 5.2 +A9DE A9DF 5.2 +A9E0 A9FE 7.0 +AA00 AA36 5.1 +AA40 AA4D 5.1 +AA50 AA59 5.1 +AA5C AA5F 5.1 +AA60 AA7B 5.2 +AA7C AA7F 7.0 +AA80 AAC2 5.2 +AADB AADF 5.2 +AAE0 AAF6 6.1 +AB01 AB06 6.0 +AB09 AB0E 6.0 +AB11 AB16 6.0 +AB20 AB26 6.0 +AB28 AB2E 6.0 +AB30 AB5F 7.0 +AB60 AB63 8.0 +AB64 AB65 7.0 +AB70 ABBF 8.0 +ABC0 ABED 5.2 +ABF0 ABF9 5.2 +AC00 D7A3 2.0 +D7B0 D7C6 5.2 +D7CB D7FB 5.2 +D800 DFFF 2.0 +E000 FA2D 1.1 +FA2E FA2F 6.1 +FA30 FA6A 3.2 +FA6B FA6D 5.2 +FA70 FAD9 4.1 +FB00 FB06 1.1 +FB13 FB17 1.1 +FB1D 3.0 +FB1E FB36 1.1 +FB38 FB3C 1.1 +FB3E 1.1 +FB40 FB41 1.1 +FB43 FB44 1.1 +FB46 FBB1 1.1 +FBB2 FBC1 6.0 +FBD3 FD3F 1.1 +FD50 FD8F 1.1 +FD92 FDC7 1.1 +FDD0 FDEF 3.1 +FDF0 FDFB 1.1 +FDFC 3.2 +FDFD 4.0 +FE00 FE0F 3.2 +FE10 FE19 4.1 +FE20 FE23 1.1 +FE24 FE26 5.1 +FE27 FE2D 7.0 +FE2E FE2F 8.0 +FE30 FE44 1.1 +FE45 FE46 3.2 +FE47 FE48 4.0 +FE49 FE52 1.1 +FE54 FE66 1.1 +FE68 FE6B 1.1 +FE70 FE72 1.1 +FE73 3.2 +FE74 1.1 +FE76 FEFC 1.1 +FEFF 1.1 +FF01 FF5E 1.1 +FF5F FF60 3.2 +FF61 FFBE 1.1 +FFC2 FFC7 1.1 +FFCA FFCF 1.1 +FFD2 FFD7 1.1 +FFDA FFDC 1.1 +FFE0 FFE6 1.1 +FFE8 FFEE 1.1 +FFF9 FFFB 3.0 +FFFC 2.1 +FFFD FFFF 1.1 +10000 1000B 4.0 +1000D 10026 4.0 +10028 1003A 4.0 +1003C 1003D 4.0 +1003F 1004D 4.0 +10050 1005D 4.0 +10080 100FA 4.0 +10100 10102 4.0 +10107 10133 4.0 +10137 1013F 4.0 +10140 1018A 4.1 +1018B 1018C 7.0 +1018D 1018E 9.0 +10190 1019B 5.1 +101A0 7.0 +101D0 101FD 5.1 +10280 1029C 5.1 +102A0 102D0 5.1 +102E0 102FB 7.0 +10300 1031E 3.1 +1031F 7.0 +10320 10323 3.1 +1032D 1032F 10.0 +10330 1034A 3.1 +10350 1037A 7.0 +10380 1039D 4.0 +1039F 4.0 +103A0 103C3 4.1 +103C8 103D5 4.1 +10400 10425 3.1 +10426 10427 4.0 +10428 1044D 3.1 +1044E 1049D 4.0 +104A0 104A9 4.0 +104B0 104D3 9.0 +104D8 104FB 9.0 +10500 10527 7.0 +10530 10563 7.0 +1056F 7.0 +10600 10736 7.0 +10740 10755 7.0 +10760 10767 7.0 +10800 10805 4.0 +10808 4.0 +1080A 10835 4.0 +10837 10838 4.0 +1083C 4.0 +1083F 4.0 +10840 10855 5.2 +10857 1085F 5.2 +10860 1089E 7.0 +108A7 108AF 7.0 +108E0 108F2 8.0 +108F4 108F5 8.0 +108FB 108FF 8.0 +10900 10919 5.0 +1091A 1091B 5.2 +1091F 5.0 +10920 10939 5.1 +1093F 5.1 +10980 109B7 6.1 +109BC 109BD 8.0 +109BE 109BF 6.1 +109C0 109CF 8.0 +109D2 109FF 8.0 +10A00 10A03 4.1 +10A05 10A06 4.1 +10A0C 10A13 4.1 +10A15 10A17 4.1 +10A19 10A33 4.1 +10A38 10A3A 4.1 +10A3F 10A47 4.1 +10A50 10A58 4.1 +10A60 10A7F 5.2 +10A80 10A9F 7.0 +10AC0 10AE6 7.0 +10AEB 10AF6 7.0 +10B00 10B35 5.2 +10B39 10B55 5.2 +10B58 10B72 5.2 +10B78 10B7F 5.2 +10B80 10B91 7.0 +10B99 10B9C 7.0 +10BA9 10BAF 7.0 +10C00 10C48 5.2 +10C80 10CB2 8.0 +10CC0 10CF2 8.0 +10CFA 10CFF 8.0 +10E60 10E7E 5.2 +11000 1104D 6.0 +11052 1106F 6.0 +1107F 7.0 +11080 110C1 5.2 +110D0 110E8 6.1 +110F0 110F9 6.1 +11100 11134 6.1 +11136 11143 6.1 +11150 11176 7.0 +11180 111C8 6.1 +111C9 111CC 8.0 +111CD 7.0 +111D0 111D9 6.1 +111DA 7.0 +111DB 111DF 8.0 +111E1 111F4 7.0 +11200 11211 7.0 +11213 1123D 7.0 +1123E 9.0 +11280 11286 8.0 +11288 8.0 +1128A 1128D 8.0 +1128F 1129D 8.0 +1129F 112A9 8.0 +112B0 112EA 7.0 +112F0 112F9 7.0 +11300 8.0 +11301 11303 7.0 +11305 1130C 7.0 +1130F 11310 7.0 +11313 11328 7.0 +1132A 11330 7.0 +11332 11333 7.0 +11335 11339 7.0 +1133C 11344 7.0 +11347 11348 7.0 +1134B 1134D 7.0 +11350 8.0 +11357 7.0 +1135D 11363 7.0 +11366 1136C 7.0 +11370 11374 7.0 +11400 11459 9.0 +1145B 9.0 +1145D 9.0 +11480 114C7 7.0 +114D0 114D9 7.0 +11580 115B5 7.0 +115B8 115C9 7.0 +115CA 115DD 8.0 +11600 11644 7.0 +11650 11659 7.0 +11660 1166C 9.0 +11680 116B7 6.1 +116C0 116C9 6.1 +11700 11719 8.0 +1171D 1172B 8.0 +11730 1173F 8.0 +118A0 118F2 7.0 +118FF 7.0 +11A00 11A47 10.0 +11A50 11A83 10.0 +11A86 11A9C 10.0 +11A9E 11AA2 10.0 +11AC0 11AF8 7.0 +11C00 11C08 9.0 +11C0A 11C36 9.0 +11C38 11C45 9.0 +11C50 11C6C 9.0 +11C70 11C8F 9.0 +11C92 11CA7 9.0 +11CA9 11CB6 9.0 +11D00 11D06 10.0 +11D08 11D09 10.0 +11D0B 11D36 10.0 +11D3A 10.0 +11D3C 11D3D 10.0 +11D3F 11D47 10.0 +11D50 11D59 10.0 +12000 1236E 5.0 +1236F 12398 7.0 +12399 8.0 +12400 12462 5.0 +12463 1246E 7.0 +12470 12473 5.0 +12474 7.0 +12480 12543 8.0 +13000 1342E 5.2 +14400 14646 8.0 +16800 16A38 6.0 +16A40 16A5E 7.0 +16A60 16A69 7.0 +16A6E 16A6F 7.0 +16AD0 16AED 7.0 +16AF0 16AF5 7.0 +16B00 16B45 7.0 +16B50 16B59 7.0 +16B5B 16B61 7.0 +16B63 16B77 7.0 +16B7D 16B8F 7.0 +16F00 16F44 6.1 +16F50 16F7E 6.1 +16F8F 16F9F 6.1 +16FE0 9.0 +16FE1 10.0 +17000 187EC 9.0 +18800 18AF2 9.0 +1B000 1B001 6.0 +1B002 1B11E 10.0 +1B170 1B2FB 10.0 +1BC00 1BC6A 7.0 +1BC70 1BC7C 7.0 +1BC80 1BC88 7.0 +1BC90 1BC99 7.0 +1BC9C 1BCA3 7.0 +1D000 1D0F5 3.1 +1D100 1D126 3.1 +1D129 5.1 +1D12A 1D1DD 3.1 +1D1DE 1D1E8 8.0 +1D200 1D245 4.1 +1D300 1D356 4.0 +1D360 1D371 5.0 +1D400 1D454 3.1 +1D456 1D49C 3.1 +1D49E 1D49F 3.1 +1D4A2 3.1 +1D4A5 1D4A6 3.1 +1D4A9 1D4AC 3.1 +1D4AE 1D4B9 3.1 +1D4BB 3.1 +1D4BD 1D4C0 3.1 +1D4C1 4.0 +1D4C2 1D4C3 3.1 +1D4C5 1D505 3.1 +1D507 1D50A 3.1 +1D50D 1D514 3.1 +1D516 1D51C 3.1 +1D51E 1D539 3.1 +1D53B 1D53E 3.1 +1D540 1D544 3.1 +1D546 3.1 +1D54A 1D550 3.1 +1D552 1D6A3 3.1 +1D6A4 1D6A5 4.1 +1D6A8 1D7C9 3.1 +1D7CA 1D7CB 5.0 +1D7CE 1D7FF 3.1 +1D800 1DA8B 8.0 +1DA9B 1DA9F 8.0 +1DAA1 1DAAF 8.0 +1E000 1E006 9.0 +1E008 1E018 9.0 +1E01B 1E021 9.0 +1E023 1E024 9.0 +1E026 1E02A 9.0 +1E800 1E8C4 7.0 +1E8C7 1E8D6 7.0 +1E900 1E94A 9.0 +1E950 1E959 9.0 +1E95E 1E95F 9.0 +1EE00 1EE03 6.1 +1EE05 1EE1F 6.1 +1EE21 1EE22 6.1 +1EE24 6.1 +1EE27 6.1 +1EE29 1EE32 6.1 +1EE34 1EE37 6.1 +1EE39 6.1 +1EE3B 6.1 +1EE42 6.1 +1EE47 6.1 +1EE49 6.1 +1EE4B 6.1 +1EE4D 1EE4F 6.1 +1EE51 1EE52 6.1 +1EE54 6.1 +1EE57 6.1 +1EE59 6.1 +1EE5B 6.1 +1EE5D 6.1 +1EE5F 6.1 +1EE61 1EE62 6.1 +1EE64 6.1 +1EE67 1EE6A 6.1 +1EE6C 1EE72 6.1 +1EE74 1EE77 6.1 +1EE79 1EE7C 6.1 +1EE7E 6.1 +1EE80 1EE89 6.1 +1EE8B 1EE9B 6.1 +1EEA1 1EEA3 6.1 +1EEA5 1EEA9 6.1 +1EEAB 1EEBB 6.1 +1EEF0 1EEF1 6.1 +1F000 1F02B 5.1 +1F030 1F093 5.1 +1F0A0 1F0AE 6.0 +1F0B1 1F0BE 6.0 +1F0BF 7.0 +1F0C1 1F0CF 6.0 +1F0D1 1F0DF 6.0 +1F0E0 1F0F5 7.0 +1F100 1F10A 5.2 +1F10B 1F10C 7.0 +1F110 1F12E 5.2 +1F130 6.0 +1F131 5.2 +1F132 1F13C 6.0 +1F13D 5.2 +1F13E 6.0 +1F13F 5.2 +1F140 1F141 6.0 +1F142 5.2 +1F143 1F145 6.0 +1F146 5.2 +1F147 1F149 6.0 +1F14A 1F14E 5.2 +1F14F 1F156 6.0 +1F157 5.2 +1F158 1F15E 6.0 +1F15F 5.2 +1F160 1F169 6.0 +1F16A 1F16B 6.1 +1F170 1F178 6.0 +1F179 5.2 +1F17A 6.0 +1F17B 1F17C 5.2 +1F17D 1F17E 6.0 +1F17F 5.2 +1F180 1F189 6.0 +1F18A 1F18D 5.2 +1F18E 1F18F 6.0 +1F190 5.2 +1F191 1F19A 6.0 +1F19B 1F1AC 9.0 +1F1E6 1F1FF 6.0 +1F200 5.2 +1F201 1F202 6.0 +1F210 1F231 5.2 +1F232 1F23A 6.0 +1F23B 9.0 +1F240 1F248 5.2 +1F250 1F251 6.0 +1F260 1F265 10.0 +1F300 1F320 6.0 +1F321 1F32C 7.0 +1F32D 1F32F 8.0 +1F330 1F335 6.0 +1F336 7.0 +1F337 1F37C 6.0 +1F37D 7.0 +1F37E 1F37F 8.0 +1F380 1F393 6.0 +1F394 1F39F 7.0 +1F3A0 1F3C4 6.0 +1F3C5 7.0 +1F3C6 1F3CA 6.0 +1F3CB 1F3CE 7.0 +1F3CF 1F3D3 8.0 +1F3D4 1F3DF 7.0 +1F3E0 1F3F0 6.0 +1F3F1 1F3F7 7.0 +1F3F8 1F3FF 8.0 +1F400 1F43E 6.0 +1F43F 7.0 +1F440 6.0 +1F441 7.0 +1F442 1F4F7 6.0 +1F4F8 7.0 +1F4F9 1F4FC 6.0 +1F4FD 1F4FE 7.0 +1F4FF 8.0 +1F500 1F53D 6.0 +1F53E 1F53F 7.0 +1F540 1F543 6.1 +1F544 1F54A 7.0 +1F54B 1F54F 8.0 +1F550 1F567 6.0 +1F568 1F579 7.0 +1F57A 9.0 +1F57B 1F5A3 7.0 +1F5A4 9.0 +1F5A5 1F5FA 7.0 +1F5FB 1F5FF 6.0 +1F600 6.1 +1F601 1F610 6.0 +1F611 6.1 +1F612 1F614 6.0 +1F615 6.1 +1F616 6.0 +1F617 6.1 +1F618 6.0 +1F619 6.1 +1F61A 6.0 +1F61B 6.1 +1F61C 1F61E 6.0 +1F61F 6.1 +1F620 1F625 6.0 +1F626 1F627 6.1 +1F628 1F62B 6.0 +1F62C 6.1 +1F62D 6.0 +1F62E 1F62F 6.1 +1F630 1F633 6.0 +1F634 6.1 +1F635 1F640 6.0 +1F641 1F642 7.0 +1F643 1F644 8.0 +1F645 1F64F 6.0 +1F650 1F67F 7.0 +1F680 1F6C5 6.0 +1F6C6 1F6CF 7.0 +1F6D0 8.0 +1F6D1 1F6D2 9.0 +1F6D3 1F6D4 10.0 +1F6E0 1F6EC 7.0 +1F6F0 1F6F3 7.0 +1F6F4 1F6F6 9.0 +1F6F7 1F6F8 10.0 +1F700 1F773 6.0 +1F780 1F7D4 7.0 +1F800 1F80B 7.0 +1F810 1F847 7.0 +1F850 1F859 7.0 +1F860 1F887 7.0 +1F890 1F8AD 7.0 +1F900 1F90B 10.0 +1F910 1F918 8.0 +1F919 1F91E 9.0 +1F91F 10.0 +1F920 1F927 9.0 +1F928 1F92F 10.0 +1F930 9.0 +1F931 1F932 10.0 +1F933 1F93E 9.0 +1F940 1F94B 9.0 +1F94C 10.0 +1F950 1F95E 9.0 +1F95F 1F96B 10.0 +1F980 1F984 8.0 +1F985 1F991 9.0 +1F992 1F997 10.0 +1F9C0 8.0 +1F9D0 1F9E6 10.0 +1FFFE 1FFFF 2.0 +20000 2A6D6 3.1 +2A700 2B734 5.2 +2B740 2B81D 6.0 +2B820 2CEA1 8.0 +2CEB0 2EBE0 10.0 +2F800 2FA1D 3.1 +2FFFE 2FFFF 2.0 +3FFFE 3FFFF 2.0 +4FFFE 4FFFF 2.0 +5FFFE 5FFFF 2.0 +6FFFE 6FFFF 2.0 +7FFFE 7FFFF 2.0 +8FFFE 8FFFF 2.0 +9FFFE 9FFFF 2.0 +AFFFE AFFFF 2.0 +BFFFE BFFFF 2.0 +CFFFE CFFFF 2.0 +DFFFE DFFFF 2.0 +E0001 3.1 +E0020 E007F 3.1 +E0100 E01EF 4.0 +EFFFE 10FFFF 2.0 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! IT IS DEPRECATED TO USE THIS FILE !!!!!!! + +# This file is for internal use by core Perl only. It is retained for +# backwards compatibility with applications that may have come to rely on it, +# but its format and even its name or existence are subject to change without +# notice in a future Perl version. Don't use it directly. Instead, its +# contents are now retrievable through a stable API in the Unicode::UCD +# module: Unicode::UCD::prop_invmap('Lowercase_Mapping') (Values for individual +# code points can be retrieved via Unicode::UCD::charprop()); + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToLower'}{'format'} = 'x'; # non-negative hex whole number; a code point +$utf8::SwashInfo{'ToLower'}{'specials_name'} = 'utf8::ToSpecLower'; # Name of hash of special mappings +$utf8::SwashInfo{'ToLower'}{'missing'} = '<code point>'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecLower = ( +"\xC4\xB0" => "\x{0069}\x{0307}", # U+0130 => 0069 0307 +); + +return <<'END'; +0041 0061 +0042 0062 +0043 0063 +0044 0064 +0045 0065 +0046 0066 +0047 0067 +0048 0068 +0049 0069 +004A 006A +004B 006B +004C 006C +004D 006D +004E 006E +004F 006F +0050 0070 +0051 0071 +0052 0072 +0053 0073 +0054 0074 +0055 0075 +0056 0076 +0057 0077 +0058 0078 +0059 0079 +005A 007A +00C0 00E0 +00C1 00E1 +00C2 00E2 +00C3 00E3 +00C4 00E4 +00C5 00E5 +00C6 00E6 +00C7 00E7 +00C8 00E8 +00C9 00E9 +00CA 00EA +00CB 00EB +00CC 00EC +00CD 00ED +00CE 00EE +00CF 00EF +00D0 00F0 +00D1 00F1 +00D2 00F2 +00D3 00F3 +00D4 00F4 +00D5 00F5 +00D6 00F6 +00D8 00F8 +00D9 00F9 +00DA 00FA +00DB 00FB +00DC 00FC +00DD 00FD +00DE 00FE +0100 0101 +0102 0103 +0104 0105 +0106 0107 +0108 0109 +010A 010B +010C 010D +010E 010F +0110 0111 +0112 0113 +0114 0115 +0116 0117 +0118 0119 +011A 011B +011C 011D +011E 011F +0120 0121 +0122 0123 +0124 0125 +0126 0127 +0128 0129 +012A 012B +012C 012D +012E 012F +0132 0133 +0134 0135 +0136 0137 +0139 013A +013B 013C +013D 013E +013F 0140 +0141 0142 +0143 0144 +0145 0146 +0147 0148 +014A 014B +014C 014D +014E 014F +0150 0151 +0152 0153 +0154 0155 +0156 0157 +0158 0159 +015A 015B +015C 015D +015E 015F +0160 0161 +0162 0163 +0164 0165 +0166 0167 +0168 0169 +016A 016B +016C 016D +016E 016F +0170 0171 +0172 0173 +0174 0175 +0176 0177 +0178 00FF +0179 017A +017B 017C +017D 017E +0181 0253 +0182 0183 +0184 0185 +0186 0254 +0187 0188 +0189 0256 +018A 0257 +018B 018C +018E 01DD +018F 0259 +0190 025B +0191 0192 +0193 0260 +0194 0263 +0196 0269 +0197 0268 +0198 0199 +019C 026F +019D 0272 +019F 0275 +01A0 01A1 +01A2 01A3 +01A4 01A5 +01A6 0280 +01A7 01A8 +01A9 0283 +01AC 01AD +01AE 0288 +01AF 01B0 +01B1 028A +01B2 028B +01B3 01B4 +01B5 01B6 +01B7 0292 +01B8 01B9 +01BC 01BD +01C4 01C6 +01C5 01C6 +01C7 01C9 +01C8 01C9 +01CA 01CC +01CB 01CC +01CD 01CE +01CF 01D0 +01D1 01D2 +01D3 01D4 +01D5 01D6 +01D7 01D8 +01D9 01DA +01DB 01DC +01DE 01DF +01E0 01E1 +01E2 01E3 +01E4 01E5 +01E6 01E7 +01E8 01E9 +01EA 01EB +01EC 01ED +01EE 01EF +01F1 01F3 +01F2 01F3 +01F4 01F5 +01F6 0195 +01F7 01BF +01F8 01F9 +01FA 01FB +01FC 01FD +01FE 01FF +0200 0201 +0202 0203 +0204 0205 +0206 0207 +0208 0209 +020A 020B +020C 020D +020E 020F +0210 0211 +0212 0213 +0214 0215 +0216 0217 +0218 0219 +021A 021B +021C 021D +021E 021F +0220 019E +0222 0223 +0224 0225 +0226 0227 +0228 0229 +022A 022B +022C 022D +022E 022F +0230 0231 +0232 0233 +023A 2C65 +023B 023C +023D 019A +023E 2C66 +0241 0242 +0243 0180 +0244 0289 +0245 028C +0246 0247 +0248 0249 +024A 024B +024C 024D +024E 024F +0370 0371 +0372 0373 +0376 0377 +037F 03F3 +0386 03AC +0388 03AD +0389 03AE +038A 03AF +038C 03CC +038E 03CD +038F 03CE +0391 03B1 +0392 03B2 +0393 03B3 +0394 03B4 +0395 03B5 +0396 03B6 +0397 03B7 +0398 03B8 +0399 03B9 +039A 03BA +039B 03BB +039C 03BC +039D 03BD +039E 03BE +039F 03BF +03A0 03C0 +03A1 03C1 +03A3 03C3 +03A4 03C4 +03A5 03C5 +03A6 03C6 +03A7 03C7 +03A8 03C8 +03A9 03C9 +03AA 03CA +03AB 03CB +03CF 03D7 +03D8 03D9 +03DA 03DB +03DC 03DD +03DE 03DF +03E0 03E1 +03E2 03E3 +03E4 03E5 +03E6 03E7 +03E8 03E9 +03EA 03EB +03EC 03ED +03EE 03EF +03F4 03B8 +03F7 03F8 +03F9 03F2 +03FA 03FB +03FD 037B +03FE 037C +03FF 037D +0400 0450 +0401 0451 +0402 0452 +0403 0453 +0404 0454 +0405 0455 +0406 0456 +0407 0457 +0408 0458 +0409 0459 +040A 045A +040B 045B +040C 045C +040D 045D +040E 045E +040F 045F +0410 0430 +0411 0431 +0412 0432 +0413 0433 +0414 0434 +0415 0435 +0416 0436 +0417 0437 +0418 0438 +0419 0439 +041A 043A +041B 043B +041C 043C +041D 043D +041E 043E +041F 043F +0420 0440 +0421 0441 +0422 0442 +0423 0443 +0424 0444 +0425 0445 +0426 0446 +0427 0447 +0428 0448 +0429 0449 +042A 044A +042B 044B +042C 044C +042D 044D +042E 044E +042F 044F +0460 0461 +0462 0463 +0464 0465 +0466 0467 +0468 0469 +046A 046B +046C 046D +046E 046F +0470 0471 +0472 0473 +0474 0475 +0476 0477 +0478 0479 +047A 047B +047C 047D +047E 047F +0480 0481 +048A 048B +048C 048D +048E 048F +0490 0491 +0492 0493 +0494 0495 +0496 0497 +0498 0499 +049A 049B +049C 049D +049E 049F +04A0 04A1 +04A2 04A3 +04A4 04A5 +04A6 04A7 +04A8 04A9 +04AA 04AB +04AC 04AD +04AE 04AF +04B0 04B1 +04B2 04B3 +04B4 04B5 +04B6 04B7 +04B8 04B9 +04BA 04BB +04BC 04BD +04BE 04BF +04C0 04CF +04C1 04C2 +04C3 04C4 +04C5 04C6 +04C7 04C8 +04C9 04CA +04CB 04CC +04CD 04CE +04D0 04D1 +04D2 04D3 +04D4 04D5 +04D6 04D7 +04D8 04D9 +04DA 04DB +04DC 04DD +04DE 04DF +04E0 04E1 +04E2 04E3 +04E4 04E5 +04E6 04E7 +04E8 04E9 +04EA 04EB +04EC 04ED +04EE 04EF +04F0 04F1 +04F2 04F3 +04F4 04F5 +04F6 04F7 +04F8 04F9 +04FA 04FB +04FC 04FD +04FE 04FF +0500 0501 +0502 0503 +0504 0505 +0506 0507 +0508 0509 +050A 050B +050C 050D +050E 050F +0510 0511 +0512 0513 +0514 0515 +0516 0517 +0518 0519 +051A 051B +051C 051D +051E 051F +0520 0521 +0522 0523 +0524 0525 +0526 0527 +0528 0529 +052A 052B +052C 052D +052E 052F +0531 0561 +0532 0562 +0533 0563 +0534 0564 +0535 0565 +0536 0566 +0537 0567 +0538 0568 +0539 0569 +053A 056A +053B 056B +053C 056C +053D 056D +053E 056E +053F 056F +0540 0570 +0541 0571 +0542 0572 +0543 0573 +0544 0574 +0545 0575 +0546 0576 +0547 0577 +0548 0578 +0549 0579 +054A 057A +054B 057B +054C 057C +054D 057D +054E 057E +054F 057F +0550 0580 +0551 0581 +0552 0582 +0553 0583 +0554 0584 +0555 0585 +0556 0586 +10A0 2D00 +10A1 2D01 +10A2 2D02 +10A3 2D03 +10A4 2D04 +10A5 2D05 +10A6 2D06 +10A7 2D07 +10A8 2D08 +10A9 2D09 +10AA 2D0A +10AB 2D0B +10AC 2D0C +10AD 2D0D +10AE 2D0E +10AF 2D0F +10B0 2D10 +10B1 2D11 +10B2 2D12 +10B3 2D13 +10B4 2D14 +10B5 2D15 +10B6 2D16 +10B7 2D17 +10B8 2D18 +10B9 2D19 +10BA 2D1A +10BB 2D1B +10BC 2D1C +10BD 2D1D +10BE 2D1E +10BF 2D1F +10C0 2D20 +10C1 2D21 +10C2 2D22 +10C3 2D23 +10C4 2D24 +10C5 2D25 +10C7 2D27 +10CD 2D2D +13A0 AB70 +13A1 AB71 +13A2 AB72 +13A3 AB73 +13A4 AB74 +13A5 AB75 +13A6 AB76 +13A7 AB77 +13A8 AB78 +13A9 AB79 +13AA AB7A +13AB AB7B +13AC AB7C +13AD AB7D +13AE AB7E +13AF AB7F +13B0 AB80 +13B1 AB81 +13B2 AB82 +13B3 AB83 +13B4 AB84 +13B5 AB85 +13B6 AB86 +13B7 AB87 +13B8 AB88 +13B9 AB89 +13BA AB8A +13BB AB8B +13BC AB8C +13BD AB8D +13BE AB8E +13BF AB8F +13C0 AB90 +13C1 AB91 +13C2 AB92 +13C3 AB93 +13C4 AB94 +13C5 AB95 +13C6 AB96 +13C7 AB97 +13C8 AB98 +13C9 AB99 +13CA AB9A +13CB AB9B +13CC AB9C +13CD AB9D +13CE AB9E +13CF AB9F +13D0 ABA0 +13D1 ABA1 +13D2 ABA2 +13D3 ABA3 +13D4 ABA4 +13D5 ABA5 +13D6 ABA6 +13D7 ABA7 +13D8 ABA8 +13D9 ABA9 +13DA ABAA +13DB ABAB +13DC ABAC +13DD ABAD +13DE ABAE +13DF ABAF +13E0 ABB0 +13E1 ABB1 +13E2 ABB2 +13E3 ABB3 +13E4 ABB4 +13E5 ABB5 +13E6 ABB6 +13E7 ABB7 +13E8 ABB8 +13E9 ABB9 +13EA ABBA +13EB ABBB +13EC ABBC +13ED ABBD +13EE ABBE +13EF ABBF +13F0 13F8 +13F1 13F9 +13F2 13FA +13F3 13FB +13F4 13FC +13F5 13FD +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1E9E 00DF +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1EFA 1EFB +1EFC 1EFD +1EFE 1EFF +1F08 1F00 +1F09 1F01 +1F0A 1F02 +1F0B 1F03 +1F0C 1F04 +1F0D 1F05 +1F0E 1F06 +1F0F 1F07 +1F18 1F10 +1F19 1F11 +1F1A 1F12 +1F1B 1F13 +1F1C 1F14 +1F1D 1F15 +1F28 1F20 +1F29 1F21 +1F2A 1F22 +1F2B 1F23 +1F2C 1F24 +1F2D 1F25 +1F2E 1F26 +1F2F 1F27 +1F38 1F30 +1F39 1F31 +1F3A 1F32 +1F3B 1F33 +1F3C 1F34 +1F3D 1F35 +1F3E 1F36 +1F3F 1F37 +1F48 1F40 +1F49 1F41 +1F4A 1F42 +1F4B 1F43 +1F4C 1F44 +1F4D 1F45 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F60 +1F69 1F61 +1F6A 1F62 +1F6B 1F63 +1F6C 1F64 +1F6D 1F65 +1F6E 1F66 +1F6F 1F67 +1F88 1F80 +1F89 1F81 +1F8A 1F82 +1F8B 1F83 +1F8C 1F84 +1F8D 1F85 +1F8E 1F86 +1F8F 1F87 +1F98 1F90 +1F99 1F91 +1F9A 1F92 +1F9B 1F93 +1F9C 1F94 +1F9D 1F95 +1F9E 1F96 +1F9F 1F97 +1FA8 1FA0 +1FA9 1FA1 +1FAA 1FA2 +1FAB 1FA3 +1FAC 1FA4 +1FAD 1FA5 +1FAE 1FA6 +1FAF 1FA7 +1FB8 1FB0 +1FB9 1FB1 +1FBA 1F70 +1FBB 1F71 +1FBC 1FB3 +1FC8 1F72 +1FC9 1F73 +1FCA 1F74 +1FCB 1F75 +1FCC 1FC3 +1FD8 1FD0 +1FD9 1FD1 +1FDA 1F76 +1FDB 1F77 +1FE8 1FE0 +1FE9 1FE1 +1FEA 1F7A +1FEB 1F7B +1FEC 1FE5 +1FF8 1F78 +1FF9 1F79 +1FFA 1F7C +1FFB 1F7D +1FFC 1FF3 +2126 03C9 +212A 006B +212B 00E5 +2132 214E +2160 2170 +2161 2171 +2162 2172 +2163 2173 +2164 2174 +2165 2175 +2166 2176 +2167 2177 +2168 2178 +2169 2179 +216A 217A +216B 217B +216C 217C +216D 217D +216E 217E +216F 217F +2183 2184 +24B6 24D0 +24B7 24D1 +24B8 24D2 +24B9 24D3 +24BA 24D4 +24BB 24D5 +24BC 24D6 +24BD 24D7 +24BE 24D8 +24BF 24D9 +24C0 24DA +24C1 24DB +24C2 24DC +24C3 24DD +24C4 24DE +24C5 24DF +24C6 24E0 +24C7 24E1 +24C8 24E2 +24C9 24E3 +24CA 24E4 +24CB 24E5 +24CC 24E6 +24CD 24E7 +24CE 24E8 +24CF 24E9 +2C00 2C30 +2C01 2C31 +2C02 2C32 +2C03 2C33 +2C04 2C34 +2C05 2C35 +2C06 2C36 +2C07 2C37 +2C08 2C38 +2C09 2C39 +2C0A 2C3A +2C0B 2C3B +2C0C 2C3C +2C0D 2C3D +2C0E 2C3E +2C0F 2C3F +2C10 2C40 +2C11 2C41 +2C12 2C42 +2C13 2C43 +2C14 2C44 +2C15 2C45 +2C16 2C46 +2C17 2C47 +2C18 2C48 +2C19 2C49 +2C1A 2C4A +2C1B 2C4B +2C1C 2C4C +2C1D 2C4D +2C1E 2C4E +2C1F 2C4F +2C20 2C50 +2C21 2C51 +2C22 2C52 +2C23 2C53 +2C24 2C54 +2C25 2C55 +2C26 2C56 +2C27 2C57 +2C28 2C58 +2C29 2C59 +2C2A 2C5A +2C2B 2C5B +2C2C 2C5C +2C2D 2C5D +2C2E 2C5E +2C60 2C61 +2C62 026B +2C63 1D7D +2C64 027D +2C67 2C68 +2C69 2C6A +2C6B 2C6C +2C6D 0251 +2C6E 0271 +2C6F 0250 +2C70 0252 +2C72 2C73 +2C75 2C76 +2C7E 023F +2C7F 0240 +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +2CEB 2CEC +2CED 2CEE +2CF2 2CF3 +A640 A641 +A642 A643 +A644 A645 +A646 A647 +A648 A649 +A64A A64B +A64C A64D +A64E A64F +A650 A651 +A652 A653 +A654 A655 +A656 A657 +A658 A659 +A65A A65B +A65C A65D +A65E A65F +A660 A661 +A662 A663 +A664 A665 +A666 A667 +A668 A669 +A66A A66B +A66C A66D +A680 A681 +A682 A683 +A684 A685 +A686 A687 +A688 A689 +A68A A68B +A68C A68D +A68E A68F +A690 A691 +A692 A693 +A694 A695 +A696 A697 +A698 A699 +A69A A69B +A722 A723 +A724 A725 +A726 A727 +A728 A729 +A72A A72B +A72C A72D +A72E A72F +A732 A733 +A734 A735 +A736 A737 +A738 A739 +A73A A73B +A73C A73D +A73E A73F +A740 A741 +A742 A743 +A744 A745 +A746 A747 +A748 A749 +A74A A74B +A74C A74D +A74E A74F +A750 A751 +A752 A753 +A754 A755 +A756 A757 +A758 A759 +A75A A75B +A75C A75D +A75E A75F +A760 A761 +A762 A763 +A764 A765 +A766 A767 +A768 A769 +A76A A76B +A76C A76D +A76E A76F +A779 A77A +A77B A77C +A77D 1D79 +A77E A77F +A780 A781 +A782 A783 +A784 A785 +A786 A787 +A78B A78C +A78D 0265 +A790 A791 +A792 A793 +A796 A797 +A798 A799 +A79A A79B +A79C A79D +A79E A79F +A7A0 A7A1 +A7A2 A7A3 +A7A4 A7A5 +A7A6 A7A7 +A7A8 A7A9 +A7AA 0266 +A7AB 025C +A7AC 0261 +A7AD 026C +A7AE 026A +A7B0 029E +A7B1 0287 +A7B2 029D +A7B3 AB53 +A7B4 A7B5 +A7B6 A7B7 +FF21 FF41 +FF22 FF42 +FF23 FF43 +FF24 FF44 +FF25 FF45 +FF26 FF46 +FF27 FF47 +FF28 FF48 +FF29 FF49 +FF2A FF4A +FF2B FF4B +FF2C FF4C +FF2D FF4D +FF2E FF4E +FF2F FF4F +FF30 FF50 +FF31 FF51 +FF32 FF52 +FF33 FF53 +FF34 FF54 +FF35 FF55 +FF36 FF56 +FF37 FF57 +FF38 FF58 +FF39 FF59 +FF3A FF5A +10400 10428 +10401 10429 +10402 1042A +10403 1042B +10404 1042C +10405 1042D +10406 1042E +10407 1042F +10408 10430 +10409 10431 +1040A 10432 +1040B 10433 +1040C 10434 +1040D 10435 +1040E 10436 +1040F 10437 +10410 10438 +10411 10439 +10412 1043A +10413 1043B +10414 1043C +10415 1043D +10416 1043E +10417 1043F +10418 10440 +10419 10441 +1041A 10442 +1041B 10443 +1041C 10444 +1041D 10445 +1041E 10446 +1041F 10447 +10420 10448 +10421 10449 +10422 1044A +10423 1044B +10424 1044C +10425 1044D +10426 1044E +10427 1044F +104B0 104D8 +104B1 104D9 +104B2 104DA +104B3 104DB +104B4 104DC +104B5 104DD +104B6 104DE +104B7 104DF +104B8 104E0 +104B9 104E1 +104BA 104E2 +104BB 104E3 +104BC 104E4 +104BD 104E5 +104BE 104E6 +104BF 104E7 +104C0 104E8 +104C1 104E9 +104C2 104EA +104C3 104EB +104C4 104EC +104C5 104ED +104C6 104EE +104C7 104EF +104C8 104F0 +104C9 104F1 +104CA 104F2 +104CB 104F3 +104CC 104F4 +104CD 104F5 +104CE 104F6 +104CF 104F7 +104D0 104F8 +104D1 104F9 +104D2 104FA +104D3 104FB +10C80 10CC0 +10C81 10CC1 +10C82 10CC2 +10C83 10CC3 +10C84 10CC4 +10C85 10CC5 +10C86 10CC6 +10C87 10CC7 +10C88 10CC8 +10C89 10CC9 +10C8A 10CCA +10C8B 10CCB +10C8C 10CCC +10C8D 10CCD +10C8E 10CCE +10C8F 10CCF +10C90 10CD0 +10C91 10CD1 +10C92 10CD2 +10C93 10CD3 +10C94 10CD4 +10C95 10CD5 +10C96 10CD6 +10C97 10CD7 +10C98 10CD8 +10C99 10CD9 +10C9A 10CDA +10C9B 10CDB +10C9C 10CDC +10C9D 10CDD +10C9E 10CDE +10C9F 10CDF +10CA0 10CE0 +10CA1 10CE1 +10CA2 10CE2 +10CA3 10CE3 +10CA4 10CE4 +10CA5 10CE5 +10CA6 10CE6 +10CA7 10CE7 +10CA8 10CE8 +10CA9 10CE9 +10CAA 10CEA +10CAB 10CEB +10CAC 10CEC +10CAD 10CED +10CAE 10CEE +10CAF 10CEF +10CB0 10CF0 +10CB1 10CF1 +10CB2 10CF2 +118A0 118C0 +118A1 118C1 +118A2 118C2 +118A3 118C3 +118A4 118C4 +118A5 118C5 +118A6 118C6 +118A7 118C7 +118A8 118C8 +118A9 118C9 +118AA 118CA +118AB 118CB +118AC 118CC +118AD 118CD +118AE 118CE +118AF 118CF +118B0 118D0 +118B1 118D1 +118B2 118D2 +118B3 118D3 +118B4 118D4 +118B5 118D5 +118B6 118D6 +118B7 118D7 +118B8 118D8 +118B9 118D9 +118BA 118DA +118BB 118DB +118BC 118DC +118BD 118DD +118BE 118DE +118BF 118DF +1E900 1E922 +1E901 1E923 +1E902 1E924 +1E903 1E925 +1E904 1E926 +1E905 1E927 +1E906 1E928 +1E907 1E929 +1E908 1E92A +1E909 1E92B +1E90A 1E92C +1E90B 1E92D +1E90C 1E92E +1E90D 1E92F +1E90E 1E930 +1E90F 1E931 +1E910 1E932 +1E911 1E933 +1E912 1E934 +1E913 1E935 +1E914 1E936 +1E915 1E937 +1E916 1E938 +1E917 1E939 +1E918 1E93A +1E919 1E93B +1E91A 1E93C +1E91B 1E93D +1E91C 1E93E +1E91D 1E93F +1E91E 1E940 +1E91F 1E941 +1E920 1E942 +1E921 1E943 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +# The mappings in the non-hash portion of this file must be modified to get the +# correct values by adding the code point ordinal number to each one that is +# numeric. + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToLc'}{'format'} = 'ax'; # mapped value in hex; some entries need adjustment +$utf8::SwashInfo{'ToLc'}{'specials_name'} = 'utf8::ToSpecLc'; # Name of hash of special mappings +$utf8::SwashInfo{'ToLc'}{'missing'} = '0'; # code point maps to itself + +# Some code points require special handling because their mappings are each to +# multiple code points. These do not appear in the main body, but are defined +# in the hash below. + +# Each key is the string of N bytes that together make up the UTF-8 encoding +# for the code point. (i.e. the same as looking at the code point's UTF-8 +# under "use bytes"). Each value is the UTF-8 of the translation, for speed. +%utf8::ToSpecLc = ( +"\xC4\xB0" => "\x{0069}\x{0307}", # U+0130 => 0069 0307 +); + +return <<'END'; +41 5A 61 +C0 D6 E0 +D8 DE F8 +100 101 +102 103 +104 105 +106 107 +108 109 +10A 10B +10C 10D +10E 10F +110 111 +112 113 +114 115 +116 117 +118 119 +11A 11B +11C 11D +11E 11F +120 121 +122 123 +124 125 +126 127 +128 129 +12A 12B +12C 12D +12E 12F +130 69 +132 133 +134 135 +136 137 +139 13A +13B 13C +13D 13E +13F 140 +141 142 +143 144 +145 146 +147 148 +14A 14B +14C 14D +14E 14F +150 151 +152 153 +154 155 +156 157 +158 159 +15A 15B +15C 15D +15E 15F +160 161 +162 163 +164 165 +166 167 +168 169 +16A 16B +16C 16D +16E 16F +170 171 +172 173 +174 175 +176 177 +178 FF +179 17A +17B 17C +17D 17E +181 253 +182 183 +184 185 +186 254 +187 188 +189 18A 256 +18B 18C +18E 1DD +18F 259 +190 25B +191 192 +193 260 +194 263 +196 269 +197 268 +198 199 +19C 26F +19D 272 +19F 275 +1A0 1A1 +1A2 1A3 +1A4 1A5 +1A6 280 +1A7 1A8 +1A9 283 +1AC 1AD +1AE 288 +1AF 1B0 +1B1 1B2 28A +1B3 1B4 +1B5 1B6 +1B7 292 +1B8 1B9 +1BC 1BD +1C4 1C6 +1C5 1C6 +1C7 1C9 +1C8 1C9 +1CA 1CC +1CB 1CC +1CD 1CE +1CF 1D0 +1D1 1D2 +1D3 1D4 +1D5 1D6 +1D7 1D8 +1D9 1DA +1DB 1DC +1DE 1DF +1E0 1E1 +1E2 1E3 +1E4 1E5 +1E6 1E7 +1E8 1E9 +1EA 1EB +1EC 1ED +1EE 1EF +1F1 1F3 +1F2 1F3 +1F4 1F5 +1F6 195 +1F7 1BF +1F8 1F9 +1FA 1FB +1FC 1FD +1FE 1FF +200 201 +202 203 +204 205 +206 207 +208 209 +20A 20B +20C 20D +20E 20F +210 211 +212 213 +214 215 +216 217 +218 219 +21A 21B +21C 21D +21E 21F +220 19E +222 223 +224 225 +226 227 +228 229 +22A 22B +22C 22D +22E 22F +230 231 +232 233 +23A 2C65 +23B 23C +23D 19A +23E 2C66 +241 242 +243 180 +244 289 +245 28C +246 247 +248 249 +24A 24B +24C 24D +24E 24F +370 371 +372 373 +376 377 +37F 3F3 +386 3AC +388 38A 3AD +38C 3CC +38E 38F 3CD +391 3A1 3B1 +3A3 3AB 3C3 +3CF 3D7 +3D8 3D9 +3DA 3DB +3DC 3DD +3DE 3DF +3E0 3E1 +3E2 3E3 +3E4 3E5 +3E6 3E7 +3E8 3E9 +3EA 3EB +3EC 3ED +3EE 3EF +3F4 3B8 +3F7 3F8 +3F9 3F2 +3FA 3FB +3FD 3FF 37B +400 40F 450 +410 42F 430 +460 461 +462 463 +464 465 +466 467 +468 469 +46A 46B +46C 46D +46E 46F +470 471 +472 473 +474 475 +476 477 +478 479 +47A 47B +47C 47D +47E 47F +480 481 +48A 48B +48C 48D +48E 48F +490 491 +492 493 +494 495 +496 497 +498 499 +49A 49B +49C 49D +49E 49F +4A0 4A1 +4A2 4A3 +4A4 4A5 +4A6 4A7 +4A8 4A9 +4AA 4AB +4AC 4AD +4AE 4AF +4B0 4B1 +4B2 4B3 +4B4 4B5 +4B6 4B7 +4B8 4B9 +4BA 4BB +4BC 4BD +4BE 4BF +4C0 4CF +4C1 4C2 +4C3 4C4 +4C5 4C6 +4C7 4C8 +4C9 4CA +4CB 4CC +4CD 4CE +4D0 4D1 +4D2 4D3 +4D4 4D5 +4D6 4D7 +4D8 4D9 +4DA 4DB +4DC 4DD +4DE 4DF +4E0 4E1 +4E2 4E3 +4E4 4E5 +4E6 4E7 +4E8 4E9 +4EA 4EB +4EC 4ED +4EE 4EF +4F0 4F1 +4F2 4F3 +4F4 4F5 +4F6 4F7 +4F8 4F9 +4FA 4FB +4FC 4FD +4FE 4FF +500 501 +502 503 +504 505 +506 507 +508 509 +50A 50B +50C 50D +50E 50F +510 511 +512 513 +514 515 +516 517 +518 519 +51A 51B +51C 51D +51E 51F +520 521 +522 523 +524 525 +526 527 +528 529 +52A 52B +52C 52D +52E 52F +531 556 561 +10A0 10C5 2D00 +10C7 2D27 +10CD 2D2D +13A0 13EF AB70 +13F0 13F5 13F8 +1E00 1E01 +1E02 1E03 +1E04 1E05 +1E06 1E07 +1E08 1E09 +1E0A 1E0B +1E0C 1E0D +1E0E 1E0F +1E10 1E11 +1E12 1E13 +1E14 1E15 +1E16 1E17 +1E18 1E19 +1E1A 1E1B +1E1C 1E1D +1E1E 1E1F +1E20 1E21 +1E22 1E23 +1E24 1E25 +1E26 1E27 +1E28 1E29 +1E2A 1E2B +1E2C 1E2D +1E2E 1E2F +1E30 1E31 +1E32 1E33 +1E34 1E35 +1E36 1E37 +1E38 1E39 +1E3A 1E3B +1E3C 1E3D +1E3E 1E3F +1E40 1E41 +1E42 1E43 +1E44 1E45 +1E46 1E47 +1E48 1E49 +1E4A 1E4B +1E4C 1E4D +1E4E 1E4F +1E50 1E51 +1E52 1E53 +1E54 1E55 +1E56 1E57 +1E58 1E59 +1E5A 1E5B +1E5C 1E5D +1E5E 1E5F +1E60 1E61 +1E62 1E63 +1E64 1E65 +1E66 1E67 +1E68 1E69 +1E6A 1E6B +1E6C 1E6D +1E6E 1E6F +1E70 1E71 +1E72 1E73 +1E74 1E75 +1E76 1E77 +1E78 1E79 +1E7A 1E7B +1E7C 1E7D +1E7E 1E7F +1E80 1E81 +1E82 1E83 +1E84 1E85 +1E86 1E87 +1E88 1E89 +1E8A 1E8B +1E8C 1E8D +1E8E 1E8F +1E90 1E91 +1E92 1E93 +1E94 1E95 +1E9E DF +1EA0 1EA1 +1EA2 1EA3 +1EA4 1EA5 +1EA6 1EA7 +1EA8 1EA9 +1EAA 1EAB +1EAC 1EAD +1EAE 1EAF +1EB0 1EB1 +1EB2 1EB3 +1EB4 1EB5 +1EB6 1EB7 +1EB8 1EB9 +1EBA 1EBB +1EBC 1EBD +1EBE 1EBF +1EC0 1EC1 +1EC2 1EC3 +1EC4 1EC5 +1EC6 1EC7 +1EC8 1EC9 +1ECA 1ECB +1ECC 1ECD +1ECE 1ECF +1ED0 1ED1 +1ED2 1ED3 +1ED4 1ED5 +1ED6 1ED7 +1ED8 1ED9 +1EDA 1EDB +1EDC 1EDD +1EDE 1EDF +1EE0 1EE1 +1EE2 1EE3 +1EE4 1EE5 +1EE6 1EE7 +1EE8 1EE9 +1EEA 1EEB +1EEC 1EED +1EEE 1EEF +1EF0 1EF1 +1EF2 1EF3 +1EF4 1EF5 +1EF6 1EF7 +1EF8 1EF9 +1EFA 1EFB +1EFC 1EFD +1EFE 1EFF +1F08 1F0F 1F00 +1F18 1F1D 1F10 +1F28 1F2F 1F20 +1F38 1F3F 1F30 +1F48 1F4D 1F40 +1F59 1F51 +1F5B 1F53 +1F5D 1F55 +1F5F 1F57 +1F68 1F6F 1F60 +1F88 1F8F 1F80 +1F98 1F9F 1F90 +1FA8 1FAF 1FA0 +1FB8 1FB9 1FB0 +1FBA 1FBB 1F70 +1FBC 1FB3 +1FC8 1FCB 1F72 +1FCC 1FC3 +1FD8 1FD9 1FD0 +1FDA 1FDB 1F76 +1FE8 1FE9 1FE0 +1FEA 1FEB 1F7A +1FEC 1FE5 +1FF8 1FF9 1F78 +1FFA 1FFB 1F7C +1FFC 1FF3 +2126 3C9 +212A 6B +212B E5 +2132 214E +2160 216F 2170 +2183 2184 +24B6 24CF 24D0 +2C00 2C2E 2C30 +2C60 2C61 +2C62 26B +2C63 1D7D +2C64 27D +2C67 2C68 +2C69 2C6A +2C6B 2C6C +2C6D 251 +2C6E 271 +2C6F 250 +2C70 252 +2C72 2C73 +2C75 2C76 +2C7E 2C7F 23F +2C80 2C81 +2C82 2C83 +2C84 2C85 +2C86 2C87 +2C88 2C89 +2C8A 2C8B +2C8C 2C8D +2C8E 2C8F +2C90 2C91 +2C92 2C93 +2C94 2C95 +2C96 2C97 +2C98 2C99 +2C9A 2C9B +2C9C 2C9D +2C9E 2C9F +2CA0 2CA1 +2CA2 2CA3 +2CA4 2CA5 +2CA6 2CA7 +2CA8 2CA9 +2CAA 2CAB +2CAC 2CAD +2CAE 2CAF +2CB0 2CB1 +2CB2 2CB3 +2CB4 2CB5 +2CB6 2CB7 +2CB8 2CB9 +2CBA 2CBB +2CBC 2CBD +2CBE 2CBF +2CC0 2CC1 +2CC2 2CC3 +2CC4 2CC5 +2CC6 2CC7 +2CC8 2CC9 +2CCA 2CCB +2CCC 2CCD +2CCE 2CCF +2CD0 2CD1 +2CD2 2CD3 +2CD4 2CD5 +2CD6 2CD7 +2CD8 2CD9 +2CDA 2CDB +2CDC 2CDD +2CDE 2CDF +2CE0 2CE1 +2CE2 2CE3 +2CEB 2CEC +2CED 2CEE +2CF2 2CF3 +A640 A641 +A642 A643 +A644 A645 +A646 A647 +A648 A649 +A64A A64B +A64C A64D +A64E A64F +A650 A651 +A652 A653 +A654 A655 +A656 A657 +A658 A659 +A65A A65B +A65C A65D +A65E A65F +A660 A661 +A662 A663 +A664 A665 +A666 A667 +A668 A669 +A66A A66B +A66C A66D +A680 A681 +A682 A683 +A684 A685 +A686 A687 +A688 A689 +A68A A68B +A68C A68D +A68E A68F +A690 A691 +A692 A693 +A694 A695 +A696 A697 +A698 A699 +A69A A69B +A722 A723 +A724 A725 +A726 A727 +A728 A729 +A72A A72B +A72C A72D +A72E A72F +A732 A733 +A734 A735 +A736 A737 +A738 A739 +A73A A73B +A73C A73D +A73E A73F +A740 A741 +A742 A743 +A744 A745 +A746 A747 +A748 A749 +A74A A74B +A74C A74D +A74E A74F +A750 A751 +A752 A753 +A754 A755 +A756 A757 +A758 A759 +A75A A75B +A75C A75D +A75E A75F +A760 A761 +A762 A763 +A764 A765 +A766 A767 +A768 A769 +A76A A76B +A76C A76D +A76E A76F +A779 A77A +A77B A77C +A77D 1D79 +A77E A77F +A780 A781 +A782 A783 +A784 A785 +A786 A787 +A78B A78C +A78D 265 +A790 A791 +A792 A793 +A796 A797 +A798 A799 +A79A A79B +A79C A79D +A79E A79F +A7A0 A7A1 +A7A2 A7A3 +A7A4 A7A5 +A7A6 A7A7 +A7A8 A7A9 +A7AA 266 +A7AB 25C +A7AC 261 +A7AD 26C +A7AE 26A +A7B0 29E +A7B1 287 +A7B2 29D +A7B3 AB53 +A7B4 A7B5 +A7B6 A7B7 +FF21 FF3A FF41 +10400 10427 10428 +104B0 104D3 104D8 +10C80 10CB2 10CC0 +118A0 118BF 118C0 +1E900 1E921 1E922 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + + +# The name this swash is to be known by, with the format of the mappings in +# the main body of the table, and what all code points missing from this file +# map to. +$utf8::SwashInfo{'ToNt'}{'format'} = 's'; # string +$utf8::SwashInfo{'ToNt'}{'missing'} = 'None'; + +return <<'END'; +30 39 Decimal +B2 B3 Digit +B9 Digit +BC BE Numeric +660 669 Decimal +6F0 6F9 Decimal +7C0 7C9 Decimal +966 96F Decimal +9E6 9EF Decimal +9F4 9F9 Numeric +A66 A6F Decimal +AE6 AEF Decimal +B66 B6F Decimal +B72 B77 Numeric +BE6 BEF Decimal +BF0 BF2 Numeric +C66 C6F Decimal +C78 C7E Numeric +CE6 CEF Decimal +D58 D5E Numeric +D66 D6F Decimal +D70 D78 Numeric +DE6 DEF Decimal +E50 E59 Decimal +ED0 ED9 Decimal +F20 F29 Decimal +F2A F33 Numeric +1040 1049 Decimal +1090 1099 Decimal +1369 1371 Digit +1372 137C Numeric +16EE 16F0 Numeric +17E0 17E9 Decimal +17F0 17F9 Numeric +1810 1819 Decimal +1946 194F Decimal +19D0 19D9 Decimal +19DA Digit +1A80 1A89 Decimal +1A90 1A99 Decimal +1B50 1B59 Decimal +1BB0 1BB9 Decimal +1C40 1C49 Decimal +1C50 1C59 Decimal +2070 Digit +2074 2079 Digit +2080 2089 Digit +2150 2182 Numeric +2185 2189 Numeric +2460 2468 Digit +2469 2473 Numeric +2474 247C Digit +247D 2487 Numeric +2488 2490 Digit +2491 249B Numeric +24EA Digit +24EB 24F4 Numeric +24F5 24FD Digit +24FE Numeric +24FF Digit +2776 277E Digit +277F Numeric +2780 2788 Digit +2789 Numeric +278A 2792 Digit +2793 Numeric +2CFD Numeric +3007 Numeric +3021 3029 Numeric +3038 303A Numeric +3192 3195 Numeric +3220 3229 Numeric +3248 324F Numeric +3251 325F Numeric +3280 3289 Numeric +32B1 32BF Numeric +3405 Numeric +3483 Numeric +382A Numeric +3B4D Numeric +4E00 Numeric +4E03 Numeric +4E07 Numeric +4E09 Numeric +4E5D Numeric +4E8C Numeric +4E94 Numeric +4E96 Numeric +4EBF 4EC0 Numeric +4EDF Numeric +4EE8 Numeric +4F0D Numeric +4F70 Numeric +5104 Numeric +5146 Numeric +5169 Numeric +516B Numeric +516D Numeric +5341 Numeric +5343 5345 Numeric +534C Numeric +53C1 53C4 Numeric +56DB Numeric +58F1 Numeric +58F9 Numeric +5E7A Numeric +5EFE 5EFF Numeric +5F0C 5F0E Numeric +5F10 Numeric +62FE Numeric +634C Numeric +67D2 Numeric +6F06 Numeric +7396 Numeric +767E Numeric +8086 Numeric +842C Numeric +8CAE Numeric +8CB3 Numeric +8D30 Numeric +9621 Numeric +9646 Numeric +964C Numeric +9678 Numeric +96F6 Numeric +A620 A629 Decimal +A6E6 A6EF Numeric +A830 A835 Numeric +A8D0 A8D9 Decimal +A900 A909 Decimal +A9D0 A9D9 Decimal +A9F0 A9F9 Decimal +AA50 AA59 Decimal +ABF0 ABF9 Decimal +F96B Numeric +F973 Numeric +F978 Numeric +F9B2 Numeric +F9D1 Numeric +F9D3 Numeric +F9FD Numeric +FF10 FF19 Decimal +10107 10133 Numeric +10140 10178 Numeric +1018A 1018B Numeric +102E1 102FB Numeric +10320 10323 Numeric +10341 Numeric +1034A Numeric +103D1 103D5 Numeric +104A0 104A9 Decimal +10858 1085F Numeric +10879 1087F Numeric +108A7 108AF Numeric +108FB 108FF Numeric +10916 1091B Numeric +109BC 109BD Numeric +109C0 109CF Numeric +109D2 109FF Numeric +10A40 10A43 Digit +10A44 10A47 Numeric +10A7D 10A7E Numeric +10A9D 10A9F Numeric +10AEB 10AEF Numeric +10B58 10B5F Numeric +10B78 10B7F Numeric +10BA9 10BAF Numeric +10CFA 10CFF Numeric +10E60 10E68 Digit +10E69 10E7E Numeric +11052 1105A Digit +1105B 11065 Numeric +11066 1106F Decimal +110F0 110F9 Decimal +11136 1113F Decimal +111D0 111D9 Decimal +111E1 111F4 Numeric +112F0 112F9 Decimal +11450 11459 Decimal +114D0 114D9 Decimal +11650 11659 Decimal +116C0 116C9 Decimal +11730 11739 Decimal +1173A 1173B Numeric +118E0 118E9 Decimal +118EA 118F2 Numeric +11C50 11C59 Decimal +11C5A 11C6C Numeric +11D50 11D59 Decimal +12400 1246E Numeric +16A60 16A69 Decimal +16B50 16B59 Decimal +16B5B 16B61 Numeric +1D360 1D371 Numeric +1D7CE 1D7FF Decimal +1E8C7 1E8CF Numeric +1E950 1E959 Decimal +1F100 1F10A Digit +1F10B 1F10C Numeric +20001 Numeric +20064 Numeric +200E2 Numeric +20121 Numeric +2092A Numeric +20983 Numeric +2098C Numeric +2099C Numeric +20AEA Numeric +20AFD Numeric +20B19 Numeric +22390 Numeric +22998 Numeric +23B1B Numeric +2626D Numeric +2F890 Numeric +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +34 +35 +39 +40 +171 +172 +187 +188 +8216 +8224 +8249 +8251 +11842 +11843 +12300 +12304 +12317 +12320 +65089 +65093 +65282 +65283 +65287 +65288 +65378 +65380 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1378 +48 +58 +65 +91 +95 +96 +97 +123 +170 +171 +181 +182 +183 +184 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +888 +890 +894 +895 +896 +902 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1160 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1642 +1646 +1748 +1749 +1757 +1759 +1769 +1770 +1789 +1791 +1792 +1808 +1867 +1869 +1970 +1984 +2038 +2042 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4096 +4170 +4176 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4969 +4978 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6100 +6103 +6104 +6108 +6110 +6112 +6122 +6155 +6158 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6823 +6824 +6832 +6846 +6912 +6988 +6992 +7002 +7019 +7028 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7294 +7296 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8255 +8257 +8276 +8277 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8413 +8417 +8418 +8421 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +12293 +12296 +12321 +12336 +12337 +12342 +12344 +12349 +12353 +12439 +12441 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42608 +42612 +42622 +42623 +42738 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43312 +43348 +43360 +43389 +43392 +43457 +43471 +43482 +43488 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43639 +43642 +43715 +43739 +43742 +43744 +43760 +43762 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44012 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65024 +65040 +65056 +65072 +65075 +65077 +65101 +65104 +65136 +65141 +65142 +65277 +65296 +65306 +65313 +65339 +65343 +65344 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69703 +69734 +69744 +69759 +69819 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69968 +70004 +70006 +70007 +70016 +70085 +70090 +70093 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70731 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72255 +72263 +72264 +72272 +72324 +72326 +72346 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92912 +92917 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V154 +545 +546 +564 +567 +686 +688 +751 +768 +848 +856 +861 +864 +1015 +1020 +1536 +1540 +1549 +1558 +1622 +1625 +1774 +1776 +1791 +1792 +1837 +1840 +1869 +1872 +2308 +2309 +2493 +2494 +2561 +2562 +2563 +2564 +2700 +2701 +2785 +2788 +2801 +2802 +2869 +2870 +2929 +2930 +3059 +3067 +3260 +3262 +6109 +6110 +6128 +6138 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6624 +6656 +7424 +7532 +8275 +8277 +8507 +8508 +9167 +9169 +9471 +9472 +9748 +9750 +9866 +9874 +9888 +9890 +11008 +11022 +12829 +12831 +12880 +12881 +12924 +12926 +13004 +13008 +13175 +13179 +13278 +13280 +13311 +13312 +19904 +19968 +65021 +65022 +65095 +65097 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65856 +66432 +66462 +66463 +66464 +66598 +66600 +66638 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +119552 +119639 +120001 +120002 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V172 +567 +578 +856 +861 +1020 +1024 +1270 +1272 +1442 +1443 +1477 +1480 +1547 +1548 +1566 +1567 +1625 +1631 +1872 +1902 +2429 +2430 +2510 +2511 +2998 +2999 +3046 +3047 +4048 +4050 +4345 +4347 +4348 +4349 +4615 +4616 +4679 +4680 +4743 +4744 +4783 +4784 +4815 +4816 +4847 +4848 +4879 +4880 +4895 +4896 +4935 +4936 +4959 +4961 +4992 +5018 +6528 +6570 +6576 +6602 +6608 +6618 +6622 +6624 +6656 +6684 +6686 +6688 +7532 +7620 +8277 +8279 +8280 +8287 +8336 +8341 +8370 +8374 +8427 +8428 +8508 +8509 +8524 +8525 +9169 +9180 +9752 +9753 +9854 +9856 +9874 +9885 +9890 +9906 +10176 +10183 +11022 +11028 +11264 +11311 +11312 +11359 +11392 +11499 +11513 +11558 +11568 +11622 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11776 +11800 +11804 +11806 +12736 +12752 +12926 +12927 +40870 +40892 +42752 +42775 +43008 +43052 +64112 +64218 +65040 +65050 +65856 +65931 +66464 +66500 +66504 +66518 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +119296 +119366 +120484 +120486 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V242 +502 +506 +536 +544 +546 +564 +681 +686 +735 +736 +746 +751 +838 +847 +866 +867 +983 +984 +987 +988 +989 +990 +991 +992 +993 +994 +1024 +1025 +1037 +1038 +1104 +1105 +1117 +1118 +1160 +1162 +1164 +1168 +1260 +1262 +1418 +1419 +1619 +1622 +1720 +1722 +1727 +1728 +1743 +1744 +1786 +1791 +1792 +1806 +1807 +1837 +1840 +1867 +1920 +1969 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3946 +3947 +3990 +3991 +4014 +4017 +4024 +4025 +4026 +4029 +4030 +4045 +4047 +4048 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4608 +4615 +4616 +4679 +4680 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4743 +4744 +4745 +4746 +4750 +4752 +4783 +4784 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4815 +4816 +4823 +4824 +4847 +4848 +4879 +4880 +4881 +4882 +4886 +4888 +4895 +4896 +4935 +4936 +4955 +4961 +4989 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +6016 +6109 +6112 +6122 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +8239 +8240 +8264 +8270 +8365 +8368 +8418 +8420 +8505 +8507 +8579 +8580 +8683 +8692 +8961 +8962 +9083 +9084 +9085 +9115 +9253 +9255 +9712 +9720 +9753 +9754 +9840 +9842 +10240 +10496 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12344 +12347 +12350 +12351 +12704 +12728 +13312 +19894 +40960 +42125 +42128 +42146 +42148 +42164 +42165 +42177 +42178 +42181 +42182 +42183 +64285 +64286 +65529 +65532 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V58 +1425 +1442 +1443 +1456 +1476 +1477 +3840 +3912 +3913 +3946 +3953 +3980 +3984 +3990 +3991 +3992 +3993 +4014 +4017 +4024 +4025 +4026 +7835 +7836 +8363 +8364 +44032 +55204 +55296 +57344 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V70 +578 +592 +891 +894 +1231 +1232 +1274 +1280 +1296 +1300 +1466 +1467 +1984 +2043 +2427 +2429 +2430 +2432 +3298 +3300 +3313 +3315 +6912 +6988 +6992 +7037 +7620 +7627 +7678 +7680 +8428 +8432 +8525 +8527 +8580 +8581 +9180 +9192 +9906 +9907 +10183 +10187 +11028 +11035 +11040 +11044 +11360 +11373 +11380 +11384 +42775 +42779 +42784 +42786 +43072 +43128 +67840 +67866 +67871 +67872 +73728 +74607 +74752 +74851 +74864 +74868 +119648 +119666 +120778 +120780 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V118 +2227 +2229 +2275 +2276 +2809 +2810 +3162 +3163 +3423 +3424 +5109 +5110 +5112 +5118 +8382 +8383 +8586 +8588 +11244 +11248 +40909 +40918 +42654 +42655 +42895 +42896 +42930 +42936 +43260 +43262 +43872 +43876 +43888 +43968 +65070 +65072 +67808 +67827 +67828 +67830 +67835 +67840 +68028 +68030 +68032 +68048 +68050 +68096 +68736 +68787 +68800 +68851 +68858 +68864 +70089 +70093 +70107 +70112 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70400 +70401 +70480 +70481 +71114 +71134 +71424 +71450 +71453 +71468 +71472 +71488 +74649 +74650 +74880 +75076 +82944 +83527 +119262 +119273 +120832 +121484 +121499 +121504 +121505 +121520 +127789 +127792 +127870 +127872 +127951 +127956 +127992 +128000 +128255 +128256 +128331 +128336 +128579 +128581 +128720 +128721 +129296 +129305 +129408 +129413 +129472 +129473 +178208 +183970 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V104 +2230 +2238 +2260 +2275 +3200 +3201 +3407 +3408 +3412 +3415 +3416 +3423 +3446 +3449 +7296 +7305 +7675 +7676 +9211 +9215 +11843 +11845 +42926 +42927 +43205 +43206 +65933 +65935 +66736 +66772 +66776 +66812 +70206 +70207 +70656 +70746 +70747 +70748 +70749 +70750 +71264 +71277 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +94176 +94177 +94208 +100333 +100352 +101107 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125184 +125259 +125264 +125274 +125278 +125280 +127387 +127405 +127547 +127548 +128378 +128379 +128420 +128421 +128721 +128723 +128756 +128759 +129305 +129311 +129312 +129320 +129328 +129329 +129331 +129343 +129344 +129356 +129360 +129375 +129413 +129426 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V282 +895 +896 +1320 +1328 +1421 +1423 +1541 +1542 +2209 +2210 +2221 +2227 +2303 +2304 +2424 +2425 +2432 +2433 +3072 +3073 +3124 +3125 +3201 +3202 +3329 +3330 +3558 +3568 +5873 +5881 +6429 +6431 +6832 +6847 +7416 +7418 +7655 +7670 +8379 +8382 +9204 +9211 +9984 +9985 +11085 +11088 +11098 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11218 +11836 +11843 +42648 +42654 +42900 +42912 +42923 +42926 +42928 +42930 +42999 +43000 +43488 +43519 +43644 +43648 +43824 +43872 +43876 +43878 +65063 +65070 +65931 +65933 +65952 +65953 +66272 +66300 +66335 +66336 +66384 +66427 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67680 +67743 +67751 +67760 +68224 +68256 +68288 +68327 +68331 +68343 +68480 +68498 +68505 +68509 +68521 +68528 +69759 +69760 +69968 +70007 +70093 +70094 +70106 +70107 +70113 +70133 +70144 +70162 +70163 +70206 +70320 +70379 +70384 +70394 +70401 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71114 +71168 +71237 +71248 +71258 +71840 +71923 +71935 +71936 +72384 +72441 +74607 +74649 +74851 +74863 +74868 +74869 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +124928 +125125 +125127 +125143 +127167 +127168 +127200 +127222 +127243 +127245 +127777 +127789 +127798 +127799 +127869 +127870 +127892 +127904 +127941 +127942 +127947 +127951 +127956 +127968 +127985 +127992 +128063 +128064 +128065 +128066 +128248 +128249 +128253 +128255 +128318 +128320 +128324 +128331 +128360 +128378 +128379 +128420 +128421 +128507 +128577 +128579 +128592 +128640 +128710 +128720 +128736 +128749 +128752 +128756 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V576 +0 +502 +506 +536 +592 +681 +688 +735 +736 +746 +768 +838 +864 +866 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +983 +986 +987 +988 +989 +990 +991 +992 +993 +994 +1012 +1025 +1037 +1038 +1104 +1105 +1117 +1118 +1159 +1168 +1221 +1223 +1225 +1227 +1229 +1232 +1260 +1262 +1270 +1272 +1274 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1418 +1456 +1466 +1467 +1476 +1488 +1515 +1520 +1525 +1548 +1549 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1619 +1632 +1646 +1648 +1720 +1722 +1727 +1728 +1743 +1744 +1774 +1776 +1786 +2305 +2308 +2309 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2562 +2563 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2700 +2701 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2785 +2790 +2800 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2870 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2929 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3059 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +4256 +4294 +4304 +4343 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +7680 +7835 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8239 +8240 +8263 +8298 +8305 +8308 +8335 +8352 +8363 +8400 +8418 +8448 +8505 +8531 +8579 +8592 +8683 +8704 +8946 +8960 +8961 +8962 +9083 +9216 +9253 +9280 +9291 +9312 +9451 +9472 +9622 +9632 +9712 +9728 +9748 +9754 +9840 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10088 +10102 +10133 +10136 +10160 +10161 +10175 +12288 +12344 +12351 +12352 +12353 +12437 +12441 +12447 +12449 +12543 +12549 +12589 +12593 +12687 +12688 +12704 +12800 +12829 +12832 +12868 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13055 +13056 +13175 +13179 +13278 +13280 +13311 +19968 +40870 +57344 +64046 +64256 +64263 +64275 +64280 +64286 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65020 +65056 +65060 +65072 +65093 +65097 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65279 +65280 +65281 +65375 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65533 +65536 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V118 +544 +545 +847 +848 +867 +880 +984 +986 +1014 +1015 +1162 +1164 +1221 +1223 +1225 +1227 +1229 +1231 +1280 +1296 +1646 +1648 +1969 +1970 +4343 +4345 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +8263 +8264 +8270 +8275 +8279 +8280 +8287 +8292 +8305 +8306 +8368 +8370 +8420 +8427 +8509 +8524 +8692 +8704 +8946 +8960 +9084 +9085 +9115 +9167 +9451 +9471 +9622 +9632 +9720 +9728 +9750 +9752 +9842 +9854 +9856 +9866 +10088 +10102 +10192 +10220 +10224 +10240 +10496 +11008 +12347 +12350 +12437 +12439 +12447 +12449 +12543 +12544 +12784 +12800 +12881 +12896 +12977 +12992 +42146 +42148 +42164 +42165 +42177 +42178 +42181 +42182 +64048 +64107 +65020 +65021 +65024 +65040 +65093 +65095 +65139 +65140 +65375 +65377 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V178 +880 +884 +886 +888 +975 +976 +1159 +1160 +1300 +1316 +1542 +1547 +1558 +1563 +1595 +1600 +1902 +1920 +2417 +2419 +2641 +2642 +2677 +2678 +2884 +2885 +2914 +2916 +3024 +3025 +3133 +3134 +3160 +3162 +3170 +3172 +3192 +3200 +3389 +3390 +3396 +3397 +3426 +3428 +3440 +3446 +3449 +3456 +3947 +3949 +4046 +4047 +4050 +4053 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4250 +4254 +4256 +6314 +6315 +7040 +7083 +7086 +7098 +7168 +7224 +7227 +7242 +7245 +7296 +7627 +7655 +7836 +7840 +7930 +7936 +8292 +8293 +8432 +8433 +8527 +8528 +8581 +8585 +9885 +9886 +9907 +9917 +9920 +9924 +10188 +10189 +10220 +10224 +11035 +11040 +11044 +11085 +11088 +11093 +11373 +11376 +11377 +11380 +11384 +11390 +11744 +11776 +11800 +11804 +11806 +11825 +12589 +12590 +12752 +12772 +40892 +40900 +42240 +42540 +42560 +42592 +42594 +42612 +42620 +42648 +42779 +42784 +42786 +42893 +43003 +43008 +43136 +43205 +43214 +43226 +43264 +43348 +43359 +43360 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43616 +65060 +65063 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +67872 +67898 +67903 +67904 +119081 +119082 +126976 +127020 +127024 +127124 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1317 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131070 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V178 +1423 +1424 +1540 +1541 +2208 +2209 +2210 +2221 +2276 +2303 +2800 +2801 +3806 +3808 +4295 +4296 +4301 +4302 +4349 +4352 +7083 +7086 +7098 +7104 +7360 +7368 +7411 +7415 +10187 +10188 +10189 +10190 +11506 +11508 +11559 +11560 +11565 +11566 +11622 +11624 +11826 +11836 +40908 +40909 +42612 +42620 +42655 +42656 +42898 +42900 +42922 +42923 +43000 +43002 +43744 +43767 +64046 +64048 +67968 +68024 +68030 +68032 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +70016 +70089 +70096 +70106 +71296 +71352 +71360 +71370 +93952 +94021 +94032 +94079 +94095 +94112 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +127338 +127340 +128320 +128324 +128512 +128513 +128529 +128530 +128533 +128534 +128535 +128536 +128537 +128538 +128539 +128540 +128543 +128544 +128550 +128552 +128556 +128557 +128558 +128560 +128564 +128565 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V180 +1316 +1318 +2048 +2094 +2096 +2111 +2304 +2305 +2382 +2383 +2389 +2390 +2425 +2427 +2555 +2556 +4053 +4057 +4250 +4254 +4442 +4447 +4515 +4520 +4602 +4608 +5120 +5121 +5751 +5760 +6320 +6390 +6570 +6572 +6618 +6619 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +7376 +7411 +7677 +7678 +8374 +8377 +8528 +8531 +8585 +8586 +9192 +9193 +9886 +9888 +9917 +9920 +9924 +9934 +9935 +9954 +9955 +9956 +9960 +9984 +10071 +10072 +11093 +11098 +11376 +11377 +11390 +11392 +11499 +11506 +11825 +11826 +12868 +12880 +40900 +40908 +42192 +42240 +42656 +42744 +43056 +43066 +43232 +43260 +43360 +43389 +43392 +43470 +43471 +43482 +43486 +43488 +43616 +43644 +43648 +43715 +43739 +43744 +43968 +44014 +44016 +44026 +55216 +55239 +55243 +55292 +64107 +64110 +67648 +67670 +67671 +67680 +67866 +67868 +68192 +68224 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68480 +68608 +68681 +69216 +69247 +69760 +69826 +77824 +78895 +127232 +127243 +127248 +127279 +127281 +127282 +127293 +127294 +127295 +127296 +127298 +127299 +127302 +127303 +127306 +127311 +127319 +127320 +127327 +127328 +127353 +127354 +127355 +127357 +127359 +127360 +127370 +127374 +127376 +127377 +127488 +127489 +127504 +127538 +127552 +127561 +173824 +177973 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V80 +2144 +2155 +2556 +2558 +2810 +2816 +3328 +3329 +3387 +3389 +7415 +7416 +7670 +7674 +8383 +8384 +9215 +9216 +11218 +11219 +11845 +11850 +12590 +12591 +40918 +40939 +66349 +66352 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +94177 +94178 +110594 +110879 +110960 +111356 +127584 +127590 +128723 +128725 +128759 +128761 +129280 +129292 +129311 +129312 +129320 +129328 +129329 +129331 +129356 +129357 +129375 +129388 +129426 +129432 +129488 +129511 +183984 +191457 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V72 +1012 +1014 +64976 +65008 +66304 +66335 +66336 +66340 +66352 +66379 +66560 +66598 +66600 +66638 +118784 +119030 +119040 +119079 +119082 +119262 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120001 +120002 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120484 +120488 +120778 +120782 +120832 +131072 +173783 +194560 +195102 +917505 +917506 +917536 +917632 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V212 +1318 +1320 +1568 +1569 +1631 +1632 +2112 +2140 +2142 +2143 +2362 +2364 +2383 +2384 +2390 +2392 +2419 +2424 +2930 +2936 +3369 +3370 +3386 +3387 +3406 +3407 +3980 +3984 +4057 +4059 +4957 +4959 +7104 +7156 +7164 +7168 +7676 +7677 +8341 +8349 +8377 +8378 +9193 +9204 +9934 +9935 +9954 +9955 +9956 +9960 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10176 +10190 +10192 +11632 +11633 +11647 +11648 +12728 +12731 +42592 +42594 +42893 +42895 +42896 +42898 +42912 +42922 +43002 +43003 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +64434 +64450 +69632 +69710 +69714 +69744 +92160 +92729 +110592 +110594 +127136 +127151 +127153 +127167 +127169 +127184 +127185 +127200 +127280 +127281 +127282 +127293 +127294 +127295 +127296 +127298 +127299 +127302 +127303 +127306 +127311 +127319 +127320 +127327 +127328 +127338 +127344 +127353 +127354 +127355 +127357 +127359 +127360 +127370 +127374 +127376 +127377 +127387 +127462 +127488 +127489 +127491 +127538 +127547 +127568 +127570 +127744 +127777 +127792 +127798 +127799 +127869 +127872 +127892 +127904 +127941 +127942 +127947 +127968 +127985 +128000 +128063 +128064 +128065 +128066 +128248 +128249 +128253 +128256 +128318 +128336 +128360 +128507 +128512 +128513 +128529 +128530 +128533 +128534 +128535 +128536 +128537 +128538 +128539 +128540 +128543 +128544 +128550 +128552 +128556 +128557 +128558 +128560 +128564 +128565 +128577 +128581 +128592 +128640 +128710 +128768 +128884 +177984 +178206 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1564 +1565 +8206 +8208 +8234 +8239 +8294 +8298 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1184 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +880 +885 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1488 +1515 +1520 +1523 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3635 +3648 +3655 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3763 +3773 +3774 +3776 +3781 +3782 +3783 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6823 +6824 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +12293 +12296 +12321 +12330 +12337 +12342 +12344 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42623 +42654 +42656 +42736 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64606 +64612 +64830 +64848 +64912 +64914 +64968 +65008 +65018 +65137 +65138 +65139 +65140 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65277 +65313 +65339 +65345 +65371 +65382 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71840 +71904 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +124928 +125125 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +13312 +19894 +19968 +40939 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V66 +2392 +2400 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2908 +2910 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3958 +3959 +3960 +3961 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +10972 +10973 +64285 +64286 +64287 +64288 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64335 +119134 +119141 +119227 +119233 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1264 +65 +91 +192 +215 +216 +223 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +444 +445 +452 +453 +455 +456 +458 +459 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +498 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +880 +881 +882 +883 +886 +887 +895 +896 +902 +903 +904 +907 +908 +909 +910 +912 +913 +930 +931 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1015 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1329 +1367 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7960 +7966 +7976 +7984 +7992 +8000 +8008 +8014 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8040 +8048 +8120 +8124 +8136 +8140 +8152 +8156 +8168 +8173 +8184 +8188 +8450 +8451 +8455 +8456 +8459 +8462 +8464 +8467 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8496 +8500 +8510 +8512 +8517 +8518 +8544 +8560 +8579 +8580 +9398 +9424 +11264 +11311 +11360 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11499 +11500 +11501 +11502 +11506 +11507 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42891 +42892 +42893 +42894 +42896 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42927 +42928 +42933 +42934 +42935 +65313 +65339 +66560 +66600 +66736 +66772 +68736 +68787 +71840 +71872 +119808 +119834 +119860 +119886 +119912 +119938 +119964 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119990 +120016 +120042 +120068 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120120 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120172 +120198 +120224 +120250 +120276 +120302 +120328 +120354 +120380 +120406 +120432 +120458 +120488 +120513 +120546 +120571 +120604 +120629 +120662 +120687 +120720 +120745 +120778 +120779 +125184 +125218 +127280 +127306 +127312 +127338 +127344 +127370 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1392 +48 +58 +65 +91 +95 +96 +97 +123 +170 +171 +181 +182 +183 +184 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +888 +891 +894 +895 +896 +902 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1160 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1642 +1646 +1748 +1749 +1757 +1759 +1769 +1770 +1789 +1791 +1792 +1808 +1867 +1869 +1970 +1984 +2038 +2042 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4096 +4170 +4176 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4969 +4978 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6100 +6103 +6104 +6108 +6110 +6112 +6122 +6155 +6158 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6823 +6824 +6832 +6846 +6912 +6988 +6992 +7002 +7019 +7028 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7294 +7296 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8255 +8257 +8276 +8277 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8413 +8417 +8418 +8421 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +12293 +12296 +12321 +12336 +12337 +12342 +12344 +12349 +12353 +12439 +12441 +12443 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42608 +42612 +42622 +42623 +42738 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43312 +43348 +43360 +43389 +43392 +43457 +43471 +43482 +43488 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43639 +43642 +43715 +43739 +43742 +43744 +43760 +43762 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44012 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64606 +64612 +64830 +64848 +64912 +64914 +64968 +65008 +65018 +65024 +65040 +65056 +65072 +65075 +65077 +65101 +65104 +65137 +65138 +65139 +65140 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65277 +65296 +65306 +65313 +65339 +65343 +65344 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69703 +69734 +69744 +69759 +69819 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69968 +70004 +70006 +70007 +70016 +70085 +70090 +70093 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70731 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72255 +72263 +72264 +72272 +72324 +72326 +72346 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92912 +92917 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V780 +160 +161 +168 +169 +170 +171 +175 +176 +178 +182 +184 +187 +188 +191 +192 +198 +199 +208 +209 +215 +217 +222 +224 +230 +231 +240 +241 +247 +249 +254 +255 +272 +274 +294 +296 +305 +306 +312 +313 +321 +323 +330 +332 +338 +340 +358 +360 +384 +416 +418 +431 +433 +452 +477 +478 +484 +486 +502 +504 +540 +542 +544 +550 +564 +688 +697 +728 +734 +736 +741 +832 +834 +835 +837 +884 +885 +890 +891 +894 +895 +900 +907 +908 +909 +910 +913 +938 +945 +970 +975 +976 +983 +1008 +1011 +1012 +1014 +1017 +1018 +1024 +1026 +1027 +1028 +1031 +1032 +1036 +1039 +1049 +1050 +1081 +1082 +1104 +1106 +1107 +1108 +1111 +1112 +1116 +1119 +1142 +1144 +1217 +1219 +1232 +1236 +1238 +1240 +1242 +1248 +1250 +1256 +1258 +1270 +1272 +1274 +1415 +1416 +1570 +1575 +1653 +1657 +1728 +1729 +1730 +1731 +1747 +1748 +2345 +2346 +2353 +2354 +2356 +2357 +2392 +2400 +2507 +2509 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2888 +2889 +2891 +2893 +2908 +2910 +2964 +2965 +3018 +3021 +3144 +3145 +3264 +3265 +3271 +3273 +3274 +3276 +3402 +3405 +3546 +3547 +3548 +3551 +3635 +3636 +3763 +3764 +3804 +3806 +3852 +3853 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3962 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4134 +4135 +4348 +4349 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6930 +6931 +6971 +6972 +6973 +6974 +6976 +6978 +6979 +6980 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7531 +7544 +7545 +7579 +7616 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8203 +8209 +8210 +8215 +8216 +8228 +8231 +8239 +8240 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8360 +8361 +8448 +8452 +8453 +8456 +8457 +8468 +8469 +8471 +8473 +8478 +8480 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8498 +8499 +8506 +8507 +8513 +8517 +8522 +8528 +8576 +8585 +8586 +8602 +8604 +8622 +8623 +8653 +8656 +8708 +8709 +8713 +8714 +8716 +8717 +8740 +8741 +8742 +8743 +8748 +8750 +8751 +8753 +8769 +8770 +8772 +8773 +8775 +8776 +8777 +8778 +8800 +8801 +8802 +8803 +8813 +8818 +8820 +8822 +8824 +8826 +8832 +8834 +8836 +8838 +8840 +8842 +8876 +8880 +8928 +8932 +8938 +8942 +9001 +9003 +9312 +9451 +10764 +10765 +10868 +10871 +10972 +10973 +11388 +11390 +11631 +11632 +11935 +11936 +12019 +12020 +12032 +12246 +12288 +12289 +12342 +12343 +12344 +12347 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12389 +12390 +12391 +12392 +12393 +12394 +12400 +12402 +12403 +12405 +12406 +12408 +12409 +12411 +12412 +12414 +12436 +12437 +12443 +12445 +12446 +12448 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12485 +12486 +12487 +12488 +12489 +12490 +12496 +12498 +12499 +12501 +12502 +12504 +12505 +12507 +12508 +12510 +12532 +12533 +12535 +12539 +12542 +12544 +12593 +12687 +12690 +12704 +12800 +12831 +12832 +12872 +12880 +12927 +12928 +13055 +13056 +13312 +42652 +42654 +42864 +42865 +43000 +43002 +43868 +43872 +44032 +55204 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65021 +65040 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +69786 +69787 +69788 +69789 +69803 +69804 +69934 +69936 +70475 +70477 +70843 +70845 +70846 +70847 +71098 +71100 +119134 +119141 +119227 +119233 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127232 +127243 +127248 +127279 +127280 +127312 +127338 +127340 +127376 +127377 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V781 +0 +160 +161 +168 +169 +170 +171 +175 +176 +178 +182 +184 +187 +188 +191 +192 +198 +199 +208 +209 +215 +217 +222 +224 +230 +231 +240 +241 +247 +249 +254 +255 +272 +274 +294 +296 +305 +306 +312 +313 +321 +323 +330 +332 +338 +340 +358 +360 +384 +416 +418 +431 +433 +452 +477 +478 +484 +486 +502 +504 +540 +542 +544 +550 +564 +688 +697 +728 +734 +736 +741 +832 +834 +835 +837 +884 +885 +890 +891 +894 +895 +900 +907 +908 +909 +910 +913 +938 +945 +970 +975 +976 +983 +1008 +1011 +1012 +1014 +1017 +1018 +1024 +1026 +1027 +1028 +1031 +1032 +1036 +1039 +1049 +1050 +1081 +1082 +1104 +1106 +1107 +1108 +1111 +1112 +1116 +1119 +1142 +1144 +1217 +1219 +1232 +1236 +1238 +1240 +1242 +1248 +1250 +1256 +1258 +1270 +1272 +1274 +1415 +1416 +1570 +1575 +1653 +1657 +1728 +1729 +1730 +1731 +1747 +1748 +2345 +2346 +2353 +2354 +2356 +2357 +2392 +2400 +2507 +2509 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2888 +2889 +2891 +2893 +2908 +2910 +2964 +2965 +3018 +3021 +3144 +3145 +3264 +3265 +3271 +3273 +3274 +3276 +3402 +3405 +3546 +3547 +3548 +3551 +3635 +3636 +3763 +3764 +3804 +3806 +3852 +3853 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3962 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4134 +4135 +4348 +4349 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6930 +6931 +6971 +6972 +6973 +6974 +6976 +6978 +6979 +6980 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7531 +7544 +7545 +7579 +7616 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8203 +8209 +8210 +8215 +8216 +8228 +8231 +8239 +8240 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8360 +8361 +8448 +8452 +8453 +8456 +8457 +8468 +8469 +8471 +8473 +8478 +8480 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8498 +8499 +8506 +8507 +8513 +8517 +8522 +8528 +8576 +8585 +8586 +8602 +8604 +8622 +8623 +8653 +8656 +8708 +8709 +8713 +8714 +8716 +8717 +8740 +8741 +8742 +8743 +8748 +8750 +8751 +8753 +8769 +8770 +8772 +8773 +8775 +8776 +8777 +8778 +8800 +8801 +8802 +8803 +8813 +8818 +8820 +8822 +8824 +8826 +8832 +8834 +8836 +8838 +8840 +8842 +8876 +8880 +8928 +8932 +8938 +8942 +9001 +9003 +9312 +9451 +10764 +10765 +10868 +10871 +10972 +10973 +11388 +11390 +11631 +11632 +11935 +11936 +12019 +12020 +12032 +12246 +12288 +12289 +12342 +12343 +12344 +12347 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12389 +12390 +12391 +12392 +12393 +12394 +12400 +12402 +12403 +12405 +12406 +12408 +12409 +12411 +12412 +12414 +12436 +12437 +12443 +12445 +12446 +12448 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12485 +12486 +12487 +12488 +12489 +12490 +12496 +12498 +12499 +12501 +12502 +12504 +12505 +12507 +12508 +12510 +12532 +12533 +12535 +12539 +12542 +12544 +12593 +12687 +12690 +12704 +12800 +12831 +12832 +12872 +12880 +12927 +12928 +13055 +13056 +13312 +42652 +42654 +42864 +42865 +43000 +43002 +43868 +43872 +44032 +55204 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65021 +65040 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +69786 +69787 +69788 +69789 +69803 +69804 +69934 +69936 +70475 +70477 +70843 +70845 +70846 +70847 +71098 +71100 +119134 +119141 +119227 +119233 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127232 +127243 +127248 +127279 +127280 +127312 +127338 +127340 +127376 +127377 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1214 +97 +123 +181 +182 +223 +247 +248 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +397 +402 +403 +405 +406 +409 +411 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +429 +430 +432 +433 +436 +437 +438 +439 +441 +442 +445 +446 +447 +448 +453 +455 +456 +458 +459 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +498 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +597 +598 +600 +601 +602 +603 +605 +608 +610 +611 +612 +613 +615 +616 +621 +623 +624 +625 +627 +629 +630 +637 +638 +640 +641 +643 +644 +647 +653 +658 +659 +669 +671 +837 +838 +881 +882 +883 +884 +887 +888 +891 +894 +912 +913 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1014 +1016 +1017 +1019 +1020 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1377 +1416 +5112 +5118 +7296 +7305 +7545 +7546 +7549 +7550 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7836 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7958 +7968 +7976 +7984 +7992 +8000 +8006 +8016 +8024 +8032 +8040 +8048 +8062 +8064 +8117 +8118 +8120 +8124 +8125 +8126 +8127 +8130 +8133 +8134 +8136 +8140 +8141 +8144 +8148 +8150 +8152 +8160 +8168 +8178 +8181 +8182 +8184 +8188 +8189 +8526 +8527 +8560 +8576 +8580 +8581 +9424 +9450 +11312 +11359 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11379 +11380 +11382 +11383 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11500 +11501 +11502 +11503 +11507 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42606 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42652 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42800 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42864 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42888 +42892 +42893 +42897 +42898 +42899 +42900 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42933 +42934 +42935 +42936 +43859 +43860 +43888 +43968 +64256 +64263 +64275 +64280 +65345 +65371 +66600 +66640 +66776 +66812 +68800 +68851 +71872 +71904 +125218 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V62 +65 +91 +97 +123 +170 +171 +186 +187 +192 +215 +216 +247 +248 +697 +736 +741 +7424 +7462 +7468 +7517 +7522 +7526 +7531 +7544 +7545 +7615 +7680 +7936 +8305 +8306 +8319 +8320 +8336 +8349 +8490 +8492 +8498 +8499 +8526 +8527 +8544 +8585 +11360 +11392 +42786 +42888 +42891 +42927 +42928 +42936 +42999 +43008 +43824 +43867 +43868 +43877 +64256 +64263 +65313 +65339 +65345 +65371 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V72 +880 +884 +885 +888 +890 +894 +895 +896 +900 +901 +902 +903 +904 +907 +908 +909 +910 +930 +931 +994 +1008 +1024 +7462 +7467 +7517 +7522 +7526 +7531 +7615 +7616 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8486 +8487 +43877 +43878 +65856 +65935 +65952 +65953 +119296 +119366 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +11904 +11930 +11931 +12020 +12032 +12246 +12293 +12294 +12295 +12296 +12321 +12330 +12344 +12348 +13312 +19894 +19968 +40939 +63744 +64110 +64112 +64218 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V30 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V114 +1536 +1541 +1542 +1548 +1549 +1563 +1564 +1565 +1566 +1567 +1568 +1600 +1601 +1611 +1622 +1648 +1649 +1757 +1758 +1792 +1872 +1920 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2304 +64336 +64450 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65022 +65136 +65141 +65142 +65277 +69216 +69247 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +1329 +1367 +1369 +1376 +1377 +1416 +1418 +1419 +1421 +1424 +64275 +64280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113824 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6480 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +12449 +12539 +12541 +12544 +12784 +12800 +13008 +13055 +13056 +13144 +65382 +65392 +65393 +65438 +110592 +110593 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3200 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V328 +0 +65 +91 +97 +123 +170 +171 +186 +187 +192 +215 +216 +247 +248 +697 +736 +741 +746 +748 +768 +884 +885 +894 +895 +901 +902 +903 +904 +1417 +1418 +1541 +1542 +1548 +1549 +1563 +1564 +1567 +1568 +1600 +1601 +1757 +1758 +2274 +2275 +2404 +2406 +3647 +3648 +4053 +4057 +4347 +4348 +5867 +5870 +5941 +5943 +6146 +6148 +6149 +6150 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +8192 +8204 +8206 +8293 +8294 +8305 +8308 +8319 +8320 +8335 +8352 +8384 +8448 +8486 +8487 +8490 +8492 +8498 +8499 +8526 +8527 +8544 +8585 +8588 +8592 +9255 +9280 +9291 +9312 +10240 +10496 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11776 +11850 +12272 +12284 +12288 +12293 +12294 +12295 +12296 +12321 +12336 +12344 +12348 +12352 +12443 +12445 +12448 +12449 +12539 +12541 +12688 +12704 +12736 +12772 +12832 +12896 +12927 +13008 +13144 +13312 +19904 +19968 +42752 +42786 +42888 +42891 +43056 +43066 +43310 +43311 +43471 +43472 +43867 +43868 +64830 +64832 +65040 +65050 +65072 +65107 +65108 +65127 +65128 +65132 +65279 +65280 +65281 +65313 +65339 +65345 +65371 +65382 +65392 +65393 +65438 +65440 +65504 +65511 +65512 +65519 +65529 +65534 +65792 +65795 +65799 +65844 +65847 +65856 +65936 +65948 +66000 +66045 +66273 +66300 +113824 +113828 +118784 +119030 +119040 +119079 +119081 +119143 +119146 +119163 +119171 +119173 +119180 +119210 +119214 +119273 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127488 +127489 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +917505 +917506 +917536 +917632 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +2432 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1792 +1806 +1807 +1867 +1869 +1872 +2144 +2155 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4352 +11520 +11558 +11559 +11560 +11565 +11566 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +6144 +6146 +6148 +6149 +6150 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +71264 +71277 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2304 +2385 +2387 +2404 +2406 +2432 +43232 +43262 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +12353 +12439 +12445 +12448 +110593 +110879 +127488 +127489 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +70113 +70133 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +4352 +4608 +12334 +12336 +12593 +12687 +12800 +12831 +12896 +12927 +43360 +43389 +44032 +55204 +55216 +55239 +55243 +55292 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V54 +768 +880 +1157 +1159 +1611 +1622 +1648 +1649 +2385 +2387 +6832 +6847 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8204 +8206 +8400 +8433 +12330 +12334 +12441 +12443 +65024 +65040 +65056 +65070 +66045 +66046 +66272 +66273 +119143 +119146 +119163 +119171 +119173 +119180 +119210 +119214 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +1024 +1157 +1159 +1328 +7296 +7305 +7467 +7468 +7544 +7545 +11744 +11776 +42560 +42656 +65070 +65072 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +11264 +11311 +11312 +11359 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V232 +65 +91 +97 +123 +181 +182 +192 +215 +216 +247 +248 +312 +313 +397 +398 +411 +412 +426 +428 +442 +444 +446 +447 +448 +452 +545 +546 +564 +570 +597 +598 +600 +601 +602 +603 +605 +608 +610 +611 +612 +613 +615 +616 +621 +623 +624 +625 +627 +629 +630 +637 +638 +640 +641 +643 +644 +647 +653 +658 +659 +669 +671 +837 +838 +880 +884 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +978 +981 +1014 +1015 +1020 +1021 +1154 +1162 +1328 +1329 +1367 +1377 +1416 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +5112 +5118 +7296 +7305 +7545 +7546 +7549 +7550 +7680 +7836 +7838 +7839 +7840 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8486 +8487 +8490 +8492 +8498 +8499 +8526 +8527 +8544 +8576 +8579 +8581 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11377 +11378 +11380 +11381 +11383 +11390 +11492 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42560 +42606 +42624 +42652 +42786 +42800 +42802 +42864 +42873 +42888 +42891 +42894 +42896 +42900 +42902 +42927 +42928 +42936 +43859 +43860 +43888 +43968 +64256 +64263 +64275 +64280 +65313 +65339 +65345 +65371 +66560 +66640 +66736 +66772 +66776 +66812 +68736 +68787 +68800 +68851 +71840 +71904 +125184 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +44 +45 +59 +60 +894 +895 +1417 +1418 +1548 +1550 +1644 +1645 +2040 +2041 +8260 +8261 +65040 +65041 +65044 +65045 +65104 +65105 +65108 +65109 +65292 +65293 +65307 +65308 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +1488 +1515 +1520 +1523 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64336 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V532 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2404 +2433 +2436 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2530 +2532 +2561 +2564 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2692 +2748 +2749 +2750 +2758 +2759 +2762 +2763 +2766 +2786 +2788 +2810 +2816 +2817 +2820 +2876 +2877 +2878 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3072 +3076 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3204 +3260 +3261 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3298 +3300 +3328 +3332 +3387 +3389 +3390 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3426 +3428 +3458 +3460 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3953 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4139 +4159 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4240 +4250 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6444 +6448 +6460 +6679 +6684 +6741 +6751 +6752 +6781 +6783 +6784 +6832 +6847 +6912 +6917 +6964 +6981 +7019 +7028 +7040 +7043 +7073 +7086 +7142 +7156 +7204 +7224 +7376 +7379 +7380 +7401 +7405 +7406 +7410 +7413 +7415 +7418 +7616 +7674 +7675 +7680 +8204 +8205 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43048 +43136 +43138 +43188 +43206 +43232 +43250 +43302 +43310 +43335 +43348 +43392 +43396 +43443 +43457 +43493 +43494 +43561 +43575 +43587 +43588 +43596 +43598 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43755 +43760 +43765 +43767 +44003 +44011 +44012 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +65438 +65440 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69632 +69635 +69688 +69703 +69759 +69763 +69808 +69819 +69888 +69891 +69927 +69941 +70003 +70004 +70016 +70019 +70067 +70081 +70090 +70093 +70188 +70200 +70206 +70207 +70367 +70379 +70400 +70404 +70460 +70461 +70462 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70502 +70509 +70512 +70517 +70709 +70727 +70832 +70852 +71087 +71094 +71096 +71105 +71132 +71134 +71216 +71233 +71339 +71352 +71453 +71468 +72193 +72203 +72243 +72250 +72251 +72255 +72263 +72264 +72273 +72284 +72330 +72346 +72751 +72759 +72760 +72768 +72850 +72872 +72873 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94033 +94079 +94095 +94099 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +173 +174 +1536 +1542 +1564 +1565 +1757 +1758 +1807 +1808 +2274 +2275 +6158 +6159 +8206 +8208 +8234 +8239 +8288 +8293 +8294 +8304 +65279 +65280 +65529 +65532 +69821 +69822 +113824 +113828 +119155 +119163 +917505 +917506 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +95 +96 +8239 +8240 +8255 +8257 +8276 +8277 +65075 +65077 +65101 +65104 +65343 +65344 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1499 +0 +10 +14 +34 +35 +39 +40 +44 +45 +46 +47 +48 +60 +65 +91 +95 +96 +97 +123 +133 +134 +170 +171 +173 +174 +181 +182 +183 +184 +186 +187 +192 +215 +216 +247 +248 +728 +734 +741 +748 +885 +886 +888 +890 +896 +902 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1417 +1418 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1525 +1536 +1542 +1548 +1550 +1552 +1563 +1564 +1565 +1568 +1642 +1643 +1645 +1646 +1748 +1749 +1758 +1759 +1769 +1770 +1789 +1791 +1792 +1807 +1867 +1869 +1970 +1984 +2038 +2040 +2041 +2042 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3633 +3634 +3636 +3643 +3655 +3663 +3664 +3674 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3792 +3802 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4139 +4159 +4160 +4170 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6068 +6100 +6109 +6110 +6112 +6122 +6155 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6480 +6608 +6618 +6656 +6684 +6741 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6832 +6847 +6912 +6988 +6992 +7002 +7019 +7028 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7294 +7296 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8204 +8208 +8216 +8218 +8228 +8229 +8231 +8240 +8255 +8257 +8260 +8261 +8276 +8277 +8288 +8293 +8294 +8304 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +9398 +9450 +9757 +9758 +9792 +9793 +9794 +9795 +9877 +9879 +9977 +9978 +9992 +9993 +9994 +9998 +10084 +10085 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +11823 +11824 +12293 +12294 +12330 +12336 +12337 +12342 +12347 +12349 +12441 +12445 +12448 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13008 +13055 +13056 +13144 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42611 +42612 +42622 +42623 +42738 +42775 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43312 +43348 +43360 +43389 +43392 +43457 +43471 +43482 +43493 +43494 +43504 +43514 +43520 +43575 +43584 +43598 +43600 +43610 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43744 +43760 +43762 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44011 +44012 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65024 +65041 +65043 +65045 +65056 +65072 +65075 +65077 +65101 +65105 +65106 +65107 +65108 +65110 +65136 +65141 +65142 +65277 +65279 +65280 +65287 +65288 +65292 +65293 +65294 +65295 +65306 +65308 +65313 +65339 +65343 +65344 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65529 +65532 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69703 +69734 +69744 +69759 +69819 +69821 +69822 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69968 +70004 +70006 +70007 +70016 +70085 +70090 +70093 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70731 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71453 +71468 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72255 +72263 +72264 +72272 +72324 +72326 +72346 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92912 +92917 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +110592 +110593 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113823 +113824 +113828 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127280 +127306 +127312 +127338 +127344 +127370 +127462 +127488 +127752 +127753 +127806 +127807 +127859 +127860 +127877 +127878 +127891 +127892 +127908 +127909 +127912 +127913 +127938 +127941 +127943 +127944 +127946 +127949 +127979 +127980 +127981 +127982 +127995 +128000 +128066 +128068 +128070 +128081 +128102 +128106 +128110 +128111 +128112 +128121 +128124 +128125 +128129 +128132 +128133 +128136 +128139 +128140 +128170 +128171 +128187 +128189 +128295 +128296 +128300 +128301 +128372 +128374 +128378 +128379 +128400 +128401 +128405 +128407 +128488 +128489 +128581 +128584 +128587 +128592 +128640 +128641 +128658 +128659 +128675 +128676 +128692 +128695 +128704 +128705 +128716 +128717 +129304 +129309 +129310 +129312 +129318 +129319 +129328 +129338 +129341 +129343 +129489 +129502 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1014 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +728 +734 +741 +748 +768 +880 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1523 +1524 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6176 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6656 +6679 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11823 +11824 +12293 +12294 +12347 +12349 +12549 +12591 +12593 +12687 +12704 +12731 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42623 +42654 +42656 +42736 +42775 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43520 +43561 +43584 +43587 +43588 +43596 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +64256 +64263 +64275 +64280 +64336 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65313 +65339 +65345 +65371 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71840 +71904 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +124928 +125125 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127280 +127306 +127312 +127338 +127344 +127370 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +12337 +12342 +12443 +12445 +12448 +12539 +12540 +12544 +12784 +12800 +13008 +13055 +13056 +13144 +65382 +65438 +110592 +110593 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +58 +59 +183 +184 +903 +904 +1524 +1525 +8231 +8232 +65043 +65044 +65109 +65110 +65306 +65307 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V110 +48 +58 +1632 +1642 +1643 +1644 +1776 +1786 +1984 +1994 +2406 +2416 +2534 +2544 +2662 +2672 +2790 +2800 +2918 +2928 +3046 +3056 +3174 +3184 +3302 +3312 +3430 +3440 +3558 +3568 +3664 +3674 +3792 +3802 +3872 +3882 +4160 +4170 +4240 +4250 +6112 +6122 +6160 +6170 +6470 +6480 +6608 +6618 +6784 +6794 +6800 +6810 +6992 +7002 +7088 +7098 +7232 +7242 +7248 +7258 +42528 +42538 +43216 +43226 +43264 +43274 +43472 +43482 +43504 +43514 +43600 +43610 +44016 +44026 +66720 +66730 +69734 +69744 +69872 +69882 +69942 +69952 +70096 +70106 +70384 +70394 +70736 +70746 +70864 +70874 +71248 +71258 +71360 +71370 +71472 +71482 +71904 +71914 +72784 +72794 +73040 +73050 +92768 +92778 +93008 +93018 +120782 +120832 +125264 +125274 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +46 +47 +8216 +8218 +8228 +8229 +65106 +65107 +65287 +65288 +65294 +65295 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +8532 +8533 +65911 +65912 +68093 +68094 +69246 +69247 +74843 +74844 +74846 +74847 +74854 +74855 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V222 +52 +53 +1636 +1637 +1780 +1781 +1988 +1989 +2410 +2411 +2538 +2539 +2666 +2667 +2794 +2795 +2922 +2923 +3050 +3051 +3178 +3179 +3306 +3307 +3434 +3435 +3562 +3563 +3668 +3669 +3796 +3797 +3876 +3877 +4164 +4165 +4244 +4245 +4972 +4973 +6116 +6117 +6132 +6133 +6164 +6165 +6474 +6475 +6612 +6613 +6788 +6789 +6804 +6805 +6996 +6997 +7092 +7093 +7236 +7237 +7252 +7253 +8308 +8309 +8324 +8325 +8547 +8548 +8563 +8564 +9315 +9316 +9335 +9336 +9355 +9356 +9464 +9465 +10105 +10106 +10115 +10116 +10125 +10126 +12324 +12325 +12693 +12694 +12835 +12836 +12931 +12932 +20118 +20119 +22235 +22236 +32902 +32903 +42532 +42533 +42729 +42730 +43220 +43221 +43268 +43269 +43476 +43477 +43508 +43509 +43604 +43605 +44020 +44021 +65300 +65301 +65802 +65803 +66276 +66277 +66724 +66725 +67708 +67709 +67754 +67756 +68035 +68036 +68163 +68164 +68443 +68444 +68475 +68476 +68524 +68525 +69219 +69220 +69717 +69718 +69738 +69739 +69876 +69877 +69946 +69947 +70100 +70101 +70116 +70117 +70388 +70389 +70740 +70741 +70868 +70869 +71252 +71253 +71364 +71365 +71476 +71477 +71908 +71909 +72788 +72789 +72797 +72798 +73044 +73045 +74754 +74755 +74761 +74762 +74767 +74768 +74776 +74777 +74785 +74786 +74790 +74791 +74800 +74801 +74808 +74809 +74812 +74816 +74828 +74829 +74834 +74836 +74857 +74858 +92772 +92773 +93012 +93013 +119651 +119652 +120786 +120787 +120796 +120797 +120806 +120807 +120816 +120817 +120826 +120827 +125130 +125131 +125268 +125269 +127237 +127238 +131172 +131173 +131298 +131299 +156269 +156270 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V238 +50 +51 +178 +179 +1634 +1635 +1778 +1779 +1986 +1987 +2408 +2409 +2536 +2537 +2664 +2665 +2792 +2793 +2920 +2921 +3048 +3049 +3176 +3177 +3194 +3195 +3197 +3198 +3304 +3305 +3432 +3433 +3560 +3561 +3666 +3667 +3794 +3795 +3874 +3875 +4162 +4163 +4242 +4243 +4970 +4971 +6114 +6115 +6130 +6131 +6162 +6163 +6472 +6473 +6610 +6611 +6786 +6787 +6802 +6803 +6994 +6995 +7090 +7091 +7234 +7235 +7250 +7251 +8322 +8323 +8545 +8546 +8561 +8562 +9313 +9314 +9333 +9334 +9353 +9354 +9462 +9463 +10103 +10104 +10113 +10114 +10123 +10124 +12322 +12323 +12691 +12692 +12833 +12834 +12929 +12930 +13443 +13444 +20108 +20109 +20841 +20842 +24333 +24334 +24336 +24337 +36014 +36015 +36019 +36020 +36144 +36145 +42530 +42531 +42727 +42728 +43218 +43219 +43266 +43267 +43474 +43475 +43506 +43507 +43602 +43603 +44018 +44019 +63864 +63865 +65298 +65299 +65800 +65801 +65883 +65887 +66274 +66275 +66514 +66515 +66722 +66723 +67673 +67674 +67706 +67707 +67752 +67753 +67866 +67867 +68033 +68034 +68161 +68162 +68441 +68442 +68473 +68474 +68522 +68523 +69217 +69218 +69715 +69716 +69736 +69737 +69874 +69875 +69944 +69945 +70098 +70099 +70114 +70115 +70386 +70387 +70738 +70739 +70866 +70867 +71250 +71251 +71362 +71363 +71474 +71475 +71906 +71907 +72786 +72787 +72795 +72796 +73042 +73043 +74752 +74753 +74774 +74775 +74783 +74784 +74787 +74788 +74797 +74798 +74805 +74806 +74826 +74827 +74832 +74833 +74838 +74839 +74841 +74842 +92770 +92771 +93010 +93011 +119649 +119650 +120784 +120785 +120794 +120795 +120804 +120805 +120814 +120815 +120824 +120825 +125128 +125129 +125266 +125267 +127235 +127236 +140176 +140177 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V190 +56 +57 +1640 +1641 +1784 +1785 +1992 +1993 +2414 +2415 +2542 +2543 +2670 +2671 +2798 +2799 +2926 +2927 +3054 +3055 +3182 +3183 +3310 +3311 +3438 +3439 +3566 +3567 +3672 +3673 +3800 +3801 +3880 +3881 +4168 +4169 +4248 +4249 +4976 +4977 +6120 +6121 +6136 +6137 +6168 +6169 +6478 +6479 +6616 +6617 +6792 +6793 +6808 +6809 +7000 +7001 +7096 +7097 +7240 +7241 +7256 +7257 +8312 +8313 +8328 +8329 +8551 +8552 +8567 +8568 +9319 +9320 +9339 +9340 +9359 +9360 +9468 +9469 +10109 +10110 +10119 +10120 +10129 +10130 +12328 +12329 +12839 +12840 +12935 +12936 +20843 +20844 +25420 +25421 +42536 +42537 +42733 +42734 +43224 +43225 +43272 +43273 +43480 +43481 +43512 +43513 +43608 +43609 +44024 +44025 +65304 +65305 +65806 +65807 +66280 +66281 +66728 +66729 +68039 +68040 +69223 +69224 +69721 +69722 +69742 +69743 +69880 +69881 +69950 +69951 +70104 +70105 +70120 +70121 +70392 +70393 +70744 +70745 +70872 +70873 +71256 +71257 +71368 +71369 +71480 +71481 +71912 +71913 +72792 +72793 +72801 +72802 +73048 +73049 +74758 +74759 +74765 +74766 +74771 +74772 +74780 +74781 +74794 +74795 +74820 +74822 +74861 +74862 +92776 +92777 +93016 +93017 +119655 +119656 +120790 +120791 +120800 +120801 +120810 +120811 +120820 +120821 +120830 +120831 +125134 +125135 +125272 +125273 +127241 +127242 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +4986 +4987 +65816 +65817 +66290 +66291 +66369 +66370 +69233 +69234 +69731 +69732 +70130 +70131 +71922 +71923 +72811 +72812 +119665 +119666 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +4983 +4984 +12877 +12878 +65813 +65814 +66287 +66288 +68046 +68047 +69230 +69231 +69728 +69729 +70127 +70128 +71919 +71920 +72808 +72809 +119662 +119663 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V62 +4979 +4980 +9331 +9332 +9351 +9352 +9371 +9372 +9460 +9461 +12345 +12346 +12873 +12874 +21316 +21317 +24319 +24320 +65809 +65810 +66283 +66284 +66516 +66517 +67676 +67677 +67711 +67712 +67758 +67759 +67838 +67839 +67864 +67865 +68042 +68043 +68165 +68166 +68255 +68256 +68334 +68335 +68445 +68446 +68477 +68478 +68526 +68527 +69226 +69227 +69724 +69725 +70123 +70124 +71483 +71484 +71915 +71916 +72804 +72805 +119658 +119659 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +4984 +4985 +12878 +12879 +65814 +65815 +66288 +66289 +68047 +68048 +69231 +69232 +69729 +69730 +70128 +70129 +71920 +71921 +72809 +72810 +119663 +119664 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +188 +189 +2551 +2552 +2930 +2931 +3443 +3444 +43056 +43057 +65856 +65857 +65931 +65932 +68088 +68089 +69244 +69245 +74848 +74849 +74850 +74852 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +4988 +4989 +8578 +8579 +19975 +19976 +33836 +33837 +65835 +65836 +65877 +65878 +67679 +67680 +68068 +68069 +93021 +93022 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +5872 +5873 +9330 +9331 +9350 +9351 +9370 +9371 +9459 +9460 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +4985 +4986 +12879 +12880 +65815 +65816 +66289 +66290 +69232 +69233 +69730 +69731 +70129 +70130 +71921 +71922 +72810 +72811 +119664 +119665 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +8554 +8555 +8570 +8571 +9322 +9323 +9342 +9343 +9362 +9363 +9451 +9452 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +4981 +4982 +12875 +12876 +12981 +12982 +21324 +21325 +65811 +65812 +66285 +66286 +68044 +68045 +69228 +69229 +69726 +69727 +70125 +70126 +71917 +71918 +72806 +72807 +74855 +74856 +119660 +119661 +133516 +133517 +133532 +133533 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V24 +189 +190 +2931 +2932 +3444 +3445 +3882 +3883 +11517 +11518 +43057 +43058 +65857 +65858 +65909 +65911 +68029 +68030 +68091 +68092 +69243 +69244 +74852 +74853 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +65823 +65824 +66297 +66298 +68056 +68057 +69240 +69241 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V238 +49 +50 +185 +186 +1633 +1634 +1777 +1778 +1985 +1986 +2407 +2408 +2535 +2536 +2663 +2664 +2791 +2792 +2919 +2920 +3047 +3048 +3175 +3176 +3193 +3194 +3196 +3197 +3303 +3304 +3431 +3432 +3559 +3560 +3665 +3666 +3793 +3794 +3873 +3874 +4161 +4162 +4241 +4242 +4969 +4970 +6113 +6114 +6129 +6130 +6161 +6162 +6471 +6472 +6609 +6610 +6618 +6619 +6785 +6786 +6801 +6802 +6993 +6994 +7089 +7090 +7233 +7234 +7249 +7250 +8321 +8322 +8543 +8545 +8560 +8561 +9312 +9313 +9332 +9333 +9352 +9353 +9461 +9462 +10102 +10103 +10112 +10113 +10122 +10123 +12321 +12322 +12690 +12691 +12832 +12833 +12928 +12929 +19968 +19969 +22769 +22770 +22777 +22778 +24186 +24187 +24332 +24333 +42529 +42530 +42726 +42727 +43217 +43218 +43265 +43266 +43473 +43474 +43505 +43506 +43601 +43602 +44017 +44018 +65297 +65298 +65799 +65800 +65858 +65859 +65880 +65883 +66273 +66274 +66336 +66337 +66513 +66514 +66721 +66722 +67672 +67673 +67705 +67706 +67751 +67752 +67835 +67836 +67862 +67863 +68032 +68033 +68160 +68161 +68221 +68222 +68253 +68254 +68331 +68332 +68440 +68441 +68472 +68473 +68521 +68522 +68858 +68859 +69216 +69217 +69714 +69715 +69735 +69736 +69873 +69874 +69943 +69944 +70097 +70098 +70113 +70114 +70385 +70386 +70737 +70738 +70865 +70866 +71249 +71250 +71361 +71362 +71473 +71474 +71905 +71906 +72785 +72786 +72794 +72795 +73041 +73042 +74773 +74774 +74782 +74783 +74796 +74797 +74804 +74805 +74831 +74832 +74840 +74841 +92769 +92770 +93009 +93010 +119648 +119649 +120783 +120784 +120793 +120794 +120803 +120804 +120813 +120814 +120823 +120824 +125127 +125128 +125265 +125266 +127234 +127235 +133418 +133419 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +65818 +65819 +66292 +66293 +68051 +68052 +69235 +69236 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +8531 +8532 +68089 +68090 +69245 +69246 +74842 +74843 +74845 +74846 +74853 +74854 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +2553 +2554 +9327 +9328 +9347 +9348 +9367 +9368 +9456 +9457 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +9325 +9326 +9345 +9346 +9365 +9366 +9454 +9455 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +65824 +65825 +66298 +66299 +68057 +68058 +69241 +69242 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V196 +55 +56 +1639 +1640 +1783 +1784 +1991 +1992 +2413 +2414 +2541 +2542 +2669 +2670 +2797 +2798 +2925 +2926 +3053 +3054 +3181 +3182 +3309 +3310 +3437 +3438 +3565 +3566 +3671 +3672 +3799 +3800 +3879 +3880 +4167 +4168 +4247 +4248 +4975 +4976 +6119 +6120 +6135 +6136 +6167 +6168 +6477 +6478 +6615 +6616 +6791 +6792 +6807 +6808 +6999 +7000 +7095 +7096 +7239 +7240 +7255 +7256 +8311 +8312 +8327 +8328 +8550 +8551 +8566 +8567 +9318 +9319 +9338 +9339 +9358 +9359 +9467 +9468 +10108 +10109 +10118 +10119 +10128 +10129 +12327 +12328 +12838 +12839 +12934 +12935 +15181 +15182 +19971 +19972 +26578 +26579 +28422 +28423 +42535 +42536 +42732 +42733 +43223 +43224 +43271 +43272 +43479 +43480 +43511 +43512 +43607 +43608 +44023 +44024 +65303 +65304 +65805 +65806 +66279 +66280 +66727 +66728 +68038 +68039 +69222 +69223 +69720 +69721 +69741 +69742 +69879 +69880 +69949 +69950 +70103 +70104 +70119 +70120 +70391 +70392 +70743 +70744 +70871 +70872 +71255 +71256 +71367 +71368 +71479 +71480 +71911 +71912 +72791 +72792 +72800 +72801 +73047 +73048 +74757 +74758 +74764 +74765 +74770 +74771 +74779 +74780 +74793 +74794 +74817 +74820 +74860 +74861 +92775 +92776 +93015 +93016 +119654 +119655 +120789 +120790 +120799 +120800 +120809 +120810 +120819 +120820 +120829 +120830 +125133 +125134 +125271 +125272 +127240 +127241 +131073 +131074 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +9324 +9325 +9344 +9345 +9364 +9365 +9453 +9454 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V202 +54 +55 +1638 +1639 +1782 +1783 +1990 +1991 +2412 +2413 +2540 +2541 +2668 +2669 +2796 +2797 +2924 +2925 +3052 +3053 +3180 +3181 +3308 +3309 +3436 +3437 +3564 +3565 +3670 +3671 +3798 +3799 +3878 +3879 +4166 +4167 +4246 +4247 +4974 +4975 +6118 +6119 +6134 +6135 +6166 +6167 +6476 +6477 +6614 +6615 +6790 +6791 +6806 +6807 +6998 +6999 +7094 +7095 +7238 +7239 +7254 +7255 +8310 +8311 +8326 +8327 +8549 +8550 +8565 +8566 +8581 +8582 +9317 +9318 +9337 +9338 +9357 +9358 +9466 +9467 +10107 +10108 +10117 +10118 +10127 +10128 +12326 +12327 +12837 +12838 +12933 +12934 +20845 +20846 +38470 +38471 +38520 +38521 +42534 +42535 +42731 +42732 +43222 +43223 +43270 +43271 +43478 +43479 +43510 +43511 +43606 +43607 +44022 +44023 +63953 +63954 +63955 +63956 +65302 +65303 +65804 +65805 +66278 +66279 +66726 +66727 +68037 +68038 +69221 +69222 +69719 +69720 +69740 +69741 +69878 +69879 +69948 +69949 +70102 +70103 +70118 +70119 +70390 +70391 +70742 +70743 +70870 +70871 +71254 +71255 +71366 +71367 +71478 +71479 +71910 +71911 +72790 +72791 +72799 +72800 +73046 +73047 +74756 +74757 +74763 +74764 +74769 +74770 +74778 +74779 +74792 +74793 +74816 +74817 +74830 +74831 +74859 +74860 +92774 +92775 +93014 +93015 +119653 +119654 +120788 +120789 +120798 +120799 +120808 +120809 +120818 +120819 +120828 +120829 +125132 +125133 +125270 +125271 +127239 +127240 +133866 +133867 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V194 +57 +58 +1641 +1642 +1785 +1786 +1993 +1994 +2415 +2416 +2543 +2544 +2671 +2672 +2799 +2800 +2927 +2928 +3055 +3056 +3183 +3184 +3311 +3312 +3439 +3440 +3567 +3568 +3673 +3674 +3801 +3802 +3881 +3882 +4169 +4170 +4249 +4250 +4977 +4978 +6121 +6122 +6137 +6138 +6169 +6170 +6479 +6480 +6617 +6618 +6793 +6794 +6809 +6810 +7001 +7002 +7097 +7098 +7241 +7242 +7257 +7258 +8313 +8314 +8329 +8330 +8552 +8553 +8568 +8569 +9320 +9321 +9340 +9341 +9360 +9361 +9469 +9470 +10110 +10111 +10120 +10121 +10130 +10131 +12329 +12330 +12840 +12841 +12936 +12937 +20061 +20062 +24318 +24319 +29590 +29591 +42537 +42538 +42734 +42735 +43225 +43226 +43273 +43274 +43481 +43482 +43513 +43514 +43609 +43610 +44025 +44026 +65305 +65306 +65807 +65808 +66281 +66282 +66729 +66730 +68040 +68041 +69224 +69225 +69722 +69723 +69743 +69744 +69881 +69882 +69951 +69952 +70105 +70106 +70121 +70122 +70393 +70394 +70745 +70746 +70873 +70874 +71257 +71258 +71369 +71370 +71481 +71482 +71913 +71914 +72793 +72794 +72802 +72803 +73049 +73050 +74759 +74760 +74766 +74767 +74772 +74773 +74781 +74782 +74795 +74796 +74822 +74826 +74862 +74863 +92777 +92778 +93017 +93018 +119656 +119657 +120791 +120792 +120801 +120802 +120811 +120812 +120821 +120822 +120831 +120832 +125135 +125136 +125273 +125274 +127242 +127243 +194704 +194705 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V48 +4982 +4983 +8556 +8557 +8572 +8573 +8582 +8583 +12876 +12877 +12991 +12992 +65812 +65813 +65860 +65861 +65866 +65867 +65873 +65874 +65894 +65898 +65908 +65909 +66286 +66287 +66339 +66340 +68045 +68046 +68222 +68223 +68861 +68862 +69229 +69230 +69727 +69728 +70126 +70127 +71918 +71919 +72807 +72808 +74856 +74857 +119661 +119662 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +2549 +2550 +2934 +2935 +3447 +3448 +8539 +8540 +43060 +43061 +74847 +74848 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +65822 +65823 +66296 +66297 +68055 +68056 +69239 +69240 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +65825 +65826 +66299 +66300 +66378 +66379 +68058 +68059 +69242 +69243 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +9326 +9327 +9346 +9347 +9366 +9367 +9455 +9456 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +190 +191 +2552 +2553 +2932 +2933 +3445 +3446 +43058 +43059 +65912 +65913 +68094 +68095 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +5870 +5871 +9328 +9329 +9348 +9349 +9368 +9369 +9457 +9458 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +65819 +65820 +65899 +65900 +66293 +66294 +68052 +68053 +69236 +69237 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +4980 +4981 +12346 +12347 +12874 +12875 +12890 +12891 +21317 +21318 +65810 +65811 +65893 +65894 +66284 +66285 +68043 +68044 +69227 +69228 +69725 +69726 +70124 +70125 +71916 +71917 +72805 +72806 +119659 +119660 +133507 +133508 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +8577 +8578 +65830 +65831 +65862 +65863 +65870 +65871 +65906 +65907 +68063 +68064 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V234 +51 +52 +179 +180 +1635 +1636 +1779 +1780 +1987 +1988 +2409 +2410 +2537 +2538 +2665 +2666 +2793 +2794 +2921 +2922 +3049 +3050 +3177 +3178 +3195 +3196 +3198 +3199 +3305 +3306 +3433 +3434 +3561 +3562 +3667 +3668 +3795 +3796 +3875 +3876 +4163 +4164 +4243 +4244 +4971 +4972 +6115 +6116 +6131 +6132 +6163 +6164 +6473 +6474 +6611 +6612 +6787 +6788 +6803 +6804 +6995 +6996 +7091 +7092 +7235 +7236 +7251 +7252 +8323 +8324 +8546 +8547 +8562 +8563 +9314 +9315 +9334 +9335 +9354 +9355 +9463 +9464 +10104 +10105 +10114 +10115 +10124 +10125 +12323 +12324 +12692 +12693 +12834 +12835 +12930 +12931 +19977 +19978 +20200 +20201 +21441 +21445 +24334 +24335 +42531 +42532 +42728 +42729 +43219 +43220 +43267 +43268 +43475 +43476 +43507 +43508 +43603 +43604 +44019 +44020 +63851 +63852 +65299 +65300 +65801 +65802 +66275 +66276 +66723 +66724 +67674 +67675 +67707 +67708 +67753 +67754 +67867 +67868 +68034 +68035 +68162 +68163 +68442 +68443 +68474 +68475 +68523 +68524 +69218 +69219 +69716 +69717 +69737 +69738 +69875 +69876 +69945 +69946 +70099 +70100 +70115 +70116 +70387 +70388 +70739 +70740 +70867 +70868 +71251 +71252 +71363 +71364 +71475 +71476 +71907 +71908 +72787 +72788 +72796 +72797 +73043 +73044 +74753 +74754 +74760 +74761 +74775 +74776 +74784 +74785 +74788 +74790 +74798 +74800 +74806 +74808 +74810 +74812 +74827 +74828 +74833 +74834 +74839 +74840 +92771 +92772 +93011 +93012 +119650 +119651 +120785 +120786 +120795 +120796 +120805 +120806 +120815 +120816 +120825 +120826 +125129 +125130 +125267 +125268 +127236 +127237 +133885 +133886 +133913 +133914 +141720 +141721 +146203 +146204 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V38 +3058 +3059 +3442 +3443 +8559 +8560 +8575 +8577 +20191 +20192 +21315 +21316 +38433 +38434 +65826 +65827 +65869 +65870 +65876 +65877 +65905 +65906 +67678 +67679 +68059 +68060 +68167 +68168 +68447 +68448 +68479 +68480 +68863 +68864 +69733 +69734 +70132 +70133 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +65820 +65821 +66294 +66295 +68053 +68054 +69237 +69238 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +5871 +5872 +9329 +9330 +9349 +9350 +9369 +9370 +9458 +9459 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V100 +3056 +3057 +3440 +3441 +4978 +4979 +8553 +8554 +8569 +8570 +9321 +9322 +9341 +9342 +9361 +9362 +9470 +9471 +10111 +10112 +10121 +10122 +10131 +10132 +12344 +12345 +12841 +12842 +12872 +12873 +12937 +12938 +20160 +20161 +21313 +21314 +25342 +25343 +63859 +63860 +63997 +63998 +65808 +65809 +65865 +65866 +65872 +65873 +65879 +65880 +65888 +65893 +66282 +66283 +66338 +66339 +66515 +66516 +67675 +67676 +67710 +67711 +67757 +67758 +67837 +67838 +67863 +67864 +68041 +68042 +68164 +68165 +68254 +68255 +68333 +68334 +68444 +68445 +68476 +68477 +68525 +68526 +68860 +68861 +69225 +69226 +69723 +69724 +70122 +70123 +71482 +71483 +71914 +71915 +72803 +72804 +93019 +93020 +119657 +119658 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +8558 +8559 +8574 +8575 +65821 +65822 +65861 +65862 +65868 +65869 +65875 +65876 +65900 +65905 +66295 +66296 +68054 +68055 +69238 +69239 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +8583 +8584 +65839 +65840 +65863 +65864 +65878 +65879 +68072 +68073 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V146 +48 +49 +1632 +1633 +1776 +1777 +1984 +1985 +2406 +2407 +2534 +2535 +2662 +2663 +2790 +2791 +2918 +2919 +3046 +3047 +3174 +3175 +3192 +3193 +3302 +3303 +3430 +3431 +3558 +3559 +3664 +3665 +3792 +3793 +3872 +3873 +4160 +4161 +4240 +4241 +6112 +6113 +6128 +6129 +6160 +6161 +6470 +6471 +6608 +6609 +6784 +6785 +6800 +6801 +6992 +6993 +7088 +7089 +7232 +7233 +7248 +7249 +8304 +8305 +8320 +8321 +8585 +8586 +9450 +9451 +9471 +9472 +12295 +12296 +38646 +38647 +42528 +42529 +42735 +42736 +43216 +43217 +43264 +43265 +43472 +43473 +43504 +43505 +43600 +43601 +44016 +44017 +63922 +63923 +65296 +65297 +65930 +65931 +66720 +66721 +69734 +69735 +69872 +69873 +69942 +69943 +70096 +70097 +70384 +70385 +70736 +70737 +70864 +70865 +71248 +71249 +71360 +71361 +71472 +71473 +71904 +71905 +72784 +72785 +73040 +73041 +92768 +92769 +93008 +93009 +120782 +120783 +120792 +120793 +120802 +120803 +120812 +120813 +120822 +120823 +125264 +125265 +127232 +127234 +127243 +127245 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2548 +2549 +2933 +2934 +3446 +3447 +43059 +43060 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2550 +2551 +2935 +2936 +3448 +3449 +43061 +43062 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V226 +53 +54 +1637 +1638 +1781 +1782 +1989 +1990 +2411 +2412 +2539 +2540 +2667 +2668 +2795 +2796 +2923 +2924 +3051 +3052 +3179 +3180 +3307 +3308 +3435 +3436 +3563 +3564 +3669 +3670 +3797 +3798 +3877 +3878 +4165 +4166 +4245 +4246 +4973 +4974 +6117 +6118 +6133 +6134 +6165 +6166 +6475 +6476 +6613 +6614 +6789 +6790 +6805 +6806 +6997 +6998 +7093 +7094 +7237 +7238 +7253 +7254 +8309 +8310 +8325 +8326 +8548 +8549 +8564 +8565 +9316 +9317 +9336 +9337 +9356 +9357 +9465 +9466 +10106 +10107 +10116 +10117 +10126 +10127 +12325 +12326 +12836 +12837 +12932 +12933 +13317 +13318 +14378 +14379 +20116 +20117 +20237 +20238 +42533 +42534 +42730 +42731 +43221 +43222 +43269 +43270 +43477 +43478 +43509 +43510 +43605 +43606 +44021 +44022 +65301 +65302 +65803 +65804 +65859 +65860 +65864 +65865 +65871 +65872 +65887 +65888 +65907 +65908 +66277 +66278 +66337 +66338 +66725 +66726 +67709 +67710 +67756 +67757 +67836 +67837 +68036 +68037 +68332 +68333 +68859 +68860 +69220 +69221 +69718 +69719 +69739 +69740 +69877 +69878 +69947 +69948 +70101 +70102 +70117 +70118 +70389 +70390 +70741 +70742 +70869 +70870 +71253 +71254 +71365 +71366 +71477 +71478 +71909 +71910 +72789 +72790 +72798 +72799 +73045 +73046 +74755 +74756 +74762 +74763 +74768 +74769 +74777 +74778 +74786 +74787 +74791 +74792 +74801 +74802 +74809 +74810 +74829 +74830 +74836 +74838 +74858 +74859 +92773 +92774 +93013 +93014 +119652 +119653 +120787 +120788 +120797 +120798 +120807 +120808 +120817 +120818 +120827 +120828 +125131 +125132 +125269 +125270 +127238 +127239 +131361 +131362 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V60 +3057 +3058 +3441 +3442 +4987 +4988 +8557 +8558 +8573 +8574 +20336 +20337 +30334 +30335 +38476 +38477 +65817 +65818 +65867 +65868 +65874 +65875 +65898 +65899 +66291 +66292 +66517 +66518 +67677 +67678 +67759 +67760 +67839 +67840 +67865 +67866 +68050 +68051 +68166 +68167 +68335 +68336 +68446 +68447 +68478 +68479 +68527 +68528 +68862 +68863 +69234 +69235 +69732 +69733 +70131 +70132 +72812 +72813 +93020 +93021 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +8555 +8556 +8571 +8572 +9323 +9324 +9343 +9344 +9363 +9364 +9452 +9453 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1206 +65 +91 +181 +182 +192 +215 +216 +224 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +383 +384 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +444 +445 +452 +454 +455 +457 +458 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +837 +838 +880 +881 +882 +883 +886 +887 +895 +896 +902 +903 +904 +907 +908 +909 +910 +912 +913 +930 +931 +940 +962 +963 +975 +978 +981 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1010 +1012 +1014 +1015 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1329 +1367 +1415 +1416 +4256 +4294 +4295 +4296 +4301 +4302 +5112 +5118 +7296 +7305 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7834 +7836 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7960 +7966 +7976 +7984 +7992 +8000 +8008 +8014 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8040 +8048 +8064 +8112 +8114 +8117 +8119 +8125 +8130 +8133 +8135 +8141 +8152 +8156 +8168 +8173 +8178 +8181 +8183 +8189 +8486 +8487 +8490 +8492 +8498 +8499 +8544 +8560 +8579 +8580 +9398 +9424 +11264 +11311 +11360 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11499 +11500 +11501 +11502 +11506 +11507 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42891 +42892 +42893 +42894 +42896 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42927 +42928 +42933 +42934 +42935 +43888 +43968 +64256 +64263 +64275 +64280 +65313 +65339 +66560 +66600 +66736 +66772 +68736 +68787 +71840 +71872 +125184 +125218 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V36 +173 +174 +1536 +1542 +1564 +1565 +1757 +1758 +1807 +1808 +2274 +2275 +6158 +6159 +8203 +8208 +8234 +8239 +8288 +8293 +8294 +8304 +65279 +65280 +65529 +65532 +69821 +69822 +113824 +113828 +119155 +119163 +917505 +917506 +917536 +917632 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V58 +94 +95 +96 +97 +168 +169 +175 +176 +180 +181 +184 +185 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +900 +902 +8125 +8126 +8127 +8130 +8141 +8144 +8157 +8160 +8173 +8176 +8189 +8191 +12443 +12445 +42752 +42775 +42784 +42786 +42889 +42891 +43867 +43868 +64434 +64450 +65342 +65343 +65344 +65345 +65507 +65508 +127995 +128000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1297 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917505 +917506 +917536 +917632 +917760 +918000 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +32 +33 +160 +161 +5760 +5761 +8192 +8203 +8239 +8240 +8287 +8288 +12288 +12289 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V24 +5870 +5873 +8544 +8579 +8581 +8585 +12295 +12296 +12321 +12330 +12344 +12347 +42726 +42736 +65856 +65909 +66369 +66370 +66378 +66379 +66513 +66518 +74752 +74863 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1254 +65 +91 +192 +215 +216 +223 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +444 +445 +452 +453 +455 +456 +458 +459 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +498 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +880 +881 +882 +883 +886 +887 +895 +896 +902 +903 +904 +907 +908 +909 +910 +912 +913 +930 +931 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1015 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1329 +1367 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7960 +7966 +7976 +7984 +7992 +8000 +8008 +8014 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8040 +8048 +8120 +8124 +8136 +8140 +8152 +8156 +8168 +8173 +8184 +8188 +8450 +8451 +8455 +8456 +8459 +8462 +8464 +8467 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8496 +8500 +8510 +8512 +8517 +8518 +8579 +8580 +11264 +11311 +11360 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11499 +11500 +11501 +11502 +11506 +11507 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42891 +42892 +42893 +42894 +42896 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42927 +42928 +42933 +42934 +42935 +65313 +65339 +66560 +66600 +66736 +66772 +68736 +68787 +71840 +71872 +119808 +119834 +119860 +119886 +119912 +119938 +119964 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119990 +120016 +120042 +120068 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120120 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120172 +120198 +120224 +120250 +120276 +120302 +120328 +120354 +120380 +120406 +120432 +120458 +120488 +120513 +120546 +120571 +120604 +120629 +120662 +120687 +120720 +120745 +120778 +120779 +125184 +125218 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V434 +36 +37 +43 +44 +60 +63 +94 +95 +96 +97 +124 +125 +126 +127 +162 +167 +168 +170 +172 +173 +174 +178 +180 +181 +184 +185 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +900 +902 +1014 +1015 +1154 +1155 +1421 +1424 +1542 +1545 +1547 +1548 +1550 +1552 +1758 +1759 +1769 +1770 +1789 +1791 +2038 +2039 +2546 +2548 +2554 +2556 +2801 +2802 +2928 +2929 +3059 +3067 +3199 +3200 +3407 +3408 +3449 +3450 +3647 +3648 +3841 +3844 +3859 +3860 +3861 +3864 +3866 +3872 +3892 +3893 +3894 +3895 +3896 +3897 +4030 +4038 +4039 +4045 +4046 +4048 +4053 +4057 +4254 +4256 +5008 +5018 +6107 +6108 +6464 +6465 +6622 +6656 +7009 +7019 +7028 +7037 +8125 +8126 +8127 +8130 +8141 +8144 +8157 +8160 +8173 +8176 +8189 +8191 +8260 +8261 +8274 +8275 +8314 +8317 +8330 +8333 +8352 +8384 +8448 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8528 +8586 +8588 +8592 +8968 +8972 +9001 +9003 +9255 +9280 +9291 +9372 +9450 +9472 +10088 +10132 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11493 +11499 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12292 +12293 +12306 +12308 +12320 +12321 +12342 +12344 +12350 +12352 +12443 +12445 +12688 +12690 +12694 +12704 +12736 +12772 +12800 +12831 +12842 +12872 +12880 +12881 +12896 +12928 +12938 +12977 +12992 +13055 +13056 +13312 +19904 +19968 +42128 +42183 +42752 +42775 +42784 +42786 +42889 +42891 +43048 +43052 +43062 +43066 +43639 +43642 +43867 +43868 +64297 +64298 +64434 +64450 +65020 +65022 +65122 +65123 +65124 +65127 +65129 +65130 +65284 +65285 +65291 +65292 +65308 +65311 +65342 +65343 +65344 +65345 +65372 +65373 +65374 +65375 +65504 +65511 +65512 +65519 +65532 +65534 +65847 +65856 +65913 +65930 +65932 +65935 +65936 +65948 +65952 +65953 +66000 +66045 +67703 +67705 +68296 +68297 +71487 +71488 +92988 +92992 +92997 +92998 +113820 +113821 +118784 +119030 +119040 +119079 +119081 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119273 +119296 +119362 +119365 +119366 +119552 +119639 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121479 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V150 +40 +41 +91 +92 +123 +124 +3898 +3899 +3900 +3901 +5787 +5788 +8218 +8219 +8222 +8223 +8261 +8262 +8317 +8318 +8333 +8334 +8968 +8969 +8970 +8971 +9001 +9002 +10088 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10181 +10182 +10214 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10627 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10712 +10713 +10714 +10715 +10748 +10749 +11810 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11842 +11843 +12296 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12308 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12317 +12318 +64831 +64832 +65047 +65048 +65077 +65078 +65079 +65080 +65081 +65082 +65083 +65084 +65085 +65086 +65087 +65088 +65089 +65090 +65091 +65092 +65095 +65096 +65113 +65114 +65115 +65116 +65117 +65118 +65288 +65289 +65339 +65340 +65371 +65372 +65375 +65376 +65378 +65379 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V526 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2404 +2433 +2436 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2530 +2532 +2561 +2564 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2692 +2748 +2749 +2750 +2758 +2759 +2762 +2763 +2766 +2786 +2788 +2810 +2816 +2817 +2820 +2876 +2877 +2878 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3072 +3076 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3204 +3260 +3261 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3298 +3300 +3328 +3332 +3387 +3389 +3390 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3426 +3428 +3458 +3460 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3953 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4139 +4159 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4240 +4250 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6444 +6448 +6460 +6679 +6684 +6741 +6751 +6752 +6781 +6783 +6784 +6832 +6847 +6912 +6917 +6964 +6981 +7019 +7028 +7040 +7043 +7073 +7086 +7142 +7156 +7204 +7224 +7376 +7379 +7380 +7401 +7405 +7406 +7410 +7413 +7415 +7418 +7616 +7674 +7675 +7680 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43048 +43136 +43138 +43188 +43206 +43232 +43250 +43302 +43310 +43335 +43348 +43392 +43396 +43443 +43457 +43493 +43494 +43561 +43575 +43587 +43588 +43596 +43598 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43755 +43760 +43765 +43767 +44003 +44011 +44012 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69632 +69635 +69688 +69703 +69759 +69763 +69808 +69819 +69888 +69891 +69927 +69941 +70003 +70004 +70016 +70019 +70067 +70081 +70090 +70093 +70188 +70200 +70206 +70207 +70367 +70379 +70400 +70404 +70460 +70461 +70462 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70502 +70509 +70512 +70517 +70709 +70727 +70832 +70852 +71087 +71094 +71096 +71105 +71132 +71134 +71216 +71233 +71339 +71352 +71453 +71468 +72193 +72203 +72243 +72250 +72251 +72255 +72263 +72264 +72273 +72284 +72330 +72346 +72751 +72759 +72760 +72768 +72850 +72872 +72873 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94033 +94079 +94095 +94099 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V128 +43 +44 +60 +63 +124 +125 +126 +127 +172 +173 +177 +178 +215 +216 +247 +248 +1014 +1015 +1542 +1545 +8260 +8261 +8274 +8275 +8314 +8317 +8330 +8333 +8472 +8473 +8512 +8517 +8523 +8524 +8592 +8597 +8602 +8604 +8608 +8609 +8611 +8612 +8614 +8615 +8622 +8623 +8654 +8656 +8658 +8659 +8660 +8661 +8692 +8960 +8992 +8994 +9084 +9085 +9115 +9140 +9180 +9186 +9655 +9656 +9665 +9666 +9720 +9728 +9839 +9840 +10176 +10181 +10183 +10214 +10224 +10240 +10496 +10627 +10649 +10712 +10716 +10748 +10750 +11008 +11056 +11077 +11079 +11085 +64297 +64298 +65122 +65123 +65124 +65127 +65291 +65292 +65308 +65311 +65372 +65373 +65374 +65375 +65506 +65507 +65513 +65517 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +126704 +126706 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V338 +33 +36 +37 +40 +42 +43 +44 +45 +46 +48 +58 +60 +63 +65 +92 +93 +161 +162 +167 +168 +182 +184 +191 +192 +894 +895 +903 +904 +1370 +1376 +1417 +1418 +1472 +1473 +1475 +1476 +1478 +1479 +1523 +1525 +1545 +1547 +1548 +1550 +1563 +1564 +1566 +1568 +1642 +1646 +1748 +1749 +1792 +1806 +2039 +2042 +2096 +2111 +2142 +2143 +2404 +2406 +2416 +2417 +2557 +2558 +2800 +2801 +3572 +3573 +3663 +3664 +3674 +3676 +3844 +3859 +3860 +3861 +3973 +3974 +4048 +4053 +4057 +4059 +4170 +4176 +4347 +4348 +4960 +4969 +5741 +5743 +5867 +5870 +5941 +5943 +6100 +6103 +6104 +6107 +6144 +6150 +6151 +6155 +6468 +6470 +6686 +6688 +6816 +6823 +6824 +6830 +7002 +7009 +7164 +7168 +7227 +7232 +7294 +7296 +7360 +7368 +7379 +7380 +8214 +8216 +8224 +8232 +8240 +8249 +8251 +8255 +8257 +8260 +8263 +8274 +8275 +8276 +8277 +8287 +11513 +11517 +11518 +11520 +11632 +11633 +11776 +11778 +11782 +11785 +11787 +11788 +11790 +11799 +11800 +11802 +11803 +11804 +11806 +11808 +11818 +11823 +11824 +11834 +11836 +11840 +11841 +11842 +11843 +11850 +12289 +12292 +12349 +12350 +12539 +12540 +42238 +42240 +42509 +42512 +42611 +42612 +42622 +42623 +42738 +42744 +43124 +43128 +43214 +43216 +43256 +43259 +43260 +43261 +43310 +43312 +43359 +43360 +43457 +43470 +43486 +43488 +43612 +43616 +43742 +43744 +43760 +43762 +44011 +44012 +65040 +65047 +65049 +65050 +65072 +65073 +65093 +65095 +65097 +65101 +65104 +65107 +65108 +65112 +65119 +65122 +65128 +65129 +65130 +65132 +65281 +65284 +65285 +65288 +65290 +65291 +65292 +65293 +65294 +65296 +65306 +65308 +65311 +65313 +65340 +65341 +65377 +65378 +65380 +65382 +65792 +65795 +66463 +66464 +66512 +66513 +66927 +66928 +67671 +67672 +67871 +67872 +67903 +67904 +68176 +68185 +68223 +68224 +68336 +68343 +68409 +68416 +68505 +68509 +69703 +69710 +69819 +69821 +69822 +69826 +69952 +69956 +70004 +70006 +70085 +70090 +70093 +70094 +70107 +70108 +70109 +70112 +70200 +70206 +70313 +70314 +70731 +70736 +70747 +70748 +70749 +70750 +70854 +70855 +71105 +71128 +71233 +71236 +71264 +71277 +71484 +71487 +72255 +72263 +72346 +72349 +72350 +72355 +72769 +72774 +72816 +72818 +74864 +74869 +92782 +92784 +92917 +92918 +92983 +92988 +92996 +92997 +113823 +113824 +121479 +121484 +125278 +125280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V232 +48 +58 +178 +180 +185 +186 +188 +191 +1632 +1642 +1776 +1786 +1984 +1994 +2406 +2416 +2534 +2544 +2548 +2554 +2662 +2672 +2790 +2800 +2918 +2928 +2930 +2936 +3046 +3059 +3174 +3184 +3192 +3199 +3302 +3312 +3416 +3423 +3430 +3449 +3558 +3568 +3664 +3674 +3792 +3802 +3872 +3892 +4160 +4170 +4240 +4250 +4969 +4989 +5870 +5873 +6112 +6122 +6128 +6138 +6160 +6170 +6470 +6480 +6608 +6619 +6784 +6794 +6800 +6810 +6992 +7002 +7088 +7098 +7232 +7242 +7248 +7258 +8304 +8305 +8308 +8314 +8320 +8330 +8528 +8579 +8581 +8586 +9312 +9372 +9450 +9472 +10102 +10132 +11517 +11518 +12295 +12296 +12321 +12330 +12344 +12347 +12690 +12694 +12832 +12842 +12872 +12880 +12881 +12896 +12928 +12938 +12977 +12992 +42528 +42538 +42726 +42736 +43056 +43062 +43216 +43226 +43264 +43274 +43472 +43482 +43504 +43514 +43600 +43610 +44016 +44026 +65296 +65306 +65799 +65844 +65856 +65913 +65930 +65932 +66273 +66300 +66336 +66340 +66369 +66370 +66378 +66379 +66513 +66518 +66720 +66730 +67672 +67680 +67705 +67712 +67751 +67760 +67835 +67840 +67862 +67868 +68028 +68030 +68032 +68048 +68050 +68096 +68160 +68168 +68221 +68223 +68253 +68256 +68331 +68336 +68440 +68448 +68472 +68480 +68521 +68528 +68858 +68864 +69216 +69247 +69714 +69744 +69872 +69882 +69942 +69952 +70096 +70106 +70113 +70133 +70384 +70394 +70736 +70746 +70864 +70874 +71248 +71258 +71360 +71370 +71472 +71484 +71904 +71923 +72784 +72813 +73040 +73050 +74752 +74863 +92768 +92778 +93008 +93018 +93019 +93026 +119648 +119666 +120782 +120832 +125127 +125136 +125264 +125274 +127232 +127245 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V114 +688 +706 +710 +722 +736 +741 +748 +749 +750 +751 +884 +885 +890 +891 +1369 +1370 +1600 +1601 +1765 +1767 +2036 +2038 +2042 +2043 +2074 +2075 +2084 +2085 +2088 +2089 +2417 +2418 +3654 +3655 +3782 +3783 +4348 +4349 +6103 +6104 +6211 +6212 +6823 +6824 +7288 +7294 +7468 +7531 +7544 +7545 +7579 +7616 +8305 +8306 +8319 +8320 +8336 +8349 +11388 +11390 +11631 +11632 +11823 +11824 +12293 +12294 +12337 +12342 +12347 +12348 +12445 +12447 +12540 +12543 +40981 +40982 +42232 +42238 +42508 +42509 +42623 +42624 +42652 +42654 +42775 +42784 +42864 +42865 +42888 +42889 +43000 +43002 +43471 +43472 +43494 +43495 +43632 +43633 +43741 +43742 +43763 +43765 +43868 +43872 +65392 +65393 +65438 +65440 +92992 +92996 +94099 +94112 +94176 +94178 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +36 +37 +162 +166 +1423 +1424 +1547 +1548 +2546 +2548 +2555 +2556 +2801 +2802 +3065 +3066 +3647 +3648 +6107 +6108 +8352 +8384 +43064 +43065 +65020 +65021 +65129 +65130 +65284 +65285 +65504 +65506 +65509 +65511 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1170 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +880 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1488 +1515 +1520 +1523 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3636 +3648 +3655 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3764 +3773 +3774 +3776 +3781 +3782 +3783 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5873 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6823 +6824 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8579 +8581 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11823 +11824 +12293 +12295 +12337 +12342 +12347 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42623 +42654 +42656 +42726 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65313 +65339 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66369 +66370 +66378 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71840 +71904 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +124928 +125125 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +187 +188 +8217 +8218 +8221 +8222 +8250 +8251 +11779 +11780 +11781 +11782 +11786 +11787 +11789 +11790 +11805 +11806 +11809 +11810 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V252 +65 +91 +97 +123 +181 +182 +192 +215 +216 +247 +248 +443 +444 +448 +452 +660 +661 +688 +880 +884 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1377 +1416 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +5112 +5118 +7296 +7305 +7424 +7468 +7531 +7544 +7545 +7579 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8501 +8505 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8579 +8581 +11264 +11311 +11312 +11359 +11360 +11388 +11390 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42560 +42606 +42624 +42652 +42786 +42864 +42865 +42888 +42891 +42895 +42896 +42927 +42928 +42936 +43002 +43003 +43824 +43867 +43872 +43878 +43888 +43968 +64256 +64263 +64275 +64280 +65313 +65339 +65345 +65371 +66560 +66640 +66736 +66772 +66776 +66812 +68736 +68787 +68800 +68851 +71840 +71904 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +125184 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V918 +170 +171 +186 +187 +443 +444 +448 +452 +660 +661 +1488 +1515 +1520 +1523 +1568 +1600 +1601 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2048 +2070 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2418 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3636 +3648 +3654 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3764 +3773 +3774 +3776 +3781 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4304 +4347 +4349 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5873 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6108 +6109 +6176 +6211 +6212 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7288 +7401 +7405 +7406 +7410 +7413 +7415 +8501 +8505 +11568 +11624 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +12294 +12295 +12348 +12349 +12353 +12439 +12447 +12448 +12449 +12539 +12543 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +40981 +40982 +42125 +42192 +42232 +42240 +42508 +42512 +42528 +42538 +42540 +42606 +42607 +42656 +42726 +42895 +42896 +42999 +43000 +43003 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43488 +43493 +43495 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43632 +43633 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43741 +43744 +43755 +43762 +43763 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43968 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65382 +65392 +65393 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66369 +66370 +66378 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66640 +66718 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +124928 +125125 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +1160 +1162 +6846 +6847 +8413 +8417 +8418 +8421 +42608 +42611 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V602 +768 +880 +1155 +1160 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2810 +2816 +2817 +2818 +2876 +2877 +2879 +2880 +2881 +2885 +2893 +2894 +2902 +2903 +2914 +2916 +2946 +2947 +3008 +3009 +3021 +3022 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3202 +3260 +3261 +3263 +3264 +3270 +3271 +3276 +3278 +3298 +3300 +3328 +3330 +3387 +3389 +3393 +3397 +3405 +3406 +3426 +3428 +3530 +3531 +3538 +3541 +3542 +3543 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6832 +6846 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8400 +8413 +8417 +8418 +8421 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12334 +12441 +12443 +42607 +42608 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43493 +43494 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43756 +43758 +43766 +43767 +44005 +44006 +44008 +44009 +44013 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69633 +69634 +69688 +69703 +69759 +69762 +69811 +69815 +69817 +69819 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70464 +70465 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +70852 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72767 +72768 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94095 +94099 +113821 +113823 +119143 +119146 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1266 +97 +123 +181 +182 +223 +247 +248 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +443 +445 +448 +454 +455 +457 +458 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +660 +661 +688 +881 +882 +883 +884 +887 +888 +891 +894 +912 +913 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1014 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1377 +1416 +5112 +5118 +7296 +7305 +7424 +7468 +7531 +7544 +7545 +7579 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7958 +7968 +7976 +7984 +7992 +8000 +8006 +8016 +8024 +8032 +8040 +8048 +8062 +8064 +8072 +8080 +8088 +8096 +8104 +8112 +8117 +8118 +8120 +8126 +8127 +8130 +8133 +8134 +8136 +8144 +8148 +8150 +8152 +8160 +8168 +8178 +8181 +8182 +8184 +8458 +8459 +8462 +8464 +8467 +8468 +8495 +8496 +8500 +8501 +8505 +8506 +8508 +8510 +8518 +8522 +8526 +8527 +8580 +8581 +11312 +11359 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11388 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11493 +11500 +11501 +11502 +11503 +11507 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42606 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42652 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42864 +42865 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42888 +42892 +42893 +42894 +42895 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42933 +42934 +42935 +42936 +43002 +43003 +43824 +43867 +43872 +43878 +43888 +43968 +64256 +64263 +64275 +64280 +65345 +65371 +66600 +66640 +66776 +66812 +68800 +68851 +71872 +71904 +119834 +119860 +119886 +119893 +119894 +119912 +119938 +119964 +119990 +119994 +119995 +119996 +119997 +120004 +120005 +120016 +120042 +120068 +120094 +120120 +120146 +120172 +120198 +120224 +120250 +120276 +120302 +120328 +120354 +120380 +120406 +120432 +120458 +120486 +120514 +120539 +120540 +120546 +120572 +120597 +120598 +120604 +120630 +120655 +120656 +120662 +120688 +120713 +120714 +120720 +120746 +120771 +120772 +120778 +120779 +120780 +125218 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V344 +33 +36 +37 +43 +44 +48 +58 +60 +63 +65 +91 +94 +95 +96 +123 +124 +125 +126 +161 +162 +167 +168 +171 +172 +182 +184 +187 +188 +191 +192 +894 +895 +903 +904 +1370 +1376 +1417 +1419 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1523 +1525 +1545 +1547 +1548 +1550 +1563 +1564 +1566 +1568 +1642 +1646 +1748 +1749 +1792 +1806 +2039 +2042 +2096 +2111 +2142 +2143 +2404 +2406 +2416 +2417 +2557 +2558 +2800 +2801 +3572 +3573 +3663 +3664 +3674 +3676 +3844 +3859 +3860 +3861 +3898 +3902 +3973 +3974 +4048 +4053 +4057 +4059 +4170 +4176 +4347 +4348 +4960 +4969 +5120 +5121 +5741 +5743 +5787 +5789 +5867 +5870 +5941 +5943 +6100 +6103 +6104 +6107 +6144 +6155 +6468 +6470 +6686 +6688 +6816 +6823 +6824 +6830 +7002 +7009 +7164 +7168 +7227 +7232 +7294 +7296 +7360 +7368 +7379 +7380 +8208 +8232 +8240 +8260 +8261 +8274 +8275 +8287 +8317 +8319 +8333 +8335 +8968 +8972 +9001 +9003 +10088 +10102 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11513 +11517 +11518 +11520 +11632 +11633 +11776 +11823 +11824 +11850 +12289 +12292 +12296 +12306 +12308 +12320 +12336 +12337 +12349 +12350 +12448 +12449 +12539 +12540 +42238 +42240 +42509 +42512 +42611 +42612 +42622 +42623 +42738 +42744 +43124 +43128 +43214 +43216 +43256 +43259 +43260 +43261 +43310 +43312 +43359 +43360 +43457 +43470 +43486 +43488 +43612 +43616 +43742 +43744 +43760 +43762 +44011 +44012 +64830 +64832 +65040 +65050 +65072 +65107 +65108 +65122 +65123 +65124 +65128 +65129 +65130 +65132 +65281 +65284 +65285 +65291 +65292 +65296 +65306 +65308 +65311 +65313 +65339 +65342 +65343 +65344 +65371 +65372 +65373 +65374 +65375 +65382 +65792 +65795 +66463 +66464 +66512 +66513 +66927 +66928 +67671 +67672 +67871 +67872 +67903 +67904 +68176 +68185 +68223 +68224 +68336 +68343 +68409 +68416 +68505 +68509 +69703 +69710 +69819 +69821 +69822 +69826 +69952 +69956 +70004 +70006 +70085 +70090 +70093 +70094 +70107 +70108 +70109 +70112 +70200 +70206 +70313 +70314 +70731 +70736 +70747 +70748 +70749 +70750 +70854 +70855 +71105 +71128 +71233 +71236 +71264 +71277 +71484 +71487 +72255 +72263 +72346 +72349 +72350 +72355 +72769 +72774 +72816 +72818 +74864 +74869 +92782 +92784 +92917 +92918 +92983 +92988 +92996 +92997 +113823 +113824 +121479 +121484 +125278 +125280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V120 +178 +180 +185 +186 +188 +191 +2548 +2554 +2930 +2936 +3056 +3059 +3192 +3199 +3416 +3423 +3440 +3449 +3882 +3892 +4969 +4989 +6128 +6138 +6618 +6619 +8304 +8305 +8308 +8314 +8320 +8330 +8528 +8544 +8585 +8586 +9312 +9372 +9450 +9472 +10102 +10132 +11517 +11518 +12690 +12694 +12832 +12842 +12872 +12880 +12881 +12896 +12928 +12938 +12977 +12992 +43056 +43062 +65799 +65844 +65909 +65913 +65930 +65932 +66273 +66300 +66336 +66340 +67672 +67680 +67705 +67712 +67751 +67760 +67835 +67840 +67862 +67868 +68028 +68030 +68032 +68048 +68050 +68096 +68160 +68168 +68221 +68223 +68253 +68256 +68331 +68336 +68440 +68448 +68472 +68480 +68521 +68528 +68858 +68864 +69216 +69247 +69714 +69734 +70113 +70133 +71482 +71484 +71914 +71923 +72794 +72813 +93019 +93026 +119648 +119666 +125127 +125136 +127232 +127245 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1305 +0 +32 +127 +160 +173 +174 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1542 +1564 +1566 +1757 +1758 +1806 +1808 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6158 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8203 +8208 +8234 +8239 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65532 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69821 +69822 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113824 +118784 +119030 +119040 +119079 +119081 +119155 +119163 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V144 +41 +42 +93 +94 +125 +126 +3899 +3900 +3901 +3902 +5788 +5789 +8262 +8263 +8318 +8319 +8334 +8335 +8969 +8970 +8971 +8972 +9002 +9003 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10102 +10182 +10183 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10224 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10649 +10713 +10714 +10715 +10716 +10749 +10750 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11818 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12306 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12316 +12318 +12320 +64830 +64831 +65048 +65049 +65078 +65079 +65080 +65081 +65082 +65083 +65084 +65085 +65086 +65087 +65088 +65089 +65090 +65091 +65092 +65093 +65096 +65097 +65114 +65115 +65116 +65117 +65118 +65119 +65289 +65290 +65341 +65342 +65373 +65374 +65376 +65377 +65379 +65380 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +32 +33 +160 +161 +5760 +5761 +8192 +8203 +8232 +8234 +8239 +8240 +8287 +8288 +12288 +12289 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +171 +172 +8216 +8217 +8219 +8221 +8223 +8224 +8249 +8250 +11778 +11779 +11780 +11781 +11785 +11786 +11788 +11789 +11804 +11805 +11808 +11809 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +45 +46 +1418 +1419 +1470 +1471 +5120 +5121 +6150 +6151 +8208 +8214 +11799 +11800 +11802 +11803 +11834 +11836 +11840 +11841 +12316 +12317 +12336 +12337 +12448 +12449 +65073 +65075 +65112 +65113 +65123 +65124 +65293 +65294 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +95 +96 +8255 +8257 +8276 +8277 +65075 +65077 +65101 +65104 +65343 +65344 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V346 +166 +167 +169 +170 +174 +175 +176 +177 +1154 +1155 +1421 +1423 +1550 +1552 +1758 +1759 +1769 +1770 +1789 +1791 +2038 +2039 +2554 +2555 +2928 +2929 +3059 +3065 +3066 +3067 +3199 +3200 +3407 +3408 +3449 +3450 +3841 +3844 +3859 +3860 +3861 +3864 +3866 +3872 +3892 +3893 +3894 +3895 +3896 +3897 +4030 +4038 +4039 +4045 +4046 +4048 +4053 +4057 +4254 +4256 +5008 +5018 +6464 +6465 +6622 +6656 +7009 +7019 +7028 +7037 +8448 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8522 +8523 +8524 +8526 +8527 +8528 +8586 +8588 +8597 +8602 +8604 +8608 +8609 +8611 +8612 +8614 +8615 +8622 +8623 +8654 +8656 +8658 +8659 +8660 +8661 +8692 +8960 +8968 +8972 +8992 +8994 +9001 +9003 +9084 +9085 +9115 +9140 +9180 +9186 +9255 +9280 +9291 +9372 +9450 +9472 +9655 +9656 +9665 +9666 +9720 +9728 +9839 +9840 +10088 +10132 +10176 +10240 +10496 +11008 +11056 +11077 +11079 +11085 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11493 +11499 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12292 +12293 +12306 +12308 +12320 +12321 +12342 +12344 +12350 +12352 +12688 +12690 +12694 +12704 +12736 +12772 +12800 +12831 +12842 +12872 +12880 +12881 +12896 +12928 +12938 +12977 +12992 +13055 +13056 +13312 +19904 +19968 +42128 +42183 +43048 +43052 +43062 +43064 +43065 +43066 +43639 +43642 +65021 +65022 +65508 +65509 +65512 +65513 +65517 +65519 +65532 +65534 +65847 +65856 +65913 +65930 +65932 +65935 +65936 +65948 +65952 +65953 +66000 +66045 +67703 +67705 +68296 +68297 +71487 +71488 +92988 +92992 +92997 +92998 +113820 +113821 +118784 +119030 +119040 +119079 +119081 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119273 +119296 +119362 +119365 +119366 +119552 +119639 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121479 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +127995 +128000 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V320 +2307 +2308 +2363 +2364 +2366 +2369 +2377 +2381 +2382 +2384 +2434 +2436 +2494 +2497 +2503 +2505 +2507 +2509 +2519 +2520 +2563 +2564 +2622 +2625 +2691 +2692 +2750 +2753 +2761 +2762 +2763 +2765 +2818 +2820 +2878 +2879 +2880 +2881 +2887 +2889 +2891 +2893 +2903 +2904 +3006 +3008 +3009 +3011 +3014 +3017 +3018 +3021 +3031 +3032 +3073 +3076 +3137 +3141 +3202 +3204 +3262 +3263 +3264 +3269 +3271 +3273 +3274 +3276 +3285 +3287 +3330 +3332 +3390 +3393 +3398 +3401 +3402 +3405 +3415 +3416 +3458 +3460 +3535 +3538 +3544 +3552 +3570 +3572 +3902 +3904 +3967 +3968 +4139 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4182 +4184 +4194 +4197 +4199 +4206 +4227 +4229 +4231 +4237 +4239 +4240 +4250 +4253 +6070 +6071 +6078 +6086 +6087 +6089 +6435 +6439 +6441 +6444 +6448 +6450 +6451 +6457 +6681 +6683 +6741 +6742 +6743 +6744 +6753 +6754 +6755 +6757 +6765 +6771 +6916 +6917 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +6981 +7042 +7043 +7073 +7074 +7078 +7080 +7082 +7083 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7156 +7204 +7212 +7220 +7222 +7393 +7394 +7410 +7412 +7415 +7416 +12334 +12336 +43043 +43045 +43047 +43048 +43136 +43138 +43188 +43204 +43346 +43348 +43395 +43396 +43444 +43446 +43450 +43452 +43453 +43457 +43567 +43569 +43571 +43573 +43597 +43598 +43643 +43644 +43645 +43646 +43755 +43756 +43758 +43760 +43765 +43766 +44003 +44005 +44006 +44008 +44009 +44011 +44012 +44013 +69632 +69633 +69634 +69635 +69762 +69763 +69808 +69811 +69815 +69817 +69932 +69933 +70018 +70019 +70067 +70070 +70079 +70081 +70188 +70191 +70194 +70196 +70197 +70198 +70368 +70371 +70402 +70404 +70462 +70464 +70465 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70709 +70712 +70720 +70722 +70725 +70726 +70832 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +71087 +71090 +71096 +71100 +71102 +71103 +71216 +71219 +71227 +71229 +71230 +71231 +71340 +71341 +71342 +71344 +71350 +71351 +71456 +71458 +71462 +71463 +72199 +72201 +72249 +72250 +72279 +72281 +72343 +72344 +72751 +72752 +72766 +72767 +72873 +72874 +72881 +72882 +72884 +72885 +94033 +94079 +119141 +119143 +119149 +119155 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V110 +48 +58 +1632 +1642 +1776 +1786 +1984 +1994 +2406 +2416 +2534 +2544 +2662 +2672 +2790 +2800 +2918 +2928 +3046 +3056 +3174 +3184 +3302 +3312 +3430 +3440 +3558 +3568 +3664 +3674 +3792 +3802 +3872 +3882 +4160 +4170 +4240 +4250 +6112 +6122 +6160 +6170 +6470 +6480 +6608 +6618 +6784 +6794 +6800 +6810 +6992 +7002 +7088 +7098 +7232 +7242 +7248 +7258 +42528 +42538 +43216 +43226 +43264 +43274 +43472 +43482 +43504 +43514 +43600 +43610 +44016 +44026 +65296 +65306 +66720 +66730 +69734 +69744 +69872 +69882 +69942 +69952 +70096 +70106 +70384 +70394 +70736 +70746 +70864 +70874 +71248 +71258 +71360 +71370 +71472 +71482 +71904 +71914 +72784 +72794 +73040 +73050 +92768 +92778 +93008 +93018 +120782 +120832 +125264 +125274 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1188 +65 +91 +95 +96 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +880 +885 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1488 +1515 +1520 +1523 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3635 +3648 +3655 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3763 +3773 +3774 +3776 +3781 +3782 +3783 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6823 +6824 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +12293 +12296 +12321 +12330 +12337 +12342 +12344 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42623 +42654 +42656 +42736 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64606 +64612 +64830 +64848 +64912 +64914 +64968 +65008 +65018 +65137 +65138 +65139 +65140 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65277 +65313 +65339 +65345 +65371 +65382 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71840 +71904 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +124928 +125125 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1182 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +880 +885 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1488 +1515 +1520 +1523 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3635 +3648 +3655 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3763 +3773 +3774 +3776 +3781 +3782 +3783 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5873 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6823 +6824 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8579 +8581 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +12293 +12295 +12337 +12342 +12347 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42623 +42654 +42656 +42726 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64606 +64612 +64830 +64848 +64912 +64914 +64968 +65008 +65018 +65137 +65138 +65139 +65140 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65277 +65313 +65339 +65345 +65371 +65382 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66369 +66370 +66378 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71840 +71904 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +124928 +125125 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V252 +65 +91 +97 +123 +181 +182 +192 +215 +216 +247 +248 +305 +306 +312 +313 +397 +398 +411 +412 +426 +428 +442 +444 +446 +447 +448 +452 +545 +546 +564 +570 +597 +598 +600 +601 +602 +603 +605 +608 +610 +611 +612 +613 +615 +616 +621 +623 +624 +625 +627 +629 +630 +637 +638 +640 +641 +643 +644 +647 +653 +658 +659 +669 +671 +700 +701 +702 +703 +768 +770 +775 +777 +778 +779 +780 +781 +787 +788 +817 +818 +834 +835 +837 +838 +880 +884 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +978 +981 +1014 +1015 +1020 +1021 +1154 +1162 +1328 +1329 +1367 +1377 +1416 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +5112 +5118 +7296 +7305 +7545 +7546 +7549 +7550 +7680 +7836 +7838 +7839 +7840 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8486 +8487 +8490 +8492 +8498 +8499 +8526 +8527 +8544 +8576 +8579 +8581 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11377 +11378 +11380 +11381 +11383 +11390 +11492 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42560 +42606 +42624 +42652 +42786 +42800 +42802 +42864 +42873 +42888 +42891 +42894 +42896 +42900 +42902 +42927 +42928 +42936 +43859 +43860 +43888 +43968 +64256 +64263 +64275 +64280 +65313 +65339 +65345 +65371 +66560 +66640 +66736 +66772 +66776 +66812 +68736 +68787 +68800 +68851 +71840 +71904 +125184 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1308 +33 +127 +161 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5760 +5761 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8203 +8232 +8234 +8239 +8240 +8287 +8288 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12289 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +57344 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917505 +917506 +917536 +917632 +917760 +918000 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1386 +48 +58 +65 +91 +95 +96 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1642 +1646 +1748 +1749 +1757 +1759 +1769 +1770 +1789 +1791 +1792 +1808 +1867 +1869 +1970 +1984 +2038 +2042 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4096 +4170 +4176 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6100 +6103 +6104 +6108 +6110 +6112 +6122 +6155 +6158 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6618 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6823 +6824 +6832 +6847 +6912 +6988 +6992 +7002 +7019 +7028 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7294 +7296 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8204 +8206 +8255 +8257 +8276 +8277 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +11823 +11824 +12293 +12296 +12321 +12336 +12337 +12342 +12344 +12349 +12353 +12439 +12441 +12443 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42611 +42612 +42622 +42623 +42738 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43312 +43348 +43360 +43389 +43392 +43457 +43471 +43482 +43488 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43639 +43642 +43715 +43739 +43742 +43744 +43760 +43762 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44012 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65024 +65040 +65056 +65072 +65075 +65077 +65101 +65104 +65136 +65141 +65142 +65277 +65296 +65306 +65313 +65339 +65343 +65344 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69703 +69734 +69744 +69759 +69819 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69968 +70004 +70006 +70007 +70016 +70085 +70090 +70093 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70731 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72255 +72263 +72264 +72272 +72324 +72326 +72346 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92912 +92917 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127280 +127306 +127312 +127338 +127344 +127370 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V24 +0 +256 +304 +305 +329 +330 +376 +377 +383 +384 +496 +497 +924 +925 +956 +957 +7830 +7835 +7838 +7839 +8490 +8492 +64256 +64263 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1392 +48 +58 +65 +91 +95 +96 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1160 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1642 +1646 +1748 +1749 +1757 +1759 +1769 +1770 +1789 +1791 +1792 +1808 +1867 +1869 +1970 +1984 +2038 +2042 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4096 +4170 +4176 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6100 +6103 +6104 +6108 +6110 +6112 +6122 +6155 +6158 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6618 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6823 +6824 +6832 +6846 +6912 +6988 +6992 +7002 +7019 +7028 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7294 +7296 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8255 +8257 +8276 +8277 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8413 +8417 +8418 +8421 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +12293 +12296 +12321 +12336 +12337 +12342 +12344 +12349 +12353 +12439 +12441 +12443 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42608 +42612 +42622 +42623 +42738 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43312 +43348 +43360 +43389 +43392 +43457 +43471 +43482 +43488 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43639 +43642 +43715 +43739 +43742 +43744 +43760 +43762 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44012 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64606 +64612 +64830 +64848 +64912 +64914 +64968 +65008 +65018 +65024 +65040 +65056 +65072 +65075 +65077 +65101 +65104 +65137 +65138 +65139 +65140 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65277 +65296 +65306 +65313 +65339 +65343 +65344 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69703 +69734 +69744 +69759 +69819 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69968 +70004 +70006 +70007 +70016 +70085 +70090 +70093 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70731 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72255 +72263 +72264 +72272 +72324 +72326 +72346 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92912 +92917 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V58 +223 +224 +304 +305 +329 +330 +496 +497 +912 +913 +944 +945 +1415 +1416 +7830 +7835 +7838 +7839 +8016 +8017 +8018 +8019 +8020 +8021 +8022 +8023 +8064 +8112 +8114 +8117 +8118 +8120 +8124 +8125 +8130 +8133 +8134 +8136 +8140 +8141 +8146 +8148 +8150 +8152 +8162 +8165 +8166 +8168 +8178 +8181 +8182 +8184 +8188 +8189 +64256 +64263 +64275 +64280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +9 +10 +32 +33 +160 +161 +5760 +5761 +8192 +8203 +8239 +8240 +8287 +8288 +12288 +12289 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +453 +454 +456 +457 +459 +460 +498 +499 +8072 +8080 +8088 +8096 +8104 +8112 +8124 +8125 +8140 +8141 +8188 +8189 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +9 +14 +32 +33 +133 +134 +8206 +8208 +8232 +8234 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1298 +0 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917505 +917506 +917536 +917632 +917760 +918000 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1390 +48 +58 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +837 +838 +880 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1456 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1624 +1625 +1642 +1646 +1748 +1749 +1757 +1761 +1769 +1773 +1789 +1791 +1792 +1808 +1856 +1869 +1970 +1984 +2027 +2036 +2038 +2042 +2043 +2048 +2072 +2074 +2093 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2272 +2275 +2282 +2288 +2364 +2365 +2381 +2382 +2385 +2389 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2501 +2503 +2505 +2507 +2509 +2510 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2622 +2627 +2631 +2633 +2635 +2637 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2758 +2759 +2762 +2763 +2765 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2813 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2885 +2887 +2889 +2891 +2893 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3021 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3149 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3269 +3270 +3273 +3274 +3277 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3405 +3406 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3655 +3661 +3662 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3789 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3872 +3882 +3904 +3912 +3913 +3949 +3953 +3970 +3976 +3992 +3993 +4029 +4096 +4151 +4152 +4153 +4155 +4170 +4176 +4195 +4197 +4201 +4206 +4231 +4238 +4239 +4240 +4250 +4252 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4959 +4960 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5908 +5920 +5940 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6068 +6070 +6089 +6103 +6104 +6108 +6109 +6112 +6122 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6457 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6618 +6656 +6684 +6688 +6751 +6753 +6773 +6784 +6794 +6800 +6810 +6823 +6824 +6912 +6964 +6965 +6980 +6981 +6988 +6992 +7002 +7040 +7082 +7084 +7142 +7143 +7154 +7168 +7222 +7232 +7242 +7245 +7294 +7296 +7305 +7401 +7405 +7406 +7412 +7413 +7415 +7424 +7616 +7655 +7669 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +11823 +11824 +12293 +12296 +12321 +12330 +12337 +12342 +12344 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42607 +42612 +42620 +42623 +42736 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43048 +43072 +43124 +43136 +43204 +43205 +43206 +43216 +43226 +43250 +43256 +43259 +43260 +43261 +43262 +43264 +43307 +43312 +43347 +43360 +43389 +43392 +43443 +43444 +43456 +43471 +43482 +43488 +43493 +43494 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43639 +43642 +43643 +43646 +43711 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43760 +43762 +43766 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65296 +65306 +65313 +65339 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69702 +69734 +69744 +69762 +69817 +69840 +69865 +69872 +69882 +69888 +69939 +69942 +69952 +69968 +70003 +70006 +70007 +70016 +70080 +70081 +70085 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70197 +70199 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70377 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70469 +70471 +70473 +70475 +70477 +70480 +70481 +70487 +70488 +70493 +70500 +70656 +70722 +70723 +70726 +70727 +70731 +70736 +70746 +70784 +70850 +70852 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71103 +71128 +71134 +71168 +71231 +71232 +71233 +71236 +71237 +71248 +71258 +71296 +71350 +71360 +71370 +71424 +71450 +71453 +71467 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72243 +72245 +72255 +72272 +72324 +72326 +72344 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72767 +72768 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73026 +73027 +73028 +73030 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113822 +113823 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125184 +125252 +125255 +125256 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127280 +127306 +127312 +127338 +127344 +127370 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1302 +32 +127 +160 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8232 +8234 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +57344 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917505 +917506 +917536 +917632 +917760 +918000 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +9 +14 +32 +33 +133 +134 +160 +161 +5760 +5761 +8192 +8203 +8232 +8234 +8239 +8240 +8287 +8288 +12288 +12289 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V78 +0 +48 +58 +65 +91 +95 +96 +97 +123 +168 +169 +170 +171 +175 +176 +178 +182 +183 +187 +188 +191 +192 +215 +216 +247 +248 +847 +848 +1564 +1565 +4447 +4449 +5760 +5761 +6068 +6070 +6155 +6159 +8192 +8255 +8257 +8276 +8277 +8304 +8592 +9312 +9472 +10102 +10132 +11264 +11776 +11904 +12288 +12292 +12296 +12321 +12336 +12337 +12644 +12645 +64830 +64832 +65024 +65040 +65093 +65095 +65279 +65280 +65440 +65441 +65520 +65529 +113824 +113828 +119155 +119163 +917504 +921600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1398 +32 +33 +40 +42 +45 +46 +48 +58 +65 +91 +95 +96 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +888 +891 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1160 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1642 +1646 +1748 +1749 +1757 +1759 +1769 +1770 +1789 +1791 +1792 +1808 +1867 +1869 +1970 +1984 +2038 +2042 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2404 +2406 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4096 +4170 +4176 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6100 +6103 +6104 +6108 +6110 +6112 +6122 +6155 +6158 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6618 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6823 +6824 +6832 +6846 +6912 +6988 +6992 +7002 +7019 +7028 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7294 +7296 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8255 +8257 +8276 +8277 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8413 +8417 +8418 +8421 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +12293 +12296 +12321 +12336 +12337 +12342 +12344 +12349 +12353 +12439 +12441 +12443 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42540 +42560 +42608 +42612 +42622 +42623 +42738 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43312 +43348 +43360 +43389 +43392 +43457 +43471 +43482 +43488 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43639 +43642 +43715 +43739 +43742 +43744 +43760 +43762 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44012 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64606 +64612 +64830 +64848 +64912 +64914 +64968 +65008 +65018 +65024 +65040 +65056 +65072 +65075 +65077 +65101 +65104 +65137 +65138 +65139 +65140 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65277 +65296 +65306 +65313 +65339 +65343 +65344 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69703 +69734 +69744 +69759 +69819 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69968 +70004 +70006 +70007 +70016 +70085 +70090 +70093 +70096 +70107 +70108 +70109 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70731 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71482 +71840 +71914 +71935 +71936 +72192 +72255 +72263 +72264 +72272 +72324 +72326 +72346 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92880 +92910 +92912 +92917 +92928 +92983 +92992 +92996 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +48 +58 +65 +91 +95 +96 +97 +123 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +0 +256 +304 +305 +329 +330 +376 +377 +383 +384 +496 +497 +700 +701 +924 +925 +956 +957 +7830 +7835 +7838 +7839 +8490 +8492 +64256 +64263 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +33 +48 +58 +65 +91 +97 +123 +127 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V334 +33 +48 +58 +65 +91 +97 +123 +127 +161 +162 +167 +168 +171 +172 +182 +184 +187 +188 +191 +192 +894 +895 +903 +904 +1370 +1376 +1417 +1419 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1523 +1525 +1545 +1547 +1548 +1550 +1563 +1564 +1566 +1568 +1642 +1646 +1748 +1749 +1792 +1806 +2039 +2042 +2096 +2111 +2142 +2143 +2404 +2406 +2416 +2417 +2557 +2558 +2800 +2801 +3572 +3573 +3663 +3664 +3674 +3676 +3844 +3859 +3860 +3861 +3898 +3902 +3973 +3974 +4048 +4053 +4057 +4059 +4170 +4176 +4347 +4348 +4960 +4969 +5120 +5121 +5741 +5743 +5787 +5789 +5867 +5870 +5941 +5943 +6100 +6103 +6104 +6107 +6144 +6155 +6468 +6470 +6686 +6688 +6816 +6823 +6824 +6830 +7002 +7009 +7164 +7168 +7227 +7232 +7294 +7296 +7360 +7368 +7379 +7380 +8208 +8232 +8240 +8260 +8261 +8274 +8275 +8287 +8317 +8319 +8333 +8335 +8968 +8972 +9001 +9003 +10088 +10102 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11513 +11517 +11518 +11520 +11632 +11633 +11776 +11823 +11824 +11850 +12289 +12292 +12296 +12306 +12308 +12320 +12336 +12337 +12349 +12350 +12448 +12449 +12539 +12540 +42238 +42240 +42509 +42512 +42611 +42612 +42622 +42623 +42738 +42744 +43124 +43128 +43214 +43216 +43256 +43259 +43260 +43261 +43310 +43312 +43359 +43360 +43457 +43470 +43486 +43488 +43612 +43616 +43742 +43744 +43760 +43762 +44011 +44012 +64830 +64832 +65040 +65050 +65072 +65107 +65108 +65122 +65123 +65124 +65128 +65129 +65130 +65132 +65281 +65284 +65285 +65291 +65292 +65296 +65306 +65308 +65311 +65313 +65339 +65342 +65343 +65344 +65371 +65372 +65373 +65374 +65375 +65382 +65792 +65795 +66463 +66464 +66512 +66513 +66927 +66928 +67671 +67672 +67871 +67872 +67903 +67904 +68176 +68185 +68223 +68224 +68336 +68343 +68409 +68416 +68505 +68509 +69703 +69710 +69819 +69821 +69822 +69826 +69952 +69956 +70004 +70006 +70085 +70090 +70093 +70094 +70107 +70108 +70109 +70112 +70200 +70206 +70313 +70314 +70731 +70736 +70747 +70748 +70749 +70750 +70854 +70855 +71105 +71128 +71233 +71236 +71264 +71277 +71484 +71487 +72255 +72263 +72346 +72349 +72350 +72355 +72769 +72774 +72816 +72818 +74864 +74869 +92782 +92784 +92917 +92918 +92983 +92988 +92996 +92997 +113823 +113824 +121479 +121484 +125278 +125280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V36 +64976 +65008 +65534 +65536 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +983038 +983040 +1048574 +1048576 +1114110 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1180 +65 +91 +192 +215 +216 +223 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +444 +445 +452 +454 +455 +457 +458 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +880 +881 +882 +883 +886 +887 +895 +896 +902 +903 +904 +907 +908 +909 +910 +912 +913 +930 +931 +940 +975 +976 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1015 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1329 +1367 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7960 +7966 +7976 +7984 +7992 +8000 +8008 +8014 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8040 +8048 +8072 +8080 +8088 +8096 +8104 +8112 +8120 +8125 +8136 +8141 +8152 +8156 +8168 +8173 +8184 +8189 +8486 +8487 +8490 +8492 +8498 +8499 +8544 +8560 +8579 +8580 +9398 +9424 +11264 +11311 +11360 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11499 +11500 +11501 +11502 +11506 +11507 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42891 +42892 +42893 +42894 +42896 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42927 +42928 +42933 +42934 +42935 +65313 +65339 +66560 +66600 +66736 +66772 +68736 +68787 +71840 +71872 +125184 +125218 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V794 +0 +545 +546 +564 +592 +686 +688 +751 +768 +848 +864 +880 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +1015 +1024 +1159 +1160 +1231 +1232 +1270 +1272 +1274 +1280 +1296 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1442 +1443 +1466 +1467 +1477 +1488 +1515 +1520 +1525 +1548 +1549 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1622 +1632 +1774 +1776 +1791 +1792 +1806 +1807 +1837 +1840 +1867 +1920 +1970 +2305 +2308 +2309 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2562 +2563 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2700 +2701 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2785 +2790 +2800 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2870 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2929 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3059 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3947 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4047 +4048 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4256 +4294 +4304 +4345 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4615 +4616 +4679 +4680 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4743 +4744 +4745 +4746 +4750 +4752 +4783 +4784 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4815 +4816 +4823 +4824 +4847 +4848 +4879 +4880 +4881 +4882 +4886 +4888 +4895 +4896 +4935 +4936 +4955 +4961 +4989 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6109 +6112 +6122 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8275 +8279 +8280 +8287 +8292 +8298 +8306 +8308 +8335 +8352 +8370 +8400 +8427 +8448 +8507 +8509 +8524 +8531 +8580 +8592 +9167 +9216 +9255 +9280 +9291 +9312 +9471 +9472 +9748 +9750 +9752 +9753 +9854 +9856 +9866 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10192 +10220 +10224 +11008 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12589 +12593 +12687 +12688 +12728 +12784 +12829 +12832 +12868 +12881 +12924 +12927 +13004 +13008 +13055 +13056 +13175 +13179 +13278 +13280 +13311 +13312 +19894 +19968 +40870 +40960 +42125 +42128 +42183 +44032 +55204 +55296 +64046 +64048 +64107 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65021 +65024 +65040 +65056 +65060 +65072 +65095 +65097 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65536 +66304 +66335 +66336 +66340 +66352 +66379 +66560 +66598 +66600 +66638 +118784 +119030 +119040 +119079 +119082 +119262 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120001 +120002 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120484 +120488 +120778 +120782 +120832 +131070 +173783 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1246 +0 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2208 +2229 +2275 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2810 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3200 +3201 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3329 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3423 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7296 +7360 +7368 +7376 +7415 +7416 +7418 +7424 +7670 +7676 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8383 +8400 +8433 +8448 +8588 +8592 +9211 +9216 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11218 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11843 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40918 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42926 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65933 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66352 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70206 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72384 +72441 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +110592 +110594 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +124928 +125125 +125127 +125143 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127387 +127462 +127491 +127504 +127547 +127552 +127561 +127568 +127570 +127744 +128378 +128379 +128420 +128421 +128721 +128736 +128749 +128752 +128756 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129296 +129305 +129408 +129413 +129472 +129473 +131070 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V738 +0 +544 +546 +564 +592 +686 +688 +751 +768 +847 +864 +867 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +984 +986 +1012 +1024 +1159 +1160 +1162 +1164 +1221 +1223 +1225 +1227 +1229 +1232 +1270 +1272 +1274 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1442 +1443 +1466 +1467 +1477 +1488 +1515 +1520 +1525 +1548 +1549 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1622 +1632 +1646 +1648 +1774 +1776 +1791 +1792 +1806 +1807 +1837 +1840 +1867 +1920 +1969 +2305 +2308 +2309 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2562 +2563 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2700 +2701 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2785 +2790 +2800 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2870 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2929 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3059 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3947 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4047 +4048 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4256 +4294 +4304 +4343 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4615 +4616 +4679 +4680 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4743 +4744 +4745 +4746 +4750 +4752 +4783 +4784 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4815 +4816 +4823 +4824 +4847 +4848 +4879 +4880 +4881 +4882 +4886 +4888 +4895 +4896 +4935 +4936 +4955 +4961 +4989 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +6016 +6109 +6112 +6122 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8263 +8264 +8270 +8298 +8305 +8308 +8335 +8352 +8368 +8400 +8420 +8448 +8507 +8531 +8580 +8592 +8692 +8704 +8946 +8960 +9084 +9085 +9115 +9216 +9255 +9280 +9291 +9312 +9451 +9472 +9622 +9632 +9720 +9728 +9748 +9753 +9842 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10088 +10102 +10133 +10136 +10160 +10161 +10175 +10240 +10496 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12347 +12350 +12352 +12353 +12437 +12441 +12447 +12449 +12543 +12549 +12589 +12593 +12687 +12688 +12728 +12800 +12829 +12832 +12868 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13055 +13056 +13175 +13179 +13278 +13280 +13311 +13312 +19894 +19968 +40870 +40960 +42125 +42128 +42146 +42148 +42164 +42165 +42177 +42178 +42181 +42182 +42183 +44032 +55204 +55296 +64046 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65020 +65056 +65060 +65072 +65093 +65097 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65279 +65280 +65281 +65375 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65536 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1022 +0 +888 +890 +895 +900 +907 +908 +909 +910 +930 +931 +1320 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1540 +1542 +1564 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2304 +2424 +2425 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2801 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4304 +4349 +4352 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5109 +5120 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6912 +6988 +6992 +7037 +7040 +7083 +7086 +7098 +7104 +7156 +7164 +7224 +7227 +7242 +7245 +7296 +7376 +7411 +7424 +7655 +7676 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8298 +8306 +8308 +8335 +8336 +8349 +8352 +8378 +8400 +8433 +8448 +8586 +8592 +9204 +9216 +9255 +9280 +9291 +9312 +9984 +9985 +10187 +10188 +10189 +10190 +11085 +11088 +11098 +11264 +11311 +11312 +11359 +11360 +11506 +11513 +11558 +11568 +11622 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11826 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40908 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42612 +42620 +42648 +42656 +42744 +42752 +42895 +42896 +42898 +42912 +42922 +43002 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43260 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43488 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43644 +43648 +43715 +43739 +43744 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43968 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64046 +64048 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65063 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67680 +67840 +67868 +67871 +67898 +67903 +67904 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68224 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68480 +68608 +68681 +69216 +69247 +69632 +69710 +69714 +69744 +69760 +69826 +73728 +74607 +74752 +74851 +74864 +74868 +77824 +78895 +92160 +92729 +110592 +110594 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127167 +127169 +127184 +127185 +127200 +127232 +127243 +127248 +127279 +127280 +127338 +127344 +127387 +127462 +127491 +127504 +127547 +127552 +127561 +127568 +127570 +127744 +127777 +127792 +127798 +127799 +127869 +127872 +127892 +127904 +127941 +127942 +127947 +127968 +127985 +128000 +128063 +128064 +128065 +128066 +128248 +128249 +128253 +128256 +128318 +128336 +128360 +128507 +128512 +128513 +128529 +128530 +128533 +128534 +128535 +128536 +128537 +128538 +128539 +128540 +128543 +128544 +128550 +128552 +128556 +128557 +128558 +128560 +128564 +128565 +128577 +128581 +128592 +128640 +128710 +128768 +128884 +131070 +173783 +173824 +177973 +177984 +178206 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1296 +0 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2810 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3329 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7415 +7416 +7418 +7424 +7670 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8383 +8400 +8433 +8448 +8588 +8592 +9215 +9216 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11218 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11845 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40918 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66352 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94177 +94208 +100333 +100352 +101107 +110592 +110594 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127744 +128723 +128736 +128749 +128752 +128759 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129296 +129311 +129312 +129320 +129328 +129329 +129331 +129343 +129344 +129356 +129360 +129375 +129408 +129426 +129472 +129473 +131070 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1098 +0 +888 +890 +895 +900 +907 +908 +909 +910 +930 +931 +1320 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1423 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1541 +1542 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2208 +2209 +2210 +2221 +2276 +2303 +2304 +2424 +2425 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5109 +5120 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7296 +7360 +7368 +7376 +7415 +7424 +7655 +7676 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8379 +8400 +8433 +8448 +8586 +8592 +9204 +9216 +9255 +9280 +9291 +9312 +9984 +9985 +11085 +11088 +11098 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11836 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40909 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42648 +42655 +42744 +42752 +42895 +42896 +42900 +42912 +42923 +43000 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43260 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43488 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43644 +43648 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43968 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65063 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67680 +67840 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68224 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68480 +68608 +68681 +69216 +69247 +69632 +69710 +69714 +69744 +69760 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +70016 +70089 +70096 +70106 +71296 +71352 +71360 +71370 +73728 +74607 +74752 +74851 +74864 +74868 +77824 +78895 +92160 +92729 +93952 +94021 +94032 +94079 +94095 +94112 +110592 +110594 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127167 +127169 +127184 +127185 +127200 +127232 +127243 +127248 +127279 +127280 +127340 +127344 +127387 +127462 +127491 +127504 +127547 +127552 +127561 +127568 +127570 +127744 +127777 +127792 +127798 +127799 +127869 +127872 +127892 +127904 +127941 +127942 +127947 +127968 +127985 +128000 +128063 +128064 +128065 +128066 +128248 +128249 +128253 +128256 +128318 +128320 +128324 +128336 +128360 +128507 +128577 +128581 +128592 +128640 +128710 +128768 +128884 +131070 +173783 +173824 +177973 +177984 +178206 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V624 +0 +502 +506 +536 +592 +681 +688 +735 +736 +746 +768 +838 +864 +866 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +983 +986 +987 +988 +989 +990 +991 +992 +993 +994 +1012 +1025 +1037 +1038 +1104 +1105 +1117 +1118 +1159 +1168 +1221 +1223 +1225 +1227 +1229 +1232 +1260 +1262 +1270 +1272 +1274 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1418 +1425 +1442 +1443 +1466 +1467 +1477 +1488 +1515 +1520 +1525 +1548 +1549 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1619 +1632 +1646 +1648 +1720 +1722 +1727 +1728 +1743 +1744 +1774 +1776 +1786 +2305 +2308 +2309 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2562 +2563 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2700 +2701 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2785 +2790 +2800 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2870 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2929 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3059 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3946 +3953 +3980 +3984 +3990 +3991 +3992 +3993 +4014 +4017 +4024 +4025 +4026 +4256 +4294 +4304 +4343 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8239 +8240 +8263 +8298 +8305 +8308 +8335 +8352 +8365 +8400 +8418 +8448 +8505 +8531 +8579 +8592 +8683 +8704 +8946 +8960 +8961 +8962 +9083 +9216 +9253 +9280 +9291 +9312 +9451 +9472 +9622 +9632 +9712 +9728 +9748 +9754 +9840 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10088 +10102 +10133 +10136 +10160 +10161 +10175 +12288 +12344 +12351 +12352 +12353 +12437 +12441 +12447 +12449 +12543 +12549 +12589 +12593 +12687 +12688 +12704 +12800 +12829 +12832 +12868 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13055 +13056 +13175 +13179 +13278 +13280 +13311 +19968 +40870 +44032 +55204 +55296 +64046 +64256 +64263 +64275 +64280 +64286 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65020 +65056 +65060 +65072 +65093 +65097 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65279 +65280 +65281 +65375 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65532 +65536 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1098 +0 +888 +890 +895 +900 +907 +908 +909 +910 +930 +931 +1320 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1423 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1541 +1542 +1564 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2208 +2209 +2210 +2221 +2276 +2303 +2304 +2424 +2425 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5109 +5120 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7296 +7360 +7368 +7376 +7415 +7424 +7655 +7676 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8298 +8306 +8308 +8335 +8336 +8349 +8352 +8378 +8400 +8433 +8448 +8586 +8592 +9204 +9216 +9255 +9280 +9291 +9312 +9984 +9985 +11085 +11088 +11098 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11836 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40909 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42648 +42655 +42744 +42752 +42895 +42896 +42900 +42912 +42923 +43000 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43260 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43488 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43644 +43648 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43968 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65063 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67680 +67840 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68224 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68480 +68608 +68681 +69216 +69247 +69632 +69710 +69714 +69744 +69760 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +70016 +70089 +70096 +70106 +71296 +71352 +71360 +71370 +73728 +74607 +74752 +74851 +74864 +74868 +77824 +78895 +92160 +92729 +93952 +94021 +94032 +94079 +94095 +94112 +110592 +110594 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127167 +127169 +127184 +127185 +127200 +127232 +127243 +127248 +127279 +127280 +127340 +127344 +127387 +127462 +127491 +127504 +127547 +127552 +127561 +127568 +127570 +127744 +127777 +127792 +127798 +127799 +127869 +127872 +127892 +127904 +127941 +127942 +127947 +127968 +127985 +128000 +128063 +128064 +128065 +128066 +128248 +128249 +128253 +128256 +128318 +128320 +128324 +128336 +128360 +128507 +128577 +128581 +128592 +128640 +128710 +128768 +128884 +131070 +173783 +173824 +177973 +177984 +178206 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V804 +0 +544 +546 +564 +592 +686 +688 +751 +768 +847 +864 +867 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +984 +986 +1014 +1024 +1159 +1160 +1162 +1164 +1221 +1223 +1225 +1227 +1229 +1232 +1270 +1272 +1274 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1442 +1443 +1466 +1467 +1477 +1488 +1515 +1520 +1525 +1548 +1549 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1622 +1632 +1646 +1648 +1774 +1776 +1791 +1792 +1806 +1807 +1837 +1840 +1867 +1920 +1969 +2305 +2308 +2309 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2562 +2563 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2700 +2701 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2785 +2790 +2800 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2870 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2929 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3059 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3947 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4047 +4048 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4256 +4294 +4304 +4343 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4615 +4616 +4679 +4680 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4743 +4744 +4745 +4746 +4750 +4752 +4783 +4784 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4815 +4816 +4823 +4824 +4847 +4848 +4879 +4880 +4881 +4882 +4886 +4888 +4895 +4896 +4935 +4936 +4955 +4961 +4989 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +6016 +6109 +6112 +6122 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8263 +8264 +8270 +8298 +8305 +8308 +8335 +8352 +8368 +8400 +8420 +8448 +8507 +8531 +8580 +8592 +8692 +8704 +8946 +8960 +9084 +9085 +9115 +9216 +9255 +9280 +9291 +9312 +9451 +9472 +9622 +9632 +9720 +9728 +9748 +9753 +9842 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10088 +10102 +10133 +10136 +10160 +10161 +10175 +10240 +10496 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12347 +12350 +12352 +12353 +12437 +12441 +12447 +12449 +12543 +12549 +12589 +12593 +12687 +12688 +12728 +12800 +12829 +12832 +12868 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13055 +13056 +13175 +13179 +13278 +13280 +13311 +13312 +19894 +19968 +40870 +40960 +42125 +42128 +42146 +42148 +42164 +42165 +42177 +42178 +42181 +42182 +42183 +44032 +55204 +55296 +64046 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65020 +65056 +65060 +65072 +65093 +65097 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65279 +65280 +65281 +65375 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65536 +66304 +66335 +66336 +66340 +66352 +66379 +66560 +66598 +66600 +66638 +118784 +119030 +119040 +119079 +119082 +119262 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120001 +120002 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120484 +120488 +120778 +120782 +120832 +131070 +173783 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V860 +0 +578 +592 +880 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +1159 +1160 +1231 +1232 +1274 +1280 +1296 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1466 +1467 +1480 +1488 +1515 +1520 +1525 +1536 +1540 +1547 +1558 +1563 +1564 +1566 +1568 +1569 +1595 +1600 +1631 +1632 +1806 +1807 +1867 +1869 +1902 +1920 +1970 +2305 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2429 +2430 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2801 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3947 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4047 +4050 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4256 +4294 +4304 +4349 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4959 +4989 +4992 +5018 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6570 +6576 +6602 +6608 +6618 +6622 +6684 +6686 +6688 +7424 +7620 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8292 +8298 +8306 +8308 +8335 +8336 +8341 +8352 +8374 +8400 +8428 +8448 +8525 +8531 +8580 +8592 +9180 +9216 +9255 +9280 +9291 +9312 +9885 +9888 +9906 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10176 +10183 +10192 +10220 +10224 +11028 +11264 +11311 +11312 +11359 +11392 +11499 +11513 +11558 +11568 +11622 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11776 +11800 +11804 +11806 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12589 +12593 +12687 +12688 +12728 +12736 +12752 +12784 +12831 +12832 +12868 +12880 +13055 +13056 +19894 +19904 +40892 +40960 +42125 +42128 +42183 +42752 +42775 +43008 +43052 +44032 +55204 +55296 +64046 +64048 +64107 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65060 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +118784 +119030 +119040 +119079 +119082 +119262 +119296 +119366 +119552 +119639 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120778 +120782 +120832 +131070 +173783 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V880 +0 +880 +884 +886 +890 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +1159 +1160 +1300 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1540 +1547 +1558 +1563 +1564 +1566 +1568 +1569 +1595 +1600 +1631 +1632 +1806 +1807 +1867 +1869 +1902 +1920 +1970 +1984 +2043 +2305 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2427 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2801 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3947 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4047 +4050 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4256 +4294 +4304 +4349 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4959 +4989 +4992 +5018 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6570 +6576 +6602 +6608 +6618 +6622 +6684 +6686 +6688 +6912 +6988 +6992 +7037 +7424 +7627 +7678 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8292 +8298 +8306 +8308 +8335 +8336 +8341 +8352 +8374 +8400 +8432 +8448 +8527 +8531 +8581 +8592 +9192 +9216 +9255 +9280 +9291 +9312 +9885 +9888 +9907 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10176 +10187 +10192 +10220 +10224 +11035 +11040 +11044 +11264 +11311 +11312 +11359 +11360 +11373 +11380 +11384 +11392 +11499 +11513 +11558 +11568 +11622 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11776 +11800 +11804 +11806 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12589 +12593 +12687 +12688 +12728 +12736 +12752 +12784 +12831 +12832 +12868 +12880 +13055 +13056 +19894 +19904 +40892 +40960 +42125 +42128 +42183 +42752 +42779 +42784 +42786 +43008 +43052 +43072 +43128 +44032 +55204 +55296 +64046 +64048 +64107 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65060 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +67840 +67866 +67871 +67872 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +73728 +74607 +74752 +74851 +74864 +74868 +118784 +119030 +119040 +119079 +119082 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +131070 +173783 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1220 +0 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2208 +2227 +2276 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3201 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3329 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5109 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7296 +7360 +7368 +7376 +7415 +7416 +7418 +7424 +7670 +7676 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8382 +8400 +8433 +8448 +8586 +8592 +9211 +9216 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11218 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11843 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40909 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42654 +42655 +42744 +42752 +42895 +42896 +42926 +42928 +42930 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43260 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43872 +43876 +43878 +43968 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65070 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65933 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66352 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67840 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70089 +70093 +70094 +70096 +70107 +70113 +70133 +70144 +70162 +70163 +70206 +70320 +70379 +70384 +70394 +70401 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71114 +71168 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71840 +71923 +71935 +71936 +72384 +72441 +73728 +74649 +74752 +74863 +74864 +74869 +77824 +78895 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +110592 +110594 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +124928 +125125 +125127 +125143 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127387 +127462 +127491 +127504 +127547 +127552 +127561 +127568 +127570 +127744 +127789 +127792 +127870 +127872 +127951 +127956 +127992 +128000 +128255 +128256 +128331 +128336 +128378 +128379 +128420 +128421 +128579 +128581 +128720 +128736 +128749 +128752 +128756 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +131070 +173783 +173824 +177973 +177984 +178206 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1318 +0 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131070 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V990 +0 +888 +890 +895 +900 +907 +908 +909 +910 +930 +931 +1318 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1540 +1542 +1564 +1566 +1568 +1569 +1631 +1632 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2304 +2362 +2364 +2383 +2384 +2390 +2392 +2419 +2425 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2801 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3389 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3949 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4046 +4057 +4096 +4294 +4304 +4349 +4352 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4959 +4989 +4992 +5018 +5024 +5109 +5120 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6912 +6988 +6992 +7037 +7040 +7083 +7086 +7098 +7168 +7224 +7227 +7242 +7245 +7296 +7376 +7411 +7424 +7655 +7677 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8298 +8306 +8308 +8335 +8336 +8341 +8352 +8377 +8400 +8433 +8448 +8586 +8592 +9193 +9216 +9255 +9280 +9291 +9312 +9934 +9935 +9954 +9955 +9956 +9960 +9984 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10176 +10187 +10188 +10189 +10192 +11085 +11088 +11098 +11264 +11311 +11312 +11359 +11360 +11506 +11513 +11558 +11568 +11622 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11826 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12728 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40908 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42592 +42594 +42612 +42620 +42648 +42656 +42744 +42752 +42893 +43003 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43260 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43488 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43644 +43648 +43715 +43739 +43744 +43968 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64046 +64048 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65063 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67680 +67840 +67868 +67871 +67898 +67903 +67904 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68224 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68480 +68608 +68681 +69216 +69247 +69760 +69826 +73728 +74607 +74752 +74851 +74864 +74868 +77824 +78895 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126976 +127020 +127024 +127124 +127232 +127243 +127248 +127279 +127281 +127282 +127293 +127294 +127295 +127296 +127298 +127299 +127302 +127303 +127306 +127311 +127319 +127320 +127327 +127328 +127353 +127354 +127355 +127357 +127359 +127360 +127370 +127374 +127376 +127377 +127488 +127489 +127504 +127538 +127552 +127561 +131070 +173783 +173824 +177973 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V624 +0 +502 +506 +536 +592 +681 +688 +735 +736 +746 +768 +838 +864 +866 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +983 +986 +987 +988 +989 +990 +991 +992 +993 +994 +1012 +1025 +1037 +1038 +1104 +1105 +1117 +1118 +1159 +1168 +1221 +1223 +1225 +1227 +1229 +1232 +1260 +1262 +1270 +1272 +1274 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1418 +1425 +1442 +1443 +1466 +1467 +1477 +1488 +1515 +1520 +1525 +1548 +1549 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1619 +1632 +1646 +1648 +1720 +1722 +1727 +1728 +1743 +1744 +1774 +1776 +1786 +2305 +2308 +2309 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2562 +2563 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2700 +2701 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2785 +2790 +2800 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2870 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2929 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3059 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3946 +3953 +3980 +3984 +3990 +3991 +3992 +3993 +4014 +4017 +4024 +4025 +4026 +4256 +4294 +4304 +4343 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8239 +8240 +8263 +8298 +8305 +8308 +8335 +8352 +8364 +8400 +8418 +8448 +8505 +8531 +8579 +8592 +8683 +8704 +8946 +8960 +8961 +8962 +9083 +9216 +9253 +9280 +9291 +9312 +9451 +9472 +9622 +9632 +9712 +9728 +9748 +9754 +9840 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10088 +10102 +10133 +10136 +10160 +10161 +10175 +12288 +12344 +12351 +12352 +12353 +12437 +12441 +12447 +12449 +12543 +12549 +12589 +12593 +12687 +12688 +12704 +12800 +12829 +12832 +12868 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13055 +13056 +13175 +13179 +13278 +13280 +13311 +19968 +40870 +44032 +55204 +55296 +64046 +64256 +64263 +64275 +64280 +64286 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65020 +65056 +65060 +65072 +65093 +65097 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65279 +65280 +65281 +65375 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65533 +65536 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V824 +0 +567 +592 +856 +861 +880 +884 +886 +890 +891 +894 +895 +900 +907 +908 +909 +910 +930 +931 +975 +976 +1020 +1024 +1159 +1160 +1231 +1232 +1270 +1272 +1274 +1280 +1296 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1442 +1443 +1466 +1467 +1477 +1488 +1515 +1520 +1525 +1536 +1540 +1548 +1558 +1563 +1564 +1567 +1568 +1569 +1595 +1600 +1625 +1632 +1806 +1807 +1867 +1869 +1872 +1920 +1970 +2305 +2362 +2364 +2382 +2384 +2389 +2392 +2417 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2677 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2801 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2884 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2914 +2918 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +2998 +2999 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3047 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3168 +3170 +3174 +3184 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3298 +3302 +3312 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3390 +3396 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3426 +3430 +3440 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3947 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4047 +4048 +4096 +4130 +4131 +4136 +4137 +4139 +4140 +4147 +4150 +4154 +4160 +4186 +4256 +4294 +4304 +4345 +4347 +4348 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4615 +4616 +4679 +4680 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4743 +4744 +4745 +4746 +4750 +4752 +4783 +4784 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4815 +4816 +4823 +4824 +4847 +4848 +4879 +4880 +4881 +4882 +4886 +4888 +4895 +4896 +4935 +4936 +4955 +4961 +4989 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6314 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6624 +6656 +7424 +7532 +7680 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8277 +8279 +8280 +8287 +8292 +8298 +8306 +8308 +8335 +8352 +8370 +8400 +8427 +8448 +8508 +8509 +8524 +8531 +8580 +8592 +9169 +9216 +9255 +9280 +9291 +9312 +9752 +9753 +9854 +9856 +9874 +9888 +9890 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10192 +10220 +10224 +11022 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12589 +12593 +12687 +12688 +12728 +12784 +12831 +12832 +12868 +12880 +12926 +12927 +13055 +13056 +19894 +19904 +40870 +40960 +42125 +42128 +42183 +44032 +55204 +55296 +64046 +64048 +64107 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65040 +65056 +65060 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65856 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66464 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +118784 +119030 +119040 +119079 +119082 +119262 +119552 +119639 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120484 +120488 +120778 +120782 +120832 +131070 +173783 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1098 +0 +888 +890 +895 +900 +907 +908 +909 +910 +930 +931 +1320 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1423 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1541 +1542 +1564 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2208 +2209 +2210 +2221 +2276 +2303 +2304 +2424 +2425 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2556 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5109 +5120 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7296 +7360 +7368 +7376 +7415 +7424 +7655 +7676 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8298 +8306 +8308 +8335 +8336 +8349 +8352 +8379 +8400 +8433 +8448 +8586 +8592 +9204 +9216 +9255 +9280 +9291 +9312 +9984 +9985 +11085 +11088 +11098 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11836 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40909 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42648 +42655 +42744 +42752 +42895 +42896 +42900 +42912 +42923 +43000 +43052 +43056 +43066 +43072 +43128 +43136 +43205 +43214 +43226 +43232 +43260 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43488 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43644 +43648 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43968 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65063 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67680 +67840 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68224 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68480 +68608 +68681 +69216 +69247 +69632 +69710 +69714 +69744 +69760 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +70016 +70089 +70096 +70106 +71296 +71352 +71360 +71370 +73728 +74607 +74752 +74851 +74864 +74868 +77824 +78895 +92160 +92729 +93952 +94021 +94032 +94079 +94095 +94112 +110592 +110594 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127167 +127169 +127184 +127185 +127200 +127232 +127243 +127248 +127279 +127280 +127340 +127344 +127387 +127462 +127491 +127504 +127547 +127552 +127561 +127568 +127570 +127744 +127777 +127792 +127798 +127799 +127869 +127872 +127892 +127904 +127941 +127942 +127947 +127968 +127985 +128000 +128063 +128064 +128065 +128066 +128248 +128249 +128253 +128256 +128318 +128320 +128324 +128336 +128360 +128507 +128577 +128581 +128592 +128640 +128710 +128768 +128884 +131070 +173783 +173824 +177973 +177984 +178206 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V910 +0 +888 +890 +895 +900 +907 +908 +909 +910 +930 +931 +1316 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1540 +1542 +1564 +1566 +1568 +1569 +1631 +1632 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2305 +2362 +2364 +2382 +2384 +2389 +2392 +2419 +2427 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2555 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2801 +2802 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3124 +3125 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3162 +3168 +3172 +3174 +3184 +3192 +3200 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3369 +3370 +3386 +3389 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3424 +3428 +3430 +3446 +3449 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3806 +3840 +3912 +3913 +3949 +3953 +3980 +3984 +3992 +3993 +4029 +4030 +4045 +4046 +4053 +4096 +4250 +4254 +4294 +4304 +4349 +4352 +4442 +4447 +4515 +4520 +4602 +4608 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4959 +4989 +4992 +5018 +5024 +5109 +5121 +5751 +5760 +5789 +5792 +5873 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6400 +6429 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6570 +6576 +6602 +6608 +6618 +6622 +6684 +6686 +6688 +6912 +6988 +6992 +7037 +7040 +7083 +7086 +7098 +7168 +7224 +7227 +7242 +7245 +7296 +7424 +7655 +7678 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8298 +8306 +8308 +8335 +8336 +8341 +8352 +8374 +8400 +8433 +8448 +8528 +8531 +8585 +8592 +9192 +9216 +9255 +9280 +9291 +9312 +9886 +9888 +9917 +9920 +9924 +9985 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10079 +10081 +10133 +10136 +10160 +10161 +10175 +10176 +10187 +10188 +10189 +10192 +11085 +11088 +11093 +11264 +11311 +11312 +11359 +11360 +11376 +11377 +11390 +11392 +11499 +11513 +11558 +11568 +11622 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11825 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12590 +12593 +12687 +12688 +12728 +12736 +12772 +12784 +12831 +12832 +12868 +12880 +13055 +13056 +19894 +19904 +40900 +40960 +42125 +42128 +42183 +42240 +42540 +42560 +42592 +42594 +42612 +42620 +42648 +42752 +42893 +43003 +43052 +43072 +43128 +43136 +43205 +43214 +43226 +43264 +43348 +43359 +43360 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43616 +44032 +55204 +55296 +64046 +64048 +64107 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +64976 +65022 +65024 +65050 +65056 +65063 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65931 +65936 +65948 +66000 +66046 +66176 +66205 +66208 +66257 +66304 +66335 +66336 +66340 +66352 +66379 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +67840 +67866 +67871 +67898 +67903 +67904 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +73728 +74607 +74752 +74851 +74864 +74868 +118784 +119030 +119040 +119079 +119081 +119262 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126976 +127020 +127024 +127124 +131070 +173783 +194560 +195102 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917504 +917505 +917506 +917536 +917632 +917760 +918000 +983038 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V58 +183 +184 +720 +722 +1600 +1601 +2042 +2043 +3654 +3655 +3782 +3783 +6154 +6155 +6211 +6212 +6823 +6824 +7222 +7223 +7291 +7292 +12293 +12294 +12337 +12342 +12445 +12447 +12540 +12543 +40981 +40982 +42508 +42509 +43471 +43472 +43494 +43495 +43632 +43633 +43741 +43742 +43763 +43765 +65392 +65393 +70493 +70494 +71110 +71113 +72344 +72345 +92994 +92996 +94176 +94178 +125252 +125255 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V358 +161 +162 +164 +165 +167 +169 +170 +171 +173 +175 +176 +181 +182 +187 +188 +192 +198 +199 +208 +209 +215 +217 +222 +226 +230 +231 +232 +235 +236 +238 +240 +241 +242 +244 +247 +251 +252 +253 +254 +255 +257 +258 +273 +274 +275 +276 +283 +284 +294 +296 +299 +300 +305 +308 +312 +313 +319 +323 +324 +325 +328 +332 +333 +334 +338 +340 +358 +360 +363 +364 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +593 +594 +609 +610 +708 +709 +711 +712 +713 +716 +717 +718 +720 +721 +728 +732 +733 +734 +735 +736 +768 +880 +913 +930 +931 +938 +945 +962 +963 +970 +1025 +1026 +1040 +1104 +1105 +1106 +8208 +8209 +8211 +8215 +8216 +8218 +8220 +8222 +8224 +8227 +8228 +8232 +8240 +8241 +8242 +8244 +8245 +8246 +8251 +8252 +8254 +8255 +8308 +8309 +8319 +8320 +8321 +8325 +8364 +8365 +8451 +8452 +8453 +8454 +8457 +8458 +8467 +8468 +8470 +8471 +8481 +8483 +8486 +8487 +8491 +8492 +8531 +8533 +8539 +8543 +8544 +8556 +8560 +8570 +8585 +8586 +8592 +8602 +8632 +8634 +8658 +8659 +8660 +8661 +8679 +8680 +8704 +8705 +8706 +8708 +8711 +8713 +8715 +8716 +8719 +8720 +8721 +8722 +8725 +8726 +8730 +8731 +8733 +8737 +8739 +8740 +8741 +8742 +8743 +8749 +8750 +8751 +8756 +8760 +8764 +8766 +8776 +8777 +8780 +8781 +8786 +8787 +8800 +8802 +8804 +8808 +8810 +8812 +8814 +8816 +8834 +8836 +8838 +8840 +8853 +8854 +8857 +8858 +8869 +8870 +8895 +8896 +8978 +8979 +9312 +9450 +9451 +9548 +9552 +9588 +9600 +9616 +9618 +9622 +9632 +9634 +9635 +9642 +9650 +9652 +9654 +9656 +9660 +9662 +9664 +9666 +9670 +9673 +9675 +9676 +9678 +9682 +9698 +9702 +9711 +9712 +9733 +9735 +9737 +9738 +9742 +9744 +9756 +9757 +9758 +9759 +9792 +9793 +9794 +9795 +9824 +9826 +9827 +9830 +9831 +9835 +9836 +9838 +9839 +9840 +9886 +9888 +9919 +9920 +9926 +9934 +9935 +9940 +9941 +9954 +9955 +9956 +9960 +9962 +9963 +9970 +9972 +9973 +9974 +9978 +9979 +9981 +9982 +9984 +10045 +10046 +10102 +10112 +11094 +11098 +12872 +12880 +57344 +63744 +65024 +65040 +65533 +65534 +127232 +127243 +127248 +127278 +127280 +127338 +127344 +127374 +127375 +127377 +127387 +127405 +917760 +918000 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V208 +4352 +4448 +8986 +8988 +9001 +9003 +9193 +9197 +9200 +9201 +9203 +9204 +9725 +9727 +9748 +9750 +9800 +9812 +9855 +9856 +9875 +9876 +9889 +9890 +9898 +9900 +9917 +9919 +9924 +9926 +9934 +9935 +9940 +9941 +9962 +9963 +9970 +9972 +9973 +9974 +9978 +9979 +9981 +9982 +9989 +9990 +9994 +9996 +10024 +10025 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10133 +10136 +10160 +10161 +10175 +10176 +11035 +11037 +11088 +11089 +11093 +11094 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12289 +12351 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +12872 +12880 +13055 +13056 +19904 +19968 +42125 +42128 +42183 +43360 +43389 +44032 +55204 +63744 +64256 +65040 +65050 +65072 +65107 +65108 +65127 +65128 +65132 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +126980 +126981 +127183 +127184 +127374 +127375 +127377 +127387 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +127777 +127789 +127798 +127799 +127869 +127870 +127892 +127904 +127947 +127951 +127956 +127968 +127985 +127988 +127989 +127992 +128063 +128064 +128065 +128066 +128253 +128255 +128318 +128331 +128335 +128336 +128360 +128378 +128379 +128405 +128407 +128420 +128421 +128507 +128592 +128640 +128710 +128716 +128717 +128720 +128723 +128747 +128749 +128756 +128761 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +196606 +196608 +262142 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V533 +0 +32 +127 +161 +169 +170 +171 +172 +181 +182 +187 +188 +192 +198 +199 +208 +209 +215 +217 +222 +226 +230 +231 +232 +235 +236 +238 +240 +241 +242 +244 +247 +251 +252 +253 +254 +255 +257 +258 +273 +274 +275 +276 +283 +284 +294 +296 +299 +300 +305 +308 +312 +313 +319 +323 +324 +325 +328 +332 +333 +334 +338 +340 +358 +360 +363 +364 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +593 +594 +609 +610 +708 +709 +711 +712 +713 +716 +717 +718 +720 +721 +728 +732 +733 +734 +735 +736 +768 +880 +913 +930 +931 +938 +945 +962 +963 +970 +1025 +1026 +1040 +1104 +1105 +1106 +4352 +4448 +8208 +8209 +8211 +8215 +8216 +8218 +8220 +8222 +8224 +8227 +8228 +8232 +8240 +8241 +8242 +8244 +8245 +8246 +8251 +8252 +8254 +8255 +8308 +8309 +8319 +8320 +8321 +8325 +8361 +8362 +8364 +8365 +8451 +8452 +8453 +8454 +8457 +8458 +8467 +8468 +8470 +8471 +8481 +8483 +8486 +8487 +8491 +8492 +8531 +8533 +8539 +8543 +8544 +8556 +8560 +8570 +8585 +8586 +8592 +8602 +8632 +8634 +8658 +8659 +8660 +8661 +8679 +8680 +8704 +8705 +8706 +8708 +8711 +8713 +8715 +8716 +8719 +8720 +8721 +8722 +8725 +8726 +8730 +8731 +8733 +8737 +8739 +8740 +8741 +8742 +8743 +8749 +8750 +8751 +8756 +8760 +8764 +8766 +8776 +8777 +8780 +8781 +8786 +8787 +8800 +8802 +8804 +8808 +8810 +8812 +8814 +8816 +8834 +8836 +8838 +8840 +8853 +8854 +8857 +8858 +8869 +8870 +8895 +8896 +8978 +8979 +8986 +8988 +9001 +9003 +9193 +9197 +9200 +9201 +9203 +9204 +9312 +9450 +9451 +9548 +9552 +9588 +9600 +9616 +9618 +9622 +9632 +9634 +9635 +9642 +9650 +9652 +9654 +9656 +9660 +9662 +9664 +9666 +9670 +9673 +9675 +9676 +9678 +9682 +9698 +9702 +9711 +9712 +9725 +9727 +9733 +9735 +9737 +9738 +9742 +9744 +9748 +9750 +9756 +9757 +9758 +9759 +9792 +9793 +9794 +9795 +9800 +9812 +9824 +9826 +9827 +9830 +9831 +9835 +9836 +9838 +9839 +9840 +9855 +9856 +9875 +9876 +9886 +9888 +9889 +9890 +9898 +9900 +9917 +9920 +9924 +9954 +9955 +9956 +9960 +9984 +9989 +9990 +9994 +9996 +10024 +10025 +10045 +10046 +10060 +10061 +10062 +10063 +10067 +10070 +10071 +10072 +10102 +10112 +10133 +10136 +10160 +10161 +10175 +10176 +10214 +10222 +10629 +10631 +11035 +11037 +11088 +11089 +11093 +11098 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12351 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19904 +19968 +42125 +42128 +42183 +43360 +43389 +44032 +55204 +57344 +64256 +65024 +65050 +65072 +65107 +65108 +65127 +65128 +65132 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65533 +65534 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +126980 +126981 +127183 +127184 +127232 +127243 +127248 +127278 +127280 +127338 +127344 +127405 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +127777 +127789 +127798 +127799 +127869 +127870 +127892 +127904 +127947 +127951 +127956 +127968 +127985 +127988 +127989 +127992 +128063 +128064 +128065 +128066 +128253 +128255 +128318 +128331 +128335 +128336 +128360 +128378 +128379 +128405 +128407 +128420 +128421 +128507 +128592 +128640 +128710 +128716 +128717 +128720 +128723 +128747 +128749 +128756 +128761 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +196606 +196608 +262142 +917760 +918000 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +8361 +8362 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65512 +65519 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +32 +127 +162 +164 +165 +167 +172 +173 +175 +176 +10214 +10222 +10629 +10631 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V24 +48 +58 +178 +180 +185 +186 +1776 +1786 +8304 +8305 +8308 +8314 +8320 +8330 +9352 +9372 +65296 +65306 +66273 +66300 +120782 +120832 +127232 +127243 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V66 +1424 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1536 +1984 +2027 +2036 +2038 +2042 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2144 +2160 +2208 +8207 +8208 +64285 +64286 +64287 +64297 +64298 +64336 +67584 +67871 +67872 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +68409 +68416 +69216 +69247 +69632 +124928 +125136 +125143 +125252 +125259 +126464 +126720 +126976 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +12 +13 +32 +33 +5760 +5761 +8192 +8203 +8232 +8233 +8287 +8288 +12288 +12289 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V859 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +697 +699 +706 +720 +722 +736 +741 +750 +751 +880 +884 +886 +894 +895 +900 +902 +903 +904 +1014 +1015 +1155 +1162 +1418 +1419 +1421 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2546 +2548 +2555 +2556 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2801 +2802 +2810 +2816 +2817 +2818 +2876 +2877 +2879 +2880 +2881 +2885 +2893 +2894 +2902 +2903 +2914 +2916 +2946 +2947 +3008 +3009 +3021 +3022 +3059 +3067 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3192 +3199 +3201 +3202 +3260 +3261 +3276 +3278 +3298 +3300 +3328 +3330 +3387 +3389 +3393 +3397 +3405 +3406 +3426 +3428 +3530 +3531 +3538 +3541 +3542 +3543 +3633 +3634 +3636 +3643 +3647 +3648 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3902 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4957 +4960 +5008 +5018 +5120 +5121 +5760 +5761 +5787 +5789 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6107 +6108 +6109 +6110 +6128 +6138 +6144 +6159 +6277 +6279 +6313 +6314 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6464 +6465 +6468 +6470 +6622 +6656 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6832 +6847 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8125 +8126 +8127 +8130 +8141 +8144 +8157 +8160 +8173 +8176 +8189 +8191 +8192 +8206 +8207 +8305 +8308 +8319 +8320 +8335 +8352 +8433 +8448 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8528 +8544 +8585 +8588 +8592 +9014 +9083 +9109 +9110 +9255 +9280 +9291 +9312 +9372 +9450 +9900 +9901 +10240 +10496 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11493 +11499 +11503 +11506 +11513 +11520 +11647 +11648 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12293 +12296 +12321 +12330 +12334 +12336 +12337 +12342 +12344 +12349 +12352 +12441 +12445 +12448 +12449 +12539 +12540 +12736 +12772 +12829 +12831 +12880 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13175 +13179 +13278 +13280 +13311 +13312 +19904 +19968 +42128 +42183 +42509 +42512 +42607 +42624 +42654 +42656 +42736 +42738 +42752 +42786 +42888 +42889 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43048 +43052 +43064 +43066 +43124 +43128 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43493 +43494 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43756 +43758 +43766 +43767 +44005 +44006 +44008 +44009 +44013 +44014 +64285 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65280 +65281 +65313 +65339 +65345 +65371 +65382 +65504 +65511 +65512 +65519 +65520 +65536 +65793 +65794 +65856 +65933 +65936 +65948 +65952 +65953 +66045 +66046 +66272 +66300 +66422 +66427 +67584 +69632 +69633 +69634 +69688 +69703 +69714 +69734 +69759 +69762 +69811 +69815 +69817 +69819 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70464 +70465 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +70852 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71264 +71277 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94095 +94099 +113821 +113823 +113824 +113828 +119143 +119146 +119155 +119171 +119173 +119180 +119210 +119214 +119296 +119366 +119552 +119639 +120539 +120540 +120597 +120598 +120655 +120656 +120713 +120714 +120771 +120772 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127338 +127340 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +921600 +983038 +983040 +1048574 +1048576 +1114110 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +44 +45 +46 +48 +58 +59 +160 +161 +1548 +1549 +8239 +8240 +8260 +8261 +65104 +65105 +65106 +65107 +65109 +65110 +65292 +65293 +65294 +65296 +65306 +65307 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V64 +0 +9 +14 +28 +127 +133 +134 +160 +173 +174 +6158 +6159 +8203 +8206 +8288 +8294 +8298 +8304 +64976 +65008 +65279 +65280 +65520 +65529 +65534 +65536 +113824 +113828 +119155 +119163 +131070 +131072 +196606 +196608 +262142 +262144 +327678 +327680 +393214 +393216 +458750 +458752 +524286 +524288 +589822 +589824 +655358 +655360 +720894 +720896 +786430 +786432 +851966 +851968 +917502 +917760 +918000 +921600 +983038 +983040 +1048574 +1048576 +1114110 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V354 +33 +35 +38 +43 +59 +65 +91 +97 +123 +127 +161 +162 +166 +170 +171 +173 +174 +176 +180 +181 +182 +185 +187 +192 +215 +216 +247 +248 +697 +699 +706 +720 +722 +736 +741 +750 +751 +768 +884 +886 +894 +895 +900 +902 +903 +904 +1014 +1015 +1418 +1419 +1421 +1423 +1542 +1544 +1550 +1552 +1758 +1759 +1769 +1770 +2038 +2042 +3059 +3065 +3066 +3067 +3192 +3199 +3898 +3902 +5008 +5018 +5120 +5121 +5787 +5789 +6128 +6138 +6144 +6155 +6464 +6465 +6468 +6470 +6622 +6656 +8125 +8126 +8127 +8130 +8141 +8144 +8157 +8160 +8173 +8176 +8189 +8191 +8208 +8232 +8245 +8260 +8261 +8287 +8316 +8319 +8332 +8335 +8448 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8506 +8508 +8512 +8517 +8522 +8526 +8528 +8544 +8585 +8588 +8592 +8722 +8724 +9014 +9083 +9109 +9110 +9255 +9280 +9291 +9312 +9352 +9450 +9900 +9901 +10240 +10496 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11493 +11499 +11513 +11520 +11776 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12289 +12293 +12296 +12321 +12336 +12337 +12342 +12344 +12349 +12352 +12443 +12445 +12448 +12449 +12539 +12540 +12736 +12772 +12829 +12831 +12880 +12896 +12924 +12927 +12977 +12992 +13004 +13008 +13175 +13179 +13278 +13280 +13311 +13312 +19904 +19968 +42128 +42183 +42509 +42512 +42611 +42612 +42622 +42624 +42752 +42786 +42888 +42889 +43048 +43052 +43124 +43128 +64830 +64832 +65021 +65022 +65040 +65050 +65072 +65104 +65105 +65106 +65108 +65109 +65110 +65119 +65120 +65122 +65124 +65127 +65128 +65129 +65131 +65132 +65281 +65283 +65286 +65291 +65307 +65313 +65339 +65345 +65371 +65382 +65506 +65509 +65512 +65519 +65529 +65534 +65793 +65794 +65856 +65933 +65936 +65948 +65952 +65953 +67871 +67872 +68409 +68416 +69714 +69734 +71264 +71277 +119296 +119362 +119365 +119366 +119552 +119639 +120539 +120540 +120597 +120598 +120655 +120656 +120713 +120714 +120771 +120772 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127243 +127245 +127338 +127340 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V592 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2810 +2816 +2817 +2818 +2876 +2877 +2879 +2880 +2881 +2885 +2893 +2894 +2902 +2903 +2914 +2916 +2946 +2947 +3008 +3009 +3021 +3022 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3202 +3260 +3261 +3276 +3278 +3298 +3300 +3328 +3330 +3387 +3389 +3393 +3397 +3405 +3406 +3426 +3428 +3530 +3531 +3538 +3541 +3542 +3543 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6832 +6847 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12334 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43493 +43494 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43756 +43758 +43766 +43767 +44005 +44006 +44008 +44009 +44013 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69633 +69634 +69688 +69703 +69759 +69762 +69811 +69815 +69817 +69819 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70464 +70465 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +70852 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94095 +94099 +113821 +113823 +119143 +119146 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +1536 +1542 +1632 +1642 +1643 +1645 +1757 +1758 +2274 +2275 +69216 +69247 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +10 +11 +13 +14 +28 +31 +133 +134 +8233 +8234 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +43 +44 +45 +46 +8314 +8316 +8330 +8332 +8722 +8723 +64297 +64298 +65122 +65124 +65291 +65292 +65293 +65294 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V44 +35 +38 +162 +166 +176 +178 +1423 +1424 +1545 +1547 +1642 +1643 +2546 +2548 +2555 +2556 +2801 +2802 +3065 +3066 +3647 +3648 +6107 +6108 +8240 +8245 +8352 +8400 +8494 +8495 +8723 +8724 +43064 +43066 +65119 +65120 +65129 +65131 +65283 +65286 +65504 +65506 +65509 +65511 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V42 +1544 +1545 +1547 +1548 +1549 +1550 +1563 +1611 +1645 +1648 +1649 +1750 +1765 +1767 +1774 +1776 +1786 +1809 +1810 +1840 +1867 +1958 +1969 +1984 +2144 +2160 +2208 +2260 +64336 +64830 +64832 +64976 +65008 +65021 +65022 +65024 +65136 +65279 +126464 +126704 +126706 +126720 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V80 +2367 +2368 +2382 +2383 +2495 +2496 +2503 +2505 +2623 +2624 +2751 +2752 +2887 +2888 +3014 +3017 +3398 +3401 +3545 +3546 +3547 +3548 +3903 +3904 +4145 +4146 +4228 +4229 +6081 +6084 +6681 +6682 +6741 +6742 +6766 +6771 +6974 +6976 +7078 +7079 +7207 +7209 +7220 +7222 +43450 +43452 +43567 +43569 +43572 +43573 +43755 +43756 +43758 +43759 +69809 +69810 +69932 +69933 +70068 +70069 +70369 +70370 +70471 +70473 +70710 +70711 +70833 +70834 +70841 +70842 +71088 +71089 +71096 +71097 +71342 +71343 +71462 +71463 +72881 +72882 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2892 +2893 +3549 +3550 +6079 +6080 +71099 +71100 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +3648 +3653 +3776 +3781 +6581 +6584 +6586 +6587 +43701 +43703 +43705 +43706 +43707 +43709 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V348 +2304 +2307 +2362 +2363 +2373 +2377 +2385 +2386 +2387 +2390 +2433 +2434 +2561 +2563 +2631 +2633 +2635 +2637 +2672 +2674 +2689 +2691 +2757 +2758 +2759 +2761 +2810 +2816 +2817 +2818 +2879 +2880 +2902 +2903 +2946 +2947 +3008 +3009 +3021 +3022 +3072 +3073 +3134 +3137 +3142 +3144 +3146 +3150 +3157 +3158 +3201 +3202 +3263 +3264 +3270 +3271 +3276 +3278 +3328 +3330 +3387 +3389 +3405 +3406 +3530 +3531 +3538 +3540 +3633 +3634 +3636 +3640 +3655 +3663 +3761 +3762 +3764 +3768 +3771 +3772 +3784 +3790 +3897 +3898 +3954 +3955 +3962 +3967 +3968 +3969 +3970 +3972 +3974 +3976 +4141 +4143 +4146 +4151 +4154 +4155 +4209 +4213 +4229 +4231 +4253 +4254 +5906 +5907 +5938 +5939 +5970 +5971 +6002 +6003 +6071 +6075 +6086 +6087 +6089 +6098 +6099 +6100 +6109 +6110 +6432 +6434 +6439 +6441 +6458 +6459 +6679 +6680 +6683 +6684 +6744 +6747 +6754 +6755 +6757 +6761 +6763 +6764 +6771 +6781 +6912 +6916 +6964 +6965 +6966 +6968 +6978 +6979 +7019 +7020 +7021 +7028 +7040 +7042 +7076 +7077 +7080 +7082 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7213 +7220 +7222 +7223 +7376 +7379 +7386 +7388 +7392 +7393 +7412 +7413 +7675 +7676 +43014 +43015 +43019 +43020 +43046 +43047 +43205 +43206 +43232 +43250 +43338 +43339 +43343 +43346 +43392 +43395 +43443 +43444 +43446 +43448 +43452 +43453 +43493 +43494 +43561 +43565 +43566 +43567 +43569 +43570 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43700 +43703 +43705 +43710 +43712 +43713 +43714 +43757 +43758 +44005 +44006 +68101 +68102 +68111 +68112 +68152 +68153 +69633 +69634 +69688 +69692 +69698 +69703 +69760 +69762 +69813 +69815 +69888 +69891 +69927 +69930 +69933 +69934 +69936 +69937 +69940 +69941 +70016 +70018 +70076 +70079 +70091 +70092 +70192 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70373 +70377 +70401 +70402 +70464 +70465 +70502 +70509 +70512 +70517 +70718 +70720 +70723 +70725 +70842 +70843 +70847 +70849 +71100 +71102 +71225 +71227 +71229 +71230 +71232 +71233 +71339 +71340 +71341 +71342 +71346 +71350 +71455 +71456 +71458 +71460 +71463 +71464 +71465 +71468 +72193 +72194 +72196 +72202 +72245 +72249 +72273 +72274 +72276 +72279 +72342 +72343 +72344 +72345 +72752 +72754 +72760 +72766 +72883 +72884 +72885 +72887 +73009 +73014 +73018 +73019 +73020 +73022 +73023 +73026 +73027 +73028 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +7380 +7381 +7394 +7401 +68097 +68098 +68102 +68103 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +2507 +2509 +2891 +2892 +3018 +3021 +3402 +3405 +3548 +3549 +3550 +3551 +6080 +6081 +6084 +6086 +6976 +6978 +70475 +70477 +70844 +70845 +70846 +70847 +71098 +71099 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V383 +0 +2304 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2404 +2433 +2436 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2530 +2532 +2561 +2564 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2672 +2674 +2677 +2678 +2689 +2692 +2748 +2749 +2750 +2758 +2759 +2762 +2763 +2766 +2786 +2788 +2810 +2816 +2817 +2820 +2876 +2877 +2878 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3072 +3076 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3204 +3260 +3261 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3298 +3300 +3328 +3332 +3387 +3389 +3390 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3426 +3428 +3458 +3460 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3632 +3643 +3648 +3654 +3655 +3663 +3760 +3770 +3771 +3773 +3776 +3781 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3953 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4139 +4153 +4154 +4156 +4157 +4159 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4240 +4250 +4254 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6070 +6098 +6099 +6100 +6109 +6110 +6432 +6444 +6448 +6460 +6576 +6593 +6600 +6602 +6679 +6684 +6741 +6751 +6753 +6781 +6783 +6784 +6912 +6917 +6964 +6981 +7019 +7028 +7040 +7043 +7073 +7083 +7084 +7086 +7142 +7156 +7204 +7224 +7376 +7379 +7380 +7401 +7405 +7406 +7412 +7413 +7415 +7416 +7675 +7676 +43014 +43015 +43019 +43020 +43043 +43048 +43136 +43138 +43188 +43206 +43232 +43250 +43307 +43310 +43335 +43348 +43392 +43396 +43443 +43457 +43493 +43494 +43561 +43575 +43587 +43588 +43596 +43598 +43643 +43646 +43696 +43712 +43713 +43714 +43755 +43760 +43765 +43766 +44003 +44011 +44012 +44014 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +69632 +69635 +69688 +69703 +69760 +69763 +69808 +69819 +69888 +69891 +69927 +69939 +69940 +69941 +70003 +70004 +70016 +70019 +70067 +70081 +70091 +70093 +70188 +70200 +70206 +70207 +70367 +70379 +70401 +70404 +70462 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70502 +70509 +70512 +70517 +70709 +70727 +70832 +70852 +71087 +71094 +71096 +71105 +71132 +71134 +71216 +71233 +71339 +71352 +71453 +71454 +71455 +71468 +72193 +72203 +72243 +72250 +72251 +72255 +72273 +72284 +72330 +72345 +72751 +72759 +72760 +72768 +72850 +72872 +72873 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73029 +73031 +73032 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V300 +2307 +2308 +2363 +2364 +2366 +2367 +2368 +2369 +2377 +2381 +2383 +2384 +2434 +2436 +2494 +2495 +2496 +2497 +2519 +2520 +2563 +2564 +2622 +2623 +2624 +2625 +2691 +2692 +2750 +2751 +2752 +2753 +2763 +2765 +2818 +2820 +2878 +2879 +2880 +2881 +3006 +3008 +3009 +3011 +3031 +3032 +3073 +3076 +3137 +3141 +3202 +3204 +3262 +3263 +3265 +3269 +3285 +3287 +3330 +3332 +3390 +3395 +3415 +3416 +3458 +3460 +3535 +3538 +3544 +3545 +3551 +3552 +3570 +3572 +3632 +3633 +3634 +3636 +3653 +3654 +3760 +3761 +3762 +3764 +3902 +3903 +3967 +3968 +4139 +4141 +4152 +4153 +4155 +4156 +4182 +4184 +4194 +4197 +4199 +4206 +4227 +4228 +4231 +4237 +4239 +4240 +4250 +4253 +6070 +6071 +6087 +6089 +6435 +6437 +6441 +6444 +6448 +6450 +6451 +6457 +6576 +6581 +6584 +6586 +6587 +6593 +6600 +6602 +6682 +6683 +6743 +6744 +6753 +6754 +6755 +6757 +6765 +6766 +6916 +6917 +6965 +6966 +6980 +6981 +7042 +7043 +7073 +7074 +7079 +7080 +7082 +7083 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7156 +7204 +7207 +7210 +7212 +7393 +7394 +7415 +7416 +43043 +43045 +43047 +43048 +43136 +43138 +43188 +43204 +43346 +43348 +43395 +43396 +43444 +43446 +43453 +43455 +43571 +43572 +43597 +43598 +43643 +43644 +43645 +43646 +43697 +43698 +43706 +43707 +43709 +43710 +43759 +43760 +43765 +43766 +44003 +44005 +44006 +44008 +44009 +44011 +44012 +44013 +69632 +69633 +69634 +69635 +69762 +69763 +69808 +69809 +69810 +69811 +69815 +69817 +70018 +70019 +70067 +70068 +70069 +70070 +70080 +70081 +70188 +70191 +70197 +70198 +70368 +70369 +70370 +70371 +70402 +70404 +70462 +70464 +70465 +70469 +70477 +70478 +70487 +70488 +70498 +70500 +70709 +70710 +70711 +70712 +70720 +70722 +70725 +70726 +70832 +70833 +70834 +70835 +70845 +70846 +70849 +70850 +71087 +71088 +71089 +71090 +71102 +71103 +71216 +71219 +71227 +71229 +71230 +71231 +71340 +71341 +71343 +71344 +71350 +71351 +71456 +71458 +72249 +72250 +72279 +72281 +72343 +72344 +72751 +72752 +72766 +72767 +72873 +72874 +72884 +72885 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V264 +2364 +2365 +2369 +2373 +2381 +2382 +2386 +2387 +2390 +2392 +2402 +2404 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2620 +2621 +2625 +2627 +2637 +2638 +2677 +2678 +2748 +2749 +2753 +2757 +2765 +2766 +2786 +2788 +2876 +2877 +2881 +2885 +2893 +2894 +2914 +2916 +3158 +3159 +3170 +3172 +3260 +3261 +3298 +3300 +3395 +3397 +3426 +3428 +3540 +3541 +3542 +3543 +3640 +3643 +3768 +3770 +3772 +3773 +3864 +3866 +3893 +3894 +3895 +3896 +3953 +3954 +3956 +3958 +3972 +3973 +3981 +3992 +3993 +4029 +4038 +4039 +4143 +4145 +4151 +4152 +4157 +4159 +4184 +4186 +4190 +4193 +4226 +4227 +4237 +4238 +5907 +5909 +5939 +5941 +5971 +5972 +6003 +6004 +6075 +6078 +6434 +6435 +6450 +6451 +6457 +6458 +6459 +6460 +6680 +6681 +6742 +6743 +6747 +6751 +6761 +6763 +6764 +6765 +6783 +6784 +6968 +6971 +7020 +7021 +7074 +7076 +7077 +7078 +7084 +7086 +7212 +7213 +7223 +7224 +7381 +7386 +7388 +7392 +7405 +7406 +43045 +43046 +43204 +43205 +43307 +43310 +43335 +43338 +43339 +43343 +43448 +43450 +43565 +43566 +43570 +43571 +43573 +43575 +43700 +43701 +43756 +43757 +44008 +44009 +44013 +44014 +68098 +68100 +68108 +68111 +68153 +68155 +69692 +69698 +69811 +69813 +69817 +69819 +69930 +69932 +69937 +69939 +70003 +70004 +70070 +70076 +70092 +70093 +70191 +70192 +70371 +70373 +70377 +70379 +70712 +70718 +70722 +70723 +70726 +70727 +70835 +70841 +70850 +70852 +71090 +71094 +71103 +71105 +71132 +71134 +71219 +71225 +71231 +71232 +71344 +71346 +71351 +71352 +71453 +71454 +71460 +71462 +71464 +71465 +72194 +72196 +72202 +72203 +72243 +72245 +72251 +72255 +72274 +72276 +72281 +72284 +72330 +72342 +72754 +72759 +72767 +72768 +72850 +72872 +72874 +72881 +72882 +72883 +73014 +73015 +73026 +73027 +73028 +73029 +73031 +73032 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +2761 +2762 +2903 +2904 +3264 +3265 +3271 +3273 +3274 +3276 +6437 +6439 +6979 +6980 +70079 +70080 +70194 +70196 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +3144 +3145 +3955 +3956 +3958 +3962 +3969 +3970 +6972 +6973 +69934 +69936 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +2888 +2889 +3546 +3547 +6078 +6079 +7209 +7210 +70843 +70844 +71097 +71098 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +34 +35 +39 +40 +171 +172 +187 +188 +8216 +8218 +8219 +8222 +8223 +8224 +8249 +8251 +10075 +10081 +11776 +11790 +11804 +11806 +11808 +11810 +128630 +128633 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V164 +125 +126 +3899 +3900 +3901 +3902 +5788 +5789 +8262 +8263 +8318 +8319 +8334 +8335 +8969 +8970 +8971 +8972 +9002 +9003 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10102 +10182 +10183 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10224 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10649 +10713 +10714 +10715 +10716 +10749 +10750 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11818 +12289 +12291 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12306 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12316 +12318 +12320 +64830 +64831 +65041 +65043 +65048 +65049 +65078 +65079 +65080 +65081 +65082 +65083 +65084 +65085 +65086 +65087 +65088 +65089 +65090 +65091 +65092 +65093 +65096 +65097 +65104 +65105 +65106 +65107 +65114 +65115 +65116 +65117 +65118 +65119 +65289 +65290 +65292 +65293 +65294 +65295 +65341 +65342 +65373 +65374 +65376 +65378 +65379 +65381 +78427 +78430 +78466 +78467 +78471 +78472 +78473 +78474 +78714 +78716 +83407 +83408 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +160 +161 +847 +848 +860 +867 +3848 +3849 +3852 +3853 +3858 +3859 +4057 +4059 +6158 +6159 +8199 +8200 +8209 +8210 +8239 +8240 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V84 +3585 +3643 +3648 +3663 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3804 +3808 +4096 +4160 +4176 +4240 +4250 +4256 +6016 +6100 +6103 +6104 +6108 +6110 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6618 +6619 +6622 +6624 +6688 +6751 +6752 +6781 +6816 +6830 +43488 +43504 +43514 +43519 +43616 +43715 +43739 +43744 +71424 +71450 +71453 +71468 +71482 +71484 +71487 +71488 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V44 +36 +37 +43 +44 +92 +93 +163 +166 +177 +178 +1423 +1424 +2555 +2556 +2801 +2802 +3065 +3066 +3647 +3648 +6107 +6108 +8352 +8359 +8360 +8374 +8375 +8379 +8380 +8382 +8383 +8400 +8470 +8471 +8722 +8724 +65129 +65130 +65284 +65285 +65505 +65506 +65509 +65511 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V48 +33 +34 +63 +64 +1478 +1479 +1563 +1564 +1566 +1568 +1748 +1749 +2041 +2042 +3853 +3858 +3860 +3861 +6146 +6148 +6152 +6154 +6468 +6470 +10082 +10084 +11513 +11514 +11518 +11519 +11822 +11823 +42510 +42511 +43126 +43128 +65045 +65047 +65110 +65112 +65281 +65282 +65311 +65312 +71108 +71110 +72817 +72818 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1215 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +57344 +63744 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +131070 +131072 +196606 +196608 +262142 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V168 +40 +41 +91 +92 +123 +124 +161 +162 +191 +192 +3898 +3899 +3900 +3901 +5787 +5788 +8218 +8219 +8222 +8223 +8261 +8262 +8317 +8318 +8333 +8334 +8968 +8969 +8970 +8971 +9001 +9002 +10088 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10181 +10182 +10214 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10627 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10712 +10713 +10714 +10715 +10748 +10749 +11800 +11801 +11810 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11842 +11843 +12296 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12308 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12317 +12318 +64831 +64832 +65047 +65048 +65077 +65078 +65079 +65080 +65081 +65082 +65083 +65084 +65085 +65086 +65087 +65088 +65089 +65090 +65091 +65092 +65095 +65096 +65113 +65114 +65115 +65116 +65117 +65118 +65288 +65289 +65339 +65340 +65371 +65372 +65375 +65376 +65378 +65379 +78424 +78427 +78470 +78471 +78472 +78473 +78713 +78714 +83406 +83407 +125278 +125280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V320 +8986 +8988 +9200 +9204 +9728 +9732 +9748 +9750 +9752 +9753 +9754 +9757 +9758 +9760 +9785 +9788 +9832 +9833 +9855 +9856 +9917 +9929 +9933 +9934 +9935 +9938 +9939 +9941 +9944 +9946 +9948 +9949 +9951 +9954 +9962 +9963 +9969 +9974 +9975 +9977 +9978 +9979 +9981 +9989 +9992 +9994 +10084 +10085 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12291 +12293 +12294 +12296 +12306 +12308 +12320 +12330 +12336 +12341 +12342 +12347 +12349 +12352 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12387 +12388 +12419 +12420 +12421 +12422 +12423 +12424 +12430 +12431 +12437 +12447 +12448 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12483 +12484 +12515 +12516 +12517 +12518 +12519 +12520 +12526 +12527 +12533 +12535 +12539 +12543 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12800 +12831 +12832 +12872 +12880 +13055 +13056 +19904 +19968 +40981 +40982 +42125 +42128 +42183 +63744 +64256 +65072 +65077 +65093 +65095 +65097 +65104 +65105 +65106 +65112 +65113 +65119 +65127 +65128 +65129 +65131 +65132 +65282 +65284 +65286 +65288 +65290 +65292 +65293 +65294 +65295 +65306 +65308 +65311 +65312 +65339 +65340 +65341 +65342 +65371 +65372 +65373 +65374 +65375 +65382 +65383 +65393 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65506 +65509 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +126976 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127488 +127877 +127878 +127900 +127902 +127925 +127927 +127932 +127933 +127938 +127941 +127943 +127944 +127946 +127949 +127995 +128000 +128066 +128068 +128070 +128081 +128102 +128106 +128110 +128111 +128112 +128121 +128124 +128125 +128129 +128132 +128133 +128136 +128160 +128161 +128162 +128163 +128164 +128165 +128170 +128171 +128175 +128176 +128177 +128179 +128256 +128263 +128279 +128293 +128306 +128330 +128372 +128374 +128378 +128379 +128400 +128401 +128405 +128407 +128468 +128476 +128500 +128506 +128581 +128584 +128587 +128640 +128675 +128676 +128692 +128695 +128704 +128705 +128716 +128717 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129304 +129309 +129310 +129312 +129318 +129319 +129328 +129338 +129341 +129343 +129489 +129502 +131070 +131072 +196606 +196608 +262142 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +6102 +6103 +8252 +8254 +8263 +8266 +12293 +12294 +12316 +12317 +12347 +12349 +12443 +12447 +12448 +12449 +12539 +12540 +12541 +12543 +40981 +40982 +65108 +65110 +65306 +65308 +65381 +65382 +65438 +65440 +94176 +94178 +128633 +128636 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V40 +37 +38 +162 +163 +176 +177 +1545 +1548 +1642 +1643 +2546 +2548 +2553 +2554 +3449 +3450 +8240 +8248 +8359 +8360 +8374 +8375 +8379 +8380 +8382 +8383 +8451 +8452 +8457 +8458 +43064 +43065 +65020 +65021 +65130 +65131 +65285 +65286 +65504 +65505 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +8228 +8231 +8943 +8944 +65049 +65050 +68342 +68343 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V50 +12353 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12387 +12388 +12419 +12420 +12421 +12422 +12423 +12424 +12430 +12431 +12437 +12439 +12449 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12483 +12484 +12515 +12516 +12517 +12518 +12519 +12520 +12526 +12527 +12533 +12535 +12540 +12541 +12784 +12800 +65383 +65393 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V218 +167 +169 +170 +171 +178 +180 +182 +187 +188 +191 +215 +216 +247 +248 +711 +712 +713 +716 +717 +718 +720 +721 +728 +732 +733 +734 +8213 +8215 +8224 +8226 +8251 +8252 +8308 +8309 +8319 +8320 +8321 +8325 +8453 +8454 +8467 +8468 +8481 +8483 +8491 +8492 +8532 +8534 +8539 +8540 +8542 +8543 +8544 +8556 +8560 +8570 +8585 +8586 +8592 +8602 +8658 +8659 +8660 +8661 +8704 +8705 +8706 +8708 +8711 +8713 +8715 +8716 +8719 +8720 +8721 +8722 +8725 +8726 +8730 +8731 +8733 +8737 +8739 +8740 +8741 +8742 +8743 +8749 +8750 +8751 +8756 +8760 +8764 +8766 +8776 +8777 +8780 +8781 +8786 +8787 +8800 +8802 +8804 +8808 +8810 +8812 +8814 +8816 +8834 +8836 +8838 +8840 +8853 +8854 +8857 +8858 +8869 +8870 +8895 +8896 +8978 +8979 +9312 +9471 +9472 +9548 +9552 +9589 +9600 +9616 +9618 +9622 +9632 +9634 +9635 +9642 +9650 +9652 +9654 +9656 +9660 +9662 +9664 +9666 +9670 +9673 +9675 +9676 +9678 +9682 +9698 +9702 +9711 +9712 +9733 +9735 +9737 +9738 +9742 +9744 +9750 +9752 +9792 +9793 +9794 +9795 +9824 +9826 +9827 +9830 +9831 +9832 +9833 +9835 +9836 +9838 +9839 +9840 +9886 +9888 +9929 +9933 +9938 +9939 +9941 +9944 +9946 +9948 +9949 +9951 +9955 +9956 +9960 +9962 +9963 +9969 +9974 +9975 +9979 +9981 +10071 +10072 +10102 +10132 +11093 +11098 +12872 +12880 +65533 +65534 +127232 +127245 +127248 +127278 +127280 +127338 +127344 +127405 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V184 +9 +10 +124 +125 +173 +174 +1418 +1419 +1470 +1471 +2404 +2406 +3674 +3676 +3851 +3852 +3892 +3893 +3967 +3968 +3973 +3974 +4030 +4032 +4050 +4051 +4170 +4172 +4961 +4962 +5120 +5121 +5760 +5761 +5867 +5870 +5941 +5943 +6100 +6102 +6104 +6105 +6106 +6107 +6148 +6150 +7002 +7004 +7005 +7009 +7227 +7232 +7294 +7296 +8192 +8199 +8200 +8203 +8208 +8209 +8210 +8212 +8231 +8232 +8278 +8279 +8280 +8284 +8285 +8288 +11514 +11517 +11519 +11520 +11632 +11633 +11790 +11798 +11799 +11800 +11801 +11802 +11818 +11822 +11824 +11826 +11827 +11829 +11836 +11839 +11840 +11842 +11843 +11850 +12288 +12289 +42238 +42240 +42509 +42510 +42511 +42512 +42739 +42744 +43214 +43216 +43310 +43312 +43463 +43466 +43613 +43616 +43760 +43762 +44011 +44012 +65792 +65795 +66463 +66464 +66512 +66513 +67671 +67672 +67871 +67872 +68176 +68184 +68336 +68342 +68409 +68416 +69703 +69705 +69822 +69826 +69952 +69956 +70085 +70087 +70088 +70089 +70109 +70112 +70200 +70202 +70203 +70205 +70313 +70314 +70731 +70735 +70747 +70748 +71106 +71108 +71113 +71128 +71233 +71235 +71484 +71487 +72257 +72261 +72346 +72349 +72353 +72355 +72769 +72774 +74864 +74869 +92782 +92784 +92917 +92918 +92983 +92986 +92996 +92997 +113823 +113824 +121479 +121483 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V502 +0 +9 +14 +32 +127 +133 +134 +160 +768 +847 +848 +860 +867 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1564 +1565 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2404 +2433 +2436 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2530 +2532 +2561 +2564 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2692 +2748 +2749 +2750 +2758 +2759 +2762 +2763 +2766 +2786 +2788 +2810 +2816 +2817 +2820 +2876 +2877 +2878 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3072 +3076 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3204 +3260 +3261 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3298 +3300 +3328 +3332 +3387 +3389 +3390 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3426 +3428 +3458 +3460 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6444 +6448 +6460 +6679 +6684 +6783 +6784 +6832 +6847 +6912 +6917 +6964 +6981 +7019 +7028 +7040 +7043 +7073 +7086 +7142 +7156 +7204 +7224 +7376 +7379 +7380 +7401 +7405 +7406 +7410 +7413 +7415 +7418 +7616 +7674 +7675 +7680 +8204 +8205 +8206 +8208 +8234 +8239 +8294 +8304 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12341 +12342 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43048 +43136 +43138 +43188 +43206 +43232 +43250 +43302 +43310 +43335 +43348 +43392 +43396 +43443 +43457 +43561 +43575 +43587 +43588 +43596 +43598 +43755 +43760 +43765 +43767 +44003 +44011 +44012 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +65529 +65532 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69632 +69635 +69688 +69703 +69759 +69763 +69808 +69819 +69888 +69891 +69927 +69941 +70003 +70004 +70016 +70019 +70067 +70081 +70090 +70093 +70188 +70200 +70206 +70207 +70367 +70379 +70400 +70404 +70460 +70461 +70462 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70502 +70509 +70512 +70517 +70709 +70727 +70832 +70852 +71087 +71094 +71096 +71105 +71132 +71134 +71216 +71233 +71339 +71352 +72193 +72203 +72243 +72250 +72251 +72255 +72263 +72264 +72273 +72284 +72330 +72346 +72751 +72759 +72760 +72768 +72850 +72872 +72873 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94033 +94079 +94095 +94099 +113821 +113823 +113824 +113828 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V64 +9757 +9758 +9977 +9978 +9994 +9998 +127877 +127878 +127938 +127941 +127943 +127944 +127946 +127949 +128066 +128068 +128070 +128081 +128102 +128106 +128110 +128111 +128112 +128121 +128124 +128125 +128129 +128132 +128133 +128136 +128170 +128171 +128372 +128374 +128378 +128379 +128400 +128401 +128405 +128407 +128581 +128584 +128587 +128592 +128675 +128676 +128692 +128695 +128704 +128705 +128716 +128717 +129304 +129309 +129310 +129312 +129318 +129319 +129328 +129338 +129341 +129343 +129489 +129502 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +44 +45 +46 +47 +58 +60 +894 +895 +1417 +1418 +1548 +1550 +2040 +2041 +8260 +8261 +65040 +65041 +65043 +65045 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1442 +35 +36 +38 +39 +42 +43 +60 +63 +64 +91 +94 +123 +126 +127 +166 +167 +169 +170 +172 +173 +174 +176 +181 +182 +192 +215 +216 +247 +248 +711 +718 +720 +721 +728 +732 +733 +734 +735 +736 +768 +880 +888 +890 +894 +895 +896 +900 +907 +908 +909 +910 +930 +931 +1155 +1162 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1421 +1423 +1472 +1473 +1475 +1476 +1523 +1525 +1536 +1545 +1550 +1552 +1568 +1611 +1645 +1648 +1649 +1748 +1749 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1776 +1786 +1806 +1807 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2040 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2096 +2111 +2112 +2137 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2274 +2275 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2416 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2548 +2553 +2554 +2555 +2556 +2558 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2800 +2801 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2928 +2936 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3056 +3065 +3066 +3067 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3192 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3408 +3412 +3415 +3416 +3426 +3440 +3449 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3572 +3573 +3663 +3664 +3840 +3841 +3845 +3846 +3859 +3860 +3861 +3864 +3866 +3872 +3882 +3892 +3894 +3895 +3896 +3897 +3904 +3912 +3913 +3949 +3976 +3981 +4032 +4038 +4039 +4045 +4046 +4048 +4052 +4057 +4172 +4176 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4352 +4608 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4960 +4961 +4962 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5121 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6105 +6106 +6128 +6138 +6144 +6146 +6151 +6152 +6154 +6155 +6176 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6464 +6465 +6624 +6679 +6686 +6688 +6917 +6964 +6981 +6988 +7004 +7005 +7009 +7019 +7028 +7037 +7043 +7073 +7086 +7088 +7098 +7142 +7164 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7360 +7368 +7379 +7380 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8189 +8190 +8191 +8215 +8216 +8226 +8228 +8248 +8249 +8254 +8260 +8266 +8278 +8279 +8280 +8284 +8285 +8289 +8293 +8304 +8306 +8309 +8317 +8320 +8321 +8325 +8333 +8336 +8349 +8448 +8451 +8452 +8453 +8454 +8457 +8458 +8467 +8468 +8470 +8471 +8481 +8483 +8491 +8492 +8532 +8534 +8539 +8540 +8542 +8543 +8544 +8556 +8560 +8570 +8585 +8586 +8588 +8602 +8658 +8659 +8660 +8661 +8704 +8705 +8706 +8708 +8711 +8713 +8715 +8716 +8719 +8720 +8721 +8724 +8725 +8726 +8730 +8731 +8733 +8737 +8739 +8740 +8741 +8742 +8743 +8749 +8750 +8751 +8756 +8760 +8764 +8766 +8776 +8777 +8780 +8781 +8786 +8787 +8800 +8802 +8804 +8808 +8810 +8812 +8814 +8816 +8834 +8836 +8838 +8840 +8853 +8854 +8857 +8858 +8869 +8870 +8895 +8896 +8943 +8944 +8968 +8972 +8978 +8979 +8986 +8988 +9001 +9003 +9200 +9204 +9255 +9280 +9291 +9471 +9472 +9548 +9552 +9589 +9600 +9616 +9618 +9622 +9632 +9634 +9635 +9642 +9650 +9652 +9654 +9656 +9660 +9662 +9664 +9666 +9670 +9673 +9675 +9676 +9678 +9682 +9698 +9702 +9711 +9712 +9728 +9732 +9733 +9735 +9737 +9738 +9742 +9744 +9748 +9753 +9754 +9760 +9785 +9788 +9792 +9793 +9794 +9795 +9824 +9826 +9827 +9830 +9831 +9835 +9836 +9838 +9839 +9840 +9855 +9856 +9886 +9888 +9917 +9934 +9935 +9954 +9955 +9956 +9960 +9989 +9992 +9998 +10071 +10072 +10075 +10081 +10082 +10085 +10088 +10132 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11093 +11098 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11503 +11506 +11508 +11517 +11518 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11798 +11799 +11802 +11804 +11806 +11808 +11823 +11824 +11826 +11827 +11829 +11834 +11839 +11840 +19904 +19968 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +42739 +42752 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43048 +43052 +43056 +43064 +43065 +43066 +43072 +43124 +43138 +43188 +43250 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43359 +43360 +43396 +43443 +43457 +43463 +43466 +43470 +43471 +43472 +43486 +43488 +43520 +43561 +43584 +43587 +43588 +43596 +43612 +43613 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44003 +64256 +64263 +64275 +64280 +64297 +64298 +64336 +64450 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65021 +65022 +65136 +65141 +65142 +65277 +65512 +65519 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66045 +66176 +66205 +66208 +66257 +66273 +66300 +66304 +66340 +66349 +66379 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67672 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67872 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68160 +68168 +68184 +68185 +68192 +68256 +68288 +68325 +68331 +68336 +68352 +68406 +68416 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69635 +69688 +69705 +69710 +69714 +69734 +69763 +69808 +69819 +69822 +69840 +69865 +69891 +69927 +69968 +70003 +70004 +70005 +70006 +70007 +70019 +70067 +70081 +70085 +70087 +70088 +70089 +70090 +70093 +70094 +70106 +70107 +70108 +70109 +70113 +70133 +70144 +70162 +70163 +70188 +70202 +70203 +70205 +70206 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70735 +70736 +70749 +70750 +70784 +70832 +70852 +70856 +71040 +71087 +71110 +71113 +71128 +71132 +71168 +71216 +71235 +71237 +71296 +71339 +71840 +71904 +71914 +71923 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72256 +72257 +72262 +72263 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72794 +72813 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78424 +78430 +78466 +78467 +78470 +78474 +78713 +78716 +78895 +82944 +83406 +83408 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92986 +92996 +92997 +92998 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113821 +118784 +119030 +119040 +119079 +119081 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119273 +119296 +119362 +119365 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121479 +121483 +121484 +124928 +125125 +125127 +125136 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +127278 +127279 +127338 +127340 +127900 +127902 +127925 +127927 +127932 +127933 +128160 +128161 +128162 +128163 +128164 +128165 +128175 +128176 +128177 +128179 +128256 +128263 +128279 +128293 +128306 +128330 +128468 +128476 +128500 +128506 +128592 +128630 +128636 +128640 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V42 +180 +181 +712 +713 +716 +717 +735 +736 +3841 +3845 +3846 +3848 +3849 +3851 +4048 +4050 +4051 +4052 +6150 +6151 +8189 +8190 +43124 +43126 +43260 +43261 +70005 +70006 +70107 +70108 +71105 +71106 +71264 +71277 +72255 +72256 +72261 +72262 +72350 +72353 +72816 +72817 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V11 +0 +4352 +4608 +43360 +43389 +44032 +55204 +55216 +55239 +55243 +55292 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V120 +40 +41 +91 +92 +123 +124 +3898 +3899 +3900 +3901 +5787 +5788 +8261 +8262 +8317 +8318 +8333 +8334 +8968 +8969 +8970 +8971 +9001 +9002 +10088 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10181 +10182 +10214 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10627 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10712 +10713 +10714 +10715 +10748 +10749 +11810 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +12296 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12308 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +65113 +65114 +65115 +65116 +65117 +65118 +65288 +65289 +65339 +65340 +65371 +65372 +65375 +65376 +65378 +65379 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V59 +0 +40 +42 +91 +92 +93 +94 +123 +124 +125 +126 +3898 +3902 +5787 +5789 +8261 +8263 +8317 +8319 +8333 +8335 +8968 +8972 +9001 +9003 +10088 +10102 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11810 +11818 +12296 +12306 +12308 +12316 +65113 +65119 +65288 +65290 +65339 +65340 +65341 +65342 +65371 +65372 +65373 +65374 +65375 +65377 +65378 +65380 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V120 +41 +42 +93 +94 +125 +126 +3899 +3900 +3901 +3902 +5788 +5789 +8262 +8263 +8318 +8319 +8334 +8335 +8969 +8970 +8971 +8972 +9002 +9003 +10089 +10090 +10091 +10092 +10093 +10094 +10095 +10096 +10097 +10098 +10099 +10100 +10101 +10102 +10182 +10183 +10215 +10216 +10217 +10218 +10219 +10220 +10221 +10222 +10223 +10224 +10628 +10629 +10630 +10631 +10632 +10633 +10634 +10635 +10636 +10637 +10638 +10639 +10640 +10641 +10642 +10643 +10644 +10645 +10646 +10647 +10648 +10649 +10713 +10714 +10715 +10716 +10749 +10750 +11811 +11812 +11813 +11814 +11815 +11816 +11817 +11818 +12297 +12298 +12299 +12300 +12301 +12302 +12303 +12304 +12305 +12306 +12309 +12310 +12311 +12312 +12313 +12314 +12315 +12316 +65114 +65115 +65116 +65117 +65118 +65119 +65289 +65290 +65341 +65342 +65373 +65374 +65376 +65377 +65379 +65380 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +45 +46 +173 +174 +1418 +1419 +6150 +6151 +8208 +8210 +11799 +11800 +12539 +12540 +65123 +65124 +65293 +65294 +65381 +65382 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V175 +0 +167 +168 +169 +170 +174 +175 +177 +178 +188 +191 +215 +216 +247 +248 +746 +748 +4352 +4608 +5121 +5760 +6320 +6400 +8214 +8215 +8224 +8226 +8240 +8242 +8251 +8253 +8258 +8259 +8263 +8266 +8273 +8274 +8293 +8294 +8413 +8417 +8418 +8421 +8448 +8450 +8451 +8458 +8463 +8464 +8467 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8501 +8512 +8517 +8523 +8524 +8526 +8527 +8586 +8588 +8592 +8734 +8735 +8756 +8758 +8960 +8968 +8972 +8992 +8996 +9004 +9085 +9115 +9150 +9166 +9167 +9168 +9169 +9180 +9186 +9251 +9252 +9472 +9632 +9754 +9760 +10088 +10102 +10132 +11026 +11056 +11088 +11098 +11192 +11218 +11219 +11244 +11248 +11264 +11904 +42192 +43360 +43392 +44032 +55296 +57344 +64256 +65040 +65056 +65072 +65097 +65104 +65112 +65113 +65123 +65127 +65136 +65281 +65293 +65294 +65308 +65311 +65377 +65504 +65512 +65520 +65529 +65532 +65534 +67968 +68000 +71040 +71168 +72192 +72368 +77824 +78896 +82944 +83584 +94176 +101120 +110592 +110896 +110960 +111360 +118784 +119296 +119552 +119680 +120832 +121520 +126976 +129024 +129280 +129536 +131072 +196606 +196608 +262142 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +9001 +9003 +12296 +12306 +12308 +12320 +12336 +12337 +12448 +12449 +12540 +12541 +65113 +65119 +65288 +65290 +65306 +65308 +65339 +65340 +65341 +65342 +65343 +65344 +65371 +65377 +65507 +65508 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V252 +167 +168 +169 +170 +174 +175 +177 +178 +188 +191 +215 +216 +247 +248 +746 +748 +4352 +4608 +5121 +5760 +6320 +6400 +8214 +8215 +8224 +8226 +8240 +8242 +8251 +8253 +8258 +8259 +8263 +8266 +8273 +8274 +8293 +8294 +8413 +8417 +8418 +8421 +8448 +8450 +8451 +8458 +8463 +8464 +8467 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8501 +8512 +8517 +8523 +8524 +8526 +8527 +8586 +8588 +8592 +8734 +8735 +8756 +8758 +8960 +8968 +8972 +8992 +8996 +9001 +9003 +9004 +9085 +9115 +9150 +9166 +9167 +9168 +9169 +9180 +9186 +9251 +9252 +9472 +9632 +9754 +9760 +10088 +10102 +10132 +11026 +11056 +11088 +11098 +11192 +11218 +11219 +11244 +11248 +11264 +11904 +12289 +12291 +12296 +12306 +12308 +12320 +12336 +12337 +12353 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12387 +12388 +12419 +12420 +12421 +12422 +12423 +12424 +12430 +12431 +12437 +12439 +12443 +12445 +12448 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12483 +12484 +12515 +12516 +12517 +12518 +12519 +12520 +12526 +12527 +12533 +12535 +12540 +12541 +12583 +12584 +12784 +12800 +13056 +13144 +13179 +13184 +42192 +43360 +43392 +44032 +55296 +57344 +64256 +65040 +65056 +65072 +65097 +65107 +65112 +65119 +65123 +65127 +65136 +65282 +65288 +65290 +65292 +65295 +65306 +65312 +65339 +65340 +65341 +65342 +65343 +65344 +65371 +65504 +65507 +65508 +65512 +65520 +65529 +65532 +65534 +67968 +68000 +71040 +71168 +72192 +72368 +77824 +78896 +82944 +83584 +94176 +101120 +110592 +110896 +110960 +111360 +118784 +119296 +119552 +119680 +120832 +121520 +126976 +127488 +127490 +129024 +129280 +129536 +131072 +196606 +196608 +262142 +983040 +1048574 +1048576 +1114110 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V68 +12289 +12291 +12353 +12354 +12355 +12356 +12357 +12358 +12359 +12360 +12361 +12362 +12387 +12388 +12419 +12420 +12421 +12422 +12423 +12424 +12430 +12431 +12437 +12439 +12443 +12445 +12449 +12450 +12451 +12452 +12453 +12454 +12455 +12456 +12457 +12458 +12483 +12484 +12515 +12516 +12517 +12518 +12519 +12520 +12526 +12527 +12533 +12535 +12583 +12584 +12784 +12800 +13056 +13144 +13179 +13184 +65104 +65107 +65281 +65282 +65292 +65293 +65294 +65295 +65311 +65312 +127488 +127490 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V42 +45 +46 +1418 +1419 +1470 +1471 +5120 +5121 +6150 +6151 +8208 +8214 +8275 +8276 +8315 +8316 +8331 +8332 +8722 +8723 +11799 +11800 +11802 +11803 +11834 +11836 +11840 +11841 +12316 +12317 +12336 +12337 +12448 +12449 +65073 +65075 +65112 +65113 +65123 +65124 +65293 +65294 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V222 +40 +42 +60 +61 +62 +63 +91 +92 +93 +94 +123 +124 +125 +126 +171 +172 +187 +188 +3898 +3902 +5787 +5789 +8249 +8251 +8261 +8263 +8317 +8319 +8333 +8335 +8512 +8513 +8705 +8709 +8712 +8718 +8721 +8722 +8725 +8727 +8730 +8734 +8735 +8739 +8740 +8741 +8742 +8743 +8747 +8756 +8761 +8762 +8763 +8781 +8786 +8790 +8799 +8801 +8802 +8803 +8804 +8812 +8814 +8845 +8847 +8851 +8856 +8857 +8866 +8868 +8870 +8889 +8894 +8896 +8905 +8910 +8912 +8914 +8918 +8942 +8944 +8960 +8968 +8972 +8992 +8994 +9001 +9003 +10088 +10102 +10176 +10177 +10179 +10183 +10184 +10186 +10187 +10190 +10195 +10199 +10204 +10207 +10210 +10224 +10627 +10649 +10651 +10672 +10680 +10681 +10688 +10694 +10697 +10698 +10702 +10707 +10708 +10710 +10712 +10717 +10721 +10722 +10723 +10726 +10728 +10730 +10740 +10746 +10748 +10750 +10762 +10781 +10782 +10786 +10788 +10789 +10790 +10791 +10793 +10794 +10795 +10799 +10804 +10806 +10812 +10815 +10839 +10841 +10852 +10854 +10858 +10862 +10863 +10865 +10867 +10869 +10873 +10916 +10918 +10926 +10927 +10967 +10972 +10973 +10974 +10975 +10978 +10983 +10988 +10991 +10995 +10996 +10999 +11004 +11005 +11006 +11778 +11782 +11785 +11787 +11788 +11790 +11804 +11806 +11808 +11818 +12296 +12306 +12308 +12316 +65113 +65119 +65124 +65126 +65288 +65290 +65308 +65309 +65310 +65311 +65339 +65340 +65341 +65342 +65371 +65372 +65373 +65374 +65375 +65377 +65378 +65380 +120539 +120540 +120597 +120598 +120655 +120656 +120713 +120714 +120771 +120772 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +48 +58 +65 +71 +97 +103 +65296 +65306 +65313 +65319 +65345 +65351 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1582 +32 +127 +160 +173 +174 +768 +880 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1155 +1162 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1488 +1515 +1520 +1525 +1542 +1552 +1563 +1564 +1566 +1611 +1632 +1648 +1649 +1750 +1758 +1759 +1765 +1767 +1769 +1770 +1774 +1806 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1984 +2027 +2036 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2096 +2111 +2112 +2137 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2495 +2497 +2503 +2505 +2507 +2509 +2510 +2511 +2524 +2526 +2527 +2530 +2534 +2558 +2563 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2622 +2625 +2649 +2653 +2654 +2655 +2662 +2672 +2674 +2677 +2691 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2753 +2761 +2762 +2763 +2765 +2768 +2769 +2784 +2786 +2790 +2802 +2809 +2810 +2818 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2880 +2881 +2887 +2889 +2891 +2893 +2908 +2910 +2911 +2914 +2918 +2936 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3007 +3008 +3009 +3011 +3014 +3017 +3018 +3021 +3024 +3025 +3046 +3067 +3073 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3137 +3141 +3160 +3163 +3168 +3170 +3174 +3184 +3192 +3201 +3202 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3263 +3264 +3266 +3267 +3269 +3271 +3273 +3274 +3276 +3294 +3295 +3296 +3298 +3302 +3312 +3313 +3315 +3330 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3391 +3393 +3398 +3401 +3402 +3405 +3406 +3408 +3412 +3415 +3416 +3426 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3536 +3538 +3544 +3551 +3558 +3568 +3570 +3573 +3585 +3633 +3634 +3636 +3647 +3655 +3663 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3764 +3773 +3774 +3776 +3781 +3782 +3783 +3792 +3802 +3804 +3808 +3840 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3912 +3913 +3949 +3967 +3968 +3973 +3974 +3976 +3981 +4030 +4038 +4039 +4045 +4046 +4059 +4096 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4960 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5941 +5943 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6109 +6112 +6122 +6128 +6138 +6144 +6155 +6160 +6170 +6176 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6435 +6439 +6441 +6444 +6448 +6450 +6451 +6457 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6679 +6681 +6683 +6686 +6742 +6743 +6744 +6753 +6754 +6755 +6757 +6765 +6771 +6784 +6794 +6800 +6810 +6816 +6830 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +6988 +6992 +7019 +7028 +7037 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7156 +7164 +7212 +7220 +7222 +7227 +7242 +7245 +7305 +7360 +7368 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8203 +8208 +8232 +8239 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11503 +11506 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11776 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12330 +12336 +12352 +12353 +12439 +12443 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +42744 +42752 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43052 +43056 +43066 +43072 +43128 +43136 +43204 +43214 +43226 +43250 +43262 +43264 +43302 +43310 +43335 +43346 +43348 +43359 +43389 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43470 +43471 +43482 +43486 +43493 +43494 +43519 +43520 +43561 +43567 +43569 +43571 +43573 +43584 +43587 +43588 +43596 +43597 +43598 +43600 +43610 +43612 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43756 +43758 +43766 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44005 +44006 +44008 +44009 +44013 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65040 +65050 +65072 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65281 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65532 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66045 +66176 +66205 +66208 +66257 +66273 +66300 +66304 +66340 +66349 +66379 +66384 +66422 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68160 +68168 +68176 +68185 +68192 +68256 +68288 +68325 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69633 +69634 +69688 +69703 +69710 +69714 +69744 +69762 +69811 +69815 +69817 +69819 +69821 +69822 +69826 +69840 +69865 +69872 +69882 +69891 +69927 +69932 +69933 +69942 +69956 +69968 +70003 +70004 +70007 +70018 +70070 +70079 +70090 +70093 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70367 +70368 +70371 +70384 +70394 +70402 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70463 +70464 +70465 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70493 +70500 +70656 +70712 +70720 +70722 +70725 +70726 +70727 +70746 +70747 +70748 +70749 +70750 +70784 +70832 +70833 +70835 +70841 +70842 +70843 +70845 +70846 +70847 +70849 +70850 +70852 +70856 +70864 +70874 +71040 +71087 +71088 +71090 +71096 +71100 +71102 +71103 +71105 +71132 +71168 +71219 +71227 +71229 +71230 +71231 +71233 +71237 +71248 +71258 +71264 +71277 +71296 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71360 +71370 +71424 +71450 +71456 +71458 +71462 +71463 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72272 +72273 +72279 +72281 +72284 +72324 +72326 +72330 +72343 +72344 +72346 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72752 +72766 +72767 +72768 +72774 +72784 +72813 +72816 +72848 +72873 +72874 +72881 +72882 +72884 +72885 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92917 +92918 +92928 +92976 +92983 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113821 +113823 +113824 +118784 +119030 +119040 +119079 +119081 +119141 +119142 +119143 +119146 +119150 +119171 +119173 +119180 +119210 +119214 +119273 +119296 +119362 +119365 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121484 +124928 +125125 +125127 +125136 +125184 +125252 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V56 +33 +48 +58 +65 +91 +95 +96 +97 +123 +127 +161 +168 +169 +170 +171 +173 +174 +175 +176 +178 +182 +183 +187 +188 +191 +192 +215 +216 +247 +248 +8208 +8232 +8240 +8255 +8257 +8276 +8277 +8287 +8592 +9312 +9472 +10102 +10132 +11264 +11776 +11904 +12289 +12292 +12296 +12321 +12336 +12337 +64830 +64832 +65093 +65095 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +12294 +12296 +12321 +12330 +12344 +12347 +13312 +19894 +19968 +40939 +63744 +64110 +64112 +64218 +94208 +100333 +100352 +101107 +110960 +111356 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V95 +2160 +2208 +7312 +7360 +12256 +12272 +66048 +66176 +66528 +66560 +66928 +67072 +67456 +67584 +67760 +67808 +67904 +67968 +68256 +68288 +68528 +68608 +68688 +68736 +68864 +69216 +69248 +69632 +70224 +70272 +70528 +70656 +70880 +71040 +71376 +71424 +71488 +71840 +71936 +72192 +72368 +72384 +72448 +72704 +72896 +72960 +73056 +73728 +75088 +77824 +78896 +82944 +83584 +92160 +92784 +92880 +93072 +93952 +94112 +94176 +101120 +110592 +110896 +110960 +111360 +113664 +113840 +118784 +119376 +119552 +119680 +119808 +121520 +122880 +122928 +124928 +125152 +125184 +125280 +126464 +126720 +126976 +129536 +131072 +173792 +173824 +191472 +194560 +195104 +917504 +917632 +917760 +918000 +983040 +1114112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V462 +192 +198 +199 +208 +209 +215 +217 +222 +224 +230 +231 +240 +241 +247 +249 +254 +255 +272 +274 +294 +296 +305 +308 +312 +313 +319 +323 +329 +332 +338 +340 +358 +360 +383 +416 +418 +431 +433 +461 +477 +478 +484 +486 +497 +500 +502 +504 +540 +542 +544 +550 +564 +832 +834 +835 +837 +884 +885 +894 +895 +901 +907 +908 +909 +910 +913 +938 +945 +970 +975 +979 +981 +1024 +1026 +1027 +1028 +1031 +1032 +1036 +1039 +1049 +1050 +1081 +1082 +1104 +1106 +1107 +1108 +1111 +1112 +1116 +1119 +1142 +1144 +1217 +1219 +1232 +1236 +1238 +1240 +1242 +1248 +1250 +1256 +1258 +1270 +1272 +1274 +1570 +1575 +1728 +1729 +1730 +1731 +1747 +1748 +2345 +2346 +2353 +2354 +2356 +2357 +2392 +2400 +2507 +2509 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2888 +2889 +2891 +2893 +2908 +2910 +2964 +2965 +3018 +3021 +3144 +3145 +3264 +3265 +3271 +3273 +3274 +3276 +3402 +3405 +3546 +3547 +3548 +3551 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3959 +3960 +3961 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4134 +4135 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6930 +6931 +6971 +6972 +6973 +6974 +6976 +6978 +6979 +6980 +7680 +7834 +7835 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8129 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8190 +8192 +8194 +8486 +8487 +8490 +8492 +8602 +8604 +8622 +8623 +8653 +8656 +8708 +8709 +8713 +8714 +8716 +8717 +8740 +8741 +8742 +8743 +8769 +8770 +8772 +8773 +8775 +8776 +8777 +8778 +8800 +8801 +8802 +8803 +8813 +8818 +8820 +8822 +8824 +8826 +8832 +8834 +8836 +8838 +8840 +8842 +8876 +8880 +8928 +8932 +8938 +8942 +9001 +9003 +10972 +10973 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12389 +12390 +12391 +12392 +12393 +12394 +12400 +12402 +12403 +12405 +12406 +12408 +12409 +12411 +12412 +12414 +12436 +12437 +12446 +12447 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12485 +12486 +12487 +12488 +12489 +12490 +12496 +12498 +12499 +12501 +12502 +12504 +12505 +12507 +12508 +12510 +12532 +12533 +12535 +12539 +12542 +12543 +44032 +55204 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64285 +64286 +64287 +64288 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64335 +69786 +69787 +69788 +69789 +69803 +69804 +69934 +69936 +70475 +70477 +70843 +70845 +70846 +70847 +71098 +71100 +119134 +119141 +119227 +119233 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V463 +0 +192 +198 +199 +208 +209 +215 +217 +222 +224 +230 +231 +240 +241 +247 +249 +254 +255 +272 +274 +294 +296 +305 +308 +312 +313 +319 +323 +329 +332 +338 +340 +358 +360 +383 +416 +418 +431 +433 +461 +477 +478 +484 +486 +497 +500 +502 +504 +540 +542 +544 +550 +564 +832 +834 +835 +837 +884 +885 +894 +895 +901 +907 +908 +909 +910 +913 +938 +945 +970 +975 +979 +981 +1024 +1026 +1027 +1028 +1031 +1032 +1036 +1039 +1049 +1050 +1081 +1082 +1104 +1106 +1107 +1108 +1111 +1112 +1116 +1119 +1142 +1144 +1217 +1219 +1232 +1236 +1238 +1240 +1242 +1248 +1250 +1256 +1258 +1270 +1272 +1274 +1570 +1575 +1728 +1729 +1730 +1731 +1747 +1748 +2345 +2346 +2353 +2354 +2356 +2357 +2392 +2400 +2507 +2509 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2888 +2889 +2891 +2893 +2908 +2910 +2964 +2965 +3018 +3021 +3144 +3145 +3264 +3265 +3271 +3273 +3274 +3276 +3402 +3405 +3546 +3547 +3548 +3551 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3959 +3960 +3961 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4134 +4135 +6918 +6919 +6920 +6921 +6922 +6923 +6924 +6925 +6926 +6927 +6930 +6931 +6971 +6972 +6973 +6974 +6976 +6978 +6979 +6980 +7680 +7834 +7835 +7836 +7840 +7930 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8129 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8190 +8192 +8194 +8486 +8487 +8490 +8492 +8602 +8604 +8622 +8623 +8653 +8656 +8708 +8709 +8713 +8714 +8716 +8717 +8740 +8741 +8742 +8743 +8769 +8770 +8772 +8773 +8775 +8776 +8777 +8778 +8800 +8801 +8802 +8803 +8813 +8818 +8820 +8822 +8824 +8826 +8832 +8834 +8836 +8838 +8840 +8842 +8876 +8880 +8928 +8932 +8938 +8942 +9001 +9003 +10972 +10973 +12364 +12365 +12366 +12367 +12368 +12369 +12370 +12371 +12372 +12373 +12374 +12375 +12376 +12377 +12378 +12379 +12380 +12381 +12382 +12383 +12384 +12385 +12386 +12387 +12389 +12390 +12391 +12392 +12393 +12394 +12400 +12402 +12403 +12405 +12406 +12408 +12409 +12411 +12412 +12414 +12436 +12437 +12446 +12447 +12460 +12461 +12462 +12463 +12464 +12465 +12466 +12467 +12468 +12469 +12470 +12471 +12472 +12473 +12474 +12475 +12476 +12477 +12478 +12479 +12480 +12481 +12482 +12483 +12485 +12486 +12487 +12488 +12489 +12490 +12496 +12498 +12499 +12501 +12502 +12504 +12505 +12507 +12508 +12510 +12532 +12533 +12535 +12539 +12542 +12543 +44032 +55204 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64285 +64286 +64287 +64288 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64335 +69786 +69787 +69788 +69789 +69803 +69804 +69934 +69936 +70475 +70477 +70843 +70845 +70846 +70847 +71098 +71100 +119134 +119141 +119227 +119233 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V88 +34 +35 +39 +42 +91 +92 +93 +94 +123 +124 +125 +126 +171 +172 +187 +188 +3898 +3902 +5787 +5789 +8216 +8224 +8249 +8251 +8261 +8263 +8317 +8319 +8333 +8335 +8968 +8972 +9001 +9003 +10075 +10081 +10088 +10102 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11776 +11790 +11804 +11806 +11808 +11818 +11842 +11843 +12296 +12306 +12308 +12316 +12317 +12320 +64830 +64832 +65047 +65049 +65077 +65093 +65095 +65097 +65113 +65119 +65288 +65290 +65339 +65340 +65341 +65342 +65371 +65372 +65373 +65374 +65375 +65377 +65378 +65380 +128630 +128633 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V36 +173 +174 +1536 +1542 +1564 +1565 +1757 +1758 +1807 +1808 +2274 +2275 +6158 +6159 +8203 +8204 +8206 +8208 +8234 +8239 +8288 +8293 +8294 +8304 +65279 +65280 +65529 +65532 +69821 +69822 +113824 +113828 +119155 +119163 +917505 +917506 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V532 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2404 +2433 +2436 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2530 +2532 +2561 +2564 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2692 +2748 +2749 +2750 +2758 +2759 +2762 +2763 +2766 +2786 +2788 +2810 +2816 +2817 +2820 +2876 +2877 +2878 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3072 +3076 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3204 +3260 +3261 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3298 +3300 +3328 +3332 +3387 +3389 +3390 +3397 +3398 +3401 +3402 +3406 +3415 +3416 +3426 +3428 +3458 +3460 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3953 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4139 +4159 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4240 +4250 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6444 +6448 +6460 +6679 +6684 +6741 +6751 +6752 +6781 +6783 +6784 +6832 +6847 +6912 +6917 +6964 +6981 +7019 +7028 +7040 +7043 +7073 +7086 +7142 +7156 +7204 +7224 +7376 +7379 +7380 +7401 +7405 +7406 +7410 +7413 +7415 +7418 +7616 +7674 +7675 +7680 +8204 +8206 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43048 +43136 +43138 +43188 +43206 +43232 +43250 +43302 +43310 +43335 +43348 +43392 +43396 +43443 +43457 +43493 +43494 +43561 +43575 +43587 +43588 +43596 +43598 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43755 +43760 +43765 +43767 +44003 +44011 +44012 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +65438 +65440 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69632 +69635 +69688 +69703 +69759 +69763 +69808 +69819 +69888 +69891 +69927 +69941 +70003 +70004 +70016 +70019 +70067 +70081 +70090 +70093 +70188 +70200 +70206 +70207 +70367 +70379 +70400 +70404 +70460 +70461 +70462 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70502 +70509 +70512 +70517 +70709 +70727 +70832 +70852 +71087 +71094 +71096 +71105 +71132 +71134 +71216 +71233 +71339 +71352 +71453 +71468 +72193 +72203 +72243 +72250 +72251 +72255 +72263 +72264 +72273 +72284 +72330 +72346 +72751 +72759 +72760 +72768 +72850 +72872 +72873 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94033 +94079 +94095 +94099 +113821 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1523 +0 +9 +14 +32 +35 +39 +42 +44 +47 +48 +59 +63 +64 +65 +92 +93 +94 +97 +124 +125 +126 +133 +134 +160 +161 +170 +172 +173 +174 +181 +182 +186 +188 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +768 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1155 +1328 +1329 +1367 +1369 +1370 +1373 +1374 +1377 +1416 +1417 +1418 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1524 +1536 +1542 +1548 +1550 +1552 +1563 +1564 +1565 +1567 +1642 +1643 +1645 +1646 +1758 +1759 +1769 +1770 +1789 +1791 +1795 +1807 +1867 +1869 +1970 +1984 +2038 +2040 +2043 +2048 +2094 +2112 +2140 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2416 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3643 +3648 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3841 +3864 +3866 +3872 +3882 +3893 +3894 +3895 +3896 +3897 +3912 +3913 +3949 +3953 +3973 +3974 +3992 +3993 +4029 +4038 +4039 +4096 +4172 +4176 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4960 +4962 +4963 +4967 +4969 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5742 +5789 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6100 +6103 +6104 +6108 +6110 +6112 +6122 +6146 +6148 +6152 +6154 +6155 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6618 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6823 +6828 +6832 +6847 +6912 +6988 +6992 +7004 +7006 +7008 +7019 +7028 +7040 +7156 +7168 +7224 +7227 +7229 +7232 +7242 +7245 +7305 +7376 +7379 +7380 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8192 +8208 +8211 +8213 +8216 +8224 +8228 +8229 +8232 +8240 +8249 +8251 +8252 +8254 +8261 +8266 +8287 +8293 +8294 +8304 +8305 +8306 +8317 +8320 +8333 +8335 +8336 +8349 +8400 +8433 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +8968 +8972 +9001 +9003 +9398 +9450 +10075 +10081 +10088 +10102 +10181 +10183 +10214 +10224 +10627 +10649 +10712 +10716 +10748 +10750 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11790 +11804 +11806 +11808 +11818 +11822 +11824 +11836 +11837 +11842 +11843 +12288 +12291 +12293 +12306 +12308 +12316 +12317 +12320 +12321 +12336 +12337 +12342 +12344 +12349 +12353 +12439 +12441 +12443 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42239 +42509 +42510 +42540 +42560 +42611 +42612 +42622 +42623 +42738 +42739 +42740 +42743 +42744 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43048 +43072 +43124 +43126 +43128 +43136 +43206 +43214 +43226 +43232 +43256 +43259 +43260 +43261 +43262 +43264 +43310 +43311 +43348 +43360 +43389 +43392 +43457 +43464 +43466 +43471 +43482 +43488 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43613 +43639 +43642 +43715 +43739 +43742 +43744 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65020 +65024 +65042 +65043 +65044 +65047 +65049 +65056 +65072 +65073 +65075 +65077 +65093 +65095 +65097 +65104 +65107 +65109 +65119 +65123 +65124 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65282 +65288 +65290 +65292 +65295 +65306 +65307 +65311 +65312 +65313 +65340 +65341 +65342 +65345 +65372 +65373 +65374 +65375 +65381 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65529 +65532 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66045 +66046 +66176 +66205 +66208 +66257 +66272 +66273 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68160 +68182 +68184 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68327 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69705 +69734 +69744 +69759 +69819 +69821 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69952 +69953 +69956 +69968 +70004 +70006 +70007 +70016 +70087 +70090 +70094 +70096 +70107 +70108 +70109 +70110 +70112 +70144 +70162 +70163 +70202 +70203 +70205 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70733 +70736 +70746 +70784 +70854 +70855 +70856 +70864 +70874 +71040 +71094 +71096 +71105 +71106 +71108 +71113 +71134 +71168 +71235 +71236 +71237 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71482 +71484 +71487 +71840 +71914 +71935 +71936 +72192 +72255 +72258 +72260 +72263 +72264 +72272 +72324 +72326 +72346 +72347 +72349 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72771 +72784 +72794 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92985 +92992 +92997 +93008 +93018 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113821 +113828 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +120782 +120832 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121480 +121481 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125136 +125143 +125184 +125259 +125264 +125274 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127280 +127306 +127312 +127338 +127344 +127370 +128630 +128633 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V964 +443 +444 +448 +452 +660 +661 +697 +704 +710 +722 +748 +749 +750 +751 +884 +885 +1369 +1370 +1488 +1515 +1520 +1524 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3636 +3648 +3655 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3764 +3773 +3774 +3776 +3781 +3782 +3783 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6277 +6279 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6823 +6824 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7401 +7405 +7406 +7410 +7413 +7415 +8501 +8505 +8576 +8579 +8581 +8585 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11823 +11824 +12293 +12296 +12321 +12330 +12337 +12342 +12344 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42606 +42607 +42623 +42624 +42656 +42736 +42775 +42784 +42888 +42889 +42895 +42896 +42999 +43000 +43003 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43968 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65382 +65438 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66640 +66718 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +124928 +125125 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1270 +65 +91 +192 +215 +216 +223 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +444 +445 +452 +454 +455 +457 +458 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +880 +881 +882 +883 +886 +887 +895 +896 +902 +903 +904 +907 +908 +909 +910 +912 +913 +930 +931 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1015 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1329 +1367 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7960 +7966 +7976 +7984 +7992 +8000 +8008 +8014 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8040 +8048 +8072 +8080 +8088 +8096 +8104 +8112 +8120 +8125 +8136 +8141 +8152 +8156 +8168 +8173 +8184 +8189 +8450 +8451 +8455 +8456 +8459 +8462 +8464 +8467 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8496 +8500 +8510 +8512 +8517 +8518 +8544 +8560 +8579 +8580 +9398 +9424 +11264 +11311 +11360 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11499 +11500 +11501 +11502 +11506 +11507 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42891 +42892 +42893 +42894 +42896 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42927 +42928 +42933 +42934 +42935 +65313 +65339 +66560 +66600 +66736 +66772 +68736 +68787 +71840 +71872 +119808 +119834 +119860 +119886 +119912 +119938 +119964 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119990 +120016 +120042 +120068 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120120 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120172 +120198 +120224 +120250 +120276 +120302 +120328 +120354 +120380 +120406 +120432 +120458 +120488 +120513 +120546 +120571 +120604 +120629 +120662 +120687 +120720 +120745 +120778 +120779 +125184 +125218 +127280 +127306 +127312 +127338 +127344 +127370 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V38 +44 +46 +58 +59 +1373 +1374 +1548 +1550 +2040 +2041 +6146 +6147 +6152 +6153 +8211 +8213 +12289 +12290 +65040 +65042 +65043 +65044 +65073 +65075 +65104 +65106 +65109 +65110 +65112 +65113 +65123 +65124 +65292 +65294 +65306 +65307 +65380 +65381 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V110 +48 +58 +1632 +1642 +1643 +1645 +1776 +1786 +1984 +1994 +2406 +2416 +2534 +2544 +2662 +2672 +2790 +2800 +2918 +2928 +3046 +3056 +3174 +3184 +3302 +3312 +3430 +3440 +3558 +3568 +3664 +3674 +3792 +3802 +3872 +3882 +4160 +4170 +4240 +4250 +6112 +6122 +6160 +6170 +6470 +6480 +6608 +6618 +6784 +6794 +6800 +6810 +6992 +7002 +7088 +7098 +7232 +7242 +7248 +7258 +42528 +42538 +43216 +43226 +43264 +43274 +43472 +43482 +43504 +43514 +43600 +43610 +44016 +44026 +66720 +66730 +69734 +69744 +69872 +69882 +69942 +69952 +70096 +70106 +70384 +70394 +70736 +70746 +70864 +70874 +71248 +71258 +71360 +71370 +71472 +71482 +71904 +71914 +72784 +72794 +73040 +73050 +92768 +92778 +93008 +93018 +120782 +120832 +125264 +125274 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V130 +33 +34 +63 +64 +1417 +1418 +1567 +1568 +1748 +1749 +1792 +1795 +2041 +2042 +2404 +2406 +4170 +4172 +4962 +4963 +4967 +4969 +5742 +5743 +5941 +5943 +6147 +6148 +6153 +6154 +6468 +6470 +6824 +6828 +7002 +7004 +7006 +7008 +7227 +7229 +7294 +7296 +8252 +8254 +8263 +8266 +11822 +11823 +11836 +11837 +12290 +12291 +42239 +42240 +42510 +42512 +42739 +42740 +42743 +42744 +43126 +43128 +43214 +43216 +43311 +43312 +43464 +43466 +43613 +43616 +43760 +43762 +44011 +44012 +65110 +65112 +65281 +65282 +65311 +65312 +65377 +65378 +68182 +68184 +69703 +69705 +69822 +69826 +69953 +69956 +70085 +70087 +70093 +70094 +70110 +70112 +70200 +70202 +70203 +70205 +70313 +70314 +70731 +70733 +71106 +71108 +71113 +71128 +71233 +71235 +71484 +71487 +72258 +72260 +72347 +72349 +72769 +72771 +92782 +92784 +92917 +92918 +92983 +92985 +92996 +92997 +113823 +113824 +121480 +121481 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +46 +47 +8228 +8229 +65106 +65107 +65294 +65295 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +9 +10 +11 +13 +32 +33 +160 +161 +5760 +5761 +8192 +8203 +8239 +8240 +8287 +8288 +12288 +12289 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1278 +97 +123 +170 +171 +181 +182 +186 +187 +223 +247 +248 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +443 +445 +448 +454 +455 +457 +458 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +660 +661 +697 +704 +706 +736 +741 +881 +882 +883 +884 +887 +888 +890 +894 +912 +913 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1014 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1377 +1416 +5112 +5118 +7296 +7305 +7424 +7616 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7958 +7968 +7976 +7984 +7992 +8000 +8006 +8016 +8024 +8032 +8040 +8048 +8062 +8064 +8072 +8080 +8088 +8096 +8104 +8112 +8117 +8118 +8120 +8126 +8127 +8130 +8133 +8134 +8136 +8144 +8148 +8150 +8152 +8160 +8168 +8178 +8181 +8182 +8184 +8305 +8306 +8319 +8320 +8336 +8349 +8458 +8459 +8462 +8464 +8467 +8468 +8495 +8496 +8500 +8501 +8505 +8506 +8508 +8510 +8518 +8522 +8526 +8527 +8560 +8576 +8580 +8581 +9424 +9450 +11312 +11359 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11493 +11500 +11501 +11502 +11503 +11507 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42606 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42654 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42888 +42892 +42893 +42894 +42895 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42933 +42934 +42935 +42936 +43000 +43003 +43824 +43867 +43868 +43878 +43888 +43968 +64256 +64263 +64275 +64280 +65345 +65371 +66600 +66640 +66776 +66812 +68800 +68851 +71872 +71904 +119834 +119860 +119886 +119893 +119894 +119912 +119938 +119964 +119990 +119994 +119995 +119996 +119997 +120004 +120005 +120016 +120042 +120068 +120094 +120120 +120146 +120172 +120198 +120224 +120250 +120276 +120302 +120328 +120354 +120380 +120406 +120432 +120458 +120486 +120514 +120539 +120540 +120546 +120572 +120597 +120598 +120604 +120630 +120655 +120656 +120662 +120688 +120713 +120714 +120720 +120746 +120771 +120772 +120778 +120779 +120780 +125218 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V62 +105 +107 +303 +304 +585 +586 +616 +617 +669 +670 +690 +691 +1011 +1012 +1110 +1111 +1112 +1113 +7522 +7523 +7574 +7575 +7588 +7589 +7592 +7593 +7725 +7726 +7883 +7884 +8305 +8306 +8520 +8522 +11388 +11389 +119842 +119844 +119894 +119896 +119946 +119948 +119998 +120000 +120050 +120052 +120102 +120104 +120154 +120156 +120206 +120208 +120258 +120260 +120310 +120312 +120362 +120364 +120414 +120416 +120466 +120468 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V377 +0 +48 +58 +178 +180 +185 +186 +188 +191 +1632 +1642 +1776 +1786 +1984 +1994 +2406 +2416 +2534 +2544 +2548 +2554 +2662 +2672 +2790 +2800 +2918 +2928 +2930 +2936 +3046 +3059 +3174 +3184 +3192 +3199 +3302 +3312 +3416 +3423 +3430 +3449 +3558 +3568 +3664 +3674 +3792 +3802 +3872 +3892 +4160 +4170 +4240 +4250 +4969 +4989 +5870 +5873 +6112 +6122 +6128 +6138 +6160 +6170 +6470 +6480 +6608 +6619 +6784 +6794 +6800 +6810 +6992 +7002 +7088 +7098 +7232 +7242 +7248 +7258 +8304 +8305 +8308 +8314 +8320 +8330 +8528 +8579 +8581 +8586 +9312 +9372 +9450 +9472 +10102 +10132 +11517 +11518 +12295 +12296 +12321 +12330 +12344 +12347 +12690 +12694 +12832 +12842 +12872 +12880 +12881 +12896 +12928 +12938 +12977 +12992 +13317 +13318 +13443 +13444 +14378 +14379 +15181 +15182 +19968 +19969 +19971 +19972 +19975 +19976 +19977 +19978 +20061 +20062 +20108 +20109 +20116 +20117 +20118 +20119 +20159 +20161 +20191 +20192 +20200 +20201 +20237 +20238 +20336 +20337 +20740 +20741 +20806 +20807 +20841 +20842 +20843 +20844 +20845 +20846 +21313 +21314 +21315 +21318 +21324 +21325 +21441 +21445 +22235 +22236 +22769 +22770 +22777 +22778 +24186 +24187 +24318 +24320 +24332 +24335 +24336 +24337 +25342 +25343 +25420 +25421 +26578 +26579 +28422 +28423 +29590 +29591 +30334 +30335 +32902 +32903 +33836 +33837 +36014 +36015 +36019 +36020 +36144 +36145 +38433 +38434 +38470 +38471 +38476 +38477 +38520 +38521 +38646 +38647 +42528 +42538 +42726 +42736 +43056 +43062 +43216 +43226 +43264 +43274 +43472 +43482 +43504 +43514 +43600 +43610 +44016 +44026 +63851 +63852 +63859 +63860 +63864 +63865 +63922 +63923 +63953 +63954 +63955 +63956 +63997 +63998 +65296 +65306 +65799 +65844 +65856 +65913 +65930 +65932 +66273 +66300 +66336 +66340 +66369 +66370 +66378 +66379 +66513 +66518 +66720 +66730 +67672 +67680 +67705 +67712 +67751 +67760 +67835 +67840 +67862 +67868 +68028 +68030 +68032 +68048 +68050 +68096 +68160 +68168 +68221 +68223 +68253 +68256 +68331 +68336 +68440 +68448 +68472 +68480 +68521 +68528 +68858 +68864 +69216 +69247 +69714 +69744 +69872 +69882 +69942 +69952 +70096 +70106 +70113 +70133 +70384 +70394 +70736 +70746 +70864 +70874 +71248 +71258 +71360 +71370 +71472 +71484 +71904 +71923 +72784 +72813 +73040 +73050 +74752 +74863 +92768 +92778 +93008 +93018 +93019 +93026 +119648 +119666 +120782 +120832 +125127 +125136 +125264 +125274 +127232 +127245 +131073 +131074 +131172 +131173 +131298 +131299 +131361 +131362 +133418 +133419 +133507 +133508 +133516 +133517 +133532 +133533 +133866 +133867 +133885 +133886 +133913 +133914 +140176 +140177 +141720 +141721 +146203 +146204 +156269 +156270 +194704 +194705 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V40 +178 +180 +185 +186 +4969 +4978 +6618 +6619 +8304 +8305 +8308 +8314 +8320 +8330 +9312 +9321 +9332 +9341 +9352 +9361 +9450 +9451 +9461 +9470 +9471 +9472 +10102 +10111 +10112 +10121 +10122 +10131 +68160 +68164 +69216 +69225 +69714 +69723 +127232 +127243 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V280 +188 +191 +2548 +2554 +2930 +2936 +3056 +3059 +3192 +3199 +3416 +3423 +3440 +3449 +3882 +3892 +4978 +4989 +5870 +5873 +6128 +6138 +8528 +8579 +8581 +8586 +9321 +9332 +9341 +9352 +9361 +9372 +9451 +9461 +9470 +9471 +10111 +10112 +10121 +10122 +10131 +10132 +11517 +11518 +12295 +12296 +12321 +12330 +12344 +12347 +12690 +12694 +12832 +12842 +12872 +12880 +12881 +12896 +12928 +12938 +12977 +12992 +13317 +13318 +13443 +13444 +14378 +14379 +15181 +15182 +19968 +19969 +19971 +19972 +19975 +19976 +19977 +19978 +20061 +20062 +20108 +20109 +20116 +20117 +20118 +20119 +20159 +20161 +20191 +20192 +20200 +20201 +20237 +20238 +20336 +20337 +20740 +20741 +20806 +20807 +20841 +20842 +20843 +20844 +20845 +20846 +21313 +21314 +21315 +21318 +21324 +21325 +21441 +21445 +22235 +22236 +22769 +22770 +22777 +22778 +24186 +24187 +24318 +24320 +24332 +24335 +24336 +24337 +25342 +25343 +25420 +25421 +26578 +26579 +28422 +28423 +29590 +29591 +30334 +30335 +32902 +32903 +33836 +33837 +36014 +36015 +36019 +36020 +36144 +36145 +38433 +38434 +38470 +38471 +38476 +38477 +38520 +38521 +38646 +38647 +42726 +42736 +43056 +43062 +63851 +63852 +63859 +63860 +63864 +63865 +63922 +63923 +63953 +63954 +63955 +63956 +63997 +63998 +65799 +65844 +65856 +65913 +65930 +65932 +66273 +66300 +66336 +66340 +66369 +66370 +66378 +66379 +66513 +66518 +67672 +67680 +67705 +67712 +67751 +67760 +67835 +67840 +67862 +67868 +68028 +68030 +68032 +68048 +68050 +68096 +68164 +68168 +68221 +68223 +68253 +68256 +68331 +68336 +68440 +68448 +68472 +68480 +68521 +68528 +68858 +68864 +69225 +69247 +69723 +69734 +70113 +70133 +71482 +71484 +71914 +71923 +72794 +72813 +74752 +74863 +93019 +93026 +119648 +119666 +125127 +125136 +127243 +127245 +131073 +131074 +131172 +131173 +131298 +131299 +131361 +131362 +133418 +133419 +133507 +133508 +133516 +133517 +133532 +133533 +133866 +133867 +133885 +133886 +133913 +133914 +140176 +140177 +141720 +141721 +146203 +146204 +156269 +156270 +194704 +194705 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1280 +97 +123 +170 +171 +181 +182 +186 +187 +223 +247 +248 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +443 +445 +448 +454 +455 +457 +458 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +660 +661 +697 +704 +706 +736 +741 +837 +838 +881 +882 +883 +884 +887 +888 +890 +894 +912 +913 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1014 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1377 +1416 +5112 +5118 +7296 +7305 +7424 +7616 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7958 +7968 +7976 +7984 +7992 +8000 +8006 +8016 +8024 +8032 +8040 +8048 +8062 +8064 +8072 +8080 +8088 +8096 +8104 +8112 +8117 +8118 +8120 +8126 +8127 +8130 +8133 +8134 +8136 +8144 +8148 +8150 +8152 +8160 +8168 +8178 +8181 +8182 +8184 +8305 +8306 +8319 +8320 +8336 +8349 +8458 +8459 +8462 +8464 +8467 +8468 +8495 +8496 +8500 +8501 +8505 +8506 +8508 +8510 +8518 +8522 +8526 +8527 +8560 +8576 +8580 +8581 +9424 +9450 +11312 +11359 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11390 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11493 +11500 +11501 +11502 +11503 +11507 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42606 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42654 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42888 +42892 +42893 +42894 +42895 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42933 +42934 +42935 +42936 +43000 +43003 +43824 +43867 +43868 +43878 +43888 +43968 +64256 +64263 +64275 +64280 +65345 +65371 +66600 +66640 +66776 +66812 +68800 +68851 +71872 +71904 +119834 +119860 +119886 +119893 +119894 +119912 +119938 +119964 +119990 +119994 +119995 +119996 +119997 +120004 +120005 +120016 +120042 +120068 +120094 +120120 +120146 +120172 +120198 +120224 +120250 +120276 +120302 +120328 +120354 +120380 +120406 +120432 +120458 +120486 +120514 +120539 +120540 +120546 +120572 +120597 +120598 +120604 +120630 +120655 +120656 +120662 +120688 +120713 +120714 +120720 +120746 +120771 +120772 +120778 +120779 +120780 +125218 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +65377 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65512 +65519 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V372 +160 +161 +168 +169 +170 +171 +175 +176 +178 +182 +184 +187 +188 +191 +306 +308 +319 +321 +329 +330 +383 +384 +452 +461 +497 +500 +688 +697 +728 +734 +736 +741 +890 +891 +900 +901 +976 +979 +981 +983 +1008 +1011 +1012 +1014 +1017 +1018 +1415 +1416 +1653 +1657 +3635 +3636 +3763 +3764 +3804 +3806 +3852 +3853 +3959 +3960 +3961 +3962 +4348 +4349 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7531 +7544 +7545 +7579 +7616 +7834 +7835 +8125 +8126 +8127 +8129 +8190 +8191 +8194 +8203 +8209 +8210 +8215 +8216 +8228 +8231 +8239 +8240 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8360 +8361 +8448 +8452 +8453 +8456 +8457 +8468 +8469 +8471 +8473 +8478 +8480 +8483 +8484 +8485 +8488 +8489 +8492 +8494 +8495 +8498 +8499 +8506 +8507 +8513 +8517 +8522 +8528 +8576 +8585 +8586 +8748 +8750 +8751 +8753 +9312 +9451 +10764 +10765 +10868 +10871 +11388 +11390 +11631 +11632 +11935 +11936 +12019 +12020 +12032 +12246 +12288 +12289 +12342 +12343 +12344 +12347 +12443 +12445 +12447 +12448 +12543 +12544 +12593 +12687 +12690 +12704 +12800 +12831 +12832 +12872 +12880 +12927 +12928 +13055 +13056 +13312 +42652 +42654 +42864 +42865 +43000 +43002 +43868 +43872 +64256 +64263 +64275 +64280 +64288 +64298 +64335 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65021 +65040 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127232 +127243 +127248 +127279 +127280 +127312 +127338 +127340 +127376 +127377 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V196 +64336 +64337 +64338 +64339 +64342 +64343 +64346 +64347 +64350 +64351 +64354 +64355 +64358 +64359 +64362 +64363 +64366 +64367 +64370 +64371 +64374 +64375 +64378 +64379 +64382 +64383 +64386 +64387 +64388 +64389 +64390 +64391 +64392 +64393 +64394 +64395 +64396 +64397 +64398 +64399 +64402 +64403 +64406 +64407 +64410 +64411 +64414 +64415 +64416 +64417 +64420 +64421 +64422 +64423 +64426 +64427 +64430 +64431 +64432 +64433 +64467 +64468 +64471 +64472 +64473 +64474 +64475 +64476 +64477 +64479 +64480 +64481 +64482 +64483 +64484 +64485 +64490 +64491 +64492 +64493 +64494 +64495 +64496 +64497 +64498 +64499 +64500 +64501 +64502 +64503 +64505 +64506 +64508 +64509 +64512 +64612 +64757 +64785 +64829 +64830 +65008 +65021 +65136 +65137 +65138 +65139 +65140 +65141 +65142 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65152 +65154 +65155 +65156 +65157 +65158 +65159 +65160 +65161 +65162 +65165 +65166 +65167 +65168 +65171 +65172 +65173 +65174 +65177 +65178 +65181 +65182 +65185 +65186 +65189 +65190 +65193 +65194 +65195 +65196 +65197 +65198 +65199 +65200 +65201 +65202 +65205 +65206 +65209 +65210 +65213 +65214 +65217 +65218 +65221 +65222 +65225 +65226 +65229 +65230 +65233 +65234 +65237 +65238 +65241 +65242 +65245 +65246 +65249 +65250 +65253 +65254 +65257 +65258 +65261 +65262 +65263 +65264 +65265 +65266 +65269 +65270 +65271 +65272 +65273 +65274 +65275 +65276 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V108 +64341 +64342 +64345 +64346 +64349 +64350 +64353 +64354 +64357 +64358 +64361 +64362 +64365 +64366 +64369 +64370 +64373 +64374 +64377 +64378 +64381 +64382 +64385 +64386 +64401 +64402 +64405 +64406 +64409 +64410 +64413 +64414 +64419 +64420 +64425 +64426 +64429 +64430 +64470 +64471 +64487 +64488 +64489 +64490 +64511 +64512 +64735 +64757 +64820 +64828 +65137 +65138 +65143 +65144 +65145 +65146 +65147 +65148 +65149 +65150 +65151 +65152 +65164 +65165 +65170 +65171 +65176 +65177 +65180 +65181 +65184 +65185 +65188 +65189 +65192 +65193 +65204 +65205 +65208 +65209 +65212 +65213 +65216 +65217 +65220 +65221 +65224 +65225 +65228 +65229 +65232 +65233 +65236 +65237 +65240 +65241 +65244 +65245 +65248 +65249 +65252 +65253 +65256 +65257 +65260 +65261 +65268 +65269 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V148 +168 +169 +175 +176 +180 +182 +184 +185 +306 +308 +319 +321 +329 +330 +383 +384 +452 +461 +497 +500 +728 +734 +890 +891 +900 +901 +976 +979 +981 +983 +1008 +1011 +1012 +1014 +1017 +1018 +1415 +1416 +1653 +1657 +3635 +3636 +3763 +3764 +3804 +3806 +3959 +3960 +3961 +3962 +7834 +7835 +8125 +8126 +8127 +8129 +8190 +8191 +8194 +8199 +8200 +8203 +8215 +8216 +8228 +8231 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8288 +8360 +8361 +8448 +8450 +8451 +8452 +8453 +8456 +8457 +8458 +8470 +8471 +8481 +8482 +8501 +8505 +8507 +8508 +8544 +8576 +8748 +8750 +8751 +8753 +9332 +9398 +10764 +10765 +10868 +10871 +11935 +11936 +12019 +12020 +12032 +12246 +12342 +12343 +12344 +12347 +12443 +12445 +12593 +12687 +12800 +12831 +12832 +12868 +12992 +13004 +13144 +13169 +13280 +13311 +64256 +64263 +64275 +64280 +64335 +64336 +65097 +65104 +127232 +127243 +127248 +127275 +127552 +127561 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V226 +64337 +64338 +64339 +64340 +64343 +64344 +64347 +64348 +64351 +64352 +64355 +64356 +64359 +64360 +64363 +64364 +64367 +64368 +64371 +64372 +64375 +64376 +64379 +64380 +64383 +64384 +64387 +64388 +64389 +64390 +64391 +64392 +64393 +64394 +64395 +64396 +64397 +64398 +64399 +64400 +64403 +64404 +64407 +64408 +64411 +64412 +64415 +64416 +64417 +64418 +64421 +64422 +64423 +64424 +64427 +64428 +64431 +64432 +64433 +64434 +64468 +64469 +64472 +64473 +64474 +64475 +64476 +64477 +64479 +64480 +64481 +64482 +64483 +64484 +64485 +64486 +64491 +64492 +64493 +64494 +64495 +64496 +64497 +64498 +64499 +64500 +64501 +64502 +64503 +64504 +64506 +64507 +64509 +64510 +64612 +64663 +64785 +64813 +64828 +64829 +64849 +64850 +64856 +64857 +64858 +64860 +64862 +64864 +64866 +64867 +64868 +64869 +64870 +64872 +64873 +64875 +64876 +64877 +64878 +64880 +64881 +64882 +64884 +64887 +64888 +64893 +64894 +64899 +64900 +64902 +64903 +64904 +64907 +64908 +64918 +64920 +64921 +64925 +64926 +64948 +64950 +64952 +64953 +64954 +64955 +64963 +64966 +64968 +65154 +65155 +65156 +65157 +65158 +65159 +65160 +65161 +65162 +65163 +65166 +65167 +65168 +65169 +65172 +65173 +65174 +65175 +65178 +65179 +65182 +65183 +65186 +65187 +65190 +65191 +65194 +65195 +65196 +65197 +65198 +65199 +65200 +65201 +65202 +65203 +65206 +65207 +65210 +65211 +65214 +65215 +65218 +65219 +65222 +65223 +65226 +65227 +65230 +65231 +65234 +65235 +65238 +65239 +65242 +65243 +65246 +65247 +65250 +65251 +65254 +65255 +65258 +65259 +65262 +65263 +65264 +65265 +65266 +65267 +65270 +65271 +65272 +65273 +65274 +65275 +65276 +65277 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +9312 +9332 +9398 +9451 +12868 +12872 +12881 +12927 +12928 +12992 +13008 +13055 +127275 +127279 +127568 +127570 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V48 +170 +171 +178 +180 +185 +187 +688 +697 +736 +741 +4348 +4349 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7522 +7544 +7545 +7579 +7616 +8304 +8306 +8308 +8320 +8480 +8481 +8482 +8483 +11389 +11390 +11631 +11632 +12690 +12704 +42652 +42654 +42864 +42865 +43000 +43002 +43868 +43872 +127338 +127340 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V150 +64340 +64341 +64344 +64345 +64348 +64349 +64352 +64353 +64356 +64357 +64360 +64361 +64364 +64365 +64368 +64369 +64372 +64373 +64376 +64377 +64380 +64381 +64384 +64385 +64400 +64401 +64404 +64405 +64408 +64409 +64412 +64413 +64418 +64419 +64424 +64425 +64428 +64429 +64469 +64470 +64486 +64487 +64488 +64489 +64504 +64505 +64507 +64508 +64510 +64511 +64663 +64735 +64813 +64820 +64848 +64849 +64850 +64856 +64857 +64858 +64860 +64862 +64864 +64866 +64867 +64868 +64869 +64870 +64872 +64873 +64875 +64876 +64877 +64878 +64880 +64881 +64882 +64884 +64887 +64888 +64893 +64894 +64899 +64900 +64902 +64903 +64904 +64907 +64908 +64912 +64914 +64918 +64920 +64921 +64925 +64926 +64948 +64950 +64952 +64953 +64954 +64955 +64963 +64966 +65163 +65164 +65169 +65170 +65175 +65176 +65179 +65180 +65183 +65184 +65187 +65188 +65191 +65192 +65203 +65204 +65207 +65208 +65211 +65212 +65215 +65216 +65219 +65220 +65223 +65224 +65227 +65228 +65231 +65232 +65235 +65236 +65239 +65240 +65243 +65244 +65247 +65248 +65251 +65252 +65255 +65256 +65259 +65260 +65267 +65268 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V134 +8450 +8451 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8488 +8489 +8492 +8494 +8495 +8498 +8499 +8501 +8505 +8506 +8508 +8513 +8517 +8522 +64288 +64298 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +160 +161 +3852 +3853 +8199 +8200 +8209 +8210 +8239 +8240 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +12447 +12448 +12543 +12544 +65040 +65050 +65072 +65093 +65095 +65097 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +12880 +12881 +13004 +13008 +13056 +13144 +13169 +13280 +13311 +13312 +127280 +127312 +127376 +127377 +127488 +127491 +127504 +127548 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +7522 +7531 +8320 +8335 +8336 +8349 +11388 +11389 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V82 +768 +773 +774 +781 +783 +784 +785 +786 +787 +789 +795 +796 +803 +809 +813 +815 +816 +818 +824 +825 +834 +835 +837 +838 +1619 +1622 +2364 +2365 +2494 +2495 +2519 +2520 +2878 +2879 +2902 +2904 +3006 +3007 +3031 +3032 +3158 +3159 +3266 +3267 +3285 +3287 +3390 +3391 +3415 +3416 +3530 +3531 +3535 +3536 +3551 +3552 +4142 +4143 +4449 +4470 +4520 +4547 +6965 +6966 +12441 +12443 +69818 +69819 +69927 +69928 +70462 +70463 +70487 +70488 +70832 +70833 +70842 +70843 +70845 +70846 +71087 +71088 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V223 +0 +768 +773 +774 +781 +783 +784 +785 +786 +787 +789 +795 +796 +803 +809 +813 +815 +816 +818 +824 +825 +832 +838 +884 +885 +894 +895 +903 +904 +1619 +1622 +2364 +2365 +2392 +2400 +2494 +2495 +2519 +2520 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2878 +2879 +2902 +2904 +2908 +2910 +3006 +3007 +3031 +3032 +3158 +3159 +3266 +3267 +3285 +3287 +3390 +3391 +3415 +3416 +3530 +3531 +3535 +3536 +3551 +3552 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3959 +3960 +3961 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4142 +4143 +4449 +4470 +4520 +4547 +6965 +6966 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8123 +8124 +8126 +8127 +8137 +8138 +8139 +8140 +8147 +8148 +8155 +8156 +8163 +8164 +8171 +8172 +8174 +8176 +8185 +8186 +8187 +8188 +8189 +8190 +8192 +8194 +8486 +8487 +8490 +8492 +9001 +9003 +10972 +10973 +12441 +12443 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64285 +64286 +64287 +64288 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64335 +69818 +69819 +69927 +69928 +70462 +70463 +70487 +70488 +70832 +70833 +70842 +70843 +70845 +70846 +71087 +71088 +119134 +119141 +119227 +119233 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +820 +825 +7380 +7381 +7394 +7401 +8402 +8404 +8408 +8411 +8421 +8423 +8426 +8428 +68153 +68154 +92912 +92917 +113822 +113823 +119143 +119146 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V220 +768 +789 +829 +837 +838 +839 +842 +845 +848 +851 +855 +856 +859 +860 +867 +880 +1155 +1160 +1426 +1430 +1431 +1434 +1436 +1442 +1448 +1450 +1451 +1453 +1455 +1456 +1476 +1477 +1552 +1560 +1619 +1621 +1623 +1628 +1629 +1631 +1750 +1757 +1759 +1763 +1764 +1765 +1767 +1769 +1771 +1773 +1840 +1841 +1842 +1844 +1845 +1847 +1850 +1851 +1853 +1854 +1855 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +1867 +2027 +2034 +2035 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2260 +2274 +2276 +2278 +2279 +2281 +2282 +2285 +2291 +2294 +2295 +2297 +2299 +2304 +2385 +2386 +2387 +2389 +3970 +3972 +3974 +3976 +4957 +4960 +6109 +6110 +6458 +6459 +6679 +6680 +6773 +6781 +6832 +6837 +6843 +6845 +7019 +7020 +7021 +7028 +7376 +7379 +7386 +7388 +7392 +7393 +7412 +7413 +7416 +7418 +7616 +7618 +7619 +7626 +7627 +7629 +7633 +7670 +7675 +7676 +7678 +7679 +8400 +8402 +8404 +8408 +8411 +8413 +8417 +8418 +8423 +8424 +8425 +8426 +8432 +8433 +11503 +11506 +11744 +11776 +42607 +42608 +42612 +42622 +42654 +42656 +42736 +42738 +43232 +43250 +43696 +43697 +43698 +43700 +43703 +43705 +43710 +43712 +43713 +43714 +65056 +65063 +65070 +65072 +66422 +66427 +68111 +68112 +68152 +68153 +68325 +68326 +69888 +69891 +70502 +70509 +70512 +70517 +92976 +92983 +119173 +119178 +119210 +119214 +119362 +119365 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125252 +125258 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V96 +2381 +2382 +2509 +2510 +2637 +2638 +2765 +2766 +2893 +2894 +3021 +3022 +3149 +3150 +3277 +3278 +3387 +3389 +3405 +3406 +3530 +3531 +3642 +3643 +3972 +3973 +4153 +4155 +5908 +5909 +5940 +5941 +6098 +6099 +6752 +6753 +6980 +6981 +7082 +7084 +7154 +7156 +11647 +11648 +43014 +43015 +43204 +43205 +43347 +43348 +43456 +43457 +43766 +43767 +44013 +44014 +68159 +68160 +69702 +69703 +69759 +69760 +69817 +69818 +69939 +69941 +70080 +70081 +70197 +70198 +70378 +70379 +70477 +70478 +70722 +70723 +70850 +70851 +71103 +71104 +71231 +71232 +71350 +71351 +71467 +71468 +72244 +72245 +72263 +72264 +72345 +72346 +72767 +72768 +73028 +73030 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +860 +861 +863 +864 +866 +867 +7676 +7677 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1434 +1435 +1453 +1454 +6457 +6458 +12333 +12334 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +789 +790 +794 +795 +856 +857 +7670 +7671 +12332 +12333 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +795 +796 +3897 +3898 +119141 +119143 +119150 +119155 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V337 +0 +768 +847 +848 +880 +1155 +1160 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2304 +2364 +2365 +2381 +2382 +2385 +2389 +2492 +2493 +2509 +2510 +2620 +2621 +2637 +2638 +2748 +2749 +2765 +2766 +2876 +2877 +2893 +2894 +3021 +3022 +3149 +3150 +3157 +3159 +3260 +3261 +3277 +3278 +3387 +3389 +3405 +3406 +3530 +3531 +3640 +3643 +3656 +3660 +3768 +3770 +3784 +3788 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3955 +3956 +3957 +3962 +3966 +3968 +3969 +3970 +3973 +3974 +3976 +4038 +4039 +4151 +4152 +4153 +4155 +4237 +4238 +4957 +4960 +5908 +5909 +5940 +5941 +6098 +6099 +6109 +6110 +6313 +6314 +6457 +6460 +6679 +6681 +6752 +6753 +6773 +6781 +6783 +6784 +6832 +6846 +6964 +6965 +6980 +6981 +7019 +7028 +7082 +7084 +7142 +7143 +7154 +7156 +7223 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8400 +8413 +8417 +8418 +8421 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12441 +12443 +42607 +42608 +42612 +42622 +42654 +42656 +42736 +42738 +43014 +43015 +43204 +43205 +43232 +43250 +43307 +43310 +43347 +43348 +43443 +43444 +43456 +43457 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43766 +43767 +44013 +44014 +64286 +64287 +65056 +65072 +66045 +66046 +66272 +66273 +66422 +66427 +68109 +68110 +68111 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69702 +69703 +69759 +69760 +69817 +69819 +69888 +69891 +69939 +69941 +70003 +70004 +70080 +70081 +70090 +70091 +70197 +70199 +70377 +70379 +70460 +70461 +70477 +70478 +70502 +70509 +70512 +70517 +70722 +70723 +70726 +70727 +70850 +70852 +71103 +71105 +71231 +71232 +71350 +71352 +71467 +71468 +72244 +72245 +72263 +72264 +72345 +72346 +72767 +72768 +73026 +73027 +73028 +73030 +92912 +92917 +92976 +92983 +113822 +113823 +119141 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V46 +2364 +2365 +2492 +2493 +2620 +2621 +2748 +2749 +2876 +2877 +3260 +3261 +4151 +4152 +6964 +6965 +7142 +7143 +7223 +7224 +43443 +43444 +69818 +69819 +70003 +70004 +70090 +70091 +70198 +70199 +70377 +70378 +70460 +70461 +70726 +70727 +70851 +70852 +71104 +71105 +71351 +71352 +73026 +73027 +125258 +125259 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V144 +790 +794 +796 +801 +803 +807 +809 +820 +825 +829 +839 +842 +845 +847 +851 +855 +857 +859 +1425 +1426 +1430 +1431 +1435 +1436 +1442 +1448 +1450 +1451 +1477 +1478 +1621 +1623 +1628 +1629 +1631 +1632 +1763 +1764 +1770 +1771 +1773 +1774 +1841 +1842 +1844 +1845 +1847 +1850 +1851 +1853 +1854 +1855 +1858 +1859 +1860 +1861 +1862 +1863 +1864 +1865 +2034 +2035 +2137 +2140 +2275 +2276 +2278 +2279 +2281 +2282 +2285 +2288 +2294 +2295 +2297 +2299 +2386 +2387 +3864 +3866 +3893 +3894 +3895 +3896 +4038 +4039 +4237 +4238 +6459 +6460 +6680 +6681 +6783 +6784 +6837 +6843 +6845 +6846 +7020 +7021 +7381 +7386 +7388 +7392 +7405 +7406 +7618 +7619 +7626 +7627 +7631 +7632 +7673 +7674 +7677 +7678 +7679 +7680 +8424 +8425 +8428 +8432 +43307 +43310 +43700 +43701 +65063 +65070 +66045 +66046 +66272 +66273 +68109 +68110 +68154 +68155 +68326 +68327 +119163 +119171 +119178 +119180 +125136 +125143 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1454 +1455 +6313 +6314 +7671 +7673 +12331 +12332 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +1536 +1542 +1757 +1758 +1807 +1808 +2274 +2275 +3406 +3407 +69821 +69822 +70082 +70084 +72250 +72251 +72326 +72330 +73030 +73031 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V38 +0 +10 +11 +13 +14 +32 +127 +160 +173 +174 +1564 +1565 +6158 +6159 +8203 +8204 +8206 +8208 +8232 +8239 +8288 +8304 +55296 +57344 +65279 +65280 +65520 +65532 +113824 +113828 +119155 +119163 +917504 +917536 +917632 +917760 +918000 +921600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V798 +44033 +44060 +44061 +44088 +44089 +44116 +44117 +44144 +44145 +44172 +44173 +44200 +44201 +44228 +44229 +44256 +44257 +44284 +44285 +44312 +44313 +44340 +44341 +44368 +44369 +44396 +44397 +44424 +44425 +44452 +44453 +44480 +44481 +44508 +44509 +44536 +44537 +44564 +44565 +44592 +44593 +44620 +44621 +44648 +44649 +44676 +44677 +44704 +44705 +44732 +44733 +44760 +44761 +44788 +44789 +44816 +44817 +44844 +44845 +44872 +44873 +44900 +44901 +44928 +44929 +44956 +44957 +44984 +44985 +45012 +45013 +45040 +45041 +45068 +45069 +45096 +45097 +45124 +45125 +45152 +45153 +45180 +45181 +45208 +45209 +45236 +45237 +45264 +45265 +45292 +45293 +45320 +45321 +45348 +45349 +45376 +45377 +45404 +45405 +45432 +45433 +45460 +45461 +45488 +45489 +45516 +45517 +45544 +45545 +45572 +45573 +45600 +45601 +45628 +45629 +45656 +45657 +45684 +45685 +45712 +45713 +45740 +45741 +45768 +45769 +45796 +45797 +45824 +45825 +45852 +45853 +45880 +45881 +45908 +45909 +45936 +45937 +45964 +45965 +45992 +45993 +46020 +46021 +46048 +46049 +46076 +46077 +46104 +46105 +46132 +46133 +46160 +46161 +46188 +46189 +46216 +46217 +46244 +46245 +46272 +46273 +46300 +46301 +46328 +46329 +46356 +46357 +46384 +46385 +46412 +46413 +46440 +46441 +46468 +46469 +46496 +46497 +46524 +46525 +46552 +46553 +46580 +46581 +46608 +46609 +46636 +46637 +46664 +46665 +46692 +46693 +46720 +46721 +46748 +46749 +46776 +46777 +46804 +46805 +46832 +46833 +46860 +46861 +46888 +46889 +46916 +46917 +46944 +46945 +46972 +46973 +47000 +47001 +47028 +47029 +47056 +47057 +47084 +47085 +47112 +47113 +47140 +47141 +47168 +47169 +47196 +47197 +47224 +47225 +47252 +47253 +47280 +47281 +47308 +47309 +47336 +47337 +47364 +47365 +47392 +47393 +47420 +47421 +47448 +47449 +47476 +47477 +47504 +47505 +47532 +47533 +47560 +47561 +47588 +47589 +47616 +47617 +47644 +47645 +47672 +47673 +47700 +47701 +47728 +47729 +47756 +47757 +47784 +47785 +47812 +47813 +47840 +47841 +47868 +47869 +47896 +47897 +47924 +47925 +47952 +47953 +47980 +47981 +48008 +48009 +48036 +48037 +48064 +48065 +48092 +48093 +48120 +48121 +48148 +48149 +48176 +48177 +48204 +48205 +48232 +48233 +48260 +48261 +48288 +48289 +48316 +48317 +48344 +48345 +48372 +48373 +48400 +48401 +48428 +48429 +48456 +48457 +48484 +48485 +48512 +48513 +48540 +48541 +48568 +48569 +48596 +48597 +48624 +48625 +48652 +48653 +48680 +48681 +48708 +48709 +48736 +48737 +48764 +48765 +48792 +48793 +48820 +48821 +48848 +48849 +48876 +48877 +48904 +48905 +48932 +48933 +48960 +48961 +48988 +48989 +49016 +49017 +49044 +49045 +49072 +49073 +49100 +49101 +49128 +49129 +49156 +49157 +49184 +49185 +49212 +49213 +49240 +49241 +49268 +49269 +49296 +49297 +49324 +49325 +49352 +49353 +49380 +49381 +49408 +49409 +49436 +49437 +49464 +49465 +49492 +49493 +49520 +49521 +49548 +49549 +49576 +49577 +49604 +49605 +49632 +49633 +49660 +49661 +49688 +49689 +49716 +49717 +49744 +49745 +49772 +49773 +49800 +49801 +49828 +49829 +49856 +49857 +49884 +49885 +49912 +49913 +49940 +49941 +49968 +49969 +49996 +49997 +50024 +50025 +50052 +50053 +50080 +50081 +50108 +50109 +50136 +50137 +50164 +50165 +50192 +50193 +50220 +50221 +50248 +50249 +50276 +50277 +50304 +50305 +50332 +50333 +50360 +50361 +50388 +50389 +50416 +50417 +50444 +50445 +50472 +50473 +50500 +50501 +50528 +50529 +50556 +50557 +50584 +50585 +50612 +50613 +50640 +50641 +50668 +50669 +50696 +50697 +50724 +50725 +50752 +50753 +50780 +50781 +50808 +50809 +50836 +50837 +50864 +50865 +50892 +50893 +50920 +50921 +50948 +50949 +50976 +50977 +51004 +51005 +51032 +51033 +51060 +51061 +51088 +51089 +51116 +51117 +51144 +51145 +51172 +51173 +51200 +51201 +51228 +51229 +51256 +51257 +51284 +51285 +51312 +51313 +51340 +51341 +51368 +51369 +51396 +51397 +51424 +51425 +51452 +51453 +51480 +51481 +51508 +51509 +51536 +51537 +51564 +51565 +51592 +51593 +51620 +51621 +51648 +51649 +51676 +51677 +51704 +51705 +51732 +51733 +51760 +51761 +51788 +51789 +51816 +51817 +51844 +51845 +51872 +51873 +51900 +51901 +51928 +51929 +51956 +51957 +51984 +51985 +52012 +52013 +52040 +52041 +52068 +52069 +52096 +52097 +52124 +52125 +52152 +52153 +52180 +52181 +52208 +52209 +52236 +52237 +52264 +52265 +52292 +52293 +52320 +52321 +52348 +52349 +52376 +52377 +52404 +52405 +52432 +52433 +52460 +52461 +52488 +52489 +52516 +52517 +52544 +52545 +52572 +52573 +52600 +52601 +52628 +52629 +52656 +52657 +52684 +52685 +52712 +52713 +52740 +52741 +52768 +52769 +52796 +52797 +52824 +52825 +52852 +52853 +52880 +52881 +52908 +52909 +52936 +52937 +52964 +52965 +52992 +52993 +53020 +53021 +53048 +53049 +53076 +53077 +53104 +53105 +53132 +53133 +53160 +53161 +53188 +53189 +53216 +53217 +53244 +53245 +53272 +53273 +53300 +53301 +53328 +53329 +53356 +53357 +53384 +53385 +53412 +53413 +53440 +53441 +53468 +53469 +53496 +53497 +53524 +53525 +53552 +53553 +53580 +53581 +53608 +53609 +53636 +53637 +53664 +53665 +53692 +53693 +53720 +53721 +53748 +53749 +53776 +53777 +53804 +53805 +53832 +53833 +53860 +53861 +53888 +53889 +53916 +53917 +53944 +53945 +53972 +53973 +54000 +54001 +54028 +54029 +54056 +54057 +54084 +54085 +54112 +54113 +54140 +54141 +54168 +54169 +54196 +54197 +54224 +54225 +54252 +54253 +54280 +54281 +54308 +54309 +54336 +54337 +54364 +54365 +54392 +54393 +54420 +54421 +54448 +54449 +54476 +54477 +54504 +54505 +54532 +54533 +54560 +54561 +54588 +54589 +54616 +54617 +54644 +54645 +54672 +54673 +54700 +54701 +54728 +54729 +54756 +54757 +54784 +54785 +54812 +54813 +54840 +54841 +54868 +54869 +54896 +54897 +54924 +54925 +54952 +54953 +54980 +54981 +55008 +55009 +55036 +55037 +55064 +55065 +55092 +55093 +55120 +55121 +55148 +55149 +55176 +55177 +55204 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V638 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2492 +2493 +2494 +2495 +2497 +2501 +2509 +2510 +2519 +2520 +2530 +2532 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2810 +2816 +2817 +2818 +2876 +2877 +2878 +2880 +2881 +2885 +2893 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3007 +3008 +3009 +3021 +3022 +3031 +3032 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3202 +3260 +3261 +3263 +3264 +3266 +3267 +3270 +3271 +3276 +3278 +3285 +3287 +3298 +3300 +3328 +3330 +3387 +3389 +3390 +3391 +3393 +3397 +3405 +3406 +3415 +3416 +3426 +3428 +3530 +3531 +3535 +3536 +3538 +3541 +3542 +3543 +3551 +3552 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6832 +6847 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8204 +8205 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43493 +43494 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43756 +43758 +43766 +43767 +44005 +44006 +44008 +44009 +44013 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +65438 +65440 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69633 +69634 +69688 +69703 +69759 +69762 +69811 +69815 +69817 +69819 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70462 +70463 +70464 +70465 +70487 +70488 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70832 +70833 +70835 +70841 +70842 +70843 +70845 +70846 +70847 +70849 +70850 +70852 +71087 +71088 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72767 +72768 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94095 +94099 +113821 +113823 +119141 +119142 +119143 +119146 +119150 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V671 +32 +127 +160 +173 +174 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1536 +1542 +1552 +1563 +1564 +1565 +1611 +1632 +1648 +1649 +1750 +1758 +1759 +1765 +1767 +1769 +1770 +1774 +1807 +1808 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2404 +2433 +2436 +2492 +2493 +2494 +2501 +2503 +2505 +2507 +2510 +2519 +2520 +2530 +2532 +2561 +2564 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2692 +2748 +2749 +2750 +2758 +2759 +2762 +2763 +2766 +2786 +2788 +2810 +2816 +2817 +2820 +2876 +2877 +2878 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2914 +2916 +2946 +2947 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3072 +3076 +3134 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3204 +3260 +3261 +3262 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3298 +3300 +3328 +3332 +3387 +3389 +3390 +3397 +3398 +3401 +3402 +3407 +3415 +3416 +3426 +3428 +3458 +3460 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3633 +3634 +3635 +3643 +3655 +3663 +3761 +3762 +3763 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3953 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4152 +4153 +4159 +4182 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4228 +4231 +4237 +4238 +4253 +4254 +4352 +4608 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6100 +6109 +6110 +6155 +6159 +6277 +6279 +6313 +6314 +6432 +6444 +6448 +6460 +6679 +6684 +6741 +6751 +6752 +6753 +6754 +6755 +6757 +6781 +6783 +6784 +6832 +6847 +6912 +6917 +6964 +6981 +7019 +7028 +7040 +7043 +7073 +7086 +7142 +7156 +7204 +7224 +7376 +7379 +7380 +7401 +7405 +7406 +7410 +7413 +7415 +7418 +7616 +7674 +7675 +7680 +8203 +8208 +8232 +8239 +8288 +8304 +8400 +8433 +9757 +9758 +9792 +9793 +9794 +9795 +9877 +9879 +9977 +9978 +9992 +9993 +9994 +9998 +10084 +10085 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12336 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43048 +43136 +43138 +43188 +43206 +43232 +43250 +43302 +43310 +43335 +43348 +43360 +43389 +43392 +43396 +43443 +43457 +43493 +43494 +43561 +43575 +43587 +43588 +43596 +43598 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43755 +43760 +43765 +43767 +44003 +44011 +44012 +44014 +44032 +55204 +55216 +55239 +55243 +55292 +55296 +57344 +64286 +64287 +65024 +65040 +65056 +65072 +65279 +65280 +65438 +65440 +65520 +65532 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69632 +69635 +69688 +69703 +69759 +69763 +69808 +69819 +69821 +69822 +69888 +69891 +69927 +69941 +70003 +70004 +70016 +70019 +70067 +70081 +70082 +70084 +70090 +70093 +70188 +70200 +70206 +70207 +70367 +70379 +70400 +70404 +70460 +70461 +70462 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70498 +70500 +70502 +70509 +70512 +70517 +70709 +70727 +70832 +70852 +71087 +71094 +71096 +71105 +71132 +71134 +71216 +71233 +71339 +71352 +71453 +71468 +72193 +72203 +72243 +72255 +72263 +72264 +72273 +72284 +72326 +72346 +72751 +72759 +72760 +72768 +72850 +72872 +72873 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +92912 +92917 +92976 +92983 +94033 +94079 +94095 +94099 +113821 +113823 +113824 +113828 +119141 +119146 +119149 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +127462 +127488 +127752 +127753 +127806 +127807 +127859 +127860 +127877 +127878 +127891 +127892 +127908 +127909 +127912 +127913 +127938 +127941 +127943 +127944 +127946 +127949 +127979 +127980 +127981 +127982 +127995 +128000 +128066 +128068 +128070 +128081 +128102 +128106 +128110 +128111 +128112 +128121 +128124 +128125 +128129 +128132 +128133 +128136 +128139 +128140 +128170 +128171 +128187 +128189 +128295 +128296 +128300 +128301 +128372 +128374 +128378 +128379 +128400 +128401 +128405 +128407 +128488 +128489 +128581 +128584 +128587 +128592 +128640 +128641 +128658 +128659 +128675 +128676 +128692 +128695 +128704 +128705 +128716 +128717 +129304 +129309 +129310 +129312 +129318 +129319 +129328 +129338 +129341 +129343 +129489 +129502 +917504 +921600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V40 +9792 +9793 +9794 +9795 +9877 +9879 +9992 +9993 +10084 +10085 +127752 +127753 +127806 +127807 +127859 +127860 +127891 +127892 +127908 +127909 +127912 +127913 +127979 +127980 +127981 +127982 +128139 +128140 +128187 +128189 +128295 +128296 +128300 +128301 +128488 +128489 +128640 +128641 +128658 +128659 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V798 +44032 +44033 +44060 +44061 +44088 +44089 +44116 +44117 +44144 +44145 +44172 +44173 +44200 +44201 +44228 +44229 +44256 +44257 +44284 +44285 +44312 +44313 +44340 +44341 +44368 +44369 +44396 +44397 +44424 +44425 +44452 +44453 +44480 +44481 +44508 +44509 +44536 +44537 +44564 +44565 +44592 +44593 +44620 +44621 +44648 +44649 +44676 +44677 +44704 +44705 +44732 +44733 +44760 +44761 +44788 +44789 +44816 +44817 +44844 +44845 +44872 +44873 +44900 +44901 +44928 +44929 +44956 +44957 +44984 +44985 +45012 +45013 +45040 +45041 +45068 +45069 +45096 +45097 +45124 +45125 +45152 +45153 +45180 +45181 +45208 +45209 +45236 +45237 +45264 +45265 +45292 +45293 +45320 +45321 +45348 +45349 +45376 +45377 +45404 +45405 +45432 +45433 +45460 +45461 +45488 +45489 +45516 +45517 +45544 +45545 +45572 +45573 +45600 +45601 +45628 +45629 +45656 +45657 +45684 +45685 +45712 +45713 +45740 +45741 +45768 +45769 +45796 +45797 +45824 +45825 +45852 +45853 +45880 +45881 +45908 +45909 +45936 +45937 +45964 +45965 +45992 +45993 +46020 +46021 +46048 +46049 +46076 +46077 +46104 +46105 +46132 +46133 +46160 +46161 +46188 +46189 +46216 +46217 +46244 +46245 +46272 +46273 +46300 +46301 +46328 +46329 +46356 +46357 +46384 +46385 +46412 +46413 +46440 +46441 +46468 +46469 +46496 +46497 +46524 +46525 +46552 +46553 +46580 +46581 +46608 +46609 +46636 +46637 +46664 +46665 +46692 +46693 +46720 +46721 +46748 +46749 +46776 +46777 +46804 +46805 +46832 +46833 +46860 +46861 +46888 +46889 +46916 +46917 +46944 +46945 +46972 +46973 +47000 +47001 +47028 +47029 +47056 +47057 +47084 +47085 +47112 +47113 +47140 +47141 +47168 +47169 +47196 +47197 +47224 +47225 +47252 +47253 +47280 +47281 +47308 +47309 +47336 +47337 +47364 +47365 +47392 +47393 +47420 +47421 +47448 +47449 +47476 +47477 +47504 +47505 +47532 +47533 +47560 +47561 +47588 +47589 +47616 +47617 +47644 +47645 +47672 +47673 +47700 +47701 +47728 +47729 +47756 +47757 +47784 +47785 +47812 +47813 +47840 +47841 +47868 +47869 +47896 +47897 +47924 +47925 +47952 +47953 +47980 +47981 +48008 +48009 +48036 +48037 +48064 +48065 +48092 +48093 +48120 +48121 +48148 +48149 +48176 +48177 +48204 +48205 +48232 +48233 +48260 +48261 +48288 +48289 +48316 +48317 +48344 +48345 +48372 +48373 +48400 +48401 +48428 +48429 +48456 +48457 +48484 +48485 +48512 +48513 +48540 +48541 +48568 +48569 +48596 +48597 +48624 +48625 +48652 +48653 +48680 +48681 +48708 +48709 +48736 +48737 +48764 +48765 +48792 +48793 +48820 +48821 +48848 +48849 +48876 +48877 +48904 +48905 +48932 +48933 +48960 +48961 +48988 +48989 +49016 +49017 +49044 +49045 +49072 +49073 +49100 +49101 +49128 +49129 +49156 +49157 +49184 +49185 +49212 +49213 +49240 +49241 +49268 +49269 +49296 +49297 +49324 +49325 +49352 +49353 +49380 +49381 +49408 +49409 +49436 +49437 +49464 +49465 +49492 +49493 +49520 +49521 +49548 +49549 +49576 +49577 +49604 +49605 +49632 +49633 +49660 +49661 +49688 +49689 +49716 +49717 +49744 +49745 +49772 +49773 +49800 +49801 +49828 +49829 +49856 +49857 +49884 +49885 +49912 +49913 +49940 +49941 +49968 +49969 +49996 +49997 +50024 +50025 +50052 +50053 +50080 +50081 +50108 +50109 +50136 +50137 +50164 +50165 +50192 +50193 +50220 +50221 +50248 +50249 +50276 +50277 +50304 +50305 +50332 +50333 +50360 +50361 +50388 +50389 +50416 +50417 +50444 +50445 +50472 +50473 +50500 +50501 +50528 +50529 +50556 +50557 +50584 +50585 +50612 +50613 +50640 +50641 +50668 +50669 +50696 +50697 +50724 +50725 +50752 +50753 +50780 +50781 +50808 +50809 +50836 +50837 +50864 +50865 +50892 +50893 +50920 +50921 +50948 +50949 +50976 +50977 +51004 +51005 +51032 +51033 +51060 +51061 +51088 +51089 +51116 +51117 +51144 +51145 +51172 +51173 +51200 +51201 +51228 +51229 +51256 +51257 +51284 +51285 +51312 +51313 +51340 +51341 +51368 +51369 +51396 +51397 +51424 +51425 +51452 +51453 +51480 +51481 +51508 +51509 +51536 +51537 +51564 +51565 +51592 +51593 +51620 +51621 +51648 +51649 +51676 +51677 +51704 +51705 +51732 +51733 +51760 +51761 +51788 +51789 +51816 +51817 +51844 +51845 +51872 +51873 +51900 +51901 +51928 +51929 +51956 +51957 +51984 +51985 +52012 +52013 +52040 +52041 +52068 +52069 +52096 +52097 +52124 +52125 +52152 +52153 +52180 +52181 +52208 +52209 +52236 +52237 +52264 +52265 +52292 +52293 +52320 +52321 +52348 +52349 +52376 +52377 +52404 +52405 +52432 +52433 +52460 +52461 +52488 +52489 +52516 +52517 +52544 +52545 +52572 +52573 +52600 +52601 +52628 +52629 +52656 +52657 +52684 +52685 +52712 +52713 +52740 +52741 +52768 +52769 +52796 +52797 +52824 +52825 +52852 +52853 +52880 +52881 +52908 +52909 +52936 +52937 +52964 +52965 +52992 +52993 +53020 +53021 +53048 +53049 +53076 +53077 +53104 +53105 +53132 +53133 +53160 +53161 +53188 +53189 +53216 +53217 +53244 +53245 +53272 +53273 +53300 +53301 +53328 +53329 +53356 +53357 +53384 +53385 +53412 +53413 +53440 +53441 +53468 +53469 +53496 +53497 +53524 +53525 +53552 +53553 +53580 +53581 +53608 +53609 +53636 +53637 +53664 +53665 +53692 +53693 +53720 +53721 +53748 +53749 +53776 +53777 +53804 +53805 +53832 +53833 +53860 +53861 +53888 +53889 +53916 +53917 +53944 +53945 +53972 +53973 +54000 +54001 +54028 +54029 +54056 +54057 +54084 +54085 +54112 +54113 +54140 +54141 +54168 +54169 +54196 +54197 +54224 +54225 +54252 +54253 +54280 +54281 +54308 +54309 +54336 +54337 +54364 +54365 +54392 +54393 +54420 +54421 +54448 +54449 +54476 +54477 +54504 +54505 +54532 +54533 +54560 +54561 +54588 +54589 +54616 +54617 +54644 +54645 +54672 +54673 +54700 +54701 +54728 +54729 +54756 +54757 +54784 +54785 +54812 +54813 +54840 +54841 +54868 +54869 +54896 +54897 +54924 +54925 +54952 +54953 +54980 +54981 +55008 +55009 +55036 +55037 +55064 +55065 +55092 +55093 +55120 +55121 +55148 +55149 +55176 +55177 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V290 +2307 +2308 +2363 +2364 +2366 +2369 +2377 +2381 +2382 +2384 +2434 +2436 +2495 +2497 +2503 +2505 +2507 +2509 +2563 +2564 +2622 +2625 +2691 +2692 +2750 +2753 +2761 +2762 +2763 +2765 +2818 +2820 +2880 +2881 +2887 +2889 +2891 +2893 +3007 +3008 +3009 +3011 +3014 +3017 +3018 +3021 +3073 +3076 +3137 +3141 +3202 +3204 +3262 +3263 +3264 +3266 +3267 +3269 +3271 +3273 +3274 +3276 +3330 +3332 +3391 +3393 +3398 +3401 +3402 +3405 +3458 +3460 +3536 +3538 +3544 +3551 +3570 +3572 +3635 +3636 +3763 +3764 +3902 +3904 +3967 +3968 +4145 +4146 +4155 +4157 +4182 +4184 +4228 +4229 +6070 +6071 +6078 +6086 +6087 +6089 +6435 +6439 +6441 +6444 +6448 +6450 +6451 +6457 +6681 +6683 +6741 +6742 +6743 +6744 +6765 +6771 +6916 +6917 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +6981 +7042 +7043 +7073 +7074 +7078 +7080 +7082 +7083 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7156 +7204 +7212 +7220 +7222 +7393 +7394 +7410 +7412 +7415 +7416 +43043 +43045 +43047 +43048 +43136 +43138 +43188 +43204 +43346 +43348 +43395 +43396 +43444 +43446 +43450 +43452 +43453 +43457 +43567 +43569 +43571 +43573 +43597 +43598 +43755 +43756 +43758 +43760 +43765 +43766 +44003 +44005 +44006 +44008 +44009 +44011 +44012 +44013 +69632 +69633 +69634 +69635 +69762 +69763 +69808 +69811 +69815 +69817 +69932 +69933 +70018 +70019 +70067 +70070 +70079 +70081 +70188 +70191 +70194 +70196 +70197 +70198 +70368 +70371 +70402 +70404 +70463 +70464 +70465 +70469 +70471 +70473 +70475 +70478 +70498 +70500 +70709 +70712 +70720 +70722 +70725 +70726 +70833 +70835 +70841 +70842 +70843 +70845 +70846 +70847 +70849 +70850 +71088 +71090 +71096 +71100 +71102 +71103 +71216 +71219 +71227 +71229 +71230 +71231 +71340 +71341 +71342 +71344 +71350 +71351 +71456 +71458 +71462 +71463 +72199 +72201 +72249 +72250 +72279 +72281 +72343 +72344 +72751 +72752 +72766 +72767 +72873 +72874 +72881 +72882 +72884 +72885 +94033 +94079 +119142 +119143 +119149 +119150 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V62 +9757 +9758 +9977 +9978 +9994 +9998 +127877 +127878 +127938 +127941 +127943 +127944 +127946 +127949 +128066 +128068 +128070 +128081 +128110 +128111 +128112 +128121 +128124 +128125 +128129 +128132 +128133 +128136 +128170 +128171 +128372 +128374 +128378 +128379 +128400 +128401 +128405 +128407 +128581 +128584 +128587 +128592 +128675 +128676 +128692 +128695 +128704 +128705 +128716 +128717 +129304 +129309 +129310 +129312 +129318 +129319 +129328 +129338 +129341 +129343 +129489 +129502 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V276 +43 +44 +60 +63 +94 +95 +124 +125 +126 +127 +172 +173 +177 +178 +215 +216 +247 +248 +976 +979 +981 +982 +1008 +1010 +1012 +1015 +1542 +1545 +8214 +8215 +8242 +8245 +8256 +8257 +8260 +8261 +8274 +8275 +8289 +8293 +8314 +8319 +8330 +8335 +8400 +8413 +8417 +8418 +8421 +8423 +8427 +8432 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8472 +8478 +8484 +8485 +8488 +8490 +8492 +8494 +8495 +8498 +8499 +8505 +8508 +8522 +8523 +8524 +8592 +8616 +8617 +8623 +8624 +8626 +8630 +8632 +8636 +8668 +8669 +8670 +8676 +8678 +8692 +8960 +8968 +8972 +8992 +8994 +9084 +9085 +9115 +9142 +9143 +9144 +9168 +9169 +9180 +9187 +9632 +9634 +9646 +9656 +9660 +9666 +9670 +9672 +9674 +9676 +9679 +9684 +9698 +9699 +9700 +9701 +9703 +9709 +9720 +9728 +9733 +9735 +9792 +9793 +9794 +9795 +9824 +9828 +9837 +9840 +10176 +10240 +10496 +11008 +11056 +11077 +11079 +11085 +64297 +64298 +65121 +65127 +65128 +65129 +65291 +65292 +65308 +65311 +65340 +65341 +65342 +65343 +65372 +65373 +65374 +65375 +65506 +65507 +65513 +65517 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V270 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +443 +444 +448 +452 +660 +661 +697 +704 +706 +736 +741 +837 +838 +880 +884 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1377 +1416 +4256 +4294 +4295 +4296 +4301 +4302 +5024 +5110 +5112 +5118 +7296 +7305 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8501 +8505 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8576 +8579 +8581 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42560 +42606 +42624 +42654 +42786 +42888 +42891 +42895 +42896 +42927 +42928 +42936 +43000 +43003 +43824 +43867 +43868 +43878 +43888 +43968 +64256 +64263 +64275 +64280 +65313 +65339 +65345 +65371 +66560 +66640 +66736 +66772 +66776 +66812 +68736 +68787 +68800 +68851 +71840 +71904 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +125184 +125252 +127280 +127306 +127312 +127338 +127344 +127370 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +173 +174 +847 +848 +1564 +1565 +4447 +4449 +6068 +6070 +6155 +6159 +8203 +8208 +8234 +8239 +8288 +8304 +12644 +12645 +65024 +65040 +65279 +65280 +65440 +65441 +65520 +65529 +113824 +113828 +119155 +119163 +917504 +921600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +1536 +1542 +1757 +1758 +1807 +1808 +2274 +2275 +69821 +69822 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +2677 +2678 +3772 +3774 +4155 +4159 +4190 +4193 +4226 +4227 +6741 +6743 +43454 +43456 +43571 +43575 +71453 +71456 +72251 +72255 +73031 +73032 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V298 +2325 +2362 +2392 +2400 +2424 +2432 +2453 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2524 +2526 +2527 +2528 +2544 +2546 +2581 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2709 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2809 +2810 +2837 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2908 +2910 +2911 +2912 +2929 +2930 +2965 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3093 +3113 +3114 +3130 +3160 +3163 +3221 +3241 +3242 +3252 +3253 +3258 +3294 +3295 +3349 +3387 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3631 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3759 +3804 +3808 +3904 +3912 +3913 +3949 +4096 +4129 +4159 +4160 +4176 +4178 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +5891 +5901 +5902 +5906 +5923 +5938 +5955 +5970 +5987 +5997 +5998 +6001 +6016 +6051 +6401 +6431 +6480 +6499 +6528 +6572 +6656 +6679 +6688 +6733 +6739 +6741 +6931 +6964 +6981 +6988 +7050 +7073 +7086 +7088 +7099 +7102 +7104 +7140 +7168 +7204 +7245 +7248 +43015 +43019 +43020 +43043 +43072 +43102 +43106 +43110 +43113 +43121 +43122 +43123 +43154 +43188 +43274 +43298 +43312 +43335 +43401 +43404 +43407 +43443 +43488 +43493 +43495 +43504 +43514 +43519 +43526 +43561 +43616 +43632 +43633 +43636 +43642 +43643 +43646 +43696 +43746 +43755 +43968 +43982 +43984 +43985 +43986 +43995 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +69651 +69688 +69773 +69808 +69895 +69927 +69973 +70003 +70033 +70067 +70152 +70162 +70163 +70188 +70276 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70330 +70367 +70421 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70670 +70709 +70799 +70832 +71054 +71087 +71182 +71216 +71306 +71339 +71424 +71450 +72203 +72243 +72284 +72324 +72718 +72751 +72818 +72848 +72972 +73009 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V156 +2308 +2325 +2400 +2402 +2418 +2424 +2437 +2445 +2447 +2449 +2451 +2453 +2528 +2530 +2565 +2571 +2575 +2577 +2579 +2581 +2693 +2702 +2703 +2706 +2707 +2709 +2784 +2786 +2821 +2829 +2831 +2833 +2835 +2837 +2912 +2914 +2949 +2955 +2958 +2961 +2962 +2965 +3077 +3085 +3086 +3089 +3090 +3093 +3168 +3170 +3205 +3213 +3214 +3217 +3218 +3221 +3296 +3298 +3333 +3341 +3342 +3345 +3346 +3349 +3423 +3426 +3461 +3479 +4129 +4139 +4178 +4182 +5888 +5891 +5920 +5923 +5952 +5955 +5984 +5987 +6051 +6068 +6733 +6739 +6917 +6931 +7043 +7050 +7140 +7142 +43008 +43010 +43011 +43014 +43138 +43154 +43396 +43401 +43404 +43407 +43520 +43526 +43744 +43746 +43982 +43984 +43985 +43986 +69637 +69651 +69763 +69773 +69891 +69895 +70019 +70033 +70144 +70152 +70272 +70276 +70320 +70330 +70405 +70413 +70415 +70417 +70419 +70421 +70496 +70498 +70656 +70670 +70785 +70799 +71040 +71054 +71128 +71132 +71168 +71182 +71296 +71306 +72192 +72193 +72272 +72273 +72704 +72713 +72714 +72718 +72960 +72967 +72968 +72970 +72971 +72972 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V30 +3656 +3660 +3784 +3788 +4151 +4152 +4195 +4197 +4201 +4206 +4231 +4238 +4239 +4240 +4250 +4252 +6600 +6602 +6773 +6778 +43307 +43310 +43643 +43646 +43711 +43712 +43713 +43714 +44012 +44013 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +6092 +6093 +6746 +6747 +6915 +6916 +7041 +7042 +43394 +43395 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +4153 +4154 +6098 +6099 +6752 +6753 +7083 +7084 +43766 +43767 +68159 +68160 +69939 +69940 +72263 +72264 +72345 +72346 +73029 +73030 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V48 +2364 +2365 +2492 +2493 +2620 +2621 +2748 +2749 +2813 +2816 +2876 +2877 +3260 +3261 +3897 +3898 +6964 +6965 +7142 +7143 +7223 +7224 +43443 +43444 +68152 +68155 +69818 +69819 +70003 +70004 +70090 +70091 +70198 +70199 +70377 +70378 +70460 +70461 +70726 +70727 +70851 +70852 +71104 +71105 +71351 +71352 +73026 +73027 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V86 +48 +58 +2406 +2416 +2534 +2544 +2662 +2672 +2790 +2800 +2918 +2928 +3046 +3056 +3174 +3184 +3302 +3312 +3430 +3440 +3558 +3568 +3664 +3674 +3792 +3802 +3872 +3892 +4160 +4170 +4240 +4250 +6112 +6122 +6470 +6480 +6608 +6618 +6784 +6794 +6800 +6810 +6992 +7002 +7088 +7098 +7232 +7242 +43216 +43226 +43264 +43274 +43472 +43482 +43504 +43514 +43600 +43610 +44016 +44026 +68160 +68168 +69734 +69744 +69942 +69952 +70096 +70106 +70113 +70133 +70384 +70394 +70736 +70746 +70864 +70874 +71248 +71258 +71360 +71370 +71472 +71484 +72784 +72813 +73040 +73050 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +178 +180 +3893 +3894 +3895 +3896 +4038 +4039 +6091 +6092 +6094 +6097 +6099 +6100 +6109 +6110 +6459 +6460 +6779 +6781 +6783 +6784 +7222 +7223 +7675 +7676 +8308 +8309 +8322 +8325 +72243 +72244 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V24 +6448 +6450 +6451 +6458 +6593 +6600 +6744 +6746 +7102 +7104 +7152 +7154 +7213 +7220 +43188 +43189 +43343 +43347 +43584 +43598 +43995 +44003 +72330 +72342 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +2385 +2387 +2810 +2813 +7376 +7379 +7380 +7394 +7412 +7413 +7415 +7418 +43232 +43250 +70206 +70207 +70502 +70509 +70512 +70517 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V96 +2304 +2307 +2433 +2435 +2556 +2557 +2561 +2563 +2672 +2673 +2689 +2691 +2817 +2819 +2946 +2947 +3072 +3075 +3201 +3203 +3328 +3331 +3458 +3459 +3661 +3662 +3789 +3790 +3966 +3967 +3970 +3972 +4150 +4151 +6086 +6087 +6450 +6451 +6772 +6773 +6912 +6915 +7040 +7041 +7220 +7222 +43019 +43020 +43123 +43124 +43136 +43137 +43205 +43206 +43250 +43252 +43392 +43394 +68110 +68111 +69632 +69634 +69760 +69762 +69888 +69890 +70016 +70018 +70196 +70197 +70367 +70368 +70400 +70403 +70494 +70496 +70723 +70725 +70847 +70849 +71100 +71102 +71229 +71230 +71339 +71340 +72245 +72249 +72342 +72343 +72764 +72766 +72885 +72887 +73024 +73025 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V613 +0 +45 +46 +48 +58 +160 +161 +178 +180 +215 +216 +2304 +2384 +2385 +2387 +2389 +2404 +2406 +2416 +2418 +2432 +2433 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2649 +2653 +2654 +2655 +2662 +2676 +2677 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2784 +2788 +2790 +2800 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2928 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3031 +3032 +3046 +3056 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3201 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3407 +3412 +3416 +3423 +3428 +3430 +3440 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3572 +3585 +3631 +3632 +3643 +3648 +3654 +3655 +3663 +3664 +3674 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3759 +3760 +3770 +3771 +3774 +3776 +3781 +3784 +3788 +3789 +3790 +3792 +3802 +3804 +3808 +3872 +3892 +3893 +3894 +3895 +3896 +3897 +3898 +3904 +3912 +3913 +3949 +3953 +3974 +3976 +3992 +3993 +4029 +4038 +4039 +4096 +4170 +4174 +4175 +4176 +4254 +5888 +5901 +5902 +5909 +5920 +5941 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6068 +6070 +6100 +6108 +6110 +6112 +6122 +6400 +6431 +6432 +6444 +6448 +6460 +6470 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6618 +6656 +6684 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6912 +6988 +6992 +7002 +7040 +7156 +7168 +7224 +7232 +7242 +7245 +7248 +7376 +7379 +7380 +7394 +7410 +7413 +7415 +7418 +7675 +7676 +8204 +8206 +8208 +8213 +8308 +8309 +8322 +8325 +9676 +9677 +43008 +43010 +43011 +43048 +43072 +43124 +43136 +43206 +43216 +43226 +43232 +43252 +43264 +43310 +43312 +43348 +43392 +43457 +43472 +43482 +43488 +43494 +43495 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43616 +43632 +43633 +43639 +43642 +43715 +43744 +43760 +43765 +43767 +43968 +44011 +44012 +44014 +44016 +44026 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +69632 +69703 +69714 +69744 +69759 +69819 +69888 +69941 +69942 +69952 +69968 +70004 +70016 +70084 +70090 +70093 +70096 +70106 +70113 +70133 +70144 +70162 +70163 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70487 +70488 +70494 +70500 +70502 +70509 +70512 +70517 +70656 +70728 +70736 +70746 +70785 +70853 +70864 +70874 +71040 +71094 +71096 +71105 +71128 +71134 +71168 +71233 +71248 +71258 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71484 +72192 +72256 +72261 +72262 +72263 +72264 +72272 +72324 +72326 +72346 +72704 +72713 +72714 +72759 +72760 +72769 +72784 +72813 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V26 +3981 +3992 +3993 +4029 +6441 +6444 +6743 +6744 +6747 +6751 +7073 +7076 +7084 +7086 +7204 +7206 +43111 +43113 +43121 +43122 +43453 +43454 +72850 +72872 +72873 +72880 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V48 +2381 +2382 +2509 +2510 +2637 +2638 +2765 +2766 +2893 +2894 +3021 +3022 +3149 +3150 +3277 +3278 +3405 +3406 +3530 +3531 +6980 +6981 +43204 +43205 +43456 +43457 +69702 +69703 +69817 +69818 +70080 +70081 +70197 +70198 +70477 +70478 +70722 +70723 +70850 +70851 +71103 +71104 +71231 +71232 +71350 +71351 +72767 +72768 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +6499 +6510 +43102 +43106 +43110 +43111 +43298 +43307 +69968 +69973 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V236 +2362 +2364 +2366 +2381 +2382 +2384 +2389 +2392 +2402 +2404 +2494 +2501 +2503 +2505 +2507 +2509 +2519 +2520 +2530 +2532 +2622 +2627 +2631 +2633 +2635 +2637 +2750 +2758 +2759 +2762 +2763 +2765 +2786 +2788 +2878 +2885 +2887 +2889 +2891 +2893 +2902 +2904 +2914 +2916 +3006 +3011 +3014 +3017 +3018 +3021 +3031 +3032 +3134 +3141 +3142 +3145 +3146 +3149 +3157 +3159 +3170 +3172 +3262 +3269 +3270 +3273 +3274 +3277 +3285 +3287 +3298 +3300 +3390 +3397 +3398 +3401 +3402 +3405 +3415 +3416 +3426 +3428 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3632 +3642 +3648 +3654 +3655 +3656 +3760 +3770 +3771 +3772 +3776 +3781 +3953 +3966 +3968 +3970 +4139 +4150 +4182 +4186 +4194 +4195 +4199 +4201 +4209 +4213 +4227 +4231 +4252 +4254 +5906 +5908 +5938 +5940 +5970 +5972 +6002 +6004 +6070 +6086 +6088 +6089 +6432 +6441 +6458 +6459 +6576 +6593 +6679 +6684 +6753 +6772 +6965 +6980 +7076 +7082 +7143 +7152 +7206 +7213 +43043 +43048 +43189 +43204 +43335 +43343 +43444 +43453 +43493 +43494 +43561 +43571 +43696 +43711 +43755 +43760 +44003 +44011 +68097 +68100 +68101 +68103 +68108 +68110 +69688 +69702 +69808 +69817 +69927 +69939 +70067 +70080 +70091 +70093 +70188 +70196 +70368 +70377 +70462 +70469 +70471 +70473 +70475 +70477 +70487 +70488 +70498 +70500 +70709 +70722 +70832 +70847 +71087 +71094 +71096 +71100 +71132 +71134 +71216 +71229 +71232 +71233 +71341 +71350 +71456 +71467 +72193 +72203 +72273 +72284 +72751 +72759 +72760 +72764 +72880 +72885 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73024 +73027 +73028 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V30 +2365 +2366 +2493 +2494 +2749 +2750 +2877 +2878 +3133 +3134 +3261 +3262 +3389 +3390 +3973 +3974 +6108 +6109 +7098 +7099 +70081 +70082 +70461 +70462 +70727 +70728 +70852 +70853 +72768 +72769 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V38 +3387 +3389 +3642 +3643 +3662 +3663 +3972 +3973 +4154 +4155 +5908 +5909 +5940 +5941 +6097 +6098 +6778 +6779 +7082 +7083 +7154 +7156 +43014 +43015 +43347 +43348 +44013 +44014 +69940 +69941 +70378 +70379 +71467 +71468 +72244 +72245 +73028 +73029 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +45 +46 +160 +161 +215 +216 +2674 +2676 +4174 +4175 +6400 +6401 +8208 +8213 +9676 +9677 +43636 +43639 +72255 +72256 +72261 +72262 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V66 +2307 +2308 +2435 +2436 +2563 +2564 +2691 +2692 +2819 +2820 +3075 +3076 +3203 +3204 +3331 +3332 +3459 +3460 +3967 +3968 +4152 +4153 +6087 +6088 +6916 +6917 +7042 +7043 +7410 +7412 +43137 +43138 +43395 +43396 +43765 +43766 +68111 +68112 +69634 +69635 +69762 +69763 +69890 +69891 +70018 +70019 +70403 +70404 +70725 +70726 +70849 +70850 +71102 +71103 +71230 +71231 +71340 +71341 +72249 +72250 +72343 +72344 +72766 +72767 +73025 +73026 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V106 +1570 +1574 +1575 +1576 +1577 +1578 +1583 +1587 +1608 +1609 +1649 +1652 +1653 +1656 +1672 +1690 +1728 +1729 +1731 +1740 +1741 +1742 +1743 +1744 +1746 +1748 +1749 +1750 +1774 +1776 +1808 +1809 +1813 +1818 +1822 +1823 +1832 +1833 +1834 +1835 +1836 +1837 +1839 +1840 +1869 +1870 +1881 +1884 +1899 +1901 +1905 +1906 +1907 +1909 +1912 +1914 +2112 +2113 +2118 +2120 +2121 +2122 +2132 +2133 +2151 +2152 +2153 +2155 +2218 +2221 +2222 +2223 +2225 +2227 +2233 +2234 +68293 +68294 +68295 +68296 +68297 +68299 +68302 +68307 +68317 +68318 +68321 +68322 +68324 +68325 +68335 +68336 +68481 +68482 +68483 +68486 +68489 +68490 +68492 +68493 +68494 +68496 +68497 +68498 +68521 +68525 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V667 +0 +173 +174 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1564 +1565 +1568 +1569 +1570 +1632 +1646 +1652 +1653 +1748 +1749 +1757 +1759 +1765 +1767 +1769 +1770 +1776 +1786 +1789 +1791 +1792 +1807 +1867 +1869 +1920 +1958 +1969 +1994 +2036 +2042 +2043 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2112 +2134 +2137 +2140 +2144 +2145 +2146 +2150 +2151 +2155 +2208 +2221 +2222 +2229 +2230 +2238 +2260 +2274 +2275 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2810 +2816 +2817 +2818 +2876 +2877 +2879 +2880 +2881 +2885 +2893 +2894 +2902 +2903 +2914 +2916 +2946 +2947 +3008 +3009 +3021 +3022 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3202 +3260 +3261 +3263 +3264 +3270 +3271 +3276 +3278 +3298 +3300 +3328 +3330 +3387 +3389 +3393 +3397 +3405 +3406 +3426 +3428 +3530 +3531 +3538 +3541 +3542 +3543 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6109 +6110 +6151 +6152 +6154 +6158 +6176 +6264 +6277 +6315 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6832 +6847 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8203 +8204 +8205 +8208 +8234 +8239 +8288 +8293 +8298 +8304 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12334 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43072 +43123 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43493 +43494 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43756 +43758 +43766 +43767 +44005 +44006 +44008 +44009 +44013 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +65279 +65280 +65529 +65532 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68288 +68294 +68295 +68296 +68297 +68299 +68301 +68322 +68324 +68327 +68331 +68336 +68480 +68498 +68521 +68527 +69633 +69634 +69688 +69703 +69759 +69762 +69811 +69815 +69817 +69819 +69821 +69822 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70464 +70465 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +70852 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72767 +72768 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94095 +94099 +113821 +113823 +113824 +113828 +119143 +119146 +119155 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125184 +125259 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V118 +1568 +1569 +1574 +1575 +1576 +1577 +1578 +1583 +1587 +1600 +1601 +1608 +1609 +1611 +1646 +1648 +1656 +1672 +1690 +1728 +1729 +1731 +1740 +1741 +1742 +1743 +1744 +1746 +1786 +1789 +1791 +1792 +1810 +1813 +1818 +1822 +1823 +1832 +1833 +1834 +1835 +1836 +1837 +1839 +1870 +1881 +1884 +1899 +1901 +1905 +1906 +1907 +1909 +1912 +1914 +1920 +1994 +2027 +2113 +2118 +2120 +2121 +2122 +2132 +2133 +2134 +2144 +2145 +2146 +2150 +2152 +2153 +2208 +2218 +2223 +2225 +2227 +2229 +2230 +2233 +2234 +2238 +6151 +6152 +6176 +6264 +6279 +6313 +6314 +6315 +43072 +43122 +68288 +68293 +68307 +68311 +68312 +68317 +68318 +68321 +68331 +68335 +68480 +68481 +68482 +68483 +68486 +68489 +68490 +68492 +68493 +68494 +68496 +68497 +68525 +68527 +125184 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1600 +1601 +2042 +2043 +6154 +6155 +8205 +8206 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V626 +173 +174 +768 +880 +1155 +1162 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1552 +1563 +1564 +1565 +1611 +1632 +1648 +1649 +1750 +1757 +1759 +1765 +1767 +1769 +1770 +1774 +1807 +1808 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2036 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2094 +2137 +2140 +2260 +2274 +2275 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2433 +2434 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2810 +2816 +2817 +2818 +2876 +2877 +2879 +2880 +2881 +2885 +2893 +2894 +2902 +2903 +2914 +2916 +2946 +2947 +3008 +3009 +3021 +3022 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3202 +3260 +3261 +3263 +3264 +3270 +3271 +3276 +3278 +3298 +3300 +3328 +3330 +3387 +3389 +3393 +3397 +3405 +3406 +3426 +3428 +3530 +3531 +3538 +3541 +3542 +3543 +3633 +3634 +3636 +3643 +3655 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6109 +6110 +6155 +6158 +6277 +6279 +6313 +6314 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6832 +6847 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7616 +7674 +7675 +7680 +8203 +8204 +8206 +8208 +8234 +8239 +8288 +8293 +8298 +8304 +8400 +8433 +11503 +11506 +11647 +11648 +11744 +11776 +12330 +12334 +12441 +12443 +42607 +42611 +42612 +42622 +42654 +42656 +42736 +42738 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43493 +43494 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43756 +43758 +43766 +43767 +44005 +44006 +44008 +44009 +44013 +44014 +64286 +64287 +65024 +65040 +65056 +65072 +65279 +65280 +65529 +65532 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69633 +69634 +69688 +69703 +69759 +69762 +69811 +69815 +69817 +69819 +69821 +69822 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70464 +70465 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +70852 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72767 +72768 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +94095 +94099 +113821 +113823 +113824 +113828 +119143 +119146 +119155 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1170 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +880 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1488 +1515 +1520 +1523 +1568 +1611 +1646 +1648 +1649 +1748 +1749 +1750 +1765 +1767 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1958 +1969 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2070 +2074 +2075 +2084 +2085 +2088 +2089 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2308 +2362 +2365 +2366 +2384 +2385 +2392 +2402 +2417 +2433 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2494 +2510 +2511 +2524 +2526 +2527 +2530 +2544 +2546 +2556 +2557 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2649 +2653 +2654 +2655 +2674 +2677 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2750 +2768 +2769 +2784 +2786 +2809 +2810 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2878 +2908 +2910 +2911 +2914 +2929 +2930 +2947 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3024 +3025 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3134 +3160 +3163 +3168 +3170 +3200 +3201 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3262 +3294 +3295 +3296 +3298 +3313 +3315 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3390 +3406 +3407 +3412 +3415 +3423 +3426 +3450 +3456 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3585 +3633 +3634 +3636 +3648 +3655 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3761 +3762 +3764 +3773 +3774 +3776 +3781 +3782 +3783 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3976 +3981 +4096 +4139 +4159 +4160 +4176 +4182 +4186 +4190 +4193 +4194 +4197 +4199 +4206 +4209 +4213 +4226 +4238 +4239 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5906 +5920 +5938 +5952 +5970 +5984 +5997 +5998 +6001 +6016 +6068 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6313 +6314 +6315 +6320 +6390 +6400 +6431 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6679 +6688 +6741 +6823 +6824 +6917 +6964 +6981 +6988 +7043 +7073 +7086 +7088 +7098 +7142 +7168 +7204 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7410 +7413 +7415 +7424 +7616 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8472 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +12293 +12296 +12321 +12330 +12337 +12342 +12344 +12349 +12353 +12439 +12443 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42623 +42654 +42656 +42736 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43043 +43072 +43124 +43138 +43188 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43302 +43312 +43335 +43360 +43389 +43396 +43443 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43561 +43584 +43587 +43588 +43596 +43616 +43639 +43642 +43643 +43646 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43755 +43762 +43765 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44003 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65313 +65339 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66422 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68097 +68112 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69635 +69688 +69763 +69808 +69840 +69865 +69891 +69927 +69968 +70003 +70006 +70007 +70019 +70067 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70188 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70367 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70462 +70480 +70481 +70493 +70498 +70656 +70709 +70727 +70731 +70784 +70832 +70852 +70854 +70855 +70856 +71040 +71087 +71128 +71132 +71168 +71216 +71236 +71237 +71296 +71339 +71424 +71450 +71840 +71904 +71935 +71936 +72192 +72193 +72203 +72243 +72250 +72251 +72272 +72273 +72284 +72324 +72326 +72330 +72384 +72441 +72704 +72713 +72714 +72751 +72768 +72769 +72818 +72848 +72960 +72967 +72968 +72970 +72971 +73009 +73030 +73031 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92976 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94033 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +124928 +125125 +125184 +125252 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V762 +39 +40 +46 +47 +58 +59 +94 +95 +96 +97 +168 +169 +173 +174 +175 +176 +180 +181 +183 +185 +688 +880 +884 +886 +890 +891 +900 +902 +903 +904 +1155 +1162 +1369 +1370 +1425 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1524 +1525 +1536 +1542 +1552 +1563 +1564 +1565 +1600 +1601 +1611 +1632 +1648 +1649 +1750 +1758 +1759 +1769 +1770 +1774 +1807 +1808 +1809 +1810 +1840 +1867 +1958 +1969 +2027 +2038 +2042 +2043 +2070 +2094 +2137 +2140 +2260 +2307 +2362 +2363 +2364 +2365 +2369 +2377 +2381 +2382 +2385 +2392 +2402 +2404 +2417 +2418 +2433 +2434 +2492 +2493 +2497 +2501 +2509 +2510 +2530 +2532 +2561 +2563 +2620 +2621 +2625 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2672 +2674 +2677 +2678 +2689 +2691 +2748 +2749 +2753 +2758 +2759 +2761 +2765 +2766 +2786 +2788 +2810 +2816 +2817 +2818 +2876 +2877 +2879 +2880 +2881 +2885 +2893 +2894 +2902 +2903 +2914 +2916 +2946 +2947 +3008 +3009 +3021 +3022 +3072 +3073 +3134 +3137 +3142 +3145 +3146 +3150 +3157 +3159 +3170 +3172 +3201 +3202 +3260 +3261 +3263 +3264 +3270 +3271 +3276 +3278 +3298 +3300 +3328 +3330 +3387 +3389 +3393 +3397 +3405 +3406 +3426 +3428 +3530 +3531 +3538 +3541 +3542 +3543 +3633 +3634 +3636 +3643 +3654 +3663 +3761 +3762 +3764 +3770 +3771 +3773 +3782 +3783 +3784 +3790 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3953 +3967 +3968 +3973 +3974 +3976 +3981 +3992 +3993 +4029 +4038 +4039 +4141 +4145 +4146 +4152 +4153 +4155 +4157 +4159 +4184 +4186 +4190 +4193 +4209 +4213 +4226 +4227 +4229 +4231 +4237 +4238 +4253 +4254 +4348 +4349 +4957 +4960 +5906 +5909 +5938 +5941 +5970 +5972 +6002 +6004 +6068 +6070 +6071 +6078 +6086 +6087 +6089 +6100 +6103 +6104 +6109 +6110 +6155 +6159 +6211 +6212 +6277 +6279 +6313 +6314 +6432 +6435 +6439 +6441 +6450 +6451 +6457 +6460 +6679 +6681 +6683 +6684 +6742 +6743 +6744 +6751 +6752 +6753 +6754 +6755 +6757 +6765 +6771 +6781 +6783 +6784 +6823 +6824 +6832 +6847 +6912 +6916 +6964 +6965 +6966 +6971 +6972 +6973 +6978 +6979 +7019 +7028 +7040 +7042 +7074 +7078 +7080 +7082 +7083 +7086 +7142 +7143 +7144 +7146 +7149 +7150 +7151 +7154 +7212 +7220 +7222 +7224 +7288 +7294 +7376 +7379 +7380 +7393 +7394 +7401 +7405 +7406 +7412 +7413 +7416 +7418 +7468 +7531 +7544 +7545 +7579 +7674 +7675 +7680 +8125 +8126 +8127 +8130 +8141 +8144 +8157 +8160 +8173 +8176 +8189 +8191 +8203 +8208 +8216 +8218 +8228 +8229 +8231 +8232 +8234 +8239 +8288 +8293 +8294 +8304 +8305 +8306 +8319 +8320 +8336 +8349 +8400 +8433 +11388 +11390 +11503 +11506 +11631 +11632 +11647 +11648 +11744 +11776 +11823 +11824 +12293 +12294 +12330 +12334 +12337 +12342 +12347 +12348 +12441 +12447 +12540 +12543 +40981 +40982 +42232 +42238 +42508 +42509 +42607 +42611 +42612 +42622 +42623 +42624 +42652 +42656 +42736 +42738 +42752 +42786 +42864 +42865 +42888 +42891 +43000 +43002 +43010 +43011 +43014 +43015 +43019 +43020 +43045 +43047 +43204 +43206 +43232 +43250 +43302 +43310 +43335 +43346 +43392 +43395 +43443 +43444 +43446 +43450 +43452 +43453 +43471 +43472 +43493 +43495 +43561 +43567 +43569 +43571 +43573 +43575 +43587 +43588 +43596 +43597 +43632 +43633 +43644 +43645 +43696 +43697 +43698 +43701 +43703 +43705 +43710 +43712 +43713 +43714 +43741 +43742 +43756 +43758 +43763 +43765 +43766 +43767 +43867 +43872 +44005 +44006 +44008 +44009 +44013 +44014 +64286 +64287 +64434 +64450 +65024 +65040 +65043 +65044 +65056 +65072 +65106 +65107 +65109 +65110 +65279 +65280 +65287 +65288 +65294 +65295 +65306 +65307 +65342 +65343 +65344 +65345 +65392 +65393 +65438 +65440 +65507 +65508 +65529 +65532 +66045 +66046 +66272 +66273 +66422 +66427 +68097 +68100 +68101 +68103 +68108 +68112 +68152 +68155 +68159 +68160 +68325 +68327 +69633 +69634 +69688 +69703 +69759 +69762 +69811 +69815 +69817 +69819 +69821 +69822 +69888 +69891 +69927 +69932 +69933 +69941 +70003 +70004 +70016 +70018 +70070 +70079 +70090 +70093 +70191 +70194 +70196 +70197 +70198 +70200 +70206 +70207 +70367 +70368 +70371 +70379 +70400 +70402 +70460 +70461 +70464 +70465 +70502 +70509 +70512 +70517 +70712 +70720 +70722 +70725 +70726 +70727 +70835 +70841 +70842 +70843 +70847 +70849 +70850 +70852 +71090 +71094 +71100 +71102 +71103 +71105 +71132 +71134 +71219 +71227 +71229 +71230 +71231 +71233 +71339 +71340 +71341 +71342 +71344 +71350 +71351 +71352 +71453 +71456 +71458 +71462 +71463 +71468 +72193 +72199 +72201 +72203 +72243 +72249 +72251 +72255 +72263 +72264 +72273 +72279 +72281 +72284 +72330 +72343 +72344 +72346 +72752 +72759 +72760 +72766 +72767 +72768 +72850 +72872 +72874 +72881 +72882 +72884 +72885 +72887 +73009 +73015 +73018 +73019 +73020 +73022 +73023 +73030 +73031 +73032 +92912 +92917 +92976 +92983 +92992 +92996 +94095 +94112 +94176 +94178 +113821 +113823 +113824 +113828 +119143 +119146 +119155 +119171 +119173 +119180 +119210 +119214 +119362 +119365 +121344 +121399 +121403 +121453 +121461 +121462 +121476 +121477 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +125136 +125143 +125252 +125259 +127995 +128000 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1630 +65 +91 +160 +161 +168 +169 +170 +171 +173 +174 +175 +176 +178 +182 +184 +187 +188 +191 +192 +215 +216 +224 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +309 +310 +311 +313 +314 +315 +316 +317 +318 +319 +322 +323 +324 +325 +326 +327 +328 +329 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +383 +384 +385 +387 +388 +389 +390 +392 +393 +396 +398 +402 +403 +405 +406 +409 +412 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +426 +428 +429 +430 +432 +433 +436 +437 +438 +439 +441 +444 +445 +452 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +497 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +570 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +688 +697 +728 +734 +736 +741 +832 +834 +835 +838 +847 +848 +880 +881 +882 +883 +884 +885 +886 +887 +890 +891 +894 +896 +900 +907 +908 +909 +910 +912 +913 +930 +931 +940 +962 +963 +975 +983 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1008 +1011 +1012 +1014 +1015 +1016 +1017 +1019 +1021 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1162 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1329 +1367 +1415 +1416 +1564 +1565 +1653 +1657 +2392 +2400 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2908 +2910 +3635 +3636 +3763 +3764 +3804 +3806 +3852 +3853 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3962 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4256 +4294 +4295 +4296 +4301 +4302 +4348 +4349 +4447 +4449 +5112 +5118 +6068 +6070 +6155 +6159 +7296 +7305 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7531 +7544 +7545 +7579 +7616 +7680 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7834 +7836 +7838 +7839 +7840 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7960 +7966 +7976 +7984 +7992 +8000 +8008 +8014 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8032 +8040 +8048 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8064 +8112 +8114 +8117 +8119 +8133 +8135 +8144 +8147 +8148 +8152 +8156 +8157 +8160 +8163 +8164 +8168 +8176 +8178 +8181 +8183 +8191 +8192 +8208 +8209 +8210 +8215 +8216 +8228 +8231 +8234 +8240 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8306 +8308 +8335 +8336 +8349 +8360 +8361 +8448 +8452 +8453 +8456 +8457 +8468 +8469 +8471 +8473 +8478 +8480 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8507 +8513 +8517 +8522 +8528 +8576 +8579 +8580 +8585 +8586 +8748 +8750 +8751 +8753 +9001 +9003 +9312 +9451 +10764 +10765 +10868 +10871 +10972 +10973 +11264 +11311 +11360 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11377 +11378 +11379 +11381 +11382 +11388 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11499 +11500 +11501 +11502 +11506 +11507 +11631 +11632 +11935 +11936 +12019 +12020 +12032 +12246 +12288 +12289 +12342 +12343 +12344 +12347 +12443 +12445 +12447 +12448 +12543 +12544 +12593 +12687 +12690 +12704 +12800 +12831 +12832 +12872 +12880 +12927 +12928 +13055 +13056 +13312 +42560 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42624 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42652 +42654 +42786 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42802 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42864 +42865 +42873 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42891 +42892 +42893 +42894 +42896 +42897 +42898 +42899 +42902 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42927 +42928 +42933 +42934 +42935 +43000 +43002 +43868 +43872 +43888 +43968 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65021 +65024 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65520 +65529 +66560 +66600 +66736 +66772 +68736 +68787 +71840 +71872 +113824 +113828 +119134 +119141 +119155 +119163 +119227 +119233 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +125184 +125218 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127232 +127243 +127248 +127279 +127280 +127312 +127338 +127340 +127376 +127377 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +194560 +195102 +917504 +921600 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1216 +97 +123 +181 +182 +223 +247 +248 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +378 +379 +380 +381 +382 +385 +387 +388 +389 +390 +392 +393 +396 +397 +402 +403 +405 +406 +409 +411 +414 +415 +417 +418 +419 +420 +421 +422 +424 +425 +429 +430 +432 +433 +436 +437 +438 +439 +441 +442 +445 +446 +447 +448 +452 +453 +454 +456 +457 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +498 +499 +500 +501 +502 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +572 +573 +575 +577 +578 +579 +583 +584 +585 +586 +587 +588 +589 +590 +591 +597 +598 +600 +601 +602 +603 +605 +608 +610 +611 +612 +613 +615 +616 +621 +623 +624 +625 +627 +629 +630 +637 +638 +640 +641 +643 +644 +647 +653 +658 +659 +669 +671 +837 +838 +881 +882 +883 +884 +887 +888 +891 +894 +912 +913 +940 +975 +976 +978 +981 +984 +985 +986 +987 +988 +989 +990 +991 +992 +993 +994 +995 +996 +997 +998 +999 +1000 +1001 +1002 +1003 +1004 +1005 +1006 +1007 +1012 +1013 +1014 +1016 +1017 +1019 +1020 +1072 +1120 +1121 +1122 +1123 +1124 +1125 +1126 +1127 +1128 +1129 +1130 +1131 +1132 +1133 +1134 +1135 +1136 +1137 +1138 +1139 +1140 +1141 +1142 +1143 +1144 +1145 +1146 +1147 +1148 +1149 +1150 +1151 +1152 +1153 +1154 +1163 +1164 +1165 +1166 +1167 +1168 +1169 +1170 +1171 +1172 +1173 +1174 +1175 +1176 +1177 +1178 +1179 +1180 +1181 +1182 +1183 +1184 +1185 +1186 +1187 +1188 +1189 +1190 +1191 +1192 +1193 +1194 +1195 +1196 +1197 +1198 +1199 +1200 +1201 +1202 +1203 +1204 +1205 +1206 +1207 +1208 +1209 +1210 +1211 +1212 +1213 +1214 +1215 +1216 +1218 +1219 +1220 +1221 +1222 +1223 +1224 +1225 +1226 +1227 +1228 +1229 +1230 +1232 +1233 +1234 +1235 +1236 +1237 +1238 +1239 +1240 +1241 +1242 +1243 +1244 +1245 +1246 +1247 +1248 +1249 +1250 +1251 +1252 +1253 +1254 +1255 +1256 +1257 +1258 +1259 +1260 +1261 +1262 +1263 +1264 +1265 +1266 +1267 +1268 +1269 +1270 +1271 +1272 +1273 +1274 +1275 +1276 +1277 +1278 +1279 +1280 +1281 +1282 +1283 +1284 +1285 +1286 +1287 +1288 +1289 +1290 +1291 +1292 +1293 +1294 +1295 +1296 +1297 +1298 +1299 +1300 +1301 +1302 +1303 +1304 +1305 +1306 +1307 +1308 +1309 +1310 +1311 +1312 +1313 +1314 +1315 +1316 +1317 +1318 +1319 +1320 +1321 +1322 +1323 +1324 +1325 +1326 +1327 +1328 +1377 +1416 +5112 +5118 +7296 +7305 +7545 +7546 +7549 +7550 +7681 +7682 +7683 +7684 +7685 +7686 +7687 +7688 +7689 +7690 +7691 +7692 +7693 +7694 +7695 +7696 +7697 +7698 +7699 +7700 +7701 +7702 +7703 +7704 +7705 +7706 +7707 +7708 +7709 +7710 +7711 +7712 +7713 +7714 +7715 +7716 +7717 +7718 +7719 +7720 +7721 +7722 +7723 +7724 +7725 +7726 +7727 +7728 +7729 +7730 +7731 +7732 +7733 +7734 +7735 +7736 +7737 +7738 +7739 +7740 +7741 +7742 +7743 +7744 +7745 +7746 +7747 +7748 +7749 +7750 +7751 +7752 +7753 +7754 +7755 +7756 +7757 +7758 +7759 +7760 +7761 +7762 +7763 +7764 +7765 +7766 +7767 +7768 +7769 +7770 +7771 +7772 +7773 +7774 +7775 +7776 +7777 +7778 +7779 +7780 +7781 +7782 +7783 +7784 +7785 +7786 +7787 +7788 +7789 +7790 +7791 +7792 +7793 +7794 +7795 +7796 +7797 +7798 +7799 +7800 +7801 +7802 +7803 +7804 +7805 +7806 +7807 +7808 +7809 +7810 +7811 +7812 +7813 +7814 +7815 +7816 +7817 +7818 +7819 +7820 +7821 +7822 +7823 +7824 +7825 +7826 +7827 +7828 +7829 +7836 +7841 +7842 +7843 +7844 +7845 +7846 +7847 +7848 +7849 +7850 +7851 +7852 +7853 +7854 +7855 +7856 +7857 +7858 +7859 +7860 +7861 +7862 +7863 +7864 +7865 +7866 +7867 +7868 +7869 +7870 +7871 +7872 +7873 +7874 +7875 +7876 +7877 +7878 +7879 +7880 +7881 +7882 +7883 +7884 +7885 +7886 +7887 +7888 +7889 +7890 +7891 +7892 +7893 +7894 +7895 +7896 +7897 +7898 +7899 +7900 +7901 +7902 +7903 +7904 +7905 +7906 +7907 +7908 +7909 +7910 +7911 +7912 +7913 +7914 +7915 +7916 +7917 +7918 +7919 +7920 +7921 +7922 +7923 +7924 +7925 +7926 +7927 +7928 +7929 +7930 +7931 +7932 +7933 +7934 +7935 +7944 +7952 +7958 +7968 +7976 +7984 +7992 +8000 +8006 +8016 +8024 +8032 +8040 +8048 +8062 +8064 +8072 +8080 +8088 +8096 +8104 +8112 +8117 +8118 +8120 +8126 +8127 +8130 +8133 +8134 +8136 +8144 +8148 +8150 +8152 +8160 +8168 +8178 +8181 +8182 +8184 +8526 +8527 +8560 +8576 +8580 +8581 +9424 +9450 +11312 +11359 +11361 +11362 +11365 +11367 +11368 +11369 +11370 +11371 +11372 +11373 +11379 +11380 +11382 +11383 +11393 +11394 +11395 +11396 +11397 +11398 +11399 +11400 +11401 +11402 +11403 +11404 +11405 +11406 +11407 +11408 +11409 +11410 +11411 +11412 +11413 +11414 +11415 +11416 +11417 +11418 +11419 +11420 +11421 +11422 +11423 +11424 +11425 +11426 +11427 +11428 +11429 +11430 +11431 +11432 +11433 +11434 +11435 +11436 +11437 +11438 +11439 +11440 +11441 +11442 +11443 +11444 +11445 +11446 +11447 +11448 +11449 +11450 +11451 +11452 +11453 +11454 +11455 +11456 +11457 +11458 +11459 +11460 +11461 +11462 +11463 +11464 +11465 +11466 +11467 +11468 +11469 +11470 +11471 +11472 +11473 +11474 +11475 +11476 +11477 +11478 +11479 +11480 +11481 +11482 +11483 +11484 +11485 +11486 +11487 +11488 +11489 +11490 +11491 +11492 +11500 +11501 +11502 +11503 +11507 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +42561 +42562 +42563 +42564 +42565 +42566 +42567 +42568 +42569 +42570 +42571 +42572 +42573 +42574 +42575 +42576 +42577 +42578 +42579 +42580 +42581 +42582 +42583 +42584 +42585 +42586 +42587 +42588 +42589 +42590 +42591 +42592 +42593 +42594 +42595 +42596 +42597 +42598 +42599 +42600 +42601 +42602 +42603 +42604 +42605 +42606 +42625 +42626 +42627 +42628 +42629 +42630 +42631 +42632 +42633 +42634 +42635 +42636 +42637 +42638 +42639 +42640 +42641 +42642 +42643 +42644 +42645 +42646 +42647 +42648 +42649 +42650 +42651 +42652 +42787 +42788 +42789 +42790 +42791 +42792 +42793 +42794 +42795 +42796 +42797 +42798 +42799 +42800 +42803 +42804 +42805 +42806 +42807 +42808 +42809 +42810 +42811 +42812 +42813 +42814 +42815 +42816 +42817 +42818 +42819 +42820 +42821 +42822 +42823 +42824 +42825 +42826 +42827 +42828 +42829 +42830 +42831 +42832 +42833 +42834 +42835 +42836 +42837 +42838 +42839 +42840 +42841 +42842 +42843 +42844 +42845 +42846 +42847 +42848 +42849 +42850 +42851 +42852 +42853 +42854 +42855 +42856 +42857 +42858 +42859 +42860 +42861 +42862 +42863 +42864 +42874 +42875 +42876 +42877 +42879 +42880 +42881 +42882 +42883 +42884 +42885 +42886 +42887 +42888 +42892 +42893 +42897 +42898 +42899 +42900 +42903 +42904 +42905 +42906 +42907 +42908 +42909 +42910 +42911 +42912 +42913 +42914 +42915 +42916 +42917 +42918 +42919 +42920 +42921 +42922 +42933 +42934 +42935 +42936 +43859 +43860 +43888 +43968 +64256 +64263 +64275 +64280 +65345 +65371 +66600 +66640 +66776 +66812 +68800 +68851 +71872 +71904 +125218 +125252 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V318 +94 +95 +96 +97 +168 +169 +175 +176 +180 +181 +183 +185 +688 +847 +848 +856 +861 +867 +884 +886 +890 +891 +900 +902 +1155 +1160 +1369 +1370 +1425 +1442 +1443 +1470 +1471 +1472 +1473 +1475 +1476 +1477 +1611 +1619 +1623 +1625 +1759 +1761 +1765 +1767 +1770 +1773 +1840 +1867 +1958 +1969 +2027 +2038 +2072 +2074 +2275 +2303 +2364 +2365 +2381 +2382 +2385 +2389 +2417 +2418 +2492 +2493 +2509 +2510 +2620 +2621 +2637 +2638 +2748 +2749 +2765 +2766 +2813 +2816 +2876 +2877 +2893 +2894 +3021 +3022 +3149 +3150 +3260 +3261 +3277 +3278 +3387 +3389 +3405 +3406 +3530 +3531 +3655 +3661 +3662 +3663 +3784 +3789 +3864 +3866 +3893 +3894 +3895 +3896 +3897 +3898 +3902 +3904 +3970 +3973 +3974 +3976 +4038 +4039 +4151 +4152 +4153 +4155 +4231 +4238 +4239 +4240 +4250 +4252 +6089 +6100 +6109 +6110 +6457 +6460 +6773 +6781 +6783 +6784 +6832 +6846 +6964 +6965 +6980 +6981 +7019 +7028 +7082 +7084 +7222 +7224 +7288 +7294 +7376 +7401 +7405 +7406 +7412 +7413 +7415 +7418 +7468 +7531 +7620 +7632 +7669 +7674 +7677 +7680 +8125 +8126 +8127 +8130 +8141 +8144 +8157 +8160 +8173 +8176 +8189 +8191 +11503 +11506 +11823 +11824 +12330 +12336 +12441 +12445 +12540 +12541 +42607 +42608 +42620 +42622 +42623 +42624 +42652 +42654 +42736 +42738 +42775 +42786 +42888 +42889 +43000 +43002 +43204 +43205 +43232 +43250 +43307 +43311 +43347 +43348 +43443 +43444 +43456 +43457 +43493 +43494 +43643 +43646 +43711 +43715 +43766 +43767 +43867 +43872 +44012 +44014 +64286 +64287 +65056 +65072 +65342 +65343 +65344 +65345 +65392 +65393 +65438 +65440 +65507 +65508 +66272 +66273 +68325 +68327 +69817 +69819 +69939 +69941 +70003 +70004 +70080 +70081 +70090 +70093 +70197 +70199 +70377 +70379 +70460 +70461 +70477 +70478 +70502 +70509 +70512 +70517 +70722 +70723 +70726 +70727 +70850 +70852 +71103 +71105 +71231 +71232 +71350 +71352 +71467 +71468 +72244 +72245 +72263 +72264 +72345 +72346 +72767 +72768 +73026 +73027 +73028 +73030 +92912 +92917 +94095 +94112 +119143 +119146 +119149 +119155 +119163 +119171 +119173 +119180 +119210 +119214 +125136 +125143 +125252 +125255 +125256 +125259 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V194 +33 +34 +44 +45 +46 +47 +58 +60 +63 +64 +894 +895 +903 +904 +1417 +1418 +1475 +1476 +1548 +1549 +1563 +1564 +1567 +1568 +1748 +1749 +1792 +1803 +1804 +1805 +2040 +2042 +2096 +2111 +2142 +2143 +2404 +2406 +3674 +3676 +3848 +3849 +3853 +3859 +4170 +4172 +4961 +4969 +5741 +5743 +5867 +5870 +5941 +5943 +6100 +6103 +6106 +6107 +6146 +6150 +6152 +6154 +6468 +6470 +6824 +6828 +7002 +7004 +7005 +7008 +7227 +7232 +7294 +7296 +8252 +8254 +8263 +8266 +11822 +11823 +11836 +11837 +11841 +11842 +12289 +12291 +42238 +42240 +42509 +42512 +42739 +42744 +43126 +43128 +43214 +43216 +43311 +43312 +43463 +43466 +43613 +43616 +43743 +43744 +43760 +43762 +44011 +44012 +65104 +65107 +65108 +65112 +65281 +65282 +65292 +65293 +65294 +65295 +65306 +65308 +65311 +65312 +65377 +65378 +65380 +65381 +66463 +66464 +66512 +66513 +67671 +67672 +67871 +67872 +68182 +68184 +68336 +68342 +68410 +68416 +68505 +68509 +69703 +69710 +69822 +69826 +69953 +69956 +70085 +70087 +70093 +70094 +70110 +70112 +70200 +70205 +70313 +70314 +70731 +70734 +70747 +70748 +71106 +71110 +71113 +71128 +71233 +71235 +71484 +71487 +72258 +72260 +72347 +72349 +72353 +72355 +72769 +72772 +72817 +72818 +74864 +74869 +92782 +92784 +92917 +92918 +92983 +92986 +92996 +92997 +113823 +113824 +121479 +121483 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V136 +33 +34 +46 +47 +63 +64 +1417 +1418 +1567 +1568 +1748 +1749 +1792 +1795 +2041 +2042 +2404 +2406 +4170 +4172 +4962 +4963 +4967 +4969 +5742 +5743 +5941 +5943 +6147 +6148 +6153 +6154 +6468 +6470 +6824 +6828 +7002 +7004 +7006 +7008 +7227 +7229 +7294 +7296 +8252 +8254 +8263 +8266 +11822 +11823 +11836 +11837 +12290 +12291 +42239 +42240 +42510 +42512 +42739 +42740 +42743 +42744 +43126 +43128 +43214 +43216 +43311 +43312 +43464 +43466 +43613 +43616 +43760 +43762 +44011 +44012 +65106 +65107 +65110 +65112 +65281 +65282 +65294 +65295 +65311 +65312 +65377 +65378 +68182 +68184 +69703 +69705 +69822 +69826 +69953 +69956 +70085 +70087 +70093 +70094 +70110 +70112 +70200 +70202 +70203 +70205 +70313 +70314 +70731 +70733 +71106 +71108 +71113 +71128 +71233 +71235 +71484 +71487 +72258 +72260 +72347 +72349 +72769 +72771 +92782 +92784 +92917 +92918 +92983 +92985 +92996 +92997 +113823 +113824 +121480 +121481 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1320 +65 +91 +97 +123 +170 +171 +181 +182 +186 +187 +192 +215 +216 +247 +248 +706 +710 +722 +736 +741 +748 +749 +750 +751 +837 +838 +880 +885 +886 +888 +890 +894 +895 +896 +902 +903 +904 +907 +908 +909 +910 +930 +931 +1014 +1015 +1154 +1162 +1328 +1329 +1367 +1369 +1370 +1377 +1416 +1456 +1470 +1471 +1472 +1473 +1475 +1476 +1478 +1479 +1480 +1488 +1515 +1520 +1523 +1552 +1563 +1568 +1624 +1625 +1632 +1646 +1748 +1749 +1757 +1761 +1769 +1773 +1776 +1786 +1789 +1791 +1792 +1808 +1856 +1869 +1970 +1994 +2027 +2036 +2038 +2042 +2043 +2048 +2072 +2074 +2093 +2112 +2137 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2272 +2275 +2282 +2288 +2364 +2365 +2381 +2382 +2385 +2389 +2404 +2417 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2493 +2501 +2503 +2505 +2507 +2509 +2510 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2544 +2546 +2556 +2557 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2622 +2627 +2631 +2633 +2635 +2637 +2641 +2642 +2649 +2653 +2654 +2655 +2672 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2749 +2758 +2759 +2762 +2763 +2765 +2768 +2769 +2784 +2788 +2809 +2813 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2877 +2885 +2887 +2889 +2891 +2893 +2902 +2904 +2908 +2910 +2911 +2916 +2929 +2930 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3021 +3024 +3025 +3031 +3032 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3149 +3157 +3159 +3160 +3163 +3168 +3172 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3261 +3269 +3270 +3273 +3274 +3277 +3285 +3287 +3294 +3295 +3296 +3300 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3387 +3389 +3397 +3398 +3401 +3402 +3405 +3406 +3407 +3412 +3416 +3423 +3428 +3450 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3535 +3541 +3542 +3543 +3544 +3552 +3570 +3572 +3585 +3643 +3648 +3655 +3661 +3662 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3789 +3790 +3804 +3808 +3840 +3841 +3904 +3912 +3913 +3949 +3953 +3970 +3976 +3992 +3993 +4029 +4096 +4151 +4152 +4153 +4155 +4160 +4176 +4195 +4197 +4201 +4206 +4231 +4238 +4239 +4252 +4254 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4347 +4348 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4959 +4960 +4992 +5008 +5024 +5110 +5112 +5118 +5121 +5741 +5743 +5760 +5761 +5787 +5792 +5867 +5870 +5881 +5888 +5901 +5902 +5908 +5920 +5940 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6068 +6070 +6089 +6103 +6104 +6108 +6109 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6457 +6480 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6656 +6684 +6688 +6751 +6753 +6773 +6823 +6824 +6912 +6964 +6965 +6980 +6981 +6988 +7040 +7082 +7084 +7088 +7098 +7142 +7143 +7154 +7168 +7222 +7245 +7248 +7258 +7294 +7296 +7305 +7401 +7405 +7406 +7412 +7413 +7415 +7424 +7616 +7655 +7669 +7680 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8125 +8126 +8127 +8130 +8133 +8134 +8141 +8144 +8148 +8150 +8156 +8160 +8173 +8178 +8181 +8182 +8189 +8305 +8306 +8319 +8320 +8336 +8349 +8450 +8451 +8455 +8456 +8458 +8468 +8469 +8470 +8473 +8478 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8506 +8508 +8512 +8517 +8522 +8526 +8527 +8544 +8585 +9398 +9450 +11264 +11311 +11312 +11359 +11360 +11493 +11499 +11503 +11506 +11508 +11520 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11632 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11776 +11823 +11824 +12293 +12296 +12321 +12330 +12337 +12342 +12344 +12349 +12353 +12439 +12445 +12448 +12449 +12539 +12540 +12544 +12549 +12591 +12593 +12687 +12704 +12731 +12784 +12800 +13312 +19894 +19968 +40939 +40960 +42125 +42192 +42238 +42240 +42509 +42512 +42528 +42538 +42540 +42560 +42607 +42612 +42620 +42623 +42736 +42775 +42784 +42786 +42889 +42891 +42927 +42928 +42936 +42999 +43010 +43011 +43014 +43015 +43019 +43020 +43048 +43072 +43124 +43136 +43204 +43205 +43206 +43250 +43256 +43259 +43260 +43261 +43262 +43274 +43307 +43312 +43347 +43360 +43389 +43392 +43443 +43444 +43456 +43471 +43472 +43488 +43493 +43494 +43504 +43514 +43519 +43520 +43575 +43584 +43598 +43616 +43639 +43642 +43643 +43646 +43711 +43712 +43713 +43714 +43715 +43739 +43742 +43744 +43760 +43762 +43766 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43867 +43868 +43878 +43888 +44011 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64297 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65020 +65136 +65141 +65142 +65277 +65313 +65339 +65345 +65371 +65382 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65856 +65909 +66176 +66205 +66208 +66257 +66304 +66336 +66349 +66379 +66384 +66427 +66432 +66462 +66464 +66500 +66504 +66512 +66513 +66518 +66560 +66718 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67680 +67703 +67712 +67743 +67808 +67827 +67828 +67830 +67840 +67862 +67872 +67898 +67968 +68024 +68030 +68032 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68192 +68221 +68224 +68253 +68288 +68296 +68297 +68325 +68352 +68406 +68416 +68438 +68448 +68467 +68480 +68498 +68608 +68681 +68736 +68787 +68800 +68851 +69632 +69702 +69762 +69817 +69840 +69865 +69888 +69939 +69968 +70003 +70006 +70007 +70016 +70080 +70081 +70085 +70106 +70107 +70108 +70109 +70144 +70162 +70163 +70197 +70199 +70200 +70206 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70313 +70320 +70377 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70461 +70469 +70471 +70473 +70475 +70477 +70480 +70481 +70487 +70488 +70493 +70500 +70656 +70722 +70723 +70726 +70727 +70731 +70784 +70850 +70852 +70854 +70855 +70856 +71040 +71094 +71096 +71103 +71128 +71134 +71168 +71231 +71232 +71233 +71236 +71237 +71296 +71350 +71424 +71450 +71453 +71467 +71840 +71904 +71935 +71936 +72192 +72243 +72245 +72255 +72272 +72324 +72326 +72344 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72767 +72768 +72769 +72818 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73026 +73027 +73028 +73030 +73032 +73728 +74650 +74752 +74863 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92880 +92910 +92928 +92983 +92992 +92996 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94099 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113822 +113823 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120513 +120514 +120539 +120540 +120571 +120572 +120597 +120598 +120629 +120630 +120655 +120656 +120687 +120688 +120713 +120714 +120745 +120746 +120771 +120772 +120780 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125184 +125252 +125255 +125256 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127280 +127306 +127312 +127338 +127344 +127370 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +1587 +1589 +1690 +1693 +1786 +1787 +1884 +1885 +1901 +1902 +1904 +1905 +1917 +1919 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +1585 +1587 +1681 +1690 +1775 +1776 +1883 +1884 +1899 +1901 +1905 +1906 +2218 +2219 +2226 +2227 +2233 +2234 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +1572 +1573 +1608 +1609 +1654 +1656 +1732 +1740 +1743 +1744 +1912 +1914 +2219 +2220 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +1583 +1585 +1672 +1681 +1774 +1775 +1881 +1883 +2222 +2223 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1597 +1600 +1740 +1741 +1742 +1743 +1909 +1911 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +1568 +1569 +1574 +1575 +1609 +1611 +1656 +1657 +1744 +1746 +1911 +1912 +2216 +2218 +2234 +2235 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1603 +1604 +1708 +1711 +1919 +1920 +2228 +2229 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1602 +1603 +1647 +1648 +1703 +1705 +2213 +2214 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1589 +1591 +1693 +1695 +1787 +1788 +2223 +2224 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1601 +1602 +1697 +1703 +1888 +1890 +2212 +2213 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +1580 +1583 +1665 +1672 +1727 +1728 +1879 +1881 +1902 +1904 +1906 +1907 +1916 +1917 +2210 +2211 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +1576 +1577 +1578 +1580 +1646 +1647 +1657 +1665 +1872 +1879 +2208 +2210 +2230 +2233 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +1593 +1595 +1696 +1697 +1788 +1789 +1885 +1888 +2227 +2228 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V47 +0 +1568 +1569 +1570 +1600 +1601 +1611 +1646 +1648 +1649 +1652 +1653 +1748 +1749 +1750 +1774 +1776 +1786 +1789 +1791 +1792 +1808 +1809 +1810 +1840 +1869 +1920 +2144 +2155 +2208 +2221 +2222 +2229 +2230 +2238 +68288 +68294 +68295 +68296 +68297 +68299 +68301 +68322 +68324 +68325 +68331 +68336 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1604 +1605 +1717 +1721 +1898 +1899 +2214 +2215 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +1570 +1572 +1573 +1574 +1575 +1576 +1649 +1652 +1653 +1654 +1907 +1909 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +1595 +1597 +1705 +1706 +1707 +1708 +1711 +1717 +1890 +1893 +2224 +2225 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +65792 +65795 +65799 +65844 +65847 +65856 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67648 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V74 +65 +91 +97 +123 +170 +171 +186 +187 +192 +215 +216 +247 +248 +697 +736 +741 +867 +880 +1157 +1159 +2385 +2387 +4347 +4348 +7424 +7462 +7468 +7517 +7522 +7526 +7531 +7544 +7545 +7615 +7680 +7936 +8305 +8306 +8319 +8320 +8336 +8349 +8432 +8433 +8490 +8492 +8498 +8499 +8526 +8527 +8544 +8585 +11360 +11392 +42786 +42888 +42891 +42927 +42928 +42936 +42999 +43008 +43310 +43311 +43824 +43867 +43868 +43877 +64256 +64263 +65313 +65339 +65345 +65371 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1600 +1601 +68480 +68498 +68505 +68509 +68521 +68528 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +5941 +5943 +5984 +5997 +5998 +6001 +6002 +6004 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +12289 +12291 +12296 +12306 +12308 +12316 +12539 +12540 +40960 +42125 +42128 +42183 +65377 +65382 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V76 +834 +835 +837 +838 +880 +884 +885 +888 +890 +894 +895 +896 +900 +901 +902 +903 +904 +907 +908 +909 +910 +930 +931 +994 +1008 +1024 +7462 +7467 +7517 +7522 +7526 +7531 +7615 +7618 +7936 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8486 +8487 +43877 +43878 +65856 +65935 +65952 +65953 +119296 +119366 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V64 +11904 +11930 +11931 +12020 +12032 +12246 +12289 +12292 +12293 +12306 +12307 +12320 +12321 +12334 +12336 +12337 +12343 +12352 +12539 +12540 +12688 +12704 +12736 +12772 +12832 +12872 +12928 +12977 +12992 +13004 +13144 +13169 +13179 +13184 +13280 +13311 +13312 +19894 +19968 +40939 +63744 +64110 +64112 +64218 +65093 +65095 +65377 +65382 +119648 +119666 +127568 +127570 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V34 +2385 +2387 +2404 +2406 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +43056 +43066 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +6016 +6110 +6112 +6122 +6128 +6138 +6624 +6656 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4053 +4057 +4059 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V50 +2385 +2387 +2404 +2406 +2986 +2987 +2997 +2998 +3046 +3059 +7376 +7377 +7378 +7380 +7410 +7413 +7416 +7418 +8432 +8433 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V104 +1536 +1541 +1542 +1565 +1566 +1757 +1758 +1792 +1872 +1920 +2208 +2229 +2230 +2238 +2260 +2274 +2275 +2304 +64336 +64450 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65022 +65136 +65141 +65142 +65277 +66272 +66300 +69216 +69247 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V46 +2385 +2387 +2404 +2406 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +7386 +7387 +43251 +43252 +70401 +70402 +70403 +70404 +70460 +70461 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +64275 +64280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +2405 +2406 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6480 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +12289 +12292 +12296 +12306 +12307 +12320 +12336 +12342 +12343 +12344 +12348 +12350 +12441 +12445 +12448 +12544 +12784 +12800 +13008 +13055 +13056 +13144 +65093 +65095 +65377 +65440 +110592 +110593 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V38 +2385 +2387 +2404 +2406 +3200 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +7386 +7387 +7413 +7414 +43056 +43062 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +2385 +2386 +7383 +7384 +7385 +7386 +7388 +7390 +7392 +7393 +70016 +70094 +70096 +70112 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +2385 +2387 +2404 +2406 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3200 +7386 +7387 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V276 +0 +65 +91 +97 +123 +170 +171 +186 +187 +192 +215 +216 +247 +248 +697 +736 +741 +746 +748 +768 +884 +885 +894 +895 +901 +902 +903 +904 +1541 +1542 +1757 +1758 +2274 +2275 +3647 +3648 +4053 +4057 +5867 +5870 +8192 +8204 +8206 +8293 +8294 +8305 +8308 +8319 +8320 +8335 +8352 +8384 +8448 +8486 +8487 +8490 +8492 +8498 +8499 +8526 +8527 +8544 +8585 +8588 +8592 +9255 +9280 +9291 +9312 +10240 +10496 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11776 +11843 +11844 +11850 +12272 +12284 +12288 +12289 +12292 +12293 +12306 +12307 +12320 +12321 +12342 +12343 +12872 +12896 +12927 +12928 +12977 +12992 +13004 +13008 +13169 +13179 +13184 +13280 +13311 +13312 +19904 +19968 +42752 +42786 +42888 +42891 +43867 +43868 +64830 +64832 +65040 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65279 +65280 +65281 +65313 +65339 +65345 +65371 +65377 +65504 +65511 +65512 +65519 +65529 +65534 +65936 +65948 +66000 +66045 +118784 +119030 +119040 +119079 +119081 +119143 +119146 +119163 +119171 +119173 +119180 +119210 +119214 +119273 +119552 +119639 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127488 +127489 +127491 +127504 +127548 +127552 +127561 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +917505 +917506 +917536 +917632 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V36 +2385 +2387 +2404 +2406 +2432 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +7415 +7416 +43249 +43250 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +1548 +1549 +1563 +1565 +1567 +1568 +1600 +1601 +1611 +1622 +1648 +1649 +1792 +1806 +1807 +1867 +1869 +1872 +2144 +2155 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V64 +4608 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +11648 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2404 +2406 +43056 +43066 +70784 +70856 +70864 +70874 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2534 +2544 +4160 +4170 +69888 +69941 +69942 +69956 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V1293 +888 +890 +896 +900 +907 +908 +909 +910 +930 +931 +1328 +1329 +1367 +1369 +1376 +1377 +1416 +1417 +1419 +1421 +1424 +1425 +1480 +1488 +1515 +1520 +1525 +1536 +1565 +1566 +1806 +1807 +1867 +1869 +1970 +1984 +2043 +2048 +2094 +2096 +2111 +2112 +2140 +2142 +2143 +2144 +2155 +2208 +2229 +2230 +2238 +2260 +2436 +2437 +2445 +2447 +2449 +2451 +2473 +2474 +2481 +2482 +2483 +2486 +2490 +2492 +2501 +2503 +2505 +2507 +2511 +2519 +2520 +2524 +2526 +2527 +2532 +2534 +2558 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +2689 +2692 +2693 +2702 +2703 +2706 +2707 +2729 +2730 +2737 +2738 +2740 +2741 +2746 +2748 +2758 +2759 +2762 +2763 +2766 +2768 +2769 +2784 +2788 +2790 +2802 +2809 +2816 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +2946 +2948 +2949 +2955 +2958 +2961 +2962 +2966 +2969 +2971 +2972 +2973 +2974 +2976 +2979 +2981 +2984 +2987 +2990 +3002 +3006 +3011 +3014 +3017 +3018 +3022 +3024 +3025 +3031 +3032 +3046 +3067 +3072 +3076 +3077 +3085 +3086 +3089 +3090 +3113 +3114 +3130 +3133 +3141 +3142 +3145 +3146 +3150 +3157 +3159 +3160 +3163 +3168 +3172 +3174 +3184 +3192 +3204 +3205 +3213 +3214 +3217 +3218 +3241 +3242 +3252 +3253 +3258 +3260 +3269 +3270 +3273 +3274 +3278 +3285 +3287 +3294 +3295 +3296 +3300 +3302 +3312 +3313 +3315 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +3585 +3643 +3647 +3676 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +3840 +3912 +3913 +3949 +3953 +3992 +3993 +4029 +4030 +4045 +4046 +4059 +4096 +4294 +4295 +4296 +4301 +4302 +4304 +4681 +4682 +4686 +4688 +4695 +4696 +4697 +4698 +4702 +4704 +4745 +4746 +4750 +4752 +4785 +4786 +4790 +4792 +4799 +4800 +4801 +4802 +4806 +4808 +4823 +4824 +4881 +4882 +4886 +4888 +4955 +4957 +4989 +4992 +5018 +5024 +5110 +5112 +5118 +5120 +5789 +5792 +5881 +5888 +5901 +5902 +5909 +5920 +5943 +5952 +5972 +5984 +5997 +5998 +6001 +6002 +6004 +6016 +6110 +6112 +6122 +6128 +6138 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +6320 +6390 +6400 +6431 +6432 +6444 +6448 +6460 +6464 +6465 +6468 +6510 +6512 +6517 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6684 +6686 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +6832 +6847 +6912 +6988 +6992 +7037 +7040 +7156 +7164 +7224 +7227 +7242 +7245 +7305 +7360 +7368 +7376 +7418 +7424 +7674 +7675 +7958 +7960 +7966 +7968 +8006 +8008 +8014 +8016 +8024 +8025 +8026 +8027 +8028 +8029 +8030 +8031 +8062 +8064 +8117 +8118 +8133 +8134 +8148 +8150 +8156 +8157 +8176 +8178 +8181 +8182 +8191 +8192 +8293 +8294 +8306 +8308 +8335 +8336 +8349 +8352 +8384 +8400 +8433 +8448 +8588 +8592 +9255 +9280 +9291 +9312 +11124 +11126 +11158 +11160 +11194 +11197 +11209 +11210 +11219 +11244 +11248 +11264 +11311 +11312 +11359 +11360 +11508 +11513 +11558 +11559 +11560 +11565 +11566 +11568 +11624 +11631 +11633 +11647 +11671 +11680 +11687 +11688 +11695 +11696 +11703 +11704 +11711 +11712 +11719 +11720 +11727 +11728 +11735 +11736 +11743 +11744 +11850 +11904 +11930 +11931 +12020 +12032 +12246 +12272 +12284 +12288 +12352 +12353 +12439 +12441 +12544 +12549 +12591 +12593 +12687 +12688 +12731 +12736 +12772 +12784 +12831 +12832 +13055 +13056 +19894 +19904 +40939 +40960 +42125 +42128 +42183 +42192 +42540 +42560 +42744 +42752 +42927 +42928 +42936 +42999 +43052 +43056 +43066 +43072 +43128 +43136 +43206 +43214 +43226 +43232 +43262 +43264 +43348 +43359 +43389 +43392 +43470 +43471 +43482 +43486 +43519 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43715 +43739 +43767 +43777 +43783 +43785 +43791 +43793 +43799 +43808 +43815 +43816 +43823 +43824 +43878 +43888 +44014 +44016 +44026 +44032 +55204 +55216 +55239 +55243 +55292 +63744 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64450 +64467 +64832 +64848 +64912 +64914 +64968 +65008 +65022 +65024 +65050 +65056 +65107 +65108 +65127 +65128 +65132 +65136 +65141 +65142 +65277 +65279 +65280 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +65529 +65534 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65935 +65936 +65948 +65952 +65953 +66000 +66046 +66176 +66205 +66208 +66257 +66272 +66300 +66304 +66340 +66349 +66379 +66384 +66427 +66432 +66462 +66463 +66500 +66504 +66518 +66560 +66718 +66720 +66730 +66736 +66772 +66776 +66812 +66816 +66856 +66864 +66916 +66927 +66928 +67072 +67383 +67392 +67414 +67424 +67432 +67584 +67590 +67592 +67593 +67594 +67638 +67639 +67641 +67644 +67645 +67647 +67670 +67671 +67743 +67751 +67760 +67808 +67827 +67828 +67830 +67835 +67868 +67871 +67898 +67903 +67904 +67968 +68024 +68028 +68048 +68050 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +68192 +68256 +68288 +68327 +68331 +68343 +68352 +68406 +68409 +68438 +68440 +68467 +68472 +68498 +68505 +68509 +68521 +68528 +68608 +68681 +68736 +68787 +68800 +68851 +68858 +68864 +69216 +69247 +69632 +69710 +69714 +69744 +69759 +69826 +69840 +69865 +69872 +69882 +69888 +69941 +69942 +69956 +69968 +70007 +70016 +70094 +70096 +70112 +70113 +70133 +70144 +70162 +70163 +70207 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +70320 +70379 +70384 +70394 +70400 +70404 +70405 +70413 +70415 +70417 +70419 +70441 +70442 +70449 +70450 +70452 +70453 +70458 +70460 +70469 +70471 +70473 +70475 +70478 +70480 +70481 +70487 +70488 +70493 +70500 +70502 +70509 +70512 +70517 +70656 +70746 +70747 +70748 +70749 +70750 +70784 +70856 +70864 +70874 +71040 +71094 +71096 +71134 +71168 +71237 +71248 +71258 +71264 +71277 +71296 +71352 +71360 +71370 +71424 +71450 +71453 +71468 +71472 +71488 +71840 +71923 +71935 +71936 +72192 +72264 +72272 +72324 +72326 +72349 +72350 +72355 +72384 +72441 +72704 +72713 +72714 +72759 +72760 +72774 +72784 +72813 +72816 +72848 +72850 +72872 +72873 +72887 +72960 +72967 +72968 +72970 +72971 +73015 +73018 +73019 +73020 +73022 +73023 +73032 +73040 +73050 +73728 +74650 +74752 +74863 +74864 +74869 +74880 +75076 +77824 +78895 +82944 +83527 +92160 +92729 +92736 +92767 +92768 +92778 +92782 +92784 +92880 +92910 +92912 +92918 +92928 +92998 +93008 +93018 +93019 +93026 +93027 +93048 +93053 +93072 +93952 +94021 +94032 +94079 +94095 +94112 +94176 +94178 +94208 +100333 +100352 +101107 +110592 +110879 +110960 +111356 +113664 +113771 +113776 +113789 +113792 +113801 +113808 +113818 +113820 +113828 +118784 +119030 +119040 +119079 +119081 +119273 +119296 +119366 +119552 +119639 +119648 +119666 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +121484 +121499 +121504 +121505 +121520 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +124928 +125125 +125127 +125143 +125184 +125259 +125264 +125274 +125278 +125280 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +126704 +126706 +126976 +127020 +127024 +127124 +127136 +127151 +127153 +127168 +127169 +127184 +127185 +127222 +127232 +127245 +127248 +127279 +127280 +127340 +127344 +127405 +127462 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +127584 +127590 +127744 +128725 +128736 +128749 +128752 +128761 +128768 +128884 +128896 +128981 +129024 +129036 +129040 +129096 +129104 +129114 +129120 +129160 +129168 +129198 +129280 +129292 +129296 +129343 +129344 +129357 +129360 +129388 +129408 +129432 +129472 +129473 +129488 +129511 +131072 +173783 +173824 +177973 +177984 +178206 +178208 +183970 +183984 +191457 +194560 +195102 +917505 +917506 +917536 +917632 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V14 +1548 +1549 +1563 +1565 +1567 +1568 +1632 +1642 +1920 +1970 +65010 +65011 +65021 +65022 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +1417 +1418 +4256 +4294 +4295 +4296 +4301 +4302 +4304 +4352 +11520 +11558 +11559 +11560 +11565 +11566 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +65799 +65844 +67072 +67383 +67392 +67414 +67424 +67432 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V18 +1425 +1480 +1488 +1515 +1520 +1525 +64285 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64336 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V24 +746 +748 +12289 +12292 +12296 +12306 +12307 +12320 +12330 +12334 +12336 +12337 +12343 +12344 +12539 +12540 +12549 +12591 +12704 +12731 +65093 +65095 +65377 +65382 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +6688 +6751 +6752 +6781 +6783 +6794 +6800 +6810 +6816 +6830 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V10 +6144 +6159 +6160 +6170 +6176 +6264 +6272 +6315 +71264 +71277 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +68096 +68100 +68101 +68103 +68108 +68116 +68117 +68120 +68121 +68148 +68152 +68155 +68159 +68168 +68176 +68185 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +2385 +2387 +2404 +2406 +3328 +3332 +3333 +3341 +3342 +3345 +3346 +3397 +3398 +3401 +3402 +3408 +3412 +3428 +3430 +3456 +7386 +7387 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +2304 +2432 +7376 +7415 +7416 +7418 +8432 +8433 +43056 +43066 +43232 +43262 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V30 +12289 +12292 +12296 +12306 +12307 +12320 +12336 +12342 +12343 +12344 +12348 +12350 +12353 +12439 +12441 +12449 +12539 +12541 +65093 +65095 +65377 +65382 +65392 +65393 +65438 +65440 +110593 +110879 +127488 +127489 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +43520 +43575 +43584 +43598 +43600 +43610 +43612 +43616 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2404 +2406 +43056 +43066 +71296 +71352 +71360 +71370 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V28 +2404 +2406 +3458 +3460 +3461 +3479 +3482 +3506 +3507 +3516 +3517 +3518 +3520 +3527 +3530 +3531 +3535 +3541 +3542 +3543 +3544 +3552 +3558 +3568 +3570 +3573 +70113 +70133 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V12 +2662 +2672 +70272 +70279 +70280 +70281 +70282 +70286 +70287 +70302 +70303 +70314 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +6528 +6572 +6576 +6602 +6608 +6619 +6622 +6624 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +2404 +2406 +43056 +43066 +70320 +70379 +70384 +70394 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +994 +1008 +11392 +11508 +11513 +11520 +66272 +66300 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V20 +65536 +65548 +65549 +65575 +65576 +65595 +65596 +65598 +65599 +65614 +65616 +65630 +65664 +65787 +65792 +65795 +65799 +65844 +65847 +65856 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +1600 +1601 +125184 +125259 +125264 +125274 +125278 +125280 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V42 +4352 +4608 +12289 +12292 +12296 +12306 +12307 +12320 +12334 +12337 +12343 +12344 +12539 +12540 +12593 +12687 +12800 +12831 +12896 +12927 +43360 +43389 +44032 +55204 +55216 +55239 +55243 +55292 +65093 +65095 +65377 +65382 +65440 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +2385 +2387 +2404 +2406 +2817 +2820 +2821 +2829 +2831 +2833 +2835 +2857 +2858 +2865 +2866 +2868 +2869 +2874 +2876 +2885 +2887 +2889 +2891 +2894 +2902 +2904 +2908 +2910 +2911 +2916 +2918 +2936 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V8 +4096 +4256 +43310 +43311 +43488 +43519 +43616 +43648 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V32 +768 +834 +835 +837 +838 +867 +6832 +6847 +7618 +7674 +7675 +7680 +8204 +8206 +8400 +8432 +65024 +65040 +65056 +65070 +66045 +66046 +119143 +119146 +119163 +119171 +119173 +119180 +119210 +119214 +917760 +918000 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +1024 +1328 +7296 +7305 +7467 +7468 +7544 +7545 +11744 +11776 +11843 +11844 +42560 +42656 +65070 +65072 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V22 +1156 +1157 +1159 +1160 +11264 +11311 +11312 +11359 +11843 +11844 +42607 +42608 +122880 +122887 +122888 +122905 +122907 +122914 +122915 +122917 +122918 +122923 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V38 +2385 +2387 +2404 +2406 +2561 +2564 +2565 +2571 +2575 +2577 +2579 +2601 +2602 +2609 +2610 +2612 +2613 +2615 +2616 +2618 +2620 +2621 +2622 +2627 +2631 +2633 +2635 +2638 +2641 +2642 +2649 +2653 +2654 +2655 +2662 +2678 +43056 +43066 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V36 +3713 +3715 +3716 +3717 +3719 +3721 +3722 +3723 +3725 +3726 +3732 +3736 +3737 +3744 +3745 +3748 +3749 +3750 +3751 +3752 +3754 +3756 +3757 +3770 +3771 +3774 +3776 +3781 +3782 +3783 +3784 +3790 +3792 +3802 +3804 +3808 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V146 +832 +834 +835 +837 +884 +885 +894 +895 +903 +904 +2392 +2400 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2908 +2910 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3959 +3960 +3961 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8123 +8124 +8126 +8127 +8137 +8138 +8139 +8140 +8147 +8148 +8155 +8156 +8163 +8164 +8171 +8172 +8174 +8176 +8185 +8186 +8187 +8188 +8189 +8190 +8192 +8194 +8486 +8487 +8490 +8492 +9001 +9003 +10972 +10973 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64285 +64286 +64287 +64288 +64298 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64335 +119134 +119141 +119227 +119233 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V498 +160 +161 +168 +169 +170 +171 +175 +176 +178 +182 +184 +187 +188 +191 +306 +308 +319 +321 +329 +330 +383 +384 +452 +461 +497 +500 +688 +697 +728 +734 +736 +741 +832 +834 +835 +837 +884 +885 +890 +891 +894 +895 +900 +902 +903 +904 +976 +983 +1008 +1011 +1012 +1014 +1017 +1018 +1415 +1416 +1653 +1657 +2392 +2400 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2908 +2910 +3635 +3636 +3763 +3764 +3804 +3806 +3852 +3853 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3962 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4348 +4349 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7531 +7544 +7545 +7579 +7616 +7834 +7836 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8123 +8124 +8125 +8130 +8137 +8138 +8139 +8140 +8141 +8144 +8147 +8148 +8155 +8156 +8157 +8160 +8163 +8164 +8171 +8172 +8173 +8176 +8185 +8186 +8187 +8188 +8189 +8191 +8192 +8203 +8209 +8210 +8215 +8216 +8228 +8231 +8239 +8240 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8360 +8361 +8448 +8452 +8453 +8456 +8457 +8468 +8469 +8471 +8473 +8478 +8480 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8498 +8499 +8506 +8507 +8513 +8517 +8522 +8528 +8576 +8585 +8586 +8748 +8750 +8751 +8753 +9001 +9003 +9312 +9451 +10764 +10765 +10868 +10871 +10972 +10973 +11388 +11390 +11631 +11632 +11935 +11936 +12019 +12020 +12032 +12246 +12288 +12289 +12342 +12343 +12344 +12347 +12443 +12445 +12447 +12448 +12543 +12544 +12593 +12687 +12690 +12704 +12800 +12831 +12832 +12872 +12880 +12927 +12928 +13055 +13056 +13312 +42652 +42654 +42864 +42865 +43000 +43002 +43868 +43872 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65021 +65040 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +119134 +119141 +119227 +119233 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127232 +127243 +127248 +127279 +127280 +127312 +127338 +127340 +127376 +127377 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V573 +0 +160 +161 +168 +169 +170 +171 +175 +176 +178 +182 +184 +187 +188 +191 +306 +308 +319 +321 +329 +330 +383 +384 +452 +461 +497 +500 +688 +697 +728 +734 +736 +741 +768 +773 +774 +781 +783 +784 +785 +786 +787 +789 +795 +796 +803 +809 +813 +815 +816 +818 +824 +825 +832 +838 +884 +885 +890 +891 +894 +895 +900 +902 +903 +904 +976 +983 +1008 +1011 +1012 +1014 +1017 +1018 +1415 +1416 +1619 +1622 +1653 +1657 +2364 +2365 +2392 +2400 +2494 +2495 +2519 +2520 +2524 +2526 +2527 +2528 +2611 +2612 +2614 +2615 +2649 +2652 +2654 +2655 +2878 +2879 +2902 +2904 +2908 +2910 +3006 +3007 +3031 +3032 +3158 +3159 +3266 +3267 +3285 +3287 +3390 +3391 +3415 +3416 +3530 +3531 +3535 +3536 +3551 +3552 +3635 +3636 +3763 +3764 +3804 +3806 +3852 +3853 +3907 +3908 +3917 +3918 +3922 +3923 +3927 +3928 +3932 +3933 +3945 +3946 +3955 +3956 +3957 +3962 +3969 +3970 +3987 +3988 +3997 +3998 +4002 +4003 +4007 +4008 +4012 +4013 +4025 +4026 +4142 +4143 +4348 +4349 +4449 +4470 +4520 +4547 +6965 +6966 +7468 +7471 +7472 +7483 +7484 +7502 +7503 +7531 +7544 +7545 +7579 +7616 +7834 +7836 +8049 +8050 +8051 +8052 +8053 +8054 +8055 +8056 +8057 +8058 +8059 +8060 +8061 +8062 +8123 +8124 +8125 +8130 +8137 +8138 +8139 +8140 +8141 +8144 +8147 +8148 +8155 +8156 +8157 +8160 +8163 +8164 +8171 +8172 +8173 +8176 +8185 +8186 +8187 +8188 +8189 +8191 +8192 +8203 +8209 +8210 +8215 +8216 +8228 +8231 +8239 +8240 +8243 +8245 +8246 +8248 +8252 +8253 +8254 +8255 +8263 +8266 +8279 +8280 +8287 +8288 +8304 +8306 +8308 +8335 +8336 +8349 +8360 +8361 +8448 +8452 +8453 +8456 +8457 +8468 +8469 +8471 +8473 +8478 +8480 +8483 +8484 +8485 +8486 +8487 +8488 +8489 +8490 +8494 +8495 +8498 +8499 +8506 +8507 +8513 +8517 +8522 +8528 +8576 +8585 +8586 +8748 +8750 +8751 +8753 +9001 +9003 +9312 +9451 +10764 +10765 +10868 +10871 +10972 +10973 +11388 +11390 +11631 +11632 +11935 +11936 +12019 +12020 +12032 +12246 +12288 +12289 +12342 +12343 +12344 +12347 +12441 +12445 +12447 +12448 +12543 +12544 +12593 +12687 +12690 +12704 +12800 +12831 +12832 +12872 +12880 +12927 +12928 +13055 +13056 +13312 +42652 +42654 +42864 +42865 +43000 +43002 +43868 +43872 +63744 +64014 +64016 +64017 +64018 +64019 +64021 +64031 +64032 +64033 +64034 +64035 +64037 +64039 +64042 +64110 +64112 +64218 +64256 +64263 +64275 +64280 +64285 +64286 +64287 +64311 +64312 +64317 +64318 +64319 +64320 +64322 +64323 +64325 +64326 +64434 +64467 +64830 +64848 +64912 +64914 +64968 +65008 +65021 +65040 +65050 +65072 +65093 +65095 +65107 +65108 +65127 +65128 +65132 +65136 +65139 +65140 +65141 +65142 +65277 +65281 +65471 +65474 +65480 +65482 +65488 +65490 +65496 +65498 +65501 +65504 +65511 +65512 +65519 +69818 +69819 +69927 +69928 +70462 +70463 +70487 +70488 +70832 +70833 +70842 +70843 +70845 +70846 +71087 +71088 +119134 +119141 +119227 +119233 +119808 +119893 +119894 +119965 +119966 +119968 +119970 +119971 +119973 +119975 +119977 +119981 +119982 +119994 +119995 +119996 +119997 +120004 +120005 +120070 +120071 +120075 +120077 +120085 +120086 +120093 +120094 +120122 +120123 +120127 +120128 +120133 +120134 +120135 +120138 +120145 +120146 +120486 +120488 +120780 +120782 +120832 +126464 +126468 +126469 +126496 +126497 +126499 +126500 +126501 +126503 +126504 +126505 +126515 +126516 +126520 +126521 +126522 +126523 +126524 +126530 +126531 +126535 +126536 +126537 +126538 +126539 +126540 +126541 +126544 +126545 +126547 +126548 +126549 +126551 +126552 +126553 +126554 +126555 +126556 +126557 +126558 +126559 +126560 +126561 +126563 +126564 +126565 +126567 +126571 +126572 +126579 +126580 +126584 +126585 +126589 +126590 +126591 +126592 +126602 +126603 +126620 +126625 +126628 +126629 +126634 +126635 +126652 +127232 +127243 +127248 +127279 +127280 +127312 +127338 +127340 +127376 +127377 +127488 +127491 +127504 +127548 +127552 +127561 +127568 +127570 +194560 +195102 +END +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is machine-generated by lib/unicore/mktables from the Unicode +# database, Version 10.0.0. Any changes made here will be lost! + +# !!!!!!! INTERNAL PERL USE ONLY !!!!!!! +# This file is for internal use by core Perl only. The format and even the +# name or existence of this file are subject to change without notice. Don't +# use it directly. Use Unicode::UCD to access the Unicode character data +# base. + + +return <<'END'; +V16 +329 +330 +1651 +1652 +3959 +3960 +3961 +3962 +6051 +6053 +8298 +8304 +9001 +9003 +917505 +917506 +END +# IO::Zlib.pm +# +# Copyright (c) 1998-2004 Tom Hughes <tom@compton.nu>. +# All rights reserved. This program is free software; you can redistribute +# it and/or modify it under the same terms as Perl itself. + +package IO::Zlib; + +$VERSION = "1.10"; + + +require 5.006; + +use strict; +use vars qw($VERSION $AUTOLOAD @ISA); + +use Carp; +use Fcntl qw(SEEK_SET); + +my $has_Compress_Zlib; +my $aliased; + +sub has_Compress_Zlib { + $has_Compress_Zlib; +} + +BEGIN { + eval { require Compress::Zlib }; + $has_Compress_Zlib = $@ || $Compress::Zlib::VERSION < 2.000 ? 0 : 1; +} + +use Symbol; +use Tie::Handle; + +# These might use some $^O logic. +my $gzip_read_open = "gzip -dc %s |"; +my $gzip_write_open = "| gzip > %s"; + +my $gzip_external; +my $gzip_used; + +sub gzip_read_open { + $gzip_read_open; +} + +sub gzip_write_open { + $gzip_write_open; +} + +sub gzip_external { + $gzip_external; +} + +sub gzip_used { + $gzip_used; +} + +sub can_gunzip { + $has_Compress_Zlib || $gzip_external; +} + +sub _import { + my $import = shift; + while (@_) { + if ($_[0] eq ':gzip_external') { + shift; + if (@_) { + $gzip_external = shift; + } else { + croak "$import: ':gzip_external' requires an argument"; + } + } + elsif ($_[0] eq ':gzip_read_open') { + shift; + if (@_) { + $gzip_read_open = shift; + croak "$import: ':gzip_read_open' '$gzip_read_open' is illegal" + unless $gzip_read_open =~ /^.+%s.+\|\s*$/; + } else { + croak "$import: ':gzip_read_open' requires an argument"; + } + } + elsif ($_[0] eq ':gzip_write_open') { + shift; + if (@_) { + $gzip_write_open = shift; + croak "$import: ':gzip_write_open' '$gzip_read_open' is illegal" + unless $gzip_write_open =~ /^\s*\|.+%s.*$/; + } else { + croak "$import: ':gzip_write_open' requires an argument"; + } + } + else { + last; + } + } + return @_; +} + +sub _alias { + my $import = shift; + if ((!$has_Compress_Zlib && !defined $gzip_external) || $gzip_external) { + # The undef *gzopen is really needed only during + # testing where we eval several 'use IO::Zlib's. + undef *gzopen; + *gzopen = \&gzopen_external; + *IO::Handle::gzread = \&gzread_external; + *IO::Handle::gzwrite = \&gzwrite_external; + *IO::Handle::gzreadline = \&gzreadline_external; + *IO::Handle::gzeof = \&gzeof_external; + *IO::Handle::gzclose = \&gzclose_external; + $gzip_used = 1; + } else { + croak "$import: no Compress::Zlib and no external gzip" + unless $has_Compress_Zlib; + *gzopen = \&Compress::Zlib::gzopen; + *gzread = \&Compress::Zlib::gzread; + *gzwrite = \&Compress::Zlib::gzwrite; + *gzreadline = \&Compress::Zlib::gzreadline; + *gzeof = \&Compress::Zlib::gzeof; + } + $aliased = 1; +} + +sub import { + shift; + my $import = "IO::Zlib::import"; + if (@_) { + if (_import($import, @_)) { + croak "$import: '@_' is illegal"; + } + } + _alias($import); +} + +@ISA = qw(Tie::Handle); + +sub TIEHANDLE +{ + my $class = shift; + my @args = @_; + + my $self = bless {}, $class; + + return @args ? $self->OPEN(@args) : $self; +} + +sub DESTROY +{ +} + +sub OPEN +{ + my $self = shift; + my $filename = shift; + my $mode = shift; + + croak "IO::Zlib::open: needs a filename" unless defined($filename); + + $self->{'file'} = gzopen($filename,$mode); + + return defined($self->{'file'}) ? $self : undef; +} + +sub CLOSE +{ + my $self = shift; + + return undef unless defined($self->{'file'}); + + my $status = $self->{'file'}->gzclose(); + + delete $self->{'file'}; + + return ($status == 0) ? 1 : undef; +} + +sub READ +{ + my $self = shift; + my $bufref = \$_[0]; + my $nbytes = $_[1]; + my $offset = $_[2] || 0; + + croak "IO::Zlib::READ: NBYTES must be specified" unless defined($nbytes); + + $$bufref = "" unless defined($$bufref); + + my $bytesread = $self->{'file'}->gzread(substr($$bufref,$offset),$nbytes); + + return undef if $bytesread < 0; + + return $bytesread; +} + +sub READLINE +{ + my $self = shift; + + my $line; + + return () if $self->{'file'}->gzreadline($line) <= 0; + + return $line unless wantarray; + + my @lines = $line; + + while ($self->{'file'}->gzreadline($line) > 0) + { + push @lines, $line; + } + + return @lines; +} + +sub WRITE +{ + my $self = shift; + my $buf = shift; + my $length = shift; + my $offset = shift; + + croak "IO::Zlib::WRITE: too long LENGTH" unless $offset + $length <= length($buf); + + return $self->{'file'}->gzwrite(substr($buf,$offset,$length)); +} + +sub EOF +{ + my $self = shift; + + return $self->{'file'}->gzeof(); +} + +sub FILENO +{ + return undef; +} + +sub new +{ + my $class = shift; + my @args = @_; + + _alias("new", @_) unless $aliased; # Some call new IO::Zlib directly... + + my $self = gensym(); + + tie *{$self}, $class, @args; + + return tied(${$self}) ? bless $self, $class : undef; +} + +sub getline +{ + my $self = shift; + + return scalar tied(*{$self})->READLINE(); +} + +sub getlines +{ + my $self = shift; + + croak "IO::Zlib::getlines: must be called in list context" + unless wantarray; + + return tied(*{$self})->READLINE(); +} + +sub opened +{ + my $self = shift; + + return defined tied(*{$self})->{'file'}; +} + +sub AUTOLOAD +{ + my $self = shift; + + $AUTOLOAD =~ s/.*:://; + $AUTOLOAD =~ tr/a-z/A-Z/; + + return tied(*{$self})->$AUTOLOAD(@_); +} + +sub gzopen_external { + my ($filename, $mode) = @_; + require IO::Handle; + my $fh = IO::Handle->new(); + if ($mode =~ /r/) { + # Because someone will try to read ungzipped files + # with this we peek and verify the signature. Yes, + # this means that we open the file twice (if it is + # gzipped). + # Plenty of race conditions exist in this code, but + # the alternative would be to capture the stderr of + # gzip and parse it, which would be a portability nightmare. + if (-e $filename && open($fh, $filename)) { + binmode $fh; + my $sig; + my $rdb = read($fh, $sig, 2); + if ($rdb == 2 && $sig eq "\x1F\x8B") { + my $ropen = sprintf $gzip_read_open, $filename; + if (open($fh, $ropen)) { + binmode $fh; + return $fh; + } else { + return undef; + } + } + seek($fh, 0, SEEK_SET) or + die "IO::Zlib: open('$filename', 'r'): seek: $!"; + return $fh; + } else { + return undef; + } + } elsif ($mode =~ /w/) { + my $level = ''; + $level = "-$1" if $mode =~ /([1-9])/; + # To maximize portability we would need to open + # two filehandles here, one for "| gzip $level" + # and another for "> $filename", and then when + # writing copy bytes from the first to the second. + # We are using IO::Handle objects for now, however, + # and they can only contain one stream at a time. + my $wopen = sprintf $gzip_write_open, $filename; + if (open($fh, $wopen)) { + $fh->autoflush(1); + binmode $fh; + return $fh; + } else { + return undef; + } + } else { + croak "IO::Zlib::gzopen_external: mode '$mode' is illegal"; + } + return undef; +} + +sub gzread_external { + # Use read() instead of syswrite() because people may + # mix reads and readlines, and we don't want to mess + # the stdio buffering. See also gzreadline_external() + # and gzwrite_external(). + my $nread = read($_[0], $_[1], @_ == 3 ? $_[2] : 4096); + defined $nread ? $nread : -1; +} + +sub gzwrite_external { + # Using syswrite() is okay (cf. gzread_external()) + # since the bytes leave this process and buffering + # is therefore not an issue. + my $nwrote = syswrite($_[0], $_[1]); + defined $nwrote ? $nwrote : -1; +} + +sub gzreadline_external { + # See the comment in gzread_external(). + $_[1] = readline($_[0]); + return defined $_[1] ? length($_[1]) : -1; +} + +sub gzeof_external { + return eof($_[0]); +} + +sub gzclose_external { + close($_[0]); + # I am not entirely certain why this is needed but it seems + # the above close() always fails (as if the stream would have + # been already closed - something to do with using external + # processes via pipes?) + return 0; +} + +1; +package IO::Compress::Bzip2 ; + +use strict ; +use warnings; +use bytes; +require Exporter ; + +use IO::Compress::Base 2.074 ; + +use IO::Compress::Base::Common 2.074 qw(); +use IO::Compress::Adapter::Bzip2 2.074 ; + + + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bzip2Error); + +$VERSION = '2.074'; +$Bzip2Error = ''; + +@ISA = qw(IO::Compress::Base Exporter); +@EXPORT_OK = qw( $Bzip2Error bzip2 ) ; +%EXPORT_TAGS = %IO::Compress::Base::EXPORT_TAGS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + + + +sub new +{ + my $class = shift ; + + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$Bzip2Error); + return $obj->_create(undef, @_); +} + +sub bzip2 +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$Bzip2Error); + $obj->_def(@_); +} + + +sub mkHeader +{ + my $self = shift ; + return ''; + +} + +sub getExtraParams +{ + my $self = shift ; + + use IO::Compress::Base::Common 2.074 qw(:Parse); + + return ( + 'blocksize100k' => [IO::Compress::Base::Common::Parse_unsigned, 1], + 'workfactor' => [IO::Compress::Base::Common::Parse_unsigned, 0], + 'verbosity' => [IO::Compress::Base::Common::Parse_boolean, 0], + ); +} + + + +sub ckParams +{ + my $self = shift ; + my $got = shift; + + # check that BlockSize100K is a number between 1 & 9 + if ($got->parsed('blocksize100k')) { + my $value = $got->getValue('blocksize100k'); + return $self->saveErrorString(undef, "Parameter 'BlockSize100K' not between 1 and 9, got $value") + unless defined $value && $value >= 1 && $value <= 9; + + } + + # check that WorkFactor between 0 & 250 + if ($got->parsed('workfactor')) { + my $value = $got->getValue('workfactor'); + return $self->saveErrorString(undef, "Parameter 'WorkFactor' not between 0 and 250, got $value") + unless $value >= 0 && $value <= 250; + } + + return 1 ; +} + + +sub mkComp +{ + my $self = shift ; + my $got = shift ; + + my $BlockSize100K = $got->getValue('blocksize100k'); + my $WorkFactor = $got->getValue('workfactor'); + my $Verbosity = $got->getValue('verbosity'); + + my ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject( + $BlockSize100K, $WorkFactor, + $Verbosity); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + return $obj; +} + + +sub mkTrailer +{ + my $self = shift ; + return ''; +} + +sub mkFinalTrailer +{ + return ''; +} + +#sub newHeader +#{ +# my $self = shift ; +# return ''; +#} + +sub getInverseClass +{ + return ('IO::Uncompress::Bunzip2'); +} + +sub getFileInfo +{ + my $self = shift ; + my $params = shift; + my $file = shift ; + +} + +1; + +__END__ + +package IO::Compress::Gzip ; + +require 5.006 ; + +use strict ; +use warnings; +use bytes; + +require Exporter ; + +use IO::Compress::RawDeflate 2.074 () ; +use IO::Compress::Adapter::Deflate 2.074 ; + +use IO::Compress::Base::Common 2.074 qw(:Status ); +use IO::Compress::Gzip::Constants 2.074 ; +use IO::Compress::Zlib::Extra 2.074 ; + +BEGIN +{ + if (defined &utf8::downgrade ) + { *noUTF8 = \&utf8::downgrade } + else + { *noUTF8 = sub {} } +} + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $GzipError); + +$VERSION = '2.074'; +$GzipError = '' ; + +@ISA = qw(IO::Compress::RawDeflate Exporter); +@EXPORT_OK = qw( $GzipError gzip ) ; +%EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ; + +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + +sub new +{ + my $class = shift ; + + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$GzipError); + + $obj->_create(undef, @_); +} + + +sub gzip +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$GzipError); + return $obj->_def(@_); +} + +#sub newHeader +#{ +# my $self = shift ; +# #return GZIP_MINIMUM_HEADER ; +# return $self->mkHeader(*$self->{Got}); +#} + +sub getExtraParams +{ + my $self = shift ; + + return ( + # zlib behaviour + $self->getZlibParams(), + + # Gzip header fields + 'minimal' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'comment' => [IO::Compress::Base::Common::Parse_any, undef], + 'name' => [IO::Compress::Base::Common::Parse_any, undef], + 'time' => [IO::Compress::Base::Common::Parse_any, undef], + 'textflag' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'headercrc' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'os_code' => [IO::Compress::Base::Common::Parse_unsigned, $Compress::Raw::Zlib::gzip_os_code], + 'extrafield'=> [IO::Compress::Base::Common::Parse_any, undef], + 'extraflags'=> [IO::Compress::Base::Common::Parse_any, undef], + + ); +} + + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + # gzip always needs crc32 + $got->setValue('crc32' => 1); + + return 1 + if $got->getValue('merge') ; + + my $strict = $got->getValue('strict') ; + + + { + if (! $got->parsed('time') ) { + # Modification time defaults to now. + $got->setValue(time => time) ; + } + + # Check that the Name & Comment don't have embedded NULLs + # Also check that they only contain ISO 8859-1 chars. + if ($got->parsed('name') && defined $got->getValue('name')) { + my $name = $got->getValue('name'); + + return $self->saveErrorString(undef, "Null Character found in Name", + Z_DATA_ERROR) + if $strict && $name =~ /\x00/ ; + + return $self->saveErrorString(undef, "Non ISO 8859-1 Character found in Name", + Z_DATA_ERROR) + if $strict && $name =~ /$GZIP_FNAME_INVALID_CHAR_RE/o ; + } + + if ($got->parsed('comment') && defined $got->getValue('comment')) { + my $comment = $got->getValue('comment'); + + return $self->saveErrorString(undef, "Null Character found in Comment", + Z_DATA_ERROR) + if $strict && $comment =~ /\x00/ ; + + return $self->saveErrorString(undef, "Non ISO 8859-1 Character found in Comment", + Z_DATA_ERROR) + if $strict && $comment =~ /$GZIP_FCOMMENT_INVALID_CHAR_RE/o; + } + + if ($got->parsed('os_code') ) { + my $value = $got->getValue('os_code'); + + return $self->saveErrorString(undef, "OS_Code must be between 0 and 255, got '$value'") + if $value < 0 || $value > 255 ; + + } + + # gzip only supports Deflate at present + $got->setValue('method' => Z_DEFLATED) ; + + if ( ! $got->parsed('extraflags')) { + $got->setValue('extraflags' => 2) + if $got->getValue('level') == Z_BEST_COMPRESSION ; + $got->setValue('extraflags' => 4) + if $got->getValue('level') == Z_BEST_SPEED ; + } + + my $data = $got->getValue('extrafield') ; + if (defined $data) { + my $bad = IO::Compress::Zlib::Extra::parseExtraField($data, $strict, 1) ; + return $self->saveErrorString(undef, "Error with ExtraField Parameter: $bad", Z_DATA_ERROR) + if $bad ; + + $got->setValue('extrafield' => $data) ; + } + } + + return 1; +} + +sub mkTrailer +{ + my $self = shift ; + return pack("V V", *$self->{Compress}->crc32(), + *$self->{UnCompSize}->get32bit()); +} + +sub getInverseClass +{ + return ('IO::Uncompress::Gunzip', + \$IO::Uncompress::Gunzip::GunzipError); +} + +sub getFileInfo +{ + my $self = shift ; + my $params = shift; + my $filename = shift ; + + return if IO::Compress::Base::Common::isaScalar($filename); + + my $defaultTime = (stat($filename))[9] ; + + $params->setValue('name' => $filename) + if ! $params->parsed('name') ; + + $params->setValue('time' => $defaultTime) + if ! $params->parsed('time') ; +} + + +sub mkHeader +{ + my $self = shift ; + my $param = shift ; + + # short-circuit if a minimal header is requested. + return GZIP_MINIMUM_HEADER if $param->getValue('minimal') ; + + # METHOD + my $method = $param->valueOrDefault('method', GZIP_CM_DEFLATED) ; + + # FLAGS + my $flags = GZIP_FLG_DEFAULT ; + $flags |= GZIP_FLG_FTEXT if $param->getValue('textflag') ; + $flags |= GZIP_FLG_FHCRC if $param->getValue('headercrc') ; + $flags |= GZIP_FLG_FEXTRA if $param->wantValue('extrafield') ; + $flags |= GZIP_FLG_FNAME if $param->wantValue('name') ; + $flags |= GZIP_FLG_FCOMMENT if $param->wantValue('comment') ; + + # MTIME + my $time = $param->valueOrDefault('time', GZIP_MTIME_DEFAULT) ; + + # EXTRA FLAGS + my $extra_flags = $param->valueOrDefault('extraflags', GZIP_XFL_DEFAULT); + + # OS CODE + my $os_code = $param->valueOrDefault('os_code', GZIP_OS_DEFAULT) ; + + + my $out = pack("C4 V C C", + GZIP_ID1, # ID1 + GZIP_ID2, # ID2 + $method, # Compression Method + $flags, # Flags + $time, # Modification Time + $extra_flags, # Extra Flags + $os_code, # Operating System Code + ) ; + + # EXTRA + if ($flags & GZIP_FLG_FEXTRA) { + my $extra = $param->getValue('extrafield') ; + $out .= pack("v", length $extra) . $extra ; + } + + # NAME + if ($flags & GZIP_FLG_FNAME) { + my $name .= $param->getValue('name') ; + $name =~ s/\x00.*$//; + $out .= $name ; + # Terminate the filename with NULL unless it already is + $out .= GZIP_NULL_BYTE + if !length $name or + substr($name, 1, -1) ne GZIP_NULL_BYTE ; + } + + # COMMENT + if ($flags & GZIP_FLG_FCOMMENT) { + my $comment .= $param->getValue('comment') ; + $comment =~ s/\x00.*$//; + $out .= $comment ; + # Terminate the comment with NULL unless it already is + $out .= GZIP_NULL_BYTE + if ! length $comment or + substr($comment, 1, -1) ne GZIP_NULL_BYTE; + } + + # HEADER CRC + $out .= pack("v", Compress::Raw::Zlib::crc32($out) & 0x00FF ) + if $param->getValue('headercrc') ; + + noUTF8($out); + + return $out ; +} + +sub mkFinalTrailer +{ + return ''; +} + +1; + +__END__ + + +package IO::Compress::Base ; + +require 5.006 ; + +use strict ; +use warnings; + +use IO::Compress::Base::Common 2.074 ; + +use IO::File (); ; +use Scalar::Util (); + +#use File::Glob; +#require Exporter ; +use Carp() ; +use Symbol(); +#use bytes; + +our (@ISA, $VERSION); +@ISA = qw(IO::File Exporter); + +$VERSION = '2.074'; + +#Can't locate object method "SWASHNEW" via package "utf8" (perhaps you forgot to load "utf8"?) at .../ext/Compress-Zlib/Gzip/blib/lib/Compress/Zlib/Common.pm line 16. + +sub saveStatus +{ + my $self = shift ; + ${ *$self->{ErrorNo} } = shift() + 0 ; + ${ *$self->{Error} } = '' ; + + return ${ *$self->{ErrorNo} } ; +} + + +sub saveErrorString +{ + my $self = shift ; + my $retval = shift ; + ${ *$self->{Error} } = shift ; + ${ *$self->{ErrorNo} } = shift() + 0 if @_ ; + + return $retval; +} + +sub croakError +{ + my $self = shift ; + $self->saveErrorString(0, $_[0]); + Carp::croak $_[0]; +} + +sub closeError +{ + my $self = shift ; + my $retval = shift ; + + my $errno = *$self->{ErrorNo}; + my $error = ${ *$self->{Error} }; + + $self->close(); + + *$self->{ErrorNo} = $errno ; + ${ *$self->{Error} } = $error ; + + return $retval; +} + + + +sub error +{ + my $self = shift ; + return ${ *$self->{Error} } ; +} + +sub errorNo +{ + my $self = shift ; + return ${ *$self->{ErrorNo} } ; +} + + +sub writeAt +{ + my $self = shift ; + my $offset = shift; + my $data = shift; + + if (defined *$self->{FH}) { + my $here = tell(*$self->{FH}); + return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) + if $here < 0 ; + seek(*$self->{FH}, $offset, IO::Handle::SEEK_SET) + or return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ; + defined *$self->{FH}->write($data, length $data) + or return $self->saveErrorString(undef, $!, $!) ; + seek(*$self->{FH}, $here, IO::Handle::SEEK_SET) + or return $self->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ; + } + else { + substr(${ *$self->{Buffer} }, $offset, length($data)) = $data ; + } + + return 1; +} + +sub outputPayload +{ + + my $self = shift ; + return $self->output(@_); +} + + +sub output +{ + my $self = shift ; + my $data = shift ; + my $last = shift ; + + return 1 + if length $data == 0 && ! $last ; + + if ( *$self->{FilterContainer} ) { + *_ = \$data; + &{ *$self->{FilterContainer} }(); + } + + if (length $data) { + if ( defined *$self->{FH} ) { + defined *$self->{FH}->write( $data, length $data ) + or return $self->saveErrorString(0, $!, $!); + } + else { + ${ *$self->{Buffer} } .= $data ; + } + } + + return 1; +} + +sub getOneShotParams +{ + return ( 'multistream' => [IO::Compress::Base::Common::Parse_boolean, 1], + ); +} + +our %PARAMS = ( + # Generic Parameters + 'autoclose' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'encode' => [IO::Compress::Base::Common::Parse_any, undef], + 'strict' => [IO::Compress::Base::Common::Parse_boolean, 1], + 'append' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'binmodein' => [IO::Compress::Base::Common::Parse_boolean, 0], + + 'filtercontainer' => [IO::Compress::Base::Common::Parse_code, undef], + ); + +sub checkParams +{ + my $self = shift ; + my $class = shift ; + + my $got = shift || IO::Compress::Base::Parameters::new(); + + $got->parse( + { + %PARAMS, + + + $self->getExtraParams(), + *$self->{OneShot} ? $self->getOneShotParams() + : (), + }, + @_) or $self->croakError("${class}: " . $got->getError()) ; + + return $got ; +} + +sub _create +{ + my $obj = shift; + my $got = shift; + + *$obj->{Closed} = 1 ; + + my $class = ref $obj; + $obj->croakError("$class: Missing Output parameter") + if ! @_ && ! $got ; + + my $outValue = shift ; + my $oneShot = 1 ; + + if (! $got) + { + $oneShot = 0 ; + $got = $obj->checkParams($class, undef, @_) + or return undef ; + } + + my $lax = ! $got->getValue('strict') ; + + my $outType = IO::Compress::Base::Common::whatIsOutput($outValue); + + $obj->ckOutputParam($class, $outValue) + or return undef ; + + if ($outType eq 'buffer') { + *$obj->{Buffer} = $outValue; + } + else { + my $buff = "" ; + *$obj->{Buffer} = \$buff ; + } + + # Merge implies Append + my $merge = $got->getValue('merge') ; + my $appendOutput = $got->getValue('append') || $merge ; + *$obj->{Append} = $appendOutput; + *$obj->{FilterContainer} = $got->getValue('filtercontainer') ; + + if ($merge) + { + # Switch off Merge mode if output file/buffer is empty/doesn't exist + if (($outType eq 'buffer' && length $$outValue == 0 ) || + ($outType ne 'buffer' && (! -e $outValue || (-w _ && -z _))) ) + { $merge = 0 } + } + + # If output is a file, check that it is writable + #no warnings; + #if ($outType eq 'filename' && -e $outValue && ! -w _) + # { return $obj->saveErrorString(undef, "Output file '$outValue' is not writable" ) } + + $obj->ckParams($got) + or $obj->croakError("${class}: " . $obj->error()); + + if ($got->getValue('encode')) { + my $want_encoding = $got->getValue('encode'); + *$obj->{Encoding} = IO::Compress::Base::Common::getEncoding($obj, $class, $want_encoding); + my $x = *$obj->{Encoding}; + } + else { + *$obj->{Encoding} = undef; + } + + $obj->saveStatus(STATUS_OK) ; + + my $status ; + if (! $merge) + { + *$obj->{Compress} = $obj->mkComp($got) + or return undef; + + *$obj->{UnCompSize} = new U64 ; + *$obj->{CompSize} = new U64 ; + + if ( $outType eq 'buffer') { + ${ *$obj->{Buffer} } = '' + unless $appendOutput ; + } + else { + if ($outType eq 'handle') { + *$obj->{FH} = $outValue ; + setBinModeOutput(*$obj->{FH}) ; + #$outValue->flush() ; + *$obj->{Handle} = 1 ; + if ($appendOutput) + { + seek(*$obj->{FH}, 0, IO::Handle::SEEK_END) + or return $obj->saveErrorString(undef, "Cannot seek to end of output filehandle: $!", $!) ; + + } + } + elsif ($outType eq 'filename') { + no warnings; + my $mode = '>' ; + $mode = '>>' + if $appendOutput; + *$obj->{FH} = new IO::File "$mode $outValue" + or return $obj->saveErrorString(undef, "cannot open file '$outValue': $!", $!) ; + *$obj->{StdIO} = ($outValue eq '-'); + setBinModeOutput(*$obj->{FH}) ; + } + } + + *$obj->{Header} = $obj->mkHeader($got) ; + $obj->output( *$obj->{Header} ) + or return undef; + $obj->beforePayload(); + } + else + { + *$obj->{Compress} = $obj->createMerge($outValue, $outType) + or return undef; + } + + *$obj->{Closed} = 0 ; + *$obj->{AutoClose} = $got->getValue('autoclose') ; + *$obj->{Output} = $outValue; + *$obj->{ClassName} = $class; + *$obj->{Got} = $got; + *$obj->{OneShot} = 0 ; + + return $obj ; +} + +sub ckOutputParam +{ + my $self = shift ; + my $from = shift ; + my $outType = IO::Compress::Base::Common::whatIsOutput($_[0]); + + $self->croakError("$from: output parameter not a filename, filehandle or scalar ref") + if ! $outType ; + + #$self->croakError("$from: output filename is undef or null string") + #if $outType eq 'filename' && (! defined $_[0] || $_[0] eq '') ; + + $self->croakError("$from: output buffer is read-only") + if $outType eq 'buffer' && Scalar::Util::readonly(${ $_[0] }); + + return 1; +} + + +sub _def +{ + my $obj = shift ; + + my $class= (caller)[0] ; + my $name = (caller(1))[3] ; + + $obj->croakError("$name: expected at least 1 parameters\n") + unless @_ >= 1 ; + + my $input = shift ; + my $haveOut = @_ ; + my $output = shift ; + + my $x = new IO::Compress::Base::Validator($class, *$obj->{Error}, $name, $input, $output) + or return undef ; + + push @_, $output if $haveOut && $x->{Hash}; + + *$obj->{OneShot} = 1 ; + + my $got = $obj->checkParams($name, undef, @_) + or return undef ; + + $x->{Got} = $got ; + +# if ($x->{Hash}) +# { +# while (my($k, $v) = each %$input) +# { +# $v = \$input->{$k} +# unless defined $v ; +# +# $obj->_singleTarget($x, 1, $k, $v, @_) +# or return undef ; +# } +# +# return keys %$input ; +# } + + if ($x->{GlobMap}) + { + $x->{oneInput} = 1 ; + foreach my $pair (@{ $x->{Pairs} }) + { + my ($from, $to) = @$pair ; + $obj->_singleTarget($x, 1, $from, $to, @_) + or return undef ; + } + + return scalar @{ $x->{Pairs} } ; + } + + if (! $x->{oneOutput} ) + { + my $inFile = ($x->{inType} eq 'filenames' + || $x->{inType} eq 'filename'); + + $x->{inType} = $inFile ? 'filename' : 'buffer'; + + foreach my $in ($x->{oneInput} ? $input : @$input) + { + my $out ; + $x->{oneInput} = 1 ; + + $obj->_singleTarget($x, $inFile, $in, \$out, @_) + or return undef ; + + push @$output, \$out ; + #if ($x->{outType} eq 'array') + # { push @$output, \$out } + #else + # { $output->{$in} = \$out } + } + + return 1 ; + } + + # finally the 1 to 1 and n to 1 + return $obj->_singleTarget($x, 1, $input, $output, @_); + + Carp::croak "should not be here" ; +} + +sub _singleTarget +{ + my $obj = shift ; + my $x = shift ; + my $inputIsFilename = shift; + my $input = shift; + + if ($x->{oneInput}) + { + $obj->getFileInfo($x->{Got}, $input) + if isaScalar($input) || (isaFilename($input) and $inputIsFilename) ; + + my $z = $obj->_create($x->{Got}, @_) + or return undef ; + + + defined $z->_wr2($input, $inputIsFilename) + or return $z->closeError(undef) ; + + return $z->close() ; + } + else + { + my $afterFirst = 0 ; + my $inputIsFilename = ($x->{inType} ne 'array'); + my $keep = $x->{Got}->clone(); + + #for my $element ( ($x->{inType} eq 'hash') ? keys %$input : @$input) + for my $element ( @$input) + { + my $isFilename = isaFilename($element); + + if ( $afterFirst ++ ) + { + defined addInterStream($obj, $element, $isFilename) + or return $obj->closeError(undef) ; + } + else + { + $obj->getFileInfo($x->{Got}, $element) + if isaScalar($element) || $isFilename; + + $obj->_create($x->{Got}, @_) + or return undef ; + } + + defined $obj->_wr2($element, $isFilename) + or return $obj->closeError(undef) ; + + *$obj->{Got} = $keep->clone(); + } + return $obj->close() ; + } + +} + +sub _wr2 +{ + my $self = shift ; + + my $source = shift ; + my $inputIsFilename = shift; + + my $input = $source ; + if (! $inputIsFilename) + { + $input = \$source + if ! ref $source; + } + + if ( ref $input && ref $input eq 'SCALAR' ) + { + return $self->syswrite($input, @_) ; + } + + if ( ! ref $input || isaFilehandle($input)) + { + my $isFilehandle = isaFilehandle($input) ; + + my $fh = $input ; + + if ( ! $isFilehandle ) + { + $fh = new IO::File "<$input" + or return $self->saveErrorString(undef, "cannot open file '$input': $!", $!) ; + } + binmode $fh if *$self->{Got}->valueOrDefault('binmodein') ; + + my $status ; + my $buff ; + my $count = 0 ; + while ($status = read($fh, $buff, 16 * 1024)) { + $count += length $buff; + defined $self->syswrite($buff, @_) + or return undef ; + } + + return $self->saveErrorString(undef, $!, $!) + if ! defined $status ; + + if ( (!$isFilehandle || *$self->{AutoClose}) && $input ne '-') + { + $fh->close() + or return undef ; + } + + return $count ; + } + + Carp::croak "Should not be here"; + return undef; +} + +sub addInterStream +{ + my $self = shift ; + my $input = shift ; + my $inputIsFilename = shift ; + + if (*$self->{Got}->getValue('multistream')) + { + $self->getFileInfo(*$self->{Got}, $input) + #if isaFilename($input) and $inputIsFilename ; + if isaScalar($input) || isaFilename($input) ; + + # TODO -- newStream needs to allow gzip/zip header to be modified + return $self->newStream(); + } + elsif (*$self->{Got}->getValue('autoflush')) + { + #return $self->flush(Z_FULL_FLUSH); + } + + return 1 ; +} + +sub getFileInfo +{ +} + +sub TIEHANDLE +{ + return $_[0] if ref($_[0]); + die "OOPS\n" ; +} + +sub UNTIE +{ + my $self = shift ; +} + +sub DESTROY +{ + my $self = shift ; + local ($., $@, $!, $^E, $?); + + $self->close() ; + + # TODO - memory leak with 5.8.0 - this isn't called until + # global destruction + # + %{ *$self } = () ; + undef $self ; +} + + + +sub filterUncompressed +{ +} + +sub syswrite +{ + my $self = shift ; + + my $buffer ; + if (ref $_[0] ) { + $self->croakError( *$self->{ClassName} . "::write: not a scalar reference" ) + unless ref $_[0] eq 'SCALAR' ; + $buffer = $_[0] ; + } + else { + $buffer = \$_[0] ; + } + + if (@_ > 1) { + my $slen = defined $$buffer ? length($$buffer) : 0; + my $len = $slen; + my $offset = 0; + $len = $_[1] if $_[1] < $len; + + if (@_ > 2) { + $offset = $_[2] || 0; + $self->croakError(*$self->{ClassName} . "::write: offset outside string") + if $offset > $slen; + if ($offset < 0) { + $offset += $slen; + $self->croakError( *$self->{ClassName} . "::write: offset outside string") if $offset < 0; + } + my $rem = $slen - $offset; + $len = $rem if $rem < $len; + } + + $buffer = \substr($$buffer, $offset, $len) ; + } + + return 0 if (! defined $$buffer || length $$buffer == 0) && ! *$self->{FlushPending}; + +# *$self->{Pending} .= $$buffer ; +# +# return length $$buffer +# if (length *$self->{Pending} < 1024 * 16 && ! *$self->{FlushPending}) ; +# +# $$buffer = *$self->{Pending} ; +# *$self->{Pending} = ''; + + if (*$self->{Encoding}) { + $$buffer = *$self->{Encoding}->encode($$buffer); + } + else { + $] >= 5.008 and ( utf8::downgrade($$buffer, 1) + or Carp::croak "Wide character in " . *$self->{ClassName} . "::write:"); + } + + $self->filterUncompressed($buffer); + + my $buffer_length = defined $$buffer ? length($$buffer) : 0 ; + *$self->{UnCompSize}->add($buffer_length) ; + + my $outBuffer=''; + my $status = *$self->{Compress}->compr($buffer, $outBuffer) ; + + return $self->saveErrorString(undef, *$self->{Compress}{Error}, + *$self->{Compress}{ErrorNo}) + if $status == STATUS_ERROR; + + *$self->{CompSize}->add(length $outBuffer) ; + + $self->outputPayload($outBuffer) + or return undef; + + return $buffer_length; +} + +sub print +{ + my $self = shift; + + #if (ref $self) { + # $self = *$self{GLOB} ; + #} + + if (defined $\) { + if (defined $,) { + defined $self->syswrite(join($,, @_) . $\); + } else { + defined $self->syswrite(join("", @_) . $\); + } + } else { + if (defined $,) { + defined $self->syswrite(join($,, @_)); + } else { + defined $self->syswrite(join("", @_)); + } + } +} + +sub printf +{ + my $self = shift; + my $fmt = shift; + defined $self->syswrite(sprintf($fmt, @_)); +} + +sub _flushCompressed +{ + my $self = shift ; + + my $outBuffer=''; + my $status = *$self->{Compress}->flush($outBuffer, @_) ; + return $self->saveErrorString(0, *$self->{Compress}{Error}, + *$self->{Compress}{ErrorNo}) + if $status == STATUS_ERROR; + + if ( defined *$self->{FH} ) { + *$self->{FH}->clearerr(); + } + + *$self->{CompSize}->add(length $outBuffer) ; + + $self->outputPayload($outBuffer) + or return 0; + return 1; +} + +sub flush +{ + my $self = shift ; + + $self->_flushCompressed(@_) + or return 0; + + if ( defined *$self->{FH} ) { + defined *$self->{FH}->flush() + or return $self->saveErrorString(0, $!, $!); + } + + return 1; +} + +sub beforePayload +{ +} + +sub _newStream +{ + my $self = shift ; + my $got = shift; + + my $class = ref $self; + + $self->_writeTrailer() + or return 0 ; + + $self->ckParams($got) + or $self->croakError("newStream: $self->{Error}"); + + if ($got->getValue('encode')) { + my $want_encoding = $got->getValue('encode'); + *$self->{Encoding} = IO::Compress::Base::Common::getEncoding($self, $class, $want_encoding); + } + else { + *$self->{Encoding} = undef; + } + + *$self->{Compress} = $self->mkComp($got) + or return 0; + + *$self->{Header} = $self->mkHeader($got) ; + $self->output(*$self->{Header} ) + or return 0; + + *$self->{UnCompSize}->reset(); + *$self->{CompSize}->reset(); + + $self->beforePayload(); + + return 1 ; +} + +sub newStream +{ + my $self = shift ; + + my $got = $self->checkParams('newStream', *$self->{Got}, @_) + or return 0 ; + + $self->_newStream($got); + +# *$self->{Compress} = $self->mkComp($got) +# or return 0; +# +# *$self->{Header} = $self->mkHeader($got) ; +# $self->output(*$self->{Header} ) +# or return 0; +# +# *$self->{UnCompSize}->reset(); +# *$self->{CompSize}->reset(); +# +# $self->beforePayload(); +# +# return 1 ; +} + +sub reset +{ + my $self = shift ; + return *$self->{Compress}->reset() ; +} + +sub _writeTrailer +{ + my $self = shift ; + + my $trailer = ''; + + my $status = *$self->{Compress}->close($trailer) ; + return $self->saveErrorString(0, *$self->{Compress}{Error}, *$self->{Compress}{ErrorNo}) + if $status == STATUS_ERROR; + + *$self->{CompSize}->add(length $trailer) ; + + $trailer .= $self->mkTrailer(); + defined $trailer + or return 0; + + return $self->output($trailer); +} + +sub _writeFinalTrailer +{ + my $self = shift ; + + return $self->output($self->mkFinalTrailer()); +} + +sub close +{ + my $self = shift ; + return 1 if *$self->{Closed} || ! *$self->{Compress} ; + *$self->{Closed} = 1 ; + + untie *$self + if $] >= 5.008 ; + + *$self->{FlushPending} = 1 ; + $self->_writeTrailer() + or return 0 ; + + $self->_writeFinalTrailer() + or return 0 ; + + $self->output( "", 1 ) + or return 0; + + if (defined *$self->{FH}) { + + if ((! *$self->{Handle} || *$self->{AutoClose}) && ! *$self->{StdIO}) { + $! = 0 ; + *$self->{FH}->close() + or return $self->saveErrorString(0, $!, $!); + } + delete *$self->{FH} ; + # This delete can set $! in older Perls, so reset the errno + $! = 0 ; + } + + return 1; +} + + +#sub total_in +#sub total_out +#sub msg +# +#sub crc +#{ +# my $self = shift ; +# return *$self->{Compress}->crc32() ; +#} +# +#sub msg +#{ +# my $self = shift ; +# return *$self->{Compress}->msg() ; +#} +# +#sub dict_adler +#{ +# my $self = shift ; +# return *$self->{Compress}->dict_adler() ; +#} +# +#sub get_Level +#{ +# my $self = shift ; +# return *$self->{Compress}->get_Level() ; +#} +# +#sub get_Strategy +#{ +# my $self = shift ; +# return *$self->{Compress}->get_Strategy() ; +#} + + +sub tell +{ + my $self = shift ; + + return *$self->{UnCompSize}->get32bit() ; +} + +sub eof +{ + my $self = shift ; + + return *$self->{Closed} ; +} + + +sub seek +{ + my $self = shift ; + my $position = shift; + my $whence = shift ; + + my $here = $self->tell() ; + my $target = 0 ; + + #use IO::Handle qw(SEEK_SET SEEK_CUR SEEK_END); + use IO::Handle ; + + if ($whence == IO::Handle::SEEK_SET) { + $target = $position ; + } + elsif ($whence == IO::Handle::SEEK_CUR || $whence == IO::Handle::SEEK_END) { + $target = $here + $position ; + } + else { + $self->croakError(*$self->{ClassName} . "::seek: unknown value, $whence, for whence parameter"); + } + + # short circuit if seeking to current offset + return 1 if $target == $here ; + + # Outlaw any attempt to seek backwards + $self->croakError(*$self->{ClassName} . "::seek: cannot seek backwards") + if $target < $here ; + + # Walk the file to the new offset + my $offset = $target - $here ; + + my $buffer ; + defined $self->syswrite("\x00" x $offset) + or return 0; + + return 1 ; +} + +sub binmode +{ + 1; +# my $self = shift ; +# return defined *$self->{FH} +# ? binmode *$self->{FH} +# : 1 ; +} + +sub fileno +{ + my $self = shift ; + return defined *$self->{FH} + ? *$self->{FH}->fileno() + : undef ; +} + +sub opened +{ + my $self = shift ; + return ! *$self->{Closed} ; +} + +sub autoflush +{ + my $self = shift ; + return defined *$self->{FH} + ? *$self->{FH}->autoflush(@_) + : undef ; +} + +sub input_line_number +{ + return undef ; +} + + +sub _notAvailable +{ + my $name = shift ; + return sub { Carp::croak "$name Not Available: File opened only for output" ; } ; +} + +*read = _notAvailable('read'); +*READ = _notAvailable('read'); +*readline = _notAvailable('readline'); +*READLINE = _notAvailable('readline'); +*getc = _notAvailable('getc'); +*GETC = _notAvailable('getc'); + +*FILENO = \&fileno; +*PRINT = \&print; +*PRINTF = \&printf; +*WRITE = \&syswrite; +*write = \&syswrite; +*SEEK = \&seek; +*TELL = \&tell; +*EOF = \&eof; +*CLOSE = \&close; +*BINMODE = \&binmode; + +#*sysread = \&_notAvailable; +#*syswrite = \&_write; + +1; + +__END__ + +package IO::Compress::Zip ; + +use strict ; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status ); +use IO::Compress::RawDeflate 2.074 (); +use IO::Compress::Adapter::Deflate 2.074 ; +use IO::Compress::Adapter::Identity 2.074 ; +use IO::Compress::Zlib::Extra 2.074 ; +use IO::Compress::Zip::Constants 2.074 ; + +use File::Spec(); +use Config; + +use Compress::Raw::Zlib 2.074 (); + +BEGIN +{ + eval { require IO::Compress::Adapter::Bzip2 ; + import IO::Compress::Adapter::Bzip2 2.074 ; + require IO::Compress::Bzip2 ; + import IO::Compress::Bzip2 2.074 ; + } ; + + eval { require IO::Compress::Adapter::Lzma ; + import IO::Compress::Adapter::Lzma 2.074 ; + require IO::Compress::Lzma ; + import IO::Compress::Lzma 2.074 ; + } ; +} + + +require Exporter ; + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $ZipError); + +$VERSION = '2.074'; +$ZipError = ''; + +@ISA = qw(IO::Compress::RawDeflate Exporter); +@EXPORT_OK = qw( $ZipError zip ) ; +%EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ; + +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; + +$EXPORT_TAGS{zip_method} = [qw( ZIP_CM_STORE ZIP_CM_DEFLATE ZIP_CM_BZIP2 ZIP_CM_LZMA)]; +push @{ $EXPORT_TAGS{all} }, @{ $EXPORT_TAGS{zip_method} }; + +Exporter::export_ok_tags('all'); + +sub new +{ + my $class = shift ; + + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$ZipError); + $obj->_create(undef, @_); + +} + +sub zip +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$ZipError); + return $obj->_def(@_); +} + +sub isMethodAvailable +{ + my $method = shift; + + # Store & Deflate are always available + return 1 + if $method == ZIP_CM_STORE || $method == ZIP_CM_DEFLATE ; + + return 1 + if $method == ZIP_CM_BZIP2 and + defined $IO::Compress::Adapter::Bzip2::VERSION; + + return 1 + if $method == ZIP_CM_LZMA and + defined $IO::Compress::Adapter::Lzma::VERSION; + + return 0; +} + +sub beforePayload +{ + my $self = shift ; + + if (*$self->{ZipData}{Sparse} ) { + my $inc = 1024 * 100 ; + my $NULLS = ("\x00" x $inc) ; + my $sparse = *$self->{ZipData}{Sparse} ; + *$self->{CompSize}->add( $sparse ); + *$self->{UnCompSize}->add( $sparse ); + + *$self->{FH}->seek($sparse, IO::Handle::SEEK_CUR); + + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32($NULLS, *$self->{ZipData}{CRC32}) + for 1 .. int $sparse / $inc; + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(substr($NULLS, 0, $sparse % $inc), + *$self->{ZipData}{CRC32}) + if $sparse % $inc; + } +} + +sub mkComp +{ + my $self = shift ; + my $got = shift ; + + my ($obj, $errstr, $errno) ; + + if (*$self->{ZipData}{Method} == ZIP_CM_STORE) { + ($obj, $errstr, $errno) = IO::Compress::Adapter::Identity::mkCompObject( + $got->getValue('level'), + $got->getValue('strategy') + ); + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(undef); + } + elsif (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) { + ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject( + $got->getValue('crc32'), + $got->getValue('adler32'), + $got->getValue('level'), + $got->getValue('strategy') + ); + } + elsif (*$self->{ZipData}{Method} == ZIP_CM_BZIP2) { + ($obj, $errstr, $errno) = IO::Compress::Adapter::Bzip2::mkCompObject( + $got->getValue('blocksize100k'), + $got->getValue('workfactor'), + $got->getValue('verbosity') + ); + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(undef); + } + elsif (*$self->{ZipData}{Method} == ZIP_CM_LZMA) { + ($obj, $errstr, $errno) = IO::Compress::Adapter::Lzma::mkRawZipCompObject($got->getValue('preset'), + $got->getValue('extreme'), + ); + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(undef); + } + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + if (! defined *$self->{ZipData}{SizesOffset}) { + *$self->{ZipData}{SizesOffset} = 0; + *$self->{ZipData}{Offset} = new U64 ; + } + + *$self->{ZipData}{AnyZip64} = 0 + if ! defined *$self->{ZipData}{AnyZip64} ; + + return $obj; +} + +sub reset +{ + my $self = shift ; + + *$self->{Compress}->reset(); + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(''); + + return STATUS_OK; +} + +sub filterUncompressed +{ + my $self = shift ; + + if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) { + *$self->{ZipData}{CRC32} = *$self->{Compress}->crc32(); + } + else { + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(${$_[0]}, *$self->{ZipData}{CRC32}); + + } +} + +sub canonicalName +{ + # This sub is derived from Archive::Zip::_asZipDirName + + # Return the normalized name as used in a zip file (path + # separators become slashes, etc.). + # Will translate internal slashes in path components (i.e. on Macs) to + # underscores. Discards volume names. + # When $forceDir is set, returns paths with trailing slashes + # + # input output + # . '.' + # ./a a + # ./a/b a/b + # ./a/b/ a/b + # a/b/ a/b + # /a/b/ a/b + # c:\a\b\c.doc a/b/c.doc # on Windows + # "i/o maps:whatever" i_o maps/whatever # on Macs + + my $name = shift; + my $forceDir = shift ; + + my ( $volume, $directories, $file ) = + File::Spec->splitpath( File::Spec->canonpath($name), $forceDir ); + + my @dirs = map { $_ =~ s{/}{_}g; $_ } + File::Spec->splitdir($directories); + + if ( @dirs > 0 ) { pop (@dirs) if $dirs[-1] eq '' } # remove empty component + push @dirs, defined($file) ? $file : '' ; + + my $normalised_path = join '/', @dirs; + + # Leading directory separators should not be stored in zip archives. + # Example: + # C:\a\b\c\ a/b/c + # C:\a\b\c.txt a/b/c.txt + # /a/b/c/ a/b/c + # /a/b/c.txt a/b/c.txt + $normalised_path =~ s{^/}{}; # remove leading separator + + return $normalised_path; +} + + +sub mkHeader +{ + my $self = shift; + my $param = shift ; + + *$self->{ZipData}{LocalHdrOffset} = U64::clone(*$self->{ZipData}{Offset}); + + my $comment = ''; + $comment = $param->valueOrDefault('comment') ; + + my $filename = ''; + $filename = $param->valueOrDefault('name') ; + + $filename = canonicalName($filename) + if length $filename && $param->getValue('canonicalname') ; + + if (defined *$self->{ZipData}{FilterName} ) { + local *_ = \$filename ; + &{ *$self->{ZipData}{FilterName} }() ; + } + +# if ( $param->getValue('utf8') ) { +# require Encode ; +# $filename = Encode::encode_utf8($filename) +# if length $filename ; +# $comment = Encode::encode_utf8($comment) +# if length $comment ; +# } + + my $hdr = ''; + + my $time = _unixToDosTime($param->getValue('time')); + + my $extra = ''; + my $ctlExtra = ''; + my $empty = 0; + my $osCode = $param->getValue('os_code') ; + my $extFileAttr = 0 ; + + # This code assumes Unix. + # TODO - revisit this + $extFileAttr = 0100644 << 16 + if $osCode == ZIP_OS_CODE_UNIX ; + + if (*$self->{ZipData}{Zip64}) { + $empty = IO::Compress::Base::Common::MAX32; + + my $x = ''; + $x .= pack "V V", 0, 0 ; # uncompressedLength + $x .= pack "V V", 0, 0 ; # compressedLength + + # Zip64 needs to be first in extra field to workaround a Windows Explorer Bug + # See http://www.info-zip.org/phpBB3/viewtopic.php?f=3&t=440 for details + $extra .= IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_ZIP64, $x); + } + + if (! $param->getValue('minimal')) { + if ($param->parsed('mtime')) + { + $extra .= mkExtendedTime($param->getValue('mtime'), + $param->getValue('atime'), + $param->getValue('ctime')); + + $ctlExtra .= mkExtendedTime($param->getValue('mtime')); + } + + if ( $osCode == ZIP_OS_CODE_UNIX ) + { + if ( $param->getValue('want_exunixn') ) + { + my $ux3 = mkUnixNExtra( @{ $param->getValue('want_exunixn') }); + $extra .= $ux3; + $ctlExtra .= $ux3; + } + + if ( $param->getValue('exunix2') ) + { + $extra .= mkUnix2Extra( @{ $param->getValue('exunix2') }); + $ctlExtra .= mkUnix2Extra(); + } + } + + $extFileAttr = $param->getValue('extattr') + if defined $param->getValue('extattr') ; + + $extra .= $param->getValue('extrafieldlocal') + if defined $param->getValue('extrafieldlocal'); + + $ctlExtra .= $param->getValue('extrafieldcentral') + if defined $param->getValue('extrafieldcentral'); + } + + my $method = *$self->{ZipData}{Method} ; + my $gpFlag = 0 ; + $gpFlag |= ZIP_GP_FLAG_STREAMING_MASK + if *$self->{ZipData}{Stream} ; + + $gpFlag |= ZIP_GP_FLAG_LZMA_EOS_PRESENT + if $method == ZIP_CM_LZMA ; + +# $gpFlag |= ZIP_GP_FLAG_LANGUAGE_ENCODING +# if $param->getValue('utf8') && (length($filename) || length($comment)); + + my $version = $ZIP_CM_MIN_VERSIONS{$method}; + $version = ZIP64_MIN_VERSION + if ZIP64_MIN_VERSION > $version && *$self->{ZipData}{Zip64}; + + my $madeBy = ($param->getValue('os_code') << 8) + $version; + my $extract = $version; + + *$self->{ZipData}{Version} = $version; + *$self->{ZipData}{MadeBy} = $madeBy; + + my $ifa = 0; + $ifa |= ZIP_IFA_TEXT_MASK + if $param->getValue('textflag'); + + $hdr .= pack "V", ZIP_LOCAL_HDR_SIG ; # signature + $hdr .= pack 'v', $extract ; # extract Version & OS + $hdr .= pack 'v', $gpFlag ; # general purpose flag (set streaming mode) + $hdr .= pack 'v', $method ; # compression method (deflate) + $hdr .= pack 'V', $time ; # last mod date/time + $hdr .= pack 'V', 0 ; # crc32 - 0 when streaming + $hdr .= pack 'V', $empty ; # compressed length - 0 when streaming + $hdr .= pack 'V', $empty ; # uncompressed length - 0 when streaming + $hdr .= pack 'v', length $filename ; # filename length + $hdr .= pack 'v', length $extra ; # extra length + + $hdr .= $filename ; + + # Remember the offset for the compressed & uncompressed lengths in the + # local header. + if (*$self->{ZipData}{Zip64}) { + *$self->{ZipData}{SizesOffset} = *$self->{ZipData}{Offset}->get64bit() + + length($hdr) + 4 ; + } + else { + *$self->{ZipData}{SizesOffset} = *$self->{ZipData}{Offset}->get64bit() + + 18; + } + + $hdr .= $extra ; + + + my $ctl = ''; + + $ctl .= pack "V", ZIP_CENTRAL_HDR_SIG ; # signature + $ctl .= pack 'v', $madeBy ; # version made by + $ctl .= pack 'v', $extract ; # extract Version + $ctl .= pack 'v', $gpFlag ; # general purpose flag (streaming mode) + $ctl .= pack 'v', $method ; # compression method (deflate) + $ctl .= pack 'V', $time ; # last mod date/time + $ctl .= pack 'V', 0 ; # crc32 + $ctl .= pack 'V', $empty ; # compressed length + $ctl .= pack 'V', $empty ; # uncompressed length + $ctl .= pack 'v', length $filename ; # filename length + + *$self->{ZipData}{ExtraOffset} = length $ctl; + *$self->{ZipData}{ExtraSize} = length $ctlExtra ; + + $ctl .= pack 'v', length $ctlExtra ; # extra length + $ctl .= pack 'v', length $comment ; # file comment length + $ctl .= pack 'v', 0 ; # disk number start + $ctl .= pack 'v', $ifa ; # internal file attributes + $ctl .= pack 'V', $extFileAttr ; # external file attributes + + # offset to local hdr + if (*$self->{ZipData}{LocalHdrOffset}->is64bit() ) { + $ctl .= pack 'V', IO::Compress::Base::Common::MAX32 ; + } + else { + $ctl .= *$self->{ZipData}{LocalHdrOffset}->getPacked_V32() ; + } + + $ctl .= $filename ; + + *$self->{ZipData}{Offset}->add32(length $hdr) ; + + *$self->{ZipData}{CentralHeader} = [ $ctl, $ctlExtra, $comment]; + + return $hdr; +} + +sub mkTrailer +{ + my $self = shift ; + + my $crc32 ; + if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) { + $crc32 = pack "V", *$self->{Compress}->crc32(); + } + else { + $crc32 = pack "V", *$self->{ZipData}{CRC32}; + } + + my ($ctl, $ctlExtra, $comment) = @{ *$self->{ZipData}{CentralHeader} }; + + my $sizes ; + if (! *$self->{ZipData}{Zip64}) { + $sizes .= *$self->{CompSize}->getPacked_V32() ; # Compressed size + $sizes .= *$self->{UnCompSize}->getPacked_V32() ; # Uncompressed size + } + else { + $sizes .= *$self->{CompSize}->getPacked_V64() ; # Compressed size + $sizes .= *$self->{UnCompSize}->getPacked_V64() ; # Uncompressed size + } + + my $data = $crc32 . $sizes ; + + my $xtrasize = *$self->{UnCompSize}->getPacked_V64() ; # Uncompressed size + $xtrasize .= *$self->{CompSize}->getPacked_V64() ; # Compressed size + + my $hdr = ''; + + if (*$self->{ZipData}{Stream}) { + $hdr = pack "V", ZIP_DATA_HDR_SIG ; # signature + $hdr .= $data ; + } + else { + $self->writeAt(*$self->{ZipData}{LocalHdrOffset}->get64bit() + 14, $crc32) + or return undef; + $self->writeAt(*$self->{ZipData}{SizesOffset}, + *$self->{ZipData}{Zip64} ? $xtrasize : $sizes) + or return undef; + } + + # Central Header Record/Zip64 extended field + + substr($ctl, 16, length $crc32) = $crc32 ; + + my $zip64Payload = ''; + + # uncompressed length - only set zip64 if needed + if (*$self->{UnCompSize}->isAlmost64bit()) { # || *$self->{ZipData}{Zip64}) { + $zip64Payload .= *$self->{UnCompSize}->getPacked_V64() ; + } else { + substr($ctl, 24, 4) = *$self->{UnCompSize}->getPacked_V32() ; + } + + # compressed length - only set zip64 if needed + if (*$self->{CompSize}->isAlmost64bit()) { # || *$self->{ZipData}{Zip64}) { + $zip64Payload .= *$self->{CompSize}->getPacked_V64() ; + } else { + substr($ctl, 20, 4) = *$self->{CompSize}->getPacked_V32() ; + } + + # Local Header offset + $zip64Payload .= *$self->{ZipData}{LocalHdrOffset}->getPacked_V64() + if *$self->{ZipData}{LocalHdrOffset}->is64bit() ; + + # disk no - always zero, so don't need to include it. + #$zip64Payload .= pack "V", 0 ; + + my $zip64Xtra = ''; + + if (length $zip64Payload) { + $zip64Xtra = IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_ZIP64, $zip64Payload); + + substr($ctl, *$self->{ZipData}{ExtraOffset}, 2) = + pack 'v', *$self->{ZipData}{ExtraSize} + length $zip64Xtra; + + *$self->{ZipData}{AnyZip64} = 1; + } + + # Zip64 needs to be first in extra field to workaround a Windows Explorer Bug + # See http://www.info-zip.org/phpBB3/viewtopic.php?f=3&t=440 for details + $ctl .= $zip64Xtra . $ctlExtra . $comment; + + *$self->{ZipData}{Offset}->add32(length($hdr)); + *$self->{ZipData}{Offset}->add( *$self->{CompSize} ); + push @{ *$self->{ZipData}{CentralDir} }, $ctl ; + + return $hdr; +} + +sub mkFinalTrailer +{ + my $self = shift ; + + my $comment = ''; + $comment = *$self->{ZipData}{ZipComment} ; + + my $cd_offset = *$self->{ZipData}{Offset}->get32bit() ; # offset to start central dir + + my $entries = @{ *$self->{ZipData}{CentralDir} }; + + *$self->{ZipData}{AnyZip64} = 1 + if *$self->{ZipData}{Offset}->is64bit || $entries >= 0xFFFF ; + + my $cd = join '', @{ *$self->{ZipData}{CentralDir} }; + my $cd_len = length $cd ; + + my $z64e = ''; + + if ( *$self->{ZipData}{AnyZip64} ) { + + my $v = *$self->{ZipData}{Version} ; + my $mb = *$self->{ZipData}{MadeBy} ; + $z64e .= pack 'v', $mb ; # Version made by + $z64e .= pack 'v', $v ; # Version to extract + $z64e .= pack 'V', 0 ; # number of disk + $z64e .= pack 'V', 0 ; # number of disk with central dir + $z64e .= U64::pack_V64 $entries ; # entries in central dir on this disk + $z64e .= U64::pack_V64 $entries ; # entries in central dir + $z64e .= U64::pack_V64 $cd_len ; # size of central dir + $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to start central dir + + $z64e = pack("V", ZIP64_END_CENTRAL_REC_HDR_SIG) # signature + . U64::pack_V64(length $z64e) + . $z64e ; + + *$self->{ZipData}{Offset}->add32(length $cd) ; + + $z64e .= pack "V", ZIP64_END_CENTRAL_LOC_HDR_SIG; # signature + $z64e .= pack 'V', 0 ; # number of disk with central dir + $z64e .= *$self->{ZipData}{Offset}->getPacked_V64() ; # offset to end zip64 central dir + $z64e .= pack 'V', 1 ; # Total number of disks + + $cd_offset = IO::Compress::Base::Common::MAX32 ; + $cd_len = IO::Compress::Base::Common::MAX32 if IO::Compress::Base::Common::isGeMax32 $cd_len ; + $entries = 0xFFFF if $entries >= 0xFFFF ; + } + + my $ecd = ''; + $ecd .= pack "V", ZIP_END_CENTRAL_HDR_SIG ; # signature + $ecd .= pack 'v', 0 ; # number of disk + $ecd .= pack 'v', 0 ; # number of disk with central dir + $ecd .= pack 'v', $entries ; # entries in central dir on this disk + $ecd .= pack 'v', $entries ; # entries in central dir + $ecd .= pack 'V', $cd_len ; # size of central dir + $ecd .= pack 'V', $cd_offset ; # offset to start central dir + $ecd .= pack 'v', length $comment ; # zipfile comment length + $ecd .= $comment; + + return $cd . $z64e . $ecd ; +} + +sub ckParams +{ + my $self = shift ; + my $got = shift; + + $got->setValue('crc32' => 1); + + if (! $got->parsed('time') ) { + # Modification time defaults to now. + $got->setValue('time' => time) ; + } + + if ($got->parsed('extime') ) { + my $timeRef = $got->getValue('extime'); + if ( defined $timeRef) { + return $self->saveErrorString(undef, "exTime not a 3-element array ref") + if ref $timeRef ne 'ARRAY' || @$timeRef != 3; + } + + $got->setValue("mtime", $timeRef->[1]); + $got->setValue("atime", $timeRef->[0]); + $got->setValue("ctime", $timeRef->[2]); + } + + # Unix2/3 Extended Attribute + for my $name (qw(exunix2 exunixn)) + { + if ($got->parsed($name) ) { + my $idRef = $got->getValue($name); + if ( defined $idRef) { + return $self->saveErrorString(undef, "$name not a 2-element array ref") + if ref $idRef ne 'ARRAY' || @$idRef != 2; + } + + $got->setValue("uid", $idRef->[0]); + $got->setValue("gid", $idRef->[1]); + $got->setValue("want_$name", $idRef); + } + } + + *$self->{ZipData}{AnyZip64} = 1 + if $got->getValue('zip64'); + *$self->{ZipData}{Zip64} = $got->getValue('zip64'); + *$self->{ZipData}{Stream} = $got->getValue('stream'); + + my $method = $got->getValue('method'); + return $self->saveErrorString(undef, "Unknown Method '$method'") + if ! defined $ZIP_CM_MIN_VERSIONS{$method}; + + return $self->saveErrorString(undef, "Bzip2 not available") + if $method == ZIP_CM_BZIP2 and + ! defined $IO::Compress::Adapter::Bzip2::VERSION; + + return $self->saveErrorString(undef, "Lzma not available") + if $method == ZIP_CM_LZMA + and ! defined $IO::Compress::Adapter::Lzma::VERSION; + + *$self->{ZipData}{Method} = $method; + + *$self->{ZipData}{ZipComment} = $got->getValue('zipcomment') ; + + for my $name (qw( extrafieldlocal extrafieldcentral )) + { + my $data = $got->getValue($name) ; + if (defined $data) { + my $bad = IO::Compress::Zlib::Extra::parseExtraField($data, 1, 0) ; + return $self->saveErrorString(undef, "Error with $name Parameter: $bad") + if $bad ; + + $got->setValue($name, $data) ; + } + } + + return undef + if defined $IO::Compress::Bzip2::VERSION + and ! IO::Compress::Bzip2::ckParams($self, $got); + + if ($got->parsed('sparse') ) { + *$self->{ZipData}{Sparse} = $got->getValue('sparse') ; + *$self->{ZipData}{Method} = ZIP_CM_STORE; + } + + if ($got->parsed('filtername')) { + my $v = $got->getValue('filtername') ; + *$self->{ZipData}{FilterName} = $v + if ref $v eq 'CODE' ; + } + + return 1 ; +} + +sub outputPayload +{ + my $self = shift ; + return 1 if *$self->{ZipData}{Sparse} ; + return $self->output(@_); +} + + +#sub newHeader +#{ +# my $self = shift ; +# +# return $self->mkHeader(*$self->{Got}); +#} + + +our %PARAMS = ( + 'stream' => [IO::Compress::Base::Common::Parse_boolean, 1], + #'store' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'method' => [IO::Compress::Base::Common::Parse_unsigned, ZIP_CM_DEFLATE], + +# # Zip header fields + 'minimal' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'zip64' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'comment' => [IO::Compress::Base::Common::Parse_any, ''], + 'zipcomment'=> [IO::Compress::Base::Common::Parse_any, ''], + 'name' => [IO::Compress::Base::Common::Parse_any, ''], + 'filtername'=> [IO::Compress::Base::Common::Parse_code, undef], + 'canonicalname'=> [IO::Compress::Base::Common::Parse_boolean, 0], +# 'utf8' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'time' => [IO::Compress::Base::Common::Parse_any, undef], + 'extime' => [IO::Compress::Base::Common::Parse_any, undef], + 'exunix2' => [IO::Compress::Base::Common::Parse_any, undef], + 'exunixn' => [IO::Compress::Base::Common::Parse_any, undef], + 'extattr' => [IO::Compress::Base::Common::Parse_any, + $Compress::Raw::Zlib::gzip_os_code == 3 + ? 0100644 << 16 + : 0], + 'os_code' => [IO::Compress::Base::Common::Parse_unsigned, $Compress::Raw::Zlib::gzip_os_code], + + 'textflag' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'extrafieldlocal' => [IO::Compress::Base::Common::Parse_any, undef], + 'extrafieldcentral'=> [IO::Compress::Base::Common::Parse_any, undef], + + # Lzma + 'preset' => [IO::Compress::Base::Common::Parse_unsigned, 6], + 'extreme' => [IO::Compress::Base::Common::Parse_boolean, 0], + + # For internal use only + 'sparse' => [IO::Compress::Base::Common::Parse_unsigned, 0], + + IO::Compress::RawDeflate::getZlibParams(), + defined $IO::Compress::Bzip2::VERSION + ? IO::Compress::Bzip2::getExtraParams() + : () + + + ); + +sub getExtraParams +{ + return %PARAMS ; +} + +sub getInverseClass +{ + return ('IO::Uncompress::Unzip', + \$IO::Uncompress::Unzip::UnzipError); +} + +sub getFileInfo +{ + my $self = shift ; + my $params = shift; + my $filename = shift ; + + if (IO::Compress::Base::Common::isaScalar($filename)) + { + $params->setValue(zip64 => 1) + if IO::Compress::Base::Common::isGeMax32 length (${ $filename }) ; + + return ; + } + + my ($mode, $uid, $gid, $size, $atime, $mtime, $ctime) ; + if ( $params->parsed('storelinks') ) + { + ($mode, $uid, $gid, $size, $atime, $mtime, $ctime) + = (lstat($filename))[2, 4,5,7, 8,9,10] ; + } + else + { + ($mode, $uid, $gid, $size, $atime, $mtime, $ctime) + = (stat($filename))[2, 4,5,7, 8,9,10] ; + } + + $params->setValue(textflag => -T $filename ) + if ! $params->parsed('textflag'); + + $params->setValue(zip64 => 1) + if IO::Compress::Base::Common::isGeMax32 $size ; + + $params->setValue('name' => $filename) + if ! $params->parsed('name') ; + + $params->setValue('time' => $mtime) + if ! $params->parsed('time') ; + + if ( ! $params->parsed('extime')) + { + $params->setValue('mtime' => $mtime) ; + $params->setValue('atime' => $atime) ; + $params->setValue('ctime' => undef) ; # No Creation time + # TODO - see if can fillout creation time on non-Unix + } + + # NOTE - Unix specific code alert + if (! $params->parsed('extattr')) + { + use Fcntl qw(:mode) ; + my $attr = $mode << 16; + $attr |= ZIP_A_RONLY if ($mode & S_IWRITE) == 0 ; + $attr |= ZIP_A_DIR if ($mode & S_IFMT ) == S_IFDIR ; + + $params->setValue('extattr' => $attr); + } + + $params->setValue('want_exunixn', [$uid, $gid]); + $params->setValue('uid' => $uid) ; + $params->setValue('gid' => $gid) ; + +} + +sub mkExtendedTime +{ + # order expected is m, a, c + + my $times = ''; + my $bit = 1 ; + my $flags = 0; + + for my $time (@_) + { + if (defined $time) + { + $flags |= $bit; + $times .= pack("V", $time); + } + + $bit <<= 1 ; + } + + return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_EXT_TIMESTAMP, + pack("C", $flags) . $times); +} + +sub mkUnix2Extra +{ + my $ids = ''; + for my $id (@_) + { + $ids .= pack("v", $id); + } + + return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_INFO_ZIP_UNIX2, + $ids); +} + +sub mkUnixNExtra +{ + my $uid = shift; + my $gid = shift; + + # Assumes UID/GID are 32-bit + my $ids ; + $ids .= pack "C", 1; # version + $ids .= pack "C", $Config{uidsize}; + $ids .= pack "V", $uid; + $ids .= pack "C", $Config{gidsize}; + $ids .= pack "V", $gid; + + return IO::Compress::Zlib::Extra::mkSubField(ZIP_EXTRA_ID_INFO_ZIP_UNIXN, + $ids); +} + + +# from Archive::Zip +sub _unixToDosTime # Archive::Zip::Member +{ + my $time_t = shift; + + # TODO - add something to cope with unix time < 1980 + my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime($time_t); + my $dt = 0; + $dt += ( $sec >> 1 ); + $dt += ( $min << 5 ); + $dt += ( $hour << 11 ); + $dt += ( $mday << 16 ); + $dt += ( ( $mon + 1 ) << 21 ); + $dt += ( ( $year - 80 ) << 25 ); + return $dt; +} + +1; + +__END__ + +package IO::Compress::RawDeflate ; + +# create RFC1951 +# +use strict ; +use warnings; +use bytes; + +use IO::Compress::Base 2.074 ; +use IO::Compress::Base::Common 2.074 qw(:Status ); +use IO::Compress::Adapter::Deflate 2.074 ; + +require Exporter ; + +our ($VERSION, @ISA, @EXPORT_OK, %DEFLATE_CONSTANTS, %EXPORT_TAGS, $RawDeflateError); + +$VERSION = '2.074'; +$RawDeflateError = ''; + +@ISA = qw(IO::Compress::Base Exporter); +@EXPORT_OK = qw( $RawDeflateError rawdeflate ) ; +push @EXPORT_OK, @IO::Compress::Adapter::Deflate::EXPORT_OK ; + +%EXPORT_TAGS = %IO::Compress::Adapter::Deflate::DEFLATE_CONSTANTS; + + +{ + my %seen; + foreach (keys %EXPORT_TAGS ) + { + push @{$EXPORT_TAGS{constants}}, + grep { !$seen{$_}++ } + @{ $EXPORT_TAGS{$_} } + } + $EXPORT_TAGS{all} = $EXPORT_TAGS{constants} ; +} + + +%DEFLATE_CONSTANTS = %EXPORT_TAGS; + +#push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; + +Exporter::export_ok_tags('all'); + + + +sub new +{ + my $class = shift ; + + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$RawDeflateError); + + return $obj->_create(undef, @_); +} + +sub rawdeflate +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$RawDeflateError); + return $obj->_def(@_); +} + +sub ckParams +{ + my $self = shift ; + my $got = shift; + + return 1 ; +} + +sub mkComp +{ + my $self = shift ; + my $got = shift ; + + my ($obj, $errstr, $errno) = IO::Compress::Adapter::Deflate::mkCompObject( + $got->getValue('crc32'), + $got->getValue('adler32'), + $got->getValue('level'), + $got->getValue('strategy') + ); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + return $obj; +} + + +sub mkHeader +{ + my $self = shift ; + return ''; +} + +sub mkTrailer +{ + my $self = shift ; + return ''; +} + +sub mkFinalTrailer +{ + return ''; +} + + +#sub newHeader +#{ +# my $self = shift ; +# return ''; +#} + +sub getExtraParams +{ + my $self = shift ; + return getZlibParams(); +} + +use IO::Compress::Base::Common 2.074 qw(:Parse); +use Compress::Raw::Zlib 2.074 qw(Z_DEFLATED Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY); +our %PARAMS = ( + #'method' => [IO::Compress::Base::Common::Parse_unsigned, Z_DEFLATED], + 'level' => [IO::Compress::Base::Common::Parse_signed, Z_DEFAULT_COMPRESSION], + 'strategy' => [IO::Compress::Base::Common::Parse_signed, Z_DEFAULT_STRATEGY], + + 'crc32' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'adler32' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'merge' => [IO::Compress::Base::Common::Parse_boolean, 0], + ); + +sub getZlibParams +{ + return %PARAMS; +} + +sub getInverseClass +{ + return ('IO::Uncompress::RawInflate', + \$IO::Uncompress::RawInflate::RawInflateError); +} + +sub getFileInfo +{ + my $self = shift ; + my $params = shift; + my $file = shift ; + +} + +use Fcntl qw(SEEK_SET); + +sub createMerge +{ + my $self = shift ; + my $outValue = shift ; + my $outType = shift ; + + my ($invClass, $error_ref) = $self->getInverseClass(); + eval "require $invClass" + or die "aaaahhhh" ; + + my $inf = $invClass->new( $outValue, + Transparent => 0, + #Strict => 1, + AutoClose => 0, + Scan => 1) + or return $self->saveErrorString(undef, "Cannot create InflateScan object: $$error_ref" ) ; + + my $end_offset = 0; + $inf->scan() + or return $self->saveErrorString(undef, "Error Scanning: $$error_ref", $inf->errorNo) ; + $inf->zap($end_offset) + or return $self->saveErrorString(undef, "Error Zapping: $$error_ref", $inf->errorNo) ; + + my $def = *$self->{Compress} = $inf->createDeflate(); + + *$self->{Header} = *$inf->{Info}{Header}; + *$self->{UnCompSize} = *$inf->{UnCompSize}->clone(); + *$self->{CompSize} = *$inf->{CompSize}->clone(); + # TODO -- fix this + #*$self->{CompSize} = new U64(0, *$self->{UnCompSize_32bit}); + + + if ( $outType eq 'buffer') + { substr( ${ *$self->{Buffer} }, $end_offset) = '' } + elsif ($outType eq 'handle' || $outType eq 'filename') { + *$self->{FH} = *$inf->{FH} ; + delete *$inf->{FH}; + *$self->{FH}->flush() ; + *$self->{Handle} = 1 if $outType eq 'handle'; + + #seek(*$self->{FH}, $end_offset, SEEK_SET) + *$self->{FH}->seek($end_offset, SEEK_SET) + or return $self->saveErrorString(undef, $!, $!) ; + } + + return $def ; +} + +#### zlib specific methods + +sub deflateParams +{ + my $self = shift ; + + my $level = shift ; + my $strategy = shift ; + + my $status = *$self->{Compress}->deflateParams(Level => $level, Strategy => $strategy) ; + return $self->saveErrorString(0, *$self->{Compress}{Error}, *$self->{Compress}{ErrorNo}) + if $status == STATUS_ERROR; + + return 1; +} + + + + +1; + +__END__ + +package IO::Compress::Deflate ; + +require 5.006 ; + +use strict ; +use warnings; +use bytes; + +require Exporter ; + +use IO::Compress::RawDeflate 2.074 (); +use IO::Compress::Adapter::Deflate 2.074 ; + +use IO::Compress::Zlib::Constants 2.074 ; +use IO::Compress::Base::Common 2.074 qw(); + + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $DeflateError); + +$VERSION = '2.074'; +$DeflateError = ''; + +@ISA = qw(IO::Compress::RawDeflate Exporter); +@EXPORT_OK = qw( $DeflateError deflate ) ; +%EXPORT_TAGS = %IO::Compress::RawDeflate::DEFLATE_CONSTANTS ; + +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + + +sub new +{ + my $class = shift ; + + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$DeflateError); + return $obj->_create(undef, @_); +} + +sub deflate +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$DeflateError); + return $obj->_def(@_); +} + + +sub bitmask($$$$) +{ + my $into = shift ; + my $value = shift ; + my $offset = shift ; + my $mask = shift ; + + return $into | (($value & $mask) << $offset ) ; +} + +sub mkDeflateHdr($$$;$) +{ + my $method = shift ; + my $cinfo = shift; + my $level = shift; + my $fdict_adler = shift ; + + my $cmf = 0; + my $flg = 0; + my $fdict = 0; + $fdict = 1 if defined $fdict_adler; + + $cmf = bitmask($cmf, $method, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS); + $cmf = bitmask($cmf, $cinfo, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS); + + $flg = bitmask($flg, $fdict, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS); + $flg = bitmask($flg, $level, ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS); + + my $fcheck = 31 - ($cmf * 256 + $flg) % 31 ; + $flg = bitmask($flg, $fcheck, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS); + + my $hdr = pack("CC", $cmf, $flg) ; + $hdr .= pack("N", $fdict_adler) if $fdict ; + + return $hdr; +} + +sub mkHeader +{ + my $self = shift ; + my $param = shift ; + + my $level = $param->getValue('level'); + my $strategy = $param->getValue('strategy'); + + my $lflag ; + $level = 6 + if $level == Z_DEFAULT_COMPRESSION ; + + if (ZLIB_VERNUM >= 0x1210) + { + if ($strategy >= Z_HUFFMAN_ONLY || $level < 2) + { $lflag = ZLIB_FLG_LEVEL_FASTEST } + elsif ($level < 6) + { $lflag = ZLIB_FLG_LEVEL_FAST } + elsif ($level == 6) + { $lflag = ZLIB_FLG_LEVEL_DEFAULT } + else + { $lflag = ZLIB_FLG_LEVEL_SLOWEST } + } + else + { + $lflag = ($level - 1) >> 1 ; + $lflag = 3 if $lflag > 3 ; + } + + #my $wbits = (MAX_WBITS - 8) << 4 ; + my $wbits = 7; + mkDeflateHdr(ZLIB_CMF_CM_DEFLATED, $wbits, $lflag); +} + +sub ckParams +{ + my $self = shift ; + my $got = shift; + + $got->setValue('adler32' => 1); + return 1 ; +} + + +sub mkTrailer +{ + my $self = shift ; + return pack("N", *$self->{Compress}->adler32()) ; +} + +sub mkFinalTrailer +{ + return ''; +} + +#sub newHeader +#{ +# my $self = shift ; +# return *$self->{Header}; +#} + +sub getExtraParams +{ + my $self = shift ; + return $self->getZlibParams(), +} + +sub getInverseClass +{ + return ('IO::Uncompress::Inflate', + \$IO::Uncompress::Inflate::InflateError); +} + +sub getFileInfo +{ + my $self = shift ; + my $params = shift; + my $file = shift ; + +} + + + +1; + +__END__ + +package IO::Compress::Gzip::Constants; + +use strict ; +use warnings; +use bytes; + +require Exporter; + +our ($VERSION, @ISA, @EXPORT, %GZIP_OS_Names); +our ($GZIP_FNAME_INVALID_CHAR_RE, $GZIP_FCOMMENT_INVALID_CHAR_RE); + +$VERSION = '2.074'; + +@ISA = qw(Exporter); + +@EXPORT= qw( + + GZIP_ID_SIZE + GZIP_ID1 + GZIP_ID2 + + GZIP_FLG_DEFAULT + GZIP_FLG_FTEXT + GZIP_FLG_FHCRC + GZIP_FLG_FEXTRA + GZIP_FLG_FNAME + GZIP_FLG_FCOMMENT + GZIP_FLG_RESERVED + + GZIP_CM_DEFLATED + + GZIP_MIN_HEADER_SIZE + GZIP_TRAILER_SIZE + + GZIP_MTIME_DEFAULT + GZIP_XFL_DEFAULT + GZIP_FEXTRA_HEADER_SIZE + GZIP_FEXTRA_MAX_SIZE + GZIP_FEXTRA_SUBFIELD_HEADER_SIZE + GZIP_FEXTRA_SUBFIELD_ID_SIZE + GZIP_FEXTRA_SUBFIELD_LEN_SIZE + GZIP_FEXTRA_SUBFIELD_MAX_SIZE + + $GZIP_FNAME_INVALID_CHAR_RE + $GZIP_FCOMMENT_INVALID_CHAR_RE + + GZIP_FHCRC_SIZE + + GZIP_ISIZE_MAX + GZIP_ISIZE_MOD_VALUE + + + GZIP_NULL_BYTE + + GZIP_OS_DEFAULT + + %GZIP_OS_Names + + GZIP_MINIMUM_HEADER + + ); + +# Constant names derived from RFC 1952 + +use constant GZIP_ID_SIZE => 2 ; +use constant GZIP_ID1 => 0x1F; +use constant GZIP_ID2 => 0x8B; + +use constant GZIP_MIN_HEADER_SIZE => 10 ;# minimum gzip header size +use constant GZIP_TRAILER_SIZE => 8 ; + + +use constant GZIP_FLG_DEFAULT => 0x00 ; +use constant GZIP_FLG_FTEXT => 0x01 ; +use constant GZIP_FLG_FHCRC => 0x02 ; # called CONTINUATION in gzip +use constant GZIP_FLG_FEXTRA => 0x04 ; +use constant GZIP_FLG_FNAME => 0x08 ; +use constant GZIP_FLG_FCOMMENT => 0x10 ; +#use constant GZIP_FLG_ENCRYPTED => 0x20 ; # documented in gzip sources +use constant GZIP_FLG_RESERVED => (0x20 | 0x40 | 0x80) ; + +use constant GZIP_XFL_DEFAULT => 0x00 ; + +use constant GZIP_MTIME_DEFAULT => 0x00 ; + +use constant GZIP_FEXTRA_HEADER_SIZE => 2 ; +use constant GZIP_FEXTRA_MAX_SIZE => 0xFFFF ; +use constant GZIP_FEXTRA_SUBFIELD_ID_SIZE => 2 ; +use constant GZIP_FEXTRA_SUBFIELD_LEN_SIZE => 2 ; +use constant GZIP_FEXTRA_SUBFIELD_HEADER_SIZE => GZIP_FEXTRA_SUBFIELD_ID_SIZE + + GZIP_FEXTRA_SUBFIELD_LEN_SIZE; +use constant GZIP_FEXTRA_SUBFIELD_MAX_SIZE => GZIP_FEXTRA_MAX_SIZE - + GZIP_FEXTRA_SUBFIELD_HEADER_SIZE ; + + +if (ord('A') == 193) +{ + # EBCDIC + $GZIP_FNAME_INVALID_CHAR_RE = '[\x00-\x3f\xff]'; + $GZIP_FCOMMENT_INVALID_CHAR_RE = '[\x00-\x0a\x11-\x14\x16-\x3f\xff]'; + +} +else +{ + $GZIP_FNAME_INVALID_CHAR_RE = '[\x00-\x1F\x7F-\x9F]'; + $GZIP_FCOMMENT_INVALID_CHAR_RE = '[\x00-\x09\x11-\x1F\x7F-\x9F]'; +} + +use constant GZIP_FHCRC_SIZE => 2 ; # aka CONTINUATION in gzip + +use constant GZIP_CM_DEFLATED => 8 ; + +use constant GZIP_NULL_BYTE => "\x00"; +use constant GZIP_ISIZE_MAX => 0xFFFFFFFF ; +use constant GZIP_ISIZE_MOD_VALUE => GZIP_ISIZE_MAX + 1 ; + +# OS Names sourced from http://www.gzip.org/format.txt + +use constant GZIP_OS_DEFAULT=> 0xFF ; +%GZIP_OS_Names = ( + 0 => 'MS-DOS', + 1 => 'Amiga', + 2 => 'VMS', + 3 => 'Unix', + 4 => 'VM/CMS', + 5 => 'Atari TOS', + 6 => 'HPFS (OS/2, NT)', + 7 => 'Macintosh', + 8 => 'Z-System', + 9 => 'CP/M', + 10 => 'TOPS-20', + 11 => 'NTFS (NT)', + 12 => 'SMS QDOS', + 13 => 'Acorn RISCOS', + 14 => 'VFAT file system (Win95, NT)', + 15 => 'MVS', + 16 => 'BeOS', + 17 => 'Tandem/NSK', + 18 => 'THEOS', + GZIP_OS_DEFAULT() => 'Unknown', + ) ; + +use constant GZIP_MINIMUM_HEADER => pack("C4 V C C", + GZIP_ID1, GZIP_ID2, GZIP_CM_DEFLATED, GZIP_FLG_DEFAULT, + GZIP_MTIME_DEFAULT, GZIP_XFL_DEFAULT, GZIP_OS_DEFAULT) ; + + +1; +package IO::Compress::Zip::Constants; + +use strict ; +use warnings; + +require Exporter; + +our ($VERSION, @ISA, @EXPORT, %ZIP_CM_MIN_VERSIONS); + +$VERSION = '2.074'; + +@ISA = qw(Exporter); + +@EXPORT= qw( + + ZIP_CM_STORE + ZIP_CM_DEFLATE + ZIP_CM_BZIP2 + ZIP_CM_LZMA + ZIP_CM_PPMD + + ZIP_LOCAL_HDR_SIG + ZIP_DATA_HDR_SIG + ZIP_CENTRAL_HDR_SIG + ZIP_END_CENTRAL_HDR_SIG + ZIP64_END_CENTRAL_REC_HDR_SIG + ZIP64_END_CENTRAL_LOC_HDR_SIG + ZIP64_ARCHIVE_EXTRA_SIG + ZIP64_DIGITAL_SIGNATURE_SIG + + ZIP_GP_FLAG_ENCRYPTED_MASK + ZIP_GP_FLAG_STREAMING_MASK + ZIP_GP_FLAG_PATCHED_MASK + ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK + ZIP_GP_FLAG_LZMA_EOS_PRESENT + ZIP_GP_FLAG_LANGUAGE_ENCODING + + ZIP_EXTRA_ID_ZIP64 + ZIP_EXTRA_ID_EXT_TIMESTAMP + ZIP_EXTRA_ID_INFO_ZIP_UNIX2 + ZIP_EXTRA_ID_INFO_ZIP_UNIXN + ZIP_EXTRA_ID_INFO_ZIP_Upath + ZIP_EXTRA_ID_INFO_ZIP_Ucom + ZIP_EXTRA_ID_JAVA_EXE + + ZIP_OS_CODE_UNIX + ZIP_OS_CODE_DEFAULT + + ZIP_IFA_TEXT_MASK + + %ZIP_CM_MIN_VERSIONS + ZIP64_MIN_VERSION + + ZIP_A_RONLY + ZIP_A_HIDDEN + ZIP_A_SYSTEM + ZIP_A_LABEL + ZIP_A_DIR + ZIP_A_ARCHIVE + ); + +# Compression types supported +use constant ZIP_CM_STORE => 0 ; +use constant ZIP_CM_DEFLATE => 8 ; +use constant ZIP_CM_BZIP2 => 12 ; +use constant ZIP_CM_LZMA => 14 ; # Not Supported yet +use constant ZIP_CM_PPMD => 98 ; # Not Supported yet + +# General Purpose Flag +use constant ZIP_GP_FLAG_ENCRYPTED_MASK => (1 << 0) ; +use constant ZIP_GP_FLAG_STREAMING_MASK => (1 << 3) ; +use constant ZIP_GP_FLAG_PATCHED_MASK => (1 << 5) ; +use constant ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK => (1 << 6) ; +use constant ZIP_GP_FLAG_LZMA_EOS_PRESENT => (1 << 1) ; +use constant ZIP_GP_FLAG_LANGUAGE_ENCODING => (1 << 11) ; + +# Internal File Attributes +use constant ZIP_IFA_TEXT_MASK => 1; + +# Signatures for each of the headers +use constant ZIP_LOCAL_HDR_SIG => 0x04034b50; +use constant ZIP_DATA_HDR_SIG => 0x08074b50; +use constant packed_ZIP_DATA_HDR_SIG => pack "V", ZIP_DATA_HDR_SIG; +use constant ZIP_CENTRAL_HDR_SIG => 0x02014b50; +use constant ZIP_END_CENTRAL_HDR_SIG => 0x06054b50; +use constant ZIP64_END_CENTRAL_REC_HDR_SIG => 0x06064b50; +use constant ZIP64_END_CENTRAL_LOC_HDR_SIG => 0x07064b50; +use constant ZIP64_ARCHIVE_EXTRA_SIG => 0x08064b50; +use constant ZIP64_DIGITAL_SIGNATURE_SIG => 0x05054b50; + +use constant ZIP_OS_CODE_UNIX => 3; +use constant ZIP_OS_CODE_DEFAULT => 3; + +# Extra Field ID's +use constant ZIP_EXTRA_ID_ZIP64 => pack "v", 1; +use constant ZIP_EXTRA_ID_EXT_TIMESTAMP => "UT"; +use constant ZIP_EXTRA_ID_INFO_ZIP_UNIX2 => "Ux"; +use constant ZIP_EXTRA_ID_INFO_ZIP_UNIXN => "ux"; +use constant ZIP_EXTRA_ID_INFO_ZIP_Upath => "up"; +use constant ZIP_EXTRA_ID_INFO_ZIP_Ucom => "uc"; +use constant ZIP_EXTRA_ID_JAVA_EXE => pack "v", 0xCAFE; + +# DOS Attributes +use constant ZIP_A_RONLY => 0x01; +use constant ZIP_A_HIDDEN => 0x02; +use constant ZIP_A_SYSTEM => 0x04; +use constant ZIP_A_LABEL => 0x08; +use constant ZIP_A_DIR => 0x10; +use constant ZIP_A_ARCHIVE => 0x20; + +use constant ZIP64_MIN_VERSION => 45; + +%ZIP_CM_MIN_VERSIONS = ( + ZIP_CM_STORE() => 20, + ZIP_CM_DEFLATE() => 20, + ZIP_CM_BZIP2() => 46, + ZIP_CM_LZMA() => 63, + ZIP_CM_PPMD() => 63, + ); + + +1; + +__END__ + + +package IO::Compress::Zlib::Constants ; + +use strict ; +use warnings; +use bytes; + +require Exporter; + +our ($VERSION, @ISA, @EXPORT); + +$VERSION = '2.074'; + +@ISA = qw(Exporter); + +@EXPORT= qw( + + ZLIB_HEADER_SIZE + ZLIB_TRAILER_SIZE + + ZLIB_CMF_CM_OFFSET + ZLIB_CMF_CM_BITS + ZLIB_CMF_CM_DEFLATED + + ZLIB_CMF_CINFO_OFFSET + ZLIB_CMF_CINFO_BITS + ZLIB_CMF_CINFO_MAX + + ZLIB_FLG_FCHECK_OFFSET + ZLIB_FLG_FCHECK_BITS + + ZLIB_FLG_FDICT_OFFSET + ZLIB_FLG_FDICT_BITS + + ZLIB_FLG_LEVEL_OFFSET + ZLIB_FLG_LEVEL_BITS + + ZLIB_FLG_LEVEL_FASTEST + ZLIB_FLG_LEVEL_FAST + ZLIB_FLG_LEVEL_DEFAULT + ZLIB_FLG_LEVEL_SLOWEST + + ZLIB_FDICT_SIZE + + ); + +# Constant names derived from RFC1950 + +use constant ZLIB_HEADER_SIZE => 2; +use constant ZLIB_TRAILER_SIZE => 4; + +use constant ZLIB_CMF_CM_OFFSET => 0; +use constant ZLIB_CMF_CM_BITS => 0xF ; # 0b1111 +use constant ZLIB_CMF_CM_DEFLATED => 8; + +use constant ZLIB_CMF_CINFO_OFFSET => 4; +use constant ZLIB_CMF_CINFO_BITS => 0xF ; # 0b1111; +use constant ZLIB_CMF_CINFO_MAX => 7; + +use constant ZLIB_FLG_FCHECK_OFFSET => 0; +use constant ZLIB_FLG_FCHECK_BITS => 0x1F ; # 0b11111; + +use constant ZLIB_FLG_FDICT_OFFSET => 5; +use constant ZLIB_FLG_FDICT_BITS => 0x1 ; # 0b1; + +use constant ZLIB_FLG_LEVEL_OFFSET => 6; +use constant ZLIB_FLG_LEVEL_BITS => 0x3 ; # 0b11; + +use constant ZLIB_FLG_LEVEL_FASTEST => 0; +use constant ZLIB_FLG_LEVEL_FAST => 1; +use constant ZLIB_FLG_LEVEL_DEFAULT => 2; +use constant ZLIB_FLG_LEVEL_SLOWEST => 3; + +use constant ZLIB_FDICT_SIZE => 4; + + +1; +package IO::Compress::Zlib::Extra; + +require 5.006 ; + +use strict ; +use warnings; +use bytes; + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS); + +$VERSION = '2.074'; + +use IO::Compress::Gzip::Constants 2.074 ; + +sub ExtraFieldError +{ + return $_[0]; + return "Error with ExtraField Parameter: $_[0]" ; +} + +sub validateExtraFieldPair +{ + my $pair = shift ; + my $strict = shift; + my $gzipMode = shift ; + + return ExtraFieldError("Not an array ref") + unless ref $pair && ref $pair eq 'ARRAY'; + + return ExtraFieldError("SubField must have two parts") + unless @$pair == 2 ; + + return ExtraFieldError("SubField ID is a reference") + if ref $pair->[0] ; + + return ExtraFieldError("SubField Data is a reference") + if ref $pair->[1] ; + + # ID is exactly two chars + return ExtraFieldError("SubField ID not two chars long") + unless length $pair->[0] == GZIP_FEXTRA_SUBFIELD_ID_SIZE ; + + # Check that the 2nd byte of the ID isn't 0 + return ExtraFieldError("SubField ID 2nd byte is 0x00") + if $strict && $gzipMode && substr($pair->[0], 1, 1) eq "\x00" ; + + return ExtraFieldError("SubField Data too long") + if length $pair->[1] > GZIP_FEXTRA_SUBFIELD_MAX_SIZE ; + + + return undef ; +} + +sub parseRawExtra +{ + my $data = shift ; + my $extraRef = shift; + my $strict = shift; + my $gzipMode = shift ; + + #my $lax = shift ; + + #return undef + # if $lax ; + + my $XLEN = length $data ; + + return ExtraFieldError("Too Large") + if $XLEN > GZIP_FEXTRA_MAX_SIZE; + + my $offset = 0 ; + while ($offset < $XLEN) { + + return ExtraFieldError("Truncated in FEXTRA Body Section") + if $offset + GZIP_FEXTRA_SUBFIELD_HEADER_SIZE > $XLEN ; + + my $id = substr($data, $offset, GZIP_FEXTRA_SUBFIELD_ID_SIZE); + $offset += GZIP_FEXTRA_SUBFIELD_ID_SIZE; + + my $subLen = unpack("v", substr($data, $offset, + GZIP_FEXTRA_SUBFIELD_LEN_SIZE)); + $offset += GZIP_FEXTRA_SUBFIELD_LEN_SIZE ; + + return ExtraFieldError("Truncated in FEXTRA Body Section") + if $offset + $subLen > $XLEN ; + + my $bad = validateExtraFieldPair( [$id, + substr($data, $offset, $subLen)], + $strict, $gzipMode ); + return $bad if $bad ; + push @$extraRef, [$id => substr($data, $offset, $subLen)] + if defined $extraRef;; + + $offset += $subLen ; + } + + + return undef ; +} + +sub findID +{ + my $id_want = shift ; + my $data = shift; + + my $XLEN = length $data ; + + my $offset = 0 ; + while ($offset < $XLEN) { + + return undef + if $offset + GZIP_FEXTRA_SUBFIELD_HEADER_SIZE > $XLEN ; + + my $id = substr($data, $offset, GZIP_FEXTRA_SUBFIELD_ID_SIZE); + $offset += GZIP_FEXTRA_SUBFIELD_ID_SIZE; + + my $subLen = unpack("v", substr($data, $offset, + GZIP_FEXTRA_SUBFIELD_LEN_SIZE)); + $offset += GZIP_FEXTRA_SUBFIELD_LEN_SIZE ; + + return undef + if $offset + $subLen > $XLEN ; + + return substr($data, $offset, $subLen) + if $id eq $id_want ; + + $offset += $subLen ; + } + + return undef ; +} + + +sub mkSubField +{ + my $id = shift ; + my $data = shift ; + + return $id . pack("v", length $data) . $data ; +} + +sub parseExtraField +{ + my $dataRef = $_[0]; + my $strict = $_[1]; + my $gzipMode = $_[2]; + #my $lax = @_ == 2 ? $_[1] : 1; + + + # ExtraField can be any of + # + # -ExtraField => $data + # + # -ExtraField => [$id1, $data1, + # $id2, $data2] + # ... + # ] + # + # -ExtraField => [ [$id1 => $data1], + # [$id2 => $data2], + # ... + # ] + # + # -ExtraField => { $id1 => $data1, + # $id2 => $data2, + # ... + # } + + if ( ! ref $dataRef ) { + + return undef + if ! $strict; + + return parseRawExtra($dataRef, undef, 1, $gzipMode); + } + + my $data = $dataRef; + my $out = '' ; + + if (ref $data eq 'ARRAY') { + if (ref $data->[0]) { + + foreach my $pair (@$data) { + return ExtraFieldError("Not list of lists") + unless ref $pair eq 'ARRAY' ; + + my $bad = validateExtraFieldPair($pair, $strict, $gzipMode) ; + return $bad if $bad ; + + $out .= mkSubField(@$pair); + } + } + else { + return ExtraFieldError("Not even number of elements") + unless @$data % 2 == 0; + + for (my $ix = 0; $ix <= @$data -1 ; $ix += 2) { + my $bad = validateExtraFieldPair([$data->[$ix], + $data->[$ix+1]], + $strict, $gzipMode) ; + return $bad if $bad ; + + $out .= mkSubField($data->[$ix], $data->[$ix+1]); + } + } + } + elsif (ref $data eq 'HASH') { + while (my ($id, $info) = each %$data) { + my $bad = validateExtraFieldPair([$id, $info], $strict, $gzipMode); + return $bad if $bad ; + + $out .= mkSubField($id, $info); + } + } + else { + return ExtraFieldError("Not a scalar, array ref or hash ref") ; + } + + return ExtraFieldError("Too Large") + if length $out > GZIP_FEXTRA_MAX_SIZE; + + $_[0] = $out ; + + return undef; +} + +1; + +__END__ +package IO::Compress::Adapter::Bzip2 ; + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status); + +use Compress::Raw::Bzip2 2.074 ; + +our ($VERSION); +$VERSION = '2.074'; + +sub mkCompObject +{ + my $BlockSize100K = shift ; + my $WorkFactor = shift ; + my $Verbosity = shift ; + + $BlockSize100K = 1 if ! defined $BlockSize100K ; + $WorkFactor = 0 if ! defined $WorkFactor ; + $Verbosity = 0 if ! defined $Verbosity ; + + my ($def, $status) = new Compress::Raw::Bzip2(1, $BlockSize100K, + $WorkFactor, $Verbosity); + + return (undef, "Could not create Deflate object: $status", $status) + if $status != BZ_OK ; + + return bless {'Def' => $def, + 'Error' => '', + 'ErrorNo' => 0, + } ; +} + +sub compr +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $status = $def->bzdeflate($_[0], $_[1]) ; + $self->{ErrorNo} = $status; + + if ($status != BZ_RUN_OK) + { + $self->{Error} = "Deflate Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; +} + +sub flush +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $status = $def->bzflush($_[0]); + $self->{ErrorNo} = $status; + + if ($status != BZ_RUN_OK) + { + $self->{Error} = "Deflate Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; + +} + +sub close +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $status = $def->bzclose($_[0]); + $self->{ErrorNo} = $status; + + if ($status != BZ_STREAM_END) + { + $self->{Error} = "Deflate Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; + +} + + +sub reset +{ + my $self = shift ; + + my $outer = $self->{Outer}; + + my ($def, $status) = new Compress::Raw::Bzip2(); + $self->{ErrorNo} = ($status == BZ_OK) ? 0 : $status ; + + if ($status != BZ_OK) + { + $self->{Error} = "Cannot create Deflate object: $status"; + return STATUS_ERROR; + } + + $self->{Def} = $def; + + return STATUS_OK; +} + +sub compressedBytes +{ + my $self = shift ; + $self->{Def}->compressedBytes(); +} + +sub uncompressedBytes +{ + my $self = shift ; + $self->{Def}->uncompressedBytes(); +} + +#sub total_out +#{ +# my $self = shift ; +# 0; +#} +# + +#sub total_in +#{ +# my $self = shift ; +# $self->{Def}->total_in(); +#} +# +#sub crc32 +#{ +# my $self = shift ; +# $self->{Def}->crc32(); +#} +# +#sub adler32 +#{ +# my $self = shift ; +# $self->{Def}->adler32(); +#} + + +1; + +__END__ + +package IO::Compress::Adapter::Identity ; + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status); +our ($VERSION); + +$VERSION = '2.074'; + +sub mkCompObject +{ + my $level = shift ; + my $strategy = shift ; + + return bless { + 'CompSize' => 0, + 'UnCompSize' => 0, + 'Error' => '', + 'ErrorNo' => 0, + } ; +} + +sub compr +{ + my $self = shift ; + + if (defined ${ $_[0] } && length ${ $_[0] }) { + $self->{CompSize} += length ${ $_[0] } ; + $self->{UnCompSize} = $self->{CompSize} ; + + if ( ref $_[1] ) + { ${ $_[1] } .= ${ $_[0] } } + else + { $_[1] .= ${ $_[0] } } + } + + return STATUS_OK ; +} + +sub flush +{ + my $self = shift ; + + return STATUS_OK; +} + +sub close +{ + my $self = shift ; + + return STATUS_OK; +} + +sub reset +{ + my $self = shift ; + + $self->{CompSize} = 0; + $self->{UnCompSize} = 0; + + return STATUS_OK; +} + +sub deflateParams +{ + my $self = shift ; + + return STATUS_OK; +} + +#sub total_out +#{ +# my $self = shift ; +# return $self->{UnCompSize} ; +#} +# +#sub total_in +#{ +# my $self = shift ; +# return $self->{UnCompSize} ; +#} + +sub compressedBytes +{ + my $self = shift ; + return $self->{UnCompSize} ; +} + +sub uncompressedBytes +{ + my $self = shift ; + return $self->{UnCompSize} ; +} + +1; + + +__END__ + +package IO::Compress::Adapter::Deflate ; + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status); +use Compress::Raw::Zlib 2.074 qw( !crc32 !adler32 ) ; + +require Exporter; +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, @EXPORT, %DEFLATE_CONSTANTS); + +$VERSION = '2.074'; +@ISA = qw(Exporter); +@EXPORT_OK = @Compress::Raw::Zlib::DEFLATE_CONSTANTS; +%EXPORT_TAGS = %Compress::Raw::Zlib::DEFLATE_CONSTANTS; +@EXPORT = @EXPORT_OK; +%DEFLATE_CONSTANTS = %EXPORT_TAGS ; + +sub mkCompObject +{ + my $crc32 = shift ; + my $adler32 = shift ; + my $level = shift ; + my $strategy = shift ; + + my ($def, $status) = new Compress::Raw::Zlib::Deflate + -AppendOutput => 1, + -CRC32 => $crc32, + -ADLER32 => $adler32, + -Level => $level, + -Strategy => $strategy, + -WindowBits => - MAX_WBITS; + + return (undef, "Cannot create Deflate object: $status", $status) + if $status != Z_OK; + + return bless {'Def' => $def, + 'Error' => '', + } ; +} + +sub compr +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $status = $def->deflate($_[0], $_[1]) ; + $self->{ErrorNo} = $status; + + if ($status != Z_OK) + { + $self->{Error} = "Deflate Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; +} + +sub flush +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $opt = $_[1] || Z_FINISH; + my $status = $def->flush($_[0], $opt); + $self->{ErrorNo} = $status; + + if ($status != Z_OK) + { + $self->{Error} = "Deflate Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; +} + +sub close +{ + my $self = shift ; + + my $def = $self->{Def}; + + $def->flush($_[0], Z_FINISH) + if defined $def ; +} + +sub reset +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $status = $def->deflateReset() ; + $self->{ErrorNo} = $status; + if ($status != Z_OK) + { + $self->{Error} = "Deflate Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; +} + +sub deflateParams +{ + my $self = shift ; + + my $def = $self->{Def}; + + my $status = $def->deflateParams(@_); + $self->{ErrorNo} = $status; + if ($status != Z_OK) + { + $self->{Error} = "deflateParams Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK; +} + + + +#sub total_out +#{ +# my $self = shift ; +# $self->{Def}->total_out(); +#} +# +#sub total_in +#{ +# my $self = shift ; +# $self->{Def}->total_in(); +#} + +sub compressedBytes +{ + my $self = shift ; + + $self->{Def}->compressedBytes(); +} + +sub uncompressedBytes +{ + my $self = shift ; + $self->{Def}->uncompressedBytes(); +} + + + + +sub crc32 +{ + my $self = shift ; + $self->{Def}->crc32(); +} + +sub adler32 +{ + my $self = shift ; + $self->{Def}->adler32(); +} + + +1; + +__END__ + +package IO::Compress::Base::Common; + +use strict ; +use warnings; +use bytes; + +use Carp; +use Scalar::Util qw(blessed readonly); +use File::GlobMapper; + +require Exporter; +our ($VERSION, @ISA, @EXPORT, %EXPORT_TAGS, $HAS_ENCODE); +@ISA = qw(Exporter); +$VERSION = '2.074'; + +@EXPORT = qw( isaFilehandle isaFilename isaScalar + whatIsInput whatIsOutput + isaFileGlobString cleanFileGlobString oneTarget + setBinModeInput setBinModeOutput + ckInOutParams + createSelfTiedObject + + isGeMax32 + + MAX32 + + WANT_CODE + WANT_EXT + WANT_UNDEF + WANT_HASH + + STATUS_OK + STATUS_ENDSTREAM + STATUS_EOF + STATUS_ERROR + ); + +%EXPORT_TAGS = ( Status => [qw( STATUS_OK + STATUS_ENDSTREAM + STATUS_EOF + STATUS_ERROR + )]); + + +use constant STATUS_OK => 0; +use constant STATUS_ENDSTREAM => 1; +use constant STATUS_EOF => 2; +use constant STATUS_ERROR => -1; +use constant MAX16 => 0xFFFF ; +use constant MAX32 => 0xFFFFFFFF ; +use constant MAX32cmp => 0xFFFFFFFF + 1 - 1; # for 5.6.x on 32-bit need to force an non-IV value + + +sub isGeMax32 +{ + return $_[0] >= MAX32cmp ; +} + +sub hasEncode() +{ + if (! defined $HAS_ENCODE) { + eval + { + require Encode; + Encode->import(); + }; + + $HAS_ENCODE = $@ ? 0 : 1 ; + } + + return $HAS_ENCODE; +} + +sub getEncoding($$$) +{ + my $obj = shift; + my $class = shift ; + my $want_encoding = shift ; + + $obj->croakError("$class: Encode module needed to use -Encode") + if ! hasEncode(); + + my $encoding = Encode::find_encoding($want_encoding); + + $obj->croakError("$class: Encoding '$want_encoding' is not available") + if ! $encoding; + + return $encoding; +} + +our ($needBinmode); +$needBinmode = ($^O eq 'MSWin32' || + ($] >= 5.006 && eval ' ${^UNICODE} || ${^UTF8LOCALE} ')) + ? 1 : 1 ; + +sub setBinModeInput($) +{ + my $handle = shift ; + + binmode $handle + if $needBinmode; +} + +sub setBinModeOutput($) +{ + my $handle = shift ; + + binmode $handle + if $needBinmode; +} + +sub isaFilehandle($) +{ + use utf8; # Pragma needed to keep Perl 5.6.0 happy + return (defined $_[0] and + (UNIVERSAL::isa($_[0],'GLOB') or + UNIVERSAL::isa($_[0],'IO::Handle') or + UNIVERSAL::isa(\$_[0],'GLOB')) + ) +} + +sub isaScalar +{ + return ( defined($_[0]) and ref($_[0]) eq 'SCALAR' and defined ${ $_[0] } ) ; +} + +sub isaFilename($) +{ + return (defined $_[0] and + ! ref $_[0] and + UNIVERSAL::isa(\$_[0], 'SCALAR')); +} + +sub isaFileGlobString +{ + return defined $_[0] && $_[0] =~ /^<.*>$/; +} + +sub cleanFileGlobString +{ + my $string = shift ; + + $string =~ s/^\s*<\s*(.*)\s*>\s*$/$1/; + + return $string; +} + +use constant WANT_CODE => 1 ; +use constant WANT_EXT => 2 ; +use constant WANT_UNDEF => 4 ; +#use constant WANT_HASH => 8 ; +use constant WANT_HASH => 0 ; + +sub whatIsInput($;$) +{ + my $got = whatIs(@_); + + if (defined $got && $got eq 'filename' && defined $_[0] && $_[0] eq '-') + { + #use IO::File; + $got = 'handle'; + $_[0] = *STDIN; + #$_[0] = new IO::File("<-"); + } + + return $got; +} + +sub whatIsOutput($;$) +{ + my $got = whatIs(@_); + + if (defined $got && $got eq 'filename' && defined $_[0] && $_[0] eq '-') + { + $got = 'handle'; + $_[0] = *STDOUT; + #$_[0] = new IO::File(">-"); + } + + return $got; +} + +sub whatIs ($;$) +{ + return 'handle' if isaFilehandle($_[0]); + + my $wantCode = defined $_[1] && $_[1] & WANT_CODE ; + my $extended = defined $_[1] && $_[1] & WANT_EXT ; + my $undef = defined $_[1] && $_[1] & WANT_UNDEF ; + my $hash = defined $_[1] && $_[1] & WANT_HASH ; + + return 'undef' if ! defined $_[0] && $undef ; + + if (ref $_[0]) { + return '' if blessed($_[0]); # is an object + #return '' if UNIVERSAL::isa($_[0], 'UNIVERSAL'); # is an object + return 'buffer' if UNIVERSAL::isa($_[0], 'SCALAR'); + return 'array' if UNIVERSAL::isa($_[0], 'ARRAY') && $extended ; + return 'hash' if UNIVERSAL::isa($_[0], 'HASH') && $hash ; + return 'code' if UNIVERSAL::isa($_[0], 'CODE') && $wantCode ; + return ''; + } + + return 'fileglob' if $extended && isaFileGlobString($_[0]); + return 'filename'; +} + +sub oneTarget +{ + return $_[0] =~ /^(code|handle|buffer|filename)$/; +} + +sub IO::Compress::Base::Validator::new +{ + my $class = shift ; + + my $Class = shift ; + my $error_ref = shift ; + my $reportClass = shift ; + + my %data = (Class => $Class, + Error => $error_ref, + reportClass => $reportClass, + ) ; + + my $obj = bless \%data, $class ; + + local $Carp::CarpLevel = 1; + + my $inType = $data{inType} = whatIsInput($_[0], WANT_EXT|WANT_HASH); + my $outType = $data{outType} = whatIsOutput($_[1], WANT_EXT|WANT_HASH); + + my $oneInput = $data{oneInput} = oneTarget($inType); + my $oneOutput = $data{oneOutput} = oneTarget($outType); + + if (! $inType) + { + $obj->croakError("$reportClass: illegal input parameter") ; + #return undef ; + } + +# if ($inType eq 'hash') +# { +# $obj->{Hash} = 1 ; +# $obj->{oneInput} = 1 ; +# return $obj->validateHash($_[0]); +# } + + if (! $outType) + { + $obj->croakError("$reportClass: illegal output parameter") ; + #return undef ; + } + + + if ($inType ne 'fileglob' && $outType eq 'fileglob') + { + $obj->croakError("Need input fileglob for outout fileglob"); + } + +# if ($inType ne 'fileglob' && $outType eq 'hash' && $inType ne 'filename' ) +# { +# $obj->croakError("input must ne filename or fileglob when output is a hash"); +# } + + if ($inType eq 'fileglob' && $outType eq 'fileglob') + { + $data{GlobMap} = 1 ; + $data{inType} = $data{outType} = 'filename'; + my $mapper = new File::GlobMapper($_[0], $_[1]); + if ( ! $mapper ) + { + return $obj->saveErrorString($File::GlobMapper::Error) ; + } + $data{Pairs} = $mapper->getFileMap(); + + return $obj; + } + + $obj->croakError("$reportClass: input and output $inType are identical") + if $inType eq $outType && $_[0] eq $_[1] && $_[0] ne '-' ; + + if ($inType eq 'fileglob') # && $outType ne 'fileglob' + { + my $glob = cleanFileGlobString($_[0]); + my @inputs = glob($glob); + + if (@inputs == 0) + { + # TODO -- legal or die? + die "globmap matched zero file -- legal or die???" ; + } + elsif (@inputs == 1) + { + $obj->validateInputFilenames($inputs[0]) + or return undef; + $_[0] = $inputs[0] ; + $data{inType} = 'filename' ; + $data{oneInput} = 1; + } + else + { + $obj->validateInputFilenames(@inputs) + or return undef; + $_[0] = [ @inputs ] ; + $data{inType} = 'filenames' ; + } + } + elsif ($inType eq 'filename') + { + $obj->validateInputFilenames($_[0]) + or return undef; + } + elsif ($inType eq 'array') + { + $data{inType} = 'filenames' ; + $obj->validateInputArray($_[0]) + or return undef ; + } + + return $obj->saveErrorString("$reportClass: output buffer is read-only") + if $outType eq 'buffer' && readonly(${ $_[1] }); + + if ($outType eq 'filename' ) + { + $obj->croakError("$reportClass: output filename is undef or null string") + if ! defined $_[1] || $_[1] eq '' ; + + if (-e $_[1]) + { + if (-d _ ) + { + return $obj->saveErrorString("output file '$_[1]' is a directory"); + } + } + } + + return $obj ; +} + +sub IO::Compress::Base::Validator::saveErrorString +{ + my $self = shift ; + ${ $self->{Error} } = shift ; + return undef; + +} + +sub IO::Compress::Base::Validator::croakError +{ + my $self = shift ; + $self->saveErrorString($_[0]); + croak $_[0]; +} + + + +sub IO::Compress::Base::Validator::validateInputFilenames +{ + my $self = shift ; + + foreach my $filename (@_) + { + $self->croakError("$self->{reportClass}: input filename is undef or null string") + if ! defined $filename || $filename eq '' ; + + next if $filename eq '-'; + + if (! -e $filename ) + { + return $self->saveErrorString("input file '$filename' does not exist"); + } + + if (-d _ ) + { + return $self->saveErrorString("input file '$filename' is a directory"); + } + +# if (! -r _ ) +# { +# return $self->saveErrorString("cannot open file '$filename': $!"); +# } + } + + return 1 ; +} + +sub IO::Compress::Base::Validator::validateInputArray +{ + my $self = shift ; + + if ( @{ $_[0] } == 0 ) + { + return $self->saveErrorString("empty array reference") ; + } + + foreach my $element ( @{ $_[0] } ) + { + my $inType = whatIsInput($element); + + if (! $inType) + { + $self->croakError("unknown input parameter") ; + } + elsif($inType eq 'filename') + { + $self->validateInputFilenames($element) + or return undef ; + } + else + { + $self->croakError("not a filename") ; + } + } + + return 1 ; +} + +#sub IO::Compress::Base::Validator::validateHash +#{ +# my $self = shift ; +# my $href = shift ; +# +# while (my($k, $v) = each %$href) +# { +# my $ktype = whatIsInput($k); +# my $vtype = whatIsOutput($v, WANT_EXT|WANT_UNDEF) ; +# +# if ($ktype ne 'filename') +# { +# return $self->saveErrorString("hash key not filename") ; +# } +# +# my %valid = map { $_ => 1 } qw(filename buffer array undef handle) ; +# if (! $valid{$vtype}) +# { +# return $self->saveErrorString("hash value not ok") ; +# } +# } +# +# return $self ; +#} + +sub createSelfTiedObject +{ + my $class = shift || (caller)[0] ; + my $error_ref = shift ; + + my $obj = bless Symbol::gensym(), ref($class) || $class; + tie *$obj, $obj if $] >= 5.005; + *$obj->{Closed} = 1 ; + $$error_ref = ''; + *$obj->{Error} = $error_ref ; + my $errno = 0 ; + *$obj->{ErrorNo} = \$errno ; + + return $obj; +} + + + +#package Parse::Parameters ; +# +# +#require Exporter; +#our ($VERSION, @ISA, @EXPORT); +#$VERSION = '2.000_08'; +#@ISA = qw(Exporter); + +$EXPORT_TAGS{Parse} = [qw( ParseParameters + Parse_any Parse_unsigned Parse_signed + Parse_boolean Parse_string + Parse_code + Parse_writable_scalar + ) + ]; + +push @EXPORT, @{ $EXPORT_TAGS{Parse} } ; + +use constant Parse_any => 0x01; +use constant Parse_unsigned => 0x02; +use constant Parse_signed => 0x04; +use constant Parse_boolean => 0x08; +use constant Parse_string => 0x10; +use constant Parse_code => 0x20; + +#use constant Parse_store_ref => 0x100 ; +#use constant Parse_multiple => 0x100 ; +use constant Parse_writable => 0x200 ; +use constant Parse_writable_scalar => 0x400 | Parse_writable ; + +use constant OFF_PARSED => 0 ; +use constant OFF_TYPE => 1 ; +use constant OFF_DEFAULT => 2 ; +use constant OFF_FIXED => 3 ; +#use constant OFF_FIRST_ONLY => 4 ; +#use constant OFF_STICKY => 5 ; + +use constant IxError => 0; +use constant IxGot => 1 ; + +sub ParseParameters +{ + my $level = shift || 0 ; + + my $sub = (caller($level + 1))[3] ; + local $Carp::CarpLevel = 1 ; + + return $_[1] + if @_ == 2 && defined $_[1] && UNIVERSAL::isa($_[1], "IO::Compress::Base::Parameters"); + + my $p = new IO::Compress::Base::Parameters() ; + $p->parse(@_) + or croak "$sub: $p->[IxError]" ; + + return $p; +} + + +use strict; + +use warnings; +use Carp; + + +sub Init +{ + my $default = shift ; + my %got ; + + my $obj = IO::Compress::Base::Parameters::new(); + while (my ($key, $v) = each %$default) + { + croak "need 2 params [@$v]" + if @$v != 2 ; + + my ($type, $value) = @$v ; +# my ($first_only, $sticky, $type, $value) = @$v ; + my $sticky = 0; + my $x ; + $obj->_checkType($key, \$value, $type, 0, \$x) + or return undef ; + + $key = lc $key; + +# if (! $sticky) { +# $x = [] +# if $type & Parse_multiple; + +# $got{$key} = [0, $type, $value, $x, $first_only, $sticky] ; + $got{$key} = [0, $type, $value, $x] ; +# } +# +# $got{$key}[OFF_PARSED] = 0 ; + } + + return bless \%got, "IO::Compress::Base::Parameters::Defaults" ; +} + +sub IO::Compress::Base::Parameters::new +{ + #my $class = shift ; + + my $obj; + $obj->[IxError] = ''; + $obj->[IxGot] = {} ; + + return bless $obj, 'IO::Compress::Base::Parameters' ; +} + +sub IO::Compress::Base::Parameters::setError +{ + my $self = shift ; + my $error = shift ; + my $retval = @_ ? shift : undef ; + + + $self->[IxError] = $error ; + return $retval; +} + +sub IO::Compress::Base::Parameters::getError +{ + my $self = shift ; + return $self->[IxError] ; +} + +sub IO::Compress::Base::Parameters::parse +{ + my $self = shift ; + my $default = shift ; + + my $got = $self->[IxGot] ; + my $firstTime = keys %{ $got } == 0 ; + + my (@Bad) ; + my @entered = () ; + + # Allow the options to be passed as a hash reference or + # as the complete hash. + if (@_ == 0) { + @entered = () ; + } + elsif (@_ == 1) { + my $href = $_[0] ; + + return $self->setError("Expected even number of parameters, got 1") + if ! defined $href or ! ref $href or ref $href ne "HASH" ; + + foreach my $key (keys %$href) { + push @entered, $key ; + push @entered, \$href->{$key} ; + } + } + else { + + my $count = @_; + return $self->setError("Expected even number of parameters, got $count") + if $count % 2 != 0 ; + + for my $i (0.. $count / 2 - 1) { + push @entered, $_[2 * $i] ; + push @entered, \$_[2 * $i + 1] ; + } + } + + foreach my $key (keys %$default) + { + + my ($type, $value) = @{ $default->{$key} } ; + + if ($firstTime) { + $got->{$key} = [0, $type, $value, $value] ; + } + else + { + $got->{$key}[OFF_PARSED] = 0 ; + } + } + + + my %parsed = (); + + + for my $i (0.. @entered / 2 - 1) { + my $key = $entered[2* $i] ; + my $value = $entered[2* $i+1] ; + + #print "Key [$key] Value [$value]" ; + #print defined $$value ? "[$$value]\n" : "[undef]\n"; + + $key =~ s/^-// ; + my $canonkey = lc $key; + + if ($got->{$canonkey}) + { + my $type = $got->{$canonkey}[OFF_TYPE] ; + my $parsed = $parsed{$canonkey}; + ++ $parsed{$canonkey}; + + return $self->setError("Muliple instances of '$key' found") + if $parsed ; + + my $s ; + $self->_checkType($key, $value, $type, 1, \$s) + or return undef ; + + $value = $$value ; + $got->{$canonkey} = [1, $type, $value, $s] ; + + } + else + { push (@Bad, $key) } + } + + if (@Bad) { + my ($bad) = join(", ", @Bad) ; + return $self->setError("unknown key value(s) $bad") ; + } + + return 1; +} + +sub IO::Compress::Base::Parameters::_checkType +{ + my $self = shift ; + + my $key = shift ; + my $value = shift ; + my $type = shift ; + my $validate = shift ; + my $output = shift; + + #local $Carp::CarpLevel = $level ; + #print "PARSE $type $key $value $validate $sub\n" ; + + if ($type & Parse_writable_scalar) + { + return $self->setError("Parameter '$key' not writable") + if readonly $$value ; + + if (ref $$value) + { + return $self->setError("Parameter '$key' not a scalar reference") + if ref $$value ne 'SCALAR' ; + + $$output = $$value ; + } + else + { + return $self->setError("Parameter '$key' not a scalar") + if ref $value ne 'SCALAR' ; + + $$output = $value ; + } + + return 1; + } + + + $value = $$value ; + + if ($type & Parse_any) + { + $$output = $value ; + return 1; + } + elsif ($type & Parse_unsigned) + { + + return $self->setError("Parameter '$key' must be an unsigned int, got 'undef'") + if ! defined $value ; + return $self->setError("Parameter '$key' must be an unsigned int, got '$value'") + if $value !~ /^\d+$/; + + $$output = defined $value ? $value : 0 ; + return 1; + } + elsif ($type & Parse_signed) + { + return $self->setError("Parameter '$key' must be a signed int, got 'undef'") + if ! defined $value ; + return $self->setError("Parameter '$key' must be a signed int, got '$value'") + if $value !~ /^-?\d+$/; + + $$output = defined $value ? $value : 0 ; + return 1 ; + } + elsif ($type & Parse_boolean) + { + return $self->setError("Parameter '$key' must be an int, got '$value'") + if defined $value && $value !~ /^\d*$/; + + $$output = defined $value && $value != 0 ? 1 : 0 ; + return 1; + } + + elsif ($type & Parse_string) + { + $$output = defined $value ? $value : "" ; + return 1; + } + elsif ($type & Parse_code) + { + return $self->setError("Parameter '$key' must be a code reference, got '$value'") + if (! defined $value || ref $value ne 'CODE') ; + + $$output = defined $value ? $value : "" ; + return 1; + } + + $$output = $value ; + return 1; +} + +sub IO::Compress::Base::Parameters::parsed +{ + return $_[0]->[IxGot]{$_[1]}[OFF_PARSED] ; +} + + +sub IO::Compress::Base::Parameters::getValue +{ + return $_[0]->[IxGot]{$_[1]}[OFF_FIXED] ; +} +sub IO::Compress::Base::Parameters::setValue +{ + $_[0]->[IxGot]{$_[1]}[OFF_PARSED] = 1; + $_[0]->[IxGot]{$_[1]}[OFF_DEFAULT] = $_[2] ; + $_[0]->[IxGot]{$_[1]}[OFF_FIXED] = $_[2] ; +} + +sub IO::Compress::Base::Parameters::valueRef +{ + return $_[0]->[IxGot]{$_[1]}[OFF_FIXED] ; +} + +sub IO::Compress::Base::Parameters::valueOrDefault +{ + my $self = shift ; + my $name = shift ; + my $default = shift ; + + my $value = $self->[IxGot]{$name}[OFF_DEFAULT] ; + + return $value if defined $value ; + return $default ; +} + +sub IO::Compress::Base::Parameters::wantValue +{ + return defined $_[0]->[IxGot]{$_[1]}[OFF_DEFAULT] ; +} + +sub IO::Compress::Base::Parameters::clone +{ + my $self = shift ; + my $obj = [] ; + my %got ; + + my $hash = $self->[IxGot] ; + for my $k (keys %{ $hash }) + { + $got{$k} = [ @{ $hash->{$k} } ]; + } + + $obj->[IxError] = $self->[IxError]; + $obj->[IxGot] = \%got ; + + return bless $obj, 'IO::Compress::Base::Parameters' ; +} + +package U64; + +use constant MAX32 => 0xFFFFFFFF ; +use constant HI_1 => MAX32 + 1 ; +use constant LOW => 0 ; +use constant HIGH => 1; + +sub new +{ + return bless [ 0, 0 ], $_[0] + if @_ == 1 ; + + return bless [ $_[1], 0 ], $_[0] + if @_ == 2 ; + + return bless [ $_[2], $_[1] ], $_[0] + if @_ == 3 ; +} + +sub newUnpack_V64 +{ + my ($low, $hi) = unpack "V V", $_[0] ; + bless [ $low, $hi ], "U64"; +} + +sub newUnpack_V32 +{ + my $string = shift; + + my $low = unpack "V", $string ; + bless [ $low, 0 ], "U64"; +} + +sub reset +{ + $_[0]->[HIGH] = $_[0]->[LOW] = 0; +} + +sub clone +{ + bless [ @{$_[0]} ], ref $_[0] ; +} + +sub getHigh +{ + return $_[0]->[HIGH]; +} + +sub getLow +{ + return $_[0]->[LOW]; +} + +sub get32bit +{ + return $_[0]->[LOW]; +} + +sub get64bit +{ + # Not using << here because the result will still be + # a 32-bit value on systems where int size is 32-bits + return $_[0]->[HIGH] * HI_1 + $_[0]->[LOW]; +} + +sub add +{ +# my $self = shift; + my $value = $_[1]; + + if (ref $value eq 'U64') { + $_[0]->[HIGH] += $value->[HIGH] ; + $value = $value->[LOW]; + } + elsif ($value > MAX32) { + $_[0]->[HIGH] += int($value / HI_1) ; + $value = $value % HI_1; + } + + my $available = MAX32 - $_[0]->[LOW] ; + + if ($value > $available) { + ++ $_[0]->[HIGH] ; + $_[0]->[LOW] = $value - $available - 1; + } + else { + $_[0]->[LOW] += $value ; + } +} + +sub add32 +{ +# my $self = shift; + my $value = $_[1]; + + if ($value > MAX32) { + $_[0]->[HIGH] += int($value / HI_1) ; + $value = $value % HI_1; + } + + my $available = MAX32 - $_[0]->[LOW] ; + + if ($value > $available) { + ++ $_[0]->[HIGH] ; + $_[0]->[LOW] = $value - $available - 1; + } + else { + $_[0]->[LOW] += $value ; + } +} + +sub subtract +{ + my $self = shift; + my $value = shift; + + if (ref $value eq 'U64') { + + if ($value->[HIGH]) { + die "bad" + if $self->[HIGH] == 0 || + $value->[HIGH] > $self->[HIGH] ; + + $self->[HIGH] -= $value->[HIGH] ; + } + + $value = $value->[LOW] ; + } + + if ($value > $self->[LOW]) { + -- $self->[HIGH] ; + $self->[LOW] = MAX32 - $value + $self->[LOW] + 1 ; + } + else { + $self->[LOW] -= $value; + } +} + +sub equal +{ + my $self = shift; + my $other = shift; + + return $self->[LOW] == $other->[LOW] && + $self->[HIGH] == $other->[HIGH] ; +} + +sub gt +{ + my $self = shift; + my $other = shift; + + return $self->cmp($other) > 0 ; +} + +sub cmp +{ + my $self = shift; + my $other = shift ; + + if ($self->[LOW] == $other->[LOW]) { + return $self->[HIGH] - $other->[HIGH] ; + } + else { + return $self->[LOW] - $other->[LOW] ; + } +} + + +sub is64bit +{ + return $_[0]->[HIGH] > 0 ; +} + +sub isAlmost64bit +{ + return $_[0]->[HIGH] > 0 || $_[0]->[LOW] == MAX32 ; +} + +sub getPacked_V64 +{ + return pack "V V", @{ $_[0] } ; +} + +sub getPacked_V32 +{ + return pack "V", $_[0]->[LOW] ; +} + +sub pack_V64 +{ + return pack "V V", $_[0], 0; +} + + +sub full32 +{ + return $_[0] == MAX32 ; +} + +sub Value_VV64 +{ + my $buffer = shift; + + my ($lo, $hi) = unpack ("V V" , $buffer); + no warnings 'uninitialized'; + return $hi * HI_1 + $lo; +} + + +package IO::Compress::Base::Common; + +1; +package IO::Uncompress::Inflate ; +# for RFC1950 + +use strict ; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status ); +use IO::Compress::Zlib::Constants 2.074 ; + +use IO::Uncompress::RawInflate 2.074 ; + +require Exporter ; +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $InflateError); + +$VERSION = '2.074'; +$InflateError = ''; + +@ISA = qw(IO::Uncompress::RawInflate Exporter); +@EXPORT_OK = qw( $InflateError inflate ) ; +%EXPORT_TAGS = %IO::Uncompress::RawInflate::DEFLATE_CONSTANTS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + + +sub new +{ + my $class = shift ; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$InflateError); + + $obj->_create(undef, 0, @_); +} + +sub inflate +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$InflateError); + return $obj->_inf(@_); +} + +sub getExtraParams +{ + return (); +} + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + # gunzip always needs adler32 + $got->setValue('adler32' => 1); + + return 1; +} + +sub ckMagic +{ + my $self = shift; + + my $magic ; + $self->smartReadExact(\$magic, ZLIB_HEADER_SIZE); + + *$self->{HeaderPending} = $magic ; + + return $self->HeaderError("Header size is " . + ZLIB_HEADER_SIZE . " bytes") + if length $magic != ZLIB_HEADER_SIZE; + + #return $self->HeaderError("CRC mismatch.") + return undef + if ! $self->isZlibMagic($magic) ; + + *$self->{Type} = 'rfc1950'; + return $magic; +} + +sub readHeader +{ + my $self = shift; + my $magic = shift ; + + return $self->_readDeflateHeader($magic) ; +} + +sub chkTrailer +{ + my $self = shift; + my $trailer = shift; + + my $ADLER32 = unpack("N", $trailer) ; + *$self->{Info}{ADLER32} = $ADLER32; + return $self->TrailerError("CRC mismatch") + if *$self->{Strict} && $ADLER32 != *$self->{Uncomp}->adler32() ; + + return STATUS_OK; +} + + + +sub isZlibMagic +{ + my $self = shift; + my $buffer = shift ; + + return 0 + if length $buffer < ZLIB_HEADER_SIZE ; + + my $hdr = unpack("n", $buffer) ; + #return 0 if $hdr % 31 != 0 ; + return $self->HeaderError("CRC mismatch.") + if $hdr % 31 != 0 ; + + my ($CMF, $FLG) = unpack "C C", $buffer; + my $cm = bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS) ; + + # Only Deflate supported + return $self->HeaderError("Not Deflate (CM is $cm)") + if $cm != ZLIB_CMF_CM_DEFLATED ; + + # Max window value is 7 for Deflate. + my $cinfo = bits($CMF, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS) ; + return $self->HeaderError("CINFO > " . ZLIB_CMF_CINFO_MAX . + " (CINFO is $cinfo)") + if $cinfo > ZLIB_CMF_CINFO_MAX ; + + return 1; +} + +sub bits +{ + my $data = shift ; + my $offset = shift ; + my $mask = shift ; + + ($data >> $offset ) & $mask & 0xFF ; +} + + +sub _readDeflateHeader +{ + my ($self, $buffer) = @_ ; + +# if (! $buffer) { +# $self->smartReadExact(\$buffer, ZLIB_HEADER_SIZE); +# +# *$self->{HeaderPending} = $buffer ; +# +# return $self->HeaderError("Header size is " . +# ZLIB_HEADER_SIZE . " bytes") +# if length $buffer != ZLIB_HEADER_SIZE; +# +# return $self->HeaderError("CRC mismatch.") +# if ! isZlibMagic($buffer) ; +# } + + my ($CMF, $FLG) = unpack "C C", $buffer; + my $FDICT = bits($FLG, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS ), + + my $cm = bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS) ; + $cm == ZLIB_CMF_CM_DEFLATED + or return $self->HeaderError("Not Deflate (CM is $cm)") ; + + my $DICTID; + if ($FDICT) { + $self->smartReadExact(\$buffer, ZLIB_FDICT_SIZE) + or return $self->TruncatedHeader("FDICT"); + + $DICTID = unpack("N", $buffer) ; + } + + *$self->{Type} = 'rfc1950'; + + return { + 'Type' => 'rfc1950', + 'FingerprintLength' => ZLIB_HEADER_SIZE, + 'HeaderLength' => ZLIB_HEADER_SIZE, + 'TrailerLength' => ZLIB_TRAILER_SIZE, + 'Header' => $buffer, + + CMF => $CMF , + CM => bits($CMF, ZLIB_CMF_CM_OFFSET, ZLIB_CMF_CM_BITS ), + CINFO => bits($CMF, ZLIB_CMF_CINFO_OFFSET, ZLIB_CMF_CINFO_BITS ), + FLG => $FLG , + FCHECK => bits($FLG, ZLIB_FLG_FCHECK_OFFSET, ZLIB_FLG_FCHECK_BITS), + FDICT => bits($FLG, ZLIB_FLG_FDICT_OFFSET, ZLIB_FLG_FDICT_BITS ), + FLEVEL => bits($FLG, ZLIB_FLG_LEVEL_OFFSET, ZLIB_FLG_LEVEL_BITS ), + DICTID => $DICTID , + + }; +} + + + + +1 ; + +__END__ + + + +package IO::Uncompress::Gunzip ; + +require 5.006 ; + +# for RFC1952 + +use strict ; +use warnings; +use bytes; + +use IO::Uncompress::RawInflate 2.074 ; + +use Compress::Raw::Zlib 2.074 () ; +use IO::Compress::Base::Common 2.074 qw(:Status ); +use IO::Compress::Gzip::Constants 2.074 ; +use IO::Compress::Zlib::Extra 2.074 ; + +require Exporter ; + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $GunzipError); + +@ISA = qw(IO::Uncompress::RawInflate Exporter); +@EXPORT_OK = qw( $GunzipError gunzip ); +%EXPORT_TAGS = %IO::Uncompress::RawInflate::DEFLATE_CONSTANTS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + +$GunzipError = ''; + +$VERSION = '2.074'; + +sub new +{ + my $class = shift ; + $GunzipError = ''; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$GunzipError); + + $obj->_create(undef, 0, @_); +} + +sub gunzip +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$GunzipError); + return $obj->_inf(@_) ; +} + +sub getExtraParams +{ + return ( 'parseextra' => [IO::Compress::Base::Common::Parse_boolean, 0] ) ; +} + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + # gunzip always needs crc32 + $got->setValue('crc32' => 1); + + return 1; +} + +sub ckMagic +{ + my $self = shift; + + my $magic ; + $self->smartReadExact(\$magic, GZIP_ID_SIZE); + + *$self->{HeaderPending} = $magic ; + + return $self->HeaderError("Minimum header size is " . + GZIP_MIN_HEADER_SIZE . " bytes") + if length $magic != GZIP_ID_SIZE ; + + return $self->HeaderError("Bad Magic") + if ! isGzipMagic($magic) ; + + *$self->{Type} = 'rfc1952'; + + return $magic ; +} + +sub readHeader +{ + my $self = shift; + my $magic = shift; + + return $self->_readGzipHeader($magic); +} + +sub chkTrailer +{ + my $self = shift; + my $trailer = shift; + + # Check CRC & ISIZE + my ($CRC32, $ISIZE) = unpack("V V", $trailer) ; + *$self->{Info}{CRC32} = $CRC32; + *$self->{Info}{ISIZE} = $ISIZE; + + if (*$self->{Strict}) { + return $self->TrailerError("CRC mismatch") + if $CRC32 != *$self->{Uncomp}->crc32() ; + + my $exp_isize = *$self->{UnCompSize}->get32bit(); + return $self->TrailerError("ISIZE mismatch. Got $ISIZE" + . ", expected $exp_isize") + if $ISIZE != $exp_isize ; + } + + return STATUS_OK; +} + +sub isGzipMagic +{ + my $buffer = shift ; + return 0 if length $buffer < GZIP_ID_SIZE ; + my ($id1, $id2) = unpack("C C", $buffer) ; + return $id1 == GZIP_ID1 && $id2 == GZIP_ID2 ; +} + +sub _readFullGzipHeader($) +{ + my ($self) = @_ ; + my $magic = '' ; + + $self->smartReadExact(\$magic, GZIP_ID_SIZE); + + *$self->{HeaderPending} = $magic ; + + return $self->HeaderError("Minimum header size is " . + GZIP_MIN_HEADER_SIZE . " bytes") + if length $magic != GZIP_ID_SIZE ; + + + return $self->HeaderError("Bad Magic") + if ! isGzipMagic($magic) ; + + my $status = $self->_readGzipHeader($magic); + delete *$self->{Transparent} if ! defined $status ; + return $status ; +} + +sub _readGzipHeader($) +{ + my ($self, $magic) = @_ ; + my ($HeaderCRC) ; + my ($buffer) = '' ; + + $self->smartReadExact(\$buffer, GZIP_MIN_HEADER_SIZE - GZIP_ID_SIZE) + or return $self->HeaderError("Minimum header size is " . + GZIP_MIN_HEADER_SIZE . " bytes") ; + + my $keep = $magic . $buffer ; + *$self->{HeaderPending} = $keep ; + + # now split out the various parts + my ($cm, $flag, $mtime, $xfl, $os) = unpack("C C V C C", $buffer) ; + + $cm == GZIP_CM_DEFLATED + or return $self->HeaderError("Not Deflate (CM is $cm)") ; + + # check for use of reserved bits + return $self->HeaderError("Use of Reserved Bits in FLG field.") + if $flag & GZIP_FLG_RESERVED ; + + my $EXTRA ; + my @EXTRA = () ; + if ($flag & GZIP_FLG_FEXTRA) { + $EXTRA = "" ; + $self->smartReadExact(\$buffer, GZIP_FEXTRA_HEADER_SIZE) + or return $self->TruncatedHeader("FEXTRA Length") ; + + my ($XLEN) = unpack("v", $buffer) ; + $self->smartReadExact(\$EXTRA, $XLEN) + or return $self->TruncatedHeader("FEXTRA Body"); + $keep .= $buffer . $EXTRA ; + + if ($XLEN && *$self->{'ParseExtra'}) { + my $bad = IO::Compress::Zlib::Extra::parseRawExtra($EXTRA, + \@EXTRA, 1, 1); + return $self->HeaderError($bad) + if defined $bad; + } + } + + my $origname ; + if ($flag & GZIP_FLG_FNAME) { + $origname = "" ; + while (1) { + $self->smartReadExact(\$buffer, 1) + or return $self->TruncatedHeader("FNAME"); + last if $buffer eq GZIP_NULL_BYTE ; + $origname .= $buffer + } + $keep .= $origname . GZIP_NULL_BYTE ; + + return $self->HeaderError("Non ISO 8859-1 Character found in Name") + if *$self->{Strict} && $origname =~ /$GZIP_FNAME_INVALID_CHAR_RE/o ; + } + + my $comment ; + if ($flag & GZIP_FLG_FCOMMENT) { + $comment = ""; + while (1) { + $self->smartReadExact(\$buffer, 1) + or return $self->TruncatedHeader("FCOMMENT"); + last if $buffer eq GZIP_NULL_BYTE ; + $comment .= $buffer + } + $keep .= $comment . GZIP_NULL_BYTE ; + + return $self->HeaderError("Non ISO 8859-1 Character found in Comment") + if *$self->{Strict} && $comment =~ /$GZIP_FCOMMENT_INVALID_CHAR_RE/o ; + } + + if ($flag & GZIP_FLG_FHCRC) { + $self->smartReadExact(\$buffer, GZIP_FHCRC_SIZE) + or return $self->TruncatedHeader("FHCRC"); + + $HeaderCRC = unpack("v", $buffer) ; + my $crc16 = Compress::Raw::Zlib::crc32($keep) & 0xFF ; + + return $self->HeaderError("CRC16 mismatch.") + if *$self->{Strict} && $crc16 != $HeaderCRC; + + $keep .= $buffer ; + } + + # Assume compression method is deflated for xfl tests + #if ($xfl) { + #} + + *$self->{Type} = 'rfc1952'; + + return { + 'Type' => 'rfc1952', + 'FingerprintLength' => 2, + 'HeaderLength' => length $keep, + 'TrailerLength' => GZIP_TRAILER_SIZE, + 'Header' => $keep, + 'isMinimalHeader' => $keep eq GZIP_MINIMUM_HEADER ? 1 : 0, + + 'MethodID' => $cm, + 'MethodName' => $cm == GZIP_CM_DEFLATED ? "Deflated" : "Unknown" , + 'TextFlag' => $flag & GZIP_FLG_FTEXT ? 1 : 0, + 'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0, + 'NameFlag' => $flag & GZIP_FLG_FNAME ? 1 : 0, + 'CommentFlag' => $flag & GZIP_FLG_FCOMMENT ? 1 : 0, + 'ExtraFlag' => $flag & GZIP_FLG_FEXTRA ? 1 : 0, + 'Name' => $origname, + 'Comment' => $comment, + 'Time' => $mtime, + 'OsID' => $os, + 'OsName' => defined $GZIP_OS_Names{$os} + ? $GZIP_OS_Names{$os} : "Unknown", + 'HeaderCRC' => $HeaderCRC, + 'Flags' => $flag, + 'ExtraFlags' => $xfl, + 'ExtraFieldRaw' => $EXTRA, + 'ExtraField' => [ @EXTRA ], + + + #'CompSize'=> $compsize, + #'CRC32'=> $CRC32, + #'OrigSize'=> $ISIZE, + } +} + + +1; + +__END__ + + +package IO::Uncompress::AnyUncompress ; + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 (); + +use IO::Uncompress::Base 2.074 ; + + +require Exporter ; + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyUncompressError); + +$VERSION = '2.074'; +$AnyUncompressError = ''; + +@ISA = qw(IO::Uncompress::Base Exporter); +@EXPORT_OK = qw( $AnyUncompressError anyuncompress ) ; +%EXPORT_TAGS = %IO::Uncompress::Base::DEFLATE_CONSTANTS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + +# TODO - allow the user to pick a set of the three formats to allow +# or just assume want to auto-detect any of the three formats. + +BEGIN +{ + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + eval ' use IO::Uncompress::Adapter::Inflate 2.074 ;'; + eval ' use IO::Uncompress::Adapter::Bunzip2 2.074 ;'; + eval ' use IO::Uncompress::Adapter::LZO 2.074 ;'; + eval ' use IO::Uncompress::Adapter::Lzf 2.074 ;'; + eval ' use IO::Uncompress::Adapter::UnLzma 2.074 ;'; + eval ' use IO::Uncompress::Adapter::UnXz 2.074 ;'; + + eval ' use IO::Uncompress::Bunzip2 2.074 ;'; + eval ' use IO::Uncompress::UnLzop 2.074 ;'; + eval ' use IO::Uncompress::Gunzip 2.074 ;'; + eval ' use IO::Uncompress::Inflate 2.074 ;'; + eval ' use IO::Uncompress::RawInflate 2.074 ;'; + eval ' use IO::Uncompress::Unzip 2.074 ;'; + eval ' use IO::Uncompress::UnLzf 2.074 ;'; + eval ' use IO::Uncompress::UnLzma 2.074 ;'; + eval ' use IO::Uncompress::UnXz 2.074 ;'; +} + +sub new +{ + my $class = shift ; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$AnyUncompressError); + $obj->_create(undef, 0, @_); +} + +sub anyuncompress +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$AnyUncompressError); + return $obj->_inf(@_) ; +} + +sub getExtraParams +{ + return ( 'rawinflate' => [IO::Compress::Base::Common::Parse_boolean, 0] , + 'unlzma' => [IO::Compress::Base::Common::Parse_boolean, 0] ) ; +} + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + # any always needs both crc32 and adler32 + $got->setValue('crc32' => 1); + $got->setValue('adler32' => 1); + + return 1; +} + +sub mkUncomp +{ + my $self = shift ; + my $got = shift ; + + my $magic ; + + # try zlib first + if (defined $IO::Uncompress::RawInflate::VERSION ) + { + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + my @possible = qw( Inflate Gunzip Unzip ); + unshift @possible, 'RawInflate' + if $got->getValue('rawinflate'); + + $magic = $self->ckMagic( @possible ); + + if ($magic) { + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + return 1; + } + } + + if (defined $IO::Uncompress::UnLzma::VERSION && $got->getValue('unlzma')) + { + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::UnLzma::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + my @possible = qw( UnLzma ); + #unshift @possible, 'RawInflate' + # if $got->getValue('rawinflate'); + + if ( *$self->{Info} = $self->ckMagic( @possible )) + { + return 1; + } + } + + if (defined $IO::Uncompress::UnXz::VERSION and + $magic = $self->ckMagic('UnXz')) { + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + my ($obj, $errstr, $errno) = + IO::Uncompress::Adapter::UnXz::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + return 1; + } + + if (defined $IO::Uncompress::Bunzip2::VERSION and + $magic = $self->ckMagic('Bunzip2')) { + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Bunzip2::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + return 1; + } + + if (defined $IO::Uncompress::UnLzop::VERSION and + $magic = $self->ckMagic('UnLzop')) { + + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::LZO::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + return 1; + } + + if (defined $IO::Uncompress::UnLzf::VERSION and + $magic = $self->ckMagic('UnLzf')) { + + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Lzf::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + return 1; + } + + return 0 ; +} + + + +sub ckMagic +{ + my $self = shift; + my @names = @_ ; + + my $keep = ref $self ; + for my $class ( map { "IO::Uncompress::$_" } @names) + { + bless $self => $class; + my $magic = $self->ckMagic(); + + if ($magic) + { + #bless $self => $class; + return $magic ; + } + + $self->pushBack(*$self->{HeaderPending}) ; + *$self->{HeaderPending} = '' ; + } + + bless $self => $keep; + return undef; +} + +1 ; + +__END__ + + +package IO::Uncompress::Unzip; + +require 5.006 ; + +# for RFC1952 + +use strict ; +use warnings; +use bytes; + +use IO::File; +use IO::Uncompress::RawInflate 2.074 ; +use IO::Compress::Base::Common 2.074 qw(:Status ); +use IO::Uncompress::Adapter::Inflate 2.074 ; +use IO::Uncompress::Adapter::Identity 2.074 ; +use IO::Compress::Zlib::Extra 2.074 ; +use IO::Compress::Zip::Constants 2.074 ; + +use Compress::Raw::Zlib 2.074 () ; + +BEGIN +{ + eval{ require IO::Uncompress::Adapter::Bunzip2 ; + import IO::Uncompress::Adapter::Bunzip2 } ; + eval{ require IO::Uncompress::Adapter::UnLzma ; + import IO::Uncompress::Adapter::UnLzma } ; +} + + +require Exporter ; + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $UnzipError, %headerLookup); + +$VERSION = '2.074'; +$UnzipError = ''; + +@ISA = qw(IO::Uncompress::RawInflate Exporter); +@EXPORT_OK = qw( $UnzipError unzip ); +%EXPORT_TAGS = %IO::Uncompress::RawInflate::EXPORT_TAGS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + +%headerLookup = ( + ZIP_CENTRAL_HDR_SIG, \&skipCentralDirectory, + ZIP_END_CENTRAL_HDR_SIG, \&skipEndCentralDirectory, + ZIP64_END_CENTRAL_REC_HDR_SIG, \&skipCentralDirectory64Rec, + ZIP64_END_CENTRAL_LOC_HDR_SIG, \&skipCentralDirectory64Loc, + ZIP64_ARCHIVE_EXTRA_SIG, \&skipArchiveExtra, + ZIP64_DIGITAL_SIGNATURE_SIG, \&skipDigitalSignature, + ); + +sub new +{ + my $class = shift ; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$UnzipError); + $obj->_create(undef, 0, @_); +} + +sub unzip +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$UnzipError); + return $obj->_inf(@_) ; +} + +sub getExtraParams +{ + + return ( +# # Zip header fields + 'name' => [IO::Compress::Base::Common::Parse_any, undef], + + 'stream' => [IO::Compress::Base::Common::Parse_boolean, 0], + + # TODO - This means reading the central directory to get + # 1. the local header offsets + # 2. The compressed data length + ); +} + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + # unzip always needs crc32 + $got->setValue('crc32' => 1); + + *$self->{UnzipData}{Name} = $got->getValue('name'); + + return 1; +} + +sub mkUncomp +{ + my $self = shift ; + my $got = shift ; + + my $magic = $self->ckMagic() + or return 0; + + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + return 1; + +} + +sub ckMagic +{ + my $self = shift; + + my $magic ; + $self->smartReadExact(\$magic, 4); + + *$self->{HeaderPending} = $magic ; + + return $self->HeaderError("Minimum header size is " . + 4 . " bytes") + if length $magic != 4 ; + + return $self->HeaderError("Bad Magic") + if ! _isZipMagic($magic) ; + + *$self->{Type} = 'zip'; + + return $magic ; +} + + +sub fastForward +{ + my $self = shift; + my $offset = shift; + + # TODO - if Stream isn't enabled & reading from file, use seek + + my $buffer = ''; + my $c = 1024 * 16; + + while ($offset > 0) + { + $c = length $offset + if length $offset < $c ; + + $offset -= $c; + + $self->smartReadExact(\$buffer, $c) + or return 0; + } + + return 1; +} + + +sub readHeader +{ + my $self = shift; + my $magic = shift ; + + my $name = *$self->{UnzipData}{Name} ; + my $hdr = $self->_readZipHeader($magic) ; + + while (defined $hdr) + { + if (! defined $name || $hdr->{Name} eq $name) + { + return $hdr ; + } + + # skip the data + # TODO - when Stream is off, use seek + my $buffer; + if (*$self->{ZipData}{Streaming}) { + + while (1) { + + my $b; + my $status = $self->smartRead(\$b, 1024 * 16); + return undef + if $status <= 0 ; + + my $temp_buf; + my $out; + $status = *$self->{Uncomp}->uncompr(\$b, \$temp_buf, 0, $out); + + return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, + *$self->{Uncomp}{ErrorNo}) + if $self->saveStatus($status) == STATUS_ERROR; + + if ($status == STATUS_ENDSTREAM) { + *$self->{Uncomp}->reset(); + $self->pushBack($b) ; + last; + } + } + + # skip the trailer + $self->smartReadExact(\$buffer, $hdr->{TrailerLength}) + or return $self->saveErrorString(undef, "Truncated file"); + } + else { + my $c = $hdr->{CompressedLength}->get64bit(); + $self->fastForward($c) + or return $self->saveErrorString(undef, "Truncated file"); + $buffer = ''; + } + + $self->chkTrailer($buffer) == STATUS_OK + or return $self->saveErrorString(undef, "Truncated file"); + + $hdr = $self->_readFullZipHeader(); + + return $self->saveErrorString(undef, "Cannot find '$name'") + if $self->smartEof(); + } + + return undef; +} + +sub chkTrailer +{ + my $self = shift; + my $trailer = shift; + + my ($sig, $CRC32, $cSize, $uSize) ; + my ($cSizeHi, $uSizeHi) = (0, 0); + if (*$self->{ZipData}{Streaming}) { + $sig = unpack ("V", substr($trailer, 0, 4)); + $CRC32 = unpack ("V", substr($trailer, 4, 4)); + + if (*$self->{ZipData}{Zip64} ) { + $cSize = U64::newUnpack_V64 substr($trailer, 8, 8); + $uSize = U64::newUnpack_V64 substr($trailer, 16, 8); + } + else { + $cSize = U64::newUnpack_V32 substr($trailer, 8, 4); + $uSize = U64::newUnpack_V32 substr($trailer, 12, 4); + } + + return $self->TrailerError("Data Descriptor signature, got $sig") + if $sig != ZIP_DATA_HDR_SIG; + } + else { + ($CRC32, $cSize, $uSize) = + (*$self->{ZipData}{Crc32}, + *$self->{ZipData}{CompressedLen}, + *$self->{ZipData}{UnCompressedLen}); + } + + *$self->{Info}{CRC32} = *$self->{ZipData}{CRC32} ; + *$self->{Info}{CompressedLength} = $cSize->get64bit(); + *$self->{Info}{UncompressedLength} = $uSize->get64bit(); + + if (*$self->{Strict}) { + return $self->TrailerError("CRC mismatch") + if $CRC32 != *$self->{ZipData}{CRC32} ; + + return $self->TrailerError("CSIZE mismatch.") + if ! $cSize->equal(*$self->{CompSize}); + + return $self->TrailerError("USIZE mismatch.") + if ! $uSize->equal(*$self->{UnCompSize}); + } + + my $reachedEnd = STATUS_ERROR ; + # check for central directory or end of central directory + while (1) + { + my $magic ; + my $got = $self->smartRead(\$magic, 4); + + return $self->saveErrorString(STATUS_ERROR, "Truncated file") + if $got != 4 && *$self->{Strict}; + + if ($got == 0) { + return STATUS_EOF ; + } + elsif ($got < 0) { + return STATUS_ERROR ; + } + elsif ($got < 4) { + $self->pushBack($magic) ; + return STATUS_OK ; + } + + my $sig = unpack("V", $magic) ; + + my $hdr; + if ($hdr = $headerLookup{$sig}) + { + if (&$hdr($self, $magic) != STATUS_OK ) { + if (*$self->{Strict}) { + return STATUS_ERROR ; + } + else { + $self->clearError(); + return STATUS_OK ; + } + } + + if ($sig == ZIP_END_CENTRAL_HDR_SIG) + { + return STATUS_OK ; + last; + } + } + elsif ($sig == ZIP_LOCAL_HDR_SIG) + { + $self->pushBack($magic) ; + return STATUS_OK ; + } + else + { + # put the data back + $self->pushBack($magic) ; + last; + } + } + + return $reachedEnd ; +} + +sub skipCentralDirectory +{ + my $self = shift; + my $magic = shift ; + + my $buffer; + $self->smartReadExact(\$buffer, 46 - 4) + or return $self->TrailerError("Minimum header size is " . + 46 . " bytes") ; + + my $keep = $magic . $buffer ; + *$self->{HeaderPending} = $keep ; + + #my $versionMadeBy = unpack ("v", substr($buffer, 4-4, 2)); + #my $extractVersion = unpack ("v", substr($buffer, 6-4, 2)); + #my $gpFlag = unpack ("v", substr($buffer, 8-4, 2)); + #my $compressedMethod = unpack ("v", substr($buffer, 10-4, 2)); + #my $lastModTime = unpack ("V", substr($buffer, 12-4, 4)); + #my $crc32 = unpack ("V", substr($buffer, 16-4, 4)); + my $compressedLength = unpack ("V", substr($buffer, 20-4, 4)); + my $uncompressedLength = unpack ("V", substr($buffer, 24-4, 4)); + my $filename_length = unpack ("v", substr($buffer, 28-4, 2)); + my $extra_length = unpack ("v", substr($buffer, 30-4, 2)); + my $comment_length = unpack ("v", substr($buffer, 32-4, 2)); + #my $disk_start = unpack ("v", substr($buffer, 34-4, 2)); + #my $int_file_attrib = unpack ("v", substr($buffer, 36-4, 2)); + #my $ext_file_attrib = unpack ("V", substr($buffer, 38-4, 2)); + #my $lcl_hdr_offset = unpack ("V", substr($buffer, 42-4, 2)); + + + my $filename; + my $extraField; + my $comment ; + if ($filename_length) + { + $self->smartReadExact(\$filename, $filename_length) + or return $self->TruncatedTrailer("filename"); + $keep .= $filename ; + } + + if ($extra_length) + { + $self->smartReadExact(\$extraField, $extra_length) + or return $self->TruncatedTrailer("extra"); + $keep .= $extraField ; + } + + if ($comment_length) + { + $self->smartReadExact(\$comment, $comment_length) + or return $self->TruncatedTrailer("comment"); + $keep .= $comment ; + } + + return STATUS_OK ; +} + +sub skipArchiveExtra +{ + my $self = shift; + my $magic = shift ; + + my $buffer; + $self->smartReadExact(\$buffer, 4) + or return $self->TrailerError("Minimum header size is " . + 4 . " bytes") ; + + my $keep = $magic . $buffer ; + + my $size = unpack ("V", $buffer); + + $self->smartReadExact(\$buffer, $size) + or return $self->TrailerError("Minimum header size is " . + $size . " bytes") ; + + $keep .= $buffer ; + *$self->{HeaderPending} = $keep ; + + return STATUS_OK ; +} + + +sub skipCentralDirectory64Rec +{ + my $self = shift; + my $magic = shift ; + + my $buffer; + $self->smartReadExact(\$buffer, 8) + or return $self->TrailerError("Minimum header size is " . + 8 . " bytes") ; + + my $keep = $magic . $buffer ; + + my ($sizeLo, $sizeHi) = unpack ("V V", $buffer); + my $size = $sizeHi * U64::MAX32 + $sizeLo; + + $self->fastForward($size) + or return $self->TrailerError("Minimum header size is " . + $size . " bytes") ; + + #$keep .= $buffer ; + #*$self->{HeaderPending} = $keep ; + + #my $versionMadeBy = unpack ("v", substr($buffer, 0, 2)); + #my $extractVersion = unpack ("v", substr($buffer, 2, 2)); + #my $diskNumber = unpack ("V", substr($buffer, 4, 4)); + #my $cntrlDirDiskNo = unpack ("V", substr($buffer, 8, 4)); + #my $entriesInThisCD = unpack ("V V", substr($buffer, 12, 8)); + #my $entriesInCD = unpack ("V V", substr($buffer, 20, 8)); + #my $sizeOfCD = unpack ("V V", substr($buffer, 28, 8)); + #my $offsetToCD = unpack ("V V", substr($buffer, 36, 8)); + + return STATUS_OK ; +} + +sub skipCentralDirectory64Loc +{ + my $self = shift; + my $magic = shift ; + + my $buffer; + $self->smartReadExact(\$buffer, 20 - 4) + or return $self->TrailerError("Minimum header size is " . + 20 . " bytes") ; + + my $keep = $magic . $buffer ; + *$self->{HeaderPending} = $keep ; + + #my $startCdDisk = unpack ("V", substr($buffer, 4-4, 4)); + #my $offsetToCD = unpack ("V V", substr($buffer, 8-4, 8)); + #my $diskCount = unpack ("V", substr($buffer, 16-4, 4)); + + return STATUS_OK ; +} + +sub skipEndCentralDirectory +{ + my $self = shift; + my $magic = shift ; + + my $buffer; + $self->smartReadExact(\$buffer, 22 - 4) + or return $self->TrailerError("Minimum header size is " . + 22 . " bytes") ; + + my $keep = $magic . $buffer ; + *$self->{HeaderPending} = $keep ; + + #my $diskNumber = unpack ("v", substr($buffer, 4-4, 2)); + #my $cntrlDirDiskNo = unpack ("v", substr($buffer, 6-4, 2)); + #my $entriesInThisCD = unpack ("v", substr($buffer, 8-4, 2)); + #my $entriesInCD = unpack ("v", substr($buffer, 10-4, 2)); + #my $sizeOfCD = unpack ("V", substr($buffer, 12-4, 4)); + #my $offsetToCD = unpack ("V", substr($buffer, 16-4, 4)); + my $comment_length = unpack ("v", substr($buffer, 20-4, 2)); + + + my $comment ; + if ($comment_length) + { + $self->smartReadExact(\$comment, $comment_length) + or return $self->TruncatedTrailer("comment"); + $keep .= $comment ; + } + + return STATUS_OK ; +} + + +sub _isZipMagic +{ + my $buffer = shift ; + return 0 if length $buffer < 4 ; + my $sig = unpack("V", $buffer) ; + return $sig == ZIP_LOCAL_HDR_SIG ; +} + + +sub _readFullZipHeader($) +{ + my ($self) = @_ ; + my $magic = '' ; + + $self->smartReadExact(\$magic, 4); + + *$self->{HeaderPending} = $magic ; + + return $self->HeaderError("Minimum header size is " . + 30 . " bytes") + if length $magic != 4 ; + + + return $self->HeaderError("Bad Magic") + if ! _isZipMagic($magic) ; + + my $status = $self->_readZipHeader($magic); + delete *$self->{Transparent} if ! defined $status ; + return $status ; +} + +sub _readZipHeader($) +{ + my ($self, $magic) = @_ ; + my ($HeaderCRC) ; + my ($buffer) = '' ; + + $self->smartReadExact(\$buffer, 30 - 4) + or return $self->HeaderError("Minimum header size is " . + 30 . " bytes") ; + + my $keep = $magic . $buffer ; + *$self->{HeaderPending} = $keep ; + + my $extractVersion = unpack ("v", substr($buffer, 4-4, 2)); + my $gpFlag = unpack ("v", substr($buffer, 6-4, 2)); + my $compressedMethod = unpack ("v", substr($buffer, 8-4, 2)); + my $lastModTime = unpack ("V", substr($buffer, 10-4, 4)); + my $crc32 = unpack ("V", substr($buffer, 14-4, 4)); + my $compressedLength = U64::newUnpack_V32 substr($buffer, 18-4, 4); + my $uncompressedLength = U64::newUnpack_V32 substr($buffer, 22-4, 4); + my $filename_length = unpack ("v", substr($buffer, 26-4, 2)); + my $extra_length = unpack ("v", substr($buffer, 28-4, 2)); + + my $filename; + my $extraField; + my @EXTRA = (); + my $streamingMode = ($gpFlag & ZIP_GP_FLAG_STREAMING_MASK) ? 1 : 0 ; + + return $self->HeaderError("Encrypted content not supported") + if $gpFlag & (ZIP_GP_FLAG_ENCRYPTED_MASK|ZIP_GP_FLAG_STRONG_ENCRYPTED_MASK); + + return $self->HeaderError("Patch content not supported") + if $gpFlag & ZIP_GP_FLAG_PATCHED_MASK; + + *$self->{ZipData}{Streaming} = $streamingMode; + + + if ($filename_length) + { + $self->smartReadExact(\$filename, $filename_length) + or return $self->TruncatedHeader("Filename"); + $keep .= $filename ; + } + + my $zip64 = 0 ; + + if ($extra_length) + { + $self->smartReadExact(\$extraField, $extra_length) + or return $self->TruncatedHeader("Extra Field"); + + my $bad = IO::Compress::Zlib::Extra::parseRawExtra($extraField, + \@EXTRA, 1, 0); + return $self->HeaderError($bad) + if defined $bad; + + $keep .= $extraField ; + + my %Extra ; + for (@EXTRA) + { + $Extra{$_->[0]} = \$_->[1]; + } + + if (defined $Extra{ZIP_EXTRA_ID_ZIP64()}) + { + $zip64 = 1 ; + + my $buff = ${ $Extra{ZIP_EXTRA_ID_ZIP64()} }; + + # This code assumes that all the fields in the Zip64 + # extra field aren't necessarily present. The spec says that + # they only exist if the equivalent local headers are -1. + + if (! $streamingMode) { + my $offset = 0 ; + + if (U64::full32 $uncompressedLength->get32bit() ) { + $uncompressedLength + = U64::newUnpack_V64 substr($buff, 0, 8); + + $offset += 8 ; + } + + if (U64::full32 $compressedLength->get32bit() ) { + + $compressedLength + = U64::newUnpack_V64 substr($buff, $offset, 8); + + $offset += 8 ; + } + } + } + } + + *$self->{ZipData}{Zip64} = $zip64; + + if (! $streamingMode) { + *$self->{ZipData}{Streaming} = 0; + *$self->{ZipData}{Crc32} = $crc32; + *$self->{ZipData}{CompressedLen} = $compressedLength; + *$self->{ZipData}{UnCompressedLen} = $uncompressedLength; + *$self->{CompressedInputLengthRemaining} = + *$self->{CompressedInputLength} = $compressedLength->get64bit(); + } + + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(undef); + *$self->{ZipData}{Method} = $compressedMethod; + if ($compressedMethod == ZIP_CM_DEFLATE) + { + *$self->{Type} = 'zip-deflate'; + my $obj = IO::Uncompress::Adapter::Inflate::mkUncompObject(1,0,0); + + *$self->{Uncomp} = $obj; + } + elsif ($compressedMethod == ZIP_CM_BZIP2) + { + return $self->HeaderError("Unsupported Compression format $compressedMethod") + if ! defined $IO::Uncompress::Adapter::Bunzip2::VERSION ; + + *$self->{Type} = 'zip-bzip2'; + + my $obj = IO::Uncompress::Adapter::Bunzip2::mkUncompObject(); + + *$self->{Uncomp} = $obj; + } + elsif ($compressedMethod == ZIP_CM_LZMA) + { + return $self->HeaderError("Unsupported Compression format $compressedMethod") + if ! defined $IO::Uncompress::Adapter::UnLzma::VERSION ; + + *$self->{Type} = 'zip-lzma'; + my $LzmaHeader; + $self->smartReadExact(\$LzmaHeader, 4) + or return $self->saveErrorString(undef, "Truncated file"); + my ($verHi, $verLo) = unpack ("CC", substr($LzmaHeader, 0, 2)); + my $LzmaPropertiesSize = unpack ("v", substr($LzmaHeader, 2, 2)); + + + my $LzmaPropertyData; + $self->smartReadExact(\$LzmaPropertyData, $LzmaPropertiesSize) + or return $self->saveErrorString(undef, "Truncated file"); + + if (! $streamingMode) { + *$self->{ZipData}{CompressedLen}->subtract(4 + $LzmaPropertiesSize) ; + *$self->{CompressedInputLengthRemaining} = + *$self->{CompressedInputLength} = *$self->{ZipData}{CompressedLen}->get64bit(); + } + + my $obj = + IO::Uncompress::Adapter::UnLzma::mkUncompZipObject($LzmaPropertyData); + + *$self->{Uncomp} = $obj; + } + elsif ($compressedMethod == ZIP_CM_STORE) + { + *$self->{Type} = 'zip-stored'; + + my $obj = + IO::Uncompress::Adapter::Identity::mkUncompObject($streamingMode, + $zip64); + + *$self->{Uncomp} = $obj; + } + else + { + return $self->HeaderError("Unsupported Compression format $compressedMethod"); + } + + return { + 'Type' => 'zip', + 'FingerprintLength' => 4, + #'HeaderLength' => $compressedMethod == 8 ? length $keep : 0, + 'HeaderLength' => length $keep, + 'Zip64' => $zip64, + 'TrailerLength' => ! $streamingMode ? 0 : $zip64 ? 24 : 16, + 'Header' => $keep, + 'CompressedLength' => $compressedLength , + 'UncompressedLength' => $uncompressedLength , + 'CRC32' => $crc32 , + 'Name' => $filename, + 'Time' => _dosToUnixTime($lastModTime), + 'Stream' => $streamingMode, + + 'MethodID' => $compressedMethod, + 'MethodName' => $compressedMethod == ZIP_CM_DEFLATE + ? "Deflated" + : $compressedMethod == ZIP_CM_BZIP2 + ? "Bzip2" + : $compressedMethod == ZIP_CM_LZMA + ? "Lzma" + : $compressedMethod == ZIP_CM_STORE + ? "Stored" + : "Unknown" , + +# 'TextFlag' => $flag & GZIP_FLG_FTEXT ? 1 : 0, +# 'HeaderCRCFlag' => $flag & GZIP_FLG_FHCRC ? 1 : 0, +# 'NameFlag' => $flag & GZIP_FLG_FNAME ? 1 : 0, +# 'CommentFlag' => $flag & GZIP_FLG_FCOMMENT ? 1 : 0, +# 'ExtraFlag' => $flag & GZIP_FLG_FEXTRA ? 1 : 0, +# 'Comment' => $comment, +# 'OsID' => $os, +# 'OsName' => defined $GZIP_OS_Names{$os} +# ? $GZIP_OS_Names{$os} : "Unknown", +# 'HeaderCRC' => $HeaderCRC, +# 'Flags' => $flag, +# 'ExtraFlags' => $xfl, + 'ExtraFieldRaw' => $extraField, + 'ExtraField' => [ @EXTRA ], + + + } +} + +sub filterUncompressed +{ + my $self = shift ; + + if (*$self->{ZipData}{Method} == ZIP_CM_DEFLATE) { + *$self->{ZipData}{CRC32} = *$self->{Uncomp}->crc32() ; + } + else { + *$self->{ZipData}{CRC32} = Compress::Raw::Zlib::crc32(${$_[0]}, *$self->{ZipData}{CRC32}, $_[1]); + } +} + + +# from Archive::Zip & info-zip +sub _dosToUnixTime +{ + my $dt = shift; + + my $year = ( ( $dt >> 25 ) & 0x7f ) + 80; + my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1; + my $mday = ( ( $dt >> 16 ) & 0x1f ); + + my $hour = ( ( $dt >> 11 ) & 0x1f ); + my $min = ( ( $dt >> 5 ) & 0x3f ); + my $sec = ( ( $dt << 1 ) & 0x3e ); + + + use POSIX 'mktime'; + + my $time_t = mktime( $sec, $min, $hour, $mday, $mon, $year, 0, 0, -1 ); + return 0 if ! defined $time_t; + return $time_t; +} + +#sub scanCentralDirectory +#{ +# # Use cases +# # 1 32-bit CD +# # 2 64-bit CD +# +# my $self = shift ; +# +# my @CD = (); +# my $offset = $self->findCentralDirectoryOffset(); +# +# return 0 +# if ! defined $offset; +# +# $self->smarkSeek($offset, 0, SEEK_SET) ; +# +# # Now walk the Central Directory Records +# my $buffer ; +# while ($self->smartReadExact(\$buffer, 46) && +# unpack("V", $buffer) == ZIP_CENTRAL_HDR_SIG) { +# +# my $compressedLength = unpack ("V", substr($buffer, 20, 4)); +# my $filename_length = unpack ("v", substr($buffer, 28, 2)); +# my $extra_length = unpack ("v", substr($buffer, 30, 2)); +# my $comment_length = unpack ("v", substr($buffer, 32, 2)); +# +# $self->smarkSeek($filename_length + $extra_length + $comment_length, 0, SEEK_CUR) +# if $extra_length || $comment_length || $filename_length; +# push @CD, $compressedLength ; +# } +# +#} +# +#sub findCentralDirectoryOffset +#{ +# my $self = shift ; +# +# # Most common use-case is where there is no comment, so +# # know exactly where the end of central directory record +# # should be. +# +# $self->smarkSeek(-22, 0, SEEK_END) ; +# +# my $buffer; +# $self->smartReadExact(\$buffer, 22) ; +# +# my $zip64 = 0; +# my $centralDirOffset ; +# if ( unpack("V", $buffer) == ZIP_END_CENTRAL_HDR_SIG ) { +# $centralDirOffset = unpack ("V", substr($buffer, 16, 2)); +# } +# else { +# die "xxxx"; +# } +# +# return $centralDirOffset ; +#} +# +#sub is84BitCD +#{ +# # TODO +# my $self = shift ; +#} + + +sub skip +{ + my $self = shift; + my $size = shift; + + use Fcntl qw(SEEK_CUR); + if (ref $size eq 'U64') { + $self->smartSeek($size->get64bit(), SEEK_CUR); + } + else { + $self->smartSeek($size, SEEK_CUR); + } + +} + + +sub scanCentralDirectory +{ + my $self = shift; + + my $here = $self->tell(); + + # Use cases + # 1 32-bit CD + # 2 64-bit CD + + my @CD = (); + my $offset = $self->findCentralDirectoryOffset(); + + return () + if ! defined $offset; + + $self->smarkSeek($offset, 0, SEEK_SET) ; + + # Now walk the Central Directory Records + my $buffer ; + while ($self->smartReadExact(\$buffer, 46) && + unpack("V", $buffer) == ZIP_CENTRAL_HDR_SIG) { + + my $compressedLength = unpack("V", substr($buffer, 20, 4)); + my $uncompressedLength = unpack("V", substr($buffer, 24, 4)); + my $filename_length = unpack("v", substr($buffer, 28, 2)); + my $extra_length = unpack("v", substr($buffer, 30, 2)); + my $comment_length = unpack("v", substr($buffer, 32, 2)); + + $self->skip($filename_length ) ; + + my $v64 = new U64 $compressedLength ; + + if (U64::full32 $compressedLength ) { + $self->smartReadExact(\$buffer, $extra_length) ; + die "xxx $offset $comment_length $filename_length $extra_length" . length($buffer) + if length($buffer) != $extra_length; + my $got = $self->get64Extra($buffer, U64::full32 $uncompressedLength); + + # If not Zip64 extra field, assume size is 0xFFFFFFFF + $v64 = $got if defined $got; + } + else { + $self->skip($extra_length) ; + } + + $self->skip($comment_length ) ; + + push @CD, $v64 ; + } + + $self->smartSeek($here, 0, SEEK_SET) ; + + return @CD; +} + +sub get64Extra +{ + my $self = shift ; + + my $buffer = shift; + my $is_uncomp = shift ; + + my $extra = IO::Compress::Zlib::Extra::findID(0x0001, $buffer); + + if (! defined $extra) + { + return undef; + } + else + { + my $u64 = U64::newUnpack_V64(substr($extra, $is_uncomp ? 8 : 0)) ; + return $u64; + } +} + +sub offsetFromZip64 +{ + my $self = shift ; + my $here = shift; + + $self->smartSeek($here - 20, 0, SEEK_SET) + or die "xx $!" ; + + my $buffer; + my $got = 0; + $self->smartReadExact(\$buffer, 20) + or die "xxx $here $got $!" ; + + if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_LOC_HDR_SIG ) { + my $cd64 = U64::Value_VV64 substr($buffer, 8, 8); + + $self->smartSeek($cd64, 0, SEEK_SET) ; + + $self->smartReadExact(\$buffer, 4) + or die "xxx" ; + + if ( unpack("V", $buffer) == ZIP64_END_CENTRAL_REC_HDR_SIG ) { + + $self->smartReadExact(\$buffer, 8) + or die "xxx" ; + my $size = U64::Value_VV64($buffer); + $self->smartReadExact(\$buffer, $size) + or die "xxx" ; + + my $cd64 = U64::Value_VV64 substr($buffer, 36, 8); + + return $cd64 ; + } + + die "zzz"; + } + + die "zzz"; +} + +use constant Pack_ZIP_END_CENTRAL_HDR_SIG => pack("V", ZIP_END_CENTRAL_HDR_SIG); + +sub findCentralDirectoryOffset +{ + my $self = shift ; + + # Most common use-case is where there is no comment, so + # know exactly where the end of central directory record + # should be. + + $self->smartSeek(-22, 0, SEEK_END) ; + my $here = $self->tell(); + + my $buffer; + $self->smartReadExact(\$buffer, 22) + or die "xxx" ; + + my $zip64 = 0; + my $centralDirOffset ; + if ( unpack("V", $buffer) == ZIP_END_CENTRAL_HDR_SIG ) { + $centralDirOffset = unpack("V", substr($buffer, 16, 4)); + } + else { + $self->smartSeek(0, 0, SEEK_END) ; + + my $fileLen = $self->tell(); + my $want = 0 ; + + while(1) { + $want += 1024; + my $seekTo = $fileLen - $want; + if ($seekTo < 0 ) { + $seekTo = 0; + $want = $fileLen ; + } + $self->smartSeek( $seekTo, 0, SEEK_SET) + or die "xxx $!" ; + my $got; + $self->smartReadExact($buffer, $want) + or die "xxx " ; + my $pos = rindex( $buffer, Pack_ZIP_END_CENTRAL_HDR_SIG); + + if ($pos >= 0) { + #$here = $self->tell(); + $here = $seekTo + $pos ; + $centralDirOffset = unpack("V", substr($buffer, $pos + 16, 4)); + last ; + } + + return undef + if $want == $fileLen; + } + } + + $centralDirOffset = $self->offsetFromZip64($here) + if U64::full32 $centralDirOffset ; + + return $centralDirOffset ; +} + +1; + +__END__ + + +package IO::Uncompress::Bunzip2 ; + +use strict ; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status ); + +use IO::Uncompress::Base 2.074 ; +use IO::Uncompress::Adapter::Bunzip2 2.074 ; + +require Exporter ; +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $Bunzip2Error); + +$VERSION = '2.074'; +$Bunzip2Error = ''; + +@ISA = qw(IO::Uncompress::Base Exporter); +@EXPORT_OK = qw( $Bunzip2Error bunzip2 ) ; +#%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +#Exporter::export_ok_tags('all'); + + +sub new +{ + my $class = shift ; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$Bunzip2Error); + + $obj->_create(undef, 0, @_); +} + +sub bunzip2 +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$Bunzip2Error); + return $obj->_inf(@_); +} + +sub getExtraParams +{ + return ( + 'verbosity' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'small' => [IO::Compress::Base::Common::Parse_boolean, 0], + ); +} + + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + return 1; +} + +sub mkUncomp +{ + my $self = shift ; + my $got = shift ; + + my $magic = $self->ckMagic() + or return 0; + + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + my $Small = $got->getValue('small'); + my $Verbosity = $got->getValue('verbosity'); + + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Bunzip2::mkUncompObject( + $Small, $Verbosity); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + return 1; + +} + + +sub ckMagic +{ + my $self = shift; + + my $magic ; + $self->smartReadExact(\$magic, 4); + + *$self->{HeaderPending} = $magic ; + + return $self->HeaderError("Header size is " . + 4 . " bytes") + if length $magic != 4; + + return $self->HeaderError("Bad Magic.") + if ! isBzip2Magic($magic) ; + + + *$self->{Type} = 'bzip2'; + return $magic; +} + +sub readHeader +{ + my $self = shift; + my $magic = shift ; + + $self->pushBack($magic); + *$self->{HeaderPending} = ''; + + + return { + 'Type' => 'bzip2', + 'FingerprintLength' => 4, + 'HeaderLength' => 4, + 'TrailerLength' => 0, + 'Header' => '$magic' + }; + +} + +sub chkTrailer +{ + return STATUS_OK; +} + + + +sub isBzip2Magic +{ + my $buffer = shift ; + return $buffer =~ /^BZh\d$/; +} + +1 ; + +__END__ + + + +package IO::Uncompress::Base ; + +use strict ; +use warnings; +use bytes; + +our (@ISA, $VERSION, @EXPORT_OK, %EXPORT_TAGS); +@ISA = qw(IO::File Exporter); + + +$VERSION = '2.074'; + +use constant G_EOF => 0 ; +use constant G_ERR => -1 ; + +use IO::Compress::Base::Common 2.074 ; + +use IO::File ; +use Symbol; +use Scalar::Util (); +use List::Util (); +use Carp ; + +%EXPORT_TAGS = ( ); +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; + +sub smartRead +{ + my $self = $_[0]; + my $out = $_[1]; + my $size = $_[2]; + $$out = "" ; + + my $offset = 0 ; + my $status = 1; + + + if (defined *$self->{InputLength}) { + return 0 + if *$self->{InputLengthRemaining} <= 0 ; + $size = List::Util::min($size, *$self->{InputLengthRemaining}); + } + + if ( length *$self->{Prime} ) { + $$out = substr(*$self->{Prime}, 0, $size) ; + substr(*$self->{Prime}, 0, $size) = '' ; + if (length $$out == $size) { + *$self->{InputLengthRemaining} -= length $$out + if defined *$self->{InputLength}; + + return length $$out ; + } + $offset = length $$out ; + } + + my $get_size = $size - $offset ; + + if (defined *$self->{FH}) { + if ($offset) { + # Not using this + # + # *$self->{FH}->read($$out, $get_size, $offset); + # + # because the filehandle may not support the offset parameter + # An example is Net::FTP + my $tmp = ''; + $status = *$self->{FH}->read($tmp, $get_size) ; + substr($$out, $offset) = $tmp + if defined $status && $status > 0 ; + } + else + { $status = *$self->{FH}->read($$out, $get_size) } + } + elsif (defined *$self->{InputEvent}) { + my $got = 1 ; + while (length $$out < $size) { + last + if ($got = *$self->{InputEvent}->($$out, $get_size)) <= 0; + } + + if (length $$out > $size ) { + *$self->{Prime} = substr($$out, $size, length($$out)); + substr($$out, $size, length($$out)) = ''; + } + + *$self->{EventEof} = 1 if $got <= 0 ; + } + else { + no warnings 'uninitialized'; + my $buf = *$self->{Buffer} ; + $$buf = '' unless defined $$buf ; + substr($$out, $offset) = substr($$buf, *$self->{BufferOffset}, $get_size); + if (*$self->{ConsumeInput}) + { substr($$buf, 0, $get_size) = '' } + else + { *$self->{BufferOffset} += length($$out) - $offset } + } + + *$self->{InputLengthRemaining} -= length($$out) #- $offset + if defined *$self->{InputLength}; + + if (! defined $status) { + $self->saveStatus($!) ; + return STATUS_ERROR; + } + + $self->saveStatus(length $$out < 0 ? STATUS_ERROR : STATUS_OK) ; + + return length $$out; +} + +sub pushBack +{ + my $self = shift ; + + return if ! defined $_[0] || length $_[0] == 0 ; + + if (defined *$self->{FH} || defined *$self->{InputEvent} ) { + *$self->{Prime} = $_[0] . *$self->{Prime} ; + *$self->{InputLengthRemaining} += length($_[0]); + } + else { + my $len = length $_[0]; + + if($len > *$self->{BufferOffset}) { + *$self->{Prime} = substr($_[0], 0, $len - *$self->{BufferOffset}) . *$self->{Prime} ; + *$self->{InputLengthRemaining} = *$self->{InputLength}; + *$self->{BufferOffset} = 0 + } + else { + *$self->{InputLengthRemaining} += length($_[0]); + *$self->{BufferOffset} -= length($_[0]) ; + } + } +} + +sub smartSeek +{ + my $self = shift ; + my $offset = shift ; + my $truncate = shift; + my $position = shift || SEEK_SET; + + # TODO -- need to take prime into account + if (defined *$self->{FH}) + { *$self->{FH}->seek($offset, $position) } + else { + if ($position == SEEK_END) { + *$self->{BufferOffset} = length ${ *$self->{Buffer} } + $offset ; + } + elsif ($position == SEEK_CUR) { + *$self->{BufferOffset} += $offset ; + } + else { + *$self->{BufferOffset} = $offset ; + } + + substr(${ *$self->{Buffer} }, *$self->{BufferOffset}) = '' + if $truncate; + return 1; + } +} + +sub smartTell +{ + my $self = shift ; + + if (defined *$self->{FH}) + { return *$self->{FH}->tell() } + else + { return *$self->{BufferOffset} } +} + +sub smartWrite +{ + my $self = shift ; + my $out_data = shift ; + + if (defined *$self->{FH}) { + # flush needed for 5.8.0 + defined *$self->{FH}->write($out_data, length $out_data) && + defined *$self->{FH}->flush() ; + } + else { + my $buf = *$self->{Buffer} ; + substr($$buf, *$self->{BufferOffset}, length $out_data) = $out_data ; + *$self->{BufferOffset} += length($out_data) ; + return 1; + } +} + +sub smartReadExact +{ + return $_[0]->smartRead($_[1], $_[2]) == $_[2]; +} + +sub smartEof +{ + my ($self) = $_[0]; + local $.; + + return 0 if length *$self->{Prime} || *$self->{PushMode}; + + if (defined *$self->{FH}) + { + # Could use + # + # *$self->{FH}->eof() + # + # here, but this can cause trouble if + # the filehandle is itself a tied handle, but it uses sysread. + # Then we get into mixing buffered & non-buffered IO, + # which will cause trouble + + my $info = $self->getErrInfo(); + + my $buffer = ''; + my $status = $self->smartRead(\$buffer, 1); + $self->pushBack($buffer) if length $buffer; + $self->setErrInfo($info); + + return $status == 0 ; + } + elsif (defined *$self->{InputEvent}) + { *$self->{EventEof} } + else + { *$self->{BufferOffset} >= length(${ *$self->{Buffer} }) } +} + +sub clearError +{ + my $self = shift ; + + *$self->{ErrorNo} = 0 ; + ${ *$self->{Error} } = '' ; +} + +sub getErrInfo +{ + my $self = shift ; + + return [ *$self->{ErrorNo}, ${ *$self->{Error} } ] ; +} + +sub setErrInfo +{ + my $self = shift ; + my $ref = shift; + + *$self->{ErrorNo} = $ref->[0] ; + ${ *$self->{Error} } = $ref->[1] ; +} + +sub saveStatus +{ + my $self = shift ; + my $errno = shift() + 0 ; + + *$self->{ErrorNo} = $errno; + ${ *$self->{Error} } = '' ; + + return *$self->{ErrorNo} ; +} + + +sub saveErrorString +{ + my $self = shift ; + my $retval = shift ; + + ${ *$self->{Error} } = shift ; + *$self->{ErrorNo} = @_ ? shift() + 0 : STATUS_ERROR ; + + return $retval; +} + +sub croakError +{ + my $self = shift ; + $self->saveErrorString(0, $_[0]); + croak $_[0]; +} + + +sub closeError +{ + my $self = shift ; + my $retval = shift ; + + my $errno = *$self->{ErrorNo}; + my $error = ${ *$self->{Error} }; + + $self->close(); + + *$self->{ErrorNo} = $errno ; + ${ *$self->{Error} } = $error ; + + return $retval; +} + +sub error +{ + my $self = shift ; + return ${ *$self->{Error} } ; +} + +sub errorNo +{ + my $self = shift ; + return *$self->{ErrorNo}; +} + +sub HeaderError +{ + my ($self) = shift; + return $self->saveErrorString(undef, "Header Error: $_[0]", STATUS_ERROR); +} + +sub TrailerError +{ + my ($self) = shift; + return $self->saveErrorString(G_ERR, "Trailer Error: $_[0]", STATUS_ERROR); +} + +sub TruncatedHeader +{ + my ($self) = shift; + return $self->HeaderError("Truncated in $_[0] Section"); +} + +sub TruncatedTrailer +{ + my ($self) = shift; + return $self->TrailerError("Truncated in $_[0] Section"); +} + +sub postCheckParams +{ + return 1; +} + +sub checkParams +{ + my $self = shift ; + my $class = shift ; + + my $got = shift || IO::Compress::Base::Parameters::new(); + + my $Valid = { + 'blocksize' => [IO::Compress::Base::Common::Parse_unsigned, 16 * 1024], + 'autoclose' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'strict' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'append' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'prime' => [IO::Compress::Base::Common::Parse_any, undef], + 'multistream' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'transparent' => [IO::Compress::Base::Common::Parse_any, 1], + 'scan' => [IO::Compress::Base::Common::Parse_boolean, 0], + 'inputlength' => [IO::Compress::Base::Common::Parse_unsigned, undef], + 'binmodeout' => [IO::Compress::Base::Common::Parse_boolean, 0], + #'decode' => [IO::Compress::Base::Common::Parse_any, undef], + + #'consumeinput' => [IO::Compress::Base::Common::Parse_boolean, 0], + + $self->getExtraParams(), + + #'Todo - Revert to ordinary file on end Z_STREAM_END'=> 0, + # ContinueAfterEof + } ; + + $Valid->{trailingdata} = [IO::Compress::Base::Common::Parse_writable_scalar, undef] + if *$self->{OneShot} ; + + $got->parse($Valid, @_ ) + or $self->croakError("${class}: " . $got->getError()) ; + + $self->postCheckParams($got) + or $self->croakError("${class}: " . $self->error()) ; + + return $got; +} + +sub _create +{ + my $obj = shift; + my $got = shift; + my $append_mode = shift ; + + my $class = ref $obj; + $obj->croakError("$class: Missing Input parameter") + if ! @_ && ! $got ; + + my $inValue = shift ; + + *$obj->{OneShot} = 0 ; + + if (! $got) + { + $got = $obj->checkParams($class, undef, @_) + or return undef ; + } + + my $inType = whatIsInput($inValue, 1); + + $obj->ckInputParam($class, $inValue, 1) + or return undef ; + + *$obj->{InNew} = 1; + + $obj->ckParams($got) + or $obj->croakError("${class}: " . *$obj->{Error}); + + if ($inType eq 'buffer' || $inType eq 'code') { + *$obj->{Buffer} = $inValue ; + *$obj->{InputEvent} = $inValue + if $inType eq 'code' ; + } + else { + if ($inType eq 'handle') { + *$obj->{FH} = $inValue ; + *$obj->{Handle} = 1 ; + + # Need to rewind for Scan + *$obj->{FH}->seek(0, SEEK_SET) + if $got->getValue('scan'); + } + else { + no warnings ; + my $mode = '<'; + $mode = '+<' if $got->getValue('scan'); + *$obj->{StdIO} = ($inValue eq '-'); + *$obj->{FH} = new IO::File "$mode $inValue" + or return $obj->saveErrorString(undef, "cannot open file '$inValue': $!", $!) ; + } + + *$obj->{LineNo} = $. = 0; + setBinModeInput(*$obj->{FH}) ; + + my $buff = "" ; + *$obj->{Buffer} = \$buff ; + } + +# if ($got->getValue('decode')) { +# my $want_encoding = $got->getValue('decode'); +# *$obj->{Encoding} = IO::Compress::Base::Common::getEncoding($obj, $class, $want_encoding); +# } +# else { +# *$obj->{Encoding} = undef; +# } + + *$obj->{InputLength} = $got->parsed('inputlength') + ? $got->getValue('inputlength') + : undef ; + *$obj->{InputLengthRemaining} = $got->getValue('inputlength'); + *$obj->{BufferOffset} = 0 ; + *$obj->{AutoClose} = $got->getValue('autoclose'); + *$obj->{Strict} = $got->getValue('strict'); + *$obj->{BlockSize} = $got->getValue('blocksize'); + *$obj->{Append} = $got->getValue('append'); + *$obj->{AppendOutput} = $append_mode || $got->getValue('append'); + *$obj->{ConsumeInput} = $got->getValue('consumeinput'); + *$obj->{Transparent} = $got->getValue('transparent'); + *$obj->{MultiStream} = $got->getValue('multistream'); + + # TODO - move these two into RawDeflate + *$obj->{Scan} = $got->getValue('scan'); + *$obj->{ParseExtra} = $got->getValue('parseextra') + || $got->getValue('strict') ; + *$obj->{Type} = ''; + *$obj->{Prime} = $got->getValue('prime') || '' ; + *$obj->{Pending} = ''; + *$obj->{Plain} = 0; + *$obj->{PlainBytesRead} = 0; + *$obj->{InflatedBytesRead} = 0; + *$obj->{UnCompSize} = new U64; + *$obj->{CompSize} = new U64; + *$obj->{TotalInflatedBytesRead} = 0; + *$obj->{NewStream} = 0 ; + *$obj->{EventEof} = 0 ; + *$obj->{ClassName} = $class ; + *$obj->{Params} = $got ; + + if (*$obj->{ConsumeInput}) { + *$obj->{InNew} = 0; + *$obj->{Closed} = 0; + return $obj + } + + my $status = $obj->mkUncomp($got); + + return undef + unless defined $status; + + *$obj->{InNew} = 0; + *$obj->{Closed} = 0; + + if ($status) { + # Need to try uncompressing to catch the case + # where the compressed file uncompresses to an + # empty string - so eof is set immediately. + + my $out_buffer = ''; + + $status = $obj->read(\$out_buffer); + + if ($status < 0) { + *$obj->{ReadStatus} = [ $status, $obj->error(), $obj->errorNo() ]; + } + + $obj->ungetc($out_buffer) + if length $out_buffer; + } + else { + return undef + unless *$obj->{Transparent}; + + $obj->clearError(); + *$obj->{Type} = 'plain'; + *$obj->{Plain} = 1; + $obj->pushBack(*$obj->{HeaderPending}) ; + } + + push @{ *$obj->{InfoList} }, *$obj->{Info} ; + + $obj->saveStatus(STATUS_OK) ; + *$obj->{InNew} = 0; + *$obj->{Closed} = 0; + + return $obj; +} + +sub ckInputParam +{ + my $self = shift ; + my $from = shift ; + my $inType = whatIsInput($_[0], $_[1]); + + $self->croakError("$from: input parameter not a filename, filehandle, array ref or scalar ref") + if ! $inType ; + +# if ($inType eq 'filename' ) +# { +# return $self->saveErrorString(1, "$from: input filename is undef or null string", STATUS_ERROR) +# if ! defined $_[0] || $_[0] eq '' ; +# +# if ($_[0] ne '-' && ! -e $_[0] ) +# { +# return $self->saveErrorString(1, +# "input file '$_[0]' does not exist", STATUS_ERROR); +# } +# } + + return 1; +} + + +sub _inf +{ + my $obj = shift ; + + my $class = (caller)[0] ; + my $name = (caller(1))[3] ; + + $obj->croakError("$name: expected at least 1 parameters\n") + unless @_ >= 1 ; + + my $input = shift ; + my $haveOut = @_ ; + my $output = shift ; + + + my $x = new IO::Compress::Base::Validator($class, *$obj->{Error}, $name, $input, $output) + or return undef ; + + push @_, $output if $haveOut && $x->{Hash}; + + *$obj->{OneShot} = 1 ; + + my $got = $obj->checkParams($name, undef, @_) + or return undef ; + + if ($got->parsed('trailingdata')) + { +# my $value = $got->valueRef('TrailingData'); +# warn "TD $value "; +# #$value = $$value; +## warn "TD $value $$value "; +# +# return retErr($obj, "Parameter 'TrailingData' not writable") +# if readonly $$value ; +# +# if (ref $$value) +# { +# return retErr($obj,"Parameter 'TrailingData' not a scalar reference") +# if ref $$value ne 'SCALAR' ; +# +# *$obj->{TrailingData} = $$value ; +# } +# else +# { +# return retErr($obj,"Parameter 'TrailingData' not a scalar") +# if ref $value ne 'SCALAR' ; +# +# *$obj->{TrailingData} = $value ; +# } + + *$obj->{TrailingData} = $got->getValue('trailingdata'); + } + + *$obj->{MultiStream} = $got->getValue('multistream'); + $got->setValue('multistream', 0); + + $x->{Got} = $got ; + +# if ($x->{Hash}) +# { +# while (my($k, $v) = each %$input) +# { +# $v = \$input->{$k} +# unless defined $v ; +# +# $obj->_singleTarget($x, $k, $v, @_) +# or return undef ; +# } +# +# return keys %$input ; +# } + + if ($x->{GlobMap}) + { + $x->{oneInput} = 1 ; + foreach my $pair (@{ $x->{Pairs} }) + { + my ($from, $to) = @$pair ; + $obj->_singleTarget($x, $from, $to, @_) + or return undef ; + } + + return scalar @{ $x->{Pairs} } ; + } + + if (! $x->{oneOutput} ) + { + my $inFile = ($x->{inType} eq 'filenames' + || $x->{inType} eq 'filename'); + + $x->{inType} = $inFile ? 'filename' : 'buffer'; + + foreach my $in ($x->{oneInput} ? $input : @$input) + { + my $out ; + $x->{oneInput} = 1 ; + + $obj->_singleTarget($x, $in, $output, @_) + or return undef ; + } + + return 1 ; + } + + # finally the 1 to 1 and n to 1 + return $obj->_singleTarget($x, $input, $output, @_); + + croak "should not be here" ; +} + +sub retErr +{ + my $x = shift ; + my $string = shift ; + + ${ $x->{Error} } = $string ; + + return undef ; +} + +sub _singleTarget +{ + my $self = shift ; + my $x = shift ; + my $input = shift; + my $output = shift; + + my $buff = ''; + $x->{buff} = \$buff ; + + my $fh ; + if ($x->{outType} eq 'filename') { + my $mode = '>' ; + $mode = '>>' + if $x->{Got}->getValue('append') ; + $x->{fh} = new IO::File "$mode $output" + or return retErr($x, "cannot open file '$output': $!") ; + binmode $x->{fh} if $x->{Got}->valueOrDefault('binmodeout'); + + } + + elsif ($x->{outType} eq 'handle') { + $x->{fh} = $output; + binmode $x->{fh} if $x->{Got}->valueOrDefault('binmodeout'); + if ($x->{Got}->getValue('append')) { + seek($x->{fh}, 0, SEEK_END) + or return retErr($x, "Cannot seek to end of output filehandle: $!") ; + } + } + + + elsif ($x->{outType} eq 'buffer' ) + { + $$output = '' + unless $x->{Got}->getValue('append'); + $x->{buff} = $output ; + } + + if ($x->{oneInput}) + { + defined $self->_rd2($x, $input, $output) + or return undef; + } + else + { + for my $element ( ($x->{inType} eq 'hash') ? keys %$input : @$input) + { + defined $self->_rd2($x, $element, $output) + or return undef ; + } + } + + + if ( ($x->{outType} eq 'filename' && $output ne '-') || + ($x->{outType} eq 'handle' && $x->{Got}->getValue('autoclose'))) { + $x->{fh}->close() + or return retErr($x, $!); + delete $x->{fh}; + } + + return 1 ; +} + +sub _rd2 +{ + my $self = shift ; + my $x = shift ; + my $input = shift; + my $output = shift; + + my $z = IO::Compress::Base::Common::createSelfTiedObject($x->{Class}, *$self->{Error}); + + $z->_create($x->{Got}, 1, $input, @_) + or return undef ; + + my $status ; + my $fh = $x->{fh}; + + while (1) { + + while (($status = $z->read($x->{buff})) > 0) { + if ($fh) { + local $\; + print $fh ${ $x->{buff} } + or return $z->saveErrorString(undef, "Error writing to output file: $!", $!); + ${ $x->{buff} } = '' ; + } + } + + if (! $x->{oneOutput} ) { + my $ot = $x->{outType} ; + + if ($ot eq 'array') + { push @$output, $x->{buff} } + elsif ($ot eq 'hash') + { $output->{$input} = $x->{buff} } + + my $buff = ''; + $x->{buff} = \$buff; + } + + last if $status < 0 || $z->smartEof(); + + last + unless *$self->{MultiStream}; + + $status = $z->nextStream(); + + last + unless $status == 1 ; + } + + return $z->closeError(undef) + if $status < 0 ; + + ${ *$self->{TrailingData} } = $z->trailingData() + if defined *$self->{TrailingData} ; + + $z->close() + or return undef ; + + return 1 ; +} + +sub TIEHANDLE +{ + return $_[0] if ref($_[0]); + die "OOPS\n" ; + +} + +sub UNTIE +{ + my $self = shift ; +} + + +sub getHeaderInfo +{ + my $self = shift ; + wantarray ? @{ *$self->{InfoList} } : *$self->{Info}; +} + +sub readBlock +{ + my $self = shift ; + my $buff = shift ; + my $size = shift ; + + if (defined *$self->{CompressedInputLength}) { + if (*$self->{CompressedInputLengthRemaining} == 0) { + delete *$self->{CompressedInputLength}; + *$self->{CompressedInputLengthDone} = 1; + return STATUS_OK ; + } + $size = List::Util::min($size, *$self->{CompressedInputLengthRemaining} ); + *$self->{CompressedInputLengthRemaining} -= $size ; + } + + my $status = $self->smartRead($buff, $size) ; + return $self->saveErrorString(STATUS_ERROR, "Error Reading Data: $!", $!) + if $status == STATUS_ERROR ; + + if ($status == 0 ) { + *$self->{Closed} = 1 ; + *$self->{EndStream} = 1 ; + return $self->saveErrorString(STATUS_ERROR, "unexpected end of file", STATUS_ERROR); + } + + return STATUS_OK; +} + +sub postBlockChk +{ + return STATUS_OK; +} + +sub _raw_read +{ + # return codes + # >0 - ok, number of bytes read + # =0 - ok, eof + # <0 - not ok + + my $self = shift ; + + return G_EOF if *$self->{Closed} ; + return G_EOF if *$self->{EndStream} ; + + my $buffer = shift ; + my $scan_mode = shift ; + + if (*$self->{Plain}) { + my $tmp_buff ; + my $len = $self->smartRead(\$tmp_buff, *$self->{BlockSize}) ; + + return $self->saveErrorString(G_ERR, "Error reading data: $!", $!) + if $len == STATUS_ERROR ; + + if ($len == 0 ) { + *$self->{EndStream} = 1 ; + } + else { + *$self->{PlainBytesRead} += $len ; + $$buffer .= $tmp_buff; + } + + return $len ; + } + + if (*$self->{NewStream}) { + + $self->gotoNextStream() > 0 + or return G_ERR; + + # For the headers that actually uncompressed data, put the + # uncompressed data into the output buffer. + $$buffer .= *$self->{Pending} ; + my $len = length *$self->{Pending} ; + *$self->{Pending} = ''; + return $len; + } + + my $temp_buf = ''; + my $outSize = 0; + my $status = $self->readBlock(\$temp_buf, *$self->{BlockSize}, $outSize) ; + + return G_ERR + if $status == STATUS_ERROR ; + + my $buf_len = 0; + if ($status == STATUS_OK) { + my $beforeC_len = length $temp_buf; + my $before_len = defined $$buffer ? length $$buffer : 0 ; + $status = *$self->{Uncomp}->uncompr(\$temp_buf, $buffer, + defined *$self->{CompressedInputLengthDone} || + $self->smartEof(), $outSize); + + # Remember the input buffer if it wasn't consumed completely + $self->pushBack($temp_buf) if *$self->{Uncomp}{ConsumesInput}; + + return $self->saveErrorString(G_ERR, *$self->{Uncomp}{Error}, *$self->{Uncomp}{ErrorNo}) + if $self->saveStatus($status) == STATUS_ERROR; + + $self->postBlockChk($buffer, $before_len) == STATUS_OK + or return G_ERR; + + $buf_len = defined $$buffer ? length($$buffer) - $before_len : 0; + + *$self->{CompSize}->add($beforeC_len - length $temp_buf) ; + + *$self->{InflatedBytesRead} += $buf_len ; + *$self->{TotalInflatedBytesRead} += $buf_len ; + *$self->{UnCompSize}->add($buf_len) ; + + $self->filterUncompressed($buffer, $before_len); + +# if (*$self->{Encoding}) { +# use Encode ; +# *$self->{PendingDecode} .= substr($$buffer, $before_len) ; +# my $got = *$self->{Encoding}->decode(*$self->{PendingDecode}, Encode::FB_QUIET) ; +# substr($$buffer, $before_len) = $got; +# } + } + + if ($status == STATUS_ENDSTREAM) { + + *$self->{EndStream} = 1 ; + + my $trailer; + my $trailer_size = *$self->{Info}{TrailerLength} ; + my $got = 0; + if (*$self->{Info}{TrailerLength}) + { + $got = $self->smartRead(\$trailer, $trailer_size) ; + } + + if ($got == $trailer_size) { + $self->chkTrailer($trailer) == STATUS_OK + or return G_ERR; + } + else { + return $self->TrailerError("trailer truncated. Expected " . + "$trailer_size bytes, got $got") + if *$self->{Strict}; + $self->pushBack($trailer) ; + } + + # TODO - if want file pointer, do it here + + if (! $self->smartEof()) { + *$self->{NewStream} = 1 ; + + if (*$self->{MultiStream}) { + *$self->{EndStream} = 0 ; + return $buf_len ; + } + } + + } + + + # return the number of uncompressed bytes read + return $buf_len ; +} + +sub reset +{ + my $self = shift ; + + return *$self->{Uncomp}->reset(); +} + +sub filterUncompressed +{ +} + +#sub isEndStream +#{ +# my $self = shift ; +# return *$self->{NewStream} || +# *$self->{EndStream} ; +#} + +sub nextStream +{ + my $self = shift ; + + my $status = $self->gotoNextStream(); + $status == 1 + or return $status ; + + *$self->{TotalInflatedBytesRead} = 0 ; + *$self->{LineNo} = $. = 0; + + return 1; +} + +sub gotoNextStream +{ + my $self = shift ; + + if (! *$self->{NewStream}) { + my $status = 1; + my $buffer ; + + # TODO - make this more efficient if know the offset for the end of + # the stream and seekable + $status = $self->read($buffer) + while $status > 0 ; + + return $status + if $status < 0; + } + + *$self->{NewStream} = 0 ; + *$self->{EndStream} = 0 ; + *$self->{CompressedInputLengthDone} = undef ; + *$self->{CompressedInputLength} = undef ; + $self->reset(); + *$self->{UnCompSize}->reset(); + *$self->{CompSize}->reset(); + + my $magic = $self->ckMagic(); + + if ( ! defined $magic) { + if (! *$self->{Transparent} || $self->eof()) + { + *$self->{EndStream} = 1 ; + return 0; + } + + $self->clearError(); + *$self->{Type} = 'plain'; + *$self->{Plain} = 1; + $self->pushBack(*$self->{HeaderPending}) ; + } + else + { + *$self->{Info} = $self->readHeader($magic); + + if ( ! defined *$self->{Info} ) { + *$self->{EndStream} = 1 ; + return -1; + } + } + + push @{ *$self->{InfoList} }, *$self->{Info} ; + + return 1; +} + +sub streamCount +{ + my $self = shift ; + return 1 if ! defined *$self->{InfoList}; + return scalar @{ *$self->{InfoList} } ; +} + +#sub read +#{ +# my $status = myRead(@_); +# return undef if $status < 0; +# return $status; +#} + +sub read +{ + # return codes + # >0 - ok, number of bytes read + # =0 - ok, eof + # <0 - not ok + + my $self = shift ; + + if (defined *$self->{ReadStatus} ) { + my $status = *$self->{ReadStatus}[0]; + $self->saveErrorString( @{ *$self->{ReadStatus} } ); + delete *$self->{ReadStatus} ; + return $status ; + } + + return G_EOF if *$self->{Closed} ; + + my $buffer ; + + if (ref $_[0] ) { + $self->croakError(*$self->{ClassName} . "::read: buffer parameter is read-only") + if Scalar::Util::readonly(${ $_[0] }); + + $self->croakError(*$self->{ClassName} . "::read: not a scalar reference $_[0]" ) + unless ref $_[0] eq 'SCALAR' ; + $buffer = $_[0] ; + } + else { + $self->croakError(*$self->{ClassName} . "::read: buffer parameter is read-only") + if Scalar::Util::readonly($_[0]); + + $buffer = \$_[0] ; + } + + my $length = $_[1] ; + my $offset = $_[2] || 0; + + if (! *$self->{AppendOutput}) { + if (! $offset) { + $$buffer = '' ; + } + else { + if ($offset > length($$buffer)) { + $$buffer .= "\x00" x ($offset - length($$buffer)); + } + else { + substr($$buffer, $offset) = ''; + } + } + } + elsif (! defined $$buffer) { + $$buffer = '' ; + } + + return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ; + + # the core read will return 0 if asked for 0 bytes + return 0 if defined $length && $length == 0 ; + + $length = $length || 0; + + $self->croakError(*$self->{ClassName} . "::read: length parameter is negative") + if $length < 0 ; + + # Short-circuit if this is a simple read, with no length + # or offset specified. + unless ( $length || $offset) { + if (length *$self->{Pending}) { + $$buffer .= *$self->{Pending} ; + my $len = length *$self->{Pending}; + *$self->{Pending} = '' ; + return $len ; + } + else { + my $len = 0; + $len = $self->_raw_read($buffer) + while ! *$self->{EndStream} && $len == 0 ; + return $len ; + } + } + + # Need to jump through more hoops - either length or offset + # or both are specified. + my $out_buffer = *$self->{Pending} ; + *$self->{Pending} = ''; + + + while (! *$self->{EndStream} && length($out_buffer) < $length) + { + my $buf_len = $self->_raw_read(\$out_buffer); + return $buf_len + if $buf_len < 0 ; + } + + $length = length $out_buffer + if length($out_buffer) < $length ; + + return 0 + if $length == 0 ; + + $$buffer = '' + if ! defined $$buffer; + + $offset = length $$buffer + if *$self->{AppendOutput} ; + + *$self->{Pending} = $out_buffer; + $out_buffer = \*$self->{Pending} ; + + substr($$buffer, $offset) = substr($$out_buffer, 0, $length) ; + substr($$out_buffer, 0, $length) = '' ; + + return $length ; +} + +sub _getline +{ + my $self = shift ; + my $status = 0 ; + + # Slurp Mode + if ( ! defined $/ ) { + my $data ; + 1 while ($status = $self->read($data)) > 0 ; + return ($status, \$data); + } + + # Record Mode + if ( ref $/ eq 'SCALAR' && ${$/} =~ /^\d+$/ && ${$/} > 0) { + my $reclen = ${$/} ; + my $data ; + $status = $self->read($data, $reclen) ; + return ($status, \$data); + } + + # Paragraph Mode + if ( ! length $/ ) { + my $paragraph ; + while (($status = $self->read($paragraph)) > 0 ) { + if ($paragraph =~ s/^(.*?\n\n+)//s) { + *$self->{Pending} = $paragraph ; + my $par = $1 ; + return (1, \$par); + } + } + return ($status, \$paragraph); + } + + # $/ isn't empty, or a reference, so it's Line Mode. + { + my $line ; + my $p = \*$self->{Pending} ; + while (($status = $self->read($line)) > 0 ) { + my $offset = index($line, $/); + if ($offset >= 0) { + my $l = substr($line, 0, $offset + length $/ ); + substr($line, 0, $offset + length $/) = ''; + $$p = $line; + return (1, \$l); + } + } + + return ($status, \$line); + } +} + +sub getline +{ + my $self = shift; + + if (defined *$self->{ReadStatus} ) { + $self->saveErrorString( @{ *$self->{ReadStatus} } ); + delete *$self->{ReadStatus} ; + return undef; + } + + return undef + if *$self->{Closed} || (!length *$self->{Pending} && *$self->{EndStream}) ; + + my $current_append = *$self->{AppendOutput} ; + *$self->{AppendOutput} = 1; + + my ($status, $lineref) = $self->_getline(); + *$self->{AppendOutput} = $current_append; + + return undef + if $status < 0 || length $$lineref == 0 ; + + $. = ++ *$self->{LineNo} ; + + return $$lineref ; +} + +sub getlines +{ + my $self = shift; + $self->croakError(*$self->{ClassName} . + "::getlines: called in scalar context\n") unless wantarray; + my($line, @lines); + push(@lines, $line) + while defined($line = $self->getline); + return @lines; +} + +sub READLINE +{ + goto &getlines if wantarray; + goto &getline; +} + +sub getc +{ + my $self = shift; + my $buf; + return $buf if $self->read($buf, 1); + return undef; +} + +sub ungetc +{ + my $self = shift; + *$self->{Pending} = "" unless defined *$self->{Pending} ; + *$self->{Pending} = $_[0] . *$self->{Pending} ; +} + + +sub trailingData +{ + my $self = shift ; + + if (defined *$self->{FH} || defined *$self->{InputEvent} ) { + return *$self->{Prime} ; + } + else { + my $buf = *$self->{Buffer} ; + my $offset = *$self->{BufferOffset} ; + return substr($$buf, $offset) ; + } +} + + +sub eof +{ + my $self = shift ; + + return (*$self->{Closed} || + (!length *$self->{Pending} + && ( $self->smartEof() || *$self->{EndStream}))) ; +} + +sub tell +{ + my $self = shift ; + + my $in ; + if (*$self->{Plain}) { + $in = *$self->{PlainBytesRead} ; + } + else { + $in = *$self->{TotalInflatedBytesRead} ; + } + + my $pending = length *$self->{Pending} ; + + return 0 if $pending > $in ; + return $in - $pending ; +} + +sub close +{ + # todo - what to do if close is called before the end of the gzip file + # do we remember any trailing data? + my $self = shift ; + + return 1 if *$self->{Closed} ; + + untie *$self + if $] >= 5.008 ; + + my $status = 1 ; + + if (defined *$self->{FH}) { + if ((! *$self->{Handle} || *$self->{AutoClose}) && ! *$self->{StdIO}) { + local $.; + $! = 0 ; + $status = *$self->{FH}->close(); + return $self->saveErrorString(0, $!, $!) + if !*$self->{InNew} && $self->saveStatus($!) != 0 ; + } + delete *$self->{FH} ; + $! = 0 ; + } + *$self->{Closed} = 1 ; + + return 1; +} + +sub DESTROY +{ + my $self = shift ; + local ($., $@, $!, $^E, $?); + + $self->close() ; +} + +sub seek +{ + my $self = shift ; + my $position = shift; + my $whence = shift ; + + my $here = $self->tell() ; + my $target = 0 ; + + + if ($whence == SEEK_SET) { + $target = $position ; + } + elsif ($whence == SEEK_CUR) { + $target = $here + $position ; + } + elsif ($whence == SEEK_END) { + $target = $position ; + $self->croakError(*$self->{ClassName} . "::seek: SEEK_END not allowed") ; + } + else { + $self->croakError(*$self->{ClassName} ."::seek: unknown value, $whence, for whence parameter"); + } + + # short circuit if seeking to current offset + if ($target == $here) { + # On ordinary filehandles, seeking to the current + # position also clears the EOF condition, so we + # emulate this behavior locally while simultaneously + # cascading it to the underlying filehandle + if (*$self->{Plain}) { + *$self->{EndStream} = 0; + seek(*$self->{FH},0,1) if *$self->{FH}; + } + return 1; + } + + # Outlaw any attempt to seek backwards + $self->croakError( *$self->{ClassName} ."::seek: cannot seek backwards") + if $target < $here ; + + # Walk the file to the new offset + my $offset = $target - $here ; + + my $got; + while (($got = $self->read(my $buffer, List::Util::min($offset, *$self->{BlockSize})) ) > 0) + { + $offset -= $got; + last if $offset == 0 ; + } + + $here = $self->tell() ; + return $offset == 0 ? 1 : 0 ; +} + +sub fileno +{ + my $self = shift ; + return defined *$self->{FH} + ? fileno *$self->{FH} + : undef ; +} + +sub binmode +{ + 1; +# my $self = shift ; +# return defined *$self->{FH} +# ? binmode *$self->{FH} +# : 1 ; +} + +sub opened +{ + my $self = shift ; + return ! *$self->{Closed} ; +} + +sub autoflush +{ + my $self = shift ; + return defined *$self->{FH} + ? *$self->{FH}->autoflush(@_) + : undef ; +} + +sub input_line_number +{ + my $self = shift ; + my $last = *$self->{LineNo}; + $. = *$self->{LineNo} = $_[1] if @_ ; + return $last; +} + + +*BINMODE = \&binmode; +*SEEK = \&seek; +*READ = \&read; +*sysread = \&read; +*TELL = \&tell; +*EOF = \&eof; + +*FILENO = \&fileno; +*CLOSE = \&close; + +sub _notAvailable +{ + my $name = shift ; + return sub { croak "$name Not Available: File opened only for intput" ; } ; +} + + +*print = _notAvailable('print'); +*PRINT = _notAvailable('print'); +*printf = _notAvailable('printf'); +*PRINTF = _notAvailable('printf'); +*write = _notAvailable('write'); +*WRITE = _notAvailable('write'); + +#*sysread = \&read; +#*syswrite = \&_notAvailable; + + + +package IO::Uncompress::Base ; + + +1 ; +__END__ + +package IO::Uncompress::RawInflate ; +# for RFC1951 + +use strict ; +use warnings; +use bytes; + +use Compress::Raw::Zlib 2.074 ; +use IO::Compress::Base::Common 2.074 qw(:Status ); + +use IO::Uncompress::Base 2.074 ; +use IO::Uncompress::Adapter::Inflate 2.074 ; + +require Exporter ; +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, %DEFLATE_CONSTANTS, $RawInflateError); + +$VERSION = '2.074'; +$RawInflateError = ''; + +@ISA = qw(IO::Uncompress::Base Exporter); +@EXPORT_OK = qw( $RawInflateError rawinflate ) ; +%DEFLATE_CONSTANTS = (); +%EXPORT_TAGS = %IO::Uncompress::Base::EXPORT_TAGS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + +#{ +# # Execute at runtime +# my %bad; +# for my $module (qw(Compress::Raw::Zlib IO::Compress::Base::Common IO::Uncompress::Base IO::Uncompress::Adapter::Inflate)) +# { +# my $ver = ${ $module . "::VERSION"} ; +# +# $bad{$module} = $ver +# if $ver ne $VERSION; +# } +# +# if (keys %bad) +# { +# my $string = join "\n", map { "$_ $bad{$_}" } keys %bad; +# die caller(0)[0] . "needs version $VERSION mismatch\n$string\n"; +# } +#} + +sub new +{ + my $class = shift ; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$RawInflateError); + $obj->_create(undef, 0, @_); +} + +sub rawinflate +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$RawInflateError); + return $obj->_inf(@_); +} + +sub getExtraParams +{ + return (); +} + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + return 1; +} + +sub mkUncomp +{ + my $self = shift ; + my $got = shift ; + + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject( + $got->getValue('crc32'), + $got->getValue('adler32'), + $got->getValue('scan'), + ); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + my $magic = $self->ckMagic() + or return 0; + + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + return 1; + +} + + +sub ckMagic +{ + my $self = shift; + + return $self->_isRaw() ; +} + +sub readHeader +{ + my $self = shift; + my $magic = shift ; + + return { + 'Type' => 'rfc1951', + 'FingerprintLength' => 0, + 'HeaderLength' => 0, + 'TrailerLength' => 0, + 'Header' => '' + }; +} + +sub chkTrailer +{ + return STATUS_OK ; +} + +sub _isRaw +{ + my $self = shift ; + + my $got = $self->_isRawx(@_); + + if ($got) { + *$self->{Pending} = *$self->{HeaderPending} ; + } + else { + $self->pushBack(*$self->{HeaderPending}); + *$self->{Uncomp}->reset(); + } + *$self->{HeaderPending} = ''; + + return $got ; +} + +sub _isRawx +{ + my $self = shift ; + my $magic = shift ; + + $magic = '' unless defined $magic ; + + my $buffer = ''; + + $self->smartRead(\$buffer, *$self->{BlockSize}) >= 0 + or return $self->saveErrorString(undef, "No data to read"); + + my $temp_buf = $magic . $buffer ; + *$self->{HeaderPending} = $temp_buf ; + $buffer = ''; + my $status = *$self->{Uncomp}->uncompr(\$temp_buf, \$buffer, $self->smartEof()) ; + + return $self->saveErrorString(undef, *$self->{Uncomp}{Error}, STATUS_ERROR) + if $status == STATUS_ERROR; + + $self->pushBack($temp_buf) ; + + return $self->saveErrorString(undef, "unexpected end of file", STATUS_ERROR) + if $self->smartEof() && $status != STATUS_ENDSTREAM; + + #my $buf_len = *$self->{Uncomp}->uncompressedBytes(); + my $buf_len = length $buffer; + + if ($status == STATUS_ENDSTREAM) { + if (*$self->{MultiStream} + && (length $temp_buf || ! $self->smartEof())){ + *$self->{NewStream} = 1 ; + *$self->{EndStream} = 0 ; + } + else { + *$self->{EndStream} = 1 ; + } + } + *$self->{HeaderPending} = $buffer ; + *$self->{InflatedBytesRead} = $buf_len ; + *$self->{TotalInflatedBytesRead} += $buf_len ; + *$self->{Type} = 'rfc1951'; + + $self->saveStatus(STATUS_OK); + + return { + 'Type' => 'rfc1951', + 'HeaderLength' => 0, + 'TrailerLength' => 0, + 'Header' => '' + }; +} + + +sub inflateSync +{ + my $self = shift ; + + # inflateSync is a no-op in Plain mode + return 1 + if *$self->{Plain} ; + + return 0 if *$self->{Closed} ; + #return G_EOF if !length *$self->{Pending} && *$self->{EndStream} ; + return 0 if ! length *$self->{Pending} && *$self->{EndStream} ; + + # Disable CRC check + *$self->{Strict} = 0 ; + + my $status ; + while (1) + { + my $temp_buf ; + + if (length *$self->{Pending} ) + { + $temp_buf = *$self->{Pending} ; + *$self->{Pending} = ''; + } + else + { + $status = $self->smartRead(\$temp_buf, *$self->{BlockSize}) ; + return $self->saveErrorString(0, "Error Reading Data") + if $status < 0 ; + + if ($status == 0 ) { + *$self->{EndStream} = 1 ; + return $self->saveErrorString(0, "unexpected end of file", STATUS_ERROR); + } + } + + $status = *$self->{Uncomp}->sync($temp_buf) ; + + if ($status == STATUS_OK) + { + *$self->{Pending} .= $temp_buf ; + return 1 ; + } + + last unless $status == STATUS_ERROR ; + } + + return 0; +} + +#sub performScan +#{ +# my $self = shift ; +# +# my $status ; +# my $end_offset = 0; +# +# $status = $self->scan() +# #or return $self->saveErrorString(undef, "Error Scanning: $$error_ref", $self->errorNo) ; +# or return $self->saveErrorString(G_ERR, "Error Scanning: $status") +# +# $status = $self->zap($end_offset) +# or return $self->saveErrorString(G_ERR, "Error Zapping: $status"); +# #or return $self->saveErrorString(undef, "Error Zapping: $$error_ref", $self->errorNo) ; +# +# #(*$obj->{Deflate}, $status) = $inf->createDeflate(); +# +## *$obj->{Header} = *$inf->{Info}{Header}; +## *$obj->{UnCompSize_32bit} = +## *$obj->{BytesWritten} = *$inf->{UnCompSize_32bit} ; +## *$obj->{CompSize_32bit} = *$inf->{CompSize_32bit} ; +# +# +## if ( $outType eq 'buffer') +## { substr( ${ *$self->{Buffer} }, $end_offset) = '' } +## elsif ($outType eq 'handle' || $outType eq 'filename') { +## *$self->{FH} = *$inf->{FH} ; +## delete *$inf->{FH}; +## *$obj->{FH}->flush() ; +## *$obj->{Handle} = 1 if $outType eq 'handle'; +## +## #seek(*$obj->{FH}, $end_offset, SEEK_SET) +## *$obj->{FH}->seek($end_offset, SEEK_SET) +## or return $obj->saveErrorString(undef, $!, $!) ; +## } +# +#} + +sub scan +{ + my $self = shift ; + + return 1 if *$self->{Closed} ; + return 1 if !length *$self->{Pending} && *$self->{EndStream} ; + + my $buffer = '' ; + my $len = 0; + + $len = $self->_raw_read(\$buffer, 1) + while ! *$self->{EndStream} && $len >= 0 ; + + #return $len if $len < 0 ? $len : 0 ; + return $len < 0 ? 0 : 1 ; +} + +sub zap +{ + my $self = shift ; + + my $headerLength = *$self->{Info}{HeaderLength}; + my $block_offset = $headerLength + *$self->{Uncomp}->getLastBlockOffset(); + $_[0] = $headerLength + *$self->{Uncomp}->getEndOffset(); + #printf "# End $_[0], headerlen $headerLength \n";; + #printf "# block_offset $block_offset %x\n", $block_offset; + my $byte ; + ( $self->smartSeek($block_offset) && + $self->smartRead(\$byte, 1) ) + or return $self->saveErrorString(0, $!, $!); + + #printf "#byte is %x\n", unpack('C*',$byte); + *$self->{Uncomp}->resetLastBlockByte($byte); + #printf "#to byte is %x\n", unpack('C*',$byte); + + ( $self->smartSeek($block_offset) && + $self->smartWrite($byte) ) + or return $self->saveErrorString(0, $!, $!); + + #$self->smartSeek($end_offset, 1); + + return 1 ; +} + +sub createDeflate +{ + my $self = shift ; + my ($def, $status) = *$self->{Uncomp}->createDeflateStream( + -AppendOutput => 1, + -WindowBits => - MAX_WBITS, + -CRC32 => *$self->{Params}->getValue('crc32'), + -ADLER32 => *$self->{Params}->getValue('adler32'), + ); + + return wantarray ? ($status, $def) : $def ; +} + + +1; + +__END__ + + +package IO::Uncompress::AnyInflate ; + +# for RFC1950, RFC1951 or RFC1952 + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 (); + +use IO::Uncompress::Adapter::Inflate 2.074 (); + + +use IO::Uncompress::Base 2.074 ; +use IO::Uncompress::Gunzip 2.074 ; +use IO::Uncompress::Inflate 2.074 ; +use IO::Uncompress::RawInflate 2.074 ; +use IO::Uncompress::Unzip 2.074 ; + +require Exporter ; + +our ($VERSION, @ISA, @EXPORT_OK, %EXPORT_TAGS, $AnyInflateError); + +$VERSION = '2.074'; +$AnyInflateError = ''; + +@ISA = qw(IO::Uncompress::Base Exporter); +@EXPORT_OK = qw( $AnyInflateError anyinflate ) ; +%EXPORT_TAGS = %IO::Uncompress::Base::DEFLATE_CONSTANTS ; +push @{ $EXPORT_TAGS{all} }, @EXPORT_OK ; +Exporter::export_ok_tags('all'); + +# TODO - allow the user to pick a set of the three formats to allow +# or just assume want to auto-detect any of the three formats. + +sub new +{ + my $class = shift ; + my $obj = IO::Compress::Base::Common::createSelfTiedObject($class, \$AnyInflateError); + $obj->_create(undef, 0, @_); +} + +sub anyinflate +{ + my $obj = IO::Compress::Base::Common::createSelfTiedObject(undef, \$AnyInflateError); + return $obj->_inf(@_) ; +} + +sub getExtraParams +{ + use IO::Compress::Base::Common 2.074 qw(:Parse); + return ( 'rawinflate' => [Parse_boolean, 0] ) ; +} + +sub ckParams +{ + my $self = shift ; + my $got = shift ; + + # any always needs both crc32 and adler32 + $got->setValue('crc32' => 1); + $got->setValue('adler32' => 1); + + return 1; +} + +sub mkUncomp +{ + my $self = shift ; + my $got = shift ; + + my ($obj, $errstr, $errno) = IO::Uncompress::Adapter::Inflate::mkUncompObject(); + + return $self->saveErrorString(undef, $errstr, $errno) + if ! defined $obj; + + *$self->{Uncomp} = $obj; + + my @possible = qw( Inflate Gunzip Unzip ); + unshift @possible, 'RawInflate' + if 1 || $got->getValue('rawinflate'); + + my $magic = $self->ckMagic( @possible ); + + if ($magic) { + *$self->{Info} = $self->readHeader($magic) + or return undef ; + + return 1; + } + + return 0 ; +} + + + +sub ckMagic +{ + my $self = shift; + my @names = @_ ; + + my $keep = ref $self ; + for my $class ( map { "IO::Uncompress::$_" } @names) + { + bless $self => $class; + my $magic = $self->ckMagic(); + + if ($magic) + { + #bless $self => $class; + return $magic ; + } + + $self->pushBack(*$self->{HeaderPending}) ; + *$self->{HeaderPending} = '' ; + } + + bless $self => $keep; + return undef; +} + +1 ; + +__END__ + + +package IO::Uncompress::Adapter::Inflate; + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status); +use Compress::Raw::Zlib 2.074 qw(Z_OK Z_BUF_ERROR Z_STREAM_END Z_FINISH MAX_WBITS); + +our ($VERSION); +$VERSION = '2.074'; + + + +sub mkUncompObject +{ + my $crc32 = shift || 1; + my $adler32 = shift || 1; + my $scan = shift || 0; + + my $inflate ; + my $status ; + + if ($scan) + { + ($inflate, $status) = new Compress::Raw::Zlib::InflateScan + #LimitOutput => 1, + CRC32 => $crc32, + ADLER32 => $adler32, + WindowBits => - MAX_WBITS ; + } + else + { + ($inflate, $status) = new Compress::Raw::Zlib::Inflate + AppendOutput => 1, + LimitOutput => 1, + CRC32 => $crc32, + ADLER32 => $adler32, + WindowBits => - MAX_WBITS ; + } + + return (undef, "Could not create Inflation object: $status", $status) + if $status != Z_OK ; + + return bless {'Inf' => $inflate, + 'CompSize' => 0, + 'UnCompSize' => 0, + 'Error' => '', + 'ConsumesInput' => 1, + } ; + +} + +sub uncompr +{ + my $self = shift ; + my $from = shift ; + my $to = shift ; + my $eof = shift ; + + my $inf = $self->{Inf}; + + my $status = $inf->inflate($from, $to, $eof); + $self->{ErrorNo} = $status; + + if ($status != Z_OK && $status != Z_STREAM_END && $status != Z_BUF_ERROR) + { + $self->{Error} = "Inflation Error: $status"; + return STATUS_ERROR; + } + + return STATUS_OK if $status == Z_BUF_ERROR ; # ??? + return STATUS_OK if $status == Z_OK ; + return STATUS_ENDSTREAM if $status == Z_STREAM_END ; + return STATUS_ERROR ; +} + +sub reset +{ + my $self = shift ; + $self->{Inf}->inflateReset(); + + return STATUS_OK ; +} + +#sub count +#{ +# my $self = shift ; +# $self->{Inf}->inflateCount(); +#} + +sub crc32 +{ + my $self = shift ; + $self->{Inf}->crc32(); +} + +sub compressedBytes +{ + my $self = shift ; + $self->{Inf}->compressedBytes(); +} + +sub uncompressedBytes +{ + my $self = shift ; + $self->{Inf}->uncompressedBytes(); +} + +sub adler32 +{ + my $self = shift ; + $self->{Inf}->adler32(); +} + +sub sync +{ + my $self = shift ; + ( $self->{Inf}->inflateSync(@_) == Z_OK) + ? STATUS_OK + : STATUS_ERROR ; +} + + +sub getLastBlockOffset +{ + my $self = shift ; + $self->{Inf}->getLastBlockOffset(); +} + +sub getEndOffset +{ + my $self = shift ; + $self->{Inf}->getEndOffset(); +} + +sub resetLastBlockByte +{ + my $self = shift ; + $self->{Inf}->resetLastBlockByte(@_); +} + +sub createDeflateStream +{ + my $self = shift ; + my $deflate = $self->{Inf}->createDeflateStream(@_); + return bless {'Def' => $deflate, + 'CompSize' => 0, + 'UnCompSize' => 0, + 'Error' => '', + }, 'IO::Compress::Adapter::Deflate'; +} + +1; + + +__END__ + +package IO::Uncompress::Adapter::Bunzip2; + +use strict; +use warnings; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status); + +use Compress::Raw::Bzip2 2.074 ; + +our ($VERSION, @ISA); +$VERSION = '2.074'; + +sub mkUncompObject +{ + my $small = shift || 0; + my $verbosity = shift || 0; + + my ($inflate, $status) = new Compress::Raw::Bunzip2(1, 1, $small, $verbosity, 1); + + return (undef, "Could not create Inflation object: $status", $status) + if $status != BZ_OK ; + + return bless {'Inf' => $inflate, + 'CompSize' => 0, + 'UnCompSize' => 0, + 'Error' => '', + 'ConsumesInput' => 1, + } ; + +} + +sub uncompr +{ + my $self = shift ; + my $from = shift ; + my $to = shift ; + my $eof = shift ; + + my $inf = $self->{Inf}; + + my $status = $inf->bzinflate($from, $to); + $self->{ErrorNo} = $status; + + if ($status != BZ_OK && $status != BZ_STREAM_END ) + { + $self->{Error} = "Inflation Error: $status"; + return STATUS_ERROR; + } + + + return STATUS_OK if $status == BZ_OK ; + return STATUS_ENDSTREAM if $status == BZ_STREAM_END ; + return STATUS_ERROR ; +} + + +sub reset +{ + my $self = shift ; + + my ($inf, $status) = new Compress::Raw::Bunzip2(); + $self->{ErrorNo} = ($status == BZ_OK) ? 0 : $status ; + + if ($status != BZ_OK) + { + $self->{Error} = "Cannot create Inflate object: $status"; + return STATUS_ERROR; + } + + $self->{Inf} = $inf; + + return STATUS_OK ; +} + +sub compressedBytes +{ + my $self = shift ; + $self->{Inf}->compressedBytes(); +} + +sub uncompressedBytes +{ + my $self = shift ; + $self->{Inf}->uncompressedBytes(); +} + +sub crc32 +{ + my $self = shift ; + #$self->{Inf}->crc32(); +} + +sub adler32 +{ + my $self = shift ; + #$self->{Inf}->adler32(); +} + +sub sync +{ + my $self = shift ; + #( $self->{Inf}->inflateSync(@_) == BZ_OK) + # ? STATUS_OK + # : STATUS_ERROR ; +} + + +1; + +__END__ + +package IO::Uncompress::Adapter::Identity; + +use warnings; +use strict; +use bytes; + +use IO::Compress::Base::Common 2.074 qw(:Status); +use IO::Compress::Zip::Constants ; + +our ($VERSION); + +$VERSION = '2.074'; + +use Compress::Raw::Zlib 2.074 (); + +sub mkUncompObject +{ + my $streaming = shift; + my $zip64 = shift; + + my $crc32 = 1; #shift ; + my $adler32 = shift; + + bless { 'CompSize' => new U64 , # 0, + 'UnCompSize' => 0, + 'wantCRC32' => $crc32, + 'CRC32' => Compress::Raw::Zlib::crc32(''), + 'wantADLER32'=> $adler32, + 'ADLER32' => Compress::Raw::Zlib::adler32(''), + 'ConsumesInput' => 1, + 'Streaming' => $streaming, + 'Zip64' => $zip64, + 'DataHdrSize' => $zip64 ? 24 : 16, + 'Pending' => '', + + } ; +} + + +sub uncompr +{ + my $self = shift; + my $in = $_[0]; + my $eof = $_[2]; + + my $len = length $$in; + my $remainder = ''; + + if (defined $$in && $len) { + + if ($self->{Streaming}) { + + if (length $self->{Pending}) { + $$in = $self->{Pending} . $$in ; + $len = length $$in; + $self->{Pending} = ''; + } + + my $ind = index($$in, "\x50\x4b\x07\x08"); + + if ($ind < 0) { + $len = length $$in; + if ($len >= 3 && substr($$in, -3) eq "\x50\x4b\x07") { + $ind = $len - 3 ; + } + elsif ($len >= 2 && substr($$in, -2) eq "\x50\x4b") { + $ind = $len - 2 ; + } + elsif ($len >= 1 && substr($$in, -1) eq "\x50") { + $ind = $len - 1 ; + } + } + + if ($ind >= 0) { + $remainder = substr($$in, $ind) ; + substr($$in, $ind) = '' ; + } + } + + if (length $remainder && length $remainder < $self->{DataHdrSize}) { + $self->{Pending} = $remainder ; + $remainder = ''; + } + elsif (length $remainder >= $self->{DataHdrSize}) { + my $crc = unpack "V", substr($remainder, 4); + if ($crc == Compress::Raw::Zlib::crc32($$in, $self->{CRC32})) { + my ($l1, $l2) ; + + if ($self->{Zip64}) { + $l1 = U64::newUnpack_V64(substr($remainder, 8)); + $l2 = U64::newUnpack_V64(substr($remainder, 16)); + } + else { + $l1 = U64::newUnpack_V32(substr($remainder, 8)); + $l2 = U64::newUnpack_V32(substr($remainder, 12)); + } + + my $newLen = $self->{CompSize}->clone(); + $newLen->add(length $$in); + if ($l1->equal($l2) && $l1->equal($newLen) ) { + $eof = 1; + } + else { + $$in .= substr($remainder, 0, 4) ; + $remainder = substr($remainder, 4); + #$self->{Pending} = substr($remainder, 4); + #$remainder = ''; + $eof = 0; + } + } + else { + $$in .= substr($remainder, 0, 4) ; + $remainder = substr($remainder, 4); + #$self->{Pending} = substr($remainder, 4); + #$remainder = ''; + $eof = 0; + } + } + + if (length $$in) { + $self->{CompSize}->add(length $$in) ; + + $self->{CRC32} = Compress::Raw::Zlib::crc32($$in, $self->{CRC32}) + if $self->{wantCRC32}; + + $self->{ADLER32} = Compress::Zlib::adler32($$in, $self->{ADLER32}) + if $self->{wantADLER32}; + } + + ${ $_[1] } .= $$in; + $$in = $remainder; + } + + return STATUS_ENDSTREAM if $eof; + return STATUS_OK ; +} + +sub reset +{ + my $self = shift; + + $self->{CompSize} = 0; + $self->{UnCompSize} = 0; + $self->{CRC32} = Compress::Raw::Zlib::crc32(''); + $self->{ADLER32} = Compress::Raw::Zlib::adler32(''); + + return STATUS_OK ; +} + +#sub count +#{ +# my $self = shift ; +# return $self->{UnCompSize} ; +#} + +sub compressedBytes +{ + my $self = shift ; + return $self->{CompSize} ; +} + +sub uncompressedBytes +{ + my $self = shift ; + return $self->{CompSize} ; +} + +sub sync +{ + return STATUS_OK ; +} + +sub crc32 +{ + my $self = shift ; + return $self->{CRC32}; +} + +sub adler32 +{ + my $self = shift ; + return $self->{ADLER32}; +} + + +1; + +__END__ +# You may distribute under the terms of either the GNU General Public License +# or the Artistic License (the same terms as Perl itself) +# +# (C) Paul Evans, 2010-2015 -- leonerd@leonerd.org.uk + +package IO::Socket::IP; +# $VERSION needs to be set before use base 'IO::Socket' +# - https://rt.cpan.org/Ticket/Display.html?id=92107 +BEGIN { + $VERSION = '0.39'; +} + +use strict; +use warnings; +use base qw( IO::Socket ); + +use Carp; + +use Socket 1.97 qw( + getaddrinfo getnameinfo + sockaddr_family + AF_INET + AI_PASSIVE + IPPROTO_TCP IPPROTO_UDP + IPPROTO_IPV6 IPV6_V6ONLY + NI_DGRAM NI_NUMERICHOST NI_NUMERICSERV NIx_NOHOST NIx_NOSERV + SO_REUSEADDR SO_REUSEPORT SO_BROADCAST SO_ERROR + SOCK_DGRAM SOCK_STREAM + SOL_SOCKET +); +my $AF_INET6 = eval { Socket::AF_INET6() }; # may not be defined +my $AI_ADDRCONFIG = eval { Socket::AI_ADDRCONFIG() } || 0; +use POSIX qw( dup2 ); +use Errno qw( EINVAL EINPROGRESS EISCONN ENOTCONN ETIMEDOUT EWOULDBLOCK EOPNOTSUPP ); + +use constant HAVE_MSWIN32 => ( $^O eq "MSWin32" ); + +# At least one OS (Android) is known not to have getprotobyname() +use constant HAVE_GETPROTOBYNAME => defined eval { getprotobyname( "tcp" ) }; + +my $IPv6_re = do { + # translation of RFC 3986 3.2.2 ABNF to re + my $IPv4address = do { + my $dec_octet = q<(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])>; + qq<$dec_octet(?: \\. $dec_octet){3}>; + }; + my $IPv6address = do { + my $h16 = qq<[0-9A-Fa-f]{1,4}>; + my $ls32 = qq<(?: $h16 : $h16 | $IPv4address)>; + qq<(?: + (?: $h16 : ){6} $ls32 + | :: (?: $h16 : ){5} $ls32 + | (?: $h16 )? :: (?: $h16 : ){4} $ls32 + | (?: (?: $h16 : ){0,1} $h16 )? :: (?: $h16 : ){3} $ls32 + | (?: (?: $h16 : ){0,2} $h16 )? :: (?: $h16 : ){2} $ls32 + | (?: (?: $h16 : ){0,3} $h16 )? :: $h16 : $ls32 + | (?: (?: $h16 : ){0,4} $h16 )? :: $ls32 + | (?: (?: $h16 : ){0,5} $h16 )? :: $h16 + | (?: (?: $h16 : ){0,6} $h16 )? :: + )> + }; + qr<$IPv6address>xo; +}; + + +sub import +{ + my $pkg = shift; + my @symbols; + + foreach ( @_ ) { + if( $_ eq "-register" ) { + IO::Socket::IP::_ForINET->register_domain( AF_INET ); + IO::Socket::IP::_ForINET6->register_domain( $AF_INET6 ) if defined $AF_INET6; + } + else { + push @symbols, $_; + } + } + + @_ = ( $pkg, @symbols ); + goto &IO::Socket::import; +} + +# Convenient capability test function +{ + my $can_disable_v6only; + sub CAN_DISABLE_V6ONLY + { + return $can_disable_v6only if defined $can_disable_v6only; + + socket my $testsock, Socket::PF_INET6(), SOCK_STREAM, 0 or + die "Cannot socket(PF_INET6) - $!"; + + if( setsockopt $testsock, IPPROTO_IPV6, IPV6_V6ONLY, 0 ) { + return $can_disable_v6only = 1; + } + elsif( $! == EINVAL || $! == EOPNOTSUPP ) { + return $can_disable_v6only = 0; + } + else { + die "Cannot setsockopt() - $!"; + } + } +} + + + +sub new +{ + my $class = shift; + my %arg = (@_ == 1) ? (PeerHost => $_[0]) : @_; + return $class->SUPER::new(%arg); +} + +# IO::Socket may call this one; neaten up the arguments from IO::Socket::INET +# before calling our real _configure method +sub configure +{ + my $self = shift; + my ( $arg ) = @_; + + $arg->{PeerHost} = delete $arg->{PeerAddr} + if exists $arg->{PeerAddr} && !exists $arg->{PeerHost}; + + $arg->{PeerService} = delete $arg->{PeerPort} + if exists $arg->{PeerPort} && !exists $arg->{PeerService}; + + $arg->{LocalHost} = delete $arg->{LocalAddr} + if exists $arg->{LocalAddr} && !exists $arg->{LocalHost}; + + $arg->{LocalService} = delete $arg->{LocalPort} + if exists $arg->{LocalPort} && !exists $arg->{LocalService}; + + for my $type (qw(Peer Local)) { + my $host = $type . 'Host'; + my $service = $type . 'Service'; + + if( defined $arg->{$host} ) { + ( $arg->{$host}, my $s ) = $self->split_addr( $arg->{$host} ); + # IO::Socket::INET compat - *Host parsed port always takes precedence + $arg->{$service} = $s if defined $s; + } + } + + $self->_io_socket_ip__configure( $arg ); +} + +# Avoid simply calling it _configure, as some subclasses of IO::Socket::INET on CPAN already take that +sub _io_socket_ip__configure +{ + my $self = shift; + my ( $arg ) = @_; + + my %hints; + my @localinfos; + my @peerinfos; + + my $listenqueue = $arg->{Listen}; + if( defined $listenqueue and + ( defined $arg->{PeerHost} || defined $arg->{PeerService} || defined $arg->{PeerAddrInfo} ) ) { + croak "Cannot Listen with a peer address"; + } + + if( defined $arg->{GetAddrInfoFlags} ) { + $hints{flags} = $arg->{GetAddrInfoFlags}; + } + else { + $hints{flags} = $AI_ADDRCONFIG; + } + + if( defined( my $family = $arg->{Family} ) ) { + $hints{family} = $family; + } + + if( defined( my $type = $arg->{Type} ) ) { + $hints{socktype} = $type; + } + + if( defined( my $proto = $arg->{Proto} ) ) { + unless( $proto =~ m/^\d+$/ ) { + my $protonum = HAVE_GETPROTOBYNAME + ? getprotobyname( $proto ) + : eval { Socket->${\"IPPROTO_\U$proto"}() }; + defined $protonum or croak "Unrecognised protocol $proto"; + $proto = $protonum; + } + + $hints{protocol} = $proto; + } + + # To maintain compatibility with IO::Socket::INET, imply a default of + # SOCK_STREAM + IPPROTO_TCP if neither hint is given + if( !defined $hints{socktype} and !defined $hints{protocol} ) { + $hints{socktype} = SOCK_STREAM; + $hints{protocol} = IPPROTO_TCP; + } + + # Some OSes (NetBSD) don't seem to like just a protocol hint without a + # socktype hint as well. We'll set a couple of common ones + if( !defined $hints{socktype} and defined $hints{protocol} ) { + $hints{socktype} = SOCK_STREAM if $hints{protocol} == IPPROTO_TCP; + $hints{socktype} = SOCK_DGRAM if $hints{protocol} == IPPROTO_UDP; + } + + if( my $info = $arg->{LocalAddrInfo} ) { + ref $info eq "ARRAY" or croak "Expected 'LocalAddrInfo' to be an ARRAY ref"; + @localinfos = @$info; + } + elsif( defined $arg->{LocalHost} or + defined $arg->{LocalService} or + HAVE_MSWIN32 and $arg->{Listen} ) { + # Either may be undef + my $host = $arg->{LocalHost}; + my $service = $arg->{LocalService}; + + unless ( defined $host or defined $service ) { + $service = 0; + } + + local $1; # Placate a taint-related bug; [perl #67962] + defined $service and $service =~ s/\((\d+)\)$// and + my $fallback_port = $1; + + my %localhints = %hints; + $localhints{flags} |= AI_PASSIVE; + ( my $err, @localinfos ) = getaddrinfo( $host, $service, \%localhints ); + + if( $err and defined $fallback_port ) { + ( $err, @localinfos ) = getaddrinfo( $host, $fallback_port, \%localhints ); + } + + if( $err ) { + $@ = "$err"; + $! = EINVAL; + return; + } + } + + if( my $info = $arg->{PeerAddrInfo} ) { + ref $info eq "ARRAY" or croak "Expected 'PeerAddrInfo' to be an ARRAY ref"; + @peerinfos = @$info; + } + elsif( defined $arg->{PeerHost} or defined $arg->{PeerService} ) { + defined( my $host = $arg->{PeerHost} ) or + croak "Expected 'PeerHost'"; + defined( my $service = $arg->{PeerService} ) or + croak "Expected 'PeerService'"; + + local $1; # Placate a taint-related bug; [perl #67962] + defined $service and $service =~ s/\((\d+)\)$// and + my $fallback_port = $1; + + ( my $err, @peerinfos ) = getaddrinfo( $host, $service, \%hints ); + + if( $err and defined $fallback_port ) { + ( $err, @peerinfos ) = getaddrinfo( $host, $fallback_port, \%hints ); + } + + if( $err ) { + $@ = "$err"; + $! = EINVAL; + return; + } + } + + my $INT_1 = pack "i", 1; + + my @sockopts_enabled; + push @sockopts_enabled, [ SOL_SOCKET, SO_REUSEADDR, $INT_1 ] if $arg->{ReuseAddr}; + push @sockopts_enabled, [ SOL_SOCKET, SO_REUSEPORT, $INT_1 ] if $arg->{ReusePort}; + push @sockopts_enabled, [ SOL_SOCKET, SO_BROADCAST, $INT_1 ] if $arg->{Broadcast}; + + if( my $sockopts = $arg->{Sockopts} ) { + ref $sockopts eq "ARRAY" or croak "Expected 'Sockopts' to be an ARRAY ref"; + foreach ( @$sockopts ) { + ref $_ eq "ARRAY" or croak "Bad Sockopts item - expected ARRAYref"; + @$_ >= 2 and @$_ <= 3 or + croak "Bad Sockopts item - expected 2 or 3 elements"; + + my ( $level, $optname, $value ) = @$_; + # TODO: consider more sanity checking on argument values + + defined $value or $value = $INT_1; + push @sockopts_enabled, [ $level, $optname, $value ]; + } + } + + my $blocking = $arg->{Blocking}; + defined $blocking or $blocking = 1; + + my $v6only = $arg->{V6Only}; + + # IO::Socket::INET defines this key. IO::Socket::IP always implements the + # behaviour it requests, so we can ignore it, unless the caller is for some + # reason asking to disable it. + if( defined $arg->{MultiHomed} and !$arg->{MultiHomed} ) { + croak "Cannot disable the MultiHomed parameter"; + } + + my @infos; + foreach my $local ( @localinfos ? @localinfos : {} ) { + foreach my $peer ( @peerinfos ? @peerinfos : {} ) { + next if defined $local->{family} and defined $peer->{family} and + $local->{family} != $peer->{family}; + next if defined $local->{socktype} and defined $peer->{socktype} and + $local->{socktype} != $peer->{socktype}; + next if defined $local->{protocol} and defined $peer->{protocol} and + $local->{protocol} != $peer->{protocol}; + + my $family = $local->{family} || $peer->{family} or next; + my $socktype = $local->{socktype} || $peer->{socktype} or next; + my $protocol = $local->{protocol} || $peer->{protocol} || 0; + + push @infos, { + family => $family, + socktype => $socktype, + protocol => $protocol, + localaddr => $local->{addr}, + peeraddr => $peer->{addr}, + }; + } + } + + if( !@infos ) { + # If there was a Family hint then create a plain unbound, unconnected socket + if( defined $hints{family} ) { + @infos = ( { + family => $hints{family}, + socktype => $hints{socktype}, + protocol => $hints{protocol}, + } ); + } + # If there wasn't, use getaddrinfo()'s AI_ADDRCONFIG side-effect to guess a + # suitable family first. + else { + ( my $err, @infos ) = getaddrinfo( "", "0", \%hints ); + if( $err ) { + $@ = "$err"; + $! = EINVAL; + return; + } + + # We'll take all the @infos anyway, because some OSes (HPUX) are known to + # ignore the AI_ADDRCONFIG hint and return AF_INET6 even if they don't + # support them + } + } + + # In the nonblocking case, caller will be calling ->setup multiple times. + # Store configuration in the object for the ->setup method + # Yes, these are messy. Sorry, I can't help that... + + ${*$self}{io_socket_ip_infos} = \@infos; + + ${*$self}{io_socket_ip_idx} = -1; + + ${*$self}{io_socket_ip_sockopts} = \@sockopts_enabled; + ${*$self}{io_socket_ip_v6only} = $v6only; + ${*$self}{io_socket_ip_listenqueue} = $listenqueue; + ${*$self}{io_socket_ip_blocking} = $blocking; + + ${*$self}{io_socket_ip_errors} = [ undef, undef, undef ]; + + # ->setup is allowed to return false in nonblocking mode + $self->setup or !$blocking or return undef; + + return $self; +} + +sub setup +{ + my $self = shift; + + while(1) { + ${*$self}{io_socket_ip_idx}++; + last if ${*$self}{io_socket_ip_idx} >= @{ ${*$self}{io_socket_ip_infos} }; + + my $info = ${*$self}{io_socket_ip_infos}->[${*$self}{io_socket_ip_idx}]; + + $self->socket( @{$info}{qw( family socktype protocol )} ) or + ( ${*$self}{io_socket_ip_errors}[2] = $!, next ); + + $self->blocking( 0 ) unless ${*$self}{io_socket_ip_blocking}; + + foreach my $sockopt ( @{ ${*$self}{io_socket_ip_sockopts} } ) { + my ( $level, $optname, $value ) = @$sockopt; + $self->setsockopt( $level, $optname, $value ) or ( $@ = "$!", return undef ); + } + + if( defined ${*$self}{io_socket_ip_v6only} and defined $AF_INET6 and $info->{family} == $AF_INET6 ) { + my $v6only = ${*$self}{io_socket_ip_v6only}; + $self->setsockopt( IPPROTO_IPV6, IPV6_V6ONLY, pack "i", $v6only ) or ( $@ = "$!", return undef ); + } + + if( defined( my $addr = $info->{localaddr} ) ) { + $self->bind( $addr ) or + ( ${*$self}{io_socket_ip_errors}[1] = $!, next ); + } + + if( defined( my $listenqueue = ${*$self}{io_socket_ip_listenqueue} ) ) { + $self->listen( $listenqueue ) or ( $@ = "$!", return undef ); + } + + if( defined( my $addr = $info->{peeraddr} ) ) { + if( $self->connect( $addr ) ) { + $! = 0; + return 1; + } + + if( $! == EINPROGRESS or $! == EWOULDBLOCK ) { + ${*$self}{io_socket_ip_connect_in_progress} = 1; + return 0; + } + + # If connect failed but we have no system error there must be an error + # at the application layer, like a bad certificate with + # IO::Socket::SSL. + # In this case don't continue IP based multi-homing because the problem + # cannot be solved at the IP layer. + return 0 if ! $!; + + ${*$self}{io_socket_ip_errors}[0] = $!; + next; + } + + return 1; + } + + # Pick the most appropriate error, stringified + $! = ( grep defined, @{ ${*$self}{io_socket_ip_errors}} )[0]; + $@ = "$!"; + return undef; +} + +sub connect :method +{ + my $self = shift; + + # It seems that IO::Socket hides EINPROGRESS errors, making them look like + # a success. This is annoying here. + # Instead of putting up with its frankly-irritating intentional breakage of + # useful APIs I'm just going to end-run around it and call core's connect() + # directly + + if( @_ ) { + my ( $addr ) = @_; + + # Annoyingly IO::Socket's connect() is where the timeout logic is + # implemented, so we'll have to reinvent it here + my $timeout = ${*$self}{'io_socket_timeout'}; + + return connect( $self, $addr ) unless defined $timeout; + + my $was_blocking = $self->blocking( 0 ); + + my $err = defined connect( $self, $addr ) ? 0 : $!+0; + + if( !$err ) { + # All happy + $self->blocking( $was_blocking ); + return 1; + } + elsif( not( $err == EINPROGRESS or $err == EWOULDBLOCK ) ) { + # Failed for some other reason + $self->blocking( $was_blocking ); + return undef; + } + elsif( !$was_blocking ) { + # We shouldn't block anyway + return undef; + } + + my $vec = ''; vec( $vec, $self->fileno, 1 ) = 1; + if( !select( undef, $vec, $vec, $timeout ) ) { + $self->blocking( $was_blocking ); + $! = ETIMEDOUT; + return undef; + } + + # Hoist the error by connect()ing a second time + $err = $self->getsockopt( SOL_SOCKET, SO_ERROR ); + $err = 0 if $err == EISCONN; # Some OSes give EISCONN + + $self->blocking( $was_blocking ); + + $! = $err, return undef if $err; + return 1; + } + + return 1 if !${*$self}{io_socket_ip_connect_in_progress}; + + # See if a connect attempt has just failed with an error + if( my $errno = $self->getsockopt( SOL_SOCKET, SO_ERROR ) ) { + delete ${*$self}{io_socket_ip_connect_in_progress}; + ${*$self}{io_socket_ip_errors}[0] = $! = $errno; + return $self->setup; + } + + # No error, so either connect is still in progress, or has completed + # successfully. We can tell by trying to connect() again; either it will + # succeed or we'll get EISCONN (connected successfully), or EALREADY + # (still in progress). This even works on MSWin32. + my $addr = ${*$self}{io_socket_ip_infos}[${*$self}{io_socket_ip_idx}]{peeraddr}; + + if( connect( $self, $addr ) or $! == EISCONN ) { + delete ${*$self}{io_socket_ip_connect_in_progress}; + $! = 0; + return 1; + } + else { + $! = EINPROGRESS; + return 0; + } +} + +sub connected +{ + my $self = shift; + return defined $self->fileno && + !${*$self}{io_socket_ip_connect_in_progress} && + defined getpeername( $self ); # ->peername caches, we need to detect disconnection +} + + +sub _get_host_service +{ + my $self = shift; + my ( $addr, $flags, $xflags ) = @_; + + defined $addr or + $! = ENOTCONN, return; + + $flags |= NI_DGRAM if $self->socktype == SOCK_DGRAM; + + my ( $err, $host, $service ) = getnameinfo( $addr, $flags, $xflags || 0 ); + croak "getnameinfo - $err" if $err; + + return ( $host, $service ); +} + +sub _unpack_sockaddr +{ + my ( $addr ) = @_; + my $family = sockaddr_family $addr; + + if( $family == AF_INET ) { + return ( Socket::unpack_sockaddr_in( $addr ) )[1]; + } + elsif( defined $AF_INET6 and $family == $AF_INET6 ) { + return ( Socket::unpack_sockaddr_in6( $addr ) )[1]; + } + else { + croak "Unrecognised address family $family"; + } +} + + +sub sockhost_service +{ + my $self = shift; + my ( $numeric ) = @_; + + $self->_get_host_service( $self->sockname, $numeric ? NI_NUMERICHOST|NI_NUMERICSERV : 0 ); +} + + +sub sockhost { my $self = shift; scalar +( $self->_get_host_service( $self->sockname, NI_NUMERICHOST, NIx_NOSERV ) )[0] } +sub sockport { my $self = shift; scalar +( $self->_get_host_service( $self->sockname, NI_NUMERICSERV, NIx_NOHOST ) )[1] } + +sub sockhostname { my $self = shift; scalar +( $self->_get_host_service( $self->sockname, 0, NIx_NOSERV ) )[0] } +sub sockservice { my $self = shift; scalar +( $self->_get_host_service( $self->sockname, 0, NIx_NOHOST ) )[1] } + + +sub sockaddr { my $self = shift; _unpack_sockaddr $self->sockname } + + +sub peerhost_service +{ + my $self = shift; + my ( $numeric ) = @_; + + $self->_get_host_service( $self->peername, $numeric ? NI_NUMERICHOST|NI_NUMERICSERV : 0 ); +} + + +sub peerhost { my $self = shift; scalar +( $self->_get_host_service( $self->peername, NI_NUMERICHOST, NIx_NOSERV ) )[0] } +sub peerport { my $self = shift; scalar +( $self->_get_host_service( $self->peername, NI_NUMERICSERV, NIx_NOHOST ) )[1] } + +sub peerhostname { my $self = shift; scalar +( $self->_get_host_service( $self->peername, 0, NIx_NOSERV ) )[0] } +sub peerservice { my $self = shift; scalar +( $self->_get_host_service( $self->peername, 0, NIx_NOHOST ) )[1] } + + +sub peeraddr { my $self = shift; _unpack_sockaddr $self->peername } + +# This unbelievably dodgy hack works around the bug that IO::Socket doesn't do +# it +# https://rt.cpan.org/Ticket/Display.html?id=61577 +sub accept +{ + my $self = shift; + my ( $new, $peer ) = $self->SUPER::accept( @_ ) or return; + + ${*$new}{$_} = ${*$self}{$_} for qw( io_socket_domain io_socket_type io_socket_proto ); + + return wantarray ? ( $new, $peer ) + : $new; +} + +# This second unbelievably dodgy hack guarantees that $self->fileno doesn't +# change, which is useful during nonblocking connect +sub socket :method +{ + my $self = shift; + return $self->SUPER::socket(@_) if not defined $self->fileno; + + # I hate core prototypes sometimes... + socket( my $tmph, $_[0], $_[1], $_[2] ) or return undef; + + dup2( $tmph->fileno, $self->fileno ) or die "Unable to dup2 $tmph onto $self - $!"; +} + +# Versions of IO::Socket before 1.35 may leave socktype undef if from, say, an +# ->fdopen call. In this case we'll apply a fix +BEGIN { + if( eval($IO::Socket::VERSION) < 1.35 ) { + *socktype = sub { + my $self = shift; + my $type = $self->SUPER::socktype; + if( !defined $type ) { + $type = $self->sockopt( Socket::SO_TYPE() ); + } + return $type; + }; + } +} + + +sub as_inet +{ + my $self = shift; + croak "Cannot downgrade a non-PF_INET socket to IO::Socket::INET" unless $self->sockdomain == AF_INET; + return IO::Socket::INET->new_from_fd( $self->fileno, "r+" ); +} + + + +sub split_addr +{ + shift; + my ( $addr ) = @_; + + local ( $1, $2 ); # Placate a taint-related bug; [perl #67962] + if( $addr =~ m/\A\[($IPv6_re)\](?::([^\s:]*))?\z/ or + $addr =~ m/\A([^\s:]*):([^\s:]*)\z/ ) { + return ( $1, $2 ) if defined $2 and length $2; + return ( $1, undef ); + } + + return ( $addr, undef ); +} + + +sub join_addr +{ + shift; + my ( $host, $port ) = @_; + + $host = "[$host]" if $host =~ m/:/; + + return join ":", $host, $port if defined $port; + return $host; +} + +# Since IO::Socket->new( Domain => ... ) will delete the Domain parameter +# before calling ->configure, we need to keep track of which it was + +package # hide from indexer + IO::Socket::IP::_ForINET; +use base qw( IO::Socket::IP ); + +sub configure +{ + # This is evil + my $self = shift; + my ( $arg ) = @_; + + bless $self, "IO::Socket::IP"; + $self->configure( { %$arg, Family => Socket::AF_INET() } ); +} + +package # hide from indexer + IO::Socket::IP::_ForINET6; +use base qw( IO::Socket::IP ); + +sub configure +{ + # This is evil + my $self = shift; + my ( $arg ) = @_; + + bless $self, "IO::Socket::IP"; + $self->configure( { %$arg, Family => Socket::AF_INET6() } ); +} + + + +0x55AA; +package Locale::Maketext; +use strict; +our $USE_LITERALS; +use Carp (); +use I18N::LangTags (); +use I18N::LangTags::Detect (); + +#-------------------------------------------------------------------------- + +BEGIN { unless(defined &DEBUG) { *DEBUG = sub () {0} } } +# define the constant 'DEBUG' at compile-time + +# turn on utf8 if we have it (this is what GutsLoader.pm used to do essentially ) +# use if (exists $INC{'utf8.pm'} || eval 'use utf8'), 'utf8'; +BEGIN { + + # if we have it || we can load it + if ( exists $INC{'utf8.pm'} || eval { local $SIG{'__DIE__'};require utf8; } ) { + utf8->import(); + DEBUG and warn " utf8 on for _compile()\n"; + } + else { + DEBUG and warn " utf8 not available for _compile() ($INC{'utf8.pm'})\n$@\n"; + } +} + + +our $VERSION = '1.29'; +our @ISA = (); + +our $MATCH_SUPERS = 1; +our $MATCH_SUPERS_TIGHTLY = 1; +our $USING_LANGUAGE_TAGS = 1; +# Turning this off is somewhat of a security risk in that little or no +# checking will be done on the legality of tokens passed to the +# eval("use $module_name") in _try_use. If you turn this off, you have +# to do your own taint checking. + +$USE_LITERALS = 1 unless defined $USE_LITERALS; +# a hint for compiling bracket-notation things. + +my %isa_scan = (); + +########################################################################### + +sub quant { + my($handle, $num, @forms) = @_; + + return $num if @forms == 0; # what should this mean? + return $forms[2] if @forms > 2 and $num == 0; # special zeroth case + + # Normal case: + # Note that the formatting of $num is preserved. + return( $handle->numf($num) . ' ' . $handle->numerate($num, @forms) ); + # Most human languages put the number phrase before the qualified phrase. +} + + +sub numerate { + # return this lexical item in a form appropriate to this number + my($handle, $num, @forms) = @_; + my $s = ($num == 1); + + return '' unless @forms; + if(@forms == 1) { # only the headword form specified + return $s ? $forms[0] : ($forms[0] . 's'); # very cheap hack. + } + else { # sing and plural were specified + return $s ? $forms[0] : $forms[1]; + } +} + +#-------------------------------------------------------------------------- + +sub numf { + my($handle, $num) = @_[0,1]; + if($num < 10_000_000_000 and $num > -10_000_000_000 and $num == int($num)) { + $num += 0; # Just use normal integer stringification. + # Specifically, don't let %G turn ten million into 1E+007 + } + else { + $num = CORE::sprintf('%G', $num); + # "CORE::" is there to avoid confusion with the above sub sprintf. + } + while( $num =~ s/^([-+]?\d+)(\d{3})/$1,$2/s ) {1} # right from perlfaq5 + # The initial \d+ gobbles as many digits as it can, and then we + # backtrack so it un-eats the rightmost three, and then we + # insert the comma there. + + $num =~ tr<.,><,.> if ref($handle) and $handle->{'numf_comma'}; + # This is just a lame hack instead of using Number::Format + return $num; +} + +sub sprintf { + no integer; + my($handle, $format, @params) = @_; + return CORE::sprintf($format, @params); + # "CORE::" is there to avoid confusion with myself! +} + +#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=# + +use integer; # vroom vroom... applies to the whole rest of the module + +sub language_tag { + my $it = ref($_[0]) || $_[0]; + return undef unless $it =~ m/([^':]+)(?:::)?$/s; + $it = lc($1); + $it =~ tr<_><->; + return $it; +} + +sub encoding { + my $it = $_[0]; + return( + (ref($it) && $it->{'encoding'}) + || 'iso-8859-1' # Latin-1 + ); +} + +#-------------------------------------------------------------------------- + +sub fallback_languages { return('i-default', 'en', 'en-US') } + +sub fallback_language_classes { return () } + +#-------------------------------------------------------------------------- + +sub fail_with { # an actual attribute method! + my($handle, @params) = @_; + return unless ref($handle); + $handle->{'fail'} = $params[0] if @params; + return $handle->{'fail'}; +} + +#-------------------------------------------------------------------------- + +sub blacklist { + my ( $handle, @methods ) = @_; + + unless ( defined $handle->{'blacklist'} ) { + no strict 'refs'; + + # Don't let people call methods they're not supposed to from maketext. + # Explicitly exclude all methods in this package that start with an + # underscore on principle. + $handle->{'blacklist'} = { + map { $_ => 1 } ( + qw/ + blacklist + encoding + fail_with + failure_handler_auto + fallback_language_classes + fallback_languages + get_handle + init + language_tag + maketext + new + whitelist + /, grep { /^_/ } keys %{ __PACKAGE__ . "::" } + ), + }; + } + + if ( scalar @methods ) { + $handle->{'blacklist'} = { %{ $handle->{'blacklist'} }, map { $_ => 1 } @methods }; + } + + delete $handle->{'_external_lex_cache'}; + return; +} + +sub whitelist { + my ( $handle, @methods ) = @_; + if ( scalar @methods ) { + $handle->{'whitelist'} = {} unless defined $handle->{'whitelist'}; + $handle->{'whitelist'} = { %{ $handle->{'whitelist'} }, map { $_ => 1 } @methods }; + } + + delete $handle->{'_external_lex_cache'}; + return; +} + +#-------------------------------------------------------------------------- + +sub failure_handler_auto { + # Meant to be used like: + # $handle->fail_with('failure_handler_auto') + + my $handle = shift; + my $phrase = shift; + + $handle->{'failure_lex'} ||= {}; + my $lex = $handle->{'failure_lex'}; + + my $value ||= ($lex->{$phrase} ||= $handle->_compile($phrase)); + + # Dumbly copied from sub maketext: + return ${$value} if ref($value) eq 'SCALAR'; + return $value if ref($value) ne 'CODE'; + { + local $SIG{'__DIE__'}; + eval { $value = &$value($handle, @_) }; + } + # If we make it here, there was an exception thrown in the + # call to $value, and so scream: + if($@) { + # pretty up the error message + $@ =~ s{\s+at\s+\(eval\s+\d+\)\s+line\s+(\d+)\.?\n?} + {\n in bracket code [compiled line $1],}s; + #$err =~ s/\n?$/\n/s; + Carp::croak "Error in maketexting \"$phrase\":\n$@ as used"; + # Rather unexpected, but suppose that the sub tried calling + # a method that didn't exist. + } + else { + return $value; + } +} + +#========================================================================== + +sub new { + # Nothing fancy! + my $class = ref($_[0]) || $_[0]; + my $handle = bless {}, $class; + $handle->blacklist; + $handle->init; + return $handle; +} + +sub init { return } # no-op + +########################################################################### + +sub maketext { + # Remember, this can fail. Failure is controllable many ways. + Carp::croak 'maketext requires at least one parameter' unless @_ > 1; + + my($handle, $phrase) = splice(@_,0,2); + Carp::confess('No handle/phrase') unless (defined($handle) && defined($phrase)); + + # backup $@ in case it's still being used in the calling code. + # If no failures, we'll re-set it back to what it was later. + my $at = $@; + + # Copy @_ case one of its elements is $@. + @_ = @_; + + # Look up the value: + + my $value; + if (exists $handle->{'_external_lex_cache'}{$phrase}) { + DEBUG and warn "* Using external lex cache version of \"$phrase\"\n"; + $value = $handle->{'_external_lex_cache'}{$phrase}; + } + else { + foreach my $h_r ( + @{ $isa_scan{ref($handle) || $handle} || $handle->_lex_refs } + ) { + DEBUG and warn "* Looking up \"$phrase\" in $h_r\n"; + if(exists $h_r->{$phrase}) { + DEBUG and warn " Found \"$phrase\" in $h_r\n"; + unless(ref($value = $h_r->{$phrase})) { + # Nonref means it's not yet compiled. Compile and replace. + if ($handle->{'use_external_lex_cache'}) { + $value = $handle->{'_external_lex_cache'}{$phrase} = $handle->_compile($value); + } + else { + $value = $h_r->{$phrase} = $handle->_compile($value); + } + } + last; + } + # extending packages need to be able to localize _AUTO and if readonly can't "local $h_r->{'_AUTO'} = 1;" + # but they can "local $handle->{'_external_lex_cache'}{'_AUTO'} = 1;" + elsif($phrase !~ m/^_/s and ($handle->{'use_external_lex_cache'} ? ( exists $handle->{'_external_lex_cache'}{'_AUTO'} ? $handle->{'_external_lex_cache'}{'_AUTO'} : $h_r->{'_AUTO'} ) : $h_r->{'_AUTO'})) { + # it's an auto lex, and this is an autoable key! + DEBUG and warn " Automaking \"$phrase\" into $h_r\n"; + if ($handle->{'use_external_lex_cache'}) { + $value = $handle->{'_external_lex_cache'}{$phrase} = $handle->_compile($phrase); + } + else { + $value = $h_r->{$phrase} = $handle->_compile($phrase); + } + last; + } + DEBUG>1 and print " Not found in $h_r, nor automakable\n"; + # else keep looking + } + } + + unless(defined($value)) { + DEBUG and warn "! Lookup of \"$phrase\" in/under ", ref($handle) || $handle, " fails.\n"; + if(ref($handle) and $handle->{'fail'}) { + DEBUG and warn "WARNING0: maketext fails looking for <$phrase>\n"; + my $fail; + if(ref($fail = $handle->{'fail'}) eq 'CODE') { # it's a sub reference + $@ = $at; # Put $@ back in case we altered it along the way. + return &{$fail}($handle, $phrase, @_); + # If it ever returns, it should return a good value. + } + else { # It's a method name + $@ = $at; # Put $@ back in case we altered it along the way. + return $handle->$fail($phrase, @_); + # If it ever returns, it should return a good value. + } + } + else { + # All we know how to do is this; + Carp::croak("maketext doesn't know how to say:\n$phrase\nas needed"); + } + } + + if(ref($value) eq 'SCALAR'){ + $@ = $at; # Put $@ back in case we altered it along the way. + return $$value ; + } + if(ref($value) ne 'CODE'){ + $@ = $at; # Put $@ back in case we altered it along the way. + return $value ; + } + + { + local $SIG{'__DIE__'}; + eval { $value = &$value($handle, @_) }; + } + # If we make it here, there was an exception thrown in the + # call to $value, and so scream: + if ($@) { + # pretty up the error message + $@ =~ s{\s+at\s+\(eval\s+\d+\)\s+line\s+(\d+)\.?\n?} + {\n in bracket code [compiled line $1],}s; + #$err =~ s/\n?$/\n/s; + Carp::croak "Error in maketexting \"$phrase\":\n$@ as used"; + # Rather unexpected, but suppose that the sub tried calling + # a method that didn't exist. + } + else { + $@ = $at; # Put $@ back in case we altered it along the way. + return $value; + } + $@ = $at; # Put $@ back in case we altered it along the way. +} + +########################################################################### + +sub get_handle { # This is a constructor and, yes, it CAN FAIL. + # Its class argument has to be the base class for the current + # application's l10n files. + + my($base_class, @languages) = @_; + $base_class = ref($base_class) || $base_class; + # Complain if they use __PACKAGE__ as a project base class? + + if( @languages ) { + DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + if($USING_LANGUAGE_TAGS) { # An explicit language-list was given! + @languages = + map {; $_, I18N::LangTags::alternate_language_tags($_) } + # Catch alternation + map I18N::LangTags::locale2language_tag($_), + # If it's a lg tag, fine, pass thru (untainted) + # If it's a locale ID, try converting to a lg tag (untainted), + # otherwise nix it. + @languages; + DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + } + } + else { + @languages = $base_class->_ambient_langprefs; + } + + @languages = $base_class->_langtag_munging(@languages); + + my %seen; + foreach my $module_name ( map { $base_class . '::' . $_ } @languages ) { + next unless length $module_name; # sanity + next if $seen{$module_name}++ # Already been here, and it was no-go + || !&_try_use($module_name); # Try to use() it, but can't it. + return($module_name->new); # Make it! + } + + return undef; # Fail! +} + +########################################################################### + +sub _langtag_munging { + my($base_class, @languages) = @_; + + # We have all these DEBUG statements because otherwise it's hard as hell + # to diagnose if/when something goes wrong. + + DEBUG and warn 'Lgs1: ', map("<$_>", @languages), "\n"; + + if($USING_LANGUAGE_TAGS) { + DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + @languages = $base_class->_add_supers( @languages ); + + push @languages, I18N::LangTags::panic_languages(@languages); + DEBUG and warn "After adding panic languages:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + + push @languages, $base_class->fallback_languages; + # You are free to override fallback_languages to return empty-list! + DEBUG and warn 'Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + + @languages = # final bit of processing to turn them into classname things + map { + my $it = $_; # copy + $it =~ tr<-A-Z><_a-z>; # lc, and turn - to _ + $it =~ tr<_a-z0-9><>cd; # remove all but a-z0-9_ + $it; + } @languages + ; + DEBUG and warn "Nearing end of munging:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + } + else { + DEBUG and warn "Bypassing language-tags.\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + } + + DEBUG and warn "Before adding fallback classes:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + + push @languages, $base_class->fallback_language_classes; + # You are free to override that to return whatever. + + DEBUG and warn "Finally:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + + return @languages; +} + +########################################################################### + +sub _ambient_langprefs { + return I18N::LangTags::Detect::detect(); +} + +########################################################################### + +sub _add_supers { + my($base_class, @languages) = @_; + + if (!$MATCH_SUPERS) { + # Nothing + DEBUG and warn "Bypassing any super-matching.\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + + } + elsif( $MATCH_SUPERS_TIGHTLY ) { + DEBUG and warn "Before adding new supers tightly:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + @languages = I18N::LangTags::implicate_supers( @languages ); + DEBUG and warn "After adding new supers tightly:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + + } + else { + DEBUG and warn "Before adding supers to end:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + @languages = I18N::LangTags::implicate_supers_strictly( @languages ); + DEBUG and warn "After adding supers to end:\n", + ' Lgs@', __LINE__, ': ', map("<$_>", @languages), "\n"; + } + + return @languages; +} + +########################################################################### +# +# This is where most people should stop reading. +# +########################################################################### + +my %tried = (); +# memoization of whether we've used this module, or found it unusable. + +sub _try_use { # Basically a wrapper around "require Modulename" + # "Many men have tried..." "They tried and failed?" "They tried and died." + return $tried{$_[0]} if exists $tried{$_[0]}; # memoization + + my $module = $_[0]; # ASSUME sane module name! + { no strict 'refs'; + no warnings 'once'; + return($tried{$module} = 1) + if %{$module . '::Lexicon'} or @{$module . '::ISA'}; + # weird case: we never use'd it, but there it is! + } + + DEBUG and warn " About to use $module ...\n"; + + local $SIG{'__DIE__'}; + local $@; + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + eval "require $module"; # used to be "use $module", but no point in that. + + if($@) { + DEBUG and warn "Error using $module \: $@\n"; + return $tried{$module} = 0; + } + else { + DEBUG and warn " OK, $module is used\n"; + return $tried{$module} = 1; + } +} + +#-------------------------------------------------------------------------- + +sub _lex_refs { # report the lexicon references for this handle's class + # returns an arrayREF! + no strict 'refs'; + no warnings 'once'; + my $class = ref($_[0]) || $_[0]; + DEBUG and warn "Lex refs lookup on $class\n"; + return $isa_scan{$class} if exists $isa_scan{$class}; # memoization! + + my @lex_refs; + my $seen_r = ref($_[1]) ? $_[1] : {}; + + if( defined( *{$class . '::Lexicon'}{'HASH'} )) { + push @lex_refs, *{$class . '::Lexicon'}{'HASH'}; + DEBUG and warn '%' . $class . '::Lexicon contains ', + scalar(keys %{$class . '::Lexicon'}), " entries\n"; + } + + # Implements depth(height?)-first recursive searching of superclasses. + # In hindsight, I suppose I could have just used Class::ISA! + foreach my $superclass (@{$class . '::ISA'}) { + DEBUG and warn " Super-class search into $superclass\n"; + next if $seen_r->{$superclass}++; + push @lex_refs, @{&_lex_refs($superclass, $seen_r)}; # call myself + } + + $isa_scan{$class} = \@lex_refs; # save for next time + return \@lex_refs; +} + +sub clear_isa_scan { %isa_scan = (); return; } # end on a note of simplicity! + +#-------------------------------------------------------------------------- + +sub _compile { + # This big scary routine compiles an entry. + # It returns either a coderef if there's brackety bits in this, or + # otherwise a ref to a scalar. + + my $string_to_compile = $_[1]; # There are taint issues using regex on @_ - perlbug 60378,27344 + + # The while() regex is more expensive than this check on strings that don't need a compile. + # this op causes a ~2% speed hit for strings that need compile and a 250% speed improvement + # on strings that don't need compiling. + return \"$string_to_compile" if($string_to_compile !~ m/[\[~\]]/ms); # return a string ref if chars [~] are not in the string + + my $handle = $_[0]; + + my(@code); + my(@c) = (''); # "chunks" -- scratch. + my $call_count = 0; + my $big_pile = ''; + { + my $in_group = 0; # start out outside a group + my($m, @params); # scratch + + while($string_to_compile =~ # Iterate over chunks. + m/( + [^\~\[\]]+ # non-~[] stuff (Capture everything else here) + | + ~. # ~[, ~], ~~, ~other + | + \[ # [ presumably opening a group + | + \] # ] presumably closing a group + | + ~ # terminal ~ ? + | + $ + )/xgs + ) { + DEBUG>2 and warn qq{ "$1"\n}; + + if($1 eq '[' or $1 eq '') { # "[" or end + # Whether this is "[" or end, force processing of any + # preceding literal. + if($in_group) { + if($1 eq '') { + $handle->_die_pointing($string_to_compile, 'Unterminated bracket group'); + } + else { + $handle->_die_pointing($string_to_compile, 'You can\'t nest bracket groups'); + } + } + else { + if ($1 eq '') { + DEBUG>2 and warn " [end-string]\n"; + } + else { + $in_group = 1; + } + die "How come \@c is empty?? in <$string_to_compile>" unless @c; # sanity + if(length $c[-1]) { + # Now actually processing the preceding literal + $big_pile .= $c[-1]; + if($USE_LITERALS and ( + (ord('A') == 65) + ? $c[-1] !~ m/[^\x20-\x7E]/s + # ASCII very safe chars + : $c[-1] !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s + # EBCDIC very safe chars + )) { + # normal case -- all very safe chars + $c[-1] =~ s/'/\\'/g; + push @code, q{ '} . $c[-1] . "',\n"; + $c[-1] = ''; # reuse this slot + } + else { + $c[-1] =~ s/\\\\/\\/g; + push @code, ' $c[' . $#c . "],\n"; + push @c, ''; # new chunk + } + } + # else just ignore the empty string. + } + + } + elsif($1 eq ']') { # "]" + # close group -- go back in-band + if($in_group) { + $in_group = 0; + + DEBUG>2 and warn " --Closing group [$c[-1]]\n"; + + # And now process the group... + + if(!length($c[-1]) or $c[-1] =~ m/^\s+$/s) { + DEBUG>2 and warn " -- (Ignoring)\n"; + $c[-1] = ''; # reset out chink + next; + } + + #$c[-1] =~ s/^\s+//s; + #$c[-1] =~ s/\s+$//s; + ($m,@params) = split(/,/, $c[-1], -1); # was /\s*,\s*/ + + # A bit of a hack -- we've turned "~,"'s into DELs, so turn + # 'em into real commas here. + if (ord('A') == 65) { # ASCII, etc + foreach($m, @params) { tr/\x7F/,/ } + } + else { # EBCDIC (1047, 0037, POSIX-BC) + # Thanks to Peter Prymmer for the EBCDIC handling + foreach($m, @params) { tr/\x07/,/ } + } + + # Special-case handling of some method names: + if($m eq '_*' or $m =~ m/^_(-?\d+)$/s) { + # Treat [_1,...] as [,_1,...], etc. + unshift @params, $m; + $m = ''; + } + elsif($m eq '*') { + $m = 'quant'; # "*" for "times": "4 cars" is 4 times "cars" + } + elsif($m eq '#') { + $m = 'numf'; # "#" for "number": [#,_1] for "the number _1" + } + + # Most common case: a simple, legal-looking method name + if($m eq '') { + # 0-length method name means to just interpolate: + push @code, ' ('; + } + elsif($m =~ /^\w+$/s + && !$handle->{'blacklist'}{$m} + && ( !defined $handle->{'whitelist'} || $handle->{'whitelist'}{$m} ) + # exclude anything fancy and restrict to the whitelist/blacklist. + ) { + push @code, ' $_[0]->' . $m . '('; + } + else { + # TODO: implement something? or just too icky to consider? + $handle->_die_pointing( + $string_to_compile, + "Can't use \"$m\" as a method name in bracket group", + 2 + length($c[-1]) + ); + } + + pop @c; # we don't need that chunk anymore + ++$call_count; + + foreach my $p (@params) { + if($p eq '_*') { + # Meaning: all parameters except $_[0] + $code[-1] .= ' @_[1 .. $#_], '; + # and yes, that does the right thing for all @_ < 3 + } + elsif($p =~ m/^_(-?\d+)$/s) { + # _3 meaning $_[3] + $code[-1] .= '$_[' . (0 + $1) . '], '; + } + elsif($USE_LITERALS and ( + (ord('A') == 65) + ? $p !~ m/[^\x20-\x7E]/s + # ASCII very safe chars + : $p !~ m/[^ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@A-Z[\\\]^_`a-z{|}~\x07]/s + # EBCDIC very safe chars + )) { + # Normal case: a literal containing only safe characters + $p =~ s/'/\\'/g; + $code[-1] .= q{'} . $p . q{', }; + } + else { + # Stow it on the chunk-stack, and just refer to that. + push @c, $p; + push @code, ' $c[' . $#c . '], '; + } + } + $code[-1] .= "),\n"; + + push @c, ''; + } + else { + $handle->_die_pointing($string_to_compile, q{Unbalanced ']'}); + } + + } + elsif(substr($1,0,1) ne '~') { + # it's stuff not containing "~" or "[" or "]" + # i.e., a literal blob + my $text = $1; + $text =~ s/\\/\\\\/g; + $c[-1] .= $text; + + } + elsif($1 eq '~~') { # "~~" + $c[-1] .= '~'; + + } + elsif($1 eq '~[') { # "~[" + $c[-1] .= '['; + + } + elsif($1 eq '~]') { # "~]" + $c[-1] .= ']'; + + } + elsif($1 eq '~,') { # "~," + if($in_group) { + # This is a hack, based on the assumption that no-one will actually + # want a DEL inside a bracket group. Let's hope that's it's true. + if (ord('A') == 65) { # ASCII etc + $c[-1] .= "\x7F"; + } + else { # EBCDIC (cp 1047, 0037, POSIX-BC) + $c[-1] .= "\x07"; + } + } + else { + $c[-1] .= '~,'; + } + + } + elsif($1 eq '~') { # possible only at string-end, it seems. + $c[-1] .= '~'; + + } + else { + # It's a "~X" where X is not a special character. + # Consider it a literal ~ and X. + my $text = $1; + $text =~ s/\\/\\\\/g; + $c[-1] .= $text; + } + } + } + + if($call_count) { + undef $big_pile; # Well, nevermind that. + } + else { + # It's all literals! Ahwell, that can happen. + # So don't bother with the eval. Return a SCALAR reference. + return \$big_pile; + } + + die q{Last chunk isn't null??} if @c and length $c[-1]; # sanity + DEBUG and warn scalar(@c), " chunks under closure\n"; + if(@code == 0) { # not possible? + DEBUG and warn "Empty code\n"; + return \''; + } + elsif(@code > 1) { # most cases, presumably! + unshift @code, "join '',\n"; + } + unshift @code, "use strict; sub {\n"; + push @code, "}\n"; + + DEBUG and warn @code; + my $sub = eval(join '', @code); + die "$@ while evalling" . join('', @code) if $@; # Should be impossible. + return $sub; +} + +#-------------------------------------------------------------------------- + +sub _die_pointing { + # This is used by _compile to throw a fatal error + my $target = shift; + $target = ref($target) || $target; # class name + # ...leaving $_[0] the error-causing text, and $_[1] the error message + + my $i = index($_[0], "\n"); + + my $pointy; + my $pos = pos($_[0]) - (defined($_[2]) ? $_[2] : 0) - 1; + if($pos < 1) { + $pointy = "^=== near there\n"; + } + else { # we need to space over + my $first_tab = index($_[0], "\t"); + if($pos > 2 and ( -1 == $first_tab or $first_tab > pos($_[0]))) { + # No tabs, or the first tab is harmlessly after where we will point to, + # AND we're far enough from the margin that we can draw a proper arrow. + $pointy = ('=' x $pos) . "^ near there\n"; + } + else { + # tabs screw everything up! + $pointy = substr($_[0],0,$pos); + $pointy =~ tr/\t //cd; + # make everything into whitespace, but preserving tabs + $pointy .= "^=== near there\n"; + } + } + + my $errmsg = "$_[1], in\:\n$_[0]"; + + if($i == -1) { + # No newline. + $errmsg .= "\n" . $pointy; + } + elsif($i == (length($_[0]) - 1) ) { + # Already has a newline at end. + $errmsg .= $pointy; + } + else { + # don't bother with the pointy bit, I guess. + } + Carp::croak( "$errmsg via $target, as used" ); +} + +1; +package Locale::Codes; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +############################################################################### + +use strict; +use warnings; +require 5.006; + +use Carp; +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes::Constants; + +our($VERSION); +$VERSION='3.56'; + +use Exporter qw(import); +our(@EXPORT_OK,%EXPORT_TAGS); +@EXPORT_OK = @Locale::Codes::Constants::CONSTANTS; +%EXPORT_TAGS = ( 'constants' => [ @EXPORT_OK ] ); + +############################################################################### +# GLOBAL DATA +############################################################################### +# All of the data is stored in a couple global variables. They are filled +# in by requiring the appropriate TYPE_Codes and TYPE_Retired modules. + +our(%Data,%Retired); + +# $Data{ TYPE }{ code2id }{ CODESET } { CODE } = [ ID, I ] +# { id2code }{ CODESET } { ID } = CODE +# { id2names }{ ID } = [ NAME, NAME, ... ] +# { alias2id }{ NAME } = [ ID, I ] +# { id } = FIRST_UNUSED_ID +# { codealias }{ CODESET } { ALIAS } = CODE +# +# $Retired{ TYPE }{ CODESET }{ code }{ CODE } = NAME +# { name }{ NAME } = [CODE,NAME] (the key is lowercase) + +############################################################################### +# METHODS +############################################################################### + +sub new { + my($class,$type,$codeset,$show_errors) = @_; + my $self = { 'type' => '', + 'codeset' => '', + 'err' => (defined($show_errors) ? $show_errors : 1), + }; + + bless $self,$class; + + $self->type($type) if ($type); + $self->codeset($codeset) if ($codeset); + return $self; +} + +sub show_errors { + my($self,$val) = @_; + $$self{'err'} = $val; +} + +sub type { + my($self,$type) = @_; + + if (! exists $ALL_CODESETS{$type}) { + # uncoverable branch false + carp "ERROR: type: invalid argument: $type\n" if ($$self{'err'}); + return; + } + + # uncoverable branch false + if (! $ALL_CODESETS{$type}{'loaded'}) { + my $label = $ALL_CODESETS{$type}{'module'}; + eval "require Locale::Codes::${label}_Codes"; + # uncoverable branch true + if ($@) { + # uncoverable statement + croak "ERROR: type: unable to load module: ${label}_Codes\n"; + } + eval "require Locale::Codes::${label}_Retired"; + # uncoverable branch true + if ($@) { + # uncoverable statement + croak "ERROR: type: unable to load module: ${label}_Retired\n"; + } + $ALL_CODESETS{$type}{'loaded'} = 1; + } + + $$self{'type'} = $type; + $$self{'codeset'} = $ALL_CODESETS{$type}{'default'}; +} + +sub codeset { + my($self,$codeset) = @_; + + my $type = $$self{'type'}; + if (! exists $ALL_CODESETS{$type}{'codesets'}{$codeset}) { + # uncoverable branch false + carp "ERROR: codeset: invalid argument: $codeset\n" if ($$self{'err'}); + } + + $$self{'codeset'} = $codeset; +} + +sub version { + # uncoverable subroutine + # uncoverable statement + my($self) = @_; + # uncoverable statement + return $VERSION; +} + +############################################################################### + +# This is used to validate a codeset and/or code. It will also format +# a code for that codeset. +# +# (ERR,RET_CODE,RET_CODESET) = $o->_code([CODE [,CODESET]]) +# +# If CODE is empty/undef, only the codeset will be validated +# and RET_CODE will be empty. +# +# If CODE is passed in, it will be returned formatted correctly +# for the codeset. +# +# ERR will be 0 or 1. +# +# If $no_check_code is 1, then the code will not be validated (i.e. +# it doesn't already have to exist). This will be useful for adding +# a new code. +# +sub _code { + my($self,$code,$codeset,$no_check_code) = @_; + $code = '' if (! defined($code)); + $codeset = lc($codeset) if (defined($codeset)); + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + my $type = $$self{'type'}; + if ($codeset && ! exists $ALL_CODESETS{$type}{'codesets'}{$codeset}) { + carp "ERROR: _code: invalid codeset provided: $codeset\n" + if ($$self{'err'}); + return (1); + } + + # If no codeset was passed in, return the codeset specified. + + $codeset = $$self{'codeset'} if (! defined($codeset) || $codeset eq ''); + return (0,'',$codeset) if ($code eq ''); + + # Determine the properties of the codeset + + my($op,@args) = @{ $ALL_CODESETS{$type}{'codesets'}{$codeset} }; + + if ($op eq 'lc') { + $code = lc($code); + } + + if ($op eq 'uc') { + $code = uc($code); + } + + if ($op eq 'ucfirst') { + $code = ucfirst(lc($code)); + } + + # uncoverable branch false + if ($op eq 'numeric') { + if ($code =~ /^\d+$/) { + my $l = $args[0]; + $code = sprintf("%.${l}d", $code); + + } else { + # uncoverable statement + carp "ERROR: _code: invalid numeric code: $code\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + } + + # Determine if the code is in the codeset. + + if (! $no_check_code && + ! exists $Data{$type}{'code2id'}{$codeset}{$code} && + ! exists $Retired{$type}{$codeset}{'code'}{$code} && + ! exists $Data{$type}{'codealias'}{$codeset}{$code}) { + carp "ERROR: _code: code not in codeset: $code [$codeset]\n" + if ($$self{'err'}); + return (1); + } + + return (0,$code,$codeset); +} + +############################################################################### + +# $name = $o->code2name(CODE [,CODESET] [,'retired']) +# $code = $o->name2code(NAME [,CODESET] [,'retired']) +# +# Returns the name associated with the CODE (or vice versa). +# +sub code2name { + my($self,@args) = @_; + my $retired = 0; + if (@args && defined($args[$#args]) && lc($args[$#args]) eq 'retired') { + pop(@args); + $retired = 1; + } + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + my $type = $$self{'type'}; + + my ($err,$code,$codeset) = $self->_code(@args); + return undef if ($err || ! $code); + + $code = $Data{$type}{'codealias'}{$codeset}{$code} + if (exists $Data{$type}{'codealias'}{$codeset}{$code}); + + if (exists $Data{$type}{'code2id'}{$codeset}{$code}) { + my ($id,$i) = @{ $Data{$type}{'code2id'}{$codeset}{$code} }; + my $name = $Data{$type}{'id2names'}{$id}[$i]; + return $name; + + } elsif ($retired && exists $Retired{$type}{$codeset}{'code'}{$code}) { + return $Retired{$type}{$codeset}{'code'}{$code}; + + } else { + return undef; + } +} + +sub name2code { + my($self,$name,@args) = @_; + return undef if (! $name); + $name = lc($name); + + my $retired = 0; + if (@args && defined($args[$#args]) && lc($args[$#args]) eq 'retired') { + pop(@args); + $retired = 1; + } + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + my $type = $$self{'type'}; + + my ($err,$tmp,$codeset) = $self->_code('',@args); + return undef if ($err); + + if (exists $Data{$type}{'alias2id'}{$name}) { + my $id = $Data{$type}{'alias2id'}{$name}[0]; + if (exists $Data{$type}{'id2code'}{$codeset}{$id}) { + return $Data{$type}{'id2code'}{$codeset}{$id}; + } + + } elsif ($retired && exists $Retired{$type}{$codeset}{'name'}{$name}) { + return $Retired{$type}{$codeset}{'name'}{$name}[0]; + } + + return undef; +} + +# $code = $o->code2code(CODE,CODESET2) +# $code = $o->code2code(CODE,CODESET1,CODESET2) +# +# Changes the code in the CODESET1 (or the current codeset) to another +# codeset (CODESET2) +# +sub code2code { + my($self,@args) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + my $type = $$self{'type'}; + + my($code,$codeset1,$codeset2,$err); + + if (@args == 2) { + ($code,$codeset2) = @args; + ($err,$code,$codeset1) = $self->_code($code); + # uncoverable branch true + return undef if ($err); + + } elsif (@args == 3) { + ($code,$codeset1,$codeset2) = @args; + ($err,$code) = $self->_code($code,$codeset1); + return undef if ($err); + ($err) = $self->_code('',$codeset2); + # uncoverable branch true + return undef if ($err); + } + + my $name = $self->code2name($code,$codeset1); + my $out = $self->name2code($name,$codeset2); + return $out; +} + +############################################################################### + +# @codes = $o->all_codes([CODESET] [,'retired']); +# @names = $o->all_names([CODESET] [,'retired']); +# +# Returns all codes/names in the specified codeset, including retired +# ones if the option is given. + +sub all_codes { + my($self,@args) = @_; + my $retired = 0; + if (@args && defined($args[$#args]) && lc($args[$#args]) eq 'retired') { + pop(@args); + $retired = 1; + } + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + my $type = $$self{'type'}; + + my ($err,$tmp,$codeset) = $self->_code('',@args); + return () if ($err); + + my @codes = keys %{ $Data{$type}{'code2id'}{$codeset} }; + push(@codes,keys %{ $Retired{$type}{$codeset}{'code'} }) if ($retired); + return (sort @codes); +} + +sub all_names { + my($self,@args) = @_; + my $retired = 0; + if (@args && defined($args[$#args]) && lc($args[$#args]) eq 'retired') { + pop(@args); + $retired = 1; + } + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return (1); + } + my $type = $$self{'type'}; + + my ($err,$tmp,$codeset) = $self->_code('',@args); + return () if ($err); + + my @codes = $self->all_codes($codeset); + my @names; + + foreach my $code (@codes) { + my($id,$i) = @{ $Data{$type}{'code2id'}{$codeset}{$code} }; + my $name = $Data{$type}{'id2names'}{$id}[$i]; + push(@names,$name); + } + if ($retired) { + foreach my $lc (keys %{ $Retired{$type}{$codeset}{'name'} }) { + my $name = $Retired{$type}{$codeset}{'name'}{$lc}[1]; + push @names,$name; + } + } + return (sort @names); +} + +############################################################################### + +# $flag = $o->rename_code (CODE,NEW_NAME [,CODESET]) +# +# Change the official name for a code. The original is retained +# as an alias, but the new name will be returned if you lookup the +# name from code. +# +# Returns 1 on success. +# +sub rename_code { + my($self,$code,$new_name,$codeset) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Make sure $code/$codeset are both valid + + my($err,$c,$cs) = $self->_code($code,$codeset); + if ($err) { + carp "ERROR: rename: Unknown code/codeset: $code [$codeset]\n" + if ($$self{'err'}); + return 0; + } + ($code,$codeset) = ($c,$cs); + + # Cases: + # 1. Renaming to a name which exists with a different ID + # Error + # + # 2. Renaming to a name which exists with the same ID + # Just change code2id (I value) + # + # 3. Renaming to a new name + # Create a new alias + # Change code2id (I value) + + my $id = $Data{$type}{'code2id'}{$codeset}{$code}[0]; + + if (exists $Data{$type}{'alias2id'}{lc($new_name)}) { + # Existing name (case 1 and 2) + + my ($new_id,$i) = @{ $Data{$type}{'alias2id'}{lc($new_name)} }; + if ($new_id != $id) { + # Case 1 + carp "ERROR: rename: rename to an existing name not allowed\n" + if ($$self{'err'}); + return 0; + } + + # Case 2 + + $Data{$type}{'code2id'}{$codeset}{$code}[1] = $i; + + } else { + + # Case 3 + + push @{ $Data{$type}{'id2names'}{$id} },$new_name; + my $i = $#{ $Data{$type}{'id2names'}{$id} }; + $Data{$type}{'alias2id'}{lc($new_name)} = [ $id,$i ]; + $Data{$type}{'code2id'}{$codeset}{$code}[1] = $i; + } + + return 1; +} + +############################################################################### + +# $flag = $o->add_code (CODE,NAME [,CODESET]) +# +# Add a new code to the codeset. Both CODE and NAME must be +# unused in the code set. +# +sub add_code { + my($self,$code,$name,$codeset) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Make sure that $codeset is valid. + + my($err,$c,$cs) = $self->_code($code,$codeset,1); + if ($err) { + carp "ERROR: rename: Unknown codeset: $codeset\n" + if ($$self{'err'}); + return 0; + } + ($code,$codeset) = ($c,$cs); + + # Check that $code is unused. + + if (exists $Data{$type}{'code2id'}{$codeset}{$code} || + exists $Data{$type}{'codealias'}{$codeset}{$code}) { + carp "add_code: code already in use: $code\n" if ($$self{'err'}); + return 0; + } + + # Check to see that $name is unused in this code set. If it is + # used (but not in this code set), we'll use that ID. Otherwise, + # we'll need to get the next available ID. + + my ($id,$i); + if (exists $Data{$type}{'alias2id'}{lc($name)}) { + ($id,$i) = @{ $Data{$type}{'alias2id'}{lc($name)} }; + if (exists $Data{$type}{'id2code'}{$codeset}{$id}) { + carp "add_code: name already in use: $name\n" if ($$self{'err'}); + return 0; + } + + } else { + $id = $Data{$type}{'id'}++; + $i = 0; + $Data{$type}{'alias2id'}{lc($name)} = [ $id,$i ]; + $Data{$type}{'id2names'}{$id} = [ $name ]; + } + + # Add the new code + + $Data{$type}{'code2id'}{$codeset}{$code} = [ $id,$i ]; + $Data{$type}{'id2code'}{$codeset}{$id} = $code; + + return 1; +} + +############################################################################### + +# $flag = $o->delete_code (CODE [,CODESET]) +# +# Delete a code from the codeset. +# +sub delete_code { + my($self,$code,$codeset) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Make sure $code/$codeset are both valid + + my($err,$c,$cs) = $self->_code($code,$codeset); + # uncoverable branch true + if ($err) { + # uncoverable statement + carp "ERROR: rename: Unknown code/codeset: $code [$codeset]\n" + if ($$self{'err'}); + # uncoverable statement + return 0; + } + ($code,$codeset) = ($c,$cs); + + # Delete the code + + my $id = $Data{$type}{'code2id'}{$codeset}{$code}[0]; + delete $Data{$type}{'code2id'}{$codeset}{$code}; + delete $Data{$type}{'id2code'}{$codeset}{$id}; + + # Delete any aliases that are linked to this code + + foreach my $alias (keys %{ $Data{$type}{'codealias'}{$codeset} }) { + next if ($Data{$type}{'codealias'}{$codeset}{$alias} ne $code); + delete $Data{$type}{'codealias'}{$codeset}{$alias}; + } + + # If this ID is not used in any other codeset, delete it completely. + + foreach my $c (keys %{ $Data{$type}{'id2code'} }) { + return 1 if (exists $Data{$type}{'id2code'}{$c}{$id}); + } + + my @names = @{ $Data{$type}{'id2names'}{$id} }; + delete $Data{$type}{'id2names'}{$id}; + + foreach my $name (@names) { + delete $Data{$type}{'alias2id'}{lc($name)}; + } + + return 1; +} + +############################################################################### + +# $flag = $o->add_alias (NAME,NEW_NAME) +# +# Add a new alias. NAME must exist, and NEW_NAME must be unused. +# +sub add_alias { + my($self,$name,$new_name) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Check that $name is used and $new_name is new. + + my($id); + if (exists $Data{$type}{'alias2id'}{lc($name)}) { + $id = $Data{$type}{'alias2id'}{lc($name)}[0]; + } else { + carp "add_alias: name does not exist: $name\n" if ($$self{'err'}); + return 0; + } + + if (exists $Data{$type}{'alias2id'}{lc($new_name)}) { + carp "add_alias: alias already in use: $new_name\n" if ($$self{'err'}); + return 0; + } + + # Add the new alias + + push @{ $Data{$type}{'id2names'}{$id} },$new_name; + my $i = $#{ $Data{$type}{'id2names'}{$id} }; + $Data{$type}{'alias2id'}{lc($new_name)} = [ $id,$i ]; + + return 1; +} + +############################################################################### + +# $flag = $o->delete_alias (NAME) +# +# This deletes a name from the list of names used by an element. +# NAME must be used, but must NOT be the only name in the list. +# +# Any id2name that references this name will be changed to +# refer to the first name in the list. +# +sub delete_alias { + my($self,$name) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Check that $name is used. + + my($id,$i); + if (exists $Data{$type}{'alias2id'}{lc($name)}) { + ($id,$i) = @{ $Data{$type}{'alias2id'}{lc($name)} }; + } else { + carp "delete_alias: name does not exist: $name\n" if ($$self{'err'}); + return 0; + } + + my $n = $#{ $Data{$type}{'id2names'}{$id} } + 1; + if ($n == 1) { + carp "delete_alias: only one name defined (use delete_code instead)\n" + if ($$self{'err'}); + return 0; + } + + # Delete the alias. + + splice (@{ $Data{$type}{'id2names'}{$id} },$i,1); + delete $Data{$type}{'alias2id'}{lc($name)}; + + # Every element that refers to this ID: + # Ignore if I < $i + # Set to 0 if I = $i + # Decrement if I > $i + + foreach my $codeset (keys %{ $Data{$type}{'code2id'} }) { + foreach my $code (keys %{ $Data{$type}{'code2id'}{$codeset} }) { + my($jd,$j) = @{ $Data{$type}{'code2id'}{$codeset}{$code} }; + next if ($jd ne $id || + $j < $i); + if ($i == $j) { + $Data{$type}{'code2id'}{$codeset}{$code}[1] = 0; + } else { + $Data{$type}{'code2id'}{$codeset}{$code}[1]--; + } + } + } + + return 1; +} + +############################################################################### + +# $flag = $o->replace_code (CODE,NEW_CODE [,CODESET]) +# +# Change the official code. The original is retained as an alias, but +# the new code will be returned if do a name2code lookup. +# +sub replace_code { + my($self,$code,$new_code,$codeset) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Make sure $code/$codeset are both valid (and that $new_code is the + # correct format) + + my($err,$c,$cs) = $self->_code($code,$codeset); + if ($err) { + carp "ERROR: rename_code: Unknown code/codeset: $code [$codeset]\n" + if ($$self{'err'}); + return 0; + } + ($code,$codeset) = ($c,$cs); + + ($err,$new_code,$codeset) = $self->_code($new_code,$codeset,1); + + # Cases: + # 1. Renaming code to an existing alias of this code: + # Make the alias real and the code an alias + # + # 2. Renaming code to some other existing alias: + # Error + # + # 3. Renaming code to some other code: + # Error ( + # + # 4. Renaming code to a new code: + # Make code into an alias + # Replace code with new_code. + + if (exists $Data{$type}{'codealias'}{$codeset}{$new_code}) { + # Cases 1 and 2 + if ($Data{$type}{'codealias'}{$codeset}{$new_code} eq $code) { + # Case 1 + + delete $Data{$type}{'codealias'}{$codeset}{$new_code}; + + } else { + # Case 2 + carp "rename_code: new code already in use: $new_code\n" + if ($$self{'err'}); + return 0; + } + + } elsif (exists $Data{$type}{'code2id'}{$codeset}{$new_code}) { + # Case 3 + carp "rename_code: new code already in use: $new_code\n" + if ($$self{'err'}); + return 0; + } + + # Cases 1 and 4 + + $Data{$type}{'codealias'}{$codeset}{$code} = $new_code; + + my $id = $Data{$type}{'code2id'}{$codeset}{$code}[0]; + $Data{$type}{'code2id'}{$codeset}{$new_code} = + $Data{$type}{'code2id'}{$codeset}{$code}; + delete $Data{$type}{'code2id'}{$codeset}{$code}; + + $Data{$type}{'id2code'}{$codeset}{$id} = $new_code; + + return 1; +} + +############################################################################### + +# $flag = $o->add_code_alias (CODE,NEW_CODE [,CODESET]) +# +# Adds an alias for the code. +# +sub add_code_alias { + my($self,$code,$new_code,$codeset) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Make sure $code/$codeset are both valid and that the new code is + # properly formatted. + + my($err,$c,$cs) = $self->_code($code,$codeset); + if ($err) { + carp "ERROR: add_code_alias: Unknown code/codeset: $code [$codeset]\n" + if ($$self{'err'}); + return 0; + } + ($code,$codeset) = ($c,$cs); + + ($err,$new_code,$cs) = $self->_code($new_code,$codeset,1); + + # Check that $new_code does not exist. + + if (exists $Data{$type}{'code2id'}{$codeset}{$new_code} || + exists $Data{$type}{'codealias'}{$codeset}{$new_code}) { + # uncoverable branch true + carp "add_code_alias: code already in use: $new_code\n" if ($$self{'err'}); + return 0; + } + + # Add the alias + + $Data{$type}{'codealias'}{$codeset}{$new_code} = $code; + + return 1; +} + +############################################################################### + +# $flag = $o->delete_code_alias (ALIAS [,CODESET]) +# +# Deletes an alias for the code. +# +sub delete_code_alias { + my($self,$code,$codeset) = @_; + + # uncoverable branch true + if (! $$self{'type'}) { + # uncoverable statement + carp "ERROR: no type set for Locale::Codes object\n" if ($$self{'err'}); + # uncoverable statement + return 0; + } + my $type = $$self{'type'}; + + # Make sure $code/$codeset are both valid + + my($err,$c,$cs) = $self->_code($code,$codeset); + if ($err) { + # uncoverable branch true + carp "ERROR: rename: Unknown code/codeset: $code [$codeset]\n" + if ($$self{'err'}); + return 0; + } + ($code,$codeset) = ($c,$cs); + + # Check that $code exists in the codeset as an alias. + + if (! exists $Data{$type}{'codealias'}{$codeset}{$code}) { + # uncoverable branch true + carp "delete_code_alias(): no alias defined: $code\n" if ($$self{'err'}); + return 0; + } + + # Delete the alias + + delete $Data{$type}{'codealias'}{$codeset}{$code}; + + return 1; +} + +1; +# Local Variables: +# mode: cperl +# indent-tabs-mode: nil +# cperl-indent-level: 3 +# cperl-continued-statement-offset: 2 +# cperl-continued-brace-offset: 0 +# cperl-brace-offset: 0 +# cperl-brace-imaginary-offset: 0 +# cperl-label-offset: 0 +# End: +package Locale::Currency; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2currency + currency2code + all_currency_codes + all_currency_names + currency_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_CURRENCY); + +our $obj = new Locale::Codes('currency'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2currency { + return $obj->code2name(@_); +} + +sub currency2code { + return $obj->name2code(@_); +} + +sub currency_code2code { + return $obj->code2code(@_); +} + +sub all_currency_codes { + return $obj->all_codes(@_); +} + +sub all_currency_names { + return $obj->all_names(@_); +} + +sub rename_currency { + return $obj->rename_code(@_); +} + +sub add_currency { + return $obj->add_code(@_); +} + +sub delete_currency { + return $obj->delete_code(@_); +} + +sub add_currency_alias { + return $obj->add_alias(@_); +} + +sub delete_currency_alias { + return $obj->delete_alias(@_); +} + +sub rename_currency_code { + return $obj->replace_code(@_); +} + +sub add_currency_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_currency_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package Locale::Script; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2script + script2code + all_script_codes + all_script_names + script_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_SCRIPT); + +our $obj = new Locale::Codes('script'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2script { + return $obj->code2name(@_); +} + +sub script2code { + return $obj->name2code(@_); +} + +sub script_code2code { + return $obj->code2code(@_); +} + +sub all_script_codes { + return $obj->all_codes(@_); +} + +sub all_script_names { + return $obj->all_names(@_); +} + +sub rename_script { + return $obj->rename_code(@_); +} + +sub add_script { + return $obj->add_code(@_); +} + +sub delete_script { + return $obj->delete_code(@_); +} + +sub add_script_alias { + return $obj->add_alias(@_); +} + +sub delete_script_alias { + return $obj->delete_alias(@_); +} + +sub rename_script_code { + return $obj->replace_code(@_); +} + +sub add_script_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_script_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package Locale::Country; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2country + country2code + all_country_codes + all_country_names + country_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_COUNTRY); + +our $obj = new Locale::Codes('country'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2country { + return $obj->code2name(@_); +} + +sub country2code { + return $obj->name2code(@_); +} + +sub country_code2code { + return $obj->code2code(@_); +} + +sub all_country_codes { + return $obj->all_codes(@_); +} + +sub all_country_names { + return $obj->all_names(@_); +} + +sub rename_country { + return $obj->rename_code(@_); +} + +sub add_country { + return $obj->add_code(@_); +} + +sub delete_country { + return $obj->delete_code(@_); +} + +sub add_country_alias { + return $obj->add_alias(@_); +} + +sub delete_country_alias { + return $obj->delete_alias(@_); +} + +sub rename_country_code { + return $obj->replace_code(@_); +} + +sub add_country_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_country_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package Locale::Language; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2language + language2code + all_language_codes + all_language_names + language_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_LANGUAGE); + +our $obj = new Locale::Codes('language'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2language { + return $obj->code2name(@_); +} + +sub language2code { + return $obj->name2code(@_); +} + +sub language_code2code { + return $obj->code2code(@_); +} + +sub all_language_codes { + return $obj->all_codes(@_); +} + +sub all_language_names { + return $obj->all_names(@_); +} + +sub rename_language { + return $obj->rename_code(@_); +} + +sub add_language { + return $obj->add_code(@_); +} + +sub delete_language { + return $obj->delete_code(@_); +} + +sub add_language_alias { + return $obj->add_alias(@_); +} + +sub delete_language_alias { + return $obj->delete_alias(@_); +} + +sub rename_language_code { + return $obj->replace_code(@_); +} + +sub add_language_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_language_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package Locale::Codes::LangVar; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2langvar + langvar2code + all_langvar_codes + all_langvar_names + langvar_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_LANGVAR); + +our $obj = new Locale::Codes('langvar'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2langvar { + return $obj->code2name(@_); +} + +sub langvar2code { + return $obj->name2code(@_); +} + +sub langvar_code2code { + return $obj->code2code(@_); +} + +sub all_langvar_codes { + return $obj->all_codes(@_); +} + +sub all_langvar_names { + return $obj->all_names(@_); +} + +sub rename_langvar { + return $obj->rename_code(@_); +} + +sub add_langvar { + return $obj->add_code(@_); +} + +sub delete_langvar { + return $obj->delete_code(@_); +} + +sub add_langvar_alias { + return $obj->add_alias(@_); +} + +sub delete_langvar_alias { + return $obj->delete_alias(@_); +} + +sub rename_langvar_code { + return $obj->replace_code(@_); +} + +sub add_langvar_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_langvar_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package # +Locale::Codes::LangExt_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Fri Feb 23 12:58:17 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'langext'}{'alpha'}{'code'} = { + q(rsi) => q(Rennellese Sign Language), + q(yds) => q(Yiddish Sign Language), +}; + +$Locale::Codes::Retired{'langext'}{'alpha'}{'name'} = { + q(hawai'i pidgin sign language) => [ q(hps), q(Hawai'i Pidgin Sign Language) ], + q(rennellese sign language) => [ q(rsi), q(Rennellese Sign Language) ], + q(yiddish sign language) => [ q(yds), q(Yiddish Sign Language) ], +}; + + +1; +package # +Locale::Codes::Script_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Fri Feb 23 12:58:17 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'script'}{'alpha'}{'code'} = { +}; + +$Locale::Codes::Retired{'script'}{'num'}{'code'} = { +}; + +$Locale::Codes::Retired{'script'}{'alpha'}{'name'} = { + q( multani) => [ q(Mult), q( Multani) ], + q((alias for hiragana + katakana)) => [ q(Hrkt), q((alias for Hiragana + Katakana)) ], + q(ahom, tai ahom) => [ q(Ahom), q(Ahom, Tai Ahom) ], + q(cuneiform, sumero-akkadian) => [ q(Xsux), q(Cuneiform, Sumero-Akkadian) ], + q(cypriot) => [ q(Cprt), q(Cypriot) ], + q(deseret (mormon)) => [ q(Dsrt), q(Deseret (Mormon)) ], + q(devanagari (nagari)) => [ q(Deva), q(Devanagari (Nagari)) ], + q(duployan shorthand, duployan stenography) => [ q(Dupl), q(Duployan shorthand, Duployan stenography) ], + q(ethiopic (geez)) => [ q(Ethi), q(Ethiopic (Geez)) ], + q(han (hanzi, kanji, hanja)) => [ q(Hani), q(Han (Hanzi, Kanji, Hanja)) ], + q(hangul (hangul, hangeul)) => [ q(Hang), q(Hangul (Hangul, Hangeul)) ], + q(hanunoo (hanunoo)) => [ q(Hano), q(Hanunoo (Hanunoo)) ], + q(indus (harappan)) => [ q(Inds), q(Indus (Harappan)) ], + q(khudawadi, sindhi) => [ q(Sind), q(Khudawadi, Sindhi) ], + q(lepcha (rong)) => [ q(Lepc), q(Lepcha (Rong)) ], + q(lisu (fraser)) => [ q(Lisu), q(Lisu (Fraser)) ], + q(mandaic, mandaean) => [ q(Mand), q(Mandaic, Mandaean) ], + q(meitei mayek (meithei, meetei)) => [ q(Mtei), q(Meitei Mayek (Meithei, Meetei)) ], + q(mende) => [ q(Mend), q(Mende) ], + q(miao (pollard)) => [ q(Plrd), q(Miao (Pollard)) ], + q(modi, modi) => [ q(Mult), q(Modi, Modi) ], + q(moon (moon code, moon script, moon type)) => [ q(Moon), q(Moon (Moon code, Moon script, Moon type)) ], + q(mro, mru) => [ q(Mroo), q(Mro, Mru) ], + q(myanmar (burmese)) => [ q(Mymr), q(Myanmar (Burmese)) ], + q(nakhi geba) => [ q(Nkgb), q(Nakhi Geba) ], + q(nakhi geba ('na-'khi ggo-baw, naxi geba)) => [ q(Nkgb), q(Nakhi Geba ('Na-'Khi Ggo-baw, Naxi Geba)) ], + q(ol chiki (ol cemet, ol, santali)) => [ q(Olck), q(Ol Chiki (Ol Cemet, Ol, Santali)) ], + q(old north arabian (ancient north arabian)) => [ q(Narb), q(Old North Arabian (Ancient North Arabian)) ], + q(old turkic, orkhon runic) => [ q(Orkh), q(Old Turkic, Orkhon Runic) ], + q(rejang (redjang, kaganga)) => [ q(Rjng), q(Rejang (Redjang, Kaganga)) ], + q(sharada, sarada) => [ q(Shrd), q(Sharada, Sarada) ], + q(shavian (shaw)) => [ q(Shaw), q(Shavian (Shaw)) ], + q(siddham, siddham, siddhamatrka) => [ q(Sidd), q(Siddham, Siddham, Siddhamatrka) ], + q(sindhi) => [ q(Sind), q(Sindhi) ], + q(tagalog (baybayin, alibata)) => [ q(Tglg), q(Tagalog (Baybayin, Alibata)) ], + q(tai tham (lanna)) => [ q(Lana), q(Tai Tham (Lanna)) ], + q(takri, takri, tankri) => [ q(Takr), q(Takri, Takri, Tankri) ], + q(tifinagh (berber)) => [ q(Tfng), q(Tifinagh (Berber)) ], + q(tiruta) => [ q(Tirh), q(Tiruta) ], + q(warang citi (varang kshiti)) => [ q(Wara), q(Warang Citi (Varang Kshiti)) ], +}; + +$Locale::Codes::Retired{'script'}{'num'}{'name'} = { + q( multani) => [ q(323), q( Multani) ], + q(cypriot) => [ q(403), q(Cypriot) ], + q(mende) => [ q(438), q(Mende) ], + q(nakhi geba ('na-'khi ggo-baw, naxi geba)) => [ q(420), q(Nakhi Geba ('Na-'Khi Ggo-baw, Naxi Geba)) ], + q(old hungarian) => [ q(176), q(Old Hungarian) ], + q(tiruta) => [ q(326), q(Tiruta) ], +}; + + +1; +package # +Locale::Codes::Country_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Fri Feb 23 12:58:17 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'country'}{'alpha-2'}{'code'} = { + q(an) => q(Netherlands Antilles), + q(cs) => q(Serbia and Montenegro), + q(fx) => q(France, Metropolitan), + q(tp) => q(East Timor), + q(yu) => q(Yugoslavia), + q(zr) => q(Zaire), +}; + +$Locale::Codes::Retired{'country'}{'alpha-3'}{'code'} = { + q(ant) => q(Netherlands Antilles), + q(ata) => q(Antarctica), + q(atf) => q(French Southern and Antarctic Lands), + q(bvt) => q(Bouvet Island), + q(cck) => q(Cocos (Keeling) Islands), + q(cxr) => q(Christmas Island), + q(fxx) => q(France, Metropolitan), + q(hmd) => q(Heard Island and Mcdonald Islands), + q(iot) => q(British Indian Ocean Territory), + q(rom) => q(Romania), + q(scg) => q(Serbia and Montenegro), + q(sgs) => q(South Georgia and the Islands), + q(tmp) => q(East Timor), + q(twn) => q(Taiwan), + q(umi) => q(United States Minor Outlying Islands), + q(yug) => q(Yugoslavia), + q(zar) => q(Zaire), +}; + +$Locale::Codes::Retired{'country'}{'dom'}{'code'} = { + q(AC) => q(Ascension Island), + q(AD) => q(Andorra), + q(AE) => q(United Arab Emirates), + q(AF) => q(Afghanistan), + q(AG) => q(Antigua and Barbuda), + q(AI) => q(Anguilla), + q(AL) => q(Albania), + q(AM) => q(Armenia), + q(AN) => q(Netherlands Antilles), + q(AO) => q(Angola), + q(AQ) => q(Antarctica), + q(AR) => q(Argentina), + q(AS) => q(American Samoa), + q(AT) => q(Austria), + q(AU) => q(Australia), + q(AW) => q(Aruba), + q(AX) => q(Aland Islands), + q(AZ) => q(Azerbaijan), + q(BA) => q(Bosnia and Herzegovina), + q(BB) => q(Barbados), + q(BD) => q(Bangladesh), + q(BE) => q(Belgium), + q(BF) => q(Burkina Faso), + q(BG) => q(Bulgaria), + q(BH) => q(Bahrain), + q(BI) => q(Burundi), + q(BJ) => q(Benin), + q(BL) => q(Saint Barthelemy), + q(BM) => q(Bermuda), + q(BN) => q(Brunei Darussalam), + q(BO) => q(Bolivia, Plurinational State of), + q(BQ) => q(Bonaire, Sint Eustatius and Saba), + q(BR) => q(Brazil), + q(BS) => q(Bahamas), + q(BT) => q(Bhutan), + q(BV) => q(Bouvet Island), + q(BW) => q(Botswana), + q(BY) => q(Belarus), + q(BZ) => q(Belize), + q(CA) => q(Canada), + q(CC) => q(Cocos (Keeling) Islands), + q(CD) => q(Congo, The Democratic Republic of the), + q(CF) => q(Central African Republic), + q(CG) => q(Congo), + q(CH) => q(Switzerland), + q(CI) => q(Cote d'Ivoire), + q(CK) => q(Cook Islands), + q(CL) => q(Chile), + q(CM) => q(Cameroon), + q(CN) => q(China), + q(CO) => q(Colombia), + q(CR) => q(Costa Rica), + q(CU) => q(Cuba), + q(CV) => q(Cape Verde), + q(CW) => q(Curacao), + q(CX) => q(Christmas Island), + q(CY) => q(Cyprus), + q(CZ) => q(Czech Republic), + q(DE) => q(Germany), + q(DJ) => q(Djibouti), + q(DK) => q(Denmark), + q(DM) => q(Dominica), + q(DO) => q(Dominican Republic), + q(DZ) => q(Algeria), + q(EC) => q(Ecuador), + q(EE) => q(Estonia), + q(EG) => q(Egypt), + q(EH) => q(Western Sahara), + q(ER) => q(Eritrea), + q(ES) => q(Spain), + q(ET) => q(Ethiopia), + q(EU) => q(European Union), + q(FI) => q(Finland), + q(FJ) => q(Fiji), + q(FK) => q(Falkland Islands (Malvinas)), + q(FM) => q(Micronesia, Federated States of), + q(FO) => q(Faroe Islands), + q(FR) => q(France), + q(FX) => q(France, Metropolitan), + q(GA) => q(Gabon), + q(GB) => q(United Kingdom), + q(GD) => q(Grenada), + q(GE) => q(Georgia), + q(GF) => q(French Guiana), + q(GG) => q(Guernsey), + q(GH) => q(Ghana), + q(GI) => q(Gibraltar), + q(GL) => q(Greenland), + q(GM) => q(Gambia), + q(GN) => q(Guinea), + q(GP) => q(Guadeloupe), + q(GQ) => q(Equatorial Guinea), + q(GR) => q(Greece), + q(GS) => q(South Georgia and the South Sandwich Islands), + q(GT) => q(Guatemala), + q(GU) => q(Guam), + q(GW) => q(Guinea-Bissau), + q(GY) => q(Guyana), + q(HK) => q(Hong Kong), + q(HM) => q(Heard Island and Mcdonald Islands), + q(HN) => q(Honduras), + q(HR) => q(Croatia), + q(HT) => q(Haiti), + q(HU) => q(Hungary), + q(ID) => q(Indonesia), + q(IE) => q(Ireland), + q(IL) => q(Israel), + q(IM) => q(Isle of Man), + q(IN) => q(India), + q(IO) => q(British Indian Ocean Territory), + q(IQ) => q(Iraq), + q(IR) => q(Iran, Islamic Republic of), + q(IS) => q(Iceland), + q(IT) => q(Italy), + q(JE) => q(Jersey), + q(JM) => q(Jamaica), + q(JO) => q(Jordan), + q(JP) => q(Japan), + q(KE) => q(Kenya), + q(KG) => q(Kyrgyzstan), + q(KH) => q(Cambodia), + q(KI) => q(Kiribati), + q(KM) => q(Comoros), + q(KN) => q(Saint Kitts and Nevis), + q(KP) => q(Korea, Democratic People's Republic of), + q(KR) => q(Korea, Republic of), + q(KW) => q(Kuwait), + q(KY) => q(Cayman Islands), + q(KZ) => q(Kazakhstan), + q(LA) => q(Lao People's Democratic Republic), + q(LB) => q(Lebanon), + q(LC) => q(Saint Lucia), + q(LI) => q(Liechtenstein), + q(LK) => q(Sri Lanka), + q(LR) => q(Liberia), + q(LS) => q(Lesotho), + q(LT) => q(Lithuania), + q(LU) => q(Luxembourg), + q(LV) => q(Latvia), + q(LY) => q(Libya), + q(MA) => q(Morocco), + q(MC) => q(Monaco), + q(MD) => q(Moldova, Republic of), + q(ME) => q(Montenegro), + q(MF) => q(Saint Martin (French part)), + q(MG) => q(Madagascar), + q(MH) => q(Marshall Islands), + q(MK) => q(Macedonia, The Former Yugoslav Republic of), + q(ML) => q(Mali), + q(MM) => q(Myanmar), + q(MN) => q(Mongolia), + q(MO) => q(Macao), + q(MP) => q(Northern Mariana Islands), + q(MQ) => q(Martinique), + q(MR) => q(Mauritania), + q(MS) => q(Montserrat), + q(MT) => q(Malta), + q(MU) => q(Mauritius), + q(MV) => q(Maldives), + q(MW) => q(Malawi), + q(MX) => q(Mexico), + q(MY) => q(Malaysia), + q(MZ) => q(Mozambique), + q(NA) => q(Namibia), + q(NC) => q(New Caledonia), + q(NE) => q(Niger), + q(NF) => q(Norfolk Island), + q(NG) => q(Nigeria), + q(NI) => q(Nicaragua), + q(NL) => q(Netherlands), + q(NO) => q(Norway), + q(NP) => q(Nepal), + q(NR) => q(Nauru), + q(NU) => q(Niue), + q(NZ) => q(New Zealand), + q(OM) => q(Oman), + q(PA) => q(Panama), + q(PE) => q(Peru), + q(PF) => q(French Polynesia), + q(PG) => q(Papua New Guinea), + q(PH) => q(Philippines), + q(PK) => q(Pakistan), + q(PL) => q(Poland), + q(PM) => q(Saint Pierre and Miquelon), + q(PN) => q(Pitcairn), + q(PR) => q(Puerto Rico), + q(PS) => q(Palestinian Territory, Occupied), + q(PT) => q(Portugal), + q(PW) => q(Palau), + q(PY) => q(Paraguay), + q(QA) => q(Qatar), + q(RE) => q(Reunion), + q(RO) => q(Romania), + q(RS) => q(Serbia), + q(RU) => q(Russian Federation), + q(RW) => q(Rwanda), + q(SA) => q(Saudi Arabia), + q(SB) => q(Solomon Islands), + q(SC) => q(Seychelles), + q(SD) => q(Sudan), + q(SE) => q(Sweden), + q(SG) => q(Singapore), + q(SH) => q(Saint Helena, Ascension and Tristan da Cunha), + q(SI) => q(Slovenia), + q(SJ) => q(Svalbard and Jan Mayen), + q(SK) => q(Slovakia), + q(SL) => q(Sierra Leone), + q(SM) => q(San Marino), + q(SN) => q(Senegal), + q(SO) => q(Somalia), + q(SR) => q(Suriname), + q(SS) => q(South Sudan), + q(ST) => q(Sao Tome and Principe), + q(SU) => q(Soviet Union), + q(SV) => q(El Salvador), + q(SX) => q(Sint Maarten (Dutch part)), + q(SY) => q(Syrian Arab Republic), + q(SZ) => q(Swaziland), + q(TC) => q(Turks and Caicos Islands), + q(TD) => q(Chad), + q(TF) => q(French Southern Territories), + q(TG) => q(Togo), + q(TH) => q(Thailand), + q(TJ) => q(Tajikistan), + q(TK) => q(Tokelau), + q(TL) => q(Timor-Leste), + q(TM) => q(Turkmenistan), + q(TN) => q(Tunisia), + q(TO) => q(Tonga), + q(TP) => q(Portuguese Timor), + q(TR) => q(Turkey), + q(TT) => q(Trinidad and Tobago), + q(TV) => q(Tuvalu), + q(TW) => q(Taiwan, Province of China), + q(TZ) => q(Tanzania, United Republic of), + q(UA) => q(Ukraine), + q(UG) => q(Uganda), + q(UK) => q(United Kingdom), + q(UM) => q(United States Minor Outlying Islands), + q(US) => q(United States), + q(UY) => q(Uruguay), + q(UZ) => q(Uzbekistan), + q(VA) => q(Holy See (Vatican City State)), + q(VC) => q(Saint Vincent and the Grenadines), + q(VE) => q(Venezuela, Bolivarian Republic of), + q(VG) => q(Virgin Islands, British), + q(VI) => q(Virgin Islands, U.S.), + q(VN) => q(Viet Nam), + q(VU) => q(Vanuatu), + q(WF) => q(Wallis and Futuna), + q(WS) => q(Samoa), + q(YE) => q(Yemen), + q(YT) => q(Mayotte), + q(YU) => q(Yugoslavia ), + q(ZA) => q(South Africa), + q(ZM) => q(Zambia), + q(ZW) => q(Zimbabwe), + q(ac) => q(Ascension Island), + q(an) => q(Netherlands Antilles), + q(eu) => q(European Union), + q(su) => q(USSR), + q(tp) => q(East Timor), + q(uk) => q(United Kingdom), +}; + +$Locale::Codes::Retired{'country'}{'genc-alpha-2'}{'code'} = { +}; + +$Locale::Codes::Retired{'country'}{'genc-alpha-3'}{'code'} = { +}; + +$Locale::Codes::Retired{'country'}{'genc-numeric'}{'code'} = { +}; + +$Locale::Codes::Retired{'country'}{'numeric'}{'code'} = { + q(010) => q(Antarctica), + q(074) => q(Bouvet Island), + q(086) => q(British Indian Ocean Territory), + q(158) => q(Taiwan), + q(162) => q(Christmas Island), + q(166) => q(Cocos (Keeling) Islands), + q(239) => q(South Georgia and the Islands), + q(249) => q(France, Metropolitan), + q(260) => q(French Southern and Antarctic Lands), + q(334) => q(Heard Island and Mcdonald Islands), + q(530) => q(Netherlands Antilles), + q(581) => q(United States Minor Outlying Islands), + q(680) => q(Sark), + q(736) => q(Sudan), + q(830) => q(Channel Islands), + q(891) => q(Serbia and Montenegro), +}; + +$Locale::Codes::Retired{'country'}{'un-alpha-3'}{'code'} = { +}; + +$Locale::Codes::Retired{'country'}{'un-numeric'}{'code'} = { + q(830) => q(Channel Islands), +}; + +$Locale::Codes::Retired{'country'}{'alpha-2'}{'name'} = { + q(bolivia) => [ q(bo), q(Bolivia) ], + q(bolivia, plurinational state of) => [ q(bo), q(Bolivia, Plurinational State of) ], + q(bonaire, saint eustatius and saba) => [ q(bq), q(Bonaire, Saint Eustatius and Saba) ], + q(bosnia and herzegowina) => [ q(ba), q(Bosnia and Herzegowina) ], + q(cape verde) => [ q(cv), q(Cape Verde) ], + q(congo, the democratic republic of the) => [ q(cd), q(Congo, The Democratic Republic of the) ], + q(czech republic) => [ q(cz), q(Czech Republic) ], + q(east timor) => [ q(tl), q(East Timor) ], + q(falkland islands (malvinas)) => [ q(fk), q(Falkland Islands (Malvinas)) ], + q(france, metropolitan) => [ q(fx), q(France, Metropolitan) ], + q(heard and mc donald islands) => [ q(hm), q(Heard and Mc Donald Islands) ], + q(holy see (the) [vatican city state]) => [ q(va), q(Holy See (The) [Vatican City State]) ], + q(holy see (vatican city state)) => [ q(va), q(Holy See (Vatican City State)) ], + q(iran (islamic republic of)) => [ q(ir), q(Iran (Islamic Republic of)) ], + q(iran, islamic republic of) => [ q(ir), q(Iran, Islamic Republic of) ], + q(iran, the islamic republic of) => [ q(ir), q(Iran, The Islamic Republic of) ], + q(kazakstan) => [ q(kz), q(Kazakstan) ], + q(korea, democratic people's republic of) => [ q(kp), q(Korea, Democratic People's Republic of) ], + q(korea, republic of) => [ q(kr), q(Korea, Republic of) ], + q(libyan arab jamahiriya) => [ q(ly), q(Libyan Arab Jamahiriya) ], + q(macau) => [ q(mo), q(Macau) ], + q(micronesia (federated states of)) => [ q(fm), q(Micronesia (Federated States of)) ], + q(micronesia, federated states of) => [ q(fm), q(Micronesia, Federated States of) ], + q(micronesia, the federated states of) => [ q(fm), q(Micronesia, The Federated States of) ], + q(moldova, republic of) => [ q(md), q(Moldova, Republic of) ], + q(netherlands antilles) => [ q(an), q(Netherlands Antilles) ], + q(saint helena) => [ q(sh), q(Saint Helena) ], + q(saint martin) => [ q(mf), q(Saint Martin) ], + q(serbia and montenegro) => [ q(cs), q(Serbia and Montenegro) ], + q(st. helena) => [ q(sh), q(St. Helena) ], + q(st. pierre and miquelon) => [ q(pm), q(St. Pierre and Miquelon) ], + q(svalbard and jan mayen islands) => [ q(sj), q(Svalbard and Jan Mayen Islands) ], + q(taiwan, province of china) => [ q(tw), q(Taiwan, Province of China) ], + q(united kingdom) => [ q(gb), q(United Kingdom) ], + q(united states) => [ q(us), q(United States) ], + q(vatican city state (holy see)) => [ q(va), q(Vatican City State (Holy See)) ], + q(venezuela) => [ q(ve), q(Venezuela) ], + q(venezuela, bolivarian republic of) => [ q(ve), q(Venezuela, Bolivarian Republic of) ], + q(venezuela, bolivarian republic of ) => [ q(ve), q(Venezuela, Bolivarian Republic of ) ], + q(vietnam) => [ q(vn), q(Vietnam) ], + q(virgin islands (british)) => [ q(vg), q(Virgin Islands (British)) ], + q(virgin islands (u.s.)) => [ q(vi), q(Virgin Islands (U.S.)) ], + q(virgin islands, british) => [ q(vg), q(Virgin Islands, British) ], + q(virgin islands, u.s.) => [ q(vi), q(Virgin Islands, U.S.) ], + q(wallis and futuna islands) => [ q(wf), q(Wallis and Futuna Islands) ], + q(yugoslavia) => [ q(yu), q(Yugoslavia) ], + q(zaire) => [ q(zr), q(Zaire) ], +}; + +$Locale::Codes::Retired{'country'}{'alpha-3'}{'name'} = { + q(antarctica) => [ q(ata), q(Antarctica) ], + q(bolivia) => [ q(bol), q(Bolivia) ], + q(bolivia (plurinational state of)) => [ q(bol), q(Bolivia (Plurinational State of)) ], + q(bolivia, plurinational state of) => [ q(bol), q(Bolivia, Plurinational State of) ], + q(bonaire, saint eustatius and saba) => [ q(bes), q(Bonaire, Saint Eustatius and Saba) ], + q(bouvet island) => [ q(bvt), q(Bouvet Island) ], + q(british indian ocean territory) => [ q(iot), q(British Indian Ocean Territory) ], + q(british virgin islands) => [ q(vgb), q(British Virgin Islands) ], + q(cabo verde) => [ q(cpv), q(Cabo Verde) ], + q(cape verde) => [ q(cpv), q(Cape Verde) ], + q(china, hong kong special administrative region) => [ q(hkg), q(China, Hong Kong Special Administrative Region) ], + q(china, macao special administrative region) => [ q(mac), q(China, Macao Special Administrative Region) ], + q(christmas island) => [ q(cxr), q(Christmas Island) ], + q(cocos (keeling) islands) => [ q(cck), q(Cocos (Keeling) Islands) ], + q(congo, the democratic republic of the) => [ q(cod), q(Congo, The Democratic Republic of the) ], + q(czech republic) => [ q(cze), q(Czech Republic) ], + q(democratic people's republic of korea) => [ q(prk), q(Democratic People's Republic of Korea) ], + q(democratic republic of the congo) => [ q(cod), q(Democratic Republic of the Congo) ], + q(east timor) => [ q(tls), q(East Timor) ], + q(faeroe islands) => [ q(fro), q(Faeroe Islands) ], + q(falkland islands (malvinas)) => [ q(flk), q(Falkland Islands (Malvinas)) ], + q(faroe islands) => [ q(fro), q(Faroe Islands) ], + q(france, metropolitan) => [ q(fxx), q(France, Metropolitan) ], + q(french southern and antarctic lands) => [ q(atf), q(French Southern and Antarctic Lands) ], + q(french southern territories) => [ q(atf), q(French Southern Territories) ], + q(heard island and mcdonald islands) => [ q(hmd), q(Heard Island and Mcdonald Islands) ], + q(holy see) => [ q(vat), q(Holy See) ], + q(holy see (the) [vatican city state]) => [ q(vat), q(Holy See (The) [Vatican City State]) ], + q(holy see (vatican city state)) => [ q(vat), q(Holy See (Vatican City State)) ], + q(hong kong) => [ q(hkg), q(Hong Kong) ], + q(hong kong special administrative region of china) => [ q(hkg), q(Hong Kong Special Administrative Region of China) ], + q(iran (islamic republic of)) => [ q(irn), q(Iran (Islamic Republic of)) ], + q(iran, islamic republic of) => [ q(irn), q(Iran, Islamic Republic of) ], + q(iran, the islamic republic of) => [ q(irn), q(Iran, The Islamic Republic of) ], + q(kazakstan) => [ q(kaz), q(Kazakstan) ], + q(korea, democratic people's republic of) => [ q(prk), q(Korea, Democratic People's Republic of) ], + q(korea, republic of) => [ q(kor), q(Korea, Republic of) ], + q(libyan arab jamahiriya) => [ q(lby), q(Libyan Arab Jamahiriya) ], + q(macao) => [ q(mac), q(Macao) ], + q(macao special administrative region of china) => [ q(mac), q(Macao Special Administrative Region of China) ], + q(macau) => [ q(mac), q(Macau) ], + q(macedonia, the former yugoslav republic of) => [ q(mkd), q(Macedonia, the Former Yugoslav Republic of) ], + q(micronesia (federated states of)) => [ q(fsm), q(Micronesia (Federated States of)) ], + q(micronesia, federated states of) => [ q(fsm), q(Micronesia, Federated States of) ], + q(micronesia, the federated states of) => [ q(fsm), q(Micronesia, The Federated States of) ], + q(moldova, republic of) => [ q(mda), q(Moldova, Republic of) ], + q(netherlands antilles) => [ q(ant), q(Netherlands Antilles) ], + q(palestinian territory, occupied) => [ q(pse), q(Palestinian Territory, Occupied) ], + q(republic of korea) => [ q(kor), q(Republic of Korea) ], + q(republic of moldova) => [ q(mda), q(Republic of Moldova) ], + q(saint helena) => [ q(shn), q(Saint Helena) ], + q(saint-barthelemy) => [ q(blm), q(Saint-Barthelemy) ], + q(saint-martin (french part)) => [ q(maf), q(Saint-Martin (French part)) ], + q(serbia and montenegro) => [ q(scg), q(Serbia and Montenegro) ], + q(south georgia and the islands) => [ q(sgs), q(South Georgia and the Islands) ], + q(south georgia and the south sandwich islands) => [ q(sgs), q(South Georgia and the South Sandwich Islands) ], + q(state of palestine) => [ q(pse), q(State of Palestine) ], + q(svalbard and jan mayen) => [ q(sjm), q(Svalbard and Jan Mayen) ], + q(svalbard and jan mayen islands) => [ q(sjm), q(Svalbard and Jan Mayen Islands) ], + q(taiwan) => [ q(twn), q(Taiwan) ], + q(taiwan, province of china) => [ q(twn), q(Taiwan, Province of China) ], + q(tanzania, united republic of) => [ q(tza), q(Tanzania, United Republic of) ], + q(the former yugoslav republic of macedonia) => [ q(mkd), q(The former Yugoslav Republic of Macedonia) ], + q(united kingdom) => [ q(gbr), q(United Kingdom) ], + q(united kingdom of great britain and northern ireland) => [ q(gbr), q(United Kingdom of Great Britain and Northern Ireland) ], + q(united republic of tanzania) => [ q(tza), q(United Republic of Tanzania) ], + q(united states) => [ q(usa), q(United States) ], + q(united states minor outlying islands) => [ q(umi), q(United States Minor Outlying Islands) ], + q(united states of america) => [ q(usa), q(United States of America) ], + q(united states virgin islands) => [ q(vir), q(United States Virgin Islands) ], + q(venezuela) => [ q(ven), q(Venezuela) ], + q(venezuela (bolivarian republic of)) => [ q(ven), q(Venezuela (Bolivarian Republic of)) ], + q(venezuela, bolivarian republic of ) => [ q(ven), q(Venezuela, Bolivarian Republic of ) ], + q(vietnam) => [ q(vnm), q(Vietnam) ], + q(virgin islands, british) => [ q(vgb), q(Virgin Islands, British) ], + q(virgin islands, u.s.) => [ q(vir), q(Virgin Islands, U.S.) ], + q(wallis and futuna) => [ q(wlf), q(Wallis and Futuna) ], + q(wallis and futuna islands) => [ q(wlf), q(Wallis and Futuna Islands) ], + q(yugoslavia) => [ q(yug), q(Yugoslavia) ], + q(zaire) => [ q(zar), q(Zaire) ], +}; + +$Locale::Codes::Retired{'country'}{'dom'}{'name'} = { + q(ascension island) => [ q(ac), q(Ascension Island) ], + q(bolivia, plurinational state of) => [ q(bo), q(Bolivia, Plurinational State of) ], + q(bonaire, saint eustatius and saba) => [ q(bq), q(Bonaire, Saint Eustatius and Saba) ], + q(bonaire, sint eustatius and saba) => [ q(BQ), q(Bonaire, Sint Eustatius and Saba) ], + q(cape verde) => [ q(cv), q(Cape Verde) ], + q(congo, the democratic republic of the) => [ q(cd), q(Congo, The Democratic Republic of the) ], + q(czech republic) => [ q(cz), q(Czech Republic) ], + q(east timor) => [ q(tp), q(East Timor) ], + q(european union) => [ q(eu), q(European Union) ], + q(falkland islands (malvinas)) => [ q(fk), q(Falkland Islands (Malvinas)) ], + q(france, metropolitan) => [ q(FX), q(France, Metropolitan) ], + q(holy see (the) [vatican city state]) => [ q(va), q(Holy See (The) [Vatican City State]) ], + q(holy see (vatican city state)) => [ q(va), q(Holy See (Vatican City State)) ], + q(iran, islamic republic of) => [ q(ir), q(Iran, Islamic Republic of) ], + q(iran, the islamic republic of) => [ q(ir), q(Iran, The Islamic Republic of) ], + q(korea, democratic people's republic of) => [ q(kp), q(Korea, Democratic People's Republic of) ], + q(korea, republic of) => [ q(kr), q(Korea, Republic of) ], + q(libyan arab jamahiriya) => [ q(LY), q(Libyan Arab Jamahiriya) ], + q(micronesia, federated states of) => [ q(fm), q(Micronesia, Federated States of) ], + q(micronesia, the federated states of) => [ q(fm), q(Micronesia, The Federated States of) ], + q(moldova, republic of) => [ q(md), q(Moldova, Republic of) ], + q(netherlands antilles) => [ q(an), q(Netherlands Antilles) ], + q(portuguese timor) => [ q(TP), q(Portuguese Timor) ], + q(portuguese timor ) => [ q(TP), q(Portuguese Timor ) ], + q(saint helena, ascension and tristan da cunha) => [ q(SH), q(Saint Helena, Ascension and Tristan da Cunha) ], + q(saint martin) => [ q(MF), q(Saint Martin) ], + q(soviet union) => [ q(SU), q(Soviet Union) ], + q(soviet union ) => [ q(SU), q(Soviet Union ) ], + q(taiwan) => [ q(TW), q(Taiwan) ], + q(taiwan, province of china) => [ q(tw), q(Taiwan, Province of China) ], + q(united kingdom) => [ q(gb), q(United Kingdom) ], + q(united states) => [ q(us), q(United States) ], + q(ussr) => [ q(su), q(USSR) ], + q(venezuela, bolivarian republic of) => [ q(ve), q(Venezuela, Bolivarian Republic of) ], + q(venezuela, bolivarian republic of ) => [ q(ve), q(Venezuela, Bolivarian Republic of ) ], + q(virgin islands, british) => [ q(vg), q(Virgin Islands, British) ], + q(virgin islands, u.s.) => [ q(vi), q(Virgin Islands, U.S.) ], + q(yugoslavia ) => [ q(YU), q(Yugoslavia ) ], +}; + +$Locale::Codes::Retired{'country'}{'genc-alpha-2'}{'name'} = { + q(czech republic) => [ q(CZ), q(Czech Republic) ], +}; + +$Locale::Codes::Retired{'country'}{'genc-alpha-3'}{'name'} = { + q(czech republic) => [ q(CZE), q(Czech Republic) ], +}; + +$Locale::Codes::Retired{'country'}{'genc-numeric'}{'name'} = { + q(czech republic) => [ q(203), q(Czech Republic) ], +}; + +$Locale::Codes::Retired{'country'}{'numeric'}{'name'} = { + q(antarctica) => [ q(010), q(Antarctica) ], + q(bolivia) => [ q(068), q(Bolivia) ], + q(bolivia (plurinational state of)) => [ q(068), q(Bolivia (Plurinational State of)) ], + q(bolivia, plurinational state of) => [ q(068), q(Bolivia, Plurinational State of) ], + q(bonaire, saint eustatius and saba) => [ q(535), q(Bonaire, Saint Eustatius and Saba) ], + q(bouvet island) => [ q(074), q(Bouvet Island) ], + q(british indian ocean territory) => [ q(086), q(British Indian Ocean Territory) ], + q(british virgin islands) => [ q(092), q(British Virgin Islands) ], + q(cabo verde) => [ q(132), q(Cabo Verde) ], + q(cape verde) => [ q(132), q(Cape Verde) ], + q(channel islands) => [ q(830), q(Channel Islands) ], + q(china, hong kong special administrative region) => [ q(344), q(China, Hong Kong Special Administrative Region) ], + q(china, macao special administrative region) => [ q(446), q(China, Macao Special Administrative Region) ], + q(christmas island) => [ q(162), q(Christmas Island) ], + q(cocos (keeling) islands) => [ q(166), q(Cocos (Keeling) Islands) ], + q(congo, the democratic republic of the) => [ q(180), q(Congo, The Democratic Republic of the) ], + q(czech republic) => [ q(203), q(Czech Republic) ], + q(democratic people's republic of korea) => [ q(408), q(Democratic People's Republic of Korea) ], + q(democratic republic of the congo) => [ q(180), q(Democratic Republic of the Congo) ], + q(east timor) => [ q(626), q(East Timor) ], + q(faeroe islands) => [ q(234), q(Faeroe Islands) ], + q(falkland islands (malvinas)) => [ q(238), q(Falkland Islands (Malvinas)) ], + q(faroe islands) => [ q(234), q(Faroe Islands) ], + q(france, metropolitan) => [ q(249), q(France, Metropolitan) ], + q(french southern and antarctic lands) => [ q(260), q(French Southern and Antarctic Lands) ], + q(french southern territories) => [ q(260), q(French Southern Territories) ], + q(heard island and mcdonald islands) => [ q(334), q(Heard Island and Mcdonald Islands) ], + q(holy see) => [ q(336), q(Holy See) ], + q(holy see (the) [vatican city state]) => [ q(336), q(Holy See (The) [Vatican City State]) ], + q(holy see (vatican city state)) => [ q(336), q(Holy See (Vatican City State)) ], + q(hong kong) => [ q(344), q(Hong Kong) ], + q(hong kong special administrative region of china) => [ q(344), q(Hong Kong Special Administrative Region of China) ], + q(iran (islamic republic of)) => [ q(364), q(Iran (Islamic Republic of)) ], + q(iran, islamic republic of) => [ q(364), q(Iran, Islamic Republic of) ], + q(iran, the islamic republic of) => [ q(364), q(Iran, The Islamic Republic of) ], + q(kazakstan) => [ q(398), q(Kazakstan) ], + q(korea, democratic people's republic of) => [ q(408), q(Korea, Democratic People's Republic of) ], + q(korea, republic of) => [ q(410), q(Korea, Republic of) ], + q(libyan arab jamahiriya) => [ q(434), q(Libyan Arab Jamahiriya) ], + q(macao) => [ q(446), q(Macao) ], + q(macao special administrative region of china) => [ q(446), q(Macao Special Administrative Region of China) ], + q(macau) => [ q(446), q(Macau) ], + q(macedonia, the former yugoslav republic of) => [ q(807), q(Macedonia, the Former Yugoslav Republic of) ], + q(micronesia (federated states of)) => [ q(583), q(Micronesia (Federated States of)) ], + q(micronesia, federated states of) => [ q(583), q(Micronesia, Federated States of) ], + q(micronesia, the federated states of) => [ q(583), q(Micronesia, The Federated States of) ], + q(moldova, republic of) => [ q(498), q(Moldova, Republic of) ], + q(netherlands antilles) => [ q(530), q(Netherlands Antilles) ], + q(palestinian territory, occupied) => [ q(275), q(Palestinian Territory, Occupied) ], + q(republic of korea) => [ q(410), q(Republic of Korea) ], + q(republic of moldova) => [ q(498), q(Republic of Moldova) ], + q(saint helena) => [ q(654), q(Saint Helena) ], + q(saint-barthelemy) => [ q(652), q(Saint-Barthelemy) ], + q(saint-martin (french part)) => [ q(663), q(Saint-Martin (French part)) ], + q(sark) => [ q(680), q(Sark) ], + q(serbia and montenegro) => [ q(891), q(Serbia and Montenegro) ], + q(south georgia and the islands) => [ q(239), q(South Georgia and the Islands) ], + q(south georgia and the south sandwich islands) => [ q(239), q(South Georgia and the South Sandwich Islands) ], + q(state of palestine) => [ q(275), q(State of Palestine) ], + q(svalbard and jan mayen) => [ q(744), q(Svalbard and Jan Mayen) ], + q(svalbard and jan mayen islands) => [ q(744), q(Svalbard and Jan Mayen Islands) ], + q(taiwan) => [ q(158), q(Taiwan) ], + q(taiwan, province of china) => [ q(158), q(Taiwan, Province of China) ], + q(tanzania, united republic of) => [ q(834), q(Tanzania, United Republic of) ], + q(the former yugoslav republic of macedonia) => [ q(807), q(The former Yugoslav Republic of Macedonia) ], + q(united kingdom) => [ q(826), q(United Kingdom) ], + q(united kingdom of great britain and northern ireland) => [ q(826), q(United Kingdom of Great Britain and Northern Ireland) ], + q(united republic of tanzania) => [ q(834), q(United Republic of Tanzania) ], + q(united states) => [ q(840), q(United States) ], + q(united states minor outlying islands) => [ q(581), q(United States Minor Outlying Islands) ], + q(united states of america) => [ q(840), q(United States of America) ], + q(united states virgin islands) => [ q(850), q(United States Virgin Islands) ], + q(venezuela) => [ q(862), q(Venezuela) ], + q(venezuela (bolivarian republic of)) => [ q(862), q(Venezuela (Bolivarian Republic of)) ], + q(venezuela, bolivarian republic of ) => [ q(862), q(Venezuela, Bolivarian Republic of ) ], + q(vietnam) => [ q(704), q(Vietnam) ], + q(virgin islands, british) => [ q(092), q(Virgin Islands, British) ], + q(virgin islands, u.s.) => [ q(850), q(Virgin Islands, U.S.) ], + q(wallis and futuna) => [ q(876), q(Wallis and Futuna) ], + q(wallis and futuna islands) => [ q(876), q(Wallis and Futuna Islands) ], + q(yugoslavia) => [ q(891), q(Yugoslavia) ], + q(zaire) => [ q(180), q(Zaire) ], +}; + +$Locale::Codes::Retired{'country'}{'un-alpha-3'}{'name'} = { + q(czech republic) => [ q(CZE), q(Czech Republic) ], + q(korea, the democratic people's republic of) => [ q(PRK), q(Korea, The Democratic People's Republic of) ], +}; + +$Locale::Codes::Retired{'country'}{'un-numeric'}{'name'} = { + q(channel islands) => [ q(830), q(Channel Islands) ], + q(czech republic) => [ q(203), q(Czech Republic) ], + q(korea, the democratic people's republic of) => [ q(408), q(Korea, The Democratic People's Republic of) ], +}; + + +1; +package Locale::Codes::Constants; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +our(@CONSTANTS,%ALL_CODESETS); + +our(@CONSTANTS_COUNTRY) = qw( + LOCALE_CODE_ALPHA_2 + LOCALE_CODE_ALPHA_3 + LOCALE_CODE_DOM + LOCALE_CODE_GENC_ALPHA_2 + LOCALE_CODE_GENC_ALPHA_3 + LOCALE_CODE_GENC_NUMERIC + LOCALE_CODE_NUMERIC + LOCALE_CODE_UN_ALPHA_3 + LOCALE_CODE_UN_NUMERIC + LOCALE_COUNTRY_ALPHA_2 + LOCALE_COUNTRY_ALPHA_3 + LOCALE_COUNTRY_DOM + LOCALE_COUNTRY_GENC_ALPHA_2 + LOCALE_COUNTRY_GENC_ALPHA_3 + LOCALE_COUNTRY_GENC_NUMERIC + LOCALE_COUNTRY_NUMERIC + LOCALE_COUNTRY_UN_ALPHA_3 + LOCALE_COUNTRY_UN_NUMERIC +); +push(@CONSTANTS,@CONSTANTS_COUNTRY); + +our(@CONSTANTS_CURRENCY) = qw( + LOCALE_CURRENCY_ALPHA + LOCALE_CURRENCY_NUMERIC + LOCALE_CURR_ALPHA + LOCALE_CURR_NUMERIC +); +push(@CONSTANTS,@CONSTANTS_CURRENCY); + +our(@CONSTANTS_LANGEXT) = qw( + LOCALE_LANGEXT_ALPHA +); +push(@CONSTANTS,@CONSTANTS_LANGEXT); + +our(@CONSTANTS_LANGFAM) = qw( + LOCALE_LANGFAM_ALPHA +); +push(@CONSTANTS,@CONSTANTS_LANGFAM); + +our(@CONSTANTS_LANGUAGE) = qw( + LOCALE_LANGUAGE_ALPHA_2 + LOCALE_LANGUAGE_ALPHA_3 + LOCALE_LANGUAGE_TERM + LOCALE_LANG_ALPHA_2 + LOCALE_LANG_ALPHA_3 + LOCALE_LANG_TERM +); +push(@CONSTANTS,@CONSTANTS_LANGUAGE); + +our(@CONSTANTS_LANGVAR) = qw( + LOCALE_LANGVAR_ALPHA +); +push(@CONSTANTS,@CONSTANTS_LANGVAR); + +our(@CONSTANTS_SCRIPT) = qw( + LOCALE_SCRIPT_ALPHA + LOCALE_SCRIPT_NUMERIC +); +push(@CONSTANTS,@CONSTANTS_SCRIPT); + +@EXPORT = (@CONSTANTS, + qw( + %ALL_CODESETS + )); + +use constant LOCALE_CODE_ALPHA_2 => 'alpha-2'; +use constant LOCALE_CODE_ALPHA_3 => 'alpha-3'; +use constant LOCALE_CODE_DOM => 'dom'; +use constant LOCALE_CODE_GENC_ALPHA_2 => 'genc-alpha-2'; +use constant LOCALE_CODE_GENC_ALPHA_3 => 'genc-alpha-3'; +use constant LOCALE_CODE_GENC_NUMERIC => 'genc-numeric'; +use constant LOCALE_CODE_NUMERIC => 'numeric'; +use constant LOCALE_CODE_UN_ALPHA_3 => 'un-alpha-3'; +use constant LOCALE_CODE_UN_NUMERIC => 'un-numeric'; +use constant LOCALE_COUNTRY_ALPHA_2 => 'alpha-2'; +use constant LOCALE_COUNTRY_ALPHA_3 => 'alpha-3'; +use constant LOCALE_COUNTRY_DOM => 'dom'; +use constant LOCALE_COUNTRY_GENC_ALPHA_2 => 'genc-alpha-2'; +use constant LOCALE_COUNTRY_GENC_ALPHA_3 => 'genc-alpha-3'; +use constant LOCALE_COUNTRY_GENC_NUMERIC => 'genc-numeric'; +use constant LOCALE_COUNTRY_NUMERIC => 'numeric'; +use constant LOCALE_COUNTRY_UN_ALPHA_3 => 'un-alpha-3'; +use constant LOCALE_COUNTRY_UN_NUMERIC => 'un-numeric'; + +$ALL_CODESETS{'country'} = + { + 'default' => 'alpha-2', + 'module' => 'Country', + 'codesets' => { + 'alpha-2' => ['lc'], + 'alpha-3' => ['lc'], + 'dom' => ['lc'], + 'genc-alpha-2' => ['uc'], + 'genc-alpha-3' => ['uc'], + 'genc-numeric' => ['numeric',3], + 'numeric' => ['numeric',3], + 'un-alpha-3' => ['uc'], + 'un-numeric' => ['numeric',3], + } + }; + +use constant LOCALE_CURRENCY_ALPHA => 'alpha'; +use constant LOCALE_CURRENCY_NUMERIC => 'num'; +use constant LOCALE_CURR_ALPHA => 'alpha'; +use constant LOCALE_CURR_NUMERIC => 'num'; + +$ALL_CODESETS{'currency'} = + { + 'default' => 'alpha', + 'module' => 'Currency', + 'codesets' => { + 'alpha' => ['uc'], + 'num' => ['numeric',3], + } + }; + +use constant LOCALE_LANGEXT_ALPHA => 'alpha'; + +$ALL_CODESETS{'langext'} = + { + 'default' => 'alpha', + 'module' => 'LangExt', + 'codesets' => { + 'alpha' => ['lc'], + } + }; + +use constant LOCALE_LANGFAM_ALPHA => 'alpha'; + +$ALL_CODESETS{'langfam'} = + { + 'default' => 'alpha', + 'module' => 'LangFam', + 'codesets' => { + 'alpha' => ['lc'], + } + }; + +use constant LOCALE_LANGUAGE_ALPHA_2 => 'alpha-2'; +use constant LOCALE_LANGUAGE_ALPHA_3 => 'alpha-3'; +use constant LOCALE_LANGUAGE_TERM => 'term'; +use constant LOCALE_LANG_ALPHA_2 => 'alpha-2'; +use constant LOCALE_LANG_ALPHA_3 => 'alpha-3'; +use constant LOCALE_LANG_TERM => 'term'; + +$ALL_CODESETS{'language'} = + { + 'default' => 'alpha-2', + 'module' => 'Language', + 'codesets' => { + 'alpha-2' => ['lc'], + 'alpha-3' => ['lc'], + 'term' => ['lc'], + } + }; + +use constant LOCALE_LANGVAR_ALPHA => 'alpha'; + +$ALL_CODESETS{'langvar'} = + { + 'default' => 'alpha', + 'module' => 'LangVar', + 'codesets' => { + 'alpha' => ['lc'], + } + }; + +use constant LOCALE_SCRIPT_ALPHA => 'alpha'; +use constant LOCALE_SCRIPT_NUMERIC => 'num'; + +$ALL_CODESETS{'script'} = + { + 'default' => 'alpha', + 'module' => 'Script', + 'codesets' => { + 'alpha' => ['ucfirst'], + 'num' => ['numeric',3], + } + }; + + +1; +package # +Locale::Codes::Language_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Fri Feb 23 12:58:17 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'language'}{'alpha-2'}{'code'} = { + q(in) => q(Indonesian), + q(iw) => q(Hebrew), + q(ji) => q(Yiddish), + q(jw) => q(Javanese), + q(mo) => q(Moldavian), +}; + +$Locale::Codes::Retired{'language'}{'alpha-3'}{'code'} = { + q(aam) => q(Aramanik), + q(adp) => q(Adap), + q(aue) => q(=/Kx'au//'ein), + q(ayx) => q(Ayi (China)), + q(baz) => q(Tunen), + q(bgm) => q(Baga Mboteni), + q(bjd) => q(Bandjigali), + q(bjq) => q(Southern Betsimisaraka Malagasy), + q(bmy) => q(Bemba (Democratic Republic of Congo)), + q(btl) => q(Bhatola), + q(bxx) => q(Borna (Democratic Republic of Congo)), + q(byy) => q(Buya), + q(cbe) => q(Chipiajes), + q(cbh) => q(Cagua), + q(ccq) => q(Chaungtha), + q(cka) => q(Khumi Awa Chin), + q(coy) => q(Coyaima), + q(cqu) => q(Chilean Quechua), + q(cum) => q(Cumeral), + q(daf) => q(Dan), + q(dap) => q(Nisi (India)), + q(dha) => q(Dhanwar (India)), + q(djl) => q(Djiwarli), + q(dkl) => q(Kolum So Dogon), + q(duj) => q(Dhuwal), + q(dwl) => q(Walo Kumbe Dogon), + q(dzd) => q(Daza), + q(elp) => q(Elpaputih), + q(emo) => q(Emok), + q(gbc) => q(Garawa), + q(gfx) => q(Mangetti Dune !Xung), + q(ggn) => q(Eastern Gurung), + q(ggo) => q(Southern Gondi), + q(ggr) => q(Aghu Tharnggalu), + q(gio) => q(Gelao), + q(gti) => q(Gbati-ri), + q(guv) => q(Gey), + q(hrr) => q(Horuru), + q(iap) => q(Iapama), + q(ibi) => q(Ibilo), + q(ill) => q(Iranun), + q(ilw) => q(Talur), + q(ime) => q(Imeraguen), + q(izi) => q(Izi-Ezaa-Ikwo-Mgbo), + q(jar) => q(Jarawa (Nigeria)), + q(jeg) => q(Jeng), + q(kbf) => q(Kakauhua), + q(kdv) => q(Kado), + q(kgc) => q(Kasseng), + q(kgd) => q(Kataang), + q(kgh) => q(Upper Tanudan Kalinga), + q(koj) => q(Sara Dunjo), + q(kox) => q(Coxima), + q(kpp) => q(Paku Karen), + q(krm) => q(Krim), + q(ktr) => q(Kota Marudu Tinagas), + q(kvs) => q(Kunggara), + q(kwq) => q(Kwak), + q(kxe) => q(Kakihum), + q(kzh) => q(Kenuzi-Dongola), + q(kzj) => q(Coastal Kadazan), + q(kzt) => q(Tambunan Dusun), + q(lcq) => q(Luhu), + q(leg) => q(Lengua), + q(lii) => q(Lingkhim), + q(lmm) => q(Lamam), + q(meg) => q(Mea), + q(mgx) => q(Omati), + q(mhh) => q(Maskoy Pidgin), + q(mja) => q(Mahei), + q(mld) => q(Malakhel), + q(mnt) => q(Maykulan), + q(mwd) => q(Mudbura), + q(mwj) => q(Maligo), + q(myq) => q(Forest Maninka), + q(nad) => q(Nijadali), + q(nbf) => q(Naxi), + q(nbx) => q(Ngura), + q(nln) => q(Durango Nahuatl), + q(nlr) => q(Ngarla), + q(nnx) => q(Ngong), + q(noo) => q(Nootka), + q(nts) => q(Natagaimas), + q(ome) => q(Omejes), + q(oun) => q(!O!ung), + q(pbz) => q(Palu), + q(pcr) => q(Panang), + q(pgy) => q(Pongyong), + q(pmc) => q(Palumata), + q(pmu) => q(Mirpur Panjabi), + q(pod) => q(Ponares), + q(ppa) => q(Pao), + q(ppr) => q(Piru), + q(prb) => q(Lua'), + q(pry) => q(Pray 3), + q(puk) => q(Pu Ko), + q(puz) => q(Purum Naga), + q(rie) => q(Rien), + q(rna) => q(Runa), + q(rsi) => q(Rennellese Sign Language), + q(sap) => q(Sanapana), + q(sca) => q(Sansu), + q(sgo) => q(Songa), + q(skk) => q(Sok), + q(snh) => q(Shinabo), + q(svr) => q(Savara), + q(tdu) => q(Tempasuk Dusun), + q(tgg) => q(Tangga), + q(thc) => q(Tai Hang Tong), + q(thx) => q(The), + q(tid) => q(Tidong), + q(tie) => q(Tingal), + q(tkk) => q(Takpa), + q(tlw) => q(South Wemale), + q(tmp) => q(Tai Mene), + q(tne) => q(Tinoc Kallahan), + q(toe) => q(Tomedes), + q(tsf) => q(Southwestern Tamang), + q(unp) => q(Worora), + q(uok) => q(Uokha), + q(wit) => q(Wintu), + q(wiw) => q(Wirangu), + q(xba) => q(Kamba (Brazil)), + q(xbx) => q(Kabixi), + q(xia) => q(Xiandao), + q(xip) => q(Xipinawa), + q(xkh) => q(Karahawyana), + q(xsj) => q(Subi), + q(ybd) => q(Yangbye), + q(yds) => q(Yiddish Sign Language), + q(yen) => q(Yendang), + q(yiy) => q(Yir Yoront), + q(yma) => q(Yamphe), + q(ymt) => q(Mator-Taygi-Karagas), + q(ynh) => q(Yangho), + q(yos) => q(Yos), + q(yri) => q(Yari), + q(yuu) => q(Yugh), +}; + +$Locale::Codes::Retired{'language'}{'term'}{'code'} = { +}; + +$Locale::Codes::Retired{'language'}{'alpha-2'}{'name'} = { + q((afan) oromo) => [ q(om), q((Afan) Oromo) ], + q(bengali; bangla) => [ q(bn), q(Bengali; Bangla) ], + q(bhutani) => [ q(dz), q(Bhutani) ], + q(bihari) => [ q(bh), q(Bihari) ], + q(bokmal, norwegian) => [ q(nb), q(Bokmal, Norwegian) ], + q(byelorussian) => [ q(be), q(Byelorussian) ], + q(cambodian) => [ q(km), q(Cambodian) ], + q(chichewa) => [ q(ny), q(Chichewa) ], + q(chichewa; nyanja) => [ q(ny), q(Chichewa; Nyanja) ], + q(divehi) => [ q(dv), q(Divehi) ], + q(faeroese) => [ q(fo), q(Faeroese) ], + q(fiji) => [ q(fj), q(Fiji) ], + q(frisian) => [ q(fy), q(Frisian) ], + q(gaelic) => [ q(gd), q(Gaelic) ], + q(gaelic (scots)) => [ q(gd), q(Gaelic (Scots)) ], + q(gallegan) => [ q(gl), q(Gallegan) ], + q(greek) => [ q(el), q(Greek) ], + q(greek, modern (1453-)) => [ q(el), q(Greek, Modern (1453-)) ], + q(greenlandic) => [ q(kl), q(Greenlandic) ], + q(interlingua) => [ q(ia), q(Interlingua) ], + q(inupiak) => [ q(ik), q(Inupiak) ], + q(khmer) => [ q(km), q(Khmer) ], + q(kirundi) => [ q(rn), q(Kirundi) ], + q(laothian) => [ q(lo), q(Laothian) ], + q(latvian, lettish) => [ q(lv), q(Latvian, Lettish) ], + q(letzeburgesch) => [ q(lb), q(Letzeburgesch) ], + q(malay) => [ q(ms), q(Malay) ], + q(marshall) => [ q(mh), q(Marshall) ], + q(moldavian) => [ q(mo), q(Moldavian) ], + q(ndebele, north) => [ q(nd), q(Ndebele, North) ], + q(ndebele, south) => [ q(nr), q(Ndebele, South) ], + q(nepali) => [ q(ne), q(Nepali) ], + q(norwegian bokmal) => [ q(nb), q(Norwegian Bokmal) ], + q(occitan) => [ q(oc), q(Occitan) ], + q(oriya) => [ q(or), q(Oriya) ], + q(ossetian; ossetic) => [ q(os), q(Ossetian; Ossetic) ], + q(pashto, pushto) => [ q(ps), q(Pashto, Pushto) ], + q(punjabi) => [ q(pa), q(Punjabi) ], + q(rhaeto-romance) => [ q(rm), q(Rhaeto-Romance) ], + q(sami) => [ q(se), q(Sami) ], + q(sangro) => [ q(sg), q(Sangro) ], + q(scots gaelic) => [ q(gd), q(Scots Gaelic) ], + q(sesotho) => [ q(st), q(Sesotho) ], + q(setswana) => [ q(tn), q(Setswana) ], + q(singhalese) => [ q(si), q(Singhalese) ], + q(sinhalese) => [ q(si), q(Sinhalese) ], + q(siswati) => [ q(ss), q(Siswati) ], + q(sotho) => [ q(st), q(Sotho) ], + q(sotho, southern) => [ q(st), q(Sotho, Southern) ], + q(swahili) => [ q(sw), q(Swahili) ], + q(tegulu) => [ q(te), q(Tegulu) ], + q(tonga) => [ q(to), q(Tonga) ], + q(volapuk) => [ q(vo), q(Volapuk) ], +}; + +$Locale::Codes::Retired{'language'}{'alpha-3'}{'name'} = { + q(!o!ung) => [ q(oun), q(!O!ung) ], + q(=/kx'au//'ein) => [ q(aue), q(=/Kx'au//'ein) ], + q(a'tong) => [ q(aot), q(A'tong) ], + q(adap) => [ q(adp), q(Adap) ], + q(aghu tharnggalu) => [ q(ggr), q(Aghu Tharnggalu) ], + q(ainu) => [ q(ain), q(Ainu) ], + q(amarag) => [ q(amg), q(Amarag) ], + q(anu) => [ q(anl), q(Anu) ], + q(apalik) => [ q(apo), q(Apalik) ], + q(aramanik) => [ q(aam), q(Aramanik) ], + q(aromanian) => [ q(rup), q(Aromanian) ], + q(atong) => [ q(ato), q(Atong) ], + q(ayi (china)) => [ q(ayx), q(Ayi (China)) ], + q(baga binari) => [ q(bcg), q(Baga Binari) ], + q(baga mboteni) => [ q(bgm), q(Baga Mboteni) ], + q(bandjigali) => [ q(bjd), q(Bandjigali) ], + q(bangi me) => [ q(dba), q(Bangi Me) ], + q(bantu (other)) => [ q(bnt), q(Bantu (Other)) ], + q(basa) => [ q(bas), q(Basa) ], + q(bauro) => [ q(bxa), q(Bauro) ], + q(bebe) => [ q(bzv), q(Bebe) ], + q(bedik) => [ q(tnr), q(Bedik) ], + q(begbere-ejar) => [ q(bqv), q(Begbere-Ejar) ], + q(bekwil) => [ q(bkw), q(Bekwil) ], + q(bemba) => [ q(bem), q(Bemba) ], + q(bemba (democratic republic of congo)) => [ q(bmy), q(Bemba (Democratic Republic of Congo)) ], + q(bhatola) => [ q(btl), q(Bhatola) ], + q(blin) => [ q(byn), q(Blin) ], + q(bolo) => [ q(blv), q(Bolo) ], + q(bom) => [ q(bmf), q(Bom) ], + q(borna (democratic republic of congo)) => [ q(bxx), q(Borna (Democratic Republic of Congo)) ], + q(brek karen) => [ q(kvl), q(Brek Karen) ], + q(burum-mindik) => [ q(bmu), q(Burum-Mindik) ], + q(buya) => [ q(byy), q(Buya) ], + q(cagua) => [ q(cbh), q(Cagua) ], + q(central bicolano) => [ q(bcl), q(Central Bicolano) ], + q(central dusun) => [ q(dtp), q(Central Dusun) ], + q(chaungtha) => [ q(ccq), q(Chaungtha) ], + q(chilean quechua) => [ q(cqu), q(Chilean Quechua) ], + q(chipiajes) => [ q(cbe), q(Chipiajes) ], + q(coastal kadazan) => [ q(kzj), q(Coastal Kadazan) ], + q(coxima) => [ q(kox), q(Coxima) ], + q(coyaima) => [ q(coy), q(Coyaima) ], + q(creoles and pidgins ) => [ q(crp), q(Creoles and pidgins ) ], + q(creoles and pidgins, english based) => [ q(cpe), q(Creoles and pidgins, English based) ], + q(creoles and pidgins, french-based ) => [ q(cpf), q(Creoles and pidgins, French-based ) ], + q(creoles and pidgins, portuguese-based ) => [ q(cpp), q(Creoles and pidgins, Portuguese-based ) ], + q(cumeral) => [ q(cum), q(Cumeral) ], + q(cung) => [ q(cug), q(Cung) ], + q(dakaka) => [ q(bpa), q(Dakaka) ], + q(darling) => [ q(drl), q(Darling) ], + q(daza) => [ q(dzd), q(Daza) ], + q(dhangu) => [ q(dhg), q(Dhangu) ], + q(dhanwar (india)) => [ q(dha), q(Dhanwar (India)) ], + q(dimir) => [ q(dmc), q(Dimir) ], + q(djangu) => [ q(dhg), q(Djangu) ], + q(dogri) => [ q(doi), q(Dogri) ], + q(duduela) => [ q(duk), q(Duduela) ], + q(duli) => [ q(duz), q(Duli) ], + q(dumpu) => [ q(wtf), q(Dumpu) ], + q(durango nahuatl) => [ q(nln), q(Durango Nahuatl) ], + q(dutch, middle (ca.1050-1350)) => [ q(dum), q(Dutch, Middle (ca.1050-1350)) ], + q(eastern gurung) => [ q(ggn), q(Eastern Gurung) ], + q(elpaputih) => [ q(elp), q(Elpaputih) ], + q(emok) => [ q(emo), q(Emok) ], + q(english, middle (1100-1500)) => [ q(enm), q(English, Middle (1100-1500)) ], + q(english, old (ca.450-1100)) => [ q(ang), q(English, Old (ca.450-1100)) ], + q(fang) => [ q(fan), q(Fang) ], + q(forest maninka) => [ q(myq), q(Forest Maninka) ], + q(french, middle (ca.1400-1600)) => [ q(frm), q(French, Middle (ca.1400-1600)) ], + q(french, old (842-ca.1400)) => [ q(fro), q(French, Old (842-ca.1400)) ], + q(galoli) => [ q(gal), q(Galoli) ], + q(garawa) => [ q(gbc), q(Garawa) ], + q(gbati-ri) => [ q(gti), q(Gbati-ri) ], + q(gbaya) => [ q(gba), q(Gbaya) ], + q(gelao) => [ q(gio), q(Gelao) ], + q(german, middle high (ca.1050-1500)) => [ q(gmh), q(German, Middle High (ca.1050-1500)) ], + q(german, old high (ca.750-1050)) => [ q(goh), q(German, Old High (ca.750-1050)) ], + q(gey) => [ q(guv), q(Gey) ], + q(greek, ancient (to 1453)) => [ q(grc), q(Greek, Ancient (to 1453)) ], + q(gusan) => [ q(gsn), q(Gusan) ], + q(guwinmal) => [ q(xgm), q(Guwinmal) ], + q(hainyaxo bozo) => [ q(bzx), q(Hainyaxo Bozo) ], + q(haka chin) => [ q(cnh), q(Haka Chin) ], + q(hawai'i pidgin sign language) => [ q(hps), q(Hawai'i Pidgin Sign Language) ], + q(horuru) => [ q(hrr), q(Horuru) ], + q(hungworo) => [ q(nat), q(Hungworo) ], + q(iapama) => [ q(iap), q(Iapama) ], + q(ibilo) => [ q(ibi), q(Ibilo) ], + q(idun) => [ q(ldb), q(Idun) ], + q(ikobi-mena) => [ q(meb), q(Ikobi-Mena) ], + q(imeraguen) => [ q(ime), q(Imeraguen) ], + q(iranun) => [ q(ill), q(Iranun) ], + q(irish, middle (900-1200)) => [ q(mga), q(Irish, Middle (900-1200)) ], + q(irish, old (to 900)) => [ q(sga), q(Irish, Old (to 900)) ], + q(izi-ezaa-ikwo-mgbo) => [ q(izi), q(Izi-Ezaa-Ikwo-Mgbo) ], + q(jarawa (nigeria)) => [ q(jar), q(Jarawa (Nigeria)) ], + q(jeng) => [ q(jeg), q(Jeng) ], + q(kabixi) => [ q(xbx), q(Kabixi) ], + q(kachchi) => [ q(kfr), q(Kachchi) ], + q(kadara) => [ q(kad), q(Kadara) ], + q(kado) => [ q(kdv), q(Kado) ], + q(kag-fer-jiir-koor-ror-us-zuksun) => [ q(gel), q(Kag-Fer-Jiir-Koor-Ror-Us-Zuksun) ], + q(kakauhua) => [ q(kbf), q(Kakauhua) ], + q(kakihum) => [ q(kxe), q(Kakihum) ], + q(kamba) => [ q(kam), q(Kamba) ], + q(kamba (brazil)) => [ q(xba), q(Kamba (Brazil)) ], + q(karahawyana) => [ q(xkh), q(Karahawyana) ], + q(kasseng) => [ q(kgc), q(Kasseng) ], + q(kataang) => [ q(kgd), q(Kataang) ], + q(kayapa kallahan) => [ q(kak), q(Kayapa Kallahan) ], + q(kemezung) => [ q(dmo), q(Kemezung) ], + q(kenuzi-dongola) => [ q(kzh), q(Kenuzi-Dongola) ], + q(khumi awa chin) => [ q(cka), q(Khumi Awa Chin) ], + q(kol) => [ q(ekl), q(Kol) ], + q(kolum so dogon) => [ q(dkl), q(Kolum So Dogon) ], + q(konkani) => [ q(kok), q(Konkani) ], + q(kota marudu tinagas) => [ q(ktr), q(Kota Marudu Tinagas) ], + q(krim) => [ q(krm), q(Krim) ], + q(kru'ng 2) => [ q(krr), q(Kru'ng 2) ], + q(kumak) => [ q(nee), q(Kumak) ], + q(kuman) => [ q(kue), q(Kuman) ], + q(kunggara) => [ q(kvs), q(Kunggara) ], + q(kutang ghale) => [ q(ght), q(Kutang Ghale) ], + q(kwak) => [ q(kwq), q(Kwak) ], + q(kwato) => [ q(kop), q(Kwato) ], + q(kyenga) => [ q(tye), q(Kyenga) ], + q(lama (myanmar)) => [ q(lay), q(Lama (Myanmar)) ], + q(lamam) => [ q(lmm), q(Lamam) ], + q(lengua) => [ q(leg), q(Lengua) ], + q(lindu) => [ q(klw), q(Lindu) ], + q(lingkhim) => [ q(lii), q(Lingkhim) ], + q(louisiana creole french) => [ q(lou), q(Louisiana Creole French) ], + q(lowa) => [ q(loy), q(Lowa) ], + q(lower tanudan kalinga) => [ q(kml), q(Lower Tanudan Kalinga) ], + q(lua') => [ q(prb), q(Lua') ], + q(luhu) => [ q(lcq), q(Luhu) ], + q(mahei) => [ q(mja), q(Mahei) ], + q(malakhel) => [ q(mld), q(Malakhel) ], + q(malasanga) => [ q(mqz), q(Malasanga) ], + q(maligo) => [ q(mwj), q(Maligo) ], + q(mangetti dune !xung) => [ q(gfx), q(Mangetti Dune !Xung) ], + q(mann) => [ q(mev), q(Mann) ], + q(manusela) => [ q(wha), q(Manusela) ], + q(mari) => [ q(chm), q(Mari) ], + q(maskoy pidgin) => [ q(mhh), q(Maskoy Pidgin) ], + q(mator-taygi-karagas) => [ q(ymt), q(Mator-Taygi-Karagas) ], + q(maykulan) => [ q(mnt), q(Maykulan) ], + q(mbabaram) => [ q(vmb), q(Mbabaram) ], + q(mbedam) => [ q(xmd), q(Mbedam) ], + q(mbu') => [ q(muc), q(Mbu') ], + q(mea) => [ q(meg), q(Mea) ], + q(mende) => [ q(men), q(Mende) ], + q(minigir) => [ q(vmg), q(Minigir) ], + q(mire) => [ q(mvh), q(Mire) ], + q(miri) => [ q(mrg), q(Miri) ], + q(mirpur panjabi) => [ q(pmu), q(Mirpur Panjabi) ], + q(misima-paneati) => [ q(mpx), q(Misima-Paneati) ], + q(mixifore) => [ q(mfg), q(Mixifore) ], + q(mpongmpong) => [ q(mgg), q(Mpongmpong) ], + q(mro chin) => [ q(cmr), q(Mro Chin) ], + q(mudbura) => [ q(mwd), q(Mudbura) ], + q(muduapa) => [ q(wiv), q(Muduapa) ], + q(nakama) => [ q(nib), q(Nakama) ], + q(nama (namibia)) => [ q(naq), q(Nama (Namibia)) ], + q(nanggu) => [ q(ngr), q(Nanggu) ], + q(nangikurrunggurr) => [ q(nam), q(Nangikurrunggurr) ], + q(natagaimas) => [ q(nts), q(Natagaimas) ], + q(ndrag'ngith) => [ q(dgt), q(Ndrag'ngith) ], + q(nepal bhasa) => [ q(new), q(Nepal Bhasa) ], + q(nga la) => [ q(hlt), q(Nga La) ], + q(ngalkbun) => [ q(ngk), q(Ngalkbun) ], + q(ngeq) => [ q(ngt), q(Ngeq) ], + q(ngong) => [ q(nnx), q(Ngong) ], + q(ngura) => [ q(nbx), q(Ngura) ], + q(nijadali) => [ q(nad), q(Nijadali) ], + q(nisi (india)) => [ q(dap), q(Nisi (India)) ], + q(nootka) => [ q(noo), q(Nootka) ], + q(norse, old) => [ q(non), q(Norse, Old) ], + q(north wemale) => [ q(weo), q(North Wemale) ], + q(northeast pashayi) => [ q(aee), q(Northeast Pashayi) ], + q(northern bai) => [ q(bfc), q(Northern Bai) ], + q(northern catanduanes bicolano) => [ q(cts), q(Northern Catanduanes Bicolano) ], + q(northern lorung) => [ q(lbr), q(Northern Lorung) ], + q(northwest pashayi) => [ q(glh), q(Northwest Pashayi) ], + q(nsari) => [ q(asj), q(Nsari) ], + q(nung (myanmar)) => [ q(nun), q(Nung (Myanmar)) ], + q(omati) => [ q(mgx), q(Omati) ], + q(omejes) => [ q(ome), q(Omejes) ], + q(opuuo) => [ q(lgn), q(Opuuo) ], + q(oriya (individual language)) => [ q(ory), q(Oriya (individual language)) ], + q(ounge) => [ q(oue), q(Ounge) ], + q(ovdalian) => [ q(ovd), q(Ovdalian) ], + q(palu) => [ q(pbz), q(Palu) ], + q(palumata) => [ q(pmc), q(Palumata) ], + q(panang) => [ q(pcr), q(Panang) ], + q(pao) => [ q(ppa), q(Pao) ], + q(persian, old (ca.600-400 b.c.)) => [ q(peo), q(Persian, Old (ca.600-400 B.C.)) ], + q(piru) => [ q(ppr), q(Piru) ], + q(ponares) => [ q(pod), q(Ponares) ], + q(pongyong) => [ q(pgy), q(Pongyong) ], + q(pray 3) => [ q(pry), q(Pray 3) ], + q(provencal, old (to 1500)) => [ q(pro), q(Provencal, Old (to 1500)) ], + q(pu ko) => [ q(puk), q(Pu Ko) ], + q(purum naga) => [ q(puz), q(Purum Naga) ], + q(pyu) => [ q(pby), q(Pyu) ], + q(rennellese sign language) => [ q(rsi), q(Rennellese Sign Language) ], + q(rien) => [ q(rie), q(Rien) ], + q(runa) => [ q(rna), q(Runa) ], + q(sakam) => [ q(skm), q(Sakam) ], + q(san juan guelavia zapotec) => [ q(zab), q(San Juan Guelavia Zapotec) ], + q(san marcos tlalcoyalco popoloca) => [ q(pls), q(San Marcos Tlalcoyalco Popoloca) ], + q(sansu) => [ q(sca), q(Sansu) ], + q(sara dunjo) => [ q(koj), q(Sara Dunjo) ], + q(sauk) => [ q(skc), q(Sauk) ], + q(savara) => [ q(svr), q(Savara) ], + q(sepen) => [ q(spm), q(Sepen) ], + q(seraiki) => [ q(skr), q(Seraiki) ], + q(shabo) => [ q(sbf), q(Shabo) ], + q(shangzhai) => [ q(jih), q(Shangzhai) ], + q(shinabo) => [ q(snh), q(Shinabo) ], + q(so (cameroon)) => [ q(sox), q(So (Cameroon)) ], + q(sok) => [ q(skk), q(Sok) ], + q(songa) => [ q(sgo), q(Songa) ], + q(south american indian (other)) => [ q(sai), q(South American Indian (Other)) ], + q(south wemale) => [ q(tlw), q(South Wemale) ], + q(southeast pashayi) => [ q(psi), q(Southeast Pashayi) ], + q(southern catanduanes bicolano) => [ q(bln), q(Southern Catanduanes Bicolano) ], + q(southern gondi) => [ q(ggo), q(Southern Gondi) ], + q(southern lorung) => [ q(lrr), q(Southern Lorung) ], + q(southwest pashayi) => [ q(psh), q(Southwest Pashayi) ], + q(southwestern tamang) => [ q(tsf), q(Southwestern Tamang) ], + q(subi) => [ q(xsj), q(Subi) ], + q(sulung) => [ q(suv), q(Sulung) ], + q(tai hang tong) => [ q(thc), q(Tai Hang Tong) ], + q(tai mene) => [ q(tmp), q(Tai Mene) ], + q(takpa) => [ q(tkk), q(Takpa) ], + q(talur) => [ q(ilw), q(Talur) ], + q(tambunan dusun) => [ q(kzt), q(Tambunan Dusun) ], + q(tangga) => [ q(tgg), q(Tangga) ], + q(tangkhul naga) => [ q(nmf), q(Tangkhul Naga) ], + q(teluti) => [ q(tlt), q(Teluti) ], + q(tempasuk dusun) => [ q(tdu), q(Tempasuk Dusun) ], + q(the) => [ q(thx), q(The) ], + q(tidong) => [ q(tid), q(Tidong) ], + q(tina sambal) => [ q(xsb), q(Tina Sambal) ], + q(tingal) => [ q(tie), q(Tingal) ], + q(tinoc kallahan) => [ q(tne), q(Tinoc Kallahan) ], + q(tomedes) => [ q(toe), q(Tomedes) ], + q(tonga (thailand)) => [ q(tnz), q(Tonga (Thailand)) ], + q(tsotsitaal) => [ q(fly), q(Tsotsitaal) ], + q(turkish, ottoman (1500-1928)) => [ q(ota), q(Turkish, Ottoman (1500-1928)) ], + q(unggarranggu) => [ q(xun), q(Unggarranggu) ], + q(uokha) => [ q(uok), q(Uokha) ], + q(upper tanudan kalinga) => [ q(kgh), q(Upper Tanudan Kalinga) ], + q(vasekela bushman) => [ q(vaj), q(Vasekela Bushman) ], + q(walamo) => [ q(wal), q(Walamo) ], + q(walo kumbe dogon) => [ q(dwl), q(Walo Kumbe Dogon) ], + q(waray) => [ q(war), q(Waray) ], + q(welaung) => [ q(weu), q(Welaung) ], + q(were) => [ q(wei), q(Were) ], + q(western canadian inuktitut) => [ q(ikt), q(Western Canadian Inuktitut) ], + q(western gurung) => [ q(gvr), q(Western Gurung) ], + q(worora) => [ q(unp), q(Worora) ], + q(xiandao) => [ q(xia), q(Xiandao) ], + q(xipinawa) => [ q(xip), q(Xipinawa) ], + q(yamphe) => [ q(yma), q(Yamphe) ], + q(yangbye) => [ q(ybd), q(Yangbye) ], + q(yangho) => [ q(ynh), q(Yangho) ], + q(yari) => [ q(yri), q(Yari) ], + q(yeskwa) => [ q(yes), q(Yeskwa) ], + q(yiddish sign language) => [ q(yds), q(Yiddish Sign Language) ], + q(yiwom) => [ q(gek), q(Yiwom) ], + q(yonggom) => [ q(yon), q(Yonggom) ], + q(yos) => [ q(yos), q(Yos) ], + q(yuaga) => [ q(nua), q(Yuaga) ], + q(yugh) => [ q(yuu), q(Yugh) ], + q(zyphe) => [ q(zyp), q(Zyphe) ], +}; + +$Locale::Codes::Retired{'language'}{'term'}{'name'} = { +}; + + +1; +package # +Locale::Codes::Country_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:17:40 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'country'}{'id'} = '0280'; + +$Locale::Codes::Data{'country'}{'id2names'} = { + q(0001) => [ + q(Afghanistan), + ], + q(0002) => [ + q(Aland Islands), + ], + q(0003) => [ + q(Albania), + ], + q(0004) => [ + q(Algeria), + ], + q(0005) => [ + q(American Samoa), + ], + q(0006) => [ + q(Andorra), + ], + q(0007) => [ + q(Angola), + ], + q(0008) => [ + q(Anguilla), + ], + q(0009) => [ + q(Antarctica), + ], + q(0010) => [ + q(Antigua and Barbuda), + ], + q(0011) => [ + q(Argentina), + ], + q(0012) => [ + q(Armenia), + ], + q(0013) => [ + q(Aruba), + ], + q(0014) => [ + q(Australia), + ], + q(0015) => [ + q(Austria), + ], + q(0016) => [ + q(Azerbaijan), + ], + q(0017) => [ + q(Bahamas), + q(The Bahamas), + q(Bahamas, The), + q(Bahamas (The)), + ], + q(0018) => [ + q(Bahrain), + ], + q(0019) => [ + q(Bangladesh), + ], + q(0020) => [ + q(Barbados), + ], + q(0021) => [ + q(Belarus), + ], + q(0022) => [ + q(Belgium), + ], + q(0023) => [ + q(Belize), + ], + q(0024) => [ + q(Benin), + ], + q(0025) => [ + q(Bermuda), + ], + q(0026) => [ + q(Bhutan), + ], + q(0027) => [ + q(Bolivia (Plurinational State of)), + q(Bolivia, Plurinational State of), + q(Plurinational State of Bolivia), + q(Bolivia), + ], + q(0028) => [ + q(Bonaire, Sint Eustatius and Saba), + q(Bonaire, Sint Eustatius, and Saba), + ], + q(0029) => [ + q(Bosnia and Herzegovina), + ], + q(0030) => [ + q(Botswana), + ], + q(0031) => [ + q(Bouvet Island), + ], + q(0032) => [ + q(Brazil), + ], + q(0033) => [ + q(British Indian Ocean Territory), + q(The British Indian Ocean Territory), + q(British Indian Ocean Territory, The), + q(British Indian Ocean Territory (The)), + ], + q(0034) => [ + q(Brunei Darussalam), + q(Brunei), + ], + q(0035) => [ + q(Bulgaria), + ], + q(0036) => [ + q(Burkina Faso), + ], + q(0037) => [ + q(Burundi), + ], + q(0038) => [ + q(Cabo Verde), + ], + q(0039) => [ + q(Cambodia), + ], + q(0040) => [ + q(Cameroon), + ], + q(0041) => [ + q(Canada), + ], + q(0042) => [ + q(Cayman Islands), + q(The Cayman Islands), + q(Cayman Islands, The), + q(Cayman Islands (The)), + ], + q(0043) => [ + q(Central African Republic), + q(The Central African Republic), + q(Central African Republic, The), + q(Central African Republic (The)), + ], + q(0044) => [ + q(Chad), + ], + q(0045) => [ + q(Chile), + ], + q(0046) => [ + q(China), + ], + q(0047) => [ + q(Christmas Island), + ], + q(0048) => [ + q(Cocos (Keeling) Islands), + q(The Cocos (Keeling) Islands), + q(Cocos (Keeling) Islands, The), + q(Cocos (Keeling) Islands (The)), + q(Cocos Islands), + q(The Cocos Islands), + q(Keeling Islands), + q(The Keeling Islands), + ], + q(0049) => [ + q(Colombia), + ], + q(0050) => [ + q(Comoros), + q(The Comoros), + q(Comoros, The), + q(Comoros (The)), + ], + q(0051) => [ + q(Congo (The Democratic Republic of the)), + q(Congo, The Democratic Republic of the), + q(Congo, Democratic Republic of the), + q(The Democratic Republic of the Congo), + q(Democratic Republic of the Congo), + q(Congo-Kinshasa), + q(Congo (Kinshasa)), + ], + q(0052) => [ + q(Congo), + q(The Congo), + q(Congo, The), + q(Congo (The)), + q(The Republic of the Congo), + q(Republic of the Congo), + q(Congo, The Republic of the), + q(Congo, Republic of the), + q(Congo-Brazzaville), + q(Congo (Brazzaville)), + ], + q(0053) => [ + q(Cook Islands), + q(The Cook Islands), + q(Cook Islands, The), + q(Cook Islands (The)), + ], + q(0054) => [ + q(Costa Rica), + ], + q(0055) => [ + q(Cote d'Ivoire), + ], + q(0056) => [ + q(Croatia), + ], + q(0057) => [ + q(Cuba), + ], + q(0058) => [ + q(Curacao), + ], + q(0059) => [ + q(Cyprus), + ], + q(0060) => [ + q(Czechia), + q(Czech Republic), + q(The Czech Republic), + q(Czech Republic, The), + q(Czech Republic (The)), + ], + q(0061) => [ + q(Denmark), + ], + q(0062) => [ + q(Djibouti), + ], + q(0063) => [ + q(Dominica), + ], + q(0064) => [ + q(Dominican Republic), + q(The Dominican Republic), + q(Dominican Republic, The), + q(Dominican Republic (The)), + ], + q(0065) => [ + q(Ecuador), + ], + q(0066) => [ + q(Egypt), + ], + q(0067) => [ + q(El Salvador), + ], + q(0068) => [ + q(Equatorial Guinea), + ], + q(0069) => [ + q(Eritrea), + ], + q(0070) => [ + q(Estonia), + ], + q(0071) => [ + q(Ethiopia), + ], + q(0072) => [ + q(Falkland Islands (The) [Malvinas]), + q(Falkland Islands (Malvinas)), + q(Falkland Islands (Islas Malvinas)), + ], + q(0073) => [ + q(Faroe Islands), + q(The Faroe Islands), + q(Faroe Islands, The), + q(Faroe Islands (The)), + q(Faeroe Islands), + q(The Faeroe Islands), + ], + q(0074) => [ + q(Fiji), + ], + q(0075) => [ + q(Finland), + ], + q(0076) => [ + q(France), + ], + q(0077) => [ + q(French Guiana), + ], + q(0078) => [ + q(French Polynesia), + ], + q(0079) => [ + q(French Southern Territories), + q(The French Southern Territories), + q(French Southern Territories, The), + q(French Southern Territories (The)), + q(French Southern and Antarctic Lands), + ], + q(0080) => [ + q(Gabon), + ], + q(0081) => [ + q(Gambia), + q(The Gambia), + q(Gambia, The), + q(Gambia (The)), + ], + q(0082) => [ + q(Georgia), + ], + q(0083) => [ + q(Germany), + ], + q(0084) => [ + q(Ghana), + ], + q(0085) => [ + q(Gibraltar), + ], + q(0086) => [ + q(Greece), + ], + q(0087) => [ + q(Greenland), + ], + q(0088) => [ + q(Grenada), + ], + q(0089) => [ + q(Guadeloupe), + ], + q(0090) => [ + q(Guam), + ], + q(0091) => [ + q(Guatemala), + ], + q(0092) => [ + q(Guernsey), + ], + q(0093) => [ + q(Guinea), + ], + q(0094) => [ + q(Guinea-Bissau), + ], + q(0095) => [ + q(Guyana), + ], + q(0096) => [ + q(Haiti), + ], + q(0097) => [ + q(Heard Island and McDonald Islands), + ], + q(0098) => [ + q(Holy See), + q(The Holy See), + q(Holy See, The), + q(Holy See (The)), + q(Holy See (The) [Vatican City State]), + q(Holy See (Vatican City State)), + q(Holy See (Vatican City)), + q(Vatican City), + ], + q(0099) => [ + q(Honduras), + ], + q(0100) => [ + q(Hong Kong), + q(China, Hong Kong Special Administrative Region), + q(Hong Kong S.A.R.), + q(Hong Kong Special Administrative Region of China), + ], + q(0101) => [ + q(Hungary), + ], + q(0102) => [ + q(Iceland), + ], + q(0103) => [ + q(India), + ], + q(0104) => [ + q(Indonesia), + ], + q(0105) => [ + q(Iran (Islamic Republic of)), + q(Iran (The Islamic Republic of)), + q(Iran, Islamic Republic of), + q(Iran, The Islamic Republic of), + q(Islamic Republic of Iran), + q(The Islamic Republic of Iran), + q(Iran), + ], + q(0106) => [ + q(Iraq), + ], + q(0107) => [ + q(Ireland), + ], + q(0108) => [ + q(Isle of Man), + ], + q(0109) => [ + q(Israel), + ], + q(0110) => [ + q(Italy), + ], + q(0111) => [ + q(Jamaica), + ], + q(0112) => [ + q(Japan), + ], + q(0113) => [ + q(Jersey), + ], + q(0114) => [ + q(Jordan), + ], + q(0115) => [ + q(Kazakhstan), + q(Kazakstan), + ], + q(0116) => [ + q(Kenya), + ], + q(0117) => [ + q(Kiribati), + ], + q(0118) => [ + q(Korea, The Democratic People's Republic of), + q(Korea (The Democratic People's Republic of)), + q(Korea, Democratic People's Republic of), + q(Korea (Democratic People's Republic of)), + q(The Democratic People's Republic of Korea), + q(Democratic People's Republic of Korea), + q(North Korea), + q(Korea, North), + ], + q(0119) => [ + q(Korea, The Republic of), + q(Korea (The Republic of)), + q(Korea, Republic of), + q(Korea (Republic of)), + q(The Republic of Korea), + q(Republic of Korea), + q(South Korea), + q(Korea, South), + ], + q(0120) => [ + q(Kuwait), + ], + q(0121) => [ + q(Kyrgyzstan), + ], + q(0122) => [ + q(Lao People's Democratic Republic), + q(The Lao People's Democratic Republic), + q(Lao People's Democratic Republic, The), + q(Lao People's Democratic Republic (The)), + q(Laos), + ], + q(0123) => [ + q(Latvia), + ], + q(0124) => [ + q(Lebanon), + ], + q(0125) => [ + q(Lesotho), + ], + q(0126) => [ + q(Liberia), + ], + q(0127) => [ + q(Libya), + ], + q(0128) => [ + q(Liechtenstein), + ], + q(0129) => [ + q(Lithuania), + ], + q(0130) => [ + q(Luxembourg), + ], + q(0131) => [ + q(Macao), + q(China, Macao Special Administrative Region), + q(Macao Special Administrative Region of China), + q(Macau S.A.R), + q(Macau S.A.R.), + q(Macau), + ], + q(0132) => [ + q(Macedonia, The former Yugoslav Republic of), + q(Macedonia (The former Yugoslav Republic of)), + q(Macedonia, former Yugoslav Republic of), + q(Macedonia (former Yugoslav Republic of)), + q(The former Yugoslav Republic of Macedonia), + q(former Yugoslav Republic of Macedonia), + q(Macedonia), + ], + q(0133) => [ + q(Madagascar), + ], + q(0134) => [ + q(Malawi), + ], + q(0135) => [ + q(Malaysia), + ], + q(0136) => [ + q(Maldives), + ], + q(0137) => [ + q(Mali), + ], + q(0138) => [ + q(Malta), + ], + q(0139) => [ + q(Marshall Islands), + q(The Marshall Islands), + q(Marshall Islands, The), + q(Marshall Islands (The)), + ], + q(0140) => [ + q(Martinique), + ], + q(0141) => [ + q(Mauritania), + ], + q(0142) => [ + q(Mauritius), + ], + q(0143) => [ + q(Mayotte), + ], + q(0144) => [ + q(Mexico), + ], + q(0145) => [ + q(Micronesia (Federated States of)), + q(Federated States of Micronesia), + q(Micronesia (The Federated States of)), + q(Micronesia, Federated States of), + q(Micronesia, The Federated States of), + q(The Federated States of Micronesia), + ], + q(0146) => [ + q(Moldova, The Republic of), + q(Moldova (The Republic of)), + q(Moldova, Republic of), + q(Moldova (Republic of)), + q(The Republic of Moldova), + q(Republic of Moldova), + q(Moldova), + ], + q(0147) => [ + q(Monaco), + ], + q(0148) => [ + q(Mongolia), + ], + q(0149) => [ + q(Montenegro), + ], + q(0150) => [ + q(Montserrat), + ], + q(0151) => [ + q(Morocco), + ], + q(0152) => [ + q(Mozambique), + ], + q(0153) => [ + q(Myanmar), + q(The Republic of the Union of Myanmar), + q(Republic of the Union of Myanmar), + q(Burma), + ], + q(0154) => [ + q(Namibia), + ], + q(0155) => [ + q(Nauru), + ], + q(0156) => [ + q(Nepal), + ], + q(0157) => [ + q(Netherlands), + q(The Netherlands), + q(Netherlands, The), + q(Netherlands (The)), + ], + q(0158) => [ + q(New Caledonia), + ], + q(0159) => [ + q(New Zealand), + ], + q(0160) => [ + q(Nicaragua), + ], + q(0161) => [ + q(Niger), + q(The Niger), + q(Niger, The), + q(Niger (The)), + ], + q(0162) => [ + q(Nigeria), + ], + q(0163) => [ + q(Niue), + ], + q(0164) => [ + q(Norfolk Island), + ], + q(0165) => [ + q(Northern Mariana Islands), + q(The Northern Mariana Islands), + q(Northern Mariana Islands, The), + q(Northern Mariana Islands (The)), + ], + q(0166) => [ + q(Norway), + ], + q(0167) => [ + q(Oman), + ], + q(0168) => [ + q(Pakistan), + ], + q(0169) => [ + q(Palau), + ], + q(0170) => [ + q(Palestine, State of), + q(Palestine (State of)), + q(State of Palestine), + ], + q(0171) => [ + q(Panama), + ], + q(0172) => [ + q(Papua New Guinea), + ], + q(0173) => [ + q(Paraguay), + ], + q(0174) => [ + q(Peru), + ], + q(0175) => [ + q(Philippines), + q(The Philippines), + q(Philippines, The), + q(Philippines (The)), + ], + q(0176) => [ + q(Pitcairn), + q(Pitcairn Island), + q(Pitcairn Islands), + ], + q(0177) => [ + q(Poland), + ], + q(0178) => [ + q(Portugal), + ], + q(0179) => [ + q(Puerto Rico), + ], + q(0180) => [ + q(Qatar), + ], + q(0181) => [ + q(Reunion), + ], + q(0182) => [ + q(Romania), + ], + q(0183) => [ + q(Russian Federation), + q(The Russian Federation), + q(Russian Federation, The), + q(Russian Federation (The)), + q(Russia), + ], + q(0184) => [ + q(Rwanda), + ], + q(0185) => [ + q(Saint Barthelemy), + q(Saint-Barthelemy), + ], + q(0186) => [ + q(Saint Helena, Ascension and Tristan da Cunha), + q(Saint Helena), + q(Saint Helena, Ascension, and Tristan Da Cunha), + ], + q(0187) => [ + q(Saint Kitts and Nevis), + ], + q(0188) => [ + q(Saint Lucia), + ], + q(0189) => [ + q(Saint Martin (French part)), + q(Saint Martin), + q(Saint-Martin (French part)), + q(Saint-Martin), + ], + q(0190) => [ + q(Saint Pierre and Miquelon), + ], + q(0191) => [ + q(Saint Vincent and the Grenadines), + ], + q(0192) => [ + q(Samoa), + ], + q(0193) => [ + q(San Marino), + ], + q(0194) => [ + q(Sao Tome and Principe), + ], + q(0195) => [ + q(Saudi Arabia), + ], + q(0196) => [ + q(Senegal), + ], + q(0197) => [ + q(Serbia), + ], + q(0198) => [ + q(Seychelles), + ], + q(0199) => [ + q(Sierra Leone), + ], + q(0200) => [ + q(Singapore), + ], + q(0201) => [ + q(Sint Maarten (Dutch part)), + q(Sint Maarten), + ], + q(0202) => [ + q(Slovakia), + ], + q(0203) => [ + q(Slovenia), + ], + q(0204) => [ + q(Solomon Islands), + q(Solomon Islands (The)), + q(Solomon Islands, The), + q(The Solomon Islands), + ], + q(0205) => [ + q(Somalia), + ], + q(0206) => [ + q(South Africa), + ], + q(0207) => [ + q(South Georgia and the South Sandwich Islands), + q(South Georgia and the Islands), + q(South Georgia and South Sandwich Islands), + ], + q(0208) => [ + q(South Sudan), + ], + q(0209) => [ + q(Spain), + ], + q(0210) => [ + q(Sri Lanka), + ], + q(0211) => [ + q(Sudan), + q(The Sudan), + q(Sudan, The), + q(Sudan (The)), + ], + q(0212) => [ + q(Suriname), + ], + q(0213) => [ + q(Svalbard and Jan Mayen), + q(Svalbard and Jan Mayen Islands), + ], + q(0214) => [ + q(Swaziland), + ], + q(0215) => [ + q(Sweden), + ], + q(0216) => [ + q(Switzerland), + ], + q(0217) => [ + q(Syrian Arab Republic), + q(Syrian Arab Republic (The)), + q(Syrian Arab Republic, The), + q(The Syrian Arab Republic), + q(Syria), + ], + q(0218) => [ + q(Taiwan (Province of China)), + q(Taiwan), + q(Taiwan, Province of China), + ], + q(0219) => [ + q(Tajikistan), + ], + q(0220) => [ + q(Tanzania, United Republic of), + q(Tanzania (United Republic of)), + q(United Republic of Tanzania), + q(Tanzania), + ], + q(0221) => [ + q(Thailand), + ], + q(0222) => [ + q(Timor-Leste), + q(East Timor), + q(The Democratic Republic of Timor-Leste), + q(Democratic Republic of Timor-Leste), + q(Timor-Leste, The Democratic Republic of), + q(Timor-Leste, Democratic Republic of), + q(Timor-Leste (The Democratic Republic of)), + q(Timor-Leste (Democratic Republic of)), + ], + q(0223) => [ + q(Togo), + ], + q(0224) => [ + q(Tokelau), + ], + q(0225) => [ + q(Tonga), + ], + q(0226) => [ + q(Trinidad and Tobago), + ], + q(0227) => [ + q(Tunisia), + ], + q(0228) => [ + q(Turkey), + ], + q(0229) => [ + q(Turkmenistan), + ], + q(0230) => [ + q(Turks and Caicos Islands), + q(The Turks and Caicos Islands), + q(Turks and Caicos Islands, The), + q(Turks and Caicos Islands (The)), + ], + q(0231) => [ + q(Tuvalu), + ], + q(0232) => [ + q(Uganda), + ], + q(0233) => [ + q(Ukraine), + ], + q(0234) => [ + q(United Arab Emirates), + q(The United Arab Emirates), + q(United Arab Emirates, The), + q(United Arab Emirates (The)), + ], + q(0235) => [ + q(United Kingdom of Great Britain and Northern Ireland), + q(The United Kingdom of Great Britain and Northern Ireland), + q(United Kingdom of Great Britain and Northern Ireland, The), + q(United Kingdom of Great Britain and Northern Ireland (The)), + q(Great Britain), + q(United Kingdom (The)), + q(The United Kingdom), + q(United Kingdom), + q(United Kingdom, The), + q(UK), + ], + q(0236) => [ + q(United States Minor Outlying Islands), + q(The United States Minor Outlying Islands), + q(United States Minor Outlying Islands, The), + q(United States Minor Outlying Islands (The)), + ], + q(0237) => [ + q(United States of America), + q(The United States of America), + q(United States of America, The), + q(United States of America (The)), + q(The United States), + q(United States), + q(United States, The), + q(United States (The)), + q(US), + q(USA), + ], + q(0238) => [ + q(Uruguay), + ], + q(0239) => [ + q(Uzbekistan), + ], + q(0240) => [ + q(Vanuatu), + ], + q(0241) => [ + q(Venezuela (Bolivarian Republic of)), + q(Venezuela, Bolivarian Republic of), + q(Venezuela, Bolivarian Republic), + q(Venezuela), + ], + q(0242) => [ + q(Viet Nam), + q(Vietnam), + ], + q(0243) => [ + q(Virgin Islands (British)), + q(British Virgin Islands), + q(Virgin Islands, British), + q(Virgin Islands (UK)), + ], + q(0244) => [ + q(Virgin Islands (U.S.)), + q(United States Virgin Islands), + q(Virgin Islands (US)), + q(Virgin Islands, U.S.), + q(Virgin Islands), + ], + q(0245) => [ + q(Wallis and Futuna), + q(Wallis and Futuna Islands), + q(The Territory of the Wallis and Futuna Islands), + q(Territory of the Wallis and Futuna Islands), + ], + q(0246) => [ + q(Western Sahara), + ], + q(0247) => [ + q(Yemen), + q(The Yemeni Republic), + q(Yemeni Republic), + q(Yemeni Republic, The), + q(Yemeni Republic (The)), + ], + q(0248) => [ + q(Zambia), + q(The Republic of Zambia), + q(Republic of Zambia), + q(Republic of Zambia, The), + q(Republic of Zambia (The)), + ], + q(0249) => [ + q(Zimbabwe), + q(The Republic of Zimbabwe), + q(Republic of Zimbabwe), + q(Republic of Zimbabwe, The), + q(Republic of Zimbabwe (The)), + ], + q(0250) => [ + q(Sark), + ], + q(0251) => [ + q(Akrotiri), + ], + q(0252) => [ + q(Ashmore and Cartier Islands), + ], + q(0253) => [ + q(Baker Island), + ], + q(0254) => [ + q(Bassas Da India), + ], + q(0255) => [ + q(Clipperton Island), + ], + q(0256) => [ + q(Coral Sea Islands), + ], + q(0257) => [ + q(Dhekelia), + ], + q(0258) => [ + q(Diego Garcia), + ], + q(0259) => [ + q(Europa Island), + ], + q(0260) => [ + q(Gaza Strip), + ], + q(0261) => [ + q(Glorioso Islands), + ], + q(0262) => [ + q(Guantanamo Bay Naval Base), + ], + q(0263) => [ + q(Howland Island), + ], + q(0264) => [ + q(Jan Mayen), + ], + q(0265) => [ + q(Jarvis Island), + ], + q(0266) => [ + q(Johnston Atoll), + ], + q(0267) => [ + q(Juan de Nova Island), + ], + q(0268) => [ + q(Kingman Reef), + ], + q(0269) => [ + q(Kosovo), + ], + q(0270) => [ + q(Midway Islands), + ], + q(0271) => [ + q(Navassa Island), + ], + q(0272) => [ + q(Palmyra Atoll), + ], + q(0273) => [ + q(Paracel Islands), + ], + q(0274) => [ + q(Spratly Islands), + ], + q(0275) => [ + q(Svalbard), + ], + q(0276) => [ + q(Tromelin Island), + ], + q(0277) => [ + q(Unknown), + ], + q(0278) => [ + q(Wake Island), + ], + q(0279) => [ + q(West Bank), + ], +}; + +$Locale::Codes::Data{'country'}{'alias2id'} = { + q(afghanistan) => [ + q(0001), + q(0), + ], + q(akrotiri) => [ + q(0251), + q(0), + ], + q(aland islands) => [ + q(0002), + q(0), + ], + q(albania) => [ + q(0003), + q(0), + ], + q(algeria) => [ + q(0004), + q(0), + ], + q(american samoa) => [ + q(0005), + q(0), + ], + q(andorra) => [ + q(0006), + q(0), + ], + q(angola) => [ + q(0007), + q(0), + ], + q(anguilla) => [ + q(0008), + q(0), + ], + q(antarctica) => [ + q(0009), + q(0), + ], + q(antigua and barbuda) => [ + q(0010), + q(0), + ], + q(argentina) => [ + q(0011), + q(0), + ], + q(armenia) => [ + q(0012), + q(0), + ], + q(aruba) => [ + q(0013), + q(0), + ], + q(ashmore and cartier islands) => [ + q(0252), + q(0), + ], + q(australia) => [ + q(0014), + q(0), + ], + q(austria) => [ + q(0015), + q(0), + ], + q(azerbaijan) => [ + q(0016), + q(0), + ], + q(bahamas) => [ + q(0017), + q(0), + ], + q(bahamas (the)) => [ + q(0017), + q(3), + ], + q(bahamas, the) => [ + q(0017), + q(2), + ], + q(bahrain) => [ + q(0018), + q(0), + ], + q(baker island) => [ + q(0253), + q(0), + ], + q(bangladesh) => [ + q(0019), + q(0), + ], + q(barbados) => [ + q(0020), + q(0), + ], + q(bassas da india) => [ + q(0254), + q(0), + ], + q(belarus) => [ + q(0021), + q(0), + ], + q(belgium) => [ + q(0022), + q(0), + ], + q(belize) => [ + q(0023), + q(0), + ], + q(benin) => [ + q(0024), + q(0), + ], + q(bermuda) => [ + q(0025), + q(0), + ], + q(bhutan) => [ + q(0026), + q(0), + ], + q(bolivia) => [ + q(0027), + q(3), + ], + q(bolivia (plurinational state of)) => [ + q(0027), + q(0), + ], + q(bolivia, plurinational state of) => [ + q(0027), + q(1), + ], + q(bonaire, sint eustatius and saba) => [ + q(0028), + q(0), + ], + q(bonaire, sint eustatius, and saba) => [ + q(0028), + q(1), + ], + q(bosnia and herzegovina) => [ + q(0029), + q(0), + ], + q(botswana) => [ + q(0030), + q(0), + ], + q(bouvet island) => [ + q(0031), + q(0), + ], + q(brazil) => [ + q(0032), + q(0), + ], + q(british indian ocean territory) => [ + q(0033), + q(0), + ], + q(british indian ocean territory (the)) => [ + q(0033), + q(3), + ], + q(british indian ocean territory, the) => [ + q(0033), + q(2), + ], + q(british virgin islands) => [ + q(0243), + q(1), + ], + q(brunei) => [ + q(0034), + q(1), + ], + q(brunei darussalam) => [ + q(0034), + q(0), + ], + q(bulgaria) => [ + q(0035), + q(0), + ], + q(burkina faso) => [ + q(0036), + q(0), + ], + q(burma) => [ + q(0153), + q(3), + ], + q(burundi) => [ + q(0037), + q(0), + ], + q(cabo verde) => [ + q(0038), + q(0), + ], + q(cambodia) => [ + q(0039), + q(0), + ], + q(cameroon) => [ + q(0040), + q(0), + ], + q(canada) => [ + q(0041), + q(0), + ], + q(cayman islands) => [ + q(0042), + q(0), + ], + q(cayman islands (the)) => [ + q(0042), + q(3), + ], + q(cayman islands, the) => [ + q(0042), + q(2), + ], + q(central african republic) => [ + q(0043), + q(0), + ], + q(central african republic (the)) => [ + q(0043), + q(3), + ], + q(central african republic, the) => [ + q(0043), + q(2), + ], + q(chad) => [ + q(0044), + q(0), + ], + q(chile) => [ + q(0045), + q(0), + ], + q(china) => [ + q(0046), + q(0), + ], + q(china, hong kong special administrative region) => [ + q(0100), + q(1), + ], + q(china, macao special administrative region) => [ + q(0131), + q(1), + ], + q(christmas island) => [ + q(0047), + q(0), + ], + q(clipperton island) => [ + q(0255), + q(0), + ], + q(cocos (keeling) islands) => [ + q(0048), + q(0), + ], + q(cocos (keeling) islands (the)) => [ + q(0048), + q(3), + ], + q(cocos (keeling) islands, the) => [ + q(0048), + q(2), + ], + q(cocos islands) => [ + q(0048), + q(4), + ], + q(colombia) => [ + q(0049), + q(0), + ], + q(comoros) => [ + q(0050), + q(0), + ], + q(comoros (the)) => [ + q(0050), + q(3), + ], + q(comoros, the) => [ + q(0050), + q(2), + ], + q(congo) => [ + q(0052), + q(0), + ], + q(congo (brazzaville)) => [ + q(0052), + q(9), + ], + q(congo (kinshasa)) => [ + q(0051), + q(6), + ], + q(congo (the democratic republic of the)) => [ + q(0051), + q(0), + ], + q(congo (the)) => [ + q(0052), + q(3), + ], + q(congo, democratic republic of the) => [ + q(0051), + q(2), + ], + q(congo, republic of the) => [ + q(0052), + q(7), + ], + q(congo, the) => [ + q(0052), + q(2), + ], + q(congo, the democratic republic of the) => [ + q(0051), + q(1), + ], + q(congo, the republic of the) => [ + q(0052), + q(6), + ], + q(congo-brazzaville) => [ + q(0052), + q(8), + ], + q(congo-kinshasa) => [ + q(0051), + q(5), + ], + q(cook islands) => [ + q(0053), + q(0), + ], + q(cook islands (the)) => [ + q(0053), + q(3), + ], + q(cook islands, the) => [ + q(0053), + q(2), + ], + q(coral sea islands) => [ + q(0256), + q(0), + ], + q(costa rica) => [ + q(0054), + q(0), + ], + q(cote d'ivoire) => [ + q(0055), + q(0), + ], + q(croatia) => [ + q(0056), + q(0), + ], + q(cuba) => [ + q(0057), + q(0), + ], + q(curacao) => [ + q(0058), + q(0), + ], + q(cyprus) => [ + q(0059), + q(0), + ], + q(czech republic) => [ + q(0060), + q(1), + ], + q(czech republic (the)) => [ + q(0060), + q(4), + ], + q(czech republic, the) => [ + q(0060), + q(3), + ], + q(czechia) => [ + q(0060), + q(0), + ], + q(democratic people's republic of korea) => [ + q(0118), + q(5), + ], + q(democratic republic of the congo) => [ + q(0051), + q(4), + ], + q(democratic republic of timor-leste) => [ + q(0222), + q(3), + ], + q(denmark) => [ + q(0061), + q(0), + ], + q(dhekelia) => [ + q(0257), + q(0), + ], + q(diego garcia) => [ + q(0258), + q(0), + ], + q(djibouti) => [ + q(0062), + q(0), + ], + q(dominica) => [ + q(0063), + q(0), + ], + q(dominican republic) => [ + q(0064), + q(0), + ], + q(dominican republic (the)) => [ + q(0064), + q(3), + ], + q(dominican republic, the) => [ + q(0064), + q(2), + ], + q(east timor) => [ + q(0222), + q(1), + ], + q(ecuador) => [ + q(0065), + q(0), + ], + q(egypt) => [ + q(0066), + q(0), + ], + q(el salvador) => [ + q(0067), + q(0), + ], + q(equatorial guinea) => [ + q(0068), + q(0), + ], + q(eritrea) => [ + q(0069), + q(0), + ], + q(estonia) => [ + q(0070), + q(0), + ], + q(ethiopia) => [ + q(0071), + q(0), + ], + q(europa island) => [ + q(0259), + q(0), + ], + q(faeroe islands) => [ + q(0073), + q(4), + ], + q(falkland islands (islas malvinas)) => [ + q(0072), + q(2), + ], + q(falkland islands (malvinas)) => [ + q(0072), + q(1), + ], + q(falkland islands (the) [malvinas]) => [ + q(0072), + q(0), + ], + q(faroe islands) => [ + q(0073), + q(0), + ], + q(faroe islands (the)) => [ + q(0073), + q(3), + ], + q(faroe islands, the) => [ + q(0073), + q(2), + ], + q(federated states of micronesia) => [ + q(0145), + q(1), + ], + q(fiji) => [ + q(0074), + q(0), + ], + q(finland) => [ + q(0075), + q(0), + ], + q(former yugoslav republic of macedonia) => [ + q(0132), + q(5), + ], + q(france) => [ + q(0076), + q(0), + ], + q(french guiana) => [ + q(0077), + q(0), + ], + q(french polynesia) => [ + q(0078), + q(0), + ], + q(french southern and antarctic lands) => [ + q(0079), + q(4), + ], + q(french southern territories) => [ + q(0079), + q(0), + ], + q(french southern territories (the)) => [ + q(0079), + q(3), + ], + q(french southern territories, the) => [ + q(0079), + q(2), + ], + q(gabon) => [ + q(0080), + q(0), + ], + q(gambia) => [ + q(0081), + q(0), + ], + q(gambia (the)) => [ + q(0081), + q(3), + ], + q(gambia, the) => [ + q(0081), + q(2), + ], + q(gaza strip) => [ + q(0260), + q(0), + ], + q(georgia) => [ + q(0082), + q(0), + ], + q(germany) => [ + q(0083), + q(0), + ], + q(ghana) => [ + q(0084), + q(0), + ], + q(gibraltar) => [ + q(0085), + q(0), + ], + q(glorioso islands) => [ + q(0261), + q(0), + ], + q(great britain) => [ + q(0235), + q(4), + ], + q(greece) => [ + q(0086), + q(0), + ], + q(greenland) => [ + q(0087), + q(0), + ], + q(grenada) => [ + q(0088), + q(0), + ], + q(guadeloupe) => [ + q(0089), + q(0), + ], + q(guam) => [ + q(0090), + q(0), + ], + q(guantanamo bay naval base) => [ + q(0262), + q(0), + ], + q(guatemala) => [ + q(0091), + q(0), + ], + q(guernsey) => [ + q(0092), + q(0), + ], + q(guinea) => [ + q(0093), + q(0), + ], + q(guinea-bissau) => [ + q(0094), + q(0), + ], + q(guyana) => [ + q(0095), + q(0), + ], + q(haiti) => [ + q(0096), + q(0), + ], + q(heard island and mcdonald islands) => [ + q(0097), + q(0), + ], + q(holy see) => [ + q(0098), + q(0), + ], + q(holy see (the)) => [ + q(0098), + q(3), + ], + q(holy see (the) [vatican city state]) => [ + q(0098), + q(4), + ], + q(holy see (vatican city state)) => [ + q(0098), + q(5), + ], + q(holy see (vatican city)) => [ + q(0098), + q(6), + ], + q(holy see, the) => [ + q(0098), + q(2), + ], + q(honduras) => [ + q(0099), + q(0), + ], + q(hong kong) => [ + q(0100), + q(0), + ], + q(hong kong s.a.r.) => [ + q(0100), + q(2), + ], + q(hong kong special administrative region of china) => [ + q(0100), + q(3), + ], + q(howland island) => [ + q(0263), + q(0), + ], + q(hungary) => [ + q(0101), + q(0), + ], + q(iceland) => [ + q(0102), + q(0), + ], + q(india) => [ + q(0103), + q(0), + ], + q(indonesia) => [ + q(0104), + q(0), + ], + q(iran) => [ + q(0105), + q(6), + ], + q(iran (islamic republic of)) => [ + q(0105), + q(0), + ], + q(iran (the islamic republic of)) => [ + q(0105), + q(1), + ], + q(iran, islamic republic of) => [ + q(0105), + q(2), + ], + q(iran, the islamic republic of) => [ + q(0105), + q(3), + ], + q(iraq) => [ + q(0106), + q(0), + ], + q(ireland) => [ + q(0107), + q(0), + ], + q(islamic republic of iran) => [ + q(0105), + q(4), + ], + q(isle of man) => [ + q(0108), + q(0), + ], + q(israel) => [ + q(0109), + q(0), + ], + q(italy) => [ + q(0110), + q(0), + ], + q(jamaica) => [ + q(0111), + q(0), + ], + q(jan mayen) => [ + q(0264), + q(0), + ], + q(japan) => [ + q(0112), + q(0), + ], + q(jarvis island) => [ + q(0265), + q(0), + ], + q(jersey) => [ + q(0113), + q(0), + ], + q(johnston atoll) => [ + q(0266), + q(0), + ], + q(jordan) => [ + q(0114), + q(0), + ], + q(juan de nova island) => [ + q(0267), + q(0), + ], + q(kazakhstan) => [ + q(0115), + q(0), + ], + q(kazakstan) => [ + q(0115), + q(1), + ], + q(keeling islands) => [ + q(0048), + q(6), + ], + q(kenya) => [ + q(0116), + q(0), + ], + q(kingman reef) => [ + q(0268), + q(0), + ], + q(kiribati) => [ + q(0117), + q(0), + ], + q(korea (democratic people's republic of)) => [ + q(0118), + q(3), + ], + q(korea (republic of)) => [ + q(0119), + q(3), + ], + q(korea (the democratic people's republic of)) => [ + q(0118), + q(1), + ], + q(korea (the republic of)) => [ + q(0119), + q(1), + ], + q(korea, democratic people's republic of) => [ + q(0118), + q(2), + ], + q(korea, north) => [ + q(0118), + q(7), + ], + q(korea, republic of) => [ + q(0119), + q(2), + ], + q(korea, south) => [ + q(0119), + q(7), + ], + q(korea, the democratic people's republic of) => [ + q(0118), + q(0), + ], + q(korea, the republic of) => [ + q(0119), + q(0), + ], + q(kosovo) => [ + q(0269), + q(0), + ], + q(kuwait) => [ + q(0120), + q(0), + ], + q(kyrgyzstan) => [ + q(0121), + q(0), + ], + q(lao people's democratic republic) => [ + q(0122), + q(0), + ], + q(lao people's democratic republic (the)) => [ + q(0122), + q(3), + ], + q(lao people's democratic republic, the) => [ + q(0122), + q(2), + ], + q(laos) => [ + q(0122), + q(4), + ], + q(latvia) => [ + q(0123), + q(0), + ], + q(lebanon) => [ + q(0124), + q(0), + ], + q(lesotho) => [ + q(0125), + q(0), + ], + q(liberia) => [ + q(0126), + q(0), + ], + q(libya) => [ + q(0127), + q(0), + ], + q(liechtenstein) => [ + q(0128), + q(0), + ], + q(lithuania) => [ + q(0129), + q(0), + ], + q(luxembourg) => [ + q(0130), + q(0), + ], + q(macao) => [ + q(0131), + q(0), + ], + q(macao special administrative region of china) => [ + q(0131), + q(2), + ], + q(macau) => [ + q(0131), + q(5), + ], + q(macau s.a.r) => [ + q(0131), + q(3), + ], + q(macau s.a.r.) => [ + q(0131), + q(4), + ], + q(macedonia) => [ + q(0132), + q(6), + ], + q(macedonia (former yugoslav republic of)) => [ + q(0132), + q(3), + ], + q(macedonia (the former yugoslav republic of)) => [ + q(0132), + q(1), + ], + q(macedonia, former yugoslav republic of) => [ + q(0132), + q(2), + ], + q(macedonia, the former yugoslav republic of) => [ + q(0132), + q(0), + ], + q(madagascar) => [ + q(0133), + q(0), + ], + q(malawi) => [ + q(0134), + q(0), + ], + q(malaysia) => [ + q(0135), + q(0), + ], + q(maldives) => [ + q(0136), + q(0), + ], + q(mali) => [ + q(0137), + q(0), + ], + q(malta) => [ + q(0138), + q(0), + ], + q(marshall islands) => [ + q(0139), + q(0), + ], + q(marshall islands (the)) => [ + q(0139), + q(3), + ], + q(marshall islands, the) => [ + q(0139), + q(2), + ], + q(martinique) => [ + q(0140), + q(0), + ], + q(mauritania) => [ + q(0141), + q(0), + ], + q(mauritius) => [ + q(0142), + q(0), + ], + q(mayotte) => [ + q(0143), + q(0), + ], + q(mexico) => [ + q(0144), + q(0), + ], + q(micronesia (federated states of)) => [ + q(0145), + q(0), + ], + q(micronesia (the federated states of)) => [ + q(0145), + q(2), + ], + q(micronesia, federated states of) => [ + q(0145), + q(3), + ], + q(micronesia, the federated states of) => [ + q(0145), + q(4), + ], + q(midway islands) => [ + q(0270), + q(0), + ], + q(moldova) => [ + q(0146), + q(6), + ], + q(moldova (republic of)) => [ + q(0146), + q(3), + ], + q(moldova (the republic of)) => [ + q(0146), + q(1), + ], + q(moldova, republic of) => [ + q(0146), + q(2), + ], + q(moldova, the republic of) => [ + q(0146), + q(0), + ], + q(monaco) => [ + q(0147), + q(0), + ], + q(mongolia) => [ + q(0148), + q(0), + ], + q(montenegro) => [ + q(0149), + q(0), + ], + q(montserrat) => [ + q(0150), + q(0), + ], + q(morocco) => [ + q(0151), + q(0), + ], + q(mozambique) => [ + q(0152), + q(0), + ], + q(myanmar) => [ + q(0153), + q(0), + ], + q(namibia) => [ + q(0154), + q(0), + ], + q(nauru) => [ + q(0155), + q(0), + ], + q(navassa island) => [ + q(0271), + q(0), + ], + q(nepal) => [ + q(0156), + q(0), + ], + q(netherlands) => [ + q(0157), + q(0), + ], + q(netherlands (the)) => [ + q(0157), + q(3), + ], + q(netherlands, the) => [ + q(0157), + q(2), + ], + q(new caledonia) => [ + q(0158), + q(0), + ], + q(new zealand) => [ + q(0159), + q(0), + ], + q(nicaragua) => [ + q(0160), + q(0), + ], + q(niger) => [ + q(0161), + q(0), + ], + q(niger (the)) => [ + q(0161), + q(3), + ], + q(niger, the) => [ + q(0161), + q(2), + ], + q(nigeria) => [ + q(0162), + q(0), + ], + q(niue) => [ + q(0163), + q(0), + ], + q(norfolk island) => [ + q(0164), + q(0), + ], + q(north korea) => [ + q(0118), + q(6), + ], + q(northern mariana islands) => [ + q(0165), + q(0), + ], + q(northern mariana islands (the)) => [ + q(0165), + q(3), + ], + q(northern mariana islands, the) => [ + q(0165), + q(2), + ], + q(norway) => [ + q(0166), + q(0), + ], + q(oman) => [ + q(0167), + q(0), + ], + q(pakistan) => [ + q(0168), + q(0), + ], + q(palau) => [ + q(0169), + q(0), + ], + q(palestine (state of)) => [ + q(0170), + q(1), + ], + q(palestine, state of) => [ + q(0170), + q(0), + ], + q(palmyra atoll) => [ + q(0272), + q(0), + ], + q(panama) => [ + q(0171), + q(0), + ], + q(papua new guinea) => [ + q(0172), + q(0), + ], + q(paracel islands) => [ + q(0273), + q(0), + ], + q(paraguay) => [ + q(0173), + q(0), + ], + q(peru) => [ + q(0174), + q(0), + ], + q(philippines) => [ + q(0175), + q(0), + ], + q(philippines (the)) => [ + q(0175), + q(3), + ], + q(philippines, the) => [ + q(0175), + q(2), + ], + q(pitcairn) => [ + q(0176), + q(0), + ], + q(pitcairn island) => [ + q(0176), + q(1), + ], + q(pitcairn islands) => [ + q(0176), + q(2), + ], + q(plurinational state of bolivia) => [ + q(0027), + q(2), + ], + q(poland) => [ + q(0177), + q(0), + ], + q(portugal) => [ + q(0178), + q(0), + ], + q(puerto rico) => [ + q(0179), + q(0), + ], + q(qatar) => [ + q(0180), + q(0), + ], + q(republic of korea) => [ + q(0119), + q(5), + ], + q(republic of moldova) => [ + q(0146), + q(5), + ], + q(republic of the congo) => [ + q(0052), + q(5), + ], + q(republic of the union of myanmar) => [ + q(0153), + q(2), + ], + q(republic of zambia) => [ + q(0248), + q(2), + ], + q(republic of zambia (the)) => [ + q(0248), + q(4), + ], + q(republic of zambia, the) => [ + q(0248), + q(3), + ], + q(republic of zimbabwe) => [ + q(0249), + q(2), + ], + q(republic of zimbabwe (the)) => [ + q(0249), + q(4), + ], + q(republic of zimbabwe, the) => [ + q(0249), + q(3), + ], + q(reunion) => [ + q(0181), + q(0), + ], + q(romania) => [ + q(0182), + q(0), + ], + q(russia) => [ + q(0183), + q(4), + ], + q(russian federation) => [ + q(0183), + q(0), + ], + q(russian federation (the)) => [ + q(0183), + q(3), + ], + q(russian federation, the) => [ + q(0183), + q(2), + ], + q(rwanda) => [ + q(0184), + q(0), + ], + q(saint barthelemy) => [ + q(0185), + q(0), + ], + q(saint helena) => [ + q(0186), + q(1), + ], + q(saint helena, ascension and tristan da cunha) => [ + q(0186), + q(0), + ], + q(saint helena, ascension, and tristan da cunha) => [ + q(0186), + q(2), + ], + q(saint kitts and nevis) => [ + q(0187), + q(0), + ], + q(saint lucia) => [ + q(0188), + q(0), + ], + q(saint martin) => [ + q(0189), + q(1), + ], + q(saint martin (french part)) => [ + q(0189), + q(0), + ], + q(saint pierre and miquelon) => [ + q(0190), + q(0), + ], + q(saint vincent and the grenadines) => [ + q(0191), + q(0), + ], + q(saint-barthelemy) => [ + q(0185), + q(1), + ], + q(saint-martin) => [ + q(0189), + q(3), + ], + q(saint-martin (french part)) => [ + q(0189), + q(2), + ], + q(samoa) => [ + q(0192), + q(0), + ], + q(san marino) => [ + q(0193), + q(0), + ], + q(sao tome and principe) => [ + q(0194), + q(0), + ], + q(sark) => [ + q(0250), + q(0), + ], + q(saudi arabia) => [ + q(0195), + q(0), + ], + q(senegal) => [ + q(0196), + q(0), + ], + q(serbia) => [ + q(0197), + q(0), + ], + q(seychelles) => [ + q(0198), + q(0), + ], + q(sierra leone) => [ + q(0199), + q(0), + ], + q(singapore) => [ + q(0200), + q(0), + ], + q(sint maarten) => [ + q(0201), + q(1), + ], + q(sint maarten (dutch part)) => [ + q(0201), + q(0), + ], + q(slovakia) => [ + q(0202), + q(0), + ], + q(slovenia) => [ + q(0203), + q(0), + ], + q(solomon islands) => [ + q(0204), + q(0), + ], + q(solomon islands (the)) => [ + q(0204), + q(1), + ], + q(solomon islands, the) => [ + q(0204), + q(2), + ], + q(somalia) => [ + q(0205), + q(0), + ], + q(south africa) => [ + q(0206), + q(0), + ], + q(south georgia and south sandwich islands) => [ + q(0207), + q(2), + ], + q(south georgia and the islands) => [ + q(0207), + q(1), + ], + q(south georgia and the south sandwich islands) => [ + q(0207), + q(0), + ], + q(south korea) => [ + q(0119), + q(6), + ], + q(south sudan) => [ + q(0208), + q(0), + ], + q(spain) => [ + q(0209), + q(0), + ], + q(spratly islands) => [ + q(0274), + q(0), + ], + q(sri lanka) => [ + q(0210), + q(0), + ], + q(state of palestine) => [ + q(0170), + q(2), + ], + q(sudan) => [ + q(0211), + q(0), + ], + q(sudan (the)) => [ + q(0211), + q(3), + ], + q(sudan, the) => [ + q(0211), + q(2), + ], + q(suriname) => [ + q(0212), + q(0), + ], + q(svalbard) => [ + q(0275), + q(0), + ], + q(svalbard and jan mayen) => [ + q(0213), + q(0), + ], + q(svalbard and jan mayen islands) => [ + q(0213), + q(1), + ], + q(swaziland) => [ + q(0214), + q(0), + ], + q(sweden) => [ + q(0215), + q(0), + ], + q(switzerland) => [ + q(0216), + q(0), + ], + q(syria) => [ + q(0217), + q(4), + ], + q(syrian arab republic) => [ + q(0217), + q(0), + ], + q(syrian arab republic (the)) => [ + q(0217), + q(1), + ], + q(syrian arab republic, the) => [ + q(0217), + q(2), + ], + q(taiwan) => [ + q(0218), + q(1), + ], + q(taiwan (province of china)) => [ + q(0218), + q(0), + ], + q(taiwan, province of china) => [ + q(0218), + q(2), + ], + q(tajikistan) => [ + q(0219), + q(0), + ], + q(tanzania) => [ + q(0220), + q(3), + ], + q(tanzania (united republic of)) => [ + q(0220), + q(1), + ], + q(tanzania, united republic of) => [ + q(0220), + q(0), + ], + q(territory of the wallis and futuna islands) => [ + q(0245), + q(3), + ], + q(thailand) => [ + q(0221), + q(0), + ], + q(the bahamas) => [ + q(0017), + q(1), + ], + q(the british indian ocean territory) => [ + q(0033), + q(1), + ], + q(the cayman islands) => [ + q(0042), + q(1), + ], + q(the central african republic) => [ + q(0043), + q(1), + ], + q(the cocos (keeling) islands) => [ + q(0048), + q(1), + ], + q(the cocos islands) => [ + q(0048), + q(5), + ], + q(the comoros) => [ + q(0050), + q(1), + ], + q(the congo) => [ + q(0052), + q(1), + ], + q(the cook islands) => [ + q(0053), + q(1), + ], + q(the czech republic) => [ + q(0060), + q(2), + ], + q(the democratic people's republic of korea) => [ + q(0118), + q(4), + ], + q(the democratic republic of the congo) => [ + q(0051), + q(3), + ], + q(the democratic republic of timor-leste) => [ + q(0222), + q(2), + ], + q(the dominican republic) => [ + q(0064), + q(1), + ], + q(the faeroe islands) => [ + q(0073), + q(5), + ], + q(the faroe islands) => [ + q(0073), + q(1), + ], + q(the federated states of micronesia) => [ + q(0145), + q(5), + ], + q(the former yugoslav republic of macedonia) => [ + q(0132), + q(4), + ], + q(the french southern territories) => [ + q(0079), + q(1), + ], + q(the gambia) => [ + q(0081), + q(1), + ], + q(the holy see) => [ + q(0098), + q(1), + ], + q(the islamic republic of iran) => [ + q(0105), + q(5), + ], + q(the keeling islands) => [ + q(0048), + q(7), + ], + q(the lao people's democratic republic) => [ + q(0122), + q(1), + ], + q(the marshall islands) => [ + q(0139), + q(1), + ], + q(the netherlands) => [ + q(0157), + q(1), + ], + q(the niger) => [ + q(0161), + q(1), + ], + q(the northern mariana islands) => [ + q(0165), + q(1), + ], + q(the philippines) => [ + q(0175), + q(1), + ], + q(the republic of korea) => [ + q(0119), + q(4), + ], + q(the republic of moldova) => [ + q(0146), + q(4), + ], + q(the republic of the congo) => [ + q(0052), + q(4), + ], + q(the republic of the union of myanmar) => [ + q(0153), + q(1), + ], + q(the republic of zambia) => [ + q(0248), + q(1), + ], + q(the republic of zimbabwe) => [ + q(0249), + q(1), + ], + q(the russian federation) => [ + q(0183), + q(1), + ], + q(the solomon islands) => [ + q(0204), + q(3), + ], + q(the sudan) => [ + q(0211), + q(1), + ], + q(the syrian arab republic) => [ + q(0217), + q(3), + ], + q(the territory of the wallis and futuna islands) => [ + q(0245), + q(2), + ], + q(the turks and caicos islands) => [ + q(0230), + q(1), + ], + q(the united arab emirates) => [ + q(0234), + q(1), + ], + q(the united kingdom) => [ + q(0235), + q(6), + ], + q(the united kingdom of great britain and northern ireland) => [ + q(0235), + q(1), + ], + q(the united states) => [ + q(0237), + q(4), + ], + q(the united states minor outlying islands) => [ + q(0236), + q(1), + ], + q(the united states of america) => [ + q(0237), + q(1), + ], + q(the yemeni republic) => [ + q(0247), + q(1), + ], + q(timor-leste) => [ + q(0222), + q(0), + ], + q(timor-leste (democratic republic of)) => [ + q(0222), + q(7), + ], + q(timor-leste (the democratic republic of)) => [ + q(0222), + q(6), + ], + q(timor-leste, democratic republic of) => [ + q(0222), + q(5), + ], + q(timor-leste, the democratic republic of) => [ + q(0222), + q(4), + ], + q(togo) => [ + q(0223), + q(0), + ], + q(tokelau) => [ + q(0224), + q(0), + ], + q(tonga) => [ + q(0225), + q(0), + ], + q(trinidad and tobago) => [ + q(0226), + q(0), + ], + q(tromelin island) => [ + q(0276), + q(0), + ], + q(tunisia) => [ + q(0227), + q(0), + ], + q(turkey) => [ + q(0228), + q(0), + ], + q(turkmenistan) => [ + q(0229), + q(0), + ], + q(turks and caicos islands) => [ + q(0230), + q(0), + ], + q(turks and caicos islands (the)) => [ + q(0230), + q(3), + ], + q(turks and caicos islands, the) => [ + q(0230), + q(2), + ], + q(tuvalu) => [ + q(0231), + q(0), + ], + q(uganda) => [ + q(0232), + q(0), + ], + q(uk) => [ + q(0235), + q(9), + ], + q(ukraine) => [ + q(0233), + q(0), + ], + q(united arab emirates) => [ + q(0234), + q(0), + ], + q(united arab emirates (the)) => [ + q(0234), + q(3), + ], + q(united arab emirates, the) => [ + q(0234), + q(2), + ], + q(united kingdom) => [ + q(0235), + q(7), + ], + q(united kingdom (the)) => [ + q(0235), + q(5), + ], + q(united kingdom of great britain and northern ireland) => [ + q(0235), + q(0), + ], + q(united kingdom of great britain and northern ireland (the)) => [ + q(0235), + q(3), + ], + q(united kingdom of great britain and northern ireland, the) => [ + q(0235), + q(2), + ], + q(united kingdom, the) => [ + q(0235), + q(8), + ], + q(united republic of tanzania) => [ + q(0220), + q(2), + ], + q(united states) => [ + q(0237), + q(5), + ], + q(united states (the)) => [ + q(0237), + q(7), + ], + q(united states minor outlying islands) => [ + q(0236), + q(0), + ], + q(united states minor outlying islands (the)) => [ + q(0236), + q(3), + ], + q(united states minor outlying islands, the) => [ + q(0236), + q(2), + ], + q(united states of america) => [ + q(0237), + q(0), + ], + q(united states of america (the)) => [ + q(0237), + q(3), + ], + q(united states of america, the) => [ + q(0237), + q(2), + ], + q(united states virgin islands) => [ + q(0244), + q(1), + ], + q(united states, the) => [ + q(0237), + q(6), + ], + q(unknown) => [ + q(0277), + q(0), + ], + q(uruguay) => [ + q(0238), + q(0), + ], + q(us) => [ + q(0237), + q(8), + ], + q(usa) => [ + q(0237), + q(9), + ], + q(uzbekistan) => [ + q(0239), + q(0), + ], + q(vanuatu) => [ + q(0240), + q(0), + ], + q(vatican city) => [ + q(0098), + q(7), + ], + q(venezuela) => [ + q(0241), + q(3), + ], + q(venezuela (bolivarian republic of)) => [ + q(0241), + q(0), + ], + q(venezuela, bolivarian republic) => [ + q(0241), + q(2), + ], + q(venezuela, bolivarian republic of) => [ + q(0241), + q(1), + ], + q(viet nam) => [ + q(0242), + q(0), + ], + q(vietnam) => [ + q(0242), + q(1), + ], + q(virgin islands) => [ + q(0244), + q(4), + ], + q(virgin islands (british)) => [ + q(0243), + q(0), + ], + q(virgin islands (u.s.)) => [ + q(0244), + q(0), + ], + q(virgin islands (uk)) => [ + q(0243), + q(3), + ], + q(virgin islands (us)) => [ + q(0244), + q(2), + ], + q(virgin islands, british) => [ + q(0243), + q(2), + ], + q(virgin islands, u.s.) => [ + q(0244), + q(3), + ], + q(wake island) => [ + q(0278), + q(0), + ], + q(wallis and futuna) => [ + q(0245), + q(0), + ], + q(wallis and futuna islands) => [ + q(0245), + q(1), + ], + q(west bank) => [ + q(0279), + q(0), + ], + q(western sahara) => [ + q(0246), + q(0), + ], + q(yemen) => [ + q(0247), + q(0), + ], + q(yemeni republic) => [ + q(0247), + q(2), + ], + q(yemeni republic (the)) => [ + q(0247), + q(4), + ], + q(yemeni republic, the) => [ + q(0247), + q(3), + ], + q(zambia) => [ + q(0248), + q(0), + ], + q(zimbabwe) => [ + q(0249), + q(0), + ], +}; + +$Locale::Codes::Data{'country'}{'code2id'} = { + q(alpha-2) => { + q(ad) => [ + q(0006), + q(0), + ], + q(ae) => [ + q(0234), + q(0), + ], + q(af) => [ + q(0001), + q(0), + ], + q(ag) => [ + q(0010), + q(0), + ], + q(ai) => [ + q(0008), + q(0), + ], + q(al) => [ + q(0003), + q(0), + ], + q(am) => [ + q(0012), + q(0), + ], + q(ao) => [ + q(0007), + q(0), + ], + q(aq) => [ + q(0009), + q(0), + ], + q(ar) => [ + q(0011), + q(0), + ], + q(as) => [ + q(0005), + q(0), + ], + q(at) => [ + q(0015), + q(0), + ], + q(au) => [ + q(0014), + q(0), + ], + q(aw) => [ + q(0013), + q(0), + ], + q(ax) => [ + q(0002), + q(0), + ], + q(az) => [ + q(0016), + q(0), + ], + q(ba) => [ + q(0029), + q(0), + ], + q(bb) => [ + q(0020), + q(0), + ], + q(bd) => [ + q(0019), + q(0), + ], + q(be) => [ + q(0022), + q(0), + ], + q(bf) => [ + q(0036), + q(0), + ], + q(bg) => [ + q(0035), + q(0), + ], + q(bh) => [ + q(0018), + q(0), + ], + q(bi) => [ + q(0037), + q(0), + ], + q(bj) => [ + q(0024), + q(0), + ], + q(bl) => [ + q(0185), + q(0), + ], + q(bm) => [ + q(0025), + q(0), + ], + q(bn) => [ + q(0034), + q(0), + ], + q(bo) => [ + q(0027), + q(0), + ], + q(bq) => [ + q(0028), + q(0), + ], + q(br) => [ + q(0032), + q(0), + ], + q(bs) => [ + q(0017), + q(0), + ], + q(bt) => [ + q(0026), + q(0), + ], + q(bv) => [ + q(0031), + q(0), + ], + q(bw) => [ + q(0030), + q(0), + ], + q(by) => [ + q(0021), + q(0), + ], + q(bz) => [ + q(0023), + q(0), + ], + q(ca) => [ + q(0041), + q(0), + ], + q(cc) => [ + q(0048), + q(0), + ], + q(cd) => [ + q(0051), + q(0), + ], + q(cf) => [ + q(0043), + q(0), + ], + q(cg) => [ + q(0052), + q(0), + ], + q(ch) => [ + q(0216), + q(0), + ], + q(ci) => [ + q(0055), + q(0), + ], + q(ck) => [ + q(0053), + q(0), + ], + q(cl) => [ + q(0045), + q(0), + ], + q(cm) => [ + q(0040), + q(0), + ], + q(cn) => [ + q(0046), + q(0), + ], + q(co) => [ + q(0049), + q(0), + ], + q(cr) => [ + q(0054), + q(0), + ], + q(cu) => [ + q(0057), + q(0), + ], + q(cv) => [ + q(0038), + q(0), + ], + q(cw) => [ + q(0058), + q(0), + ], + q(cx) => [ + q(0047), + q(0), + ], + q(cy) => [ + q(0059), + q(0), + ], + q(cz) => [ + q(0060), + q(0), + ], + q(de) => [ + q(0083), + q(0), + ], + q(dj) => [ + q(0062), + q(0), + ], + q(dk) => [ + q(0061), + q(0), + ], + q(dm) => [ + q(0063), + q(0), + ], + q(do) => [ + q(0064), + q(0), + ], + q(dz) => [ + q(0004), + q(0), + ], + q(ec) => [ + q(0065), + q(0), + ], + q(ee) => [ + q(0070), + q(0), + ], + q(eg) => [ + q(0066), + q(0), + ], + q(eh) => [ + q(0246), + q(0), + ], + q(er) => [ + q(0069), + q(0), + ], + q(es) => [ + q(0209), + q(0), + ], + q(et) => [ + q(0071), + q(0), + ], + q(fi) => [ + q(0075), + q(0), + ], + q(fj) => [ + q(0074), + q(0), + ], + q(fk) => [ + q(0072), + q(0), + ], + q(fm) => [ + q(0145), + q(0), + ], + q(fo) => [ + q(0073), + q(0), + ], + q(fr) => [ + q(0076), + q(0), + ], + q(ga) => [ + q(0080), + q(0), + ], + q(gb) => [ + q(0235), + q(0), + ], + q(gd) => [ + q(0088), + q(0), + ], + q(ge) => [ + q(0082), + q(0), + ], + q(gf) => [ + q(0077), + q(0), + ], + q(gg) => [ + q(0092), + q(0), + ], + q(gh) => [ + q(0084), + q(0), + ], + q(gi) => [ + q(0085), + q(0), + ], + q(gl) => [ + q(0087), + q(0), + ], + q(gm) => [ + q(0081), + q(0), + ], + q(gn) => [ + q(0093), + q(0), + ], + q(gp) => [ + q(0089), + q(0), + ], + q(gq) => [ + q(0068), + q(0), + ], + q(gr) => [ + q(0086), + q(0), + ], + q(gs) => [ + q(0207), + q(0), + ], + q(gt) => [ + q(0091), + q(0), + ], + q(gu) => [ + q(0090), + q(0), + ], + q(gw) => [ + q(0094), + q(0), + ], + q(gy) => [ + q(0095), + q(0), + ], + q(hk) => [ + q(0100), + q(0), + ], + q(hm) => [ + q(0097), + q(0), + ], + q(hn) => [ + q(0099), + q(0), + ], + q(hr) => [ + q(0056), + q(0), + ], + q(ht) => [ + q(0096), + q(0), + ], + q(hu) => [ + q(0101), + q(0), + ], + q(id) => [ + q(0104), + q(0), + ], + q(ie) => [ + q(0107), + q(0), + ], + q(il) => [ + q(0109), + q(0), + ], + q(im) => [ + q(0108), + q(0), + ], + q(in) => [ + q(0103), + q(0), + ], + q(io) => [ + q(0033), + q(0), + ], + q(iq) => [ + q(0106), + q(0), + ], + q(ir) => [ + q(0105), + q(0), + ], + q(is) => [ + q(0102), + q(0), + ], + q(it) => [ + q(0110), + q(0), + ], + q(je) => [ + q(0113), + q(0), + ], + q(jm) => [ + q(0111), + q(0), + ], + q(jo) => [ + q(0114), + q(0), + ], + q(jp) => [ + q(0112), + q(0), + ], + q(ke) => [ + q(0116), + q(0), + ], + q(kg) => [ + q(0121), + q(0), + ], + q(kh) => [ + q(0039), + q(0), + ], + q(ki) => [ + q(0117), + q(0), + ], + q(km) => [ + q(0050), + q(0), + ], + q(kn) => [ + q(0187), + q(0), + ], + q(kp) => [ + q(0118), + q(0), + ], + q(kr) => [ + q(0119), + q(0), + ], + q(kw) => [ + q(0120), + q(0), + ], + q(ky) => [ + q(0042), + q(0), + ], + q(kz) => [ + q(0115), + q(0), + ], + q(la) => [ + q(0122), + q(0), + ], + q(lb) => [ + q(0124), + q(0), + ], + q(lc) => [ + q(0188), + q(0), + ], + q(li) => [ + q(0128), + q(0), + ], + q(lk) => [ + q(0210), + q(0), + ], + q(lr) => [ + q(0126), + q(0), + ], + q(ls) => [ + q(0125), + q(0), + ], + q(lt) => [ + q(0129), + q(0), + ], + q(lu) => [ + q(0130), + q(0), + ], + q(lv) => [ + q(0123), + q(0), + ], + q(ly) => [ + q(0127), + q(0), + ], + q(ma) => [ + q(0151), + q(0), + ], + q(mc) => [ + q(0147), + q(0), + ], + q(md) => [ + q(0146), + q(0), + ], + q(me) => [ + q(0149), + q(0), + ], + q(mf) => [ + q(0189), + q(0), + ], + q(mg) => [ + q(0133), + q(0), + ], + q(mh) => [ + q(0139), + q(0), + ], + q(mk) => [ + q(0132), + q(0), + ], + q(ml) => [ + q(0137), + q(0), + ], + q(mm) => [ + q(0153), + q(0), + ], + q(mn) => [ + q(0148), + q(0), + ], + q(mo) => [ + q(0131), + q(0), + ], + q(mp) => [ + q(0165), + q(0), + ], + q(mq) => [ + q(0140), + q(0), + ], + q(mr) => [ + q(0141), + q(0), + ], + q(ms) => [ + q(0150), + q(0), + ], + q(mt) => [ + q(0138), + q(0), + ], + q(mu) => [ + q(0142), + q(0), + ], + q(mv) => [ + q(0136), + q(0), + ], + q(mw) => [ + q(0134), + q(0), + ], + q(mx) => [ + q(0144), + q(0), + ], + q(my) => [ + q(0135), + q(0), + ], + q(mz) => [ + q(0152), + q(0), + ], + q(na) => [ + q(0154), + q(0), + ], + q(nc) => [ + q(0158), + q(0), + ], + q(ne) => [ + q(0161), + q(0), + ], + q(nf) => [ + q(0164), + q(0), + ], + q(ng) => [ + q(0162), + q(0), + ], + q(ni) => [ + q(0160), + q(0), + ], + q(nl) => [ + q(0157), + q(0), + ], + q(no) => [ + q(0166), + q(0), + ], + q(np) => [ + q(0156), + q(0), + ], + q(nr) => [ + q(0155), + q(0), + ], + q(nu) => [ + q(0163), + q(0), + ], + q(nz) => [ + q(0159), + q(0), + ], + q(om) => [ + q(0167), + q(0), + ], + q(pa) => [ + q(0171), + q(0), + ], + q(pe) => [ + q(0174), + q(0), + ], + q(pf) => [ + q(0078), + q(0), + ], + q(pg) => [ + q(0172), + q(0), + ], + q(ph) => [ + q(0175), + q(0), + ], + q(pk) => [ + q(0168), + q(0), + ], + q(pl) => [ + q(0177), + q(0), + ], + q(pm) => [ + q(0190), + q(0), + ], + q(pn) => [ + q(0176), + q(0), + ], + q(pr) => [ + q(0179), + q(0), + ], + q(ps) => [ + q(0170), + q(0), + ], + q(pt) => [ + q(0178), + q(0), + ], + q(pw) => [ + q(0169), + q(0), + ], + q(py) => [ + q(0173), + q(0), + ], + q(qa) => [ + q(0180), + q(0), + ], + q(re) => [ + q(0181), + q(0), + ], + q(ro) => [ + q(0182), + q(0), + ], + q(rs) => [ + q(0197), + q(0), + ], + q(ru) => [ + q(0183), + q(0), + ], + q(rw) => [ + q(0184), + q(0), + ], + q(sa) => [ + q(0195), + q(0), + ], + q(sb) => [ + q(0204), + q(0), + ], + q(sc) => [ + q(0198), + q(0), + ], + q(sd) => [ + q(0211), + q(0), + ], + q(se) => [ + q(0215), + q(0), + ], + q(sg) => [ + q(0200), + q(0), + ], + q(sh) => [ + q(0186), + q(0), + ], + q(si) => [ + q(0203), + q(0), + ], + q(sj) => [ + q(0213), + q(0), + ], + q(sk) => [ + q(0202), + q(0), + ], + q(sl) => [ + q(0199), + q(0), + ], + q(sm) => [ + q(0193), + q(0), + ], + q(sn) => [ + q(0196), + q(0), + ], + q(so) => [ + q(0205), + q(0), + ], + q(sr) => [ + q(0212), + q(0), + ], + q(ss) => [ + q(0208), + q(0), + ], + q(st) => [ + q(0194), + q(0), + ], + q(sv) => [ + q(0067), + q(0), + ], + q(sx) => [ + q(0201), + q(0), + ], + q(sy) => [ + q(0217), + q(0), + ], + q(sz) => [ + q(0214), + q(0), + ], + q(tc) => [ + q(0230), + q(0), + ], + q(td) => [ + q(0044), + q(0), + ], + q(tf) => [ + q(0079), + q(0), + ], + q(tg) => [ + q(0223), + q(0), + ], + q(th) => [ + q(0221), + q(0), + ], + q(tj) => [ + q(0219), + q(0), + ], + q(tk) => [ + q(0224), + q(0), + ], + q(tl) => [ + q(0222), + q(0), + ], + q(tm) => [ + q(0229), + q(0), + ], + q(tn) => [ + q(0227), + q(0), + ], + q(to) => [ + q(0225), + q(0), + ], + q(tr) => [ + q(0228), + q(0), + ], + q(tt) => [ + q(0226), + q(0), + ], + q(tv) => [ + q(0231), + q(0), + ], + q(tw) => [ + q(0218), + q(0), + ], + q(tz) => [ + q(0220), + q(0), + ], + q(ua) => [ + q(0233), + q(0), + ], + q(ug) => [ + q(0232), + q(0), + ], + q(um) => [ + q(0236), + q(0), + ], + q(us) => [ + q(0237), + q(0), + ], + q(uy) => [ + q(0238), + q(0), + ], + q(uz) => [ + q(0239), + q(0), + ], + q(va) => [ + q(0098), + q(0), + ], + q(vc) => [ + q(0191), + q(0), + ], + q(ve) => [ + q(0241), + q(0), + ], + q(vg) => [ + q(0243), + q(0), + ], + q(vi) => [ + q(0244), + q(0), + ], + q(vn) => [ + q(0242), + q(0), + ], + q(vu) => [ + q(0240), + q(0), + ], + q(wf) => [ + q(0245), + q(0), + ], + q(ws) => [ + q(0192), + q(0), + ], + q(ye) => [ + q(0247), + q(0), + ], + q(yt) => [ + q(0143), + q(0), + ], + q(za) => [ + q(0206), + q(0), + ], + q(zm) => [ + q(0248), + q(0), + ], + q(zw) => [ + q(0249), + q(0), + ], + }, + q(alpha-3) => { + q(abw) => [ + q(0013), + q(0), + ], + q(afg) => [ + q(0001), + q(0), + ], + q(ago) => [ + q(0007), + q(0), + ], + q(aia) => [ + q(0008), + q(0), + ], + q(ala) => [ + q(0002), + q(0), + ], + q(alb) => [ + q(0003), + q(0), + ], + q(and) => [ + q(0006), + q(0), + ], + q(are) => [ + q(0234), + q(0), + ], + q(arg) => [ + q(0011), + q(0), + ], + q(arm) => [ + q(0012), + q(0), + ], + q(asm) => [ + q(0005), + q(0), + ], + q(ata) => [ + q(0009), + q(0), + ], + q(atf) => [ + q(0079), + q(0), + ], + q(atg) => [ + q(0010), + q(0), + ], + q(aus) => [ + q(0014), + q(0), + ], + q(aut) => [ + q(0015), + q(0), + ], + q(aze) => [ + q(0016), + q(0), + ], + q(bdi) => [ + q(0037), + q(0), + ], + q(bel) => [ + q(0022), + q(0), + ], + q(ben) => [ + q(0024), + q(0), + ], + q(bes) => [ + q(0028), + q(0), + ], + q(bfa) => [ + q(0036), + q(0), + ], + q(bgd) => [ + q(0019), + q(0), + ], + q(bgr) => [ + q(0035), + q(0), + ], + q(bhr) => [ + q(0018), + q(0), + ], + q(bhs) => [ + q(0017), + q(0), + ], + q(bih) => [ + q(0029), + q(0), + ], + q(blm) => [ + q(0185), + q(0), + ], + q(blr) => [ + q(0021), + q(0), + ], + q(blz) => [ + q(0023), + q(0), + ], + q(bmu) => [ + q(0025), + q(0), + ], + q(bol) => [ + q(0027), + q(0), + ], + q(bra) => [ + q(0032), + q(0), + ], + q(brb) => [ + q(0020), + q(0), + ], + q(brn) => [ + q(0034), + q(0), + ], + q(btn) => [ + q(0026), + q(0), + ], + q(bvt) => [ + q(0031), + q(0), + ], + q(bwa) => [ + q(0030), + q(0), + ], + q(caf) => [ + q(0043), + q(0), + ], + q(can) => [ + q(0041), + q(0), + ], + q(cck) => [ + q(0048), + q(0), + ], + q(che) => [ + q(0216), + q(0), + ], + q(chl) => [ + q(0045), + q(0), + ], + q(chn) => [ + q(0046), + q(0), + ], + q(civ) => [ + q(0055), + q(0), + ], + q(cmr) => [ + q(0040), + q(0), + ], + q(cod) => [ + q(0051), + q(0), + ], + q(cog) => [ + q(0052), + q(0), + ], + q(cok) => [ + q(0053), + q(0), + ], + q(col) => [ + q(0049), + q(0), + ], + q(com) => [ + q(0050), + q(0), + ], + q(cpv) => [ + q(0038), + q(0), + ], + q(cri) => [ + q(0054), + q(0), + ], + q(cub) => [ + q(0057), + q(0), + ], + q(cuw) => [ + q(0058), + q(0), + ], + q(cxr) => [ + q(0047), + q(0), + ], + q(cym) => [ + q(0042), + q(0), + ], + q(cyp) => [ + q(0059), + q(0), + ], + q(cze) => [ + q(0060), + q(0), + ], + q(deu) => [ + q(0083), + q(0), + ], + q(dji) => [ + q(0062), + q(0), + ], + q(dma) => [ + q(0063), + q(0), + ], + q(dnk) => [ + q(0061), + q(0), + ], + q(dom) => [ + q(0064), + q(0), + ], + q(dza) => [ + q(0004), + q(0), + ], + q(ecu) => [ + q(0065), + q(0), + ], + q(egy) => [ + q(0066), + q(0), + ], + q(eri) => [ + q(0069), + q(0), + ], + q(esh) => [ + q(0246), + q(0), + ], + q(esp) => [ + q(0209), + q(0), + ], + q(est) => [ + q(0070), + q(0), + ], + q(eth) => [ + q(0071), + q(0), + ], + q(fin) => [ + q(0075), + q(0), + ], + q(fji) => [ + q(0074), + q(0), + ], + q(flk) => [ + q(0072), + q(0), + ], + q(fra) => [ + q(0076), + q(0), + ], + q(fro) => [ + q(0073), + q(0), + ], + q(fsm) => [ + q(0145), + q(0), + ], + q(gab) => [ + q(0080), + q(0), + ], + q(gbr) => [ + q(0235), + q(0), + ], + q(geo) => [ + q(0082), + q(0), + ], + q(ggy) => [ + q(0092), + q(0), + ], + q(gha) => [ + q(0084), + q(0), + ], + q(gib) => [ + q(0085), + q(0), + ], + q(gin) => [ + q(0093), + q(0), + ], + q(glp) => [ + q(0089), + q(0), + ], + q(gmb) => [ + q(0081), + q(0), + ], + q(gnb) => [ + q(0094), + q(0), + ], + q(gnq) => [ + q(0068), + q(0), + ], + q(grc) => [ + q(0086), + q(0), + ], + q(grd) => [ + q(0088), + q(0), + ], + q(grl) => [ + q(0087), + q(0), + ], + q(gtm) => [ + q(0091), + q(0), + ], + q(guf) => [ + q(0077), + q(0), + ], + q(gum) => [ + q(0090), + q(0), + ], + q(guy) => [ + q(0095), + q(0), + ], + q(hkg) => [ + q(0100), + q(0), + ], + q(hmd) => [ + q(0097), + q(0), + ], + q(hnd) => [ + q(0099), + q(0), + ], + q(hrv) => [ + q(0056), + q(0), + ], + q(hti) => [ + q(0096), + q(0), + ], + q(hun) => [ + q(0101), + q(0), + ], + q(idn) => [ + q(0104), + q(0), + ], + q(imn) => [ + q(0108), + q(0), + ], + q(ind) => [ + q(0103), + q(0), + ], + q(iot) => [ + q(0033), + q(0), + ], + q(irl) => [ + q(0107), + q(0), + ], + q(irn) => [ + q(0105), + q(0), + ], + q(irq) => [ + q(0106), + q(0), + ], + q(isl) => [ + q(0102), + q(0), + ], + q(isr) => [ + q(0109), + q(0), + ], + q(ita) => [ + q(0110), + q(0), + ], + q(jam) => [ + q(0111), + q(0), + ], + q(jey) => [ + q(0113), + q(0), + ], + q(jor) => [ + q(0114), + q(0), + ], + q(jpn) => [ + q(0112), + q(0), + ], + q(kaz) => [ + q(0115), + q(0), + ], + q(ken) => [ + q(0116), + q(0), + ], + q(kgz) => [ + q(0121), + q(0), + ], + q(khm) => [ + q(0039), + q(0), + ], + q(kir) => [ + q(0117), + q(0), + ], + q(kna) => [ + q(0187), + q(0), + ], + q(kor) => [ + q(0119), + q(0), + ], + q(kwt) => [ + q(0120), + q(0), + ], + q(lao) => [ + q(0122), + q(0), + ], + q(lbn) => [ + q(0124), + q(0), + ], + q(lbr) => [ + q(0126), + q(0), + ], + q(lby) => [ + q(0127), + q(0), + ], + q(lca) => [ + q(0188), + q(0), + ], + q(lie) => [ + q(0128), + q(0), + ], + q(lka) => [ + q(0210), + q(0), + ], + q(lso) => [ + q(0125), + q(0), + ], + q(ltu) => [ + q(0129), + q(0), + ], + q(lux) => [ + q(0130), + q(0), + ], + q(lva) => [ + q(0123), + q(0), + ], + q(mac) => [ + q(0131), + q(0), + ], + q(maf) => [ + q(0189), + q(0), + ], + q(mar) => [ + q(0151), + q(0), + ], + q(mco) => [ + q(0147), + q(0), + ], + q(mda) => [ + q(0146), + q(0), + ], + q(mdg) => [ + q(0133), + q(0), + ], + q(mdv) => [ + q(0136), + q(0), + ], + q(mex) => [ + q(0144), + q(0), + ], + q(mhl) => [ + q(0139), + q(0), + ], + q(mkd) => [ + q(0132), + q(0), + ], + q(mli) => [ + q(0137), + q(0), + ], + q(mlt) => [ + q(0138), + q(0), + ], + q(mmr) => [ + q(0153), + q(0), + ], + q(mne) => [ + q(0149), + q(0), + ], + q(mng) => [ + q(0148), + q(0), + ], + q(mnp) => [ + q(0165), + q(0), + ], + q(moz) => [ + q(0152), + q(0), + ], + q(mrt) => [ + q(0141), + q(0), + ], + q(msr) => [ + q(0150), + q(0), + ], + q(mtq) => [ + q(0140), + q(0), + ], + q(mus) => [ + q(0142), + q(0), + ], + q(mwi) => [ + q(0134), + q(0), + ], + q(mys) => [ + q(0135), + q(0), + ], + q(myt) => [ + q(0143), + q(0), + ], + q(nam) => [ + q(0154), + q(0), + ], + q(ncl) => [ + q(0158), + q(0), + ], + q(ner) => [ + q(0161), + q(0), + ], + q(nfk) => [ + q(0164), + q(0), + ], + q(nga) => [ + q(0162), + q(0), + ], + q(nic) => [ + q(0160), + q(0), + ], + q(niu) => [ + q(0163), + q(0), + ], + q(nld) => [ + q(0157), + q(0), + ], + q(nor) => [ + q(0166), + q(0), + ], + q(npl) => [ + q(0156), + q(0), + ], + q(nru) => [ + q(0155), + q(0), + ], + q(nzl) => [ + q(0159), + q(0), + ], + q(omn) => [ + q(0167), + q(0), + ], + q(pak) => [ + q(0168), + q(0), + ], + q(pan) => [ + q(0171), + q(0), + ], + q(pcn) => [ + q(0176), + q(0), + ], + q(per) => [ + q(0174), + q(0), + ], + q(phl) => [ + q(0175), + q(0), + ], + q(plw) => [ + q(0169), + q(0), + ], + q(png) => [ + q(0172), + q(0), + ], + q(pol) => [ + q(0177), + q(0), + ], + q(pri) => [ + q(0179), + q(0), + ], + q(prk) => [ + q(0118), + q(0), + ], + q(prt) => [ + q(0178), + q(0), + ], + q(pry) => [ + q(0173), + q(0), + ], + q(pse) => [ + q(0170), + q(0), + ], + q(pyf) => [ + q(0078), + q(0), + ], + q(qat) => [ + q(0180), + q(0), + ], + q(reu) => [ + q(0181), + q(0), + ], + q(rou) => [ + q(0182), + q(0), + ], + q(rus) => [ + q(0183), + q(0), + ], + q(rwa) => [ + q(0184), + q(0), + ], + q(sau) => [ + q(0195), + q(0), + ], + q(sdn) => [ + q(0211), + q(0), + ], + q(sen) => [ + q(0196), + q(0), + ], + q(sgp) => [ + q(0200), + q(0), + ], + q(sgs) => [ + q(0207), + q(0), + ], + q(shn) => [ + q(0186), + q(0), + ], + q(sjm) => [ + q(0213), + q(0), + ], + q(slb) => [ + q(0204), + q(0), + ], + q(sle) => [ + q(0199), + q(0), + ], + q(slv) => [ + q(0067), + q(0), + ], + q(smr) => [ + q(0193), + q(0), + ], + q(som) => [ + q(0205), + q(0), + ], + q(spm) => [ + q(0190), + q(0), + ], + q(srb) => [ + q(0197), + q(0), + ], + q(ssd) => [ + q(0208), + q(0), + ], + q(stp) => [ + q(0194), + q(0), + ], + q(sur) => [ + q(0212), + q(0), + ], + q(svk) => [ + q(0202), + q(0), + ], + q(svn) => [ + q(0203), + q(0), + ], + q(swe) => [ + q(0215), + q(0), + ], + q(swz) => [ + q(0214), + q(0), + ], + q(sxm) => [ + q(0201), + q(0), + ], + q(syc) => [ + q(0198), + q(0), + ], + q(syr) => [ + q(0217), + q(0), + ], + q(tca) => [ + q(0230), + q(0), + ], + q(tcd) => [ + q(0044), + q(0), + ], + q(tgo) => [ + q(0223), + q(0), + ], + q(tha) => [ + q(0221), + q(0), + ], + q(tjk) => [ + q(0219), + q(0), + ], + q(tkl) => [ + q(0224), + q(0), + ], + q(tkm) => [ + q(0229), + q(0), + ], + q(tls) => [ + q(0222), + q(0), + ], + q(ton) => [ + q(0225), + q(0), + ], + q(tto) => [ + q(0226), + q(0), + ], + q(tun) => [ + q(0227), + q(0), + ], + q(tur) => [ + q(0228), + q(0), + ], + q(tuv) => [ + q(0231), + q(0), + ], + q(twn) => [ + q(0218), + q(0), + ], + q(tza) => [ + q(0220), + q(0), + ], + q(uga) => [ + q(0232), + q(0), + ], + q(ukr) => [ + q(0233), + q(0), + ], + q(umi) => [ + q(0236), + q(0), + ], + q(ury) => [ + q(0238), + q(0), + ], + q(usa) => [ + q(0237), + q(0), + ], + q(uzb) => [ + q(0239), + q(0), + ], + q(vat) => [ + q(0098), + q(0), + ], + q(vct) => [ + q(0191), + q(0), + ], + q(ven) => [ + q(0241), + q(0), + ], + q(vgb) => [ + q(0243), + q(0), + ], + q(vir) => [ + q(0244), + q(0), + ], + q(vnm) => [ + q(0242), + q(0), + ], + q(vut) => [ + q(0240), + q(0), + ], + q(wlf) => [ + q(0245), + q(0), + ], + q(wsm) => [ + q(0192), + q(0), + ], + q(yem) => [ + q(0247), + q(0), + ], + q(zaf) => [ + q(0206), + q(0), + ], + q(zmb) => [ + q(0248), + q(0), + ], + q(zwe) => [ + q(0249), + q(0), + ], + }, + q(dom) => { + q(ad) => [ + q(0006), + q(0), + ], + q(ae) => [ + q(0234), + q(0), + ], + q(af) => [ + q(0001), + q(0), + ], + q(ag) => [ + q(0010), + q(0), + ], + q(ai) => [ + q(0008), + q(0), + ], + q(al) => [ + q(0003), + q(0), + ], + q(am) => [ + q(0012), + q(0), + ], + q(ao) => [ + q(0007), + q(0), + ], + q(aq) => [ + q(0009), + q(0), + ], + q(ar) => [ + q(0011), + q(0), + ], + q(as) => [ + q(0005), + q(0), + ], + q(at) => [ + q(0015), + q(0), + ], + q(au) => [ + q(0014), + q(0), + ], + q(aw) => [ + q(0013), + q(0), + ], + q(ax) => [ + q(0002), + q(0), + ], + q(az) => [ + q(0016), + q(0), + ], + q(ba) => [ + q(0029), + q(0), + ], + q(bb) => [ + q(0020), + q(0), + ], + q(bd) => [ + q(0019), + q(0), + ], + q(be) => [ + q(0022), + q(0), + ], + q(bf) => [ + q(0036), + q(0), + ], + q(bg) => [ + q(0035), + q(0), + ], + q(bh) => [ + q(0018), + q(0), + ], + q(bi) => [ + q(0037), + q(0), + ], + q(bj) => [ + q(0024), + q(0), + ], + q(bl) => [ + q(0185), + q(0), + ], + q(bm) => [ + q(0025), + q(0), + ], + q(bn) => [ + q(0034), + q(0), + ], + q(bo) => [ + q(0027), + q(0), + ], + q(bq) => [ + q(0028), + q(0), + ], + q(br) => [ + q(0032), + q(0), + ], + q(bs) => [ + q(0017), + q(0), + ], + q(bt) => [ + q(0026), + q(0), + ], + q(bv) => [ + q(0031), + q(0), + ], + q(bw) => [ + q(0030), + q(0), + ], + q(by) => [ + q(0021), + q(0), + ], + q(bz) => [ + q(0023), + q(0), + ], + q(ca) => [ + q(0041), + q(0), + ], + q(cc) => [ + q(0048), + q(0), + ], + q(cd) => [ + q(0051), + q(0), + ], + q(cf) => [ + q(0043), + q(0), + ], + q(cg) => [ + q(0052), + q(0), + ], + q(ch) => [ + q(0216), + q(0), + ], + q(ci) => [ + q(0055), + q(0), + ], + q(ck) => [ + q(0053), + q(0), + ], + q(cl) => [ + q(0045), + q(0), + ], + q(cm) => [ + q(0040), + q(0), + ], + q(cn) => [ + q(0046), + q(0), + ], + q(co) => [ + q(0049), + q(0), + ], + q(cr) => [ + q(0054), + q(0), + ], + q(cu) => [ + q(0057), + q(0), + ], + q(cv) => [ + q(0038), + q(0), + ], + q(cw) => [ + q(0058), + q(0), + ], + q(cx) => [ + q(0047), + q(0), + ], + q(cy) => [ + q(0059), + q(0), + ], + q(cz) => [ + q(0060), + q(0), + ], + q(de) => [ + q(0083), + q(0), + ], + q(dj) => [ + q(0062), + q(0), + ], + q(dk) => [ + q(0061), + q(0), + ], + q(dm) => [ + q(0063), + q(0), + ], + q(do) => [ + q(0064), + q(0), + ], + q(dz) => [ + q(0004), + q(0), + ], + q(ec) => [ + q(0065), + q(0), + ], + q(ee) => [ + q(0070), + q(0), + ], + q(eg) => [ + q(0066), + q(0), + ], + q(eh) => [ + q(0246), + q(0), + ], + q(er) => [ + q(0069), + q(0), + ], + q(es) => [ + q(0209), + q(0), + ], + q(et) => [ + q(0071), + q(0), + ], + q(fi) => [ + q(0075), + q(0), + ], + q(fj) => [ + q(0074), + q(0), + ], + q(fk) => [ + q(0072), + q(0), + ], + q(fm) => [ + q(0145), + q(0), + ], + q(fo) => [ + q(0073), + q(0), + ], + q(fr) => [ + q(0076), + q(0), + ], + q(ga) => [ + q(0080), + q(0), + ], + q(gb) => [ + q(0235), + q(0), + ], + q(gd) => [ + q(0088), + q(0), + ], + q(ge) => [ + q(0082), + q(0), + ], + q(gf) => [ + q(0077), + q(0), + ], + q(gg) => [ + q(0092), + q(0), + ], + q(gh) => [ + q(0084), + q(0), + ], + q(gi) => [ + q(0085), + q(0), + ], + q(gl) => [ + q(0087), + q(0), + ], + q(gm) => [ + q(0081), + q(0), + ], + q(gn) => [ + q(0093), + q(0), + ], + q(gp) => [ + q(0089), + q(0), + ], + q(gq) => [ + q(0068), + q(0), + ], + q(gr) => [ + q(0086), + q(0), + ], + q(gs) => [ + q(0207), + q(0), + ], + q(gt) => [ + q(0091), + q(0), + ], + q(gu) => [ + q(0090), + q(0), + ], + q(gw) => [ + q(0094), + q(0), + ], + q(gy) => [ + q(0095), + q(0), + ], + q(hk) => [ + q(0100), + q(0), + ], + q(hm) => [ + q(0097), + q(0), + ], + q(hn) => [ + q(0099), + q(0), + ], + q(hr) => [ + q(0056), + q(0), + ], + q(ht) => [ + q(0096), + q(0), + ], + q(hu) => [ + q(0101), + q(0), + ], + q(id) => [ + q(0104), + q(0), + ], + q(ie) => [ + q(0107), + q(0), + ], + q(il) => [ + q(0109), + q(0), + ], + q(im) => [ + q(0108), + q(0), + ], + q(in) => [ + q(0103), + q(0), + ], + q(io) => [ + q(0033), + q(0), + ], + q(iq) => [ + q(0106), + q(0), + ], + q(ir) => [ + q(0105), + q(0), + ], + q(is) => [ + q(0102), + q(0), + ], + q(it) => [ + q(0110), + q(0), + ], + q(je) => [ + q(0113), + q(0), + ], + q(jm) => [ + q(0111), + q(0), + ], + q(jo) => [ + q(0114), + q(0), + ], + q(jp) => [ + q(0112), + q(0), + ], + q(ke) => [ + q(0116), + q(0), + ], + q(kg) => [ + q(0121), + q(0), + ], + q(kh) => [ + q(0039), + q(0), + ], + q(ki) => [ + q(0117), + q(0), + ], + q(km) => [ + q(0050), + q(0), + ], + q(kn) => [ + q(0187), + q(0), + ], + q(kp) => [ + q(0118), + q(0), + ], + q(kr) => [ + q(0119), + q(0), + ], + q(kw) => [ + q(0120), + q(0), + ], + q(ky) => [ + q(0042), + q(0), + ], + q(kz) => [ + q(0115), + q(0), + ], + q(la) => [ + q(0122), + q(0), + ], + q(lb) => [ + q(0124), + q(0), + ], + q(lc) => [ + q(0188), + q(0), + ], + q(li) => [ + q(0128), + q(0), + ], + q(lk) => [ + q(0210), + q(0), + ], + q(lr) => [ + q(0126), + q(0), + ], + q(ls) => [ + q(0125), + q(0), + ], + q(lt) => [ + q(0129), + q(0), + ], + q(lu) => [ + q(0130), + q(0), + ], + q(lv) => [ + q(0123), + q(0), + ], + q(ly) => [ + q(0127), + q(0), + ], + q(ma) => [ + q(0151), + q(0), + ], + q(mc) => [ + q(0147), + q(0), + ], + q(md) => [ + q(0146), + q(0), + ], + q(me) => [ + q(0149), + q(0), + ], + q(mf) => [ + q(0189), + q(0), + ], + q(mg) => [ + q(0133), + q(0), + ], + q(mh) => [ + q(0139), + q(0), + ], + q(mk) => [ + q(0132), + q(0), + ], + q(ml) => [ + q(0137), + q(0), + ], + q(mm) => [ + q(0153), + q(0), + ], + q(mn) => [ + q(0148), + q(0), + ], + q(mo) => [ + q(0131), + q(0), + ], + q(mp) => [ + q(0165), + q(0), + ], + q(mq) => [ + q(0140), + q(0), + ], + q(mr) => [ + q(0141), + q(0), + ], + q(ms) => [ + q(0150), + q(0), + ], + q(mt) => [ + q(0138), + q(0), + ], + q(mu) => [ + q(0142), + q(0), + ], + q(mv) => [ + q(0136), + q(0), + ], + q(mw) => [ + q(0134), + q(0), + ], + q(mx) => [ + q(0144), + q(0), + ], + q(my) => [ + q(0135), + q(0), + ], + q(mz) => [ + q(0152), + q(0), + ], + q(na) => [ + q(0154), + q(0), + ], + q(nc) => [ + q(0158), + q(0), + ], + q(ne) => [ + q(0161), + q(0), + ], + q(nf) => [ + q(0164), + q(0), + ], + q(ng) => [ + q(0162), + q(0), + ], + q(ni) => [ + q(0160), + q(0), + ], + q(nl) => [ + q(0157), + q(0), + ], + q(no) => [ + q(0166), + q(0), + ], + q(np) => [ + q(0156), + q(0), + ], + q(nr) => [ + q(0155), + q(0), + ], + q(nu) => [ + q(0163), + q(0), + ], + q(nz) => [ + q(0159), + q(0), + ], + q(om) => [ + q(0167), + q(0), + ], + q(pa) => [ + q(0171), + q(0), + ], + q(pe) => [ + q(0174), + q(0), + ], + q(pf) => [ + q(0078), + q(0), + ], + q(pg) => [ + q(0172), + q(0), + ], + q(ph) => [ + q(0175), + q(0), + ], + q(pk) => [ + q(0168), + q(0), + ], + q(pl) => [ + q(0177), + q(0), + ], + q(pm) => [ + q(0190), + q(0), + ], + q(pn) => [ + q(0176), + q(0), + ], + q(pr) => [ + q(0179), + q(0), + ], + q(ps) => [ + q(0170), + q(0), + ], + q(pt) => [ + q(0178), + q(0), + ], + q(pw) => [ + q(0169), + q(0), + ], + q(py) => [ + q(0173), + q(0), + ], + q(qa) => [ + q(0180), + q(0), + ], + q(re) => [ + q(0181), + q(0), + ], + q(ro) => [ + q(0182), + q(0), + ], + q(rs) => [ + q(0197), + q(0), + ], + q(ru) => [ + q(0183), + q(0), + ], + q(rw) => [ + q(0184), + q(0), + ], + q(sa) => [ + q(0195), + q(0), + ], + q(sb) => [ + q(0204), + q(0), + ], + q(sc) => [ + q(0198), + q(0), + ], + q(sd) => [ + q(0211), + q(0), + ], + q(se) => [ + q(0215), + q(0), + ], + q(sg) => [ + q(0200), + q(0), + ], + q(sh) => [ + q(0186), + q(0), + ], + q(si) => [ + q(0203), + q(0), + ], + q(sj) => [ + q(0213), + q(0), + ], + q(sk) => [ + q(0202), + q(0), + ], + q(sl) => [ + q(0199), + q(0), + ], + q(sm) => [ + q(0193), + q(0), + ], + q(sn) => [ + q(0196), + q(0), + ], + q(so) => [ + q(0205), + q(0), + ], + q(sr) => [ + q(0212), + q(0), + ], + q(ss) => [ + q(0208), + q(0), + ], + q(st) => [ + q(0194), + q(0), + ], + q(sv) => [ + q(0067), + q(0), + ], + q(sx) => [ + q(0201), + q(0), + ], + q(sy) => [ + q(0217), + q(0), + ], + q(sz) => [ + q(0214), + q(0), + ], + q(tc) => [ + q(0230), + q(0), + ], + q(td) => [ + q(0044), + q(0), + ], + q(tf) => [ + q(0079), + q(0), + ], + q(tg) => [ + q(0223), + q(0), + ], + q(th) => [ + q(0221), + q(0), + ], + q(tj) => [ + q(0219), + q(0), + ], + q(tk) => [ + q(0224), + q(0), + ], + q(tl) => [ + q(0222), + q(0), + ], + q(tm) => [ + q(0229), + q(0), + ], + q(tn) => [ + q(0227), + q(0), + ], + q(to) => [ + q(0225), + q(0), + ], + q(tr) => [ + q(0228), + q(0), + ], + q(tt) => [ + q(0226), + q(0), + ], + q(tv) => [ + q(0231), + q(0), + ], + q(tw) => [ + q(0218), + q(0), + ], + q(tz) => [ + q(0220), + q(0), + ], + q(ua) => [ + q(0233), + q(0), + ], + q(ug) => [ + q(0232), + q(0), + ], + q(um) => [ + q(0236), + q(0), + ], + q(us) => [ + q(0237), + q(0), + ], + q(uy) => [ + q(0238), + q(0), + ], + q(uz) => [ + q(0239), + q(0), + ], + q(va) => [ + q(0098), + q(0), + ], + q(vc) => [ + q(0191), + q(0), + ], + q(ve) => [ + q(0241), + q(0), + ], + q(vg) => [ + q(0243), + q(0), + ], + q(vi) => [ + q(0244), + q(0), + ], + q(vn) => [ + q(0242), + q(0), + ], + q(vu) => [ + q(0240), + q(0), + ], + q(wf) => [ + q(0245), + q(0), + ], + q(ws) => [ + q(0192), + q(0), + ], + q(ye) => [ + q(0247), + q(0), + ], + q(yt) => [ + q(0143), + q(0), + ], + q(za) => [ + q(0206), + q(0), + ], + q(zm) => [ + q(0248), + q(0), + ], + q(zw) => [ + q(0249), + q(0), + ], + }, + q(genc-alpha-2) => { + q(A1) => [ + q(0277), + q(0), + ], + q(A2) => [ + q(0262), + q(0), + ], + q(AD) => [ + q(0006), + q(0), + ], + q(AE) => [ + q(0234), + q(0), + ], + q(AF) => [ + q(0001), + q(0), + ], + q(AG) => [ + q(0010), + q(0), + ], + q(AI) => [ + q(0008), + q(0), + ], + q(AL) => [ + q(0003), + q(0), + ], + q(AM) => [ + q(0012), + q(0), + ], + q(AO) => [ + q(0007), + q(0), + ], + q(AQ) => [ + q(0009), + q(0), + ], + q(AR) => [ + q(0011), + q(0), + ], + q(AS) => [ + q(0005), + q(0), + ], + q(AT) => [ + q(0015), + q(0), + ], + q(AU) => [ + q(0014), + q(0), + ], + q(AW) => [ + q(0013), + q(0), + ], + q(AZ) => [ + q(0016), + q(0), + ], + q(BA) => [ + q(0029), + q(0), + ], + q(BB) => [ + q(0020), + q(0), + ], + q(BD) => [ + q(0019), + q(0), + ], + q(BE) => [ + q(0022), + q(0), + ], + q(BF) => [ + q(0036), + q(0), + ], + q(BG) => [ + q(0035), + q(0), + ], + q(BH) => [ + q(0018), + q(0), + ], + q(BI) => [ + q(0037), + q(0), + ], + q(BJ) => [ + q(0024), + q(0), + ], + q(BL) => [ + q(0185), + q(0), + ], + q(BM) => [ + q(0025), + q(0), + ], + q(BN) => [ + q(0034), + q(0), + ], + q(BO) => [ + q(0027), + q(0), + ], + q(BQ) => [ + q(0028), + q(1), + ], + q(BR) => [ + q(0032), + q(0), + ], + q(BS) => [ + q(0017), + q(0), + ], + q(BT) => [ + q(0026), + q(0), + ], + q(BV) => [ + q(0031), + q(0), + ], + q(BW) => [ + q(0030), + q(0), + ], + q(BY) => [ + q(0021), + q(0), + ], + q(BZ) => [ + q(0023), + q(0), + ], + q(CA) => [ + q(0041), + q(0), + ], + q(CC) => [ + q(0048), + q(0), + ], + q(CD) => [ + q(0051), + q(0), + ], + q(CF) => [ + q(0043), + q(0), + ], + q(CG) => [ + q(0052), + q(0), + ], + q(CH) => [ + q(0216), + q(0), + ], + q(CI) => [ + q(0055), + q(0), + ], + q(CK) => [ + q(0053), + q(0), + ], + q(CL) => [ + q(0045), + q(0), + ], + q(CM) => [ + q(0040), + q(0), + ], + q(CN) => [ + q(0046), + q(0), + ], + q(CO) => [ + q(0049), + q(0), + ], + q(CP) => [ + q(0255), + q(0), + ], + q(CR) => [ + q(0054), + q(0), + ], + q(CU) => [ + q(0057), + q(0), + ], + q(CV) => [ + q(0038), + q(0), + ], + q(CW) => [ + q(0058), + q(0), + ], + q(CX) => [ + q(0047), + q(0), + ], + q(CY) => [ + q(0059), + q(0), + ], + q(CZ) => [ + q(0060), + q(0), + ], + q(DE) => [ + q(0083), + q(0), + ], + q(DG) => [ + q(0258), + q(0), + ], + q(DJ) => [ + q(0062), + q(0), + ], + q(DK) => [ + q(0061), + q(0), + ], + q(DM) => [ + q(0063), + q(0), + ], + q(DO) => [ + q(0064), + q(0), + ], + q(DZ) => [ + q(0004), + q(0), + ], + q(EC) => [ + q(0065), + q(0), + ], + q(EE) => [ + q(0070), + q(0), + ], + q(EG) => [ + q(0066), + q(0), + ], + q(EH) => [ + q(0246), + q(0), + ], + q(ER) => [ + q(0069), + q(0), + ], + q(ES) => [ + q(0209), + q(0), + ], + q(ET) => [ + q(0071), + q(0), + ], + q(FI) => [ + q(0075), + q(0), + ], + q(FJ) => [ + q(0074), + q(0), + ], + q(FK) => [ + q(0072), + q(0), + ], + q(FM) => [ + q(0145), + q(0), + ], + q(FO) => [ + q(0073), + q(0), + ], + q(FR) => [ + q(0076), + q(0), + ], + q(GA) => [ + q(0080), + q(0), + ], + q(GB) => [ + q(0235), + q(0), + ], + q(GD) => [ + q(0088), + q(0), + ], + q(GE) => [ + q(0082), + q(0), + ], + q(GF) => [ + q(0077), + q(0), + ], + q(GG) => [ + q(0092), + q(0), + ], + q(GH) => [ + q(0084), + q(0), + ], + q(GI) => [ + q(0085), + q(0), + ], + q(GL) => [ + q(0087), + q(0), + ], + q(GM) => [ + q(0081), + q(0), + ], + q(GN) => [ + q(0093), + q(0), + ], + q(GP) => [ + q(0089), + q(0), + ], + q(GQ) => [ + q(0068), + q(0), + ], + q(GR) => [ + q(0086), + q(0), + ], + q(GS) => [ + q(0207), + q(2), + ], + q(GT) => [ + q(0091), + q(0), + ], + q(GU) => [ + q(0090), + q(0), + ], + q(GW) => [ + q(0094), + q(0), + ], + q(GY) => [ + q(0095), + q(0), + ], + q(HK) => [ + q(0100), + q(0), + ], + q(HM) => [ + q(0097), + q(0), + ], + q(HN) => [ + q(0099), + q(0), + ], + q(HR) => [ + q(0056), + q(0), + ], + q(HT) => [ + q(0096), + q(0), + ], + q(HU) => [ + q(0101), + q(0), + ], + q(ID) => [ + q(0104), + q(0), + ], + q(IE) => [ + q(0107), + q(0), + ], + q(IL) => [ + q(0109), + q(0), + ], + q(IM) => [ + q(0108), + q(0), + ], + q(IN) => [ + q(0103), + q(0), + ], + q(IO) => [ + q(0033), + q(0), + ], + q(IQ) => [ + q(0106), + q(0), + ], + q(IR) => [ + q(0105), + q(0), + ], + q(IS) => [ + q(0102), + q(0), + ], + q(IT) => [ + q(0110), + q(0), + ], + q(JE) => [ + q(0113), + q(0), + ], + q(JM) => [ + q(0111), + q(0), + ], + q(JO) => [ + q(0114), + q(0), + ], + q(JP) => [ + q(0112), + q(0), + ], + q(KE) => [ + q(0116), + q(0), + ], + q(KG) => [ + q(0121), + q(0), + ], + q(KH) => [ + q(0039), + q(0), + ], + q(KI) => [ + q(0117), + q(0), + ], + q(KM) => [ + q(0050), + q(0), + ], + q(KN) => [ + q(0187), + q(0), + ], + q(KP) => [ + q(0118), + q(7), + ], + q(KR) => [ + q(0119), + q(7), + ], + q(KW) => [ + q(0120), + q(0), + ], + q(KY) => [ + q(0042), + q(0), + ], + q(KZ) => [ + q(0115), + q(0), + ], + q(LA) => [ + q(0122), + q(4), + ], + q(LB) => [ + q(0124), + q(0), + ], + q(LC) => [ + q(0188), + q(0), + ], + q(LI) => [ + q(0128), + q(0), + ], + q(LK) => [ + q(0210), + q(0), + ], + q(LR) => [ + q(0126), + q(0), + ], + q(LS) => [ + q(0125), + q(0), + ], + q(LT) => [ + q(0129), + q(0), + ], + q(LU) => [ + q(0130), + q(0), + ], + q(LV) => [ + q(0123), + q(0), + ], + q(LY) => [ + q(0127), + q(0), + ], + q(MA) => [ + q(0151), + q(0), + ], + q(MC) => [ + q(0147), + q(0), + ], + q(MD) => [ + q(0146), + q(6), + ], + q(ME) => [ + q(0149), + q(0), + ], + q(MF) => [ + q(0189), + q(0), + ], + q(MG) => [ + q(0133), + q(0), + ], + q(MH) => [ + q(0139), + q(0), + ], + q(MK) => [ + q(0132), + q(0), + ], + q(ML) => [ + q(0137), + q(0), + ], + q(MM) => [ + q(0153), + q(0), + ], + q(MN) => [ + q(0148), + q(0), + ], + q(MO) => [ + q(0131), + q(0), + ], + q(MP) => [ + q(0165), + q(0), + ], + q(MQ) => [ + q(0140), + q(0), + ], + q(MR) => [ + q(0141), + q(0), + ], + q(MS) => [ + q(0150), + q(0), + ], + q(MT) => [ + q(0138), + q(0), + ], + q(MU) => [ + q(0142), + q(0), + ], + q(MV) => [ + q(0136), + q(0), + ], + q(MW) => [ + q(0134), + q(0), + ], + q(MX) => [ + q(0144), + q(0), + ], + q(MY) => [ + q(0135), + q(0), + ], + q(MZ) => [ + q(0152), + q(0), + ], + q(NA) => [ + q(0154), + q(0), + ], + q(NC) => [ + q(0158), + q(0), + ], + q(NE) => [ + q(0161), + q(0), + ], + q(NF) => [ + q(0164), + q(0), + ], + q(NG) => [ + q(0162), + q(0), + ], + q(NI) => [ + q(0160), + q(0), + ], + q(NL) => [ + q(0157), + q(0), + ], + q(NO) => [ + q(0166), + q(0), + ], + q(NP) => [ + q(0156), + q(0), + ], + q(NR) => [ + q(0155), + q(0), + ], + q(NU) => [ + q(0163), + q(0), + ], + q(NZ) => [ + q(0159), + q(0), + ], + q(OM) => [ + q(0167), + q(0), + ], + q(PA) => [ + q(0171), + q(0), + ], + q(PE) => [ + q(0174), + q(0), + ], + q(PF) => [ + q(0078), + q(0), + ], + q(PG) => [ + q(0172), + q(0), + ], + q(PH) => [ + q(0175), + q(0), + ], + q(PK) => [ + q(0168), + q(0), + ], + q(PL) => [ + q(0177), + q(0), + ], + q(PM) => [ + q(0190), + q(0), + ], + q(PN) => [ + q(0176), + q(0), + ], + q(PR) => [ + q(0179), + q(0), + ], + q(PT) => [ + q(0178), + q(0), + ], + q(PW) => [ + q(0169), + q(0), + ], + q(PY) => [ + q(0173), + q(0), + ], + q(QA) => [ + q(0180), + q(0), + ], + q(QM) => [ + q(0270), + q(0), + ], + q(QS) => [ + q(0254), + q(0), + ], + q(QU) => [ + q(0267), + q(0), + ], + q(QW) => [ + q(0278), + q(0), + ], + q(QX) => [ + q(0261), + q(0), + ], + q(QZ) => [ + q(0251), + q(0), + ], + q(RE) => [ + q(0181), + q(0), + ], + q(RO) => [ + q(0182), + q(0), + ], + q(RS) => [ + q(0197), + q(0), + ], + q(RU) => [ + q(0183), + q(4), + ], + q(RW) => [ + q(0184), + q(0), + ], + q(SA) => [ + q(0195), + q(0), + ], + q(SB) => [ + q(0204), + q(0), + ], + q(SC) => [ + q(0198), + q(0), + ], + q(SD) => [ + q(0211), + q(0), + ], + q(SE) => [ + q(0215), + q(0), + ], + q(SG) => [ + q(0200), + q(0), + ], + q(SH) => [ + q(0186), + q(2), + ], + q(SI) => [ + q(0203), + q(0), + ], + q(SK) => [ + q(0202), + q(0), + ], + q(SL) => [ + q(0199), + q(0), + ], + q(SM) => [ + q(0193), + q(0), + ], + q(SN) => [ + q(0196), + q(0), + ], + q(SO) => [ + q(0205), + q(0), + ], + q(SR) => [ + q(0212), + q(0), + ], + q(SS) => [ + q(0208), + q(0), + ], + q(ST) => [ + q(0194), + q(0), + ], + q(SV) => [ + q(0067), + q(0), + ], + q(SX) => [ + q(0201), + q(1), + ], + q(SY) => [ + q(0217), + q(0), + ], + q(SZ) => [ + q(0214), + q(0), + ], + q(TC) => [ + q(0230), + q(0), + ], + q(TD) => [ + q(0044), + q(0), + ], + q(TF) => [ + q(0079), + q(0), + ], + q(TG) => [ + q(0223), + q(0), + ], + q(TH) => [ + q(0221), + q(0), + ], + q(TJ) => [ + q(0219), + q(0), + ], + q(TK) => [ + q(0224), + q(0), + ], + q(TL) => [ + q(0222), + q(0), + ], + q(TM) => [ + q(0229), + q(0), + ], + q(TN) => [ + q(0227), + q(0), + ], + q(TO) => [ + q(0225), + q(0), + ], + q(TR) => [ + q(0228), + q(0), + ], + q(TT) => [ + q(0226), + q(0), + ], + q(TV) => [ + q(0231), + q(0), + ], + q(TW) => [ + q(0218), + q(0), + ], + q(TZ) => [ + q(0220), + q(3), + ], + q(UA) => [ + q(0233), + q(0), + ], + q(UG) => [ + q(0232), + q(0), + ], + q(US) => [ + q(0237), + q(0), + ], + q(UY) => [ + q(0238), + q(0), + ], + q(UZ) => [ + q(0239), + q(0), + ], + q(VA) => [ + q(0098), + q(0), + ], + q(VC) => [ + q(0191), + q(0), + ], + q(VE) => [ + q(0241), + q(0), + ], + q(VG) => [ + q(0243), + q(0), + ], + q(VI) => [ + q(0244), + q(0), + ], + q(VN) => [ + q(0242), + q(0), + ], + q(VU) => [ + q(0240), + q(0), + ], + q(WF) => [ + q(0245), + q(0), + ], + q(WS) => [ + q(0192), + q(0), + ], + q(XA) => [ + q(0252), + q(0), + ], + q(XB) => [ + q(0253), + q(0), + ], + q(XC) => [ + q(0256), + q(0), + ], + q(XD) => [ + q(0257), + q(0), + ], + q(XE) => [ + q(0259), + q(0), + ], + q(XG) => [ + q(0260), + q(0), + ], + q(XH) => [ + q(0263), + q(0), + ], + q(XJ) => [ + q(0264), + q(0), + ], + q(XK) => [ + q(0269), + q(0), + ], + q(XL) => [ + q(0272), + q(0), + ], + q(XM) => [ + q(0268), + q(0), + ], + q(XP) => [ + q(0273), + q(0), + ], + q(XQ) => [ + q(0265), + q(0), + ], + q(XR) => [ + q(0275), + q(0), + ], + q(XS) => [ + q(0274), + q(0), + ], + q(XT) => [ + q(0276), + q(0), + ], + q(XU) => [ + q(0266), + q(0), + ], + q(XV) => [ + q(0271), + q(0), + ], + q(XW) => [ + q(0279), + q(0), + ], + q(YE) => [ + q(0247), + q(0), + ], + q(YT) => [ + q(0143), + q(0), + ], + q(ZA) => [ + q(0206), + q(0), + ], + q(ZM) => [ + q(0248), + q(0), + ], + q(ZW) => [ + q(0249), + q(0), + ], + }, + q(genc-alpha-3) => { + q(ABW) => [ + q(0013), + q(0), + ], + q(AFG) => [ + q(0001), + q(0), + ], + q(AGO) => [ + q(0007), + q(0), + ], + q(AIA) => [ + q(0008), + q(0), + ], + q(ALB) => [ + q(0003), + q(0), + ], + q(AND) => [ + q(0006), + q(0), + ], + q(ARE) => [ + q(0234), + q(0), + ], + q(ARG) => [ + q(0011), + q(0), + ], + q(ARM) => [ + q(0012), + q(0), + ], + q(ASM) => [ + q(0005), + q(0), + ], + q(ATA) => [ + q(0009), + q(0), + ], + q(ATF) => [ + q(0079), + q(0), + ], + q(ATG) => [ + q(0010), + q(0), + ], + q(AUS) => [ + q(0014), + q(0), + ], + q(AUT) => [ + q(0015), + q(0), + ], + q(AX1) => [ + q(0277), + q(0), + ], + q(AX2) => [ + q(0262), + q(0), + ], + q(AZE) => [ + q(0016), + q(0), + ], + q(BDI) => [ + q(0037), + q(0), + ], + q(BEL) => [ + q(0022), + q(0), + ], + q(BEN) => [ + q(0024), + q(0), + ], + q(BES) => [ + q(0028), + q(1), + ], + q(BFA) => [ + q(0036), + q(0), + ], + q(BGD) => [ + q(0019), + q(0), + ], + q(BGR) => [ + q(0035), + q(0), + ], + q(BHR) => [ + q(0018), + q(0), + ], + q(BHS) => [ + q(0017), + q(0), + ], + q(BIH) => [ + q(0029), + q(0), + ], + q(BLM) => [ + q(0185), + q(0), + ], + q(BLR) => [ + q(0021), + q(0), + ], + q(BLZ) => [ + q(0023), + q(0), + ], + q(BMU) => [ + q(0025), + q(0), + ], + q(BOL) => [ + q(0027), + q(0), + ], + q(BRA) => [ + q(0032), + q(0), + ], + q(BRB) => [ + q(0020), + q(0), + ], + q(BRN) => [ + q(0034), + q(0), + ], + q(BTN) => [ + q(0026), + q(0), + ], + q(BVT) => [ + q(0031), + q(0), + ], + q(BWA) => [ + q(0030), + q(0), + ], + q(CAF) => [ + q(0043), + q(0), + ], + q(CAN) => [ + q(0041), + q(0), + ], + q(CCK) => [ + q(0048), + q(0), + ], + q(CHE) => [ + q(0216), + q(0), + ], + q(CHL) => [ + q(0045), + q(0), + ], + q(CHN) => [ + q(0046), + q(0), + ], + q(CIV) => [ + q(0055), + q(0), + ], + q(CMR) => [ + q(0040), + q(0), + ], + q(COD) => [ + q(0051), + q(0), + ], + q(COG) => [ + q(0052), + q(0), + ], + q(COK) => [ + q(0053), + q(0), + ], + q(COL) => [ + q(0049), + q(0), + ], + q(COM) => [ + q(0050), + q(0), + ], + q(CPT) => [ + q(0255), + q(0), + ], + q(CPV) => [ + q(0038), + q(0), + ], + q(CRI) => [ + q(0054), + q(0), + ], + q(CUB) => [ + q(0057), + q(0), + ], + q(CUW) => [ + q(0058), + q(0), + ], + q(CXR) => [ + q(0047), + q(0), + ], + q(CYM) => [ + q(0042), + q(0), + ], + q(CYP) => [ + q(0059), + q(0), + ], + q(CZE) => [ + q(0060), + q(0), + ], + q(DEU) => [ + q(0083), + q(0), + ], + q(DGA) => [ + q(0258), + q(0), + ], + q(DJI) => [ + q(0062), + q(0), + ], + q(DMA) => [ + q(0063), + q(0), + ], + q(DNK) => [ + q(0061), + q(0), + ], + q(DOM) => [ + q(0064), + q(0), + ], + q(DZA) => [ + q(0004), + q(0), + ], + q(ECU) => [ + q(0065), + q(0), + ], + q(EGY) => [ + q(0066), + q(0), + ], + q(ERI) => [ + q(0069), + q(0), + ], + q(ESH) => [ + q(0246), + q(0), + ], + q(ESP) => [ + q(0209), + q(0), + ], + q(EST) => [ + q(0070), + q(0), + ], + q(ETH) => [ + q(0071), + q(0), + ], + q(FIN) => [ + q(0075), + q(0), + ], + q(FJI) => [ + q(0074), + q(0), + ], + q(FLK) => [ + q(0072), + q(0), + ], + q(FRA) => [ + q(0076), + q(0), + ], + q(FRO) => [ + q(0073), + q(0), + ], + q(FSM) => [ + q(0145), + q(0), + ], + q(GAB) => [ + q(0080), + q(0), + ], + q(GBR) => [ + q(0235), + q(0), + ], + q(GEO) => [ + q(0082), + q(0), + ], + q(GGY) => [ + q(0092), + q(0), + ], + q(GHA) => [ + q(0084), + q(0), + ], + q(GIB) => [ + q(0085), + q(0), + ], + q(GIN) => [ + q(0093), + q(0), + ], + q(GLP) => [ + q(0089), + q(0), + ], + q(GMB) => [ + q(0081), + q(0), + ], + q(GNB) => [ + q(0094), + q(0), + ], + q(GNQ) => [ + q(0068), + q(0), + ], + q(GRC) => [ + q(0086), + q(0), + ], + q(GRD) => [ + q(0088), + q(0), + ], + q(GRL) => [ + q(0087), + q(0), + ], + q(GTM) => [ + q(0091), + q(0), + ], + q(GUF) => [ + q(0077), + q(0), + ], + q(GUM) => [ + q(0090), + q(0), + ], + q(GUY) => [ + q(0095), + q(0), + ], + q(HKG) => [ + q(0100), + q(0), + ], + q(HMD) => [ + q(0097), + q(0), + ], + q(HND) => [ + q(0099), + q(0), + ], + q(HRV) => [ + q(0056), + q(0), + ], + q(HTI) => [ + q(0096), + q(0), + ], + q(HUN) => [ + q(0101), + q(0), + ], + q(IDN) => [ + q(0104), + q(0), + ], + q(IMN) => [ + q(0108), + q(0), + ], + q(IND) => [ + q(0103), + q(0), + ], + q(IOT) => [ + q(0033), + q(0), + ], + q(IRL) => [ + q(0107), + q(0), + ], + q(IRN) => [ + q(0105), + q(0), + ], + q(IRQ) => [ + q(0106), + q(0), + ], + q(ISL) => [ + q(0102), + q(0), + ], + q(ISR) => [ + q(0109), + q(0), + ], + q(ITA) => [ + q(0110), + q(0), + ], + q(JAM) => [ + q(0111), + q(0), + ], + q(JEY) => [ + q(0113), + q(0), + ], + q(JOR) => [ + q(0114), + q(0), + ], + q(JPN) => [ + q(0112), + q(0), + ], + q(KAZ) => [ + q(0115), + q(0), + ], + q(KEN) => [ + q(0116), + q(0), + ], + q(KGZ) => [ + q(0121), + q(0), + ], + q(KHM) => [ + q(0039), + q(0), + ], + q(KIR) => [ + q(0117), + q(0), + ], + q(KNA) => [ + q(0187), + q(0), + ], + q(KOR) => [ + q(0119), + q(7), + ], + q(KWT) => [ + q(0120), + q(0), + ], + q(LAO) => [ + q(0122), + q(4), + ], + q(LBN) => [ + q(0124), + q(0), + ], + q(LBR) => [ + q(0126), + q(0), + ], + q(LBY) => [ + q(0127), + q(0), + ], + q(LCA) => [ + q(0188), + q(0), + ], + q(LIE) => [ + q(0128), + q(0), + ], + q(LKA) => [ + q(0210), + q(0), + ], + q(LSO) => [ + q(0125), + q(0), + ], + q(LTU) => [ + q(0129), + q(0), + ], + q(LUX) => [ + q(0130), + q(0), + ], + q(LVA) => [ + q(0123), + q(0), + ], + q(MAC) => [ + q(0131), + q(0), + ], + q(MAF) => [ + q(0189), + q(0), + ], + q(MAR) => [ + q(0151), + q(0), + ], + q(MCO) => [ + q(0147), + q(0), + ], + q(MDA) => [ + q(0146), + q(6), + ], + q(MDG) => [ + q(0133), + q(0), + ], + q(MDV) => [ + q(0136), + q(0), + ], + q(MEX) => [ + q(0144), + q(0), + ], + q(MHL) => [ + q(0139), + q(0), + ], + q(MKD) => [ + q(0132), + q(0), + ], + q(MLI) => [ + q(0137), + q(0), + ], + q(MLT) => [ + q(0138), + q(0), + ], + q(MMR) => [ + q(0153), + q(0), + ], + q(MNE) => [ + q(0149), + q(0), + ], + q(MNG) => [ + q(0148), + q(0), + ], + q(MNP) => [ + q(0165), + q(0), + ], + q(MOZ) => [ + q(0152), + q(0), + ], + q(MRT) => [ + q(0141), + q(0), + ], + q(MSR) => [ + q(0150), + q(0), + ], + q(MTQ) => [ + q(0140), + q(0), + ], + q(MUS) => [ + q(0142), + q(0), + ], + q(MWI) => [ + q(0134), + q(0), + ], + q(MYS) => [ + q(0135), + q(0), + ], + q(MYT) => [ + q(0143), + q(0), + ], + q(NAM) => [ + q(0154), + q(0), + ], + q(NCL) => [ + q(0158), + q(0), + ], + q(NER) => [ + q(0161), + q(0), + ], + q(NFK) => [ + q(0164), + q(0), + ], + q(NGA) => [ + q(0162), + q(0), + ], + q(NIC) => [ + q(0160), + q(0), + ], + q(NIU) => [ + q(0163), + q(0), + ], + q(NLD) => [ + q(0157), + q(0), + ], + q(NOR) => [ + q(0166), + q(0), + ], + q(NPL) => [ + q(0156), + q(0), + ], + q(NRU) => [ + q(0155), + q(0), + ], + q(NZL) => [ + q(0159), + q(0), + ], + q(OMN) => [ + q(0167), + q(0), + ], + q(PAK) => [ + q(0168), + q(0), + ], + q(PAN) => [ + q(0171), + q(0), + ], + q(PCN) => [ + q(0176), + q(0), + ], + q(PER) => [ + q(0174), + q(0), + ], + q(PHL) => [ + q(0175), + q(0), + ], + q(PLW) => [ + q(0169), + q(0), + ], + q(PNG) => [ + q(0172), + q(0), + ], + q(POL) => [ + q(0177), + q(0), + ], + q(PRI) => [ + q(0179), + q(0), + ], + q(PRK) => [ + q(0118), + q(7), + ], + q(PRT) => [ + q(0178), + q(0), + ], + q(PRY) => [ + q(0173), + q(0), + ], + q(PYF) => [ + q(0078), + q(0), + ], + q(QAT) => [ + q(0180), + q(0), + ], + q(REU) => [ + q(0181), + q(0), + ], + q(ROU) => [ + q(0182), + q(0), + ], + q(RUS) => [ + q(0183), + q(4), + ], + q(RWA) => [ + q(0184), + q(0), + ], + q(SAU) => [ + q(0195), + q(0), + ], + q(SDN) => [ + q(0211), + q(0), + ], + q(SEN) => [ + q(0196), + q(0), + ], + q(SGP) => [ + q(0200), + q(0), + ], + q(SGS) => [ + q(0207), + q(2), + ], + q(SHN) => [ + q(0186), + q(2), + ], + q(SLB) => [ + q(0204), + q(0), + ], + q(SLE) => [ + q(0199), + q(0), + ], + q(SLV) => [ + q(0067), + q(0), + ], + q(SMR) => [ + q(0193), + q(0), + ], + q(SOM) => [ + q(0205), + q(0), + ], + q(SPM) => [ + q(0190), + q(0), + ], + q(SRB) => [ + q(0197), + q(0), + ], + q(SSD) => [ + q(0208), + q(0), + ], + q(STP) => [ + q(0194), + q(0), + ], + q(SUR) => [ + q(0212), + q(0), + ], + q(SVK) => [ + q(0202), + q(0), + ], + q(SVN) => [ + q(0203), + q(0), + ], + q(SWE) => [ + q(0215), + q(0), + ], + q(SWZ) => [ + q(0214), + q(0), + ], + q(SXM) => [ + q(0201), + q(1), + ], + q(SYC) => [ + q(0198), + q(0), + ], + q(SYR) => [ + q(0217), + q(0), + ], + q(TCA) => [ + q(0230), + q(0), + ], + q(TCD) => [ + q(0044), + q(0), + ], + q(TGO) => [ + q(0223), + q(0), + ], + q(THA) => [ + q(0221), + q(0), + ], + q(TJK) => [ + q(0219), + q(0), + ], + q(TKL) => [ + q(0224), + q(0), + ], + q(TKM) => [ + q(0229), + q(0), + ], + q(TLS) => [ + q(0222), + q(0), + ], + q(TON) => [ + q(0225), + q(0), + ], + q(TTO) => [ + q(0226), + q(0), + ], + q(TUN) => [ + q(0227), + q(0), + ], + q(TUR) => [ + q(0228), + q(0), + ], + q(TUV) => [ + q(0231), + q(0), + ], + q(TWN) => [ + q(0218), + q(0), + ], + q(TZA) => [ + q(0220), + q(3), + ], + q(UGA) => [ + q(0232), + q(0), + ], + q(UKR) => [ + q(0233), + q(0), + ], + q(URY) => [ + q(0238), + q(0), + ], + q(USA) => [ + q(0237), + q(0), + ], + q(UZB) => [ + q(0239), + q(0), + ], + q(VAT) => [ + q(0098), + q(0), + ], + q(VCT) => [ + q(0191), + q(0), + ], + q(VEN) => [ + q(0241), + q(0), + ], + q(VGB) => [ + q(0243), + q(0), + ], + q(VIR) => [ + q(0244), + q(0), + ], + q(VNM) => [ + q(0242), + q(0), + ], + q(VUT) => [ + q(0240), + q(0), + ], + q(WLF) => [ + q(0245), + q(0), + ], + q(WSM) => [ + q(0192), + q(0), + ], + q(XAC) => [ + q(0252), + q(0), + ], + q(XBI) => [ + q(0254), + q(0), + ], + q(XBK) => [ + q(0253), + q(0), + ], + q(XCS) => [ + q(0256), + q(0), + ], + q(XEU) => [ + q(0259), + q(0), + ], + q(XGL) => [ + q(0261), + q(0), + ], + q(XGZ) => [ + q(0260), + q(0), + ], + q(XHO) => [ + q(0263), + q(0), + ], + q(XJA) => [ + q(0266), + q(0), + ], + q(XJM) => [ + q(0264), + q(0), + ], + q(XJN) => [ + q(0267), + q(0), + ], + q(XJV) => [ + q(0265), + q(0), + ], + q(XKR) => [ + q(0268), + q(0), + ], + q(XKS) => [ + q(0269), + q(0), + ], + q(XMW) => [ + q(0270), + q(0), + ], + q(XNV) => [ + q(0271), + q(0), + ], + q(XPL) => [ + q(0272), + q(0), + ], + q(XPR) => [ + q(0273), + q(0), + ], + q(XQZ) => [ + q(0251), + q(0), + ], + q(XSP) => [ + q(0274), + q(0), + ], + q(XSV) => [ + q(0275), + q(0), + ], + q(XTR) => [ + q(0276), + q(0), + ], + q(XWB) => [ + q(0279), + q(0), + ], + q(XWK) => [ + q(0278), + q(0), + ], + q(XXD) => [ + q(0257), + q(0), + ], + q(YEM) => [ + q(0247), + q(0), + ], + q(ZAF) => [ + q(0206), + q(0), + ], + q(ZMB) => [ + q(0248), + q(0), + ], + q(ZWE) => [ + q(0249), + q(0), + ], + }, + q(genc-numeric) => { + q(004) => [ + q(0001), + q(0), + ], + q(008) => [ + q(0003), + q(0), + ], + q(010) => [ + q(0009), + q(0), + ], + q(012) => [ + q(0004), + q(0), + ], + q(016) => [ + q(0005), + q(0), + ], + q(020) => [ + q(0006), + q(0), + ], + q(024) => [ + q(0007), + q(0), + ], + q(028) => [ + q(0010), + q(0), + ], + q(031) => [ + q(0016), + q(0), + ], + q(032) => [ + q(0011), + q(0), + ], + q(036) => [ + q(0014), + q(0), + ], + q(040) => [ + q(0015), + q(0), + ], + q(044) => [ + q(0017), + q(0), + ], + q(048) => [ + q(0018), + q(0), + ], + q(050) => [ + q(0019), + q(0), + ], + q(051) => [ + q(0012), + q(0), + ], + q(052) => [ + q(0020), + q(0), + ], + q(056) => [ + q(0022), + q(0), + ], + q(060) => [ + q(0025), + q(0), + ], + q(064) => [ + q(0026), + q(0), + ], + q(068) => [ + q(0027), + q(0), + ], + q(070) => [ + q(0029), + q(0), + ], + q(072) => [ + q(0030), + q(0), + ], + q(074) => [ + q(0031), + q(0), + ], + q(076) => [ + q(0032), + q(0), + ], + q(084) => [ + q(0023), + q(0), + ], + q(086) => [ + q(0033), + q(0), + ], + q(090) => [ + q(0204), + q(0), + ], + q(092) => [ + q(0243), + q(0), + ], + q(096) => [ + q(0034), + q(0), + ], + q(100) => [ + q(0035), + q(0), + ], + q(104) => [ + q(0153), + q(0), + ], + q(108) => [ + q(0037), + q(0), + ], + q(112) => [ + q(0021), + q(0), + ], + q(116) => [ + q(0039), + q(0), + ], + q(120) => [ + q(0040), + q(0), + ], + q(124) => [ + q(0041), + q(0), + ], + q(132) => [ + q(0038), + q(0), + ], + q(136) => [ + q(0042), + q(0), + ], + q(140) => [ + q(0043), + q(0), + ], + q(144) => [ + q(0210), + q(0), + ], + q(148) => [ + q(0044), + q(0), + ], + q(152) => [ + q(0045), + q(0), + ], + q(156) => [ + q(0046), + q(0), + ], + q(158) => [ + q(0218), + q(0), + ], + q(162) => [ + q(0047), + q(0), + ], + q(166) => [ + q(0048), + q(0), + ], + q(170) => [ + q(0049), + q(0), + ], + q(174) => [ + q(0050), + q(0), + ], + q(175) => [ + q(0143), + q(0), + ], + q(178) => [ + q(0052), + q(0), + ], + q(180) => [ + q(0051), + q(0), + ], + q(184) => [ + q(0053), + q(0), + ], + q(188) => [ + q(0054), + q(0), + ], + q(191) => [ + q(0056), + q(0), + ], + q(192) => [ + q(0057), + q(0), + ], + q(196) => [ + q(0059), + q(0), + ], + q(203) => [ + q(0060), + q(0), + ], + q(204) => [ + q(0024), + q(0), + ], + q(208) => [ + q(0061), + q(0), + ], + q(212) => [ + q(0063), + q(0), + ], + q(214) => [ + q(0064), + q(0), + ], + q(218) => [ + q(0065), + q(0), + ], + q(222) => [ + q(0067), + q(0), + ], + q(226) => [ + q(0068), + q(0), + ], + q(231) => [ + q(0071), + q(0), + ], + q(232) => [ + q(0069), + q(0), + ], + q(233) => [ + q(0070), + q(0), + ], + q(234) => [ + q(0073), + q(0), + ], + q(238) => [ + q(0072), + q(0), + ], + q(239) => [ + q(0207), + q(2), + ], + q(242) => [ + q(0074), + q(0), + ], + q(246) => [ + q(0075), + q(0), + ], + q(250) => [ + q(0076), + q(0), + ], + q(254) => [ + q(0077), + q(0), + ], + q(258) => [ + q(0078), + q(0), + ], + q(260) => [ + q(0079), + q(0), + ], + q(262) => [ + q(0062), + q(0), + ], + q(266) => [ + q(0080), + q(0), + ], + q(268) => [ + q(0082), + q(0), + ], + q(270) => [ + q(0081), + q(0), + ], + q(276) => [ + q(0083), + q(0), + ], + q(288) => [ + q(0084), + q(0), + ], + q(292) => [ + q(0085), + q(0), + ], + q(296) => [ + q(0117), + q(0), + ], + q(300) => [ + q(0086), + q(0), + ], + q(304) => [ + q(0087), + q(0), + ], + q(308) => [ + q(0088), + q(0), + ], + q(312) => [ + q(0089), + q(0), + ], + q(316) => [ + q(0090), + q(0), + ], + q(320) => [ + q(0091), + q(0), + ], + q(324) => [ + q(0093), + q(0), + ], + q(328) => [ + q(0095), + q(0), + ], + q(332) => [ + q(0096), + q(0), + ], + q(334) => [ + q(0097), + q(0), + ], + q(336) => [ + q(0098), + q(0), + ], + q(340) => [ + q(0099), + q(0), + ], + q(344) => [ + q(0100), + q(0), + ], + q(348) => [ + q(0101), + q(0), + ], + q(352) => [ + q(0102), + q(0), + ], + q(356) => [ + q(0103), + q(0), + ], + q(360) => [ + q(0104), + q(0), + ], + q(364) => [ + q(0105), + q(0), + ], + q(368) => [ + q(0106), + q(0), + ], + q(372) => [ + q(0107), + q(0), + ], + q(376) => [ + q(0109), + q(0), + ], + q(380) => [ + q(0110), + q(0), + ], + q(384) => [ + q(0055), + q(0), + ], + q(388) => [ + q(0111), + q(0), + ], + q(392) => [ + q(0112), + q(0), + ], + q(398) => [ + q(0115), + q(0), + ], + q(400) => [ + q(0114), + q(0), + ], + q(404) => [ + q(0116), + q(0), + ], + q(408) => [ + q(0118), + q(7), + ], + q(410) => [ + q(0119), + q(7), + ], + q(414) => [ + q(0120), + q(0), + ], + q(417) => [ + q(0121), + q(0), + ], + q(418) => [ + q(0122), + q(4), + ], + q(422) => [ + q(0124), + q(0), + ], + q(426) => [ + q(0125), + q(0), + ], + q(428) => [ + q(0123), + q(0), + ], + q(430) => [ + q(0126), + q(0), + ], + q(434) => [ + q(0127), + q(0), + ], + q(438) => [ + q(0128), + q(0), + ], + q(440) => [ + q(0129), + q(0), + ], + q(442) => [ + q(0130), + q(0), + ], + q(446) => [ + q(0131), + q(0), + ], + q(450) => [ + q(0133), + q(0), + ], + q(454) => [ + q(0134), + q(0), + ], + q(458) => [ + q(0135), + q(0), + ], + q(462) => [ + q(0136), + q(0), + ], + q(466) => [ + q(0137), + q(0), + ], + q(470) => [ + q(0138), + q(0), + ], + q(474) => [ + q(0140), + q(0), + ], + q(478) => [ + q(0141), + q(0), + ], + q(480) => [ + q(0142), + q(0), + ], + q(484) => [ + q(0144), + q(0), + ], + q(492) => [ + q(0147), + q(0), + ], + q(496) => [ + q(0148), + q(0), + ], + q(498) => [ + q(0146), + q(6), + ], + q(499) => [ + q(0149), + q(0), + ], + q(500) => [ + q(0150), + q(0), + ], + q(504) => [ + q(0151), + q(0), + ], + q(508) => [ + q(0152), + q(0), + ], + q(512) => [ + q(0167), + q(0), + ], + q(516) => [ + q(0154), + q(0), + ], + q(520) => [ + q(0155), + q(0), + ], + q(524) => [ + q(0156), + q(0), + ], + q(528) => [ + q(0157), + q(0), + ], + q(531) => [ + q(0058), + q(0), + ], + q(533) => [ + q(0013), + q(0), + ], + q(534) => [ + q(0201), + q(1), + ], + q(535) => [ + q(0028), + q(1), + ], + q(540) => [ + q(0158), + q(0), + ], + q(548) => [ + q(0240), + q(0), + ], + q(554) => [ + q(0159), + q(0), + ], + q(558) => [ + q(0160), + q(0), + ], + q(562) => [ + q(0161), + q(0), + ], + q(566) => [ + q(0162), + q(0), + ], + q(570) => [ + q(0163), + q(0), + ], + q(574) => [ + q(0164), + q(0), + ], + q(578) => [ + q(0166), + q(0), + ], + q(580) => [ + q(0165), + q(0), + ], + q(583) => [ + q(0145), + q(0), + ], + q(584) => [ + q(0139), + q(0), + ], + q(585) => [ + q(0169), + q(0), + ], + q(586) => [ + q(0168), + q(0), + ], + q(591) => [ + q(0171), + q(0), + ], + q(598) => [ + q(0172), + q(0), + ], + q(600) => [ + q(0173), + q(0), + ], + q(604) => [ + q(0174), + q(0), + ], + q(608) => [ + q(0175), + q(0), + ], + q(612) => [ + q(0176), + q(0), + ], + q(616) => [ + q(0177), + q(0), + ], + q(620) => [ + q(0178), + q(0), + ], + q(624) => [ + q(0094), + q(0), + ], + q(626) => [ + q(0222), + q(0), + ], + q(630) => [ + q(0179), + q(0), + ], + q(634) => [ + q(0180), + q(0), + ], + q(638) => [ + q(0181), + q(0), + ], + q(642) => [ + q(0182), + q(0), + ], + q(643) => [ + q(0183), + q(4), + ], + q(646) => [ + q(0184), + q(0), + ], + q(652) => [ + q(0185), + q(0), + ], + q(654) => [ + q(0186), + q(2), + ], + q(659) => [ + q(0187), + q(0), + ], + q(660) => [ + q(0008), + q(0), + ], + q(662) => [ + q(0188), + q(0), + ], + q(663) => [ + q(0189), + q(0), + ], + q(666) => [ + q(0190), + q(0), + ], + q(670) => [ + q(0191), + q(0), + ], + q(674) => [ + q(0193), + q(0), + ], + q(678) => [ + q(0194), + q(0), + ], + q(682) => [ + q(0195), + q(0), + ], + q(686) => [ + q(0196), + q(0), + ], + q(688) => [ + q(0197), + q(0), + ], + q(690) => [ + q(0198), + q(0), + ], + q(694) => [ + q(0199), + q(0), + ], + q(702) => [ + q(0200), + q(0), + ], + q(703) => [ + q(0202), + q(0), + ], + q(704) => [ + q(0242), + q(0), + ], + q(705) => [ + q(0203), + q(0), + ], + q(706) => [ + q(0205), + q(0), + ], + q(710) => [ + q(0206), + q(0), + ], + q(716) => [ + q(0249), + q(0), + ], + q(724) => [ + q(0209), + q(0), + ], + q(728) => [ + q(0208), + q(0), + ], + q(729) => [ + q(0211), + q(0), + ], + q(732) => [ + q(0246), + q(0), + ], + q(740) => [ + q(0212), + q(0), + ], + q(748) => [ + q(0214), + q(0), + ], + q(752) => [ + q(0215), + q(0), + ], + q(756) => [ + q(0216), + q(0), + ], + q(760) => [ + q(0217), + q(0), + ], + q(762) => [ + q(0219), + q(0), + ], + q(764) => [ + q(0221), + q(0), + ], + q(768) => [ + q(0223), + q(0), + ], + q(772) => [ + q(0224), + q(0), + ], + q(776) => [ + q(0225), + q(0), + ], + q(780) => [ + q(0226), + q(0), + ], + q(784) => [ + q(0234), + q(0), + ], + q(788) => [ + q(0227), + q(0), + ], + q(792) => [ + q(0228), + q(0), + ], + q(795) => [ + q(0229), + q(0), + ], + q(796) => [ + q(0230), + q(0), + ], + q(798) => [ + q(0231), + q(0), + ], + q(800) => [ + q(0232), + q(0), + ], + q(804) => [ + q(0233), + q(0), + ], + q(807) => [ + q(0132), + q(0), + ], + q(818) => [ + q(0066), + q(0), + ], + q(826) => [ + q(0235), + q(0), + ], + q(831) => [ + q(0092), + q(0), + ], + q(832) => [ + q(0113), + q(0), + ], + q(833) => [ + q(0108), + q(0), + ], + q(834) => [ + q(0220), + q(3), + ], + q(840) => [ + q(0237), + q(0), + ], + q(850) => [ + q(0244), + q(0), + ], + q(854) => [ + q(0036), + q(0), + ], + q(858) => [ + q(0238), + q(0), + ], + q(860) => [ + q(0239), + q(0), + ], + q(862) => [ + q(0241), + q(0), + ], + q(876) => [ + q(0245), + q(0), + ], + q(882) => [ + q(0192), + q(0), + ], + q(887) => [ + q(0247), + q(0), + ], + q(894) => [ + q(0248), + q(0), + ], + q(900) => [ + q(0251), + q(0), + ], + q(901) => [ + q(0269), + q(0), + ], + q(902) => [ + q(0252), + q(0), + ], + q(903) => [ + q(0253), + q(0), + ], + q(904) => [ + q(0254), + q(0), + ], + q(905) => [ + q(0255), + q(0), + ], + q(906) => [ + q(0256), + q(0), + ], + q(907) => [ + q(0257), + q(0), + ], + q(908) => [ + q(0258), + q(0), + ], + q(915) => [ + q(0259), + q(0), + ], + q(916) => [ + q(0260), + q(0), + ], + q(917) => [ + q(0261), + q(0), + ], + q(918) => [ + q(0262), + q(0), + ], + q(919) => [ + q(0263), + q(0), + ], + q(920) => [ + q(0264), + q(0), + ], + q(921) => [ + q(0265), + q(0), + ], + q(922) => [ + q(0266), + q(0), + ], + q(923) => [ + q(0267), + q(0), + ], + q(924) => [ + q(0268), + q(0), + ], + q(925) => [ + q(0270), + q(0), + ], + q(926) => [ + q(0271), + q(0), + ], + q(927) => [ + q(0272), + q(0), + ], + q(928) => [ + q(0273), + q(0), + ], + q(929) => [ + q(0274), + q(0), + ], + q(930) => [ + q(0275), + q(0), + ], + q(931) => [ + q(0276), + q(0), + ], + q(932) => [ + q(0277), + q(0), + ], + q(933) => [ + q(0278), + q(0), + ], + q(934) => [ + q(0279), + q(0), + ], + }, + q(numeric) => { + q(004) => [ + q(0001), + q(0), + ], + q(008) => [ + q(0003), + q(0), + ], + q(010) => [ + q(0009), + q(0), + ], + q(012) => [ + q(0004), + q(0), + ], + q(016) => [ + q(0005), + q(0), + ], + q(020) => [ + q(0006), + q(0), + ], + q(024) => [ + q(0007), + q(0), + ], + q(028) => [ + q(0010), + q(0), + ], + q(031) => [ + q(0016), + q(0), + ], + q(032) => [ + q(0011), + q(0), + ], + q(036) => [ + q(0014), + q(0), + ], + q(040) => [ + q(0015), + q(0), + ], + q(044) => [ + q(0017), + q(0), + ], + q(048) => [ + q(0018), + q(0), + ], + q(050) => [ + q(0019), + q(0), + ], + q(051) => [ + q(0012), + q(0), + ], + q(052) => [ + q(0020), + q(0), + ], + q(056) => [ + q(0022), + q(0), + ], + q(060) => [ + q(0025), + q(0), + ], + q(064) => [ + q(0026), + q(0), + ], + q(068) => [ + q(0027), + q(0), + ], + q(070) => [ + q(0029), + q(0), + ], + q(072) => [ + q(0030), + q(0), + ], + q(074) => [ + q(0031), + q(0), + ], + q(076) => [ + q(0032), + q(0), + ], + q(084) => [ + q(0023), + q(0), + ], + q(086) => [ + q(0033), + q(0), + ], + q(090) => [ + q(0204), + q(0), + ], + q(092) => [ + q(0243), + q(0), + ], + q(096) => [ + q(0034), + q(0), + ], + q(100) => [ + q(0035), + q(0), + ], + q(104) => [ + q(0153), + q(0), + ], + q(108) => [ + q(0037), + q(0), + ], + q(112) => [ + q(0021), + q(0), + ], + q(116) => [ + q(0039), + q(0), + ], + q(120) => [ + q(0040), + q(0), + ], + q(124) => [ + q(0041), + q(0), + ], + q(132) => [ + q(0038), + q(0), + ], + q(136) => [ + q(0042), + q(0), + ], + q(140) => [ + q(0043), + q(0), + ], + q(144) => [ + q(0210), + q(0), + ], + q(148) => [ + q(0044), + q(0), + ], + q(152) => [ + q(0045), + q(0), + ], + q(156) => [ + q(0046), + q(0), + ], + q(158) => [ + q(0218), + q(0), + ], + q(162) => [ + q(0047), + q(0), + ], + q(166) => [ + q(0048), + q(0), + ], + q(170) => [ + q(0049), + q(0), + ], + q(174) => [ + q(0050), + q(0), + ], + q(175) => [ + q(0143), + q(0), + ], + q(178) => [ + q(0052), + q(0), + ], + q(180) => [ + q(0051), + q(0), + ], + q(184) => [ + q(0053), + q(0), + ], + q(188) => [ + q(0054), + q(0), + ], + q(191) => [ + q(0056), + q(0), + ], + q(192) => [ + q(0057), + q(0), + ], + q(196) => [ + q(0059), + q(0), + ], + q(203) => [ + q(0060), + q(0), + ], + q(204) => [ + q(0024), + q(0), + ], + q(208) => [ + q(0061), + q(0), + ], + q(212) => [ + q(0063), + q(0), + ], + q(214) => [ + q(0064), + q(0), + ], + q(218) => [ + q(0065), + q(0), + ], + q(222) => [ + q(0067), + q(0), + ], + q(226) => [ + q(0068), + q(0), + ], + q(231) => [ + q(0071), + q(0), + ], + q(232) => [ + q(0069), + q(0), + ], + q(233) => [ + q(0070), + q(0), + ], + q(234) => [ + q(0073), + q(0), + ], + q(238) => [ + q(0072), + q(0), + ], + q(239) => [ + q(0207), + q(0), + ], + q(242) => [ + q(0074), + q(0), + ], + q(246) => [ + q(0075), + q(0), + ], + q(248) => [ + q(0002), + q(0), + ], + q(250) => [ + q(0076), + q(0), + ], + q(254) => [ + q(0077), + q(0), + ], + q(258) => [ + q(0078), + q(0), + ], + q(260) => [ + q(0079), + q(0), + ], + q(262) => [ + q(0062), + q(0), + ], + q(266) => [ + q(0080), + q(0), + ], + q(268) => [ + q(0082), + q(0), + ], + q(270) => [ + q(0081), + q(0), + ], + q(275) => [ + q(0170), + q(0), + ], + q(276) => [ + q(0083), + q(0), + ], + q(288) => [ + q(0084), + q(0), + ], + q(292) => [ + q(0085), + q(0), + ], + q(296) => [ + q(0117), + q(0), + ], + q(300) => [ + q(0086), + q(0), + ], + q(304) => [ + q(0087), + q(0), + ], + q(308) => [ + q(0088), + q(0), + ], + q(312) => [ + q(0089), + q(0), + ], + q(316) => [ + q(0090), + q(0), + ], + q(320) => [ + q(0091), + q(0), + ], + q(324) => [ + q(0093), + q(0), + ], + q(328) => [ + q(0095), + q(0), + ], + q(332) => [ + q(0096), + q(0), + ], + q(334) => [ + q(0097), + q(0), + ], + q(336) => [ + q(0098), + q(0), + ], + q(340) => [ + q(0099), + q(0), + ], + q(344) => [ + q(0100), + q(0), + ], + q(348) => [ + q(0101), + q(0), + ], + q(352) => [ + q(0102), + q(0), + ], + q(356) => [ + q(0103), + q(0), + ], + q(360) => [ + q(0104), + q(0), + ], + q(364) => [ + q(0105), + q(0), + ], + q(368) => [ + q(0106), + q(0), + ], + q(372) => [ + q(0107), + q(0), + ], + q(376) => [ + q(0109), + q(0), + ], + q(380) => [ + q(0110), + q(0), + ], + q(384) => [ + q(0055), + q(0), + ], + q(388) => [ + q(0111), + q(0), + ], + q(392) => [ + q(0112), + q(0), + ], + q(398) => [ + q(0115), + q(0), + ], + q(400) => [ + q(0114), + q(0), + ], + q(404) => [ + q(0116), + q(0), + ], + q(408) => [ + q(0118), + q(0), + ], + q(410) => [ + q(0119), + q(0), + ], + q(414) => [ + q(0120), + q(0), + ], + q(417) => [ + q(0121), + q(0), + ], + q(418) => [ + q(0122), + q(0), + ], + q(422) => [ + q(0124), + q(0), + ], + q(426) => [ + q(0125), + q(0), + ], + q(428) => [ + q(0123), + q(0), + ], + q(430) => [ + q(0126), + q(0), + ], + q(434) => [ + q(0127), + q(0), + ], + q(438) => [ + q(0128), + q(0), + ], + q(440) => [ + q(0129), + q(0), + ], + q(442) => [ + q(0130), + q(0), + ], + q(446) => [ + q(0131), + q(0), + ], + q(450) => [ + q(0133), + q(0), + ], + q(454) => [ + q(0134), + q(0), + ], + q(458) => [ + q(0135), + q(0), + ], + q(462) => [ + q(0136), + q(0), + ], + q(466) => [ + q(0137), + q(0), + ], + q(470) => [ + q(0138), + q(0), + ], + q(474) => [ + q(0140), + q(0), + ], + q(478) => [ + q(0141), + q(0), + ], + q(480) => [ + q(0142), + q(0), + ], + q(484) => [ + q(0144), + q(0), + ], + q(492) => [ + q(0147), + q(0), + ], + q(496) => [ + q(0148), + q(0), + ], + q(498) => [ + q(0146), + q(0), + ], + q(499) => [ + q(0149), + q(0), + ], + q(500) => [ + q(0150), + q(0), + ], + q(504) => [ + q(0151), + q(0), + ], + q(508) => [ + q(0152), + q(0), + ], + q(512) => [ + q(0167), + q(0), + ], + q(516) => [ + q(0154), + q(0), + ], + q(520) => [ + q(0155), + q(0), + ], + q(524) => [ + q(0156), + q(0), + ], + q(528) => [ + q(0157), + q(0), + ], + q(531) => [ + q(0058), + q(0), + ], + q(533) => [ + q(0013), + q(0), + ], + q(534) => [ + q(0201), + q(0), + ], + q(535) => [ + q(0028), + q(0), + ], + q(540) => [ + q(0158), + q(0), + ], + q(548) => [ + q(0240), + q(0), + ], + q(554) => [ + q(0159), + q(0), + ], + q(558) => [ + q(0160), + q(0), + ], + q(562) => [ + q(0161), + q(0), + ], + q(566) => [ + q(0162), + q(0), + ], + q(570) => [ + q(0163), + q(0), + ], + q(574) => [ + q(0164), + q(0), + ], + q(578) => [ + q(0166), + q(0), + ], + q(580) => [ + q(0165), + q(0), + ], + q(581) => [ + q(0236), + q(0), + ], + q(583) => [ + q(0145), + q(0), + ], + q(584) => [ + q(0139), + q(0), + ], + q(585) => [ + q(0169), + q(0), + ], + q(586) => [ + q(0168), + q(0), + ], + q(591) => [ + q(0171), + q(0), + ], + q(598) => [ + q(0172), + q(0), + ], + q(600) => [ + q(0173), + q(0), + ], + q(604) => [ + q(0174), + q(0), + ], + q(608) => [ + q(0175), + q(0), + ], + q(612) => [ + q(0176), + q(0), + ], + q(616) => [ + q(0177), + q(0), + ], + q(620) => [ + q(0178), + q(0), + ], + q(624) => [ + q(0094), + q(0), + ], + q(626) => [ + q(0222), + q(0), + ], + q(630) => [ + q(0179), + q(0), + ], + q(634) => [ + q(0180), + q(0), + ], + q(638) => [ + q(0181), + q(0), + ], + q(642) => [ + q(0182), + q(0), + ], + q(643) => [ + q(0183), + q(0), + ], + q(646) => [ + q(0184), + q(0), + ], + q(652) => [ + q(0185), + q(0), + ], + q(654) => [ + q(0186), + q(0), + ], + q(659) => [ + q(0187), + q(0), + ], + q(660) => [ + q(0008), + q(0), + ], + q(662) => [ + q(0188), + q(0), + ], + q(663) => [ + q(0189), + q(0), + ], + q(666) => [ + q(0190), + q(0), + ], + q(670) => [ + q(0191), + q(0), + ], + q(674) => [ + q(0193), + q(0), + ], + q(678) => [ + q(0194), + q(0), + ], + q(682) => [ + q(0195), + q(0), + ], + q(686) => [ + q(0196), + q(0), + ], + q(688) => [ + q(0197), + q(0), + ], + q(690) => [ + q(0198), + q(0), + ], + q(694) => [ + q(0199), + q(0), + ], + q(702) => [ + q(0200), + q(0), + ], + q(703) => [ + q(0202), + q(0), + ], + q(704) => [ + q(0242), + q(0), + ], + q(705) => [ + q(0203), + q(0), + ], + q(706) => [ + q(0205), + q(0), + ], + q(710) => [ + q(0206), + q(0), + ], + q(716) => [ + q(0249), + q(0), + ], + q(724) => [ + q(0209), + q(0), + ], + q(728) => [ + q(0208), + q(0), + ], + q(729) => [ + q(0211), + q(0), + ], + q(732) => [ + q(0246), + q(0), + ], + q(740) => [ + q(0212), + q(0), + ], + q(744) => [ + q(0213), + q(0), + ], + q(748) => [ + q(0214), + q(0), + ], + q(752) => [ + q(0215), + q(0), + ], + q(756) => [ + q(0216), + q(0), + ], + q(760) => [ + q(0217), + q(0), + ], + q(762) => [ + q(0219), + q(0), + ], + q(764) => [ + q(0221), + q(0), + ], + q(768) => [ + q(0223), + q(0), + ], + q(772) => [ + q(0224), + q(0), + ], + q(776) => [ + q(0225), + q(0), + ], + q(780) => [ + q(0226), + q(0), + ], + q(784) => [ + q(0234), + q(0), + ], + q(788) => [ + q(0227), + q(0), + ], + q(792) => [ + q(0228), + q(0), + ], + q(795) => [ + q(0229), + q(0), + ], + q(796) => [ + q(0230), + q(0), + ], + q(798) => [ + q(0231), + q(0), + ], + q(800) => [ + q(0232), + q(0), + ], + q(804) => [ + q(0233), + q(0), + ], + q(807) => [ + q(0132), + q(0), + ], + q(818) => [ + q(0066), + q(0), + ], + q(826) => [ + q(0235), + q(0), + ], + q(831) => [ + q(0092), + q(0), + ], + q(832) => [ + q(0113), + q(0), + ], + q(833) => [ + q(0108), + q(0), + ], + q(834) => [ + q(0220), + q(0), + ], + q(840) => [ + q(0237), + q(0), + ], + q(850) => [ + q(0244), + q(0), + ], + q(854) => [ + q(0036), + q(0), + ], + q(858) => [ + q(0238), + q(0), + ], + q(860) => [ + q(0239), + q(0), + ], + q(862) => [ + q(0241), + q(0), + ], + q(876) => [ + q(0245), + q(0), + ], + q(882) => [ + q(0192), + q(0), + ], + q(887) => [ + q(0247), + q(0), + ], + q(894) => [ + q(0248), + q(0), + ], + }, + q(un-alpha-3) => { + q(ABW) => [ + q(0013), + q(0), + ], + q(AFG) => [ + q(0001), + q(0), + ], + q(AGO) => [ + q(0007), + q(0), + ], + q(AIA) => [ + q(0008), + q(0), + ], + q(ALA) => [ + q(0002), + q(0), + ], + q(ALB) => [ + q(0003), + q(0), + ], + q(AND) => [ + q(0006), + q(0), + ], + q(ARE) => [ + q(0234), + q(0), + ], + q(ARG) => [ + q(0011), + q(0), + ], + q(ARM) => [ + q(0012), + q(0), + ], + q(ASM) => [ + q(0005), + q(0), + ], + q(ATA) => [ + q(0009), + q(0), + ], + q(ATF) => [ + q(0079), + q(0), + ], + q(ATG) => [ + q(0010), + q(0), + ], + q(AUS) => [ + q(0014), + q(0), + ], + q(AUT) => [ + q(0015), + q(0), + ], + q(AZE) => [ + q(0016), + q(0), + ], + q(BDI) => [ + q(0037), + q(0), + ], + q(BEL) => [ + q(0022), + q(0), + ], + q(BEN) => [ + q(0024), + q(0), + ], + q(BES) => [ + q(0028), + q(0), + ], + q(BFA) => [ + q(0036), + q(0), + ], + q(BGD) => [ + q(0019), + q(0), + ], + q(BGR) => [ + q(0035), + q(0), + ], + q(BHR) => [ + q(0018), + q(0), + ], + q(BHS) => [ + q(0017), + q(0), + ], + q(BIH) => [ + q(0029), + q(0), + ], + q(BLM) => [ + q(0185), + q(0), + ], + q(BLR) => [ + q(0021), + q(0), + ], + q(BLZ) => [ + q(0023), + q(0), + ], + q(BMU) => [ + q(0025), + q(0), + ], + q(BOL) => [ + q(0027), + q(0), + ], + q(BRA) => [ + q(0032), + q(0), + ], + q(BRB) => [ + q(0020), + q(0), + ], + q(BRN) => [ + q(0034), + q(0), + ], + q(BTN) => [ + q(0026), + q(0), + ], + q(BVT) => [ + q(0031), + q(0), + ], + q(BWA) => [ + q(0030), + q(0), + ], + q(CAF) => [ + q(0043), + q(0), + ], + q(CAN) => [ + q(0041), + q(0), + ], + q(CCK) => [ + q(0048), + q(0), + ], + q(CHE) => [ + q(0216), + q(0), + ], + q(CHL) => [ + q(0045), + q(0), + ], + q(CHN) => [ + q(0046), + q(0), + ], + q(CIV) => [ + q(0055), + q(0), + ], + q(CMR) => [ + q(0040), + q(0), + ], + q(COD) => [ + q(0051), + q(0), + ], + q(COG) => [ + q(0052), + q(0), + ], + q(COK) => [ + q(0053), + q(0), + ], + q(COL) => [ + q(0049), + q(0), + ], + q(COM) => [ + q(0050), + q(0), + ], + q(CPV) => [ + q(0038), + q(0), + ], + q(CRI) => [ + q(0054), + q(0), + ], + q(CUB) => [ + q(0057), + q(0), + ], + q(CUW) => [ + q(0058), + q(0), + ], + q(CXR) => [ + q(0047), + q(0), + ], + q(CYM) => [ + q(0042), + q(0), + ], + q(CYP) => [ + q(0059), + q(0), + ], + q(CZE) => [ + q(0060), + q(0), + ], + q(DEU) => [ + q(0083), + q(0), + ], + q(DJI) => [ + q(0062), + q(0), + ], + q(DMA) => [ + q(0063), + q(0), + ], + q(DNK) => [ + q(0061), + q(0), + ], + q(DOM) => [ + q(0064), + q(0), + ], + q(DZA) => [ + q(0004), + q(0), + ], + q(ECU) => [ + q(0065), + q(0), + ], + q(EGY) => [ + q(0066), + q(0), + ], + q(ERI) => [ + q(0069), + q(0), + ], + q(ESH) => [ + q(0246), + q(0), + ], + q(ESP) => [ + q(0209), + q(0), + ], + q(EST) => [ + q(0070), + q(0), + ], + q(ETH) => [ + q(0071), + q(0), + ], + q(FIN) => [ + q(0075), + q(0), + ], + q(FJI) => [ + q(0074), + q(0), + ], + q(FLK) => [ + q(0072), + q(0), + ], + q(FRA) => [ + q(0076), + q(0), + ], + q(FRO) => [ + q(0073), + q(0), + ], + q(FSM) => [ + q(0145), + q(0), + ], + q(GAB) => [ + q(0080), + q(0), + ], + q(GBR) => [ + q(0235), + q(0), + ], + q(GEO) => [ + q(0082), + q(0), + ], + q(GGY) => [ + q(0092), + q(0), + ], + q(GHA) => [ + q(0084), + q(0), + ], + q(GIB) => [ + q(0085), + q(0), + ], + q(GIN) => [ + q(0093), + q(0), + ], + q(GLP) => [ + q(0089), + q(0), + ], + q(GMB) => [ + q(0081), + q(0), + ], + q(GNB) => [ + q(0094), + q(0), + ], + q(GNQ) => [ + q(0068), + q(0), + ], + q(GRC) => [ + q(0086), + q(0), + ], + q(GRD) => [ + q(0088), + q(0), + ], + q(GRL) => [ + q(0087), + q(0), + ], + q(GTM) => [ + q(0091), + q(0), + ], + q(GUF) => [ + q(0077), + q(0), + ], + q(GUM) => [ + q(0090), + q(0), + ], + q(GUY) => [ + q(0095), + q(0), + ], + q(HKG) => [ + q(0100), + q(0), + ], + q(HMD) => [ + q(0097), + q(0), + ], + q(HND) => [ + q(0099), + q(0), + ], + q(HRV) => [ + q(0056), + q(0), + ], + q(HTI) => [ + q(0096), + q(0), + ], + q(HUN) => [ + q(0101), + q(0), + ], + q(IDN) => [ + q(0104), + q(0), + ], + q(IMN) => [ + q(0108), + q(0), + ], + q(IND) => [ + q(0103), + q(0), + ], + q(IOT) => [ + q(0033), + q(0), + ], + q(IRL) => [ + q(0107), + q(0), + ], + q(IRN) => [ + q(0105), + q(0), + ], + q(IRQ) => [ + q(0106), + q(0), + ], + q(ISL) => [ + q(0102), + q(0), + ], + q(ISR) => [ + q(0109), + q(0), + ], + q(ITA) => [ + q(0110), + q(0), + ], + q(JAM) => [ + q(0111), + q(0), + ], + q(JEY) => [ + q(0113), + q(0), + ], + q(JOR) => [ + q(0114), + q(0), + ], + q(JPN) => [ + q(0112), + q(0), + ], + q(KAZ) => [ + q(0115), + q(0), + ], + q(KEN) => [ + q(0116), + q(0), + ], + q(KGZ) => [ + q(0121), + q(0), + ], + q(KHM) => [ + q(0039), + q(0), + ], + q(KIR) => [ + q(0117), + q(0), + ], + q(KNA) => [ + q(0187), + q(0), + ], + q(KOR) => [ + q(0119), + q(0), + ], + q(KWT) => [ + q(0120), + q(0), + ], + q(LAO) => [ + q(0122), + q(0), + ], + q(LBN) => [ + q(0124), + q(0), + ], + q(LBR) => [ + q(0126), + q(0), + ], + q(LBY) => [ + q(0127), + q(0), + ], + q(LCA) => [ + q(0188), + q(0), + ], + q(LIE) => [ + q(0128), + q(0), + ], + q(LKA) => [ + q(0210), + q(0), + ], + q(LSO) => [ + q(0125), + q(0), + ], + q(LTU) => [ + q(0129), + q(0), + ], + q(LUX) => [ + q(0130), + q(0), + ], + q(LVA) => [ + q(0123), + q(0), + ], + q(MAC) => [ + q(0131), + q(0), + ], + q(MAF) => [ + q(0189), + q(0), + ], + q(MAR) => [ + q(0151), + q(0), + ], + q(MCO) => [ + q(0147), + q(0), + ], + q(MDA) => [ + q(0146), + q(0), + ], + q(MDG) => [ + q(0133), + q(0), + ], + q(MDV) => [ + q(0136), + q(0), + ], + q(MEX) => [ + q(0144), + q(0), + ], + q(MHL) => [ + q(0139), + q(0), + ], + q(MKD) => [ + q(0132), + q(0), + ], + q(MLI) => [ + q(0137), + q(0), + ], + q(MLT) => [ + q(0138), + q(0), + ], + q(MMR) => [ + q(0153), + q(0), + ], + q(MNE) => [ + q(0149), + q(0), + ], + q(MNG) => [ + q(0148), + q(0), + ], + q(MNP) => [ + q(0165), + q(0), + ], + q(MOZ) => [ + q(0152), + q(0), + ], + q(MRT) => [ + q(0141), + q(0), + ], + q(MSR) => [ + q(0150), + q(0), + ], + q(MTQ) => [ + q(0140), + q(0), + ], + q(MUS) => [ + q(0142), + q(0), + ], + q(MWI) => [ + q(0134), + q(0), + ], + q(MYS) => [ + q(0135), + q(0), + ], + q(MYT) => [ + q(0143), + q(0), + ], + q(NAM) => [ + q(0154), + q(0), + ], + q(NCL) => [ + q(0158), + q(0), + ], + q(NER) => [ + q(0161), + q(0), + ], + q(NFK) => [ + q(0164), + q(0), + ], + q(NGA) => [ + q(0162), + q(0), + ], + q(NIC) => [ + q(0160), + q(0), + ], + q(NIU) => [ + q(0163), + q(0), + ], + q(NLD) => [ + q(0157), + q(0), + ], + q(NOR) => [ + q(0166), + q(0), + ], + q(NPL) => [ + q(0156), + q(0), + ], + q(NRU) => [ + q(0155), + q(0), + ], + q(NZL) => [ + q(0159), + q(0), + ], + q(OMN) => [ + q(0167), + q(0), + ], + q(PAK) => [ + q(0168), + q(0), + ], + q(PAN) => [ + q(0171), + q(0), + ], + q(PCN) => [ + q(0176), + q(0), + ], + q(PER) => [ + q(0174), + q(0), + ], + q(PHL) => [ + q(0175), + q(0), + ], + q(PLW) => [ + q(0169), + q(0), + ], + q(PNG) => [ + q(0172), + q(0), + ], + q(POL) => [ + q(0177), + q(0), + ], + q(PRI) => [ + q(0179), + q(0), + ], + q(PRK) => [ + q(0118), + q(5), + ], + q(PRT) => [ + q(0178), + q(0), + ], + q(PRY) => [ + q(0173), + q(0), + ], + q(PSE) => [ + q(0170), + q(0), + ], + q(PYF) => [ + q(0078), + q(0), + ], + q(QAT) => [ + q(0180), + q(0), + ], + q(REU) => [ + q(0181), + q(0), + ], + q(ROU) => [ + q(0182), + q(0), + ], + q(RUS) => [ + q(0183), + q(0), + ], + q(RWA) => [ + q(0184), + q(0), + ], + q(SAU) => [ + q(0195), + q(0), + ], + q(SDN) => [ + q(0211), + q(0), + ], + q(SEN) => [ + q(0196), + q(0), + ], + q(SGP) => [ + q(0200), + q(0), + ], + q(SGS) => [ + q(0207), + q(0), + ], + q(SHN) => [ + q(0186), + q(0), + ], + q(SJM) => [ + q(0213), + q(0), + ], + q(SLB) => [ + q(0204), + q(0), + ], + q(SLE) => [ + q(0199), + q(0), + ], + q(SLV) => [ + q(0067), + q(0), + ], + q(SMR) => [ + q(0193), + q(0), + ], + q(SOM) => [ + q(0205), + q(0), + ], + q(SPM) => [ + q(0190), + q(0), + ], + q(SRB) => [ + q(0197), + q(0), + ], + q(SSD) => [ + q(0208), + q(0), + ], + q(STP) => [ + q(0194), + q(0), + ], + q(SUR) => [ + q(0212), + q(0), + ], + q(SVK) => [ + q(0202), + q(0), + ], + q(SVN) => [ + q(0203), + q(0), + ], + q(SWE) => [ + q(0215), + q(0), + ], + q(SWZ) => [ + q(0214), + q(0), + ], + q(SXM) => [ + q(0201), + q(0), + ], + q(SYC) => [ + q(0198), + q(0), + ], + q(SYR) => [ + q(0217), + q(0), + ], + q(TCA) => [ + q(0230), + q(0), + ], + q(TCD) => [ + q(0044), + q(0), + ], + q(TGO) => [ + q(0223), + q(0), + ], + q(THA) => [ + q(0221), + q(0), + ], + q(TJK) => [ + q(0219), + q(0), + ], + q(TKL) => [ + q(0224), + q(0), + ], + q(TKM) => [ + q(0229), + q(0), + ], + q(TLS) => [ + q(0222), + q(0), + ], + q(TON) => [ + q(0225), + q(0), + ], + q(TTO) => [ + q(0226), + q(0), + ], + q(TUN) => [ + q(0227), + q(0), + ], + q(TUR) => [ + q(0228), + q(0), + ], + q(TUV) => [ + q(0231), + q(0), + ], + q(TZA) => [ + q(0220), + q(0), + ], + q(UGA) => [ + q(0232), + q(0), + ], + q(UKR) => [ + q(0233), + q(0), + ], + q(UMI) => [ + q(0236), + q(0), + ], + q(URY) => [ + q(0238), + q(0), + ], + q(USA) => [ + q(0237), + q(0), + ], + q(UZB) => [ + q(0239), + q(0), + ], + q(VAT) => [ + q(0098), + q(0), + ], + q(VCT) => [ + q(0191), + q(0), + ], + q(VEN) => [ + q(0241), + q(0), + ], + q(VGB) => [ + q(0243), + q(0), + ], + q(VIR) => [ + q(0244), + q(0), + ], + q(VNM) => [ + q(0242), + q(0), + ], + q(VUT) => [ + q(0240), + q(0), + ], + q(WLF) => [ + q(0245), + q(0), + ], + q(WSM) => [ + q(0192), + q(0), + ], + q(YEM) => [ + q(0247), + q(0), + ], + q(ZAF) => [ + q(0206), + q(0), + ], + q(ZMB) => [ + q(0248), + q(0), + ], + q(ZWE) => [ + q(0249), + q(0), + ], + }, + q(un-numeric) => { + q(004) => [ + q(0001), + q(0), + ], + q(008) => [ + q(0003), + q(0), + ], + q(010) => [ + q(0009), + q(0), + ], + q(012) => [ + q(0004), + q(0), + ], + q(016) => [ + q(0005), + q(0), + ], + q(020) => [ + q(0006), + q(0), + ], + q(024) => [ + q(0007), + q(0), + ], + q(028) => [ + q(0010), + q(0), + ], + q(031) => [ + q(0016), + q(0), + ], + q(032) => [ + q(0011), + q(0), + ], + q(036) => [ + q(0014), + q(0), + ], + q(040) => [ + q(0015), + q(0), + ], + q(044) => [ + q(0017), + q(0), + ], + q(048) => [ + q(0018), + q(0), + ], + q(050) => [ + q(0019), + q(0), + ], + q(051) => [ + q(0012), + q(0), + ], + q(052) => [ + q(0020), + q(0), + ], + q(056) => [ + q(0022), + q(0), + ], + q(060) => [ + q(0025), + q(0), + ], + q(064) => [ + q(0026), + q(0), + ], + q(068) => [ + q(0027), + q(0), + ], + q(070) => [ + q(0029), + q(0), + ], + q(072) => [ + q(0030), + q(0), + ], + q(074) => [ + q(0031), + q(0), + ], + q(076) => [ + q(0032), + q(0), + ], + q(084) => [ + q(0023), + q(0), + ], + q(086) => [ + q(0033), + q(0), + ], + q(090) => [ + q(0204), + q(0), + ], + q(092) => [ + q(0243), + q(0), + ], + q(096) => [ + q(0034), + q(0), + ], + q(100) => [ + q(0035), + q(0), + ], + q(104) => [ + q(0153), + q(0), + ], + q(108) => [ + q(0037), + q(0), + ], + q(112) => [ + q(0021), + q(0), + ], + q(116) => [ + q(0039), + q(0), + ], + q(120) => [ + q(0040), + q(0), + ], + q(124) => [ + q(0041), + q(0), + ], + q(132) => [ + q(0038), + q(0), + ], + q(136) => [ + q(0042), + q(0), + ], + q(140) => [ + q(0043), + q(0), + ], + q(144) => [ + q(0210), + q(0), + ], + q(148) => [ + q(0044), + q(0), + ], + q(152) => [ + q(0045), + q(0), + ], + q(156) => [ + q(0046), + q(0), + ], + q(162) => [ + q(0047), + q(0), + ], + q(166) => [ + q(0048), + q(0), + ], + q(170) => [ + q(0049), + q(0), + ], + q(174) => [ + q(0050), + q(0), + ], + q(175) => [ + q(0143), + q(0), + ], + q(178) => [ + q(0052), + q(0), + ], + q(180) => [ + q(0051), + q(0), + ], + q(184) => [ + q(0053), + q(0), + ], + q(188) => [ + q(0054), + q(0), + ], + q(191) => [ + q(0056), + q(0), + ], + q(192) => [ + q(0057), + q(0), + ], + q(196) => [ + q(0059), + q(0), + ], + q(203) => [ + q(0060), + q(0), + ], + q(204) => [ + q(0024), + q(0), + ], + q(208) => [ + q(0061), + q(0), + ], + q(212) => [ + q(0063), + q(0), + ], + q(214) => [ + q(0064), + q(0), + ], + q(218) => [ + q(0065), + q(0), + ], + q(222) => [ + q(0067), + q(0), + ], + q(226) => [ + q(0068), + q(0), + ], + q(231) => [ + q(0071), + q(0), + ], + q(232) => [ + q(0069), + q(0), + ], + q(233) => [ + q(0070), + q(0), + ], + q(234) => [ + q(0073), + q(0), + ], + q(238) => [ + q(0072), + q(0), + ], + q(239) => [ + q(0207), + q(0), + ], + q(242) => [ + q(0074), + q(0), + ], + q(246) => [ + q(0075), + q(0), + ], + q(248) => [ + q(0002), + q(0), + ], + q(250) => [ + q(0076), + q(0), + ], + q(254) => [ + q(0077), + q(0), + ], + q(258) => [ + q(0078), + q(0), + ], + q(260) => [ + q(0079), + q(0), + ], + q(262) => [ + q(0062), + q(0), + ], + q(266) => [ + q(0080), + q(0), + ], + q(268) => [ + q(0082), + q(0), + ], + q(270) => [ + q(0081), + q(0), + ], + q(275) => [ + q(0170), + q(0), + ], + q(276) => [ + q(0083), + q(0), + ], + q(288) => [ + q(0084), + q(0), + ], + q(292) => [ + q(0085), + q(0), + ], + q(296) => [ + q(0117), + q(0), + ], + q(300) => [ + q(0086), + q(0), + ], + q(304) => [ + q(0087), + q(0), + ], + q(308) => [ + q(0088), + q(0), + ], + q(312) => [ + q(0089), + q(0), + ], + q(316) => [ + q(0090), + q(0), + ], + q(320) => [ + q(0091), + q(0), + ], + q(324) => [ + q(0093), + q(0), + ], + q(328) => [ + q(0095), + q(0), + ], + q(332) => [ + q(0096), + q(0), + ], + q(334) => [ + q(0097), + q(0), + ], + q(336) => [ + q(0098), + q(0), + ], + q(340) => [ + q(0099), + q(0), + ], + q(344) => [ + q(0100), + q(0), + ], + q(348) => [ + q(0101), + q(0), + ], + q(352) => [ + q(0102), + q(0), + ], + q(356) => [ + q(0103), + q(0), + ], + q(360) => [ + q(0104), + q(0), + ], + q(364) => [ + q(0105), + q(0), + ], + q(368) => [ + q(0106), + q(0), + ], + q(372) => [ + q(0107), + q(0), + ], + q(376) => [ + q(0109), + q(0), + ], + q(380) => [ + q(0110), + q(0), + ], + q(384) => [ + q(0055), + q(0), + ], + q(388) => [ + q(0111), + q(0), + ], + q(392) => [ + q(0112), + q(0), + ], + q(398) => [ + q(0115), + q(0), + ], + q(400) => [ + q(0114), + q(0), + ], + q(404) => [ + q(0116), + q(0), + ], + q(408) => [ + q(0118), + q(5), + ], + q(410) => [ + q(0119), + q(0), + ], + q(414) => [ + q(0120), + q(0), + ], + q(417) => [ + q(0121), + q(0), + ], + q(418) => [ + q(0122), + q(0), + ], + q(422) => [ + q(0124), + q(0), + ], + q(426) => [ + q(0125), + q(0), + ], + q(428) => [ + q(0123), + q(0), + ], + q(430) => [ + q(0126), + q(0), + ], + q(434) => [ + q(0127), + q(0), + ], + q(438) => [ + q(0128), + q(0), + ], + q(440) => [ + q(0129), + q(0), + ], + q(442) => [ + q(0130), + q(0), + ], + q(446) => [ + q(0131), + q(0), + ], + q(450) => [ + q(0133), + q(0), + ], + q(454) => [ + q(0134), + q(0), + ], + q(458) => [ + q(0135), + q(0), + ], + q(462) => [ + q(0136), + q(0), + ], + q(466) => [ + q(0137), + q(0), + ], + q(470) => [ + q(0138), + q(0), + ], + q(474) => [ + q(0140), + q(0), + ], + q(478) => [ + q(0141), + q(0), + ], + q(480) => [ + q(0142), + q(0), + ], + q(484) => [ + q(0144), + q(0), + ], + q(492) => [ + q(0147), + q(0), + ], + q(496) => [ + q(0148), + q(0), + ], + q(498) => [ + q(0146), + q(0), + ], + q(499) => [ + q(0149), + q(0), + ], + q(500) => [ + q(0150), + q(0), + ], + q(504) => [ + q(0151), + q(0), + ], + q(508) => [ + q(0152), + q(0), + ], + q(512) => [ + q(0167), + q(0), + ], + q(516) => [ + q(0154), + q(0), + ], + q(520) => [ + q(0155), + q(0), + ], + q(524) => [ + q(0156), + q(0), + ], + q(528) => [ + q(0157), + q(0), + ], + q(531) => [ + q(0058), + q(0), + ], + q(533) => [ + q(0013), + q(0), + ], + q(534) => [ + q(0201), + q(0), + ], + q(535) => [ + q(0028), + q(0), + ], + q(540) => [ + q(0158), + q(0), + ], + q(548) => [ + q(0240), + q(0), + ], + q(554) => [ + q(0159), + q(0), + ], + q(558) => [ + q(0160), + q(0), + ], + q(562) => [ + q(0161), + q(0), + ], + q(566) => [ + q(0162), + q(0), + ], + q(570) => [ + q(0163), + q(0), + ], + q(574) => [ + q(0164), + q(0), + ], + q(578) => [ + q(0166), + q(0), + ], + q(580) => [ + q(0165), + q(0), + ], + q(581) => [ + q(0236), + q(0), + ], + q(583) => [ + q(0145), + q(0), + ], + q(584) => [ + q(0139), + q(0), + ], + q(585) => [ + q(0169), + q(0), + ], + q(586) => [ + q(0168), + q(0), + ], + q(591) => [ + q(0171), + q(0), + ], + q(598) => [ + q(0172), + q(0), + ], + q(600) => [ + q(0173), + q(0), + ], + q(604) => [ + q(0174), + q(0), + ], + q(608) => [ + q(0175), + q(0), + ], + q(612) => [ + q(0176), + q(0), + ], + q(616) => [ + q(0177), + q(0), + ], + q(620) => [ + q(0178), + q(0), + ], + q(624) => [ + q(0094), + q(0), + ], + q(626) => [ + q(0222), + q(0), + ], + q(630) => [ + q(0179), + q(0), + ], + q(634) => [ + q(0180), + q(0), + ], + q(638) => [ + q(0181), + q(0), + ], + q(642) => [ + q(0182), + q(0), + ], + q(643) => [ + q(0183), + q(0), + ], + q(646) => [ + q(0184), + q(0), + ], + q(652) => [ + q(0185), + q(0), + ], + q(654) => [ + q(0186), + q(0), + ], + q(659) => [ + q(0187), + q(0), + ], + q(660) => [ + q(0008), + q(0), + ], + q(662) => [ + q(0188), + q(0), + ], + q(663) => [ + q(0189), + q(0), + ], + q(666) => [ + q(0190), + q(0), + ], + q(670) => [ + q(0191), + q(0), + ], + q(674) => [ + q(0193), + q(0), + ], + q(678) => [ + q(0194), + q(0), + ], + q(680) => [ + q(0250), + q(0), + ], + q(682) => [ + q(0195), + q(0), + ], + q(686) => [ + q(0196), + q(0), + ], + q(688) => [ + q(0197), + q(0), + ], + q(690) => [ + q(0198), + q(0), + ], + q(694) => [ + q(0199), + q(0), + ], + q(702) => [ + q(0200), + q(0), + ], + q(703) => [ + q(0202), + q(0), + ], + q(704) => [ + q(0242), + q(0), + ], + q(705) => [ + q(0203), + q(0), + ], + q(706) => [ + q(0205), + q(0), + ], + q(710) => [ + q(0206), + q(0), + ], + q(716) => [ + q(0249), + q(0), + ], + q(724) => [ + q(0209), + q(0), + ], + q(728) => [ + q(0208), + q(0), + ], + q(729) => [ + q(0211), + q(0), + ], + q(732) => [ + q(0246), + q(0), + ], + q(740) => [ + q(0212), + q(0), + ], + q(744) => [ + q(0213), + q(0), + ], + q(748) => [ + q(0214), + q(0), + ], + q(752) => [ + q(0215), + q(0), + ], + q(756) => [ + q(0216), + q(0), + ], + q(760) => [ + q(0217), + q(0), + ], + q(762) => [ + q(0219), + q(0), + ], + q(764) => [ + q(0221), + q(0), + ], + q(768) => [ + q(0223), + q(0), + ], + q(772) => [ + q(0224), + q(0), + ], + q(776) => [ + q(0225), + q(0), + ], + q(780) => [ + q(0226), + q(0), + ], + q(784) => [ + q(0234), + q(0), + ], + q(788) => [ + q(0227), + q(0), + ], + q(792) => [ + q(0228), + q(0), + ], + q(795) => [ + q(0229), + q(0), + ], + q(796) => [ + q(0230), + q(0), + ], + q(798) => [ + q(0231), + q(0), + ], + q(800) => [ + q(0232), + q(0), + ], + q(804) => [ + q(0233), + q(0), + ], + q(807) => [ + q(0132), + q(0), + ], + q(818) => [ + q(0066), + q(0), + ], + q(826) => [ + q(0235), + q(0), + ], + q(831) => [ + q(0092), + q(0), + ], + q(832) => [ + q(0113), + q(0), + ], + q(833) => [ + q(0108), + q(0), + ], + q(834) => [ + q(0220), + q(0), + ], + q(840) => [ + q(0237), + q(0), + ], + q(850) => [ + q(0244), + q(0), + ], + q(854) => [ + q(0036), + q(0), + ], + q(858) => [ + q(0238), + q(0), + ], + q(860) => [ + q(0239), + q(0), + ], + q(862) => [ + q(0241), + q(0), + ], + q(876) => [ + q(0245), + q(0), + ], + q(882) => [ + q(0192), + q(0), + ], + q(887) => [ + q(0247), + q(0), + ], + q(894) => [ + q(0248), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'country'}{'id2code'} = { + q(alpha-2) => { + q(0001) => q(af), + q(0002) => q(ax), + q(0003) => q(al), + q(0004) => q(dz), + q(0005) => q(as), + q(0006) => q(ad), + q(0007) => q(ao), + q(0008) => q(ai), + q(0009) => q(aq), + q(0010) => q(ag), + q(0011) => q(ar), + q(0012) => q(am), + q(0013) => q(aw), + q(0014) => q(au), + q(0015) => q(at), + q(0016) => q(az), + q(0017) => q(bs), + q(0018) => q(bh), + q(0019) => q(bd), + q(0020) => q(bb), + q(0021) => q(by), + q(0022) => q(be), + q(0023) => q(bz), + q(0024) => q(bj), + q(0025) => q(bm), + q(0026) => q(bt), + q(0027) => q(bo), + q(0028) => q(bq), + q(0029) => q(ba), + q(0030) => q(bw), + q(0031) => q(bv), + q(0032) => q(br), + q(0033) => q(io), + q(0034) => q(bn), + q(0035) => q(bg), + q(0036) => q(bf), + q(0037) => q(bi), + q(0038) => q(cv), + q(0039) => q(kh), + q(0040) => q(cm), + q(0041) => q(ca), + q(0042) => q(ky), + q(0043) => q(cf), + q(0044) => q(td), + q(0045) => q(cl), + q(0046) => q(cn), + q(0047) => q(cx), + q(0048) => q(cc), + q(0049) => q(co), + q(0050) => q(km), + q(0051) => q(cd), + q(0052) => q(cg), + q(0053) => q(ck), + q(0054) => q(cr), + q(0055) => q(ci), + q(0056) => q(hr), + q(0057) => q(cu), + q(0058) => q(cw), + q(0059) => q(cy), + q(0060) => q(cz), + q(0061) => q(dk), + q(0062) => q(dj), + q(0063) => q(dm), + q(0064) => q(do), + q(0065) => q(ec), + q(0066) => q(eg), + q(0067) => q(sv), + q(0068) => q(gq), + q(0069) => q(er), + q(0070) => q(ee), + q(0071) => q(et), + q(0072) => q(fk), + q(0073) => q(fo), + q(0074) => q(fj), + q(0075) => q(fi), + q(0076) => q(fr), + q(0077) => q(gf), + q(0078) => q(pf), + q(0079) => q(tf), + q(0080) => q(ga), + q(0081) => q(gm), + q(0082) => q(ge), + q(0083) => q(de), + q(0084) => q(gh), + q(0085) => q(gi), + q(0086) => q(gr), + q(0087) => q(gl), + q(0088) => q(gd), + q(0089) => q(gp), + q(0090) => q(gu), + q(0091) => q(gt), + q(0092) => q(gg), + q(0093) => q(gn), + q(0094) => q(gw), + q(0095) => q(gy), + q(0096) => q(ht), + q(0097) => q(hm), + q(0098) => q(va), + q(0099) => q(hn), + q(0100) => q(hk), + q(0101) => q(hu), + q(0102) => q(is), + q(0103) => q(in), + q(0104) => q(id), + q(0105) => q(ir), + q(0106) => q(iq), + q(0107) => q(ie), + q(0108) => q(im), + q(0109) => q(il), + q(0110) => q(it), + q(0111) => q(jm), + q(0112) => q(jp), + q(0113) => q(je), + q(0114) => q(jo), + q(0115) => q(kz), + q(0116) => q(ke), + q(0117) => q(ki), + q(0118) => q(kp), + q(0119) => q(kr), + q(0120) => q(kw), + q(0121) => q(kg), + q(0122) => q(la), + q(0123) => q(lv), + q(0124) => q(lb), + q(0125) => q(ls), + q(0126) => q(lr), + q(0127) => q(ly), + q(0128) => q(li), + q(0129) => q(lt), + q(0130) => q(lu), + q(0131) => q(mo), + q(0132) => q(mk), + q(0133) => q(mg), + q(0134) => q(mw), + q(0135) => q(my), + q(0136) => q(mv), + q(0137) => q(ml), + q(0138) => q(mt), + q(0139) => q(mh), + q(0140) => q(mq), + q(0141) => q(mr), + q(0142) => q(mu), + q(0143) => q(yt), + q(0144) => q(mx), + q(0145) => q(fm), + q(0146) => q(md), + q(0147) => q(mc), + q(0148) => q(mn), + q(0149) => q(me), + q(0150) => q(ms), + q(0151) => q(ma), + q(0152) => q(mz), + q(0153) => q(mm), + q(0154) => q(na), + q(0155) => q(nr), + q(0156) => q(np), + q(0157) => q(nl), + q(0158) => q(nc), + q(0159) => q(nz), + q(0160) => q(ni), + q(0161) => q(ne), + q(0162) => q(ng), + q(0163) => q(nu), + q(0164) => q(nf), + q(0165) => q(mp), + q(0166) => q(no), + q(0167) => q(om), + q(0168) => q(pk), + q(0169) => q(pw), + q(0170) => q(ps), + q(0171) => q(pa), + q(0172) => q(pg), + q(0173) => q(py), + q(0174) => q(pe), + q(0175) => q(ph), + q(0176) => q(pn), + q(0177) => q(pl), + q(0178) => q(pt), + q(0179) => q(pr), + q(0180) => q(qa), + q(0181) => q(re), + q(0182) => q(ro), + q(0183) => q(ru), + q(0184) => q(rw), + q(0185) => q(bl), + q(0186) => q(sh), + q(0187) => q(kn), + q(0188) => q(lc), + q(0189) => q(mf), + q(0190) => q(pm), + q(0191) => q(vc), + q(0192) => q(ws), + q(0193) => q(sm), + q(0194) => q(st), + q(0195) => q(sa), + q(0196) => q(sn), + q(0197) => q(rs), + q(0198) => q(sc), + q(0199) => q(sl), + q(0200) => q(sg), + q(0201) => q(sx), + q(0202) => q(sk), + q(0203) => q(si), + q(0204) => q(sb), + q(0205) => q(so), + q(0206) => q(za), + q(0207) => q(gs), + q(0208) => q(ss), + q(0209) => q(es), + q(0210) => q(lk), + q(0211) => q(sd), + q(0212) => q(sr), + q(0213) => q(sj), + q(0214) => q(sz), + q(0215) => q(se), + q(0216) => q(ch), + q(0217) => q(sy), + q(0218) => q(tw), + q(0219) => q(tj), + q(0220) => q(tz), + q(0221) => q(th), + q(0222) => q(tl), + q(0223) => q(tg), + q(0224) => q(tk), + q(0225) => q(to), + q(0226) => q(tt), + q(0227) => q(tn), + q(0228) => q(tr), + q(0229) => q(tm), + q(0230) => q(tc), + q(0231) => q(tv), + q(0232) => q(ug), + q(0233) => q(ua), + q(0234) => q(ae), + q(0235) => q(gb), + q(0236) => q(um), + q(0237) => q(us), + q(0238) => q(uy), + q(0239) => q(uz), + q(0240) => q(vu), + q(0241) => q(ve), + q(0242) => q(vn), + q(0243) => q(vg), + q(0244) => q(vi), + q(0245) => q(wf), + q(0246) => q(eh), + q(0247) => q(ye), + q(0248) => q(zm), + q(0249) => q(zw), + }, + q(alpha-3) => { + q(0001) => q(afg), + q(0002) => q(ala), + q(0003) => q(alb), + q(0004) => q(dza), + q(0005) => q(asm), + q(0006) => q(and), + q(0007) => q(ago), + q(0008) => q(aia), + q(0009) => q(ata), + q(0010) => q(atg), + q(0011) => q(arg), + q(0012) => q(arm), + q(0013) => q(abw), + q(0014) => q(aus), + q(0015) => q(aut), + q(0016) => q(aze), + q(0017) => q(bhs), + q(0018) => q(bhr), + q(0019) => q(bgd), + q(0020) => q(brb), + q(0021) => q(blr), + q(0022) => q(bel), + q(0023) => q(blz), + q(0024) => q(ben), + q(0025) => q(bmu), + q(0026) => q(btn), + q(0027) => q(bol), + q(0028) => q(bes), + q(0029) => q(bih), + q(0030) => q(bwa), + q(0031) => q(bvt), + q(0032) => q(bra), + q(0033) => q(iot), + q(0034) => q(brn), + q(0035) => q(bgr), + q(0036) => q(bfa), + q(0037) => q(bdi), + q(0038) => q(cpv), + q(0039) => q(khm), + q(0040) => q(cmr), + q(0041) => q(can), + q(0042) => q(cym), + q(0043) => q(caf), + q(0044) => q(tcd), + q(0045) => q(chl), + q(0046) => q(chn), + q(0047) => q(cxr), + q(0048) => q(cck), + q(0049) => q(col), + q(0050) => q(com), + q(0051) => q(cod), + q(0052) => q(cog), + q(0053) => q(cok), + q(0054) => q(cri), + q(0055) => q(civ), + q(0056) => q(hrv), + q(0057) => q(cub), + q(0058) => q(cuw), + q(0059) => q(cyp), + q(0060) => q(cze), + q(0061) => q(dnk), + q(0062) => q(dji), + q(0063) => q(dma), + q(0064) => q(dom), + q(0065) => q(ecu), + q(0066) => q(egy), + q(0067) => q(slv), + q(0068) => q(gnq), + q(0069) => q(eri), + q(0070) => q(est), + q(0071) => q(eth), + q(0072) => q(flk), + q(0073) => q(fro), + q(0074) => q(fji), + q(0075) => q(fin), + q(0076) => q(fra), + q(0077) => q(guf), + q(0078) => q(pyf), + q(0079) => q(atf), + q(0080) => q(gab), + q(0081) => q(gmb), + q(0082) => q(geo), + q(0083) => q(deu), + q(0084) => q(gha), + q(0085) => q(gib), + q(0086) => q(grc), + q(0087) => q(grl), + q(0088) => q(grd), + q(0089) => q(glp), + q(0090) => q(gum), + q(0091) => q(gtm), + q(0092) => q(ggy), + q(0093) => q(gin), + q(0094) => q(gnb), + q(0095) => q(guy), + q(0096) => q(hti), + q(0097) => q(hmd), + q(0098) => q(vat), + q(0099) => q(hnd), + q(0100) => q(hkg), + q(0101) => q(hun), + q(0102) => q(isl), + q(0103) => q(ind), + q(0104) => q(idn), + q(0105) => q(irn), + q(0106) => q(irq), + q(0107) => q(irl), + q(0108) => q(imn), + q(0109) => q(isr), + q(0110) => q(ita), + q(0111) => q(jam), + q(0112) => q(jpn), + q(0113) => q(jey), + q(0114) => q(jor), + q(0115) => q(kaz), + q(0116) => q(ken), + q(0117) => q(kir), + q(0118) => q(prk), + q(0119) => q(kor), + q(0120) => q(kwt), + q(0121) => q(kgz), + q(0122) => q(lao), + q(0123) => q(lva), + q(0124) => q(lbn), + q(0125) => q(lso), + q(0126) => q(lbr), + q(0127) => q(lby), + q(0128) => q(lie), + q(0129) => q(ltu), + q(0130) => q(lux), + q(0131) => q(mac), + q(0132) => q(mkd), + q(0133) => q(mdg), + q(0134) => q(mwi), + q(0135) => q(mys), + q(0136) => q(mdv), + q(0137) => q(mli), + q(0138) => q(mlt), + q(0139) => q(mhl), + q(0140) => q(mtq), + q(0141) => q(mrt), + q(0142) => q(mus), + q(0143) => q(myt), + q(0144) => q(mex), + q(0145) => q(fsm), + q(0146) => q(mda), + q(0147) => q(mco), + q(0148) => q(mng), + q(0149) => q(mne), + q(0150) => q(msr), + q(0151) => q(mar), + q(0152) => q(moz), + q(0153) => q(mmr), + q(0154) => q(nam), + q(0155) => q(nru), + q(0156) => q(npl), + q(0157) => q(nld), + q(0158) => q(ncl), + q(0159) => q(nzl), + q(0160) => q(nic), + q(0161) => q(ner), + q(0162) => q(nga), + q(0163) => q(niu), + q(0164) => q(nfk), + q(0165) => q(mnp), + q(0166) => q(nor), + q(0167) => q(omn), + q(0168) => q(pak), + q(0169) => q(plw), + q(0170) => q(pse), + q(0171) => q(pan), + q(0172) => q(png), + q(0173) => q(pry), + q(0174) => q(per), + q(0175) => q(phl), + q(0176) => q(pcn), + q(0177) => q(pol), + q(0178) => q(prt), + q(0179) => q(pri), + q(0180) => q(qat), + q(0181) => q(reu), + q(0182) => q(rou), + q(0183) => q(rus), + q(0184) => q(rwa), + q(0185) => q(blm), + q(0186) => q(shn), + q(0187) => q(kna), + q(0188) => q(lca), + q(0189) => q(maf), + q(0190) => q(spm), + q(0191) => q(vct), + q(0192) => q(wsm), + q(0193) => q(smr), + q(0194) => q(stp), + q(0195) => q(sau), + q(0196) => q(sen), + q(0197) => q(srb), + q(0198) => q(syc), + q(0199) => q(sle), + q(0200) => q(sgp), + q(0201) => q(sxm), + q(0202) => q(svk), + q(0203) => q(svn), + q(0204) => q(slb), + q(0205) => q(som), + q(0206) => q(zaf), + q(0207) => q(sgs), + q(0208) => q(ssd), + q(0209) => q(esp), + q(0210) => q(lka), + q(0211) => q(sdn), + q(0212) => q(sur), + q(0213) => q(sjm), + q(0214) => q(swz), + q(0215) => q(swe), + q(0216) => q(che), + q(0217) => q(syr), + q(0218) => q(twn), + q(0219) => q(tjk), + q(0220) => q(tza), + q(0221) => q(tha), + q(0222) => q(tls), + q(0223) => q(tgo), + q(0224) => q(tkl), + q(0225) => q(ton), + q(0226) => q(tto), + q(0227) => q(tun), + q(0228) => q(tur), + q(0229) => q(tkm), + q(0230) => q(tca), + q(0231) => q(tuv), + q(0232) => q(uga), + q(0233) => q(ukr), + q(0234) => q(are), + q(0235) => q(gbr), + q(0236) => q(umi), + q(0237) => q(usa), + q(0238) => q(ury), + q(0239) => q(uzb), + q(0240) => q(vut), + q(0241) => q(ven), + q(0242) => q(vnm), + q(0243) => q(vgb), + q(0244) => q(vir), + q(0245) => q(wlf), + q(0246) => q(esh), + q(0247) => q(yem), + q(0248) => q(zmb), + q(0249) => q(zwe), + }, + q(dom) => { + q(0001) => q(af), + q(0002) => q(ax), + q(0003) => q(al), + q(0004) => q(dz), + q(0005) => q(as), + q(0006) => q(ad), + q(0007) => q(ao), + q(0008) => q(ai), + q(0009) => q(aq), + q(0010) => q(ag), + q(0011) => q(ar), + q(0012) => q(am), + q(0013) => q(aw), + q(0014) => q(au), + q(0015) => q(at), + q(0016) => q(az), + q(0017) => q(bs), + q(0018) => q(bh), + q(0019) => q(bd), + q(0020) => q(bb), + q(0021) => q(by), + q(0022) => q(be), + q(0023) => q(bz), + q(0024) => q(bj), + q(0025) => q(bm), + q(0026) => q(bt), + q(0027) => q(bo), + q(0028) => q(bq), + q(0029) => q(ba), + q(0030) => q(bw), + q(0031) => q(bv), + q(0032) => q(br), + q(0033) => q(io), + q(0034) => q(bn), + q(0035) => q(bg), + q(0036) => q(bf), + q(0037) => q(bi), + q(0038) => q(cv), + q(0039) => q(kh), + q(0040) => q(cm), + q(0041) => q(ca), + q(0042) => q(ky), + q(0043) => q(cf), + q(0044) => q(td), + q(0045) => q(cl), + q(0046) => q(cn), + q(0047) => q(cx), + q(0048) => q(cc), + q(0049) => q(co), + q(0050) => q(km), + q(0051) => q(cd), + q(0052) => q(cg), + q(0053) => q(ck), + q(0054) => q(cr), + q(0055) => q(ci), + q(0056) => q(hr), + q(0057) => q(cu), + q(0058) => q(cw), + q(0059) => q(cy), + q(0060) => q(cz), + q(0061) => q(dk), + q(0062) => q(dj), + q(0063) => q(dm), + q(0064) => q(do), + q(0065) => q(ec), + q(0066) => q(eg), + q(0067) => q(sv), + q(0068) => q(gq), + q(0069) => q(er), + q(0070) => q(ee), + q(0071) => q(et), + q(0072) => q(fk), + q(0073) => q(fo), + q(0074) => q(fj), + q(0075) => q(fi), + q(0076) => q(fr), + q(0077) => q(gf), + q(0078) => q(pf), + q(0079) => q(tf), + q(0080) => q(ga), + q(0081) => q(gm), + q(0082) => q(ge), + q(0083) => q(de), + q(0084) => q(gh), + q(0085) => q(gi), + q(0086) => q(gr), + q(0087) => q(gl), + q(0088) => q(gd), + q(0089) => q(gp), + q(0090) => q(gu), + q(0091) => q(gt), + q(0092) => q(gg), + q(0093) => q(gn), + q(0094) => q(gw), + q(0095) => q(gy), + q(0096) => q(ht), + q(0097) => q(hm), + q(0098) => q(va), + q(0099) => q(hn), + q(0100) => q(hk), + q(0101) => q(hu), + q(0102) => q(is), + q(0103) => q(in), + q(0104) => q(id), + q(0105) => q(ir), + q(0106) => q(iq), + q(0107) => q(ie), + q(0108) => q(im), + q(0109) => q(il), + q(0110) => q(it), + q(0111) => q(jm), + q(0112) => q(jp), + q(0113) => q(je), + q(0114) => q(jo), + q(0115) => q(kz), + q(0116) => q(ke), + q(0117) => q(ki), + q(0118) => q(kp), + q(0119) => q(kr), + q(0120) => q(kw), + q(0121) => q(kg), + q(0122) => q(la), + q(0123) => q(lv), + q(0124) => q(lb), + q(0125) => q(ls), + q(0126) => q(lr), + q(0127) => q(ly), + q(0128) => q(li), + q(0129) => q(lt), + q(0130) => q(lu), + q(0131) => q(mo), + q(0132) => q(mk), + q(0133) => q(mg), + q(0134) => q(mw), + q(0135) => q(my), + q(0136) => q(mv), + q(0137) => q(ml), + q(0138) => q(mt), + q(0139) => q(mh), + q(0140) => q(mq), + q(0141) => q(mr), + q(0142) => q(mu), + q(0143) => q(yt), + q(0144) => q(mx), + q(0145) => q(fm), + q(0146) => q(md), + q(0147) => q(mc), + q(0148) => q(mn), + q(0149) => q(me), + q(0150) => q(ms), + q(0151) => q(ma), + q(0152) => q(mz), + q(0153) => q(mm), + q(0154) => q(na), + q(0155) => q(nr), + q(0156) => q(np), + q(0157) => q(nl), + q(0158) => q(nc), + q(0159) => q(nz), + q(0160) => q(ni), + q(0161) => q(ne), + q(0162) => q(ng), + q(0163) => q(nu), + q(0164) => q(nf), + q(0165) => q(mp), + q(0166) => q(no), + q(0167) => q(om), + q(0168) => q(pk), + q(0169) => q(pw), + q(0170) => q(ps), + q(0171) => q(pa), + q(0172) => q(pg), + q(0173) => q(py), + q(0174) => q(pe), + q(0175) => q(ph), + q(0176) => q(pn), + q(0177) => q(pl), + q(0178) => q(pt), + q(0179) => q(pr), + q(0180) => q(qa), + q(0181) => q(re), + q(0182) => q(ro), + q(0183) => q(ru), + q(0184) => q(rw), + q(0185) => q(bl), + q(0186) => q(sh), + q(0187) => q(kn), + q(0188) => q(lc), + q(0189) => q(mf), + q(0190) => q(pm), + q(0191) => q(vc), + q(0192) => q(ws), + q(0193) => q(sm), + q(0194) => q(st), + q(0195) => q(sa), + q(0196) => q(sn), + q(0197) => q(rs), + q(0198) => q(sc), + q(0199) => q(sl), + q(0200) => q(sg), + q(0201) => q(sx), + q(0202) => q(sk), + q(0203) => q(si), + q(0204) => q(sb), + q(0205) => q(so), + q(0206) => q(za), + q(0207) => q(gs), + q(0208) => q(ss), + q(0209) => q(es), + q(0210) => q(lk), + q(0211) => q(sd), + q(0212) => q(sr), + q(0213) => q(sj), + q(0214) => q(sz), + q(0215) => q(se), + q(0216) => q(ch), + q(0217) => q(sy), + q(0218) => q(tw), + q(0219) => q(tj), + q(0220) => q(tz), + q(0221) => q(th), + q(0222) => q(tl), + q(0223) => q(tg), + q(0224) => q(tk), + q(0225) => q(to), + q(0226) => q(tt), + q(0227) => q(tn), + q(0228) => q(tr), + q(0229) => q(tm), + q(0230) => q(tc), + q(0231) => q(tv), + q(0232) => q(ug), + q(0233) => q(ua), + q(0234) => q(ae), + q(0235) => q(gb), + q(0236) => q(um), + q(0237) => q(us), + q(0238) => q(uy), + q(0239) => q(uz), + q(0240) => q(vu), + q(0241) => q(ve), + q(0242) => q(vn), + q(0243) => q(vg), + q(0244) => q(vi), + q(0245) => q(wf), + q(0246) => q(eh), + q(0247) => q(ye), + q(0248) => q(zm), + q(0249) => q(zw), + }, + q(genc-alpha-2) => { + q(0001) => q(AF), + q(0003) => q(AL), + q(0004) => q(DZ), + q(0005) => q(AS), + q(0006) => q(AD), + q(0007) => q(AO), + q(0008) => q(AI), + q(0009) => q(AQ), + q(0010) => q(AG), + q(0011) => q(AR), + q(0012) => q(AM), + q(0013) => q(AW), + q(0014) => q(AU), + q(0015) => q(AT), + q(0016) => q(AZ), + q(0017) => q(BS), + q(0018) => q(BH), + q(0019) => q(BD), + q(0020) => q(BB), + q(0021) => q(BY), + q(0022) => q(BE), + q(0023) => q(BZ), + q(0024) => q(BJ), + q(0025) => q(BM), + q(0026) => q(BT), + q(0027) => q(BO), + q(0028) => q(BQ), + q(0029) => q(BA), + q(0030) => q(BW), + q(0031) => q(BV), + q(0032) => q(BR), + q(0033) => q(IO), + q(0034) => q(BN), + q(0035) => q(BG), + q(0036) => q(BF), + q(0037) => q(BI), + q(0038) => q(CV), + q(0039) => q(KH), + q(0040) => q(CM), + q(0041) => q(CA), + q(0042) => q(KY), + q(0043) => q(CF), + q(0044) => q(TD), + q(0045) => q(CL), + q(0046) => q(CN), + q(0047) => q(CX), + q(0048) => q(CC), + q(0049) => q(CO), + q(0050) => q(KM), + q(0051) => q(CD), + q(0052) => q(CG), + q(0053) => q(CK), + q(0054) => q(CR), + q(0055) => q(CI), + q(0056) => q(HR), + q(0057) => q(CU), + q(0058) => q(CW), + q(0059) => q(CY), + q(0060) => q(CZ), + q(0061) => q(DK), + q(0062) => q(DJ), + q(0063) => q(DM), + q(0064) => q(DO), + q(0065) => q(EC), + q(0066) => q(EG), + q(0067) => q(SV), + q(0068) => q(GQ), + q(0069) => q(ER), + q(0070) => q(EE), + q(0071) => q(ET), + q(0072) => q(FK), + q(0073) => q(FO), + q(0074) => q(FJ), + q(0075) => q(FI), + q(0076) => q(FR), + q(0077) => q(GF), + q(0078) => q(PF), + q(0079) => q(TF), + q(0080) => q(GA), + q(0081) => q(GM), + q(0082) => q(GE), + q(0083) => q(DE), + q(0084) => q(GH), + q(0085) => q(GI), + q(0086) => q(GR), + q(0087) => q(GL), + q(0088) => q(GD), + q(0089) => q(GP), + q(0090) => q(GU), + q(0091) => q(GT), + q(0092) => q(GG), + q(0093) => q(GN), + q(0094) => q(GW), + q(0095) => q(GY), + q(0096) => q(HT), + q(0097) => q(HM), + q(0098) => q(VA), + q(0099) => q(HN), + q(0100) => q(HK), + q(0101) => q(HU), + q(0102) => q(IS), + q(0103) => q(IN), + q(0104) => q(ID), + q(0105) => q(IR), + q(0106) => q(IQ), + q(0107) => q(IE), + q(0108) => q(IM), + q(0109) => q(IL), + q(0110) => q(IT), + q(0111) => q(JM), + q(0112) => q(JP), + q(0113) => q(JE), + q(0114) => q(JO), + q(0115) => q(KZ), + q(0116) => q(KE), + q(0117) => q(KI), + q(0118) => q(KP), + q(0119) => q(KR), + q(0120) => q(KW), + q(0121) => q(KG), + q(0122) => q(LA), + q(0123) => q(LV), + q(0124) => q(LB), + q(0125) => q(LS), + q(0126) => q(LR), + q(0127) => q(LY), + q(0128) => q(LI), + q(0129) => q(LT), + q(0130) => q(LU), + q(0131) => q(MO), + q(0132) => q(MK), + q(0133) => q(MG), + q(0134) => q(MW), + q(0135) => q(MY), + q(0136) => q(MV), + q(0137) => q(ML), + q(0138) => q(MT), + q(0139) => q(MH), + q(0140) => q(MQ), + q(0141) => q(MR), + q(0142) => q(MU), + q(0143) => q(YT), + q(0144) => q(MX), + q(0145) => q(FM), + q(0146) => q(MD), + q(0147) => q(MC), + q(0148) => q(MN), + q(0149) => q(ME), + q(0150) => q(MS), + q(0151) => q(MA), + q(0152) => q(MZ), + q(0153) => q(MM), + q(0154) => q(NA), + q(0155) => q(NR), + q(0156) => q(NP), + q(0157) => q(NL), + q(0158) => q(NC), + q(0159) => q(NZ), + q(0160) => q(NI), + q(0161) => q(NE), + q(0162) => q(NG), + q(0163) => q(NU), + q(0164) => q(NF), + q(0165) => q(MP), + q(0166) => q(NO), + q(0167) => q(OM), + q(0168) => q(PK), + q(0169) => q(PW), + q(0171) => q(PA), + q(0172) => q(PG), + q(0173) => q(PY), + q(0174) => q(PE), + q(0175) => q(PH), + q(0176) => q(PN), + q(0177) => q(PL), + q(0178) => q(PT), + q(0179) => q(PR), + q(0180) => q(QA), + q(0181) => q(RE), + q(0182) => q(RO), + q(0183) => q(RU), + q(0184) => q(RW), + q(0185) => q(BL), + q(0186) => q(SH), + q(0187) => q(KN), + q(0188) => q(LC), + q(0189) => q(MF), + q(0190) => q(PM), + q(0191) => q(VC), + q(0192) => q(WS), + q(0193) => q(SM), + q(0194) => q(ST), + q(0195) => q(SA), + q(0196) => q(SN), + q(0197) => q(RS), + q(0198) => q(SC), + q(0199) => q(SL), + q(0200) => q(SG), + q(0201) => q(SX), + q(0202) => q(SK), + q(0203) => q(SI), + q(0204) => q(SB), + q(0205) => q(SO), + q(0206) => q(ZA), + q(0207) => q(GS), + q(0208) => q(SS), + q(0209) => q(ES), + q(0210) => q(LK), + q(0211) => q(SD), + q(0212) => q(SR), + q(0214) => q(SZ), + q(0215) => q(SE), + q(0216) => q(CH), + q(0217) => q(SY), + q(0218) => q(TW), + q(0219) => q(TJ), + q(0220) => q(TZ), + q(0221) => q(TH), + q(0222) => q(TL), + q(0223) => q(TG), + q(0224) => q(TK), + q(0225) => q(TO), + q(0226) => q(TT), + q(0227) => q(TN), + q(0228) => q(TR), + q(0229) => q(TM), + q(0230) => q(TC), + q(0231) => q(TV), + q(0232) => q(UG), + q(0233) => q(UA), + q(0234) => q(AE), + q(0235) => q(GB), + q(0237) => q(US), + q(0238) => q(UY), + q(0239) => q(UZ), + q(0240) => q(VU), + q(0241) => q(VE), + q(0242) => q(VN), + q(0243) => q(VG), + q(0244) => q(VI), + q(0245) => q(WF), + q(0246) => q(EH), + q(0247) => q(YE), + q(0248) => q(ZM), + q(0249) => q(ZW), + q(0251) => q(QZ), + q(0252) => q(XA), + q(0253) => q(XB), + q(0254) => q(QS), + q(0255) => q(CP), + q(0256) => q(XC), + q(0257) => q(XD), + q(0258) => q(DG), + q(0259) => q(XE), + q(0260) => q(XG), + q(0261) => q(QX), + q(0262) => q(A2), + q(0263) => q(XH), + q(0264) => q(XJ), + q(0265) => q(XQ), + q(0266) => q(XU), + q(0267) => q(QU), + q(0268) => q(XM), + q(0269) => q(XK), + q(0270) => q(QM), + q(0271) => q(XV), + q(0272) => q(XL), + q(0273) => q(XP), + q(0274) => q(XS), + q(0275) => q(XR), + q(0276) => q(XT), + q(0277) => q(A1), + q(0278) => q(QW), + q(0279) => q(XW), + }, + q(genc-alpha-3) => { + q(0001) => q(AFG), + q(0003) => q(ALB), + q(0004) => q(DZA), + q(0005) => q(ASM), + q(0006) => q(AND), + q(0007) => q(AGO), + q(0008) => q(AIA), + q(0009) => q(ATA), + q(0010) => q(ATG), + q(0011) => q(ARG), + q(0012) => q(ARM), + q(0013) => q(ABW), + q(0014) => q(AUS), + q(0015) => q(AUT), + q(0016) => q(AZE), + q(0017) => q(BHS), + q(0018) => q(BHR), + q(0019) => q(BGD), + q(0020) => q(BRB), + q(0021) => q(BLR), + q(0022) => q(BEL), + q(0023) => q(BLZ), + q(0024) => q(BEN), + q(0025) => q(BMU), + q(0026) => q(BTN), + q(0027) => q(BOL), + q(0028) => q(BES), + q(0029) => q(BIH), + q(0030) => q(BWA), + q(0031) => q(BVT), + q(0032) => q(BRA), + q(0033) => q(IOT), + q(0034) => q(BRN), + q(0035) => q(BGR), + q(0036) => q(BFA), + q(0037) => q(BDI), + q(0038) => q(CPV), + q(0039) => q(KHM), + q(0040) => q(CMR), + q(0041) => q(CAN), + q(0042) => q(CYM), + q(0043) => q(CAF), + q(0044) => q(TCD), + q(0045) => q(CHL), + q(0046) => q(CHN), + q(0047) => q(CXR), + q(0048) => q(CCK), + q(0049) => q(COL), + q(0050) => q(COM), + q(0051) => q(COD), + q(0052) => q(COG), + q(0053) => q(COK), + q(0054) => q(CRI), + q(0055) => q(CIV), + q(0056) => q(HRV), + q(0057) => q(CUB), + q(0058) => q(CUW), + q(0059) => q(CYP), + q(0060) => q(CZE), + q(0061) => q(DNK), + q(0062) => q(DJI), + q(0063) => q(DMA), + q(0064) => q(DOM), + q(0065) => q(ECU), + q(0066) => q(EGY), + q(0067) => q(SLV), + q(0068) => q(GNQ), + q(0069) => q(ERI), + q(0070) => q(EST), + q(0071) => q(ETH), + q(0072) => q(FLK), + q(0073) => q(FRO), + q(0074) => q(FJI), + q(0075) => q(FIN), + q(0076) => q(FRA), + q(0077) => q(GUF), + q(0078) => q(PYF), + q(0079) => q(ATF), + q(0080) => q(GAB), + q(0081) => q(GMB), + q(0082) => q(GEO), + q(0083) => q(DEU), + q(0084) => q(GHA), + q(0085) => q(GIB), + q(0086) => q(GRC), + q(0087) => q(GRL), + q(0088) => q(GRD), + q(0089) => q(GLP), + q(0090) => q(GUM), + q(0091) => q(GTM), + q(0092) => q(GGY), + q(0093) => q(GIN), + q(0094) => q(GNB), + q(0095) => q(GUY), + q(0096) => q(HTI), + q(0097) => q(HMD), + q(0098) => q(VAT), + q(0099) => q(HND), + q(0100) => q(HKG), + q(0101) => q(HUN), + q(0102) => q(ISL), + q(0103) => q(IND), + q(0104) => q(IDN), + q(0105) => q(IRN), + q(0106) => q(IRQ), + q(0107) => q(IRL), + q(0108) => q(IMN), + q(0109) => q(ISR), + q(0110) => q(ITA), + q(0111) => q(JAM), + q(0112) => q(JPN), + q(0113) => q(JEY), + q(0114) => q(JOR), + q(0115) => q(KAZ), + q(0116) => q(KEN), + q(0117) => q(KIR), + q(0118) => q(PRK), + q(0119) => q(KOR), + q(0120) => q(KWT), + q(0121) => q(KGZ), + q(0122) => q(LAO), + q(0123) => q(LVA), + q(0124) => q(LBN), + q(0125) => q(LSO), + q(0126) => q(LBR), + q(0127) => q(LBY), + q(0128) => q(LIE), + q(0129) => q(LTU), + q(0130) => q(LUX), + q(0131) => q(MAC), + q(0132) => q(MKD), + q(0133) => q(MDG), + q(0134) => q(MWI), + q(0135) => q(MYS), + q(0136) => q(MDV), + q(0137) => q(MLI), + q(0138) => q(MLT), + q(0139) => q(MHL), + q(0140) => q(MTQ), + q(0141) => q(MRT), + q(0142) => q(MUS), + q(0143) => q(MYT), + q(0144) => q(MEX), + q(0145) => q(FSM), + q(0146) => q(MDA), + q(0147) => q(MCO), + q(0148) => q(MNG), + q(0149) => q(MNE), + q(0150) => q(MSR), + q(0151) => q(MAR), + q(0152) => q(MOZ), + q(0153) => q(MMR), + q(0154) => q(NAM), + q(0155) => q(NRU), + q(0156) => q(NPL), + q(0157) => q(NLD), + q(0158) => q(NCL), + q(0159) => q(NZL), + q(0160) => q(NIC), + q(0161) => q(NER), + q(0162) => q(NGA), + q(0163) => q(NIU), + q(0164) => q(NFK), + q(0165) => q(MNP), + q(0166) => q(NOR), + q(0167) => q(OMN), + q(0168) => q(PAK), + q(0169) => q(PLW), + q(0171) => q(PAN), + q(0172) => q(PNG), + q(0173) => q(PRY), + q(0174) => q(PER), + q(0175) => q(PHL), + q(0176) => q(PCN), + q(0177) => q(POL), + q(0178) => q(PRT), + q(0179) => q(PRI), + q(0180) => q(QAT), + q(0181) => q(REU), + q(0182) => q(ROU), + q(0183) => q(RUS), + q(0184) => q(RWA), + q(0185) => q(BLM), + q(0186) => q(SHN), + q(0187) => q(KNA), + q(0188) => q(LCA), + q(0189) => q(MAF), + q(0190) => q(SPM), + q(0191) => q(VCT), + q(0192) => q(WSM), + q(0193) => q(SMR), + q(0194) => q(STP), + q(0195) => q(SAU), + q(0196) => q(SEN), + q(0197) => q(SRB), + q(0198) => q(SYC), + q(0199) => q(SLE), + q(0200) => q(SGP), + q(0201) => q(SXM), + q(0202) => q(SVK), + q(0203) => q(SVN), + q(0204) => q(SLB), + q(0205) => q(SOM), + q(0206) => q(ZAF), + q(0207) => q(SGS), + q(0208) => q(SSD), + q(0209) => q(ESP), + q(0210) => q(LKA), + q(0211) => q(SDN), + q(0212) => q(SUR), + q(0214) => q(SWZ), + q(0215) => q(SWE), + q(0216) => q(CHE), + q(0217) => q(SYR), + q(0218) => q(TWN), + q(0219) => q(TJK), + q(0220) => q(TZA), + q(0221) => q(THA), + q(0222) => q(TLS), + q(0223) => q(TGO), + q(0224) => q(TKL), + q(0225) => q(TON), + q(0226) => q(TTO), + q(0227) => q(TUN), + q(0228) => q(TUR), + q(0229) => q(TKM), + q(0230) => q(TCA), + q(0231) => q(TUV), + q(0232) => q(UGA), + q(0233) => q(UKR), + q(0234) => q(ARE), + q(0235) => q(GBR), + q(0237) => q(USA), + q(0238) => q(URY), + q(0239) => q(UZB), + q(0240) => q(VUT), + q(0241) => q(VEN), + q(0242) => q(VNM), + q(0243) => q(VGB), + q(0244) => q(VIR), + q(0245) => q(WLF), + q(0246) => q(ESH), + q(0247) => q(YEM), + q(0248) => q(ZMB), + q(0249) => q(ZWE), + q(0251) => q(XQZ), + q(0252) => q(XAC), + q(0253) => q(XBK), + q(0254) => q(XBI), + q(0255) => q(CPT), + q(0256) => q(XCS), + q(0257) => q(XXD), + q(0258) => q(DGA), + q(0259) => q(XEU), + q(0260) => q(XGZ), + q(0261) => q(XGL), + q(0262) => q(AX2), + q(0263) => q(XHO), + q(0264) => q(XJM), + q(0265) => q(XJV), + q(0266) => q(XJA), + q(0267) => q(XJN), + q(0268) => q(XKR), + q(0269) => q(XKS), + q(0270) => q(XMW), + q(0271) => q(XNV), + q(0272) => q(XPL), + q(0273) => q(XPR), + q(0274) => q(XSP), + q(0275) => q(XSV), + q(0276) => q(XTR), + q(0277) => q(AX1), + q(0278) => q(XWK), + q(0279) => q(XWB), + }, + q(genc-numeric) => { + q(0001) => q(004), + q(0003) => q(008), + q(0004) => q(012), + q(0005) => q(016), + q(0006) => q(020), + q(0007) => q(024), + q(0008) => q(660), + q(0009) => q(010), + q(0010) => q(028), + q(0011) => q(032), + q(0012) => q(051), + q(0013) => q(533), + q(0014) => q(036), + q(0015) => q(040), + q(0016) => q(031), + q(0017) => q(044), + q(0018) => q(048), + q(0019) => q(050), + q(0020) => q(052), + q(0021) => q(112), + q(0022) => q(056), + q(0023) => q(084), + q(0024) => q(204), + q(0025) => q(060), + q(0026) => q(064), + q(0027) => q(068), + q(0028) => q(535), + q(0029) => q(070), + q(0030) => q(072), + q(0031) => q(074), + q(0032) => q(076), + q(0033) => q(086), + q(0034) => q(096), + q(0035) => q(100), + q(0036) => q(854), + q(0037) => q(108), + q(0038) => q(132), + q(0039) => q(116), + q(0040) => q(120), + q(0041) => q(124), + q(0042) => q(136), + q(0043) => q(140), + q(0044) => q(148), + q(0045) => q(152), + q(0046) => q(156), + q(0047) => q(162), + q(0048) => q(166), + q(0049) => q(170), + q(0050) => q(174), + q(0051) => q(180), + q(0052) => q(178), + q(0053) => q(184), + q(0054) => q(188), + q(0055) => q(384), + q(0056) => q(191), + q(0057) => q(192), + q(0058) => q(531), + q(0059) => q(196), + q(0060) => q(203), + q(0061) => q(208), + q(0062) => q(262), + q(0063) => q(212), + q(0064) => q(214), + q(0065) => q(218), + q(0066) => q(818), + q(0067) => q(222), + q(0068) => q(226), + q(0069) => q(232), + q(0070) => q(233), + q(0071) => q(231), + q(0072) => q(238), + q(0073) => q(234), + q(0074) => q(242), + q(0075) => q(246), + q(0076) => q(250), + q(0077) => q(254), + q(0078) => q(258), + q(0079) => q(260), + q(0080) => q(266), + q(0081) => q(270), + q(0082) => q(268), + q(0083) => q(276), + q(0084) => q(288), + q(0085) => q(292), + q(0086) => q(300), + q(0087) => q(304), + q(0088) => q(308), + q(0089) => q(312), + q(0090) => q(316), + q(0091) => q(320), + q(0092) => q(831), + q(0093) => q(324), + q(0094) => q(624), + q(0095) => q(328), + q(0096) => q(332), + q(0097) => q(334), + q(0098) => q(336), + q(0099) => q(340), + q(0100) => q(344), + q(0101) => q(348), + q(0102) => q(352), + q(0103) => q(356), + q(0104) => q(360), + q(0105) => q(364), + q(0106) => q(368), + q(0107) => q(372), + q(0108) => q(833), + q(0109) => q(376), + q(0110) => q(380), + q(0111) => q(388), + q(0112) => q(392), + q(0113) => q(832), + q(0114) => q(400), + q(0115) => q(398), + q(0116) => q(404), + q(0117) => q(296), + q(0118) => q(408), + q(0119) => q(410), + q(0120) => q(414), + q(0121) => q(417), + q(0122) => q(418), + q(0123) => q(428), + q(0124) => q(422), + q(0125) => q(426), + q(0126) => q(430), + q(0127) => q(434), + q(0128) => q(438), + q(0129) => q(440), + q(0130) => q(442), + q(0131) => q(446), + q(0132) => q(807), + q(0133) => q(450), + q(0134) => q(454), + q(0135) => q(458), + q(0136) => q(462), + q(0137) => q(466), + q(0138) => q(470), + q(0139) => q(584), + q(0140) => q(474), + q(0141) => q(478), + q(0142) => q(480), + q(0143) => q(175), + q(0144) => q(484), + q(0145) => q(583), + q(0146) => q(498), + q(0147) => q(492), + q(0148) => q(496), + q(0149) => q(499), + q(0150) => q(500), + q(0151) => q(504), + q(0152) => q(508), + q(0153) => q(104), + q(0154) => q(516), + q(0155) => q(520), + q(0156) => q(524), + q(0157) => q(528), + q(0158) => q(540), + q(0159) => q(554), + q(0160) => q(558), + q(0161) => q(562), + q(0162) => q(566), + q(0163) => q(570), + q(0164) => q(574), + q(0165) => q(580), + q(0166) => q(578), + q(0167) => q(512), + q(0168) => q(586), + q(0169) => q(585), + q(0171) => q(591), + q(0172) => q(598), + q(0173) => q(600), + q(0174) => q(604), + q(0175) => q(608), + q(0176) => q(612), + q(0177) => q(616), + q(0178) => q(620), + q(0179) => q(630), + q(0180) => q(634), + q(0181) => q(638), + q(0182) => q(642), + q(0183) => q(643), + q(0184) => q(646), + q(0185) => q(652), + q(0186) => q(654), + q(0187) => q(659), + q(0188) => q(662), + q(0189) => q(663), + q(0190) => q(666), + q(0191) => q(670), + q(0192) => q(882), + q(0193) => q(674), + q(0194) => q(678), + q(0195) => q(682), + q(0196) => q(686), + q(0197) => q(688), + q(0198) => q(690), + q(0199) => q(694), + q(0200) => q(702), + q(0201) => q(534), + q(0202) => q(703), + q(0203) => q(705), + q(0204) => q(090), + q(0205) => q(706), + q(0206) => q(710), + q(0207) => q(239), + q(0208) => q(728), + q(0209) => q(724), + q(0210) => q(144), + q(0211) => q(729), + q(0212) => q(740), + q(0214) => q(748), + q(0215) => q(752), + q(0216) => q(756), + q(0217) => q(760), + q(0218) => q(158), + q(0219) => q(762), + q(0220) => q(834), + q(0221) => q(764), + q(0222) => q(626), + q(0223) => q(768), + q(0224) => q(772), + q(0225) => q(776), + q(0226) => q(780), + q(0227) => q(788), + q(0228) => q(792), + q(0229) => q(795), + q(0230) => q(796), + q(0231) => q(798), + q(0232) => q(800), + q(0233) => q(804), + q(0234) => q(784), + q(0235) => q(826), + q(0237) => q(840), + q(0238) => q(858), + q(0239) => q(860), + q(0240) => q(548), + q(0241) => q(862), + q(0242) => q(704), + q(0243) => q(092), + q(0244) => q(850), + q(0245) => q(876), + q(0246) => q(732), + q(0247) => q(887), + q(0248) => q(894), + q(0249) => q(716), + q(0251) => q(900), + q(0252) => q(902), + q(0253) => q(903), + q(0254) => q(904), + q(0255) => q(905), + q(0256) => q(906), + q(0257) => q(907), + q(0258) => q(908), + q(0259) => q(915), + q(0260) => q(916), + q(0261) => q(917), + q(0262) => q(918), + q(0263) => q(919), + q(0264) => q(920), + q(0265) => q(921), + q(0266) => q(922), + q(0267) => q(923), + q(0268) => q(924), + q(0269) => q(901), + q(0270) => q(925), + q(0271) => q(926), + q(0272) => q(927), + q(0273) => q(928), + q(0274) => q(929), + q(0275) => q(930), + q(0276) => q(931), + q(0277) => q(932), + q(0278) => q(933), + q(0279) => q(934), + }, + q(numeric) => { + q(0001) => q(004), + q(0002) => q(248), + q(0003) => q(008), + q(0004) => q(012), + q(0005) => q(016), + q(0006) => q(020), + q(0007) => q(024), + q(0008) => q(660), + q(0009) => q(010), + q(0010) => q(028), + q(0011) => q(032), + q(0012) => q(051), + q(0013) => q(533), + q(0014) => q(036), + q(0015) => q(040), + q(0016) => q(031), + q(0017) => q(044), + q(0018) => q(048), + q(0019) => q(050), + q(0020) => q(052), + q(0021) => q(112), + q(0022) => q(056), + q(0023) => q(084), + q(0024) => q(204), + q(0025) => q(060), + q(0026) => q(064), + q(0027) => q(068), + q(0028) => q(535), + q(0029) => q(070), + q(0030) => q(072), + q(0031) => q(074), + q(0032) => q(076), + q(0033) => q(086), + q(0034) => q(096), + q(0035) => q(100), + q(0036) => q(854), + q(0037) => q(108), + q(0038) => q(132), + q(0039) => q(116), + q(0040) => q(120), + q(0041) => q(124), + q(0042) => q(136), + q(0043) => q(140), + q(0044) => q(148), + q(0045) => q(152), + q(0046) => q(156), + q(0047) => q(162), + q(0048) => q(166), + q(0049) => q(170), + q(0050) => q(174), + q(0051) => q(180), + q(0052) => q(178), + q(0053) => q(184), + q(0054) => q(188), + q(0055) => q(384), + q(0056) => q(191), + q(0057) => q(192), + q(0058) => q(531), + q(0059) => q(196), + q(0060) => q(203), + q(0061) => q(208), + q(0062) => q(262), + q(0063) => q(212), + q(0064) => q(214), + q(0065) => q(218), + q(0066) => q(818), + q(0067) => q(222), + q(0068) => q(226), + q(0069) => q(232), + q(0070) => q(233), + q(0071) => q(231), + q(0072) => q(238), + q(0073) => q(234), + q(0074) => q(242), + q(0075) => q(246), + q(0076) => q(250), + q(0077) => q(254), + q(0078) => q(258), + q(0079) => q(260), + q(0080) => q(266), + q(0081) => q(270), + q(0082) => q(268), + q(0083) => q(276), + q(0084) => q(288), + q(0085) => q(292), + q(0086) => q(300), + q(0087) => q(304), + q(0088) => q(308), + q(0089) => q(312), + q(0090) => q(316), + q(0091) => q(320), + q(0092) => q(831), + q(0093) => q(324), + q(0094) => q(624), + q(0095) => q(328), + q(0096) => q(332), + q(0097) => q(334), + q(0098) => q(336), + q(0099) => q(340), + q(0100) => q(344), + q(0101) => q(348), + q(0102) => q(352), + q(0103) => q(356), + q(0104) => q(360), + q(0105) => q(364), + q(0106) => q(368), + q(0107) => q(372), + q(0108) => q(833), + q(0109) => q(376), + q(0110) => q(380), + q(0111) => q(388), + q(0112) => q(392), + q(0113) => q(832), + q(0114) => q(400), + q(0115) => q(398), + q(0116) => q(404), + q(0117) => q(296), + q(0118) => q(408), + q(0119) => q(410), + q(0120) => q(414), + q(0121) => q(417), + q(0122) => q(418), + q(0123) => q(428), + q(0124) => q(422), + q(0125) => q(426), + q(0126) => q(430), + q(0127) => q(434), + q(0128) => q(438), + q(0129) => q(440), + q(0130) => q(442), + q(0131) => q(446), + q(0132) => q(807), + q(0133) => q(450), + q(0134) => q(454), + q(0135) => q(458), + q(0136) => q(462), + q(0137) => q(466), + q(0138) => q(470), + q(0139) => q(584), + q(0140) => q(474), + q(0141) => q(478), + q(0142) => q(480), + q(0143) => q(175), + q(0144) => q(484), + q(0145) => q(583), + q(0146) => q(498), + q(0147) => q(492), + q(0148) => q(496), + q(0149) => q(499), + q(0150) => q(500), + q(0151) => q(504), + q(0152) => q(508), + q(0153) => q(104), + q(0154) => q(516), + q(0155) => q(520), + q(0156) => q(524), + q(0157) => q(528), + q(0158) => q(540), + q(0159) => q(554), + q(0160) => q(558), + q(0161) => q(562), + q(0162) => q(566), + q(0163) => q(570), + q(0164) => q(574), + q(0165) => q(580), + q(0166) => q(578), + q(0167) => q(512), + q(0168) => q(586), + q(0169) => q(585), + q(0170) => q(275), + q(0171) => q(591), + q(0172) => q(598), + q(0173) => q(600), + q(0174) => q(604), + q(0175) => q(608), + q(0176) => q(612), + q(0177) => q(616), + q(0178) => q(620), + q(0179) => q(630), + q(0180) => q(634), + q(0181) => q(638), + q(0182) => q(642), + q(0183) => q(643), + q(0184) => q(646), + q(0185) => q(652), + q(0186) => q(654), + q(0187) => q(659), + q(0188) => q(662), + q(0189) => q(663), + q(0190) => q(666), + q(0191) => q(670), + q(0192) => q(882), + q(0193) => q(674), + q(0194) => q(678), + q(0195) => q(682), + q(0196) => q(686), + q(0197) => q(688), + q(0198) => q(690), + q(0199) => q(694), + q(0200) => q(702), + q(0201) => q(534), + q(0202) => q(703), + q(0203) => q(705), + q(0204) => q(090), + q(0205) => q(706), + q(0206) => q(710), + q(0207) => q(239), + q(0208) => q(728), + q(0209) => q(724), + q(0210) => q(144), + q(0211) => q(729), + q(0212) => q(740), + q(0213) => q(744), + q(0214) => q(748), + q(0215) => q(752), + q(0216) => q(756), + q(0217) => q(760), + q(0218) => q(158), + q(0219) => q(762), + q(0220) => q(834), + q(0221) => q(764), + q(0222) => q(626), + q(0223) => q(768), + q(0224) => q(772), + q(0225) => q(776), + q(0226) => q(780), + q(0227) => q(788), + q(0228) => q(792), + q(0229) => q(795), + q(0230) => q(796), + q(0231) => q(798), + q(0232) => q(800), + q(0233) => q(804), + q(0234) => q(784), + q(0235) => q(826), + q(0236) => q(581), + q(0237) => q(840), + q(0238) => q(858), + q(0239) => q(860), + q(0240) => q(548), + q(0241) => q(862), + q(0242) => q(704), + q(0243) => q(092), + q(0244) => q(850), + q(0245) => q(876), + q(0246) => q(732), + q(0247) => q(887), + q(0248) => q(894), + q(0249) => q(716), + }, + q(un-alpha-3) => { + q(0001) => q(AFG), + q(0002) => q(ALA), + q(0003) => q(ALB), + q(0004) => q(DZA), + q(0005) => q(ASM), + q(0006) => q(AND), + q(0007) => q(AGO), + q(0008) => q(AIA), + q(0009) => q(ATA), + q(0010) => q(ATG), + q(0011) => q(ARG), + q(0012) => q(ARM), + q(0013) => q(ABW), + q(0014) => q(AUS), + q(0015) => q(AUT), + q(0016) => q(AZE), + q(0017) => q(BHS), + q(0018) => q(BHR), + q(0019) => q(BGD), + q(0020) => q(BRB), + q(0021) => q(BLR), + q(0022) => q(BEL), + q(0023) => q(BLZ), + q(0024) => q(BEN), + q(0025) => q(BMU), + q(0026) => q(BTN), + q(0027) => q(BOL), + q(0028) => q(BES), + q(0029) => q(BIH), + q(0030) => q(BWA), + q(0031) => q(BVT), + q(0032) => q(BRA), + q(0033) => q(IOT), + q(0034) => q(BRN), + q(0035) => q(BGR), + q(0036) => q(BFA), + q(0037) => q(BDI), + q(0038) => q(CPV), + q(0039) => q(KHM), + q(0040) => q(CMR), + q(0041) => q(CAN), + q(0042) => q(CYM), + q(0043) => q(CAF), + q(0044) => q(TCD), + q(0045) => q(CHL), + q(0046) => q(CHN), + q(0047) => q(CXR), + q(0048) => q(CCK), + q(0049) => q(COL), + q(0050) => q(COM), + q(0051) => q(COD), + q(0052) => q(COG), + q(0053) => q(COK), + q(0054) => q(CRI), + q(0055) => q(CIV), + q(0056) => q(HRV), + q(0057) => q(CUB), + q(0058) => q(CUW), + q(0059) => q(CYP), + q(0060) => q(CZE), + q(0061) => q(DNK), + q(0062) => q(DJI), + q(0063) => q(DMA), + q(0064) => q(DOM), + q(0065) => q(ECU), + q(0066) => q(EGY), + q(0067) => q(SLV), + q(0068) => q(GNQ), + q(0069) => q(ERI), + q(0070) => q(EST), + q(0071) => q(ETH), + q(0072) => q(FLK), + q(0073) => q(FRO), + q(0074) => q(FJI), + q(0075) => q(FIN), + q(0076) => q(FRA), + q(0077) => q(GUF), + q(0078) => q(PYF), + q(0079) => q(ATF), + q(0080) => q(GAB), + q(0081) => q(GMB), + q(0082) => q(GEO), + q(0083) => q(DEU), + q(0084) => q(GHA), + q(0085) => q(GIB), + q(0086) => q(GRC), + q(0087) => q(GRL), + q(0088) => q(GRD), + q(0089) => q(GLP), + q(0090) => q(GUM), + q(0091) => q(GTM), + q(0092) => q(GGY), + q(0093) => q(GIN), + q(0094) => q(GNB), + q(0095) => q(GUY), + q(0096) => q(HTI), + q(0097) => q(HMD), + q(0098) => q(VAT), + q(0099) => q(HND), + q(0100) => q(HKG), + q(0101) => q(HUN), + q(0102) => q(ISL), + q(0103) => q(IND), + q(0104) => q(IDN), + q(0105) => q(IRN), + q(0106) => q(IRQ), + q(0107) => q(IRL), + q(0108) => q(IMN), + q(0109) => q(ISR), + q(0110) => q(ITA), + q(0111) => q(JAM), + q(0112) => q(JPN), + q(0113) => q(JEY), + q(0114) => q(JOR), + q(0115) => q(KAZ), + q(0116) => q(KEN), + q(0117) => q(KIR), + q(0118) => q(PRK), + q(0119) => q(KOR), + q(0120) => q(KWT), + q(0121) => q(KGZ), + q(0122) => q(LAO), + q(0123) => q(LVA), + q(0124) => q(LBN), + q(0125) => q(LSO), + q(0126) => q(LBR), + q(0127) => q(LBY), + q(0128) => q(LIE), + q(0129) => q(LTU), + q(0130) => q(LUX), + q(0131) => q(MAC), + q(0132) => q(MKD), + q(0133) => q(MDG), + q(0134) => q(MWI), + q(0135) => q(MYS), + q(0136) => q(MDV), + q(0137) => q(MLI), + q(0138) => q(MLT), + q(0139) => q(MHL), + q(0140) => q(MTQ), + q(0141) => q(MRT), + q(0142) => q(MUS), + q(0143) => q(MYT), + q(0144) => q(MEX), + q(0145) => q(FSM), + q(0146) => q(MDA), + q(0147) => q(MCO), + q(0148) => q(MNG), + q(0149) => q(MNE), + q(0150) => q(MSR), + q(0151) => q(MAR), + q(0152) => q(MOZ), + q(0153) => q(MMR), + q(0154) => q(NAM), + q(0155) => q(NRU), + q(0156) => q(NPL), + q(0157) => q(NLD), + q(0158) => q(NCL), + q(0159) => q(NZL), + q(0160) => q(NIC), + q(0161) => q(NER), + q(0162) => q(NGA), + q(0163) => q(NIU), + q(0164) => q(NFK), + q(0165) => q(MNP), + q(0166) => q(NOR), + q(0167) => q(OMN), + q(0168) => q(PAK), + q(0169) => q(PLW), + q(0170) => q(PSE), + q(0171) => q(PAN), + q(0172) => q(PNG), + q(0173) => q(PRY), + q(0174) => q(PER), + q(0175) => q(PHL), + q(0176) => q(PCN), + q(0177) => q(POL), + q(0178) => q(PRT), + q(0179) => q(PRI), + q(0180) => q(QAT), + q(0181) => q(REU), + q(0182) => q(ROU), + q(0183) => q(RUS), + q(0184) => q(RWA), + q(0185) => q(BLM), + q(0186) => q(SHN), + q(0187) => q(KNA), + q(0188) => q(LCA), + q(0189) => q(MAF), + q(0190) => q(SPM), + q(0191) => q(VCT), + q(0192) => q(WSM), + q(0193) => q(SMR), + q(0194) => q(STP), + q(0195) => q(SAU), + q(0196) => q(SEN), + q(0197) => q(SRB), + q(0198) => q(SYC), + q(0199) => q(SLE), + q(0200) => q(SGP), + q(0201) => q(SXM), + q(0202) => q(SVK), + q(0203) => q(SVN), + q(0204) => q(SLB), + q(0205) => q(SOM), + q(0206) => q(ZAF), + q(0207) => q(SGS), + q(0208) => q(SSD), + q(0209) => q(ESP), + q(0210) => q(LKA), + q(0211) => q(SDN), + q(0212) => q(SUR), + q(0213) => q(SJM), + q(0214) => q(SWZ), + q(0215) => q(SWE), + q(0216) => q(CHE), + q(0217) => q(SYR), + q(0219) => q(TJK), + q(0220) => q(TZA), + q(0221) => q(THA), + q(0222) => q(TLS), + q(0223) => q(TGO), + q(0224) => q(TKL), + q(0225) => q(TON), + q(0226) => q(TTO), + q(0227) => q(TUN), + q(0228) => q(TUR), + q(0229) => q(TKM), + q(0230) => q(TCA), + q(0231) => q(TUV), + q(0232) => q(UGA), + q(0233) => q(UKR), + q(0234) => q(ARE), + q(0235) => q(GBR), + q(0236) => q(UMI), + q(0237) => q(USA), + q(0238) => q(URY), + q(0239) => q(UZB), + q(0240) => q(VUT), + q(0241) => q(VEN), + q(0242) => q(VNM), + q(0243) => q(VGB), + q(0244) => q(VIR), + q(0245) => q(WLF), + q(0246) => q(ESH), + q(0247) => q(YEM), + q(0248) => q(ZMB), + q(0249) => q(ZWE), + }, + q(un-numeric) => { + q(0001) => q(004), + q(0002) => q(248), + q(0003) => q(008), + q(0004) => q(012), + q(0005) => q(016), + q(0006) => q(020), + q(0007) => q(024), + q(0008) => q(660), + q(0009) => q(010), + q(0010) => q(028), + q(0011) => q(032), + q(0012) => q(051), + q(0013) => q(533), + q(0014) => q(036), + q(0015) => q(040), + q(0016) => q(031), + q(0017) => q(044), + q(0018) => q(048), + q(0019) => q(050), + q(0020) => q(052), + q(0021) => q(112), + q(0022) => q(056), + q(0023) => q(084), + q(0024) => q(204), + q(0025) => q(060), + q(0026) => q(064), + q(0027) => q(068), + q(0028) => q(535), + q(0029) => q(070), + q(0030) => q(072), + q(0031) => q(074), + q(0032) => q(076), + q(0033) => q(086), + q(0034) => q(096), + q(0035) => q(100), + q(0036) => q(854), + q(0037) => q(108), + q(0038) => q(132), + q(0039) => q(116), + q(0040) => q(120), + q(0041) => q(124), + q(0042) => q(136), + q(0043) => q(140), + q(0044) => q(148), + q(0045) => q(152), + q(0046) => q(156), + q(0047) => q(162), + q(0048) => q(166), + q(0049) => q(170), + q(0050) => q(174), + q(0051) => q(180), + q(0052) => q(178), + q(0053) => q(184), + q(0054) => q(188), + q(0055) => q(384), + q(0056) => q(191), + q(0057) => q(192), + q(0058) => q(531), + q(0059) => q(196), + q(0060) => q(203), + q(0061) => q(208), + q(0062) => q(262), + q(0063) => q(212), + q(0064) => q(214), + q(0065) => q(218), + q(0066) => q(818), + q(0067) => q(222), + q(0068) => q(226), + q(0069) => q(232), + q(0070) => q(233), + q(0071) => q(231), + q(0072) => q(238), + q(0073) => q(234), + q(0074) => q(242), + q(0075) => q(246), + q(0076) => q(250), + q(0077) => q(254), + q(0078) => q(258), + q(0079) => q(260), + q(0080) => q(266), + q(0081) => q(270), + q(0082) => q(268), + q(0083) => q(276), + q(0084) => q(288), + q(0085) => q(292), + q(0086) => q(300), + q(0087) => q(304), + q(0088) => q(308), + q(0089) => q(312), + q(0090) => q(316), + q(0091) => q(320), + q(0092) => q(831), + q(0093) => q(324), + q(0094) => q(624), + q(0095) => q(328), + q(0096) => q(332), + q(0097) => q(334), + q(0098) => q(336), + q(0099) => q(340), + q(0100) => q(344), + q(0101) => q(348), + q(0102) => q(352), + q(0103) => q(356), + q(0104) => q(360), + q(0105) => q(364), + q(0106) => q(368), + q(0107) => q(372), + q(0108) => q(833), + q(0109) => q(376), + q(0110) => q(380), + q(0111) => q(388), + q(0112) => q(392), + q(0113) => q(832), + q(0114) => q(400), + q(0115) => q(398), + q(0116) => q(404), + q(0117) => q(296), + q(0118) => q(408), + q(0119) => q(410), + q(0120) => q(414), + q(0121) => q(417), + q(0122) => q(418), + q(0123) => q(428), + q(0124) => q(422), + q(0125) => q(426), + q(0126) => q(430), + q(0127) => q(434), + q(0128) => q(438), + q(0129) => q(440), + q(0130) => q(442), + q(0131) => q(446), + q(0132) => q(807), + q(0133) => q(450), + q(0134) => q(454), + q(0135) => q(458), + q(0136) => q(462), + q(0137) => q(466), + q(0138) => q(470), + q(0139) => q(584), + q(0140) => q(474), + q(0141) => q(478), + q(0142) => q(480), + q(0143) => q(175), + q(0144) => q(484), + q(0145) => q(583), + q(0146) => q(498), + q(0147) => q(492), + q(0148) => q(496), + q(0149) => q(499), + q(0150) => q(500), + q(0151) => q(504), + q(0152) => q(508), + q(0153) => q(104), + q(0154) => q(516), + q(0155) => q(520), + q(0156) => q(524), + q(0157) => q(528), + q(0158) => q(540), + q(0159) => q(554), + q(0160) => q(558), + q(0161) => q(562), + q(0162) => q(566), + q(0163) => q(570), + q(0164) => q(574), + q(0165) => q(580), + q(0166) => q(578), + q(0167) => q(512), + q(0168) => q(586), + q(0169) => q(585), + q(0170) => q(275), + q(0171) => q(591), + q(0172) => q(598), + q(0173) => q(600), + q(0174) => q(604), + q(0175) => q(608), + q(0176) => q(612), + q(0177) => q(616), + q(0178) => q(620), + q(0179) => q(630), + q(0180) => q(634), + q(0181) => q(638), + q(0182) => q(642), + q(0183) => q(643), + q(0184) => q(646), + q(0185) => q(652), + q(0186) => q(654), + q(0187) => q(659), + q(0188) => q(662), + q(0189) => q(663), + q(0190) => q(666), + q(0191) => q(670), + q(0192) => q(882), + q(0193) => q(674), + q(0194) => q(678), + q(0195) => q(682), + q(0196) => q(686), + q(0197) => q(688), + q(0198) => q(690), + q(0199) => q(694), + q(0200) => q(702), + q(0201) => q(534), + q(0202) => q(703), + q(0203) => q(705), + q(0204) => q(090), + q(0205) => q(706), + q(0206) => q(710), + q(0207) => q(239), + q(0208) => q(728), + q(0209) => q(724), + q(0210) => q(144), + q(0211) => q(729), + q(0212) => q(740), + q(0213) => q(744), + q(0214) => q(748), + q(0215) => q(752), + q(0216) => q(756), + q(0217) => q(760), + q(0219) => q(762), + q(0220) => q(834), + q(0221) => q(764), + q(0222) => q(626), + q(0223) => q(768), + q(0224) => q(772), + q(0225) => q(776), + q(0226) => q(780), + q(0227) => q(788), + q(0228) => q(792), + q(0229) => q(795), + q(0230) => q(796), + q(0231) => q(798), + q(0232) => q(800), + q(0233) => q(804), + q(0234) => q(784), + q(0235) => q(826), + q(0236) => q(581), + q(0237) => q(840), + q(0238) => q(858), + q(0239) => q(860), + q(0240) => q(548), + q(0241) => q(862), + q(0242) => q(704), + q(0243) => q(092), + q(0244) => q(850), + q(0245) => q(876), + q(0246) => q(732), + q(0247) => q(887), + q(0248) => q(894), + q(0249) => q(716), + q(0250) => q(680), + }, +}; + +1; +package Locale::Codes::Currency; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2currency + currency2code + all_currency_codes + all_currency_names + currency_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_CURRENCY); + +our $obj = new Locale::Codes('currency'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2currency { + return $obj->code2name(@_); +} + +sub currency2code { + return $obj->name2code(@_); +} + +sub currency_code2code { + return $obj->code2code(@_); +} + +sub all_currency_codes { + return $obj->all_codes(@_); +} + +sub all_currency_names { + return $obj->all_names(@_); +} + +sub rename_currency { + return $obj->rename_code(@_); +} + +sub add_currency { + return $obj->add_code(@_); +} + +sub delete_currency { + return $obj->delete_code(@_); +} + +sub add_currency_alias { + return $obj->add_alias(@_); +} + +sub delete_currency_alias { + return $obj->delete_alias(@_); +} + +sub rename_currency_code { + return $obj->replace_code(@_); +} + +sub add_currency_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_currency_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package # +Locale::Codes::Language_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:17:53 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'language'}{'id'} = '7961'; + +$Locale::Codes::Data{'language'}{'id2names'} = { + q(0001) => [ + q(Afar), + ], + q(0002) => [ + q(Abkhazian), + ], + q(0003) => [ + q(Achinese), + ], + q(0004) => [ + q(Acoli), + ], + q(0005) => [ + q(Adangme), + ], + q(0006) => [ + q(Adyghe), + q(Adygei), + ], + q(0007) => [ + q(Afro-Asiatic languages), + ], + q(0008) => [ + q(Afrihili), + ], + q(0009) => [ + q(Afrikaans), + ], + q(0010) => [ + q(Ainu), + q(Ainu (Japan)), + ], + q(0011) => [ + q(Akan), + ], + q(0012) => [ + q(Akkadian), + ], + q(0013) => [ + q(Albanian), + ], + q(0014) => [ + q(Aleut), + ], + q(0015) => [ + q(Algonquian languages), + ], + q(0016) => [ + q(Southern Altai), + ], + q(0017) => [ + q(Amharic), + ], + q(0018) => [ + q(English, Old (ca.450-1100)), + q(Old English (ca. 450-1100)), + ], + q(0019) => [ + q(Angika), + ], + q(0020) => [ + q(Apache languages), + ], + q(0021) => [ + q(Arabic), + ], + q(0022) => [ + q(Official Aramaic (700-300 BCE)), + q(Imperial Aramaic (700-300 BCE)), + ], + q(0023) => [ + q(Aragonese), + ], + q(0024) => [ + q(Armenian), + ], + q(0025) => [ + q(Mapudungun), + q(Mapuche), + ], + q(0026) => [ + q(Arapaho), + ], + q(0027) => [ + q(Artificial languages), + ], + q(0028) => [ + q(Arawak), + ], + q(0029) => [ + q(Assamese), + ], + q(0030) => [ + q(Asturian), + q(Bable), + q(Leonese), + q(Asturleonese), + ], + q(0031) => [ + q(Athapascan languages), + ], + q(0032) => [ + q(Australian languages), + ], + q(0033) => [ + q(Avaric), + ], + q(0034) => [ + q(Avestan), + ], + q(0035) => [ + q(Awadhi), + ], + q(0036) => [ + q(Aymara), + ], + q(0037) => [ + q(Azerbaijani), + ], + q(0038) => [ + q(Banda languages), + ], + q(0039) => [ + q(Bamileke languages), + ], + q(0040) => [ + q(Bashkir), + ], + q(0041) => [ + q(Baluchi), + ], + q(0042) => [ + q(Bambara), + ], + q(0043) => [ + q(Balinese), + ], + q(0044) => [ + q(Basque), + ], + q(0045) => [ + q(Basa), + q(Basa (Cameroon)), + ], + q(0046) => [ + q(Baltic languages), + ], + q(0047) => [ + q(Beja), + q(Bedawiyet), + ], + q(0048) => [ + q(Belarusian), + ], + q(0049) => [ + q(Bemba), + q(Bemba (Zambia)), + ], + q(0050) => [ + q(Bengali), + q(Bangla), + ], + q(0051) => [ + q(Berber languages), + ], + q(0052) => [ + q(Bhojpuri), + ], + q(0053) => [ + q(Bihari languages), + ], + q(0054) => [ + q(Bikol), + ], + q(0055) => [ + q(Bini), + q(Edo), + ], + q(0056) => [ + q(Bislama), + ], + q(0057) => [ + q(Siksika), + ], + q(0058) => [ + q(Bantu (Other)), + q(Bantu languages), + ], + q(0059) => [ + q(Bosnian), + ], + q(0060) => [ + q(Braj), + ], + q(0061) => [ + q(Breton), + ], + q(0062) => [ + q(Batak languages), + ], + q(0063) => [ + q(Buriat), + ], + q(0064) => [ + q(Buginese), + ], + q(0065) => [ + q(Bulgarian), + ], + q(0066) => [ + q(Burmese), + ], + q(0067) => [ + q(Blin), + q(Bilin), + ], + q(0068) => [ + q(Caddo), + ], + q(0069) => [ + q(Central American Indian languages), + ], + q(0070) => [ + q(Galibi Carib), + ], + q(0071) => [ + q(Catalan), + q(Valencian), + ], + q(0072) => [ + q(Caucasian languages), + ], + q(0073) => [ + q(Cebuano), + ], + q(0074) => [ + q(Celtic languages), + ], + q(0075) => [ + q(Chamorro), + ], + q(0076) => [ + q(Chibcha), + ], + q(0077) => [ + q(Chechen), + ], + q(0078) => [ + q(Chagatai), + ], + q(0079) => [ + q(Chinese), + ], + q(0080) => [ + q(Chuukese), + ], + q(0081) => [ + q(Mari), + q(Mari (Russia)), + ], + q(0082) => [ + q(Chinook jargon), + ], + q(0083) => [ + q(Choctaw), + ], + q(0084) => [ + q(Chipewyan), + q(Dene Suline), + ], + q(0085) => [ + q(Cherokee), + ], + q(0086) => [ + q(Church Slavic), + q(Old Slavonic), + q(Church Slavonic), + q(Old Bulgarian), + q(Old Church Slavonic), + ], + q(0087) => [ + q(Chuvash), + ], + q(0088) => [ + q(Cheyenne), + ], + q(0089) => [ + q(Chamic languages), + ], + q(0090) => [ + q(Montenegrin), + ], + q(0091) => [ + q(Coptic), + ], + q(0092) => [ + q(Cornish), + ], + q(0093) => [ + q(Corsican), + ], + q(0094) => [ + q(Creoles and pidgins, English based), + q(Creoles and pidgins, English-based), + q(English-based creoles and pidgins), + ], + q(0095) => [ + q(Creoles and pidgins, French-based ), + q(Creoles and pidgins, French-based), + q(French-based creoles and pidgins), + ], + q(0096) => [ + q(Creoles and pidgins, Portuguese-based ), + q(Creoles and pidgins, Portuguese-based), + q(Portuguese-based creoles and pidgins), + ], + q(0097) => [ + q(Cree), + ], + q(0098) => [ + q(Crimean Tatar), + q(Crimean Turkish), + ], + q(0099) => [ + q(Creoles and pidgins ), + q(Creoles and pidgins), + ], + q(0100) => [ + q(Kashubian), + ], + q(0101) => [ + q(Cushitic languages), + ], + q(0102) => [ + q(Czech), + ], + q(0103) => [ + q(Dakota), + ], + q(0104) => [ + q(Danish), + ], + q(0105) => [ + q(Dargwa), + ], + q(0106) => [ + q(Land Dayak languages), + ], + q(0107) => [ + q(Delaware), + ], + q(0108) => [ + q(Slave (Athapascan)), + ], + q(0109) => [ + q(Dogrib), + ], + q(0110) => [ + q(Dinka), + ], + q(0111) => [ + q(Divehi), + q(Dhivehi), + q(Maldivian), + ], + q(0112) => [ + q(Dogri), + q(Dogri (macrolanguage)), + ], + q(0113) => [ + q(Dravidian languages), + ], + q(0114) => [ + q(Lower Sorbian), + ], + q(0115) => [ + q(Duala), + ], + q(0116) => [ + q(Dutch, Middle (ca.1050-1350)), + q(Middle Dutch (ca. 1050-1350)), + ], + q(0117) => [ + q(Dutch), + q(Flemish), + ], + q(0118) => [ + q(Dyula), + ], + q(0119) => [ + q(Dzongkha), + ], + q(0120) => [ + q(Efik), + ], + q(0121) => [ + q(Egyptian (Ancient)), + ], + q(0122) => [ + q(Ekajuk), + ], + q(0123) => [ + q(Elamite), + ], + q(0124) => [ + q(English), + ], + q(0125) => [ + q(English, Middle (1100-1500)), + q(Middle English (1100-1500)), + ], + q(0126) => [ + q(Esperanto), + ], + q(0127) => [ + q(Estonian), + ], + q(0128) => [ + q(Ewe), + ], + q(0129) => [ + q(Ewondo), + ], + q(0130) => [ + q(Fang), + q(Fang (Equatorial Guinea)), + ], + q(0131) => [ + q(Faroese), + ], + q(0132) => [ + q(Fanti), + ], + q(0133) => [ + q(Fijian), + ], + q(0134) => [ + q(Filipino), + q(Pilipino), + ], + q(0135) => [ + q(Finnish), + ], + q(0136) => [ + q(Finno-Ugrian languages), + ], + q(0137) => [ + q(Fon), + ], + q(0138) => [ + q(French), + ], + q(0139) => [ + q(French, Middle (ca.1400-1600)), + q(Middle French (ca. 1400-1600)), + ], + q(0140) => [ + q(French, Old (842-ca.1400)), + q(Old French (842-ca. 1400)), + ], + q(0141) => [ + q(Northern Frisian), + ], + q(0142) => [ + q(Eastern Frisian), + ], + q(0143) => [ + q(Western Frisian), + ], + q(0144) => [ + q(Fulah), + ], + q(0145) => [ + q(Friulian), + ], + q(0146) => [ + q(Ga), + ], + q(0147) => [ + q(Gayo), + ], + q(0148) => [ + q(Gbaya), + q(Gbaya (Central African Republic)), + ], + q(0149) => [ + q(Germanic languages), + ], + q(0150) => [ + q(Georgian), + ], + q(0151) => [ + q(German), + ], + q(0152) => [ + q(Geez), + ], + q(0153) => [ + q(Gilbertese), + ], + q(0154) => [ + q(Gaelic), + q(Scottish Gaelic), + ], + q(0155) => [ + q(Irish), + ], + q(0156) => [ + q(Galician), + ], + q(0157) => [ + q(Manx), + ], + q(0158) => [ + q(German, Middle High (ca.1050-1500)), + q(Middle High German (ca. 1050-1500)), + ], + q(0159) => [ + q(German, Old High (ca.750-1050)), + q(Old High German (ca. 750-1050)), + ], + q(0160) => [ + q(Gondi), + ], + q(0161) => [ + q(Gorontalo), + ], + q(0162) => [ + q(Gothic), + ], + q(0163) => [ + q(Grebo), + ], + q(0164) => [ + q(Greek, Ancient (to 1453)), + q(Ancient Greek (to 1453)), + ], + q(0165) => [ + q(Greek, Modern (1453-)), + q(Greek), + q(Modern Greek (1453-)), + ], + q(0166) => [ + q(Guarani), + ], + q(0167) => [ + q(Swiss German), + q(Alemannic), + q(Alsatian), + ], + q(0168) => [ + q(Gujarati), + ], + q(0169) => [ + q(Gwich'in), + ], + q(0170) => [ + q(Haida), + ], + q(0171) => [ + q(Haitian), + q(Haitian Creole), + ], + q(0172) => [ + q(Hausa), + ], + q(0173) => [ + q(Hawaiian), + ], + q(0174) => [ + q(Hebrew), + ], + q(0175) => [ + q(Herero), + ], + q(0176) => [ + q(Hiligaynon), + ], + q(0177) => [ + q(Himachali languages), + q(Western Pahari languages), + ], + q(0178) => [ + q(Hindi), + ], + q(0179) => [ + q(Hittite), + ], + q(0180) => [ + q(Hmong), + q(Mong), + ], + q(0181) => [ + q(Hiri Motu), + ], + q(0182) => [ + q(Croatian), + ], + q(0183) => [ + q(Upper Sorbian), + ], + q(0184) => [ + q(Hungarian), + ], + q(0185) => [ + q(Hupa), + ], + q(0186) => [ + q(Iban), + ], + q(0187) => [ + q(Igbo), + ], + q(0188) => [ + q(Icelandic), + ], + q(0189) => [ + q(Ido), + ], + q(0190) => [ + q(Sichuan Yi), + q(Nuosu), + ], + q(0191) => [ + q(Ijo languages), + ], + q(0192) => [ + q(Inuktitut), + ], + q(0193) => [ + q(Interlingue), + q(Occidental), + ], + q(0194) => [ + q(Iloko), + ], + q(0195) => [ + q(Interlingua (International Auxiliary Language Association)), + ], + q(0196) => [ + q(Indic languages), + ], + q(0197) => [ + q(Indonesian), + ], + q(0198) => [ + q(Indo-European languages), + ], + q(0199) => [ + q(Ingush), + ], + q(0200) => [ + q(Inupiaq), + ], + q(0201) => [ + q(Iranian languages), + ], + q(0202) => [ + q(Iroquoian languages), + ], + q(0203) => [ + q(Italian), + ], + q(0204) => [ + q(Javanese), + ], + q(0205) => [ + q(Lojban), + ], + q(0206) => [ + q(Japanese), + ], + q(0207) => [ + q(Judeo-Persian), + ], + q(0208) => [ + q(Judeo-Arabic), + ], + q(0209) => [ + q(Kara-Kalpak), + ], + q(0210) => [ + q(Kabyle), + ], + q(0211) => [ + q(Kachin), + q(Jingpho), + ], + q(0212) => [ + q(Kalaallisut), + q(Greenlandic), + ], + q(0213) => [ + q(Kamba), + q(Kamba (Kenya)), + ], + q(0214) => [ + q(Kannada), + ], + q(0215) => [ + q(Karen languages), + ], + q(0216) => [ + q(Kashmiri), + ], + q(0217) => [ + q(Kanuri), + ], + q(0218) => [ + q(Kawi), + ], + q(0219) => [ + q(Kazakh), + ], + q(0220) => [ + q(Kabardian), + ], + q(0221) => [ + q(Khasi), + ], + q(0222) => [ + q(Khoisan languages), + ], + q(0223) => [ + q(Central Khmer), + ], + q(0224) => [ + q(Khotanese), + q(Sakan), + ], + q(0225) => [ + q(Kikuyu), + q(Gikuyu), + ], + q(0226) => [ + q(Kinyarwanda), + ], + q(0227) => [ + q(Kirghiz), + q(Kyrgyz), + ], + q(0228) => [ + q(Kimbundu), + ], + q(0229) => [ + q(Konkani), + q(Konkani (macrolanguage)), + ], + q(0230) => [ + q(Komi), + ], + q(0231) => [ + q(Kongo), + ], + q(0232) => [ + q(Korean), + ], + q(0233) => [ + q(Kosraean), + ], + q(0234) => [ + q(Kpelle), + ], + q(0235) => [ + q(Karachay-Balkar), + ], + q(0236) => [ + q(Karelian), + ], + q(0237) => [ + q(Kru languages), + ], + q(0238) => [ + q(Kurukh), + ], + q(0239) => [ + q(Kuanyama), + q(Kwanyama), + ], + q(0240) => [ + q(Kumyk), + ], + q(0241) => [ + q(Kurdish), + ], + q(0242) => [ + q(Kutenai), + ], + q(0243) => [ + q(Ladino), + ], + q(0244) => [ + q(Lahnda), + ], + q(0245) => [ + q(Lamba), + ], + q(0246) => [ + q(Lao), + ], + q(0247) => [ + q(Latin), + ], + q(0248) => [ + q(Latvian), + ], + q(0249) => [ + q(Lezghian), + ], + q(0250) => [ + q(Limburgan), + q(Limburger), + q(Limburgish), + ], + q(0251) => [ + q(Lingala), + ], + q(0252) => [ + q(Lithuanian), + ], + q(0253) => [ + q(Mongo), + ], + q(0254) => [ + q(Lozi), + ], + q(0255) => [ + q(Luxembourgish), + q(Letzeburgesch), + ], + q(0256) => [ + q(Luba-Lulua), + ], + q(0257) => [ + q(Luba-Katanga), + ], + q(0258) => [ + q(Ganda), + ], + q(0259) => [ + q(Luiseno), + ], + q(0260) => [ + q(Lunda), + ], + q(0261) => [ + q(Luo (Kenya and Tanzania)), + q(Dholuo), + ], + q(0262) => [ + q(Lushai), + ], + q(0263) => [ + q(Macedonian), + ], + q(0264) => [ + q(Madurese), + ], + q(0265) => [ + q(Magahi), + ], + q(0266) => [ + q(Marshallese), + ], + q(0267) => [ + q(Maithili), + ], + q(0268) => [ + q(Makasar), + ], + q(0269) => [ + q(Malayalam), + ], + q(0270) => [ + q(Mandingo), + q(Manding), + ], + q(0271) => [ + q(Maori), + ], + q(0272) => [ + q(Austronesian languages), + ], + q(0273) => [ + q(Marathi), + ], + q(0274) => [ + q(Masai), + ], + q(0275) => [ + q(Malay), + q(Malay (macrolanguage)), + ], + q(0276) => [ + q(Moksha), + ], + q(0277) => [ + q(Mandar), + ], + q(0278) => [ + q(Mende), + q(Mende (Sierra Leone)), + ], + q(0279) => [ + q(Irish, Middle (900-1200)), + q(Middle Irish (900-1200)), + ], + q(0280) => [ + q(Mi'kmaq), + q(Micmac), + ], + q(0281) => [ + q(Minangkabau), + ], + q(0282) => [ + q(Uncoded languages), + ], + q(0283) => [ + q(Mon-Khmer languages), + ], + q(0284) => [ + q(Malagasy), + ], + q(0285) => [ + q(Maltese), + ], + q(0286) => [ + q(Manchu), + ], + q(0287) => [ + q(Manipuri), + ], + q(0288) => [ + q(Manobo languages), + ], + q(0289) => [ + q(Mohawk), + ], + q(0290) => [ + q(Mongolian), + ], + q(0291) => [ + q(Mossi), + ], + q(0292) => [ + q(Multiple languages), + ], + q(0293) => [ + q(Munda languages), + ], + q(0294) => [ + q(Creek), + ], + q(0295) => [ + q(Mirandese), + ], + q(0296) => [ + q(Marwari), + ], + q(0297) => [ + q(Mayan languages), + ], + q(0298) => [ + q(Erzya), + ], + q(0299) => [ + q(Nahuatl languages), + ], + q(0300) => [ + q(North American Indian languages), + ], + q(0301) => [ + q(Neapolitan), + ], + q(0302) => [ + q(Nauru), + ], + q(0303) => [ + q(Navajo), + q(Navaho), + ], + q(0304) => [ + q(Ndebele, South), + q(South Ndebele), + ], + q(0305) => [ + q(Ndebele, North), + q(North Ndebele), + ], + q(0306) => [ + q(Ndonga), + ], + q(0307) => [ + q(Low German), + q(Low Saxon), + q(German, Low), + q(Saxon, Low), + ], + q(0308) => [ + q(Nepali), + q(Nepali (macrolanguage)), + ], + q(0309) => [ + q(Nepal Bhasa), + q(Newari), + ], + q(0310) => [ + q(Nias), + ], + q(0311) => [ + q(Niger-Kordofanian languages), + ], + q(0312) => [ + q(Niuean), + ], + q(0313) => [ + q(Norwegian Nynorsk), + q(Nynorsk, Norwegian), + ], + q(0314) => [ + q(Bokmal, Norwegian), + q(Norwegian Bokmal), + ], + q(0315) => [ + q(Nogai), + ], + q(0316) => [ + q(Norse, Old), + q(Old Norse), + ], + q(0317) => [ + q(Norwegian), + ], + q(0318) => [ + q(N'Ko), + ], + q(0319) => [ + q(Pedi), + q(Sepedi), + q(Northern Sotho), + ], + q(0320) => [ + q(Nubian languages), + ], + q(0321) => [ + q(Classical Newari), + q(Old Newari), + q(Classical Nepal Bhasa), + ], + q(0322) => [ + q(Chichewa), + q(Chewa), + q(Nyanja), + ], + q(0323) => [ + q(Nyamwezi), + ], + q(0324) => [ + q(Nyankole), + ], + q(0325) => [ + q(Nyoro), + ], + q(0326) => [ + q(Nzima), + ], + q(0327) => [ + q(Occitan (post 1500)), + q(Provencal), + ], + q(0328) => [ + q(Ojibwa), + ], + q(0329) => [ + q(Oriya), + q(Oriya (macrolanguage)), + q(Odia (macrolanguage)), + ], + q(0330) => [ + q(Oromo), + ], + q(0331) => [ + q(Osage), + ], + q(0332) => [ + q(Ossetian), + q(Ossetic), + ], + q(0333) => [ + q(Turkish, Ottoman (1500-1928)), + q(Ottoman Turkish (1500-1928)), + ], + q(0334) => [ + q(Otomian languages), + ], + q(0335) => [ + q(Papuan languages), + ], + q(0336) => [ + q(Pangasinan), + ], + q(0337) => [ + q(Pahlavi), + ], + q(0338) => [ + q(Pampanga), + q(Kapampangan), + ], + q(0339) => [ + q(Panjabi), + q(Punjabi), + ], + q(0340) => [ + q(Papiamento), + ], + q(0341) => [ + q(Palauan), + ], + q(0342) => [ + q(Persian, Old (ca.600-400 B.C.)), + q(Old Persian (ca. 600-400 B.C.)), + ], + q(0343) => [ + q(Persian), + ], + q(0344) => [ + q(Philippine languages), + ], + q(0345) => [ + q(Phoenician), + ], + q(0346) => [ + q(Pali), + ], + q(0347) => [ + q(Polish), + ], + q(0348) => [ + q(Pohnpeian), + ], + q(0349) => [ + q(Portuguese), + ], + q(0350) => [ + q(Prakrit languages), + ], + q(0351) => [ + q(Provencal, Old (to 1500)), + q(Old Provencal (to 1500)), + q(Old Occitan (to 1500)), + ], + q(0352) => [ + q(Pushto), + q(Pashto), + ], + q(0353) => [ + q(Reserved for local use), + ], + q(0354) => [ + q(Quechua), + ], + q(0355) => [ + q(Rajasthani), + ], + q(0356) => [ + q(Rapanui), + ], + q(0357) => [ + q(Rarotongan), + q(Cook Islands Maori), + ], + q(0358) => [ + q(Romance languages), + ], + q(0359) => [ + q(Romansh), + ], + q(0360) => [ + q(Romany), + ], + q(0361) => [ + q(Romanian), + q(Moldavian), + q(Moldovan), + ], + q(0362) => [ + q(Rundi), + ], + q(0363) => [ + q(Aromanian), + q(Arumanian), + q(Macedo-Romanian), + ], + q(0364) => [ + q(Russian), + ], + q(0365) => [ + q(Sandawe), + ], + q(0366) => [ + q(Sango), + ], + q(0367) => [ + q(Yakut), + ], + q(0368) => [ + q(South American Indian (Other)), + q(South American Indian languages), + ], + q(0369) => [ + q(Salishan languages), + ], + q(0370) => [ + q(Samaritan Aramaic), + ], + q(0371) => [ + q(Sanskrit), + ], + q(0372) => [ + q(Sasak), + ], + q(0373) => [ + q(Santali), + ], + q(0374) => [ + q(Sicilian), + ], + q(0375) => [ + q(Scots), + ], + q(0376) => [ + q(Selkup), + ], + q(0377) => [ + q(Semitic languages), + ], + q(0378) => [ + q(Irish, Old (to 900)), + q(Old Irish (to 900)), + ], + q(0379) => [ + q(Sign Languages), + ], + q(0380) => [ + q(Shan), + ], + q(0381) => [ + q(Sidamo), + ], + q(0382) => [ + q(Sinhala), + q(Sinhalese), + ], + q(0383) => [ + q(Siouan languages), + ], + q(0384) => [ + q(Sino-Tibetan languages), + ], + q(0385) => [ + q(Slavic languages), + ], + q(0386) => [ + q(Slovak), + ], + q(0387) => [ + q(Slovenian), + ], + q(0388) => [ + q(Southern Sami), + ], + q(0389) => [ + q(Northern Sami), + ], + q(0390) => [ + q(Sami languages), + ], + q(0391) => [ + q(Lule Sami), + ], + q(0392) => [ + q(Inari Sami), + ], + q(0393) => [ + q(Samoan), + ], + q(0394) => [ + q(Skolt Sami), + ], + q(0395) => [ + q(Shona), + ], + q(0396) => [ + q(Sindhi), + ], + q(0397) => [ + q(Soninke), + ], + q(0398) => [ + q(Sogdian), + ], + q(0399) => [ + q(Somali), + ], + q(0400) => [ + q(Songhai languages), + ], + q(0401) => [ + q(Sotho, Southern), + q(Southern Sotho), + ], + q(0402) => [ + q(Spanish), + q(Castilian), + ], + q(0403) => [ + q(Sardinian), + ], + q(0404) => [ + q(Sranan Tongo), + ], + q(0405) => [ + q(Serbian), + ], + q(0406) => [ + q(Serer), + ], + q(0407) => [ + q(Nilo-Saharan languages), + ], + q(0408) => [ + q(Swati), + ], + q(0409) => [ + q(Sukuma), + ], + q(0410) => [ + q(Sundanese), + ], + q(0411) => [ + q(Susu), + ], + q(0412) => [ + q(Sumerian), + ], + q(0413) => [ + q(Swahili), + q(Swahili (macrolanguage)), + ], + q(0414) => [ + q(Swedish), + ], + q(0415) => [ + q(Classical Syriac), + ], + q(0416) => [ + q(Syriac), + ], + q(0417) => [ + q(Tahitian), + ], + q(0418) => [ + q(Tai languages), + ], + q(0419) => [ + q(Tamil), + ], + q(0420) => [ + q(Tatar), + ], + q(0421) => [ + q(Telugu), + ], + q(0422) => [ + q(Timne), + ], + q(0423) => [ + q(Tereno), + ], + q(0424) => [ + q(Tetum), + ], + q(0425) => [ + q(Tajik), + ], + q(0426) => [ + q(Tagalog), + ], + q(0427) => [ + q(Thai), + ], + q(0428) => [ + q(Tibetan), + ], + q(0429) => [ + q(Tigre), + ], + q(0430) => [ + q(Tigrinya), + ], + q(0431) => [ + q(Tiv), + ], + q(0432) => [ + q(Tokelau), + ], + q(0433) => [ + q(Klingon), + q(tlhIngan-Hol), + ], + q(0434) => [ + q(Tlingit), + ], + q(0435) => [ + q(Tamashek), + ], + q(0436) => [ + q(Tonga (Nyasa)), + ], + q(0437) => [ + q(Tonga (Tonga Islands)), + q(Tonga), + ], + q(0438) => [ + q(Tok Pisin), + ], + q(0439) => [ + q(Tsimshian), + ], + q(0440) => [ + q(Tswana), + ], + q(0441) => [ + q(Tsonga), + ], + q(0442) => [ + q(Turkmen), + ], + q(0443) => [ + q(Tumbuka), + ], + q(0444) => [ + q(Tupi languages), + ], + q(0445) => [ + q(Turkish), + ], + q(0446) => [ + q(Altaic languages), + ], + q(0447) => [ + q(Tuvalu), + ], + q(0448) => [ + q(Twi), + ], + q(0449) => [ + q(Tuvinian), + ], + q(0450) => [ + q(Udmurt), + ], + q(0451) => [ + q(Ugaritic), + ], + q(0452) => [ + q(Uighur), + q(Uyghur), + ], + q(0453) => [ + q(Ukrainian), + ], + q(0454) => [ + q(Umbundu), + ], + q(0455) => [ + q(Undetermined), + ], + q(0456) => [ + q(Urdu), + ], + q(0457) => [ + q(Uzbek), + ], + q(0458) => [ + q(Vai), + ], + q(0459) => [ + q(Venda), + ], + q(0460) => [ + q(Vietnamese), + ], + q(0461) => [ + q(Volapuk), + ], + q(0462) => [ + q(Votic), + ], + q(0463) => [ + q(Wakashan languages), + ], + q(0464) => [ + q(Walamo), + q(Wolaytta), + q(Wolaitta), + ], + q(0465) => [ + q(Waray), + q(Waray (Philippines)), + ], + q(0466) => [ + q(Washo), + ], + q(0467) => [ + q(Welsh), + ], + q(0468) => [ + q(Sorbian languages), + ], + q(0469) => [ + q(Walloon), + ], + q(0470) => [ + q(Wolof), + ], + q(0471) => [ + q(Kalmyk), + q(Oirat), + ], + q(0472) => [ + q(Xhosa), + ], + q(0473) => [ + q(Yao), + ], + q(0474) => [ + q(Yapese), + ], + q(0475) => [ + q(Yiddish), + ], + q(0476) => [ + q(Yoruba), + ], + q(0477) => [ + q(Yupik languages), + ], + q(0478) => [ + q(Zapotec), + ], + q(0479) => [ + q(Blissymbols), + q(Blissymbolics), + q(Bliss), + ], + q(0480) => [ + q(Zenaga), + ], + q(0481) => [ + q(Standard Moroccan Tamazight), + ], + q(0482) => [ + q(Zhuang), + q(Chuang), + ], + q(0483) => [ + q(Zande languages), + ], + q(0484) => [ + q(Zulu), + ], + q(0485) => [ + q(Zuni), + ], + q(0486) => [ + q(No linguistic content), + q(Not applicable), + ], + q(0487) => [ + q(Zaza), + q(Dimili), + q(Dimli), + q(Kirdki), + q(Kirmanjki), + q(Zazaki), + q(Dimli (macrolanguage)), + q(Kirmanjki (macrolanguage)), + ], + q(0488) => [ + q(Austro-Asiatic languages), + ], + q(0489) => [ + q(Atlantic-Congo languages), + ], + q(0490) => [ + q(Alacalufan languages), + ], + q(0491) => [ + q(Algic languages), + ], + q(0492) => [ + q(Arauan languages), + ], + q(0493) => [ + q(Arawakan languages), + ], + q(0494) => [ + q(Uto-Aztecan languages), + ], + q(0495) => [ + q(Chibchan languages), + ], + q(0496) => [ + q(North Caucasian languages), + ], + q(0497) => [ + q(South Caucasian languages), + ], + q(0498) => [ + q(Chadic languages), + ], + q(0499) => [ + q(Caddoan languages), + ], + q(0500) => [ + q(Central Sudanic languages), + ], + q(0501) => [ + q(Mande languages), + ], + q(0502) => [ + q(Egyptian languages), + ], + q(0503) => [ + q(Eskimo-Aleut languages), + ], + q(0504) => [ + q(Basque (family)), + ], + q(0505) => [ + q(Formosan languages), + ], + q(0506) => [ + q(East Germanic languages), + ], + q(0507) => [ + q(North Germanic languages), + ], + q(0508) => [ + q(West Germanic languages), + ], + q(0509) => [ + q(Greek languages), + ], + q(0510) => [ + q(Hmong-Mien languages), + ], + q(0511) => [ + q(Hokan languages), + ], + q(0512) => [ + q(Armenian (family)), + ], + q(0513) => [ + q(Indo-Iranian languages), + ], + q(0514) => [ + q(Italic languages), + ], + q(0515) => [ + q(Japanese (family)), + ], + q(0516) => [ + q(Kordofanian languages), + ], + q(0517) => [ + q(Trans-New Guinea languages), + ], + q(0518) => [ + q(Oto-Manguean languages), + ], + q(0519) => [ + q(Omotic languages), + ], + q(0520) => [ + q(Central Malayo-Polynesian languages), + ], + q(0521) => [ + q(Malayo-Polynesian languages), + ], + q(0522) => [ + q(Eastern Malayo-Polynesian languages), + ], + q(0523) => [ + q(Western Malayo-Polynesian languages), + ], + q(0524) => [ + q(Quechuan (family)), + ], + q(0525) => [ + q(Eastern Sudanic languages), + ], + q(0526) => [ + q(Albanian languages), + ], + q(0527) => [ + q(Samoyedic languages), + ], + q(0528) => [ + q(Tibeto-Burman languages), + ], + q(0529) => [ + q(Turkic languages), + ], + q(0530) => [ + q(Tungus languages), + ], + q(0531) => [ + q(Uralic languages), + ], + q(0532) => [ + q(Mongolian languages), + ], + q(0533) => [ + q(Na-Dene languages), + ], + q(0534) => [ + q(Chinese (family)), + ], + q(0535) => [ + q(East Slavic languages), + ], + q(0536) => [ + q(South Slavic languages), + ], + q(0537) => [ + q(West Slavic languages), + ], + q(0538) => [ + q(Serbo-Croatian), + ], + q(0539) => [ + q(Ghotuo), + ], + q(0540) => [ + q(Alumu-Tesu), + ], + q(0541) => [ + q(Ari), + ], + q(0542) => [ + q(Amal), + ], + q(0543) => [ + q(Arbereshe Albanian), + ], + q(0544) => [ + q(Aranadan), + ], + q(0545) => [ + q(Ambrak), + ], + q(0546) => [ + q(Abu' Arapesh), + ], + q(0547) => [ + q(Arifama-Miniafia), + ], + q(0548) => [ + q(Ankave), + ], + q(0549) => [ + q(Afade), + ], + q(0550) => [ + q(Anambe), + ], + q(0551) => [ + q(Algerian Saharan Arabic), + ], + q(0552) => [ + q(Para Arara), + ], + q(0553) => [ + q(Eastern Abnaki), + ], + q(0554) => [ + q(Aasax), + ], + q(0555) => [ + q(Arvanitika Albanian), + ], + q(0556) => [ + q(Abau), + ], + q(0557) => [ + q(Solong), + ], + q(0558) => [ + q(Mandobo Atas), + ], + q(0559) => [ + q(Amarasi), + ], + q(0560) => [ + q(Abe), + ], + q(0561) => [ + q(Bankon), + ], + q(0562) => [ + q(Ambala Ayta), + ], + q(0563) => [ + q(Manide), + ], + q(0564) => [ + q(Western Abnaki), + ], + q(0565) => [ + q(Abai Sungai), + ], + q(0566) => [ + q(Abaga), + ], + q(0567) => [ + q(Tajiki Arabic), + ], + q(0568) => [ + q(Abidji), + ], + q(0569) => [ + q(Aka-Bea), + ], + q(0570) => [ + q(Lampung Nyo), + ], + q(0571) => [ + q(Abanyom), + ], + q(0572) => [ + q(Abua), + ], + q(0573) => [ + q(Abon), + ], + q(0574) => [ + q(Abellen Ayta), + ], + q(0575) => [ + q(Abaza), + ], + q(0576) => [ + q(Abron), + ], + q(0577) => [ + q(Ambonese Malay), + ], + q(0578) => [ + q(Ambulas), + ], + q(0579) => [ + q(Abure), + ], + q(0580) => [ + q(Baharna Arabic), + ], + q(0581) => [ + q(Pal), + ], + q(0582) => [ + q(Inabaknon), + ], + q(0583) => [ + q(Aneme Wake), + ], + q(0584) => [ + q(Abui), + ], + q(0585) => [ + q(Achagua), + ], + q(0586) => [ + q(Anca), + ], + q(0587) => [ + q(Gikyode), + ], + q(0588) => [ + q(Saint Lucian Creole French), + ], + q(0589) => [ + q(Aka-Cari), + ], + q(0590) => [ + q(Aka-Kora), + ], + q(0591) => [ + q(Akar-Bale), + ], + q(0592) => [ + q(Mesopotamian Arabic), + ], + q(0593) => [ + q(Achang), + ], + q(0594) => [ + q(Eastern Acipa), + ], + q(0595) => [ + q(Ta'izzi-Adeni Arabic), + ], + q(0596) => [ + q(Achi), + ], + q(0597) => [ + q(Acroa), + ], + q(0598) => [ + q(Achterhoeks), + ], + q(0599) => [ + q(Achuar-Shiwiar), + ], + q(0600) => [ + q(Achumawi), + ], + q(0601) => [ + q(Hijazi Arabic), + ], + q(0602) => [ + q(Omani Arabic), + ], + q(0603) => [ + q(Cypriot Arabic), + ], + q(0604) => [ + q(Acheron), + ], + q(0605) => [ + q(Adabe), + ], + q(0606) => [ + q(Dzodinka), + ], + q(0607) => [ + q(Adele), + ], + q(0608) => [ + q(Dhofari Arabic), + ], + q(0609) => [ + q(Andegerebinha), + ], + q(0610) => [ + q(Adhola), + ], + q(0611) => [ + q(Adi), + ], + q(0612) => [ + q(Adioukrou), + ], + q(0613) => [ + q(Galo), + ], + q(0614) => [ + q(Adang), + ], + q(0615) => [ + q(Abu), + ], + q(0616) => [ + q(Adangbe), + ], + q(0617) => [ + q(Adonara), + ], + q(0618) => [ + q(Adamorobe Sign Language), + ], + q(0619) => [ + q(Adnyamathanha), + ], + q(0620) => [ + q(Aduge), + ], + q(0621) => [ + q(Amundava), + ], + q(0622) => [ + q(Amdo Tibetan), + ], + q(0623) => [ + q(Adzera), + ], + q(0624) => [ + q(Areba), + ], + q(0625) => [ + q(Tunisian Arabic), + ], + q(0626) => [ + q(Saidi Arabic), + ], + q(0627) => [ + q(Argentine Sign Language), + ], + q(0628) => [ + q(Northeast Pashai), + q(Northeast Pashayi), + ], + q(0629) => [ + q(Haeke), + ], + q(0630) => [ + q(Ambele), + ], + q(0631) => [ + q(Arem), + ], + q(0632) => [ + q(Armenian Sign Language), + ], + q(0633) => [ + q(Aer), + ], + q(0634) => [ + q(Eastern Arrernte), + ], + q(0635) => [ + q(Alsea), + ], + q(0636) => [ + q(Akeu), + ], + q(0637) => [ + q(Ambakich), + ], + q(0638) => [ + q(Amele), + ], + q(0639) => [ + q(Aeka), + ], + q(0640) => [ + q(Gulf Arabic), + ], + q(0641) => [ + q(Andai), + ], + q(0642) => [ + q(Putukwam), + ], + q(0643) => [ + q(Afghan Sign Language), + ], + q(0644) => [ + q(Akrukay), + q(Chini), + ], + q(0645) => [ + q(Nanubae), + ], + q(0646) => [ + q(Defaka), + ], + q(0647) => [ + q(Eloyi), + ], + q(0648) => [ + q(Tapei), + ], + q(0649) => [ + q(Afro-Seminole Creole), + ], + q(0650) => [ + q(Afitti), + ], + q(0651) => [ + q(Awutu), + ], + q(0652) => [ + q(Obokuitai), + ], + q(0653) => [ + q(Aguano), + ], + q(0654) => [ + q(Legbo), + ], + q(0655) => [ + q(Agatu), + ], + q(0656) => [ + q(Agarabi), + ], + q(0657) => [ + q(Angal), + ], + q(0658) => [ + q(Arguni), + ], + q(0659) => [ + q(Angor), + ], + q(0660) => [ + q(Ngelima), + ], + q(0661) => [ + q(Agariya), + ], + q(0662) => [ + q(Argobba), + ], + q(0663) => [ + q(Isarog Agta), + ], + q(0664) => [ + q(Fembe), + ], + q(0665) => [ + q(Angaataha), + ], + q(0666) => [ + q(Agutaynen), + ], + q(0667) => [ + q(Tainae), + ], + q(0668) => [ + q(Aghem), + ], + q(0669) => [ + q(Aguaruna), + ], + q(0670) => [ + q(Esimbi), + ], + q(0671) => [ + q(Central Cagayan Agta), + ], + q(0672) => [ + q(Aguacateco), + ], + q(0673) => [ + q(Remontado Dumagat), + ], + q(0674) => [ + q(Kahua), + ], + q(0675) => [ + q(Aghul), + ], + q(0676) => [ + q(Southern Alta), + ], + q(0677) => [ + q(Mt. Iriga Agta), + ], + q(0678) => [ + q(Ahanta), + ], + q(0679) => [ + q(Axamb), + ], + q(0680) => [ + q(Qimant), + ], + q(0681) => [ + q(Aghu), + ], + q(0682) => [ + q(Tiagbamrin Aizi), + ], + q(0683) => [ + q(Akha), + ], + q(0684) => [ + q(Igo), + ], + q(0685) => [ + q(Mobumrin Aizi), + ], + q(0686) => [ + q(Ahan), + ], + q(0687) => [ + q(Ahom), + ], + q(0688) => [ + q(Aproumu Aizi), + ], + q(0689) => [ + q(Ahirani), + ], + q(0690) => [ + q(Ashe), + ], + q(0691) => [ + q(Ahtena), + ], + q(0692) => [ + q(Arosi), + ], + q(0693) => [ + q(Ainu (China)), + ], + q(0694) => [ + q(Ainbai), + ], + q(0695) => [ + q(Alngith), + ], + q(0696) => [ + q(Amara), + ], + q(0697) => [ + q(Agi), + ], + q(0698) => [ + q(Antigua and Barbuda Creole English), + ], + q(0699) => [ + q(Ai-Cham), + ], + q(0700) => [ + q(Assyrian Neo-Aramaic), + ], + q(0701) => [ + q(Lishanid Noshan), + ], + q(0702) => [ + q(Ake), + ], + q(0703) => [ + q(Aimele), + ], + q(0704) => [ + q(Aimol), + ], + q(0705) => [ + q(Aiton), + ], + q(0706) => [ + q(Burumakok), + ], + q(0707) => [ + q(Aimaq), + ], + q(0708) => [ + q(Airoran), + ], + q(0709) => [ + q(Nataoran Amis), + ], + q(0710) => [ + q(Arikem), + ], + q(0711) => [ + q(Aari), + ], + q(0712) => [ + q(Aighon), + ], + q(0713) => [ + q(Ali), + ], + q(0714) => [ + q(Aja (Sudan)), + ], + q(0715) => [ + q(Aja (Benin)), + ], + q(0716) => [ + q(Ajie), + ], + q(0717) => [ + q(Andajin), + ], + q(0718) => [ + q(South Levantine Arabic), + ], + q(0719) => [ + q(Judeo-Tunisian Arabic), + ], + q(0720) => [ + q(Judeo-Moroccan Arabic), + ], + q(0721) => [ + q(Ajawa), + ], + q(0722) => [ + q(Amri Karbi), + ], + q(0723) => [ + q(Batak Angkola), + ], + q(0724) => [ + q(Mpur), + ], + q(0725) => [ + q(Ukpet-Ehom), + ], + q(0726) => [ + q(Akawaio), + ], + q(0727) => [ + q(Akpa), + ], + q(0728) => [ + q(Anakalangu), + ], + q(0729) => [ + q(Angal Heneng), + ], + q(0730) => [ + q(Aiome), + ], + q(0731) => [ + q(Aka-Jeru), + ], + q(0732) => [ + q(Aklanon), + ], + q(0733) => [ + q(Aka-Bo), + ], + q(0734) => [ + q(Akurio), + ], + q(0735) => [ + q(Siwu), + ], + q(0736) => [ + q(Ak), + ], + q(0737) => [ + q(Araki), + ], + q(0738) => [ + q(Akaselem), + ], + q(0739) => [ + q(Akolet), + ], + q(0740) => [ + q(Akum), + ], + q(0741) => [ + q(Akhvakh), + ], + q(0742) => [ + q(Akwa), + ], + q(0743) => [ + q(Aka-Kede), + ], + q(0744) => [ + q(Aka-Kol), + ], + q(0745) => [ + q(Alabama), + ], + q(0746) => [ + q(Alago), + ], + q(0747) => [ + q(Qawasqar), + ], + q(0748) => [ + q(Alladian), + ], + q(0749) => [ + q(Alege), + ], + q(0750) => [ + q(Alawa), + ], + q(0751) => [ + q(Amaimon), + ], + q(0752) => [ + q(Alangan), + ], + q(0753) => [ + q(Alak), + ], + q(0754) => [ + q(Allar), + ], + q(0755) => [ + q(Amblong), + ], + q(0756) => [ + q(Gheg Albanian), + ], + q(0757) => [ + q(Larike-Wakasihu), + ], + q(0758) => [ + q(Alune), + ], + q(0759) => [ + q(Algonquin), + ], + q(0760) => [ + q(Alutor), + ], + q(0761) => [ + q(Tosk Albanian), + ], + q(0762) => [ + q('Are'are), + ], + q(0763) => [ + q(Alaba-K'abeena), + q(Wanbasana), + ], + q(0764) => [ + q(Amol), + ], + q(0765) => [ + q(Alyawarr), + ], + q(0766) => [ + q(Alur), + ], + q(0767) => [ + q(Amanaye), + ], + q(0768) => [ + q(Ambo), + ], + q(0769) => [ + q(Amahuaca), + ], + q(0770) => [ + q(Yanesha'), + ], + q(0771) => [ + q(Hamer-Banna), + ], + q(0772) => [ + q(Amurdak), + ], + q(0773) => [ + q(Amis), + ], + q(0774) => [ + q(Amdang), + ], + q(0775) => [ + q(Ambai), + ], + q(0776) => [ + q(War-Jaintia), + ], + q(0777) => [ + q(Ama (Papua New Guinea)), + ], + q(0778) => [ + q(Amanab), + ], + q(0779) => [ + q(Amo), + ], + q(0780) => [ + q(Alamblak), + ], + q(0781) => [ + q(Amahai), + ], + q(0782) => [ + q(Amarakaeri), + ], + q(0783) => [ + q(Southern Amami-Oshima), + ], + q(0784) => [ + q(Amto), + ], + q(0785) => [ + q(Guerrero Amuzgo), + ], + q(0786) => [ + q(Ambelau), + ], + q(0787) => [ + q(Western Neo-Aramaic), + ], + q(0788) => [ + q(Anmatyerre), + ], + q(0789) => [ + q(Ami), + ], + q(0790) => [ + q(Atampaya), + ], + q(0791) => [ + q(Andaqui), + ], + q(0792) => [ + q(Andoa), + ], + q(0793) => [ + q(Ngas), + ], + q(0794) => [ + q(Ansus), + ], + q(0795) => [ + q(Xaracuu), + ], + q(0796) => [ + q(Animere), + ], + q(0797) => [ + q(Nend), + ], + q(0798) => [ + q(Andi), + ], + q(0799) => [ + q(Anor), + ], + q(0800) => [ + q(Goemai), + ], + q(0801) => [ + q(Anu-Hkongso Chin), + ], + q(0802) => [ + q(Anal), + ], + q(0803) => [ + q(Obolo), + ], + q(0804) => [ + q(Andoque), + ], + q(0805) => [ + q(Jarawa (India)), + ], + q(0806) => [ + q(Andh), + ], + q(0807) => [ + q(Anserma), + ], + q(0808) => [ + q(Antakarinya), + ], + q(0809) => [ + q(Anuak), + ], + q(0810) => [ + q(Denya), + ], + q(0811) => [ + q(Anaang), + ], + q(0812) => [ + q(Andra-Hus), + ], + q(0813) => [ + q(Anyin), + ], + q(0814) => [ + q(Anem), + ], + q(0815) => [ + q(Angolar), + ], + q(0816) => [ + q(Abom), + ], + q(0817) => [ + q(Pemon), + ], + q(0818) => [ + q(Andarum), + ], + q(0819) => [ + q(Angal Enen), + ], + q(0820) => [ + q(Bragat), + ], + q(0821) => [ + q(Angoram), + ], + q(0822) => [ + q(Arma), + ], + q(0823) => [ + q(Anindilyakwa), + ], + q(0824) => [ + q(Mufian), + ], + q(0825) => [ + q(Arho), + ], + q(0826) => [ + q(Alor), + ], + q(0827) => [ + q(Omie), + ], + q(0828) => [ + q(Bumbita Arapesh), + ], + q(0829) => [ + q(Aore), + ], + q(0830) => [ + q(Taikat), + ], + q(0831) => [ + q(Atong (India)), + q(A'tong), + ], + q(0832) => [ + q(A'ou), + ], + q(0833) => [ + q(Atorada), + ], + q(0834) => [ + q(Uab Meto), + ], + q(0835) => [ + q(Sa'a), + ], + q(0836) => [ + q(North Levantine Arabic), + ], + q(0837) => [ + q(Sudanese Arabic), + ], + q(0838) => [ + q(Bukiyip), + ], + q(0839) => [ + q(Pahanan Agta), + ], + q(0840) => [ + q(Ampanang), + ], + q(0841) => [ + q(Athpariya), + ], + q(0842) => [ + q(Apiaka), + ], + q(0843) => [ + q(Jicarilla Apache), + ], + q(0844) => [ + q(Kiowa Apache), + ], + q(0845) => [ + q(Lipan Apache), + ], + q(0846) => [ + q(Mescalero-Chiricahua Apache), + ], + q(0847) => [ + q(Apinaye), + ], + q(0848) => [ + q(Ambul), + ], + q(0849) => [ + q(Apma), + ], + q(0850) => [ + q(A-Pucikwar), + ], + q(0851) => [ + q(Arop-Lokep), + ], + q(0852) => [ + q(Arop-Sissano), + ], + q(0853) => [ + q(Apatani), + ], + q(0854) => [ + q(Apurina), + ], + q(0855) => [ + q(Alapmunte), + ], + q(0856) => [ + q(Western Apache), + ], + q(0857) => [ + q(Aputai), + ], + q(0858) => [ + q(Apalai), + ], + q(0859) => [ + q(Safeyoka), + ], + q(0860) => [ + q(Archi), + ], + q(0861) => [ + q(Ampari Dogon), + ], + q(0862) => [ + q(Arigidi), + ], + q(0863) => [ + q(Atohwaim), + ], + q(0864) => [ + q(Northern Alta), + ], + q(0865) => [ + q(Atakapa), + ], + q(0866) => [ + q(Arha), + ], + q(0867) => [ + q(Angaite), + ], + q(0868) => [ + q(Akuntsu), + ], + q(0869) => [ + q(Standard Arabic), + ], + q(0870) => [ + q(Arabana), + ], + q(0871) => [ + q(Western Arrarnta), + ], + q(0872) => [ + q(Arhuaco), + ], + q(0873) => [ + q(Arikara), + ], + q(0874) => [ + q(Arapaso), + ], + q(0875) => [ + q(Arikapu), + ], + q(0876) => [ + q(Arabela), + ], + q(0877) => [ + q(Araona), + ], + q(0878) => [ + q(Algerian Arabic), + ], + q(0879) => [ + q(Karo (Brazil)), + ], + q(0880) => [ + q(Najdi Arabic), + ], + q(0881) => [ + q(Arua (Amazonas State)), + q(Arawa), + ], + q(0882) => [ + q(Arbore), + ], + q(0883) => [ + q(Arua (Rodonia State)), + ], + q(0884) => [ + q(Moroccan Arabic), + ], + q(0885) => [ + q(Egyptian Arabic), + ], + q(0886) => [ + q(Asu (Tanzania)), + ], + q(0887) => [ + q(Assiniboine), + ], + q(0888) => [ + q(Casuarina Coast Asmat), + ], + q(0889) => [ + q(Asas), + ], + q(0890) => [ + q(American Sign Language), + ], + q(0891) => [ + q(Australian Sign Language), + ], + q(0892) => [ + q(Cishingini), + ], + q(0893) => [ + q(Abishira), + ], + q(0894) => [ + q(Buruwai), + ], + q(0895) => [ + q(Sari), + ], + q(0896) => [ + q(Ashkun), + ], + q(0897) => [ + q(Asilulu), + ], + q(0898) => [ + q(Xingu Asurini), + ], + q(0899) => [ + q(Dano), + ], + q(0900) => [ + q(Algerian Sign Language), + ], + q(0901) => [ + q(Austrian Sign Language), + ], + q(0902) => [ + q(Asuri), + ], + q(0903) => [ + q(Ipulo), + ], + q(0904) => [ + q(Tocantins Asurini), + ], + q(0905) => [ + q(Asoa), + ], + q(0906) => [ + q(Australian Aborigines Sign Language), + ], + q(0907) => [ + q(Muratayak), + ], + q(0908) => [ + q(Yaosakor Asmat), + ], + q(0909) => [ + q(As), + ], + q(0910) => [ + q(Pele-Ata), + ], + q(0911) => [ + q(Zaiwa), + ], + q(0912) => [ + q(Atsahuaca), + ], + q(0913) => [ + q(Ata Manobo), + ], + q(0914) => [ + q(Atemble), + ], + q(0915) => [ + q(Ivbie North-Okpela-Arhe), + ], + q(0916) => [ + q(Attie), + ], + q(0917) => [ + q(Atikamekw), + ], + q(0918) => [ + q(Ati), + ], + q(0919) => [ + q(Mt. Iraya Agta), + ], + q(0920) => [ + q(Ata), + ], + q(0921) => [ + q(Ashtiani), + ], + q(0922) => [ + q(Atong (Cameroon)), + ], + q(0923) => [ + q(Pudtol Atta), + ], + q(0924) => [ + q(Aralle-Tabulahan), + ], + q(0925) => [ + q(Waimiri-Atroari), + ], + q(0926) => [ + q(Gros Ventre), + ], + q(0927) => [ + q(Pamplona Atta), + ], + q(0928) => [ + q(Reel), + ], + q(0929) => [ + q(Northern Altai), + ], + q(0930) => [ + q(Atsugewi), + ], + q(0931) => [ + q(Arutani), + ], + q(0932) => [ + q(Aneityum), + ], + q(0933) => [ + q(Arta), + ], + q(0934) => [ + q(Asumboa), + ], + q(0935) => [ + q(Alugu), + ], + q(0936) => [ + q(Waorani), + ], + q(0937) => [ + q(Anuta), + ], + q(0938) => [ + q(Aguna), + ], + q(0939) => [ + q(Aushi), + ], + q(0940) => [ + q(Anuki), + ], + q(0941) => [ + q(Awjilah), + ], + q(0942) => [ + q(Heyo), + ], + q(0943) => [ + q(Aulua), + ], + q(0944) => [ + q(Asu (Nigeria)), + ], + q(0945) => [ + q(Molmo One), + ], + q(0946) => [ + q(Auyokawa), + ], + q(0947) => [ + q(Makayam), + ], + q(0948) => [ + q(Anus), + q(Korur), + ], + q(0949) => [ + q(Aruek), + ], + q(0950) => [ + q(Austral), + ], + q(0951) => [ + q(Auye), + ], + q(0952) => [ + q(Awyi), + ], + q(0953) => [ + q(Aura), + ], + q(0954) => [ + q(Awiyaana), + ], + q(0955) => [ + q(Uzbeki Arabic), + ], + q(0956) => [ + q(Avau), + ], + q(0957) => [ + q(Alviri-Vidari), + ], + q(0958) => [ + q(Avikam), + ], + q(0959) => [ + q(Kotava), + ], + q(0960) => [ + q(Eastern Egyptian Bedawi Arabic), + ], + q(0961) => [ + q(Angkamuthi), + ], + q(0962) => [ + q(Avatime), + ], + q(0963) => [ + q(Agavotaguerra), + ], + q(0964) => [ + q(Aushiri), + ], + q(0965) => [ + q(Au), + ], + q(0966) => [ + q(Avokaya), + ], + q(0967) => [ + q(Ava-Canoeiro), + ], + q(0968) => [ + q(Awa (Papua New Guinea)), + ], + q(0969) => [ + q(Cicipu), + ], + q(0970) => [ + q(Aweti), + ], + q(0971) => [ + q(Anguthimri), + ], + q(0972) => [ + q(Awbono), + ], + q(0973) => [ + q(Aekyom), + ], + q(0974) => [ + q(Awabakal), + ], + q(0975) => [ + q(Arawum), + ], + q(0976) => [ + q(Awngi), + ], + q(0977) => [ + q(Awak), + ], + q(0978) => [ + q(Awera), + ], + q(0979) => [ + q(South Awyu), + ], + q(0980) => [ + q(Arawete), + ], + q(0981) => [ + q(Central Awyu), + ], + q(0982) => [ + q(Jair Awyu), + ], + q(0983) => [ + q(Awun), + ], + q(0984) => [ + q(Awara), + ], + q(0985) => [ + q(Edera Awyu), + ], + q(0986) => [ + q(Abipon), + ], + q(0987) => [ + q(Ayerrerenge), + ], + q(0988) => [ + q(Mato Grosso Arara), + ], + q(0989) => [ + q(Yaka (Central African Republic)), + ], + q(0990) => [ + q(Lower Southern Aranda), + ], + q(0991) => [ + q(Middle Armenian), + ], + q(0992) => [ + q(Xaragure), + ], + q(0993) => [ + q(Awar), + ], + q(0994) => [ + q(Ayizo Gbe), + ], + q(0995) => [ + q(Southern Aymara), + ], + q(0996) => [ + q(Ayabadhu), + ], + q(0997) => [ + q(Ayere), + ], + q(0998) => [ + q(Ginyanga), + ], + q(0999) => [ + q(Hadrami Arabic), + ], + q(1000) => [ + q(Leyigha), + ], + q(1001) => [ + q(Akuku), + ], + q(1002) => [ + q(Libyan Arabic), + ], + q(1003) => [ + q(Sanaani Arabic), + ], + q(1004) => [ + q(Ayoreo), + ], + q(1005) => [ + q(North Mesopotamian Arabic), + ], + q(1006) => [ + q(Ayi (Papua New Guinea)), + ], + q(1007) => [ + q(Central Aymara), + ], + q(1008) => [ + q(Sorsogon Ayta), + ], + q(1009) => [ + q(Magbukun Ayta), + ], + q(1010) => [ + q(Ayu), + ], + q(1011) => [ + q(Tayabas Ayta), + ], + q(1012) => [ + q(Mai Brat), + ], + q(1013) => [ + q(Azha), + ], + q(1014) => [ + q(South Azerbaijani), + ], + q(1015) => [ + q(Eastern Durango Nahuatl), + ], + q(1016) => [ + q(San Pedro Amuzgos Amuzgo), + ], + q(1017) => [ + q(North Azerbaijani), + ], + q(1018) => [ + q(Ipalapa Amuzgo), + ], + q(1019) => [ + q(Western Durango Nahuatl), + ], + q(1020) => [ + q(Awing), + ], + q(1021) => [ + q(Faire Atta), + ], + q(1022) => [ + q(Highland Puebla Nahuatl), + ], + q(1023) => [ + q(Babatana), + ], + q(1024) => [ + q(Bainouk-Gunyuno), + ], + q(1025) => [ + q(Badui), + ], + q(1026) => [ + q(Bare), + ], + q(1027) => [ + q(Nubaca), + ], + q(1028) => [ + q(Tuki), + ], + q(1029) => [ + q(Bahamas Creole English), + ], + q(1030) => [ + q(Barakai), + ], + q(1031) => [ + q(Waimaha), + ], + q(1032) => [ + q(Bantawa), + ], + q(1033) => [ + q(Bavarian), + ], + q(1034) => [ + q(Bada (Nigeria)), + ], + q(1035) => [ + q(Vengo), + ], + q(1036) => [ + q(Bambili-Bambui), + ], + q(1037) => [ + q(Bamun), + ], + q(1038) => [ + q(Batuley), + ], + q(1039) => [ + q(Baatonum), + ], + q(1040) => [ + q(Barai), + ], + q(1041) => [ + q(Batak Toba), + ], + q(1042) => [ + q(Bau), + ], + q(1043) => [ + q(Bangba), + ], + q(1044) => [ + q(Baibai), + ], + q(1045) => [ + q(Barama), + ], + q(1046) => [ + q(Bugan), + ], + q(1047) => [ + q(Barombi), + ], + q(1048) => [ + q(Ghomala'), + ], + q(1049) => [ + q(Babanki), + ], + q(1050) => [ + q(Bats), + ], + q(1051) => [ + q(Babango), + ], + q(1052) => [ + q(Uneapa), + ], + q(1053) => [ + q(Northern Bobo Madare), + q(Konabere), + ], + q(1054) => [ + q(West Central Banda), + ], + q(1055) => [ + q(Bamali), + ], + q(1056) => [ + q(Girawa), + ], + q(1057) => [ + q(Bakpinka), + ], + q(1058) => [ + q(Mburku), + ], + q(1059) => [ + q(Kulung (Nigeria)), + ], + q(1060) => [ + q(Karnai), + ], + q(1061) => [ + q(Baba), + ], + q(1062) => [ + q(Bubia), + ], + q(1063) => [ + q(Befang), + ], + q(1064) => [ + q(Babalia Creole Arabic), + ], + q(1065) => [ + q(Central Bai), + ], + q(1066) => [ + q(Bainouk-Samik), + ], + q(1067) => [ + q(Southern Balochi), + ], + q(1068) => [ + q(North Babar), + ], + q(1069) => [ + q(Bamenyam), + ], + q(1070) => [ + q(Bamu), + ], + q(1071) => [ + q(Baga Pokur), + ], + q(1072) => [ + q(Bariai), + ], + q(1073) => [ + q(Baoule), + ], + q(1074) => [ + q(Bardi), + ], + q(1075) => [ + q(Bunaba), + ], + q(1076) => [ + q(Central Bikol), + ], + q(1077) => [ + q(Bannoni), + ], + q(1078) => [ + q(Bali (Nigeria)), + ], + q(1079) => [ + q(Kaluli), + ], + q(1080) => [ + q(Bali (Democratic Republic of Congo)), + ], + q(1081) => [ + q(Bench), + ], + q(1082) => [ + q(Babine), + ], + q(1083) => [ + q(Kohumono), + ], + q(1084) => [ + q(Bendi), + ], + q(1085) => [ + q(Awad Bing), + ], + q(1086) => [ + q(Shoo-Minda-Nye), + ], + q(1087) => [ + q(Bana), + ], + q(1088) => [ + q(Bacama), + ], + q(1089) => [ + q(Bainouk-Gunyaamolo), + ], + q(1090) => [ + q(Bayot), + ], + q(1091) => [ + q(Basap), + ], + q(1092) => [ + q(Embera-Baudo), + ], + q(1093) => [ + q(Bunama), + ], + q(1094) => [ + q(Bade), + ], + q(1095) => [ + q(Biage), + ], + q(1096) => [ + q(Bonggi), + ], + q(1097) => [ + q(Baka (Sudan)), + ], + q(1098) => [ + q(Burun), + ], + q(1099) => [ + q(Bai), + ], + q(1100) => [ + q(Budukh), + ], + q(1101) => [ + q(Indonesian Bajau), + ], + q(1102) => [ + q(Buduma), + ], + q(1103) => [ + q(Baldemu), + ], + q(1104) => [ + q(Morom), + ], + q(1105) => [ + q(Bende), + ], + q(1106) => [ + q(Bahnar), + ], + q(1107) => [ + q(West Coast Bajau), + ], + q(1108) => [ + q(Burunge), + ], + q(1109) => [ + q(Bokoto), + ], + q(1110) => [ + q(Oroko), + ], + q(1111) => [ + q(Bodo Parja), + ], + q(1112) => [ + q(Baham), + ], + q(1113) => [ + q(Budong-Budong), + ], + q(1114) => [ + q(Bandjalang), + ], + q(1115) => [ + q(Badeshi), + ], + q(1116) => [ + q(Beaver), + ], + q(1117) => [ + q(Bebele), + ], + q(1118) => [ + q(Iceve-Maci), + ], + q(1119) => [ + q(Bedoanas), + ], + q(1120) => [ + q(Byangsi), + ], + q(1121) => [ + q(Benabena), + ], + q(1122) => [ + q(Belait), + ], + q(1123) => [ + q(Biali), + ], + q(1124) => [ + q(Bekati'), + ], + q(1125) => [ + q(Bebeli), + ], + q(1126) => [ + q(Beami), + ], + q(1127) => [ + q(Besoa), + ], + q(1128) => [ + q(Beembe), + ], + q(1129) => [ + q(Besme), + ], + q(1130) => [ + q(Guiberoua Bete), + ], + q(1131) => [ + q(Blagar), + ], + q(1132) => [ + q(Daloa Bete), + ], + q(1133) => [ + q(Betawi), + ], + q(1134) => [ + q(Jur Modo), + ], + q(1135) => [ + q(Beli (Papua New Guinea)), + ], + q(1136) => [ + q(Bena (Tanzania)), + ], + q(1137) => [ + q(Bari), + ], + q(1138) => [ + q(Pauri Bareli), + ], + q(1139) => [ + q(Panyi Bai), + q(Northern Bai), + ], + q(1140) => [ + q(Bafut), + ], + q(1141) => [ + q(Betaf), + q(Tena), + ], + q(1142) => [ + q(Bofi), + ], + q(1143) => [ + q(Busang Kayan), + ], + q(1144) => [ + q(Blafe), + ], + q(1145) => [ + q(British Sign Language), + ], + q(1146) => [ + q(Bafanji), + ], + q(1147) => [ + q(Ban Khor Sign Language), + ], + q(1148) => [ + q(Banda-Ndele), + ], + q(1149) => [ + q(Mmen), + ], + q(1150) => [ + q(Bunak), + ], + q(1151) => [ + q(Malba Birifor), + ], + q(1152) => [ + q(Beba), + ], + q(1153) => [ + q(Badaga), + ], + q(1154) => [ + q(Bazigar), + ], + q(1155) => [ + q(Southern Bai), + ], + q(1156) => [ + q(Balti), + ], + q(1157) => [ + q(Gahri), + ], + q(1158) => [ + q(Bondo), + ], + q(1159) => [ + q(Bantayanon), + ], + q(1160) => [ + q(Bagheli), + ], + q(1161) => [ + q(Mahasu Pahari), + ], + q(1162) => [ + q(Gwamhi-Wuri), + ], + q(1163) => [ + q(Bobongko), + ], + q(1164) => [ + q(Haryanvi), + ], + q(1165) => [ + q(Rathwi Bareli), + ], + q(1166) => [ + q(Bauria), + ], + q(1167) => [ + q(Bangandu), + ], + q(1168) => [ + q(Bugun), + ], + q(1169) => [ + q(Giangan), + ], + q(1170) => [ + q(Bangolan), + ], + q(1171) => [ + q(Bit), + q(Buxinhua), + ], + q(1172) => [ + q(Bo (Laos)), + ], + q(1173) => [ + q(Western Balochi), + ], + q(1174) => [ + q(Baga Koga), + ], + q(1175) => [ + q(Eastern Balochi), + ], + q(1176) => [ + q(Bagri), + ], + q(1177) => [ + q(Bawm Chin), + ], + q(1178) => [ + q(Tagabawa), + ], + q(1179) => [ + q(Bughotu), + ], + q(1180) => [ + q(Mbongno), + ], + q(1181) => [ + q(Warkay-Bipim), + ], + q(1182) => [ + q(Bhatri), + ], + q(1183) => [ + q(Balkan Gagauz Turkish), + ], + q(1184) => [ + q(Benggoi), + ], + q(1185) => [ + q(Banggai), + ], + q(1186) => [ + q(Bharia), + ], + q(1187) => [ + q(Bhili), + ], + q(1188) => [ + q(Biga), + ], + q(1189) => [ + q(Bhadrawahi), + ], + q(1190) => [ + q(Bhaya), + ], + q(1191) => [ + q(Odiai), + ], + q(1192) => [ + q(Binandere), + ], + q(1193) => [ + q(Bukharic), + ], + q(1194) => [ + q(Bhilali), + ], + q(1195) => [ + q(Bahing), + ], + q(1196) => [ + q(Bimin), + ], + q(1197) => [ + q(Bathari), + ], + q(1198) => [ + q(Bohtan Neo-Aramaic), + ], + q(1199) => [ + q(Bima), + ], + q(1200) => [ + q(Tukang Besi South), + ], + q(1201) => [ + q(Bara Malagasy), + ], + q(1202) => [ + q(Buwal), + ], + q(1203) => [ + q(Bhattiyali), + ], + q(1204) => [ + q(Bhunjia), + ], + q(1205) => [ + q(Bahau), + ], + q(1206) => [ + q(Biak), + ], + q(1207) => [ + q(Bhalay), + ], + q(1208) => [ + q(Bhele), + ], + q(1209) => [ + q(Bada (Indonesia)), + ], + q(1210) => [ + q(Badimaya), + ], + q(1211) => [ + q(Bissa), + q(Bisa), + ], + q(1212) => [ + q(Bikaru), + ], + q(1213) => [ + q(Bidiyo), + ], + q(1214) => [ + q(Bepour), + ], + q(1215) => [ + q(Biafada), + ], + q(1216) => [ + q(Biangai), + ], + q(1217) => [ + q(Vaghat-Ya-Bijim-Legeri), + ], + q(1218) => [ + q(Bile), + ], + q(1219) => [ + q(Bimoba), + ], + q(1220) => [ + q(Nai), + ], + q(1221) => [ + q(Bila), + ], + q(1222) => [ + q(Bipi), + ], + q(1223) => [ + q(Bisorio), + ], + q(1224) => [ + q(Berinomo), + ], + q(1225) => [ + q(Biete), + ], + q(1226) => [ + q(Southern Birifor), + ], + q(1227) => [ + q(Kol (Cameroon)), + ], + q(1228) => [ + q(Bijori), + ], + q(1229) => [ + q(Birhor), + ], + q(1230) => [ + q(Baloi), + ], + q(1231) => [ + q(Budza), + ], + q(1232) => [ + q(Banggarla), + ], + q(1233) => [ + q(Bariji), + ], + q(1234) => [ + q(Biao-Jiao Mien), + ], + q(1235) => [ + q(Barzani Jewish Neo-Aramaic), + ], + q(1236) => [ + q(Bidyogo), + ], + q(1237) => [ + q(Bahinemo), + ], + q(1238) => [ + q(Burji), + ], + q(1239) => [ + q(Kanauji), + ], + q(1240) => [ + q(Barok), + ], + q(1241) => [ + q(Bulu (Papua New Guinea)), + ], + q(1242) => [ + q(Bajelani), + ], + q(1243) => [ + q(Banjar), + ], + q(1244) => [ + q(Mid-Southern Banda), + ], + q(1245) => [ + q(Fanamaket), + ], + q(1246) => [ + q(Binumarien), + ], + q(1247) => [ + q(Bajan), + ], + q(1248) => [ + q(Balanta-Ganja), + ], + q(1249) => [ + q(Busuu), + ], + q(1250) => [ + q(Bedjond), + ], + q(1251) => [ + q(Bakwe), + ], + q(1252) => [ + q(Banao Itneg), + ], + q(1253) => [ + q(Bayali), + ], + q(1254) => [ + q(Baruga), + ], + q(1255) => [ + q(Kyak), + ], + q(1256) => [ + q(Baka (Cameroon)), + ], + q(1257) => [ + q(Binukid), + q(Talaandig), + ], + q(1258) => [ + q(Beeke), + ], + q(1259) => [ + q(Buraka), + ], + q(1260) => [ + q(Bakoko), + ], + q(1261) => [ + q(Baki), + ], + q(1262) => [ + q(Pande), + ], + q(1263) => [ + q(Brokskat), + ], + q(1264) => [ + q(Berik), + ], + q(1265) => [ + q(Kom (Cameroon)), + ], + q(1266) => [ + q(Bukitan), + ], + q(1267) => [ + q(Kwa'), + ], + q(1268) => [ + q(Boko (Democratic Republic of Congo)), + ], + q(1269) => [ + q(Bakairi), + ], + q(1270) => [ + q(Bakumpai), + ], + q(1271) => [ + q(Northern Sorsoganon), + ], + q(1272) => [ + q(Boloki), + ], + q(1273) => [ + q(Buhid), + ], + q(1274) => [ + q(Bekwarra), + ], + q(1275) => [ + q(Bekwel), + ], + q(1276) => [ + q(Baikeno), + ], + q(1277) => [ + q(Bokyi), + ], + q(1278) => [ + q(Bungku), + ], + q(1279) => [ + q(Bilua), + ], + q(1280) => [ + q(Bella Coola), + ], + q(1281) => [ + q(Bolango), + ], + q(1282) => [ + q(Balanta-Kentohe), + ], + q(1283) => [ + q(Buol), + ], + q(1284) => [ + q(Balau), + ], + q(1285) => [ + q(Kuwaa), + ], + q(1286) => [ + q(Bolia), + ], + q(1287) => [ + q(Bolongan), + ], + q(1288) => [ + q(Pa'o Karen), + q(Pa'O), + ], + q(1289) => [ + q(Biloxi), + ], + q(1290) => [ + q(Beli (Sudan)), + ], + q(1291) => [ + q(Southern Catanduanes Bikol), + ], + q(1292) => [ + q(Anii), + ], + q(1293) => [ + q(Blablanga), + ], + q(1294) => [ + q(Baluan-Pam), + ], + q(1295) => [ + q(Blang), + ], + q(1296) => [ + q(Balaesang), + ], + q(1297) => [ + q(Tai Dam), + ], + q(1298) => [ + q(Kibala), + q(Bolo), + ], + q(1299) => [ + q(Balangao), + ], + q(1300) => [ + q(Mag-Indi Ayta), + ], + q(1301) => [ + q(Notre), + ], + q(1302) => [ + q(Balantak), + ], + q(1303) => [ + q(Lame), + ], + q(1304) => [ + q(Bembe), + ], + q(1305) => [ + q(Biem), + ], + q(1306) => [ + q(Baga Manduri), + ], + q(1307) => [ + q(Limassa), + ], + q(1308) => [ + q(Bom-Kim), + ], + q(1309) => [ + q(Bamwe), + ], + q(1310) => [ + q(Kein), + ], + q(1311) => [ + q(Bagirmi), + ], + q(1312) => [ + q(Bote-Majhi), + ], + q(1313) => [ + q(Ghayavi), + ], + q(1314) => [ + q(Bomboli), + ], + q(1315) => [ + q(Northern Betsimisaraka Malagasy), + ], + q(1316) => [ + q(Bina (Papua New Guinea)), + ], + q(1317) => [ + q(Bambalang), + ], + q(1318) => [ + q(Bulgebi), + ], + q(1319) => [ + q(Bomu), + ], + q(1320) => [ + q(Muinane), + ], + q(1321) => [ + q(Bilma Kanuri), + ], + q(1322) => [ + q(Biao Mon), + ], + q(1323) => [ + q(Somba-Siawari), + ], + q(1324) => [ + q(Bum), + ], + q(1325) => [ + q(Bomwali), + ], + q(1326) => [ + q(Baimak), + ], + q(1327) => [ + q(Baramu), + ], + q(1328) => [ + q(Bonerate), + ], + q(1329) => [ + q(Bookan), + ], + q(1330) => [ + q(Bontok), + ], + q(1331) => [ + q(Banda (Indonesia)), + ], + q(1332) => [ + q(Bintauna), + ], + q(1333) => [ + q(Masiwang), + ], + q(1334) => [ + q(Benga), + ], + q(1335) => [ + q(Bangi), + ], + q(1336) => [ + q(Eastern Tawbuid), + ], + q(1337) => [ + q(Bierebo), + ], + q(1338) => [ + q(Boon), + ], + q(1339) => [ + q(Batanga), + ], + q(1340) => [ + q(Bunun), + ], + q(1341) => [ + q(Bantoanon), + ], + q(1342) => [ + q(Bola), + ], + q(1343) => [ + q(Bantik), + ], + q(1344) => [ + q(Butmas-Tur), + ], + q(1345) => [ + q(Bundeli), + ], + q(1346) => [ + q(Bentong), + ], + q(1347) => [ + q(Bonerif), + q(Beneraf), + q(Edwas), + ], + q(1348) => [ + q(Bisis), + ], + q(1349) => [ + q(Bangubangu), + ], + q(1350) => [ + q(Bintulu), + ], + q(1351) => [ + q(Beezen), + ], + q(1352) => [ + q(Bora), + ], + q(1353) => [ + q(Aweer), + ], + q(1354) => [ + q(Mundabli), + ], + q(1355) => [ + q(Bolon), + ], + q(1356) => [ + q(Bamako Sign Language), + ], + q(1357) => [ + q(Boma), + ], + q(1358) => [ + q(Barbareno), + ], + q(1359) => [ + q(Anjam), + ], + q(1360) => [ + q(Bonjo), + ], + q(1361) => [ + q(Bole), + ], + q(1362) => [ + q(Berom), + ], + q(1363) => [ + q(Bine), + ], + q(1364) => [ + q(Tiemacewe Bozo), + ], + q(1365) => [ + q(Bonkiman), + ], + q(1366) => [ + q(Bogaya), + ], + q(1367) => [ + q(Bororo), + ], + q(1368) => [ + q(Bongo), + ], + q(1369) => [ + q(Bondei), + ], + q(1370) => [ + q(Tuwuli), + ], + q(1371) => [ + q(Rema), + ], + q(1372) => [ + q(Buamu), + ], + q(1373) => [ + q(Bodo (Central African Republic)), + ], + q(1374) => [ + q(Tieyaxo Bozo), + ], + q(1375) => [ + q(Daakaka), + ], + q(1376) => [ + q(Barbacoas), + ], + q(1377) => [ + q(Banda-Banda), + ], + q(1378) => [ + q(Bonggo), + ], + q(1379) => [ + q(Botlikh), + ], + q(1380) => [ + q(Bagupi), + ], + q(1381) => [ + q(Binji), + ], + q(1382) => [ + q(Orowe), + q('Oroe), + ], + q(1383) => [ + q(Broome Pearling Lugger Pidgin), + ], + q(1384) => [ + q(Biyom), + ], + q(1385) => [ + q(Dzao Min), + ], + q(1386) => [ + q(Anasi), + ], + q(1387) => [ + q(Kaure), + ], + q(1388) => [ + q(Banda Malay), + ], + q(1389) => [ + q(Koronadal Blaan), + ], + q(1390) => [ + q(Sarangani Blaan), + ], + q(1391) => [ + q(Barrow Point), + ], + q(1392) => [ + q(Bongu), + ], + q(1393) => [ + q(Bian Marind), + ], + q(1394) => [ + q(Bo (Papua New Guinea)), + ], + q(1395) => [ + q(Palya Bareli), + ], + q(1396) => [ + q(Bishnupriya), + ], + q(1397) => [ + q(Bilba), + ], + q(1398) => [ + q(Tchumbuli), + ], + q(1399) => [ + q(Bagusa), + ], + q(1400) => [ + q(Boko (Benin)), + q(Boo), + ], + q(1401) => [ + q(Bung), + ], + q(1402) => [ + q(Baga Kaloum), + ], + q(1403) => [ + q(Bago-Kusuntu), + ], + q(1404) => [ + q(Baima), + ], + q(1405) => [ + q(Bakhtiari), + ], + q(1406) => [ + q(Bandial), + ], + q(1407) => [ + q(Banda-Mbres), + ], + q(1408) => [ + q(Bilakura), + ], + q(1409) => [ + q(Wumboko), + ], + q(1410) => [ + q(Bulgarian Sign Language), + ], + q(1411) => [ + q(Balo), + ], + q(1412) => [ + q(Busa), + ], + q(1413) => [ + q(Biritai), + ], + q(1414) => [ + q(Burusu), + ], + q(1415) => [ + q(Bosngun), + ], + q(1416) => [ + q(Bamukumbit), + ], + q(1417) => [ + q(Boguru), + ], + q(1418) => [ + q(Koro Wachi), + q(Begbere-Ejar), + ], + q(1419) => [ + q(Buru (Nigeria)), + ], + q(1420) => [ + q(Baangi), + ], + q(1421) => [ + q(Bengkala Sign Language), + ], + q(1422) => [ + q(Bakaka), + ], + q(1423) => [ + q(Lave), + ], + q(1424) => [ + q(Berbice Creole Dutch), + ], + q(1425) => [ + q(Baraamu), + ], + q(1426) => [ + q(Bera), + ], + q(1427) => [ + q(Baure), + ], + q(1428) => [ + q(Brahui), + ], + q(1429) => [ + q(Mokpwe), + ], + q(1430) => [ + q(Bieria), + ], + q(1431) => [ + q(Birked), + ], + q(1432) => [ + q(Birwa), + ], + q(1433) => [ + q(Barambu), + ], + q(1434) => [ + q(Boruca), + ], + q(1435) => [ + q(Brokkat), + ], + q(1436) => [ + q(Barapasi), + ], + q(1437) => [ + q(Breri), + ], + q(1438) => [ + q(Birao), + ], + q(1439) => [ + q(Baras), + ], + q(1440) => [ + q(Bitare), + ], + q(1441) => [ + q(Eastern Bru), + ], + q(1442) => [ + q(Western Bru), + ], + q(1443) => [ + q(Bellari), + ], + q(1444) => [ + q(Bodo (India)), + ], + q(1445) => [ + q(Burui), + ], + q(1446) => [ + q(Bilbil), + ], + q(1447) => [ + q(Abinomn), + ], + q(1448) => [ + q(Brunei Bisaya), + ], + q(1449) => [ + q(Bassari), + q(Oniyan), + ], + q(1450) => [ + q(Wushi), + ], + q(1451) => [ + q(Bauchi), + ], + q(1452) => [ + q(Bashkardi), + ], + q(1453) => [ + q(Kati), + ], + q(1454) => [ + q(Bassossi), + ], + q(1455) => [ + q(Bangwinji), + ], + q(1456) => [ + q(Burushaski), + ], + q(1457) => [ + q(Basa-Gumna), + ], + q(1458) => [ + q(Busami), + ], + q(1459) => [ + q(Barasana-Eduria), + ], + q(1460) => [ + q(Buso), + ], + q(1461) => [ + q(Baga Sitemu), + ], + q(1462) => [ + q(Bassa), + ], + q(1463) => [ + q(Bassa-Kontagora), + ], + q(1464) => [ + q(Akoose), + ], + q(1465) => [ + q(Basketo), + ], + q(1466) => [ + q(Bahonsuai), + ], + q(1467) => [ + q(Baga Sobane), + ], + q(1468) => [ + q(Baiso), + ], + q(1469) => [ + q(Yangkam), + ], + q(1470) => [ + q(Sabah Bisaya), + ], + q(1471) => [ + q(Bata), + ], + q(1472) => [ + q(Bati (Cameroon)), + ], + q(1473) => [ + q(Batak Dairi), + ], + q(1474) => [ + q(Gamo-Ningi), + ], + q(1475) => [ + q(Birgit), + ], + q(1476) => [ + q(Gagnoa Bete), + ], + q(1477) => [ + q(Biatah Bidayuh), + ], + q(1478) => [ + q(Burate), + ], + q(1479) => [ + q(Bacanese Malay), + ], + q(1480) => [ + q(Batak Mandailing), + ], + q(1481) => [ + q(Ratagnon), + ], + q(1482) => [ + q(Rinconada Bikol), + ], + q(1483) => [ + q(Budibud), + ], + q(1484) => [ + q(Batek), + ], + q(1485) => [ + q(Baetora), + ], + q(1486) => [ + q(Batak Simalungun), + ], + q(1487) => [ + q(Bete-Bendi), + ], + q(1488) => [ + q(Batu), + ], + q(1489) => [ + q(Bateri), + ], + q(1490) => [ + q(Butuanon), + ], + q(1491) => [ + q(Batak Karo), + ], + q(1492) => [ + q(Bobot), + ], + q(1493) => [ + q(Batak Alas-Kluet), + ], + q(1494) => [ + q(Bua), + ], + q(1495) => [ + q(Bushi), + ], + q(1496) => [ + q(Ntcham), + ], + q(1497) => [ + q(Beothuk), + ], + q(1498) => [ + q(Bushoong), + ], + q(1499) => [ + q(Younuo Bunu), + ], + q(1500) => [ + q(Bongili), + ], + q(1501) => [ + q(Basa-Gurmana), + ], + q(1502) => [ + q(Bugawac), + ], + q(1503) => [ + q(Bulu (Cameroon)), + ], + q(1504) => [ + q(Sherbro), + ], + q(1505) => [ + q(Terei), + ], + q(1506) => [ + q(Busoa), + ], + q(1507) => [ + q(Brem), + ], + q(1508) => [ + q(Bokobaru), + ], + q(1509) => [ + q(Bungain), + ], + q(1510) => [ + q(Budu), + ], + q(1511) => [ + q(Bun), + ], + q(1512) => [ + q(Bubi), + ], + q(1513) => [ + q(Boghom), + ], + q(1514) => [ + q(Bullom So), + ], + q(1515) => [ + q(Bukwen), + ], + q(1516) => [ + q(Barein), + ], + q(1517) => [ + q(Bube), + ], + q(1518) => [ + q(Baelelea), + ], + q(1519) => [ + q(Baeggu), + ], + q(1520) => [ + q(Berau Malay), + ], + q(1521) => [ + q(Boor), + ], + q(1522) => [ + q(Bonkeng), + ], + q(1523) => [ + q(Bure), + ], + q(1524) => [ + q(Belanda Viri), + ], + q(1525) => [ + q(Baan), + ], + q(1526) => [ + q(Bukat), + ], + q(1527) => [ + q(Bolivian Sign Language), + ], + q(1528) => [ + q(Bamunka), + ], + q(1529) => [ + q(Buna), + ], + q(1530) => [ + q(Bolgo), + ], + q(1531) => [ + q(Bumang), + ], + q(1532) => [ + q(Birri), + ], + q(1533) => [ + q(Burarra), + ], + q(1534) => [ + q(Bati (Indonesia)), + ], + q(1535) => [ + q(Bukit Malay), + ], + q(1536) => [ + q(Baniva), + ], + q(1537) => [ + q(Boga), + ], + q(1538) => [ + q(Dibole), + ], + q(1539) => [ + q(Baybayanon), + ], + q(1540) => [ + q(Bauzi), + ], + q(1541) => [ + q(Bwatoo), + ], + q(1542) => [ + q(Namosi-Naitasiri-Serua), + ], + q(1543) => [ + q(Bwile), + ], + q(1544) => [ + q(Bwaidoka), + ], + q(1545) => [ + q(Bwe Karen), + ], + q(1546) => [ + q(Boselewa), + ], + q(1547) => [ + q(Barwe), + ], + q(1548) => [ + q(Bishuo), + ], + q(1549) => [ + q(Baniwa), + ], + q(1550) => [ + q(Laa Laa Bwamu), + ], + q(1551) => [ + q(Bauwaki), + ], + q(1552) => [ + q(Bwela), + ], + q(1553) => [ + q(Biwat), + ], + q(1554) => [ + q(Wunai Bunu), + ], + q(1555) => [ + q(Boro (Ethiopia)), + q(Borna (Ethiopia)), + ], + q(1556) => [ + q(Mandobo Bawah), + ], + q(1557) => [ + q(Southern Bobo Madare), + ], + q(1558) => [ + q(Bura-Pabir), + ], + q(1559) => [ + q(Bomboma), + ], + q(1560) => [ + q(Bafaw-Balong), + ], + q(1561) => [ + q(Buli (Ghana)), + ], + q(1562) => [ + q(Bwa), + ], + q(1563) => [ + q(Bu-Nao Bunu), + ], + q(1564) => [ + q(Cwi Bwamu), + ], + q(1565) => [ + q(Bwisi), + ], + q(1566) => [ + q(Tairaha), + ], + q(1567) => [ + q(Belanda Bor), + ], + q(1568) => [ + q(Molengue), + ], + q(1569) => [ + q(Pela), + ], + q(1570) => [ + q(Birale), + ], + q(1571) => [ + q(Bilur), + q(Minigir), + ], + q(1572) => [ + q(Bangala), + ], + q(1573) => [ + q(Buhutu), + ], + q(1574) => [ + q(Pirlatapa), + ], + q(1575) => [ + q(Bayungu), + ], + q(1576) => [ + q(Bukusu), + q(Lubukusu), + ], + q(1577) => [ + q(Jalkunan), + ], + q(1578) => [ + q(Mongolia Buriat), + ], + q(1579) => [ + q(Burduna), + ], + q(1580) => [ + q(Barikanchi), + ], + q(1581) => [ + q(Bebil), + ], + q(1582) => [ + q(Beele), + ], + q(1583) => [ + q(Russia Buriat), + ], + q(1584) => [ + q(Busam), + ], + q(1585) => [ + q(China Buriat), + ], + q(1586) => [ + q(Berakou), + ], + q(1587) => [ + q(Bankagooma), + ], + q(1588) => [ + q(Binahari), + ], + q(1589) => [ + q(Batak), + ], + q(1590) => [ + q(Bikya), + ], + q(1591) => [ + q(Ubaghara), + ], + q(1592) => [ + q(Benyadu'), + ], + q(1593) => [ + q(Pouye), + ], + q(1594) => [ + q(Bete), + ], + q(1595) => [ + q(Baygo), + ], + q(1596) => [ + q(Bhujel), + ], + q(1597) => [ + q(Buyu), + ], + q(1598) => [ + q(Bina (Nigeria)), + ], + q(1599) => [ + q(Biao), + ], + q(1600) => [ + q(Bayono), + ], + q(1601) => [ + q(Bidyara), + ], + q(1602) => [ + q(Biyo), + ], + q(1603) => [ + q(Bumaji), + ], + q(1604) => [ + q(Basay), + ], + q(1605) => [ + q(Baruya), + q(Yipma), + ], + q(1606) => [ + q(Burak), + ], + q(1607) => [ + q(Berti), + ], + q(1608) => [ + q(Medumba), + ], + q(1609) => [ + q(Belhariya), + ], + q(1610) => [ + q(Qaqet), + ], + q(1611) => [ + q(Banaro), + ], + q(1612) => [ + q(Bandi), + ], + q(1613) => [ + q(Andio), + ], + q(1614) => [ + q(Southern Betsimisaraka Malagasy), + ], + q(1615) => [ + q(Bribri), + ], + q(1616) => [ + q(Jenaama Bozo), + ], + q(1617) => [ + q(Boikin), + ], + q(1618) => [ + q(Babuza), + ], + q(1619) => [ + q(Mapos Buang), + ], + q(1620) => [ + q(Bisu), + ], + q(1621) => [ + q(Belize Kriol English), + ], + q(1622) => [ + q(Nicaragua Creole English), + ], + q(1623) => [ + q(Boano (Sulawesi)), + ], + q(1624) => [ + q(Bolondo), + ], + q(1625) => [ + q(Boano (Maluku)), + ], + q(1626) => [ + q(Bozaba), + ], + q(1627) => [ + q(Kemberano), + ], + q(1628) => [ + q(Buli (Indonesia)), + ], + q(1629) => [ + q(Biri), + ], + q(1630) => [ + q(Brazilian Sign Language), + ], + q(1631) => [ + q(Brithenig), + ], + q(1632) => [ + q(Burmeso), + ], + q(1633) => [ + q(Naami), + ], + q(1634) => [ + q(Basa (Nigeria)), + ], + q(1635) => [ + q(Kelengazxo Bozo), + ], + q(1636) => [ + q(Obanliku), + ], + q(1637) => [ + q(Evant), + ], + q(1638) => [ + q(Chorti), + ], + q(1639) => [ + q(Garifuna), + ], + q(1640) => [ + q(Chuj), + ], + q(1641) => [ + q(Lehar), + q(Laalaa), + ], + q(1642) => [ + q(Southern Carrier), + ], + q(1643) => [ + q(Nivacle), + ], + q(1644) => [ + q(Cahuarano), + ], + q(1645) => [ + q(Chane), + ], + q(1646) => [ + q(Kaqchikel), + q(Cakchiquel), + ], + q(1647) => [ + q(Carolinian), + ], + q(1648) => [ + q(Cemuhi), + ], + q(1649) => [ + q(Chambri), + ], + q(1650) => [ + q(Chacobo), + ], + q(1651) => [ + q(Chipaya), + ], + q(1652) => [ + q(Car Nicobarese), + ], + q(1653) => [ + q(Tsimane), + ], + q(1654) => [ + q(Cavinena), + ], + q(1655) => [ + q(Callawalla), + ], + q(1656) => [ + q(Chiquitano), + ], + q(1657) => [ + q(Cayuga), + ], + q(1658) => [ + q(Canichana), + ], + q(1659) => [ + q(Cabiyari), + ], + q(1660) => [ + q(Carapana), + ], + q(1661) => [ + q(Carijona), + ], + q(1662) => [ + q(Chimila), + ], + q(1663) => [ + q(Chachi), + ], + q(1664) => [ + q(Ede Cabe), + ], + q(1665) => [ + q(Chavacano), + ], + q(1666) => [ + q(Bualkhaw Chin), + ], + q(1667) => [ + q(Nyahkur), + ], + q(1668) => [ + q(Izora), + ], + q(1669) => [ + q(Tsucuba), + q(Cuba), + ], + q(1670) => [ + q(Cashibo-Cacataibo), + ], + q(1671) => [ + q(Cashinahua), + ], + q(1672) => [ + q(Chayahuita), + ], + q(1673) => [ + q(Candoshi-Shapra), + ], + q(1674) => [ + q(Cacua), + ], + q(1675) => [ + q(Kinabalian), + ], + q(1676) => [ + q(Carabayo), + ], + q(1677) => [ + q(Cauca), + ], + q(1678) => [ + q(Chamicuro), + ], + q(1679) => [ + q(Cafundo Creole), + ], + q(1680) => [ + q(Chopi), + ], + q(1681) => [ + q(Samba Daka), + ], + q(1682) => [ + q(Atsam), + ], + q(1683) => [ + q(Kasanga), + ], + q(1684) => [ + q(Cutchi-Swahili), + ], + q(1685) => [ + q(Malaccan Creole Malay), + ], + q(1686) => [ + q(Comaltepec Chinantec), + ], + q(1687) => [ + q(Chakma), + ], + q(1688) => [ + q(Cacaopera), + ], + q(1689) => [ + q(Choni), + ], + q(1690) => [ + q(Chenchu), + ], + q(1691) => [ + q(Chiru), + ], + q(1692) => [ + q(Chamari), + ], + q(1693) => [ + q(Chambeali), + ], + q(1694) => [ + q(Chodri), + ], + q(1695) => [ + q(Churahi), + ], + q(1696) => [ + q(Chepang), + ], + q(1697) => [ + q(Chaudangsi), + ], + q(1698) => [ + q(Min Dong Chinese), + ], + q(1699) => [ + q(Cinda-Regi-Tiyal), + ], + q(1700) => [ + q(Chadian Sign Language), + ], + q(1701) => [ + q(Chadong), + ], + q(1702) => [ + q(Koda), + ], + q(1703) => [ + q(Lower Chehalis), + ], + q(1704) => [ + q(Chamacoco), + ], + q(1705) => [ + q(Eastern Khumi Chin), + ], + q(1706) => [ + q(Cen), + ], + q(1707) => [ + q(Centuum), + ], + q(1708) => [ + q(Dijim-Bwilim), + ], + q(1709) => [ + q(Cara), + ], + q(1710) => [ + q(Como Karim), + ], + q(1711) => [ + q(Falam Chin), + ], + q(1712) => [ + q(Changriwa), + ], + q(1713) => [ + q(Kagayanen), + ], + q(1714) => [ + q(Chiga), + ], + q(1715) => [ + q(Chocangacakha), + ], + q(1716) => [ + q(Catawba), + ], + q(1717) => [ + q(Highland Oaxaca Chontal), + ], + q(1718) => [ + q(Tabasco Chontal), + ], + q(1719) => [ + q(Chinook), + ], + q(1720) => [ + q(Ojitlan Chinantec), + ], + q(1721) => [ + q(Cahuilla), + ], + q(1722) => [ + q(Quiotepec Chinantec), + ], + q(1723) => [ + q(Cholon), + ], + q(1724) => [ + q(Chuwabu), + ], + q(1725) => [ + q(Chantyal), + ], + q(1726) => [ + q(Ozumacin Chinantec), + ], + q(1727) => [ + q(Cia-Cia), + ], + q(1728) => [ + q(Ci Gbe), + ], + q(1729) => [ + q(Chickasaw), + ], + q(1730) => [ + q(Chimariko), + ], + q(1731) => [ + q(Cineni), + ], + q(1732) => [ + q(Chinali), + ], + q(1733) => [ + q(Chitkuli Kinnauri), + ], + q(1734) => [ + q(Cimbrian), + ], + q(1735) => [ + q(Cinta Larga), + ], + q(1736) => [ + q(Chiapanec), + ], + q(1737) => [ + q(Tiri), + q(Hamea), + q(Mea), + ], + q(1738) => [ + q(Chippewa), + ], + q(1739) => [ + q(Chaima), + ], + q(1740) => [ + q(Western Cham), + ], + q(1741) => [ + q(Chru), + ], + q(1742) => [ + q(Upper Chehalis), + ], + q(1743) => [ + q(Chamalal), + ], + q(1744) => [ + q(Chokwe), + ], + q(1745) => [ + q(Eastern Cham), + ], + q(1746) => [ + q(Chenapian), + ], + q(1747) => [ + q(Asheninka Pajonal), + ], + q(1748) => [ + q(Cabecar), + ], + q(1749) => [ + q(Shor), + ], + q(1750) => [ + q(Chuave), + ], + q(1751) => [ + q(Jinyu Chinese), + ], + q(1752) => [ + q(Central Kurdish), + ], + q(1753) => [ + q(Chak), + ], + q(1754) => [ + q(Cibak), + ], + q(1755) => [ + q(Kaang Chin), + ], + q(1756) => [ + q(Anufo), + ], + q(1757) => [ + q(Kajakse), + ], + q(1758) => [ + q(Kairak), + ], + q(1759) => [ + q(Tayo), + ], + q(1760) => [ + q(Chukot), + ], + q(1761) => [ + q(Koasati), + ], + q(1762) => [ + q(Kavalan), + ], + q(1763) => [ + q(Caka), + ], + q(1764) => [ + q(Cakfem-Mushere), + ], + q(1765) => [ + q(Cakchiquel-Quiche Mixed Language), + ], + q(1766) => [ + q(Ron), + ], + q(1767) => [ + q(Chilcotin), + ], + q(1768) => [ + q(Chaldean Neo-Aramaic), + ], + q(1769) => [ + q(Lealao Chinantec), + ], + q(1770) => [ + q(Chilisso), + ], + q(1771) => [ + q(Chakali), + ], + q(1772) => [ + q(Laitu Chin), + ], + q(1773) => [ + q(Idu-Mishmi), + ], + q(1774) => [ + q(Chala), + ], + q(1775) => [ + q(Clallam), + ], + q(1776) => [ + q(Lowland Oaxaca Chontal), + ], + q(1777) => [ + q(Lautu Chin), + ], + q(1778) => [ + q(Caluyanun), + ], + q(1779) => [ + q(Chulym), + ], + q(1780) => [ + q(Eastern Highland Chatino), + ], + q(1781) => [ + q(Maa), + ], + q(1782) => [ + q(Cerma), + ], + q(1783) => [ + q(Classical Mongolian), + ], + q(1784) => [ + q(Embera-Chami), + ], + q(1785) => [ + q(Campalagian), + ], + q(1786) => [ + q(Michigamea), + ], + q(1787) => [ + q(Mandarin Chinese), + ], + q(1788) => [ + q(Central Mnong), + ], + q(1789) => [ + q(Mro-Khimi Chin), + ], + q(1790) => [ + q(Messapic), + ], + q(1791) => [ + q(Camtho), + ], + q(1792) => [ + q(Changthang), + ], + q(1793) => [ + q(Chinbon Chin), + ], + q(1794) => [ + q(Coong), + ], + q(1795) => [ + q(Northern Qiang), + ], + q(1796) => [ + q(Hakha Chin), + q(Haka Chin), + ], + q(1797) => [ + q(Ashaninka), + ], + q(1798) => [ + q(Khumi Chin), + ], + q(1799) => [ + q(Lalana Chinantec), + ], + q(1800) => [ + q(Con), + ], + q(1801) => [ + q(Central Asmat), + ], + q(1802) => [ + q(Tepetotutla Chinantec), + ], + q(1803) => [ + q(Chenoua), + ], + q(1804) => [ + q(Ngawn Chin), + ], + q(1805) => [ + q(Middle Cornish), + ], + q(1806) => [ + q(Cocos Islands Malay), + ], + q(1807) => [ + q(Chicomuceltec), + ], + q(1808) => [ + q(Cocopa), + ], + q(1809) => [ + q(Cocama-Cocamilla), + ], + q(1810) => [ + q(Koreguaje), + ], + q(1811) => [ + q(Colorado), + ], + q(1812) => [ + q(Chong), + ], + q(1813) => [ + q(Chonyi-Dzihana-Kauma), + q(Chichonyi-Chidzihana-Chikauma), + ], + q(1814) => [ + q(Cochimi), + ], + q(1815) => [ + q(Santa Teresa Cora), + ], + q(1816) => [ + q(Columbia-Wenatchi), + ], + q(1817) => [ + q(Comanche), + ], + q(1818) => [ + q(Cofan), + ], + q(1819) => [ + q(Comox), + ], + q(1820) => [ + q(Coquille), + ], + q(1821) => [ + q(Caquinte), + ], + q(1822) => [ + q(Wamey), + ], + q(1823) => [ + q(Cao Miao), + ], + q(1824) => [ + q(Cowlitz), + ], + q(1825) => [ + q(Nanti), + ], + q(1826) => [ + q(Chochotec), + ], + q(1827) => [ + q(Palantla Chinantec), + ], + q(1828) => [ + q(Ucayali-Yurua Asheninka), + ], + q(1829) => [ + q(Ajyininka Apurucayali), + ], + q(1830) => [ + q(Cappadocian Greek), + ], + q(1831) => [ + q(Chinese Pidgin English), + ], + q(1832) => [ + q(Cherepon), + ], + q(1833) => [ + q(Kpeego), + ], + q(1834) => [ + q(Capiznon), + ], + q(1835) => [ + q(Pichis Asheninka), + ], + q(1836) => [ + q(Pu-Xian Chinese), + ], + q(1837) => [ + q(South Ucayali Asheninka), + ], + q(1838) => [ + q(Chuanqiandian Cluster Miao), + ], + q(1839) => [ + q(Chara), + ], + q(1840) => [ + q(Island Carib), + ], + q(1841) => [ + q(Lonwolwol), + ], + q(1842) => [ + q(Coeur d'Alene), + ], + q(1843) => [ + q(Caramanta), + ], + q(1844) => [ + q(Michif), + ], + q(1845) => [ + q(Saotomense), + ], + q(1846) => [ + q(Southern East Cree), + ], + q(1847) => [ + q(Plains Cree), + ], + q(1848) => [ + q(Northern East Cree), + ], + q(1849) => [ + q(Moose Cree), + ], + q(1850) => [ + q(El Nayar Cora), + ], + q(1851) => [ + q(Crow), + ], + q(1852) => [ + q(Iyo'wujwa Chorote), + ], + q(1853) => [ + q(Carolina Algonquian), + ], + q(1854) => [ + q(Seselwa Creole French), + ], + q(1855) => [ + q(Iyojwa'ja Chorote), + ], + q(1856) => [ + q(Chaura), + ], + q(1857) => [ + q(Chrau), + ], + q(1858) => [ + q(Carrier), + ], + q(1859) => [ + q(Cori), + ], + q(1860) => [ + q(Cruzeno), + ], + q(1861) => [ + q(Chiltepec Chinantec), + ], + q(1862) => [ + q(Catalan Sign Language), + q(Lengua de senas catalana), + q(Llengua de Signes Catalana), + ], + q(1863) => [ + q(Chiangmai Sign Language), + ], + q(1864) => [ + q(Czech Sign Language), + ], + q(1865) => [ + q(Cuba Sign Language), + ], + q(1866) => [ + q(Chilean Sign Language), + ], + q(1867) => [ + q(Asho Chin), + ], + q(1868) => [ + q(Coast Miwok), + ], + q(1869) => [ + q(Songlai Chin), + ], + q(1870) => [ + q(Jola-Kasa), + ], + q(1871) => [ + q(Chinese Sign Language), + ], + q(1872) => [ + q(Central Sierra Miwok), + ], + q(1873) => [ + q(Colombian Sign Language), + ], + q(1874) => [ + q(Sochiapam Chinantec), + q(Sochiapan Chinantec), + ], + q(1875) => [ + q(Croatia Sign Language), + ], + q(1876) => [ + q(Costa Rican Sign Language), + ], + q(1877) => [ + q(Southern Ohlone), + ], + q(1878) => [ + q(Northern Ohlone), + ], + q(1879) => [ + q(Sumtu Chin), + ], + q(1880) => [ + q(Swampy Cree), + ], + q(1881) => [ + q(Siyin Chin), + ], + q(1882) => [ + q(Coos), + ], + q(1883) => [ + q(Tataltepec Chatino), + ], + q(1884) => [ + q(Chetco), + ], + q(1885) => [ + q(Tedim Chin), + ], + q(1886) => [ + q(Tepinapa Chinantec), + ], + q(1887) => [ + q(Chittagonian), + ], + q(1888) => [ + q(Thaiphum Chin), + ], + q(1889) => [ + q(Tlacoatzintepec Chinantec), + ], + q(1890) => [ + q(Chitimacha), + ], + q(1891) => [ + q(Chhintange), + ], + q(1892) => [ + q(Embera-Catio), + ], + q(1893) => [ + q(Western Highland Chatino), + ], + q(1894) => [ + q(Northern Catanduanes Bikol), + ], + q(1895) => [ + q(Wayanad Chetti), + ], + q(1896) => [ + q(Chol), + ], + q(1897) => [ + q(Zacatepec Chatino), + ], + q(1898) => [ + q(Cua), + ], + q(1899) => [ + q(Cubeo), + ], + q(1900) => [ + q(Usila Chinantec), + ], + q(1901) => [ + q(Chungmboko), + q(Cung), + ], + q(1902) => [ + q(Chuka), + q(Gichuka), + ], + q(1903) => [ + q(Cuiba), + ], + q(1904) => [ + q(Mashco Piro), + ], + q(1905) => [ + q(San Blas Kuna), + ], + q(1906) => [ + q(Culina), + q(Kulina), + ], + q(1907) => [ + q(Cumanagoto), + ], + q(1908) => [ + q(Cupeno), + ], + q(1909) => [ + q(Cun), + ], + q(1910) => [ + q(Chhulung), + ], + q(1911) => [ + q(Teutila Cuicatec), + ], + q(1912) => [ + q(Tai Ya), + ], + q(1913) => [ + q(Cuvok), + ], + q(1914) => [ + q(Chukwa), + ], + q(1915) => [ + q(Tepeuxila Cuicatec), + ], + q(1916) => [ + q(Chug), + ], + q(1917) => [ + q(Valle Nacional Chinantec), + ], + q(1918) => [ + q(Kabwa), + ], + q(1919) => [ + q(Maindo), + ], + q(1920) => [ + q(Woods Cree), + ], + q(1921) => [ + q(Kwere), + ], + q(1922) => [ + q(Chewong), + q(Cheq Wong), + ], + q(1923) => [ + q(Kuwaataay), + ], + q(1924) => [ + q(Nopala Chatino), + ], + q(1925) => [ + q(Cayubaba), + ], + q(1926) => [ + q(Cuyonon), + ], + q(1927) => [ + q(Huizhou Chinese), + ], + q(1928) => [ + q(Knaanic), + ], + q(1929) => [ + q(Zenzontepec Chatino), + ], + q(1930) => [ + q(Min Zhong Chinese), + ], + q(1931) => [ + q(Zotung Chin), + ], + q(1932) => [ + q(Dangaleat), + ], + q(1933) => [ + q(Dambi), + ], + q(1934) => [ + q(Marik), + ], + q(1935) => [ + q(Duupa), + ], + q(1936) => [ + q(Dagbani), + ], + q(1937) => [ + q(Gwahatike), + ], + q(1938) => [ + q(Day), + ], + q(1939) => [ + q(Dar Fur Daju), + ], + q(1940) => [ + q(Dahalo), + ], + q(1941) => [ + q(Damakawa), + ], + q(1942) => [ + q(Daai Chin), + ], + q(1943) => [ + q(Dandami Maria), + ], + q(1944) => [ + q(Daho-Doo), + ], + q(1945) => [ + q(Dar Sila Daju), + ], + q(1946) => [ + q(Taita), + q(Dawida), + ], + q(1947) => [ + q(Davawenyo), + ], + q(1948) => [ + q(Dayi), + ], + q(1949) => [ + q(Dao), + ], + q(1950) => [ + q(Bangime), + ], + q(1951) => [ + q(Deno), + ], + q(1952) => [ + q(Dadiya), + ], + q(1953) => [ + q(Dabe), + ], + q(1954) => [ + q(Edopi), + ], + q(1955) => [ + q(Dogul Dom Dogon), + ], + q(1956) => [ + q(Doka), + ], + q(1957) => [ + q(Ida'an), + ], + q(1958) => [ + q(Dyirbal), + ], + q(1959) => [ + q(Duguri), + ], + q(1960) => [ + q(Duriankere), + ], + q(1961) => [ + q(Dulbu), + ], + q(1962) => [ + q(Duwai), + ], + q(1963) => [ + q(Daba), + ], + q(1964) => [ + q(Dabarre), + ], + q(1965) => [ + q(Ben Tey Dogon), + ], + q(1966) => [ + q(Bondum Dom Dogon), + ], + q(1967) => [ + q(Dungu), + ], + q(1968) => [ + q(Bankan Tey Dogon), + ], + q(1969) => [ + q(Dibiyaso), + ], + q(1970) => [ + q(Deccan), + ], + q(1971) => [ + q(Negerhollands), + ], + q(1972) => [ + q(Dadi Dadi), + ], + q(1973) => [ + q(Dongotono), + ], + q(1974) => [ + q(Doondo), + ], + q(1975) => [ + q(Fataluku), + ], + q(1976) => [ + q(West Goodenough), + ], + q(1977) => [ + q(Jaru), + ], + q(1978) => [ + q(Dendi (Benin)), + ], + q(1979) => [ + q(Dido), + ], + q(1980) => [ + q(Dhudhuroa), + ], + q(1981) => [ + q(Donno So Dogon), + ], + q(1982) => [ + q(Dawera-Daweloor), + ], + q(1983) => [ + q(Dagik), + ], + q(1984) => [ + q(Dedua), + ], + q(1985) => [ + q(Dewoin), + ], + q(1986) => [ + q(Dezfuli), + ], + q(1987) => [ + q(Degema), + ], + q(1988) => [ + q(Dehwari), + ], + q(1989) => [ + q(Demisa), + ], + q(1990) => [ + q(Dek), + ], + q(1991) => [ + q(Dem), + ], + q(1992) => [ + q(Pidgin Delaware), + ], + q(1993) => [ + q(Dendi (Central African Republic)), + ], + q(1994) => [ + q(Deori), + ], + q(1995) => [ + q(Desano), + ], + q(1996) => [ + q(Domung), + ], + q(1997) => [ + q(Dengese), + ], + q(1998) => [ + q(Southern Dagaare), + ], + q(1999) => [ + q(Bunoge Dogon), + ], + q(2000) => [ + q(Casiguran Dumagat Agta), + ], + q(2001) => [ + q(Dagaari Dioula), + ], + q(2002) => [ + q(Degenan), + ], + q(2003) => [ + q(Doga), + ], + q(2004) => [ + q(Dghwede), + ], + q(2005) => [ + q(Northern Dagara), + ], + q(2006) => [ + q(Dagba), + ], + q(2007) => [ + q(Andaandi), + q(Dongolawi), + ], + q(2008) => [ + q(Dagoman), + ], + q(2009) => [ + q(Dogri (individual language)), + ], + q(2010) => [ + q(Dogoso), + ], + q(2011) => [ + q(Ndra'ngith), + ], + q(2012) => [ + q(Degaru), + ], + q(2013) => [ + q(Daungwurrung), + ], + q(2014) => [ + q(Doghoro), + ], + q(2015) => [ + q(Daga), + ], + q(2016) => [ + q(Dhundari), + ], + q(2017) => [ + q(Dhangu-Djangu), + q(Dhangu), + q(Djangu), + ], + q(2018) => [ + q(Dhimal), + ], + q(2019) => [ + q(Dhalandji), + ], + q(2020) => [ + q(Zemba), + ], + q(2021) => [ + q(Dhanki), + ], + q(2022) => [ + q(Dhodia), + ], + q(2023) => [ + q(Dhargari), + ], + q(2024) => [ + q(Dhaiso), + ], + q(2025) => [ + q(Dhurga), + ], + q(2026) => [ + q(Dehu), + q(Drehu), + ], + q(2027) => [ + q(Dhanwar (Nepal)), + ], + q(2028) => [ + q(Dhungaloo), + ], + q(2029) => [ + q(Dia), + ], + q(2030) => [ + q(South Central Dinka), + ], + q(2031) => [ + q(Lakota Dida), + ], + q(2032) => [ + q(Didinga), + ], + q(2033) => [ + q(Dieri), + ], + q(2034) => [ + q(Digo), + q(Chidigo), + ], + q(2035) => [ + q(Kumiai), + ], + q(2036) => [ + q(Dimbong), + ], + q(2037) => [ + q(Dai), + ], + q(2038) => [ + q(Southwestern Dinka), + ], + q(2039) => [ + q(Dilling), + ], + q(2040) => [ + q(Dime), + ], + q(2041) => [ + q(Dibo), + ], + q(2042) => [ + q(Northeastern Dinka), + ], + q(2043) => [ + q(Dimli (individual language)), + ], + q(2044) => [ + q(Dirim), + ], + q(2045) => [ + q(Dimasa), + ], + q(2046) => [ + q(Dirari), + ], + q(2047) => [ + q(Diriku), + ], + q(2048) => [ + q(Northwestern Dinka), + ], + q(2049) => [ + q(Dixon Reef), + ], + q(2050) => [ + q(Diuwe), + ], + q(2051) => [ + q(Ding), + ], + q(2052) => [ + q(Djadjawurrung), + ], + q(2053) => [ + q(Djinba), + ], + q(2054) => [ + q(Dar Daju Daju), + ], + q(2055) => [ + q(Djamindjung), + ], + q(2056) => [ + q(Zarma), + ], + q(2057) => [ + q(Djangun), + ], + q(2058) => [ + q(Djinang), + ], + q(2059) => [ + q(Djeebbana), + ], + q(2060) => [ + q(Eastern Maroon Creole), + q(Businenge Tongo), + q(Nenge), + ], + q(2061) => [ + q(Jamsay Dogon), + ], + q(2062) => [ + q(Djauan), + ], + q(2063) => [ + q(Jangkang), + ], + q(2064) => [ + q(Djambarrpuyngu), + ], + q(2065) => [ + q(Kapriman), + ], + q(2066) => [ + q(Djawi), + ], + q(2067) => [ + q(Dakpakha), + ], + q(2068) => [ + q(Dakka), + ], + q(2069) => [ + q(Kuijau), + ], + q(2070) => [ + q(Southeastern Dinka), + ], + q(2071) => [ + q(Mazagway), + ], + q(2072) => [ + q(Dolgan), + ], + q(2073) => [ + q(Dahalik), + ], + q(2074) => [ + q(Dalmatian), + ], + q(2075) => [ + q(Darlong), + ], + q(2076) => [ + q(Duma), + ], + q(2077) => [ + q(Mombo Dogon), + ], + q(2078) => [ + q(Gavak), + ], + q(2079) => [ + q(Madhi Madhi), + ], + q(2080) => [ + q(Dugwor), + ], + q(2081) => [ + q(Upper Kinabatangan), + ], + q(2082) => [ + q(Domaaki), + ], + q(2083) => [ + q(Dameli), + ], + q(2084) => [ + q(Dama), + ], + q(2085) => [ + q(Kemedzung), + ], + q(2086) => [ + q(East Damar), + ], + q(2087) => [ + q(Dampelas), + ], + q(2088) => [ + q(Dubu), + q(Tebi), + ], + q(2089) => [ + q(Dumpas), + ], + q(2090) => [ + q(Mudburra), + ], + q(2091) => [ + q(Dema), + ], + q(2092) => [ + q(Demta), + q(Sowari), + ], + q(2093) => [ + q(Upper Grand Valley Dani), + ], + q(2094) => [ + q(Daonda), + ], + q(2095) => [ + q(Ndendeule), + ], + q(2096) => [ + q(Dungan), + ], + q(2097) => [ + q(Lower Grand Valley Dani), + ], + q(2098) => [ + q(Dan), + ], + q(2099) => [ + q(Dengka), + ], + q(2100) => [ + q(Dzuungoo), + ], + q(2101) => [ + q(Danaru), + ], + q(2102) => [ + q(Mid Grand Valley Dani), + ], + q(2103) => [ + q(Danau), + ], + q(2104) => [ + q(Danu), + ], + q(2105) => [ + q(Western Dani), + ], + q(2106) => [ + q(Deni), + ], + q(2107) => [ + q(Dom), + ], + q(2108) => [ + q(Dobu), + ], + q(2109) => [ + q(Northern Dong), + ], + q(2110) => [ + q(Doe), + ], + q(2111) => [ + q(Domu), + ], + q(2112) => [ + q(Dong), + ], + q(2113) => [ + q(Dondo), + ], + q(2114) => [ + q(Doso), + ], + q(2115) => [ + q(Toura (Papua New Guinea)), + ], + q(2116) => [ + q(Dongo), + ], + q(2117) => [ + q(Lukpa), + ], + q(2118) => [ + q(Dominican Sign Language), + ], + q(2119) => [ + q(Dori'o), + ], + q(2120) => [ + q(Dogose), + ], + q(2121) => [ + q(Dass), + ], + q(2122) => [ + q(Dombe), + ], + q(2123) => [ + q(Doyayo), + ], + q(2124) => [ + q(Bussa), + ], + q(2125) => [ + q(Dompo), + ], + q(2126) => [ + q(Dorze), + ], + q(2127) => [ + q(Papar), + ], + q(2128) => [ + q(Dair), + ], + q(2129) => [ + q(Minderico), + ], + q(2130) => [ + q(Darmiya), + ], + q(2131) => [ + q(Dolpo), + ], + q(2132) => [ + q(Rungus), + ], + q(2133) => [ + q(C'Lela), + ], + q(2134) => [ + q(Paakantyi), + ], + q(2135) => [ + q(West Damar), + ], + q(2136) => [ + q(Daro-Matu Melanau), + ], + q(2137) => [ + q(Dura), + ], + q(2138) => [ + q(Dororo), + ], + q(2139) => [ + q(Gedeo), + ], + q(2140) => [ + q(Drents), + ], + q(2141) => [ + q(Rukai), + ], + q(2142) => [ + q(Darai), + ], + q(2143) => [ + q(Dutch Sign Language), + ], + q(2144) => [ + q(Daasanach), + ], + q(2145) => [ + q(Disa), + ], + q(2146) => [ + q(Danish Sign Language), + ], + q(2147) => [ + q(Dusner), + ], + q(2148) => [ + q(Desiya), + ], + q(2149) => [ + q(Tadaksahak), + ], + q(2150) => [ + q(Daur), + ], + q(2151) => [ + q(Labuk-Kinabatangan Kadazan), + ], + q(2152) => [ + q(Ditidaht), + ], + q(2153) => [ + q(Adithinngithigh), + ], + q(2154) => [ + q(Ana Tinga Dogon), + ], + q(2155) => [ + q(Tene Kan Dogon), + ], + q(2156) => [ + q(Tomo Kan Dogon), + ], + q(2157) => [ + q(Daats'iin), + ], + q(2158) => [ + q(Tommo So Dogon), + ], + q(2159) => [ + q(Kadazan Dusun), + q(Central Dusun), + ], + q(2160) => [ + q(Lotud), + ], + q(2161) => [ + q(Toro So Dogon), + ], + q(2162) => [ + q(Toro Tegu Dogon), + ], + q(2163) => [ + q(Tebul Ure Dogon), + ], + q(2164) => [ + q(Dotyali), + ], + q(2165) => [ + q(Dubli), + ], + q(2166) => [ + q(Duna), + ], + q(2167) => [ + q(Hun-Saare), + ], + q(2168) => [ + q(Umiray Dumaget Agta), + ], + q(2169) => [ + q(Dumbea), + q(Drubea), + ], + q(2170) => [ + q(Duruma), + q(Chiduruma), + ], + q(2171) => [ + q(Dungra Bhil), + ], + q(2172) => [ + q(Dumun), + ], + q(2173) => [ + q(Uyajitaya), + ], + q(2174) => [ + q(Alabat Island Agta), + ], + q(2175) => [ + q(Dusun Deyah), + ], + q(2176) => [ + q(Dupaninan Agta), + ], + q(2177) => [ + q(Duano), + ], + q(2178) => [ + q(Dusun Malang), + ], + q(2179) => [ + q(Dii), + ], + q(2180) => [ + q(Dumi), + ], + q(2181) => [ + q(Drung), + ], + q(2182) => [ + q(Duvle), + ], + q(2183) => [ + q(Dusun Witu), + ], + q(2184) => [ + q(Duungooma), + ], + q(2185) => [ + q(Dicamay Agta), + ], + q(2186) => [ + q(Duli-Gey), + ], + q(2187) => [ + q(Duau), + ], + q(2188) => [ + q(Diri), + ], + q(2189) => [ + q(Dawro), + ], + q(2190) => [ + q(Dutton World Speedwords), + ], + q(2191) => [ + q(Dhuwal), + ], + q(2192) => [ + q(Dawawa), + ], + q(2193) => [ + q(Dhuwaya), + ], + q(2194) => [ + q(Dyan), + ], + q(2195) => [ + q(Dyaberdyaber), + ], + q(2196) => [ + q(Dyugun), + ], + q(2197) => [ + q(Villa Viciosa Agta), + ], + q(2198) => [ + q(Djimini Senoufo), + ], + q(2199) => [ + q(Yanda Dom Dogon), + ], + q(2200) => [ + q(Dyangadi), + ], + q(2201) => [ + q(Jola-Fonyi), + ], + q(2202) => [ + q(Dyaabugay), + ], + q(2203) => [ + q(Tunzu), + ], + q(2204) => [ + q(Djiwarli), + ], + q(2205) => [ + q(Dazaga), + ], + q(2206) => [ + q(Dzalakha), + ], + q(2207) => [ + q(Dzando), + ], + q(2208) => [ + q(Karenggapa), + ], + q(2209) => [ + q(Ebughu), + ], + q(2210) => [ + q(Eastern Bontok), + ], + q(2211) => [ + q(Teke-Ebo), + ], + q(2212) => [ + q(Ebrie), + ], + q(2213) => [ + q(Embu), + q(Kiembu), + ], + q(2214) => [ + q(Eteocretan), + ], + q(2215) => [ + q(Ecuadorian Sign Language), + ], + q(2216) => [ + q(Eteocypriot), + ], + q(2217) => [ + q(E), + ], + q(2218) => [ + q(Efai), + ], + q(2219) => [ + q(Efe), + ], + q(2220) => [ + q(Ega), + ], + q(2221) => [ + q(Emilian), + ], + q(2222) => [ + q(Eggon), + ], + q(2223) => [ + q(Ehueun), + ], + q(2224) => [ + q(Eipomek), + ], + q(2225) => [ + q(Eitiep), + ], + q(2226) => [ + q(Askopan), + ], + q(2227) => [ + q(Ejamat), + ], + q(2228) => [ + q(Eastern Karnic), + ], + q(2229) => [ + q(Ekit), + ], + q(2230) => [ + q(Ekari), + ], + q(2231) => [ + q(Eki), + ], + q(2232) => [ + q(Standard Estonian), + ], + q(2233) => [ + q(Kol (Bangladesh)), + q(Kol), + ], + q(2234) => [ + q(Elip), + ], + q(2235) => [ + q(Koti), + ], + q(2236) => [ + q(Ekpeye), + ], + q(2237) => [ + q(Yace), + ], + q(2238) => [ + q(Eastern Kayah), + ], + q(2239) => [ + q(Elepi), + ], + q(2240) => [ + q(El Hugeirat), + ], + q(2241) => [ + q(Nding), + ], + q(2242) => [ + q(Elkei), + ], + q(2243) => [ + q(Eleme), + ], + q(2244) => [ + q(El Molo), + ], + q(2245) => [ + q(Elu), + ], + q(2246) => [ + q(Emai-Iuleha-Ora), + ], + q(2247) => [ + q(Embaloh), + ], + q(2248) => [ + q(Emerillon), + ], + q(2249) => [ + q(Eastern Meohang), + ], + q(2250) => [ + q(Mussau-Emira), + ], + q(2251) => [ + q(Eastern Maninkakan), + ], + q(2252) => [ + q(Mamulique), + ], + q(2253) => [ + q(Eman), + ], + q(2254) => [ + q(Northern Embera), + ], + q(2255) => [ + q(Pacific Gulf Yupik), + ], + q(2256) => [ + q(Eastern Muria), + ], + q(2257) => [ + q(Emplawas), + ], + q(2258) => [ + q(Erromintxela), + ], + q(2259) => [ + q(Epigraphic Mayan), + ], + q(2260) => [ + q(Apali), + ], + q(2261) => [ + q(Markweeta), + ], + q(2262) => [ + q(En), + ], + q(2263) => [ + q(Ende), + ], + q(2264) => [ + q(Forest Enets), + ], + q(2265) => [ + q(Tundra Enets), + ], + q(2266) => [ + q(Enlhet), + ], + q(2267) => [ + q(Engenni), + ], + q(2268) => [ + q(Enggano), + ], + q(2269) => [ + q(Enga), + ], + q(2270) => [ + q(Emumu), + q(Emem), + ], + q(2271) => [ + q(Enu), + ], + q(2272) => [ + q(Enwan (Edu State)), + ], + q(2273) => [ + q(Enwan (Akwa Ibom State)), + ], + q(2274) => [ + q(Enxet), + ], + q(2275) => [ + q(Beti (Cote d'Ivoire)), + ], + q(2276) => [ + q(Epie), + ], + q(2277) => [ + q(Eravallan), + ], + q(2278) => [ + q(Sie), + ], + q(2279) => [ + q(Eruwa), + ], + q(2280) => [ + q(Ogea), + ], + q(2281) => [ + q(South Efate), + ], + q(2282) => [ + q(Horpa), + ], + q(2283) => [ + q(Erre), + ], + q(2284) => [ + q(Ersu), + ], + q(2285) => [ + q(Eritai), + ], + q(2286) => [ + q(Erokwanas), + ], + q(2287) => [ + q(Ese Ejja), + ], + q(2288) => [ + q(Aheri Gondi), + ], + q(2289) => [ + q(Eshtehardi), + ], + q(2290) => [ + q(North Alaskan Inupiatun), + ], + q(2291) => [ + q(Northwest Alaska Inupiatun), + ], + q(2292) => [ + q(Egypt Sign Language), + ], + q(2293) => [ + q(Esuma), + ], + q(2294) => [ + q(Salvadoran Sign Language), + ], + q(2295) => [ + q(Estonian Sign Language), + ], + q(2296) => [ + q(Esselen), + ], + q(2297) => [ + q(Central Siberian Yupik), + ], + q(2298) => [ + q(Central Yupik), + ], + q(2299) => [ + q(Eskayan), + ], + q(2300) => [ + q(Etebi), + ], + q(2301) => [ + q(Etchemin), + ], + q(2302) => [ + q(Ethiopian Sign Language), + ], + q(2303) => [ + q(Eton (Vanuatu)), + ], + q(2304) => [ + q(Eton (Cameroon)), + ], + q(2305) => [ + q(Edolo), + ], + q(2306) => [ + q(Yekhee), + ], + q(2307) => [ + q(Etruscan), + ], + q(2308) => [ + q(Ejagham), + ], + q(2309) => [ + q(Eten), + ], + q(2310) => [ + q(Semimi), + ], + q(2311) => [ + q(Even), + ], + q(2312) => [ + q(Uvbie), + ], + q(2313) => [ + q(Evenki), + ], + q(2314) => [ + q(Extremaduran), + ], + q(2315) => [ + q(Eyak), + ], + q(2316) => [ + q(Keiyo), + ], + q(2317) => [ + q(Ezaa), + ], + q(2318) => [ + q(Uzekwe), + ], + q(2319) => [ + q(Fasu), + ], + q(2320) => [ + q(Fa d'Ambu), + ], + q(2321) => [ + q(Wagi), + ], + q(2322) => [ + q(Fagani), + ], + q(2323) => [ + q(Finongan), + ], + q(2324) => [ + q(Baissa Fali), + ], + q(2325) => [ + q(Faiwol), + ], + q(2326) => [ + q(Faita), + ], + q(2327) => [ + q(Fang (Cameroon)), + ], + q(2328) => [ + q(South Fali), + ], + q(2329) => [ + q(Fam), + ], + q(2330) => [ + q(Palor), + ], + q(2331) => [ + q(Fataleka), + ], + q(2332) => [ + q(Fayu), + ], + q(2333) => [ + q(Fala), + ], + q(2334) => [ + q(Southwestern Fars), + ], + q(2335) => [ + q(Northwestern Fars), + ], + q(2336) => [ + q(West Albay Bikol), + ], + q(2337) => [ + q(Quebec Sign Language), + ], + q(2338) => [ + q(Feroge), + ], + q(2339) => [ + q(Foia Foia), + ], + q(2340) => [ + q(Maasina Fulfulde), + ], + q(2341) => [ + q(Fongoro), + ], + q(2342) => [ + q(Nobiin), + ], + q(2343) => [ + q(Fyer), + ], + q(2344) => [ + q(Fipa), + ], + q(2345) => [ + q(Firan), + ], + q(2346) => [ + q(Tornedalen Finnish), + ], + q(2347) => [ + q(Fiwaga), + ], + q(2348) => [ + q(Kirya-Konzel), + ], + q(2349) => [ + q(Kven Finnish), + ], + q(2350) => [ + q(Kalispel-Pend d'Oreille), + ], + q(2351) => [ + q(Foau), + ], + q(2352) => [ + q(Fali), + ], + q(2353) => [ + q(North Fali), + ], + q(2354) => [ + q(Flinders Island), + ], + q(2355) => [ + q(Fuliiru), + ], + q(2356) => [ + q(Flaaitaal), + q(Tsotsitaal), + ], + q(2357) => [ + q(Fe'fe'), + ], + q(2358) => [ + q(Far Western Muria), + ], + q(2359) => [ + q(Fanbak), + ], + q(2360) => [ + q(Fanagalo), + ], + q(2361) => [ + q(Fania), + ], + q(2362) => [ + q(Foodo), + ], + q(2363) => [ + q(Foi), + ], + q(2364) => [ + q(Foma), + ], + q(2365) => [ + q(Fore), + ], + q(2366) => [ + q(Siraya), + ], + q(2367) => [ + q(Fernando Po Creole English), + ], + q(2368) => [ + q(Fas), + ], + q(2369) => [ + q(Cajun French), + ], + q(2370) => [ + q(Fordata), + ], + q(2371) => [ + q(Frankish), + ], + q(2372) => [ + q(Arpitan), + q(Francoprovencal), + ], + q(2373) => [ + q(Forak), + ], + q(2374) => [ + q(Fortsenal), + ], + q(2375) => [ + q(Finnish Sign Language), + ], + q(2376) => [ + q(French Sign Language), + ], + q(2377) => [ + q(Finland-Swedish Sign Language), + q(finlandssvenskt teckensprak), + q(suomenruotsalainen viittomakieli), + ], + q(2378) => [ + q(Adamawa Fulfulde), + ], + q(2379) => [ + q(Pulaar), + ], + q(2380) => [ + q(East Futuna), + ], + q(2381) => [ + q(Borgu Fulfulde), + ], + q(2382) => [ + q(Pular), + ], + q(2383) => [ + q(Western Niger Fulfulde), + ], + q(2384) => [ + q(Bagirmi Fulfulde), + ], + q(2385) => [ + q(Ko), + ], + q(2386) => [ + q(Fum), + ], + q(2387) => [ + q(Fulnio), + ], + q(2388) => [ + q(Central-Eastern Niger Fulfulde), + ], + q(2389) => [ + q(Futuna-Aniwa), + ], + q(2390) => [ + q(Furu), + ], + q(2391) => [ + q(Nigerian Fulfulde), + ], + q(2392) => [ + q(Fuyug), + ], + q(2393) => [ + q(Fur), + ], + q(2394) => [ + q(Fwai), + ], + q(2395) => [ + q(Fwe), + ], + q(2396) => [ + q(Gabri), + ], + q(2397) => [ + q(Mixed Great Andamanese), + ], + q(2398) => [ + q(Gaddang), + ], + q(2399) => [ + q(Guarequena), + ], + q(2400) => [ + q(Gende), + ], + q(2401) => [ + q(Gagauz), + ], + q(2402) => [ + q(Alekano), + ], + q(2403) => [ + q(Borei), + ], + q(2404) => [ + q(Gadsup), + ], + q(2405) => [ + q(Gamkonora), + ], + q(2406) => [ + q(Galolen), + ], + q(2407) => [ + q(Kandawo), + ], + q(2408) => [ + q(Gan Chinese), + ], + q(2409) => [ + q(Gants), + ], + q(2410) => [ + q(Gal), + ], + q(2411) => [ + q(Gata'), + ], + q(2412) => [ + q(Galeya), + ], + q(2413) => [ + q(Adiwasi Garasia), + ], + q(2414) => [ + q(Kenati), + ], + q(2415) => [ + q(Mudhili Gadaba), + ], + q(2416) => [ + q(Nobonob), + ], + q(2417) => [ + q(Borana-Arsi-Guji Oromo), + ], + q(2418) => [ + q(West Central Oromo), + ], + q(2419) => [ + q(Kaytetye), + ], + q(2420) => [ + q(Karadjeri), + ], + q(2421) => [ + q(Niksek), + ], + q(2422) => [ + q(Gaikundi), + ], + q(2423) => [ + q(Gbanziri), + ], + q(2424) => [ + q(Defi Gbe), + ], + q(2425) => [ + q(Galela), + ], + q(2426) => [ + q(Bodo Gadaba), + ], + q(2427) => [ + q(Gaddi), + ], + q(2428) => [ + q(Gamit), + ], + q(2429) => [ + q(Garhwali), + ], + q(2430) => [ + q(Mo'da), + ], + q(2431) => [ + q(Northern Grebo), + ], + q(2432) => [ + q(Gbaya-Bossangoa), + ], + q(2433) => [ + q(Gbaya-Bozoum), + ], + q(2434) => [ + q(Gbagyi), + ], + q(2435) => [ + q(Gbesi Gbe), + ], + q(2436) => [ + q(Gagadu), + ], + q(2437) => [ + q(Gbanu), + ], + q(2438) => [ + q(Gabi-Gabi), + ], + q(2439) => [ + q(Eastern Xwla Gbe), + ], + q(2440) => [ + q(Gbari), + ], + q(2441) => [ + q(Zoroastrian Dari), + ], + q(2442) => [ + q(Mali), + ], + q(2443) => [ + q(Ganggalida), + ], + q(2444) => [ + q(Galice), + ], + q(2445) => [ + q(Guadeloupean Creole French), + ], + q(2446) => [ + q(Grenadian Creole English), + ], + q(2447) => [ + q(Gaina), + ], + q(2448) => [ + q(Guianese Creole French), + ], + q(2449) => [ + q(Colonia Tovar German), + ], + q(2450) => [ + q(Gade Lohar), + ], + q(2451) => [ + q(Pottangi Ollar Gadaba), + ], + q(2452) => [ + q(Gugu Badhun), + ], + q(2453) => [ + q(Gedaged), + ], + q(2454) => [ + q(Gude), + ], + q(2455) => [ + q(Guduf-Gava), + ], + q(2456) => [ + q(Ga'dang), + ], + q(2457) => [ + q(Gadjerawang), + ], + q(2458) => [ + q(Gundi), + ], + q(2459) => [ + q(Gurdjar), + ], + q(2460) => [ + q(Gadang), + ], + q(2461) => [ + q(Dirasha), + ], + q(2462) => [ + q(Laal), + ], + q(2463) => [ + q(Umanakaina), + ], + q(2464) => [ + q(Ghodoberi), + ], + q(2465) => [ + q(Mehri), + ], + q(2466) => [ + q(Wipi), + ], + q(2467) => [ + q(Ghandruk Sign Language), + ], + q(2468) => [ + q(Kungardutyi), + ], + q(2469) => [ + q(Gudu), + ], + q(2470) => [ + q(Godwari), + ], + q(2471) => [ + q(Geruma), + ], + q(2472) => [ + q(Kire), + ], + q(2473) => [ + q(Gboloo Grebo), + ], + q(2474) => [ + q(Gade), + ], + q(2475) => [ + q(Gengle), + ], + q(2476) => [ + q(Hutterite German), + q(Hutterisch), + ], + q(2477) => [ + q(Gebe), + ], + q(2478) => [ + q(Gen), + ], + q(2479) => [ + q(Ywom), + ], + q(2480) => [ + q(ut-Ma'in), + ], + q(2481) => [ + q(Geme), + ], + q(2482) => [ + q(Geser-Gorom), + ], + q(2483) => [ + q(Eviya), + ], + q(2484) => [ + q(Gera), + ], + q(2485) => [ + q(Garre), + ], + q(2486) => [ + q(Enya), + ], + q(2487) => [ + q(Patpatar), + ], + q(2488) => [ + q(Gafat), + ], + q(2489) => [ + q(Gao), + ], + q(2490) => [ + q(Gbii), + ], + q(2491) => [ + q(Gugadj), + ], + q(2492) => [ + q(Guragone), + ], + q(2493) => [ + q(Gurgula), + ], + q(2494) => [ + q(Kungarakany), + ], + q(2495) => [ + q(Ganglau), + ], + q(2496) => [ + q(Gitua), + ], + q(2497) => [ + q(Gagu), + q(Gban), + ], + q(2498) => [ + q(Gogodala), + ], + q(2499) => [ + q(Ghadames), + ], + q(2500) => [ + q(Hiberno-Scottish Gaelic), + ], + q(2501) => [ + q(Southern Ghale), + ], + q(2502) => [ + q(Northern Ghale), + ], + q(2503) => [ + q(Geko Karen), + ], + q(2504) => [ + q(Ghulfan), + ], + q(2505) => [ + q(Ghanongga), + ], + q(2506) => [ + q(Ghomara), + ], + q(2507) => [ + q(Ghera), + ], + q(2508) => [ + q(Guhu-Samane), + ], + q(2509) => [ + q(Kuke), + q(Kutang Ghale), + ], + q(2510) => [ + q(Kitja), + ], + q(2511) => [ + q(Gibanawa), + ], + q(2512) => [ + q(Gail), + ], + q(2513) => [ + q(Gidar), + ], + q(2514) => [ + q(Gabogbo), + q(Guebie), + ], + q(2515) => [ + q(Goaria), + ], + q(2516) => [ + q(Githabul), + ], + q(2517) => [ + q(Gimi (Eastern Highlands)), + ], + q(2518) => [ + q(Hinukh), + ], + q(2519) => [ + q(Gimi (West New Britain)), + ], + q(2520) => [ + q(Green Gelao), + ], + q(2521) => [ + q(Red Gelao), + ], + q(2522) => [ + q(North Giziga), + ], + q(2523) => [ + q(Gitxsan), + ], + q(2524) => [ + q(Mulao), + ], + q(2525) => [ + q(White Gelao), + ], + q(2526) => [ + q(Gilima), + ], + q(2527) => [ + q(Giyug), + ], + q(2528) => [ + q(South Giziga), + ], + q(2529) => [ + q(Geji), + ], + q(2530) => [ + q(Kachi Koli), + ], + q(2531) => [ + q(Gunditjmara), + ], + q(2532) => [ + q(Gonja), + ], + q(2533) => [ + q(Gurindji Kriol), + ], + q(2534) => [ + q(Gujari), + ], + q(2535) => [ + q(Guya), + ], + q(2536) => [ + q(Ndai), + ], + q(2537) => [ + q(Gokana), + ], + q(2538) => [ + q(Kok-Nar), + ], + q(2539) => [ + q(Guinea Kpelle), + ], + q(2540) => [ + q(Ungkue), + q(=/Ungkue), + ], + q(2541) => [ + q(Bon Gula), + ], + q(2542) => [ + q(Nanai), + ], + q(2543) => [ + q(Northwest Pashai), + q(Northwest Pashayi), + ], + q(2544) => [ + q(Guliguli), + ], + q(2545) => [ + q(Gula Iro), + ], + q(2546) => [ + q(Gilaki), + ], + q(2547) => [ + q(Garlali), + ], + q(2548) => [ + q(Galambu), + ], + q(2549) => [ + q(Glaro-Twabo), + ], + q(2550) => [ + q(Gula (Chad)), + ], + q(2551) => [ + q(Glavda), + ], + q(2552) => [ + q(Gule), + ], + q(2553) => [ + q(Gambera), + ], + q(2554) => [ + q(Gula'alaa), + ], + q(2555) => [ + q(Maghdi), + ], + q(2556) => [ + q(Magyi), + ], + q(2557) => [ + q(Middle Low German), + ], + q(2558) => [ + q(Gbaya-Mbodomo), + ], + q(2559) => [ + q(Gimnime), + ], + q(2560) => [ + q(Gumalu), + ], + q(2561) => [ + q(Gamo), + ], + q(2562) => [ + q(Magoma), + ], + q(2563) => [ + q(Mycenaean Greek), + ], + q(2564) => [ + q(Mgbolizhia), + ], + q(2565) => [ + q(Kaansa), + ], + q(2566) => [ + q(Gangte), + ], + q(2567) => [ + q(Guanche), + ], + q(2568) => [ + q(Zulgo-Gemzek), + ], + q(2569) => [ + q(Ganang), + ], + q(2570) => [ + q(Ngangam), + ], + q(2571) => [ + q(Lere), + ], + q(2572) => [ + q(Gooniyandi), + ], + q(2573) => [ + q(//Gana), + q(Gana), + ], + q(2574) => [ + q(Gangulu), + ], + q(2575) => [ + q(Ginuman), + ], + q(2576) => [ + q(Gumatj), + ], + q(2577) => [ + q(Northern Gondi), + ], + q(2578) => [ + q(Gureng Gureng), + ], + q(2579) => [ + q(Guntai), + ], + q(2580) => [ + q(Gnau), + ], + q(2581) => [ + q(Western Bolivian Guarani), + ], + q(2582) => [ + q(Ganzi), + ], + q(2583) => [ + q(Guro), + ], + q(2584) => [ + q(Playero), + ], + q(2585) => [ + q(Gorakor), + ], + q(2586) => [ + q(Godie), + ], + q(2587) => [ + q(Gongduk), + ], + q(2588) => [ + q(Gofa), + ], + q(2589) => [ + q(Gogo), + ], + q(2590) => [ + q(Gobasi), + ], + q(2591) => [ + q(Gowlan), + ], + q(2592) => [ + q(Gowli), + ], + q(2593) => [ + q(Gola), + ], + q(2594) => [ + q(Goan Konkani), + ], + q(2595) => [ + q(Gone Dau), + ], + q(2596) => [ + q(Yeretuar), + ], + q(2597) => [ + q(Gorap), + ], + q(2598) => [ + q(Gronings), + ], + q(2599) => [ + q(Gavar), + ], + q(2600) => [ + q(Gorowa), + ], + q(2601) => [ + q(Gobu), + ], + q(2602) => [ + q(Goundo), + ], + q(2603) => [ + q(Gozarkhani), + ], + q(2604) => [ + q(Gupa-Abawa), + ], + q(2605) => [ + q(Ghanaian Pidgin English), + ], + q(2606) => [ + q(Taiap), + ], + q(2607) => [ + q(Ga'anda), + ], + q(2608) => [ + q(Guiqiong), + ], + q(2609) => [ + q(Guana (Brazil)), + ], + q(2610) => [ + q(Gor), + ], + q(2611) => [ + q(Qau), + ], + q(2612) => [ + q(Rajput Garasia), + ], + q(2613) => [ + q(Guruntum-Mbaaru), + ], + q(2614) => [ + q(Madi), + ], + q(2615) => [ + q(Gbiri-Niragu), + ], + q(2616) => [ + q(Ghari), + ], + q(2617) => [ + q(Southern Grebo), + ], + q(2618) => [ + q(Kota Marudu Talantang), + ], + q(2619) => [ + q(Groma), + ], + q(2620) => [ + q(Gorovu), + ], + q(2621) => [ + q(Taznatit), + ], + q(2622) => [ + q(Gresi), + ], + q(2623) => [ + q(Garo), + ], + q(2624) => [ + q(Kistane), + ], + q(2625) => [ + q(Central Grebo), + ], + q(2626) => [ + q(Gweda), + ], + q(2627) => [ + q(Guriaso), + ], + q(2628) => [ + q(Barclayville Grebo), + ], + q(2629) => [ + q(Guramalum), + ], + q(2630) => [ + q(Ghanaian Sign Language), + ], + q(2631) => [ + q(German Sign Language), + ], + q(2632) => [ + q(Gusilay), + ], + q(2633) => [ + q(Guatemalan Sign Language), + ], + q(2634) => [ + q(Nema), + q(Gusan), + ], + q(2635) => [ + q(Southwest Gbaya), + ], + q(2636) => [ + q(Wasembo), + ], + q(2637) => [ + q(Greek Sign Language), + ], + q(2638) => [ + q(Guato), + ], + q(2639) => [ + q(Aghu-Tharnggala), + ], + q(2640) => [ + q(Shiki), + ], + q(2641) => [ + q(Guajajara), + ], + q(2642) => [ + q(Wayuu), + ], + q(2643) => [ + q(Yocoboue Dida), + ], + q(2644) => [ + q(Gurinji), + ], + q(2645) => [ + q(Gupapuyngu), + ], + q(2646) => [ + q(Paraguayan Guarani), + ], + q(2647) => [ + q(Guahibo), + ], + q(2648) => [ + q(Eastern Bolivian Guarani), + ], + q(2649) => [ + q(Gumuz), + ], + q(2650) => [ + q(Sea Island Creole English), + ], + q(2651) => [ + q(Guambiano), + ], + q(2652) => [ + q(Mbya Guarani), + ], + q(2653) => [ + q(Guayabero), + ], + q(2654) => [ + q(Gunwinggu), + ], + q(2655) => [ + q(Ache), + ], + q(2656) => [ + q(Farefare), + ], + q(2657) => [ + q(Guinean Sign Language), + ], + q(2658) => [ + q(Maleku Jaika), + ], + q(2659) => [ + q(Yanomamo), + ], + q(2660) => [ + q(Gun), + ], + q(2661) => [ + q(Gourmanchema), + ], + q(2662) => [ + q(Gusii), + q(Ekegusii), + ], + q(2663) => [ + q(Guana (Paraguay)), + ], + q(2664) => [ + q(Guanano), + ], + q(2665) => [ + q(Duwet), + ], + q(2666) => [ + q(Golin), + ], + q(2667) => [ + q(Guaja), + ], + q(2668) => [ + q(Gulay), + ], + q(2669) => [ + q(Gurmana), + ], + q(2670) => [ + q(Kuku-Yalanji), + ], + q(2671) => [ + q(Gaviao Do Jiparana), + ], + q(2672) => [ + q(Para Gaviao), + ], + q(2673) => [ + q(Gurung), + ], + q(2674) => [ + q(Gumawana), + ], + q(2675) => [ + q(Guyani), + ], + q(2676) => [ + q(Mbato), + ], + q(2677) => [ + q(Gwa), + ], + q(2678) => [ + q(Kalami), + ], + q(2679) => [ + q(Gawwada), + ], + q(2680) => [ + q(Gweno), + ], + q(2681) => [ + q(Gowro), + ], + q(2682) => [ + q(Moo), + ], + q(2683) => [ + q(/Gwi), + q(Gwi), + ], + q(2684) => [ + q(Awngthim), + ], + q(2685) => [ + q(Gwandara), + ], + q(2686) => [ + q(Gwere), + ], + q(2687) => [ + q(Gawar-Bati), + ], + q(2688) => [ + q(Guwamu), + ], + q(2689) => [ + q(Kwini), + ], + q(2690) => [ + q(Gua), + ], + q(2691) => [ + q(We Southern), + ], + q(2692) => [ + q(Northwest Gbaya), + ], + q(2693) => [ + q(Garus), + ], + q(2694) => [ + q(Kayardild), + ], + q(2695) => [ + q(Gyem), + ], + q(2696) => [ + q(Gungabula), + ], + q(2697) => [ + q(Gbayi), + ], + q(2698) => [ + q(Gyele), + ], + q(2699) => [ + q(Gayil), + ], + q(2700) => [ + q(Ngabere), + ], + q(2701) => [ + q(Guyanese Creole English), + ], + q(2702) => [ + q(Guarayu), + ], + q(2703) => [ + q(Gunya), + ], + q(2704) => [ + q(Ganza), + ], + q(2705) => [ + q(Gazi), + ], + q(2706) => [ + q(Gane), + ], + q(2707) => [ + q(Han), + ], + q(2708) => [ + q(Hanoi Sign Language), + ], + q(2709) => [ + q(Gurani), + ], + q(2710) => [ + q(Hatam), + ], + q(2711) => [ + q(Eastern Oromo), + ], + q(2712) => [ + q(Haiphong Sign Language), + ], + q(2713) => [ + q(Hanga), + ], + q(2714) => [ + q(Hahon), + ], + q(2715) => [ + q(Hajong), + ], + q(2716) => [ + q(Hakka Chinese), + ], + q(2717) => [ + q(Halang), + ], + q(2718) => [ + q(Hewa), + ], + q(2719) => [ + q(Hangaza), + ], + q(2720) => [ + q(Hako), + ], + q(2721) => [ + q(Hupla), + ], + q(2722) => [ + q(Ha), + ], + q(2723) => [ + q(Harari), + ], + q(2724) => [ + q(Haisla), + ], + q(2725) => [ + q(Havu), + ], + q(2726) => [ + q(Southern Haida), + ], + q(2727) => [ + q(Haya), + ], + q(2728) => [ + q(Hazaragi), + ], + q(2729) => [ + q(Hamba), + ], + q(2730) => [ + q(Huba), + ], + q(2731) => [ + q(Heiban), + ], + q(2732) => [ + q(Ancient Hebrew), + ], + q(2733) => [ + q(Habu), + ], + q(2734) => [ + q(Andaman Creole Hindi), + ], + q(2735) => [ + q(Huichol), + ], + q(2736) => [ + q(Northern Haida), + ], + q(2737) => [ + q(Honduras Sign Language), + ], + q(2738) => [ + q(Hadiyya), + ], + q(2739) => [ + q(Northern Qiandong Miao), + ], + q(2740) => [ + q(Herde), + ], + q(2741) => [ + q(Helong), + ], + q(2742) => [ + q(Hehe), + ], + q(2743) => [ + q(Heiltsuk), + ], + q(2744) => [ + q(Hemba), + ], + q(2745) => [ + q(Hai//om), + q(Haiom), + ], + q(2746) => [ + q(Haigwai), + ], + q(2747) => [ + q(Hoia Hoia), + ], + q(2748) => [ + q(Kerak), + ], + q(2749) => [ + q(Hoyahoya), + ], + q(2750) => [ + q(Lamang), + ], + q(2751) => [ + q(Hibito), + ], + q(2752) => [ + q(Hidatsa), + ], + q(2753) => [ + q(Fiji Hindi), + ], + q(2754) => [ + q(Kamwe), + ], + q(2755) => [ + q(Pamosu), + ], + q(2756) => [ + q(Hinduri), + ], + q(2757) => [ + q(Hijuk), + ], + q(2758) => [ + q(Seit-Kaitetu), + ], + q(2759) => [ + q(Tsoa), + ], + q(2760) => [ + q(Himarima), + ], + q(2761) => [ + q(Hiw), + ], + q(2762) => [ + q(Hixkaryana), + ], + q(2763) => [ + q(Haji), + ], + q(2764) => [ + q(Kahe), + ], + q(2765) => [ + q(Hunde), + ], + q(2766) => [ + q(Hunjara-Kaina Ke), + ], + q(2767) => [ + q(Hong Kong Sign Language), + q(Heung Kong Sau Yue), + ], + q(2768) => [ + q(Halia), + ], + q(2769) => [ + q(Halbi), + ], + q(2770) => [ + q(Halang Doan), + ], + q(2771) => [ + q(Hlersu), + ], + q(2772) => [ + q(Matu Chin), + ], + q(2773) => [ + q(Hieroglyphic Luwian), + ], + q(2774) => [ + q(Southern Mashan Hmong), + q(Southern Mashan Miao), + ], + q(2775) => [ + q(Humburi Senni Songhay), + ], + q(2776) => [ + q(Central Huishui Hmong), + q(Central Huishui Miao), + ], + q(2777) => [ + q(Large Flowery Miao), + q(A-hmaos), + q(Da-Hua Miao), + ], + q(2778) => [ + q(Eastern Huishui Hmong), + q(Eastern Huishui Miao), + ], + q(2779) => [ + q(Hmong Don), + ], + q(2780) => [ + q(Southwestern Guiyang Hmong), + ], + q(2781) => [ + q(Southwestern Huishui Hmong), + q(Southwestern Huishui Miao), + ], + q(2782) => [ + q(Northern Huishui Hmong), + q(Northern Huishui Miao), + ], + q(2783) => [ + q(Ge), + q(Gejia), + ], + q(2784) => [ + q(Maek), + ], + q(2785) => [ + q(Luopohe Hmong), + q(Luopohe Miao), + ], + q(2786) => [ + q(Central Mashan Hmong), + q(Central Mashan Miao), + ], + q(2787) => [ + q(Northern Mashan Hmong), + q(Northern Mashan Miao), + ], + q(2788) => [ + q(Eastern Qiandong Miao), + ], + q(2789) => [ + q(Hmar), + ], + q(2790) => [ + q(Southern Qiandong Miao), + ], + q(2791) => [ + q(Hamtai), + ], + q(2792) => [ + q(Hamap), + ], + q(2793) => [ + q(Hmong Do), + ], + q(2794) => [ + q(Western Mashan Hmong), + q(Western Mashan Miao), + ], + q(2795) => [ + q(Southern Guiyang Hmong), + q(Southern Guiyang Miao), + ], + q(2796) => [ + q(Hmong Shua), + q(Sinicized Miao), + ], + q(2797) => [ + q(Mina (Cameroon)), + ], + q(2798) => [ + q(Southern Hindko), + ], + q(2799) => [ + q(Chhattisgarhi), + ], + q(2800) => [ + q(//Ani), + q(Ani), + ], + q(2801) => [ + q(Hani), + ], + q(2802) => [ + q(Hmong Njua), + q(Mong Leng), + q(Mong Njua), + ], + q(2803) => [ + q(Hanunoo), + ], + q(2804) => [ + q(Northern Hindko), + ], + q(2805) => [ + q(Caribbean Hindustani), + ], + q(2806) => [ + q(Hung), + ], + q(2807) => [ + q(Hoava), + ], + q(2808) => [ + q(Mari (Madang Province)), + ], + q(2809) => [ + q(Ho), + ], + q(2810) => [ + q(Holma), + ], + q(2811) => [ + q(Horom), + ], + q(2812) => [ + q(Hobyot), + ], + q(2813) => [ + q(Holikachuk), + ], + q(2814) => [ + q(Hadothi), + q(Haroti), + ], + q(2815) => [ + q(Holu), + ], + q(2816) => [ + q(Homa), + ], + q(2817) => [ + q(Holoholo), + ], + q(2818) => [ + q(Hopi), + ], + q(2819) => [ + q(Horo), + ], + q(2820) => [ + q(Ho Chi Minh City Sign Language), + ], + q(2821) => [ + q(Hote), + q(Male), + ], + q(2822) => [ + q(Hovongan), + ], + q(2823) => [ + q(Honi), + ], + q(2824) => [ + q(Holiya), + ], + q(2825) => [ + q(Hozo), + ], + q(2826) => [ + q(Hpon), + ], + q(2827) => [ + q(Hawai'i Sign Language (HSL)), + q(Hawai'i Pidgin Sign Language), + ], + q(2828) => [ + q(Hrangkhol), + ], + q(2829) => [ + q(Niwer Mil), + ], + q(2830) => [ + q(Hre), + ], + q(2831) => [ + q(Haruku), + ], + q(2832) => [ + q(Horned Miao), + ], + q(2833) => [ + q(Haroi), + ], + q(2834) => [ + q(Nhirrpi), + ], + q(2835) => [ + q(Hertevin), + ], + q(2836) => [ + q(Hruso), + ], + q(2837) => [ + q(Warwar Feni), + ], + q(2838) => [ + q(Hunsrik), + ], + q(2839) => [ + q(Harzani), + ], + q(2840) => [ + q(Hungarian Sign Language), + ], + q(2841) => [ + q(Hausa Sign Language), + ], + q(2842) => [ + q(Xiang Chinese), + ], + q(2843) => [ + q(Harsusi), + ], + q(2844) => [ + q(Hoti), + ], + q(2845) => [ + q(Minica Huitoto), + ], + q(2846) => [ + q(Hadza), + ], + q(2847) => [ + q(Hitu), + ], + q(2848) => [ + q(Middle Hittite), + ], + q(2849) => [ + q(Huambisa), + ], + q(2850) => [ + q(=/Hua), + q(Hua), + ], + q(2851) => [ + q(Huaulu), + ], + q(2852) => [ + q(San Francisco Del Mar Huave), + ], + q(2853) => [ + q(Humene), + ], + q(2854) => [ + q(Huachipaeri), + ], + q(2855) => [ + q(Huilliche), + ], + q(2856) => [ + q(Huli), + ], + q(2857) => [ + q(Northern Guiyang Hmong), + q(Northern Guiyang Miao), + ], + q(2858) => [ + q(Hulung), + ], + q(2859) => [ + q(Hula), + ], + q(2860) => [ + q(Hungana), + ], + q(2861) => [ + q(Hu), + ], + q(2862) => [ + q(Tsat), + ], + q(2863) => [ + q(Halkomelem), + ], + q(2864) => [ + q(Huastec), + ], + q(2865) => [ + q(Humla), + ], + q(2866) => [ + q(Murui Huitoto), + ], + q(2867) => [ + q(San Mateo Del Mar Huave), + ], + q(2868) => [ + q(Hukumina), + ], + q(2869) => [ + q(Nupode Huitoto), + ], + q(2870) => [ + q(Hulaula), + ], + q(2871) => [ + q(Hunzib), + ], + q(2872) => [ + q(Haitian Vodoun Culture Language), + ], + q(2873) => [ + q(San Dionisio Del Mar Huave), + ], + q(2874) => [ + q(Haveke), + ], + q(2875) => [ + q(Sabu), + ], + q(2876) => [ + q(Santa Maria Del Mar Huave), + ], + q(2877) => [ + q(Wane), + ], + q(2878) => [ + q(Hawai'i Creole English), + q(Hawai'i Pidgin), + ], + q(2879) => [ + q(Hwana), + ], + q(2880) => [ + q(Hya), + ], + q(2881) => [ + q(Iaai), + ], + q(2882) => [ + q(Iatmul), + ], + q(2883) => [ + q(Purari), + ], + q(2884) => [ + q(Ibibio), + ], + q(2885) => [ + q(Iwaidja), + ], + q(2886) => [ + q(Akpes), + ], + q(2887) => [ + q(Ibanag), + ], + q(2888) => [ + q(Bih), + ], + q(2889) => [ + q(Ibaloi), + ], + q(2890) => [ + q(Agoi), + ], + q(2891) => [ + q(Ibino), + ], + q(2892) => [ + q(Ibuoro), + ], + q(2893) => [ + q(Ibu), + ], + q(2894) => [ + q(Ibani), + ], + q(2895) => [ + q(Ede Ica), + ], + q(2896) => [ + q(Etkywan), + ], + q(2897) => [ + q(Icelandic Sign Language), + ], + q(2898) => [ + q(Islander Creole English), + ], + q(2899) => [ + q(Idakho-Isukha-Tiriki), + q(Luidakho-Luisukha-Lutirichi), + ], + q(2900) => [ + q(Indo-Portuguese), + ], + q(2901) => [ + q(Idon), + q(Ajiya), + ], + q(2902) => [ + q(Ede Idaca), + ], + q(2903) => [ + q(Idere), + ], + q(2904) => [ + q(Idi), + ], + q(2905) => [ + q(Indri), + ], + q(2906) => [ + q(Idesa), + ], + q(2907) => [ + q(Idate), + ], + q(2908) => [ + q(Idoma), + ], + q(2909) => [ + q(Amganad Ifugao), + ], + q(2910) => [ + q(Batad Ifugao), + q(Ayangan Ifugao), + ], + q(2911) => [ + q(Ife), + ], + q(2912) => [ + q(Ifo), + ], + q(2913) => [ + q(Tuwali Ifugao), + ], + q(2914) => [ + q(Teke-Fuumu), + ], + q(2915) => [ + q(Mayoyao Ifugao), + ], + q(2916) => [ + q(Keley-I Kallahan), + ], + q(2917) => [ + q(Ebira), + ], + q(2918) => [ + q(Igede), + ], + q(2919) => [ + q(Igana), + ], + q(2920) => [ + q(Igala), + ], + q(2921) => [ + q(Kanggape), + ], + q(2922) => [ + q(Ignaciano), + ], + q(2923) => [ + q(Isebe), + ], + q(2924) => [ + q(Interglossa), + ], + q(2925) => [ + q(Igwe), + ], + q(2926) => [ + q(Iha Based Pidgin), + ], + q(2927) => [ + q(Ihievbe), + ], + q(2928) => [ + q(Iha), + ], + q(2929) => [ + q(Bidhawal), + ], + q(2930) => [ + q(Thiin), + ], + q(2931) => [ + q(Izon), + ], + q(2932) => [ + q(Biseni), + ], + q(2933) => [ + q(Ede Ije), + ], + q(2934) => [ + q(Kalabari), + ], + q(2935) => [ + q(Southeast Ijo), + ], + q(2936) => [ + q(Eastern Canadian Inuktitut), + ], + q(2937) => [ + q(Iko), + ], + q(2938) => [ + q(Ika), + ], + q(2939) => [ + q(Ikulu), + ], + q(2940) => [ + q(Olulumo-Ikom), + ], + q(2941) => [ + q(Ikpeshi), + ], + q(2942) => [ + q(Ikaranggal), + ], + q(2943) => [ + q(Inuit Sign Language), + ], + q(2944) => [ + q(Inuinnaqtun), + q(Western Canadian Inuktitut), + ], + q(2945) => [ + q(Iku-Gora-Ankwa), + ], + q(2946) => [ + q(Ikwere), + ], + q(2947) => [ + q(Ik), + ], + q(2948) => [ + q(Ikizu), + ], + q(2949) => [ + q(Ile Ape), + ], + q(2950) => [ + q(Ila), + ], + q(2951) => [ + q(Garig-Ilgar), + ], + q(2952) => [ + q(Ili Turki), + ], + q(2953) => [ + q(Ilongot), + ], + q(2954) => [ + q(Iranun (Malaysia)), + ], + q(2955) => [ + q(Iranun (Philippines)), + ], + q(2956) => [ + q(International Sign), + ], + q(2957) => [ + q(Ili'uun), + ], + q(2958) => [ + q(Ilue), + ], + q(2959) => [ + q(Mala Malasar), + ], + q(2960) => [ + q(Anamgura), + ], + q(2961) => [ + q(Miluk), + ], + q(2962) => [ + q(Imonda), + ], + q(2963) => [ + q(Imbongu), + ], + q(2964) => [ + q(Imroing), + ], + q(2965) => [ + q(Marsian), + ], + q(2966) => [ + q(Milyan), + ], + q(2967) => [ + q(Inga), + ], + q(2968) => [ + q(Degexit'an), + ], + q(2969) => [ + q(Jungle Inga), + ], + q(2970) => [ + q(Indonesian Sign Language), + ], + q(2971) => [ + q(Minaean), + ], + q(2972) => [ + q(Isinai), + ], + q(2973) => [ + q(Inoke-Yate), + ], + q(2974) => [ + q(Inapari), + ], + q(2975) => [ + q(Indian Sign Language), + ], + q(2976) => [ + q(Intha), + ], + q(2977) => [ + q(Ineseno), + ], + q(2978) => [ + q(Inor), + ], + q(2979) => [ + q(Tuma-Irumu), + ], + q(2980) => [ + q(Iowa-Oto), + ], + q(2981) => [ + q(Ipili), + ], + q(2982) => [ + q(Ipiko), + ], + q(2983) => [ + q(Iquito), + ], + q(2984) => [ + q(Ikwo), + ], + q(2985) => [ + q(Iresim), + ], + q(2986) => [ + q(Irarutu), + ], + q(2987) => [ + q(Irigwe), + ], + q(2988) => [ + q(Iraqw), + ], + q(2989) => [ + q(Irantxe), + ], + q(2990) => [ + q(Ir), + ], + q(2991) => [ + q(Irula), + ], + q(2992) => [ + q(Kamberau), + ], + q(2993) => [ + q(Iraya), + ], + q(2994) => [ + q(Isabi), + ], + q(2995) => [ + q(Isconahua), + ], + q(2996) => [ + q(Isnag), + ], + q(2997) => [ + q(Italian Sign Language), + ], + q(2998) => [ + q(Irish Sign Language), + ], + q(2999) => [ + q(Esan), + ], + q(3000) => [ + q(Nkem-Nkum), + ], + q(3001) => [ + q(Ishkashimi), + ], + q(3002) => [ + q(Masimasi), + ], + q(3003) => [ + q(Isanzu), + ], + q(3004) => [ + q(Isoko), + ], + q(3005) => [ + q(Israeli Sign Language), + ], + q(3006) => [ + q(Istriot), + ], + q(3007) => [ + q(Isu (Menchum Division)), + ], + q(3008) => [ + q(Binongan Itneg), + ], + q(3009) => [ + q(Southern Tidung), + ], + q(3010) => [ + q(Itene), + ], + q(3011) => [ + q(Inlaod Itneg), + ], + q(3012) => [ + q(Judeo-Italian), + ], + q(3013) => [ + q(Itelmen), + ], + q(3014) => [ + q(Itu Mbon Uzo), + ], + q(3015) => [ + q(Itonama), + ], + q(3016) => [ + q(Iteri), + ], + q(3017) => [ + q(Isekiri), + ], + q(3018) => [ + q(Maeng Itneg), + ], + q(3019) => [ + q(Itawit), + ], + q(3020) => [ + q(Ito), + ], + q(3021) => [ + q(Itik), + ], + q(3022) => [ + q(Moyadan Itneg), + ], + q(3023) => [ + q(Itza), + ], + q(3024) => [ + q(Iu Mien), + ], + q(3025) => [ + q(Ibatan), + ], + q(3026) => [ + q(Ivatan), + ], + q(3027) => [ + q(I-Wak), + ], + q(3028) => [ + q(Iwam), + ], + q(3029) => [ + q(Iwur), + ], + q(3030) => [ + q(Sepik Iwam), + ], + q(3031) => [ + q(Ixcatec), + ], + q(3032) => [ + q(Ixil), + ], + q(3033) => [ + q(Iyayu), + ], + q(3034) => [ + q(Mesaka), + ], + q(3035) => [ + q(Yaka (Congo)), + ], + q(3036) => [ + q(Ingrian), + ], + q(3037) => [ + q(Izere), + ], + q(3038) => [ + q(Izii), + ], + q(3039) => [ + q(Jamamadi), + ], + q(3040) => [ + q(Hyam), + ], + q(3041) => [ + q(Popti'), + q(Jakalteko), + ], + q(3042) => [ + q(Jahanka), + ], + q(3043) => [ + q(Yabem), + ], + q(3044) => [ + q(Jara), + ], + q(3045) => [ + q(Jah Hut), + ], + q(3046) => [ + q(Zazao), + ], + q(3047) => [ + q(Jakun), + ], + q(3048) => [ + q(Yalahatan), + ], + q(3049) => [ + q(Jamaican Creole English), + ], + q(3050) => [ + q(Jandai), + ], + q(3051) => [ + q(Yanyuwa), + ], + q(3052) => [ + q(Yaqay), + ], + q(3053) => [ + q(New Caledonian Javanese), + ], + q(3054) => [ + q(Jakati), + ], + q(3055) => [ + q(Yaur), + ], + q(3056) => [ + q(Jambi Malay), + ], + q(3057) => [ + q(Yan-nhangu), + ], + q(3058) => [ + q(Jawe), + ], + q(3059) => [ + q(Judeo-Berber), + ], + q(3060) => [ + q(Badjiri), + ], + q(3061) => [ + q(Arandai), + ], + q(3062) => [ + q(Barikewa), + ], + q(3063) => [ + q(Nafusi), + ], + q(3064) => [ + q(Jofotek-Bromnya), + ], + q(3065) => [ + q(Jabuti), + ], + q(3066) => [ + q(Jukun Takum), + ], + q(3067) => [ + q(Yawijibaya), + ], + q(3068) => [ + q(Jamaican Country Sign Language), + ], + q(3069) => [ + q(Krymchak), + ], + q(3070) => [ + q(Jad), + ], + q(3071) => [ + q(Jadgali), + ], + q(3072) => [ + q(Judeo-Tat), + ], + q(3073) => [ + q(Jebero), + ], + q(3074) => [ + q(Jerung), + ], + q(3075) => [ + q(Jeh), + ], + q(3076) => [ + q(Yei), + ], + q(3077) => [ + q(Jeri Kuo), + ], + q(3078) => [ + q(Yelmek), + ], + q(3079) => [ + q(Dza), + ], + q(3080) => [ + q(Jere), + ], + q(3081) => [ + q(Manem), + ], + q(3082) => [ + q(Jonkor Bourmataguil), + ], + q(3083) => [ + q(Ngbee), + ], + q(3084) => [ + q(Judeo-Georgian), + ], + q(3085) => [ + q(Gwak), + ], + q(3086) => [ + q(Ngomba), + ], + q(3087) => [ + q(Jehai), + ], + q(3088) => [ + q(Jhankot Sign Language), + ], + q(3089) => [ + q(Jina), + ], + q(3090) => [ + q(Jibu), + ], + q(3091) => [ + q(Tol), + ], + q(3092) => [ + q(Bu), + ], + q(3093) => [ + q(Jilbe), + ], + q(3094) => [ + q(Djingili), + ], + q(3095) => [ + q(sTodsde), + q(Shangzhai), + ], + q(3096) => [ + q(Jiiddu), + ], + q(3097) => [ + q(Jilim), + ], + q(3098) => [ + q(Jimi (Cameroon)), + ], + q(3099) => [ + q(Jiamao), + ], + q(3100) => [ + q(Guanyinqiao), + q(Lavrung), + ], + q(3101) => [ + q(Jita), + ], + q(3102) => [ + q(Youle Jinuo), + ], + q(3103) => [ + q(Shuar), + ], + q(3104) => [ + q(Buyuan Jinuo), + ], + q(3105) => [ + q(Jejueo), + ], + q(3106) => [ + q(Bankal), + ], + q(3107) => [ + q(Kaera), + ], + q(3108) => [ + q(Mobwa Karen), + ], + q(3109) => [ + q(Kubo), + ], + q(3110) => [ + q(Paku Karen), + ], + q(3111) => [ + q(Koro (India)), + ], + q(3112) => [ + q(Labir), + ], + q(3113) => [ + q(Ngile), + ], + q(3114) => [ + q(Jamaican Sign Language), + ], + q(3115) => [ + q(Dima), + ], + q(3116) => [ + q(Zumbun), + ], + q(3117) => [ + q(Machame), + ], + q(3118) => [ + q(Yamdena), + ], + q(3119) => [ + q(Jimi (Nigeria)), + ], + q(3120) => [ + q(Jumli), + ], + q(3121) => [ + q(Makuri Naga), + ], + q(3122) => [ + q(Kamara), + ], + q(3123) => [ + q(Mashi (Nigeria)), + ], + q(3124) => [ + q(Mouwase), + ], + q(3125) => [ + q(Western Juxtlahuaca Mixtec), + ], + q(3126) => [ + q(Jangshung), + ], + q(3127) => [ + q(Jandavra), + ], + q(3128) => [ + q(Yangman), + ], + q(3129) => [ + q(Janji), + ], + q(3130) => [ + q(Yemsa), + ], + q(3131) => [ + q(Rawat), + ], + q(3132) => [ + q(Jaunsari), + ], + q(3133) => [ + q(Joba), + ], + q(3134) => [ + q(Wojenaka), + ], + q(3135) => [ + q(Jogi), + ], + q(3136) => [ + q(Jora), + ], + q(3137) => [ + q(Jordanian Sign Language), + ], + q(3138) => [ + q(Jowulu), + ], + q(3139) => [ + q(Jewish Palestinian Aramaic), + ], + q(3140) => [ + q(Jaqaru), + ], + q(3141) => [ + q(Jarai), + ], + q(3142) => [ + q(Jiru), + ], + q(3143) => [ + q(Jorto), + ], + q(3144) => [ + q(Japreria), + ], + q(3145) => [ + q(Japanese Sign Language), + ], + q(3146) => [ + q(Juma), + ], + q(3147) => [ + q(Wannu), + ], + q(3148) => [ + q(Jurchen), + ], + q(3149) => [ + q(Worodougou), + ], + q(3150) => [ + q(Hone), + ], + q(3151) => [ + q(Ngadjuri), + ], + q(3152) => [ + q(Wapan), + ], + q(3153) => [ + q(Jirel), + ], + q(3154) => [ + q(Jumjum), + ], + q(3155) => [ + q(Juang), + ], + q(3156) => [ + q(Jiba), + ], + q(3157) => [ + q(Hupde), + ], + q(3158) => [ + q(Juruna), + ], + q(3159) => [ + q(Jumla Sign Language), + ], + q(3160) => [ + q(Jutish), + ], + q(3161) => [ + q(Ju), + ], + q(3162) => [ + q(Wapha), + ], + q(3163) => [ + q(Juray), + ], + q(3164) => [ + q(Javindo), + ], + q(3165) => [ + q(Caribbean Javanese), + ], + q(3166) => [ + q(Jwira-Pepesa), + ], + q(3167) => [ + q(Jiarong), + ], + q(3168) => [ + q(Judeo-Yemeni Arabic), + ], + q(3169) => [ + q(Jaya), + ], + q(3170) => [ + q(Adara), + ], + q(3171) => [ + q(Ketangalan), + ], + q(3172) => [ + q(Katso), + ], + q(3173) => [ + q(Kajaman), + ], + q(3174) => [ + q(Kara (Central African Republic)), + ], + q(3175) => [ + q(Karekare), + ], + q(3176) => [ + q(Jju), + ], + q(3177) => [ + q(Kalanguya), + q(Kayapa Kallahan), + ], + q(3178) => [ + q(Xaasongaxango), + ], + q(3179) => [ + q(Bezhta), + ], + q(3180) => [ + q(Capanahua), + ], + q(3181) => [ + q(Katukina), + ], + q(3182) => [ + q(Kao), + ], + q(3183) => [ + q(Kamayura), + ], + q(3184) => [ + q(Kalarko), + ], + q(3185) => [ + q(Kaxuiana), + ], + q(3186) => [ + q(Kadiweu), + ], + q(3187) => [ + q(Kanju), + ], + q(3188) => [ + q(Khamba), + ], + q(3189) => [ + q(Camsa), + ], + q(3190) => [ + q(Kaptiau), + ], + q(3191) => [ + q(Kari), + ], + q(3192) => [ + q(Grass Koiari), + ], + q(3193) => [ + q(Kanembu), + ], + q(3194) => [ + q(Iwal), + ], + q(3195) => [ + q(Kare (Central African Republic)), + ], + q(3196) => [ + q(Keliko), + ], + q(3197) => [ + q(Kabiye), + ], + q(3198) => [ + q(Kamano), + ], + q(3199) => [ + q(Kafa), + ], + q(3200) => [ + q(Kande), + ], + q(3201) => [ + q(Abadi), + ], + q(3202) => [ + q(Kabutra), + ], + q(3203) => [ + q(Dera (Indonesia)), + ], + q(3204) => [ + q(Kaiep), + ], + q(3205) => [ + q(Ap Ma), + ], + q(3206) => [ + q(Manga Kanuri), + ], + q(3207) => [ + q(Duhwa), + ], + q(3208) => [ + q(Khanty), + ], + q(3209) => [ + q(Kawacha), + ], + q(3210) => [ + q(Lubila), + ], + q(3211) => [ + q(Ngkalmpw Kanum), + ], + q(3212) => [ + q(Kaivi), + ], + q(3213) => [ + q(Ukaan), + ], + q(3214) => [ + q(Tyap), + ], + q(3215) => [ + q(Vono), + ], + q(3216) => [ + q(Kamantan), + ], + q(3217) => [ + q(Kobiana), + ], + q(3218) => [ + q(Kalanga), + ], + q(3219) => [ + q(Kela (Papua New Guinea)), + q(Kala), + ], + q(3220) => [ + q(Gula (Central African Republic)), + ], + q(3221) => [ + q(Nubi), + ], + q(3222) => [ + q(Kinalakna), + ], + q(3223) => [ + q(Kanga), + ], + q(3224) => [ + q(Kamo), + ], + q(3225) => [ + q(Katla), + ], + q(3226) => [ + q(Koenoem), + ], + q(3227) => [ + q(Kaian), + ], + q(3228) => [ + q(Kami (Tanzania)), + ], + q(3229) => [ + q(Kete), + ], + q(3230) => [ + q(Kabwari), + ], + q(3231) => [ + q(Kachama-Ganjule), + ], + q(3232) => [ + q(Korandje), + ], + q(3233) => [ + q(Konongo), + ], + q(3234) => [ + q(Worimi), + ], + q(3235) => [ + q(Kutu), + ], + q(3236) => [ + q(Yankunytjatjara), + ], + q(3237) => [ + q(Makonde), + ], + q(3238) => [ + q(Mamusi), + ], + q(3239) => [ + q(Seba), + ], + q(3240) => [ + q(Tem), + ], + q(3241) => [ + q(Kumam), + ], + q(3242) => [ + q(Karamojong), + ], + q(3243) => [ + q(Numee), + q(Kwenyi), + ], + q(3244) => [ + q(Tsikimba), + ], + q(3245) => [ + q(Kagoma), + ], + q(3246) => [ + q(Kunda), + ], + q(3247) => [ + q(Kaningdon-Nindem), + ], + q(3248) => [ + q(Koch), + ], + q(3249) => [ + q(Karaim), + ], + q(3250) => [ + q(Kuy), + ], + q(3251) => [ + q(Kadaru), + ], + q(3252) => [ + q(Koneraw), + ], + q(3253) => [ + q(Kam), + ], + q(3254) => [ + q(Keder), + q(Keijar), + ], + q(3255) => [ + q(Kwaja), + ], + q(3256) => [ + q(Kabuverdianu), + ], + q(3257) => [ + q(Kele), + ], + q(3258) => [ + q(Keiga), + ], + q(3259) => [ + q(Kerewe), + ], + q(3260) => [ + q(Eastern Keres), + ], + q(3261) => [ + q(Kpessi), + ], + q(3262) => [ + q(Tese), + ], + q(3263) => [ + q(Keak), + ], + q(3264) => [ + q(Kei), + ], + q(3265) => [ + q(Kadar), + ], + q(3266) => [ + q(Kekchi), + ], + q(3267) => [ + q(Kela (Democratic Republic of Congo)), + ], + q(3268) => [ + q(Kemak), + ], + q(3269) => [ + q(Kenyang), + ], + q(3270) => [ + q(Kakwa), + ], + q(3271) => [ + q(Kaikadi), + ], + q(3272) => [ + q(Kamar), + ], + q(3273) => [ + q(Kera), + ], + q(3274) => [ + q(Kugbo), + ], + q(3275) => [ + q(Ket), + ], + q(3276) => [ + q(Akebu), + ], + q(3277) => [ + q(Kanikkaran), + ], + q(3278) => [ + q(West Kewa), + ], + q(3279) => [ + q(Kukna), + ], + q(3280) => [ + q(Kupia), + ], + q(3281) => [ + q(Kukele), + ], + q(3282) => [ + q(Kodava), + ], + q(3283) => [ + q(Northwestern Kolami), + ], + q(3284) => [ + q(Konda-Dora), + ], + q(3285) => [ + q(Korra Koraga), + ], + q(3286) => [ + q(Kota (India)), + ], + q(3287) => [ + q(Koya), + ], + q(3288) => [ + q(Kudiya), + ], + q(3289) => [ + q(Kurichiya), + ], + q(3290) => [ + q(Kannada Kurumba), + ], + q(3291) => [ + q(Kemiehua), + ], + q(3292) => [ + q(Kinnauri), + ], + q(3293) => [ + q(Kung), + ], + q(3294) => [ + q(Khunsari), + ], + q(3295) => [ + q(Kuk), + ], + q(3296) => [ + q(Koro (Cote d'Ivoire)), + ], + q(3297) => [ + q(Korwa), + ], + q(3298) => [ + q(Korku), + ], + q(3299) => [ + q(Kachhi), + q(Kutchi), + ], + q(3300) => [ + q(Bilaspuri), + ], + q(3301) => [ + q(Kanjari), + ], + q(3302) => [ + q(Katkari), + ], + q(3303) => [ + q(Kurmukar), + ], + q(3304) => [ + q(Kharam Naga), + ], + q(3305) => [ + q(Kullu Pahari), + ], + q(3306) => [ + q(Kumaoni), + ], + q(3307) => [ + q(Koromfe), + ], + q(3308) => [ + q(Koyaga), + ], + q(3309) => [ + q(Kawe), + ], + q(3310) => [ + q(Komering), + ], + q(3311) => [ + q(Kube), + ], + q(3312) => [ + q(Kusunda), + ], + q(3313) => [ + q(Selangor Sign Language), + ], + q(3314) => [ + q(Gamale Kham), + ], + q(3315) => [ + q(Kaiwa), + ], + q(3316) => [ + q(Kunggari), + ], + q(3317) => [ + q(Karipuna), + ], + q(3318) => [ + q(Karingani), + ], + q(3319) => [ + q(Krongo), + ], + q(3320) => [ + q(Kaingang), + ], + q(3321) => [ + q(Kamoro), + ], + q(3322) => [ + q(Abun), + ], + q(3323) => [ + q(Kumbainggar), + ], + q(3324) => [ + q(Somyev), + ], + q(3325) => [ + q(Kobol), + ], + q(3326) => [ + q(Karas), + ], + q(3327) => [ + q(Karon Dori), + ], + q(3328) => [ + q(Kamaru), + ], + q(3329) => [ + q(Kyerung), + ], + q(3330) => [ + q(Lu), + ], + q(3331) => [ + q(Tukang Besi North), + ], + q(3332) => [ + q(Badi Kanum), + ], + q(3333) => [ + q(Korowai), + ], + q(3334) => [ + q(Khuen), + ], + q(3335) => [ + q(Khams Tibetan), + ], + q(3336) => [ + q(Kehu), + ], + q(3337) => [ + q(Kuturmi), + ], + q(3338) => [ + q(Halh Mongolian), + ], + q(3339) => [ + q(Lusi), + ], + q(3340) => [ + q(Khandesi), + ], + q(3341) => [ + q(Kapori), + q(Kapauri), + ], + q(3342) => [ + q(Koyra Chiini Songhay), + ], + q(3343) => [ + q(Kharia), + ], + q(3344) => [ + q(Kasua), + ], + q(3345) => [ + q(Khamti), + ], + q(3346) => [ + q(Nkhumbi), + ], + q(3347) => [ + q(Khvarshi), + ], + q(3348) => [ + q(Khowar), + ], + q(3349) => [ + q(Kanu), + ], + q(3350) => [ + q(Kele (Democratic Republic of Congo)), + ], + q(3351) => [ + q(Keapara), + ], + q(3352) => [ + q(Kim), + ], + q(3353) => [ + q(Koalib), + ], + q(3354) => [ + q(Kickapoo), + ], + q(3355) => [ + q(Koshin), + ], + q(3356) => [ + q(Kibet), + ], + q(3357) => [ + q(Eastern Parbate Kham), + ], + q(3358) => [ + q(Kimaama), + q(Kimaghima), + ], + q(3359) => [ + q(Kilmeri), + ], + q(3360) => [ + q(Kitsai), + ], + q(3361) => [ + q(Kilivila), + ], + q(3362) => [ + q(Kariya), + ], + q(3363) => [ + q(Karagas), + ], + q(3364) => [ + q(Kiowa), + ], + q(3365) => [ + q(Sheshi Kham), + ], + q(3366) => [ + q(Kosadle), + q(Kosare), + ], + q(3367) => [ + q(Kis), + ], + q(3368) => [ + q(Agob), + ], + q(3369) => [ + q(Kirmanjki (individual language)), + ], + q(3370) => [ + q(Kimbu), + ], + q(3371) => [ + q(Northeast Kiwai), + ], + q(3372) => [ + q(Khiamniungan Naga), + ], + q(3373) => [ + q(Kirikiri), + ], + q(3374) => [ + q(Kisi), + ], + q(3375) => [ + q(Mlap), + ], + q(3376) => [ + q(Q'anjob'al), + q(Kanjobal), + ], + q(3377) => [ + q(Coastal Konjo), + ], + q(3378) => [ + q(Southern Kiwai), + ], + q(3379) => [ + q(Kisar), + ], + q(3380) => [ + q(Khalaj), + ], + q(3381) => [ + q(Khmu), + ], + q(3382) => [ + q(Khakas), + ], + q(3383) => [ + q(Zabana), + ], + q(3384) => [ + q(Khinalugh), + ], + q(3385) => [ + q(Highland Konjo), + ], + q(3386) => [ + q(Western Parbate Kham), + ], + q(3387) => [ + q(Khang), + ], + q(3388) => [ + q(Kunjen), + ], + q(3389) => [ + q(Harijan Kinnauri), + ], + q(3390) => [ + q(Pwo Eastern Karen), + ], + q(3391) => [ + q(Western Keres), + ], + q(3392) => [ + q(Kurudu), + ], + q(3393) => [ + q(East Kewa), + ], + q(3394) => [ + q(Phrae Pwo Karen), + ], + q(3395) => [ + q(Kashaya), + ], + q(3396) => [ + q(Kaikavian Literary Language), + ], + q(3397) => [ + q(Ramopa), + ], + q(3398) => [ + q(Erave), + ], + q(3399) => [ + q(Bumthangkha), + ], + q(3400) => [ + q(Kakanda), + ], + q(3401) => [ + q(Kwerisa), + ], + q(3402) => [ + q(Odoodee), + ], + q(3403) => [ + q(Kinuku), + ], + q(3404) => [ + q(Kakabe), + ], + q(3405) => [ + q(Kalaktang Monpa), + ], + q(3406) => [ + q(Mabaka Valley Kalinga), + ], + q(3407) => [ + q(Khun), + ], + q(3408) => [ + q(Kagulu), + ], + q(3409) => [ + q(Kako), + ], + q(3410) => [ + q(Kokota), + ], + q(3411) => [ + q(Kosarek Yale), + ], + q(3412) => [ + q(Kiong), + ], + q(3413) => [ + q(Kon Keu), + ], + q(3414) => [ + q(Karko), + ], + q(3415) => [ + q(Gugubera), + ], + q(3416) => [ + q(Kaiku), + ], + q(3417) => [ + q(Kir-Balar), + ], + q(3418) => [ + q(Giiwo), + ], + q(3419) => [ + q(Koi), + ], + q(3420) => [ + q(Tumi), + ], + q(3421) => [ + q(Kangean), + ], + q(3422) => [ + q(Teke-Kukuya), + ], + q(3423) => [ + q(Kohin), + ], + q(3424) => [ + q(Guguyimidjir), + ], + q(3425) => [ + q(Kaska), + ], + q(3426) => [ + q(Klamath-Modoc), + ], + q(3427) => [ + q(Kiliwa), + ], + q(3428) => [ + q(Kolbila), + ], + q(3429) => [ + q(Gamilaraay), + ], + q(3430) => [ + q(Kulung (Nepal)), + ], + q(3431) => [ + q(Kendeje), + ], + q(3432) => [ + q(Tagakaulo), + ], + q(3433) => [ + q(Weliki), + ], + q(3434) => [ + q(Kalumpang), + ], + q(3435) => [ + q(Turkic Khalaj), + ], + q(3436) => [ + q(Kono (Nigeria)), + ], + q(3437) => [ + q(Kagan Kalagan), + ], + q(3438) => [ + q(Migum), + ], + q(3439) => [ + q(Kalenjin), + ], + q(3440) => [ + q(Kapya), + ], + q(3441) => [ + q(Kamasa), + ], + q(3442) => [ + q(Rumu), + ], + q(3443) => [ + q(Khaling), + ], + q(3444) => [ + q(Kalasha), + ], + q(3445) => [ + q(Nukna), + ], + q(3446) => [ + q(Klao), + ], + q(3447) => [ + q(Maskelynes), + ], + q(3448) => [ + q(Tado), + q(Lindu), + ], + q(3449) => [ + q(Koluwawa), + ], + q(3450) => [ + q(Kalao), + ], + q(3451) => [ + q(Kabola), + ], + q(3452) => [ + q(Konni), + ], + q(3453) => [ + q(Southern Dong), + ], + q(3454) => [ + q(Majukayang Kalinga), + ], + q(3455) => [ + q(Bakole), + ], + q(3456) => [ + q(Kare (Papua New Guinea)), + ], + q(3457) => [ + q(Kate), + ], + q(3458) => [ + q(Kalam), + ], + q(3459) => [ + q(Kami (Nigeria)), + ], + q(3460) => [ + q(Kumarbhag Paharia), + ], + q(3461) => [ + q(Limos Kalinga), + ], + q(3462) => [ + q(Tanudan Kalinga), + ], + q(3463) => [ + q(Kom (India)), + ], + q(3464) => [ + q(Awtuw), + ], + q(3465) => [ + q(Kwoma), + ], + q(3466) => [ + q(Gimme), + ], + q(3467) => [ + q(Kwama), + ], + q(3468) => [ + q(Northern Kurdish), + ], + q(3469) => [ + q(Kamasau), + ], + q(3470) => [ + q(Kemtuik), + ], + q(3471) => [ + q(Kanite), + ], + q(3472) => [ + q(Karipuna Creole French), + ], + q(3473) => [ + q(Komo (Democratic Republic of Congo)), + ], + q(3474) => [ + q(Waboda), + ], + q(3475) => [ + q(Koma), + ], + q(3476) => [ + q(Khorasani Turkish), + ], + q(3477) => [ + q(Dera (Nigeria)), + ], + q(3478) => [ + q(Lubuagan Kalinga), + ], + q(3479) => [ + q(Central Kanuri), + ], + q(3480) => [ + q(Konda), + ], + q(3481) => [ + q(Kankanaey), + ], + q(3482) => [ + q(Mankanya), + ], + q(3483) => [ + q(Koongo), + ], + q(3484) => [ + q(Kanufi), + ], + q(3485) => [ + q(Western Kanjobal), + ], + q(3486) => [ + q(Kuranko), + ], + q(3487) => [ + q(Keninjal), + ], + q(3488) => [ + q(Kanamari), + ], + q(3489) => [ + q(Konkani (individual language)), + ], + q(3490) => [ + q(Kono (Sierra Leone)), + ], + q(3491) => [ + q(Kwanja), + ], + q(3492) => [ + q(Kintaq), + ], + q(3493) => [ + q(Kaningra), + ], + q(3494) => [ + q(Kensiu), + ], + q(3495) => [ + q(Panoan Katukina), + ], + q(3496) => [ + q(Kono (Guinea)), + ], + q(3497) => [ + q(Tabo), + ], + q(3498) => [ + q(Kung-Ekoka), + ], + q(3499) => [ + q(Kendayan), + q(Salako), + ], + q(3500) => [ + q(Kanyok), + ], + q(3501) => [ + q(Kalamse), + ], + q(3502) => [ + q(Konomala), + ], + q(3503) => [ + q(Kpati), + ], + q(3504) => [ + q(Kodi), + ], + q(3505) => [ + q(Kacipo-Balesi), + ], + q(3506) => [ + q(Kubi), + ], + q(3507) => [ + q(Cogui), + q(Kogi), + ], + q(3508) => [ + q(Koyo), + ], + q(3509) => [ + q(Komi-Permyak), + ], + q(3510) => [ + q(Kol (Papua New Guinea)), + ], + q(3511) => [ + q(Konzo), + ], + q(3512) => [ + q(Waube), + ], + q(3513) => [ + q(Kota (Gabon)), + ], + q(3514) => [ + q(Lagwan), + ], + q(3515) => [ + q(Koke), + ], + q(3516) => [ + q(Kudu-Camo), + ], + q(3517) => [ + q(Kugama), + ], + q(3518) => [ + q(Koyukon), + ], + q(3519) => [ + q(Korak), + ], + q(3520) => [ + q(Kutto), + ], + q(3521) => [ + q(Mullu Kurumba), + ], + q(3522) => [ + q(Curripaco), + ], + q(3523) => [ + q(Koba), + ], + q(3524) => [ + q(Komba), + ], + q(3525) => [ + q(Kapingamarangi), + ], + q(3526) => [ + q(Kplang), + ], + q(3527) => [ + q(Kofei), + ], + q(3528) => [ + q(Karaja), + ], + q(3529) => [ + q(Kpan), + ], + q(3530) => [ + q(Kpala), + ], + q(3531) => [ + q(Koho), + ], + q(3532) => [ + q(Kepkiriwat), + ], + q(3533) => [ + q(Ikposo), + ], + q(3534) => [ + q(Korupun-Sela), + ], + q(3535) => [ + q(Korafe-Yegha), + ], + q(3536) => [ + q(Tehit), + ], + q(3537) => [ + q(Karata), + ], + q(3538) => [ + q(Kafoa), + ], + q(3539) => [ + q(Komi-Zyrian), + ], + q(3540) => [ + q(Kobon), + ], + q(3541) => [ + q(Mountain Koiali), + ], + q(3542) => [ + q(Koryak), + ], + q(3543) => [ + q(Kupsabiny), + ], + q(3544) => [ + q(Mum), + ], + q(3545) => [ + q(Kovai), + ], + q(3546) => [ + q(Doromu-Koki), + ], + q(3547) => [ + q(Koy Sanjaq Surat), + ], + q(3548) => [ + q(Kalagan), + ], + q(3549) => [ + q(Kakabai), + ], + q(3550) => [ + q(Khe), + ], + q(3551) => [ + q(Kisankasa), + ], + q(3552) => [ + q(Koitabu), + ], + q(3553) => [ + q(Koromira), + ], + q(3554) => [ + q(Kotafon Gbe), + ], + q(3555) => [ + q(Kyenele), + ], + q(3556) => [ + q(Khisa), + ], + q(3557) => [ + q(Kaonde), + ], + q(3558) => [ + q(Eastern Krahn), + ], + q(3559) => [ + q(Kimre), + ], + q(3560) => [ + q(Krenak), + ], + q(3561) => [ + q(Kimaragang), + ], + q(3562) => [ + q(Northern Kissi), + ], + q(3563) => [ + q(Klias River Kadazan), + ], + q(3564) => [ + q(Seroa), + ], + q(3565) => [ + q(Okolod), + ], + q(3566) => [ + q(Kandas), + ], + q(3567) => [ + q(Mser), + ], + q(3568) => [ + q(Koorete), + ], + q(3569) => [ + q(Korana), + ], + q(3570) => [ + q(Kumhali), + ], + q(3571) => [ + q(Karkin), + ], + q(3572) => [ + q(Kairui-Midiki), + ], + q(3573) => [ + q(Panara), + ], + q(3574) => [ + q(Koro (Vanuatu)), + ], + q(3575) => [ + q(Kurama), + ], + q(3576) => [ + q(Krio), + ], + q(3577) => [ + q(Kinaray-A), + ], + q(3578) => [ + q(Kerek), + ], + q(3579) => [ + q(Sapo), + ], + q(3580) => [ + q(Korop), + ], + q(3581) => [ + q(Krung), + ], + q(3582) => [ + q(Gbaya (Sudan)), + ], + q(3583) => [ + q(Tumari Kanuri), + ], + q(3584) => [ + q(Kavet), + ], + q(3585) => [ + q(Western Krahn), + ], + q(3586) => [ + q(Karon), + ], + q(3587) => [ + q(Kryts), + ], + q(3588) => [ + q(Sota Kanum), + ], + q(3589) => [ + q(Shuwa-Zamani), + ], + q(3590) => [ + q(Shambala), + ], + q(3591) => [ + q(Southern Kalinga), + ], + q(3592) => [ + q(Kuanua), + ], + q(3593) => [ + q(Kuni), + ], + q(3594) => [ + q(Bafia), + ], + q(3595) => [ + q(Kusaghe), + ], + q(3596) => [ + q(Kolsch), + ], + q(3597) => [ + q(Krisa), + q(I'saka), + ], + q(3598) => [ + q(Uare), + ], + q(3599) => [ + q(Kansa), + ], + q(3600) => [ + q(Kumalu), + ], + q(3601) => [ + q(Kumba), + ], + q(3602) => [ + q(Kasiguranin), + ], + q(3603) => [ + q(Kofa), + ], + q(3604) => [ + q(Kaba), + ], + q(3605) => [ + q(Kwaami), + ], + q(3606) => [ + q(Borong), + ], + q(3607) => [ + q(Southern Kisi), + ], + q(3608) => [ + q(Winye), + ], + q(3609) => [ + q(Khamyang), + ], + q(3610) => [ + q(Kusu), + ], + q(3611) => [ + q(S'gaw Karen), + ], + q(3612) => [ + q(Kedang), + ], + q(3613) => [ + q(Kharia Thar), + ], + q(3614) => [ + q(Kodaku), + ], + q(3615) => [ + q(Katua), + ], + q(3616) => [ + q(Kambaata), + ], + q(3617) => [ + q(Kholok), + ], + q(3618) => [ + q(Kokata), + ], + q(3619) => [ + q(Nubri), + ], + q(3620) => [ + q(Kwami), + ], + q(3621) => [ + q(Kalkutung), + ], + q(3622) => [ + q(Karanga), + ], + q(3623) => [ + q(North Muyu), + ], + q(3624) => [ + q(Plapo Krumen), + ], + q(3625) => [ + q(Kaniet), + ], + q(3626) => [ + q(Koroshi), + ], + q(3627) => [ + q(Kurti), + ], + q(3628) => [ + q(Karitiana), + ], + q(3629) => [ + q(Kuot), + ], + q(3630) => [ + q(Kaduo), + ], + q(3631) => [ + q(Katabaga), + ], + q(3632) => [ + q(South Muyu), + ], + q(3633) => [ + q(Ketum), + ], + q(3634) => [ + q(Kituba (Democratic Republic of Congo)), + ], + q(3635) => [ + q(Eastern Katu), + ], + q(3636) => [ + q(Kato), + ], + q(3637) => [ + q(Kaxarari), + ], + q(3638) => [ + q(Kango (Bas-Uele District)), + ], + q(3639) => [ + q(Ju/'hoan), + q(Juhoan), + q(Ju|'hoansi), + ], + q(3640) => [ + q(Kutep), + ], + q(3641) => [ + q(Kwinsu), + ], + q(3642) => [ + q('Auhelawa), + ], + q(3643) => [ + q(Kuman (Papua New Guinea)), + ], + q(3644) => [ + q(Western Katu), + ], + q(3645) => [ + q(Kupa), + ], + q(3646) => [ + q(Kushi), + ], + q(3647) => [ + q(Kuikuro-Kalapalo), + ], + q(3648) => [ + q(Kuria), + ], + q(3649) => [ + q(Kepo'), + ], + q(3650) => [ + q(Kulere), + ], + q(3651) => [ + q(Kunama), + ], + q(3652) => [ + q(Kumukio), + ], + q(3653) => [ + q(Kunimaipa), + ], + q(3654) => [ + q(Kusaal), + ], + q(3655) => [ + q(Upper Kuskokwim), + ], + q(3656) => [ + q(Kur), + ], + q(3657) => [ + q(Kpagua), + ], + q(3658) => [ + q(Kukatja), + ], + q(3659) => [ + q(Kuuku-Ya'u), + ], + q(3660) => [ + q(Kunza), + ], + q(3661) => [ + q(Bagvalal), + ], + q(3662) => [ + q(Kubu), + ], + q(3663) => [ + q(Kove), + ], + q(3664) => [ + q(Kui (Indonesia)), + ], + q(3665) => [ + q(Kalabakan), + ], + q(3666) => [ + q(Kabalai), + ], + q(3667) => [ + q(Kuni-Boazi), + ], + q(3668) => [ + q(Komodo), + ], + q(3669) => [ + q(Kwang), + ], + q(3670) => [ + q(Psikye), + ], + q(3671) => [ + q(Korean Sign Language), + ], + q(3672) => [ + q(Kayaw), + ], + q(3673) => [ + q(Kendem), + ], + q(3674) => [ + q(Border Kuna), + ], + q(3675) => [ + q(Dobel), + ], + q(3676) => [ + q(Kompane), + ], + q(3677) => [ + q(Geba Karen), + ], + q(3678) => [ + q(Kerinci), + ], + q(3679) => [ + q(Lahta Karen), + q(Lahta), + ], + q(3680) => [ + q(Yinbaw Karen), + ], + q(3681) => [ + q(Kola), + ], + q(3682) => [ + q(Wersing), + ], + q(3683) => [ + q(Parkari Koli), + ], + q(3684) => [ + q(Yintale Karen), + q(Yintale), + ], + q(3685) => [ + q(Tsakwambo), + q(Tsaukambo), + ], + q(3686) => [ + q(Daw), + ], + q(3687) => [ + q(Kwa), + ], + q(3688) => [ + q(Likwala), + ], + q(3689) => [ + q(Kwaio), + ], + q(3690) => [ + q(Kwerba), + ], + q(3691) => [ + q(Kwara'ae), + ], + q(3692) => [ + q(Sara Kaba Deme), + ], + q(3693) => [ + q(Kowiai), + ], + q(3694) => [ + q(Awa-Cuaiquer), + ], + q(3695) => [ + q(Kwanga), + ], + q(3696) => [ + q(Kwakiutl), + ], + q(3697) => [ + q(Kofyar), + ], + q(3698) => [ + q(Kwambi), + ], + q(3699) => [ + q(Kwangali), + ], + q(3700) => [ + q(Kwomtari), + ], + q(3701) => [ + q(Kodia), + ], + q(3702) => [ + q(Kwer), + ], + q(3703) => [ + q(Kwese), + ], + q(3704) => [ + q(Kwesten), + ], + q(3705) => [ + q(Kwakum), + ], + q(3706) => [ + q(Sara Kaba Naa), + ], + q(3707) => [ + q(Kwinti), + ], + q(3708) => [ + q(Khirwar), + ], + q(3709) => [ + q(San Salvador Kongo), + ], + q(3710) => [ + q(Kwadi), + ], + q(3711) => [ + q(Kairiru), + ], + q(3712) => [ + q(Krobu), + ], + q(3713) => [ + q(Konso), + q(Khonso), + ], + q(3714) => [ + q(Brunei), + ], + q(3715) => [ + q(Manumanaw Karen), + q(Manumanaw), + ], + q(3716) => [ + q(Karo (Ethiopia)), + ], + q(3717) => [ + q(Keningau Murut), + ], + q(3718) => [ + q(Kulfa), + ], + q(3719) => [ + q(Zayein Karen), + ], + q(3720) => [ + q(Nepali Kurux), + ], + q(3721) => [ + q(Northern Khmer), + ], + q(3722) => [ + q(Kanowit-Tanjong Melanau), + ], + q(3723) => [ + q(Kanoe), + ], + q(3724) => [ + q(Wadiyara Koli), + ], + q(3725) => [ + q(Smarky Kanum), + ], + q(3726) => [ + q(Koro (Papua New Guinea)), + ], + q(3727) => [ + q(Kangjia), + ], + q(3728) => [ + q(Koiwat), + ], + q(3729) => [ + q(Kui (India)), + ], + q(3730) => [ + q(Kuvi), + ], + q(3731) => [ + q(Konai), + ], + q(3732) => [ + q(Likuba), + ], + q(3733) => [ + q(Kayong), + ], + q(3734) => [ + q(Kerewo), + ], + q(3735) => [ + q(Kwaya), + ], + q(3736) => [ + q(Butbut Kalinga), + ], + q(3737) => [ + q(Kyaka), + ], + q(3738) => [ + q(Karey), + ], + q(3739) => [ + q(Krache), + ], + q(3740) => [ + q(Kouya), + ], + q(3741) => [ + q(Keyagana), + ], + q(3742) => [ + q(Karok), + ], + q(3743) => [ + q(Kiput), + ], + q(3744) => [ + q(Karao), + ], + q(3745) => [ + q(Kamayo), + ], + q(3746) => [ + q(Kalapuya), + ], + q(3747) => [ + q(Kpatili), + ], + q(3748) => [ + q(Northern Binukidnon), + ], + q(3749) => [ + q(Kelon), + ], + q(3750) => [ + q(Kang), + ], + q(3751) => [ + q(Kenga), + ], + q(3752) => [ + q(Kuruaya), + ], + q(3753) => [ + q(Baram Kayan), + ], + q(3754) => [ + q(Kayagar), + ], + q(3755) => [ + q(Western Kayah), + ], + q(3756) => [ + q(Kayort), + ], + q(3757) => [ + q(Kudmali), + ], + q(3758) => [ + q(Rapoisi), + ], + q(3759) => [ + q(Kambaira), + ], + q(3760) => [ + q(Kayabi), + ], + q(3761) => [ + q(Western Karaboro), + ], + q(3762) => [ + q(Kaibobo), + ], + q(3763) => [ + q(Bondoukou Kulango), + ], + q(3764) => [ + q(Kadai), + ], + q(3765) => [ + q(Kosena), + ], + q(3766) => [ + q(Da'a Kaili), + ], + q(3767) => [ + q(Kikai), + ], + q(3768) => [ + q(Kelabit), + ], + q(3769) => [ + q(Kazukuru), + ], + q(3770) => [ + q(Kayeli), + ], + q(3771) => [ + q(Kais), + ], + q(3772) => [ + q(Kokola), + ], + q(3773) => [ + q(Kaningi), + ], + q(3774) => [ + q(Kaidipang), + ], + q(3775) => [ + q(Kaike), + ], + q(3776) => [ + q(Karang), + ], + q(3777) => [ + q(Sugut Dusun), + ], + q(3778) => [ + q(Kayupulau), + ], + q(3779) => [ + q(Komyandaret), + ], + q(3780) => [ + q(Kariri-Xoco), + ], + q(3781) => [ + q(Kamarian), + ], + q(3782) => [ + q(Kango (Tshopo District)), + ], + q(3783) => [ + q(Kalabra), + ], + q(3784) => [ + q(Southern Subanen), + ], + q(3785) => [ + q(Linear A), + ], + q(3786) => [ + q(Lacandon), + ], + q(3787) => [ + q(Pattani), + ], + q(3788) => [ + q(Lafofa), + ], + q(3789) => [ + q(Langi), + ], + q(3790) => [ + q(Lambya), + ], + q(3791) => [ + q(Lango (Uganda)), + ], + q(3792) => [ + q(Laka (Nigeria)), + ], + q(3793) => [ + q(Lalia), + ], + q(3794) => [ + q(Laru), + ], + q(3795) => [ + q(Laka (Chad)), + ], + q(3796) => [ + q(Qabiao), + ], + q(3797) => [ + q(Larteh), + ], + q(3798) => [ + q(Lama (Togo)), + ], + q(3799) => [ + q(Laba), + ], + q(3800) => [ + q(Lauje), + ], + q(3801) => [ + q(Tiwa), + ], + q(3802) => [ + q(Lama Bai), + ], + q(3803) => [ + q(Aribwatsa), + ], + q(3804) => [ + q(Lui), + ], + q(3805) => [ + q(Label), + ], + q(3806) => [ + q(Lakkia), + ], + q(3807) => [ + q(Lak), + ], + q(3808) => [ + q(Tinani), + ], + q(3809) => [ + q(Laopang), + ], + q(3810) => [ + q(La'bi), + ], + q(3811) => [ + q(Ladakhi), + ], + q(3812) => [ + q(Central Bontok), + ], + q(3813) => [ + q(Libon Bikol), + ], + q(3814) => [ + q(Lodhi), + ], + q(3815) => [ + q(Lamet), + ], + q(3816) => [ + q(Laven), + ], + q(3817) => [ + q(Wampar), + ], + q(3818) => [ + q(Lohorung), + ], + q(3819) => [ + q(Libyan Sign Language), + ], + q(3820) => [ + q(Lachi), + ], + q(3821) => [ + q(Labu), + ], + q(3822) => [ + q(Lavatbura-Lamusong), + ], + q(3823) => [ + q(Tolaki), + ], + q(3824) => [ + q(Lawangan), + ], + q(3825) => [ + q(Lamu-Lamu), + ], + q(3826) => [ + q(Lardil), + ], + q(3827) => [ + q(Legenyem), + ], + q(3828) => [ + q(Lola), + ], + q(3829) => [ + q(Loncong), + q(Sekak), + ], + q(3830) => [ + q(Lubu), + ], + q(3831) => [ + q(Luchazi), + ], + q(3832) => [ + q(Lisela), + ], + q(3833) => [ + q(Tungag), + ], + q(3834) => [ + q(Western Lawa), + ], + q(3835) => [ + q(Luhu), + ], + q(3836) => [ + q(Lisabata-Nuniali), + ], + q(3837) => [ + q(Kla-Dan), + ], + q(3838) => [ + q(Duya), + ], + q(3839) => [ + q(Luri), + ], + q(3840) => [ + q(Lenyima), + ], + q(3841) => [ + q(Lamja-Dengsa-Tola), + ], + q(3842) => [ + q(Laari), + ], + q(3843) => [ + q(Lemoro), + ], + q(3844) => [ + q(Leelau), + ], + q(3845) => [ + q(Kaan), + ], + q(3846) => [ + q(Landoma), + ], + q(3847) => [ + q(Laadan), + ], + q(3848) => [ + q(Loo), + ], + q(3849) => [ + q(Tso), + ], + q(3850) => [ + q(Lufu), + ], + q(3851) => [ + q(Lega-Shabunda), + ], + q(3852) => [ + q(Lala-Bisa), + ], + q(3853) => [ + q(Leco), + ], + q(3854) => [ + q(Lendu), + ], + q(3855) => [ + q(Lyele), + ], + q(3856) => [ + q(Lelemi), + ], + q(3857) => [ + q(Lenje), + ], + q(3858) => [ + q(Lemio), + ], + q(3859) => [ + q(Lengola), + ], + q(3860) => [ + q(Leipon), + ], + q(3861) => [ + q(Lele (Democratic Republic of Congo)), + ], + q(3862) => [ + q(Nomaande), + ], + q(3863) => [ + q(Lenca), + ], + q(3864) => [ + q(Leti (Cameroon)), + ], + q(3865) => [ + q(Lepcha), + ], + q(3866) => [ + q(Lembena), + ], + q(3867) => [ + q(Lenkau), + ], + q(3868) => [ + q(Lese), + ], + q(3869) => [ + q(Lesing-Gelimi), + q(Amio-Gelimi), + ], + q(3870) => [ + q(Kara (Papua New Guinea)), + ], + q(3871) => [ + q(Lamma), + ], + q(3872) => [ + q(Ledo Kaili), + ], + q(3873) => [ + q(Luang), + ], + q(3874) => [ + q(Lemolang), + ], + q(3875) => [ + q(Lefa), + ], + q(3876) => [ + q(Lingua Franca Nova), + ], + q(3877) => [ + q(Lungga), + ], + q(3878) => [ + q(Laghu), + ], + q(3879) => [ + q(Lugbara), + ], + q(3880) => [ + q(Laghuu), + ], + q(3881) => [ + q(Lengilu), + ], + q(3882) => [ + q(Lingarak), + q(Neverver), + ], + q(3883) => [ + q(Wala), + ], + q(3884) => [ + q(Lega-Mwenga), + ], + q(3885) => [ + q(T'apo), + q(Opuuo), + ], + q(3886) => [ + q(Logba), + ], + q(3887) => [ + q(Lengo), + ], + q(3888) => [ + q(Pahi), + ], + q(3889) => [ + q(Longgu), + ], + q(3890) => [ + q(Ligenza), + ], + q(3891) => [ + q(Laha (Viet Nam)), + ], + q(3892) => [ + q(Laha (Indonesia)), + ], + q(3893) => [ + q(Lahu Shi), + ], + q(3894) => [ + q(Lahul Lohar), + ], + q(3895) => [ + q(Lhomi), + ], + q(3896) => [ + q(Lahanan), + ], + q(3897) => [ + q(Lhokpu), + ], + q(3898) => [ + q(Mlahso), + ], + q(3899) => [ + q(Lo-Toga), + ], + q(3900) => [ + q(Lahu), + ], + q(3901) => [ + q(West-Central Limba), + ], + q(3902) => [ + q(Likum), + ], + q(3903) => [ + q(Hlai), + ], + q(3904) => [ + q(Nyindrou), + ], + q(3905) => [ + q(Likila), + ], + q(3906) => [ + q(Limbu), + ], + q(3907) => [ + q(Ligbi), + ], + q(3908) => [ + q(Lihir), + ], + q(3909) => [ + q(Ligurian), + ], + q(3910) => [ + q(Lika), + ], + q(3911) => [ + q(Lillooet), + ], + q(3912) => [ + q(Liki), + ], + q(3913) => [ + q(Sekpele), + ], + q(3914) => [ + q(Libido), + ], + q(3915) => [ + q(Liberian English), + ], + q(3916) => [ + q(Lisu), + ], + q(3917) => [ + q(Logorik), + ], + q(3918) => [ + q(Liv), + ], + q(3919) => [ + q(Col), + ], + q(3920) => [ + q(Liabuku), + ], + q(3921) => [ + q(Banda-Bambari), + ], + q(3922) => [ + q(Libinza), + ], + q(3923) => [ + q(Golpa), + ], + q(3924) => [ + q(Rampi), + ], + q(3925) => [ + q(Laiyolo), + ], + q(3926) => [ + q(Li'o), + ], + q(3927) => [ + q(Lampung Api), + ], + q(3928) => [ + q(Yirandali), + ], + q(3929) => [ + q(Yuru), + ], + q(3930) => [ + q(Lakalei), + ], + q(3931) => [ + q(Kabras), + q(Lukabaras), + ], + q(3932) => [ + q(Kucong), + ], + q(3933) => [ + q(Lakonde), + ], + q(3934) => [ + q(Kenyi), + ], + q(3935) => [ + q(Lakha), + ], + q(3936) => [ + q(Laki), + ], + q(3937) => [ + q(Remun), + ], + q(3938) => [ + q(Laeko-Libuat), + ], + q(3939) => [ + q(Kalaamaya), + ], + q(3940) => [ + q(Lakon), + q(Vure), + ], + q(3941) => [ + q(Khayo), + q(Olukhayo), + ], + q(3942) => [ + q(Pari), + ], + q(3943) => [ + q(Kisa), + q(Olushisa), + ], + q(3944) => [ + q(Lakota), + ], + q(3945) => [ + q(Kungkari), + ], + q(3946) => [ + q(Lokoya), + ], + q(3947) => [ + q(Lala-Roba), + ], + q(3948) => [ + q(Lolo), + ], + q(3949) => [ + q(Lele (Guinea)), + ], + q(3950) => [ + q(Ladin), + ], + q(3951) => [ + q(Lele (Papua New Guinea)), + ], + q(3952) => [ + q(Hermit), + ], + q(3953) => [ + q(Lole), + ], + q(3954) => [ + q(Lamu), + ], + q(3955) => [ + q(Teke-Laali), + ], + q(3956) => [ + q(Ladji Ladji), + ], + q(3957) => [ + q(Lelak), + ], + q(3958) => [ + q(Lilau), + ], + q(3959) => [ + q(Lasalimu), + ], + q(3960) => [ + q(Lele (Chad)), + ], + q(3961) => [ + q(Khlor), + ], + q(3962) => [ + q(North Efate), + ], + q(3963) => [ + q(Lolak), + ], + q(3964) => [ + q(Lithuanian Sign Language), + ], + q(3965) => [ + q(Lau), + ], + q(3966) => [ + q(Lauan), + ], + q(3967) => [ + q(East Limba), + ], + q(3968) => [ + q(Merei), + ], + q(3969) => [ + q(Limilngan), + ], + q(3970) => [ + q(Lumun), + ], + q(3971) => [ + q(Peve), + ], + q(3972) => [ + q(South Lembata), + ], + q(3973) => [ + q(Lamogai), + ], + q(3974) => [ + q(Lambichhong), + ], + q(3975) => [ + q(Lombi), + ], + q(3976) => [ + q(West Lembata), + ], + q(3977) => [ + q(Lamkang), + ], + q(3978) => [ + q(Hano), + ], + q(3979) => [ + q(Lambadi), + ], + q(3980) => [ + q(Lombard), + ], + q(3981) => [ + q(Limbum), + ], + q(3982) => [ + q(Lamatuka), + ], + q(3983) => [ + q(Lamalera), + ], + q(3984) => [ + q(Lamenu), + ], + q(3985) => [ + q(Lomaiviti), + ], + q(3986) => [ + q(Lake Miwok), + ], + q(3987) => [ + q(Laimbue), + ], + q(3988) => [ + q(Lamboya), + ], + q(3989) => [ + q(Lumbee), + ], + q(3990) => [ + q(Langbashe), + ], + q(3991) => [ + q(Mbalanhu), + ], + q(3992) => [ + q(Lundayeh), + q(Lun Bawang), + ], + q(3993) => [ + q(Langobardic), + ], + q(3994) => [ + q(Lanoh), + ], + q(3995) => [ + q(Daantanai'), + ], + q(3996) => [ + q(Leningitij), + ], + q(3997) => [ + q(South Central Banda), + ], + q(3998) => [ + q(Langam), + ], + q(3999) => [ + q(Lorediakarkar), + ], + q(4000) => [ + q(Lango (Sudan)), + ], + q(4001) => [ + q(Lamnso'), + ], + q(4002) => [ + q(Longuda), + ], + q(4003) => [ + q(Lanima), + ], + q(4004) => [ + q(Lonzo), + ], + q(4005) => [ + q(Loloda), + ], + q(4006) => [ + q(Lobi), + ], + q(4007) => [ + q(Inonhan), + ], + q(4008) => [ + q(Saluan), + ], + q(4009) => [ + q(Logol), + ], + q(4010) => [ + q(Logo), + ], + q(4011) => [ + q(Narim), + ], + q(4012) => [ + q(Loma (Cote d'Ivoire)), + ], + q(4013) => [ + q(Lou), + ], + q(4014) => [ + q(Loko), + ], + q(4015) => [ + q(Loma (Liberia)), + ], + q(4016) => [ + q(Malawi Lomwe), + ], + q(4017) => [ + q(Lombo), + ], + q(4018) => [ + q(Lopa), + ], + q(4019) => [ + q(Lobala), + ], + q(4020) => [ + q(Teen), + ], + q(4021) => [ + q(Loniu), + ], + q(4022) => [ + q(Otuho), + ], + q(4023) => [ + q(Louisiana Creole), + ], + q(4024) => [ + q(Lopi), + ], + q(4025) => [ + q(Tampias Lobu), + ], + q(4026) => [ + q(Loun), + ], + q(4027) => [ + q(Loke), + ], + q(4028) => [ + q(Lelepa), + ], + q(4029) => [ + q(Lepki), + ], + q(4030) => [ + q(Long Phuri Naga), + ], + q(4031) => [ + q(Lipo), + ], + q(4032) => [ + q(Lopit), + ], + q(4033) => [ + q(Rara Bakati'), + ], + q(4034) => [ + q(Northern Luri), + ], + q(4035) => [ + q(Laurentian), + ], + q(4036) => [ + q(Laragia), + ], + q(4037) => [ + q(Marachi), + q(Olumarachi), + ], + q(4038) => [ + q(Loarki), + ], + q(4039) => [ + q(Lari), + ], + q(4040) => [ + q(Marama), + q(Olumarama), + ], + q(4041) => [ + q(Lorang), + ], + q(4042) => [ + q(Laro), + ], + q(4043) => [ + q(Southern Yamphu), + ], + q(4044) => [ + q(Larantuka Malay), + ], + q(4045) => [ + q(Larevat), + ], + q(4046) => [ + q(Lemerig), + ], + q(4047) => [ + q(Lasgerdi), + ], + q(4048) => [ + q(Lishana Deni), + ], + q(4049) => [ + q(Lusengo), + ], + q(4050) => [ + q(Lyons Sign Language), + ], + q(4051) => [ + q(Lish), + ], + q(4052) => [ + q(Lashi), + ], + q(4053) => [ + q(Latvian Sign Language), + ], + q(4054) => [ + q(Saamia), + q(Olusamia), + ], + q(4055) => [ + q(Laos Sign Language), + ], + q(4056) => [ + q(Panamanian Sign Language), + q(Lengua de Senas Panamenas), + ], + q(4057) => [ + q(Aruop), + ], + q(4058) => [ + q(Lasi), + ], + q(4059) => [ + q(Trinidad and Tobago Sign Language), + ], + q(4060) => [ + q(Mauritian Sign Language), + ], + q(4061) => [ + q(Late Middle Chinese), + ], + q(4062) => [ + q(Latgalian), + ], + q(4063) => [ + q(Thur), + ], + q(4064) => [ + q(Leti (Indonesia)), + ], + q(4065) => [ + q(Latunde), + ], + q(4066) => [ + q(Tsotso), + q(Olutsotso), + ], + q(4067) => [ + q(Tachoni), + q(Lutachoni), + ], + q(4068) => [ + q(Latu), + ], + q(4069) => [ + q(Aringa), + ], + q(4070) => [ + q(Ludian), + ], + q(4071) => [ + q(Luvale), + ], + q(4072) => [ + q(Laua), + ], + q(4073) => [ + q(Luna), + ], + q(4074) => [ + q(Lunanakha), + ], + q(4075) => [ + q(Olu'bo), + ], + q(4076) => [ + q(Luimbi), + ], + q(4077) => [ + q(Lumbu), + ], + q(4078) => [ + q(Lucumi), + ], + q(4079) => [ + q(Laura), + ], + q(4080) => [ + q(Lushootseed), + ], + q(4081) => [ + q(Lumba-Yakkha), + ], + q(4082) => [ + q(Luwati), + ], + q(4083) => [ + q(Luo (Cameroon)), + ], + q(4084) => [ + q(Luyia), + q(Oluluyia), + ], + q(4085) => [ + q(Southern Luri), + ], + q(4086) => [ + q(Maku'a), + ], + q(4087) => [ + q(Lavukaleve), + ], + q(4088) => [ + q(Standard Latvian), + ], + q(4089) => [ + q(Levuka), + ], + q(4090) => [ + q(Lwalu), + ], + q(4091) => [ + q(Lewo Eleng), + ], + q(4092) => [ + q(Wanga), + q(Oluwanga), + ], + q(4093) => [ + q(White Lachi), + ], + q(4094) => [ + q(Eastern Lawa), + ], + q(4095) => [ + q(Laomian), + ], + q(4096) => [ + q(Luwo), + ], + q(4097) => [ + q(Lewotobi), + ], + q(4098) => [ + q(Lawu), + ], + q(4099) => [ + q(Lewo), + ], + q(4100) => [ + q(Layakha), + ], + q(4101) => [ + q(Lyngngam), + ], + q(4102) => [ + q(Luyana), + ], + q(4103) => [ + q(Literary Chinese), + ], + q(4104) => [ + q(Litzlitz), + ], + q(4105) => [ + q(Leinong Naga), + ], + q(4106) => [ + q(Laz), + ], + q(4107) => [ + q(San Jeronimo Tecoatl Mazatec), + ], + q(4108) => [ + q(Yutanduchi Mixtec), + ], + q(4109) => [ + q(Bo-Rukul), + ], + q(4110) => [ + q(Mafa), + ], + q(4111) => [ + q(Jalapa De Diaz Mazatec), + ], + q(4112) => [ + q(Mam), + ], + q(4113) => [ + q(Chiquihuitlan Mazatec), + ], + q(4114) => [ + q(San Francisco Matlatzinca), + ], + q(4115) => [ + q(Huautla Mazatec), + ], + q(4116) => [ + q(Satere-Mawe), + ], + q(4117) => [ + q(Mampruli), + ], + q(4118) => [ + q(North Moluccan Malay), + ], + q(4119) => [ + q(Central Mazahua), + ], + q(4120) => [ + q(Higaonon), + ], + q(4121) => [ + q(Western Bukidnon Manobo), + ], + q(4122) => [ + q(Macushi), + ], + q(4123) => [ + q(Dibabawon Manobo), + ], + q(4124) => [ + q(Molale), + ], + q(4125) => [ + q(Baba Malay), + ], + q(4126) => [ + q(Mangseng), + ], + q(4127) => [ + q(Ilianen Manobo), + ], + q(4128) => [ + q(Nadeb), + ], + q(4129) => [ + q(Malol), + ], + q(4130) => [ + q(Maxakali), + ], + q(4131) => [ + q(Ombamba), + ], + q(4132) => [ + q(Macaguan), + ], + q(4133) => [ + q(Mbo (Cameroon)), + ], + q(4134) => [ + q(Malayo), + ], + q(4135) => [ + q(Maisin), + ], + q(4136) => [ + q(Nukak Maku), + ], + q(4137) => [ + q(Sarangani Manobo), + ], + q(4138) => [ + q(Matigsalug Manobo), + ], + q(4139) => [ + q(Mbula-Bwazza), + ], + q(4140) => [ + q(Mbulungish), + ], + q(4141) => [ + q(Maring), + ], + q(4142) => [ + q(Mari (East Sepik Province)), + ], + q(4143) => [ + q(Memoni), + ], + q(4144) => [ + q(Amoltepec Mixtec), + ], + q(4145) => [ + q(Maca), + ], + q(4146) => [ + q(Machiguenga), + ], + q(4147) => [ + q(Bitur), + ], + q(4148) => [ + q(Sharanahua), + ], + q(4149) => [ + q(Itundujia Mixtec), + ], + q(4150) => [ + q(Matses), + ], + q(4151) => [ + q(Mapoyo), + ], + q(4152) => [ + q(Maquiritari), + ], + q(4153) => [ + q(Mese), + ], + q(4154) => [ + q(Mvanip), + ], + q(4155) => [ + q(Mbunda), + ], + q(4156) => [ + q(Macaguaje), + ], + q(4157) => [ + q(Malaccan Creole Portuguese), + ], + q(4158) => [ + q(Masana), + ], + q(4159) => [ + q(Coatlan Mixe), + ], + q(4160) => [ + q(Makaa), + ], + q(4161) => [ + q(Ese), + ], + q(4162) => [ + q(Menya), + ], + q(4163) => [ + q(Mambai), + ], + q(4164) => [ + q(Mengisa), + ], + q(4165) => [ + q(Cameroon Mambila), + ], + q(4166) => [ + q(Minanibai), + ], + q(4167) => [ + q(Mawa (Chad)), + ], + q(4168) => [ + q(Mpiemo), + ], + q(4169) => [ + q(South Watut), + ], + q(4170) => [ + q(Mawan), + ], + q(4171) => [ + q(Mada (Nigeria)), + ], + q(4172) => [ + q(Morigi), + ], + q(4173) => [ + q(Male (Papua New Guinea)), + ], + q(4174) => [ + q(Mbum), + ], + q(4175) => [ + q(Maba (Chad)), + ], + q(4176) => [ + q(Massalat), + ], + q(4177) => [ + q(Maguindanaon), + ], + q(4178) => [ + q(Mamvu), + ], + q(4179) => [ + q(Mangbetu), + ], + q(4180) => [ + q(Mangbutu), + ], + q(4181) => [ + q(Maltese Sign Language), + ], + q(4182) => [ + q(Mayogo), + ], + q(4183) => [ + q(Mbati), + ], + q(4184) => [ + q(Mbala), + ], + q(4185) => [ + q(Mbole), + ], + q(4186) => [ + q(Maria (Papua New Guinea)), + ], + q(4187) => [ + q(Mbere), + ], + q(4188) => [ + q(Mboko), + ], + q(4189) => [ + q(Santa Lucia Monteverde Mixtec), + ], + q(4190) => [ + q(Mbosi), + ], + q(4191) => [ + q(Dizin), + ], + q(4192) => [ + q(Male (Ethiopia)), + ], + q(4193) => [ + q(Surui Do Para), + ], + q(4194) => [ + q(Menka), + ], + q(4195) => [ + q(Ikobi), + ], + q(4196) => [ + q(Mara), + ], + q(4197) => [ + q(Melpa), + ], + q(4198) => [ + q(Mengen), + ], + q(4199) => [ + q(Megam), + ], + q(4200) => [ + q(Southwestern Tlaxiaco Mixtec), + ], + q(4201) => [ + q(Midob), + ], + q(4202) => [ + q(Meyah), + ], + q(4203) => [ + q(Mekeo), + ], + q(4204) => [ + q(Central Melanau), + ], + q(4205) => [ + q(Mangala), + ], + q(4206) => [ + q(Kedah Malay), + ], + q(4207) => [ + q(Miriwung), + ], + q(4208) => [ + q(Merey), + ], + q(4209) => [ + q(Meru), + ], + q(4210) => [ + q(Masmaje), + ], + q(4211) => [ + q(Mato), + ], + q(4212) => [ + q(Motu), + ], + q(4213) => [ + q(Mano), + ], + q(4214) => [ + q(Maaka), + ], + q(4215) => [ + q(Hassaniyya), + ], + q(4216) => [ + q(Menominee), + ], + q(4217) => [ + q(Pattani Malay), + ], + q(4218) => [ + q(Bangka), + ], + q(4219) => [ + q(Mba), + ], + q(4220) => [ + q(Mendankwe-Nkwen), + ], + q(4221) => [ + q(Morisyen), + ], + q(4222) => [ + q(Naki), + ], + q(4223) => [ + q(Mogofin), + ], + q(4224) => [ + q(Matal), + ], + q(4225) => [ + q(Wandala), + ], + q(4226) => [ + q(Mefele), + ], + q(4227) => [ + q(North Mofu), + ], + q(4228) => [ + q(Putai), + ], + q(4229) => [ + q(Marghi South), + ], + q(4230) => [ + q(Cross River Mbembe), + ], + q(4231) => [ + q(Mbe), + ], + q(4232) => [ + q(Makassar Malay), + ], + q(4233) => [ + q(Moba), + ], + q(4234) => [ + q(Marithiel), + ], + q(4235) => [ + q(Mexican Sign Language), + ], + q(4236) => [ + q(Mokerang), + ], + q(4237) => [ + q(Mbwela), + ], + q(4238) => [ + q(Mandjak), + ], + q(4239) => [ + q(Mulaha), + ], + q(4240) => [ + q(Melo), + ], + q(4241) => [ + q(Mayo), + ], + q(4242) => [ + q(Mabaan), + ], + q(4243) => [ + q(Mararit), + ], + q(4244) => [ + q(Morokodo), + ], + q(4245) => [ + q(Moru), + ], + q(4246) => [ + q(Mango), + ], + q(4247) => [ + q(Maklew), + ], + q(4248) => [ + q(Mpumpong), + ], + q(4249) => [ + q(Makhuwa-Meetto), + ], + q(4250) => [ + q(Lijili), + ], + q(4251) => [ + q(Abureni), + ], + q(4252) => [ + q(Mawes), + ], + q(4253) => [ + q(Maleu-Kilenge), + ], + q(4254) => [ + q(Mambae), + ], + q(4255) => [ + q(Mbangi), + ], + q(4256) => [ + q(Meta'), + ], + q(4257) => [ + q(Eastern Magar), + ], + q(4258) => [ + q(Malila), + ], + q(4259) => [ + q(Mambwe-Lungu), + ], + q(4260) => [ + q(Manda (Tanzania)), + ], + q(4261) => [ + q(Mongol), + ], + q(4262) => [ + q(Mailu), + ], + q(4263) => [ + q(Matengo), + ], + q(4264) => [ + q(Matumbi), + ], + q(4265) => [ + q(Mbunga), + ], + q(4266) => [ + q(Mbugwe), + ], + q(4267) => [ + q(Manda (India)), + ], + q(4268) => [ + q(Mahongwe), + ], + q(4269) => [ + q(Mocho), + ], + q(4270) => [ + q(Mbugu), + ], + q(4271) => [ + q(Besisi), + q(Mah Meri), + ], + q(4272) => [ + q(Mamaa), + ], + q(4273) => [ + q(Margu), + ], + q(4274) => [ + q(Ma'di), + ], + q(4275) => [ + q(Mogholi), + ], + q(4276) => [ + q(Mungaka), + ], + q(4277) => [ + q(Mauwake), + ], + q(4278) => [ + q(Makhuwa-Moniga), + ], + q(4279) => [ + q(Mocheno), + ], + q(4280) => [ + q(Mashi (Zambia)), + ], + q(4281) => [ + q(Balinese Malay), + ], + q(4282) => [ + q(Mandan), + ], + q(4283) => [ + q(Eastern Mari), + ], + q(4284) => [ + q(Buru (Indonesia)), + ], + q(4285) => [ + q(Mandahuaca), + ], + q(4286) => [ + q(Digaro-Mishmi), + q(Darang Deng), + ], + q(4287) => [ + q(Mbukushu), + ], + q(4288) => [ + q(Maru), + q(Lhaovo), + ], + q(4289) => [ + q(Ma'anyan), + ], + q(4290) => [ + q(Mor (Mor Islands)), + ], + q(4291) => [ + q(Miami), + ], + q(4292) => [ + q(Atatlahuca Mixtec), + ], + q(4293) => [ + q(Mandaic), + ], + q(4294) => [ + q(Ocotepec Mixtec), + ], + q(4295) => [ + q(Mofu-Gudur), + ], + q(4296) => [ + q(San Miguel El Grande Mixtec), + ], + q(4297) => [ + q(Chayuco Mixtec), + ], + q(4298) => [ + q(Chigmecatitlan Mixtec), + ], + q(4299) => [ + q(Abar), + q(Mungbam), + ], + q(4300) => [ + q(Mikasuki), + ], + q(4301) => [ + q(Penoles Mixtec), + ], + q(4302) => [ + q(Alacatlatzala Mixtec), + ], + q(4303) => [ + q(Pinotepa Nacional Mixtec), + ], + q(4304) => [ + q(Apasco-Apoala Mixtec), + ], + q(4305) => [ + q(Miskito), + ], + q(4306) => [ + q(Isthmus Mixe), + ], + q(4307) => [ + q(Southern Puebla Mixtec), + ], + q(4308) => [ + q(Cacaloxtepec Mixtec), + ], + q(4309) => [ + q(Akoye), + ], + q(4310) => [ + q(Mixtepec Mixtec), + ], + q(4311) => [ + q(Ayutla Mixtec), + ], + q(4312) => [ + q(Coatzospan Mixtec), + ], + q(4313) => [ + q(Makalero), + ], + q(4314) => [ + q(San Juan Colorado Mixtec), + ], + q(4315) => [ + q(Northwest Maidu), + ], + q(4316) => [ + q(Muskum), + ], + q(4317) => [ + q(Tu), + ], + q(4318) => [ + q(Mwera (Nyasa)), + ], + q(4319) => [ + q(Kim Mun), + ], + q(4320) => [ + q(Mawak), + ], + q(4321) => [ + q(Matukar), + ], + q(4322) => [ + q(Mandeali), + ], + q(4323) => [ + q(Medebur), + ], + q(4324) => [ + q(Ma (Papua New Guinea)), + ], + q(4325) => [ + q(Malankuravan), + ], + q(4326) => [ + q(Malapandaram), + ], + q(4327) => [ + q(Malaryan), + ], + q(4328) => [ + q(Malavedan), + ], + q(4329) => [ + q(Miship), + ], + q(4330) => [ + q(Sauria Paharia), + ], + q(4331) => [ + q(Manna-Dora), + ], + q(4332) => [ + q(Mannan), + ], + q(4333) => [ + q(Karbi), + ], + q(4334) => [ + q(Mahali), + ], + q(4335) => [ + q(Mahican), + ], + q(4336) => [ + q(Majhi), + ], + q(4337) => [ + q(Mbre), + ], + q(4338) => [ + q(Mal Paharia), + ], + q(4339) => [ + q(Siliput), + ], + q(4340) => [ + q(Mawchi), + ], + q(4341) => [ + q(Miya), + ], + q(4342) => [ + q(Mak (China)), + ], + q(4343) => [ + q(Dhatki), + ], + q(4344) => [ + q(Mokilese), + ], + q(4345) => [ + q(Byep), + ], + q(4346) => [ + q(Mokole), + ], + q(4347) => [ + q(Moklen), + ], + q(4348) => [ + q(Kupang Malay), + ], + q(4349) => [ + q(Mingang Doso), + ], + q(4350) => [ + q(Moikodi), + ], + q(4351) => [ + q(Bay Miwok), + ], + q(4352) => [ + q(Malas), + ], + q(4353) => [ + q(Silacayoapan Mixtec), + ], + q(4354) => [ + q(Vamale), + ], + q(4355) => [ + q(Konyanka Maninka), + ], + q(4356) => [ + q(Mafea), + ], + q(4357) => [ + q(Kituba (Congo)), + ], + q(4358) => [ + q(Kinamiging Manobo), + ], + q(4359) => [ + q(East Makian), + ], + q(4360) => [ + q(Makasae), + ], + q(4361) => [ + q(Malo), + ], + q(4362) => [ + q(Mbule), + ], + q(4363) => [ + q(Cao Lan), + ], + q(4364) => [ + q(Manambu), + ], + q(4365) => [ + q(Mal), + ], + q(4366) => [ + q(Mape), + ], + q(4367) => [ + q(Malimpung), + ], + q(4368) => [ + q(Miltu), + ], + q(4369) => [ + q(Ilwana), + q(Kiwilwana), + ], + q(4370) => [ + q(Malua Bay), + ], + q(4371) => [ + q(Mulam), + ], + q(4372) => [ + q(Malango), + ], + q(4373) => [ + q(Mlomp), + ], + q(4374) => [ + q(Bargam), + ], + q(4375) => [ + q(Western Maninkakan), + ], + q(4376) => [ + q(Vame), + ], + q(4377) => [ + q(Masalit), + ], + q(4378) => [ + q(To'abaita), + ], + q(4379) => [ + q(Motlav), + q(Mwotlap), + ], + q(4380) => [ + q(Moloko), + ], + q(4381) => [ + q(Malfaxal), + q(Naha'ai), + ], + q(4382) => [ + q(Malaynon), + ], + q(4383) => [ + q(Mama), + ], + q(4384) => [ + q(Momina), + ], + q(4385) => [ + q(Michoacan Mazahua), + ], + q(4386) => [ + q(Maonan), + ], + q(4387) => [ + q(Mae), + ], + q(4388) => [ + q(Mundat), + ], + q(4389) => [ + q(North Ambrym), + ], + q(4390) => [ + q(Mehinaku), + ], + q(4391) => [ + q(Musar), + ], + q(4392) => [ + q(Majhwar), + ], + q(4393) => [ + q(Mukha-Dora), + ], + q(4394) => [ + q(Man Met), + ], + q(4395) => [ + q(Maii), + ], + q(4396) => [ + q(Mamanwa), + ], + q(4397) => [ + q(Mangga Buang), + ], + q(4398) => [ + q(Siawi), + ], + q(4399) => [ + q(Musak), + ], + q(4400) => [ + q(Western Xiangxi Miao), + ], + q(4401) => [ + q(Malalamai), + ], + q(4402) => [ + q(Mmaala), + ], + q(4403) => [ + q(Miriti), + ], + q(4404) => [ + q(Emae), + ], + q(4405) => [ + q(Madak), + ], + q(4406) => [ + q(Migaama), + ], + q(4407) => [ + q(Mabaale), + ], + q(4408) => [ + q(Mbula), + ], + q(4409) => [ + q(Muna), + ], + q(4410) => [ + q(Monde), + ], + q(4411) => [ + q(Naba), + ], + q(4412) => [ + q(Mundani), + ], + q(4413) => [ + q(Eastern Mnong), + ], + q(4414) => [ + q(Mono (Democratic Republic of Congo)), + ], + q(4415) => [ + q(Munji), + ], + q(4416) => [ + q(Mandinka), + ], + q(4417) => [ + q(Tiale), + ], + q(4418) => [ + q(Mapena), + ], + q(4419) => [ + q(Southern Mnong), + ], + q(4420) => [ + q(Min Bei Chinese), + ], + q(4421) => [ + q(Minriq), + ], + q(4422) => [ + q(Mono (USA)), + ], + q(4423) => [ + q(Mansi), + ], + q(4424) => [ + q(Mer), + ], + q(4425) => [ + q(Rennell-Bellona), + ], + q(4426) => [ + q(Mon), + ], + q(4427) => [ + q(Manikion), + ], + q(4428) => [ + q(Manyawa), + ], + q(4429) => [ + q(Moni), + ], + q(4430) => [ + q(Mwan), + ], + q(4431) => [ + q(Mocovi), + ], + q(4432) => [ + q(Mobilian), + ], + q(4433) => [ + q(Montagnais), + ], + q(4434) => [ + q(Mongondow), + ], + q(4435) => [ + q(Mboi), + ], + q(4436) => [ + q(Monzombo), + ], + q(4437) => [ + q(Morori), + ], + q(4438) => [ + q(Mangue), + ], + q(4439) => [ + q(Monom), + ], + q(4440) => [ + q(Mopan Maya), + ], + q(4441) => [ + q(Mor (Bomberai Peninsula)), + ], + q(4442) => [ + q(Moro), + ], + q(4443) => [ + q(Mogum), + ], + q(4444) => [ + q(Mohave), + ], + q(4445) => [ + q(Moi (Congo)), + ], + q(4446) => [ + q(Molima), + ], + q(4447) => [ + q(Shekkacho), + ], + q(4448) => [ + q(Mukulu), + q(Gergiko), + ], + q(4449) => [ + q(Mpoto), + ], + q(4450) => [ + q(Mullukmulluk), + ], + q(4451) => [ + q(Mangarayi), + ], + q(4452) => [ + q(Machinere), + ], + q(4453) => [ + q(Majang), + ], + q(4454) => [ + q(Marba), + ], + q(4455) => [ + q(Maung), + ], + q(4456) => [ + q(Mpade), + ], + q(4457) => [ + q(Martu Wangka), + ], + q(4458) => [ + q(Mbara (Chad)), + ], + q(4459) => [ + q(Middle Watut), + ], + q(4460) => [ + q(Yosondua Mixtec), + ], + q(4461) => [ + q(Mindiri), + ], + q(4462) => [ + q(Miu), + ], + q(4463) => [ + q(Migabac), + ], + q(4464) => [ + q(Matis), + ], + q(4465) => [ + q(Vangunu), + ], + q(4466) => [ + q(Dadibi), + ], + q(4467) => [ + q(Mian), + ], + q(4468) => [ + q(Makurap), + ], + q(4469) => [ + q(Mungkip), + ], + q(4470) => [ + q(Mapidian), + ], + q(4471) => [ + q(Misima-Panaeati), + ], + q(4472) => [ + q(Mapia), + ], + q(4473) => [ + q(Mpi), + ], + q(4474) => [ + q(Maba (Indonesia)), + ], + q(4475) => [ + q(Mbuko), + ], + q(4476) => [ + q(Mangole), + ], + q(4477) => [ + q(Matepi), + ], + q(4478) => [ + q(Momuna), + ], + q(4479) => [ + q(Kota Bangun Kutai Malay), + ], + q(4480) => [ + q(Tlazoyaltepec Mixtec), + ], + q(4481) => [ + q(Mariri), + ], + q(4482) => [ + q(Mamasa), + ], + q(4483) => [ + q(Rajah Kabunsuwan Manobo), + ], + q(4484) => [ + q(Mbelime), + ], + q(4485) => [ + q(South Marquesan), + ], + q(4486) => [ + q(Moronene), + ], + q(4487) => [ + q(Modole), + ], + q(4488) => [ + q(Manipa), + ], + q(4489) => [ + q(Minokok), + ], + q(4490) => [ + q(Mander), + ], + q(4491) => [ + q(West Makian), + ], + q(4492) => [ + q(Mok), + ], + q(4493) => [ + q(Mandari), + ], + q(4494) => [ + q(Mosimo), + ], + q(4495) => [ + q(Murupi), + ], + q(4496) => [ + q(Mamuju), + ], + q(4497) => [ + q(Manggarai), + ], + q(4498) => [ + q(Pano), + ], + q(4499) => [ + q(Mlabri), + ], + q(4500) => [ + q(Marino), + ], + q(4501) => [ + q(Maricopa), + ], + q(4502) => [ + q(Western Magar), + ], + q(4503) => [ + q(Martha's Vineyard Sign Language), + ], + q(4504) => [ + q(Elseng), + ], + q(4505) => [ + q(Mising), + ], + q(4506) => [ + q(Mara Chin), + ], + q(4507) => [ + q(Western Mari), + ], + q(4508) => [ + q(Hmwaveke), + ], + q(4509) => [ + q(Mortlockese), + ], + q(4510) => [ + q(Merlav), + q(Mwerlap), + ], + q(4511) => [ + q(Cheke Holo), + ], + q(4512) => [ + q(Mru), + ], + q(4513) => [ + q(Morouas), + ], + q(4514) => [ + q(North Marquesan), + ], + q(4515) => [ + q(Maria (India)), + ], + q(4516) => [ + q(Maragus), + ], + q(4517) => [ + q(Marghi Central), + ], + q(4518) => [ + q(Mono (Cameroon)), + ], + q(4519) => [ + q(Mangareva), + ], + q(4520) => [ + q(Maranao), + ], + q(4521) => [ + q(Maremgi), + q(Dineor), + ], + q(4522) => [ + q(Mandaya), + ], + q(4523) => [ + q(Marind), + ], + q(4524) => [ + q(Masbatenyo), + ], + q(4525) => [ + q(Sankaran Maninka), + ], + q(4526) => [ + q(Yucatec Maya Sign Language), + ], + q(4527) => [ + q(Musey), + ], + q(4528) => [ + q(Mekwei), + ], + q(4529) => [ + q(Moraid), + ], + q(4530) => [ + q(Masikoro Malagasy), + ], + q(4531) => [ + q(Sabah Malay), + ], + q(4532) => [ + q(Ma (Democratic Republic of Congo)), + ], + q(4533) => [ + q(Mansaka), + ], + q(4534) => [ + q(Molof), + q(Poule), + ], + q(4535) => [ + q(Agusan Manobo), + ], + q(4536) => [ + q(Vures), + ], + q(4537) => [ + q(Mombum), + ], + q(4538) => [ + q(Maritsaua), + ], + q(4539) => [ + q(Caac), + ], + q(4540) => [ + q(Mongolian Sign Language), + ], + q(4541) => [ + q(West Masela), + ], + q(4542) => [ + q(Musom), + ], + q(4543) => [ + q(Maslam), + ], + q(4544) => [ + q(Mansoanka), + ], + q(4545) => [ + q(Moresada), + ], + q(4546) => [ + q(Aruamu), + ], + q(4547) => [ + q(Momare), + ], + q(4548) => [ + q(Cotabato Manobo), + ], + q(4549) => [ + q(Anyin Morofo), + ], + q(4550) => [ + q(Munit), + ], + q(4551) => [ + q(Mualang), + ], + q(4552) => [ + q(Mono (Solomon Islands)), + ], + q(4553) => [ + q(Murik (Papua New Guinea)), + ], + q(4554) => [ + q(Una), + ], + q(4555) => [ + q(Munggui), + ], + q(4556) => [ + q(Maiwa (Papua New Guinea)), + ], + q(4557) => [ + q(Moskona), + ], + q(4558) => [ + q(Mbe'), + ], + q(4559) => [ + q(Montol), + ], + q(4560) => [ + q(Mator), + ], + q(4561) => [ + q(Matagalpa), + ], + q(4562) => [ + q(Totontepec Mixe), + ], + q(4563) => [ + q(Wichi Lhamtes Nocten), + ], + q(4564) => [ + q(Muong), + ], + q(4565) => [ + q(Mewari), + ], + q(4566) => [ + q(Yora), + ], + q(4567) => [ + q(Mota), + ], + q(4568) => [ + q(Tututepec Mixtec), + ], + q(4569) => [ + q(Asaro'o), + ], + q(4570) => [ + q(Southern Binukidnon), + ], + q(4571) => [ + q(Tidaa Mixtec), + ], + q(4572) => [ + q(Nabi), + ], + q(4573) => [ + q(Mundang), + ], + q(4574) => [ + q(Mubi), + ], + q(4575) => [ + q(Ajumbu), + ], + q(4576) => [ + q(Mednyj Aleut), + ], + q(4577) => [ + q(Media Lengua), + ], + q(4578) => [ + q(Musgu), + ], + q(4579) => [ + q(Mundu), + ], + q(4580) => [ + q(Musi), + ], + q(4581) => [ + q(Mabire), + ], + q(4582) => [ + q(Mugom), + ], + q(4583) => [ + q(Maiwala), + ], + q(4584) => [ + q(Nyong), + ], + q(4585) => [ + q(Malvi), + ], + q(4586) => [ + q(Eastern Xiangxi Miao), + ], + q(4587) => [ + q(Murle), + ], + q(4588) => [ + q(Western Muria), + ], + q(4589) => [ + q(Yaaku), + ], + q(4590) => [ + q(Muthuvan), + ], + q(4591) => [ + q(Bo-Ung), + ], + q(4592) => [ + q(Muyang), + ], + q(4593) => [ + q(Mursi), + ], + q(4594) => [ + q(Manam), + ], + q(4595) => [ + q(Mattole), + ], + q(4596) => [ + q(Mamboru), + ], + q(4597) => [ + q(Marwari (Pakistan)), + ], + q(4598) => [ + q(Peripheral Mongolian), + ], + q(4599) => [ + q(Yucuane Mixtec), + ], + q(4600) => [ + q(Mulgi), + ], + q(4601) => [ + q(Miyako), + ], + q(4602) => [ + q(Mekmek), + ], + q(4603) => [ + q(Mbara (Australia)), + ], + q(4604) => [ + q(Muya), + ], + q(4605) => [ + q(Minaveha), + ], + q(4606) => [ + q(Marovo), + ], + q(4607) => [ + q(Duri), + ], + q(4608) => [ + q(Moere), + ], + q(4609) => [ + q(Marau), + ], + q(4610) => [ + q(Massep), + ], + q(4611) => [ + q(Mpotovoro), + ], + q(4612) => [ + q(Marfa), + ], + q(4613) => [ + q(Tagal Murut), + ], + q(4614) => [ + q(Machinga), + ], + q(4615) => [ + q(Meoswar), + ], + q(4616) => [ + q(Indus Kohistani), + ], + q(4617) => [ + q(Mesqan), + ], + q(4618) => [ + q(Mwatebu), + ], + q(4619) => [ + q(Juwal), + ], + q(4620) => [ + q(Are), + ], + q(4621) => [ + q(Mwera (Chimwera)), + ], + q(4622) => [ + q(Murrinh-Patha), + ], + q(4623) => [ + q(Aiklep), + ], + q(4624) => [ + q(Mouk-Aria), + ], + q(4625) => [ + q(Labo), + q(Ninde), + ], + q(4626) => [ + q(Kita Maninkakan), + ], + q(4627) => [ + q(Sar), + ], + q(4628) => [ + q(Nyamwanga), + ], + q(4629) => [ + q(Central Maewo), + ], + q(4630) => [ + q(Kala Lagaw Ya), + ], + q(4631) => [ + q(Mun Chin), + ], + q(4632) => [ + q(Mwimbi-Muthambi), + ], + q(4633) => [ + q(Moken), + ], + q(4634) => [ + q(Mittu), + ], + q(4635) => [ + q(Mentawai), + ], + q(4636) => [ + q(Hmong Daw), + ], + q(4637) => [ + q(Mediak), + ], + q(4638) => [ + q(Mosiro), + ], + q(4639) => [ + q(Moingi), + ], + q(4640) => [ + q(Northwest Oaxaca Mixtec), + ], + q(4641) => [ + q(Tezoatlan Mixtec), + ], + q(4642) => [ + q(Manyika), + ], + q(4643) => [ + q(Modang), + ], + q(4644) => [ + q(Mele-Fila), + ], + q(4645) => [ + q(Malgbe), + ], + q(4646) => [ + q(Mbangala), + ], + q(4647) => [ + q(Mvuba), + ], + q(4648) => [ + q(Mozarabic), + ], + q(4649) => [ + q(Miju-Mishmi), + q(Geman Deng), + ], + q(4650) => [ + q(Monumbo), + ], + q(4651) => [ + q(Maxi Gbe), + ], + q(4652) => [ + q(Meramera), + ], + q(4653) => [ + q(Moi (Indonesia)), + ], + q(4654) => [ + q(Mbowe), + ], + q(4655) => [ + q(Tlahuitoltepec Mixe), + ], + q(4656) => [ + q(Juquila Mixe), + ], + q(4657) => [ + q(Murik (Malaysia)), + ], + q(4658) => [ + q(Huitepec Mixtec), + ], + q(4659) => [ + q(Jamiltepec Mixtec), + ], + q(4660) => [ + q(Mada (Cameroon)), + ], + q(4661) => [ + q(Metlatonoc Mixtec), + ], + q(4662) => [ + q(Namo), + ], + q(4663) => [ + q(Mahou), + q(Mawukakan), + ], + q(4664) => [ + q(Southeastern Nochixtlan Mixtec), + ], + q(4665) => [ + q(Central Masela), + ], + q(4666) => [ + q(Mbay), + ], + q(4667) => [ + q(Mayeka), + ], + q(4668) => [ + q(Maramba), + ], + q(4669) => [ + q(Myene), + ], + q(4670) => [ + q(Bambassi), + ], + q(4671) => [ + q(Manta), + ], + q(4672) => [ + q(Makah), + ], + q(4673) => [ + q(Mina (India)), + ], + q(4674) => [ + q(Mangayat), + ], + q(4675) => [ + q(Mamara Senoufo), + ], + q(4676) => [ + q(Moma), + ], + q(4677) => [ + q(Me'en), + ], + q(4678) => [ + q(Anfillo), + ], + q(4679) => [ + q(Piraha), + ], + q(4680) => [ + q(Muniche), + ], + q(4681) => [ + q(Mesmes), + ], + q(4682) => [ + q(Munduruku), + ], + q(4683) => [ + q(Muyuw), + ], + q(4684) => [ + q(Masaaba), + ], + q(4685) => [ + q(Macuna), + ], + q(4686) => [ + q(Classical Mandaic), + ], + q(4687) => [ + q(Santa Maria Zacatepec Mixtec), + ], + q(4688) => [ + q(Tumzabt), + ], + q(4689) => [ + q(Madagascar Sign Language), + ], + q(4690) => [ + q(Malimba), + ], + q(4691) => [ + q(Morawa), + ], + q(4692) => [ + q(Monastic Sign Language), + ], + q(4693) => [ + q(Wichi Lhamtes Guisnay), + ], + q(4694) => [ + q(Ixcatlan Mazatec), + ], + q(4695) => [ + q(Manya), + ], + q(4696) => [ + q(Nigeria Mambila), + ], + q(4697) => [ + q(Mazatlan Mixe), + ], + q(4698) => [ + q(Mumuye), + ], + q(4699) => [ + q(Mazanderani), + ], + q(4700) => [ + q(Matipuhy), + ], + q(4701) => [ + q(Movima), + ], + q(4702) => [ + q(Mori Atas), + ], + q(4703) => [ + q(Marubo), + ], + q(4704) => [ + q(Macanese), + ], + q(4705) => [ + q(Mintil), + ], + q(4706) => [ + q(Inapang), + ], + q(4707) => [ + q(Manza), + ], + q(4708) => [ + q(Deg), + ], + q(4709) => [ + q(Mawayana), + ], + q(4710) => [ + q(Mozambican Sign Language), + ], + q(4711) => [ + q(Maiadomu), + ], + q(4712) => [ + q(Namla), + ], + q(4713) => [ + q(Southern Nambikuara), + ], + q(4714) => [ + q(Narak), + ], + q(4715) => [ + q(Naka'ela), + ], + q(4716) => [ + q(Nabak), + ], + q(4717) => [ + q(Naga Pidgin), + ], + q(4718) => [ + q(Nalu), + ], + q(4719) => [ + q(Nakanai), + ], + q(4720) => [ + q(Nalik), + ], + q(4721) => [ + q(Ngan'gityemerri), + ], + q(4722) => [ + q(Min Nan Chinese), + ], + q(4723) => [ + q(Naaba), + ], + q(4724) => [ + q(Khoekhoe), + q(Nama (Namibia)), + ], + q(4725) => [ + q(Iguta), + ], + q(4726) => [ + q(Naasioi), + ], + q(4727) => [ + q(Cahungwarya), + q(Hungworo), + ], + q(4728) => [ + q(Nawuri), + ], + q(4729) => [ + q(Nakwi), + ], + q(4730) => [ + q(Narrinyeri), + ], + q(4731) => [ + q(Coatepec Nahuatl), + ], + q(4732) => [ + q(Nyemba), + ], + q(4733) => [ + q(Ndoe), + ], + q(4734) => [ + q(Chang Naga), + ], + q(4735) => [ + q(Ngbinda), + ], + q(4736) => [ + q(Konyak Naga), + ], + q(4737) => [ + q(Nagarchal), + ], + q(4738) => [ + q(Ngamo), + ], + q(4739) => [ + q(Mao Naga), + ], + q(4740) => [ + q(Ngarinman), + ], + q(4741) => [ + q(Nake), + ], + q(4742) => [ + q(Ngbaka Ma'bo), + ], + q(4743) => [ + q(Kuri), + ], + q(4744) => [ + q(Nkukoli), + ], + q(4745) => [ + q(Nnam), + ], + q(4746) => [ + q(Nggem), + ], + q(4747) => [ + q(Numana-Nunku-Gbantu-Numbu), + ], + q(4748) => [ + q(Namibian Sign Language), + ], + q(4749) => [ + q(Na), + ], + q(4750) => [ + q(Rongmei Naga), + ], + q(4751) => [ + q(Ngamambo), + ], + q(4752) => [ + q(Southern Ngbandi), + ], + q(4753) => [ + q(Ningera), + ], + q(4754) => [ + q(Iyo), + ], + q(4755) => [ + q(Central Nicobarese), + ], + q(4756) => [ + q(Ponam), + ], + q(4757) => [ + q(Nachering), + ], + q(4758) => [ + q(Yale), + ], + q(4759) => [ + q(Notsi), + ], + q(4760) => [ + q(Nisga'a), + ], + q(4761) => [ + q(Central Huasteca Nahuatl), + ], + q(4762) => [ + q(Classical Nahuatl), + ], + q(4763) => [ + q(Northern Puebla Nahuatl), + ], + q(4764) => [ + q(Nakara), + ], + q(4765) => [ + q(Michoacan Nahuatl), + ], + q(4766) => [ + q(Nambo), + ], + q(4767) => [ + q(Nauna), + ], + q(4768) => [ + q(Sibe), + ], + q(4769) => [ + q(Ndaktup), + ], + q(4770) => [ + q(Northern Katang), + ], + q(4771) => [ + q(Ncane), + ], + q(4772) => [ + q(Nicaraguan Sign Language), + ], + q(4773) => [ + q(Chothe Naga), + ], + q(4774) => [ + q(Chumburung), + ], + q(4775) => [ + q(Central Puebla Nahuatl), + ], + q(4776) => [ + q(Natchez), + ], + q(4777) => [ + q(Ndasa), + ], + q(4778) => [ + q(Kenswei Nsei), + ], + q(4779) => [ + q(Ndau), + ], + q(4780) => [ + q(Nde-Nsele-Nta), + ], + q(4781) => [ + q(Nadruvian), + ], + q(4782) => [ + q(Ndengereko), + ], + q(4783) => [ + q(Ndali), + ], + q(4784) => [ + q(Samba Leko), + ], + q(4785) => [ + q(Ndamba), + ], + q(4786) => [ + q(Ndaka), + ], + q(4787) => [ + q(Ndolo), + ], + q(4788) => [ + q(Ndam), + ], + q(4789) => [ + q(Ngundi), + ], + q(4790) => [ + q(Ndo), + ], + q(4791) => [ + q(Ndombe), + ], + q(4792) => [ + q(Ndoola), + ], + q(4793) => [ + q(Ndunga), + ], + q(4794) => [ + q(Dugun), + ], + q(4795) => [ + q(Ndut), + ], + q(4796) => [ + q(Ndobo), + ], + q(4797) => [ + q(Nduga), + ], + q(4798) => [ + q(Lutos), + ], + q(4799) => [ + q(Ndogo), + ], + q(4800) => [ + q(Eastern Ngad'a), + ], + q(4801) => [ + q(Toura (Cote d'Ivoire)), + ], + q(4802) => [ + q(Nedebang), + ], + q(4803) => [ + q(Nde-Gbite), + ], + q(4804) => [ + q(Nelemwa-Nixumwak), + ], + q(4805) => [ + q(Nefamese), + ], + q(4806) => [ + q(Negidal), + ], + q(4807) => [ + q(Nyenkha), + ], + q(4808) => [ + q(Neo-Hittite), + ], + q(4809) => [ + q(Neko), + ], + q(4810) => [ + q(Neku), + ], + q(4811) => [ + q(Nemi), + ], + q(4812) => [ + q(Nengone), + ], + q(4813) => [ + q(Na-Meo), + ], + q(4814) => [ + q(North Central Mixe), + ], + q(4815) => [ + q(Yahadian), + ], + q(4816) => [ + q(Bhoti Kinnauri), + ], + q(4817) => [ + q(Nete), + ], + q(4818) => [ + q(Neo), + ], + q(4819) => [ + q(Nyaheun), + ], + q(4820) => [ + q(Neme), + ], + q(4821) => [ + q(Neyo), + ], + q(4822) => [ + q(Nez Perce), + ], + q(4823) => [ + q(Dhao), + ], + q(4824) => [ + q(Ahwai), + ], + q(4825) => [ + q(Ayiwo), + q(Aiwoo), + ], + q(4826) => [ + q(Nafaanra), + ], + q(4827) => [ + q(Mfumte), + ], + q(4828) => [ + q(Ngbaka), + ], + q(4829) => [ + q(Northern Ngbandi), + ], + q(4830) => [ + q(Ngombe (Democratic Republic of Congo)), + ], + q(4831) => [ + q(Ngando (Central African Republic)), + ], + q(4832) => [ + q(Ngemba), + ], + q(4833) => [ + q(Ngbaka Manza), + ], + q(4834) => [ + q(N/u), + q(Nu), + ], + q(4835) => [ + q(Ngizim), + ], + q(4836) => [ + q(Ngie), + ], + q(4837) => [ + q(Dalabon), + ], + q(4838) => [ + q(Lomwe), + ], + q(4839) => [ + q(Ngatik Men's Creole), + ], + q(4840) => [ + q(Ngwo), + ], + q(4841) => [ + q(Ngoni), + ], + q(4842) => [ + q(Ngulu), + ], + q(4843) => [ + q(Ngurimi), + q(Ngoreme), + ], + q(4844) => [ + q(Engdewu), + ], + q(4845) => [ + q(Gvoko), + ], + q(4846) => [ + q(Kriang), + q(Ngeq), + ], + q(4847) => [ + q(Guerrero Nahuatl), + ], + q(4848) => [ + q(Nagumi), + ], + q(4849) => [ + q(Ngwaba), + ], + q(4850) => [ + q(Nggwahyi), + ], + q(4851) => [ + q(Tibea), + ], + q(4852) => [ + q(Ngungwel), + ], + q(4853) => [ + q(Nhanda), + ], + q(4854) => [ + q(Beng), + ], + q(4855) => [ + q(Tabasco Nahuatl), + ], + q(4856) => [ + q(Chiripa), + q(Ava Guarani), + ], + q(4857) => [ + q(Eastern Huasteca Nahuatl), + ], + q(4858) => [ + q(Nhuwala), + ], + q(4859) => [ + q(Tetelcingo Nahuatl), + ], + q(4860) => [ + q(Nahari), + ], + q(4861) => [ + q(Zacatlan-Ahuacatlan-Tepetzintla Nahuatl), + ], + q(4862) => [ + q(Isthmus-Cosoleacaque Nahuatl), + ], + q(4863) => [ + q(Morelos Nahuatl), + ], + q(4864) => [ + q(Central Nahuatl), + ], + q(4865) => [ + q(Takuu), + ], + q(4866) => [ + q(Isthmus-Pajapan Nahuatl), + ], + q(4867) => [ + q(Huaxcaleca Nahuatl), + ], + q(4868) => [ + q(Naro), + ], + q(4869) => [ + q(Ometepec Nahuatl), + ], + q(4870) => [ + q(Noone), + ], + q(4871) => [ + q(Temascaltepec Nahuatl), + ], + q(4872) => [ + q(Western Huasteca Nahuatl), + ], + q(4873) => [ + q(Isthmus-Mecayapan Nahuatl), + ], + q(4874) => [ + q(Northern Oaxaca Nahuatl), + ], + q(4875) => [ + q(Santa Maria La Alta Nahuatl), + ], + q(4876) => [ + q(Nakame), + ], + q(4877) => [ + q(Ngandi), + ], + q(4878) => [ + q(Niellim), + ], + q(4879) => [ + q(Nek), + ], + q(4880) => [ + q(Ngalakan), + ], + q(4881) => [ + q(Nyiha (Tanzania)), + ], + q(4882) => [ + q(Nii), + ], + q(4883) => [ + q(Ngaju), + ], + q(4884) => [ + q(Southern Nicobarese), + ], + q(4885) => [ + q(Nila), + ], + q(4886) => [ + q(Nilamba), + ], + q(4887) => [ + q(Ninzo), + ], + q(4888) => [ + q(Nganasan), + ], + q(4889) => [ + q(Nandi), + ], + q(4890) => [ + q(Nimboran), + ], + q(4891) => [ + q(Nimi), + ], + q(4892) => [ + q(Southeastern Kolami), + ], + q(4893) => [ + q(Gilyak), + ], + q(4894) => [ + q(Nimo), + ], + q(4895) => [ + q(Hema), + ], + q(4896) => [ + q(Ngiti), + ], + q(4897) => [ + q(Ningil), + ], + q(4898) => [ + q(Nzanyi), + ], + q(4899) => [ + q(Nocte Naga), + ], + q(4900) => [ + q(Ndonde Hamba), + ], + q(4901) => [ + q(Lotha Naga), + ], + q(4902) => [ + q(Gudanji), + ], + q(4903) => [ + q(Njen), + ], + q(4904) => [ + q(Njalgulgule), + ], + q(4905) => [ + q(Angami Naga), + ], + q(4906) => [ + q(Liangmai Naga), + ], + q(4907) => [ + q(Ao Naga), + ], + q(4908) => [ + q(Njerep), + ], + q(4909) => [ + q(Nisa), + ], + q(4910) => [ + q(Ndyuka-Trio Pidgin), + ], + q(4911) => [ + q(Ngadjunmaya), + ], + q(4912) => [ + q(Kunyi), + ], + q(4913) => [ + q(Njyem), + ], + q(4914) => [ + q(Nyishi), + ], + q(4915) => [ + q(Nkoya), + ], + q(4916) => [ + q(Khoibu Naga), + ], + q(4917) => [ + q(Nkongho), + ], + q(4918) => [ + q(Koireng), + ], + q(4919) => [ + q(Duke), + ], + q(4920) => [ + q(Inpui Naga), + ], + q(4921) => [ + q(Nekgini), + ], + q(4922) => [ + q(Khezha Naga), + ], + q(4923) => [ + q(Thangal Naga), + ], + q(4924) => [ + q(Nakai), + ], + q(4925) => [ + q(Nokuku), + ], + q(4926) => [ + q(Namat), + ], + q(4927) => [ + q(Nkangala), + ], + q(4928) => [ + q(Nkonya), + ], + q(4929) => [ + q(Niuatoputapu), + ], + q(4930) => [ + q(Nkami), + ], + q(4931) => [ + q(Nukuoro), + ], + q(4932) => [ + q(North Asmat), + ], + q(4933) => [ + q(Nyika (Tanzania)), + ], + q(4934) => [ + q(Bouna Kulango), + ], + q(4935) => [ + q(Nyika (Malawi and Zambia)), + ], + q(4936) => [ + q(Nkutu), + ], + q(4937) => [ + q(Nkoroo), + ], + q(4938) => [ + q(Nkari), + ], + q(4939) => [ + q(Ngombale), + ], + q(4940) => [ + q(Nalca), + ], + q(4941) => [ + q(East Nyala), + ], + q(4942) => [ + q(Gela), + ], + q(4943) => [ + q(Grangali), + ], + q(4944) => [ + q(Nyali), + ], + q(4945) => [ + q(Ninia Yali), + ], + q(4946) => [ + q(Nihali), + ], + q(4947) => [ + q(Ngul), + ], + q(4948) => [ + q(Lao Naga), + ], + q(4949) => [ + q(Nchumbulu), + ], + q(4950) => [ + q(Orizaba Nahuatl), + ], + q(4951) => [ + q(Walangama), + ], + q(4952) => [ + q(Nahali), + ], + q(4953) => [ + q(Nyamal), + ], + q(4954) => [ + q(Nalogo), + ], + q(4955) => [ + q(Maram Naga), + ], + q(4956) => [ + q(Big Nambas), + q(V'enen Taut), + ], + q(4957) => [ + q(Ngam), + ], + q(4958) => [ + q(Ndumu), + ], + q(4959) => [ + q(Mzieme Naga), + ], + q(4960) => [ + q(Tangkhul Naga (India)), + ], + q(4961) => [ + q(Kwasio), + ], + q(4962) => [ + q(Monsang Naga), + ], + q(4963) => [ + q(Nyam), + ], + q(4964) => [ + q(Ngombe (Central African Republic)), + ], + q(4965) => [ + q(Namakura), + ], + q(4966) => [ + q(Ndemli), + ], + q(4967) => [ + q(Manangba), + ], + q(4968) => [ + q(!Xoo), + q(Xoo), + ], + q(4969) => [ + q(Moyon Naga), + ], + q(4970) => [ + q(Nimanbur), + ], + q(4971) => [ + q(Nambya), + ], + q(4972) => [ + q(Nimbari), + ], + q(4973) => [ + q(Letemboi), + ], + q(4974) => [ + q(Namonuito), + ], + q(4975) => [ + q(Northeast Maidu), + ], + q(4976) => [ + q(Ngamini), + ], + q(4977) => [ + q(Nimoa), + q(Rifao), + ], + q(4978) => [ + q(Nama (Papua New Guinea)), + ], + q(4979) => [ + q(Namuyi), + ], + q(4980) => [ + q(Nawdm), + ], + q(4981) => [ + q(Nyangumarta), + ], + q(4982) => [ + q(Nande), + ], + q(4983) => [ + q(Nancere), + ], + q(4984) => [ + q(West Ambae), + ], + q(4985) => [ + q(Ngandyera), + ], + q(4986) => [ + q(Ngaing), + ], + q(4987) => [ + q(Maring Naga), + ], + q(4988) => [ + q(Ngiemboon), + ], + q(4989) => [ + q(North Nuaulu), + ], + q(4990) => [ + q(Nyangatom), + ], + q(4991) => [ + q(Nankina), + ], + q(4992) => [ + q(Northern Rengma Naga), + ], + q(4993) => [ + q(Namia), + ], + q(4994) => [ + q(Ngete), + ], + q(4995) => [ + q(Wancho Naga), + ], + q(4996) => [ + q(Ngindo), + ], + q(4997) => [ + q(Narungga), + ], + q(4998) => [ + q(Ningye), + ], + q(4999) => [ + q(Nanticoke), + ], + q(5000) => [ + q(Dwang), + ], + q(5001) => [ + q(Nugunu (Australia)), + ], + q(5002) => [ + q(Southern Nuni), + ], + q(5003) => [ + q(Nyangga), + ], + q(5004) => [ + q(Nda'nda'), + ], + q(5005) => [ + q(Woun Meu), + ], + q(5006) => [ + q(Nuk), + ], + q(5007) => [ + q(Northern Thai), + ], + q(5008) => [ + q(Nimadi), + ], + q(5009) => [ + q(Nomane), + ], + q(5010) => [ + q(Nomu), + ], + q(5011) => [ + q(Noiri), + ], + q(5012) => [ + q(Nonuya), + ], + q(5013) => [ + q(Nooksack), + ], + q(5014) => [ + q(Nomlaki), + ], + q(5015) => [ + q(Nocaman), + ], + q(5016) => [ + q(Numanggang), + ], + q(5017) => [ + q(Ngongo), + ], + q(5018) => [ + q(Eastern Nisu), + ], + q(5019) => [ + q(Nomatsiguenga), + ], + q(5020) => [ + q(Ewage-Notu), + ], + q(5021) => [ + q(Novial), + ], + q(5022) => [ + q(Nyambo), + ], + q(5023) => [ + q(Noy), + ], + q(5024) => [ + q(Nayi), + ], + q(5025) => [ + q(Nar Phu), + ], + q(5026) => [ + q(Nupbikha), + ], + q(5027) => [ + q(Ponyo-Gongwang Naga), + ], + q(5028) => [ + q(Phom Naga), + ], + q(5029) => [ + q(Nepali (individual language)), + ], + q(5030) => [ + q(Southeastern Puebla Nahuatl), + ], + q(5031) => [ + q(Mondropolon), + ], + q(5032) => [ + q(Pochuri Naga), + ], + q(5033) => [ + q(Nipsan), + ], + q(5034) => [ + q(Puimei Naga), + ], + q(5035) => [ + q(Noipx), + ], + q(5036) => [ + q(Napu), + ], + q(5037) => [ + q(Southern Nago), + ], + q(5038) => [ + q(Kura Ede Nago), + ], + q(5039) => [ + q(Ngendelengo), + ], + q(5040) => [ + q(Ndom), + ], + q(5041) => [ + q(Nen), + ], + q(5042) => [ + q(Kyan-Karyaw Naga), + ], + q(5043) => [ + q(Akyaung Ari Naga), + ], + q(5044) => [ + q(Ngom), + ], + q(5045) => [ + q(Nara), + ], + q(5046) => [ + q(Noric), + ], + q(5047) => [ + q(Southern Rengma Naga), + ], + q(5048) => [ + q(Jerriais), + q(Guernesiais), + ], + q(5049) => [ + q(Narango), + ], + q(5050) => [ + q(Chokri Naga), + ], + q(5051) => [ + q(Ngarla), + ], + q(5052) => [ + q(Ngarluma), + ], + q(5053) => [ + q(Narom), + ], + q(5054) => [ + q(Norn), + ], + q(5055) => [ + q(North Picene), + ], + q(5056) => [ + q(Norra), + q(Nora), + ], + q(5057) => [ + q(Northern Kalapuya), + ], + q(5058) => [ + q(Narua), + ], + q(5059) => [ + q(Ngurmbur), + ], + q(5060) => [ + q(Lala), + ], + q(5061) => [ + q(Sangtam Naga), + ], + q(5062) => [ + q(Nshi), + ], + q(5063) => [ + q(Southern Nisu), + ], + q(5064) => [ + q(Nsenga), + ], + q(5065) => [ + q(Northwestern Nisu), + ], + q(5066) => [ + q(Ngasa), + ], + q(5067) => [ + q(Ngoshie), + ], + q(5068) => [ + q(Nigerian Sign Language), + ], + q(5069) => [ + q(Naskapi), + ], + q(5070) => [ + q(Norwegian Sign Language), + ], + q(5071) => [ + q(Sumi Naga), + ], + q(5072) => [ + q(Nehan), + ], + q(5073) => [ + q(Nepalese Sign Language), + ], + q(5074) => [ + q(Northern Sierra Miwok), + ], + q(5075) => [ + q(Maritime Sign Language), + ], + q(5076) => [ + q(Nali), + ], + q(5077) => [ + q(Tase Naga), + ], + q(5078) => [ + q(Sierra Negra Nahuatl), + ], + q(5079) => [ + q(Southwestern Nisu), + ], + q(5080) => [ + q(Navut), + ], + q(5081) => [ + q(Nsongo), + ], + q(5082) => [ + q(Nasal), + ], + q(5083) => [ + q(Nisenan), + ], + q(5084) => [ + q(Northern Tidung), + ], + q(5085) => [ + q(Nathembo), + ], + q(5086) => [ + q(Ngantangarra), + ], + q(5087) => [ + q(Natioro), + ], + q(5088) => [ + q(Ngaanyatjarra), + ], + q(5089) => [ + q(Ikoma-Nata-Isenye), + ], + q(5090) => [ + q(Nateni), + ], + q(5091) => [ + q(Ntomba), + ], + q(5092) => [ + q(Northern Tepehuan), + ], + q(5093) => [ + q(Delo), + ], + q(5094) => [ + q(Natugu), + ], + q(5095) => [ + q(Nottoway), + ], + q(5096) => [ + q(Tangkhul Naga (Myanmar)), + ], + q(5097) => [ + q(Mantsi), + ], + q(5098) => [ + q(Natanzi), + ], + q(5099) => [ + q(Yuanga), + ], + q(5100) => [ + q(Nukuini), + ], + q(5101) => [ + q(Ngala), + ], + q(5102) => [ + q(Ngundu), + ], + q(5103) => [ + q(Nusu), + ], + q(5104) => [ + q(Nungali), + ], + q(5105) => [ + q(Ndunda), + ], + q(5106) => [ + q(Ngumbi), + ], + q(5107) => [ + q(Nyole), + ], + q(5108) => [ + q(Nuu-chah-nulth), + q(Nuuchahnulth), + ], + q(5109) => [ + q(Nusa Laut), + ], + q(5110) => [ + q(Niuafo'ou), + ], + q(5111) => [ + q(Anong), + ], + q(5112) => [ + q(Nguon), + ], + q(5113) => [ + q(Nupe-Nupe-Tako), + ], + q(5114) => [ + q(Nukumanu), + ], + q(5115) => [ + q(Nukuria), + ], + q(5116) => [ + q(Nuer), + ], + q(5117) => [ + q(Nung (Viet Nam)), + ], + q(5118) => [ + q(Ngbundu), + ], + q(5119) => [ + q(Northern Nuni), + ], + q(5120) => [ + q(Nguluwan), + ], + q(5121) => [ + q(Mehek), + ], + q(5122) => [ + q(Nunggubuyu), + ], + q(5123) => [ + q(Tlamacazapa Nahuatl), + ], + q(5124) => [ + q(Nasarian), + ], + q(5125) => [ + q(Namiae), + ], + q(5126) => [ + q(Nyokon), + ], + q(5127) => [ + q(Nawathinehena), + ], + q(5128) => [ + q(Nyabwa), + ], + q(5129) => [ + q(Ngwe), + ], + q(5130) => [ + q(Ngayawung), + ], + q(5131) => [ + q(Southwest Tanna), + ], + q(5132) => [ + q(Nyamusa-Molo), + ], + q(5133) => [ + q(Nauo), + ], + q(5134) => [ + q(Nawaru), + ], + q(5135) => [ + q(Middle Newar), + ], + q(5136) => [ + q(Nottoway-Meherrin), + ], + q(5137) => [ + q(Nauete), + ], + q(5138) => [ + q(Ngando (Democratic Republic of Congo)), + ], + q(5139) => [ + q(Nage), + ], + q(5140) => [ + q(Ngad'a), + ], + q(5141) => [ + q(Nindi), + ], + q(5142) => [ + q(Koki Naga), + ], + q(5143) => [ + q(South Nuaulu), + ], + q(5144) => [ + q(Numidian), + ], + q(5145) => [ + q(Ngawun), + ], + q(5146) => [ + q(Ndambomo), + ], + q(5147) => [ + q(Naxi), + ], + q(5148) => [ + q(Ninggerum), + ], + q(5149) => [ + q(Narau), + ], + q(5150) => [ + q(Nafri), + ], + q(5151) => [ + q(Nyangbo), + ], + q(5152) => [ + q(Nyanga-li), + ], + q(5153) => [ + q(Nyore), + q(Olunyole), + ], + q(5154) => [ + q(Nyengo), + ], + q(5155) => [ + q(Giryama), + q(Kigiryama), + ], + q(5156) => [ + q(Nyindu), + ], + q(5157) => [ + q(Nyigina), + ], + q(5158) => [ + q(Ama (Sudan)), + ], + q(5159) => [ + q(Nyanga), + ], + q(5160) => [ + q(Nyaneka), + ], + q(5161) => [ + q(Nyeu), + ], + q(5162) => [ + q(Nyang'i), + ], + q(5163) => [ + q(Nayini), + ], + q(5164) => [ + q(Nyiha (Malawi)), + ], + q(5165) => [ + q(Nyunga), + ], + q(5166) => [ + q(Nyawaygi), + ], + q(5167) => [ + q(Nyungwe), + ], + q(5168) => [ + q(Nyulnyul), + ], + q(5169) => [ + q(Nyaw), + ], + q(5170) => [ + q(Nganyaywana), + ], + q(5171) => [ + q(Nyakyusa-Ngonde), + ], + q(5172) => [ + q(Tigon Mbembe), + ], + q(5173) => [ + q(Njebi), + ], + q(5174) => [ + q(Nzakara), + ], + q(5175) => [ + q(Zeme Naga), + ], + q(5176) => [ + q(New Zealand Sign Language), + ], + q(5177) => [ + q(Teke-Nzikou), + ], + q(5178) => [ + q(Nzakambay), + ], + q(5179) => [ + q(Nanga Dama Dogon), + ], + q(5180) => [ + q(Orok), + ], + q(5181) => [ + q(Oroch), + ], + q(5182) => [ + q(Old Aramaic (up to 700 BCE)), + q(Ancient Aramaic (up to 700 BCE)), + ], + q(5183) => [ + q(Old Avar), + ], + q(5184) => [ + q(Obispeno), + ], + q(5185) => [ + q(Southern Bontok), + ], + q(5186) => [ + q(Oblo), + ], + q(5187) => [ + q(Moabite), + ], + q(5188) => [ + q(Obo Manobo), + ], + q(5189) => [ + q(Old Burmese), + ], + q(5190) => [ + q(Old Breton), + ], + q(5191) => [ + q(Obulom), + ], + q(5192) => [ + q(Ocaina), + ], + q(5193) => [ + q(Old Chinese), + ], + q(5194) => [ + q(Old Cornish), + ], + q(5195) => [ + q(Atzingo Matlatzinca), + ], + q(5196) => [ + q(Odut), + ], + q(5197) => [ + q(Od), + ], + q(5198) => [ + q(Old Dutch), + ], + q(5199) => [ + q(Odual), + ], + q(5200) => [ + q(Ofo), + ], + q(5201) => [ + q(Old Frisian), + ], + q(5202) => [ + q(Efutop), + ], + q(5203) => [ + q(Ogbia), + ], + q(5204) => [ + q(Ogbah), + ], + q(5205) => [ + q(Old Georgian), + ], + q(5206) => [ + q(Ogbogolo), + ], + q(5207) => [ + q(Khana), + ], + q(5208) => [ + q(Ogbronuagum), + ], + q(5209) => [ + q(Old Hittite), + ], + q(5210) => [ + q(Old Hungarian), + ], + q(5211) => [ + q(Oirata), + ], + q(5212) => [ + q(Inebu One), + ], + q(5213) => [ + q(Northwestern Ojibwa), + ], + q(5214) => [ + q(Central Ojibwa), + ], + q(5215) => [ + q(Eastern Ojibwa), + ], + q(5216) => [ + q(Old Japanese), + ], + q(5217) => [ + q(Severn Ojibwa), + ], + q(5218) => [ + q(Ontong Java), + ], + q(5219) => [ + q(Western Ojibwa), + ], + q(5220) => [ + q(Okanagan), + ], + q(5221) => [ + q(Okobo), + ], + q(5222) => [ + q(Okodia), + ], + q(5223) => [ + q(Okpe (Southwestern Edo)), + ], + q(5224) => [ + q(Koko Babangk), + ], + q(5225) => [ + q(Koresh-e Rostam), + ], + q(5226) => [ + q(Okiek), + ], + q(5227) => [ + q(Oko-Juwoi), + ], + q(5228) => [ + q(Kwamtim One), + ], + q(5229) => [ + q(Old Kentish Sign Language), + ], + q(5230) => [ + q(Middle Korean (10th-16th cent.)), + ], + q(5231) => [ + q(Oki-No-Erabu), + ], + q(5232) => [ + q(Old Korean (3rd-9th cent.)), + ], + q(5233) => [ + q(Kirike), + ], + q(5234) => [ + q(Oko-Eni-Osayen), + ], + q(5235) => [ + q(Oku), + ], + q(5236) => [ + q(Orokaiva), + ], + q(5237) => [ + q(Okpe (Northwestern Edo)), + ], + q(5238) => [ + q(Walungge), + ], + q(5239) => [ + q(Mochi), + ], + q(5240) => [ + q(Olekha), + ], + q(5241) => [ + q(Olkol), + ], + q(5242) => [ + q(Oloma), + ], + q(5243) => [ + q(Livvi), + ], + q(5244) => [ + q(Olrat), + ], + q(5245) => [ + q(Old Lithuanian), + ], + q(5246) => [ + q(Kuvale), + ], + q(5247) => [ + q(Omaha-Ponca), + ], + q(5248) => [ + q(East Ambae), + ], + q(5249) => [ + q(Mochica), + ], + q(5250) => [ + q(Omagua), + ], + q(5251) => [ + q(Omi), + ], + q(5252) => [ + q(Omok), + ], + q(5253) => [ + q(Ombo), + ], + q(5254) => [ + q(Minoan), + ], + q(5255) => [ + q(Utarmbung), + ], + q(5256) => [ + q(Old Manipuri), + ], + q(5257) => [ + q(Old Marathi), + ], + q(5258) => [ + q(Omotik), + ], + q(5259) => [ + q(Omurano), + ], + q(5260) => [ + q(South Tairora), + ], + q(5261) => [ + q(Old Mon), + ], + q(5262) => [ + q(Ona), + ], + q(5263) => [ + q(Lingao), + ], + q(5264) => [ + q(Oneida), + ], + q(5265) => [ + q(Olo), + ], + q(5266) => [ + q(Onin), + ], + q(5267) => [ + q(Onjob), + ], + q(5268) => [ + q(Kabore One), + ], + q(5269) => [ + q(Onobasulu), + ], + q(5270) => [ + q(Onondaga), + ], + q(5271) => [ + q(Sartang), + ], + q(5272) => [ + q(Northern One), + ], + q(5273) => [ + q(Ono), + ], + q(5274) => [ + q(Ontenu), + ], + q(5275) => [ + q(Unua), + ], + q(5276) => [ + q(Old Nubian), + ], + q(5277) => [ + q(Onin Based Pidgin), + ], + q(5278) => [ + q(Tohono O'odham), + ], + q(5279) => [ + q(Ong), + ], + q(5280) => [ + q(Onge), + ], + q(5281) => [ + q(Oorlams), + ], + q(5282) => [ + q(Old Ossetic), + ], + q(5283) => [ + q(Okpamheri), + ], + q(5284) => [ + q(Kopkaka), + ], + q(5285) => [ + q(Oksapmin), + ], + q(5286) => [ + q(Opao), + ], + q(5287) => [ + q(Opata), + ], + q(5288) => [ + q(Ofaye), + ], + q(5289) => [ + q(Oroha), + ], + q(5290) => [ + q(Orma), + ], + q(5291) => [ + q(Orejon), + ], + q(5292) => [ + q(Oring), + ], + q(5293) => [ + q(Oroqen), + ], + q(5294) => [ + q(Orang Kanaq), + ], + q(5295) => [ + q(Orokolo), + ], + q(5296) => [ + q(Oruma), + ], + q(5297) => [ + q(Orang Seletar), + ], + q(5298) => [ + q(Adivasi Oriya), + ], + q(5299) => [ + q(Ormuri), + ], + q(5300) => [ + q(Old Russian), + ], + q(5301) => [ + q(Oro Win), + ], + q(5302) => [ + q(Oro), + ], + q(5303) => [ + q(Odia (individual language)), + q(Oriya (individual language)), + ], + q(5304) => [ + q(Ormu), + ], + q(5305) => [ + q(Oscan), + ], + q(5306) => [ + q(Osing), + ], + q(5307) => [ + q(Ososo), + ], + q(5308) => [ + q(Old Spanish), + ], + q(5309) => [ + q(Osatu), + ], + q(5310) => [ + q(Southern One), + ], + q(5311) => [ + q(Old Saxon), + ], + q(5312) => [ + q(Old Tibetan), + ], + q(5313) => [ + q(Ot Danum), + ], + q(5314) => [ + q(Mezquital Otomi), + ], + q(5315) => [ + q(Oti), + ], + q(5316) => [ + q(Old Turkish), + ], + q(5317) => [ + q(Tilapa Otomi), + ], + q(5318) => [ + q(Eastern Highland Otomi), + ], + q(5319) => [ + q(Tenango Otomi), + ], + q(5320) => [ + q(Queretaro Otomi), + ], + q(5321) => [ + q(Otoro), + ], + q(5322) => [ + q(Estado de Mexico Otomi), + ], + q(5323) => [ + q(Temoaya Otomi), + ], + q(5324) => [ + q(Otuke), + ], + q(5325) => [ + q(Ottawa), + ], + q(5326) => [ + q(Texcatepec Otomi), + ], + q(5327) => [ + q(Old Tamil), + ], + q(5328) => [ + q(Ixtenco Otomi), + ], + q(5329) => [ + q(Tagargrent), + ], + q(5330) => [ + q(Glio-Oubi), + ], + q(5331) => [ + q(Oune), + ], + q(5332) => [ + q(Old Uighur), + ], + q(5333) => [ + q(Ouma), + ], + q(5334) => [ + q(Elfdalian), + q(Ovdalian), + ], + q(5335) => [ + q(Owiniga), + ], + q(5336) => [ + q(Old Welsh), + ], + q(5337) => [ + q(Oy), + ], + q(5338) => [ + q(Oyda), + ], + q(5339) => [ + q(Wayampi), + ], + q(5340) => [ + q(Oya'oya), + ], + q(5341) => [ + q(Koonzime), + ], + q(5342) => [ + q(Parecis), + ], + q(5343) => [ + q(Pacoh), + ], + q(5344) => [ + q(Paumari), + ], + q(5345) => [ + q(Pagibete), + ], + q(5346) => [ + q(Paranawat), + ], + q(5347) => [ + q(Tenharim), + ], + q(5348) => [ + q(Pe), + ], + q(5349) => [ + q(Parakana), + ], + q(5350) => [ + q(Northern Paiute), + ], + q(5351) => [ + q(Parya), + ], + q(5352) => [ + q(Panamint), + q(Timbisha), + ], + q(5353) => [ + q(Papasena), + ], + q(5354) => [ + q(Papitalai), + ], + q(5355) => [ + q(Pakaasnovos), + ], + q(5356) => [ + q(Pawnee), + ], + q(5357) => [ + q(Pankarare), + ], + q(5358) => [ + q(Pech), + ], + q(5359) => [ + q(Pankararu), + ], + q(5360) => [ + q(Paez), + ], + q(5361) => [ + q(Patamona), + ], + q(5362) => [ + q(Mezontla Popoloca), + ], + q(5363) => [ + q(Coyotepec Popoloca), + ], + q(5364) => [ + q(Paraujano), + ], + q(5365) => [ + q(E'napa Woromaipu), + ], + q(5366) => [ + q(Parkwa), + ], + q(5367) => [ + q(Mak (Nigeria)), + ], + q(5368) => [ + q(Kpasam), + ], + q(5369) => [ + q(Papel), + ], + q(5370) => [ + q(Badyara), + ], + q(5371) => [ + q(Pangwa), + ], + q(5372) => [ + q(Central Pame), + ], + q(5373) => [ + q(Southern Pashto), + ], + q(5374) => [ + q(Northern Pashto), + ], + q(5375) => [ + q(Pnar), + ], + q(5376) => [ + q(Pyu (Papua New Guinea)), + ], + q(5377) => [ + q(Santa Ines Ahuatempan Popoloca), + ], + q(5378) => [ + q(Pear), + ], + q(5379) => [ + q(Bouyei), + ], + q(5380) => [ + q(Picard), + ], + q(5381) => [ + q(Ruching Palaung), + ], + q(5382) => [ + q(Paliyan), + ], + q(5383) => [ + q(Paniya), + ], + q(5384) => [ + q(Pardhan), + ], + q(5385) => [ + q(Duruwa), + ], + q(5386) => [ + q(Parenga), + ], + q(5387) => [ + q(Paite Chin), + ], + q(5388) => [ + q(Pardhi), + ], + q(5389) => [ + q(Nigerian Pidgin), + ], + q(5390) => [ + q(Piti), + ], + q(5391) => [ + q(Pacahuara), + ], + q(5392) => [ + q(Pyapun), + ], + q(5393) => [ + q(Anam), + ], + q(5394) => [ + q(Pennsylvania German), + ], + q(5395) => [ + q(Pa Di), + ], + q(5396) => [ + q(Podena), + q(Fedan), + ], + q(5397) => [ + q(Padoe), + ], + q(5398) => [ + q(Plautdietsch), + ], + q(5399) => [ + q(Kayan), + ], + q(5400) => [ + q(Peranakan Indonesian), + ], + q(5401) => [ + q(Eastern Pomo), + ], + q(5402) => [ + q(Mala (Papua New Guinea)), + ], + q(5403) => [ + q(Taje), + ], + q(5404) => [ + q(Northeastern Pomo), + ], + q(5405) => [ + q(Pengo), + ], + q(5406) => [ + q(Bonan), + ], + q(5407) => [ + q(Chichimeca-Jonaz), + ], + q(5408) => [ + q(Northern Pomo), + ], + q(5409) => [ + q(Penchal), + ], + q(5410) => [ + q(Pekal), + ], + q(5411) => [ + q(Phende), + ], + q(5412) => [ + q(Kunja), + ], + q(5413) => [ + q(Southern Pomo), + ], + q(5414) => [ + q(Iranian Persian), + ], + q(5415) => [ + q(Pemono), + ], + q(5416) => [ + q(Petats), + ], + q(5417) => [ + q(Petjo), + ], + q(5418) => [ + q(Eastern Penan), + ], + q(5419) => [ + q(Paafang), + ], + q(5420) => [ + q(Peere), + ], + q(5421) => [ + q(Pfaelzisch), + ], + q(5422) => [ + q(Sudanese Creole Arabic), + ], + q(5423) => [ + q(Gandhari), + ], + q(5424) => [ + q(Pangwali), + ], + q(5425) => [ + q(Pagi), + ], + q(5426) => [ + q(Rerep), + ], + q(5427) => [ + q(Primitive Irish), + ], + q(5428) => [ + q(Paelignian), + ], + q(5429) => [ + q(Pangseng), + ], + q(5430) => [ + q(Pagu), + ], + q(5431) => [ + q(Papua New Guinean Sign Language), + ], + q(5432) => [ + q(Pa-Hng), + ], + q(5433) => [ + q(Phudagi), + ], + q(5434) => [ + q(Phuong), + ], + q(5435) => [ + q(Phukha), + ], + q(5436) => [ + q(Phake), + ], + q(5437) => [ + q(Phalura), + q(Palula), + ], + q(5438) => [ + q(Phimbi), + ], + q(5439) => [ + q(Phunoi), + ], + q(5440) => [ + q(Phana'), + ], + q(5441) => [ + q(Pahari-Potwari), + ], + q(5442) => [ + q(Phu Thai), + ], + q(5443) => [ + q(Phuan), + ], + q(5444) => [ + q(Pahlavani), + ], + q(5445) => [ + q(Phangduwali), + ], + q(5446) => [ + q(Pima Bajo), + ], + q(5447) => [ + q(Yine), + ], + q(5448) => [ + q(Pinji), + ], + q(5449) => [ + q(Piaroa), + ], + q(5450) => [ + q(Piro), + ], + q(5451) => [ + q(Pingelapese), + ], + q(5452) => [ + q(Pisabo), + ], + q(5453) => [ + q(Pitcairn-Norfolk), + ], + q(5454) => [ + q(Pini), + ], + q(5455) => [ + q(Pijao), + ], + q(5456) => [ + q(Yom), + ], + q(5457) => [ + q(Powhatan), + ], + q(5458) => [ + q(Piame), + ], + q(5459) => [ + q(Piapoco), + ], + q(5460) => [ + q(Pero), + ], + q(5461) => [ + q(Piratapuyo), + ], + q(5462) => [ + q(Pijin), + ], + q(5463) => [ + q(Pitta Pitta), + ], + q(5464) => [ + q(Pintupi-Luritja), + ], + q(5465) => [ + q(Pileni), + q(Vaeakau-Taumako), + ], + q(5466) => [ + q(Pimbwe), + ], + q(5467) => [ + q(Piu), + ], + q(5468) => [ + q(Piya-Kwonci), + ], + q(5469) => [ + q(Pije), + ], + q(5470) => [ + q(Pitjantjatjara), + ], + q(5471) => [ + q(Ardhamagadhi Prakrit), + ], + q(5472) => [ + q(Pokomo), + q(Kipfokomo), + ], + q(5473) => [ + q(Paekche), + ], + q(5474) => [ + q(Pak-Tong), + ], + q(5475) => [ + q(Pankhu), + ], + q(5476) => [ + q(Pakanha), + ], + q(5477) => [ + q(Pokoot), + ], + q(5478) => [ + q(Pukapuka), + ], + q(5479) => [ + q(Attapady Kurumba), + ], + q(5480) => [ + q(Pakistan Sign Language), + ], + q(5481) => [ + q(Maleng), + ], + q(5482) => [ + q(Paku), + ], + q(5483) => [ + q(Miani), + ], + q(5484) => [ + q(Polonombauk), + ], + q(5485) => [ + q(Central Palawano), + ], + q(5486) => [ + q(Polari), + ], + q(5487) => [ + q(Palu'e), + ], + q(5488) => [ + q(Pilaga), + ], + q(5489) => [ + q(Paulohi), + ], + q(5490) => [ + q(Polci), + ], + q(5491) => [ + q(Kohistani Shina), + ], + q(5492) => [ + q(Shwe Palaung), + ], + q(5493) => [ + q(Palenquero), + ], + q(5494) => [ + q(Oluta Popoluca), + ], + q(5495) => [ + q(Palpa), + ], + q(5496) => [ + q(Palaic), + ], + q(5497) => [ + q(Palaka Senoufo), + ], + q(5498) => [ + q(San Marcos Tlacoyalco Popoloca), + q(San Marcos Tlalcoyalco Popoloca), + ], + q(5499) => [ + q(Plateau Malagasy), + ], + q(5500) => [ + q(Palikur), + ], + q(5501) => [ + q(Southwest Palawano), + ], + q(5502) => [ + q(Brooke's Point Palawano), + ], + q(5503) => [ + q(Bolyu), + ], + q(5504) => [ + q(Paluan), + ], + q(5505) => [ + q(Paama), + ], + q(5506) => [ + q(Pambia), + ], + q(5507) => [ + q(Pallanganmiddang), + ], + q(5508) => [ + q(Pwaamei), + ], + q(5509) => [ + q(Pamona), + ], + q(5510) => [ + q(Maharastri Prakrit), + ], + q(5511) => [ + q(Northern Pumi), + ], + q(5512) => [ + q(Southern Pumi), + ], + q(5513) => [ + q(Pamlico), + ], + q(5514) => [ + q(Lingua Franca), + ], + q(5515) => [ + q(Pomo), + ], + q(5516) => [ + q(Pam), + ], + q(5517) => [ + q(Pom), + ], + q(5518) => [ + q(Northern Pame), + ], + q(5519) => [ + q(Paynamar), + ], + q(5520) => [ + q(Piemontese), + ], + q(5521) => [ + q(Tuamotuan), + ], + q(5522) => [ + q(Plains Miwok), + ], + q(5523) => [ + q(Poumei Naga), + ], + q(5524) => [ + q(Papuan Malay), + ], + q(5525) => [ + q(Southern Pame), + ], + q(5526) => [ + q(Punan Bah-Biau), + ], + q(5527) => [ + q(Western Panjabi), + ], + q(5528) => [ + q(Pannei), + ], + q(5529) => [ + q(Western Penan), + ], + q(5530) => [ + q(Pongu), + ], + q(5531) => [ + q(Penrhyn), + ], + q(5532) => [ + q(Aoheng), + ], + q(5533) => [ + q(Pinjarup), + ], + q(5534) => [ + q(Paunaka), + ], + q(5535) => [ + q(Paleni), + ], + q(5536) => [ + q(Punan Batu 1), + ], + q(5537) => [ + q(Pinai-Hagahai), + ], + q(5538) => [ + q(Panobo), + ], + q(5539) => [ + q(Pancana), + ], + q(5540) => [ + q(Pana (Burkina Faso)), + ], + q(5541) => [ + q(Panim), + ], + q(5542) => [ + q(Ponosakan), + ], + q(5543) => [ + q(Pontic), + ], + q(5544) => [ + q(Jiongnai Bunu), + ], + q(5545) => [ + q(Pinigura), + ], + q(5546) => [ + q(Panytyima), + ], + q(5547) => [ + q(Phong-Kniang), + ], + q(5548) => [ + q(Pinyin), + ], + q(5549) => [ + q(Pana (Central African Republic)), + ], + q(5550) => [ + q(Poqomam), + ], + q(5551) => [ + q(San Juan Atzingo Popoloca), + ], + q(5552) => [ + q(Poke), + ], + q(5553) => [ + q(Potiguara), + ], + q(5554) => [ + q(Poqomchi'), + ], + q(5555) => [ + q(Highland Popoluca), + ], + q(5556) => [ + q(Pokanga), + ], + q(5557) => [ + q(Southeastern Pomo), + ], + q(5558) => [ + q(Central Pomo), + ], + q(5559) => [ + q(Pwapwa), + ], + q(5560) => [ + q(Texistepec Popoluca), + ], + q(5561) => [ + q(Sayula Popoluca), + ], + q(5562) => [ + q(Potawatomi), + ], + q(5563) => [ + q(Upper Guinea Crioulo), + ], + q(5564) => [ + q(San Felipe Otlaltepec Popoloca), + ], + q(5565) => [ + q(Polabian), + ], + q(5566) => [ + q(Pogolo), + ], + q(5567) => [ + q(Papi), + ], + q(5568) => [ + q(Paipai), + ], + q(5569) => [ + q(Uma), + ], + q(5570) => [ + q(Pipil), + q(Nicarao), + ], + q(5571) => [ + q(Papuma), + ], + q(5572) => [ + q(Papapana), + ], + q(5573) => [ + q(Folopa), + ], + q(5574) => [ + q(Pelende), + ], + q(5575) => [ + q(Pei), + ], + q(5576) => [ + q(San Luis Temalacayuca Popoloca), + ], + q(5577) => [ + q(Pare), + ], + q(5578) => [ + q(Papora), + ], + q(5579) => [ + q(Pa'a), + ], + q(5580) => [ + q(Malecite-Passamaquoddy), + ], + q(5581) => [ + q(Parachi), + ], + q(5582) => [ + q(Parsi-Dari), + ], + q(5583) => [ + q(Principense), + ], + q(5584) => [ + q(Paranan), + ], + q(5585) => [ + q(Prussian), + ], + q(5586) => [ + q(Porohanon), + ], + q(5587) => [ + q(Paici), + ], + q(5588) => [ + q(Parauk), + ], + q(5589) => [ + q(Peruvian Sign Language), + ], + q(5590) => [ + q(Kibiri), + ], + q(5591) => [ + q(Prasuni), + ], + q(5592) => [ + q(Parsi), + ], + q(5593) => [ + q(Asheninka Perene), + ], + q(5594) => [ + q(Puri), + ], + q(5595) => [ + q(Dari), + q(Afghan Persian), + ], + q(5596) => [ + q(Phai), + ], + q(5597) => [ + q(Puragi), + ], + q(5598) => [ + q(Parawen), + ], + q(5599) => [ + q(Purik), + ], + q(5600) => [ + q(Providencia Sign Language), + ], + q(5601) => [ + q(Asue Awyu), + ], + q(5602) => [ + q(Persian Sign Language), + ], + q(5603) => [ + q(Plains Indian Sign Language), + ], + q(5604) => [ + q(Central Malay), + ], + q(5605) => [ + q(Penang Sign Language), + ], + q(5606) => [ + q(Southwest Pashai), + q(Southwest Pashayi), + ], + q(5607) => [ + q(Southeast Pashai), + q(Southeast Pashayi), + ], + q(5608) => [ + q(Puerto Rican Sign Language), + ], + q(5609) => [ + q(Pauserna), + ], + q(5610) => [ + q(Panasuan), + ], + q(5611) => [ + q(Polish Sign Language), + ], + q(5612) => [ + q(Philippine Sign Language), + ], + q(5613) => [ + q(Pasi), + ], + q(5614) => [ + q(Portuguese Sign Language), + ], + q(5615) => [ + q(Kaulong), + ], + q(5616) => [ + q(Central Pashto), + ], + q(5617) => [ + q(Sauraseni Prakrit), + ], + q(5618) => [ + q(Port Sandwich), + ], + q(5619) => [ + q(Piscataway), + ], + q(5620) => [ + q(Pai Tavytera), + ], + q(5621) => [ + q(Pataxo Ha-Ha-Hae), + ], + q(5622) => [ + q(Pintiini), + ], + q(5623) => [ + q(Patani), + ], + q(5624) => [ + q(Zo'e), + ], + q(5625) => [ + q(Patep), + ], + q(5626) => [ + q(Pattapu), + ], + q(5627) => [ + q(Piamatsina), + ], + q(5628) => [ + q(Enrekang), + ], + q(5629) => [ + q(Bambam), + ], + q(5630) => [ + q(Port Vato), + ], + q(5631) => [ + q(Pentlatch), + ], + q(5632) => [ + q(Pathiya), + ], + q(5633) => [ + q(Western Highland Purepecha), + ], + q(5634) => [ + q(Purum), + ], + q(5635) => [ + q(Punan Merap), + ], + q(5636) => [ + q(Punan Aput), + ], + q(5637) => [ + q(Puelche), + ], + q(5638) => [ + q(Punan Merah), + ], + q(5639) => [ + q(Phuie), + ], + q(5640) => [ + q(Puinave), + ], + q(5641) => [ + q(Punan Tubu), + ], + q(5642) => [ + q(Puma), + ], + q(5643) => [ + q(Puoc), + ], + q(5644) => [ + q(Pulabu), + ], + q(5645) => [ + q(Puquina), + ], + q(5646) => [ + q(Purubora), + ], + q(5647) => [ + q(Putoh), + ], + q(5648) => [ + q(Punu), + ], + q(5649) => [ + q(Puluwatese), + ], + q(5650) => [ + q(Puare), + ], + q(5651) => [ + q(Purisimeno), + ], + q(5652) => [ + q(Pawaia), + ], + q(5653) => [ + q(Panawa), + ], + q(5654) => [ + q(Gapapaiwa), + ], + q(5655) => [ + q(Patwin), + ], + q(5656) => [ + q(Molbog), + ], + q(5657) => [ + q(Paiwan), + ], + q(5658) => [ + q(Pwo Western Karen), + ], + q(5659) => [ + q(Powari), + ], + q(5660) => [ + q(Pwo Northern Karen), + ], + q(5661) => [ + q(Quetzaltepec Mixe), + ], + q(5662) => [ + q(Pye Krumen), + ], + q(5663) => [ + q(Fyam), + ], + q(5664) => [ + q(Poyanawa), + ], + q(5665) => [ + q(Paraguayan Sign Language), + q(Lengua de Senas del Paraguay), + ], + q(5666) => [ + q(Puyuma), + ], + q(5667) => [ + q(Pyu (Myanmar)), + ], + q(5668) => [ + q(Pyen), + ], + q(5669) => [ + q(Para Naga), + ], + q(5670) => [ + q(Quapaw), + ], + q(5671) => [ + q(Huallaga Huanuco Quechua), + ], + q(5672) => [ + q(K'iche'), + q(Quiche), + ], + q(5673) => [ + q(Calderon Highland Quichua), + ], + q(5674) => [ + q(Lambayeque Quechua), + ], + q(5675) => [ + q(Chimborazo Highland Quichua), + ], + q(5676) => [ + q(South Bolivian Quechua), + ], + q(5677) => [ + q(Quileute), + ], + q(5678) => [ + q(Chachapoyas Quechua), + ], + q(5679) => [ + q(North Bolivian Quechua), + ], + q(5680) => [ + q(Sipacapense), + ], + q(5681) => [ + q(Quinault), + ], + q(5682) => [ + q(Southern Pastaza Quechua), + ], + q(5683) => [ + q(Quinqui), + ], + q(5684) => [ + q(Yanahuanca Pasco Quechua), + ], + q(5685) => [ + q(Santiago del Estero Quichua), + ], + q(5686) => [ + q(Sacapulteco), + ], + q(5687) => [ + q(Tena Lowland Quichua), + ], + q(5688) => [ + q(Yauyos Quechua), + ], + q(5689) => [ + q(Ayacucho Quechua), + ], + q(5690) => [ + q(Cusco Quechua), + ], + q(5691) => [ + q(Ambo-Pasco Quechua), + ], + q(5692) => [ + q(Cajamarca Quechua), + ], + q(5693) => [ + q(Eastern Apurimac Quechua), + ], + q(5694) => [ + q(Huamalies-Dos de Mayo Huanuco Quechua), + ], + q(5695) => [ + q(Imbabura Highland Quichua), + ], + q(5696) => [ + q(Loja Highland Quichua), + ], + q(5697) => [ + q(Cajatambo North Lima Quechua), + ], + q(5698) => [ + q(Margos-Yarowilca-Lauricocha Quechua), + ], + q(5699) => [ + q(North Junin Quechua), + ], + q(5700) => [ + q(Napo Lowland Quechua), + ], + q(5701) => [ + q(Pacaraos Quechua), + ], + q(5702) => [ + q(San Martin Quechua), + ], + q(5703) => [ + q(Huaylla Wanca Quechua), + ], + q(5704) => [ + q(Queyu), + ], + q(5705) => [ + q(Northern Pastaza Quichua), + ], + q(5706) => [ + q(Corongo Ancash Quechua), + ], + q(5707) => [ + q(Classical Quechua), + ], + q(5708) => [ + q(Huaylas Ancash Quechua), + ], + q(5709) => [ + q(Kuman (Russia)), + ], + q(5710) => [ + q(Sihuas Ancash Quechua), + ], + q(5711) => [ + q(Kwalhioqua-Tlatskanai), + ], + q(5712) => [ + q(Chiquian Ancash Quechua), + ], + q(5713) => [ + q(Chincha Quechua), + ], + q(5714) => [ + q(Panao Huanuco Quechua), + ], + q(5715) => [ + q(Salasaca Highland Quichua), + ], + q(5716) => [ + q(Northern Conchucos Ancash Quechua), + ], + q(5717) => [ + q(Southern Conchucos Ancash Quechua), + ], + q(5718) => [ + q(Puno Quechua), + ], + q(5719) => [ + q(Qashqa'i), + ], + q(5720) => [ + q(Canar Highland Quichua), + ], + q(5721) => [ + q(Southern Qiang), + ], + q(5722) => [ + q(Santa Ana de Tusi Pasco Quechua), + ], + q(5723) => [ + q(Arequipa-La Union Quechua), + ], + q(5724) => [ + q(Jauja Wanca Quechua), + ], + q(5725) => [ + q(Quenya), + ], + q(5726) => [ + q(Quiripi), + ], + q(5727) => [ + q(Dungmali), + ], + q(5728) => [ + q(Camling), + ], + q(5729) => [ + q(Rasawa), + ], + q(5730) => [ + q(Rade), + ], + q(5731) => [ + q(Western Meohang), + ], + q(5732) => [ + q(Logooli), + q(Lulogooli), + ], + q(5733) => [ + q(Rabha), + ], + q(5734) => [ + q(Ramoaaina), + ], + q(5735) => [ + q(Tulu-Bohuai), + ], + q(5736) => [ + q(Ralte), + ], + q(5737) => [ + q(Canela), + ], + q(5738) => [ + q(Riantana), + ], + q(5739) => [ + q(Rao), + ], + q(5740) => [ + q(Saam), + ], + q(5741) => [ + q(Tegali), + ], + q(5742) => [ + q(Razajerdi), + ], + q(5743) => [ + q(Raute), + ], + q(5744) => [ + q(Sampang), + ], + q(5745) => [ + q(Rawang), + ], + q(5746) => [ + q(Rang), + ], + q(5747) => [ + q(Rapa), + ], + q(5748) => [ + q(Rahambuu), + ], + q(5749) => [ + q(Rumai Palaung), + ], + q(5750) => [ + q(Northern Bontok), + ], + q(5751) => [ + q(Miraya Bikol), + ], + q(5752) => [ + q(Barababaraba), + ], + q(5753) => [ + q(Reunion Creole French), + ], + q(5754) => [ + q(Rudbari), + ], + q(5755) => [ + q(Rerau), + ], + q(5756) => [ + q(Rembong), + ], + q(5757) => [ + q(Rejang Kayan), + ], + q(5758) => [ + q(Kara (Tanzania)), + ], + q(5759) => [ + q(Reli), + ], + q(5760) => [ + q(Rejang), + ], + q(5761) => [ + q(Rendille), + ], + q(5762) => [ + q(Remo), + ], + q(5763) => [ + q(Rengao), + ], + q(5764) => [ + q(Rer Bare), + ], + q(5765) => [ + q(Reshe), + ], + q(5766) => [ + q(Retta), + ], + q(5767) => [ + q(Reyesano), + ], + q(5768) => [ + q(Roria), + ], + q(5769) => [ + q(Romano-Greek), + ], + q(5770) => [ + q(Rangkas), + ], + q(5771) => [ + q(Romagnol), + ], + q(5772) => [ + q(Resigaro), + ], + q(5773) => [ + q(Southern Roglai), + ], + q(5774) => [ + q(Ringgou), + ], + q(5775) => [ + q(Rohingya), + ], + q(5776) => [ + q(Yahang), + ], + q(5777) => [ + q(Riang (India)), + ], + q(5778) => [ + q(Tarifit), + ], + q(5779) => [ + q(Riang (Myanmar)), + ], + q(5780) => [ + q(Nyaturu), + ], + q(5781) => [ + q(Nungu), + ], + q(5782) => [ + q(Ribun), + ], + q(5783) => [ + q(Ritarungo), + ], + q(5784) => [ + q(Riung), + ], + q(5785) => [ + q(Rajong), + ], + q(5786) => [ + q(Raji), + ], + q(5787) => [ + q(Rajbanshi), + ], + q(5788) => [ + q(Kraol), + ], + q(5789) => [ + q(Rikbaktsa), + ], + q(5790) => [ + q(Rakahanga-Manihiki), + ], + q(5791) => [ + q(Rakhine), + ], + q(5792) => [ + q(Marka), + ], + q(5793) => [ + q(Rangpuri), + q(Kamta), + ], + q(5794) => [ + q(Arakwal), + ], + q(5795) => [ + q(Rama), + ], + q(5796) => [ + q(Rembarunga), + ], + q(5797) => [ + q(Carpathian Romani), + ], + q(5798) => [ + q(Traveller Danish), + ], + q(5799) => [ + q(Angloromani), + ], + q(5800) => [ + q(Kalo Finnish Romani), + ], + q(5801) => [ + q(Traveller Norwegian), + ], + q(5802) => [ + q(Murkim), + ], + q(5803) => [ + q(Lomavren), + ], + q(5804) => [ + q(Romkun), + ], + q(5805) => [ + q(Baltic Romani), + ], + q(5806) => [ + q(Roma), + ], + q(5807) => [ + q(Balkan Romani), + ], + q(5808) => [ + q(Sinte Romani), + ], + q(5809) => [ + q(Rempi), + ], + q(5810) => [ + q(Calo), + ], + q(5811) => [ + q(Romanian Sign Language), + ], + q(5812) => [ + q(Domari), + ], + q(5813) => [ + q(Tavringer Romani), + ], + q(5814) => [ + q(Romanova), + ], + q(5815) => [ + q(Welsh Romani), + ], + q(5816) => [ + q(Romam), + ], + q(5817) => [ + q(Vlax Romani), + ], + q(5818) => [ + q(Marma), + ], + q(5819) => [ + q(Ruund), + ], + q(5820) => [ + q(Ronga), + ], + q(5821) => [ + q(Ranglong), + ], + q(5822) => [ + q(Roon), + ], + q(5823) => [ + q(Rongpo), + ], + q(5824) => [ + q(Nari Nari), + ], + q(5825) => [ + q(Rungwa), + ], + q(5826) => [ + q(Tae'), + ], + q(5827) => [ + q(Cacgia Roglai), + ], + q(5828) => [ + q(Rogo), + ], + q(5829) => [ + q(Ronji), + ], + q(5830) => [ + q(Rombo), + ], + q(5831) => [ + q(Northern Roglai), + ], + q(5832) => [ + q(Romblomanon), + ], + q(5833) => [ + q(Rotokas), + ], + q(5834) => [ + q(Kriol), + ], + q(5835) => [ + q(Rongga), + ], + q(5836) => [ + q(Runga), + ], + q(5837) => [ + q(Dela-Oenale), + ], + q(5838) => [ + q(Repanbitip), + ], + q(5839) => [ + q(Rapting), + ], + q(5840) => [ + q(Ririo), + ], + q(5841) => [ + q(Waima), + ], + q(5842) => [ + q(Arritinngithigh), + ], + q(5843) => [ + q(Romano-Serbian), + ], + q(5844) => [ + q(Russian Sign Language), + ], + q(5845) => [ + q(Miriwoong Sign Language), + ], + q(5846) => [ + q(Rungtu Chin), + ], + q(5847) => [ + q(Ratahan), + ], + q(5848) => [ + q(Rotuman), + ], + q(5849) => [ + q(Yurats), + ], + q(5850) => [ + q(Rathawi), + ], + q(5851) => [ + q(Gungu), + ], + q(5852) => [ + q(Ruuli), + ], + q(5853) => [ + q(Rusyn), + ], + q(5854) => [ + q(Luguru), + ], + q(5855) => [ + q(Roviana), + ], + q(5856) => [ + q(Ruga), + ], + q(5857) => [ + q(Rufiji), + ], + q(5858) => [ + q(Che), + ], + q(5859) => [ + q(Istro Romanian), + ], + q(5860) => [ + q(Megleno Romanian), + ], + q(5861) => [ + q(Rutul), + ], + q(5862) => [ + q(Lanas Lobu), + ], + q(5863) => [ + q(Mala (Nigeria)), + ], + q(5864) => [ + q(Ruma), + ], + q(5865) => [ + q(Rawo), + ], + q(5866) => [ + q(Rwa), + ], + q(5867) => [ + q(Amba (Uganda)), + ], + q(5868) => [ + q(Rawa), + ], + q(5869) => [ + q(Marwari (India)), + ], + q(5870) => [ + q(Ngardi), + ], + q(5871) => [ + q(Karuwali), + ], + q(5872) => [ + q(Northern Amami-Oshima), + ], + q(5873) => [ + q(Yaeyama), + ], + q(5874) => [ + q(Central Okinawan), + ], + q(5875) => [ + q(Razihi), + ], + q(5876) => [ + q(Saba), + ], + q(5877) => [ + q(Buglere), + ], + q(5878) => [ + q(Meskwaki), + ], + q(5879) => [ + q(Sabane), + ], + q(5880) => [ + q(Safaliba), + ], + q(5881) => [ + q(Sahu), + ], + q(5882) => [ + q(Sake), + ], + q(5883) => [ + q(Sause), + ], + q(5884) => [ + q(Samburu), + ], + q(5885) => [ + q(Saraveca), + ], + q(5886) => [ + q(Saleman), + ], + q(5887) => [ + q(Saafi-Saafi), + ], + q(5888) => [ + q(Sawi), + ], + q(5889) => [ + q(Sa), + ], + q(5890) => [ + q(Saya), + ], + q(5891) => [ + q(Saurashtra), + ], + q(5892) => [ + q(Ngambay), + ], + q(5893) => [ + q(Simbo), + ], + q(5894) => [ + q(Kele (Papua New Guinea)), + ], + q(5895) => [ + q(Southern Samo), + ], + q(5896) => [ + q(Saliba), + ], + q(5897) => [ + q(Chabu), + q(Shabo), + ], + q(5898) => [ + q(Seget), + ], + q(5899) => [ + q(Sori-Harengan), + ], + q(5900) => [ + q(Seti), + ], + q(5901) => [ + q(Surbakhal), + ], + q(5902) => [ + q(Safwa), + ], + q(5903) => [ + q(Botolan Sambal), + ], + q(5904) => [ + q(Sagala), + ], + q(5905) => [ + q(Sindhi Bhil), + ], + q(5906) => [ + q(Sabum), + ], + q(5907) => [ + q(Sangu (Tanzania)), + ], + q(5908) => [ + q(Sileibi), + ], + q(5909) => [ + q(Sembakung Murut), + ], + q(5910) => [ + q(Subiya), + ], + q(5911) => [ + q(Kimki), + ], + q(5912) => [ + q(Stod Bhoti), + ], + q(5913) => [ + q(Sabine), + ], + q(5914) => [ + q(Simba), + ], + q(5915) => [ + q(Seberuang), + ], + q(5916) => [ + q(Soli), + ], + q(5917) => [ + q(Sara Kaba), + ], + q(5918) => [ + q(Chut), + ], + q(5919) => [ + q(Dongxiang), + ], + q(5920) => [ + q(San Miguel Creole French), + ], + q(5921) => [ + q(Sanggau), + ], + q(5922) => [ + q(Sakachep), + ], + q(5923) => [ + q(Sri Lankan Creole Malay), + ], + q(5924) => [ + q(Sadri), + ], + q(5925) => [ + q(Shina), + ], + q(5926) => [ + q(Helambu Sherpa), + ], + q(5927) => [ + q(Sa'och), + ], + q(5928) => [ + q(North Slavey), + ], + q(5929) => [ + q(Southern Katang), + ], + q(5930) => [ + q(Shumcho), + ], + q(5931) => [ + q(Sheni), + ], + q(5932) => [ + q(Sha), + ], + q(5933) => [ + q(Sicel), + ], + q(5934) => [ + q(Toraja-Sa'dan), + ], + q(5935) => [ + q(Shabak), + ], + q(5936) => [ + q(Sassarese Sardinian), + ], + q(5937) => [ + q(Surubu), + ], + q(5938) => [ + q(Sarli), + ], + q(5939) => [ + q(Savi), + ], + q(5940) => [ + q(Southern Kurdish), + ], + q(5941) => [ + q(Suundi), + ], + q(5942) => [ + q(Sos Kundi), + ], + q(5943) => [ + q(Saudi Arabian Sign Language), + ], + q(5944) => [ + q(Semandang), + ], + q(5945) => [ + q(Gallurese Sardinian), + ], + q(5946) => [ + q(Bukar-Sadung Bidayuh), + ], + q(5947) => [ + q(Sherdukpen), + ], + q(5948) => [ + q(Oraon Sadri), + ], + q(5949) => [ + q(Sened), + ], + q(5950) => [ + q(Shuadit), + ], + q(5951) => [ + q(Sarudu), + ], + q(5952) => [ + q(Sibu Melanau), + ], + q(5953) => [ + q(Sallands), + ], + q(5954) => [ + q(Semai), + ], + q(5955) => [ + q(Shempire Senoufo), + ], + q(5956) => [ + q(Sechelt), + ], + q(5957) => [ + q(Sedang), + ], + q(5958) => [ + q(Seneca), + ], + q(5959) => [ + q(Cebaara Senoufo), + ], + q(5960) => [ + q(Segeju), + ], + q(5961) => [ + q(Sena), + ], + q(5962) => [ + q(Seri), + ], + q(5963) => [ + q(Sene), + ], + q(5964) => [ + q(Sekani), + ], + q(5965) => [ + q(Nanerige Senoufo), + ], + q(5966) => [ + q(Suarmin), + ], + q(5967) => [ + q(Sicite Senoufo), + ], + q(5968) => [ + q(Senara Senoufo), + ], + q(5969) => [ + q(Serrano), + ], + q(5970) => [ + q(Koyraboro Senni Songhai), + ], + q(5971) => [ + q(Sentani), + ], + q(5972) => [ + q(Serui-Laut), + ], + q(5973) => [ + q(Nyarafolo Senoufo), + ], + q(5974) => [ + q(Sewa Bay), + ], + q(5975) => [ + q(Secoya), + ], + q(5976) => [ + q(Senthang Chin), + ], + q(5977) => [ + q(Langue des signes de Belgique Francophone), + q(French Belgian Sign Language), + ], + q(5978) => [ + q(Eastern Subanen), + ], + q(5979) => [ + q(Small Flowery Miao), + ], + q(5980) => [ + q(South African Sign Language), + ], + q(5981) => [ + q(Sehwi), + ], + q(5982) => [ + q(Mag-antsi Ayta), + ], + q(5983) => [ + q(Kipsigis), + ], + q(5984) => [ + q(Surigaonon), + ], + q(5985) => [ + q(Segai), + ], + q(5986) => [ + q(Swiss-German Sign Language), + ], + q(5987) => [ + q(Shughni), + ], + q(5988) => [ + q(Suga), + ], + q(5989) => [ + q(Surgujia), + ], + q(5990) => [ + q(Sangkong), + ], + q(5991) => [ + q(Singa), + ], + q(5992) => [ + q(Singpho), + ], + q(5993) => [ + q(Sangisari), + ], + q(5994) => [ + q(Samogitian), + ], + q(5995) => [ + q(Brokpake), + ], + q(5996) => [ + q(Salas), + ], + q(5997) => [ + q(Sebat Bet Gurage), + ], + q(5998) => [ + q(Sierra Leone Sign Language), + ], + q(5999) => [ + q(Sanglechi), + ], + q(6000) => [ + q(Sursurunga), + ], + q(6001) => [ + q(Shall-Zwall), + ], + q(6002) => [ + q(Ninam), + ], + q(6003) => [ + q(Sonde), + ], + q(6004) => [ + q(Kundal Shahi), + ], + q(6005) => [ + q(Sheko), + ], + q(6006) => [ + q(Shua), + ], + q(6007) => [ + q(Shoshoni), + ], + q(6008) => [ + q(Tachelhit), + ], + q(6009) => [ + q(Shatt), + ], + q(6010) => [ + q(Shilluk), + ], + q(6011) => [ + q(Shendu), + ], + q(6012) => [ + q(Shahrudi), + ], + q(6013) => [ + q(Shanga), + ], + q(6014) => [ + q(Shipibo-Conibo), + ], + q(6015) => [ + q(Sala), + ], + q(6016) => [ + q(Shi), + ], + q(6017) => [ + q(Shuswap), + ], + q(6018) => [ + q(Shasta), + ], + q(6019) => [ + q(Chadian Arabic), + ], + q(6020) => [ + q(Shehri), + ], + q(6021) => [ + q(Shwai), + ], + q(6022) => [ + q(She), + ], + q(6023) => [ + q(Tachawit), + ], + q(6024) => [ + q(Syenara Senoufo), + ], + q(6025) => [ + q(Akkala Sami), + ], + q(6026) => [ + q(Sebop), + ], + q(6027) => [ + q(Simaa), + ], + q(6028) => [ + q(Siamou), + ], + q(6029) => [ + q(Paasaal), + ], + q(6030) => [ + q(Zire), + q(Sishee), + ], + q(6031) => [ + q(Shom Peng), + ], + q(6032) => [ + q(Numbami), + ], + q(6033) => [ + q(Sikiana), + ], + q(6034) => [ + q(Tumulung Sisaala), + ], + q(6035) => [ + q(Mende (Papua New Guinea)), + ], + q(6036) => [ + q(Sikkimese), + ], + q(6037) => [ + q(Sonia), + ], + q(6038) => [ + q(Siri), + ], + q(6039) => [ + q(Siuslaw), + ], + q(6040) => [ + q(Sinagen), + ], + q(6041) => [ + q(Sumariup), + ], + q(6042) => [ + q(Siwai), + ], + q(6043) => [ + q(Sumau), + ], + q(6044) => [ + q(Sivandi), + ], + q(6045) => [ + q(Siwi), + ], + q(6046) => [ + q(Epena), + ], + q(6047) => [ + q(Sajau Basap), + ], + q(6048) => [ + q(Kildin Sami), + ], + q(6049) => [ + q(Pite Sami), + ], + q(6050) => [ + q(Assangori), + ], + q(6051) => [ + q(Kemi Sami), + ], + q(6052) => [ + q(Sajalong), + q(Miji), + ], + q(6053) => [ + q(Mapun), + ], + q(6054) => [ + q(Sindarin), + ], + q(6055) => [ + q(Xibe), + ], + q(6056) => [ + q(Surjapuri), + ], + q(6057) => [ + q(Siar-Lak), + ], + q(6058) => [ + q(Senhaja De Srair), + ], + q(6059) => [ + q(Ter Sami), + ], + q(6060) => [ + q(Ume Sami), + ], + q(6061) => [ + q(Shawnee), + ], + q(6062) => [ + q(Skagit), + ], + q(6063) => [ + q(Saek), + ], + q(6064) => [ + q(Ma Manda), + ], + q(6065) => [ + q(Southern Sierra Miwok), + ], + q(6066) => [ + q(Seke (Vanuatu)), + ], + q(6067) => [ + q(Sakirabia), + ], + q(6068) => [ + q(Sakalava Malagasy), + ], + q(6069) => [ + q(Sikule), + ], + q(6070) => [ + q(Sika), + ], + q(6071) => [ + q(Seke (Nepal)), + ], + q(6072) => [ + q(Kutong), + ], + q(6073) => [ + q(Kolibugan Subanon), + ], + q(6074) => [ + q(Seko Tengah), + ], + q(6075) => [ + q(Sekapan), + ], + q(6076) => [ + q(Sininkere), + ], + q(6077) => [ + q(Saraiki), + q(Seraiki), + ], + q(6078) => [ + q(Maia), + ], + q(6079) => [ + q(Sakata), + ], + q(6080) => [ + q(Sakao), + ], + q(6081) => [ + q(Skou), + ], + q(6082) => [ + q(Skepi Creole Dutch), + ], + q(6083) => [ + q(Seko Padang), + ], + q(6084) => [ + q(Sikaiana), + ], + q(6085) => [ + q(Sekar), + ], + q(6086) => [ + q(Sissala), + ], + q(6087) => [ + q(Sholaga), + ], + q(6088) => [ + q(Swiss-Italian Sign Language), + ], + q(6089) => [ + q(Selungai Murut), + ], + q(6090) => [ + q(Southern Puget Sound Salish), + ], + q(6091) => [ + q(Lower Silesian), + ], + q(6092) => [ + q(Saluma), + ], + q(6093) => [ + q(Salt-Yui), + ], + q(6094) => [ + q(Pangutaran Sama), + ], + q(6095) => [ + q(Salinan), + ], + q(6096) => [ + q(Lamaholot), + ], + q(6097) => [ + q(Salchuq), + ], + q(6098) => [ + q(Salar), + ], + q(6099) => [ + q(Singapore Sign Language), + ], + q(6100) => [ + q(Sila), + ], + q(6101) => [ + q(Selaru), + ], + q(6102) => [ + q(Sialum), + ], + q(6103) => [ + q(Salampasu), + ], + q(6104) => [ + q(Selayar), + ], + q(6105) => [ + q(Ma'ya), + ], + q(6106) => [ + q(Simbari), + ], + q(6107) => [ + q(Som), + ], + q(6108) => [ + q(Sama), + ], + q(6109) => [ + q(Auwe), + ], + q(6110) => [ + q(Simbali), + ], + q(6111) => [ + q(Samei), + ], + q(6112) => [ + q(Bolinao), + ], + q(6113) => [ + q(Central Sama), + ], + q(6114) => [ + q(Musasa), + ], + q(6115) => [ + q(Samaritan), + ], + q(6116) => [ + q(Samo), + ], + q(6117) => [ + q(Simeulue), + ], + q(6118) => [ + q(Simte), + ], + q(6119) => [ + q(Somray), + ], + q(6120) => [ + q(Samvedi), + ], + q(6121) => [ + q(Sumbawa), + ], + q(6122) => [ + q(Samba), + ], + q(6123) => [ + q(Semnani), + ], + q(6124) => [ + q(Simeku), + ], + q(6125) => [ + q(Sebuyau), + ], + q(6126) => [ + q(Sinaugoro), + ], + q(6127) => [ + q(Bau Bidayuh), + ], + q(6128) => [ + q(Noon), + ], + q(6129) => [ + q(Sanga (Democratic Republic of Congo)), + ], + q(6130) => [ + q(Sensi), + ], + q(6131) => [ + q(Riverain Sango), + ], + q(6132) => [ + q(Sangil), + ], + q(6133) => [ + q(Southern Ma'di), + ], + q(6134) => [ + q(Siona), + ], + q(6135) => [ + q(Snohomish), + ], + q(6136) => [ + q(Siane), + ], + q(6137) => [ + q(Sangu (Gabon)), + ], + q(6138) => [ + q(Sihan), + ], + q(6139) => [ + q(South West Bay), + q(Nahavaq), + ], + q(6140) => [ + q(Senggi), + q(Viid), + ], + q(6141) => [ + q(Sa'ban), + ], + q(6142) => [ + q(Selee), + ], + q(6143) => [ + q(Sam), + ], + q(6144) => [ + q(Saniyo-Hiyewe), + ], + q(6145) => [ + q(Sinsauru), + ], + q(6146) => [ + q(Thai Song), + ], + q(6147) => [ + q(Sobei), + ], + q(6148) => [ + q(So (Democratic Republic of Congo)), + ], + q(6149) => [ + q(Songoora), + ], + q(6150) => [ + q(Songomeno), + ], + q(6151) => [ + q(Aka), + ], + q(6152) => [ + q(Sonha), + ], + q(6153) => [ + q(Soi), + ], + q(6154) => [ + q(Sokoro), + ], + q(6155) => [ + q(Solos), + ], + q(6156) => [ + q(Songo), + ], + q(6157) => [ + q(Songe), + ], + q(6158) => [ + q(Kanasi), + ], + q(6159) => [ + q(Somrai), + ], + q(6160) => [ + q(Seeku), + ], + q(6161) => [ + q(Southern Thai), + ], + q(6162) => [ + q(Sonsorol), + ], + q(6163) => [ + q(Sowanda), + ], + q(6164) => [ + q(Swo), + ], + q(6165) => [ + q(Miyobe), + ], + q(6166) => [ + q(Temi), + ], + q(6167) => [ + q(Sepa (Indonesia)), + ], + q(6168) => [ + q(Sape), + ], + q(6169) => [ + q(Saep), + ], + q(6170) => [ + q(Sepa (Papua New Guinea)), + ], + q(6171) => [ + q(Sian), + ], + q(6172) => [ + q(Saponi), + ], + q(6173) => [ + q(Sengo), + ], + q(6174) => [ + q(Selepet), + ], + q(6175) => [ + q(Akukem), + ], + q(6176) => [ + q(Sanapana), + ], + q(6177) => [ + q(Spokane), + ], + q(6178) => [ + q(Supyire Senoufo), + ], + q(6179) => [ + q(Loreto-Ucayali Spanish), + ], + q(6180) => [ + q(Saparua), + ], + q(6181) => [ + q(Saposa), + ], + q(6182) => [ + q(Spiti Bhoti), + ], + q(6183) => [ + q(Sapuan), + ], + q(6184) => [ + q(Sambalpuri), + q(Kosli), + ], + q(6185) => [ + q(South Picene), + ], + q(6186) => [ + q(Sabaot), + ], + q(6187) => [ + q(Shama-Sambuga), + ], + q(6188) => [ + q(Shau), + ], + q(6189) => [ + q(Albanian Sign Language), + ], + q(6190) => [ + q(Suma), + ], + q(6191) => [ + q(Susquehannock), + ], + q(6192) => [ + q(Sorkhei), + ], + q(6193) => [ + q(Sou), + ], + q(6194) => [ + q(Siculo Arabic), + ], + q(6195) => [ + q(Sri Lankan Sign Language), + ], + q(6196) => [ + q(Soqotri), + ], + q(6197) => [ + q(Squamish), + ], + q(6198) => [ + q(Saruga), + ], + q(6199) => [ + q(Sora), + ], + q(6200) => [ + q(Logudorese Sardinian), + ], + q(6201) => [ + q(Sara), + ], + q(6202) => [ + q(Nafi), + ], + q(6203) => [ + q(Sulod), + ], + q(6204) => [ + q(Sarikoli), + ], + q(6205) => [ + q(Siriano), + ], + q(6206) => [ + q(Serudung Murut), + ], + q(6207) => [ + q(Isirawa), + ], + q(6208) => [ + q(Saramaccan), + ], + q(6209) => [ + q(Campidanese Sardinian), + ], + q(6210) => [ + q(Siriono), + ], + q(6211) => [ + q(Sarsi), + ], + q(6212) => [ + q(Sauri), + ], + q(6213) => [ + q(Surui), + ], + q(6214) => [ + q(Southern Sorsoganon), + ], + q(6215) => [ + q(Serua), + ], + q(6216) => [ + q(Sirmauri), + ], + q(6217) => [ + q(Sera), + ], + q(6218) => [ + q(Shahmirzadi), + ], + q(6219) => [ + q(Southern Sama), + ], + q(6220) => [ + q(Suba-Simbiti), + ], + q(6221) => [ + q(Siroi), + ], + q(6222) => [ + q(Balangingi), + q(Bangingih Sama), + ], + q(6223) => [ + q(Thao), + ], + q(6224) => [ + q(Seimat), + ], + q(6225) => [ + q(Shihhi Arabic), + ], + q(6226) => [ + q(Sansi), + ], + q(6227) => [ + q(Sausi), + ], + q(6228) => [ + q(Sunam), + ], + q(6229) => [ + q(Western Sisaala), + ], + q(6230) => [ + q(Semnam), + ], + q(6231) => [ + q(Waata), + ], + q(6232) => [ + q(Sissano), + ], + q(6233) => [ + q(Spanish Sign Language), + ], + q(6234) => [ + q(So'a), + ], + q(6235) => [ + q(Swiss-French Sign Language), + ], + q(6236) => [ + q(So), + ], + q(6237) => [ + q(Sinasina), + ], + q(6238) => [ + q(Susuami), + ], + q(6239) => [ + q(Shark Bay), + ], + q(6240) => [ + q(Samberigi), + ], + q(6241) => [ + q(Saho), + ], + q(6242) => [ + q(Sengseng), + ], + q(6243) => [ + q(Settla), + ], + q(6244) => [ + q(Northern Subanen), + ], + q(6245) => [ + q(Sentinel), + ], + q(6246) => [ + q(Liana-Seti), + ], + q(6247) => [ + q(Seta), + ], + q(6248) => [ + q(Trieng), + ], + q(6249) => [ + q(Shelta), + ], + q(6250) => [ + q(Bulo Stieng), + ], + q(6251) => [ + q(Matya Samo), + ], + q(6252) => [ + q(Arammba), + ], + q(6253) => [ + q(Stellingwerfs), + ], + q(6254) => [ + q(Setaman), + ], + q(6255) => [ + q(Owa), + ], + q(6256) => [ + q(Stoney), + ], + q(6257) => [ + q(Southeastern Tepehuan), + ], + q(6258) => [ + q(Saterfriesisch), + ], + q(6259) => [ + q(Straits Salish), + ], + q(6260) => [ + q(Shumashti), + ], + q(6261) => [ + q(Budeh Stieng), + ], + q(6262) => [ + q(Samtao), + ], + q(6263) => [ + q(Silt'e), + ], + q(6264) => [ + q(Satawalese), + ], + q(6265) => [ + q(Siberian Tatar), + ], + q(6266) => [ + q(Sulka), + ], + q(6267) => [ + q(Suku), + ], + q(6268) => [ + q(Western Subanon), + ], + q(6269) => [ + q(Suena), + ], + q(6270) => [ + q(Suganga), + ], + q(6271) => [ + q(Suki), + ], + q(6272) => [ + q(Shubi), + ], + q(6273) => [ + q(Suri), + ], + q(6274) => [ + q(Mwaghavul), + ], + q(6275) => [ + q(Subtiaba), + ], + q(6276) => [ + q(Puroik), + ], + q(6277) => [ + q(Sumbwa), + ], + q(6278) => [ + q(Suya), + ], + q(6279) => [ + q(Sunwar), + ], + q(6280) => [ + q(Svan), + ], + q(6281) => [ + q(Ulau-Suain), + ], + q(6282) => [ + q(Vincentian Creole English), + ], + q(6283) => [ + q(Serili), + ], + q(6284) => [ + q(Slovakian Sign Language), + ], + q(6285) => [ + q(Slavomolisano), + ], + q(6286) => [ + q(Savosavo), + ], + q(6287) => [ + q(Skalvian), + ], + q(6288) => [ + q(Maore Comorian), + ], + q(6289) => [ + q(Congo Swahili), + ], + q(6290) => [ + q(Sere), + ], + q(6291) => [ + q(Swabian), + ], + q(6292) => [ + q(Swahili (individual language)), + q(Kiswahili), + ], + q(6293) => [ + q(Sui), + ], + q(6294) => [ + q(Sira), + ], + q(6295) => [ + q(Malawi Sena), + ], + q(6296) => [ + q(Swedish Sign Language), + ], + q(6297) => [ + q(Samosa), + ], + q(6298) => [ + q(Sawknah), + ], + q(6299) => [ + q(Shanenawa), + ], + q(6300) => [ + q(Suau), + ], + q(6301) => [ + q(Sharwa), + ], + q(6302) => [ + q(Saweru), + ], + q(6303) => [ + q(Seluwasan), + ], + q(6304) => [ + q(Sawila), + ], + q(6305) => [ + q(Suwawa), + ], + q(6306) => [ + q(Shekhawati), + ], + q(6307) => [ + q(Sowa), + ], + q(6308) => [ + q(Suruaha), + ], + q(6309) => [ + q(Sarua), + ], + q(6310) => [ + q(Suba), + ], + q(6311) => [ + q(Sicanian), + ], + q(6312) => [ + q(Sighu), + ], + q(6313) => [ + q(Shixing), + ], + q(6314) => [ + q(Southern Kalapuya), + ], + q(6315) => [ + q(Selian), + ], + q(6316) => [ + q(Samre), + ], + q(6317) => [ + q(Sangir), + ], + q(6318) => [ + q(Sorothaptic), + ], + q(6319) => [ + q(Saaroa), + ], + q(6320) => [ + q(Sasaru), + ], + q(6321) => [ + q(Upper Saxon), + ], + q(6322) => [ + q(Saxwe Gbe), + ], + q(6323) => [ + q(Siang), + ], + q(6324) => [ + q(Central Subanen), + ], + q(6325) => [ + q(Seki), + ], + q(6326) => [ + q(Sukur), + ], + q(6327) => [ + q(Sylheti), + ], + q(6328) => [ + q(Maya Samo), + ], + q(6329) => [ + q(Senaya), + ], + q(6330) => [ + q(Suoy), + ], + q(6331) => [ + q(Sinyar), + ], + q(6332) => [ + q(Kagate), + ], + q(6333) => [ + q(Samay), + ], + q(6334) => [ + q(Al-Sayyid Bedouin Sign Language), + ], + q(6335) => [ + q(Semelai), + ], + q(6336) => [ + q(Ngalum), + ], + q(6337) => [ + q(Semaq Beri), + ], + q(6338) => [ + q(Seru), + ], + q(6339) => [ + q(Seze), + ], + q(6340) => [ + q(Sengele), + ], + q(6341) => [ + q(Silesian), + ], + q(6342) => [ + q(Sula), + ], + q(6343) => [ + q(Suabo), + ], + q(6344) => [ + q(Solomon Islands Sign Language), + ], + q(6345) => [ + q(Isu (Fako Division)), + ], + q(6346) => [ + q(Sawai), + ], + q(6347) => [ + q(Lower Tanana), + ], + q(6348) => [ + q(Tabassaran), + ], + q(6349) => [ + q(Lowland Tarahumara), + ], + q(6350) => [ + q(Tause), + ], + q(6351) => [ + q(Tariana), + ], + q(6352) => [ + q(Tapirape), + ], + q(6353) => [ + q(Tagoi), + ], + q(6354) => [ + q(Eastern Tamang), + ], + q(6355) => [ + q(Tala), + ], + q(6356) => [ + q(Tal), + ], + q(6357) => [ + q(Tangale), + ], + q(6358) => [ + q(Yami), + ], + q(6359) => [ + q(Taabwa), + ], + q(6360) => [ + q(Tamasheq), + ], + q(6361) => [ + q(Central Tarahumara), + ], + q(6362) => [ + q(Tay Boi), + ], + q(6363) => [ + q(Upper Tanana), + ], + q(6364) => [ + q(Tatuyo), + ], + q(6365) => [ + q(Tai), + ], + q(6366) => [ + q(Tamki), + ], + q(6367) => [ + q(Atayal), + ], + q(6368) => [ + q(Tocho), + ], + q(6369) => [ + q(Aikana), + ], + q(6370) => [ + q(Tapeba), + ], + q(6371) => [ + q(Takia), + ], + q(6372) => [ + q(Kaki Ae), + ], + q(6373) => [ + q(Tanimbili), + ], + q(6374) => [ + q(Mandara), + ], + q(6375) => [ + q(North Tairora), + ], + q(6376) => [ + q(Thurawal), + ], + q(6377) => [ + q(Gaam), + ], + q(6378) => [ + q(Tiang), + ], + q(6379) => [ + q(Calamian Tagbanwa), + ], + q(6380) => [ + q(Tboli), + ], + q(6381) => [ + q(Tagbu), + ], + q(6382) => [ + q(Barro Negro Tunebo), + ], + q(6383) => [ + q(Tawala), + ], + q(6384) => [ + q(Taworta), + q(Diebroud), + ], + q(6385) => [ + q(Tumtum), + ], + q(6386) => [ + q(Tanguat), + ], + q(6387) => [ + q(Tembo (Kitembo)), + ], + q(6388) => [ + q(Tubar), + ], + q(6389) => [ + q(Tobo), + ], + q(6390) => [ + q(Tagbanwa), + ], + q(6391) => [ + q(Kapin), + ], + q(6392) => [ + q(Tabaru), + ], + q(6393) => [ + q(Ditammari), + ], + q(6394) => [ + q(Ticuna), + ], + q(6395) => [ + q(Tanacross), + ], + q(6396) => [ + q(Datooga), + ], + q(6397) => [ + q(Tafi), + ], + q(6398) => [ + q(Southern Tutchone), + ], + q(6399) => [ + q(Malinaltepec Me'phaa), + q(Malinaltepec Tlapanec), + ], + q(6400) => [ + q(Tamagario), + ], + q(6401) => [ + q(Turks And Caicos Creole English), + ], + q(6402) => [ + q(Wara), + ], + q(6403) => [ + q(Tchitchege), + ], + q(6404) => [ + q(Taman (Myanmar)), + ], + q(6405) => [ + q(Tanahmerah), + ], + q(6406) => [ + q(Tichurong), + ], + q(6407) => [ + q(Taungyo), + ], + q(6408) => [ + q(Tawr Chin), + ], + q(6409) => [ + q(Kaiy), + ], + q(6410) => [ + q(Torres Strait Creole), + ], + q(6411) => [ + q(T'en), + ], + q(6412) => [ + q(Southeastern Tarahumara), + ], + q(6413) => [ + q(Tecpatlan Totonac), + ], + q(6414) => [ + q(Toda), + ], + q(6415) => [ + q(Tulu), + ], + q(6416) => [ + q(Thado Chin), + ], + q(6417) => [ + q(Tagdal), + ], + q(6418) => [ + q(Panchpargania), + ], + q(6419) => [ + q(Embera-Tado), + ], + q(6420) => [ + q(Tai Nua), + ], + q(6421) => [ + q(Tiranige Diga Dogon), + ], + q(6422) => [ + q(Talieng), + ], + q(6423) => [ + q(Western Tamang), + ], + q(6424) => [ + q(Thulung), + ], + q(6425) => [ + q(Tomadino), + ], + q(6426) => [ + q(Tajio), + ], + q(6427) => [ + q(Tambas), + ], + q(6428) => [ + q(Sur), + ], + q(6429) => [ + q(Taruma), + ], + q(6430) => [ + q(Tondano), + ], + q(6431) => [ + q(Teme), + ], + q(6432) => [ + q(Tita), + ], + q(6433) => [ + q(Todrah), + ], + q(6434) => [ + q(Doutai), + ], + q(6435) => [ + q(Tetun Dili), + ], + q(6436) => [ + q(Toro), + ], + q(6437) => [ + q(Tandroy-Mahafaly Malagasy), + ], + q(6438) => [ + q(Tadyawan), + ], + q(6439) => [ + q(Temiar), + ], + q(6440) => [ + q(Tetete), + ], + q(6441) => [ + q(Terik), + ], + q(6442) => [ + q(Tepo Krumen), + ], + q(6443) => [ + q(Huehuetla Tepehua), + ], + q(6444) => [ + q(Teressa), + ], + q(6445) => [ + q(Teke-Tege), + ], + q(6446) => [ + q(Tehuelche), + ], + q(6447) => [ + q(Torricelli), + ], + q(6448) => [ + q(Ibali Teke), + ], + q(6449) => [ + q(Tama (Colombia)), + ], + q(6450) => [ + q(Teso), + ], + q(6451) => [ + q(Tepecano), + ], + q(6452) => [ + q(Temein), + ], + q(6453) => [ + q(Tengger), + ], + q(6454) => [ + q(Soo), + ], + q(6455) => [ + q(Teor), + ], + q(6456) => [ + q(Tewa (USA)), + ], + q(6457) => [ + q(Tennet), + ], + q(6458) => [ + q(Tulishi), + ], + q(6459) => [ + q(Tofin Gbe), + ], + q(6460) => [ + q(Tanaina), + ], + q(6461) => [ + q(Tefaro), + ], + q(6462) => [ + q(Teribe), + ], + q(6463) => [ + q(Ternate), + ], + q(6464) => [ + q(Sagalla), + ], + q(6465) => [ + q(Tobilung), + ], + q(6466) => [ + q(Tigak), + ], + q(6467) => [ + q(Ciwogai), + ], + q(6468) => [ + q(Eastern Gorkha Tamang), + ], + q(6469) => [ + q(Chalikha), + ], + q(6470) => [ + q(Tobagonian Creole English), + ], + q(6471) => [ + q(Lawunuia), + ], + q(6472) => [ + q(Tagin), + ], + q(6473) => [ + q(Tandaganon), + ], + q(6474) => [ + q(Sudest), + ], + q(6475) => [ + q(Tangoa), + ], + q(6476) => [ + q(Tring), + ], + q(6477) => [ + q(Tareng), + ], + q(6478) => [ + q(Nume), + ], + q(6479) => [ + q(Central Tagbanwa), + ], + q(6480) => [ + q(Tanggu), + ], + q(6481) => [ + q(Tingui-Boto), + ], + q(6482) => [ + q(Tagwana Senoufo), + ], + q(6483) => [ + q(Tagish), + ], + q(6484) => [ + q(Togoyo), + ], + q(6485) => [ + q(Tagalaka), + ], + q(6486) => [ + q(Thayore), + ], + q(6487) => [ + q(Chitwania Tharu), + ], + q(6488) => [ + q(Thangmi), + ], + q(6489) => [ + q(Northern Tarahumara), + ], + q(6490) => [ + q(Tai Long), + ], + q(6491) => [ + q(Tharaka), + q(Kitharaka), + ], + q(6492) => [ + q(Dangaura Tharu), + ], + q(6493) => [ + q(Aheu), + ], + q(6494) => [ + q(Thachanadan), + ], + q(6495) => [ + q(Thompson), + ], + q(6496) => [ + q(Kochila Tharu), + ], + q(6497) => [ + q(Rana Tharu), + ], + q(6498) => [ + q(Thakali), + ], + q(6499) => [ + q(Tahltan), + ], + q(6500) => [ + q(Thuri), + ], + q(6501) => [ + q(Tahaggart Tamahaq), + ], + q(6502) => [ + q(Thudam), + ], + q(6503) => [ + q(Tha), + ], + q(6504) => [ + q(Tayart Tamajeq), + ], + q(6505) => [ + q(Tidikelt Tamazight), + ], + q(6506) => [ + q(Tira), + ], + q(6507) => [ + q(Tifal), + ], + q(6508) => [ + q(Timugon Murut), + ], + q(6509) => [ + q(Tiene), + ], + q(6510) => [ + q(Tilung), + ], + q(6511) => [ + q(Tikar), + ], + q(6512) => [ + q(Tillamook), + ], + q(6513) => [ + q(Timbe), + ], + q(6514) => [ + q(Tindi), + ], + q(6515) => [ + q(Teop), + ], + q(6516) => [ + q(Trimuris), + ], + q(6517) => [ + q(Tiefo), + ], + q(6518) => [ + q(Masadiit Itneg), + ], + q(6519) => [ + q(Tinigua), + ], + q(6520) => [ + q(Adasen), + ], + q(6521) => [ + q(Tiwi), + ], + q(6522) => [ + q(Southern Tiwa), + ], + q(6523) => [ + q(Tiruray), + ], + q(6524) => [ + q(Tai Hongjin), + ], + q(6525) => [ + q(Tajuasohn), + ], + q(6526) => [ + q(Tunjung), + ], + q(6527) => [ + q(Northern Tujia), + ], + q(6528) => [ + q(Tai Laing), + ], + q(6529) => [ + q(Timucua), + ], + q(6530) => [ + q(Tonjon), + ], + q(6531) => [ + q(Temacine Tamazight), + ], + q(6532) => [ + q(Southern Tujia), + ], + q(6533) => [ + q(Tjurruru), + ], + q(6534) => [ + q(Djabwurrung), + ], + q(6535) => [ + q(Truka), + ], + q(6536) => [ + q(Buksa), + ], + q(6537) => [ + q(Tukudede), + ], + q(6538) => [ + q(Takwane), + ], + q(6539) => [ + q(Tukumanfed), + ], + q(6540) => [ + q(Tesaka Malagasy), + ], + q(6541) => [ + q(Takelma), + ], + q(6542) => [ + q(Toku-No-Shima), + ], + q(6543) => [ + q(Tikopia), + ], + q(6544) => [ + q(Tee), + ], + q(6545) => [ + q(Tsakhur), + ], + q(6546) => [ + q(Takestani), + ], + q(6547) => [ + q(Kathoriya Tharu), + ], + q(6548) => [ + q(Upper Necaxa Totonac), + ], + q(6549) => [ + q(Mur Pano), + ], + q(6550) => [ + q(Teanu), + ], + q(6551) => [ + q(Tangko), + ], + q(6552) => [ + q(Takua), + ], + q(6553) => [ + q(Southwestern Tepehuan), + ], + q(6554) => [ + q(Tobelo), + ], + q(6555) => [ + q(Yecuatla Totonac), + ], + q(6556) => [ + q(Talaud), + ], + q(6557) => [ + q(Telefol), + ], + q(6558) => [ + q(Tofanma), + ], + q(6559) => [ + q(Talinga-Bwisi), + ], + q(6560) => [ + q(Taloki), + ], + q(6561) => [ + q(Tetela), + ], + q(6562) => [ + q(Tolomako), + ], + q(6563) => [ + q(Talondo'), + ], + q(6564) => [ + q(Talodi), + ], + q(6565) => [ + q(Filomena Mata-Coahuitlan Totonac), + ], + q(6566) => [ + q(Tai Loi), + ], + q(6567) => [ + q(Talise), + ], + q(6568) => [ + q(Tambotalo), + ], + q(6569) => [ + q(Sou Nama), + q(Teluti), + ], + q(6570) => [ + q(Tulehu), + ], + q(6571) => [ + q(Taliabu), + ], + q(6572) => [ + q(Khehek), + ], + q(6573) => [ + q(Talysh), + ], + q(6574) => [ + q(Tama (Chad)), + ], + q(6575) => [ + q(Katbol), + q(Avava), + ], + q(6576) => [ + q(Tumak), + ], + q(6577) => [ + q(Haruai), + ], + q(6578) => [ + q(Tremembe), + ], + q(6579) => [ + q(Toba-Maskoy), + ], + q(6580) => [ + q(Ternateno), + ], + q(6581) => [ + q(Tutuba), + ], + q(6582) => [ + q(Samarokena), + ], + q(6583) => [ + q(Northwestern Tamang), + ], + q(6584) => [ + q(Tamnim Citak), + ], + q(6585) => [ + q(Tai Thanh), + ], + q(6586) => [ + q(Taman (Indonesia)), + ], + q(6587) => [ + q(Temoq), + ], + q(6588) => [ + q(Tumleo), + ], + q(6589) => [ + q(Jewish Babylonian Aramaic (ca. 200-1200 CE)), + ], + q(6590) => [ + q(Tima), + ], + q(6591) => [ + q(Tasmate), + ], + q(6592) => [ + q(Iau), + ], + q(6593) => [ + q(Tembo (Motembo)), + ], + q(6594) => [ + q(Temuan), + ], + q(6595) => [ + q(Tami), + ], + q(6596) => [ + q(Tamanaku), + ], + q(6597) => [ + q(Tacana), + ], + q(6598) => [ + q(Western Tunebo), + ], + q(6599) => [ + q(Tanimuca-Retuara), + ], + q(6600) => [ + q(Angosturas Tunebo), + ], + q(6601) => [ + q(Tobanga), + ], + q(6602) => [ + q(Maiani), + ], + q(6603) => [ + q(Tandia), + ], + q(6604) => [ + q(Kwamera), + ], + q(6605) => [ + q(Lenakel), + ], + q(6606) => [ + q(Tabla), + ], + q(6607) => [ + q(North Tanna), + ], + q(6608) => [ + q(Toromono), + ], + q(6609) => [ + q(Whitesands), + ], + q(6610) => [ + q(Taino), + ], + q(6611) => [ + q(Menik), + ], + q(6612) => [ + q(Tenis), + ], + q(6613) => [ + q(Tontemboan), + ], + q(6614) => [ + q(Tay Khang), + ], + q(6615) => [ + q(Tangchangya), + ], + q(6616) => [ + q(Tonsawang), + ], + q(6617) => [ + q(Tanema), + ], + q(6618) => [ + q(Tongwe), + ], + q(6619) => [ + q(Ten'edn), + ], + q(6620) => [ + q(Toba), + ], + q(6621) => [ + q(Coyutla Totonac), + ], + q(6622) => [ + q(Toma), + ], + q(6623) => [ + q(Gizrra), + ], + q(6624) => [ + q(Gitonga), + ], + q(6625) => [ + q(Tonga (Zambia)), + ], + q(6626) => [ + q(Tojolabal), + ], + q(6627) => [ + q(Tolowa), + ], + q(6628) => [ + q(Tombulu), + ], + q(6629) => [ + q(Xicotepec De Juarez Totonac), + ], + q(6630) => [ + q(Papantla Totonac), + ], + q(6631) => [ + q(Toposa), + ], + q(6632) => [ + q(Togbo-Vara Banda), + ], + q(6633) => [ + q(Highland Totonac), + ], + q(6634) => [ + q(Tho), + ], + q(6635) => [ + q(Upper Taromi), + ], + q(6636) => [ + q(Jemez), + ], + q(6637) => [ + q(Tobian), + ], + q(6638) => [ + q(Topoiyo), + ], + q(6639) => [ + q(To), + ], + q(6640) => [ + q(Taupota), + ], + q(6641) => [ + q(Azoyu Me'phaa), + q(Azoyu Tlapanec), + ], + q(6642) => [ + q(Tippera), + ], + q(6643) => [ + q(Tarpia), + ], + q(6644) => [ + q(Kula), + ], + q(6645) => [ + q(Tapiete), + ], + q(6646) => [ + q(Tupinikin), + ], + q(6647) => [ + q(Tlacoapa Me'phaa), + q(Tlacoapa Tlapanec), + ], + q(6648) => [ + q(Tampulma), + ], + q(6649) => [ + q(Tupinamba), + ], + q(6650) => [ + q(Tai Pao), + ], + q(6651) => [ + q(Pisaflores Tepehua), + ], + q(6652) => [ + q(Tukpa), + ], + q(6653) => [ + q(Tupari), + ], + q(6654) => [ + q(Tlachichilco Tepehua), + ], + q(6655) => [ + q(Tampuan), + ], + q(6656) => [ + q(Tanapag), + ], + q(6657) => [ + q(Tupi), + ], + q(6658) => [ + q(Acatepec Me'phaa), + q(Acatepec Tlapanec), + ], + q(6659) => [ + q(Trumai), + ], + q(6660) => [ + q(Tinputz), + ], + q(6661) => [ + q(Tembe), + ], + q(6662) => [ + q(Lehali), + ], + q(6663) => [ + q(Turumsa), + ], + q(6664) => [ + q(Tenino), + ], + q(6665) => [ + q(Toaripi), + ], + q(6666) => [ + q(Tomoip), + ], + q(6667) => [ + q(Tunni), + ], + q(6668) => [ + q(Torona), + ], + q(6669) => [ + q(Western Totonac), + ], + q(6670) => [ + q(Touo), + ], + q(6671) => [ + q(Tonkawa), + ], + q(6672) => [ + q(Tirahi), + ], + q(6673) => [ + q(Terebu), + ], + q(6674) => [ + q(Copala Triqui), + ], + q(6675) => [ + q(Turi), + ], + q(6676) => [ + q(East Tarangan), + ], + q(6677) => [ + q(Trinidadian Creole English), + ], + q(6678) => [ + q(Lishan Didan), + ], + q(6679) => [ + q(Turaka), + ], + q(6680) => [ + q(Trio), + ], + q(6681) => [ + q(Toram), + ], + q(6682) => [ + q(Traveller Scottish), + ], + q(6683) => [ + q(Tregami), + ], + q(6684) => [ + q(Trinitario), + ], + q(6685) => [ + q(Tarao Naga), + ], + q(6686) => [ + q(Kok Borok), + ], + q(6687) => [ + q(San Martin Itunyoso Triqui), + ], + q(6688) => [ + q(Taushiro), + ], + q(6689) => [ + q(Chicahuaxtla Triqui), + ], + q(6690) => [ + q(Tunggare), + ], + q(6691) => [ + q(Turoyo), + q(Surayt), + ], + q(6692) => [ + q(Taroko), + ], + q(6693) => [ + q(Torwali), + ], + q(6694) => [ + q(Tringgus-Sembaan Bidayuh), + ], + q(6695) => [ + q(Turung), + ], + q(6696) => [ + q(Tora), + ], + q(6697) => [ + q(Tsaangi), + ], + q(6698) => [ + q(Tsamai), + ], + q(6699) => [ + q(Tswa), + ], + q(6700) => [ + q(Tsakonian), + ], + q(6701) => [ + q(Tunisian Sign Language), + ], + q(6702) => [ + q(Tausug), + ], + q(6703) => [ + q(Tsuvan), + ], + q(6704) => [ + q(Tshangla), + ], + q(6705) => [ + q(Tseku), + ], + q(6706) => [ + q(Ts'un-Lao), + ], + q(6707) => [ + q(Turkish Sign Language), + q(Turk Isaret Dili), + ], + q(6708) => [ + q(Northern Toussian), + ], + q(6709) => [ + q(Thai Sign Language), + ], + q(6710) => [ + q(Akei), + ], + q(6711) => [ + q(Taiwan Sign Language), + ], + q(6712) => [ + q(Tondi Songway Kiini), + ], + q(6713) => [ + q(Tsou), + ], + q(6714) => [ + q(Tsogo), + ], + q(6715) => [ + q(Tsishingini), + ], + q(6716) => [ + q(Mubami), + ], + q(6717) => [ + q(Tebul Sign Language), + ], + q(6718) => [ + q(Purepecha), + ], + q(6719) => [ + q(Tutelo), + ], + q(6720) => [ + q(Gaa), + ], + q(6721) => [ + q(Tektiteko), + ], + q(6722) => [ + q(Tauade), + ], + q(6723) => [ + q(Bwanabwana), + ], + q(6724) => [ + q(Tuotomb), + ], + q(6725) => [ + q(Tutong), + ], + q(6726) => [ + q(Upper Ta'oih), + ], + q(6727) => [ + q(Tobati), + ], + q(6728) => [ + q(Tooro), + ], + q(6729) => [ + q(Totoro), + ], + q(6730) => [ + q(Totela), + ], + q(6731) => [ + q(Northern Tutchone), + ], + q(6732) => [ + q(Towei), + ], + q(6733) => [ + q(Lower Ta'oih), + ], + q(6734) => [ + q(Tombelala), + ], + q(6735) => [ + q(Tawallammat Tamajaq), + ], + q(6736) => [ + q(Tera), + ], + q(6737) => [ + q(Northeastern Thai), + ], + q(6738) => [ + q(Muslim Tat), + ], + q(6739) => [ + q(Torau), + ], + q(6740) => [ + q(Titan), + ], + q(6741) => [ + q(Long Wat), + ], + q(6742) => [ + q(Sikaritai), + ], + q(6743) => [ + q(Tsum), + ], + q(6744) => [ + q(Wiarumus), + ], + q(6745) => [ + q(Tubatulabal), + ], + q(6746) => [ + q(Mutu), + ], + q(6747) => [ + q(Tuxa), + ], + q(6748) => [ + q(Tuyuca), + ], + q(6749) => [ + q(Central Tunebo), + ], + q(6750) => [ + q(Tunia), + ], + q(6751) => [ + q(Taulil), + ], + q(6752) => [ + q(Tupuri), + ], + q(6753) => [ + q(Tugutil), + ], + q(6754) => [ + q(Tula), + ], + q(6755) => [ + q(Tunica), + ], + q(6756) => [ + q(Tucano), + ], + q(6757) => [ + q(Tedaga), + ], + q(6758) => [ + q(Tuscarora), + ], + q(6759) => [ + q(Tututni), + ], + q(6760) => [ + q(Turkana), + ], + q(6761) => [ + q(Tuxinawa), + ], + q(6762) => [ + q(Tugen), + ], + q(6763) => [ + q(Turka), + ], + q(6764) => [ + q(Vaghua), + ], + q(6765) => [ + q(Tsuvadi), + ], + q(6766) => [ + q(Te'un), + ], + q(6767) => [ + q(Southeast Ambrym), + ], + q(6768) => [ + q(Tela-Masbuar), + ], + q(6769) => [ + q(Tavoyan), + ], + q(6770) => [ + q(Tidore), + ], + q(6771) => [ + q(Taveta), + ], + q(6772) => [ + q(Tutsa Naga), + ], + q(6773) => [ + q(Tunen), + ], + q(6774) => [ + q(Sedoa), + ], + q(6775) => [ + q(Timor Pidgin), + ], + q(6776) => [ + q(Twana), + ], + q(6777) => [ + q(Western Tawbuid), + ], + q(6778) => [ + q(Teshenawa), + ], + q(6779) => [ + q(Twents), + ], + q(6780) => [ + q(Tewa (Indonesia)), + ], + q(6781) => [ + q(Northern Tiwa), + ], + q(6782) => [ + q(Tereweng), + ], + q(6783) => [ + q(Tai Don), + ], + q(6784) => [ + q(Tawara), + ], + q(6785) => [ + q(Tawang Monpa), + ], + q(6786) => [ + q(Twendi), + ], + q(6787) => [ + q(Tswapong), + ], + q(6788) => [ + q(Ere), + ], + q(6789) => [ + q(Tasawaq), + ], + q(6790) => [ + q(Southwestern Tarahumara), + ], + q(6791) => [ + q(Turiwara), + ], + q(6792) => [ + q(Termanu), + ], + q(6793) => [ + q(Tuwari), + ], + q(6794) => [ + q(Tewe), + ], + q(6795) => [ + q(Tawoyan), + ], + q(6796) => [ + q(Tombonuo), + ], + q(6797) => [ + q(Tokharian B), + ], + q(6798) => [ + q(Tsetsaut), + ], + q(6799) => [ + q(Totoli), + ], + q(6800) => [ + q(Tangut), + ], + q(6801) => [ + q(Thracian), + ], + q(6802) => [ + q(Ikpeng), + ], + q(6803) => [ + q(Tarjumo), + ], + q(6804) => [ + q(Tomini), + ], + q(6805) => [ + q(West Tarangan), + ], + q(6806) => [ + q(Toto), + ], + q(6807) => [ + q(Tii), + ], + q(6808) => [ + q(Tartessian), + ], + q(6809) => [ + q(Tonsea), + ], + q(6810) => [ + q(Citak), + ], + q(6811) => [ + q(Kayapo), + ], + q(6812) => [ + q(Tatana), + ], + q(6813) => [ + q(Tanosy Malagasy), + ], + q(6814) => [ + q(Tauya), + ], + q(6815) => [ + q(Kyanga), + ], + q(6816) => [ + q(O'du), + ], + q(6817) => [ + q(Teke-Tsaayi), + ], + q(6818) => [ + q(Tai Do), + q(Tai Yo), + ], + q(6819) => [ + q(Thu Lao), + ], + q(6820) => [ + q(Kombai), + ], + q(6821) => [ + q(Thaypan), + ], + q(6822) => [ + q(Tai Daeng), + ], + q(6823) => [ + q(Tay Sa Pa), + ], + q(6824) => [ + q(Tay Tac), + ], + q(6825) => [ + q(Kua), + ], + q(6826) => [ + q(Teke-Tyee), + ], + q(6827) => [ + q(Tay), + ], + q(6828) => [ + q(Tanzanian Sign Language), + ], + q(6829) => [ + q(Tzeltal), + ], + q(6830) => [ + q(Tz'utujil), + ], + q(6831) => [ + q(Talossan), + ], + q(6832) => [ + q(Central Atlas Tamazight), + ], + q(6833) => [ + q(Tugun), + ], + q(6834) => [ + q(Tzotzil), + ], + q(6835) => [ + q(Tabriak), + ], + q(6836) => [ + q(Uamue), + ], + q(6837) => [ + q(Kuan), + ], + q(6838) => [ + q(Tairuma), + ], + q(6839) => [ + q(Ubang), + ], + q(6840) => [ + q(Ubi), + ], + q(6841) => [ + q(Buhi'non Bikol), + ], + q(6842) => [ + q(Ubir), + ], + q(6843) => [ + q(Umbu-Ungu), + ], + q(6844) => [ + q(Ubykh), + ], + q(6845) => [ + q(Uda), + ], + q(6846) => [ + q(Udihe), + ], + q(6847) => [ + q(Muduga), + ], + q(6848) => [ + q(Udi), + ], + q(6849) => [ + q(Ujir), + ], + q(6850) => [ + q(Wuzlam), + ], + q(6851) => [ + q(Uduk), + ], + q(6852) => [ + q(Kioko), + ], + q(6853) => [ + q(Ufim), + ], + q(6854) => [ + q(Kuku-Ugbanh), + ], + q(6855) => [ + q(Ughele), + ], + q(6856) => [ + q(Ugandan Sign Language), + ], + q(6857) => [ + q(Ugong), + ], + q(6858) => [ + q(Uruguayan Sign Language), + ], + q(6859) => [ + q(Uhami), + ], + q(6860) => [ + q(Damal), + ], + q(6861) => [ + q(Uisai), + ], + q(6862) => [ + q(Iyive), + ], + q(6863) => [ + q(Tanjijili), + ], + q(6864) => [ + q(Kaburi), + ], + q(6865) => [ + q(Ukuriguma), + ], + q(6866) => [ + q(Ukhwejo), + ], + q(6867) => [ + q(Muak Sa-aak), + ], + q(6868) => [ + q(Ukrainian Sign Language), + ], + q(6869) => [ + q(Ukpe-Bayobiri), + ], + q(6870) => [ + q(Ukwa), + ], + q(6871) => [ + q(Urubu-Kaapor Sign Language), + q(Kaapor Sign Language), + ], + q(6872) => [ + q(Ukue), + ], + q(6873) => [ + q(Ukwuani-Aboh-Ndoni), + ], + q(6874) => [ + q(Kuuk-Yak), + ], + q(6875) => [ + q(Fungwa), + ], + q(6876) => [ + q(Ulukwumi), + ], + q(6877) => [ + q(Ulch), + ], + q(6878) => [ + q(Lule), + ], + q(6879) => [ + q(Usku), + q(Afra), + ], + q(6880) => [ + q(Ulithian), + ], + q(6881) => [ + q(Meriam), + ], + q(6882) => [ + q(Ullatan), + ], + q(6883) => [ + q(Ulumanda'), + ], + q(6884) => [ + q(Unserdeutsch), + ], + q(6885) => [ + q(Uma' Lung), + ], + q(6886) => [ + q(Ulwa), + ], + q(6887) => [ + q(Umatilla), + ], + q(6888) => [ + q(Marrucinian), + ], + q(6889) => [ + q(Umbindhamu), + ], + q(6890) => [ + q(Umbuygamu), + ], + q(6891) => [ + q(Ukit), + ], + q(6892) => [ + q(Umon), + ], + q(6893) => [ + q(Makyan Naga), + ], + q(6894) => [ + q(Umotina), + ], + q(6895) => [ + q(Umpila), + ], + q(6896) => [ + q(Umbugarla), + ], + q(6897) => [ + q(Pendau), + ], + q(6898) => [ + q(Munsee), + ], + q(6899) => [ + q(North Watut), + ], + q(6900) => [ + q(Uneme), + ], + q(6901) => [ + q(Ngarinyin), + ], + q(6902) => [ + q(Enawene-Nawe), + ], + q(6903) => [ + q(Unami), + ], + q(6904) => [ + q(Kurnai), + ], + q(6905) => [ + q(Mundari), + ], + q(6906) => [ + q(Unubahe), + ], + q(6907) => [ + q(Munda), + ], + q(6908) => [ + q(Unde Kaili), + ], + q(6909) => [ + q(Umeda), + ], + q(6910) => [ + q(Uripiv-Wala-Rano-Atchin), + ], + q(6911) => [ + q(Urarina), + ], + q(6912) => [ + q(Urubu-Kaapor), + q(Kaapor), + ], + q(6913) => [ + q(Urningangg), + ], + q(6914) => [ + q(Uru), + ], + q(6915) => [ + q(Uradhi), + ], + q(6916) => [ + q(Urigina), + ], + q(6917) => [ + q(Urhobo), + ], + q(6918) => [ + q(Urim), + ], + q(6919) => [ + q(Urak Lawoi'), + ], + q(6920) => [ + q(Urali), + ], + q(6921) => [ + q(Urapmin), + ], + q(6922) => [ + q(Uruangnirin), + ], + q(6923) => [ + q(Ura (Papua New Guinea)), + ], + q(6924) => [ + q(Uru-Pa-In), + ], + q(6925) => [ + q(Lehalurup), + q(Loyop), + ], + q(6926) => [ + q(Urat), + ], + q(6927) => [ + q(Urumi), + ], + q(6928) => [ + q(Uruava), + ], + q(6929) => [ + q(Sop), + ], + q(6930) => [ + q(Urimo), + ], + q(6931) => [ + q(Orya), + ], + q(6932) => [ + q(Uru-Eu-Wau-Wau), + ], + q(6933) => [ + q(Usarufa), + ], + q(6934) => [ + q(Ushojo), + ], + q(6935) => [ + q(Usui), + ], + q(6936) => [ + q(Usaghade), + ], + q(6937) => [ + q(Uspanteco), + ], + q(6938) => [ + q(Uya), + ], + q(6939) => [ + q(Otank), + ], + q(6940) => [ + q(Ute-Southern Paiute), + ], + q(6941) => [ + q(Amba (Solomon Islands)), + ], + q(6942) => [ + q(Etulo), + ], + q(6943) => [ + q(Utu), + ], + q(6944) => [ + q(Urum), + ], + q(6945) => [ + q(Kulon-Pazeh), + ], + q(6946) => [ + q(Ura (Vanuatu)), + ], + q(6947) => [ + q(U), + ], + q(6948) => [ + q(West Uvean), + q(Fagauvea), + ], + q(6949) => [ + q(Uri), + ], + q(6950) => [ + q(Lote), + ], + q(6951) => [ + q(Kuku-Uwanh), + ], + q(6952) => [ + q(Doko-Uyanga), + ], + q(6953) => [ + q(Northern Uzbek), + ], + q(6954) => [ + q(Southern Uzbek), + ], + q(6955) => [ + q(Vaagri Booli), + ], + q(6956) => [ + q(Vale), + ], + q(6957) => [ + q(Vafsi), + ], + q(6958) => [ + q(Vagla), + ], + q(6959) => [ + q(Varhadi-Nagpuri), + ], + q(6960) => [ + q(Sekele), + q(Northwestern Kung), + q(Vasekele), + ], + q(6961) => [ + q(Vehes), + ], + q(6962) => [ + q(Vanimo), + ], + q(6963) => [ + q(Valman), + ], + q(6964) => [ + q(Vao), + ], + q(6965) => [ + q(Vaiphei), + ], + q(6966) => [ + q(Huarijio), + ], + q(6967) => [ + q(Vasavi), + ], + q(6968) => [ + q(Vanuma), + ], + q(6969) => [ + q(Varli), + ], + q(6970) => [ + q(Wayu), + ], + q(6971) => [ + q(Southeast Babar), + ], + q(6972) => [ + q(Southwestern Bontok), + ], + q(6973) => [ + q(Venetian), + ], + q(6974) => [ + q(Veddah), + ], + q(6975) => [ + q(Veluws), + ], + q(6976) => [ + q(Vemgo-Mabas), + ], + q(6977) => [ + q(Ventureno), + ], + q(6978) => [ + q(Veps), + ], + q(6979) => [ + q(Mom Jango), + ], + q(6980) => [ + q(Vaghri), + ], + q(6981) => [ + q(Vlaamse Gebarentaal), + q(Flemish Sign Language), + ], + q(6982) => [ + q(Virgin Islands Creole English), + ], + q(6983) => [ + q(Vidunda), + ], + q(6984) => [ + q(Vili), + ], + q(6985) => [ + q(Viemo), + ], + q(6986) => [ + q(Vilela), + ], + q(6987) => [ + q(Vinza), + ], + q(6988) => [ + q(Vishavan), + ], + q(6989) => [ + q(Viti), + ], + q(6990) => [ + q(Iduna), + ], + q(6991) => [ + q(Kariyarra), + ], + q(6992) => [ + q(Ija-Zuba), + ], + q(6993) => [ + q(Kujarge), + ], + q(6994) => [ + q(Kaur), + ], + q(6995) => [ + q(Kulisusu), + ], + q(6996) => [ + q(Kamakan), + ], + q(6997) => [ + q(Kodeoha), + ], + q(6998) => [ + q(Korlai Creole Portuguese), + ], + q(6999) => [ + q(Tenggarong Kutai Malay), + ], + q(7000) => [ + q(Kurrama), + ], + q(7001) => [ + q(Valpei), + ], + q(7002) => [ + q(Vlaams), + ], + q(7003) => [ + q(Martuyhunira), + ], + q(7004) => [ + q(Barbaram), + ], + q(7005) => [ + q(Juxtlahuaca Mixtec), + ], + q(7006) => [ + q(Mudu Koraga), + ], + q(7007) => [ + q(East Masela), + ], + q(7008) => [ + q(Mainfrankisch), + ], + q(7009) => [ + q(Lungalunga), + ], + q(7010) => [ + q(Maraghei), + ], + q(7011) => [ + q(Miwa), + ], + q(7012) => [ + q(Ixtayutla Mixtec), + ], + q(7013) => [ + q(Makhuwa-Shirima), + ], + q(7014) => [ + q(Malgana), + ], + q(7015) => [ + q(Mitlatongo Mixtec), + ], + q(7016) => [ + q(Soyaltepec Mazatec), + ], + q(7017) => [ + q(Soyaltepec Mixtec), + ], + q(7018) => [ + q(Marenje), + ], + q(7019) => [ + q(Moksela), + ], + q(7020) => [ + q(Muluridyi), + ], + q(7021) => [ + q(Valley Maidu), + ], + q(7022) => [ + q(Makhuwa), + ], + q(7023) => [ + q(Tamazola Mixtec), + ], + q(7024) => [ + q(Ayautla Mazatec), + ], + q(7025) => [ + q(Mazatlan Mazatec), + ], + q(7026) => [ + q(Vano), + q(Lovono), + ], + q(7027) => [ + q(Vinmavis), + q(Neve'ei), + ], + q(7028) => [ + q(Vunapu), + ], + q(7029) => [ + q(Voro), + ], + q(7030) => [ + q(Vera'a), + ], + q(7031) => [ + q(Varisi), + ], + q(7032) => [ + q(Burmbar), + q(Banam Bay), + ], + q(7033) => [ + q(Moldova Sign Language), + ], + q(7034) => [ + q(Venezuelan Sign Language), + ], + q(7035) => [ + q(Valencian Sign Language), + q(Llengua de signes valenciana), + ], + q(7036) => [ + q(Vitou), + ], + q(7037) => [ + q(Vumbu), + ], + q(7038) => [ + q(Vunjo), + ], + q(7039) => [ + q(Vute), + ], + q(7040) => [ + q(Awa (China)), + ], + q(7041) => [ + q(Walla Walla), + ], + q(7042) => [ + q(Wab), + ], + q(7043) => [ + q(Wasco-Wishram), + ], + q(7044) => [ + q(Wandamen), + ], + q(7045) => [ + q(Walser), + ], + q(7046) => [ + q(Wakona), + ], + q(7047) => [ + q(Wa'ema), + ], + q(7048) => [ + q(Watubela), + ], + q(7049) => [ + q(Wares), + ], + q(7050) => [ + q(Waffa), + ], + q(7051) => [ + q(Wampanoag), + ], + q(7052) => [ + q(Wan), + ], + q(7053) => [ + q(Wappo), + ], + q(7054) => [ + q(Wapishana), + ], + q(7055) => [ + q(Wageman), + ], + q(7056) => [ + q(Kaninuwa), + ], + q(7057) => [ + q(Waura), + ], + q(7058) => [ + q(Waka), + ], + q(7059) => [ + q(Waiwai), + ], + q(7060) => [ + q(Watam), + q(Marangis), + ], + q(7061) => [ + q(Wayana), + ], + q(7062) => [ + q(Wampur), + ], + q(7063) => [ + q(Warao), + ], + q(7064) => [ + q(Wabo), + ], + q(7065) => [ + q(Waritai), + ], + q(7066) => [ + q(Wanda), + ], + q(7067) => [ + q(Vwanji), + ], + q(7068) => [ + q(Alagwa), + ], + q(7069) => [ + q(Waigali), + ], + q(7070) => [ + q(Wakhi), + ], + q(7071) => [ + q(Wa), + ], + q(7072) => [ + q(Warlpiri), + ], + q(7073) => [ + q(Waddar), + ], + q(7074) => [ + q(Wagdi), + ], + q(7075) => [ + q(West Bengal Sign Language), + ], + q(7076) => [ + q(Wanman), + ], + q(7077) => [ + q(Wajarri), + ], + q(7078) => [ + q(Woi), + ], + q(7079) => [ + q(Yanomami), + ], + q(7080) => [ + q(Waci Gbe), + ], + q(7081) => [ + q(Wandji), + ], + q(7082) => [ + q(Wadaginam), + ], + q(7083) => [ + q(Wadjiginy), + ], + q(7084) => [ + q(Wadikali), + ], + q(7085) => [ + q(Wadjigu), + ], + q(7086) => [ + q(Wadjabangayi), + ], + q(7087) => [ + q(Wewaw), + ], + q(7088) => [ + q(We Western), + ], + q(7089) => [ + q(Wedau), + ], + q(7090) => [ + q(Wergaia), + ], + q(7091) => [ + q(Weh), + ], + q(7092) => [ + q(Kiunum), + ], + q(7093) => [ + q(Weme Gbe), + ], + q(7094) => [ + q(Wemale), + ], + q(7095) => [ + q(Westphalien), + ], + q(7096) => [ + q(Weri), + ], + q(7097) => [ + q(Cameroon Pidgin), + ], + q(7098) => [ + q(Perai), + ], + q(7099) => [ + q(Rawngtu Chin), + ], + q(7100) => [ + q(Wejewa), + ], + q(7101) => [ + q(Yafi), + q(Zorop), + ], + q(7102) => [ + q(Wagaya), + ], + q(7103) => [ + q(Wagawaga), + ], + q(7104) => [ + q(Wangganguru), + ], + q(7105) => [ + q(Wahgi), + ], + q(7106) => [ + q(Waigeo), + ], + q(7107) => [ + q(Wirangu), + ], + q(7108) => [ + q(Warrgamay), + ], + q(7109) => [ + q(Sou Upaa), + q(Manusela), + ], + q(7110) => [ + q(North Wahgi), + ], + q(7111) => [ + q(Wahau Kenyah), + ], + q(7112) => [ + q(Wahau Kayan), + ], + q(7113) => [ + q(Southern Toussian), + ], + q(7114) => [ + q(Wichita), + ], + q(7115) => [ + q(Wik-Epa), + ], + q(7116) => [ + q(Wik-Keyangan), + ], + q(7117) => [ + q(Wik-Ngathana), + ], + q(7118) => [ + q(Wik-Me'anha), + ], + q(7119) => [ + q(Minidien), + ], + q(7120) => [ + q(Wik-Iiyanh), + ], + q(7121) => [ + q(Wikalkan), + ], + q(7122) => [ + q(Wilawila), + ], + q(7123) => [ + q(Wik-Mungkan), + ], + q(7124) => [ + q(Ho-Chunk), + ], + q(7125) => [ + q(Wirafed), + ], + q(7126) => [ + q(Wiru), + ], + q(7127) => [ + q(Vitu), + ], + q(7128) => [ + q(Wiyot), + ], + q(7129) => [ + q(Waja), + ], + q(7130) => [ + q(Warji), + ], + q(7131) => [ + q(Kw'adza), + ], + q(7132) => [ + q(Kumbaran), + ], + q(7133) => [ + q(Wakde), + q(Mo), + ], + q(7134) => [ + q(Kalanadi), + ], + q(7135) => [ + q(Kunduvadi), + ], + q(7136) => [ + q(Wakawaka), + ], + q(7137) => [ + q(Wangkayutyuru), + ], + q(7138) => [ + q(Walio), + ], + q(7139) => [ + q(Mwali Comorian), + ], + q(7140) => [ + q(Wolane), + ], + q(7141) => [ + q(Kunbarlang), + ], + q(7142) => [ + q(Waioli), + ], + q(7143) => [ + q(Wailaki), + ], + q(7144) => [ + q(Wali (Sudan)), + ], + q(7145) => [ + q(Middle Welsh), + ], + q(7146) => [ + q(Wolio), + ], + q(7147) => [ + q(Wailapa), + ], + q(7148) => [ + q(Wallisian), + ], + q(7149) => [ + q(Wuliwuli), + ], + q(7150) => [ + q(Wichi Lhamtes Vejoz), + ], + q(7151) => [ + q(Walak), + ], + q(7152) => [ + q(Wali (Ghana)), + ], + q(7153) => [ + q(Waling), + ], + q(7154) => [ + q(Mawa (Nigeria)), + ], + q(7155) => [ + q(Wambaya), + ], + q(7156) => [ + q(Wamas), + ], + q(7157) => [ + q(Mamainde), + ], + q(7158) => [ + q(Wambule), + ], + q(7159) => [ + q(Waima'a), + ], + q(7160) => [ + q(Wamin), + ], + q(7161) => [ + q(Maiwa (Indonesia)), + ], + q(7162) => [ + q(Waamwang), + ], + q(7163) => [ + q(Wom (Papua New Guinea)), + ], + q(7164) => [ + q(Wambon), + ], + q(7165) => [ + q(Walmajarri), + ], + q(7166) => [ + q(Mwani), + ], + q(7167) => [ + q(Womo), + ], + q(7168) => [ + q(Wanambre), + ], + q(7169) => [ + q(Wantoat), + ], + q(7170) => [ + q(Wandarang), + ], + q(7171) => [ + q(Waneci), + ], + q(7172) => [ + q(Wanggom), + ], + q(7173) => [ + q(Ndzwani Comorian), + ], + q(7174) => [ + q(Wanukaka), + ], + q(7175) => [ + q(Wanggamala), + ], + q(7176) => [ + q(Wunumara), + ], + q(7177) => [ + q(Wano), + ], + q(7178) => [ + q(Wanap), + ], + q(7179) => [ + q(Usan), + ], + q(7180) => [ + q(Wintu), + ], + q(7181) => [ + q(Wanyi), + ], + q(7182) => [ + q(Tyaraity), + ], + q(7183) => [ + q(We Northern), + ], + q(7184) => [ + q(Wogeo), + ], + q(7185) => [ + q(Wolani), + ], + q(7186) => [ + q(Woleaian), + ], + q(7187) => [ + q(Gambian Wolof), + ], + q(7188) => [ + q(Wogamusin), + ], + q(7189) => [ + q(Kamang), + ], + q(7190) => [ + q(Longto), + ], + q(7191) => [ + q(Wom (Nigeria)), + ], + q(7192) => [ + q(Wongo), + ], + q(7193) => [ + q(Manombai), + ], + q(7194) => [ + q(Woria), + ], + q(7195) => [ + q(Hanga Hundi), + ], + q(7196) => [ + q(Wawonii), + ], + q(7197) => [ + q(Weyto), + ], + q(7198) => [ + q(Maco), + ], + q(7199) => [ + q(Warapu), + ], + q(7200) => [ + q(Warluwara), + ], + q(7201) => [ + q(Warduji), + ], + q(7202) => [ + q(Warungu), + ], + q(7203) => [ + q(Wiradhuri), + ], + q(7204) => [ + q(Wariyangga), + ], + q(7205) => [ + q(Garrwa), + ], + q(7206) => [ + q(Warlmanpa), + ], + q(7207) => [ + q(Warumungu), + ], + q(7208) => [ + q(Warnang), + ], + q(7209) => [ + q(Worrorra), + ], + q(7210) => [ + q(Waropen), + ], + q(7211) => [ + q(Wardaman), + ], + q(7212) => [ + q(Waris), + ], + q(7213) => [ + q(Waru), + ], + q(7214) => [ + q(Waruna), + ], + q(7215) => [ + q(Gugu Warra), + ], + q(7216) => [ + q(Wae Rana), + ], + q(7217) => [ + q(Merwari), + ], + q(7218) => [ + q(Waray (Australia)), + ], + q(7219) => [ + q(Warembori), + ], + q(7220) => [ + q(Adilabad Gondi), + ], + q(7221) => [ + q(Wusi), + ], + q(7222) => [ + q(Waskia), + ], + q(7223) => [ + q(Owenia), + ], + q(7224) => [ + q(Wasa), + ], + q(7225) => [ + q(Wasu), + ], + q(7226) => [ + q(Wotapuri-Katarqalai), + ], + q(7227) => [ + q(Watiwa), + ], + q(7228) => [ + q(Wathawurrung), + ], + q(7229) => [ + q(Berta), + ], + q(7230) => [ + q(Watakataui), + ], + q(7231) => [ + q(Mewati), + ], + q(7232) => [ + q(Wotu), + ], + q(7233) => [ + q(Wikngenchera), + ], + q(7234) => [ + q(Wunambal), + ], + q(7235) => [ + q(Wudu), + ], + q(7236) => [ + q(Wutunhua), + ], + q(7237) => [ + q(Silimo), + ], + q(7238) => [ + q(Wumbvu), + ], + q(7239) => [ + q(Bungu), + ], + q(7240) => [ + q(Wurrugu), + ], + q(7241) => [ + q(Wutung), + ], + q(7242) => [ + q(Wu Chinese), + ], + q(7243) => [ + q(Wuvulu-Aua), + ], + q(7244) => [ + q(Wulna), + ], + q(7245) => [ + q(Wauyai), + ], + q(7246) => [ + q(Waama), + ], + q(7247) => [ + q(Wakabunga), + ], + q(7248) => [ + q(Wetamut), + q(Dorig), + ], + q(7249) => [ + q(Warrwa), + ], + q(7250) => [ + q(Wawa), + ], + q(7251) => [ + q(Waxianghua), + ], + q(7252) => [ + q(Wardandi), + ], + q(7253) => [ + q(Wyandot), + ], + q(7254) => [ + q(Wangaaybuwan-Ngiyambaa), + ], + q(7255) => [ + q(Woiwurrung), + ], + q(7256) => [ + q(Wymysorys), + ], + q(7257) => [ + q(Wayoro), + ], + q(7258) => [ + q(Western Fijian), + ], + q(7259) => [ + q(Andalusian Arabic), + ], + q(7260) => [ + q(Sambe), + ], + q(7261) => [ + q(Kachari), + ], + q(7262) => [ + q(Adai), + ], + q(7263) => [ + q(Aequian), + ], + q(7264) => [ + q(Aghwan), + ], + q(7265) => [ + q(Kaimbe), + ], + q(7266) => [ + q(Ararandewara), + ], + q(7267) => [ + q(Maku), + ], + q(7268) => [ + q(/Xam), + q(Xam), + ], + q(7269) => [ + q(Xamtanga), + ], + q(7270) => [ + q(Khao), + ], + q(7271) => [ + q(Apalachee), + ], + q(7272) => [ + q(Aquitanian), + ], + q(7273) => [ + q(Karami), + ], + q(7274) => [ + q(Kamas), + ], + q(7275) => [ + q(Katawixi), + ], + q(7276) => [ + q(Kauwera), + ], + q(7277) => [ + q(Xavante), + ], + q(7278) => [ + q(Kawaiisu), + ], + q(7279) => [ + q(Kayan Mahakam), + ], + q(7280) => [ + q(Lower Burdekin), + ], + q(7281) => [ + q(Bactrian), + ], + q(7282) => [ + q(Bindal), + ], + q(7283) => [ + q(Bigambal), + ], + q(7284) => [ + q(Bunganditj), + ], + q(7285) => [ + q(Kombio), + ], + q(7286) => [ + q(Birrpayi), + ], + q(7287) => [ + q(Middle Breton), + ], + q(7288) => [ + q(Kenaboi), + ], + q(7289) => [ + q(Bolgarian), + ], + q(7290) => [ + q(Bibbulman), + ], + q(7291) => [ + q(Kambera), + ], + q(7292) => [ + q(Kambiwa), + ], + q(7293) => [ + q(Batyala), + ], + q(7294) => [ + q(Cumbric), + ], + q(7295) => [ + q(Camunic), + ], + q(7296) => [ + q(Celtiberian), + ], + q(7297) => [ + q(Cisalpine Gaulish), + ], + q(7298) => [ + q(Chemakum), + q(Chimakum), + ], + q(7299) => [ + q(Classical Armenian), + ], + q(7300) => [ + q(Comecrudo), + ], + q(7301) => [ + q(Cotoname), + ], + q(7302) => [ + q(Chorasmian), + ], + q(7303) => [ + q(Carian), + ], + q(7304) => [ + q(Classical Tibetan), + ], + q(7305) => [ + q(Curonian), + ], + q(7306) => [ + q(Chuvantsy), + ], + q(7307) => [ + q(Coahuilteco), + ], + q(7308) => [ + q(Cayuse), + ], + q(7309) => [ + q(Darkinyung), + ], + q(7310) => [ + q(Dacian), + ], + q(7311) => [ + q(Dharuk), + ], + q(7312) => [ + q(Edomite), + ], + q(7313) => [ + q(Kwandu), + ], + q(7314) => [ + q(Malayic Dayak), + ], + q(7315) => [ + q(Eblan), + ], + q(7316) => [ + q(Hdi), + ], + q(7317) => [ + q(//Xegwi), + q(Xegwi), + ], + q(7318) => [ + q(Kelo), + ], + q(7319) => [ + q(Kembayan), + ], + q(7320) => [ + q(Epi-Olmec), + ], + q(7321) => [ + q(Xerente), + ], + q(7322) => [ + q(Kesawai), + ], + q(7323) => [ + q(Xeta), + ], + q(7324) => [ + q(Keoru-Ahia), + ], + q(7325) => [ + q(Faliscan), + ], + q(7326) => [ + q(Galatian), + ], + q(7327) => [ + q(Gbin), + ], + q(7328) => [ + q(Gudang), + ], + q(7329) => [ + q(Gabrielino-Fernandeno), + ], + q(7330) => [ + q(Goreng), + ], + q(7331) => [ + q(Garingbal), + ], + q(7332) => [ + q(Galindan), + ], + q(7333) => [ + q(Dharumbal), + q(Guwinmal), + ], + q(7334) => [ + q(Garza), + ], + q(7335) => [ + q(Unggumi), + ], + q(7336) => [ + q(Guwa), + ], + q(7337) => [ + q(Harami), + ], + q(7338) => [ + q(Hunnic), + ], + q(7339) => [ + q(Hadrami), + ], + q(7340) => [ + q(Khetrani), + ], + q(7341) => [ + q(Hernican), + ], + q(7342) => [ + q(Hattic), + ], + q(7343) => [ + q(Hurrian), + ], + q(7344) => [ + q(Khua), + ], + q(7345) => [ + q(Iberian), + ], + q(7346) => [ + q(Xiri), + ], + q(7347) => [ + q(Illyrian), + ], + q(7348) => [ + q(Xinca), + ], + q(7349) => [ + q(Xiriana), + ], + q(7350) => [ + q(Kisan), + ], + q(7351) => [ + q(Indus Valley Language), + ], + q(7352) => [ + q(Xipaya), + ], + q(7353) => [ + q(Minjungbal), + ], + q(7354) => [ + q(Jaitmatang), + ], + q(7355) => [ + q(Kalkoti), + ], + q(7356) => [ + q(Northern Nago), + ], + q(7357) => [ + q(Kho'ini), + ], + q(7358) => [ + q(Mendalam Kayan), + ], + q(7359) => [ + q(Kereho), + ], + q(7360) => [ + q(Khengkha), + ], + q(7361) => [ + q(Kagoro), + ], + q(7362) => [ + q(Kenyan Sign Language), + ], + q(7363) => [ + q(Kajali), + ], + q(7364) => [ + q(Kaco'), + ], + q(7365) => [ + q(Mainstream Kenyah), + ], + q(7366) => [ + q(Kayan River Kayan), + ], + q(7367) => [ + q(Kiorr), + ], + q(7368) => [ + q(Kabatei), + ], + q(7369) => [ + q(Koroni), + ], + q(7370) => [ + q(Xakriaba), + ], + q(7371) => [ + q(Kumbewaha), + ], + q(7372) => [ + q(Kantosi), + ], + q(7373) => [ + q(Kaamba), + ], + q(7374) => [ + q(Kgalagadi), + ], + q(7375) => [ + q(Kembra), + ], + q(7376) => [ + q(Karore), + ], + q(7377) => [ + q(Uma' Lasan), + ], + q(7378) => [ + q(Kurtokha), + ], + q(7379) => [ + q(Kamula), + ], + q(7380) => [ + q(Loup B), + ], + q(7381) => [ + q(Lycian), + ], + q(7382) => [ + q(Lydian), + ], + q(7383) => [ + q(Lemnian), + ], + q(7384) => [ + q(Ligurian (Ancient)), + ], + q(7385) => [ + q(Liburnian), + ], + q(7386) => [ + q(Alanic), + ], + q(7387) => [ + q(Loup A), + ], + q(7388) => [ + q(Lepontic), + ], + q(7389) => [ + q(Lusitanian), + ], + q(7390) => [ + q(Cuneiform Luwian), + ], + q(7391) => [ + q(Elymian), + ], + q(7392) => [ + q(Mushungulu), + ], + q(7393) => [ + q(Mbonga), + ], + q(7394) => [ + q(Makhuwa-Marrevone), + ], + q(7395) => [ + q(Mbudum), + ], + q(7396) => [ + q(Median), + ], + q(7397) => [ + q(Mingrelian), + ], + q(7398) => [ + q(Mengaka), + ], + q(7399) => [ + q(Kuku-Muminh), + ], + q(7400) => [ + q(Majera), + ], + q(7401) => [ + q(Ancient Macedonian), + ], + q(7402) => [ + q(Malaysian Sign Language), + ], + q(7403) => [ + q(Manado Malay), + ], + q(7404) => [ + q(Manichaean Middle Persian), + ], + q(7405) => [ + q(Morerebi), + ], + q(7406) => [ + q(Kuku-Mu'inh), + ], + q(7407) => [ + q(Kuku-Mangk), + ], + q(7408) => [ + q(Meroitic), + ], + q(7409) => [ + q(Moroccan Sign Language), + ], + q(7410) => [ + q(Matbat), + ], + q(7411) => [ + q(Kamu), + ], + q(7412) => [ + q(Antankarana Malagasy), + q(Tankarana Malagasy), + ], + q(7413) => [ + q(Tsimihety Malagasy), + ], + q(7414) => [ + q(Maden), + ], + q(7415) => [ + q(Mayaguduna), + ], + q(7416) => [ + q(Mori Bawah), + ], + q(7417) => [ + q(Ancient North Arabian), + ], + q(7418) => [ + q(Kanakanabu), + ], + q(7419) => [ + q(Middle Mongolian), + ], + q(7420) => [ + q(Kuanhua), + ], + q(7421) => [ + q(Ngarigu), + ], + q(7422) => [ + q(Nganakarti), + ], + q(7423) => [ + q(Northern Kankanay), + ], + q(7424) => [ + q(Anglo-Norman), + ], + q(7425) => [ + q(Kangri), + ], + q(7426) => [ + q(Kanashi), + ], + q(7427) => [ + q(Narragansett), + ], + q(7428) => [ + q(Nukunul), + ], + q(7429) => [ + q(Nyiyaparli), + ], + q(7430) => [ + q(Kenzi), + q(Mattoki), + ], + q(7431) => [ + q(O'chi'chi'), + ], + q(7432) => [ + q(Kokoda), + ], + q(7433) => [ + q(Soga), + ], + q(7434) => [ + q(Kominimung), + ], + q(7435) => [ + q(Xokleng), + ], + q(7436) => [ + q(Komo (Sudan)), + ], + q(7437) => [ + q(Konkomba), + ], + q(7438) => [ + q(Xukuru), + ], + q(7439) => [ + q(Kopar), + ], + q(7440) => [ + q(Korubo), + ], + q(7441) => [ + q(Kowaki), + ], + q(7442) => [ + q(Pirriya), + ], + q(7443) => [ + q(Pecheneg), + ], + q(7444) => [ + q(Liberia Kpelle), + ], + q(7445) => [ + q(Phrygian), + ], + q(7446) => [ + q(Pictish), + ], + q(7447) => [ + q(Mpalitjanh), + ], + q(7448) => [ + q(Kulina Pano), + ], + q(7449) => [ + q(Pumpokol), + ], + q(7450) => [ + q(Kapinawa), + ], + q(7451) => [ + q(Pochutec), + ], + q(7452) => [ + q(Puyo-Paekche), + ], + q(7453) => [ + q(Mohegan-Pequot), + ], + q(7454) => [ + q(Parthian), + ], + q(7455) => [ + q(Pisidian), + ], + q(7456) => [ + q(Punthamara), + ], + q(7457) => [ + q(Punic), + ], + q(7458) => [ + q(Puyo), + ], + q(7459) => [ + q(Karakhanid), + ], + q(7460) => [ + q(Qatabanian), + ], + q(7461) => [ + q(Kraho), + ], + q(7462) => [ + q(Eastern Karaboro), + ], + q(7463) => [ + q(Gundungurra), + ], + q(7464) => [ + q(Kreye), + ], + q(7465) => [ + q(Minang), + ], + q(7466) => [ + q(Krikati-Timbira), + ], + q(7467) => [ + q(Armazic), + ], + q(7468) => [ + q(Arin), + ], + q(7469) => [ + q(Karranga), + ], + q(7470) => [ + q(Raetic), + ], + q(7471) => [ + q(Aranama-Tamique), + ], + q(7472) => [ + q(Marriammu), + ], + q(7473) => [ + q(Karawa), + ], + q(7474) => [ + q(Sabaean), + ], + q(7475) => [ + q(Sambal), + ], + q(7476) => [ + q(Scythian), + ], + q(7477) => [ + q(Sidetic), + ], + q(7478) => [ + q(Sempan), + ], + q(7479) => [ + q(Shamang), + ], + q(7480) => [ + q(Sio), + ], + q(7481) => [ + q(South Slavey), + ], + q(7482) => [ + q(Kasem), + ], + q(7483) => [ + q(Sanga (Nigeria)), + ], + q(7484) => [ + q(Solano), + ], + q(7485) => [ + q(Silopi), + ], + q(7486) => [ + q(Makhuwa-Saka), + ], + q(7487) => [ + q(Sherpa), + ], + q(7488) => [ + q(Assan), + ], + q(7489) => [ + q(Sanuma), + ], + q(7490) => [ + q(Sudovian), + ], + q(7491) => [ + q(Saisiyat), + ], + q(7492) => [ + q(Alcozauca Mixtec), + ], + q(7493) => [ + q(Chazumba Mixtec), + ], + q(7494) => [ + q(Katcha-Kadugli-Miri), + ], + q(7495) => [ + q(Diuxi-Tilantongo Mixtec), + ], + q(7496) => [ + q(Ketengban), + ], + q(7497) => [ + q(Transalpine Gaulish), + ], + q(7498) => [ + q(Yitha Yitha), + ], + q(7499) => [ + q(Sinicahua Mixtec), + ], + q(7500) => [ + q(San Juan Teita Mixtec), + ], + q(7501) => [ + q(Tijaltepec Mixtec), + ], + q(7502) => [ + q(Magdalena Penasco Mixtec), + ], + q(7503) => [ + q(Northern Tlaxiaco Mixtec), + ], + q(7504) => [ + q(Tokharian A), + ], + q(7505) => [ + q(San Miguel Piedras Mixtec), + ], + q(7506) => [ + q(Tumshuqese), + ], + q(7507) => [ + q(Early Tripuri), + ], + q(7508) => [ + q(Sindihui Mixtec), + ], + q(7509) => [ + q(Tacahua Mixtec), + ], + q(7510) => [ + q(Cuyamecalco Mixtec), + ], + q(7511) => [ + q(Thawa), + ], + q(7512) => [ + q(Tawande), + ], + q(7513) => [ + q(Yoloxochitl Mixtec), + ], + q(7514) => [ + q(Tasmanian), + ], + q(7515) => [ + q(Alu Kurumba), + ], + q(7516) => [ + q(Betta Kurumba), + ], + q(7517) => [ + q(Umiida), + ], + q(7518) => [ + q(Kunigami), + ], + q(7519) => [ + q(Jennu Kurumba), + ], + q(7520) => [ + q(Ngunawal), + ], + q(7521) => [ + q(Umbrian), + ], + q(7522) => [ + q(Unggaranggu), + ], + q(7523) => [ + q(Kuo), + ], + q(7524) => [ + q(Upper Umpqua), + ], + q(7525) => [ + q(Urartian), + ], + q(7526) => [ + q(Kuthant), + ], + q(7527) => [ + q(Kxoe), + q(Khwedam), + ], + q(7528) => [ + q(Venetic), + ], + q(7529) => [ + q(Kamviri), + ], + q(7530) => [ + q(Vandalic), + ], + q(7531) => [ + q(Volscian), + ], + q(7532) => [ + q(Vestinian), + ], + q(7533) => [ + q(Kwaza), + ], + q(7534) => [ + q(Woccon), + ], + q(7535) => [ + q(Wadi Wadi), + ], + q(7536) => [ + q(Xwela Gbe), + ], + q(7537) => [ + q(Kwegu), + ], + q(7538) => [ + q(Wajuk), + ], + q(7539) => [ + q(Wangkumara), + ], + q(7540) => [ + q(Western Xwla Gbe), + ], + q(7541) => [ + q(Written Oirat), + ], + q(7542) => [ + q(Kwerba Mamberamo), + ], + q(7543) => [ + q(Wotjobaluk), + ], + q(7544) => [ + q(Wemba Wemba), + ], + q(7545) => [ + q(Boro (Ghana)), + ], + q(7546) => [ + q(Ke'o), + ], + q(7547) => [ + q(Minkin), + ], + q(7548) => [ + q(Koropo), + ], + q(7549) => [ + q(Tambora), + ], + q(7550) => [ + q(Yaygir), + ], + q(7551) => [ + q(Yandjibara), + ], + q(7552) => [ + q(Mayi-Yapi), + ], + q(7553) => [ + q(Mayi-Kulan), + ], + q(7554) => [ + q(Yalakalore), + ], + q(7555) => [ + q(Mayi-Thakurti), + ], + q(7556) => [ + q(Yorta Yorta), + ], + q(7557) => [ + q(Zhang-Zhung), + ], + q(7558) => [ + q(Zemgalian), + ], + q(7559) => [ + q(Ancient Zapotec), + ], + q(7560) => [ + q(Yaminahua), + ], + q(7561) => [ + q(Yuhup), + ], + q(7562) => [ + q(Pass Valley Yali), + ], + q(7563) => [ + q(Yagua), + ], + q(7564) => [ + q(Pume), + ], + q(7565) => [ + q(Yaka (Democratic Republic of Congo)), + ], + q(7566) => [ + q(Yamana), + ], + q(7567) => [ + q(Yazgulyam), + ], + q(7568) => [ + q(Yagnobi), + ], + q(7569) => [ + q(Banda-Yangere), + ], + q(7570) => [ + q(Yakama), + ], + q(7571) => [ + q(Yalunka), + ], + q(7572) => [ + q(Yamba), + ], + q(7573) => [ + q(Mayangna), + ], + q(7574) => [ + q(Yaqui), + ], + q(7575) => [ + q(Yabarana), + ], + q(7576) => [ + q(Nugunu (Cameroon)), + ], + q(7577) => [ + q(Yambeta), + ], + q(7578) => [ + q(Yuwana), + ], + q(7579) => [ + q(Yangben), + ], + q(7580) => [ + q(Yawalapiti), + ], + q(7581) => [ + q(Yauma), + ], + q(7582) => [ + q(Agwagwune), + ], + q(7583) => [ + q(Lokaa), + ], + q(7584) => [ + q(Yala), + ], + q(7585) => [ + q(Yemba), + ], + q(7586) => [ + q(West Yugur), + ], + q(7587) => [ + q(Yakha), + ], + q(7588) => [ + q(Yamphu), + ], + q(7589) => [ + q(Hasha), + ], + q(7590) => [ + q(Bokha), + ], + q(7591) => [ + q(Yukuben), + ], + q(7592) => [ + q(Yaben), + ], + q(7593) => [ + q(Yabaana), + ], + q(7594) => [ + q(Yabong), + ], + q(7595) => [ + q(Yawiyo), + ], + q(7596) => [ + q(Yaweyuha), + ], + q(7597) => [ + q(Chesu), + ], + q(7598) => [ + q(Lolopo), + ], + q(7599) => [ + q(Yucuna), + ], + q(7600) => [ + q(Chepya), + ], + q(7601) => [ + q(Yanda), + ], + q(7602) => [ + q(Eastern Yiddish), + ], + q(7603) => [ + q(Yangum Dey), + ], + q(7604) => [ + q(Yidgha), + ], + q(7605) => [ + q(Yoidik), + ], + q(7606) => [ + q(Ravula), + ], + q(7607) => [ + q(Yeniche), + ], + q(7608) => [ + q(Yimas), + ], + q(7609) => [ + q(Yeni), + ], + q(7610) => [ + q(Yevanic), + ], + q(7611) => [ + q(Yela), + ], + q(7612) => [ + q(Tarok), + ], + q(7613) => [ + q(Nyankpa), + ], + q(7614) => [ + q(Yetfa), + ], + q(7615) => [ + q(Yerukula), + ], + q(7616) => [ + q(Yapunda), + ], + q(7617) => [ + q(Yeyi), + ], + q(7618) => [ + q(Malyangapa), + ], + q(7619) => [ + q(Yiningayi), + ], + q(7620) => [ + q(Yangum Gel), + ], + q(7621) => [ + q(Yagomi), + ], + q(7622) => [ + q(Gepo), + ], + q(7623) => [ + q(Yagaria), + ], + q(7624) => [ + q(Yolnu Sign Language), + ], + q(7625) => [ + q(Yugul), + ], + q(7626) => [ + q(Yagwoia), + ], + q(7627) => [ + q(Baha Buyang), + ], + q(7628) => [ + q(Judeo-Iraqi Arabic), + ], + q(7629) => [ + q(Hlepho Phowa), + ], + q(7630) => [ + q(Yan-nhanu Sign Language), + ], + q(7631) => [ + q(Yinggarda), + ], + q(7632) => [ + q(Wusa Nasu), + ], + q(7633) => [ + q(Western Yiddish), + ], + q(7634) => [ + q(Yidiny), + ], + q(7635) => [ + q(Yindjibarndi), + ], + q(7636) => [ + q(Dongshanba Lalo), + ], + q(7637) => [ + q(Yindjilandji), + ], + q(7638) => [ + q(Yimchungru Naga), + ], + q(7639) => [ + q(Yinchia), + ], + q(7640) => [ + q(Pholo), + ], + q(7641) => [ + q(Miqie), + ], + q(7642) => [ + q(North Awyu), + ], + q(7643) => [ + q(Yis), + ], + q(7644) => [ + q(Eastern Lalu), + ], + q(7645) => [ + q(Awu), + ], + q(7646) => [ + q(Northern Nisu), + ], + q(7647) => [ + q(Axi Yi), + ], + q(7648) => [ + q(Azhe), + ], + q(7649) => [ + q(Yakan), + ], + q(7650) => [ + q(Northern Yukaghir), + ], + q(7651) => [ + q(Yoke), + ], + q(7652) => [ + q(Yakaikeke), + ], + q(7653) => [ + q(Khlula), + ], + q(7654) => [ + q(Kap), + ], + q(7655) => [ + q(Kua-nsi), + ], + q(7656) => [ + q(Yasa), + ], + q(7657) => [ + q(Yekora), + ], + q(7658) => [ + q(Kathu), + ], + q(7659) => [ + q(Kuamasi), + ], + q(7660) => [ + q(Yakoma), + ], + q(7661) => [ + q(Yaul), + ], + q(7662) => [ + q(Yaleba), + ], + q(7663) => [ + q(Yele), + ], + q(7664) => [ + q(Yelogu), + ], + q(7665) => [ + q(Angguruk Yali), + ], + q(7666) => [ + q(Yil), + ], + q(7667) => [ + q(Limi), + ], + q(7668) => [ + q(Langnian Buyang), + ], + q(7669) => [ + q(Naluo Yi), + ], + q(7670) => [ + q(Yalarnnga), + ], + q(7671) => [ + q(Aribwaung), + ], + q(7672) => [ + q(Nyalayu), + q(Nyelayu), + ], + q(7673) => [ + q(Yambes), + ], + q(7674) => [ + q(Southern Muji), + ], + q(7675) => [ + q(Muda), + ], + q(7676) => [ + q(Yameo), + ], + q(7677) => [ + q(Yamongeri), + ], + q(7678) => [ + q(Mili), + ], + q(7679) => [ + q(Moji), + ], + q(7680) => [ + q(Makwe), + ], + q(7681) => [ + q(Iamalele), + ], + q(7682) => [ + q(Maay), + ], + q(7683) => [ + q(Yamna), + q(Sunum), + ], + q(7684) => [ + q(Yangum Mon), + ], + q(7685) => [ + q(Yamap), + ], + q(7686) => [ + q(Qila Muji), + ], + q(7687) => [ + q(Malasar), + ], + q(7688) => [ + q(Mysian), + ], + q(7689) => [ + q(Northern Muji), + ], + q(7690) => [ + q(Muzi), + ], + q(7691) => [ + q(Aluo), + ], + q(7692) => [ + q(Yandruwandha), + ], + q(7693) => [ + q(Lang'e), + ], + q(7694) => [ + q(Yango), + ], + q(7695) => [ + q(Naukan Yupik), + ], + q(7696) => [ + q(Yangulam), + ], + q(7697) => [ + q(Yana), + ], + q(7698) => [ + q(Yong), + ], + q(7699) => [ + q(Yendang), + ], + q(7700) => [ + q(Yansi), + ], + q(7701) => [ + q(Yahuna), + ], + q(7702) => [ + q(Yoba), + ], + q(7703) => [ + q(Yogad), + ], + q(7704) => [ + q(Yonaguni), + ], + q(7705) => [ + q(Yokuts), + ], + q(7706) => [ + q(Yola), + ], + q(7707) => [ + q(Yombe), + ], + q(7708) => [ + q(Yongkom), + ], + q(7709) => [ + q(Yotti), + ], + q(7710) => [ + q(Yoron), + ], + q(7711) => [ + q(Yoy), + ], + q(7712) => [ + q(Phala), + ], + q(7713) => [ + q(Labo Phowa), + ], + q(7714) => [ + q(Phola), + ], + q(7715) => [ + q(Phupha), + ], + q(7716) => [ + q(Phuma), + ], + q(7717) => [ + q(Ani Phowa), + ], + q(7718) => [ + q(Alo Phola), + ], + q(7719) => [ + q(Phupa), + ], + q(7720) => [ + q(Phuza), + ], + q(7721) => [ + q(Yerakai), + ], + q(7722) => [ + q(Yareba), + ], + q(7723) => [ + q(Yaoure), + ], + q(7724) => [ + q(Nenets), + ], + q(7725) => [ + q(Nhengatu), + ], + q(7726) => [ + q(Yirrk-Mel), + ], + q(7727) => [ + q(Yerong), + ], + q(7728) => [ + q(Yaroame), + ], + q(7729) => [ + q(Yarsun), + ], + q(7730) => [ + q(Yarawata), + ], + q(7731) => [ + q(Yarluyandi), + ], + q(7732) => [ + q(Yassic), + ], + q(7733) => [ + q(Samatao), + ], + q(7734) => [ + q(Sonaga), + ], + q(7735) => [ + q(Yugoslavian Sign Language), + ], + q(7736) => [ + q(Sani), + ], + q(7737) => [ + q(Nisi (China)), + ], + q(7738) => [ + q(Southern Lolopo), + ], + q(7739) => [ + q(Sirenik Yupik), + ], + q(7740) => [ + q(Yessan-Mayo), + ], + q(7741) => [ + q(Sanie), + ], + q(7742) => [ + q(Talu), + ], + q(7743) => [ + q(Tanglang), + ], + q(7744) => [ + q(Thopho), + ], + q(7745) => [ + q(Yout Wam), + ], + q(7746) => [ + q(Yatay), + ], + q(7747) => [ + q(Yucateco), + q(Yucatec Maya), + ], + q(7748) => [ + q(Yugambal), + ], + q(7749) => [ + q(Yuchi), + ], + q(7750) => [ + q(Judeo-Tripolitanian Arabic), + ], + q(7751) => [ + q(Yue Chinese), + q(Cantonese), + ], + q(7752) => [ + q(Havasupai-Walapai-Yavapai), + ], + q(7753) => [ + q(Yug), + ], + q(7754) => [ + q(Yuruti), + ], + q(7755) => [ + q(Karkar-Yuri), + ], + q(7756) => [ + q(Yuki), + ], + q(7757) => [ + q(Yulu), + ], + q(7758) => [ + q(Quechan), + ], + q(7759) => [ + q(Bena (Nigeria)), + ], + q(7760) => [ + q(Yukpa), + ], + q(7761) => [ + q(Yuqui), + ], + q(7762) => [ + q(Yurok), + ], + q(7763) => [ + q(Yopno), + ], + q(7764) => [ + q(Yau (Morobe Province)), + ], + q(7765) => [ + q(Southern Yukaghir), + ], + q(7766) => [ + q(East Yugur), + ], + q(7767) => [ + q(Yuracare), + ], + q(7768) => [ + q(Yawa), + ], + q(7769) => [ + q(Yavitero), + ], + q(7770) => [ + q(Kalou), + ], + q(7771) => [ + q(Yinhawangka), + ], + q(7772) => [ + q(Western Lalu), + ], + q(7773) => [ + q(Yawanawa), + ], + q(7774) => [ + q(Wuding-Luquan Yi), + ], + q(7775) => [ + q(Yawuru), + ], + q(7776) => [ + q(Xishanba Lalo), + q(Central Lalo), + ], + q(7777) => [ + q(Wumeng Nasu), + ], + q(7778) => [ + q(Yawarawarga), + ], + q(7779) => [ + q(Mayawali), + ], + q(7780) => [ + q(Yagara), + ], + q(7781) => [ + q(Yardliyawarra), + ], + q(7782) => [ + q(Yinwum), + ], + q(7783) => [ + q(Yuyu), + ], + q(7784) => [ + q(Yabula Yabula), + ], + q(7785) => [ + q(Yir Yoront), + ], + q(7786) => [ + q(Yau (Sandaun Province)), + ], + q(7787) => [ + q(Ayizi), + ], + q(7788) => [ + q(E'ma Buyang), + ], + q(7789) => [ + q(Zokhuo), + ], + q(7790) => [ + q(Sierra de Juarez Zapotec), + ], + q(7791) => [ + q(Western Tlacolula Valley Zapotec), + q(San Juan Guelavia Zapotec), + ], + q(7792) => [ + q(Ocotlan Zapotec), + ], + q(7793) => [ + q(Cajonos Zapotec), + ], + q(7794) => [ + q(Yareni Zapotec), + ], + q(7795) => [ + q(Ayoquesco Zapotec), + ], + q(7796) => [ + q(Zaghawa), + ], + q(7797) => [ + q(Zangwal), + ], + q(7798) => [ + q(Isthmus Zapotec), + ], + q(7799) => [ + q(Zaramo), + ], + q(7800) => [ + q(Zanaki), + ], + q(7801) => [ + q(Zauzou), + ], + q(7802) => [ + q(Miahuatlan Zapotec), + ], + q(7803) => [ + q(Ozolotepec Zapotec), + ], + q(7804) => [ + q(Aloapam Zapotec), + ], + q(7805) => [ + q(Rincon Zapotec), + ], + q(7806) => [ + q(Santo Domingo Albarradas Zapotec), + ], + q(7807) => [ + q(Tabaa Zapotec), + ], + q(7808) => [ + q(Zangskari), + ], + q(7809) => [ + q(Yatzachi Zapotec), + ], + q(7810) => [ + q(Mitla Zapotec), + ], + q(7811) => [ + q(Xadani Zapotec), + ], + q(7812) => [ + q(Zayse-Zergulla), + q(Zaysete), + ], + q(7813) => [ + q(Zari), + ], + q(7814) => [ + q(Central Berawan), + ], + q(7815) => [ + q(East Berawan), + ], + q(7816) => [ + q(Batui), + ], + q(7817) => [ + q(West Berawan), + ], + q(7818) => [ + q(Coatecas Altas Zapotec), + ], + q(7819) => [ + q(Central Hongshuihe Zhuang), + ], + q(7820) => [ + q(Ngazidja Comorian), + ], + q(7821) => [ + q(Zeeuws), + ], + q(7822) => [ + q(Zenag), + ], + q(7823) => [ + q(Eastern Hongshuihe Zhuang), + ], + q(7824) => [ + q(Kinga), + ], + q(7825) => [ + q(Guibei Zhuang), + ], + q(7826) => [ + q(Minz Zhuang), + ], + q(7827) => [ + q(Guibian Zhuang), + ], + q(7828) => [ + q(Magori), + ], + q(7829) => [ + q(Zhaba), + ], + q(7830) => [ + q(Dai Zhuang), + ], + q(7831) => [ + q(Zhire), + ], + q(7832) => [ + q(Nong Zhuang), + ], + q(7833) => [ + q(Zhoa), + ], + q(7834) => [ + q(Zia), + ], + q(7835) => [ + q(Zimbabwe Sign Language), + ], + q(7836) => [ + q(Zimakani), + ], + q(7837) => [ + q(Zialo), + ], + q(7838) => [ + q(Mesme), + ], + q(7839) => [ + q(Zinza), + ], + q(7840) => [ + q(Ziriya), + ], + q(7841) => [ + q(Zigula), + ], + q(7842) => [ + q(Zizilivakan), + ], + q(7843) => [ + q(Kaimbulawa), + ], + q(7844) => [ + q(Koibal), + ], + q(7845) => [ + q(Kadu), + ], + q(7846) => [ + q(Koguryo), + ], + q(7847) => [ + q(Khorezmian), + ], + q(7848) => [ + q(Karankawa), + ], + q(7849) => [ + q(Kanan), + ], + q(7850) => [ + q(Kott), + ], + q(7851) => [ + q(Sao Paulo Kaingang), + ], + q(7852) => [ + q(Zakhring), + ], + q(7853) => [ + q(Kitan), + ], + q(7854) => [ + q(Kaurna), + ], + q(7855) => [ + q(Krevinian), + ], + q(7856) => [ + q(Khazar), + ], + q(7857) => [ + q(Liujiang Zhuang), + ], + q(7858) => [ + q(Malay (individual language)), + ], + q(7859) => [ + q(Lianshan Zhuang), + ], + q(7860) => [ + q(Liuqian Zhuang), + ], + q(7861) => [ + q(Manda (Australia)), + ], + q(7862) => [ + q(Zimba), + ], + q(7863) => [ + q(Margany), + ], + q(7864) => [ + q(Maridan), + ], + q(7865) => [ + q(Mangerr), + ], + q(7866) => [ + q(Mfinu), + ], + q(7867) => [ + q(Marti Ke), + ], + q(7868) => [ + q(Makolkol), + ], + q(7869) => [ + q(Negeri Sembilan Malay), + ], + q(7870) => [ + q(Maridjabin), + ], + q(7871) => [ + q(Mandandanyi), + ], + q(7872) => [ + q(Madngele), + ], + q(7873) => [ + q(Marimanindji), + ], + q(7874) => [ + q(Mbangwe), + ], + q(7875) => [ + q(Molo), + ], + q(7876) => [ + q(Mpuono), + ], + q(7877) => [ + q(Mituku), + ], + q(7878) => [ + q(Maranunggu), + ], + q(7879) => [ + q(Mbesa), + ], + q(7880) => [ + q(Maringarr), + ], + q(7881) => [ + q(Muruwari), + ], + q(7882) => [ + q(Mbariman-Gudhinma), + ], + q(7883) => [ + q(Mbo (Democratic Republic of Congo)), + ], + q(7884) => [ + q(Bomitaba), + ], + q(7885) => [ + q(Mariyedi), + ], + q(7886) => [ + q(Mbandja), + ], + q(7887) => [ + q(Zan Gula), + ], + q(7888) => [ + q(Zande (individual language)), + ], + q(7889) => [ + q(Mang), + ], + q(7890) => [ + q(Manangkari), + ], + q(7891) => [ + q(Mangas), + ], + q(7892) => [ + q(Copainala Zoque), + ], + q(7893) => [ + q(Chimalapa Zoque), + ], + q(7894) => [ + q(Zou), + ], + q(7895) => [ + q(Asuncion Mixtepec Zapotec), + ], + q(7896) => [ + q(Tabasco Zoque), + ], + q(7897) => [ + q(Rayon Zoque), + ], + q(7898) => [ + q(Francisco Leon Zoque), + ], + q(7899) => [ + q(Lachiguiri Zapotec), + ], + q(7900) => [ + q(Yautepec Zapotec), + ], + q(7901) => [ + q(Choapan Zapotec), + ], + q(7902) => [ + q(Southeastern Ixtlan Zapotec), + ], + q(7903) => [ + q(Petapa Zapotec), + ], + q(7904) => [ + q(San Pedro Quiatoni Zapotec), + ], + q(7905) => [ + q(Guevea De Humboldt Zapotec), + ], + q(7906) => [ + q(Totomachapan Zapotec), + ], + q(7907) => [ + q(Santa Maria Quiegolani Zapotec), + ], + q(7908) => [ + q(Quiavicuzas Zapotec), + ], + q(7909) => [ + q(Tlacolulita Zapotec), + ], + q(7910) => [ + q(Lachixio Zapotec), + ], + q(7911) => [ + q(Mixtepec Zapotec), + ], + q(7912) => [ + q(Santa Ines Yatzechi Zapotec), + ], + q(7913) => [ + q(Amatlan Zapotec), + ], + q(7914) => [ + q(El Alto Zapotec), + ], + q(7915) => [ + q(Zoogocho Zapotec), + ], + q(7916) => [ + q(Santiago Xanica Zapotec), + ], + q(7917) => [ + q(Coatlan Zapotec), + ], + q(7918) => [ + q(San Vicente Coatlan Zapotec), + ], + q(7919) => [ + q(Yalalag Zapotec), + ], + q(7920) => [ + q(Chichicapan Zapotec), + ], + q(7921) => [ + q(Zaniza Zapotec), + ], + q(7922) => [ + q(San Baltazar Loxicha Zapotec), + ], + q(7923) => [ + q(Mazaltepec Zapotec), + ], + q(7924) => [ + q(Texmelucan Zapotec), + ], + q(7925) => [ + q(Qiubei Zhuang), + ], + q(7926) => [ + q(Kara (Korea)), + ], + q(7927) => [ + q(Mirgan), + ], + q(7928) => [ + q(Zerenkel), + ], + q(7929) => [ + q(Zaparo), + ], + q(7930) => [ + q(Zarphatic), + ], + q(7931) => [ + q(Mairasi), + ], + q(7932) => [ + q(Sarasira), + ], + q(7933) => [ + q(Kaskean), + ], + q(7934) => [ + q(Zambian Sign Language), + ], + q(7935) => [ + q(Standard Malay), + ], + q(7936) => [ + q(Southern Rincon Zapotec), + ], + q(7937) => [ + q(Sukurum), + ], + q(7938) => [ + q(Elotepec Zapotec), + ], + q(7939) => [ + q(Xanaguia Zapotec), + ], + q(7940) => [ + q(Lapaguia-Guivini Zapotec), + ], + q(7941) => [ + q(San Agustin Mixtepec Zapotec), + ], + q(7942) => [ + q(Santa Catarina Albarradas Zapotec), + ], + q(7943) => [ + q(Loxicha Zapotec), + ], + q(7944) => [ + q(Quioquitani-Quieri Zapotec), + ], + q(7945) => [ + q(Tilquiapan Zapotec), + ], + q(7946) => [ + q(Tejalapan Zapotec), + ], + q(7947) => [ + q(Guila Zapotec), + ], + q(7948) => [ + q(Zaachila Zapotec), + ], + q(7949) => [ + q(Yatee Zapotec), + ], + q(7950) => [ + q(Zeem), + ], + q(7951) => [ + q(Tokano), + ], + q(7952) => [ + q(Kumzari), + ], + q(7953) => [ + q(Zumaya), + ], + q(7954) => [ + q(Zay), + ], + q(7955) => [ + q(Yongbei Zhuang), + ], + q(7956) => [ + q(Yang Zhuang), + ], + q(7957) => [ + q(Youjiang Zhuang), + ], + q(7958) => [ + q(Yongnan Zhuang), + ], + q(7959) => [ + q(Zyphe Chin), + ], + q(7960) => [ + q(Zuojiang Zhuang), + ], +}; + +$Locale::Codes::Data{'language'}{'alias2id'} = { + q(!xoo) => [ + q(4968), + q(0), + ], + q('are'are) => [ + q(0762), + q(0), + ], + q('auhelawa) => [ + q(3642), + q(0), + ], + q('oroe) => [ + q(1382), + q(1), + ], + q(//ani) => [ + q(2800), + q(0), + ], + q(//gana) => [ + q(2573), + q(0), + ], + q(//xegwi) => [ + q(7317), + q(0), + ], + q(/gwi) => [ + q(2683), + q(0), + ], + q(/xam) => [ + q(7268), + q(0), + ], + q(=/hua) => [ + q(2850), + q(0), + ], + q(=/ungkue) => [ + q(2540), + q(1), + ], + q(a'ou) => [ + q(0832), + q(0), + ], + q(a'tong) => [ + q(0831), + q(1), + ], + q(a-hmaos) => [ + q(2777), + q(1), + ], + q(a-pucikwar) => [ + q(0850), + q(0), + ], + q(aari) => [ + q(0711), + q(0), + ], + q(aasax) => [ + q(0554), + q(0), + ], + q(abadi) => [ + q(3201), + q(0), + ], + q(abaga) => [ + q(0566), + q(0), + ], + q(abai sungai) => [ + q(0565), + q(0), + ], + q(abanyom) => [ + q(0571), + q(0), + ], + q(abar) => [ + q(4299), + q(0), + ], + q(abau) => [ + q(0556), + q(0), + ], + q(abaza) => [ + q(0575), + q(0), + ], + q(abe) => [ + q(0560), + q(0), + ], + q(abellen ayta) => [ + q(0574), + q(0), + ], + q(abidji) => [ + q(0568), + q(0), + ], + q(abinomn) => [ + q(1447), + q(0), + ], + q(abipon) => [ + q(0986), + q(0), + ], + q(abishira) => [ + q(0893), + q(0), + ], + q(abkhazian) => [ + q(0002), + q(0), + ], + q(abom) => [ + q(0816), + q(0), + ], + q(abon) => [ + q(0573), + q(0), + ], + q(abron) => [ + q(0576), + q(0), + ], + q(abu) => [ + q(0615), + q(0), + ], + q(abu' arapesh) => [ + q(0546), + q(0), + ], + q(abua) => [ + q(0572), + q(0), + ], + q(abui) => [ + q(0584), + q(0), + ], + q(abun) => [ + q(3322), + q(0), + ], + q(abure) => [ + q(0579), + q(0), + ], + q(abureni) => [ + q(4251), + q(0), + ], + q(acatepec me'phaa) => [ + q(6658), + q(0), + ], + q(acatepec tlapanec) => [ + q(6658), + q(1), + ], + q(achagua) => [ + q(0585), + q(0), + ], + q(achang) => [ + q(0593), + q(0), + ], + q(ache) => [ + q(2655), + q(0), + ], + q(acheron) => [ + q(0604), + q(0), + ], + q(achi) => [ + q(0596), + q(0), + ], + q(achinese) => [ + q(0003), + q(0), + ], + q(achterhoeks) => [ + q(0598), + q(0), + ], + q(achuar-shiwiar) => [ + q(0599), + q(0), + ], + q(achumawi) => [ + q(0600), + q(0), + ], + q(acoli) => [ + q(0004), + q(0), + ], + q(acroa) => [ + q(0597), + q(0), + ], + q(adabe) => [ + q(0605), + q(0), + ], + q(adai) => [ + q(7262), + q(0), + ], + q(adamawa fulfulde) => [ + q(2378), + q(0), + ], + q(adamorobe sign language) => [ + q(0618), + q(0), + ], + q(adang) => [ + q(0614), + q(0), + ], + q(adangbe) => [ + q(0616), + q(0), + ], + q(adangme) => [ + q(0005), + q(0), + ], + q(adara) => [ + q(3170), + q(0), + ], + q(adasen) => [ + q(6520), + q(0), + ], + q(adele) => [ + q(0607), + q(0), + ], + q(adhola) => [ + q(0610), + q(0), + ], + q(adi) => [ + q(0611), + q(0), + ], + q(adilabad gondi) => [ + q(7220), + q(0), + ], + q(adioukrou) => [ + q(0612), + q(0), + ], + q(adithinngithigh) => [ + q(2153), + q(0), + ], + q(adivasi oriya) => [ + q(5298), + q(0), + ], + q(adiwasi garasia) => [ + q(2413), + q(0), + ], + q(adnyamathanha) => [ + q(0619), + q(0), + ], + q(adonara) => [ + q(0617), + q(0), + ], + q(aduge) => [ + q(0620), + q(0), + ], + q(adygei) => [ + q(0006), + q(1), + ], + q(adyghe) => [ + q(0006), + q(0), + ], + q(adzera) => [ + q(0623), + q(0), + ], + q(aeka) => [ + q(0639), + q(0), + ], + q(aekyom) => [ + q(0973), + q(0), + ], + q(aequian) => [ + q(7263), + q(0), + ], + q(aer) => [ + q(0633), + q(0), + ], + q(afade) => [ + q(0549), + q(0), + ], + q(afar) => [ + q(0001), + q(0), + ], + q(afghan persian) => [ + q(5595), + q(1), + ], + q(afghan sign language) => [ + q(0643), + q(0), + ], + q(afitti) => [ + q(0650), + q(0), + ], + q(afra) => [ + q(6879), + q(1), + ], + q(afrihili) => [ + q(0008), + q(0), + ], + q(afrikaans) => [ + q(0009), + q(0), + ], + q(afro-asiatic languages) => [ + q(0007), + q(0), + ], + q(afro-seminole creole) => [ + q(0649), + q(0), + ], + q(agarabi) => [ + q(0656), + q(0), + ], + q(agariya) => [ + q(0661), + q(0), + ], + q(agatu) => [ + q(0655), + q(0), + ], + q(agavotaguerra) => [ + q(0963), + q(0), + ], + q(aghem) => [ + q(0668), + q(0), + ], + q(aghu) => [ + q(0681), + q(0), + ], + q(aghu-tharnggala) => [ + q(2639), + q(0), + ], + q(aghul) => [ + q(0675), + q(0), + ], + q(aghwan) => [ + q(7264), + q(0), + ], + q(agi) => [ + q(0697), + q(0), + ], + q(agob) => [ + q(3368), + q(0), + ], + q(agoi) => [ + q(2890), + q(0), + ], + q(aguacateco) => [ + q(0672), + q(0), + ], + q(aguano) => [ + q(0653), + q(0), + ], + q(aguaruna) => [ + q(0669), + q(0), + ], + q(aguna) => [ + q(0938), + q(0), + ], + q(agusan manobo) => [ + q(4535), + q(0), + ], + q(agutaynen) => [ + q(0666), + q(0), + ], + q(agwagwune) => [ + q(7582), + q(0), + ], + q(ahan) => [ + q(0686), + q(0), + ], + q(ahanta) => [ + q(0678), + q(0), + ], + q(aheri gondi) => [ + q(2288), + q(0), + ], + q(aheu) => [ + q(6493), + q(0), + ], + q(ahirani) => [ + q(0689), + q(0), + ], + q(ahom) => [ + q(0687), + q(0), + ], + q(ahtena) => [ + q(0691), + q(0), + ], + q(ahwai) => [ + q(4824), + q(0), + ], + q(ai-cham) => [ + q(0699), + q(0), + ], + q(aighon) => [ + q(0712), + q(0), + ], + q(aikana) => [ + q(6369), + q(0), + ], + q(aiklep) => [ + q(4623), + q(0), + ], + q(aimaq) => [ + q(0707), + q(0), + ], + q(aimele) => [ + q(0703), + q(0), + ], + q(aimol) => [ + q(0704), + q(0), + ], + q(ainbai) => [ + q(0694), + q(0), + ], + q(ainu) => [ + q(0010), + q(0), + ], + q(ainu (china)) => [ + q(0693), + q(0), + ], + q(ainu (japan)) => [ + q(0010), + q(1), + ], + q(aiome) => [ + q(0730), + q(0), + ], + q(airoran) => [ + q(0708), + q(0), + ], + q(aiton) => [ + q(0705), + q(0), + ], + q(aiwoo) => [ + q(4825), + q(1), + ], + q(aja (benin)) => [ + q(0715), + q(0), + ], + q(aja (sudan)) => [ + q(0714), + q(0), + ], + q(ajawa) => [ + q(0721), + q(0), + ], + q(ajie) => [ + q(0716), + q(0), + ], + q(ajiya) => [ + q(2901), + q(1), + ], + q(ajumbu) => [ + q(4575), + q(0), + ], + q(ajyininka apurucayali) => [ + q(1829), + q(0), + ], + q(ak) => [ + q(0736), + q(0), + ], + q(aka) => [ + q(6151), + q(0), + ], + q(aka-bea) => [ + q(0569), + q(0), + ], + q(aka-bo) => [ + q(0733), + q(0), + ], + q(aka-cari) => [ + q(0589), + q(0), + ], + q(aka-jeru) => [ + q(0731), + q(0), + ], + q(aka-kede) => [ + q(0743), + q(0), + ], + q(aka-kol) => [ + q(0744), + q(0), + ], + q(aka-kora) => [ + q(0590), + q(0), + ], + q(akan) => [ + q(0011), + q(0), + ], + q(akar-bale) => [ + q(0591), + q(0), + ], + q(akaselem) => [ + q(0738), + q(0), + ], + q(akawaio) => [ + q(0726), + q(0), + ], + q(ake) => [ + q(0702), + q(0), + ], + q(akebu) => [ + q(3276), + q(0), + ], + q(akei) => [ + q(6710), + q(0), + ], + q(akeu) => [ + q(0636), + q(0), + ], + q(akha) => [ + q(0683), + q(0), + ], + q(akhvakh) => [ + q(0741), + q(0), + ], + q(akkadian) => [ + q(0012), + q(0), + ], + q(akkala sami) => [ + q(6025), + q(0), + ], + q(aklanon) => [ + q(0732), + q(0), + ], + q(akolet) => [ + q(0739), + q(0), + ], + q(akoose) => [ + q(1464), + q(0), + ], + q(akoye) => [ + q(4309), + q(0), + ], + q(akpa) => [ + q(0727), + q(0), + ], + q(akpes) => [ + q(2886), + q(0), + ], + q(akrukay) => [ + q(0644), + q(0), + ], + q(akukem) => [ + q(6175), + q(0), + ], + q(akuku) => [ + q(1001), + q(0), + ], + q(akum) => [ + q(0740), + q(0), + ], + q(akuntsu) => [ + q(0868), + q(0), + ], + q(akurio) => [ + q(0734), + q(0), + ], + q(akwa) => [ + q(0742), + q(0), + ], + q(akyaung ari naga) => [ + q(5043), + q(0), + ], + q(al-sayyid bedouin sign language) => [ + q(6334), + q(0), + ], + q(alaba-k'abeena) => [ + q(0763), + q(0), + ], + q(alabama) => [ + q(0745), + q(0), + ], + q(alabat island agta) => [ + q(2174), + q(0), + ], + q(alacalufan languages) => [ + q(0490), + q(0), + ], + q(alacatlatzala mixtec) => [ + q(4302), + q(0), + ], + q(alago) => [ + q(0746), + q(0), + ], + q(alagwa) => [ + q(7068), + q(0), + ], + q(alak) => [ + q(0753), + q(0), + ], + q(alamblak) => [ + q(0780), + q(0), + ], + q(alangan) => [ + q(0752), + q(0), + ], + q(alanic) => [ + q(7386), + q(0), + ], + q(alapmunte) => [ + q(0855), + q(0), + ], + q(alawa) => [ + q(0750), + q(0), + ], + q(albanian) => [ + q(0013), + q(0), + ], + q(albanian languages) => [ + q(0526), + q(0), + ], + q(albanian sign language) => [ + q(6189), + q(0), + ], + q(alcozauca mixtec) => [ + q(7492), + q(0), + ], + q(alege) => [ + q(0749), + q(0), + ], + q(alekano) => [ + q(2402), + q(0), + ], + q(alemannic) => [ + q(0167), + q(1), + ], + q(aleut) => [ + q(0014), + q(0), + ], + q(algerian arabic) => [ + q(0878), + q(0), + ], + q(algerian saharan arabic) => [ + q(0551), + q(0), + ], + q(algerian sign language) => [ + q(0900), + q(0), + ], + q(algic languages) => [ + q(0491), + q(0), + ], + q(algonquian languages) => [ + q(0015), + q(0), + ], + q(algonquin) => [ + q(0759), + q(0), + ], + q(ali) => [ + q(0713), + q(0), + ], + q(alladian) => [ + q(0748), + q(0), + ], + q(allar) => [ + q(0754), + q(0), + ], + q(alngith) => [ + q(0695), + q(0), + ], + q(alo phola) => [ + q(7718), + q(0), + ], + q(aloapam zapotec) => [ + q(7804), + q(0), + ], + q(alor) => [ + q(0826), + q(0), + ], + q(alsatian) => [ + q(0167), + q(2), + ], + q(alsea) => [ + q(0635), + q(0), + ], + q(altaic languages) => [ + q(0446), + q(0), + ], + q(alu kurumba) => [ + q(7515), + q(0), + ], + q(alugu) => [ + q(0935), + q(0), + ], + q(alumu-tesu) => [ + q(0540), + q(0), + ], + q(alune) => [ + q(0758), + q(0), + ], + q(aluo) => [ + q(7691), + q(0), + ], + q(alur) => [ + q(0766), + q(0), + ], + q(alutor) => [ + q(0760), + q(0), + ], + q(alviri-vidari) => [ + q(0957), + q(0), + ], + q(alyawarr) => [ + q(0765), + q(0), + ], + q(ama (papua new guinea)) => [ + q(0777), + q(0), + ], + q(ama (sudan)) => [ + q(5158), + q(0), + ], + q(amahai) => [ + q(0781), + q(0), + ], + q(amahuaca) => [ + q(0769), + q(0), + ], + q(amaimon) => [ + q(0751), + q(0), + ], + q(amal) => [ + q(0542), + q(0), + ], + q(amanab) => [ + q(0778), + q(0), + ], + q(amanaye) => [ + q(0767), + q(0), + ], + q(amara) => [ + q(0696), + q(0), + ], + q(amarakaeri) => [ + q(0782), + q(0), + ], + q(amarasi) => [ + q(0559), + q(0), + ], + q(amatlan zapotec) => [ + q(7913), + q(0), + ], + q(amba (solomon islands)) => [ + q(6941), + q(0), + ], + q(amba (uganda)) => [ + q(5867), + q(0), + ], + q(ambai) => [ + q(0775), + q(0), + ], + q(ambakich) => [ + q(0637), + q(0), + ], + q(ambala ayta) => [ + q(0562), + q(0), + ], + q(ambelau) => [ + q(0786), + q(0), + ], + q(ambele) => [ + q(0630), + q(0), + ], + q(amblong) => [ + q(0755), + q(0), + ], + q(ambo) => [ + q(0768), + q(0), + ], + q(ambo-pasco quechua) => [ + q(5691), + q(0), + ], + q(ambonese malay) => [ + q(0577), + q(0), + ], + q(ambrak) => [ + q(0545), + q(0), + ], + q(ambul) => [ + q(0848), + q(0), + ], + q(ambulas) => [ + q(0578), + q(0), + ], + q(amdang) => [ + q(0774), + q(0), + ], + q(amdo tibetan) => [ + q(0622), + q(0), + ], + q(amele) => [ + q(0638), + q(0), + ], + q(american sign language) => [ + q(0890), + q(0), + ], + q(amganad ifugao) => [ + q(2909), + q(0), + ], + q(amharic) => [ + q(0017), + q(0), + ], + q(ami) => [ + q(0789), + q(0), + ], + q(amio-gelimi) => [ + q(3869), + q(1), + ], + q(amis) => [ + q(0773), + q(0), + ], + q(amo) => [ + q(0779), + q(0), + ], + q(amol) => [ + q(0764), + q(0), + ], + q(amoltepec mixtec) => [ + q(4144), + q(0), + ], + q(ampanang) => [ + q(0840), + q(0), + ], + q(ampari dogon) => [ + q(0861), + q(0), + ], + q(amri karbi) => [ + q(0722), + q(0), + ], + q(amto) => [ + q(0784), + q(0), + ], + q(amundava) => [ + q(0621), + q(0), + ], + q(amurdak) => [ + q(0772), + q(0), + ], + q(ana tinga dogon) => [ + q(2154), + q(0), + ], + q(anaang) => [ + q(0811), + q(0), + ], + q(anakalangu) => [ + q(0728), + q(0), + ], + q(anal) => [ + q(0802), + q(0), + ], + q(anam) => [ + q(5393), + q(0), + ], + q(anambe) => [ + q(0550), + q(0), + ], + q(anamgura) => [ + q(2960), + q(0), + ], + q(anasi) => [ + q(1386), + q(0), + ], + q(anca) => [ + q(0586), + q(0), + ], + q(ancient aramaic (up to 700 bce)) => [ + q(5182), + q(1), + ], + q(ancient greek (to 1453)) => [ + q(0164), + q(1), + ], + q(ancient hebrew) => [ + q(2732), + q(0), + ], + q(ancient macedonian) => [ + q(7401), + q(0), + ], + q(ancient north arabian) => [ + q(7417), + q(0), + ], + q(ancient zapotec) => [ + q(7559), + q(0), + ], + q(andaandi) => [ + q(2007), + q(0), + ], + q(andai) => [ + q(0641), + q(0), + ], + q(andajin) => [ + q(0717), + q(0), + ], + q(andalusian arabic) => [ + q(7259), + q(0), + ], + q(andaman creole hindi) => [ + q(2734), + q(0), + ], + q(andaqui) => [ + q(0791), + q(0), + ], + q(andarum) => [ + q(0818), + q(0), + ], + q(andegerebinha) => [ + q(0609), + q(0), + ], + q(andh) => [ + q(0806), + q(0), + ], + q(andi) => [ + q(0798), + q(0), + ], + q(andio) => [ + q(1613), + q(0), + ], + q(andoa) => [ + q(0792), + q(0), + ], + q(andoque) => [ + q(0804), + q(0), + ], + q(andra-hus) => [ + q(0812), + q(0), + ], + q(aneityum) => [ + q(0932), + q(0), + ], + q(anem) => [ + q(0814), + q(0), + ], + q(aneme wake) => [ + q(0583), + q(0), + ], + q(anfillo) => [ + q(4678), + q(0), + ], + q(angaataha) => [ + q(0665), + q(0), + ], + q(angaite) => [ + q(0867), + q(0), + ], + q(angal) => [ + q(0657), + q(0), + ], + q(angal enen) => [ + q(0819), + q(0), + ], + q(angal heneng) => [ + q(0729), + q(0), + ], + q(angami naga) => [ + q(4905), + q(0), + ], + q(angguruk yali) => [ + q(7665), + q(0), + ], + q(angika) => [ + q(0019), + q(0), + ], + q(angkamuthi) => [ + q(0961), + q(0), + ], + q(anglo-norman) => [ + q(7424), + q(0), + ], + q(angloromani) => [ + q(5799), + q(0), + ], + q(angolar) => [ + q(0815), + q(0), + ], + q(angor) => [ + q(0659), + q(0), + ], + q(angoram) => [ + q(0821), + q(0), + ], + q(angosturas tunebo) => [ + q(6600), + q(0), + ], + q(anguthimri) => [ + q(0971), + q(0), + ], + q(ani) => [ + q(2800), + q(1), + ], + q(ani phowa) => [ + q(7717), + q(0), + ], + q(anii) => [ + q(1292), + q(0), + ], + q(animere) => [ + q(0796), + q(0), + ], + q(anindilyakwa) => [ + q(0823), + q(0), + ], + q(anjam) => [ + q(1359), + q(0), + ], + q(ankave) => [ + q(0548), + q(0), + ], + q(anmatyerre) => [ + q(0788), + q(0), + ], + q(anong) => [ + q(5111), + q(0), + ], + q(anor) => [ + q(0799), + q(0), + ], + q(anserma) => [ + q(0807), + q(0), + ], + q(ansus) => [ + q(0794), + q(0), + ], + q(antakarinya) => [ + q(0808), + q(0), + ], + q(antankarana malagasy) => [ + q(7412), + q(0), + ], + q(antigua and barbuda creole english) => [ + q(0698), + q(0), + ], + q(anu-hkongso chin) => [ + q(0801), + q(0), + ], + q(anuak) => [ + q(0809), + q(0), + ], + q(anufo) => [ + q(1756), + q(0), + ], + q(anuki) => [ + q(0940), + q(0), + ], + q(anus) => [ + q(0948), + q(0), + ], + q(anuta) => [ + q(0937), + q(0), + ], + q(anyin) => [ + q(0813), + q(0), + ], + q(anyin morofo) => [ + q(4549), + q(0), + ], + q(ao naga) => [ + q(4907), + q(0), + ], + q(aoheng) => [ + q(5532), + q(0), + ], + q(aore) => [ + q(0829), + q(0), + ], + q(ap ma) => [ + q(3205), + q(0), + ], + q(apache languages) => [ + q(0020), + q(0), + ], + q(apalachee) => [ + q(7271), + q(0), + ], + q(apalai) => [ + q(0858), + q(0), + ], + q(apali) => [ + q(2260), + q(0), + ], + q(apasco-apoala mixtec) => [ + q(4304), + q(0), + ], + q(apatani) => [ + q(0853), + q(0), + ], + q(apiaka) => [ + q(0842), + q(0), + ], + q(apinaye) => [ + q(0847), + q(0), + ], + q(apma) => [ + q(0849), + q(0), + ], + q(aproumu aizi) => [ + q(0688), + q(0), + ], + q(apurina) => [ + q(0854), + q(0), + ], + q(aputai) => [ + q(0857), + q(0), + ], + q(aquitanian) => [ + q(7272), + q(0), + ], + q(arabana) => [ + q(0870), + q(0), + ], + q(arabela) => [ + q(0876), + q(0), + ], + q(arabic) => [ + q(0021), + q(0), + ], + q(aragonese) => [ + q(0023), + q(0), + ], + q(araki) => [ + q(0737), + q(0), + ], + q(arakwal) => [ + q(5794), + q(0), + ], + q(aralle-tabulahan) => [ + q(0924), + q(0), + ], + q(arammba) => [ + q(6252), + q(0), + ], + q(aranadan) => [ + q(0544), + q(0), + ], + q(aranama-tamique) => [ + q(7471), + q(0), + ], + q(arandai) => [ + q(3061), + q(0), + ], + q(araona) => [ + q(0877), + q(0), + ], + q(arapaho) => [ + q(0026), + q(0), + ], + q(arapaso) => [ + q(0874), + q(0), + ], + q(ararandewara) => [ + q(7266), + q(0), + ], + q(arauan languages) => [ + q(0492), + q(0), + ], + q(arawa) => [ + q(0881), + q(1), + ], + q(arawak) => [ + q(0028), + q(0), + ], + q(arawakan languages) => [ + q(0493), + q(0), + ], + q(arawete) => [ + q(0980), + q(0), + ], + q(arawum) => [ + q(0975), + q(0), + ], + q(arbereshe albanian) => [ + q(0543), + q(0), + ], + q(arbore) => [ + q(0882), + q(0), + ], + q(archi) => [ + q(0860), + q(0), + ], + q(ardhamagadhi prakrit) => [ + q(5471), + q(0), + ], + q(are) => [ + q(4620), + q(0), + ], + q(areba) => [ + q(0624), + q(0), + ], + q(arem) => [ + q(0631), + q(0), + ], + q(arequipa-la union quechua) => [ + q(5723), + q(0), + ], + q(argentine sign language) => [ + q(0627), + q(0), + ], + q(argobba) => [ + q(0662), + q(0), + ], + q(arguni) => [ + q(0658), + q(0), + ], + q(arha) => [ + q(0866), + q(0), + ], + q(arho) => [ + q(0825), + q(0), + ], + q(arhuaco) => [ + q(0872), + q(0), + ], + q(ari) => [ + q(0541), + q(0), + ], + q(aribwatsa) => [ + q(3803), + q(0), + ], + q(aribwaung) => [ + q(7671), + q(0), + ], + q(arifama-miniafia) => [ + q(0547), + q(0), + ], + q(arigidi) => [ + q(0862), + q(0), + ], + q(arikapu) => [ + q(0875), + q(0), + ], + q(arikara) => [ + q(0873), + q(0), + ], + q(arikem) => [ + q(0710), + q(0), + ], + q(arin) => [ + q(7468), + q(0), + ], + q(aringa) => [ + q(4069), + q(0), + ], + q(arma) => [ + q(0822), + q(0), + ], + q(armazic) => [ + q(7467), + q(0), + ], + q(armenian) => [ + q(0024), + q(0), + ], + q(armenian (family)) => [ + q(0512), + q(0), + ], + q(armenian sign language) => [ + q(0632), + q(0), + ], + q(aromanian) => [ + q(0363), + q(0), + ], + q(arop-lokep) => [ + q(0851), + q(0), + ], + q(arop-sissano) => [ + q(0852), + q(0), + ], + q(arosi) => [ + q(0692), + q(0), + ], + q(arpitan) => [ + q(2372), + q(0), + ], + q(arritinngithigh) => [ + q(5842), + q(0), + ], + q(arta) => [ + q(0933), + q(0), + ], + q(artificial languages) => [ + q(0027), + q(0), + ], + q(arua (amazonas state)) => [ + q(0881), + q(0), + ], + q(arua (rodonia state)) => [ + q(0883), + q(0), + ], + q(aruamu) => [ + q(4546), + q(0), + ], + q(aruek) => [ + q(0949), + q(0), + ], + q(arumanian) => [ + q(0363), + q(1), + ], + q(aruop) => [ + q(4057), + q(0), + ], + q(arutani) => [ + q(0931), + q(0), + ], + q(arvanitika albanian) => [ + q(0555), + q(0), + ], + q(as) => [ + q(0909), + q(0), + ], + q(asaro'o) => [ + q(4569), + q(0), + ], + q(asas) => [ + q(0889), + q(0), + ], + q(ashaninka) => [ + q(1797), + q(0), + ], + q(ashe) => [ + q(0690), + q(0), + ], + q(asheninka pajonal) => [ + q(1747), + q(0), + ], + q(asheninka perene) => [ + q(5593), + q(0), + ], + q(ashkun) => [ + q(0896), + q(0), + ], + q(asho chin) => [ + q(1867), + q(0), + ], + q(ashtiani) => [ + q(0921), + q(0), + ], + q(asilulu) => [ + q(0897), + q(0), + ], + q(askopan) => [ + q(2226), + q(0), + ], + q(asoa) => [ + q(0905), + q(0), + ], + q(assamese) => [ + q(0029), + q(0), + ], + q(assan) => [ + q(7488), + q(0), + ], + q(assangori) => [ + q(6050), + q(0), + ], + q(assiniboine) => [ + q(0887), + q(0), + ], + q(assyrian neo-aramaic) => [ + q(0700), + q(0), + ], + q(asturian) => [ + q(0030), + q(0), + ], + q(asturleonese) => [ + q(0030), + q(3), + ], + q(asu (nigeria)) => [ + q(0944), + q(0), + ], + q(asu (tanzania)) => [ + q(0886), + q(0), + ], + q(asue awyu) => [ + q(5601), + q(0), + ], + q(asumboa) => [ + q(0934), + q(0), + ], + q(asuncion mixtepec zapotec) => [ + q(7895), + q(0), + ], + q(asuri) => [ + q(0902), + q(0), + ], + q(ata) => [ + q(0920), + q(0), + ], + q(ata manobo) => [ + q(0913), + q(0), + ], + q(atakapa) => [ + q(0865), + q(0), + ], + q(atampaya) => [ + q(0790), + q(0), + ], + q(atatlahuca mixtec) => [ + q(4292), + q(0), + ], + q(atayal) => [ + q(6367), + q(0), + ], + q(atemble) => [ + q(0914), + q(0), + ], + q(athapascan languages) => [ + q(0031), + q(0), + ], + q(athpariya) => [ + q(0841), + q(0), + ], + q(ati) => [ + q(0918), + q(0), + ], + q(atikamekw) => [ + q(0917), + q(0), + ], + q(atlantic-congo languages) => [ + q(0489), + q(0), + ], + q(atohwaim) => [ + q(0863), + q(0), + ], + q(atong (cameroon)) => [ + q(0922), + q(0), + ], + q(atong (india)) => [ + q(0831), + q(0), + ], + q(atorada) => [ + q(0833), + q(0), + ], + q(atsahuaca) => [ + q(0912), + q(0), + ], + q(atsam) => [ + q(1682), + q(0), + ], + q(atsugewi) => [ + q(0930), + q(0), + ], + q(attapady kurumba) => [ + q(5479), + q(0), + ], + q(attie) => [ + q(0916), + q(0), + ], + q(atzingo matlatzinca) => [ + q(5195), + q(0), + ], + q(au) => [ + q(0965), + q(0), + ], + q(aulua) => [ + q(0943), + q(0), + ], + q(aura) => [ + q(0953), + q(0), + ], + q(aushi) => [ + q(0939), + q(0), + ], + q(aushiri) => [ + q(0964), + q(0), + ], + q(austral) => [ + q(0950), + q(0), + ], + q(australian aborigines sign language) => [ + q(0906), + q(0), + ], + q(australian languages) => [ + q(0032), + q(0), + ], + q(australian sign language) => [ + q(0891), + q(0), + ], + q(austrian sign language) => [ + q(0901), + q(0), + ], + q(austro-asiatic languages) => [ + q(0488), + q(0), + ], + q(austronesian languages) => [ + q(0272), + q(0), + ], + q(auwe) => [ + q(6109), + q(0), + ], + q(auye) => [ + q(0951), + q(0), + ], + q(auyokawa) => [ + q(0946), + q(0), + ], + q(ava guarani) => [ + q(4856), + q(1), + ], + q(ava-canoeiro) => [ + q(0967), + q(0), + ], + q(avaric) => [ + q(0033), + q(0), + ], + q(avatime) => [ + q(0962), + q(0), + ], + q(avau) => [ + q(0956), + q(0), + ], + q(avava) => [ + q(6575), + q(1), + ], + q(avestan) => [ + q(0034), + q(0), + ], + q(avikam) => [ + q(0958), + q(0), + ], + q(avokaya) => [ + q(0966), + q(0), + ], + q(awa (china)) => [ + q(7040), + q(0), + ], + q(awa (papua new guinea)) => [ + q(0968), + q(0), + ], + q(awa-cuaiquer) => [ + q(3694), + q(0), + ], + q(awabakal) => [ + q(0974), + q(0), + ], + q(awad bing) => [ + q(1085), + q(0), + ], + q(awadhi) => [ + q(0035), + q(0), + ], + q(awak) => [ + q(0977), + q(0), + ], + q(awar) => [ + q(0993), + q(0), + ], + q(awara) => [ + q(0984), + q(0), + ], + q(awbono) => [ + q(0972), + q(0), + ], + q(aweer) => [ + q(1353), + q(0), + ], + q(awera) => [ + q(0978), + q(0), + ], + q(aweti) => [ + q(0970), + q(0), + ], + q(awing) => [ + q(1020), + q(0), + ], + q(awiyaana) => [ + q(0954), + q(0), + ], + q(awjilah) => [ + q(0941), + q(0), + ], + q(awngi) => [ + q(0976), + q(0), + ], + q(awngthim) => [ + q(2684), + q(0), + ], + q(awtuw) => [ + q(3464), + q(0), + ], + q(awu) => [ + q(7645), + q(0), + ], + q(awun) => [ + q(0983), + q(0), + ], + q(awutu) => [ + q(0651), + q(0), + ], + q(awyi) => [ + q(0952), + q(0), + ], + q(axamb) => [ + q(0679), + q(0), + ], + q(axi yi) => [ + q(7647), + q(0), + ], + q(ayabadhu) => [ + q(0996), + q(0), + ], + q(ayacucho quechua) => [ + q(5689), + q(0), + ], + q(ayangan ifugao) => [ + q(2910), + q(1), + ], + q(ayautla mazatec) => [ + q(7024), + q(0), + ], + q(ayere) => [ + q(0997), + q(0), + ], + q(ayerrerenge) => [ + q(0987), + q(0), + ], + q(ayi (papua new guinea)) => [ + q(1006), + q(0), + ], + q(ayiwo) => [ + q(4825), + q(0), + ], + q(ayizi) => [ + q(7787), + q(0), + ], + q(ayizo gbe) => [ + q(0994), + q(0), + ], + q(aymara) => [ + q(0036), + q(0), + ], + q(ayoquesco zapotec) => [ + q(7795), + q(0), + ], + q(ayoreo) => [ + q(1004), + q(0), + ], + q(ayu) => [ + q(1010), + q(0), + ], + q(ayutla mixtec) => [ + q(4311), + q(0), + ], + q(azerbaijani) => [ + q(0037), + q(0), + ], + q(azha) => [ + q(1013), + q(0), + ], + q(azhe) => [ + q(7648), + q(0), + ], + q(azoyu me'phaa) => [ + q(6641), + q(0), + ], + q(azoyu tlapanec) => [ + q(6641), + q(1), + ], + q(baan) => [ + q(1525), + q(0), + ], + q(baangi) => [ + q(1420), + q(0), + ], + q(baatonum) => [ + q(1039), + q(0), + ], + q(baba) => [ + q(1061), + q(0), + ], + q(baba malay) => [ + q(4125), + q(0), + ], + q(babalia creole arabic) => [ + q(1064), + q(0), + ], + q(babango) => [ + q(1051), + q(0), + ], + q(babanki) => [ + q(1049), + q(0), + ], + q(babatana) => [ + q(1023), + q(0), + ], + q(babine) => [ + q(1082), + q(0), + ], + q(bable) => [ + q(0030), + q(1), + ], + q(babuza) => [ + q(1618), + q(0), + ], + q(bacama) => [ + q(1088), + q(0), + ], + q(bacanese malay) => [ + q(1479), + q(0), + ], + q(bactrian) => [ + q(7281), + q(0), + ], + q(bada (indonesia)) => [ + q(1209), + q(0), + ], + q(bada (nigeria)) => [ + q(1034), + q(0), + ], + q(badaga) => [ + q(1153), + q(0), + ], + q(bade) => [ + q(1094), + q(0), + ], + q(badeshi) => [ + q(1115), + q(0), + ], + q(badi kanum) => [ + q(3332), + q(0), + ], + q(badimaya) => [ + q(1210), + q(0), + ], + q(badjiri) => [ + q(3060), + q(0), + ], + q(badui) => [ + q(1025), + q(0), + ], + q(badyara) => [ + q(5370), + q(0), + ], + q(baeggu) => [ + q(1519), + q(0), + ], + q(baelelea) => [ + q(1518), + q(0), + ], + q(baetora) => [ + q(1485), + q(0), + ], + q(bafanji) => [ + q(1146), + q(0), + ], + q(bafaw-balong) => [ + q(1560), + q(0), + ], + q(bafia) => [ + q(3594), + q(0), + ], + q(bafut) => [ + q(1140), + q(0), + ], + q(baga kaloum) => [ + q(1402), + q(0), + ], + q(baga koga) => [ + q(1174), + q(0), + ], + q(baga manduri) => [ + q(1306), + q(0), + ], + q(baga pokur) => [ + q(1071), + q(0), + ], + q(baga sitemu) => [ + q(1461), + q(0), + ], + q(baga sobane) => [ + q(1467), + q(0), + ], + q(bagheli) => [ + q(1160), + q(0), + ], + q(bagirmi) => [ + q(1311), + q(0), + ], + q(bagirmi fulfulde) => [ + q(2384), + q(0), + ], + q(bago-kusuntu) => [ + q(1403), + q(0), + ], + q(bagri) => [ + q(1176), + q(0), + ], + q(bagupi) => [ + q(1380), + q(0), + ], + q(bagusa) => [ + q(1399), + q(0), + ], + q(bagvalal) => [ + q(3661), + q(0), + ], + q(baha buyang) => [ + q(7627), + q(0), + ], + q(baham) => [ + q(1112), + q(0), + ], + q(bahamas creole english) => [ + q(1029), + q(0), + ], + q(baharna arabic) => [ + q(0580), + q(0), + ], + q(bahau) => [ + q(1205), + q(0), + ], + q(bahinemo) => [ + q(1237), + q(0), + ], + q(bahing) => [ + q(1195), + q(0), + ], + q(bahnar) => [ + q(1106), + q(0), + ], + q(bahonsuai) => [ + q(1466), + q(0), + ], + q(bai) => [ + q(1099), + q(0), + ], + q(baibai) => [ + q(1044), + q(0), + ], + q(baikeno) => [ + q(1276), + q(0), + ], + q(baima) => [ + q(1404), + q(0), + ], + q(baimak) => [ + q(1326), + q(0), + ], + q(bainouk-gunyaamolo) => [ + q(1089), + q(0), + ], + q(bainouk-gunyuno) => [ + q(1024), + q(0), + ], + q(bainouk-samik) => [ + q(1066), + q(0), + ], + q(baiso) => [ + q(1468), + q(0), + ], + q(baissa fali) => [ + q(2324), + q(0), + ], + q(bajan) => [ + q(1247), + q(0), + ], + q(bajelani) => [ + q(1242), + q(0), + ], + q(baka (cameroon)) => [ + q(1256), + q(0), + ], + q(baka (sudan)) => [ + q(1097), + q(0), + ], + q(bakairi) => [ + q(1269), + q(0), + ], + q(bakaka) => [ + q(1422), + q(0), + ], + q(bakhtiari) => [ + q(1405), + q(0), + ], + q(baki) => [ + q(1261), + q(0), + ], + q(bakoko) => [ + q(1260), + q(0), + ], + q(bakole) => [ + q(3455), + q(0), + ], + q(bakpinka) => [ + q(1057), + q(0), + ], + q(bakumpai) => [ + q(1270), + q(0), + ], + q(bakwe) => [ + q(1251), + q(0), + ], + q(balaesang) => [ + q(1296), + q(0), + ], + q(balangao) => [ + q(1299), + q(0), + ], + q(balangingi) => [ + q(6222), + q(0), + ], + q(balanta-ganja) => [ + q(1248), + q(0), + ], + q(balanta-kentohe) => [ + q(1282), + q(0), + ], + q(balantak) => [ + q(1302), + q(0), + ], + q(balau) => [ + q(1284), + q(0), + ], + q(baldemu) => [ + q(1103), + q(0), + ], + q(bali (democratic republic of congo)) => [ + q(1080), + q(0), + ], + q(bali (nigeria)) => [ + q(1078), + q(0), + ], + q(balinese) => [ + q(0043), + q(0), + ], + q(balinese malay) => [ + q(4281), + q(0), + ], + q(balkan gagauz turkish) => [ + q(1183), + q(0), + ], + q(balkan romani) => [ + q(5807), + q(0), + ], + q(balo) => [ + q(1411), + q(0), + ], + q(baloi) => [ + q(1230), + q(0), + ], + q(balti) => [ + q(1156), + q(0), + ], + q(baltic languages) => [ + q(0046), + q(0), + ], + q(baltic romani) => [ + q(5805), + q(0), + ], + q(baluan-pam) => [ + q(1294), + q(0), + ], + q(baluchi) => [ + q(0041), + q(0), + ], + q(bamako sign language) => [ + q(1356), + q(0), + ], + q(bamali) => [ + q(1055), + q(0), + ], + q(bambalang) => [ + q(1317), + q(0), + ], + q(bambam) => [ + q(5629), + q(0), + ], + q(bambara) => [ + q(0042), + q(0), + ], + q(bambassi) => [ + q(4670), + q(0), + ], + q(bambili-bambui) => [ + q(1036), + q(0), + ], + q(bamenyam) => [ + q(1069), + q(0), + ], + q(bamileke languages) => [ + q(0039), + q(0), + ], + q(bamu) => [ + q(1070), + q(0), + ], + q(bamukumbit) => [ + q(1416), + q(0), + ], + q(bamun) => [ + q(1037), + q(0), + ], + q(bamunka) => [ + q(1528), + q(0), + ], + q(bamwe) => [ + q(1309), + q(0), + ], + q(ban khor sign language) => [ + q(1147), + q(0), + ], + q(bana) => [ + q(1087), + q(0), + ], + q(banam bay) => [ + q(7032), + q(1), + ], + q(banao itneg) => [ + q(1252), + q(0), + ], + q(banaro) => [ + q(1611), + q(0), + ], + q(banda (indonesia)) => [ + q(1331), + q(0), + ], + q(banda languages) => [ + q(0038), + q(0), + ], + q(banda malay) => [ + q(1388), + q(0), + ], + q(banda-bambari) => [ + q(3921), + q(0), + ], + q(banda-banda) => [ + q(1377), + q(0), + ], + q(banda-mbres) => [ + q(1407), + q(0), + ], + q(banda-ndele) => [ + q(1148), + q(0), + ], + q(banda-yangere) => [ + q(7569), + q(0), + ], + q(bandi) => [ + q(1612), + q(0), + ], + q(bandial) => [ + q(1406), + q(0), + ], + q(bandjalang) => [ + q(1114), + q(0), + ], + q(bangala) => [ + q(1572), + q(0), + ], + q(bangandu) => [ + q(1167), + q(0), + ], + q(bangba) => [ + q(1043), + q(0), + ], + q(banggai) => [ + q(1185), + q(0), + ], + q(banggarla) => [ + q(1232), + q(0), + ], + q(bangi) => [ + q(1335), + q(0), + ], + q(bangime) => [ + q(1950), + q(0), + ], + q(bangingih sama) => [ + q(6222), + q(1), + ], + q(bangka) => [ + q(4218), + q(0), + ], + q(bangla) => [ + q(0050), + q(1), + ], + q(bangolan) => [ + q(1170), + q(0), + ], + q(bangubangu) => [ + q(1349), + q(0), + ], + q(bangwinji) => [ + q(1455), + q(0), + ], + q(baniva) => [ + q(1536), + q(0), + ], + q(baniwa) => [ + q(1549), + q(0), + ], + q(banjar) => [ + q(1243), + q(0), + ], + q(bankagooma) => [ + q(1587), + q(0), + ], + q(bankal) => [ + q(3106), + q(0), + ], + q(bankan tey dogon) => [ + q(1968), + q(0), + ], + q(bankon) => [ + q(0561), + q(0), + ], + q(bannoni) => [ + q(1077), + q(0), + ], + q(bantawa) => [ + q(1032), + q(0), + ], + q(bantayanon) => [ + q(1159), + q(0), + ], + q(bantik) => [ + q(1343), + q(0), + ], + q(bantoanon) => [ + q(1341), + q(0), + ], + q(bantu (other)) => [ + q(0058), + q(0), + ], + q(bantu languages) => [ + q(0058), + q(1), + ], + q(baoule) => [ + q(1073), + q(0), + ], + q(bara malagasy) => [ + q(1201), + q(0), + ], + q(baraamu) => [ + q(1425), + q(0), + ], + q(barababaraba) => [ + q(5752), + q(0), + ], + q(barai) => [ + q(1040), + q(0), + ], + q(barakai) => [ + q(1030), + q(0), + ], + q(baram kayan) => [ + q(3753), + q(0), + ], + q(barama) => [ + q(1045), + q(0), + ], + q(barambu) => [ + q(1433), + q(0), + ], + q(baramu) => [ + q(1327), + q(0), + ], + q(barapasi) => [ + q(1436), + q(0), + ], + q(baras) => [ + q(1439), + q(0), + ], + q(barasana-eduria) => [ + q(1459), + q(0), + ], + q(barbacoas) => [ + q(1376), + q(0), + ], + q(barbaram) => [ + q(7004), + q(0), + ], + q(barbareno) => [ + q(1358), + q(0), + ], + q(barclayville grebo) => [ + q(2628), + q(0), + ], + q(bardi) => [ + q(1074), + q(0), + ], + q(bare) => [ + q(1026), + q(0), + ], + q(barein) => [ + q(1516), + q(0), + ], + q(bargam) => [ + q(4374), + q(0), + ], + q(bari) => [ + q(1137), + q(0), + ], + q(bariai) => [ + q(1072), + q(0), + ], + q(bariji) => [ + q(1233), + q(0), + ], + q(barikanchi) => [ + q(1580), + q(0), + ], + q(barikewa) => [ + q(3062), + q(0), + ], + q(barok) => [ + q(1240), + q(0), + ], + q(barombi) => [ + q(1047), + q(0), + ], + q(barro negro tunebo) => [ + q(6382), + q(0), + ], + q(barrow point) => [ + q(1391), + q(0), + ], + q(baruga) => [ + q(1254), + q(0), + ], + q(baruya) => [ + q(1605), + q(0), + ], + q(barwe) => [ + q(1547), + q(0), + ], + q(barzani jewish neo-aramaic) => [ + q(1235), + q(0), + ], + q(basa) => [ + q(0045), + q(0), + ], + q(basa (cameroon)) => [ + q(0045), + q(1), + ], + q(basa (nigeria)) => [ + q(1634), + q(0), + ], + q(basa-gumna) => [ + q(1457), + q(0), + ], + q(basa-gurmana) => [ + q(1501), + q(0), + ], + q(basap) => [ + q(1091), + q(0), + ], + q(basay) => [ + q(1604), + q(0), + ], + q(bashkardi) => [ + q(1452), + q(0), + ], + q(bashkir) => [ + q(0040), + q(0), + ], + q(basketo) => [ + q(1465), + q(0), + ], + q(basque) => [ + q(0044), + q(0), + ], + q(basque (family)) => [ + q(0504), + q(0), + ], + q(bassa) => [ + q(1462), + q(0), + ], + q(bassa-kontagora) => [ + q(1463), + q(0), + ], + q(bassari) => [ + q(1449), + q(0), + ], + q(bassossi) => [ + q(1454), + q(0), + ], + q(bata) => [ + q(1471), + q(0), + ], + q(batad ifugao) => [ + q(2910), + q(0), + ], + q(batak) => [ + q(1589), + q(0), + ], + q(batak alas-kluet) => [ + q(1493), + q(0), + ], + q(batak angkola) => [ + q(0723), + q(0), + ], + q(batak dairi) => [ + q(1473), + q(0), + ], + q(batak karo) => [ + q(1491), + q(0), + ], + q(batak languages) => [ + q(0062), + q(0), + ], + q(batak mandailing) => [ + q(1480), + q(0), + ], + q(batak simalungun) => [ + q(1486), + q(0), + ], + q(batak toba) => [ + q(1041), + q(0), + ], + q(batanga) => [ + q(1339), + q(0), + ], + q(batek) => [ + q(1484), + q(0), + ], + q(bateri) => [ + q(1489), + q(0), + ], + q(bathari) => [ + q(1197), + q(0), + ], + q(bati (cameroon)) => [ + q(1472), + q(0), + ], + q(bati (indonesia)) => [ + q(1534), + q(0), + ], + q(bats) => [ + q(1050), + q(0), + ], + q(batu) => [ + q(1488), + q(0), + ], + q(batui) => [ + q(7816), + q(0), + ], + q(batuley) => [ + q(1038), + q(0), + ], + q(batyala) => [ + q(7293), + q(0), + ], + q(bau) => [ + q(1042), + q(0), + ], + q(bau bidayuh) => [ + q(6127), + q(0), + ], + q(bauchi) => [ + q(1451), + q(0), + ], + q(baure) => [ + q(1427), + q(0), + ], + q(bauria) => [ + q(1166), + q(0), + ], + q(bauwaki) => [ + q(1551), + q(0), + ], + q(bauzi) => [ + q(1540), + q(0), + ], + q(bavarian) => [ + q(1033), + q(0), + ], + q(bawm chin) => [ + q(1177), + q(0), + ], + q(bay miwok) => [ + q(4351), + q(0), + ], + q(bayali) => [ + q(1253), + q(0), + ], + q(baybayanon) => [ + q(1539), + q(0), + ], + q(baygo) => [ + q(1595), + q(0), + ], + q(bayono) => [ + q(1600), + q(0), + ], + q(bayot) => [ + q(1090), + q(0), + ], + q(bayungu) => [ + q(1575), + q(0), + ], + q(bazigar) => [ + q(1154), + q(0), + ], + q(beami) => [ + q(1126), + q(0), + ], + q(beaver) => [ + q(1116), + q(0), + ], + q(beba) => [ + q(1152), + q(0), + ], + q(bebele) => [ + q(1117), + q(0), + ], + q(bebeli) => [ + q(1125), + q(0), + ], + q(bebil) => [ + q(1581), + q(0), + ], + q(bedawiyet) => [ + q(0047), + q(1), + ], + q(bedjond) => [ + q(1250), + q(0), + ], + q(bedoanas) => [ + q(1119), + q(0), + ], + q(beeke) => [ + q(1258), + q(0), + ], + q(beele) => [ + q(1582), + q(0), + ], + q(beembe) => [ + q(1128), + q(0), + ], + q(beezen) => [ + q(1351), + q(0), + ], + q(befang) => [ + q(1063), + q(0), + ], + q(begbere-ejar) => [ + q(1418), + q(1), + ], + q(beja) => [ + q(0047), + q(0), + ], + q(bekati') => [ + q(1124), + q(0), + ], + q(bekwarra) => [ + q(1274), + q(0), + ], + q(bekwel) => [ + q(1275), + q(0), + ], + q(belait) => [ + q(1122), + q(0), + ], + q(belanda bor) => [ + q(1567), + q(0), + ], + q(belanda viri) => [ + q(1524), + q(0), + ], + q(belarusian) => [ + q(0048), + q(0), + ], + q(belhariya) => [ + q(1609), + q(0), + ], + q(beli (papua new guinea)) => [ + q(1135), + q(0), + ], + q(beli (sudan)) => [ + q(1290), + q(0), + ], + q(belize kriol english) => [ + q(1621), + q(0), + ], + q(bella coola) => [ + q(1280), + q(0), + ], + q(bellari) => [ + q(1443), + q(0), + ], + q(bemba) => [ + q(0049), + q(0), + ], + q(bemba (zambia)) => [ + q(0049), + q(1), + ], + q(bembe) => [ + q(1304), + q(0), + ], + q(ben tey dogon) => [ + q(1965), + q(0), + ], + q(bena (nigeria)) => [ + q(7759), + q(0), + ], + q(bena (tanzania)) => [ + q(1136), + q(0), + ], + q(benabena) => [ + q(1121), + q(0), + ], + q(bench) => [ + q(1081), + q(0), + ], + q(bende) => [ + q(1105), + q(0), + ], + q(bendi) => [ + q(1084), + q(0), + ], + q(beneraf) => [ + q(1347), + q(1), + ], + q(beng) => [ + q(4854), + q(0), + ], + q(benga) => [ + q(1334), + q(0), + ], + q(bengali) => [ + q(0050), + q(0), + ], + q(benggoi) => [ + q(1184), + q(0), + ], + q(bengkala sign language) => [ + q(1421), + q(0), + ], + q(bentong) => [ + q(1346), + q(0), + ], + q(benyadu') => [ + q(1592), + q(0), + ], + q(beothuk) => [ + q(1497), + q(0), + ], + q(bepour) => [ + q(1214), + q(0), + ], + q(bera) => [ + q(1426), + q(0), + ], + q(berakou) => [ + q(1586), + q(0), + ], + q(berau malay) => [ + q(1520), + q(0), + ], + q(berber languages) => [ + q(0051), + q(0), + ], + q(berbice creole dutch) => [ + q(1424), + q(0), + ], + q(berik) => [ + q(1264), + q(0), + ], + q(berinomo) => [ + q(1224), + q(0), + ], + q(berom) => [ + q(1362), + q(0), + ], + q(berta) => [ + q(7229), + q(0), + ], + q(berti) => [ + q(1607), + q(0), + ], + q(besisi) => [ + q(4271), + q(0), + ], + q(besme) => [ + q(1129), + q(0), + ], + q(besoa) => [ + q(1127), + q(0), + ], + q(betaf) => [ + q(1141), + q(0), + ], + q(betawi) => [ + q(1133), + q(0), + ], + q(bete) => [ + q(1594), + q(0), + ], + q(bete-bendi) => [ + q(1487), + q(0), + ], + q(beti (cote d'ivoire)) => [ + q(2275), + q(0), + ], + q(betta kurumba) => [ + q(7516), + q(0), + ], + q(bezhta) => [ + q(3179), + q(0), + ], + q(bhadrawahi) => [ + q(1189), + q(0), + ], + q(bhalay) => [ + q(1207), + q(0), + ], + q(bharia) => [ + q(1186), + q(0), + ], + q(bhatri) => [ + q(1182), + q(0), + ], + q(bhattiyali) => [ + q(1203), + q(0), + ], + q(bhaya) => [ + q(1190), + q(0), + ], + q(bhele) => [ + q(1208), + q(0), + ], + q(bhilali) => [ + q(1194), + q(0), + ], + q(bhili) => [ + q(1187), + q(0), + ], + q(bhojpuri) => [ + q(0052), + q(0), + ], + q(bhoti kinnauri) => [ + q(4816), + q(0), + ], + q(bhujel) => [ + q(1596), + q(0), + ], + q(bhunjia) => [ + q(1204), + q(0), + ], + q(biafada) => [ + q(1215), + q(0), + ], + q(biage) => [ + q(1095), + q(0), + ], + q(biak) => [ + q(1206), + q(0), + ], + q(biali) => [ + q(1123), + q(0), + ], + q(bian marind) => [ + q(1393), + q(0), + ], + q(biangai) => [ + q(1216), + q(0), + ], + q(biao) => [ + q(1599), + q(0), + ], + q(biao mon) => [ + q(1322), + q(0), + ], + q(biao-jiao mien) => [ + q(1234), + q(0), + ], + q(biatah bidayuh) => [ + q(1477), + q(0), + ], + q(bibbulman) => [ + q(7290), + q(0), + ], + q(bidhawal) => [ + q(2929), + q(0), + ], + q(bidiyo) => [ + q(1213), + q(0), + ], + q(bidyara) => [ + q(1601), + q(0), + ], + q(bidyogo) => [ + q(1236), + q(0), + ], + q(biem) => [ + q(1305), + q(0), + ], + q(bierebo) => [ + q(1337), + q(0), + ], + q(bieria) => [ + q(1430), + q(0), + ], + q(biete) => [ + q(1225), + q(0), + ], + q(big nambas) => [ + q(4956), + q(0), + ], + q(biga) => [ + q(1188), + q(0), + ], + q(bigambal) => [ + q(7283), + q(0), + ], + q(bih) => [ + q(2888), + q(0), + ], + q(bihari languages) => [ + q(0053), + q(0), + ], + q(bijori) => [ + q(1228), + q(0), + ], + q(bikaru) => [ + q(1212), + q(0), + ], + q(bikol) => [ + q(0054), + q(0), + ], + q(bikya) => [ + q(1590), + q(0), + ], + q(bila) => [ + q(1221), + q(0), + ], + q(bilakura) => [ + q(1408), + q(0), + ], + q(bilaspuri) => [ + q(3300), + q(0), + ], + q(bilba) => [ + q(1397), + q(0), + ], + q(bilbil) => [ + q(1446), + q(0), + ], + q(bile) => [ + q(1218), + q(0), + ], + q(bilin) => [ + q(0067), + q(1), + ], + q(bilma kanuri) => [ + q(1321), + q(0), + ], + q(biloxi) => [ + q(1289), + q(0), + ], + q(bilua) => [ + q(1279), + q(0), + ], + q(bilur) => [ + q(1571), + q(0), + ], + q(bima) => [ + q(1199), + q(0), + ], + q(bimin) => [ + q(1196), + q(0), + ], + q(bimoba) => [ + q(1219), + q(0), + ], + q(bina (nigeria)) => [ + q(1598), + q(0), + ], + q(bina (papua new guinea)) => [ + q(1316), + q(0), + ], + q(binahari) => [ + q(1588), + q(0), + ], + q(binandere) => [ + q(1192), + q(0), + ], + q(bindal) => [ + q(7282), + q(0), + ], + q(bine) => [ + q(1363), + q(0), + ], + q(bini) => [ + q(0055), + q(0), + ], + q(binji) => [ + q(1381), + q(0), + ], + q(binongan itneg) => [ + q(3008), + q(0), + ], + q(bintauna) => [ + q(1332), + q(0), + ], + q(bintulu) => [ + q(1350), + q(0), + ], + q(binukid) => [ + q(1257), + q(0), + ], + q(binumarien) => [ + q(1246), + q(0), + ], + q(bipi) => [ + q(1222), + q(0), + ], + q(birale) => [ + q(1570), + q(0), + ], + q(birao) => [ + q(1438), + q(0), + ], + q(birgit) => [ + q(1475), + q(0), + ], + q(birhor) => [ + q(1229), + q(0), + ], + q(biri) => [ + q(1629), + q(0), + ], + q(biritai) => [ + q(1413), + q(0), + ], + q(birked) => [ + q(1431), + q(0), + ], + q(birri) => [ + q(1532), + q(0), + ], + q(birrpayi) => [ + q(7286), + q(0), + ], + q(birwa) => [ + q(1432), + q(0), + ], + q(bisa) => [ + q(1211), + q(1), + ], + q(biseni) => [ + q(2932), + q(0), + ], + q(bishnupriya) => [ + q(1396), + q(0), + ], + q(bishuo) => [ + q(1548), + q(0), + ], + q(bisis) => [ + q(1348), + q(0), + ], + q(bislama) => [ + q(0056), + q(0), + ], + q(bisorio) => [ + q(1223), + q(0), + ], + q(bissa) => [ + q(1211), + q(0), + ], + q(bisu) => [ + q(1620), + q(0), + ], + q(bit) => [ + q(1171), + q(0), + ], + q(bitare) => [ + q(1440), + q(0), + ], + q(bitur) => [ + q(4147), + q(0), + ], + q(biwat) => [ + q(1553), + q(0), + ], + q(biyo) => [ + q(1602), + q(0), + ], + q(biyom) => [ + q(1384), + q(0), + ], + q(blablanga) => [ + q(1293), + q(0), + ], + q(blafe) => [ + q(1144), + q(0), + ], + q(blagar) => [ + q(1131), + q(0), + ], + q(blang) => [ + q(1295), + q(0), + ], + q(blin) => [ + q(0067), + q(0), + ], + q(bliss) => [ + q(0479), + q(2), + ], + q(blissymbolics) => [ + q(0479), + q(1), + ], + q(blissymbols) => [ + q(0479), + q(0), + ], + q(bo (laos)) => [ + q(1172), + q(0), + ], + q(bo (papua new guinea)) => [ + q(1394), + q(0), + ], + q(bo-rukul) => [ + q(4109), + q(0), + ], + q(bo-ung) => [ + q(4591), + q(0), + ], + q(boano (maluku)) => [ + q(1625), + q(0), + ], + q(boano (sulawesi)) => [ + q(1623), + q(0), + ], + q(bobongko) => [ + q(1163), + q(0), + ], + q(bobot) => [ + q(1492), + q(0), + ], + q(bodo (central african republic)) => [ + q(1373), + q(0), + ], + q(bodo (india)) => [ + q(1444), + q(0), + ], + q(bodo gadaba) => [ + q(2426), + q(0), + ], + q(bodo parja) => [ + q(1111), + q(0), + ], + q(bofi) => [ + q(1142), + q(0), + ], + q(boga) => [ + q(1537), + q(0), + ], + q(bogaya) => [ + q(1366), + q(0), + ], + q(boghom) => [ + q(1513), + q(0), + ], + q(boguru) => [ + q(1417), + q(0), + ], + q(bohtan neo-aramaic) => [ + q(1198), + q(0), + ], + q(boikin) => [ + q(1617), + q(0), + ], + q(bokha) => [ + q(7590), + q(0), + ], + q(bokmal, norwegian) => [ + q(0314), + q(0), + ], + q(boko (benin)) => [ + q(1400), + q(0), + ], + q(boko (democratic republic of congo)) => [ + q(1268), + q(0), + ], + q(bokobaru) => [ + q(1508), + q(0), + ], + q(bokoto) => [ + q(1109), + q(0), + ], + q(bokyi) => [ + q(1277), + q(0), + ], + q(bola) => [ + q(1342), + q(0), + ], + q(bolango) => [ + q(1281), + q(0), + ], + q(bole) => [ + q(1361), + q(0), + ], + q(bolgarian) => [ + q(7289), + q(0), + ], + q(bolgo) => [ + q(1530), + q(0), + ], + q(bolia) => [ + q(1286), + q(0), + ], + q(bolinao) => [ + q(6112), + q(0), + ], + q(bolivian sign language) => [ + q(1527), + q(0), + ], + q(bolo) => [ + q(1298), + q(1), + ], + q(boloki) => [ + q(1272), + q(0), + ], + q(bolon) => [ + q(1355), + q(0), + ], + q(bolondo) => [ + q(1624), + q(0), + ], + q(bolongan) => [ + q(1287), + q(0), + ], + q(bolyu) => [ + q(5503), + q(0), + ], + q(bom-kim) => [ + q(1308), + q(0), + ], + q(boma) => [ + q(1357), + q(0), + ], + q(bomboli) => [ + q(1314), + q(0), + ], + q(bomboma) => [ + q(1559), + q(0), + ], + q(bomitaba) => [ + q(7884), + q(0), + ], + q(bomu) => [ + q(1319), + q(0), + ], + q(bomwali) => [ + q(1325), + q(0), + ], + q(bon gula) => [ + q(2541), + q(0), + ], + q(bonan) => [ + q(5406), + q(0), + ], + q(bondei) => [ + q(1369), + q(0), + ], + q(bondo) => [ + q(1158), + q(0), + ], + q(bondoukou kulango) => [ + q(3763), + q(0), + ], + q(bondum dom dogon) => [ + q(1966), + q(0), + ], + q(bonerate) => [ + q(1328), + q(0), + ], + q(bonerif) => [ + q(1347), + q(0), + ], + q(bonggi) => [ + q(1096), + q(0), + ], + q(bonggo) => [ + q(1378), + q(0), + ], + q(bongili) => [ + q(1500), + q(0), + ], + q(bongo) => [ + q(1368), + q(0), + ], + q(bongu) => [ + q(1392), + q(0), + ], + q(bonjo) => [ + q(1360), + q(0), + ], + q(bonkeng) => [ + q(1522), + q(0), + ], + q(bonkiman) => [ + q(1365), + q(0), + ], + q(bontok) => [ + q(1330), + q(0), + ], + q(boo) => [ + q(1400), + q(1), + ], + q(bookan) => [ + q(1329), + q(0), + ], + q(boon) => [ + q(1338), + q(0), + ], + q(boor) => [ + q(1521), + q(0), + ], + q(bora) => [ + q(1352), + q(0), + ], + q(borana-arsi-guji oromo) => [ + q(2417), + q(0), + ], + q(border kuna) => [ + q(3674), + q(0), + ], + q(borei) => [ + q(2403), + q(0), + ], + q(borgu fulfulde) => [ + q(2381), + q(0), + ], + q(borna (ethiopia)) => [ + q(1555), + q(1), + ], + q(boro (ethiopia)) => [ + q(1555), + q(0), + ], + q(boro (ghana)) => [ + q(7545), + q(0), + ], + q(borong) => [ + q(3606), + q(0), + ], + q(bororo) => [ + q(1367), + q(0), + ], + q(boruca) => [ + q(1434), + q(0), + ], + q(boselewa) => [ + q(1546), + q(0), + ], + q(bosngun) => [ + q(1415), + q(0), + ], + q(bosnian) => [ + q(0059), + q(0), + ], + q(bote-majhi) => [ + q(1312), + q(0), + ], + q(botlikh) => [ + q(1379), + q(0), + ], + q(botolan sambal) => [ + q(5903), + q(0), + ], + q(bouna kulango) => [ + q(4934), + q(0), + ], + q(bouyei) => [ + q(5379), + q(0), + ], + q(bozaba) => [ + q(1626), + q(0), + ], + q(bragat) => [ + q(0820), + q(0), + ], + q(brahui) => [ + q(1428), + q(0), + ], + q(braj) => [ + q(0060), + q(0), + ], + q(brazilian sign language) => [ + q(1630), + q(0), + ], + q(brem) => [ + q(1507), + q(0), + ], + q(breri) => [ + q(1437), + q(0), + ], + q(breton) => [ + q(0061), + q(0), + ], + q(bribri) => [ + q(1615), + q(0), + ], + q(brithenig) => [ + q(1631), + q(0), + ], + q(british sign language) => [ + q(1145), + q(0), + ], + q(brokkat) => [ + q(1435), + q(0), + ], + q(brokpake) => [ + q(5995), + q(0), + ], + q(brokskat) => [ + q(1263), + q(0), + ], + q(brooke's point palawano) => [ + q(5502), + q(0), + ], + q(broome pearling lugger pidgin) => [ + q(1383), + q(0), + ], + q(brunei) => [ + q(3714), + q(0), + ], + q(brunei bisaya) => [ + q(1448), + q(0), + ], + q(bu) => [ + q(3092), + q(0), + ], + q(bu-nao bunu) => [ + q(1563), + q(0), + ], + q(bua) => [ + q(1494), + q(0), + ], + q(bualkhaw chin) => [ + q(1666), + q(0), + ], + q(buamu) => [ + q(1372), + q(0), + ], + q(bube) => [ + q(1517), + q(0), + ], + q(bubi) => [ + q(1512), + q(0), + ], + q(bubia) => [ + q(1062), + q(0), + ], + q(budeh stieng) => [ + q(6261), + q(0), + ], + q(budibud) => [ + q(1483), + q(0), + ], + q(budong-budong) => [ + q(1113), + q(0), + ], + q(budu) => [ + q(1510), + q(0), + ], + q(budukh) => [ + q(1100), + q(0), + ], + q(buduma) => [ + q(1102), + q(0), + ], + q(budza) => [ + q(1231), + q(0), + ], + q(bugan) => [ + q(1046), + q(0), + ], + q(bugawac) => [ + q(1502), + q(0), + ], + q(bughotu) => [ + q(1179), + q(0), + ], + q(buginese) => [ + q(0064), + q(0), + ], + q(buglere) => [ + q(5877), + q(0), + ], + q(bugun) => [ + q(1168), + q(0), + ], + q(buhi'non bikol) => [ + q(6841), + q(0), + ], + q(buhid) => [ + q(1273), + q(0), + ], + q(buhutu) => [ + q(1573), + q(0), + ], + q(bukar-sadung bidayuh) => [ + q(5946), + q(0), + ], + q(bukat) => [ + q(1526), + q(0), + ], + q(bukharic) => [ + q(1193), + q(0), + ], + q(bukit malay) => [ + q(1535), + q(0), + ], + q(bukitan) => [ + q(1266), + q(0), + ], + q(bukiyip) => [ + q(0838), + q(0), + ], + q(buksa) => [ + q(6536), + q(0), + ], + q(bukusu) => [ + q(1576), + q(0), + ], + q(bukwen) => [ + q(1515), + q(0), + ], + q(bulgarian) => [ + q(0065), + q(0), + ], + q(bulgarian sign language) => [ + q(1410), + q(0), + ], + q(bulgebi) => [ + q(1318), + q(0), + ], + q(buli (ghana)) => [ + q(1561), + q(0), + ], + q(buli (indonesia)) => [ + q(1628), + q(0), + ], + q(bullom so) => [ + q(1514), + q(0), + ], + q(bulo stieng) => [ + q(6250), + q(0), + ], + q(bulu (cameroon)) => [ + q(1503), + q(0), + ], + q(bulu (papua new guinea)) => [ + q(1241), + q(0), + ], + q(bum) => [ + q(1324), + q(0), + ], + q(bumaji) => [ + q(1603), + q(0), + ], + q(bumang) => [ + q(1531), + q(0), + ], + q(bumbita arapesh) => [ + q(0828), + q(0), + ], + q(bumthangkha) => [ + q(3399), + q(0), + ], + q(bun) => [ + q(1511), + q(0), + ], + q(buna) => [ + q(1529), + q(0), + ], + q(bunaba) => [ + q(1075), + q(0), + ], + q(bunak) => [ + q(1150), + q(0), + ], + q(bunama) => [ + q(1093), + q(0), + ], + q(bundeli) => [ + q(1345), + q(0), + ], + q(bung) => [ + q(1401), + q(0), + ], + q(bungain) => [ + q(1509), + q(0), + ], + q(bunganditj) => [ + q(7284), + q(0), + ], + q(bungku) => [ + q(1278), + q(0), + ], + q(bungu) => [ + q(7239), + q(0), + ], + q(bunoge dogon) => [ + q(1999), + q(0), + ], + q(bunun) => [ + q(1340), + q(0), + ], + q(buol) => [ + q(1283), + q(0), + ], + q(bura-pabir) => [ + q(1558), + q(0), + ], + q(burak) => [ + q(1606), + q(0), + ], + q(buraka) => [ + q(1259), + q(0), + ], + q(burarra) => [ + q(1533), + q(0), + ], + q(burate) => [ + q(1478), + q(0), + ], + q(burduna) => [ + q(1579), + q(0), + ], + q(bure) => [ + q(1523), + q(0), + ], + q(buriat) => [ + q(0063), + q(0), + ], + q(burji) => [ + q(1238), + q(0), + ], + q(burmbar) => [ + q(7032), + q(0), + ], + q(burmese) => [ + q(0066), + q(0), + ], + q(burmeso) => [ + q(1632), + q(0), + ], + q(buru (indonesia)) => [ + q(4284), + q(0), + ], + q(buru (nigeria)) => [ + q(1419), + q(0), + ], + q(burui) => [ + q(1445), + q(0), + ], + q(burumakok) => [ + q(0706), + q(0), + ], + q(burun) => [ + q(1098), + q(0), + ], + q(burunge) => [ + q(1108), + q(0), + ], + q(burushaski) => [ + q(1456), + q(0), + ], + q(burusu) => [ + q(1414), + q(0), + ], + q(buruwai) => [ + q(0894), + q(0), + ], + q(busa) => [ + q(1412), + q(0), + ], + q(busam) => [ + q(1584), + q(0), + ], + q(busami) => [ + q(1458), + q(0), + ], + q(busang kayan) => [ + q(1143), + q(0), + ], + q(bushi) => [ + q(1495), + q(0), + ], + q(bushoong) => [ + q(1498), + q(0), + ], + q(businenge tongo) => [ + q(2060), + q(1), + ], + q(buso) => [ + q(1460), + q(0), + ], + q(busoa) => [ + q(1506), + q(0), + ], + q(bussa) => [ + q(2124), + q(0), + ], + q(busuu) => [ + q(1249), + q(0), + ], + q(butbut kalinga) => [ + q(3736), + q(0), + ], + q(butmas-tur) => [ + q(1344), + q(0), + ], + q(butuanon) => [ + q(1490), + q(0), + ], + q(buwal) => [ + q(1202), + q(0), + ], + q(buxinhua) => [ + q(1171), + q(1), + ], + q(buyu) => [ + q(1597), + q(0), + ], + q(buyuan jinuo) => [ + q(3104), + q(0), + ], + q(bwa) => [ + q(1562), + q(0), + ], + q(bwaidoka) => [ + q(1544), + q(0), + ], + q(bwanabwana) => [ + q(6723), + q(0), + ], + q(bwatoo) => [ + q(1541), + q(0), + ], + q(bwe karen) => [ + q(1545), + q(0), + ], + q(bwela) => [ + q(1552), + q(0), + ], + q(bwile) => [ + q(1543), + q(0), + ], + q(bwisi) => [ + q(1565), + q(0), + ], + q(byangsi) => [ + q(1120), + q(0), + ], + q(byep) => [ + q(4345), + q(0), + ], + q(c'lela) => [ + q(2133), + q(0), + ], + q(caac) => [ + q(4539), + q(0), + ], + q(cabecar) => [ + q(1748), + q(0), + ], + q(cabiyari) => [ + q(1659), + q(0), + ], + q(cacaloxtepec mixtec) => [ + q(4308), + q(0), + ], + q(cacaopera) => [ + q(1688), + q(0), + ], + q(cacgia roglai) => [ + q(5827), + q(0), + ], + q(cacua) => [ + q(1674), + q(0), + ], + q(caddo) => [ + q(0068), + q(0), + ], + q(caddoan languages) => [ + q(0499), + q(0), + ], + q(cafundo creole) => [ + q(1679), + q(0), + ], + q(cahuarano) => [ + q(1644), + q(0), + ], + q(cahuilla) => [ + q(1721), + q(0), + ], + q(cahungwarya) => [ + q(4727), + q(0), + ], + q(cajamarca quechua) => [ + q(5692), + q(0), + ], + q(cajatambo north lima quechua) => [ + q(5697), + q(0), + ], + q(cajonos zapotec) => [ + q(7793), + q(0), + ], + q(cajun french) => [ + q(2369), + q(0), + ], + q(caka) => [ + q(1763), + q(0), + ], + q(cakchiquel) => [ + q(1646), + q(1), + ], + q(cakchiquel-quiche mixed language) => [ + q(1765), + q(0), + ], + q(cakfem-mushere) => [ + q(1764), + q(0), + ], + q(calamian tagbanwa) => [ + q(6379), + q(0), + ], + q(calderon highland quichua) => [ + q(5673), + q(0), + ], + q(callawalla) => [ + q(1655), + q(0), + ], + q(calo) => [ + q(5810), + q(0), + ], + q(caluyanun) => [ + q(1778), + q(0), + ], + q(cameroon mambila) => [ + q(4165), + q(0), + ], + q(cameroon pidgin) => [ + q(7097), + q(0), + ], + q(camling) => [ + q(5728), + q(0), + ], + q(campalagian) => [ + q(1785), + q(0), + ], + q(campidanese sardinian) => [ + q(6209), + q(0), + ], + q(camsa) => [ + q(3189), + q(0), + ], + q(camtho) => [ + q(1791), + q(0), + ], + q(camunic) => [ + q(7295), + q(0), + ], + q(canar highland quichua) => [ + q(5720), + q(0), + ], + q(candoshi-shapra) => [ + q(1673), + q(0), + ], + q(canela) => [ + q(5737), + q(0), + ], + q(canichana) => [ + q(1658), + q(0), + ], + q(cantonese) => [ + q(7751), + q(1), + ], + q(cao lan) => [ + q(4363), + q(0), + ], + q(cao miao) => [ + q(1823), + q(0), + ], + q(capanahua) => [ + q(3180), + q(0), + ], + q(capiznon) => [ + q(1834), + q(0), + ], + q(cappadocian greek) => [ + q(1830), + q(0), + ], + q(caquinte) => [ + q(1821), + q(0), + ], + q(car nicobarese) => [ + q(1652), + q(0), + ], + q(cara) => [ + q(1709), + q(0), + ], + q(carabayo) => [ + q(1676), + q(0), + ], + q(caramanta) => [ + q(1843), + q(0), + ], + q(carapana) => [ + q(1660), + q(0), + ], + q(carian) => [ + q(7303), + q(0), + ], + q(caribbean hindustani) => [ + q(2805), + q(0), + ], + q(caribbean javanese) => [ + q(3165), + q(0), + ], + q(carijona) => [ + q(1661), + q(0), + ], + q(carolina algonquian) => [ + q(1853), + q(0), + ], + q(carolinian) => [ + q(1647), + q(0), + ], + q(carpathian romani) => [ + q(5797), + q(0), + ], + q(carrier) => [ + q(1858), + q(0), + ], + q(cashibo-cacataibo) => [ + q(1670), + q(0), + ], + q(cashinahua) => [ + q(1671), + q(0), + ], + q(casiguran dumagat agta) => [ + q(2000), + q(0), + ], + q(castilian) => [ + q(0402), + q(1), + ], + q(casuarina coast asmat) => [ + q(0888), + q(0), + ], + q(catalan) => [ + q(0071), + q(0), + ], + q(catalan sign language) => [ + q(1862), + q(0), + ], + q(catawba) => [ + q(1716), + q(0), + ], + q(cauca) => [ + q(1677), + q(0), + ], + q(caucasian languages) => [ + q(0072), + q(0), + ], + q(cavinena) => [ + q(1654), + q(0), + ], + q(cayubaba) => [ + q(1925), + q(0), + ], + q(cayuga) => [ + q(1657), + q(0), + ], + q(cayuse) => [ + q(7308), + q(0), + ], + q(cebaara senoufo) => [ + q(5959), + q(0), + ], + q(cebuano) => [ + q(0073), + q(0), + ], + q(celtiberian) => [ + q(7296), + q(0), + ], + q(celtic languages) => [ + q(0074), + q(0), + ], + q(cemuhi) => [ + q(1648), + q(0), + ], + q(cen) => [ + q(1706), + q(0), + ], + q(central american indian languages) => [ + q(0069), + q(0), + ], + q(central asmat) => [ + q(1801), + q(0), + ], + q(central atlas tamazight) => [ + q(6832), + q(0), + ], + q(central awyu) => [ + q(0981), + q(0), + ], + q(central aymara) => [ + q(1007), + q(0), + ], + q(central bai) => [ + q(1065), + q(0), + ], + q(central berawan) => [ + q(7814), + q(0), + ], + q(central bikol) => [ + q(1076), + q(0), + ], + q(central bontok) => [ + q(3812), + q(0), + ], + q(central cagayan agta) => [ + q(0671), + q(0), + ], + q(central dusun) => [ + q(2159), + q(1), + ], + q(central grebo) => [ + q(2625), + q(0), + ], + q(central hongshuihe zhuang) => [ + q(7819), + q(0), + ], + q(central huasteca nahuatl) => [ + q(4761), + q(0), + ], + q(central huishui hmong) => [ + q(2776), + q(0), + ], + q(central huishui miao) => [ + q(2776), + q(1), + ], + q(central kanuri) => [ + q(3479), + q(0), + ], + q(central khmer) => [ + q(0223), + q(0), + ], + q(central kurdish) => [ + q(1752), + q(0), + ], + q(central lalo) => [ + q(7776), + q(1), + ], + q(central maewo) => [ + q(4629), + q(0), + ], + q(central malay) => [ + q(5604), + q(0), + ], + q(central malayo-polynesian languages) => [ + q(0520), + q(0), + ], + q(central masela) => [ + q(4665), + q(0), + ], + q(central mashan hmong) => [ + q(2786), + q(0), + ], + q(central mashan miao) => [ + q(2786), + q(1), + ], + q(central mazahua) => [ + q(4119), + q(0), + ], + q(central melanau) => [ + q(4204), + q(0), + ], + q(central mnong) => [ + q(1788), + q(0), + ], + q(central nahuatl) => [ + q(4864), + q(0), + ], + q(central nicobarese) => [ + q(4755), + q(0), + ], + q(central ojibwa) => [ + q(5214), + q(0), + ], + q(central okinawan) => [ + q(5874), + q(0), + ], + q(central palawano) => [ + q(5485), + q(0), + ], + q(central pame) => [ + q(5372), + q(0), + ], + q(central pashto) => [ + q(5616), + q(0), + ], + q(central pomo) => [ + q(5558), + q(0), + ], + q(central puebla nahuatl) => [ + q(4775), + q(0), + ], + q(central sama) => [ + q(6113), + q(0), + ], + q(central siberian yupik) => [ + q(2297), + q(0), + ], + q(central sierra miwok) => [ + q(1872), + q(0), + ], + q(central subanen) => [ + q(6324), + q(0), + ], + q(central sudanic languages) => [ + q(0500), + q(0), + ], + q(central tagbanwa) => [ + q(6479), + q(0), + ], + q(central tarahumara) => [ + q(6361), + q(0), + ], + q(central tunebo) => [ + q(6749), + q(0), + ], + q(central yupik) => [ + q(2298), + q(0), + ], + q(central-eastern niger fulfulde) => [ + q(2388), + q(0), + ], + q(centuum) => [ + q(1707), + q(0), + ], + q(cerma) => [ + q(1782), + q(0), + ], + q(chabu) => [ + q(5897), + q(0), + ], + q(chachapoyas quechua) => [ + q(5678), + q(0), + ], + q(chachi) => [ + q(1663), + q(0), + ], + q(chacobo) => [ + q(1650), + q(0), + ], + q(chadian arabic) => [ + q(6019), + q(0), + ], + q(chadian sign language) => [ + q(1700), + q(0), + ], + q(chadic languages) => [ + q(0498), + q(0), + ], + q(chadong) => [ + q(1701), + q(0), + ], + q(chagatai) => [ + q(0078), + q(0), + ], + q(chaima) => [ + q(1739), + q(0), + ], + q(chak) => [ + q(1753), + q(0), + ], + q(chakali) => [ + q(1771), + q(0), + ], + q(chakma) => [ + q(1687), + q(0), + ], + q(chala) => [ + q(1774), + q(0), + ], + q(chaldean neo-aramaic) => [ + q(1768), + q(0), + ], + q(chalikha) => [ + q(6469), + q(0), + ], + q(chamacoco) => [ + q(1704), + q(0), + ], + q(chamalal) => [ + q(1743), + q(0), + ], + q(chamari) => [ + q(1692), + q(0), + ], + q(chambeali) => [ + q(1693), + q(0), + ], + q(chambri) => [ + q(1649), + q(0), + ], + q(chamic languages) => [ + q(0089), + q(0), + ], + q(chamicuro) => [ + q(1678), + q(0), + ], + q(chamorro) => [ + q(0075), + q(0), + ], + q(chane) => [ + q(1645), + q(0), + ], + q(chang naga) => [ + q(4734), + q(0), + ], + q(changriwa) => [ + q(1712), + q(0), + ], + q(changthang) => [ + q(1792), + q(0), + ], + q(chantyal) => [ + q(1725), + q(0), + ], + q(chara) => [ + q(1839), + q(0), + ], + q(chaudangsi) => [ + q(1697), + q(0), + ], + q(chaura) => [ + q(1856), + q(0), + ], + q(chavacano) => [ + q(1665), + q(0), + ], + q(chayahuita) => [ + q(1672), + q(0), + ], + q(chayuco mixtec) => [ + q(4297), + q(0), + ], + q(chazumba mixtec) => [ + q(7493), + q(0), + ], + q(che) => [ + q(5858), + q(0), + ], + q(chechen) => [ + q(0077), + q(0), + ], + q(cheke holo) => [ + q(4511), + q(0), + ], + q(chemakum) => [ + q(7298), + q(0), + ], + q(chenapian) => [ + q(1746), + q(0), + ], + q(chenchu) => [ + q(1690), + q(0), + ], + q(chenoua) => [ + q(1803), + q(0), + ], + q(chepang) => [ + q(1696), + q(0), + ], + q(chepya) => [ + q(7600), + q(0), + ], + q(cheq wong) => [ + q(1922), + q(1), + ], + q(cherepon) => [ + q(1832), + q(0), + ], + q(cherokee) => [ + q(0085), + q(0), + ], + q(chesu) => [ + q(7597), + q(0), + ], + q(chetco) => [ + q(1884), + q(0), + ], + q(chewa) => [ + q(0322), + q(1), + ], + q(chewong) => [ + q(1922), + q(0), + ], + q(cheyenne) => [ + q(0088), + q(0), + ], + q(chhattisgarhi) => [ + q(2799), + q(0), + ], + q(chhintange) => [ + q(1891), + q(0), + ], + q(chhulung) => [ + q(1910), + q(0), + ], + q(chiangmai sign language) => [ + q(1863), + q(0), + ], + q(chiapanec) => [ + q(1736), + q(0), + ], + q(chibcha) => [ + q(0076), + q(0), + ], + q(chibchan languages) => [ + q(0495), + q(0), + ], + q(chicahuaxtla triqui) => [ + q(6689), + q(0), + ], + q(chichewa) => [ + q(0322), + q(0), + ], + q(chichicapan zapotec) => [ + q(7920), + q(0), + ], + q(chichimeca-jonaz) => [ + q(5407), + q(0), + ], + q(chichonyi-chidzihana-chikauma) => [ + q(1813), + q(1), + ], + q(chickasaw) => [ + q(1729), + q(0), + ], + q(chicomuceltec) => [ + q(1807), + q(0), + ], + q(chidigo) => [ + q(2034), + q(1), + ], + q(chiduruma) => [ + q(2170), + q(1), + ], + q(chiga) => [ + q(1714), + q(0), + ], + q(chigmecatitlan mixtec) => [ + q(4298), + q(0), + ], + q(chilcotin) => [ + q(1767), + q(0), + ], + q(chilean sign language) => [ + q(1866), + q(0), + ], + q(chilisso) => [ + q(1770), + q(0), + ], + q(chiltepec chinantec) => [ + q(1861), + q(0), + ], + q(chimakum) => [ + q(7298), + q(1), + ], + q(chimalapa zoque) => [ + q(7893), + q(0), + ], + q(chimariko) => [ + q(1730), + q(0), + ], + q(chimborazo highland quichua) => [ + q(5675), + q(0), + ], + q(chimila) => [ + q(1662), + q(0), + ], + q(china buriat) => [ + q(1585), + q(0), + ], + q(chinali) => [ + q(1732), + q(0), + ], + q(chinbon chin) => [ + q(1793), + q(0), + ], + q(chincha quechua) => [ + q(5713), + q(0), + ], + q(chinese) => [ + q(0079), + q(0), + ], + q(chinese (family)) => [ + q(0534), + q(0), + ], + q(chinese pidgin english) => [ + q(1831), + q(0), + ], + q(chinese sign language) => [ + q(1871), + q(0), + ], + q(chini) => [ + q(0644), + q(1), + ], + q(chinook) => [ + q(1719), + q(0), + ], + q(chinook jargon) => [ + q(0082), + q(0), + ], + q(chipaya) => [ + q(1651), + q(0), + ], + q(chipewyan) => [ + q(0084), + q(0), + ], + q(chippewa) => [ + q(1738), + q(0), + ], + q(chiquian ancash quechua) => [ + q(5712), + q(0), + ], + q(chiquihuitlan mazatec) => [ + q(4113), + q(0), + ], + q(chiquitano) => [ + q(1656), + q(0), + ], + q(chiripa) => [ + q(4856), + q(0), + ], + q(chiru) => [ + q(1691), + q(0), + ], + q(chitimacha) => [ + q(1890), + q(0), + ], + q(chitkuli kinnauri) => [ + q(1733), + q(0), + ], + q(chittagonian) => [ + q(1887), + q(0), + ], + q(chitwania tharu) => [ + q(6487), + q(0), + ], + q(choapan zapotec) => [ + q(7901), + q(0), + ], + q(chocangacakha) => [ + q(1715), + q(0), + ], + q(chochotec) => [ + q(1826), + q(0), + ], + q(choctaw) => [ + q(0083), + q(0), + ], + q(chodri) => [ + q(1694), + q(0), + ], + q(chokri naga) => [ + q(5050), + q(0), + ], + q(chokwe) => [ + q(1744), + q(0), + ], + q(chol) => [ + q(1896), + q(0), + ], + q(cholon) => [ + q(1723), + q(0), + ], + q(chong) => [ + q(1812), + q(0), + ], + q(choni) => [ + q(1689), + q(0), + ], + q(chonyi-dzihana-kauma) => [ + q(1813), + q(0), + ], + q(chopi) => [ + q(1680), + q(0), + ], + q(chorasmian) => [ + q(7302), + q(0), + ], + q(chorti) => [ + q(1638), + q(0), + ], + q(chothe naga) => [ + q(4773), + q(0), + ], + q(chrau) => [ + q(1857), + q(0), + ], + q(chru) => [ + q(1741), + q(0), + ], + q(chuang) => [ + q(0482), + q(1), + ], + q(chuanqiandian cluster miao) => [ + q(1838), + q(0), + ], + q(chuave) => [ + q(1750), + q(0), + ], + q(chug) => [ + q(1916), + q(0), + ], + q(chuj) => [ + q(1640), + q(0), + ], + q(chuka) => [ + q(1902), + q(0), + ], + q(chukot) => [ + q(1760), + q(0), + ], + q(chukwa) => [ + q(1914), + q(0), + ], + q(chulym) => [ + q(1779), + q(0), + ], + q(chumburung) => [ + q(4774), + q(0), + ], + q(chungmboko) => [ + q(1901), + q(0), + ], + q(churahi) => [ + q(1695), + q(0), + ], + q(church slavic) => [ + q(0086), + q(0), + ], + q(church slavonic) => [ + q(0086), + q(2), + ], + q(chut) => [ + q(5918), + q(0), + ], + q(chuukese) => [ + q(0080), + q(0), + ], + q(chuvantsy) => [ + q(7306), + q(0), + ], + q(chuvash) => [ + q(0087), + q(0), + ], + q(chuwabu) => [ + q(1724), + q(0), + ], + q(ci gbe) => [ + q(1728), + q(0), + ], + q(cia-cia) => [ + q(1727), + q(0), + ], + q(cibak) => [ + q(1754), + q(0), + ], + q(cicipu) => [ + q(0969), + q(0), + ], + q(cimbrian) => [ + q(1734), + q(0), + ], + q(cinda-regi-tiyal) => [ + q(1699), + q(0), + ], + q(cineni) => [ + q(1731), + q(0), + ], + q(cinta larga) => [ + q(1735), + q(0), + ], + q(cisalpine gaulish) => [ + q(7297), + q(0), + ], + q(cishingini) => [ + q(0892), + q(0), + ], + q(citak) => [ + q(6810), + q(0), + ], + q(ciwogai) => [ + q(6467), + q(0), + ], + q(clallam) => [ + q(1775), + q(0), + ], + q(classical armenian) => [ + q(7299), + q(0), + ], + q(classical mandaic) => [ + q(4686), + q(0), + ], + q(classical mongolian) => [ + q(1783), + q(0), + ], + q(classical nahuatl) => [ + q(4762), + q(0), + ], + q(classical nepal bhasa) => [ + q(0321), + q(2), + ], + q(classical newari) => [ + q(0321), + q(0), + ], + q(classical quechua) => [ + q(5707), + q(0), + ], + q(classical syriac) => [ + q(0415), + q(0), + ], + q(classical tibetan) => [ + q(7304), + q(0), + ], + q(coahuilteco) => [ + q(7307), + q(0), + ], + q(coast miwok) => [ + q(1868), + q(0), + ], + q(coastal konjo) => [ + q(3377), + q(0), + ], + q(coatecas altas zapotec) => [ + q(7818), + q(0), + ], + q(coatepec nahuatl) => [ + q(4731), + q(0), + ], + q(coatlan mixe) => [ + q(4159), + q(0), + ], + q(coatlan zapotec) => [ + q(7917), + q(0), + ], + q(coatzospan mixtec) => [ + q(4312), + q(0), + ], + q(cocama-cocamilla) => [ + q(1809), + q(0), + ], + q(cochimi) => [ + q(1814), + q(0), + ], + q(cocopa) => [ + q(1808), + q(0), + ], + q(cocos islands malay) => [ + q(1806), + q(0), + ], + q(coeur d'alene) => [ + q(1842), + q(0), + ], + q(cofan) => [ + q(1818), + q(0), + ], + q(cogui) => [ + q(3507), + q(0), + ], + q(col) => [ + q(3919), + q(0), + ], + q(colombian sign language) => [ + q(1873), + q(0), + ], + q(colonia tovar german) => [ + q(2449), + q(0), + ], + q(colorado) => [ + q(1811), + q(0), + ], + q(columbia-wenatchi) => [ + q(1816), + q(0), + ], + q(comaltepec chinantec) => [ + q(1686), + q(0), + ], + q(comanche) => [ + q(1817), + q(0), + ], + q(comecrudo) => [ + q(7300), + q(0), + ], + q(como karim) => [ + q(1710), + q(0), + ], + q(comox) => [ + q(1819), + q(0), + ], + q(con) => [ + q(1800), + q(0), + ], + q(congo swahili) => [ + q(6289), + q(0), + ], + q(cook islands maori) => [ + q(0357), + q(1), + ], + q(coong) => [ + q(1794), + q(0), + ], + q(coos) => [ + q(1882), + q(0), + ], + q(copainala zoque) => [ + q(7892), + q(0), + ], + q(copala triqui) => [ + q(6674), + q(0), + ], + q(coptic) => [ + q(0091), + q(0), + ], + q(coquille) => [ + q(1820), + q(0), + ], + q(cori) => [ + q(1859), + q(0), + ], + q(cornish) => [ + q(0092), + q(0), + ], + q(corongo ancash quechua) => [ + q(5706), + q(0), + ], + q(corsican) => [ + q(0093), + q(0), + ], + q(costa rican sign language) => [ + q(1876), + q(0), + ], + q(cotabato manobo) => [ + q(4548), + q(0), + ], + q(cotoname) => [ + q(7301), + q(0), + ], + q(cowlitz) => [ + q(1824), + q(0), + ], + q(coyotepec popoloca) => [ + q(5363), + q(0), + ], + q(coyutla totonac) => [ + q(6621), + q(0), + ], + q(cree) => [ + q(0097), + q(0), + ], + q(creek) => [ + q(0294), + q(0), + ], + q(creoles and pidgins) => [ + q(0099), + q(1), + ], + q(creoles and pidgins ) => [ + q(0099), + q(0), + ], + q(creoles and pidgins, english based) => [ + q(0094), + q(0), + ], + q(creoles and pidgins, english-based) => [ + q(0094), + q(1), + ], + q(creoles and pidgins, french-based) => [ + q(0095), + q(1), + ], + q(creoles and pidgins, french-based ) => [ + q(0095), + q(0), + ], + q(creoles and pidgins, portuguese-based) => [ + q(0096), + q(1), + ], + q(creoles and pidgins, portuguese-based ) => [ + q(0096), + q(0), + ], + q(crimean tatar) => [ + q(0098), + q(0), + ], + q(crimean turkish) => [ + q(0098), + q(1), + ], + q(croatia sign language) => [ + q(1875), + q(0), + ], + q(croatian) => [ + q(0182), + q(0), + ], + q(cross river mbembe) => [ + q(4230), + q(0), + ], + q(crow) => [ + q(1851), + q(0), + ], + q(cruzeno) => [ + q(1860), + q(0), + ], + q(cua) => [ + q(1898), + q(0), + ], + q(cuba) => [ + q(1669), + q(1), + ], + q(cuba sign language) => [ + q(1865), + q(0), + ], + q(cubeo) => [ + q(1899), + q(0), + ], + q(cuiba) => [ + q(1903), + q(0), + ], + q(culina) => [ + q(1906), + q(0), + ], + q(cumanagoto) => [ + q(1907), + q(0), + ], + q(cumbric) => [ + q(7294), + q(0), + ], + q(cun) => [ + q(1909), + q(0), + ], + q(cuneiform luwian) => [ + q(7390), + q(0), + ], + q(cung) => [ + q(1901), + q(1), + ], + q(cupeno) => [ + q(1908), + q(0), + ], + q(curonian) => [ + q(7305), + q(0), + ], + q(curripaco) => [ + q(3522), + q(0), + ], + q(cusco quechua) => [ + q(5690), + q(0), + ], + q(cushitic languages) => [ + q(0101), + q(0), + ], + q(cutchi-swahili) => [ + q(1684), + q(0), + ], + q(cuvok) => [ + q(1913), + q(0), + ], + q(cuyamecalco mixtec) => [ + q(7510), + q(0), + ], + q(cuyonon) => [ + q(1926), + q(0), + ], + q(cwi bwamu) => [ + q(1564), + q(0), + ], + q(cypriot arabic) => [ + q(0603), + q(0), + ], + q(czech) => [ + q(0102), + q(0), + ], + q(czech sign language) => [ + q(1864), + q(0), + ], + q(da'a kaili) => [ + q(3766), + q(0), + ], + q(da-hua miao) => [ + q(2777), + q(2), + ], + q(daai chin) => [ + q(1942), + q(0), + ], + q(daakaka) => [ + q(1375), + q(0), + ], + q(daantanai') => [ + q(3995), + q(0), + ], + q(daasanach) => [ + q(2144), + q(0), + ], + q(daats'iin) => [ + q(2157), + q(0), + ], + q(daba) => [ + q(1963), + q(0), + ], + q(dabarre) => [ + q(1964), + q(0), + ], + q(dabe) => [ + q(1953), + q(0), + ], + q(dacian) => [ + q(7310), + q(0), + ], + q(dadi dadi) => [ + q(1972), + q(0), + ], + q(dadibi) => [ + q(4466), + q(0), + ], + q(dadiya) => [ + q(1952), + q(0), + ], + q(daga) => [ + q(2015), + q(0), + ], + q(dagaari dioula) => [ + q(2001), + q(0), + ], + q(dagba) => [ + q(2006), + q(0), + ], + q(dagbani) => [ + q(1936), + q(0), + ], + q(dagik) => [ + q(1983), + q(0), + ], + q(dagoman) => [ + q(2008), + q(0), + ], + q(dahalik) => [ + q(2073), + q(0), + ], + q(dahalo) => [ + q(1940), + q(0), + ], + q(daho-doo) => [ + q(1944), + q(0), + ], + q(dai) => [ + q(2037), + q(0), + ], + q(dai zhuang) => [ + q(7830), + q(0), + ], + q(dair) => [ + q(2128), + q(0), + ], + q(dakka) => [ + q(2068), + q(0), + ], + q(dakota) => [ + q(0103), + q(0), + ], + q(dakpakha) => [ + q(2067), + q(0), + ], + q(dalabon) => [ + q(4837), + q(0), + ], + q(dalmatian) => [ + q(2074), + q(0), + ], + q(daloa bete) => [ + q(1132), + q(0), + ], + q(dama) => [ + q(2084), + q(0), + ], + q(damakawa) => [ + q(1941), + q(0), + ], + q(damal) => [ + q(6860), + q(0), + ], + q(dambi) => [ + q(1933), + q(0), + ], + q(dameli) => [ + q(2083), + q(0), + ], + q(dampelas) => [ + q(2087), + q(0), + ], + q(dan) => [ + q(2098), + q(0), + ], + q(danaru) => [ + q(2101), + q(0), + ], + q(danau) => [ + q(2103), + q(0), + ], + q(dandami maria) => [ + q(1943), + q(0), + ], + q(dangaleat) => [ + q(1932), + q(0), + ], + q(dangaura tharu) => [ + q(6492), + q(0), + ], + q(danish) => [ + q(0104), + q(0), + ], + q(danish sign language) => [ + q(2146), + q(0), + ], + q(dano) => [ + q(0899), + q(0), + ], + q(danu) => [ + q(2104), + q(0), + ], + q(dao) => [ + q(1949), + q(0), + ], + q(daonda) => [ + q(2094), + q(0), + ], + q(dar daju daju) => [ + q(2054), + q(0), + ], + q(dar fur daju) => [ + q(1939), + q(0), + ], + q(dar sila daju) => [ + q(1945), + q(0), + ], + q(darai) => [ + q(2142), + q(0), + ], + q(darang deng) => [ + q(4286), + q(1), + ], + q(dargwa) => [ + q(0105), + q(0), + ], + q(dari) => [ + q(5595), + q(0), + ], + q(darkinyung) => [ + q(7309), + q(0), + ], + q(darlong) => [ + q(2075), + q(0), + ], + q(darmiya) => [ + q(2130), + q(0), + ], + q(daro-matu melanau) => [ + q(2136), + q(0), + ], + q(dass) => [ + q(2121), + q(0), + ], + q(datooga) => [ + q(6396), + q(0), + ], + q(daungwurrung) => [ + q(2013), + q(0), + ], + q(daur) => [ + q(2150), + q(0), + ], + q(davawenyo) => [ + q(1947), + q(0), + ], + q(daw) => [ + q(3686), + q(0), + ], + q(dawawa) => [ + q(2192), + q(0), + ], + q(dawera-daweloor) => [ + q(1982), + q(0), + ], + q(dawida) => [ + q(1946), + q(1), + ], + q(dawro) => [ + q(2189), + q(0), + ], + q(day) => [ + q(1938), + q(0), + ], + q(dayi) => [ + q(1948), + q(0), + ], + q(dazaga) => [ + q(2205), + q(0), + ], + q(deccan) => [ + q(1970), + q(0), + ], + q(dedua) => [ + q(1984), + q(0), + ], + q(defaka) => [ + q(0646), + q(0), + ], + q(defi gbe) => [ + q(2424), + q(0), + ], + q(deg) => [ + q(4708), + q(0), + ], + q(degaru) => [ + q(2012), + q(0), + ], + q(degema) => [ + q(1987), + q(0), + ], + q(degenan) => [ + q(2002), + q(0), + ], + q(degexit'an) => [ + q(2968), + q(0), + ], + q(dehu) => [ + q(2026), + q(0), + ], + q(dehwari) => [ + q(1988), + q(0), + ], + q(dek) => [ + q(1990), + q(0), + ], + q(dela-oenale) => [ + q(5837), + q(0), + ], + q(delaware) => [ + q(0107), + q(0), + ], + q(delo) => [ + q(5093), + q(0), + ], + q(dem) => [ + q(1991), + q(0), + ], + q(dema) => [ + q(2091), + q(0), + ], + q(demisa) => [ + q(1989), + q(0), + ], + q(demta) => [ + q(2092), + q(0), + ], + q(dendi (benin)) => [ + q(1978), + q(0), + ], + q(dendi (central african republic)) => [ + q(1993), + q(0), + ], + q(dene suline) => [ + q(0084), + q(1), + ], + q(dengese) => [ + q(1997), + q(0), + ], + q(dengka) => [ + q(2099), + q(0), + ], + q(deni) => [ + q(2106), + q(0), + ], + q(deno) => [ + q(1951), + q(0), + ], + q(denya) => [ + q(0810), + q(0), + ], + q(deori) => [ + q(1994), + q(0), + ], + q(dera (indonesia)) => [ + q(3203), + q(0), + ], + q(dera (nigeria)) => [ + q(3477), + q(0), + ], + q(desano) => [ + q(1995), + q(0), + ], + q(desiya) => [ + q(2148), + q(0), + ], + q(dewoin) => [ + q(1985), + q(0), + ], + q(dezfuli) => [ + q(1986), + q(0), + ], + q(dghwede) => [ + q(2004), + q(0), + ], + q(dhaiso) => [ + q(2024), + q(0), + ], + q(dhalandji) => [ + q(2019), + q(0), + ], + q(dhangu) => [ + q(2017), + q(1), + ], + q(dhangu-djangu) => [ + q(2017), + q(0), + ], + q(dhanki) => [ + q(2021), + q(0), + ], + q(dhanwar (nepal)) => [ + q(2027), + q(0), + ], + q(dhao) => [ + q(4823), + q(0), + ], + q(dhargari) => [ + q(2023), + q(0), + ], + q(dharuk) => [ + q(7311), + q(0), + ], + q(dharumbal) => [ + q(7333), + q(0), + ], + q(dhatki) => [ + q(4343), + q(0), + ], + q(dhimal) => [ + q(2018), + q(0), + ], + q(dhivehi) => [ + q(0111), + q(1), + ], + q(dhodia) => [ + q(2022), + q(0), + ], + q(dhofari arabic) => [ + q(0608), + q(0), + ], + q(dholuo) => [ + q(0261), + q(1), + ], + q(dhudhuroa) => [ + q(1980), + q(0), + ], + q(dhundari) => [ + q(2016), + q(0), + ], + q(dhungaloo) => [ + q(2028), + q(0), + ], + q(dhurga) => [ + q(2025), + q(0), + ], + q(dhuwal) => [ + q(2191), + q(0), + ], + q(dhuwaya) => [ + q(2193), + q(0), + ], + q(dia) => [ + q(2029), + q(0), + ], + q(dibabawon manobo) => [ + q(4123), + q(0), + ], + q(dibiyaso) => [ + q(1969), + q(0), + ], + q(dibo) => [ + q(2041), + q(0), + ], + q(dibole) => [ + q(1538), + q(0), + ], + q(dicamay agta) => [ + q(2185), + q(0), + ], + q(didinga) => [ + q(2032), + q(0), + ], + q(dido) => [ + q(1979), + q(0), + ], + q(diebroud) => [ + q(6384), + q(1), + ], + q(dieri) => [ + q(2033), + q(0), + ], + q(digaro-mishmi) => [ + q(4286), + q(0), + ], + q(digo) => [ + q(2034), + q(0), + ], + q(dii) => [ + q(2179), + q(0), + ], + q(dijim-bwilim) => [ + q(1708), + q(0), + ], + q(dilling) => [ + q(2039), + q(0), + ], + q(dima) => [ + q(3115), + q(0), + ], + q(dimasa) => [ + q(2045), + q(0), + ], + q(dimbong) => [ + q(2036), + q(0), + ], + q(dime) => [ + q(2040), + q(0), + ], + q(dimili) => [ + q(0487), + q(1), + ], + q(dimli) => [ + q(0487), + q(2), + ], + q(dimli (individual language)) => [ + q(2043), + q(0), + ], + q(dimli (macrolanguage)) => [ + q(0487), + q(6), + ], + q(dineor) => [ + q(4521), + q(1), + ], + q(ding) => [ + q(2051), + q(0), + ], + q(dinka) => [ + q(0110), + q(0), + ], + q(dirari) => [ + q(2046), + q(0), + ], + q(dirasha) => [ + q(2461), + q(0), + ], + q(diri) => [ + q(2188), + q(0), + ], + q(diriku) => [ + q(2047), + q(0), + ], + q(dirim) => [ + q(2044), + q(0), + ], + q(disa) => [ + q(2145), + q(0), + ], + q(ditammari) => [ + q(6393), + q(0), + ], + q(ditidaht) => [ + q(2152), + q(0), + ], + q(diuwe) => [ + q(2050), + q(0), + ], + q(diuxi-tilantongo mixtec) => [ + q(7495), + q(0), + ], + q(divehi) => [ + q(0111), + q(0), + ], + q(dixon reef) => [ + q(2049), + q(0), + ], + q(dizin) => [ + q(4191), + q(0), + ], + q(djabwurrung) => [ + q(6534), + q(0), + ], + q(djadjawurrung) => [ + q(2052), + q(0), + ], + q(djambarrpuyngu) => [ + q(2064), + q(0), + ], + q(djamindjung) => [ + q(2055), + q(0), + ], + q(djangu) => [ + q(2017), + q(2), + ], + q(djangun) => [ + q(2057), + q(0), + ], + q(djauan) => [ + q(2062), + q(0), + ], + q(djawi) => [ + q(2066), + q(0), + ], + q(djeebbana) => [ + q(2059), + q(0), + ], + q(djimini senoufo) => [ + q(2198), + q(0), + ], + q(djinang) => [ + q(2058), + q(0), + ], + q(djinba) => [ + q(2053), + q(0), + ], + q(djingili) => [ + q(3094), + q(0), + ], + q(djiwarli) => [ + q(2204), + q(0), + ], + q(dobel) => [ + q(3675), + q(0), + ], + q(dobu) => [ + q(2108), + q(0), + ], + q(doe) => [ + q(2110), + q(0), + ], + q(doga) => [ + q(2003), + q(0), + ], + q(doghoro) => [ + q(2014), + q(0), + ], + q(dogose) => [ + q(2120), + q(0), + ], + q(dogoso) => [ + q(2010), + q(0), + ], + q(dogri) => [ + q(0112), + q(0), + ], + q(dogri (individual language)) => [ + q(2009), + q(0), + ], + q(dogri (macrolanguage)) => [ + q(0112), + q(1), + ], + q(dogrib) => [ + q(0109), + q(0), + ], + q(dogul dom dogon) => [ + q(1955), + q(0), + ], + q(doka) => [ + q(1956), + q(0), + ], + q(doko-uyanga) => [ + q(6952), + q(0), + ], + q(dolgan) => [ + q(2072), + q(0), + ], + q(dolpo) => [ + q(2131), + q(0), + ], + q(dom) => [ + q(2107), + q(0), + ], + q(domaaki) => [ + q(2082), + q(0), + ], + q(domari) => [ + q(5812), + q(0), + ], + q(dombe) => [ + q(2122), + q(0), + ], + q(dominican sign language) => [ + q(2118), + q(0), + ], + q(dompo) => [ + q(2125), + q(0), + ], + q(domu) => [ + q(2111), + q(0), + ], + q(domung) => [ + q(1996), + q(0), + ], + q(dondo) => [ + q(2113), + q(0), + ], + q(dong) => [ + q(2112), + q(0), + ], + q(dongo) => [ + q(2116), + q(0), + ], + q(dongolawi) => [ + q(2007), + q(1), + ], + q(dongotono) => [ + q(1973), + q(0), + ], + q(dongshanba lalo) => [ + q(7636), + q(0), + ], + q(dongxiang) => [ + q(5919), + q(0), + ], + q(donno so dogon) => [ + q(1981), + q(0), + ], + q(doondo) => [ + q(1974), + q(0), + ], + q(dori'o) => [ + q(2119), + q(0), + ], + q(dorig) => [ + q(7248), + q(1), + ], + q(doromu-koki) => [ + q(3546), + q(0), + ], + q(dororo) => [ + q(2138), + q(0), + ], + q(dorze) => [ + q(2126), + q(0), + ], + q(doso) => [ + q(2114), + q(0), + ], + q(dotyali) => [ + q(2164), + q(0), + ], + q(doutai) => [ + q(6434), + q(0), + ], + q(doyayo) => [ + q(2123), + q(0), + ], + q(dravidian languages) => [ + q(0113), + q(0), + ], + q(drehu) => [ + q(2026), + q(1), + ], + q(drents) => [ + q(2140), + q(0), + ], + q(drubea) => [ + q(2169), + q(1), + ], + q(drung) => [ + q(2181), + q(0), + ], + q(duala) => [ + q(0115), + q(0), + ], + q(duano) => [ + q(2177), + q(0), + ], + q(duau) => [ + q(2187), + q(0), + ], + q(dubli) => [ + q(2165), + q(0), + ], + q(dubu) => [ + q(2088), + q(0), + ], + q(dugun) => [ + q(4794), + q(0), + ], + q(duguri) => [ + q(1959), + q(0), + ], + q(dugwor) => [ + q(2080), + q(0), + ], + q(duhwa) => [ + q(3207), + q(0), + ], + q(duke) => [ + q(4919), + q(0), + ], + q(dulbu) => [ + q(1961), + q(0), + ], + q(duli-gey) => [ + q(2186), + q(0), + ], + q(duma) => [ + q(2076), + q(0), + ], + q(dumbea) => [ + q(2169), + q(0), + ], + q(dumi) => [ + q(2180), + q(0), + ], + q(dumpas) => [ + q(2089), + q(0), + ], + q(dumun) => [ + q(2172), + q(0), + ], + q(duna) => [ + q(2166), + q(0), + ], + q(dungan) => [ + q(2096), + q(0), + ], + q(dungmali) => [ + q(5727), + q(0), + ], + q(dungra bhil) => [ + q(2171), + q(0), + ], + q(dungu) => [ + q(1967), + q(0), + ], + q(dupaninan agta) => [ + q(2176), + q(0), + ], + q(dura) => [ + q(2137), + q(0), + ], + q(duri) => [ + q(4607), + q(0), + ], + q(duriankere) => [ + q(1960), + q(0), + ], + q(duruma) => [ + q(2170), + q(0), + ], + q(duruwa) => [ + q(5385), + q(0), + ], + q(dusner) => [ + q(2147), + q(0), + ], + q(dusun deyah) => [ + q(2175), + q(0), + ], + q(dusun malang) => [ + q(2178), + q(0), + ], + q(dusun witu) => [ + q(2183), + q(0), + ], + q(dutch) => [ + q(0117), + q(0), + ], + q(dutch sign language) => [ + q(2143), + q(0), + ], + q(dutch, middle (ca.1050-1350)) => [ + q(0116), + q(0), + ], + q(dutton world speedwords) => [ + q(2190), + q(0), + ], + q(duungooma) => [ + q(2184), + q(0), + ], + q(duupa) => [ + q(1935), + q(0), + ], + q(duvle) => [ + q(2182), + q(0), + ], + q(duwai) => [ + q(1962), + q(0), + ], + q(duwet) => [ + q(2665), + q(0), + ], + q(duya) => [ + q(3838), + q(0), + ], + q(dwang) => [ + q(5000), + q(0), + ], + q(dyaabugay) => [ + q(2202), + q(0), + ], + q(dyaberdyaber) => [ + q(2195), + q(0), + ], + q(dyan) => [ + q(2194), + q(0), + ], + q(dyangadi) => [ + q(2200), + q(0), + ], + q(dyirbal) => [ + q(1958), + q(0), + ], + q(dyugun) => [ + q(2196), + q(0), + ], + q(dyula) => [ + q(0118), + q(0), + ], + q(dza) => [ + q(3079), + q(0), + ], + q(dzalakha) => [ + q(2206), + q(0), + ], + q(dzando) => [ + q(2207), + q(0), + ], + q(dzao min) => [ + q(1385), + q(0), + ], + q(dzodinka) => [ + q(0606), + q(0), + ], + q(dzongkha) => [ + q(0119), + q(0), + ], + q(dzuungoo) => [ + q(2100), + q(0), + ], + q(e) => [ + q(2217), + q(0), + ], + q(e'ma buyang) => [ + q(7788), + q(0), + ], + q(e'napa woromaipu) => [ + q(5365), + q(0), + ], + q(early tripuri) => [ + q(7507), + q(0), + ], + q(east ambae) => [ + q(5248), + q(0), + ], + q(east berawan) => [ + q(7815), + q(0), + ], + q(east damar) => [ + q(2086), + q(0), + ], + q(east futuna) => [ + q(2380), + q(0), + ], + q(east germanic languages) => [ + q(0506), + q(0), + ], + q(east kewa) => [ + q(3393), + q(0), + ], + q(east limba) => [ + q(3967), + q(0), + ], + q(east makian) => [ + q(4359), + q(0), + ], + q(east masela) => [ + q(7007), + q(0), + ], + q(east nyala) => [ + q(4941), + q(0), + ], + q(east slavic languages) => [ + q(0535), + q(0), + ], + q(east tarangan) => [ + q(6676), + q(0), + ], + q(east yugur) => [ + q(7766), + q(0), + ], + q(eastern abnaki) => [ + q(0553), + q(0), + ], + q(eastern acipa) => [ + q(0594), + q(0), + ], + q(eastern apurimac quechua) => [ + q(5693), + q(0), + ], + q(eastern arrernte) => [ + q(0634), + q(0), + ], + q(eastern balochi) => [ + q(1175), + q(0), + ], + q(eastern bolivian guarani) => [ + q(2648), + q(0), + ], + q(eastern bontok) => [ + q(2210), + q(0), + ], + q(eastern bru) => [ + q(1441), + q(0), + ], + q(eastern canadian inuktitut) => [ + q(2936), + q(0), + ], + q(eastern cham) => [ + q(1745), + q(0), + ], + q(eastern durango nahuatl) => [ + q(1015), + q(0), + ], + q(eastern egyptian bedawi arabic) => [ + q(0960), + q(0), + ], + q(eastern frisian) => [ + q(0142), + q(0), + ], + q(eastern gorkha tamang) => [ + q(6468), + q(0), + ], + q(eastern highland chatino) => [ + q(1780), + q(0), + ], + q(eastern highland otomi) => [ + q(5318), + q(0), + ], + q(eastern hongshuihe zhuang) => [ + q(7823), + q(0), + ], + q(eastern huasteca nahuatl) => [ + q(4857), + q(0), + ], + q(eastern huishui hmong) => [ + q(2778), + q(0), + ], + q(eastern huishui miao) => [ + q(2778), + q(1), + ], + q(eastern karaboro) => [ + q(7462), + q(0), + ], + q(eastern karnic) => [ + q(2228), + q(0), + ], + q(eastern katu) => [ + q(3635), + q(0), + ], + q(eastern kayah) => [ + q(2238), + q(0), + ], + q(eastern keres) => [ + q(3260), + q(0), + ], + q(eastern khumi chin) => [ + q(1705), + q(0), + ], + q(eastern krahn) => [ + q(3558), + q(0), + ], + q(eastern lalu) => [ + q(7644), + q(0), + ], + q(eastern lawa) => [ + q(4094), + q(0), + ], + q(eastern magar) => [ + q(4257), + q(0), + ], + q(eastern malayo-polynesian languages) => [ + q(0522), + q(0), + ], + q(eastern maninkakan) => [ + q(2251), + q(0), + ], + q(eastern mari) => [ + q(4283), + q(0), + ], + q(eastern maroon creole) => [ + q(2060), + q(0), + ], + q(eastern meohang) => [ + q(2249), + q(0), + ], + q(eastern mnong) => [ + q(4413), + q(0), + ], + q(eastern muria) => [ + q(2256), + q(0), + ], + q(eastern ngad'a) => [ + q(4800), + q(0), + ], + q(eastern nisu) => [ + q(5018), + q(0), + ], + q(eastern ojibwa) => [ + q(5215), + q(0), + ], + q(eastern oromo) => [ + q(2711), + q(0), + ], + q(eastern parbate kham) => [ + q(3357), + q(0), + ], + q(eastern penan) => [ + q(5418), + q(0), + ], + q(eastern pomo) => [ + q(5401), + q(0), + ], + q(eastern qiandong miao) => [ + q(2788), + q(0), + ], + q(eastern subanen) => [ + q(5978), + q(0), + ], + q(eastern sudanic languages) => [ + q(0525), + q(0), + ], + q(eastern tamang) => [ + q(6354), + q(0), + ], + q(eastern tawbuid) => [ + q(1336), + q(0), + ], + q(eastern xiangxi miao) => [ + q(4586), + q(0), + ], + q(eastern xwla gbe) => [ + q(2439), + q(0), + ], + q(eastern yiddish) => [ + q(7602), + q(0), + ], + q(ebira) => [ + q(2917), + q(0), + ], + q(eblan) => [ + q(7315), + q(0), + ], + q(ebrie) => [ + q(2212), + q(0), + ], + q(ebughu) => [ + q(2209), + q(0), + ], + q(ecuadorian sign language) => [ + q(2215), + q(0), + ], + q(ede cabe) => [ + q(1664), + q(0), + ], + q(ede ica) => [ + q(2895), + q(0), + ], + q(ede idaca) => [ + q(2902), + q(0), + ], + q(ede ije) => [ + q(2933), + q(0), + ], + q(edera awyu) => [ + q(0985), + q(0), + ], + q(edo) => [ + q(0055), + q(1), + ], + q(edolo) => [ + q(2305), + q(0), + ], + q(edomite) => [ + q(7312), + q(0), + ], + q(edopi) => [ + q(1954), + q(0), + ], + q(edwas) => [ + q(1347), + q(2), + ], + q(efai) => [ + q(2218), + q(0), + ], + q(efe) => [ + q(2219), + q(0), + ], + q(efik) => [ + q(0120), + q(0), + ], + q(efutop) => [ + q(5202), + q(0), + ], + q(ega) => [ + q(2220), + q(0), + ], + q(eggon) => [ + q(2222), + q(0), + ], + q(egypt sign language) => [ + q(2292), + q(0), + ], + q(egyptian (ancient)) => [ + q(0121), + q(0), + ], + q(egyptian arabic) => [ + q(0885), + q(0), + ], + q(egyptian languages) => [ + q(0502), + q(0), + ], + q(ehueun) => [ + q(2223), + q(0), + ], + q(eipomek) => [ + q(2224), + q(0), + ], + q(eitiep) => [ + q(2225), + q(0), + ], + q(ejagham) => [ + q(2308), + q(0), + ], + q(ejamat) => [ + q(2227), + q(0), + ], + q(ekajuk) => [ + q(0122), + q(0), + ], + q(ekari) => [ + q(2230), + q(0), + ], + q(ekegusii) => [ + q(2662), + q(1), + ], + q(eki) => [ + q(2231), + q(0), + ], + q(ekit) => [ + q(2229), + q(0), + ], + q(ekpeye) => [ + q(2236), + q(0), + ], + q(el alto zapotec) => [ + q(7914), + q(0), + ], + q(el hugeirat) => [ + q(2240), + q(0), + ], + q(el molo) => [ + q(2244), + q(0), + ], + q(el nayar cora) => [ + q(1850), + q(0), + ], + q(elamite) => [ + q(0123), + q(0), + ], + q(eleme) => [ + q(2243), + q(0), + ], + q(elepi) => [ + q(2239), + q(0), + ], + q(elfdalian) => [ + q(5334), + q(0), + ], + q(elip) => [ + q(2234), + q(0), + ], + q(elkei) => [ + q(2242), + q(0), + ], + q(elotepec zapotec) => [ + q(7938), + q(0), + ], + q(eloyi) => [ + q(0647), + q(0), + ], + q(elseng) => [ + q(4504), + q(0), + ], + q(elu) => [ + q(2245), + q(0), + ], + q(elymian) => [ + q(7391), + q(0), + ], + q(emae) => [ + q(4404), + q(0), + ], + q(emai-iuleha-ora) => [ + q(2246), + q(0), + ], + q(eman) => [ + q(2253), + q(0), + ], + q(embaloh) => [ + q(2247), + q(0), + ], + q(embera-baudo) => [ + q(1092), + q(0), + ], + q(embera-catio) => [ + q(1892), + q(0), + ], + q(embera-chami) => [ + q(1784), + q(0), + ], + q(embera-tado) => [ + q(6419), + q(0), + ], + q(embu) => [ + q(2213), + q(0), + ], + q(emem) => [ + q(2270), + q(1), + ], + q(emerillon) => [ + q(2248), + q(0), + ], + q(emilian) => [ + q(2221), + q(0), + ], + q(emplawas) => [ + q(2257), + q(0), + ], + q(emumu) => [ + q(2270), + q(0), + ], + q(en) => [ + q(2262), + q(0), + ], + q(enawene-nawe) => [ + q(6902), + q(0), + ], + q(ende) => [ + q(2263), + q(0), + ], + q(enga) => [ + q(2269), + q(0), + ], + q(engdewu) => [ + q(4844), + q(0), + ], + q(engenni) => [ + q(2267), + q(0), + ], + q(enggano) => [ + q(2268), + q(0), + ], + q(english) => [ + q(0124), + q(0), + ], + q(english, middle (1100-1500)) => [ + q(0125), + q(0), + ], + q(english, old (ca.450-1100)) => [ + q(0018), + q(0), + ], + q(english-based creoles and pidgins) => [ + q(0094), + q(2), + ], + q(enlhet) => [ + q(2266), + q(0), + ], + q(enrekang) => [ + q(5628), + q(0), + ], + q(enu) => [ + q(2271), + q(0), + ], + q(enwan (akwa ibom state)) => [ + q(2273), + q(0), + ], + q(enwan (edu state)) => [ + q(2272), + q(0), + ], + q(enxet) => [ + q(2274), + q(0), + ], + q(enya) => [ + q(2486), + q(0), + ], + q(epena) => [ + q(6046), + q(0), + ], + q(epi-olmec) => [ + q(7320), + q(0), + ], + q(epie) => [ + q(2276), + q(0), + ], + q(epigraphic mayan) => [ + q(2259), + q(0), + ], + q(eravallan) => [ + q(2277), + q(0), + ], + q(erave) => [ + q(3398), + q(0), + ], + q(ere) => [ + q(6788), + q(0), + ], + q(eritai) => [ + q(2285), + q(0), + ], + q(erokwanas) => [ + q(2286), + q(0), + ], + q(erre) => [ + q(2283), + q(0), + ], + q(erromintxela) => [ + q(2258), + q(0), + ], + q(ersu) => [ + q(2284), + q(0), + ], + q(eruwa) => [ + q(2279), + q(0), + ], + q(erzya) => [ + q(0298), + q(0), + ], + q(esan) => [ + q(2999), + q(0), + ], + q(ese) => [ + q(4161), + q(0), + ], + q(ese ejja) => [ + q(2287), + q(0), + ], + q(eshtehardi) => [ + q(2289), + q(0), + ], + q(esimbi) => [ + q(0670), + q(0), + ], + q(eskayan) => [ + q(2299), + q(0), + ], + q(eskimo-aleut languages) => [ + q(0503), + q(0), + ], + q(esperanto) => [ + q(0126), + q(0), + ], + q(esselen) => [ + q(2296), + q(0), + ], + q(estado de mexico otomi) => [ + q(5322), + q(0), + ], + q(estonian) => [ + q(0127), + q(0), + ], + q(estonian sign language) => [ + q(2295), + q(0), + ], + q(esuma) => [ + q(2293), + q(0), + ], + q(etchemin) => [ + q(2301), + q(0), + ], + q(etebi) => [ + q(2300), + q(0), + ], + q(eten) => [ + q(2309), + q(0), + ], + q(eteocretan) => [ + q(2214), + q(0), + ], + q(eteocypriot) => [ + q(2216), + q(0), + ], + q(ethiopian sign language) => [ + q(2302), + q(0), + ], + q(etkywan) => [ + q(2896), + q(0), + ], + q(eton (cameroon)) => [ + q(2304), + q(0), + ], + q(eton (vanuatu)) => [ + q(2303), + q(0), + ], + q(etruscan) => [ + q(2307), + q(0), + ], + q(etulo) => [ + q(6942), + q(0), + ], + q(evant) => [ + q(1637), + q(0), + ], + q(even) => [ + q(2311), + q(0), + ], + q(evenki) => [ + q(2313), + q(0), + ], + q(eviya) => [ + q(2483), + q(0), + ], + q(ewage-notu) => [ + q(5020), + q(0), + ], + q(ewe) => [ + q(0128), + q(0), + ], + q(ewondo) => [ + q(0129), + q(0), + ], + q(extremaduran) => [ + q(2314), + q(0), + ], + q(eyak) => [ + q(2315), + q(0), + ], + q(ezaa) => [ + q(2317), + q(0), + ], + q(fa d'ambu) => [ + q(2320), + q(0), + ], + q(fagani) => [ + q(2322), + q(0), + ], + q(fagauvea) => [ + q(6948), + q(1), + ], + q(faire atta) => [ + q(1021), + q(0), + ], + q(faita) => [ + q(2326), + q(0), + ], + q(faiwol) => [ + q(2325), + q(0), + ], + q(fala) => [ + q(2333), + q(0), + ], + q(falam chin) => [ + q(1711), + q(0), + ], + q(fali) => [ + q(2352), + q(0), + ], + q(faliscan) => [ + q(7325), + q(0), + ], + q(fam) => [ + q(2329), + q(0), + ], + q(fanagalo) => [ + q(2360), + q(0), + ], + q(fanamaket) => [ + q(1245), + q(0), + ], + q(fanbak) => [ + q(2359), + q(0), + ], + q(fang) => [ + q(0130), + q(0), + ], + q(fang (cameroon)) => [ + q(2327), + q(0), + ], + q(fang (equatorial guinea)) => [ + q(0130), + q(1), + ], + q(fania) => [ + q(2361), + q(0), + ], + q(fanti) => [ + q(0132), + q(0), + ], + q(far western muria) => [ + q(2358), + q(0), + ], + q(farefare) => [ + q(2656), + q(0), + ], + q(faroese) => [ + q(0131), + q(0), + ], + q(fas) => [ + q(2368), + q(0), + ], + q(fasu) => [ + q(2319), + q(0), + ], + q(fataleka) => [ + q(2331), + q(0), + ], + q(fataluku) => [ + q(1975), + q(0), + ], + q(fayu) => [ + q(2332), + q(0), + ], + q(fe'fe') => [ + q(2357), + q(0), + ], + q(fedan) => [ + q(5396), + q(1), + ], + q(fembe) => [ + q(0664), + q(0), + ], + q(fernando po creole english) => [ + q(2367), + q(0), + ], + q(feroge) => [ + q(2338), + q(0), + ], + q(fiji hindi) => [ + q(2753), + q(0), + ], + q(fijian) => [ + q(0133), + q(0), + ], + q(filipino) => [ + q(0134), + q(0), + ], + q(filomena mata-coahuitlan totonac) => [ + q(6565), + q(0), + ], + q(finland-swedish sign language) => [ + q(2377), + q(0), + ], + q(finlandssvenskt teckensprak) => [ + q(2377), + q(1), + ], + q(finnish) => [ + q(0135), + q(0), + ], + q(finnish sign language) => [ + q(2375), + q(0), + ], + q(finno-ugrian languages) => [ + q(0136), + q(0), + ], + q(finongan) => [ + q(2323), + q(0), + ], + q(fipa) => [ + q(2344), + q(0), + ], + q(firan) => [ + q(2345), + q(0), + ], + q(fiwaga) => [ + q(2347), + q(0), + ], + q(flaaitaal) => [ + q(2356), + q(0), + ], + q(flemish) => [ + q(0117), + q(1), + ], + q(flemish sign language) => [ + q(6981), + q(1), + ], + q(flinders island) => [ + q(2354), + q(0), + ], + q(foau) => [ + q(2351), + q(0), + ], + q(foi) => [ + q(2363), + q(0), + ], + q(foia foia) => [ + q(2339), + q(0), + ], + q(folopa) => [ + q(5573), + q(0), + ], + q(foma) => [ + q(2364), + q(0), + ], + q(fon) => [ + q(0137), + q(0), + ], + q(fongoro) => [ + q(2341), + q(0), + ], + q(foodo) => [ + q(2362), + q(0), + ], + q(forak) => [ + q(2373), + q(0), + ], + q(fordata) => [ + q(2370), + q(0), + ], + q(fore) => [ + q(2365), + q(0), + ], + q(forest enets) => [ + q(2264), + q(0), + ], + q(formosan languages) => [ + q(0505), + q(0), + ], + q(fortsenal) => [ + q(2374), + q(0), + ], + q(francisco leon zoque) => [ + q(7898), + q(0), + ], + q(francoprovencal) => [ + q(2372), + q(1), + ], + q(frankish) => [ + q(2371), + q(0), + ], + q(french) => [ + q(0138), + q(0), + ], + q(french belgian sign language) => [ + q(5977), + q(1), + ], + q(french sign language) => [ + q(2376), + q(0), + ], + q(french, middle (ca.1400-1600)) => [ + q(0139), + q(0), + ], + q(french, old (842-ca.1400)) => [ + q(0140), + q(0), + ], + q(french-based creoles and pidgins) => [ + q(0095), + q(2), + ], + q(friulian) => [ + q(0145), + q(0), + ], + q(fulah) => [ + q(0144), + q(0), + ], + q(fuliiru) => [ + q(2355), + q(0), + ], + q(fulnio) => [ + q(2387), + q(0), + ], + q(fum) => [ + q(2386), + q(0), + ], + q(fungwa) => [ + q(6875), + q(0), + ], + q(fur) => [ + q(2393), + q(0), + ], + q(furu) => [ + q(2390), + q(0), + ], + q(futuna-aniwa) => [ + q(2389), + q(0), + ], + q(fuyug) => [ + q(2392), + q(0), + ], + q(fwai) => [ + q(2394), + q(0), + ], + q(fwe) => [ + q(2395), + q(0), + ], + q(fyam) => [ + q(5663), + q(0), + ], + q(fyer) => [ + q(2343), + q(0), + ], + q(ga) => [ + q(0146), + q(0), + ], + q(ga'anda) => [ + q(2607), + q(0), + ], + q(ga'dang) => [ + q(2456), + q(0), + ], + q(gaa) => [ + q(6720), + q(0), + ], + q(gaam) => [ + q(6377), + q(0), + ], + q(gabi-gabi) => [ + q(2438), + q(0), + ], + q(gabogbo) => [ + q(2514), + q(0), + ], + q(gabri) => [ + q(2396), + q(0), + ], + q(gabrielino-fernandeno) => [ + q(7329), + q(0), + ], + q(gadang) => [ + q(2460), + q(0), + ], + q(gaddang) => [ + q(2398), + q(0), + ], + q(gaddi) => [ + q(2427), + q(0), + ], + q(gade) => [ + q(2474), + q(0), + ], + q(gade lohar) => [ + q(2450), + q(0), + ], + q(gadjerawang) => [ + q(2457), + q(0), + ], + q(gadsup) => [ + q(2404), + q(0), + ], + q(gaelic) => [ + q(0154), + q(0), + ], + q(gafat) => [ + q(2488), + q(0), + ], + q(gagadu) => [ + q(2436), + q(0), + ], + q(gagauz) => [ + q(2401), + q(0), + ], + q(gagnoa bete) => [ + q(1476), + q(0), + ], + q(gagu) => [ + q(2497), + q(0), + ], + q(gahri) => [ + q(1157), + q(0), + ], + q(gaikundi) => [ + q(2422), + q(0), + ], + q(gail) => [ + q(2512), + q(0), + ], + q(gaina) => [ + q(2447), + q(0), + ], + q(gal) => [ + q(2410), + q(0), + ], + q(galambu) => [ + q(2548), + q(0), + ], + q(galatian) => [ + q(7326), + q(0), + ], + q(galela) => [ + q(2425), + q(0), + ], + q(galeya) => [ + q(2412), + q(0), + ], + q(galibi carib) => [ + q(0070), + q(0), + ], + q(galice) => [ + q(2444), + q(0), + ], + q(galician) => [ + q(0156), + q(0), + ], + q(galindan) => [ + q(7332), + q(0), + ], + q(gallurese sardinian) => [ + q(5945), + q(0), + ], + q(galo) => [ + q(0613), + q(0), + ], + q(galolen) => [ + q(2406), + q(0), + ], + q(gamale kham) => [ + q(3314), + q(0), + ], + q(gambera) => [ + q(2553), + q(0), + ], + q(gambian wolof) => [ + q(7187), + q(0), + ], + q(gamilaraay) => [ + q(3429), + q(0), + ], + q(gamit) => [ + q(2428), + q(0), + ], + q(gamkonora) => [ + q(2405), + q(0), + ], + q(gamo) => [ + q(2561), + q(0), + ], + q(gamo-ningi) => [ + q(1474), + q(0), + ], + q(gan chinese) => [ + q(2408), + q(0), + ], + q(gana) => [ + q(2573), + q(1), + ], + q(ganang) => [ + q(2569), + q(0), + ], + q(ganda) => [ + q(0258), + q(0), + ], + q(gandhari) => [ + q(5423), + q(0), + ], + q(gane) => [ + q(2706), + q(0), + ], + q(ganggalida) => [ + q(2443), + q(0), + ], + q(ganglau) => [ + q(2495), + q(0), + ], + q(gangte) => [ + q(2566), + q(0), + ], + q(gangulu) => [ + q(2574), + q(0), + ], + q(gants) => [ + q(2409), + q(0), + ], + q(ganza) => [ + q(2704), + q(0), + ], + q(ganzi) => [ + q(2582), + q(0), + ], + q(gao) => [ + q(2489), + q(0), + ], + q(gapapaiwa) => [ + q(5654), + q(0), + ], + q(garhwali) => [ + q(2429), + q(0), + ], + q(garifuna) => [ + q(1639), + q(0), + ], + q(garig-ilgar) => [ + q(2951), + q(0), + ], + q(garingbal) => [ + q(7331), + q(0), + ], + q(garlali) => [ + q(2547), + q(0), + ], + q(garo) => [ + q(2623), + q(0), + ], + q(garre) => [ + q(2485), + q(0), + ], + q(garrwa) => [ + q(7205), + q(0), + ], + q(garus) => [ + q(2693), + q(0), + ], + q(garza) => [ + q(7334), + q(0), + ], + q(gata') => [ + q(2411), + q(0), + ], + q(gavak) => [ + q(2078), + q(0), + ], + q(gavar) => [ + q(2599), + q(0), + ], + q(gaviao do jiparana) => [ + q(2671), + q(0), + ], + q(gawar-bati) => [ + q(2687), + q(0), + ], + q(gawwada) => [ + q(2679), + q(0), + ], + q(gayil) => [ + q(2699), + q(0), + ], + q(gayo) => [ + q(0147), + q(0), + ], + q(gazi) => [ + q(2705), + q(0), + ], + q(gbagyi) => [ + q(2434), + q(0), + ], + q(gban) => [ + q(2497), + q(1), + ], + q(gbanu) => [ + q(2437), + q(0), + ], + q(gbanziri) => [ + q(2423), + q(0), + ], + q(gbari) => [ + q(2440), + q(0), + ], + q(gbaya) => [ + q(0148), + q(0), + ], + q(gbaya (central african republic)) => [ + q(0148), + q(1), + ], + q(gbaya (sudan)) => [ + q(3582), + q(0), + ], + q(gbaya-bossangoa) => [ + q(2432), + q(0), + ], + q(gbaya-bozoum) => [ + q(2433), + q(0), + ], + q(gbaya-mbodomo) => [ + q(2558), + q(0), + ], + q(gbayi) => [ + q(2697), + q(0), + ], + q(gbesi gbe) => [ + q(2435), + q(0), + ], + q(gbii) => [ + q(2490), + q(0), + ], + q(gbin) => [ + q(7327), + q(0), + ], + q(gbiri-niragu) => [ + q(2615), + q(0), + ], + q(gboloo grebo) => [ + q(2473), + q(0), + ], + q(ge) => [ + q(2783), + q(0), + ], + q(geba karen) => [ + q(3677), + q(0), + ], + q(gebe) => [ + q(2477), + q(0), + ], + q(gedaged) => [ + q(2453), + q(0), + ], + q(gedeo) => [ + q(2139), + q(0), + ], + q(geez) => [ + q(0152), + q(0), + ], + q(geji) => [ + q(2529), + q(0), + ], + q(gejia) => [ + q(2783), + q(1), + ], + q(geko karen) => [ + q(2503), + q(0), + ], + q(gela) => [ + q(4942), + q(0), + ], + q(geman deng) => [ + q(4649), + q(1), + ], + q(geme) => [ + q(2481), + q(0), + ], + q(gen) => [ + q(2478), + q(0), + ], + q(gende) => [ + q(2400), + q(0), + ], + q(gengle) => [ + q(2475), + q(0), + ], + q(georgian) => [ + q(0150), + q(0), + ], + q(gepo) => [ + q(7622), + q(0), + ], + q(gera) => [ + q(2484), + q(0), + ], + q(gergiko) => [ + q(4448), + q(1), + ], + q(german) => [ + q(0151), + q(0), + ], + q(german sign language) => [ + q(2631), + q(0), + ], + q(german, low) => [ + q(0307), + q(2), + ], + q(german, middle high (ca.1050-1500)) => [ + q(0158), + q(0), + ], + q(german, old high (ca.750-1050)) => [ + q(0159), + q(0), + ], + q(germanic languages) => [ + q(0149), + q(0), + ], + q(geruma) => [ + q(2471), + q(0), + ], + q(geser-gorom) => [ + q(2482), + q(0), + ], + q(ghadames) => [ + q(2499), + q(0), + ], + q(ghanaian pidgin english) => [ + q(2605), + q(0), + ], + q(ghanaian sign language) => [ + q(2630), + q(0), + ], + q(ghandruk sign language) => [ + q(2467), + q(0), + ], + q(ghanongga) => [ + q(2505), + q(0), + ], + q(ghari) => [ + q(2616), + q(0), + ], + q(ghayavi) => [ + q(1313), + q(0), + ], + q(gheg albanian) => [ + q(0756), + q(0), + ], + q(ghera) => [ + q(2507), + q(0), + ], + q(ghodoberi) => [ + q(2464), + q(0), + ], + q(ghomala') => [ + q(1048), + q(0), + ], + q(ghomara) => [ + q(2506), + q(0), + ], + q(ghotuo) => [ + q(0539), + q(0), + ], + q(ghulfan) => [ + q(2504), + q(0), + ], + q(giangan) => [ + q(1169), + q(0), + ], + q(gibanawa) => [ + q(2511), + q(0), + ], + q(gichuka) => [ + q(1902), + q(1), + ], + q(gidar) => [ + q(2513), + q(0), + ], + q(giiwo) => [ + q(3418), + q(0), + ], + q(gikuyu) => [ + q(0225), + q(1), + ], + q(gikyode) => [ + q(0587), + q(0), + ], + q(gilaki) => [ + q(2546), + q(0), + ], + q(gilbertese) => [ + q(0153), + q(0), + ], + q(gilima) => [ + q(2526), + q(0), + ], + q(gilyak) => [ + q(4893), + q(0), + ], + q(gimi (eastern highlands)) => [ + q(2517), + q(0), + ], + q(gimi (west new britain)) => [ + q(2519), + q(0), + ], + q(gimme) => [ + q(3466), + q(0), + ], + q(gimnime) => [ + q(2559), + q(0), + ], + q(ginuman) => [ + q(2575), + q(0), + ], + q(ginyanga) => [ + q(0998), + q(0), + ], + q(girawa) => [ + q(1056), + q(0), + ], + q(giryama) => [ + q(5155), + q(0), + ], + q(githabul) => [ + q(2516), + q(0), + ], + q(gitonga) => [ + q(6624), + q(0), + ], + q(gitua) => [ + q(2496), + q(0), + ], + q(gitxsan) => [ + q(2523), + q(0), + ], + q(giyug) => [ + q(2527), + q(0), + ], + q(gizrra) => [ + q(6623), + q(0), + ], + q(glaro-twabo) => [ + q(2549), + q(0), + ], + q(glavda) => [ + q(2551), + q(0), + ], + q(glio-oubi) => [ + q(5330), + q(0), + ], + q(gnau) => [ + q(2580), + q(0), + ], + q(goan konkani) => [ + q(2594), + q(0), + ], + q(goaria) => [ + q(2515), + q(0), + ], + q(gobasi) => [ + q(2590), + q(0), + ], + q(gobu) => [ + q(2601), + q(0), + ], + q(godie) => [ + q(2586), + q(0), + ], + q(godwari) => [ + q(2470), + q(0), + ], + q(goemai) => [ + q(0800), + q(0), + ], + q(gofa) => [ + q(2588), + q(0), + ], + q(gogo) => [ + q(2589), + q(0), + ], + q(gogodala) => [ + q(2498), + q(0), + ], + q(gokana) => [ + q(2537), + q(0), + ], + q(gola) => [ + q(2593), + q(0), + ], + q(golin) => [ + q(2666), + q(0), + ], + q(golpa) => [ + q(3923), + q(0), + ], + q(gondi) => [ + q(0160), + q(0), + ], + q(gone dau) => [ + q(2595), + q(0), + ], + q(gongduk) => [ + q(2587), + q(0), + ], + q(gonja) => [ + q(2532), + q(0), + ], + q(gooniyandi) => [ + q(2572), + q(0), + ], + q(gor) => [ + q(2610), + q(0), + ], + q(gorakor) => [ + q(2585), + q(0), + ], + q(gorap) => [ + q(2597), + q(0), + ], + q(goreng) => [ + q(7330), + q(0), + ], + q(gorontalo) => [ + q(0161), + q(0), + ], + q(gorovu) => [ + q(2620), + q(0), + ], + q(gorowa) => [ + q(2600), + q(0), + ], + q(gothic) => [ + q(0162), + q(0), + ], + q(goundo) => [ + q(2602), + q(0), + ], + q(gourmanchema) => [ + q(2661), + q(0), + ], + q(gowlan) => [ + q(2591), + q(0), + ], + q(gowli) => [ + q(2592), + q(0), + ], + q(gowro) => [ + q(2681), + q(0), + ], + q(gozarkhani) => [ + q(2603), + q(0), + ], + q(grangali) => [ + q(4943), + q(0), + ], + q(grass koiari) => [ + q(3192), + q(0), + ], + q(grebo) => [ + q(0163), + q(0), + ], + q(greek) => [ + q(0165), + q(1), + ], + q(greek languages) => [ + q(0509), + q(0), + ], + q(greek sign language) => [ + q(2637), + q(0), + ], + q(greek, ancient (to 1453)) => [ + q(0164), + q(0), + ], + q(greek, modern (1453-)) => [ + q(0165), + q(0), + ], + q(green gelao) => [ + q(2520), + q(0), + ], + q(greenlandic) => [ + q(0212), + q(1), + ], + q(grenadian creole english) => [ + q(2446), + q(0), + ], + q(gresi) => [ + q(2622), + q(0), + ], + q(groma) => [ + q(2619), + q(0), + ], + q(gronings) => [ + q(2598), + q(0), + ], + q(gros ventre) => [ + q(0926), + q(0), + ], + q(gua) => [ + q(2690), + q(0), + ], + q(guadeloupean creole french) => [ + q(2445), + q(0), + ], + q(guahibo) => [ + q(2647), + q(0), + ], + q(guaja) => [ + q(2667), + q(0), + ], + q(guajajara) => [ + q(2641), + q(0), + ], + q(guambiano) => [ + q(2651), + q(0), + ], + q(guana (brazil)) => [ + q(2609), + q(0), + ], + q(guana (paraguay)) => [ + q(2663), + q(0), + ], + q(guanano) => [ + q(2664), + q(0), + ], + q(guanche) => [ + q(2567), + q(0), + ], + q(guanyinqiao) => [ + q(3100), + q(0), + ], + q(guarani) => [ + q(0166), + q(0), + ], + q(guarayu) => [ + q(2702), + q(0), + ], + q(guarequena) => [ + q(2399), + q(0), + ], + q(guatemalan sign language) => [ + q(2633), + q(0), + ], + q(guato) => [ + q(2638), + q(0), + ], + q(guayabero) => [ + q(2653), + q(0), + ], + q(gudang) => [ + q(7328), + q(0), + ], + q(gudanji) => [ + q(4902), + q(0), + ], + q(gude) => [ + q(2454), + q(0), + ], + q(gudu) => [ + q(2469), + q(0), + ], + q(guduf-gava) => [ + q(2455), + q(0), + ], + q(guebie) => [ + q(2514), + q(1), + ], + q(guernesiais) => [ + q(5048), + q(1), + ], + q(guerrero amuzgo) => [ + q(0785), + q(0), + ], + q(guerrero nahuatl) => [ + q(4847), + q(0), + ], + q(guevea de humboldt zapotec) => [ + q(7905), + q(0), + ], + q(gugadj) => [ + q(2491), + q(0), + ], + q(gugu badhun) => [ + q(2452), + q(0), + ], + q(gugu warra) => [ + q(7215), + q(0), + ], + q(gugubera) => [ + q(3415), + q(0), + ], + q(guguyimidjir) => [ + q(3424), + q(0), + ], + q(guhu-samane) => [ + q(2508), + q(0), + ], + q(guianese creole french) => [ + q(2448), + q(0), + ], + q(guibei zhuang) => [ + q(7825), + q(0), + ], + q(guiberoua bete) => [ + q(1130), + q(0), + ], + q(guibian zhuang) => [ + q(7827), + q(0), + ], + q(guila zapotec) => [ + q(7947), + q(0), + ], + q(guinea kpelle) => [ + q(2539), + q(0), + ], + q(guinean sign language) => [ + q(2657), + q(0), + ], + q(guiqiong) => [ + q(2608), + q(0), + ], + q(gujarati) => [ + q(0168), + q(0), + ], + q(gujari) => [ + q(2534), + q(0), + ], + q(gula (central african republic)) => [ + q(3220), + q(0), + ], + q(gula (chad)) => [ + q(2550), + q(0), + ], + q(gula iro) => [ + q(2545), + q(0), + ], + q(gula'alaa) => [ + q(2554), + q(0), + ], + q(gulay) => [ + q(2668), + q(0), + ], + q(gule) => [ + q(2552), + q(0), + ], + q(gulf arabic) => [ + q(0640), + q(0), + ], + q(guliguli) => [ + q(2544), + q(0), + ], + q(gumalu) => [ + q(2560), + q(0), + ], + q(gumatj) => [ + q(2576), + q(0), + ], + q(gumawana) => [ + q(2674), + q(0), + ], + q(gumuz) => [ + q(2649), + q(0), + ], + q(gun) => [ + q(2660), + q(0), + ], + q(gundi) => [ + q(2458), + q(0), + ], + q(gunditjmara) => [ + q(2531), + q(0), + ], + q(gundungurra) => [ + q(7463), + q(0), + ], + q(gungabula) => [ + q(2696), + q(0), + ], + q(gungu) => [ + q(5851), + q(0), + ], + q(guntai) => [ + q(2579), + q(0), + ], + q(gunwinggu) => [ + q(2654), + q(0), + ], + q(gunya) => [ + q(2703), + q(0), + ], + q(gupa-abawa) => [ + q(2604), + q(0), + ], + q(gupapuyngu) => [ + q(2645), + q(0), + ], + q(guragone) => [ + q(2492), + q(0), + ], + q(guramalum) => [ + q(2629), + q(0), + ], + q(gurani) => [ + q(2709), + q(0), + ], + q(gurdjar) => [ + q(2459), + q(0), + ], + q(gureng gureng) => [ + q(2578), + q(0), + ], + q(gurgula) => [ + q(2493), + q(0), + ], + q(guriaso) => [ + q(2627), + q(0), + ], + q(gurindji kriol) => [ + q(2533), + q(0), + ], + q(gurinji) => [ + q(2644), + q(0), + ], + q(gurmana) => [ + q(2669), + q(0), + ], + q(guro) => [ + q(2583), + q(0), + ], + q(gurung) => [ + q(2673), + q(0), + ], + q(guruntum-mbaaru) => [ + q(2613), + q(0), + ], + q(gusan) => [ + q(2634), + q(1), + ], + q(gusii) => [ + q(2662), + q(0), + ], + q(gusilay) => [ + q(2632), + q(0), + ], + q(guwa) => [ + q(7336), + q(0), + ], + q(guwamu) => [ + q(2688), + q(0), + ], + q(guwinmal) => [ + q(7333), + q(1), + ], + q(guya) => [ + q(2535), + q(0), + ], + q(guyanese creole english) => [ + q(2701), + q(0), + ], + q(guyani) => [ + q(2675), + q(0), + ], + q(gvoko) => [ + q(4845), + q(0), + ], + q(gwa) => [ + q(2677), + q(0), + ], + q(gwahatike) => [ + q(1937), + q(0), + ], + q(gwak) => [ + q(3085), + q(0), + ], + q(gwamhi-wuri) => [ + q(1162), + q(0), + ], + q(gwandara) => [ + q(2685), + q(0), + ], + q(gweda) => [ + q(2626), + q(0), + ], + q(gweno) => [ + q(2680), + q(0), + ], + q(gwere) => [ + q(2686), + q(0), + ], + q(gwi) => [ + q(2683), + q(1), + ], + q(gwich'in) => [ + q(0169), + q(0), + ], + q(gyele) => [ + q(2698), + q(0), + ], + q(gyem) => [ + q(2695), + q(0), + ], + q(ha) => [ + q(2722), + q(0), + ], + q(habu) => [ + q(2733), + q(0), + ], + q(hadiyya) => [ + q(2738), + q(0), + ], + q(hadothi) => [ + q(2814), + q(0), + ], + q(hadrami) => [ + q(7339), + q(0), + ], + q(hadrami arabic) => [ + q(0999), + q(0), + ], + q(hadza) => [ + q(2846), + q(0), + ], + q(haeke) => [ + q(0629), + q(0), + ], + q(hahon) => [ + q(2714), + q(0), + ], + q(hai//om) => [ + q(2745), + q(0), + ], + q(haida) => [ + q(0170), + q(0), + ], + q(haigwai) => [ + q(2746), + q(0), + ], + q(haiom) => [ + q(2745), + q(1), + ], + q(haiphong sign language) => [ + q(2712), + q(0), + ], + q(haisla) => [ + q(2724), + q(0), + ], + q(haitian) => [ + q(0171), + q(0), + ], + q(haitian creole) => [ + q(0171), + q(1), + ], + q(haitian vodoun culture language) => [ + q(2872), + q(0), + ], + q(haji) => [ + q(2763), + q(0), + ], + q(hajong) => [ + q(2715), + q(0), + ], + q(haka chin) => [ + q(1796), + q(1), + ], + q(hakha chin) => [ + q(1796), + q(0), + ], + q(hakka chinese) => [ + q(2716), + q(0), + ], + q(hako) => [ + q(2720), + q(0), + ], + q(halang) => [ + q(2717), + q(0), + ], + q(halang doan) => [ + q(2770), + q(0), + ], + q(halbi) => [ + q(2769), + q(0), + ], + q(halh mongolian) => [ + q(3338), + q(0), + ], + q(halia) => [ + q(2768), + q(0), + ], + q(halkomelem) => [ + q(2863), + q(0), + ], + q(hamap) => [ + q(2792), + q(0), + ], + q(hamba) => [ + q(2729), + q(0), + ], + q(hamea) => [ + q(1737), + q(1), + ], + q(hamer-banna) => [ + q(0771), + q(0), + ], + q(hamtai) => [ + q(2791), + q(0), + ], + q(han) => [ + q(2707), + q(0), + ], + q(hanga) => [ + q(2713), + q(0), + ], + q(hanga hundi) => [ + q(7195), + q(0), + ], + q(hangaza) => [ + q(2719), + q(0), + ], + q(hani) => [ + q(2801), + q(0), + ], + q(hano) => [ + q(3978), + q(0), + ], + q(hanoi sign language) => [ + q(2708), + q(0), + ], + q(hanunoo) => [ + q(2803), + q(0), + ], + q(harami) => [ + q(7337), + q(0), + ], + q(harari) => [ + q(2723), + q(0), + ], + q(harijan kinnauri) => [ + q(3389), + q(0), + ], + q(haroi) => [ + q(2833), + q(0), + ], + q(haroti) => [ + q(2814), + q(1), + ], + q(harsusi) => [ + q(2843), + q(0), + ], + q(haruai) => [ + q(6577), + q(0), + ], + q(haruku) => [ + q(2831), + q(0), + ], + q(haryanvi) => [ + q(1164), + q(0), + ], + q(harzani) => [ + q(2839), + q(0), + ], + q(hasha) => [ + q(7589), + q(0), + ], + q(hassaniyya) => [ + q(4215), + q(0), + ], + q(hatam) => [ + q(2710), + q(0), + ], + q(hattic) => [ + q(7342), + q(0), + ], + q(hausa) => [ + q(0172), + q(0), + ], + q(hausa sign language) => [ + q(2841), + q(0), + ], + q(havasupai-walapai-yavapai) => [ + q(7752), + q(0), + ], + q(haveke) => [ + q(2874), + q(0), + ], + q(havu) => [ + q(2725), + q(0), + ], + q(hawai'i creole english) => [ + q(2878), + q(0), + ], + q(hawai'i pidgin) => [ + q(2878), + q(1), + ], + q(hawai'i pidgin sign language) => [ + q(2827), + q(1), + ], + q(hawai'i sign language (hsl)) => [ + q(2827), + q(0), + ], + q(hawaiian) => [ + q(0173), + q(0), + ], + q(haya) => [ + q(2727), + q(0), + ], + q(hazaragi) => [ + q(2728), + q(0), + ], + q(hdi) => [ + q(7316), + q(0), + ], + q(hebrew) => [ + q(0174), + q(0), + ], + q(hehe) => [ + q(2742), + q(0), + ], + q(heiban) => [ + q(2731), + q(0), + ], + q(heiltsuk) => [ + q(2743), + q(0), + ], + q(helambu sherpa) => [ + q(5926), + q(0), + ], + q(helong) => [ + q(2741), + q(0), + ], + q(hema) => [ + q(4895), + q(0), + ], + q(hemba) => [ + q(2744), + q(0), + ], + q(herde) => [ + q(2740), + q(0), + ], + q(herero) => [ + q(0175), + q(0), + ], + q(hermit) => [ + q(3952), + q(0), + ], + q(hernican) => [ + q(7341), + q(0), + ], + q(hertevin) => [ + q(2835), + q(0), + ], + q(heung kong sau yue) => [ + q(2767), + q(1), + ], + q(hewa) => [ + q(2718), + q(0), + ], + q(heyo) => [ + q(0942), + q(0), + ], + q(hiberno-scottish gaelic) => [ + q(2500), + q(0), + ], + q(hibito) => [ + q(2751), + q(0), + ], + q(hidatsa) => [ + q(2752), + q(0), + ], + q(hieroglyphic luwian) => [ + q(2773), + q(0), + ], + q(higaonon) => [ + q(4120), + q(0), + ], + q(highland konjo) => [ + q(3385), + q(0), + ], + q(highland oaxaca chontal) => [ + q(1717), + q(0), + ], + q(highland popoluca) => [ + q(5555), + q(0), + ], + q(highland puebla nahuatl) => [ + q(1022), + q(0), + ], + q(highland totonac) => [ + q(6633), + q(0), + ], + q(hijazi arabic) => [ + q(0601), + q(0), + ], + q(hijuk) => [ + q(2757), + q(0), + ], + q(hiligaynon) => [ + q(0176), + q(0), + ], + q(himachali languages) => [ + q(0177), + q(0), + ], + q(himarima) => [ + q(2760), + q(0), + ], + q(hindi) => [ + q(0178), + q(0), + ], + q(hinduri) => [ + q(2756), + q(0), + ], + q(hinukh) => [ + q(2518), + q(0), + ], + q(hiri motu) => [ + q(0181), + q(0), + ], + q(hittite) => [ + q(0179), + q(0), + ], + q(hitu) => [ + q(2847), + q(0), + ], + q(hiw) => [ + q(2761), + q(0), + ], + q(hixkaryana) => [ + q(2762), + q(0), + ], + q(hlai) => [ + q(3903), + q(0), + ], + q(hlepho phowa) => [ + q(7629), + q(0), + ], + q(hlersu) => [ + q(2771), + q(0), + ], + q(hmar) => [ + q(2789), + q(0), + ], + q(hmong) => [ + q(0180), + q(0), + ], + q(hmong daw) => [ + q(4636), + q(0), + ], + q(hmong do) => [ + q(2793), + q(0), + ], + q(hmong don) => [ + q(2779), + q(0), + ], + q(hmong njua) => [ + q(2802), + q(0), + ], + q(hmong shua) => [ + q(2796), + q(0), + ], + q(hmong-mien languages) => [ + q(0510), + q(0), + ], + q(hmwaveke) => [ + q(4508), + q(0), + ], + q(ho) => [ + q(2809), + q(0), + ], + q(ho chi minh city sign language) => [ + q(2820), + q(0), + ], + q(ho-chunk) => [ + q(7124), + q(0), + ], + q(hoava) => [ + q(2807), + q(0), + ], + q(hobyot) => [ + q(2812), + q(0), + ], + q(hoia hoia) => [ + q(2747), + q(0), + ], + q(hokan languages) => [ + q(0511), + q(0), + ], + q(holikachuk) => [ + q(2813), + q(0), + ], + q(holiya) => [ + q(2824), + q(0), + ], + q(holma) => [ + q(2810), + q(0), + ], + q(holoholo) => [ + q(2817), + q(0), + ], + q(holu) => [ + q(2815), + q(0), + ], + q(homa) => [ + q(2816), + q(0), + ], + q(honduras sign language) => [ + q(2737), + q(0), + ], + q(hone) => [ + q(3150), + q(0), + ], + q(hong kong sign language) => [ + q(2767), + q(0), + ], + q(honi) => [ + q(2823), + q(0), + ], + q(hopi) => [ + q(2818), + q(0), + ], + q(horned miao) => [ + q(2832), + q(0), + ], + q(horo) => [ + q(2819), + q(0), + ], + q(horom) => [ + q(2811), + q(0), + ], + q(horpa) => [ + q(2282), + q(0), + ], + q(hote) => [ + q(2821), + q(0), + ], + q(hoti) => [ + q(2844), + q(0), + ], + q(hovongan) => [ + q(2822), + q(0), + ], + q(hoyahoya) => [ + q(2749), + q(0), + ], + q(hozo) => [ + q(2825), + q(0), + ], + q(hpon) => [ + q(2826), + q(0), + ], + q(hrangkhol) => [ + q(2828), + q(0), + ], + q(hre) => [ + q(2830), + q(0), + ], + q(hruso) => [ + q(2836), + q(0), + ], + q(hu) => [ + q(2861), + q(0), + ], + q(hua) => [ + q(2850), + q(1), + ], + q(huachipaeri) => [ + q(2854), + q(0), + ], + q(huallaga huanuco quechua) => [ + q(5671), + q(0), + ], + q(huamalies-dos de mayo huanuco quechua) => [ + q(5694), + q(0), + ], + q(huambisa) => [ + q(2849), + q(0), + ], + q(huarijio) => [ + q(6966), + q(0), + ], + q(huastec) => [ + q(2864), + q(0), + ], + q(huaulu) => [ + q(2851), + q(0), + ], + q(huautla mazatec) => [ + q(4115), + q(0), + ], + q(huaxcaleca nahuatl) => [ + q(4867), + q(0), + ], + q(huaylas ancash quechua) => [ + q(5708), + q(0), + ], + q(huaylla wanca quechua) => [ + q(5703), + q(0), + ], + q(huba) => [ + q(2730), + q(0), + ], + q(huehuetla tepehua) => [ + q(6443), + q(0), + ], + q(huichol) => [ + q(2735), + q(0), + ], + q(huilliche) => [ + q(2855), + q(0), + ], + q(huitepec mixtec) => [ + q(4658), + q(0), + ], + q(huizhou chinese) => [ + q(1927), + q(0), + ], + q(hukumina) => [ + q(2868), + q(0), + ], + q(hula) => [ + q(2859), + q(0), + ], + q(hulaula) => [ + q(2870), + q(0), + ], + q(huli) => [ + q(2856), + q(0), + ], + q(hulung) => [ + q(2858), + q(0), + ], + q(humburi senni songhay) => [ + q(2775), + q(0), + ], + q(humene) => [ + q(2853), + q(0), + ], + q(humla) => [ + q(2865), + q(0), + ], + q(hun-saare) => [ + q(2167), + q(0), + ], + q(hunde) => [ + q(2765), + q(0), + ], + q(hung) => [ + q(2806), + q(0), + ], + q(hungana) => [ + q(2860), + q(0), + ], + q(hungarian) => [ + q(0184), + q(0), + ], + q(hungarian sign language) => [ + q(2840), + q(0), + ], + q(hungworo) => [ + q(4727), + q(1), + ], + q(hunjara-kaina ke) => [ + q(2766), + q(0), + ], + q(hunnic) => [ + q(7338), + q(0), + ], + q(hunsrik) => [ + q(2838), + q(0), + ], + q(hunzib) => [ + q(2871), + q(0), + ], + q(hupa) => [ + q(0185), + q(0), + ], + q(hupde) => [ + q(3157), + q(0), + ], + q(hupla) => [ + q(2721), + q(0), + ], + q(hurrian) => [ + q(7343), + q(0), + ], + q(hutterisch) => [ + q(2476), + q(1), + ], + q(hutterite german) => [ + q(2476), + q(0), + ], + q(hwana) => [ + q(2879), + q(0), + ], + q(hya) => [ + q(2880), + q(0), + ], + q(hyam) => [ + q(3040), + q(0), + ], + q(i'saka) => [ + q(3597), + q(1), + ], + q(i-wak) => [ + q(3027), + q(0), + ], + q(iaai) => [ + q(2881), + q(0), + ], + q(iamalele) => [ + q(7681), + q(0), + ], + q(iatmul) => [ + q(2882), + q(0), + ], + q(iau) => [ + q(6592), + q(0), + ], + q(ibali teke) => [ + q(6448), + q(0), + ], + q(ibaloi) => [ + q(2889), + q(0), + ], + q(iban) => [ + q(0186), + q(0), + ], + q(ibanag) => [ + q(2887), + q(0), + ], + q(ibani) => [ + q(2894), + q(0), + ], + q(ibatan) => [ + q(3025), + q(0), + ], + q(iberian) => [ + q(7345), + q(0), + ], + q(ibibio) => [ + q(2884), + q(0), + ], + q(ibino) => [ + q(2891), + q(0), + ], + q(ibu) => [ + q(2893), + q(0), + ], + q(ibuoro) => [ + q(2892), + q(0), + ], + q(icelandic) => [ + q(0188), + q(0), + ], + q(icelandic sign language) => [ + q(2897), + q(0), + ], + q(iceve-maci) => [ + q(1118), + q(0), + ], + q(ida'an) => [ + q(1957), + q(0), + ], + q(idakho-isukha-tiriki) => [ + q(2899), + q(0), + ], + q(idate) => [ + q(2907), + q(0), + ], + q(idere) => [ + q(2903), + q(0), + ], + q(idesa) => [ + q(2906), + q(0), + ], + q(idi) => [ + q(2904), + q(0), + ], + q(ido) => [ + q(0189), + q(0), + ], + q(idoma) => [ + q(2908), + q(0), + ], + q(idon) => [ + q(2901), + q(0), + ], + q(idu-mishmi) => [ + q(1773), + q(0), + ], + q(iduna) => [ + q(6990), + q(0), + ], + q(ife) => [ + q(2911), + q(0), + ], + q(ifo) => [ + q(2912), + q(0), + ], + q(igala) => [ + q(2920), + q(0), + ], + q(igana) => [ + q(2919), + q(0), + ], + q(igbo) => [ + q(0187), + q(0), + ], + q(igede) => [ + q(2918), + q(0), + ], + q(ignaciano) => [ + q(2922), + q(0), + ], + q(igo) => [ + q(0684), + q(0), + ], + q(iguta) => [ + q(4725), + q(0), + ], + q(igwe) => [ + q(2925), + q(0), + ], + q(iha) => [ + q(2928), + q(0), + ], + q(iha based pidgin) => [ + q(2926), + q(0), + ], + q(ihievbe) => [ + q(2927), + q(0), + ], + q(ija-zuba) => [ + q(6992), + q(0), + ], + q(ijo languages) => [ + q(0191), + q(0), + ], + q(ik) => [ + q(2947), + q(0), + ], + q(ika) => [ + q(2938), + q(0), + ], + q(ikaranggal) => [ + q(2942), + q(0), + ], + q(ikizu) => [ + q(2948), + q(0), + ], + q(iko) => [ + q(2937), + q(0), + ], + q(ikobi) => [ + q(4195), + q(0), + ], + q(ikoma-nata-isenye) => [ + q(5089), + q(0), + ], + q(ikpeng) => [ + q(6802), + q(0), + ], + q(ikpeshi) => [ + q(2941), + q(0), + ], + q(ikposo) => [ + q(3533), + q(0), + ], + q(iku-gora-ankwa) => [ + q(2945), + q(0), + ], + q(ikulu) => [ + q(2939), + q(0), + ], + q(ikwere) => [ + q(2946), + q(0), + ], + q(ikwo) => [ + q(2984), + q(0), + ], + q(ila) => [ + q(2950), + q(0), + ], + q(ile ape) => [ + q(2949), + q(0), + ], + q(ili turki) => [ + q(2952), + q(0), + ], + q(ili'uun) => [ + q(2957), + q(0), + ], + q(ilianen manobo) => [ + q(4127), + q(0), + ], + q(illyrian) => [ + q(7347), + q(0), + ], + q(iloko) => [ + q(0194), + q(0), + ], + q(ilongot) => [ + q(2953), + q(0), + ], + q(ilue) => [ + q(2958), + q(0), + ], + q(ilwana) => [ + q(4369), + q(0), + ], + q(imbabura highland quichua) => [ + q(5695), + q(0), + ], + q(imbongu) => [ + q(2963), + q(0), + ], + q(imonda) => [ + q(2962), + q(0), + ], + q(imperial aramaic (700-300 bce)) => [ + q(0022), + q(1), + ], + q(imroing) => [ + q(2964), + q(0), + ], + q(inabaknon) => [ + q(0582), + q(0), + ], + q(inapang) => [ + q(4706), + q(0), + ], + q(inapari) => [ + q(2974), + q(0), + ], + q(inari sami) => [ + q(0392), + q(0), + ], + q(indian sign language) => [ + q(2975), + q(0), + ], + q(indic languages) => [ + q(0196), + q(0), + ], + q(indo-european languages) => [ + q(0198), + q(0), + ], + q(indo-iranian languages) => [ + q(0513), + q(0), + ], + q(indo-portuguese) => [ + q(2900), + q(0), + ], + q(indonesian) => [ + q(0197), + q(0), + ], + q(indonesian bajau) => [ + q(1101), + q(0), + ], + q(indonesian sign language) => [ + q(2970), + q(0), + ], + q(indri) => [ + q(2905), + q(0), + ], + q(indus kohistani) => [ + q(4616), + q(0), + ], + q(indus valley language) => [ + q(7351), + q(0), + ], + q(inebu one) => [ + q(5212), + q(0), + ], + q(ineseno) => [ + q(2977), + q(0), + ], + q(inga) => [ + q(2967), + q(0), + ], + q(ingrian) => [ + q(3036), + q(0), + ], + q(ingush) => [ + q(0199), + q(0), + ], + q(inlaod itneg) => [ + q(3011), + q(0), + ], + q(inoke-yate) => [ + q(2973), + q(0), + ], + q(inonhan) => [ + q(4007), + q(0), + ], + q(inor) => [ + q(2978), + q(0), + ], + q(inpui naga) => [ + q(4920), + q(0), + ], + q(interglossa) => [ + q(2924), + q(0), + ], + q(interlingua (international auxiliary language association)) => [ + q(0195), + q(0), + ], + q(interlingue) => [ + q(0193), + q(0), + ], + q(international sign) => [ + q(2956), + q(0), + ], + q(intha) => [ + q(2976), + q(0), + ], + q(inuinnaqtun) => [ + q(2944), + q(0), + ], + q(inuit sign language) => [ + q(2943), + q(0), + ], + q(inuktitut) => [ + q(0192), + q(0), + ], + q(inupiaq) => [ + q(0200), + q(0), + ], + q(iowa-oto) => [ + q(2980), + q(0), + ], + q(ipalapa amuzgo) => [ + q(1018), + q(0), + ], + q(ipiko) => [ + q(2982), + q(0), + ], + q(ipili) => [ + q(2981), + q(0), + ], + q(ipulo) => [ + q(0903), + q(0), + ], + q(iquito) => [ + q(2983), + q(0), + ], + q(ir) => [ + q(2990), + q(0), + ], + q(iranian languages) => [ + q(0201), + q(0), + ], + q(iranian persian) => [ + q(5414), + q(0), + ], + q(irantxe) => [ + q(2989), + q(0), + ], + q(iranun (malaysia)) => [ + q(2954), + q(0), + ], + q(iranun (philippines)) => [ + q(2955), + q(0), + ], + q(iraqw) => [ + q(2988), + q(0), + ], + q(irarutu) => [ + q(2986), + q(0), + ], + q(iraya) => [ + q(2993), + q(0), + ], + q(iresim) => [ + q(2985), + q(0), + ], + q(irigwe) => [ + q(2987), + q(0), + ], + q(irish) => [ + q(0155), + q(0), + ], + q(irish sign language) => [ + q(2998), + q(0), + ], + q(irish, middle (900-1200)) => [ + q(0279), + q(0), + ], + q(irish, old (to 900)) => [ + q(0378), + q(0), + ], + q(iroquoian languages) => [ + q(0202), + q(0), + ], + q(irula) => [ + q(2991), + q(0), + ], + q(isabi) => [ + q(2994), + q(0), + ], + q(isanzu) => [ + q(3003), + q(0), + ], + q(isarog agta) => [ + q(0663), + q(0), + ], + q(isconahua) => [ + q(2995), + q(0), + ], + q(isebe) => [ + q(2923), + q(0), + ], + q(isekiri) => [ + q(3017), + q(0), + ], + q(ishkashimi) => [ + q(3001), + q(0), + ], + q(isinai) => [ + q(2972), + q(0), + ], + q(isirawa) => [ + q(6207), + q(0), + ], + q(island carib) => [ + q(1840), + q(0), + ], + q(islander creole english) => [ + q(2898), + q(0), + ], + q(isnag) => [ + q(2996), + q(0), + ], + q(isoko) => [ + q(3004), + q(0), + ], + q(israeli sign language) => [ + q(3005), + q(0), + ], + q(isthmus mixe) => [ + q(4306), + q(0), + ], + q(isthmus zapotec) => [ + q(7798), + q(0), + ], + q(isthmus-cosoleacaque nahuatl) => [ + q(4862), + q(0), + ], + q(isthmus-mecayapan nahuatl) => [ + q(4873), + q(0), + ], + q(isthmus-pajapan nahuatl) => [ + q(4866), + q(0), + ], + q(istriot) => [ + q(3006), + q(0), + ], + q(istro romanian) => [ + q(5859), + q(0), + ], + q(isu (fako division)) => [ + q(6345), + q(0), + ], + q(isu (menchum division)) => [ + q(3007), + q(0), + ], + q(italian) => [ + q(0203), + q(0), + ], + q(italian sign language) => [ + q(2997), + q(0), + ], + q(italic languages) => [ + q(0514), + q(0), + ], + q(itawit) => [ + q(3019), + q(0), + ], + q(itelmen) => [ + q(3013), + q(0), + ], + q(itene) => [ + q(3010), + q(0), + ], + q(iteri) => [ + q(3016), + q(0), + ], + q(itik) => [ + q(3021), + q(0), + ], + q(ito) => [ + q(3020), + q(0), + ], + q(itonama) => [ + q(3015), + q(0), + ], + q(itu mbon uzo) => [ + q(3014), + q(0), + ], + q(itundujia mixtec) => [ + q(4149), + q(0), + ], + q(itza) => [ + q(3023), + q(0), + ], + q(iu mien) => [ + q(3024), + q(0), + ], + q(ivatan) => [ + q(3026), + q(0), + ], + q(ivbie north-okpela-arhe) => [ + q(0915), + q(0), + ], + q(iwaidja) => [ + q(2885), + q(0), + ], + q(iwal) => [ + q(3194), + q(0), + ], + q(iwam) => [ + q(3028), + q(0), + ], + q(iwur) => [ + q(3029), + q(0), + ], + q(ixcatec) => [ + q(3031), + q(0), + ], + q(ixcatlan mazatec) => [ + q(4694), + q(0), + ], + q(ixil) => [ + q(3032), + q(0), + ], + q(ixtayutla mixtec) => [ + q(7012), + q(0), + ], + q(ixtenco otomi) => [ + q(5328), + q(0), + ], + q(iyayu) => [ + q(3033), + q(0), + ], + q(iyive) => [ + q(6862), + q(0), + ], + q(iyo) => [ + q(4754), + q(0), + ], + q(iyo'wujwa chorote) => [ + q(1852), + q(0), + ], + q(iyojwa'ja chorote) => [ + q(1855), + q(0), + ], + q(izere) => [ + q(3037), + q(0), + ], + q(izii) => [ + q(3038), + q(0), + ], + q(izon) => [ + q(2931), + q(0), + ], + q(izora) => [ + q(1668), + q(0), + ], + q(jabuti) => [ + q(3065), + q(0), + ], + q(jad) => [ + q(3070), + q(0), + ], + q(jadgali) => [ + q(3071), + q(0), + ], + q(jah hut) => [ + q(3045), + q(0), + ], + q(jahanka) => [ + q(3042), + q(0), + ], + q(jair awyu) => [ + q(0982), + q(0), + ], + q(jaitmatang) => [ + q(7354), + q(0), + ], + q(jakalteko) => [ + q(3041), + q(1), + ], + q(jakati) => [ + q(3054), + q(0), + ], + q(jakun) => [ + q(3047), + q(0), + ], + q(jalapa de diaz mazatec) => [ + q(4111), + q(0), + ], + q(jalkunan) => [ + q(1577), + q(0), + ], + q(jamaican country sign language) => [ + q(3068), + q(0), + ], + q(jamaican creole english) => [ + q(3049), + q(0), + ], + q(jamaican sign language) => [ + q(3114), + q(0), + ], + q(jamamadi) => [ + q(3039), + q(0), + ], + q(jambi malay) => [ + q(3056), + q(0), + ], + q(jamiltepec mixtec) => [ + q(4659), + q(0), + ], + q(jamsay dogon) => [ + q(2061), + q(0), + ], + q(jandai) => [ + q(3050), + q(0), + ], + q(jandavra) => [ + q(3127), + q(0), + ], + q(jangkang) => [ + q(2063), + q(0), + ], + q(jangshung) => [ + q(3126), + q(0), + ], + q(janji) => [ + q(3129), + q(0), + ], + q(japanese) => [ + q(0206), + q(0), + ], + q(japanese (family)) => [ + q(0515), + q(0), + ], + q(japanese sign language) => [ + q(3145), + q(0), + ], + q(japreria) => [ + q(3144), + q(0), + ], + q(jaqaru) => [ + q(3140), + q(0), + ], + q(jara) => [ + q(3044), + q(0), + ], + q(jarai) => [ + q(3141), + q(0), + ], + q(jarawa (india)) => [ + q(0805), + q(0), + ], + q(jaru) => [ + q(1977), + q(0), + ], + q(jauja wanca quechua) => [ + q(5724), + q(0), + ], + q(jaunsari) => [ + q(3132), + q(0), + ], + q(javanese) => [ + q(0204), + q(0), + ], + q(javindo) => [ + q(3164), + q(0), + ], + q(jawe) => [ + q(3058), + q(0), + ], + q(jaya) => [ + q(3169), + q(0), + ], + q(jebero) => [ + q(3073), + q(0), + ], + q(jeh) => [ + q(3075), + q(0), + ], + q(jehai) => [ + q(3087), + q(0), + ], + q(jejueo) => [ + q(3105), + q(0), + ], + q(jemez) => [ + q(6636), + q(0), + ], + q(jenaama bozo) => [ + q(1616), + q(0), + ], + q(jennu kurumba) => [ + q(7519), + q(0), + ], + q(jere) => [ + q(3080), + q(0), + ], + q(jeri kuo) => [ + q(3077), + q(0), + ], + q(jerriais) => [ + q(5048), + q(0), + ], + q(jerung) => [ + q(3074), + q(0), + ], + q(jewish babylonian aramaic (ca. 200-1200 ce)) => [ + q(6589), + q(0), + ], + q(jewish palestinian aramaic) => [ + q(3139), + q(0), + ], + q(jhankot sign language) => [ + q(3088), + q(0), + ], + q(jiamao) => [ + q(3099), + q(0), + ], + q(jiarong) => [ + q(3167), + q(0), + ], + q(jiba) => [ + q(3156), + q(0), + ], + q(jibu) => [ + q(3090), + q(0), + ], + q(jicarilla apache) => [ + q(0843), + q(0), + ], + q(jiiddu) => [ + q(3096), + q(0), + ], + q(jilbe) => [ + q(3093), + q(0), + ], + q(jilim) => [ + q(3097), + q(0), + ], + q(jimi (cameroon)) => [ + q(3098), + q(0), + ], + q(jimi (nigeria)) => [ + q(3119), + q(0), + ], + q(jina) => [ + q(3089), + q(0), + ], + q(jingpho) => [ + q(0211), + q(1), + ], + q(jinyu chinese) => [ + q(1751), + q(0), + ], + q(jiongnai bunu) => [ + q(5544), + q(0), + ], + q(jirel) => [ + q(3153), + q(0), + ], + q(jiru) => [ + q(3142), + q(0), + ], + q(jita) => [ + q(3101), + q(0), + ], + q(jju) => [ + q(3176), + q(0), + ], + q(joba) => [ + q(3133), + q(0), + ], + q(jofotek-bromnya) => [ + q(3064), + q(0), + ], + q(jogi) => [ + q(3135), + q(0), + ], + q(jola-fonyi) => [ + q(2201), + q(0), + ], + q(jola-kasa) => [ + q(1870), + q(0), + ], + q(jonkor bourmataguil) => [ + q(3082), + q(0), + ], + q(jora) => [ + q(3136), + q(0), + ], + q(jordanian sign language) => [ + q(3137), + q(0), + ], + q(jorto) => [ + q(3143), + q(0), + ], + q(jowulu) => [ + q(3138), + q(0), + ], + q(ju) => [ + q(3161), + q(0), + ], + q(ju/'hoan) => [ + q(3639), + q(0), + ], + q(juang) => [ + q(3155), + q(0), + ], + q(judeo-arabic) => [ + q(0208), + q(0), + ], + q(judeo-berber) => [ + q(3059), + q(0), + ], + q(judeo-georgian) => [ + q(3084), + q(0), + ], + q(judeo-iraqi arabic) => [ + q(7628), + q(0), + ], + q(judeo-italian) => [ + q(3012), + q(0), + ], + q(judeo-moroccan arabic) => [ + q(0720), + q(0), + ], + q(judeo-persian) => [ + q(0207), + q(0), + ], + q(judeo-tat) => [ + q(3072), + q(0), + ], + q(judeo-tripolitanian arabic) => [ + q(7750), + q(0), + ], + q(judeo-tunisian arabic) => [ + q(0719), + q(0), + ], + q(judeo-yemeni arabic) => [ + q(3168), + q(0), + ], + q(juhoan) => [ + q(3639), + q(1), + ], + q(jukun takum) => [ + q(3066), + q(0), + ], + q(juma) => [ + q(3146), + q(0), + ], + q(jumjum) => [ + q(3154), + q(0), + ], + q(jumla sign language) => [ + q(3159), + q(0), + ], + q(jumli) => [ + q(3120), + q(0), + ], + q(jungle inga) => [ + q(2969), + q(0), + ], + q(juquila mixe) => [ + q(4656), + q(0), + ], + q(jur modo) => [ + q(1134), + q(0), + ], + q(juray) => [ + q(3163), + q(0), + ], + q(jurchen) => [ + q(3148), + q(0), + ], + q(juruna) => [ + q(3158), + q(0), + ], + q(jutish) => [ + q(3160), + q(0), + ], + q(juwal) => [ + q(4619), + q(0), + ], + q(juxtlahuaca mixtec) => [ + q(7005), + q(0), + ], + q(ju|'hoansi) => [ + q(3639), + q(2), + ], + q(jwira-pepesa) => [ + q(3166), + q(0), + ], + q(k'iche') => [ + q(5672), + q(0), + ], + q(kaamba) => [ + q(7373), + q(0), + ], + q(kaan) => [ + q(3845), + q(0), + ], + q(kaang chin) => [ + q(1755), + q(0), + ], + q(kaansa) => [ + q(2565), + q(0), + ], + q(kaapor) => [ + q(6912), + q(1), + ], + q(kaapor sign language) => [ + q(6871), + q(1), + ], + q(kaba) => [ + q(3604), + q(0), + ], + q(kabalai) => [ + q(3666), + q(0), + ], + q(kabardian) => [ + q(0220), + q(0), + ], + q(kabatei) => [ + q(7368), + q(0), + ], + q(kabiye) => [ + q(3197), + q(0), + ], + q(kabola) => [ + q(3451), + q(0), + ], + q(kabore one) => [ + q(5268), + q(0), + ], + q(kabras) => [ + q(3931), + q(0), + ], + q(kaburi) => [ + q(6864), + q(0), + ], + q(kabutra) => [ + q(3202), + q(0), + ], + q(kabuverdianu) => [ + q(3256), + q(0), + ], + q(kabwa) => [ + q(1918), + q(0), + ], + q(kabwari) => [ + q(3230), + q(0), + ], + q(kabyle) => [ + q(0210), + q(0), + ], + q(kachama-ganjule) => [ + q(3231), + q(0), + ], + q(kachari) => [ + q(7261), + q(0), + ], + q(kachhi) => [ + q(3299), + q(0), + ], + q(kachi koli) => [ + q(2530), + q(0), + ], + q(kachin) => [ + q(0211), + q(0), + ], + q(kacipo-balesi) => [ + q(3505), + q(0), + ], + q(kaco') => [ + q(7364), + q(0), + ], + q(kadai) => [ + q(3764), + q(0), + ], + q(kadar) => [ + q(3265), + q(0), + ], + q(kadaru) => [ + q(3251), + q(0), + ], + q(kadazan dusun) => [ + q(2159), + q(0), + ], + q(kadiweu) => [ + q(3186), + q(0), + ], + q(kadu) => [ + q(7845), + q(0), + ], + q(kaduo) => [ + q(3630), + q(0), + ], + q(kaera) => [ + q(3107), + q(0), + ], + q(kafa) => [ + q(3199), + q(0), + ], + q(kafoa) => [ + q(3538), + q(0), + ], + q(kagan kalagan) => [ + q(3437), + q(0), + ], + q(kagate) => [ + q(6332), + q(0), + ], + q(kagayanen) => [ + q(1713), + q(0), + ], + q(kagoma) => [ + q(3245), + q(0), + ], + q(kagoro) => [ + q(7361), + q(0), + ], + q(kagulu) => [ + q(3408), + q(0), + ], + q(kahe) => [ + q(2764), + q(0), + ], + q(kahua) => [ + q(0674), + q(0), + ], + q(kaian) => [ + q(3227), + q(0), + ], + q(kaibobo) => [ + q(3762), + q(0), + ], + q(kaidipang) => [ + q(3774), + q(0), + ], + q(kaiep) => [ + q(3204), + q(0), + ], + q(kaikadi) => [ + q(3271), + q(0), + ], + q(kaikavian literary language) => [ + q(3396), + q(0), + ], + q(kaike) => [ + q(3775), + q(0), + ], + q(kaiku) => [ + q(3416), + q(0), + ], + q(kaimbe) => [ + q(7265), + q(0), + ], + q(kaimbulawa) => [ + q(7843), + q(0), + ], + q(kaingang) => [ + q(3320), + q(0), + ], + q(kairak) => [ + q(1758), + q(0), + ], + q(kairiru) => [ + q(3711), + q(0), + ], + q(kairui-midiki) => [ + q(3572), + q(0), + ], + q(kais) => [ + q(3771), + q(0), + ], + q(kaivi) => [ + q(3212), + q(0), + ], + q(kaiwa) => [ + q(3315), + q(0), + ], + q(kaiy) => [ + q(6409), + q(0), + ], + q(kajakse) => [ + q(1757), + q(0), + ], + q(kajali) => [ + q(7363), + q(0), + ], + q(kajaman) => [ + q(3173), + q(0), + ], + q(kakabai) => [ + q(3549), + q(0), + ], + q(kakabe) => [ + q(3404), + q(0), + ], + q(kakanda) => [ + q(3400), + q(0), + ], + q(kaki ae) => [ + q(6372), + q(0), + ], + q(kako) => [ + q(3409), + q(0), + ], + q(kakwa) => [ + q(3270), + q(0), + ], + q(kala) => [ + q(3219), + q(1), + ], + q(kala lagaw ya) => [ + q(4630), + q(0), + ], + q(kalaallisut) => [ + q(0212), + q(0), + ], + q(kalaamaya) => [ + q(3939), + q(0), + ], + q(kalabakan) => [ + q(3665), + q(0), + ], + q(kalabari) => [ + q(2934), + q(0), + ], + q(kalabra) => [ + q(3783), + q(0), + ], + q(kalagan) => [ + q(3548), + q(0), + ], + q(kalaktang monpa) => [ + q(3405), + q(0), + ], + q(kalam) => [ + q(3458), + q(0), + ], + q(kalami) => [ + q(2678), + q(0), + ], + q(kalamse) => [ + q(3501), + q(0), + ], + q(kalanadi) => [ + q(7134), + q(0), + ], + q(kalanga) => [ + q(3218), + q(0), + ], + q(kalanguya) => [ + q(3177), + q(0), + ], + q(kalao) => [ + q(3450), + q(0), + ], + q(kalapuya) => [ + q(3746), + q(0), + ], + q(kalarko) => [ + q(3184), + q(0), + ], + q(kalasha) => [ + q(3444), + q(0), + ], + q(kalenjin) => [ + q(3439), + q(0), + ], + q(kalispel-pend d'oreille) => [ + q(2350), + q(0), + ], + q(kalkoti) => [ + q(7355), + q(0), + ], + q(kalkutung) => [ + q(3621), + q(0), + ], + q(kalmyk) => [ + q(0471), + q(0), + ], + q(kalo finnish romani) => [ + q(5800), + q(0), + ], + q(kalou) => [ + q(7770), + q(0), + ], + q(kaluli) => [ + q(1079), + q(0), + ], + q(kalumpang) => [ + q(3434), + q(0), + ], + q(kam) => [ + q(3253), + q(0), + ], + q(kamakan) => [ + q(6996), + q(0), + ], + q(kamang) => [ + q(7189), + q(0), + ], + q(kamano) => [ + q(3198), + q(0), + ], + q(kamantan) => [ + q(3216), + q(0), + ], + q(kamar) => [ + q(3272), + q(0), + ], + q(kamara) => [ + q(3122), + q(0), + ], + q(kamarian) => [ + q(3781), + q(0), + ], + q(kamaru) => [ + q(3328), + q(0), + ], + q(kamas) => [ + q(7274), + q(0), + ], + q(kamasa) => [ + q(3441), + q(0), + ], + q(kamasau) => [ + q(3469), + q(0), + ], + q(kamayo) => [ + q(3745), + q(0), + ], + q(kamayura) => [ + q(3183), + q(0), + ], + q(kamba) => [ + q(0213), + q(0), + ], + q(kamba (kenya)) => [ + q(0213), + q(1), + ], + q(kambaata) => [ + q(3616), + q(0), + ], + q(kambaira) => [ + q(3759), + q(0), + ], + q(kambera) => [ + q(7291), + q(0), + ], + q(kamberau) => [ + q(2992), + q(0), + ], + q(kambiwa) => [ + q(7292), + q(0), + ], + q(kami (nigeria)) => [ + q(3459), + q(0), + ], + q(kami (tanzania)) => [ + q(3228), + q(0), + ], + q(kamo) => [ + q(3224), + q(0), + ], + q(kamoro) => [ + q(3321), + q(0), + ], + q(kamta) => [ + q(5793), + q(1), + ], + q(kamu) => [ + q(7411), + q(0), + ], + q(kamula) => [ + q(7379), + q(0), + ], + q(kamviri) => [ + q(7529), + q(0), + ], + q(kamwe) => [ + q(2754), + q(0), + ], + q(kanakanabu) => [ + q(7418), + q(0), + ], + q(kanamari) => [ + q(3488), + q(0), + ], + q(kanan) => [ + q(7849), + q(0), + ], + q(kanashi) => [ + q(7426), + q(0), + ], + q(kanasi) => [ + q(6158), + q(0), + ], + q(kanauji) => [ + q(1239), + q(0), + ], + q(kandas) => [ + q(3566), + q(0), + ], + q(kandawo) => [ + q(2407), + q(0), + ], + q(kande) => [ + q(3200), + q(0), + ], + q(kanembu) => [ + q(3193), + q(0), + ], + q(kang) => [ + q(3750), + q(0), + ], + q(kanga) => [ + q(3223), + q(0), + ], + q(kangean) => [ + q(3421), + q(0), + ], + q(kanggape) => [ + q(2921), + q(0), + ], + q(kangjia) => [ + q(3727), + q(0), + ], + q(kango (bas-uele district)) => [ + q(3638), + q(0), + ], + q(kango (tshopo district)) => [ + q(3782), + q(0), + ], + q(kangri) => [ + q(7425), + q(0), + ], + q(kaniet) => [ + q(3625), + q(0), + ], + q(kanikkaran) => [ + q(3277), + q(0), + ], + q(kaningdon-nindem) => [ + q(3247), + q(0), + ], + q(kaningi) => [ + q(3773), + q(0), + ], + q(kaningra) => [ + q(3493), + q(0), + ], + q(kaninuwa) => [ + q(7056), + q(0), + ], + q(kanite) => [ + q(3471), + q(0), + ], + q(kanjari) => [ + q(3301), + q(0), + ], + q(kanjobal) => [ + q(3376), + q(1), + ], + q(kanju) => [ + q(3187), + q(0), + ], + q(kankanaey) => [ + q(3481), + q(0), + ], + q(kannada) => [ + q(0214), + q(0), + ], + q(kannada kurumba) => [ + q(3290), + q(0), + ], + q(kanoe) => [ + q(3723), + q(0), + ], + q(kanowit-tanjong melanau) => [ + q(3722), + q(0), + ], + q(kansa) => [ + q(3599), + q(0), + ], + q(kantosi) => [ + q(7372), + q(0), + ], + q(kanu) => [ + q(3349), + q(0), + ], + q(kanufi) => [ + q(3484), + q(0), + ], + q(kanuri) => [ + q(0217), + q(0), + ], + q(kanyok) => [ + q(3500), + q(0), + ], + q(kao) => [ + q(3182), + q(0), + ], + q(kaonde) => [ + q(3557), + q(0), + ], + q(kap) => [ + q(7654), + q(0), + ], + q(kapampangan) => [ + q(0338), + q(1), + ], + q(kapauri) => [ + q(3341), + q(1), + ], + q(kapin) => [ + q(6391), + q(0), + ], + q(kapinawa) => [ + q(7450), + q(0), + ], + q(kapingamarangi) => [ + q(3525), + q(0), + ], + q(kapori) => [ + q(3341), + q(0), + ], + q(kapriman) => [ + q(2065), + q(0), + ], + q(kaptiau) => [ + q(3190), + q(0), + ], + q(kapya) => [ + q(3440), + q(0), + ], + q(kaqchikel) => [ + q(1646), + q(0), + ], + q(kara (central african republic)) => [ + q(3174), + q(0), + ], + q(kara (korea)) => [ + q(7926), + q(0), + ], + q(kara (papua new guinea)) => [ + q(3870), + q(0), + ], + q(kara (tanzania)) => [ + q(5758), + q(0), + ], + q(kara-kalpak) => [ + q(0209), + q(0), + ], + q(karachay-balkar) => [ + q(0235), + q(0), + ], + q(karadjeri) => [ + q(2420), + q(0), + ], + q(karagas) => [ + q(3363), + q(0), + ], + q(karaim) => [ + q(3249), + q(0), + ], + q(karaja) => [ + q(3528), + q(0), + ], + q(karakhanid) => [ + q(7459), + q(0), + ], + q(karami) => [ + q(7273), + q(0), + ], + q(karamojong) => [ + q(3242), + q(0), + ], + q(karang) => [ + q(3776), + q(0), + ], + q(karanga) => [ + q(3622), + q(0), + ], + q(karankawa) => [ + q(7848), + q(0), + ], + q(karao) => [ + q(3744), + q(0), + ], + q(karas) => [ + q(3326), + q(0), + ], + q(karata) => [ + q(3537), + q(0), + ], + q(karawa) => [ + q(7473), + q(0), + ], + q(karbi) => [ + q(4333), + q(0), + ], + q(kare (central african republic)) => [ + q(3195), + q(0), + ], + q(kare (papua new guinea)) => [ + q(3456), + q(0), + ], + q(karekare) => [ + q(3175), + q(0), + ], + q(karelian) => [ + q(0236), + q(0), + ], + q(karen languages) => [ + q(0215), + q(0), + ], + q(karenggapa) => [ + q(2208), + q(0), + ], + q(karey) => [ + q(3738), + q(0), + ], + q(kari) => [ + q(3191), + q(0), + ], + q(karingani) => [ + q(3318), + q(0), + ], + q(karipuna) => [ + q(3317), + q(0), + ], + q(karipuna creole french) => [ + q(3472), + q(0), + ], + q(kariri-xoco) => [ + q(3780), + q(0), + ], + q(karitiana) => [ + q(3628), + q(0), + ], + q(kariya) => [ + q(3362), + q(0), + ], + q(kariyarra) => [ + q(6991), + q(0), + ], + q(karkar-yuri) => [ + q(7755), + q(0), + ], + q(karkin) => [ + q(3571), + q(0), + ], + q(karko) => [ + q(3414), + q(0), + ], + q(karnai) => [ + q(1060), + q(0), + ], + q(karo (brazil)) => [ + q(0879), + q(0), + ], + q(karo (ethiopia)) => [ + q(3716), + q(0), + ], + q(karok) => [ + q(3742), + q(0), + ], + q(karon) => [ + q(3586), + q(0), + ], + q(karon dori) => [ + q(3327), + q(0), + ], + q(karore) => [ + q(7376), + q(0), + ], + q(karranga) => [ + q(7469), + q(0), + ], + q(karuwali) => [ + q(5871), + q(0), + ], + q(kasanga) => [ + q(1683), + q(0), + ], + q(kasem) => [ + q(7482), + q(0), + ], + q(kashaya) => [ + q(3395), + q(0), + ], + q(kashmiri) => [ + q(0216), + q(0), + ], + q(kashubian) => [ + q(0100), + q(0), + ], + q(kasiguranin) => [ + q(3602), + q(0), + ], + q(kaska) => [ + q(3425), + q(0), + ], + q(kaskean) => [ + q(7933), + q(0), + ], + q(kasua) => [ + q(3344), + q(0), + ], + q(katabaga) => [ + q(3631), + q(0), + ], + q(katawixi) => [ + q(7275), + q(0), + ], + q(katbol) => [ + q(6575), + q(0), + ], + q(katcha-kadugli-miri) => [ + q(7494), + q(0), + ], + q(kate) => [ + q(3457), + q(0), + ], + q(kathoriya tharu) => [ + q(6547), + q(0), + ], + q(kathu) => [ + q(7658), + q(0), + ], + q(kati) => [ + q(1453), + q(0), + ], + q(katkari) => [ + q(3302), + q(0), + ], + q(katla) => [ + q(3225), + q(0), + ], + q(kato) => [ + q(3636), + q(0), + ], + q(katso) => [ + q(3172), + q(0), + ], + q(katua) => [ + q(3615), + q(0), + ], + q(katukina) => [ + q(3181), + q(0), + ], + q(kaulong) => [ + q(5615), + q(0), + ], + q(kaur) => [ + q(6994), + q(0), + ], + q(kaure) => [ + q(1387), + q(0), + ], + q(kaurna) => [ + q(7854), + q(0), + ], + q(kauwera) => [ + q(7276), + q(0), + ], + q(kavalan) => [ + q(1762), + q(0), + ], + q(kavet) => [ + q(3584), + q(0), + ], + q(kawacha) => [ + q(3209), + q(0), + ], + q(kawaiisu) => [ + q(7278), + q(0), + ], + q(kawe) => [ + q(3309), + q(0), + ], + q(kawi) => [ + q(0218), + q(0), + ], + q(kaxarari) => [ + q(3637), + q(0), + ], + q(kaxuiana) => [ + q(3185), + q(0), + ], + q(kayabi) => [ + q(3760), + q(0), + ], + q(kayagar) => [ + q(3754), + q(0), + ], + q(kayan) => [ + q(5399), + q(0), + ], + q(kayan mahakam) => [ + q(7279), + q(0), + ], + q(kayan river kayan) => [ + q(7366), + q(0), + ], + q(kayapa kallahan) => [ + q(3177), + q(1), + ], + q(kayapo) => [ + q(6811), + q(0), + ], + q(kayardild) => [ + q(2694), + q(0), + ], + q(kayaw) => [ + q(3672), + q(0), + ], + q(kayeli) => [ + q(3770), + q(0), + ], + q(kayong) => [ + q(3733), + q(0), + ], + q(kayort) => [ + q(3756), + q(0), + ], + q(kaytetye) => [ + q(2419), + q(0), + ], + q(kayupulau) => [ + q(3778), + q(0), + ], + q(kazakh) => [ + q(0219), + q(0), + ], + q(kazukuru) => [ + q(3769), + q(0), + ], + q(ke'o) => [ + q(7546), + q(0), + ], + q(keak) => [ + q(3263), + q(0), + ], + q(keapara) => [ + q(3351), + q(0), + ], + q(kedah malay) => [ + q(4206), + q(0), + ], + q(kedang) => [ + q(3612), + q(0), + ], + q(keder) => [ + q(3254), + q(0), + ], + q(kehu) => [ + q(3336), + q(0), + ], + q(kei) => [ + q(3264), + q(0), + ], + q(keiga) => [ + q(3258), + q(0), + ], + q(keijar) => [ + q(3254), + q(1), + ], + q(kein) => [ + q(1310), + q(0), + ], + q(keiyo) => [ + q(2316), + q(0), + ], + q(kekchi) => [ + q(3266), + q(0), + ], + q(kela (democratic republic of congo)) => [ + q(3267), + q(0), + ], + q(kela (papua new guinea)) => [ + q(3219), + q(0), + ], + q(kelabit) => [ + q(3768), + q(0), + ], + q(kele) => [ + q(3257), + q(0), + ], + q(kele (democratic republic of congo)) => [ + q(3350), + q(0), + ], + q(kele (papua new guinea)) => [ + q(5894), + q(0), + ], + q(kelengazxo bozo) => [ + q(1635), + q(0), + ], + q(keley-i kallahan) => [ + q(2916), + q(0), + ], + q(keliko) => [ + q(3196), + q(0), + ], + q(kelo) => [ + q(7318), + q(0), + ], + q(kelon) => [ + q(3749), + q(0), + ], + q(kemak) => [ + q(3268), + q(0), + ], + q(kembayan) => [ + q(7319), + q(0), + ], + q(kemberano) => [ + q(1627), + q(0), + ], + q(kembra) => [ + q(7375), + q(0), + ], + q(kemedzung) => [ + q(2085), + q(0), + ], + q(kemi sami) => [ + q(6051), + q(0), + ], + q(kemiehua) => [ + q(3291), + q(0), + ], + q(kemtuik) => [ + q(3470), + q(0), + ], + q(kenaboi) => [ + q(7288), + q(0), + ], + q(kenati) => [ + q(2414), + q(0), + ], + q(kendayan) => [ + q(3499), + q(0), + ], + q(kendeje) => [ + q(3431), + q(0), + ], + q(kendem) => [ + q(3673), + q(0), + ], + q(kenga) => [ + q(3751), + q(0), + ], + q(keningau murut) => [ + q(3717), + q(0), + ], + q(keninjal) => [ + q(3487), + q(0), + ], + q(kensiu) => [ + q(3494), + q(0), + ], + q(kenswei nsei) => [ + q(4778), + q(0), + ], + q(kenyan sign language) => [ + q(7362), + q(0), + ], + q(kenyang) => [ + q(3269), + q(0), + ], + q(kenyi) => [ + q(3934), + q(0), + ], + q(kenzi) => [ + q(7430), + q(0), + ], + q(keoru-ahia) => [ + q(7324), + q(0), + ], + q(kepkiriwat) => [ + q(3532), + q(0), + ], + q(kepo') => [ + q(3649), + q(0), + ], + q(kera) => [ + q(3273), + q(0), + ], + q(kerak) => [ + q(2748), + q(0), + ], + q(kereho) => [ + q(7359), + q(0), + ], + q(kerek) => [ + q(3578), + q(0), + ], + q(kerewe) => [ + q(3259), + q(0), + ], + q(kerewo) => [ + q(3734), + q(0), + ], + q(kerinci) => [ + q(3678), + q(0), + ], + q(kesawai) => [ + q(7322), + q(0), + ], + q(ket) => [ + q(3275), + q(0), + ], + q(ketangalan) => [ + q(3171), + q(0), + ], + q(kete) => [ + q(3229), + q(0), + ], + q(ketengban) => [ + q(7496), + q(0), + ], + q(ketum) => [ + q(3633), + q(0), + ], + q(keyagana) => [ + q(3741), + q(0), + ], + q(kgalagadi) => [ + q(7374), + q(0), + ], + q(khakas) => [ + q(3382), + q(0), + ], + q(khalaj) => [ + q(3380), + q(0), + ], + q(khaling) => [ + q(3443), + q(0), + ], + q(khamba) => [ + q(3188), + q(0), + ], + q(khams tibetan) => [ + q(3335), + q(0), + ], + q(khamti) => [ + q(3345), + q(0), + ], + q(khamyang) => [ + q(3609), + q(0), + ], + q(khana) => [ + q(5207), + q(0), + ], + q(khandesi) => [ + q(3340), + q(0), + ], + q(khang) => [ + q(3387), + q(0), + ], + q(khanty) => [ + q(3208), + q(0), + ], + q(khao) => [ + q(7270), + q(0), + ], + q(kharam naga) => [ + q(3304), + q(0), + ], + q(kharia) => [ + q(3343), + q(0), + ], + q(kharia thar) => [ + q(3613), + q(0), + ], + q(khasi) => [ + q(0221), + q(0), + ], + q(khayo) => [ + q(3941), + q(0), + ], + q(khazar) => [ + q(7856), + q(0), + ], + q(khe) => [ + q(3550), + q(0), + ], + q(khehek) => [ + q(6572), + q(0), + ], + q(khengkha) => [ + q(7360), + q(0), + ], + q(khetrani) => [ + q(7340), + q(0), + ], + q(khezha naga) => [ + q(4922), + q(0), + ], + q(khiamniungan naga) => [ + q(3372), + q(0), + ], + q(khinalugh) => [ + q(3384), + q(0), + ], + q(khirwar) => [ + q(3708), + q(0), + ], + q(khisa) => [ + q(3556), + q(0), + ], + q(khlor) => [ + q(3961), + q(0), + ], + q(khlula) => [ + q(7653), + q(0), + ], + q(khmu) => [ + q(3381), + q(0), + ], + q(kho'ini) => [ + q(7357), + q(0), + ], + q(khoekhoe) => [ + q(4724), + q(0), + ], + q(khoibu naga) => [ + q(4916), + q(0), + ], + q(khoisan languages) => [ + q(0222), + q(0), + ], + q(kholok) => [ + q(3617), + q(0), + ], + q(khonso) => [ + q(3713), + q(1), + ], + q(khorasani turkish) => [ + q(3476), + q(0), + ], + q(khorezmian) => [ + q(7847), + q(0), + ], + q(khotanese) => [ + q(0224), + q(0), + ], + q(khowar) => [ + q(3348), + q(0), + ], + q(khua) => [ + q(7344), + q(0), + ], + q(khuen) => [ + q(3334), + q(0), + ], + q(khumi chin) => [ + q(1798), + q(0), + ], + q(khun) => [ + q(3407), + q(0), + ], + q(khunsari) => [ + q(3294), + q(0), + ], + q(khvarshi) => [ + q(3347), + q(0), + ], + q(khwedam) => [ + q(7527), + q(1), + ], + q(kibala) => [ + q(1298), + q(0), + ], + q(kibet) => [ + q(3356), + q(0), + ], + q(kibiri) => [ + q(5590), + q(0), + ], + q(kickapoo) => [ + q(3354), + q(0), + ], + q(kiembu) => [ + q(2213), + q(1), + ], + q(kigiryama) => [ + q(5155), + q(1), + ], + q(kikai) => [ + q(3767), + q(0), + ], + q(kikuyu) => [ + q(0225), + q(0), + ], + q(kildin sami) => [ + q(6048), + q(0), + ], + q(kilivila) => [ + q(3361), + q(0), + ], + q(kiliwa) => [ + q(3427), + q(0), + ], + q(kilmeri) => [ + q(3359), + q(0), + ], + q(kim) => [ + q(3352), + q(0), + ], + q(kim mun) => [ + q(4319), + q(0), + ], + q(kimaama) => [ + q(3358), + q(0), + ], + q(kimaghima) => [ + q(3358), + q(1), + ], + q(kimaragang) => [ + q(3561), + q(0), + ], + q(kimbu) => [ + q(3370), + q(0), + ], + q(kimbundu) => [ + q(0228), + q(0), + ], + q(kimki) => [ + q(5911), + q(0), + ], + q(kimre) => [ + q(3559), + q(0), + ], + q(kinabalian) => [ + q(1675), + q(0), + ], + q(kinalakna) => [ + q(3222), + q(0), + ], + q(kinamiging manobo) => [ + q(4358), + q(0), + ], + q(kinaray-a) => [ + q(3577), + q(0), + ], + q(kinga) => [ + q(7824), + q(0), + ], + q(kinnauri) => [ + q(3292), + q(0), + ], + q(kintaq) => [ + q(3492), + q(0), + ], + q(kinuku) => [ + q(3403), + q(0), + ], + q(kinyarwanda) => [ + q(0226), + q(0), + ], + q(kioko) => [ + q(6852), + q(0), + ], + q(kiong) => [ + q(3412), + q(0), + ], + q(kiorr) => [ + q(7367), + q(0), + ], + q(kiowa) => [ + q(3364), + q(0), + ], + q(kiowa apache) => [ + q(0844), + q(0), + ], + q(kipfokomo) => [ + q(5472), + q(1), + ], + q(kipsigis) => [ + q(5983), + q(0), + ], + q(kiput) => [ + q(3743), + q(0), + ], + q(kir-balar) => [ + q(3417), + q(0), + ], + q(kirdki) => [ + q(0487), + q(3), + ], + q(kire) => [ + q(2472), + q(0), + ], + q(kirghiz) => [ + q(0227), + q(0), + ], + q(kirike) => [ + q(5233), + q(0), + ], + q(kirikiri) => [ + q(3373), + q(0), + ], + q(kirmanjki) => [ + q(0487), + q(4), + ], + q(kirmanjki (individual language)) => [ + q(3369), + q(0), + ], + q(kirmanjki (macrolanguage)) => [ + q(0487), + q(7), + ], + q(kirya-konzel) => [ + q(2348), + q(0), + ], + q(kis) => [ + q(3367), + q(0), + ], + q(kisa) => [ + q(3943), + q(0), + ], + q(kisan) => [ + q(7350), + q(0), + ], + q(kisankasa) => [ + q(3551), + q(0), + ], + q(kisar) => [ + q(3379), + q(0), + ], + q(kisi) => [ + q(3374), + q(0), + ], + q(kistane) => [ + q(2624), + q(0), + ], + q(kiswahili) => [ + q(6292), + q(1), + ], + q(kita maninkakan) => [ + q(4626), + q(0), + ], + q(kitan) => [ + q(7853), + q(0), + ], + q(kitharaka) => [ + q(6491), + q(1), + ], + q(kitja) => [ + q(2510), + q(0), + ], + q(kitsai) => [ + q(3360), + q(0), + ], + q(kituba (congo)) => [ + q(4357), + q(0), + ], + q(kituba (democratic republic of congo)) => [ + q(3634), + q(0), + ], + q(kiunum) => [ + q(7092), + q(0), + ], + q(kiwilwana) => [ + q(4369), + q(1), + ], + q(kla-dan) => [ + q(3837), + q(0), + ], + q(klamath-modoc) => [ + q(3426), + q(0), + ], + q(klao) => [ + q(3446), + q(0), + ], + q(klias river kadazan) => [ + q(3563), + q(0), + ], + q(klingon) => [ + q(0433), + q(0), + ], + q(knaanic) => [ + q(1928), + q(0), + ], + q(ko) => [ + q(2385), + q(0), + ], + q(koalib) => [ + q(3353), + q(0), + ], + q(koasati) => [ + q(1761), + q(0), + ], + q(koba) => [ + q(3523), + q(0), + ], + q(kobiana) => [ + q(3217), + q(0), + ], + q(kobol) => [ + q(3325), + q(0), + ], + q(kobon) => [ + q(3540), + q(0), + ], + q(koch) => [ + q(3248), + q(0), + ], + q(kochila tharu) => [ + q(6496), + q(0), + ], + q(koda) => [ + q(1702), + q(0), + ], + q(kodaku) => [ + q(3614), + q(0), + ], + q(kodava) => [ + q(3282), + q(0), + ], + q(kodeoha) => [ + q(6997), + q(0), + ], + q(kodi) => [ + q(3504), + q(0), + ], + q(kodia) => [ + q(3701), + q(0), + ], + q(koenoem) => [ + q(3226), + q(0), + ], + q(kofa) => [ + q(3603), + q(0), + ], + q(kofei) => [ + q(3527), + q(0), + ], + q(kofyar) => [ + q(3697), + q(0), + ], + q(kogi) => [ + q(3507), + q(1), + ], + q(koguryo) => [ + q(7846), + q(0), + ], + q(kohin) => [ + q(3423), + q(0), + ], + q(kohistani shina) => [ + q(5491), + q(0), + ], + q(koho) => [ + q(3531), + q(0), + ], + q(kohumono) => [ + q(1083), + q(0), + ], + q(koi) => [ + q(3419), + q(0), + ], + q(koibal) => [ + q(7844), + q(0), + ], + q(koireng) => [ + q(4918), + q(0), + ], + q(koitabu) => [ + q(3552), + q(0), + ], + q(koiwat) => [ + q(3728), + q(0), + ], + q(kok borok) => [ + q(6686), + q(0), + ], + q(kok-nar) => [ + q(2538), + q(0), + ], + q(kokata) => [ + q(3618), + q(0), + ], + q(koke) => [ + q(3515), + q(0), + ], + q(koki naga) => [ + q(5142), + q(0), + ], + q(koko babangk) => [ + q(5224), + q(0), + ], + q(kokoda) => [ + q(7432), + q(0), + ], + q(kokola) => [ + q(3772), + q(0), + ], + q(kokota) => [ + q(3410), + q(0), + ], + q(kol) => [ + q(2233), + q(1), + ], + q(kol (bangladesh)) => [ + q(2233), + q(0), + ], + q(kol (cameroon)) => [ + q(1227), + q(0), + ], + q(kol (papua new guinea)) => [ + q(3510), + q(0), + ], + q(kola) => [ + q(3681), + q(0), + ], + q(kolbila) => [ + q(3428), + q(0), + ], + q(kolibugan subanon) => [ + q(6073), + q(0), + ], + q(kolsch) => [ + q(3596), + q(0), + ], + q(koluwawa) => [ + q(3449), + q(0), + ], + q(kom (cameroon)) => [ + q(1265), + q(0), + ], + q(kom (india)) => [ + q(3463), + q(0), + ], + q(koma) => [ + q(3475), + q(0), + ], + q(komba) => [ + q(3524), + q(0), + ], + q(kombai) => [ + q(6820), + q(0), + ], + q(kombio) => [ + q(7285), + q(0), + ], + q(komering) => [ + q(3310), + q(0), + ], + q(komi) => [ + q(0230), + q(0), + ], + q(komi-permyak) => [ + q(3509), + q(0), + ], + q(komi-zyrian) => [ + q(3539), + q(0), + ], + q(kominimung) => [ + q(7434), + q(0), + ], + q(komo (democratic republic of congo)) => [ + q(3473), + q(0), + ], + q(komo (sudan)) => [ + q(7436), + q(0), + ], + q(komodo) => [ + q(3668), + q(0), + ], + q(kompane) => [ + q(3676), + q(0), + ], + q(komyandaret) => [ + q(3779), + q(0), + ], + q(kon keu) => [ + q(3413), + q(0), + ], + q(konabere) => [ + q(1053), + q(1), + ], + q(konai) => [ + q(3731), + q(0), + ], + q(konda) => [ + q(3480), + q(0), + ], + q(konda-dora) => [ + q(3284), + q(0), + ], + q(koneraw) => [ + q(3252), + q(0), + ], + q(kongo) => [ + q(0231), + q(0), + ], + q(konkani) => [ + q(0229), + q(0), + ], + q(konkani (individual language)) => [ + q(3489), + q(0), + ], + q(konkani (macrolanguage)) => [ + q(0229), + q(1), + ], + q(konkomba) => [ + q(7437), + q(0), + ], + q(konni) => [ + q(3452), + q(0), + ], + q(kono (guinea)) => [ + q(3496), + q(0), + ], + q(kono (nigeria)) => [ + q(3436), + q(0), + ], + q(kono (sierra leone)) => [ + q(3490), + q(0), + ], + q(konomala) => [ + q(3502), + q(0), + ], + q(konongo) => [ + q(3233), + q(0), + ], + q(konso) => [ + q(3713), + q(0), + ], + q(konyak naga) => [ + q(4736), + q(0), + ], + q(konyanka maninka) => [ + q(4355), + q(0), + ], + q(konzo) => [ + q(3511), + q(0), + ], + q(koongo) => [ + q(3483), + q(0), + ], + q(koonzime) => [ + q(5341), + q(0), + ], + q(koorete) => [ + q(3568), + q(0), + ], + q(kopar) => [ + q(7439), + q(0), + ], + q(kopkaka) => [ + q(5284), + q(0), + ], + q(korafe-yegha) => [ + q(3535), + q(0), + ], + q(korak) => [ + q(3519), + q(0), + ], + q(korana) => [ + q(3569), + q(0), + ], + q(korandje) => [ + q(3232), + q(0), + ], + q(kordofanian languages) => [ + q(0516), + q(0), + ], + q(korean) => [ + q(0232), + q(0), + ], + q(korean sign language) => [ + q(3671), + q(0), + ], + q(koreguaje) => [ + q(1810), + q(0), + ], + q(koresh-e rostam) => [ + q(5225), + q(0), + ], + q(korku) => [ + q(3298), + q(0), + ], + q(korlai creole portuguese) => [ + q(6998), + q(0), + ], + q(koro (cote d'ivoire)) => [ + q(3296), + q(0), + ], + q(koro (india)) => [ + q(3111), + q(0), + ], + q(koro (papua new guinea)) => [ + q(3726), + q(0), + ], + q(koro (vanuatu)) => [ + q(3574), + q(0), + ], + q(koro wachi) => [ + q(1418), + q(0), + ], + q(koromfe) => [ + q(3307), + q(0), + ], + q(koromira) => [ + q(3553), + q(0), + ], + q(koronadal blaan) => [ + q(1389), + q(0), + ], + q(koroni) => [ + q(7369), + q(0), + ], + q(korop) => [ + q(3580), + q(0), + ], + q(koropo) => [ + q(7548), + q(0), + ], + q(koroshi) => [ + q(3626), + q(0), + ], + q(korowai) => [ + q(3333), + q(0), + ], + q(korra koraga) => [ + q(3285), + q(0), + ], + q(korubo) => [ + q(7440), + q(0), + ], + q(korupun-sela) => [ + q(3534), + q(0), + ], + q(korur) => [ + q(0948), + q(1), + ], + q(korwa) => [ + q(3297), + q(0), + ], + q(koryak) => [ + q(3542), + q(0), + ], + q(kosadle) => [ + q(3366), + q(0), + ], + q(kosare) => [ + q(3366), + q(1), + ], + q(kosarek yale) => [ + q(3411), + q(0), + ], + q(kosena) => [ + q(3765), + q(0), + ], + q(koshin) => [ + q(3355), + q(0), + ], + q(kosli) => [ + q(6184), + q(1), + ], + q(kosraean) => [ + q(0233), + q(0), + ], + q(kota (gabon)) => [ + q(3513), + q(0), + ], + q(kota (india)) => [ + q(3286), + q(0), + ], + q(kota bangun kutai malay) => [ + q(4479), + q(0), + ], + q(kota marudu talantang) => [ + q(2618), + q(0), + ], + q(kotafon gbe) => [ + q(3554), + q(0), + ], + q(kotava) => [ + q(0959), + q(0), + ], + q(koti) => [ + q(2235), + q(0), + ], + q(kott) => [ + q(7850), + q(0), + ], + q(kouya) => [ + q(3740), + q(0), + ], + q(kovai) => [ + q(3545), + q(0), + ], + q(kove) => [ + q(3663), + q(0), + ], + q(kowaki) => [ + q(7441), + q(0), + ], + q(kowiai) => [ + q(3693), + q(0), + ], + q(koy sanjaq surat) => [ + q(3547), + q(0), + ], + q(koya) => [ + q(3287), + q(0), + ], + q(koyaga) => [ + q(3308), + q(0), + ], + q(koyo) => [ + q(3508), + q(0), + ], + q(koyra chiini songhay) => [ + q(3342), + q(0), + ], + q(koyraboro senni songhai) => [ + q(5970), + q(0), + ], + q(koyukon) => [ + q(3518), + q(0), + ], + q(kpagua) => [ + q(3657), + q(0), + ], + q(kpala) => [ + q(3530), + q(0), + ], + q(kpan) => [ + q(3529), + q(0), + ], + q(kpasam) => [ + q(5368), + q(0), + ], + q(kpati) => [ + q(3503), + q(0), + ], + q(kpatili) => [ + q(3747), + q(0), + ], + q(kpeego) => [ + q(1833), + q(0), + ], + q(kpelle) => [ + q(0234), + q(0), + ], + q(kpessi) => [ + q(3261), + q(0), + ], + q(kplang) => [ + q(3526), + q(0), + ], + q(krache) => [ + q(3739), + q(0), + ], + q(kraho) => [ + q(7461), + q(0), + ], + q(kraol) => [ + q(5788), + q(0), + ], + q(krenak) => [ + q(3560), + q(0), + ], + q(krevinian) => [ + q(7855), + q(0), + ], + q(kreye) => [ + q(7464), + q(0), + ], + q(kriang) => [ + q(4846), + q(0), + ], + q(krikati-timbira) => [ + q(7466), + q(0), + ], + q(krio) => [ + q(3576), + q(0), + ], + q(kriol) => [ + q(5834), + q(0), + ], + q(krisa) => [ + q(3597), + q(0), + ], + q(krobu) => [ + q(3712), + q(0), + ], + q(krongo) => [ + q(3319), + q(0), + ], + q(kru languages) => [ + q(0237), + q(0), + ], + q(krung) => [ + q(3581), + q(0), + ], + q(krymchak) => [ + q(3069), + q(0), + ], + q(kryts) => [ + q(3587), + q(0), + ], + q(kua) => [ + q(6825), + q(0), + ], + q(kua-nsi) => [ + q(7655), + q(0), + ], + q(kuamasi) => [ + q(7659), + q(0), + ], + q(kuan) => [ + q(6837), + q(0), + ], + q(kuanhua) => [ + q(7420), + q(0), + ], + q(kuanua) => [ + q(3592), + q(0), + ], + q(kuanyama) => [ + q(0239), + q(0), + ], + q(kube) => [ + q(3311), + q(0), + ], + q(kubi) => [ + q(3506), + q(0), + ], + q(kubo) => [ + q(3109), + q(0), + ], + q(kubu) => [ + q(3662), + q(0), + ], + q(kucong) => [ + q(3932), + q(0), + ], + q(kudiya) => [ + q(3288), + q(0), + ], + q(kudmali) => [ + q(3757), + q(0), + ], + q(kudu-camo) => [ + q(3516), + q(0), + ], + q(kugama) => [ + q(3517), + q(0), + ], + q(kugbo) => [ + q(3274), + q(0), + ], + q(kui (india)) => [ + q(3729), + q(0), + ], + q(kui (indonesia)) => [ + q(3664), + q(0), + ], + q(kuijau) => [ + q(2069), + q(0), + ], + q(kuikuro-kalapalo) => [ + q(3647), + q(0), + ], + q(kujarge) => [ + q(6993), + q(0), + ], + q(kuk) => [ + q(3295), + q(0), + ], + q(kukatja) => [ + q(3658), + q(0), + ], + q(kuke) => [ + q(2509), + q(0), + ], + q(kukele) => [ + q(3281), + q(0), + ], + q(kukna) => [ + q(3279), + q(0), + ], + q(kuku-mangk) => [ + q(7407), + q(0), + ], + q(kuku-mu'inh) => [ + q(7406), + q(0), + ], + q(kuku-muminh) => [ + q(7399), + q(0), + ], + q(kuku-ugbanh) => [ + q(6854), + q(0), + ], + q(kuku-uwanh) => [ + q(6951), + q(0), + ], + q(kuku-yalanji) => [ + q(2670), + q(0), + ], + q(kula) => [ + q(6644), + q(0), + ], + q(kulere) => [ + q(3650), + q(0), + ], + q(kulfa) => [ + q(3718), + q(0), + ], + q(kulina) => [ + q(1906), + q(1), + ], + q(kulina pano) => [ + q(7448), + q(0), + ], + q(kulisusu) => [ + q(6995), + q(0), + ], + q(kullu pahari) => [ + q(3305), + q(0), + ], + q(kulon-pazeh) => [ + q(6945), + q(0), + ], + q(kulung (nepal)) => [ + q(3430), + q(0), + ], + q(kulung (nigeria)) => [ + q(1059), + q(0), + ], + q(kumalu) => [ + q(3600), + q(0), + ], + q(kumam) => [ + q(3241), + q(0), + ], + q(kuman (papua new guinea)) => [ + q(3643), + q(0), + ], + q(kuman (russia)) => [ + q(5709), + q(0), + ], + q(kumaoni) => [ + q(3306), + q(0), + ], + q(kumarbhag paharia) => [ + q(3460), + q(0), + ], + q(kumba) => [ + q(3601), + q(0), + ], + q(kumbainggar) => [ + q(3323), + q(0), + ], + q(kumbaran) => [ + q(7132), + q(0), + ], + q(kumbewaha) => [ + q(7371), + q(0), + ], + q(kumhali) => [ + q(3570), + q(0), + ], + q(kumiai) => [ + q(2035), + q(0), + ], + q(kumukio) => [ + q(3652), + q(0), + ], + q(kumyk) => [ + q(0240), + q(0), + ], + q(kumzari) => [ + q(7952), + q(0), + ], + q(kunama) => [ + q(3651), + q(0), + ], + q(kunbarlang) => [ + q(7141), + q(0), + ], + q(kunda) => [ + q(3246), + q(0), + ], + q(kundal shahi) => [ + q(6004), + q(0), + ], + q(kunduvadi) => [ + q(7135), + q(0), + ], + q(kung) => [ + q(3293), + q(0), + ], + q(kung-ekoka) => [ + q(3498), + q(0), + ], + q(kungarakany) => [ + q(2494), + q(0), + ], + q(kungardutyi) => [ + q(2468), + q(0), + ], + q(kunggari) => [ + q(3316), + q(0), + ], + q(kungkari) => [ + q(3945), + q(0), + ], + q(kuni) => [ + q(3593), + q(0), + ], + q(kuni-boazi) => [ + q(3667), + q(0), + ], + q(kunigami) => [ + q(7518), + q(0), + ], + q(kunimaipa) => [ + q(3653), + q(0), + ], + q(kunja) => [ + q(5412), + q(0), + ], + q(kunjen) => [ + q(3388), + q(0), + ], + q(kunyi) => [ + q(4912), + q(0), + ], + q(kunza) => [ + q(3660), + q(0), + ], + q(kuo) => [ + q(7523), + q(0), + ], + q(kuot) => [ + q(3629), + q(0), + ], + q(kupa) => [ + q(3645), + q(0), + ], + q(kupang malay) => [ + q(4348), + q(0), + ], + q(kupia) => [ + q(3280), + q(0), + ], + q(kupsabiny) => [ + q(3543), + q(0), + ], + q(kur) => [ + q(3656), + q(0), + ], + q(kura ede nago) => [ + q(5038), + q(0), + ], + q(kurama) => [ + q(3575), + q(0), + ], + q(kuranko) => [ + q(3486), + q(0), + ], + q(kurdish) => [ + q(0241), + q(0), + ], + q(kuri) => [ + q(4743), + q(0), + ], + q(kuria) => [ + q(3648), + q(0), + ], + q(kurichiya) => [ + q(3289), + q(0), + ], + q(kurmukar) => [ + q(3303), + q(0), + ], + q(kurnai) => [ + q(6904), + q(0), + ], + q(kurrama) => [ + q(7000), + q(0), + ], + q(kurti) => [ + q(3627), + q(0), + ], + q(kurtokha) => [ + q(7378), + q(0), + ], + q(kuruaya) => [ + q(3752), + q(0), + ], + q(kurudu) => [ + q(3392), + q(0), + ], + q(kurukh) => [ + q(0238), + q(0), + ], + q(kusaal) => [ + q(3654), + q(0), + ], + q(kusaghe) => [ + q(3595), + q(0), + ], + q(kushi) => [ + q(3646), + q(0), + ], + q(kusu) => [ + q(3610), + q(0), + ], + q(kusunda) => [ + q(3312), + q(0), + ], + q(kutang ghale) => [ + q(2509), + q(1), + ], + q(kutchi) => [ + q(3299), + q(1), + ], + q(kutenai) => [ + q(0242), + q(0), + ], + q(kutep) => [ + q(3640), + q(0), + ], + q(kuthant) => [ + q(7526), + q(0), + ], + q(kutong) => [ + q(6072), + q(0), + ], + q(kutto) => [ + q(3520), + q(0), + ], + q(kutu) => [ + q(3235), + q(0), + ], + q(kuturmi) => [ + q(3337), + q(0), + ], + q(kuuk-yak) => [ + q(6874), + q(0), + ], + q(kuuku-ya'u) => [ + q(3659), + q(0), + ], + q(kuvale) => [ + q(5246), + q(0), + ], + q(kuvi) => [ + q(3730), + q(0), + ], + q(kuwaa) => [ + q(1285), + q(0), + ], + q(kuwaataay) => [ + q(1923), + q(0), + ], + q(kuy) => [ + q(3250), + q(0), + ], + q(kven finnish) => [ + q(2349), + q(0), + ], + q(kw'adza) => [ + q(7131), + q(0), + ], + q(kwa) => [ + q(3687), + q(0), + ], + q(kwa') => [ + q(1267), + q(0), + ], + q(kwaami) => [ + q(3605), + q(0), + ], + q(kwadi) => [ + q(3710), + q(0), + ], + q(kwaio) => [ + q(3689), + q(0), + ], + q(kwaja) => [ + q(3255), + q(0), + ], + q(kwakiutl) => [ + q(3696), + q(0), + ], + q(kwakum) => [ + q(3705), + q(0), + ], + q(kwalhioqua-tlatskanai) => [ + q(5711), + q(0), + ], + q(kwama) => [ + q(3467), + q(0), + ], + q(kwambi) => [ + q(3698), + q(0), + ], + q(kwamera) => [ + q(6604), + q(0), + ], + q(kwami) => [ + q(3620), + q(0), + ], + q(kwamtim one) => [ + q(5228), + q(0), + ], + q(kwandu) => [ + q(7313), + q(0), + ], + q(kwang) => [ + q(3669), + q(0), + ], + q(kwanga) => [ + q(3695), + q(0), + ], + q(kwangali) => [ + q(3699), + q(0), + ], + q(kwanja) => [ + q(3491), + q(0), + ], + q(kwanyama) => [ + q(0239), + q(1), + ], + q(kwara'ae) => [ + q(3691), + q(0), + ], + q(kwasio) => [ + q(4961), + q(0), + ], + q(kwaya) => [ + q(3735), + q(0), + ], + q(kwaza) => [ + q(7533), + q(0), + ], + q(kwegu) => [ + q(7537), + q(0), + ], + q(kwenyi) => [ + q(3243), + q(1), + ], + q(kwer) => [ + q(3702), + q(0), + ], + q(kwerba) => [ + q(3690), + q(0), + ], + q(kwerba mamberamo) => [ + q(7542), + q(0), + ], + q(kwere) => [ + q(1921), + q(0), + ], + q(kwerisa) => [ + q(3401), + q(0), + ], + q(kwese) => [ + q(3703), + q(0), + ], + q(kwesten) => [ + q(3704), + q(0), + ], + q(kwini) => [ + q(2689), + q(0), + ], + q(kwinsu) => [ + q(3641), + q(0), + ], + q(kwinti) => [ + q(3707), + q(0), + ], + q(kwoma) => [ + q(3465), + q(0), + ], + q(kwomtari) => [ + q(3700), + q(0), + ], + q(kxoe) => [ + q(7527), + q(0), + ], + q(kyak) => [ + q(1255), + q(0), + ], + q(kyaka) => [ + q(3737), + q(0), + ], + q(kyan-karyaw naga) => [ + q(5042), + q(0), + ], + q(kyanga) => [ + q(6815), + q(0), + ], + q(kyenele) => [ + q(3555), + q(0), + ], + q(kyerung) => [ + q(3329), + q(0), + ], + q(kyrgyz) => [ + q(0227), + q(1), + ], + q(la'bi) => [ + q(3810), + q(0), + ], + q(laa laa bwamu) => [ + q(1550), + q(0), + ], + q(laadan) => [ + q(3847), + q(0), + ], + q(laal) => [ + q(2462), + q(0), + ], + q(laalaa) => [ + q(1641), + q(1), + ], + q(laari) => [ + q(3842), + q(0), + ], + q(laba) => [ + q(3799), + q(0), + ], + q(label) => [ + q(3805), + q(0), + ], + q(labir) => [ + q(3112), + q(0), + ], + q(labo) => [ + q(4625), + q(0), + ], + q(labo phowa) => [ + q(7713), + q(0), + ], + q(labu) => [ + q(3821), + q(0), + ], + q(labuk-kinabatangan kadazan) => [ + q(2151), + q(0), + ], + q(lacandon) => [ + q(3786), + q(0), + ], + q(lachi) => [ + q(3820), + q(0), + ], + q(lachiguiri zapotec) => [ + q(7899), + q(0), + ], + q(lachixio zapotec) => [ + q(7910), + q(0), + ], + q(ladakhi) => [ + q(3811), + q(0), + ], + q(ladin) => [ + q(3950), + q(0), + ], + q(ladino) => [ + q(0243), + q(0), + ], + q(ladji ladji) => [ + q(3956), + q(0), + ], + q(laeko-libuat) => [ + q(3938), + q(0), + ], + q(lafofa) => [ + q(3788), + q(0), + ], + q(laghu) => [ + q(3878), + q(0), + ], + q(laghuu) => [ + q(3880), + q(0), + ], + q(lagwan) => [ + q(3514), + q(0), + ], + q(laha (indonesia)) => [ + q(3892), + q(0), + ], + q(laha (viet nam)) => [ + q(3891), + q(0), + ], + q(lahanan) => [ + q(3896), + q(0), + ], + q(lahnda) => [ + q(0244), + q(0), + ], + q(lahta) => [ + q(3679), + q(1), + ], + q(lahta karen) => [ + q(3679), + q(0), + ], + q(lahu) => [ + q(3900), + q(0), + ], + q(lahu shi) => [ + q(3893), + q(0), + ], + q(lahul lohar) => [ + q(3894), + q(0), + ], + q(laimbue) => [ + q(3987), + q(0), + ], + q(laitu chin) => [ + q(1772), + q(0), + ], + q(laiyolo) => [ + q(3925), + q(0), + ], + q(lak) => [ + q(3807), + q(0), + ], + q(laka (chad)) => [ + q(3795), + q(0), + ], + q(laka (nigeria)) => [ + q(3792), + q(0), + ], + q(lakalei) => [ + q(3930), + q(0), + ], + q(lake miwok) => [ + q(3986), + q(0), + ], + q(lakha) => [ + q(3935), + q(0), + ], + q(laki) => [ + q(3936), + q(0), + ], + q(lakkia) => [ + q(3806), + q(0), + ], + q(lakon) => [ + q(3940), + q(0), + ], + q(lakonde) => [ + q(3933), + q(0), + ], + q(lakota) => [ + q(3944), + q(0), + ], + q(lakota dida) => [ + q(2031), + q(0), + ], + q(lala) => [ + q(5060), + q(0), + ], + q(lala-bisa) => [ + q(3852), + q(0), + ], + q(lala-roba) => [ + q(3947), + q(0), + ], + q(lalana chinantec) => [ + q(1799), + q(0), + ], + q(lalia) => [ + q(3793), + q(0), + ], + q(lama (togo)) => [ + q(3798), + q(0), + ], + q(lama bai) => [ + q(3802), + q(0), + ], + q(lamaholot) => [ + q(6096), + q(0), + ], + q(lamalera) => [ + q(3983), + q(0), + ], + q(lamang) => [ + q(2750), + q(0), + ], + q(lamatuka) => [ + q(3982), + q(0), + ], + q(lamba) => [ + q(0245), + q(0), + ], + q(lambadi) => [ + q(3979), + q(0), + ], + q(lambayeque quechua) => [ + q(5674), + q(0), + ], + q(lambichhong) => [ + q(3974), + q(0), + ], + q(lamboya) => [ + q(3988), + q(0), + ], + q(lambya) => [ + q(3790), + q(0), + ], + q(lame) => [ + q(1303), + q(0), + ], + q(lamenu) => [ + q(3984), + q(0), + ], + q(lamet) => [ + q(3815), + q(0), + ], + q(lamja-dengsa-tola) => [ + q(3841), + q(0), + ], + q(lamkang) => [ + q(3977), + q(0), + ], + q(lamma) => [ + q(3871), + q(0), + ], + q(lamnso') => [ + q(4001), + q(0), + ], + q(lamogai) => [ + q(3973), + q(0), + ], + q(lampung api) => [ + q(3927), + q(0), + ], + q(lampung nyo) => [ + q(0570), + q(0), + ], + q(lamu) => [ + q(3954), + q(0), + ], + q(lamu-lamu) => [ + q(3825), + q(0), + ], + q(lanas lobu) => [ + q(5862), + q(0), + ], + q(land dayak languages) => [ + q(0106), + q(0), + ], + q(landoma) => [ + q(3846), + q(0), + ], + q(lang'e) => [ + q(7693), + q(0), + ], + q(langam) => [ + q(3998), + q(0), + ], + q(langbashe) => [ + q(3990), + q(0), + ], + q(langi) => [ + q(3789), + q(0), + ], + q(langnian buyang) => [ + q(7668), + q(0), + ], + q(lango (sudan)) => [ + q(4000), + q(0), + ], + q(lango (uganda)) => [ + q(3791), + q(0), + ], + q(langobardic) => [ + q(3993), + q(0), + ], + q(langue des signes de belgique francophone) => [ + q(5977), + q(0), + ], + q(lanima) => [ + q(4003), + q(0), + ], + q(lanoh) => [ + q(3994), + q(0), + ], + q(lao) => [ + q(0246), + q(0), + ], + q(lao naga) => [ + q(4948), + q(0), + ], + q(laomian) => [ + q(4095), + q(0), + ], + q(laopang) => [ + q(3809), + q(0), + ], + q(laos sign language) => [ + q(4055), + q(0), + ], + q(lapaguia-guivini zapotec) => [ + q(7940), + q(0), + ], + q(laragia) => [ + q(4036), + q(0), + ], + q(larantuka malay) => [ + q(4044), + q(0), + ], + q(lardil) => [ + q(3826), + q(0), + ], + q(larevat) => [ + q(4045), + q(0), + ], + q(large flowery miao) => [ + q(2777), + q(0), + ], + q(lari) => [ + q(4039), + q(0), + ], + q(larike-wakasihu) => [ + q(0757), + q(0), + ], + q(laro) => [ + q(4042), + q(0), + ], + q(larteh) => [ + q(3797), + q(0), + ], + q(laru) => [ + q(3794), + q(0), + ], + q(lasalimu) => [ + q(3959), + q(0), + ], + q(lasgerdi) => [ + q(4047), + q(0), + ], + q(lashi) => [ + q(4052), + q(0), + ], + q(lasi) => [ + q(4058), + q(0), + ], + q(late middle chinese) => [ + q(4061), + q(0), + ], + q(latgalian) => [ + q(4062), + q(0), + ], + q(latin) => [ + q(0247), + q(0), + ], + q(latu) => [ + q(4068), + q(0), + ], + q(latunde) => [ + q(4065), + q(0), + ], + q(latvian) => [ + q(0248), + q(0), + ], + q(latvian sign language) => [ + q(4053), + q(0), + ], + q(lau) => [ + q(3965), + q(0), + ], + q(laua) => [ + q(4072), + q(0), + ], + q(lauan) => [ + q(3966), + q(0), + ], + q(lauje) => [ + q(3800), + q(0), + ], + q(laura) => [ + q(4079), + q(0), + ], + q(laurentian) => [ + q(4035), + q(0), + ], + q(lautu chin) => [ + q(1777), + q(0), + ], + q(lavatbura-lamusong) => [ + q(3822), + q(0), + ], + q(lave) => [ + q(1423), + q(0), + ], + q(laven) => [ + q(3816), + q(0), + ], + q(lavrung) => [ + q(3100), + q(1), + ], + q(lavukaleve) => [ + q(4087), + q(0), + ], + q(lawangan) => [ + q(3824), + q(0), + ], + q(lawu) => [ + q(4098), + q(0), + ], + q(lawunuia) => [ + q(6471), + q(0), + ], + q(layakha) => [ + q(4100), + q(0), + ], + q(laz) => [ + q(4106), + q(0), + ], + q(lealao chinantec) => [ + q(1769), + q(0), + ], + q(leco) => [ + q(3853), + q(0), + ], + q(ledo kaili) => [ + q(3872), + q(0), + ], + q(leelau) => [ + q(3844), + q(0), + ], + q(lefa) => [ + q(3875), + q(0), + ], + q(lega-mwenga) => [ + q(3884), + q(0), + ], + q(lega-shabunda) => [ + q(3851), + q(0), + ], + q(legbo) => [ + q(0654), + q(0), + ], + q(legenyem) => [ + q(3827), + q(0), + ], + q(lehali) => [ + q(6662), + q(0), + ], + q(lehalurup) => [ + q(6925), + q(0), + ], + q(lehar) => [ + q(1641), + q(0), + ], + q(leinong naga) => [ + q(4105), + q(0), + ], + q(leipon) => [ + q(3860), + q(0), + ], + q(lelak) => [ + q(3957), + q(0), + ], + q(lele (chad)) => [ + q(3960), + q(0), + ], + q(lele (democratic republic of congo)) => [ + q(3861), + q(0), + ], + q(lele (guinea)) => [ + q(3949), + q(0), + ], + q(lele (papua new guinea)) => [ + q(3951), + q(0), + ], + q(lelemi) => [ + q(3856), + q(0), + ], + q(lelepa) => [ + q(4028), + q(0), + ], + q(lembena) => [ + q(3866), + q(0), + ], + q(lemerig) => [ + q(4046), + q(0), + ], + q(lemio) => [ + q(3858), + q(0), + ], + q(lemnian) => [ + q(7383), + q(0), + ], + q(lemolang) => [ + q(3874), + q(0), + ], + q(lemoro) => [ + q(3843), + q(0), + ], + q(lenakel) => [ + q(6605), + q(0), + ], + q(lenca) => [ + q(3863), + q(0), + ], + q(lendu) => [ + q(3854), + q(0), + ], + q(lengilu) => [ + q(3881), + q(0), + ], + q(lengo) => [ + q(3887), + q(0), + ], + q(lengola) => [ + q(3859), + q(0), + ], + q(lengua de senas catalana) => [ + q(1862), + q(1), + ], + q(lengua de senas del paraguay) => [ + q(5665), + q(1), + ], + q(lengua de senas panamenas) => [ + q(4056), + q(1), + ], + q(leningitij) => [ + q(3996), + q(0), + ], + q(lenje) => [ + q(3857), + q(0), + ], + q(lenkau) => [ + q(3867), + q(0), + ], + q(lenyima) => [ + q(3840), + q(0), + ], + q(leonese) => [ + q(0030), + q(2), + ], + q(lepcha) => [ + q(3865), + q(0), + ], + q(lepki) => [ + q(4029), + q(0), + ], + q(lepontic) => [ + q(7388), + q(0), + ], + q(lere) => [ + q(2571), + q(0), + ], + q(lese) => [ + q(3868), + q(0), + ], + q(lesing-gelimi) => [ + q(3869), + q(0), + ], + q(letemboi) => [ + q(4973), + q(0), + ], + q(leti (cameroon)) => [ + q(3864), + q(0), + ], + q(leti (indonesia)) => [ + q(4064), + q(0), + ], + q(letzeburgesch) => [ + q(0255), + q(1), + ], + q(levuka) => [ + q(4089), + q(0), + ], + q(lewo) => [ + q(4099), + q(0), + ], + q(lewo eleng) => [ + q(4091), + q(0), + ], + q(lewotobi) => [ + q(4097), + q(0), + ], + q(leyigha) => [ + q(1000), + q(0), + ], + q(lezghian) => [ + q(0249), + q(0), + ], + q(lhaovo) => [ + q(4288), + q(1), + ], + q(lhokpu) => [ + q(3897), + q(0), + ], + q(lhomi) => [ + q(3895), + q(0), + ], + q(li'o) => [ + q(3926), + q(0), + ], + q(liabuku) => [ + q(3920), + q(0), + ], + q(liana-seti) => [ + q(6246), + q(0), + ], + q(liangmai naga) => [ + q(4906), + q(0), + ], + q(lianshan zhuang) => [ + q(7859), + q(0), + ], + q(liberia kpelle) => [ + q(7444), + q(0), + ], + q(liberian english) => [ + q(3915), + q(0), + ], + q(libido) => [ + q(3914), + q(0), + ], + q(libinza) => [ + q(3922), + q(0), + ], + q(libon bikol) => [ + q(3813), + q(0), + ], + q(liburnian) => [ + q(7385), + q(0), + ], + q(libyan arabic) => [ + q(1002), + q(0), + ], + q(libyan sign language) => [ + q(3819), + q(0), + ], + q(ligbi) => [ + q(3907), + q(0), + ], + q(ligenza) => [ + q(3890), + q(0), + ], + q(ligurian) => [ + q(3909), + q(0), + ], + q(ligurian (ancient)) => [ + q(7384), + q(0), + ], + q(lihir) => [ + q(3908), + q(0), + ], + q(lijili) => [ + q(4250), + q(0), + ], + q(lika) => [ + q(3910), + q(0), + ], + q(liki) => [ + q(3912), + q(0), + ], + q(likila) => [ + q(3905), + q(0), + ], + q(likuba) => [ + q(3732), + q(0), + ], + q(likum) => [ + q(3902), + q(0), + ], + q(likwala) => [ + q(3688), + q(0), + ], + q(lilau) => [ + q(3958), + q(0), + ], + q(lillooet) => [ + q(3911), + q(0), + ], + q(limassa) => [ + q(1307), + q(0), + ], + q(limbu) => [ + q(3906), + q(0), + ], + q(limbum) => [ + q(3981), + q(0), + ], + q(limburgan) => [ + q(0250), + q(0), + ], + q(limburger) => [ + q(0250), + q(1), + ], + q(limburgish) => [ + q(0250), + q(2), + ], + q(limi) => [ + q(7667), + q(0), + ], + q(limilngan) => [ + q(3969), + q(0), + ], + q(limos kalinga) => [ + q(3461), + q(0), + ], + q(lindu) => [ + q(3448), + q(1), + ], + q(linear a) => [ + q(3785), + q(0), + ], + q(lingala) => [ + q(0251), + q(0), + ], + q(lingao) => [ + q(5263), + q(0), + ], + q(lingarak) => [ + q(3882), + q(0), + ], + q(lingua franca) => [ + q(5514), + q(0), + ], + q(lingua franca nova) => [ + q(3876), + q(0), + ], + q(lipan apache) => [ + q(0845), + q(0), + ], + q(lipo) => [ + q(4031), + q(0), + ], + q(lisabata-nuniali) => [ + q(3836), + q(0), + ], + q(lisela) => [ + q(3832), + q(0), + ], + q(lish) => [ + q(4051), + q(0), + ], + q(lishan didan) => [ + q(6678), + q(0), + ], + q(lishana deni) => [ + q(4048), + q(0), + ], + q(lishanid noshan) => [ + q(0701), + q(0), + ], + q(lisu) => [ + q(3916), + q(0), + ], + q(literary chinese) => [ + q(4103), + q(0), + ], + q(lithuanian) => [ + q(0252), + q(0), + ], + q(lithuanian sign language) => [ + q(3964), + q(0), + ], + q(litzlitz) => [ + q(4104), + q(0), + ], + q(liujiang zhuang) => [ + q(7857), + q(0), + ], + q(liuqian zhuang) => [ + q(7860), + q(0), + ], + q(liv) => [ + q(3918), + q(0), + ], + q(livvi) => [ + q(5243), + q(0), + ], + q(llengua de signes catalana) => [ + q(1862), + q(2), + ], + q(llengua de signes valenciana) => [ + q(7035), + q(1), + ], + q(lo-toga) => [ + q(3899), + q(0), + ], + q(loarki) => [ + q(4038), + q(0), + ], + q(lobala) => [ + q(4019), + q(0), + ], + q(lobi) => [ + q(4006), + q(0), + ], + q(lodhi) => [ + q(3814), + q(0), + ], + q(logba) => [ + q(3886), + q(0), + ], + q(logo) => [ + q(4010), + q(0), + ], + q(logol) => [ + q(4009), + q(0), + ], + q(logooli) => [ + q(5732), + q(0), + ], + q(logorik) => [ + q(3917), + q(0), + ], + q(logudorese sardinian) => [ + q(6200), + q(0), + ], + q(lohorung) => [ + q(3818), + q(0), + ], + q(loja highland quichua) => [ + q(5696), + q(0), + ], + q(lojban) => [ + q(0205), + q(0), + ], + q(lokaa) => [ + q(7583), + q(0), + ], + q(loke) => [ + q(4027), + q(0), + ], + q(loko) => [ + q(4014), + q(0), + ], + q(lokoya) => [ + q(3946), + q(0), + ], + q(lola) => [ + q(3828), + q(0), + ], + q(lolak) => [ + q(3963), + q(0), + ], + q(lole) => [ + q(3953), + q(0), + ], + q(lolo) => [ + q(3948), + q(0), + ], + q(loloda) => [ + q(4005), + q(0), + ], + q(lolopo) => [ + q(7598), + q(0), + ], + q(loma (cote d'ivoire)) => [ + q(4012), + q(0), + ], + q(loma (liberia)) => [ + q(4015), + q(0), + ], + q(lomaiviti) => [ + q(3985), + q(0), + ], + q(lomavren) => [ + q(5803), + q(0), + ], + q(lombard) => [ + q(3980), + q(0), + ], + q(lombi) => [ + q(3975), + q(0), + ], + q(lombo) => [ + q(4017), + q(0), + ], + q(lomwe) => [ + q(4838), + q(0), + ], + q(loncong) => [ + q(3829), + q(0), + ], + q(long phuri naga) => [ + q(4030), + q(0), + ], + q(long wat) => [ + q(6741), + q(0), + ], + q(longgu) => [ + q(3889), + q(0), + ], + q(longto) => [ + q(7190), + q(0), + ], + q(longuda) => [ + q(4002), + q(0), + ], + q(loniu) => [ + q(4021), + q(0), + ], + q(lonwolwol) => [ + q(1841), + q(0), + ], + q(lonzo) => [ + q(4004), + q(0), + ], + q(loo) => [ + q(3848), + q(0), + ], + q(lopa) => [ + q(4018), + q(0), + ], + q(lopi) => [ + q(4024), + q(0), + ], + q(lopit) => [ + q(4032), + q(0), + ], + q(lorang) => [ + q(4041), + q(0), + ], + q(lorediakarkar) => [ + q(3999), + q(0), + ], + q(loreto-ucayali spanish) => [ + q(6179), + q(0), + ], + q(lote) => [ + q(6950), + q(0), + ], + q(lotha naga) => [ + q(4901), + q(0), + ], + q(lotud) => [ + q(2160), + q(0), + ], + q(lou) => [ + q(4013), + q(0), + ], + q(louisiana creole) => [ + q(4023), + q(0), + ], + q(loun) => [ + q(4026), + q(0), + ], + q(loup a) => [ + q(7387), + q(0), + ], + q(loup b) => [ + q(7380), + q(0), + ], + q(lovono) => [ + q(7026), + q(1), + ], + q(low german) => [ + q(0307), + q(0), + ], + q(low saxon) => [ + q(0307), + q(1), + ], + q(lower burdekin) => [ + q(7280), + q(0), + ], + q(lower chehalis) => [ + q(1703), + q(0), + ], + q(lower grand valley dani) => [ + q(2097), + q(0), + ], + q(lower silesian) => [ + q(6091), + q(0), + ], + q(lower sorbian) => [ + q(0114), + q(0), + ], + q(lower southern aranda) => [ + q(0990), + q(0), + ], + q(lower ta'oih) => [ + q(6733), + q(0), + ], + q(lower tanana) => [ + q(6347), + q(0), + ], + q(lowland oaxaca chontal) => [ + q(1776), + q(0), + ], + q(lowland tarahumara) => [ + q(6349), + q(0), + ], + q(loxicha zapotec) => [ + q(7943), + q(0), + ], + q(loyop) => [ + q(6925), + q(1), + ], + q(lozi) => [ + q(0254), + q(0), + ], + q(lu) => [ + q(3330), + q(0), + ], + q(luang) => [ + q(3873), + q(0), + ], + q(luba-katanga) => [ + q(0257), + q(0), + ], + q(luba-lulua) => [ + q(0256), + q(0), + ], + q(lubila) => [ + q(3210), + q(0), + ], + q(lubu) => [ + q(3830), + q(0), + ], + q(lubuagan kalinga) => [ + q(3478), + q(0), + ], + q(lubukusu) => [ + q(1576), + q(1), + ], + q(luchazi) => [ + q(3831), + q(0), + ], + q(lucumi) => [ + q(4078), + q(0), + ], + q(ludian) => [ + q(4070), + q(0), + ], + q(lufu) => [ + q(3850), + q(0), + ], + q(lugbara) => [ + q(3879), + q(0), + ], + q(luguru) => [ + q(5854), + q(0), + ], + q(luhu) => [ + q(3835), + q(0), + ], + q(lui) => [ + q(3804), + q(0), + ], + q(luidakho-luisukha-lutirichi) => [ + q(2899), + q(1), + ], + q(luimbi) => [ + q(4076), + q(0), + ], + q(luiseno) => [ + q(0259), + q(0), + ], + q(lukabaras) => [ + q(3931), + q(1), + ], + q(lukpa) => [ + q(2117), + q(0), + ], + q(lule) => [ + q(6878), + q(0), + ], + q(lule sami) => [ + q(0391), + q(0), + ], + q(lulogooli) => [ + q(5732), + q(1), + ], + q(lumba-yakkha) => [ + q(4081), + q(0), + ], + q(lumbee) => [ + q(3989), + q(0), + ], + q(lumbu) => [ + q(4077), + q(0), + ], + q(lumun) => [ + q(3970), + q(0), + ], + q(lun bawang) => [ + q(3992), + q(1), + ], + q(luna) => [ + q(4073), + q(0), + ], + q(lunanakha) => [ + q(4074), + q(0), + ], + q(lunda) => [ + q(0260), + q(0), + ], + q(lundayeh) => [ + q(3992), + q(0), + ], + q(lungalunga) => [ + q(7009), + q(0), + ], + q(lungga) => [ + q(3877), + q(0), + ], + q(luo (cameroon)) => [ + q(4083), + q(0), + ], + q(luo (kenya and tanzania)) => [ + q(0261), + q(0), + ], + q(luopohe hmong) => [ + q(2785), + q(0), + ], + q(luopohe miao) => [ + q(2785), + q(1), + ], + q(luri) => [ + q(3839), + q(0), + ], + q(lusengo) => [ + q(4049), + q(0), + ], + q(lushai) => [ + q(0262), + q(0), + ], + q(lushootseed) => [ + q(4080), + q(0), + ], + q(lusi) => [ + q(3339), + q(0), + ], + q(lusitanian) => [ + q(7389), + q(0), + ], + q(lutachoni) => [ + q(4067), + q(1), + ], + q(lutos) => [ + q(4798), + q(0), + ], + q(luvale) => [ + q(4071), + q(0), + ], + q(luwati) => [ + q(4082), + q(0), + ], + q(luwo) => [ + q(4096), + q(0), + ], + q(luxembourgish) => [ + q(0255), + q(0), + ], + q(luyana) => [ + q(4102), + q(0), + ], + q(luyia) => [ + q(4084), + q(0), + ], + q(lwalu) => [ + q(4090), + q(0), + ], + q(lycian) => [ + q(7381), + q(0), + ], + q(lydian) => [ + q(7382), + q(0), + ], + q(lyele) => [ + q(3855), + q(0), + ], + q(lyngngam) => [ + q(4101), + q(0), + ], + q(lyons sign language) => [ + q(4050), + q(0), + ], + q(ma (democratic republic of congo)) => [ + q(4532), + q(0), + ], + q(ma (papua new guinea)) => [ + q(4324), + q(0), + ], + q(ma manda) => [ + q(6064), + q(0), + ], + q(ma'anyan) => [ + q(4289), + q(0), + ], + q(ma'di) => [ + q(4274), + q(0), + ], + q(ma'ya) => [ + q(6105), + q(0), + ], + q(maa) => [ + q(1781), + q(0), + ], + q(maaka) => [ + q(4214), + q(0), + ], + q(maasina fulfulde) => [ + q(2340), + q(0), + ], + q(maay) => [ + q(7682), + q(0), + ], + q(maba (chad)) => [ + q(4175), + q(0), + ], + q(maba (indonesia)) => [ + q(4474), + q(0), + ], + q(mabaale) => [ + q(4407), + q(0), + ], + q(mabaan) => [ + q(4242), + q(0), + ], + q(mabaka valley kalinga) => [ + q(3406), + q(0), + ], + q(mabire) => [ + q(4581), + q(0), + ], + q(maca) => [ + q(4145), + q(0), + ], + q(macaguaje) => [ + q(4156), + q(0), + ], + q(macaguan) => [ + q(4132), + q(0), + ], + q(macanese) => [ + q(4704), + q(0), + ], + q(macedo-romanian) => [ + q(0363), + q(2), + ], + q(macedonian) => [ + q(0263), + q(0), + ], + q(machame) => [ + q(3117), + q(0), + ], + q(machiguenga) => [ + q(4146), + q(0), + ], + q(machinere) => [ + q(4452), + q(0), + ], + q(machinga) => [ + q(4614), + q(0), + ], + q(maco) => [ + q(7198), + q(0), + ], + q(macuna) => [ + q(4685), + q(0), + ], + q(macushi) => [ + q(4122), + q(0), + ], + q(mada (cameroon)) => [ + q(4660), + q(0), + ], + q(mada (nigeria)) => [ + q(4171), + q(0), + ], + q(madagascar sign language) => [ + q(4689), + q(0), + ], + q(madak) => [ + q(4405), + q(0), + ], + q(maden) => [ + q(7414), + q(0), + ], + q(madhi madhi) => [ + q(2079), + q(0), + ], + q(madi) => [ + q(2614), + q(0), + ], + q(madngele) => [ + q(7872), + q(0), + ], + q(madurese) => [ + q(0264), + q(0), + ], + q(mae) => [ + q(4387), + q(0), + ], + q(maek) => [ + q(2784), + q(0), + ], + q(maeng itneg) => [ + q(3018), + q(0), + ], + q(mafa) => [ + q(4110), + q(0), + ], + q(mafea) => [ + q(4356), + q(0), + ], + q(mag-antsi ayta) => [ + q(5982), + q(0), + ], + q(mag-indi ayta) => [ + q(1300), + q(0), + ], + q(magahi) => [ + q(0265), + q(0), + ], + q(magbukun ayta) => [ + q(1009), + q(0), + ], + q(magdalena penasco mixtec) => [ + q(7502), + q(0), + ], + q(maghdi) => [ + q(2555), + q(0), + ], + q(magoma) => [ + q(2562), + q(0), + ], + q(magori) => [ + q(7828), + q(0), + ], + q(maguindanaon) => [ + q(4177), + q(0), + ], + q(magyi) => [ + q(2556), + q(0), + ], + q(mah meri) => [ + q(4271), + q(1), + ], + q(mahali) => [ + q(4334), + q(0), + ], + q(maharastri prakrit) => [ + q(5510), + q(0), + ], + q(mahasu pahari) => [ + q(1161), + q(0), + ], + q(mahican) => [ + q(4335), + q(0), + ], + q(mahongwe) => [ + q(4268), + q(0), + ], + q(mahou) => [ + q(4663), + q(0), + ], + q(mai brat) => [ + q(1012), + q(0), + ], + q(maia) => [ + q(6078), + q(0), + ], + q(maiadomu) => [ + q(4711), + q(0), + ], + q(maiani) => [ + q(6602), + q(0), + ], + q(maii) => [ + q(4395), + q(0), + ], + q(mailu) => [ + q(4262), + q(0), + ], + q(maindo) => [ + q(1919), + q(0), + ], + q(mainfrankisch) => [ + q(7008), + q(0), + ], + q(mainstream kenyah) => [ + q(7365), + q(0), + ], + q(mairasi) => [ + q(7931), + q(0), + ], + q(maisin) => [ + q(4135), + q(0), + ], + q(maithili) => [ + q(0267), + q(0), + ], + q(maiwa (indonesia)) => [ + q(7161), + q(0), + ], + q(maiwa (papua new guinea)) => [ + q(4556), + q(0), + ], + q(maiwala) => [ + q(4583), + q(0), + ], + q(majang) => [ + q(4453), + q(0), + ], + q(majera) => [ + q(7400), + q(0), + ], + q(majhi) => [ + q(4336), + q(0), + ], + q(majhwar) => [ + q(4392), + q(0), + ], + q(majukayang kalinga) => [ + q(3454), + q(0), + ], + q(mak (china)) => [ + q(4342), + q(0), + ], + q(mak (nigeria)) => [ + q(5367), + q(0), + ], + q(makaa) => [ + q(4160), + q(0), + ], + q(makah) => [ + q(4672), + q(0), + ], + q(makalero) => [ + q(4313), + q(0), + ], + q(makasae) => [ + q(4360), + q(0), + ], + q(makasar) => [ + q(0268), + q(0), + ], + q(makassar malay) => [ + q(4232), + q(0), + ], + q(makayam) => [ + q(0947), + q(0), + ], + q(makhuwa) => [ + q(7022), + q(0), + ], + q(makhuwa-marrevone) => [ + q(7394), + q(0), + ], + q(makhuwa-meetto) => [ + q(4249), + q(0), + ], + q(makhuwa-moniga) => [ + q(4278), + q(0), + ], + q(makhuwa-saka) => [ + q(7486), + q(0), + ], + q(makhuwa-shirima) => [ + q(7013), + q(0), + ], + q(maklew) => [ + q(4247), + q(0), + ], + q(makolkol) => [ + q(7868), + q(0), + ], + q(makonde) => [ + q(3237), + q(0), + ], + q(maku) => [ + q(7267), + q(0), + ], + q(maku'a) => [ + q(4086), + q(0), + ], + q(makurap) => [ + q(4468), + q(0), + ], + q(makuri naga) => [ + q(3121), + q(0), + ], + q(makwe) => [ + q(7680), + q(0), + ], + q(makyan naga) => [ + q(6893), + q(0), + ], + q(mal) => [ + q(4365), + q(0), + ], + q(mal paharia) => [ + q(4338), + q(0), + ], + q(mala (nigeria)) => [ + q(5863), + q(0), + ], + q(mala (papua new guinea)) => [ + q(5402), + q(0), + ], + q(mala malasar) => [ + q(2959), + q(0), + ], + q(malaccan creole malay) => [ + q(1685), + q(0), + ], + q(malaccan creole portuguese) => [ + q(4157), + q(0), + ], + q(malagasy) => [ + q(0284), + q(0), + ], + q(malalamai) => [ + q(4401), + q(0), + ], + q(malango) => [ + q(4372), + q(0), + ], + q(malankuravan) => [ + q(4325), + q(0), + ], + q(malapandaram) => [ + q(4326), + q(0), + ], + q(malaryan) => [ + q(4327), + q(0), + ], + q(malas) => [ + q(4352), + q(0), + ], + q(malasar) => [ + q(7687), + q(0), + ], + q(malavedan) => [ + q(4328), + q(0), + ], + q(malawi lomwe) => [ + q(4016), + q(0), + ], + q(malawi sena) => [ + q(6295), + q(0), + ], + q(malay) => [ + q(0275), + q(0), + ], + q(malay (individual language)) => [ + q(7858), + q(0), + ], + q(malay (macrolanguage)) => [ + q(0275), + q(1), + ], + q(malayalam) => [ + q(0269), + q(0), + ], + q(malayic dayak) => [ + q(7314), + q(0), + ], + q(malaynon) => [ + q(4382), + q(0), + ], + q(malayo) => [ + q(4134), + q(0), + ], + q(malayo-polynesian languages) => [ + q(0521), + q(0), + ], + q(malaysian sign language) => [ + q(7402), + q(0), + ], + q(malba birifor) => [ + q(1151), + q(0), + ], + q(maldivian) => [ + q(0111), + q(2), + ], + q(male) => [ + q(2821), + q(1), + ], + q(male (ethiopia)) => [ + q(4192), + q(0), + ], + q(male (papua new guinea)) => [ + q(4173), + q(0), + ], + q(malecite-passamaquoddy) => [ + q(5580), + q(0), + ], + q(maleku jaika) => [ + q(2658), + q(0), + ], + q(maleng) => [ + q(5481), + q(0), + ], + q(maleu-kilenge) => [ + q(4253), + q(0), + ], + q(malfaxal) => [ + q(4381), + q(0), + ], + q(malgana) => [ + q(7014), + q(0), + ], + q(malgbe) => [ + q(4645), + q(0), + ], + q(mali) => [ + q(2442), + q(0), + ], + q(malila) => [ + q(4258), + q(0), + ], + q(malimba) => [ + q(4690), + q(0), + ], + q(malimpung) => [ + q(4367), + q(0), + ], + q(malinaltepec me'phaa) => [ + q(6399), + q(0), + ], + q(malinaltepec tlapanec) => [ + q(6399), + q(1), + ], + q(malo) => [ + q(4361), + q(0), + ], + q(malol) => [ + q(4129), + q(0), + ], + q(maltese) => [ + q(0285), + q(0), + ], + q(maltese sign language) => [ + q(4181), + q(0), + ], + q(malua bay) => [ + q(4370), + q(0), + ], + q(malvi) => [ + q(4585), + q(0), + ], + q(malyangapa) => [ + q(7618), + q(0), + ], + q(mam) => [ + q(4112), + q(0), + ], + q(mama) => [ + q(4383), + q(0), + ], + q(mamaa) => [ + q(4272), + q(0), + ], + q(mamainde) => [ + q(7157), + q(0), + ], + q(mamanwa) => [ + q(4396), + q(0), + ], + q(mamara senoufo) => [ + q(4675), + q(0), + ], + q(mamasa) => [ + q(4482), + q(0), + ], + q(mambae) => [ + q(4254), + q(0), + ], + q(mambai) => [ + q(4163), + q(0), + ], + q(mamboru) => [ + q(4596), + q(0), + ], + q(mambwe-lungu) => [ + q(4259), + q(0), + ], + q(mampruli) => [ + q(4117), + q(0), + ], + q(mamuju) => [ + q(4496), + q(0), + ], + q(mamulique) => [ + q(2252), + q(0), + ], + q(mamusi) => [ + q(3238), + q(0), + ], + q(mamvu) => [ + q(4178), + q(0), + ], + q(man met) => [ + q(4394), + q(0), + ], + q(manado malay) => [ + q(7403), + q(0), + ], + q(manam) => [ + q(4594), + q(0), + ], + q(manambu) => [ + q(4364), + q(0), + ], + q(manangba) => [ + q(4967), + q(0), + ], + q(manangkari) => [ + q(7890), + q(0), + ], + q(manchu) => [ + q(0286), + q(0), + ], + q(manda (australia)) => [ + q(7861), + q(0), + ], + q(manda (india)) => [ + q(4267), + q(0), + ], + q(manda (tanzania)) => [ + q(4260), + q(0), + ], + q(mandahuaca) => [ + q(4285), + q(0), + ], + q(mandaic) => [ + q(4293), + q(0), + ], + q(mandan) => [ + q(4282), + q(0), + ], + q(mandandanyi) => [ + q(7871), + q(0), + ], + q(mandar) => [ + q(0277), + q(0), + ], + q(mandara) => [ + q(6374), + q(0), + ], + q(mandari) => [ + q(4493), + q(0), + ], + q(mandarin chinese) => [ + q(1787), + q(0), + ], + q(mandaya) => [ + q(4522), + q(0), + ], + q(mande languages) => [ + q(0501), + q(0), + ], + q(mandeali) => [ + q(4322), + q(0), + ], + q(mander) => [ + q(4490), + q(0), + ], + q(manding) => [ + q(0270), + q(1), + ], + q(mandingo) => [ + q(0270), + q(0), + ], + q(mandinka) => [ + q(4416), + q(0), + ], + q(mandjak) => [ + q(4238), + q(0), + ], + q(mandobo atas) => [ + q(0558), + q(0), + ], + q(mandobo bawah) => [ + q(1556), + q(0), + ], + q(manem) => [ + q(3081), + q(0), + ], + q(mang) => [ + q(7889), + q(0), + ], + q(manga kanuri) => [ + q(3206), + q(0), + ], + q(mangala) => [ + q(4205), + q(0), + ], + q(mangarayi) => [ + q(4451), + q(0), + ], + q(mangareva) => [ + q(4519), + q(0), + ], + q(mangas) => [ + q(7891), + q(0), + ], + q(mangayat) => [ + q(4674), + q(0), + ], + q(mangbetu) => [ + q(4179), + q(0), + ], + q(mangbutu) => [ + q(4180), + q(0), + ], + q(mangerr) => [ + q(7865), + q(0), + ], + q(mangga buang) => [ + q(4397), + q(0), + ], + q(manggarai) => [ + q(4497), + q(0), + ], + q(mango) => [ + q(4246), + q(0), + ], + q(mangole) => [ + q(4476), + q(0), + ], + q(mangseng) => [ + q(4126), + q(0), + ], + q(mangue) => [ + q(4438), + q(0), + ], + q(manichaean middle persian) => [ + q(7404), + q(0), + ], + q(manide) => [ + q(0563), + q(0), + ], + q(manikion) => [ + q(4427), + q(0), + ], + q(manipa) => [ + q(4488), + q(0), + ], + q(manipuri) => [ + q(0287), + q(0), + ], + q(mankanya) => [ + q(3482), + q(0), + ], + q(manna-dora) => [ + q(4331), + q(0), + ], + q(mannan) => [ + q(4332), + q(0), + ], + q(mano) => [ + q(4213), + q(0), + ], + q(manobo languages) => [ + q(0288), + q(0), + ], + q(manombai) => [ + q(7193), + q(0), + ], + q(mansaka) => [ + q(4533), + q(0), + ], + q(mansi) => [ + q(4423), + q(0), + ], + q(mansoanka) => [ + q(4544), + q(0), + ], + q(manta) => [ + q(4671), + q(0), + ], + q(mantsi) => [ + q(5097), + q(0), + ], + q(manumanaw) => [ + q(3715), + q(1), + ], + q(manumanaw karen) => [ + q(3715), + q(0), + ], + q(manusela) => [ + q(7109), + q(1), + ], + q(manx) => [ + q(0157), + q(0), + ], + q(manya) => [ + q(4695), + q(0), + ], + q(manyawa) => [ + q(4428), + q(0), + ], + q(manyika) => [ + q(4642), + q(0), + ], + q(manza) => [ + q(4707), + q(0), + ], + q(mao naga) => [ + q(4739), + q(0), + ], + q(maonan) => [ + q(4386), + q(0), + ], + q(maore comorian) => [ + q(6288), + q(0), + ], + q(maori) => [ + q(0271), + q(0), + ], + q(mape) => [ + q(4366), + q(0), + ], + q(mapena) => [ + q(4418), + q(0), + ], + q(mapia) => [ + q(4472), + q(0), + ], + q(mapidian) => [ + q(4470), + q(0), + ], + q(mapos buang) => [ + q(1619), + q(0), + ], + q(mapoyo) => [ + q(4151), + q(0), + ], + q(mapuche) => [ + q(0025), + q(1), + ], + q(mapudungun) => [ + q(0025), + q(0), + ], + q(mapun) => [ + q(6053), + q(0), + ], + q(maquiritari) => [ + q(4152), + q(0), + ], + q(mara) => [ + q(4196), + q(0), + ], + q(mara chin) => [ + q(4506), + q(0), + ], + q(marachi) => [ + q(4037), + q(0), + ], + q(maraghei) => [ + q(7010), + q(0), + ], + q(maragus) => [ + q(4516), + q(0), + ], + q(maram naga) => [ + q(4955), + q(0), + ], + q(marama) => [ + q(4040), + q(0), + ], + q(maramba) => [ + q(4668), + q(0), + ], + q(maranao) => [ + q(4520), + q(0), + ], + q(marangis) => [ + q(7060), + q(1), + ], + q(maranunggu) => [ + q(7878), + q(0), + ], + q(mararit) => [ + q(4243), + q(0), + ], + q(marathi) => [ + q(0273), + q(0), + ], + q(marau) => [ + q(4609), + q(0), + ], + q(marba) => [ + q(4454), + q(0), + ], + q(maremgi) => [ + q(4521), + q(0), + ], + q(marenje) => [ + q(7018), + q(0), + ], + q(marfa) => [ + q(4612), + q(0), + ], + q(margany) => [ + q(7863), + q(0), + ], + q(marghi central) => [ + q(4517), + q(0), + ], + q(marghi south) => [ + q(4229), + q(0), + ], + q(margos-yarowilca-lauricocha quechua) => [ + q(5698), + q(0), + ], + q(margu) => [ + q(4273), + q(0), + ], + q(mari) => [ + q(0081), + q(0), + ], + q(mari (east sepik province)) => [ + q(4142), + q(0), + ], + q(mari (madang province)) => [ + q(2808), + q(0), + ], + q(mari (russia)) => [ + q(0081), + q(1), + ], + q(maria (india)) => [ + q(4515), + q(0), + ], + q(maria (papua new guinea)) => [ + q(4186), + q(0), + ], + q(maricopa) => [ + q(4501), + q(0), + ], + q(maridan) => [ + q(7864), + q(0), + ], + q(maridjabin) => [ + q(7870), + q(0), + ], + q(marik) => [ + q(1934), + q(0), + ], + q(marimanindji) => [ + q(7873), + q(0), + ], + q(marind) => [ + q(4523), + q(0), + ], + q(maring) => [ + q(4141), + q(0), + ], + q(maring naga) => [ + q(4987), + q(0), + ], + q(maringarr) => [ + q(7880), + q(0), + ], + q(marino) => [ + q(4500), + q(0), + ], + q(mariri) => [ + q(4481), + q(0), + ], + q(marithiel) => [ + q(4234), + q(0), + ], + q(maritime sign language) => [ + q(5075), + q(0), + ], + q(maritsaua) => [ + q(4538), + q(0), + ], + q(mariyedi) => [ + q(7885), + q(0), + ], + q(marka) => [ + q(5792), + q(0), + ], + q(markweeta) => [ + q(2261), + q(0), + ], + q(marma) => [ + q(5818), + q(0), + ], + q(marovo) => [ + q(4606), + q(0), + ], + q(marriammu) => [ + q(7472), + q(0), + ], + q(marrucinian) => [ + q(6888), + q(0), + ], + q(marshallese) => [ + q(0266), + q(0), + ], + q(marsian) => [ + q(2965), + q(0), + ], + q(martha's vineyard sign language) => [ + q(4503), + q(0), + ], + q(marti ke) => [ + q(7867), + q(0), + ], + q(martu wangka) => [ + q(4457), + q(0), + ], + q(martuyhunira) => [ + q(7003), + q(0), + ], + q(maru) => [ + q(4288), + q(0), + ], + q(marubo) => [ + q(4703), + q(0), + ], + q(marwari) => [ + q(0296), + q(0), + ], + q(marwari (india)) => [ + q(5869), + q(0), + ], + q(marwari (pakistan)) => [ + q(4597), + q(0), + ], + q(masaaba) => [ + q(4684), + q(0), + ], + q(masadiit itneg) => [ + q(6518), + q(0), + ], + q(masai) => [ + q(0274), + q(0), + ], + q(masalit) => [ + q(4377), + q(0), + ], + q(masana) => [ + q(4158), + q(0), + ], + q(masbatenyo) => [ + q(4524), + q(0), + ], + q(mashco piro) => [ + q(1904), + q(0), + ], + q(mashi (nigeria)) => [ + q(3123), + q(0), + ], + q(mashi (zambia)) => [ + q(4280), + q(0), + ], + q(masikoro malagasy) => [ + q(4530), + q(0), + ], + q(masimasi) => [ + q(3002), + q(0), + ], + q(masiwang) => [ + q(1333), + q(0), + ], + q(maskelynes) => [ + q(3447), + q(0), + ], + q(maslam) => [ + q(4543), + q(0), + ], + q(masmaje) => [ + q(4210), + q(0), + ], + q(massalat) => [ + q(4176), + q(0), + ], + q(massep) => [ + q(4610), + q(0), + ], + q(matagalpa) => [ + q(4561), + q(0), + ], + q(matal) => [ + q(4224), + q(0), + ], + q(matbat) => [ + q(7410), + q(0), + ], + q(matengo) => [ + q(4263), + q(0), + ], + q(matepi) => [ + q(4477), + q(0), + ], + q(matigsalug manobo) => [ + q(4138), + q(0), + ], + q(matipuhy) => [ + q(4700), + q(0), + ], + q(matis) => [ + q(4464), + q(0), + ], + q(mato) => [ + q(4211), + q(0), + ], + q(mato grosso arara) => [ + q(0988), + q(0), + ], + q(mator) => [ + q(4560), + q(0), + ], + q(matses) => [ + q(4150), + q(0), + ], + q(mattoki) => [ + q(7430), + q(1), + ], + q(mattole) => [ + q(4595), + q(0), + ], + q(matu chin) => [ + q(2772), + q(0), + ], + q(matukar) => [ + q(4321), + q(0), + ], + q(matumbi) => [ + q(4264), + q(0), + ], + q(matya samo) => [ + q(6251), + q(0), + ], + q(maung) => [ + q(4455), + q(0), + ], + q(mauritian sign language) => [ + q(4060), + q(0), + ], + q(mauwake) => [ + q(4277), + q(0), + ], + q(mawa (chad)) => [ + q(4167), + q(0), + ], + q(mawa (nigeria)) => [ + q(7154), + q(0), + ], + q(mawak) => [ + q(4320), + q(0), + ], + q(mawan) => [ + q(4170), + q(0), + ], + q(mawayana) => [ + q(4709), + q(0), + ], + q(mawchi) => [ + q(4340), + q(0), + ], + q(mawes) => [ + q(4252), + q(0), + ], + q(mawukakan) => [ + q(4663), + q(1), + ], + q(maxakali) => [ + q(4130), + q(0), + ], + q(maxi gbe) => [ + q(4651), + q(0), + ], + q(maya samo) => [ + q(6328), + q(0), + ], + q(mayaguduna) => [ + q(7415), + q(0), + ], + q(mayan languages) => [ + q(0297), + q(0), + ], + q(mayangna) => [ + q(7573), + q(0), + ], + q(mayawali) => [ + q(7779), + q(0), + ], + q(mayeka) => [ + q(4667), + q(0), + ], + q(mayi-kulan) => [ + q(7553), + q(0), + ], + q(mayi-thakurti) => [ + q(7555), + q(0), + ], + q(mayi-yapi) => [ + q(7552), + q(0), + ], + q(mayo) => [ + q(4241), + q(0), + ], + q(mayogo) => [ + q(4182), + q(0), + ], + q(mayoyao ifugao) => [ + q(2915), + q(0), + ], + q(mazagway) => [ + q(2071), + q(0), + ], + q(mazaltepec zapotec) => [ + q(7923), + q(0), + ], + q(mazanderani) => [ + q(4699), + q(0), + ], + q(mazatlan mazatec) => [ + q(7025), + q(0), + ], + q(mazatlan mixe) => [ + q(4697), + q(0), + ], + q(mba) => [ + q(4219), + q(0), + ], + q(mbala) => [ + q(4184), + q(0), + ], + q(mbalanhu) => [ + q(3991), + q(0), + ], + q(mbandja) => [ + q(7886), + q(0), + ], + q(mbangala) => [ + q(4646), + q(0), + ], + q(mbangi) => [ + q(4255), + q(0), + ], + q(mbangwe) => [ + q(7874), + q(0), + ], + q(mbara (australia)) => [ + q(4603), + q(0), + ], + q(mbara (chad)) => [ + q(4458), + q(0), + ], + q(mbariman-gudhinma) => [ + q(7882), + q(0), + ], + q(mbati) => [ + q(4183), + q(0), + ], + q(mbato) => [ + q(2676), + q(0), + ], + q(mbay) => [ + q(4666), + q(0), + ], + q(mbe) => [ + q(4231), + q(0), + ], + q(mbe') => [ + q(4558), + q(0), + ], + q(mbelime) => [ + q(4484), + q(0), + ], + q(mbere) => [ + q(4187), + q(0), + ], + q(mbesa) => [ + q(7879), + q(0), + ], + q(mbo (cameroon)) => [ + q(4133), + q(0), + ], + q(mbo (democratic republic of congo)) => [ + q(7883), + q(0), + ], + q(mboi) => [ + q(4435), + q(0), + ], + q(mboko) => [ + q(4188), + q(0), + ], + q(mbole) => [ + q(4185), + q(0), + ], + q(mbonga) => [ + q(7393), + q(0), + ], + q(mbongno) => [ + q(1180), + q(0), + ], + q(mbosi) => [ + q(4190), + q(0), + ], + q(mbowe) => [ + q(4654), + q(0), + ], + q(mbre) => [ + q(4337), + q(0), + ], + q(mbudum) => [ + q(7395), + q(0), + ], + q(mbugu) => [ + q(4270), + q(0), + ], + q(mbugwe) => [ + q(4266), + q(0), + ], + q(mbuko) => [ + q(4475), + q(0), + ], + q(mbukushu) => [ + q(4287), + q(0), + ], + q(mbula) => [ + q(4408), + q(0), + ], + q(mbula-bwazza) => [ + q(4139), + q(0), + ], + q(mbule) => [ + q(4362), + q(0), + ], + q(mbulungish) => [ + q(4140), + q(0), + ], + q(mbum) => [ + q(4174), + q(0), + ], + q(mbunda) => [ + q(4155), + q(0), + ], + q(mbunga) => [ + q(4265), + q(0), + ], + q(mburku) => [ + q(1058), + q(0), + ], + q(mbwela) => [ + q(4237), + q(0), + ], + q(mbya guarani) => [ + q(2652), + q(0), + ], + q(me'en) => [ + q(4677), + q(0), + ], + q(mea) => [ + q(1737), + q(2), + ], + q(medebur) => [ + q(4323), + q(0), + ], + q(media lengua) => [ + q(4577), + q(0), + ], + q(mediak) => [ + q(4637), + q(0), + ], + q(median) => [ + q(7396), + q(0), + ], + q(mednyj aleut) => [ + q(4576), + q(0), + ], + q(medumba) => [ + q(1608), + q(0), + ], + q(mefele) => [ + q(4226), + q(0), + ], + q(megam) => [ + q(4199), + q(0), + ], + q(megleno romanian) => [ + q(5860), + q(0), + ], + q(mehek) => [ + q(5121), + q(0), + ], + q(mehinaku) => [ + q(4390), + q(0), + ], + q(mehri) => [ + q(2465), + q(0), + ], + q(mekeo) => [ + q(4203), + q(0), + ], + q(mekmek) => [ + q(4602), + q(0), + ], + q(mekwei) => [ + q(4528), + q(0), + ], + q(mele-fila) => [ + q(4644), + q(0), + ], + q(melo) => [ + q(4240), + q(0), + ], + q(melpa) => [ + q(4197), + q(0), + ], + q(memoni) => [ + q(4143), + q(0), + ], + q(mendalam kayan) => [ + q(7358), + q(0), + ], + q(mendankwe-nkwen) => [ + q(4220), + q(0), + ], + q(mende) => [ + q(0278), + q(0), + ], + q(mende (papua new guinea)) => [ + q(6035), + q(0), + ], + q(mende (sierra leone)) => [ + q(0278), + q(1), + ], + q(mengaka) => [ + q(7398), + q(0), + ], + q(mengen) => [ + q(4198), + q(0), + ], + q(mengisa) => [ + q(4164), + q(0), + ], + q(menik) => [ + q(6611), + q(0), + ], + q(menka) => [ + q(4194), + q(0), + ], + q(menominee) => [ + q(4216), + q(0), + ], + q(mentawai) => [ + q(4635), + q(0), + ], + q(menya) => [ + q(4162), + q(0), + ], + q(meoswar) => [ + q(4615), + q(0), + ], + q(mer) => [ + q(4424), + q(0), + ], + q(meramera) => [ + q(4652), + q(0), + ], + q(merei) => [ + q(3968), + q(0), + ], + q(merey) => [ + q(4208), + q(0), + ], + q(meriam) => [ + q(6881), + q(0), + ], + q(merlav) => [ + q(4510), + q(0), + ], + q(meroitic) => [ + q(7408), + q(0), + ], + q(meru) => [ + q(4209), + q(0), + ], + q(merwari) => [ + q(7217), + q(0), + ], + q(mesaka) => [ + q(3034), + q(0), + ], + q(mescalero-chiricahua apache) => [ + q(0846), + q(0), + ], + q(mese) => [ + q(4153), + q(0), + ], + q(meskwaki) => [ + q(5878), + q(0), + ], + q(mesme) => [ + q(7838), + q(0), + ], + q(mesmes) => [ + q(4681), + q(0), + ], + q(mesopotamian arabic) => [ + q(0592), + q(0), + ], + q(mesqan) => [ + q(4617), + q(0), + ], + q(messapic) => [ + q(1790), + q(0), + ], + q(meta') => [ + q(4256), + q(0), + ], + q(metlatonoc mixtec) => [ + q(4661), + q(0), + ], + q(mewari) => [ + q(4565), + q(0), + ], + q(mewati) => [ + q(7231), + q(0), + ], + q(mexican sign language) => [ + q(4235), + q(0), + ], + q(meyah) => [ + q(4202), + q(0), + ], + q(mezontla popoloca) => [ + q(5362), + q(0), + ], + q(mezquital otomi) => [ + q(5314), + q(0), + ], + q(mfinu) => [ + q(7866), + q(0), + ], + q(mfumte) => [ + q(4827), + q(0), + ], + q(mgbolizhia) => [ + q(2564), + q(0), + ], + q(mi'kmaq) => [ + q(0280), + q(0), + ], + q(miahuatlan zapotec) => [ + q(7802), + q(0), + ], + q(miami) => [ + q(4291), + q(0), + ], + q(mian) => [ + q(4467), + q(0), + ], + q(miani) => [ + q(5483), + q(0), + ], + q(michif) => [ + q(1844), + q(0), + ], + q(michigamea) => [ + q(1786), + q(0), + ], + q(michoacan mazahua) => [ + q(4385), + q(0), + ], + q(michoacan nahuatl) => [ + q(4765), + q(0), + ], + q(micmac) => [ + q(0280), + q(1), + ], + q(mid grand valley dani) => [ + q(2102), + q(0), + ], + q(mid-southern banda) => [ + q(1244), + q(0), + ], + q(middle armenian) => [ + q(0991), + q(0), + ], + q(middle breton) => [ + q(7287), + q(0), + ], + q(middle cornish) => [ + q(1805), + q(0), + ], + q(middle dutch (ca. 1050-1350)) => [ + q(0116), + q(1), + ], + q(middle english (1100-1500)) => [ + q(0125), + q(1), + ], + q(middle french (ca. 1400-1600)) => [ + q(0139), + q(1), + ], + q(middle high german (ca. 1050-1500)) => [ + q(0158), + q(1), + ], + q(middle hittite) => [ + q(2848), + q(0), + ], + q(middle irish (900-1200)) => [ + q(0279), + q(1), + ], + q(middle korean (10th-16th cent.)) => [ + q(5230), + q(0), + ], + q(middle low german) => [ + q(2557), + q(0), + ], + q(middle mongolian) => [ + q(7419), + q(0), + ], + q(middle newar) => [ + q(5135), + q(0), + ], + q(middle watut) => [ + q(4459), + q(0), + ], + q(middle welsh) => [ + q(7145), + q(0), + ], + q(midob) => [ + q(4201), + q(0), + ], + q(migaama) => [ + q(4406), + q(0), + ], + q(migabac) => [ + q(4463), + q(0), + ], + q(migum) => [ + q(3438), + q(0), + ], + q(miji) => [ + q(6052), + q(1), + ], + q(miju-mishmi) => [ + q(4649), + q(0), + ], + q(mikasuki) => [ + q(4300), + q(0), + ], + q(mili) => [ + q(7678), + q(0), + ], + q(miltu) => [ + q(4368), + q(0), + ], + q(miluk) => [ + q(2961), + q(0), + ], + q(milyan) => [ + q(2966), + q(0), + ], + q(min bei chinese) => [ + q(4420), + q(0), + ], + q(min dong chinese) => [ + q(1698), + q(0), + ], + q(min nan chinese) => [ + q(4722), + q(0), + ], + q(min zhong chinese) => [ + q(1930), + q(0), + ], + q(mina (cameroon)) => [ + q(2797), + q(0), + ], + q(mina (india)) => [ + q(4673), + q(0), + ], + q(minaean) => [ + q(2971), + q(0), + ], + q(minang) => [ + q(7465), + q(0), + ], + q(minangkabau) => [ + q(0281), + q(0), + ], + q(minanibai) => [ + q(4166), + q(0), + ], + q(minaveha) => [ + q(4605), + q(0), + ], + q(minderico) => [ + q(2129), + q(0), + ], + q(mindiri) => [ + q(4461), + q(0), + ], + q(mingang doso) => [ + q(4349), + q(0), + ], + q(mingrelian) => [ + q(7397), + q(0), + ], + q(minica huitoto) => [ + q(2845), + q(0), + ], + q(minidien) => [ + q(7119), + q(0), + ], + q(minigir) => [ + q(1571), + q(1), + ], + q(minjungbal) => [ + q(7353), + q(0), + ], + q(minkin) => [ + q(7547), + q(0), + ], + q(minoan) => [ + q(5254), + q(0), + ], + q(minokok) => [ + q(4489), + q(0), + ], + q(minriq) => [ + q(4421), + q(0), + ], + q(mintil) => [ + q(4705), + q(0), + ], + q(minz zhuang) => [ + q(7826), + q(0), + ], + q(miqie) => [ + q(7641), + q(0), + ], + q(mirandese) => [ + q(0295), + q(0), + ], + q(miraya bikol) => [ + q(5751), + q(0), + ], + q(mirgan) => [ + q(7927), + q(0), + ], + q(miriti) => [ + q(4403), + q(0), + ], + q(miriwoong sign language) => [ + q(5845), + q(0), + ], + q(miriwung) => [ + q(4207), + q(0), + ], + q(miship) => [ + q(4329), + q(0), + ], + q(misima-panaeati) => [ + q(4471), + q(0), + ], + q(mising) => [ + q(4505), + q(0), + ], + q(miskito) => [ + q(4305), + q(0), + ], + q(mitla zapotec) => [ + q(7810), + q(0), + ], + q(mitlatongo mixtec) => [ + q(7015), + q(0), + ], + q(mittu) => [ + q(4634), + q(0), + ], + q(mituku) => [ + q(7877), + q(0), + ], + q(miu) => [ + q(4462), + q(0), + ], + q(miwa) => [ + q(7011), + q(0), + ], + q(mixed great andamanese) => [ + q(2397), + q(0), + ], + q(mixtepec mixtec) => [ + q(4310), + q(0), + ], + q(mixtepec zapotec) => [ + q(7911), + q(0), + ], + q(miya) => [ + q(4341), + q(0), + ], + q(miyako) => [ + q(4601), + q(0), + ], + q(miyobe) => [ + q(6165), + q(0), + ], + q(mlabri) => [ + q(4499), + q(0), + ], + q(mlahso) => [ + q(3898), + q(0), + ], + q(mlap) => [ + q(3375), + q(0), + ], + q(mlomp) => [ + q(4373), + q(0), + ], + q(mmaala) => [ + q(4402), + q(0), + ], + q(mmen) => [ + q(1149), + q(0), + ], + q(mo) => [ + q(7133), + q(1), + ], + q(mo'da) => [ + q(2430), + q(0), + ], + q(moabite) => [ + q(5187), + q(0), + ], + q(moba) => [ + q(4233), + q(0), + ], + q(mobilian) => [ + q(4432), + q(0), + ], + q(mobumrin aizi) => [ + q(0685), + q(0), + ], + q(mobwa karen) => [ + q(3108), + q(0), + ], + q(mocheno) => [ + q(4279), + q(0), + ], + q(mochi) => [ + q(5239), + q(0), + ], + q(mochica) => [ + q(5249), + q(0), + ], + q(mocho) => [ + q(4269), + q(0), + ], + q(mocovi) => [ + q(4431), + q(0), + ], + q(modang) => [ + q(4643), + q(0), + ], + q(modern greek (1453-)) => [ + q(0165), + q(2), + ], + q(modole) => [ + q(4487), + q(0), + ], + q(moere) => [ + q(4608), + q(0), + ], + q(mofu-gudur) => [ + q(4295), + q(0), + ], + q(mogholi) => [ + q(4275), + q(0), + ], + q(mogofin) => [ + q(4223), + q(0), + ], + q(mogum) => [ + q(4443), + q(0), + ], + q(mohave) => [ + q(4444), + q(0), + ], + q(mohawk) => [ + q(0289), + q(0), + ], + q(mohegan-pequot) => [ + q(7453), + q(0), + ], + q(moi (congo)) => [ + q(4445), + q(0), + ], + q(moi (indonesia)) => [ + q(4653), + q(0), + ], + q(moikodi) => [ + q(4350), + q(0), + ], + q(moingi) => [ + q(4639), + q(0), + ], + q(moji) => [ + q(7679), + q(0), + ], + q(mok) => [ + q(4492), + q(0), + ], + q(moken) => [ + q(4633), + q(0), + ], + q(mokerang) => [ + q(4236), + q(0), + ], + q(mokilese) => [ + q(4344), + q(0), + ], + q(moklen) => [ + q(4347), + q(0), + ], + q(mokole) => [ + q(4346), + q(0), + ], + q(mokpwe) => [ + q(1429), + q(0), + ], + q(moksela) => [ + q(7019), + q(0), + ], + q(moksha) => [ + q(0276), + q(0), + ], + q(molale) => [ + q(4124), + q(0), + ], + q(molbog) => [ + q(5656), + q(0), + ], + q(moldavian) => [ + q(0361), + q(1), + ], + q(moldova sign language) => [ + q(7033), + q(0), + ], + q(moldovan) => [ + q(0361), + q(2), + ], + q(molengue) => [ + q(1568), + q(0), + ], + q(molima) => [ + q(4446), + q(0), + ], + q(molmo one) => [ + q(0945), + q(0), + ], + q(molo) => [ + q(7875), + q(0), + ], + q(molof) => [ + q(4534), + q(0), + ], + q(moloko) => [ + q(4380), + q(0), + ], + q(mom jango) => [ + q(6979), + q(0), + ], + q(moma) => [ + q(4676), + q(0), + ], + q(momare) => [ + q(4547), + q(0), + ], + q(mombo dogon) => [ + q(2077), + q(0), + ], + q(mombum) => [ + q(4537), + q(0), + ], + q(momina) => [ + q(4384), + q(0), + ], + q(momuna) => [ + q(4478), + q(0), + ], + q(mon) => [ + q(4426), + q(0), + ], + q(mon-khmer languages) => [ + q(0283), + q(0), + ], + q(monastic sign language) => [ + q(4692), + q(0), + ], + q(monde) => [ + q(4410), + q(0), + ], + q(mondropolon) => [ + q(5031), + q(0), + ], + q(mong) => [ + q(0180), + q(1), + ], + q(mong leng) => [ + q(2802), + q(1), + ], + q(mong njua) => [ + q(2802), + q(2), + ], + q(mongo) => [ + q(0253), + q(0), + ], + q(mongol) => [ + q(4261), + q(0), + ], + q(mongolia buriat) => [ + q(1578), + q(0), + ], + q(mongolian) => [ + q(0290), + q(0), + ], + q(mongolian languages) => [ + q(0532), + q(0), + ], + q(mongolian sign language) => [ + q(4540), + q(0), + ], + q(mongondow) => [ + q(4434), + q(0), + ], + q(moni) => [ + q(4429), + q(0), + ], + q(mono (cameroon)) => [ + q(4518), + q(0), + ], + q(mono (democratic republic of congo)) => [ + q(4414), + q(0), + ], + q(mono (solomon islands)) => [ + q(4552), + q(0), + ], + q(mono (usa)) => [ + q(4422), + q(0), + ], + q(monom) => [ + q(4439), + q(0), + ], + q(monsang naga) => [ + q(4962), + q(0), + ], + q(montagnais) => [ + q(4433), + q(0), + ], + q(montenegrin) => [ + q(0090), + q(0), + ], + q(montol) => [ + q(4559), + q(0), + ], + q(monumbo) => [ + q(4650), + q(0), + ], + q(monzombo) => [ + q(4436), + q(0), + ], + q(moo) => [ + q(2682), + q(0), + ], + q(moose cree) => [ + q(1849), + q(0), + ], + q(mopan maya) => [ + q(4440), + q(0), + ], + q(mor (bomberai peninsula)) => [ + q(4441), + q(0), + ], + q(mor (mor islands)) => [ + q(4290), + q(0), + ], + q(moraid) => [ + q(4529), + q(0), + ], + q(morawa) => [ + q(4691), + q(0), + ], + q(morelos nahuatl) => [ + q(4863), + q(0), + ], + q(morerebi) => [ + q(7405), + q(0), + ], + q(moresada) => [ + q(4545), + q(0), + ], + q(mori atas) => [ + q(4702), + q(0), + ], + q(mori bawah) => [ + q(7416), + q(0), + ], + q(morigi) => [ + q(4172), + q(0), + ], + q(morisyen) => [ + q(4221), + q(0), + ], + q(moro) => [ + q(4442), + q(0), + ], + q(moroccan arabic) => [ + q(0884), + q(0), + ], + q(moroccan sign language) => [ + q(7409), + q(0), + ], + q(morokodo) => [ + q(4244), + q(0), + ], + q(morom) => [ + q(1104), + q(0), + ], + q(moronene) => [ + q(4486), + q(0), + ], + q(morori) => [ + q(4437), + q(0), + ], + q(morouas) => [ + q(4513), + q(0), + ], + q(mortlockese) => [ + q(4509), + q(0), + ], + q(moru) => [ + q(4245), + q(0), + ], + q(mosimo) => [ + q(4494), + q(0), + ], + q(mosiro) => [ + q(4638), + q(0), + ], + q(moskona) => [ + q(4557), + q(0), + ], + q(mossi) => [ + q(0291), + q(0), + ], + q(mota) => [ + q(4567), + q(0), + ], + q(motlav) => [ + q(4379), + q(0), + ], + q(motu) => [ + q(4212), + q(0), + ], + q(mouk-aria) => [ + q(4624), + q(0), + ], + q(mountain koiali) => [ + q(3541), + q(0), + ], + q(mouwase) => [ + q(3124), + q(0), + ], + q(movima) => [ + q(4701), + q(0), + ], + q(moyadan itneg) => [ + q(3022), + q(0), + ], + q(moyon naga) => [ + q(4969), + q(0), + ], + q(mozambican sign language) => [ + q(4710), + q(0), + ], + q(mozarabic) => [ + q(4648), + q(0), + ], + q(mpade) => [ + q(4456), + q(0), + ], + q(mpalitjanh) => [ + q(7447), + q(0), + ], + q(mpi) => [ + q(4473), + q(0), + ], + q(mpiemo) => [ + q(4168), + q(0), + ], + q(mpoto) => [ + q(4449), + q(0), + ], + q(mpotovoro) => [ + q(4611), + q(0), + ], + q(mpumpong) => [ + q(4248), + q(0), + ], + q(mpuono) => [ + q(7876), + q(0), + ], + q(mpur) => [ + q(0724), + q(0), + ], + q(mro-khimi chin) => [ + q(1789), + q(0), + ], + q(mru) => [ + q(4512), + q(0), + ], + q(mser) => [ + q(3567), + q(0), + ], + q(mt. iraya agta) => [ + q(0919), + q(0), + ], + q(mt. iriga agta) => [ + q(0677), + q(0), + ], + q(muak sa-aak) => [ + q(6867), + q(0), + ], + q(mualang) => [ + q(4551), + q(0), + ], + q(mubami) => [ + q(6716), + q(0), + ], + q(mubi) => [ + q(4574), + q(0), + ], + q(muda) => [ + q(7675), + q(0), + ], + q(mudburra) => [ + q(2090), + q(0), + ], + q(mudhili gadaba) => [ + q(2415), + q(0), + ], + q(mudu koraga) => [ + q(7006), + q(0), + ], + q(muduga) => [ + q(6847), + q(0), + ], + q(mufian) => [ + q(0824), + q(0), + ], + q(mugom) => [ + q(4582), + q(0), + ], + q(muinane) => [ + q(1320), + q(0), + ], + q(mukha-dora) => [ + q(4393), + q(0), + ], + q(mukulu) => [ + q(4448), + q(0), + ], + q(mulaha) => [ + q(4239), + q(0), + ], + q(mulam) => [ + q(4371), + q(0), + ], + q(mulao) => [ + q(2524), + q(0), + ], + q(mulgi) => [ + q(4600), + q(0), + ], + q(mullu kurumba) => [ + q(3521), + q(0), + ], + q(mullukmulluk) => [ + q(4450), + q(0), + ], + q(multiple languages) => [ + q(0292), + q(0), + ], + q(muluridyi) => [ + q(7020), + q(0), + ], + q(mum) => [ + q(3544), + q(0), + ], + q(mumuye) => [ + q(4698), + q(0), + ], + q(mun chin) => [ + q(4631), + q(0), + ], + q(muna) => [ + q(4409), + q(0), + ], + q(munda) => [ + q(6907), + q(0), + ], + q(munda languages) => [ + q(0293), + q(0), + ], + q(mundabli) => [ + q(1354), + q(0), + ], + q(mundang) => [ + q(4573), + q(0), + ], + q(mundani) => [ + q(4412), + q(0), + ], + q(mundari) => [ + q(6905), + q(0), + ], + q(mundat) => [ + q(4388), + q(0), + ], + q(mundu) => [ + q(4579), + q(0), + ], + q(munduruku) => [ + q(4682), + q(0), + ], + q(mungaka) => [ + q(4276), + q(0), + ], + q(mungbam) => [ + q(4299), + q(1), + ], + q(munggui) => [ + q(4555), + q(0), + ], + q(mungkip) => [ + q(4469), + q(0), + ], + q(muniche) => [ + q(4680), + q(0), + ], + q(munit) => [ + q(4550), + q(0), + ], + q(munji) => [ + q(4415), + q(0), + ], + q(munsee) => [ + q(6898), + q(0), + ], + q(muong) => [ + q(4564), + q(0), + ], + q(mur pano) => [ + q(6549), + q(0), + ], + q(muratayak) => [ + q(0907), + q(0), + ], + q(murik (malaysia)) => [ + q(4657), + q(0), + ], + q(murik (papua new guinea)) => [ + q(4553), + q(0), + ], + q(murkim) => [ + q(5802), + q(0), + ], + q(murle) => [ + q(4587), + q(0), + ], + q(murrinh-patha) => [ + q(4622), + q(0), + ], + q(mursi) => [ + q(4593), + q(0), + ], + q(murui huitoto) => [ + q(2866), + q(0), + ], + q(murupi) => [ + q(4495), + q(0), + ], + q(muruwari) => [ + q(7881), + q(0), + ], + q(musak) => [ + q(4399), + q(0), + ], + q(musar) => [ + q(4391), + q(0), + ], + q(musasa) => [ + q(6114), + q(0), + ], + q(musey) => [ + q(4527), + q(0), + ], + q(musgu) => [ + q(4578), + q(0), + ], + q(mushungulu) => [ + q(7392), + q(0), + ], + q(musi) => [ + q(4580), + q(0), + ], + q(muskum) => [ + q(4316), + q(0), + ], + q(muslim tat) => [ + q(6738), + q(0), + ], + q(musom) => [ + q(4542), + q(0), + ], + q(mussau-emira) => [ + q(2250), + q(0), + ], + q(muthuvan) => [ + q(4590), + q(0), + ], + q(mutu) => [ + q(6746), + q(0), + ], + q(muya) => [ + q(4604), + q(0), + ], + q(muyang) => [ + q(4592), + q(0), + ], + q(muyuw) => [ + q(4683), + q(0), + ], + q(muzi) => [ + q(7690), + q(0), + ], + q(mvanip) => [ + q(4154), + q(0), + ], + q(mvuba) => [ + q(4647), + q(0), + ], + q(mwaghavul) => [ + q(6274), + q(0), + ], + q(mwali comorian) => [ + q(7139), + q(0), + ], + q(mwan) => [ + q(4430), + q(0), + ], + q(mwani) => [ + q(7166), + q(0), + ], + q(mwatebu) => [ + q(4618), + q(0), + ], + q(mwera (chimwera)) => [ + q(4621), + q(0), + ], + q(mwera (nyasa)) => [ + q(4318), + q(0), + ], + q(mwerlap) => [ + q(4510), + q(1), + ], + q(mwimbi-muthambi) => [ + q(4632), + q(0), + ], + q(mwotlap) => [ + q(4379), + q(1), + ], + q(mycenaean greek) => [ + q(2563), + q(0), + ], + q(myene) => [ + q(4669), + q(0), + ], + q(mysian) => [ + q(7688), + q(0), + ], + q(mzieme naga) => [ + q(4959), + q(0), + ], + q(n'ko) => [ + q(0318), + q(0), + ], + q(n/u) => [ + q(4834), + q(0), + ], + q(na) => [ + q(4749), + q(0), + ], + q(na-dene languages) => [ + q(0533), + q(0), + ], + q(na-meo) => [ + q(4813), + q(0), + ], + q(naaba) => [ + q(4723), + q(0), + ], + q(naami) => [ + q(1633), + q(0), + ], + q(naasioi) => [ + q(4726), + q(0), + ], + q(naba) => [ + q(4411), + q(0), + ], + q(nabak) => [ + q(4716), + q(0), + ], + q(nabi) => [ + q(4572), + q(0), + ], + q(nachering) => [ + q(4757), + q(0), + ], + q(nadeb) => [ + q(4128), + q(0), + ], + q(nadruvian) => [ + q(4781), + q(0), + ], + q(nafaanra) => [ + q(4826), + q(0), + ], + q(nafi) => [ + q(6202), + q(0), + ], + q(nafri) => [ + q(5150), + q(0), + ], + q(nafusi) => [ + q(3063), + q(0), + ], + q(naga pidgin) => [ + q(4717), + q(0), + ], + q(nagarchal) => [ + q(4737), + q(0), + ], + q(nage) => [ + q(5139), + q(0), + ], + q(nagumi) => [ + q(4848), + q(0), + ], + q(naha'ai) => [ + q(4381), + q(1), + ], + q(nahali) => [ + q(4952), + q(0), + ], + q(nahari) => [ + q(4860), + q(0), + ], + q(nahavaq) => [ + q(6139), + q(1), + ], + q(nahuatl languages) => [ + q(0299), + q(0), + ], + q(nai) => [ + q(1220), + q(0), + ], + q(najdi arabic) => [ + q(0880), + q(0), + ], + q(naka'ela) => [ + q(4715), + q(0), + ], + q(nakai) => [ + q(4924), + q(0), + ], + q(nakame) => [ + q(4876), + q(0), + ], + q(nakanai) => [ + q(4719), + q(0), + ], + q(nakara) => [ + q(4764), + q(0), + ], + q(nake) => [ + q(4741), + q(0), + ], + q(naki) => [ + q(4222), + q(0), + ], + q(nakwi) => [ + q(4729), + q(0), + ], + q(nalca) => [ + q(4940), + q(0), + ], + q(nali) => [ + q(5076), + q(0), + ], + q(nalik) => [ + q(4720), + q(0), + ], + q(nalogo) => [ + q(4954), + q(0), + ], + q(nalu) => [ + q(4718), + q(0), + ], + q(naluo yi) => [ + q(7669), + q(0), + ], + q(nama (namibia)) => [ + q(4724), + q(1), + ], + q(nama (papua new guinea)) => [ + q(4978), + q(0), + ], + q(namakura) => [ + q(4965), + q(0), + ], + q(namat) => [ + q(4926), + q(0), + ], + q(nambo) => [ + q(4766), + q(0), + ], + q(nambya) => [ + q(4971), + q(0), + ], + q(namia) => [ + q(4993), + q(0), + ], + q(namiae) => [ + q(5125), + q(0), + ], + q(namibian sign language) => [ + q(4748), + q(0), + ], + q(namla) => [ + q(4712), + q(0), + ], + q(namo) => [ + q(4662), + q(0), + ], + q(namonuito) => [ + q(4974), + q(0), + ], + q(namosi-naitasiri-serua) => [ + q(1542), + q(0), + ], + q(namuyi) => [ + q(4979), + q(0), + ], + q(nanai) => [ + q(2542), + q(0), + ], + q(nancere) => [ + q(4983), + q(0), + ], + q(nande) => [ + q(4982), + q(0), + ], + q(nandi) => [ + q(4889), + q(0), + ], + q(nanerige senoufo) => [ + q(5965), + q(0), + ], + q(nanga dama dogon) => [ + q(5179), + q(0), + ], + q(nankina) => [ + q(4991), + q(0), + ], + q(nanti) => [ + q(1825), + q(0), + ], + q(nanticoke) => [ + q(4999), + q(0), + ], + q(nanubae) => [ + q(0645), + q(0), + ], + q(napo lowland quechua) => [ + q(5700), + q(0), + ], + q(napu) => [ + q(5036), + q(0), + ], + q(nar phu) => [ + q(5025), + q(0), + ], + q(nara) => [ + q(5045), + q(0), + ], + q(narak) => [ + q(4714), + q(0), + ], + q(narango) => [ + q(5049), + q(0), + ], + q(narau) => [ + q(5149), + q(0), + ], + q(nari nari) => [ + q(5824), + q(0), + ], + q(narim) => [ + q(4011), + q(0), + ], + q(naro) => [ + q(4868), + q(0), + ], + q(narom) => [ + q(5053), + q(0), + ], + q(narragansett) => [ + q(7427), + q(0), + ], + q(narrinyeri) => [ + q(4730), + q(0), + ], + q(narua) => [ + q(5058), + q(0), + ], + q(narungga) => [ + q(4997), + q(0), + ], + q(nasal) => [ + q(5082), + q(0), + ], + q(nasarian) => [ + q(5124), + q(0), + ], + q(naskapi) => [ + q(5069), + q(0), + ], + q(natanzi) => [ + q(5098), + q(0), + ], + q(nataoran amis) => [ + q(0709), + q(0), + ], + q(natchez) => [ + q(4776), + q(0), + ], + q(nateni) => [ + q(5090), + q(0), + ], + q(nathembo) => [ + q(5085), + q(0), + ], + q(natioro) => [ + q(5087), + q(0), + ], + q(natugu) => [ + q(5094), + q(0), + ], + q(nauete) => [ + q(5137), + q(0), + ], + q(naukan yupik) => [ + q(7695), + q(0), + ], + q(nauna) => [ + q(4767), + q(0), + ], + q(nauo) => [ + q(5133), + q(0), + ], + q(nauru) => [ + q(0302), + q(0), + ], + q(navaho) => [ + q(0303), + q(1), + ], + q(navajo) => [ + q(0303), + q(0), + ], + q(navut) => [ + q(5080), + q(0), + ], + q(nawaru) => [ + q(5134), + q(0), + ], + q(nawathinehena) => [ + q(5127), + q(0), + ], + q(nawdm) => [ + q(4980), + q(0), + ], + q(nawuri) => [ + q(4728), + q(0), + ], + q(naxi) => [ + q(5147), + q(0), + ], + q(nayi) => [ + q(5024), + q(0), + ], + q(nayini) => [ + q(5163), + q(0), + ], + q(ncane) => [ + q(4771), + q(0), + ], + q(nchumbulu) => [ + q(4949), + q(0), + ], + q(nda'nda') => [ + q(5004), + q(0), + ], + q(ndai) => [ + q(2536), + q(0), + ], + q(ndaka) => [ + q(4786), + q(0), + ], + q(ndaktup) => [ + q(4769), + q(0), + ], + q(ndali) => [ + q(4783), + q(0), + ], + q(ndam) => [ + q(4788), + q(0), + ], + q(ndamba) => [ + q(4785), + q(0), + ], + q(ndambomo) => [ + q(5146), + q(0), + ], + q(ndasa) => [ + q(4777), + q(0), + ], + q(ndau) => [ + q(4779), + q(0), + ], + q(nde-gbite) => [ + q(4803), + q(0), + ], + q(nde-nsele-nta) => [ + q(4780), + q(0), + ], + q(ndebele, north) => [ + q(0305), + q(0), + ], + q(ndebele, south) => [ + q(0304), + q(0), + ], + q(ndemli) => [ + q(4966), + q(0), + ], + q(ndendeule) => [ + q(2095), + q(0), + ], + q(ndengereko) => [ + q(4782), + q(0), + ], + q(nding) => [ + q(2241), + q(0), + ], + q(ndo) => [ + q(4790), + q(0), + ], + q(ndobo) => [ + q(4796), + q(0), + ], + q(ndoe) => [ + q(4733), + q(0), + ], + q(ndogo) => [ + q(4799), + q(0), + ], + q(ndolo) => [ + q(4787), + q(0), + ], + q(ndom) => [ + q(5040), + q(0), + ], + q(ndombe) => [ + q(4791), + q(0), + ], + q(ndonde hamba) => [ + q(4900), + q(0), + ], + q(ndonga) => [ + q(0306), + q(0), + ], + q(ndoola) => [ + q(4792), + q(0), + ], + q(ndra'ngith) => [ + q(2011), + q(0), + ], + q(nduga) => [ + q(4797), + q(0), + ], + q(ndumu) => [ + q(4958), + q(0), + ], + q(ndunda) => [ + q(5105), + q(0), + ], + q(ndunga) => [ + q(4793), + q(0), + ], + q(ndut) => [ + q(4795), + q(0), + ], + q(ndyuka-trio pidgin) => [ + q(4910), + q(0), + ], + q(ndzwani comorian) => [ + q(7173), + q(0), + ], + q(neapolitan) => [ + q(0301), + q(0), + ], + q(nedebang) => [ + q(4802), + q(0), + ], + q(nefamese) => [ + q(4805), + q(0), + ], + q(negerhollands) => [ + q(1971), + q(0), + ], + q(negeri sembilan malay) => [ + q(7869), + q(0), + ], + q(negidal) => [ + q(4806), + q(0), + ], + q(nehan) => [ + q(5072), + q(0), + ], + q(nek) => [ + q(4879), + q(0), + ], + q(nekgini) => [ + q(4921), + q(0), + ], + q(neko) => [ + q(4809), + q(0), + ], + q(neku) => [ + q(4810), + q(0), + ], + q(nelemwa-nixumwak) => [ + q(4804), + q(0), + ], + q(nema) => [ + q(2634), + q(0), + ], + q(neme) => [ + q(4820), + q(0), + ], + q(nemi) => [ + q(4811), + q(0), + ], + q(nen) => [ + q(5041), + q(0), + ], + q(nend) => [ + q(0797), + q(0), + ], + q(nenets) => [ + q(7724), + q(0), + ], + q(nenge) => [ + q(2060), + q(2), + ], + q(nengone) => [ + q(4812), + q(0), + ], + q(neo) => [ + q(4818), + q(0), + ], + q(neo-hittite) => [ + q(4808), + q(0), + ], + q(nepal bhasa) => [ + q(0309), + q(0), + ], + q(nepalese sign language) => [ + q(5073), + q(0), + ], + q(nepali) => [ + q(0308), + q(0), + ], + q(nepali (individual language)) => [ + q(5029), + q(0), + ], + q(nepali (macrolanguage)) => [ + q(0308), + q(1), + ], + q(nepali kurux) => [ + q(3720), + q(0), + ], + q(nete) => [ + q(4817), + q(0), + ], + q(neve'ei) => [ + q(7027), + q(1), + ], + q(neverver) => [ + q(3882), + q(1), + ], + q(new caledonian javanese) => [ + q(3053), + q(0), + ], + q(new zealand sign language) => [ + q(5176), + q(0), + ], + q(newari) => [ + q(0309), + q(1), + ], + q(neyo) => [ + q(4821), + q(0), + ], + q(nez perce) => [ + q(4822), + q(0), + ], + q(ngaanyatjarra) => [ + q(5088), + q(0), + ], + q(ngabere) => [ + q(2700), + q(0), + ], + q(ngad'a) => [ + q(5140), + q(0), + ], + q(ngadjunmaya) => [ + q(4911), + q(0), + ], + q(ngadjuri) => [ + q(3151), + q(0), + ], + q(ngaing) => [ + q(4986), + q(0), + ], + q(ngaju) => [ + q(4883), + q(0), + ], + q(ngala) => [ + q(5101), + q(0), + ], + q(ngalakan) => [ + q(4880), + q(0), + ], + q(ngalum) => [ + q(6336), + q(0), + ], + q(ngam) => [ + q(4957), + q(0), + ], + q(ngamambo) => [ + q(4751), + q(0), + ], + q(ngambay) => [ + q(5892), + q(0), + ], + q(ngamini) => [ + q(4976), + q(0), + ], + q(ngamo) => [ + q(4738), + q(0), + ], + q(ngan'gityemerri) => [ + q(4721), + q(0), + ], + q(nganakarti) => [ + q(7422), + q(0), + ], + q(nganasan) => [ + q(4888), + q(0), + ], + q(ngandi) => [ + q(4877), + q(0), + ], + q(ngando (central african republic)) => [ + q(4831), + q(0), + ], + q(ngando (democratic republic of congo)) => [ + q(5138), + q(0), + ], + q(ngandyera) => [ + q(4985), + q(0), + ], + q(ngangam) => [ + q(2570), + q(0), + ], + q(ngantangarra) => [ + q(5086), + q(0), + ], + q(nganyaywana) => [ + q(5170), + q(0), + ], + q(ngardi) => [ + q(5870), + q(0), + ], + q(ngarigu) => [ + q(7421), + q(0), + ], + q(ngarinman) => [ + q(4740), + q(0), + ], + q(ngarinyin) => [ + q(6901), + q(0), + ], + q(ngarla) => [ + q(5051), + q(0), + ], + q(ngarluma) => [ + q(5052), + q(0), + ], + q(ngas) => [ + q(0793), + q(0), + ], + q(ngasa) => [ + q(5066), + q(0), + ], + q(ngatik men's creole) => [ + q(4839), + q(0), + ], + q(ngawn chin) => [ + q(1804), + q(0), + ], + q(ngawun) => [ + q(5145), + q(0), + ], + q(ngayawung) => [ + q(5130), + q(0), + ], + q(ngazidja comorian) => [ + q(7820), + q(0), + ], + q(ngbaka) => [ + q(4828), + q(0), + ], + q(ngbaka ma'bo) => [ + q(4742), + q(0), + ], + q(ngbaka manza) => [ + q(4833), + q(0), + ], + q(ngbee) => [ + q(3083), + q(0), + ], + q(ngbinda) => [ + q(4735), + q(0), + ], + q(ngbundu) => [ + q(5118), + q(0), + ], + q(ngelima) => [ + q(0660), + q(0), + ], + q(ngemba) => [ + q(4832), + q(0), + ], + q(ngendelengo) => [ + q(5039), + q(0), + ], + q(ngeq) => [ + q(4846), + q(1), + ], + q(ngete) => [ + q(4994), + q(0), + ], + q(nggem) => [ + q(4746), + q(0), + ], + q(nggwahyi) => [ + q(4850), + q(0), + ], + q(ngie) => [ + q(4836), + q(0), + ], + q(ngiemboon) => [ + q(4988), + q(0), + ], + q(ngile) => [ + q(3113), + q(0), + ], + q(ngindo) => [ + q(4996), + q(0), + ], + q(ngiti) => [ + q(4896), + q(0), + ], + q(ngizim) => [ + q(4835), + q(0), + ], + q(ngkalmpw kanum) => [ + q(3211), + q(0), + ], + q(ngom) => [ + q(5044), + q(0), + ], + q(ngomba) => [ + q(3086), + q(0), + ], + q(ngombale) => [ + q(4939), + q(0), + ], + q(ngombe (central african republic)) => [ + q(4964), + q(0), + ], + q(ngombe (democratic republic of congo)) => [ + q(4830), + q(0), + ], + q(ngongo) => [ + q(5017), + q(0), + ], + q(ngoni) => [ + q(4841), + q(0), + ], + q(ngoreme) => [ + q(4843), + q(1), + ], + q(ngoshie) => [ + q(5067), + q(0), + ], + q(ngul) => [ + q(4947), + q(0), + ], + q(ngulu) => [ + q(4842), + q(0), + ], + q(nguluwan) => [ + q(5120), + q(0), + ], + q(ngumbi) => [ + q(5106), + q(0), + ], + q(ngunawal) => [ + q(7520), + q(0), + ], + q(ngundi) => [ + q(4789), + q(0), + ], + q(ngundu) => [ + q(5102), + q(0), + ], + q(ngungwel) => [ + q(4852), + q(0), + ], + q(nguon) => [ + q(5112), + q(0), + ], + q(ngurimi) => [ + q(4843), + q(0), + ], + q(ngurmbur) => [ + q(5059), + q(0), + ], + q(ngwaba) => [ + q(4849), + q(0), + ], + q(ngwe) => [ + q(5129), + q(0), + ], + q(ngwo) => [ + q(4840), + q(0), + ], + q(nhanda) => [ + q(4853), + q(0), + ], + q(nhengatu) => [ + q(7725), + q(0), + ], + q(nhirrpi) => [ + q(2834), + q(0), + ], + q(nhuwala) => [ + q(4858), + q(0), + ], + q(nias) => [ + q(0310), + q(0), + ], + q(nicaragua creole english) => [ + q(1622), + q(0), + ], + q(nicaraguan sign language) => [ + q(4772), + q(0), + ], + q(nicarao) => [ + q(5570), + q(1), + ], + q(niellim) => [ + q(4878), + q(0), + ], + q(niger-kordofanian languages) => [ + q(0311), + q(0), + ], + q(nigeria mambila) => [ + q(4696), + q(0), + ], + q(nigerian fulfulde) => [ + q(2391), + q(0), + ], + q(nigerian pidgin) => [ + q(5389), + q(0), + ], + q(nigerian sign language) => [ + q(5068), + q(0), + ], + q(nihali) => [ + q(4946), + q(0), + ], + q(nii) => [ + q(4882), + q(0), + ], + q(niksek) => [ + q(2421), + q(0), + ], + q(nila) => [ + q(4885), + q(0), + ], + q(nilamba) => [ + q(4886), + q(0), + ], + q(nilo-saharan languages) => [ + q(0407), + q(0), + ], + q(nimadi) => [ + q(5008), + q(0), + ], + q(nimanbur) => [ + q(4970), + q(0), + ], + q(nimbari) => [ + q(4972), + q(0), + ], + q(nimboran) => [ + q(4890), + q(0), + ], + q(nimi) => [ + q(4891), + q(0), + ], + q(nimo) => [ + q(4894), + q(0), + ], + q(nimoa) => [ + q(4977), + q(0), + ], + q(ninam) => [ + q(6002), + q(0), + ], + q(ninde) => [ + q(4625), + q(1), + ], + q(nindi) => [ + q(5141), + q(0), + ], + q(ningera) => [ + q(4753), + q(0), + ], + q(ninggerum) => [ + q(5148), + q(0), + ], + q(ningil) => [ + q(4897), + q(0), + ], + q(ningye) => [ + q(4998), + q(0), + ], + q(ninia yali) => [ + q(4945), + q(0), + ], + q(ninzo) => [ + q(4887), + q(0), + ], + q(nipsan) => [ + q(5033), + q(0), + ], + q(nisa) => [ + q(4909), + q(0), + ], + q(nisenan) => [ + q(5083), + q(0), + ], + q(nisga'a) => [ + q(4760), + q(0), + ], + q(nisi (china)) => [ + q(7737), + q(0), + ], + q(niuafo'ou) => [ + q(5110), + q(0), + ], + q(niuatoputapu) => [ + q(4929), + q(0), + ], + q(niuean) => [ + q(0312), + q(0), + ], + q(nivacle) => [ + q(1643), + q(0), + ], + q(niwer mil) => [ + q(2829), + q(0), + ], + q(njalgulgule) => [ + q(4904), + q(0), + ], + q(njebi) => [ + q(5173), + q(0), + ], + q(njen) => [ + q(4903), + q(0), + ], + q(njerep) => [ + q(4908), + q(0), + ], + q(njyem) => [ + q(4913), + q(0), + ], + q(nkami) => [ + q(4930), + q(0), + ], + q(nkangala) => [ + q(4927), + q(0), + ], + q(nkari) => [ + q(4938), + q(0), + ], + q(nkem-nkum) => [ + q(3000), + q(0), + ], + q(nkhumbi) => [ + q(3346), + q(0), + ], + q(nkongho) => [ + q(4917), + q(0), + ], + q(nkonya) => [ + q(4928), + q(0), + ], + q(nkoroo) => [ + q(4937), + q(0), + ], + q(nkoya) => [ + q(4915), + q(0), + ], + q(nkukoli) => [ + q(4744), + q(0), + ], + q(nkutu) => [ + q(4936), + q(0), + ], + q(nnam) => [ + q(4745), + q(0), + ], + q(no linguistic content) => [ + q(0486), + q(0), + ], + q(nobiin) => [ + q(2342), + q(0), + ], + q(nobonob) => [ + q(2416), + q(0), + ], + q(nocaman) => [ + q(5015), + q(0), + ], + q(nocte naga) => [ + q(4899), + q(0), + ], + q(nogai) => [ + q(0315), + q(0), + ], + q(noipx) => [ + q(5035), + q(0), + ], + q(noiri) => [ + q(5011), + q(0), + ], + q(nokuku) => [ + q(4925), + q(0), + ], + q(nomaande) => [ + q(3862), + q(0), + ], + q(nomane) => [ + q(5009), + q(0), + ], + q(nomatsiguenga) => [ + q(5019), + q(0), + ], + q(nomlaki) => [ + q(5014), + q(0), + ], + q(nomu) => [ + q(5010), + q(0), + ], + q(nong zhuang) => [ + q(7832), + q(0), + ], + q(nonuya) => [ + q(5012), + q(0), + ], + q(nooksack) => [ + q(5013), + q(0), + ], + q(noon) => [ + q(6128), + q(0), + ], + q(noone) => [ + q(4870), + q(0), + ], + q(nopala chatino) => [ + q(1924), + q(0), + ], + q(nora) => [ + q(5056), + q(1), + ], + q(noric) => [ + q(5046), + q(0), + ], + q(norn) => [ + q(5054), + q(0), + ], + q(norra) => [ + q(5056), + q(0), + ], + q(norse, old) => [ + q(0316), + q(0), + ], + q(north alaskan inupiatun) => [ + q(2290), + q(0), + ], + q(north ambrym) => [ + q(4389), + q(0), + ], + q(north american indian languages) => [ + q(0300), + q(0), + ], + q(north asmat) => [ + q(4932), + q(0), + ], + q(north awyu) => [ + q(7642), + q(0), + ], + q(north azerbaijani) => [ + q(1017), + q(0), + ], + q(north babar) => [ + q(1068), + q(0), + ], + q(north bolivian quechua) => [ + q(5679), + q(0), + ], + q(north caucasian languages) => [ + q(0496), + q(0), + ], + q(north central mixe) => [ + q(4814), + q(0), + ], + q(north efate) => [ + q(3962), + q(0), + ], + q(north fali) => [ + q(2353), + q(0), + ], + q(north germanic languages) => [ + q(0507), + q(0), + ], + q(north giziga) => [ + q(2522), + q(0), + ], + q(north junin quechua) => [ + q(5699), + q(0), + ], + q(north levantine arabic) => [ + q(0836), + q(0), + ], + q(north marquesan) => [ + q(4514), + q(0), + ], + q(north mesopotamian arabic) => [ + q(1005), + q(0), + ], + q(north mofu) => [ + q(4227), + q(0), + ], + q(north moluccan malay) => [ + q(4118), + q(0), + ], + q(north muyu) => [ + q(3623), + q(0), + ], + q(north ndebele) => [ + q(0305), + q(1), + ], + q(north nuaulu) => [ + q(4989), + q(0), + ], + q(north picene) => [ + q(5055), + q(0), + ], + q(north slavey) => [ + q(5928), + q(0), + ], + q(north tairora) => [ + q(6375), + q(0), + ], + q(north tanna) => [ + q(6607), + q(0), + ], + q(north wahgi) => [ + q(7110), + q(0), + ], + q(north watut) => [ + q(6899), + q(0), + ], + q(northeast kiwai) => [ + q(3371), + q(0), + ], + q(northeast maidu) => [ + q(4975), + q(0), + ], + q(northeast pashai) => [ + q(0628), + q(0), + ], + q(northeast pashayi) => [ + q(0628), + q(1), + ], + q(northeastern dinka) => [ + q(2042), + q(0), + ], + q(northeastern pomo) => [ + q(5404), + q(0), + ], + q(northeastern thai) => [ + q(6737), + q(0), + ], + q(northern alta) => [ + q(0864), + q(0), + ], + q(northern altai) => [ + q(0929), + q(0), + ], + q(northern amami-oshima) => [ + q(5872), + q(0), + ], + q(northern bai) => [ + q(1139), + q(1), + ], + q(northern betsimisaraka malagasy) => [ + q(1315), + q(0), + ], + q(northern binukidnon) => [ + q(3748), + q(0), + ], + q(northern bobo madare) => [ + q(1053), + q(0), + ], + q(northern bontok) => [ + q(5750), + q(0), + ], + q(northern catanduanes bikol) => [ + q(1894), + q(0), + ], + q(northern conchucos ancash quechua) => [ + q(5716), + q(0), + ], + q(northern dagara) => [ + q(2005), + q(0), + ], + q(northern dong) => [ + q(2109), + q(0), + ], + q(northern east cree) => [ + q(1848), + q(0), + ], + q(northern embera) => [ + q(2254), + q(0), + ], + q(northern frisian) => [ + q(0141), + q(0), + ], + q(northern ghale) => [ + q(2502), + q(0), + ], + q(northern gondi) => [ + q(2577), + q(0), + ], + q(northern grebo) => [ + q(2431), + q(0), + ], + q(northern guiyang hmong) => [ + q(2857), + q(0), + ], + q(northern guiyang miao) => [ + q(2857), + q(1), + ], + q(northern haida) => [ + q(2736), + q(0), + ], + q(northern hindko) => [ + q(2804), + q(0), + ], + q(northern huishui hmong) => [ + q(2782), + q(0), + ], + q(northern huishui miao) => [ + q(2782), + q(1), + ], + q(northern kalapuya) => [ + q(5057), + q(0), + ], + q(northern kankanay) => [ + q(7423), + q(0), + ], + q(northern katang) => [ + q(4770), + q(0), + ], + q(northern khmer) => [ + q(3721), + q(0), + ], + q(northern kissi) => [ + q(3562), + q(0), + ], + q(northern kurdish) => [ + q(3468), + q(0), + ], + q(northern luri) => [ + q(4034), + q(0), + ], + q(northern mashan hmong) => [ + q(2787), + q(0), + ], + q(northern mashan miao) => [ + q(2787), + q(1), + ], + q(northern muji) => [ + q(7689), + q(0), + ], + q(northern nago) => [ + q(7356), + q(0), + ], + q(northern ngbandi) => [ + q(4829), + q(0), + ], + q(northern nisu) => [ + q(7646), + q(0), + ], + q(northern nuni) => [ + q(5119), + q(0), + ], + q(northern oaxaca nahuatl) => [ + q(4874), + q(0), + ], + q(northern ohlone) => [ + q(1878), + q(0), + ], + q(northern one) => [ + q(5272), + q(0), + ], + q(northern paiute) => [ + q(5350), + q(0), + ], + q(northern pame) => [ + q(5518), + q(0), + ], + q(northern pashto) => [ + q(5374), + q(0), + ], + q(northern pastaza quichua) => [ + q(5705), + q(0), + ], + q(northern pomo) => [ + q(5408), + q(0), + ], + q(northern puebla nahuatl) => [ + q(4763), + q(0), + ], + q(northern pumi) => [ + q(5511), + q(0), + ], + q(northern qiandong miao) => [ + q(2739), + q(0), + ], + q(northern qiang) => [ + q(1795), + q(0), + ], + q(northern rengma naga) => [ + q(4992), + q(0), + ], + q(northern roglai) => [ + q(5831), + q(0), + ], + q(northern sami) => [ + q(0389), + q(0), + ], + q(northern sierra miwok) => [ + q(5074), + q(0), + ], + q(northern sorsoganon) => [ + q(1271), + q(0), + ], + q(northern sotho) => [ + q(0319), + q(2), + ], + q(northern subanen) => [ + q(6244), + q(0), + ], + q(northern tarahumara) => [ + q(6489), + q(0), + ], + q(northern tepehuan) => [ + q(5092), + q(0), + ], + q(northern thai) => [ + q(5007), + q(0), + ], + q(northern tidung) => [ + q(5084), + q(0), + ], + q(northern tiwa) => [ + q(6781), + q(0), + ], + q(northern tlaxiaco mixtec) => [ + q(7503), + q(0), + ], + q(northern toussian) => [ + q(6708), + q(0), + ], + q(northern tujia) => [ + q(6527), + q(0), + ], + q(northern tutchone) => [ + q(6731), + q(0), + ], + q(northern uzbek) => [ + q(6953), + q(0), + ], + q(northern yukaghir) => [ + q(7650), + q(0), + ], + q(northwest alaska inupiatun) => [ + q(2291), + q(0), + ], + q(northwest gbaya) => [ + q(2692), + q(0), + ], + q(northwest maidu) => [ + q(4315), + q(0), + ], + q(northwest oaxaca mixtec) => [ + q(4640), + q(0), + ], + q(northwest pashai) => [ + q(2543), + q(0), + ], + q(northwest pashayi) => [ + q(2543), + q(1), + ], + q(northwestern dinka) => [ + q(2048), + q(0), + ], + q(northwestern fars) => [ + q(2335), + q(0), + ], + q(northwestern kolami) => [ + q(3283), + q(0), + ], + q(northwestern kung) => [ + q(6960), + q(1), + ], + q(northwestern nisu) => [ + q(5065), + q(0), + ], + q(northwestern ojibwa) => [ + q(5213), + q(0), + ], + q(northwestern tamang) => [ + q(6583), + q(0), + ], + q(norwegian) => [ + q(0317), + q(0), + ], + q(norwegian bokmal) => [ + q(0314), + q(1), + ], + q(norwegian nynorsk) => [ + q(0313), + q(0), + ], + q(norwegian sign language) => [ + q(5070), + q(0), + ], + q(not applicable) => [ + q(0486), + q(1), + ], + q(notre) => [ + q(1301), + q(0), + ], + q(notsi) => [ + q(4759), + q(0), + ], + q(nottoway) => [ + q(5095), + q(0), + ], + q(nottoway-meherrin) => [ + q(5136), + q(0), + ], + q(novial) => [ + q(5021), + q(0), + ], + q(noy) => [ + q(5023), + q(0), + ], + q(nsenga) => [ + q(5064), + q(0), + ], + q(nshi) => [ + q(5062), + q(0), + ], + q(nsongo) => [ + q(5081), + q(0), + ], + q(ntcham) => [ + q(1496), + q(0), + ], + q(ntomba) => [ + q(5091), + q(0), + ], + q(nu) => [ + q(4834), + q(1), + ], + q(nubaca) => [ + q(1027), + q(0), + ], + q(nubi) => [ + q(3221), + q(0), + ], + q(nubian languages) => [ + q(0320), + q(0), + ], + q(nubri) => [ + q(3619), + q(0), + ], + q(nuer) => [ + q(5116), + q(0), + ], + q(nugunu (australia)) => [ + q(5001), + q(0), + ], + q(nugunu (cameroon)) => [ + q(7576), + q(0), + ], + q(nuk) => [ + q(5006), + q(0), + ], + q(nukak maku) => [ + q(4136), + q(0), + ], + q(nukna) => [ + q(3445), + q(0), + ], + q(nukuini) => [ + q(5100), + q(0), + ], + q(nukumanu) => [ + q(5114), + q(0), + ], + q(nukunul) => [ + q(7428), + q(0), + ], + q(nukuoro) => [ + q(4931), + q(0), + ], + q(nukuria) => [ + q(5115), + q(0), + ], + q(numana-nunku-gbantu-numbu) => [ + q(4747), + q(0), + ], + q(numanggang) => [ + q(5016), + q(0), + ], + q(numbami) => [ + q(6032), + q(0), + ], + q(nume) => [ + q(6478), + q(0), + ], + q(numee) => [ + q(3243), + q(0), + ], + q(numidian) => [ + q(5144), + q(0), + ], + q(nung (viet nam)) => [ + q(5117), + q(0), + ], + q(nungali) => [ + q(5104), + q(0), + ], + q(nunggubuyu) => [ + q(5122), + q(0), + ], + q(nungu) => [ + q(5781), + q(0), + ], + q(nuosu) => [ + q(0190), + q(1), + ], + q(nupbikha) => [ + q(5026), + q(0), + ], + q(nupe-nupe-tako) => [ + q(5113), + q(0), + ], + q(nupode huitoto) => [ + q(2869), + q(0), + ], + q(nusa laut) => [ + q(5109), + q(0), + ], + q(nusu) => [ + q(5103), + q(0), + ], + q(nuu-chah-nulth) => [ + q(5108), + q(0), + ], + q(nuuchahnulth) => [ + q(5108), + q(1), + ], + q(nyabwa) => [ + q(5128), + q(0), + ], + q(nyaheun) => [ + q(4819), + q(0), + ], + q(nyahkur) => [ + q(1667), + q(0), + ], + q(nyakyusa-ngonde) => [ + q(5171), + q(0), + ], + q(nyalayu) => [ + q(7672), + q(0), + ], + q(nyali) => [ + q(4944), + q(0), + ], + q(nyam) => [ + q(4963), + q(0), + ], + q(nyamal) => [ + q(4953), + q(0), + ], + q(nyambo) => [ + q(5022), + q(0), + ], + q(nyamusa-molo) => [ + q(5132), + q(0), + ], + q(nyamwanga) => [ + q(4628), + q(0), + ], + q(nyamwezi) => [ + q(0323), + q(0), + ], + q(nyaneka) => [ + q(5160), + q(0), + ], + q(nyang'i) => [ + q(5162), + q(0), + ], + q(nyanga) => [ + q(5159), + q(0), + ], + q(nyanga-li) => [ + q(5152), + q(0), + ], + q(nyangatom) => [ + q(4990), + q(0), + ], + q(nyangbo) => [ + q(5151), + q(0), + ], + q(nyangga) => [ + q(5003), + q(0), + ], + q(nyangumarta) => [ + q(4981), + q(0), + ], + q(nyanja) => [ + q(0322), + q(2), + ], + q(nyankole) => [ + q(0324), + q(0), + ], + q(nyankpa) => [ + q(7613), + q(0), + ], + q(nyarafolo senoufo) => [ + q(5973), + q(0), + ], + q(nyaturu) => [ + q(5780), + q(0), + ], + q(nyaw) => [ + q(5169), + q(0), + ], + q(nyawaygi) => [ + q(5166), + q(0), + ], + q(nyelayu) => [ + q(7672), + q(1), + ], + q(nyemba) => [ + q(4732), + q(0), + ], + q(nyengo) => [ + q(5154), + q(0), + ], + q(nyenkha) => [ + q(4807), + q(0), + ], + q(nyeu) => [ + q(5161), + q(0), + ], + q(nyigina) => [ + q(5157), + q(0), + ], + q(nyiha (malawi)) => [ + q(5164), + q(0), + ], + q(nyiha (tanzania)) => [ + q(4881), + q(0), + ], + q(nyika (malawi and zambia)) => [ + q(4935), + q(0), + ], + q(nyika (tanzania)) => [ + q(4933), + q(0), + ], + q(nyindrou) => [ + q(3904), + q(0), + ], + q(nyindu) => [ + q(5156), + q(0), + ], + q(nyishi) => [ + q(4914), + q(0), + ], + q(nyiyaparli) => [ + q(7429), + q(0), + ], + q(nynorsk, norwegian) => [ + q(0313), + q(1), + ], + q(nyokon) => [ + q(5126), + q(0), + ], + q(nyole) => [ + q(5107), + q(0), + ], + q(nyong) => [ + q(4584), + q(0), + ], + q(nyore) => [ + q(5153), + q(0), + ], + q(nyoro) => [ + q(0325), + q(0), + ], + q(nyulnyul) => [ + q(5168), + q(0), + ], + q(nyunga) => [ + q(5165), + q(0), + ], + q(nyungwe) => [ + q(5167), + q(0), + ], + q(nzakambay) => [ + q(5178), + q(0), + ], + q(nzakara) => [ + q(5174), + q(0), + ], + q(nzanyi) => [ + q(4898), + q(0), + ], + q(nzima) => [ + q(0326), + q(0), + ], + q(o'chi'chi') => [ + q(7431), + q(0), + ], + q(o'du) => [ + q(6816), + q(0), + ], + q(obanliku) => [ + q(1636), + q(0), + ], + q(obispeno) => [ + q(5184), + q(0), + ], + q(oblo) => [ + q(5186), + q(0), + ], + q(obo manobo) => [ + q(5188), + q(0), + ], + q(obokuitai) => [ + q(0652), + q(0), + ], + q(obolo) => [ + q(0803), + q(0), + ], + q(obulom) => [ + q(5191), + q(0), + ], + q(ocaina) => [ + q(5192), + q(0), + ], + q(occidental) => [ + q(0193), + q(1), + ], + q(occitan (post 1500)) => [ + q(0327), + q(0), + ], + q(ocotepec mixtec) => [ + q(4294), + q(0), + ], + q(ocotlan zapotec) => [ + q(7792), + q(0), + ], + q(od) => [ + q(5197), + q(0), + ], + q(odia (individual language)) => [ + q(5303), + q(0), + ], + q(odia (macrolanguage)) => [ + q(0329), + q(2), + ], + q(odiai) => [ + q(1191), + q(0), + ], + q(odoodee) => [ + q(3402), + q(0), + ], + q(odual) => [ + q(5199), + q(0), + ], + q(odut) => [ + q(5196), + q(0), + ], + q(ofaye) => [ + q(5288), + q(0), + ], + q(official aramaic (700-300 bce)) => [ + q(0022), + q(0), + ], + q(ofo) => [ + q(5200), + q(0), + ], + q(ogbah) => [ + q(5204), + q(0), + ], + q(ogbia) => [ + q(5203), + q(0), + ], + q(ogbogolo) => [ + q(5206), + q(0), + ], + q(ogbronuagum) => [ + q(5208), + q(0), + ], + q(ogea) => [ + q(2280), + q(0), + ], + q(oirat) => [ + q(0471), + q(1), + ], + q(oirata) => [ + q(5211), + q(0), + ], + q(ojibwa) => [ + q(0328), + q(0), + ], + q(ojitlan chinantec) => [ + q(1720), + q(0), + ], + q(okanagan) => [ + q(5220), + q(0), + ], + q(oki-no-erabu) => [ + q(5231), + q(0), + ], + q(okiek) => [ + q(5226), + q(0), + ], + q(oko-eni-osayen) => [ + q(5234), + q(0), + ], + q(oko-juwoi) => [ + q(5227), + q(0), + ], + q(okobo) => [ + q(5221), + q(0), + ], + q(okodia) => [ + q(5222), + q(0), + ], + q(okolod) => [ + q(3565), + q(0), + ], + q(okpamheri) => [ + q(5283), + q(0), + ], + q(okpe (northwestern edo)) => [ + q(5237), + q(0), + ], + q(okpe (southwestern edo)) => [ + q(5223), + q(0), + ], + q(oksapmin) => [ + q(5285), + q(0), + ], + q(oku) => [ + q(5235), + q(0), + ], + q(old aramaic (up to 700 bce)) => [ + q(5182), + q(0), + ], + q(old avar) => [ + q(5183), + q(0), + ], + q(old breton) => [ + q(5190), + q(0), + ], + q(old bulgarian) => [ + q(0086), + q(3), + ], + q(old burmese) => [ + q(5189), + q(0), + ], + q(old chinese) => [ + q(5193), + q(0), + ], + q(old church slavonic) => [ + q(0086), + q(4), + ], + q(old cornish) => [ + q(5194), + q(0), + ], + q(old dutch) => [ + q(5198), + q(0), + ], + q(old english (ca. 450-1100)) => [ + q(0018), + q(1), + ], + q(old french (842-ca. 1400)) => [ + q(0140), + q(1), + ], + q(old frisian) => [ + q(5201), + q(0), + ], + q(old georgian) => [ + q(5205), + q(0), + ], + q(old high german (ca. 750-1050)) => [ + q(0159), + q(1), + ], + q(old hittite) => [ + q(5209), + q(0), + ], + q(old hungarian) => [ + q(5210), + q(0), + ], + q(old irish (to 900)) => [ + q(0378), + q(1), + ], + q(old japanese) => [ + q(5216), + q(0), + ], + q(old kentish sign language) => [ + q(5229), + q(0), + ], + q(old korean (3rd-9th cent.)) => [ + q(5232), + q(0), + ], + q(old lithuanian) => [ + q(5245), + q(0), + ], + q(old manipuri) => [ + q(5256), + q(0), + ], + q(old marathi) => [ + q(5257), + q(0), + ], + q(old mon) => [ + q(5261), + q(0), + ], + q(old newari) => [ + q(0321), + q(1), + ], + q(old norse) => [ + q(0316), + q(1), + ], + q(old nubian) => [ + q(5276), + q(0), + ], + q(old occitan (to 1500)) => [ + q(0351), + q(2), + ], + q(old ossetic) => [ + q(5282), + q(0), + ], + q(old persian (ca. 600-400 b.c.)) => [ + q(0342), + q(1), + ], + q(old provencal (to 1500)) => [ + q(0351), + q(1), + ], + q(old russian) => [ + q(5300), + q(0), + ], + q(old saxon) => [ + q(5311), + q(0), + ], + q(old slavonic) => [ + q(0086), + q(1), + ], + q(old spanish) => [ + q(5308), + q(0), + ], + q(old tamil) => [ + q(5327), + q(0), + ], + q(old tibetan) => [ + q(5312), + q(0), + ], + q(old turkish) => [ + q(5316), + q(0), + ], + q(old uighur) => [ + q(5332), + q(0), + ], + q(old welsh) => [ + q(5336), + q(0), + ], + q(olekha) => [ + q(5240), + q(0), + ], + q(olkol) => [ + q(5241), + q(0), + ], + q(olo) => [ + q(5265), + q(0), + ], + q(oloma) => [ + q(5242), + q(0), + ], + q(olrat) => [ + q(5244), + q(0), + ], + q(olu'bo) => [ + q(4075), + q(0), + ], + q(olukhayo) => [ + q(3941), + q(1), + ], + q(olulumo-ikom) => [ + q(2940), + q(0), + ], + q(oluluyia) => [ + q(4084), + q(1), + ], + q(olumarachi) => [ + q(4037), + q(1), + ], + q(olumarama) => [ + q(4040), + q(1), + ], + q(olunyole) => [ + q(5153), + q(1), + ], + q(olusamia) => [ + q(4054), + q(1), + ], + q(olushisa) => [ + q(3943), + q(1), + ], + q(oluta popoluca) => [ + q(5494), + q(0), + ], + q(olutsotso) => [ + q(4066), + q(1), + ], + q(oluwanga) => [ + q(4092), + q(1), + ], + q(omagua) => [ + q(5250), + q(0), + ], + q(omaha-ponca) => [ + q(5247), + q(0), + ], + q(omani arabic) => [ + q(0602), + q(0), + ], + q(ombamba) => [ + q(4131), + q(0), + ], + q(ombo) => [ + q(5253), + q(0), + ], + q(ometepec nahuatl) => [ + q(4869), + q(0), + ], + q(omi) => [ + q(5251), + q(0), + ], + q(omie) => [ + q(0827), + q(0), + ], + q(omok) => [ + q(5252), + q(0), + ], + q(omotic languages) => [ + q(0519), + q(0), + ], + q(omotik) => [ + q(5258), + q(0), + ], + q(omurano) => [ + q(5259), + q(0), + ], + q(ona) => [ + q(5262), + q(0), + ], + q(oneida) => [ + q(5264), + q(0), + ], + q(ong) => [ + q(5279), + q(0), + ], + q(onge) => [ + q(5280), + q(0), + ], + q(onin) => [ + q(5266), + q(0), + ], + q(onin based pidgin) => [ + q(5277), + q(0), + ], + q(oniyan) => [ + q(1449), + q(1), + ], + q(onjob) => [ + q(5267), + q(0), + ], + q(ono) => [ + q(5273), + q(0), + ], + q(onobasulu) => [ + q(5269), + q(0), + ], + q(onondaga) => [ + q(5270), + q(0), + ], + q(ontenu) => [ + q(5274), + q(0), + ], + q(ontong java) => [ + q(5218), + q(0), + ], + q(oorlams) => [ + q(5281), + q(0), + ], + q(opao) => [ + q(5286), + q(0), + ], + q(opata) => [ + q(5287), + q(0), + ], + q(opuuo) => [ + q(3885), + q(1), + ], + q(orang kanaq) => [ + q(5294), + q(0), + ], + q(orang seletar) => [ + q(5297), + q(0), + ], + q(oraon sadri) => [ + q(5948), + q(0), + ], + q(orejon) => [ + q(5291), + q(0), + ], + q(oring) => [ + q(5292), + q(0), + ], + q(oriya) => [ + q(0329), + q(0), + ], + q(oriya (individual language)) => [ + q(5303), + q(1), + ], + q(oriya (macrolanguage)) => [ + q(0329), + q(1), + ], + q(orizaba nahuatl) => [ + q(4950), + q(0), + ], + q(orma) => [ + q(5290), + q(0), + ], + q(ormu) => [ + q(5304), + q(0), + ], + q(ormuri) => [ + q(5299), + q(0), + ], + q(oro) => [ + q(5302), + q(0), + ], + q(oro win) => [ + q(5301), + q(0), + ], + q(oroch) => [ + q(5181), + q(0), + ], + q(oroha) => [ + q(5289), + q(0), + ], + q(orok) => [ + q(5180), + q(0), + ], + q(orokaiva) => [ + q(5236), + q(0), + ], + q(oroko) => [ + q(1110), + q(0), + ], + q(orokolo) => [ + q(5295), + q(0), + ], + q(oromo) => [ + q(0330), + q(0), + ], + q(oroqen) => [ + q(5293), + q(0), + ], + q(orowe) => [ + q(1382), + q(0), + ], + q(oruma) => [ + q(5296), + q(0), + ], + q(orya) => [ + q(6931), + q(0), + ], + q(osage) => [ + q(0331), + q(0), + ], + q(osatu) => [ + q(5309), + q(0), + ], + q(oscan) => [ + q(5305), + q(0), + ], + q(osing) => [ + q(5306), + q(0), + ], + q(ososo) => [ + q(5307), + q(0), + ], + q(ossetian) => [ + q(0332), + q(0), + ], + q(ossetic) => [ + q(0332), + q(1), + ], + q(ot danum) => [ + q(5313), + q(0), + ], + q(otank) => [ + q(6939), + q(0), + ], + q(oti) => [ + q(5315), + q(0), + ], + q(oto-manguean languages) => [ + q(0518), + q(0), + ], + q(otomian languages) => [ + q(0334), + q(0), + ], + q(otoro) => [ + q(5321), + q(0), + ], + q(ottawa) => [ + q(5325), + q(0), + ], + q(ottoman turkish (1500-1928)) => [ + q(0333), + q(1), + ], + q(otuho) => [ + q(4022), + q(0), + ], + q(otuke) => [ + q(5324), + q(0), + ], + q(ouma) => [ + q(5333), + q(0), + ], + q(oune) => [ + q(5331), + q(0), + ], + q(ovdalian) => [ + q(5334), + q(1), + ], + q(owa) => [ + q(6255), + q(0), + ], + q(owenia) => [ + q(7223), + q(0), + ], + q(owiniga) => [ + q(5335), + q(0), + ], + q(oy) => [ + q(5337), + q(0), + ], + q(oya'oya) => [ + q(5340), + q(0), + ], + q(oyda) => [ + q(5338), + q(0), + ], + q(ozolotepec zapotec) => [ + q(7803), + q(0), + ], + q(ozumacin chinantec) => [ + q(1726), + q(0), + ], + q(pa di) => [ + q(5395), + q(0), + ], + q(pa'a) => [ + q(5579), + q(0), + ], + q(pa'o) => [ + q(1288), + q(1), + ], + q(pa'o karen) => [ + q(1288), + q(0), + ], + q(pa-hng) => [ + q(5432), + q(0), + ], + q(paafang) => [ + q(5419), + q(0), + ], + q(paakantyi) => [ + q(2134), + q(0), + ], + q(paama) => [ + q(5505), + q(0), + ], + q(paasaal) => [ + q(6029), + q(0), + ], + q(pacahuara) => [ + q(5391), + q(0), + ], + q(pacaraos quechua) => [ + q(5701), + q(0), + ], + q(pacific gulf yupik) => [ + q(2255), + q(0), + ], + q(pacoh) => [ + q(5343), + q(0), + ], + q(padoe) => [ + q(5397), + q(0), + ], + q(paekche) => [ + q(5473), + q(0), + ], + q(paelignian) => [ + q(5428), + q(0), + ], + q(paez) => [ + q(5360), + q(0), + ], + q(pagi) => [ + q(5425), + q(0), + ], + q(pagibete) => [ + q(5345), + q(0), + ], + q(pagu) => [ + q(5430), + q(0), + ], + q(pahanan agta) => [ + q(0839), + q(0), + ], + q(pahari-potwari) => [ + q(5441), + q(0), + ], + q(pahi) => [ + q(3888), + q(0), + ], + q(pahlavani) => [ + q(5444), + q(0), + ], + q(pahlavi) => [ + q(0337), + q(0), + ], + q(pai tavytera) => [ + q(5620), + q(0), + ], + q(paici) => [ + q(5587), + q(0), + ], + q(paipai) => [ + q(5568), + q(0), + ], + q(paite chin) => [ + q(5387), + q(0), + ], + q(paiwan) => [ + q(5657), + q(0), + ], + q(pak-tong) => [ + q(5474), + q(0), + ], + q(pakaasnovos) => [ + q(5355), + q(0), + ], + q(pakanha) => [ + q(5476), + q(0), + ], + q(pakistan sign language) => [ + q(5480), + q(0), + ], + q(paku) => [ + q(5482), + q(0), + ], + q(paku karen) => [ + q(3110), + q(0), + ], + q(pal) => [ + q(0581), + q(0), + ], + q(palaic) => [ + q(5496), + q(0), + ], + q(palaka senoufo) => [ + q(5497), + q(0), + ], + q(palantla chinantec) => [ + q(1827), + q(0), + ], + q(palauan) => [ + q(0341), + q(0), + ], + q(paleni) => [ + q(5535), + q(0), + ], + q(palenquero) => [ + q(5493), + q(0), + ], + q(pali) => [ + q(0346), + q(0), + ], + q(palikur) => [ + q(5500), + q(0), + ], + q(paliyan) => [ + q(5382), + q(0), + ], + q(pallanganmiddang) => [ + q(5507), + q(0), + ], + q(palor) => [ + q(2330), + q(0), + ], + q(palpa) => [ + q(5495), + q(0), + ], + q(palu'e) => [ + q(5487), + q(0), + ], + q(paluan) => [ + q(5504), + q(0), + ], + q(palula) => [ + q(5437), + q(1), + ], + q(palya bareli) => [ + q(1395), + q(0), + ], + q(pam) => [ + q(5516), + q(0), + ], + q(pambia) => [ + q(5506), + q(0), + ], + q(pamlico) => [ + q(5513), + q(0), + ], + q(pamona) => [ + q(5509), + q(0), + ], + q(pamosu) => [ + q(2755), + q(0), + ], + q(pampanga) => [ + q(0338), + q(0), + ], + q(pamplona atta) => [ + q(0927), + q(0), + ], + q(pana (burkina faso)) => [ + q(5540), + q(0), + ], + q(pana (central african republic)) => [ + q(5549), + q(0), + ], + q(panamanian sign language) => [ + q(4056), + q(0), + ], + q(panamint) => [ + q(5352), + q(0), + ], + q(panao huanuco quechua) => [ + q(5714), + q(0), + ], + q(panara) => [ + q(3573), + q(0), + ], + q(panasuan) => [ + q(5610), + q(0), + ], + q(panawa) => [ + q(5653), + q(0), + ], + q(pancana) => [ + q(5539), + q(0), + ], + q(panchpargania) => [ + q(6418), + q(0), + ], + q(pande) => [ + q(1262), + q(0), + ], + q(pangasinan) => [ + q(0336), + q(0), + ], + q(pangseng) => [ + q(5429), + q(0), + ], + q(pangutaran sama) => [ + q(6094), + q(0), + ], + q(pangwa) => [ + q(5371), + q(0), + ], + q(pangwali) => [ + q(5424), + q(0), + ], + q(panim) => [ + q(5541), + q(0), + ], + q(paniya) => [ + q(5383), + q(0), + ], + q(panjabi) => [ + q(0339), + q(0), + ], + q(pankarare) => [ + q(5357), + q(0), + ], + q(pankararu) => [ + q(5359), + q(0), + ], + q(pankhu) => [ + q(5475), + q(0), + ], + q(pannei) => [ + q(5528), + q(0), + ], + q(pano) => [ + q(4498), + q(0), + ], + q(panoan katukina) => [ + q(3495), + q(0), + ], + q(panobo) => [ + q(5538), + q(0), + ], + q(panyi bai) => [ + q(1139), + q(0), + ], + q(panytyima) => [ + q(5546), + q(0), + ], + q(papantla totonac) => [ + q(6630), + q(0), + ], + q(papapana) => [ + q(5572), + q(0), + ], + q(papar) => [ + q(2127), + q(0), + ], + q(papasena) => [ + q(5353), + q(0), + ], + q(papel) => [ + q(5369), + q(0), + ], + q(papi) => [ + q(5567), + q(0), + ], + q(papiamento) => [ + q(0340), + q(0), + ], + q(papitalai) => [ + q(5354), + q(0), + ], + q(papora) => [ + q(5578), + q(0), + ], + q(papua new guinean sign language) => [ + q(5431), + q(0), + ], + q(papuan languages) => [ + q(0335), + q(0), + ], + q(papuan malay) => [ + q(5524), + q(0), + ], + q(papuma) => [ + q(5571), + q(0), + ], + q(para arara) => [ + q(0552), + q(0), + ], + q(para gaviao) => [ + q(2672), + q(0), + ], + q(para naga) => [ + q(5669), + q(0), + ], + q(parachi) => [ + q(5581), + q(0), + ], + q(paraguayan guarani) => [ + q(2646), + q(0), + ], + q(paraguayan sign language) => [ + q(5665), + q(0), + ], + q(parakana) => [ + q(5349), + q(0), + ], + q(paranan) => [ + q(5584), + q(0), + ], + q(paranawat) => [ + q(5346), + q(0), + ], + q(paraujano) => [ + q(5364), + q(0), + ], + q(parauk) => [ + q(5588), + q(0), + ], + q(parawen) => [ + q(5598), + q(0), + ], + q(pardhan) => [ + q(5384), + q(0), + ], + q(pardhi) => [ + q(5388), + q(0), + ], + q(pare) => [ + q(5577), + q(0), + ], + q(parecis) => [ + q(5342), + q(0), + ], + q(parenga) => [ + q(5386), + q(0), + ], + q(pari) => [ + q(3942), + q(0), + ], + q(parkari koli) => [ + q(3683), + q(0), + ], + q(parkwa) => [ + q(5366), + q(0), + ], + q(parsi) => [ + q(5592), + q(0), + ], + q(parsi-dari) => [ + q(5582), + q(0), + ], + q(parthian) => [ + q(7454), + q(0), + ], + q(parya) => [ + q(5351), + q(0), + ], + q(pashto) => [ + q(0352), + q(1), + ], + q(pasi) => [ + q(5613), + q(0), + ], + q(pass valley yali) => [ + q(7562), + q(0), + ], + q(patamona) => [ + q(5361), + q(0), + ], + q(patani) => [ + q(5623), + q(0), + ], + q(pataxo ha-ha-hae) => [ + q(5621), + q(0), + ], + q(patep) => [ + q(5625), + q(0), + ], + q(pathiya) => [ + q(5632), + q(0), + ], + q(patpatar) => [ + q(2487), + q(0), + ], + q(pattani) => [ + q(3787), + q(0), + ], + q(pattani malay) => [ + q(4217), + q(0), + ], + q(pattapu) => [ + q(5626), + q(0), + ], + q(patwin) => [ + q(5655), + q(0), + ], + q(paulohi) => [ + q(5489), + q(0), + ], + q(paumari) => [ + q(5344), + q(0), + ], + q(paunaka) => [ + q(5534), + q(0), + ], + q(pauri bareli) => [ + q(1138), + q(0), + ], + q(pauserna) => [ + q(5609), + q(0), + ], + q(pawaia) => [ + q(5652), + q(0), + ], + q(pawnee) => [ + q(5356), + q(0), + ], + q(paynamar) => [ + q(5519), + q(0), + ], + q(pe) => [ + q(5348), + q(0), + ], + q(pear) => [ + q(5378), + q(0), + ], + q(pech) => [ + q(5358), + q(0), + ], + q(pecheneg) => [ + q(7443), + q(0), + ], + q(pedi) => [ + q(0319), + q(0), + ], + q(peere) => [ + q(5420), + q(0), + ], + q(pei) => [ + q(5575), + q(0), + ], + q(pekal) => [ + q(5410), + q(0), + ], + q(pela) => [ + q(1569), + q(0), + ], + q(pele-ata) => [ + q(0910), + q(0), + ], + q(pelende) => [ + q(5574), + q(0), + ], + q(pemon) => [ + q(0817), + q(0), + ], + q(pemono) => [ + q(5415), + q(0), + ], + q(penang sign language) => [ + q(5605), + q(0), + ], + q(penchal) => [ + q(5409), + q(0), + ], + q(pendau) => [ + q(6897), + q(0), + ], + q(pengo) => [ + q(5405), + q(0), + ], + q(pennsylvania german) => [ + q(5394), + q(0), + ], + q(penoles mixtec) => [ + q(4301), + q(0), + ], + q(penrhyn) => [ + q(5531), + q(0), + ], + q(pentlatch) => [ + q(5631), + q(0), + ], + q(perai) => [ + q(7098), + q(0), + ], + q(peranakan indonesian) => [ + q(5400), + q(0), + ], + q(peripheral mongolian) => [ + q(4598), + q(0), + ], + q(pero) => [ + q(5460), + q(0), + ], + q(persian) => [ + q(0343), + q(0), + ], + q(persian sign language) => [ + q(5602), + q(0), + ], + q(persian, old (ca.600-400 b.c.)) => [ + q(0342), + q(0), + ], + q(peruvian sign language) => [ + q(5589), + q(0), + ], + q(petapa zapotec) => [ + q(7903), + q(0), + ], + q(petats) => [ + q(5416), + q(0), + ], + q(petjo) => [ + q(5417), + q(0), + ], + q(peve) => [ + q(3971), + q(0), + ], + q(pfaelzisch) => [ + q(5421), + q(0), + ], + q(phai) => [ + q(5596), + q(0), + ], + q(phake) => [ + q(5436), + q(0), + ], + q(phala) => [ + q(7712), + q(0), + ], + q(phalura) => [ + q(5437), + q(0), + ], + q(phana') => [ + q(5440), + q(0), + ], + q(phangduwali) => [ + q(5445), + q(0), + ], + q(phende) => [ + q(5411), + q(0), + ], + q(philippine languages) => [ + q(0344), + q(0), + ], + q(philippine sign language) => [ + q(5612), + q(0), + ], + q(phimbi) => [ + q(5438), + q(0), + ], + q(phoenician) => [ + q(0345), + q(0), + ], + q(phola) => [ + q(7714), + q(0), + ], + q(pholo) => [ + q(7640), + q(0), + ], + q(phom naga) => [ + q(5028), + q(0), + ], + q(phong-kniang) => [ + q(5547), + q(0), + ], + q(phrae pwo karen) => [ + q(3394), + q(0), + ], + q(phrygian) => [ + q(7445), + q(0), + ], + q(phu thai) => [ + q(5442), + q(0), + ], + q(phuan) => [ + q(5443), + q(0), + ], + q(phudagi) => [ + q(5433), + q(0), + ], + q(phuie) => [ + q(5639), + q(0), + ], + q(phukha) => [ + q(5435), + q(0), + ], + q(phuma) => [ + q(7716), + q(0), + ], + q(phunoi) => [ + q(5439), + q(0), + ], + q(phuong) => [ + q(5434), + q(0), + ], + q(phupa) => [ + q(7719), + q(0), + ], + q(phupha) => [ + q(7715), + q(0), + ], + q(phuza) => [ + q(7720), + q(0), + ], + q(piamatsina) => [ + q(5627), + q(0), + ], + q(piame) => [ + q(5458), + q(0), + ], + q(piapoco) => [ + q(5459), + q(0), + ], + q(piaroa) => [ + q(5449), + q(0), + ], + q(picard) => [ + q(5380), + q(0), + ], + q(pichis asheninka) => [ + q(1835), + q(0), + ], + q(pictish) => [ + q(7446), + q(0), + ], + q(pidgin delaware) => [ + q(1992), + q(0), + ], + q(piemontese) => [ + q(5520), + q(0), + ], + q(pijao) => [ + q(5455), + q(0), + ], + q(pije) => [ + q(5469), + q(0), + ], + q(pijin) => [ + q(5462), + q(0), + ], + q(pilaga) => [ + q(5488), + q(0), + ], + q(pileni) => [ + q(5465), + q(0), + ], + q(pilipino) => [ + q(0134), + q(1), + ], + q(pima bajo) => [ + q(5446), + q(0), + ], + q(pimbwe) => [ + q(5466), + q(0), + ], + q(pinai-hagahai) => [ + q(5537), + q(0), + ], + q(pingelapese) => [ + q(5451), + q(0), + ], + q(pini) => [ + q(5454), + q(0), + ], + q(pinigura) => [ + q(5545), + q(0), + ], + q(pinjarup) => [ + q(5533), + q(0), + ], + q(pinji) => [ + q(5448), + q(0), + ], + q(pinotepa nacional mixtec) => [ + q(4303), + q(0), + ], + q(pintiini) => [ + q(5622), + q(0), + ], + q(pintupi-luritja) => [ + q(5464), + q(0), + ], + q(pinyin) => [ + q(5548), + q(0), + ], + q(pipil) => [ + q(5570), + q(0), + ], + q(piraha) => [ + q(4679), + q(0), + ], + q(piratapuyo) => [ + q(5461), + q(0), + ], + q(pirlatapa) => [ + q(1574), + q(0), + ], + q(piro) => [ + q(5450), + q(0), + ], + q(pirriya) => [ + q(7442), + q(0), + ], + q(pisabo) => [ + q(5452), + q(0), + ], + q(pisaflores tepehua) => [ + q(6651), + q(0), + ], + q(piscataway) => [ + q(5619), + q(0), + ], + q(pisidian) => [ + q(7455), + q(0), + ], + q(pitcairn-norfolk) => [ + q(5453), + q(0), + ], + q(pite sami) => [ + q(6049), + q(0), + ], + q(piti) => [ + q(5390), + q(0), + ], + q(pitjantjatjara) => [ + q(5470), + q(0), + ], + q(pitta pitta) => [ + q(5463), + q(0), + ], + q(piu) => [ + q(5467), + q(0), + ], + q(piya-kwonci) => [ + q(5468), + q(0), + ], + q(plains cree) => [ + q(1847), + q(0), + ], + q(plains indian sign language) => [ + q(5603), + q(0), + ], + q(plains miwok) => [ + q(5522), + q(0), + ], + q(plapo krumen) => [ + q(3624), + q(0), + ], + q(plateau malagasy) => [ + q(5499), + q(0), + ], + q(plautdietsch) => [ + q(5398), + q(0), + ], + q(playero) => [ + q(2584), + q(0), + ], + q(pnar) => [ + q(5375), + q(0), + ], + q(pochuri naga) => [ + q(5032), + q(0), + ], + q(pochutec) => [ + q(7451), + q(0), + ], + q(podena) => [ + q(5396), + q(0), + ], + q(pogolo) => [ + q(5566), + q(0), + ], + q(pohnpeian) => [ + q(0348), + q(0), + ], + q(pokanga) => [ + q(5556), + q(0), + ], + q(poke) => [ + q(5552), + q(0), + ], + q(pokomo) => [ + q(5472), + q(0), + ], + q(pokoot) => [ + q(5477), + q(0), + ], + q(polabian) => [ + q(5565), + q(0), + ], + q(polari) => [ + q(5486), + q(0), + ], + q(polci) => [ + q(5490), + q(0), + ], + q(polish) => [ + q(0347), + q(0), + ], + q(polish sign language) => [ + q(5611), + q(0), + ], + q(polonombauk) => [ + q(5484), + q(0), + ], + q(pom) => [ + q(5517), + q(0), + ], + q(pomo) => [ + q(5515), + q(0), + ], + q(ponam) => [ + q(4756), + q(0), + ], + q(pongu) => [ + q(5530), + q(0), + ], + q(ponosakan) => [ + q(5542), + q(0), + ], + q(pontic) => [ + q(5543), + q(0), + ], + q(ponyo-gongwang naga) => [ + q(5027), + q(0), + ], + q(popti') => [ + q(3041), + q(0), + ], + q(poqomam) => [ + q(5550), + q(0), + ], + q(poqomchi') => [ + q(5554), + q(0), + ], + q(porohanon) => [ + q(5586), + q(0), + ], + q(port sandwich) => [ + q(5618), + q(0), + ], + q(port vato) => [ + q(5630), + q(0), + ], + q(portuguese) => [ + q(0349), + q(0), + ], + q(portuguese sign language) => [ + q(5614), + q(0), + ], + q(portuguese-based creoles and pidgins) => [ + q(0096), + q(2), + ], + q(potawatomi) => [ + q(5562), + q(0), + ], + q(potiguara) => [ + q(5553), + q(0), + ], + q(pottangi ollar gadaba) => [ + q(2451), + q(0), + ], + q(poule) => [ + q(4534), + q(1), + ], + q(poumei naga) => [ + q(5523), + q(0), + ], + q(pouye) => [ + q(1593), + q(0), + ], + q(powari) => [ + q(5659), + q(0), + ], + q(powhatan) => [ + q(5457), + q(0), + ], + q(poyanawa) => [ + q(5664), + q(0), + ], + q(prakrit languages) => [ + q(0350), + q(0), + ], + q(prasuni) => [ + q(5591), + q(0), + ], + q(primitive irish) => [ + q(5427), + q(0), + ], + q(principense) => [ + q(5583), + q(0), + ], + q(provencal) => [ + q(0327), + q(1), + ], + q(provencal, old (to 1500)) => [ + q(0351), + q(0), + ], + q(providencia sign language) => [ + q(5600), + q(0), + ], + q(prussian) => [ + q(5585), + q(0), + ], + q(psikye) => [ + q(3670), + q(0), + ], + q(pu-xian chinese) => [ + q(1836), + q(0), + ], + q(puare) => [ + q(5650), + q(0), + ], + q(pudtol atta) => [ + q(0923), + q(0), + ], + q(puelche) => [ + q(5637), + q(0), + ], + q(puerto rican sign language) => [ + q(5608), + q(0), + ], + q(puimei naga) => [ + q(5034), + q(0), + ], + q(puinave) => [ + q(5640), + q(0), + ], + q(pukapuka) => [ + q(5478), + q(0), + ], + q(pulaar) => [ + q(2379), + q(0), + ], + q(pulabu) => [ + q(5644), + q(0), + ], + q(pular) => [ + q(2382), + q(0), + ], + q(puluwatese) => [ + q(5649), + q(0), + ], + q(puma) => [ + q(5642), + q(0), + ], + q(pume) => [ + q(7564), + q(0), + ], + q(pumpokol) => [ + q(7449), + q(0), + ], + q(punan aput) => [ + q(5636), + q(0), + ], + q(punan bah-biau) => [ + q(5526), + q(0), + ], + q(punan batu 1) => [ + q(5536), + q(0), + ], + q(punan merah) => [ + q(5638), + q(0), + ], + q(punan merap) => [ + q(5635), + q(0), + ], + q(punan tubu) => [ + q(5641), + q(0), + ], + q(punic) => [ + q(7457), + q(0), + ], + q(punjabi) => [ + q(0339), + q(1), + ], + q(puno quechua) => [ + q(5718), + q(0), + ], + q(punthamara) => [ + q(7456), + q(0), + ], + q(punu) => [ + q(5648), + q(0), + ], + q(puoc) => [ + q(5643), + q(0), + ], + q(puquina) => [ + q(5645), + q(0), + ], + q(puragi) => [ + q(5597), + q(0), + ], + q(purari) => [ + q(2883), + q(0), + ], + q(purepecha) => [ + q(6718), + q(0), + ], + q(puri) => [ + q(5594), + q(0), + ], + q(purik) => [ + q(5599), + q(0), + ], + q(purisimeno) => [ + q(5651), + q(0), + ], + q(puroik) => [ + q(6276), + q(0), + ], + q(purubora) => [ + q(5646), + q(0), + ], + q(purum) => [ + q(5634), + q(0), + ], + q(pushto) => [ + q(0352), + q(0), + ], + q(putai) => [ + q(4228), + q(0), + ], + q(putoh) => [ + q(5647), + q(0), + ], + q(putukwam) => [ + q(0642), + q(0), + ], + q(puyo) => [ + q(7458), + q(0), + ], + q(puyo-paekche) => [ + q(7452), + q(0), + ], + q(puyuma) => [ + q(5666), + q(0), + ], + q(pwaamei) => [ + q(5508), + q(0), + ], + q(pwapwa) => [ + q(5559), + q(0), + ], + q(pwo eastern karen) => [ + q(3390), + q(0), + ], + q(pwo northern karen) => [ + q(5660), + q(0), + ], + q(pwo western karen) => [ + q(5658), + q(0), + ], + q(pyapun) => [ + q(5392), + q(0), + ], + q(pye krumen) => [ + q(5662), + q(0), + ], + q(pyen) => [ + q(5668), + q(0), + ], + q(pyu (myanmar)) => [ + q(5667), + q(0), + ], + q(pyu (papua new guinea)) => [ + q(5376), + q(0), + ], + q(q'anjob'al) => [ + q(3376), + q(0), + ], + q(qabiao) => [ + q(3796), + q(0), + ], + q(qaqet) => [ + q(1610), + q(0), + ], + q(qashqa'i) => [ + q(5719), + q(0), + ], + q(qatabanian) => [ + q(7460), + q(0), + ], + q(qau) => [ + q(2611), + q(0), + ], + q(qawasqar) => [ + q(0747), + q(0), + ], + q(qila muji) => [ + q(7686), + q(0), + ], + q(qimant) => [ + q(0680), + q(0), + ], + q(qiubei zhuang) => [ + q(7925), + q(0), + ], + q(quapaw) => [ + q(5670), + q(0), + ], + q(quebec sign language) => [ + q(2337), + q(0), + ], + q(quechan) => [ + q(7758), + q(0), + ], + q(quechua) => [ + q(0354), + q(0), + ], + q(quechuan (family)) => [ + q(0524), + q(0), + ], + q(quenya) => [ + q(5725), + q(0), + ], + q(queretaro otomi) => [ + q(5320), + q(0), + ], + q(quetzaltepec mixe) => [ + q(5661), + q(0), + ], + q(queyu) => [ + q(5704), + q(0), + ], + q(quiavicuzas zapotec) => [ + q(7908), + q(0), + ], + q(quiche) => [ + q(5672), + q(1), + ], + q(quileute) => [ + q(5677), + q(0), + ], + q(quinault) => [ + q(5681), + q(0), + ], + q(quinqui) => [ + q(5683), + q(0), + ], + q(quioquitani-quieri zapotec) => [ + q(7944), + q(0), + ], + q(quiotepec chinantec) => [ + q(1722), + q(0), + ], + q(quiripi) => [ + q(5726), + q(0), + ], + q(rabha) => [ + q(5733), + q(0), + ], + q(rade) => [ + q(5730), + q(0), + ], + q(raetic) => [ + q(7470), + q(0), + ], + q(rahambuu) => [ + q(5748), + q(0), + ], + q(rajah kabunsuwan manobo) => [ + q(4483), + q(0), + ], + q(rajasthani) => [ + q(0355), + q(0), + ], + q(rajbanshi) => [ + q(5787), + q(0), + ], + q(raji) => [ + q(5786), + q(0), + ], + q(rajong) => [ + q(5785), + q(0), + ], + q(rajput garasia) => [ + q(2612), + q(0), + ], + q(rakahanga-manihiki) => [ + q(5790), + q(0), + ], + q(rakhine) => [ + q(5791), + q(0), + ], + q(ralte) => [ + q(5736), + q(0), + ], + q(rama) => [ + q(5795), + q(0), + ], + q(ramoaaina) => [ + q(5734), + q(0), + ], + q(ramopa) => [ + q(3397), + q(0), + ], + q(rampi) => [ + q(3924), + q(0), + ], + q(rana tharu) => [ + q(6497), + q(0), + ], + q(rang) => [ + q(5746), + q(0), + ], + q(rangkas) => [ + q(5770), + q(0), + ], + q(ranglong) => [ + q(5821), + q(0), + ], + q(rangpuri) => [ + q(5793), + q(0), + ], + q(rao) => [ + q(5739), + q(0), + ], + q(rapa) => [ + q(5747), + q(0), + ], + q(rapanui) => [ + q(0356), + q(0), + ], + q(rapoisi) => [ + q(3758), + q(0), + ], + q(rapting) => [ + q(5839), + q(0), + ], + q(rara bakati') => [ + q(4033), + q(0), + ], + q(rarotongan) => [ + q(0357), + q(0), + ], + q(rasawa) => [ + q(5729), + q(0), + ], + q(ratagnon) => [ + q(1481), + q(0), + ], + q(ratahan) => [ + q(5847), + q(0), + ], + q(rathawi) => [ + q(5850), + q(0), + ], + q(rathwi bareli) => [ + q(1165), + q(0), + ], + q(raute) => [ + q(5743), + q(0), + ], + q(ravula) => [ + q(7606), + q(0), + ], + q(rawa) => [ + q(5868), + q(0), + ], + q(rawang) => [ + q(5745), + q(0), + ], + q(rawat) => [ + q(3131), + q(0), + ], + q(rawngtu chin) => [ + q(7099), + q(0), + ], + q(rawo) => [ + q(5865), + q(0), + ], + q(rayon zoque) => [ + q(7897), + q(0), + ], + q(razajerdi) => [ + q(5742), + q(0), + ], + q(razihi) => [ + q(5875), + q(0), + ], + q(red gelao) => [ + q(2521), + q(0), + ], + q(reel) => [ + q(0928), + q(0), + ], + q(rejang) => [ + q(5760), + q(0), + ], + q(rejang kayan) => [ + q(5757), + q(0), + ], + q(reli) => [ + q(5759), + q(0), + ], + q(rema) => [ + q(1371), + q(0), + ], + q(rembarunga) => [ + q(5796), + q(0), + ], + q(rembong) => [ + q(5756), + q(0), + ], + q(remo) => [ + q(5762), + q(0), + ], + q(remontado dumagat) => [ + q(0673), + q(0), + ], + q(rempi) => [ + q(5809), + q(0), + ], + q(remun) => [ + q(3937), + q(0), + ], + q(rendille) => [ + q(5761), + q(0), + ], + q(rengao) => [ + q(5763), + q(0), + ], + q(rennell-bellona) => [ + q(4425), + q(0), + ], + q(repanbitip) => [ + q(5838), + q(0), + ], + q(rer bare) => [ + q(5764), + q(0), + ], + q(rerau) => [ + q(5755), + q(0), + ], + q(rerep) => [ + q(5426), + q(0), + ], + q(reserved for local use) => [ + q(0353), + q(0), + ], + q(reshe) => [ + q(5765), + q(0), + ], + q(resigaro) => [ + q(5772), + q(0), + ], + q(retta) => [ + q(5766), + q(0), + ], + q(reunion creole french) => [ + q(5753), + q(0), + ], + q(reyesano) => [ + q(5767), + q(0), + ], + q(riang (india)) => [ + q(5777), + q(0), + ], + q(riang (myanmar)) => [ + q(5779), + q(0), + ], + q(riantana) => [ + q(5738), + q(0), + ], + q(ribun) => [ + q(5782), + q(0), + ], + q(rifao) => [ + q(4977), + q(1), + ], + q(rikbaktsa) => [ + q(5789), + q(0), + ], + q(rincon zapotec) => [ + q(7805), + q(0), + ], + q(rinconada bikol) => [ + q(1482), + q(0), + ], + q(ringgou) => [ + q(5774), + q(0), + ], + q(ririo) => [ + q(5840), + q(0), + ], + q(ritarungo) => [ + q(5783), + q(0), + ], + q(riung) => [ + q(5784), + q(0), + ], + q(riverain sango) => [ + q(6131), + q(0), + ], + q(rogo) => [ + q(5828), + q(0), + ], + q(rohingya) => [ + q(5775), + q(0), + ], + q(roma) => [ + q(5806), + q(0), + ], + q(romagnol) => [ + q(5771), + q(0), + ], + q(romam) => [ + q(5816), + q(0), + ], + q(romance languages) => [ + q(0358), + q(0), + ], + q(romanian) => [ + q(0361), + q(0), + ], + q(romanian sign language) => [ + q(5811), + q(0), + ], + q(romano-greek) => [ + q(5769), + q(0), + ], + q(romano-serbian) => [ + q(5843), + q(0), + ], + q(romanova) => [ + q(5814), + q(0), + ], + q(romansh) => [ + q(0359), + q(0), + ], + q(romany) => [ + q(0360), + q(0), + ], + q(romblomanon) => [ + q(5832), + q(0), + ], + q(rombo) => [ + q(5830), + q(0), + ], + q(romkun) => [ + q(5804), + q(0), + ], + q(ron) => [ + q(1766), + q(0), + ], + q(ronga) => [ + q(5820), + q(0), + ], + q(rongga) => [ + q(5835), + q(0), + ], + q(rongmei naga) => [ + q(4750), + q(0), + ], + q(rongpo) => [ + q(5823), + q(0), + ], + q(ronji) => [ + q(5829), + q(0), + ], + q(roon) => [ + q(5822), + q(0), + ], + q(roria) => [ + q(5768), + q(0), + ], + q(rotokas) => [ + q(5833), + q(0), + ], + q(rotuman) => [ + q(5848), + q(0), + ], + q(roviana) => [ + q(5855), + q(0), + ], + q(ruching palaung) => [ + q(5381), + q(0), + ], + q(rudbari) => [ + q(5754), + q(0), + ], + q(rufiji) => [ + q(5857), + q(0), + ], + q(ruga) => [ + q(5856), + q(0), + ], + q(rukai) => [ + q(2141), + q(0), + ], + q(ruma) => [ + q(5864), + q(0), + ], + q(rumai palaung) => [ + q(5749), + q(0), + ], + q(rumu) => [ + q(3442), + q(0), + ], + q(rundi) => [ + q(0362), + q(0), + ], + q(runga) => [ + q(5836), + q(0), + ], + q(rungtu chin) => [ + q(5846), + q(0), + ], + q(rungus) => [ + q(2132), + q(0), + ], + q(rungwa) => [ + q(5825), + q(0), + ], + q(russia buriat) => [ + q(1583), + q(0), + ], + q(russian) => [ + q(0364), + q(0), + ], + q(russian sign language) => [ + q(5844), + q(0), + ], + q(rusyn) => [ + q(5853), + q(0), + ], + q(rutul) => [ + q(5861), + q(0), + ], + q(ruuli) => [ + q(5852), + q(0), + ], + q(ruund) => [ + q(5819), + q(0), + ], + q(rwa) => [ + q(5866), + q(0), + ], + q(s'gaw karen) => [ + q(3611), + q(0), + ], + q(sa) => [ + q(5889), + q(0), + ], + q(sa'a) => [ + q(0835), + q(0), + ], + q(sa'ban) => [ + q(6141), + q(0), + ], + q(sa'och) => [ + q(5927), + q(0), + ], + q(saafi-saafi) => [ + q(5887), + q(0), + ], + q(saam) => [ + q(5740), + q(0), + ], + q(saamia) => [ + q(4054), + q(0), + ], + q(saaroa) => [ + q(6319), + q(0), + ], + q(saba) => [ + q(5876), + q(0), + ], + q(sabaean) => [ + q(7474), + q(0), + ], + q(sabah bisaya) => [ + q(1470), + q(0), + ], + q(sabah malay) => [ + q(4531), + q(0), + ], + q(sabane) => [ + q(5879), + q(0), + ], + q(sabaot) => [ + q(6186), + q(0), + ], + q(sabine) => [ + q(5913), + q(0), + ], + q(sabu) => [ + q(2875), + q(0), + ], + q(sabum) => [ + q(5906), + q(0), + ], + q(sacapulteco) => [ + q(5686), + q(0), + ], + q(sadri) => [ + q(5924), + q(0), + ], + q(saek) => [ + q(6063), + q(0), + ], + q(saep) => [ + q(6169), + q(0), + ], + q(safaliba) => [ + q(5880), + q(0), + ], + q(safeyoka) => [ + q(0859), + q(0), + ], + q(safwa) => [ + q(5902), + q(0), + ], + q(sagala) => [ + q(5904), + q(0), + ], + q(sagalla) => [ + q(6464), + q(0), + ], + q(saho) => [ + q(6241), + q(0), + ], + q(sahu) => [ + q(5881), + q(0), + ], + q(saidi arabic) => [ + q(0626), + q(0), + ], + q(saint lucian creole french) => [ + q(0588), + q(0), + ], + q(saisiyat) => [ + q(7491), + q(0), + ], + q(sajalong) => [ + q(6052), + q(0), + ], + q(sajau basap) => [ + q(6047), + q(0), + ], + q(sakachep) => [ + q(5922), + q(0), + ], + q(sakalava malagasy) => [ + q(6068), + q(0), + ], + q(sakan) => [ + q(0224), + q(1), + ], + q(sakao) => [ + q(6080), + q(0), + ], + q(sakata) => [ + q(6079), + q(0), + ], + q(sake) => [ + q(5882), + q(0), + ], + q(sakirabia) => [ + q(6067), + q(0), + ], + q(sala) => [ + q(6015), + q(0), + ], + q(salako) => [ + q(3499), + q(1), + ], + q(salampasu) => [ + q(6103), + q(0), + ], + q(salar) => [ + q(6098), + q(0), + ], + q(salas) => [ + q(5996), + q(0), + ], + q(salasaca highland quichua) => [ + q(5715), + q(0), + ], + q(salchuq) => [ + q(6097), + q(0), + ], + q(saleman) => [ + q(5886), + q(0), + ], + q(saliba) => [ + q(5896), + q(0), + ], + q(salinan) => [ + q(6095), + q(0), + ], + q(salishan languages) => [ + q(0369), + q(0), + ], + q(sallands) => [ + q(5953), + q(0), + ], + q(salt-yui) => [ + q(6093), + q(0), + ], + q(saluan) => [ + q(4008), + q(0), + ], + q(saluma) => [ + q(6092), + q(0), + ], + q(salvadoran sign language) => [ + q(2294), + q(0), + ], + q(sam) => [ + q(6143), + q(0), + ], + q(sama) => [ + q(6108), + q(0), + ], + q(samaritan) => [ + q(6115), + q(0), + ], + q(samaritan aramaic) => [ + q(0370), + q(0), + ], + q(samarokena) => [ + q(6582), + q(0), + ], + q(samatao) => [ + q(7733), + q(0), + ], + q(samay) => [ + q(6333), + q(0), + ], + q(samba) => [ + q(6122), + q(0), + ], + q(samba daka) => [ + q(1681), + q(0), + ], + q(samba leko) => [ + q(4784), + q(0), + ], + q(sambal) => [ + q(7475), + q(0), + ], + q(sambalpuri) => [ + q(6184), + q(0), + ], + q(sambe) => [ + q(7260), + q(0), + ], + q(samberigi) => [ + q(6240), + q(0), + ], + q(samburu) => [ + q(5884), + q(0), + ], + q(samei) => [ + q(6111), + q(0), + ], + q(sami languages) => [ + q(0390), + q(0), + ], + q(samo) => [ + q(6116), + q(0), + ], + q(samoan) => [ + q(0393), + q(0), + ], + q(samogitian) => [ + q(5994), + q(0), + ], + q(samosa) => [ + q(6297), + q(0), + ], + q(samoyedic languages) => [ + q(0527), + q(0), + ], + q(sampang) => [ + q(5744), + q(0), + ], + q(samre) => [ + q(6316), + q(0), + ], + q(samtao) => [ + q(6262), + q(0), + ], + q(samvedi) => [ + q(6120), + q(0), + ], + q(san agustin mixtepec zapotec) => [ + q(7941), + q(0), + ], + q(san baltazar loxicha zapotec) => [ + q(7922), + q(0), + ], + q(san blas kuna) => [ + q(1905), + q(0), + ], + q(san dionisio del mar huave) => [ + q(2873), + q(0), + ], + q(san felipe otlaltepec popoloca) => [ + q(5564), + q(0), + ], + q(san francisco del mar huave) => [ + q(2852), + q(0), + ], + q(san francisco matlatzinca) => [ + q(4114), + q(0), + ], + q(san jeronimo tecoatl mazatec) => [ + q(4107), + q(0), + ], + q(san juan atzingo popoloca) => [ + q(5551), + q(0), + ], + q(san juan colorado mixtec) => [ + q(4314), + q(0), + ], + q(san juan guelavia zapotec) => [ + q(7791), + q(1), + ], + q(san juan teita mixtec) => [ + q(7500), + q(0), + ], + q(san luis temalacayuca popoloca) => [ + q(5576), + q(0), + ], + q(san marcos tlacoyalco popoloca) => [ + q(5498), + q(0), + ], + q(san marcos tlalcoyalco popoloca) => [ + q(5498), + q(1), + ], + q(san martin itunyoso triqui) => [ + q(6687), + q(0), + ], + q(san martin quechua) => [ + q(5702), + q(0), + ], + q(san mateo del mar huave) => [ + q(2867), + q(0), + ], + q(san miguel creole french) => [ + q(5920), + q(0), + ], + q(san miguel el grande mixtec) => [ + q(4296), + q(0), + ], + q(san miguel piedras mixtec) => [ + q(7505), + q(0), + ], + q(san pedro amuzgos amuzgo) => [ + q(1016), + q(0), + ], + q(san pedro quiatoni zapotec) => [ + q(7904), + q(0), + ], + q(san salvador kongo) => [ + q(3709), + q(0), + ], + q(san vicente coatlan zapotec) => [ + q(7918), + q(0), + ], + q(sanaani arabic) => [ + q(1003), + q(0), + ], + q(sanapana) => [ + q(6176), + q(0), + ], + q(sandawe) => [ + q(0365), + q(0), + ], + q(sanga (democratic republic of congo)) => [ + q(6129), + q(0), + ], + q(sanga (nigeria)) => [ + q(7483), + q(0), + ], + q(sanggau) => [ + q(5921), + q(0), + ], + q(sangil) => [ + q(6132), + q(0), + ], + q(sangir) => [ + q(6317), + q(0), + ], + q(sangisari) => [ + q(5993), + q(0), + ], + q(sangkong) => [ + q(5990), + q(0), + ], + q(sanglechi) => [ + q(5999), + q(0), + ], + q(sango) => [ + q(0366), + q(0), + ], + q(sangtam naga) => [ + q(5061), + q(0), + ], + q(sangu (gabon)) => [ + q(6137), + q(0), + ], + q(sangu (tanzania)) => [ + q(5907), + q(0), + ], + q(sani) => [ + q(7736), + q(0), + ], + q(sanie) => [ + q(7741), + q(0), + ], + q(saniyo-hiyewe) => [ + q(6144), + q(0), + ], + q(sankaran maninka) => [ + q(4525), + q(0), + ], + q(sansi) => [ + q(6226), + q(0), + ], + q(sanskrit) => [ + q(0371), + q(0), + ], + q(santa ana de tusi pasco quechua) => [ + q(5722), + q(0), + ], + q(santa catarina albarradas zapotec) => [ + q(7942), + q(0), + ], + q(santa ines ahuatempan popoloca) => [ + q(5377), + q(0), + ], + q(santa ines yatzechi zapotec) => [ + q(7912), + q(0), + ], + q(santa lucia monteverde mixtec) => [ + q(4189), + q(0), + ], + q(santa maria del mar huave) => [ + q(2876), + q(0), + ], + q(santa maria la alta nahuatl) => [ + q(4875), + q(0), + ], + q(santa maria quiegolani zapotec) => [ + q(7907), + q(0), + ], + q(santa maria zacatepec mixtec) => [ + q(4687), + q(0), + ], + q(santa teresa cora) => [ + q(1815), + q(0), + ], + q(santali) => [ + q(0373), + q(0), + ], + q(santiago del estero quichua) => [ + q(5685), + q(0), + ], + q(santiago xanica zapotec) => [ + q(7916), + q(0), + ], + q(santo domingo albarradas zapotec) => [ + q(7806), + q(0), + ], + q(sanuma) => [ + q(7489), + q(0), + ], + q(sao paulo kaingang) => [ + q(7851), + q(0), + ], + q(saotomense) => [ + q(1845), + q(0), + ], + q(saparua) => [ + q(6180), + q(0), + ], + q(sape) => [ + q(6168), + q(0), + ], + q(sapo) => [ + q(3579), + q(0), + ], + q(saponi) => [ + q(6172), + q(0), + ], + q(saposa) => [ + q(6181), + q(0), + ], + q(sapuan) => [ + q(6183), + q(0), + ], + q(sar) => [ + q(4627), + q(0), + ], + q(sara) => [ + q(6201), + q(0), + ], + q(sara kaba) => [ + q(5917), + q(0), + ], + q(sara kaba deme) => [ + q(3692), + q(0), + ], + q(sara kaba naa) => [ + q(3706), + q(0), + ], + q(saraiki) => [ + q(6077), + q(0), + ], + q(saramaccan) => [ + q(6208), + q(0), + ], + q(sarangani blaan) => [ + q(1390), + q(0), + ], + q(sarangani manobo) => [ + q(4137), + q(0), + ], + q(sarasira) => [ + q(7932), + q(0), + ], + q(saraveca) => [ + q(5885), + q(0), + ], + q(sardinian) => [ + q(0403), + q(0), + ], + q(sari) => [ + q(0895), + q(0), + ], + q(sarikoli) => [ + q(6204), + q(0), + ], + q(sarli) => [ + q(5938), + q(0), + ], + q(sarsi) => [ + q(6211), + q(0), + ], + q(sartang) => [ + q(5271), + q(0), + ], + q(sarua) => [ + q(6309), + q(0), + ], + q(sarudu) => [ + q(5951), + q(0), + ], + q(saruga) => [ + q(6198), + q(0), + ], + q(sasak) => [ + q(0372), + q(0), + ], + q(sasaru) => [ + q(6320), + q(0), + ], + q(sassarese sardinian) => [ + q(5936), + q(0), + ], + q(satawalese) => [ + q(6264), + q(0), + ], + q(satere-mawe) => [ + q(4116), + q(0), + ], + q(saterfriesisch) => [ + q(6258), + q(0), + ], + q(saudi arabian sign language) => [ + q(5943), + q(0), + ], + q(sauraseni prakrit) => [ + q(5617), + q(0), + ], + q(saurashtra) => [ + q(5891), + q(0), + ], + q(sauri) => [ + q(6212), + q(0), + ], + q(sauria paharia) => [ + q(4330), + q(0), + ], + q(sause) => [ + q(5883), + q(0), + ], + q(sausi) => [ + q(6227), + q(0), + ], + q(savi) => [ + q(5939), + q(0), + ], + q(savosavo) => [ + q(6286), + q(0), + ], + q(sawai) => [ + q(6346), + q(0), + ], + q(saweru) => [ + q(6302), + q(0), + ], + q(sawi) => [ + q(5888), + q(0), + ], + q(sawila) => [ + q(6304), + q(0), + ], + q(sawknah) => [ + q(6298), + q(0), + ], + q(saxon, low) => [ + q(0307), + q(3), + ], + q(saxwe gbe) => [ + q(6322), + q(0), + ], + q(saya) => [ + q(5890), + q(0), + ], + q(sayula popoluca) => [ + q(5561), + q(0), + ], + q(scots) => [ + q(0375), + q(0), + ], + q(scottish gaelic) => [ + q(0154), + q(1), + ], + q(scythian) => [ + q(7476), + q(0), + ], + q(sea island creole english) => [ + q(2650), + q(0), + ], + q(seba) => [ + q(3239), + q(0), + ], + q(sebat bet gurage) => [ + q(5997), + q(0), + ], + q(seberuang) => [ + q(5915), + q(0), + ], + q(sebop) => [ + q(6026), + q(0), + ], + q(sebuyau) => [ + q(6125), + q(0), + ], + q(sechelt) => [ + q(5956), + q(0), + ], + q(secoya) => [ + q(5975), + q(0), + ], + q(sedang) => [ + q(5957), + q(0), + ], + q(sedoa) => [ + q(6774), + q(0), + ], + q(seeku) => [ + q(6160), + q(0), + ], + q(segai) => [ + q(5985), + q(0), + ], + q(segeju) => [ + q(5960), + q(0), + ], + q(seget) => [ + q(5898), + q(0), + ], + q(sehwi) => [ + q(5981), + q(0), + ], + q(seimat) => [ + q(6224), + q(0), + ], + q(seit-kaitetu) => [ + q(2758), + q(0), + ], + q(sekak) => [ + q(3829), + q(1), + ], + q(sekani) => [ + q(5964), + q(0), + ], + q(sekapan) => [ + q(6075), + q(0), + ], + q(sekar) => [ + q(6085), + q(0), + ], + q(seke (nepal)) => [ + q(6071), + q(0), + ], + q(seke (vanuatu)) => [ + q(6066), + q(0), + ], + q(sekele) => [ + q(6960), + q(0), + ], + q(seki) => [ + q(6325), + q(0), + ], + q(seko padang) => [ + q(6083), + q(0), + ], + q(seko tengah) => [ + q(6074), + q(0), + ], + q(sekpele) => [ + q(3913), + q(0), + ], + q(selangor sign language) => [ + q(3313), + q(0), + ], + q(selaru) => [ + q(6101), + q(0), + ], + q(selayar) => [ + q(6104), + q(0), + ], + q(selee) => [ + q(6142), + q(0), + ], + q(selepet) => [ + q(6174), + q(0), + ], + q(selian) => [ + q(6315), + q(0), + ], + q(selkup) => [ + q(0376), + q(0), + ], + q(selungai murut) => [ + q(6089), + q(0), + ], + q(seluwasan) => [ + q(6303), + q(0), + ], + q(semai) => [ + q(5954), + q(0), + ], + q(semandang) => [ + q(5944), + q(0), + ], + q(semaq beri) => [ + q(6337), + q(0), + ], + q(sembakung murut) => [ + q(5909), + q(0), + ], + q(semelai) => [ + q(6335), + q(0), + ], + q(semimi) => [ + q(2310), + q(0), + ], + q(semitic languages) => [ + q(0377), + q(0), + ], + q(semnam) => [ + q(6230), + q(0), + ], + q(semnani) => [ + q(6123), + q(0), + ], + q(sempan) => [ + q(7478), + q(0), + ], + q(sena) => [ + q(5961), + q(0), + ], + q(senara senoufo) => [ + q(5968), + q(0), + ], + q(senaya) => [ + q(6329), + q(0), + ], + q(sene) => [ + q(5963), + q(0), + ], + q(seneca) => [ + q(5958), + q(0), + ], + q(sened) => [ + q(5949), + q(0), + ], + q(sengele) => [ + q(6340), + q(0), + ], + q(senggi) => [ + q(6140), + q(0), + ], + q(sengo) => [ + q(6173), + q(0), + ], + q(sengseng) => [ + q(6242), + q(0), + ], + q(senhaja de srair) => [ + q(6058), + q(0), + ], + q(sensi) => [ + q(6130), + q(0), + ], + q(sentani) => [ + q(5971), + q(0), + ], + q(senthang chin) => [ + q(5976), + q(0), + ], + q(sentinel) => [ + q(6245), + q(0), + ], + q(sepa (indonesia)) => [ + q(6167), + q(0), + ], + q(sepa (papua new guinea)) => [ + q(6170), + q(0), + ], + q(sepedi) => [ + q(0319), + q(1), + ], + q(sepik iwam) => [ + q(3030), + q(0), + ], + q(sera) => [ + q(6217), + q(0), + ], + q(seraiki) => [ + q(6077), + q(1), + ], + q(serbian) => [ + q(0405), + q(0), + ], + q(serbo-croatian) => [ + q(0538), + q(0), + ], + q(sere) => [ + q(6290), + q(0), + ], + q(serer) => [ + q(0406), + q(0), + ], + q(seri) => [ + q(5962), + q(0), + ], + q(serili) => [ + q(6283), + q(0), + ], + q(seroa) => [ + q(3564), + q(0), + ], + q(serrano) => [ + q(5969), + q(0), + ], + q(seru) => [ + q(6338), + q(0), + ], + q(serua) => [ + q(6215), + q(0), + ], + q(serudung murut) => [ + q(6206), + q(0), + ], + q(serui-laut) => [ + q(5972), + q(0), + ], + q(seselwa creole french) => [ + q(1854), + q(0), + ], + q(seta) => [ + q(6247), + q(0), + ], + q(setaman) => [ + q(6254), + q(0), + ], + q(seti) => [ + q(5900), + q(0), + ], + q(settla) => [ + q(6243), + q(0), + ], + q(severn ojibwa) => [ + q(5217), + q(0), + ], + q(sewa bay) => [ + q(5974), + q(0), + ], + q(seze) => [ + q(6339), + q(0), + ], + q(sha) => [ + q(5932), + q(0), + ], + q(shabak) => [ + q(5935), + q(0), + ], + q(shabo) => [ + q(5897), + q(1), + ], + q(shahmirzadi) => [ + q(6218), + q(0), + ], + q(shahrudi) => [ + q(6012), + q(0), + ], + q(shall-zwall) => [ + q(6001), + q(0), + ], + q(shama-sambuga) => [ + q(6187), + q(0), + ], + q(shamang) => [ + q(7479), + q(0), + ], + q(shambala) => [ + q(3590), + q(0), + ], + q(shan) => [ + q(0380), + q(0), + ], + q(shanenawa) => [ + q(6299), + q(0), + ], + q(shanga) => [ + q(6013), + q(0), + ], + q(shangzhai) => [ + q(3095), + q(1), + ], + q(sharanahua) => [ + q(4148), + q(0), + ], + q(shark bay) => [ + q(6239), + q(0), + ], + q(sharwa) => [ + q(6301), + q(0), + ], + q(shasta) => [ + q(6018), + q(0), + ], + q(shatt) => [ + q(6009), + q(0), + ], + q(shau) => [ + q(6188), + q(0), + ], + q(shawnee) => [ + q(6061), + q(0), + ], + q(she) => [ + q(6022), + q(0), + ], + q(shehri) => [ + q(6020), + q(0), + ], + q(shekhawati) => [ + q(6306), + q(0), + ], + q(shekkacho) => [ + q(4447), + q(0), + ], + q(sheko) => [ + q(6005), + q(0), + ], + q(shelta) => [ + q(6249), + q(0), + ], + q(shempire senoufo) => [ + q(5955), + q(0), + ], + q(shendu) => [ + q(6011), + q(0), + ], + q(sheni) => [ + q(5931), + q(0), + ], + q(sherbro) => [ + q(1504), + q(0), + ], + q(sherdukpen) => [ + q(5947), + q(0), + ], + q(sherpa) => [ + q(7487), + q(0), + ], + q(sheshi kham) => [ + q(3365), + q(0), + ], + q(shi) => [ + q(6016), + q(0), + ], + q(shihhi arabic) => [ + q(6225), + q(0), + ], + q(shiki) => [ + q(2640), + q(0), + ], + q(shilluk) => [ + q(6010), + q(0), + ], + q(shina) => [ + q(5925), + q(0), + ], + q(shipibo-conibo) => [ + q(6014), + q(0), + ], + q(shixing) => [ + q(6313), + q(0), + ], + q(sholaga) => [ + q(6087), + q(0), + ], + q(shom peng) => [ + q(6031), + q(0), + ], + q(shona) => [ + q(0395), + q(0), + ], + q(shoo-minda-nye) => [ + q(1086), + q(0), + ], + q(shor) => [ + q(1749), + q(0), + ], + q(shoshoni) => [ + q(6007), + q(0), + ], + q(shua) => [ + q(6006), + q(0), + ], + q(shuadit) => [ + q(5950), + q(0), + ], + q(shuar) => [ + q(3103), + q(0), + ], + q(shubi) => [ + q(6272), + q(0), + ], + q(shughni) => [ + q(5987), + q(0), + ], + q(shumashti) => [ + q(6260), + q(0), + ], + q(shumcho) => [ + q(5930), + q(0), + ], + q(shuswap) => [ + q(6017), + q(0), + ], + q(shuwa-zamani) => [ + q(3589), + q(0), + ], + q(shwai) => [ + q(6021), + q(0), + ], + q(shwe palaung) => [ + q(5492), + q(0), + ], + q(sialum) => [ + q(6102), + q(0), + ], + q(siamou) => [ + q(6028), + q(0), + ], + q(sian) => [ + q(6171), + q(0), + ], + q(siane) => [ + q(6136), + q(0), + ], + q(siang) => [ + q(6323), + q(0), + ], + q(siar-lak) => [ + q(6057), + q(0), + ], + q(siawi) => [ + q(4398), + q(0), + ], + q(sibe) => [ + q(4768), + q(0), + ], + q(siberian tatar) => [ + q(6265), + q(0), + ], + q(sibu melanau) => [ + q(5952), + q(0), + ], + q(sicanian) => [ + q(6311), + q(0), + ], + q(sicel) => [ + q(5933), + q(0), + ], + q(sichuan yi) => [ + q(0190), + q(0), + ], + q(sicilian) => [ + q(0374), + q(0), + ], + q(sicite senoufo) => [ + q(5967), + q(0), + ], + q(siculo arabic) => [ + q(6194), + q(0), + ], + q(sidamo) => [ + q(0381), + q(0), + ], + q(sidetic) => [ + q(7477), + q(0), + ], + q(sie) => [ + q(2278), + q(0), + ], + q(sierra de juarez zapotec) => [ + q(7790), + q(0), + ], + q(sierra leone sign language) => [ + q(5998), + q(0), + ], + q(sierra negra nahuatl) => [ + q(5078), + q(0), + ], + q(sighu) => [ + q(6312), + q(0), + ], + q(sign languages) => [ + q(0379), + q(0), + ], + q(sihan) => [ + q(6138), + q(0), + ], + q(sihuas ancash quechua) => [ + q(5710), + q(0), + ], + q(sika) => [ + q(6070), + q(0), + ], + q(sikaiana) => [ + q(6084), + q(0), + ], + q(sikaritai) => [ + q(6742), + q(0), + ], + q(sikiana) => [ + q(6033), + q(0), + ], + q(sikkimese) => [ + q(6036), + q(0), + ], + q(siksika) => [ + q(0057), + q(0), + ], + q(sikule) => [ + q(6069), + q(0), + ], + q(sila) => [ + q(6100), + q(0), + ], + q(silacayoapan mixtec) => [ + q(4353), + q(0), + ], + q(sileibi) => [ + q(5908), + q(0), + ], + q(silesian) => [ + q(6341), + q(0), + ], + q(silimo) => [ + q(7237), + q(0), + ], + q(siliput) => [ + q(4339), + q(0), + ], + q(silopi) => [ + q(7485), + q(0), + ], + q(silt'e) => [ + q(6263), + q(0), + ], + q(simaa) => [ + q(6027), + q(0), + ], + q(simba) => [ + q(5914), + q(0), + ], + q(simbali) => [ + q(6110), + q(0), + ], + q(simbari) => [ + q(6106), + q(0), + ], + q(simbo) => [ + q(5893), + q(0), + ], + q(simeku) => [ + q(6124), + q(0), + ], + q(simeulue) => [ + q(6117), + q(0), + ], + q(simte) => [ + q(6118), + q(0), + ], + q(sinagen) => [ + q(6040), + q(0), + ], + q(sinasina) => [ + q(6237), + q(0), + ], + q(sinaugoro) => [ + q(6126), + q(0), + ], + q(sindarin) => [ + q(6054), + q(0), + ], + q(sindhi) => [ + q(0396), + q(0), + ], + q(sindhi bhil) => [ + q(5905), + q(0), + ], + q(sindihui mixtec) => [ + q(7508), + q(0), + ], + q(singa) => [ + q(5991), + q(0), + ], + q(singapore sign language) => [ + q(6099), + q(0), + ], + q(singpho) => [ + q(5992), + q(0), + ], + q(sinhala) => [ + q(0382), + q(0), + ], + q(sinhalese) => [ + q(0382), + q(1), + ], + q(sinicahua mixtec) => [ + q(7499), + q(0), + ], + q(sinicized miao) => [ + q(2796), + q(1), + ], + q(sininkere) => [ + q(6076), + q(0), + ], + q(sino-tibetan languages) => [ + q(0384), + q(0), + ], + q(sinsauru) => [ + q(6145), + q(0), + ], + q(sinte romani) => [ + q(5808), + q(0), + ], + q(sinyar) => [ + q(6331), + q(0), + ], + q(sio) => [ + q(7480), + q(0), + ], + q(siona) => [ + q(6134), + q(0), + ], + q(siouan languages) => [ + q(0383), + q(0), + ], + q(sipacapense) => [ + q(5680), + q(0), + ], + q(sira) => [ + q(6294), + q(0), + ], + q(siraya) => [ + q(2366), + q(0), + ], + q(sirenik yupik) => [ + q(7739), + q(0), + ], + q(siri) => [ + q(6038), + q(0), + ], + q(siriano) => [ + q(6205), + q(0), + ], + q(siriono) => [ + q(6210), + q(0), + ], + q(sirmauri) => [ + q(6216), + q(0), + ], + q(siroi) => [ + q(6221), + q(0), + ], + q(sishee) => [ + q(6030), + q(1), + ], + q(sissala) => [ + q(6086), + q(0), + ], + q(sissano) => [ + q(6232), + q(0), + ], + q(siuslaw) => [ + q(6039), + q(0), + ], + q(sivandi) => [ + q(6044), + q(0), + ], + q(siwai) => [ + q(6042), + q(0), + ], + q(siwi) => [ + q(6045), + q(0), + ], + q(siwu) => [ + q(0735), + q(0), + ], + q(siyin chin) => [ + q(1881), + q(0), + ], + q(skagit) => [ + q(6062), + q(0), + ], + q(skalvian) => [ + q(6287), + q(0), + ], + q(skepi creole dutch) => [ + q(6082), + q(0), + ], + q(skolt sami) => [ + q(0394), + q(0), + ], + q(skou) => [ + q(6081), + q(0), + ], + q(slave (athapascan)) => [ + q(0108), + q(0), + ], + q(slavic languages) => [ + q(0385), + q(0), + ], + q(slavomolisano) => [ + q(6285), + q(0), + ], + q(slovak) => [ + q(0386), + q(0), + ], + q(slovakian sign language) => [ + q(6284), + q(0), + ], + q(slovenian) => [ + q(0387), + q(0), + ], + q(small flowery miao) => [ + q(5979), + q(0), + ], + q(smarky kanum) => [ + q(3725), + q(0), + ], + q(snohomish) => [ + q(6135), + q(0), + ], + q(so) => [ + q(6236), + q(0), + ], + q(so (democratic republic of congo)) => [ + q(6148), + q(0), + ], + q(so'a) => [ + q(6234), + q(0), + ], + q(sobei) => [ + q(6147), + q(0), + ], + q(sochiapam chinantec) => [ + q(1874), + q(0), + ], + q(sochiapan chinantec) => [ + q(1874), + q(1), + ], + q(soga) => [ + q(7433), + q(0), + ], + q(sogdian) => [ + q(0398), + q(0), + ], + q(soi) => [ + q(6153), + q(0), + ], + q(sokoro) => [ + q(6154), + q(0), + ], + q(solano) => [ + q(7484), + q(0), + ], + q(soli) => [ + q(5916), + q(0), + ], + q(solomon islands sign language) => [ + q(6344), + q(0), + ], + q(solong) => [ + q(0557), + q(0), + ], + q(solos) => [ + q(6155), + q(0), + ], + q(som) => [ + q(6107), + q(0), + ], + q(somali) => [ + q(0399), + q(0), + ], + q(somba-siawari) => [ + q(1323), + q(0), + ], + q(somrai) => [ + q(6159), + q(0), + ], + q(somray) => [ + q(6119), + q(0), + ], + q(somyev) => [ + q(3324), + q(0), + ], + q(sonaga) => [ + q(7734), + q(0), + ], + q(sonde) => [ + q(6003), + q(0), + ], + q(songe) => [ + q(6157), + q(0), + ], + q(songhai languages) => [ + q(0400), + q(0), + ], + q(songlai chin) => [ + q(1869), + q(0), + ], + q(songo) => [ + q(6156), + q(0), + ], + q(songomeno) => [ + q(6150), + q(0), + ], + q(songoora) => [ + q(6149), + q(0), + ], + q(sonha) => [ + q(6152), + q(0), + ], + q(sonia) => [ + q(6037), + q(0), + ], + q(soninke) => [ + q(0397), + q(0), + ], + q(sonsorol) => [ + q(6162), + q(0), + ], + q(soo) => [ + q(6454), + q(0), + ], + q(sop) => [ + q(6929), + q(0), + ], + q(soqotri) => [ + q(6196), + q(0), + ], + q(sora) => [ + q(6199), + q(0), + ], + q(sorbian languages) => [ + q(0468), + q(0), + ], + q(sori-harengan) => [ + q(5899), + q(0), + ], + q(sorkhei) => [ + q(6192), + q(0), + ], + q(sorothaptic) => [ + q(6318), + q(0), + ], + q(sorsogon ayta) => [ + q(1008), + q(0), + ], + q(sos kundi) => [ + q(5942), + q(0), + ], + q(sota kanum) => [ + q(3588), + q(0), + ], + q(sotho, southern) => [ + q(0401), + q(0), + ], + q(sou) => [ + q(6193), + q(0), + ], + q(sou nama) => [ + q(6569), + q(0), + ], + q(sou upaa) => [ + q(7109), + q(0), + ], + q(south african sign language) => [ + q(5980), + q(0), + ], + q(south american indian (other)) => [ + q(0368), + q(0), + ], + q(south american indian languages) => [ + q(0368), + q(1), + ], + q(south awyu) => [ + q(0979), + q(0), + ], + q(south azerbaijani) => [ + q(1014), + q(0), + ], + q(south bolivian quechua) => [ + q(5676), + q(0), + ], + q(south caucasian languages) => [ + q(0497), + q(0), + ], + q(south central banda) => [ + q(3997), + q(0), + ], + q(south central dinka) => [ + q(2030), + q(0), + ], + q(south efate) => [ + q(2281), + q(0), + ], + q(south fali) => [ + q(2328), + q(0), + ], + q(south giziga) => [ + q(2528), + q(0), + ], + q(south lembata) => [ + q(3972), + q(0), + ], + q(south levantine arabic) => [ + q(0718), + q(0), + ], + q(south marquesan) => [ + q(4485), + q(0), + ], + q(south muyu) => [ + q(3632), + q(0), + ], + q(south ndebele) => [ + q(0304), + q(1), + ], + q(south nuaulu) => [ + q(5143), + q(0), + ], + q(south picene) => [ + q(6185), + q(0), + ], + q(south slavey) => [ + q(7481), + q(0), + ], + q(south slavic languages) => [ + q(0536), + q(0), + ], + q(south tairora) => [ + q(5260), + q(0), + ], + q(south ucayali asheninka) => [ + q(1837), + q(0), + ], + q(south watut) => [ + q(4169), + q(0), + ], + q(south west bay) => [ + q(6139), + q(0), + ], + q(southeast ambrym) => [ + q(6767), + q(0), + ], + q(southeast babar) => [ + q(6971), + q(0), + ], + q(southeast ijo) => [ + q(2935), + q(0), + ], + q(southeast pashai) => [ + q(5607), + q(0), + ], + q(southeast pashayi) => [ + q(5607), + q(1), + ], + q(southeastern dinka) => [ + q(2070), + q(0), + ], + q(southeastern ixtlan zapotec) => [ + q(7902), + q(0), + ], + q(southeastern kolami) => [ + q(4892), + q(0), + ], + q(southeastern nochixtlan mixtec) => [ + q(4664), + q(0), + ], + q(southeastern pomo) => [ + q(5557), + q(0), + ], + q(southeastern puebla nahuatl) => [ + q(5030), + q(0), + ], + q(southeastern tarahumara) => [ + q(6412), + q(0), + ], + q(southeastern tepehuan) => [ + q(6257), + q(0), + ], + q(southern alta) => [ + q(0676), + q(0), + ], + q(southern altai) => [ + q(0016), + q(0), + ], + q(southern amami-oshima) => [ + q(0783), + q(0), + ], + q(southern aymara) => [ + q(0995), + q(0), + ], + q(southern bai) => [ + q(1155), + q(0), + ], + q(southern balochi) => [ + q(1067), + q(0), + ], + q(southern betsimisaraka malagasy) => [ + q(1614), + q(0), + ], + q(southern binukidnon) => [ + q(4570), + q(0), + ], + q(southern birifor) => [ + q(1226), + q(0), + ], + q(southern bobo madare) => [ + q(1557), + q(0), + ], + q(southern bontok) => [ + q(5185), + q(0), + ], + q(southern carrier) => [ + q(1642), + q(0), + ], + q(southern catanduanes bikol) => [ + q(1291), + q(0), + ], + q(southern conchucos ancash quechua) => [ + q(5717), + q(0), + ], + q(southern dagaare) => [ + q(1998), + q(0), + ], + q(southern dong) => [ + q(3453), + q(0), + ], + q(southern east cree) => [ + q(1846), + q(0), + ], + q(southern ghale) => [ + q(2501), + q(0), + ], + q(southern grebo) => [ + q(2617), + q(0), + ], + q(southern guiyang hmong) => [ + q(2795), + q(0), + ], + q(southern guiyang miao) => [ + q(2795), + q(1), + ], + q(southern haida) => [ + q(2726), + q(0), + ], + q(southern hindko) => [ + q(2798), + q(0), + ], + q(southern kalapuya) => [ + q(6314), + q(0), + ], + q(southern kalinga) => [ + q(3591), + q(0), + ], + q(southern katang) => [ + q(5929), + q(0), + ], + q(southern kisi) => [ + q(3607), + q(0), + ], + q(southern kiwai) => [ + q(3378), + q(0), + ], + q(southern kurdish) => [ + q(5940), + q(0), + ], + q(southern lolopo) => [ + q(7738), + q(0), + ], + q(southern luri) => [ + q(4085), + q(0), + ], + q(southern ma'di) => [ + q(6133), + q(0), + ], + q(southern mashan hmong) => [ + q(2774), + q(0), + ], + q(southern mashan miao) => [ + q(2774), + q(1), + ], + q(southern mnong) => [ + q(4419), + q(0), + ], + q(southern muji) => [ + q(7674), + q(0), + ], + q(southern nago) => [ + q(5037), + q(0), + ], + q(southern nambikuara) => [ + q(4713), + q(0), + ], + q(southern ngbandi) => [ + q(4752), + q(0), + ], + q(southern nicobarese) => [ + q(4884), + q(0), + ], + q(southern nisu) => [ + q(5063), + q(0), + ], + q(southern nuni) => [ + q(5002), + q(0), + ], + q(southern ohlone) => [ + q(1877), + q(0), + ], + q(southern one) => [ + q(5310), + q(0), + ], + q(southern pame) => [ + q(5525), + q(0), + ], + q(southern pashto) => [ + q(5373), + q(0), + ], + q(southern pastaza quechua) => [ + q(5682), + q(0), + ], + q(southern pomo) => [ + q(5413), + q(0), + ], + q(southern puebla mixtec) => [ + q(4307), + q(0), + ], + q(southern puget sound salish) => [ + q(6090), + q(0), + ], + q(southern pumi) => [ + q(5512), + q(0), + ], + q(southern qiandong miao) => [ + q(2790), + q(0), + ], + q(southern qiang) => [ + q(5721), + q(0), + ], + q(southern rengma naga) => [ + q(5047), + q(0), + ], + q(southern rincon zapotec) => [ + q(7936), + q(0), + ], + q(southern roglai) => [ + q(5773), + q(0), + ], + q(southern sama) => [ + q(6219), + q(0), + ], + q(southern sami) => [ + q(0388), + q(0), + ], + q(southern samo) => [ + q(5895), + q(0), + ], + q(southern sierra miwok) => [ + q(6065), + q(0), + ], + q(southern sorsoganon) => [ + q(6214), + q(0), + ], + q(southern sotho) => [ + q(0401), + q(1), + ], + q(southern subanen) => [ + q(3784), + q(0), + ], + q(southern thai) => [ + q(6161), + q(0), + ], + q(southern tidung) => [ + q(3009), + q(0), + ], + q(southern tiwa) => [ + q(6522), + q(0), + ], + q(southern toussian) => [ + q(7113), + q(0), + ], + q(southern tujia) => [ + q(6532), + q(0), + ], + q(southern tutchone) => [ + q(6398), + q(0), + ], + q(southern uzbek) => [ + q(6954), + q(0), + ], + q(southern yamphu) => [ + q(4043), + q(0), + ], + q(southern yukaghir) => [ + q(7765), + q(0), + ], + q(southwest gbaya) => [ + q(2635), + q(0), + ], + q(southwest palawano) => [ + q(5501), + q(0), + ], + q(southwest pashai) => [ + q(5606), + q(0), + ], + q(southwest pashayi) => [ + q(5606), + q(1), + ], + q(southwest tanna) => [ + q(5131), + q(0), + ], + q(southwestern bontok) => [ + q(6972), + q(0), + ], + q(southwestern dinka) => [ + q(2038), + q(0), + ], + q(southwestern fars) => [ + q(2334), + q(0), + ], + q(southwestern guiyang hmong) => [ + q(2780), + q(0), + ], + q(southwestern huishui hmong) => [ + q(2781), + q(0), + ], + q(southwestern huishui miao) => [ + q(2781), + q(1), + ], + q(southwestern nisu) => [ + q(5079), + q(0), + ], + q(southwestern tarahumara) => [ + q(6790), + q(0), + ], + q(southwestern tepehuan) => [ + q(6553), + q(0), + ], + q(southwestern tlaxiaco mixtec) => [ + q(4200), + q(0), + ], + q(sowa) => [ + q(6307), + q(0), + ], + q(sowanda) => [ + q(6163), + q(0), + ], + q(sowari) => [ + q(2092), + q(1), + ], + q(soyaltepec mazatec) => [ + q(7016), + q(0), + ], + q(soyaltepec mixtec) => [ + q(7017), + q(0), + ], + q(spanish) => [ + q(0402), + q(0), + ], + q(spanish sign language) => [ + q(6233), + q(0), + ], + q(spiti bhoti) => [ + q(6182), + q(0), + ], + q(spokane) => [ + q(6177), + q(0), + ], + q(squamish) => [ + q(6197), + q(0), + ], + q(sranan tongo) => [ + q(0404), + q(0), + ], + q(sri lankan creole malay) => [ + q(5923), + q(0), + ], + q(sri lankan sign language) => [ + q(6195), + q(0), + ], + q(standard arabic) => [ + q(0869), + q(0), + ], + q(standard estonian) => [ + q(2232), + q(0), + ], + q(standard latvian) => [ + q(4088), + q(0), + ], + q(standard malay) => [ + q(7935), + q(0), + ], + q(standard moroccan tamazight) => [ + q(0481), + q(0), + ], + q(stellingwerfs) => [ + q(6253), + q(0), + ], + q(stod bhoti) => [ + q(5912), + q(0), + ], + q(stodsde) => [ + q(3095), + q(0), + ], + q(stoney) => [ + q(6256), + q(0), + ], + q(straits salish) => [ + q(6259), + q(0), + ], + q(suabo) => [ + q(6343), + q(0), + ], + q(suarmin) => [ + q(5966), + q(0), + ], + q(suau) => [ + q(6300), + q(0), + ], + q(suba) => [ + q(6310), + q(0), + ], + q(suba-simbiti) => [ + q(6220), + q(0), + ], + q(subiya) => [ + q(5910), + q(0), + ], + q(subtiaba) => [ + q(6275), + q(0), + ], + q(sudanese arabic) => [ + q(0837), + q(0), + ], + q(sudanese creole arabic) => [ + q(5422), + q(0), + ], + q(sudest) => [ + q(6474), + q(0), + ], + q(sudovian) => [ + q(7490), + q(0), + ], + q(suena) => [ + q(6269), + q(0), + ], + q(suga) => [ + q(5988), + q(0), + ], + q(suganga) => [ + q(6270), + q(0), + ], + q(sugut dusun) => [ + q(3777), + q(0), + ], + q(sui) => [ + q(6293), + q(0), + ], + q(suki) => [ + q(6271), + q(0), + ], + q(suku) => [ + q(6267), + q(0), + ], + q(sukuma) => [ + q(0409), + q(0), + ], + q(sukur) => [ + q(6326), + q(0), + ], + q(sukurum) => [ + q(7937), + q(0), + ], + q(sula) => [ + q(6342), + q(0), + ], + q(sulka) => [ + q(6266), + q(0), + ], + q(sulod) => [ + q(6203), + q(0), + ], + q(suma) => [ + q(6190), + q(0), + ], + q(sumariup) => [ + q(6041), + q(0), + ], + q(sumau) => [ + q(6043), + q(0), + ], + q(sumbawa) => [ + q(6121), + q(0), + ], + q(sumbwa) => [ + q(6277), + q(0), + ], + q(sumerian) => [ + q(0412), + q(0), + ], + q(sumi naga) => [ + q(5071), + q(0), + ], + q(sumtu chin) => [ + q(1879), + q(0), + ], + q(sunam) => [ + q(6228), + q(0), + ], + q(sundanese) => [ + q(0410), + q(0), + ], + q(sunum) => [ + q(7683), + q(1), + ], + q(sunwar) => [ + q(6279), + q(0), + ], + q(suomenruotsalainen viittomakieli) => [ + q(2377), + q(2), + ], + q(suoy) => [ + q(6330), + q(0), + ], + q(supyire senoufo) => [ + q(6178), + q(0), + ], + q(sur) => [ + q(6428), + q(0), + ], + q(surayt) => [ + q(6691), + q(1), + ], + q(surbakhal) => [ + q(5901), + q(0), + ], + q(surgujia) => [ + q(5989), + q(0), + ], + q(suri) => [ + q(6273), + q(0), + ], + q(surigaonon) => [ + q(5984), + q(0), + ], + q(surjapuri) => [ + q(6056), + q(0), + ], + q(sursurunga) => [ + q(6000), + q(0), + ], + q(suruaha) => [ + q(6308), + q(0), + ], + q(surubu) => [ + q(5937), + q(0), + ], + q(surui) => [ + q(6213), + q(0), + ], + q(surui do para) => [ + q(4193), + q(0), + ], + q(susquehannock) => [ + q(6191), + q(0), + ], + q(susu) => [ + q(0411), + q(0), + ], + q(susuami) => [ + q(6238), + q(0), + ], + q(suundi) => [ + q(5941), + q(0), + ], + q(suwawa) => [ + q(6305), + q(0), + ], + q(suya) => [ + q(6278), + q(0), + ], + q(svan) => [ + q(6280), + q(0), + ], + q(swabian) => [ + q(6291), + q(0), + ], + q(swahili) => [ + q(0413), + q(0), + ], + q(swahili (individual language)) => [ + q(6292), + q(0), + ], + q(swahili (macrolanguage)) => [ + q(0413), + q(1), + ], + q(swampy cree) => [ + q(1880), + q(0), + ], + q(swati) => [ + q(0408), + q(0), + ], + q(swedish) => [ + q(0414), + q(0), + ], + q(swedish sign language) => [ + q(6296), + q(0), + ], + q(swiss german) => [ + q(0167), + q(0), + ], + q(swiss-french sign language) => [ + q(6235), + q(0), + ], + q(swiss-german sign language) => [ + q(5986), + q(0), + ], + q(swiss-italian sign language) => [ + q(6088), + q(0), + ], + q(swo) => [ + q(6164), + q(0), + ], + q(syenara senoufo) => [ + q(6024), + q(0), + ], + q(sylheti) => [ + q(6327), + q(0), + ], + q(syriac) => [ + q(0416), + q(0), + ], + q(t'apo) => [ + q(3885), + q(0), + ], + q(t'en) => [ + q(6411), + q(0), + ], + q(ta'izzi-adeni arabic) => [ + q(0595), + q(0), + ], + q(taabwa) => [ + q(6359), + q(0), + ], + q(tabaa zapotec) => [ + q(7807), + q(0), + ], + q(tabaru) => [ + q(6392), + q(0), + ], + q(tabasco chontal) => [ + q(1718), + q(0), + ], + q(tabasco nahuatl) => [ + q(4855), + q(0), + ], + q(tabasco zoque) => [ + q(7896), + q(0), + ], + q(tabassaran) => [ + q(6348), + q(0), + ], + q(tabla) => [ + q(6606), + q(0), + ], + q(tabo) => [ + q(3497), + q(0), + ], + q(tabriak) => [ + q(6835), + q(0), + ], + q(tacahua mixtec) => [ + q(7509), + q(0), + ], + q(tacana) => [ + q(6597), + q(0), + ], + q(tachawit) => [ + q(6023), + q(0), + ], + q(tachelhit) => [ + q(6008), + q(0), + ], + q(tachoni) => [ + q(4067), + q(0), + ], + q(tadaksahak) => [ + q(2149), + q(0), + ], + q(tado) => [ + q(3448), + q(0), + ], + q(tadyawan) => [ + q(6438), + q(0), + ], + q(tae') => [ + q(5826), + q(0), + ], + q(tafi) => [ + q(6397), + q(0), + ], + q(tagabawa) => [ + q(1178), + q(0), + ], + q(tagakaulo) => [ + q(3432), + q(0), + ], + q(tagal murut) => [ + q(4613), + q(0), + ], + q(tagalaka) => [ + q(6485), + q(0), + ], + q(tagalog) => [ + q(0426), + q(0), + ], + q(tagargrent) => [ + q(5329), + q(0), + ], + q(tagbanwa) => [ + q(6390), + q(0), + ], + q(tagbu) => [ + q(6381), + q(0), + ], + q(tagdal) => [ + q(6417), + q(0), + ], + q(tagin) => [ + q(6472), + q(0), + ], + q(tagish) => [ + q(6483), + q(0), + ], + q(tagoi) => [ + q(6353), + q(0), + ], + q(tagwana senoufo) => [ + q(6482), + q(0), + ], + q(tahaggart tamahaq) => [ + q(6501), + q(0), + ], + q(tahitian) => [ + q(0417), + q(0), + ], + q(tahltan) => [ + q(6499), + q(0), + ], + q(tai) => [ + q(6365), + q(0), + ], + q(tai daeng) => [ + q(6822), + q(0), + ], + q(tai dam) => [ + q(1297), + q(0), + ], + q(tai do) => [ + q(6818), + q(0), + ], + q(tai don) => [ + q(6783), + q(0), + ], + q(tai hongjin) => [ + q(6524), + q(0), + ], + q(tai laing) => [ + q(6528), + q(0), + ], + q(tai languages) => [ + q(0418), + q(0), + ], + q(tai loi) => [ + q(6566), + q(0), + ], + q(tai long) => [ + q(6490), + q(0), + ], + q(tai nua) => [ + q(6420), + q(0), + ], + q(tai pao) => [ + q(6650), + q(0), + ], + q(tai thanh) => [ + q(6585), + q(0), + ], + q(tai ya) => [ + q(1912), + q(0), + ], + q(tai yo) => [ + q(6818), + q(1), + ], + q(taiap) => [ + q(2606), + q(0), + ], + q(taikat) => [ + q(0830), + q(0), + ], + q(tainae) => [ + q(0667), + q(0), + ], + q(taino) => [ + q(6610), + q(0), + ], + q(tairaha) => [ + q(1566), + q(0), + ], + q(tairuma) => [ + q(6838), + q(0), + ], + q(taita) => [ + q(1946), + q(0), + ], + q(taiwan sign language) => [ + q(6711), + q(0), + ], + q(taje) => [ + q(5403), + q(0), + ], + q(tajik) => [ + q(0425), + q(0), + ], + q(tajiki arabic) => [ + q(0567), + q(0), + ], + q(tajio) => [ + q(6426), + q(0), + ], + q(tajuasohn) => [ + q(6525), + q(0), + ], + q(takelma) => [ + q(6541), + q(0), + ], + q(takestani) => [ + q(6546), + q(0), + ], + q(takia) => [ + q(6371), + q(0), + ], + q(takua) => [ + q(6552), + q(0), + ], + q(takuu) => [ + q(4865), + q(0), + ], + q(takwane) => [ + q(6538), + q(0), + ], + q(tal) => [ + q(6356), + q(0), + ], + q(tala) => [ + q(6355), + q(0), + ], + q(talaandig) => [ + q(1257), + q(1), + ], + q(talaud) => [ + q(6556), + q(0), + ], + q(taliabu) => [ + q(6571), + q(0), + ], + q(talieng) => [ + q(6422), + q(0), + ], + q(talinga-bwisi) => [ + q(6559), + q(0), + ], + q(talise) => [ + q(6567), + q(0), + ], + q(talodi) => [ + q(6564), + q(0), + ], + q(taloki) => [ + q(6560), + q(0), + ], + q(talondo') => [ + q(6563), + q(0), + ], + q(talossan) => [ + q(6831), + q(0), + ], + q(talu) => [ + q(7742), + q(0), + ], + q(talysh) => [ + q(6573), + q(0), + ], + q(tama (chad)) => [ + q(6574), + q(0), + ], + q(tama (colombia)) => [ + q(6449), + q(0), + ], + q(tamagario) => [ + q(6400), + q(0), + ], + q(taman (indonesia)) => [ + q(6586), + q(0), + ], + q(taman (myanmar)) => [ + q(6404), + q(0), + ], + q(tamanaku) => [ + q(6596), + q(0), + ], + q(tamashek) => [ + q(0435), + q(0), + ], + q(tamasheq) => [ + q(6360), + q(0), + ], + q(tamazola mixtec) => [ + q(7023), + q(0), + ], + q(tambas) => [ + q(6427), + q(0), + ], + q(tambora) => [ + q(7549), + q(0), + ], + q(tambotalo) => [ + q(6568), + q(0), + ], + q(tami) => [ + q(6595), + q(0), + ], + q(tamil) => [ + q(0419), + q(0), + ], + q(tamki) => [ + q(6366), + q(0), + ], + q(tamnim citak) => [ + q(6584), + q(0), + ], + q(tampias lobu) => [ + q(4025), + q(0), + ], + q(tampuan) => [ + q(6655), + q(0), + ], + q(tampulma) => [ + q(6648), + q(0), + ], + q(tanacross) => [ + q(6395), + q(0), + ], + q(tanahmerah) => [ + q(6405), + q(0), + ], + q(tanaina) => [ + q(6460), + q(0), + ], + q(tanapag) => [ + q(6656), + q(0), + ], + q(tandaganon) => [ + q(6473), + q(0), + ], + q(tandia) => [ + q(6603), + q(0), + ], + q(tandroy-mahafaly malagasy) => [ + q(6437), + q(0), + ], + q(tanema) => [ + q(6617), + q(0), + ], + q(tangale) => [ + q(6357), + q(0), + ], + q(tangchangya) => [ + q(6615), + q(0), + ], + q(tanggu) => [ + q(6480), + q(0), + ], + q(tangkhul naga (india)) => [ + q(4960), + q(0), + ], + q(tangkhul naga (myanmar)) => [ + q(5096), + q(0), + ], + q(tangko) => [ + q(6551), + q(0), + ], + q(tanglang) => [ + q(7743), + q(0), + ], + q(tangoa) => [ + q(6475), + q(0), + ], + q(tanguat) => [ + q(6386), + q(0), + ], + q(tangut) => [ + q(6800), + q(0), + ], + q(tanimbili) => [ + q(6373), + q(0), + ], + q(tanimuca-retuara) => [ + q(6599), + q(0), + ], + q(tanjijili) => [ + q(6863), + q(0), + ], + q(tankarana malagasy) => [ + q(7412), + q(1), + ], + q(tanosy malagasy) => [ + q(6813), + q(0), + ], + q(tanudan kalinga) => [ + q(3462), + q(0), + ], + q(tanzanian sign language) => [ + q(6828), + q(0), + ], + q(tapeba) => [ + q(6370), + q(0), + ], + q(tapei) => [ + q(0648), + q(0), + ], + q(tapiete) => [ + q(6645), + q(0), + ], + q(tapirape) => [ + q(6352), + q(0), + ], + q(tarao naga) => [ + q(6685), + q(0), + ], + q(tareng) => [ + q(6477), + q(0), + ], + q(tariana) => [ + q(6351), + q(0), + ], + q(tarifit) => [ + q(5778), + q(0), + ], + q(tarjumo) => [ + q(6803), + q(0), + ], + q(tarok) => [ + q(7612), + q(0), + ], + q(taroko) => [ + q(6692), + q(0), + ], + q(tarpia) => [ + q(6643), + q(0), + ], + q(tartessian) => [ + q(6808), + q(0), + ], + q(taruma) => [ + q(6429), + q(0), + ], + q(tasawaq) => [ + q(6789), + q(0), + ], + q(tase naga) => [ + q(5077), + q(0), + ], + q(tasmanian) => [ + q(7514), + q(0), + ], + q(tasmate) => [ + q(6591), + q(0), + ], + q(tataltepec chatino) => [ + q(1883), + q(0), + ], + q(tatana) => [ + q(6812), + q(0), + ], + q(tatar) => [ + q(0420), + q(0), + ], + q(tatuyo) => [ + q(6364), + q(0), + ], + q(tauade) => [ + q(6722), + q(0), + ], + q(taulil) => [ + q(6751), + q(0), + ], + q(taungyo) => [ + q(6407), + q(0), + ], + q(taupota) => [ + q(6640), + q(0), + ], + q(tause) => [ + q(6350), + q(0), + ], + q(taushiro) => [ + q(6688), + q(0), + ], + q(tausug) => [ + q(6702), + q(0), + ], + q(tauya) => [ + q(6814), + q(0), + ], + q(taveta) => [ + q(6771), + q(0), + ], + q(tavoyan) => [ + q(6769), + q(0), + ], + q(tavringer romani) => [ + q(5813), + q(0), + ], + q(tawala) => [ + q(6383), + q(0), + ], + q(tawallammat tamajaq) => [ + q(6735), + q(0), + ], + q(tawande) => [ + q(7512), + q(0), + ], + q(tawang monpa) => [ + q(6785), + q(0), + ], + q(tawara) => [ + q(6784), + q(0), + ], + q(taworta) => [ + q(6384), + q(0), + ], + q(tawoyan) => [ + q(6795), + q(0), + ], + q(tawr chin) => [ + q(6408), + q(0), + ], + q(tay) => [ + q(6827), + q(0), + ], + q(tay boi) => [ + q(6362), + q(0), + ], + q(tay khang) => [ + q(6614), + q(0), + ], + q(tay sa pa) => [ + q(6823), + q(0), + ], + q(tay tac) => [ + q(6824), + q(0), + ], + q(tayabas ayta) => [ + q(1011), + q(0), + ], + q(tayart tamajeq) => [ + q(6504), + q(0), + ], + q(tayo) => [ + q(1759), + q(0), + ], + q(taznatit) => [ + q(2621), + q(0), + ], + q(tboli) => [ + q(6380), + q(0), + ], + q(tchitchege) => [ + q(6403), + q(0), + ], + q(tchumbuli) => [ + q(1398), + q(0), + ], + q(te'un) => [ + q(6766), + q(0), + ], + q(teanu) => [ + q(6550), + q(0), + ], + q(tebi) => [ + q(2088), + q(1), + ], + q(tebul sign language) => [ + q(6717), + q(0), + ], + q(tebul ure dogon) => [ + q(2163), + q(0), + ], + q(tecpatlan totonac) => [ + q(6413), + q(0), + ], + q(tedaga) => [ + q(6757), + q(0), + ], + q(tedim chin) => [ + q(1885), + q(0), + ], + q(tee) => [ + q(6544), + q(0), + ], + q(teen) => [ + q(4020), + q(0), + ], + q(tefaro) => [ + q(6461), + q(0), + ], + q(tegali) => [ + q(5741), + q(0), + ], + q(tehit) => [ + q(3536), + q(0), + ], + q(tehuelche) => [ + q(6446), + q(0), + ], + q(tejalapan zapotec) => [ + q(7946), + q(0), + ], + q(teke-ebo) => [ + q(2211), + q(0), + ], + q(teke-fuumu) => [ + q(2914), + q(0), + ], + q(teke-kukuya) => [ + q(3422), + q(0), + ], + q(teke-laali) => [ + q(3955), + q(0), + ], + q(teke-nzikou) => [ + q(5177), + q(0), + ], + q(teke-tege) => [ + q(6445), + q(0), + ], + q(teke-tsaayi) => [ + q(6817), + q(0), + ], + q(teke-tyee) => [ + q(6826), + q(0), + ], + q(tektiteko) => [ + q(6721), + q(0), + ], + q(tela-masbuar) => [ + q(6768), + q(0), + ], + q(telefol) => [ + q(6557), + q(0), + ], + q(telugu) => [ + q(0421), + q(0), + ], + q(teluti) => [ + q(6569), + q(1), + ], + q(tem) => [ + q(3240), + q(0), + ], + q(temacine tamazight) => [ + q(6531), + q(0), + ], + q(temascaltepec nahuatl) => [ + q(4871), + q(0), + ], + q(tembe) => [ + q(6661), + q(0), + ], + q(tembo (kitembo)) => [ + q(6387), + q(0), + ], + q(tembo (motembo)) => [ + q(6593), + q(0), + ], + q(teme) => [ + q(6431), + q(0), + ], + q(temein) => [ + q(6452), + q(0), + ], + q(temi) => [ + q(6166), + q(0), + ], + q(temiar) => [ + q(6439), + q(0), + ], + q(temoaya otomi) => [ + q(5323), + q(0), + ], + q(temoq) => [ + q(6587), + q(0), + ], + q(temuan) => [ + q(6594), + q(0), + ], + q(ten'edn) => [ + q(6619), + q(0), + ], + q(tena) => [ + q(1141), + q(1), + ], + q(tena lowland quichua) => [ + q(5687), + q(0), + ], + q(tenango otomi) => [ + q(5319), + q(0), + ], + q(tene kan dogon) => [ + q(2155), + q(0), + ], + q(tenggarong kutai malay) => [ + q(6999), + q(0), + ], + q(tengger) => [ + q(6453), + q(0), + ], + q(tenharim) => [ + q(5347), + q(0), + ], + q(tenino) => [ + q(6664), + q(0), + ], + q(tenis) => [ + q(6612), + q(0), + ], + q(tennet) => [ + q(6457), + q(0), + ], + q(teop) => [ + q(6515), + q(0), + ], + q(teor) => [ + q(6455), + q(0), + ], + q(tepecano) => [ + q(6451), + q(0), + ], + q(tepetotutla chinantec) => [ + q(1802), + q(0), + ], + q(tepeuxila cuicatec) => [ + q(1915), + q(0), + ], + q(tepinapa chinantec) => [ + q(1886), + q(0), + ], + q(tepo krumen) => [ + q(6442), + q(0), + ], + q(ter sami) => [ + q(6059), + q(0), + ], + q(tera) => [ + q(6736), + q(0), + ], + q(terebu) => [ + q(6673), + q(0), + ], + q(terei) => [ + q(1505), + q(0), + ], + q(tereno) => [ + q(0423), + q(0), + ], + q(teressa) => [ + q(6444), + q(0), + ], + q(tereweng) => [ + q(6782), + q(0), + ], + q(teribe) => [ + q(6462), + q(0), + ], + q(terik) => [ + q(6441), + q(0), + ], + q(termanu) => [ + q(6792), + q(0), + ], + q(ternate) => [ + q(6463), + q(0), + ], + q(ternateno) => [ + q(6580), + q(0), + ], + q(tesaka malagasy) => [ + q(6540), + q(0), + ], + q(tese) => [ + q(3262), + q(0), + ], + q(teshenawa) => [ + q(6778), + q(0), + ], + q(teso) => [ + q(6450), + q(0), + ], + q(tetela) => [ + q(6561), + q(0), + ], + q(tetelcingo nahuatl) => [ + q(4859), + q(0), + ], + q(tetete) => [ + q(6440), + q(0), + ], + q(tetum) => [ + q(0424), + q(0), + ], + q(tetun dili) => [ + q(6435), + q(0), + ], + q(teutila cuicatec) => [ + q(1911), + q(0), + ], + q(tewa (indonesia)) => [ + q(6780), + q(0), + ], + q(tewa (usa)) => [ + q(6456), + q(0), + ], + q(tewe) => [ + q(6794), + q(0), + ], + q(texcatepec otomi) => [ + q(5326), + q(0), + ], + q(texistepec popoluca) => [ + q(5560), + q(0), + ], + q(texmelucan zapotec) => [ + q(7924), + q(0), + ], + q(tezoatlan mixtec) => [ + q(4641), + q(0), + ], + q(tha) => [ + q(6503), + q(0), + ], + q(thachanadan) => [ + q(6494), + q(0), + ], + q(thado chin) => [ + q(6416), + q(0), + ], + q(thai) => [ + q(0427), + q(0), + ], + q(thai sign language) => [ + q(6709), + q(0), + ], + q(thai song) => [ + q(6146), + q(0), + ], + q(thaiphum chin) => [ + q(1888), + q(0), + ], + q(thakali) => [ + q(6498), + q(0), + ], + q(thangal naga) => [ + q(4923), + q(0), + ], + q(thangmi) => [ + q(6488), + q(0), + ], + q(thao) => [ + q(6223), + q(0), + ], + q(tharaka) => [ + q(6491), + q(0), + ], + q(thawa) => [ + q(7511), + q(0), + ], + q(thayore) => [ + q(6486), + q(0), + ], + q(thaypan) => [ + q(6821), + q(0), + ], + q(thiin) => [ + q(2930), + q(0), + ], + q(tho) => [ + q(6634), + q(0), + ], + q(thompson) => [ + q(6495), + q(0), + ], + q(thopho) => [ + q(7744), + q(0), + ], + q(thracian) => [ + q(6801), + q(0), + ], + q(thu lao) => [ + q(6819), + q(0), + ], + q(thudam) => [ + q(6502), + q(0), + ], + q(thulung) => [ + q(6424), + q(0), + ], + q(thur) => [ + q(4063), + q(0), + ], + q(thurawal) => [ + q(6376), + q(0), + ], + q(thuri) => [ + q(6500), + q(0), + ], + q(tiagbamrin aizi) => [ + q(0682), + q(0), + ], + q(tiale) => [ + q(4417), + q(0), + ], + q(tiang) => [ + q(6378), + q(0), + ], + q(tibea) => [ + q(4851), + q(0), + ], + q(tibetan) => [ + q(0428), + q(0), + ], + q(tibeto-burman languages) => [ + q(0528), + q(0), + ], + q(tichurong) => [ + q(6406), + q(0), + ], + q(ticuna) => [ + q(6394), + q(0), + ], + q(tidaa mixtec) => [ + q(4571), + q(0), + ], + q(tidikelt tamazight) => [ + q(6505), + q(0), + ], + q(tidore) => [ + q(6770), + q(0), + ], + q(tiefo) => [ + q(6517), + q(0), + ], + q(tiemacewe bozo) => [ + q(1364), + q(0), + ], + q(tiene) => [ + q(6509), + q(0), + ], + q(tieyaxo bozo) => [ + q(1374), + q(0), + ], + q(tifal) => [ + q(6507), + q(0), + ], + q(tigak) => [ + q(6466), + q(0), + ], + q(tigon mbembe) => [ + q(5172), + q(0), + ], + q(tigre) => [ + q(0429), + q(0), + ], + q(tigrinya) => [ + q(0430), + q(0), + ], + q(tii) => [ + q(6807), + q(0), + ], + q(tijaltepec mixtec) => [ + q(7501), + q(0), + ], + q(tikar) => [ + q(6511), + q(0), + ], + q(tikopia) => [ + q(6543), + q(0), + ], + q(tilapa otomi) => [ + q(5317), + q(0), + ], + q(tillamook) => [ + q(6512), + q(0), + ], + q(tilquiapan zapotec) => [ + q(7945), + q(0), + ], + q(tilung) => [ + q(6510), + q(0), + ], + q(tima) => [ + q(6590), + q(0), + ], + q(timbe) => [ + q(6513), + q(0), + ], + q(timbisha) => [ + q(5352), + q(1), + ], + q(timne) => [ + q(0422), + q(0), + ], + q(timor pidgin) => [ + q(6775), + q(0), + ], + q(timucua) => [ + q(6529), + q(0), + ], + q(timugon murut) => [ + q(6508), + q(0), + ], + q(tinani) => [ + q(3808), + q(0), + ], + q(tindi) => [ + q(6514), + q(0), + ], + q(tingui-boto) => [ + q(6481), + q(0), + ], + q(tinigua) => [ + q(6519), + q(0), + ], + q(tinputz) => [ + q(6660), + q(0), + ], + q(tippera) => [ + q(6642), + q(0), + ], + q(tira) => [ + q(6506), + q(0), + ], + q(tirahi) => [ + q(6672), + q(0), + ], + q(tiranige diga dogon) => [ + q(6421), + q(0), + ], + q(tiri) => [ + q(1737), + q(0), + ], + q(tiruray) => [ + q(6523), + q(0), + ], + q(tita) => [ + q(6432), + q(0), + ], + q(titan) => [ + q(6740), + q(0), + ], + q(tiv) => [ + q(0431), + q(0), + ], + q(tiwa) => [ + q(3801), + q(0), + ], + q(tiwi) => [ + q(6521), + q(0), + ], + q(tjurruru) => [ + q(6533), + q(0), + ], + q(tlachichilco tepehua) => [ + q(6654), + q(0), + ], + q(tlacoapa me'phaa) => [ + q(6647), + q(0), + ], + q(tlacoapa tlapanec) => [ + q(6647), + q(1), + ], + q(tlacoatzintepec chinantec) => [ + q(1889), + q(0), + ], + q(tlacolulita zapotec) => [ + q(7909), + q(0), + ], + q(tlahuitoltepec mixe) => [ + q(4655), + q(0), + ], + q(tlamacazapa nahuatl) => [ + q(5123), + q(0), + ], + q(tlazoyaltepec mixtec) => [ + q(4480), + q(0), + ], + q(tlhingan-hol) => [ + q(0433), + q(1), + ], + q(tlingit) => [ + q(0434), + q(0), + ], + q(to) => [ + q(6639), + q(0), + ], + q(to'abaita) => [ + q(4378), + q(0), + ], + q(toaripi) => [ + q(6665), + q(0), + ], + q(toba) => [ + q(6620), + q(0), + ], + q(toba-maskoy) => [ + q(6579), + q(0), + ], + q(tobagonian creole english) => [ + q(6470), + q(0), + ], + q(tobanga) => [ + q(6601), + q(0), + ], + q(tobati) => [ + q(6727), + q(0), + ], + q(tobelo) => [ + q(6554), + q(0), + ], + q(tobian) => [ + q(6637), + q(0), + ], + q(tobilung) => [ + q(6465), + q(0), + ], + q(tobo) => [ + q(6389), + q(0), + ], + q(tocantins asurini) => [ + q(0904), + q(0), + ], + q(tocho) => [ + q(6368), + q(0), + ], + q(toda) => [ + q(6414), + q(0), + ], + q(todrah) => [ + q(6433), + q(0), + ], + q(tofanma) => [ + q(6558), + q(0), + ], + q(tofin gbe) => [ + q(6459), + q(0), + ], + q(togbo-vara banda) => [ + q(6632), + q(0), + ], + q(togoyo) => [ + q(6484), + q(0), + ], + q(tohono o'odham) => [ + q(5278), + q(0), + ], + q(tojolabal) => [ + q(6626), + q(0), + ], + q(tok pisin) => [ + q(0438), + q(0), + ], + q(tokano) => [ + q(7951), + q(0), + ], + q(tokelau) => [ + q(0432), + q(0), + ], + q(tokharian a) => [ + q(7504), + q(0), + ], + q(tokharian b) => [ + q(6797), + q(0), + ], + q(toku-no-shima) => [ + q(6542), + q(0), + ], + q(tol) => [ + q(3091), + q(0), + ], + q(tolaki) => [ + q(3823), + q(0), + ], + q(tolomako) => [ + q(6562), + q(0), + ], + q(tolowa) => [ + q(6627), + q(0), + ], + q(toma) => [ + q(6622), + q(0), + ], + q(tomadino) => [ + q(6425), + q(0), + ], + q(tombelala) => [ + q(6734), + q(0), + ], + q(tombonuo) => [ + q(6796), + q(0), + ], + q(tombulu) => [ + q(6628), + q(0), + ], + q(tomini) => [ + q(6804), + q(0), + ], + q(tommo so dogon) => [ + q(2158), + q(0), + ], + q(tomo kan dogon) => [ + q(2156), + q(0), + ], + q(tomoip) => [ + q(6666), + q(0), + ], + q(tondano) => [ + q(6430), + q(0), + ], + q(tondi songway kiini) => [ + q(6712), + q(0), + ], + q(tonga) => [ + q(0437), + q(1), + ], + q(tonga (nyasa)) => [ + q(0436), + q(0), + ], + q(tonga (tonga islands)) => [ + q(0437), + q(0), + ], + q(tonga (zambia)) => [ + q(6625), + q(0), + ], + q(tongwe) => [ + q(6618), + q(0), + ], + q(tonjon) => [ + q(6530), + q(0), + ], + q(tonkawa) => [ + q(6671), + q(0), + ], + q(tonsawang) => [ + q(6616), + q(0), + ], + q(tonsea) => [ + q(6809), + q(0), + ], + q(tontemboan) => [ + q(6613), + q(0), + ], + q(tooro) => [ + q(6728), + q(0), + ], + q(topoiyo) => [ + q(6638), + q(0), + ], + q(toposa) => [ + q(6631), + q(0), + ], + q(tora) => [ + q(6696), + q(0), + ], + q(toraja-sa'dan) => [ + q(5934), + q(0), + ], + q(toram) => [ + q(6681), + q(0), + ], + q(torau) => [ + q(6739), + q(0), + ], + q(tornedalen finnish) => [ + q(2346), + q(0), + ], + q(toro) => [ + q(6436), + q(0), + ], + q(toro so dogon) => [ + q(2161), + q(0), + ], + q(toro tegu dogon) => [ + q(2162), + q(0), + ], + q(toromono) => [ + q(6608), + q(0), + ], + q(torona) => [ + q(6668), + q(0), + ], + q(torres strait creole) => [ + q(6410), + q(0), + ], + q(torricelli) => [ + q(6447), + q(0), + ], + q(torwali) => [ + q(6693), + q(0), + ], + q(tosk albanian) => [ + q(0761), + q(0), + ], + q(totela) => [ + q(6730), + q(0), + ], + q(toto) => [ + q(6806), + q(0), + ], + q(totoli) => [ + q(6799), + q(0), + ], + q(totomachapan zapotec) => [ + q(7906), + q(0), + ], + q(totontepec mixe) => [ + q(4562), + q(0), + ], + q(totoro) => [ + q(6729), + q(0), + ], + q(touo) => [ + q(6670), + q(0), + ], + q(toura (cote d'ivoire)) => [ + q(4801), + q(0), + ], + q(toura (papua new guinea)) => [ + q(2115), + q(0), + ], + q(towei) => [ + q(6732), + q(0), + ], + q(trans-new guinea languages) => [ + q(0517), + q(0), + ], + q(transalpine gaulish) => [ + q(7497), + q(0), + ], + q(traveller danish) => [ + q(5798), + q(0), + ], + q(traveller norwegian) => [ + q(5801), + q(0), + ], + q(traveller scottish) => [ + q(6682), + q(0), + ], + q(tregami) => [ + q(6683), + q(0), + ], + q(tremembe) => [ + q(6578), + q(0), + ], + q(trieng) => [ + q(6248), + q(0), + ], + q(trimuris) => [ + q(6516), + q(0), + ], + q(tring) => [ + q(6476), + q(0), + ], + q(tringgus-sembaan bidayuh) => [ + q(6694), + q(0), + ], + q(trinidad and tobago sign language) => [ + q(4059), + q(0), + ], + q(trinidadian creole english) => [ + q(6677), + q(0), + ], + q(trinitario) => [ + q(6684), + q(0), + ], + q(trio) => [ + q(6680), + q(0), + ], + q(truka) => [ + q(6535), + q(0), + ], + q(trumai) => [ + q(6659), + q(0), + ], + q(ts'un-lao) => [ + q(6706), + q(0), + ], + q(tsaangi) => [ + q(6697), + q(0), + ], + q(tsakhur) => [ + q(6545), + q(0), + ], + q(tsakonian) => [ + q(6700), + q(0), + ], + q(tsakwambo) => [ + q(3685), + q(0), + ], + q(tsamai) => [ + q(6698), + q(0), + ], + q(tsat) => [ + q(2862), + q(0), + ], + q(tsaukambo) => [ + q(3685), + q(1), + ], + q(tseku) => [ + q(6705), + q(0), + ], + q(tsetsaut) => [ + q(6798), + q(0), + ], + q(tshangla) => [ + q(6704), + q(0), + ], + q(tsikimba) => [ + q(3244), + q(0), + ], + q(tsimane) => [ + q(1653), + q(0), + ], + q(tsimihety malagasy) => [ + q(7413), + q(0), + ], + q(tsimshian) => [ + q(0439), + q(0), + ], + q(tsishingini) => [ + q(6715), + q(0), + ], + q(tso) => [ + q(3849), + q(0), + ], + q(tsoa) => [ + q(2759), + q(0), + ], + q(tsogo) => [ + q(6714), + q(0), + ], + q(tsonga) => [ + q(0441), + q(0), + ], + q(tsotsitaal) => [ + q(2356), + q(1), + ], + q(tsotso) => [ + q(4066), + q(0), + ], + q(tsou) => [ + q(6713), + q(0), + ], + q(tsucuba) => [ + q(1669), + q(0), + ], + q(tsum) => [ + q(6743), + q(0), + ], + q(tsuvadi) => [ + q(6765), + q(0), + ], + q(tsuvan) => [ + q(6703), + q(0), + ], + q(tswa) => [ + q(6699), + q(0), + ], + q(tswana) => [ + q(0440), + q(0), + ], + q(tswapong) => [ + q(6787), + q(0), + ], + q(tu) => [ + q(4317), + q(0), + ], + q(tuamotuan) => [ + q(5521), + q(0), + ], + q(tubar) => [ + q(6388), + q(0), + ], + q(tubatulabal) => [ + q(6745), + q(0), + ], + q(tucano) => [ + q(6756), + q(0), + ], + q(tugen) => [ + q(6762), + q(0), + ], + q(tugun) => [ + q(6833), + q(0), + ], + q(tugutil) => [ + q(6753), + q(0), + ], + q(tukang besi north) => [ + q(3331), + q(0), + ], + q(tukang besi south) => [ + q(1200), + q(0), + ], + q(tuki) => [ + q(1028), + q(0), + ], + q(tukpa) => [ + q(6652), + q(0), + ], + q(tukudede) => [ + q(6537), + q(0), + ], + q(tukumanfed) => [ + q(6539), + q(0), + ], + q(tula) => [ + q(6754), + q(0), + ], + q(tulehu) => [ + q(6570), + q(0), + ], + q(tulishi) => [ + q(6458), + q(0), + ], + q(tulu) => [ + q(6415), + q(0), + ], + q(tulu-bohuai) => [ + q(5735), + q(0), + ], + q(tuma-irumu) => [ + q(2979), + q(0), + ], + q(tumak) => [ + q(6576), + q(0), + ], + q(tumari kanuri) => [ + q(3583), + q(0), + ], + q(tumbuka) => [ + q(0443), + q(0), + ], + q(tumi) => [ + q(3420), + q(0), + ], + q(tumleo) => [ + q(6588), + q(0), + ], + q(tumshuqese) => [ + q(7506), + q(0), + ], + q(tumtum) => [ + q(6385), + q(0), + ], + q(tumulung sisaala) => [ + q(6034), + q(0), + ], + q(tumzabt) => [ + q(4688), + q(0), + ], + q(tundra enets) => [ + q(2265), + q(0), + ], + q(tunen) => [ + q(6773), + q(0), + ], + q(tungag) => [ + q(3833), + q(0), + ], + q(tunggare) => [ + q(6690), + q(0), + ], + q(tungus languages) => [ + q(0530), + q(0), + ], + q(tunia) => [ + q(6750), + q(0), + ], + q(tunica) => [ + q(6755), + q(0), + ], + q(tunisian arabic) => [ + q(0625), + q(0), + ], + q(tunisian sign language) => [ + q(6701), + q(0), + ], + q(tunjung) => [ + q(6526), + q(0), + ], + q(tunni) => [ + q(6667), + q(0), + ], + q(tunzu) => [ + q(2203), + q(0), + ], + q(tuotomb) => [ + q(6724), + q(0), + ], + q(tupari) => [ + q(6653), + q(0), + ], + q(tupi) => [ + q(6657), + q(0), + ], + q(tupi languages) => [ + q(0444), + q(0), + ], + q(tupinamba) => [ + q(6649), + q(0), + ], + q(tupinikin) => [ + q(6646), + q(0), + ], + q(tupuri) => [ + q(6752), + q(0), + ], + q(turaka) => [ + q(6679), + q(0), + ], + q(turi) => [ + q(6675), + q(0), + ], + q(turiwara) => [ + q(6791), + q(0), + ], + q(turk isaret dili) => [ + q(6707), + q(1), + ], + q(turka) => [ + q(6763), + q(0), + ], + q(turkana) => [ + q(6760), + q(0), + ], + q(turkic khalaj) => [ + q(3435), + q(0), + ], + q(turkic languages) => [ + q(0529), + q(0), + ], + q(turkish) => [ + q(0445), + q(0), + ], + q(turkish sign language) => [ + q(6707), + q(0), + ], + q(turkish, ottoman (1500-1928)) => [ + q(0333), + q(0), + ], + q(turkmen) => [ + q(0442), + q(0), + ], + q(turks and caicos creole english) => [ + q(6401), + q(0), + ], + q(turoyo) => [ + q(6691), + q(0), + ], + q(turumsa) => [ + q(6663), + q(0), + ], + q(turung) => [ + q(6695), + q(0), + ], + q(tuscarora) => [ + q(6758), + q(0), + ], + q(tutelo) => [ + q(6719), + q(0), + ], + q(tutong) => [ + q(6725), + q(0), + ], + q(tutsa naga) => [ + q(6772), + q(0), + ], + q(tutuba) => [ + q(6581), + q(0), + ], + q(tututepec mixtec) => [ + q(4568), + q(0), + ], + q(tututni) => [ + q(6759), + q(0), + ], + q(tuvalu) => [ + q(0447), + q(0), + ], + q(tuvinian) => [ + q(0449), + q(0), + ], + q(tuwali ifugao) => [ + q(2913), + q(0), + ], + q(tuwari) => [ + q(6793), + q(0), + ], + q(tuwuli) => [ + q(1370), + q(0), + ], + q(tuxa) => [ + q(6747), + q(0), + ], + q(tuxinawa) => [ + q(6761), + q(0), + ], + q(tuyuca) => [ + q(6748), + q(0), + ], + q(twana) => [ + q(6776), + q(0), + ], + q(twendi) => [ + q(6786), + q(0), + ], + q(twents) => [ + q(6779), + q(0), + ], + q(twi) => [ + q(0448), + q(0), + ], + q(tyap) => [ + q(3214), + q(0), + ], + q(tyaraity) => [ + q(7182), + q(0), + ], + q(tz'utujil) => [ + q(6830), + q(0), + ], + q(tzeltal) => [ + q(6829), + q(0), + ], + q(tzotzil) => [ + q(6834), + q(0), + ], + q(u) => [ + q(6947), + q(0), + ], + q(uab meto) => [ + q(0834), + q(0), + ], + q(uamue) => [ + q(6836), + q(0), + ], + q(uare) => [ + q(3598), + q(0), + ], + q(ubaghara) => [ + q(1591), + q(0), + ], + q(ubang) => [ + q(6839), + q(0), + ], + q(ubi) => [ + q(6840), + q(0), + ], + q(ubir) => [ + q(6842), + q(0), + ], + q(ubykh) => [ + q(6844), + q(0), + ], + q(ucayali-yurua asheninka) => [ + q(1828), + q(0), + ], + q(uda) => [ + q(6845), + q(0), + ], + q(udi) => [ + q(6848), + q(0), + ], + q(udihe) => [ + q(6846), + q(0), + ], + q(udmurt) => [ + q(0450), + q(0), + ], + q(uduk) => [ + q(6851), + q(0), + ], + q(ufim) => [ + q(6853), + q(0), + ], + q(ugandan sign language) => [ + q(6856), + q(0), + ], + q(ugaritic) => [ + q(0451), + q(0), + ], + q(ughele) => [ + q(6855), + q(0), + ], + q(ugong) => [ + q(6857), + q(0), + ], + q(uhami) => [ + q(6859), + q(0), + ], + q(uighur) => [ + q(0452), + q(0), + ], + q(uisai) => [ + q(6861), + q(0), + ], + q(ujir) => [ + q(6849), + q(0), + ], + q(ukaan) => [ + q(3213), + q(0), + ], + q(ukhwejo) => [ + q(6866), + q(0), + ], + q(ukit) => [ + q(6891), + q(0), + ], + q(ukpe-bayobiri) => [ + q(6869), + q(0), + ], + q(ukpet-ehom) => [ + q(0725), + q(0), + ], + q(ukrainian) => [ + q(0453), + q(0), + ], + q(ukrainian sign language) => [ + q(6868), + q(0), + ], + q(ukue) => [ + q(6872), + q(0), + ], + q(ukuriguma) => [ + q(6865), + q(0), + ], + q(ukwa) => [ + q(6870), + q(0), + ], + q(ukwuani-aboh-ndoni) => [ + q(6873), + q(0), + ], + q(ulau-suain) => [ + q(6281), + q(0), + ], + q(ulch) => [ + q(6877), + q(0), + ], + q(ulithian) => [ + q(6880), + q(0), + ], + q(ullatan) => [ + q(6882), + q(0), + ], + q(ulukwumi) => [ + q(6876), + q(0), + ], + q(ulumanda') => [ + q(6883), + q(0), + ], + q(ulwa) => [ + q(6886), + q(0), + ], + q(uma) => [ + q(5569), + q(0), + ], + q(uma' lasan) => [ + q(7377), + q(0), + ], + q(uma' lung) => [ + q(6885), + q(0), + ], + q(umanakaina) => [ + q(2463), + q(0), + ], + q(umatilla) => [ + q(6887), + q(0), + ], + q(umbindhamu) => [ + q(6889), + q(0), + ], + q(umbrian) => [ + q(7521), + q(0), + ], + q(umbu-ungu) => [ + q(6843), + q(0), + ], + q(umbugarla) => [ + q(6896), + q(0), + ], + q(umbundu) => [ + q(0454), + q(0), + ], + q(umbuygamu) => [ + q(6890), + q(0), + ], + q(ume sami) => [ + q(6060), + q(0), + ], + q(umeda) => [ + q(6909), + q(0), + ], + q(umiida) => [ + q(7517), + q(0), + ], + q(umiray dumaget agta) => [ + q(2168), + q(0), + ], + q(umon) => [ + q(6892), + q(0), + ], + q(umotina) => [ + q(6894), + q(0), + ], + q(umpila) => [ + q(6895), + q(0), + ], + q(una) => [ + q(4554), + q(0), + ], + q(unami) => [ + q(6903), + q(0), + ], + q(uncoded languages) => [ + q(0282), + q(0), + ], + q(unde kaili) => [ + q(6908), + q(0), + ], + q(undetermined) => [ + q(0455), + q(0), + ], + q(uneapa) => [ + q(1052), + q(0), + ], + q(uneme) => [ + q(6900), + q(0), + ], + q(unggaranggu) => [ + q(7522), + q(0), + ], + q(unggumi) => [ + q(7335), + q(0), + ], + q(ungkue) => [ + q(2540), + q(0), + ], + q(unserdeutsch) => [ + q(6884), + q(0), + ], + q(unua) => [ + q(5275), + q(0), + ], + q(unubahe) => [ + q(6906), + q(0), + ], + q(upper chehalis) => [ + q(1742), + q(0), + ], + q(upper grand valley dani) => [ + q(2093), + q(0), + ], + q(upper guinea crioulo) => [ + q(5563), + q(0), + ], + q(upper kinabatangan) => [ + q(2081), + q(0), + ], + q(upper kuskokwim) => [ + q(3655), + q(0), + ], + q(upper necaxa totonac) => [ + q(6548), + q(0), + ], + q(upper saxon) => [ + q(6321), + q(0), + ], + q(upper sorbian) => [ + q(0183), + q(0), + ], + q(upper ta'oih) => [ + q(6726), + q(0), + ], + q(upper tanana) => [ + q(6363), + q(0), + ], + q(upper taromi) => [ + q(6635), + q(0), + ], + q(upper umpqua) => [ + q(7524), + q(0), + ], + q(ura (papua new guinea)) => [ + q(6923), + q(0), + ], + q(ura (vanuatu)) => [ + q(6946), + q(0), + ], + q(uradhi) => [ + q(6915), + q(0), + ], + q(urak lawoi') => [ + q(6919), + q(0), + ], + q(urali) => [ + q(6920), + q(0), + ], + q(uralic languages) => [ + q(0531), + q(0), + ], + q(urapmin) => [ + q(6921), + q(0), + ], + q(urarina) => [ + q(6911), + q(0), + ], + q(urartian) => [ + q(7525), + q(0), + ], + q(urat) => [ + q(6926), + q(0), + ], + q(urdu) => [ + q(0456), + q(0), + ], + q(urhobo) => [ + q(6917), + q(0), + ], + q(uri) => [ + q(6949), + q(0), + ], + q(urigina) => [ + q(6916), + q(0), + ], + q(urim) => [ + q(6918), + q(0), + ], + q(urimo) => [ + q(6930), + q(0), + ], + q(uripiv-wala-rano-atchin) => [ + q(6910), + q(0), + ], + q(urningangg) => [ + q(6913), + q(0), + ], + q(uru) => [ + q(6914), + q(0), + ], + q(uru-eu-wau-wau) => [ + q(6932), + q(0), + ], + q(uru-pa-in) => [ + q(6924), + q(0), + ], + q(uruangnirin) => [ + q(6922), + q(0), + ], + q(uruava) => [ + q(6928), + q(0), + ], + q(urubu-kaapor) => [ + q(6912), + q(0), + ], + q(urubu-kaapor sign language) => [ + q(6871), + q(0), + ], + q(uruguayan sign language) => [ + q(6858), + q(0), + ], + q(urum) => [ + q(6944), + q(0), + ], + q(urumi) => [ + q(6927), + q(0), + ], + q(usaghade) => [ + q(6936), + q(0), + ], + q(usan) => [ + q(7179), + q(0), + ], + q(usarufa) => [ + q(6933), + q(0), + ], + q(ushojo) => [ + q(6934), + q(0), + ], + q(usila chinantec) => [ + q(1900), + q(0), + ], + q(usku) => [ + q(6879), + q(0), + ], + q(uspanteco) => [ + q(6937), + q(0), + ], + q(usui) => [ + q(6935), + q(0), + ], + q(ut-ma'in) => [ + q(2480), + q(0), + ], + q(utarmbung) => [ + q(5255), + q(0), + ], + q(ute-southern paiute) => [ + q(6940), + q(0), + ], + q(uto-aztecan languages) => [ + q(0494), + q(0), + ], + q(utu) => [ + q(6943), + q(0), + ], + q(uvbie) => [ + q(2312), + q(0), + ], + q(uya) => [ + q(6938), + q(0), + ], + q(uyajitaya) => [ + q(2173), + q(0), + ], + q(uyghur) => [ + q(0452), + q(1), + ], + q(uzbek) => [ + q(0457), + q(0), + ], + q(uzbeki arabic) => [ + q(0955), + q(0), + ], + q(uzekwe) => [ + q(2318), + q(0), + ], + q(v'enen taut) => [ + q(4956), + q(1), + ], + q(vaagri booli) => [ + q(6955), + q(0), + ], + q(vaeakau-taumako) => [ + q(5465), + q(1), + ], + q(vafsi) => [ + q(6957), + q(0), + ], + q(vaghat-ya-bijim-legeri) => [ + q(1217), + q(0), + ], + q(vaghri) => [ + q(6980), + q(0), + ], + q(vaghua) => [ + q(6764), + q(0), + ], + q(vagla) => [ + q(6958), + q(0), + ], + q(vai) => [ + q(0458), + q(0), + ], + q(vaiphei) => [ + q(6965), + q(0), + ], + q(vale) => [ + q(6956), + q(0), + ], + q(valencian) => [ + q(0071), + q(1), + ], + q(valencian sign language) => [ + q(7035), + q(0), + ], + q(valle nacional chinantec) => [ + q(1917), + q(0), + ], + q(valley maidu) => [ + q(7021), + q(0), + ], + q(valman) => [ + q(6963), + q(0), + ], + q(valpei) => [ + q(7001), + q(0), + ], + q(vamale) => [ + q(4354), + q(0), + ], + q(vame) => [ + q(4376), + q(0), + ], + q(vandalic) => [ + q(7530), + q(0), + ], + q(vangunu) => [ + q(4465), + q(0), + ], + q(vanimo) => [ + q(6962), + q(0), + ], + q(vano) => [ + q(7026), + q(0), + ], + q(vanuma) => [ + q(6968), + q(0), + ], + q(vao) => [ + q(6964), + q(0), + ], + q(varhadi-nagpuri) => [ + q(6959), + q(0), + ], + q(varisi) => [ + q(7031), + q(0), + ], + q(varli) => [ + q(6969), + q(0), + ], + q(vasavi) => [ + q(6967), + q(0), + ], + q(vasekele) => [ + q(6960), + q(2), + ], + q(veddah) => [ + q(6974), + q(0), + ], + q(vehes) => [ + q(6961), + q(0), + ], + q(veluws) => [ + q(6975), + q(0), + ], + q(vemgo-mabas) => [ + q(6976), + q(0), + ], + q(venda) => [ + q(0459), + q(0), + ], + q(venetian) => [ + q(6973), + q(0), + ], + q(venetic) => [ + q(7528), + q(0), + ], + q(venezuelan sign language) => [ + q(7034), + q(0), + ], + q(vengo) => [ + q(1035), + q(0), + ], + q(ventureno) => [ + q(6977), + q(0), + ], + q(veps) => [ + q(6978), + q(0), + ], + q(vera'a) => [ + q(7030), + q(0), + ], + q(vestinian) => [ + q(7532), + q(0), + ], + q(vidunda) => [ + q(6983), + q(0), + ], + q(viemo) => [ + q(6985), + q(0), + ], + q(vietnamese) => [ + q(0460), + q(0), + ], + q(viid) => [ + q(6140), + q(1), + ], + q(vilela) => [ + q(6986), + q(0), + ], + q(vili) => [ + q(6984), + q(0), + ], + q(villa viciosa agta) => [ + q(2197), + q(0), + ], + q(vincentian creole english) => [ + q(6282), + q(0), + ], + q(vinmavis) => [ + q(7027), + q(0), + ], + q(vinza) => [ + q(6987), + q(0), + ], + q(virgin islands creole english) => [ + q(6982), + q(0), + ], + q(vishavan) => [ + q(6988), + q(0), + ], + q(viti) => [ + q(6989), + q(0), + ], + q(vitou) => [ + q(7036), + q(0), + ], + q(vitu) => [ + q(7127), + q(0), + ], + q(vlaams) => [ + q(7002), + q(0), + ], + q(vlaamse gebarentaal) => [ + q(6981), + q(0), + ], + q(vlax romani) => [ + q(5817), + q(0), + ], + q(volapuk) => [ + q(0461), + q(0), + ], + q(volscian) => [ + q(7531), + q(0), + ], + q(vono) => [ + q(3215), + q(0), + ], + q(voro) => [ + q(7029), + q(0), + ], + q(votic) => [ + q(0462), + q(0), + ], + q(vumbu) => [ + q(7037), + q(0), + ], + q(vunapu) => [ + q(7028), + q(0), + ], + q(vunjo) => [ + q(7038), + q(0), + ], + q(vure) => [ + q(3940), + q(1), + ], + q(vures) => [ + q(4536), + q(0), + ], + q(vute) => [ + q(7039), + q(0), + ], + q(vwanji) => [ + q(7067), + q(0), + ], + q(wa) => [ + q(7071), + q(0), + ], + q(wa'ema) => [ + q(7047), + q(0), + ], + q(waama) => [ + q(7246), + q(0), + ], + q(waamwang) => [ + q(7162), + q(0), + ], + q(waata) => [ + q(6231), + q(0), + ], + q(wab) => [ + q(7042), + q(0), + ], + q(wabo) => [ + q(7064), + q(0), + ], + q(waboda) => [ + q(3474), + q(0), + ], + q(waci gbe) => [ + q(7080), + q(0), + ], + q(wadaginam) => [ + q(7082), + q(0), + ], + q(waddar) => [ + q(7073), + q(0), + ], + q(wadi wadi) => [ + q(7535), + q(0), + ], + q(wadikali) => [ + q(7084), + q(0), + ], + q(wadiyara koli) => [ + q(3724), + q(0), + ], + q(wadjabangayi) => [ + q(7086), + q(0), + ], + q(wadjiginy) => [ + q(7083), + q(0), + ], + q(wadjigu) => [ + q(7085), + q(0), + ], + q(wae rana) => [ + q(7216), + q(0), + ], + q(waffa) => [ + q(7050), + q(0), + ], + q(wagawaga) => [ + q(7103), + q(0), + ], + q(wagaya) => [ + q(7102), + q(0), + ], + q(wagdi) => [ + q(7074), + q(0), + ], + q(wageman) => [ + q(7055), + q(0), + ], + q(wagi) => [ + q(2321), + q(0), + ], + q(wahau kayan) => [ + q(7112), + q(0), + ], + q(wahau kenyah) => [ + q(7111), + q(0), + ], + q(wahgi) => [ + q(7105), + q(0), + ], + q(waigali) => [ + q(7069), + q(0), + ], + q(waigeo) => [ + q(7106), + q(0), + ], + q(wailaki) => [ + q(7143), + q(0), + ], + q(wailapa) => [ + q(7147), + q(0), + ], + q(waima) => [ + q(5841), + q(0), + ], + q(waima'a) => [ + q(7159), + q(0), + ], + q(waimaha) => [ + q(1031), + q(0), + ], + q(waimiri-atroari) => [ + q(0925), + q(0), + ], + q(waioli) => [ + q(7142), + q(0), + ], + q(waiwai) => [ + q(7059), + q(0), + ], + q(waja) => [ + q(7129), + q(0), + ], + q(wajarri) => [ + q(7077), + q(0), + ], + q(wajuk) => [ + q(7538), + q(0), + ], + q(waka) => [ + q(7058), + q(0), + ], + q(wakabunga) => [ + q(7247), + q(0), + ], + q(wakashan languages) => [ + q(0463), + q(0), + ], + q(wakawaka) => [ + q(7136), + q(0), + ], + q(wakde) => [ + q(7133), + q(0), + ], + q(wakhi) => [ + q(7070), + q(0), + ], + q(wakona) => [ + q(7046), + q(0), + ], + q(wala) => [ + q(3883), + q(0), + ], + q(walak) => [ + q(7151), + q(0), + ], + q(walamo) => [ + q(0464), + q(0), + ], + q(walangama) => [ + q(4951), + q(0), + ], + q(wali (ghana)) => [ + q(7152), + q(0), + ], + q(wali (sudan)) => [ + q(7144), + q(0), + ], + q(waling) => [ + q(7153), + q(0), + ], + q(walio) => [ + q(7138), + q(0), + ], + q(walla walla) => [ + q(7041), + q(0), + ], + q(wallisian) => [ + q(7148), + q(0), + ], + q(walloon) => [ + q(0469), + q(0), + ], + q(walmajarri) => [ + q(7165), + q(0), + ], + q(walser) => [ + q(7045), + q(0), + ], + q(walungge) => [ + q(5238), + q(0), + ], + q(wamas) => [ + q(7156), + q(0), + ], + q(wambaya) => [ + q(7155), + q(0), + ], + q(wambon) => [ + q(7164), + q(0), + ], + q(wambule) => [ + q(7158), + q(0), + ], + q(wamey) => [ + q(1822), + q(0), + ], + q(wamin) => [ + q(7160), + q(0), + ], + q(wampanoag) => [ + q(7051), + q(0), + ], + q(wampar) => [ + q(3817), + q(0), + ], + q(wampur) => [ + q(7062), + q(0), + ], + q(wan) => [ + q(7052), + q(0), + ], + q(wanambre) => [ + q(7168), + q(0), + ], + q(wanap) => [ + q(7178), + q(0), + ], + q(wanbasana) => [ + q(0763), + q(1), + ], + q(wancho naga) => [ + q(4995), + q(0), + ], + q(wanda) => [ + q(7066), + q(0), + ], + q(wandala) => [ + q(4225), + q(0), + ], + q(wandamen) => [ + q(7044), + q(0), + ], + q(wandarang) => [ + q(7170), + q(0), + ], + q(wandji) => [ + q(7081), + q(0), + ], + q(wane) => [ + q(2877), + q(0), + ], + q(waneci) => [ + q(7171), + q(0), + ], + q(wanga) => [ + q(4092), + q(0), + ], + q(wangaaybuwan-ngiyambaa) => [ + q(7254), + q(0), + ], + q(wanggamala) => [ + q(7175), + q(0), + ], + q(wangganguru) => [ + q(7104), + q(0), + ], + q(wanggom) => [ + q(7172), + q(0), + ], + q(wangkayutyuru) => [ + q(7137), + q(0), + ], + q(wangkumara) => [ + q(7539), + q(0), + ], + q(wanman) => [ + q(7076), + q(0), + ], + q(wannu) => [ + q(3147), + q(0), + ], + q(wano) => [ + q(7177), + q(0), + ], + q(wantoat) => [ + q(7169), + q(0), + ], + q(wanukaka) => [ + q(7174), + q(0), + ], + q(wanyi) => [ + q(7181), + q(0), + ], + q(waorani) => [ + q(0936), + q(0), + ], + q(wapan) => [ + q(3152), + q(0), + ], + q(wapha) => [ + q(3162), + q(0), + ], + q(wapishana) => [ + q(7054), + q(0), + ], + q(wappo) => [ + q(7053), + q(0), + ], + q(war-jaintia) => [ + q(0776), + q(0), + ], + q(wara) => [ + q(6402), + q(0), + ], + q(warao) => [ + q(7063), + q(0), + ], + q(warapu) => [ + q(7199), + q(0), + ], + q(waray) => [ + q(0465), + q(0), + ], + q(waray (australia)) => [ + q(7218), + q(0), + ], + q(waray (philippines)) => [ + q(0465), + q(1), + ], + q(wardaman) => [ + q(7211), + q(0), + ], + q(wardandi) => [ + q(7252), + q(0), + ], + q(warduji) => [ + q(7201), + q(0), + ], + q(warembori) => [ + q(7219), + q(0), + ], + q(wares) => [ + q(7049), + q(0), + ], + q(waris) => [ + q(7212), + q(0), + ], + q(waritai) => [ + q(7065), + q(0), + ], + q(wariyangga) => [ + q(7204), + q(0), + ], + q(warji) => [ + q(7130), + q(0), + ], + q(warkay-bipim) => [ + q(1181), + q(0), + ], + q(warlmanpa) => [ + q(7206), + q(0), + ], + q(warlpiri) => [ + q(7072), + q(0), + ], + q(warluwara) => [ + q(7200), + q(0), + ], + q(warnang) => [ + q(7208), + q(0), + ], + q(waropen) => [ + q(7210), + q(0), + ], + q(warrgamay) => [ + q(7108), + q(0), + ], + q(warrwa) => [ + q(7249), + q(0), + ], + q(waru) => [ + q(7213), + q(0), + ], + q(warumungu) => [ + q(7207), + q(0), + ], + q(waruna) => [ + q(7214), + q(0), + ], + q(warungu) => [ + q(7202), + q(0), + ], + q(warwar feni) => [ + q(2837), + q(0), + ], + q(wasa) => [ + q(7224), + q(0), + ], + q(wasco-wishram) => [ + q(7043), + q(0), + ], + q(wasembo) => [ + q(2636), + q(0), + ], + q(washo) => [ + q(0466), + q(0), + ], + q(waskia) => [ + q(7222), + q(0), + ], + q(wasu) => [ + q(7225), + q(0), + ], + q(watakataui) => [ + q(7230), + q(0), + ], + q(watam) => [ + q(7060), + q(0), + ], + q(wathawurrung) => [ + q(7228), + q(0), + ], + q(watiwa) => [ + q(7227), + q(0), + ], + q(watubela) => [ + q(7048), + q(0), + ], + q(waube) => [ + q(3512), + q(0), + ], + q(waura) => [ + q(7057), + q(0), + ], + q(wauyai) => [ + q(7245), + q(0), + ], + q(wawa) => [ + q(7250), + q(0), + ], + q(wawonii) => [ + q(7196), + q(0), + ], + q(waxianghua) => [ + q(7251), + q(0), + ], + q(wayampi) => [ + q(5339), + q(0), + ], + q(wayana) => [ + q(7061), + q(0), + ], + q(wayanad chetti) => [ + q(1895), + q(0), + ], + q(wayoro) => [ + q(7257), + q(0), + ], + q(wayu) => [ + q(6970), + q(0), + ], + q(wayuu) => [ + q(2642), + q(0), + ], + q(we northern) => [ + q(7183), + q(0), + ], + q(we southern) => [ + q(2691), + q(0), + ], + q(we western) => [ + q(7088), + q(0), + ], + q(wedau) => [ + q(7089), + q(0), + ], + q(weh) => [ + q(7091), + q(0), + ], + q(wejewa) => [ + q(7100), + q(0), + ], + q(weliki) => [ + q(3433), + q(0), + ], + q(welsh) => [ + q(0467), + q(0), + ], + q(welsh romani) => [ + q(5815), + q(0), + ], + q(wemale) => [ + q(7094), + q(0), + ], + q(wemba wemba) => [ + q(7544), + q(0), + ], + q(weme gbe) => [ + q(7093), + q(0), + ], + q(wergaia) => [ + q(7090), + q(0), + ], + q(weri) => [ + q(7096), + q(0), + ], + q(wersing) => [ + q(3682), + q(0), + ], + q(west albay bikol) => [ + q(2336), + q(0), + ], + q(west ambae) => [ + q(4984), + q(0), + ], + q(west bengal sign language) => [ + q(7075), + q(0), + ], + q(west berawan) => [ + q(7817), + q(0), + ], + q(west central banda) => [ + q(1054), + q(0), + ], + q(west central oromo) => [ + q(2418), + q(0), + ], + q(west coast bajau) => [ + q(1107), + q(0), + ], + q(west damar) => [ + q(2135), + q(0), + ], + q(west germanic languages) => [ + q(0508), + q(0), + ], + q(west goodenough) => [ + q(1976), + q(0), + ], + q(west kewa) => [ + q(3278), + q(0), + ], + q(west lembata) => [ + q(3976), + q(0), + ], + q(west makian) => [ + q(4491), + q(0), + ], + q(west masela) => [ + q(4541), + q(0), + ], + q(west slavic languages) => [ + q(0537), + q(0), + ], + q(west tarangan) => [ + q(6805), + q(0), + ], + q(west uvean) => [ + q(6948), + q(0), + ], + q(west yugur) => [ + q(7586), + q(0), + ], + q(west-central limba) => [ + q(3901), + q(0), + ], + q(western abnaki) => [ + q(0564), + q(0), + ], + q(western apache) => [ + q(0856), + q(0), + ], + q(western arrarnta) => [ + q(0871), + q(0), + ], + q(western balochi) => [ + q(1173), + q(0), + ], + q(western bolivian guarani) => [ + q(2581), + q(0), + ], + q(western bru) => [ + q(1442), + q(0), + ], + q(western bukidnon manobo) => [ + q(4121), + q(0), + ], + q(western canadian inuktitut) => [ + q(2944), + q(1), + ], + q(western cham) => [ + q(1740), + q(0), + ], + q(western dani) => [ + q(2105), + q(0), + ], + q(western durango nahuatl) => [ + q(1019), + q(0), + ], + q(western fijian) => [ + q(7258), + q(0), + ], + q(western frisian) => [ + q(0143), + q(0), + ], + q(western highland chatino) => [ + q(1893), + q(0), + ], + q(western highland purepecha) => [ + q(5633), + q(0), + ], + q(western huasteca nahuatl) => [ + q(4872), + q(0), + ], + q(western juxtlahuaca mixtec) => [ + q(3125), + q(0), + ], + q(western kanjobal) => [ + q(3485), + q(0), + ], + q(western karaboro) => [ + q(3761), + q(0), + ], + q(western katu) => [ + q(3644), + q(0), + ], + q(western kayah) => [ + q(3755), + q(0), + ], + q(western keres) => [ + q(3391), + q(0), + ], + q(western krahn) => [ + q(3585), + q(0), + ], + q(western lalu) => [ + q(7772), + q(0), + ], + q(western lawa) => [ + q(3834), + q(0), + ], + q(western magar) => [ + q(4502), + q(0), + ], + q(western malayo-polynesian languages) => [ + q(0523), + q(0), + ], + q(western maninkakan) => [ + q(4375), + q(0), + ], + q(western mari) => [ + q(4507), + q(0), + ], + q(western mashan hmong) => [ + q(2794), + q(0), + ], + q(western mashan miao) => [ + q(2794), + q(1), + ], + q(western meohang) => [ + q(5731), + q(0), + ], + q(western muria) => [ + q(4588), + q(0), + ], + q(western neo-aramaic) => [ + q(0787), + q(0), + ], + q(western niger fulfulde) => [ + q(2383), + q(0), + ], + q(western ojibwa) => [ + q(5219), + q(0), + ], + q(western pahari languages) => [ + q(0177), + q(1), + ], + q(western panjabi) => [ + q(5527), + q(0), + ], + q(western parbate kham) => [ + q(3386), + q(0), + ], + q(western penan) => [ + q(5529), + q(0), + ], + q(western sisaala) => [ + q(6229), + q(0), + ], + q(western subanon) => [ + q(6268), + q(0), + ], + q(western tamang) => [ + q(6423), + q(0), + ], + q(western tawbuid) => [ + q(6777), + q(0), + ], + q(western tlacolula valley zapotec) => [ + q(7791), + q(0), + ], + q(western totonac) => [ + q(6669), + q(0), + ], + q(western tunebo) => [ + q(6598), + q(0), + ], + q(western xiangxi miao) => [ + q(4400), + q(0), + ], + q(western xwla gbe) => [ + q(7540), + q(0), + ], + q(western yiddish) => [ + q(7633), + q(0), + ], + q(westphalien) => [ + q(7095), + q(0), + ], + q(wetamut) => [ + q(7248), + q(0), + ], + q(wewaw) => [ + q(7087), + q(0), + ], + q(weyto) => [ + q(7197), + q(0), + ], + q(white gelao) => [ + q(2525), + q(0), + ], + q(white lachi) => [ + q(4093), + q(0), + ], + q(whitesands) => [ + q(6609), + q(0), + ], + q(wiarumus) => [ + q(6744), + q(0), + ], + q(wichi lhamtes guisnay) => [ + q(4693), + q(0), + ], + q(wichi lhamtes nocten) => [ + q(4563), + q(0), + ], + q(wichi lhamtes vejoz) => [ + q(7150), + q(0), + ], + q(wichita) => [ + q(7114), + q(0), + ], + q(wik-epa) => [ + q(7115), + q(0), + ], + q(wik-iiyanh) => [ + q(7120), + q(0), + ], + q(wik-keyangan) => [ + q(7116), + q(0), + ], + q(wik-me'anha) => [ + q(7118), + q(0), + ], + q(wik-mungkan) => [ + q(7123), + q(0), + ], + q(wik-ngathana) => [ + q(7117), + q(0), + ], + q(wikalkan) => [ + q(7121), + q(0), + ], + q(wikngenchera) => [ + q(7233), + q(0), + ], + q(wilawila) => [ + q(7122), + q(0), + ], + q(wintu) => [ + q(7180), + q(0), + ], + q(winye) => [ + q(3608), + q(0), + ], + q(wipi) => [ + q(2466), + q(0), + ], + q(wiradhuri) => [ + q(7203), + q(0), + ], + q(wirafed) => [ + q(7125), + q(0), + ], + q(wirangu) => [ + q(7107), + q(0), + ], + q(wiru) => [ + q(7126), + q(0), + ], + q(wiyot) => [ + q(7128), + q(0), + ], + q(woccon) => [ + q(7534), + q(0), + ], + q(wogamusin) => [ + q(7188), + q(0), + ], + q(wogeo) => [ + q(7184), + q(0), + ], + q(woi) => [ + q(7078), + q(0), + ], + q(woiwurrung) => [ + q(7255), + q(0), + ], + q(wojenaka) => [ + q(3134), + q(0), + ], + q(wolaitta) => [ + q(0464), + q(2), + ], + q(wolane) => [ + q(7140), + q(0), + ], + q(wolani) => [ + q(7185), + q(0), + ], + q(wolaytta) => [ + q(0464), + q(1), + ], + q(woleaian) => [ + q(7186), + q(0), + ], + q(wolio) => [ + q(7146), + q(0), + ], + q(wolof) => [ + q(0470), + q(0), + ], + q(wom (nigeria)) => [ + q(7191), + q(0), + ], + q(wom (papua new guinea)) => [ + q(7163), + q(0), + ], + q(womo) => [ + q(7167), + q(0), + ], + q(wongo) => [ + q(7192), + q(0), + ], + q(woods cree) => [ + q(1920), + q(0), + ], + q(woria) => [ + q(7194), + q(0), + ], + q(worimi) => [ + q(3234), + q(0), + ], + q(worodougou) => [ + q(3149), + q(0), + ], + q(worrorra) => [ + q(7209), + q(0), + ], + q(wotapuri-katarqalai) => [ + q(7226), + q(0), + ], + q(wotjobaluk) => [ + q(7543), + q(0), + ], + q(wotu) => [ + q(7232), + q(0), + ], + q(woun meu) => [ + q(5005), + q(0), + ], + q(written oirat) => [ + q(7541), + q(0), + ], + q(wu chinese) => [ + q(7242), + q(0), + ], + q(wuding-luquan yi) => [ + q(7774), + q(0), + ], + q(wudu) => [ + q(7235), + q(0), + ], + q(wuliwuli) => [ + q(7149), + q(0), + ], + q(wulna) => [ + q(7244), + q(0), + ], + q(wumboko) => [ + q(1409), + q(0), + ], + q(wumbvu) => [ + q(7238), + q(0), + ], + q(wumeng nasu) => [ + q(7777), + q(0), + ], + q(wunai bunu) => [ + q(1554), + q(0), + ], + q(wunambal) => [ + q(7234), + q(0), + ], + q(wunumara) => [ + q(7176), + q(0), + ], + q(wurrugu) => [ + q(7240), + q(0), + ], + q(wusa nasu) => [ + q(7632), + q(0), + ], + q(wushi) => [ + q(1450), + q(0), + ], + q(wusi) => [ + q(7221), + q(0), + ], + q(wutung) => [ + q(7241), + q(0), + ], + q(wutunhua) => [ + q(7236), + q(0), + ], + q(wuvulu-aua) => [ + q(7243), + q(0), + ], + q(wuzlam) => [ + q(6850), + q(0), + ], + q(wyandot) => [ + q(7253), + q(0), + ], + q(wymysorys) => [ + q(7256), + q(0), + ], + q(xaasongaxango) => [ + q(3178), + q(0), + ], + q(xadani zapotec) => [ + q(7811), + q(0), + ], + q(xakriaba) => [ + q(7370), + q(0), + ], + q(xam) => [ + q(7268), + q(1), + ], + q(xamtanga) => [ + q(7269), + q(0), + ], + q(xanaguia zapotec) => [ + q(7939), + q(0), + ], + q(xaracuu) => [ + q(0795), + q(0), + ], + q(xaragure) => [ + q(0992), + q(0), + ], + q(xavante) => [ + q(7277), + q(0), + ], + q(xegwi) => [ + q(7317), + q(1), + ], + q(xerente) => [ + q(7321), + q(0), + ], + q(xeta) => [ + q(7323), + q(0), + ], + q(xhosa) => [ + q(0472), + q(0), + ], + q(xiang chinese) => [ + q(2842), + q(0), + ], + q(xibe) => [ + q(6055), + q(0), + ], + q(xicotepec de juarez totonac) => [ + q(6629), + q(0), + ], + q(xinca) => [ + q(7348), + q(0), + ], + q(xingu asurini) => [ + q(0898), + q(0), + ], + q(xipaya) => [ + q(7352), + q(0), + ], + q(xiri) => [ + q(7346), + q(0), + ], + q(xiriana) => [ + q(7349), + q(0), + ], + q(xishanba lalo) => [ + q(7776), + q(0), + ], + q(xokleng) => [ + q(7435), + q(0), + ], + q(xoo) => [ + q(4968), + q(1), + ], + q(xukuru) => [ + q(7438), + q(0), + ], + q(xwela gbe) => [ + q(7536), + q(0), + ], + q(yaaku) => [ + q(4589), + q(0), + ], + q(yabaana) => [ + q(7593), + q(0), + ], + q(yabarana) => [ + q(7575), + q(0), + ], + q(yabem) => [ + q(3043), + q(0), + ], + q(yaben) => [ + q(7592), + q(0), + ], + q(yabong) => [ + q(7594), + q(0), + ], + q(yabula yabula) => [ + q(7784), + q(0), + ], + q(yace) => [ + q(2237), + q(0), + ], + q(yaeyama) => [ + q(5873), + q(0), + ], + q(yafi) => [ + q(7101), + q(0), + ], + q(yagara) => [ + q(7780), + q(0), + ], + q(yagaria) => [ + q(7623), + q(0), + ], + q(yagnobi) => [ + q(7568), + q(0), + ], + q(yagomi) => [ + q(7621), + q(0), + ], + q(yagua) => [ + q(7563), + q(0), + ], + q(yagwoia) => [ + q(7626), + q(0), + ], + q(yahadian) => [ + q(4815), + q(0), + ], + q(yahang) => [ + q(5776), + q(0), + ], + q(yahuna) => [ + q(7701), + q(0), + ], + q(yaka (central african republic)) => [ + q(0989), + q(0), + ], + q(yaka (congo)) => [ + q(3035), + q(0), + ], + q(yaka (democratic republic of congo)) => [ + q(7565), + q(0), + ], + q(yakaikeke) => [ + q(7652), + q(0), + ], + q(yakama) => [ + q(7570), + q(0), + ], + q(yakan) => [ + q(7649), + q(0), + ], + q(yakha) => [ + q(7587), + q(0), + ], + q(yakoma) => [ + q(7660), + q(0), + ], + q(yakut) => [ + q(0367), + q(0), + ], + q(yala) => [ + q(7584), + q(0), + ], + q(yalahatan) => [ + q(3048), + q(0), + ], + q(yalakalore) => [ + q(7554), + q(0), + ], + q(yalalag zapotec) => [ + q(7919), + q(0), + ], + q(yalarnnga) => [ + q(7670), + q(0), + ], + q(yale) => [ + q(4758), + q(0), + ], + q(yaleba) => [ + q(7662), + q(0), + ], + q(yalunka) => [ + q(7571), + q(0), + ], + q(yamana) => [ + q(7566), + q(0), + ], + q(yamap) => [ + q(7685), + q(0), + ], + q(yamba) => [ + q(7572), + q(0), + ], + q(yambes) => [ + q(7673), + q(0), + ], + q(yambeta) => [ + q(7577), + q(0), + ], + q(yamdena) => [ + q(3118), + q(0), + ], + q(yameo) => [ + q(7676), + q(0), + ], + q(yami) => [ + q(6358), + q(0), + ], + q(yaminahua) => [ + q(7560), + q(0), + ], + q(yamna) => [ + q(7683), + q(0), + ], + q(yamongeri) => [ + q(7677), + q(0), + ], + q(yamphu) => [ + q(7588), + q(0), + ], + q(yan-nhangu) => [ + q(3057), + q(0), + ], + q(yan-nhanu sign language) => [ + q(7630), + q(0), + ], + q(yana) => [ + q(7697), + q(0), + ], + q(yanahuanca pasco quechua) => [ + q(5684), + q(0), + ], + q(yanda) => [ + q(7601), + q(0), + ], + q(yanda dom dogon) => [ + q(2199), + q(0), + ], + q(yandjibara) => [ + q(7551), + q(0), + ], + q(yandruwandha) => [ + q(7692), + q(0), + ], + q(yanesha') => [ + q(0770), + q(0), + ], + q(yang zhuang) => [ + q(7956), + q(0), + ], + q(yangben) => [ + q(7579), + q(0), + ], + q(yangkam) => [ + q(1469), + q(0), + ], + q(yangman) => [ + q(3128), + q(0), + ], + q(yango) => [ + q(7694), + q(0), + ], + q(yangulam) => [ + q(7696), + q(0), + ], + q(yangum dey) => [ + q(7603), + q(0), + ], + q(yangum gel) => [ + q(7620), + q(0), + ], + q(yangum mon) => [ + q(7684), + q(0), + ], + q(yankunytjatjara) => [ + q(3236), + q(0), + ], + q(yanomami) => [ + q(7079), + q(0), + ], + q(yanomamo) => [ + q(2659), + q(0), + ], + q(yansi) => [ + q(7700), + q(0), + ], + q(yanyuwa) => [ + q(3051), + q(0), + ], + q(yao) => [ + q(0473), + q(0), + ], + q(yaosakor asmat) => [ + q(0908), + q(0), + ], + q(yaoure) => [ + q(7723), + q(0), + ], + q(yapese) => [ + q(0474), + q(0), + ], + q(yapunda) => [ + q(7616), + q(0), + ], + q(yaqay) => [ + q(3052), + q(0), + ], + q(yaqui) => [ + q(7574), + q(0), + ], + q(yarawata) => [ + q(7730), + q(0), + ], + q(yardliyawarra) => [ + q(7781), + q(0), + ], + q(yareba) => [ + q(7722), + q(0), + ], + q(yareni zapotec) => [ + q(7794), + q(0), + ], + q(yarluyandi) => [ + q(7731), + q(0), + ], + q(yaroame) => [ + q(7728), + q(0), + ], + q(yarsun) => [ + q(7729), + q(0), + ], + q(yasa) => [ + q(7656), + q(0), + ], + q(yassic) => [ + q(7732), + q(0), + ], + q(yatay) => [ + q(7746), + q(0), + ], + q(yatee zapotec) => [ + q(7949), + q(0), + ], + q(yatzachi zapotec) => [ + q(7809), + q(0), + ], + q(yau (morobe province)) => [ + q(7764), + q(0), + ], + q(yau (sandaun province)) => [ + q(7786), + q(0), + ], + q(yaul) => [ + q(7661), + q(0), + ], + q(yauma) => [ + q(7581), + q(0), + ], + q(yaur) => [ + q(3055), + q(0), + ], + q(yautepec zapotec) => [ + q(7900), + q(0), + ], + q(yauyos quechua) => [ + q(5688), + q(0), + ], + q(yavitero) => [ + q(7769), + q(0), + ], + q(yawa) => [ + q(7768), + q(0), + ], + q(yawalapiti) => [ + q(7580), + q(0), + ], + q(yawanawa) => [ + q(7773), + q(0), + ], + q(yawarawarga) => [ + q(7778), + q(0), + ], + q(yaweyuha) => [ + q(7596), + q(0), + ], + q(yawijibaya) => [ + q(3067), + q(0), + ], + q(yawiyo) => [ + q(7595), + q(0), + ], + q(yawuru) => [ + q(7775), + q(0), + ], + q(yaygir) => [ + q(7550), + q(0), + ], + q(yazgulyam) => [ + q(7567), + q(0), + ], + q(yecuatla totonac) => [ + q(6555), + q(0), + ], + q(yei) => [ + q(3076), + q(0), + ], + q(yekhee) => [ + q(2306), + q(0), + ], + q(yekora) => [ + q(7657), + q(0), + ], + q(yela) => [ + q(7611), + q(0), + ], + q(yele) => [ + q(7663), + q(0), + ], + q(yelmek) => [ + q(3078), + q(0), + ], + q(yelogu) => [ + q(7664), + q(0), + ], + q(yemba) => [ + q(7585), + q(0), + ], + q(yemsa) => [ + q(3130), + q(0), + ], + q(yendang) => [ + q(7699), + q(0), + ], + q(yeni) => [ + q(7609), + q(0), + ], + q(yeniche) => [ + q(7607), + q(0), + ], + q(yerakai) => [ + q(7721), + q(0), + ], + q(yeretuar) => [ + q(2596), + q(0), + ], + q(yerong) => [ + q(7727), + q(0), + ], + q(yerukula) => [ + q(7615), + q(0), + ], + q(yessan-mayo) => [ + q(7740), + q(0), + ], + q(yetfa) => [ + q(7614), + q(0), + ], + q(yevanic) => [ + q(7610), + q(0), + ], + q(yeyi) => [ + q(7617), + q(0), + ], + q(yiddish) => [ + q(0475), + q(0), + ], + q(yidgha) => [ + q(7604), + q(0), + ], + q(yidiny) => [ + q(7634), + q(0), + ], + q(yil) => [ + q(7666), + q(0), + ], + q(yimas) => [ + q(7608), + q(0), + ], + q(yimchungru naga) => [ + q(7638), + q(0), + ], + q(yinbaw karen) => [ + q(3680), + q(0), + ], + q(yinchia) => [ + q(7639), + q(0), + ], + q(yindjibarndi) => [ + q(7635), + q(0), + ], + q(yindjilandji) => [ + q(7637), + q(0), + ], + q(yine) => [ + q(5447), + q(0), + ], + q(yinggarda) => [ + q(7631), + q(0), + ], + q(yinhawangka) => [ + q(7771), + q(0), + ], + q(yiningayi) => [ + q(7619), + q(0), + ], + q(yintale) => [ + q(3684), + q(1), + ], + q(yintale karen) => [ + q(3684), + q(0), + ], + q(yinwum) => [ + q(7782), + q(0), + ], + q(yipma) => [ + q(1605), + q(1), + ], + q(yir yoront) => [ + q(7785), + q(0), + ], + q(yirandali) => [ + q(3928), + q(0), + ], + q(yirrk-mel) => [ + q(7726), + q(0), + ], + q(yis) => [ + q(7643), + q(0), + ], + q(yitha yitha) => [ + q(7498), + q(0), + ], + q(yoba) => [ + q(7702), + q(0), + ], + q(yocoboue dida) => [ + q(2643), + q(0), + ], + q(yogad) => [ + q(7703), + q(0), + ], + q(yoidik) => [ + q(7605), + q(0), + ], + q(yoke) => [ + q(7651), + q(0), + ], + q(yokuts) => [ + q(7705), + q(0), + ], + q(yola) => [ + q(7706), + q(0), + ], + q(yolnu sign language) => [ + q(7624), + q(0), + ], + q(yoloxochitl mixtec) => [ + q(7513), + q(0), + ], + q(yom) => [ + q(5456), + q(0), + ], + q(yombe) => [ + q(7707), + q(0), + ], + q(yonaguni) => [ + q(7704), + q(0), + ], + q(yong) => [ + q(7698), + q(0), + ], + q(yongbei zhuang) => [ + q(7955), + q(0), + ], + q(yongkom) => [ + q(7708), + q(0), + ], + q(yongnan zhuang) => [ + q(7958), + q(0), + ], + q(yopno) => [ + q(7763), + q(0), + ], + q(yora) => [ + q(4566), + q(0), + ], + q(yoron) => [ + q(7710), + q(0), + ], + q(yorta yorta) => [ + q(7556), + q(0), + ], + q(yoruba) => [ + q(0476), + q(0), + ], + q(yosondua mixtec) => [ + q(4460), + q(0), + ], + q(yotti) => [ + q(7709), + q(0), + ], + q(youjiang zhuang) => [ + q(7957), + q(0), + ], + q(youle jinuo) => [ + q(3102), + q(0), + ], + q(younuo bunu) => [ + q(1499), + q(0), + ], + q(yout wam) => [ + q(7745), + q(0), + ], + q(yoy) => [ + q(7711), + q(0), + ], + q(yuanga) => [ + q(5099), + q(0), + ], + q(yucatec maya) => [ + q(7747), + q(1), + ], + q(yucatec maya sign language) => [ + q(4526), + q(0), + ], + q(yucateco) => [ + q(7747), + q(0), + ], + q(yuchi) => [ + q(7749), + q(0), + ], + q(yucuane mixtec) => [ + q(4599), + q(0), + ], + q(yucuna) => [ + q(7599), + q(0), + ], + q(yue chinese) => [ + q(7751), + q(0), + ], + q(yug) => [ + q(7753), + q(0), + ], + q(yugambal) => [ + q(7748), + q(0), + ], + q(yugoslavian sign language) => [ + q(7735), + q(0), + ], + q(yugul) => [ + q(7625), + q(0), + ], + q(yuhup) => [ + q(7561), + q(0), + ], + q(yuki) => [ + q(7756), + q(0), + ], + q(yukpa) => [ + q(7760), + q(0), + ], + q(yukuben) => [ + q(7591), + q(0), + ], + q(yulu) => [ + q(7757), + q(0), + ], + q(yupik languages) => [ + q(0477), + q(0), + ], + q(yuqui) => [ + q(7761), + q(0), + ], + q(yuracare) => [ + q(7767), + q(0), + ], + q(yurats) => [ + q(5849), + q(0), + ], + q(yurok) => [ + q(7762), + q(0), + ], + q(yuru) => [ + q(3929), + q(0), + ], + q(yuruti) => [ + q(7754), + q(0), + ], + q(yutanduchi mixtec) => [ + q(4108), + q(0), + ], + q(yuwana) => [ + q(7578), + q(0), + ], + q(yuyu) => [ + q(7783), + q(0), + ], + q(ywom) => [ + q(2479), + q(0), + ], + q(zaachila zapotec) => [ + q(7948), + q(0), + ], + q(zabana) => [ + q(3383), + q(0), + ], + q(zacatepec chatino) => [ + q(1897), + q(0), + ], + q(zacatlan-ahuacatlan-tepetzintla nahuatl) => [ + q(4861), + q(0), + ], + q(zaghawa) => [ + q(7796), + q(0), + ], + q(zaiwa) => [ + q(0911), + q(0), + ], + q(zakhring) => [ + q(7852), + q(0), + ], + q(zambian sign language) => [ + q(7934), + q(0), + ], + q(zan gula) => [ + q(7887), + q(0), + ], + q(zanaki) => [ + q(7800), + q(0), + ], + q(zande (individual language)) => [ + q(7888), + q(0), + ], + q(zande languages) => [ + q(0483), + q(0), + ], + q(zangskari) => [ + q(7808), + q(0), + ], + q(zangwal) => [ + q(7797), + q(0), + ], + q(zaniza zapotec) => [ + q(7921), + q(0), + ], + q(zaparo) => [ + q(7929), + q(0), + ], + q(zapotec) => [ + q(0478), + q(0), + ], + q(zaramo) => [ + q(7799), + q(0), + ], + q(zari) => [ + q(7813), + q(0), + ], + q(zarma) => [ + q(2056), + q(0), + ], + q(zarphatic) => [ + q(7930), + q(0), + ], + q(zauzou) => [ + q(7801), + q(0), + ], + q(zay) => [ + q(7954), + q(0), + ], + q(zayein karen) => [ + q(3719), + q(0), + ], + q(zayse-zergulla) => [ + q(7812), + q(0), + ], + q(zaysete) => [ + q(7812), + q(1), + ], + q(zaza) => [ + q(0487), + q(0), + ], + q(zazaki) => [ + q(0487), + q(5), + ], + q(zazao) => [ + q(3046), + q(0), + ], + q(zeem) => [ + q(7950), + q(0), + ], + q(zeeuws) => [ + q(7821), + q(0), + ], + q(zemba) => [ + q(2020), + q(0), + ], + q(zeme naga) => [ + q(5175), + q(0), + ], + q(zemgalian) => [ + q(7558), + q(0), + ], + q(zenag) => [ + q(7822), + q(0), + ], + q(zenaga) => [ + q(0480), + q(0), + ], + q(zenzontepec chatino) => [ + q(1929), + q(0), + ], + q(zerenkel) => [ + q(7928), + q(0), + ], + q(zhaba) => [ + q(7829), + q(0), + ], + q(zhang-zhung) => [ + q(7557), + q(0), + ], + q(zhire) => [ + q(7831), + q(0), + ], + q(zhoa) => [ + q(7833), + q(0), + ], + q(zhuang) => [ + q(0482), + q(0), + ], + q(zia) => [ + q(7834), + q(0), + ], + q(zialo) => [ + q(7837), + q(0), + ], + q(zigula) => [ + q(7841), + q(0), + ], + q(zimakani) => [ + q(7836), + q(0), + ], + q(zimba) => [ + q(7862), + q(0), + ], + q(zimbabwe sign language) => [ + q(7835), + q(0), + ], + q(zinza) => [ + q(7839), + q(0), + ], + q(zire) => [ + q(6030), + q(0), + ], + q(ziriya) => [ + q(7840), + q(0), + ], + q(zizilivakan) => [ + q(7842), + q(0), + ], + q(zo'e) => [ + q(5624), + q(0), + ], + q(zokhuo) => [ + q(7789), + q(0), + ], + q(zoogocho zapotec) => [ + q(7915), + q(0), + ], + q(zoroastrian dari) => [ + q(2441), + q(0), + ], + q(zorop) => [ + q(7101), + q(1), + ], + q(zotung chin) => [ + q(1931), + q(0), + ], + q(zou) => [ + q(7894), + q(0), + ], + q(zulgo-gemzek) => [ + q(2568), + q(0), + ], + q(zulu) => [ + q(0484), + q(0), + ], + q(zumaya) => [ + q(7953), + q(0), + ], + q(zumbun) => [ + q(3116), + q(0), + ], + q(zuni) => [ + q(0485), + q(0), + ], + q(zuojiang zhuang) => [ + q(7960), + q(0), + ], + q(zyphe chin) => [ + q(7959), + q(0), + ], +}; + +$Locale::Codes::Data{'language'}{'code2id'} = { + q(alpha-2) => { + q(aa) => [ + q(0001), + q(0), + ], + q(ab) => [ + q(0002), + q(0), + ], + q(ae) => [ + q(0034), + q(0), + ], + q(af) => [ + q(0009), + q(0), + ], + q(ak) => [ + q(0011), + q(0), + ], + q(am) => [ + q(0017), + q(0), + ], + q(an) => [ + q(0023), + q(0), + ], + q(ar) => [ + q(0021), + q(0), + ], + q(as) => [ + q(0029), + q(0), + ], + q(av) => [ + q(0033), + q(0), + ], + q(ay) => [ + q(0036), + q(0), + ], + q(az) => [ + q(0037), + q(0), + ], + q(ba) => [ + q(0040), + q(0), + ], + q(be) => [ + q(0048), + q(0), + ], + q(bg) => [ + q(0065), + q(0), + ], + q(bh) => [ + q(0053), + q(0), + ], + q(bi) => [ + q(0056), + q(0), + ], + q(bm) => [ + q(0042), + q(0), + ], + q(bn) => [ + q(0050), + q(0), + ], + q(bo) => [ + q(0428), + q(0), + ], + q(br) => [ + q(0061), + q(0), + ], + q(bs) => [ + q(0059), + q(0), + ], + q(ca) => [ + q(0071), + q(0), + ], + q(ce) => [ + q(0077), + q(0), + ], + q(ch) => [ + q(0075), + q(0), + ], + q(co) => [ + q(0093), + q(0), + ], + q(cr) => [ + q(0097), + q(0), + ], + q(cs) => [ + q(0102), + q(0), + ], + q(cu) => [ + q(0086), + q(0), + ], + q(cv) => [ + q(0087), + q(0), + ], + q(cy) => [ + q(0467), + q(0), + ], + q(da) => [ + q(0104), + q(0), + ], + q(de) => [ + q(0151), + q(0), + ], + q(dv) => [ + q(0111), + q(1), + ], + q(dz) => [ + q(0119), + q(0), + ], + q(ee) => [ + q(0128), + q(0), + ], + q(el) => [ + q(0165), + q(2), + ], + q(en) => [ + q(0124), + q(0), + ], + q(eo) => [ + q(0126), + q(0), + ], + q(es) => [ + q(0402), + q(0), + ], + q(et) => [ + q(0127), + q(0), + ], + q(eu) => [ + q(0044), + q(0), + ], + q(fa) => [ + q(0343), + q(0), + ], + q(ff) => [ + q(0144), + q(0), + ], + q(fi) => [ + q(0135), + q(0), + ], + q(fj) => [ + q(0133), + q(0), + ], + q(fo) => [ + q(0131), + q(0), + ], + q(fr) => [ + q(0138), + q(0), + ], + q(fy) => [ + q(0143), + q(0), + ], + q(ga) => [ + q(0155), + q(0), + ], + q(gd) => [ + q(0154), + q(1), + ], + q(gl) => [ + q(0156), + q(0), + ], + q(gn) => [ + q(0166), + q(0), + ], + q(gu) => [ + q(0168), + q(0), + ], + q(gv) => [ + q(0157), + q(0), + ], + q(ha) => [ + q(0172), + q(0), + ], + q(he) => [ + q(0174), + q(0), + ], + q(hi) => [ + q(0178), + q(0), + ], + q(ho) => [ + q(0181), + q(0), + ], + q(hr) => [ + q(0182), + q(0), + ], + q(ht) => [ + q(0171), + q(0), + ], + q(hu) => [ + q(0184), + q(0), + ], + q(hy) => [ + q(0024), + q(0), + ], + q(hz) => [ + q(0175), + q(0), + ], + q(ia) => [ + q(0195), + q(0), + ], + q(id) => [ + q(0197), + q(0), + ], + q(ie) => [ + q(0193), + q(0), + ], + q(ig) => [ + q(0187), + q(0), + ], + q(ii) => [ + q(0190), + q(0), + ], + q(ik) => [ + q(0200), + q(0), + ], + q(io) => [ + q(0189), + q(0), + ], + q(is) => [ + q(0188), + q(0), + ], + q(it) => [ + q(0203), + q(0), + ], + q(iu) => [ + q(0192), + q(0), + ], + q(ja) => [ + q(0206), + q(0), + ], + q(jv) => [ + q(0204), + q(0), + ], + q(ka) => [ + q(0150), + q(0), + ], + q(kg) => [ + q(0231), + q(0), + ], + q(ki) => [ + q(0225), + q(0), + ], + q(kj) => [ + q(0239), + q(0), + ], + q(kk) => [ + q(0219), + q(0), + ], + q(kl) => [ + q(0212), + q(0), + ], + q(km) => [ + q(0223), + q(0), + ], + q(kn) => [ + q(0214), + q(0), + ], + q(ko) => [ + q(0232), + q(0), + ], + q(kr) => [ + q(0217), + q(0), + ], + q(ks) => [ + q(0216), + q(0), + ], + q(ku) => [ + q(0241), + q(0), + ], + q(kv) => [ + q(0230), + q(0), + ], + q(kw) => [ + q(0092), + q(0), + ], + q(ky) => [ + q(0227), + q(0), + ], + q(la) => [ + q(0247), + q(0), + ], + q(lb) => [ + q(0255), + q(0), + ], + q(lg) => [ + q(0258), + q(0), + ], + q(li) => [ + q(0250), + q(0), + ], + q(ln) => [ + q(0251), + q(0), + ], + q(lo) => [ + q(0246), + q(0), + ], + q(lt) => [ + q(0252), + q(0), + ], + q(lu) => [ + q(0257), + q(0), + ], + q(lv) => [ + q(0248), + q(0), + ], + q(mg) => [ + q(0284), + q(0), + ], + q(mh) => [ + q(0266), + q(0), + ], + q(mi) => [ + q(0271), + q(0), + ], + q(mk) => [ + q(0263), + q(0), + ], + q(ml) => [ + q(0269), + q(0), + ], + q(mn) => [ + q(0290), + q(0), + ], + q(mr) => [ + q(0273), + q(0), + ], + q(ms) => [ + q(0275), + q(1), + ], + q(mt) => [ + q(0285), + q(0), + ], + q(my) => [ + q(0066), + q(0), + ], + q(na) => [ + q(0302), + q(0), + ], + q(nb) => [ + q(0314), + q(1), + ], + q(nd) => [ + q(0305), + q(1), + ], + q(ne) => [ + q(0308), + q(1), + ], + q(ng) => [ + q(0306), + q(0), + ], + q(nl) => [ + q(0117), + q(0), + ], + q(nn) => [ + q(0313), + q(0), + ], + q(no) => [ + q(0317), + q(0), + ], + q(nr) => [ + q(0304), + q(1), + ], + q(nv) => [ + q(0303), + q(0), + ], + q(ny) => [ + q(0322), + q(2), + ], + q(oc) => [ + q(0327), + q(0), + ], + q(oj) => [ + q(0328), + q(0), + ], + q(om) => [ + q(0330), + q(0), + ], + q(or) => [ + q(0329), + q(1), + ], + q(os) => [ + q(0332), + q(0), + ], + q(pa) => [ + q(0339), + q(0), + ], + q(pi) => [ + q(0346), + q(0), + ], + q(pl) => [ + q(0347), + q(0), + ], + q(ps) => [ + q(0352), + q(0), + ], + q(pt) => [ + q(0349), + q(0), + ], + q(qu) => [ + q(0354), + q(0), + ], + q(rm) => [ + q(0359), + q(0), + ], + q(rn) => [ + q(0362), + q(0), + ], + q(ro) => [ + q(0361), + q(0), + ], + q(ru) => [ + q(0364), + q(0), + ], + q(rw) => [ + q(0226), + q(0), + ], + q(sa) => [ + q(0371), + q(0), + ], + q(sc) => [ + q(0403), + q(0), + ], + q(sd) => [ + q(0396), + q(0), + ], + q(se) => [ + q(0389), + q(0), + ], + q(sg) => [ + q(0366), + q(0), + ], + q(sh) => [ + q(0538), + q(0), + ], + q(si) => [ + q(0382), + q(0), + ], + q(sk) => [ + q(0386), + q(0), + ], + q(sl) => [ + q(0387), + q(0), + ], + q(sm) => [ + q(0393), + q(0), + ], + q(sn) => [ + q(0395), + q(0), + ], + q(so) => [ + q(0399), + q(0), + ], + q(sq) => [ + q(0013), + q(0), + ], + q(sr) => [ + q(0405), + q(0), + ], + q(ss) => [ + q(0408), + q(0), + ], + q(st) => [ + q(0401), + q(1), + ], + q(su) => [ + q(0410), + q(0), + ], + q(sv) => [ + q(0414), + q(0), + ], + q(sw) => [ + q(0413), + q(1), + ], + q(ta) => [ + q(0419), + q(0), + ], + q(te) => [ + q(0421), + q(0), + ], + q(tg) => [ + q(0425), + q(0), + ], + q(th) => [ + q(0427), + q(0), + ], + q(ti) => [ + q(0430), + q(0), + ], + q(tk) => [ + q(0442), + q(0), + ], + q(tl) => [ + q(0426), + q(0), + ], + q(tn) => [ + q(0440), + q(0), + ], + q(to) => [ + q(0437), + q(0), + ], + q(tr) => [ + q(0445), + q(0), + ], + q(ts) => [ + q(0441), + q(0), + ], + q(tt) => [ + q(0420), + q(0), + ], + q(tw) => [ + q(0448), + q(0), + ], + q(ty) => [ + q(0417), + q(0), + ], + q(ug) => [ + q(0452), + q(0), + ], + q(uk) => [ + q(0453), + q(0), + ], + q(ur) => [ + q(0456), + q(0), + ], + q(uz) => [ + q(0457), + q(0), + ], + q(ve) => [ + q(0459), + q(0), + ], + q(vi) => [ + q(0460), + q(0), + ], + q(vo) => [ + q(0461), + q(0), + ], + q(wa) => [ + q(0469), + q(0), + ], + q(wo) => [ + q(0470), + q(0), + ], + q(xh) => [ + q(0472), + q(0), + ], + q(yi) => [ + q(0475), + q(0), + ], + q(yo) => [ + q(0476), + q(0), + ], + q(za) => [ + q(0482), + q(0), + ], + q(zh) => [ + q(0079), + q(0), + ], + q(zu) => [ + q(0484), + q(0), + ], + }, + q(alpha-3) => { + q(aaa) => [ + q(0539), + q(0), + ], + q(aab) => [ + q(0540), + q(0), + ], + q(aac) => [ + q(0541), + q(0), + ], + q(aad) => [ + q(0542), + q(0), + ], + q(aae) => [ + q(0543), + q(0), + ], + q(aaf) => [ + q(0544), + q(0), + ], + q(aag) => [ + q(0545), + q(0), + ], + q(aah) => [ + q(0546), + q(0), + ], + q(aai) => [ + q(0547), + q(0), + ], + q(aak) => [ + q(0548), + q(0), + ], + q(aal) => [ + q(0549), + q(0), + ], + q(aan) => [ + q(0550), + q(0), + ], + q(aao) => [ + q(0551), + q(0), + ], + q(aap) => [ + q(0552), + q(0), + ], + q(aaq) => [ + q(0553), + q(0), + ], + q(aar) => [ + q(0001), + q(0), + ], + q(aas) => [ + q(0554), + q(0), + ], + q(aat) => [ + q(0555), + q(0), + ], + q(aau) => [ + q(0556), + q(0), + ], + q(aav) => [ + q(0488), + q(0), + ], + q(aaw) => [ + q(0557), + q(0), + ], + q(aax) => [ + q(0558), + q(0), + ], + q(aaz) => [ + q(0559), + q(0), + ], + q(aba) => [ + q(0560), + q(0), + ], + q(abb) => [ + q(0561), + q(0), + ], + q(abc) => [ + q(0562), + q(0), + ], + q(abd) => [ + q(0563), + q(0), + ], + q(abe) => [ + q(0564), + q(0), + ], + q(abf) => [ + q(0565), + q(0), + ], + q(abg) => [ + q(0566), + q(0), + ], + q(abh) => [ + q(0567), + q(0), + ], + q(abi) => [ + q(0568), + q(0), + ], + q(abj) => [ + q(0569), + q(0), + ], + q(abk) => [ + q(0002), + q(0), + ], + q(abl) => [ + q(0570), + q(0), + ], + q(abm) => [ + q(0571), + q(0), + ], + q(abn) => [ + q(0572), + q(0), + ], + q(abo) => [ + q(0573), + q(0), + ], + q(abp) => [ + q(0574), + q(0), + ], + q(abq) => [ + q(0575), + q(0), + ], + q(abr) => [ + q(0576), + q(0), + ], + q(abs) => [ + q(0577), + q(0), + ], + q(abt) => [ + q(0578), + q(0), + ], + q(abu) => [ + q(0579), + q(0), + ], + q(abv) => [ + q(0580), + q(0), + ], + q(abw) => [ + q(0581), + q(0), + ], + q(abx) => [ + q(0582), + q(0), + ], + q(aby) => [ + q(0583), + q(0), + ], + q(abz) => [ + q(0584), + q(0), + ], + q(aca) => [ + q(0585), + q(0), + ], + q(acb) => [ + q(0586), + q(0), + ], + q(acd) => [ + q(0587), + q(0), + ], + q(ace) => [ + q(0003), + q(0), + ], + q(acf) => [ + q(0588), + q(0), + ], + q(ach) => [ + q(0004), + q(0), + ], + q(aci) => [ + q(0589), + q(0), + ], + q(ack) => [ + q(0590), + q(0), + ], + q(acl) => [ + q(0591), + q(0), + ], + q(acm) => [ + q(0592), + q(0), + ], + q(acn) => [ + q(0593), + q(0), + ], + q(acp) => [ + q(0594), + q(0), + ], + q(acq) => [ + q(0595), + q(0), + ], + q(acr) => [ + q(0596), + q(0), + ], + q(acs) => [ + q(0597), + q(0), + ], + q(act) => [ + q(0598), + q(0), + ], + q(acu) => [ + q(0599), + q(0), + ], + q(acv) => [ + q(0600), + q(0), + ], + q(acw) => [ + q(0601), + q(0), + ], + q(acx) => [ + q(0602), + q(0), + ], + q(acy) => [ + q(0603), + q(0), + ], + q(acz) => [ + q(0604), + q(0), + ], + q(ada) => [ + q(0005), + q(0), + ], + q(adb) => [ + q(0605), + q(0), + ], + q(add) => [ + q(0606), + q(0), + ], + q(ade) => [ + q(0607), + q(0), + ], + q(adf) => [ + q(0608), + q(0), + ], + q(adg) => [ + q(0609), + q(0), + ], + q(adh) => [ + q(0610), + q(0), + ], + q(adi) => [ + q(0611), + q(0), + ], + q(adj) => [ + q(0612), + q(0), + ], + q(adl) => [ + q(0613), + q(0), + ], + q(adn) => [ + q(0614), + q(0), + ], + q(ado) => [ + q(0615), + q(0), + ], + q(adq) => [ + q(0616), + q(0), + ], + q(adr) => [ + q(0617), + q(0), + ], + q(ads) => [ + q(0618), + q(0), + ], + q(adt) => [ + q(0619), + q(0), + ], + q(adu) => [ + q(0620), + q(0), + ], + q(adw) => [ + q(0621), + q(0), + ], + q(adx) => [ + q(0622), + q(0), + ], + q(ady) => [ + q(0006), + q(0), + ], + q(adz) => [ + q(0623), + q(0), + ], + q(aea) => [ + q(0624), + q(0), + ], + q(aeb) => [ + q(0625), + q(0), + ], + q(aec) => [ + q(0626), + q(0), + ], + q(aed) => [ + q(0627), + q(0), + ], + q(aee) => [ + q(0628), + q(0), + ], + q(aek) => [ + q(0629), + q(0), + ], + q(ael) => [ + q(0630), + q(0), + ], + q(aem) => [ + q(0631), + q(0), + ], + q(aen) => [ + q(0632), + q(0), + ], + q(aeq) => [ + q(0633), + q(0), + ], + q(aer) => [ + q(0634), + q(0), + ], + q(aes) => [ + q(0635), + q(0), + ], + q(aeu) => [ + q(0636), + q(0), + ], + q(aew) => [ + q(0637), + q(0), + ], + q(aey) => [ + q(0638), + q(0), + ], + q(aez) => [ + q(0639), + q(0), + ], + q(afa) => [ + q(0007), + q(0), + ], + q(afb) => [ + q(0640), + q(0), + ], + q(afd) => [ + q(0641), + q(0), + ], + q(afe) => [ + q(0642), + q(0), + ], + q(afg) => [ + q(0643), + q(0), + ], + q(afh) => [ + q(0008), + q(0), + ], + q(afi) => [ + q(0644), + q(0), + ], + q(afk) => [ + q(0645), + q(0), + ], + q(afn) => [ + q(0646), + q(0), + ], + q(afo) => [ + q(0647), + q(0), + ], + q(afp) => [ + q(0648), + q(0), + ], + q(afr) => [ + q(0009), + q(0), + ], + q(afs) => [ + q(0649), + q(0), + ], + q(aft) => [ + q(0650), + q(0), + ], + q(afu) => [ + q(0651), + q(0), + ], + q(afz) => [ + q(0652), + q(0), + ], + q(aga) => [ + q(0653), + q(0), + ], + q(agb) => [ + q(0654), + q(0), + ], + q(agc) => [ + q(0655), + q(0), + ], + q(agd) => [ + q(0656), + q(0), + ], + q(age) => [ + q(0657), + q(0), + ], + q(agf) => [ + q(0658), + q(0), + ], + q(agg) => [ + q(0659), + q(0), + ], + q(agh) => [ + q(0660), + q(0), + ], + q(agi) => [ + q(0661), + q(0), + ], + q(agj) => [ + q(0662), + q(0), + ], + q(agk) => [ + q(0663), + q(0), + ], + q(agl) => [ + q(0664), + q(0), + ], + q(agm) => [ + q(0665), + q(0), + ], + q(agn) => [ + q(0666), + q(0), + ], + q(ago) => [ + q(0667), + q(0), + ], + q(agq) => [ + q(0668), + q(0), + ], + q(agr) => [ + q(0669), + q(0), + ], + q(ags) => [ + q(0670), + q(0), + ], + q(agt) => [ + q(0671), + q(0), + ], + q(agu) => [ + q(0672), + q(0), + ], + q(agv) => [ + q(0673), + q(0), + ], + q(agw) => [ + q(0674), + q(0), + ], + q(agx) => [ + q(0675), + q(0), + ], + q(agy) => [ + q(0676), + q(0), + ], + q(agz) => [ + q(0677), + q(0), + ], + q(aha) => [ + q(0678), + q(0), + ], + q(ahb) => [ + q(0679), + q(0), + ], + q(ahg) => [ + q(0680), + q(0), + ], + q(ahh) => [ + q(0681), + q(0), + ], + q(ahi) => [ + q(0682), + q(0), + ], + q(ahk) => [ + q(0683), + q(0), + ], + q(ahl) => [ + q(0684), + q(0), + ], + q(ahm) => [ + q(0685), + q(0), + ], + q(ahn) => [ + q(0686), + q(0), + ], + q(aho) => [ + q(0687), + q(0), + ], + q(ahp) => [ + q(0688), + q(0), + ], + q(ahr) => [ + q(0689), + q(0), + ], + q(ahs) => [ + q(0690), + q(0), + ], + q(aht) => [ + q(0691), + q(0), + ], + q(aia) => [ + q(0692), + q(0), + ], + q(aib) => [ + q(0693), + q(0), + ], + q(aic) => [ + q(0694), + q(0), + ], + q(aid) => [ + q(0695), + q(0), + ], + q(aie) => [ + q(0696), + q(0), + ], + q(aif) => [ + q(0697), + q(0), + ], + q(aig) => [ + q(0698), + q(0), + ], + q(aih) => [ + q(0699), + q(0), + ], + q(aii) => [ + q(0700), + q(0), + ], + q(aij) => [ + q(0701), + q(0), + ], + q(aik) => [ + q(0702), + q(0), + ], + q(ail) => [ + q(0703), + q(0), + ], + q(aim) => [ + q(0704), + q(0), + ], + q(ain) => [ + q(0010), + q(1), + ], + q(aio) => [ + q(0705), + q(0), + ], + q(aip) => [ + q(0706), + q(0), + ], + q(aiq) => [ + q(0707), + q(0), + ], + q(air) => [ + q(0708), + q(0), + ], + q(ais) => [ + q(0709), + q(0), + ], + q(ait) => [ + q(0710), + q(0), + ], + q(aiw) => [ + q(0711), + q(0), + ], + q(aix) => [ + q(0712), + q(0), + ], + q(aiy) => [ + q(0713), + q(0), + ], + q(aja) => [ + q(0714), + q(0), + ], + q(ajg) => [ + q(0715), + q(0), + ], + q(aji) => [ + q(0716), + q(0), + ], + q(ajn) => [ + q(0717), + q(0), + ], + q(ajp) => [ + q(0718), + q(0), + ], + q(ajt) => [ + q(0719), + q(0), + ], + q(aju) => [ + q(0720), + q(0), + ], + q(ajw) => [ + q(0721), + q(0), + ], + q(ajz) => [ + q(0722), + q(0), + ], + q(aka) => [ + q(0011), + q(0), + ], + q(akb) => [ + q(0723), + q(0), + ], + q(akc) => [ + q(0724), + q(0), + ], + q(akd) => [ + q(0725), + q(0), + ], + q(ake) => [ + q(0726), + q(0), + ], + q(akf) => [ + q(0727), + q(0), + ], + q(akg) => [ + q(0728), + q(0), + ], + q(akh) => [ + q(0729), + q(0), + ], + q(aki) => [ + q(0730), + q(0), + ], + q(akj) => [ + q(0731), + q(0), + ], + q(akk) => [ + q(0012), + q(0), + ], + q(akl) => [ + q(0732), + q(0), + ], + q(akm) => [ + q(0733), + q(0), + ], + q(ako) => [ + q(0734), + q(0), + ], + q(akp) => [ + q(0735), + q(0), + ], + q(akq) => [ + q(0736), + q(0), + ], + q(akr) => [ + q(0737), + q(0), + ], + q(aks) => [ + q(0738), + q(0), + ], + q(akt) => [ + q(0739), + q(0), + ], + q(aku) => [ + q(0740), + q(0), + ], + q(akv) => [ + q(0741), + q(0), + ], + q(akw) => [ + q(0742), + q(0), + ], + q(akx) => [ + q(0743), + q(0), + ], + q(aky) => [ + q(0744), + q(0), + ], + q(akz) => [ + q(0745), + q(0), + ], + q(ala) => [ + q(0746), + q(0), + ], + q(alb) => [ + q(0013), + q(0), + ], + q(alc) => [ + q(0747), + q(0), + ], + q(ald) => [ + q(0748), + q(0), + ], + q(ale) => [ + q(0014), + q(0), + ], + q(alf) => [ + q(0749), + q(0), + ], + q(alg) => [ + q(0015), + q(0), + ], + q(alh) => [ + q(0750), + q(0), + ], + q(ali) => [ + q(0751), + q(0), + ], + q(alj) => [ + q(0752), + q(0), + ], + q(alk) => [ + q(0753), + q(0), + ], + q(all) => [ + q(0754), + q(0), + ], + q(alm) => [ + q(0755), + q(0), + ], + q(aln) => [ + q(0756), + q(0), + ], + q(alo) => [ + q(0757), + q(0), + ], + q(alp) => [ + q(0758), + q(0), + ], + q(alq) => [ + q(0759), + q(0), + ], + q(alr) => [ + q(0760), + q(0), + ], + q(als) => [ + q(0761), + q(0), + ], + q(alt) => [ + q(0016), + q(0), + ], + q(alu) => [ + q(0762), + q(0), + ], + q(alv) => [ + q(0489), + q(0), + ], + q(alw) => [ + q(0763), + q(0), + ], + q(alx) => [ + q(0764), + q(0), + ], + q(aly) => [ + q(0765), + q(0), + ], + q(alz) => [ + q(0766), + q(0), + ], + q(ama) => [ + q(0767), + q(0), + ], + q(amb) => [ + q(0768), + q(0), + ], + q(amc) => [ + q(0769), + q(0), + ], + q(ame) => [ + q(0770), + q(0), + ], + q(amf) => [ + q(0771), + q(0), + ], + q(amg) => [ + q(0772), + q(0), + ], + q(amh) => [ + q(0017), + q(0), + ], + q(ami) => [ + q(0773), + q(0), + ], + q(amj) => [ + q(0774), + q(0), + ], + q(amk) => [ + q(0775), + q(0), + ], + q(aml) => [ + q(0776), + q(0), + ], + q(amm) => [ + q(0777), + q(0), + ], + q(amn) => [ + q(0778), + q(0), + ], + q(amo) => [ + q(0779), + q(0), + ], + q(amp) => [ + q(0780), + q(0), + ], + q(amq) => [ + q(0781), + q(0), + ], + q(amr) => [ + q(0782), + q(0), + ], + q(ams) => [ + q(0783), + q(0), + ], + q(amt) => [ + q(0784), + q(0), + ], + q(amu) => [ + q(0785), + q(0), + ], + q(amv) => [ + q(0786), + q(0), + ], + q(amw) => [ + q(0787), + q(0), + ], + q(amx) => [ + q(0788), + q(0), + ], + q(amy) => [ + q(0789), + q(0), + ], + q(amz) => [ + q(0790), + q(0), + ], + q(ana) => [ + q(0791), + q(0), + ], + q(anb) => [ + q(0792), + q(0), + ], + q(anc) => [ + q(0793), + q(0), + ], + q(and) => [ + q(0794), + q(0), + ], + q(ane) => [ + q(0795), + q(0), + ], + q(anf) => [ + q(0796), + q(0), + ], + q(ang) => [ + q(0018), + q(1), + ], + q(anh) => [ + q(0797), + q(0), + ], + q(ani) => [ + q(0798), + q(0), + ], + q(anj) => [ + q(0799), + q(0), + ], + q(ank) => [ + q(0800), + q(0), + ], + q(anl) => [ + q(0801), + q(0), + ], + q(anm) => [ + q(0802), + q(0), + ], + q(ann) => [ + q(0803), + q(0), + ], + q(ano) => [ + q(0804), + q(0), + ], + q(anp) => [ + q(0019), + q(0), + ], + q(anq) => [ + q(0805), + q(0), + ], + q(anr) => [ + q(0806), + q(0), + ], + q(ans) => [ + q(0807), + q(0), + ], + q(ant) => [ + q(0808), + q(0), + ], + q(anu) => [ + q(0809), + q(0), + ], + q(anv) => [ + q(0810), + q(0), + ], + q(anw) => [ + q(0811), + q(0), + ], + q(anx) => [ + q(0812), + q(0), + ], + q(any) => [ + q(0813), + q(0), + ], + q(anz) => [ + q(0814), + q(0), + ], + q(aoa) => [ + q(0815), + q(0), + ], + q(aob) => [ + q(0816), + q(0), + ], + q(aoc) => [ + q(0817), + q(0), + ], + q(aod) => [ + q(0818), + q(0), + ], + q(aoe) => [ + q(0819), + q(0), + ], + q(aof) => [ + q(0820), + q(0), + ], + q(aog) => [ + q(0821), + q(0), + ], + q(aoh) => [ + q(0822), + q(0), + ], + q(aoi) => [ + q(0823), + q(0), + ], + q(aoj) => [ + q(0824), + q(0), + ], + q(aok) => [ + q(0825), + q(0), + ], + q(aol) => [ + q(0826), + q(0), + ], + q(aom) => [ + q(0827), + q(0), + ], + q(aon) => [ + q(0828), + q(0), + ], + q(aor) => [ + q(0829), + q(0), + ], + q(aos) => [ + q(0830), + q(0), + ], + q(aot) => [ + q(0831), + q(0), + ], + q(aou) => [ + q(0832), + q(0), + ], + q(aox) => [ + q(0833), + q(0), + ], + q(aoz) => [ + q(0834), + q(0), + ], + q(apa) => [ + q(0020), + q(0), + ], + q(apb) => [ + q(0835), + q(0), + ], + q(apc) => [ + q(0836), + q(0), + ], + q(apd) => [ + q(0837), + q(0), + ], + q(ape) => [ + q(0838), + q(0), + ], + q(apf) => [ + q(0839), + q(0), + ], + q(apg) => [ + q(0840), + q(0), + ], + q(aph) => [ + q(0841), + q(0), + ], + q(api) => [ + q(0842), + q(0), + ], + q(apj) => [ + q(0843), + q(0), + ], + q(apk) => [ + q(0844), + q(0), + ], + q(apl) => [ + q(0845), + q(0), + ], + q(apm) => [ + q(0846), + q(0), + ], + q(apn) => [ + q(0847), + q(0), + ], + q(apo) => [ + q(0848), + q(0), + ], + q(app) => [ + q(0849), + q(0), + ], + q(apq) => [ + q(0850), + q(0), + ], + q(apr) => [ + q(0851), + q(0), + ], + q(aps) => [ + q(0852), + q(0), + ], + q(apt) => [ + q(0853), + q(0), + ], + q(apu) => [ + q(0854), + q(0), + ], + q(apv) => [ + q(0855), + q(0), + ], + q(apw) => [ + q(0856), + q(0), + ], + q(apx) => [ + q(0857), + q(0), + ], + q(apy) => [ + q(0858), + q(0), + ], + q(apz) => [ + q(0859), + q(0), + ], + q(aqa) => [ + q(0490), + q(0), + ], + q(aqc) => [ + q(0860), + q(0), + ], + q(aqd) => [ + q(0861), + q(0), + ], + q(aqg) => [ + q(0862), + q(0), + ], + q(aql) => [ + q(0491), + q(0), + ], + q(aqm) => [ + q(0863), + q(0), + ], + q(aqn) => [ + q(0864), + q(0), + ], + q(aqp) => [ + q(0865), + q(0), + ], + q(aqr) => [ + q(0866), + q(0), + ], + q(aqt) => [ + q(0867), + q(0), + ], + q(aqz) => [ + q(0868), + q(0), + ], + q(ara) => [ + q(0021), + q(0), + ], + q(arb) => [ + q(0869), + q(0), + ], + q(arc) => [ + q(0022), + q(0), + ], + q(ard) => [ + q(0870), + q(0), + ], + q(are) => [ + q(0871), + q(0), + ], + q(arg) => [ + q(0023), + q(0), + ], + q(arh) => [ + q(0872), + q(0), + ], + q(ari) => [ + q(0873), + q(0), + ], + q(arj) => [ + q(0874), + q(0), + ], + q(ark) => [ + q(0875), + q(0), + ], + q(arl) => [ + q(0876), + q(0), + ], + q(arm) => [ + q(0024), + q(0), + ], + q(arn) => [ + q(0025), + q(0), + ], + q(aro) => [ + q(0877), + q(0), + ], + q(arp) => [ + q(0026), + q(0), + ], + q(arq) => [ + q(0878), + q(0), + ], + q(arr) => [ + q(0879), + q(0), + ], + q(ars) => [ + q(0880), + q(0), + ], + q(art) => [ + q(0027), + q(0), + ], + q(aru) => [ + q(0881), + q(0), + ], + q(arv) => [ + q(0882), + q(0), + ], + q(arw) => [ + q(0028), + q(0), + ], + q(arx) => [ + q(0883), + q(0), + ], + q(ary) => [ + q(0884), + q(0), + ], + q(arz) => [ + q(0885), + q(0), + ], + q(asa) => [ + q(0886), + q(0), + ], + q(asb) => [ + q(0887), + q(0), + ], + q(asc) => [ + q(0888), + q(0), + ], + q(asd) => [ + q(0889), + q(0), + ], + q(ase) => [ + q(0890), + q(0), + ], + q(asf) => [ + q(0891), + q(0), + ], + q(asg) => [ + q(0892), + q(0), + ], + q(ash) => [ + q(0893), + q(0), + ], + q(asi) => [ + q(0894), + q(0), + ], + q(asj) => [ + q(0895), + q(0), + ], + q(ask) => [ + q(0896), + q(0), + ], + q(asl) => [ + q(0897), + q(0), + ], + q(asm) => [ + q(0029), + q(0), + ], + q(asn) => [ + q(0898), + q(0), + ], + q(aso) => [ + q(0899), + q(0), + ], + q(asp) => [ + q(0900), + q(0), + ], + q(asq) => [ + q(0901), + q(0), + ], + q(asr) => [ + q(0902), + q(0), + ], + q(ass) => [ + q(0903), + q(0), + ], + q(ast) => [ + q(0030), + q(0), + ], + q(asu) => [ + q(0904), + q(0), + ], + q(asv) => [ + q(0905), + q(0), + ], + q(asw) => [ + q(0906), + q(0), + ], + q(asx) => [ + q(0907), + q(0), + ], + q(asy) => [ + q(0908), + q(0), + ], + q(asz) => [ + q(0909), + q(0), + ], + q(ata) => [ + q(0910), + q(0), + ], + q(atb) => [ + q(0911), + q(0), + ], + q(atc) => [ + q(0912), + q(0), + ], + q(atd) => [ + q(0913), + q(0), + ], + q(ate) => [ + q(0914), + q(0), + ], + q(atg) => [ + q(0915), + q(0), + ], + q(ath) => [ + q(0031), + q(0), + ], + q(ati) => [ + q(0916), + q(0), + ], + q(atj) => [ + q(0917), + q(0), + ], + q(atk) => [ + q(0918), + q(0), + ], + q(atl) => [ + q(0919), + q(0), + ], + q(atm) => [ + q(0920), + q(0), + ], + q(atn) => [ + q(0921), + q(0), + ], + q(ato) => [ + q(0922), + q(0), + ], + q(atp) => [ + q(0923), + q(0), + ], + q(atq) => [ + q(0924), + q(0), + ], + q(atr) => [ + q(0925), + q(0), + ], + q(ats) => [ + q(0926), + q(0), + ], + q(att) => [ + q(0927), + q(0), + ], + q(atu) => [ + q(0928), + q(0), + ], + q(atv) => [ + q(0929), + q(0), + ], + q(atw) => [ + q(0930), + q(0), + ], + q(atx) => [ + q(0931), + q(0), + ], + q(aty) => [ + q(0932), + q(0), + ], + q(atz) => [ + q(0933), + q(0), + ], + q(aua) => [ + q(0934), + q(0), + ], + q(aub) => [ + q(0935), + q(0), + ], + q(auc) => [ + q(0936), + q(0), + ], + q(aud) => [ + q(0937), + q(0), + ], + q(auf) => [ + q(0492), + q(0), + ], + q(aug) => [ + q(0938), + q(0), + ], + q(auh) => [ + q(0939), + q(0), + ], + q(aui) => [ + q(0940), + q(0), + ], + q(auj) => [ + q(0941), + q(0), + ], + q(auk) => [ + q(0942), + q(0), + ], + q(aul) => [ + q(0943), + q(0), + ], + q(aum) => [ + q(0944), + q(0), + ], + q(aun) => [ + q(0945), + q(0), + ], + q(auo) => [ + q(0946), + q(0), + ], + q(aup) => [ + q(0947), + q(0), + ], + q(auq) => [ + q(0948), + q(0), + ], + q(aur) => [ + q(0949), + q(0), + ], + q(aus) => [ + q(0032), + q(0), + ], + q(aut) => [ + q(0950), + q(0), + ], + q(auu) => [ + q(0951), + q(0), + ], + q(auw) => [ + q(0952), + q(0), + ], + q(aux) => [ + q(0953), + q(0), + ], + q(auy) => [ + q(0954), + q(0), + ], + q(auz) => [ + q(0955), + q(0), + ], + q(ava) => [ + q(0033), + q(0), + ], + q(avb) => [ + q(0956), + q(0), + ], + q(avd) => [ + q(0957), + q(0), + ], + q(ave) => [ + q(0034), + q(0), + ], + q(avi) => [ + q(0958), + q(0), + ], + q(avk) => [ + q(0959), + q(0), + ], + q(avl) => [ + q(0960), + q(0), + ], + q(avm) => [ + q(0961), + q(0), + ], + q(avn) => [ + q(0962), + q(0), + ], + q(avo) => [ + q(0963), + q(0), + ], + q(avs) => [ + q(0964), + q(0), + ], + q(avt) => [ + q(0965), + q(0), + ], + q(avu) => [ + q(0966), + q(0), + ], + q(avv) => [ + q(0967), + q(0), + ], + q(awa) => [ + q(0035), + q(0), + ], + q(awb) => [ + q(0968), + q(0), + ], + q(awc) => [ + q(0969), + q(0), + ], + q(awd) => [ + q(0493), + q(0), + ], + q(awe) => [ + q(0970), + q(0), + ], + q(awg) => [ + q(0971), + q(0), + ], + q(awh) => [ + q(0972), + q(0), + ], + q(awi) => [ + q(0973), + q(0), + ], + q(awk) => [ + q(0974), + q(0), + ], + q(awm) => [ + q(0975), + q(0), + ], + q(awn) => [ + q(0976), + q(0), + ], + q(awo) => [ + q(0977), + q(0), + ], + q(awr) => [ + q(0978), + q(0), + ], + q(aws) => [ + q(0979), + q(0), + ], + q(awt) => [ + q(0980), + q(0), + ], + q(awu) => [ + q(0981), + q(0), + ], + q(awv) => [ + q(0982), + q(0), + ], + q(aww) => [ + q(0983), + q(0), + ], + q(awx) => [ + q(0984), + q(0), + ], + q(awy) => [ + q(0985), + q(0), + ], + q(axb) => [ + q(0986), + q(0), + ], + q(axe) => [ + q(0987), + q(0), + ], + q(axg) => [ + q(0988), + q(0), + ], + q(axk) => [ + q(0989), + q(0), + ], + q(axl) => [ + q(0990), + q(0), + ], + q(axm) => [ + q(0991), + q(0), + ], + q(axx) => [ + q(0992), + q(0), + ], + q(aya) => [ + q(0993), + q(0), + ], + q(ayb) => [ + q(0994), + q(0), + ], + q(ayc) => [ + q(0995), + q(0), + ], + q(ayd) => [ + q(0996), + q(0), + ], + q(aye) => [ + q(0997), + q(0), + ], + q(ayg) => [ + q(0998), + q(0), + ], + q(ayh) => [ + q(0999), + q(0), + ], + q(ayi) => [ + q(1000), + q(0), + ], + q(ayk) => [ + q(1001), + q(0), + ], + q(ayl) => [ + q(1002), + q(0), + ], + q(aym) => [ + q(0036), + q(0), + ], + q(ayn) => [ + q(1003), + q(0), + ], + q(ayo) => [ + q(1004), + q(0), + ], + q(ayp) => [ + q(1005), + q(0), + ], + q(ayq) => [ + q(1006), + q(0), + ], + q(ayr) => [ + q(1007), + q(0), + ], + q(ays) => [ + q(1008), + q(0), + ], + q(ayt) => [ + q(1009), + q(0), + ], + q(ayu) => [ + q(1010), + q(0), + ], + q(ayy) => [ + q(1011), + q(0), + ], + q(ayz) => [ + q(1012), + q(0), + ], + q(aza) => [ + q(1013), + q(0), + ], + q(azb) => [ + q(1014), + q(0), + ], + q(azc) => [ + q(0494), + q(0), + ], + q(azd) => [ + q(1015), + q(0), + ], + q(aze) => [ + q(0037), + q(0), + ], + q(azg) => [ + q(1016), + q(0), + ], + q(azj) => [ + q(1017), + q(0), + ], + q(azm) => [ + q(1018), + q(0), + ], + q(azn) => [ + q(1019), + q(0), + ], + q(azo) => [ + q(1020), + q(0), + ], + q(azt) => [ + q(1021), + q(0), + ], + q(azz) => [ + q(1022), + q(0), + ], + q(baa) => [ + q(1023), + q(0), + ], + q(bab) => [ + q(1024), + q(0), + ], + q(bac) => [ + q(1025), + q(0), + ], + q(bad) => [ + q(0038), + q(0), + ], + q(bae) => [ + q(1026), + q(0), + ], + q(baf) => [ + q(1027), + q(0), + ], + q(bag) => [ + q(1028), + q(0), + ], + q(bah) => [ + q(1029), + q(0), + ], + q(bai) => [ + q(0039), + q(0), + ], + q(baj) => [ + q(1030), + q(0), + ], + q(bak) => [ + q(0040), + q(0), + ], + q(bal) => [ + q(0041), + q(0), + ], + q(bam) => [ + q(0042), + q(0), + ], + q(ban) => [ + q(0043), + q(0), + ], + q(bao) => [ + q(1031), + q(0), + ], + q(bap) => [ + q(1032), + q(0), + ], + q(baq) => [ + q(0044), + q(0), + ], + q(bar) => [ + q(1033), + q(0), + ], + q(bas) => [ + q(0045), + q(1), + ], + q(bat) => [ + q(0046), + q(0), + ], + q(bau) => [ + q(1034), + q(0), + ], + q(bav) => [ + q(1035), + q(0), + ], + q(baw) => [ + q(1036), + q(0), + ], + q(bax) => [ + q(1037), + q(0), + ], + q(bay) => [ + q(1038), + q(0), + ], + q(bba) => [ + q(1039), + q(0), + ], + q(bbb) => [ + q(1040), + q(0), + ], + q(bbc) => [ + q(1041), + q(0), + ], + q(bbd) => [ + q(1042), + q(0), + ], + q(bbe) => [ + q(1043), + q(0), + ], + q(bbf) => [ + q(1044), + q(0), + ], + q(bbg) => [ + q(1045), + q(0), + ], + q(bbh) => [ + q(1046), + q(0), + ], + q(bbi) => [ + q(1047), + q(0), + ], + q(bbj) => [ + q(1048), + q(0), + ], + q(bbk) => [ + q(1049), + q(0), + ], + q(bbl) => [ + q(1050), + q(0), + ], + q(bbm) => [ + q(1051), + q(0), + ], + q(bbn) => [ + q(1052), + q(0), + ], + q(bbo) => [ + q(1053), + q(0), + ], + q(bbp) => [ + q(1054), + q(0), + ], + q(bbq) => [ + q(1055), + q(0), + ], + q(bbr) => [ + q(1056), + q(0), + ], + q(bbs) => [ + q(1057), + q(0), + ], + q(bbt) => [ + q(1058), + q(0), + ], + q(bbu) => [ + q(1059), + q(0), + ], + q(bbv) => [ + q(1060), + q(0), + ], + q(bbw) => [ + q(1061), + q(0), + ], + q(bbx) => [ + q(1062), + q(0), + ], + q(bby) => [ + q(1063), + q(0), + ], + q(bbz) => [ + q(1064), + q(0), + ], + q(bca) => [ + q(1065), + q(0), + ], + q(bcb) => [ + q(1066), + q(0), + ], + q(bcc) => [ + q(1067), + q(0), + ], + q(bcd) => [ + q(1068), + q(0), + ], + q(bce) => [ + q(1069), + q(0), + ], + q(bcf) => [ + q(1070), + q(0), + ], + q(bcg) => [ + q(1071), + q(0), + ], + q(bch) => [ + q(1072), + q(0), + ], + q(bci) => [ + q(1073), + q(0), + ], + q(bcj) => [ + q(1074), + q(0), + ], + q(bck) => [ + q(1075), + q(0), + ], + q(bcl) => [ + q(1076), + q(0), + ], + q(bcm) => [ + q(1077), + q(0), + ], + q(bcn) => [ + q(1078), + q(0), + ], + q(bco) => [ + q(1079), + q(0), + ], + q(bcp) => [ + q(1080), + q(0), + ], + q(bcq) => [ + q(1081), + q(0), + ], + q(bcr) => [ + q(1082), + q(0), + ], + q(bcs) => [ + q(1083), + q(0), + ], + q(bct) => [ + q(1084), + q(0), + ], + q(bcu) => [ + q(1085), + q(0), + ], + q(bcv) => [ + q(1086), + q(0), + ], + q(bcw) => [ + q(1087), + q(0), + ], + q(bcy) => [ + q(1088), + q(0), + ], + q(bcz) => [ + q(1089), + q(0), + ], + q(bda) => [ + q(1090), + q(0), + ], + q(bdb) => [ + q(1091), + q(0), + ], + q(bdc) => [ + q(1092), + q(0), + ], + q(bdd) => [ + q(1093), + q(0), + ], + q(bde) => [ + q(1094), + q(0), + ], + q(bdf) => [ + q(1095), + q(0), + ], + q(bdg) => [ + q(1096), + q(0), + ], + q(bdh) => [ + q(1097), + q(0), + ], + q(bdi) => [ + q(1098), + q(0), + ], + q(bdj) => [ + q(1099), + q(0), + ], + q(bdk) => [ + q(1100), + q(0), + ], + q(bdl) => [ + q(1101), + q(0), + ], + q(bdm) => [ + q(1102), + q(0), + ], + q(bdn) => [ + q(1103), + q(0), + ], + q(bdo) => [ + q(1104), + q(0), + ], + q(bdp) => [ + q(1105), + q(0), + ], + q(bdq) => [ + q(1106), + q(0), + ], + q(bdr) => [ + q(1107), + q(0), + ], + q(bds) => [ + q(1108), + q(0), + ], + q(bdt) => [ + q(1109), + q(0), + ], + q(bdu) => [ + q(1110), + q(0), + ], + q(bdv) => [ + q(1111), + q(0), + ], + q(bdw) => [ + q(1112), + q(0), + ], + q(bdx) => [ + q(1113), + q(0), + ], + q(bdy) => [ + q(1114), + q(0), + ], + q(bdz) => [ + q(1115), + q(0), + ], + q(bea) => [ + q(1116), + q(0), + ], + q(beb) => [ + q(1117), + q(0), + ], + q(bec) => [ + q(1118), + q(0), + ], + q(bed) => [ + q(1119), + q(0), + ], + q(bee) => [ + q(1120), + q(0), + ], + q(bef) => [ + q(1121), + q(0), + ], + q(beg) => [ + q(1122), + q(0), + ], + q(beh) => [ + q(1123), + q(0), + ], + q(bei) => [ + q(1124), + q(0), + ], + q(bej) => [ + q(0047), + q(0), + ], + q(bek) => [ + q(1125), + q(0), + ], + q(bel) => [ + q(0048), + q(0), + ], + q(bem) => [ + q(0049), + q(1), + ], + q(ben) => [ + q(0050), + q(0), + ], + q(beo) => [ + q(1126), + q(0), + ], + q(bep) => [ + q(1127), + q(0), + ], + q(beq) => [ + q(1128), + q(0), + ], + q(ber) => [ + q(0051), + q(0), + ], + q(bes) => [ + q(1129), + q(0), + ], + q(bet) => [ + q(1130), + q(0), + ], + q(beu) => [ + q(1131), + q(0), + ], + q(bev) => [ + q(1132), + q(0), + ], + q(bew) => [ + q(1133), + q(0), + ], + q(bex) => [ + q(1134), + q(0), + ], + q(bey) => [ + q(1135), + q(0), + ], + q(bez) => [ + q(1136), + q(0), + ], + q(bfa) => [ + q(1137), + q(0), + ], + q(bfb) => [ + q(1138), + q(0), + ], + q(bfc) => [ + q(1139), + q(0), + ], + q(bfd) => [ + q(1140), + q(0), + ], + q(bfe) => [ + q(1141), + q(0), + ], + q(bff) => [ + q(1142), + q(0), + ], + q(bfg) => [ + q(1143), + q(0), + ], + q(bfh) => [ + q(1144), + q(0), + ], + q(bfi) => [ + q(1145), + q(0), + ], + q(bfj) => [ + q(1146), + q(0), + ], + q(bfk) => [ + q(1147), + q(0), + ], + q(bfl) => [ + q(1148), + q(0), + ], + q(bfm) => [ + q(1149), + q(0), + ], + q(bfn) => [ + q(1150), + q(0), + ], + q(bfo) => [ + q(1151), + q(0), + ], + q(bfp) => [ + q(1152), + q(0), + ], + q(bfq) => [ + q(1153), + q(0), + ], + q(bfr) => [ + q(1154), + q(0), + ], + q(bfs) => [ + q(1155), + q(0), + ], + q(bft) => [ + q(1156), + q(0), + ], + q(bfu) => [ + q(1157), + q(0), + ], + q(bfw) => [ + q(1158), + q(0), + ], + q(bfx) => [ + q(1159), + q(0), + ], + q(bfy) => [ + q(1160), + q(0), + ], + q(bfz) => [ + q(1161), + q(0), + ], + q(bga) => [ + q(1162), + q(0), + ], + q(bgb) => [ + q(1163), + q(0), + ], + q(bgc) => [ + q(1164), + q(0), + ], + q(bgd) => [ + q(1165), + q(0), + ], + q(bge) => [ + q(1166), + q(0), + ], + q(bgf) => [ + q(1167), + q(0), + ], + q(bgg) => [ + q(1168), + q(0), + ], + q(bgi) => [ + q(1169), + q(0), + ], + q(bgj) => [ + q(1170), + q(0), + ], + q(bgk) => [ + q(1171), + q(0), + ], + q(bgl) => [ + q(1172), + q(0), + ], + q(bgn) => [ + q(1173), + q(0), + ], + q(bgo) => [ + q(1174), + q(0), + ], + q(bgp) => [ + q(1175), + q(0), + ], + q(bgq) => [ + q(1176), + q(0), + ], + q(bgr) => [ + q(1177), + q(0), + ], + q(bgs) => [ + q(1178), + q(0), + ], + q(bgt) => [ + q(1179), + q(0), + ], + q(bgu) => [ + q(1180), + q(0), + ], + q(bgv) => [ + q(1181), + q(0), + ], + q(bgw) => [ + q(1182), + q(0), + ], + q(bgx) => [ + q(1183), + q(0), + ], + q(bgy) => [ + q(1184), + q(0), + ], + q(bgz) => [ + q(1185), + q(0), + ], + q(bha) => [ + q(1186), + q(0), + ], + q(bhb) => [ + q(1187), + q(0), + ], + q(bhc) => [ + q(1188), + q(0), + ], + q(bhd) => [ + q(1189), + q(0), + ], + q(bhe) => [ + q(1190), + q(0), + ], + q(bhf) => [ + q(1191), + q(0), + ], + q(bhg) => [ + q(1192), + q(0), + ], + q(bhh) => [ + q(1193), + q(0), + ], + q(bhi) => [ + q(1194), + q(0), + ], + q(bhj) => [ + q(1195), + q(0), + ], + q(bhl) => [ + q(1196), + q(0), + ], + q(bhm) => [ + q(1197), + q(0), + ], + q(bhn) => [ + q(1198), + q(0), + ], + q(bho) => [ + q(0052), + q(0), + ], + q(bhp) => [ + q(1199), + q(0), + ], + q(bhq) => [ + q(1200), + q(0), + ], + q(bhr) => [ + q(1201), + q(0), + ], + q(bhs) => [ + q(1202), + q(0), + ], + q(bht) => [ + q(1203), + q(0), + ], + q(bhu) => [ + q(1204), + q(0), + ], + q(bhv) => [ + q(1205), + q(0), + ], + q(bhw) => [ + q(1206), + q(0), + ], + q(bhx) => [ + q(1207), + q(0), + ], + q(bhy) => [ + q(1208), + q(0), + ], + q(bhz) => [ + q(1209), + q(0), + ], + q(bia) => [ + q(1210), + q(0), + ], + q(bib) => [ + q(1211), + q(0), + ], + q(bic) => [ + q(1212), + q(0), + ], + q(bid) => [ + q(1213), + q(0), + ], + q(bie) => [ + q(1214), + q(0), + ], + q(bif) => [ + q(1215), + q(0), + ], + q(big) => [ + q(1216), + q(0), + ], + q(bih) => [ + q(0053), + q(0), + ], + q(bij) => [ + q(1217), + q(0), + ], + q(bik) => [ + q(0054), + q(0), + ], + q(bil) => [ + q(1218), + q(0), + ], + q(bim) => [ + q(1219), + q(0), + ], + q(bin) => [ + q(0055), + q(0), + ], + q(bio) => [ + q(1220), + q(0), + ], + q(bip) => [ + q(1221), + q(0), + ], + q(biq) => [ + q(1222), + q(0), + ], + q(bir) => [ + q(1223), + q(0), + ], + q(bis) => [ + q(0056), + q(0), + ], + q(bit) => [ + q(1224), + q(0), + ], + q(biu) => [ + q(1225), + q(0), + ], + q(biv) => [ + q(1226), + q(0), + ], + q(biw) => [ + q(1227), + q(0), + ], + q(bix) => [ + q(1228), + q(0), + ], + q(biy) => [ + q(1229), + q(0), + ], + q(biz) => [ + q(1230), + q(0), + ], + q(bja) => [ + q(1231), + q(0), + ], + q(bjb) => [ + q(1232), + q(0), + ], + q(bjc) => [ + q(1233), + q(0), + ], + q(bje) => [ + q(1234), + q(0), + ], + q(bjf) => [ + q(1235), + q(0), + ], + q(bjg) => [ + q(1236), + q(0), + ], + q(bjh) => [ + q(1237), + q(0), + ], + q(bji) => [ + q(1238), + q(0), + ], + q(bjj) => [ + q(1239), + q(0), + ], + q(bjk) => [ + q(1240), + q(0), + ], + q(bjl) => [ + q(1241), + q(0), + ], + q(bjm) => [ + q(1242), + q(0), + ], + q(bjn) => [ + q(1243), + q(0), + ], + q(bjo) => [ + q(1244), + q(0), + ], + q(bjp) => [ + q(1245), + q(0), + ], + q(bjr) => [ + q(1246), + q(0), + ], + q(bjs) => [ + q(1247), + q(0), + ], + q(bjt) => [ + q(1248), + q(0), + ], + q(bju) => [ + q(1249), + q(0), + ], + q(bjv) => [ + q(1250), + q(0), + ], + q(bjw) => [ + q(1251), + q(0), + ], + q(bjx) => [ + q(1252), + q(0), + ], + q(bjy) => [ + q(1253), + q(0), + ], + q(bjz) => [ + q(1254), + q(0), + ], + q(bka) => [ + q(1255), + q(0), + ], + q(bkc) => [ + q(1256), + q(0), + ], + q(bkd) => [ + q(1257), + q(0), + ], + q(bkf) => [ + q(1258), + q(0), + ], + q(bkg) => [ + q(1259), + q(0), + ], + q(bkh) => [ + q(1260), + q(0), + ], + q(bki) => [ + q(1261), + q(0), + ], + q(bkj) => [ + q(1262), + q(0), + ], + q(bkk) => [ + q(1263), + q(0), + ], + q(bkl) => [ + q(1264), + q(0), + ], + q(bkm) => [ + q(1265), + q(0), + ], + q(bkn) => [ + q(1266), + q(0), + ], + q(bko) => [ + q(1267), + q(0), + ], + q(bkp) => [ + q(1268), + q(0), + ], + q(bkq) => [ + q(1269), + q(0), + ], + q(bkr) => [ + q(1270), + q(0), + ], + q(bks) => [ + q(1271), + q(0), + ], + q(bkt) => [ + q(1272), + q(0), + ], + q(bku) => [ + q(1273), + q(0), + ], + q(bkv) => [ + q(1274), + q(0), + ], + q(bkw) => [ + q(1275), + q(0), + ], + q(bkx) => [ + q(1276), + q(0), + ], + q(bky) => [ + q(1277), + q(0), + ], + q(bkz) => [ + q(1278), + q(0), + ], + q(bla) => [ + q(0057), + q(0), + ], + q(blb) => [ + q(1279), + q(0), + ], + q(blc) => [ + q(1280), + q(0), + ], + q(bld) => [ + q(1281), + q(0), + ], + q(ble) => [ + q(1282), + q(0), + ], + q(blf) => [ + q(1283), + q(0), + ], + q(blg) => [ + q(1284), + q(0), + ], + q(blh) => [ + q(1285), + q(0), + ], + q(bli) => [ + q(1286), + q(0), + ], + q(blj) => [ + q(1287), + q(0), + ], + q(blk) => [ + q(1288), + q(0), + ], + q(bll) => [ + q(1289), + q(0), + ], + q(blm) => [ + q(1290), + q(0), + ], + q(bln) => [ + q(1291), + q(0), + ], + q(blo) => [ + q(1292), + q(0), + ], + q(blp) => [ + q(1293), + q(0), + ], + q(blq) => [ + q(1294), + q(0), + ], + q(blr) => [ + q(1295), + q(0), + ], + q(bls) => [ + q(1296), + q(0), + ], + q(blt) => [ + q(1297), + q(0), + ], + q(blv) => [ + q(1298), + q(0), + ], + q(blw) => [ + q(1299), + q(0), + ], + q(blx) => [ + q(1300), + q(0), + ], + q(bly) => [ + q(1301), + q(0), + ], + q(blz) => [ + q(1302), + q(0), + ], + q(bma) => [ + q(1303), + q(0), + ], + q(bmb) => [ + q(1304), + q(0), + ], + q(bmc) => [ + q(1305), + q(0), + ], + q(bmd) => [ + q(1306), + q(0), + ], + q(bme) => [ + q(1307), + q(0), + ], + q(bmf) => [ + q(1308), + q(0), + ], + q(bmg) => [ + q(1309), + q(0), + ], + q(bmh) => [ + q(1310), + q(0), + ], + q(bmi) => [ + q(1311), + q(0), + ], + q(bmj) => [ + q(1312), + q(0), + ], + q(bmk) => [ + q(1313), + q(0), + ], + q(bml) => [ + q(1314), + q(0), + ], + q(bmm) => [ + q(1315), + q(0), + ], + q(bmn) => [ + q(1316), + q(0), + ], + q(bmo) => [ + q(1317), + q(0), + ], + q(bmp) => [ + q(1318), + q(0), + ], + q(bmq) => [ + q(1319), + q(0), + ], + q(bmr) => [ + q(1320), + q(0), + ], + q(bms) => [ + q(1321), + q(0), + ], + q(bmt) => [ + q(1322), + q(0), + ], + q(bmu) => [ + q(1323), + q(0), + ], + q(bmv) => [ + q(1324), + q(0), + ], + q(bmw) => [ + q(1325), + q(0), + ], + q(bmx) => [ + q(1326), + q(0), + ], + q(bmz) => [ + q(1327), + q(0), + ], + q(bna) => [ + q(1328), + q(0), + ], + q(bnb) => [ + q(1329), + q(0), + ], + q(bnc) => [ + q(1330), + q(0), + ], + q(bnd) => [ + q(1331), + q(0), + ], + q(bne) => [ + q(1332), + q(0), + ], + q(bnf) => [ + q(1333), + q(0), + ], + q(bng) => [ + q(1334), + q(0), + ], + q(bni) => [ + q(1335), + q(0), + ], + q(bnj) => [ + q(1336), + q(0), + ], + q(bnk) => [ + q(1337), + q(0), + ], + q(bnl) => [ + q(1338), + q(0), + ], + q(bnm) => [ + q(1339), + q(0), + ], + q(bnn) => [ + q(1340), + q(0), + ], + q(bno) => [ + q(1341), + q(0), + ], + q(bnp) => [ + q(1342), + q(0), + ], + q(bnq) => [ + q(1343), + q(0), + ], + q(bnr) => [ + q(1344), + q(0), + ], + q(bns) => [ + q(1345), + q(0), + ], + q(bnt) => [ + q(0058), + q(1), + ], + q(bnu) => [ + q(1346), + q(0), + ], + q(bnv) => [ + q(1347), + q(0), + ], + q(bnw) => [ + q(1348), + q(0), + ], + q(bnx) => [ + q(1349), + q(0), + ], + q(bny) => [ + q(1350), + q(0), + ], + q(bnz) => [ + q(1351), + q(0), + ], + q(boa) => [ + q(1352), + q(0), + ], + q(bob) => [ + q(1353), + q(0), + ], + q(boe) => [ + q(1354), + q(0), + ], + q(bof) => [ + q(1355), + q(0), + ], + q(bog) => [ + q(1356), + q(0), + ], + q(boh) => [ + q(1357), + q(0), + ], + q(boi) => [ + q(1358), + q(0), + ], + q(boj) => [ + q(1359), + q(0), + ], + q(bok) => [ + q(1360), + q(0), + ], + q(bol) => [ + q(1361), + q(0), + ], + q(bom) => [ + q(1362), + q(0), + ], + q(bon) => [ + q(1363), + q(0), + ], + q(boo) => [ + q(1364), + q(0), + ], + q(bop) => [ + q(1365), + q(0), + ], + q(boq) => [ + q(1366), + q(0), + ], + q(bor) => [ + q(1367), + q(0), + ], + q(bos) => [ + q(0059), + q(0), + ], + q(bot) => [ + q(1368), + q(0), + ], + q(bou) => [ + q(1369), + q(0), + ], + q(bov) => [ + q(1370), + q(0), + ], + q(bow) => [ + q(1371), + q(0), + ], + q(box) => [ + q(1372), + q(0), + ], + q(boy) => [ + q(1373), + q(0), + ], + q(boz) => [ + q(1374), + q(0), + ], + q(bpa) => [ + q(1375), + q(0), + ], + q(bpb) => [ + q(1376), + q(0), + ], + q(bpd) => [ + q(1377), + q(0), + ], + q(bpg) => [ + q(1378), + q(0), + ], + q(bph) => [ + q(1379), + q(0), + ], + q(bpi) => [ + q(1380), + q(0), + ], + q(bpj) => [ + q(1381), + q(0), + ], + q(bpk) => [ + q(1382), + q(0), + ], + q(bpl) => [ + q(1383), + q(0), + ], + q(bpm) => [ + q(1384), + q(0), + ], + q(bpn) => [ + q(1385), + q(0), + ], + q(bpo) => [ + q(1386), + q(0), + ], + q(bpp) => [ + q(1387), + q(0), + ], + q(bpq) => [ + q(1388), + q(0), + ], + q(bpr) => [ + q(1389), + q(0), + ], + q(bps) => [ + q(1390), + q(0), + ], + q(bpt) => [ + q(1391), + q(0), + ], + q(bpu) => [ + q(1392), + q(0), + ], + q(bpv) => [ + q(1393), + q(0), + ], + q(bpw) => [ + q(1394), + q(0), + ], + q(bpx) => [ + q(1395), + q(0), + ], + q(bpy) => [ + q(1396), + q(0), + ], + q(bpz) => [ + q(1397), + q(0), + ], + q(bqa) => [ + q(1398), + q(0), + ], + q(bqb) => [ + q(1399), + q(0), + ], + q(bqc) => [ + q(1400), + q(0), + ], + q(bqd) => [ + q(1401), + q(0), + ], + q(bqf) => [ + q(1402), + q(0), + ], + q(bqg) => [ + q(1403), + q(0), + ], + q(bqh) => [ + q(1404), + q(0), + ], + q(bqi) => [ + q(1405), + q(0), + ], + q(bqj) => [ + q(1406), + q(0), + ], + q(bqk) => [ + q(1407), + q(0), + ], + q(bql) => [ + q(1408), + q(0), + ], + q(bqm) => [ + q(1409), + q(0), + ], + q(bqn) => [ + q(1410), + q(0), + ], + q(bqo) => [ + q(1411), + q(0), + ], + q(bqp) => [ + q(1412), + q(0), + ], + q(bqq) => [ + q(1413), + q(0), + ], + q(bqr) => [ + q(1414), + q(0), + ], + q(bqs) => [ + q(1415), + q(0), + ], + q(bqt) => [ + q(1416), + q(0), + ], + q(bqu) => [ + q(1417), + q(0), + ], + q(bqv) => [ + q(1418), + q(0), + ], + q(bqw) => [ + q(1419), + q(0), + ], + q(bqx) => [ + q(1420), + q(0), + ], + q(bqy) => [ + q(1421), + q(0), + ], + q(bqz) => [ + q(1422), + q(0), + ], + q(bra) => [ + q(0060), + q(0), + ], + q(brb) => [ + q(1423), + q(0), + ], + q(brc) => [ + q(1424), + q(0), + ], + q(brd) => [ + q(1425), + q(0), + ], + q(bre) => [ + q(0061), + q(0), + ], + q(brf) => [ + q(1426), + q(0), + ], + q(brg) => [ + q(1427), + q(0), + ], + q(brh) => [ + q(1428), + q(0), + ], + q(bri) => [ + q(1429), + q(0), + ], + q(brj) => [ + q(1430), + q(0), + ], + q(brk) => [ + q(1431), + q(0), + ], + q(brl) => [ + q(1432), + q(0), + ], + q(brm) => [ + q(1433), + q(0), + ], + q(brn) => [ + q(1434), + q(0), + ], + q(bro) => [ + q(1435), + q(0), + ], + q(brp) => [ + q(1436), + q(0), + ], + q(brq) => [ + q(1437), + q(0), + ], + q(brr) => [ + q(1438), + q(0), + ], + q(brs) => [ + q(1439), + q(0), + ], + q(brt) => [ + q(1440), + q(0), + ], + q(bru) => [ + q(1441), + q(0), + ], + q(brv) => [ + q(1442), + q(0), + ], + q(brw) => [ + q(1443), + q(0), + ], + q(brx) => [ + q(1444), + q(0), + ], + q(bry) => [ + q(1445), + q(0), + ], + q(brz) => [ + q(1446), + q(0), + ], + q(bsa) => [ + q(1447), + q(0), + ], + q(bsb) => [ + q(1448), + q(0), + ], + q(bsc) => [ + q(1449), + q(0), + ], + q(bse) => [ + q(1450), + q(0), + ], + q(bsf) => [ + q(1451), + q(0), + ], + q(bsg) => [ + q(1452), + q(0), + ], + q(bsh) => [ + q(1453), + q(0), + ], + q(bsi) => [ + q(1454), + q(0), + ], + q(bsj) => [ + q(1455), + q(0), + ], + q(bsk) => [ + q(1456), + q(0), + ], + q(bsl) => [ + q(1457), + q(0), + ], + q(bsm) => [ + q(1458), + q(0), + ], + q(bsn) => [ + q(1459), + q(0), + ], + q(bso) => [ + q(1460), + q(0), + ], + q(bsp) => [ + q(1461), + q(0), + ], + q(bsq) => [ + q(1462), + q(0), + ], + q(bsr) => [ + q(1463), + q(0), + ], + q(bss) => [ + q(1464), + q(0), + ], + q(bst) => [ + q(1465), + q(0), + ], + q(bsu) => [ + q(1466), + q(0), + ], + q(bsv) => [ + q(1467), + q(0), + ], + q(bsw) => [ + q(1468), + q(0), + ], + q(bsx) => [ + q(1469), + q(0), + ], + q(bsy) => [ + q(1470), + q(0), + ], + q(bta) => [ + q(1471), + q(0), + ], + q(btc) => [ + q(1472), + q(0), + ], + q(btd) => [ + q(1473), + q(0), + ], + q(bte) => [ + q(1474), + q(0), + ], + q(btf) => [ + q(1475), + q(0), + ], + q(btg) => [ + q(1476), + q(0), + ], + q(bth) => [ + q(1477), + q(0), + ], + q(bti) => [ + q(1478), + q(0), + ], + q(btj) => [ + q(1479), + q(0), + ], + q(btk) => [ + q(0062), + q(0), + ], + q(btm) => [ + q(1480), + q(0), + ], + q(btn) => [ + q(1481), + q(0), + ], + q(bto) => [ + q(1482), + q(0), + ], + q(btp) => [ + q(1483), + q(0), + ], + q(btq) => [ + q(1484), + q(0), + ], + q(btr) => [ + q(1485), + q(0), + ], + q(bts) => [ + q(1486), + q(0), + ], + q(btt) => [ + q(1487), + q(0), + ], + q(btu) => [ + q(1488), + q(0), + ], + q(btv) => [ + q(1489), + q(0), + ], + q(btw) => [ + q(1490), + q(0), + ], + q(btx) => [ + q(1491), + q(0), + ], + q(bty) => [ + q(1492), + q(0), + ], + q(btz) => [ + q(1493), + q(0), + ], + q(bua) => [ + q(0063), + q(0), + ], + q(bub) => [ + q(1494), + q(0), + ], + q(buc) => [ + q(1495), + q(0), + ], + q(bud) => [ + q(1496), + q(0), + ], + q(bue) => [ + q(1497), + q(0), + ], + q(buf) => [ + q(1498), + q(0), + ], + q(bug) => [ + q(0064), + q(0), + ], + q(buh) => [ + q(1499), + q(0), + ], + q(bui) => [ + q(1500), + q(0), + ], + q(buj) => [ + q(1501), + q(0), + ], + q(buk) => [ + q(1502), + q(0), + ], + q(bul) => [ + q(0065), + q(0), + ], + q(bum) => [ + q(1503), + q(0), + ], + q(bun) => [ + q(1504), + q(0), + ], + q(buo) => [ + q(1505), + q(0), + ], + q(bup) => [ + q(1506), + q(0), + ], + q(buq) => [ + q(1507), + q(0), + ], + q(bur) => [ + q(0066), + q(0), + ], + q(bus) => [ + q(1508), + q(0), + ], + q(but) => [ + q(1509), + q(0), + ], + q(buu) => [ + q(1510), + q(0), + ], + q(buv) => [ + q(1511), + q(0), + ], + q(buw) => [ + q(1512), + q(0), + ], + q(bux) => [ + q(1513), + q(0), + ], + q(buy) => [ + q(1514), + q(0), + ], + q(buz) => [ + q(1515), + q(0), + ], + q(bva) => [ + q(1516), + q(0), + ], + q(bvb) => [ + q(1517), + q(0), + ], + q(bvc) => [ + q(1518), + q(0), + ], + q(bvd) => [ + q(1519), + q(0), + ], + q(bve) => [ + q(1520), + q(0), + ], + q(bvf) => [ + q(1521), + q(0), + ], + q(bvg) => [ + q(1522), + q(0), + ], + q(bvh) => [ + q(1523), + q(0), + ], + q(bvi) => [ + q(1524), + q(0), + ], + q(bvj) => [ + q(1525), + q(0), + ], + q(bvk) => [ + q(1526), + q(0), + ], + q(bvl) => [ + q(1527), + q(0), + ], + q(bvm) => [ + q(1528), + q(0), + ], + q(bvn) => [ + q(1529), + q(0), + ], + q(bvo) => [ + q(1530), + q(0), + ], + q(bvp) => [ + q(1531), + q(0), + ], + q(bvq) => [ + q(1532), + q(0), + ], + q(bvr) => [ + q(1533), + q(0), + ], + q(bvt) => [ + q(1534), + q(0), + ], + q(bvu) => [ + q(1535), + q(0), + ], + q(bvv) => [ + q(1536), + q(0), + ], + q(bvw) => [ + q(1537), + q(0), + ], + q(bvx) => [ + q(1538), + q(0), + ], + q(bvy) => [ + q(1539), + q(0), + ], + q(bvz) => [ + q(1540), + q(0), + ], + q(bwa) => [ + q(1541), + q(0), + ], + q(bwb) => [ + q(1542), + q(0), + ], + q(bwc) => [ + q(1543), + q(0), + ], + q(bwd) => [ + q(1544), + q(0), + ], + q(bwe) => [ + q(1545), + q(0), + ], + q(bwf) => [ + q(1546), + q(0), + ], + q(bwg) => [ + q(1547), + q(0), + ], + q(bwh) => [ + q(1548), + q(0), + ], + q(bwi) => [ + q(1549), + q(0), + ], + q(bwj) => [ + q(1550), + q(0), + ], + q(bwk) => [ + q(1551), + q(0), + ], + q(bwl) => [ + q(1552), + q(0), + ], + q(bwm) => [ + q(1553), + q(0), + ], + q(bwn) => [ + q(1554), + q(0), + ], + q(bwo) => [ + q(1555), + q(0), + ], + q(bwp) => [ + q(1556), + q(0), + ], + q(bwq) => [ + q(1557), + q(0), + ], + q(bwr) => [ + q(1558), + q(0), + ], + q(bws) => [ + q(1559), + q(0), + ], + q(bwt) => [ + q(1560), + q(0), + ], + q(bwu) => [ + q(1561), + q(0), + ], + q(bww) => [ + q(1562), + q(0), + ], + q(bwx) => [ + q(1563), + q(0), + ], + q(bwy) => [ + q(1564), + q(0), + ], + q(bwz) => [ + q(1565), + q(0), + ], + q(bxa) => [ + q(1566), + q(0), + ], + q(bxb) => [ + q(1567), + q(0), + ], + q(bxc) => [ + q(1568), + q(0), + ], + q(bxd) => [ + q(1569), + q(0), + ], + q(bxe) => [ + q(1570), + q(0), + ], + q(bxf) => [ + q(1571), + q(0), + ], + q(bxg) => [ + q(1572), + q(0), + ], + q(bxh) => [ + q(1573), + q(0), + ], + q(bxi) => [ + q(1574), + q(0), + ], + q(bxj) => [ + q(1575), + q(0), + ], + q(bxk) => [ + q(1576), + q(0), + ], + q(bxl) => [ + q(1577), + q(0), + ], + q(bxm) => [ + q(1578), + q(0), + ], + q(bxn) => [ + q(1579), + q(0), + ], + q(bxo) => [ + q(1580), + q(0), + ], + q(bxp) => [ + q(1581), + q(0), + ], + q(bxq) => [ + q(1582), + q(0), + ], + q(bxr) => [ + q(1583), + q(0), + ], + q(bxs) => [ + q(1584), + q(0), + ], + q(bxu) => [ + q(1585), + q(0), + ], + q(bxv) => [ + q(1586), + q(0), + ], + q(bxw) => [ + q(1587), + q(0), + ], + q(bxz) => [ + q(1588), + q(0), + ], + q(bya) => [ + q(1589), + q(0), + ], + q(byb) => [ + q(1590), + q(0), + ], + q(byc) => [ + q(1591), + q(0), + ], + q(byd) => [ + q(1592), + q(0), + ], + q(bye) => [ + q(1593), + q(0), + ], + q(byf) => [ + q(1594), + q(0), + ], + q(byg) => [ + q(1595), + q(0), + ], + q(byh) => [ + q(1596), + q(0), + ], + q(byi) => [ + q(1597), + q(0), + ], + q(byj) => [ + q(1598), + q(0), + ], + q(byk) => [ + q(1599), + q(0), + ], + q(byl) => [ + q(1600), + q(0), + ], + q(bym) => [ + q(1601), + q(0), + ], + q(byn) => [ + q(0067), + q(1), + ], + q(byo) => [ + q(1602), + q(0), + ], + q(byp) => [ + q(1603), + q(0), + ], + q(byq) => [ + q(1604), + q(0), + ], + q(byr) => [ + q(1605), + q(0), + ], + q(bys) => [ + q(1606), + q(0), + ], + q(byt) => [ + q(1607), + q(0), + ], + q(byv) => [ + q(1608), + q(0), + ], + q(byw) => [ + q(1609), + q(0), + ], + q(byx) => [ + q(1610), + q(0), + ], + q(byz) => [ + q(1611), + q(0), + ], + q(bza) => [ + q(1612), + q(0), + ], + q(bzb) => [ + q(1613), + q(0), + ], + q(bzc) => [ + q(1614), + q(0), + ], + q(bzd) => [ + q(1615), + q(0), + ], + q(bze) => [ + q(1616), + q(0), + ], + q(bzf) => [ + q(1617), + q(0), + ], + q(bzg) => [ + q(1618), + q(0), + ], + q(bzh) => [ + q(1619), + q(0), + ], + q(bzi) => [ + q(1620), + q(0), + ], + q(bzj) => [ + q(1621), + q(0), + ], + q(bzk) => [ + q(1622), + q(0), + ], + q(bzl) => [ + q(1623), + q(0), + ], + q(bzm) => [ + q(1624), + q(0), + ], + q(bzn) => [ + q(1625), + q(0), + ], + q(bzo) => [ + q(1626), + q(0), + ], + q(bzp) => [ + q(1627), + q(0), + ], + q(bzq) => [ + q(1628), + q(0), + ], + q(bzr) => [ + q(1629), + q(0), + ], + q(bzs) => [ + q(1630), + q(0), + ], + q(bzt) => [ + q(1631), + q(0), + ], + q(bzu) => [ + q(1632), + q(0), + ], + q(bzv) => [ + q(1633), + q(0), + ], + q(bzw) => [ + q(1634), + q(0), + ], + q(bzx) => [ + q(1635), + q(0), + ], + q(bzy) => [ + q(1636), + q(0), + ], + q(bzz) => [ + q(1637), + q(0), + ], + q(caa) => [ + q(1638), + q(0), + ], + q(cab) => [ + q(1639), + q(0), + ], + q(cac) => [ + q(1640), + q(0), + ], + q(cad) => [ + q(0068), + q(0), + ], + q(cae) => [ + q(1641), + q(0), + ], + q(caf) => [ + q(1642), + q(0), + ], + q(cag) => [ + q(1643), + q(0), + ], + q(cah) => [ + q(1644), + q(0), + ], + q(cai) => [ + q(0069), + q(0), + ], + q(caj) => [ + q(1645), + q(0), + ], + q(cak) => [ + q(1646), + q(0), + ], + q(cal) => [ + q(1647), + q(0), + ], + q(cam) => [ + q(1648), + q(0), + ], + q(can) => [ + q(1649), + q(0), + ], + q(cao) => [ + q(1650), + q(0), + ], + q(cap) => [ + q(1651), + q(0), + ], + q(caq) => [ + q(1652), + q(0), + ], + q(car) => [ + q(0070), + q(0), + ], + q(cas) => [ + q(1653), + q(0), + ], + q(cat) => [ + q(0071), + q(0), + ], + q(cau) => [ + q(0072), + q(0), + ], + q(cav) => [ + q(1654), + q(0), + ], + q(caw) => [ + q(1655), + q(0), + ], + q(cax) => [ + q(1656), + q(0), + ], + q(cay) => [ + q(1657), + q(0), + ], + q(caz) => [ + q(1658), + q(0), + ], + q(cba) => [ + q(0495), + q(0), + ], + q(cbb) => [ + q(1659), + q(0), + ], + q(cbc) => [ + q(1660), + q(0), + ], + q(cbd) => [ + q(1661), + q(0), + ], + q(cbg) => [ + q(1662), + q(0), + ], + q(cbi) => [ + q(1663), + q(0), + ], + q(cbj) => [ + q(1664), + q(0), + ], + q(cbk) => [ + q(1665), + q(0), + ], + q(cbl) => [ + q(1666), + q(0), + ], + q(cbn) => [ + q(1667), + q(0), + ], + q(cbo) => [ + q(1668), + q(0), + ], + q(cbq) => [ + q(1669), + q(0), + ], + q(cbr) => [ + q(1670), + q(0), + ], + q(cbs) => [ + q(1671), + q(0), + ], + q(cbt) => [ + q(1672), + q(0), + ], + q(cbu) => [ + q(1673), + q(0), + ], + q(cbv) => [ + q(1674), + q(0), + ], + q(cbw) => [ + q(1675), + q(0), + ], + q(cby) => [ + q(1676), + q(0), + ], + q(cca) => [ + q(1677), + q(0), + ], + q(ccc) => [ + q(1678), + q(0), + ], + q(ccd) => [ + q(1679), + q(0), + ], + q(cce) => [ + q(1680), + q(0), + ], + q(ccg) => [ + q(1681), + q(0), + ], + q(cch) => [ + q(1682), + q(0), + ], + q(ccj) => [ + q(1683), + q(0), + ], + q(ccl) => [ + q(1684), + q(0), + ], + q(ccm) => [ + q(1685), + q(0), + ], + q(ccn) => [ + q(0496), + q(0), + ], + q(cco) => [ + q(1686), + q(0), + ], + q(ccp) => [ + q(1687), + q(0), + ], + q(ccr) => [ + q(1688), + q(0), + ], + q(ccs) => [ + q(0497), + q(0), + ], + q(cda) => [ + q(1689), + q(0), + ], + q(cdc) => [ + q(0498), + q(0), + ], + q(cdd) => [ + q(0499), + q(0), + ], + q(cde) => [ + q(1690), + q(0), + ], + q(cdf) => [ + q(1691), + q(0), + ], + q(cdg) => [ + q(1692), + q(0), + ], + q(cdh) => [ + q(1693), + q(0), + ], + q(cdi) => [ + q(1694), + q(0), + ], + q(cdj) => [ + q(1695), + q(0), + ], + q(cdm) => [ + q(1696), + q(0), + ], + q(cdn) => [ + q(1697), + q(0), + ], + q(cdo) => [ + q(1698), + q(0), + ], + q(cdr) => [ + q(1699), + q(0), + ], + q(cds) => [ + q(1700), + q(0), + ], + q(cdy) => [ + q(1701), + q(0), + ], + q(cdz) => [ + q(1702), + q(0), + ], + q(cea) => [ + q(1703), + q(0), + ], + q(ceb) => [ + q(0073), + q(0), + ], + q(ceg) => [ + q(1704), + q(0), + ], + q(cek) => [ + q(1705), + q(0), + ], + q(cel) => [ + q(0074), + q(0), + ], + q(cen) => [ + q(1706), + q(0), + ], + q(cet) => [ + q(1707), + q(0), + ], + q(cfa) => [ + q(1708), + q(0), + ], + q(cfd) => [ + q(1709), + q(0), + ], + q(cfg) => [ + q(1710), + q(0), + ], + q(cfm) => [ + q(1711), + q(0), + ], + q(cga) => [ + q(1712), + q(0), + ], + q(cgc) => [ + q(1713), + q(0), + ], + q(cgg) => [ + q(1714), + q(0), + ], + q(cgk) => [ + q(1715), + q(0), + ], + q(cha) => [ + q(0075), + q(0), + ], + q(chb) => [ + q(0076), + q(0), + ], + q(chc) => [ + q(1716), + q(0), + ], + q(chd) => [ + q(1717), + q(0), + ], + q(che) => [ + q(0077), + q(0), + ], + q(chf) => [ + q(1718), + q(0), + ], + q(chg) => [ + q(0078), + q(0), + ], + q(chh) => [ + q(1719), + q(0), + ], + q(chi) => [ + q(0079), + q(0), + ], + q(chj) => [ + q(1720), + q(0), + ], + q(chk) => [ + q(0080), + q(0), + ], + q(chl) => [ + q(1721), + q(0), + ], + q(chm) => [ + q(0081), + q(1), + ], + q(chn) => [ + q(0082), + q(0), + ], + q(cho) => [ + q(0083), + q(0), + ], + q(chp) => [ + q(0084), + q(0), + ], + q(chq) => [ + q(1722), + q(0), + ], + q(chr) => [ + q(0085), + q(0), + ], + q(cht) => [ + q(1723), + q(0), + ], + q(chu) => [ + q(0086), + q(0), + ], + q(chv) => [ + q(0087), + q(0), + ], + q(chw) => [ + q(1724), + q(0), + ], + q(chx) => [ + q(1725), + q(0), + ], + q(chy) => [ + q(0088), + q(0), + ], + q(chz) => [ + q(1726), + q(0), + ], + q(cia) => [ + q(1727), + q(0), + ], + q(cib) => [ + q(1728), + q(0), + ], + q(cic) => [ + q(1729), + q(0), + ], + q(cid) => [ + q(1730), + q(0), + ], + q(cie) => [ + q(1731), + q(0), + ], + q(cih) => [ + q(1732), + q(0), + ], + q(cik) => [ + q(1733), + q(0), + ], + q(cim) => [ + q(1734), + q(0), + ], + q(cin) => [ + q(1735), + q(0), + ], + q(cip) => [ + q(1736), + q(0), + ], + q(cir) => [ + q(1737), + q(0), + ], + q(ciw) => [ + q(1738), + q(0), + ], + q(ciy) => [ + q(1739), + q(0), + ], + q(cja) => [ + q(1740), + q(0), + ], + q(cje) => [ + q(1741), + q(0), + ], + q(cjh) => [ + q(1742), + q(0), + ], + q(cji) => [ + q(1743), + q(0), + ], + q(cjk) => [ + q(1744), + q(0), + ], + q(cjm) => [ + q(1745), + q(0), + ], + q(cjn) => [ + q(1746), + q(0), + ], + q(cjo) => [ + q(1747), + q(0), + ], + q(cjp) => [ + q(1748), + q(0), + ], + q(cjs) => [ + q(1749), + q(0), + ], + q(cjv) => [ + q(1750), + q(0), + ], + q(cjy) => [ + q(1751), + q(0), + ], + q(ckb) => [ + q(1752), + q(0), + ], + q(ckh) => [ + q(1753), + q(0), + ], + q(ckl) => [ + q(1754), + q(0), + ], + q(ckn) => [ + q(1755), + q(0), + ], + q(cko) => [ + q(1756), + q(0), + ], + q(ckq) => [ + q(1757), + q(0), + ], + q(ckr) => [ + q(1758), + q(0), + ], + q(cks) => [ + q(1759), + q(0), + ], + q(ckt) => [ + q(1760), + q(0), + ], + q(cku) => [ + q(1761), + q(0), + ], + q(ckv) => [ + q(1762), + q(0), + ], + q(ckx) => [ + q(1763), + q(0), + ], + q(cky) => [ + q(1764), + q(0), + ], + q(ckz) => [ + q(1765), + q(0), + ], + q(cla) => [ + q(1766), + q(0), + ], + q(clc) => [ + q(1767), + q(0), + ], + q(cld) => [ + q(1768), + q(0), + ], + q(cle) => [ + q(1769), + q(0), + ], + q(clh) => [ + q(1770), + q(0), + ], + q(cli) => [ + q(1771), + q(0), + ], + q(clj) => [ + q(1772), + q(0), + ], + q(clk) => [ + q(1773), + q(0), + ], + q(cll) => [ + q(1774), + q(0), + ], + q(clm) => [ + q(1775), + q(0), + ], + q(clo) => [ + q(1776), + q(0), + ], + q(clt) => [ + q(1777), + q(0), + ], + q(clu) => [ + q(1778), + q(0), + ], + q(clw) => [ + q(1779), + q(0), + ], + q(cly) => [ + q(1780), + q(0), + ], + q(cma) => [ + q(1781), + q(0), + ], + q(cmc) => [ + q(0089), + q(0), + ], + q(cme) => [ + q(1782), + q(0), + ], + q(cmg) => [ + q(1783), + q(0), + ], + q(cmi) => [ + q(1784), + q(0), + ], + q(cml) => [ + q(1785), + q(0), + ], + q(cmm) => [ + q(1786), + q(0), + ], + q(cmn) => [ + q(1787), + q(0), + ], + q(cmo) => [ + q(1788), + q(0), + ], + q(cmr) => [ + q(1789), + q(0), + ], + q(cms) => [ + q(1790), + q(0), + ], + q(cmt) => [ + q(1791), + q(0), + ], + q(cna) => [ + q(1792), + q(0), + ], + q(cnb) => [ + q(1793), + q(0), + ], + q(cnc) => [ + q(1794), + q(0), + ], + q(cng) => [ + q(1795), + q(0), + ], + q(cnh) => [ + q(1796), + q(0), + ], + q(cni) => [ + q(1797), + q(0), + ], + q(cnk) => [ + q(1798), + q(0), + ], + q(cnl) => [ + q(1799), + q(0), + ], + q(cno) => [ + q(1800), + q(0), + ], + q(cnr) => [ + q(0090), + q(0), + ], + q(cns) => [ + q(1801), + q(0), + ], + q(cnt) => [ + q(1802), + q(0), + ], + q(cnu) => [ + q(1803), + q(0), + ], + q(cnw) => [ + q(1804), + q(0), + ], + q(cnx) => [ + q(1805), + q(0), + ], + q(coa) => [ + q(1806), + q(0), + ], + q(cob) => [ + q(1807), + q(0), + ], + q(coc) => [ + q(1808), + q(0), + ], + q(cod) => [ + q(1809), + q(0), + ], + q(coe) => [ + q(1810), + q(0), + ], + q(cof) => [ + q(1811), + q(0), + ], + q(cog) => [ + q(1812), + q(0), + ], + q(coh) => [ + q(1813), + q(0), + ], + q(coj) => [ + q(1814), + q(0), + ], + q(cok) => [ + q(1815), + q(0), + ], + q(col) => [ + q(1816), + q(0), + ], + q(com) => [ + q(1817), + q(0), + ], + q(con) => [ + q(1818), + q(0), + ], + q(coo) => [ + q(1819), + q(0), + ], + q(cop) => [ + q(0091), + q(0), + ], + q(coq) => [ + q(1820), + q(0), + ], + q(cor) => [ + q(0092), + q(0), + ], + q(cos) => [ + q(0093), + q(0), + ], + q(cot) => [ + q(1821), + q(0), + ], + q(cou) => [ + q(1822), + q(0), + ], + q(cov) => [ + q(1823), + q(0), + ], + q(cow) => [ + q(1824), + q(0), + ], + q(cox) => [ + q(1825), + q(0), + ], + q(coz) => [ + q(1826), + q(0), + ], + q(cpa) => [ + q(1827), + q(0), + ], + q(cpb) => [ + q(1828), + q(0), + ], + q(cpc) => [ + q(1829), + q(0), + ], + q(cpe) => [ + q(0094), + q(2), + ], + q(cpf) => [ + q(0095), + q(2), + ], + q(cpg) => [ + q(1830), + q(0), + ], + q(cpi) => [ + q(1831), + q(0), + ], + q(cpn) => [ + q(1832), + q(0), + ], + q(cpo) => [ + q(1833), + q(0), + ], + q(cpp) => [ + q(0096), + q(2), + ], + q(cps) => [ + q(1834), + q(0), + ], + q(cpu) => [ + q(1835), + q(0), + ], + q(cpx) => [ + q(1836), + q(0), + ], + q(cpy) => [ + q(1837), + q(0), + ], + q(cqd) => [ + q(1838), + q(0), + ], + q(cra) => [ + q(1839), + q(0), + ], + q(crb) => [ + q(1840), + q(0), + ], + q(crc) => [ + q(1841), + q(0), + ], + q(crd) => [ + q(1842), + q(0), + ], + q(cre) => [ + q(0097), + q(0), + ], + q(crf) => [ + q(1843), + q(0), + ], + q(crg) => [ + q(1844), + q(0), + ], + q(crh) => [ + q(0098), + q(0), + ], + q(cri) => [ + q(1845), + q(0), + ], + q(crj) => [ + q(1846), + q(0), + ], + q(crk) => [ + q(1847), + q(0), + ], + q(crl) => [ + q(1848), + q(0), + ], + q(crm) => [ + q(1849), + q(0), + ], + q(crn) => [ + q(1850), + q(0), + ], + q(cro) => [ + q(1851), + q(0), + ], + q(crp) => [ + q(0099), + q(1), + ], + q(crq) => [ + q(1852), + q(0), + ], + q(crr) => [ + q(1853), + q(0), + ], + q(crs) => [ + q(1854), + q(0), + ], + q(crt) => [ + q(1855), + q(0), + ], + q(crv) => [ + q(1856), + q(0), + ], + q(crw) => [ + q(1857), + q(0), + ], + q(crx) => [ + q(1858), + q(0), + ], + q(cry) => [ + q(1859), + q(0), + ], + q(crz) => [ + q(1860), + q(0), + ], + q(csa) => [ + q(1861), + q(0), + ], + q(csb) => [ + q(0100), + q(0), + ], + q(csc) => [ + q(1862), + q(0), + ], + q(csd) => [ + q(1863), + q(0), + ], + q(cse) => [ + q(1864), + q(0), + ], + q(csf) => [ + q(1865), + q(0), + ], + q(csg) => [ + q(1866), + q(0), + ], + q(csh) => [ + q(1867), + q(0), + ], + q(csi) => [ + q(1868), + q(0), + ], + q(csj) => [ + q(1869), + q(0), + ], + q(csk) => [ + q(1870), + q(0), + ], + q(csl) => [ + q(1871), + q(0), + ], + q(csm) => [ + q(1872), + q(0), + ], + q(csn) => [ + q(1873), + q(0), + ], + q(cso) => [ + q(1874), + q(0), + ], + q(csq) => [ + q(1875), + q(0), + ], + q(csr) => [ + q(1876), + q(0), + ], + q(css) => [ + q(1877), + q(0), + ], + q(cst) => [ + q(1878), + q(0), + ], + q(csu) => [ + q(0500), + q(0), + ], + q(csv) => [ + q(1879), + q(0), + ], + q(csw) => [ + q(1880), + q(0), + ], + q(csy) => [ + q(1881), + q(0), + ], + q(csz) => [ + q(1882), + q(0), + ], + q(cta) => [ + q(1883), + q(0), + ], + q(ctc) => [ + q(1884), + q(0), + ], + q(ctd) => [ + q(1885), + q(0), + ], + q(cte) => [ + q(1886), + q(0), + ], + q(ctg) => [ + q(1887), + q(0), + ], + q(cth) => [ + q(1888), + q(0), + ], + q(ctl) => [ + q(1889), + q(0), + ], + q(ctm) => [ + q(1890), + q(0), + ], + q(ctn) => [ + q(1891), + q(0), + ], + q(cto) => [ + q(1892), + q(0), + ], + q(ctp) => [ + q(1893), + q(0), + ], + q(cts) => [ + q(1894), + q(0), + ], + q(ctt) => [ + q(1895), + q(0), + ], + q(ctu) => [ + q(1896), + q(0), + ], + q(ctz) => [ + q(1897), + q(0), + ], + q(cua) => [ + q(1898), + q(0), + ], + q(cub) => [ + q(1899), + q(0), + ], + q(cuc) => [ + q(1900), + q(0), + ], + q(cug) => [ + q(1901), + q(0), + ], + q(cuh) => [ + q(1902), + q(0), + ], + q(cui) => [ + q(1903), + q(0), + ], + q(cuj) => [ + q(1904), + q(0), + ], + q(cuk) => [ + q(1905), + q(0), + ], + q(cul) => [ + q(1906), + q(0), + ], + q(cuo) => [ + q(1907), + q(0), + ], + q(cup) => [ + q(1908), + q(0), + ], + q(cuq) => [ + q(1909), + q(0), + ], + q(cur) => [ + q(1910), + q(0), + ], + q(cus) => [ + q(0101), + q(0), + ], + q(cut) => [ + q(1911), + q(0), + ], + q(cuu) => [ + q(1912), + q(0), + ], + q(cuv) => [ + q(1913), + q(0), + ], + q(cuw) => [ + q(1914), + q(0), + ], + q(cux) => [ + q(1915), + q(0), + ], + q(cvg) => [ + q(1916), + q(0), + ], + q(cvn) => [ + q(1917), + q(0), + ], + q(cwa) => [ + q(1918), + q(0), + ], + q(cwb) => [ + q(1919), + q(0), + ], + q(cwd) => [ + q(1920), + q(0), + ], + q(cwe) => [ + q(1921), + q(0), + ], + q(cwg) => [ + q(1922), + q(0), + ], + q(cwt) => [ + q(1923), + q(0), + ], + q(cya) => [ + q(1924), + q(0), + ], + q(cyb) => [ + q(1925), + q(0), + ], + q(cyo) => [ + q(1926), + q(0), + ], + q(cze) => [ + q(0102), + q(0), + ], + q(czh) => [ + q(1927), + q(0), + ], + q(czk) => [ + q(1928), + q(0), + ], + q(czn) => [ + q(1929), + q(0), + ], + q(czo) => [ + q(1930), + q(0), + ], + q(czt) => [ + q(1931), + q(0), + ], + q(daa) => [ + q(1932), + q(0), + ], + q(dac) => [ + q(1933), + q(0), + ], + q(dad) => [ + q(1934), + q(0), + ], + q(dae) => [ + q(1935), + q(0), + ], + q(dag) => [ + q(1936), + q(0), + ], + q(dah) => [ + q(1937), + q(0), + ], + q(dai) => [ + q(1938), + q(0), + ], + q(daj) => [ + q(1939), + q(0), + ], + q(dak) => [ + q(0103), + q(0), + ], + q(dal) => [ + q(1940), + q(0), + ], + q(dam) => [ + q(1941), + q(0), + ], + q(dan) => [ + q(0104), + q(0), + ], + q(dao) => [ + q(1942), + q(0), + ], + q(daq) => [ + q(1943), + q(0), + ], + q(dar) => [ + q(0105), + q(0), + ], + q(das) => [ + q(1944), + q(0), + ], + q(dau) => [ + q(1945), + q(0), + ], + q(dav) => [ + q(1946), + q(0), + ], + q(daw) => [ + q(1947), + q(0), + ], + q(dax) => [ + q(1948), + q(0), + ], + q(day) => [ + q(0106), + q(0), + ], + q(daz) => [ + q(1949), + q(0), + ], + q(dba) => [ + q(1950), + q(0), + ], + q(dbb) => [ + q(1951), + q(0), + ], + q(dbd) => [ + q(1952), + q(0), + ], + q(dbe) => [ + q(1953), + q(0), + ], + q(dbf) => [ + q(1954), + q(0), + ], + q(dbg) => [ + q(1955), + q(0), + ], + q(dbi) => [ + q(1956), + q(0), + ], + q(dbj) => [ + q(1957), + q(0), + ], + q(dbl) => [ + q(1958), + q(0), + ], + q(dbm) => [ + q(1959), + q(0), + ], + q(dbn) => [ + q(1960), + q(0), + ], + q(dbo) => [ + q(1961), + q(0), + ], + q(dbp) => [ + q(1962), + q(0), + ], + q(dbq) => [ + q(1963), + q(0), + ], + q(dbr) => [ + q(1964), + q(0), + ], + q(dbt) => [ + q(1965), + q(0), + ], + q(dbu) => [ + q(1966), + q(0), + ], + q(dbv) => [ + q(1967), + q(0), + ], + q(dbw) => [ + q(1968), + q(0), + ], + q(dby) => [ + q(1969), + q(0), + ], + q(dcc) => [ + q(1970), + q(0), + ], + q(dcr) => [ + q(1971), + q(0), + ], + q(dda) => [ + q(1972), + q(0), + ], + q(ddd) => [ + q(1973), + q(0), + ], + q(dde) => [ + q(1974), + q(0), + ], + q(ddg) => [ + q(1975), + q(0), + ], + q(ddi) => [ + q(1976), + q(0), + ], + q(ddj) => [ + q(1977), + q(0), + ], + q(ddn) => [ + q(1978), + q(0), + ], + q(ddo) => [ + q(1979), + q(0), + ], + q(ddr) => [ + q(1980), + q(0), + ], + q(dds) => [ + q(1981), + q(0), + ], + q(ddw) => [ + q(1982), + q(0), + ], + q(dec) => [ + q(1983), + q(0), + ], + q(ded) => [ + q(1984), + q(0), + ], + q(dee) => [ + q(1985), + q(0), + ], + q(def) => [ + q(1986), + q(0), + ], + q(deg) => [ + q(1987), + q(0), + ], + q(deh) => [ + q(1988), + q(0), + ], + q(dei) => [ + q(1989), + q(0), + ], + q(dek) => [ + q(1990), + q(0), + ], + q(del) => [ + q(0107), + q(0), + ], + q(dem) => [ + q(1991), + q(0), + ], + q(den) => [ + q(0108), + q(0), + ], + q(dep) => [ + q(1992), + q(0), + ], + q(deq) => [ + q(1993), + q(0), + ], + q(der) => [ + q(1994), + q(0), + ], + q(des) => [ + q(1995), + q(0), + ], + q(dev) => [ + q(1996), + q(0), + ], + q(dez) => [ + q(1997), + q(0), + ], + q(dga) => [ + q(1998), + q(0), + ], + q(dgb) => [ + q(1999), + q(0), + ], + q(dgc) => [ + q(2000), + q(0), + ], + q(dgd) => [ + q(2001), + q(0), + ], + q(dge) => [ + q(2002), + q(0), + ], + q(dgg) => [ + q(2003), + q(0), + ], + q(dgh) => [ + q(2004), + q(0), + ], + q(dgi) => [ + q(2005), + q(0), + ], + q(dgk) => [ + q(2006), + q(0), + ], + q(dgl) => [ + q(2007), + q(0), + ], + q(dgn) => [ + q(2008), + q(0), + ], + q(dgo) => [ + q(2009), + q(0), + ], + q(dgr) => [ + q(0109), + q(0), + ], + q(dgs) => [ + q(2010), + q(0), + ], + q(dgt) => [ + q(2011), + q(0), + ], + q(dgu) => [ + q(2012), + q(0), + ], + q(dgw) => [ + q(2013), + q(0), + ], + q(dgx) => [ + q(2014), + q(0), + ], + q(dgz) => [ + q(2015), + q(0), + ], + q(dhd) => [ + q(2016), + q(0), + ], + q(dhg) => [ + q(2017), + q(0), + ], + q(dhi) => [ + q(2018), + q(0), + ], + q(dhl) => [ + q(2019), + q(0), + ], + q(dhm) => [ + q(2020), + q(0), + ], + q(dhn) => [ + q(2021), + q(0), + ], + q(dho) => [ + q(2022), + q(0), + ], + q(dhr) => [ + q(2023), + q(0), + ], + q(dhs) => [ + q(2024), + q(0), + ], + q(dhu) => [ + q(2025), + q(0), + ], + q(dhv) => [ + q(2026), + q(0), + ], + q(dhw) => [ + q(2027), + q(0), + ], + q(dhx) => [ + q(2028), + q(0), + ], + q(dia) => [ + q(2029), + q(0), + ], + q(dib) => [ + q(2030), + q(0), + ], + q(dic) => [ + q(2031), + q(0), + ], + q(did) => [ + q(2032), + q(0), + ], + q(dif) => [ + q(2033), + q(0), + ], + q(dig) => [ + q(2034), + q(0), + ], + q(dih) => [ + q(2035), + q(0), + ], + q(dii) => [ + q(2036), + q(0), + ], + q(dij) => [ + q(2037), + q(0), + ], + q(dik) => [ + q(2038), + q(0), + ], + q(dil) => [ + q(2039), + q(0), + ], + q(dim) => [ + q(2040), + q(0), + ], + q(din) => [ + q(0110), + q(0), + ], + q(dio) => [ + q(2041), + q(0), + ], + q(dip) => [ + q(2042), + q(0), + ], + q(diq) => [ + q(2043), + q(0), + ], + q(dir) => [ + q(2044), + q(0), + ], + q(dis) => [ + q(2045), + q(0), + ], + q(dit) => [ + q(2046), + q(0), + ], + q(diu) => [ + q(2047), + q(0), + ], + q(div) => [ + q(0111), + q(0), + ], + q(diw) => [ + q(2048), + q(0), + ], + q(dix) => [ + q(2049), + q(0), + ], + q(diy) => [ + q(2050), + q(0), + ], + q(diz) => [ + q(2051), + q(0), + ], + q(dja) => [ + q(2052), + q(0), + ], + q(djb) => [ + q(2053), + q(0), + ], + q(djc) => [ + q(2054), + q(0), + ], + q(djd) => [ + q(2055), + q(0), + ], + q(dje) => [ + q(2056), + q(0), + ], + q(djf) => [ + q(2057), + q(0), + ], + q(dji) => [ + q(2058), + q(0), + ], + q(djj) => [ + q(2059), + q(0), + ], + q(djk) => [ + q(2060), + q(0), + ], + q(djm) => [ + q(2061), + q(0), + ], + q(djn) => [ + q(2062), + q(0), + ], + q(djo) => [ + q(2063), + q(0), + ], + q(djr) => [ + q(2064), + q(0), + ], + q(dju) => [ + q(2065), + q(0), + ], + q(djw) => [ + q(2066), + q(0), + ], + q(dka) => [ + q(2067), + q(0), + ], + q(dkk) => [ + q(2068), + q(0), + ], + q(dkr) => [ + q(2069), + q(0), + ], + q(dks) => [ + q(2070), + q(0), + ], + q(dkx) => [ + q(2071), + q(0), + ], + q(dlg) => [ + q(2072), + q(0), + ], + q(dlk) => [ + q(2073), + q(0), + ], + q(dlm) => [ + q(2074), + q(0), + ], + q(dln) => [ + q(2075), + q(0), + ], + q(dma) => [ + q(2076), + q(0), + ], + q(dmb) => [ + q(2077), + q(0), + ], + q(dmc) => [ + q(2078), + q(0), + ], + q(dmd) => [ + q(2079), + q(0), + ], + q(dme) => [ + q(2080), + q(0), + ], + q(dmg) => [ + q(2081), + q(0), + ], + q(dmk) => [ + q(2082), + q(0), + ], + q(dml) => [ + q(2083), + q(0), + ], + q(dmm) => [ + q(2084), + q(0), + ], + q(dmn) => [ + q(0501), + q(0), + ], + q(dmo) => [ + q(2085), + q(0), + ], + q(dmr) => [ + q(2086), + q(0), + ], + q(dms) => [ + q(2087), + q(0), + ], + q(dmu) => [ + q(2088), + q(0), + ], + q(dmv) => [ + q(2089), + q(0), + ], + q(dmw) => [ + q(2090), + q(0), + ], + q(dmx) => [ + q(2091), + q(0), + ], + q(dmy) => [ + q(2092), + q(0), + ], + q(dna) => [ + q(2093), + q(0), + ], + q(dnd) => [ + q(2094), + q(0), + ], + q(dne) => [ + q(2095), + q(0), + ], + q(dng) => [ + q(2096), + q(0), + ], + q(dni) => [ + q(2097), + q(0), + ], + q(dnj) => [ + q(2098), + q(0), + ], + q(dnk) => [ + q(2099), + q(0), + ], + q(dnn) => [ + q(2100), + q(0), + ], + q(dnr) => [ + q(2101), + q(0), + ], + q(dnt) => [ + q(2102), + q(0), + ], + q(dnu) => [ + q(2103), + q(0), + ], + q(dnv) => [ + q(2104), + q(0), + ], + q(dnw) => [ + q(2105), + q(0), + ], + q(dny) => [ + q(2106), + q(0), + ], + q(doa) => [ + q(2107), + q(0), + ], + q(dob) => [ + q(2108), + q(0), + ], + q(doc) => [ + q(2109), + q(0), + ], + q(doe) => [ + q(2110), + q(0), + ], + q(dof) => [ + q(2111), + q(0), + ], + q(doh) => [ + q(2112), + q(0), + ], + q(doi) => [ + q(0112), + q(1), + ], + q(dok) => [ + q(2113), + q(0), + ], + q(dol) => [ + q(2114), + q(0), + ], + q(don) => [ + q(2115), + q(0), + ], + q(doo) => [ + q(2116), + q(0), + ], + q(dop) => [ + q(2117), + q(0), + ], + q(doq) => [ + q(2118), + q(0), + ], + q(dor) => [ + q(2119), + q(0), + ], + q(dos) => [ + q(2120), + q(0), + ], + q(dot) => [ + q(2121), + q(0), + ], + q(dov) => [ + q(2122), + q(0), + ], + q(dow) => [ + q(2123), + q(0), + ], + q(dox) => [ + q(2124), + q(0), + ], + q(doy) => [ + q(2125), + q(0), + ], + q(doz) => [ + q(2126), + q(0), + ], + q(dpp) => [ + q(2127), + q(0), + ], + q(dra) => [ + q(0113), + q(0), + ], + q(drb) => [ + q(2128), + q(0), + ], + q(drc) => [ + q(2129), + q(0), + ], + q(drd) => [ + q(2130), + q(0), + ], + q(dre) => [ + q(2131), + q(0), + ], + q(drg) => [ + q(2132), + q(0), + ], + q(dri) => [ + q(2133), + q(0), + ], + q(drl) => [ + q(2134), + q(0), + ], + q(drn) => [ + q(2135), + q(0), + ], + q(dro) => [ + q(2136), + q(0), + ], + q(drq) => [ + q(2137), + q(0), + ], + q(drr) => [ + q(2138), + q(0), + ], + q(drs) => [ + q(2139), + q(0), + ], + q(drt) => [ + q(2140), + q(0), + ], + q(dru) => [ + q(2141), + q(0), + ], + q(dry) => [ + q(2142), + q(0), + ], + q(dsb) => [ + q(0114), + q(0), + ], + q(dse) => [ + q(2143), + q(0), + ], + q(dsh) => [ + q(2144), + q(0), + ], + q(dsi) => [ + q(2145), + q(0), + ], + q(dsl) => [ + q(2146), + q(0), + ], + q(dsn) => [ + q(2147), + q(0), + ], + q(dso) => [ + q(2148), + q(0), + ], + q(dsq) => [ + q(2149), + q(0), + ], + q(dta) => [ + q(2150), + q(0), + ], + q(dtb) => [ + q(2151), + q(0), + ], + q(dtd) => [ + q(2152), + q(0), + ], + q(dth) => [ + q(2153), + q(0), + ], + q(dti) => [ + q(2154), + q(0), + ], + q(dtk) => [ + q(2155), + q(0), + ], + q(dtm) => [ + q(2156), + q(0), + ], + q(dtn) => [ + q(2157), + q(0), + ], + q(dto) => [ + q(2158), + q(0), + ], + q(dtp) => [ + q(2159), + q(0), + ], + q(dtr) => [ + q(2160), + q(0), + ], + q(dts) => [ + q(2161), + q(0), + ], + q(dtt) => [ + q(2162), + q(0), + ], + q(dtu) => [ + q(2163), + q(0), + ], + q(dty) => [ + q(2164), + q(0), + ], + q(dua) => [ + q(0115), + q(0), + ], + q(dub) => [ + q(2165), + q(0), + ], + q(duc) => [ + q(2166), + q(0), + ], + q(dud) => [ + q(2167), + q(0), + ], + q(due) => [ + q(2168), + q(0), + ], + q(duf) => [ + q(2169), + q(0), + ], + q(dug) => [ + q(2170), + q(0), + ], + q(duh) => [ + q(2171), + q(0), + ], + q(dui) => [ + q(2172), + q(0), + ], + q(duk) => [ + q(2173), + q(0), + ], + q(dul) => [ + q(2174), + q(0), + ], + q(dum) => [ + q(0116), + q(1), + ], + q(dun) => [ + q(2175), + q(0), + ], + q(duo) => [ + q(2176), + q(0), + ], + q(dup) => [ + q(2177), + q(0), + ], + q(duq) => [ + q(2178), + q(0), + ], + q(dur) => [ + q(2179), + q(0), + ], + q(dus) => [ + q(2180), + q(0), + ], + q(dut) => [ + q(0117), + q(0), + ], + q(duu) => [ + q(2181), + q(0), + ], + q(duv) => [ + q(2182), + q(0), + ], + q(duw) => [ + q(2183), + q(0), + ], + q(dux) => [ + q(2184), + q(0), + ], + q(duy) => [ + q(2185), + q(0), + ], + q(duz) => [ + q(2186), + q(0), + ], + q(dva) => [ + q(2187), + q(0), + ], + q(dwa) => [ + q(2188), + q(0), + ], + q(dwr) => [ + q(2189), + q(0), + ], + q(dws) => [ + q(2190), + q(0), + ], + q(dwu) => [ + q(2191), + q(0), + ], + q(dww) => [ + q(2192), + q(0), + ], + q(dwy) => [ + q(2193), + q(0), + ], + q(dya) => [ + q(2194), + q(0), + ], + q(dyb) => [ + q(2195), + q(0), + ], + q(dyd) => [ + q(2196), + q(0), + ], + q(dyg) => [ + q(2197), + q(0), + ], + q(dyi) => [ + q(2198), + q(0), + ], + q(dym) => [ + q(2199), + q(0), + ], + q(dyn) => [ + q(2200), + q(0), + ], + q(dyo) => [ + q(2201), + q(0), + ], + q(dyu) => [ + q(0118), + q(0), + ], + q(dyy) => [ + q(2202), + q(0), + ], + q(dza) => [ + q(2203), + q(0), + ], + q(dze) => [ + q(2204), + q(0), + ], + q(dzg) => [ + q(2205), + q(0), + ], + q(dzl) => [ + q(2206), + q(0), + ], + q(dzn) => [ + q(2207), + q(0), + ], + q(dzo) => [ + q(0119), + q(0), + ], + q(eaa) => [ + q(2208), + q(0), + ], + q(ebg) => [ + q(2209), + q(0), + ], + q(ebk) => [ + q(2210), + q(0), + ], + q(ebo) => [ + q(2211), + q(0), + ], + q(ebr) => [ + q(2212), + q(0), + ], + q(ebu) => [ + q(2213), + q(0), + ], + q(ecr) => [ + q(2214), + q(0), + ], + q(ecs) => [ + q(2215), + q(0), + ], + q(ecy) => [ + q(2216), + q(0), + ], + q(eee) => [ + q(2217), + q(0), + ], + q(efa) => [ + q(2218), + q(0), + ], + q(efe) => [ + q(2219), + q(0), + ], + q(efi) => [ + q(0120), + q(0), + ], + q(ega) => [ + q(2220), + q(0), + ], + q(egl) => [ + q(2221), + q(0), + ], + q(ego) => [ + q(2222), + q(0), + ], + q(egx) => [ + q(0502), + q(0), + ], + q(egy) => [ + q(0121), + q(0), + ], + q(ehu) => [ + q(2223), + q(0), + ], + q(eip) => [ + q(2224), + q(0), + ], + q(eit) => [ + q(2225), + q(0), + ], + q(eiv) => [ + q(2226), + q(0), + ], + q(eja) => [ + q(2227), + q(0), + ], + q(eka) => [ + q(0122), + q(0), + ], + q(ekc) => [ + q(2228), + q(0), + ], + q(eke) => [ + q(2229), + q(0), + ], + q(ekg) => [ + q(2230), + q(0), + ], + q(eki) => [ + q(2231), + q(0), + ], + q(ekk) => [ + q(2232), + q(0), + ], + q(ekl) => [ + q(2233), + q(0), + ], + q(ekm) => [ + q(2234), + q(0), + ], + q(eko) => [ + q(2235), + q(0), + ], + q(ekp) => [ + q(2236), + q(0), + ], + q(ekr) => [ + q(2237), + q(0), + ], + q(eky) => [ + q(2238), + q(0), + ], + q(ele) => [ + q(2239), + q(0), + ], + q(elh) => [ + q(2240), + q(0), + ], + q(eli) => [ + q(2241), + q(0), + ], + q(elk) => [ + q(2242), + q(0), + ], + q(elm) => [ + q(2243), + q(0), + ], + q(elo) => [ + q(2244), + q(0), + ], + q(elu) => [ + q(2245), + q(0), + ], + q(elx) => [ + q(0123), + q(0), + ], + q(ema) => [ + q(2246), + q(0), + ], + q(emb) => [ + q(2247), + q(0), + ], + q(eme) => [ + q(2248), + q(0), + ], + q(emg) => [ + q(2249), + q(0), + ], + q(emi) => [ + q(2250), + q(0), + ], + q(emk) => [ + q(2251), + q(0), + ], + q(emm) => [ + q(2252), + q(0), + ], + q(emn) => [ + q(2253), + q(0), + ], + q(emp) => [ + q(2254), + q(0), + ], + q(ems) => [ + q(2255), + q(0), + ], + q(emu) => [ + q(2256), + q(0), + ], + q(emw) => [ + q(2257), + q(0), + ], + q(emx) => [ + q(2258), + q(0), + ], + q(emy) => [ + q(2259), + q(0), + ], + q(ena) => [ + q(2260), + q(0), + ], + q(enb) => [ + q(2261), + q(0), + ], + q(enc) => [ + q(2262), + q(0), + ], + q(end) => [ + q(2263), + q(0), + ], + q(enf) => [ + q(2264), + q(0), + ], + q(eng) => [ + q(0124), + q(0), + ], + q(enh) => [ + q(2265), + q(0), + ], + q(enl) => [ + q(2266), + q(0), + ], + q(enm) => [ + q(0125), + q(1), + ], + q(enn) => [ + q(2267), + q(0), + ], + q(eno) => [ + q(2268), + q(0), + ], + q(enq) => [ + q(2269), + q(0), + ], + q(enr) => [ + q(2270), + q(0), + ], + q(enu) => [ + q(2271), + q(0), + ], + q(env) => [ + q(2272), + q(0), + ], + q(enw) => [ + q(2273), + q(0), + ], + q(enx) => [ + q(2274), + q(0), + ], + q(eot) => [ + q(2275), + q(0), + ], + q(epi) => [ + q(2276), + q(0), + ], + q(epo) => [ + q(0126), + q(0), + ], + q(era) => [ + q(2277), + q(0), + ], + q(erg) => [ + q(2278), + q(0), + ], + q(erh) => [ + q(2279), + q(0), + ], + q(eri) => [ + q(2280), + q(0), + ], + q(erk) => [ + q(2281), + q(0), + ], + q(ero) => [ + q(2282), + q(0), + ], + q(err) => [ + q(2283), + q(0), + ], + q(ers) => [ + q(2284), + q(0), + ], + q(ert) => [ + q(2285), + q(0), + ], + q(erw) => [ + q(2286), + q(0), + ], + q(ese) => [ + q(2287), + q(0), + ], + q(esg) => [ + q(2288), + q(0), + ], + q(esh) => [ + q(2289), + q(0), + ], + q(esi) => [ + q(2290), + q(0), + ], + q(esk) => [ + q(2291), + q(0), + ], + q(esl) => [ + q(2292), + q(0), + ], + q(esm) => [ + q(2293), + q(0), + ], + q(esn) => [ + q(2294), + q(0), + ], + q(eso) => [ + q(2295), + q(0), + ], + q(esq) => [ + q(2296), + q(0), + ], + q(ess) => [ + q(2297), + q(0), + ], + q(est) => [ + q(0127), + q(0), + ], + q(esu) => [ + q(2298), + q(0), + ], + q(esx) => [ + q(0503), + q(0), + ], + q(esy) => [ + q(2299), + q(0), + ], + q(etb) => [ + q(2300), + q(0), + ], + q(etc) => [ + q(2301), + q(0), + ], + q(eth) => [ + q(2302), + q(0), + ], + q(etn) => [ + q(2303), + q(0), + ], + q(eto) => [ + q(2304), + q(0), + ], + q(etr) => [ + q(2305), + q(0), + ], + q(ets) => [ + q(2306), + q(0), + ], + q(ett) => [ + q(2307), + q(0), + ], + q(etu) => [ + q(2308), + q(0), + ], + q(etx) => [ + q(2309), + q(0), + ], + q(etz) => [ + q(2310), + q(0), + ], + q(euq) => [ + q(0504), + q(0), + ], + q(eve) => [ + q(2311), + q(0), + ], + q(evh) => [ + q(2312), + q(0), + ], + q(evn) => [ + q(2313), + q(0), + ], + q(ewe) => [ + q(0128), + q(0), + ], + q(ewo) => [ + q(0129), + q(0), + ], + q(ext) => [ + q(2314), + q(0), + ], + q(eya) => [ + q(2315), + q(0), + ], + q(eyo) => [ + q(2316), + q(0), + ], + q(eza) => [ + q(2317), + q(0), + ], + q(eze) => [ + q(2318), + q(0), + ], + q(faa) => [ + q(2319), + q(0), + ], + q(fab) => [ + q(2320), + q(0), + ], + q(fad) => [ + q(2321), + q(0), + ], + q(faf) => [ + q(2322), + q(0), + ], + q(fag) => [ + q(2323), + q(0), + ], + q(fah) => [ + q(2324), + q(0), + ], + q(fai) => [ + q(2325), + q(0), + ], + q(faj) => [ + q(2326), + q(0), + ], + q(fak) => [ + q(2327), + q(0), + ], + q(fal) => [ + q(2328), + q(0), + ], + q(fam) => [ + q(2329), + q(0), + ], + q(fan) => [ + q(0130), + q(1), + ], + q(fao) => [ + q(0131), + q(0), + ], + q(fap) => [ + q(2330), + q(0), + ], + q(far) => [ + q(2331), + q(0), + ], + q(fat) => [ + q(0132), + q(0), + ], + q(fau) => [ + q(2332), + q(0), + ], + q(fax) => [ + q(2333), + q(0), + ], + q(fay) => [ + q(2334), + q(0), + ], + q(faz) => [ + q(2335), + q(0), + ], + q(fbl) => [ + q(2336), + q(0), + ], + q(fcs) => [ + q(2337), + q(0), + ], + q(fer) => [ + q(2338), + q(0), + ], + q(ffi) => [ + q(2339), + q(0), + ], + q(ffm) => [ + q(2340), + q(0), + ], + q(fgr) => [ + q(2341), + q(0), + ], + q(fia) => [ + q(2342), + q(0), + ], + q(fie) => [ + q(2343), + q(0), + ], + q(fij) => [ + q(0133), + q(0), + ], + q(fil) => [ + q(0134), + q(0), + ], + q(fin) => [ + q(0135), + q(0), + ], + q(fip) => [ + q(2344), + q(0), + ], + q(fir) => [ + q(2345), + q(0), + ], + q(fit) => [ + q(2346), + q(0), + ], + q(fiu) => [ + q(0136), + q(0), + ], + q(fiw) => [ + q(2347), + q(0), + ], + q(fkk) => [ + q(2348), + q(0), + ], + q(fkv) => [ + q(2349), + q(0), + ], + q(fla) => [ + q(2350), + q(0), + ], + q(flh) => [ + q(2351), + q(0), + ], + q(fli) => [ + q(2352), + q(0), + ], + q(fll) => [ + q(2353), + q(0), + ], + q(fln) => [ + q(2354), + q(0), + ], + q(flr) => [ + q(2355), + q(0), + ], + q(fly) => [ + q(2356), + q(0), + ], + q(fmp) => [ + q(2357), + q(0), + ], + q(fmu) => [ + q(2358), + q(0), + ], + q(fnb) => [ + q(2359), + q(0), + ], + q(fng) => [ + q(2360), + q(0), + ], + q(fni) => [ + q(2361), + q(0), + ], + q(fod) => [ + q(2362), + q(0), + ], + q(foi) => [ + q(2363), + q(0), + ], + q(fom) => [ + q(2364), + q(0), + ], + q(fon) => [ + q(0137), + q(0), + ], + q(for) => [ + q(2365), + q(0), + ], + q(fos) => [ + q(2366), + q(0), + ], + q(fox) => [ + q(0505), + q(0), + ], + q(fpe) => [ + q(2367), + q(0), + ], + q(fqs) => [ + q(2368), + q(0), + ], + q(frc) => [ + q(2369), + q(0), + ], + q(frd) => [ + q(2370), + q(0), + ], + q(fre) => [ + q(0138), + q(0), + ], + q(frk) => [ + q(2371), + q(0), + ], + q(frm) => [ + q(0139), + q(1), + ], + q(fro) => [ + q(0140), + q(1), + ], + q(frp) => [ + q(2372), + q(0), + ], + q(frq) => [ + q(2373), + q(0), + ], + q(frr) => [ + q(0141), + q(0), + ], + q(frs) => [ + q(0142), + q(0), + ], + q(frt) => [ + q(2374), + q(0), + ], + q(fry) => [ + q(0143), + q(0), + ], + q(fse) => [ + q(2375), + q(0), + ], + q(fsl) => [ + q(2376), + q(0), + ], + q(fss) => [ + q(2377), + q(0), + ], + q(fub) => [ + q(2378), + q(0), + ], + q(fuc) => [ + q(2379), + q(0), + ], + q(fud) => [ + q(2380), + q(0), + ], + q(fue) => [ + q(2381), + q(0), + ], + q(fuf) => [ + q(2382), + q(0), + ], + q(fuh) => [ + q(2383), + q(0), + ], + q(fui) => [ + q(2384), + q(0), + ], + q(fuj) => [ + q(2385), + q(0), + ], + q(ful) => [ + q(0144), + q(0), + ], + q(fum) => [ + q(2386), + q(0), + ], + q(fun) => [ + q(2387), + q(0), + ], + q(fuq) => [ + q(2388), + q(0), + ], + q(fur) => [ + q(0145), + q(0), + ], + q(fut) => [ + q(2389), + q(0), + ], + q(fuu) => [ + q(2390), + q(0), + ], + q(fuv) => [ + q(2391), + q(0), + ], + q(fuy) => [ + q(2392), + q(0), + ], + q(fvr) => [ + q(2393), + q(0), + ], + q(fwa) => [ + q(2394), + q(0), + ], + q(fwe) => [ + q(2395), + q(0), + ], + q(gaa) => [ + q(0146), + q(0), + ], + q(gab) => [ + q(2396), + q(0), + ], + q(gac) => [ + q(2397), + q(0), + ], + q(gad) => [ + q(2398), + q(0), + ], + q(gae) => [ + q(2399), + q(0), + ], + q(gaf) => [ + q(2400), + q(0), + ], + q(gag) => [ + q(2401), + q(0), + ], + q(gah) => [ + q(2402), + q(0), + ], + q(gai) => [ + q(2403), + q(0), + ], + q(gaj) => [ + q(2404), + q(0), + ], + q(gak) => [ + q(2405), + q(0), + ], + q(gal) => [ + q(2406), + q(0), + ], + q(gam) => [ + q(2407), + q(0), + ], + q(gan) => [ + q(2408), + q(0), + ], + q(gao) => [ + q(2409), + q(0), + ], + q(gap) => [ + q(2410), + q(0), + ], + q(gaq) => [ + q(2411), + q(0), + ], + q(gar) => [ + q(2412), + q(0), + ], + q(gas) => [ + q(2413), + q(0), + ], + q(gat) => [ + q(2414), + q(0), + ], + q(gau) => [ + q(2415), + q(0), + ], + q(gaw) => [ + q(2416), + q(0), + ], + q(gax) => [ + q(2417), + q(0), + ], + q(gay) => [ + q(0147), + q(0), + ], + q(gaz) => [ + q(2418), + q(0), + ], + q(gba) => [ + q(0148), + q(1), + ], + q(gbb) => [ + q(2419), + q(0), + ], + q(gbd) => [ + q(2420), + q(0), + ], + q(gbe) => [ + q(2421), + q(0), + ], + q(gbf) => [ + q(2422), + q(0), + ], + q(gbg) => [ + q(2423), + q(0), + ], + q(gbh) => [ + q(2424), + q(0), + ], + q(gbi) => [ + q(2425), + q(0), + ], + q(gbj) => [ + q(2426), + q(0), + ], + q(gbk) => [ + q(2427), + q(0), + ], + q(gbl) => [ + q(2428), + q(0), + ], + q(gbm) => [ + q(2429), + q(0), + ], + q(gbn) => [ + q(2430), + q(0), + ], + q(gbo) => [ + q(2431), + q(0), + ], + q(gbp) => [ + q(2432), + q(0), + ], + q(gbq) => [ + q(2433), + q(0), + ], + q(gbr) => [ + q(2434), + q(0), + ], + q(gbs) => [ + q(2435), + q(0), + ], + q(gbu) => [ + q(2436), + q(0), + ], + q(gbv) => [ + q(2437), + q(0), + ], + q(gbw) => [ + q(2438), + q(0), + ], + q(gbx) => [ + q(2439), + q(0), + ], + q(gby) => [ + q(2440), + q(0), + ], + q(gbz) => [ + q(2441), + q(0), + ], + q(gcc) => [ + q(2442), + q(0), + ], + q(gcd) => [ + q(2443), + q(0), + ], + q(gce) => [ + q(2444), + q(0), + ], + q(gcf) => [ + q(2445), + q(0), + ], + q(gcl) => [ + q(2446), + q(0), + ], + q(gcn) => [ + q(2447), + q(0), + ], + q(gcr) => [ + q(2448), + q(0), + ], + q(gct) => [ + q(2449), + q(0), + ], + q(gda) => [ + q(2450), + q(0), + ], + q(gdb) => [ + q(2451), + q(0), + ], + q(gdc) => [ + q(2452), + q(0), + ], + q(gdd) => [ + q(2453), + q(0), + ], + q(gde) => [ + q(2454), + q(0), + ], + q(gdf) => [ + q(2455), + q(0), + ], + q(gdg) => [ + q(2456), + q(0), + ], + q(gdh) => [ + q(2457), + q(0), + ], + q(gdi) => [ + q(2458), + q(0), + ], + q(gdj) => [ + q(2459), + q(0), + ], + q(gdk) => [ + q(2460), + q(0), + ], + q(gdl) => [ + q(2461), + q(0), + ], + q(gdm) => [ + q(2462), + q(0), + ], + q(gdn) => [ + q(2463), + q(0), + ], + q(gdo) => [ + q(2464), + q(0), + ], + q(gdq) => [ + q(2465), + q(0), + ], + q(gdr) => [ + q(2466), + q(0), + ], + q(gds) => [ + q(2467), + q(0), + ], + q(gdt) => [ + q(2468), + q(0), + ], + q(gdu) => [ + q(2469), + q(0), + ], + q(gdx) => [ + q(2470), + q(0), + ], + q(gea) => [ + q(2471), + q(0), + ], + q(geb) => [ + q(2472), + q(0), + ], + q(gec) => [ + q(2473), + q(0), + ], + q(ged) => [ + q(2474), + q(0), + ], + q(geg) => [ + q(2475), + q(0), + ], + q(geh) => [ + q(2476), + q(0), + ], + q(gei) => [ + q(2477), + q(0), + ], + q(gej) => [ + q(2478), + q(0), + ], + q(gek) => [ + q(2479), + q(0), + ], + q(gel) => [ + q(2480), + q(0), + ], + q(gem) => [ + q(0149), + q(0), + ], + q(geo) => [ + q(0150), + q(0), + ], + q(geq) => [ + q(2481), + q(0), + ], + q(ger) => [ + q(0151), + q(0), + ], + q(ges) => [ + q(2482), + q(0), + ], + q(gev) => [ + q(2483), + q(0), + ], + q(gew) => [ + q(2484), + q(0), + ], + q(gex) => [ + q(2485), + q(0), + ], + q(gey) => [ + q(2486), + q(0), + ], + q(gez) => [ + q(0152), + q(0), + ], + q(gfk) => [ + q(2487), + q(0), + ], + q(gft) => [ + q(2488), + q(0), + ], + q(gga) => [ + q(2489), + q(0), + ], + q(ggb) => [ + q(2490), + q(0), + ], + q(ggd) => [ + q(2491), + q(0), + ], + q(gge) => [ + q(2492), + q(0), + ], + q(ggg) => [ + q(2493), + q(0), + ], + q(ggk) => [ + q(2494), + q(0), + ], + q(ggl) => [ + q(2495), + q(0), + ], + q(ggt) => [ + q(2496), + q(0), + ], + q(ggu) => [ + q(2497), + q(0), + ], + q(ggw) => [ + q(2498), + q(0), + ], + q(gha) => [ + q(2499), + q(0), + ], + q(ghc) => [ + q(2500), + q(0), + ], + q(ghe) => [ + q(2501), + q(0), + ], + q(ghh) => [ + q(2502), + q(0), + ], + q(ghk) => [ + q(2503), + q(0), + ], + q(ghl) => [ + q(2504), + q(0), + ], + q(ghn) => [ + q(2505), + q(0), + ], + q(gho) => [ + q(2506), + q(0), + ], + q(ghr) => [ + q(2507), + q(0), + ], + q(ghs) => [ + q(2508), + q(0), + ], + q(ght) => [ + q(2509), + q(0), + ], + q(gia) => [ + q(2510), + q(0), + ], + q(gib) => [ + q(2511), + q(0), + ], + q(gic) => [ + q(2512), + q(0), + ], + q(gid) => [ + q(2513), + q(0), + ], + q(gie) => [ + q(2514), + q(0), + ], + q(gig) => [ + q(2515), + q(0), + ], + q(gih) => [ + q(2516), + q(0), + ], + q(gil) => [ + q(0153), + q(0), + ], + q(gim) => [ + q(2517), + q(0), + ], + q(gin) => [ + q(2518), + q(0), + ], + q(gip) => [ + q(2519), + q(0), + ], + q(giq) => [ + q(2520), + q(0), + ], + q(gir) => [ + q(2521), + q(0), + ], + q(gis) => [ + q(2522), + q(0), + ], + q(git) => [ + q(2523), + q(0), + ], + q(giu) => [ + q(2524), + q(0), + ], + q(giw) => [ + q(2525), + q(0), + ], + q(gix) => [ + q(2526), + q(0), + ], + q(giy) => [ + q(2527), + q(0), + ], + q(giz) => [ + q(2528), + q(0), + ], + q(gji) => [ + q(2529), + q(0), + ], + q(gjk) => [ + q(2530), + q(0), + ], + q(gjm) => [ + q(2531), + q(0), + ], + q(gjn) => [ + q(2532), + q(0), + ], + q(gjr) => [ + q(2533), + q(0), + ], + q(gju) => [ + q(2534), + q(0), + ], + q(gka) => [ + q(2535), + q(0), + ], + q(gke) => [ + q(2536), + q(0), + ], + q(gkn) => [ + q(2537), + q(0), + ], + q(gko) => [ + q(2538), + q(0), + ], + q(gkp) => [ + q(2539), + q(0), + ], + q(gku) => [ + q(2540), + q(0), + ], + q(gla) => [ + q(0154), + q(0), + ], + q(glc) => [ + q(2541), + q(0), + ], + q(gld) => [ + q(2542), + q(0), + ], + q(gle) => [ + q(0155), + q(0), + ], + q(glg) => [ + q(0156), + q(0), + ], + q(glh) => [ + q(2543), + q(0), + ], + q(gli) => [ + q(2544), + q(0), + ], + q(glj) => [ + q(2545), + q(0), + ], + q(glk) => [ + q(2546), + q(0), + ], + q(gll) => [ + q(2547), + q(0), + ], + q(glo) => [ + q(2548), + q(0), + ], + q(glr) => [ + q(2549), + q(0), + ], + q(glu) => [ + q(2550), + q(0), + ], + q(glv) => [ + q(0157), + q(0), + ], + q(glw) => [ + q(2551), + q(0), + ], + q(gly) => [ + q(2552), + q(0), + ], + q(gma) => [ + q(2553), + q(0), + ], + q(gmb) => [ + q(2554), + q(0), + ], + q(gmd) => [ + q(2555), + q(0), + ], + q(gme) => [ + q(0506), + q(0), + ], + q(gmg) => [ + q(2556), + q(0), + ], + q(gmh) => [ + q(0158), + q(1), + ], + q(gml) => [ + q(2557), + q(0), + ], + q(gmm) => [ + q(2558), + q(0), + ], + q(gmn) => [ + q(2559), + q(0), + ], + q(gmq) => [ + q(0507), + q(0), + ], + q(gmu) => [ + q(2560), + q(0), + ], + q(gmv) => [ + q(2561), + q(0), + ], + q(gmw) => [ + q(0508), + q(0), + ], + q(gmx) => [ + q(2562), + q(0), + ], + q(gmy) => [ + q(2563), + q(0), + ], + q(gmz) => [ + q(2564), + q(0), + ], + q(gna) => [ + q(2565), + q(0), + ], + q(gnb) => [ + q(2566), + q(0), + ], + q(gnc) => [ + q(2567), + q(0), + ], + q(gnd) => [ + q(2568), + q(0), + ], + q(gne) => [ + q(2569), + q(0), + ], + q(gng) => [ + q(2570), + q(0), + ], + q(gnh) => [ + q(2571), + q(0), + ], + q(gni) => [ + q(2572), + q(0), + ], + q(gnk) => [ + q(2573), + q(0), + ], + q(gnl) => [ + q(2574), + q(0), + ], + q(gnm) => [ + q(2575), + q(0), + ], + q(gnn) => [ + q(2576), + q(0), + ], + q(gno) => [ + q(2577), + q(0), + ], + q(gnq) => [ + q(2573), + q(1), + ], + q(gnr) => [ + q(2578), + q(0), + ], + q(gnt) => [ + q(2579), + q(0), + ], + q(gnu) => [ + q(2580), + q(0), + ], + q(gnw) => [ + q(2581), + q(0), + ], + q(gnz) => [ + q(2582), + q(0), + ], + q(goa) => [ + q(2583), + q(0), + ], + q(gob) => [ + q(2584), + q(0), + ], + q(goc) => [ + q(2585), + q(0), + ], + q(god) => [ + q(2586), + q(0), + ], + q(goe) => [ + q(2587), + q(0), + ], + q(gof) => [ + q(2588), + q(0), + ], + q(gog) => [ + q(2589), + q(0), + ], + q(goh) => [ + q(0159), + q(1), + ], + q(goi) => [ + q(2590), + q(0), + ], + q(goj) => [ + q(2591), + q(0), + ], + q(gok) => [ + q(2592), + q(0), + ], + q(gol) => [ + q(2593), + q(0), + ], + q(gom) => [ + q(2594), + q(0), + ], + q(gon) => [ + q(0160), + q(0), + ], + q(goo) => [ + q(2595), + q(0), + ], + q(gop) => [ + q(2596), + q(0), + ], + q(goq) => [ + q(2597), + q(0), + ], + q(gor) => [ + q(0161), + q(0), + ], + q(gos) => [ + q(2598), + q(0), + ], + q(got) => [ + q(0162), + q(0), + ], + q(gou) => [ + q(2599), + q(0), + ], + q(gow) => [ + q(2600), + q(0), + ], + q(gox) => [ + q(2601), + q(0), + ], + q(goy) => [ + q(2602), + q(0), + ], + q(goz) => [ + q(2603), + q(0), + ], + q(gpa) => [ + q(2604), + q(0), + ], + q(gpe) => [ + q(2605), + q(0), + ], + q(gpn) => [ + q(2606), + q(0), + ], + q(gqa) => [ + q(2607), + q(0), + ], + q(gqi) => [ + q(2608), + q(0), + ], + q(gqn) => [ + q(2609), + q(0), + ], + q(gqr) => [ + q(2610), + q(0), + ], + q(gqu) => [ + q(2611), + q(0), + ], + q(gra) => [ + q(2612), + q(0), + ], + q(grb) => [ + q(0163), + q(0), + ], + q(grc) => [ + q(0164), + q(1), + ], + q(grd) => [ + q(2613), + q(0), + ], + q(gre) => [ + q(0165), + q(0), + ], + q(grg) => [ + q(2614), + q(0), + ], + q(grh) => [ + q(2615), + q(0), + ], + q(gri) => [ + q(2616), + q(0), + ], + q(grj) => [ + q(2617), + q(0), + ], + q(grk) => [ + q(0509), + q(0), + ], + q(grm) => [ + q(2618), + q(0), + ], + q(grn) => [ + q(0166), + q(0), + ], + q(gro) => [ + q(2619), + q(0), + ], + q(grq) => [ + q(2620), + q(0), + ], + q(grr) => [ + q(2621), + q(0), + ], + q(grs) => [ + q(2622), + q(0), + ], + q(grt) => [ + q(2623), + q(0), + ], + q(gru) => [ + q(2624), + q(0), + ], + q(grv) => [ + q(2625), + q(0), + ], + q(grw) => [ + q(2626), + q(0), + ], + q(grx) => [ + q(2627), + q(0), + ], + q(gry) => [ + q(2628), + q(0), + ], + q(grz) => [ + q(2629), + q(0), + ], + q(gse) => [ + q(2630), + q(0), + ], + q(gsg) => [ + q(2631), + q(0), + ], + q(gsl) => [ + q(2632), + q(0), + ], + q(gsm) => [ + q(2633), + q(0), + ], + q(gsn) => [ + q(2634), + q(0), + ], + q(gso) => [ + q(2635), + q(0), + ], + q(gsp) => [ + q(2636), + q(0), + ], + q(gss) => [ + q(2637), + q(0), + ], + q(gsw) => [ + q(0167), + q(0), + ], + q(gta) => [ + q(2638), + q(0), + ], + q(gtu) => [ + q(2639), + q(0), + ], + q(gua) => [ + q(2640), + q(0), + ], + q(gub) => [ + q(2641), + q(0), + ], + q(guc) => [ + q(2642), + q(0), + ], + q(gud) => [ + q(2643), + q(0), + ], + q(gue) => [ + q(2644), + q(0), + ], + q(guf) => [ + q(2645), + q(0), + ], + q(gug) => [ + q(2646), + q(0), + ], + q(guh) => [ + q(2647), + q(0), + ], + q(gui) => [ + q(2648), + q(0), + ], + q(guj) => [ + q(0168), + q(0), + ], + q(guk) => [ + q(2649), + q(0), + ], + q(gul) => [ + q(2650), + q(0), + ], + q(gum) => [ + q(2651), + q(0), + ], + q(gun) => [ + q(2652), + q(0), + ], + q(guo) => [ + q(2653), + q(0), + ], + q(gup) => [ + q(2654), + q(0), + ], + q(guq) => [ + q(2655), + q(0), + ], + q(gur) => [ + q(2656), + q(0), + ], + q(gus) => [ + q(2657), + q(0), + ], + q(gut) => [ + q(2658), + q(0), + ], + q(guu) => [ + q(2659), + q(0), + ], + q(guw) => [ + q(2660), + q(0), + ], + q(gux) => [ + q(2661), + q(0), + ], + q(guz) => [ + q(2662), + q(0), + ], + q(gva) => [ + q(2663), + q(0), + ], + q(gvc) => [ + q(2664), + q(0), + ], + q(gve) => [ + q(2665), + q(0), + ], + q(gvf) => [ + q(2666), + q(0), + ], + q(gvj) => [ + q(2667), + q(0), + ], + q(gvl) => [ + q(2668), + q(0), + ], + q(gvm) => [ + q(2669), + q(0), + ], + q(gvn) => [ + q(2670), + q(0), + ], + q(gvo) => [ + q(2671), + q(0), + ], + q(gvp) => [ + q(2672), + q(0), + ], + q(gvr) => [ + q(2673), + q(0), + ], + q(gvs) => [ + q(2674), + q(0), + ], + q(gvy) => [ + q(2675), + q(0), + ], + q(gwa) => [ + q(2676), + q(0), + ], + q(gwb) => [ + q(2677), + q(0), + ], + q(gwc) => [ + q(2678), + q(0), + ], + q(gwd) => [ + q(2679), + q(0), + ], + q(gwe) => [ + q(2680), + q(0), + ], + q(gwf) => [ + q(2681), + q(0), + ], + q(gwg) => [ + q(2682), + q(0), + ], + q(gwi) => [ + q(0169), + q(0), + ], + q(gwj) => [ + q(2683), + q(0), + ], + q(gwm) => [ + q(2684), + q(0), + ], + q(gwn) => [ + q(2685), + q(0), + ], + q(gwr) => [ + q(2686), + q(0), + ], + q(gwt) => [ + q(2687), + q(0), + ], + q(gwu) => [ + q(2688), + q(0), + ], + q(gww) => [ + q(2689), + q(0), + ], + q(gwx) => [ + q(2690), + q(0), + ], + q(gxx) => [ + q(2691), + q(0), + ], + q(gya) => [ + q(2692), + q(0), + ], + q(gyb) => [ + q(2693), + q(0), + ], + q(gyd) => [ + q(2694), + q(0), + ], + q(gye) => [ + q(2695), + q(0), + ], + q(gyf) => [ + q(2696), + q(0), + ], + q(gyg) => [ + q(2697), + q(0), + ], + q(gyi) => [ + q(2698), + q(0), + ], + q(gyl) => [ + q(2699), + q(0), + ], + q(gym) => [ + q(2700), + q(0), + ], + q(gyn) => [ + q(2701), + q(0), + ], + q(gyr) => [ + q(2702), + q(0), + ], + q(gyy) => [ + q(2703), + q(0), + ], + q(gza) => [ + q(2704), + q(0), + ], + q(gzi) => [ + q(2705), + q(0), + ], + q(gzn) => [ + q(2706), + q(0), + ], + q(haa) => [ + q(2707), + q(0), + ], + q(hab) => [ + q(2708), + q(0), + ], + q(hac) => [ + q(2709), + q(0), + ], + q(had) => [ + q(2710), + q(0), + ], + q(hae) => [ + q(2711), + q(0), + ], + q(haf) => [ + q(2712), + q(0), + ], + q(hag) => [ + q(2713), + q(0), + ], + q(hah) => [ + q(2714), + q(0), + ], + q(hai) => [ + q(0170), + q(0), + ], + q(haj) => [ + q(2715), + q(0), + ], + q(hak) => [ + q(2716), + q(0), + ], + q(hal) => [ + q(2717), + q(0), + ], + q(ham) => [ + q(2718), + q(0), + ], + q(han) => [ + q(2719), + q(0), + ], + q(hao) => [ + q(2720), + q(0), + ], + q(hap) => [ + q(2721), + q(0), + ], + q(haq) => [ + q(2722), + q(0), + ], + q(har) => [ + q(2723), + q(0), + ], + q(has) => [ + q(2724), + q(0), + ], + q(hat) => [ + q(0171), + q(0), + ], + q(hau) => [ + q(0172), + q(0), + ], + q(hav) => [ + q(2725), + q(0), + ], + q(haw) => [ + q(0173), + q(0), + ], + q(hax) => [ + q(2726), + q(0), + ], + q(hay) => [ + q(2727), + q(0), + ], + q(haz) => [ + q(2728), + q(0), + ], + q(hba) => [ + q(2729), + q(0), + ], + q(hbb) => [ + q(2730), + q(0), + ], + q(hbn) => [ + q(2731), + q(0), + ], + q(hbo) => [ + q(2732), + q(0), + ], + q(hbu) => [ + q(2733), + q(0), + ], + q(hca) => [ + q(2734), + q(0), + ], + q(hch) => [ + q(2735), + q(0), + ], + q(hdn) => [ + q(2736), + q(0), + ], + q(hds) => [ + q(2737), + q(0), + ], + q(hdy) => [ + q(2738), + q(0), + ], + q(hea) => [ + q(2739), + q(0), + ], + q(heb) => [ + q(0174), + q(0), + ], + q(hed) => [ + q(2740), + q(0), + ], + q(heg) => [ + q(2741), + q(0), + ], + q(heh) => [ + q(2742), + q(0), + ], + q(hei) => [ + q(2743), + q(0), + ], + q(hem) => [ + q(2744), + q(0), + ], + q(her) => [ + q(0175), + q(0), + ], + q(hgm) => [ + q(2745), + q(0), + ], + q(hgw) => [ + q(2746), + q(0), + ], + q(hhi) => [ + q(2747), + q(0), + ], + q(hhr) => [ + q(2748), + q(0), + ], + q(hhy) => [ + q(2749), + q(0), + ], + q(hia) => [ + q(2750), + q(0), + ], + q(hib) => [ + q(2751), + q(0), + ], + q(hid) => [ + q(2752), + q(0), + ], + q(hif) => [ + q(2753), + q(0), + ], + q(hig) => [ + q(2754), + q(0), + ], + q(hih) => [ + q(2755), + q(0), + ], + q(hii) => [ + q(2756), + q(0), + ], + q(hij) => [ + q(2757), + q(0), + ], + q(hik) => [ + q(2758), + q(0), + ], + q(hil) => [ + q(0176), + q(0), + ], + q(him) => [ + q(0177), + q(0), + ], + q(hin) => [ + q(0178), + q(0), + ], + q(hio) => [ + q(2759), + q(0), + ], + q(hir) => [ + q(2760), + q(0), + ], + q(hit) => [ + q(0179), + q(0), + ], + q(hiw) => [ + q(2761), + q(0), + ], + q(hix) => [ + q(2762), + q(0), + ], + q(hji) => [ + q(2763), + q(0), + ], + q(hka) => [ + q(2764), + q(0), + ], + q(hke) => [ + q(2765), + q(0), + ], + q(hkk) => [ + q(2766), + q(0), + ], + q(hks) => [ + q(2767), + q(0), + ], + q(hla) => [ + q(2768), + q(0), + ], + q(hlb) => [ + q(2769), + q(0), + ], + q(hld) => [ + q(2770), + q(0), + ], + q(hle) => [ + q(2771), + q(0), + ], + q(hlt) => [ + q(2772), + q(0), + ], + q(hlu) => [ + q(2773), + q(0), + ], + q(hma) => [ + q(2774), + q(0), + ], + q(hmb) => [ + q(2775), + q(0), + ], + q(hmc) => [ + q(2776), + q(0), + ], + q(hmd) => [ + q(2777), + q(0), + ], + q(hme) => [ + q(2778), + q(0), + ], + q(hmf) => [ + q(2779), + q(0), + ], + q(hmg) => [ + q(2780), + q(0), + ], + q(hmh) => [ + q(2781), + q(0), + ], + q(hmi) => [ + q(2782), + q(0), + ], + q(hmj) => [ + q(2783), + q(0), + ], + q(hmk) => [ + q(2784), + q(0), + ], + q(hml) => [ + q(2785), + q(0), + ], + q(hmm) => [ + q(2786), + q(0), + ], + q(hmn) => [ + q(0180), + q(0), + ], + q(hmo) => [ + q(0181), + q(0), + ], + q(hmp) => [ + q(2787), + q(0), + ], + q(hmq) => [ + q(2788), + q(0), + ], + q(hmr) => [ + q(2789), + q(0), + ], + q(hms) => [ + q(2790), + q(0), + ], + q(hmt) => [ + q(2791), + q(0), + ], + q(hmu) => [ + q(2792), + q(0), + ], + q(hmv) => [ + q(2793), + q(0), + ], + q(hmw) => [ + q(2794), + q(0), + ], + q(hmx) => [ + q(0510), + q(0), + ], + q(hmy) => [ + q(2795), + q(0), + ], + q(hmz) => [ + q(2796), + q(0), + ], + q(hna) => [ + q(2797), + q(0), + ], + q(hnd) => [ + q(2798), + q(0), + ], + q(hne) => [ + q(2799), + q(0), + ], + q(hnh) => [ + q(2800), + q(0), + ], + q(hni) => [ + q(2801), + q(0), + ], + q(hnj) => [ + q(2802), + q(0), + ], + q(hnn) => [ + q(2803), + q(0), + ], + q(hno) => [ + q(2804), + q(0), + ], + q(hns) => [ + q(2805), + q(0), + ], + q(hnu) => [ + q(2806), + q(0), + ], + q(hoa) => [ + q(2807), + q(0), + ], + q(hob) => [ + q(2808), + q(0), + ], + q(hoc) => [ + q(2809), + q(0), + ], + q(hod) => [ + q(2810), + q(0), + ], + q(hoe) => [ + q(2811), + q(0), + ], + q(hoh) => [ + q(2812), + q(0), + ], + q(hoi) => [ + q(2813), + q(0), + ], + q(hoj) => [ + q(2814), + q(0), + ], + q(hok) => [ + q(0511), + q(0), + ], + q(hol) => [ + q(2815), + q(0), + ], + q(hom) => [ + q(2816), + q(0), + ], + q(hoo) => [ + q(2817), + q(0), + ], + q(hop) => [ + q(2818), + q(0), + ], + q(hor) => [ + q(2819), + q(0), + ], + q(hos) => [ + q(2820), + q(0), + ], + q(hot) => [ + q(2821), + q(0), + ], + q(hov) => [ + q(2822), + q(0), + ], + q(how) => [ + q(2823), + q(0), + ], + q(hoy) => [ + q(2824), + q(0), + ], + q(hoz) => [ + q(2825), + q(0), + ], + q(hpo) => [ + q(2826), + q(0), + ], + q(hps) => [ + q(2827), + q(0), + ], + q(hra) => [ + q(2828), + q(0), + ], + q(hrc) => [ + q(2829), + q(0), + ], + q(hre) => [ + q(2830), + q(0), + ], + q(hrk) => [ + q(2831), + q(0), + ], + q(hrm) => [ + q(2832), + q(0), + ], + q(hro) => [ + q(2833), + q(0), + ], + q(hrp) => [ + q(2834), + q(0), + ], + q(hrt) => [ + q(2835), + q(0), + ], + q(hru) => [ + q(2836), + q(0), + ], + q(hrv) => [ + q(0182), + q(0), + ], + q(hrw) => [ + q(2837), + q(0), + ], + q(hrx) => [ + q(2838), + q(0), + ], + q(hrz) => [ + q(2839), + q(0), + ], + q(hsb) => [ + q(0183), + q(0), + ], + q(hsh) => [ + q(2840), + q(0), + ], + q(hsl) => [ + q(2841), + q(0), + ], + q(hsn) => [ + q(2842), + q(0), + ], + q(hss) => [ + q(2843), + q(0), + ], + q(hti) => [ + q(2844), + q(0), + ], + q(hto) => [ + q(2845), + q(0), + ], + q(hts) => [ + q(2846), + q(0), + ], + q(htu) => [ + q(2847), + q(0), + ], + q(htx) => [ + q(2848), + q(0), + ], + q(hub) => [ + q(2849), + q(0), + ], + q(huc) => [ + q(2850), + q(0), + ], + q(hud) => [ + q(2851), + q(0), + ], + q(hue) => [ + q(2852), + q(0), + ], + q(huf) => [ + q(2853), + q(0), + ], + q(hug) => [ + q(2854), + q(0), + ], + q(huh) => [ + q(2855), + q(0), + ], + q(hui) => [ + q(2856), + q(0), + ], + q(huj) => [ + q(2857), + q(0), + ], + q(huk) => [ + q(2858), + q(0), + ], + q(hul) => [ + q(2859), + q(0), + ], + q(hum) => [ + q(2860), + q(0), + ], + q(hun) => [ + q(0184), + q(0), + ], + q(huo) => [ + q(2861), + q(0), + ], + q(hup) => [ + q(0185), + q(0), + ], + q(huq) => [ + q(2862), + q(0), + ], + q(hur) => [ + q(2863), + q(0), + ], + q(hus) => [ + q(2864), + q(0), + ], + q(hut) => [ + q(2865), + q(0), + ], + q(huu) => [ + q(2866), + q(0), + ], + q(huv) => [ + q(2867), + q(0), + ], + q(huw) => [ + q(2868), + q(0), + ], + q(hux) => [ + q(2869), + q(0), + ], + q(huy) => [ + q(2870), + q(0), + ], + q(huz) => [ + q(2871), + q(0), + ], + q(hvc) => [ + q(2872), + q(0), + ], + q(hve) => [ + q(2873), + q(0), + ], + q(hvk) => [ + q(2874), + q(0), + ], + q(hvn) => [ + q(2875), + q(0), + ], + q(hvv) => [ + q(2876), + q(0), + ], + q(hwa) => [ + q(2877), + q(0), + ], + q(hwc) => [ + q(2878), + q(0), + ], + q(hwo) => [ + q(2879), + q(0), + ], + q(hya) => [ + q(2880), + q(0), + ], + q(hyx) => [ + q(0512), + q(0), + ], + q(iai) => [ + q(2881), + q(0), + ], + q(ian) => [ + q(2882), + q(0), + ], + q(iar) => [ + q(2883), + q(0), + ], + q(iba) => [ + q(0186), + q(0), + ], + q(ibb) => [ + q(2884), + q(0), + ], + q(ibd) => [ + q(2885), + q(0), + ], + q(ibe) => [ + q(2886), + q(0), + ], + q(ibg) => [ + q(2887), + q(0), + ], + q(ibh) => [ + q(2888), + q(0), + ], + q(ibl) => [ + q(2889), + q(0), + ], + q(ibm) => [ + q(2890), + q(0), + ], + q(ibn) => [ + q(2891), + q(0), + ], + q(ibo) => [ + q(0187), + q(0), + ], + q(ibr) => [ + q(2892), + q(0), + ], + q(ibu) => [ + q(2893), + q(0), + ], + q(iby) => [ + q(2894), + q(0), + ], + q(ica) => [ + q(2895), + q(0), + ], + q(ice) => [ + q(0188), + q(0), + ], + q(ich) => [ + q(2896), + q(0), + ], + q(icl) => [ + q(2897), + q(0), + ], + q(icr) => [ + q(2898), + q(0), + ], + q(ida) => [ + q(2899), + q(0), + ], + q(idb) => [ + q(2900), + q(0), + ], + q(idc) => [ + q(2901), + q(0), + ], + q(idd) => [ + q(2902), + q(0), + ], + q(ide) => [ + q(2903), + q(0), + ], + q(idi) => [ + q(2904), + q(0), + ], + q(ido) => [ + q(0189), + q(0), + ], + q(idr) => [ + q(2905), + q(0), + ], + q(ids) => [ + q(2906), + q(0), + ], + q(idt) => [ + q(2907), + q(0), + ], + q(idu) => [ + q(2908), + q(0), + ], + q(ifa) => [ + q(2909), + q(0), + ], + q(ifb) => [ + q(2910), + q(0), + ], + q(ife) => [ + q(2911), + q(0), + ], + q(iff) => [ + q(2912), + q(0), + ], + q(ifk) => [ + q(2913), + q(0), + ], + q(ifm) => [ + q(2914), + q(0), + ], + q(ifu) => [ + q(2915), + q(0), + ], + q(ify) => [ + q(2916), + q(0), + ], + q(igb) => [ + q(2917), + q(0), + ], + q(ige) => [ + q(2918), + q(0), + ], + q(igg) => [ + q(2919), + q(0), + ], + q(igl) => [ + q(2920), + q(0), + ], + q(igm) => [ + q(2921), + q(0), + ], + q(ign) => [ + q(2922), + q(0), + ], + q(igo) => [ + q(2923), + q(0), + ], + q(igs) => [ + q(2924), + q(0), + ], + q(igw) => [ + q(2925), + q(0), + ], + q(ihb) => [ + q(2926), + q(0), + ], + q(ihi) => [ + q(2927), + q(0), + ], + q(ihp) => [ + q(2928), + q(0), + ], + q(ihw) => [ + q(2929), + q(0), + ], + q(iii) => [ + q(0190), + q(0), + ], + q(iin) => [ + q(2930), + q(0), + ], + q(iir) => [ + q(0513), + q(0), + ], + q(ijc) => [ + q(2931), + q(0), + ], + q(ije) => [ + q(2932), + q(0), + ], + q(ijj) => [ + q(2933), + q(0), + ], + q(ijn) => [ + q(2934), + q(0), + ], + q(ijo) => [ + q(0191), + q(0), + ], + q(ijs) => [ + q(2935), + q(0), + ], + q(ike) => [ + q(2936), + q(0), + ], + q(iki) => [ + q(2937), + q(0), + ], + q(ikk) => [ + q(2938), + q(0), + ], + q(ikl) => [ + q(2939), + q(0), + ], + q(iko) => [ + q(2940), + q(0), + ], + q(ikp) => [ + q(2941), + q(0), + ], + q(ikr) => [ + q(2942), + q(0), + ], + q(iks) => [ + q(2943), + q(0), + ], + q(ikt) => [ + q(2944), + q(0), + ], + q(iku) => [ + q(0192), + q(0), + ], + q(ikv) => [ + q(2945), + q(0), + ], + q(ikw) => [ + q(2946), + q(0), + ], + q(ikx) => [ + q(2947), + q(0), + ], + q(ikz) => [ + q(2948), + q(0), + ], + q(ila) => [ + q(2949), + q(0), + ], + q(ilb) => [ + q(2950), + q(0), + ], + q(ile) => [ + q(0193), + q(0), + ], + q(ilg) => [ + q(2951), + q(0), + ], + q(ili) => [ + q(2952), + q(0), + ], + q(ilk) => [ + q(2953), + q(0), + ], + q(ilm) => [ + q(2954), + q(0), + ], + q(ilo) => [ + q(0194), + q(0), + ], + q(ilp) => [ + q(2955), + q(0), + ], + q(ils) => [ + q(2956), + q(0), + ], + q(ilu) => [ + q(2957), + q(0), + ], + q(ilv) => [ + q(2958), + q(0), + ], + q(ima) => [ + q(2959), + q(0), + ], + q(imi) => [ + q(2960), + q(0), + ], + q(iml) => [ + q(2961), + q(0), + ], + q(imn) => [ + q(2962), + q(0), + ], + q(imo) => [ + q(2963), + q(0), + ], + q(imr) => [ + q(2964), + q(0), + ], + q(ims) => [ + q(2965), + q(0), + ], + q(imy) => [ + q(2966), + q(0), + ], + q(ina) => [ + q(0195), + q(0), + ], + q(inb) => [ + q(2967), + q(0), + ], + q(inc) => [ + q(0196), + q(0), + ], + q(ind) => [ + q(0197), + q(0), + ], + q(ine) => [ + q(0198), + q(0), + ], + q(ing) => [ + q(2968), + q(0), + ], + q(inh) => [ + q(0199), + q(0), + ], + q(inj) => [ + q(2969), + q(0), + ], + q(inl) => [ + q(2970), + q(0), + ], + q(inm) => [ + q(2971), + q(0), + ], + q(inn) => [ + q(2972), + q(0), + ], + q(ino) => [ + q(2973), + q(0), + ], + q(inp) => [ + q(2974), + q(0), + ], + q(ins) => [ + q(2975), + q(0), + ], + q(int) => [ + q(2976), + q(0), + ], + q(inz) => [ + q(2977), + q(0), + ], + q(ior) => [ + q(2978), + q(0), + ], + q(iou) => [ + q(2979), + q(0), + ], + q(iow) => [ + q(2980), + q(0), + ], + q(ipi) => [ + q(2981), + q(0), + ], + q(ipk) => [ + q(0200), + q(0), + ], + q(ipo) => [ + q(2982), + q(0), + ], + q(iqu) => [ + q(2983), + q(0), + ], + q(iqw) => [ + q(2984), + q(0), + ], + q(ira) => [ + q(0201), + q(0), + ], + q(ire) => [ + q(2985), + q(0), + ], + q(irh) => [ + q(2986), + q(0), + ], + q(iri) => [ + q(2987), + q(0), + ], + q(irk) => [ + q(2988), + q(0), + ], + q(irn) => [ + q(2989), + q(0), + ], + q(iro) => [ + q(0202), + q(0), + ], + q(irr) => [ + q(2990), + q(0), + ], + q(iru) => [ + q(2991), + q(0), + ], + q(irx) => [ + q(2992), + q(0), + ], + q(iry) => [ + q(2993), + q(0), + ], + q(isa) => [ + q(2994), + q(0), + ], + q(isc) => [ + q(2995), + q(0), + ], + q(isd) => [ + q(2996), + q(0), + ], + q(ise) => [ + q(2997), + q(0), + ], + q(isg) => [ + q(2998), + q(0), + ], + q(ish) => [ + q(2999), + q(0), + ], + q(isi) => [ + q(3000), + q(0), + ], + q(isk) => [ + q(3001), + q(0), + ], + q(ism) => [ + q(3002), + q(0), + ], + q(isn) => [ + q(3003), + q(0), + ], + q(iso) => [ + q(3004), + q(0), + ], + q(isr) => [ + q(3005), + q(0), + ], + q(ist) => [ + q(3006), + q(0), + ], + q(isu) => [ + q(3007), + q(0), + ], + q(ita) => [ + q(0203), + q(0), + ], + q(itb) => [ + q(3008), + q(0), + ], + q(itc) => [ + q(0514), + q(0), + ], + q(itd) => [ + q(3009), + q(0), + ], + q(ite) => [ + q(3010), + q(0), + ], + q(iti) => [ + q(3011), + q(0), + ], + q(itk) => [ + q(3012), + q(0), + ], + q(itl) => [ + q(3013), + q(0), + ], + q(itm) => [ + q(3014), + q(0), + ], + q(ito) => [ + q(3015), + q(0), + ], + q(itr) => [ + q(3016), + q(0), + ], + q(its) => [ + q(3017), + q(0), + ], + q(itt) => [ + q(3018), + q(0), + ], + q(itv) => [ + q(3019), + q(0), + ], + q(itw) => [ + q(3020), + q(0), + ], + q(itx) => [ + q(3021), + q(0), + ], + q(ity) => [ + q(3022), + q(0), + ], + q(itz) => [ + q(3023), + q(0), + ], + q(ium) => [ + q(3024), + q(0), + ], + q(ivb) => [ + q(3025), + q(0), + ], + q(ivv) => [ + q(3026), + q(0), + ], + q(iwk) => [ + q(3027), + q(0), + ], + q(iwm) => [ + q(3028), + q(0), + ], + q(iwo) => [ + q(3029), + q(0), + ], + q(iws) => [ + q(3030), + q(0), + ], + q(ixc) => [ + q(3031), + q(0), + ], + q(ixl) => [ + q(3032), + q(0), + ], + q(iya) => [ + q(3033), + q(0), + ], + q(iyo) => [ + q(3034), + q(0), + ], + q(iyx) => [ + q(3035), + q(0), + ], + q(izh) => [ + q(3036), + q(0), + ], + q(izr) => [ + q(3037), + q(0), + ], + q(izz) => [ + q(3038), + q(0), + ], + q(jaa) => [ + q(3039), + q(0), + ], + q(jab) => [ + q(3040), + q(0), + ], + q(jac) => [ + q(3041), + q(0), + ], + q(jad) => [ + q(3042), + q(0), + ], + q(jae) => [ + q(3043), + q(0), + ], + q(jaf) => [ + q(3044), + q(0), + ], + q(jah) => [ + q(3045), + q(0), + ], + q(jaj) => [ + q(3046), + q(0), + ], + q(jak) => [ + q(3047), + q(0), + ], + q(jal) => [ + q(3048), + q(0), + ], + q(jam) => [ + q(3049), + q(0), + ], + q(jan) => [ + q(3050), + q(0), + ], + q(jao) => [ + q(3051), + q(0), + ], + q(jaq) => [ + q(3052), + q(0), + ], + q(jas) => [ + q(3053), + q(0), + ], + q(jat) => [ + q(3054), + q(0), + ], + q(jau) => [ + q(3055), + q(0), + ], + q(jav) => [ + q(0204), + q(0), + ], + q(jax) => [ + q(3056), + q(0), + ], + q(jay) => [ + q(3057), + q(0), + ], + q(jaz) => [ + q(3058), + q(0), + ], + q(jbe) => [ + q(3059), + q(0), + ], + q(jbi) => [ + q(3060), + q(0), + ], + q(jbj) => [ + q(3061), + q(0), + ], + q(jbk) => [ + q(3062), + q(0), + ], + q(jbn) => [ + q(3063), + q(0), + ], + q(jbo) => [ + q(0205), + q(0), + ], + q(jbr) => [ + q(3064), + q(0), + ], + q(jbt) => [ + q(3065), + q(0), + ], + q(jbu) => [ + q(3066), + q(0), + ], + q(jbw) => [ + q(3067), + q(0), + ], + q(jcs) => [ + q(3068), + q(0), + ], + q(jct) => [ + q(3069), + q(0), + ], + q(jda) => [ + q(3070), + q(0), + ], + q(jdg) => [ + q(3071), + q(0), + ], + q(jdt) => [ + q(3072), + q(0), + ], + q(jeb) => [ + q(3073), + q(0), + ], + q(jee) => [ + q(3074), + q(0), + ], + q(jeh) => [ + q(3075), + q(0), + ], + q(jei) => [ + q(3076), + q(0), + ], + q(jek) => [ + q(3077), + q(0), + ], + q(jel) => [ + q(3078), + q(0), + ], + q(jen) => [ + q(3079), + q(0), + ], + q(jer) => [ + q(3080), + q(0), + ], + q(jet) => [ + q(3081), + q(0), + ], + q(jeu) => [ + q(3082), + q(0), + ], + q(jgb) => [ + q(3083), + q(0), + ], + q(jge) => [ + q(3084), + q(0), + ], + q(jgk) => [ + q(3085), + q(0), + ], + q(jgo) => [ + q(3086), + q(0), + ], + q(jhi) => [ + q(3087), + q(0), + ], + q(jhs) => [ + q(3088), + q(0), + ], + q(jia) => [ + q(3089), + q(0), + ], + q(jib) => [ + q(3090), + q(0), + ], + q(jic) => [ + q(3091), + q(0), + ], + q(jid) => [ + q(3092), + q(0), + ], + q(jie) => [ + q(3093), + q(0), + ], + q(jig) => [ + q(3094), + q(0), + ], + q(jih) => [ + q(3095), + q(0), + ], + q(jii) => [ + q(3096), + q(0), + ], + q(jil) => [ + q(3097), + q(0), + ], + q(jim) => [ + q(3098), + q(0), + ], + q(jio) => [ + q(3099), + q(0), + ], + q(jiq) => [ + q(3100), + q(0), + ], + q(jit) => [ + q(3101), + q(0), + ], + q(jiu) => [ + q(3102), + q(0), + ], + q(jiv) => [ + q(3103), + q(0), + ], + q(jiy) => [ + q(3104), + q(0), + ], + q(jje) => [ + q(3105), + q(0), + ], + q(jjr) => [ + q(3106), + q(0), + ], + q(jka) => [ + q(3107), + q(0), + ], + q(jkm) => [ + q(3108), + q(0), + ], + q(jko) => [ + q(3109), + q(0), + ], + q(jkp) => [ + q(3110), + q(0), + ], + q(jkr) => [ + q(3111), + q(0), + ], + q(jku) => [ + q(3112), + q(0), + ], + q(jle) => [ + q(3113), + q(0), + ], + q(jls) => [ + q(3114), + q(0), + ], + q(jma) => [ + q(3115), + q(0), + ], + q(jmb) => [ + q(3116), + q(0), + ], + q(jmc) => [ + q(3117), + q(0), + ], + q(jmd) => [ + q(3118), + q(0), + ], + q(jmi) => [ + q(3119), + q(0), + ], + q(jml) => [ + q(3120), + q(0), + ], + q(jmn) => [ + q(3121), + q(0), + ], + q(jmr) => [ + q(3122), + q(0), + ], + q(jms) => [ + q(3123), + q(0), + ], + q(jmw) => [ + q(3124), + q(0), + ], + q(jmx) => [ + q(3125), + q(0), + ], + q(jna) => [ + q(3126), + q(0), + ], + q(jnd) => [ + q(3127), + q(0), + ], + q(jng) => [ + q(3128), + q(0), + ], + q(jni) => [ + q(3129), + q(0), + ], + q(jnj) => [ + q(3130), + q(0), + ], + q(jnl) => [ + q(3131), + q(0), + ], + q(jns) => [ + q(3132), + q(0), + ], + q(job) => [ + q(3133), + q(0), + ], + q(jod) => [ + q(3134), + q(0), + ], + q(jog) => [ + q(3135), + q(0), + ], + q(jor) => [ + q(3136), + q(0), + ], + q(jos) => [ + q(3137), + q(0), + ], + q(jow) => [ + q(3138), + q(0), + ], + q(jpa) => [ + q(3139), + q(0), + ], + q(jpn) => [ + q(0206), + q(0), + ], + q(jpr) => [ + q(0207), + q(0), + ], + q(jpx) => [ + q(0515), + q(0), + ], + q(jqr) => [ + q(3140), + q(0), + ], + q(jra) => [ + q(3141), + q(0), + ], + q(jrb) => [ + q(0208), + q(0), + ], + q(jrr) => [ + q(3142), + q(0), + ], + q(jrt) => [ + q(3143), + q(0), + ], + q(jru) => [ + q(3144), + q(0), + ], + q(jsl) => [ + q(3145), + q(0), + ], + q(jua) => [ + q(3146), + q(0), + ], + q(jub) => [ + q(3147), + q(0), + ], + q(juc) => [ + q(3148), + q(0), + ], + q(jud) => [ + q(3149), + q(0), + ], + q(juh) => [ + q(3150), + q(0), + ], + q(jui) => [ + q(3151), + q(0), + ], + q(juk) => [ + q(3152), + q(0), + ], + q(jul) => [ + q(3153), + q(0), + ], + q(jum) => [ + q(3154), + q(0), + ], + q(jun) => [ + q(3155), + q(0), + ], + q(juo) => [ + q(3156), + q(0), + ], + q(jup) => [ + q(3157), + q(0), + ], + q(jur) => [ + q(3158), + q(0), + ], + q(jus) => [ + q(3159), + q(0), + ], + q(jut) => [ + q(3160), + q(0), + ], + q(juu) => [ + q(3161), + q(0), + ], + q(juw) => [ + q(3162), + q(0), + ], + q(juy) => [ + q(3163), + q(0), + ], + q(jvd) => [ + q(3164), + q(0), + ], + q(jvn) => [ + q(3165), + q(0), + ], + q(jwi) => [ + q(3166), + q(0), + ], + q(jya) => [ + q(3167), + q(0), + ], + q(jye) => [ + q(3168), + q(0), + ], + q(jyy) => [ + q(3169), + q(0), + ], + q(kaa) => [ + q(0209), + q(0), + ], + q(kab) => [ + q(0210), + q(0), + ], + q(kac) => [ + q(0211), + q(0), + ], + q(kad) => [ + q(3170), + q(0), + ], + q(kae) => [ + q(3171), + q(0), + ], + q(kaf) => [ + q(3172), + q(0), + ], + q(kag) => [ + q(3173), + q(0), + ], + q(kah) => [ + q(3174), + q(0), + ], + q(kai) => [ + q(3175), + q(0), + ], + q(kaj) => [ + q(3176), + q(0), + ], + q(kak) => [ + q(3177), + q(0), + ], + q(kal) => [ + q(0212), + q(0), + ], + q(kam) => [ + q(0213), + q(1), + ], + q(kan) => [ + q(0214), + q(0), + ], + q(kao) => [ + q(3178), + q(0), + ], + q(kap) => [ + q(3179), + q(0), + ], + q(kaq) => [ + q(3180), + q(0), + ], + q(kar) => [ + q(0215), + q(0), + ], + q(kas) => [ + q(0216), + q(0), + ], + q(kau) => [ + q(0217), + q(0), + ], + q(kav) => [ + q(3181), + q(0), + ], + q(kaw) => [ + q(0218), + q(0), + ], + q(kax) => [ + q(3182), + q(0), + ], + q(kay) => [ + q(3183), + q(0), + ], + q(kaz) => [ + q(0219), + q(0), + ], + q(kba) => [ + q(3184), + q(0), + ], + q(kbb) => [ + q(3185), + q(0), + ], + q(kbc) => [ + q(3186), + q(0), + ], + q(kbd) => [ + q(0220), + q(0), + ], + q(kbe) => [ + q(3187), + q(0), + ], + q(kbg) => [ + q(3188), + q(0), + ], + q(kbh) => [ + q(3189), + q(0), + ], + q(kbi) => [ + q(3190), + q(0), + ], + q(kbj) => [ + q(3191), + q(0), + ], + q(kbk) => [ + q(3192), + q(0), + ], + q(kbl) => [ + q(3193), + q(0), + ], + q(kbm) => [ + q(3194), + q(0), + ], + q(kbn) => [ + q(3195), + q(0), + ], + q(kbo) => [ + q(3196), + q(0), + ], + q(kbp) => [ + q(3197), + q(0), + ], + q(kbq) => [ + q(3198), + q(0), + ], + q(kbr) => [ + q(3199), + q(0), + ], + q(kbs) => [ + q(3200), + q(0), + ], + q(kbt) => [ + q(3201), + q(0), + ], + q(kbu) => [ + q(3202), + q(0), + ], + q(kbv) => [ + q(3203), + q(0), + ], + q(kbw) => [ + q(3204), + q(0), + ], + q(kbx) => [ + q(3205), + q(0), + ], + q(kby) => [ + q(3206), + q(0), + ], + q(kbz) => [ + q(3207), + q(0), + ], + q(kca) => [ + q(3208), + q(0), + ], + q(kcb) => [ + q(3209), + q(0), + ], + q(kcc) => [ + q(3210), + q(0), + ], + q(kcd) => [ + q(3211), + q(0), + ], + q(kce) => [ + q(3212), + q(0), + ], + q(kcf) => [ + q(3213), + q(0), + ], + q(kcg) => [ + q(3214), + q(0), + ], + q(kch) => [ + q(3215), + q(0), + ], + q(kci) => [ + q(3216), + q(0), + ], + q(kcj) => [ + q(3217), + q(0), + ], + q(kck) => [ + q(3218), + q(0), + ], + q(kcl) => [ + q(3219), + q(0), + ], + q(kcm) => [ + q(3220), + q(0), + ], + q(kcn) => [ + q(3221), + q(0), + ], + q(kco) => [ + q(3222), + q(0), + ], + q(kcp) => [ + q(3223), + q(0), + ], + q(kcq) => [ + q(3224), + q(0), + ], + q(kcr) => [ + q(3225), + q(0), + ], + q(kcs) => [ + q(3226), + q(0), + ], + q(kct) => [ + q(3227), + q(0), + ], + q(kcu) => [ + q(3228), + q(0), + ], + q(kcv) => [ + q(3229), + q(0), + ], + q(kcw) => [ + q(3230), + q(0), + ], + q(kcx) => [ + q(3231), + q(0), + ], + q(kcy) => [ + q(3232), + q(0), + ], + q(kcz) => [ + q(3233), + q(0), + ], + q(kda) => [ + q(3234), + q(0), + ], + q(kdc) => [ + q(3235), + q(0), + ], + q(kdd) => [ + q(3236), + q(0), + ], + q(kde) => [ + q(3237), + q(0), + ], + q(kdf) => [ + q(3238), + q(0), + ], + q(kdg) => [ + q(3239), + q(0), + ], + q(kdh) => [ + q(3240), + q(0), + ], + q(kdi) => [ + q(3241), + q(0), + ], + q(kdj) => [ + q(3242), + q(0), + ], + q(kdk) => [ + q(3243), + q(0), + ], + q(kdl) => [ + q(3244), + q(0), + ], + q(kdm) => [ + q(3245), + q(0), + ], + q(kdn) => [ + q(3246), + q(0), + ], + q(kdo) => [ + q(0516), + q(0), + ], + q(kdp) => [ + q(3247), + q(0), + ], + q(kdq) => [ + q(3248), + q(0), + ], + q(kdr) => [ + q(3249), + q(0), + ], + q(kdt) => [ + q(3250), + q(0), + ], + q(kdu) => [ + q(3251), + q(0), + ], + q(kdw) => [ + q(3252), + q(0), + ], + q(kdx) => [ + q(3253), + q(0), + ], + q(kdy) => [ + q(3254), + q(0), + ], + q(kdz) => [ + q(3255), + q(0), + ], + q(kea) => [ + q(3256), + q(0), + ], + q(keb) => [ + q(3257), + q(0), + ], + q(kec) => [ + q(3258), + q(0), + ], + q(ked) => [ + q(3259), + q(0), + ], + q(kee) => [ + q(3260), + q(0), + ], + q(kef) => [ + q(3261), + q(0), + ], + q(keg) => [ + q(3262), + q(0), + ], + q(keh) => [ + q(3263), + q(0), + ], + q(kei) => [ + q(3264), + q(0), + ], + q(kej) => [ + q(3265), + q(0), + ], + q(kek) => [ + q(3266), + q(0), + ], + q(kel) => [ + q(3267), + q(0), + ], + q(kem) => [ + q(3268), + q(0), + ], + q(ken) => [ + q(3269), + q(0), + ], + q(keo) => [ + q(3270), + q(0), + ], + q(kep) => [ + q(3271), + q(0), + ], + q(keq) => [ + q(3272), + q(0), + ], + q(ker) => [ + q(3273), + q(0), + ], + q(kes) => [ + q(3274), + q(0), + ], + q(ket) => [ + q(3275), + q(0), + ], + q(keu) => [ + q(3276), + q(0), + ], + q(kev) => [ + q(3277), + q(0), + ], + q(kew) => [ + q(3278), + q(0), + ], + q(kex) => [ + q(3279), + q(0), + ], + q(key) => [ + q(3280), + q(0), + ], + q(kez) => [ + q(3281), + q(0), + ], + q(kfa) => [ + q(3282), + q(0), + ], + q(kfb) => [ + q(3283), + q(0), + ], + q(kfc) => [ + q(3284), + q(0), + ], + q(kfd) => [ + q(3285), + q(0), + ], + q(kfe) => [ + q(3286), + q(0), + ], + q(kff) => [ + q(3287), + q(0), + ], + q(kfg) => [ + q(3288), + q(0), + ], + q(kfh) => [ + q(3289), + q(0), + ], + q(kfi) => [ + q(3290), + q(0), + ], + q(kfj) => [ + q(3291), + q(0), + ], + q(kfk) => [ + q(3292), + q(0), + ], + q(kfl) => [ + q(3293), + q(0), + ], + q(kfm) => [ + q(3294), + q(0), + ], + q(kfn) => [ + q(3295), + q(0), + ], + q(kfo) => [ + q(3296), + q(0), + ], + q(kfp) => [ + q(3297), + q(0), + ], + q(kfq) => [ + q(3298), + q(0), + ], + q(kfr) => [ + q(3299), + q(0), + ], + q(kfs) => [ + q(3300), + q(0), + ], + q(kft) => [ + q(3301), + q(0), + ], + q(kfu) => [ + q(3302), + q(0), + ], + q(kfv) => [ + q(3303), + q(0), + ], + q(kfw) => [ + q(3304), + q(0), + ], + q(kfx) => [ + q(3305), + q(0), + ], + q(kfy) => [ + q(3306), + q(0), + ], + q(kfz) => [ + q(3307), + q(0), + ], + q(kga) => [ + q(3308), + q(0), + ], + q(kgb) => [ + q(3309), + q(0), + ], + q(kge) => [ + q(3310), + q(0), + ], + q(kgf) => [ + q(3311), + q(0), + ], + q(kgg) => [ + q(3312), + q(0), + ], + q(kgi) => [ + q(3313), + q(0), + ], + q(kgj) => [ + q(3314), + q(0), + ], + q(kgk) => [ + q(3315), + q(0), + ], + q(kgl) => [ + q(3316), + q(0), + ], + q(kgm) => [ + q(3317), + q(0), + ], + q(kgn) => [ + q(3318), + q(0), + ], + q(kgo) => [ + q(3319), + q(0), + ], + q(kgp) => [ + q(3320), + q(0), + ], + q(kgq) => [ + q(3321), + q(0), + ], + q(kgr) => [ + q(3322), + q(0), + ], + q(kgs) => [ + q(3323), + q(0), + ], + q(kgt) => [ + q(3324), + q(0), + ], + q(kgu) => [ + q(3325), + q(0), + ], + q(kgv) => [ + q(3326), + q(0), + ], + q(kgw) => [ + q(3327), + q(0), + ], + q(kgx) => [ + q(3328), + q(0), + ], + q(kgy) => [ + q(3329), + q(0), + ], + q(kha) => [ + q(0221), + q(0), + ], + q(khb) => [ + q(3330), + q(0), + ], + q(khc) => [ + q(3331), + q(0), + ], + q(khd) => [ + q(3332), + q(0), + ], + q(khe) => [ + q(3333), + q(0), + ], + q(khf) => [ + q(3334), + q(0), + ], + q(khg) => [ + q(3335), + q(0), + ], + q(khh) => [ + q(3336), + q(0), + ], + q(khi) => [ + q(0222), + q(0), + ], + q(khj) => [ + q(3337), + q(0), + ], + q(khk) => [ + q(3338), + q(0), + ], + q(khl) => [ + q(3339), + q(0), + ], + q(khm) => [ + q(0223), + q(0), + ], + q(khn) => [ + q(3340), + q(0), + ], + q(kho) => [ + q(0224), + q(0), + ], + q(khp) => [ + q(3341), + q(0), + ], + q(khq) => [ + q(3342), + q(0), + ], + q(khr) => [ + q(3343), + q(0), + ], + q(khs) => [ + q(3344), + q(0), + ], + q(kht) => [ + q(3345), + q(0), + ], + q(khu) => [ + q(3346), + q(0), + ], + q(khv) => [ + q(3347), + q(0), + ], + q(khw) => [ + q(3348), + q(0), + ], + q(khx) => [ + q(3349), + q(0), + ], + q(khy) => [ + q(3350), + q(0), + ], + q(khz) => [ + q(3351), + q(0), + ], + q(kia) => [ + q(3352), + q(0), + ], + q(kib) => [ + q(3353), + q(0), + ], + q(kic) => [ + q(3354), + q(0), + ], + q(kid) => [ + q(3355), + q(0), + ], + q(kie) => [ + q(3356), + q(0), + ], + q(kif) => [ + q(3357), + q(0), + ], + q(kig) => [ + q(3358), + q(0), + ], + q(kih) => [ + q(3359), + q(0), + ], + q(kii) => [ + q(3360), + q(0), + ], + q(kij) => [ + q(3361), + q(0), + ], + q(kik) => [ + q(0225), + q(0), + ], + q(kil) => [ + q(3362), + q(0), + ], + q(kim) => [ + q(3363), + q(0), + ], + q(kin) => [ + q(0226), + q(0), + ], + q(kio) => [ + q(3364), + q(0), + ], + q(kip) => [ + q(3365), + q(0), + ], + q(kiq) => [ + q(3366), + q(0), + ], + q(kir) => [ + q(0227), + q(0), + ], + q(kis) => [ + q(3367), + q(0), + ], + q(kit) => [ + q(3368), + q(0), + ], + q(kiu) => [ + q(3369), + q(0), + ], + q(kiv) => [ + q(3370), + q(0), + ], + q(kiw) => [ + q(3371), + q(0), + ], + q(kix) => [ + q(3372), + q(0), + ], + q(kiy) => [ + q(3373), + q(0), + ], + q(kiz) => [ + q(3374), + q(0), + ], + q(kja) => [ + q(3375), + q(0), + ], + q(kjb) => [ + q(3376), + q(0), + ], + q(kjc) => [ + q(3377), + q(0), + ], + q(kjd) => [ + q(3378), + q(0), + ], + q(kje) => [ + q(3379), + q(0), + ], + q(kjf) => [ + q(3380), + q(0), + ], + q(kjg) => [ + q(3381), + q(0), + ], + q(kjh) => [ + q(3382), + q(0), + ], + q(kji) => [ + q(3383), + q(0), + ], + q(kjj) => [ + q(3384), + q(0), + ], + q(kjk) => [ + q(3385), + q(0), + ], + q(kjl) => [ + q(3386), + q(0), + ], + q(kjm) => [ + q(3387), + q(0), + ], + q(kjn) => [ + q(3388), + q(0), + ], + q(kjo) => [ + q(3389), + q(0), + ], + q(kjp) => [ + q(3390), + q(0), + ], + q(kjq) => [ + q(3391), + q(0), + ], + q(kjr) => [ + q(3392), + q(0), + ], + q(kjs) => [ + q(3393), + q(0), + ], + q(kjt) => [ + q(3394), + q(0), + ], + q(kju) => [ + q(3395), + q(0), + ], + q(kjv) => [ + q(3396), + q(0), + ], + q(kjx) => [ + q(3397), + q(0), + ], + q(kjy) => [ + q(3398), + q(0), + ], + q(kjz) => [ + q(3399), + q(0), + ], + q(kka) => [ + q(3400), + q(0), + ], + q(kkb) => [ + q(3401), + q(0), + ], + q(kkc) => [ + q(3402), + q(0), + ], + q(kkd) => [ + q(3403), + q(0), + ], + q(kke) => [ + q(3404), + q(0), + ], + q(kkf) => [ + q(3405), + q(0), + ], + q(kkg) => [ + q(3406), + q(0), + ], + q(kkh) => [ + q(3407), + q(0), + ], + q(kki) => [ + q(3408), + q(0), + ], + q(kkj) => [ + q(3409), + q(0), + ], + q(kkk) => [ + q(3410), + q(0), + ], + q(kkl) => [ + q(3411), + q(0), + ], + q(kkm) => [ + q(3412), + q(0), + ], + q(kkn) => [ + q(3413), + q(0), + ], + q(kko) => [ + q(3414), + q(0), + ], + q(kkp) => [ + q(3415), + q(0), + ], + q(kkq) => [ + q(3416), + q(0), + ], + q(kkr) => [ + q(3417), + q(0), + ], + q(kks) => [ + q(3418), + q(0), + ], + q(kkt) => [ + q(3419), + q(0), + ], + q(kku) => [ + q(3420), + q(0), + ], + q(kkv) => [ + q(3421), + q(0), + ], + q(kkw) => [ + q(3422), + q(0), + ], + q(kkx) => [ + q(3423), + q(0), + ], + q(kky) => [ + q(3424), + q(0), + ], + q(kkz) => [ + q(3425), + q(0), + ], + q(kla) => [ + q(3426), + q(0), + ], + q(klb) => [ + q(3427), + q(0), + ], + q(klc) => [ + q(3428), + q(0), + ], + q(kld) => [ + q(3429), + q(0), + ], + q(kle) => [ + q(3430), + q(0), + ], + q(klf) => [ + q(3431), + q(0), + ], + q(klg) => [ + q(3432), + q(0), + ], + q(klh) => [ + q(3433), + q(0), + ], + q(kli) => [ + q(3434), + q(0), + ], + q(klj) => [ + q(3435), + q(0), + ], + q(klk) => [ + q(3436), + q(0), + ], + q(kll) => [ + q(3437), + q(0), + ], + q(klm) => [ + q(3438), + q(0), + ], + q(kln) => [ + q(3439), + q(0), + ], + q(klo) => [ + q(3440), + q(0), + ], + q(klp) => [ + q(3441), + q(0), + ], + q(klq) => [ + q(3442), + q(0), + ], + q(klr) => [ + q(3443), + q(0), + ], + q(kls) => [ + q(3444), + q(0), + ], + q(klt) => [ + q(3445), + q(0), + ], + q(klu) => [ + q(3446), + q(0), + ], + q(klv) => [ + q(3447), + q(0), + ], + q(klw) => [ + q(3448), + q(0), + ], + q(klx) => [ + q(3449), + q(0), + ], + q(kly) => [ + q(3450), + q(0), + ], + q(klz) => [ + q(3451), + q(0), + ], + q(kma) => [ + q(3452), + q(0), + ], + q(kmb) => [ + q(0228), + q(0), + ], + q(kmc) => [ + q(3453), + q(0), + ], + q(kmd) => [ + q(3454), + q(0), + ], + q(kme) => [ + q(3455), + q(0), + ], + q(kmf) => [ + q(3456), + q(0), + ], + q(kmg) => [ + q(3457), + q(0), + ], + q(kmh) => [ + q(3458), + q(0), + ], + q(kmi) => [ + q(3459), + q(0), + ], + q(kmj) => [ + q(3460), + q(0), + ], + q(kmk) => [ + q(3461), + q(0), + ], + q(kml) => [ + q(3462), + q(0), + ], + q(kmm) => [ + q(3463), + q(0), + ], + q(kmn) => [ + q(3464), + q(0), + ], + q(kmo) => [ + q(3465), + q(0), + ], + q(kmp) => [ + q(3466), + q(0), + ], + q(kmq) => [ + q(3467), + q(0), + ], + q(kmr) => [ + q(3468), + q(0), + ], + q(kms) => [ + q(3469), + q(0), + ], + q(kmt) => [ + q(3470), + q(0), + ], + q(kmu) => [ + q(3471), + q(0), + ], + q(kmv) => [ + q(3472), + q(0), + ], + q(kmw) => [ + q(3473), + q(0), + ], + q(kmx) => [ + q(3474), + q(0), + ], + q(kmy) => [ + q(3475), + q(0), + ], + q(kmz) => [ + q(3476), + q(0), + ], + q(kna) => [ + q(3477), + q(0), + ], + q(knb) => [ + q(3478), + q(0), + ], + q(knc) => [ + q(3479), + q(0), + ], + q(knd) => [ + q(3480), + q(0), + ], + q(kne) => [ + q(3481), + q(0), + ], + q(knf) => [ + q(3482), + q(0), + ], + q(kng) => [ + q(3483), + q(0), + ], + q(kni) => [ + q(3484), + q(0), + ], + q(knj) => [ + q(3485), + q(0), + ], + q(knk) => [ + q(3486), + q(0), + ], + q(knl) => [ + q(3487), + q(0), + ], + q(knm) => [ + q(3488), + q(0), + ], + q(knn) => [ + q(3489), + q(0), + ], + q(kno) => [ + q(3490), + q(0), + ], + q(knp) => [ + q(3491), + q(0), + ], + q(knq) => [ + q(3492), + q(0), + ], + q(knr) => [ + q(3493), + q(0), + ], + q(kns) => [ + q(3494), + q(0), + ], + q(knt) => [ + q(3495), + q(0), + ], + q(knu) => [ + q(3496), + q(0), + ], + q(knv) => [ + q(3497), + q(0), + ], + q(knw) => [ + q(3498), + q(0), + ], + q(knx) => [ + q(3499), + q(0), + ], + q(kny) => [ + q(3500), + q(0), + ], + q(knz) => [ + q(3501), + q(0), + ], + q(koa) => [ + q(3502), + q(0), + ], + q(koc) => [ + q(3503), + q(0), + ], + q(kod) => [ + q(3504), + q(0), + ], + q(koe) => [ + q(3505), + q(0), + ], + q(kof) => [ + q(3506), + q(0), + ], + q(kog) => [ + q(3507), + q(0), + ], + q(koh) => [ + q(3508), + q(0), + ], + q(koi) => [ + q(3509), + q(0), + ], + q(kok) => [ + q(0229), + q(1), + ], + q(kol) => [ + q(3510), + q(0), + ], + q(kom) => [ + q(0230), + q(0), + ], + q(kon) => [ + q(0231), + q(0), + ], + q(koo) => [ + q(3511), + q(0), + ], + q(kop) => [ + q(3512), + q(0), + ], + q(koq) => [ + q(3513), + q(0), + ], + q(kor) => [ + q(0232), + q(0), + ], + q(kos) => [ + q(0233), + q(0), + ], + q(kot) => [ + q(3514), + q(0), + ], + q(kou) => [ + q(3515), + q(0), + ], + q(kov) => [ + q(3516), + q(0), + ], + q(kow) => [ + q(3517), + q(0), + ], + q(koy) => [ + q(3518), + q(0), + ], + q(koz) => [ + q(3519), + q(0), + ], + q(kpa) => [ + q(3520), + q(0), + ], + q(kpb) => [ + q(3521), + q(0), + ], + q(kpc) => [ + q(3522), + q(0), + ], + q(kpd) => [ + q(3523), + q(0), + ], + q(kpe) => [ + q(0234), + q(0), + ], + q(kpf) => [ + q(3524), + q(0), + ], + q(kpg) => [ + q(3525), + q(0), + ], + q(kph) => [ + q(3526), + q(0), + ], + q(kpi) => [ + q(3527), + q(0), + ], + q(kpj) => [ + q(3528), + q(0), + ], + q(kpk) => [ + q(3529), + q(0), + ], + q(kpl) => [ + q(3530), + q(0), + ], + q(kpm) => [ + q(3531), + q(0), + ], + q(kpn) => [ + q(3532), + q(0), + ], + q(kpo) => [ + q(3533), + q(0), + ], + q(kpq) => [ + q(3534), + q(0), + ], + q(kpr) => [ + q(3535), + q(0), + ], + q(kps) => [ + q(3536), + q(0), + ], + q(kpt) => [ + q(3537), + q(0), + ], + q(kpu) => [ + q(3538), + q(0), + ], + q(kpv) => [ + q(3539), + q(0), + ], + q(kpw) => [ + q(3540), + q(0), + ], + q(kpx) => [ + q(3541), + q(0), + ], + q(kpy) => [ + q(3542), + q(0), + ], + q(kpz) => [ + q(3543), + q(0), + ], + q(kqa) => [ + q(3544), + q(0), + ], + q(kqb) => [ + q(3545), + q(0), + ], + q(kqc) => [ + q(3546), + q(0), + ], + q(kqd) => [ + q(3547), + q(0), + ], + q(kqe) => [ + q(3548), + q(0), + ], + q(kqf) => [ + q(3549), + q(0), + ], + q(kqg) => [ + q(3550), + q(0), + ], + q(kqh) => [ + q(3551), + q(0), + ], + q(kqi) => [ + q(3552), + q(0), + ], + q(kqj) => [ + q(3553), + q(0), + ], + q(kqk) => [ + q(3554), + q(0), + ], + q(kql) => [ + q(3555), + q(0), + ], + q(kqm) => [ + q(3556), + q(0), + ], + q(kqn) => [ + q(3557), + q(0), + ], + q(kqo) => [ + q(3558), + q(0), + ], + q(kqp) => [ + q(3559), + q(0), + ], + q(kqq) => [ + q(3560), + q(0), + ], + q(kqr) => [ + q(3561), + q(0), + ], + q(kqs) => [ + q(3562), + q(0), + ], + q(kqt) => [ + q(3563), + q(0), + ], + q(kqu) => [ + q(3564), + q(0), + ], + q(kqv) => [ + q(3565), + q(0), + ], + q(kqw) => [ + q(3566), + q(0), + ], + q(kqx) => [ + q(3567), + q(0), + ], + q(kqy) => [ + q(3568), + q(0), + ], + q(kqz) => [ + q(3569), + q(0), + ], + q(kra) => [ + q(3570), + q(0), + ], + q(krb) => [ + q(3571), + q(0), + ], + q(krc) => [ + q(0235), + q(0), + ], + q(krd) => [ + q(3572), + q(0), + ], + q(kre) => [ + q(3573), + q(0), + ], + q(krf) => [ + q(3574), + q(0), + ], + q(krh) => [ + q(3575), + q(0), + ], + q(kri) => [ + q(3576), + q(0), + ], + q(krj) => [ + q(3577), + q(0), + ], + q(krk) => [ + q(3578), + q(0), + ], + q(krl) => [ + q(0236), + q(0), + ], + q(krn) => [ + q(3579), + q(0), + ], + q(kro) => [ + q(0237), + q(0), + ], + q(krp) => [ + q(3580), + q(0), + ], + q(krr) => [ + q(3581), + q(0), + ], + q(krs) => [ + q(3582), + q(0), + ], + q(krt) => [ + q(3583), + q(0), + ], + q(kru) => [ + q(0238), + q(0), + ], + q(krv) => [ + q(3584), + q(0), + ], + q(krw) => [ + q(3585), + q(0), + ], + q(krx) => [ + q(3586), + q(0), + ], + q(kry) => [ + q(3587), + q(0), + ], + q(krz) => [ + q(3588), + q(0), + ], + q(ksa) => [ + q(3589), + q(0), + ], + q(ksb) => [ + q(3590), + q(0), + ], + q(ksc) => [ + q(3591), + q(0), + ], + q(ksd) => [ + q(3592), + q(0), + ], + q(kse) => [ + q(3593), + q(0), + ], + q(ksf) => [ + q(3594), + q(0), + ], + q(ksg) => [ + q(3595), + q(0), + ], + q(ksh) => [ + q(3596), + q(0), + ], + q(ksi) => [ + q(3597), + q(0), + ], + q(ksj) => [ + q(3598), + q(0), + ], + q(ksk) => [ + q(3599), + q(0), + ], + q(ksl) => [ + q(3600), + q(0), + ], + q(ksm) => [ + q(3601), + q(0), + ], + q(ksn) => [ + q(3602), + q(0), + ], + q(kso) => [ + q(3603), + q(0), + ], + q(ksp) => [ + q(3604), + q(0), + ], + q(ksq) => [ + q(3605), + q(0), + ], + q(ksr) => [ + q(3606), + q(0), + ], + q(kss) => [ + q(3607), + q(0), + ], + q(kst) => [ + q(3608), + q(0), + ], + q(ksu) => [ + q(3609), + q(0), + ], + q(ksv) => [ + q(3610), + q(0), + ], + q(ksw) => [ + q(3611), + q(0), + ], + q(ksx) => [ + q(3612), + q(0), + ], + q(ksy) => [ + q(3613), + q(0), + ], + q(ksz) => [ + q(3614), + q(0), + ], + q(kta) => [ + q(3615), + q(0), + ], + q(ktb) => [ + q(3616), + q(0), + ], + q(ktc) => [ + q(3617), + q(0), + ], + q(ktd) => [ + q(3618), + q(0), + ], + q(kte) => [ + q(3619), + q(0), + ], + q(ktf) => [ + q(3620), + q(0), + ], + q(ktg) => [ + q(3621), + q(0), + ], + q(kth) => [ + q(3622), + q(0), + ], + q(kti) => [ + q(3623), + q(0), + ], + q(ktj) => [ + q(3624), + q(0), + ], + q(ktk) => [ + q(3625), + q(0), + ], + q(ktl) => [ + q(3626), + q(0), + ], + q(ktm) => [ + q(3627), + q(0), + ], + q(ktn) => [ + q(3628), + q(0), + ], + q(kto) => [ + q(3629), + q(0), + ], + q(ktp) => [ + q(3630), + q(0), + ], + q(ktq) => [ + q(3631), + q(0), + ], + q(kts) => [ + q(3632), + q(0), + ], + q(ktt) => [ + q(3633), + q(0), + ], + q(ktu) => [ + q(3634), + q(0), + ], + q(ktv) => [ + q(3635), + q(0), + ], + q(ktw) => [ + q(3636), + q(0), + ], + q(ktx) => [ + q(3637), + q(0), + ], + q(kty) => [ + q(3638), + q(0), + ], + q(ktz) => [ + q(3639), + q(0), + ], + q(kua) => [ + q(0239), + q(0), + ], + q(kub) => [ + q(3640), + q(0), + ], + q(kuc) => [ + q(3641), + q(0), + ], + q(kud) => [ + q(3642), + q(0), + ], + q(kue) => [ + q(3643), + q(0), + ], + q(kuf) => [ + q(3644), + q(0), + ], + q(kug) => [ + q(3645), + q(0), + ], + q(kuh) => [ + q(3646), + q(0), + ], + q(kui) => [ + q(3647), + q(0), + ], + q(kuj) => [ + q(3648), + q(0), + ], + q(kuk) => [ + q(3649), + q(0), + ], + q(kul) => [ + q(3650), + q(0), + ], + q(kum) => [ + q(0240), + q(0), + ], + q(kun) => [ + q(3651), + q(0), + ], + q(kuo) => [ + q(3652), + q(0), + ], + q(kup) => [ + q(3653), + q(0), + ], + q(kuq) => [ + q(3317), + q(0), + ], + q(kur) => [ + q(0241), + q(0), + ], + q(kus) => [ + q(3654), + q(0), + ], + q(kut) => [ + q(0242), + q(0), + ], + q(kuu) => [ + q(3655), + q(0), + ], + q(kuv) => [ + q(3656), + q(0), + ], + q(kuw) => [ + q(3657), + q(0), + ], + q(kux) => [ + q(3658), + q(0), + ], + q(kuy) => [ + q(3659), + q(0), + ], + q(kuz) => [ + q(3660), + q(0), + ], + q(kva) => [ + q(3661), + q(0), + ], + q(kvb) => [ + q(3662), + q(0), + ], + q(kvc) => [ + q(3663), + q(0), + ], + q(kvd) => [ + q(3664), + q(0), + ], + q(kve) => [ + q(3665), + q(0), + ], + q(kvf) => [ + q(3666), + q(0), + ], + q(kvg) => [ + q(3667), + q(0), + ], + q(kvh) => [ + q(3668), + q(0), + ], + q(kvi) => [ + q(3669), + q(0), + ], + q(kvj) => [ + q(3670), + q(0), + ], + q(kvk) => [ + q(3671), + q(0), + ], + q(kvl) => [ + q(3672), + q(0), + ], + q(kvm) => [ + q(3673), + q(0), + ], + q(kvn) => [ + q(3674), + q(0), + ], + q(kvo) => [ + q(3675), + q(0), + ], + q(kvp) => [ + q(3676), + q(0), + ], + q(kvq) => [ + q(3677), + q(0), + ], + q(kvr) => [ + q(3678), + q(0), + ], + q(kvt) => [ + q(3679), + q(0), + ], + q(kvu) => [ + q(3680), + q(0), + ], + q(kvv) => [ + q(3681), + q(0), + ], + q(kvw) => [ + q(3682), + q(0), + ], + q(kvx) => [ + q(3683), + q(0), + ], + q(kvy) => [ + q(3684), + q(0), + ], + q(kvz) => [ + q(3685), + q(0), + ], + q(kwa) => [ + q(3686), + q(0), + ], + q(kwb) => [ + q(3687), + q(0), + ], + q(kwc) => [ + q(3688), + q(0), + ], + q(kwd) => [ + q(3689), + q(0), + ], + q(kwe) => [ + q(3690), + q(0), + ], + q(kwf) => [ + q(3691), + q(0), + ], + q(kwg) => [ + q(3692), + q(0), + ], + q(kwh) => [ + q(3693), + q(0), + ], + q(kwi) => [ + q(3694), + q(0), + ], + q(kwj) => [ + q(3695), + q(0), + ], + q(kwk) => [ + q(3696), + q(0), + ], + q(kwl) => [ + q(3697), + q(0), + ], + q(kwm) => [ + q(3698), + q(0), + ], + q(kwn) => [ + q(3699), + q(0), + ], + q(kwo) => [ + q(3700), + q(0), + ], + q(kwp) => [ + q(3701), + q(0), + ], + q(kwr) => [ + q(3702), + q(0), + ], + q(kws) => [ + q(3703), + q(0), + ], + q(kwt) => [ + q(3704), + q(0), + ], + q(kwu) => [ + q(3705), + q(0), + ], + q(kwv) => [ + q(3706), + q(0), + ], + q(kww) => [ + q(3707), + q(0), + ], + q(kwx) => [ + q(3708), + q(0), + ], + q(kwy) => [ + q(3709), + q(0), + ], + q(kwz) => [ + q(3710), + q(0), + ], + q(kxa) => [ + q(3711), + q(0), + ], + q(kxb) => [ + q(3712), + q(0), + ], + q(kxc) => [ + q(3713), + q(0), + ], + q(kxd) => [ + q(3714), + q(0), + ], + q(kxf) => [ + q(3715), + q(0), + ], + q(kxh) => [ + q(3716), + q(0), + ], + q(kxi) => [ + q(3717), + q(0), + ], + q(kxj) => [ + q(3718), + q(0), + ], + q(kxk) => [ + q(3719), + q(0), + ], + q(kxl) => [ + q(3720), + q(0), + ], + q(kxm) => [ + q(3721), + q(0), + ], + q(kxn) => [ + q(3722), + q(0), + ], + q(kxo) => [ + q(3723), + q(0), + ], + q(kxp) => [ + q(3724), + q(0), + ], + q(kxq) => [ + q(3725), + q(0), + ], + q(kxr) => [ + q(3726), + q(0), + ], + q(kxs) => [ + q(3727), + q(0), + ], + q(kxt) => [ + q(3728), + q(0), + ], + q(kxu) => [ + q(3729), + q(0), + ], + q(kxv) => [ + q(3730), + q(0), + ], + q(kxw) => [ + q(3731), + q(0), + ], + q(kxx) => [ + q(3732), + q(0), + ], + q(kxy) => [ + q(3733), + q(0), + ], + q(kxz) => [ + q(3734), + q(0), + ], + q(kya) => [ + q(3735), + q(0), + ], + q(kyb) => [ + q(3736), + q(0), + ], + q(kyc) => [ + q(3737), + q(0), + ], + q(kyd) => [ + q(3738), + q(0), + ], + q(kye) => [ + q(3739), + q(0), + ], + q(kyf) => [ + q(3740), + q(0), + ], + q(kyg) => [ + q(3741), + q(0), + ], + q(kyh) => [ + q(3742), + q(0), + ], + q(kyi) => [ + q(3743), + q(0), + ], + q(kyj) => [ + q(3744), + q(0), + ], + q(kyk) => [ + q(3745), + q(0), + ], + q(kyl) => [ + q(3746), + q(0), + ], + q(kym) => [ + q(3747), + q(0), + ], + q(kyn) => [ + q(3748), + q(0), + ], + q(kyo) => [ + q(3749), + q(0), + ], + q(kyp) => [ + q(3750), + q(0), + ], + q(kyq) => [ + q(3751), + q(0), + ], + q(kyr) => [ + q(3752), + q(0), + ], + q(kys) => [ + q(3753), + q(0), + ], + q(kyt) => [ + q(3754), + q(0), + ], + q(kyu) => [ + q(3755), + q(0), + ], + q(kyv) => [ + q(3756), + q(0), + ], + q(kyw) => [ + q(3757), + q(0), + ], + q(kyx) => [ + q(3758), + q(0), + ], + q(kyy) => [ + q(3759), + q(0), + ], + q(kyz) => [ + q(3760), + q(0), + ], + q(kza) => [ + q(3761), + q(0), + ], + q(kzb) => [ + q(3762), + q(0), + ], + q(kzc) => [ + q(3763), + q(0), + ], + q(kzd) => [ + q(3764), + q(0), + ], + q(kze) => [ + q(3765), + q(0), + ], + q(kzf) => [ + q(3766), + q(0), + ], + q(kzg) => [ + q(3767), + q(0), + ], + q(kzi) => [ + q(3768), + q(0), + ], + q(kzk) => [ + q(3769), + q(0), + ], + q(kzl) => [ + q(3770), + q(0), + ], + q(kzm) => [ + q(3771), + q(0), + ], + q(kzn) => [ + q(3772), + q(0), + ], + q(kzo) => [ + q(3773), + q(0), + ], + q(kzp) => [ + q(3774), + q(0), + ], + q(kzq) => [ + q(3775), + q(0), + ], + q(kzr) => [ + q(3776), + q(0), + ], + q(kzs) => [ + q(3777), + q(0), + ], + q(kzu) => [ + q(3778), + q(0), + ], + q(kzv) => [ + q(3779), + q(0), + ], + q(kzw) => [ + q(3780), + q(0), + ], + q(kzx) => [ + q(3781), + q(0), + ], + q(kzy) => [ + q(3782), + q(0), + ], + q(kzz) => [ + q(3783), + q(0), + ], + q(laa) => [ + q(3784), + q(0), + ], + q(lab) => [ + q(3785), + q(0), + ], + q(lac) => [ + q(3786), + q(0), + ], + q(lad) => [ + q(0243), + q(0), + ], + q(lae) => [ + q(3787), + q(0), + ], + q(laf) => [ + q(3788), + q(0), + ], + q(lag) => [ + q(3789), + q(0), + ], + q(lah) => [ + q(0244), + q(0), + ], + q(lai) => [ + q(3790), + q(0), + ], + q(laj) => [ + q(3791), + q(0), + ], + q(lak) => [ + q(3792), + q(0), + ], + q(lal) => [ + q(3793), + q(0), + ], + q(lam) => [ + q(0245), + q(0), + ], + q(lan) => [ + q(3794), + q(0), + ], + q(lao) => [ + q(0246), + q(0), + ], + q(lap) => [ + q(3795), + q(0), + ], + q(laq) => [ + q(3796), + q(0), + ], + q(lar) => [ + q(3797), + q(0), + ], + q(las) => [ + q(3798), + q(0), + ], + q(lat) => [ + q(0247), + q(0), + ], + q(lau) => [ + q(3799), + q(0), + ], + q(lav) => [ + q(0248), + q(0), + ], + q(law) => [ + q(3800), + q(0), + ], + q(lax) => [ + q(3801), + q(0), + ], + q(lay) => [ + q(3802), + q(0), + ], + q(laz) => [ + q(3803), + q(0), + ], + q(lba) => [ + q(3804), + q(0), + ], + q(lbb) => [ + q(3805), + q(0), + ], + q(lbc) => [ + q(3806), + q(0), + ], + q(lbe) => [ + q(3807), + q(0), + ], + q(lbf) => [ + q(3808), + q(0), + ], + q(lbg) => [ + q(3809), + q(0), + ], + q(lbi) => [ + q(3810), + q(0), + ], + q(lbj) => [ + q(3811), + q(0), + ], + q(lbk) => [ + q(3812), + q(0), + ], + q(lbl) => [ + q(3813), + q(0), + ], + q(lbm) => [ + q(3814), + q(0), + ], + q(lbn) => [ + q(3815), + q(0), + ], + q(lbo) => [ + q(3816), + q(0), + ], + q(lbq) => [ + q(3817), + q(0), + ], + q(lbr) => [ + q(3818), + q(0), + ], + q(lbs) => [ + q(3819), + q(0), + ], + q(lbt) => [ + q(3820), + q(0), + ], + q(lbu) => [ + q(3821), + q(0), + ], + q(lbv) => [ + q(3822), + q(0), + ], + q(lbw) => [ + q(3823), + q(0), + ], + q(lbx) => [ + q(3824), + q(0), + ], + q(lby) => [ + q(3825), + q(0), + ], + q(lbz) => [ + q(3826), + q(0), + ], + q(lcc) => [ + q(3827), + q(0), + ], + q(lcd) => [ + q(3828), + q(0), + ], + q(lce) => [ + q(3829), + q(0), + ], + q(lcf) => [ + q(3830), + q(0), + ], + q(lch) => [ + q(3831), + q(0), + ], + q(lcl) => [ + q(3832), + q(0), + ], + q(lcm) => [ + q(3833), + q(0), + ], + q(lcp) => [ + q(3834), + q(0), + ], + q(lcq) => [ + q(3835), + q(0), + ], + q(lcs) => [ + q(3836), + q(0), + ], + q(lda) => [ + q(3837), + q(0), + ], + q(ldb) => [ + q(3838), + q(0), + ], + q(ldd) => [ + q(3839), + q(0), + ], + q(ldg) => [ + q(3840), + q(0), + ], + q(ldh) => [ + q(3841), + q(0), + ], + q(ldi) => [ + q(3842), + q(0), + ], + q(ldj) => [ + q(3843), + q(0), + ], + q(ldk) => [ + q(3844), + q(0), + ], + q(ldl) => [ + q(3845), + q(0), + ], + q(ldm) => [ + q(3846), + q(0), + ], + q(ldn) => [ + q(3847), + q(0), + ], + q(ldo) => [ + q(3848), + q(0), + ], + q(ldp) => [ + q(3849), + q(0), + ], + q(ldq) => [ + q(3850), + q(0), + ], + q(lea) => [ + q(3851), + q(0), + ], + q(leb) => [ + q(3852), + q(0), + ], + q(lec) => [ + q(3853), + q(0), + ], + q(led) => [ + q(3854), + q(0), + ], + q(lee) => [ + q(3855), + q(0), + ], + q(lef) => [ + q(3856), + q(0), + ], + q(leh) => [ + q(3857), + q(0), + ], + q(lei) => [ + q(3858), + q(0), + ], + q(lej) => [ + q(3859), + q(0), + ], + q(lek) => [ + q(3860), + q(0), + ], + q(lel) => [ + q(3861), + q(0), + ], + q(lem) => [ + q(3862), + q(0), + ], + q(len) => [ + q(3863), + q(0), + ], + q(leo) => [ + q(3864), + q(0), + ], + q(lep) => [ + q(3865), + q(0), + ], + q(leq) => [ + q(3866), + q(0), + ], + q(ler) => [ + q(3867), + q(0), + ], + q(les) => [ + q(3868), + q(0), + ], + q(let) => [ + q(3869), + q(0), + ], + q(leu) => [ + q(3870), + q(0), + ], + q(lev) => [ + q(3871), + q(0), + ], + q(lew) => [ + q(3872), + q(0), + ], + q(lex) => [ + q(3873), + q(0), + ], + q(ley) => [ + q(3874), + q(0), + ], + q(lez) => [ + q(0249), + q(0), + ], + q(lfa) => [ + q(3875), + q(0), + ], + q(lfn) => [ + q(3876), + q(0), + ], + q(lga) => [ + q(3877), + q(0), + ], + q(lgb) => [ + q(3878), + q(0), + ], + q(lgg) => [ + q(3879), + q(0), + ], + q(lgh) => [ + q(3880), + q(0), + ], + q(lgi) => [ + q(3881), + q(0), + ], + q(lgk) => [ + q(3882), + q(0), + ], + q(lgl) => [ + q(3883), + q(0), + ], + q(lgm) => [ + q(3884), + q(0), + ], + q(lgn) => [ + q(3885), + q(0), + ], + q(lgq) => [ + q(3886), + q(0), + ], + q(lgr) => [ + q(3887), + q(0), + ], + q(lgt) => [ + q(3888), + q(0), + ], + q(lgu) => [ + q(3889), + q(0), + ], + q(lgz) => [ + q(3890), + q(0), + ], + q(lha) => [ + q(3891), + q(0), + ], + q(lhh) => [ + q(3892), + q(0), + ], + q(lhi) => [ + q(3893), + q(0), + ], + q(lhl) => [ + q(3894), + q(0), + ], + q(lhm) => [ + q(3895), + q(0), + ], + q(lhn) => [ + q(3896), + q(0), + ], + q(lhp) => [ + q(3897), + q(0), + ], + q(lhs) => [ + q(3898), + q(0), + ], + q(lht) => [ + q(3899), + q(0), + ], + q(lhu) => [ + q(3900), + q(0), + ], + q(lia) => [ + q(3901), + q(0), + ], + q(lib) => [ + q(3902), + q(0), + ], + q(lic) => [ + q(3903), + q(0), + ], + q(lid) => [ + q(3904), + q(0), + ], + q(lie) => [ + q(3905), + q(0), + ], + q(lif) => [ + q(3906), + q(0), + ], + q(lig) => [ + q(3907), + q(0), + ], + q(lih) => [ + q(3908), + q(0), + ], + q(lij) => [ + q(3909), + q(0), + ], + q(lik) => [ + q(3910), + q(0), + ], + q(lil) => [ + q(3911), + q(0), + ], + q(lim) => [ + q(0250), + q(0), + ], + q(lin) => [ + q(0251), + q(0), + ], + q(lio) => [ + q(3912), + q(0), + ], + q(lip) => [ + q(3913), + q(0), + ], + q(liq) => [ + q(3914), + q(0), + ], + q(lir) => [ + q(3915), + q(0), + ], + q(lis) => [ + q(3916), + q(0), + ], + q(lit) => [ + q(0252), + q(0), + ], + q(liu) => [ + q(3917), + q(0), + ], + q(liv) => [ + q(3918), + q(0), + ], + q(liw) => [ + q(3919), + q(0), + ], + q(lix) => [ + q(3920), + q(0), + ], + q(liy) => [ + q(3921), + q(0), + ], + q(liz) => [ + q(3922), + q(0), + ], + q(lja) => [ + q(3923), + q(0), + ], + q(lje) => [ + q(3924), + q(0), + ], + q(lji) => [ + q(3925), + q(0), + ], + q(ljl) => [ + q(3926), + q(0), + ], + q(ljp) => [ + q(3927), + q(0), + ], + q(ljw) => [ + q(3928), + q(0), + ], + q(ljx) => [ + q(3929), + q(0), + ], + q(lka) => [ + q(3930), + q(0), + ], + q(lkb) => [ + q(3931), + q(0), + ], + q(lkc) => [ + q(3932), + q(0), + ], + q(lkd) => [ + q(3933), + q(0), + ], + q(lke) => [ + q(3934), + q(0), + ], + q(lkh) => [ + q(3935), + q(0), + ], + q(lki) => [ + q(3936), + q(0), + ], + q(lkj) => [ + q(3937), + q(0), + ], + q(lkl) => [ + q(3938), + q(0), + ], + q(lkm) => [ + q(3939), + q(0), + ], + q(lkn) => [ + q(3940), + q(0), + ], + q(lko) => [ + q(3941), + q(0), + ], + q(lkr) => [ + q(3942), + q(0), + ], + q(lks) => [ + q(3943), + q(0), + ], + q(lkt) => [ + q(3944), + q(0), + ], + q(lku) => [ + q(3945), + q(0), + ], + q(lky) => [ + q(3946), + q(0), + ], + q(lla) => [ + q(3947), + q(0), + ], + q(llb) => [ + q(3948), + q(0), + ], + q(llc) => [ + q(3949), + q(0), + ], + q(lld) => [ + q(3950), + q(0), + ], + q(lle) => [ + q(3951), + q(0), + ], + q(llf) => [ + q(3952), + q(0), + ], + q(llg) => [ + q(3953), + q(0), + ], + q(llh) => [ + q(3954), + q(0), + ], + q(lli) => [ + q(3955), + q(0), + ], + q(llj) => [ + q(3956), + q(0), + ], + q(llk) => [ + q(3957), + q(0), + ], + q(lll) => [ + q(3958), + q(0), + ], + q(llm) => [ + q(3959), + q(0), + ], + q(lln) => [ + q(3960), + q(0), + ], + q(llo) => [ + q(3961), + q(0), + ], + q(llp) => [ + q(3962), + q(0), + ], + q(llq) => [ + q(3963), + q(0), + ], + q(lls) => [ + q(3964), + q(0), + ], + q(llu) => [ + q(3965), + q(0), + ], + q(llx) => [ + q(3966), + q(0), + ], + q(lma) => [ + q(3967), + q(0), + ], + q(lmb) => [ + q(3968), + q(0), + ], + q(lmc) => [ + q(3969), + q(0), + ], + q(lmd) => [ + q(3970), + q(0), + ], + q(lme) => [ + q(3971), + q(0), + ], + q(lmf) => [ + q(3972), + q(0), + ], + q(lmg) => [ + q(3973), + q(0), + ], + q(lmh) => [ + q(3974), + q(0), + ], + q(lmi) => [ + q(3975), + q(0), + ], + q(lmj) => [ + q(3976), + q(0), + ], + q(lmk) => [ + q(3977), + q(0), + ], + q(lml) => [ + q(3978), + q(0), + ], + q(lmn) => [ + q(3979), + q(0), + ], + q(lmo) => [ + q(3980), + q(0), + ], + q(lmp) => [ + q(3981), + q(0), + ], + q(lmq) => [ + q(3982), + q(0), + ], + q(lmr) => [ + q(3983), + q(0), + ], + q(lmu) => [ + q(3984), + q(0), + ], + q(lmv) => [ + q(3985), + q(0), + ], + q(lmw) => [ + q(3986), + q(0), + ], + q(lmx) => [ + q(3987), + q(0), + ], + q(lmy) => [ + q(3988), + q(0), + ], + q(lmz) => [ + q(3989), + q(0), + ], + q(lna) => [ + q(3990), + q(0), + ], + q(lnb) => [ + q(3991), + q(0), + ], + q(lnd) => [ + q(3992), + q(0), + ], + q(lng) => [ + q(3993), + q(0), + ], + q(lnh) => [ + q(3994), + q(0), + ], + q(lni) => [ + q(3995), + q(0), + ], + q(lnj) => [ + q(3996), + q(0), + ], + q(lnl) => [ + q(3997), + q(0), + ], + q(lnm) => [ + q(3998), + q(0), + ], + q(lnn) => [ + q(3999), + q(0), + ], + q(lno) => [ + q(4000), + q(0), + ], + q(lns) => [ + q(4001), + q(0), + ], + q(lnu) => [ + q(4002), + q(0), + ], + q(lnw) => [ + q(4003), + q(0), + ], + q(lnz) => [ + q(4004), + q(0), + ], + q(loa) => [ + q(4005), + q(0), + ], + q(lob) => [ + q(4006), + q(0), + ], + q(loc) => [ + q(4007), + q(0), + ], + q(loe) => [ + q(4008), + q(0), + ], + q(lof) => [ + q(4009), + q(0), + ], + q(log) => [ + q(4010), + q(0), + ], + q(loh) => [ + q(4011), + q(0), + ], + q(loi) => [ + q(4012), + q(0), + ], + q(loj) => [ + q(4013), + q(0), + ], + q(lok) => [ + q(4014), + q(0), + ], + q(lol) => [ + q(0253), + q(0), + ], + q(lom) => [ + q(4015), + q(0), + ], + q(lon) => [ + q(4016), + q(0), + ], + q(loo) => [ + q(4017), + q(0), + ], + q(lop) => [ + q(4018), + q(0), + ], + q(loq) => [ + q(4019), + q(0), + ], + q(lor) => [ + q(4020), + q(0), + ], + q(los) => [ + q(4021), + q(0), + ], + q(lot) => [ + q(4022), + q(0), + ], + q(lou) => [ + q(4023), + q(0), + ], + q(lov) => [ + q(4024), + q(0), + ], + q(low) => [ + q(4025), + q(0), + ], + q(lox) => [ + q(4026), + q(0), + ], + q(loy) => [ + q(4027), + q(0), + ], + q(loz) => [ + q(0254), + q(0), + ], + q(lpa) => [ + q(4028), + q(0), + ], + q(lpe) => [ + q(4029), + q(0), + ], + q(lpn) => [ + q(4030), + q(0), + ], + q(lpo) => [ + q(4031), + q(0), + ], + q(lpx) => [ + q(4032), + q(0), + ], + q(lra) => [ + q(4033), + q(0), + ], + q(lrc) => [ + q(4034), + q(0), + ], + q(lre) => [ + q(4035), + q(0), + ], + q(lrg) => [ + q(4036), + q(0), + ], + q(lri) => [ + q(4037), + q(0), + ], + q(lrk) => [ + q(4038), + q(0), + ], + q(lrl) => [ + q(4039), + q(0), + ], + q(lrm) => [ + q(4040), + q(0), + ], + q(lrn) => [ + q(4041), + q(0), + ], + q(lro) => [ + q(4042), + q(0), + ], + q(lrr) => [ + q(4043), + q(0), + ], + q(lrt) => [ + q(4044), + q(0), + ], + q(lrv) => [ + q(4045), + q(0), + ], + q(lrz) => [ + q(4046), + q(0), + ], + q(lsa) => [ + q(4047), + q(0), + ], + q(lsd) => [ + q(4048), + q(0), + ], + q(lse) => [ + q(4049), + q(0), + ], + q(lsg) => [ + q(4050), + q(0), + ], + q(lsh) => [ + q(4051), + q(0), + ], + q(lsi) => [ + q(4052), + q(0), + ], + q(lsl) => [ + q(4053), + q(0), + ], + q(lsm) => [ + q(4054), + q(0), + ], + q(lso) => [ + q(4055), + q(0), + ], + q(lsp) => [ + q(4056), + q(0), + ], + q(lsr) => [ + q(4057), + q(0), + ], + q(lss) => [ + q(4058), + q(0), + ], + q(lst) => [ + q(4059), + q(0), + ], + q(lsy) => [ + q(4060), + q(0), + ], + q(ltc) => [ + q(4061), + q(0), + ], + q(ltg) => [ + q(4062), + q(0), + ], + q(lth) => [ + q(4063), + q(0), + ], + q(lti) => [ + q(4064), + q(0), + ], + q(ltn) => [ + q(4065), + q(0), + ], + q(lto) => [ + q(4066), + q(0), + ], + q(lts) => [ + q(4067), + q(0), + ], + q(ltu) => [ + q(4068), + q(0), + ], + q(ltz) => [ + q(0255), + q(0), + ], + q(lua) => [ + q(0256), + q(0), + ], + q(lub) => [ + q(0257), + q(0), + ], + q(luc) => [ + q(4069), + q(0), + ], + q(lud) => [ + q(4070), + q(0), + ], + q(lue) => [ + q(4071), + q(0), + ], + q(luf) => [ + q(4072), + q(0), + ], + q(lug) => [ + q(0258), + q(0), + ], + q(lui) => [ + q(0259), + q(0), + ], + q(luj) => [ + q(4073), + q(0), + ], + q(luk) => [ + q(4074), + q(0), + ], + q(lul) => [ + q(4075), + q(0), + ], + q(lum) => [ + q(4076), + q(0), + ], + q(lun) => [ + q(0260), + q(0), + ], + q(luo) => [ + q(0261), + q(0), + ], + q(lup) => [ + q(4077), + q(0), + ], + q(luq) => [ + q(4078), + q(0), + ], + q(lur) => [ + q(4079), + q(0), + ], + q(lus) => [ + q(0262), + q(0), + ], + q(lut) => [ + q(4080), + q(0), + ], + q(luu) => [ + q(4081), + q(0), + ], + q(luv) => [ + q(4082), + q(0), + ], + q(luw) => [ + q(4083), + q(0), + ], + q(luy) => [ + q(4084), + q(0), + ], + q(luz) => [ + q(4085), + q(0), + ], + q(lva) => [ + q(4086), + q(0), + ], + q(lvk) => [ + q(4087), + q(0), + ], + q(lvs) => [ + q(4088), + q(0), + ], + q(lvu) => [ + q(4089), + q(0), + ], + q(lwa) => [ + q(4090), + q(0), + ], + q(lwe) => [ + q(4091), + q(0), + ], + q(lwg) => [ + q(4092), + q(0), + ], + q(lwh) => [ + q(4093), + q(0), + ], + q(lwl) => [ + q(4094), + q(0), + ], + q(lwm) => [ + q(4095), + q(0), + ], + q(lwo) => [ + q(4096), + q(0), + ], + q(lwt) => [ + q(4097), + q(0), + ], + q(lwu) => [ + q(4098), + q(0), + ], + q(lww) => [ + q(4099), + q(0), + ], + q(lya) => [ + q(4100), + q(0), + ], + q(lyg) => [ + q(4101), + q(0), + ], + q(lyn) => [ + q(4102), + q(0), + ], + q(lzh) => [ + q(4103), + q(0), + ], + q(lzl) => [ + q(4104), + q(0), + ], + q(lzn) => [ + q(4105), + q(0), + ], + q(lzz) => [ + q(4106), + q(0), + ], + q(maa) => [ + q(4107), + q(0), + ], + q(mab) => [ + q(4108), + q(0), + ], + q(mac) => [ + q(0263), + q(0), + ], + q(mad) => [ + q(0264), + q(0), + ], + q(mae) => [ + q(4109), + q(0), + ], + q(maf) => [ + q(4110), + q(0), + ], + q(mag) => [ + q(0265), + q(0), + ], + q(mah) => [ + q(0266), + q(0), + ], + q(mai) => [ + q(0267), + q(0), + ], + q(maj) => [ + q(4111), + q(0), + ], + q(mak) => [ + q(0268), + q(0), + ], + q(mal) => [ + q(0269), + q(0), + ], + q(mam) => [ + q(4112), + q(0), + ], + q(man) => [ + q(0270), + q(0), + ], + q(mao) => [ + q(0271), + q(0), + ], + q(map) => [ + q(0272), + q(0), + ], + q(maq) => [ + q(4113), + q(0), + ], + q(mar) => [ + q(0273), + q(0), + ], + q(mas) => [ + q(0274), + q(0), + ], + q(mat) => [ + q(4114), + q(0), + ], + q(mau) => [ + q(4115), + q(0), + ], + q(mav) => [ + q(4116), + q(0), + ], + q(maw) => [ + q(4117), + q(0), + ], + q(max) => [ + q(4118), + q(0), + ], + q(may) => [ + q(0275), + q(0), + ], + q(maz) => [ + q(4119), + q(0), + ], + q(mba) => [ + q(4120), + q(0), + ], + q(mbb) => [ + q(4121), + q(0), + ], + q(mbc) => [ + q(4122), + q(0), + ], + q(mbd) => [ + q(4123), + q(0), + ], + q(mbe) => [ + q(4124), + q(0), + ], + q(mbf) => [ + q(4125), + q(0), + ], + q(mbh) => [ + q(4126), + q(0), + ], + q(mbi) => [ + q(4127), + q(0), + ], + q(mbj) => [ + q(4128), + q(0), + ], + q(mbk) => [ + q(4129), + q(0), + ], + q(mbl) => [ + q(4130), + q(0), + ], + q(mbm) => [ + q(4131), + q(0), + ], + q(mbn) => [ + q(4132), + q(0), + ], + q(mbo) => [ + q(4133), + q(0), + ], + q(mbp) => [ + q(4134), + q(0), + ], + q(mbq) => [ + q(4135), + q(0), + ], + q(mbr) => [ + q(4136), + q(0), + ], + q(mbs) => [ + q(4137), + q(0), + ], + q(mbt) => [ + q(4138), + q(0), + ], + q(mbu) => [ + q(4139), + q(0), + ], + q(mbv) => [ + q(4140), + q(0), + ], + q(mbw) => [ + q(4141), + q(0), + ], + q(mbx) => [ + q(4142), + q(0), + ], + q(mby) => [ + q(4143), + q(0), + ], + q(mbz) => [ + q(4144), + q(0), + ], + q(mca) => [ + q(4145), + q(0), + ], + q(mcb) => [ + q(4146), + q(0), + ], + q(mcc) => [ + q(4147), + q(0), + ], + q(mcd) => [ + q(4148), + q(0), + ], + q(mce) => [ + q(4149), + q(0), + ], + q(mcf) => [ + q(4150), + q(0), + ], + q(mcg) => [ + q(4151), + q(0), + ], + q(mch) => [ + q(4152), + q(0), + ], + q(mci) => [ + q(4153), + q(0), + ], + q(mcj) => [ + q(4154), + q(0), + ], + q(mck) => [ + q(4155), + q(0), + ], + q(mcl) => [ + q(4156), + q(0), + ], + q(mcm) => [ + q(4157), + q(0), + ], + q(mcn) => [ + q(4158), + q(0), + ], + q(mco) => [ + q(4159), + q(0), + ], + q(mcp) => [ + q(4160), + q(0), + ], + q(mcq) => [ + q(4161), + q(0), + ], + q(mcr) => [ + q(4162), + q(0), + ], + q(mcs) => [ + q(4163), + q(0), + ], + q(mct) => [ + q(4164), + q(0), + ], + q(mcu) => [ + q(4165), + q(0), + ], + q(mcv) => [ + q(4166), + q(0), + ], + q(mcw) => [ + q(4167), + q(0), + ], + q(mcx) => [ + q(4168), + q(0), + ], + q(mcy) => [ + q(4169), + q(0), + ], + q(mcz) => [ + q(4170), + q(0), + ], + q(mda) => [ + q(4171), + q(0), + ], + q(mdb) => [ + q(4172), + q(0), + ], + q(mdc) => [ + q(4173), + q(0), + ], + q(mdd) => [ + q(4174), + q(0), + ], + q(mde) => [ + q(4175), + q(0), + ], + q(mdf) => [ + q(0276), + q(0), + ], + q(mdg) => [ + q(4176), + q(0), + ], + q(mdh) => [ + q(4177), + q(0), + ], + q(mdi) => [ + q(4178), + q(0), + ], + q(mdj) => [ + q(4179), + q(0), + ], + q(mdk) => [ + q(4180), + q(0), + ], + q(mdl) => [ + q(4181), + q(0), + ], + q(mdm) => [ + q(4182), + q(0), + ], + q(mdn) => [ + q(4183), + q(0), + ], + q(mdp) => [ + q(4184), + q(0), + ], + q(mdq) => [ + q(4185), + q(0), + ], + q(mdr) => [ + q(0277), + q(0), + ], + q(mds) => [ + q(4186), + q(0), + ], + q(mdt) => [ + q(4187), + q(0), + ], + q(mdu) => [ + q(4188), + q(0), + ], + q(mdv) => [ + q(4189), + q(0), + ], + q(mdw) => [ + q(4190), + q(0), + ], + q(mdx) => [ + q(4191), + q(0), + ], + q(mdy) => [ + q(4192), + q(0), + ], + q(mdz) => [ + q(4193), + q(0), + ], + q(mea) => [ + q(4194), + q(0), + ], + q(meb) => [ + q(4195), + q(0), + ], + q(mec) => [ + q(4196), + q(0), + ], + q(med) => [ + q(4197), + q(0), + ], + q(mee) => [ + q(4198), + q(0), + ], + q(mef) => [ + q(4199), + q(0), + ], + q(meh) => [ + q(4200), + q(0), + ], + q(mei) => [ + q(4201), + q(0), + ], + q(mej) => [ + q(4202), + q(0), + ], + q(mek) => [ + q(4203), + q(0), + ], + q(mel) => [ + q(4204), + q(0), + ], + q(mem) => [ + q(4205), + q(0), + ], + q(men) => [ + q(0278), + q(1), + ], + q(meo) => [ + q(4206), + q(0), + ], + q(mep) => [ + q(4207), + q(0), + ], + q(meq) => [ + q(4208), + q(0), + ], + q(mer) => [ + q(4209), + q(0), + ], + q(mes) => [ + q(4210), + q(0), + ], + q(met) => [ + q(4211), + q(0), + ], + q(meu) => [ + q(4212), + q(0), + ], + q(mev) => [ + q(4213), + q(0), + ], + q(mew) => [ + q(4214), + q(0), + ], + q(mey) => [ + q(4215), + q(0), + ], + q(mez) => [ + q(4216), + q(0), + ], + q(mfa) => [ + q(4217), + q(0), + ], + q(mfb) => [ + q(4218), + q(0), + ], + q(mfc) => [ + q(4219), + q(0), + ], + q(mfd) => [ + q(4220), + q(0), + ], + q(mfe) => [ + q(4221), + q(0), + ], + q(mff) => [ + q(4222), + q(0), + ], + q(mfg) => [ + q(4223), + q(0), + ], + q(mfh) => [ + q(4224), + q(0), + ], + q(mfi) => [ + q(4225), + q(0), + ], + q(mfj) => [ + q(4226), + q(0), + ], + q(mfk) => [ + q(4227), + q(0), + ], + q(mfl) => [ + q(4228), + q(0), + ], + q(mfm) => [ + q(4229), + q(0), + ], + q(mfn) => [ + q(4230), + q(0), + ], + q(mfo) => [ + q(4231), + q(0), + ], + q(mfp) => [ + q(4232), + q(0), + ], + q(mfq) => [ + q(4233), + q(0), + ], + q(mfr) => [ + q(4234), + q(0), + ], + q(mfs) => [ + q(4235), + q(0), + ], + q(mft) => [ + q(4236), + q(0), + ], + q(mfu) => [ + q(4237), + q(0), + ], + q(mfv) => [ + q(4238), + q(0), + ], + q(mfw) => [ + q(4239), + q(0), + ], + q(mfx) => [ + q(4240), + q(0), + ], + q(mfy) => [ + q(4241), + q(0), + ], + q(mfz) => [ + q(4242), + q(0), + ], + q(mga) => [ + q(0279), + q(1), + ], + q(mgb) => [ + q(4243), + q(0), + ], + q(mgc) => [ + q(4244), + q(0), + ], + q(mgd) => [ + q(4245), + q(0), + ], + q(mge) => [ + q(4246), + q(0), + ], + q(mgf) => [ + q(4247), + q(0), + ], + q(mgg) => [ + q(4248), + q(0), + ], + q(mgh) => [ + q(4249), + q(0), + ], + q(mgi) => [ + q(4250), + q(0), + ], + q(mgj) => [ + q(4251), + q(0), + ], + q(mgk) => [ + q(4252), + q(0), + ], + q(mgl) => [ + q(4253), + q(0), + ], + q(mgm) => [ + q(4254), + q(0), + ], + q(mgn) => [ + q(4255), + q(0), + ], + q(mgo) => [ + q(4256), + q(0), + ], + q(mgp) => [ + q(4257), + q(0), + ], + q(mgq) => [ + q(4258), + q(0), + ], + q(mgr) => [ + q(4259), + q(0), + ], + q(mgs) => [ + q(4260), + q(0), + ], + q(mgt) => [ + q(4261), + q(0), + ], + q(mgu) => [ + q(4262), + q(0), + ], + q(mgv) => [ + q(4263), + q(0), + ], + q(mgw) => [ + q(4264), + q(0), + ], + q(mgy) => [ + q(4265), + q(0), + ], + q(mgz) => [ + q(4266), + q(0), + ], + q(mha) => [ + q(4267), + q(0), + ], + q(mhb) => [ + q(4268), + q(0), + ], + q(mhc) => [ + q(4269), + q(0), + ], + q(mhd) => [ + q(4270), + q(0), + ], + q(mhe) => [ + q(4271), + q(0), + ], + q(mhf) => [ + q(4272), + q(0), + ], + q(mhg) => [ + q(4273), + q(0), + ], + q(mhi) => [ + q(4274), + q(0), + ], + q(mhj) => [ + q(4275), + q(0), + ], + q(mhk) => [ + q(4276), + q(0), + ], + q(mhl) => [ + q(4277), + q(0), + ], + q(mhm) => [ + q(4278), + q(0), + ], + q(mhn) => [ + q(4279), + q(0), + ], + q(mho) => [ + q(4280), + q(0), + ], + q(mhp) => [ + q(4281), + q(0), + ], + q(mhq) => [ + q(4282), + q(0), + ], + q(mhr) => [ + q(4283), + q(0), + ], + q(mhs) => [ + q(4284), + q(0), + ], + q(mht) => [ + q(4285), + q(0), + ], + q(mhu) => [ + q(4286), + q(0), + ], + q(mhw) => [ + q(4287), + q(0), + ], + q(mhx) => [ + q(4288), + q(0), + ], + q(mhy) => [ + q(4289), + q(0), + ], + q(mhz) => [ + q(4290), + q(0), + ], + q(mia) => [ + q(4291), + q(0), + ], + q(mib) => [ + q(4292), + q(0), + ], + q(mic) => [ + q(0280), + q(0), + ], + q(mid) => [ + q(4293), + q(0), + ], + q(mie) => [ + q(4294), + q(0), + ], + q(mif) => [ + q(4295), + q(0), + ], + q(mig) => [ + q(4296), + q(0), + ], + q(mih) => [ + q(4297), + q(0), + ], + q(mii) => [ + q(4298), + q(0), + ], + q(mij) => [ + q(4299), + q(0), + ], + q(mik) => [ + q(4300), + q(0), + ], + q(mil) => [ + q(4301), + q(0), + ], + q(mim) => [ + q(4302), + q(0), + ], + q(min) => [ + q(0281), + q(0), + ], + q(mio) => [ + q(4303), + q(0), + ], + q(mip) => [ + q(4304), + q(0), + ], + q(miq) => [ + q(4305), + q(0), + ], + q(mir) => [ + q(4306), + q(0), + ], + q(mis) => [ + q(0282), + q(0), + ], + q(mit) => [ + q(4307), + q(0), + ], + q(miu) => [ + q(4308), + q(0), + ], + q(miw) => [ + q(4309), + q(0), + ], + q(mix) => [ + q(4310), + q(0), + ], + q(miy) => [ + q(4311), + q(0), + ], + q(miz) => [ + q(4312), + q(0), + ], + q(mjb) => [ + q(4313), + q(0), + ], + q(mjc) => [ + q(4314), + q(0), + ], + q(mjd) => [ + q(4315), + q(0), + ], + q(mje) => [ + q(4316), + q(0), + ], + q(mjg) => [ + q(4317), + q(0), + ], + q(mjh) => [ + q(4318), + q(0), + ], + q(mji) => [ + q(4319), + q(0), + ], + q(mjj) => [ + q(4320), + q(0), + ], + q(mjk) => [ + q(4321), + q(0), + ], + q(mjl) => [ + q(4322), + q(0), + ], + q(mjm) => [ + q(4323), + q(0), + ], + q(mjn) => [ + q(4324), + q(0), + ], + q(mjo) => [ + q(4325), + q(0), + ], + q(mjp) => [ + q(4326), + q(0), + ], + q(mjq) => [ + q(4327), + q(0), + ], + q(mjr) => [ + q(4328), + q(0), + ], + q(mjs) => [ + q(4329), + q(0), + ], + q(mjt) => [ + q(4330), + q(0), + ], + q(mju) => [ + q(4331), + q(0), + ], + q(mjv) => [ + q(4332), + q(0), + ], + q(mjw) => [ + q(4333), + q(0), + ], + q(mjx) => [ + q(4334), + q(0), + ], + q(mjy) => [ + q(4335), + q(0), + ], + q(mjz) => [ + q(4336), + q(0), + ], + q(mka) => [ + q(4337), + q(0), + ], + q(mkb) => [ + q(4338), + q(0), + ], + q(mkc) => [ + q(4339), + q(0), + ], + q(mke) => [ + q(4340), + q(0), + ], + q(mkf) => [ + q(4341), + q(0), + ], + q(mkg) => [ + q(4342), + q(0), + ], + q(mkh) => [ + q(0283), + q(0), + ], + q(mki) => [ + q(4343), + q(0), + ], + q(mkj) => [ + q(4344), + q(0), + ], + q(mkk) => [ + q(4345), + q(0), + ], + q(mkl) => [ + q(4346), + q(0), + ], + q(mkm) => [ + q(4347), + q(0), + ], + q(mkn) => [ + q(4348), + q(0), + ], + q(mko) => [ + q(4349), + q(0), + ], + q(mkp) => [ + q(4350), + q(0), + ], + q(mkq) => [ + q(4351), + q(0), + ], + q(mkr) => [ + q(4352), + q(0), + ], + q(mks) => [ + q(4353), + q(0), + ], + q(mkt) => [ + q(4354), + q(0), + ], + q(mku) => [ + q(4355), + q(0), + ], + q(mkv) => [ + q(4356), + q(0), + ], + q(mkw) => [ + q(4357), + q(0), + ], + q(mkx) => [ + q(4358), + q(0), + ], + q(mky) => [ + q(4359), + q(0), + ], + q(mkz) => [ + q(4360), + q(0), + ], + q(mla) => [ + q(4361), + q(0), + ], + q(mlb) => [ + q(4362), + q(0), + ], + q(mlc) => [ + q(4363), + q(0), + ], + q(mle) => [ + q(4364), + q(0), + ], + q(mlf) => [ + q(4365), + q(0), + ], + q(mlg) => [ + q(0284), + q(0), + ], + q(mlh) => [ + q(4366), + q(0), + ], + q(mli) => [ + q(4367), + q(0), + ], + q(mlj) => [ + q(4368), + q(0), + ], + q(mlk) => [ + q(4369), + q(0), + ], + q(mll) => [ + q(4370), + q(0), + ], + q(mlm) => [ + q(4371), + q(0), + ], + q(mln) => [ + q(4372), + q(0), + ], + q(mlo) => [ + q(4373), + q(0), + ], + q(mlp) => [ + q(4374), + q(0), + ], + q(mlq) => [ + q(4375), + q(0), + ], + q(mlr) => [ + q(4376), + q(0), + ], + q(mls) => [ + q(4377), + q(0), + ], + q(mlt) => [ + q(0285), + q(0), + ], + q(mlu) => [ + q(4378), + q(0), + ], + q(mlv) => [ + q(4379), + q(0), + ], + q(mlw) => [ + q(4380), + q(0), + ], + q(mlx) => [ + q(4381), + q(0), + ], + q(mlz) => [ + q(4382), + q(0), + ], + q(mma) => [ + q(4383), + q(0), + ], + q(mmb) => [ + q(4384), + q(0), + ], + q(mmc) => [ + q(4385), + q(0), + ], + q(mmd) => [ + q(4386), + q(0), + ], + q(mme) => [ + q(4387), + q(0), + ], + q(mmf) => [ + q(4388), + q(0), + ], + q(mmg) => [ + q(4389), + q(0), + ], + q(mmh) => [ + q(4390), + q(0), + ], + q(mmi) => [ + q(4391), + q(0), + ], + q(mmj) => [ + q(4392), + q(0), + ], + q(mmk) => [ + q(4393), + q(0), + ], + q(mml) => [ + q(4394), + q(0), + ], + q(mmm) => [ + q(4395), + q(0), + ], + q(mmn) => [ + q(4396), + q(0), + ], + q(mmo) => [ + q(4397), + q(0), + ], + q(mmp) => [ + q(4398), + q(0), + ], + q(mmq) => [ + q(4399), + q(0), + ], + q(mmr) => [ + q(4400), + q(0), + ], + q(mmt) => [ + q(4401), + q(0), + ], + q(mmu) => [ + q(4402), + q(0), + ], + q(mmv) => [ + q(4403), + q(0), + ], + q(mmw) => [ + q(4404), + q(0), + ], + q(mmx) => [ + q(4405), + q(0), + ], + q(mmy) => [ + q(4406), + q(0), + ], + q(mmz) => [ + q(4407), + q(0), + ], + q(mna) => [ + q(4408), + q(0), + ], + q(mnb) => [ + q(4409), + q(0), + ], + q(mnc) => [ + q(0286), + q(0), + ], + q(mnd) => [ + q(4410), + q(0), + ], + q(mne) => [ + q(4411), + q(0), + ], + q(mnf) => [ + q(4412), + q(0), + ], + q(mng) => [ + q(4413), + q(0), + ], + q(mnh) => [ + q(4414), + q(0), + ], + q(mni) => [ + q(0287), + q(0), + ], + q(mnj) => [ + q(4415), + q(0), + ], + q(mnk) => [ + q(4416), + q(0), + ], + q(mnl) => [ + q(4417), + q(0), + ], + q(mnm) => [ + q(4418), + q(0), + ], + q(mnn) => [ + q(4419), + q(0), + ], + q(mno) => [ + q(0288), + q(0), + ], + q(mnp) => [ + q(4420), + q(0), + ], + q(mnq) => [ + q(4421), + q(0), + ], + q(mnr) => [ + q(4422), + q(0), + ], + q(mns) => [ + q(4423), + q(0), + ], + q(mnu) => [ + q(4424), + q(0), + ], + q(mnv) => [ + q(4425), + q(0), + ], + q(mnw) => [ + q(4426), + q(0), + ], + q(mnx) => [ + q(4427), + q(0), + ], + q(mny) => [ + q(4428), + q(0), + ], + q(mnz) => [ + q(4429), + q(0), + ], + q(moa) => [ + q(4430), + q(0), + ], + q(moc) => [ + q(4431), + q(0), + ], + q(mod) => [ + q(4432), + q(0), + ], + q(moe) => [ + q(4433), + q(0), + ], + q(mog) => [ + q(4434), + q(0), + ], + q(moh) => [ + q(0289), + q(0), + ], + q(moi) => [ + q(4435), + q(0), + ], + q(moj) => [ + q(4436), + q(0), + ], + q(mok) => [ + q(4437), + q(0), + ], + q(mom) => [ + q(4438), + q(0), + ], + q(mon) => [ + q(0290), + q(0), + ], + q(moo) => [ + q(4439), + q(0), + ], + q(mop) => [ + q(4440), + q(0), + ], + q(moq) => [ + q(4441), + q(0), + ], + q(mor) => [ + q(4442), + q(0), + ], + q(mos) => [ + q(0291), + q(0), + ], + q(mot) => [ + q(1137), + q(0), + ], + q(mou) => [ + q(4443), + q(0), + ], + q(mov) => [ + q(4444), + q(0), + ], + q(mow) => [ + q(4445), + q(0), + ], + q(mox) => [ + q(4446), + q(0), + ], + q(moy) => [ + q(4447), + q(0), + ], + q(moz) => [ + q(4448), + q(0), + ], + q(mpa) => [ + q(4449), + q(0), + ], + q(mpb) => [ + q(4450), + q(0), + ], + q(mpc) => [ + q(4451), + q(0), + ], + q(mpd) => [ + q(4452), + q(0), + ], + q(mpe) => [ + q(4453), + q(0), + ], + q(mpg) => [ + q(4454), + q(0), + ], + q(mph) => [ + q(4455), + q(0), + ], + q(mpi) => [ + q(4456), + q(0), + ], + q(mpj) => [ + q(4457), + q(0), + ], + q(mpk) => [ + q(4458), + q(0), + ], + q(mpl) => [ + q(4459), + q(0), + ], + q(mpm) => [ + q(4460), + q(0), + ], + q(mpn) => [ + q(4461), + q(0), + ], + q(mpo) => [ + q(4462), + q(0), + ], + q(mpp) => [ + q(4463), + q(0), + ], + q(mpq) => [ + q(4464), + q(0), + ], + q(mpr) => [ + q(4465), + q(0), + ], + q(mps) => [ + q(4466), + q(0), + ], + q(mpt) => [ + q(4467), + q(0), + ], + q(mpu) => [ + q(4468), + q(0), + ], + q(mpv) => [ + q(4469), + q(0), + ], + q(mpw) => [ + q(4470), + q(0), + ], + q(mpx) => [ + q(4471), + q(0), + ], + q(mpy) => [ + q(4472), + q(0), + ], + q(mpz) => [ + q(4473), + q(0), + ], + q(mqa) => [ + q(4474), + q(0), + ], + q(mqb) => [ + q(4475), + q(0), + ], + q(mqc) => [ + q(4476), + q(0), + ], + q(mqe) => [ + q(4477), + q(0), + ], + q(mqf) => [ + q(4478), + q(0), + ], + q(mqg) => [ + q(4479), + q(0), + ], + q(mqh) => [ + q(4480), + q(0), + ], + q(mqi) => [ + q(4481), + q(0), + ], + q(mqj) => [ + q(4482), + q(0), + ], + q(mqk) => [ + q(4483), + q(0), + ], + q(mql) => [ + q(4484), + q(0), + ], + q(mqm) => [ + q(4485), + q(0), + ], + q(mqn) => [ + q(4486), + q(0), + ], + q(mqo) => [ + q(4487), + q(0), + ], + q(mqp) => [ + q(4488), + q(0), + ], + q(mqq) => [ + q(4489), + q(0), + ], + q(mqr) => [ + q(4490), + q(0), + ], + q(mqs) => [ + q(4491), + q(0), + ], + q(mqt) => [ + q(4492), + q(0), + ], + q(mqu) => [ + q(4493), + q(0), + ], + q(mqv) => [ + q(4494), + q(0), + ], + q(mqw) => [ + q(4495), + q(0), + ], + q(mqx) => [ + q(4496), + q(0), + ], + q(mqy) => [ + q(4497), + q(0), + ], + q(mqz) => [ + q(4498), + q(0), + ], + q(mra) => [ + q(4499), + q(0), + ], + q(mrb) => [ + q(4500), + q(0), + ], + q(mrc) => [ + q(4501), + q(0), + ], + q(mrd) => [ + q(4502), + q(0), + ], + q(mre) => [ + q(4503), + q(0), + ], + q(mrf) => [ + q(4504), + q(0), + ], + q(mrg) => [ + q(4505), + q(0), + ], + q(mrh) => [ + q(4506), + q(0), + ], + q(mrj) => [ + q(4507), + q(0), + ], + q(mrk) => [ + q(4508), + q(0), + ], + q(mrl) => [ + q(4509), + q(0), + ], + q(mrm) => [ + q(4510), + q(0), + ], + q(mrn) => [ + q(4511), + q(0), + ], + q(mro) => [ + q(4512), + q(0), + ], + q(mrp) => [ + q(4513), + q(0), + ], + q(mrq) => [ + q(4514), + q(0), + ], + q(mrr) => [ + q(4515), + q(0), + ], + q(mrs) => [ + q(4516), + q(0), + ], + q(mrt) => [ + q(4517), + q(0), + ], + q(mru) => [ + q(4518), + q(0), + ], + q(mrv) => [ + q(4519), + q(0), + ], + q(mrw) => [ + q(4520), + q(0), + ], + q(mrx) => [ + q(4521), + q(0), + ], + q(mry) => [ + q(4522), + q(0), + ], + q(mrz) => [ + q(4523), + q(0), + ], + q(msb) => [ + q(4524), + q(0), + ], + q(msc) => [ + q(4525), + q(0), + ], + q(msd) => [ + q(4526), + q(0), + ], + q(mse) => [ + q(4527), + q(0), + ], + q(msf) => [ + q(4528), + q(0), + ], + q(msg) => [ + q(4529), + q(0), + ], + q(msh) => [ + q(4530), + q(0), + ], + q(msi) => [ + q(4531), + q(0), + ], + q(msj) => [ + q(4532), + q(0), + ], + q(msk) => [ + q(4533), + q(0), + ], + q(msl) => [ + q(4534), + q(0), + ], + q(msm) => [ + q(4535), + q(0), + ], + q(msn) => [ + q(4536), + q(0), + ], + q(mso) => [ + q(4537), + q(0), + ], + q(msp) => [ + q(4538), + q(0), + ], + q(msq) => [ + q(4539), + q(0), + ], + q(msr) => [ + q(4540), + q(0), + ], + q(mss) => [ + q(4541), + q(0), + ], + q(msu) => [ + q(4542), + q(0), + ], + q(msv) => [ + q(4543), + q(0), + ], + q(msw) => [ + q(4544), + q(0), + ], + q(msx) => [ + q(4545), + q(0), + ], + q(msy) => [ + q(4546), + q(0), + ], + q(msz) => [ + q(4547), + q(0), + ], + q(mta) => [ + q(4548), + q(0), + ], + q(mtb) => [ + q(4549), + q(0), + ], + q(mtc) => [ + q(4550), + q(0), + ], + q(mtd) => [ + q(4551), + q(0), + ], + q(mte) => [ + q(4552), + q(0), + ], + q(mtf) => [ + q(4553), + q(0), + ], + q(mtg) => [ + q(4554), + q(0), + ], + q(mth) => [ + q(4555), + q(0), + ], + q(mti) => [ + q(4556), + q(0), + ], + q(mtj) => [ + q(4557), + q(0), + ], + q(mtk) => [ + q(4558), + q(0), + ], + q(mtl) => [ + q(4559), + q(0), + ], + q(mtm) => [ + q(4560), + q(0), + ], + q(mtn) => [ + q(4561), + q(0), + ], + q(mto) => [ + q(4562), + q(0), + ], + q(mtp) => [ + q(4563), + q(0), + ], + q(mtq) => [ + q(4564), + q(0), + ], + q(mtr) => [ + q(4565), + q(0), + ], + q(mts) => [ + q(4566), + q(0), + ], + q(mtt) => [ + q(4567), + q(0), + ], + q(mtu) => [ + q(4568), + q(0), + ], + q(mtv) => [ + q(4569), + q(0), + ], + q(mtw) => [ + q(4570), + q(0), + ], + q(mtx) => [ + q(4571), + q(0), + ], + q(mty) => [ + q(4572), + q(0), + ], + q(mua) => [ + q(4573), + q(0), + ], + q(mub) => [ + q(4574), + q(0), + ], + q(muc) => [ + q(4575), + q(0), + ], + q(mud) => [ + q(4576), + q(0), + ], + q(mue) => [ + q(4577), + q(0), + ], + q(mug) => [ + q(4578), + q(0), + ], + q(muh) => [ + q(4579), + q(0), + ], + q(mui) => [ + q(4580), + q(0), + ], + q(muj) => [ + q(4581), + q(0), + ], + q(muk) => [ + q(4582), + q(0), + ], + q(mul) => [ + q(0292), + q(0), + ], + q(mum) => [ + q(4583), + q(0), + ], + q(mun) => [ + q(0293), + q(0), + ], + q(muo) => [ + q(4584), + q(0), + ], + q(mup) => [ + q(4585), + q(0), + ], + q(muq) => [ + q(4586), + q(0), + ], + q(mur) => [ + q(4587), + q(0), + ], + q(mus) => [ + q(0294), + q(0), + ], + q(mut) => [ + q(4588), + q(0), + ], + q(muu) => [ + q(4589), + q(0), + ], + q(muv) => [ + q(4590), + q(0), + ], + q(mux) => [ + q(4591), + q(0), + ], + q(muy) => [ + q(4592), + q(0), + ], + q(muz) => [ + q(4593), + q(0), + ], + q(mva) => [ + q(4594), + q(0), + ], + q(mvb) => [ + q(4595), + q(0), + ], + q(mvd) => [ + q(4596), + q(0), + ], + q(mve) => [ + q(4597), + q(0), + ], + q(mvf) => [ + q(4598), + q(0), + ], + q(mvg) => [ + q(4599), + q(0), + ], + q(mvh) => [ + q(4600), + q(0), + ], + q(mvi) => [ + q(4601), + q(0), + ], + q(mvk) => [ + q(4602), + q(0), + ], + q(mvl) => [ + q(4603), + q(0), + ], + q(mvm) => [ + q(4604), + q(0), + ], + q(mvn) => [ + q(4605), + q(0), + ], + q(mvo) => [ + q(4606), + q(0), + ], + q(mvp) => [ + q(4607), + q(0), + ], + q(mvq) => [ + q(4608), + q(0), + ], + q(mvr) => [ + q(4609), + q(0), + ], + q(mvs) => [ + q(4610), + q(0), + ], + q(mvt) => [ + q(4611), + q(0), + ], + q(mvu) => [ + q(4612), + q(0), + ], + q(mvv) => [ + q(4613), + q(0), + ], + q(mvw) => [ + q(4614), + q(0), + ], + q(mvx) => [ + q(4615), + q(0), + ], + q(mvy) => [ + q(4616), + q(0), + ], + q(mvz) => [ + q(4617), + q(0), + ], + q(mwa) => [ + q(4618), + q(0), + ], + q(mwb) => [ + q(4619), + q(0), + ], + q(mwc) => [ + q(4620), + q(0), + ], + q(mwe) => [ + q(4621), + q(0), + ], + q(mwf) => [ + q(4622), + q(0), + ], + q(mwg) => [ + q(4623), + q(0), + ], + q(mwh) => [ + q(4624), + q(0), + ], + q(mwi) => [ + q(4625), + q(0), + ], + q(mwk) => [ + q(4626), + q(0), + ], + q(mwl) => [ + q(0295), + q(0), + ], + q(mwm) => [ + q(4627), + q(0), + ], + q(mwn) => [ + q(4628), + q(0), + ], + q(mwo) => [ + q(4629), + q(0), + ], + q(mwp) => [ + q(4630), + q(0), + ], + q(mwq) => [ + q(4631), + q(0), + ], + q(mwr) => [ + q(0296), + q(0), + ], + q(mws) => [ + q(4632), + q(0), + ], + q(mwt) => [ + q(4633), + q(0), + ], + q(mwu) => [ + q(4634), + q(0), + ], + q(mwv) => [ + q(4635), + q(0), + ], + q(mww) => [ + q(4636), + q(0), + ], + q(mwx) => [ + q(4637), + q(0), + ], + q(mwy) => [ + q(4638), + q(0), + ], + q(mwz) => [ + q(4639), + q(0), + ], + q(mxa) => [ + q(4640), + q(0), + ], + q(mxb) => [ + q(4641), + q(0), + ], + q(mxc) => [ + q(4642), + q(0), + ], + q(mxd) => [ + q(4643), + q(0), + ], + q(mxe) => [ + q(4644), + q(0), + ], + q(mxf) => [ + q(4645), + q(0), + ], + q(mxg) => [ + q(4646), + q(0), + ], + q(mxh) => [ + q(4647), + q(0), + ], + q(mxi) => [ + q(4648), + q(0), + ], + q(mxj) => [ + q(4649), + q(0), + ], + q(mxk) => [ + q(4650), + q(0), + ], + q(mxl) => [ + q(4651), + q(0), + ], + q(mxm) => [ + q(4652), + q(0), + ], + q(mxn) => [ + q(4653), + q(0), + ], + q(mxo) => [ + q(4654), + q(0), + ], + q(mxp) => [ + q(4655), + q(0), + ], + q(mxq) => [ + q(4656), + q(0), + ], + q(mxr) => [ + q(4657), + q(0), + ], + q(mxs) => [ + q(4658), + q(0), + ], + q(mxt) => [ + q(4659), + q(0), + ], + q(mxu) => [ + q(4660), + q(0), + ], + q(mxv) => [ + q(4661), + q(0), + ], + q(mxw) => [ + q(4662), + q(0), + ], + q(mxx) => [ + q(4663), + q(0), + ], + q(mxy) => [ + q(4664), + q(0), + ], + q(mxz) => [ + q(4665), + q(0), + ], + q(myb) => [ + q(4666), + q(0), + ], + q(myc) => [ + q(4667), + q(0), + ], + q(myd) => [ + q(4668), + q(0), + ], + q(mye) => [ + q(4669), + q(0), + ], + q(myf) => [ + q(4670), + q(0), + ], + q(myg) => [ + q(4671), + q(0), + ], + q(myh) => [ + q(4672), + q(0), + ], + q(myi) => [ + q(4673), + q(0), + ], + q(myj) => [ + q(4674), + q(0), + ], + q(myk) => [ + q(4675), + q(0), + ], + q(myl) => [ + q(4676), + q(0), + ], + q(mym) => [ + q(4677), + q(0), + ], + q(myn) => [ + q(0297), + q(0), + ], + q(myo) => [ + q(4678), + q(0), + ], + q(myp) => [ + q(4679), + q(0), + ], + q(myr) => [ + q(4680), + q(0), + ], + q(mys) => [ + q(4681), + q(0), + ], + q(myu) => [ + q(4682), + q(0), + ], + q(myv) => [ + q(0298), + q(0), + ], + q(myw) => [ + q(4683), + q(0), + ], + q(myx) => [ + q(4684), + q(0), + ], + q(myy) => [ + q(4685), + q(0), + ], + q(myz) => [ + q(4686), + q(0), + ], + q(mza) => [ + q(4687), + q(0), + ], + q(mzb) => [ + q(4688), + q(0), + ], + q(mzc) => [ + q(4689), + q(0), + ], + q(mzd) => [ + q(4690), + q(0), + ], + q(mze) => [ + q(4691), + q(0), + ], + q(mzg) => [ + q(4692), + q(0), + ], + q(mzh) => [ + q(4693), + q(0), + ], + q(mzi) => [ + q(4694), + q(0), + ], + q(mzj) => [ + q(4695), + q(0), + ], + q(mzk) => [ + q(4696), + q(0), + ], + q(mzl) => [ + q(4697), + q(0), + ], + q(mzm) => [ + q(4698), + q(0), + ], + q(mzn) => [ + q(4699), + q(0), + ], + q(mzo) => [ + q(4700), + q(0), + ], + q(mzp) => [ + q(4701), + q(0), + ], + q(mzq) => [ + q(4702), + q(0), + ], + q(mzr) => [ + q(4703), + q(0), + ], + q(mzs) => [ + q(4704), + q(0), + ], + q(mzt) => [ + q(4705), + q(0), + ], + q(mzu) => [ + q(4706), + q(0), + ], + q(mzv) => [ + q(4707), + q(0), + ], + q(mzw) => [ + q(4708), + q(0), + ], + q(mzx) => [ + q(4709), + q(0), + ], + q(mzy) => [ + q(4710), + q(0), + ], + q(mzz) => [ + q(4711), + q(0), + ], + q(naa) => [ + q(4712), + q(0), + ], + q(nab) => [ + q(4713), + q(0), + ], + q(nac) => [ + q(4714), + q(0), + ], + q(nae) => [ + q(4715), + q(0), + ], + q(naf) => [ + q(4716), + q(0), + ], + q(nag) => [ + q(4717), + q(0), + ], + q(nah) => [ + q(0299), + q(0), + ], + q(nai) => [ + q(0300), + q(0), + ], + q(naj) => [ + q(4718), + q(0), + ], + q(nak) => [ + q(4719), + q(0), + ], + q(nal) => [ + q(4720), + q(0), + ], + q(nam) => [ + q(4721), + q(0), + ], + q(nan) => [ + q(4722), + q(0), + ], + q(nao) => [ + q(4723), + q(0), + ], + q(nap) => [ + q(0301), + q(0), + ], + q(naq) => [ + q(4724), + q(0), + ], + q(nar) => [ + q(4725), + q(0), + ], + q(nas) => [ + q(4726), + q(0), + ], + q(nat) => [ + q(4727), + q(0), + ], + q(nau) => [ + q(0302), + q(0), + ], + q(nav) => [ + q(0303), + q(0), + ], + q(naw) => [ + q(4728), + q(0), + ], + q(nax) => [ + q(4729), + q(0), + ], + q(nay) => [ + q(4730), + q(0), + ], + q(naz) => [ + q(4731), + q(0), + ], + q(nba) => [ + q(4732), + q(0), + ], + q(nbb) => [ + q(4733), + q(0), + ], + q(nbc) => [ + q(4734), + q(0), + ], + q(nbd) => [ + q(4735), + q(0), + ], + q(nbe) => [ + q(4736), + q(0), + ], + q(nbg) => [ + q(4737), + q(0), + ], + q(nbh) => [ + q(4738), + q(0), + ], + q(nbi) => [ + q(4739), + q(0), + ], + q(nbj) => [ + q(4740), + q(0), + ], + q(nbk) => [ + q(4741), + q(0), + ], + q(nbl) => [ + q(0304), + q(0), + ], + q(nbm) => [ + q(4742), + q(0), + ], + q(nbn) => [ + q(4743), + q(0), + ], + q(nbo) => [ + q(4744), + q(0), + ], + q(nbp) => [ + q(4745), + q(0), + ], + q(nbq) => [ + q(4746), + q(0), + ], + q(nbr) => [ + q(4747), + q(0), + ], + q(nbs) => [ + q(4748), + q(0), + ], + q(nbt) => [ + q(4749), + q(0), + ], + q(nbu) => [ + q(4750), + q(0), + ], + q(nbv) => [ + q(4751), + q(0), + ], + q(nbw) => [ + q(4752), + q(0), + ], + q(nby) => [ + q(4753), + q(0), + ], + q(nca) => [ + q(4754), + q(0), + ], + q(ncb) => [ + q(4755), + q(0), + ], + q(ncc) => [ + q(4756), + q(0), + ], + q(ncd) => [ + q(4757), + q(0), + ], + q(nce) => [ + q(4758), + q(0), + ], + q(ncf) => [ + q(4759), + q(0), + ], + q(ncg) => [ + q(4760), + q(0), + ], + q(nch) => [ + q(4761), + q(0), + ], + q(nci) => [ + q(4762), + q(0), + ], + q(ncj) => [ + q(4763), + q(0), + ], + q(nck) => [ + q(4764), + q(0), + ], + q(ncl) => [ + q(4765), + q(0), + ], + q(ncm) => [ + q(4766), + q(0), + ], + q(ncn) => [ + q(4767), + q(0), + ], + q(nco) => [ + q(4768), + q(0), + ], + q(ncp) => [ + q(4769), + q(0), + ], + q(ncq) => [ + q(4770), + q(0), + ], + q(ncr) => [ + q(4771), + q(0), + ], + q(ncs) => [ + q(4772), + q(0), + ], + q(nct) => [ + q(4773), + q(0), + ], + q(ncu) => [ + q(4774), + q(0), + ], + q(ncx) => [ + q(4775), + q(0), + ], + q(ncz) => [ + q(4776), + q(0), + ], + q(nda) => [ + q(4777), + q(0), + ], + q(ndb) => [ + q(4778), + q(0), + ], + q(ndc) => [ + q(4779), + q(0), + ], + q(ndd) => [ + q(4780), + q(0), + ], + q(nde) => [ + q(0305), + q(0), + ], + q(ndf) => [ + q(4781), + q(0), + ], + q(ndg) => [ + q(4782), + q(0), + ], + q(ndh) => [ + q(4783), + q(0), + ], + q(ndi) => [ + q(4784), + q(0), + ], + q(ndj) => [ + q(4785), + q(0), + ], + q(ndk) => [ + q(4786), + q(0), + ], + q(ndl) => [ + q(4787), + q(0), + ], + q(ndm) => [ + q(4788), + q(0), + ], + q(ndn) => [ + q(4789), + q(0), + ], + q(ndo) => [ + q(0306), + q(0), + ], + q(ndp) => [ + q(4790), + q(0), + ], + q(ndq) => [ + q(4791), + q(0), + ], + q(ndr) => [ + q(4792), + q(0), + ], + q(nds) => [ + q(0307), + q(0), + ], + q(ndt) => [ + q(4793), + q(0), + ], + q(ndu) => [ + q(4794), + q(0), + ], + q(ndv) => [ + q(4795), + q(0), + ], + q(ndw) => [ + q(4796), + q(0), + ], + q(ndx) => [ + q(4797), + q(0), + ], + q(ndy) => [ + q(4798), + q(0), + ], + q(ndz) => [ + q(4799), + q(0), + ], + q(nea) => [ + q(4800), + q(0), + ], + q(neb) => [ + q(4801), + q(0), + ], + q(nec) => [ + q(4802), + q(0), + ], + q(ned) => [ + q(4803), + q(0), + ], + q(nee) => [ + q(4804), + q(0), + ], + q(nef) => [ + q(4805), + q(0), + ], + q(neg) => [ + q(4806), + q(0), + ], + q(neh) => [ + q(4807), + q(0), + ], + q(nei) => [ + q(4808), + q(0), + ], + q(nej) => [ + q(4809), + q(0), + ], + q(nek) => [ + q(4810), + q(0), + ], + q(nem) => [ + q(4811), + q(0), + ], + q(nen) => [ + q(4812), + q(0), + ], + q(neo) => [ + q(4813), + q(0), + ], + q(nep) => [ + q(0308), + q(0), + ], + q(neq) => [ + q(4814), + q(0), + ], + q(ner) => [ + q(4815), + q(0), + ], + q(nes) => [ + q(4816), + q(0), + ], + q(net) => [ + q(4817), + q(0), + ], + q(neu) => [ + q(4818), + q(0), + ], + q(nev) => [ + q(4819), + q(0), + ], + q(new) => [ + q(0309), + q(1), + ], + q(nex) => [ + q(4820), + q(0), + ], + q(ney) => [ + q(4821), + q(0), + ], + q(nez) => [ + q(4822), + q(0), + ], + q(nfa) => [ + q(4823), + q(0), + ], + q(nfd) => [ + q(4824), + q(0), + ], + q(nfl) => [ + q(4825), + q(0), + ], + q(nfr) => [ + q(4826), + q(0), + ], + q(nfu) => [ + q(4827), + q(0), + ], + q(nga) => [ + q(4828), + q(0), + ], + q(ngb) => [ + q(4829), + q(0), + ], + q(ngc) => [ + q(4830), + q(0), + ], + q(ngd) => [ + q(4831), + q(0), + ], + q(nge) => [ + q(4832), + q(0), + ], + q(ngf) => [ + q(0517), + q(0), + ], + q(ngg) => [ + q(4833), + q(0), + ], + q(ngh) => [ + q(4834), + q(0), + ], + q(ngi) => [ + q(4835), + q(0), + ], + q(ngj) => [ + q(4836), + q(0), + ], + q(ngk) => [ + q(4837), + q(0), + ], + q(ngl) => [ + q(4838), + q(0), + ], + q(ngm) => [ + q(4839), + q(0), + ], + q(ngn) => [ + q(4840), + q(0), + ], + q(ngo) => [ + q(4841), + q(0), + ], + q(ngp) => [ + q(4842), + q(0), + ], + q(ngq) => [ + q(4843), + q(0), + ], + q(ngr) => [ + q(4844), + q(0), + ], + q(ngs) => [ + q(4845), + q(0), + ], + q(ngt) => [ + q(4846), + q(0), + ], + q(ngu) => [ + q(4847), + q(0), + ], + q(ngv) => [ + q(4848), + q(0), + ], + q(ngw) => [ + q(4849), + q(0), + ], + q(ngx) => [ + q(4850), + q(0), + ], + q(ngy) => [ + q(4851), + q(0), + ], + q(ngz) => [ + q(4852), + q(0), + ], + q(nha) => [ + q(4853), + q(0), + ], + q(nhb) => [ + q(4854), + q(0), + ], + q(nhc) => [ + q(4855), + q(0), + ], + q(nhd) => [ + q(4856), + q(0), + ], + q(nhe) => [ + q(4857), + q(0), + ], + q(nhf) => [ + q(4858), + q(0), + ], + q(nhg) => [ + q(4859), + q(0), + ], + q(nhh) => [ + q(4860), + q(0), + ], + q(nhi) => [ + q(4861), + q(0), + ], + q(nhk) => [ + q(4862), + q(0), + ], + q(nhm) => [ + q(4863), + q(0), + ], + q(nhn) => [ + q(4864), + q(0), + ], + q(nho) => [ + q(4865), + q(0), + ], + q(nhp) => [ + q(4866), + q(0), + ], + q(nhq) => [ + q(4867), + q(0), + ], + q(nhr) => [ + q(4868), + q(0), + ], + q(nht) => [ + q(4869), + q(0), + ], + q(nhu) => [ + q(4870), + q(0), + ], + q(nhv) => [ + q(4871), + q(0), + ], + q(nhw) => [ + q(4872), + q(0), + ], + q(nhx) => [ + q(4873), + q(0), + ], + q(nhy) => [ + q(4874), + q(0), + ], + q(nhz) => [ + q(4875), + q(0), + ], + q(nia) => [ + q(0310), + q(0), + ], + q(nib) => [ + q(4876), + q(0), + ], + q(nic) => [ + q(0311), + q(0), + ], + q(nid) => [ + q(4877), + q(0), + ], + q(nie) => [ + q(4878), + q(0), + ], + q(nif) => [ + q(4879), + q(0), + ], + q(nig) => [ + q(4880), + q(0), + ], + q(nih) => [ + q(4881), + q(0), + ], + q(nii) => [ + q(4882), + q(0), + ], + q(nij) => [ + q(4883), + q(0), + ], + q(nik) => [ + q(4884), + q(0), + ], + q(nil) => [ + q(4885), + q(0), + ], + q(nim) => [ + q(4886), + q(0), + ], + q(nin) => [ + q(4887), + q(0), + ], + q(nio) => [ + q(4888), + q(0), + ], + q(niq) => [ + q(4889), + q(0), + ], + q(nir) => [ + q(4890), + q(0), + ], + q(nis) => [ + q(4891), + q(0), + ], + q(nit) => [ + q(4892), + q(0), + ], + q(niu) => [ + q(0312), + q(0), + ], + q(niv) => [ + q(4893), + q(0), + ], + q(niw) => [ + q(4894), + q(0), + ], + q(nix) => [ + q(4895), + q(0), + ], + q(niy) => [ + q(4896), + q(0), + ], + q(niz) => [ + q(4897), + q(0), + ], + q(nja) => [ + q(4898), + q(0), + ], + q(njb) => [ + q(4899), + q(0), + ], + q(njd) => [ + q(4900), + q(0), + ], + q(njh) => [ + q(4901), + q(0), + ], + q(nji) => [ + q(4902), + q(0), + ], + q(njj) => [ + q(4903), + q(0), + ], + q(njl) => [ + q(4904), + q(0), + ], + q(njm) => [ + q(4905), + q(0), + ], + q(njn) => [ + q(4906), + q(0), + ], + q(njo) => [ + q(4907), + q(0), + ], + q(njr) => [ + q(4908), + q(0), + ], + q(njs) => [ + q(4909), + q(0), + ], + q(njt) => [ + q(4910), + q(0), + ], + q(nju) => [ + q(4911), + q(0), + ], + q(njx) => [ + q(4912), + q(0), + ], + q(njy) => [ + q(4913), + q(0), + ], + q(njz) => [ + q(4914), + q(0), + ], + q(nka) => [ + q(4915), + q(0), + ], + q(nkb) => [ + q(4916), + q(0), + ], + q(nkc) => [ + q(4917), + q(0), + ], + q(nkd) => [ + q(4918), + q(0), + ], + q(nke) => [ + q(4919), + q(0), + ], + q(nkf) => [ + q(4920), + q(0), + ], + q(nkg) => [ + q(4921), + q(0), + ], + q(nkh) => [ + q(4922), + q(0), + ], + q(nki) => [ + q(4923), + q(0), + ], + q(nkj) => [ + q(4924), + q(0), + ], + q(nkk) => [ + q(4925), + q(0), + ], + q(nkm) => [ + q(4926), + q(0), + ], + q(nkn) => [ + q(4927), + q(0), + ], + q(nko) => [ + q(4928), + q(0), + ], + q(nkp) => [ + q(4929), + q(0), + ], + q(nkq) => [ + q(4930), + q(0), + ], + q(nkr) => [ + q(4931), + q(0), + ], + q(nks) => [ + q(4932), + q(0), + ], + q(nkt) => [ + q(4933), + q(0), + ], + q(nku) => [ + q(4934), + q(0), + ], + q(nkv) => [ + q(4935), + q(0), + ], + q(nkw) => [ + q(4936), + q(0), + ], + q(nkx) => [ + q(4937), + q(0), + ], + q(nkz) => [ + q(4938), + q(0), + ], + q(nla) => [ + q(4939), + q(0), + ], + q(nlc) => [ + q(4940), + q(0), + ], + q(nle) => [ + q(4941), + q(0), + ], + q(nlg) => [ + q(4942), + q(0), + ], + q(nli) => [ + q(4943), + q(0), + ], + q(nlj) => [ + q(4944), + q(0), + ], + q(nlk) => [ + q(4945), + q(0), + ], + q(nll) => [ + q(4946), + q(0), + ], + q(nlo) => [ + q(4947), + q(0), + ], + q(nlq) => [ + q(4948), + q(0), + ], + q(nlu) => [ + q(4949), + q(0), + ], + q(nlv) => [ + q(4950), + q(0), + ], + q(nlw) => [ + q(4951), + q(0), + ], + q(nlx) => [ + q(4952), + q(0), + ], + q(nly) => [ + q(4953), + q(0), + ], + q(nlz) => [ + q(4954), + q(0), + ], + q(nma) => [ + q(4955), + q(0), + ], + q(nmb) => [ + q(4956), + q(0), + ], + q(nmc) => [ + q(4957), + q(0), + ], + q(nmd) => [ + q(4958), + q(0), + ], + q(nme) => [ + q(4959), + q(0), + ], + q(nmf) => [ + q(4960), + q(0), + ], + q(nmg) => [ + q(4961), + q(0), + ], + q(nmh) => [ + q(4962), + q(0), + ], + q(nmi) => [ + q(4963), + q(0), + ], + q(nmj) => [ + q(4964), + q(0), + ], + q(nmk) => [ + q(4965), + q(0), + ], + q(nml) => [ + q(4966), + q(0), + ], + q(nmm) => [ + q(4967), + q(0), + ], + q(nmn) => [ + q(4968), + q(0), + ], + q(nmo) => [ + q(4969), + q(0), + ], + q(nmp) => [ + q(4970), + q(0), + ], + q(nmq) => [ + q(4971), + q(0), + ], + q(nmr) => [ + q(4972), + q(0), + ], + q(nms) => [ + q(4973), + q(0), + ], + q(nmt) => [ + q(4974), + q(0), + ], + q(nmu) => [ + q(4975), + q(0), + ], + q(nmv) => [ + q(4976), + q(0), + ], + q(nmw) => [ + q(4977), + q(0), + ], + q(nmx) => [ + q(4978), + q(0), + ], + q(nmy) => [ + q(4979), + q(0), + ], + q(nmz) => [ + q(4980), + q(0), + ], + q(nna) => [ + q(4981), + q(0), + ], + q(nnb) => [ + q(4982), + q(0), + ], + q(nnc) => [ + q(4983), + q(0), + ], + q(nnd) => [ + q(4984), + q(0), + ], + q(nne) => [ + q(4985), + q(0), + ], + q(nnf) => [ + q(4986), + q(0), + ], + q(nng) => [ + q(4987), + q(0), + ], + q(nnh) => [ + q(4988), + q(0), + ], + q(nni) => [ + q(4989), + q(0), + ], + q(nnj) => [ + q(4990), + q(0), + ], + q(nnk) => [ + q(4991), + q(0), + ], + q(nnl) => [ + q(4992), + q(0), + ], + q(nnm) => [ + q(4993), + q(0), + ], + q(nnn) => [ + q(4994), + q(0), + ], + q(nno) => [ + q(0313), + q(0), + ], + q(nnp) => [ + q(4995), + q(0), + ], + q(nnq) => [ + q(4996), + q(0), + ], + q(nnr) => [ + q(4997), + q(0), + ], + q(nns) => [ + q(4998), + q(0), + ], + q(nnt) => [ + q(4999), + q(0), + ], + q(nnu) => [ + q(5000), + q(0), + ], + q(nnv) => [ + q(5001), + q(0), + ], + q(nnw) => [ + q(5002), + q(0), + ], + q(nny) => [ + q(5003), + q(0), + ], + q(nnz) => [ + q(5004), + q(0), + ], + q(noa) => [ + q(5005), + q(0), + ], + q(nob) => [ + q(0314), + q(0), + ], + q(noc) => [ + q(5006), + q(0), + ], + q(nod) => [ + q(5007), + q(0), + ], + q(noe) => [ + q(5008), + q(0), + ], + q(nof) => [ + q(5009), + q(0), + ], + q(nog) => [ + q(0315), + q(0), + ], + q(noh) => [ + q(5010), + q(0), + ], + q(noi) => [ + q(5011), + q(0), + ], + q(noj) => [ + q(5012), + q(0), + ], + q(nok) => [ + q(5013), + q(0), + ], + q(nol) => [ + q(5014), + q(0), + ], + q(nom) => [ + q(5015), + q(0), + ], + q(non) => [ + q(0316), + q(1), + ], + q(nop) => [ + q(5016), + q(0), + ], + q(noq) => [ + q(5017), + q(0), + ], + q(nor) => [ + q(0317), + q(0), + ], + q(nos) => [ + q(5018), + q(0), + ], + q(not) => [ + q(5019), + q(0), + ], + q(nou) => [ + q(5020), + q(0), + ], + q(nov) => [ + q(5021), + q(0), + ], + q(now) => [ + q(5022), + q(0), + ], + q(noy) => [ + q(5023), + q(0), + ], + q(noz) => [ + q(5024), + q(0), + ], + q(npa) => [ + q(5025), + q(0), + ], + q(npb) => [ + q(5026), + q(0), + ], + q(npg) => [ + q(5027), + q(0), + ], + q(nph) => [ + q(5028), + q(0), + ], + q(npi) => [ + q(5029), + q(0), + ], + q(npl) => [ + q(5030), + q(0), + ], + q(npn) => [ + q(5031), + q(0), + ], + q(npo) => [ + q(5032), + q(0), + ], + q(nps) => [ + q(5033), + q(0), + ], + q(npu) => [ + q(5034), + q(0), + ], + q(npx) => [ + q(5035), + q(0), + ], + q(npy) => [ + q(5036), + q(0), + ], + q(nqg) => [ + q(5037), + q(0), + ], + q(nqk) => [ + q(5038), + q(0), + ], + q(nql) => [ + q(5039), + q(0), + ], + q(nqm) => [ + q(5040), + q(0), + ], + q(nqn) => [ + q(5041), + q(0), + ], + q(nqo) => [ + q(0318), + q(0), + ], + q(nqq) => [ + q(5042), + q(0), + ], + q(nqy) => [ + q(5043), + q(0), + ], + q(nra) => [ + q(5044), + q(0), + ], + q(nrb) => [ + q(5045), + q(0), + ], + q(nrc) => [ + q(5046), + q(0), + ], + q(nre) => [ + q(5047), + q(0), + ], + q(nrf) => [ + q(5048), + q(0), + ], + q(nrg) => [ + q(5049), + q(0), + ], + q(nri) => [ + q(5050), + q(0), + ], + q(nrk) => [ + q(5051), + q(0), + ], + q(nrl) => [ + q(5052), + q(0), + ], + q(nrm) => [ + q(5053), + q(0), + ], + q(nrn) => [ + q(5054), + q(0), + ], + q(nrp) => [ + q(5055), + q(0), + ], + q(nrr) => [ + q(5056), + q(0), + ], + q(nrt) => [ + q(5057), + q(0), + ], + q(nru) => [ + q(5058), + q(0), + ], + q(nrx) => [ + q(5059), + q(0), + ], + q(nrz) => [ + q(5060), + q(0), + ], + q(nsa) => [ + q(5061), + q(0), + ], + q(nsc) => [ + q(5062), + q(0), + ], + q(nsd) => [ + q(5063), + q(0), + ], + q(nse) => [ + q(5064), + q(0), + ], + q(nsf) => [ + q(5065), + q(0), + ], + q(nsg) => [ + q(5066), + q(0), + ], + q(nsh) => [ + q(5067), + q(0), + ], + q(nsi) => [ + q(5068), + q(0), + ], + q(nsk) => [ + q(5069), + q(0), + ], + q(nsl) => [ + q(5070), + q(0), + ], + q(nsm) => [ + q(5071), + q(0), + ], + q(nsn) => [ + q(5072), + q(0), + ], + q(nso) => [ + q(0319), + q(0), + ], + q(nsp) => [ + q(5073), + q(0), + ], + q(nsq) => [ + q(5074), + q(0), + ], + q(nsr) => [ + q(5075), + q(0), + ], + q(nss) => [ + q(5076), + q(0), + ], + q(nst) => [ + q(5077), + q(0), + ], + q(nsu) => [ + q(5078), + q(0), + ], + q(nsv) => [ + q(5079), + q(0), + ], + q(nsw) => [ + q(5080), + q(0), + ], + q(nsx) => [ + q(5081), + q(0), + ], + q(nsy) => [ + q(5082), + q(0), + ], + q(nsz) => [ + q(5083), + q(0), + ], + q(ntd) => [ + q(5084), + q(0), + ], + q(nte) => [ + q(5085), + q(0), + ], + q(ntg) => [ + q(5086), + q(0), + ], + q(nti) => [ + q(5087), + q(0), + ], + q(ntj) => [ + q(5088), + q(0), + ], + q(ntk) => [ + q(5089), + q(0), + ], + q(ntm) => [ + q(5090), + q(0), + ], + q(nto) => [ + q(5091), + q(0), + ], + q(ntp) => [ + q(5092), + q(0), + ], + q(ntr) => [ + q(5093), + q(0), + ], + q(ntu) => [ + q(5094), + q(0), + ], + q(ntw) => [ + q(5095), + q(0), + ], + q(ntx) => [ + q(5096), + q(0), + ], + q(nty) => [ + q(5097), + q(0), + ], + q(ntz) => [ + q(5098), + q(0), + ], + q(nua) => [ + q(5099), + q(0), + ], + q(nub) => [ + q(0320), + q(0), + ], + q(nuc) => [ + q(5100), + q(0), + ], + q(nud) => [ + q(5101), + q(0), + ], + q(nue) => [ + q(5102), + q(0), + ], + q(nuf) => [ + q(5103), + q(0), + ], + q(nug) => [ + q(5104), + q(0), + ], + q(nuh) => [ + q(5105), + q(0), + ], + q(nui) => [ + q(5106), + q(0), + ], + q(nuj) => [ + q(5107), + q(0), + ], + q(nuk) => [ + q(5108), + q(0), + ], + q(nul) => [ + q(5109), + q(0), + ], + q(num) => [ + q(5110), + q(0), + ], + q(nun) => [ + q(5111), + q(0), + ], + q(nuo) => [ + q(5112), + q(0), + ], + q(nup) => [ + q(5113), + q(0), + ], + q(nuq) => [ + q(5114), + q(0), + ], + q(nur) => [ + q(5115), + q(0), + ], + q(nus) => [ + q(5116), + q(0), + ], + q(nut) => [ + q(5117), + q(0), + ], + q(nuu) => [ + q(5118), + q(0), + ], + q(nuv) => [ + q(5119), + q(0), + ], + q(nuw) => [ + q(5120), + q(0), + ], + q(nux) => [ + q(5121), + q(0), + ], + q(nuy) => [ + q(5122), + q(0), + ], + q(nuz) => [ + q(5123), + q(0), + ], + q(nvh) => [ + q(5124), + q(0), + ], + q(nvm) => [ + q(5125), + q(0), + ], + q(nvo) => [ + q(5126), + q(0), + ], + q(nwa) => [ + q(5127), + q(0), + ], + q(nwb) => [ + q(5128), + q(0), + ], + q(nwc) => [ + q(0321), + q(0), + ], + q(nwe) => [ + q(5129), + q(0), + ], + q(nwg) => [ + q(5130), + q(0), + ], + q(nwi) => [ + q(5131), + q(0), + ], + q(nwm) => [ + q(5132), + q(0), + ], + q(nwo) => [ + q(5133), + q(0), + ], + q(nwr) => [ + q(5134), + q(0), + ], + q(nwx) => [ + q(5135), + q(0), + ], + q(nwy) => [ + q(5136), + q(0), + ], + q(nxa) => [ + q(5137), + q(0), + ], + q(nxd) => [ + q(5138), + q(0), + ], + q(nxe) => [ + q(5139), + q(0), + ], + q(nxg) => [ + q(5140), + q(0), + ], + q(nxi) => [ + q(5141), + q(0), + ], + q(nxk) => [ + q(5142), + q(0), + ], + q(nxl) => [ + q(5143), + q(0), + ], + q(nxm) => [ + q(5144), + q(0), + ], + q(nxn) => [ + q(5145), + q(0), + ], + q(nxo) => [ + q(5146), + q(0), + ], + q(nxq) => [ + q(5147), + q(0), + ], + q(nxr) => [ + q(5148), + q(0), + ], + q(nxu) => [ + q(5149), + q(0), + ], + q(nxx) => [ + q(5150), + q(0), + ], + q(nya) => [ + q(0322), + q(0), + ], + q(nyb) => [ + q(5151), + q(0), + ], + q(nyc) => [ + q(5152), + q(0), + ], + q(nyd) => [ + q(5153), + q(0), + ], + q(nye) => [ + q(5154), + q(0), + ], + q(nyf) => [ + q(5155), + q(0), + ], + q(nyg) => [ + q(5156), + q(0), + ], + q(nyh) => [ + q(5157), + q(0), + ], + q(nyi) => [ + q(5158), + q(0), + ], + q(nyj) => [ + q(5159), + q(0), + ], + q(nyk) => [ + q(5160), + q(0), + ], + q(nyl) => [ + q(5161), + q(0), + ], + q(nym) => [ + q(0323), + q(0), + ], + q(nyn) => [ + q(0324), + q(0), + ], + q(nyo) => [ + q(0325), + q(0), + ], + q(nyp) => [ + q(5162), + q(0), + ], + q(nyq) => [ + q(5163), + q(0), + ], + q(nyr) => [ + q(5164), + q(0), + ], + q(nys) => [ + q(5165), + q(0), + ], + q(nyt) => [ + q(5166), + q(0), + ], + q(nyu) => [ + q(5167), + q(0), + ], + q(nyv) => [ + q(5168), + q(0), + ], + q(nyw) => [ + q(5169), + q(0), + ], + q(nyx) => [ + q(5170), + q(0), + ], + q(nyy) => [ + q(5171), + q(0), + ], + q(nza) => [ + q(5172), + q(0), + ], + q(nzb) => [ + q(5173), + q(0), + ], + q(nzi) => [ + q(0326), + q(0), + ], + q(nzk) => [ + q(5174), + q(0), + ], + q(nzm) => [ + q(5175), + q(0), + ], + q(nzs) => [ + q(5176), + q(0), + ], + q(nzu) => [ + q(5177), + q(0), + ], + q(nzy) => [ + q(5178), + q(0), + ], + q(nzz) => [ + q(5179), + q(0), + ], + q(oaa) => [ + q(5180), + q(0), + ], + q(oac) => [ + q(5181), + q(0), + ], + q(oar) => [ + q(5182), + q(0), + ], + q(oav) => [ + q(5183), + q(0), + ], + q(obi) => [ + q(5184), + q(0), + ], + q(obk) => [ + q(5185), + q(0), + ], + q(obl) => [ + q(5186), + q(0), + ], + q(obm) => [ + q(5187), + q(0), + ], + q(obo) => [ + q(5188), + q(0), + ], + q(obr) => [ + q(5189), + q(0), + ], + q(obt) => [ + q(5190), + q(0), + ], + q(obu) => [ + q(5191), + q(0), + ], + q(oca) => [ + q(5192), + q(0), + ], + q(och) => [ + q(5193), + q(0), + ], + q(oci) => [ + q(0327), + q(0), + ], + q(oco) => [ + q(5194), + q(0), + ], + q(ocu) => [ + q(5195), + q(0), + ], + q(oda) => [ + q(5196), + q(0), + ], + q(odk) => [ + q(5197), + q(0), + ], + q(odt) => [ + q(5198), + q(0), + ], + q(odu) => [ + q(5199), + q(0), + ], + q(ofo) => [ + q(5200), + q(0), + ], + q(ofs) => [ + q(5201), + q(0), + ], + q(ofu) => [ + q(5202), + q(0), + ], + q(ogb) => [ + q(5203), + q(0), + ], + q(ogc) => [ + q(5204), + q(0), + ], + q(oge) => [ + q(5205), + q(0), + ], + q(ogg) => [ + q(5206), + q(0), + ], + q(ogo) => [ + q(5207), + q(0), + ], + q(ogu) => [ + q(5208), + q(0), + ], + q(oht) => [ + q(5209), + q(0), + ], + q(ohu) => [ + q(5210), + q(0), + ], + q(oia) => [ + q(5211), + q(0), + ], + q(oin) => [ + q(5212), + q(0), + ], + q(ojb) => [ + q(5213), + q(0), + ], + q(ojc) => [ + q(5214), + q(0), + ], + q(ojg) => [ + q(5215), + q(0), + ], + q(oji) => [ + q(0328), + q(0), + ], + q(ojp) => [ + q(5216), + q(0), + ], + q(ojs) => [ + q(5217), + q(0), + ], + q(ojv) => [ + q(5218), + q(0), + ], + q(ojw) => [ + q(5219), + q(0), + ], + q(oka) => [ + q(5220), + q(0), + ], + q(okb) => [ + q(5221), + q(0), + ], + q(okd) => [ + q(5222), + q(0), + ], + q(oke) => [ + q(5223), + q(0), + ], + q(okg) => [ + q(5224), + q(0), + ], + q(okh) => [ + q(5225), + q(0), + ], + q(oki) => [ + q(5226), + q(0), + ], + q(okj) => [ + q(5227), + q(0), + ], + q(okk) => [ + q(5228), + q(0), + ], + q(okl) => [ + q(5229), + q(0), + ], + q(okm) => [ + q(5230), + q(0), + ], + q(okn) => [ + q(5231), + q(0), + ], + q(oko) => [ + q(5232), + q(0), + ], + q(okr) => [ + q(5233), + q(0), + ], + q(oks) => [ + q(5234), + q(0), + ], + q(oku) => [ + q(5235), + q(0), + ], + q(okv) => [ + q(5236), + q(0), + ], + q(okx) => [ + q(5237), + q(0), + ], + q(ola) => [ + q(5238), + q(0), + ], + q(old) => [ + q(5239), + q(0), + ], + q(ole) => [ + q(5240), + q(0), + ], + q(olk) => [ + q(5241), + q(0), + ], + q(olm) => [ + q(5242), + q(0), + ], + q(olo) => [ + q(5243), + q(0), + ], + q(olr) => [ + q(5244), + q(0), + ], + q(olt) => [ + q(5245), + q(0), + ], + q(olu) => [ + q(5246), + q(0), + ], + q(oma) => [ + q(5247), + q(0), + ], + q(omb) => [ + q(5248), + q(0), + ], + q(omc) => [ + q(5249), + q(0), + ], + q(omg) => [ + q(5250), + q(0), + ], + q(omi) => [ + q(5251), + q(0), + ], + q(omk) => [ + q(5252), + q(0), + ], + q(oml) => [ + q(5253), + q(0), + ], + q(omn) => [ + q(5254), + q(0), + ], + q(omo) => [ + q(5255), + q(0), + ], + q(omp) => [ + q(5256), + q(0), + ], + q(omq) => [ + q(0518), + q(0), + ], + q(omr) => [ + q(5257), + q(0), + ], + q(omt) => [ + q(5258), + q(0), + ], + q(omu) => [ + q(5259), + q(0), + ], + q(omv) => [ + q(0519), + q(0), + ], + q(omw) => [ + q(5260), + q(0), + ], + q(omx) => [ + q(5261), + q(0), + ], + q(ona) => [ + q(5262), + q(0), + ], + q(onb) => [ + q(5263), + q(0), + ], + q(one) => [ + q(5264), + q(0), + ], + q(ong) => [ + q(5265), + q(0), + ], + q(oni) => [ + q(5266), + q(0), + ], + q(onj) => [ + q(5267), + q(0), + ], + q(onk) => [ + q(5268), + q(0), + ], + q(onn) => [ + q(5269), + q(0), + ], + q(ono) => [ + q(5270), + q(0), + ], + q(onp) => [ + q(5271), + q(0), + ], + q(onr) => [ + q(5272), + q(0), + ], + q(ons) => [ + q(5273), + q(0), + ], + q(ont) => [ + q(5274), + q(0), + ], + q(onu) => [ + q(5275), + q(0), + ], + q(onw) => [ + q(5276), + q(0), + ], + q(onx) => [ + q(5277), + q(0), + ], + q(ood) => [ + q(5278), + q(0), + ], + q(oog) => [ + q(5279), + q(0), + ], + q(oon) => [ + q(5280), + q(0), + ], + q(oor) => [ + q(5281), + q(0), + ], + q(oos) => [ + q(5282), + q(0), + ], + q(opa) => [ + q(5283), + q(0), + ], + q(opk) => [ + q(5284), + q(0), + ], + q(opm) => [ + q(5285), + q(0), + ], + q(opo) => [ + q(5286), + q(0), + ], + q(opt) => [ + q(5287), + q(0), + ], + q(opy) => [ + q(5288), + q(0), + ], + q(ora) => [ + q(5289), + q(0), + ], + q(orc) => [ + q(5290), + q(0), + ], + q(ore) => [ + q(5291), + q(0), + ], + q(org) => [ + q(5292), + q(0), + ], + q(orh) => [ + q(5293), + q(0), + ], + q(ori) => [ + q(0329), + q(0), + ], + q(orm) => [ + q(0330), + q(0), + ], + q(orn) => [ + q(5294), + q(0), + ], + q(oro) => [ + q(5295), + q(0), + ], + q(orr) => [ + q(5296), + q(0), + ], + q(ors) => [ + q(5297), + q(0), + ], + q(ort) => [ + q(5298), + q(0), + ], + q(oru) => [ + q(5299), + q(0), + ], + q(orv) => [ + q(5300), + q(0), + ], + q(orw) => [ + q(5301), + q(0), + ], + q(orx) => [ + q(5302), + q(0), + ], + q(ory) => [ + q(5303), + q(0), + ], + q(orz) => [ + q(5304), + q(0), + ], + q(osa) => [ + q(0331), + q(0), + ], + q(osc) => [ + q(5305), + q(0), + ], + q(osi) => [ + q(5306), + q(0), + ], + q(oso) => [ + q(5307), + q(0), + ], + q(osp) => [ + q(5308), + q(0), + ], + q(oss) => [ + q(0332), + q(0), + ], + q(ost) => [ + q(5309), + q(0), + ], + q(osu) => [ + q(5310), + q(0), + ], + q(osx) => [ + q(5311), + q(0), + ], + q(ota) => [ + q(0333), + q(1), + ], + q(otb) => [ + q(5312), + q(0), + ], + q(otd) => [ + q(5313), + q(0), + ], + q(ote) => [ + q(5314), + q(0), + ], + q(oti) => [ + q(5315), + q(0), + ], + q(otk) => [ + q(5316), + q(0), + ], + q(otl) => [ + q(5317), + q(0), + ], + q(otm) => [ + q(5318), + q(0), + ], + q(otn) => [ + q(5319), + q(0), + ], + q(oto) => [ + q(0334), + q(0), + ], + q(otq) => [ + q(5320), + q(0), + ], + q(otr) => [ + q(5321), + q(0), + ], + q(ots) => [ + q(5322), + q(0), + ], + q(ott) => [ + q(5323), + q(0), + ], + q(otu) => [ + q(5324), + q(0), + ], + q(otw) => [ + q(5325), + q(0), + ], + q(otx) => [ + q(5326), + q(0), + ], + q(oty) => [ + q(5327), + q(0), + ], + q(otz) => [ + q(5328), + q(0), + ], + q(oua) => [ + q(5329), + q(0), + ], + q(oub) => [ + q(5330), + q(0), + ], + q(oue) => [ + q(5331), + q(0), + ], + q(oui) => [ + q(5332), + q(0), + ], + q(oum) => [ + q(5333), + q(0), + ], + q(ovd) => [ + q(5334), + q(0), + ], + q(owi) => [ + q(5335), + q(0), + ], + q(owl) => [ + q(5336), + q(0), + ], + q(oyb) => [ + q(5337), + q(0), + ], + q(oyd) => [ + q(5338), + q(0), + ], + q(oym) => [ + q(5339), + q(0), + ], + q(oyy) => [ + q(5340), + q(0), + ], + q(ozm) => [ + q(5341), + q(0), + ], + q(paa) => [ + q(0335), + q(0), + ], + q(pab) => [ + q(5342), + q(0), + ], + q(pac) => [ + q(5343), + q(0), + ], + q(pad) => [ + q(5344), + q(0), + ], + q(pae) => [ + q(5345), + q(0), + ], + q(paf) => [ + q(5346), + q(0), + ], + q(pag) => [ + q(0336), + q(0), + ], + q(pah) => [ + q(5347), + q(0), + ], + q(pai) => [ + q(5348), + q(0), + ], + q(pak) => [ + q(5349), + q(0), + ], + q(pal) => [ + q(0337), + q(0), + ], + q(pam) => [ + q(0338), + q(0), + ], + q(pan) => [ + q(0339), + q(0), + ], + q(pao) => [ + q(5350), + q(0), + ], + q(pap) => [ + q(0340), + q(0), + ], + q(paq) => [ + q(5351), + q(0), + ], + q(par) => [ + q(5352), + q(0), + ], + q(pas) => [ + q(5353), + q(0), + ], + q(pat) => [ + q(5354), + q(0), + ], + q(pau) => [ + q(0341), + q(0), + ], + q(pav) => [ + q(5355), + q(0), + ], + q(paw) => [ + q(5356), + q(0), + ], + q(pax) => [ + q(5357), + q(0), + ], + q(pay) => [ + q(5358), + q(0), + ], + q(paz) => [ + q(5359), + q(0), + ], + q(pbb) => [ + q(5360), + q(0), + ], + q(pbc) => [ + q(5361), + q(0), + ], + q(pbe) => [ + q(5362), + q(0), + ], + q(pbf) => [ + q(5363), + q(0), + ], + q(pbg) => [ + q(5364), + q(0), + ], + q(pbh) => [ + q(5365), + q(0), + ], + q(pbi) => [ + q(5366), + q(0), + ], + q(pbl) => [ + q(5367), + q(0), + ], + q(pbn) => [ + q(5368), + q(0), + ], + q(pbo) => [ + q(5369), + q(0), + ], + q(pbp) => [ + q(5370), + q(0), + ], + q(pbr) => [ + q(5371), + q(0), + ], + q(pbs) => [ + q(5372), + q(0), + ], + q(pbt) => [ + q(5373), + q(0), + ], + q(pbu) => [ + q(5374), + q(0), + ], + q(pbv) => [ + q(5375), + q(0), + ], + q(pby) => [ + q(5376), + q(0), + ], + q(pca) => [ + q(5377), + q(0), + ], + q(pcb) => [ + q(5378), + q(0), + ], + q(pcc) => [ + q(5379), + q(0), + ], + q(pcd) => [ + q(5380), + q(0), + ], + q(pce) => [ + q(5381), + q(0), + ], + q(pcf) => [ + q(5382), + q(0), + ], + q(pcg) => [ + q(5383), + q(0), + ], + q(pch) => [ + q(5384), + q(0), + ], + q(pci) => [ + q(5385), + q(0), + ], + q(pcj) => [ + q(5386), + q(0), + ], + q(pck) => [ + q(5387), + q(0), + ], + q(pcl) => [ + q(5388), + q(0), + ], + q(pcm) => [ + q(5389), + q(0), + ], + q(pcn) => [ + q(5390), + q(0), + ], + q(pcp) => [ + q(5391), + q(0), + ], + q(pcw) => [ + q(5392), + q(0), + ], + q(pda) => [ + q(5393), + q(0), + ], + q(pdc) => [ + q(5394), + q(0), + ], + q(pdi) => [ + q(5395), + q(0), + ], + q(pdn) => [ + q(5396), + q(0), + ], + q(pdo) => [ + q(5397), + q(0), + ], + q(pdt) => [ + q(5398), + q(0), + ], + q(pdu) => [ + q(5399), + q(0), + ], + q(pea) => [ + q(5400), + q(0), + ], + q(peb) => [ + q(5401), + q(0), + ], + q(ped) => [ + q(5402), + q(0), + ], + q(pee) => [ + q(5403), + q(0), + ], + q(pef) => [ + q(5404), + q(0), + ], + q(peg) => [ + q(5405), + q(0), + ], + q(peh) => [ + q(5406), + q(0), + ], + q(pei) => [ + q(5407), + q(0), + ], + q(pej) => [ + q(5408), + q(0), + ], + q(pek) => [ + q(5409), + q(0), + ], + q(pel) => [ + q(5410), + q(0), + ], + q(pem) => [ + q(5411), + q(0), + ], + q(peo) => [ + q(0342), + q(1), + ], + q(pep) => [ + q(5412), + q(0), + ], + q(peq) => [ + q(5413), + q(0), + ], + q(per) => [ + q(0343), + q(0), + ], + q(pes) => [ + q(5414), + q(0), + ], + q(pev) => [ + q(5415), + q(0), + ], + q(pex) => [ + q(5416), + q(0), + ], + q(pey) => [ + q(5417), + q(0), + ], + q(pez) => [ + q(5418), + q(0), + ], + q(pfa) => [ + q(5419), + q(0), + ], + q(pfe) => [ + q(5420), + q(0), + ], + q(pfl) => [ + q(5421), + q(0), + ], + q(pga) => [ + q(5422), + q(0), + ], + q(pgd) => [ + q(5423), + q(0), + ], + q(pgg) => [ + q(5424), + q(0), + ], + q(pgi) => [ + q(5425), + q(0), + ], + q(pgk) => [ + q(5426), + q(0), + ], + q(pgl) => [ + q(5427), + q(0), + ], + q(pgn) => [ + q(5428), + q(0), + ], + q(pgs) => [ + q(5429), + q(0), + ], + q(pgu) => [ + q(5430), + q(0), + ], + q(pgz) => [ + q(5431), + q(0), + ], + q(pha) => [ + q(5432), + q(0), + ], + q(phd) => [ + q(5433), + q(0), + ], + q(phg) => [ + q(5434), + q(0), + ], + q(phh) => [ + q(5435), + q(0), + ], + q(phi) => [ + q(0344), + q(0), + ], + q(phk) => [ + q(5436), + q(0), + ], + q(phl) => [ + q(5437), + q(0), + ], + q(phm) => [ + q(5438), + q(0), + ], + q(phn) => [ + q(0345), + q(0), + ], + q(pho) => [ + q(5439), + q(0), + ], + q(phq) => [ + q(5440), + q(0), + ], + q(phr) => [ + q(5441), + q(0), + ], + q(pht) => [ + q(5442), + q(0), + ], + q(phu) => [ + q(5443), + q(0), + ], + q(phv) => [ + q(5444), + q(0), + ], + q(phw) => [ + q(5445), + q(0), + ], + q(pia) => [ + q(5446), + q(0), + ], + q(pib) => [ + q(5447), + q(0), + ], + q(pic) => [ + q(5448), + q(0), + ], + q(pid) => [ + q(5449), + q(0), + ], + q(pie) => [ + q(5450), + q(0), + ], + q(pif) => [ + q(5451), + q(0), + ], + q(pig) => [ + q(5452), + q(0), + ], + q(pih) => [ + q(5453), + q(0), + ], + q(pii) => [ + q(5454), + q(0), + ], + q(pij) => [ + q(5455), + q(0), + ], + q(pil) => [ + q(5456), + q(0), + ], + q(pim) => [ + q(5457), + q(0), + ], + q(pin) => [ + q(5458), + q(0), + ], + q(pio) => [ + q(5459), + q(0), + ], + q(pip) => [ + q(5460), + q(0), + ], + q(pir) => [ + q(5461), + q(0), + ], + q(pis) => [ + q(5462), + q(0), + ], + q(pit) => [ + q(5463), + q(0), + ], + q(piu) => [ + q(5464), + q(0), + ], + q(piv) => [ + q(5465), + q(0), + ], + q(piw) => [ + q(5466), + q(0), + ], + q(pix) => [ + q(5467), + q(0), + ], + q(piy) => [ + q(5468), + q(0), + ], + q(piz) => [ + q(5469), + q(0), + ], + q(pjt) => [ + q(5470), + q(0), + ], + q(pka) => [ + q(5471), + q(0), + ], + q(pkb) => [ + q(5472), + q(0), + ], + q(pkc) => [ + q(5473), + q(0), + ], + q(pkg) => [ + q(5474), + q(0), + ], + q(pkh) => [ + q(5475), + q(0), + ], + q(pkn) => [ + q(5476), + q(0), + ], + q(pko) => [ + q(5477), + q(0), + ], + q(pkp) => [ + q(5478), + q(0), + ], + q(pkr) => [ + q(5479), + q(0), + ], + q(pks) => [ + q(5480), + q(0), + ], + q(pkt) => [ + q(5481), + q(0), + ], + q(pku) => [ + q(5482), + q(0), + ], + q(pla) => [ + q(5483), + q(0), + ], + q(plb) => [ + q(5484), + q(0), + ], + q(plc) => [ + q(5485), + q(0), + ], + q(pld) => [ + q(5486), + q(0), + ], + q(ple) => [ + q(5487), + q(0), + ], + q(plf) => [ + q(0520), + q(0), + ], + q(plg) => [ + q(5488), + q(0), + ], + q(plh) => [ + q(5489), + q(0), + ], + q(pli) => [ + q(0346), + q(0), + ], + q(plj) => [ + q(5490), + q(0), + ], + q(plk) => [ + q(5491), + q(0), + ], + q(pll) => [ + q(5492), + q(0), + ], + q(pln) => [ + q(5493), + q(0), + ], + q(plo) => [ + q(5494), + q(0), + ], + q(plp) => [ + q(5495), + q(0), + ], + q(plq) => [ + q(5496), + q(0), + ], + q(plr) => [ + q(5497), + q(0), + ], + q(pls) => [ + q(5498), + q(0), + ], + q(plt) => [ + q(5499), + q(0), + ], + q(plu) => [ + q(5500), + q(0), + ], + q(plv) => [ + q(5501), + q(0), + ], + q(plw) => [ + q(5502), + q(0), + ], + q(ply) => [ + q(5503), + q(0), + ], + q(plz) => [ + q(5504), + q(0), + ], + q(pma) => [ + q(5505), + q(0), + ], + q(pmb) => [ + q(5506), + q(0), + ], + q(pmd) => [ + q(5507), + q(0), + ], + q(pme) => [ + q(5508), + q(0), + ], + q(pmf) => [ + q(5509), + q(0), + ], + q(pmh) => [ + q(5510), + q(0), + ], + q(pmi) => [ + q(5511), + q(0), + ], + q(pmj) => [ + q(5512), + q(0), + ], + q(pmk) => [ + q(5513), + q(0), + ], + q(pml) => [ + q(5514), + q(0), + ], + q(pmm) => [ + q(5515), + q(0), + ], + q(pmn) => [ + q(5516), + q(0), + ], + q(pmo) => [ + q(5517), + q(0), + ], + q(pmq) => [ + q(5518), + q(0), + ], + q(pmr) => [ + q(5519), + q(0), + ], + q(pms) => [ + q(5520), + q(0), + ], + q(pmt) => [ + q(5521), + q(0), + ], + q(pmw) => [ + q(5522), + q(0), + ], + q(pmx) => [ + q(5523), + q(0), + ], + q(pmy) => [ + q(5524), + q(0), + ], + q(pmz) => [ + q(5525), + q(0), + ], + q(pna) => [ + q(5526), + q(0), + ], + q(pnb) => [ + q(5527), + q(0), + ], + q(pnc) => [ + q(5528), + q(0), + ], + q(pne) => [ + q(5529), + q(0), + ], + q(png) => [ + q(5530), + q(0), + ], + q(pnh) => [ + q(5531), + q(0), + ], + q(pni) => [ + q(5532), + q(0), + ], + q(pnj) => [ + q(5533), + q(0), + ], + q(pnk) => [ + q(5534), + q(0), + ], + q(pnl) => [ + q(5535), + q(0), + ], + q(pnm) => [ + q(5536), + q(0), + ], + q(pnn) => [ + q(5537), + q(0), + ], + q(pno) => [ + q(5538), + q(0), + ], + q(pnp) => [ + q(5539), + q(0), + ], + q(pnq) => [ + q(5540), + q(0), + ], + q(pnr) => [ + q(5541), + q(0), + ], + q(pns) => [ + q(5542), + q(0), + ], + q(pnt) => [ + q(5543), + q(0), + ], + q(pnu) => [ + q(5544), + q(0), + ], + q(pnv) => [ + q(5545), + q(0), + ], + q(pnw) => [ + q(5546), + q(0), + ], + q(pnx) => [ + q(5547), + q(0), + ], + q(pny) => [ + q(5548), + q(0), + ], + q(pnz) => [ + q(5549), + q(0), + ], + q(poc) => [ + q(5550), + q(0), + ], + q(poe) => [ + q(5551), + q(0), + ], + q(pof) => [ + q(5552), + q(0), + ], + q(pog) => [ + q(5553), + q(0), + ], + q(poh) => [ + q(5554), + q(0), + ], + q(poi) => [ + q(5555), + q(0), + ], + q(pok) => [ + q(5556), + q(0), + ], + q(pol) => [ + q(0347), + q(0), + ], + q(pom) => [ + q(5557), + q(0), + ], + q(pon) => [ + q(0348), + q(0), + ], + q(poo) => [ + q(5558), + q(0), + ], + q(pop) => [ + q(5559), + q(0), + ], + q(poq) => [ + q(5560), + q(0), + ], + q(por) => [ + q(0349), + q(0), + ], + q(pos) => [ + q(5561), + q(0), + ], + q(pot) => [ + q(5562), + q(0), + ], + q(pov) => [ + q(5563), + q(0), + ], + q(pow) => [ + q(5564), + q(0), + ], + q(pox) => [ + q(5565), + q(0), + ], + q(poy) => [ + q(5566), + q(0), + ], + q(poz) => [ + q(0521), + q(0), + ], + q(ppe) => [ + q(5567), + q(0), + ], + q(ppi) => [ + q(5568), + q(0), + ], + q(ppk) => [ + q(5569), + q(0), + ], + q(ppl) => [ + q(5570), + q(0), + ], + q(ppm) => [ + q(5571), + q(0), + ], + q(ppn) => [ + q(5572), + q(0), + ], + q(ppo) => [ + q(5573), + q(0), + ], + q(ppp) => [ + q(5574), + q(0), + ], + q(ppq) => [ + q(5575), + q(0), + ], + q(pps) => [ + q(5576), + q(0), + ], + q(ppt) => [ + q(5577), + q(0), + ], + q(ppu) => [ + q(5578), + q(0), + ], + q(pqa) => [ + q(5579), + q(0), + ], + q(pqe) => [ + q(0522), + q(0), + ], + q(pqm) => [ + q(5580), + q(0), + ], + q(pqw) => [ + q(0523), + q(0), + ], + q(pra) => [ + q(0350), + q(0), + ], + q(prc) => [ + q(5581), + q(0), + ], + q(prd) => [ + q(5582), + q(0), + ], + q(pre) => [ + q(5583), + q(0), + ], + q(prf) => [ + q(5584), + q(0), + ], + q(prg) => [ + q(5585), + q(0), + ], + q(prh) => [ + q(5586), + q(0), + ], + q(pri) => [ + q(5587), + q(0), + ], + q(prk) => [ + q(5588), + q(0), + ], + q(prl) => [ + q(5589), + q(0), + ], + q(prm) => [ + q(5590), + q(0), + ], + q(prn) => [ + q(5591), + q(0), + ], + q(pro) => [ + q(0351), + q(1), + ], + q(prp) => [ + q(5592), + q(0), + ], + q(prq) => [ + q(5593), + q(0), + ], + q(prr) => [ + q(5594), + q(0), + ], + q(prs) => [ + q(5595), + q(0), + ], + q(prt) => [ + q(5596), + q(0), + ], + q(pru) => [ + q(5597), + q(0), + ], + q(prw) => [ + q(5598), + q(0), + ], + q(prx) => [ + q(5599), + q(0), + ], + q(prz) => [ + q(5600), + q(0), + ], + q(psa) => [ + q(5601), + q(0), + ], + q(psc) => [ + q(5602), + q(0), + ], + q(psd) => [ + q(5603), + q(0), + ], + q(pse) => [ + q(5604), + q(0), + ], + q(psg) => [ + q(5605), + q(0), + ], + q(psh) => [ + q(5606), + q(0), + ], + q(psi) => [ + q(5607), + q(0), + ], + q(psl) => [ + q(5608), + q(0), + ], + q(psm) => [ + q(5609), + q(0), + ], + q(psn) => [ + q(5610), + q(0), + ], + q(pso) => [ + q(5611), + q(0), + ], + q(psp) => [ + q(5612), + q(0), + ], + q(psq) => [ + q(5613), + q(0), + ], + q(psr) => [ + q(5614), + q(0), + ], + q(pss) => [ + q(5615), + q(0), + ], + q(pst) => [ + q(5616), + q(0), + ], + q(psu) => [ + q(5617), + q(0), + ], + q(psw) => [ + q(5618), + q(0), + ], + q(psy) => [ + q(5619), + q(0), + ], + q(pta) => [ + q(5620), + q(0), + ], + q(pth) => [ + q(5621), + q(0), + ], + q(pti) => [ + q(5622), + q(0), + ], + q(ptn) => [ + q(5623), + q(0), + ], + q(pto) => [ + q(5624), + q(0), + ], + q(ptp) => [ + q(5625), + q(0), + ], + q(ptq) => [ + q(5626), + q(0), + ], + q(ptr) => [ + q(5627), + q(0), + ], + q(ptt) => [ + q(5628), + q(0), + ], + q(ptu) => [ + q(5629), + q(0), + ], + q(ptv) => [ + q(5630), + q(0), + ], + q(ptw) => [ + q(5631), + q(0), + ], + q(pty) => [ + q(5632), + q(0), + ], + q(pua) => [ + q(5633), + q(0), + ], + q(pub) => [ + q(5634), + q(0), + ], + q(puc) => [ + q(5635), + q(0), + ], + q(pud) => [ + q(5636), + q(0), + ], + q(pue) => [ + q(5637), + q(0), + ], + q(puf) => [ + q(5638), + q(0), + ], + q(pug) => [ + q(5639), + q(0), + ], + q(pui) => [ + q(5640), + q(0), + ], + q(puj) => [ + q(5641), + q(0), + ], + q(pum) => [ + q(5642), + q(0), + ], + q(puo) => [ + q(5643), + q(0), + ], + q(pup) => [ + q(5644), + q(0), + ], + q(puq) => [ + q(5645), + q(0), + ], + q(pur) => [ + q(5646), + q(0), + ], + q(pus) => [ + q(0352), + q(0), + ], + q(put) => [ + q(5647), + q(0), + ], + q(puu) => [ + q(5648), + q(0), + ], + q(puw) => [ + q(5649), + q(0), + ], + q(pux) => [ + q(5650), + q(0), + ], + q(puy) => [ + q(5651), + q(0), + ], + q(pwa) => [ + q(5652), + q(0), + ], + q(pwb) => [ + q(5653), + q(0), + ], + q(pwg) => [ + q(5654), + q(0), + ], + q(pwi) => [ + q(5655), + q(0), + ], + q(pwm) => [ + q(5656), + q(0), + ], + q(pwn) => [ + q(5657), + q(0), + ], + q(pwo) => [ + q(5658), + q(0), + ], + q(pwr) => [ + q(5659), + q(0), + ], + q(pww) => [ + q(5660), + q(0), + ], + q(pxm) => [ + q(5661), + q(0), + ], + q(pye) => [ + q(5662), + q(0), + ], + q(pym) => [ + q(5663), + q(0), + ], + q(pyn) => [ + q(5664), + q(0), + ], + q(pys) => [ + q(5665), + q(0), + ], + q(pyu) => [ + q(5666), + q(0), + ], + q(pyx) => [ + q(5667), + q(0), + ], + q(pyy) => [ + q(5668), + q(0), + ], + q(pzn) => [ + q(5669), + q(0), + ], + q(qtz) => [ + q(0353), + q(0), + ], + q(qua) => [ + q(5670), + q(0), + ], + q(qub) => [ + q(5671), + q(0), + ], + q(quc) => [ + q(5672), + q(0), + ], + q(qud) => [ + q(5673), + q(0), + ], + q(que) => [ + q(0354), + q(0), + ], + q(quf) => [ + q(5674), + q(0), + ], + q(qug) => [ + q(5675), + q(0), + ], + q(quh) => [ + q(5676), + q(0), + ], + q(qui) => [ + q(5677), + q(0), + ], + q(quk) => [ + q(5678), + q(0), + ], + q(qul) => [ + q(5679), + q(0), + ], + q(qum) => [ + q(5680), + q(0), + ], + q(qun) => [ + q(5681), + q(0), + ], + q(qup) => [ + q(5682), + q(0), + ], + q(quq) => [ + q(5683), + q(0), + ], + q(qur) => [ + q(5684), + q(0), + ], + q(qus) => [ + q(5685), + q(0), + ], + q(quv) => [ + q(5686), + q(0), + ], + q(quw) => [ + q(5687), + q(0), + ], + q(qux) => [ + q(5688), + q(0), + ], + q(quy) => [ + q(5689), + q(0), + ], + q(quz) => [ + q(5690), + q(0), + ], + q(qva) => [ + q(5691), + q(0), + ], + q(qvc) => [ + q(5692), + q(0), + ], + q(qve) => [ + q(5693), + q(0), + ], + q(qvh) => [ + q(5694), + q(0), + ], + q(qvi) => [ + q(5695), + q(0), + ], + q(qvj) => [ + q(5696), + q(0), + ], + q(qvl) => [ + q(5697), + q(0), + ], + q(qvm) => [ + q(5698), + q(0), + ], + q(qvn) => [ + q(5699), + q(0), + ], + q(qvo) => [ + q(5700), + q(0), + ], + q(qvp) => [ + q(5701), + q(0), + ], + q(qvs) => [ + q(5702), + q(0), + ], + q(qvw) => [ + q(5703), + q(0), + ], + q(qvy) => [ + q(5704), + q(0), + ], + q(qvz) => [ + q(5705), + q(0), + ], + q(qwa) => [ + q(5706), + q(0), + ], + q(qwc) => [ + q(5707), + q(0), + ], + q(qwe) => [ + q(0524), + q(0), + ], + q(qwh) => [ + q(5708), + q(0), + ], + q(qwm) => [ + q(5709), + q(0), + ], + q(qws) => [ + q(5710), + q(0), + ], + q(qwt) => [ + q(5711), + q(0), + ], + q(qxa) => [ + q(5712), + q(0), + ], + q(qxc) => [ + q(5713), + q(0), + ], + q(qxh) => [ + q(5714), + q(0), + ], + q(qxl) => [ + q(5715), + q(0), + ], + q(qxn) => [ + q(5716), + q(0), + ], + q(qxo) => [ + q(5717), + q(0), + ], + q(qxp) => [ + q(5718), + q(0), + ], + q(qxq) => [ + q(5719), + q(0), + ], + q(qxr) => [ + q(5720), + q(0), + ], + q(qxs) => [ + q(5721), + q(0), + ], + q(qxt) => [ + q(5722), + q(0), + ], + q(qxu) => [ + q(5723), + q(0), + ], + q(qxw) => [ + q(5724), + q(0), + ], + q(qya) => [ + q(5725), + q(0), + ], + q(qyp) => [ + q(5726), + q(0), + ], + q(raa) => [ + q(5727), + q(0), + ], + q(rab) => [ + q(5728), + q(0), + ], + q(rac) => [ + q(5729), + q(0), + ], + q(rad) => [ + q(5730), + q(0), + ], + q(raf) => [ + q(5731), + q(0), + ], + q(rag) => [ + q(5732), + q(0), + ], + q(rah) => [ + q(5733), + q(0), + ], + q(rai) => [ + q(5734), + q(0), + ], + q(raj) => [ + q(0355), + q(0), + ], + q(rak) => [ + q(5735), + q(0), + ], + q(ral) => [ + q(5736), + q(0), + ], + q(ram) => [ + q(5737), + q(0), + ], + q(ran) => [ + q(5738), + q(0), + ], + q(rao) => [ + q(5739), + q(0), + ], + q(rap) => [ + q(0356), + q(0), + ], + q(raq) => [ + q(5740), + q(0), + ], + q(rar) => [ + q(0357), + q(0), + ], + q(ras) => [ + q(5741), + q(0), + ], + q(rat) => [ + q(5742), + q(0), + ], + q(rau) => [ + q(5743), + q(0), + ], + q(rav) => [ + q(5744), + q(0), + ], + q(raw) => [ + q(5745), + q(0), + ], + q(rax) => [ + q(5746), + q(0), + ], + q(ray) => [ + q(5747), + q(0), + ], + q(raz) => [ + q(5748), + q(0), + ], + q(rbb) => [ + q(5749), + q(0), + ], + q(rbk) => [ + q(5750), + q(0), + ], + q(rbl) => [ + q(5751), + q(0), + ], + q(rbp) => [ + q(5752), + q(0), + ], + q(rcf) => [ + q(5753), + q(0), + ], + q(rdb) => [ + q(5754), + q(0), + ], + q(rea) => [ + q(5755), + q(0), + ], + q(reb) => [ + q(5756), + q(0), + ], + q(ree) => [ + q(5757), + q(0), + ], + q(reg) => [ + q(5758), + q(0), + ], + q(rei) => [ + q(5759), + q(0), + ], + q(rej) => [ + q(5760), + q(0), + ], + q(rel) => [ + q(5761), + q(0), + ], + q(rem) => [ + q(5762), + q(0), + ], + q(ren) => [ + q(5763), + q(0), + ], + q(rer) => [ + q(5764), + q(0), + ], + q(res) => [ + q(5765), + q(0), + ], + q(ret) => [ + q(5766), + q(0), + ], + q(rey) => [ + q(5767), + q(0), + ], + q(rga) => [ + q(5768), + q(0), + ], + q(rge) => [ + q(5769), + q(0), + ], + q(rgk) => [ + q(5770), + q(0), + ], + q(rgn) => [ + q(5771), + q(0), + ], + q(rgr) => [ + q(5772), + q(0), + ], + q(rgs) => [ + q(5773), + q(0), + ], + q(rgu) => [ + q(5774), + q(0), + ], + q(rhg) => [ + q(5775), + q(0), + ], + q(rhp) => [ + q(5776), + q(0), + ], + q(ria) => [ + q(5777), + q(0), + ], + q(rif) => [ + q(5778), + q(0), + ], + q(ril) => [ + q(5779), + q(0), + ], + q(rim) => [ + q(5780), + q(0), + ], + q(rin) => [ + q(5781), + q(0), + ], + q(rir) => [ + q(5782), + q(0), + ], + q(rit) => [ + q(5783), + q(0), + ], + q(riu) => [ + q(5784), + q(0), + ], + q(rjg) => [ + q(5785), + q(0), + ], + q(rji) => [ + q(5786), + q(0), + ], + q(rjs) => [ + q(5787), + q(0), + ], + q(rka) => [ + q(5788), + q(0), + ], + q(rkb) => [ + q(5789), + q(0), + ], + q(rkh) => [ + q(5790), + q(0), + ], + q(rki) => [ + q(5791), + q(0), + ], + q(rkm) => [ + q(5792), + q(0), + ], + q(rkt) => [ + q(5793), + q(0), + ], + q(rkw) => [ + q(5794), + q(0), + ], + q(rma) => [ + q(5795), + q(0), + ], + q(rmb) => [ + q(5796), + q(0), + ], + q(rmc) => [ + q(5797), + q(0), + ], + q(rmd) => [ + q(5798), + q(0), + ], + q(rme) => [ + q(5799), + q(0), + ], + q(rmf) => [ + q(5800), + q(0), + ], + q(rmg) => [ + q(5801), + q(0), + ], + q(rmh) => [ + q(5802), + q(0), + ], + q(rmi) => [ + q(5803), + q(0), + ], + q(rmk) => [ + q(5804), + q(0), + ], + q(rml) => [ + q(5805), + q(0), + ], + q(rmm) => [ + q(5806), + q(0), + ], + q(rmn) => [ + q(5807), + q(0), + ], + q(rmo) => [ + q(5808), + q(0), + ], + q(rmp) => [ + q(5809), + q(0), + ], + q(rmq) => [ + q(5810), + q(0), + ], + q(rms) => [ + q(5811), + q(0), + ], + q(rmt) => [ + q(5812), + q(0), + ], + q(rmu) => [ + q(5813), + q(0), + ], + q(rmv) => [ + q(5814), + q(0), + ], + q(rmw) => [ + q(5815), + q(0), + ], + q(rmx) => [ + q(5816), + q(0), + ], + q(rmy) => [ + q(5817), + q(0), + ], + q(rmz) => [ + q(5818), + q(0), + ], + q(rnd) => [ + q(5819), + q(0), + ], + q(rng) => [ + q(5820), + q(0), + ], + q(rnl) => [ + q(5821), + q(0), + ], + q(rnn) => [ + q(5822), + q(0), + ], + q(rnp) => [ + q(5823), + q(0), + ], + q(rnr) => [ + q(5824), + q(0), + ], + q(rnw) => [ + q(5825), + q(0), + ], + q(roa) => [ + q(0358), + q(0), + ], + q(rob) => [ + q(5826), + q(0), + ], + q(roc) => [ + q(5827), + q(0), + ], + q(rod) => [ + q(5828), + q(0), + ], + q(roe) => [ + q(5829), + q(0), + ], + q(rof) => [ + q(5830), + q(0), + ], + q(rog) => [ + q(5831), + q(0), + ], + q(roh) => [ + q(0359), + q(0), + ], + q(rol) => [ + q(5832), + q(0), + ], + q(rom) => [ + q(0360), + q(0), + ], + q(roo) => [ + q(5833), + q(0), + ], + q(rop) => [ + q(5834), + q(0), + ], + q(ror) => [ + q(5835), + q(0), + ], + q(rou) => [ + q(5836), + q(0), + ], + q(row) => [ + q(5837), + q(0), + ], + q(rpn) => [ + q(5838), + q(0), + ], + q(rpt) => [ + q(5839), + q(0), + ], + q(rri) => [ + q(5840), + q(0), + ], + q(rro) => [ + q(5841), + q(0), + ], + q(rrt) => [ + q(5842), + q(0), + ], + q(rsb) => [ + q(5843), + q(0), + ], + q(rsl) => [ + q(5844), + q(0), + ], + q(rsm) => [ + q(5845), + q(0), + ], + q(rtc) => [ + q(5846), + q(0), + ], + q(rth) => [ + q(5847), + q(0), + ], + q(rtm) => [ + q(5848), + q(0), + ], + q(rts) => [ + q(5849), + q(0), + ], + q(rtw) => [ + q(5850), + q(0), + ], + q(rub) => [ + q(5851), + q(0), + ], + q(ruc) => [ + q(5852), + q(0), + ], + q(rue) => [ + q(5853), + q(0), + ], + q(ruf) => [ + q(5854), + q(0), + ], + q(rug) => [ + q(5855), + q(0), + ], + q(ruh) => [ + q(5856), + q(0), + ], + q(rui) => [ + q(5857), + q(0), + ], + q(ruk) => [ + q(5858), + q(0), + ], + q(rum) => [ + q(0361), + q(0), + ], + q(run) => [ + q(0362), + q(0), + ], + q(ruo) => [ + q(5859), + q(0), + ], + q(rup) => [ + q(0363), + q(2), + ], + q(ruq) => [ + q(5860), + q(0), + ], + q(rus) => [ + q(0364), + q(0), + ], + q(rut) => [ + q(5861), + q(0), + ], + q(ruu) => [ + q(5862), + q(0), + ], + q(ruy) => [ + q(5863), + q(0), + ], + q(ruz) => [ + q(5864), + q(0), + ], + q(rwa) => [ + q(5865), + q(0), + ], + q(rwk) => [ + q(5866), + q(0), + ], + q(rwm) => [ + q(5867), + q(0), + ], + q(rwo) => [ + q(5868), + q(0), + ], + q(rwr) => [ + q(5869), + q(0), + ], + q(rxd) => [ + q(5870), + q(0), + ], + q(rxw) => [ + q(5871), + q(0), + ], + q(ryn) => [ + q(5872), + q(0), + ], + q(rys) => [ + q(5873), + q(0), + ], + q(ryu) => [ + q(5874), + q(0), + ], + q(rzh) => [ + q(5875), + q(0), + ], + q(saa) => [ + q(5876), + q(0), + ], + q(sab) => [ + q(5877), + q(0), + ], + q(sac) => [ + q(5878), + q(0), + ], + q(sad) => [ + q(0365), + q(0), + ], + q(sae) => [ + q(5879), + q(0), + ], + q(saf) => [ + q(5880), + q(0), + ], + q(sag) => [ + q(0366), + q(0), + ], + q(sah) => [ + q(0367), + q(0), + ], + q(sai) => [ + q(0368), + q(1), + ], + q(saj) => [ + q(5881), + q(0), + ], + q(sak) => [ + q(5882), + q(0), + ], + q(sal) => [ + q(0369), + q(0), + ], + q(sam) => [ + q(0370), + q(0), + ], + q(san) => [ + q(0371), + q(0), + ], + q(sao) => [ + q(5883), + q(0), + ], + q(saq) => [ + q(5884), + q(0), + ], + q(sar) => [ + q(5885), + q(0), + ], + q(sas) => [ + q(0372), + q(0), + ], + q(sat) => [ + q(0373), + q(0), + ], + q(sau) => [ + q(5886), + q(0), + ], + q(sav) => [ + q(5887), + q(0), + ], + q(saw) => [ + q(5888), + q(0), + ], + q(sax) => [ + q(5889), + q(0), + ], + q(say) => [ + q(5890), + q(0), + ], + q(saz) => [ + q(5891), + q(0), + ], + q(sba) => [ + q(5892), + q(0), + ], + q(sbb) => [ + q(5893), + q(0), + ], + q(sbc) => [ + q(5894), + q(0), + ], + q(sbd) => [ + q(5895), + q(0), + ], + q(sbe) => [ + q(5896), + q(0), + ], + q(sbf) => [ + q(5897), + q(0), + ], + q(sbg) => [ + q(5898), + q(0), + ], + q(sbh) => [ + q(5899), + q(0), + ], + q(sbi) => [ + q(5900), + q(0), + ], + q(sbj) => [ + q(5901), + q(0), + ], + q(sbk) => [ + q(5902), + q(0), + ], + q(sbl) => [ + q(5903), + q(0), + ], + q(sbm) => [ + q(5904), + q(0), + ], + q(sbn) => [ + q(5905), + q(0), + ], + q(sbo) => [ + q(5906), + q(0), + ], + q(sbp) => [ + q(5907), + q(0), + ], + q(sbq) => [ + q(5908), + q(0), + ], + q(sbr) => [ + q(5909), + q(0), + ], + q(sbs) => [ + q(5910), + q(0), + ], + q(sbt) => [ + q(5911), + q(0), + ], + q(sbu) => [ + q(5912), + q(0), + ], + q(sbv) => [ + q(5913), + q(0), + ], + q(sbw) => [ + q(5914), + q(0), + ], + q(sbx) => [ + q(5915), + q(0), + ], + q(sby) => [ + q(5916), + q(0), + ], + q(sbz) => [ + q(5917), + q(0), + ], + q(scb) => [ + q(5918), + q(0), + ], + q(sce) => [ + q(5919), + q(0), + ], + q(scf) => [ + q(5920), + q(0), + ], + q(scg) => [ + q(5921), + q(0), + ], + q(sch) => [ + q(5922), + q(0), + ], + q(sci) => [ + q(5923), + q(0), + ], + q(sck) => [ + q(5924), + q(0), + ], + q(scl) => [ + q(5925), + q(0), + ], + q(scn) => [ + q(0374), + q(0), + ], + q(sco) => [ + q(0375), + q(0), + ], + q(scp) => [ + q(5926), + q(0), + ], + q(scq) => [ + q(5927), + q(0), + ], + q(scs) => [ + q(5928), + q(0), + ], + q(sct) => [ + q(5929), + q(0), + ], + q(scu) => [ + q(5930), + q(0), + ], + q(scv) => [ + q(5931), + q(0), + ], + q(scw) => [ + q(5932), + q(0), + ], + q(scx) => [ + q(5933), + q(0), + ], + q(sda) => [ + q(5934), + q(0), + ], + q(sdb) => [ + q(5935), + q(0), + ], + q(sdc) => [ + q(5936), + q(0), + ], + q(sde) => [ + q(5937), + q(0), + ], + q(sdf) => [ + q(5938), + q(0), + ], + q(sdg) => [ + q(5939), + q(0), + ], + q(sdh) => [ + q(5940), + q(0), + ], + q(sdj) => [ + q(5941), + q(0), + ], + q(sdk) => [ + q(5942), + q(0), + ], + q(sdl) => [ + q(5943), + q(0), + ], + q(sdm) => [ + q(5944), + q(0), + ], + q(sdn) => [ + q(5945), + q(0), + ], + q(sdo) => [ + q(5946), + q(0), + ], + q(sdp) => [ + q(5947), + q(0), + ], + q(sdr) => [ + q(5948), + q(0), + ], + q(sds) => [ + q(5949), + q(0), + ], + q(sdt) => [ + q(5950), + q(0), + ], + q(sdu) => [ + q(5951), + q(0), + ], + q(sdv) => [ + q(0525), + q(0), + ], + q(sdx) => [ + q(5952), + q(0), + ], + q(sdz) => [ + q(5953), + q(0), + ], + q(sea) => [ + q(5954), + q(0), + ], + q(seb) => [ + q(5955), + q(0), + ], + q(sec) => [ + q(5956), + q(0), + ], + q(sed) => [ + q(5957), + q(0), + ], + q(see) => [ + q(5958), + q(0), + ], + q(sef) => [ + q(5959), + q(0), + ], + q(seg) => [ + q(5960), + q(0), + ], + q(seh) => [ + q(5961), + q(0), + ], + q(sei) => [ + q(5962), + q(0), + ], + q(sej) => [ + q(5963), + q(0), + ], + q(sek) => [ + q(5964), + q(0), + ], + q(sel) => [ + q(0376), + q(0), + ], + q(sem) => [ + q(0377), + q(0), + ], + q(sen) => [ + q(5965), + q(0), + ], + q(seo) => [ + q(5966), + q(0), + ], + q(sep) => [ + q(5967), + q(0), + ], + q(seq) => [ + q(5968), + q(0), + ], + q(ser) => [ + q(5969), + q(0), + ], + q(ses) => [ + q(5970), + q(0), + ], + q(set) => [ + q(5971), + q(0), + ], + q(seu) => [ + q(5972), + q(0), + ], + q(sev) => [ + q(5973), + q(0), + ], + q(sew) => [ + q(5974), + q(0), + ], + q(sey) => [ + q(5975), + q(0), + ], + q(sez) => [ + q(5976), + q(0), + ], + q(sfb) => [ + q(5977), + q(0), + ], + q(sfe) => [ + q(5978), + q(0), + ], + q(sfm) => [ + q(5979), + q(0), + ], + q(sfs) => [ + q(5980), + q(0), + ], + q(sfw) => [ + q(5981), + q(0), + ], + q(sga) => [ + q(0378), + q(1), + ], + q(sgb) => [ + q(5982), + q(0), + ], + q(sgc) => [ + q(5983), + q(0), + ], + q(sgd) => [ + q(5984), + q(0), + ], + q(sge) => [ + q(5985), + q(0), + ], + q(sgg) => [ + q(5986), + q(0), + ], + q(sgh) => [ + q(5987), + q(0), + ], + q(sgi) => [ + q(5988), + q(0), + ], + q(sgj) => [ + q(5989), + q(0), + ], + q(sgk) => [ + q(5990), + q(0), + ], + q(sgm) => [ + q(5991), + q(0), + ], + q(sgn) => [ + q(0379), + q(0), + ], + q(sgp) => [ + q(5992), + q(0), + ], + q(sgr) => [ + q(5993), + q(0), + ], + q(sgs) => [ + q(5994), + q(0), + ], + q(sgt) => [ + q(5995), + q(0), + ], + q(sgu) => [ + q(5996), + q(0), + ], + q(sgw) => [ + q(5997), + q(0), + ], + q(sgx) => [ + q(5998), + q(0), + ], + q(sgy) => [ + q(5999), + q(0), + ], + q(sgz) => [ + q(6000), + q(0), + ], + q(sha) => [ + q(6001), + q(0), + ], + q(shb) => [ + q(6002), + q(0), + ], + q(shc) => [ + q(6003), + q(0), + ], + q(shd) => [ + q(6004), + q(0), + ], + q(she) => [ + q(6005), + q(0), + ], + q(shg) => [ + q(6006), + q(0), + ], + q(shh) => [ + q(6007), + q(0), + ], + q(shi) => [ + q(6008), + q(0), + ], + q(shj) => [ + q(6009), + q(0), + ], + q(shk) => [ + q(6010), + q(0), + ], + q(shl) => [ + q(6011), + q(0), + ], + q(shm) => [ + q(6012), + q(0), + ], + q(shn) => [ + q(0380), + q(0), + ], + q(sho) => [ + q(6013), + q(0), + ], + q(shp) => [ + q(6014), + q(0), + ], + q(shq) => [ + q(6015), + q(0), + ], + q(shr) => [ + q(6016), + q(0), + ], + q(shs) => [ + q(6017), + q(0), + ], + q(sht) => [ + q(6018), + q(0), + ], + q(shu) => [ + q(6019), + q(0), + ], + q(shv) => [ + q(6020), + q(0), + ], + q(shw) => [ + q(6021), + q(0), + ], + q(shx) => [ + q(6022), + q(0), + ], + q(shy) => [ + q(6023), + q(0), + ], + q(shz) => [ + q(6024), + q(0), + ], + q(sia) => [ + q(6025), + q(0), + ], + q(sib) => [ + q(6026), + q(0), + ], + q(sid) => [ + q(0381), + q(0), + ], + q(sie) => [ + q(6027), + q(0), + ], + q(sif) => [ + q(6028), + q(0), + ], + q(sig) => [ + q(6029), + q(0), + ], + q(sih) => [ + q(6030), + q(0), + ], + q(sii) => [ + q(6031), + q(0), + ], + q(sij) => [ + q(6032), + q(0), + ], + q(sik) => [ + q(6033), + q(0), + ], + q(sil) => [ + q(6034), + q(0), + ], + q(sim) => [ + q(6035), + q(0), + ], + q(sin) => [ + q(0382), + q(0), + ], + q(sio) => [ + q(0383), + q(0), + ], + q(sip) => [ + q(6036), + q(0), + ], + q(siq) => [ + q(6037), + q(0), + ], + q(sir) => [ + q(6038), + q(0), + ], + q(sis) => [ + q(6039), + q(0), + ], + q(sit) => [ + q(0384), + q(0), + ], + q(siu) => [ + q(6040), + q(0), + ], + q(siv) => [ + q(6041), + q(0), + ], + q(siw) => [ + q(6042), + q(0), + ], + q(six) => [ + q(6043), + q(0), + ], + q(siy) => [ + q(6044), + q(0), + ], + q(siz) => [ + q(6045), + q(0), + ], + q(sja) => [ + q(6046), + q(0), + ], + q(sjb) => [ + q(6047), + q(0), + ], + q(sjd) => [ + q(6048), + q(0), + ], + q(sje) => [ + q(6049), + q(0), + ], + q(sjg) => [ + q(6050), + q(0), + ], + q(sjk) => [ + q(6051), + q(0), + ], + q(sjl) => [ + q(6052), + q(0), + ], + q(sjm) => [ + q(6053), + q(0), + ], + q(sjn) => [ + q(6054), + q(0), + ], + q(sjo) => [ + q(6055), + q(0), + ], + q(sjp) => [ + q(6056), + q(0), + ], + q(sjr) => [ + q(6057), + q(0), + ], + q(sjs) => [ + q(6058), + q(0), + ], + q(sjt) => [ + q(6059), + q(0), + ], + q(sju) => [ + q(6060), + q(0), + ], + q(sjw) => [ + q(6061), + q(0), + ], + q(ska) => [ + q(6062), + q(0), + ], + q(skb) => [ + q(6063), + q(0), + ], + q(skc) => [ + q(6064), + q(0), + ], + q(skd) => [ + q(6065), + q(0), + ], + q(ske) => [ + q(6066), + q(0), + ], + q(skf) => [ + q(6067), + q(0), + ], + q(skg) => [ + q(6068), + q(0), + ], + q(skh) => [ + q(6069), + q(0), + ], + q(ski) => [ + q(6070), + q(0), + ], + q(skj) => [ + q(6071), + q(0), + ], + q(skm) => [ + q(6072), + q(0), + ], + q(skn) => [ + q(6073), + q(0), + ], + q(sko) => [ + q(6074), + q(0), + ], + q(skp) => [ + q(6075), + q(0), + ], + q(skq) => [ + q(6076), + q(0), + ], + q(skr) => [ + q(6077), + q(0), + ], + q(sks) => [ + q(6078), + q(0), + ], + q(skt) => [ + q(6079), + q(0), + ], + q(sku) => [ + q(6080), + q(0), + ], + q(skv) => [ + q(6081), + q(0), + ], + q(skw) => [ + q(6082), + q(0), + ], + q(skx) => [ + q(6083), + q(0), + ], + q(sky) => [ + q(6084), + q(0), + ], + q(skz) => [ + q(6085), + q(0), + ], + q(sla) => [ + q(0385), + q(0), + ], + q(slc) => [ + q(5896), + q(0), + ], + q(sld) => [ + q(6086), + q(0), + ], + q(sle) => [ + q(6087), + q(0), + ], + q(slf) => [ + q(6088), + q(0), + ], + q(slg) => [ + q(6089), + q(0), + ], + q(slh) => [ + q(6090), + q(0), + ], + q(sli) => [ + q(6091), + q(0), + ], + q(slj) => [ + q(6092), + q(0), + ], + q(sll) => [ + q(6093), + q(0), + ], + q(slm) => [ + q(6094), + q(0), + ], + q(sln) => [ + q(6095), + q(0), + ], + q(slo) => [ + q(0386), + q(0), + ], + q(slp) => [ + q(6096), + q(0), + ], + q(slq) => [ + q(6097), + q(0), + ], + q(slr) => [ + q(6098), + q(0), + ], + q(sls) => [ + q(6099), + q(0), + ], + q(slt) => [ + q(6100), + q(0), + ], + q(slu) => [ + q(6101), + q(0), + ], + q(slv) => [ + q(0387), + q(0), + ], + q(slw) => [ + q(6102), + q(0), + ], + q(slx) => [ + q(6103), + q(0), + ], + q(sly) => [ + q(6104), + q(0), + ], + q(slz) => [ + q(6105), + q(0), + ], + q(sma) => [ + q(0388), + q(0), + ], + q(smb) => [ + q(6106), + q(0), + ], + q(smc) => [ + q(6107), + q(0), + ], + q(smd) => [ + q(6108), + q(0), + ], + q(sme) => [ + q(0389), + q(0), + ], + q(smf) => [ + q(6109), + q(0), + ], + q(smg) => [ + q(6110), + q(0), + ], + q(smh) => [ + q(6111), + q(0), + ], + q(smi) => [ + q(0390), + q(0), + ], + q(smj) => [ + q(0391), + q(0), + ], + q(smk) => [ + q(6112), + q(0), + ], + q(sml) => [ + q(6113), + q(0), + ], + q(smm) => [ + q(6114), + q(0), + ], + q(smn) => [ + q(0392), + q(0), + ], + q(smo) => [ + q(0393), + q(0), + ], + q(smp) => [ + q(6115), + q(0), + ], + q(smq) => [ + q(6116), + q(0), + ], + q(smr) => [ + q(6117), + q(0), + ], + q(sms) => [ + q(0394), + q(0), + ], + q(smt) => [ + q(6118), + q(0), + ], + q(smu) => [ + q(6119), + q(0), + ], + q(smv) => [ + q(6120), + q(0), + ], + q(smw) => [ + q(6121), + q(0), + ], + q(smx) => [ + q(6122), + q(0), + ], + q(smy) => [ + q(6123), + q(0), + ], + q(smz) => [ + q(6124), + q(0), + ], + q(sna) => [ + q(0395), + q(0), + ], + q(snb) => [ + q(6125), + q(0), + ], + q(snc) => [ + q(6126), + q(0), + ], + q(snd) => [ + q(0396), + q(0), + ], + q(sne) => [ + q(6127), + q(0), + ], + q(snf) => [ + q(6128), + q(0), + ], + q(sng) => [ + q(6129), + q(0), + ], + q(sni) => [ + q(6130), + q(0), + ], + q(snj) => [ + q(6131), + q(0), + ], + q(snk) => [ + q(0397), + q(0), + ], + q(snl) => [ + q(6132), + q(0), + ], + q(snm) => [ + q(6133), + q(0), + ], + q(snn) => [ + q(6134), + q(0), + ], + q(sno) => [ + q(6135), + q(0), + ], + q(snp) => [ + q(6136), + q(0), + ], + q(snq) => [ + q(6137), + q(0), + ], + q(snr) => [ + q(6138), + q(0), + ], + q(sns) => [ + q(6139), + q(0), + ], + q(snu) => [ + q(6140), + q(0), + ], + q(snv) => [ + q(6141), + q(0), + ], + q(snw) => [ + q(6142), + q(0), + ], + q(snx) => [ + q(6143), + q(0), + ], + q(sny) => [ + q(6144), + q(0), + ], + q(snz) => [ + q(6145), + q(0), + ], + q(soa) => [ + q(6146), + q(0), + ], + q(sob) => [ + q(6147), + q(0), + ], + q(soc) => [ + q(6148), + q(0), + ], + q(sod) => [ + q(6149), + q(0), + ], + q(soe) => [ + q(6150), + q(0), + ], + q(sog) => [ + q(0398), + q(0), + ], + q(soh) => [ + q(6151), + q(0), + ], + q(soi) => [ + q(6152), + q(0), + ], + q(soj) => [ + q(6153), + q(0), + ], + q(sok) => [ + q(6154), + q(0), + ], + q(sol) => [ + q(6155), + q(0), + ], + q(som) => [ + q(0399), + q(0), + ], + q(son) => [ + q(0400), + q(0), + ], + q(soo) => [ + q(6156), + q(0), + ], + q(sop) => [ + q(6157), + q(0), + ], + q(soq) => [ + q(6158), + q(0), + ], + q(sor) => [ + q(6159), + q(0), + ], + q(sos) => [ + q(6160), + q(0), + ], + q(sot) => [ + q(0401), + q(0), + ], + q(sou) => [ + q(6161), + q(0), + ], + q(sov) => [ + q(6162), + q(0), + ], + q(sow) => [ + q(6163), + q(0), + ], + q(sox) => [ + q(6164), + q(0), + ], + q(soy) => [ + q(6165), + q(0), + ], + q(soz) => [ + q(6166), + q(0), + ], + q(spa) => [ + q(0402), + q(0), + ], + q(spb) => [ + q(6167), + q(0), + ], + q(spc) => [ + q(6168), + q(0), + ], + q(spd) => [ + q(6169), + q(0), + ], + q(spe) => [ + q(6170), + q(0), + ], + q(spg) => [ + q(6171), + q(0), + ], + q(spi) => [ + q(6172), + q(0), + ], + q(spk) => [ + q(6173), + q(0), + ], + q(spl) => [ + q(6174), + q(0), + ], + q(spm) => [ + q(6175), + q(0), + ], + q(spn) => [ + q(6176), + q(0), + ], + q(spo) => [ + q(6177), + q(0), + ], + q(spp) => [ + q(6178), + q(0), + ], + q(spq) => [ + q(6179), + q(0), + ], + q(spr) => [ + q(6180), + q(0), + ], + q(sps) => [ + q(6181), + q(0), + ], + q(spt) => [ + q(6182), + q(0), + ], + q(spu) => [ + q(6183), + q(0), + ], + q(spv) => [ + q(6184), + q(0), + ], + q(spx) => [ + q(6185), + q(0), + ], + q(spy) => [ + q(6186), + q(0), + ], + q(sqa) => [ + q(6187), + q(0), + ], + q(sqh) => [ + q(6188), + q(0), + ], + q(sqj) => [ + q(0526), + q(0), + ], + q(sqk) => [ + q(6189), + q(0), + ], + q(sqm) => [ + q(6190), + q(0), + ], + q(sqn) => [ + q(6191), + q(0), + ], + q(sqo) => [ + q(6192), + q(0), + ], + q(sqq) => [ + q(6193), + q(0), + ], + q(sqr) => [ + q(6194), + q(0), + ], + q(sqs) => [ + q(6195), + q(0), + ], + q(sqt) => [ + q(6196), + q(0), + ], + q(squ) => [ + q(6197), + q(0), + ], + q(sra) => [ + q(6198), + q(0), + ], + q(srb) => [ + q(6199), + q(0), + ], + q(src) => [ + q(6200), + q(0), + ], + q(srd) => [ + q(0403), + q(0), + ], + q(sre) => [ + q(6201), + q(0), + ], + q(srf) => [ + q(6202), + q(0), + ], + q(srg) => [ + q(6203), + q(0), + ], + q(srh) => [ + q(6204), + q(0), + ], + q(sri) => [ + q(6205), + q(0), + ], + q(srk) => [ + q(6206), + q(0), + ], + q(srl) => [ + q(6207), + q(0), + ], + q(srm) => [ + q(6208), + q(0), + ], + q(srn) => [ + q(0404), + q(0), + ], + q(sro) => [ + q(6209), + q(0), + ], + q(srp) => [ + q(0405), + q(0), + ], + q(srq) => [ + q(6210), + q(0), + ], + q(srr) => [ + q(0406), + q(0), + ], + q(srs) => [ + q(6211), + q(0), + ], + q(srt) => [ + q(6212), + q(0), + ], + q(sru) => [ + q(6213), + q(0), + ], + q(srv) => [ + q(6214), + q(0), + ], + q(srw) => [ + q(6215), + q(0), + ], + q(srx) => [ + q(6216), + q(0), + ], + q(sry) => [ + q(6217), + q(0), + ], + q(srz) => [ + q(6218), + q(0), + ], + q(ssa) => [ + q(0407), + q(0), + ], + q(ssb) => [ + q(6219), + q(0), + ], + q(ssc) => [ + q(6220), + q(0), + ], + q(ssd) => [ + q(6221), + q(0), + ], + q(sse) => [ + q(6222), + q(0), + ], + q(ssf) => [ + q(6223), + q(0), + ], + q(ssg) => [ + q(6224), + q(0), + ], + q(ssh) => [ + q(6225), + q(0), + ], + q(ssi) => [ + q(6226), + q(0), + ], + q(ssj) => [ + q(6227), + q(0), + ], + q(ssk) => [ + q(6228), + q(0), + ], + q(ssl) => [ + q(6229), + q(0), + ], + q(ssm) => [ + q(6230), + q(0), + ], + q(ssn) => [ + q(6231), + q(0), + ], + q(sso) => [ + q(6232), + q(0), + ], + q(ssp) => [ + q(6233), + q(0), + ], + q(ssq) => [ + q(6234), + q(0), + ], + q(ssr) => [ + q(6235), + q(0), + ], + q(sss) => [ + q(6236), + q(0), + ], + q(sst) => [ + q(6237), + q(0), + ], + q(ssu) => [ + q(6238), + q(0), + ], + q(ssv) => [ + q(6239), + q(0), + ], + q(ssw) => [ + q(0408), + q(0), + ], + q(ssx) => [ + q(6240), + q(0), + ], + q(ssy) => [ + q(6241), + q(0), + ], + q(ssz) => [ + q(6242), + q(0), + ], + q(sta) => [ + q(6243), + q(0), + ], + q(stb) => [ + q(6244), + q(0), + ], + q(std) => [ + q(6245), + q(0), + ], + q(ste) => [ + q(6246), + q(0), + ], + q(stf) => [ + q(6247), + q(0), + ], + q(stg) => [ + q(6248), + q(0), + ], + q(sth) => [ + q(6249), + q(0), + ], + q(sti) => [ + q(6250), + q(0), + ], + q(stj) => [ + q(6251), + q(0), + ], + q(stk) => [ + q(6252), + q(0), + ], + q(stl) => [ + q(6253), + q(0), + ], + q(stm) => [ + q(6254), + q(0), + ], + q(stn) => [ + q(6255), + q(0), + ], + q(sto) => [ + q(6256), + q(0), + ], + q(stp) => [ + q(6257), + q(0), + ], + q(stq) => [ + q(6258), + q(0), + ], + q(str) => [ + q(6259), + q(0), + ], + q(sts) => [ + q(6260), + q(0), + ], + q(stt) => [ + q(6261), + q(0), + ], + q(stu) => [ + q(6262), + q(0), + ], + q(stv) => [ + q(6263), + q(0), + ], + q(stw) => [ + q(6264), + q(0), + ], + q(sty) => [ + q(6265), + q(0), + ], + q(sua) => [ + q(6266), + q(0), + ], + q(sub) => [ + q(6267), + q(0), + ], + q(suc) => [ + q(6268), + q(0), + ], + q(sue) => [ + q(6269), + q(0), + ], + q(sug) => [ + q(6270), + q(0), + ], + q(sui) => [ + q(6271), + q(0), + ], + q(suj) => [ + q(6272), + q(0), + ], + q(suk) => [ + q(0409), + q(0), + ], + q(sun) => [ + q(0410), + q(0), + ], + q(suq) => [ + q(6273), + q(0), + ], + q(sur) => [ + q(6274), + q(0), + ], + q(sus) => [ + q(0411), + q(0), + ], + q(sut) => [ + q(6275), + q(0), + ], + q(suv) => [ + q(6276), + q(0), + ], + q(suw) => [ + q(6277), + q(0), + ], + q(sux) => [ + q(0412), + q(0), + ], + q(suy) => [ + q(6278), + q(0), + ], + q(suz) => [ + q(6279), + q(0), + ], + q(sva) => [ + q(6280), + q(0), + ], + q(svb) => [ + q(6281), + q(0), + ], + q(svc) => [ + q(6282), + q(0), + ], + q(sve) => [ + q(6283), + q(0), + ], + q(svk) => [ + q(6284), + q(0), + ], + q(svm) => [ + q(6285), + q(0), + ], + q(svs) => [ + q(6286), + q(0), + ], + q(svx) => [ + q(6287), + q(0), + ], + q(swa) => [ + q(0413), + q(0), + ], + q(swb) => [ + q(6288), + q(0), + ], + q(swc) => [ + q(6289), + q(0), + ], + q(swe) => [ + q(0414), + q(0), + ], + q(swf) => [ + q(6290), + q(0), + ], + q(swg) => [ + q(6291), + q(0), + ], + q(swh) => [ + q(6292), + q(0), + ], + q(swi) => [ + q(6293), + q(0), + ], + q(swj) => [ + q(6294), + q(0), + ], + q(swk) => [ + q(6295), + q(0), + ], + q(swl) => [ + q(6296), + q(0), + ], + q(swm) => [ + q(6297), + q(0), + ], + q(swn) => [ + q(6298), + q(0), + ], + q(swo) => [ + q(6299), + q(0), + ], + q(swp) => [ + q(6300), + q(0), + ], + q(swq) => [ + q(6301), + q(0), + ], + q(swr) => [ + q(6302), + q(0), + ], + q(sws) => [ + q(6303), + q(0), + ], + q(swt) => [ + q(6304), + q(0), + ], + q(swu) => [ + q(6305), + q(0), + ], + q(swv) => [ + q(6306), + q(0), + ], + q(sww) => [ + q(6307), + q(0), + ], + q(swx) => [ + q(6308), + q(0), + ], + q(swy) => [ + q(6309), + q(0), + ], + q(sxb) => [ + q(6310), + q(0), + ], + q(sxc) => [ + q(6311), + q(0), + ], + q(sxe) => [ + q(6312), + q(0), + ], + q(sxg) => [ + q(6313), + q(0), + ], + q(sxk) => [ + q(6314), + q(0), + ], + q(sxl) => [ + q(6315), + q(0), + ], + q(sxm) => [ + q(6316), + q(0), + ], + q(sxn) => [ + q(6317), + q(0), + ], + q(sxo) => [ + q(6318), + q(0), + ], + q(sxr) => [ + q(6319), + q(0), + ], + q(sxs) => [ + q(6320), + q(0), + ], + q(sxu) => [ + q(6321), + q(0), + ], + q(sxw) => [ + q(6322), + q(0), + ], + q(sya) => [ + q(6323), + q(0), + ], + q(syb) => [ + q(6324), + q(0), + ], + q(syc) => [ + q(0415), + q(0), + ], + q(syd) => [ + q(0527), + q(0), + ], + q(syi) => [ + q(6325), + q(0), + ], + q(syk) => [ + q(6326), + q(0), + ], + q(syl) => [ + q(6327), + q(0), + ], + q(sym) => [ + q(6328), + q(0), + ], + q(syn) => [ + q(6329), + q(0), + ], + q(syo) => [ + q(6330), + q(0), + ], + q(syr) => [ + q(0416), + q(0), + ], + q(sys) => [ + q(6331), + q(0), + ], + q(syw) => [ + q(6332), + q(0), + ], + q(syx) => [ + q(6333), + q(0), + ], + q(syy) => [ + q(6334), + q(0), + ], + q(sza) => [ + q(6335), + q(0), + ], + q(szb) => [ + q(6336), + q(0), + ], + q(szc) => [ + q(6337), + q(0), + ], + q(szd) => [ + q(6338), + q(0), + ], + q(sze) => [ + q(6339), + q(0), + ], + q(szg) => [ + q(6340), + q(0), + ], + q(szl) => [ + q(6341), + q(0), + ], + q(szn) => [ + q(6342), + q(0), + ], + q(szp) => [ + q(6343), + q(0), + ], + q(szs) => [ + q(6344), + q(0), + ], + q(szv) => [ + q(6345), + q(0), + ], + q(szw) => [ + q(6346), + q(0), + ], + q(taa) => [ + q(6347), + q(0), + ], + q(tab) => [ + q(6348), + q(0), + ], + q(tac) => [ + q(6349), + q(0), + ], + q(tad) => [ + q(6350), + q(0), + ], + q(tae) => [ + q(6351), + q(0), + ], + q(taf) => [ + q(6352), + q(0), + ], + q(tag) => [ + q(6353), + q(0), + ], + q(tah) => [ + q(0417), + q(0), + ], + q(tai) => [ + q(0418), + q(0), + ], + q(taj) => [ + q(6354), + q(0), + ], + q(tak) => [ + q(6355), + q(0), + ], + q(tal) => [ + q(6356), + q(0), + ], + q(tam) => [ + q(0419), + q(0), + ], + q(tan) => [ + q(6357), + q(0), + ], + q(tao) => [ + q(6358), + q(0), + ], + q(tap) => [ + q(6359), + q(0), + ], + q(taq) => [ + q(6360), + q(0), + ], + q(tar) => [ + q(6361), + q(0), + ], + q(tas) => [ + q(6362), + q(0), + ], + q(tat) => [ + q(0420), + q(0), + ], + q(tau) => [ + q(6363), + q(0), + ], + q(tav) => [ + q(6364), + q(0), + ], + q(taw) => [ + q(6365), + q(0), + ], + q(tax) => [ + q(6366), + q(0), + ], + q(tay) => [ + q(6367), + q(0), + ], + q(taz) => [ + q(6368), + q(0), + ], + q(tba) => [ + q(6369), + q(0), + ], + q(tbb) => [ + q(6370), + q(0), + ], + q(tbc) => [ + q(6371), + q(0), + ], + q(tbd) => [ + q(6372), + q(0), + ], + q(tbe) => [ + q(6373), + q(0), + ], + q(tbf) => [ + q(6374), + q(0), + ], + q(tbg) => [ + q(6375), + q(0), + ], + q(tbh) => [ + q(6376), + q(0), + ], + q(tbi) => [ + q(6377), + q(0), + ], + q(tbj) => [ + q(6378), + q(0), + ], + q(tbk) => [ + q(6379), + q(0), + ], + q(tbl) => [ + q(6380), + q(0), + ], + q(tbm) => [ + q(6381), + q(0), + ], + q(tbn) => [ + q(6382), + q(0), + ], + q(tbo) => [ + q(6383), + q(0), + ], + q(tbp) => [ + q(6384), + q(0), + ], + q(tbq) => [ + q(0528), + q(0), + ], + q(tbr) => [ + q(6385), + q(0), + ], + q(tbs) => [ + q(6386), + q(0), + ], + q(tbt) => [ + q(6387), + q(0), + ], + q(tbu) => [ + q(6388), + q(0), + ], + q(tbv) => [ + q(6389), + q(0), + ], + q(tbw) => [ + q(6390), + q(0), + ], + q(tbx) => [ + q(6391), + q(0), + ], + q(tby) => [ + q(6392), + q(0), + ], + q(tbz) => [ + q(6393), + q(0), + ], + q(tca) => [ + q(6394), + q(0), + ], + q(tcb) => [ + q(6395), + q(0), + ], + q(tcc) => [ + q(6396), + q(0), + ], + q(tcd) => [ + q(6397), + q(0), + ], + q(tce) => [ + q(6398), + q(0), + ], + q(tcf) => [ + q(6399), + q(0), + ], + q(tcg) => [ + q(6400), + q(0), + ], + q(tch) => [ + q(6401), + q(0), + ], + q(tci) => [ + q(6402), + q(0), + ], + q(tck) => [ + q(6403), + q(0), + ], + q(tcl) => [ + q(6404), + q(0), + ], + q(tcm) => [ + q(6405), + q(0), + ], + q(tcn) => [ + q(6406), + q(0), + ], + q(tco) => [ + q(6407), + q(0), + ], + q(tcp) => [ + q(6408), + q(0), + ], + q(tcq) => [ + q(6409), + q(0), + ], + q(tcs) => [ + q(6410), + q(0), + ], + q(tct) => [ + q(6411), + q(0), + ], + q(tcu) => [ + q(6412), + q(0), + ], + q(tcw) => [ + q(6413), + q(0), + ], + q(tcx) => [ + q(6414), + q(0), + ], + q(tcy) => [ + q(6415), + q(0), + ], + q(tcz) => [ + q(6416), + q(0), + ], + q(tda) => [ + q(6417), + q(0), + ], + q(tdb) => [ + q(6418), + q(0), + ], + q(tdc) => [ + q(6419), + q(0), + ], + q(tdd) => [ + q(6420), + q(0), + ], + q(tde) => [ + q(6421), + q(0), + ], + q(tdf) => [ + q(6422), + q(0), + ], + q(tdg) => [ + q(6423), + q(0), + ], + q(tdh) => [ + q(6424), + q(0), + ], + q(tdi) => [ + q(6425), + q(0), + ], + q(tdj) => [ + q(6426), + q(0), + ], + q(tdk) => [ + q(6427), + q(0), + ], + q(tdl) => [ + q(6428), + q(0), + ], + q(tdm) => [ + q(6429), + q(0), + ], + q(tdn) => [ + q(6430), + q(0), + ], + q(tdo) => [ + q(6431), + q(0), + ], + q(tdq) => [ + q(6432), + q(0), + ], + q(tdr) => [ + q(6433), + q(0), + ], + q(tds) => [ + q(6434), + q(0), + ], + q(tdt) => [ + q(6435), + q(0), + ], + q(tdv) => [ + q(6436), + q(0), + ], + q(tdx) => [ + q(6437), + q(0), + ], + q(tdy) => [ + q(6438), + q(0), + ], + q(tea) => [ + q(6439), + q(0), + ], + q(teb) => [ + q(6440), + q(0), + ], + q(tec) => [ + q(6441), + q(0), + ], + q(ted) => [ + q(6442), + q(0), + ], + q(tee) => [ + q(6443), + q(0), + ], + q(tef) => [ + q(6444), + q(0), + ], + q(teg) => [ + q(6445), + q(0), + ], + q(teh) => [ + q(6446), + q(0), + ], + q(tei) => [ + q(6447), + q(0), + ], + q(tek) => [ + q(6448), + q(0), + ], + q(tel) => [ + q(0421), + q(0), + ], + q(tem) => [ + q(0422), + q(0), + ], + q(ten) => [ + q(6449), + q(0), + ], + q(teo) => [ + q(6450), + q(0), + ], + q(tep) => [ + q(6451), + q(0), + ], + q(teq) => [ + q(6452), + q(0), + ], + q(ter) => [ + q(0423), + q(0), + ], + q(tes) => [ + q(6453), + q(0), + ], + q(tet) => [ + q(0424), + q(0), + ], + q(teu) => [ + q(6454), + q(0), + ], + q(tev) => [ + q(6455), + q(0), + ], + q(tew) => [ + q(6456), + q(0), + ], + q(tex) => [ + q(6457), + q(0), + ], + q(tey) => [ + q(6458), + q(0), + ], + q(tfi) => [ + q(6459), + q(0), + ], + q(tfn) => [ + q(6460), + q(0), + ], + q(tfo) => [ + q(6461), + q(0), + ], + q(tfr) => [ + q(6462), + q(0), + ], + q(tft) => [ + q(6463), + q(0), + ], + q(tga) => [ + q(6464), + q(0), + ], + q(tgb) => [ + q(6465), + q(0), + ], + q(tgc) => [ + q(6466), + q(0), + ], + q(tgd) => [ + q(6467), + q(0), + ], + q(tge) => [ + q(6468), + q(0), + ], + q(tgf) => [ + q(6469), + q(0), + ], + q(tgh) => [ + q(6470), + q(0), + ], + q(tgi) => [ + q(6471), + q(0), + ], + q(tgj) => [ + q(6472), + q(0), + ], + q(tgk) => [ + q(0425), + q(0), + ], + q(tgl) => [ + q(0426), + q(0), + ], + q(tgn) => [ + q(6473), + q(0), + ], + q(tgo) => [ + q(6474), + q(0), + ], + q(tgp) => [ + q(6475), + q(0), + ], + q(tgq) => [ + q(6476), + q(0), + ], + q(tgr) => [ + q(6477), + q(0), + ], + q(tgs) => [ + q(6478), + q(0), + ], + q(tgt) => [ + q(6479), + q(0), + ], + q(tgu) => [ + q(6480), + q(0), + ], + q(tgv) => [ + q(6481), + q(0), + ], + q(tgw) => [ + q(6482), + q(0), + ], + q(tgx) => [ + q(6483), + q(0), + ], + q(tgy) => [ + q(6484), + q(0), + ], + q(tgz) => [ + q(6485), + q(0), + ], + q(tha) => [ + q(0427), + q(0), + ], + q(thd) => [ + q(6486), + q(0), + ], + q(the) => [ + q(6487), + q(0), + ], + q(thf) => [ + q(6488), + q(0), + ], + q(thh) => [ + q(6489), + q(0), + ], + q(thi) => [ + q(6490), + q(0), + ], + q(thk) => [ + q(6491), + q(0), + ], + q(thl) => [ + q(6492), + q(0), + ], + q(thm) => [ + q(6493), + q(0), + ], + q(thn) => [ + q(6494), + q(0), + ], + q(thp) => [ + q(6495), + q(0), + ], + q(thq) => [ + q(6496), + q(0), + ], + q(thr) => [ + q(6497), + q(0), + ], + q(ths) => [ + q(6498), + q(0), + ], + q(tht) => [ + q(6499), + q(0), + ], + q(thu) => [ + q(6500), + q(0), + ], + q(thv) => [ + q(6501), + q(0), + ], + q(thw) => [ + q(6502), + q(0), + ], + q(thy) => [ + q(6503), + q(0), + ], + q(thz) => [ + q(6504), + q(0), + ], + q(tia) => [ + q(6505), + q(0), + ], + q(tib) => [ + q(0428), + q(0), + ], + q(tic) => [ + q(6506), + q(0), + ], + q(tif) => [ + q(6507), + q(0), + ], + q(tig) => [ + q(0429), + q(0), + ], + q(tih) => [ + q(6508), + q(0), + ], + q(tii) => [ + q(6509), + q(0), + ], + q(tij) => [ + q(6510), + q(0), + ], + q(tik) => [ + q(6511), + q(0), + ], + q(til) => [ + q(6512), + q(0), + ], + q(tim) => [ + q(6513), + q(0), + ], + q(tin) => [ + q(6514), + q(0), + ], + q(tio) => [ + q(6515), + q(0), + ], + q(tip) => [ + q(6516), + q(0), + ], + q(tiq) => [ + q(6517), + q(0), + ], + q(tir) => [ + q(0430), + q(0), + ], + q(tis) => [ + q(6518), + q(0), + ], + q(tit) => [ + q(6519), + q(0), + ], + q(tiu) => [ + q(6520), + q(0), + ], + q(tiv) => [ + q(0431), + q(0), + ], + q(tiw) => [ + q(6521), + q(0), + ], + q(tix) => [ + q(6522), + q(0), + ], + q(tiy) => [ + q(6523), + q(0), + ], + q(tiz) => [ + q(6524), + q(0), + ], + q(tja) => [ + q(6525), + q(0), + ], + q(tjg) => [ + q(6526), + q(0), + ], + q(tji) => [ + q(6527), + q(0), + ], + q(tjl) => [ + q(6528), + q(0), + ], + q(tjm) => [ + q(6529), + q(0), + ], + q(tjn) => [ + q(6530), + q(0), + ], + q(tjo) => [ + q(6531), + q(0), + ], + q(tjs) => [ + q(6532), + q(0), + ], + q(tju) => [ + q(6533), + q(0), + ], + q(tjw) => [ + q(6534), + q(0), + ], + q(tka) => [ + q(6535), + q(0), + ], + q(tkb) => [ + q(6536), + q(0), + ], + q(tkd) => [ + q(6537), + q(0), + ], + q(tke) => [ + q(6538), + q(0), + ], + q(tkf) => [ + q(6539), + q(0), + ], + q(tkg) => [ + q(6540), + q(0), + ], + q(tkl) => [ + q(0432), + q(0), + ], + q(tkm) => [ + q(6541), + q(0), + ], + q(tkn) => [ + q(6542), + q(0), + ], + q(tkp) => [ + q(6543), + q(0), + ], + q(tkq) => [ + q(6544), + q(0), + ], + q(tkr) => [ + q(6545), + q(0), + ], + q(tks) => [ + q(6546), + q(0), + ], + q(tkt) => [ + q(6547), + q(0), + ], + q(tku) => [ + q(6548), + q(0), + ], + q(tkv) => [ + q(6549), + q(0), + ], + q(tkw) => [ + q(6550), + q(0), + ], + q(tkx) => [ + q(6551), + q(0), + ], + q(tkz) => [ + q(6552), + q(0), + ], + q(tla) => [ + q(6553), + q(0), + ], + q(tlb) => [ + q(6554), + q(0), + ], + q(tlc) => [ + q(6555), + q(0), + ], + q(tld) => [ + q(6556), + q(0), + ], + q(tlf) => [ + q(6557), + q(0), + ], + q(tlg) => [ + q(6558), + q(0), + ], + q(tlh) => [ + q(0433), + q(0), + ], + q(tli) => [ + q(0434), + q(0), + ], + q(tlj) => [ + q(6559), + q(0), + ], + q(tlk) => [ + q(6560), + q(0), + ], + q(tll) => [ + q(6561), + q(0), + ], + q(tlm) => [ + q(6562), + q(0), + ], + q(tln) => [ + q(6563), + q(0), + ], + q(tlo) => [ + q(6564), + q(0), + ], + q(tlp) => [ + q(6565), + q(0), + ], + q(tlq) => [ + q(6566), + q(0), + ], + q(tlr) => [ + q(6567), + q(0), + ], + q(tls) => [ + q(6568), + q(0), + ], + q(tlt) => [ + q(6569), + q(0), + ], + q(tlu) => [ + q(6570), + q(0), + ], + q(tlv) => [ + q(6571), + q(0), + ], + q(tlx) => [ + q(6572), + q(0), + ], + q(tly) => [ + q(6573), + q(0), + ], + q(tma) => [ + q(6574), + q(0), + ], + q(tmb) => [ + q(6575), + q(0), + ], + q(tmc) => [ + q(6576), + q(0), + ], + q(tmd) => [ + q(6577), + q(0), + ], + q(tme) => [ + q(6578), + q(0), + ], + q(tmf) => [ + q(6579), + q(0), + ], + q(tmg) => [ + q(6580), + q(0), + ], + q(tmh) => [ + q(0435), + q(0), + ], + q(tmi) => [ + q(6581), + q(0), + ], + q(tmj) => [ + q(6582), + q(0), + ], + q(tmk) => [ + q(6583), + q(0), + ], + q(tml) => [ + q(6584), + q(0), + ], + q(tmm) => [ + q(6585), + q(0), + ], + q(tmn) => [ + q(6586), + q(0), + ], + q(tmo) => [ + q(6587), + q(0), + ], + q(tmq) => [ + q(6588), + q(0), + ], + q(tmr) => [ + q(6589), + q(0), + ], + q(tms) => [ + q(6590), + q(0), + ], + q(tmt) => [ + q(6591), + q(0), + ], + q(tmu) => [ + q(6592), + q(0), + ], + q(tmv) => [ + q(6593), + q(0), + ], + q(tmw) => [ + q(6594), + q(0), + ], + q(tmy) => [ + q(6595), + q(0), + ], + q(tmz) => [ + q(6596), + q(0), + ], + q(tna) => [ + q(6597), + q(0), + ], + q(tnb) => [ + q(6598), + q(0), + ], + q(tnc) => [ + q(6599), + q(0), + ], + q(tnd) => [ + q(6600), + q(0), + ], + q(tng) => [ + q(6601), + q(0), + ], + q(tnh) => [ + q(6602), + q(0), + ], + q(tni) => [ + q(6603), + q(0), + ], + q(tnk) => [ + q(6604), + q(0), + ], + q(tnl) => [ + q(6605), + q(0), + ], + q(tnm) => [ + q(6606), + q(0), + ], + q(tnn) => [ + q(6607), + q(0), + ], + q(tno) => [ + q(6608), + q(0), + ], + q(tnp) => [ + q(6609), + q(0), + ], + q(tnq) => [ + q(6610), + q(0), + ], + q(tnr) => [ + q(6611), + q(0), + ], + q(tns) => [ + q(6612), + q(0), + ], + q(tnt) => [ + q(6613), + q(0), + ], + q(tnu) => [ + q(6614), + q(0), + ], + q(tnv) => [ + q(6615), + q(0), + ], + q(tnw) => [ + q(6616), + q(0), + ], + q(tnx) => [ + q(6617), + q(0), + ], + q(tny) => [ + q(6618), + q(0), + ], + q(tnz) => [ + q(6619), + q(0), + ], + q(tob) => [ + q(6620), + q(0), + ], + q(toc) => [ + q(6621), + q(0), + ], + q(tod) => [ + q(6622), + q(0), + ], + q(tof) => [ + q(6623), + q(0), + ], + q(tog) => [ + q(0436), + q(0), + ], + q(toh) => [ + q(6624), + q(0), + ], + q(toi) => [ + q(6625), + q(0), + ], + q(toj) => [ + q(6626), + q(0), + ], + q(tol) => [ + q(6627), + q(0), + ], + q(tom) => [ + q(6628), + q(0), + ], + q(ton) => [ + q(0437), + q(0), + ], + q(too) => [ + q(6629), + q(0), + ], + q(top) => [ + q(6630), + q(0), + ], + q(toq) => [ + q(6631), + q(0), + ], + q(tor) => [ + q(6632), + q(0), + ], + q(tos) => [ + q(6633), + q(0), + ], + q(tou) => [ + q(6634), + q(0), + ], + q(tov) => [ + q(6635), + q(0), + ], + q(tow) => [ + q(6636), + q(0), + ], + q(tox) => [ + q(6637), + q(0), + ], + q(toy) => [ + q(6638), + q(0), + ], + q(toz) => [ + q(6639), + q(0), + ], + q(tpa) => [ + q(6640), + q(0), + ], + q(tpc) => [ + q(6641), + q(0), + ], + q(tpe) => [ + q(6642), + q(0), + ], + q(tpf) => [ + q(6643), + q(0), + ], + q(tpg) => [ + q(6644), + q(0), + ], + q(tpi) => [ + q(0438), + q(0), + ], + q(tpj) => [ + q(6645), + q(0), + ], + q(tpk) => [ + q(6646), + q(0), + ], + q(tpl) => [ + q(6647), + q(0), + ], + q(tpm) => [ + q(6648), + q(0), + ], + q(tpn) => [ + q(6649), + q(0), + ], + q(tpo) => [ + q(6650), + q(0), + ], + q(tpp) => [ + q(6651), + q(0), + ], + q(tpq) => [ + q(6652), + q(0), + ], + q(tpr) => [ + q(6653), + q(0), + ], + q(tpt) => [ + q(6654), + q(0), + ], + q(tpu) => [ + q(6655), + q(0), + ], + q(tpv) => [ + q(6656), + q(0), + ], + q(tpw) => [ + q(6657), + q(0), + ], + q(tpx) => [ + q(6658), + q(0), + ], + q(tpy) => [ + q(6659), + q(0), + ], + q(tpz) => [ + q(6660), + q(0), + ], + q(tqb) => [ + q(6661), + q(0), + ], + q(tql) => [ + q(6662), + q(0), + ], + q(tqm) => [ + q(6663), + q(0), + ], + q(tqn) => [ + q(6664), + q(0), + ], + q(tqo) => [ + q(6665), + q(0), + ], + q(tqp) => [ + q(6666), + q(0), + ], + q(tqq) => [ + q(6667), + q(0), + ], + q(tqr) => [ + q(6668), + q(0), + ], + q(tqt) => [ + q(6669), + q(0), + ], + q(tqu) => [ + q(6670), + q(0), + ], + q(tqw) => [ + q(6671), + q(0), + ], + q(tra) => [ + q(6672), + q(0), + ], + q(trb) => [ + q(6673), + q(0), + ], + q(trc) => [ + q(6674), + q(0), + ], + q(trd) => [ + q(6675), + q(0), + ], + q(tre) => [ + q(6676), + q(0), + ], + q(trf) => [ + q(6677), + q(0), + ], + q(trg) => [ + q(6678), + q(0), + ], + q(trh) => [ + q(6679), + q(0), + ], + q(tri) => [ + q(6680), + q(0), + ], + q(trj) => [ + q(6681), + q(0), + ], + q(trk) => [ + q(0529), + q(0), + ], + q(trl) => [ + q(6682), + q(0), + ], + q(trm) => [ + q(6683), + q(0), + ], + q(trn) => [ + q(6684), + q(0), + ], + q(tro) => [ + q(6685), + q(0), + ], + q(trp) => [ + q(6686), + q(0), + ], + q(trq) => [ + q(6687), + q(0), + ], + q(trr) => [ + q(6688), + q(0), + ], + q(trs) => [ + q(6689), + q(0), + ], + q(trt) => [ + q(6690), + q(0), + ], + q(tru) => [ + q(6691), + q(0), + ], + q(trv) => [ + q(6692), + q(0), + ], + q(trw) => [ + q(6693), + q(0), + ], + q(trx) => [ + q(6694), + q(0), + ], + q(try) => [ + q(6695), + q(0), + ], + q(trz) => [ + q(6696), + q(0), + ], + q(tsa) => [ + q(6697), + q(0), + ], + q(tsb) => [ + q(6698), + q(0), + ], + q(tsc) => [ + q(6699), + q(0), + ], + q(tsd) => [ + q(6700), + q(0), + ], + q(tse) => [ + q(6701), + q(0), + ], + q(tsg) => [ + q(6702), + q(0), + ], + q(tsh) => [ + q(6703), + q(0), + ], + q(tsi) => [ + q(0439), + q(0), + ], + q(tsj) => [ + q(6704), + q(0), + ], + q(tsk) => [ + q(6705), + q(0), + ], + q(tsl) => [ + q(6706), + q(0), + ], + q(tsm) => [ + q(6707), + q(0), + ], + q(tsn) => [ + q(0440), + q(0), + ], + q(tso) => [ + q(0441), + q(0), + ], + q(tsp) => [ + q(6708), + q(0), + ], + q(tsq) => [ + q(6709), + q(0), + ], + q(tsr) => [ + q(6710), + q(0), + ], + q(tss) => [ + q(6711), + q(0), + ], + q(tst) => [ + q(6712), + q(0), + ], + q(tsu) => [ + q(6713), + q(0), + ], + q(tsv) => [ + q(6714), + q(0), + ], + q(tsw) => [ + q(6715), + q(0), + ], + q(tsx) => [ + q(6716), + q(0), + ], + q(tsy) => [ + q(6717), + q(0), + ], + q(tsz) => [ + q(6718), + q(0), + ], + q(tta) => [ + q(6719), + q(0), + ], + q(ttb) => [ + q(6720), + q(0), + ], + q(ttc) => [ + q(6721), + q(0), + ], + q(ttd) => [ + q(6722), + q(0), + ], + q(tte) => [ + q(6723), + q(0), + ], + q(ttf) => [ + q(6724), + q(0), + ], + q(ttg) => [ + q(6725), + q(0), + ], + q(tth) => [ + q(6726), + q(0), + ], + q(tti) => [ + q(6727), + q(0), + ], + q(ttj) => [ + q(6728), + q(0), + ], + q(ttk) => [ + q(6729), + q(0), + ], + q(ttl) => [ + q(6730), + q(0), + ], + q(ttm) => [ + q(6731), + q(0), + ], + q(ttn) => [ + q(6732), + q(0), + ], + q(tto) => [ + q(6733), + q(0), + ], + q(ttp) => [ + q(6734), + q(0), + ], + q(ttq) => [ + q(6735), + q(0), + ], + q(ttr) => [ + q(6736), + q(0), + ], + q(tts) => [ + q(6737), + q(0), + ], + q(ttt) => [ + q(6738), + q(0), + ], + q(ttu) => [ + q(6739), + q(0), + ], + q(ttv) => [ + q(6740), + q(0), + ], + q(ttw) => [ + q(6741), + q(0), + ], + q(tty) => [ + q(6742), + q(0), + ], + q(ttz) => [ + q(6743), + q(0), + ], + q(tua) => [ + q(6744), + q(0), + ], + q(tub) => [ + q(6745), + q(0), + ], + q(tuc) => [ + q(6746), + q(0), + ], + q(tud) => [ + q(6747), + q(0), + ], + q(tue) => [ + q(6748), + q(0), + ], + q(tuf) => [ + q(6749), + q(0), + ], + q(tug) => [ + q(6750), + q(0), + ], + q(tuh) => [ + q(6751), + q(0), + ], + q(tui) => [ + q(6752), + q(0), + ], + q(tuj) => [ + q(6753), + q(0), + ], + q(tuk) => [ + q(0442), + q(0), + ], + q(tul) => [ + q(6754), + q(0), + ], + q(tum) => [ + q(0443), + q(0), + ], + q(tun) => [ + q(6755), + q(0), + ], + q(tuo) => [ + q(6756), + q(0), + ], + q(tup) => [ + q(0444), + q(0), + ], + q(tuq) => [ + q(6757), + q(0), + ], + q(tur) => [ + q(0445), + q(0), + ], + q(tus) => [ + q(6758), + q(0), + ], + q(tut) => [ + q(0446), + q(0), + ], + q(tuu) => [ + q(6759), + q(0), + ], + q(tuv) => [ + q(6760), + q(0), + ], + q(tuw) => [ + q(0530), + q(0), + ], + q(tux) => [ + q(6761), + q(0), + ], + q(tuy) => [ + q(6762), + q(0), + ], + q(tuz) => [ + q(6763), + q(0), + ], + q(tva) => [ + q(6764), + q(0), + ], + q(tvd) => [ + q(6765), + q(0), + ], + q(tve) => [ + q(6766), + q(0), + ], + q(tvk) => [ + q(6767), + q(0), + ], + q(tvl) => [ + q(0447), + q(0), + ], + q(tvm) => [ + q(6768), + q(0), + ], + q(tvn) => [ + q(6769), + q(0), + ], + q(tvo) => [ + q(6770), + q(0), + ], + q(tvs) => [ + q(6771), + q(0), + ], + q(tvt) => [ + q(6772), + q(0), + ], + q(tvu) => [ + q(6773), + q(0), + ], + q(tvw) => [ + q(6774), + q(0), + ], + q(tvy) => [ + q(6775), + q(0), + ], + q(twa) => [ + q(6776), + q(0), + ], + q(twb) => [ + q(6777), + q(0), + ], + q(twc) => [ + q(6778), + q(0), + ], + q(twd) => [ + q(6779), + q(0), + ], + q(twe) => [ + q(6780), + q(0), + ], + q(twf) => [ + q(6781), + q(0), + ], + q(twg) => [ + q(6782), + q(0), + ], + q(twh) => [ + q(6783), + q(0), + ], + q(twi) => [ + q(0448), + q(0), + ], + q(twl) => [ + q(6784), + q(0), + ], + q(twm) => [ + q(6785), + q(0), + ], + q(twn) => [ + q(6786), + q(0), + ], + q(two) => [ + q(6787), + q(0), + ], + q(twp) => [ + q(6788), + q(0), + ], + q(twq) => [ + q(6789), + q(0), + ], + q(twr) => [ + q(6790), + q(0), + ], + q(twt) => [ + q(6791), + q(0), + ], + q(twu) => [ + q(6792), + q(0), + ], + q(tww) => [ + q(6793), + q(0), + ], + q(twx) => [ + q(6794), + q(0), + ], + q(twy) => [ + q(6795), + q(0), + ], + q(txa) => [ + q(6796), + q(0), + ], + q(txb) => [ + q(6797), + q(0), + ], + q(txc) => [ + q(6798), + q(0), + ], + q(txe) => [ + q(6799), + q(0), + ], + q(txg) => [ + q(6800), + q(0), + ], + q(txh) => [ + q(6801), + q(0), + ], + q(txi) => [ + q(6802), + q(0), + ], + q(txj) => [ + q(6803), + q(0), + ], + q(txm) => [ + q(6804), + q(0), + ], + q(txn) => [ + q(6805), + q(0), + ], + q(txo) => [ + q(6806), + q(0), + ], + q(txq) => [ + q(6807), + q(0), + ], + q(txr) => [ + q(6808), + q(0), + ], + q(txs) => [ + q(6809), + q(0), + ], + q(txt) => [ + q(6810), + q(0), + ], + q(txu) => [ + q(6811), + q(0), + ], + q(txx) => [ + q(6812), + q(0), + ], + q(txy) => [ + q(6813), + q(0), + ], + q(tya) => [ + q(6814), + q(0), + ], + q(tye) => [ + q(6815), + q(0), + ], + q(tyh) => [ + q(6816), + q(0), + ], + q(tyi) => [ + q(6817), + q(0), + ], + q(tyj) => [ + q(6818), + q(0), + ], + q(tyl) => [ + q(6819), + q(0), + ], + q(tyn) => [ + q(6820), + q(0), + ], + q(typ) => [ + q(6821), + q(0), + ], + q(tyr) => [ + q(6822), + q(0), + ], + q(tys) => [ + q(6823), + q(0), + ], + q(tyt) => [ + q(6824), + q(0), + ], + q(tyu) => [ + q(6825), + q(0), + ], + q(tyv) => [ + q(0449), + q(0), + ], + q(tyx) => [ + q(6826), + q(0), + ], + q(tyz) => [ + q(6827), + q(0), + ], + q(tza) => [ + q(6828), + q(0), + ], + q(tzh) => [ + q(6829), + q(0), + ], + q(tzj) => [ + q(6830), + q(0), + ], + q(tzl) => [ + q(6831), + q(0), + ], + q(tzm) => [ + q(6832), + q(0), + ], + q(tzn) => [ + q(6833), + q(0), + ], + q(tzo) => [ + q(6834), + q(0), + ], + q(tzx) => [ + q(6835), + q(0), + ], + q(uam) => [ + q(6836), + q(0), + ], + q(uan) => [ + q(6837), + q(0), + ], + q(uar) => [ + q(6838), + q(0), + ], + q(uba) => [ + q(6839), + q(0), + ], + q(ubi) => [ + q(6840), + q(0), + ], + q(ubl) => [ + q(6841), + q(0), + ], + q(ubr) => [ + q(6842), + q(0), + ], + q(ubu) => [ + q(6843), + q(0), + ], + q(uby) => [ + q(6844), + q(0), + ], + q(uda) => [ + q(6845), + q(0), + ], + q(ude) => [ + q(6846), + q(0), + ], + q(udg) => [ + q(6847), + q(0), + ], + q(udi) => [ + q(6848), + q(0), + ], + q(udj) => [ + q(6849), + q(0), + ], + q(udl) => [ + q(6850), + q(0), + ], + q(udm) => [ + q(0450), + q(0), + ], + q(udu) => [ + q(6851), + q(0), + ], + q(ues) => [ + q(6852), + q(0), + ], + q(ufi) => [ + q(6853), + q(0), + ], + q(uga) => [ + q(0451), + q(0), + ], + q(ugb) => [ + q(6854), + q(0), + ], + q(uge) => [ + q(6855), + q(0), + ], + q(ugn) => [ + q(6856), + q(0), + ], + q(ugo) => [ + q(6857), + q(0), + ], + q(ugy) => [ + q(6858), + q(0), + ], + q(uha) => [ + q(6859), + q(0), + ], + q(uhn) => [ + q(6860), + q(0), + ], + q(uig) => [ + q(0452), + q(0), + ], + q(uis) => [ + q(6861), + q(0), + ], + q(uiv) => [ + q(6862), + q(0), + ], + q(uji) => [ + q(6863), + q(0), + ], + q(uka) => [ + q(6864), + q(0), + ], + q(ukg) => [ + q(6865), + q(0), + ], + q(ukh) => [ + q(6866), + q(0), + ], + q(ukk) => [ + q(6867), + q(0), + ], + q(ukl) => [ + q(6868), + q(0), + ], + q(ukp) => [ + q(6869), + q(0), + ], + q(ukq) => [ + q(6870), + q(0), + ], + q(ukr) => [ + q(0453), + q(0), + ], + q(uks) => [ + q(6871), + q(0), + ], + q(uku) => [ + q(6872), + q(0), + ], + q(ukw) => [ + q(6873), + q(0), + ], + q(uky) => [ + q(6874), + q(0), + ], + q(ula) => [ + q(6875), + q(0), + ], + q(ulb) => [ + q(6876), + q(0), + ], + q(ulc) => [ + q(6877), + q(0), + ], + q(ule) => [ + q(6878), + q(0), + ], + q(ulf) => [ + q(6879), + q(0), + ], + q(uli) => [ + q(6880), + q(0), + ], + q(ulk) => [ + q(6881), + q(0), + ], + q(ull) => [ + q(6882), + q(0), + ], + q(ulm) => [ + q(6883), + q(0), + ], + q(uln) => [ + q(6884), + q(0), + ], + q(ulu) => [ + q(6885), + q(0), + ], + q(ulw) => [ + q(6886), + q(0), + ], + q(uma) => [ + q(6887), + q(0), + ], + q(umb) => [ + q(0454), + q(0), + ], + q(umc) => [ + q(6888), + q(0), + ], + q(umd) => [ + q(6889), + q(0), + ], + q(umg) => [ + q(6890), + q(0), + ], + q(umi) => [ + q(6891), + q(0), + ], + q(umm) => [ + q(6892), + q(0), + ], + q(umn) => [ + q(6893), + q(0), + ], + q(umo) => [ + q(6894), + q(0), + ], + q(ump) => [ + q(6895), + q(0), + ], + q(umr) => [ + q(6896), + q(0), + ], + q(ums) => [ + q(6897), + q(0), + ], + q(umu) => [ + q(6898), + q(0), + ], + q(una) => [ + q(6899), + q(0), + ], + q(und) => [ + q(0455), + q(0), + ], + q(une) => [ + q(6900), + q(0), + ], + q(ung) => [ + q(6901), + q(0), + ], + q(unk) => [ + q(6902), + q(0), + ], + q(unm) => [ + q(6903), + q(0), + ], + q(unn) => [ + q(6904), + q(0), + ], + q(unr) => [ + q(6905), + q(0), + ], + q(unu) => [ + q(6906), + q(0), + ], + q(unx) => [ + q(6907), + q(0), + ], + q(unz) => [ + q(6908), + q(0), + ], + q(upi) => [ + q(6909), + q(0), + ], + q(upv) => [ + q(6910), + q(0), + ], + q(ura) => [ + q(6911), + q(0), + ], + q(urb) => [ + q(6912), + q(0), + ], + q(urc) => [ + q(6913), + q(0), + ], + q(urd) => [ + q(0456), + q(0), + ], + q(ure) => [ + q(6914), + q(0), + ], + q(urf) => [ + q(6915), + q(0), + ], + q(urg) => [ + q(6916), + q(0), + ], + q(urh) => [ + q(6917), + q(0), + ], + q(uri) => [ + q(6918), + q(0), + ], + q(urj) => [ + q(0531), + q(0), + ], + q(urk) => [ + q(6919), + q(0), + ], + q(url) => [ + q(6920), + q(0), + ], + q(urm) => [ + q(6921), + q(0), + ], + q(urn) => [ + q(6922), + q(0), + ], + q(uro) => [ + q(6923), + q(0), + ], + q(urp) => [ + q(6924), + q(0), + ], + q(urr) => [ + q(6925), + q(0), + ], + q(urt) => [ + q(6926), + q(0), + ], + q(uru) => [ + q(6927), + q(0), + ], + q(urv) => [ + q(6928), + q(0), + ], + q(urw) => [ + q(6929), + q(0), + ], + q(urx) => [ + q(6930), + q(0), + ], + q(ury) => [ + q(6931), + q(0), + ], + q(urz) => [ + q(6932), + q(0), + ], + q(usa) => [ + q(6933), + q(0), + ], + q(ush) => [ + q(6934), + q(0), + ], + q(usi) => [ + q(6935), + q(0), + ], + q(usk) => [ + q(6936), + q(0), + ], + q(usp) => [ + q(6937), + q(0), + ], + q(usu) => [ + q(6938), + q(0), + ], + q(uta) => [ + q(6939), + q(0), + ], + q(ute) => [ + q(6940), + q(0), + ], + q(utp) => [ + q(6941), + q(0), + ], + q(utr) => [ + q(6942), + q(0), + ], + q(utu) => [ + q(6943), + q(0), + ], + q(uum) => [ + q(6944), + q(0), + ], + q(uun) => [ + q(6945), + q(0), + ], + q(uur) => [ + q(6946), + q(0), + ], + q(uuu) => [ + q(6947), + q(0), + ], + q(uve) => [ + q(6948), + q(0), + ], + q(uvh) => [ + q(6949), + q(0), + ], + q(uvl) => [ + q(6950), + q(0), + ], + q(uwa) => [ + q(6951), + q(0), + ], + q(uya) => [ + q(6952), + q(0), + ], + q(uzb) => [ + q(0457), + q(0), + ], + q(uzn) => [ + q(6953), + q(0), + ], + q(uzs) => [ + q(6954), + q(0), + ], + q(vaa) => [ + q(6955), + q(0), + ], + q(vae) => [ + q(6956), + q(0), + ], + q(vaf) => [ + q(6957), + q(0), + ], + q(vag) => [ + q(6958), + q(0), + ], + q(vah) => [ + q(6959), + q(0), + ], + q(vai) => [ + q(0458), + q(0), + ], + q(vaj) => [ + q(6960), + q(0), + ], + q(val) => [ + q(6961), + q(0), + ], + q(vam) => [ + q(6962), + q(0), + ], + q(van) => [ + q(6963), + q(0), + ], + q(vao) => [ + q(6964), + q(0), + ], + q(vap) => [ + q(6965), + q(0), + ], + q(var) => [ + q(6966), + q(0), + ], + q(vas) => [ + q(6967), + q(0), + ], + q(vau) => [ + q(6968), + q(0), + ], + q(vav) => [ + q(6969), + q(0), + ], + q(vay) => [ + q(6970), + q(0), + ], + q(vbb) => [ + q(6971), + q(0), + ], + q(vbk) => [ + q(6972), + q(0), + ], + q(vec) => [ + q(6973), + q(0), + ], + q(ved) => [ + q(6974), + q(0), + ], + q(vel) => [ + q(6975), + q(0), + ], + q(vem) => [ + q(6976), + q(0), + ], + q(ven) => [ + q(0459), + q(0), + ], + q(veo) => [ + q(6977), + q(0), + ], + q(vep) => [ + q(6978), + q(0), + ], + q(ver) => [ + q(6979), + q(0), + ], + q(vgr) => [ + q(6980), + q(0), + ], + q(vgt) => [ + q(6981), + q(0), + ], + q(vic) => [ + q(6982), + q(0), + ], + q(vid) => [ + q(6983), + q(0), + ], + q(vie) => [ + q(0460), + q(0), + ], + q(vif) => [ + q(6984), + q(0), + ], + q(vig) => [ + q(6985), + q(0), + ], + q(vil) => [ + q(6986), + q(0), + ], + q(vin) => [ + q(6987), + q(0), + ], + q(vis) => [ + q(6988), + q(0), + ], + q(vit) => [ + q(6989), + q(0), + ], + q(viv) => [ + q(6990), + q(0), + ], + q(vka) => [ + q(6991), + q(0), + ], + q(vki) => [ + q(6992), + q(0), + ], + q(vkj) => [ + q(6993), + q(0), + ], + q(vkk) => [ + q(6994), + q(0), + ], + q(vkl) => [ + q(6995), + q(0), + ], + q(vkm) => [ + q(6996), + q(0), + ], + q(vko) => [ + q(6997), + q(0), + ], + q(vkp) => [ + q(6998), + q(0), + ], + q(vkt) => [ + q(6999), + q(0), + ], + q(vku) => [ + q(7000), + q(0), + ], + q(vlp) => [ + q(7001), + q(0), + ], + q(vls) => [ + q(7002), + q(0), + ], + q(vma) => [ + q(7003), + q(0), + ], + q(vmb) => [ + q(7004), + q(0), + ], + q(vmc) => [ + q(7005), + q(0), + ], + q(vmd) => [ + q(7006), + q(0), + ], + q(vme) => [ + q(7007), + q(0), + ], + q(vmf) => [ + q(7008), + q(0), + ], + q(vmg) => [ + q(7009), + q(0), + ], + q(vmh) => [ + q(7010), + q(0), + ], + q(vmi) => [ + q(7011), + q(0), + ], + q(vmj) => [ + q(7012), + q(0), + ], + q(vmk) => [ + q(7013), + q(0), + ], + q(vml) => [ + q(7014), + q(0), + ], + q(vmm) => [ + q(7015), + q(0), + ], + q(vmp) => [ + q(7016), + q(0), + ], + q(vmq) => [ + q(7017), + q(0), + ], + q(vmr) => [ + q(7018), + q(0), + ], + q(vms) => [ + q(7019), + q(0), + ], + q(vmu) => [ + q(7020), + q(0), + ], + q(vmv) => [ + q(7021), + q(0), + ], + q(vmw) => [ + q(7022), + q(0), + ], + q(vmx) => [ + q(7023), + q(0), + ], + q(vmy) => [ + q(7024), + q(0), + ], + q(vmz) => [ + q(7025), + q(0), + ], + q(vnk) => [ + q(7026), + q(0), + ], + q(vnm) => [ + q(7027), + q(0), + ], + q(vnp) => [ + q(7028), + q(0), + ], + q(vol) => [ + q(0461), + q(0), + ], + q(vor) => [ + q(7029), + q(0), + ], + q(vot) => [ + q(0462), + q(0), + ], + q(vra) => [ + q(7030), + q(0), + ], + q(vro) => [ + q(7029), + q(0), + ], + q(vrs) => [ + q(7031), + q(0), + ], + q(vrt) => [ + q(7032), + q(0), + ], + q(vsi) => [ + q(7033), + q(0), + ], + q(vsl) => [ + q(7034), + q(0), + ], + q(vsv) => [ + q(7035), + q(0), + ], + q(vto) => [ + q(7036), + q(0), + ], + q(vum) => [ + q(7037), + q(0), + ], + q(vun) => [ + q(7038), + q(0), + ], + q(vut) => [ + q(7039), + q(0), + ], + q(vwa) => [ + q(7040), + q(0), + ], + q(waa) => [ + q(7041), + q(0), + ], + q(wab) => [ + q(7042), + q(0), + ], + q(wac) => [ + q(7043), + q(0), + ], + q(wad) => [ + q(7044), + q(0), + ], + q(wae) => [ + q(7045), + q(0), + ], + q(waf) => [ + q(7046), + q(0), + ], + q(wag) => [ + q(7047), + q(0), + ], + q(wah) => [ + q(7048), + q(0), + ], + q(wai) => [ + q(7049), + q(0), + ], + q(waj) => [ + q(7050), + q(0), + ], + q(wak) => [ + q(0463), + q(0), + ], + q(wal) => [ + q(0464), + q(1), + ], + q(wam) => [ + q(7051), + q(0), + ], + q(wan) => [ + q(7052), + q(0), + ], + q(wao) => [ + q(7053), + q(0), + ], + q(wap) => [ + q(7054), + q(0), + ], + q(waq) => [ + q(7055), + q(0), + ], + q(war) => [ + q(0465), + q(1), + ], + q(was) => [ + q(0466), + q(0), + ], + q(wat) => [ + q(7056), + q(0), + ], + q(wau) => [ + q(7057), + q(0), + ], + q(wav) => [ + q(7058), + q(0), + ], + q(waw) => [ + q(7059), + q(0), + ], + q(wax) => [ + q(7060), + q(0), + ], + q(way) => [ + q(7061), + q(0), + ], + q(waz) => [ + q(7062), + q(0), + ], + q(wba) => [ + q(7063), + q(0), + ], + q(wbb) => [ + q(7064), + q(0), + ], + q(wbe) => [ + q(7065), + q(0), + ], + q(wbf) => [ + q(6402), + q(0), + ], + q(wbh) => [ + q(7066), + q(0), + ], + q(wbi) => [ + q(7067), + q(0), + ], + q(wbj) => [ + q(7068), + q(0), + ], + q(wbk) => [ + q(7069), + q(0), + ], + q(wbl) => [ + q(7070), + q(0), + ], + q(wbm) => [ + q(7071), + q(0), + ], + q(wbp) => [ + q(7072), + q(0), + ], + q(wbq) => [ + q(7073), + q(0), + ], + q(wbr) => [ + q(7074), + q(0), + ], + q(wbs) => [ + q(7075), + q(0), + ], + q(wbt) => [ + q(7076), + q(0), + ], + q(wbv) => [ + q(7077), + q(0), + ], + q(wbw) => [ + q(7078), + q(0), + ], + q(wca) => [ + q(7079), + q(0), + ], + q(wci) => [ + q(7080), + q(0), + ], + q(wdd) => [ + q(7081), + q(0), + ], + q(wdg) => [ + q(7082), + q(0), + ], + q(wdj) => [ + q(7083), + q(0), + ], + q(wdk) => [ + q(7084), + q(0), + ], + q(wdu) => [ + q(7085), + q(0), + ], + q(wdy) => [ + q(7086), + q(0), + ], + q(wea) => [ + q(7087), + q(0), + ], + q(wec) => [ + q(7088), + q(0), + ], + q(wed) => [ + q(7089), + q(0), + ], + q(weg) => [ + q(7090), + q(0), + ], + q(weh) => [ + q(7091), + q(0), + ], + q(wei) => [ + q(7092), + q(0), + ], + q(wel) => [ + q(0467), + q(0), + ], + q(wem) => [ + q(7093), + q(0), + ], + q(wen) => [ + q(0468), + q(0), + ], + q(weo) => [ + q(7094), + q(0), + ], + q(wep) => [ + q(7095), + q(0), + ], + q(wer) => [ + q(7096), + q(0), + ], + q(wes) => [ + q(7097), + q(0), + ], + q(wet) => [ + q(7098), + q(0), + ], + q(weu) => [ + q(7099), + q(0), + ], + q(wew) => [ + q(7100), + q(0), + ], + q(wfg) => [ + q(7101), + q(0), + ], + q(wga) => [ + q(7102), + q(0), + ], + q(wgb) => [ + q(7103), + q(0), + ], + q(wgg) => [ + q(7104), + q(0), + ], + q(wgi) => [ + q(7105), + q(0), + ], + q(wgo) => [ + q(7106), + q(0), + ], + q(wgu) => [ + q(7107), + q(0), + ], + q(wgy) => [ + q(7108), + q(0), + ], + q(wha) => [ + q(7109), + q(0), + ], + q(whg) => [ + q(7110), + q(0), + ], + q(whk) => [ + q(7111), + q(0), + ], + q(whu) => [ + q(7112), + q(0), + ], + q(wib) => [ + q(7113), + q(0), + ], + q(wic) => [ + q(7114), + q(0), + ], + q(wie) => [ + q(7115), + q(0), + ], + q(wif) => [ + q(7116), + q(0), + ], + q(wig) => [ + q(7117), + q(0), + ], + q(wih) => [ + q(7118), + q(0), + ], + q(wii) => [ + q(7119), + q(0), + ], + q(wij) => [ + q(7120), + q(0), + ], + q(wik) => [ + q(7121), + q(0), + ], + q(wil) => [ + q(7122), + q(0), + ], + q(wim) => [ + q(7123), + q(0), + ], + q(win) => [ + q(7124), + q(0), + ], + q(wir) => [ + q(7125), + q(0), + ], + q(wiu) => [ + q(7126), + q(0), + ], + q(wiv) => [ + q(7127), + q(0), + ], + q(wiy) => [ + q(7128), + q(0), + ], + q(wja) => [ + q(7129), + q(0), + ], + q(wji) => [ + q(7130), + q(0), + ], + q(wka) => [ + q(7131), + q(0), + ], + q(wkb) => [ + q(7132), + q(0), + ], + q(wkd) => [ + q(7133), + q(0), + ], + q(wkl) => [ + q(7134), + q(0), + ], + q(wku) => [ + q(7135), + q(0), + ], + q(wkw) => [ + q(7136), + q(0), + ], + q(wky) => [ + q(7137), + q(0), + ], + q(wla) => [ + q(7138), + q(0), + ], + q(wlc) => [ + q(7139), + q(0), + ], + q(wle) => [ + q(7140), + q(0), + ], + q(wlg) => [ + q(7141), + q(0), + ], + q(wli) => [ + q(7142), + q(0), + ], + q(wlk) => [ + q(7143), + q(0), + ], + q(wll) => [ + q(7144), + q(0), + ], + q(wlm) => [ + q(7145), + q(0), + ], + q(wln) => [ + q(0469), + q(0), + ], + q(wlo) => [ + q(7146), + q(0), + ], + q(wlr) => [ + q(7147), + q(0), + ], + q(wls) => [ + q(7148), + q(0), + ], + q(wlu) => [ + q(7149), + q(0), + ], + q(wlv) => [ + q(7150), + q(0), + ], + q(wlw) => [ + q(7151), + q(0), + ], + q(wlx) => [ + q(7152), + q(0), + ], + q(wly) => [ + q(7153), + q(0), + ], + q(wma) => [ + q(7154), + q(0), + ], + q(wmb) => [ + q(7155), + q(0), + ], + q(wmc) => [ + q(7156), + q(0), + ], + q(wmd) => [ + q(7157), + q(0), + ], + q(wme) => [ + q(7158), + q(0), + ], + q(wmh) => [ + q(7159), + q(0), + ], + q(wmi) => [ + q(7160), + q(0), + ], + q(wmm) => [ + q(7161), + q(0), + ], + q(wmn) => [ + q(7162), + q(0), + ], + q(wmo) => [ + q(7163), + q(0), + ], + q(wms) => [ + q(7164), + q(0), + ], + q(wmt) => [ + q(7165), + q(0), + ], + q(wmw) => [ + q(7166), + q(0), + ], + q(wmx) => [ + q(7167), + q(0), + ], + q(wnb) => [ + q(7168), + q(0), + ], + q(wnc) => [ + q(7169), + q(0), + ], + q(wnd) => [ + q(7170), + q(0), + ], + q(wne) => [ + q(7171), + q(0), + ], + q(wng) => [ + q(7172), + q(0), + ], + q(wni) => [ + q(7173), + q(0), + ], + q(wnk) => [ + q(7174), + q(0), + ], + q(wnm) => [ + q(7175), + q(0), + ], + q(wnn) => [ + q(7176), + q(0), + ], + q(wno) => [ + q(7177), + q(0), + ], + q(wnp) => [ + q(7178), + q(0), + ], + q(wnu) => [ + q(7179), + q(0), + ], + q(wnw) => [ + q(7180), + q(0), + ], + q(wny) => [ + q(7181), + q(0), + ], + q(woa) => [ + q(7182), + q(0), + ], + q(wob) => [ + q(7183), + q(0), + ], + q(woc) => [ + q(7184), + q(0), + ], + q(wod) => [ + q(7185), + q(0), + ], + q(woe) => [ + q(7186), + q(0), + ], + q(wof) => [ + q(7187), + q(0), + ], + q(wog) => [ + q(7188), + q(0), + ], + q(woi) => [ + q(7189), + q(0), + ], + q(wok) => [ + q(7190), + q(0), + ], + q(wol) => [ + q(0470), + q(0), + ], + q(wom) => [ + q(7191), + q(0), + ], + q(won) => [ + q(7192), + q(0), + ], + q(woo) => [ + q(7193), + q(0), + ], + q(wor) => [ + q(7194), + q(0), + ], + q(wos) => [ + q(7195), + q(0), + ], + q(wow) => [ + q(7196), + q(0), + ], + q(woy) => [ + q(7197), + q(0), + ], + q(wpc) => [ + q(7198), + q(0), + ], + q(wra) => [ + q(7199), + q(0), + ], + q(wrb) => [ + q(7200), + q(0), + ], + q(wrd) => [ + q(7201), + q(0), + ], + q(wrg) => [ + q(7202), + q(0), + ], + q(wrh) => [ + q(7203), + q(0), + ], + q(wri) => [ + q(7204), + q(0), + ], + q(wrk) => [ + q(7205), + q(0), + ], + q(wrl) => [ + q(7206), + q(0), + ], + q(wrm) => [ + q(7207), + q(0), + ], + q(wrn) => [ + q(7208), + q(0), + ], + q(wro) => [ + q(7209), + q(0), + ], + q(wrp) => [ + q(7210), + q(0), + ], + q(wrr) => [ + q(7211), + q(0), + ], + q(wrs) => [ + q(7212), + q(0), + ], + q(wru) => [ + q(7213), + q(0), + ], + q(wrv) => [ + q(7214), + q(0), + ], + q(wrw) => [ + q(7215), + q(0), + ], + q(wrx) => [ + q(7216), + q(0), + ], + q(wry) => [ + q(7217), + q(0), + ], + q(wrz) => [ + q(7218), + q(0), + ], + q(wsa) => [ + q(7219), + q(0), + ], + q(wsg) => [ + q(7220), + q(0), + ], + q(wsi) => [ + q(7221), + q(0), + ], + q(wsk) => [ + q(7222), + q(0), + ], + q(wsr) => [ + q(7223), + q(0), + ], + q(wss) => [ + q(7224), + q(0), + ], + q(wsu) => [ + q(7225), + q(0), + ], + q(wsv) => [ + q(7226), + q(0), + ], + q(wtf) => [ + q(7227), + q(0), + ], + q(wth) => [ + q(7228), + q(0), + ], + q(wti) => [ + q(7229), + q(0), + ], + q(wtk) => [ + q(7230), + q(0), + ], + q(wtm) => [ + q(7231), + q(0), + ], + q(wtw) => [ + q(7232), + q(0), + ], + q(wua) => [ + q(7233), + q(0), + ], + q(wub) => [ + q(7234), + q(0), + ], + q(wud) => [ + q(7235), + q(0), + ], + q(wuh) => [ + q(7236), + q(0), + ], + q(wul) => [ + q(7237), + q(0), + ], + q(wum) => [ + q(7238), + q(0), + ], + q(wun) => [ + q(7239), + q(0), + ], + q(wur) => [ + q(7240), + q(0), + ], + q(wut) => [ + q(7241), + q(0), + ], + q(wuu) => [ + q(7242), + q(0), + ], + q(wuv) => [ + q(7243), + q(0), + ], + q(wux) => [ + q(7244), + q(0), + ], + q(wuy) => [ + q(7245), + q(0), + ], + q(wwa) => [ + q(7246), + q(0), + ], + q(wwb) => [ + q(7247), + q(0), + ], + q(wwo) => [ + q(7248), + q(0), + ], + q(wwr) => [ + q(7249), + q(0), + ], + q(www) => [ + q(7250), + q(0), + ], + q(wxa) => [ + q(7251), + q(0), + ], + q(wxw) => [ + q(7252), + q(0), + ], + q(wya) => [ + q(7253), + q(0), + ], + q(wyb) => [ + q(7254), + q(0), + ], + q(wyi) => [ + q(7255), + q(0), + ], + q(wym) => [ + q(7256), + q(0), + ], + q(wyr) => [ + q(7257), + q(0), + ], + q(wyy) => [ + q(7258), + q(0), + ], + q(xaa) => [ + q(7259), + q(0), + ], + q(xab) => [ + q(7260), + q(0), + ], + q(xac) => [ + q(7261), + q(0), + ], + q(xad) => [ + q(7262), + q(0), + ], + q(xae) => [ + q(7263), + q(0), + ], + q(xag) => [ + q(7264), + q(0), + ], + q(xai) => [ + q(7265), + q(0), + ], + q(xaj) => [ + q(7266), + q(0), + ], + q(xak) => [ + q(7267), + q(0), + ], + q(xal) => [ + q(0471), + q(0), + ], + q(xam) => [ + q(7268), + q(0), + ], + q(xan) => [ + q(7269), + q(0), + ], + q(xao) => [ + q(7270), + q(0), + ], + q(xap) => [ + q(7271), + q(0), + ], + q(xaq) => [ + q(7272), + q(0), + ], + q(xar) => [ + q(7273), + q(0), + ], + q(xas) => [ + q(7274), + q(0), + ], + q(xat) => [ + q(7275), + q(0), + ], + q(xau) => [ + q(7276), + q(0), + ], + q(xav) => [ + q(7277), + q(0), + ], + q(xaw) => [ + q(7278), + q(0), + ], + q(xay) => [ + q(7279), + q(0), + ], + q(xbb) => [ + q(7280), + q(0), + ], + q(xbc) => [ + q(7281), + q(0), + ], + q(xbd) => [ + q(7282), + q(0), + ], + q(xbe) => [ + q(7283), + q(0), + ], + q(xbg) => [ + q(7284), + q(0), + ], + q(xbi) => [ + q(7285), + q(0), + ], + q(xbj) => [ + q(7286), + q(0), + ], + q(xbm) => [ + q(7287), + q(0), + ], + q(xbn) => [ + q(7288), + q(0), + ], + q(xbo) => [ + q(7289), + q(0), + ], + q(xbp) => [ + q(7290), + q(0), + ], + q(xbr) => [ + q(7291), + q(0), + ], + q(xbw) => [ + q(7292), + q(0), + ], + q(xby) => [ + q(7293), + q(0), + ], + q(xcb) => [ + q(7294), + q(0), + ], + q(xcc) => [ + q(7295), + q(0), + ], + q(xce) => [ + q(7296), + q(0), + ], + q(xcg) => [ + q(7297), + q(0), + ], + q(xch) => [ + q(7298), + q(0), + ], + q(xcl) => [ + q(7299), + q(0), + ], + q(xcm) => [ + q(7300), + q(0), + ], + q(xcn) => [ + q(7301), + q(0), + ], + q(xco) => [ + q(7302), + q(0), + ], + q(xcr) => [ + q(7303), + q(0), + ], + q(xct) => [ + q(7304), + q(0), + ], + q(xcu) => [ + q(7305), + q(0), + ], + q(xcv) => [ + q(7306), + q(0), + ], + q(xcw) => [ + q(7307), + q(0), + ], + q(xcy) => [ + q(7308), + q(0), + ], + q(xda) => [ + q(7309), + q(0), + ], + q(xdc) => [ + q(7310), + q(0), + ], + q(xdk) => [ + q(7311), + q(0), + ], + q(xdm) => [ + q(7312), + q(0), + ], + q(xdo) => [ + q(7313), + q(0), + ], + q(xdy) => [ + q(7314), + q(0), + ], + q(xeb) => [ + q(7315), + q(0), + ], + q(xed) => [ + q(7316), + q(0), + ], + q(xeg) => [ + q(7317), + q(0), + ], + q(xel) => [ + q(7318), + q(0), + ], + q(xem) => [ + q(7319), + q(0), + ], + q(xep) => [ + q(7320), + q(0), + ], + q(xer) => [ + q(7321), + q(0), + ], + q(xes) => [ + q(7322), + q(0), + ], + q(xet) => [ + q(7323), + q(0), + ], + q(xeu) => [ + q(7324), + q(0), + ], + q(xfa) => [ + q(7325), + q(0), + ], + q(xga) => [ + q(7326), + q(0), + ], + q(xgb) => [ + q(7327), + q(0), + ], + q(xgd) => [ + q(7328), + q(0), + ], + q(xgf) => [ + q(7329), + q(0), + ], + q(xgg) => [ + q(7330), + q(0), + ], + q(xgi) => [ + q(7331), + q(0), + ], + q(xgl) => [ + q(7332), + q(0), + ], + q(xgm) => [ + q(7333), + q(0), + ], + q(xgn) => [ + q(0532), + q(0), + ], + q(xgr) => [ + q(7334), + q(0), + ], + q(xgu) => [ + q(7335), + q(0), + ], + q(xgw) => [ + q(7336), + q(0), + ], + q(xha) => [ + q(7337), + q(0), + ], + q(xhc) => [ + q(7338), + q(0), + ], + q(xhd) => [ + q(7339), + q(0), + ], + q(xhe) => [ + q(7340), + q(0), + ], + q(xho) => [ + q(0472), + q(0), + ], + q(xhr) => [ + q(7341), + q(0), + ], + q(xht) => [ + q(7342), + q(0), + ], + q(xhu) => [ + q(7343), + q(0), + ], + q(xhv) => [ + q(7344), + q(0), + ], + q(xib) => [ + q(7345), + q(0), + ], + q(xii) => [ + q(7346), + q(0), + ], + q(xil) => [ + q(7347), + q(0), + ], + q(xin) => [ + q(7348), + q(0), + ], + q(xir) => [ + q(7349), + q(0), + ], + q(xis) => [ + q(7350), + q(0), + ], + q(xiv) => [ + q(7351), + q(0), + ], + q(xiy) => [ + q(7352), + q(0), + ], + q(xjb) => [ + q(7353), + q(0), + ], + q(xjt) => [ + q(7354), + q(0), + ], + q(xka) => [ + q(7355), + q(0), + ], + q(xkb) => [ + q(7356), + q(0), + ], + q(xkc) => [ + q(7357), + q(0), + ], + q(xkd) => [ + q(7358), + q(0), + ], + q(xke) => [ + q(7359), + q(0), + ], + q(xkf) => [ + q(7360), + q(0), + ], + q(xkg) => [ + q(7361), + q(0), + ], + q(xki) => [ + q(7362), + q(0), + ], + q(xkj) => [ + q(7363), + q(0), + ], + q(xkk) => [ + q(7364), + q(0), + ], + q(xkl) => [ + q(7365), + q(0), + ], + q(xkn) => [ + q(7366), + q(0), + ], + q(xko) => [ + q(7367), + q(0), + ], + q(xkp) => [ + q(7368), + q(0), + ], + q(xkq) => [ + q(7369), + q(0), + ], + q(xkr) => [ + q(7370), + q(0), + ], + q(xks) => [ + q(7371), + q(0), + ], + q(xkt) => [ + q(7372), + q(0), + ], + q(xku) => [ + q(7373), + q(0), + ], + q(xkv) => [ + q(7374), + q(0), + ], + q(xkw) => [ + q(7375), + q(0), + ], + q(xkx) => [ + q(7376), + q(0), + ], + q(xky) => [ + q(7377), + q(0), + ], + q(xkz) => [ + q(7378), + q(0), + ], + q(xla) => [ + q(7379), + q(0), + ], + q(xlb) => [ + q(7380), + q(0), + ], + q(xlc) => [ + q(7381), + q(0), + ], + q(xld) => [ + q(7382), + q(0), + ], + q(xle) => [ + q(7383), + q(0), + ], + q(xlg) => [ + q(7384), + q(0), + ], + q(xli) => [ + q(7385), + q(0), + ], + q(xln) => [ + q(7386), + q(0), + ], + q(xlo) => [ + q(7387), + q(0), + ], + q(xlp) => [ + q(7388), + q(0), + ], + q(xls) => [ + q(7389), + q(0), + ], + q(xlu) => [ + q(7390), + q(0), + ], + q(xly) => [ + q(7391), + q(0), + ], + q(xma) => [ + q(7392), + q(0), + ], + q(xmb) => [ + q(7393), + q(0), + ], + q(xmc) => [ + q(7394), + q(0), + ], + q(xmd) => [ + q(7395), + q(0), + ], + q(xme) => [ + q(7396), + q(0), + ], + q(xmf) => [ + q(7397), + q(0), + ], + q(xmg) => [ + q(7398), + q(0), + ], + q(xmh) => [ + q(7399), + q(0), + ], + q(xmj) => [ + q(7400), + q(0), + ], + q(xmk) => [ + q(7401), + q(0), + ], + q(xml) => [ + q(7402), + q(0), + ], + q(xmm) => [ + q(7403), + q(0), + ], + q(xmn) => [ + q(7404), + q(0), + ], + q(xmo) => [ + q(7405), + q(0), + ], + q(xmp) => [ + q(7406), + q(0), + ], + q(xmq) => [ + q(7407), + q(0), + ], + q(xmr) => [ + q(7408), + q(0), + ], + q(xms) => [ + q(7409), + q(0), + ], + q(xmt) => [ + q(7410), + q(0), + ], + q(xmu) => [ + q(7411), + q(0), + ], + q(xmv) => [ + q(7412), + q(0), + ], + q(xmw) => [ + q(7413), + q(0), + ], + q(xmx) => [ + q(7414), + q(0), + ], + q(xmy) => [ + q(7415), + q(0), + ], + q(xmz) => [ + q(7416), + q(0), + ], + q(xna) => [ + q(7417), + q(0), + ], + q(xnb) => [ + q(7418), + q(0), + ], + q(xnd) => [ + q(0533), + q(0), + ], + q(xng) => [ + q(7419), + q(0), + ], + q(xnh) => [ + q(7420), + q(0), + ], + q(xni) => [ + q(7421), + q(0), + ], + q(xnk) => [ + q(7422), + q(0), + ], + q(xnn) => [ + q(7423), + q(0), + ], + q(xno) => [ + q(7424), + q(0), + ], + q(xnr) => [ + q(7425), + q(0), + ], + q(xns) => [ + q(7426), + q(0), + ], + q(xnt) => [ + q(7427), + q(0), + ], + q(xnu) => [ + q(7428), + q(0), + ], + q(xny) => [ + q(7429), + q(0), + ], + q(xnz) => [ + q(7430), + q(0), + ], + q(xoc) => [ + q(7431), + q(0), + ], + q(xod) => [ + q(7432), + q(0), + ], + q(xog) => [ + q(7433), + q(0), + ], + q(xoi) => [ + q(7434), + q(0), + ], + q(xok) => [ + q(7435), + q(0), + ], + q(xom) => [ + q(7436), + q(0), + ], + q(xon) => [ + q(7437), + q(0), + ], + q(xoo) => [ + q(7438), + q(0), + ], + q(xop) => [ + q(7439), + q(0), + ], + q(xor) => [ + q(7440), + q(0), + ], + q(xow) => [ + q(7441), + q(0), + ], + q(xpa) => [ + q(7442), + q(0), + ], + q(xpc) => [ + q(7443), + q(0), + ], + q(xpe) => [ + q(7444), + q(0), + ], + q(xpg) => [ + q(7445), + q(0), + ], + q(xpi) => [ + q(7446), + q(0), + ], + q(xpj) => [ + q(7447), + q(0), + ], + q(xpk) => [ + q(7448), + q(0), + ], + q(xpm) => [ + q(7449), + q(0), + ], + q(xpn) => [ + q(7450), + q(0), + ], + q(xpo) => [ + q(7451), + q(0), + ], + q(xpp) => [ + q(7452), + q(0), + ], + q(xpq) => [ + q(7453), + q(0), + ], + q(xpr) => [ + q(7454), + q(0), + ], + q(xps) => [ + q(7455), + q(0), + ], + q(xpt) => [ + q(7456), + q(0), + ], + q(xpu) => [ + q(7457), + q(0), + ], + q(xpy) => [ + q(7458), + q(0), + ], + q(xqa) => [ + q(7459), + q(0), + ], + q(xqt) => [ + q(7460), + q(0), + ], + q(xra) => [ + q(7461), + q(0), + ], + q(xrb) => [ + q(7462), + q(0), + ], + q(xrd) => [ + q(7463), + q(0), + ], + q(xre) => [ + q(7464), + q(0), + ], + q(xrg) => [ + q(7465), + q(0), + ], + q(xri) => [ + q(7466), + q(0), + ], + q(xrm) => [ + q(7467), + q(0), + ], + q(xrn) => [ + q(7468), + q(0), + ], + q(xrq) => [ + q(7469), + q(0), + ], + q(xrr) => [ + q(7470), + q(0), + ], + q(xrt) => [ + q(7471), + q(0), + ], + q(xru) => [ + q(7472), + q(0), + ], + q(xrw) => [ + q(7473), + q(0), + ], + q(xsa) => [ + q(7474), + q(0), + ], + q(xsb) => [ + q(7475), + q(0), + ], + q(xsc) => [ + q(7476), + q(0), + ], + q(xsd) => [ + q(7477), + q(0), + ], + q(xse) => [ + q(7478), + q(0), + ], + q(xsh) => [ + q(7479), + q(0), + ], + q(xsi) => [ + q(7480), + q(0), + ], + q(xsl) => [ + q(7481), + q(0), + ], + q(xsm) => [ + q(7482), + q(0), + ], + q(xsn) => [ + q(7483), + q(0), + ], + q(xso) => [ + q(7484), + q(0), + ], + q(xsp) => [ + q(7485), + q(0), + ], + q(xsq) => [ + q(7486), + q(0), + ], + q(xsr) => [ + q(7487), + q(0), + ], + q(xss) => [ + q(7488), + q(0), + ], + q(xsu) => [ + q(7489), + q(0), + ], + q(xsv) => [ + q(7490), + q(0), + ], + q(xsy) => [ + q(7491), + q(0), + ], + q(xta) => [ + q(7492), + q(0), + ], + q(xtb) => [ + q(7493), + q(0), + ], + q(xtc) => [ + q(7494), + q(0), + ], + q(xtd) => [ + q(7495), + q(0), + ], + q(xte) => [ + q(7496), + q(0), + ], + q(xtg) => [ + q(7497), + q(0), + ], + q(xth) => [ + q(7498), + q(0), + ], + q(xti) => [ + q(7499), + q(0), + ], + q(xtj) => [ + q(7500), + q(0), + ], + q(xtl) => [ + q(7501), + q(0), + ], + q(xtm) => [ + q(7502), + q(0), + ], + q(xtn) => [ + q(7503), + q(0), + ], + q(xto) => [ + q(7504), + q(0), + ], + q(xtp) => [ + q(7505), + q(0), + ], + q(xtq) => [ + q(7506), + q(0), + ], + q(xtr) => [ + q(7507), + q(0), + ], + q(xts) => [ + q(7508), + q(0), + ], + q(xtt) => [ + q(7509), + q(0), + ], + q(xtu) => [ + q(7510), + q(0), + ], + q(xtv) => [ + q(7511), + q(0), + ], + q(xtw) => [ + q(7512), + q(0), + ], + q(xty) => [ + q(7513), + q(0), + ], + q(xtz) => [ + q(7514), + q(0), + ], + q(xua) => [ + q(7515), + q(0), + ], + q(xub) => [ + q(7516), + q(0), + ], + q(xud) => [ + q(7517), + q(0), + ], + q(xug) => [ + q(7518), + q(0), + ], + q(xuj) => [ + q(7519), + q(0), + ], + q(xul) => [ + q(7520), + q(0), + ], + q(xum) => [ + q(7521), + q(0), + ], + q(xun) => [ + q(7522), + q(0), + ], + q(xuo) => [ + q(7523), + q(0), + ], + q(xup) => [ + q(7524), + q(0), + ], + q(xur) => [ + q(7525), + q(0), + ], + q(xut) => [ + q(7526), + q(0), + ], + q(xuu) => [ + q(7527), + q(0), + ], + q(xve) => [ + q(7528), + q(0), + ], + q(xvi) => [ + q(7529), + q(0), + ], + q(xvn) => [ + q(7530), + q(0), + ], + q(xvo) => [ + q(7531), + q(0), + ], + q(xvs) => [ + q(7532), + q(0), + ], + q(xwa) => [ + q(7533), + q(0), + ], + q(xwc) => [ + q(7534), + q(0), + ], + q(xwd) => [ + q(7535), + q(0), + ], + q(xwe) => [ + q(7536), + q(0), + ], + q(xwg) => [ + q(7537), + q(0), + ], + q(xwj) => [ + q(7538), + q(0), + ], + q(xwk) => [ + q(7539), + q(0), + ], + q(xwl) => [ + q(7540), + q(0), + ], + q(xwo) => [ + q(7541), + q(0), + ], + q(xwr) => [ + q(7542), + q(0), + ], + q(xwt) => [ + q(7543), + q(0), + ], + q(xww) => [ + q(7544), + q(0), + ], + q(xxb) => [ + q(7545), + q(0), + ], + q(xxk) => [ + q(7546), + q(0), + ], + q(xxm) => [ + q(7547), + q(0), + ], + q(xxr) => [ + q(7548), + q(0), + ], + q(xxt) => [ + q(7549), + q(0), + ], + q(xya) => [ + q(7550), + q(0), + ], + q(xyb) => [ + q(7551), + q(0), + ], + q(xyj) => [ + q(7552), + q(0), + ], + q(xyk) => [ + q(7553), + q(0), + ], + q(xyl) => [ + q(7554), + q(0), + ], + q(xyt) => [ + q(7555), + q(0), + ], + q(xyy) => [ + q(7556), + q(0), + ], + q(xzh) => [ + q(7557), + q(0), + ], + q(xzm) => [ + q(7558), + q(0), + ], + q(xzp) => [ + q(7559), + q(0), + ], + q(yaa) => [ + q(7560), + q(0), + ], + q(yab) => [ + q(7561), + q(0), + ], + q(yac) => [ + q(7562), + q(0), + ], + q(yad) => [ + q(7563), + q(0), + ], + q(yae) => [ + q(7564), + q(0), + ], + q(yaf) => [ + q(7565), + q(0), + ], + q(yag) => [ + q(7566), + q(0), + ], + q(yah) => [ + q(7567), + q(0), + ], + q(yai) => [ + q(7568), + q(0), + ], + q(yaj) => [ + q(7569), + q(0), + ], + q(yak) => [ + q(7570), + q(0), + ], + q(yal) => [ + q(7571), + q(0), + ], + q(yam) => [ + q(7572), + q(0), + ], + q(yan) => [ + q(7573), + q(0), + ], + q(yao) => [ + q(0473), + q(0), + ], + q(yap) => [ + q(0474), + q(0), + ], + q(yaq) => [ + q(7574), + q(0), + ], + q(yar) => [ + q(7575), + q(0), + ], + q(yas) => [ + q(7576), + q(0), + ], + q(yat) => [ + q(7577), + q(0), + ], + q(yau) => [ + q(7578), + q(0), + ], + q(yav) => [ + q(7579), + q(0), + ], + q(yaw) => [ + q(7580), + q(0), + ], + q(yax) => [ + q(7581), + q(0), + ], + q(yay) => [ + q(7582), + q(0), + ], + q(yaz) => [ + q(7583), + q(0), + ], + q(yba) => [ + q(7584), + q(0), + ], + q(ybb) => [ + q(7585), + q(0), + ], + q(ybe) => [ + q(7586), + q(0), + ], + q(ybh) => [ + q(7587), + q(0), + ], + q(ybi) => [ + q(7588), + q(0), + ], + q(ybj) => [ + q(7589), + q(0), + ], + q(ybk) => [ + q(7590), + q(0), + ], + q(ybl) => [ + q(7591), + q(0), + ], + q(ybm) => [ + q(7592), + q(0), + ], + q(ybn) => [ + q(7593), + q(0), + ], + q(ybo) => [ + q(7594), + q(0), + ], + q(ybx) => [ + q(7595), + q(0), + ], + q(yby) => [ + q(7596), + q(0), + ], + q(ych) => [ + q(7597), + q(0), + ], + q(ycl) => [ + q(7598), + q(0), + ], + q(ycn) => [ + q(7599), + q(0), + ], + q(ycp) => [ + q(7600), + q(0), + ], + q(yda) => [ + q(7601), + q(0), + ], + q(ydd) => [ + q(7602), + q(0), + ], + q(yde) => [ + q(7603), + q(0), + ], + q(ydg) => [ + q(7604), + q(0), + ], + q(ydk) => [ + q(7605), + q(0), + ], + q(yea) => [ + q(7606), + q(0), + ], + q(yec) => [ + q(7607), + q(0), + ], + q(yee) => [ + q(7608), + q(0), + ], + q(yei) => [ + q(7609), + q(0), + ], + q(yej) => [ + q(7610), + q(0), + ], + q(yel) => [ + q(7611), + q(0), + ], + q(yer) => [ + q(7612), + q(0), + ], + q(yes) => [ + q(7613), + q(0), + ], + q(yet) => [ + q(7614), + q(0), + ], + q(yeu) => [ + q(7615), + q(0), + ], + q(yev) => [ + q(7616), + q(0), + ], + q(yey) => [ + q(7617), + q(0), + ], + q(yga) => [ + q(7618), + q(0), + ], + q(ygi) => [ + q(7619), + q(0), + ], + q(ygl) => [ + q(7620), + q(0), + ], + q(ygm) => [ + q(7621), + q(0), + ], + q(ygp) => [ + q(7622), + q(0), + ], + q(ygr) => [ + q(7623), + q(0), + ], + q(ygs) => [ + q(7624), + q(0), + ], + q(ygu) => [ + q(7625), + q(0), + ], + q(ygw) => [ + q(7626), + q(0), + ], + q(yha) => [ + q(7627), + q(0), + ], + q(yhd) => [ + q(7628), + q(0), + ], + q(yhl) => [ + q(7629), + q(0), + ], + q(yhs) => [ + q(7630), + q(0), + ], + q(yia) => [ + q(7631), + q(0), + ], + q(yid) => [ + q(0475), + q(0), + ], + q(yif) => [ + q(2655), + q(0), + ], + q(yig) => [ + q(7632), + q(0), + ], + q(yih) => [ + q(7633), + q(0), + ], + q(yii) => [ + q(7634), + q(0), + ], + q(yij) => [ + q(7635), + q(0), + ], + q(yik) => [ + q(7636), + q(0), + ], + q(yil) => [ + q(7637), + q(0), + ], + q(yim) => [ + q(7638), + q(0), + ], + q(yin) => [ + q(7639), + q(0), + ], + q(yip) => [ + q(7640), + q(0), + ], + q(yiq) => [ + q(7641), + q(0), + ], + q(yir) => [ + q(7642), + q(0), + ], + q(yis) => [ + q(7643), + q(0), + ], + q(yit) => [ + q(7644), + q(0), + ], + q(yiu) => [ + q(7645), + q(0), + ], + q(yiv) => [ + q(7646), + q(0), + ], + q(yix) => [ + q(7647), + q(0), + ], + q(yiz) => [ + q(7648), + q(0), + ], + q(yka) => [ + q(7649), + q(0), + ], + q(ykg) => [ + q(7650), + q(0), + ], + q(yki) => [ + q(7651), + q(0), + ], + q(ykk) => [ + q(7652), + q(0), + ], + q(ykl) => [ + q(7653), + q(0), + ], + q(ykm) => [ + q(7654), + q(0), + ], + q(ykn) => [ + q(7655), + q(0), + ], + q(yko) => [ + q(7656), + q(0), + ], + q(ykr) => [ + q(7657), + q(0), + ], + q(ykt) => [ + q(7658), + q(0), + ], + q(yku) => [ + q(7659), + q(0), + ], + q(yky) => [ + q(7660), + q(0), + ], + q(yla) => [ + q(7661), + q(0), + ], + q(ylb) => [ + q(7662), + q(0), + ], + q(yle) => [ + q(7663), + q(0), + ], + q(ylg) => [ + q(7664), + q(0), + ], + q(yli) => [ + q(7665), + q(0), + ], + q(yll) => [ + q(7666), + q(0), + ], + q(ylm) => [ + q(7667), + q(0), + ], + q(yln) => [ + q(7668), + q(0), + ], + q(ylo) => [ + q(7669), + q(0), + ], + q(ylr) => [ + q(7670), + q(0), + ], + q(ylu) => [ + q(7671), + q(0), + ], + q(yly) => [ + q(7672), + q(0), + ], + q(ymb) => [ + q(7673), + q(0), + ], + q(ymc) => [ + q(7674), + q(0), + ], + q(ymd) => [ + q(7675), + q(0), + ], + q(yme) => [ + q(7676), + q(0), + ], + q(ymg) => [ + q(7677), + q(0), + ], + q(ymh) => [ + q(7678), + q(0), + ], + q(ymi) => [ + q(7679), + q(0), + ], + q(ymk) => [ + q(7680), + q(0), + ], + q(yml) => [ + q(7681), + q(0), + ], + q(ymm) => [ + q(7682), + q(0), + ], + q(ymn) => [ + q(7683), + q(0), + ], + q(ymo) => [ + q(7684), + q(0), + ], + q(ymp) => [ + q(7685), + q(0), + ], + q(ymq) => [ + q(7686), + q(0), + ], + q(ymr) => [ + q(7687), + q(0), + ], + q(yms) => [ + q(7688), + q(0), + ], + q(ymx) => [ + q(7689), + q(0), + ], + q(ymz) => [ + q(7690), + q(0), + ], + q(yna) => [ + q(7691), + q(0), + ], + q(ynd) => [ + q(7692), + q(0), + ], + q(yne) => [ + q(7693), + q(0), + ], + q(yng) => [ + q(7694), + q(0), + ], + q(ynk) => [ + q(7695), + q(0), + ], + q(ynl) => [ + q(7696), + q(0), + ], + q(ynn) => [ + q(7697), + q(0), + ], + q(yno) => [ + q(7698), + q(0), + ], + q(ynq) => [ + q(7699), + q(0), + ], + q(yns) => [ + q(7700), + q(0), + ], + q(ynu) => [ + q(7701), + q(0), + ], + q(yob) => [ + q(7702), + q(0), + ], + q(yog) => [ + q(7703), + q(0), + ], + q(yoi) => [ + q(7704), + q(0), + ], + q(yok) => [ + q(7705), + q(0), + ], + q(yol) => [ + q(7706), + q(0), + ], + q(yom) => [ + q(7707), + q(0), + ], + q(yon) => [ + q(7708), + q(0), + ], + q(yor) => [ + q(0476), + q(0), + ], + q(yot) => [ + q(7709), + q(0), + ], + q(yox) => [ + q(7710), + q(0), + ], + q(yoy) => [ + q(7711), + q(0), + ], + q(ypa) => [ + q(7712), + q(0), + ], + q(ypb) => [ + q(7713), + q(0), + ], + q(ypg) => [ + q(7714), + q(0), + ], + q(yph) => [ + q(7715), + q(0), + ], + q(ypk) => [ + q(0477), + q(0), + ], + q(ypm) => [ + q(7716), + q(0), + ], + q(ypn) => [ + q(7717), + q(0), + ], + q(ypo) => [ + q(7718), + q(0), + ], + q(ypp) => [ + q(7719), + q(0), + ], + q(ypz) => [ + q(7720), + q(0), + ], + q(yra) => [ + q(7721), + q(0), + ], + q(yrb) => [ + q(7722), + q(0), + ], + q(yre) => [ + q(7723), + q(0), + ], + q(yrk) => [ + q(7724), + q(0), + ], + q(yrl) => [ + q(7725), + q(0), + ], + q(yrm) => [ + q(7726), + q(0), + ], + q(yrn) => [ + q(7727), + q(0), + ], + q(yro) => [ + q(7728), + q(0), + ], + q(yrs) => [ + q(7729), + q(0), + ], + q(yrw) => [ + q(7730), + q(0), + ], + q(yry) => [ + q(7731), + q(0), + ], + q(ysc) => [ + q(7732), + q(0), + ], + q(ysd) => [ + q(7733), + q(0), + ], + q(ysg) => [ + q(7734), + q(0), + ], + q(ysl) => [ + q(7735), + q(0), + ], + q(ysn) => [ + q(7736), + q(0), + ], + q(yso) => [ + q(7737), + q(0), + ], + q(ysp) => [ + q(7738), + q(0), + ], + q(ysr) => [ + q(7739), + q(0), + ], + q(yss) => [ + q(7740), + q(0), + ], + q(ysy) => [ + q(7741), + q(0), + ], + q(yta) => [ + q(7742), + q(0), + ], + q(ytl) => [ + q(7743), + q(0), + ], + q(ytp) => [ + q(7744), + q(0), + ], + q(ytw) => [ + q(7745), + q(0), + ], + q(yty) => [ + q(7746), + q(0), + ], + q(yua) => [ + q(7747), + q(0), + ], + q(yub) => [ + q(7748), + q(0), + ], + q(yuc) => [ + q(7749), + q(0), + ], + q(yud) => [ + q(7750), + q(0), + ], + q(yue) => [ + q(7751), + q(0), + ], + q(yuf) => [ + q(7752), + q(0), + ], + q(yug) => [ + q(7753), + q(0), + ], + q(yui) => [ + q(7754), + q(0), + ], + q(yuj) => [ + q(7755), + q(0), + ], + q(yuk) => [ + q(7756), + q(0), + ], + q(yul) => [ + q(7757), + q(0), + ], + q(yum) => [ + q(7758), + q(0), + ], + q(yun) => [ + q(7759), + q(0), + ], + q(yup) => [ + q(7760), + q(0), + ], + q(yuq) => [ + q(7761), + q(0), + ], + q(yur) => [ + q(7762), + q(0), + ], + q(yut) => [ + q(7763), + q(0), + ], + q(yuw) => [ + q(7764), + q(0), + ], + q(yux) => [ + q(7765), + q(0), + ], + q(yuy) => [ + q(7766), + q(0), + ], + q(yuz) => [ + q(7767), + q(0), + ], + q(yva) => [ + q(7768), + q(0), + ], + q(yvt) => [ + q(7769), + q(0), + ], + q(ywa) => [ + q(7770), + q(0), + ], + q(ywg) => [ + q(7771), + q(0), + ], + q(ywl) => [ + q(7772), + q(0), + ], + q(ywn) => [ + q(7773), + q(0), + ], + q(ywq) => [ + q(7774), + q(0), + ], + q(ywr) => [ + q(7775), + q(0), + ], + q(ywt) => [ + q(7776), + q(0), + ], + q(ywu) => [ + q(7777), + q(0), + ], + q(yww) => [ + q(7778), + q(0), + ], + q(yxa) => [ + q(7779), + q(0), + ], + q(yxg) => [ + q(7780), + q(0), + ], + q(yxl) => [ + q(7781), + q(0), + ], + q(yxm) => [ + q(7782), + q(0), + ], + q(yxu) => [ + q(7783), + q(0), + ], + q(yxy) => [ + q(7784), + q(0), + ], + q(yyr) => [ + q(7785), + q(0), + ], + q(yyu) => [ + q(7786), + q(0), + ], + q(yyz) => [ + q(7787), + q(0), + ], + q(yzg) => [ + q(7788), + q(0), + ], + q(yzk) => [ + q(7789), + q(0), + ], + q(zaa) => [ + q(7790), + q(0), + ], + q(zab) => [ + q(7791), + q(0), + ], + q(zac) => [ + q(7792), + q(0), + ], + q(zad) => [ + q(7793), + q(0), + ], + q(zae) => [ + q(7794), + q(0), + ], + q(zaf) => [ + q(7795), + q(0), + ], + q(zag) => [ + q(7796), + q(0), + ], + q(zah) => [ + q(7797), + q(0), + ], + q(zai) => [ + q(7798), + q(0), + ], + q(zaj) => [ + q(7799), + q(0), + ], + q(zak) => [ + q(7800), + q(0), + ], + q(zal) => [ + q(7801), + q(0), + ], + q(zam) => [ + q(7802), + q(0), + ], + q(zao) => [ + q(7803), + q(0), + ], + q(zap) => [ + q(0478), + q(0), + ], + q(zaq) => [ + q(7804), + q(0), + ], + q(zar) => [ + q(7805), + q(0), + ], + q(zas) => [ + q(7806), + q(0), + ], + q(zat) => [ + q(7807), + q(0), + ], + q(zau) => [ + q(7808), + q(0), + ], + q(zav) => [ + q(7809), + q(0), + ], + q(zaw) => [ + q(7810), + q(0), + ], + q(zax) => [ + q(7811), + q(0), + ], + q(zay) => [ + q(7812), + q(0), + ], + q(zaz) => [ + q(7813), + q(0), + ], + q(zbc) => [ + q(7814), + q(0), + ], + q(zbe) => [ + q(7815), + q(0), + ], + q(zbl) => [ + q(0479), + q(0), + ], + q(zbt) => [ + q(7816), + q(0), + ], + q(zbw) => [ + q(7817), + q(0), + ], + q(zca) => [ + q(7818), + q(0), + ], + q(zch) => [ + q(7819), + q(0), + ], + q(zdj) => [ + q(7820), + q(0), + ], + q(zea) => [ + q(7821), + q(0), + ], + q(zeg) => [ + q(7822), + q(0), + ], + q(zeh) => [ + q(7823), + q(0), + ], + q(zen) => [ + q(0480), + q(0), + ], + q(zga) => [ + q(7824), + q(0), + ], + q(zgb) => [ + q(7825), + q(0), + ], + q(zgh) => [ + q(0481), + q(0), + ], + q(zgm) => [ + q(7826), + q(0), + ], + q(zgn) => [ + q(7827), + q(0), + ], + q(zgr) => [ + q(7828), + q(0), + ], + q(zha) => [ + q(0482), + q(0), + ], + q(zhb) => [ + q(7829), + q(0), + ], + q(zhd) => [ + q(7830), + q(0), + ], + q(zhi) => [ + q(7831), + q(0), + ], + q(zhn) => [ + q(7832), + q(0), + ], + q(zhw) => [ + q(7833), + q(0), + ], + q(zhx) => [ + q(0534), + q(0), + ], + q(zia) => [ + q(7834), + q(0), + ], + q(zib) => [ + q(7835), + q(0), + ], + q(zik) => [ + q(7836), + q(0), + ], + q(zil) => [ + q(7837), + q(0), + ], + q(zim) => [ + q(7838), + q(0), + ], + q(zin) => [ + q(7839), + q(0), + ], + q(zir) => [ + q(7840), + q(0), + ], + q(ziw) => [ + q(7841), + q(0), + ], + q(ziz) => [ + q(7842), + q(0), + ], + q(zka) => [ + q(7843), + q(0), + ], + q(zkb) => [ + q(7844), + q(0), + ], + q(zkd) => [ + q(7845), + q(0), + ], + q(zkg) => [ + q(7846), + q(0), + ], + q(zkh) => [ + q(7847), + q(0), + ], + q(zkk) => [ + q(7848), + q(0), + ], + q(zkn) => [ + q(7849), + q(0), + ], + q(zko) => [ + q(7850), + q(0), + ], + q(zkp) => [ + q(7851), + q(0), + ], + q(zkr) => [ + q(7852), + q(0), + ], + q(zkt) => [ + q(7853), + q(0), + ], + q(zku) => [ + q(7854), + q(0), + ], + q(zkv) => [ + q(7855), + q(0), + ], + q(zkz) => [ + q(7856), + q(0), + ], + q(zle) => [ + q(0535), + q(0), + ], + q(zlj) => [ + q(7857), + q(0), + ], + q(zlm) => [ + q(7858), + q(0), + ], + q(zln) => [ + q(7859), + q(0), + ], + q(zlq) => [ + q(7860), + q(0), + ], + q(zls) => [ + q(0536), + q(0), + ], + q(zlw) => [ + q(0537), + q(0), + ], + q(zma) => [ + q(7861), + q(0), + ], + q(zmb) => [ + q(7862), + q(0), + ], + q(zmc) => [ + q(7863), + q(0), + ], + q(zmd) => [ + q(7864), + q(0), + ], + q(zme) => [ + q(7865), + q(0), + ], + q(zmf) => [ + q(7866), + q(0), + ], + q(zmg) => [ + q(7867), + q(0), + ], + q(zmh) => [ + q(7868), + q(0), + ], + q(zmi) => [ + q(7869), + q(0), + ], + q(zmj) => [ + q(7870), + q(0), + ], + q(zmk) => [ + q(7871), + q(0), + ], + q(zml) => [ + q(7872), + q(0), + ], + q(zmm) => [ + q(7873), + q(0), + ], + q(zmn) => [ + q(7874), + q(0), + ], + q(zmo) => [ + q(7875), + q(0), + ], + q(zmp) => [ + q(7876), + q(0), + ], + q(zmq) => [ + q(7877), + q(0), + ], + q(zmr) => [ + q(7878), + q(0), + ], + q(zms) => [ + q(7879), + q(0), + ], + q(zmt) => [ + q(7880), + q(0), + ], + q(zmu) => [ + q(7881), + q(0), + ], + q(zmv) => [ + q(7882), + q(0), + ], + q(zmw) => [ + q(7883), + q(0), + ], + q(zmx) => [ + q(7884), + q(0), + ], + q(zmy) => [ + q(7885), + q(0), + ], + q(zmz) => [ + q(7886), + q(0), + ], + q(zna) => [ + q(7887), + q(0), + ], + q(znd) => [ + q(0483), + q(0), + ], + q(zne) => [ + q(7888), + q(0), + ], + q(zng) => [ + q(7889), + q(0), + ], + q(znk) => [ + q(7890), + q(0), + ], + q(zns) => [ + q(7891), + q(0), + ], + q(zoc) => [ + q(7892), + q(0), + ], + q(zoh) => [ + q(7893), + q(0), + ], + q(zom) => [ + q(7894), + q(0), + ], + q(zoo) => [ + q(7895), + q(0), + ], + q(zoq) => [ + q(7896), + q(0), + ], + q(zor) => [ + q(7897), + q(0), + ], + q(zos) => [ + q(7898), + q(0), + ], + q(zpa) => [ + q(7899), + q(0), + ], + q(zpb) => [ + q(7900), + q(0), + ], + q(zpc) => [ + q(7901), + q(0), + ], + q(zpd) => [ + q(7902), + q(0), + ], + q(zpe) => [ + q(7903), + q(0), + ], + q(zpf) => [ + q(7904), + q(0), + ], + q(zpg) => [ + q(7905), + q(0), + ], + q(zph) => [ + q(7906), + q(0), + ], + q(zpi) => [ + q(7907), + q(0), + ], + q(zpj) => [ + q(7908), + q(0), + ], + q(zpk) => [ + q(7909), + q(0), + ], + q(zpl) => [ + q(7910), + q(0), + ], + q(zpm) => [ + q(7911), + q(0), + ], + q(zpn) => [ + q(7912), + q(0), + ], + q(zpo) => [ + q(7913), + q(0), + ], + q(zpp) => [ + q(7914), + q(0), + ], + q(zpq) => [ + q(7915), + q(0), + ], + q(zpr) => [ + q(7916), + q(0), + ], + q(zps) => [ + q(7917), + q(0), + ], + q(zpt) => [ + q(7918), + q(0), + ], + q(zpu) => [ + q(7919), + q(0), + ], + q(zpv) => [ + q(7920), + q(0), + ], + q(zpw) => [ + q(7921), + q(0), + ], + q(zpx) => [ + q(7922), + q(0), + ], + q(zpy) => [ + q(7923), + q(0), + ], + q(zpz) => [ + q(7924), + q(0), + ], + q(zqe) => [ + q(7925), + q(0), + ], + q(zra) => [ + q(7926), + q(0), + ], + q(zrg) => [ + q(7927), + q(0), + ], + q(zrn) => [ + q(7928), + q(0), + ], + q(zro) => [ + q(7929), + q(0), + ], + q(zrp) => [ + q(7930), + q(0), + ], + q(zrs) => [ + q(7931), + q(0), + ], + q(zsa) => [ + q(7932), + q(0), + ], + q(zsk) => [ + q(7933), + q(0), + ], + q(zsl) => [ + q(7934), + q(0), + ], + q(zsm) => [ + q(7935), + q(0), + ], + q(zsr) => [ + q(7936), + q(0), + ], + q(zsu) => [ + q(7937), + q(0), + ], + q(zte) => [ + q(7938), + q(0), + ], + q(ztg) => [ + q(7939), + q(0), + ], + q(ztl) => [ + q(7940), + q(0), + ], + q(ztm) => [ + q(7941), + q(0), + ], + q(ztn) => [ + q(7942), + q(0), + ], + q(ztp) => [ + q(7943), + q(0), + ], + q(ztq) => [ + q(7944), + q(0), + ], + q(zts) => [ + q(7945), + q(0), + ], + q(ztt) => [ + q(7946), + q(0), + ], + q(ztu) => [ + q(7947), + q(0), + ], + q(ztx) => [ + q(7948), + q(0), + ], + q(zty) => [ + q(7949), + q(0), + ], + q(zua) => [ + q(7950), + q(0), + ], + q(zuh) => [ + q(7951), + q(0), + ], + q(zul) => [ + q(0484), + q(0), + ], + q(zum) => [ + q(7952), + q(0), + ], + q(zun) => [ + q(0485), + q(0), + ], + q(zuy) => [ + q(7953), + q(0), + ], + q(zwa) => [ + q(7954), + q(0), + ], + q(zxx) => [ + q(0486), + q(0), + ], + q(zyb) => [ + q(7955), + q(0), + ], + q(zyg) => [ + q(7956), + q(0), + ], + q(zyj) => [ + q(7957), + q(0), + ], + q(zyn) => [ + q(7958), + q(0), + ], + q(zyp) => [ + q(7959), + q(0), + ], + q(zza) => [ + q(0487), + q(0), + ], + q(zzj) => [ + q(7960), + q(0), + ], + }, + q(term) => { + q(aar) => [ + q(0001), + q(0), + ], + q(abk) => [ + q(0002), + q(0), + ], + q(ace) => [ + q(0003), + q(0), + ], + q(ach) => [ + q(0004), + q(0), + ], + q(ada) => [ + q(0005), + q(0), + ], + q(ady) => [ + q(0006), + q(0), + ], + q(afa) => [ + q(0007), + q(0), + ], + q(afh) => [ + q(0008), + q(0), + ], + q(afr) => [ + q(0009), + q(0), + ], + q(ain) => [ + q(0010), + q(0), + ], + q(aka) => [ + q(0011), + q(0), + ], + q(akk) => [ + q(0012), + q(0), + ], + q(ale) => [ + q(0014), + q(0), + ], + q(alg) => [ + q(0015), + q(0), + ], + q(alt) => [ + q(0016), + q(0), + ], + q(amh) => [ + q(0017), + q(0), + ], + q(ang) => [ + q(0018), + q(0), + ], + q(anp) => [ + q(0019), + q(0), + ], + q(apa) => [ + q(0020), + q(0), + ], + q(ara) => [ + q(0021), + q(0), + ], + q(arc) => [ + q(0022), + q(0), + ], + q(arg) => [ + q(0023), + q(0), + ], + q(arn) => [ + q(0025), + q(0), + ], + q(arp) => [ + q(0026), + q(0), + ], + q(art) => [ + q(0027), + q(0), + ], + q(arw) => [ + q(0028), + q(0), + ], + q(asm) => [ + q(0029), + q(0), + ], + q(ast) => [ + q(0030), + q(0), + ], + q(ath) => [ + q(0031), + q(0), + ], + q(aus) => [ + q(0032), + q(0), + ], + q(ava) => [ + q(0033), + q(0), + ], + q(ave) => [ + q(0034), + q(0), + ], + q(awa) => [ + q(0035), + q(0), + ], + q(aym) => [ + q(0036), + q(0), + ], + q(aze) => [ + q(0037), + q(0), + ], + q(bad) => [ + q(0038), + q(0), + ], + q(bai) => [ + q(0039), + q(0), + ], + q(bak) => [ + q(0040), + q(0), + ], + q(bal) => [ + q(0041), + q(0), + ], + q(bam) => [ + q(0042), + q(0), + ], + q(ban) => [ + q(0043), + q(0), + ], + q(bas) => [ + q(0045), + q(0), + ], + q(bat) => [ + q(0046), + q(0), + ], + q(bej) => [ + q(0047), + q(0), + ], + q(bel) => [ + q(0048), + q(0), + ], + q(bem) => [ + q(0049), + q(0), + ], + q(ben) => [ + q(0050), + q(0), + ], + q(ber) => [ + q(0051), + q(0), + ], + q(bho) => [ + q(0052), + q(0), + ], + q(bih) => [ + q(0053), + q(0), + ], + q(bik) => [ + q(0054), + q(0), + ], + q(bin) => [ + q(0055), + q(0), + ], + q(bis) => [ + q(0056), + q(0), + ], + q(bla) => [ + q(0057), + q(0), + ], + q(bnt) => [ + q(0058), + q(0), + ], + q(bod) => [ + q(0428), + q(0), + ], + q(bos) => [ + q(0059), + q(0), + ], + q(bra) => [ + q(0060), + q(0), + ], + q(bre) => [ + q(0061), + q(0), + ], + q(btk) => [ + q(0062), + q(0), + ], + q(bua) => [ + q(0063), + q(0), + ], + q(bug) => [ + q(0064), + q(0), + ], + q(bul) => [ + q(0065), + q(0), + ], + q(byn) => [ + q(0067), + q(0), + ], + q(cad) => [ + q(0068), + q(0), + ], + q(cai) => [ + q(0069), + q(0), + ], + q(car) => [ + q(0070), + q(0), + ], + q(cat) => [ + q(0071), + q(0), + ], + q(cau) => [ + q(0072), + q(0), + ], + q(ceb) => [ + q(0073), + q(0), + ], + q(cel) => [ + q(0074), + q(0), + ], + q(ces) => [ + q(0102), + q(0), + ], + q(cha) => [ + q(0075), + q(0), + ], + q(chb) => [ + q(0076), + q(0), + ], + q(che) => [ + q(0077), + q(0), + ], + q(chg) => [ + q(0078), + q(0), + ], + q(chk) => [ + q(0080), + q(0), + ], + q(chm) => [ + q(0081), + q(0), + ], + q(chn) => [ + q(0082), + q(0), + ], + q(cho) => [ + q(0083), + q(0), + ], + q(chp) => [ + q(0084), + q(0), + ], + q(chr) => [ + q(0085), + q(0), + ], + q(chu) => [ + q(0086), + q(0), + ], + q(chv) => [ + q(0087), + q(0), + ], + q(chy) => [ + q(0088), + q(0), + ], + q(cmc) => [ + q(0089), + q(0), + ], + q(cnr) => [ + q(0090), + q(0), + ], + q(cop) => [ + q(0091), + q(0), + ], + q(cor) => [ + q(0092), + q(0), + ], + q(cos) => [ + q(0093), + q(0), + ], + q(cpe) => [ + q(0094), + q(0), + ], + q(cpf) => [ + q(0095), + q(0), + ], + q(cpp) => [ + q(0096), + q(0), + ], + q(cre) => [ + q(0097), + q(0), + ], + q(crh) => [ + q(0098), + q(0), + ], + q(crp) => [ + q(0099), + q(0), + ], + q(csb) => [ + q(0100), + q(0), + ], + q(cus) => [ + q(0101), + q(0), + ], + q(cym) => [ + q(0467), + q(0), + ], + q(dak) => [ + q(0103), + q(0), + ], + q(dan) => [ + q(0104), + q(0), + ], + q(dar) => [ + q(0105), + q(0), + ], + q(day) => [ + q(0106), + q(0), + ], + q(del) => [ + q(0107), + q(0), + ], + q(den) => [ + q(0108), + q(0), + ], + q(deu) => [ + q(0151), + q(0), + ], + q(dgr) => [ + q(0109), + q(0), + ], + q(din) => [ + q(0110), + q(0), + ], + q(div) => [ + q(0111), + q(0), + ], + q(doi) => [ + q(0112), + q(0), + ], + q(dra) => [ + q(0113), + q(0), + ], + q(dsb) => [ + q(0114), + q(0), + ], + q(dua) => [ + q(0115), + q(0), + ], + q(dum) => [ + q(0116), + q(0), + ], + q(dyu) => [ + q(0118), + q(0), + ], + q(dzo) => [ + q(0119), + q(0), + ], + q(efi) => [ + q(0120), + q(0), + ], + q(egy) => [ + q(0121), + q(0), + ], + q(eka) => [ + q(0122), + q(0), + ], + q(ell) => [ + q(0165), + q(0), + ], + q(elx) => [ + q(0123), + q(0), + ], + q(eng) => [ + q(0124), + q(0), + ], + q(enm) => [ + q(0125), + q(0), + ], + q(epo) => [ + q(0126), + q(0), + ], + q(est) => [ + q(0127), + q(0), + ], + q(eus) => [ + q(0044), + q(0), + ], + q(ewe) => [ + q(0128), + q(0), + ], + q(ewo) => [ + q(0129), + q(0), + ], + q(fan) => [ + q(0130), + q(0), + ], + q(fao) => [ + q(0131), + q(0), + ], + q(fas) => [ + q(0343), + q(0), + ], + q(fat) => [ + q(0132), + q(0), + ], + q(fij) => [ + q(0133), + q(0), + ], + q(fil) => [ + q(0134), + q(0), + ], + q(fin) => [ + q(0135), + q(0), + ], + q(fiu) => [ + q(0136), + q(0), + ], + q(fon) => [ + q(0137), + q(0), + ], + q(fra) => [ + q(0138), + q(0), + ], + q(frm) => [ + q(0139), + q(0), + ], + q(fro) => [ + q(0140), + q(0), + ], + q(frr) => [ + q(0141), + q(0), + ], + q(frs) => [ + q(0142), + q(0), + ], + q(fry) => [ + q(0143), + q(0), + ], + q(ful) => [ + q(0144), + q(0), + ], + q(fur) => [ + q(0145), + q(0), + ], + q(gaa) => [ + q(0146), + q(0), + ], + q(gay) => [ + q(0147), + q(0), + ], + q(gba) => [ + q(0148), + q(0), + ], + q(gem) => [ + q(0149), + q(0), + ], + q(gez) => [ + q(0152), + q(0), + ], + q(gil) => [ + q(0153), + q(0), + ], + q(gla) => [ + q(0154), + q(0), + ], + q(gle) => [ + q(0155), + q(0), + ], + q(glg) => [ + q(0156), + q(0), + ], + q(glv) => [ + q(0157), + q(0), + ], + q(gmh) => [ + q(0158), + q(0), + ], + q(goh) => [ + q(0159), + q(0), + ], + q(gon) => [ + q(0160), + q(0), + ], + q(gor) => [ + q(0161), + q(0), + ], + q(got) => [ + q(0162), + q(0), + ], + q(grb) => [ + q(0163), + q(0), + ], + q(grc) => [ + q(0164), + q(0), + ], + q(grn) => [ + q(0166), + q(0), + ], + q(gsw) => [ + q(0167), + q(0), + ], + q(guj) => [ + q(0168), + q(0), + ], + q(gwi) => [ + q(0169), + q(0), + ], + q(hai) => [ + q(0170), + q(0), + ], + q(hat) => [ + q(0171), + q(0), + ], + q(hau) => [ + q(0172), + q(0), + ], + q(haw) => [ + q(0173), + q(0), + ], + q(heb) => [ + q(0174), + q(0), + ], + q(her) => [ + q(0175), + q(0), + ], + q(hil) => [ + q(0176), + q(0), + ], + q(him) => [ + q(0177), + q(0), + ], + q(hin) => [ + q(0178), + q(0), + ], + q(hit) => [ + q(0179), + q(0), + ], + q(hmn) => [ + q(0180), + q(0), + ], + q(hmo) => [ + q(0181), + q(0), + ], + q(hrv) => [ + q(0182), + q(0), + ], + q(hsb) => [ + q(0183), + q(0), + ], + q(hun) => [ + q(0184), + q(0), + ], + q(hup) => [ + q(0185), + q(0), + ], + q(hye) => [ + q(0024), + q(0), + ], + q(iba) => [ + q(0186), + q(0), + ], + q(ibo) => [ + q(0187), + q(0), + ], + q(ido) => [ + q(0189), + q(0), + ], + q(iii) => [ + q(0190), + q(0), + ], + q(ijo) => [ + q(0191), + q(0), + ], + q(iku) => [ + q(0192), + q(0), + ], + q(ile) => [ + q(0193), + q(0), + ], + q(ilo) => [ + q(0194), + q(0), + ], + q(ina) => [ + q(0195), + q(0), + ], + q(inc) => [ + q(0196), + q(0), + ], + q(ind) => [ + q(0197), + q(0), + ], + q(ine) => [ + q(0198), + q(0), + ], + q(inh) => [ + q(0199), + q(0), + ], + q(ipk) => [ + q(0200), + q(0), + ], + q(ira) => [ + q(0201), + q(0), + ], + q(iro) => [ + q(0202), + q(0), + ], + q(isl) => [ + q(0188), + q(0), + ], + q(ita) => [ + q(0203), + q(0), + ], + q(jav) => [ + q(0204), + q(0), + ], + q(jbo) => [ + q(0205), + q(0), + ], + q(jpn) => [ + q(0206), + q(0), + ], + q(jpr) => [ + q(0207), + q(0), + ], + q(jrb) => [ + q(0208), + q(0), + ], + q(kaa) => [ + q(0209), + q(0), + ], + q(kab) => [ + q(0210), + q(0), + ], + q(kac) => [ + q(0211), + q(0), + ], + q(kal) => [ + q(0212), + q(0), + ], + q(kam) => [ + q(0213), + q(0), + ], + q(kan) => [ + q(0214), + q(0), + ], + q(kar) => [ + q(0215), + q(0), + ], + q(kas) => [ + q(0216), + q(0), + ], + q(kat) => [ + q(0150), + q(0), + ], + q(kau) => [ + q(0217), + q(0), + ], + q(kaw) => [ + q(0218), + q(0), + ], + q(kaz) => [ + q(0219), + q(0), + ], + q(kbd) => [ + q(0220), + q(0), + ], + q(kha) => [ + q(0221), + q(0), + ], + q(khi) => [ + q(0222), + q(0), + ], + q(khm) => [ + q(0223), + q(0), + ], + q(kho) => [ + q(0224), + q(0), + ], + q(kik) => [ + q(0225), + q(0), + ], + q(kin) => [ + q(0226), + q(0), + ], + q(kir) => [ + q(0227), + q(0), + ], + q(kmb) => [ + q(0228), + q(0), + ], + q(kok) => [ + q(0229), + q(0), + ], + q(kom) => [ + q(0230), + q(0), + ], + q(kon) => [ + q(0231), + q(0), + ], + q(kor) => [ + q(0232), + q(0), + ], + q(kos) => [ + q(0233), + q(0), + ], + q(kpe) => [ + q(0234), + q(0), + ], + q(krc) => [ + q(0235), + q(0), + ], + q(krl) => [ + q(0236), + q(0), + ], + q(kro) => [ + q(0237), + q(0), + ], + q(kru) => [ + q(0238), + q(0), + ], + q(kua) => [ + q(0239), + q(0), + ], + q(kum) => [ + q(0240), + q(0), + ], + q(kur) => [ + q(0241), + q(0), + ], + q(kut) => [ + q(0242), + q(0), + ], + q(lad) => [ + q(0243), + q(0), + ], + q(lah) => [ + q(0244), + q(0), + ], + q(lam) => [ + q(0245), + q(0), + ], + q(lao) => [ + q(0246), + q(0), + ], + q(lat) => [ + q(0247), + q(0), + ], + q(lav) => [ + q(0248), + q(0), + ], + q(lez) => [ + q(0249), + q(0), + ], + q(lim) => [ + q(0250), + q(0), + ], + q(lin) => [ + q(0251), + q(0), + ], + q(lit) => [ + q(0252), + q(0), + ], + q(lol) => [ + q(0253), + q(0), + ], + q(loz) => [ + q(0254), + q(0), + ], + q(ltz) => [ + q(0255), + q(0), + ], + q(lua) => [ + q(0256), + q(0), + ], + q(lub) => [ + q(0257), + q(0), + ], + q(lug) => [ + q(0258), + q(0), + ], + q(lui) => [ + q(0259), + q(0), + ], + q(lun) => [ + q(0260), + q(0), + ], + q(luo) => [ + q(0261), + q(0), + ], + q(lus) => [ + q(0262), + q(0), + ], + q(mad) => [ + q(0264), + q(0), + ], + q(mag) => [ + q(0265), + q(0), + ], + q(mah) => [ + q(0266), + q(0), + ], + q(mai) => [ + q(0267), + q(0), + ], + q(mak) => [ + q(0268), + q(0), + ], + q(mal) => [ + q(0269), + q(0), + ], + q(man) => [ + q(0270), + q(0), + ], + q(map) => [ + q(0272), + q(0), + ], + q(mar) => [ + q(0273), + q(0), + ], + q(mas) => [ + q(0274), + q(0), + ], + q(mdf) => [ + q(0276), + q(0), + ], + q(mdr) => [ + q(0277), + q(0), + ], + q(men) => [ + q(0278), + q(0), + ], + q(mga) => [ + q(0279), + q(0), + ], + q(mic) => [ + q(0280), + q(0), + ], + q(min) => [ + q(0281), + q(0), + ], + q(mis) => [ + q(0282), + q(0), + ], + q(mkd) => [ + q(0263), + q(0), + ], + q(mkh) => [ + q(0283), + q(0), + ], + q(mlg) => [ + q(0284), + q(0), + ], + q(mlt) => [ + q(0285), + q(0), + ], + q(mnc) => [ + q(0286), + q(0), + ], + q(mni) => [ + q(0287), + q(0), + ], + q(mno) => [ + q(0288), + q(0), + ], + q(moh) => [ + q(0289), + q(0), + ], + q(mon) => [ + q(0290), + q(0), + ], + q(mos) => [ + q(0291), + q(0), + ], + q(mri) => [ + q(0271), + q(0), + ], + q(msa) => [ + q(0275), + q(0), + ], + q(mul) => [ + q(0292), + q(0), + ], + q(mun) => [ + q(0293), + q(0), + ], + q(mus) => [ + q(0294), + q(0), + ], + q(mwl) => [ + q(0295), + q(0), + ], + q(mwr) => [ + q(0296), + q(0), + ], + q(mya) => [ + q(0066), + q(0), + ], + q(myn) => [ + q(0297), + q(0), + ], + q(myv) => [ + q(0298), + q(0), + ], + q(nah) => [ + q(0299), + q(0), + ], + q(nai) => [ + q(0300), + q(0), + ], + q(nap) => [ + q(0301), + q(0), + ], + q(nau) => [ + q(0302), + q(0), + ], + q(nav) => [ + q(0303), + q(0), + ], + q(nbl) => [ + q(0304), + q(0), + ], + q(nde) => [ + q(0305), + q(0), + ], + q(ndo) => [ + q(0306), + q(0), + ], + q(nds) => [ + q(0307), + q(0), + ], + q(nep) => [ + q(0308), + q(0), + ], + q(new) => [ + q(0309), + q(0), + ], + q(nia) => [ + q(0310), + q(0), + ], + q(nic) => [ + q(0311), + q(0), + ], + q(niu) => [ + q(0312), + q(0), + ], + q(nld) => [ + q(0117), + q(0), + ], + q(nno) => [ + q(0313), + q(0), + ], + q(nob) => [ + q(0314), + q(0), + ], + q(nog) => [ + q(0315), + q(0), + ], + q(non) => [ + q(0316), + q(0), + ], + q(nor) => [ + q(0317), + q(0), + ], + q(nqo) => [ + q(0318), + q(0), + ], + q(nso) => [ + q(0319), + q(0), + ], + q(nub) => [ + q(0320), + q(0), + ], + q(nwc) => [ + q(0321), + q(0), + ], + q(nya) => [ + q(0322), + q(0), + ], + q(nym) => [ + q(0323), + q(0), + ], + q(nyn) => [ + q(0324), + q(0), + ], + q(nyo) => [ + q(0325), + q(0), + ], + q(nzi) => [ + q(0326), + q(0), + ], + q(oci) => [ + q(0327), + q(0), + ], + q(oji) => [ + q(0328), + q(0), + ], + q(ori) => [ + q(0329), + q(0), + ], + q(orm) => [ + q(0330), + q(0), + ], + q(osa) => [ + q(0331), + q(0), + ], + q(oss) => [ + q(0332), + q(0), + ], + q(ota) => [ + q(0333), + q(0), + ], + q(oto) => [ + q(0334), + q(0), + ], + q(paa) => [ + q(0335), + q(0), + ], + q(pag) => [ + q(0336), + q(0), + ], + q(pal) => [ + q(0337), + q(0), + ], + q(pam) => [ + q(0338), + q(0), + ], + q(pan) => [ + q(0339), + q(0), + ], + q(pap) => [ + q(0340), + q(0), + ], + q(pau) => [ + q(0341), + q(0), + ], + q(peo) => [ + q(0342), + q(0), + ], + q(phi) => [ + q(0344), + q(0), + ], + q(phn) => [ + q(0345), + q(0), + ], + q(pli) => [ + q(0346), + q(0), + ], + q(pol) => [ + q(0347), + q(0), + ], + q(pon) => [ + q(0348), + q(0), + ], + q(por) => [ + q(0349), + q(0), + ], + q(pra) => [ + q(0350), + q(0), + ], + q(pro) => [ + q(0351), + q(0), + ], + q(pus) => [ + q(0352), + q(0), + ], + q(qtz) => [ + q(0353), + q(0), + ], + q(que) => [ + q(0354), + q(0), + ], + q(raj) => [ + q(0355), + q(0), + ], + q(rap) => [ + q(0356), + q(0), + ], + q(rar) => [ + q(0357), + q(0), + ], + q(roa) => [ + q(0358), + q(0), + ], + q(roh) => [ + q(0359), + q(0), + ], + q(rom) => [ + q(0360), + q(0), + ], + q(ron) => [ + q(0361), + q(0), + ], + q(run) => [ + q(0362), + q(0), + ], + q(rup) => [ + q(0363), + q(0), + ], + q(rus) => [ + q(0364), + q(0), + ], + q(sad) => [ + q(0365), + q(0), + ], + q(sag) => [ + q(0366), + q(0), + ], + q(sah) => [ + q(0367), + q(0), + ], + q(sai) => [ + q(0368), + q(0), + ], + q(sal) => [ + q(0369), + q(0), + ], + q(sam) => [ + q(0370), + q(0), + ], + q(san) => [ + q(0371), + q(0), + ], + q(sas) => [ + q(0372), + q(0), + ], + q(sat) => [ + q(0373), + q(0), + ], + q(scn) => [ + q(0374), + q(0), + ], + q(sco) => [ + q(0375), + q(0), + ], + q(sel) => [ + q(0376), + q(0), + ], + q(sem) => [ + q(0377), + q(0), + ], + q(sga) => [ + q(0378), + q(0), + ], + q(sgn) => [ + q(0379), + q(0), + ], + q(shn) => [ + q(0380), + q(0), + ], + q(sid) => [ + q(0381), + q(0), + ], + q(sin) => [ + q(0382), + q(0), + ], + q(sio) => [ + q(0383), + q(0), + ], + q(sit) => [ + q(0384), + q(0), + ], + q(sla) => [ + q(0385), + q(0), + ], + q(slk) => [ + q(0386), + q(0), + ], + q(slv) => [ + q(0387), + q(0), + ], + q(sma) => [ + q(0388), + q(0), + ], + q(sme) => [ + q(0389), + q(0), + ], + q(smi) => [ + q(0390), + q(0), + ], + q(smj) => [ + q(0391), + q(0), + ], + q(smn) => [ + q(0392), + q(0), + ], + q(smo) => [ + q(0393), + q(0), + ], + q(sms) => [ + q(0394), + q(0), + ], + q(sna) => [ + q(0395), + q(0), + ], + q(snd) => [ + q(0396), + q(0), + ], + q(snk) => [ + q(0397), + q(0), + ], + q(sog) => [ + q(0398), + q(0), + ], + q(som) => [ + q(0399), + q(0), + ], + q(son) => [ + q(0400), + q(0), + ], + q(sot) => [ + q(0401), + q(0), + ], + q(spa) => [ + q(0402), + q(0), + ], + q(sqi) => [ + q(0013), + q(0), + ], + q(srd) => [ + q(0403), + q(0), + ], + q(srn) => [ + q(0404), + q(0), + ], + q(srp) => [ + q(0405), + q(0), + ], + q(srr) => [ + q(0406), + q(0), + ], + q(ssa) => [ + q(0407), + q(0), + ], + q(ssw) => [ + q(0408), + q(0), + ], + q(suk) => [ + q(0409), + q(0), + ], + q(sun) => [ + q(0410), + q(0), + ], + q(sus) => [ + q(0411), + q(0), + ], + q(sux) => [ + q(0412), + q(0), + ], + q(swa) => [ + q(0413), + q(0), + ], + q(swe) => [ + q(0414), + q(0), + ], + q(syc) => [ + q(0415), + q(0), + ], + q(syr) => [ + q(0416), + q(0), + ], + q(tah) => [ + q(0417), + q(0), + ], + q(tai) => [ + q(0418), + q(0), + ], + q(tam) => [ + q(0419), + q(0), + ], + q(tat) => [ + q(0420), + q(0), + ], + q(tel) => [ + q(0421), + q(0), + ], + q(tem) => [ + q(0422), + q(0), + ], + q(ter) => [ + q(0423), + q(0), + ], + q(tet) => [ + q(0424), + q(0), + ], + q(tgk) => [ + q(0425), + q(0), + ], + q(tgl) => [ + q(0426), + q(0), + ], + q(tha) => [ + q(0427), + q(0), + ], + q(tig) => [ + q(0429), + q(0), + ], + q(tir) => [ + q(0430), + q(0), + ], + q(tiv) => [ + q(0431), + q(0), + ], + q(tkl) => [ + q(0432), + q(0), + ], + q(tlh) => [ + q(0433), + q(0), + ], + q(tli) => [ + q(0434), + q(0), + ], + q(tmh) => [ + q(0435), + q(0), + ], + q(tog) => [ + q(0436), + q(0), + ], + q(ton) => [ + q(0437), + q(0), + ], + q(tpi) => [ + q(0438), + q(0), + ], + q(tsi) => [ + q(0439), + q(0), + ], + q(tsn) => [ + q(0440), + q(0), + ], + q(tso) => [ + q(0441), + q(0), + ], + q(tuk) => [ + q(0442), + q(0), + ], + q(tum) => [ + q(0443), + q(0), + ], + q(tup) => [ + q(0444), + q(0), + ], + q(tur) => [ + q(0445), + q(0), + ], + q(tut) => [ + q(0446), + q(0), + ], + q(tvl) => [ + q(0447), + q(0), + ], + q(twi) => [ + q(0448), + q(0), + ], + q(tyv) => [ + q(0449), + q(0), + ], + q(udm) => [ + q(0450), + q(0), + ], + q(uga) => [ + q(0451), + q(0), + ], + q(uig) => [ + q(0452), + q(0), + ], + q(ukr) => [ + q(0453), + q(0), + ], + q(umb) => [ + q(0454), + q(0), + ], + q(und) => [ + q(0455), + q(0), + ], + q(urd) => [ + q(0456), + q(0), + ], + q(uzb) => [ + q(0457), + q(0), + ], + q(vai) => [ + q(0458), + q(0), + ], + q(ven) => [ + q(0459), + q(0), + ], + q(vie) => [ + q(0460), + q(0), + ], + q(vol) => [ + q(0461), + q(0), + ], + q(vot) => [ + q(0462), + q(0), + ], + q(wak) => [ + q(0463), + q(0), + ], + q(wal) => [ + q(0464), + q(0), + ], + q(war) => [ + q(0465), + q(0), + ], + q(was) => [ + q(0466), + q(0), + ], + q(wen) => [ + q(0468), + q(0), + ], + q(wln) => [ + q(0469), + q(0), + ], + q(wol) => [ + q(0470), + q(0), + ], + q(xal) => [ + q(0471), + q(0), + ], + q(xho) => [ + q(0472), + q(0), + ], + q(yao) => [ + q(0473), + q(0), + ], + q(yap) => [ + q(0474), + q(0), + ], + q(yid) => [ + q(0475), + q(0), + ], + q(yor) => [ + q(0476), + q(0), + ], + q(ypk) => [ + q(0477), + q(0), + ], + q(zap) => [ + q(0478), + q(0), + ], + q(zbl) => [ + q(0479), + q(0), + ], + q(zen) => [ + q(0480), + q(0), + ], + q(zgh) => [ + q(0481), + q(0), + ], + q(zha) => [ + q(0482), + q(0), + ], + q(zho) => [ + q(0079), + q(0), + ], + q(znd) => [ + q(0483), + q(0), + ], + q(zul) => [ + q(0484), + q(0), + ], + q(zun) => [ + q(0485), + q(0), + ], + q(zxx) => [ + q(0486), + q(0), + ], + q(zza) => [ + q(0487), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'language'}{'id2code'} = { + q(alpha-2) => { + q(0001) => q(aa), + q(0002) => q(ab), + q(0009) => q(af), + q(0011) => q(ak), + q(0013) => q(sq), + q(0017) => q(am), + q(0021) => q(ar), + q(0023) => q(an), + q(0024) => q(hy), + q(0029) => q(as), + q(0033) => q(av), + q(0034) => q(ae), + q(0036) => q(ay), + q(0037) => q(az), + q(0040) => q(ba), + q(0042) => q(bm), + q(0044) => q(eu), + q(0048) => q(be), + q(0050) => q(bn), + q(0053) => q(bh), + q(0056) => q(bi), + q(0059) => q(bs), + q(0061) => q(br), + q(0065) => q(bg), + q(0066) => q(my), + q(0071) => q(ca), + q(0075) => q(ch), + q(0077) => q(ce), + q(0079) => q(zh), + q(0086) => q(cu), + q(0087) => q(cv), + q(0092) => q(kw), + q(0093) => q(co), + q(0097) => q(cr), + q(0102) => q(cs), + q(0104) => q(da), + q(0111) => q(dv), + q(0117) => q(nl), + q(0119) => q(dz), + q(0124) => q(en), + q(0126) => q(eo), + q(0127) => q(et), + q(0128) => q(ee), + q(0131) => q(fo), + q(0133) => q(fj), + q(0135) => q(fi), + q(0138) => q(fr), + q(0143) => q(fy), + q(0144) => q(ff), + q(0150) => q(ka), + q(0151) => q(de), + q(0154) => q(gd), + q(0155) => q(ga), + q(0156) => q(gl), + q(0157) => q(gv), + q(0165) => q(el), + q(0166) => q(gn), + q(0168) => q(gu), + q(0171) => q(ht), + q(0172) => q(ha), + q(0174) => q(he), + q(0175) => q(hz), + q(0178) => q(hi), + q(0181) => q(ho), + q(0182) => q(hr), + q(0184) => q(hu), + q(0187) => q(ig), + q(0188) => q(is), + q(0189) => q(io), + q(0190) => q(ii), + q(0192) => q(iu), + q(0193) => q(ie), + q(0195) => q(ia), + q(0197) => q(id), + q(0200) => q(ik), + q(0203) => q(it), + q(0204) => q(jv), + q(0206) => q(ja), + q(0212) => q(kl), + q(0214) => q(kn), + q(0216) => q(ks), + q(0217) => q(kr), + q(0219) => q(kk), + q(0223) => q(km), + q(0225) => q(ki), + q(0226) => q(rw), + q(0227) => q(ky), + q(0230) => q(kv), + q(0231) => q(kg), + q(0232) => q(ko), + q(0239) => q(kj), + q(0241) => q(ku), + q(0246) => q(lo), + q(0247) => q(la), + q(0248) => q(lv), + q(0250) => q(li), + q(0251) => q(ln), + q(0252) => q(lt), + q(0255) => q(lb), + q(0257) => q(lu), + q(0258) => q(lg), + q(0263) => q(mk), + q(0266) => q(mh), + q(0269) => q(ml), + q(0271) => q(mi), + q(0273) => q(mr), + q(0275) => q(ms), + q(0284) => q(mg), + q(0285) => q(mt), + q(0290) => q(mn), + q(0302) => q(na), + q(0303) => q(nv), + q(0304) => q(nr), + q(0305) => q(nd), + q(0306) => q(ng), + q(0308) => q(ne), + q(0313) => q(nn), + q(0314) => q(nb), + q(0317) => q(no), + q(0322) => q(ny), + q(0327) => q(oc), + q(0328) => q(oj), + q(0329) => q(or), + q(0330) => q(om), + q(0332) => q(os), + q(0339) => q(pa), + q(0343) => q(fa), + q(0346) => q(pi), + q(0347) => q(pl), + q(0349) => q(pt), + q(0352) => q(ps), + q(0354) => q(qu), + q(0359) => q(rm), + q(0361) => q(ro), + q(0362) => q(rn), + q(0364) => q(ru), + q(0366) => q(sg), + q(0371) => q(sa), + q(0382) => q(si), + q(0386) => q(sk), + q(0387) => q(sl), + q(0389) => q(se), + q(0393) => q(sm), + q(0395) => q(sn), + q(0396) => q(sd), + q(0399) => q(so), + q(0401) => q(st), + q(0402) => q(es), + q(0403) => q(sc), + q(0405) => q(sr), + q(0408) => q(ss), + q(0410) => q(su), + q(0413) => q(sw), + q(0414) => q(sv), + q(0417) => q(ty), + q(0419) => q(ta), + q(0420) => q(tt), + q(0421) => q(te), + q(0425) => q(tg), + q(0426) => q(tl), + q(0427) => q(th), + q(0428) => q(bo), + q(0430) => q(ti), + q(0437) => q(to), + q(0440) => q(tn), + q(0441) => q(ts), + q(0442) => q(tk), + q(0445) => q(tr), + q(0448) => q(tw), + q(0452) => q(ug), + q(0453) => q(uk), + q(0456) => q(ur), + q(0457) => q(uz), + q(0459) => q(ve), + q(0460) => q(vi), + q(0461) => q(vo), + q(0467) => q(cy), + q(0469) => q(wa), + q(0470) => q(wo), + q(0472) => q(xh), + q(0475) => q(yi), + q(0476) => q(yo), + q(0482) => q(za), + q(0484) => q(zu), + q(0538) => q(sh), + }, + q(alpha-3) => { + q(0001) => q(aar), + q(0002) => q(abk), + q(0003) => q(ace), + q(0004) => q(ach), + q(0005) => q(ada), + q(0006) => q(ady), + q(0007) => q(afa), + q(0008) => q(afh), + q(0009) => q(afr), + q(0010) => q(ain), + q(0011) => q(aka), + q(0012) => q(akk), + q(0013) => q(alb), + q(0014) => q(ale), + q(0015) => q(alg), + q(0016) => q(alt), + q(0017) => q(amh), + q(0018) => q(ang), + q(0019) => q(anp), + q(0020) => q(apa), + q(0021) => q(ara), + q(0022) => q(arc), + q(0023) => q(arg), + q(0024) => q(arm), + q(0025) => q(arn), + q(0026) => q(arp), + q(0027) => q(art), + q(0028) => q(arw), + q(0029) => q(asm), + q(0030) => q(ast), + q(0031) => q(ath), + q(0032) => q(aus), + q(0033) => q(ava), + q(0034) => q(ave), + q(0035) => q(awa), + q(0036) => q(aym), + q(0037) => q(aze), + q(0038) => q(bad), + q(0039) => q(bai), + q(0040) => q(bak), + q(0041) => q(bal), + q(0042) => q(bam), + q(0043) => q(ban), + q(0044) => q(baq), + q(0045) => q(bas), + q(0046) => q(bat), + q(0047) => q(bej), + q(0048) => q(bel), + q(0049) => q(bem), + q(0050) => q(ben), + q(0051) => q(ber), + q(0052) => q(bho), + q(0053) => q(bih), + q(0054) => q(bik), + q(0055) => q(bin), + q(0056) => q(bis), + q(0057) => q(bla), + q(0058) => q(bnt), + q(0059) => q(bos), + q(0060) => q(bra), + q(0061) => q(bre), + q(0062) => q(btk), + q(0063) => q(bua), + q(0064) => q(bug), + q(0065) => q(bul), + q(0066) => q(bur), + q(0067) => q(byn), + q(0068) => q(cad), + q(0069) => q(cai), + q(0070) => q(car), + q(0071) => q(cat), + q(0072) => q(cau), + q(0073) => q(ceb), + q(0074) => q(cel), + q(0075) => q(cha), + q(0076) => q(chb), + q(0077) => q(che), + q(0078) => q(chg), + q(0079) => q(chi), + q(0080) => q(chk), + q(0081) => q(chm), + q(0082) => q(chn), + q(0083) => q(cho), + q(0084) => q(chp), + q(0085) => q(chr), + q(0086) => q(chu), + q(0087) => q(chv), + q(0088) => q(chy), + q(0089) => q(cmc), + q(0090) => q(cnr), + q(0091) => q(cop), + q(0092) => q(cor), + q(0093) => q(cos), + q(0094) => q(cpe), + q(0095) => q(cpf), + q(0096) => q(cpp), + q(0097) => q(cre), + q(0098) => q(crh), + q(0099) => q(crp), + q(0100) => q(csb), + q(0101) => q(cus), + q(0102) => q(cze), + q(0103) => q(dak), + q(0104) => q(dan), + q(0105) => q(dar), + q(0106) => q(day), + q(0107) => q(del), + q(0108) => q(den), + q(0109) => q(dgr), + q(0110) => q(din), + q(0111) => q(div), + q(0112) => q(doi), + q(0113) => q(dra), + q(0114) => q(dsb), + q(0115) => q(dua), + q(0116) => q(dum), + q(0117) => q(dut), + q(0118) => q(dyu), + q(0119) => q(dzo), + q(0120) => q(efi), + q(0121) => q(egy), + q(0122) => q(eka), + q(0123) => q(elx), + q(0124) => q(eng), + q(0125) => q(enm), + q(0126) => q(epo), + q(0127) => q(est), + q(0128) => q(ewe), + q(0129) => q(ewo), + q(0130) => q(fan), + q(0131) => q(fao), + q(0132) => q(fat), + q(0133) => q(fij), + q(0134) => q(fil), + q(0135) => q(fin), + q(0136) => q(fiu), + q(0137) => q(fon), + q(0138) => q(fre), + q(0139) => q(frm), + q(0140) => q(fro), + q(0141) => q(frr), + q(0142) => q(frs), + q(0143) => q(fry), + q(0144) => q(ful), + q(0145) => q(fur), + q(0146) => q(gaa), + q(0147) => q(gay), + q(0148) => q(gba), + q(0149) => q(gem), + q(0150) => q(geo), + q(0151) => q(ger), + q(0152) => q(gez), + q(0153) => q(gil), + q(0154) => q(gla), + q(0155) => q(gle), + q(0156) => q(glg), + q(0157) => q(glv), + q(0158) => q(gmh), + q(0159) => q(goh), + q(0160) => q(gon), + q(0161) => q(gor), + q(0162) => q(got), + q(0163) => q(grb), + q(0164) => q(grc), + q(0165) => q(gre), + q(0166) => q(grn), + q(0167) => q(gsw), + q(0168) => q(guj), + q(0169) => q(gwi), + q(0170) => q(hai), + q(0171) => q(hat), + q(0172) => q(hau), + q(0173) => q(haw), + q(0174) => q(heb), + q(0175) => q(her), + q(0176) => q(hil), + q(0177) => q(him), + q(0178) => q(hin), + q(0179) => q(hit), + q(0180) => q(hmn), + q(0181) => q(hmo), + q(0182) => q(hrv), + q(0183) => q(hsb), + q(0184) => q(hun), + q(0185) => q(hup), + q(0186) => q(iba), + q(0187) => q(ibo), + q(0188) => q(ice), + q(0189) => q(ido), + q(0190) => q(iii), + q(0191) => q(ijo), + q(0192) => q(iku), + q(0193) => q(ile), + q(0194) => q(ilo), + q(0195) => q(ina), + q(0196) => q(inc), + q(0197) => q(ind), + q(0198) => q(ine), + q(0199) => q(inh), + q(0200) => q(ipk), + q(0201) => q(ira), + q(0202) => q(iro), + q(0203) => q(ita), + q(0204) => q(jav), + q(0205) => q(jbo), + q(0206) => q(jpn), + q(0207) => q(jpr), + q(0208) => q(jrb), + q(0209) => q(kaa), + q(0210) => q(kab), + q(0211) => q(kac), + q(0212) => q(kal), + q(0213) => q(kam), + q(0214) => q(kan), + q(0215) => q(kar), + q(0216) => q(kas), + q(0217) => q(kau), + q(0218) => q(kaw), + q(0219) => q(kaz), + q(0220) => q(kbd), + q(0221) => q(kha), + q(0222) => q(khi), + q(0223) => q(khm), + q(0224) => q(kho), + q(0225) => q(kik), + q(0226) => q(kin), + q(0227) => q(kir), + q(0228) => q(kmb), + q(0229) => q(kok), + q(0230) => q(kom), + q(0231) => q(kon), + q(0232) => q(kor), + q(0233) => q(kos), + q(0234) => q(kpe), + q(0235) => q(krc), + q(0236) => q(krl), + q(0237) => q(kro), + q(0238) => q(kru), + q(0239) => q(kua), + q(0240) => q(kum), + q(0241) => q(kur), + q(0242) => q(kut), + q(0243) => q(lad), + q(0244) => q(lah), + q(0245) => q(lam), + q(0246) => q(lao), + q(0247) => q(lat), + q(0248) => q(lav), + q(0249) => q(lez), + q(0250) => q(lim), + q(0251) => q(lin), + q(0252) => q(lit), + q(0253) => q(lol), + q(0254) => q(loz), + q(0255) => q(ltz), + q(0256) => q(lua), + q(0257) => q(lub), + q(0258) => q(lug), + q(0259) => q(lui), + q(0260) => q(lun), + q(0261) => q(luo), + q(0262) => q(lus), + q(0263) => q(mac), + q(0264) => q(mad), + q(0265) => q(mag), + q(0266) => q(mah), + q(0267) => q(mai), + q(0268) => q(mak), + q(0269) => q(mal), + q(0270) => q(man), + q(0271) => q(mao), + q(0272) => q(map), + q(0273) => q(mar), + q(0274) => q(mas), + q(0275) => q(may), + q(0276) => q(mdf), + q(0277) => q(mdr), + q(0278) => q(men), + q(0279) => q(mga), + q(0280) => q(mic), + q(0281) => q(min), + q(0282) => q(mis), + q(0283) => q(mkh), + q(0284) => q(mlg), + q(0285) => q(mlt), + q(0286) => q(mnc), + q(0287) => q(mni), + q(0288) => q(mno), + q(0289) => q(moh), + q(0290) => q(mon), + q(0291) => q(mos), + q(0292) => q(mul), + q(0293) => q(mun), + q(0294) => q(mus), + q(0295) => q(mwl), + q(0296) => q(mwr), + q(0297) => q(myn), + q(0298) => q(myv), + q(0299) => q(nah), + q(0300) => q(nai), + q(0301) => q(nap), + q(0302) => q(nau), + q(0303) => q(nav), + q(0304) => q(nbl), + q(0305) => q(nde), + q(0306) => q(ndo), + q(0307) => q(nds), + q(0308) => q(nep), + q(0309) => q(new), + q(0310) => q(nia), + q(0311) => q(nic), + q(0312) => q(niu), + q(0313) => q(nno), + q(0314) => q(nob), + q(0315) => q(nog), + q(0316) => q(non), + q(0317) => q(nor), + q(0318) => q(nqo), + q(0319) => q(nso), + q(0320) => q(nub), + q(0321) => q(nwc), + q(0322) => q(nya), + q(0323) => q(nym), + q(0324) => q(nyn), + q(0325) => q(nyo), + q(0326) => q(nzi), + q(0327) => q(oci), + q(0328) => q(oji), + q(0329) => q(ori), + q(0330) => q(orm), + q(0331) => q(osa), + q(0332) => q(oss), + q(0333) => q(ota), + q(0334) => q(oto), + q(0335) => q(paa), + q(0336) => q(pag), + q(0337) => q(pal), + q(0338) => q(pam), + q(0339) => q(pan), + q(0340) => q(pap), + q(0341) => q(pau), + q(0342) => q(peo), + q(0343) => q(per), + q(0344) => q(phi), + q(0345) => q(phn), + q(0346) => q(pli), + q(0347) => q(pol), + q(0348) => q(pon), + q(0349) => q(por), + q(0350) => q(pra), + q(0351) => q(pro), + q(0352) => q(pus), + q(0353) => q(qtz), + q(0354) => q(que), + q(0355) => q(raj), + q(0356) => q(rap), + q(0357) => q(rar), + q(0358) => q(roa), + q(0359) => q(roh), + q(0360) => q(rom), + q(0361) => q(rum), + q(0362) => q(run), + q(0363) => q(rup), + q(0364) => q(rus), + q(0365) => q(sad), + q(0366) => q(sag), + q(0367) => q(sah), + q(0368) => q(sai), + q(0369) => q(sal), + q(0370) => q(sam), + q(0371) => q(san), + q(0372) => q(sas), + q(0373) => q(sat), + q(0374) => q(scn), + q(0375) => q(sco), + q(0376) => q(sel), + q(0377) => q(sem), + q(0378) => q(sga), + q(0379) => q(sgn), + q(0380) => q(shn), + q(0381) => q(sid), + q(0382) => q(sin), + q(0383) => q(sio), + q(0384) => q(sit), + q(0385) => q(sla), + q(0386) => q(slo), + q(0387) => q(slv), + q(0388) => q(sma), + q(0389) => q(sme), + q(0390) => q(smi), + q(0391) => q(smj), + q(0392) => q(smn), + q(0393) => q(smo), + q(0394) => q(sms), + q(0395) => q(sna), + q(0396) => q(snd), + q(0397) => q(snk), + q(0398) => q(sog), + q(0399) => q(som), + q(0400) => q(son), + q(0401) => q(sot), + q(0402) => q(spa), + q(0403) => q(srd), + q(0404) => q(srn), + q(0405) => q(srp), + q(0406) => q(srr), + q(0407) => q(ssa), + q(0408) => q(ssw), + q(0409) => q(suk), + q(0410) => q(sun), + q(0411) => q(sus), + q(0412) => q(sux), + q(0413) => q(swa), + q(0414) => q(swe), + q(0415) => q(syc), + q(0416) => q(syr), + q(0417) => q(tah), + q(0418) => q(tai), + q(0419) => q(tam), + q(0420) => q(tat), + q(0421) => q(tel), + q(0422) => q(tem), + q(0423) => q(ter), + q(0424) => q(tet), + q(0425) => q(tgk), + q(0426) => q(tgl), + q(0427) => q(tha), + q(0428) => q(tib), + q(0429) => q(tig), + q(0430) => q(tir), + q(0431) => q(tiv), + q(0432) => q(tkl), + q(0433) => q(tlh), + q(0434) => q(tli), + q(0435) => q(tmh), + q(0436) => q(tog), + q(0437) => q(ton), + q(0438) => q(tpi), + q(0439) => q(tsi), + q(0440) => q(tsn), + q(0441) => q(tso), + q(0442) => q(tuk), + q(0443) => q(tum), + q(0444) => q(tup), + q(0445) => q(tur), + q(0446) => q(tut), + q(0447) => q(tvl), + q(0448) => q(twi), + q(0449) => q(tyv), + q(0450) => q(udm), + q(0451) => q(uga), + q(0452) => q(uig), + q(0453) => q(ukr), + q(0454) => q(umb), + q(0455) => q(und), + q(0456) => q(urd), + q(0457) => q(uzb), + q(0458) => q(vai), + q(0459) => q(ven), + q(0460) => q(vie), + q(0461) => q(vol), + q(0462) => q(vot), + q(0463) => q(wak), + q(0464) => q(wal), + q(0465) => q(war), + q(0466) => q(was), + q(0467) => q(wel), + q(0468) => q(wen), + q(0469) => q(wln), + q(0470) => q(wol), + q(0471) => q(xal), + q(0472) => q(xho), + q(0473) => q(yao), + q(0474) => q(yap), + q(0475) => q(yid), + q(0476) => q(yor), + q(0477) => q(ypk), + q(0478) => q(zap), + q(0479) => q(zbl), + q(0480) => q(zen), + q(0481) => q(zgh), + q(0482) => q(zha), + q(0483) => q(znd), + q(0484) => q(zul), + q(0485) => q(zun), + q(0486) => q(zxx), + q(0487) => q(zza), + q(0488) => q(aav), + q(0489) => q(alv), + q(0490) => q(aqa), + q(0491) => q(aql), + q(0492) => q(auf), + q(0493) => q(awd), + q(0494) => q(azc), + q(0495) => q(cba), + q(0496) => q(ccn), + q(0497) => q(ccs), + q(0498) => q(cdc), + q(0499) => q(cdd), + q(0500) => q(csu), + q(0501) => q(dmn), + q(0502) => q(egx), + q(0503) => q(esx), + q(0504) => q(euq), + q(0505) => q(fox), + q(0506) => q(gme), + q(0507) => q(gmq), + q(0508) => q(gmw), + q(0509) => q(grk), + q(0510) => q(hmx), + q(0511) => q(hok), + q(0512) => q(hyx), + q(0513) => q(iir), + q(0514) => q(itc), + q(0515) => q(jpx), + q(0516) => q(kdo), + q(0517) => q(ngf), + q(0518) => q(omq), + q(0519) => q(omv), + q(0520) => q(plf), + q(0521) => q(poz), + q(0522) => q(pqe), + q(0523) => q(pqw), + q(0524) => q(qwe), + q(0525) => q(sdv), + q(0526) => q(sqj), + q(0527) => q(syd), + q(0528) => q(tbq), + q(0529) => q(trk), + q(0530) => q(tuw), + q(0531) => q(urj), + q(0532) => q(xgn), + q(0533) => q(xnd), + q(0534) => q(zhx), + q(0535) => q(zle), + q(0536) => q(zls), + q(0537) => q(zlw), + q(0539) => q(aaa), + q(0540) => q(aab), + q(0541) => q(aac), + q(0542) => q(aad), + q(0543) => q(aae), + q(0544) => q(aaf), + q(0545) => q(aag), + q(0546) => q(aah), + q(0547) => q(aai), + q(0548) => q(aak), + q(0549) => q(aal), + q(0550) => q(aan), + q(0551) => q(aao), + q(0552) => q(aap), + q(0553) => q(aaq), + q(0554) => q(aas), + q(0555) => q(aat), + q(0556) => q(aau), + q(0557) => q(aaw), + q(0558) => q(aax), + q(0559) => q(aaz), + q(0560) => q(aba), + q(0561) => q(abb), + q(0562) => q(abc), + q(0563) => q(abd), + q(0564) => q(abe), + q(0565) => q(abf), + q(0566) => q(abg), + q(0567) => q(abh), + q(0568) => q(abi), + q(0569) => q(abj), + q(0570) => q(abl), + q(0571) => q(abm), + q(0572) => q(abn), + q(0573) => q(abo), + q(0574) => q(abp), + q(0575) => q(abq), + q(0576) => q(abr), + q(0577) => q(abs), + q(0578) => q(abt), + q(0579) => q(abu), + q(0580) => q(abv), + q(0581) => q(abw), + q(0582) => q(abx), + q(0583) => q(aby), + q(0584) => q(abz), + q(0585) => q(aca), + q(0586) => q(acb), + q(0587) => q(acd), + q(0588) => q(acf), + q(0589) => q(aci), + q(0590) => q(ack), + q(0591) => q(acl), + q(0592) => q(acm), + q(0593) => q(acn), + q(0594) => q(acp), + q(0595) => q(acq), + q(0596) => q(acr), + q(0597) => q(acs), + q(0598) => q(act), + q(0599) => q(acu), + q(0600) => q(acv), + q(0601) => q(acw), + q(0602) => q(acx), + q(0603) => q(acy), + q(0604) => q(acz), + q(0605) => q(adb), + q(0606) => q(add), + q(0607) => q(ade), + q(0608) => q(adf), + q(0609) => q(adg), + q(0610) => q(adh), + q(0611) => q(adi), + q(0612) => q(adj), + q(0613) => q(adl), + q(0614) => q(adn), + q(0615) => q(ado), + q(0616) => q(adq), + q(0617) => q(adr), + q(0618) => q(ads), + q(0619) => q(adt), + q(0620) => q(adu), + q(0621) => q(adw), + q(0622) => q(adx), + q(0623) => q(adz), + q(0624) => q(aea), + q(0625) => q(aeb), + q(0626) => q(aec), + q(0627) => q(aed), + q(0628) => q(aee), + q(0629) => q(aek), + q(0630) => q(ael), + q(0631) => q(aem), + q(0632) => q(aen), + q(0633) => q(aeq), + q(0634) => q(aer), + q(0635) => q(aes), + q(0636) => q(aeu), + q(0637) => q(aew), + q(0638) => q(aey), + q(0639) => q(aez), + q(0640) => q(afb), + q(0641) => q(afd), + q(0642) => q(afe), + q(0643) => q(afg), + q(0644) => q(afi), + q(0645) => q(afk), + q(0646) => q(afn), + q(0647) => q(afo), + q(0648) => q(afp), + q(0649) => q(afs), + q(0650) => q(aft), + q(0651) => q(afu), + q(0652) => q(afz), + q(0653) => q(aga), + q(0654) => q(agb), + q(0655) => q(agc), + q(0656) => q(agd), + q(0657) => q(age), + q(0658) => q(agf), + q(0659) => q(agg), + q(0660) => q(agh), + q(0661) => q(agi), + q(0662) => q(agj), + q(0663) => q(agk), + q(0664) => q(agl), + q(0665) => q(agm), + q(0666) => q(agn), + q(0667) => q(ago), + q(0668) => q(agq), + q(0669) => q(agr), + q(0670) => q(ags), + q(0671) => q(agt), + q(0672) => q(agu), + q(0673) => q(agv), + q(0674) => q(agw), + q(0675) => q(agx), + q(0676) => q(agy), + q(0677) => q(agz), + q(0678) => q(aha), + q(0679) => q(ahb), + q(0680) => q(ahg), + q(0681) => q(ahh), + q(0682) => q(ahi), + q(0683) => q(ahk), + q(0684) => q(ahl), + q(0685) => q(ahm), + q(0686) => q(ahn), + q(0687) => q(aho), + q(0688) => q(ahp), + q(0689) => q(ahr), + q(0690) => q(ahs), + q(0691) => q(aht), + q(0692) => q(aia), + q(0693) => q(aib), + q(0694) => q(aic), + q(0695) => q(aid), + q(0696) => q(aie), + q(0697) => q(aif), + q(0698) => q(aig), + q(0699) => q(aih), + q(0700) => q(aii), + q(0701) => q(aij), + q(0702) => q(aik), + q(0703) => q(ail), + q(0704) => q(aim), + q(0705) => q(aio), + q(0706) => q(aip), + q(0707) => q(aiq), + q(0708) => q(air), + q(0709) => q(ais), + q(0710) => q(ait), + q(0711) => q(aiw), + q(0712) => q(aix), + q(0713) => q(aiy), + q(0714) => q(aja), + q(0715) => q(ajg), + q(0716) => q(aji), + q(0717) => q(ajn), + q(0718) => q(ajp), + q(0719) => q(ajt), + q(0720) => q(aju), + q(0721) => q(ajw), + q(0722) => q(ajz), + q(0723) => q(akb), + q(0724) => q(akc), + q(0725) => q(akd), + q(0726) => q(ake), + q(0727) => q(akf), + q(0728) => q(akg), + q(0729) => q(akh), + q(0730) => q(aki), + q(0731) => q(akj), + q(0732) => q(akl), + q(0733) => q(akm), + q(0734) => q(ako), + q(0735) => q(akp), + q(0736) => q(akq), + q(0737) => q(akr), + q(0738) => q(aks), + q(0739) => q(akt), + q(0740) => q(aku), + q(0741) => q(akv), + q(0742) => q(akw), + q(0743) => q(akx), + q(0744) => q(aky), + q(0745) => q(akz), + q(0746) => q(ala), + q(0747) => q(alc), + q(0748) => q(ald), + q(0749) => q(alf), + q(0750) => q(alh), + q(0751) => q(ali), + q(0752) => q(alj), + q(0753) => q(alk), + q(0754) => q(all), + q(0755) => q(alm), + q(0756) => q(aln), + q(0757) => q(alo), + q(0758) => q(alp), + q(0759) => q(alq), + q(0760) => q(alr), + q(0761) => q(als), + q(0762) => q(alu), + q(0763) => q(alw), + q(0764) => q(alx), + q(0765) => q(aly), + q(0766) => q(alz), + q(0767) => q(ama), + q(0768) => q(amb), + q(0769) => q(amc), + q(0770) => q(ame), + q(0771) => q(amf), + q(0772) => q(amg), + q(0773) => q(ami), + q(0774) => q(amj), + q(0775) => q(amk), + q(0776) => q(aml), + q(0777) => q(amm), + q(0778) => q(amn), + q(0779) => q(amo), + q(0780) => q(amp), + q(0781) => q(amq), + q(0782) => q(amr), + q(0783) => q(ams), + q(0784) => q(amt), + q(0785) => q(amu), + q(0786) => q(amv), + q(0787) => q(amw), + q(0788) => q(amx), + q(0789) => q(amy), + q(0790) => q(amz), + q(0791) => q(ana), + q(0792) => q(anb), + q(0793) => q(anc), + q(0794) => q(and), + q(0795) => q(ane), + q(0796) => q(anf), + q(0797) => q(anh), + q(0798) => q(ani), + q(0799) => q(anj), + q(0800) => q(ank), + q(0801) => q(anl), + q(0802) => q(anm), + q(0803) => q(ann), + q(0804) => q(ano), + q(0805) => q(anq), + q(0806) => q(anr), + q(0807) => q(ans), + q(0808) => q(ant), + q(0809) => q(anu), + q(0810) => q(anv), + q(0811) => q(anw), + q(0812) => q(anx), + q(0813) => q(any), + q(0814) => q(anz), + q(0815) => q(aoa), + q(0816) => q(aob), + q(0817) => q(aoc), + q(0818) => q(aod), + q(0819) => q(aoe), + q(0820) => q(aof), + q(0821) => q(aog), + q(0822) => q(aoh), + q(0823) => q(aoi), + q(0824) => q(aoj), + q(0825) => q(aok), + q(0826) => q(aol), + q(0827) => q(aom), + q(0828) => q(aon), + q(0829) => q(aor), + q(0830) => q(aos), + q(0831) => q(aot), + q(0832) => q(aou), + q(0833) => q(aox), + q(0834) => q(aoz), + q(0835) => q(apb), + q(0836) => q(apc), + q(0837) => q(apd), + q(0838) => q(ape), + q(0839) => q(apf), + q(0840) => q(apg), + q(0841) => q(aph), + q(0842) => q(api), + q(0843) => q(apj), + q(0844) => q(apk), + q(0845) => q(apl), + q(0846) => q(apm), + q(0847) => q(apn), + q(0848) => q(apo), + q(0849) => q(app), + q(0850) => q(apq), + q(0851) => q(apr), + q(0852) => q(aps), + q(0853) => q(apt), + q(0854) => q(apu), + q(0855) => q(apv), + q(0856) => q(apw), + q(0857) => q(apx), + q(0858) => q(apy), + q(0859) => q(apz), + q(0860) => q(aqc), + q(0861) => q(aqd), + q(0862) => q(aqg), + q(0863) => q(aqm), + q(0864) => q(aqn), + q(0865) => q(aqp), + q(0866) => q(aqr), + q(0867) => q(aqt), + q(0868) => q(aqz), + q(0869) => q(arb), + q(0870) => q(ard), + q(0871) => q(are), + q(0872) => q(arh), + q(0873) => q(ari), + q(0874) => q(arj), + q(0875) => q(ark), + q(0876) => q(arl), + q(0877) => q(aro), + q(0878) => q(arq), + q(0879) => q(arr), + q(0880) => q(ars), + q(0881) => q(aru), + q(0882) => q(arv), + q(0883) => q(arx), + q(0884) => q(ary), + q(0885) => q(arz), + q(0886) => q(asa), + q(0887) => q(asb), + q(0888) => q(asc), + q(0889) => q(asd), + q(0890) => q(ase), + q(0891) => q(asf), + q(0892) => q(asg), + q(0893) => q(ash), + q(0894) => q(asi), + q(0895) => q(asj), + q(0896) => q(ask), + q(0897) => q(asl), + q(0898) => q(asn), + q(0899) => q(aso), + q(0900) => q(asp), + q(0901) => q(asq), + q(0902) => q(asr), + q(0903) => q(ass), + q(0904) => q(asu), + q(0905) => q(asv), + q(0906) => q(asw), + q(0907) => q(asx), + q(0908) => q(asy), + q(0909) => q(asz), + q(0910) => q(ata), + q(0911) => q(atb), + q(0912) => q(atc), + q(0913) => q(atd), + q(0914) => q(ate), + q(0915) => q(atg), + q(0916) => q(ati), + q(0917) => q(atj), + q(0918) => q(atk), + q(0919) => q(atl), + q(0920) => q(atm), + q(0921) => q(atn), + q(0922) => q(ato), + q(0923) => q(atp), + q(0924) => q(atq), + q(0925) => q(atr), + q(0926) => q(ats), + q(0927) => q(att), + q(0928) => q(atu), + q(0929) => q(atv), + q(0930) => q(atw), + q(0931) => q(atx), + q(0932) => q(aty), + q(0933) => q(atz), + q(0934) => q(aua), + q(0935) => q(aub), + q(0936) => q(auc), + q(0937) => q(aud), + q(0938) => q(aug), + q(0939) => q(auh), + q(0940) => q(aui), + q(0941) => q(auj), + q(0942) => q(auk), + q(0943) => q(aul), + q(0944) => q(aum), + q(0945) => q(aun), + q(0946) => q(auo), + q(0947) => q(aup), + q(0948) => q(auq), + q(0949) => q(aur), + q(0950) => q(aut), + q(0951) => q(auu), + q(0952) => q(auw), + q(0953) => q(aux), + q(0954) => q(auy), + q(0955) => q(auz), + q(0956) => q(avb), + q(0957) => q(avd), + q(0958) => q(avi), + q(0959) => q(avk), + q(0960) => q(avl), + q(0961) => q(avm), + q(0962) => q(avn), + q(0963) => q(avo), + q(0964) => q(avs), + q(0965) => q(avt), + q(0966) => q(avu), + q(0967) => q(avv), + q(0968) => q(awb), + q(0969) => q(awc), + q(0970) => q(awe), + q(0971) => q(awg), + q(0972) => q(awh), + q(0973) => q(awi), + q(0974) => q(awk), + q(0975) => q(awm), + q(0976) => q(awn), + q(0977) => q(awo), + q(0978) => q(awr), + q(0979) => q(aws), + q(0980) => q(awt), + q(0981) => q(awu), + q(0982) => q(awv), + q(0983) => q(aww), + q(0984) => q(awx), + q(0985) => q(awy), + q(0986) => q(axb), + q(0987) => q(axe), + q(0988) => q(axg), + q(0989) => q(axk), + q(0990) => q(axl), + q(0991) => q(axm), + q(0992) => q(axx), + q(0993) => q(aya), + q(0994) => q(ayb), + q(0995) => q(ayc), + q(0996) => q(ayd), + q(0997) => q(aye), + q(0998) => q(ayg), + q(0999) => q(ayh), + q(1000) => q(ayi), + q(1001) => q(ayk), + q(1002) => q(ayl), + q(1003) => q(ayn), + q(1004) => q(ayo), + q(1005) => q(ayp), + q(1006) => q(ayq), + q(1007) => q(ayr), + q(1008) => q(ays), + q(1009) => q(ayt), + q(1010) => q(ayu), + q(1011) => q(ayy), + q(1012) => q(ayz), + q(1013) => q(aza), + q(1014) => q(azb), + q(1015) => q(azd), + q(1016) => q(azg), + q(1017) => q(azj), + q(1018) => q(azm), + q(1019) => q(azn), + q(1020) => q(azo), + q(1021) => q(azt), + q(1022) => q(azz), + q(1023) => q(baa), + q(1024) => q(bab), + q(1025) => q(bac), + q(1026) => q(bae), + q(1027) => q(baf), + q(1028) => q(bag), + q(1029) => q(bah), + q(1030) => q(baj), + q(1031) => q(bao), + q(1032) => q(bap), + q(1033) => q(bar), + q(1034) => q(bau), + q(1035) => q(bav), + q(1036) => q(baw), + q(1037) => q(bax), + q(1038) => q(bay), + q(1039) => q(bba), + q(1040) => q(bbb), + q(1041) => q(bbc), + q(1042) => q(bbd), + q(1043) => q(bbe), + q(1044) => q(bbf), + q(1045) => q(bbg), + q(1046) => q(bbh), + q(1047) => q(bbi), + q(1048) => q(bbj), + q(1049) => q(bbk), + q(1050) => q(bbl), + q(1051) => q(bbm), + q(1052) => q(bbn), + q(1053) => q(bbo), + q(1054) => q(bbp), + q(1055) => q(bbq), + q(1056) => q(bbr), + q(1057) => q(bbs), + q(1058) => q(bbt), + q(1059) => q(bbu), + q(1060) => q(bbv), + q(1061) => q(bbw), + q(1062) => q(bbx), + q(1063) => q(bby), + q(1064) => q(bbz), + q(1065) => q(bca), + q(1066) => q(bcb), + q(1067) => q(bcc), + q(1068) => q(bcd), + q(1069) => q(bce), + q(1070) => q(bcf), + q(1071) => q(bcg), + q(1072) => q(bch), + q(1073) => q(bci), + q(1074) => q(bcj), + q(1075) => q(bck), + q(1076) => q(bcl), + q(1077) => q(bcm), + q(1078) => q(bcn), + q(1079) => q(bco), + q(1080) => q(bcp), + q(1081) => q(bcq), + q(1082) => q(bcr), + q(1083) => q(bcs), + q(1084) => q(bct), + q(1085) => q(bcu), + q(1086) => q(bcv), + q(1087) => q(bcw), + q(1088) => q(bcy), + q(1089) => q(bcz), + q(1090) => q(bda), + q(1091) => q(bdb), + q(1092) => q(bdc), + q(1093) => q(bdd), + q(1094) => q(bde), + q(1095) => q(bdf), + q(1096) => q(bdg), + q(1097) => q(bdh), + q(1098) => q(bdi), + q(1099) => q(bdj), + q(1100) => q(bdk), + q(1101) => q(bdl), + q(1102) => q(bdm), + q(1103) => q(bdn), + q(1104) => q(bdo), + q(1105) => q(bdp), + q(1106) => q(bdq), + q(1107) => q(bdr), + q(1108) => q(bds), + q(1109) => q(bdt), + q(1110) => q(bdu), + q(1111) => q(bdv), + q(1112) => q(bdw), + q(1113) => q(bdx), + q(1114) => q(bdy), + q(1115) => q(bdz), + q(1116) => q(bea), + q(1117) => q(beb), + q(1118) => q(bec), + q(1119) => q(bed), + q(1120) => q(bee), + q(1121) => q(bef), + q(1122) => q(beg), + q(1123) => q(beh), + q(1124) => q(bei), + q(1125) => q(bek), + q(1126) => q(beo), + q(1127) => q(bep), + q(1128) => q(beq), + q(1129) => q(bes), + q(1130) => q(bet), + q(1131) => q(beu), + q(1132) => q(bev), + q(1133) => q(bew), + q(1134) => q(bex), + q(1135) => q(bey), + q(1136) => q(bez), + q(1137) => q(mot), + q(1138) => q(bfb), + q(1139) => q(bfc), + q(1140) => q(bfd), + q(1141) => q(bfe), + q(1142) => q(bff), + q(1143) => q(bfg), + q(1144) => q(bfh), + q(1145) => q(bfi), + q(1146) => q(bfj), + q(1147) => q(bfk), + q(1148) => q(bfl), + q(1149) => q(bfm), + q(1150) => q(bfn), + q(1151) => q(bfo), + q(1152) => q(bfp), + q(1153) => q(bfq), + q(1154) => q(bfr), + q(1155) => q(bfs), + q(1156) => q(bft), + q(1157) => q(bfu), + q(1158) => q(bfw), + q(1159) => q(bfx), + q(1160) => q(bfy), + q(1161) => q(bfz), + q(1162) => q(bga), + q(1163) => q(bgb), + q(1164) => q(bgc), + q(1165) => q(bgd), + q(1166) => q(bge), + q(1167) => q(bgf), + q(1168) => q(bgg), + q(1169) => q(bgi), + q(1170) => q(bgj), + q(1171) => q(bgk), + q(1172) => q(bgl), + q(1173) => q(bgn), + q(1174) => q(bgo), + q(1175) => q(bgp), + q(1176) => q(bgq), + q(1177) => q(bgr), + q(1178) => q(bgs), + q(1179) => q(bgt), + q(1180) => q(bgu), + q(1181) => q(bgv), + q(1182) => q(bgw), + q(1183) => q(bgx), + q(1184) => q(bgy), + q(1185) => q(bgz), + q(1186) => q(bha), + q(1187) => q(bhb), + q(1188) => q(bhc), + q(1189) => q(bhd), + q(1190) => q(bhe), + q(1191) => q(bhf), + q(1192) => q(bhg), + q(1193) => q(bhh), + q(1194) => q(bhi), + q(1195) => q(bhj), + q(1196) => q(bhl), + q(1197) => q(bhm), + q(1198) => q(bhn), + q(1199) => q(bhp), + q(1200) => q(bhq), + q(1201) => q(bhr), + q(1202) => q(bhs), + q(1203) => q(bht), + q(1204) => q(bhu), + q(1205) => q(bhv), + q(1206) => q(bhw), + q(1207) => q(bhx), + q(1208) => q(bhy), + q(1209) => q(bhz), + q(1210) => q(bia), + q(1211) => q(bib), + q(1212) => q(bic), + q(1213) => q(bid), + q(1214) => q(bie), + q(1215) => q(bif), + q(1216) => q(big), + q(1217) => q(bij), + q(1218) => q(bil), + q(1219) => q(bim), + q(1220) => q(bio), + q(1221) => q(bip), + q(1222) => q(biq), + q(1223) => q(bir), + q(1224) => q(bit), + q(1225) => q(biu), + q(1226) => q(biv), + q(1227) => q(biw), + q(1228) => q(bix), + q(1229) => q(biy), + q(1230) => q(biz), + q(1231) => q(bja), + q(1232) => q(bjb), + q(1233) => q(bjc), + q(1234) => q(bje), + q(1235) => q(bjf), + q(1236) => q(bjg), + q(1237) => q(bjh), + q(1238) => q(bji), + q(1239) => q(bjj), + q(1240) => q(bjk), + q(1241) => q(bjl), + q(1242) => q(bjm), + q(1243) => q(bjn), + q(1244) => q(bjo), + q(1245) => q(bjp), + q(1246) => q(bjr), + q(1247) => q(bjs), + q(1248) => q(bjt), + q(1249) => q(bju), + q(1250) => q(bjv), + q(1251) => q(bjw), + q(1252) => q(bjx), + q(1253) => q(bjy), + q(1254) => q(bjz), + q(1255) => q(bka), + q(1256) => q(bkc), + q(1257) => q(bkd), + q(1258) => q(bkf), + q(1259) => q(bkg), + q(1260) => q(bkh), + q(1261) => q(bki), + q(1262) => q(bkj), + q(1263) => q(bkk), + q(1264) => q(bkl), + q(1265) => q(bkm), + q(1266) => q(bkn), + q(1267) => q(bko), + q(1268) => q(bkp), + q(1269) => q(bkq), + q(1270) => q(bkr), + q(1271) => q(bks), + q(1272) => q(bkt), + q(1273) => q(bku), + q(1274) => q(bkv), + q(1275) => q(bkw), + q(1276) => q(bkx), + q(1277) => q(bky), + q(1278) => q(bkz), + q(1279) => q(blb), + q(1280) => q(blc), + q(1281) => q(bld), + q(1282) => q(ble), + q(1283) => q(blf), + q(1284) => q(blg), + q(1285) => q(blh), + q(1286) => q(bli), + q(1287) => q(blj), + q(1288) => q(blk), + q(1289) => q(bll), + q(1290) => q(blm), + q(1291) => q(bln), + q(1292) => q(blo), + q(1293) => q(blp), + q(1294) => q(blq), + q(1295) => q(blr), + q(1296) => q(bls), + q(1297) => q(blt), + q(1298) => q(blv), + q(1299) => q(blw), + q(1300) => q(blx), + q(1301) => q(bly), + q(1302) => q(blz), + q(1303) => q(bma), + q(1304) => q(bmb), + q(1305) => q(bmc), + q(1306) => q(bmd), + q(1307) => q(bme), + q(1308) => q(bmf), + q(1309) => q(bmg), + q(1310) => q(bmh), + q(1311) => q(bmi), + q(1312) => q(bmj), + q(1313) => q(bmk), + q(1314) => q(bml), + q(1315) => q(bmm), + q(1316) => q(bmn), + q(1317) => q(bmo), + q(1318) => q(bmp), + q(1319) => q(bmq), + q(1320) => q(bmr), + q(1321) => q(bms), + q(1322) => q(bmt), + q(1323) => q(bmu), + q(1324) => q(bmv), + q(1325) => q(bmw), + q(1326) => q(bmx), + q(1327) => q(bmz), + q(1328) => q(bna), + q(1329) => q(bnb), + q(1330) => q(bnc), + q(1331) => q(bnd), + q(1332) => q(bne), + q(1333) => q(bnf), + q(1334) => q(bng), + q(1335) => q(bni), + q(1336) => q(bnj), + q(1337) => q(bnk), + q(1338) => q(bnl), + q(1339) => q(bnm), + q(1340) => q(bnn), + q(1341) => q(bno), + q(1342) => q(bnp), + q(1343) => q(bnq), + q(1344) => q(bnr), + q(1345) => q(bns), + q(1346) => q(bnu), + q(1347) => q(bnv), + q(1348) => q(bnw), + q(1349) => q(bnx), + q(1350) => q(bny), + q(1351) => q(bnz), + q(1352) => q(boa), + q(1353) => q(bob), + q(1354) => q(boe), + q(1355) => q(bof), + q(1356) => q(bog), + q(1357) => q(boh), + q(1358) => q(boi), + q(1359) => q(boj), + q(1360) => q(bok), + q(1361) => q(bol), + q(1362) => q(bom), + q(1363) => q(bon), + q(1364) => q(boo), + q(1365) => q(bop), + q(1366) => q(boq), + q(1367) => q(bor), + q(1368) => q(bot), + q(1369) => q(bou), + q(1370) => q(bov), + q(1371) => q(bow), + q(1372) => q(box), + q(1373) => q(boy), + q(1374) => q(boz), + q(1375) => q(bpa), + q(1376) => q(bpb), + q(1377) => q(bpd), + q(1378) => q(bpg), + q(1379) => q(bph), + q(1380) => q(bpi), + q(1381) => q(bpj), + q(1382) => q(bpk), + q(1383) => q(bpl), + q(1384) => q(bpm), + q(1385) => q(bpn), + q(1386) => q(bpo), + q(1387) => q(bpp), + q(1388) => q(bpq), + q(1389) => q(bpr), + q(1390) => q(bps), + q(1391) => q(bpt), + q(1392) => q(bpu), + q(1393) => q(bpv), + q(1394) => q(bpw), + q(1395) => q(bpx), + q(1396) => q(bpy), + q(1397) => q(bpz), + q(1398) => q(bqa), + q(1399) => q(bqb), + q(1400) => q(bqc), + q(1401) => q(bqd), + q(1402) => q(bqf), + q(1403) => q(bqg), + q(1404) => q(bqh), + q(1405) => q(bqi), + q(1406) => q(bqj), + q(1407) => q(bqk), + q(1408) => q(bql), + q(1409) => q(bqm), + q(1410) => q(bqn), + q(1411) => q(bqo), + q(1412) => q(bqp), + q(1413) => q(bqq), + q(1414) => q(bqr), + q(1415) => q(bqs), + q(1416) => q(bqt), + q(1417) => q(bqu), + q(1418) => q(bqv), + q(1419) => q(bqw), + q(1420) => q(bqx), + q(1421) => q(bqy), + q(1422) => q(bqz), + q(1423) => q(brb), + q(1424) => q(brc), + q(1425) => q(brd), + q(1426) => q(brf), + q(1427) => q(brg), + q(1428) => q(brh), + q(1429) => q(bri), + q(1430) => q(brj), + q(1431) => q(brk), + q(1432) => q(brl), + q(1433) => q(brm), + q(1434) => q(brn), + q(1435) => q(bro), + q(1436) => q(brp), + q(1437) => q(brq), + q(1438) => q(brr), + q(1439) => q(brs), + q(1440) => q(brt), + q(1441) => q(bru), + q(1442) => q(brv), + q(1443) => q(brw), + q(1444) => q(brx), + q(1445) => q(bry), + q(1446) => q(brz), + q(1447) => q(bsa), + q(1448) => q(bsb), + q(1449) => q(bsc), + q(1450) => q(bse), + q(1451) => q(bsf), + q(1452) => q(bsg), + q(1453) => q(bsh), + q(1454) => q(bsi), + q(1455) => q(bsj), + q(1456) => q(bsk), + q(1457) => q(bsl), + q(1458) => q(bsm), + q(1459) => q(bsn), + q(1460) => q(bso), + q(1461) => q(bsp), + q(1462) => q(bsq), + q(1463) => q(bsr), + q(1464) => q(bss), + q(1465) => q(bst), + q(1466) => q(bsu), + q(1467) => q(bsv), + q(1468) => q(bsw), + q(1469) => q(bsx), + q(1470) => q(bsy), + q(1471) => q(bta), + q(1472) => q(btc), + q(1473) => q(btd), + q(1474) => q(bte), + q(1475) => q(btf), + q(1476) => q(btg), + q(1477) => q(bth), + q(1478) => q(bti), + q(1479) => q(btj), + q(1480) => q(btm), + q(1481) => q(btn), + q(1482) => q(bto), + q(1483) => q(btp), + q(1484) => q(btq), + q(1485) => q(btr), + q(1486) => q(bts), + q(1487) => q(btt), + q(1488) => q(btu), + q(1489) => q(btv), + q(1490) => q(btw), + q(1491) => q(btx), + q(1492) => q(bty), + q(1493) => q(btz), + q(1494) => q(bub), + q(1495) => q(buc), + q(1496) => q(bud), + q(1497) => q(bue), + q(1498) => q(buf), + q(1499) => q(buh), + q(1500) => q(bui), + q(1501) => q(buj), + q(1502) => q(buk), + q(1503) => q(bum), + q(1504) => q(bun), + q(1505) => q(buo), + q(1506) => q(bup), + q(1507) => q(buq), + q(1508) => q(bus), + q(1509) => q(but), + q(1510) => q(buu), + q(1511) => q(buv), + q(1512) => q(buw), + q(1513) => q(bux), + q(1514) => q(buy), + q(1515) => q(buz), + q(1516) => q(bva), + q(1517) => q(bvb), + q(1518) => q(bvc), + q(1519) => q(bvd), + q(1520) => q(bve), + q(1521) => q(bvf), + q(1522) => q(bvg), + q(1523) => q(bvh), + q(1524) => q(bvi), + q(1525) => q(bvj), + q(1526) => q(bvk), + q(1527) => q(bvl), + q(1528) => q(bvm), + q(1529) => q(bvn), + q(1530) => q(bvo), + q(1531) => q(bvp), + q(1532) => q(bvq), + q(1533) => q(bvr), + q(1534) => q(bvt), + q(1535) => q(bvu), + q(1536) => q(bvv), + q(1537) => q(bvw), + q(1538) => q(bvx), + q(1539) => q(bvy), + q(1540) => q(bvz), + q(1541) => q(bwa), + q(1542) => q(bwb), + q(1543) => q(bwc), + q(1544) => q(bwd), + q(1545) => q(bwe), + q(1546) => q(bwf), + q(1547) => q(bwg), + q(1548) => q(bwh), + q(1549) => q(bwi), + q(1550) => q(bwj), + q(1551) => q(bwk), + q(1552) => q(bwl), + q(1553) => q(bwm), + q(1554) => q(bwn), + q(1555) => q(bwo), + q(1556) => q(bwp), + q(1557) => q(bwq), + q(1558) => q(bwr), + q(1559) => q(bws), + q(1560) => q(bwt), + q(1561) => q(bwu), + q(1562) => q(bww), + q(1563) => q(bwx), + q(1564) => q(bwy), + q(1565) => q(bwz), + q(1566) => q(bxa), + q(1567) => q(bxb), + q(1568) => q(bxc), + q(1569) => q(bxd), + q(1570) => q(bxe), + q(1571) => q(bxf), + q(1572) => q(bxg), + q(1573) => q(bxh), + q(1574) => q(bxi), + q(1575) => q(bxj), + q(1576) => q(bxk), + q(1577) => q(bxl), + q(1578) => q(bxm), + q(1579) => q(bxn), + q(1580) => q(bxo), + q(1581) => q(bxp), + q(1582) => q(bxq), + q(1583) => q(bxr), + q(1584) => q(bxs), + q(1585) => q(bxu), + q(1586) => q(bxv), + q(1587) => q(bxw), + q(1588) => q(bxz), + q(1589) => q(bya), + q(1590) => q(byb), + q(1591) => q(byc), + q(1592) => q(byd), + q(1593) => q(bye), + q(1594) => q(byf), + q(1595) => q(byg), + q(1596) => q(byh), + q(1597) => q(byi), + q(1598) => q(byj), + q(1599) => q(byk), + q(1600) => q(byl), + q(1601) => q(bym), + q(1602) => q(byo), + q(1603) => q(byp), + q(1604) => q(byq), + q(1605) => q(byr), + q(1606) => q(bys), + q(1607) => q(byt), + q(1608) => q(byv), + q(1609) => q(byw), + q(1610) => q(byx), + q(1611) => q(byz), + q(1612) => q(bza), + q(1613) => q(bzb), + q(1614) => q(bzc), + q(1615) => q(bzd), + q(1616) => q(bze), + q(1617) => q(bzf), + q(1618) => q(bzg), + q(1619) => q(bzh), + q(1620) => q(bzi), + q(1621) => q(bzj), + q(1622) => q(bzk), + q(1623) => q(bzl), + q(1624) => q(bzm), + q(1625) => q(bzn), + q(1626) => q(bzo), + q(1627) => q(bzp), + q(1628) => q(bzq), + q(1629) => q(bzr), + q(1630) => q(bzs), + q(1631) => q(bzt), + q(1632) => q(bzu), + q(1633) => q(bzv), + q(1634) => q(bzw), + q(1635) => q(bzx), + q(1636) => q(bzy), + q(1637) => q(bzz), + q(1638) => q(caa), + q(1639) => q(cab), + q(1640) => q(cac), + q(1641) => q(cae), + q(1642) => q(caf), + q(1643) => q(cag), + q(1644) => q(cah), + q(1645) => q(caj), + q(1646) => q(cak), + q(1647) => q(cal), + q(1648) => q(cam), + q(1649) => q(can), + q(1650) => q(cao), + q(1651) => q(cap), + q(1652) => q(caq), + q(1653) => q(cas), + q(1654) => q(cav), + q(1655) => q(caw), + q(1656) => q(cax), + q(1657) => q(cay), + q(1658) => q(caz), + q(1659) => q(cbb), + q(1660) => q(cbc), + q(1661) => q(cbd), + q(1662) => q(cbg), + q(1663) => q(cbi), + q(1664) => q(cbj), + q(1665) => q(cbk), + q(1666) => q(cbl), + q(1667) => q(cbn), + q(1668) => q(cbo), + q(1669) => q(cbq), + q(1670) => q(cbr), + q(1671) => q(cbs), + q(1672) => q(cbt), + q(1673) => q(cbu), + q(1674) => q(cbv), + q(1675) => q(cbw), + q(1676) => q(cby), + q(1677) => q(cca), + q(1678) => q(ccc), + q(1679) => q(ccd), + q(1680) => q(cce), + q(1681) => q(ccg), + q(1682) => q(cch), + q(1683) => q(ccj), + q(1684) => q(ccl), + q(1685) => q(ccm), + q(1686) => q(cco), + q(1687) => q(ccp), + q(1688) => q(ccr), + q(1689) => q(cda), + q(1690) => q(cde), + q(1691) => q(cdf), + q(1692) => q(cdg), + q(1693) => q(cdh), + q(1694) => q(cdi), + q(1695) => q(cdj), + q(1696) => q(cdm), + q(1697) => q(cdn), + q(1698) => q(cdo), + q(1699) => q(cdr), + q(1700) => q(cds), + q(1701) => q(cdy), + q(1702) => q(cdz), + q(1703) => q(cea), + q(1704) => q(ceg), + q(1705) => q(cek), + q(1706) => q(cen), + q(1707) => q(cet), + q(1708) => q(cfa), + q(1709) => q(cfd), + q(1710) => q(cfg), + q(1711) => q(cfm), + q(1712) => q(cga), + q(1713) => q(cgc), + q(1714) => q(cgg), + q(1715) => q(cgk), + q(1716) => q(chc), + q(1717) => q(chd), + q(1718) => q(chf), + q(1719) => q(chh), + q(1720) => q(chj), + q(1721) => q(chl), + q(1722) => q(chq), + q(1723) => q(cht), + q(1724) => q(chw), + q(1725) => q(chx), + q(1726) => q(chz), + q(1727) => q(cia), + q(1728) => q(cib), + q(1729) => q(cic), + q(1730) => q(cid), + q(1731) => q(cie), + q(1732) => q(cih), + q(1733) => q(cik), + q(1734) => q(cim), + q(1735) => q(cin), + q(1736) => q(cip), + q(1737) => q(cir), + q(1738) => q(ciw), + q(1739) => q(ciy), + q(1740) => q(cja), + q(1741) => q(cje), + q(1742) => q(cjh), + q(1743) => q(cji), + q(1744) => q(cjk), + q(1745) => q(cjm), + q(1746) => q(cjn), + q(1747) => q(cjo), + q(1748) => q(cjp), + q(1749) => q(cjs), + q(1750) => q(cjv), + q(1751) => q(cjy), + q(1752) => q(ckb), + q(1753) => q(ckh), + q(1754) => q(ckl), + q(1755) => q(ckn), + q(1756) => q(cko), + q(1757) => q(ckq), + q(1758) => q(ckr), + q(1759) => q(cks), + q(1760) => q(ckt), + q(1761) => q(cku), + q(1762) => q(ckv), + q(1763) => q(ckx), + q(1764) => q(cky), + q(1765) => q(ckz), + q(1766) => q(cla), + q(1767) => q(clc), + q(1768) => q(cld), + q(1769) => q(cle), + q(1770) => q(clh), + q(1771) => q(cli), + q(1772) => q(clj), + q(1773) => q(clk), + q(1774) => q(cll), + q(1775) => q(clm), + q(1776) => q(clo), + q(1777) => q(clt), + q(1778) => q(clu), + q(1779) => q(clw), + q(1780) => q(cly), + q(1781) => q(cma), + q(1782) => q(cme), + q(1783) => q(cmg), + q(1784) => q(cmi), + q(1785) => q(cml), + q(1786) => q(cmm), + q(1787) => q(cmn), + q(1788) => q(cmo), + q(1789) => q(cmr), + q(1790) => q(cms), + q(1791) => q(cmt), + q(1792) => q(cna), + q(1793) => q(cnb), + q(1794) => q(cnc), + q(1795) => q(cng), + q(1796) => q(cnh), + q(1797) => q(cni), + q(1798) => q(cnk), + q(1799) => q(cnl), + q(1800) => q(cno), + q(1801) => q(cns), + q(1802) => q(cnt), + q(1803) => q(cnu), + q(1804) => q(cnw), + q(1805) => q(cnx), + q(1806) => q(coa), + q(1807) => q(cob), + q(1808) => q(coc), + q(1809) => q(cod), + q(1810) => q(coe), + q(1811) => q(cof), + q(1812) => q(cog), + q(1813) => q(coh), + q(1814) => q(coj), + q(1815) => q(cok), + q(1816) => q(col), + q(1817) => q(com), + q(1818) => q(con), + q(1819) => q(coo), + q(1820) => q(coq), + q(1821) => q(cot), + q(1822) => q(cou), + q(1823) => q(cov), + q(1824) => q(cow), + q(1825) => q(cox), + q(1826) => q(coz), + q(1827) => q(cpa), + q(1828) => q(cpb), + q(1829) => q(cpc), + q(1830) => q(cpg), + q(1831) => q(cpi), + q(1832) => q(cpn), + q(1833) => q(cpo), + q(1834) => q(cps), + q(1835) => q(cpu), + q(1836) => q(cpx), + q(1837) => q(cpy), + q(1838) => q(cqd), + q(1839) => q(cra), + q(1840) => q(crb), + q(1841) => q(crc), + q(1842) => q(crd), + q(1843) => q(crf), + q(1844) => q(crg), + q(1845) => q(cri), + q(1846) => q(crj), + q(1847) => q(crk), + q(1848) => q(crl), + q(1849) => q(crm), + q(1850) => q(crn), + q(1851) => q(cro), + q(1852) => q(crq), + q(1853) => q(crr), + q(1854) => q(crs), + q(1855) => q(crt), + q(1856) => q(crv), + q(1857) => q(crw), + q(1858) => q(crx), + q(1859) => q(cry), + q(1860) => q(crz), + q(1861) => q(csa), + q(1862) => q(csc), + q(1863) => q(csd), + q(1864) => q(cse), + q(1865) => q(csf), + q(1866) => q(csg), + q(1867) => q(csh), + q(1868) => q(csi), + q(1869) => q(csj), + q(1870) => q(csk), + q(1871) => q(csl), + q(1872) => q(csm), + q(1873) => q(csn), + q(1874) => q(cso), + q(1875) => q(csq), + q(1876) => q(csr), + q(1877) => q(css), + q(1878) => q(cst), + q(1879) => q(csv), + q(1880) => q(csw), + q(1881) => q(csy), + q(1882) => q(csz), + q(1883) => q(cta), + q(1884) => q(ctc), + q(1885) => q(ctd), + q(1886) => q(cte), + q(1887) => q(ctg), + q(1888) => q(cth), + q(1889) => q(ctl), + q(1890) => q(ctm), + q(1891) => q(ctn), + q(1892) => q(cto), + q(1893) => q(ctp), + q(1894) => q(cts), + q(1895) => q(ctt), + q(1896) => q(ctu), + q(1897) => q(ctz), + q(1898) => q(cua), + q(1899) => q(cub), + q(1900) => q(cuc), + q(1901) => q(cug), + q(1902) => q(cuh), + q(1903) => q(cui), + q(1904) => q(cuj), + q(1905) => q(cuk), + q(1906) => q(cul), + q(1907) => q(cuo), + q(1908) => q(cup), + q(1909) => q(cuq), + q(1910) => q(cur), + q(1911) => q(cut), + q(1912) => q(cuu), + q(1913) => q(cuv), + q(1914) => q(cuw), + q(1915) => q(cux), + q(1916) => q(cvg), + q(1917) => q(cvn), + q(1918) => q(cwa), + q(1919) => q(cwb), + q(1920) => q(cwd), + q(1921) => q(cwe), + q(1922) => q(cwg), + q(1923) => q(cwt), + q(1924) => q(cya), + q(1925) => q(cyb), + q(1926) => q(cyo), + q(1927) => q(czh), + q(1928) => q(czk), + q(1929) => q(czn), + q(1930) => q(czo), + q(1931) => q(czt), + q(1932) => q(daa), + q(1933) => q(dac), + q(1934) => q(dad), + q(1935) => q(dae), + q(1936) => q(dag), + q(1937) => q(dah), + q(1938) => q(dai), + q(1939) => q(daj), + q(1940) => q(dal), + q(1941) => q(dam), + q(1942) => q(dao), + q(1943) => q(daq), + q(1944) => q(das), + q(1945) => q(dau), + q(1946) => q(dav), + q(1947) => q(daw), + q(1948) => q(dax), + q(1949) => q(daz), + q(1950) => q(dba), + q(1951) => q(dbb), + q(1952) => q(dbd), + q(1953) => q(dbe), + q(1954) => q(dbf), + q(1955) => q(dbg), + q(1956) => q(dbi), + q(1957) => q(dbj), + q(1958) => q(dbl), + q(1959) => q(dbm), + q(1960) => q(dbn), + q(1961) => q(dbo), + q(1962) => q(dbp), + q(1963) => q(dbq), + q(1964) => q(dbr), + q(1965) => q(dbt), + q(1966) => q(dbu), + q(1967) => q(dbv), + q(1968) => q(dbw), + q(1969) => q(dby), + q(1970) => q(dcc), + q(1971) => q(dcr), + q(1972) => q(dda), + q(1973) => q(ddd), + q(1974) => q(dde), + q(1975) => q(ddg), + q(1976) => q(ddi), + q(1977) => q(ddj), + q(1978) => q(ddn), + q(1979) => q(ddo), + q(1980) => q(ddr), + q(1981) => q(dds), + q(1982) => q(ddw), + q(1983) => q(dec), + q(1984) => q(ded), + q(1985) => q(dee), + q(1986) => q(def), + q(1987) => q(deg), + q(1988) => q(deh), + q(1989) => q(dei), + q(1990) => q(dek), + q(1991) => q(dem), + q(1992) => q(dep), + q(1993) => q(deq), + q(1994) => q(der), + q(1995) => q(des), + q(1996) => q(dev), + q(1997) => q(dez), + q(1998) => q(dga), + q(1999) => q(dgb), + q(2000) => q(dgc), + q(2001) => q(dgd), + q(2002) => q(dge), + q(2003) => q(dgg), + q(2004) => q(dgh), + q(2005) => q(dgi), + q(2006) => q(dgk), + q(2007) => q(dgl), + q(2008) => q(dgn), + q(2009) => q(dgo), + q(2010) => q(dgs), + q(2011) => q(dgt), + q(2012) => q(dgu), + q(2013) => q(dgw), + q(2014) => q(dgx), + q(2015) => q(dgz), + q(2016) => q(dhd), + q(2017) => q(dhg), + q(2018) => q(dhi), + q(2019) => q(dhl), + q(2020) => q(dhm), + q(2021) => q(dhn), + q(2022) => q(dho), + q(2023) => q(dhr), + q(2024) => q(dhs), + q(2025) => q(dhu), + q(2026) => q(dhv), + q(2027) => q(dhw), + q(2028) => q(dhx), + q(2029) => q(dia), + q(2030) => q(dib), + q(2031) => q(dic), + q(2032) => q(did), + q(2033) => q(dif), + q(2034) => q(dig), + q(2035) => q(dih), + q(2036) => q(dii), + q(2037) => q(dij), + q(2038) => q(dik), + q(2039) => q(dil), + q(2040) => q(dim), + q(2041) => q(dio), + q(2042) => q(dip), + q(2043) => q(diq), + q(2044) => q(dir), + q(2045) => q(dis), + q(2046) => q(dit), + q(2047) => q(diu), + q(2048) => q(diw), + q(2049) => q(dix), + q(2050) => q(diy), + q(2051) => q(diz), + q(2052) => q(dja), + q(2053) => q(djb), + q(2054) => q(djc), + q(2055) => q(djd), + q(2056) => q(dje), + q(2057) => q(djf), + q(2058) => q(dji), + q(2059) => q(djj), + q(2060) => q(djk), + q(2061) => q(djm), + q(2062) => q(djn), + q(2063) => q(djo), + q(2064) => q(djr), + q(2065) => q(dju), + q(2066) => q(djw), + q(2067) => q(dka), + q(2068) => q(dkk), + q(2069) => q(dkr), + q(2070) => q(dks), + q(2071) => q(dkx), + q(2072) => q(dlg), + q(2073) => q(dlk), + q(2074) => q(dlm), + q(2075) => q(dln), + q(2076) => q(dma), + q(2077) => q(dmb), + q(2078) => q(dmc), + q(2079) => q(dmd), + q(2080) => q(dme), + q(2081) => q(dmg), + q(2082) => q(dmk), + q(2083) => q(dml), + q(2084) => q(dmm), + q(2085) => q(dmo), + q(2086) => q(dmr), + q(2087) => q(dms), + q(2088) => q(dmu), + q(2089) => q(dmv), + q(2090) => q(dmw), + q(2091) => q(dmx), + q(2092) => q(dmy), + q(2093) => q(dna), + q(2094) => q(dnd), + q(2095) => q(dne), + q(2096) => q(dng), + q(2097) => q(dni), + q(2098) => q(dnj), + q(2099) => q(dnk), + q(2100) => q(dnn), + q(2101) => q(dnr), + q(2102) => q(dnt), + q(2103) => q(dnu), + q(2104) => q(dnv), + q(2105) => q(dnw), + q(2106) => q(dny), + q(2107) => q(doa), + q(2108) => q(dob), + q(2109) => q(doc), + q(2110) => q(doe), + q(2111) => q(dof), + q(2112) => q(doh), + q(2113) => q(dok), + q(2114) => q(dol), + q(2115) => q(don), + q(2116) => q(doo), + q(2117) => q(dop), + q(2118) => q(doq), + q(2119) => q(dor), + q(2120) => q(dos), + q(2121) => q(dot), + q(2122) => q(dov), + q(2123) => q(dow), + q(2124) => q(dox), + q(2125) => q(doy), + q(2126) => q(doz), + q(2127) => q(dpp), + q(2128) => q(drb), + q(2129) => q(drc), + q(2130) => q(drd), + q(2131) => q(dre), + q(2132) => q(drg), + q(2133) => q(dri), + q(2134) => q(drl), + q(2135) => q(drn), + q(2136) => q(dro), + q(2137) => q(drq), + q(2138) => q(drr), + q(2139) => q(drs), + q(2140) => q(drt), + q(2141) => q(dru), + q(2142) => q(dry), + q(2143) => q(dse), + q(2144) => q(dsh), + q(2145) => q(dsi), + q(2146) => q(dsl), + q(2147) => q(dsn), + q(2148) => q(dso), + q(2149) => q(dsq), + q(2150) => q(dta), + q(2151) => q(dtb), + q(2152) => q(dtd), + q(2153) => q(dth), + q(2154) => q(dti), + q(2155) => q(dtk), + q(2156) => q(dtm), + q(2157) => q(dtn), + q(2158) => q(dto), + q(2159) => q(dtp), + q(2160) => q(dtr), + q(2161) => q(dts), + q(2162) => q(dtt), + q(2163) => q(dtu), + q(2164) => q(dty), + q(2165) => q(dub), + q(2166) => q(duc), + q(2167) => q(dud), + q(2168) => q(due), + q(2169) => q(duf), + q(2170) => q(dug), + q(2171) => q(duh), + q(2172) => q(dui), + q(2173) => q(duk), + q(2174) => q(dul), + q(2175) => q(dun), + q(2176) => q(duo), + q(2177) => q(dup), + q(2178) => q(duq), + q(2179) => q(dur), + q(2180) => q(dus), + q(2181) => q(duu), + q(2182) => q(duv), + q(2183) => q(duw), + q(2184) => q(dux), + q(2185) => q(duy), + q(2186) => q(duz), + q(2187) => q(dva), + q(2188) => q(dwa), + q(2189) => q(dwr), + q(2190) => q(dws), + q(2191) => q(dwu), + q(2192) => q(dww), + q(2193) => q(dwy), + q(2194) => q(dya), + q(2195) => q(dyb), + q(2196) => q(dyd), + q(2197) => q(dyg), + q(2198) => q(dyi), + q(2199) => q(dym), + q(2200) => q(dyn), + q(2201) => q(dyo), + q(2202) => q(dyy), + q(2203) => q(dza), + q(2204) => q(dze), + q(2205) => q(dzg), + q(2206) => q(dzl), + q(2207) => q(dzn), + q(2208) => q(eaa), + q(2209) => q(ebg), + q(2210) => q(ebk), + q(2211) => q(ebo), + q(2212) => q(ebr), + q(2213) => q(ebu), + q(2214) => q(ecr), + q(2215) => q(ecs), + q(2216) => q(ecy), + q(2217) => q(eee), + q(2218) => q(efa), + q(2219) => q(efe), + q(2220) => q(ega), + q(2221) => q(egl), + q(2222) => q(ego), + q(2223) => q(ehu), + q(2224) => q(eip), + q(2225) => q(eit), + q(2226) => q(eiv), + q(2227) => q(eja), + q(2228) => q(ekc), + q(2229) => q(eke), + q(2230) => q(ekg), + q(2231) => q(eki), + q(2232) => q(ekk), + q(2233) => q(ekl), + q(2234) => q(ekm), + q(2235) => q(eko), + q(2236) => q(ekp), + q(2237) => q(ekr), + q(2238) => q(eky), + q(2239) => q(ele), + q(2240) => q(elh), + q(2241) => q(eli), + q(2242) => q(elk), + q(2243) => q(elm), + q(2244) => q(elo), + q(2245) => q(elu), + q(2246) => q(ema), + q(2247) => q(emb), + q(2248) => q(eme), + q(2249) => q(emg), + q(2250) => q(emi), + q(2251) => q(emk), + q(2252) => q(emm), + q(2253) => q(emn), + q(2254) => q(emp), + q(2255) => q(ems), + q(2256) => q(emu), + q(2257) => q(emw), + q(2258) => q(emx), + q(2259) => q(emy), + q(2260) => q(ena), + q(2261) => q(enb), + q(2262) => q(enc), + q(2263) => q(end), + q(2264) => q(enf), + q(2265) => q(enh), + q(2266) => q(enl), + q(2267) => q(enn), + q(2268) => q(eno), + q(2269) => q(enq), + q(2270) => q(enr), + q(2271) => q(enu), + q(2272) => q(env), + q(2273) => q(enw), + q(2274) => q(enx), + q(2275) => q(eot), + q(2276) => q(epi), + q(2277) => q(era), + q(2278) => q(erg), + q(2279) => q(erh), + q(2280) => q(eri), + q(2281) => q(erk), + q(2282) => q(ero), + q(2283) => q(err), + q(2284) => q(ers), + q(2285) => q(ert), + q(2286) => q(erw), + q(2287) => q(ese), + q(2288) => q(esg), + q(2289) => q(esh), + q(2290) => q(esi), + q(2291) => q(esk), + q(2292) => q(esl), + q(2293) => q(esm), + q(2294) => q(esn), + q(2295) => q(eso), + q(2296) => q(esq), + q(2297) => q(ess), + q(2298) => q(esu), + q(2299) => q(esy), + q(2300) => q(etb), + q(2301) => q(etc), + q(2302) => q(eth), + q(2303) => q(etn), + q(2304) => q(eto), + q(2305) => q(etr), + q(2306) => q(ets), + q(2307) => q(ett), + q(2308) => q(etu), + q(2309) => q(etx), + q(2310) => q(etz), + q(2311) => q(eve), + q(2312) => q(evh), + q(2313) => q(evn), + q(2314) => q(ext), + q(2315) => q(eya), + q(2316) => q(eyo), + q(2317) => q(eza), + q(2318) => q(eze), + q(2319) => q(faa), + q(2320) => q(fab), + q(2321) => q(fad), + q(2322) => q(faf), + q(2323) => q(fag), + q(2324) => q(fah), + q(2325) => q(fai), + q(2326) => q(faj), + q(2327) => q(fak), + q(2328) => q(fal), + q(2329) => q(fam), + q(2330) => q(fap), + q(2331) => q(far), + q(2332) => q(fau), + q(2333) => q(fax), + q(2334) => q(fay), + q(2335) => q(faz), + q(2336) => q(fbl), + q(2337) => q(fcs), + q(2338) => q(fer), + q(2339) => q(ffi), + q(2340) => q(ffm), + q(2341) => q(fgr), + q(2342) => q(fia), + q(2343) => q(fie), + q(2344) => q(fip), + q(2345) => q(fir), + q(2346) => q(fit), + q(2347) => q(fiw), + q(2348) => q(fkk), + q(2349) => q(fkv), + q(2350) => q(fla), + q(2351) => q(flh), + q(2352) => q(fli), + q(2353) => q(fll), + q(2354) => q(fln), + q(2355) => q(flr), + q(2356) => q(fly), + q(2357) => q(fmp), + q(2358) => q(fmu), + q(2359) => q(fnb), + q(2360) => q(fng), + q(2361) => q(fni), + q(2362) => q(fod), + q(2363) => q(foi), + q(2364) => q(fom), + q(2365) => q(for), + q(2366) => q(fos), + q(2367) => q(fpe), + q(2368) => q(fqs), + q(2369) => q(frc), + q(2370) => q(frd), + q(2371) => q(frk), + q(2372) => q(frp), + q(2373) => q(frq), + q(2374) => q(frt), + q(2375) => q(fse), + q(2376) => q(fsl), + q(2377) => q(fss), + q(2378) => q(fub), + q(2379) => q(fuc), + q(2380) => q(fud), + q(2381) => q(fue), + q(2382) => q(fuf), + q(2383) => q(fuh), + q(2384) => q(fui), + q(2385) => q(fuj), + q(2386) => q(fum), + q(2387) => q(fun), + q(2388) => q(fuq), + q(2389) => q(fut), + q(2390) => q(fuu), + q(2391) => q(fuv), + q(2392) => q(fuy), + q(2393) => q(fvr), + q(2394) => q(fwa), + q(2395) => q(fwe), + q(2396) => q(gab), + q(2397) => q(gac), + q(2398) => q(gad), + q(2399) => q(gae), + q(2400) => q(gaf), + q(2401) => q(gag), + q(2402) => q(gah), + q(2403) => q(gai), + q(2404) => q(gaj), + q(2405) => q(gak), + q(2406) => q(gal), + q(2407) => q(gam), + q(2408) => q(gan), + q(2409) => q(gao), + q(2410) => q(gap), + q(2411) => q(gaq), + q(2412) => q(gar), + q(2413) => q(gas), + q(2414) => q(gat), + q(2415) => q(gau), + q(2416) => q(gaw), + q(2417) => q(gax), + q(2418) => q(gaz), + q(2419) => q(gbb), + q(2420) => q(gbd), + q(2421) => q(gbe), + q(2422) => q(gbf), + q(2423) => q(gbg), + q(2424) => q(gbh), + q(2425) => q(gbi), + q(2426) => q(gbj), + q(2427) => q(gbk), + q(2428) => q(gbl), + q(2429) => q(gbm), + q(2430) => q(gbn), + q(2431) => q(gbo), + q(2432) => q(gbp), + q(2433) => q(gbq), + q(2434) => q(gbr), + q(2435) => q(gbs), + q(2436) => q(gbu), + q(2437) => q(gbv), + q(2438) => q(gbw), + q(2439) => q(gbx), + q(2440) => q(gby), + q(2441) => q(gbz), + q(2442) => q(gcc), + q(2443) => q(gcd), + q(2444) => q(gce), + q(2445) => q(gcf), + q(2446) => q(gcl), + q(2447) => q(gcn), + q(2448) => q(gcr), + q(2449) => q(gct), + q(2450) => q(gda), + q(2451) => q(gdb), + q(2452) => q(gdc), + q(2453) => q(gdd), + q(2454) => q(gde), + q(2455) => q(gdf), + q(2456) => q(gdg), + q(2457) => q(gdh), + q(2458) => q(gdi), + q(2459) => q(gdj), + q(2460) => q(gdk), + q(2461) => q(gdl), + q(2462) => q(gdm), + q(2463) => q(gdn), + q(2464) => q(gdo), + q(2465) => q(gdq), + q(2466) => q(gdr), + q(2467) => q(gds), + q(2468) => q(gdt), + q(2469) => q(gdu), + q(2470) => q(gdx), + q(2471) => q(gea), + q(2472) => q(geb), + q(2473) => q(gec), + q(2474) => q(ged), + q(2475) => q(geg), + q(2476) => q(geh), + q(2477) => q(gei), + q(2478) => q(gej), + q(2479) => q(gek), + q(2480) => q(gel), + q(2481) => q(geq), + q(2482) => q(ges), + q(2483) => q(gev), + q(2484) => q(gew), + q(2485) => q(gex), + q(2486) => q(gey), + q(2487) => q(gfk), + q(2488) => q(gft), + q(2489) => q(gga), + q(2490) => q(ggb), + q(2491) => q(ggd), + q(2492) => q(gge), + q(2493) => q(ggg), + q(2494) => q(ggk), + q(2495) => q(ggl), + q(2496) => q(ggt), + q(2497) => q(ggu), + q(2498) => q(ggw), + q(2499) => q(gha), + q(2500) => q(ghc), + q(2501) => q(ghe), + q(2502) => q(ghh), + q(2503) => q(ghk), + q(2504) => q(ghl), + q(2505) => q(ghn), + q(2506) => q(gho), + q(2507) => q(ghr), + q(2508) => q(ghs), + q(2509) => q(ght), + q(2510) => q(gia), + q(2511) => q(gib), + q(2512) => q(gic), + q(2513) => q(gid), + q(2514) => q(gie), + q(2515) => q(gig), + q(2516) => q(gih), + q(2517) => q(gim), + q(2518) => q(gin), + q(2519) => q(gip), + q(2520) => q(giq), + q(2521) => q(gir), + q(2522) => q(gis), + q(2523) => q(git), + q(2524) => q(giu), + q(2525) => q(giw), + q(2526) => q(gix), + q(2527) => q(giy), + q(2528) => q(giz), + q(2529) => q(gji), + q(2530) => q(gjk), + q(2531) => q(gjm), + q(2532) => q(gjn), + q(2533) => q(gjr), + q(2534) => q(gju), + q(2535) => q(gka), + q(2536) => q(gke), + q(2537) => q(gkn), + q(2538) => q(gko), + q(2539) => q(gkp), + q(2540) => q(gku), + q(2541) => q(glc), + q(2542) => q(gld), + q(2543) => q(glh), + q(2544) => q(gli), + q(2545) => q(glj), + q(2546) => q(glk), + q(2547) => q(gll), + q(2548) => q(glo), + q(2549) => q(glr), + q(2550) => q(glu), + q(2551) => q(glw), + q(2552) => q(gly), + q(2553) => q(gma), + q(2554) => q(gmb), + q(2555) => q(gmd), + q(2556) => q(gmg), + q(2557) => q(gml), + q(2558) => q(gmm), + q(2559) => q(gmn), + q(2560) => q(gmu), + q(2561) => q(gmv), + q(2562) => q(gmx), + q(2563) => q(gmy), + q(2564) => q(gmz), + q(2565) => q(gna), + q(2566) => q(gnb), + q(2567) => q(gnc), + q(2568) => q(gnd), + q(2569) => q(gne), + q(2570) => q(gng), + q(2571) => q(gnh), + q(2572) => q(gni), + q(2573) => q(gnq), + q(2574) => q(gnl), + q(2575) => q(gnm), + q(2576) => q(gnn), + q(2577) => q(gno), + q(2578) => q(gnr), + q(2579) => q(gnt), + q(2580) => q(gnu), + q(2581) => q(gnw), + q(2582) => q(gnz), + q(2583) => q(goa), + q(2584) => q(gob), + q(2585) => q(goc), + q(2586) => q(god), + q(2587) => q(goe), + q(2588) => q(gof), + q(2589) => q(gog), + q(2590) => q(goi), + q(2591) => q(goj), + q(2592) => q(gok), + q(2593) => q(gol), + q(2594) => q(gom), + q(2595) => q(goo), + q(2596) => q(gop), + q(2597) => q(goq), + q(2598) => q(gos), + q(2599) => q(gou), + q(2600) => q(gow), + q(2601) => q(gox), + q(2602) => q(goy), + q(2603) => q(goz), + q(2604) => q(gpa), + q(2605) => q(gpe), + q(2606) => q(gpn), + q(2607) => q(gqa), + q(2608) => q(gqi), + q(2609) => q(gqn), + q(2610) => q(gqr), + q(2611) => q(gqu), + q(2612) => q(gra), + q(2613) => q(grd), + q(2614) => q(grg), + q(2615) => q(grh), + q(2616) => q(gri), + q(2617) => q(grj), + q(2618) => q(grm), + q(2619) => q(gro), + q(2620) => q(grq), + q(2621) => q(grr), + q(2622) => q(grs), + q(2623) => q(grt), + q(2624) => q(gru), + q(2625) => q(grv), + q(2626) => q(grw), + q(2627) => q(grx), + q(2628) => q(gry), + q(2629) => q(grz), + q(2630) => q(gse), + q(2631) => q(gsg), + q(2632) => q(gsl), + q(2633) => q(gsm), + q(2634) => q(gsn), + q(2635) => q(gso), + q(2636) => q(gsp), + q(2637) => q(gss), + q(2638) => q(gta), + q(2639) => q(gtu), + q(2640) => q(gua), + q(2641) => q(gub), + q(2642) => q(guc), + q(2643) => q(gud), + q(2644) => q(gue), + q(2645) => q(guf), + q(2646) => q(gug), + q(2647) => q(guh), + q(2648) => q(gui), + q(2649) => q(guk), + q(2650) => q(gul), + q(2651) => q(gum), + q(2652) => q(gun), + q(2653) => q(guo), + q(2654) => q(gup), + q(2655) => q(yif), + q(2656) => q(gur), + q(2657) => q(gus), + q(2658) => q(gut), + q(2659) => q(guu), + q(2660) => q(guw), + q(2661) => q(gux), + q(2662) => q(guz), + q(2663) => q(gva), + q(2664) => q(gvc), + q(2665) => q(gve), + q(2666) => q(gvf), + q(2667) => q(gvj), + q(2668) => q(gvl), + q(2669) => q(gvm), + q(2670) => q(gvn), + q(2671) => q(gvo), + q(2672) => q(gvp), + q(2673) => q(gvr), + q(2674) => q(gvs), + q(2675) => q(gvy), + q(2676) => q(gwa), + q(2677) => q(gwb), + q(2678) => q(gwc), + q(2679) => q(gwd), + q(2680) => q(gwe), + q(2681) => q(gwf), + q(2682) => q(gwg), + q(2683) => q(gwj), + q(2684) => q(gwm), + q(2685) => q(gwn), + q(2686) => q(gwr), + q(2687) => q(gwt), + q(2688) => q(gwu), + q(2689) => q(gww), + q(2690) => q(gwx), + q(2691) => q(gxx), + q(2692) => q(gya), + q(2693) => q(gyb), + q(2694) => q(gyd), + q(2695) => q(gye), + q(2696) => q(gyf), + q(2697) => q(gyg), + q(2698) => q(gyi), + q(2699) => q(gyl), + q(2700) => q(gym), + q(2701) => q(gyn), + q(2702) => q(gyr), + q(2703) => q(gyy), + q(2704) => q(gza), + q(2705) => q(gzi), + q(2706) => q(gzn), + q(2707) => q(haa), + q(2708) => q(hab), + q(2709) => q(hac), + q(2710) => q(had), + q(2711) => q(hae), + q(2712) => q(haf), + q(2713) => q(hag), + q(2714) => q(hah), + q(2715) => q(haj), + q(2716) => q(hak), + q(2717) => q(hal), + q(2718) => q(ham), + q(2719) => q(han), + q(2720) => q(hao), + q(2721) => q(hap), + q(2722) => q(haq), + q(2723) => q(har), + q(2724) => q(has), + q(2725) => q(hav), + q(2726) => q(hax), + q(2727) => q(hay), + q(2728) => q(haz), + q(2729) => q(hba), + q(2730) => q(hbb), + q(2731) => q(hbn), + q(2732) => q(hbo), + q(2733) => q(hbu), + q(2734) => q(hca), + q(2735) => q(hch), + q(2736) => q(hdn), + q(2737) => q(hds), + q(2738) => q(hdy), + q(2739) => q(hea), + q(2740) => q(hed), + q(2741) => q(heg), + q(2742) => q(heh), + q(2743) => q(hei), + q(2744) => q(hem), + q(2745) => q(hgm), + q(2746) => q(hgw), + q(2747) => q(hhi), + q(2748) => q(hhr), + q(2749) => q(hhy), + q(2750) => q(hia), + q(2751) => q(hib), + q(2752) => q(hid), + q(2753) => q(hif), + q(2754) => q(hig), + q(2755) => q(hih), + q(2756) => q(hii), + q(2757) => q(hij), + q(2758) => q(hik), + q(2759) => q(hio), + q(2760) => q(hir), + q(2761) => q(hiw), + q(2762) => q(hix), + q(2763) => q(hji), + q(2764) => q(hka), + q(2765) => q(hke), + q(2766) => q(hkk), + q(2767) => q(hks), + q(2768) => q(hla), + q(2769) => q(hlb), + q(2770) => q(hld), + q(2771) => q(hle), + q(2772) => q(hlt), + q(2773) => q(hlu), + q(2774) => q(hma), + q(2775) => q(hmb), + q(2776) => q(hmc), + q(2777) => q(hmd), + q(2778) => q(hme), + q(2779) => q(hmf), + q(2780) => q(hmg), + q(2781) => q(hmh), + q(2782) => q(hmi), + q(2783) => q(hmj), + q(2784) => q(hmk), + q(2785) => q(hml), + q(2786) => q(hmm), + q(2787) => q(hmp), + q(2788) => q(hmq), + q(2789) => q(hmr), + q(2790) => q(hms), + q(2791) => q(hmt), + q(2792) => q(hmu), + q(2793) => q(hmv), + q(2794) => q(hmw), + q(2795) => q(hmy), + q(2796) => q(hmz), + q(2797) => q(hna), + q(2798) => q(hnd), + q(2799) => q(hne), + q(2800) => q(hnh), + q(2801) => q(hni), + q(2802) => q(hnj), + q(2803) => q(hnn), + q(2804) => q(hno), + q(2805) => q(hns), + q(2806) => q(hnu), + q(2807) => q(hoa), + q(2808) => q(hob), + q(2809) => q(hoc), + q(2810) => q(hod), + q(2811) => q(hoe), + q(2812) => q(hoh), + q(2813) => q(hoi), + q(2814) => q(hoj), + q(2815) => q(hol), + q(2816) => q(hom), + q(2817) => q(hoo), + q(2818) => q(hop), + q(2819) => q(hor), + q(2820) => q(hos), + q(2821) => q(hot), + q(2822) => q(hov), + q(2823) => q(how), + q(2824) => q(hoy), + q(2825) => q(hoz), + q(2826) => q(hpo), + q(2827) => q(hps), + q(2828) => q(hra), + q(2829) => q(hrc), + q(2830) => q(hre), + q(2831) => q(hrk), + q(2832) => q(hrm), + q(2833) => q(hro), + q(2834) => q(hrp), + q(2835) => q(hrt), + q(2836) => q(hru), + q(2837) => q(hrw), + q(2838) => q(hrx), + q(2839) => q(hrz), + q(2840) => q(hsh), + q(2841) => q(hsl), + q(2842) => q(hsn), + q(2843) => q(hss), + q(2844) => q(hti), + q(2845) => q(hto), + q(2846) => q(hts), + q(2847) => q(htu), + q(2848) => q(htx), + q(2849) => q(hub), + q(2850) => q(huc), + q(2851) => q(hud), + q(2852) => q(hue), + q(2853) => q(huf), + q(2854) => q(hug), + q(2855) => q(huh), + q(2856) => q(hui), + q(2857) => q(huj), + q(2858) => q(huk), + q(2859) => q(hul), + q(2860) => q(hum), + q(2861) => q(huo), + q(2862) => q(huq), + q(2863) => q(hur), + q(2864) => q(hus), + q(2865) => q(hut), + q(2866) => q(huu), + q(2867) => q(huv), + q(2868) => q(huw), + q(2869) => q(hux), + q(2870) => q(huy), + q(2871) => q(huz), + q(2872) => q(hvc), + q(2873) => q(hve), + q(2874) => q(hvk), + q(2875) => q(hvn), + q(2876) => q(hvv), + q(2877) => q(hwa), + q(2878) => q(hwc), + q(2879) => q(hwo), + q(2880) => q(hya), + q(2881) => q(iai), + q(2882) => q(ian), + q(2883) => q(iar), + q(2884) => q(ibb), + q(2885) => q(ibd), + q(2886) => q(ibe), + q(2887) => q(ibg), + q(2888) => q(ibh), + q(2889) => q(ibl), + q(2890) => q(ibm), + q(2891) => q(ibn), + q(2892) => q(ibr), + q(2893) => q(ibu), + q(2894) => q(iby), + q(2895) => q(ica), + q(2896) => q(ich), + q(2897) => q(icl), + q(2898) => q(icr), + q(2899) => q(ida), + q(2900) => q(idb), + q(2901) => q(idc), + q(2902) => q(idd), + q(2903) => q(ide), + q(2904) => q(idi), + q(2905) => q(idr), + q(2906) => q(ids), + q(2907) => q(idt), + q(2908) => q(idu), + q(2909) => q(ifa), + q(2910) => q(ifb), + q(2911) => q(ife), + q(2912) => q(iff), + q(2913) => q(ifk), + q(2914) => q(ifm), + q(2915) => q(ifu), + q(2916) => q(ify), + q(2917) => q(igb), + q(2918) => q(ige), + q(2919) => q(igg), + q(2920) => q(igl), + q(2921) => q(igm), + q(2922) => q(ign), + q(2923) => q(igo), + q(2924) => q(igs), + q(2925) => q(igw), + q(2926) => q(ihb), + q(2927) => q(ihi), + q(2928) => q(ihp), + q(2929) => q(ihw), + q(2930) => q(iin), + q(2931) => q(ijc), + q(2932) => q(ije), + q(2933) => q(ijj), + q(2934) => q(ijn), + q(2935) => q(ijs), + q(2936) => q(ike), + q(2937) => q(iki), + q(2938) => q(ikk), + q(2939) => q(ikl), + q(2940) => q(iko), + q(2941) => q(ikp), + q(2942) => q(ikr), + q(2943) => q(iks), + q(2944) => q(ikt), + q(2945) => q(ikv), + q(2946) => q(ikw), + q(2947) => q(ikx), + q(2948) => q(ikz), + q(2949) => q(ila), + q(2950) => q(ilb), + q(2951) => q(ilg), + q(2952) => q(ili), + q(2953) => q(ilk), + q(2954) => q(ilm), + q(2955) => q(ilp), + q(2956) => q(ils), + q(2957) => q(ilu), + q(2958) => q(ilv), + q(2959) => q(ima), + q(2960) => q(imi), + q(2961) => q(iml), + q(2962) => q(imn), + q(2963) => q(imo), + q(2964) => q(imr), + q(2965) => q(ims), + q(2966) => q(imy), + q(2967) => q(inb), + q(2968) => q(ing), + q(2969) => q(inj), + q(2970) => q(inl), + q(2971) => q(inm), + q(2972) => q(inn), + q(2973) => q(ino), + q(2974) => q(inp), + q(2975) => q(ins), + q(2976) => q(int), + q(2977) => q(inz), + q(2978) => q(ior), + q(2979) => q(iou), + q(2980) => q(iow), + q(2981) => q(ipi), + q(2982) => q(ipo), + q(2983) => q(iqu), + q(2984) => q(iqw), + q(2985) => q(ire), + q(2986) => q(irh), + q(2987) => q(iri), + q(2988) => q(irk), + q(2989) => q(irn), + q(2990) => q(irr), + q(2991) => q(iru), + q(2992) => q(irx), + q(2993) => q(iry), + q(2994) => q(isa), + q(2995) => q(isc), + q(2996) => q(isd), + q(2997) => q(ise), + q(2998) => q(isg), + q(2999) => q(ish), + q(3000) => q(isi), + q(3001) => q(isk), + q(3002) => q(ism), + q(3003) => q(isn), + q(3004) => q(iso), + q(3005) => q(isr), + q(3006) => q(ist), + q(3007) => q(isu), + q(3008) => q(itb), + q(3009) => q(itd), + q(3010) => q(ite), + q(3011) => q(iti), + q(3012) => q(itk), + q(3013) => q(itl), + q(3014) => q(itm), + q(3015) => q(ito), + q(3016) => q(itr), + q(3017) => q(its), + q(3018) => q(itt), + q(3019) => q(itv), + q(3020) => q(itw), + q(3021) => q(itx), + q(3022) => q(ity), + q(3023) => q(itz), + q(3024) => q(ium), + q(3025) => q(ivb), + q(3026) => q(ivv), + q(3027) => q(iwk), + q(3028) => q(iwm), + q(3029) => q(iwo), + q(3030) => q(iws), + q(3031) => q(ixc), + q(3032) => q(ixl), + q(3033) => q(iya), + q(3034) => q(iyo), + q(3035) => q(iyx), + q(3036) => q(izh), + q(3037) => q(izr), + q(3038) => q(izz), + q(3039) => q(jaa), + q(3040) => q(jab), + q(3041) => q(jac), + q(3042) => q(jad), + q(3043) => q(jae), + q(3044) => q(jaf), + q(3045) => q(jah), + q(3046) => q(jaj), + q(3047) => q(jak), + q(3048) => q(jal), + q(3049) => q(jam), + q(3050) => q(jan), + q(3051) => q(jao), + q(3052) => q(jaq), + q(3053) => q(jas), + q(3054) => q(jat), + q(3055) => q(jau), + q(3056) => q(jax), + q(3057) => q(jay), + q(3058) => q(jaz), + q(3059) => q(jbe), + q(3060) => q(jbi), + q(3061) => q(jbj), + q(3062) => q(jbk), + q(3063) => q(jbn), + q(3064) => q(jbr), + q(3065) => q(jbt), + q(3066) => q(jbu), + q(3067) => q(jbw), + q(3068) => q(jcs), + q(3069) => q(jct), + q(3070) => q(jda), + q(3071) => q(jdg), + q(3072) => q(jdt), + q(3073) => q(jeb), + q(3074) => q(jee), + q(3075) => q(jeh), + q(3076) => q(jei), + q(3077) => q(jek), + q(3078) => q(jel), + q(3079) => q(jen), + q(3080) => q(jer), + q(3081) => q(jet), + q(3082) => q(jeu), + q(3083) => q(jgb), + q(3084) => q(jge), + q(3085) => q(jgk), + q(3086) => q(jgo), + q(3087) => q(jhi), + q(3088) => q(jhs), + q(3089) => q(jia), + q(3090) => q(jib), + q(3091) => q(jic), + q(3092) => q(jid), + q(3093) => q(jie), + q(3094) => q(jig), + q(3095) => q(jih), + q(3096) => q(jii), + q(3097) => q(jil), + q(3098) => q(jim), + q(3099) => q(jio), + q(3100) => q(jiq), + q(3101) => q(jit), + q(3102) => q(jiu), + q(3103) => q(jiv), + q(3104) => q(jiy), + q(3105) => q(jje), + q(3106) => q(jjr), + q(3107) => q(jka), + q(3108) => q(jkm), + q(3109) => q(jko), + q(3110) => q(jkp), + q(3111) => q(jkr), + q(3112) => q(jku), + q(3113) => q(jle), + q(3114) => q(jls), + q(3115) => q(jma), + q(3116) => q(jmb), + q(3117) => q(jmc), + q(3118) => q(jmd), + q(3119) => q(jmi), + q(3120) => q(jml), + q(3121) => q(jmn), + q(3122) => q(jmr), + q(3123) => q(jms), + q(3124) => q(jmw), + q(3125) => q(jmx), + q(3126) => q(jna), + q(3127) => q(jnd), + q(3128) => q(jng), + q(3129) => q(jni), + q(3130) => q(jnj), + q(3131) => q(jnl), + q(3132) => q(jns), + q(3133) => q(job), + q(3134) => q(jod), + q(3135) => q(jog), + q(3136) => q(jor), + q(3137) => q(jos), + q(3138) => q(jow), + q(3139) => q(jpa), + q(3140) => q(jqr), + q(3141) => q(jra), + q(3142) => q(jrr), + q(3143) => q(jrt), + q(3144) => q(jru), + q(3145) => q(jsl), + q(3146) => q(jua), + q(3147) => q(jub), + q(3148) => q(juc), + q(3149) => q(jud), + q(3150) => q(juh), + q(3151) => q(jui), + q(3152) => q(juk), + q(3153) => q(jul), + q(3154) => q(jum), + q(3155) => q(jun), + q(3156) => q(juo), + q(3157) => q(jup), + q(3158) => q(jur), + q(3159) => q(jus), + q(3160) => q(jut), + q(3161) => q(juu), + q(3162) => q(juw), + q(3163) => q(juy), + q(3164) => q(jvd), + q(3165) => q(jvn), + q(3166) => q(jwi), + q(3167) => q(jya), + q(3168) => q(jye), + q(3169) => q(jyy), + q(3170) => q(kad), + q(3171) => q(kae), + q(3172) => q(kaf), + q(3173) => q(kag), + q(3174) => q(kah), + q(3175) => q(kai), + q(3176) => q(kaj), + q(3177) => q(kak), + q(3178) => q(kao), + q(3179) => q(kap), + q(3180) => q(kaq), + q(3181) => q(kav), + q(3182) => q(kax), + q(3183) => q(kay), + q(3184) => q(kba), + q(3185) => q(kbb), + q(3186) => q(kbc), + q(3187) => q(kbe), + q(3188) => q(kbg), + q(3189) => q(kbh), + q(3190) => q(kbi), + q(3191) => q(kbj), + q(3192) => q(kbk), + q(3193) => q(kbl), + q(3194) => q(kbm), + q(3195) => q(kbn), + q(3196) => q(kbo), + q(3197) => q(kbp), + q(3198) => q(kbq), + q(3199) => q(kbr), + q(3200) => q(kbs), + q(3201) => q(kbt), + q(3202) => q(kbu), + q(3203) => q(kbv), + q(3204) => q(kbw), + q(3205) => q(kbx), + q(3206) => q(kby), + q(3207) => q(kbz), + q(3208) => q(kca), + q(3209) => q(kcb), + q(3210) => q(kcc), + q(3211) => q(kcd), + q(3212) => q(kce), + q(3213) => q(kcf), + q(3214) => q(kcg), + q(3215) => q(kch), + q(3216) => q(kci), + q(3217) => q(kcj), + q(3218) => q(kck), + q(3219) => q(kcl), + q(3220) => q(kcm), + q(3221) => q(kcn), + q(3222) => q(kco), + q(3223) => q(kcp), + q(3224) => q(kcq), + q(3225) => q(kcr), + q(3226) => q(kcs), + q(3227) => q(kct), + q(3228) => q(kcu), + q(3229) => q(kcv), + q(3230) => q(kcw), + q(3231) => q(kcx), + q(3232) => q(kcy), + q(3233) => q(kcz), + q(3234) => q(kda), + q(3235) => q(kdc), + q(3236) => q(kdd), + q(3237) => q(kde), + q(3238) => q(kdf), + q(3239) => q(kdg), + q(3240) => q(kdh), + q(3241) => q(kdi), + q(3242) => q(kdj), + q(3243) => q(kdk), + q(3244) => q(kdl), + q(3245) => q(kdm), + q(3246) => q(kdn), + q(3247) => q(kdp), + q(3248) => q(kdq), + q(3249) => q(kdr), + q(3250) => q(kdt), + q(3251) => q(kdu), + q(3252) => q(kdw), + q(3253) => q(kdx), + q(3254) => q(kdy), + q(3255) => q(kdz), + q(3256) => q(kea), + q(3257) => q(keb), + q(3258) => q(kec), + q(3259) => q(ked), + q(3260) => q(kee), + q(3261) => q(kef), + q(3262) => q(keg), + q(3263) => q(keh), + q(3264) => q(kei), + q(3265) => q(kej), + q(3266) => q(kek), + q(3267) => q(kel), + q(3268) => q(kem), + q(3269) => q(ken), + q(3270) => q(keo), + q(3271) => q(kep), + q(3272) => q(keq), + q(3273) => q(ker), + q(3274) => q(kes), + q(3275) => q(ket), + q(3276) => q(keu), + q(3277) => q(kev), + q(3278) => q(kew), + q(3279) => q(kex), + q(3280) => q(key), + q(3281) => q(kez), + q(3282) => q(kfa), + q(3283) => q(kfb), + q(3284) => q(kfc), + q(3285) => q(kfd), + q(3286) => q(kfe), + q(3287) => q(kff), + q(3288) => q(kfg), + q(3289) => q(kfh), + q(3290) => q(kfi), + q(3291) => q(kfj), + q(3292) => q(kfk), + q(3293) => q(kfl), + q(3294) => q(kfm), + q(3295) => q(kfn), + q(3296) => q(kfo), + q(3297) => q(kfp), + q(3298) => q(kfq), + q(3299) => q(kfr), + q(3300) => q(kfs), + q(3301) => q(kft), + q(3302) => q(kfu), + q(3303) => q(kfv), + q(3304) => q(kfw), + q(3305) => q(kfx), + q(3306) => q(kfy), + q(3307) => q(kfz), + q(3308) => q(kga), + q(3309) => q(kgb), + q(3310) => q(kge), + q(3311) => q(kgf), + q(3312) => q(kgg), + q(3313) => q(kgi), + q(3314) => q(kgj), + q(3315) => q(kgk), + q(3316) => q(kgl), + q(3317) => q(kuq), + q(3318) => q(kgn), + q(3319) => q(kgo), + q(3320) => q(kgp), + q(3321) => q(kgq), + q(3322) => q(kgr), + q(3323) => q(kgs), + q(3324) => q(kgt), + q(3325) => q(kgu), + q(3326) => q(kgv), + q(3327) => q(kgw), + q(3328) => q(kgx), + q(3329) => q(kgy), + q(3330) => q(khb), + q(3331) => q(khc), + q(3332) => q(khd), + q(3333) => q(khe), + q(3334) => q(khf), + q(3335) => q(khg), + q(3336) => q(khh), + q(3337) => q(khj), + q(3338) => q(khk), + q(3339) => q(khl), + q(3340) => q(khn), + q(3341) => q(khp), + q(3342) => q(khq), + q(3343) => q(khr), + q(3344) => q(khs), + q(3345) => q(kht), + q(3346) => q(khu), + q(3347) => q(khv), + q(3348) => q(khw), + q(3349) => q(khx), + q(3350) => q(khy), + q(3351) => q(khz), + q(3352) => q(kia), + q(3353) => q(kib), + q(3354) => q(kic), + q(3355) => q(kid), + q(3356) => q(kie), + q(3357) => q(kif), + q(3358) => q(kig), + q(3359) => q(kih), + q(3360) => q(kii), + q(3361) => q(kij), + q(3362) => q(kil), + q(3363) => q(kim), + q(3364) => q(kio), + q(3365) => q(kip), + q(3366) => q(kiq), + q(3367) => q(kis), + q(3368) => q(kit), + q(3369) => q(kiu), + q(3370) => q(kiv), + q(3371) => q(kiw), + q(3372) => q(kix), + q(3373) => q(kiy), + q(3374) => q(kiz), + q(3375) => q(kja), + q(3376) => q(kjb), + q(3377) => q(kjc), + q(3378) => q(kjd), + q(3379) => q(kje), + q(3380) => q(kjf), + q(3381) => q(kjg), + q(3382) => q(kjh), + q(3383) => q(kji), + q(3384) => q(kjj), + q(3385) => q(kjk), + q(3386) => q(kjl), + q(3387) => q(kjm), + q(3388) => q(kjn), + q(3389) => q(kjo), + q(3390) => q(kjp), + q(3391) => q(kjq), + q(3392) => q(kjr), + q(3393) => q(kjs), + q(3394) => q(kjt), + q(3395) => q(kju), + q(3396) => q(kjv), + q(3397) => q(kjx), + q(3398) => q(kjy), + q(3399) => q(kjz), + q(3400) => q(kka), + q(3401) => q(kkb), + q(3402) => q(kkc), + q(3403) => q(kkd), + q(3404) => q(kke), + q(3405) => q(kkf), + q(3406) => q(kkg), + q(3407) => q(kkh), + q(3408) => q(kki), + q(3409) => q(kkj), + q(3410) => q(kkk), + q(3411) => q(kkl), + q(3412) => q(kkm), + q(3413) => q(kkn), + q(3414) => q(kko), + q(3415) => q(kkp), + q(3416) => q(kkq), + q(3417) => q(kkr), + q(3418) => q(kks), + q(3419) => q(kkt), + q(3420) => q(kku), + q(3421) => q(kkv), + q(3422) => q(kkw), + q(3423) => q(kkx), + q(3424) => q(kky), + q(3425) => q(kkz), + q(3426) => q(kla), + q(3427) => q(klb), + q(3428) => q(klc), + q(3429) => q(kld), + q(3430) => q(kle), + q(3431) => q(klf), + q(3432) => q(klg), + q(3433) => q(klh), + q(3434) => q(kli), + q(3435) => q(klj), + q(3436) => q(klk), + q(3437) => q(kll), + q(3438) => q(klm), + q(3439) => q(kln), + q(3440) => q(klo), + q(3441) => q(klp), + q(3442) => q(klq), + q(3443) => q(klr), + q(3444) => q(kls), + q(3445) => q(klt), + q(3446) => q(klu), + q(3447) => q(klv), + q(3448) => q(klw), + q(3449) => q(klx), + q(3450) => q(kly), + q(3451) => q(klz), + q(3452) => q(kma), + q(3453) => q(kmc), + q(3454) => q(kmd), + q(3455) => q(kme), + q(3456) => q(kmf), + q(3457) => q(kmg), + q(3458) => q(kmh), + q(3459) => q(kmi), + q(3460) => q(kmj), + q(3461) => q(kmk), + q(3462) => q(kml), + q(3463) => q(kmm), + q(3464) => q(kmn), + q(3465) => q(kmo), + q(3466) => q(kmp), + q(3467) => q(kmq), + q(3468) => q(kmr), + q(3469) => q(kms), + q(3470) => q(kmt), + q(3471) => q(kmu), + q(3472) => q(kmv), + q(3473) => q(kmw), + q(3474) => q(kmx), + q(3475) => q(kmy), + q(3476) => q(kmz), + q(3477) => q(kna), + q(3478) => q(knb), + q(3479) => q(knc), + q(3480) => q(knd), + q(3481) => q(kne), + q(3482) => q(knf), + q(3483) => q(kng), + q(3484) => q(kni), + q(3485) => q(knj), + q(3486) => q(knk), + q(3487) => q(knl), + q(3488) => q(knm), + q(3489) => q(knn), + q(3490) => q(kno), + q(3491) => q(knp), + q(3492) => q(knq), + q(3493) => q(knr), + q(3494) => q(kns), + q(3495) => q(knt), + q(3496) => q(knu), + q(3497) => q(knv), + q(3498) => q(knw), + q(3499) => q(knx), + q(3500) => q(kny), + q(3501) => q(knz), + q(3502) => q(koa), + q(3503) => q(koc), + q(3504) => q(kod), + q(3505) => q(koe), + q(3506) => q(kof), + q(3507) => q(kog), + q(3508) => q(koh), + q(3509) => q(koi), + q(3510) => q(kol), + q(3511) => q(koo), + q(3512) => q(kop), + q(3513) => q(koq), + q(3514) => q(kot), + q(3515) => q(kou), + q(3516) => q(kov), + q(3517) => q(kow), + q(3518) => q(koy), + q(3519) => q(koz), + q(3520) => q(kpa), + q(3521) => q(kpb), + q(3522) => q(kpc), + q(3523) => q(kpd), + q(3524) => q(kpf), + q(3525) => q(kpg), + q(3526) => q(kph), + q(3527) => q(kpi), + q(3528) => q(kpj), + q(3529) => q(kpk), + q(3530) => q(kpl), + q(3531) => q(kpm), + q(3532) => q(kpn), + q(3533) => q(kpo), + q(3534) => q(kpq), + q(3535) => q(kpr), + q(3536) => q(kps), + q(3537) => q(kpt), + q(3538) => q(kpu), + q(3539) => q(kpv), + q(3540) => q(kpw), + q(3541) => q(kpx), + q(3542) => q(kpy), + q(3543) => q(kpz), + q(3544) => q(kqa), + q(3545) => q(kqb), + q(3546) => q(kqc), + q(3547) => q(kqd), + q(3548) => q(kqe), + q(3549) => q(kqf), + q(3550) => q(kqg), + q(3551) => q(kqh), + q(3552) => q(kqi), + q(3553) => q(kqj), + q(3554) => q(kqk), + q(3555) => q(kql), + q(3556) => q(kqm), + q(3557) => q(kqn), + q(3558) => q(kqo), + q(3559) => q(kqp), + q(3560) => q(kqq), + q(3561) => q(kqr), + q(3562) => q(kqs), + q(3563) => q(kqt), + q(3564) => q(kqu), + q(3565) => q(kqv), + q(3566) => q(kqw), + q(3567) => q(kqx), + q(3568) => q(kqy), + q(3569) => q(kqz), + q(3570) => q(kra), + q(3571) => q(krb), + q(3572) => q(krd), + q(3573) => q(kre), + q(3574) => q(krf), + q(3575) => q(krh), + q(3576) => q(kri), + q(3577) => q(krj), + q(3578) => q(krk), + q(3579) => q(krn), + q(3580) => q(krp), + q(3581) => q(krr), + q(3582) => q(krs), + q(3583) => q(krt), + q(3584) => q(krv), + q(3585) => q(krw), + q(3586) => q(krx), + q(3587) => q(kry), + q(3588) => q(krz), + q(3589) => q(ksa), + q(3590) => q(ksb), + q(3591) => q(ksc), + q(3592) => q(ksd), + q(3593) => q(kse), + q(3594) => q(ksf), + q(3595) => q(ksg), + q(3596) => q(ksh), + q(3597) => q(ksi), + q(3598) => q(ksj), + q(3599) => q(ksk), + q(3600) => q(ksl), + q(3601) => q(ksm), + q(3602) => q(ksn), + q(3603) => q(kso), + q(3604) => q(ksp), + q(3605) => q(ksq), + q(3606) => q(ksr), + q(3607) => q(kss), + q(3608) => q(kst), + q(3609) => q(ksu), + q(3610) => q(ksv), + q(3611) => q(ksw), + q(3612) => q(ksx), + q(3613) => q(ksy), + q(3614) => q(ksz), + q(3615) => q(kta), + q(3616) => q(ktb), + q(3617) => q(ktc), + q(3618) => q(ktd), + q(3619) => q(kte), + q(3620) => q(ktf), + q(3621) => q(ktg), + q(3622) => q(kth), + q(3623) => q(kti), + q(3624) => q(ktj), + q(3625) => q(ktk), + q(3626) => q(ktl), + q(3627) => q(ktm), + q(3628) => q(ktn), + q(3629) => q(kto), + q(3630) => q(ktp), + q(3631) => q(ktq), + q(3632) => q(kts), + q(3633) => q(ktt), + q(3634) => q(ktu), + q(3635) => q(ktv), + q(3636) => q(ktw), + q(3637) => q(ktx), + q(3638) => q(kty), + q(3639) => q(ktz), + q(3640) => q(kub), + q(3641) => q(kuc), + q(3642) => q(kud), + q(3643) => q(kue), + q(3644) => q(kuf), + q(3645) => q(kug), + q(3646) => q(kuh), + q(3647) => q(kui), + q(3648) => q(kuj), + q(3649) => q(kuk), + q(3650) => q(kul), + q(3651) => q(kun), + q(3652) => q(kuo), + q(3653) => q(kup), + q(3654) => q(kus), + q(3655) => q(kuu), + q(3656) => q(kuv), + q(3657) => q(kuw), + q(3658) => q(kux), + q(3659) => q(kuy), + q(3660) => q(kuz), + q(3661) => q(kva), + q(3662) => q(kvb), + q(3663) => q(kvc), + q(3664) => q(kvd), + q(3665) => q(kve), + q(3666) => q(kvf), + q(3667) => q(kvg), + q(3668) => q(kvh), + q(3669) => q(kvi), + q(3670) => q(kvj), + q(3671) => q(kvk), + q(3672) => q(kvl), + q(3673) => q(kvm), + q(3674) => q(kvn), + q(3675) => q(kvo), + q(3676) => q(kvp), + q(3677) => q(kvq), + q(3678) => q(kvr), + q(3679) => q(kvt), + q(3680) => q(kvu), + q(3681) => q(kvv), + q(3682) => q(kvw), + q(3683) => q(kvx), + q(3684) => q(kvy), + q(3685) => q(kvz), + q(3686) => q(kwa), + q(3687) => q(kwb), + q(3688) => q(kwc), + q(3689) => q(kwd), + q(3690) => q(kwe), + q(3691) => q(kwf), + q(3692) => q(kwg), + q(3693) => q(kwh), + q(3694) => q(kwi), + q(3695) => q(kwj), + q(3696) => q(kwk), + q(3697) => q(kwl), + q(3698) => q(kwm), + q(3699) => q(kwn), + q(3700) => q(kwo), + q(3701) => q(kwp), + q(3702) => q(kwr), + q(3703) => q(kws), + q(3704) => q(kwt), + q(3705) => q(kwu), + q(3706) => q(kwv), + q(3707) => q(kww), + q(3708) => q(kwx), + q(3709) => q(kwy), + q(3710) => q(kwz), + q(3711) => q(kxa), + q(3712) => q(kxb), + q(3713) => q(kxc), + q(3714) => q(kxd), + q(3715) => q(kxf), + q(3716) => q(kxh), + q(3717) => q(kxi), + q(3718) => q(kxj), + q(3719) => q(kxk), + q(3720) => q(kxl), + q(3721) => q(kxm), + q(3722) => q(kxn), + q(3723) => q(kxo), + q(3724) => q(kxp), + q(3725) => q(kxq), + q(3726) => q(kxr), + q(3727) => q(kxs), + q(3728) => q(kxt), + q(3729) => q(kxu), + q(3730) => q(kxv), + q(3731) => q(kxw), + q(3732) => q(kxx), + q(3733) => q(kxy), + q(3734) => q(kxz), + q(3735) => q(kya), + q(3736) => q(kyb), + q(3737) => q(kyc), + q(3738) => q(kyd), + q(3739) => q(kye), + q(3740) => q(kyf), + q(3741) => q(kyg), + q(3742) => q(kyh), + q(3743) => q(kyi), + q(3744) => q(kyj), + q(3745) => q(kyk), + q(3746) => q(kyl), + q(3747) => q(kym), + q(3748) => q(kyn), + q(3749) => q(kyo), + q(3750) => q(kyp), + q(3751) => q(kyq), + q(3752) => q(kyr), + q(3753) => q(kys), + q(3754) => q(kyt), + q(3755) => q(kyu), + q(3756) => q(kyv), + q(3757) => q(kyw), + q(3758) => q(kyx), + q(3759) => q(kyy), + q(3760) => q(kyz), + q(3761) => q(kza), + q(3762) => q(kzb), + q(3763) => q(kzc), + q(3764) => q(kzd), + q(3765) => q(kze), + q(3766) => q(kzf), + q(3767) => q(kzg), + q(3768) => q(kzi), + q(3769) => q(kzk), + q(3770) => q(kzl), + q(3771) => q(kzm), + q(3772) => q(kzn), + q(3773) => q(kzo), + q(3774) => q(kzp), + q(3775) => q(kzq), + q(3776) => q(kzr), + q(3777) => q(kzs), + q(3778) => q(kzu), + q(3779) => q(kzv), + q(3780) => q(kzw), + q(3781) => q(kzx), + q(3782) => q(kzy), + q(3783) => q(kzz), + q(3784) => q(laa), + q(3785) => q(lab), + q(3786) => q(lac), + q(3787) => q(lae), + q(3788) => q(laf), + q(3789) => q(lag), + q(3790) => q(lai), + q(3791) => q(laj), + q(3792) => q(lak), + q(3793) => q(lal), + q(3794) => q(lan), + q(3795) => q(lap), + q(3796) => q(laq), + q(3797) => q(lar), + q(3798) => q(las), + q(3799) => q(lau), + q(3800) => q(law), + q(3801) => q(lax), + q(3802) => q(lay), + q(3803) => q(laz), + q(3804) => q(lba), + q(3805) => q(lbb), + q(3806) => q(lbc), + q(3807) => q(lbe), + q(3808) => q(lbf), + q(3809) => q(lbg), + q(3810) => q(lbi), + q(3811) => q(lbj), + q(3812) => q(lbk), + q(3813) => q(lbl), + q(3814) => q(lbm), + q(3815) => q(lbn), + q(3816) => q(lbo), + q(3817) => q(lbq), + q(3818) => q(lbr), + q(3819) => q(lbs), + q(3820) => q(lbt), + q(3821) => q(lbu), + q(3822) => q(lbv), + q(3823) => q(lbw), + q(3824) => q(lbx), + q(3825) => q(lby), + q(3826) => q(lbz), + q(3827) => q(lcc), + q(3828) => q(lcd), + q(3829) => q(lce), + q(3830) => q(lcf), + q(3831) => q(lch), + q(3832) => q(lcl), + q(3833) => q(lcm), + q(3834) => q(lcp), + q(3835) => q(lcq), + q(3836) => q(lcs), + q(3837) => q(lda), + q(3838) => q(ldb), + q(3839) => q(ldd), + q(3840) => q(ldg), + q(3841) => q(ldh), + q(3842) => q(ldi), + q(3843) => q(ldj), + q(3844) => q(ldk), + q(3845) => q(ldl), + q(3846) => q(ldm), + q(3847) => q(ldn), + q(3848) => q(ldo), + q(3849) => q(ldp), + q(3850) => q(ldq), + q(3851) => q(lea), + q(3852) => q(leb), + q(3853) => q(lec), + q(3854) => q(led), + q(3855) => q(lee), + q(3856) => q(lef), + q(3857) => q(leh), + q(3858) => q(lei), + q(3859) => q(lej), + q(3860) => q(lek), + q(3861) => q(lel), + q(3862) => q(lem), + q(3863) => q(len), + q(3864) => q(leo), + q(3865) => q(lep), + q(3866) => q(leq), + q(3867) => q(ler), + q(3868) => q(les), + q(3869) => q(let), + q(3870) => q(leu), + q(3871) => q(lev), + q(3872) => q(lew), + q(3873) => q(lex), + q(3874) => q(ley), + q(3875) => q(lfa), + q(3876) => q(lfn), + q(3877) => q(lga), + q(3878) => q(lgb), + q(3879) => q(lgg), + q(3880) => q(lgh), + q(3881) => q(lgi), + q(3882) => q(lgk), + q(3883) => q(lgl), + q(3884) => q(lgm), + q(3885) => q(lgn), + q(3886) => q(lgq), + q(3887) => q(lgr), + q(3888) => q(lgt), + q(3889) => q(lgu), + q(3890) => q(lgz), + q(3891) => q(lha), + q(3892) => q(lhh), + q(3893) => q(lhi), + q(3894) => q(lhl), + q(3895) => q(lhm), + q(3896) => q(lhn), + q(3897) => q(lhp), + q(3898) => q(lhs), + q(3899) => q(lht), + q(3900) => q(lhu), + q(3901) => q(lia), + q(3902) => q(lib), + q(3903) => q(lic), + q(3904) => q(lid), + q(3905) => q(lie), + q(3906) => q(lif), + q(3907) => q(lig), + q(3908) => q(lih), + q(3909) => q(lij), + q(3910) => q(lik), + q(3911) => q(lil), + q(3912) => q(lio), + q(3913) => q(lip), + q(3914) => q(liq), + q(3915) => q(lir), + q(3916) => q(lis), + q(3917) => q(liu), + q(3918) => q(liv), + q(3919) => q(liw), + q(3920) => q(lix), + q(3921) => q(liy), + q(3922) => q(liz), + q(3923) => q(lja), + q(3924) => q(lje), + q(3925) => q(lji), + q(3926) => q(ljl), + q(3927) => q(ljp), + q(3928) => q(ljw), + q(3929) => q(ljx), + q(3930) => q(lka), + q(3931) => q(lkb), + q(3932) => q(lkc), + q(3933) => q(lkd), + q(3934) => q(lke), + q(3935) => q(lkh), + q(3936) => q(lki), + q(3937) => q(lkj), + q(3938) => q(lkl), + q(3939) => q(lkm), + q(3940) => q(lkn), + q(3941) => q(lko), + q(3942) => q(lkr), + q(3943) => q(lks), + q(3944) => q(lkt), + q(3945) => q(lku), + q(3946) => q(lky), + q(3947) => q(lla), + q(3948) => q(llb), + q(3949) => q(llc), + q(3950) => q(lld), + q(3951) => q(lle), + q(3952) => q(llf), + q(3953) => q(llg), + q(3954) => q(llh), + q(3955) => q(lli), + q(3956) => q(llj), + q(3957) => q(llk), + q(3958) => q(lll), + q(3959) => q(llm), + q(3960) => q(lln), + q(3961) => q(llo), + q(3962) => q(llp), + q(3963) => q(llq), + q(3964) => q(lls), + q(3965) => q(llu), + q(3966) => q(llx), + q(3967) => q(lma), + q(3968) => q(lmb), + q(3969) => q(lmc), + q(3970) => q(lmd), + q(3971) => q(lme), + q(3972) => q(lmf), + q(3973) => q(lmg), + q(3974) => q(lmh), + q(3975) => q(lmi), + q(3976) => q(lmj), + q(3977) => q(lmk), + q(3978) => q(lml), + q(3979) => q(lmn), + q(3980) => q(lmo), + q(3981) => q(lmp), + q(3982) => q(lmq), + q(3983) => q(lmr), + q(3984) => q(lmu), + q(3985) => q(lmv), + q(3986) => q(lmw), + q(3987) => q(lmx), + q(3988) => q(lmy), + q(3989) => q(lmz), + q(3990) => q(lna), + q(3991) => q(lnb), + q(3992) => q(lnd), + q(3993) => q(lng), + q(3994) => q(lnh), + q(3995) => q(lni), + q(3996) => q(lnj), + q(3997) => q(lnl), + q(3998) => q(lnm), + q(3999) => q(lnn), + q(4000) => q(lno), + q(4001) => q(lns), + q(4002) => q(lnu), + q(4003) => q(lnw), + q(4004) => q(lnz), + q(4005) => q(loa), + q(4006) => q(lob), + q(4007) => q(loc), + q(4008) => q(loe), + q(4009) => q(lof), + q(4010) => q(log), + q(4011) => q(loh), + q(4012) => q(loi), + q(4013) => q(loj), + q(4014) => q(lok), + q(4015) => q(lom), + q(4016) => q(lon), + q(4017) => q(loo), + q(4018) => q(lop), + q(4019) => q(loq), + q(4020) => q(lor), + q(4021) => q(los), + q(4022) => q(lot), + q(4023) => q(lou), + q(4024) => q(lov), + q(4025) => q(low), + q(4026) => q(lox), + q(4027) => q(loy), + q(4028) => q(lpa), + q(4029) => q(lpe), + q(4030) => q(lpn), + q(4031) => q(lpo), + q(4032) => q(lpx), + q(4033) => q(lra), + q(4034) => q(lrc), + q(4035) => q(lre), + q(4036) => q(lrg), + q(4037) => q(lri), + q(4038) => q(lrk), + q(4039) => q(lrl), + q(4040) => q(lrm), + q(4041) => q(lrn), + q(4042) => q(lro), + q(4043) => q(lrr), + q(4044) => q(lrt), + q(4045) => q(lrv), + q(4046) => q(lrz), + q(4047) => q(lsa), + q(4048) => q(lsd), + q(4049) => q(lse), + q(4050) => q(lsg), + q(4051) => q(lsh), + q(4052) => q(lsi), + q(4053) => q(lsl), + q(4054) => q(lsm), + q(4055) => q(lso), + q(4056) => q(lsp), + q(4057) => q(lsr), + q(4058) => q(lss), + q(4059) => q(lst), + q(4060) => q(lsy), + q(4061) => q(ltc), + q(4062) => q(ltg), + q(4063) => q(lth), + q(4064) => q(lti), + q(4065) => q(ltn), + q(4066) => q(lto), + q(4067) => q(lts), + q(4068) => q(ltu), + q(4069) => q(luc), + q(4070) => q(lud), + q(4071) => q(lue), + q(4072) => q(luf), + q(4073) => q(luj), + q(4074) => q(luk), + q(4075) => q(lul), + q(4076) => q(lum), + q(4077) => q(lup), + q(4078) => q(luq), + q(4079) => q(lur), + q(4080) => q(lut), + q(4081) => q(luu), + q(4082) => q(luv), + q(4083) => q(luw), + q(4084) => q(luy), + q(4085) => q(luz), + q(4086) => q(lva), + q(4087) => q(lvk), + q(4088) => q(lvs), + q(4089) => q(lvu), + q(4090) => q(lwa), + q(4091) => q(lwe), + q(4092) => q(lwg), + q(4093) => q(lwh), + q(4094) => q(lwl), + q(4095) => q(lwm), + q(4096) => q(lwo), + q(4097) => q(lwt), + q(4098) => q(lwu), + q(4099) => q(lww), + q(4100) => q(lya), + q(4101) => q(lyg), + q(4102) => q(lyn), + q(4103) => q(lzh), + q(4104) => q(lzl), + q(4105) => q(lzn), + q(4106) => q(lzz), + q(4107) => q(maa), + q(4108) => q(mab), + q(4109) => q(mae), + q(4110) => q(maf), + q(4111) => q(maj), + q(4112) => q(mam), + q(4113) => q(maq), + q(4114) => q(mat), + q(4115) => q(mau), + q(4116) => q(mav), + q(4117) => q(maw), + q(4118) => q(max), + q(4119) => q(maz), + q(4120) => q(mba), + q(4121) => q(mbb), + q(4122) => q(mbc), + q(4123) => q(mbd), + q(4124) => q(mbe), + q(4125) => q(mbf), + q(4126) => q(mbh), + q(4127) => q(mbi), + q(4128) => q(mbj), + q(4129) => q(mbk), + q(4130) => q(mbl), + q(4131) => q(mbm), + q(4132) => q(mbn), + q(4133) => q(mbo), + q(4134) => q(mbp), + q(4135) => q(mbq), + q(4136) => q(mbr), + q(4137) => q(mbs), + q(4138) => q(mbt), + q(4139) => q(mbu), + q(4140) => q(mbv), + q(4141) => q(mbw), + q(4142) => q(mbx), + q(4143) => q(mby), + q(4144) => q(mbz), + q(4145) => q(mca), + q(4146) => q(mcb), + q(4147) => q(mcc), + q(4148) => q(mcd), + q(4149) => q(mce), + q(4150) => q(mcf), + q(4151) => q(mcg), + q(4152) => q(mch), + q(4153) => q(mci), + q(4154) => q(mcj), + q(4155) => q(mck), + q(4156) => q(mcl), + q(4157) => q(mcm), + q(4158) => q(mcn), + q(4159) => q(mco), + q(4160) => q(mcp), + q(4161) => q(mcq), + q(4162) => q(mcr), + q(4163) => q(mcs), + q(4164) => q(mct), + q(4165) => q(mcu), + q(4166) => q(mcv), + q(4167) => q(mcw), + q(4168) => q(mcx), + q(4169) => q(mcy), + q(4170) => q(mcz), + q(4171) => q(mda), + q(4172) => q(mdb), + q(4173) => q(mdc), + q(4174) => q(mdd), + q(4175) => q(mde), + q(4176) => q(mdg), + q(4177) => q(mdh), + q(4178) => q(mdi), + q(4179) => q(mdj), + q(4180) => q(mdk), + q(4181) => q(mdl), + q(4182) => q(mdm), + q(4183) => q(mdn), + q(4184) => q(mdp), + q(4185) => q(mdq), + q(4186) => q(mds), + q(4187) => q(mdt), + q(4188) => q(mdu), + q(4189) => q(mdv), + q(4190) => q(mdw), + q(4191) => q(mdx), + q(4192) => q(mdy), + q(4193) => q(mdz), + q(4194) => q(mea), + q(4195) => q(meb), + q(4196) => q(mec), + q(4197) => q(med), + q(4198) => q(mee), + q(4199) => q(mef), + q(4200) => q(meh), + q(4201) => q(mei), + q(4202) => q(mej), + q(4203) => q(mek), + q(4204) => q(mel), + q(4205) => q(mem), + q(4206) => q(meo), + q(4207) => q(mep), + q(4208) => q(meq), + q(4209) => q(mer), + q(4210) => q(mes), + q(4211) => q(met), + q(4212) => q(meu), + q(4213) => q(mev), + q(4214) => q(mew), + q(4215) => q(mey), + q(4216) => q(mez), + q(4217) => q(mfa), + q(4218) => q(mfb), + q(4219) => q(mfc), + q(4220) => q(mfd), + q(4221) => q(mfe), + q(4222) => q(mff), + q(4223) => q(mfg), + q(4224) => q(mfh), + q(4225) => q(mfi), + q(4226) => q(mfj), + q(4227) => q(mfk), + q(4228) => q(mfl), + q(4229) => q(mfm), + q(4230) => q(mfn), + q(4231) => q(mfo), + q(4232) => q(mfp), + q(4233) => q(mfq), + q(4234) => q(mfr), + q(4235) => q(mfs), + q(4236) => q(mft), + q(4237) => q(mfu), + q(4238) => q(mfv), + q(4239) => q(mfw), + q(4240) => q(mfx), + q(4241) => q(mfy), + q(4242) => q(mfz), + q(4243) => q(mgb), + q(4244) => q(mgc), + q(4245) => q(mgd), + q(4246) => q(mge), + q(4247) => q(mgf), + q(4248) => q(mgg), + q(4249) => q(mgh), + q(4250) => q(mgi), + q(4251) => q(mgj), + q(4252) => q(mgk), + q(4253) => q(mgl), + q(4254) => q(mgm), + q(4255) => q(mgn), + q(4256) => q(mgo), + q(4257) => q(mgp), + q(4258) => q(mgq), + q(4259) => q(mgr), + q(4260) => q(mgs), + q(4261) => q(mgt), + q(4262) => q(mgu), + q(4263) => q(mgv), + q(4264) => q(mgw), + q(4265) => q(mgy), + q(4266) => q(mgz), + q(4267) => q(mha), + q(4268) => q(mhb), + q(4269) => q(mhc), + q(4270) => q(mhd), + q(4271) => q(mhe), + q(4272) => q(mhf), + q(4273) => q(mhg), + q(4274) => q(mhi), + q(4275) => q(mhj), + q(4276) => q(mhk), + q(4277) => q(mhl), + q(4278) => q(mhm), + q(4279) => q(mhn), + q(4280) => q(mho), + q(4281) => q(mhp), + q(4282) => q(mhq), + q(4283) => q(mhr), + q(4284) => q(mhs), + q(4285) => q(mht), + q(4286) => q(mhu), + q(4287) => q(mhw), + q(4288) => q(mhx), + q(4289) => q(mhy), + q(4290) => q(mhz), + q(4291) => q(mia), + q(4292) => q(mib), + q(4293) => q(mid), + q(4294) => q(mie), + q(4295) => q(mif), + q(4296) => q(mig), + q(4297) => q(mih), + q(4298) => q(mii), + q(4299) => q(mij), + q(4300) => q(mik), + q(4301) => q(mil), + q(4302) => q(mim), + q(4303) => q(mio), + q(4304) => q(mip), + q(4305) => q(miq), + q(4306) => q(mir), + q(4307) => q(mit), + q(4308) => q(miu), + q(4309) => q(miw), + q(4310) => q(mix), + q(4311) => q(miy), + q(4312) => q(miz), + q(4313) => q(mjb), + q(4314) => q(mjc), + q(4315) => q(mjd), + q(4316) => q(mje), + q(4317) => q(mjg), + q(4318) => q(mjh), + q(4319) => q(mji), + q(4320) => q(mjj), + q(4321) => q(mjk), + q(4322) => q(mjl), + q(4323) => q(mjm), + q(4324) => q(mjn), + q(4325) => q(mjo), + q(4326) => q(mjp), + q(4327) => q(mjq), + q(4328) => q(mjr), + q(4329) => q(mjs), + q(4330) => q(mjt), + q(4331) => q(mju), + q(4332) => q(mjv), + q(4333) => q(mjw), + q(4334) => q(mjx), + q(4335) => q(mjy), + q(4336) => q(mjz), + q(4337) => q(mka), + q(4338) => q(mkb), + q(4339) => q(mkc), + q(4340) => q(mke), + q(4341) => q(mkf), + q(4342) => q(mkg), + q(4343) => q(mki), + q(4344) => q(mkj), + q(4345) => q(mkk), + q(4346) => q(mkl), + q(4347) => q(mkm), + q(4348) => q(mkn), + q(4349) => q(mko), + q(4350) => q(mkp), + q(4351) => q(mkq), + q(4352) => q(mkr), + q(4353) => q(mks), + q(4354) => q(mkt), + q(4355) => q(mku), + q(4356) => q(mkv), + q(4357) => q(mkw), + q(4358) => q(mkx), + q(4359) => q(mky), + q(4360) => q(mkz), + q(4361) => q(mla), + q(4362) => q(mlb), + q(4363) => q(mlc), + q(4364) => q(mle), + q(4365) => q(mlf), + q(4366) => q(mlh), + q(4367) => q(mli), + q(4368) => q(mlj), + q(4369) => q(mlk), + q(4370) => q(mll), + q(4371) => q(mlm), + q(4372) => q(mln), + q(4373) => q(mlo), + q(4374) => q(mlp), + q(4375) => q(mlq), + q(4376) => q(mlr), + q(4377) => q(mls), + q(4378) => q(mlu), + q(4379) => q(mlv), + q(4380) => q(mlw), + q(4381) => q(mlx), + q(4382) => q(mlz), + q(4383) => q(mma), + q(4384) => q(mmb), + q(4385) => q(mmc), + q(4386) => q(mmd), + q(4387) => q(mme), + q(4388) => q(mmf), + q(4389) => q(mmg), + q(4390) => q(mmh), + q(4391) => q(mmi), + q(4392) => q(mmj), + q(4393) => q(mmk), + q(4394) => q(mml), + q(4395) => q(mmm), + q(4396) => q(mmn), + q(4397) => q(mmo), + q(4398) => q(mmp), + q(4399) => q(mmq), + q(4400) => q(mmr), + q(4401) => q(mmt), + q(4402) => q(mmu), + q(4403) => q(mmv), + q(4404) => q(mmw), + q(4405) => q(mmx), + q(4406) => q(mmy), + q(4407) => q(mmz), + q(4408) => q(mna), + q(4409) => q(mnb), + q(4410) => q(mnd), + q(4411) => q(mne), + q(4412) => q(mnf), + q(4413) => q(mng), + q(4414) => q(mnh), + q(4415) => q(mnj), + q(4416) => q(mnk), + q(4417) => q(mnl), + q(4418) => q(mnm), + q(4419) => q(mnn), + q(4420) => q(mnp), + q(4421) => q(mnq), + q(4422) => q(mnr), + q(4423) => q(mns), + q(4424) => q(mnu), + q(4425) => q(mnv), + q(4426) => q(mnw), + q(4427) => q(mnx), + q(4428) => q(mny), + q(4429) => q(mnz), + q(4430) => q(moa), + q(4431) => q(moc), + q(4432) => q(mod), + q(4433) => q(moe), + q(4434) => q(mog), + q(4435) => q(moi), + q(4436) => q(moj), + q(4437) => q(mok), + q(4438) => q(mom), + q(4439) => q(moo), + q(4440) => q(mop), + q(4441) => q(moq), + q(4442) => q(mor), + q(4443) => q(mou), + q(4444) => q(mov), + q(4445) => q(mow), + q(4446) => q(mox), + q(4447) => q(moy), + q(4448) => q(moz), + q(4449) => q(mpa), + q(4450) => q(mpb), + q(4451) => q(mpc), + q(4452) => q(mpd), + q(4453) => q(mpe), + q(4454) => q(mpg), + q(4455) => q(mph), + q(4456) => q(mpi), + q(4457) => q(mpj), + q(4458) => q(mpk), + q(4459) => q(mpl), + q(4460) => q(mpm), + q(4461) => q(mpn), + q(4462) => q(mpo), + q(4463) => q(mpp), + q(4464) => q(mpq), + q(4465) => q(mpr), + q(4466) => q(mps), + q(4467) => q(mpt), + q(4468) => q(mpu), + q(4469) => q(mpv), + q(4470) => q(mpw), + q(4471) => q(mpx), + q(4472) => q(mpy), + q(4473) => q(mpz), + q(4474) => q(mqa), + q(4475) => q(mqb), + q(4476) => q(mqc), + q(4477) => q(mqe), + q(4478) => q(mqf), + q(4479) => q(mqg), + q(4480) => q(mqh), + q(4481) => q(mqi), + q(4482) => q(mqj), + q(4483) => q(mqk), + q(4484) => q(mql), + q(4485) => q(mqm), + q(4486) => q(mqn), + q(4487) => q(mqo), + q(4488) => q(mqp), + q(4489) => q(mqq), + q(4490) => q(mqr), + q(4491) => q(mqs), + q(4492) => q(mqt), + q(4493) => q(mqu), + q(4494) => q(mqv), + q(4495) => q(mqw), + q(4496) => q(mqx), + q(4497) => q(mqy), + q(4498) => q(mqz), + q(4499) => q(mra), + q(4500) => q(mrb), + q(4501) => q(mrc), + q(4502) => q(mrd), + q(4503) => q(mre), + q(4504) => q(mrf), + q(4505) => q(mrg), + q(4506) => q(mrh), + q(4507) => q(mrj), + q(4508) => q(mrk), + q(4509) => q(mrl), + q(4510) => q(mrm), + q(4511) => q(mrn), + q(4512) => q(mro), + q(4513) => q(mrp), + q(4514) => q(mrq), + q(4515) => q(mrr), + q(4516) => q(mrs), + q(4517) => q(mrt), + q(4518) => q(mru), + q(4519) => q(mrv), + q(4520) => q(mrw), + q(4521) => q(mrx), + q(4522) => q(mry), + q(4523) => q(mrz), + q(4524) => q(msb), + q(4525) => q(msc), + q(4526) => q(msd), + q(4527) => q(mse), + q(4528) => q(msf), + q(4529) => q(msg), + q(4530) => q(msh), + q(4531) => q(msi), + q(4532) => q(msj), + q(4533) => q(msk), + q(4534) => q(msl), + q(4535) => q(msm), + q(4536) => q(msn), + q(4537) => q(mso), + q(4538) => q(msp), + q(4539) => q(msq), + q(4540) => q(msr), + q(4541) => q(mss), + q(4542) => q(msu), + q(4543) => q(msv), + q(4544) => q(msw), + q(4545) => q(msx), + q(4546) => q(msy), + q(4547) => q(msz), + q(4548) => q(mta), + q(4549) => q(mtb), + q(4550) => q(mtc), + q(4551) => q(mtd), + q(4552) => q(mte), + q(4553) => q(mtf), + q(4554) => q(mtg), + q(4555) => q(mth), + q(4556) => q(mti), + q(4557) => q(mtj), + q(4558) => q(mtk), + q(4559) => q(mtl), + q(4560) => q(mtm), + q(4561) => q(mtn), + q(4562) => q(mto), + q(4563) => q(mtp), + q(4564) => q(mtq), + q(4565) => q(mtr), + q(4566) => q(mts), + q(4567) => q(mtt), + q(4568) => q(mtu), + q(4569) => q(mtv), + q(4570) => q(mtw), + q(4571) => q(mtx), + q(4572) => q(mty), + q(4573) => q(mua), + q(4574) => q(mub), + q(4575) => q(muc), + q(4576) => q(mud), + q(4577) => q(mue), + q(4578) => q(mug), + q(4579) => q(muh), + q(4580) => q(mui), + q(4581) => q(muj), + q(4582) => q(muk), + q(4583) => q(mum), + q(4584) => q(muo), + q(4585) => q(mup), + q(4586) => q(muq), + q(4587) => q(mur), + q(4588) => q(mut), + q(4589) => q(muu), + q(4590) => q(muv), + q(4591) => q(mux), + q(4592) => q(muy), + q(4593) => q(muz), + q(4594) => q(mva), + q(4595) => q(mvb), + q(4596) => q(mvd), + q(4597) => q(mve), + q(4598) => q(mvf), + q(4599) => q(mvg), + q(4600) => q(mvh), + q(4601) => q(mvi), + q(4602) => q(mvk), + q(4603) => q(mvl), + q(4604) => q(mvm), + q(4605) => q(mvn), + q(4606) => q(mvo), + q(4607) => q(mvp), + q(4608) => q(mvq), + q(4609) => q(mvr), + q(4610) => q(mvs), + q(4611) => q(mvt), + q(4612) => q(mvu), + q(4613) => q(mvv), + q(4614) => q(mvw), + q(4615) => q(mvx), + q(4616) => q(mvy), + q(4617) => q(mvz), + q(4618) => q(mwa), + q(4619) => q(mwb), + q(4620) => q(mwc), + q(4621) => q(mwe), + q(4622) => q(mwf), + q(4623) => q(mwg), + q(4624) => q(mwh), + q(4625) => q(mwi), + q(4626) => q(mwk), + q(4627) => q(mwm), + q(4628) => q(mwn), + q(4629) => q(mwo), + q(4630) => q(mwp), + q(4631) => q(mwq), + q(4632) => q(mws), + q(4633) => q(mwt), + q(4634) => q(mwu), + q(4635) => q(mwv), + q(4636) => q(mww), + q(4637) => q(mwx), + q(4638) => q(mwy), + q(4639) => q(mwz), + q(4640) => q(mxa), + q(4641) => q(mxb), + q(4642) => q(mxc), + q(4643) => q(mxd), + q(4644) => q(mxe), + q(4645) => q(mxf), + q(4646) => q(mxg), + q(4647) => q(mxh), + q(4648) => q(mxi), + q(4649) => q(mxj), + q(4650) => q(mxk), + q(4651) => q(mxl), + q(4652) => q(mxm), + q(4653) => q(mxn), + q(4654) => q(mxo), + q(4655) => q(mxp), + q(4656) => q(mxq), + q(4657) => q(mxr), + q(4658) => q(mxs), + q(4659) => q(mxt), + q(4660) => q(mxu), + q(4661) => q(mxv), + q(4662) => q(mxw), + q(4663) => q(mxx), + q(4664) => q(mxy), + q(4665) => q(mxz), + q(4666) => q(myb), + q(4667) => q(myc), + q(4668) => q(myd), + q(4669) => q(mye), + q(4670) => q(myf), + q(4671) => q(myg), + q(4672) => q(myh), + q(4673) => q(myi), + q(4674) => q(myj), + q(4675) => q(myk), + q(4676) => q(myl), + q(4677) => q(mym), + q(4678) => q(myo), + q(4679) => q(myp), + q(4680) => q(myr), + q(4681) => q(mys), + q(4682) => q(myu), + q(4683) => q(myw), + q(4684) => q(myx), + q(4685) => q(myy), + q(4686) => q(myz), + q(4687) => q(mza), + q(4688) => q(mzb), + q(4689) => q(mzc), + q(4690) => q(mzd), + q(4691) => q(mze), + q(4692) => q(mzg), + q(4693) => q(mzh), + q(4694) => q(mzi), + q(4695) => q(mzj), + q(4696) => q(mzk), + q(4697) => q(mzl), + q(4698) => q(mzm), + q(4699) => q(mzn), + q(4700) => q(mzo), + q(4701) => q(mzp), + q(4702) => q(mzq), + q(4703) => q(mzr), + q(4704) => q(mzs), + q(4705) => q(mzt), + q(4706) => q(mzu), + q(4707) => q(mzv), + q(4708) => q(mzw), + q(4709) => q(mzx), + q(4710) => q(mzy), + q(4711) => q(mzz), + q(4712) => q(naa), + q(4713) => q(nab), + q(4714) => q(nac), + q(4715) => q(nae), + q(4716) => q(naf), + q(4717) => q(nag), + q(4718) => q(naj), + q(4719) => q(nak), + q(4720) => q(nal), + q(4721) => q(nam), + q(4722) => q(nan), + q(4723) => q(nao), + q(4724) => q(naq), + q(4725) => q(nar), + q(4726) => q(nas), + q(4727) => q(nat), + q(4728) => q(naw), + q(4729) => q(nax), + q(4730) => q(nay), + q(4731) => q(naz), + q(4732) => q(nba), + q(4733) => q(nbb), + q(4734) => q(nbc), + q(4735) => q(nbd), + q(4736) => q(nbe), + q(4737) => q(nbg), + q(4738) => q(nbh), + q(4739) => q(nbi), + q(4740) => q(nbj), + q(4741) => q(nbk), + q(4742) => q(nbm), + q(4743) => q(nbn), + q(4744) => q(nbo), + q(4745) => q(nbp), + q(4746) => q(nbq), + q(4747) => q(nbr), + q(4748) => q(nbs), + q(4749) => q(nbt), + q(4750) => q(nbu), + q(4751) => q(nbv), + q(4752) => q(nbw), + q(4753) => q(nby), + q(4754) => q(nca), + q(4755) => q(ncb), + q(4756) => q(ncc), + q(4757) => q(ncd), + q(4758) => q(nce), + q(4759) => q(ncf), + q(4760) => q(ncg), + q(4761) => q(nch), + q(4762) => q(nci), + q(4763) => q(ncj), + q(4764) => q(nck), + q(4765) => q(ncl), + q(4766) => q(ncm), + q(4767) => q(ncn), + q(4768) => q(nco), + q(4769) => q(ncp), + q(4770) => q(ncq), + q(4771) => q(ncr), + q(4772) => q(ncs), + q(4773) => q(nct), + q(4774) => q(ncu), + q(4775) => q(ncx), + q(4776) => q(ncz), + q(4777) => q(nda), + q(4778) => q(ndb), + q(4779) => q(ndc), + q(4780) => q(ndd), + q(4781) => q(ndf), + q(4782) => q(ndg), + q(4783) => q(ndh), + q(4784) => q(ndi), + q(4785) => q(ndj), + q(4786) => q(ndk), + q(4787) => q(ndl), + q(4788) => q(ndm), + q(4789) => q(ndn), + q(4790) => q(ndp), + q(4791) => q(ndq), + q(4792) => q(ndr), + q(4793) => q(ndt), + q(4794) => q(ndu), + q(4795) => q(ndv), + q(4796) => q(ndw), + q(4797) => q(ndx), + q(4798) => q(ndy), + q(4799) => q(ndz), + q(4800) => q(nea), + q(4801) => q(neb), + q(4802) => q(nec), + q(4803) => q(ned), + q(4804) => q(nee), + q(4805) => q(nef), + q(4806) => q(neg), + q(4807) => q(neh), + q(4808) => q(nei), + q(4809) => q(nej), + q(4810) => q(nek), + q(4811) => q(nem), + q(4812) => q(nen), + q(4813) => q(neo), + q(4814) => q(neq), + q(4815) => q(ner), + q(4816) => q(nes), + q(4817) => q(net), + q(4818) => q(neu), + q(4819) => q(nev), + q(4820) => q(nex), + q(4821) => q(ney), + q(4822) => q(nez), + q(4823) => q(nfa), + q(4824) => q(nfd), + q(4825) => q(nfl), + q(4826) => q(nfr), + q(4827) => q(nfu), + q(4828) => q(nga), + q(4829) => q(ngb), + q(4830) => q(ngc), + q(4831) => q(ngd), + q(4832) => q(nge), + q(4833) => q(ngg), + q(4834) => q(ngh), + q(4835) => q(ngi), + q(4836) => q(ngj), + q(4837) => q(ngk), + q(4838) => q(ngl), + q(4839) => q(ngm), + q(4840) => q(ngn), + q(4841) => q(ngo), + q(4842) => q(ngp), + q(4843) => q(ngq), + q(4844) => q(ngr), + q(4845) => q(ngs), + q(4846) => q(ngt), + q(4847) => q(ngu), + q(4848) => q(ngv), + q(4849) => q(ngw), + q(4850) => q(ngx), + q(4851) => q(ngy), + q(4852) => q(ngz), + q(4853) => q(nha), + q(4854) => q(nhb), + q(4855) => q(nhc), + q(4856) => q(nhd), + q(4857) => q(nhe), + q(4858) => q(nhf), + q(4859) => q(nhg), + q(4860) => q(nhh), + q(4861) => q(nhi), + q(4862) => q(nhk), + q(4863) => q(nhm), + q(4864) => q(nhn), + q(4865) => q(nho), + q(4866) => q(nhp), + q(4867) => q(nhq), + q(4868) => q(nhr), + q(4869) => q(nht), + q(4870) => q(nhu), + q(4871) => q(nhv), + q(4872) => q(nhw), + q(4873) => q(nhx), + q(4874) => q(nhy), + q(4875) => q(nhz), + q(4876) => q(nib), + q(4877) => q(nid), + q(4878) => q(nie), + q(4879) => q(nif), + q(4880) => q(nig), + q(4881) => q(nih), + q(4882) => q(nii), + q(4883) => q(nij), + q(4884) => q(nik), + q(4885) => q(nil), + q(4886) => q(nim), + q(4887) => q(nin), + q(4888) => q(nio), + q(4889) => q(niq), + q(4890) => q(nir), + q(4891) => q(nis), + q(4892) => q(nit), + q(4893) => q(niv), + q(4894) => q(niw), + q(4895) => q(nix), + q(4896) => q(niy), + q(4897) => q(niz), + q(4898) => q(nja), + q(4899) => q(njb), + q(4900) => q(njd), + q(4901) => q(njh), + q(4902) => q(nji), + q(4903) => q(njj), + q(4904) => q(njl), + q(4905) => q(njm), + q(4906) => q(njn), + q(4907) => q(njo), + q(4908) => q(njr), + q(4909) => q(njs), + q(4910) => q(njt), + q(4911) => q(nju), + q(4912) => q(njx), + q(4913) => q(njy), + q(4914) => q(njz), + q(4915) => q(nka), + q(4916) => q(nkb), + q(4917) => q(nkc), + q(4918) => q(nkd), + q(4919) => q(nke), + q(4920) => q(nkf), + q(4921) => q(nkg), + q(4922) => q(nkh), + q(4923) => q(nki), + q(4924) => q(nkj), + q(4925) => q(nkk), + q(4926) => q(nkm), + q(4927) => q(nkn), + q(4928) => q(nko), + q(4929) => q(nkp), + q(4930) => q(nkq), + q(4931) => q(nkr), + q(4932) => q(nks), + q(4933) => q(nkt), + q(4934) => q(nku), + q(4935) => q(nkv), + q(4936) => q(nkw), + q(4937) => q(nkx), + q(4938) => q(nkz), + q(4939) => q(nla), + q(4940) => q(nlc), + q(4941) => q(nle), + q(4942) => q(nlg), + q(4943) => q(nli), + q(4944) => q(nlj), + q(4945) => q(nlk), + q(4946) => q(nll), + q(4947) => q(nlo), + q(4948) => q(nlq), + q(4949) => q(nlu), + q(4950) => q(nlv), + q(4951) => q(nlw), + q(4952) => q(nlx), + q(4953) => q(nly), + q(4954) => q(nlz), + q(4955) => q(nma), + q(4956) => q(nmb), + q(4957) => q(nmc), + q(4958) => q(nmd), + q(4959) => q(nme), + q(4960) => q(nmf), + q(4961) => q(nmg), + q(4962) => q(nmh), + q(4963) => q(nmi), + q(4964) => q(nmj), + q(4965) => q(nmk), + q(4966) => q(nml), + q(4967) => q(nmm), + q(4968) => q(nmn), + q(4969) => q(nmo), + q(4970) => q(nmp), + q(4971) => q(nmq), + q(4972) => q(nmr), + q(4973) => q(nms), + q(4974) => q(nmt), + q(4975) => q(nmu), + q(4976) => q(nmv), + q(4977) => q(nmw), + q(4978) => q(nmx), + q(4979) => q(nmy), + q(4980) => q(nmz), + q(4981) => q(nna), + q(4982) => q(nnb), + q(4983) => q(nnc), + q(4984) => q(nnd), + q(4985) => q(nne), + q(4986) => q(nnf), + q(4987) => q(nng), + q(4988) => q(nnh), + q(4989) => q(nni), + q(4990) => q(nnj), + q(4991) => q(nnk), + q(4992) => q(nnl), + q(4993) => q(nnm), + q(4994) => q(nnn), + q(4995) => q(nnp), + q(4996) => q(nnq), + q(4997) => q(nnr), + q(4998) => q(nns), + q(4999) => q(nnt), + q(5000) => q(nnu), + q(5001) => q(nnv), + q(5002) => q(nnw), + q(5003) => q(nny), + q(5004) => q(nnz), + q(5005) => q(noa), + q(5006) => q(noc), + q(5007) => q(nod), + q(5008) => q(noe), + q(5009) => q(nof), + q(5010) => q(noh), + q(5011) => q(noi), + q(5012) => q(noj), + q(5013) => q(nok), + q(5014) => q(nol), + q(5015) => q(nom), + q(5016) => q(nop), + q(5017) => q(noq), + q(5018) => q(nos), + q(5019) => q(not), + q(5020) => q(nou), + q(5021) => q(nov), + q(5022) => q(now), + q(5023) => q(noy), + q(5024) => q(noz), + q(5025) => q(npa), + q(5026) => q(npb), + q(5027) => q(npg), + q(5028) => q(nph), + q(5029) => q(npi), + q(5030) => q(npl), + q(5031) => q(npn), + q(5032) => q(npo), + q(5033) => q(nps), + q(5034) => q(npu), + q(5035) => q(npx), + q(5036) => q(npy), + q(5037) => q(nqg), + q(5038) => q(nqk), + q(5039) => q(nql), + q(5040) => q(nqm), + q(5041) => q(nqn), + q(5042) => q(nqq), + q(5043) => q(nqy), + q(5044) => q(nra), + q(5045) => q(nrb), + q(5046) => q(nrc), + q(5047) => q(nre), + q(5048) => q(nrf), + q(5049) => q(nrg), + q(5050) => q(nri), + q(5051) => q(nrk), + q(5052) => q(nrl), + q(5053) => q(nrm), + q(5054) => q(nrn), + q(5055) => q(nrp), + q(5056) => q(nrr), + q(5057) => q(nrt), + q(5058) => q(nru), + q(5059) => q(nrx), + q(5060) => q(nrz), + q(5061) => q(nsa), + q(5062) => q(nsc), + q(5063) => q(nsd), + q(5064) => q(nse), + q(5065) => q(nsf), + q(5066) => q(nsg), + q(5067) => q(nsh), + q(5068) => q(nsi), + q(5069) => q(nsk), + q(5070) => q(nsl), + q(5071) => q(nsm), + q(5072) => q(nsn), + q(5073) => q(nsp), + q(5074) => q(nsq), + q(5075) => q(nsr), + q(5076) => q(nss), + q(5077) => q(nst), + q(5078) => q(nsu), + q(5079) => q(nsv), + q(5080) => q(nsw), + q(5081) => q(nsx), + q(5082) => q(nsy), + q(5083) => q(nsz), + q(5084) => q(ntd), + q(5085) => q(nte), + q(5086) => q(ntg), + q(5087) => q(nti), + q(5088) => q(ntj), + q(5089) => q(ntk), + q(5090) => q(ntm), + q(5091) => q(nto), + q(5092) => q(ntp), + q(5093) => q(ntr), + q(5094) => q(ntu), + q(5095) => q(ntw), + q(5096) => q(ntx), + q(5097) => q(nty), + q(5098) => q(ntz), + q(5099) => q(nua), + q(5100) => q(nuc), + q(5101) => q(nud), + q(5102) => q(nue), + q(5103) => q(nuf), + q(5104) => q(nug), + q(5105) => q(nuh), + q(5106) => q(nui), + q(5107) => q(nuj), + q(5108) => q(nuk), + q(5109) => q(nul), + q(5110) => q(num), + q(5111) => q(nun), + q(5112) => q(nuo), + q(5113) => q(nup), + q(5114) => q(nuq), + q(5115) => q(nur), + q(5116) => q(nus), + q(5117) => q(nut), + q(5118) => q(nuu), + q(5119) => q(nuv), + q(5120) => q(nuw), + q(5121) => q(nux), + q(5122) => q(nuy), + q(5123) => q(nuz), + q(5124) => q(nvh), + q(5125) => q(nvm), + q(5126) => q(nvo), + q(5127) => q(nwa), + q(5128) => q(nwb), + q(5129) => q(nwe), + q(5130) => q(nwg), + q(5131) => q(nwi), + q(5132) => q(nwm), + q(5133) => q(nwo), + q(5134) => q(nwr), + q(5135) => q(nwx), + q(5136) => q(nwy), + q(5137) => q(nxa), + q(5138) => q(nxd), + q(5139) => q(nxe), + q(5140) => q(nxg), + q(5141) => q(nxi), + q(5142) => q(nxk), + q(5143) => q(nxl), + q(5144) => q(nxm), + q(5145) => q(nxn), + q(5146) => q(nxo), + q(5147) => q(nxq), + q(5148) => q(nxr), + q(5149) => q(nxu), + q(5150) => q(nxx), + q(5151) => q(nyb), + q(5152) => q(nyc), + q(5153) => q(nyd), + q(5154) => q(nye), + q(5155) => q(nyf), + q(5156) => q(nyg), + q(5157) => q(nyh), + q(5158) => q(nyi), + q(5159) => q(nyj), + q(5160) => q(nyk), + q(5161) => q(nyl), + q(5162) => q(nyp), + q(5163) => q(nyq), + q(5164) => q(nyr), + q(5165) => q(nys), + q(5166) => q(nyt), + q(5167) => q(nyu), + q(5168) => q(nyv), + q(5169) => q(nyw), + q(5170) => q(nyx), + q(5171) => q(nyy), + q(5172) => q(nza), + q(5173) => q(nzb), + q(5174) => q(nzk), + q(5175) => q(nzm), + q(5176) => q(nzs), + q(5177) => q(nzu), + q(5178) => q(nzy), + q(5179) => q(nzz), + q(5180) => q(oaa), + q(5181) => q(oac), + q(5182) => q(oar), + q(5183) => q(oav), + q(5184) => q(obi), + q(5185) => q(obk), + q(5186) => q(obl), + q(5187) => q(obm), + q(5188) => q(obo), + q(5189) => q(obr), + q(5190) => q(obt), + q(5191) => q(obu), + q(5192) => q(oca), + q(5193) => q(och), + q(5194) => q(oco), + q(5195) => q(ocu), + q(5196) => q(oda), + q(5197) => q(odk), + q(5198) => q(odt), + q(5199) => q(odu), + q(5200) => q(ofo), + q(5201) => q(ofs), + q(5202) => q(ofu), + q(5203) => q(ogb), + q(5204) => q(ogc), + q(5205) => q(oge), + q(5206) => q(ogg), + q(5207) => q(ogo), + q(5208) => q(ogu), + q(5209) => q(oht), + q(5210) => q(ohu), + q(5211) => q(oia), + q(5212) => q(oin), + q(5213) => q(ojb), + q(5214) => q(ojc), + q(5215) => q(ojg), + q(5216) => q(ojp), + q(5217) => q(ojs), + q(5218) => q(ojv), + q(5219) => q(ojw), + q(5220) => q(oka), + q(5221) => q(okb), + q(5222) => q(okd), + q(5223) => q(oke), + q(5224) => q(okg), + q(5225) => q(okh), + q(5226) => q(oki), + q(5227) => q(okj), + q(5228) => q(okk), + q(5229) => q(okl), + q(5230) => q(okm), + q(5231) => q(okn), + q(5232) => q(oko), + q(5233) => q(okr), + q(5234) => q(oks), + q(5235) => q(oku), + q(5236) => q(okv), + q(5237) => q(okx), + q(5238) => q(ola), + q(5239) => q(old), + q(5240) => q(ole), + q(5241) => q(olk), + q(5242) => q(olm), + q(5243) => q(olo), + q(5244) => q(olr), + q(5245) => q(olt), + q(5246) => q(olu), + q(5247) => q(oma), + q(5248) => q(omb), + q(5249) => q(omc), + q(5250) => q(omg), + q(5251) => q(omi), + q(5252) => q(omk), + q(5253) => q(oml), + q(5254) => q(omn), + q(5255) => q(omo), + q(5256) => q(omp), + q(5257) => q(omr), + q(5258) => q(omt), + q(5259) => q(omu), + q(5260) => q(omw), + q(5261) => q(omx), + q(5262) => q(ona), + q(5263) => q(onb), + q(5264) => q(one), + q(5265) => q(ong), + q(5266) => q(oni), + q(5267) => q(onj), + q(5268) => q(onk), + q(5269) => q(onn), + q(5270) => q(ono), + q(5271) => q(onp), + q(5272) => q(onr), + q(5273) => q(ons), + q(5274) => q(ont), + q(5275) => q(onu), + q(5276) => q(onw), + q(5277) => q(onx), + q(5278) => q(ood), + q(5279) => q(oog), + q(5280) => q(oon), + q(5281) => q(oor), + q(5282) => q(oos), + q(5283) => q(opa), + q(5284) => q(opk), + q(5285) => q(opm), + q(5286) => q(opo), + q(5287) => q(opt), + q(5288) => q(opy), + q(5289) => q(ora), + q(5290) => q(orc), + q(5291) => q(ore), + q(5292) => q(org), + q(5293) => q(orh), + q(5294) => q(orn), + q(5295) => q(oro), + q(5296) => q(orr), + q(5297) => q(ors), + q(5298) => q(ort), + q(5299) => q(oru), + q(5300) => q(orv), + q(5301) => q(orw), + q(5302) => q(orx), + q(5303) => q(ory), + q(5304) => q(orz), + q(5305) => q(osc), + q(5306) => q(osi), + q(5307) => q(oso), + q(5308) => q(osp), + q(5309) => q(ost), + q(5310) => q(osu), + q(5311) => q(osx), + q(5312) => q(otb), + q(5313) => q(otd), + q(5314) => q(ote), + q(5315) => q(oti), + q(5316) => q(otk), + q(5317) => q(otl), + q(5318) => q(otm), + q(5319) => q(otn), + q(5320) => q(otq), + q(5321) => q(otr), + q(5322) => q(ots), + q(5323) => q(ott), + q(5324) => q(otu), + q(5325) => q(otw), + q(5326) => q(otx), + q(5327) => q(oty), + q(5328) => q(otz), + q(5329) => q(oua), + q(5330) => q(oub), + q(5331) => q(oue), + q(5332) => q(oui), + q(5333) => q(oum), + q(5334) => q(ovd), + q(5335) => q(owi), + q(5336) => q(owl), + q(5337) => q(oyb), + q(5338) => q(oyd), + q(5339) => q(oym), + q(5340) => q(oyy), + q(5341) => q(ozm), + q(5342) => q(pab), + q(5343) => q(pac), + q(5344) => q(pad), + q(5345) => q(pae), + q(5346) => q(paf), + q(5347) => q(pah), + q(5348) => q(pai), + q(5349) => q(pak), + q(5350) => q(pao), + q(5351) => q(paq), + q(5352) => q(par), + q(5353) => q(pas), + q(5354) => q(pat), + q(5355) => q(pav), + q(5356) => q(paw), + q(5357) => q(pax), + q(5358) => q(pay), + q(5359) => q(paz), + q(5360) => q(pbb), + q(5361) => q(pbc), + q(5362) => q(pbe), + q(5363) => q(pbf), + q(5364) => q(pbg), + q(5365) => q(pbh), + q(5366) => q(pbi), + q(5367) => q(pbl), + q(5368) => q(pbn), + q(5369) => q(pbo), + q(5370) => q(pbp), + q(5371) => q(pbr), + q(5372) => q(pbs), + q(5373) => q(pbt), + q(5374) => q(pbu), + q(5375) => q(pbv), + q(5376) => q(pby), + q(5377) => q(pca), + q(5378) => q(pcb), + q(5379) => q(pcc), + q(5380) => q(pcd), + q(5381) => q(pce), + q(5382) => q(pcf), + q(5383) => q(pcg), + q(5384) => q(pch), + q(5385) => q(pci), + q(5386) => q(pcj), + q(5387) => q(pck), + q(5388) => q(pcl), + q(5389) => q(pcm), + q(5390) => q(pcn), + q(5391) => q(pcp), + q(5392) => q(pcw), + q(5393) => q(pda), + q(5394) => q(pdc), + q(5395) => q(pdi), + q(5396) => q(pdn), + q(5397) => q(pdo), + q(5398) => q(pdt), + q(5399) => q(pdu), + q(5400) => q(pea), + q(5401) => q(peb), + q(5402) => q(ped), + q(5403) => q(pee), + q(5404) => q(pef), + q(5405) => q(peg), + q(5406) => q(peh), + q(5407) => q(pei), + q(5408) => q(pej), + q(5409) => q(pek), + q(5410) => q(pel), + q(5411) => q(pem), + q(5412) => q(pep), + q(5413) => q(peq), + q(5414) => q(pes), + q(5415) => q(pev), + q(5416) => q(pex), + q(5417) => q(pey), + q(5418) => q(pez), + q(5419) => q(pfa), + q(5420) => q(pfe), + q(5421) => q(pfl), + q(5422) => q(pga), + q(5423) => q(pgd), + q(5424) => q(pgg), + q(5425) => q(pgi), + q(5426) => q(pgk), + q(5427) => q(pgl), + q(5428) => q(pgn), + q(5429) => q(pgs), + q(5430) => q(pgu), + q(5431) => q(pgz), + q(5432) => q(pha), + q(5433) => q(phd), + q(5434) => q(phg), + q(5435) => q(phh), + q(5436) => q(phk), + q(5437) => q(phl), + q(5438) => q(phm), + q(5439) => q(pho), + q(5440) => q(phq), + q(5441) => q(phr), + q(5442) => q(pht), + q(5443) => q(phu), + q(5444) => q(phv), + q(5445) => q(phw), + q(5446) => q(pia), + q(5447) => q(pib), + q(5448) => q(pic), + q(5449) => q(pid), + q(5450) => q(pie), + q(5451) => q(pif), + q(5452) => q(pig), + q(5453) => q(pih), + q(5454) => q(pii), + q(5455) => q(pij), + q(5456) => q(pil), + q(5457) => q(pim), + q(5458) => q(pin), + q(5459) => q(pio), + q(5460) => q(pip), + q(5461) => q(pir), + q(5462) => q(pis), + q(5463) => q(pit), + q(5464) => q(piu), + q(5465) => q(piv), + q(5466) => q(piw), + q(5467) => q(pix), + q(5468) => q(piy), + q(5469) => q(piz), + q(5470) => q(pjt), + q(5471) => q(pka), + q(5472) => q(pkb), + q(5473) => q(pkc), + q(5474) => q(pkg), + q(5475) => q(pkh), + q(5476) => q(pkn), + q(5477) => q(pko), + q(5478) => q(pkp), + q(5479) => q(pkr), + q(5480) => q(pks), + q(5481) => q(pkt), + q(5482) => q(pku), + q(5483) => q(pla), + q(5484) => q(plb), + q(5485) => q(plc), + q(5486) => q(pld), + q(5487) => q(ple), + q(5488) => q(plg), + q(5489) => q(plh), + q(5490) => q(plj), + q(5491) => q(plk), + q(5492) => q(pll), + q(5493) => q(pln), + q(5494) => q(plo), + q(5495) => q(plp), + q(5496) => q(plq), + q(5497) => q(plr), + q(5498) => q(pls), + q(5499) => q(plt), + q(5500) => q(plu), + q(5501) => q(plv), + q(5502) => q(plw), + q(5503) => q(ply), + q(5504) => q(plz), + q(5505) => q(pma), + q(5506) => q(pmb), + q(5507) => q(pmd), + q(5508) => q(pme), + q(5509) => q(pmf), + q(5510) => q(pmh), + q(5511) => q(pmi), + q(5512) => q(pmj), + q(5513) => q(pmk), + q(5514) => q(pml), + q(5515) => q(pmm), + q(5516) => q(pmn), + q(5517) => q(pmo), + q(5518) => q(pmq), + q(5519) => q(pmr), + q(5520) => q(pms), + q(5521) => q(pmt), + q(5522) => q(pmw), + q(5523) => q(pmx), + q(5524) => q(pmy), + q(5525) => q(pmz), + q(5526) => q(pna), + q(5527) => q(pnb), + q(5528) => q(pnc), + q(5529) => q(pne), + q(5530) => q(png), + q(5531) => q(pnh), + q(5532) => q(pni), + q(5533) => q(pnj), + q(5534) => q(pnk), + q(5535) => q(pnl), + q(5536) => q(pnm), + q(5537) => q(pnn), + q(5538) => q(pno), + q(5539) => q(pnp), + q(5540) => q(pnq), + q(5541) => q(pnr), + q(5542) => q(pns), + q(5543) => q(pnt), + q(5544) => q(pnu), + q(5545) => q(pnv), + q(5546) => q(pnw), + q(5547) => q(pnx), + q(5548) => q(pny), + q(5549) => q(pnz), + q(5550) => q(poc), + q(5551) => q(poe), + q(5552) => q(pof), + q(5553) => q(pog), + q(5554) => q(poh), + q(5555) => q(poi), + q(5556) => q(pok), + q(5557) => q(pom), + q(5558) => q(poo), + q(5559) => q(pop), + q(5560) => q(poq), + q(5561) => q(pos), + q(5562) => q(pot), + q(5563) => q(pov), + q(5564) => q(pow), + q(5565) => q(pox), + q(5566) => q(poy), + q(5567) => q(ppe), + q(5568) => q(ppi), + q(5569) => q(ppk), + q(5570) => q(ppl), + q(5571) => q(ppm), + q(5572) => q(ppn), + q(5573) => q(ppo), + q(5574) => q(ppp), + q(5575) => q(ppq), + q(5576) => q(pps), + q(5577) => q(ppt), + q(5578) => q(ppu), + q(5579) => q(pqa), + q(5580) => q(pqm), + q(5581) => q(prc), + q(5582) => q(prd), + q(5583) => q(pre), + q(5584) => q(prf), + q(5585) => q(prg), + q(5586) => q(prh), + q(5587) => q(pri), + q(5588) => q(prk), + q(5589) => q(prl), + q(5590) => q(prm), + q(5591) => q(prn), + q(5592) => q(prp), + q(5593) => q(prq), + q(5594) => q(prr), + q(5595) => q(prs), + q(5596) => q(prt), + q(5597) => q(pru), + q(5598) => q(prw), + q(5599) => q(prx), + q(5600) => q(prz), + q(5601) => q(psa), + q(5602) => q(psc), + q(5603) => q(psd), + q(5604) => q(pse), + q(5605) => q(psg), + q(5606) => q(psh), + q(5607) => q(psi), + q(5608) => q(psl), + q(5609) => q(psm), + q(5610) => q(psn), + q(5611) => q(pso), + q(5612) => q(psp), + q(5613) => q(psq), + q(5614) => q(psr), + q(5615) => q(pss), + q(5616) => q(pst), + q(5617) => q(psu), + q(5618) => q(psw), + q(5619) => q(psy), + q(5620) => q(pta), + q(5621) => q(pth), + q(5622) => q(pti), + q(5623) => q(ptn), + q(5624) => q(pto), + q(5625) => q(ptp), + q(5626) => q(ptq), + q(5627) => q(ptr), + q(5628) => q(ptt), + q(5629) => q(ptu), + q(5630) => q(ptv), + q(5631) => q(ptw), + q(5632) => q(pty), + q(5633) => q(pua), + q(5634) => q(pub), + q(5635) => q(puc), + q(5636) => q(pud), + q(5637) => q(pue), + q(5638) => q(puf), + q(5639) => q(pug), + q(5640) => q(pui), + q(5641) => q(puj), + q(5642) => q(pum), + q(5643) => q(puo), + q(5644) => q(pup), + q(5645) => q(puq), + q(5646) => q(pur), + q(5647) => q(put), + q(5648) => q(puu), + q(5649) => q(puw), + q(5650) => q(pux), + q(5651) => q(puy), + q(5652) => q(pwa), + q(5653) => q(pwb), + q(5654) => q(pwg), + q(5655) => q(pwi), + q(5656) => q(pwm), + q(5657) => q(pwn), + q(5658) => q(pwo), + q(5659) => q(pwr), + q(5660) => q(pww), + q(5661) => q(pxm), + q(5662) => q(pye), + q(5663) => q(pym), + q(5664) => q(pyn), + q(5665) => q(pys), + q(5666) => q(pyu), + q(5667) => q(pyx), + q(5668) => q(pyy), + q(5669) => q(pzn), + q(5670) => q(qua), + q(5671) => q(qub), + q(5672) => q(quc), + q(5673) => q(qud), + q(5674) => q(quf), + q(5675) => q(qug), + q(5676) => q(quh), + q(5677) => q(qui), + q(5678) => q(quk), + q(5679) => q(qul), + q(5680) => q(qum), + q(5681) => q(qun), + q(5682) => q(qup), + q(5683) => q(quq), + q(5684) => q(qur), + q(5685) => q(qus), + q(5686) => q(quv), + q(5687) => q(quw), + q(5688) => q(qux), + q(5689) => q(quy), + q(5690) => q(quz), + q(5691) => q(qva), + q(5692) => q(qvc), + q(5693) => q(qve), + q(5694) => q(qvh), + q(5695) => q(qvi), + q(5696) => q(qvj), + q(5697) => q(qvl), + q(5698) => q(qvm), + q(5699) => q(qvn), + q(5700) => q(qvo), + q(5701) => q(qvp), + q(5702) => q(qvs), + q(5703) => q(qvw), + q(5704) => q(qvy), + q(5705) => q(qvz), + q(5706) => q(qwa), + q(5707) => q(qwc), + q(5708) => q(qwh), + q(5709) => q(qwm), + q(5710) => q(qws), + q(5711) => q(qwt), + q(5712) => q(qxa), + q(5713) => q(qxc), + q(5714) => q(qxh), + q(5715) => q(qxl), + q(5716) => q(qxn), + q(5717) => q(qxo), + q(5718) => q(qxp), + q(5719) => q(qxq), + q(5720) => q(qxr), + q(5721) => q(qxs), + q(5722) => q(qxt), + q(5723) => q(qxu), + q(5724) => q(qxw), + q(5725) => q(qya), + q(5726) => q(qyp), + q(5727) => q(raa), + q(5728) => q(rab), + q(5729) => q(rac), + q(5730) => q(rad), + q(5731) => q(raf), + q(5732) => q(rag), + q(5733) => q(rah), + q(5734) => q(rai), + q(5735) => q(rak), + q(5736) => q(ral), + q(5737) => q(ram), + q(5738) => q(ran), + q(5739) => q(rao), + q(5740) => q(raq), + q(5741) => q(ras), + q(5742) => q(rat), + q(5743) => q(rau), + q(5744) => q(rav), + q(5745) => q(raw), + q(5746) => q(rax), + q(5747) => q(ray), + q(5748) => q(raz), + q(5749) => q(rbb), + q(5750) => q(rbk), + q(5751) => q(rbl), + q(5752) => q(rbp), + q(5753) => q(rcf), + q(5754) => q(rdb), + q(5755) => q(rea), + q(5756) => q(reb), + q(5757) => q(ree), + q(5758) => q(reg), + q(5759) => q(rei), + q(5760) => q(rej), + q(5761) => q(rel), + q(5762) => q(rem), + q(5763) => q(ren), + q(5764) => q(rer), + q(5765) => q(res), + q(5766) => q(ret), + q(5767) => q(rey), + q(5768) => q(rga), + q(5769) => q(rge), + q(5770) => q(rgk), + q(5771) => q(rgn), + q(5772) => q(rgr), + q(5773) => q(rgs), + q(5774) => q(rgu), + q(5775) => q(rhg), + q(5776) => q(rhp), + q(5777) => q(ria), + q(5778) => q(rif), + q(5779) => q(ril), + q(5780) => q(rim), + q(5781) => q(rin), + q(5782) => q(rir), + q(5783) => q(rit), + q(5784) => q(riu), + q(5785) => q(rjg), + q(5786) => q(rji), + q(5787) => q(rjs), + q(5788) => q(rka), + q(5789) => q(rkb), + q(5790) => q(rkh), + q(5791) => q(rki), + q(5792) => q(rkm), + q(5793) => q(rkt), + q(5794) => q(rkw), + q(5795) => q(rma), + q(5796) => q(rmb), + q(5797) => q(rmc), + q(5798) => q(rmd), + q(5799) => q(rme), + q(5800) => q(rmf), + q(5801) => q(rmg), + q(5802) => q(rmh), + q(5803) => q(rmi), + q(5804) => q(rmk), + q(5805) => q(rml), + q(5806) => q(rmm), + q(5807) => q(rmn), + q(5808) => q(rmo), + q(5809) => q(rmp), + q(5810) => q(rmq), + q(5811) => q(rms), + q(5812) => q(rmt), + q(5813) => q(rmu), + q(5814) => q(rmv), + q(5815) => q(rmw), + q(5816) => q(rmx), + q(5817) => q(rmy), + q(5818) => q(rmz), + q(5819) => q(rnd), + q(5820) => q(rng), + q(5821) => q(rnl), + q(5822) => q(rnn), + q(5823) => q(rnp), + q(5824) => q(rnr), + q(5825) => q(rnw), + q(5826) => q(rob), + q(5827) => q(roc), + q(5828) => q(rod), + q(5829) => q(roe), + q(5830) => q(rof), + q(5831) => q(rog), + q(5832) => q(rol), + q(5833) => q(roo), + q(5834) => q(rop), + q(5835) => q(ror), + q(5836) => q(rou), + q(5837) => q(row), + q(5838) => q(rpn), + q(5839) => q(rpt), + q(5840) => q(rri), + q(5841) => q(rro), + q(5842) => q(rrt), + q(5843) => q(rsb), + q(5844) => q(rsl), + q(5845) => q(rsm), + q(5846) => q(rtc), + q(5847) => q(rth), + q(5848) => q(rtm), + q(5849) => q(rts), + q(5850) => q(rtw), + q(5851) => q(rub), + q(5852) => q(ruc), + q(5853) => q(rue), + q(5854) => q(ruf), + q(5855) => q(rug), + q(5856) => q(ruh), + q(5857) => q(rui), + q(5858) => q(ruk), + q(5859) => q(ruo), + q(5860) => q(ruq), + q(5861) => q(rut), + q(5862) => q(ruu), + q(5863) => q(ruy), + q(5864) => q(ruz), + q(5865) => q(rwa), + q(5866) => q(rwk), + q(5867) => q(rwm), + q(5868) => q(rwo), + q(5869) => q(rwr), + q(5870) => q(rxd), + q(5871) => q(rxw), + q(5872) => q(ryn), + q(5873) => q(rys), + q(5874) => q(ryu), + q(5875) => q(rzh), + q(5876) => q(saa), + q(5877) => q(sab), + q(5878) => q(sac), + q(5879) => q(sae), + q(5880) => q(saf), + q(5881) => q(saj), + q(5882) => q(sak), + q(5883) => q(sao), + q(5884) => q(saq), + q(5885) => q(sar), + q(5886) => q(sau), + q(5887) => q(sav), + q(5888) => q(saw), + q(5889) => q(sax), + q(5890) => q(say), + q(5891) => q(saz), + q(5892) => q(sba), + q(5893) => q(sbb), + q(5894) => q(sbc), + q(5895) => q(sbd), + q(5896) => q(slc), + q(5897) => q(sbf), + q(5898) => q(sbg), + q(5899) => q(sbh), + q(5900) => q(sbi), + q(5901) => q(sbj), + q(5902) => q(sbk), + q(5903) => q(sbl), + q(5904) => q(sbm), + q(5905) => q(sbn), + q(5906) => q(sbo), + q(5907) => q(sbp), + q(5908) => q(sbq), + q(5909) => q(sbr), + q(5910) => q(sbs), + q(5911) => q(sbt), + q(5912) => q(sbu), + q(5913) => q(sbv), + q(5914) => q(sbw), + q(5915) => q(sbx), + q(5916) => q(sby), + q(5917) => q(sbz), + q(5918) => q(scb), + q(5919) => q(sce), + q(5920) => q(scf), + q(5921) => q(scg), + q(5922) => q(sch), + q(5923) => q(sci), + q(5924) => q(sck), + q(5925) => q(scl), + q(5926) => q(scp), + q(5927) => q(scq), + q(5928) => q(scs), + q(5929) => q(sct), + q(5930) => q(scu), + q(5931) => q(scv), + q(5932) => q(scw), + q(5933) => q(scx), + q(5934) => q(sda), + q(5935) => q(sdb), + q(5936) => q(sdc), + q(5937) => q(sde), + q(5938) => q(sdf), + q(5939) => q(sdg), + q(5940) => q(sdh), + q(5941) => q(sdj), + q(5942) => q(sdk), + q(5943) => q(sdl), + q(5944) => q(sdm), + q(5945) => q(sdn), + q(5946) => q(sdo), + q(5947) => q(sdp), + q(5948) => q(sdr), + q(5949) => q(sds), + q(5950) => q(sdt), + q(5951) => q(sdu), + q(5952) => q(sdx), + q(5953) => q(sdz), + q(5954) => q(sea), + q(5955) => q(seb), + q(5956) => q(sec), + q(5957) => q(sed), + q(5958) => q(see), + q(5959) => q(sef), + q(5960) => q(seg), + q(5961) => q(seh), + q(5962) => q(sei), + q(5963) => q(sej), + q(5964) => q(sek), + q(5965) => q(sen), + q(5966) => q(seo), + q(5967) => q(sep), + q(5968) => q(seq), + q(5969) => q(ser), + q(5970) => q(ses), + q(5971) => q(set), + q(5972) => q(seu), + q(5973) => q(sev), + q(5974) => q(sew), + q(5975) => q(sey), + q(5976) => q(sez), + q(5977) => q(sfb), + q(5978) => q(sfe), + q(5979) => q(sfm), + q(5980) => q(sfs), + q(5981) => q(sfw), + q(5982) => q(sgb), + q(5983) => q(sgc), + q(5984) => q(sgd), + q(5985) => q(sge), + q(5986) => q(sgg), + q(5987) => q(sgh), + q(5988) => q(sgi), + q(5989) => q(sgj), + q(5990) => q(sgk), + q(5991) => q(sgm), + q(5992) => q(sgp), + q(5993) => q(sgr), + q(5994) => q(sgs), + q(5995) => q(sgt), + q(5996) => q(sgu), + q(5997) => q(sgw), + q(5998) => q(sgx), + q(5999) => q(sgy), + q(6000) => q(sgz), + q(6001) => q(sha), + q(6002) => q(shb), + q(6003) => q(shc), + q(6004) => q(shd), + q(6005) => q(she), + q(6006) => q(shg), + q(6007) => q(shh), + q(6008) => q(shi), + q(6009) => q(shj), + q(6010) => q(shk), + q(6011) => q(shl), + q(6012) => q(shm), + q(6013) => q(sho), + q(6014) => q(shp), + q(6015) => q(shq), + q(6016) => q(shr), + q(6017) => q(shs), + q(6018) => q(sht), + q(6019) => q(shu), + q(6020) => q(shv), + q(6021) => q(shw), + q(6022) => q(shx), + q(6023) => q(shy), + q(6024) => q(shz), + q(6025) => q(sia), + q(6026) => q(sib), + q(6027) => q(sie), + q(6028) => q(sif), + q(6029) => q(sig), + q(6030) => q(sih), + q(6031) => q(sii), + q(6032) => q(sij), + q(6033) => q(sik), + q(6034) => q(sil), + q(6035) => q(sim), + q(6036) => q(sip), + q(6037) => q(siq), + q(6038) => q(sir), + q(6039) => q(sis), + q(6040) => q(siu), + q(6041) => q(siv), + q(6042) => q(siw), + q(6043) => q(six), + q(6044) => q(siy), + q(6045) => q(siz), + q(6046) => q(sja), + q(6047) => q(sjb), + q(6048) => q(sjd), + q(6049) => q(sje), + q(6050) => q(sjg), + q(6051) => q(sjk), + q(6052) => q(sjl), + q(6053) => q(sjm), + q(6054) => q(sjn), + q(6055) => q(sjo), + q(6056) => q(sjp), + q(6057) => q(sjr), + q(6058) => q(sjs), + q(6059) => q(sjt), + q(6060) => q(sju), + q(6061) => q(sjw), + q(6062) => q(ska), + q(6063) => q(skb), + q(6064) => q(skc), + q(6065) => q(skd), + q(6066) => q(ske), + q(6067) => q(skf), + q(6068) => q(skg), + q(6069) => q(skh), + q(6070) => q(ski), + q(6071) => q(skj), + q(6072) => q(skm), + q(6073) => q(skn), + q(6074) => q(sko), + q(6075) => q(skp), + q(6076) => q(skq), + q(6077) => q(skr), + q(6078) => q(sks), + q(6079) => q(skt), + q(6080) => q(sku), + q(6081) => q(skv), + q(6082) => q(skw), + q(6083) => q(skx), + q(6084) => q(sky), + q(6085) => q(skz), + q(6086) => q(sld), + q(6087) => q(sle), + q(6088) => q(slf), + q(6089) => q(slg), + q(6090) => q(slh), + q(6091) => q(sli), + q(6092) => q(slj), + q(6093) => q(sll), + q(6094) => q(slm), + q(6095) => q(sln), + q(6096) => q(slp), + q(6097) => q(slq), + q(6098) => q(slr), + q(6099) => q(sls), + q(6100) => q(slt), + q(6101) => q(slu), + q(6102) => q(slw), + q(6103) => q(slx), + q(6104) => q(sly), + q(6105) => q(slz), + q(6106) => q(smb), + q(6107) => q(smc), + q(6108) => q(smd), + q(6109) => q(smf), + q(6110) => q(smg), + q(6111) => q(smh), + q(6112) => q(smk), + q(6113) => q(sml), + q(6114) => q(smm), + q(6115) => q(smp), + q(6116) => q(smq), + q(6117) => q(smr), + q(6118) => q(smt), + q(6119) => q(smu), + q(6120) => q(smv), + q(6121) => q(smw), + q(6122) => q(smx), + q(6123) => q(smy), + q(6124) => q(smz), + q(6125) => q(snb), + q(6126) => q(snc), + q(6127) => q(sne), + q(6128) => q(snf), + q(6129) => q(sng), + q(6130) => q(sni), + q(6131) => q(snj), + q(6132) => q(snl), + q(6133) => q(snm), + q(6134) => q(snn), + q(6135) => q(sno), + q(6136) => q(snp), + q(6137) => q(snq), + q(6138) => q(snr), + q(6139) => q(sns), + q(6140) => q(snu), + q(6141) => q(snv), + q(6142) => q(snw), + q(6143) => q(snx), + q(6144) => q(sny), + q(6145) => q(snz), + q(6146) => q(soa), + q(6147) => q(sob), + q(6148) => q(soc), + q(6149) => q(sod), + q(6150) => q(soe), + q(6151) => q(soh), + q(6152) => q(soi), + q(6153) => q(soj), + q(6154) => q(sok), + q(6155) => q(sol), + q(6156) => q(soo), + q(6157) => q(sop), + q(6158) => q(soq), + q(6159) => q(sor), + q(6160) => q(sos), + q(6161) => q(sou), + q(6162) => q(sov), + q(6163) => q(sow), + q(6164) => q(sox), + q(6165) => q(soy), + q(6166) => q(soz), + q(6167) => q(spb), + q(6168) => q(spc), + q(6169) => q(spd), + q(6170) => q(spe), + q(6171) => q(spg), + q(6172) => q(spi), + q(6173) => q(spk), + q(6174) => q(spl), + q(6175) => q(spm), + q(6176) => q(spn), + q(6177) => q(spo), + q(6178) => q(spp), + q(6179) => q(spq), + q(6180) => q(spr), + q(6181) => q(sps), + q(6182) => q(spt), + q(6183) => q(spu), + q(6184) => q(spv), + q(6185) => q(spx), + q(6186) => q(spy), + q(6187) => q(sqa), + q(6188) => q(sqh), + q(6189) => q(sqk), + q(6190) => q(sqm), + q(6191) => q(sqn), + q(6192) => q(sqo), + q(6193) => q(sqq), + q(6194) => q(sqr), + q(6195) => q(sqs), + q(6196) => q(sqt), + q(6197) => q(squ), + q(6198) => q(sra), + q(6199) => q(srb), + q(6200) => q(src), + q(6201) => q(sre), + q(6202) => q(srf), + q(6203) => q(srg), + q(6204) => q(srh), + q(6205) => q(sri), + q(6206) => q(srk), + q(6207) => q(srl), + q(6208) => q(srm), + q(6209) => q(sro), + q(6210) => q(srq), + q(6211) => q(srs), + q(6212) => q(srt), + q(6213) => q(sru), + q(6214) => q(srv), + q(6215) => q(srw), + q(6216) => q(srx), + q(6217) => q(sry), + q(6218) => q(srz), + q(6219) => q(ssb), + q(6220) => q(ssc), + q(6221) => q(ssd), + q(6222) => q(sse), + q(6223) => q(ssf), + q(6224) => q(ssg), + q(6225) => q(ssh), + q(6226) => q(ssi), + q(6227) => q(ssj), + q(6228) => q(ssk), + q(6229) => q(ssl), + q(6230) => q(ssm), + q(6231) => q(ssn), + q(6232) => q(sso), + q(6233) => q(ssp), + q(6234) => q(ssq), + q(6235) => q(ssr), + q(6236) => q(sss), + q(6237) => q(sst), + q(6238) => q(ssu), + q(6239) => q(ssv), + q(6240) => q(ssx), + q(6241) => q(ssy), + q(6242) => q(ssz), + q(6243) => q(sta), + q(6244) => q(stb), + q(6245) => q(std), + q(6246) => q(ste), + q(6247) => q(stf), + q(6248) => q(stg), + q(6249) => q(sth), + q(6250) => q(sti), + q(6251) => q(stj), + q(6252) => q(stk), + q(6253) => q(stl), + q(6254) => q(stm), + q(6255) => q(stn), + q(6256) => q(sto), + q(6257) => q(stp), + q(6258) => q(stq), + q(6259) => q(str), + q(6260) => q(sts), + q(6261) => q(stt), + q(6262) => q(stu), + q(6263) => q(stv), + q(6264) => q(stw), + q(6265) => q(sty), + q(6266) => q(sua), + q(6267) => q(sub), + q(6268) => q(suc), + q(6269) => q(sue), + q(6270) => q(sug), + q(6271) => q(sui), + q(6272) => q(suj), + q(6273) => q(suq), + q(6274) => q(sur), + q(6275) => q(sut), + q(6276) => q(suv), + q(6277) => q(suw), + q(6278) => q(suy), + q(6279) => q(suz), + q(6280) => q(sva), + q(6281) => q(svb), + q(6282) => q(svc), + q(6283) => q(sve), + q(6284) => q(svk), + q(6285) => q(svm), + q(6286) => q(svs), + q(6287) => q(svx), + q(6288) => q(swb), + q(6289) => q(swc), + q(6290) => q(swf), + q(6291) => q(swg), + q(6292) => q(swh), + q(6293) => q(swi), + q(6294) => q(swj), + q(6295) => q(swk), + q(6296) => q(swl), + q(6297) => q(swm), + q(6298) => q(swn), + q(6299) => q(swo), + q(6300) => q(swp), + q(6301) => q(swq), + q(6302) => q(swr), + q(6303) => q(sws), + q(6304) => q(swt), + q(6305) => q(swu), + q(6306) => q(swv), + q(6307) => q(sww), + q(6308) => q(swx), + q(6309) => q(swy), + q(6310) => q(sxb), + q(6311) => q(sxc), + q(6312) => q(sxe), + q(6313) => q(sxg), + q(6314) => q(sxk), + q(6315) => q(sxl), + q(6316) => q(sxm), + q(6317) => q(sxn), + q(6318) => q(sxo), + q(6319) => q(sxr), + q(6320) => q(sxs), + q(6321) => q(sxu), + q(6322) => q(sxw), + q(6323) => q(sya), + q(6324) => q(syb), + q(6325) => q(syi), + q(6326) => q(syk), + q(6327) => q(syl), + q(6328) => q(sym), + q(6329) => q(syn), + q(6330) => q(syo), + q(6331) => q(sys), + q(6332) => q(syw), + q(6333) => q(syx), + q(6334) => q(syy), + q(6335) => q(sza), + q(6336) => q(szb), + q(6337) => q(szc), + q(6338) => q(szd), + q(6339) => q(sze), + q(6340) => q(szg), + q(6341) => q(szl), + q(6342) => q(szn), + q(6343) => q(szp), + q(6344) => q(szs), + q(6345) => q(szv), + q(6346) => q(szw), + q(6347) => q(taa), + q(6348) => q(tab), + q(6349) => q(tac), + q(6350) => q(tad), + q(6351) => q(tae), + q(6352) => q(taf), + q(6353) => q(tag), + q(6354) => q(taj), + q(6355) => q(tak), + q(6356) => q(tal), + q(6357) => q(tan), + q(6358) => q(tao), + q(6359) => q(tap), + q(6360) => q(taq), + q(6361) => q(tar), + q(6362) => q(tas), + q(6363) => q(tau), + q(6364) => q(tav), + q(6365) => q(taw), + q(6366) => q(tax), + q(6367) => q(tay), + q(6368) => q(taz), + q(6369) => q(tba), + q(6370) => q(tbb), + q(6371) => q(tbc), + q(6372) => q(tbd), + q(6373) => q(tbe), + q(6374) => q(tbf), + q(6375) => q(tbg), + q(6376) => q(tbh), + q(6377) => q(tbi), + q(6378) => q(tbj), + q(6379) => q(tbk), + q(6380) => q(tbl), + q(6381) => q(tbm), + q(6382) => q(tbn), + q(6383) => q(tbo), + q(6384) => q(tbp), + q(6385) => q(tbr), + q(6386) => q(tbs), + q(6387) => q(tbt), + q(6388) => q(tbu), + q(6389) => q(tbv), + q(6390) => q(tbw), + q(6391) => q(tbx), + q(6392) => q(tby), + q(6393) => q(tbz), + q(6394) => q(tca), + q(6395) => q(tcb), + q(6396) => q(tcc), + q(6397) => q(tcd), + q(6398) => q(tce), + q(6399) => q(tcf), + q(6400) => q(tcg), + q(6401) => q(tch), + q(6402) => q(wbf), + q(6403) => q(tck), + q(6404) => q(tcl), + q(6405) => q(tcm), + q(6406) => q(tcn), + q(6407) => q(tco), + q(6408) => q(tcp), + q(6409) => q(tcq), + q(6410) => q(tcs), + q(6411) => q(tct), + q(6412) => q(tcu), + q(6413) => q(tcw), + q(6414) => q(tcx), + q(6415) => q(tcy), + q(6416) => q(tcz), + q(6417) => q(tda), + q(6418) => q(tdb), + q(6419) => q(tdc), + q(6420) => q(tdd), + q(6421) => q(tde), + q(6422) => q(tdf), + q(6423) => q(tdg), + q(6424) => q(tdh), + q(6425) => q(tdi), + q(6426) => q(tdj), + q(6427) => q(tdk), + q(6428) => q(tdl), + q(6429) => q(tdm), + q(6430) => q(tdn), + q(6431) => q(tdo), + q(6432) => q(tdq), + q(6433) => q(tdr), + q(6434) => q(tds), + q(6435) => q(tdt), + q(6436) => q(tdv), + q(6437) => q(tdx), + q(6438) => q(tdy), + q(6439) => q(tea), + q(6440) => q(teb), + q(6441) => q(tec), + q(6442) => q(ted), + q(6443) => q(tee), + q(6444) => q(tef), + q(6445) => q(teg), + q(6446) => q(teh), + q(6447) => q(tei), + q(6448) => q(tek), + q(6449) => q(ten), + q(6450) => q(teo), + q(6451) => q(tep), + q(6452) => q(teq), + q(6453) => q(tes), + q(6454) => q(teu), + q(6455) => q(tev), + q(6456) => q(tew), + q(6457) => q(tex), + q(6458) => q(tey), + q(6459) => q(tfi), + q(6460) => q(tfn), + q(6461) => q(tfo), + q(6462) => q(tfr), + q(6463) => q(tft), + q(6464) => q(tga), + q(6465) => q(tgb), + q(6466) => q(tgc), + q(6467) => q(tgd), + q(6468) => q(tge), + q(6469) => q(tgf), + q(6470) => q(tgh), + q(6471) => q(tgi), + q(6472) => q(tgj), + q(6473) => q(tgn), + q(6474) => q(tgo), + q(6475) => q(tgp), + q(6476) => q(tgq), + q(6477) => q(tgr), + q(6478) => q(tgs), + q(6479) => q(tgt), + q(6480) => q(tgu), + q(6481) => q(tgv), + q(6482) => q(tgw), + q(6483) => q(tgx), + q(6484) => q(tgy), + q(6485) => q(tgz), + q(6486) => q(thd), + q(6487) => q(the), + q(6488) => q(thf), + q(6489) => q(thh), + q(6490) => q(thi), + q(6491) => q(thk), + q(6492) => q(thl), + q(6493) => q(thm), + q(6494) => q(thn), + q(6495) => q(thp), + q(6496) => q(thq), + q(6497) => q(thr), + q(6498) => q(ths), + q(6499) => q(tht), + q(6500) => q(thu), + q(6501) => q(thv), + q(6502) => q(thw), + q(6503) => q(thy), + q(6504) => q(thz), + q(6505) => q(tia), + q(6506) => q(tic), + q(6507) => q(tif), + q(6508) => q(tih), + q(6509) => q(tii), + q(6510) => q(tij), + q(6511) => q(tik), + q(6512) => q(til), + q(6513) => q(tim), + q(6514) => q(tin), + q(6515) => q(tio), + q(6516) => q(tip), + q(6517) => q(tiq), + q(6518) => q(tis), + q(6519) => q(tit), + q(6520) => q(tiu), + q(6521) => q(tiw), + q(6522) => q(tix), + q(6523) => q(tiy), + q(6524) => q(tiz), + q(6525) => q(tja), + q(6526) => q(tjg), + q(6527) => q(tji), + q(6528) => q(tjl), + q(6529) => q(tjm), + q(6530) => q(tjn), + q(6531) => q(tjo), + q(6532) => q(tjs), + q(6533) => q(tju), + q(6534) => q(tjw), + q(6535) => q(tka), + q(6536) => q(tkb), + q(6537) => q(tkd), + q(6538) => q(tke), + q(6539) => q(tkf), + q(6540) => q(tkg), + q(6541) => q(tkm), + q(6542) => q(tkn), + q(6543) => q(tkp), + q(6544) => q(tkq), + q(6545) => q(tkr), + q(6546) => q(tks), + q(6547) => q(tkt), + q(6548) => q(tku), + q(6549) => q(tkv), + q(6550) => q(tkw), + q(6551) => q(tkx), + q(6552) => q(tkz), + q(6553) => q(tla), + q(6554) => q(tlb), + q(6555) => q(tlc), + q(6556) => q(tld), + q(6557) => q(tlf), + q(6558) => q(tlg), + q(6559) => q(tlj), + q(6560) => q(tlk), + q(6561) => q(tll), + q(6562) => q(tlm), + q(6563) => q(tln), + q(6564) => q(tlo), + q(6565) => q(tlp), + q(6566) => q(tlq), + q(6567) => q(tlr), + q(6568) => q(tls), + q(6569) => q(tlt), + q(6570) => q(tlu), + q(6571) => q(tlv), + q(6572) => q(tlx), + q(6573) => q(tly), + q(6574) => q(tma), + q(6575) => q(tmb), + q(6576) => q(tmc), + q(6577) => q(tmd), + q(6578) => q(tme), + q(6579) => q(tmf), + q(6580) => q(tmg), + q(6581) => q(tmi), + q(6582) => q(tmj), + q(6583) => q(tmk), + q(6584) => q(tml), + q(6585) => q(tmm), + q(6586) => q(tmn), + q(6587) => q(tmo), + q(6588) => q(tmq), + q(6589) => q(tmr), + q(6590) => q(tms), + q(6591) => q(tmt), + q(6592) => q(tmu), + q(6593) => q(tmv), + q(6594) => q(tmw), + q(6595) => q(tmy), + q(6596) => q(tmz), + q(6597) => q(tna), + q(6598) => q(tnb), + q(6599) => q(tnc), + q(6600) => q(tnd), + q(6601) => q(tng), + q(6602) => q(tnh), + q(6603) => q(tni), + q(6604) => q(tnk), + q(6605) => q(tnl), + q(6606) => q(tnm), + q(6607) => q(tnn), + q(6608) => q(tno), + q(6609) => q(tnp), + q(6610) => q(tnq), + q(6611) => q(tnr), + q(6612) => q(tns), + q(6613) => q(tnt), + q(6614) => q(tnu), + q(6615) => q(tnv), + q(6616) => q(tnw), + q(6617) => q(tnx), + q(6618) => q(tny), + q(6619) => q(tnz), + q(6620) => q(tob), + q(6621) => q(toc), + q(6622) => q(tod), + q(6623) => q(tof), + q(6624) => q(toh), + q(6625) => q(toi), + q(6626) => q(toj), + q(6627) => q(tol), + q(6628) => q(tom), + q(6629) => q(too), + q(6630) => q(top), + q(6631) => q(toq), + q(6632) => q(tor), + q(6633) => q(tos), + q(6634) => q(tou), + q(6635) => q(tov), + q(6636) => q(tow), + q(6637) => q(tox), + q(6638) => q(toy), + q(6639) => q(toz), + q(6640) => q(tpa), + q(6641) => q(tpc), + q(6642) => q(tpe), + q(6643) => q(tpf), + q(6644) => q(tpg), + q(6645) => q(tpj), + q(6646) => q(tpk), + q(6647) => q(tpl), + q(6648) => q(tpm), + q(6649) => q(tpn), + q(6650) => q(tpo), + q(6651) => q(tpp), + q(6652) => q(tpq), + q(6653) => q(tpr), + q(6654) => q(tpt), + q(6655) => q(tpu), + q(6656) => q(tpv), + q(6657) => q(tpw), + q(6658) => q(tpx), + q(6659) => q(tpy), + q(6660) => q(tpz), + q(6661) => q(tqb), + q(6662) => q(tql), + q(6663) => q(tqm), + q(6664) => q(tqn), + q(6665) => q(tqo), + q(6666) => q(tqp), + q(6667) => q(tqq), + q(6668) => q(tqr), + q(6669) => q(tqt), + q(6670) => q(tqu), + q(6671) => q(tqw), + q(6672) => q(tra), + q(6673) => q(trb), + q(6674) => q(trc), + q(6675) => q(trd), + q(6676) => q(tre), + q(6677) => q(trf), + q(6678) => q(trg), + q(6679) => q(trh), + q(6680) => q(tri), + q(6681) => q(trj), + q(6682) => q(trl), + q(6683) => q(trm), + q(6684) => q(trn), + q(6685) => q(tro), + q(6686) => q(trp), + q(6687) => q(trq), + q(6688) => q(trr), + q(6689) => q(trs), + q(6690) => q(trt), + q(6691) => q(tru), + q(6692) => q(trv), + q(6693) => q(trw), + q(6694) => q(trx), + q(6695) => q(try), + q(6696) => q(trz), + q(6697) => q(tsa), + q(6698) => q(tsb), + q(6699) => q(tsc), + q(6700) => q(tsd), + q(6701) => q(tse), + q(6702) => q(tsg), + q(6703) => q(tsh), + q(6704) => q(tsj), + q(6705) => q(tsk), + q(6706) => q(tsl), + q(6707) => q(tsm), + q(6708) => q(tsp), + q(6709) => q(tsq), + q(6710) => q(tsr), + q(6711) => q(tss), + q(6712) => q(tst), + q(6713) => q(tsu), + q(6714) => q(tsv), + q(6715) => q(tsw), + q(6716) => q(tsx), + q(6717) => q(tsy), + q(6718) => q(tsz), + q(6719) => q(tta), + q(6720) => q(ttb), + q(6721) => q(ttc), + q(6722) => q(ttd), + q(6723) => q(tte), + q(6724) => q(ttf), + q(6725) => q(ttg), + q(6726) => q(tth), + q(6727) => q(tti), + q(6728) => q(ttj), + q(6729) => q(ttk), + q(6730) => q(ttl), + q(6731) => q(ttm), + q(6732) => q(ttn), + q(6733) => q(tto), + q(6734) => q(ttp), + q(6735) => q(ttq), + q(6736) => q(ttr), + q(6737) => q(tts), + q(6738) => q(ttt), + q(6739) => q(ttu), + q(6740) => q(ttv), + q(6741) => q(ttw), + q(6742) => q(tty), + q(6743) => q(ttz), + q(6744) => q(tua), + q(6745) => q(tub), + q(6746) => q(tuc), + q(6747) => q(tud), + q(6748) => q(tue), + q(6749) => q(tuf), + q(6750) => q(tug), + q(6751) => q(tuh), + q(6752) => q(tui), + q(6753) => q(tuj), + q(6754) => q(tul), + q(6755) => q(tun), + q(6756) => q(tuo), + q(6757) => q(tuq), + q(6758) => q(tus), + q(6759) => q(tuu), + q(6760) => q(tuv), + q(6761) => q(tux), + q(6762) => q(tuy), + q(6763) => q(tuz), + q(6764) => q(tva), + q(6765) => q(tvd), + q(6766) => q(tve), + q(6767) => q(tvk), + q(6768) => q(tvm), + q(6769) => q(tvn), + q(6770) => q(tvo), + q(6771) => q(tvs), + q(6772) => q(tvt), + q(6773) => q(tvu), + q(6774) => q(tvw), + q(6775) => q(tvy), + q(6776) => q(twa), + q(6777) => q(twb), + q(6778) => q(twc), + q(6779) => q(twd), + q(6780) => q(twe), + q(6781) => q(twf), + q(6782) => q(twg), + q(6783) => q(twh), + q(6784) => q(twl), + q(6785) => q(twm), + q(6786) => q(twn), + q(6787) => q(two), + q(6788) => q(twp), + q(6789) => q(twq), + q(6790) => q(twr), + q(6791) => q(twt), + q(6792) => q(twu), + q(6793) => q(tww), + q(6794) => q(twx), + q(6795) => q(twy), + q(6796) => q(txa), + q(6797) => q(txb), + q(6798) => q(txc), + q(6799) => q(txe), + q(6800) => q(txg), + q(6801) => q(txh), + q(6802) => q(txi), + q(6803) => q(txj), + q(6804) => q(txm), + q(6805) => q(txn), + q(6806) => q(txo), + q(6807) => q(txq), + q(6808) => q(txr), + q(6809) => q(txs), + q(6810) => q(txt), + q(6811) => q(txu), + q(6812) => q(txx), + q(6813) => q(txy), + q(6814) => q(tya), + q(6815) => q(tye), + q(6816) => q(tyh), + q(6817) => q(tyi), + q(6818) => q(tyj), + q(6819) => q(tyl), + q(6820) => q(tyn), + q(6821) => q(typ), + q(6822) => q(tyr), + q(6823) => q(tys), + q(6824) => q(tyt), + q(6825) => q(tyu), + q(6826) => q(tyx), + q(6827) => q(tyz), + q(6828) => q(tza), + q(6829) => q(tzh), + q(6830) => q(tzj), + q(6831) => q(tzl), + q(6832) => q(tzm), + q(6833) => q(tzn), + q(6834) => q(tzo), + q(6835) => q(tzx), + q(6836) => q(uam), + q(6837) => q(uan), + q(6838) => q(uar), + q(6839) => q(uba), + q(6840) => q(ubi), + q(6841) => q(ubl), + q(6842) => q(ubr), + q(6843) => q(ubu), + q(6844) => q(uby), + q(6845) => q(uda), + q(6846) => q(ude), + q(6847) => q(udg), + q(6848) => q(udi), + q(6849) => q(udj), + q(6850) => q(udl), + q(6851) => q(udu), + q(6852) => q(ues), + q(6853) => q(ufi), + q(6854) => q(ugb), + q(6855) => q(uge), + q(6856) => q(ugn), + q(6857) => q(ugo), + q(6858) => q(ugy), + q(6859) => q(uha), + q(6860) => q(uhn), + q(6861) => q(uis), + q(6862) => q(uiv), + q(6863) => q(uji), + q(6864) => q(uka), + q(6865) => q(ukg), + q(6866) => q(ukh), + q(6867) => q(ukk), + q(6868) => q(ukl), + q(6869) => q(ukp), + q(6870) => q(ukq), + q(6871) => q(uks), + q(6872) => q(uku), + q(6873) => q(ukw), + q(6874) => q(uky), + q(6875) => q(ula), + q(6876) => q(ulb), + q(6877) => q(ulc), + q(6878) => q(ule), + q(6879) => q(ulf), + q(6880) => q(uli), + q(6881) => q(ulk), + q(6882) => q(ull), + q(6883) => q(ulm), + q(6884) => q(uln), + q(6885) => q(ulu), + q(6886) => q(ulw), + q(6887) => q(uma), + q(6888) => q(umc), + q(6889) => q(umd), + q(6890) => q(umg), + q(6891) => q(umi), + q(6892) => q(umm), + q(6893) => q(umn), + q(6894) => q(umo), + q(6895) => q(ump), + q(6896) => q(umr), + q(6897) => q(ums), + q(6898) => q(umu), + q(6899) => q(una), + q(6900) => q(une), + q(6901) => q(ung), + q(6902) => q(unk), + q(6903) => q(unm), + q(6904) => q(unn), + q(6905) => q(unr), + q(6906) => q(unu), + q(6907) => q(unx), + q(6908) => q(unz), + q(6909) => q(upi), + q(6910) => q(upv), + q(6911) => q(ura), + q(6912) => q(urb), + q(6913) => q(urc), + q(6914) => q(ure), + q(6915) => q(urf), + q(6916) => q(urg), + q(6917) => q(urh), + q(6918) => q(uri), + q(6919) => q(urk), + q(6920) => q(url), + q(6921) => q(urm), + q(6922) => q(urn), + q(6923) => q(uro), + q(6924) => q(urp), + q(6925) => q(urr), + q(6926) => q(urt), + q(6927) => q(uru), + q(6928) => q(urv), + q(6929) => q(urw), + q(6930) => q(urx), + q(6931) => q(ury), + q(6932) => q(urz), + q(6933) => q(usa), + q(6934) => q(ush), + q(6935) => q(usi), + q(6936) => q(usk), + q(6937) => q(usp), + q(6938) => q(usu), + q(6939) => q(uta), + q(6940) => q(ute), + q(6941) => q(utp), + q(6942) => q(utr), + q(6943) => q(utu), + q(6944) => q(uum), + q(6945) => q(uun), + q(6946) => q(uur), + q(6947) => q(uuu), + q(6948) => q(uve), + q(6949) => q(uvh), + q(6950) => q(uvl), + q(6951) => q(uwa), + q(6952) => q(uya), + q(6953) => q(uzn), + q(6954) => q(uzs), + q(6955) => q(vaa), + q(6956) => q(vae), + q(6957) => q(vaf), + q(6958) => q(vag), + q(6959) => q(vah), + q(6960) => q(vaj), + q(6961) => q(val), + q(6962) => q(vam), + q(6963) => q(van), + q(6964) => q(vao), + q(6965) => q(vap), + q(6966) => q(var), + q(6967) => q(vas), + q(6968) => q(vau), + q(6969) => q(vav), + q(6970) => q(vay), + q(6971) => q(vbb), + q(6972) => q(vbk), + q(6973) => q(vec), + q(6974) => q(ved), + q(6975) => q(vel), + q(6976) => q(vem), + q(6977) => q(veo), + q(6978) => q(vep), + q(6979) => q(ver), + q(6980) => q(vgr), + q(6981) => q(vgt), + q(6982) => q(vic), + q(6983) => q(vid), + q(6984) => q(vif), + q(6985) => q(vig), + q(6986) => q(vil), + q(6987) => q(vin), + q(6988) => q(vis), + q(6989) => q(vit), + q(6990) => q(viv), + q(6991) => q(vka), + q(6992) => q(vki), + q(6993) => q(vkj), + q(6994) => q(vkk), + q(6995) => q(vkl), + q(6996) => q(vkm), + q(6997) => q(vko), + q(6998) => q(vkp), + q(6999) => q(vkt), + q(7000) => q(vku), + q(7001) => q(vlp), + q(7002) => q(vls), + q(7003) => q(vma), + q(7004) => q(vmb), + q(7005) => q(vmc), + q(7006) => q(vmd), + q(7007) => q(vme), + q(7008) => q(vmf), + q(7009) => q(vmg), + q(7010) => q(vmh), + q(7011) => q(vmi), + q(7012) => q(vmj), + q(7013) => q(vmk), + q(7014) => q(vml), + q(7015) => q(vmm), + q(7016) => q(vmp), + q(7017) => q(vmq), + q(7018) => q(vmr), + q(7019) => q(vms), + q(7020) => q(vmu), + q(7021) => q(vmv), + q(7022) => q(vmw), + q(7023) => q(vmx), + q(7024) => q(vmy), + q(7025) => q(vmz), + q(7026) => q(vnk), + q(7027) => q(vnm), + q(7028) => q(vnp), + q(7029) => q(vro), + q(7030) => q(vra), + q(7031) => q(vrs), + q(7032) => q(vrt), + q(7033) => q(vsi), + q(7034) => q(vsl), + q(7035) => q(vsv), + q(7036) => q(vto), + q(7037) => q(vum), + q(7038) => q(vun), + q(7039) => q(vut), + q(7040) => q(vwa), + q(7041) => q(waa), + q(7042) => q(wab), + q(7043) => q(wac), + q(7044) => q(wad), + q(7045) => q(wae), + q(7046) => q(waf), + q(7047) => q(wag), + q(7048) => q(wah), + q(7049) => q(wai), + q(7050) => q(waj), + q(7051) => q(wam), + q(7052) => q(wan), + q(7053) => q(wao), + q(7054) => q(wap), + q(7055) => q(waq), + q(7056) => q(wat), + q(7057) => q(wau), + q(7058) => q(wav), + q(7059) => q(waw), + q(7060) => q(wax), + q(7061) => q(way), + q(7062) => q(waz), + q(7063) => q(wba), + q(7064) => q(wbb), + q(7065) => q(wbe), + q(7066) => q(wbh), + q(7067) => q(wbi), + q(7068) => q(wbj), + q(7069) => q(wbk), + q(7070) => q(wbl), + q(7071) => q(wbm), + q(7072) => q(wbp), + q(7073) => q(wbq), + q(7074) => q(wbr), + q(7075) => q(wbs), + q(7076) => q(wbt), + q(7077) => q(wbv), + q(7078) => q(wbw), + q(7079) => q(wca), + q(7080) => q(wci), + q(7081) => q(wdd), + q(7082) => q(wdg), + q(7083) => q(wdj), + q(7084) => q(wdk), + q(7085) => q(wdu), + q(7086) => q(wdy), + q(7087) => q(wea), + q(7088) => q(wec), + q(7089) => q(wed), + q(7090) => q(weg), + q(7091) => q(weh), + q(7092) => q(wei), + q(7093) => q(wem), + q(7094) => q(weo), + q(7095) => q(wep), + q(7096) => q(wer), + q(7097) => q(wes), + q(7098) => q(wet), + q(7099) => q(weu), + q(7100) => q(wew), + q(7101) => q(wfg), + q(7102) => q(wga), + q(7103) => q(wgb), + q(7104) => q(wgg), + q(7105) => q(wgi), + q(7106) => q(wgo), + q(7107) => q(wgu), + q(7108) => q(wgy), + q(7109) => q(wha), + q(7110) => q(whg), + q(7111) => q(whk), + q(7112) => q(whu), + q(7113) => q(wib), + q(7114) => q(wic), + q(7115) => q(wie), + q(7116) => q(wif), + q(7117) => q(wig), + q(7118) => q(wih), + q(7119) => q(wii), + q(7120) => q(wij), + q(7121) => q(wik), + q(7122) => q(wil), + q(7123) => q(wim), + q(7124) => q(win), + q(7125) => q(wir), + q(7126) => q(wiu), + q(7127) => q(wiv), + q(7128) => q(wiy), + q(7129) => q(wja), + q(7130) => q(wji), + q(7131) => q(wka), + q(7132) => q(wkb), + q(7133) => q(wkd), + q(7134) => q(wkl), + q(7135) => q(wku), + q(7136) => q(wkw), + q(7137) => q(wky), + q(7138) => q(wla), + q(7139) => q(wlc), + q(7140) => q(wle), + q(7141) => q(wlg), + q(7142) => q(wli), + q(7143) => q(wlk), + q(7144) => q(wll), + q(7145) => q(wlm), + q(7146) => q(wlo), + q(7147) => q(wlr), + q(7148) => q(wls), + q(7149) => q(wlu), + q(7150) => q(wlv), + q(7151) => q(wlw), + q(7152) => q(wlx), + q(7153) => q(wly), + q(7154) => q(wma), + q(7155) => q(wmb), + q(7156) => q(wmc), + q(7157) => q(wmd), + q(7158) => q(wme), + q(7159) => q(wmh), + q(7160) => q(wmi), + q(7161) => q(wmm), + q(7162) => q(wmn), + q(7163) => q(wmo), + q(7164) => q(wms), + q(7165) => q(wmt), + q(7166) => q(wmw), + q(7167) => q(wmx), + q(7168) => q(wnb), + q(7169) => q(wnc), + q(7170) => q(wnd), + q(7171) => q(wne), + q(7172) => q(wng), + q(7173) => q(wni), + q(7174) => q(wnk), + q(7175) => q(wnm), + q(7176) => q(wnn), + q(7177) => q(wno), + q(7178) => q(wnp), + q(7179) => q(wnu), + q(7180) => q(wnw), + q(7181) => q(wny), + q(7182) => q(woa), + q(7183) => q(wob), + q(7184) => q(woc), + q(7185) => q(wod), + q(7186) => q(woe), + q(7187) => q(wof), + q(7188) => q(wog), + q(7189) => q(woi), + q(7190) => q(wok), + q(7191) => q(wom), + q(7192) => q(won), + q(7193) => q(woo), + q(7194) => q(wor), + q(7195) => q(wos), + q(7196) => q(wow), + q(7197) => q(woy), + q(7198) => q(wpc), + q(7199) => q(wra), + q(7200) => q(wrb), + q(7201) => q(wrd), + q(7202) => q(wrg), + q(7203) => q(wrh), + q(7204) => q(wri), + q(7205) => q(wrk), + q(7206) => q(wrl), + q(7207) => q(wrm), + q(7208) => q(wrn), + q(7209) => q(wro), + q(7210) => q(wrp), + q(7211) => q(wrr), + q(7212) => q(wrs), + q(7213) => q(wru), + q(7214) => q(wrv), + q(7215) => q(wrw), + q(7216) => q(wrx), + q(7217) => q(wry), + q(7218) => q(wrz), + q(7219) => q(wsa), + q(7220) => q(wsg), + q(7221) => q(wsi), + q(7222) => q(wsk), + q(7223) => q(wsr), + q(7224) => q(wss), + q(7225) => q(wsu), + q(7226) => q(wsv), + q(7227) => q(wtf), + q(7228) => q(wth), + q(7229) => q(wti), + q(7230) => q(wtk), + q(7231) => q(wtm), + q(7232) => q(wtw), + q(7233) => q(wua), + q(7234) => q(wub), + q(7235) => q(wud), + q(7236) => q(wuh), + q(7237) => q(wul), + q(7238) => q(wum), + q(7239) => q(wun), + q(7240) => q(wur), + q(7241) => q(wut), + q(7242) => q(wuu), + q(7243) => q(wuv), + q(7244) => q(wux), + q(7245) => q(wuy), + q(7246) => q(wwa), + q(7247) => q(wwb), + q(7248) => q(wwo), + q(7249) => q(wwr), + q(7250) => q(www), + q(7251) => q(wxa), + q(7252) => q(wxw), + q(7253) => q(wya), + q(7254) => q(wyb), + q(7255) => q(wyi), + q(7256) => q(wym), + q(7257) => q(wyr), + q(7258) => q(wyy), + q(7259) => q(xaa), + q(7260) => q(xab), + q(7261) => q(xac), + q(7262) => q(xad), + q(7263) => q(xae), + q(7264) => q(xag), + q(7265) => q(xai), + q(7266) => q(xaj), + q(7267) => q(xak), + q(7268) => q(xam), + q(7269) => q(xan), + q(7270) => q(xao), + q(7271) => q(xap), + q(7272) => q(xaq), + q(7273) => q(xar), + q(7274) => q(xas), + q(7275) => q(xat), + q(7276) => q(xau), + q(7277) => q(xav), + q(7278) => q(xaw), + q(7279) => q(xay), + q(7280) => q(xbb), + q(7281) => q(xbc), + q(7282) => q(xbd), + q(7283) => q(xbe), + q(7284) => q(xbg), + q(7285) => q(xbi), + q(7286) => q(xbj), + q(7287) => q(xbm), + q(7288) => q(xbn), + q(7289) => q(xbo), + q(7290) => q(xbp), + q(7291) => q(xbr), + q(7292) => q(xbw), + q(7293) => q(xby), + q(7294) => q(xcb), + q(7295) => q(xcc), + q(7296) => q(xce), + q(7297) => q(xcg), + q(7298) => q(xch), + q(7299) => q(xcl), + q(7300) => q(xcm), + q(7301) => q(xcn), + q(7302) => q(xco), + q(7303) => q(xcr), + q(7304) => q(xct), + q(7305) => q(xcu), + q(7306) => q(xcv), + q(7307) => q(xcw), + q(7308) => q(xcy), + q(7309) => q(xda), + q(7310) => q(xdc), + q(7311) => q(xdk), + q(7312) => q(xdm), + q(7313) => q(xdo), + q(7314) => q(xdy), + q(7315) => q(xeb), + q(7316) => q(xed), + q(7317) => q(xeg), + q(7318) => q(xel), + q(7319) => q(xem), + q(7320) => q(xep), + q(7321) => q(xer), + q(7322) => q(xes), + q(7323) => q(xet), + q(7324) => q(xeu), + q(7325) => q(xfa), + q(7326) => q(xga), + q(7327) => q(xgb), + q(7328) => q(xgd), + q(7329) => q(xgf), + q(7330) => q(xgg), + q(7331) => q(xgi), + q(7332) => q(xgl), + q(7333) => q(xgm), + q(7334) => q(xgr), + q(7335) => q(xgu), + q(7336) => q(xgw), + q(7337) => q(xha), + q(7338) => q(xhc), + q(7339) => q(xhd), + q(7340) => q(xhe), + q(7341) => q(xhr), + q(7342) => q(xht), + q(7343) => q(xhu), + q(7344) => q(xhv), + q(7345) => q(xib), + q(7346) => q(xii), + q(7347) => q(xil), + q(7348) => q(xin), + q(7349) => q(xir), + q(7350) => q(xis), + q(7351) => q(xiv), + q(7352) => q(xiy), + q(7353) => q(xjb), + q(7354) => q(xjt), + q(7355) => q(xka), + q(7356) => q(xkb), + q(7357) => q(xkc), + q(7358) => q(xkd), + q(7359) => q(xke), + q(7360) => q(xkf), + q(7361) => q(xkg), + q(7362) => q(xki), + q(7363) => q(xkj), + q(7364) => q(xkk), + q(7365) => q(xkl), + q(7366) => q(xkn), + q(7367) => q(xko), + q(7368) => q(xkp), + q(7369) => q(xkq), + q(7370) => q(xkr), + q(7371) => q(xks), + q(7372) => q(xkt), + q(7373) => q(xku), + q(7374) => q(xkv), + q(7375) => q(xkw), + q(7376) => q(xkx), + q(7377) => q(xky), + q(7378) => q(xkz), + q(7379) => q(xla), + q(7380) => q(xlb), + q(7381) => q(xlc), + q(7382) => q(xld), + q(7383) => q(xle), + q(7384) => q(xlg), + q(7385) => q(xli), + q(7386) => q(xln), + q(7387) => q(xlo), + q(7388) => q(xlp), + q(7389) => q(xls), + q(7390) => q(xlu), + q(7391) => q(xly), + q(7392) => q(xma), + q(7393) => q(xmb), + q(7394) => q(xmc), + q(7395) => q(xmd), + q(7396) => q(xme), + q(7397) => q(xmf), + q(7398) => q(xmg), + q(7399) => q(xmh), + q(7400) => q(xmj), + q(7401) => q(xmk), + q(7402) => q(xml), + q(7403) => q(xmm), + q(7404) => q(xmn), + q(7405) => q(xmo), + q(7406) => q(xmp), + q(7407) => q(xmq), + q(7408) => q(xmr), + q(7409) => q(xms), + q(7410) => q(xmt), + q(7411) => q(xmu), + q(7412) => q(xmv), + q(7413) => q(xmw), + q(7414) => q(xmx), + q(7415) => q(xmy), + q(7416) => q(xmz), + q(7417) => q(xna), + q(7418) => q(xnb), + q(7419) => q(xng), + q(7420) => q(xnh), + q(7421) => q(xni), + q(7422) => q(xnk), + q(7423) => q(xnn), + q(7424) => q(xno), + q(7425) => q(xnr), + q(7426) => q(xns), + q(7427) => q(xnt), + q(7428) => q(xnu), + q(7429) => q(xny), + q(7430) => q(xnz), + q(7431) => q(xoc), + q(7432) => q(xod), + q(7433) => q(xog), + q(7434) => q(xoi), + q(7435) => q(xok), + q(7436) => q(xom), + q(7437) => q(xon), + q(7438) => q(xoo), + q(7439) => q(xop), + q(7440) => q(xor), + q(7441) => q(xow), + q(7442) => q(xpa), + q(7443) => q(xpc), + q(7444) => q(xpe), + q(7445) => q(xpg), + q(7446) => q(xpi), + q(7447) => q(xpj), + q(7448) => q(xpk), + q(7449) => q(xpm), + q(7450) => q(xpn), + q(7451) => q(xpo), + q(7452) => q(xpp), + q(7453) => q(xpq), + q(7454) => q(xpr), + q(7455) => q(xps), + q(7456) => q(xpt), + q(7457) => q(xpu), + q(7458) => q(xpy), + q(7459) => q(xqa), + q(7460) => q(xqt), + q(7461) => q(xra), + q(7462) => q(xrb), + q(7463) => q(xrd), + q(7464) => q(xre), + q(7465) => q(xrg), + q(7466) => q(xri), + q(7467) => q(xrm), + q(7468) => q(xrn), + q(7469) => q(xrq), + q(7470) => q(xrr), + q(7471) => q(xrt), + q(7472) => q(xru), + q(7473) => q(xrw), + q(7474) => q(xsa), + q(7475) => q(xsb), + q(7476) => q(xsc), + q(7477) => q(xsd), + q(7478) => q(xse), + q(7479) => q(xsh), + q(7480) => q(xsi), + q(7481) => q(xsl), + q(7482) => q(xsm), + q(7483) => q(xsn), + q(7484) => q(xso), + q(7485) => q(xsp), + q(7486) => q(xsq), + q(7487) => q(xsr), + q(7488) => q(xss), + q(7489) => q(xsu), + q(7490) => q(xsv), + q(7491) => q(xsy), + q(7492) => q(xta), + q(7493) => q(xtb), + q(7494) => q(xtc), + q(7495) => q(xtd), + q(7496) => q(xte), + q(7497) => q(xtg), + q(7498) => q(xth), + q(7499) => q(xti), + q(7500) => q(xtj), + q(7501) => q(xtl), + q(7502) => q(xtm), + q(7503) => q(xtn), + q(7504) => q(xto), + q(7505) => q(xtp), + q(7506) => q(xtq), + q(7507) => q(xtr), + q(7508) => q(xts), + q(7509) => q(xtt), + q(7510) => q(xtu), + q(7511) => q(xtv), + q(7512) => q(xtw), + q(7513) => q(xty), + q(7514) => q(xtz), + q(7515) => q(xua), + q(7516) => q(xub), + q(7517) => q(xud), + q(7518) => q(xug), + q(7519) => q(xuj), + q(7520) => q(xul), + q(7521) => q(xum), + q(7522) => q(xun), + q(7523) => q(xuo), + q(7524) => q(xup), + q(7525) => q(xur), + q(7526) => q(xut), + q(7527) => q(xuu), + q(7528) => q(xve), + q(7529) => q(xvi), + q(7530) => q(xvn), + q(7531) => q(xvo), + q(7532) => q(xvs), + q(7533) => q(xwa), + q(7534) => q(xwc), + q(7535) => q(xwd), + q(7536) => q(xwe), + q(7537) => q(xwg), + q(7538) => q(xwj), + q(7539) => q(xwk), + q(7540) => q(xwl), + q(7541) => q(xwo), + q(7542) => q(xwr), + q(7543) => q(xwt), + q(7544) => q(xww), + q(7545) => q(xxb), + q(7546) => q(xxk), + q(7547) => q(xxm), + q(7548) => q(xxr), + q(7549) => q(xxt), + q(7550) => q(xya), + q(7551) => q(xyb), + q(7552) => q(xyj), + q(7553) => q(xyk), + q(7554) => q(xyl), + q(7555) => q(xyt), + q(7556) => q(xyy), + q(7557) => q(xzh), + q(7558) => q(xzm), + q(7559) => q(xzp), + q(7560) => q(yaa), + q(7561) => q(yab), + q(7562) => q(yac), + q(7563) => q(yad), + q(7564) => q(yae), + q(7565) => q(yaf), + q(7566) => q(yag), + q(7567) => q(yah), + q(7568) => q(yai), + q(7569) => q(yaj), + q(7570) => q(yak), + q(7571) => q(yal), + q(7572) => q(yam), + q(7573) => q(yan), + q(7574) => q(yaq), + q(7575) => q(yar), + q(7576) => q(yas), + q(7577) => q(yat), + q(7578) => q(yau), + q(7579) => q(yav), + q(7580) => q(yaw), + q(7581) => q(yax), + q(7582) => q(yay), + q(7583) => q(yaz), + q(7584) => q(yba), + q(7585) => q(ybb), + q(7586) => q(ybe), + q(7587) => q(ybh), + q(7588) => q(ybi), + q(7589) => q(ybj), + q(7590) => q(ybk), + q(7591) => q(ybl), + q(7592) => q(ybm), + q(7593) => q(ybn), + q(7594) => q(ybo), + q(7595) => q(ybx), + q(7596) => q(yby), + q(7597) => q(ych), + q(7598) => q(ycl), + q(7599) => q(ycn), + q(7600) => q(ycp), + q(7601) => q(yda), + q(7602) => q(ydd), + q(7603) => q(yde), + q(7604) => q(ydg), + q(7605) => q(ydk), + q(7606) => q(yea), + q(7607) => q(yec), + q(7608) => q(yee), + q(7609) => q(yei), + q(7610) => q(yej), + q(7611) => q(yel), + q(7612) => q(yer), + q(7613) => q(yes), + q(7614) => q(yet), + q(7615) => q(yeu), + q(7616) => q(yev), + q(7617) => q(yey), + q(7618) => q(yga), + q(7619) => q(ygi), + q(7620) => q(ygl), + q(7621) => q(ygm), + q(7622) => q(ygp), + q(7623) => q(ygr), + q(7624) => q(ygs), + q(7625) => q(ygu), + q(7626) => q(ygw), + q(7627) => q(yha), + q(7628) => q(yhd), + q(7629) => q(yhl), + q(7630) => q(yhs), + q(7631) => q(yia), + q(7632) => q(yig), + q(7633) => q(yih), + q(7634) => q(yii), + q(7635) => q(yij), + q(7636) => q(yik), + q(7637) => q(yil), + q(7638) => q(yim), + q(7639) => q(yin), + q(7640) => q(yip), + q(7641) => q(yiq), + q(7642) => q(yir), + q(7643) => q(yis), + q(7644) => q(yit), + q(7645) => q(yiu), + q(7646) => q(yiv), + q(7647) => q(yix), + q(7648) => q(yiz), + q(7649) => q(yka), + q(7650) => q(ykg), + q(7651) => q(yki), + q(7652) => q(ykk), + q(7653) => q(ykl), + q(7654) => q(ykm), + q(7655) => q(ykn), + q(7656) => q(yko), + q(7657) => q(ykr), + q(7658) => q(ykt), + q(7659) => q(yku), + q(7660) => q(yky), + q(7661) => q(yla), + q(7662) => q(ylb), + q(7663) => q(yle), + q(7664) => q(ylg), + q(7665) => q(yli), + q(7666) => q(yll), + q(7667) => q(ylm), + q(7668) => q(yln), + q(7669) => q(ylo), + q(7670) => q(ylr), + q(7671) => q(ylu), + q(7672) => q(yly), + q(7673) => q(ymb), + q(7674) => q(ymc), + q(7675) => q(ymd), + q(7676) => q(yme), + q(7677) => q(ymg), + q(7678) => q(ymh), + q(7679) => q(ymi), + q(7680) => q(ymk), + q(7681) => q(yml), + q(7682) => q(ymm), + q(7683) => q(ymn), + q(7684) => q(ymo), + q(7685) => q(ymp), + q(7686) => q(ymq), + q(7687) => q(ymr), + q(7688) => q(yms), + q(7689) => q(ymx), + q(7690) => q(ymz), + q(7691) => q(yna), + q(7692) => q(ynd), + q(7693) => q(yne), + q(7694) => q(yng), + q(7695) => q(ynk), + q(7696) => q(ynl), + q(7697) => q(ynn), + q(7698) => q(yno), + q(7699) => q(ynq), + q(7700) => q(yns), + q(7701) => q(ynu), + q(7702) => q(yob), + q(7703) => q(yog), + q(7704) => q(yoi), + q(7705) => q(yok), + q(7706) => q(yol), + q(7707) => q(yom), + q(7708) => q(yon), + q(7709) => q(yot), + q(7710) => q(yox), + q(7711) => q(yoy), + q(7712) => q(ypa), + q(7713) => q(ypb), + q(7714) => q(ypg), + q(7715) => q(yph), + q(7716) => q(ypm), + q(7717) => q(ypn), + q(7718) => q(ypo), + q(7719) => q(ypp), + q(7720) => q(ypz), + q(7721) => q(yra), + q(7722) => q(yrb), + q(7723) => q(yre), + q(7724) => q(yrk), + q(7725) => q(yrl), + q(7726) => q(yrm), + q(7727) => q(yrn), + q(7728) => q(yro), + q(7729) => q(yrs), + q(7730) => q(yrw), + q(7731) => q(yry), + q(7732) => q(ysc), + q(7733) => q(ysd), + q(7734) => q(ysg), + q(7735) => q(ysl), + q(7736) => q(ysn), + q(7737) => q(yso), + q(7738) => q(ysp), + q(7739) => q(ysr), + q(7740) => q(yss), + q(7741) => q(ysy), + q(7742) => q(yta), + q(7743) => q(ytl), + q(7744) => q(ytp), + q(7745) => q(ytw), + q(7746) => q(yty), + q(7747) => q(yua), + q(7748) => q(yub), + q(7749) => q(yuc), + q(7750) => q(yud), + q(7751) => q(yue), + q(7752) => q(yuf), + q(7753) => q(yug), + q(7754) => q(yui), + q(7755) => q(yuj), + q(7756) => q(yuk), + q(7757) => q(yul), + q(7758) => q(yum), + q(7759) => q(yun), + q(7760) => q(yup), + q(7761) => q(yuq), + q(7762) => q(yur), + q(7763) => q(yut), + q(7764) => q(yuw), + q(7765) => q(yux), + q(7766) => q(yuy), + q(7767) => q(yuz), + q(7768) => q(yva), + q(7769) => q(yvt), + q(7770) => q(ywa), + q(7771) => q(ywg), + q(7772) => q(ywl), + q(7773) => q(ywn), + q(7774) => q(ywq), + q(7775) => q(ywr), + q(7776) => q(ywt), + q(7777) => q(ywu), + q(7778) => q(yww), + q(7779) => q(yxa), + q(7780) => q(yxg), + q(7781) => q(yxl), + q(7782) => q(yxm), + q(7783) => q(yxu), + q(7784) => q(yxy), + q(7785) => q(yyr), + q(7786) => q(yyu), + q(7787) => q(yyz), + q(7788) => q(yzg), + q(7789) => q(yzk), + q(7790) => q(zaa), + q(7791) => q(zab), + q(7792) => q(zac), + q(7793) => q(zad), + q(7794) => q(zae), + q(7795) => q(zaf), + q(7796) => q(zag), + q(7797) => q(zah), + q(7798) => q(zai), + q(7799) => q(zaj), + q(7800) => q(zak), + q(7801) => q(zal), + q(7802) => q(zam), + q(7803) => q(zao), + q(7804) => q(zaq), + q(7805) => q(zar), + q(7806) => q(zas), + q(7807) => q(zat), + q(7808) => q(zau), + q(7809) => q(zav), + q(7810) => q(zaw), + q(7811) => q(zax), + q(7812) => q(zay), + q(7813) => q(zaz), + q(7814) => q(zbc), + q(7815) => q(zbe), + q(7816) => q(zbt), + q(7817) => q(zbw), + q(7818) => q(zca), + q(7819) => q(zch), + q(7820) => q(zdj), + q(7821) => q(zea), + q(7822) => q(zeg), + q(7823) => q(zeh), + q(7824) => q(zga), + q(7825) => q(zgb), + q(7826) => q(zgm), + q(7827) => q(zgn), + q(7828) => q(zgr), + q(7829) => q(zhb), + q(7830) => q(zhd), + q(7831) => q(zhi), + q(7832) => q(zhn), + q(7833) => q(zhw), + q(7834) => q(zia), + q(7835) => q(zib), + q(7836) => q(zik), + q(7837) => q(zil), + q(7838) => q(zim), + q(7839) => q(zin), + q(7840) => q(zir), + q(7841) => q(ziw), + q(7842) => q(ziz), + q(7843) => q(zka), + q(7844) => q(zkb), + q(7845) => q(zkd), + q(7846) => q(zkg), + q(7847) => q(zkh), + q(7848) => q(zkk), + q(7849) => q(zkn), + q(7850) => q(zko), + q(7851) => q(zkp), + q(7852) => q(zkr), + q(7853) => q(zkt), + q(7854) => q(zku), + q(7855) => q(zkv), + q(7856) => q(zkz), + q(7857) => q(zlj), + q(7858) => q(zlm), + q(7859) => q(zln), + q(7860) => q(zlq), + q(7861) => q(zma), + q(7862) => q(zmb), + q(7863) => q(zmc), + q(7864) => q(zmd), + q(7865) => q(zme), + q(7866) => q(zmf), + q(7867) => q(zmg), + q(7868) => q(zmh), + q(7869) => q(zmi), + q(7870) => q(zmj), + q(7871) => q(zmk), + q(7872) => q(zml), + q(7873) => q(zmm), + q(7874) => q(zmn), + q(7875) => q(zmo), + q(7876) => q(zmp), + q(7877) => q(zmq), + q(7878) => q(zmr), + q(7879) => q(zms), + q(7880) => q(zmt), + q(7881) => q(zmu), + q(7882) => q(zmv), + q(7883) => q(zmw), + q(7884) => q(zmx), + q(7885) => q(zmy), + q(7886) => q(zmz), + q(7887) => q(zna), + q(7888) => q(zne), + q(7889) => q(zng), + q(7890) => q(znk), + q(7891) => q(zns), + q(7892) => q(zoc), + q(7893) => q(zoh), + q(7894) => q(zom), + q(7895) => q(zoo), + q(7896) => q(zoq), + q(7897) => q(zor), + q(7898) => q(zos), + q(7899) => q(zpa), + q(7900) => q(zpb), + q(7901) => q(zpc), + q(7902) => q(zpd), + q(7903) => q(zpe), + q(7904) => q(zpf), + q(7905) => q(zpg), + q(7906) => q(zph), + q(7907) => q(zpi), + q(7908) => q(zpj), + q(7909) => q(zpk), + q(7910) => q(zpl), + q(7911) => q(zpm), + q(7912) => q(zpn), + q(7913) => q(zpo), + q(7914) => q(zpp), + q(7915) => q(zpq), + q(7916) => q(zpr), + q(7917) => q(zps), + q(7918) => q(zpt), + q(7919) => q(zpu), + q(7920) => q(zpv), + q(7921) => q(zpw), + q(7922) => q(zpx), + q(7923) => q(zpy), + q(7924) => q(zpz), + q(7925) => q(zqe), + q(7926) => q(zra), + q(7927) => q(zrg), + q(7928) => q(zrn), + q(7929) => q(zro), + q(7930) => q(zrp), + q(7931) => q(zrs), + q(7932) => q(zsa), + q(7933) => q(zsk), + q(7934) => q(zsl), + q(7935) => q(zsm), + q(7936) => q(zsr), + q(7937) => q(zsu), + q(7938) => q(zte), + q(7939) => q(ztg), + q(7940) => q(ztl), + q(7941) => q(ztm), + q(7942) => q(ztn), + q(7943) => q(ztp), + q(7944) => q(ztq), + q(7945) => q(zts), + q(7946) => q(ztt), + q(7947) => q(ztu), + q(7948) => q(ztx), + q(7949) => q(zty), + q(7950) => q(zua), + q(7951) => q(zuh), + q(7952) => q(zum), + q(7953) => q(zuy), + q(7954) => q(zwa), + q(7955) => q(zyb), + q(7956) => q(zyg), + q(7957) => q(zyj), + q(7958) => q(zyn), + q(7959) => q(zyp), + q(7960) => q(zzj), + }, + q(term) => { + q(0001) => q(aar), + q(0002) => q(abk), + q(0003) => q(ace), + q(0004) => q(ach), + q(0005) => q(ada), + q(0006) => q(ady), + q(0007) => q(afa), + q(0008) => q(afh), + q(0009) => q(afr), + q(0010) => q(ain), + q(0011) => q(aka), + q(0012) => q(akk), + q(0013) => q(sqi), + q(0014) => q(ale), + q(0015) => q(alg), + q(0016) => q(alt), + q(0017) => q(amh), + q(0018) => q(ang), + q(0019) => q(anp), + q(0020) => q(apa), + q(0021) => q(ara), + q(0022) => q(arc), + q(0023) => q(arg), + q(0024) => q(hye), + q(0025) => q(arn), + q(0026) => q(arp), + q(0027) => q(art), + q(0028) => q(arw), + q(0029) => q(asm), + q(0030) => q(ast), + q(0031) => q(ath), + q(0032) => q(aus), + q(0033) => q(ava), + q(0034) => q(ave), + q(0035) => q(awa), + q(0036) => q(aym), + q(0037) => q(aze), + q(0038) => q(bad), + q(0039) => q(bai), + q(0040) => q(bak), + q(0041) => q(bal), + q(0042) => q(bam), + q(0043) => q(ban), + q(0044) => q(eus), + q(0045) => q(bas), + q(0046) => q(bat), + q(0047) => q(bej), + q(0048) => q(bel), + q(0049) => q(bem), + q(0050) => q(ben), + q(0051) => q(ber), + q(0052) => q(bho), + q(0053) => q(bih), + q(0054) => q(bik), + q(0055) => q(bin), + q(0056) => q(bis), + q(0057) => q(bla), + q(0058) => q(bnt), + q(0059) => q(bos), + q(0060) => q(bra), + q(0061) => q(bre), + q(0062) => q(btk), + q(0063) => q(bua), + q(0064) => q(bug), + q(0065) => q(bul), + q(0066) => q(mya), + q(0067) => q(byn), + q(0068) => q(cad), + q(0069) => q(cai), + q(0070) => q(car), + q(0071) => q(cat), + q(0072) => q(cau), + q(0073) => q(ceb), + q(0074) => q(cel), + q(0075) => q(cha), + q(0076) => q(chb), + q(0077) => q(che), + q(0078) => q(chg), + q(0079) => q(zho), + q(0080) => q(chk), + q(0081) => q(chm), + q(0082) => q(chn), + q(0083) => q(cho), + q(0084) => q(chp), + q(0085) => q(chr), + q(0086) => q(chu), + q(0087) => q(chv), + q(0088) => q(chy), + q(0089) => q(cmc), + q(0090) => q(cnr), + q(0091) => q(cop), + q(0092) => q(cor), + q(0093) => q(cos), + q(0094) => q(cpe), + q(0095) => q(cpf), + q(0096) => q(cpp), + q(0097) => q(cre), + q(0098) => q(crh), + q(0099) => q(crp), + q(0100) => q(csb), + q(0101) => q(cus), + q(0102) => q(ces), + q(0103) => q(dak), + q(0104) => q(dan), + q(0105) => q(dar), + q(0106) => q(day), + q(0107) => q(del), + q(0108) => q(den), + q(0109) => q(dgr), + q(0110) => q(din), + q(0111) => q(div), + q(0112) => q(doi), + q(0113) => q(dra), + q(0114) => q(dsb), + q(0115) => q(dua), + q(0116) => q(dum), + q(0117) => q(nld), + q(0118) => q(dyu), + q(0119) => q(dzo), + q(0120) => q(efi), + q(0121) => q(egy), + q(0122) => q(eka), + q(0123) => q(elx), + q(0124) => q(eng), + q(0125) => q(enm), + q(0126) => q(epo), + q(0127) => q(est), + q(0128) => q(ewe), + q(0129) => q(ewo), + q(0130) => q(fan), + q(0131) => q(fao), + q(0132) => q(fat), + q(0133) => q(fij), + q(0134) => q(fil), + q(0135) => q(fin), + q(0136) => q(fiu), + q(0137) => q(fon), + q(0138) => q(fra), + q(0139) => q(frm), + q(0140) => q(fro), + q(0141) => q(frr), + q(0142) => q(frs), + q(0143) => q(fry), + q(0144) => q(ful), + q(0145) => q(fur), + q(0146) => q(gaa), + q(0147) => q(gay), + q(0148) => q(gba), + q(0149) => q(gem), + q(0150) => q(kat), + q(0151) => q(deu), + q(0152) => q(gez), + q(0153) => q(gil), + q(0154) => q(gla), + q(0155) => q(gle), + q(0156) => q(glg), + q(0157) => q(glv), + q(0158) => q(gmh), + q(0159) => q(goh), + q(0160) => q(gon), + q(0161) => q(gor), + q(0162) => q(got), + q(0163) => q(grb), + q(0164) => q(grc), + q(0165) => q(ell), + q(0166) => q(grn), + q(0167) => q(gsw), + q(0168) => q(guj), + q(0169) => q(gwi), + q(0170) => q(hai), + q(0171) => q(hat), + q(0172) => q(hau), + q(0173) => q(haw), + q(0174) => q(heb), + q(0175) => q(her), + q(0176) => q(hil), + q(0177) => q(him), + q(0178) => q(hin), + q(0179) => q(hit), + q(0180) => q(hmn), + q(0181) => q(hmo), + q(0182) => q(hrv), + q(0183) => q(hsb), + q(0184) => q(hun), + q(0185) => q(hup), + q(0186) => q(iba), + q(0187) => q(ibo), + q(0188) => q(isl), + q(0189) => q(ido), + q(0190) => q(iii), + q(0191) => q(ijo), + q(0192) => q(iku), + q(0193) => q(ile), + q(0194) => q(ilo), + q(0195) => q(ina), + q(0196) => q(inc), + q(0197) => q(ind), + q(0198) => q(ine), + q(0199) => q(inh), + q(0200) => q(ipk), + q(0201) => q(ira), + q(0202) => q(iro), + q(0203) => q(ita), + q(0204) => q(jav), + q(0205) => q(jbo), + q(0206) => q(jpn), + q(0207) => q(jpr), + q(0208) => q(jrb), + q(0209) => q(kaa), + q(0210) => q(kab), + q(0211) => q(kac), + q(0212) => q(kal), + q(0213) => q(kam), + q(0214) => q(kan), + q(0215) => q(kar), + q(0216) => q(kas), + q(0217) => q(kau), + q(0218) => q(kaw), + q(0219) => q(kaz), + q(0220) => q(kbd), + q(0221) => q(kha), + q(0222) => q(khi), + q(0223) => q(khm), + q(0224) => q(kho), + q(0225) => q(kik), + q(0226) => q(kin), + q(0227) => q(kir), + q(0228) => q(kmb), + q(0229) => q(kok), + q(0230) => q(kom), + q(0231) => q(kon), + q(0232) => q(kor), + q(0233) => q(kos), + q(0234) => q(kpe), + q(0235) => q(krc), + q(0236) => q(krl), + q(0237) => q(kro), + q(0238) => q(kru), + q(0239) => q(kua), + q(0240) => q(kum), + q(0241) => q(kur), + q(0242) => q(kut), + q(0243) => q(lad), + q(0244) => q(lah), + q(0245) => q(lam), + q(0246) => q(lao), + q(0247) => q(lat), + q(0248) => q(lav), + q(0249) => q(lez), + q(0250) => q(lim), + q(0251) => q(lin), + q(0252) => q(lit), + q(0253) => q(lol), + q(0254) => q(loz), + q(0255) => q(ltz), + q(0256) => q(lua), + q(0257) => q(lub), + q(0258) => q(lug), + q(0259) => q(lui), + q(0260) => q(lun), + q(0261) => q(luo), + q(0262) => q(lus), + q(0263) => q(mkd), + q(0264) => q(mad), + q(0265) => q(mag), + q(0266) => q(mah), + q(0267) => q(mai), + q(0268) => q(mak), + q(0269) => q(mal), + q(0270) => q(man), + q(0271) => q(mri), + q(0272) => q(map), + q(0273) => q(mar), + q(0274) => q(mas), + q(0275) => q(msa), + q(0276) => q(mdf), + q(0277) => q(mdr), + q(0278) => q(men), + q(0279) => q(mga), + q(0280) => q(mic), + q(0281) => q(min), + q(0282) => q(mis), + q(0283) => q(mkh), + q(0284) => q(mlg), + q(0285) => q(mlt), + q(0286) => q(mnc), + q(0287) => q(mni), + q(0288) => q(mno), + q(0289) => q(moh), + q(0290) => q(mon), + q(0291) => q(mos), + q(0292) => q(mul), + q(0293) => q(mun), + q(0294) => q(mus), + q(0295) => q(mwl), + q(0296) => q(mwr), + q(0297) => q(myn), + q(0298) => q(myv), + q(0299) => q(nah), + q(0300) => q(nai), + q(0301) => q(nap), + q(0302) => q(nau), + q(0303) => q(nav), + q(0304) => q(nbl), + q(0305) => q(nde), + q(0306) => q(ndo), + q(0307) => q(nds), + q(0308) => q(nep), + q(0309) => q(new), + q(0310) => q(nia), + q(0311) => q(nic), + q(0312) => q(niu), + q(0313) => q(nno), + q(0314) => q(nob), + q(0315) => q(nog), + q(0316) => q(non), + q(0317) => q(nor), + q(0318) => q(nqo), + q(0319) => q(nso), + q(0320) => q(nub), + q(0321) => q(nwc), + q(0322) => q(nya), + q(0323) => q(nym), + q(0324) => q(nyn), + q(0325) => q(nyo), + q(0326) => q(nzi), + q(0327) => q(oci), + q(0328) => q(oji), + q(0329) => q(ori), + q(0330) => q(orm), + q(0331) => q(osa), + q(0332) => q(oss), + q(0333) => q(ota), + q(0334) => q(oto), + q(0335) => q(paa), + q(0336) => q(pag), + q(0337) => q(pal), + q(0338) => q(pam), + q(0339) => q(pan), + q(0340) => q(pap), + q(0341) => q(pau), + q(0342) => q(peo), + q(0343) => q(fas), + q(0344) => q(phi), + q(0345) => q(phn), + q(0346) => q(pli), + q(0347) => q(pol), + q(0348) => q(pon), + q(0349) => q(por), + q(0350) => q(pra), + q(0351) => q(pro), + q(0352) => q(pus), + q(0353) => q(qtz), + q(0354) => q(que), + q(0355) => q(raj), + q(0356) => q(rap), + q(0357) => q(rar), + q(0358) => q(roa), + q(0359) => q(roh), + q(0360) => q(rom), + q(0361) => q(ron), + q(0362) => q(run), + q(0363) => q(rup), + q(0364) => q(rus), + q(0365) => q(sad), + q(0366) => q(sag), + q(0367) => q(sah), + q(0368) => q(sai), + q(0369) => q(sal), + q(0370) => q(sam), + q(0371) => q(san), + q(0372) => q(sas), + q(0373) => q(sat), + q(0374) => q(scn), + q(0375) => q(sco), + q(0376) => q(sel), + q(0377) => q(sem), + q(0378) => q(sga), + q(0379) => q(sgn), + q(0380) => q(shn), + q(0381) => q(sid), + q(0382) => q(sin), + q(0383) => q(sio), + q(0384) => q(sit), + q(0385) => q(sla), + q(0386) => q(slk), + q(0387) => q(slv), + q(0388) => q(sma), + q(0389) => q(sme), + q(0390) => q(smi), + q(0391) => q(smj), + q(0392) => q(smn), + q(0393) => q(smo), + q(0394) => q(sms), + q(0395) => q(sna), + q(0396) => q(snd), + q(0397) => q(snk), + q(0398) => q(sog), + q(0399) => q(som), + q(0400) => q(son), + q(0401) => q(sot), + q(0402) => q(spa), + q(0403) => q(srd), + q(0404) => q(srn), + q(0405) => q(srp), + q(0406) => q(srr), + q(0407) => q(ssa), + q(0408) => q(ssw), + q(0409) => q(suk), + q(0410) => q(sun), + q(0411) => q(sus), + q(0412) => q(sux), + q(0413) => q(swa), + q(0414) => q(swe), + q(0415) => q(syc), + q(0416) => q(syr), + q(0417) => q(tah), + q(0418) => q(tai), + q(0419) => q(tam), + q(0420) => q(tat), + q(0421) => q(tel), + q(0422) => q(tem), + q(0423) => q(ter), + q(0424) => q(tet), + q(0425) => q(tgk), + q(0426) => q(tgl), + q(0427) => q(tha), + q(0428) => q(bod), + q(0429) => q(tig), + q(0430) => q(tir), + q(0431) => q(tiv), + q(0432) => q(tkl), + q(0433) => q(tlh), + q(0434) => q(tli), + q(0435) => q(tmh), + q(0436) => q(tog), + q(0437) => q(ton), + q(0438) => q(tpi), + q(0439) => q(tsi), + q(0440) => q(tsn), + q(0441) => q(tso), + q(0442) => q(tuk), + q(0443) => q(tum), + q(0444) => q(tup), + q(0445) => q(tur), + q(0446) => q(tut), + q(0447) => q(tvl), + q(0448) => q(twi), + q(0449) => q(tyv), + q(0450) => q(udm), + q(0451) => q(uga), + q(0452) => q(uig), + q(0453) => q(ukr), + q(0454) => q(umb), + q(0455) => q(und), + q(0456) => q(urd), + q(0457) => q(uzb), + q(0458) => q(vai), + q(0459) => q(ven), + q(0460) => q(vie), + q(0461) => q(vol), + q(0462) => q(vot), + q(0463) => q(wak), + q(0464) => q(wal), + q(0465) => q(war), + q(0466) => q(was), + q(0467) => q(cym), + q(0468) => q(wen), + q(0469) => q(wln), + q(0470) => q(wol), + q(0471) => q(xal), + q(0472) => q(xho), + q(0473) => q(yao), + q(0474) => q(yap), + q(0475) => q(yid), + q(0476) => q(yor), + q(0477) => q(ypk), + q(0478) => q(zap), + q(0479) => q(zbl), + q(0480) => q(zen), + q(0481) => q(zgh), + q(0482) => q(zha), + q(0483) => q(znd), + q(0484) => q(zul), + q(0485) => q(zun), + q(0486) => q(zxx), + q(0487) => q(zza), + }, +}; + +1; +package # +Locale::Codes::LangFam_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:55:15 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'langfam'}{'id'} = '0116'; + +$Locale::Codes::Data{'langfam'}{'id2names'} = { + q(0001) => [ + q(Austro-Asiatic languages), + ], + q(0002) => [ + q(Afro-Asiatic languages), + ], + q(0003) => [ + q(Algonquian languages), + ], + q(0004) => [ + q(Atlantic-Congo languages), + ], + q(0005) => [ + q(Apache languages), + ], + q(0006) => [ + q(Alacalufan languages), + ], + q(0007) => [ + q(Algic languages), + ], + q(0008) => [ + q(Artificial languages), + ], + q(0009) => [ + q(Athapascan languages), + ], + q(0010) => [ + q(Arauan languages), + ], + q(0011) => [ + q(Australian languages), + ], + q(0012) => [ + q(Arawakan languages), + ], + q(0013) => [ + q(Uto-Aztecan languages), + ], + q(0014) => [ + q(Banda languages), + ], + q(0015) => [ + q(Bamileke languages), + ], + q(0016) => [ + q(Baltic languages), + ], + q(0017) => [ + q(Berber languages), + ], + q(0018) => [ + q(Bihari languages), + ], + q(0019) => [ + q(Bantu languages), + ], + q(0020) => [ + q(Batak languages), + ], + q(0021) => [ + q(Central American Indian languages), + ], + q(0022) => [ + q(Caucasian languages), + ], + q(0023) => [ + q(Chibchan languages), + ], + q(0024) => [ + q(North Caucasian languages), + ], + q(0025) => [ + q(South Caucasian languages), + ], + q(0026) => [ + q(Chadic languages), + ], + q(0027) => [ + q(Caddoan languages), + ], + q(0028) => [ + q(Celtic languages), + ], + q(0029) => [ + q(Chamic languages), + ], + q(0030) => [ + q(Creoles and pidgins, English-based), + ], + q(0031) => [ + q(Creoles and pidgins, French-based), + ], + q(0032) => [ + q(Creoles and pidgins, Portuguese-based), + ], + q(0033) => [ + q(Creoles and pidgins), + ], + q(0034) => [ + q(Central Sudanic languages), + ], + q(0035) => [ + q(Cushitic languages), + ], + q(0036) => [ + q(Land Dayak languages), + ], + q(0037) => [ + q(Mande languages), + ], + q(0038) => [ + q(Dravidian languages), + ], + q(0039) => [ + q(Egyptian languages), + ], + q(0040) => [ + q(Eskimo-Aleut languages), + ], + q(0041) => [ + q(Basque (family)), + ], + q(0042) => [ + q(Finno-Ugrian languages), + ], + q(0043) => [ + q(Formosan languages), + ], + q(0044) => [ + q(Germanic languages), + ], + q(0045) => [ + q(East Germanic languages), + ], + q(0046) => [ + q(North Germanic languages), + ], + q(0047) => [ + q(West Germanic languages), + ], + q(0048) => [ + q(Greek languages), + ], + q(0049) => [ + q(Hmong-Mien languages), + ], + q(0050) => [ + q(Hokan languages), + ], + q(0051) => [ + q(Armenian (family)), + ], + q(0052) => [ + q(Indo-Iranian languages), + ], + q(0053) => [ + q(Ijo languages), + ], + q(0054) => [ + q(Indic languages), + ], + q(0055) => [ + q(Indo-European languages), + ], + q(0056) => [ + q(Iranian languages), + ], + q(0057) => [ + q(Iroquoian languages), + ], + q(0058) => [ + q(Italic languages), + ], + q(0059) => [ + q(Japanese (family)), + ], + q(0060) => [ + q(Karen languages), + ], + q(0061) => [ + q(Kordofanian languages), + ], + q(0062) => [ + q(Khoisan languages), + ], + q(0063) => [ + q(Kru languages), + ], + q(0064) => [ + q(Austronesian languages), + ], + q(0065) => [ + q(Mon-Khmer languages), + ], + q(0066) => [ + q(Manobo languages), + ], + q(0067) => [ + q(Munda languages), + ], + q(0068) => [ + q(Mayan languages), + ], + q(0069) => [ + q(Nahuatl languages), + ], + q(0070) => [ + q(North American Indian languages), + ], + q(0071) => [ + q(Trans-New Guinea languages), + ], + q(0072) => [ + q(Niger-Kordofanian languages), + ], + q(0073) => [ + q(Nubian languages), + ], + q(0074) => [ + q(Oto-Manguean languages), + ], + q(0075) => [ + q(Omotic languages), + ], + q(0076) => [ + q(Otomian languages), + ], + q(0077) => [ + q(Papuan languages), + ], + q(0078) => [ + q(Philippine languages), + ], + q(0079) => [ + q(Central Malayo-Polynesian languages), + ], + q(0080) => [ + q(Malayo-Polynesian languages), + ], + q(0081) => [ + q(Eastern Malayo-Polynesian languages), + ], + q(0082) => [ + q(Western Malayo-Polynesian languages), + ], + q(0083) => [ + q(Prakrit languages), + ], + q(0084) => [ + q(Quechuan (family)), + ], + q(0085) => [ + q(Romance languages), + ], + q(0086) => [ + q(South American Indian languages), + ], + q(0087) => [ + q(Salishan languages), + ], + q(0088) => [ + q(Eastern Sudanic languages), + ], + q(0089) => [ + q(Semitic languages), + ], + q(0090) => [ + q(sign languages), + ], + q(0091) => [ + q(Siouan languages), + ], + q(0092) => [ + q(Sino-Tibetan languages), + ], + q(0093) => [ + q(Slavic languages), + ], + q(0094) => [ + q(Sami languages), + ], + q(0095) => [ + q(Songhai languages), + ], + q(0096) => [ + q(Albanian languages), + ], + q(0097) => [ + q(Nilo-Saharan languages), + ], + q(0098) => [ + q(Samoyedic languages), + ], + q(0099) => [ + q(Tai languages), + ], + q(0100) => [ + q(Tibeto-Burman languages), + ], + q(0101) => [ + q(Turkic languages), + ], + q(0102) => [ + q(Tupi languages), + ], + q(0103) => [ + q(Altaic languages), + ], + q(0104) => [ + q(Tungus languages), + ], + q(0105) => [ + q(Uralic languages), + ], + q(0106) => [ + q(Wakashan languages), + ], + q(0107) => [ + q(Sorbian languages), + ], + q(0108) => [ + q(Mongolian languages), + ], + q(0109) => [ + q(Na-Dene languages), + ], + q(0110) => [ + q(Yupik languages), + ], + q(0111) => [ + q(Chinese (family)), + ], + q(0112) => [ + q(East Slavic languages), + ], + q(0113) => [ + q(South Slavic languages), + ], + q(0114) => [ + q(West Slavic languages), + ], + q(0115) => [ + q(Zande languages), + ], +}; + +$Locale::Codes::Data{'langfam'}{'alias2id'} = { + q(afro-asiatic languages) => [ + q(0002), + q(0), + ], + q(alacalufan languages) => [ + q(0006), + q(0), + ], + q(albanian languages) => [ + q(0096), + q(0), + ], + q(algic languages) => [ + q(0007), + q(0), + ], + q(algonquian languages) => [ + q(0003), + q(0), + ], + q(altaic languages) => [ + q(0103), + q(0), + ], + q(apache languages) => [ + q(0005), + q(0), + ], + q(arauan languages) => [ + q(0010), + q(0), + ], + q(arawakan languages) => [ + q(0012), + q(0), + ], + q(armenian (family)) => [ + q(0051), + q(0), + ], + q(artificial languages) => [ + q(0008), + q(0), + ], + q(athapascan languages) => [ + q(0009), + q(0), + ], + q(atlantic-congo languages) => [ + q(0004), + q(0), + ], + q(australian languages) => [ + q(0011), + q(0), + ], + q(austro-asiatic languages) => [ + q(0001), + q(0), + ], + q(austronesian languages) => [ + q(0064), + q(0), + ], + q(baltic languages) => [ + q(0016), + q(0), + ], + q(bamileke languages) => [ + q(0015), + q(0), + ], + q(banda languages) => [ + q(0014), + q(0), + ], + q(bantu languages) => [ + q(0019), + q(0), + ], + q(basque (family)) => [ + q(0041), + q(0), + ], + q(batak languages) => [ + q(0020), + q(0), + ], + q(berber languages) => [ + q(0017), + q(0), + ], + q(bihari languages) => [ + q(0018), + q(0), + ], + q(caddoan languages) => [ + q(0027), + q(0), + ], + q(caucasian languages) => [ + q(0022), + q(0), + ], + q(celtic languages) => [ + q(0028), + q(0), + ], + q(central american indian languages) => [ + q(0021), + q(0), + ], + q(central malayo-polynesian languages) => [ + q(0079), + q(0), + ], + q(central sudanic languages) => [ + q(0034), + q(0), + ], + q(chadic languages) => [ + q(0026), + q(0), + ], + q(chamic languages) => [ + q(0029), + q(0), + ], + q(chibchan languages) => [ + q(0023), + q(0), + ], + q(chinese (family)) => [ + q(0111), + q(0), + ], + q(creoles and pidgins) => [ + q(0033), + q(0), + ], + q(creoles and pidgins, english-based) => [ + q(0030), + q(0), + ], + q(creoles and pidgins, french-based) => [ + q(0031), + q(0), + ], + q(creoles and pidgins, portuguese-based) => [ + q(0032), + q(0), + ], + q(cushitic languages) => [ + q(0035), + q(0), + ], + q(dravidian languages) => [ + q(0038), + q(0), + ], + q(east germanic languages) => [ + q(0045), + q(0), + ], + q(east slavic languages) => [ + q(0112), + q(0), + ], + q(eastern malayo-polynesian languages) => [ + q(0081), + q(0), + ], + q(eastern sudanic languages) => [ + q(0088), + q(0), + ], + q(egyptian languages) => [ + q(0039), + q(0), + ], + q(eskimo-aleut languages) => [ + q(0040), + q(0), + ], + q(finno-ugrian languages) => [ + q(0042), + q(0), + ], + q(formosan languages) => [ + q(0043), + q(0), + ], + q(germanic languages) => [ + q(0044), + q(0), + ], + q(greek languages) => [ + q(0048), + q(0), + ], + q(hmong-mien languages) => [ + q(0049), + q(0), + ], + q(hokan languages) => [ + q(0050), + q(0), + ], + q(ijo languages) => [ + q(0053), + q(0), + ], + q(indic languages) => [ + q(0054), + q(0), + ], + q(indo-european languages) => [ + q(0055), + q(0), + ], + q(indo-iranian languages) => [ + q(0052), + q(0), + ], + q(iranian languages) => [ + q(0056), + q(0), + ], + q(iroquoian languages) => [ + q(0057), + q(0), + ], + q(italic languages) => [ + q(0058), + q(0), + ], + q(japanese (family)) => [ + q(0059), + q(0), + ], + q(karen languages) => [ + q(0060), + q(0), + ], + q(khoisan languages) => [ + q(0062), + q(0), + ], + q(kordofanian languages) => [ + q(0061), + q(0), + ], + q(kru languages) => [ + q(0063), + q(0), + ], + q(land dayak languages) => [ + q(0036), + q(0), + ], + q(malayo-polynesian languages) => [ + q(0080), + q(0), + ], + q(mande languages) => [ + q(0037), + q(0), + ], + q(manobo languages) => [ + q(0066), + q(0), + ], + q(mayan languages) => [ + q(0068), + q(0), + ], + q(mon-khmer languages) => [ + q(0065), + q(0), + ], + q(mongolian languages) => [ + q(0108), + q(0), + ], + q(munda languages) => [ + q(0067), + q(0), + ], + q(na-dene languages) => [ + q(0109), + q(0), + ], + q(nahuatl languages) => [ + q(0069), + q(0), + ], + q(niger-kordofanian languages) => [ + q(0072), + q(0), + ], + q(nilo-saharan languages) => [ + q(0097), + q(0), + ], + q(north american indian languages) => [ + q(0070), + q(0), + ], + q(north caucasian languages) => [ + q(0024), + q(0), + ], + q(north germanic languages) => [ + q(0046), + q(0), + ], + q(nubian languages) => [ + q(0073), + q(0), + ], + q(omotic languages) => [ + q(0075), + q(0), + ], + q(oto-manguean languages) => [ + q(0074), + q(0), + ], + q(otomian languages) => [ + q(0076), + q(0), + ], + q(papuan languages) => [ + q(0077), + q(0), + ], + q(philippine languages) => [ + q(0078), + q(0), + ], + q(prakrit languages) => [ + q(0083), + q(0), + ], + q(quechuan (family)) => [ + q(0084), + q(0), + ], + q(romance languages) => [ + q(0085), + q(0), + ], + q(salishan languages) => [ + q(0087), + q(0), + ], + q(sami languages) => [ + q(0094), + q(0), + ], + q(samoyedic languages) => [ + q(0098), + q(0), + ], + q(semitic languages) => [ + q(0089), + q(0), + ], + q(sign languages) => [ + q(0090), + q(0), + ], + q(sino-tibetan languages) => [ + q(0092), + q(0), + ], + q(siouan languages) => [ + q(0091), + q(0), + ], + q(slavic languages) => [ + q(0093), + q(0), + ], + q(songhai languages) => [ + q(0095), + q(0), + ], + q(sorbian languages) => [ + q(0107), + q(0), + ], + q(south american indian languages) => [ + q(0086), + q(0), + ], + q(south caucasian languages) => [ + q(0025), + q(0), + ], + q(south slavic languages) => [ + q(0113), + q(0), + ], + q(tai languages) => [ + q(0099), + q(0), + ], + q(tibeto-burman languages) => [ + q(0100), + q(0), + ], + q(trans-new guinea languages) => [ + q(0071), + q(0), + ], + q(tungus languages) => [ + q(0104), + q(0), + ], + q(tupi languages) => [ + q(0102), + q(0), + ], + q(turkic languages) => [ + q(0101), + q(0), + ], + q(uralic languages) => [ + q(0105), + q(0), + ], + q(uto-aztecan languages) => [ + q(0013), + q(0), + ], + q(wakashan languages) => [ + q(0106), + q(0), + ], + q(west germanic languages) => [ + q(0047), + q(0), + ], + q(west slavic languages) => [ + q(0114), + q(0), + ], + q(western malayo-polynesian languages) => [ + q(0082), + q(0), + ], + q(yupik languages) => [ + q(0110), + q(0), + ], + q(zande languages) => [ + q(0115), + q(0), + ], +}; + +$Locale::Codes::Data{'langfam'}{'code2id'} = { + q(alpha) => { + q(aav) => [ + q(0001), + q(0), + ], + q(afa) => [ + q(0002), + q(0), + ], + q(alg) => [ + q(0003), + q(0), + ], + q(alv) => [ + q(0004), + q(0), + ], + q(apa) => [ + q(0005), + q(0), + ], + q(aqa) => [ + q(0006), + q(0), + ], + q(aql) => [ + q(0007), + q(0), + ], + q(art) => [ + q(0008), + q(0), + ], + q(ath) => [ + q(0009), + q(0), + ], + q(auf) => [ + q(0010), + q(0), + ], + q(aus) => [ + q(0011), + q(0), + ], + q(awd) => [ + q(0012), + q(0), + ], + q(azc) => [ + q(0013), + q(0), + ], + q(bad) => [ + q(0014), + q(0), + ], + q(bai) => [ + q(0015), + q(0), + ], + q(bat) => [ + q(0016), + q(0), + ], + q(ber) => [ + q(0017), + q(0), + ], + q(bih) => [ + q(0018), + q(0), + ], + q(bnt) => [ + q(0019), + q(0), + ], + q(btk) => [ + q(0020), + q(0), + ], + q(cai) => [ + q(0021), + q(0), + ], + q(cau) => [ + q(0022), + q(0), + ], + q(cba) => [ + q(0023), + q(0), + ], + q(ccn) => [ + q(0024), + q(0), + ], + q(ccs) => [ + q(0025), + q(0), + ], + q(cdc) => [ + q(0026), + q(0), + ], + q(cdd) => [ + q(0027), + q(0), + ], + q(cel) => [ + q(0028), + q(0), + ], + q(cmc) => [ + q(0029), + q(0), + ], + q(cpe) => [ + q(0030), + q(0), + ], + q(cpf) => [ + q(0031), + q(0), + ], + q(cpp) => [ + q(0032), + q(0), + ], + q(crp) => [ + q(0033), + q(0), + ], + q(csu) => [ + q(0034), + q(0), + ], + q(cus) => [ + q(0035), + q(0), + ], + q(day) => [ + q(0036), + q(0), + ], + q(dmn) => [ + q(0037), + q(0), + ], + q(dra) => [ + q(0038), + q(0), + ], + q(egx) => [ + q(0039), + q(0), + ], + q(esx) => [ + q(0040), + q(0), + ], + q(euq) => [ + q(0041), + q(0), + ], + q(fiu) => [ + q(0042), + q(0), + ], + q(fox) => [ + q(0043), + q(0), + ], + q(gem) => [ + q(0044), + q(0), + ], + q(gme) => [ + q(0045), + q(0), + ], + q(gmq) => [ + q(0046), + q(0), + ], + q(gmw) => [ + q(0047), + q(0), + ], + q(grk) => [ + q(0048), + q(0), + ], + q(hmx) => [ + q(0049), + q(0), + ], + q(hok) => [ + q(0050), + q(0), + ], + q(hyx) => [ + q(0051), + q(0), + ], + q(iir) => [ + q(0052), + q(0), + ], + q(ijo) => [ + q(0053), + q(0), + ], + q(inc) => [ + q(0054), + q(0), + ], + q(ine) => [ + q(0055), + q(0), + ], + q(ira) => [ + q(0056), + q(0), + ], + q(iro) => [ + q(0057), + q(0), + ], + q(itc) => [ + q(0058), + q(0), + ], + q(jpx) => [ + q(0059), + q(0), + ], + q(kar) => [ + q(0060), + q(0), + ], + q(kdo) => [ + q(0061), + q(0), + ], + q(khi) => [ + q(0062), + q(0), + ], + q(kro) => [ + q(0063), + q(0), + ], + q(map) => [ + q(0064), + q(0), + ], + q(mkh) => [ + q(0065), + q(0), + ], + q(mno) => [ + q(0066), + q(0), + ], + q(mun) => [ + q(0067), + q(0), + ], + q(myn) => [ + q(0068), + q(0), + ], + q(nah) => [ + q(0069), + q(0), + ], + q(nai) => [ + q(0070), + q(0), + ], + q(ngf) => [ + q(0071), + q(0), + ], + q(nic) => [ + q(0072), + q(0), + ], + q(nub) => [ + q(0073), + q(0), + ], + q(omq) => [ + q(0074), + q(0), + ], + q(omv) => [ + q(0075), + q(0), + ], + q(oto) => [ + q(0076), + q(0), + ], + q(paa) => [ + q(0077), + q(0), + ], + q(phi) => [ + q(0078), + q(0), + ], + q(plf) => [ + q(0079), + q(0), + ], + q(poz) => [ + q(0080), + q(0), + ], + q(pqe) => [ + q(0081), + q(0), + ], + q(pqw) => [ + q(0082), + q(0), + ], + q(pra) => [ + q(0083), + q(0), + ], + q(qwe) => [ + q(0084), + q(0), + ], + q(roa) => [ + q(0085), + q(0), + ], + q(sai) => [ + q(0086), + q(0), + ], + q(sal) => [ + q(0087), + q(0), + ], + q(sdv) => [ + q(0088), + q(0), + ], + q(sem) => [ + q(0089), + q(0), + ], + q(sgn) => [ + q(0090), + q(0), + ], + q(sio) => [ + q(0091), + q(0), + ], + q(sit) => [ + q(0092), + q(0), + ], + q(sla) => [ + q(0093), + q(0), + ], + q(smi) => [ + q(0094), + q(0), + ], + q(son) => [ + q(0095), + q(0), + ], + q(sqj) => [ + q(0096), + q(0), + ], + q(ssa) => [ + q(0097), + q(0), + ], + q(syd) => [ + q(0098), + q(0), + ], + q(tai) => [ + q(0099), + q(0), + ], + q(tbq) => [ + q(0100), + q(0), + ], + q(trk) => [ + q(0101), + q(0), + ], + q(tup) => [ + q(0102), + q(0), + ], + q(tut) => [ + q(0103), + q(0), + ], + q(tuw) => [ + q(0104), + q(0), + ], + q(urj) => [ + q(0105), + q(0), + ], + q(wak) => [ + q(0106), + q(0), + ], + q(wen) => [ + q(0107), + q(0), + ], + q(xgn) => [ + q(0108), + q(0), + ], + q(xnd) => [ + q(0109), + q(0), + ], + q(ypk) => [ + q(0110), + q(0), + ], + q(zhx) => [ + q(0111), + q(0), + ], + q(zle) => [ + q(0112), + q(0), + ], + q(zls) => [ + q(0113), + q(0), + ], + q(zlw) => [ + q(0114), + q(0), + ], + q(znd) => [ + q(0115), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'langfam'}{'id2code'} = { + q(alpha) => { + q(0001) => q(aav), + q(0002) => q(afa), + q(0003) => q(alg), + q(0004) => q(alv), + q(0005) => q(apa), + q(0006) => q(aqa), + q(0007) => q(aql), + q(0008) => q(art), + q(0009) => q(ath), + q(0010) => q(auf), + q(0011) => q(aus), + q(0012) => q(awd), + q(0013) => q(azc), + q(0014) => q(bad), + q(0015) => q(bai), + q(0016) => q(bat), + q(0017) => q(ber), + q(0018) => q(bih), + q(0019) => q(bnt), + q(0020) => q(btk), + q(0021) => q(cai), + q(0022) => q(cau), + q(0023) => q(cba), + q(0024) => q(ccn), + q(0025) => q(ccs), + q(0026) => q(cdc), + q(0027) => q(cdd), + q(0028) => q(cel), + q(0029) => q(cmc), + q(0030) => q(cpe), + q(0031) => q(cpf), + q(0032) => q(cpp), + q(0033) => q(crp), + q(0034) => q(csu), + q(0035) => q(cus), + q(0036) => q(day), + q(0037) => q(dmn), + q(0038) => q(dra), + q(0039) => q(egx), + q(0040) => q(esx), + q(0041) => q(euq), + q(0042) => q(fiu), + q(0043) => q(fox), + q(0044) => q(gem), + q(0045) => q(gme), + q(0046) => q(gmq), + q(0047) => q(gmw), + q(0048) => q(grk), + q(0049) => q(hmx), + q(0050) => q(hok), + q(0051) => q(hyx), + q(0052) => q(iir), + q(0053) => q(ijo), + q(0054) => q(inc), + q(0055) => q(ine), + q(0056) => q(ira), + q(0057) => q(iro), + q(0058) => q(itc), + q(0059) => q(jpx), + q(0060) => q(kar), + q(0061) => q(kdo), + q(0062) => q(khi), + q(0063) => q(kro), + q(0064) => q(map), + q(0065) => q(mkh), + q(0066) => q(mno), + q(0067) => q(mun), + q(0068) => q(myn), + q(0069) => q(nah), + q(0070) => q(nai), + q(0071) => q(ngf), + q(0072) => q(nic), + q(0073) => q(nub), + q(0074) => q(omq), + q(0075) => q(omv), + q(0076) => q(oto), + q(0077) => q(paa), + q(0078) => q(phi), + q(0079) => q(plf), + q(0080) => q(poz), + q(0081) => q(pqe), + q(0082) => q(pqw), + q(0083) => q(pra), + q(0084) => q(qwe), + q(0085) => q(roa), + q(0086) => q(sai), + q(0087) => q(sal), + q(0088) => q(sdv), + q(0089) => q(sem), + q(0090) => q(sgn), + q(0091) => q(sio), + q(0092) => q(sit), + q(0093) => q(sla), + q(0094) => q(smi), + q(0095) => q(son), + q(0096) => q(sqj), + q(0097) => q(ssa), + q(0098) => q(syd), + q(0099) => q(tai), + q(0100) => q(tbq), + q(0101) => q(trk), + q(0102) => q(tup), + q(0103) => q(tut), + q(0104) => q(tuw), + q(0105) => q(urj), + q(0106) => q(wak), + q(0107) => q(wen), + q(0108) => q(xgn), + q(0109) => q(xnd), + q(0110) => q(ypk), + q(0111) => q(zhx), + q(0112) => q(zle), + q(0113) => q(zls), + q(0114) => q(zlw), + q(0115) => q(znd), + }, +}; + +1; +package Locale::Codes::Script; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2script + script2code + all_script_codes + all_script_names + script_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_SCRIPT); + +our $obj = new Locale::Codes('script'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2script { + return $obj->code2name(@_); +} + +sub script2code { + return $obj->name2code(@_); +} + +sub script_code2code { + return $obj->code2code(@_); +} + +sub all_script_codes { + return $obj->all_codes(@_); +} + +sub all_script_names { + return $obj->all_names(@_); +} + +sub rename_script { + return $obj->rename_code(@_); +} + +sub add_script { + return $obj->add_code(@_); +} + +sub delete_script { + return $obj->delete_code(@_); +} + +sub add_script_alias { + return $obj->add_alias(@_); +} + +sub delete_script_alias { + return $obj->delete_alias(@_); +} + +sub rename_script_code { + return $obj->replace_code(@_); +} + +sub add_script_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_script_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package # +Locale::Codes::Currency_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:54:50 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'currency'}{'id'} = '0177'; + +$Locale::Codes::Data{'currency'}{'id2names'} = { + q(0001) => [ + q(Afghani), + ], + q(0002) => [ + q(Euro), + ], + q(0003) => [ + q(Lek), + ], + q(0004) => [ + q(Algerian Dinar), + ], + q(0005) => [ + q(US Dollar), + ], + q(0006) => [ + q(Kwanza), + ], + q(0007) => [ + q(East Caribbean Dollar), + ], + q(0008) => [ + q(Argentine Peso), + ], + q(0009) => [ + q(Armenian Dram), + ], + q(0010) => [ + q(Aruban Florin), + ], + q(0011) => [ + q(Australian Dollar), + ], + q(0012) => [ + q(Azerbaijan Manat), + ], + q(0013) => [ + q(Bahamian Dollar), + ], + q(0014) => [ + q(Bahraini Dinar), + ], + q(0015) => [ + q(Taka), + ], + q(0016) => [ + q(Barbados Dollar), + ], + q(0017) => [ + q(Belarusian Ruble), + ], + q(0018) => [ + q(Belize Dollar), + ], + q(0019) => [ + q(CFA Franc BCEAO), + ], + q(0020) => [ + q(Bermudian Dollar), + ], + q(0021) => [ + q(Indian Rupee), + ], + q(0022) => [ + q(Ngultrum), + ], + q(0023) => [ + q(Boliviano), + ], + q(0024) => [ + q(Mvdol), + ], + q(0025) => [ + q(Convertible Mark), + ], + q(0026) => [ + q(Pula), + ], + q(0027) => [ + q(Norwegian Krone), + ], + q(0028) => [ + q(Brazilian Real), + ], + q(0029) => [ + q(Brunei Dollar), + ], + q(0030) => [ + q(Bulgarian Lev), + ], + q(0031) => [ + q(Burundi Franc), + ], + q(0032) => [ + q(Cabo Verde Escudo), + ], + q(0033) => [ + q(Riel), + ], + q(0034) => [ + q(CFA Franc BEAC), + ], + q(0035) => [ + q(Canadian Dollar), + ], + q(0036) => [ + q(Cayman Islands Dollar), + ], + q(0037) => [ + q(Chilean Peso), + ], + q(0038) => [ + q(Unidad de Fomento), + ], + q(0039) => [ + q(Yuan Renminbi), + ], + q(0040) => [ + q(Colombian Peso), + ], + q(0041) => [ + q(Unidad de Valor Real), + ], + q(0042) => [ + q(Comorian Franc), + ], + q(0043) => [ + q(Congolese Franc), + ], + q(0044) => [ + q(New Zealand Dollar), + ], + q(0045) => [ + q(Costa Rican Colon), + ], + q(0046) => [ + q(Kuna), + ], + q(0047) => [ + q(Cuban Peso), + ], + q(0048) => [ + q(Peso Convertible), + ], + q(0049) => [ + q(Netherlands Antillean Guilder), + ], + q(0050) => [ + q(Czech Koruna), + ], + q(0051) => [ + q(Danish Krone), + ], + q(0052) => [ + q(Djibouti Franc), + ], + q(0053) => [ + q(Dominican Peso), + ], + q(0054) => [ + q(Egyptian Pound), + ], + q(0055) => [ + q(El Salvador Colon), + ], + q(0056) => [ + q(Nakfa), + ], + q(0057) => [ + q(Ethiopian Birr), + ], + q(0058) => [ + q(Falkland Islands Pound), + ], + q(0059) => [ + q(Fiji Dollar), + ], + q(0060) => [ + q(CFP Franc), + ], + q(0061) => [ + q(Dalasi), + ], + q(0062) => [ + q(Lari), + ], + q(0063) => [ + q(Ghana Cedi), + ], + q(0064) => [ + q(Gibraltar Pound), + ], + q(0065) => [ + q(Quetzal), + ], + q(0066) => [ + q(Pound Sterling), + ], + q(0067) => [ + q(Guinean Franc), + ], + q(0068) => [ + q(Guyana Dollar), + ], + q(0069) => [ + q(Gourde), + ], + q(0070) => [ + q(Lempira), + ], + q(0071) => [ + q(Hong Kong Dollar), + ], + q(0072) => [ + q(Forint), + ], + q(0073) => [ + q(Iceland Krona), + ], + q(0074) => [ + q(Rupiah), + ], + q(0075) => [ + q(SDR (Special Drawing Right)), + ], + q(0076) => [ + q(Iranian Rial), + ], + q(0077) => [ + q(Iraqi Dinar), + ], + q(0078) => [ + q(New Israeli Sheqel), + ], + q(0079) => [ + q(Jamaican Dollar), + ], + q(0080) => [ + q(Yen), + ], + q(0081) => [ + q(Jordanian Dinar), + ], + q(0082) => [ + q(Tenge), + ], + q(0083) => [ + q(Kenyan Shilling), + ], + q(0084) => [ + q(North Korean Won), + ], + q(0085) => [ + q(Won), + ], + q(0086) => [ + q(Kuwaiti Dinar), + ], + q(0087) => [ + q(Som), + ], + q(0088) => [ + q(Lao Kip), + ], + q(0089) => [ + q(Lebanese Pound), + ], + q(0090) => [ + q(Loti), + ], + q(0091) => [ + q(Rand), + ], + q(0092) => [ + q(Liberian Dollar), + ], + q(0093) => [ + q(Libyan Dinar), + ], + q(0094) => [ + q(Swiss Franc), + ], + q(0095) => [ + q(Pataca), + ], + q(0096) => [ + q(Denar), + ], + q(0097) => [ + q(Malagasy Ariary), + ], + q(0098) => [ + q(Malawi Kwacha), + ], + q(0099) => [ + q(Malaysian Ringgit), + ], + q(0100) => [ + q(Rufiyaa), + ], + q(0101) => [ + q(Ouguiya), + ], + q(0102) => [ + q(Mauritius Rupee), + ], + q(0103) => [ + q(ADB Unit of Account), + ], + q(0104) => [ + q(Mexican Peso), + ], + q(0105) => [ + q(Mexican Unidad de Inversion (UDI)), + ], + q(0106) => [ + q(Moldovan Leu), + ], + q(0107) => [ + q(Tugrik), + ], + q(0108) => [ + q(Moroccan Dirham), + ], + q(0109) => [ + q(Mozambique Metical), + ], + q(0110) => [ + q(Kyat), + ], + q(0111) => [ + q(Namibia Dollar), + ], + q(0112) => [ + q(Nepalese Rupee), + ], + q(0113) => [ + q(Cordoba Oro), + ], + q(0114) => [ + q(Naira), + ], + q(0115) => [ + q(Rial Omani), + ], + q(0116) => [ + q(Pakistan Rupee), + ], + q(0117) => [ + q(Balboa), + ], + q(0118) => [ + q(Kina), + ], + q(0119) => [ + q(Guarani), + ], + q(0120) => [ + q(Sol), + ], + q(0121) => [ + q(Philippine Piso), + ], + q(0122) => [ + q(Zloty), + ], + q(0123) => [ + q(Qatari Rial), + ], + q(0124) => [ + q(Romanian Leu), + ], + q(0125) => [ + q(Russian Ruble), + ], + q(0126) => [ + q(Rwanda Franc), + ], + q(0127) => [ + q(Saint Helena Pound), + ], + q(0128) => [ + q(Tala), + ], + q(0129) => [ + q(Dobra), + ], + q(0130) => [ + q(Saudi Riyal), + ], + q(0131) => [ + q(Serbian Dinar), + ], + q(0132) => [ + q(Seychelles Rupee), + ], + q(0133) => [ + q(Leone), + ], + q(0134) => [ + q(Singapore Dollar), + ], + q(0135) => [ + q(Sucre), + ], + q(0136) => [ + q(Solomon Islands Dollar), + ], + q(0137) => [ + q(Somali Shilling), + ], + q(0138) => [ + q(South Sudanese Pound), + ], + q(0139) => [ + q(Sri Lanka Rupee), + ], + q(0140) => [ + q(Sudanese Pound), + ], + q(0141) => [ + q(Surinam Dollar), + ], + q(0142) => [ + q(Lilangeni), + ], + q(0143) => [ + q(Swedish Krona), + ], + q(0144) => [ + q(WIR Euro), + ], + q(0145) => [ + q(WIR Franc), + ], + q(0146) => [ + q(Syrian Pound), + ], + q(0147) => [ + q(New Taiwan Dollar), + ], + q(0148) => [ + q(Somoni), + ], + q(0149) => [ + q(Tanzanian Shilling), + ], + q(0150) => [ + q(Baht), + ], + q(0151) => [ + q(Pa'anga), + ], + q(0152) => [ + q(Trinidad and Tobago Dollar), + ], + q(0153) => [ + q(Tunisian Dinar), + ], + q(0154) => [ + q(Turkish Lira), + ], + q(0155) => [ + q(Turkmenistan New Manat), + ], + q(0156) => [ + q(Uganda Shilling), + ], + q(0157) => [ + q(Hryvnia), + ], + q(0158) => [ + q(UAE Dirham), + ], + q(0159) => [ + q(US Dollar (Next day)), + ], + q(0160) => [ + q(Peso Uruguayo), + ], + q(0161) => [ + q(Uruguay Peso en Unidades Indexadas (URUIURUI)), + ], + q(0162) => [ + q(Uzbekistan Sum), + ], + q(0163) => [ + q(Vatu), + ], + q(0164) => [ + q(Bolivar), + ], + q(0165) => [ + q(Dong), + ], + q(0166) => [ + q(Yemeni Rial), + ], + q(0167) => [ + q(Zambian Kwacha), + ], + q(0168) => [ + q(Zimbabwe Dollar), + ], + q(0169) => [ + q(Bond Markets Unit European Composite Unit (EURCO)), + ], + q(0170) => [ + q(Bond Markets Unit European Monetary Unit (E.M.U.-6)), + ], + q(0171) => [ + q(Bond Markets Unit European Unit of Account 9 (E.U.A.-9)), + ], + q(0172) => [ + q(Bond Markets Unit European Unit of Account 17 (E.U.A.-17)), + ], + q(0173) => [ + q(Gold), + ], + q(0174) => [ + q(Palladium), + ], + q(0175) => [ + q(Platinum), + ], + q(0176) => [ + q(Silver), + ], +}; + +$Locale::Codes::Data{'currency'}{'alias2id'} = { + q(adb unit of account) => [ + q(0103), + q(0), + ], + q(afghani) => [ + q(0001), + q(0), + ], + q(algerian dinar) => [ + q(0004), + q(0), + ], + q(argentine peso) => [ + q(0008), + q(0), + ], + q(armenian dram) => [ + q(0009), + q(0), + ], + q(aruban florin) => [ + q(0010), + q(0), + ], + q(australian dollar) => [ + q(0011), + q(0), + ], + q(azerbaijan manat) => [ + q(0012), + q(0), + ], + q(bahamian dollar) => [ + q(0013), + q(0), + ], + q(bahraini dinar) => [ + q(0014), + q(0), + ], + q(baht) => [ + q(0150), + q(0), + ], + q(balboa) => [ + q(0117), + q(0), + ], + q(barbados dollar) => [ + q(0016), + q(0), + ], + q(belarusian ruble) => [ + q(0017), + q(0), + ], + q(belize dollar) => [ + q(0018), + q(0), + ], + q(bermudian dollar) => [ + q(0020), + q(0), + ], + q(bolivar) => [ + q(0164), + q(0), + ], + q(boliviano) => [ + q(0023), + q(0), + ], + q(bond markets unit european composite unit (eurco)) => [ + q(0169), + q(0), + ], + q(bond markets unit european monetary unit (e.m.u.-6)) => [ + q(0170), + q(0), + ], + q(bond markets unit european unit of account 17 (e.u.a.-17)) => [ + q(0172), + q(0), + ], + q(bond markets unit european unit of account 9 (e.u.a.-9)) => [ + q(0171), + q(0), + ], + q(brazilian real) => [ + q(0028), + q(0), + ], + q(brunei dollar) => [ + q(0029), + q(0), + ], + q(bulgarian lev) => [ + q(0030), + q(0), + ], + q(burundi franc) => [ + q(0031), + q(0), + ], + q(cabo verde escudo) => [ + q(0032), + q(0), + ], + q(canadian dollar) => [ + q(0035), + q(0), + ], + q(cayman islands dollar) => [ + q(0036), + q(0), + ], + q(cfa franc bceao) => [ + q(0019), + q(0), + ], + q(cfa franc beac) => [ + q(0034), + q(0), + ], + q(cfp franc) => [ + q(0060), + q(0), + ], + q(chilean peso) => [ + q(0037), + q(0), + ], + q(colombian peso) => [ + q(0040), + q(0), + ], + q(comorian franc) => [ + q(0042), + q(0), + ], + q(congolese franc) => [ + q(0043), + q(0), + ], + q(convertible mark) => [ + q(0025), + q(0), + ], + q(cordoba oro) => [ + q(0113), + q(0), + ], + q(costa rican colon) => [ + q(0045), + q(0), + ], + q(cuban peso) => [ + q(0047), + q(0), + ], + q(czech koruna) => [ + q(0050), + q(0), + ], + q(dalasi) => [ + q(0061), + q(0), + ], + q(danish krone) => [ + q(0051), + q(0), + ], + q(denar) => [ + q(0096), + q(0), + ], + q(djibouti franc) => [ + q(0052), + q(0), + ], + q(dobra) => [ + q(0129), + q(0), + ], + q(dominican peso) => [ + q(0053), + q(0), + ], + q(dong) => [ + q(0165), + q(0), + ], + q(east caribbean dollar) => [ + q(0007), + q(0), + ], + q(egyptian pound) => [ + q(0054), + q(0), + ], + q(el salvador colon) => [ + q(0055), + q(0), + ], + q(ethiopian birr) => [ + q(0057), + q(0), + ], + q(euro) => [ + q(0002), + q(0), + ], + q(falkland islands pound) => [ + q(0058), + q(0), + ], + q(fiji dollar) => [ + q(0059), + q(0), + ], + q(forint) => [ + q(0072), + q(0), + ], + q(ghana cedi) => [ + q(0063), + q(0), + ], + q(gibraltar pound) => [ + q(0064), + q(0), + ], + q(gold) => [ + q(0173), + q(0), + ], + q(gourde) => [ + q(0069), + q(0), + ], + q(guarani) => [ + q(0119), + q(0), + ], + q(guinean franc) => [ + q(0067), + q(0), + ], + q(guyana dollar) => [ + q(0068), + q(0), + ], + q(hong kong dollar) => [ + q(0071), + q(0), + ], + q(hryvnia) => [ + q(0157), + q(0), + ], + q(iceland krona) => [ + q(0073), + q(0), + ], + q(indian rupee) => [ + q(0021), + q(0), + ], + q(iranian rial) => [ + q(0076), + q(0), + ], + q(iraqi dinar) => [ + q(0077), + q(0), + ], + q(jamaican dollar) => [ + q(0079), + q(0), + ], + q(jordanian dinar) => [ + q(0081), + q(0), + ], + q(kenyan shilling) => [ + q(0083), + q(0), + ], + q(kina) => [ + q(0118), + q(0), + ], + q(kuna) => [ + q(0046), + q(0), + ], + q(kuwaiti dinar) => [ + q(0086), + q(0), + ], + q(kwanza) => [ + q(0006), + q(0), + ], + q(kyat) => [ + q(0110), + q(0), + ], + q(lao kip) => [ + q(0088), + q(0), + ], + q(lari) => [ + q(0062), + q(0), + ], + q(lebanese pound) => [ + q(0089), + q(0), + ], + q(lek) => [ + q(0003), + q(0), + ], + q(lempira) => [ + q(0070), + q(0), + ], + q(leone) => [ + q(0133), + q(0), + ], + q(liberian dollar) => [ + q(0092), + q(0), + ], + q(libyan dinar) => [ + q(0093), + q(0), + ], + q(lilangeni) => [ + q(0142), + q(0), + ], + q(loti) => [ + q(0090), + q(0), + ], + q(malagasy ariary) => [ + q(0097), + q(0), + ], + q(malawi kwacha) => [ + q(0098), + q(0), + ], + q(malaysian ringgit) => [ + q(0099), + q(0), + ], + q(mauritius rupee) => [ + q(0102), + q(0), + ], + q(mexican peso) => [ + q(0104), + q(0), + ], + q(mexican unidad de inversion (udi)) => [ + q(0105), + q(0), + ], + q(moldovan leu) => [ + q(0106), + q(0), + ], + q(moroccan dirham) => [ + q(0108), + q(0), + ], + q(mozambique metical) => [ + q(0109), + q(0), + ], + q(mvdol) => [ + q(0024), + q(0), + ], + q(naira) => [ + q(0114), + q(0), + ], + q(nakfa) => [ + q(0056), + q(0), + ], + q(namibia dollar) => [ + q(0111), + q(0), + ], + q(nepalese rupee) => [ + q(0112), + q(0), + ], + q(netherlands antillean guilder) => [ + q(0049), + q(0), + ], + q(new israeli sheqel) => [ + q(0078), + q(0), + ], + q(new taiwan dollar) => [ + q(0147), + q(0), + ], + q(new zealand dollar) => [ + q(0044), + q(0), + ], + q(ngultrum) => [ + q(0022), + q(0), + ], + q(north korean won) => [ + q(0084), + q(0), + ], + q(norwegian krone) => [ + q(0027), + q(0), + ], + q(ouguiya) => [ + q(0101), + q(0), + ], + q(pa'anga) => [ + q(0151), + q(0), + ], + q(pakistan rupee) => [ + q(0116), + q(0), + ], + q(palladium) => [ + q(0174), + q(0), + ], + q(pataca) => [ + q(0095), + q(0), + ], + q(peso convertible) => [ + q(0048), + q(0), + ], + q(peso uruguayo) => [ + q(0160), + q(0), + ], + q(philippine piso) => [ + q(0121), + q(0), + ], + q(platinum) => [ + q(0175), + q(0), + ], + q(pound sterling) => [ + q(0066), + q(0), + ], + q(pula) => [ + q(0026), + q(0), + ], + q(qatari rial) => [ + q(0123), + q(0), + ], + q(quetzal) => [ + q(0065), + q(0), + ], + q(rand) => [ + q(0091), + q(0), + ], + q(rial omani) => [ + q(0115), + q(0), + ], + q(riel) => [ + q(0033), + q(0), + ], + q(romanian leu) => [ + q(0124), + q(0), + ], + q(rufiyaa) => [ + q(0100), + q(0), + ], + q(rupiah) => [ + q(0074), + q(0), + ], + q(russian ruble) => [ + q(0125), + q(0), + ], + q(rwanda franc) => [ + q(0126), + q(0), + ], + q(saint helena pound) => [ + q(0127), + q(0), + ], + q(saudi riyal) => [ + q(0130), + q(0), + ], + q(sdr (special drawing right)) => [ + q(0075), + q(0), + ], + q(serbian dinar) => [ + q(0131), + q(0), + ], + q(seychelles rupee) => [ + q(0132), + q(0), + ], + q(silver) => [ + q(0176), + q(0), + ], + q(singapore dollar) => [ + q(0134), + q(0), + ], + q(sol) => [ + q(0120), + q(0), + ], + q(solomon islands dollar) => [ + q(0136), + q(0), + ], + q(som) => [ + q(0087), + q(0), + ], + q(somali shilling) => [ + q(0137), + q(0), + ], + q(somoni) => [ + q(0148), + q(0), + ], + q(south sudanese pound) => [ + q(0138), + q(0), + ], + q(sri lanka rupee) => [ + q(0139), + q(0), + ], + q(sucre) => [ + q(0135), + q(0), + ], + q(sudanese pound) => [ + q(0140), + q(0), + ], + q(surinam dollar) => [ + q(0141), + q(0), + ], + q(swedish krona) => [ + q(0143), + q(0), + ], + q(swiss franc) => [ + q(0094), + q(0), + ], + q(syrian pound) => [ + q(0146), + q(0), + ], + q(taka) => [ + q(0015), + q(0), + ], + q(tala) => [ + q(0128), + q(0), + ], + q(tanzanian shilling) => [ + q(0149), + q(0), + ], + q(tenge) => [ + q(0082), + q(0), + ], + q(trinidad and tobago dollar) => [ + q(0152), + q(0), + ], + q(tugrik) => [ + q(0107), + q(0), + ], + q(tunisian dinar) => [ + q(0153), + q(0), + ], + q(turkish lira) => [ + q(0154), + q(0), + ], + q(turkmenistan new manat) => [ + q(0155), + q(0), + ], + q(uae dirham) => [ + q(0158), + q(0), + ], + q(uganda shilling) => [ + q(0156), + q(0), + ], + q(unidad de fomento) => [ + q(0038), + q(0), + ], + q(unidad de valor real) => [ + q(0041), + q(0), + ], + q(uruguay peso en unidades indexadas (uruiurui)) => [ + q(0161), + q(0), + ], + q(us dollar) => [ + q(0005), + q(0), + ], + q(us dollar (next day)) => [ + q(0159), + q(0), + ], + q(uzbekistan sum) => [ + q(0162), + q(0), + ], + q(vatu) => [ + q(0163), + q(0), + ], + q(wir euro) => [ + q(0144), + q(0), + ], + q(wir franc) => [ + q(0145), + q(0), + ], + q(won) => [ + q(0085), + q(0), + ], + q(yemeni rial) => [ + q(0166), + q(0), + ], + q(yen) => [ + q(0080), + q(0), + ], + q(yuan renminbi) => [ + q(0039), + q(0), + ], + q(zambian kwacha) => [ + q(0167), + q(0), + ], + q(zimbabwe dollar) => [ + q(0168), + q(0), + ], + q(zloty) => [ + q(0122), + q(0), + ], +}; + +$Locale::Codes::Data{'currency'}{'code2id'} = { + q(alpha) => { + q(AED) => [ + q(0158), + q(0), + ], + q(AFN) => [ + q(0001), + q(0), + ], + q(ALL) => [ + q(0003), + q(0), + ], + q(AMD) => [ + q(0009), + q(0), + ], + q(ANG) => [ + q(0049), + q(0), + ], + q(AOA) => [ + q(0006), + q(0), + ], + q(ARS) => [ + q(0008), + q(0), + ], + q(AUD) => [ + q(0011), + q(0), + ], + q(AWG) => [ + q(0010), + q(0), + ], + q(AZN) => [ + q(0012), + q(0), + ], + q(BAM) => [ + q(0025), + q(0), + ], + q(BBD) => [ + q(0016), + q(0), + ], + q(BDT) => [ + q(0015), + q(0), + ], + q(BGN) => [ + q(0030), + q(0), + ], + q(BHD) => [ + q(0014), + q(0), + ], + q(BIF) => [ + q(0031), + q(0), + ], + q(BMD) => [ + q(0020), + q(0), + ], + q(BND) => [ + q(0029), + q(0), + ], + q(BOB) => [ + q(0023), + q(0), + ], + q(BOV) => [ + q(0024), + q(0), + ], + q(BRL) => [ + q(0028), + q(0), + ], + q(BSD) => [ + q(0013), + q(0), + ], + q(BTN) => [ + q(0022), + q(0), + ], + q(BWP) => [ + q(0026), + q(0), + ], + q(BYN) => [ + q(0017), + q(0), + ], + q(BZD) => [ + q(0018), + q(0), + ], + q(CAD) => [ + q(0035), + q(0), + ], + q(CDF) => [ + q(0043), + q(0), + ], + q(CHE) => [ + q(0144), + q(0), + ], + q(CHF) => [ + q(0094), + q(0), + ], + q(CHW) => [ + q(0145), + q(0), + ], + q(CLF) => [ + q(0038), + q(0), + ], + q(CLP) => [ + q(0037), + q(0), + ], + q(CNY) => [ + q(0039), + q(0), + ], + q(COP) => [ + q(0040), + q(0), + ], + q(COU) => [ + q(0041), + q(0), + ], + q(CRC) => [ + q(0045), + q(0), + ], + q(CUC) => [ + q(0048), + q(0), + ], + q(CUP) => [ + q(0047), + q(0), + ], + q(CVE) => [ + q(0032), + q(0), + ], + q(CZK) => [ + q(0050), + q(0), + ], + q(DJF) => [ + q(0052), + q(0), + ], + q(DKK) => [ + q(0051), + q(0), + ], + q(DOP) => [ + q(0053), + q(0), + ], + q(DZD) => [ + q(0004), + q(0), + ], + q(EGP) => [ + q(0054), + q(0), + ], + q(ERN) => [ + q(0056), + q(0), + ], + q(ETB) => [ + q(0057), + q(0), + ], + q(EUR) => [ + q(0002), + q(0), + ], + q(FJD) => [ + q(0059), + q(0), + ], + q(FKP) => [ + q(0058), + q(0), + ], + q(GBP) => [ + q(0066), + q(0), + ], + q(GEL) => [ + q(0062), + q(0), + ], + q(GHS) => [ + q(0063), + q(0), + ], + q(GIP) => [ + q(0064), + q(0), + ], + q(GMD) => [ + q(0061), + q(0), + ], + q(GNF) => [ + q(0067), + q(0), + ], + q(GTQ) => [ + q(0065), + q(0), + ], + q(GYD) => [ + q(0068), + q(0), + ], + q(HKD) => [ + q(0071), + q(0), + ], + q(HNL) => [ + q(0070), + q(0), + ], + q(HRK) => [ + q(0046), + q(0), + ], + q(HTG) => [ + q(0069), + q(0), + ], + q(HUF) => [ + q(0072), + q(0), + ], + q(IDR) => [ + q(0074), + q(0), + ], + q(ILS) => [ + q(0078), + q(0), + ], + q(INR) => [ + q(0021), + q(0), + ], + q(IQD) => [ + q(0077), + q(0), + ], + q(IRR) => [ + q(0076), + q(0), + ], + q(ISK) => [ + q(0073), + q(0), + ], + q(JMD) => [ + q(0079), + q(0), + ], + q(JOD) => [ + q(0081), + q(0), + ], + q(JPY) => [ + q(0080), + q(0), + ], + q(KES) => [ + q(0083), + q(0), + ], + q(KGS) => [ + q(0087), + q(0), + ], + q(KHR) => [ + q(0033), + q(0), + ], + q(KMF) => [ + q(0042), + q(0), + ], + q(KPW) => [ + q(0084), + q(0), + ], + q(KRW) => [ + q(0085), + q(0), + ], + q(KWD) => [ + q(0086), + q(0), + ], + q(KYD) => [ + q(0036), + q(0), + ], + q(KZT) => [ + q(0082), + q(0), + ], + q(LAK) => [ + q(0088), + q(0), + ], + q(LBP) => [ + q(0089), + q(0), + ], + q(LKR) => [ + q(0139), + q(0), + ], + q(LRD) => [ + q(0092), + q(0), + ], + q(LSL) => [ + q(0090), + q(0), + ], + q(LYD) => [ + q(0093), + q(0), + ], + q(MAD) => [ + q(0108), + q(0), + ], + q(MDL) => [ + q(0106), + q(0), + ], + q(MGA) => [ + q(0097), + q(0), + ], + q(MKD) => [ + q(0096), + q(0), + ], + q(MMK) => [ + q(0110), + q(0), + ], + q(MNT) => [ + q(0107), + q(0), + ], + q(MOP) => [ + q(0095), + q(0), + ], + q(MRU) => [ + q(0101), + q(0), + ], + q(MUR) => [ + q(0102), + q(0), + ], + q(MVR) => [ + q(0100), + q(0), + ], + q(MWK) => [ + q(0098), + q(0), + ], + q(MXN) => [ + q(0104), + q(0), + ], + q(MXV) => [ + q(0105), + q(0), + ], + q(MYR) => [ + q(0099), + q(0), + ], + q(MZN) => [ + q(0109), + q(0), + ], + q(NAD) => [ + q(0111), + q(0), + ], + q(NGN) => [ + q(0114), + q(0), + ], + q(NIO) => [ + q(0113), + q(0), + ], + q(NOK) => [ + q(0027), + q(0), + ], + q(NPR) => [ + q(0112), + q(0), + ], + q(NZD) => [ + q(0044), + q(0), + ], + q(OMR) => [ + q(0115), + q(0), + ], + q(PAB) => [ + q(0117), + q(0), + ], + q(PEN) => [ + q(0120), + q(0), + ], + q(PGK) => [ + q(0118), + q(0), + ], + q(PHP) => [ + q(0121), + q(0), + ], + q(PKR) => [ + q(0116), + q(0), + ], + q(PLN) => [ + q(0122), + q(0), + ], + q(PYG) => [ + q(0119), + q(0), + ], + q(QAR) => [ + q(0123), + q(0), + ], + q(RON) => [ + q(0124), + q(0), + ], + q(RSD) => [ + q(0131), + q(0), + ], + q(RUB) => [ + q(0125), + q(0), + ], + q(RWF) => [ + q(0126), + q(0), + ], + q(SAR) => [ + q(0130), + q(0), + ], + q(SBD) => [ + q(0136), + q(0), + ], + q(SCR) => [ + q(0132), + q(0), + ], + q(SDG) => [ + q(0140), + q(0), + ], + q(SEK) => [ + q(0143), + q(0), + ], + q(SGD) => [ + q(0134), + q(0), + ], + q(SHP) => [ + q(0127), + q(0), + ], + q(SLL) => [ + q(0133), + q(0), + ], + q(SOS) => [ + q(0137), + q(0), + ], + q(SRD) => [ + q(0141), + q(0), + ], + q(SSP) => [ + q(0138), + q(0), + ], + q(STN) => [ + q(0129), + q(0), + ], + q(SVC) => [ + q(0055), + q(0), + ], + q(SYP) => [ + q(0146), + q(0), + ], + q(SZL) => [ + q(0142), + q(0), + ], + q(THB) => [ + q(0150), + q(0), + ], + q(TJS) => [ + q(0148), + q(0), + ], + q(TMT) => [ + q(0155), + q(0), + ], + q(TND) => [ + q(0153), + q(0), + ], + q(TOP) => [ + q(0151), + q(0), + ], + q(TRY) => [ + q(0154), + q(0), + ], + q(TTD) => [ + q(0152), + q(0), + ], + q(TWD) => [ + q(0147), + q(0), + ], + q(TZS) => [ + q(0149), + q(0), + ], + q(UAH) => [ + q(0157), + q(0), + ], + q(UGX) => [ + q(0156), + q(0), + ], + q(USD) => [ + q(0005), + q(0), + ], + q(USN) => [ + q(0159), + q(0), + ], + q(UYI) => [ + q(0161), + q(0), + ], + q(UYU) => [ + q(0160), + q(0), + ], + q(UZS) => [ + q(0162), + q(0), + ], + q(VEF) => [ + q(0164), + q(0), + ], + q(VND) => [ + q(0165), + q(0), + ], + q(VUV) => [ + q(0163), + q(0), + ], + q(WST) => [ + q(0128), + q(0), + ], + q(XAF) => [ + q(0034), + q(0), + ], + q(XAG) => [ + q(0176), + q(0), + ], + q(XAU) => [ + q(0173), + q(0), + ], + q(XBA) => [ + q(0169), + q(0), + ], + q(XBB) => [ + q(0170), + q(0), + ], + q(XBC) => [ + q(0171), + q(0), + ], + q(XBD) => [ + q(0172), + q(0), + ], + q(XCD) => [ + q(0007), + q(0), + ], + q(XDR) => [ + q(0075), + q(0), + ], + q(XOF) => [ + q(0019), + q(0), + ], + q(XPD) => [ + q(0174), + q(0), + ], + q(XPF) => [ + q(0060), + q(0), + ], + q(XPT) => [ + q(0175), + q(0), + ], + q(XSU) => [ + q(0135), + q(0), + ], + q(XUA) => [ + q(0103), + q(0), + ], + q(YER) => [ + q(0166), + q(0), + ], + q(ZAR) => [ + q(0091), + q(0), + ], + q(ZMW) => [ + q(0167), + q(0), + ], + q(ZWL) => [ + q(0168), + q(0), + ], + }, + q(num) => { + q(008) => [ + q(0003), + q(0), + ], + q(012) => [ + q(0004), + q(0), + ], + q(032) => [ + q(0008), + q(0), + ], + q(036) => [ + q(0011), + q(0), + ], + q(044) => [ + q(0013), + q(0), + ], + q(048) => [ + q(0014), + q(0), + ], + q(050) => [ + q(0015), + q(0), + ], + q(051) => [ + q(0009), + q(0), + ], + q(052) => [ + q(0016), + q(0), + ], + q(060) => [ + q(0020), + q(0), + ], + q(064) => [ + q(0022), + q(0), + ], + q(068) => [ + q(0023), + q(0), + ], + q(072) => [ + q(0026), + q(0), + ], + q(084) => [ + q(0018), + q(0), + ], + q(090) => [ + q(0136), + q(0), + ], + q(096) => [ + q(0029), + q(0), + ], + q(104) => [ + q(0110), + q(0), + ], + q(108) => [ + q(0031), + q(0), + ], + q(116) => [ + q(0033), + q(0), + ], + q(124) => [ + q(0035), + q(0), + ], + q(132) => [ + q(0032), + q(0), + ], + q(136) => [ + q(0036), + q(0), + ], + q(144) => [ + q(0139), + q(0), + ], + q(152) => [ + q(0037), + q(0), + ], + q(156) => [ + q(0039), + q(0), + ], + q(170) => [ + q(0040), + q(0), + ], + q(174) => [ + q(0042), + q(0), + ], + q(188) => [ + q(0045), + q(0), + ], + q(191) => [ + q(0046), + q(0), + ], + q(192) => [ + q(0047), + q(0), + ], + q(203) => [ + q(0050), + q(0), + ], + q(208) => [ + q(0051), + q(0), + ], + q(214) => [ + q(0053), + q(0), + ], + q(222) => [ + q(0055), + q(0), + ], + q(230) => [ + q(0057), + q(0), + ], + q(232) => [ + q(0056), + q(0), + ], + q(238) => [ + q(0058), + q(0), + ], + q(242) => [ + q(0059), + q(0), + ], + q(262) => [ + q(0052), + q(0), + ], + q(270) => [ + q(0061), + q(0), + ], + q(292) => [ + q(0064), + q(0), + ], + q(320) => [ + q(0065), + q(0), + ], + q(324) => [ + q(0067), + q(0), + ], + q(328) => [ + q(0068), + q(0), + ], + q(332) => [ + q(0069), + q(0), + ], + q(340) => [ + q(0070), + q(0), + ], + q(344) => [ + q(0071), + q(0), + ], + q(348) => [ + q(0072), + q(0), + ], + q(352) => [ + q(0073), + q(0), + ], + q(356) => [ + q(0021), + q(0), + ], + q(360) => [ + q(0074), + q(0), + ], + q(364) => [ + q(0076), + q(0), + ], + q(368) => [ + q(0077), + q(0), + ], + q(376) => [ + q(0078), + q(0), + ], + q(388) => [ + q(0079), + q(0), + ], + q(392) => [ + q(0080), + q(0), + ], + q(398) => [ + q(0082), + q(0), + ], + q(400) => [ + q(0081), + q(0), + ], + q(404) => [ + q(0083), + q(0), + ], + q(408) => [ + q(0084), + q(0), + ], + q(410) => [ + q(0085), + q(0), + ], + q(414) => [ + q(0086), + q(0), + ], + q(417) => [ + q(0087), + q(0), + ], + q(418) => [ + q(0088), + q(0), + ], + q(422) => [ + q(0089), + q(0), + ], + q(426) => [ + q(0090), + q(0), + ], + q(430) => [ + q(0092), + q(0), + ], + q(434) => [ + q(0093), + q(0), + ], + q(446) => [ + q(0095), + q(0), + ], + q(454) => [ + q(0098), + q(0), + ], + q(458) => [ + q(0099), + q(0), + ], + q(462) => [ + q(0100), + q(0), + ], + q(480) => [ + q(0102), + q(0), + ], + q(484) => [ + q(0104), + q(0), + ], + q(496) => [ + q(0107), + q(0), + ], + q(498) => [ + q(0106), + q(0), + ], + q(504) => [ + q(0108), + q(0), + ], + q(512) => [ + q(0115), + q(0), + ], + q(516) => [ + q(0111), + q(0), + ], + q(524) => [ + q(0112), + q(0), + ], + q(532) => [ + q(0049), + q(0), + ], + q(533) => [ + q(0010), + q(0), + ], + q(548) => [ + q(0163), + q(0), + ], + q(554) => [ + q(0044), + q(0), + ], + q(558) => [ + q(0113), + q(0), + ], + q(566) => [ + q(0114), + q(0), + ], + q(578) => [ + q(0027), + q(0), + ], + q(586) => [ + q(0116), + q(0), + ], + q(590) => [ + q(0117), + q(0), + ], + q(598) => [ + q(0118), + q(0), + ], + q(600) => [ + q(0119), + q(0), + ], + q(604) => [ + q(0120), + q(0), + ], + q(608) => [ + q(0121), + q(0), + ], + q(634) => [ + q(0123), + q(0), + ], + q(643) => [ + q(0125), + q(0), + ], + q(646) => [ + q(0126), + q(0), + ], + q(654) => [ + q(0127), + q(0), + ], + q(682) => [ + q(0130), + q(0), + ], + q(690) => [ + q(0132), + q(0), + ], + q(694) => [ + q(0133), + q(0), + ], + q(702) => [ + q(0134), + q(0), + ], + q(704) => [ + q(0165), + q(0), + ], + q(706) => [ + q(0137), + q(0), + ], + q(710) => [ + q(0091), + q(0), + ], + q(728) => [ + q(0138), + q(0), + ], + q(748) => [ + q(0142), + q(0), + ], + q(752) => [ + q(0143), + q(0), + ], + q(756) => [ + q(0094), + q(0), + ], + q(760) => [ + q(0146), + q(0), + ], + q(764) => [ + q(0150), + q(0), + ], + q(776) => [ + q(0151), + q(0), + ], + q(780) => [ + q(0152), + q(0), + ], + q(784) => [ + q(0158), + q(0), + ], + q(788) => [ + q(0153), + q(0), + ], + q(800) => [ + q(0156), + q(0), + ], + q(807) => [ + q(0096), + q(0), + ], + q(818) => [ + q(0054), + q(0), + ], + q(826) => [ + q(0066), + q(0), + ], + q(834) => [ + q(0149), + q(0), + ], + q(840) => [ + q(0005), + q(0), + ], + q(858) => [ + q(0160), + q(0), + ], + q(860) => [ + q(0162), + q(0), + ], + q(882) => [ + q(0128), + q(0), + ], + q(886) => [ + q(0166), + q(0), + ], + q(901) => [ + q(0147), + q(0), + ], + q(929) => [ + q(0101), + q(0), + ], + q(930) => [ + q(0129), + q(0), + ], + q(931) => [ + q(0048), + q(0), + ], + q(932) => [ + q(0168), + q(0), + ], + q(933) => [ + q(0017), + q(0), + ], + q(934) => [ + q(0155), + q(0), + ], + q(936) => [ + q(0063), + q(0), + ], + q(937) => [ + q(0164), + q(0), + ], + q(938) => [ + q(0140), + q(0), + ], + q(940) => [ + q(0161), + q(0), + ], + q(941) => [ + q(0131), + q(0), + ], + q(943) => [ + q(0109), + q(0), + ], + q(944) => [ + q(0012), + q(0), + ], + q(946) => [ + q(0124), + q(0), + ], + q(947) => [ + q(0144), + q(0), + ], + q(948) => [ + q(0145), + q(0), + ], + q(949) => [ + q(0154), + q(0), + ], + q(950) => [ + q(0034), + q(0), + ], + q(951) => [ + q(0007), + q(0), + ], + q(952) => [ + q(0019), + q(0), + ], + q(953) => [ + q(0060), + q(0), + ], + q(955) => [ + q(0169), + q(0), + ], + q(956) => [ + q(0170), + q(0), + ], + q(957) => [ + q(0171), + q(0), + ], + q(958) => [ + q(0172), + q(0), + ], + q(959) => [ + q(0173), + q(0), + ], + q(960) => [ + q(0075), + q(0), + ], + q(961) => [ + q(0176), + q(0), + ], + q(962) => [ + q(0175), + q(0), + ], + q(964) => [ + q(0174), + q(0), + ], + q(965) => [ + q(0103), + q(0), + ], + q(967) => [ + q(0167), + q(0), + ], + q(968) => [ + q(0141), + q(0), + ], + q(969) => [ + q(0097), + q(0), + ], + q(970) => [ + q(0041), + q(0), + ], + q(971) => [ + q(0001), + q(0), + ], + q(972) => [ + q(0148), + q(0), + ], + q(973) => [ + q(0006), + q(0), + ], + q(975) => [ + q(0030), + q(0), + ], + q(976) => [ + q(0043), + q(0), + ], + q(977) => [ + q(0025), + q(0), + ], + q(978) => [ + q(0002), + q(0), + ], + q(979) => [ + q(0105), + q(0), + ], + q(980) => [ + q(0157), + q(0), + ], + q(981) => [ + q(0062), + q(0), + ], + q(984) => [ + q(0024), + q(0), + ], + q(985) => [ + q(0122), + q(0), + ], + q(986) => [ + q(0028), + q(0), + ], + q(990) => [ + q(0038), + q(0), + ], + q(994) => [ + q(0135), + q(0), + ], + q(997) => [ + q(0159), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'currency'}{'id2code'} = { + q(alpha) => { + q(0001) => q(AFN), + q(0002) => q(EUR), + q(0003) => q(ALL), + q(0004) => q(DZD), + q(0005) => q(USD), + q(0006) => q(AOA), + q(0007) => q(XCD), + q(0008) => q(ARS), + q(0009) => q(AMD), + q(0010) => q(AWG), + q(0011) => q(AUD), + q(0012) => q(AZN), + q(0013) => q(BSD), + q(0014) => q(BHD), + q(0015) => q(BDT), + q(0016) => q(BBD), + q(0017) => q(BYN), + q(0018) => q(BZD), + q(0019) => q(XOF), + q(0020) => q(BMD), + q(0021) => q(INR), + q(0022) => q(BTN), + q(0023) => q(BOB), + q(0024) => q(BOV), + q(0025) => q(BAM), + q(0026) => q(BWP), + q(0027) => q(NOK), + q(0028) => q(BRL), + q(0029) => q(BND), + q(0030) => q(BGN), + q(0031) => q(BIF), + q(0032) => q(CVE), + q(0033) => q(KHR), + q(0034) => q(XAF), + q(0035) => q(CAD), + q(0036) => q(KYD), + q(0037) => q(CLP), + q(0038) => q(CLF), + q(0039) => q(CNY), + q(0040) => q(COP), + q(0041) => q(COU), + q(0042) => q(KMF), + q(0043) => q(CDF), + q(0044) => q(NZD), + q(0045) => q(CRC), + q(0046) => q(HRK), + q(0047) => q(CUP), + q(0048) => q(CUC), + q(0049) => q(ANG), + q(0050) => q(CZK), + q(0051) => q(DKK), + q(0052) => q(DJF), + q(0053) => q(DOP), + q(0054) => q(EGP), + q(0055) => q(SVC), + q(0056) => q(ERN), + q(0057) => q(ETB), + q(0058) => q(FKP), + q(0059) => q(FJD), + q(0060) => q(XPF), + q(0061) => q(GMD), + q(0062) => q(GEL), + q(0063) => q(GHS), + q(0064) => q(GIP), + q(0065) => q(GTQ), + q(0066) => q(GBP), + q(0067) => q(GNF), + q(0068) => q(GYD), + q(0069) => q(HTG), + q(0070) => q(HNL), + q(0071) => q(HKD), + q(0072) => q(HUF), + q(0073) => q(ISK), + q(0074) => q(IDR), + q(0075) => q(XDR), + q(0076) => q(IRR), + q(0077) => q(IQD), + q(0078) => q(ILS), + q(0079) => q(JMD), + q(0080) => q(JPY), + q(0081) => q(JOD), + q(0082) => q(KZT), + q(0083) => q(KES), + q(0084) => q(KPW), + q(0085) => q(KRW), + q(0086) => q(KWD), + q(0087) => q(KGS), + q(0088) => q(LAK), + q(0089) => q(LBP), + q(0090) => q(LSL), + q(0091) => q(ZAR), + q(0092) => q(LRD), + q(0093) => q(LYD), + q(0094) => q(CHF), + q(0095) => q(MOP), + q(0096) => q(MKD), + q(0097) => q(MGA), + q(0098) => q(MWK), + q(0099) => q(MYR), + q(0100) => q(MVR), + q(0101) => q(MRU), + q(0102) => q(MUR), + q(0103) => q(XUA), + q(0104) => q(MXN), + q(0105) => q(MXV), + q(0106) => q(MDL), + q(0107) => q(MNT), + q(0108) => q(MAD), + q(0109) => q(MZN), + q(0110) => q(MMK), + q(0111) => q(NAD), + q(0112) => q(NPR), + q(0113) => q(NIO), + q(0114) => q(NGN), + q(0115) => q(OMR), + q(0116) => q(PKR), + q(0117) => q(PAB), + q(0118) => q(PGK), + q(0119) => q(PYG), + q(0120) => q(PEN), + q(0121) => q(PHP), + q(0122) => q(PLN), + q(0123) => q(QAR), + q(0124) => q(RON), + q(0125) => q(RUB), + q(0126) => q(RWF), + q(0127) => q(SHP), + q(0128) => q(WST), + q(0129) => q(STN), + q(0130) => q(SAR), + q(0131) => q(RSD), + q(0132) => q(SCR), + q(0133) => q(SLL), + q(0134) => q(SGD), + q(0135) => q(XSU), + q(0136) => q(SBD), + q(0137) => q(SOS), + q(0138) => q(SSP), + q(0139) => q(LKR), + q(0140) => q(SDG), + q(0141) => q(SRD), + q(0142) => q(SZL), + q(0143) => q(SEK), + q(0144) => q(CHE), + q(0145) => q(CHW), + q(0146) => q(SYP), + q(0147) => q(TWD), + q(0148) => q(TJS), + q(0149) => q(TZS), + q(0150) => q(THB), + q(0151) => q(TOP), + q(0152) => q(TTD), + q(0153) => q(TND), + q(0154) => q(TRY), + q(0155) => q(TMT), + q(0156) => q(UGX), + q(0157) => q(UAH), + q(0158) => q(AED), + q(0159) => q(USN), + q(0160) => q(UYU), + q(0161) => q(UYI), + q(0162) => q(UZS), + q(0163) => q(VUV), + q(0164) => q(VEF), + q(0165) => q(VND), + q(0166) => q(YER), + q(0167) => q(ZMW), + q(0168) => q(ZWL), + q(0169) => q(XBA), + q(0170) => q(XBB), + q(0171) => q(XBC), + q(0172) => q(XBD), + q(0173) => q(XAU), + q(0174) => q(XPD), + q(0175) => q(XPT), + q(0176) => q(XAG), + }, + q(num) => { + q(0001) => q(971), + q(0002) => q(978), + q(0003) => q(008), + q(0004) => q(012), + q(0005) => q(840), + q(0006) => q(973), + q(0007) => q(951), + q(0008) => q(032), + q(0009) => q(051), + q(0010) => q(533), + q(0011) => q(036), + q(0012) => q(944), + q(0013) => q(044), + q(0014) => q(048), + q(0015) => q(050), + q(0016) => q(052), + q(0017) => q(933), + q(0018) => q(084), + q(0019) => q(952), + q(0020) => q(060), + q(0021) => q(356), + q(0022) => q(064), + q(0023) => q(068), + q(0024) => q(984), + q(0025) => q(977), + q(0026) => q(072), + q(0027) => q(578), + q(0028) => q(986), + q(0029) => q(096), + q(0030) => q(975), + q(0031) => q(108), + q(0032) => q(132), + q(0033) => q(116), + q(0034) => q(950), + q(0035) => q(124), + q(0036) => q(136), + q(0037) => q(152), + q(0038) => q(990), + q(0039) => q(156), + q(0040) => q(170), + q(0041) => q(970), + q(0042) => q(174), + q(0043) => q(976), + q(0044) => q(554), + q(0045) => q(188), + q(0046) => q(191), + q(0047) => q(192), + q(0048) => q(931), + q(0049) => q(532), + q(0050) => q(203), + q(0051) => q(208), + q(0052) => q(262), + q(0053) => q(214), + q(0054) => q(818), + q(0055) => q(222), + q(0056) => q(232), + q(0057) => q(230), + q(0058) => q(238), + q(0059) => q(242), + q(0060) => q(953), + q(0061) => q(270), + q(0062) => q(981), + q(0063) => q(936), + q(0064) => q(292), + q(0065) => q(320), + q(0066) => q(826), + q(0067) => q(324), + q(0068) => q(328), + q(0069) => q(332), + q(0070) => q(340), + q(0071) => q(344), + q(0072) => q(348), + q(0073) => q(352), + q(0074) => q(360), + q(0075) => q(960), + q(0076) => q(364), + q(0077) => q(368), + q(0078) => q(376), + q(0079) => q(388), + q(0080) => q(392), + q(0081) => q(400), + q(0082) => q(398), + q(0083) => q(404), + q(0084) => q(408), + q(0085) => q(410), + q(0086) => q(414), + q(0087) => q(417), + q(0088) => q(418), + q(0089) => q(422), + q(0090) => q(426), + q(0091) => q(710), + q(0092) => q(430), + q(0093) => q(434), + q(0094) => q(756), + q(0095) => q(446), + q(0096) => q(807), + q(0097) => q(969), + q(0098) => q(454), + q(0099) => q(458), + q(0100) => q(462), + q(0101) => q(929), + q(0102) => q(480), + q(0103) => q(965), + q(0104) => q(484), + q(0105) => q(979), + q(0106) => q(498), + q(0107) => q(496), + q(0108) => q(504), + q(0109) => q(943), + q(0110) => q(104), + q(0111) => q(516), + q(0112) => q(524), + q(0113) => q(558), + q(0114) => q(566), + q(0115) => q(512), + q(0116) => q(586), + q(0117) => q(590), + q(0118) => q(598), + q(0119) => q(600), + q(0120) => q(604), + q(0121) => q(608), + q(0122) => q(985), + q(0123) => q(634), + q(0124) => q(946), + q(0125) => q(643), + q(0126) => q(646), + q(0127) => q(654), + q(0128) => q(882), + q(0129) => q(930), + q(0130) => q(682), + q(0131) => q(941), + q(0132) => q(690), + q(0133) => q(694), + q(0134) => q(702), + q(0135) => q(994), + q(0136) => q(090), + q(0137) => q(706), + q(0138) => q(728), + q(0139) => q(144), + q(0140) => q(938), + q(0141) => q(968), + q(0142) => q(748), + q(0143) => q(752), + q(0144) => q(947), + q(0145) => q(948), + q(0146) => q(760), + q(0147) => q(901), + q(0148) => q(972), + q(0149) => q(834), + q(0150) => q(764), + q(0151) => q(776), + q(0152) => q(780), + q(0153) => q(788), + q(0154) => q(949), + q(0155) => q(934), + q(0156) => q(800), + q(0157) => q(980), + q(0158) => q(784), + q(0159) => q(997), + q(0160) => q(858), + q(0161) => q(940), + q(0162) => q(860), + q(0163) => q(548), + q(0164) => q(937), + q(0165) => q(704), + q(0166) => q(886), + q(0167) => q(967), + q(0168) => q(932), + q(0169) => q(955), + q(0170) => q(956), + q(0171) => q(957), + q(0172) => q(958), + q(0173) => q(959), + q(0174) => q(964), + q(0175) => q(962), + q(0176) => q(961), + }, +}; + +1; +package # +Locale::Codes::LangExt_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:55:11 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'langext'}{'id'} = '0233'; + +$Locale::Codes::Data{'langext'}{'id2names'} = { + q(0001) => [ + q(Algerian Saharan Arabic), + ], + q(0002) => [ + q(Tajiki Arabic), + ], + q(0003) => [ + q(Baharna Arabic), + ], + q(0004) => [ + q(Mesopotamian Arabic), + ], + q(0005) => [ + q(Ta'izzi-Adeni Arabic), + ], + q(0006) => [ + q(Hijazi Arabic), + ], + q(0007) => [ + q(Omani Arabic), + ], + q(0008) => [ + q(Cypriot Arabic), + ], + q(0009) => [ + q(Dhofari Arabic), + ], + q(0010) => [ + q(Adamorobe Sign Language), + ], + q(0011) => [ + q(Tunisian Arabic), + ], + q(0012) => [ + q(Saidi Arabic), + ], + q(0013) => [ + q(Argentine Sign Language), + ], + q(0014) => [ + q(Armenian Sign Language), + ], + q(0015) => [ + q(Gulf Arabic), + ], + q(0016) => [ + q(Afghan Sign Language), + ], + q(0017) => [ + q(South Levantine Arabic), + ], + q(0018) => [ + q(North Levantine Arabic), + ], + q(0019) => [ + q(Sudanese Arabic), + ], + q(0020) => [ + q(Standard Arabic), + ], + q(0021) => [ + q(Algerian Arabic), + ], + q(0022) => [ + q(Najdi Arabic), + ], + q(0023) => [ + q(Moroccan Arabic), + ], + q(0024) => [ + q(Egyptian Arabic), + ], + q(0025) => [ + q(American Sign Language), + ], + q(0026) => [ + q(Australian Sign Language), + ], + q(0027) => [ + q(Algerian Sign Language), + ], + q(0028) => [ + q(Austrian Sign Language), + ], + q(0029) => [ + q(Australian Aborigines Sign Language), + ], + q(0030) => [ + q(Uzbeki Arabic), + ], + q(0031) => [ + q(Eastern Egyptian Bedawi Arabic), + ], + q(0032) => [ + q(Hadrami Arabic), + ], + q(0033) => [ + q(Libyan Arabic), + ], + q(0034) => [ + q(Sanaani Arabic), + ], + q(0035) => [ + q(North Mesopotamian Arabic), + ], + q(0036) => [ + q(Babalia Creole Arabic), + ], + q(0037) => [ + q(British Sign Language), + ], + q(0038) => [ + q(Ban Khor Sign Language), + ], + q(0039) => [ + q(Banjar), + ], + q(0040) => [ + q(Bamako Sign Language), + ], + q(0041) => [ + q(Bulgarian Sign Language), + ], + q(0042) => [ + q(Bengkala Sign Language), + ], + q(0043) => [ + q(Bacanese Malay), + ], + q(0044) => [ + q(Berau Malay), + ], + q(0045) => [ + q(Bolivian Sign Language), + ], + q(0046) => [ + q(Bukit Malay), + ], + q(0047) => [ + q(Brazilian Sign Language), + ], + q(0048) => [ + q(Min Dong Chinese), + ], + q(0049) => [ + q(Chadian Sign Language), + ], + q(0050) => [ + q(Jinyu Chinese), + ], + q(0051) => [ + q(Mandarin Chinese), + ], + q(0052) => [ + q(Cocos Islands Malay), + ], + q(0053) => [ + q(Pu-Xian Chinese), + ], + q(0054) => [ + q(Catalan Sign Language), + q(Lengua de senas catalana), + q(Llengua de Signes Catalana), + ], + q(0055) => [ + q(Chiangmai Sign Language), + ], + q(0056) => [ + q(Czech Sign Language), + ], + q(0057) => [ + q(Cuba Sign Language), + ], + q(0058) => [ + q(Chilean Sign Language), + ], + q(0059) => [ + q(Chinese Sign Language), + ], + q(0060) => [ + q(Colombian Sign Language), + ], + q(0061) => [ + q(Croatia Sign Language), + ], + q(0062) => [ + q(Costa Rican Sign Language), + ], + q(0063) => [ + q(Huizhou Chinese), + ], + q(0064) => [ + q(Min Zhong Chinese), + ], + q(0065) => [ + q(Dominican Sign Language), + ], + q(0066) => [ + q(Dutch Sign Language), + ], + q(0067) => [ + q(Danish Sign Language), + ], + q(0068) => [ + q(Duano), + ], + q(0069) => [ + q(Ecuadorian Sign Language), + ], + q(0070) => [ + q(Egypt Sign Language), + ], + q(0071) => [ + q(Salvadoran Sign Language), + ], + q(0072) => [ + q(Estonian Sign Language), + ], + q(0073) => [ + q(Ethiopian Sign Language), + ], + q(0074) => [ + q(Quebec Sign Language), + ], + q(0075) => [ + q(Finnish Sign Language), + ], + q(0076) => [ + q(French Sign Language), + ], + q(0077) => [ + q(Finland-Swedish Sign Language), + q(finlandssvenskt teckensprak), + q(suomenruotsalainen viittomakieli), + ], + q(0078) => [ + q(Gan Chinese), + ], + q(0079) => [ + q(Ghandruk Sign Language), + ], + q(0080) => [ + q(Goan Konkani), + ], + q(0081) => [ + q(Ghanaian Sign Language), + ], + q(0082) => [ + q(German Sign Language), + ], + q(0083) => [ + q(Guatemalan Sign Language), + ], + q(0084) => [ + q(Greek Sign Language), + ], + q(0085) => [ + q(Guinean Sign Language), + ], + q(0086) => [ + q(Hanoi Sign Language), + ], + q(0087) => [ + q(Haiphong Sign Language), + ], + q(0088) => [ + q(Hakka Chinese), + ], + q(0089) => [ + q(Honduras Sign Language), + ], + q(0090) => [ + q(Haji), + ], + q(0091) => [ + q(Hong Kong Sign Language), + q(Heung Kong Sau Yue), + ], + q(0092) => [ + q(Ho Chi Minh City Sign Language), + ], + q(0093) => [ + q(Hawai'i Sign Language (HSL)), + q(Hawai'i Pidgin Sign Language), + ], + q(0094) => [ + q(Hungarian Sign Language), + ], + q(0095) => [ + q(Hausa Sign Language), + ], + q(0096) => [ + q(Xiang Chinese), + ], + q(0097) => [ + q(Icelandic Sign Language), + ], + q(0098) => [ + q(Inuit Sign Language), + ], + q(0099) => [ + q(International Sign), + ], + q(0100) => [ + q(Indonesian Sign Language), + ], + q(0101) => [ + q(Indian Sign Language), + ], + q(0102) => [ + q(Italian Sign Language), + ], + q(0103) => [ + q(Irish Sign Language), + ], + q(0104) => [ + q(Israeli Sign Language), + ], + q(0105) => [ + q(Jakun), + ], + q(0106) => [ + q(Jambi Malay), + ], + q(0107) => [ + q(Jamaican Country Sign Language), + ], + q(0108) => [ + q(Jhankot Sign Language), + ], + q(0109) => [ + q(Jamaican Sign Language), + ], + q(0110) => [ + q(Jordanian Sign Language), + ], + q(0111) => [ + q(Japanese Sign Language), + ], + q(0112) => [ + q(Jumla Sign Language), + ], + q(0113) => [ + q(Selangor Sign Language), + ], + q(0114) => [ + q(Konkani (individual language)), + ], + q(0115) => [ + q(Kubu), + ], + q(0116) => [ + q(Korean Sign Language), + ], + q(0117) => [ + q(Kerinci), + ], + q(0118) => [ + q(Brunei), + ], + q(0119) => [ + q(Libyan Sign Language), + ], + q(0120) => [ + q(Loncong), + q(Sekak), + ], + q(0121) => [ + q(Lubu), + ], + q(0122) => [ + q(Col), + ], + q(0123) => [ + q(Lithuanian Sign Language), + ], + q(0124) => [ + q(Lyons Sign Language), + ], + q(0125) => [ + q(Latvian Sign Language), + ], + q(0126) => [ + q(Laos Sign Language), + ], + q(0127) => [ + q(Panamanian Sign Language), + q(Lengua de Senas Panamenas), + ], + q(0128) => [ + q(Trinidad and Tobago Sign Language), + ], + q(0129) => [ + q(Mauritian Sign Language), + ], + q(0130) => [ + q(Latgalian), + ], + q(0131) => [ + q(Standard Latvian), + ], + q(0132) => [ + q(Literary Chinese), + ], + q(0133) => [ + q(North Moluccan Malay), + ], + q(0134) => [ + q(Maltese Sign Language), + ], + q(0135) => [ + q(Kedah Malay), + ], + q(0136) => [ + q(Pattani Malay), + ], + q(0137) => [ + q(Bangka), + ], + q(0138) => [ + q(Mexican Sign Language), + ], + q(0139) => [ + q(Minangkabau), + ], + q(0140) => [ + q(Min Bei Chinese), + ], + q(0141) => [ + q(Kota Bangun Kutai Malay), + ], + q(0142) => [ + q(Martha's Vineyard Sign Language), + ], + q(0143) => [ + q(Yucatec Maya Sign Language), + ], + q(0144) => [ + q(Sabah Malay), + ], + q(0145) => [ + q(Mongolian Sign Language), + ], + q(0146) => [ + q(Musi), + ], + q(0147) => [ + q(Madagascar Sign Language), + ], + q(0148) => [ + q(Monastic Sign Language), + ], + q(0149) => [ + q(Mozambican Sign Language), + ], + q(0150) => [ + q(Min Nan Chinese), + ], + q(0151) => [ + q(Namibian Sign Language), + ], + q(0152) => [ + q(Nicaraguan Sign Language), + ], + q(0153) => [ + q(Nigerian Sign Language), + ], + q(0154) => [ + q(Norwegian Sign Language), + ], + q(0155) => [ + q(Nepalese Sign Language), + ], + q(0156) => [ + q(Maritime Sign Language), + ], + q(0157) => [ + q(New Zealand Sign Language), + ], + q(0158) => [ + q(Old Kentish Sign Language), + ], + q(0159) => [ + q(Orang Kanaq), + ], + q(0160) => [ + q(Orang Seletar), + ], + q(0161) => [ + q(Pekal), + ], + q(0162) => [ + q(Sudanese Creole Arabic), + ], + q(0163) => [ + q(Papua New Guinean Sign Language), + ], + q(0164) => [ + q(Pakistan Sign Language), + ], + q(0165) => [ + q(Peruvian Sign Language), + ], + q(0166) => [ + q(Providencia Sign Language), + ], + q(0167) => [ + q(Persian Sign Language), + ], + q(0168) => [ + q(Plains Indian Sign Language), + ], + q(0169) => [ + q(Central Malay), + ], + q(0170) => [ + q(Penang Sign Language), + ], + q(0171) => [ + q(Puerto Rican Sign Language), + ], + q(0172) => [ + q(Polish Sign Language), + ], + q(0173) => [ + q(Philippine Sign Language), + ], + q(0174) => [ + q(Portuguese Sign Language), + ], + q(0175) => [ + q(Paraguayan Sign Language), + q(Lengua de Senas del Paraguay), + ], + q(0176) => [ + q(Romanian Sign Language), + ], + q(0177) => [ + q(Russian Sign Language), + ], + q(0178) => [ + q(Miriwoong Sign Language), + ], + q(0179) => [ + q(Saudi Arabian Sign Language), + ], + q(0180) => [ + q(Langue des signes de Belgique Francophone), + q(French Belgian Sign Language), + ], + q(0181) => [ + q(South African Sign Language), + ], + q(0182) => [ + q(Swiss-German Sign Language), + ], + q(0183) => [ + q(Sierra Leone Sign Language), + ], + q(0184) => [ + q(Chadian Arabic), + ], + q(0185) => [ + q(Swiss-Italian Sign Language), + ], + q(0186) => [ + q(Singapore Sign Language), + ], + q(0187) => [ + q(Albanian Sign Language), + ], + q(0188) => [ + q(Sri Lankan Sign Language), + ], + q(0189) => [ + q(Shihhi Arabic), + ], + q(0190) => [ + q(Spanish Sign Language), + ], + q(0191) => [ + q(Swiss-French Sign Language), + ], + q(0192) => [ + q(Slovakian Sign Language), + ], + q(0193) => [ + q(Congo Swahili), + ], + q(0194) => [ + q(Swahili (individual language)), + q(Kiswahili), + ], + q(0195) => [ + q(Swedish Sign Language), + ], + q(0196) => [ + q(Al-Sayyid Bedouin Sign Language), + ], + q(0197) => [ + q(Solomon Islands Sign Language), + ], + q(0198) => [ + q(Temuan), + ], + q(0199) => [ + q(Tunisian Sign Language), + ], + q(0200) => [ + q(Turkish Sign Language), + q(Turk Isaret Dili), + ], + q(0201) => [ + q(Thai Sign Language), + ], + q(0202) => [ + q(Taiwan Sign Language), + ], + q(0203) => [ + q(Tebul Sign Language), + ], + q(0204) => [ + q(Tanzanian Sign Language), + ], + q(0205) => [ + q(Ugandan Sign Language), + ], + q(0206) => [ + q(Uruguayan Sign Language), + ], + q(0207) => [ + q(Ukrainian Sign Language), + ], + q(0208) => [ + q(Urubu-Kaapor Sign Language), + q(Kaapor Sign Language), + ], + q(0209) => [ + q(Urak Lawoi'), + ], + q(0210) => [ + q(Northern Uzbek), + ], + q(0211) => [ + q(Southern Uzbek), + ], + q(0212) => [ + q(Vlaamse Gebarentaal), + q(Flemish Sign Language), + ], + q(0213) => [ + q(Kaur), + ], + q(0214) => [ + q(Tenggarong Kutai Malay), + ], + q(0215) => [ + q(Moldova Sign Language), + ], + q(0216) => [ + q(Venezuelan Sign Language), + ], + q(0217) => [ + q(Valencian Sign Language), + q(Llengua de signes valenciana), + ], + q(0218) => [ + q(West Bengal Sign Language), + ], + q(0219) => [ + q(Wu Chinese), + ], + q(0220) => [ + q(Kenyan Sign Language), + ], + q(0221) => [ + q(Malaysian Sign Language), + ], + q(0222) => [ + q(Manado Malay), + ], + q(0223) => [ + q(Moroccan Sign Language), + ], + q(0224) => [ + q(Yolnu Sign Language), + ], + q(0225) => [ + q(Yan-nhanu Sign Language), + ], + q(0226) => [ + q(Yugoslavian Sign Language), + ], + q(0227) => [ + q(Yue Chinese), + q(Cantonese), + ], + q(0228) => [ + q(Zimbabwe Sign Language), + ], + q(0229) => [ + q(Malay (individual language)), + ], + q(0230) => [ + q(Negeri Sembilan Malay), + ], + q(0231) => [ + q(Zambian Sign Language), + ], + q(0232) => [ + q(Standard Malay), + ], +}; + +$Locale::Codes::Data{'langext'}{'alias2id'} = { + q(adamorobe sign language) => [ + q(0010), + q(0), + ], + q(afghan sign language) => [ + q(0016), + q(0), + ], + q(al-sayyid bedouin sign language) => [ + q(0196), + q(0), + ], + q(albanian sign language) => [ + q(0187), + q(0), + ], + q(algerian arabic) => [ + q(0021), + q(0), + ], + q(algerian saharan arabic) => [ + q(0001), + q(0), + ], + q(algerian sign language) => [ + q(0027), + q(0), + ], + q(american sign language) => [ + q(0025), + q(0), + ], + q(argentine sign language) => [ + q(0013), + q(0), + ], + q(armenian sign language) => [ + q(0014), + q(0), + ], + q(australian aborigines sign language) => [ + q(0029), + q(0), + ], + q(australian sign language) => [ + q(0026), + q(0), + ], + q(austrian sign language) => [ + q(0028), + q(0), + ], + q(babalia creole arabic) => [ + q(0036), + q(0), + ], + q(bacanese malay) => [ + q(0043), + q(0), + ], + q(baharna arabic) => [ + q(0003), + q(0), + ], + q(bamako sign language) => [ + q(0040), + q(0), + ], + q(ban khor sign language) => [ + q(0038), + q(0), + ], + q(bangka) => [ + q(0137), + q(0), + ], + q(banjar) => [ + q(0039), + q(0), + ], + q(bengkala sign language) => [ + q(0042), + q(0), + ], + q(berau malay) => [ + q(0044), + q(0), + ], + q(bolivian sign language) => [ + q(0045), + q(0), + ], + q(brazilian sign language) => [ + q(0047), + q(0), + ], + q(british sign language) => [ + q(0037), + q(0), + ], + q(brunei) => [ + q(0118), + q(0), + ], + q(bukit malay) => [ + q(0046), + q(0), + ], + q(bulgarian sign language) => [ + q(0041), + q(0), + ], + q(cantonese) => [ + q(0227), + q(1), + ], + q(catalan sign language) => [ + q(0054), + q(0), + ], + q(central malay) => [ + q(0169), + q(0), + ], + q(chadian arabic) => [ + q(0184), + q(0), + ], + q(chadian sign language) => [ + q(0049), + q(0), + ], + q(chiangmai sign language) => [ + q(0055), + q(0), + ], + q(chilean sign language) => [ + q(0058), + q(0), + ], + q(chinese sign language) => [ + q(0059), + q(0), + ], + q(cocos islands malay) => [ + q(0052), + q(0), + ], + q(col) => [ + q(0122), + q(0), + ], + q(colombian sign language) => [ + q(0060), + q(0), + ], + q(congo swahili) => [ + q(0193), + q(0), + ], + q(costa rican sign language) => [ + q(0062), + q(0), + ], + q(croatia sign language) => [ + q(0061), + q(0), + ], + q(cuba sign language) => [ + q(0057), + q(0), + ], + q(cypriot arabic) => [ + q(0008), + q(0), + ], + q(czech sign language) => [ + q(0056), + q(0), + ], + q(danish sign language) => [ + q(0067), + q(0), + ], + q(dhofari arabic) => [ + q(0009), + q(0), + ], + q(dominican sign language) => [ + q(0065), + q(0), + ], + q(duano) => [ + q(0068), + q(0), + ], + q(dutch sign language) => [ + q(0066), + q(0), + ], + q(eastern egyptian bedawi arabic) => [ + q(0031), + q(0), + ], + q(ecuadorian sign language) => [ + q(0069), + q(0), + ], + q(egypt sign language) => [ + q(0070), + q(0), + ], + q(egyptian arabic) => [ + q(0024), + q(0), + ], + q(estonian sign language) => [ + q(0072), + q(0), + ], + q(ethiopian sign language) => [ + q(0073), + q(0), + ], + q(finland-swedish sign language) => [ + q(0077), + q(0), + ], + q(finlandssvenskt teckensprak) => [ + q(0077), + q(1), + ], + q(finnish sign language) => [ + q(0075), + q(0), + ], + q(flemish sign language) => [ + q(0212), + q(1), + ], + q(french belgian sign language) => [ + q(0180), + q(1), + ], + q(french sign language) => [ + q(0076), + q(0), + ], + q(gan chinese) => [ + q(0078), + q(0), + ], + q(german sign language) => [ + q(0082), + q(0), + ], + q(ghanaian sign language) => [ + q(0081), + q(0), + ], + q(ghandruk sign language) => [ + q(0079), + q(0), + ], + q(goan konkani) => [ + q(0080), + q(0), + ], + q(greek sign language) => [ + q(0084), + q(0), + ], + q(guatemalan sign language) => [ + q(0083), + q(0), + ], + q(guinean sign language) => [ + q(0085), + q(0), + ], + q(gulf arabic) => [ + q(0015), + q(0), + ], + q(hadrami arabic) => [ + q(0032), + q(0), + ], + q(haiphong sign language) => [ + q(0087), + q(0), + ], + q(haji) => [ + q(0090), + q(0), + ], + q(hakka chinese) => [ + q(0088), + q(0), + ], + q(hanoi sign language) => [ + q(0086), + q(0), + ], + q(hausa sign language) => [ + q(0095), + q(0), + ], + q(hawai'i pidgin sign language) => [ + q(0093), + q(1), + ], + q(hawai'i sign language (hsl)) => [ + q(0093), + q(0), + ], + q(heung kong sau yue) => [ + q(0091), + q(1), + ], + q(hijazi arabic) => [ + q(0006), + q(0), + ], + q(ho chi minh city sign language) => [ + q(0092), + q(0), + ], + q(honduras sign language) => [ + q(0089), + q(0), + ], + q(hong kong sign language) => [ + q(0091), + q(0), + ], + q(huizhou chinese) => [ + q(0063), + q(0), + ], + q(hungarian sign language) => [ + q(0094), + q(0), + ], + q(icelandic sign language) => [ + q(0097), + q(0), + ], + q(indian sign language) => [ + q(0101), + q(0), + ], + q(indonesian sign language) => [ + q(0100), + q(0), + ], + q(international sign) => [ + q(0099), + q(0), + ], + q(inuit sign language) => [ + q(0098), + q(0), + ], + q(irish sign language) => [ + q(0103), + q(0), + ], + q(israeli sign language) => [ + q(0104), + q(0), + ], + q(italian sign language) => [ + q(0102), + q(0), + ], + q(jakun) => [ + q(0105), + q(0), + ], + q(jamaican country sign language) => [ + q(0107), + q(0), + ], + q(jamaican sign language) => [ + q(0109), + q(0), + ], + q(jambi malay) => [ + q(0106), + q(0), + ], + q(japanese sign language) => [ + q(0111), + q(0), + ], + q(jhankot sign language) => [ + q(0108), + q(0), + ], + q(jinyu chinese) => [ + q(0050), + q(0), + ], + q(jordanian sign language) => [ + q(0110), + q(0), + ], + q(jumla sign language) => [ + q(0112), + q(0), + ], + q(kaapor sign language) => [ + q(0208), + q(1), + ], + q(kaur) => [ + q(0213), + q(0), + ], + q(kedah malay) => [ + q(0135), + q(0), + ], + q(kenyan sign language) => [ + q(0220), + q(0), + ], + q(kerinci) => [ + q(0117), + q(0), + ], + q(kiswahili) => [ + q(0194), + q(1), + ], + q(konkani (individual language)) => [ + q(0114), + q(0), + ], + q(korean sign language) => [ + q(0116), + q(0), + ], + q(kota bangun kutai malay) => [ + q(0141), + q(0), + ], + q(kubu) => [ + q(0115), + q(0), + ], + q(langue des signes de belgique francophone) => [ + q(0180), + q(0), + ], + q(laos sign language) => [ + q(0126), + q(0), + ], + q(latgalian) => [ + q(0130), + q(0), + ], + q(latvian sign language) => [ + q(0125), + q(0), + ], + q(lengua de senas catalana) => [ + q(0054), + q(1), + ], + q(lengua de senas del paraguay) => [ + q(0175), + q(1), + ], + q(lengua de senas panamenas) => [ + q(0127), + q(1), + ], + q(libyan arabic) => [ + q(0033), + q(0), + ], + q(libyan sign language) => [ + q(0119), + q(0), + ], + q(literary chinese) => [ + q(0132), + q(0), + ], + q(lithuanian sign language) => [ + q(0123), + q(0), + ], + q(llengua de signes catalana) => [ + q(0054), + q(2), + ], + q(llengua de signes valenciana) => [ + q(0217), + q(1), + ], + q(loncong) => [ + q(0120), + q(0), + ], + q(lubu) => [ + q(0121), + q(0), + ], + q(lyons sign language) => [ + q(0124), + q(0), + ], + q(madagascar sign language) => [ + q(0147), + q(0), + ], + q(malay (individual language)) => [ + q(0229), + q(0), + ], + q(malaysian sign language) => [ + q(0221), + q(0), + ], + q(maltese sign language) => [ + q(0134), + q(0), + ], + q(manado malay) => [ + q(0222), + q(0), + ], + q(mandarin chinese) => [ + q(0051), + q(0), + ], + q(maritime sign language) => [ + q(0156), + q(0), + ], + q(martha's vineyard sign language) => [ + q(0142), + q(0), + ], + q(mauritian sign language) => [ + q(0129), + q(0), + ], + q(mesopotamian arabic) => [ + q(0004), + q(0), + ], + q(mexican sign language) => [ + q(0138), + q(0), + ], + q(min bei chinese) => [ + q(0140), + q(0), + ], + q(min dong chinese) => [ + q(0048), + q(0), + ], + q(min nan chinese) => [ + q(0150), + q(0), + ], + q(min zhong chinese) => [ + q(0064), + q(0), + ], + q(minangkabau) => [ + q(0139), + q(0), + ], + q(miriwoong sign language) => [ + q(0178), + q(0), + ], + q(moldova sign language) => [ + q(0215), + q(0), + ], + q(monastic sign language) => [ + q(0148), + q(0), + ], + q(mongolian sign language) => [ + q(0145), + q(0), + ], + q(moroccan arabic) => [ + q(0023), + q(0), + ], + q(moroccan sign language) => [ + q(0223), + q(0), + ], + q(mozambican sign language) => [ + q(0149), + q(0), + ], + q(musi) => [ + q(0146), + q(0), + ], + q(najdi arabic) => [ + q(0022), + q(0), + ], + q(namibian sign language) => [ + q(0151), + q(0), + ], + q(negeri sembilan malay) => [ + q(0230), + q(0), + ], + q(nepalese sign language) => [ + q(0155), + q(0), + ], + q(new zealand sign language) => [ + q(0157), + q(0), + ], + q(nicaraguan sign language) => [ + q(0152), + q(0), + ], + q(nigerian sign language) => [ + q(0153), + q(0), + ], + q(north levantine arabic) => [ + q(0018), + q(0), + ], + q(north mesopotamian arabic) => [ + q(0035), + q(0), + ], + q(north moluccan malay) => [ + q(0133), + q(0), + ], + q(northern uzbek) => [ + q(0210), + q(0), + ], + q(norwegian sign language) => [ + q(0154), + q(0), + ], + q(old kentish sign language) => [ + q(0158), + q(0), + ], + q(omani arabic) => [ + q(0007), + q(0), + ], + q(orang kanaq) => [ + q(0159), + q(0), + ], + q(orang seletar) => [ + q(0160), + q(0), + ], + q(pakistan sign language) => [ + q(0164), + q(0), + ], + q(panamanian sign language) => [ + q(0127), + q(0), + ], + q(papua new guinean sign language) => [ + q(0163), + q(0), + ], + q(paraguayan sign language) => [ + q(0175), + q(0), + ], + q(pattani malay) => [ + q(0136), + q(0), + ], + q(pekal) => [ + q(0161), + q(0), + ], + q(penang sign language) => [ + q(0170), + q(0), + ], + q(persian sign language) => [ + q(0167), + q(0), + ], + q(peruvian sign language) => [ + q(0165), + q(0), + ], + q(philippine sign language) => [ + q(0173), + q(0), + ], + q(plains indian sign language) => [ + q(0168), + q(0), + ], + q(polish sign language) => [ + q(0172), + q(0), + ], + q(portuguese sign language) => [ + q(0174), + q(0), + ], + q(providencia sign language) => [ + q(0166), + q(0), + ], + q(pu-xian chinese) => [ + q(0053), + q(0), + ], + q(puerto rican sign language) => [ + q(0171), + q(0), + ], + q(quebec sign language) => [ + q(0074), + q(0), + ], + q(romanian sign language) => [ + q(0176), + q(0), + ], + q(russian sign language) => [ + q(0177), + q(0), + ], + q(sabah malay) => [ + q(0144), + q(0), + ], + q(saidi arabic) => [ + q(0012), + q(0), + ], + q(salvadoran sign language) => [ + q(0071), + q(0), + ], + q(sanaani arabic) => [ + q(0034), + q(0), + ], + q(saudi arabian sign language) => [ + q(0179), + q(0), + ], + q(sekak) => [ + q(0120), + q(1), + ], + q(selangor sign language) => [ + q(0113), + q(0), + ], + q(shihhi arabic) => [ + q(0189), + q(0), + ], + q(sierra leone sign language) => [ + q(0183), + q(0), + ], + q(singapore sign language) => [ + q(0186), + q(0), + ], + q(slovakian sign language) => [ + q(0192), + q(0), + ], + q(solomon islands sign language) => [ + q(0197), + q(0), + ], + q(south african sign language) => [ + q(0181), + q(0), + ], + q(south levantine arabic) => [ + q(0017), + q(0), + ], + q(southern uzbek) => [ + q(0211), + q(0), + ], + q(spanish sign language) => [ + q(0190), + q(0), + ], + q(sri lankan sign language) => [ + q(0188), + q(0), + ], + q(standard arabic) => [ + q(0020), + q(0), + ], + q(standard latvian) => [ + q(0131), + q(0), + ], + q(standard malay) => [ + q(0232), + q(0), + ], + q(sudanese arabic) => [ + q(0019), + q(0), + ], + q(sudanese creole arabic) => [ + q(0162), + q(0), + ], + q(suomenruotsalainen viittomakieli) => [ + q(0077), + q(2), + ], + q(swahili (individual language)) => [ + q(0194), + q(0), + ], + q(swedish sign language) => [ + q(0195), + q(0), + ], + q(swiss-french sign language) => [ + q(0191), + q(0), + ], + q(swiss-german sign language) => [ + q(0182), + q(0), + ], + q(swiss-italian sign language) => [ + q(0185), + q(0), + ], + q(ta'izzi-adeni arabic) => [ + q(0005), + q(0), + ], + q(taiwan sign language) => [ + q(0202), + q(0), + ], + q(tajiki arabic) => [ + q(0002), + q(0), + ], + q(tanzanian sign language) => [ + q(0204), + q(0), + ], + q(tebul sign language) => [ + q(0203), + q(0), + ], + q(temuan) => [ + q(0198), + q(0), + ], + q(tenggarong kutai malay) => [ + q(0214), + q(0), + ], + q(thai sign language) => [ + q(0201), + q(0), + ], + q(trinidad and tobago sign language) => [ + q(0128), + q(0), + ], + q(tunisian arabic) => [ + q(0011), + q(0), + ], + q(tunisian sign language) => [ + q(0199), + q(0), + ], + q(turk isaret dili) => [ + q(0200), + q(1), + ], + q(turkish sign language) => [ + q(0200), + q(0), + ], + q(ugandan sign language) => [ + q(0205), + q(0), + ], + q(ukrainian sign language) => [ + q(0207), + q(0), + ], + q(urak lawoi') => [ + q(0209), + q(0), + ], + q(urubu-kaapor sign language) => [ + q(0208), + q(0), + ], + q(uruguayan sign language) => [ + q(0206), + q(0), + ], + q(uzbeki arabic) => [ + q(0030), + q(0), + ], + q(valencian sign language) => [ + q(0217), + q(0), + ], + q(venezuelan sign language) => [ + q(0216), + q(0), + ], + q(vlaamse gebarentaal) => [ + q(0212), + q(0), + ], + q(west bengal sign language) => [ + q(0218), + q(0), + ], + q(wu chinese) => [ + q(0219), + q(0), + ], + q(xiang chinese) => [ + q(0096), + q(0), + ], + q(yan-nhanu sign language) => [ + q(0225), + q(0), + ], + q(yolnu sign language) => [ + q(0224), + q(0), + ], + q(yucatec maya sign language) => [ + q(0143), + q(0), + ], + q(yue chinese) => [ + q(0227), + q(0), + ], + q(yugoslavian sign language) => [ + q(0226), + q(0), + ], + q(zambian sign language) => [ + q(0231), + q(0), + ], + q(zimbabwe sign language) => [ + q(0228), + q(0), + ], +}; + +$Locale::Codes::Data{'langext'}{'code2id'} = { + q(alpha) => { + q(aao) => [ + q(0001), + q(0), + ], + q(abh) => [ + q(0002), + q(0), + ], + q(abv) => [ + q(0003), + q(0), + ], + q(acm) => [ + q(0004), + q(0), + ], + q(acq) => [ + q(0005), + q(0), + ], + q(acw) => [ + q(0006), + q(0), + ], + q(acx) => [ + q(0007), + q(0), + ], + q(acy) => [ + q(0008), + q(0), + ], + q(adf) => [ + q(0009), + q(0), + ], + q(ads) => [ + q(0010), + q(0), + ], + q(aeb) => [ + q(0011), + q(0), + ], + q(aec) => [ + q(0012), + q(0), + ], + q(aed) => [ + q(0013), + q(0), + ], + q(aen) => [ + q(0014), + q(0), + ], + q(afb) => [ + q(0015), + q(0), + ], + q(afg) => [ + q(0016), + q(0), + ], + q(ajp) => [ + q(0017), + q(0), + ], + q(apc) => [ + q(0018), + q(0), + ], + q(apd) => [ + q(0019), + q(0), + ], + q(arb) => [ + q(0020), + q(0), + ], + q(arq) => [ + q(0021), + q(0), + ], + q(ars) => [ + q(0022), + q(0), + ], + q(ary) => [ + q(0023), + q(0), + ], + q(arz) => [ + q(0024), + q(0), + ], + q(ase) => [ + q(0025), + q(0), + ], + q(asf) => [ + q(0026), + q(0), + ], + q(asp) => [ + q(0027), + q(0), + ], + q(asq) => [ + q(0028), + q(0), + ], + q(asw) => [ + q(0029), + q(0), + ], + q(auz) => [ + q(0030), + q(0), + ], + q(avl) => [ + q(0031), + q(0), + ], + q(ayh) => [ + q(0032), + q(0), + ], + q(ayl) => [ + q(0033), + q(0), + ], + q(ayn) => [ + q(0034), + q(0), + ], + q(ayp) => [ + q(0035), + q(0), + ], + q(bbz) => [ + q(0036), + q(0), + ], + q(bfi) => [ + q(0037), + q(0), + ], + q(bfk) => [ + q(0038), + q(0), + ], + q(bjn) => [ + q(0039), + q(0), + ], + q(bog) => [ + q(0040), + q(0), + ], + q(bqn) => [ + q(0041), + q(0), + ], + q(bqy) => [ + q(0042), + q(0), + ], + q(btj) => [ + q(0043), + q(0), + ], + q(bve) => [ + q(0044), + q(0), + ], + q(bvl) => [ + q(0045), + q(0), + ], + q(bvu) => [ + q(0046), + q(0), + ], + q(bzs) => [ + q(0047), + q(0), + ], + q(cdo) => [ + q(0048), + q(0), + ], + q(cds) => [ + q(0049), + q(0), + ], + q(cjy) => [ + q(0050), + q(0), + ], + q(cmn) => [ + q(0051), + q(0), + ], + q(coa) => [ + q(0052), + q(0), + ], + q(cpx) => [ + q(0053), + q(0), + ], + q(csc) => [ + q(0054), + q(0), + ], + q(csd) => [ + q(0055), + q(0), + ], + q(cse) => [ + q(0056), + q(0), + ], + q(csf) => [ + q(0057), + q(0), + ], + q(csg) => [ + q(0058), + q(0), + ], + q(csl) => [ + q(0059), + q(0), + ], + q(csn) => [ + q(0060), + q(0), + ], + q(csq) => [ + q(0061), + q(0), + ], + q(csr) => [ + q(0062), + q(0), + ], + q(czh) => [ + q(0063), + q(0), + ], + q(czo) => [ + q(0064), + q(0), + ], + q(doq) => [ + q(0065), + q(0), + ], + q(dse) => [ + q(0066), + q(0), + ], + q(dsl) => [ + q(0067), + q(0), + ], + q(dup) => [ + q(0068), + q(0), + ], + q(ecs) => [ + q(0069), + q(0), + ], + q(esl) => [ + q(0070), + q(0), + ], + q(esn) => [ + q(0071), + q(0), + ], + q(eso) => [ + q(0072), + q(0), + ], + q(eth) => [ + q(0073), + q(0), + ], + q(fcs) => [ + q(0074), + q(0), + ], + q(fse) => [ + q(0075), + q(0), + ], + q(fsl) => [ + q(0076), + q(0), + ], + q(fss) => [ + q(0077), + q(0), + ], + q(gan) => [ + q(0078), + q(0), + ], + q(gds) => [ + q(0079), + q(0), + ], + q(gom) => [ + q(0080), + q(0), + ], + q(gse) => [ + q(0081), + q(0), + ], + q(gsg) => [ + q(0082), + q(0), + ], + q(gsm) => [ + q(0083), + q(0), + ], + q(gss) => [ + q(0084), + q(0), + ], + q(gus) => [ + q(0085), + q(0), + ], + q(hab) => [ + q(0086), + q(0), + ], + q(haf) => [ + q(0087), + q(0), + ], + q(hak) => [ + q(0088), + q(0), + ], + q(hds) => [ + q(0089), + q(0), + ], + q(hji) => [ + q(0090), + q(0), + ], + q(hks) => [ + q(0091), + q(0), + ], + q(hos) => [ + q(0092), + q(0), + ], + q(hps) => [ + q(0093), + q(0), + ], + q(hsh) => [ + q(0094), + q(0), + ], + q(hsl) => [ + q(0095), + q(0), + ], + q(hsn) => [ + q(0096), + q(0), + ], + q(icl) => [ + q(0097), + q(0), + ], + q(iks) => [ + q(0098), + q(0), + ], + q(ils) => [ + q(0099), + q(0), + ], + q(inl) => [ + q(0100), + q(0), + ], + q(ins) => [ + q(0101), + q(0), + ], + q(ise) => [ + q(0102), + q(0), + ], + q(isg) => [ + q(0103), + q(0), + ], + q(isr) => [ + q(0104), + q(0), + ], + q(jak) => [ + q(0105), + q(0), + ], + q(jax) => [ + q(0106), + q(0), + ], + q(jcs) => [ + q(0107), + q(0), + ], + q(jhs) => [ + q(0108), + q(0), + ], + q(jls) => [ + q(0109), + q(0), + ], + q(jos) => [ + q(0110), + q(0), + ], + q(jsl) => [ + q(0111), + q(0), + ], + q(jus) => [ + q(0112), + q(0), + ], + q(kgi) => [ + q(0113), + q(0), + ], + q(knn) => [ + q(0114), + q(0), + ], + q(kvb) => [ + q(0115), + q(0), + ], + q(kvk) => [ + q(0116), + q(0), + ], + q(kvr) => [ + q(0117), + q(0), + ], + q(kxd) => [ + q(0118), + q(0), + ], + q(lbs) => [ + q(0119), + q(0), + ], + q(lce) => [ + q(0120), + q(0), + ], + q(lcf) => [ + q(0121), + q(0), + ], + q(liw) => [ + q(0122), + q(0), + ], + q(lls) => [ + q(0123), + q(0), + ], + q(lsg) => [ + q(0124), + q(0), + ], + q(lsl) => [ + q(0125), + q(0), + ], + q(lso) => [ + q(0126), + q(0), + ], + q(lsp) => [ + q(0127), + q(0), + ], + q(lst) => [ + q(0128), + q(0), + ], + q(lsy) => [ + q(0129), + q(0), + ], + q(ltg) => [ + q(0130), + q(0), + ], + q(lvs) => [ + q(0131), + q(0), + ], + q(lzh) => [ + q(0132), + q(0), + ], + q(max) => [ + q(0133), + q(0), + ], + q(mdl) => [ + q(0134), + q(0), + ], + q(meo) => [ + q(0135), + q(0), + ], + q(mfa) => [ + q(0136), + q(0), + ], + q(mfb) => [ + q(0137), + q(0), + ], + q(mfs) => [ + q(0138), + q(0), + ], + q(min) => [ + q(0139), + q(0), + ], + q(mnp) => [ + q(0140), + q(0), + ], + q(mqg) => [ + q(0141), + q(0), + ], + q(mre) => [ + q(0142), + q(0), + ], + q(msd) => [ + q(0143), + q(0), + ], + q(msi) => [ + q(0144), + q(0), + ], + q(msr) => [ + q(0145), + q(0), + ], + q(mui) => [ + q(0146), + q(0), + ], + q(mzc) => [ + q(0147), + q(0), + ], + q(mzg) => [ + q(0148), + q(0), + ], + q(mzy) => [ + q(0149), + q(0), + ], + q(nan) => [ + q(0150), + q(0), + ], + q(nbs) => [ + q(0151), + q(0), + ], + q(ncs) => [ + q(0152), + q(0), + ], + q(nsi) => [ + q(0153), + q(0), + ], + q(nsl) => [ + q(0154), + q(0), + ], + q(nsp) => [ + q(0155), + q(0), + ], + q(nsr) => [ + q(0156), + q(0), + ], + q(nzs) => [ + q(0157), + q(0), + ], + q(okl) => [ + q(0158), + q(0), + ], + q(orn) => [ + q(0159), + q(0), + ], + q(ors) => [ + q(0160), + q(0), + ], + q(pel) => [ + q(0161), + q(0), + ], + q(pga) => [ + q(0162), + q(0), + ], + q(pgz) => [ + q(0163), + q(0), + ], + q(pks) => [ + q(0164), + q(0), + ], + q(prl) => [ + q(0165), + q(0), + ], + q(prz) => [ + q(0166), + q(0), + ], + q(psc) => [ + q(0167), + q(0), + ], + q(psd) => [ + q(0168), + q(0), + ], + q(pse) => [ + q(0169), + q(0), + ], + q(psg) => [ + q(0170), + q(0), + ], + q(psl) => [ + q(0171), + q(0), + ], + q(pso) => [ + q(0172), + q(0), + ], + q(psp) => [ + q(0173), + q(0), + ], + q(psr) => [ + q(0174), + q(0), + ], + q(pys) => [ + q(0175), + q(0), + ], + q(rms) => [ + q(0176), + q(0), + ], + q(rsl) => [ + q(0177), + q(0), + ], + q(rsm) => [ + q(0178), + q(0), + ], + q(sdl) => [ + q(0179), + q(0), + ], + q(sfb) => [ + q(0180), + q(0), + ], + q(sfs) => [ + q(0181), + q(0), + ], + q(sgg) => [ + q(0182), + q(0), + ], + q(sgx) => [ + q(0183), + q(0), + ], + q(shu) => [ + q(0184), + q(0), + ], + q(slf) => [ + q(0185), + q(0), + ], + q(sls) => [ + q(0186), + q(0), + ], + q(sqk) => [ + q(0187), + q(0), + ], + q(sqs) => [ + q(0188), + q(0), + ], + q(ssh) => [ + q(0189), + q(0), + ], + q(ssp) => [ + q(0190), + q(0), + ], + q(ssr) => [ + q(0191), + q(0), + ], + q(svk) => [ + q(0192), + q(0), + ], + q(swc) => [ + q(0193), + q(0), + ], + q(swh) => [ + q(0194), + q(0), + ], + q(swl) => [ + q(0195), + q(0), + ], + q(syy) => [ + q(0196), + q(0), + ], + q(szs) => [ + q(0197), + q(0), + ], + q(tmw) => [ + q(0198), + q(0), + ], + q(tse) => [ + q(0199), + q(0), + ], + q(tsm) => [ + q(0200), + q(0), + ], + q(tsq) => [ + q(0201), + q(0), + ], + q(tss) => [ + q(0202), + q(0), + ], + q(tsy) => [ + q(0203), + q(0), + ], + q(tza) => [ + q(0204), + q(0), + ], + q(ugn) => [ + q(0205), + q(0), + ], + q(ugy) => [ + q(0206), + q(0), + ], + q(ukl) => [ + q(0207), + q(0), + ], + q(uks) => [ + q(0208), + q(0), + ], + q(urk) => [ + q(0209), + q(0), + ], + q(uzn) => [ + q(0210), + q(0), + ], + q(uzs) => [ + q(0211), + q(0), + ], + q(vgt) => [ + q(0212), + q(0), + ], + q(vkk) => [ + q(0213), + q(0), + ], + q(vkt) => [ + q(0214), + q(0), + ], + q(vsi) => [ + q(0215), + q(0), + ], + q(vsl) => [ + q(0216), + q(0), + ], + q(vsv) => [ + q(0217), + q(0), + ], + q(wbs) => [ + q(0218), + q(0), + ], + q(wuu) => [ + q(0219), + q(0), + ], + q(xki) => [ + q(0220), + q(0), + ], + q(xml) => [ + q(0221), + q(0), + ], + q(xmm) => [ + q(0222), + q(0), + ], + q(xms) => [ + q(0223), + q(0), + ], + q(ygs) => [ + q(0224), + q(0), + ], + q(yhs) => [ + q(0225), + q(0), + ], + q(ysl) => [ + q(0226), + q(0), + ], + q(yue) => [ + q(0227), + q(0), + ], + q(zib) => [ + q(0228), + q(0), + ], + q(zlm) => [ + q(0229), + q(0), + ], + q(zmi) => [ + q(0230), + q(0), + ], + q(zsl) => [ + q(0231), + q(0), + ], + q(zsm) => [ + q(0232), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'langext'}{'id2code'} = { + q(alpha) => { + q(0001) => q(aao), + q(0002) => q(abh), + q(0003) => q(abv), + q(0004) => q(acm), + q(0005) => q(acq), + q(0006) => q(acw), + q(0007) => q(acx), + q(0008) => q(acy), + q(0009) => q(adf), + q(0010) => q(ads), + q(0011) => q(aeb), + q(0012) => q(aec), + q(0013) => q(aed), + q(0014) => q(aen), + q(0015) => q(afb), + q(0016) => q(afg), + q(0017) => q(ajp), + q(0018) => q(apc), + q(0019) => q(apd), + q(0020) => q(arb), + q(0021) => q(arq), + q(0022) => q(ars), + q(0023) => q(ary), + q(0024) => q(arz), + q(0025) => q(ase), + q(0026) => q(asf), + q(0027) => q(asp), + q(0028) => q(asq), + q(0029) => q(asw), + q(0030) => q(auz), + q(0031) => q(avl), + q(0032) => q(ayh), + q(0033) => q(ayl), + q(0034) => q(ayn), + q(0035) => q(ayp), + q(0036) => q(bbz), + q(0037) => q(bfi), + q(0038) => q(bfk), + q(0039) => q(bjn), + q(0040) => q(bog), + q(0041) => q(bqn), + q(0042) => q(bqy), + q(0043) => q(btj), + q(0044) => q(bve), + q(0045) => q(bvl), + q(0046) => q(bvu), + q(0047) => q(bzs), + q(0048) => q(cdo), + q(0049) => q(cds), + q(0050) => q(cjy), + q(0051) => q(cmn), + q(0052) => q(coa), + q(0053) => q(cpx), + q(0054) => q(csc), + q(0055) => q(csd), + q(0056) => q(cse), + q(0057) => q(csf), + q(0058) => q(csg), + q(0059) => q(csl), + q(0060) => q(csn), + q(0061) => q(csq), + q(0062) => q(csr), + q(0063) => q(czh), + q(0064) => q(czo), + q(0065) => q(doq), + q(0066) => q(dse), + q(0067) => q(dsl), + q(0068) => q(dup), + q(0069) => q(ecs), + q(0070) => q(esl), + q(0071) => q(esn), + q(0072) => q(eso), + q(0073) => q(eth), + q(0074) => q(fcs), + q(0075) => q(fse), + q(0076) => q(fsl), + q(0077) => q(fss), + q(0078) => q(gan), + q(0079) => q(gds), + q(0080) => q(gom), + q(0081) => q(gse), + q(0082) => q(gsg), + q(0083) => q(gsm), + q(0084) => q(gss), + q(0085) => q(gus), + q(0086) => q(hab), + q(0087) => q(haf), + q(0088) => q(hak), + q(0089) => q(hds), + q(0090) => q(hji), + q(0091) => q(hks), + q(0092) => q(hos), + q(0093) => q(hps), + q(0094) => q(hsh), + q(0095) => q(hsl), + q(0096) => q(hsn), + q(0097) => q(icl), + q(0098) => q(iks), + q(0099) => q(ils), + q(0100) => q(inl), + q(0101) => q(ins), + q(0102) => q(ise), + q(0103) => q(isg), + q(0104) => q(isr), + q(0105) => q(jak), + q(0106) => q(jax), + q(0107) => q(jcs), + q(0108) => q(jhs), + q(0109) => q(jls), + q(0110) => q(jos), + q(0111) => q(jsl), + q(0112) => q(jus), + q(0113) => q(kgi), + q(0114) => q(knn), + q(0115) => q(kvb), + q(0116) => q(kvk), + q(0117) => q(kvr), + q(0118) => q(kxd), + q(0119) => q(lbs), + q(0120) => q(lce), + q(0121) => q(lcf), + q(0122) => q(liw), + q(0123) => q(lls), + q(0124) => q(lsg), + q(0125) => q(lsl), + q(0126) => q(lso), + q(0127) => q(lsp), + q(0128) => q(lst), + q(0129) => q(lsy), + q(0130) => q(ltg), + q(0131) => q(lvs), + q(0132) => q(lzh), + q(0133) => q(max), + q(0134) => q(mdl), + q(0135) => q(meo), + q(0136) => q(mfa), + q(0137) => q(mfb), + q(0138) => q(mfs), + q(0139) => q(min), + q(0140) => q(mnp), + q(0141) => q(mqg), + q(0142) => q(mre), + q(0143) => q(msd), + q(0144) => q(msi), + q(0145) => q(msr), + q(0146) => q(mui), + q(0147) => q(mzc), + q(0148) => q(mzg), + q(0149) => q(mzy), + q(0150) => q(nan), + q(0151) => q(nbs), + q(0152) => q(ncs), + q(0153) => q(nsi), + q(0154) => q(nsl), + q(0155) => q(nsp), + q(0156) => q(nsr), + q(0157) => q(nzs), + q(0158) => q(okl), + q(0159) => q(orn), + q(0160) => q(ors), + q(0161) => q(pel), + q(0162) => q(pga), + q(0163) => q(pgz), + q(0164) => q(pks), + q(0165) => q(prl), + q(0166) => q(prz), + q(0167) => q(psc), + q(0168) => q(psd), + q(0169) => q(pse), + q(0170) => q(psg), + q(0171) => q(psl), + q(0172) => q(pso), + q(0173) => q(psp), + q(0174) => q(psr), + q(0175) => q(pys), + q(0176) => q(rms), + q(0177) => q(rsl), + q(0178) => q(rsm), + q(0179) => q(sdl), + q(0180) => q(sfb), + q(0181) => q(sfs), + q(0182) => q(sgg), + q(0183) => q(sgx), + q(0184) => q(shu), + q(0185) => q(slf), + q(0186) => q(sls), + q(0187) => q(sqk), + q(0188) => q(sqs), + q(0189) => q(ssh), + q(0190) => q(ssp), + q(0191) => q(ssr), + q(0192) => q(svk), + q(0193) => q(swc), + q(0194) => q(swh), + q(0195) => q(swl), + q(0196) => q(syy), + q(0197) => q(szs), + q(0198) => q(tmw), + q(0199) => q(tse), + q(0200) => q(tsm), + q(0201) => q(tsq), + q(0202) => q(tss), + q(0203) => q(tsy), + q(0204) => q(tza), + q(0205) => q(ugn), + q(0206) => q(ugy), + q(0207) => q(ukl), + q(0208) => q(uks), + q(0209) => q(urk), + q(0210) => q(uzn), + q(0211) => q(uzs), + q(0212) => q(vgt), + q(0213) => q(vkk), + q(0214) => q(vkt), + q(0215) => q(vsi), + q(0216) => q(vsl), + q(0217) => q(vsv), + q(0218) => q(wbs), + q(0219) => q(wuu), + q(0220) => q(xki), + q(0221) => q(xml), + q(0222) => q(xmm), + q(0223) => q(xms), + q(0224) => q(ygs), + q(0225) => q(yhs), + q(0226) => q(ysl), + q(0227) => q(yue), + q(0228) => q(zib), + q(0229) => q(zlm), + q(0230) => q(zmi), + q(0231) => q(zsl), + q(0232) => q(zsm), + }, +}; + +1; +package Locale::Codes::Country; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2country + country2code + all_country_codes + all_country_names + country_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_COUNTRY); + +our $obj = new Locale::Codes('country'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2country { + return $obj->code2name(@_); +} + +sub country2code { + return $obj->name2code(@_); +} + +sub country_code2code { + return $obj->code2code(@_); +} + +sub all_country_codes { + return $obj->all_codes(@_); +} + +sub all_country_names { + return $obj->all_names(@_); +} + +sub rename_country { + return $obj->rename_code(@_); +} + +sub add_country { + return $obj->add_code(@_); +} + +sub delete_country { + return $obj->delete_code(@_); +} + +sub add_country_alias { + return $obj->add_alias(@_); +} + +sub delete_country_alias { + return $obj->delete_alias(@_); +} + +sub rename_country_code { + return $obj->replace_code(@_); +} + +sub add_country_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_country_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package # +Locale::Codes::LangVar_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:55:14 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'langvar'}{'id'} = '0086'; + +$Locale::Codes::Data{'langvar'}{'id2names'} = { + q(0001) => [ + q(Late Middle French (to 1606)), + ], + q(0002) => [ + q(Early Modern French), + ], + q(0003) => [ + q(Traditional German orthography), + ], + q(0004) => [ + q("Academic" ("governmental") variant of Belarusian as codified in 1959), + ], + q(0005) => [ + q(Standardized Resian orthography), + ], + q(0006) => [ + q(German orthography of 1996), + ], + q(0007) => [ + q(Orthographic formulation of 1943 - Official in Brazil (Formulario Ortografico de 1943 - Oficial no Brasil)), + ], + q(0008) => [ + q(ALA-LC Romanization, 1997 edition), + ], + q(0009) => [ + q(Aluku dialect), + q(Boni dialect), + ], + q(0010) => [ + q(Akuapem Twi), + ], + q(0011) => [ + q(Portuguese Language Orthographic Agreement of 1990 (Acordo Ortografico da Lingua Portuguesa de 1990)), + ], + q(0012) => [ + q(Eastern Armenian), + ], + q(0013) => [ + q(Western Armenian), + ], + q(0014) => [ + q(Asante Twi), + q(Ashanti Twi), + ], + q(0015) => [ + q(Unified Turkic Latin Alphabet (Historical)), + ], + q(0016) => [ + q(The Balanka dialect of Anii), + ], + q(0017) => [ + q(The Barlavento dialect group of Kabuverdianu), + ], + q(0018) => [ + q(Basic English), + ], + q(0019) => [ + q(Buddhist Hybrid Sanskrit), + ], + q(0020) => [ + q(Biscayan dialect of Basque), + ], + q(0021) => [ + q(The San Giorgio dialect of Resian), + q(The Bila dialect of Resian), + ], + q(0022) => [ + q(Slovene in Bohoric alphabet), + ], + q(0023) => [ + q(Boontling), + ], + q(0024) => [ + q(Portuguese-Brazilian Orthographic Convention of 1945 (Convencao Ortografica Luso-Brasileira de 1945)), + ], + q(0025) => [ + q(Cornu-English), + q(Cornish English), + q(Anglo-Cornish), + ], + q(0026) => [ + q(Slovene in Dajnko alphabet), + ], + q(0027) => [ + q(Serbian with Ekavian pronunciation), + ], + q(0028) => [ + q(Early Modern English (1500-1700)), + ], + q(0029) => [ + q(International Phonetic Alphabet), + ], + q(0030) => [ + q(North American Phonetic Alphabet), + q(Americanist Phonetic Notation), + ], + q(0031) => [ + q(Uralic Phonetic Alphabet), + ], + q(0032) => [ + q(X-SAMPA transcription), + ], + q(0033) => [ + q(Hepburn romanization), + ], + q(0034) => [ + q(Norwegian in Hognorsk (High Norwegian) orthography), + ], + q(0035) => [ + q(Standard H-system orthographic fallback for spelling Esperanto), + ], + q(0036) => [ + q(Serbian with Ijekavian pronunciation), + ], + q(0037) => [ + q(Epic Sanskrit), + ], + q(0038) => [ + q(Bulgarian in 1899 orthography), + ], + q(0039) => [ + q(Jauer dialect of Romansh), + ], + q(0040) => [ + q(Jyutping Cantonese Romanization), + ], + q(0041) => [ + q(Common Cornish orthography of Revived Cornish), + ], + q(0042) => [ + q(The Kociewie dialect of Polish), + ], + q(0043) => [ + q(Standard Cornish orthography of Revived Cornish), + q(Kernowek Standard), + ], + q(0044) => [ + q(Classical Sanskrit), + ], + q(0045) => [ + q(The Lipovaz dialect of Resian), + q(The Lipovec dialect of Resian), + ], + q(0046) => [ + q(Post-1917 Russian orthography), + ], + q(0047) => [ + q(Slovene in Metelko alphabet), + ], + q(0048) => [ + q(Monotonic Greek), + ], + q(0049) => [ + q(Ndyuka dialect), + q(Aukan dialect), + ], + q(0050) => [ + q(Natisone dialect), + q(Nadiza dialect), + ], + q(0051) => [ + q(Newfoundland English), + ], + q(0052) => [ + q(The Gniva dialect of Resian), + q(The Njiva dialect of Resian), + ], + q(0053) => [ + q(Volapuk nulik), + q(Volapuk perevidol), + q(Volapuk nuladik), + q(de Jong's Volapuk), + q(New Volapuk), + q(Revised Volapuk), + q(Modern Volapuk), + ], + q(0054) => [ + q(The Oseacco dialect of Resian), + q(The Osojane dialect of Resian), + ], + q(0055) => [ + q(Oxford English Dictionary spelling), + ], + q(0056) => [ + q(Pahawh Hmong Second Stage Reduced orthography), + ], + q(0057) => [ + q(Pahawh Hmong Third Stage Reduced orthography), + ], + q(0058) => [ + q(Pahawh Hmong Final Version orthography), + ], + q(0059) => [ + q(Pamaka dialect), + ], + q(0060) => [ + q(Petrine orthography), + ], + q(0061) => [ + q(Pinyin romanization), + ], + q(0062) => [ + q(Polytonic Greek), + ], + q(0063) => [ + q(Puter idiom of Romansh), + ], + q(0064) => [ + q(Volapuk rigik), + q(Schleyer's Volapuk), + q(Original Volapuk), + q(Classic Volapuk), + ], + q(0065) => [ + q(Resian), + q(Resianic), + q(Rezijan), + ], + q(0066) => [ + q(Rumantsch Grischun), + ], + q(0067) => [ + q(Scottish Standard English), + ], + q(0068) => [ + q(Scouse), + ], + q(0069) => [ + q(Simplified form), + ], + q(0070) => [ + q(The Stolvizza dialect of Resian), + q(The Solbica dialect of Resian), + ], + q(0071) => [ + q(The Sotavento dialect group of Kabuverdianu), + ], + q(0072) => [ + q(Spanglish), + ], + q(0073) => [ + q(Surmiran idiom of Romansh), + ], + q(0074) => [ + q(Sursilvan idiom of Romansh), + ], + q(0075) => [ + q(Sutsilvan idiom of Romansh), + ], + q(0076) => [ + q(Belarusian in Taraskievica orthography), + ], + q(0077) => [ + q(Unified Cornish orthography of Revived Cornish), + ], + q(0078) => [ + q(Unified Cornish Revised orthography of Revived Cornish), + ], + q(0079) => [ + q(Ulster dialect of Scots), + ], + q(0080) => [ + q(Unifon phonetic alphabet), + ], + q(0081) => [ + q(Vedic Sanskrit), + ], + q(0082) => [ + q(Valencian), + ], + q(0083) => [ + q(Vallader idiom of Romansh), + ], + q(0084) => [ + q(Wade-Giles romanization), + ], + q(0085) => [ + q(Standard X-system orthographic fallback for spelling Esperanto), + ], +}; + +$Locale::Codes::Data{'langvar'}{'alias2id'} = { + q("academic" ("governmental") variant of belarusian as codified in 1959) => [ + q(0004), + q(0), + ], + q(akuapem twi) => [ + q(0010), + q(0), + ], + q(ala-lc romanization, 1997 edition) => [ + q(0008), + q(0), + ], + q(aluku dialect) => [ + q(0009), + q(0), + ], + q(americanist phonetic notation) => [ + q(0030), + q(1), + ], + q(anglo-cornish) => [ + q(0025), + q(2), + ], + q(asante twi) => [ + q(0014), + q(0), + ], + q(ashanti twi) => [ + q(0014), + q(1), + ], + q(aukan dialect) => [ + q(0049), + q(1), + ], + q(basic english) => [ + q(0018), + q(0), + ], + q(belarusian in taraskievica orthography) => [ + q(0076), + q(0), + ], + q(biscayan dialect of basque) => [ + q(0020), + q(0), + ], + q(boni dialect) => [ + q(0009), + q(1), + ], + q(boontling) => [ + q(0023), + q(0), + ], + q(buddhist hybrid sanskrit) => [ + q(0019), + q(0), + ], + q(bulgarian in 1899 orthography) => [ + q(0038), + q(0), + ], + q(classic volapuk) => [ + q(0064), + q(3), + ], + q(classical sanskrit) => [ + q(0044), + q(0), + ], + q(common cornish orthography of revived cornish) => [ + q(0041), + q(0), + ], + q(cornish english) => [ + q(0025), + q(1), + ], + q(cornu-english) => [ + q(0025), + q(0), + ], + q(de jong's volapuk) => [ + q(0053), + q(3), + ], + q(early modern english (1500-1700)) => [ + q(0028), + q(0), + ], + q(early modern french) => [ + q(0002), + q(0), + ], + q(eastern armenian) => [ + q(0012), + q(0), + ], + q(epic sanskrit) => [ + q(0037), + q(0), + ], + q(german orthography of 1996) => [ + q(0006), + q(0), + ], + q(hepburn romanization) => [ + q(0033), + q(0), + ], + q(international phonetic alphabet) => [ + q(0029), + q(0), + ], + q(jauer dialect of romansh) => [ + q(0039), + q(0), + ], + q(jyutping cantonese romanization) => [ + q(0040), + q(0), + ], + q(kernowek standard) => [ + q(0043), + q(1), + ], + q(late middle french (to 1606)) => [ + q(0001), + q(0), + ], + q(modern volapuk) => [ + q(0053), + q(6), + ], + q(monotonic greek) => [ + q(0048), + q(0), + ], + q(nadiza dialect) => [ + q(0050), + q(1), + ], + q(natisone dialect) => [ + q(0050), + q(0), + ], + q(ndyuka dialect) => [ + q(0049), + q(0), + ], + q(new volapuk) => [ + q(0053), + q(4), + ], + q(newfoundland english) => [ + q(0051), + q(0), + ], + q(north american phonetic alphabet) => [ + q(0030), + q(0), + ], + q(norwegian in hognorsk (high norwegian) orthography) => [ + q(0034), + q(0), + ], + q(original volapuk) => [ + q(0064), + q(2), + ], + q(orthographic formulation of 1943 - official in brazil (formulario ortografico de 1943 - oficial no brasil)) => [ + q(0007), + q(0), + ], + q(oxford english dictionary spelling) => [ + q(0055), + q(0), + ], + q(pahawh hmong final version orthography) => [ + q(0058), + q(0), + ], + q(pahawh hmong second stage reduced orthography) => [ + q(0056), + q(0), + ], + q(pahawh hmong third stage reduced orthography) => [ + q(0057), + q(0), + ], + q(pamaka dialect) => [ + q(0059), + q(0), + ], + q(petrine orthography) => [ + q(0060), + q(0), + ], + q(pinyin romanization) => [ + q(0061), + q(0), + ], + q(polytonic greek) => [ + q(0062), + q(0), + ], + q(portuguese language orthographic agreement of 1990 (acordo ortografico da lingua portuguesa de 1990)) => [ + q(0011), + q(0), + ], + q(portuguese-brazilian orthographic convention of 1945 (convencao ortografica luso-brasileira de 1945)) => [ + q(0024), + q(0), + ], + q(post-1917 russian orthography) => [ + q(0046), + q(0), + ], + q(puter idiom of romansh) => [ + q(0063), + q(0), + ], + q(resian) => [ + q(0065), + q(0), + ], + q(resianic) => [ + q(0065), + q(1), + ], + q(revised volapuk) => [ + q(0053), + q(5), + ], + q(rezijan) => [ + q(0065), + q(2), + ], + q(rumantsch grischun) => [ + q(0066), + q(0), + ], + q(schleyer's volapuk) => [ + q(0064), + q(1), + ], + q(scottish standard english) => [ + q(0067), + q(0), + ], + q(scouse) => [ + q(0068), + q(0), + ], + q(serbian with ekavian pronunciation) => [ + q(0027), + q(0), + ], + q(serbian with ijekavian pronunciation) => [ + q(0036), + q(0), + ], + q(simplified form) => [ + q(0069), + q(0), + ], + q(slovene in bohoric alphabet) => [ + q(0022), + q(0), + ], + q(slovene in dajnko alphabet) => [ + q(0026), + q(0), + ], + q(slovene in metelko alphabet) => [ + q(0047), + q(0), + ], + q(spanglish) => [ + q(0072), + q(0), + ], + q(standard cornish orthography of revived cornish) => [ + q(0043), + q(0), + ], + q(standard h-system orthographic fallback for spelling esperanto) => [ + q(0035), + q(0), + ], + q(standard x-system orthographic fallback for spelling esperanto) => [ + q(0085), + q(0), + ], + q(standardized resian orthography) => [ + q(0005), + q(0), + ], + q(surmiran idiom of romansh) => [ + q(0073), + q(0), + ], + q(sursilvan idiom of romansh) => [ + q(0074), + q(0), + ], + q(sutsilvan idiom of romansh) => [ + q(0075), + q(0), + ], + q(the balanka dialect of anii) => [ + q(0016), + q(0), + ], + q(the barlavento dialect group of kabuverdianu) => [ + q(0017), + q(0), + ], + q(the bila dialect of resian) => [ + q(0021), + q(1), + ], + q(the gniva dialect of resian) => [ + q(0052), + q(0), + ], + q(the kociewie dialect of polish) => [ + q(0042), + q(0), + ], + q(the lipovaz dialect of resian) => [ + q(0045), + q(0), + ], + q(the lipovec dialect of resian) => [ + q(0045), + q(1), + ], + q(the njiva dialect of resian) => [ + q(0052), + q(1), + ], + q(the oseacco dialect of resian) => [ + q(0054), + q(0), + ], + q(the osojane dialect of resian) => [ + q(0054), + q(1), + ], + q(the san giorgio dialect of resian) => [ + q(0021), + q(0), + ], + q(the solbica dialect of resian) => [ + q(0070), + q(1), + ], + q(the sotavento dialect group of kabuverdianu) => [ + q(0071), + q(0), + ], + q(the stolvizza dialect of resian) => [ + q(0070), + q(0), + ], + q(traditional german orthography) => [ + q(0003), + q(0), + ], + q(ulster dialect of scots) => [ + q(0079), + q(0), + ], + q(unified cornish orthography of revived cornish) => [ + q(0077), + q(0), + ], + q(unified cornish revised orthography of revived cornish) => [ + q(0078), + q(0), + ], + q(unified turkic latin alphabet (historical)) => [ + q(0015), + q(0), + ], + q(unifon phonetic alphabet) => [ + q(0080), + q(0), + ], + q(uralic phonetic alphabet) => [ + q(0031), + q(0), + ], + q(valencian) => [ + q(0082), + q(0), + ], + q(vallader idiom of romansh) => [ + q(0083), + q(0), + ], + q(vedic sanskrit) => [ + q(0081), + q(0), + ], + q(volapuk nuladik) => [ + q(0053), + q(2), + ], + q(volapuk nulik) => [ + q(0053), + q(0), + ], + q(volapuk perevidol) => [ + q(0053), + q(1), + ], + q(volapuk rigik) => [ + q(0064), + q(0), + ], + q(wade-giles romanization) => [ + q(0084), + q(0), + ], + q(western armenian) => [ + q(0013), + q(0), + ], + q(x-sampa transcription) => [ + q(0032), + q(0), + ], +}; + +$Locale::Codes::Data{'langvar'}{'code2id'} = { + q(alpha) => { + q(1606nict) => [ + q(0001), + q(0), + ], + q(1694acad) => [ + q(0002), + q(0), + ], + q(1901) => [ + q(0003), + q(0), + ], + q(1959acad) => [ + q(0004), + q(0), + ], + q(1994) => [ + q(0005), + q(0), + ], + q(1996) => [ + q(0006), + q(0), + ], + q(abl1943) => [ + q(0007), + q(0), + ], + q(akuapem) => [ + q(0010), + q(0), + ], + q(alalc97) => [ + q(0008), + q(0), + ], + q(aluku) => [ + q(0009), + q(0), + ], + q(ao1990) => [ + q(0011), + q(0), + ], + q(arevela) => [ + q(0012), + q(0), + ], + q(arevmda) => [ + q(0013), + q(0), + ], + q(asante) => [ + q(0014), + q(0), + ], + q(baku1926) => [ + q(0015), + q(0), + ], + q(balanka) => [ + q(0016), + q(0), + ], + q(barla) => [ + q(0017), + q(0), + ], + q(basiceng) => [ + q(0018), + q(0), + ], + q(bauddha) => [ + q(0019), + q(0), + ], + q(biscayan) => [ + q(0020), + q(0), + ], + q(biske) => [ + q(0021), + q(0), + ], + q(bohoric) => [ + q(0022), + q(0), + ], + q(boont) => [ + q(0023), + q(0), + ], + q(colb1945) => [ + q(0024), + q(0), + ], + q(cornu) => [ + q(0025), + q(0), + ], + q(dajnko) => [ + q(0026), + q(0), + ], + q(ekavsk) => [ + q(0027), + q(0), + ], + q(emodeng) => [ + q(0028), + q(0), + ], + q(fonipa) => [ + q(0029), + q(0), + ], + q(fonnapa) => [ + q(0030), + q(0), + ], + q(fonupa) => [ + q(0031), + q(0), + ], + q(fonxsamp) => [ + q(0032), + q(0), + ], + q(hepburn) => [ + q(0033), + q(0), + ], + q(hognorsk) => [ + q(0034), + q(0), + ], + q(hsistemo) => [ + q(0035), + q(0), + ], + q(ijekavsk) => [ + q(0036), + q(0), + ], + q(itihasa) => [ + q(0037), + q(0), + ], + q(ivanchov) => [ + q(0038), + q(0), + ], + q(jauer) => [ + q(0039), + q(0), + ], + q(jyutping) => [ + q(0040), + q(0), + ], + q(kkcor) => [ + q(0041), + q(0), + ], + q(kociewie) => [ + q(0042), + q(0), + ], + q(kscor) => [ + q(0043), + q(0), + ], + q(laukika) => [ + q(0044), + q(0), + ], + q(lipaw) => [ + q(0045), + q(0), + ], + q(luna1918) => [ + q(0046), + q(0), + ], + q(metelko) => [ + q(0047), + q(0), + ], + q(monoton) => [ + q(0048), + q(0), + ], + q(ndyuka) => [ + q(0049), + q(0), + ], + q(nedis) => [ + q(0050), + q(0), + ], + q(newfound) => [ + q(0051), + q(0), + ], + q(njiva) => [ + q(0052), + q(0), + ], + q(nulik) => [ + q(0053), + q(0), + ], + q(osojs) => [ + q(0054), + q(0), + ], + q(oxendict) => [ + q(0055), + q(0), + ], + q(pahawh2) => [ + q(0056), + q(0), + ], + q(pahawh3) => [ + q(0057), + q(0), + ], + q(pahawh4) => [ + q(0058), + q(0), + ], + q(pamaka) => [ + q(0059), + q(0), + ], + q(petr1708) => [ + q(0060), + q(0), + ], + q(pinyin) => [ + q(0061), + q(0), + ], + q(polyton) => [ + q(0062), + q(0), + ], + q(puter) => [ + q(0063), + q(0), + ], + q(rigik) => [ + q(0064), + q(0), + ], + q(rozaj) => [ + q(0065), + q(0), + ], + q(rumgr) => [ + q(0066), + q(0), + ], + q(scotland) => [ + q(0067), + q(0), + ], + q(scouse) => [ + q(0068), + q(0), + ], + q(simple) => [ + q(0069), + q(0), + ], + q(solba) => [ + q(0070), + q(0), + ], + q(sotav) => [ + q(0071), + q(0), + ], + q(spanglis) => [ + q(0072), + q(0), + ], + q(surmiran) => [ + q(0073), + q(0), + ], + q(sursilv) => [ + q(0074), + q(0), + ], + q(sutsilv) => [ + q(0075), + q(0), + ], + q(tarask) => [ + q(0076), + q(0), + ], + q(uccor) => [ + q(0077), + q(0), + ], + q(ucrcor) => [ + q(0078), + q(0), + ], + q(ulster) => [ + q(0079), + q(0), + ], + q(unifon) => [ + q(0080), + q(0), + ], + q(vaidika) => [ + q(0081), + q(0), + ], + q(valencia) => [ + q(0082), + q(0), + ], + q(vallader) => [ + q(0083), + q(0), + ], + q(wadegile) => [ + q(0084), + q(0), + ], + q(xsistemo) => [ + q(0085), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'langvar'}{'id2code'} = { + q(alpha) => { + q(0001) => q(1606nict), + q(0002) => q(1694acad), + q(0003) => q(1901), + q(0004) => q(1959acad), + q(0005) => q(1994), + q(0006) => q(1996), + q(0007) => q(abl1943), + q(0008) => q(alalc97), + q(0009) => q(aluku), + q(0010) => q(akuapem), + q(0011) => q(ao1990), + q(0012) => q(arevela), + q(0013) => q(arevmda), + q(0014) => q(asante), + q(0015) => q(baku1926), + q(0016) => q(balanka), + q(0017) => q(barla), + q(0018) => q(basiceng), + q(0019) => q(bauddha), + q(0020) => q(biscayan), + q(0021) => q(biske), + q(0022) => q(bohoric), + q(0023) => q(boont), + q(0024) => q(colb1945), + q(0025) => q(cornu), + q(0026) => q(dajnko), + q(0027) => q(ekavsk), + q(0028) => q(emodeng), + q(0029) => q(fonipa), + q(0030) => q(fonnapa), + q(0031) => q(fonupa), + q(0032) => q(fonxsamp), + q(0033) => q(hepburn), + q(0034) => q(hognorsk), + q(0035) => q(hsistemo), + q(0036) => q(ijekavsk), + q(0037) => q(itihasa), + q(0038) => q(ivanchov), + q(0039) => q(jauer), + q(0040) => q(jyutping), + q(0041) => q(kkcor), + q(0042) => q(kociewie), + q(0043) => q(kscor), + q(0044) => q(laukika), + q(0045) => q(lipaw), + q(0046) => q(luna1918), + q(0047) => q(metelko), + q(0048) => q(monoton), + q(0049) => q(ndyuka), + q(0050) => q(nedis), + q(0051) => q(newfound), + q(0052) => q(njiva), + q(0053) => q(nulik), + q(0054) => q(osojs), + q(0055) => q(oxendict), + q(0056) => q(pahawh2), + q(0057) => q(pahawh3), + q(0058) => q(pahawh4), + q(0059) => q(pamaka), + q(0060) => q(petr1708), + q(0061) => q(pinyin), + q(0062) => q(polyton), + q(0063) => q(puter), + q(0064) => q(rigik), + q(0065) => q(rozaj), + q(0066) => q(rumgr), + q(0067) => q(scotland), + q(0068) => q(scouse), + q(0069) => q(simple), + q(0070) => q(solba), + q(0071) => q(sotav), + q(0072) => q(spanglis), + q(0073) => q(surmiran), + q(0074) => q(sursilv), + q(0075) => q(sutsilv), + q(0076) => q(tarask), + q(0077) => q(uccor), + q(0078) => q(ucrcor), + q(0079) => q(ulster), + q(0080) => q(unifon), + q(0081) => q(vaidika), + q(0082) => q(valencia), + q(0083) => q(vallader), + q(0084) => q(wadegile), + q(0085) => q(xsistemo), + }, +}; + +1; +package # +Locale::Codes::Script_Codes; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'harvest_data' is run. +# Generated on: Fri Feb 23 12:55:05 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Data{'script'}{'id'} = '0195'; + +$Locale::Codes::Data{'script'}{'id2names'} = { + q(0001) => [ + q(Adlam), + ], + q(0002) => [ + q(Afaka), + ], + q(0003) => [ + q(Caucasian Albanian), + ], + q(0004) => [ + q(Ahom, Tai Ahom), + q(Ahom), + q(Tai Ahom), + ], + q(0005) => [ + q(Arabic), + ], + q(0006) => [ + q(Arabic (Nastaliq variant)), + ], + q(0007) => [ + q(Imperial Aramaic), + ], + q(0008) => [ + q(Armenian), + ], + q(0009) => [ + q(Avestan), + ], + q(0010) => [ + q(Balinese), + ], + q(0011) => [ + q(Bamum), + ], + q(0012) => [ + q(Bassa Vah), + ], + q(0013) => [ + q(Batak), + ], + q(0014) => [ + q(Bengali (Bangla)), + q(Bengali), + q(Bangla), + ], + q(0015) => [ + q(Bhaiksuki), + ], + q(0016) => [ + q(Blissymbols), + ], + q(0017) => [ + q(Bopomofo), + ], + q(0018) => [ + q(Brahmi), + ], + q(0019) => [ + q(Braille), + ], + q(0020) => [ + q(Buginese), + ], + q(0021) => [ + q(Buhid), + ], + q(0022) => [ + q(Chakma), + ], + q(0023) => [ + q(Unified Canadian Aboriginal Syllabics), + ], + q(0024) => [ + q(Carian), + ], + q(0025) => [ + q(Cham), + ], + q(0026) => [ + q(Cherokee), + ], + q(0027) => [ + q(Cirth), + ], + q(0028) => [ + q(Coptic), + ], + q(0029) => [ + q(Cypro-Minoan), + ], + q(0030) => [ + q(Cypriot syllabary), + ], + q(0031) => [ + q(Cyrillic), + ], + q(0032) => [ + q(Cyrillic (Old Church Slavonic variant)), + ], + q(0033) => [ + q(Devanagari (Nagari)), + q(Devanagari), + q(Nagari), + ], + q(0034) => [ + q(Dogra), + ], + q(0035) => [ + q(Deseret (Mormon)), + q(Deseret), + q(Mormon), + ], + q(0036) => [ + q(Duployan shorthand, Duployan stenography), + q(Duployan shorthand), + q(Duployan stenography), + ], + q(0037) => [ + q(Egyptian demotic), + ], + q(0038) => [ + q(Egyptian hieratic), + ], + q(0039) => [ + q(Egyptian hieroglyphs), + ], + q(0040) => [ + q(Elbasan), + ], + q(0041) => [ + q(Ethiopic (Geez)), + q(Ethiopic), + q(Ge'ez), + ], + q(0042) => [ + q(Khutsuri (Asomtavruli and Nuskhuri)), + ], + q(0043) => [ + q(Georgian (Mkhedruli and Mtavruli)), + ], + q(0044) => [ + q(Glagolitic), + ], + q(0045) => [ + q(Gunjala Gondi), + ], + q(0046) => [ + q(Masaram Gondi), + ], + q(0047) => [ + q(Gothic), + ], + q(0048) => [ + q(Grantha), + ], + q(0049) => [ + q(Greek), + ], + q(0050) => [ + q(Gujarati), + ], + q(0051) => [ + q(Gurmukhi), + ], + q(0052) => [ + q(Han with Bopomofo (alias for Han + Bopomofo)), + ], + q(0053) => [ + q(Hangul (Hangul, Hangeul)), + q(Hangul), + q(Hangeul), + ], + q(0054) => [ + q(Han (Hanzi, Kanji, Hanja)), + q(Han), + q(Hanzi), + q(Kanji), + q(Hanja), + ], + q(0055) => [ + q(Hanunoo (Hanunoo)), + q(Hanunoo), + ], + q(0056) => [ + q(Han (Simplified variant)), + ], + q(0057) => [ + q(Han (Traditional variant)), + ], + q(0058) => [ + q(Hatran), + ], + q(0059) => [ + q(Hebrew), + ], + q(0060) => [ + q(Hiragana), + ], + q(0061) => [ + q(Anatolian Hieroglyphs (Luwian Hieroglyphs, Hittite Hieroglyphs)), + q(Anatolian Hieroglyphs), + q(Luwian Hieroglyphs), + q(Hittite Hieroglyphs), + ], + q(0062) => [ + q(Pahawh Hmong), + ], + q(0063) => [ + q(Nyiakeng Puachue Hmong), + ], + q(0064) => [ + q(Japanese syllabaries (alias for Hiragana + Katakana)), + ], + q(0065) => [ + q(Old Hungarian (Hungarian Runic)), + q(Old Hungarian), + q(Hungarian Runic), + ], + q(0066) => [ + q(Indus (Harappan)), + q(Indus), + q(Harappan), + ], + q(0067) => [ + q(Old Italic (Etruscan, Oscan, etc.)), + ], + q(0068) => [ + q(Jamo (alias for Jamo subset of Hangul)), + ], + q(0069) => [ + q(Javanese), + ], + q(0070) => [ + q(Japanese (alias for Han + Hiragana + Katakana)), + ], + q(0071) => [ + q(Jurchen), + ], + q(0072) => [ + q(Kayah Li), + ], + q(0073) => [ + q(Katakana), + ], + q(0074) => [ + q(Kharoshthi), + ], + q(0075) => [ + q(Khmer), + ], + q(0076) => [ + q(Khojki), + ], + q(0077) => [ + q(Khitan large script), + ], + q(0078) => [ + q(Khitan small script), + ], + q(0079) => [ + q(Kannada), + ], + q(0080) => [ + q(Korean (alias for Hangul + Han)), + ], + q(0081) => [ + q(Kpelle), + ], + q(0082) => [ + q(Kaithi), + ], + q(0083) => [ + q(Tai Tham (Lanna)), + q(Tai Tham), + q(Lanna), + ], + q(0084) => [ + q(Lao), + ], + q(0085) => [ + q(Latin (Fraktur variant)), + ], + q(0086) => [ + q(Latin (Gaelic variant)), + ], + q(0087) => [ + q(Latin), + ], + q(0088) => [ + q(Leke), + ], + q(0089) => [ + q(Lepcha (Rong)), + q(Lepcha), + q(Rong), + ], + q(0090) => [ + q(Limbu), + ], + q(0091) => [ + q(Linear A), + ], + q(0092) => [ + q(Linear B), + ], + q(0093) => [ + q(Lisu (Fraser)), + q(Lisu), + q(Fraser), + ], + q(0094) => [ + q(Loma), + ], + q(0095) => [ + q(Lycian), + ], + q(0096) => [ + q(Lydian), + ], + q(0097) => [ + q(Mahajani), + ], + q(0098) => [ + q(Makasar), + ], + q(0099) => [ + q(Mandaic, Mandaean), + q(Mandaic), + q(Mandaean), + ], + q(0100) => [ + q(Manichaean), + ], + q(0101) => [ + q(Marchen), + ], + q(0102) => [ + q(Mayan hieroglyphs), + ], + q(0103) => [ + q(Medefaidrin (Oberi Okaime, Oberi Okaime)), + q(Medefaidrin), + q(Oberi Okaime), + ], + q(0104) => [ + q(Mende Kikakui), + ], + q(0105) => [ + q(Meroitic Cursive), + ], + q(0106) => [ + q(Meroitic Hieroglyphs), + ], + q(0107) => [ + q(Malayalam), + ], + q(0108) => [ + q(Modi, Modi), + q(Modi), + ], + q(0109) => [ + q(Mongolian), + ], + q(0110) => [ + q(Moon (Moon code, Moon script, Moon type)), + q(Moon), + q(Moon code), + q(Moon script), + q(Moon type), + ], + q(0111) => [ + q(Mro, Mru), + q(Mro), + q(Mru), + ], + q(0112) => [ + q(Meitei Mayek (Meithei, Meetei)), + q(Meitei Mayek), + q(Meithei), + q(Meetei), + ], + q(0113) => [ + q(Multani), + ], + q(0114) => [ + q(Myanmar (Burmese)), + q(Myanmar), + q(Burmese), + ], + q(0115) => [ + q(Old North Arabian (Ancient North Arabian)), + q(Old North Arabian), + q(Ancient North Arabian), + ], + q(0116) => [ + q(Nabataean), + ], + q(0117) => [ + q(Newa, Newar, Newari, Nepala lipi), + q(Newa), + q(Newar), + q(Newari), + q(Nepala lipi), + ], + q(0118) => [ + q(Naxi Dongba (Nakhi Tomba)), + q(Naxi Dongba), + q(Nakhi Tomba), + ], + q(0119) => [ + q(Naxi Geba (Nakhi Geba, 'Na-'Khi Ggo-baw)), + q(Naxi Geba), + q(Nakhi Geba), + q('Na-'Khi Ggo-baw), + ], + q(0120) => [ + q(N'Ko), + ], + q(0121) => [ + q(Nushu), + ], + q(0122) => [ + q(Ogham), + ], + q(0123) => [ + q(Ol Chiki (Ol Cemet, Ol, Santali)), + q(Ol Chiki), + q(Ol Cemet'), + q(Ol), + q(Santali), + ], + q(0124) => [ + q(Old Turkic, Orkhon Runic), + q(Old Turkic), + q(Orkhon Runic), + ], + q(0125) => [ + q(Oriya (Odia)), + q(Oriya), + q(Odia), + ], + q(0126) => [ + q(Osage), + ], + q(0127) => [ + q(Osmanya), + ], + q(0128) => [ + q(Palmyrene), + ], + q(0129) => [ + q(Pau Cin Hau), + ], + q(0130) => [ + q(Old Permic), + ], + q(0131) => [ + q(Phags-pa), + ], + q(0132) => [ + q(Inscriptional Pahlavi), + ], + q(0133) => [ + q(Psalter Pahlavi), + ], + q(0134) => [ + q(Book Pahlavi), + ], + q(0135) => [ + q(Phoenician), + ], + q(0136) => [ + q(Miao (Pollard)), + q(Miao), + q(Pollard), + ], + q(0137) => [ + q(Klingon (KLI pIqaD)), + ], + q(0138) => [ + q(Inscriptional Parthian), + ], + q(0139) => [ + q(Reserved for private use (start)), + ], + q(0140) => [ + q(Reserved for private use (end)), + ], + q(0141) => [ + q(Rejang (Redjang, Kaganga)), + q(Rejang), + q(Redjang), + q(Kaganga), + ], + q(0142) => [ + q(Hanifi Rohingya), + ], + q(0143) => [ + q(Rongorongo), + ], + q(0144) => [ + q(Runic), + ], + q(0145) => [ + q(Samaritan), + ], + q(0146) => [ + q(Sarati), + ], + q(0147) => [ + q(Old South Arabian), + ], + q(0148) => [ + q(Saurashtra), + ], + q(0149) => [ + q(SignWriting), + ], + q(0150) => [ + q(Shavian (Shaw)), + q(Shavian), + q(Shaw), + ], + q(0151) => [ + q(Sharada, Sarada), + q(Sharada), + q(Sarada), + ], + q(0152) => [ + q(Shuishu), + ], + q(0153) => [ + q(Siddham, Siddham, Siddhamatrka), + q(Siddham), + q(Siddhamatrka), + ], + q(0154) => [ + q(Khudawadi, Sindhi), + q(Khudawadi), + q(Sindhi), + ], + q(0155) => [ + q(Sinhala), + ], + q(0156) => [ + q(Sogdian), + ], + q(0157) => [ + q(Old Sogdian), + ], + q(0158) => [ + q(Sora Sompeng), + ], + q(0159) => [ + q(Soyombo), + ], + q(0160) => [ + q(Sundanese), + ], + q(0161) => [ + q(Syloti Nagri), + ], + q(0162) => [ + q(Syriac), + ], + q(0163) => [ + q(Syriac (Estrangelo variant)), + ], + q(0164) => [ + q(Syriac (Western variant)), + ], + q(0165) => [ + q(Syriac (Eastern variant)), + ], + q(0166) => [ + q(Tagbanwa), + ], + q(0167) => [ + q(Takri, Takri, Tankri), + q(Takri), + q(Tankri), + ], + q(0168) => [ + q(Tai Le), + ], + q(0169) => [ + q(New Tai Lue), + ], + q(0170) => [ + q(Tamil), + ], + q(0171) => [ + q(Tangut), + ], + q(0172) => [ + q(Tai Viet), + ], + q(0173) => [ + q(Telugu), + ], + q(0174) => [ + q(Tengwar), + ], + q(0175) => [ + q(Tifinagh (Berber)), + q(Tifinagh), + q(Berber), + ], + q(0176) => [ + q(Tagalog (Baybayin, Alibata)), + q(Tagalog), + q(Baybayin), + q(Alibata), + ], + q(0177) => [ + q(Thaana), + ], + q(0178) => [ + q(Thai), + ], + q(0179) => [ + q(Tibetan), + ], + q(0180) => [ + q(Tirhuta), + ], + q(0181) => [ + q(Ugaritic), + ], + q(0182) => [ + q(Vai), + ], + q(0183) => [ + q(Visible Speech), + ], + q(0184) => [ + q(Warang Citi (Varang Kshiti)), + q(Warang Citi), + q(Varang Kshiti), + ], + q(0185) => [ + q(Wancho), + ], + q(0186) => [ + q(Woleai), + ], + q(0187) => [ + q(Old Persian), + ], + q(0188) => [ + q(Cuneiform, Sumero-Akkadian), + q(Sumero-Akkadian cuneiform), + ], + q(0189) => [ + q(Yi), + ], + q(0190) => [ + q(Zanabazar Square (Zanabazarin Dorboljin Useg, Xewtee Dorboljin Bicig, Horizontal Square Script)), + q(Zanabazar Square), + q(Zanabazarin Dorboljin Useg), + q(Xewtee Dorboljin Bicig), + q(Horizontal Square Script), + ], + q(0191) => [ + q(Code for inherited script), + ], + q(0192) => [ + q(Mathematical notation), + ], + q(0193) => [ + q(Symbols (Emoji variant)), + ], + q(0194) => [ + q(Symbols), + ], +}; + +$Locale::Codes::Data{'script'}{'alias2id'} = { + q('na-'khi ggo-baw) => [ + q(0119), + q(3), + ], + q(adlam) => [ + q(0001), + q(0), + ], + q(afaka) => [ + q(0002), + q(0), + ], + q(ahom) => [ + q(0004), + q(1), + ], + q(ahom, tai ahom) => [ + q(0004), + q(0), + ], + q(alibata) => [ + q(0176), + q(3), + ], + q(anatolian hieroglyphs) => [ + q(0061), + q(1), + ], + q(anatolian hieroglyphs (luwian hieroglyphs, hittite hieroglyphs)) => [ + q(0061), + q(0), + ], + q(ancient north arabian) => [ + q(0115), + q(2), + ], + q(arabic) => [ + q(0005), + q(0), + ], + q(arabic (nastaliq variant)) => [ + q(0006), + q(0), + ], + q(armenian) => [ + q(0008), + q(0), + ], + q(avestan) => [ + q(0009), + q(0), + ], + q(balinese) => [ + q(0010), + q(0), + ], + q(bamum) => [ + q(0011), + q(0), + ], + q(bangla) => [ + q(0014), + q(2), + ], + q(bassa vah) => [ + q(0012), + q(0), + ], + q(batak) => [ + q(0013), + q(0), + ], + q(baybayin) => [ + q(0176), + q(2), + ], + q(bengali) => [ + q(0014), + q(1), + ], + q(bengali (bangla)) => [ + q(0014), + q(0), + ], + q(berber) => [ + q(0175), + q(2), + ], + q(bhaiksuki) => [ + q(0015), + q(0), + ], + q(blissymbols) => [ + q(0016), + q(0), + ], + q(book pahlavi) => [ + q(0134), + q(0), + ], + q(bopomofo) => [ + q(0017), + q(0), + ], + q(brahmi) => [ + q(0018), + q(0), + ], + q(braille) => [ + q(0019), + q(0), + ], + q(buginese) => [ + q(0020), + q(0), + ], + q(buhid) => [ + q(0021), + q(0), + ], + q(burmese) => [ + q(0114), + q(2), + ], + q(carian) => [ + q(0024), + q(0), + ], + q(caucasian albanian) => [ + q(0003), + q(0), + ], + q(chakma) => [ + q(0022), + q(0), + ], + q(cham) => [ + q(0025), + q(0), + ], + q(cherokee) => [ + q(0026), + q(0), + ], + q(cirth) => [ + q(0027), + q(0), + ], + q(code for inherited script) => [ + q(0191), + q(0), + ], + q(coptic) => [ + q(0028), + q(0), + ], + q(cuneiform, sumero-akkadian) => [ + q(0188), + q(0), + ], + q(cypriot syllabary) => [ + q(0030), + q(0), + ], + q(cypro-minoan) => [ + q(0029), + q(0), + ], + q(cyrillic) => [ + q(0031), + q(0), + ], + q(cyrillic (old church slavonic variant)) => [ + q(0032), + q(0), + ], + q(deseret) => [ + q(0035), + q(1), + ], + q(deseret (mormon)) => [ + q(0035), + q(0), + ], + q(devanagari) => [ + q(0033), + q(1), + ], + q(devanagari (nagari)) => [ + q(0033), + q(0), + ], + q(dogra) => [ + q(0034), + q(0), + ], + q(duployan shorthand) => [ + q(0036), + q(1), + ], + q(duployan shorthand, duployan stenography) => [ + q(0036), + q(0), + ], + q(duployan stenography) => [ + q(0036), + q(2), + ], + q(egyptian demotic) => [ + q(0037), + q(0), + ], + q(egyptian hieratic) => [ + q(0038), + q(0), + ], + q(egyptian hieroglyphs) => [ + q(0039), + q(0), + ], + q(elbasan) => [ + q(0040), + q(0), + ], + q(ethiopic) => [ + q(0041), + q(1), + ], + q(ethiopic (geez)) => [ + q(0041), + q(0), + ], + q(fraser) => [ + q(0093), + q(2), + ], + q(ge'ez) => [ + q(0041), + q(2), + ], + q(georgian (mkhedruli and mtavruli)) => [ + q(0043), + q(0), + ], + q(glagolitic) => [ + q(0044), + q(0), + ], + q(gothic) => [ + q(0047), + q(0), + ], + q(grantha) => [ + q(0048), + q(0), + ], + q(greek) => [ + q(0049), + q(0), + ], + q(gujarati) => [ + q(0050), + q(0), + ], + q(gunjala gondi) => [ + q(0045), + q(0), + ], + q(gurmukhi) => [ + q(0051), + q(0), + ], + q(han) => [ + q(0054), + q(1), + ], + q(han (hanzi, kanji, hanja)) => [ + q(0054), + q(0), + ], + q(han (simplified variant)) => [ + q(0056), + q(0), + ], + q(han (traditional variant)) => [ + q(0057), + q(0), + ], + q(han with bopomofo (alias for han + bopomofo)) => [ + q(0052), + q(0), + ], + q(hangeul) => [ + q(0053), + q(2), + ], + q(hangul) => [ + q(0053), + q(1), + ], + q(hangul (hangul, hangeul)) => [ + q(0053), + q(0), + ], + q(hanifi rohingya) => [ + q(0142), + q(0), + ], + q(hanja) => [ + q(0054), + q(4), + ], + q(hanunoo) => [ + q(0055), + q(1), + ], + q(hanunoo (hanunoo)) => [ + q(0055), + q(0), + ], + q(hanzi) => [ + q(0054), + q(2), + ], + q(harappan) => [ + q(0066), + q(2), + ], + q(hatran) => [ + q(0058), + q(0), + ], + q(hebrew) => [ + q(0059), + q(0), + ], + q(hiragana) => [ + q(0060), + q(0), + ], + q(hittite hieroglyphs) => [ + q(0061), + q(3), + ], + q(horizontal square script) => [ + q(0190), + q(4), + ], + q(hungarian runic) => [ + q(0065), + q(2), + ], + q(imperial aramaic) => [ + q(0007), + q(0), + ], + q(indus) => [ + q(0066), + q(1), + ], + q(indus (harappan)) => [ + q(0066), + q(0), + ], + q(inscriptional pahlavi) => [ + q(0132), + q(0), + ], + q(inscriptional parthian) => [ + q(0138), + q(0), + ], + q(jamo (alias for jamo subset of hangul)) => [ + q(0068), + q(0), + ], + q(japanese (alias for han + hiragana + katakana)) => [ + q(0070), + q(0), + ], + q(japanese syllabaries (alias for hiragana + katakana)) => [ + q(0064), + q(0), + ], + q(javanese) => [ + q(0069), + q(0), + ], + q(jurchen) => [ + q(0071), + q(0), + ], + q(kaganga) => [ + q(0141), + q(3), + ], + q(kaithi) => [ + q(0082), + q(0), + ], + q(kanji) => [ + q(0054), + q(3), + ], + q(kannada) => [ + q(0079), + q(0), + ], + q(katakana) => [ + q(0073), + q(0), + ], + q(kayah li) => [ + q(0072), + q(0), + ], + q(kharoshthi) => [ + q(0074), + q(0), + ], + q(khitan large script) => [ + q(0077), + q(0), + ], + q(khitan small script) => [ + q(0078), + q(0), + ], + q(khmer) => [ + q(0075), + q(0), + ], + q(khojki) => [ + q(0076), + q(0), + ], + q(khudawadi) => [ + q(0154), + q(1), + ], + q(khudawadi, sindhi) => [ + q(0154), + q(0), + ], + q(khutsuri (asomtavruli and nuskhuri)) => [ + q(0042), + q(0), + ], + q(klingon (kli piqad)) => [ + q(0137), + q(0), + ], + q(korean (alias for hangul + han)) => [ + q(0080), + q(0), + ], + q(kpelle) => [ + q(0081), + q(0), + ], + q(lanna) => [ + q(0083), + q(2), + ], + q(lao) => [ + q(0084), + q(0), + ], + q(latin) => [ + q(0087), + q(0), + ], + q(latin (fraktur variant)) => [ + q(0085), + q(0), + ], + q(latin (gaelic variant)) => [ + q(0086), + q(0), + ], + q(leke) => [ + q(0088), + q(0), + ], + q(lepcha) => [ + q(0089), + q(1), + ], + q(lepcha (rong)) => [ + q(0089), + q(0), + ], + q(limbu) => [ + q(0090), + q(0), + ], + q(linear a) => [ + q(0091), + q(0), + ], + q(linear b) => [ + q(0092), + q(0), + ], + q(lisu) => [ + q(0093), + q(1), + ], + q(lisu (fraser)) => [ + q(0093), + q(0), + ], + q(loma) => [ + q(0094), + q(0), + ], + q(luwian hieroglyphs) => [ + q(0061), + q(2), + ], + q(lycian) => [ + q(0095), + q(0), + ], + q(lydian) => [ + q(0096), + q(0), + ], + q(mahajani) => [ + q(0097), + q(0), + ], + q(makasar) => [ + q(0098), + q(0), + ], + q(malayalam) => [ + q(0107), + q(0), + ], + q(mandaean) => [ + q(0099), + q(2), + ], + q(mandaic) => [ + q(0099), + q(1), + ], + q(mandaic, mandaean) => [ + q(0099), + q(0), + ], + q(manichaean) => [ + q(0100), + q(0), + ], + q(marchen) => [ + q(0101), + q(0), + ], + q(masaram gondi) => [ + q(0046), + q(0), + ], + q(mathematical notation) => [ + q(0192), + q(0), + ], + q(mayan hieroglyphs) => [ + q(0102), + q(0), + ], + q(medefaidrin) => [ + q(0103), + q(1), + ], + q(medefaidrin (oberi okaime, oberi okaime)) => [ + q(0103), + q(0), + ], + q(meetei) => [ + q(0112), + q(3), + ], + q(meitei mayek) => [ + q(0112), + q(1), + ], + q(meitei mayek (meithei, meetei)) => [ + q(0112), + q(0), + ], + q(meithei) => [ + q(0112), + q(2), + ], + q(mende kikakui) => [ + q(0104), + q(0), + ], + q(meroitic cursive) => [ + q(0105), + q(0), + ], + q(meroitic hieroglyphs) => [ + q(0106), + q(0), + ], + q(miao) => [ + q(0136), + q(1), + ], + q(miao (pollard)) => [ + q(0136), + q(0), + ], + q(modi) => [ + q(0108), + q(1), + ], + q(modi, modi) => [ + q(0108), + q(0), + ], + q(mongolian) => [ + q(0109), + q(0), + ], + q(moon) => [ + q(0110), + q(1), + ], + q(moon (moon code, moon script, moon type)) => [ + q(0110), + q(0), + ], + q(moon code) => [ + q(0110), + q(2), + ], + q(moon script) => [ + q(0110), + q(3), + ], + q(moon type) => [ + q(0110), + q(4), + ], + q(mormon) => [ + q(0035), + q(2), + ], + q(mro) => [ + q(0111), + q(1), + ], + q(mro, mru) => [ + q(0111), + q(0), + ], + q(mru) => [ + q(0111), + q(2), + ], + q(multani) => [ + q(0113), + q(0), + ], + q(myanmar) => [ + q(0114), + q(1), + ], + q(myanmar (burmese)) => [ + q(0114), + q(0), + ], + q(n'ko) => [ + q(0120), + q(0), + ], + q(nabataean) => [ + q(0116), + q(0), + ], + q(nagari) => [ + q(0033), + q(2), + ], + q(nakhi geba) => [ + q(0119), + q(2), + ], + q(nakhi tomba) => [ + q(0118), + q(2), + ], + q(naxi dongba) => [ + q(0118), + q(1), + ], + q(naxi dongba (nakhi tomba)) => [ + q(0118), + q(0), + ], + q(naxi geba) => [ + q(0119), + q(1), + ], + q(naxi geba (nakhi geba, 'na-'khi ggo-baw)) => [ + q(0119), + q(0), + ], + q(nepala lipi) => [ + q(0117), + q(4), + ], + q(new tai lue) => [ + q(0169), + q(0), + ], + q(newa) => [ + q(0117), + q(1), + ], + q(newa, newar, newari, nepala lipi) => [ + q(0117), + q(0), + ], + q(newar) => [ + q(0117), + q(2), + ], + q(newari) => [ + q(0117), + q(3), + ], + q(nushu) => [ + q(0121), + q(0), + ], + q(nyiakeng puachue hmong) => [ + q(0063), + q(0), + ], + q(oberi okaime) => [ + q(0103), + q(2), + ], + q(odia) => [ + q(0125), + q(2), + ], + q(ogham) => [ + q(0122), + q(0), + ], + q(ol) => [ + q(0123), + q(3), + ], + q(ol cemet') => [ + q(0123), + q(2), + ], + q(ol chiki) => [ + q(0123), + q(1), + ], + q(ol chiki (ol cemet, ol, santali)) => [ + q(0123), + q(0), + ], + q(old hungarian) => [ + q(0065), + q(1), + ], + q(old hungarian (hungarian runic)) => [ + q(0065), + q(0), + ], + q(old italic (etruscan, oscan, etc.)) => [ + q(0067), + q(0), + ], + q(old north arabian) => [ + q(0115), + q(1), + ], + q(old north arabian (ancient north arabian)) => [ + q(0115), + q(0), + ], + q(old permic) => [ + q(0130), + q(0), + ], + q(old persian) => [ + q(0187), + q(0), + ], + q(old sogdian) => [ + q(0157), + q(0), + ], + q(old south arabian) => [ + q(0147), + q(0), + ], + q(old turkic) => [ + q(0124), + q(1), + ], + q(old turkic, orkhon runic) => [ + q(0124), + q(0), + ], + q(oriya) => [ + q(0125), + q(1), + ], + q(oriya (odia)) => [ + q(0125), + q(0), + ], + q(orkhon runic) => [ + q(0124), + q(2), + ], + q(osage) => [ + q(0126), + q(0), + ], + q(osmanya) => [ + q(0127), + q(0), + ], + q(pahawh hmong) => [ + q(0062), + q(0), + ], + q(palmyrene) => [ + q(0128), + q(0), + ], + q(pau cin hau) => [ + q(0129), + q(0), + ], + q(phags-pa) => [ + q(0131), + q(0), + ], + q(phoenician) => [ + q(0135), + q(0), + ], + q(pollard) => [ + q(0136), + q(2), + ], + q(psalter pahlavi) => [ + q(0133), + q(0), + ], + q(redjang) => [ + q(0141), + q(2), + ], + q(rejang) => [ + q(0141), + q(1), + ], + q(rejang (redjang, kaganga)) => [ + q(0141), + q(0), + ], + q(reserved for private use (end)) => [ + q(0140), + q(0), + ], + q(reserved for private use (start)) => [ + q(0139), + q(0), + ], + q(rong) => [ + q(0089), + q(2), + ], + q(rongorongo) => [ + q(0143), + q(0), + ], + q(runic) => [ + q(0144), + q(0), + ], + q(samaritan) => [ + q(0145), + q(0), + ], + q(santali) => [ + q(0123), + q(4), + ], + q(sarada) => [ + q(0151), + q(2), + ], + q(sarati) => [ + q(0146), + q(0), + ], + q(saurashtra) => [ + q(0148), + q(0), + ], + q(sharada) => [ + q(0151), + q(1), + ], + q(sharada, sarada) => [ + q(0151), + q(0), + ], + q(shavian) => [ + q(0150), + q(1), + ], + q(shavian (shaw)) => [ + q(0150), + q(0), + ], + q(shaw) => [ + q(0150), + q(2), + ], + q(shuishu) => [ + q(0152), + q(0), + ], + q(siddham) => [ + q(0153), + q(1), + ], + q(siddham, siddham, siddhamatrka) => [ + q(0153), + q(0), + ], + q(siddhamatrka) => [ + q(0153), + q(2), + ], + q(signwriting) => [ + q(0149), + q(0), + ], + q(sindhi) => [ + q(0154), + q(2), + ], + q(sinhala) => [ + q(0155), + q(0), + ], + q(sogdian) => [ + q(0156), + q(0), + ], + q(sora sompeng) => [ + q(0158), + q(0), + ], + q(soyombo) => [ + q(0159), + q(0), + ], + q(sumero-akkadian cuneiform) => [ + q(0188), + q(1), + ], + q(sundanese) => [ + q(0160), + q(0), + ], + q(syloti nagri) => [ + q(0161), + q(0), + ], + q(symbols) => [ + q(0194), + q(0), + ], + q(symbols (emoji variant)) => [ + q(0193), + q(0), + ], + q(syriac) => [ + q(0162), + q(0), + ], + q(syriac (eastern variant)) => [ + q(0165), + q(0), + ], + q(syriac (estrangelo variant)) => [ + q(0163), + q(0), + ], + q(syriac (western variant)) => [ + q(0164), + q(0), + ], + q(tagalog) => [ + q(0176), + q(1), + ], + q(tagalog (baybayin, alibata)) => [ + q(0176), + q(0), + ], + q(tagbanwa) => [ + q(0166), + q(0), + ], + q(tai ahom) => [ + q(0004), + q(2), + ], + q(tai le) => [ + q(0168), + q(0), + ], + q(tai tham) => [ + q(0083), + q(1), + ], + q(tai tham (lanna)) => [ + q(0083), + q(0), + ], + q(tai viet) => [ + q(0172), + q(0), + ], + q(takri) => [ + q(0167), + q(1), + ], + q(takri, takri, tankri) => [ + q(0167), + q(0), + ], + q(tamil) => [ + q(0170), + q(0), + ], + q(tangut) => [ + q(0171), + q(0), + ], + q(tankri) => [ + q(0167), + q(2), + ], + q(telugu) => [ + q(0173), + q(0), + ], + q(tengwar) => [ + q(0174), + q(0), + ], + q(thaana) => [ + q(0177), + q(0), + ], + q(thai) => [ + q(0178), + q(0), + ], + q(tibetan) => [ + q(0179), + q(0), + ], + q(tifinagh) => [ + q(0175), + q(1), + ], + q(tifinagh (berber)) => [ + q(0175), + q(0), + ], + q(tirhuta) => [ + q(0180), + q(0), + ], + q(ugaritic) => [ + q(0181), + q(0), + ], + q(unified canadian aboriginal syllabics) => [ + q(0023), + q(0), + ], + q(vai) => [ + q(0182), + q(0), + ], + q(varang kshiti) => [ + q(0184), + q(2), + ], + q(visible speech) => [ + q(0183), + q(0), + ], + q(wancho) => [ + q(0185), + q(0), + ], + q(warang citi) => [ + q(0184), + q(1), + ], + q(warang citi (varang kshiti)) => [ + q(0184), + q(0), + ], + q(woleai) => [ + q(0186), + q(0), + ], + q(xewtee dorboljin bicig) => [ + q(0190), + q(3), + ], + q(yi) => [ + q(0189), + q(0), + ], + q(zanabazar square) => [ + q(0190), + q(1), + ], + q(zanabazar square (zanabazarin dorboljin useg, xewtee dorboljin bicig, horizontal square script)) => [ + q(0190), + q(0), + ], + q(zanabazarin dorboljin useg) => [ + q(0190), + q(2), + ], +}; + +$Locale::Codes::Data{'script'}{'code2id'} = { + q(alpha) => { + q(Adlm) => [ + q(0001), + q(0), + ], + q(Afak) => [ + q(0002), + q(0), + ], + q(Aghb) => [ + q(0003), + q(0), + ], + q(Ahom) => [ + q(0004), + q(1), + ], + q(Arab) => [ + q(0005), + q(0), + ], + q(Aran) => [ + q(0006), + q(0), + ], + q(Armi) => [ + q(0007), + q(0), + ], + q(Armn) => [ + q(0008), + q(0), + ], + q(Avst) => [ + q(0009), + q(0), + ], + q(Bali) => [ + q(0010), + q(0), + ], + q(Bamu) => [ + q(0011), + q(0), + ], + q(Bass) => [ + q(0012), + q(0), + ], + q(Batk) => [ + q(0013), + q(0), + ], + q(Beng) => [ + q(0014), + q(1), + ], + q(Bhks) => [ + q(0015), + q(0), + ], + q(Blis) => [ + q(0016), + q(0), + ], + q(Bopo) => [ + q(0017), + q(0), + ], + q(Brah) => [ + q(0018), + q(0), + ], + q(Brai) => [ + q(0019), + q(0), + ], + q(Bugi) => [ + q(0020), + q(0), + ], + q(Buhd) => [ + q(0021), + q(0), + ], + q(Cakm) => [ + q(0022), + q(0), + ], + q(Cans) => [ + q(0023), + q(0), + ], + q(Cari) => [ + q(0024), + q(0), + ], + q(Cham) => [ + q(0025), + q(0), + ], + q(Cher) => [ + q(0026), + q(0), + ], + q(Cirt) => [ + q(0027), + q(0), + ], + q(Copt) => [ + q(0028), + q(0), + ], + q(Cpmn) => [ + q(0029), + q(0), + ], + q(Cprt) => [ + q(0030), + q(0), + ], + q(Cyrl) => [ + q(0031), + q(0), + ], + q(Cyrs) => [ + q(0032), + q(0), + ], + q(Deva) => [ + q(0033), + q(1), + ], + q(Dogr) => [ + q(0034), + q(0), + ], + q(Dsrt) => [ + q(0035), + q(1), + ], + q(Dupl) => [ + q(0036), + q(1), + ], + q(Egyd) => [ + q(0037), + q(0), + ], + q(Egyh) => [ + q(0038), + q(0), + ], + q(Egyp) => [ + q(0039), + q(0), + ], + q(Elba) => [ + q(0040), + q(0), + ], + q(Ethi) => [ + q(0041), + q(1), + ], + q(Geok) => [ + q(0042), + q(0), + ], + q(Geor) => [ + q(0043), + q(0), + ], + q(Glag) => [ + q(0044), + q(0), + ], + q(Gong) => [ + q(0045), + q(0), + ], + q(Gonm) => [ + q(0046), + q(0), + ], + q(Goth) => [ + q(0047), + q(0), + ], + q(Gran) => [ + q(0048), + q(0), + ], + q(Grek) => [ + q(0049), + q(0), + ], + q(Gujr) => [ + q(0050), + q(0), + ], + q(Guru) => [ + q(0051), + q(0), + ], + q(Hanb) => [ + q(0052), + q(0), + ], + q(Hang) => [ + q(0053), + q(1), + ], + q(Hani) => [ + q(0054), + q(1), + ], + q(Hano) => [ + q(0055), + q(1), + ], + q(Hans) => [ + q(0056), + q(0), + ], + q(Hant) => [ + q(0057), + q(0), + ], + q(Hatr) => [ + q(0058), + q(0), + ], + q(Hebr) => [ + q(0059), + q(0), + ], + q(Hira) => [ + q(0060), + q(0), + ], + q(Hluw) => [ + q(0061), + q(1), + ], + q(Hmng) => [ + q(0062), + q(0), + ], + q(Hmnp) => [ + q(0063), + q(0), + ], + q(Hrkt) => [ + q(0064), + q(0), + ], + q(Hung) => [ + q(0065), + q(1), + ], + q(Inds) => [ + q(0066), + q(1), + ], + q(Ital) => [ + q(0067), + q(0), + ], + q(Jamo) => [ + q(0068), + q(0), + ], + q(Java) => [ + q(0069), + q(0), + ], + q(Jpan) => [ + q(0070), + q(0), + ], + q(Jurc) => [ + q(0071), + q(0), + ], + q(Kali) => [ + q(0072), + q(0), + ], + q(Kana) => [ + q(0073), + q(0), + ], + q(Khar) => [ + q(0074), + q(0), + ], + q(Khmr) => [ + q(0075), + q(0), + ], + q(Khoj) => [ + q(0076), + q(0), + ], + q(Kitl) => [ + q(0077), + q(0), + ], + q(Kits) => [ + q(0078), + q(0), + ], + q(Knda) => [ + q(0079), + q(0), + ], + q(Kore) => [ + q(0080), + q(0), + ], + q(Kpel) => [ + q(0081), + q(0), + ], + q(Kthi) => [ + q(0082), + q(0), + ], + q(Lana) => [ + q(0083), + q(1), + ], + q(Laoo) => [ + q(0084), + q(0), + ], + q(Latf) => [ + q(0085), + q(0), + ], + q(Latg) => [ + q(0086), + q(0), + ], + q(Latn) => [ + q(0087), + q(0), + ], + q(Leke) => [ + q(0088), + q(0), + ], + q(Lepc) => [ + q(0089), + q(1), + ], + q(Limb) => [ + q(0090), + q(0), + ], + q(Lina) => [ + q(0091), + q(0), + ], + q(Linb) => [ + q(0092), + q(0), + ], + q(Lisu) => [ + q(0093), + q(1), + ], + q(Loma) => [ + q(0094), + q(0), + ], + q(Lyci) => [ + q(0095), + q(0), + ], + q(Lydi) => [ + q(0096), + q(0), + ], + q(Mahj) => [ + q(0097), + q(0), + ], + q(Maka) => [ + q(0098), + q(0), + ], + q(Mand) => [ + q(0099), + q(1), + ], + q(Mani) => [ + q(0100), + q(0), + ], + q(Marc) => [ + q(0101), + q(0), + ], + q(Maya) => [ + q(0102), + q(0), + ], + q(Medf) => [ + q(0103), + q(1), + ], + q(Mend) => [ + q(0104), + q(0), + ], + q(Merc) => [ + q(0105), + q(0), + ], + q(Mero) => [ + q(0106), + q(0), + ], + q(Mlym) => [ + q(0107), + q(0), + ], + q(Modi) => [ + q(0108), + q(1), + ], + q(Mong) => [ + q(0109), + q(0), + ], + q(Moon) => [ + q(0110), + q(1), + ], + q(Mroo) => [ + q(0111), + q(1), + ], + q(Mtei) => [ + q(0112), + q(1), + ], + q(Mult) => [ + q(0113), + q(0), + ], + q(Mymr) => [ + q(0114), + q(1), + ], + q(Narb) => [ + q(0115), + q(1), + ], + q(Nbat) => [ + q(0116), + q(0), + ], + q(Newa) => [ + q(0117), + q(1), + ], + q(Nkdb) => [ + q(0118), + q(1), + ], + q(Nkgb) => [ + q(0119), + q(1), + ], + q(Nkoo) => [ + q(0120), + q(0), + ], + q(Nshu) => [ + q(0121), + q(0), + ], + q(Ogam) => [ + q(0122), + q(0), + ], + q(Olck) => [ + q(0123), + q(1), + ], + q(Orkh) => [ + q(0124), + q(1), + ], + q(Orya) => [ + q(0125), + q(1), + ], + q(Osge) => [ + q(0126), + q(0), + ], + q(Osma) => [ + q(0127), + q(0), + ], + q(Palm) => [ + q(0128), + q(0), + ], + q(Pauc) => [ + q(0129), + q(0), + ], + q(Perm) => [ + q(0130), + q(0), + ], + q(Phag) => [ + q(0131), + q(0), + ], + q(Phli) => [ + q(0132), + q(0), + ], + q(Phlp) => [ + q(0133), + q(0), + ], + q(Phlv) => [ + q(0134), + q(0), + ], + q(Phnx) => [ + q(0135), + q(0), + ], + q(Piqd) => [ + q(0137), + q(0), + ], + q(Plrd) => [ + q(0136), + q(1), + ], + q(Prti) => [ + q(0138), + q(0), + ], + q(Qaaa) => [ + q(0139), + q(0), + ], + q(Qabx) => [ + q(0140), + q(0), + ], + q(Rjng) => [ + q(0141), + q(1), + ], + q(Rohg) => [ + q(0142), + q(0), + ], + q(Roro) => [ + q(0143), + q(0), + ], + q(Runr) => [ + q(0144), + q(0), + ], + q(Samr) => [ + q(0145), + q(0), + ], + q(Sara) => [ + q(0146), + q(0), + ], + q(Sarb) => [ + q(0147), + q(0), + ], + q(Saur) => [ + q(0148), + q(0), + ], + q(Sgnw) => [ + q(0149), + q(0), + ], + q(Shaw) => [ + q(0150), + q(1), + ], + q(Shrd) => [ + q(0151), + q(1), + ], + q(Shui) => [ + q(0152), + q(0), + ], + q(Sidd) => [ + q(0153), + q(1), + ], + q(Sind) => [ + q(0154), + q(1), + ], + q(Sinh) => [ + q(0155), + q(0), + ], + q(Sogd) => [ + q(0156), + q(0), + ], + q(Sogo) => [ + q(0157), + q(0), + ], + q(Sora) => [ + q(0158), + q(0), + ], + q(Soyo) => [ + q(0159), + q(0), + ], + q(Sund) => [ + q(0160), + q(0), + ], + q(Sylo) => [ + q(0161), + q(0), + ], + q(Syrc) => [ + q(0162), + q(0), + ], + q(Syre) => [ + q(0163), + q(0), + ], + q(Syrj) => [ + q(0164), + q(0), + ], + q(Syrn) => [ + q(0165), + q(0), + ], + q(Tagb) => [ + q(0166), + q(0), + ], + q(Takr) => [ + q(0167), + q(1), + ], + q(Tale) => [ + q(0168), + q(0), + ], + q(Talu) => [ + q(0169), + q(0), + ], + q(Taml) => [ + q(0170), + q(0), + ], + q(Tang) => [ + q(0171), + q(0), + ], + q(Tavt) => [ + q(0172), + q(0), + ], + q(Telu) => [ + q(0173), + q(0), + ], + q(Teng) => [ + q(0174), + q(0), + ], + q(Tfng) => [ + q(0175), + q(1), + ], + q(Tglg) => [ + q(0176), + q(1), + ], + q(Thaa) => [ + q(0177), + q(0), + ], + q(Thai) => [ + q(0178), + q(0), + ], + q(Tibt) => [ + q(0179), + q(0), + ], + q(Tirh) => [ + q(0180), + q(0), + ], + q(Ugar) => [ + q(0181), + q(0), + ], + q(Vaii) => [ + q(0182), + q(0), + ], + q(Visp) => [ + q(0183), + q(0), + ], + q(Wara) => [ + q(0184), + q(1), + ], + q(Wcho) => [ + q(0185), + q(0), + ], + q(Wole) => [ + q(0186), + q(0), + ], + q(Xpeo) => [ + q(0187), + q(0), + ], + q(Xsux) => [ + q(0188), + q(1), + ], + q(Yiii) => [ + q(0189), + q(0), + ], + q(Zanb) => [ + q(0190), + q(1), + ], + q(Zinh) => [ + q(0191), + q(0), + ], + q(Zmth) => [ + q(0192), + q(0), + ], + q(Zsye) => [ + q(0193), + q(0), + ], + q(Zsym) => [ + q(0194), + q(0), + ], + }, + q(num) => { + q(020) => [ + q(0188), + q(0), + ], + q(030) => [ + q(0187), + q(0), + ], + q(040) => [ + q(0181), + q(0), + ], + q(050) => [ + q(0039), + q(0), + ], + q(060) => [ + q(0038), + q(0), + ], + q(070) => [ + q(0037), + q(0), + ], + q(080) => [ + q(0061), + q(0), + ], + q(085) => [ + q(0118), + q(0), + ], + q(090) => [ + q(0102), + q(0), + ], + q(095) => [ + q(0149), + q(0), + ], + q(100) => [ + q(0106), + q(0), + ], + q(101) => [ + q(0105), + q(0), + ], + q(105) => [ + q(0147), + q(0), + ], + q(106) => [ + q(0115), + q(0), + ], + q(115) => [ + q(0135), + q(0), + ], + q(116) => [ + q(0096), + q(0), + ], + q(120) => [ + q(0175), + q(0), + ], + q(123) => [ + q(0145), + q(0), + ], + q(124) => [ + q(0007), + q(0), + ], + q(125) => [ + q(0059), + q(0), + ], + q(126) => [ + q(0128), + q(0), + ], + q(127) => [ + q(0058), + q(0), + ], + q(130) => [ + q(0138), + q(0), + ], + q(131) => [ + q(0132), + q(0), + ], + q(132) => [ + q(0133), + q(0), + ], + q(133) => [ + q(0134), + q(0), + ], + q(134) => [ + q(0009), + q(0), + ], + q(135) => [ + q(0162), + q(0), + ], + q(136) => [ + q(0165), + q(0), + ], + q(137) => [ + q(0164), + q(0), + ], + q(138) => [ + q(0163), + q(0), + ], + q(139) => [ + q(0100), + q(0), + ], + q(140) => [ + q(0099), + q(0), + ], + q(141) => [ + q(0156), + q(0), + ], + q(142) => [ + q(0157), + q(0), + ], + q(145) => [ + q(0109), + q(0), + ], + q(159) => [ + q(0116), + q(0), + ], + q(160) => [ + q(0005), + q(0), + ], + q(161) => [ + q(0006), + q(0), + ], + q(165) => [ + q(0120), + q(0), + ], + q(166) => [ + q(0001), + q(0), + ], + q(167) => [ + q(0142), + q(0), + ], + q(170) => [ + q(0177), + q(0), + ], + q(175) => [ + q(0124), + q(0), + ], + q(176) => [ + q(0065), + q(0), + ], + q(200) => [ + q(0049), + q(0), + ], + q(201) => [ + q(0024), + q(0), + ], + q(202) => [ + q(0095), + q(0), + ], + q(204) => [ + q(0028), + q(0), + ], + q(206) => [ + q(0047), + q(0), + ], + q(210) => [ + q(0067), + q(0), + ], + q(211) => [ + q(0144), + q(0), + ], + q(212) => [ + q(0122), + q(0), + ], + q(215) => [ + q(0087), + q(0), + ], + q(216) => [ + q(0086), + q(0), + ], + q(217) => [ + q(0085), + q(0), + ], + q(218) => [ + q(0110), + q(0), + ], + q(219) => [ + q(0126), + q(0), + ], + q(220) => [ + q(0031), + q(0), + ], + q(221) => [ + q(0032), + q(0), + ], + q(225) => [ + q(0044), + q(0), + ], + q(226) => [ + q(0040), + q(0), + ], + q(227) => [ + q(0130), + q(0), + ], + q(230) => [ + q(0008), + q(0), + ], + q(239) => [ + q(0003), + q(0), + ], + q(240) => [ + q(0043), + q(0), + ], + q(241) => [ + q(0042), + q(0), + ], + q(250) => [ + q(0035), + q(0), + ], + q(259) => [ + q(0012), + q(0), + ], + q(260) => [ + q(0127), + q(0), + ], + q(261) => [ + q(0123), + q(0), + ], + q(262) => [ + q(0184), + q(0), + ], + q(263) => [ + q(0129), + q(0), + ], + q(264) => [ + q(0111), + q(0), + ], + q(265) => [ + q(0103), + q(0), + ], + q(280) => [ + q(0183), + q(0), + ], + q(281) => [ + q(0150), + q(0), + ], + q(282) => [ + q(0136), + q(0), + ], + q(283) => [ + q(0185), + q(0), + ], + q(284) => [ + q(0068), + q(0), + ], + q(285) => [ + q(0017), + q(0), + ], + q(286) => [ + q(0053), + q(0), + ], + q(287) => [ + q(0080), + q(0), + ], + q(288) => [ + q(0078), + q(0), + ], + q(290) => [ + q(0174), + q(0), + ], + q(291) => [ + q(0027), + q(0), + ], + q(292) => [ + q(0146), + q(0), + ], + q(293) => [ + q(0137), + q(0), + ], + q(300) => [ + q(0018), + q(0), + ], + q(302) => [ + q(0153), + q(0), + ], + q(305) => [ + q(0074), + q(0), + ], + q(310) => [ + q(0051), + q(0), + ], + q(312) => [ + q(0045), + q(0), + ], + q(313) => [ + q(0046), + q(0), + ], + q(314) => [ + q(0097), + q(0), + ], + q(315) => [ + q(0033), + q(0), + ], + q(316) => [ + q(0161), + q(0), + ], + q(317) => [ + q(0082), + q(0), + ], + q(318) => [ + q(0154), + q(0), + ], + q(319) => [ + q(0151), + q(0), + ], + q(320) => [ + q(0050), + q(0), + ], + q(321) => [ + q(0167), + q(0), + ], + q(322) => [ + q(0076), + q(0), + ], + q(323) => [ + q(0113), + q(0), + ], + q(324) => [ + q(0108), + q(0), + ], + q(325) => [ + q(0014), + q(0), + ], + q(326) => [ + q(0180), + q(0), + ], + q(327) => [ + q(0125), + q(0), + ], + q(328) => [ + q(0034), + q(0), + ], + q(329) => [ + q(0159), + q(0), + ], + q(330) => [ + q(0179), + q(0), + ], + q(331) => [ + q(0131), + q(0), + ], + q(332) => [ + q(0101), + q(0), + ], + q(333) => [ + q(0117), + q(0), + ], + q(334) => [ + q(0015), + q(0), + ], + q(335) => [ + q(0089), + q(0), + ], + q(336) => [ + q(0090), + q(0), + ], + q(337) => [ + q(0112), + q(0), + ], + q(338) => [ + q(0004), + q(0), + ], + q(339) => [ + q(0190), + q(0), + ], + q(340) => [ + q(0173), + q(0), + ], + q(343) => [ + q(0048), + q(0), + ], + q(344) => [ + q(0148), + q(0), + ], + q(345) => [ + q(0079), + q(0), + ], + q(346) => [ + q(0170), + q(0), + ], + q(347) => [ + q(0107), + q(0), + ], + q(348) => [ + q(0155), + q(0), + ], + q(349) => [ + q(0022), + q(0), + ], + q(350) => [ + q(0114), + q(0), + ], + q(351) => [ + q(0083), + q(0), + ], + q(352) => [ + q(0178), + q(0), + ], + q(353) => [ + q(0168), + q(0), + ], + q(354) => [ + q(0169), + q(0), + ], + q(355) => [ + q(0075), + q(0), + ], + q(356) => [ + q(0084), + q(0), + ], + q(357) => [ + q(0072), + q(0), + ], + q(358) => [ + q(0025), + q(0), + ], + q(359) => [ + q(0172), + q(0), + ], + q(360) => [ + q(0010), + q(0), + ], + q(361) => [ + q(0069), + q(0), + ], + q(362) => [ + q(0160), + q(0), + ], + q(363) => [ + q(0141), + q(0), + ], + q(364) => [ + q(0088), + q(0), + ], + q(365) => [ + q(0013), + q(0), + ], + q(366) => [ + q(0098), + q(0), + ], + q(367) => [ + q(0020), + q(0), + ], + q(370) => [ + q(0176), + q(0), + ], + q(371) => [ + q(0055), + q(0), + ], + q(372) => [ + q(0021), + q(0), + ], + q(373) => [ + q(0166), + q(0), + ], + q(398) => [ + q(0158), + q(0), + ], + q(399) => [ + q(0093), + q(0), + ], + q(400) => [ + q(0091), + q(0), + ], + q(401) => [ + q(0092), + q(0), + ], + q(402) => [ + q(0029), + q(0), + ], + q(403) => [ + q(0030), + q(0), + ], + q(410) => [ + q(0060), + q(0), + ], + q(411) => [ + q(0073), + q(0), + ], + q(412) => [ + q(0064), + q(0), + ], + q(413) => [ + q(0070), + q(0), + ], + q(420) => [ + q(0119), + q(0), + ], + q(430) => [ + q(0041), + q(0), + ], + q(435) => [ + q(0011), + q(0), + ], + q(436) => [ + q(0081), + q(0), + ], + q(437) => [ + q(0094), + q(0), + ], + q(438) => [ + q(0104), + q(0), + ], + q(439) => [ + q(0002), + q(0), + ], + q(440) => [ + q(0023), + q(0), + ], + q(445) => [ + q(0026), + q(0), + ], + q(450) => [ + q(0062), + q(0), + ], + q(451) => [ + q(0063), + q(0), + ], + q(460) => [ + q(0189), + q(0), + ], + q(470) => [ + q(0182), + q(0), + ], + q(480) => [ + q(0186), + q(0), + ], + q(499) => [ + q(0121), + q(0), + ], + q(500) => [ + q(0054), + q(0), + ], + q(501) => [ + q(0056), + q(0), + ], + q(502) => [ + q(0057), + q(0), + ], + q(503) => [ + q(0052), + q(0), + ], + q(505) => [ + q(0077), + q(0), + ], + q(510) => [ + q(0071), + q(0), + ], + q(520) => [ + q(0171), + q(0), + ], + q(530) => [ + q(0152), + q(0), + ], + q(550) => [ + q(0016), + q(0), + ], + q(570) => [ + q(0019), + q(0), + ], + q(610) => [ + q(0066), + q(0), + ], + q(620) => [ + q(0143), + q(0), + ], + q(755) => [ + q(0036), + q(0), + ], + q(900) => [ + q(0139), + q(0), + ], + q(949) => [ + q(0140), + q(0), + ], + q(993) => [ + q(0193), + q(0), + ], + q(994) => [ + q(0191), + q(0), + ], + q(995) => [ + q(0192), + q(0), + ], + q(996) => [ + q(0194), + q(0), + ], + }, +}; + +$Locale::Codes::Data{'script'}{'id2code'} = { + q(alpha) => { + q(0001) => q(Adlm), + q(0002) => q(Afak), + q(0003) => q(Aghb), + q(0004) => q(Ahom), + q(0005) => q(Arab), + q(0006) => q(Aran), + q(0007) => q(Armi), + q(0008) => q(Armn), + q(0009) => q(Avst), + q(0010) => q(Bali), + q(0011) => q(Bamu), + q(0012) => q(Bass), + q(0013) => q(Batk), + q(0014) => q(Beng), + q(0015) => q(Bhks), + q(0016) => q(Blis), + q(0017) => q(Bopo), + q(0018) => q(Brah), + q(0019) => q(Brai), + q(0020) => q(Bugi), + q(0021) => q(Buhd), + q(0022) => q(Cakm), + q(0023) => q(Cans), + q(0024) => q(Cari), + q(0025) => q(Cham), + q(0026) => q(Cher), + q(0027) => q(Cirt), + q(0028) => q(Copt), + q(0029) => q(Cpmn), + q(0030) => q(Cprt), + q(0031) => q(Cyrl), + q(0032) => q(Cyrs), + q(0033) => q(Deva), + q(0034) => q(Dogr), + q(0035) => q(Dsrt), + q(0036) => q(Dupl), + q(0037) => q(Egyd), + q(0038) => q(Egyh), + q(0039) => q(Egyp), + q(0040) => q(Elba), + q(0041) => q(Ethi), + q(0042) => q(Geok), + q(0043) => q(Geor), + q(0044) => q(Glag), + q(0045) => q(Gong), + q(0046) => q(Gonm), + q(0047) => q(Goth), + q(0048) => q(Gran), + q(0049) => q(Grek), + q(0050) => q(Gujr), + q(0051) => q(Guru), + q(0052) => q(Hanb), + q(0053) => q(Hang), + q(0054) => q(Hani), + q(0055) => q(Hano), + q(0056) => q(Hans), + q(0057) => q(Hant), + q(0058) => q(Hatr), + q(0059) => q(Hebr), + q(0060) => q(Hira), + q(0061) => q(Hluw), + q(0062) => q(Hmng), + q(0063) => q(Hmnp), + q(0064) => q(Hrkt), + q(0065) => q(Hung), + q(0066) => q(Inds), + q(0067) => q(Ital), + q(0068) => q(Jamo), + q(0069) => q(Java), + q(0070) => q(Jpan), + q(0071) => q(Jurc), + q(0072) => q(Kali), + q(0073) => q(Kana), + q(0074) => q(Khar), + q(0075) => q(Khmr), + q(0076) => q(Khoj), + q(0077) => q(Kitl), + q(0078) => q(Kits), + q(0079) => q(Knda), + q(0080) => q(Kore), + q(0081) => q(Kpel), + q(0082) => q(Kthi), + q(0083) => q(Lana), + q(0084) => q(Laoo), + q(0085) => q(Latf), + q(0086) => q(Latg), + q(0087) => q(Latn), + q(0088) => q(Leke), + q(0089) => q(Lepc), + q(0090) => q(Limb), + q(0091) => q(Lina), + q(0092) => q(Linb), + q(0093) => q(Lisu), + q(0094) => q(Loma), + q(0095) => q(Lyci), + q(0096) => q(Lydi), + q(0097) => q(Mahj), + q(0098) => q(Maka), + q(0099) => q(Mand), + q(0100) => q(Mani), + q(0101) => q(Marc), + q(0102) => q(Maya), + q(0103) => q(Medf), + q(0104) => q(Mend), + q(0105) => q(Merc), + q(0106) => q(Mero), + q(0107) => q(Mlym), + q(0108) => q(Modi), + q(0109) => q(Mong), + q(0110) => q(Moon), + q(0111) => q(Mroo), + q(0112) => q(Mtei), + q(0113) => q(Mult), + q(0114) => q(Mymr), + q(0115) => q(Narb), + q(0116) => q(Nbat), + q(0117) => q(Newa), + q(0118) => q(Nkdb), + q(0119) => q(Nkgb), + q(0120) => q(Nkoo), + q(0121) => q(Nshu), + q(0122) => q(Ogam), + q(0123) => q(Olck), + q(0124) => q(Orkh), + q(0125) => q(Orya), + q(0126) => q(Osge), + q(0127) => q(Osma), + q(0128) => q(Palm), + q(0129) => q(Pauc), + q(0130) => q(Perm), + q(0131) => q(Phag), + q(0132) => q(Phli), + q(0133) => q(Phlp), + q(0134) => q(Phlv), + q(0135) => q(Phnx), + q(0136) => q(Plrd), + q(0137) => q(Piqd), + q(0138) => q(Prti), + q(0139) => q(Qaaa), + q(0140) => q(Qabx), + q(0141) => q(Rjng), + q(0142) => q(Rohg), + q(0143) => q(Roro), + q(0144) => q(Runr), + q(0145) => q(Samr), + q(0146) => q(Sara), + q(0147) => q(Sarb), + q(0148) => q(Saur), + q(0149) => q(Sgnw), + q(0150) => q(Shaw), + q(0151) => q(Shrd), + q(0152) => q(Shui), + q(0153) => q(Sidd), + q(0154) => q(Sind), + q(0155) => q(Sinh), + q(0156) => q(Sogd), + q(0157) => q(Sogo), + q(0158) => q(Sora), + q(0159) => q(Soyo), + q(0160) => q(Sund), + q(0161) => q(Sylo), + q(0162) => q(Syrc), + q(0163) => q(Syre), + q(0164) => q(Syrj), + q(0165) => q(Syrn), + q(0166) => q(Tagb), + q(0167) => q(Takr), + q(0168) => q(Tale), + q(0169) => q(Talu), + q(0170) => q(Taml), + q(0171) => q(Tang), + q(0172) => q(Tavt), + q(0173) => q(Telu), + q(0174) => q(Teng), + q(0175) => q(Tfng), + q(0176) => q(Tglg), + q(0177) => q(Thaa), + q(0178) => q(Thai), + q(0179) => q(Tibt), + q(0180) => q(Tirh), + q(0181) => q(Ugar), + q(0182) => q(Vaii), + q(0183) => q(Visp), + q(0184) => q(Wara), + q(0185) => q(Wcho), + q(0186) => q(Wole), + q(0187) => q(Xpeo), + q(0188) => q(Xsux), + q(0189) => q(Yiii), + q(0190) => q(Zanb), + q(0191) => q(Zinh), + q(0192) => q(Zmth), + q(0193) => q(Zsye), + q(0194) => q(Zsym), + }, + q(num) => { + q(0001) => q(166), + q(0002) => q(439), + q(0003) => q(239), + q(0004) => q(338), + q(0005) => q(160), + q(0006) => q(161), + q(0007) => q(124), + q(0008) => q(230), + q(0009) => q(134), + q(0010) => q(360), + q(0011) => q(435), + q(0012) => q(259), + q(0013) => q(365), + q(0014) => q(325), + q(0015) => q(334), + q(0016) => q(550), + q(0017) => q(285), + q(0018) => q(300), + q(0019) => q(570), + q(0020) => q(367), + q(0021) => q(372), + q(0022) => q(349), + q(0023) => q(440), + q(0024) => q(201), + q(0025) => q(358), + q(0026) => q(445), + q(0027) => q(291), + q(0028) => q(204), + q(0029) => q(402), + q(0030) => q(403), + q(0031) => q(220), + q(0032) => q(221), + q(0033) => q(315), + q(0034) => q(328), + q(0035) => q(250), + q(0036) => q(755), + q(0037) => q(070), + q(0038) => q(060), + q(0039) => q(050), + q(0040) => q(226), + q(0041) => q(430), + q(0042) => q(241), + q(0043) => q(240), + q(0044) => q(225), + q(0045) => q(312), + q(0046) => q(313), + q(0047) => q(206), + q(0048) => q(343), + q(0049) => q(200), + q(0050) => q(320), + q(0051) => q(310), + q(0052) => q(503), + q(0053) => q(286), + q(0054) => q(500), + q(0055) => q(371), + q(0056) => q(501), + q(0057) => q(502), + q(0058) => q(127), + q(0059) => q(125), + q(0060) => q(410), + q(0061) => q(080), + q(0062) => q(450), + q(0063) => q(451), + q(0064) => q(412), + q(0065) => q(176), + q(0066) => q(610), + q(0067) => q(210), + q(0068) => q(284), + q(0069) => q(361), + q(0070) => q(413), + q(0071) => q(510), + q(0072) => q(357), + q(0073) => q(411), + q(0074) => q(305), + q(0075) => q(355), + q(0076) => q(322), + q(0077) => q(505), + q(0078) => q(288), + q(0079) => q(345), + q(0080) => q(287), + q(0081) => q(436), + q(0082) => q(317), + q(0083) => q(351), + q(0084) => q(356), + q(0085) => q(217), + q(0086) => q(216), + q(0087) => q(215), + q(0088) => q(364), + q(0089) => q(335), + q(0090) => q(336), + q(0091) => q(400), + q(0092) => q(401), + q(0093) => q(399), + q(0094) => q(437), + q(0095) => q(202), + q(0096) => q(116), + q(0097) => q(314), + q(0098) => q(366), + q(0099) => q(140), + q(0100) => q(139), + q(0101) => q(332), + q(0102) => q(090), + q(0103) => q(265), + q(0104) => q(438), + q(0105) => q(101), + q(0106) => q(100), + q(0107) => q(347), + q(0108) => q(324), + q(0109) => q(145), + q(0110) => q(218), + q(0111) => q(264), + q(0112) => q(337), + q(0113) => q(323), + q(0114) => q(350), + q(0115) => q(106), + q(0116) => q(159), + q(0117) => q(333), + q(0118) => q(085), + q(0119) => q(420), + q(0120) => q(165), + q(0121) => q(499), + q(0122) => q(212), + q(0123) => q(261), + q(0124) => q(175), + q(0125) => q(327), + q(0126) => q(219), + q(0127) => q(260), + q(0128) => q(126), + q(0129) => q(263), + q(0130) => q(227), + q(0131) => q(331), + q(0132) => q(131), + q(0133) => q(132), + q(0134) => q(133), + q(0135) => q(115), + q(0136) => q(282), + q(0137) => q(293), + q(0138) => q(130), + q(0139) => q(900), + q(0140) => q(949), + q(0141) => q(363), + q(0142) => q(167), + q(0143) => q(620), + q(0144) => q(211), + q(0145) => q(123), + q(0146) => q(292), + q(0147) => q(105), + q(0148) => q(344), + q(0149) => q(095), + q(0150) => q(281), + q(0151) => q(319), + q(0152) => q(530), + q(0153) => q(302), + q(0154) => q(318), + q(0155) => q(348), + q(0156) => q(141), + q(0157) => q(142), + q(0158) => q(398), + q(0159) => q(329), + q(0160) => q(362), + q(0161) => q(316), + q(0162) => q(135), + q(0163) => q(138), + q(0164) => q(137), + q(0165) => q(136), + q(0166) => q(373), + q(0167) => q(321), + q(0168) => q(353), + q(0169) => q(354), + q(0170) => q(346), + q(0171) => q(520), + q(0172) => q(359), + q(0173) => q(340), + q(0174) => q(290), + q(0175) => q(120), + q(0176) => q(370), + q(0177) => q(170), + q(0178) => q(352), + q(0179) => q(330), + q(0180) => q(326), + q(0181) => q(040), + q(0182) => q(470), + q(0183) => q(280), + q(0184) => q(262), + q(0185) => q(283), + q(0186) => q(480), + q(0187) => q(030), + q(0188) => q(020), + q(0189) => q(460), + q(0190) => q(339), + q(0191) => q(994), + q(0192) => q(995), + q(0193) => q(993), + q(0194) => q(996), + }, +}; + +1; +package # +Locale::Codes::LangVar_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Fri Feb 23 12:58:17 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'langvar'}{'alpha'}{'code'} = { +}; + +$Locale::Codes::Retired{'langvar'}{'alpha'}{'name'} = { + q("academic" ("governmental") variant of belarusian as) => [ q(1959acad), q("Academic" ("governmental") variant of Belarusian as) ], + q(portugese language orthographic agreement of 1990 (acordo ortografico da lingua portuguesa de 1990)) => [ q(ao1990), q(Portugese Language Orthographic Agreement of 1990 (Acordo Ortografico da Lingua Portuguesa de 1990)) ], + q(slovene in bohoric alphabet) => [ q(bohoric), q(Slovene in Bohoric alphabet) ], +}; + + +1; +package Locale::Codes::LangFam; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2langfam + langfam2code + all_langfam_codes + all_langfam_names + langfam_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_LANGFAM); + +our $obj = new Locale::Codes('langfam'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2langfam { + return $obj->code2name(@_); +} + +sub langfam2code { + return $obj->name2code(@_); +} + +sub langfam_code2code { + return $obj->code2code(@_); +} + +sub all_langfam_codes { + return $obj->all_codes(@_); +} + +sub all_langfam_names { + return $obj->all_names(@_); +} + +sub rename_langfam { + return $obj->rename_code(@_); +} + +sub add_langfam { + return $obj->add_code(@_); +} + +sub delete_langfam { + return $obj->delete_code(@_); +} + +sub add_langfam_alias { + return $obj->add_alias(@_); +} + +sub delete_langfam_alias { + return $obj->delete_alias(@_); +} + +sub rename_langfam_code { + return $obj->replace_code(@_); +} + +sub add_langfam_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_langfam_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package # +Locale::Codes::LangFam_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Tue Sep 27 15:40:31 EDT 2011 + +use strict; +use warnings; +require 5.002; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'langfam'}{'alpha'}{'code'} = { +}; + +$Locale::Codes::Retired{'langfam'}{'alpha'}{'name'} = { +}; + + +1; +package Locale::Codes::LangExt; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2langext + langext2code + all_langext_codes + all_langext_names + langext_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_LANGEXT); + +our $obj = new Locale::Codes('langext'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2langext { + return $obj->code2name(@_); +} + +sub langext2code { + return $obj->name2code(@_); +} + +sub langext_code2code { + return $obj->code2code(@_); +} + +sub all_langext_codes { + return $obj->all_codes(@_); +} + +sub all_langext_names { + return $obj->all_names(@_); +} + +sub rename_langext { + return $obj->rename_code(@_); +} + +sub add_langext { + return $obj->add_code(@_); +} + +sub delete_langext { + return $obj->delete_code(@_); +} + +sub add_langext_alias { + return $obj->add_alias(@_); +} + +sub delete_langext_alias { + return $obj->delete_alias(@_); +} + +sub rename_langext_code { + return $obj->replace_code(@_); +} + +sub add_langext_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_langext_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package Locale::Codes::Language; +# Copyright (C) 2001 Canon Research Centre Europe (CRE). +# Copyright (C) 2002-2009 Neil Bowers +# Copyright (c) 2010-2018 Sullivan Beck +# This program is free software; you can redistribute it and/or modify it +# under the same terms as Perl itself. + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'gen_mods' is run. +# Generated on: Fri Feb 23 12:55:25 EST 2018 + +use strict; +use warnings; +require 5.006; +use Exporter qw(import); + +our($VERSION,@EXPORT); +$VERSION = '3.56'; + +################################################################################ +use if $] >= 5.027007, 'deprecate'; +use Locale::Codes; +use Locale::Codes::Constants; + +@EXPORT = qw( + code2language + language2code + all_language_codes + all_language_names + language_code2code + ); +push(@EXPORT,@Locale::Codes::Constants::CONSTANTS_LANGUAGE); + +our $obj = new Locale::Codes('language'); +$obj->show_errors(0); + +sub show_errors { + my($val) = @_; + $obj->show_errors($val); +} + +sub code2language { + return $obj->code2name(@_); +} + +sub language2code { + return $obj->name2code(@_); +} + +sub language_code2code { + return $obj->code2code(@_); +} + +sub all_language_codes { + return $obj->all_codes(@_); +} + +sub all_language_names { + return $obj->all_names(@_); +} + +sub rename_language { + return $obj->rename_code(@_); +} + +sub add_language { + return $obj->add_code(@_); +} + +sub delete_language { + return $obj->delete_code(@_); +} + +sub add_language_alias { + return $obj->add_alias(@_); +} + +sub delete_language_alias { + return $obj->delete_alias(@_); +} + +sub rename_language_code { + return $obj->replace_code(@_); +} + +sub add_language_code_alias { + return $obj->add_code_alias(@_); +} + +sub delete_language_code_alias { + return $obj->delete_code_alias(@_); +} + +1; +package # +Locale::Codes::Currency_Retired; + +# This file was automatically generated. Any changes to this file will +# be lost the next time 'deprecate_codes' is run. +# Generated on: Fri Feb 23 12:58:17 EST 2018 + +use strict; +require 5.006; +use warnings; +use utf8; + +our($VERSION); +$VERSION='3.56'; + +$Locale::Codes::Retired{'currency'}{'alpha'}{'code'} = { + q(ADP) => q(Andorran Peseta), + q(AFA) => q(Afghani), + q(AON) => q(New Kwanza), + q(AOR) => q(Kwanza Reajustado), + q(ATS) => q(Schilling), + q(AZM) => q(Azerbaijanian Manat), + q(BEF) => q(Belgian Franc), + q(BGL) => q(Lev), + q(BYB) => q(Belarussian Ruble), + q(CYP) => q(Cyprus Pound), + q(DEM) => q(German Mark), + q(ECS) => q(Sucre), + q(ECV) => q(Unidad de Valor Constante (UVC)), + q(EEK) => q(Kroon), + q(ESP) => q(Spanish Peseta), + q(FIM) => q(Markka), + q(FRF) => q(French Franc), + q(GHC) => q(Cedi), + q(GRD) => q(Drachma), + q(GWP) => q(Guinea-Bissau Peso), + q(IEP) => q(Irish Pound), + q(ITL) => q(Italian Lira), + q(LTL) => q(Lithuanian Litas), + q(LUF) => q(Luxembourg Franc), + q(LVL) => q(Latvian Lats), + q(MGF) => q(Malagasy Franc), + q(MRO) => q(Ouguiya), + q(MTL) => q(Maltese Lira), + q(MZM) => q(Metical), + q(NLG) => q(Netherlands Guilder), + q(PTE) => q(Portuguese Escudo), + q(ROL) => q(Leu), + q(RUR) => q(Russian Ruble), + q(SDD) => q(Sudanese Dinar), + q(SHP) => q(Saint Helena Pound), + q(SIT) => q(Tolar), + q(SKK) => q(Slovak Koruna), + q(SRG) => q(Surinam Guilder), + q(STD) => q(Dobra), + q(TJR) => q(Tajik Ruble), + q(TMM) => q(Manat), + q(TPE) => q(Timor Escudo), + q(TRL) => q(Turkish Lira), + q(UAK) => q(Karbovanets), + q(USS) => q(US Dollar (Same day)), + q(VEB) => q(Bolivar), + q(XB5) => q(European Unit of Account 17), + q(XEU) => q(ECU (until 1998-12-31)), + q(XFO) => q(Gold-Franc), + q(XFU) => q(UIC-Franc), + q(YUM) => q(New Dinar), + q(ZAL) => q(Financial Rand), + q(ZRN) => q(New Zaire), + q(ZWD) => q(Zimbabwe Dollar), +}; + +$Locale::Codes::Retired{'currency'}{'num'}{'code'} = { + q(428) => q(Latvian Lats), + q(440) => q(Lithuanian Litas), + q(478) => q(Ouguiya), + q(654) => q(Saint Helena Pound), + q(678) => q(Dobra), + q(998) => q(US Dollar (Same day)), +}; + +$Locale::Codes::Retired{'currency'}{'alpha'}{'name'} = { + q(andorran peseta) => [ q(ADP), q(Andorran Peseta) ], + q(aruban guilder) => [ q(AWG), q(Aruban Guilder) ], + q(azerbaijanian manat) => [ q(AZN), q(Azerbaijanian Manat) ], + q(belarussian ruble) => [ q(BYR), q(Belarussian Ruble) ], + q(belgian franc) => [ q(BEF), q(Belgian Franc) ], + q(bermudian dollar (customarily known as bermuda dollar)) => [ q(BMD), q(Bermudian Dollar (customarily known as Bermuda Dollar)) ], + q(bolivar) => [ q(VEB), q(Bolivar) ], + q(bolivar fuerte) => [ q(VEF), q(Bolivar Fuerte) ], + q(bond markets units european composite unit (eurco)) => [ q(XBA), q(Bond Markets Units European Composite Unit (EURCO)) ], + q(candian dollar) => [ q(CAD), q(Candian Dollar) ], + q(cape verde escudo) => [ q(CVE), q(Cape Verde Escudo) ], + q(cedi) => [ q(GHS), q(Cedi) ], + q(comoro franc) => [ q(KMF), q(Comoro Franc) ], + q(convertible marks) => [ q(BAM), q(Convertible Marks) ], + q(croatian kuna) => [ q(HRK), q(Croatian Kuna) ], + q(cyprus pound) => [ q(CYP), q(Cyprus Pound) ], + q(dinar) => [ q(BHD), q(Dinar) ], + q(drachma) => [ q(GRD), q(Drachma) ], + q(ecu (until 1998-12-31)) => [ q(XEU), q(ECU (until 1998-12-31)) ], + q(european composite unit) => [ q(XBA), q(European Composite Unit) ], + q(european monetary unit) => [ q(XBB), q(European Monetary Unit) ], + q(european monetary unit (e.m.u.-6)) => [ q(XBB), q(European Monetary Unit (E.M.U.-6)) ], + q(european unit of account 17) => [ q(XB5), q(European Unit of Account 17) ], + q(european unit of account 17(e.u.a.-17)) => [ q(XBD), q(European Unit of Account 17(E.U.A.-17)) ], + q(european unit of account 9) => [ q(XBC), q(European Unit of Account 9) ], + q(european unit of account 9(e.u.a.-9)) => [ q(XBC), q(European Unit of Account 9(E.U.A.-9)) ], + q(financial rand) => [ q(ZAL), q(Financial Rand) ], + q(franc congolais) => [ q(CDF), q(Franc Congolais) ], + q(french franc) => [ q(FRF), q(French Franc) ], + q(german mark) => [ q(DEM), q(German Mark) ], + q(gold-franc) => [ q(XFO), q(Gold-Franc) ], + q(guinea franc) => [ q(GNF), q(Guinea Franc) ], + q(guinea-bissau peso) => [ q(GWP), q(Guinea-Bissau Peso) ], + q(irish pound) => [ q(IEP), q(Irish Pound) ], + q(italian lira) => [ q(ITL), q(Italian Lira) ], + q(karbovanets) => [ q(UAK), q(Karbovanets) ], + q(kip) => [ q(LAK), q(Kip) ], + q(kroon) => [ q(EEK), q(Kroon) ], + q(kuna) => [ q(HRK), q(Kuna) ], + q(kwacha) => [ q(MWK), q(Kwacha) ], + q(kwanza reajustado) => [ q(AOR), q(Kwanza Reajustado) ], + q(latvian lats) => [ q(LVL), q(Latvian Lats) ], + q(leu) => [ q(RON), q(Leu) ], + q(lev) => [ q(BGL), q(Lev) ], + q(lithuanian litas) => [ q(LTL), q(Lithuanian Litas) ], + q(luxembourg franc) => [ q(LUF), q(Luxembourg Franc) ], + q(malagasy franc) => [ q(MGF), q(Malagasy Franc) ], + q(maltese lira) => [ q(MTL), q(Maltese Lira) ], + q(manat) => [ q(TMT), q(Manat) ], + q(markka) => [ q(FIM), q(Markka) ], + q(metical) => [ q(MZN), q(Metical) ], + q(mexican nuevo peso) => [ q(MXN), q(Mexican Nuevo Peso) ], + q(netherlands antillian guilder) => [ q(ANG), q(Netherlands Antillian Guilder) ], + q(netherlands guilder) => [ q(NLG), q(Netherlands Guilder) ], + q(new dinar) => [ q(YUM), q(New Dinar) ], + q(new kwanza) => [ q(AON), q(New Kwanza) ], + q(new leu) => [ q(RON), q(New Leu) ], + q(new manat) => [ q(TMT), q(New Manat) ], + q(new romanian leu) => [ q(RON), q(New Romanian Leu) ], + q(new zaire) => [ q(ZRN), q(New Zaire) ], + q(nuevo sol) => [ q(PEN), q(Nuevo Sol) ], + q(philippine peso) => [ q(PHP), q(Philippine Peso) ], + q(portuguese escudo) => [ q(PTE), q(Portuguese Escudo) ], + q(saint helena pound) => [ q(SHP), q(Saint Helena Pound) ], + q(schilling) => [ q(ATS), q(Schilling) ], + q(sdr) => [ q(XDR), q(SDR) ], + q(shekel) => [ q(ILS), q(Shekel) ], + q(slovak koruna) => [ q(SKK), q(Slovak Koruna) ], + q(spanish peseta) => [ q(ESP), q(Spanish Peseta) ], + q(st. helena pound) => [ q(SHP), q(St. Helena Pound) ], + q(sudanese dinar) => [ q(SDD), q(Sudanese Dinar) ], + q(surinam guilder) => [ q(SRG), q(Surinam Guilder) ], + q(tajik ruble) => [ q(TJR), q(Tajik Ruble) ], + q(timor escudo) => [ q(TPE), q(Timor Escudo) ], + q(tolar) => [ q(SIT), q(Tolar) ], + q(tunisian dollar) => [ q(TND), q(Tunisian Dollar) ], + q(uic-franc) => [ q(XFU), q(UIC-Franc) ], + q(unidad de valor constante (uvc)) => [ q(ECV), q(Unidad de Valor Constante (UVC)) ], + q(unidades de fomento) => [ q(CLF), q(Unidades de fomento) ], + q(unidades de formento) => [ q(CLF), q(Unidades de Formento) ], + q(uruguay peso en unidades indexadas) => [ q(UYI), q(Uruguay Peso en Unidades Indexadas) ], + q(us dollar (same day)) => [ q(USS), q(US Dollar (Same day)) ], +}; + +$Locale::Codes::Retired{'currency'}{'num'}{'name'} = { + q(azerbaijanian manat) => [ q(944), q(Azerbaijanian Manat) ], + q(belarussian ruble) => [ q(974), q(Belarussian Ruble) ], + q(bolivar fuerte) => [ q(937), q(Bolivar Fuerte) ], + q(cape verde escudo) => [ q(132), q(Cape Verde Escudo) ], + q(cedi) => [ q(936), q(Cedi) ], + q(comoro franc) => [ q(174), q(Comoro Franc) ], + q(croatian kuna) => [ q(191), q(Croatian Kuna) ], + q(guinea franc) => [ q(324), q(Guinea Franc) ], + q(kip) => [ q(418), q(Kip) ], + q(kwacha) => [ q(454), q(Kwacha) ], + q(latvian lats) => [ q(428), q(Latvian Lats) ], + q(leu) => [ q(946), q(Leu) ], + q(lithuanian litas) => [ q(440), q(Lithuanian Litas) ], + q(metical) => [ q(943), q(Metical) ], + q(new manat) => [ q(934), q(New Manat) ], + q(new romanian leu) => [ q(946), q(New Romanian Leu) ], + q(nuevo sol) => [ q(604), q(Nuevo Sol) ], + q(philippine peso) => [ q(608), q(Philippine Peso) ], + q(saint helena pound) => [ q(654), q(Saint Helena Pound) ], + q(unidades de fomento) => [ q(990), q(Unidades de fomento) ], + q(us dollar (same day)) => [ q(998), q(US Dollar (Same day)) ], +}; + + +1; +package Locale::Maketext::Simple; +$Locale::Maketext::Simple::VERSION = '0.21_01'; + +use strict; +use 5.005; + + +sub import { + my ($class, %args) = @_; + + $args{Class} ||= caller; + $args{Style} ||= 'maketext'; + $args{Export} ||= 'loc'; + $args{Subclass} ||= 'I18N'; + + my ($loc, $loc_lang) = $class->load_loc(%args); + $loc ||= $class->default_loc(%args); + + no strict 'refs'; + *{caller(0) . "::$args{Export}"} = $loc if $args{Export}; + *{caller(0) . "::$args{Export}_lang"} = $loc_lang || sub { 1 }; +} + +my %Loc; + +sub reload_loc { %Loc = () } + +sub load_loc { + my ($class, %args) = @_; + + my $pkg = join('::', grep { defined and length } $args{Class}, $args{Subclass}); + return $Loc{$pkg} if exists $Loc{$pkg}; + + eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require Locale::Maketext::Lexicon; + 1 + } or return; + $Locale::Maketext::Lexicon::VERSION > 0.20 or return; + eval { require File::Spec; 1 } or return; + + my $path = $args{Path} || $class->auto_path($args{Class}) or return; + my $pattern = File::Spec->catfile($path, '*.[pm]o'); + my $decode = $args{Decode} || 0; + my $encoding = $args{Encoding} || undef; + + $decode = 1 if $encoding; + + $pattern =~ s{\\}{/}g; # to counter win32 paths + + eval " + package $pkg; + use base 'Locale::Maketext'; + Locale::Maketext::Lexicon->import({ + 'i-default' => [ 'Auto' ], + '*' => [ Gettext => \$pattern ], + _decode => \$decode, + _encoding => \$encoding, + }); + *${pkg}::Lexicon = \\%${pkg}::i_default::Lexicon; + *tense = sub { \$_[1] . ((\$_[2] eq 'present') ? 'ing' : 'ed') } + unless defined &tense; + + 1; + " or die $@; + + my $lh = eval { $pkg->get_handle } or return; + my $style = lc($args{Style}); + if ($style eq 'maketext') { + $Loc{$pkg} = sub { + $lh->maketext(@_) + }; + } + elsif ($style eq 'gettext') { + $Loc{$pkg} = sub { + my $str = shift; + $str =~ s{([\~\[\]])}{~$1}g; + $str =~ s{ + ([%\\]%) # 1 - escaped sequence + | + % (?: + ([A-Za-z#*]\w*) # 2 - function call + \(([^\)]*)\) # 3 - arguments + | + ([1-9]\d*|\*) # 4 - variable + ) + }{ + $1 ? $1 + : $2 ? "\[$2,"._unescape($3)."]" + : "[_$4]" + }egx; + return $lh->maketext($str, @_); + }; + } + else { + die "Unknown Style: $style"; + } + + return $Loc{$pkg}, sub { + $lh = $pkg->get_handle(@_); + }; +} + +sub default_loc { + my ($self, %args) = @_; + my $style = lc($args{Style}); + if ($style eq 'maketext') { + return sub { + my $str = shift; + $str =~ s{((?<!~)(?:~~)*)\[_([1-9]\d*|\*)\]} + {$1%$2}g; + $str =~ s{((?<!~)(?:~~)*)\[([A-Za-z#*]\w*),([^\]]+)\]} + {"$1%$2(" . _escape($3) . ')'}eg; + _default_gettext($str, @_); + }; + } + elsif ($style eq 'gettext') { + return \&_default_gettext; + } + else { + die "Unknown Style: $style"; + } +} + +sub _default_gettext { + my $str = shift; + $str =~ s{ + % # leading symbol + (?: # either one of + \d+ # a digit, like %1 + | # or + (\w+)\( # a function call -- 1 + (?: # either + %\d+ # an interpolation + | # or + ([^,]*) # some string -- 2 + ) # end either + (?: # maybe followed + , # by a comma + ([^),]*) # and a param -- 3 + )? # end maybe + (?: # maybe followed + , # by another comma + ([^),]*) # and a param -- 4 + )? # end maybe + [^)]* # and other ignorable params + \) # closing function call + ) # closing either one of + }{ + my $digit = $2 || shift; + $digit . ( + $1 ? ( + ($1 eq 'tense') ? (($3 eq 'present') ? 'ing' : 'ed') : + ($1 eq 'quant') ? ' ' . (($digit > 1) ? ($4 || "$3s") : $3) : + '' + ) : '' + ); + }egx; + return $str; +}; + +sub _escape { + my $text = shift; + $text =~ s/\b_([1-9]\d*)/%$1/g; + return $text; +} + +sub _unescape { + join(',', map { + /\A(\s*)%([1-9]\d*|\*)(\s*)\z/ ? "$1_$2$3" : $_ + } split(/,/, $_[0])); +} + +sub auto_path { + my ($self, $calldir) = @_; + $calldir =~ s#::#/#g; + my $path = $INC{$calldir . '.pm'} or return; + + # Try absolute path name. + if ($^O eq 'MacOS') { + (my $malldir = $calldir) =~ tr#/#:#; + $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:#s; + } else { + $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/#; + } + + return $path if -d $path; + + # If that failed, try relative path with normal @INC searching. + $path = "auto/$calldir/"; + foreach my $inc (@INC) { + return "$inc/$path" if -d "$inc/$path"; + } + + return; +} + +1; + +package Locale::Maketext::GutsLoader; + +use Locale::Maketext; + +our $VERSION = '1.20'; + +sub zorp { return scalar @_ } + + +1; +package Locale::Maketext::Guts; + +use Locale::Maketext; + +our $VERSION = '1.20'; + + +1; +package version::regex; + +use strict; + +our $VERSION = 0.9923; + +#--------------------------------------------------------------------------# +# Version regexp components +#--------------------------------------------------------------------------# + +# Fraction part of a decimal version number. This is a common part of +# both strict and lax decimal versions + +my $FRACTION_PART = qr/\.[0-9]+/; + +# First part of either decimal or dotted-decimal strict version number. +# Unsigned integer with no leading zeroes (except for zero itself) to +# avoid confusion with octal. + +my $STRICT_INTEGER_PART = qr/0|[1-9][0-9]*/; + +# First part of either decimal or dotted-decimal lax version number. +# Unsigned integer, but allowing leading zeros. Always interpreted +# as decimal. However, some forms of the resulting syntax give odd +# results if used as ordinary Perl expressions, due to how perl treats +# octals. E.g. +# version->new("010" ) == 10 +# version->new( 010 ) == 8 +# version->new( 010.2) == 82 # "8" . "2" + +my $LAX_INTEGER_PART = qr/[0-9]+/; + +# Second and subsequent part of a strict dotted-decimal version number. +# Leading zeroes are permitted, and the number is always decimal. +# Limited to three digits to avoid overflow when converting to decimal +# form and also avoid problematic style with excessive leading zeroes. + +my $STRICT_DOTTED_DECIMAL_PART = qr/\.[0-9]{1,3}/; + +# Second and subsequent part of a lax dotted-decimal version number. +# Leading zeroes are permitted, and the number is always decimal. No +# limit on the numerical value or number of digits, so there is the +# possibility of overflow when converting to decimal form. + +my $LAX_DOTTED_DECIMAL_PART = qr/\.[0-9]+/; + +# Alpha suffix part of lax version number syntax. Acts like a +# dotted-decimal part. + +my $LAX_ALPHA_PART = qr/_[0-9]+/; + +#--------------------------------------------------------------------------# +# Strict version regexp definitions +#--------------------------------------------------------------------------# + +# Strict decimal version number. + +our $STRICT_DECIMAL_VERSION = + qr/ $STRICT_INTEGER_PART $FRACTION_PART? /x; + +# Strict dotted-decimal version number. Must have both leading "v" and +# at least three parts, to avoid confusion with decimal syntax. + +our $STRICT_DOTTED_DECIMAL_VERSION = + qr/ v $STRICT_INTEGER_PART $STRICT_DOTTED_DECIMAL_PART{2,} /x; + +# Complete strict version number syntax -- should generally be used +# anchored: qr/ \A $STRICT \z /x + +our $STRICT = + qr/ $STRICT_DECIMAL_VERSION | $STRICT_DOTTED_DECIMAL_VERSION /x; + +#--------------------------------------------------------------------------# +# Lax version regexp definitions +#--------------------------------------------------------------------------# + +# Lax decimal version number. Just like the strict one except for +# allowing an alpha suffix or allowing a leading or trailing +# decimal-point + +our $LAX_DECIMAL_VERSION = + qr/ $LAX_INTEGER_PART (?: $FRACTION_PART | \. )? $LAX_ALPHA_PART? + | + $FRACTION_PART $LAX_ALPHA_PART? + /x; + +# Lax dotted-decimal version number. Distinguished by having either +# leading "v" or at least three non-alpha parts. Alpha part is only +# permitted if there are at least two non-alpha parts. Strangely +# enough, without the leading "v", Perl takes .1.2 to mean v0.1.2, +# so when there is no "v", the leading part is optional + +our $LAX_DOTTED_DECIMAL_VERSION = + qr/ + v $LAX_INTEGER_PART (?: $LAX_DOTTED_DECIMAL_PART+ $LAX_ALPHA_PART? )? + | + $LAX_INTEGER_PART? $LAX_DOTTED_DECIMAL_PART{2,} $LAX_ALPHA_PART? + /x; + +# Complete lax version number syntax -- should generally be used +# anchored: qr/ \A $LAX \z /x +# +# The string 'undef' is a special case to make for easier handling +# of return values from ExtUtils::MM->parse_version + +our $LAX = + qr/ undef | $LAX_DOTTED_DECIMAL_VERSION | $LAX_DECIMAL_VERSION /x; + +#--------------------------------------------------------------------------# + +# Preloaded methods go here. +sub is_strict { defined $_[0] && $_[0] =~ qr/ \A $STRICT \z /x } +sub is_lax { defined $_[0] && $_[0] =~ qr/ \A $LAX \z /x } + +1; +# +# Trigonometric functions, mostly inherited from Math::Complex. +# -- Jarkko Hietaniemi, since April 1997 +# -- Raphael Manfredi, September 1996 (indirectly: because of Math::Complex) +# + +package Math::Trig; + +{ use 5.006; } +use strict; + +use Math::Complex 1.59; +use Math::Complex qw(:trig :pi); +require Exporter; + +our @ISA = qw(Exporter); + +our $VERSION = 1.23; + +my @angcnv = qw(rad2deg rad2grad + deg2rad deg2grad + grad2rad grad2deg); + +my @areal = qw(asin_real acos_real); + +our @EXPORT = (@{$Math::Complex::EXPORT_TAGS{'trig'}}, + @angcnv, @areal); + +my @rdlcnv = qw(cartesian_to_cylindrical + cartesian_to_spherical + cylindrical_to_cartesian + cylindrical_to_spherical + spherical_to_cartesian + spherical_to_cylindrical); + +my @greatcircle = qw( + great_circle_distance + great_circle_direction + great_circle_bearing + great_circle_waypoint + great_circle_midpoint + great_circle_destination + ); + +my @pi = qw(pi pi2 pi4 pip2 pip4); + +our @EXPORT_OK = (@rdlcnv, @greatcircle, @pi, 'Inf'); + +# See e.g. the following pages: +# http://www.movable-type.co.uk/scripts/LatLong.html +# http://williams.best.vwh.net/avform.htm + +our %EXPORT_TAGS = ('radial' => [ @rdlcnv ], + 'great_circle' => [ @greatcircle ], + 'pi' => [ @pi ]); + +sub _DR () { pi2/360 } +sub _RD () { 360/pi2 } +sub _DG () { 400/360 } +sub _GD () { 360/400 } +sub _RG () { 400/pi2 } +sub _GR () { pi2/400 } + +# +# Truncating remainder. +# + +sub _remt ($$) { + # Oh yes, POSIX::fmod() would be faster. Possibly. If it is available. + $_[0] - $_[1] * int($_[0] / $_[1]); +} + +# +# Angle conversions. +# + +sub rad2rad($) { _remt($_[0], pi2) } + +sub deg2deg($) { _remt($_[0], 360) } + +sub grad2grad($) { _remt($_[0], 400) } + +sub rad2deg ($;$) { my $d = _RD * $_[0]; $_[1] ? $d : deg2deg($d) } + +sub deg2rad ($;$) { my $d = _DR * $_[0]; $_[1] ? $d : rad2rad($d) } + +sub grad2deg ($;$) { my $d = _GD * $_[0]; $_[1] ? $d : deg2deg($d) } + +sub deg2grad ($;$) { my $d = _DG * $_[0]; $_[1] ? $d : grad2grad($d) } + +sub rad2grad ($;$) { my $d = _RG * $_[0]; $_[1] ? $d : grad2grad($d) } + +sub grad2rad ($;$) { my $d = _GR * $_[0]; $_[1] ? $d : rad2rad($d) } + +# +# acos and asin functions which always return a real number +# + +sub acos_real { + return 0 if $_[0] >= 1; + return pi if $_[0] <= -1; + return acos($_[0]); +} + +sub asin_real { + return &pip2 if $_[0] >= 1; + return -&pip2 if $_[0] <= -1; + return asin($_[0]); +} + +sub cartesian_to_spherical { + my ( $x, $y, $z ) = @_; + + my $rho = sqrt( $x * $x + $y * $y + $z * $z ); + + return ( $rho, + atan2( $y, $x ), + $rho ? acos_real( $z / $rho ) : 0 ); +} + +sub spherical_to_cartesian { + my ( $rho, $theta, $phi ) = @_; + + return ( $rho * cos( $theta ) * sin( $phi ), + $rho * sin( $theta ) * sin( $phi ), + $rho * cos( $phi ) ); +} + +sub spherical_to_cylindrical { + my ( $x, $y, $z ) = spherical_to_cartesian( @_ ); + + return ( sqrt( $x * $x + $y * $y ), $_[1], $z ); +} + +sub cartesian_to_cylindrical { + my ( $x, $y, $z ) = @_; + + return ( sqrt( $x * $x + $y * $y ), atan2( $y, $x ), $z ); +} + +sub cylindrical_to_cartesian { + my ( $rho, $theta, $z ) = @_; + + return ( $rho * cos( $theta ), $rho * sin( $theta ), $z ); +} + +sub cylindrical_to_spherical { + return ( cartesian_to_spherical( cylindrical_to_cartesian( @_ ) ) ); +} + +sub great_circle_distance { + my ( $theta0, $phi0, $theta1, $phi1, $rho ) = @_; + + $rho = 1 unless defined $rho; # Default to the unit sphere. + + my $lat0 = pip2 - $phi0; + my $lat1 = pip2 - $phi1; + + return $rho * + acos_real( cos( $lat0 ) * cos( $lat1 ) * cos( $theta0 - $theta1 ) + + sin( $lat0 ) * sin( $lat1 ) ); +} + +sub great_circle_direction { + my ( $theta0, $phi0, $theta1, $phi1 ) = @_; + + my $lat0 = pip2 - $phi0; + my $lat1 = pip2 - $phi1; + + return rad2rad(pi2 - + atan2(sin($theta0-$theta1) * cos($lat1), + cos($lat0) * sin($lat1) - + sin($lat0) * cos($lat1) * cos($theta0-$theta1))); +} + +*great_circle_bearing = \&great_circle_direction; + +sub great_circle_waypoint { + my ( $theta0, $phi0, $theta1, $phi1, $point ) = @_; + + $point = 0.5 unless defined $point; + + my $d = great_circle_distance( $theta0, $phi0, $theta1, $phi1 ); + + return undef if $d == pi; + + my $sd = sin($d); + + return ($theta0, $phi0) if $sd == 0; + + my $A = sin((1 - $point) * $d) / $sd; + my $B = sin( $point * $d) / $sd; + + my $lat0 = pip2 - $phi0; + my $lat1 = pip2 - $phi1; + + my $x = $A * cos($lat0) * cos($theta0) + $B * cos($lat1) * cos($theta1); + my $y = $A * cos($lat0) * sin($theta0) + $B * cos($lat1) * sin($theta1); + my $z = $A * sin($lat0) + $B * sin($lat1); + + my $theta = atan2($y, $x); + my $phi = acos_real($z); + + return ($theta, $phi); +} + +sub great_circle_midpoint { + great_circle_waypoint(@_[0..3], 0.5); +} + +sub great_circle_destination { + my ( $theta0, $phi0, $dir0, $dst ) = @_; + + my $lat0 = pip2 - $phi0; + + my $phi1 = asin_real(sin($lat0)*cos($dst) + + cos($lat0)*sin($dst)*cos($dir0)); + + my $theta1 = $theta0 + atan2(sin($dir0)*sin($dst)*cos($lat0), + cos($dst)-sin($lat0)*sin($phi1)); + + my $dir1 = great_circle_bearing($theta1, $phi1, $theta0, $phi0) + pi; + + $dir1 -= pi2 if $dir1 > pi2; + + return ($theta1, $phi1, $dir1); +} + +1; + +__END__ + +# eof +package Math::BigInt; + +# +# "Mike had an infinite amount to do and a negative amount of time in which +# to do it." - Before and After +# + +# The following hash values are used: +# value: unsigned int with actual value (as a Math::BigInt::Calc or similar) +# sign : +, -, NaN, +inf, -inf +# _a : accuracy +# _p : precision + +# Remember not to take shortcuts ala $xs = $x->{value}; $CALC->foo($xs); since +# underlying lib might change the reference! + +use 5.006001; +use strict; +use warnings; + +use Carp (); + +our $VERSION = '1.999811'; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(objectify bgcd blcm); + +my $class = "Math::BigInt"; + +# Inside overload, the first arg is always an object. If the original code had +# it reversed (like $x = 2 * $y), then the third parameter is true. +# In some cases (like add, $x = $x + 2 is the same as $x = 2 + $x) this makes +# no difference, but in some cases it does. + +# For overloaded ops with only one argument we simple use $_[0]->copy() to +# preserve the argument. + +# Thus inheritance of overload operators becomes possible and transparent for +# our subclasses without the need to repeat the entire overload section there. + +use overload + + # overload key: with_assign + + '+' => sub { $_[0] -> copy() -> badd($_[1]); }, + + '-' => sub { my $c = $_[0] -> copy; + $_[2] ? $c -> bneg() -> badd($_[1]) + : $c -> bsub($_[1]); }, + + '*' => sub { $_[0] -> copy() -> bmul($_[1]); }, + + '/' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bdiv($_[0]) + : $_[0] -> copy -> bdiv($_[1]); }, + + '%' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bmod($_[0]) + : $_[0] -> copy -> bmod($_[1]); }, + + '**' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bpow($_[0]) + : $_[0] -> copy -> bpow($_[1]); }, + + '<<' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> blsft($_[0]) + : $_[0] -> copy -> blsft($_[1]); }, + + '>>' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> brsft($_[0]) + : $_[0] -> copy -> brsft($_[1]); }, + + # overload key: assign + + '+=' => sub { $_[0]->badd($_[1]); }, + + '-=' => sub { $_[0]->bsub($_[1]); }, + + '*=' => sub { $_[0]->bmul($_[1]); }, + + '/=' => sub { scalar $_[0]->bdiv($_[1]); }, + + '%=' => sub { $_[0]->bmod($_[1]); }, + + '**=' => sub { $_[0]->bpow($_[1]); }, + + + '<<=' => sub { $_[0]->blsft($_[1]); }, + + '>>=' => sub { $_[0]->brsft($_[1]); }, + +# 'x=' => sub { }, + +# '.=' => sub { }, + + # overload key: num_comparison + + '<' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> blt($_[0]) + : $_[0] -> blt($_[1]); }, + + '<=' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> ble($_[0]) + : $_[0] -> ble($_[1]); }, + + '>' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bgt($_[0]) + : $_[0] -> bgt($_[1]); }, + + '>=' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bge($_[0]) + : $_[0] -> bge($_[1]); }, + + '==' => sub { $_[0] -> beq($_[1]); }, + + '!=' => sub { $_[0] -> bne($_[1]); }, + + # overload key: 3way_comparison + + '<=>' => sub { my $cmp = $_[0] -> bcmp($_[1]); + defined($cmp) && $_[2] ? -$cmp : $cmp; }, + + 'cmp' => sub { $_[2] ? "$_[1]" cmp $_[0] -> bstr() + : $_[0] -> bstr() cmp "$_[1]"; }, + + # overload key: str_comparison + +# 'lt' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrlt($_[0]) +# : $_[0] -> bstrlt($_[1]); }, +# +# 'le' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrle($_[0]) +# : $_[0] -> bstrle($_[1]); }, +# +# 'gt' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrgt($_[0]) +# : $_[0] -> bstrgt($_[1]); }, +# +# 'ge' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrge($_[0]) +# : $_[0] -> bstrge($_[1]); }, +# +# 'eq' => sub { $_[0] -> bstreq($_[1]); }, +# +# 'ne' => sub { $_[0] -> bstrne($_[1]); }, + + # overload key: binary + + '&' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> band($_[0]) + : $_[0] -> copy -> band($_[1]); }, + + '&=' => sub { $_[0] -> band($_[1]); }, + + '|' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bior($_[0]) + : $_[0] -> copy -> bior($_[1]); }, + + '|=' => sub { $_[0] -> bior($_[1]); }, + + '^' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bxor($_[0]) + : $_[0] -> copy -> bxor($_[1]); }, + + '^=' => sub { $_[0] -> bxor($_[1]); }, + +# '&.' => sub { }, + +# '&.=' => sub { }, + +# '|.' => sub { }, + +# '|.=' => sub { }, + +# '^.' => sub { }, + +# '^.=' => sub { }, + + # overload key: unary + + 'neg' => sub { $_[0] -> copy() -> bneg(); }, + +# '!' => sub { }, + + '~' => sub { $_[0] -> copy() -> bnot(); }, + +# '~.' => sub { }, + + # overload key: mutators + + '++' => sub { $_[0] -> binc() }, + + '--' => sub { $_[0] -> bdec() }, + + # overload key: func + + 'atan2' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> batan2($_[0]) + : $_[0] -> copy() -> batan2($_[1]); }, + + 'cos' => sub { $_[0] -> copy -> bcos(); }, + + 'sin' => sub { $_[0] -> copy -> bsin(); }, + + 'exp' => sub { $_[0] -> copy() -> bexp($_[1]); }, + + 'abs' => sub { $_[0] -> copy() -> babs(); }, + + 'log' => sub { $_[0] -> copy() -> blog(); }, + + 'sqrt' => sub { $_[0] -> copy() -> bsqrt(); }, + + 'int' => sub { $_[0] -> copy() -> bint(); }, + + # overload key: conversion + + 'bool' => sub { $_[0] -> is_zero() ? '' : 1; }, + + '""' => sub { $_[0] -> bstr(); }, + + '0+' => sub { $_[0] -> numify(); }, + + '=' => sub { $_[0]->copy(); }, + + ; + +############################################################################## +# global constants, flags and accessory + +# These vars are public, but their direct usage is not recommended, use the +# accessor methods instead + +our $round_mode = 'even'; # one of 'even', 'odd', '+inf', '-inf', 'zero', 'trunc' or 'common' +our $accuracy = undef; +our $precision = undef; +our $div_scale = 40; +our $upgrade = undef; # default is no upgrade +our $downgrade = undef; # default is no downgrade + +# These are internally, and not to be used from the outside at all + +our $_trap_nan = 0; # are NaNs ok? set w/ config() +our $_trap_inf = 0; # are infs ok? set w/ config() + +my $nan = 'NaN'; # constants for easier life + +my $CALC = 'Math::BigInt::Calc'; # module to do the low level math + # default is Calc.pm +my $IMPORT = 0; # was import() called yet? + # used to make require work +my %WARN; # warn only once for low-level libs +my %CAN; # cache for $CALC->can(...) +my %CALLBACKS; # callbacks to notify on lib loads +my $EMU_LIB = 'Math/BigInt/CalcEmu.pm'; # emulate low-level math + +############################################################################## +# the old code had $rnd_mode, so we need to support it, too + +our $rnd_mode = 'even'; + +sub TIESCALAR { + my ($class) = @_; + bless \$round_mode, $class; +} + +sub FETCH { + return $round_mode; +} + +sub STORE { + $rnd_mode = $_[0]->round_mode($_[1]); +} + +BEGIN { + # tie to enable $rnd_mode to work transparently + tie $rnd_mode, 'Math::BigInt'; + + # set up some handy alias names + *as_int = \&as_number; + *is_pos = \&is_positive; + *is_neg = \&is_negative; +} + +############################################################################### +# Configuration methods +############################################################################### + +sub round_mode { + no strict 'refs'; + # make Class->round_mode() work + my $self = shift; + my $class = ref($self) || $self || __PACKAGE__; + if (defined $_[0]) { + my $m = shift; + if ($m !~ /^(even|odd|\+inf|\-inf|zero|trunc|common)$/) { + Carp::croak("Unknown round mode '$m'"); + } + return ${"${class}::round_mode"} = $m; + } + ${"${class}::round_mode"}; +} + +sub upgrade { + no strict 'refs'; + # make Class->upgrade() work + my $self = shift; + my $class = ref($self) || $self || __PACKAGE__; + # need to set new value? + if (@_ > 0) { + return ${"${class}::upgrade"} = $_[0]; + } + ${"${class}::upgrade"}; +} + +sub downgrade { + no strict 'refs'; + # make Class->downgrade() work + my $self = shift; + my $class = ref($self) || $self || __PACKAGE__; + # need to set new value? + if (@_ > 0) { + return ${"${class}::downgrade"} = $_[0]; + } + ${"${class}::downgrade"}; +} + +sub div_scale { + no strict 'refs'; + # make Class->div_scale() work + my $self = shift; + my $class = ref($self) || $self || __PACKAGE__; + if (defined $_[0]) { + if ($_[0] < 0) { + Carp::croak('div_scale must be greater than zero'); + } + ${"${class}::div_scale"} = $_[0]; + } + ${"${class}::div_scale"}; +} + +sub accuracy { + # $x->accuracy($a); ref($x) $a + # $x->accuracy(); ref($x) + # Class->accuracy(); class + # Class->accuracy($a); class $a + + my $x = shift; + my $class = ref($x) || $x || __PACKAGE__; + + no strict 'refs'; + # need to set new value? + if (@_ > 0) { + my $a = shift; + # convert objects to scalars to avoid deep recursion. If object doesn't + # have numify(), then hopefully it will have overloading for int() and + # boolean test without wandering into a deep recursion path... + $a = $a->numify() if ref($a) && $a->can('numify'); + + if (defined $a) { + # also croak on non-numerical + if (!$a || $a <= 0) { + Carp::croak('Argument to accuracy must be greater than zero'); + } + if (int($a) != $a) { + Carp::croak('Argument to accuracy must be an integer'); + } + } + if (ref($x)) { + # $object->accuracy() or fallback to global + $x->bround($a) if $a; # not for undef, 0 + $x->{_a} = $a; # set/overwrite, even if not rounded + delete $x->{_p}; # clear P + $a = ${"${class}::accuracy"} unless defined $a; # proper return value + } else { + ${"${class}::accuracy"} = $a; # set global A + ${"${class}::precision"} = undef; # clear global P + } + return $a; # shortcut + } + + my $a; + # $object->accuracy() or fallback to global + $a = $x->{_a} if ref($x); + # but don't return global undef, when $x's accuracy is 0! + $a = ${"${class}::accuracy"} if !defined $a; + $a; +} + +sub precision { + # $x->precision($p); ref($x) $p + # $x->precision(); ref($x) + # Class->precision(); class + # Class->precision($p); class $p + + my $x = shift; + my $class = ref($x) || $x || __PACKAGE__; + + no strict 'refs'; + if (@_ > 0) { + my $p = shift; + # convert objects to scalars to avoid deep recursion. If object doesn't + # have numify(), then hopefully it will have overloading for int() and + # boolean test without wandering into a deep recursion path... + $p = $p->numify() if ref($p) && $p->can('numify'); + if ((defined $p) && (int($p) != $p)) { + Carp::croak('Argument to precision must be an integer'); + } + if (ref($x)) { + # $object->precision() or fallback to global + $x->bfround($p) if $p; # not for undef, 0 + $x->{_p} = $p; # set/overwrite, even if not rounded + delete $x->{_a}; # clear A + $p = ${"${class}::precision"} unless defined $p; # proper return value + } else { + ${"${class}::precision"} = $p; # set global P + ${"${class}::accuracy"} = undef; # clear global A + } + return $p; # shortcut + } + + my $p; + # $object->precision() or fallback to global + $p = $x->{_p} if ref($x); + # but don't return global undef, when $x's precision is 0! + $p = ${"${class}::precision"} if !defined $p; + $p; +} + +sub config { + # return (or set) configuration data as hash ref + my $class = shift || __PACKAGE__; + + no strict 'refs'; + if (@_ > 1 || (@_ == 1 && (ref($_[0]) eq 'HASH'))) { + # try to set given options as arguments from hash + + my $args = $_[0]; + if (ref($args) ne 'HASH') { + $args = { @_ }; + } + # these values can be "set" + my $set_args = {}; + foreach my $key (qw/ + accuracy precision + round_mode div_scale + upgrade downgrade + trap_inf trap_nan + /) + { + $set_args->{$key} = $args->{$key} if exists $args->{$key}; + delete $args->{$key}; + } + if (keys %$args > 0) { + Carp::croak("Illegal key(s) '", join("', '", keys %$args), + "' passed to $class\->config()"); + } + foreach my $key (keys %$set_args) { + if ($key =~ /^trap_(inf|nan)\z/) { + ${"${class}::_trap_$1"} = ($set_args->{"trap_$1"} ? 1 : 0); + next; + } + # use a call instead of just setting the $variable to check argument + $class->$key($set_args->{$key}); + } + } + + # now return actual configuration + + my $cfg = { + lib => $CALC, + lib_version => ${"${CALC}::VERSION"}, + class => $class, + trap_nan => ${"${class}::_trap_nan"}, + trap_inf => ${"${class}::_trap_inf"}, + version => ${"${class}::VERSION"}, + }; + foreach my $key (qw/ + accuracy precision + round_mode div_scale + upgrade downgrade + /) + { + $cfg->{$key} = ${"${class}::$key"}; + } + if (@_ == 1 && (ref($_[0]) ne 'HASH')) { + # calls of the style config('lib') return just this value + return $cfg->{$_[0]}; + } + $cfg; +} + +sub _scale_a { + # select accuracy parameter based on precedence, + # used by bround() and bfround(), may return undef for scale (means no op) + my ($x, $scale, $mode) = @_; + + $scale = $x->{_a} unless defined $scale; + + no strict 'refs'; + my $class = ref($x); + + $scale = ${ $class . '::accuracy' } unless defined $scale; + $mode = ${ $class . '::round_mode' } unless defined $mode; + + if (defined $scale) { + $scale = $scale->can('numify') ? $scale->numify() + : "$scale" if ref($scale); + $scale = int($scale); + } + + ($scale, $mode); +} + +sub _scale_p { + # select precision parameter based on precedence, + # used by bround() and bfround(), may return undef for scale (means no op) + my ($x, $scale, $mode) = @_; + + $scale = $x->{_p} unless defined $scale; + + no strict 'refs'; + my $class = ref($x); + + $scale = ${ $class . '::precision' } unless defined $scale; + $mode = ${ $class . '::round_mode' } unless defined $mode; + + if (defined $scale) { + $scale = $scale->can('numify') ? $scale->numify() + : "$scale" if ref($scale); + $scale = int($scale); + } + + ($scale, $mode); +} + +############################################################################### +# Constructor methods +############################################################################### + +sub new { + # Create a new Math::BigInt object from a string or another Math::BigInt + # object. See hash keys documented at top. + + # The argument could be an object, so avoid ||, && etc. on it. This would + # cause costly overloaded code to be called. The only allowed ops are ref() + # and defined. + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # The POD says: + # + # "Currently, Math::BigInt->new() defaults to 0, while Math::BigInt->new('') + # results in 'NaN'. This might change in the future, so use always the + # following explicit forms to get a zero or NaN: + # $zero = Math::BigInt->bzero(); + # $nan = Math::BigInt->bnan(); + # + # But although this use has been discouraged for more than 10 years, people + # apparently still use it, so we still support it. + + return $self->bzero() unless @_; + + my ($wanted, $a, $p, $r) = @_; + + # Always return a new object, so it called as an instance method, copy the + # invocand, and if called as a class method, initialize a new object. + + $self = $selfref ? $self -> copy() + : bless {}, $class; + + unless (defined $wanted) { + #Carp::carp("Use of uninitialized value in new()"); + return $self->bzero($a, $p, $r); + } + + if (ref($wanted) && $wanted->isa($class)) { # MBI or subclass + # Using "$copy = $wanted -> copy()" here fails some tests. Fixme! + my $copy = $class -> copy($wanted); + if ($selfref) { + %$self = %$copy; + } else { + $self = $copy; + } + return $self; + } + + $class->import() if $IMPORT == 0; # make require work + + # Shortcut for non-zero scalar integers with no non-zero exponent. + + if (!ref($wanted) && + $wanted =~ / ^ + ([+-]?) # optional sign + ([1-9][0-9]*) # non-zero significand + (\.0*)? # ... with optional zero fraction + ([Ee][+-]?0+)? # optional zero exponent + \z + /x) + { + my $sgn = $1; + my $abs = $2; + $self->{sign} = $sgn || '+'; + $self->{value} = $CALC->_new($abs); + + no strict 'refs'; + if (defined($a) || defined($p) + || defined(${"${class}::precision"}) + || defined(${"${class}::accuracy"})) + { + $self->round($a, $p, $r) + unless @_ >= 3 && !defined $a && !defined $p; + } + + return $self; + } + + # Handle Infs. + + if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) { + my $sgn = $1 || '+'; + $self->{sign} = $sgn . 'inf'; # set a default sign for bstr() + return $class->binf($sgn); + } + + # Handle explicit NaNs (not the ones returned due to invalid input). + + if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) { + $self = $class -> bnan(); + $self->round($a, $p, $r) unless @_ >= 3 && !defined $a && !defined $p; + return $self; + } + + # Handle hexadecimal numbers. + + if ($wanted =~ /^\s*[+-]?0[Xx]/) { + $self = $class -> from_hex($wanted); + $self->round($a, $p, $r) unless @_ >= 3 && !defined $a && !defined $p; + return $self; + } + + # Handle binary numbers. + + if ($wanted =~ /^\s*[+-]?0[Bb]/) { + $self = $class -> from_bin($wanted); + $self->round($a, $p, $r) unless @_ >= 3 && !defined $a && !defined $p; + return $self; + } + + # Split string into mantissa, exponent, integer, fraction, value, and sign. + my ($mis, $miv, $mfv, $es, $ev) = _split($wanted); + if (!ref $mis) { + if ($_trap_nan) { + Carp::croak("$wanted is not a number in $class"); + } + $self->{value} = $CALC->_zero(); + $self->{sign} = $nan; + return $self; + } + + if (!ref $miv) { + # _from_hex or _from_bin + $self->{value} = $mis->{value}; + $self->{sign} = $mis->{sign}; + return $self; # throw away $mis + } + + # Make integer from mantissa by adjusting exponent, then convert to a + # Math::BigInt. + $self->{sign} = $$mis; # store sign + $self->{value} = $CALC->_zero(); # for all the NaN cases + my $e = int("$$es$$ev"); # exponent (avoid recursion) + if ($e > 0) { + my $diff = $e - CORE::length($$mfv); + if ($diff < 0) { # Not integer + if ($_trap_nan) { + Carp::croak("$wanted not an integer in $class"); + } + #print "NOI 1\n"; + return $upgrade->new($wanted, $a, $p, $r) if defined $upgrade; + $self->{sign} = $nan; + } else { # diff >= 0 + # adjust fraction and add it to value + #print "diff > 0 $$miv\n"; + $$miv = $$miv . ($$mfv . '0' x $diff); + } + } + + else { + if ($$mfv ne '') { # e <= 0 + # fraction and negative/zero E => NOI + if ($_trap_nan) { + Carp::croak("$wanted not an integer in $class"); + } + #print "NOI 2 \$\$mfv '$$mfv'\n"; + return $upgrade->new($wanted, $a, $p, $r) if defined $upgrade; + $self->{sign} = $nan; + } elsif ($e < 0) { + # xE-y, and empty mfv + # Split the mantissa at the decimal point. E.g., if + # $$miv = 12345 and $e = -2, then $frac = 45 and $$miv = 123. + + my $frac = substr($$miv, $e); # $frac is fraction part + substr($$miv, $e) = ""; # $$miv is now integer part + + if ($frac =~ /[^0]/) { + if ($_trap_nan) { + Carp::croak("$wanted not an integer in $class"); + } + #print "NOI 3\n"; + return $upgrade->new($wanted, $a, $p, $r) if defined $upgrade; + $self->{sign} = $nan; + } + } + } + + unless ($self->{sign} eq $nan) { + $self->{sign} = '+' if $$miv eq '0'; # normalize -0 => +0 + $self->{value} = $CALC->_new($$miv) if $self->{sign} =~ /^[+-]$/; + } + + # If any of the globals are set, use them to round, and store them inside + # $self. Do not round for new($x, undef, undef) since that is used by MBF + # to signal no rounding. + + $self->round($a, $p, $r) unless @_ >= 3 && !defined $a && !defined $p; + $self; +} + +# Create a Math::BigInt from a hexadecimal string. + +sub from_hex { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_hex'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + + if ($str =~ s/ + ^ + \s* + ( [+-]? ) + (0?x)? + ( + [0-9a-fA-F]* + ( _ [0-9a-fA-F]+ )* + ) + \s* + $ + //x) + { + # Get a "clean" version of the string, i.e., non-emtpy and with no + # underscores or invalid characters. + + my $sign = $1; + my $chrs = $3; + $chrs =~ tr/_//d; + $chrs = '0' unless CORE::length $chrs; + + # The library method requires a prefix. + + $self->{value} = $CALC->_from_hex('0x' . $chrs); + + # Place the sign. + + $self->{sign} = $sign eq '-' && ! $CALC->_is_zero($self->{value}) + ? '-' : '+'; + + return $self; + } + + # CORE::hex() parses as much as it can, and ignores any trailing garbage. + # For backwards compatibility, we return NaN. + + return $self->bnan(); +} + +# Create a Math::BigInt from an octal string. + +sub from_oct { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_oct'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + + if ($str =~ s/ + ^ + \s* + ( [+-]? ) + ( + [0-7]* + ( _ [0-7]+ )* + ) + \s* + $ + //x) + { + # Get a "clean" version of the string, i.e., non-emtpy and with no + # underscores or invalid characters. + + my $sign = $1; + my $chrs = $2; + $chrs =~ tr/_//d; + $chrs = '0' unless CORE::length $chrs; + + # The library method requires a prefix. + + $self->{value} = $CALC->_from_oct('0' . $chrs); + + # Place the sign. + + $self->{sign} = $sign eq '-' && ! $CALC->_is_zero($self->{value}) + ? '-' : '+'; + + return $self; + } + + # CORE::oct() parses as much as it can, and ignores any trailing garbage. + # For backwards compatibility, we return NaN. + + return $self->bnan(); +} + +# Create a Math::BigInt from a binary string. + +sub from_bin { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_bin'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + + if ($str =~ s/ + ^ + \s* + ( [+-]? ) + (0?b)? + ( + [01]* + ( _ [01]+ )* + ) + \s* + $ + //x) + { + # Get a "clean" version of the string, i.e., non-emtpy and with no + # underscores or invalid characters. + + my $sign = $1; + my $chrs = $3; + $chrs =~ tr/_//d; + $chrs = '0' unless CORE::length $chrs; + + # The library method requires a prefix. + + $self->{value} = $CALC->_from_bin('0b' . $chrs); + + # Place the sign. + + $self->{sign} = $sign eq '-' && ! $CALC->_is_zero($self->{value}) + ? '-' : '+'; + + return $self; + } + + # For consistency with from_hex() and from_oct(), we return NaN when the + # input is invalid. + + return $self->bnan(); +} + +# Create a Math::BigInt from a byte string. + +sub from_bytes { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_bytes'); + + Carp::croak("from_bytes() requires a newer version of the $CALC library.") + unless $CALC->can('_from_bytes'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + $self -> {sign} = '+'; + $self -> {value} = $CALC -> _from_bytes($str); + return $self; +} + +sub bzero { + # create/assign '+0' + + if (@_ == 0) { + #Carp::carp("Using bzero() as a function is deprecated;", + # " use bzero() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self->import() if $IMPORT == 0; # make require work + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('bzero'); + + $self = bless {}, $class unless $selfref; + + $self->{sign} = '+'; + $self->{value} = $CALC->_zero(); + + if (@_ > 0) { + if (@_ > 3) { + # call like: $x->bzero($a, $p, $r, $y, ...); + ($self, $self->{_a}, $self->{_p}) = $self->_find_round_parameters(@_); + } else { + # call like: $x->bzero($a, $p, $r); + $self->{_a} = $_[0] + if !defined $self->{_a} || (defined $_[0] && $_[0] > $self->{_a}); + $self->{_p} = $_[1] + if !defined $self->{_p} || (defined $_[1] && $_[1] > $self->{_p}); + } + } + + return $self; +} + +sub bone { + # Create or assign '+1' (or -1 if given sign '-'). + + if (@_ == 0 || (defined($_[0]) && ($_[0] eq '+' || $_[0] eq '-'))) { + #Carp::carp("Using bone() as a function is deprecated;", + # " use bone() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self->import() if $IMPORT == 0; # make require work + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('bone'); + + my $sign = shift; + $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+"; + + $self = bless {}, $class unless $selfref; + + $self->{sign} = $sign; + $self->{value} = $CALC->_one(); + + if (@_ > 0) { + if (@_ > 3) { + # call like: $x->bone($sign, $a, $p, $r, $y, ...); + ($self, $self->{_a}, $self->{_p}) = $self->_find_round_parameters(@_); + } else { + # call like: $x->bone($sign, $a, $p, $r); + $self->{_a} = $_[0] + if !defined $self->{_a} || (defined $_[0] && $_[0] > $self->{_a}); + $self->{_p} = $_[1] + if !defined $self->{_p} || (defined $_[1] && $_[1] > $self->{_p}); + } + } + + return $self; +} + +sub binf { + # create/assign a '+inf' or '-inf' + + if (@_ == 0 || (defined($_[0]) && !ref($_[0]) && + $_[0] =~ /^\s*[+-](inf(inity)?)?\s*$/)) + { + #Carp::carp("Using binf() as a function is deprecated;", + # " use binf() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + { + no strict 'refs'; + if (${"${class}::_trap_inf"}) { + Carp::croak("Tried to create +-inf in $class->binf()"); + } + } + + $self->import() if $IMPORT == 0; # make require work + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('binf'); + + my $sign = shift; + $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+"; + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = $sign . 'inf'; + $self -> {value} = $CALC -> _zero(); + + return $self; +} + +sub bnan { + # create/assign a 'NaN' + + if (@_ == 0) { + #Carp::carp("Using bnan() as a function is deprecated;", + # " use bnan() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref($self); + my $class = $selfref || $self; + + { + no strict 'refs'; + if (${"${class}::_trap_nan"}) { + Carp::croak("Tried to create NaN in $class->bnan()"); + } + } + + $self->import() if $IMPORT == 0; # make require work + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('bnan'); + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = $nan; + $self -> {value} = $CALC -> _zero(); + + return $self; +} + +sub bpi { + # Calculate PI to N digits. Unless upgrading is in effect, returns the + # result truncated to an integer, that is, always returns '3'. + my ($self, $n) = @_; + if (@_ == 1) { + # called like Math::BigInt::bpi(10); + $n = $self; + $self = $class; + } + $self = ref($self) if ref($self); + + return $upgrade->new($n) if defined $upgrade; + + # hard-wired to "3" + $self->new(3); +} + +sub copy { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # If called as a class method, the object to copy is the next argument. + + $self = shift() unless $selfref; + + my $copy = bless {}, $class; + + $copy->{sign} = $self->{sign}; + $copy->{value} = $CALC->_copy($self->{value}); + $copy->{_a} = $self->{_a} if exists $self->{_a}; + $copy->{_p} = $self->{_p} if exists $self->{_p}; + + return $copy; +} + +sub as_number { + # An object might be asked to return itself as bigint on certain overloaded + # operations. This does exactly this, so that sub classes can simple inherit + # it or override with their own integer conversion routine. + $_[0]->copy(); +} + +############################################################################### +# Boolean methods +############################################################################### + +sub is_zero { + # return true if arg (BINT or num_str) is zero (array '+', '0') + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 0 if $x->{sign} !~ /^\+$/; # -, NaN & +-inf aren't + $CALC->_is_zero($x->{value}); +} + +sub is_one { + # return true if arg (BINT or num_str) is +1, or -1 if sign is given + my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + $sign = '+' if !defined $sign || $sign ne '-'; + + return 0 if $x->{sign} ne $sign; # -1 != +1, NaN, +-inf aren't either + $CALC->_is_one($x->{value}); +} + +sub is_finite { + my $x = shift; + return $x->{sign} eq '+' || $x->{sign} eq '-'; +} + +sub is_inf { + # return true if arg (BINT or num_str) is +-inf + my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + if (defined $sign) { + $sign = '[+-]inf' if $sign eq ''; # +- doesn't matter, only that's inf + $sign = "[$1]inf" if $sign =~ /^([+-])(inf)?$/; # extract '+' or '-' + return $x->{sign} =~ /^$sign$/ ? 1 : 0; + } + $x->{sign} =~ /^[+-]inf$/ ? 1 : 0; # only +-inf is infinity +} + +sub is_nan { + # return true if arg (BINT or num_str) is NaN + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + $x->{sign} eq $nan ? 1 : 0; +} + +sub is_positive { + # return true when arg (BINT or num_str) is positive (> 0) + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 1 if $x->{sign} eq '+inf'; # +inf is positive + + # 0+ is neither positive nor negative + ($x->{sign} eq '+' && !$x->is_zero()) ? 1 : 0; +} + +sub is_negative { + # return true when arg (BINT or num_str) is negative (< 0) + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + $x->{sign} =~ /^-/ ? 1 : 0; # -inf is negative, but NaN is not +} + +sub is_odd { + # return true when arg (BINT or num_str) is odd, false for even + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't + $CALC->_is_odd($x->{value}); +} + +sub is_even { + # return true when arg (BINT or num_str) is even, false for odd + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't + $CALC->_is_even($x->{value}); +} + +sub is_int { + # return true when arg (BINT or num_str) is an integer + # always true for Math::BigInt, but different for Math::BigFloat objects + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + $x->{sign} =~ /^[+-]$/ ? 1 : 0; # inf/-inf/NaN aren't +} + +############################################################################### +# Comparison methods +############################################################################### + +sub bcmp { + # Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort) + # (BINT or num_str, BINT or num_str) return cond_code + + # set up parameters + my ($class, $x, $y) = ref($_[0]) && ref($_[0]) eq ref($_[1]) + ? (ref($_[0]), @_) + : objectify(2, @_); + + return $upgrade->bcmp($x, $y) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) { + # handle +-inf and NaN + return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/; + return +1 if $x->{sign} eq '+inf'; + return -1 if $x->{sign} eq '-inf'; + return -1 if $y->{sign} eq '+inf'; + return +1; + } + # check sign for speed first + return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # does also 0 <=> -y + return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # does also -x <=> 0 + + # have same sign, so compare absolute values. Don't make tests for zero + # here because it's actually slower than testing in Calc (especially w/ Pari + # et al) + + # post-normalized compare for internal use (honors signs) + if ($x->{sign} eq '+') { + # $x and $y both > 0 + return $CALC->_acmp($x->{value}, $y->{value}); + } + + # $x && $y both < 0 + $CALC->_acmp($y->{value}, $x->{value}); # swapped acmp (lib returns 0, 1, -1) +} + +sub bacmp { + # Compares 2 values, ignoring their signs. + # Returns one of undef, <0, =0, >0. (suitable for sort) + # (BINT, BINT) return cond_code + + # set up parameters + my ($class, $x, $y) = ref($_[0]) && ref($_[0]) eq ref($_[1]) + ? (ref($_[0]), @_) + : objectify(2, @_); + + return $upgrade->bacmp($x, $y) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) { + # handle +-inf and NaN + return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/; + return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/; + return -1; + } + $CALC->_acmp($x->{value}, $y->{value}); # lib does only 0, 1, -1 +} + +sub beq { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'beq() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for beq()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && ! $cmp; +} + +sub bne { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'bne() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for bne()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && ! $cmp ? '' : 1; +} + +sub blt { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'blt() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for blt()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp < 0; +} + +sub ble { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'ble() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for ble()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp <= 0; +} + +sub bgt { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'bgt() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for bgt()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp > 0; +} + +sub bge { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'bge() is an instance method, not a class method' + unless $selfref; + Carp::croak 'Wrong number of arguments for bge()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp >= 0; +} + +############################################################################### +# Arithmetic methods +############################################################################### + +sub bneg { + # (BINT or num_str) return BINT + # negate number or make a negated number from string + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x if $x->modify('bneg'); + + # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN' + $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $CALC->_is_zero($x->{value})); + $x; +} + +sub babs { + # (BINT or num_str) return BINT + # make number absolute, or return absolute BINT from string + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x if $x->modify('babs'); + # post-normalized abs for internal use (does nothing for NaN) + $x->{sign} =~ s/^-/+/; + $x; +} + +sub bsgn { + # Signum function. + + my $self = shift; + + return $self if $self->modify('bsgn'); + + return $self -> bone("+") if $self -> is_pos(); + return $self -> bone("-") if $self -> is_neg(); + return $self; # zero or NaN +} + +sub bnorm { + # (numstr or BINT) return BINT + # Normalize number -- no-op here + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + $x; +} + +sub binc { + # increment arg by one + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + return $x if $x->modify('binc'); + + if ($x->{sign} eq '+') { + $x->{value} = $CALC->_inc($x->{value}); + return $x->round($a, $p, $r); + } elsif ($x->{sign} eq '-') { + $x->{value} = $CALC->_dec($x->{value}); + $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # -1 +1 => -0 => +0 + return $x->round($a, $p, $r); + } + # inf, nan handling etc + $x->badd($class->bone(), $a, $p, $r); # badd does round +} + +sub bdec { + # decrement arg by one + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + return $x if $x->modify('bdec'); + + if ($x->{sign} eq '-') { + # x already < 0 + $x->{value} = $CALC->_inc($x->{value}); + } else { + return $x->badd($class->bone('-'), @r) + unless $x->{sign} eq '+'; # inf or NaN + # >= 0 + if ($CALC->_is_zero($x->{value})) { + # == 0 + $x->{value} = $CALC->_one(); + $x->{sign} = '-'; # 0 => -1 + } else { + # > 0 + $x->{value} = $CALC->_dec($x->{value}); + } + } + $x->round(@r); +} + +#sub bstrcmp { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstrcmp() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstrcmp()' unless @_ == 1; +# +# return $self -> bstr() CORE::cmp shift; +#} +# +#sub bstreq { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstreq() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstreq()' unless @_ == 1; +# +# my $cmp = $self -> bstrcmp(shift); +# return defined($cmp) && ! $cmp; +#} +# +#sub bstrne { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstrne() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstrne()' unless @_ == 1; +# +# my $cmp = $self -> bstrcmp(shift); +# return defined($cmp) && ! $cmp ? '' : 1; +#} +# +#sub bstrlt { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstrlt() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstrlt()' unless @_ == 1; +# +# my $cmp = $self -> bstrcmp(shift); +# return defined($cmp) && $cmp < 0; +#} +# +#sub bstrle { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstrle() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstrle()' unless @_ == 1; +# +# my $cmp = $self -> bstrcmp(shift); +# return defined($cmp) && $cmp <= 0; +#} +# +#sub bstrgt { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstrgt() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstrgt()' unless @_ == 1; +# +# my $cmp = $self -> bstrcmp(shift); +# return defined($cmp) && $cmp > 0; +#} +# +#sub bstrge { +# my $self = shift; +# my $selfref = ref $self; +# my $class = $selfref || $self; +# +# Carp::croak 'bstrge() is an instance method, not a class method' +# unless $selfref; +# Carp::croak 'Wrong number of arguments for bstrge()' unless @_ == 1; +# +# my $cmp = $self -> bstrcmp(shift); +# return defined($cmp) && $cmp >= 0; +#} + +sub badd { + # add second arg (BINT or string) to first (BINT) (modifies first) + # return result as BINT + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('badd'); + return $upgrade->badd($upgrade->new($x), $upgrade->new($y), @r) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + $r[3] = $y; # no push! + # inf and NaN handling + if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) { + # NaN first + return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + # inf handling + if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/)) { + # +inf++inf or -inf+-inf => same, rest is NaN + return $x if $x->{sign} eq $y->{sign}; + return $x->bnan(); + } + # +-inf + something => +inf + # something +-inf => +-inf + $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/; + return $x; + } + + my ($sx, $sy) = ($x->{sign}, $y->{sign}); # get signs + + if ($sx eq $sy) { + $x->{value} = $CALC->_add($x->{value}, $y->{value}); # same sign, abs add + } else { + my $a = $CALC->_acmp ($y->{value}, $x->{value}); # absolute compare + if ($a > 0) { + $x->{value} = $CALC->_sub($y->{value}, $x->{value}, 1); # abs sub w/ swap + $x->{sign} = $sy; + } elsif ($a == 0) { + # speedup, if equal, set result to 0 + $x->{value} = $CALC->_zero(); + $x->{sign} = '+'; + } else # a < 0 + { + $x->{value} = $CALC->_sub($x->{value}, $y->{value}); # abs sub + } + } + $x->round(@r); +} + +sub bsub { + # (BINT or num_str, BINT or num_str) return BINT + # subtract second arg from first, modify first + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x -> modify('bsub'); + + return $upgrade -> new($x) -> bsub($upgrade -> new($y), @r) + if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class)); + + return $x -> round(@r) if $y -> is_zero(); + + # To correctly handle the lone special case $x -> bsub($x), we note the + # sign of $x, then flip the sign from $y, and if the sign of $x did change, + # too, then we caught the special case: + + my $xsign = $x -> {sign}; + $y -> {sign} =~ tr/+-/-+/; # does nothing for NaN + if ($xsign ne $x -> {sign}) { + # special case of $x -> bsub($x) results in 0 + return $x -> bzero(@r) if $xsign =~ /^[+-]$/; + return $x -> bnan(); # NaN, -inf, +inf + } + $x -> badd($y, @r); # badd does not leave internal zeros + $y -> {sign} =~ tr/+-/-+/; # refix $y (does nothing for NaN) + $x; # already rounded by badd() or no rounding +} + +sub bmul { + # multiply the first number by the second number + # (BINT or num_str, BINT or num_str) return BINT + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bmul'); + + return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + + # inf handling + if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) { + return $x->bnan() if $x->is_zero() || $y->is_zero(); + # result will always be +-inf: + # +inf * +/+inf => +inf, -inf * -/-inf => +inf + # +inf * -/-inf => -inf, -inf * +/+inf => -inf + return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); + return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); + return $x->binf('-'); + } + + return $upgrade->bmul($x, $upgrade->new($y), @r) + if defined $upgrade && !$y->isa($class); + + $r[3] = $y; # no push here + + $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => + + + $x->{value} = $CALC->_mul($x->{value}, $y->{value}); # do actual math + $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # no -0 + + $x->round(@r); +} + +sub bmuladd { + # multiply two numbers and then add the third to the result + # (BINT or num_str, BINT or num_str, BINT or num_str) return BINT + + # set up parameters + my ($class, $x, $y, $z, @r) = objectify(3, @_); + + return $x if $x->modify('bmuladd'); + + return $x->bnan() if (($x->{sign} eq $nan) || + ($y->{sign} eq $nan) || + ($z->{sign} eq $nan)); + + # inf handling of x and y + if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) { + return $x->bnan() if $x->is_zero() || $y->is_zero(); + # result will always be +-inf: + # +inf * +/+inf => +inf, -inf * -/-inf => +inf + # +inf * -/-inf => -inf, -inf * +/+inf => -inf + return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); + return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); + return $x->binf('-'); + } + # inf handling x*y and z + if (($z->{sign} =~ /^[+-]inf$/)) { + # something +-inf => +-inf + $x->{sign} = $z->{sign}, return $x if $z->{sign} =~ /^[+-]inf$/; + } + + return $upgrade->bmuladd($x, $upgrade->new($y), $upgrade->new($z), @r) + if defined $upgrade && (!$y->isa($class) || !$z->isa($class) || !$x->isa($class)); + + # TODO: what if $y and $z have A or P set? + $r[3] = $z; # no push here + + $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; # +1 * +1 or -1 * -1 => + + + $x->{value} = $CALC->_mul($x->{value}, $y->{value}); # do actual math + $x->{sign} = '+' if $CALC->_is_zero($x->{value}); # no -0 + + my ($sx, $sz) = ( $x->{sign}, $z->{sign} ); # get signs + + if ($sx eq $sz) { + $x->{value} = $CALC->_add($x->{value}, $z->{value}); # same sign, abs add + } else { + my $a = $CALC->_acmp ($z->{value}, $x->{value}); # absolute compare + if ($a > 0) { + $x->{value} = $CALC->_sub($z->{value}, $x->{value}, 1); # abs sub w/ swap + $x->{sign} = $sz; + } elsif ($a == 0) { + # speedup, if equal, set result to 0 + $x->{value} = $CALC->_zero(); + $x->{sign} = '+'; + } else # a < 0 + { + $x->{value} = $CALC->_sub($x->{value}, $z->{value}); # abs sub + } + } + $x->round(@r); +} + +sub bdiv { + # This does floored division, where the quotient is floored, i.e., rounded + # towards negative infinity. As a consequence, the remainder has the same + # sign as the divisor. + + # Set up parameters. + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify() is costly, so avoid it if we can. + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x -> modify('bdiv'); + + my $wantarray = wantarray; # call only once + + # At least one argument is NaN. Return NaN for both quotient and the + # modulo/remainder. + + if ($x -> is_nan() || $y -> is_nan()) { + return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan(); + } + + # Divide by zero and modulo zero. + # + # Division: Use the common convention that x / 0 is inf with the same sign + # as x, except when x = 0, where we return NaN. This is also what earlier + # versions did. + # + # Modulo: In modular arithmetic, the congruence relation z = x (mod y) + # means that there is some integer k such that z - x = k y. If y = 0, we + # get z - x = 0 or z = x. This is also what earlier versions did, except + # that 0 % 0 returned NaN. + # + # inf / 0 = inf inf % 0 = inf + # 5 / 0 = inf 5 % 0 = 5 + # 0 / 0 = NaN 0 % 0 = 0 + # -5 / 0 = -inf -5 % 0 = -5 + # -inf / 0 = -inf -inf % 0 = -inf + + if ($y -> is_zero()) { + my $rem; + if ($wantarray) { + $rem = $x -> copy(); + } + if ($x -> is_zero()) { + $x -> bnan(); + } else { + $x -> binf($x -> {sign}); + } + return $wantarray ? ($x, $rem) : $x; + } + + # Numerator (dividend) is +/-inf, and denominator is finite and non-zero. + # The divide by zero cases are covered above. In all of the cases listed + # below we return the same as core Perl. + # + # inf / -inf = NaN inf % -inf = NaN + # inf / -5 = -inf inf % -5 = NaN + # inf / 5 = inf inf % 5 = NaN + # inf / inf = NaN inf % inf = NaN + # + # -inf / -inf = NaN -inf % -inf = NaN + # -inf / -5 = inf -inf % -5 = NaN + # -inf / 5 = -inf -inf % 5 = NaN + # -inf / inf = NaN -inf % inf = NaN + + if ($x -> is_inf()) { + my $rem; + $rem = $class -> bnan() if $wantarray; + if ($y -> is_inf()) { + $x -> bnan(); + } else { + my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-'; + $x -> binf($sign); + } + return $wantarray ? ($x, $rem) : $x; + } + + # Denominator (divisor) is +/-inf. The cases when the numerator is +/-inf + # are covered above. In the modulo cases (in the right column) we return + # the same as core Perl, which does floored division, so for consistency we + # also do floored division in the division cases (in the left column). + # + # -5 / inf = -1 -5 % inf = inf + # 0 / inf = 0 0 % inf = 0 + # 5 / inf = 0 5 % inf = 5 + # + # -5 / -inf = 0 -5 % -inf = -5 + # 0 / -inf = 0 0 % -inf = 0 + # 5 / -inf = -1 5 % -inf = -inf + + if ($y -> is_inf()) { + my $rem; + if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) { + $rem = $x -> copy() if $wantarray; + $x -> bzero(); + } else { + $rem = $class -> binf($y -> {sign}) if $wantarray; + $x -> bone('-'); + } + return $wantarray ? ($x, $rem) : $x; + } + + # At this point, both the numerator and denominator are finite numbers, and + # the denominator (divisor) is non-zero. + + return $upgrade -> bdiv($upgrade -> new($x), $upgrade -> new($y), @r) + if defined $upgrade; + + $r[3] = $y; # no push! + + # Inialize remainder. + + my $rem = $class -> bzero(); + + # Are both operands the same object, i.e., like $x -> bdiv($x)? If so, + # flipping the sign of $y also flips the sign of $x. + + my $xsign = $x -> {sign}; + my $ysign = $y -> {sign}; + + $y -> {sign} =~ tr/+-/-+/; # Flip the sign of $y, and see ... + my $same = $xsign ne $x -> {sign}; # ... if that changed the sign of $x. + $y -> {sign} = $ysign; # Re-insert the original sign. + + if ($same) { + $x -> bone(); + } else { + ($x -> {value}, $rem -> {value}) = + $CALC -> _div($x -> {value}, $y -> {value}); + + if ($CALC -> _is_zero($rem -> {value})) { + if ($xsign eq $ysign || $CALC -> _is_zero($x -> {value})) { + $x -> {sign} = '+'; + } else { + $x -> {sign} = '-'; + } + } else { + if ($xsign eq $ysign) { + $x -> {sign} = '+'; + } else { + if ($xsign eq '+') { + $x -> badd(1); + } else { + $x -> bsub(1); + } + $x -> {sign} = '-'; + } + } + } + + $x -> round(@r); + + if ($wantarray) { + unless ($CALC -> _is_zero($rem -> {value})) { + if ($xsign ne $ysign) { + $rem = $y -> copy() -> babs() -> bsub($rem); + } + $rem -> {sign} = $ysign; + } + $rem -> {_a} = $x -> {_a}; + $rem -> {_p} = $x -> {_p}; + $rem -> round(@r); + return ($x, $rem); + } + + return $x; +} + +sub btdiv { + # This does truncated division, where the quotient is truncted, i.e., + # rounded towards zero. + # + # ($q, $r) = $x -> btdiv($y) returns $q and $r so that $q is int($x / $y) + # and $q * $y + $r = $x. + + # Set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it if we can. + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x -> modify('btdiv'); + + my $wantarray = wantarray; # call only once + + # At least one argument is NaN. Return NaN for both quotient and the + # modulo/remainder. + + if ($x -> is_nan() || $y -> is_nan()) { + return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan(); + } + + # Divide by zero and modulo zero. + # + # Division: Use the common convention that x / 0 is inf with the same sign + # as x, except when x = 0, where we return NaN. This is also what earlier + # versions did. + # + # Modulo: In modular arithmetic, the congruence relation z = x (mod y) + # means that there is some integer k such that z - x = k y. If y = 0, we + # get z - x = 0 or z = x. This is also what earlier versions did, except + # that 0 % 0 returned NaN. + # + # inf / 0 = inf inf % 0 = inf + # 5 / 0 = inf 5 % 0 = 5 + # 0 / 0 = NaN 0 % 0 = 0 + # -5 / 0 = -inf -5 % 0 = -5 + # -inf / 0 = -inf -inf % 0 = -inf + + if ($y -> is_zero()) { + my $rem; + if ($wantarray) { + $rem = $x -> copy(); + } + if ($x -> is_zero()) { + $x -> bnan(); + } else { + $x -> binf($x -> {sign}); + } + return $wantarray ? ($x, $rem) : $x; + } + + # Numerator (dividend) is +/-inf, and denominator is finite and non-zero. + # The divide by zero cases are covered above. In all of the cases listed + # below we return the same as core Perl. + # + # inf / -inf = NaN inf % -inf = NaN + # inf / -5 = -inf inf % -5 = NaN + # inf / 5 = inf inf % 5 = NaN + # inf / inf = NaN inf % inf = NaN + # + # -inf / -inf = NaN -inf % -inf = NaN + # -inf / -5 = inf -inf % -5 = NaN + # -inf / 5 = -inf -inf % 5 = NaN + # -inf / inf = NaN -inf % inf = NaN + + if ($x -> is_inf()) { + my $rem; + $rem = $class -> bnan() if $wantarray; + if ($y -> is_inf()) { + $x -> bnan(); + } else { + my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-'; + $x -> binf($sign); + } + return $wantarray ? ($x, $rem) : $x; + } + + # Denominator (divisor) is +/-inf. The cases when the numerator is +/-inf + # are covered above. In the modulo cases (in the right column) we return + # the same as core Perl, which does floored division, so for consistency we + # also do floored division in the division cases (in the left column). + # + # -5 / inf = 0 -5 % inf = -5 + # 0 / inf = 0 0 % inf = 0 + # 5 / inf = 0 5 % inf = 5 + # + # -5 / -inf = 0 -5 % -inf = -5 + # 0 / -inf = 0 0 % -inf = 0 + # 5 / -inf = 0 5 % -inf = 5 + + if ($y -> is_inf()) { + my $rem; + $rem = $x -> copy() if $wantarray; + $x -> bzero(); + return $wantarray ? ($x, $rem) : $x; + } + + return $upgrade -> btdiv($upgrade -> new($x), $upgrade -> new($y), @r) + if defined $upgrade; + + $r[3] = $y; # no push! + + # Inialize remainder. + + my $rem = $class -> bzero(); + + # Are both operands the same object, i.e., like $x -> bdiv($x)? If so, + # flipping the sign of $y also flips the sign of $x. + + my $xsign = $x -> {sign}; + my $ysign = $y -> {sign}; + + $y -> {sign} =~ tr/+-/-+/; # Flip the sign of $y, and see ... + my $same = $xsign ne $x -> {sign}; # ... if that changed the sign of $x. + $y -> {sign} = $ysign; # Re-insert the original sign. + + if ($same) { + $x -> bone(); + } else { + ($x -> {value}, $rem -> {value}) = + $CALC -> _div($x -> {value}, $y -> {value}); + + $x -> {sign} = $xsign eq $ysign ? '+' : '-'; + $x -> {sign} = '+' if $CALC -> _is_zero($x -> {value}); + $x -> round(@r); + } + + if (wantarray) { + $rem -> {sign} = $xsign; + $rem -> {sign} = '+' if $CALC -> _is_zero($rem -> {value}); + $rem -> {_a} = $x -> {_a}; + $rem -> {_p} = $x -> {_p}; + $rem -> round(@r); + return ($x, $rem); + } + + return $x; +} + +sub bmod { + # This is the remainder after floored division. + + # Set up parameters. + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x -> modify('bmod'); + $r[3] = $y; # no push! + + # At least one argument is NaN. + + if ($x -> is_nan() || $y -> is_nan()) { + return $x -> bnan(); + } + + # Modulo zero. See documentation for bdiv(). + + if ($y -> is_zero()) { + return $x; + } + + # Numerator (dividend) is +/-inf. + + if ($x -> is_inf()) { + return $x -> bnan(); + } + + # Denominator (divisor) is +/-inf. + + if ($y -> is_inf()) { + if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) { + return $x; + } else { + return $x -> binf($y -> sign()); + } + } + + # Calc new sign and in case $y == +/- 1, return $x. + + $x -> {value} = $CALC -> _mod($x -> {value}, $y -> {value}); + if ($CALC -> _is_zero($x -> {value})) { + $x -> {sign} = '+'; # do not leave -0 + } else { + $x -> {value} = $CALC -> _sub($y -> {value}, $x -> {value}, 1) # $y-$x + if ($x -> {sign} ne $y -> {sign}); + $x -> {sign} = $y -> {sign}; + } + + $x -> round(@r); +} + +sub btmod { + # Remainder after truncated division. + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x -> modify('btmod'); + + # At least one argument is NaN. + + if ($x -> is_nan() || $y -> is_nan()) { + return $x -> bnan(); + } + + # Modulo zero. See documentation for btdiv(). + + if ($y -> is_zero()) { + return $x; + } + + # Numerator (dividend) is +/-inf. + + if ($x -> is_inf()) { + return $x -> bnan(); + } + + # Denominator (divisor) is +/-inf. + + if ($y -> is_inf()) { + return $x; + } + + return $upgrade -> btmod($upgrade -> new($x), $upgrade -> new($y), @r) + if defined $upgrade; + + $r[3] = $y; # no push! + + my $xsign = $x -> {sign}; + my $ysign = $y -> {sign}; + + $x -> {value} = $CALC -> _mod($x -> {value}, $y -> {value}); + + $x -> {sign} = $xsign; + $x -> {sign} = '+' if $CALC -> _is_zero($x -> {value}); + $x -> round(@r); + return $x; +} + +sub bmodinv { + # Return modular multiplicative inverse: + # + # z is the modular inverse of x (mod y) if and only if + # + # x*z ≡ 1 (mod y) + # + # If the modulus y is larger than one, x and z are relative primes (i.e., + # their greatest common divisor is one). + # + # If no modular multiplicative inverse exists, NaN is returned. + + # set up parameters + my ($class, $x, $y, @r) = (undef, @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bmodinv'); + + # Return NaN if one or both arguments is +inf, -inf, or nan. + + return $x->bnan() if ($y->{sign} !~ /^[+-]$/ || + $x->{sign} !~ /^[+-]$/); + + # Return NaN if $y is zero; 1 % 0 makes no sense. + + return $x->bnan() if $y->is_zero(); + + # Return 0 in the trivial case. $x % 1 or $x % -1 is zero for all finite + # integers $x. + + return $x->bzero() if ($y->is_one() || + $y->is_one('-')); + + # Return NaN if $x = 0, or $x modulo $y is zero. The only valid case when + # $x = 0 is when $y = 1 or $y = -1, but that was covered above. + # + # Note that computing $x modulo $y here affects the value we'll feed to + # $CALC->_modinv() below when $x and $y have opposite signs. E.g., if $x = + # 5 and $y = 7, those two values are fed to _modinv(), but if $x = -5 and + # $y = 7, the values fed to _modinv() are $x = 2 (= -5 % 7) and $y = 7. + # The value if $x is affected only when $x and $y have opposite signs. + + $x->bmod($y); + return $x->bnan() if $x->is_zero(); + + # Compute the modular multiplicative inverse of the absolute values. We'll + # correct for the signs of $x and $y later. Return NaN if no GCD is found. + + ($x->{value}, $x->{sign}) = $CALC->_modinv($x->{value}, $y->{value}); + return $x->bnan() if !defined $x->{value}; + + # Library inconsistency workaround: _modinv() in Math::BigInt::GMP versions + # <= 1.32 return undef rather than a "+" for the sign. + + $x->{sign} = '+' unless defined $x->{sign}; + + # When one or both arguments are negative, we have the following + # relations. If x and y are positive: + # + # modinv(-x, -y) = -modinv(x, y) + # modinv(-x, y) = y - modinv(x, y) = -modinv(x, y) (mod y) + # modinv( x, -y) = modinv(x, y) - y = modinv(x, y) (mod -y) + + # We must swap the sign of the result if the original $x is negative. + # However, we must compensate for ignoring the signs when computing the + # inverse modulo. The net effect is that we must swap the sign of the + # result if $y is negative. + + $x -> bneg() if $y->{sign} eq '-'; + + # Compute $x modulo $y again after correcting the sign. + + $x -> bmod($y) if $x->{sign} ne $y->{sign}; + + return $x; +} + +sub bmodpow { + # Modular exponentiation. Raises a very large number to a very large exponent + # in a given very large modulus quickly, thanks to binary exponentiation. + # Supports negative exponents. + my ($class, $num, $exp, $mod, @r) = objectify(3, @_); + + return $num if $num->modify('bmodpow'); + + # When the exponent 'e' is negative, use the following relation, which is + # based on finding the multiplicative inverse 'd' of 'b' modulo 'm': + # + # b^(-e) (mod m) = d^e (mod m) where b*d = 1 (mod m) + + $num->bmodinv($mod) if ($exp->{sign} eq '-'); + + # Check for valid input. All operands must be finite, and the modulus must be + # non-zero. + + return $num->bnan() if ($num->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf + $exp->{sign} =~ /NaN|inf/ || # NaN, -inf, +inf + $mod->{sign} =~ /NaN|inf/); # NaN, -inf, +inf + + # Modulo zero. See documentation for Math::BigInt's bmod() method. + + if ($mod -> is_zero()) { + if ($num -> is_zero()) { + return $class -> bnan(); + } else { + return $num -> copy(); + } + } + + # Compute 'a (mod m)', ignoring the signs on 'a' and 'm'. If the resulting + # value is zero, the output is also zero, regardless of the signs on 'a' and + # 'm'. + + my $value = $CALC->_modpow($num->{value}, $exp->{value}, $mod->{value}); + my $sign = '+'; + + # If the resulting value is non-zero, we have four special cases, depending + # on the signs on 'a' and 'm'. + + unless ($CALC->_is_zero($value)) { + + # There is a negative sign on 'a' (= $num**$exp) only if the number we + # are exponentiating ($num) is negative and the exponent ($exp) is odd. + + if ($num->{sign} eq '-' && $exp->is_odd()) { + + # When both the number 'a' and the modulus 'm' have a negative sign, + # use this relation: + # + # -a (mod -m) = -(a (mod m)) + + if ($mod->{sign} eq '-') { + $sign = '-'; + } + + # When only the number 'a' has a negative sign, use this relation: + # + # -a (mod m) = m - (a (mod m)) + + else { + # Use copy of $mod since _sub() modifies the first argument. + my $mod = $CALC->_copy($mod->{value}); + $value = $CALC->_sub($mod, $value); + $sign = '+'; + } + + } else { + + # When only the modulus 'm' has a negative sign, use this relation: + # + # a (mod -m) = (a (mod m)) - m + # = -(m - (a (mod m))) + + if ($mod->{sign} eq '-') { + # Use copy of $mod since _sub() modifies the first argument. + my $mod = $CALC->_copy($mod->{value}); + $value = $CALC->_sub($mod, $value); + $sign = '-'; + } + + # When neither the number 'a' nor the modulus 'm' have a negative + # sign, directly return the already computed value. + # + # (a (mod m)) + + } + + } + + $num->{value} = $value; + $num->{sign} = $sign; + + return $num; +} + +sub bpow { + # (BINT or num_str, BINT or num_str) return BINT + # compute power of two numbers -- stolen from Knuth Vol 2 pg 233 + # modifies first argument + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bpow'); + + return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan; + + # inf handling + if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) { + if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/)) { + # +-inf ** +-inf + return $x->bnan(); + } + # +-inf ** Y + if ($x->{sign} =~ /^[+-]inf/) { + # +inf ** 0 => NaN + return $x->bnan() if $y->is_zero(); + # -inf ** -1 => 1/inf => 0 + return $x->bzero() if $y->is_one('-') && $x->is_negative(); + + # +inf ** Y => inf + return $x if $x->{sign} eq '+inf'; + + # -inf ** Y => -inf if Y is odd + return $x if $y->is_odd(); + return $x->babs(); + } + # X ** +-inf + + # 1 ** +inf => 1 + return $x if $x->is_one(); + + # 0 ** inf => 0 + return $x if $x->is_zero() && $y->{sign} =~ /^[+]/; + + # 0 ** -inf => inf + return $x->binf() if $x->is_zero(); + + # -1 ** -inf => NaN + return $x->bnan() if $x->is_one('-') && $y->{sign} =~ /^[-]/; + + # -X ** -inf => 0 + return $x->bzero() if $x->{sign} eq '-' && $y->{sign} =~ /^[-]/; + + # -1 ** inf => NaN + return $x->bnan() if $x->{sign} eq '-'; + + # X ** inf => inf + return $x->binf() if $y->{sign} =~ /^[+]/; + # X ** -inf => 0 + return $x->bzero(); + } + + return $upgrade->bpow($upgrade->new($x), $y, @r) + if defined $upgrade && (!$y->isa($class) || $y->{sign} eq '-'); + + $r[3] = $y; # no push! + + # cases 0 ** Y, X ** 0, X ** 1, 1 ** Y are handled by Calc or Emu + + my $new_sign = '+'; + $new_sign = $y->is_odd() ? '-' : '+' if ($x->{sign} ne '+'); + + # 0 ** -7 => ( 1 / (0 ** 7)) => 1 / 0 => +inf + return $x->binf() + if $y->{sign} eq '-' && $x->{sign} eq '+' && $CALC->_is_zero($x->{value}); + # 1 ** -y => 1 / (1 ** |y|) + # so do test for negative $y after above's clause + return $x->bnan() if $y->{sign} eq '-' && !$CALC->_is_one($x->{value}); + + $x->{value} = $CALC->_pow($x->{value}, $y->{value}); + $x->{sign} = $new_sign; + $x->{sign} = '+' if $CALC->_is_zero($y->{value}); + $x->round(@r); +} + +sub blog { + # Return the logarithm of the operand. If a second operand is defined, that + # value is used as the base, otherwise the base is assumed to be Euler's + # constant. + + my ($class, $x, $base, @r); + + # Don't objectify the base, since an undefined base, as in $x->blog() or + # $x->blog(undef) signals that the base is Euler's number. + + if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) { + # E.g., Math::BigInt->blog(256, 2) + ($class, $x, $base, @r) = + defined $_[2] ? objectify(2, @_) : objectify(1, @_); + } else { + # E.g., Math::BigInt::blog(256, 2) or $x->blog(2) + ($class, $x, $base, @r) = + defined $_[1] ? objectify(2, @_) : objectify(1, @_); + } + + return $x if $x->modify('blog'); + + # Handle all exception cases and all trivial cases. I have used Wolfram + # Alpha (http://www.wolframalpha.com) as the reference for these cases. + + return $x -> bnan() if $x -> is_nan(); + + if (defined $base) { + $base = $class -> new($base) unless ref $base; + if ($base -> is_nan() || $base -> is_one()) { + return $x -> bnan(); + } elsif ($base -> is_inf() || $base -> is_zero()) { + return $x -> bnan() if $x -> is_inf() || $x -> is_zero(); + return $x -> bzero(); + } elsif ($base -> is_negative()) { # -inf < base < 0 + return $x -> bzero() if $x -> is_one(); # x = 1 + return $x -> bone() if $x == $base; # x = base + return $x -> bnan(); # otherwise + } + return $x -> bone() if $x == $base; # 0 < base && 0 < x < inf + } + + # We now know that the base is either undefined or >= 2 and finite. + + return $x -> binf('+') if $x -> is_inf(); # x = +/-inf + return $x -> bnan() if $x -> is_neg(); # -inf < x < 0 + return $x -> bzero() if $x -> is_one(); # x = 1 + return $x -> binf('-') if $x -> is_zero(); # x = 0 + + # At this point we are done handling all exception cases and trivial cases. + + return $upgrade -> blog($upgrade -> new($x), $base, @r) if defined $upgrade; + + # fix for bug #24969: + # the default base is e (Euler's number) which is not an integer + if (!defined $base) { + require Math::BigFloat; + my $u = Math::BigFloat->blog(Math::BigFloat->new($x))->as_int(); + # modify $x in place + $x->{value} = $u->{value}; + $x->{sign} = $u->{sign}; + return $x; + } + + my ($rc, $exact) = $CALC->_log_int($x->{value}, $base->{value}); + return $x->bnan() unless defined $rc; # not possible to take log? + $x->{value} = $rc; + $x->round(@r); +} + +sub bexp { + # Calculate e ** $x (Euler's number to the power of X), truncated to + # an integer value. + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + return $x if $x->modify('bexp'); + + # inf, -inf, NaN, <0 => NaN + return $x->bnan() if $x->{sign} eq 'NaN'; + return $x->bone() if $x->is_zero(); + return $x if $x->{sign} eq '+inf'; + return $x->bzero() if $x->{sign} eq '-inf'; + + my $u; + { + # run through Math::BigFloat unless told otherwise + require Math::BigFloat unless defined $upgrade; + local $upgrade = 'Math::BigFloat' unless defined $upgrade; + # calculate result, truncate it to integer + $u = $upgrade->bexp($upgrade->new($x), @r); + } + + if (defined $upgrade) { + $x = $u; + } else { + $u = $u->as_int(); + # modify $x in place + $x->{value} = $u->{value}; + $x->round(@r); + } +} + +sub bnok { + # Calculate n over k (binomial coefficient or "choose" function) as integer. + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bnok'); + return $x->bnan() if $x->{sign} eq 'NaN' || $y->{sign} eq 'NaN'; + return $x->binf() if $x->{sign} eq '+inf'; + + # k > n or k < 0 => 0 + my $cmp = $x->bacmp($y); + return $x->bzero() if $cmp < 0 || substr($y->{sign}, 0, 1) eq "-"; + + if ($CALC->can('_nok')) { + $x->{value} = $CALC->_nok($x->{value}, $y->{value}); + } else { + # ( 7 ) 7! 1*2*3*4 * 5*6*7 5 * 6 * 7 6 7 + # ( - ) = --------- = --------------- = --------- = 5 * - * - + # ( 3 ) (7-3)! 3! 1*2*3*4 * 1*2*3 1 * 2 * 3 2 3 + + my $n = $x -> {value}; + my $k = $y -> {value}; + + # If k > n/2, or, equivalently, 2*k > n, compute nok(n, k) as + # nok(n, n-k) to minimize the number if iterations in the loop. + + { + my $twok = $CALC->_mul($CALC->_two(), $CALC->_copy($k)); + if ($CALC->_acmp($twok, $n) > 0) { + $k = $CALC->_sub($CALC->_copy($n), $k); + } + } + + if ($CALC->_is_zero($k)) { + $n = $CALC->_one(); + } else { + + # Make a copy of the original n, since we'll be modifying n + # in-place. + + my $n_orig = $CALC->_copy($n); + + $CALC->_sub($n, $k); + $CALC->_inc($n); + + my $f = $CALC->_copy($n); + $CALC->_inc($f); + + my $d = $CALC->_two(); + + # while f <= n (the original n, that is) ... + + while ($CALC->_acmp($f, $n_orig) <= 0) { + $CALC->_mul($n, $f); + $CALC->_div($n, $d); + $CALC->_inc($f); + $CALC->_inc($d); + } + } + + $x -> {value} = $n; + } + + $x->round(@r); +} + +sub bsin { + # Calculate sinus(x) to N digits. Unless upgrading is in effect, returns the + # result truncated to an integer. + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('bsin'); + + return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN + + return $upgrade->new($x)->bsin(@r) if defined $upgrade; + + require Math::BigFloat; + # calculate the result and truncate it to integer + my $t = Math::BigFloat->new($x)->bsin(@r)->as_int(); + + $x->bone() if $t->is_one(); + $x->bzero() if $t->is_zero(); + $x->round(@r); +} + +sub bcos { + # Calculate cosinus(x) to N digits. Unless upgrading is in effect, returns the + # result truncated to an integer. + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('bcos'); + + return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN + + return $upgrade->new($x)->bcos(@r) if defined $upgrade; + + require Math::BigFloat; + # calculate the result and truncate it to integer + my $t = Math::BigFloat->new($x)->bcos(@r)->as_int(); + + $x->bone() if $t->is_one(); + $x->bzero() if $t->is_zero(); + $x->round(@r); +} + +sub batan { + # Calculate arcus tangens of x to N digits. Unless upgrading is in effect, returns the + # result truncated to an integer. + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('batan'); + + return $x->bnan() if $x->{sign} !~ /^[+-]\z/; # -inf +inf or NaN => NaN + + return $upgrade->new($x)->batan(@r) if defined $upgrade; + + # calculate the result and truncate it to integer + my $t = Math::BigFloat->new($x)->batan(@r); + + $x->{value} = $CALC->_new($x->as_int()->bstr()); + $x->round(@r); +} + +sub batan2 { + # calculate arcus tangens of ($y/$x) + + # set up parameters + my ($class, $y, $x, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $y, $x, @r) = objectify(2, @_); + } + + return $y if $y->modify('batan2'); + + return $y->bnan() if ($y->{sign} eq $nan) || ($x->{sign} eq $nan); + + # Y X + # != 0 -inf result is +- pi + if ($x->is_inf() || $y->is_inf()) { + # upgrade to Math::BigFloat etc. + return $upgrade->new($y)->batan2($upgrade->new($x), @r) if defined $upgrade; + if ($y->is_inf()) { + if ($x->{sign} eq '-inf') { + # calculate 3 pi/4 => 2.3.. => 2 + $y->bone(substr($y->{sign}, 0, 1)); + $y->bmul($class->new(2)); + } elsif ($x->{sign} eq '+inf') { + # calculate pi/4 => 0.7 => 0 + $y->bzero(); + } else { + # calculate pi/2 => 1.5 => 1 + $y->bone(substr($y->{sign}, 0, 1)); + } + } else { + if ($x->{sign} eq '+inf') { + # calculate pi/4 => 0.7 => 0 + $y->bzero(); + } else { + # PI => 3.1415.. => 3 + $y->bone(substr($y->{sign}, 0, 1)); + $y->bmul($class->new(3)); + } + } + return $y; + } + + return $upgrade->new($y)->batan2($upgrade->new($x), @r) if defined $upgrade; + + require Math::BigFloat; + my $r = Math::BigFloat->new($y) + ->batan2(Math::BigFloat->new($x), @r) + ->as_int(); + + $x->{value} = $r->{value}; + $x->{sign} = $r->{sign}; + + $x; +} + +sub bsqrt { + # calculate square root of $x + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('bsqrt'); + + return $x->bnan() if $x->{sign} !~ /^\+/; # -x or -inf or NaN => NaN + return $x if $x->{sign} eq '+inf'; # sqrt(+inf) == inf + + return $upgrade->bsqrt($x, @r) if defined $upgrade; + + $x->{value} = $CALC->_sqrt($x->{value}); + $x->round(@r); +} + +sub broot { + # calculate $y'th root of $x + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + $y = $class->new(2) unless defined $y; + + # objectify is costly, so avoid it + if ((!ref($x)) || (ref($x) ne ref($y))) { + ($class, $x, $y, @r) = objectify(2, $class || $class, @_); + } + + return $x if $x->modify('broot'); + + # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0 + return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() || + $y->{sign} !~ /^\+$/; + + return $x->round(@r) + if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one(); + + return $upgrade->new($x)->broot($upgrade->new($y), @r) if defined $upgrade; + + $x->{value} = $CALC->_root($x->{value}, $y->{value}); + $x->round(@r); +} + +sub bfac { + # (BINT or num_str, BINT or num_str) return BINT + # compute factorial number from $x, modify $x in place + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('bfac') || $x->{sign} eq '+inf'; # inf => inf + return $x->bnan() if $x->{sign} ne '+'; # NaN, <0 etc => NaN + + $x->{value} = $CALC->_fac($x->{value}); + $x->round(@r); +} + +sub bdfac { + # compute double factorial, modify $x in place + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('bdfac') || $x->{sign} eq '+inf'; # inf => inf + return $x->bnan() if $x->{sign} ne '+'; # NaN, <0 etc => NaN + + Carp::croak("bdfac() requires a newer version of the $CALC library.") + unless $CALC->can('_dfac'); + + $x->{value} = $CALC->_dfac($x->{value}); + $x->round(@r); +} + +sub bfib { + # compute Fibonacci number(s) + my ($class, $x, @r) = objectify(1, @_); + + Carp::croak("bfib() requires a newer version of the $CALC library.") + unless $CALC->can('_fib'); + + return $x if $x->modify('bfib'); + + # List context. + + if (wantarray) { + return () if $x -> is_nan(); + Carp::croak("bfib() can't return an infinitely long list of numbers") + if $x -> is_inf(); + + # Use the backend library to compute the first $x Fibonacci numbers. + + my @values = $CALC->_fib($x->{value}); + + # Make objects out of them. The last element in the array is the + # invocand. + + for (my $i = 0 ; $i < $#values ; ++ $i) { + my $fib = $class -> bzero(); + $fib -> {value} = $values[$i]; + $values[$i] = $fib; + } + + $x -> {value} = $values[-1]; + $values[-1] = $x; + + # If negative, insert sign as appropriate. + + if ($x -> is_neg()) { + for (my $i = 2 ; $i <= $#values ; $i += 2) { + $values[$i]{sign} = '-'; + } + } + + @values = map { $_ -> round(@r) } @values; + return @values; + } + + # Scalar context. + + else { + return $x if $x->modify('bdfac') || $x -> is_inf('+'); + return $x->bnan() if $x -> is_nan() || $x -> is_inf('-'); + + $x->{sign} = $x -> is_neg() && $x -> is_even() ? '-' : '+'; + $x->{value} = $CALC->_fib($x->{value}); + return $x->round(@r); + } +} + +sub blucas { + # compute Lucas number(s) + my ($class, $x, @r) = objectify(1, @_); + + Carp::croak("blucas() requires a newer version of the $CALC library.") + unless $CALC->can('_lucas'); + + return $x if $x->modify('blucas'); + + # List context. + + if (wantarray) { + return () if $x -> is_nan(); + Carp::croak("blucas() can't return an infinitely long list of numbers") + if $x -> is_inf(); + + # Use the backend library to compute the first $x Lucas numbers. + + my @values = $CALC->_lucas($x->{value}); + + # Make objects out of them. The last element in the array is the + # invocand. + + for (my $i = 0 ; $i < $#values ; ++ $i) { + my $lucas = $class -> bzero(); + $lucas -> {value} = $values[$i]; + $values[$i] = $lucas; + } + + $x -> {value} = $values[-1]; + $values[-1] = $x; + + # If negative, insert sign as appropriate. + + if ($x -> is_neg()) { + for (my $i = 2 ; $i <= $#values ; $i += 2) { + $values[$i]{sign} = '-'; + } + } + + @values = map { $_ -> round(@r) } @values; + return @values; + } + + # Scalar context. + + else { + return $x if $x -> is_inf('+'); + return $x->bnan() if $x -> is_nan() || $x -> is_inf('-'); + + $x->{sign} = $x -> is_neg() && $x -> is_even() ? '-' : '+'; + $x->{value} = $CALC->_lucas($x->{value}); + return $x->round(@r); + } +} + +sub blsft { + # (BINT or num_str, BINT or num_str) return BINT + # compute x << y, base n, y >= 0 + + # set up parameters + my ($class, $x, $y, $b, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $b, @r) = objectify(2, @_); + } + + return $x if $x -> modify('blsft'); + return $x -> bnan() if ($x -> {sign} !~ /^[+-]$/ || + $y -> {sign} !~ /^[+-]$/); + return $x -> round(@r) if $y -> is_zero(); + + $b = 2 if !defined $b; + return $x -> bnan() if $b <= 0 || $y -> {sign} eq '-'; + + $x -> {value} = $CALC -> _lsft($x -> {value}, $y -> {value}, $b); + $x -> round(@r); +} + +sub brsft { + # (BINT or num_str, BINT or num_str) return BINT + # compute x >> y, base n, y >= 0 + + # set up parameters + my ($class, $x, $y, $b, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $b, @r) = objectify(2, @_); + } + + return $x if $x -> modify('brsft'); + return $x -> bnan() if ($x -> {sign} !~ /^[+-]$/ || $y -> {sign} !~ /^[+-]$/); + return $x -> round(@r) if $y -> is_zero(); + return $x -> bzero(@r) if $x -> is_zero(); # 0 => 0 + + $b = 2 if !defined $b; + return $x -> bnan() if $b <= 0 || $y -> {sign} eq '-'; + + # this only works for negative numbers when shifting in base 2 + if (($x -> {sign} eq '-') && ($b == 2)) { + return $x -> round(@r) if $x -> is_one('-'); # -1 => -1 + if (!$y -> is_one()) { + # although this is O(N*N) in calc (as_bin!) it is O(N) in Pari et + # al but perhaps there is a better emulation for two's complement + # shift... + # if $y != 1, we must simulate it by doing: + # convert to bin, flip all bits, shift, and be done + $x -> binc(); # -3 => -2 + my $bin = $x -> as_bin(); + $bin =~ s/^-0b//; # strip '-0b' prefix + $bin =~ tr/10/01/; # flip bits + # now shift + if ($y >= CORE::length($bin)) { + $bin = '0'; # shifting to far right creates -1 + # 0, because later increment makes + # that 1, attached '-' makes it '-1' + # because -1 >> x == -1 ! + } else { + $bin =~ s/.{$y}$//; # cut off at the right side + $bin = '1' . $bin; # extend left side by one dummy '1' + $bin =~ tr/10/01/; # flip bits back + } + my $res = $class -> new('0b' . $bin); # add prefix and convert back + $res -> binc(); # remember to increment + $x -> {value} = $res -> {value}; # take over value + return $x -> round(@r); # we are done now, magic, isn't? + } + + # x < 0, n == 2, y == 1 + $x -> bdec(); # n == 2, but $y == 1: this fixes it + } + + $x -> {value} = $CALC -> _rsft($x -> {value}, $y -> {value}, $b); + $x -> round(@r); +} + +############################################################################### +# Bitwise methods +############################################################################### + +sub band { + #(BINT or num_str, BINT or num_str) return BINT + # compute x & y + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('band'); + + $r[3] = $y; # no push! + + return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/); + + my $sx = $x->{sign} eq '+' ? 1 : -1; + my $sy = $y->{sign} eq '+' ? 1 : -1; + + if ($sx == 1 && $sy == 1) { + $x->{value} = $CALC->_and($x->{value}, $y->{value}); + return $x->round(@r); + } + + if ($CAN{signed_and}) { + $x->{value} = $CALC->_signed_and($x->{value}, $y->{value}, $sx, $sy); + return $x->round(@r); + } + + require $EMU_LIB; + __emu_band($class, $x, $y, $sx, $sy, @r); +} + +sub bior { + #(BINT or num_str, BINT or num_str) return BINT + # compute x | y + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bior'); + $r[3] = $y; # no push! + + return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/); + + my $sx = $x->{sign} eq '+' ? 1 : -1; + my $sy = $y->{sign} eq '+' ? 1 : -1; + + # the sign of X follows the sign of X, e.g. sign of Y irrelevant for bior() + + # don't use lib for negative values + if ($sx == 1 && $sy == 1) { + $x->{value} = $CALC->_or($x->{value}, $y->{value}); + return $x->round(@r); + } + + # if lib can do negative values, let it handle this + if ($CAN{signed_or}) { + $x->{value} = $CALC->_signed_or($x->{value}, $y->{value}, $sx, $sy); + return $x->round(@r); + } + + require $EMU_LIB; + __emu_bior($class, $x, $y, $sx, $sy, @r); +} + +sub bxor { + #(BINT or num_str, BINT or num_str) return BINT + # compute x ^ y + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bxor'); + $r[3] = $y; # no push! + + return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/); + + my $sx = $x->{sign} eq '+' ? 1 : -1; + my $sy = $y->{sign} eq '+' ? 1 : -1; + + # don't use lib for negative values + if ($sx == 1 && $sy == 1) { + $x->{value} = $CALC->_xor($x->{value}, $y->{value}); + return $x->round(@r); + } + + # if lib can do negative values, let it handle this + if ($CAN{signed_xor}) { + $x->{value} = $CALC->_signed_xor($x->{value}, $y->{value}, $sx, $sy); + return $x->round(@r); + } + + require $EMU_LIB; + __emu_bxor($class, $x, $y, $sx, $sy, @r); +} + +sub bnot { + # (num_str or BINT) return BINT + # represent ~x as twos-complement number + # we don't need $class, so undef instead of ref($_[0]) make it slightly faster + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + return $x if $x->modify('bnot'); + $x->binc()->bneg(); # binc already does round +} + +############################################################################### +# Rounding methods +############################################################################### + +sub round { + # Round $self according to given parameters, or given second argument's + # parameters or global defaults + + # for speed reasons, _find_round_parameters is embedded here: + + my ($self, $a, $p, $r, @args) = @_; + # $a accuracy, if given by caller + # $p precision, if given by caller + # $r round_mode, if given by caller + # @args all 'other' arguments (0 for unary, 1 for binary ops) + + my $class = ref($self); # find out class of argument(s) + no strict 'refs'; + + # now pick $a or $p, but only if we have got "arguments" + if (!defined $a) { + foreach ($self, @args) { + # take the defined one, or if both defined, the one that is smaller + $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a); + } + } + if (!defined $p) { + # even if $a is defined, take $p, to signal error for both defined + foreach ($self, @args) { + # take the defined one, or if both defined, the one that is bigger + # -2 > -3, and 3 > 2 + $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p); + } + } + + # if still none defined, use globals (#2) + $a = ${"$class\::accuracy"} unless defined $a; + $p = ${"$class\::precision"} unless defined $p; + + # A == 0 is useless, so undef it to signal no rounding + $a = undef if defined $a && $a == 0; + + # no rounding today? + return $self unless defined $a || defined $p; # early out + + # set A and set P is an fatal error + return $self->bnan() if defined $a && defined $p; + + $r = ${"$class\::round_mode"} unless defined $r; + if ($r !~ /^(even|odd|[+-]inf|zero|trunc|common)$/) { + Carp::croak("Unknown round mode '$r'"); + } + + # now round, by calling either bround or bfround: + if (defined $a) { + $self->bround(int($a), $r) if !defined $self->{_a} || $self->{_a} >= $a; + } else { # both can't be undefined due to early out + $self->bfround(int($p), $r) if !defined $self->{_p} || $self->{_p} <= $p; + } + + # bround() or bfround() already called bnorm() if nec. + $self; +} + +sub bround { + # accuracy: +$n preserve $n digits from left, + # -$n preserve $n digits from right (f.i. for 0.1234 style in MBF) + # no-op for $n == 0 + # and overwrite the rest with 0's, return normalized number + # do not return $x->bnorm(), but $x + + my $x = shift; + $x = $class->new($x) unless ref $x; + my ($scale, $mode) = $x->_scale_a(@_); + return $x if !defined $scale || $x->modify('bround'); # no-op + + if ($x->is_zero() || $scale == 0) { + $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2 + return $x; + } + return $x if $x->{sign} !~ /^[+-]$/; # inf, NaN + + # we have fewer digits than we want to scale to + my $len = $x->length(); + # convert $scale to a scalar in case it is an object (put's a limit on the + # number length, but this would already limited by memory constraints), makes + # it faster + $scale = $scale->numify() if ref ($scale); + + # scale < 0, but > -len (not >=!) + if (($scale < 0 && $scale < -$len-1) || ($scale >= $len)) { + $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; # 3 > 2 + return $x; + } + + # count of 0's to pad, from left (+) or right (-): 9 - +6 => 3, or |-6| => 6 + my ($pad, $digit_round, $digit_after); + $pad = $len - $scale; + $pad = abs($scale-1) if $scale < 0; + + # do not use digit(), it is very costly for binary => decimal + # getting the entire string is also costly, but we need to do it only once + my $xs = $CALC->_str($x->{value}); + my $pl = -$pad-1; + + # pad: 123: 0 => -1, at 1 => -2, at 2 => -3, at 3 => -4 + # pad+1: 123: 0 => 0, at 1 => -1, at 2 => -2, at 3 => -3 + $digit_round = '0'; + $digit_round = substr($xs, $pl, 1) if $pad <= $len; + $pl++; + $pl ++ if $pad >= $len; + $digit_after = '0'; + $digit_after = substr($xs, $pl, 1) if $pad > 0; + + # in case of 01234 we round down, for 6789 up, and only in case 5 we look + # closer at the remaining digits of the original $x, remember decision + my $round_up = 1; # default round up + $round_up -- if + ($mode eq 'trunc') || # trunc by round down + ($digit_after =~ /[01234]/) || # round down anyway, + # 6789 => round up + ($digit_after eq '5') && # not 5000...0000 + ($x->_scan_for_nonzero($pad, $xs, $len) == 0) && + ( + ($mode eq 'even') && ($digit_round =~ /[24680]/) || + ($mode eq 'odd') && ($digit_round =~ /[13579]/) || + ($mode eq '+inf') && ($x->{sign} eq '-') || + ($mode eq '-inf') && ($x->{sign} eq '+') || + ($mode eq 'zero') # round down if zero, sign adjusted below + ); + my $put_back = 0; # not yet modified + + if (($pad > 0) && ($pad <= $len)) { + substr($xs, -$pad, $pad) = '0' x $pad; # replace with '00...' + $put_back = 1; # need to put back + } elsif ($pad > $len) { + $x->bzero(); # round to '0' + } + + if ($round_up) { # what gave test above? + $put_back = 1; # need to put back + $pad = $len, $xs = '0' x $pad if $scale < 0; # tlr: whack 0.51=>1.0 + + # we modify directly the string variant instead of creating a number and + # adding it, since that is faster (we already have the string) + my $c = 0; + $pad ++; # for $pad == $len case + while ($pad <= $len) { + $c = substr($xs, -$pad, 1) + 1; + $c = '0' if $c eq '10'; + substr($xs, -$pad, 1) = $c; + $pad++; + last if $c != 0; # no overflow => early out + } + $xs = '1'.$xs if $c == 0; + + } + $x->{value} = $CALC->_new($xs) if $put_back == 1; # put back, if needed + + $x->{_a} = $scale if $scale >= 0; + if ($scale < 0) { + $x->{_a} = $len+$scale; + $x->{_a} = 0 if $scale < -$len; + } + $x; +} + +sub bfround { + # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.' + # $n == 0 || $n == 1 => round to integer + my $x = shift; + my $class = ref($x) || $x; + $x = $class->new($x) unless ref $x; + + my ($scale, $mode) = $x->_scale_p(@_); + + return $x if !defined $scale || $x->modify('bfround'); # no-op + + # no-op for Math::BigInt objects if $n <= 0 + $x->bround($x->length()-$scale, $mode) if $scale > 0; + + delete $x->{_a}; # delete to save memory + $x->{_p} = $scale; # store new _p + $x; +} + +sub fround { + # Exists to make life easier for switch between MBF and MBI (should we + # autoload fxxx() like MBF does for bxxx()?) + my $x = shift; + $x = $class->new($x) unless ref $x; + $x->bround(@_); +} + +sub bfloor { + # round towards minus infinity; no-op since it's already integer + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + $x->round(@r); +} + +sub bceil { + # round towards plus infinity; no-op since it's already int + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + $x->round(@r); +} + +sub bint { + # round towards zero; no-op since it's already integer + my ($class, $x, @r) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + $x->round(@r); +} + +############################################################################### +# Other mathematical methods +############################################################################### + +sub bgcd { + # (BINT or num_str, BINT or num_str) return BINT + # does not modify arguments, but returns new object + # GCD -- Euclid's algorithm, variant C (Knuth Vol 3, pg 341 ff) + + my ($class, @args) = objectify(0, @_); + + my $x = shift @args; + $x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x); + + return $class->bnan() if $x->{sign} !~ /^[+-]$/; # x NaN? + + while (@args) { + my $y = shift @args; + $y = $class->new($y) unless ref($y) && $y -> isa($class); + return $class->bnan() if $y->{sign} !~ /^[+-]$/; # y NaN? + $x->{value} = $CALC->_gcd($x->{value}, $y->{value}); + last if $CALC->_is_one($x->{value}); + } + + return $x -> babs(); +} + +sub blcm { + # (BINT or num_str, BINT or num_str) return BINT + # does not modify arguments, but returns new object + # Least Common Multiple + + my ($class, @args) = objectify(0, @_); + + my $x = shift @args; + $x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x); + return $class->bnan() if $x->{sign} !~ /^[+-]$/; # x NaN? + + while (@args) { + my $y = shift @args; + $y = $class -> new($y) unless ref($y) && $y -> isa($class); + return $x->bnan() if $y->{sign} !~ /^[+-]$/; # y not integer + $x -> {value} = $CALC->_lcm($x -> {value}, $y -> {value}); + } + + return $x -> babs(); +} + +############################################################################### +# Object property methods +############################################################################### + +sub sign { + # return the sign of the number: +/-/-inf/+inf/NaN + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + $x->{sign}; +} + +sub digit { + # return the nth decimal digit, negative values count backward, 0 is right + my ($class, $x, $n) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + $n = $n->numify() if ref($n); + $CALC->_digit($x->{value}, $n || 0); +} + +sub length { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + my $e = $CALC->_len($x->{value}); + wantarray ? ($e, 0) : $e; +} + +sub exponent { + # return a copy of the exponent (here always 0, NaN or 1 for $m == 0) + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { + my $s = $x->{sign}; + $s =~ s/^[+-]//; # NaN, -inf, +inf => NaN or inf + return $class->new($s); + } + return $class->bzero() if $x->is_zero(); + + # 12300 => 2 trailing zeros => exponent is 2 + $class->new($CALC->_zeros($x->{value})); +} + +sub mantissa { + # return the mantissa (compatible to Math::BigFloat, e.g. reduced) + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { + # for NaN, +inf, -inf: keep the sign + return $class->new($x->{sign}); + } + my $m = $x->copy(); + delete $m->{_p}; + delete $m->{_a}; + + # that's a bit inefficient: + my $zeros = $CALC->_zeros($m->{value}); + $m->brsft($zeros, 10) if $zeros != 0; + $m; +} + +sub parts { + # return a copy of both the exponent and the mantissa + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + ($x->mantissa(), $x->exponent()); +} + +sub sparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("sparts() is an instance method, not a class method") + unless $class; + + # Not-a-number. + + if ($self -> is_nan()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> bnan(); # exponent + return ($mant, $expo); # list context + } + + # Infinity. + + if ($self -> is_inf()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> binf('+'); # exponent + return ($mant, $expo); # list context + } + + # Finite number. + + my $mant = $self -> copy(); + my $nzeros = $CALC -> _zeros($mant -> {value}); + + $mant -> brsft($nzeros, 10) if $nzeros != 0; + return $mant unless wantarray; + + my $expo = $class -> new($nzeros); + return ($mant, $expo); +} + +sub nparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("nparts() is an instance method, not a class method") + unless $class; + + # Not-a-number. + + if ($self -> is_nan()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> bnan(); # exponent + return ($mant, $expo); # list context + } + + # Infinity. + + if ($self -> is_inf()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> binf('+'); # exponent + return ($mant, $expo); # list context + } + + # Finite number. + + my ($mant, $expo) = $self -> sparts(); + + if ($mant -> bcmp(0)) { + my ($ndigtot, $ndigfrac) = $mant -> length(); + my $expo10adj = $ndigtot - $ndigfrac - 1; + + if ($expo10adj != 0) { + return $upgrade -> new($self) -> nparts() if $upgrade; + $mant -> bnan(); + return $mant unless wantarray; + $expo -> badd($expo10adj); + return ($mant, $expo); + } + } + + return $mant unless wantarray; + return ($mant, $expo); +} + +sub eparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("eparts() is an instance method, not a class method") + unless $class; + + # Not-a-number and Infinity. + + return $self -> sparts() if $self -> is_nan() || $self -> is_inf(); + + # Finite number. + + my ($mant, $expo) = $self -> sparts(); + + if ($mant -> bcmp(0)) { + my $ndigmant = $mant -> length(); + $expo -> badd($ndigmant); + + # $c is the number of digits that will be in the integer part of the + # final mantissa. + + my $c = $expo -> copy() -> bdec() -> bmod(3) -> binc(); + $expo -> bsub($c); + + if ($ndigmant > $c) { + return $upgrade -> new($self) -> eparts() if $upgrade; + $mant -> bnan(); + return $mant unless wantarray; + return ($mant, $expo); + } + + $mant -> blsft($c - $ndigmant, 10); + } + + return $mant unless wantarray; + return ($mant, $expo); +} + +sub dparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("dparts() is an instance method, not a class method") + unless $class; + + my $int = $self -> copy(); + return $int unless wantarray; + + my $frc = $class -> bzero(); + return ($int, $frc); +} + +############################################################################### +# String conversion methods +############################################################################### + +sub bstr { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + my $str = $CALC->_str($x->{value}); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +# Scientific notation with significand/mantissa as an integer, e.g., "12345" is +# written as "1.2345e+4". + +sub bsstr { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + my ($m, $e) = $x -> parts(); + my $str = $CALC->_str($m->{value}) . 'e+' . $CALC->_str($e->{value}); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +# Normalized notation, e.g., "12345" is written as "12345e+0". + +sub bnstr { + my $x = shift; + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + return $x -> bstr() if $x -> is_nan() || $x -> is_inf(); + + my ($mant, $expo) = $x -> parts(); + + # The "fraction posision" is the position (offset) for the decimal point + # relative to the end of the digit string. + + my $fracpos = $mant -> length() - 1; + if ($fracpos == 0) { + my $str = $CALC->_str($mant->{value}) . "e+" . $CALC->_str($expo->{value}); + return $x->{sign} eq '-' ? "-$str" : $str; + } + + $expo += $fracpos; + my $mantstr = $CALC->_str($mant -> {value}); + substr($mantstr, -$fracpos, 0) = '.'; + + my $str = $mantstr . 'e+' . $CALC->_str($expo -> {value}); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +# Engineering notation, e.g., "12345" is written as "12.345e+3". + +sub bestr { + my $x = shift; + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my ($mant, $expo) = $x -> parts(); + + my $sign = $mant -> sign(); + $mant -> babs(); + + my $mantstr = $CALC->_str($mant -> {value}); + my $mantlen = CORE::length($mantstr); + + my $dotidx = 1; + $expo += $mantlen - 1; + + my $c = $expo -> copy() -> bmod(3); + $expo -= $c; + $dotidx += $c; + + if ($mantlen < $dotidx) { + $mantstr .= "0" x ($dotidx - $mantlen); + } elsif ($mantlen > $dotidx) { + substr($mantstr, $dotidx, 0) = "."; + } + + my $str = $mantstr . 'e+' . $CALC->_str($expo -> {value}); + return $sign eq "-" ? "-$str" : $str; +} + +# Decimal notation, e.g., "12345". + +sub bdstr { + my $x = shift; + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my $str = $CALC->_str($x->{value}); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub to_hex { + # return as hex string, with prefixed 0x + my $x = shift; + $x = $class->new($x) if !ref($x); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $hex = $CALC->_to_hex($x->{value}); + return $x->{sign} eq '-' ? "-$hex" : $hex; +} + +sub to_oct { + # return as octal string, with prefixed 0 + my $x = shift; + $x = $class->new($x) if !ref($x); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $oct = $CALC->_to_oct($x->{value}); + return $x->{sign} eq '-' ? "-$oct" : $oct; +} + +sub to_bin { + # return as binary string, with prefixed 0b + my $x = shift; + $x = $class->new($x) if !ref($x); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $bin = $CALC->_to_bin($x->{value}); + return $x->{sign} eq '-' ? "-$bin" : $bin; +} + +sub to_bytes { + # return a byte string + my $x = shift; + $x = $class->new($x) if !ref($x); + + Carp::croak("to_bytes() requires a finite, non-negative integer") + if $x -> is_neg() || ! $x -> is_int(); + + Carp::croak("to_bytes() requires a newer version of the $CALC library.") + unless $CALC->can('_to_bytes'); + + return $CALC->_to_bytes($x->{value}); +} + +sub as_hex { + # return as hex string, with prefixed 0x + my $x = shift; + $x = $class->new($x) if !ref($x); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $hex = $CALC->_as_hex($x->{value}); + return $x->{sign} eq '-' ? "-$hex" : $hex; +} + +sub as_oct { + # return as octal string, with prefixed 0 + my $x = shift; + $x = $class->new($x) if !ref($x); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $oct = $CALC->_as_oct($x->{value}); + return $x->{sign} eq '-' ? "-$oct" : $oct; +} + +sub as_bin { + # return as binary string, with prefixed 0b + my $x = shift; + $x = $class->new($x) if !ref($x); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $bin = $CALC->_as_bin($x->{value}); + return $x->{sign} eq '-' ? "-$bin" : $bin; +} + +*as_bytes = \&to_bytes; + +############################################################################### +# Other conversion methods +############################################################################### + +sub numify { + # Make a Perl scalar number from a Math::BigInt object. + my $x = shift; + $x = $class->new($x) unless ref $x; + + if ($x -> is_nan()) { + require Math::Complex; + my $inf = Math::Complex::Inf(); + return $inf - $inf; + } + + if ($x -> is_inf()) { + require Math::Complex; + my $inf = Math::Complex::Inf(); + return $x -> is_negative() ? -$inf : $inf; + } + + my $num = 0 + $CALC->_num($x->{value}); + return $x->{sign} eq '-' ? -$num : $num; +} + +############################################################################### +# Private methods and functions. +############################################################################### + +sub objectify { + # Convert strings and "foreign objects" to the objects we want. + + # The first argument, $count, is the number of following arguments that + # objectify() looks at and converts to objects. The first is a classname. + # If the given count is 0, all arguments will be used. + + # After the count is read, objectify obtains the name of the class to which + # the following arguments are converted. If the second argument is a + # reference, use the reference type as the class name. Otherwise, if it is + # a string that looks like a class name, use that. Otherwise, use $class. + + # Caller: Gives us: + # + # $x->badd(1); => ref x, scalar y + # Class->badd(1, 2); => classname x (scalar), scalar x, scalar y + # Class->badd(Class->(1), 2); => classname x (scalar), ref x, scalar y + # Math::BigInt::badd(1, 2); => scalar x, scalar y + + # A shortcut for the common case $x->unary_op(), in which case the argument + # list is (0, $x) or (1, $x). + + return (ref($_[1]), $_[1]) if @_ == 2 && ($_[0] || 0) == 1 && ref($_[1]); + + # Check the context. + + unless (wantarray) { + Carp::croak("${class}::objectify() needs list context"); + } + + # Get the number of arguments to objectify. + + my $count = shift; + + # Initialize the output array. + + my @a = @_; + + # If the first argument is a reference, use that reference type as our + # class name. Otherwise, if the first argument looks like a class name, + # then use that as our class name. Otherwise, use the default class name. + + my $class; + if (ref($a[0])) { # reference? + $class = ref($a[0]); + } elsif ($a[0] =~ /^[A-Z].*::/) { # string with class name? + $class = shift @a; + } else { + $class = __PACKAGE__; # default class name + } + + $count ||= @a; + unshift @a, $class; + + no strict 'refs'; + + # What we upgrade to, if anything. + + my $up = ${"$a[0]::upgrade"}; + + # Disable downgrading, because Math::BigFloat -> foo('1.0', '2.0') needs + # floats. + + my $down; + if (defined ${"$a[0]::downgrade"}) { + $down = ${"$a[0]::downgrade"}; + ${"$a[0]::downgrade"} = undef; + } + + for my $i (1 .. $count) { + + my $ref = ref $a[$i]; + + # Perl scalars are fed to the appropriate constructor. + + unless ($ref) { + $a[$i] = $a[0] -> new($a[$i]); + next; + } + + # If it is an object of the right class, all is fine. + + next if $ref -> isa($a[0]); + + # Upgrading is OK, so skip further tests if the argument is upgraded. + + if (defined $up && $ref -> isa($up)) { + next; + } + + # See if we can call one of the as_xxx() methods. We don't know whether + # the as_xxx() method returns an object or a scalar, so re-check + # afterwards. + + my $recheck = 0; + + if ($a[0] -> isa('Math::BigInt')) { + if ($a[$i] -> can('as_int')) { + $a[$i] = $a[$i] -> as_int(); + $recheck = 1; + } elsif ($a[$i] -> can('as_number')) { + $a[$i] = $a[$i] -> as_number(); + $recheck = 1; + } + } + + elsif ($a[0] -> isa('Math::BigFloat')) { + if ($a[$i] -> can('as_float')) { + $a[$i] = $a[$i] -> as_float(); + $recheck = $1; + } + } + + # If we called one of the as_xxx() methods, recheck. + + if ($recheck) { + $ref = ref($a[$i]); + + # Perl scalars are fed to the appropriate constructor. + + unless ($ref) { + $a[$i] = $a[0] -> new($a[$i]); + next; + } + + # If it is an object of the right class, all is fine. + + next if $ref -> isa($a[0]); + } + + # Last resort. + + $a[$i] = $a[0] -> new($a[$i]); + } + + # Reset the downgrading. + + ${"$a[0]::downgrade"} = $down; + + return @a; +} + +sub import { + my $class = shift; + + $IMPORT++; # remember we did import() + my @a; + my $l = scalar @_; + my $warn_or_die = 0; # 0 - no warn, 1 - warn, 2 - die + for (my $i = 0; $i < $l ; $i++) { + if ($_[$i] eq ':constant') { + # this causes overlord er load to step in + overload::constant + integer => sub { $class->new(shift) }, + binary => sub { $class->new(shift) }; + } elsif ($_[$i] eq 'upgrade') { + # this causes upgrading + $upgrade = $_[$i+1]; # or undef to disable + $i++; + } elsif ($_[$i] =~ /^(lib|try|only)\z/) { + # this causes a different low lib to take care... + $CALC = $_[$i+1] || ''; + # lib => 1 (warn on fallback), try => 0 (no warn), only => 2 (die on fallback) + $warn_or_die = 1 if $_[$i] eq 'lib'; + $warn_or_die = 2 if $_[$i] eq 'only'; + $i++; + } else { + push @a, $_[$i]; + } + } + # any non :constant stuff is handled by our parent, Exporter + if (@a > 0) { + require Exporter; + + $class->SUPER::import(@a); # need it for subclasses + $class->export_to_level(1, $class, @a); # need it for MBF + } + + # try to load core math lib + my @c = split /\s*,\s*/, $CALC; + foreach (@c) { + $_ =~ tr/a-zA-Z0-9://cd; # limit to sane characters + } + push @c, \'Calc' # if all fail, try these + if $warn_or_die < 2; # but not for "only" + $CALC = ''; # signal error + foreach my $l (@c) { + # fallback libraries are "marked" as \'string', extract string if nec. + my $lib = $l; + $lib = $$l if ref($l); + + next if ($lib || '') eq ''; + $lib = 'Math::BigInt::'.$lib if $lib !~ /^Math::BigInt/i; + $lib =~ s/\.pm$//; + if ($] < 5.006) { + # Perl < 5.6.0 dies with "out of memory!" when eval("") and ':constant' is + # used in the same script, or eval("") inside import(). + my @parts = split /::/, $lib; # Math::BigInt => Math BigInt + my $file = pop @parts; + $file .= '.pm'; # BigInt => BigInt.pm + require File::Spec; + $file = File::Spec->catfile (@parts, $file); + eval { + require "$file"; + $lib->import(@c); + } + } else { + eval "use $lib qw/@c/;"; + } + if ($@ eq '') { + my $ok = 1; + # loaded it ok, see if the api_version() is high enough + if ($lib->can('api_version') && $lib->api_version() >= 1.0) { + $ok = 0; + # api_version matches, check if it really provides anything we need + for my $method (qw/ + one two ten + str num + add mul div sub dec inc + acmp len digit is_one is_zero is_even is_odd + is_two is_ten + zeros new copy check + from_hex from_oct from_bin as_hex as_bin as_oct + rsft lsft xor and or + mod sqrt root fac pow modinv modpow log_int gcd + /) { + if (!$lib->can("_$method")) { + if (($WARN{$lib} || 0) < 2) { + Carp::carp("$lib is missing method '_$method'"); + $WARN{$lib} = 1; # still warn about the lib + } + $ok++; + last; + } + } + } + if ($ok == 0) { + $CALC = $lib; + if ($warn_or_die > 0 && ref($l)) { + my $msg = "Math::BigInt: couldn't load specified" + . " math lib(s), fallback to $lib"; + Carp::carp($msg) if $warn_or_die == 1; + Carp::croak($msg) if $warn_or_die == 2; + } + last; # found a usable one, break + } else { + if (($WARN{$lib} || 0) < 2) { + my $ver = eval "\$$lib\::VERSION" || 'unknown'; + Carp::carp("Cannot load outdated $lib v$ver, please upgrade"); + $WARN{$lib} = 2; # never warn again + } + } + } + } + if ($CALC eq '') { + if ($warn_or_die == 2) { + Carp::croak("Couldn't load specified math lib(s)" . + " and fallback disallowed"); + } else { + Carp::croak("Couldn't load any math lib(s), not even fallback to Calc.pm"); + } + } + + # notify callbacks + foreach my $class (keys %CALLBACKS) { + &{$CALLBACKS{$class}}($CALC); + } + + # Fill $CAN with the results of $CALC->can(...) for emulating lower math lib + # functions + + %CAN = (); + for my $method (qw/ signed_and signed_or signed_xor /) { + $CAN{$method} = $CALC->can("_$method") ? 1 : 0; + } + + # import done +} + +sub _register_callback { + my ($class, $callback) = @_; + + if (ref($callback) ne 'CODE') { + Carp::croak("$callback is not a coderef"); + } + $CALLBACKS{$class} = $callback; +} + +sub _split_dec_string { + my $str = shift; + + if ($str =~ s/ + ^ + + # leading whitespace + ( \s* ) + + # optional sign + ( [+-]? ) + + # significand + ( + \d+ (?: _ \d+ )* + (?: + \. + (?: \d+ (?: _ \d+ )* )? + )? + | + \. + \d+ (?: _ \d+ )* + ) + + # optional exponent + (?: + [Ee] + ( [+-]? ) + ( \d+ (?: _ \d+ )* ) + )? + + # trailing stuff + ( \D .*? )? + + \z + //x) { + my $leading = $1; + my $significand_sgn = $2 || '+'; + my $significand_abs = $3; + my $exponent_sgn = $4 || '+'; + my $exponent_abs = $5 || '0'; + my $trailing = $6; + + # Remove underscores and leading zeros. + + $significand_abs =~ tr/_//d; + $exponent_abs =~ tr/_//d; + + $significand_abs =~ s/^0+(.)/$1/; + $exponent_abs =~ s/^0+(.)/$1/; + + # If the significand contains a dot, remove it and adjust the exponent + # accordingly. E.g., "1234.56789e+3" -> "123456789e-2" + + my $idx = index $significand_abs, '.'; + if ($idx > -1) { + $significand_abs =~ s/0+\z//; + substr($significand_abs, $idx, 1) = ''; + my $exponent = $exponent_sgn . $exponent_abs; + $exponent .= $idx - CORE::length($significand_abs); + $exponent_abs = abs $exponent; + $exponent_sgn = $exponent < 0 ? '-' : '+'; + } + + return($leading, + $significand_sgn, $significand_abs, + $exponent_sgn, $exponent_abs, + $trailing); + } + + return undef; +} + +sub _split { + # input: num_str; output: undef for invalid or + # (\$mantissa_sign, \$mantissa_value, \$mantissa_fraction, + # \$exp_sign, \$exp_value) + # Internal, take apart a string and return the pieces. + # Strip leading/trailing whitespace, leading zeros, underscore and reject + # invalid input. + my $x = shift; + + # strip white space at front, also extraneous leading zeros + $x =~ s/^\s*([-]?)0*([0-9])/$1$2/g; # will not strip ' .2' + $x =~ s/^\s+//; # but this will + $x =~ s/\s+$//g; # strip white space at end + + # shortcut, if nothing to split, return early + if ($x =~ /^[+-]?[0-9]+\z/) { + $x =~ s/^([+-])0*([0-9])/$2/; + my $sign = $1 || '+'; + return (\$sign, \$x, \'', \'', \0); + } + + # invalid starting char? + return if $x !~ /^[+-]?(\.?[0-9]|0b[0-1]|0x[0-9a-fA-F])/; + + return Math::BigInt->from_hex($x) if $x =~ /^[+-]?0x/; # hex string + return Math::BigInt->from_bin($x) if $x =~ /^[+-]?0b/; # binary string + + # strip underscores between digits + $x =~ s/([0-9])_([0-9])/$1$2/g; + $x =~ s/([0-9])_([0-9])/$1$2/g; # do twice for 1_2_3 + + # some possible inputs: + # 2.1234 # 0.12 # 1 # 1E1 # 2.134E1 # 434E-10 # 1.02009E-2 + # .2 # 1_2_3.4_5_6 # 1.4E1_2_3 # 1e3 # +.2 # 0e999 + + my ($m, $e, $last) = split /[Ee]/, $x; + return if defined $last; # last defined => 1e2E3 or others + $e = '0' if !defined $e || $e eq ""; + + # sign, value for exponent, mantint, mantfrac + my ($es, $ev, $mis, $miv, $mfv); + # valid exponent? + if ($e =~ /^([+-]?)0*([0-9]+)$/) # strip leading zeros + { + $es = $1; + $ev = $2; + # valid mantissa? + return if $m eq '.' || $m eq ''; + my ($mi, $mf, $lastf) = split /\./, $m; + return if defined $lastf; # lastf defined => 1.2.3 or others + $mi = '0' if !defined $mi; + $mi .= '0' if $mi =~ /^[\-\+]?$/; + $mf = '0' if !defined $mf || $mf eq ''; + if ($mi =~ /^([+-]?)0*([0-9]+)$/) # strip leading zeros + { + $mis = $1 || '+'; + $miv = $2; + return unless ($mf =~ /^([0-9]*?)0*$/); # strip trailing zeros + $mfv = $1; + # handle the 0e999 case here + $ev = 0 if $miv eq '0' && $mfv eq ''; + return (\$mis, \$miv, \$mfv, \$es, \$ev); + } + } + return; # NaN, not a number +} + +sub _trailing_zeros { + # return the amount of trailing zeros in $x (as scalar) + my $x = shift; + $x = $class->new($x) unless ref $x; + + return 0 if $x->{sign} !~ /^[+-]$/; # NaN, inf, -inf etc + + $CALC->_zeros($x->{value}); # must handle odd values, 0 etc +} + +sub _scan_for_nonzero { + # internal, used by bround() to scan for non-zeros after a '5' + my ($x, $pad, $xs, $len) = @_; + + return 0 if $len == 1; # "5" is trailed by invisible zeros + my $follow = $pad - 1; + return 0 if $follow > $len || $follow < 1; + + # use the string form to check whether only '0's follow or not + substr ($xs, -$follow) =~ /[^0]/ ? 1 : 0; +} + +sub _find_round_parameters { + # After any operation or when calling round(), the result is rounded by + # regarding the A & P from arguments, local parameters, or globals. + + # !!!!!!! If you change this, remember to change round(), too! !!!!!!!!!! + + # This procedure finds the round parameters, but it is for speed reasons + # duplicated in round. Otherwise, it is tested by the testsuite and used + # by bdiv(). + + # returns ($self) or ($self, $a, $p, $r) - sets $self to NaN of both A and P + # were requested/defined (locally or globally or both) + + my ($self, $a, $p, $r, @args) = @_; + # $a accuracy, if given by caller + # $p precision, if given by caller + # $r round_mode, if given by caller + # @args all 'other' arguments (0 for unary, 1 for binary ops) + + my $class = ref($self); # find out class of argument(s) + no strict 'refs'; + + # convert to normal scalar for speed and correctness in inner parts + $a = $a->can('numify') ? $a->numify() : "$a" if defined $a && ref($a); + $p = $p->can('numify') ? $p->numify() : "$p" if defined $p && ref($p); + + # now pick $a or $p, but only if we have got "arguments" + if (!defined $a) { + foreach ($self, @args) { + # take the defined one, or if both defined, the one that is smaller + $a = $_->{_a} if (defined $_->{_a}) && (!defined $a || $_->{_a} < $a); + } + } + if (!defined $p) { + # even if $a is defined, take $p, to signal error for both defined + foreach ($self, @args) { + # take the defined one, or if both defined, the one that is bigger + # -2 > -3, and 3 > 2 + $p = $_->{_p} if (defined $_->{_p}) && (!defined $p || $_->{_p} > $p); + } + } + + # if still none defined, use globals (#2) + $a = ${"$class\::accuracy"} unless defined $a; + $p = ${"$class\::precision"} unless defined $p; + + # A == 0 is useless, so undef it to signal no rounding + $a = undef if defined $a && $a == 0; + + # no rounding today? + return ($self) unless defined $a || defined $p; # early out + + # set A and set P is an fatal error + return ($self->bnan()) if defined $a && defined $p; # error + + $r = ${"$class\::round_mode"} unless defined $r; + if ($r !~ /^(even|odd|[+-]inf|zero|trunc|common)$/) { + Carp::croak("Unknown round mode '$r'"); + } + + $a = int($a) if defined $a; + $p = int($p) if defined $p; + + ($self, $a, $p, $r); +} + +############################################################################### +# this method returns 0 if the object can be modified, or 1 if not. +# We use a fast constant sub() here, to avoid costly calls. Subclasses +# may override it with special code (f.i. Math::BigInt::Constant does so) + +sub modify () { 0; } + +1; + +__END__ + +# +# Complex numbers and associated mathematical functions +# -- Raphael Manfredi Since Sep 1996 +# -- Jarkko Hietaniemi Since Mar 1997 +# -- Daniel S. Lewart Since Sep 1997 +# + +package Math::Complex; + +{ use 5.006; } +use strict; + +our $VERSION = 1.59_01; + +use Config; + +our ($Inf, $ExpInf); +our ($vax_float, $has_inf, $has_nan); + +BEGIN { + $vax_float = (pack("d",1) =~ /^[\x80\x10]\x40/); + $has_inf = !$vax_float; + $has_nan = !$vax_float; + + unless ($has_inf) { + # For example in vax, there is no Inf, + # and just mentioning the DBL_MAX (1.70141183460469229e+38) + # causes SIGFPE. + + # These are pretty useless without a real infinity, + # but setting them makes for less warnings about their + # undefined values. + $Inf = "Inf"; + $ExpInf = "Inf"; + return; + } + + my %DBL_MAX = # These are IEEE 754 maxima. + ( + 4 => '1.70141183460469229e+38', + 8 => '1.7976931348623157e+308', + # AFAICT the 10, 12, and 16-byte long doubles + # all have the same maximum. + 10 => '1.1897314953572317650857593266280070162E+4932', + 12 => '1.1897314953572317650857593266280070162E+4932', + 16 => '1.1897314953572317650857593266280070162E+4932', + ); + + my $nvsize = $Config{nvsize} || + ($Config{uselongdouble} && $Config{longdblsize}) || + $Config{doublesize}; + die "Math::Complex: Could not figure out nvsize\n" + unless defined $nvsize; + die "Math::Complex: Cannot not figure out max nv (nvsize = $nvsize)\n" + unless defined $DBL_MAX{$nvsize}; + my $DBL_MAX = eval $DBL_MAX{$nvsize}; + die "Math::Complex: Could not figure out max nv (nvsize = $nvsize)\n" + unless defined $DBL_MAX; + my $BIGGER_THAN_THIS = 1e30; # Must find something bigger than this. + if ($^O eq 'unicosmk') { + $Inf = $DBL_MAX; + } else { + local $SIG{FPE} = sub { }; + local $!; + # We do want an arithmetic overflow, Inf INF inf Infinity. + for my $t ( + 'exp(99999)', # Enough even with 128-bit long doubles. + 'inf', + 'Inf', + 'INF', + 'infinity', + 'Infinity', + 'INFINITY', + '1e99999', + ) { + local $^W = 0; + my $i = eval "$t+1.0"; + if (defined $i && $i > $BIGGER_THAN_THIS) { + $Inf = $i; + last; + } + } + $Inf = $DBL_MAX unless defined $Inf; # Oh well, close enough. + die "Math::Complex: Could not get Infinity" + unless $Inf > $BIGGER_THAN_THIS; + $ExpInf = eval 'exp(99999)'; + } + # print "# On this machine, Inf = '$Inf'\n"; +} + +use Scalar::Util qw(set_prototype); + +use warnings; +no warnings 'syntax'; # To avoid the (_) warnings. + +BEGIN { + # For certain functions that we override, in 5.10 or better + # we can set a smarter prototype that will handle the lexical $_ + # (also a 5.10+ feature). + if ($] >= 5.010000) { + set_prototype \&abs, '_'; + set_prototype \&cos, '_'; + set_prototype \&exp, '_'; + set_prototype \&log, '_'; + set_prototype \&sin, '_'; + set_prototype \&sqrt, '_'; + } +} + +my $i; +my %LOGN; + +# Regular expression for floating point numbers. +# These days we could use Scalar::Util::lln(), I guess. +my $gre = qr'\s*([\+\-]?(?:(?:(?:\d+(?:_\d+)*(?:\.\d*(?:_\d+)*)?|\.\d+(?:_\d+)*)(?:[eE][\+\-]?\d+(?:_\d+)*)?))|inf)'i; + +require Exporter; + +our @ISA = qw(Exporter); + +my @trig = qw( + pi + tan + csc cosec sec cot cotan + asin acos atan + acsc acosec asec acot acotan + sinh cosh tanh + csch cosech sech coth cotanh + asinh acosh atanh + acsch acosech asech acoth acotanh + ); + +our @EXPORT = (qw( + i Re Im rho theta arg + sqrt log ln + log10 logn cbrt root + cplx cplxe + atan2 + ), + @trig); + +my @pi = qw(pi pi2 pi4 pip2 pip4 Inf); + +our @EXPORT_OK = @pi; + +our %EXPORT_TAGS = ( + 'trig' => [@trig], + 'pi' => [@pi], +); + +use overload + '=' => \&_copy, + '+=' => \&_plus, + '+' => \&_plus, + '-=' => \&_minus, + '-' => \&_minus, + '*=' => \&_multiply, + '*' => \&_multiply, + '/=' => \&_divide, + '/' => \&_divide, + '**=' => \&_power, + '**' => \&_power, + '==' => \&_numeq, + '<=>' => \&_spaceship, + 'neg' => \&_negate, + '~' => \&_conjugate, + 'abs' => \&abs, + 'sqrt' => \&sqrt, + 'exp' => \&exp, + 'log' => \&log, + 'sin' => \&sin, + 'cos' => \&cos, + 'atan2' => \&atan2, + '""' => \&_stringify; + +# +# Package "privates" +# + +my %DISPLAY_FORMAT = ('style' => 'cartesian', + 'polar_pretty_print' => 1); +my $eps = 1e-14; # Epsilon + +# +# Object attributes (internal): +# cartesian [real, imaginary] -- cartesian form +# polar [rho, theta] -- polar form +# c_dirty cartesian form not up-to-date +# p_dirty polar form not up-to-date +# display display format (package's global when not set) +# + +# Die on bad *make() arguments. + +sub _cannot_make { + die "@{[(caller(1))[3]]}: Cannot take $_[0] of '$_[1]'.\n"; +} + +sub _make { + my $arg = shift; + my ($p, $q); + + if ($arg =~ /^$gre$/) { + ($p, $q) = ($1, 0); + } elsif ($arg =~ /^(?:$gre)?$gre\s*i\s*$/) { + ($p, $q) = ($1 || 0, $2); + } elsif ($arg =~ /^\s*\(\s*$gre\s*(?:,\s*$gre\s*)?\)\s*$/) { + ($p, $q) = ($1, $2 || 0); + } + + if (defined $p) { + $p =~ s/^\+//; + $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + $q =~ s/^\+//; + $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + } + + return ($p, $q); +} + +sub _emake { + my $arg = shift; + my ($p, $q); + + if ($arg =~ /^\s*\[\s*$gre\s*(?:,\s*$gre\s*)?\]\s*$/) { + ($p, $q) = ($1, $2 || 0); + } elsif ($arg =~ m!^\s*\[\s*$gre\s*(?:,\s*([-+]?\d*\s*)?pi(?:/\s*(\d+))?\s*)?\]\s*$!) { + ($p, $q) = ($1, ($2 eq '-' ? -1 : ($2 || 1)) * pi() / ($3 || 1)); + } elsif ($arg =~ /^\s*\[\s*$gre\s*\]\s*$/) { + ($p, $q) = ($1, 0); + } elsif ($arg =~ /^\s*$gre\s*$/) { + ($p, $q) = ($1, 0); + } + + if (defined $p) { + $p =~ s/^\+//; + $q =~ s/^\+//; + $p =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + $q =~ s/^(-?)inf$/"${1}9**9**9"/e if $has_inf; + } + + return ($p, $q); +} + +sub _copy { + my $self = shift; + my $clone = {%$self}; + if ($self->{'cartesian'}) { + $clone->{'cartesian'} = [@{$self->{'cartesian'}}]; + } + if ($self->{'polar'}) { + $clone->{'polar'} = [@{$self->{'polar'}}]; + } + bless $clone,__PACKAGE__; + return $clone; +} + +# +# ->make +# +# Create a new complex number (cartesian form) +# +sub make { + my $self = bless {}, shift; + my ($re, $im); + if (@_ == 0) { + ($re, $im) = (0, 0); + } elsif (@_ == 1) { + return (ref $self)->emake($_[0]) + if ($_[0] =~ /^\s*\[/); + ($re, $im) = _make($_[0]); + } elsif (@_ == 2) { + ($re, $im) = @_; + } + if (defined $re) { + _cannot_make("real part", $re) unless $re =~ /^$gre$/; + } + $im ||= 0; + _cannot_make("imaginary part", $im) unless $im =~ /^$gre$/; + $self->_set_cartesian([$re, $im ]); + $self->display_format('cartesian'); + + return $self; +} + +# +# ->emake +# +# Create a new complex number (exponential form) +# +sub emake { + my $self = bless {}, shift; + my ($rho, $theta); + if (@_ == 0) { + ($rho, $theta) = (0, 0); + } elsif (@_ == 1) { + return (ref $self)->make($_[0]) + if ($_[0] =~ /^\s*\(/ || $_[0] =~ /i\s*$/); + ($rho, $theta) = _emake($_[0]); + } elsif (@_ == 2) { + ($rho, $theta) = @_; + } + if (defined $rho && defined $theta) { + if ($rho < 0) { + $rho = -$rho; + $theta = ($theta <= 0) ? $theta + pi() : $theta - pi(); + } + } + if (defined $rho) { + _cannot_make("rho", $rho) unless $rho =~ /^$gre$/; + } + $theta ||= 0; + _cannot_make("theta", $theta) unless $theta =~ /^$gre$/; + $self->_set_polar([$rho, $theta]); + $self->display_format('polar'); + + return $self; +} + +sub new { &make } # For backward compatibility only. + +# +# cplx +# +# Creates a complex number from a (re, im) tuple. +# This avoids the burden of writing Math::Complex->make(re, im). +# +sub cplx { + return __PACKAGE__->make(@_); +} + +# +# cplxe +# +# Creates a complex number from a (rho, theta) tuple. +# This avoids the burden of writing Math::Complex->emake(rho, theta). +# +sub cplxe { + return __PACKAGE__->emake(@_); +} + +# +# pi +# +# The number defined as pi = 180 degrees +# +sub pi () { 4 * CORE::atan2(1, 1) } + +# +# pi2 +# +# The full circle +# +sub pi2 () { 2 * pi } + +# +# pi4 +# +# The full circle twice. +# +sub pi4 () { 4 * pi } + +# +# pip2 +# +# The quarter circle +# +sub pip2 () { pi / 2 } + +# +# pip4 +# +# The eighth circle. +# +sub pip4 () { pi / 4 } + +# +# _uplog10 +# +# Used in log10(). +# +sub _uplog10 () { 1 / CORE::log(10) } + +# +# i +# +# The number defined as i*i = -1; +# +sub i () { + return $i if ($i); + $i = bless {}; + $i->{'cartesian'} = [0, 1]; + $i->{'polar'} = [1, pip2]; + $i->{c_dirty} = 0; + $i->{p_dirty} = 0; + return $i; +} + +# +# _ip2 +# +# Half of i. +# +sub _ip2 () { i / 2 } + +# +# Attribute access/set routines +# + +sub _cartesian {$_[0]->{c_dirty} ? + $_[0]->_update_cartesian : $_[0]->{'cartesian'}} +sub _polar {$_[0]->{p_dirty} ? + $_[0]->_update_polar : $_[0]->{'polar'}} + +sub _set_cartesian { $_[0]->{p_dirty}++; $_[0]->{c_dirty} = 0; + $_[0]->{'cartesian'} = $_[1] } +sub _set_polar { $_[0]->{c_dirty}++; $_[0]->{p_dirty} = 0; + $_[0]->{'polar'} = $_[1] } + +# +# ->_update_cartesian +# +# Recompute and return the cartesian form, given accurate polar form. +# +sub _update_cartesian { + my $self = shift; + my ($r, $t) = @{$self->{'polar'}}; + $self->{c_dirty} = 0; + return $self->{'cartesian'} = [$r * CORE::cos($t), $r * CORE::sin($t)]; +} + +# +# +# ->_update_polar +# +# Recompute and return the polar form, given accurate cartesian form. +# +sub _update_polar { + my $self = shift; + my ($x, $y) = @{$self->{'cartesian'}}; + $self->{p_dirty} = 0; + return $self->{'polar'} = [0, 0] if $x == 0 && $y == 0; + return $self->{'polar'} = [CORE::sqrt($x*$x + $y*$y), + CORE::atan2($y, $x)]; +} + +# +# (_plus) +# +# Computes z1+z2. +# +sub _plus { + my ($z1, $z2, $regular) = @_; + my ($re1, $im1) = @{$z1->_cartesian}; + $z2 = cplx($z2) unless ref $z2; + my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + unless (defined $regular) { + $z1->_set_cartesian([$re1 + $re2, $im1 + $im2]); + return $z1; + } + return (ref $z1)->make($re1 + $re2, $im1 + $im2); +} + +# +# (_minus) +# +# Computes z1-z2. +# +sub _minus { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1) = @{$z1->_cartesian}; + $z2 = cplx($z2) unless ref $z2; + my ($re2, $im2) = @{$z2->_cartesian}; + unless (defined $inverted) { + $z1->_set_cartesian([$re1 - $re2, $im1 - $im2]); + return $z1; + } + return $inverted ? + (ref $z1)->make($re2 - $re1, $im2 - $im1) : + (ref $z1)->make($re1 - $re2, $im1 - $im2); + +} + +# +# (_multiply) +# +# Computes z1*z2. +# +sub _multiply { + my ($z1, $z2, $regular) = @_; + if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) { + # if both polar better use polar to avoid rounding errors + my ($r1, $t1) = @{$z1->_polar}; + my ($r2, $t2) = @{$z2->_polar}; + my $t = $t1 + $t2; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + unless (defined $regular) { + $z1->_set_polar([$r1 * $r2, $t]); + return $z1; + } + return (ref $z1)->emake($r1 * $r2, $t); + } else { + my ($x1, $y1) = @{$z1->_cartesian}; + if (ref $z2) { + my ($x2, $y2) = @{$z2->_cartesian}; + return (ref $z1)->make($x1*$x2-$y1*$y2, $x1*$y2+$y1*$x2); + } else { + return (ref $z1)->make($x1*$z2, $y1*$z2); + } + } +} + +# +# _divbyzero +# +# Die on division by zero. +# +sub _divbyzero { + my $mess = "$_[0]: Division by zero.\n"; + + if (defined $_[1]) { + $mess .= "(Because in the definition of $_[0], the divisor "; + $mess .= "$_[1] " unless ("$_[1]" eq '0'); + $mess .= "is 0)\n"; + } + + my @up = caller(1); + + $mess .= "Died at $up[1] line $up[2].\n"; + + die $mess; +} + +# +# (_divide) +# +# Computes z1/z2. +# +sub _divide { + my ($z1, $z2, $inverted) = @_; + if ($z1->{p_dirty} == 0 and ref $z2 and $z2->{p_dirty} == 0) { + # if both polar better use polar to avoid rounding errors + my ($r1, $t1) = @{$z1->_polar}; + my ($r2, $t2) = @{$z2->_polar}; + my $t; + if ($inverted) { + _divbyzero "$z2/0" if ($r1 == 0); + $t = $t2 - $t1; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + return (ref $z1)->emake($r2 / $r1, $t); + } else { + _divbyzero "$z1/0" if ($r2 == 0); + $t = $t1 - $t2; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + return (ref $z1)->emake($r1 / $r2, $t); + } + } else { + my ($d, $x2, $y2); + if ($inverted) { + ($x2, $y2) = @{$z1->_cartesian}; + $d = $x2*$x2 + $y2*$y2; + _divbyzero "$z2/0" if $d == 0; + return (ref $z1)->make(($x2*$z2)/$d, -($y2*$z2)/$d); + } else { + my ($x1, $y1) = @{$z1->_cartesian}; + if (ref $z2) { + ($x2, $y2) = @{$z2->_cartesian}; + $d = $x2*$x2 + $y2*$y2; + _divbyzero "$z1/0" if $d == 0; + my $u = ($x1*$x2 + $y1*$y2)/$d; + my $v = ($y1*$x2 - $x1*$y2)/$d; + return (ref $z1)->make($u, $v); + } else { + _divbyzero "$z1/0" if $z2 == 0; + return (ref $z1)->make($x1/$z2, $y1/$z2); + } + } + } +} + +# +# (_power) +# +# Computes z1**z2 = exp(z2 * log z1)). +# +sub _power { + my ($z1, $z2, $inverted) = @_; + if ($inverted) { + return 1 if $z1 == 0 || $z2 == 1; + return 0 if $z2 == 0 && Re($z1) > 0; + } else { + return 1 if $z2 == 0 || $z1 == 1; + return 0 if $z1 == 0 && Re($z2) > 0; + } + my $w = $inverted ? &exp($z1 * &log($z2)) + : &exp($z2 * &log($z1)); + # If both arguments cartesian, return cartesian, else polar. + return $z1->{c_dirty} == 0 && + (not ref $z2 or $z2->{c_dirty} == 0) ? + cplx(@{$w->_cartesian}) : $w; +} + +# +# (_spaceship) +# +# Computes z1 <=> z2. +# Sorts on the real part first, then on the imaginary part. Thus 2-4i < 3+8i. +# +sub _spaceship { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + my $sgn = $inverted ? -1 : 1; + return $sgn * ($re1 <=> $re2) if $re1 != $re2; + return $sgn * ($im1 <=> $im2); +} + +# +# (_numeq) +# +# Computes z1 == z2. +# +# (Required in addition to _spaceship() because of NaNs.) +sub _numeq { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + my ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + return $re1 == $re2 && $im1 == $im2 ? 1 : 0; +} + +# +# (_negate) +# +# Computes -z. +# +sub _negate { + my ($z) = @_; + if ($z->{c_dirty}) { + my ($r, $t) = @{$z->_polar}; + $t = ($t <= 0) ? $t + pi : $t - pi; + return (ref $z)->emake($r, $t); + } + my ($re, $im) = @{$z->_cartesian}; + return (ref $z)->make(-$re, -$im); +} + +# +# (_conjugate) +# +# Compute complex's _conjugate. +# +sub _conjugate { + my ($z) = @_; + if ($z->{c_dirty}) { + my ($r, $t) = @{$z->_polar}; + return (ref $z)->emake($r, -$t); + } + my ($re, $im) = @{$z->_cartesian}; + return (ref $z)->make($re, -$im); +} + +# +# (abs) +# +# Compute or set complex's norm (rho). +# +sub abs { + my ($z, $rho) = @_ ? @_ : $_; + unless (ref $z) { + if (@_ == 2) { + $_[0] = $_[1]; + } else { + return CORE::abs($z); + } + } + if (defined $rho) { + $z->{'polar'} = [ $rho, ${$z->_polar}[1] ]; + $z->{p_dirty} = 0; + $z->{c_dirty} = 1; + return $rho; + } else { + return ${$z->_polar}[0]; + } +} + +sub _theta { + my $theta = $_[0]; + + if ($$theta > pi()) { $$theta -= pi2 } + elsif ($$theta <= -pi()) { $$theta += pi2 } +} + +# +# arg +# +# Compute or set complex's argument (theta). +# +sub arg { + my ($z, $theta) = @_; + return $z unless ref $z; + if (defined $theta) { + _theta(\$theta); + $z->{'polar'} = [ ${$z->_polar}[0], $theta ]; + $z->{p_dirty} = 0; + $z->{c_dirty} = 1; + } else { + $theta = ${$z->_polar}[1]; + _theta(\$theta); + } + return $theta; +} + +# +# (sqrt) +# +# Compute sqrt(z). +# +# It is quite tempting to use wantarray here so that in list context +# sqrt() would return the two solutions. This, however, would +# break things like +# +# print "sqrt(z) = ", sqrt($z), "\n"; +# +# The two values would be printed side by side without no intervening +# whitespace, quite confusing. +# Therefore if you want the two solutions use the root(). +# +sub sqrt { + my ($z) = @_ ? $_[0] : $_; + my ($re, $im) = ref $z ? @{$z->_cartesian} : ($z, 0); + return $re < 0 ? cplx(0, CORE::sqrt(-$re)) : CORE::sqrt($re) + if $im == 0; + my ($r, $t) = @{$z->_polar}; + return (ref $z)->emake(CORE::sqrt($r), $t/2); +} + +# +# cbrt +# +# Compute cbrt(z) (cubic root). +# +# Why are we not returning three values? The same answer as for sqrt(). +# +sub cbrt { + my ($z) = @_; + return $z < 0 ? + -CORE::exp(CORE::log(-$z)/3) : + ($z > 0 ? CORE::exp(CORE::log($z)/3): 0) + unless ref $z; + my ($r, $t) = @{$z->_polar}; + return 0 if $r == 0; + return (ref $z)->emake(CORE::exp(CORE::log($r)/3), $t/3); +} + +# +# _rootbad +# +# Die on bad root. +# +sub _rootbad { + my $mess = "Root '$_[0]' illegal, root rank must be positive integer.\n"; + + my @up = caller(1); + + $mess .= "Died at $up[1] line $up[2].\n"; + + die $mess; +} + +# +# root +# +# Computes all nth root for z, returning an array whose size is n. +# `n' must be a positive integer. +# +# The roots are given by (for k = 0..n-1): +# +# z^(1/n) = r^(1/n) (cos ((t+2 k pi)/n) + i sin ((t+2 k pi)/n)) +# +sub root { + my ($z, $n, $k) = @_; + _rootbad($n) if ($n < 1 or int($n) != $n); + my ($r, $t) = ref $z ? + @{$z->_polar} : (CORE::abs($z), $z >= 0 ? 0 : pi); + my $theta_inc = pi2 / $n; + my $rho = $r ** (1/$n); + my $cartesian = ref $z && $z->{c_dirty} == 0; + if (@_ == 2) { + my @root; + for (my $i = 0, my $theta = $t / $n; + $i < $n; + $i++, $theta += $theta_inc) { + my $w = cplxe($rho, $theta); + # Yes, $cartesian is loop invariant. + push @root, $cartesian ? cplx(@{$w->_cartesian}) : $w; + } + return @root; + } elsif (@_ == 3) { + my $w = cplxe($rho, $t / $n + $k * $theta_inc); + return $cartesian ? cplx(@{$w->_cartesian}) : $w; + } +} + +# +# Re +# +# Return or set Re(z). +# +sub Re { + my ($z, $Re) = @_; + return $z unless ref $z; + if (defined $Re) { + $z->{'cartesian'} = [ $Re, ${$z->_cartesian}[1] ]; + $z->{c_dirty} = 0; + $z->{p_dirty} = 1; + } else { + return ${$z->_cartesian}[0]; + } +} + +# +# Im +# +# Return or set Im(z). +# +sub Im { + my ($z, $Im) = @_; + return 0 unless ref $z; + if (defined $Im) { + $z->{'cartesian'} = [ ${$z->_cartesian}[0], $Im ]; + $z->{c_dirty} = 0; + $z->{p_dirty} = 1; + } else { + return ${$z->_cartesian}[1]; + } +} + +# +# rho +# +# Return or set rho(w). +# +sub rho { + Math::Complex::abs(@_); +} + +# +# theta +# +# Return or set theta(w). +# +sub theta { + Math::Complex::arg(@_); +} + +# +# (exp) +# +# Computes exp(z). +# +sub exp { + my ($z) = @_ ? @_ : $_; + return CORE::exp($z) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + return (ref $z)->emake(CORE::exp($x), $y); +} + +# +# _logofzero +# +# Die on logarithm of zero. +# +sub _logofzero { + my $mess = "$_[0]: Logarithm of zero.\n"; + + if (defined $_[1]) { + $mess .= "(Because in the definition of $_[0], the argument "; + $mess .= "$_[1] " unless ($_[1] eq '0'); + $mess .= "is 0)\n"; + } + + my @up = caller(1); + + $mess .= "Died at $up[1] line $up[2].\n"; + + die $mess; +} + +# +# (log) +# +# Compute log(z). +# +sub log { + my ($z) = @_ ? @_ : $_; + unless (ref $z) { + _logofzero("log") if $z == 0; + return $z > 0 ? CORE::log($z) : cplx(CORE::log(-$z), pi); + } + my ($r, $t) = @{$z->_polar}; + _logofzero("log") if $r == 0; + if ($t > pi()) { $t -= pi2 } + elsif ($t <= -pi()) { $t += pi2 } + return (ref $z)->make(CORE::log($r), $t); +} + +# +# ln +# +# Alias for log(). +# +sub ln { Math::Complex::log(@_) } + +# +# log10 +# +# Compute log10(z). +# + +sub log10 { + return Math::Complex::log($_[0]) * _uplog10; +} + +# +# logn +# +# Compute logn(z,n) = log(z) / log(n) +# +sub logn { + my ($z, $n) = @_; + $z = cplx($z, 0) unless ref $z; + my $logn = $LOGN{$n}; + $logn = $LOGN{$n} = CORE::log($n) unless defined $logn; # Cache log(n) + return &log($z) / $logn; +} + +# +# (cos) +# +# Compute cos(z) = (exp(iz) + exp(-iz))/2. +# +sub cos { + my ($z) = @_ ? @_ : $_; + return CORE::cos($z) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + my $ey = CORE::exp($y); + my $sx = CORE::sin($x); + my $cx = CORE::cos($x); + my $ey_1 = $ey ? 1 / $ey : Inf(); + return (ref $z)->make($cx * ($ey + $ey_1)/2, + $sx * ($ey_1 - $ey)/2); +} + +# +# (sin) +# +# Compute sin(z) = (exp(iz) - exp(-iz))/2. +# +sub sin { + my ($z) = @_ ? @_ : $_; + return CORE::sin($z) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + my $ey = CORE::exp($y); + my $sx = CORE::sin($x); + my $cx = CORE::cos($x); + my $ey_1 = $ey ? 1 / $ey : Inf(); + return (ref $z)->make($sx * ($ey + $ey_1)/2, + $cx * ($ey - $ey_1)/2); +} + +# +# tan +# +# Compute tan(z) = sin(z) / cos(z). +# +sub tan { + my ($z) = @_; + my $cz = &cos($z); + _divbyzero "tan($z)", "cos($z)" if $cz == 0; + return &sin($z) / $cz; +} + +# +# sec +# +# Computes the secant sec(z) = 1 / cos(z). +# +sub sec { + my ($z) = @_; + my $cz = &cos($z); + _divbyzero "sec($z)", "cos($z)" if ($cz == 0); + return 1 / $cz; +} + +# +# csc +# +# Computes the cosecant csc(z) = 1 / sin(z). +# +sub csc { + my ($z) = @_; + my $sz = &sin($z); + _divbyzero "csc($z)", "sin($z)" if ($sz == 0); + return 1 / $sz; +} + +# +# cosec +# +# Alias for csc(). +# +sub cosec { Math::Complex::csc(@_) } + +# +# cot +# +# Computes cot(z) = cos(z) / sin(z). +# +sub cot { + my ($z) = @_; + my $sz = &sin($z); + _divbyzero "cot($z)", "sin($z)" if ($sz == 0); + return &cos($z) / $sz; +} + +# +# cotan +# +# Alias for cot(). +# +sub cotan { Math::Complex::cot(@_) } + +# +# acos +# +# Computes the arc cosine acos(z) = -i log(z + sqrt(z*z-1)). +# +sub acos { + my $z = $_[0]; + return CORE::atan2(CORE::sqrt(1-$z*$z), $z) + if (! ref $z) && CORE::abs($z) <= 1; + $z = cplx($z, 0) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + return 0 if $x == 1 && $y == 0; + my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y); + my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y); + my $alpha = ($t1 + $t2)/2; + my $beta = ($t1 - $t2)/2; + $alpha = 1 if $alpha < 1; + if ($beta > 1) { $beta = 1 } + elsif ($beta < -1) { $beta = -1 } + my $u = CORE::atan2(CORE::sqrt(1-$beta*$beta), $beta); + my $v = CORE::log($alpha + CORE::sqrt($alpha*$alpha-1)); + $v = -$v if $y > 0 || ($y == 0 && $x < -1); + return (ref $z)->make($u, $v); +} + +# +# asin +# +# Computes the arc sine asin(z) = -i log(iz + sqrt(1-z*z)). +# +sub asin { + my $z = $_[0]; + return CORE::atan2($z, CORE::sqrt(1-$z*$z)) + if (! ref $z) && CORE::abs($z) <= 1; + $z = cplx($z, 0) unless ref $z; + my ($x, $y) = @{$z->_cartesian}; + return 0 if $x == 0 && $y == 0; + my $t1 = CORE::sqrt(($x+1)*($x+1) + $y*$y); + my $t2 = CORE::sqrt(($x-1)*($x-1) + $y*$y); + my $alpha = ($t1 + $t2)/2; + my $beta = ($t1 - $t2)/2; + $alpha = 1 if $alpha < 1; + if ($beta > 1) { $beta = 1 } + elsif ($beta < -1) { $beta = -1 } + my $u = CORE::atan2($beta, CORE::sqrt(1-$beta*$beta)); + my $v = -CORE::log($alpha + CORE::sqrt($alpha*$alpha-1)); + $v = -$v if $y > 0 || ($y == 0 && $x < -1); + return (ref $z)->make($u, $v); +} + +# +# atan +# +# Computes the arc tangent atan(z) = i/2 log((i+z) / (i-z)). +# +sub atan { + my ($z) = @_; + return CORE::atan2($z, 1) unless ref $z; + my ($x, $y) = ref $z ? @{$z->_cartesian} : ($z, 0); + return 0 if $x == 0 && $y == 0; + _divbyzero "atan(i)" if ( $z == i); + _logofzero "atan(-i)" if (-$z == i); # -i is a bad file test... + my $log = &log((i + $z) / (i - $z)); + return _ip2 * $log; +} + +# +# asec +# +# Computes the arc secant asec(z) = acos(1 / z). +# +sub asec { + my ($z) = @_; + _divbyzero "asec($z)", $z if ($z == 0); + return acos(1 / $z); +} + +# +# acsc +# +# Computes the arc cosecant acsc(z) = asin(1 / z). +# +sub acsc { + my ($z) = @_; + _divbyzero "acsc($z)", $z if ($z == 0); + return asin(1 / $z); +} + +# +# acosec +# +# Alias for acsc(). +# +sub acosec { Math::Complex::acsc(@_) } + +# +# acot +# +# Computes the arc cotangent acot(z) = atan(1 / z) +# +sub acot { + my ($z) = @_; + _divbyzero "acot(0)" if $z == 0; + return ($z >= 0) ? CORE::atan2(1, $z) : CORE::atan2(-1, -$z) + unless ref $z; + _divbyzero "acot(i)" if ($z - i == 0); + _logofzero "acot(-i)" if ($z + i == 0); + return atan(1 / $z); +} + +# +# acotan +# +# Alias for acot(). +# +sub acotan { Math::Complex::acot(@_) } + +# +# cosh +# +# Computes the hyperbolic cosine cosh(z) = (exp(z) + exp(-z))/2. +# +sub cosh { + my ($z) = @_; + my $ex; + unless (ref $z) { + $ex = CORE::exp($z); + return $ex ? ($ex == $ExpInf ? Inf() : ($ex + 1/$ex)/2) : Inf(); + } + my ($x, $y) = @{$z->_cartesian}; + $ex = CORE::exp($x); + my $ex_1 = $ex ? 1 / $ex : Inf(); + return (ref $z)->make(CORE::cos($y) * ($ex + $ex_1)/2, + CORE::sin($y) * ($ex - $ex_1)/2); +} + +# +# sinh +# +# Computes the hyperbolic sine sinh(z) = (exp(z) - exp(-z))/2. +# +sub sinh { + my ($z) = @_; + my $ex; + unless (ref $z) { + return 0 if $z == 0; + $ex = CORE::exp($z); + return $ex ? ($ex == $ExpInf ? Inf() : ($ex - 1/$ex)/2) : -Inf(); + } + my ($x, $y) = @{$z->_cartesian}; + my $cy = CORE::cos($y); + my $sy = CORE::sin($y); + $ex = CORE::exp($x); + my $ex_1 = $ex ? 1 / $ex : Inf(); + return (ref $z)->make(CORE::cos($y) * ($ex - $ex_1)/2, + CORE::sin($y) * ($ex + $ex_1)/2); +} + +# +# tanh +# +# Computes the hyperbolic tangent tanh(z) = sinh(z) / cosh(z). +# +sub tanh { + my ($z) = @_; + my $cz = cosh($z); + _divbyzero "tanh($z)", "cosh($z)" if ($cz == 0); + my $sz = sinh($z); + return 1 if $cz == $sz; + return -1 if $cz == -$sz; + return $sz / $cz; +} + +# +# sech +# +# Computes the hyperbolic secant sech(z) = 1 / cosh(z). +# +sub sech { + my ($z) = @_; + my $cz = cosh($z); + _divbyzero "sech($z)", "cosh($z)" if ($cz == 0); + return 1 / $cz; +} + +# +# csch +# +# Computes the hyperbolic cosecant csch(z) = 1 / sinh(z). +# +sub csch { + my ($z) = @_; + my $sz = sinh($z); + _divbyzero "csch($z)", "sinh($z)" if ($sz == 0); + return 1 / $sz; +} + +# +# cosech +# +# Alias for csch(). +# +sub cosech { Math::Complex::csch(@_) } + +# +# coth +# +# Computes the hyperbolic cotangent coth(z) = cosh(z) / sinh(z). +# +sub coth { + my ($z) = @_; + my $sz = sinh($z); + _divbyzero "coth($z)", "sinh($z)" if $sz == 0; + my $cz = cosh($z); + return 1 if $cz == $sz; + return -1 if $cz == -$sz; + return $cz / $sz; +} + +# +# cotanh +# +# Alias for coth(). +# +sub cotanh { Math::Complex::coth(@_) } + +# +# acosh +# +# Computes the area/inverse hyperbolic cosine acosh(z) = log(z + sqrt(z*z-1)). +# +sub acosh { + my ($z) = @_; + unless (ref $z) { + $z = cplx($z, 0); + } + my ($re, $im) = @{$z->_cartesian}; + if ($im == 0) { + return CORE::log($re + CORE::sqrt($re*$re - 1)) + if $re >= 1; + return cplx(0, CORE::atan2(CORE::sqrt(1 - $re*$re), $re)) + if CORE::abs($re) < 1; + } + my $t = &sqrt($z * $z - 1) + $z; + # Try Taylor if looking bad (this usually means that + # $z was large negative, therefore the sqrt is really + # close to abs(z), summing that with z...) + $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7) + if $t == 0; + my $u = &log($t); + $u->Im(-$u->Im) if $re < 0 && $im == 0; + return $re < 0 ? -$u : $u; +} + +# +# asinh +# +# Computes the area/inverse hyperbolic sine asinh(z) = log(z + sqrt(z*z+1)) +# +sub asinh { + my ($z) = @_; + unless (ref $z) { + my $t = $z + CORE::sqrt($z*$z + 1); + return CORE::log($t) if $t; + } + my $t = &sqrt($z * $z + 1) + $z; + # Try Taylor if looking bad (this usually means that + # $z was large negative, therefore the sqrt is really + # close to abs(z), summing that with z...) + $t = 1/(2 * $z) - 1/(8 * $z**3) + 1/(16 * $z**5) - 5/(128 * $z**7) + if $t == 0; + return &log($t); +} + +# +# atanh +# +# Computes the area/inverse hyperbolic tangent atanh(z) = 1/2 log((1+z) / (1-z)). +# +sub atanh { + my ($z) = @_; + unless (ref $z) { + return CORE::log((1 + $z)/(1 - $z))/2 if CORE::abs($z) < 1; + $z = cplx($z, 0); + } + _divbyzero 'atanh(1)', "1 - $z" if (1 - $z == 0); + _logofzero 'atanh(-1)' if (1 + $z == 0); + return 0.5 * &log((1 + $z) / (1 - $z)); +} + +# +# asech +# +# Computes the area/inverse hyperbolic secant asech(z) = acosh(1 / z). +# +sub asech { + my ($z) = @_; + _divbyzero 'asech(0)', "$z" if ($z == 0); + return acosh(1 / $z); +} + +# +# acsch +# +# Computes the area/inverse hyperbolic cosecant acsch(z) = asinh(1 / z). +# +sub acsch { + my ($z) = @_; + _divbyzero 'acsch(0)', $z if ($z == 0); + return asinh(1 / $z); +} + +# +# acosech +# +# Alias for acosh(). +# +sub acosech { Math::Complex::acsch(@_) } + +# +# acoth +# +# Computes the area/inverse hyperbolic cotangent acoth(z) = 1/2 log((1+z) / (z-1)). +# +sub acoth { + my ($z) = @_; + _divbyzero 'acoth(0)' if ($z == 0); + unless (ref $z) { + return CORE::log(($z + 1)/($z - 1))/2 if CORE::abs($z) > 1; + $z = cplx($z, 0); + } + _divbyzero 'acoth(1)', "$z - 1" if ($z - 1 == 0); + _logofzero 'acoth(-1)', "1 + $z" if (1 + $z == 0); + return &log((1 + $z) / ($z - 1)) / 2; +} + +# +# acotanh +# +# Alias for acot(). +# +sub acotanh { Math::Complex::acoth(@_) } + +# +# (atan2) +# +# Compute atan(z1/z2), minding the right quadrant. +# +sub atan2 { + my ($z1, $z2, $inverted) = @_; + my ($re1, $im1, $re2, $im2); + if ($inverted) { + ($re1, $im1) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + ($re2, $im2) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + } else { + ($re1, $im1) = ref $z1 ? @{$z1->_cartesian} : ($z1, 0); + ($re2, $im2) = ref $z2 ? @{$z2->_cartesian} : ($z2, 0); + } + if ($im1 || $im2) { + # In MATLAB the imaginary parts are ignored. + # warn "atan2: Imaginary parts ignored"; + # http://documents.wolfram.com/mathematica/functions/ArcTan + # NOTE: Mathematica ArcTan[x,y] while atan2(y,x) + my $s = $z1 * $z1 + $z2 * $z2; + _divbyzero("atan2") if $s == 0; + my $i = &i; + my $r = $z2 + $z1 * $i; + return -$i * &log($r / &sqrt( $s )); + } + return CORE::atan2($re1, $re2); +} + +# +# display_format +# ->display_format +# +# Set (get if no argument) the display format for all complex numbers that +# don't happen to have overridden it via ->display_format +# +# When called as an object method, this actually sets the display format for +# the current object. +# +# Valid object formats are 'c' and 'p' for cartesian and polar. The first +# letter is used actually, so the type can be fully spelled out for clarity. +# +sub display_format { + my $self = shift; + my %display_format = %DISPLAY_FORMAT; + + if (ref $self) { # Called as an object method + if (exists $self->{display_format}) { + my %obj = %{$self->{display_format}}; + @display_format{keys %obj} = values %obj; + } + } + if (@_ == 1) { + $display_format{style} = shift; + } else { + my %new = @_; + @display_format{keys %new} = values %new; + } + + if (ref $self) { # Called as an object method + $self->{display_format} = { %display_format }; + return + wantarray ? + %{$self->{display_format}} : + $self->{display_format}->{style}; + } + + # Called as a class method + %DISPLAY_FORMAT = %display_format; + return + wantarray ? + %DISPLAY_FORMAT : + $DISPLAY_FORMAT{style}; +} + +# +# (_stringify) +# +# Show nicely formatted complex number under its cartesian or polar form, +# depending on the current display format: +# +# . If a specific display format has been recorded for this object, use it. +# . Otherwise, use the generic current default for all complex numbers, +# which is a package global variable. +# +sub _stringify { + my ($z) = shift; + + my $style = $z->display_format; + + $style = $DISPLAY_FORMAT{style} unless defined $style; + + return $z->_stringify_polar if $style =~ /^p/i; + return $z->_stringify_cartesian; +} + +# +# ->_stringify_cartesian +# +# Stringify as a cartesian representation 'a+bi'. +# +sub _stringify_cartesian { + my $z = shift; + my ($x, $y) = @{$z->_cartesian}; + my ($re, $im); + + my %format = $z->display_format; + my $format = $format{format}; + + if ($x) { + if ($x =~ /^NaN[QS]?$/i) { + $re = $x; + } else { + if ($x =~ /^-?\Q$Inf\E$/oi) { + $re = $x; + } else { + $re = defined $format ? sprintf($format, $x) : $x; + } + } + } else { + undef $re; + } + + if ($y) { + if ($y =~ /^(NaN[QS]?)$/i) { + $im = $y; + } else { + if ($y =~ /^-?\Q$Inf\E$/oi) { + $im = $y; + } else { + $im = + defined $format ? + sprintf($format, $y) : + ($y == 1 ? "" : ($y == -1 ? "-" : $y)); + } + } + $im .= "i"; + } else { + undef $im; + } + + my $str = $re; + + if (defined $im) { + if ($y < 0) { + $str .= $im; + } elsif ($y > 0 || $im =~ /^NaN[QS]?i$/i) { + $str .= "+" if defined $re; + $str .= $im; + } + } elsif (!defined $re) { + $str = "0"; + } + + return $str; +} + + +# +# ->_stringify_polar +# +# Stringify as a polar representation '[r,t]'. +# +sub _stringify_polar { + my $z = shift; + my ($r, $t) = @{$z->_polar}; + my $theta; + + my %format = $z->display_format; + my $format = $format{format}; + + if ($t =~ /^NaN[QS]?$/i || $t =~ /^-?\Q$Inf\E$/oi) { + $theta = $t; + } elsif ($t == pi) { + $theta = "pi"; + } elsif ($r == 0 || $t == 0) { + $theta = defined $format ? sprintf($format, $t) : $t; + } + + return "[$r,$theta]" if defined $theta; + + # + # Try to identify pi/n and friends. + # + + $t -= int(CORE::abs($t) / pi2) * pi2; + + if ($format{polar_pretty_print} && $t) { + my ($a, $b); + for $a (2..9) { + $b = $t * $a / pi; + if ($b =~ /^-?\d+$/) { + $b = $b < 0 ? "-" : "" if CORE::abs($b) == 1; + $theta = "${b}pi/$a"; + last; + } + } + } + + if (defined $format) { + $r = sprintf($format, $r); + $theta = sprintf($format, $t) unless defined $theta; + } else { + $theta = $t unless defined $theta; + } + + return "[$r,$theta]"; +} + +sub Inf { + return $Inf; +} + +1; +__END__ + + +1; + +# eof +# +# "Tax the rat farms." - Lord Vetinari +# + +# The following hash values are used: +# sign : +,-,NaN,+inf,-inf +# _d : denominator +# _n : numerator (value = _n/_d) +# _a : accuracy +# _p : precision +# You should not look at the innards of a BigRat - use the methods for this. + +package Math::BigRat; + +use 5.006; +use strict; +use warnings; + +use Carp (); + +use Math::BigFloat 1.999718; + +our $VERSION = '0.2613'; + +our @ISA = qw(Math::BigFloat); + +our ($accuracy, $precision, $round_mode, $div_scale, + $upgrade, $downgrade, $_trap_nan, $_trap_inf); + +use overload + + # overload key: with_assign + + '+' => sub { $_[0] -> copy() -> badd($_[1]); }, + + '-' => sub { my $c = $_[0] -> copy; + $_[2] ? $c -> bneg() -> badd( $_[1]) + : $c -> bsub($_[1]); }, + + '*' => sub { $_[0] -> copy() -> bmul($_[1]); }, + + '/' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bdiv($_[0]) + : $_[0] -> copy() -> bdiv($_[1]); }, + + + '%' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bmod($_[0]) + : $_[0] -> copy() -> bmod($_[1]); }, + + '**' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bpow($_[0]) + : $_[0] -> copy() -> bpow($_[1]); }, + + '<<' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> blsft($_[0]) + : $_[0] -> copy() -> blsft($_[1]); }, + + '>>' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> brsft($_[0]) + : $_[0] -> copy() -> brsft($_[1]); }, + + # overload key: assign + + '+=' => sub { $_[0]->badd($_[1]); }, + + '-=' => sub { $_[0]->bsub($_[1]); }, + + '*=' => sub { $_[0]->bmul($_[1]); }, + + '/=' => sub { scalar $_[0]->bdiv($_[1]); }, + + '%=' => sub { $_[0]->bmod($_[1]); }, + + '**=' => sub { $_[0]->bpow($_[1]); }, + + + '<<=' => sub { $_[0]->blsft($_[1]); }, + + '>>=' => sub { $_[0]->brsft($_[1]); }, + +# 'x=' => sub { }, + +# '.=' => sub { }, + + # overload key: num_comparison + + '<' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> blt($_[0]) + : $_[0] -> blt($_[1]); }, + + '<=' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> ble($_[0]) + : $_[0] -> ble($_[1]); }, + + '>' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bgt($_[0]) + : $_[0] -> bgt($_[1]); }, + + '>=' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bge($_[0]) + : $_[0] -> bge($_[1]); }, + + '==' => sub { $_[0] -> beq($_[1]); }, + + '!=' => sub { $_[0] -> bne($_[1]); }, + + # overload key: 3way_comparison + + '<=>' => sub { my $cmp = $_[0] -> bcmp($_[1]); + defined($cmp) && $_[2] ? -$cmp : $cmp; }, + + 'cmp' => sub { $_[2] ? "$_[1]" cmp $_[0] -> bstr() + : $_[0] -> bstr() cmp "$_[1]"; }, + + # overload key: str_comparison + +# 'lt' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrlt($_[0]) +# : $_[0] -> bstrlt($_[1]); }, +# +# 'le' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrle($_[0]) +# : $_[0] -> bstrle($_[1]); }, +# +# 'gt' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrgt($_[0]) +# : $_[0] -> bstrgt($_[1]); }, +# +# 'ge' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrge($_[0]) +# : $_[0] -> bstrge($_[1]); }, +# +# 'eq' => sub { $_[0] -> bstreq($_[1]); }, +# +# 'ne' => sub { $_[0] -> bstrne($_[1]); }, + + # overload key: binary + + '&' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> band($_[0]) + : $_[0] -> copy() -> band($_[1]); }, + + '&=' => sub { $_[0] -> band($_[1]); }, + + '|' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bior($_[0]) + : $_[0] -> copy() -> bior($_[1]); }, + + '|=' => sub { $_[0] -> bior($_[1]); }, + + '^' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bxor($_[0]) + : $_[0] -> copy() -> bxor($_[1]); }, + + '^=' => sub { $_[0] -> bxor($_[1]); }, + +# '&.' => sub { }, + +# '&.=' => sub { }, + +# '|.' => sub { }, + +# '|.=' => sub { }, + +# '^.' => sub { }, + +# '^.=' => sub { }, + + # overload key: unary + + 'neg' => sub { $_[0] -> copy() -> bneg(); }, + +# '!' => sub { }, + + '~' => sub { $_[0] -> copy() -> bnot(); }, + +# '~.' => sub { }, + + # overload key: mutators + + '++' => sub { $_[0] -> binc() }, + + '--' => sub { $_[0] -> bdec() }, + + # overload key: func + + 'atan2' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> batan2($_[0]) + : $_[0] -> copy() -> batan2($_[1]); }, + + 'cos' => sub { $_[0] -> copy() -> bcos(); }, + + 'sin' => sub { $_[0] -> copy() -> bsin(); }, + + 'exp' => sub { $_[0] -> copy() -> bexp($_[1]); }, + + 'abs' => sub { $_[0] -> copy() -> babs(); }, + + 'log' => sub { $_[0] -> copy() -> blog(); }, + + 'sqrt' => sub { $_[0] -> copy() -> bsqrt(); }, + + 'int' => sub { $_[0] -> copy() -> bint(); }, + + # overload key: conversion + + 'bool' => sub { $_[0] -> is_zero() ? '' : 1; }, + + '""' => sub { $_[0] -> bstr(); }, + + '0+' => sub { $_[0] -> numify(); }, + + '=' => sub { $_[0]->copy(); }, + + ; + +BEGIN { + *objectify = \&Math::BigInt::objectify; # inherit this from BigInt + *AUTOLOAD = \&Math::BigFloat::AUTOLOAD; # can't inherit AUTOLOAD + # We inherit these from BigFloat because currently it is not possible that + # Math::BigFloat has a different $LIB variable than we, because + # Math::BigFloat also uses Math::BigInt::config->('lib') (there is always + # only one library loaded) + *_e_add = \&Math::BigFloat::_e_add; + *_e_sub = \&Math::BigFloat::_e_sub; + *as_int = \&as_number; + *is_pos = \&is_positive; + *is_neg = \&is_negative; +} + +############################################################################## +# Global constants and flags. Access these only via the accessor methods! + +$accuracy = $precision = undef; +$round_mode = 'even'; +$div_scale = 40; +$upgrade = undef; +$downgrade = undef; + +# These are internally, and not to be used from the outside at all! + +$_trap_nan = 0; # are NaNs ok? set w/ config() +$_trap_inf = 0; # are infs ok? set w/ config() + +# the package we are using for our private parts, defaults to: +# Math::BigInt->config()->{lib} + +my $LIB = 'Math::BigInt::Calc'; + +my $nan = 'NaN'; +#my $class = 'Math::BigRat'; + +sub isa { + return 0 if $_[1] =~ /^Math::Big(Int|Float)/; # we aren't + UNIVERSAL::isa(@_); +} + +############################################################################## + +sub new { + my $proto = shift; + my $protoref = ref $proto; + my $class = $protoref || $proto; + + # Check the way we are called. + + if ($protoref) { + Carp::croak("new() is a class method, not an instance method"); + } + + if (@_ < 1) { + #Carp::carp("Using new() with no argument is deprecated;", + # " use bzero() or new(0) instead"); + return $class -> bzero(); + } + + if (@_ > 2) { + Carp::carp("Superfluous arguments to new() ignored."); + } + + # Get numerator and denominator. If any of the arguments is undefined, + # return zero. + + my ($n, $d) = @_; + + if (@_ == 1 && !defined $n || + @_ == 2 && (!defined $n || !defined $d)) + { + #Carp::carp("Use of uninitialized value in new()"); + return $class -> bzero(); + } + + # Initialize a new object. + + my $self = bless {}, $class; + + # One or two input arguments may be given. First handle the numerator $n. + + if (ref($n)) { + $n = Math::BigFloat -> new($n, undef, undef) + unless ($n -> isa('Math::BigRat') || + $n -> isa('Math::BigInt') || + $n -> isa('Math::BigFloat')); + } else { + if (defined $d) { + # If the denominator is defined, the numerator is not a string + # fraction, e.g., "355/113". + $n = Math::BigFloat -> new($n, undef, undef); + } else { + # If the denominator is undefined, the numerator might be a string + # fraction, e.g., "355/113". + if ($n =~ m| ^ \s* (\S+) \s* / \s* (\S+) \s* $ |x) { + $n = Math::BigFloat -> new($1, undef, undef); + $d = Math::BigFloat -> new($2, undef, undef); + } else { + $n = Math::BigFloat -> new($n, undef, undef); + } + } + } + + # At this point $n is an object and $d is either an object or undefined. An + # undefined $d means that $d was not specified by the caller (not that $d + # was specified as an undefined value). + + unless (defined $d) { + #return $n -> copy($n) if $n -> isa('Math::BigRat'); + return $class -> copy($n) if $n -> isa('Math::BigRat'); + return $class -> bnan() if $n -> is_nan(); + return $class -> binf($n -> sign()) if $n -> is_inf(); + + if ($n -> isa('Math::BigInt')) { + $self -> {_n} = $LIB -> _new($n -> copy() -> babs() -> bstr()); + $self -> {_d} = $LIB -> _one(); + $self -> {sign} = $n -> sign(); + return $self; + } + + if ($n -> isa('Math::BigFloat')) { + my $m = $n -> mantissa() -> babs(); + my $e = $n -> exponent(); + $self -> {_n} = $LIB -> _new($m -> bstr()); + $self -> {_d} = $LIB -> _one(); + + if ($e > 0) { + $self -> {_n} = $LIB -> _lsft($self -> {_n}, + $LIB -> _new($e -> bstr()), 10); + } elsif ($e < 0) { + $self -> {_d} = $LIB -> _lsft($self -> {_d}, + $LIB -> _new(-$e -> bstr()), 10); + + my $gcd = $LIB -> _gcd($LIB -> _copy($self -> {_n}), $self -> {_d}); + if (!$LIB -> _is_one($gcd)) { + $self -> {_n} = $LIB -> _div($self->{_n}, $gcd); + $self -> {_d} = $LIB -> _div($self->{_d}, $gcd); + } + } + + $self -> {sign} = $n -> sign(); + return $self; + } + + die "I don't know how to handle this"; # should never get here + } + + # At the point we know that both $n and $d are defined. We know that $n is + # an object, but $d might still be a scalar. Now handle $d. + + $d = Math::BigFloat -> new($d, undef, undef) + unless ref($d) && ($d -> isa('Math::BigRat') || + $d -> isa('Math::BigInt') || + $d -> isa('Math::BigFloat')); + + # At this point both $n and $d are objects. + + return $class -> bnan() if $n -> is_nan() || $d -> is_nan(); + + # At this point neither $n nor $d is a NaN. + + if ($n -> is_zero()) { + return $class -> bnan() if $d -> is_zero(); # 0/0 = NaN + return $class -> bzero(); + } + + return $class -> binf($d -> sign()) if $d -> is_zero(); + + # At this point, neither $n nor $d is a NaN or a zero. + + if ($d < 0) { # make sure denominator is positive + $n -> bneg(); + $d -> bneg(); + } + + if ($n -> is_inf()) { + return $class -> bnan() if $d -> is_inf(); # Inf/Inf = NaN + return $class -> binf($n -> sign()); + } + + # At this point $n is finite. + + return $class -> bzero() if $d -> is_inf(); + return $class -> binf($d -> sign()) if $d -> is_zero(); + + # At this point both $n and $d are finite and non-zero. + + if ($n < 0) { + $n -> bneg(); + $self -> {sign} = '-'; + } else { + $self -> {sign} = '+'; + } + + if ($n -> isa('Math::BigRat')) { + + if ($d -> isa('Math::BigRat')) { + + # At this point both $n and $d is a Math::BigRat. + + # p r p * s (p / gcd(p, r)) * (s / gcd(s, q)) + # - / - = ----- = --------------------------------- + # q s q * r (q / gcd(s, q)) * (r / gcd(p, r)) + + my $p = $n -> {_n}; + my $q = $n -> {_d}; + my $r = $d -> {_n}; + my $s = $d -> {_d}; + my $gcd_pr = $LIB -> _gcd($LIB -> _copy($p), $r); + my $gcd_sq = $LIB -> _gcd($LIB -> _copy($s), $q); + $self -> {_n} = $LIB -> _mul($LIB -> _div($LIB -> _copy($p), $gcd_pr), + $LIB -> _div($LIB -> _copy($s), $gcd_sq)); + $self -> {_d} = $LIB -> _mul($LIB -> _div($LIB -> _copy($q), $gcd_sq), + $LIB -> _div($LIB -> _copy($r), $gcd_pr)); + + return $self; # no need for $self -> bnorm() here + } + + # At this point, $n is a Math::BigRat and $d is a Math::Big(Int|Float). + + my $p = $n -> {_n}; + my $q = $n -> {_d}; + my $m = $d -> mantissa(); + my $e = $d -> exponent(); + + # / p + # | ------------ if e > 0 + # | q * m * 10^e + # | + # p | p + # - / (m * 10^e) = | ----- if e == 0 + # q | q * m + # | + # | p * 10^-e + # | -------- if e < 0 + # \ q * m + + $self -> {_n} = $LIB -> _copy($p); + $self -> {_d} = $LIB -> _mul($LIB -> _copy($q), $m); + if ($e > 0) { + $self -> {_d} = $LIB -> _lsft($self -> {_d}, $e, 10); + } elsif ($e < 0) { + $self -> {_n} = $LIB -> _lsft($self -> {_n}, -$e, 10); + } + + return $self -> bnorm(); + + } else { + + if ($d -> isa('Math::BigRat')) { + + # At this point $n is a Math::Big(Int|Float) and $d is a + # Math::BigRat. + + my $m = $n -> mantissa(); + my $e = $n -> exponent(); + my $p = $d -> {_n}; + my $q = $d -> {_d}; + + # / q * m * 10^e + # | ------------ if e > 0 + # | p + # | + # p | m * q + # (m * 10^e) / - = | ----- if e == 0 + # q | p + # | + # | q * m + # | --------- if e < 0 + # \ p * 10^-e + + $self -> {_n} = $LIB -> _mul($LIB -> _copy($q), $m); + $self -> {_d} = $LIB -> _copy($p); + if ($e > 0) { + $self -> {_n} = $LIB -> _lsft($self -> {_n}, $e, 10); + } elsif ($e < 0) { + $self -> {_d} = $LIB -> _lsft($self -> {_d}, -$e, 10); + } + return $self -> bnorm(); + + } else { + + # At this point $n and $d are both a Math::Big(Int|Float) + + my $m1 = $n -> mantissa(); + my $e1 = $n -> exponent(); + my $m2 = $d -> mantissa(); + my $e2 = $d -> exponent(); + + # / + # | m1 * 10^(e1 - e2) + # | ----------------- if e1 > e2 + # | m2 + # | + # m1 * 10^e1 | m1 + # ---------- = | -- if e1 = e2 + # m2 * 10^e2 | m2 + # | + # | m1 + # | ----------------- if e1 < e2 + # | m2 * 10^(e2 - e1) + # \ + + $self -> {_n} = $LIB -> _new($m1 -> bstr()); + $self -> {_d} = $LIB -> _new($m2 -> bstr()); + my $ediff = $e1 - $e2; + if ($ediff > 0) { + $self -> {_n} = $LIB -> _lsft($self -> {_n}, + $LIB -> _new($ediff -> bstr()), + 10); + } elsif ($ediff < 0) { + $self -> {_d} = $LIB -> _lsft($self -> {_d}, + $LIB -> _new(-$ediff -> bstr()), + 10); + } + + return $self -> bnorm(); + } + } + + return $self; +} + +sub copy { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # If called as a class method, the object to copy is the next argument. + + $self = shift() unless $selfref; + + my $copy = bless {}, $class; + + $copy->{sign} = $self->{sign}; + $copy->{_d} = $LIB->_copy($self->{_d}); + $copy->{_n} = $LIB->_copy($self->{_n}); + $copy->{_a} = $self->{_a} if defined $self->{_a}; + $copy->{_p} = $self->{_p} if defined $self->{_p}; + + #($copy, $copy->{_a}, $copy->{_p}) + # = $copy->_find_round_parameters(@_); + + return $copy; +} + +sub bnan { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self = bless {}, $class unless $selfref; + + if ($_trap_nan) { + Carp::croak ("Tried to set a variable to NaN in $class->bnan()"); + } + + $self -> {sign} = $nan; + $self -> {_n} = $LIB -> _zero(); + $self -> {_d} = $LIB -> _one(); + + ($self, $self->{_a}, $self->{_p}) + = $self->_find_round_parameters(@_); + + return $self; +} + +sub binf { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self = bless {}, $class unless $selfref; + + my $sign = shift(); + $sign = defined($sign) && substr($sign, 0, 1) eq '-' ? '-inf' : '+inf'; + + if ($_trap_inf) { + Carp::croak ("Tried to set a variable to +-inf in $class->binf()"); + } + + $self -> {sign} = $sign; + $self -> {_n} = $LIB -> _zero(); + $self -> {_d} = $LIB -> _one(); + + ($self, $self->{_a}, $self->{_p}) + = $self->_find_round_parameters(@_); + + return $self; +} + +sub bone { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self = bless {}, $class unless $selfref; + + my $sign = shift(); + $sign = '+' unless defined($sign) && $sign eq '-'; + + $self -> {sign} = $sign; + $self -> {_n} = $LIB -> _one(); + $self -> {_d} = $LIB -> _one(); + + ($self, $self->{_a}, $self->{_p}) + = $self->_find_round_parameters(@_); + + return $self; +} + +sub bzero { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = '+'; + $self -> {_n} = $LIB -> _zero(); + $self -> {_d} = $LIB -> _one(); + + ($self, $self->{_a}, $self->{_p}) + = $self->_find_round_parameters(@_); + + return $self; +} + +############################################################################## + +sub config { + # return (later set?) configuration data as hash ref + my $class = shift() || 'Math::BigRat'; + + if (@_ == 1 && ref($_[0]) ne 'HASH') { + my $cfg = $class->SUPER::config(); + return $cfg->{$_[0]}; + } + + my $cfg = $class->SUPER::config(@_); + + # now we need only to override the ones that are different from our parent + $cfg->{class} = $class; + $cfg->{with} = $LIB; + + $cfg; +} + +############################################################################## + +sub bstr { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { # inf, NaN etc + my $s = $x->{sign}; + $s =~ s/^\+//; # +inf => inf + return $s; + } + + my $s = ''; + $s = $x->{sign} if $x->{sign} ne '+'; # '+3/2' => '3/2' + + return $s . $LIB->_str($x->{_n}) if $LIB->_is_one($x->{_d}); + $s . $LIB->_str($x->{_n}) . '/' . $LIB->_str($x->{_d}); +} + +sub bsstr { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { # inf, NaN etc + my $s = $x->{sign}; + $s =~ s/^\+//; # +inf => inf + return $s; + } + + my $s = ''; + $s = $x->{sign} if $x->{sign} ne '+'; # +3 vs 3 + $s . $LIB->_str($x->{_n}) . '/' . $LIB->_str($x->{_d}); +} + +sub bnorm { + # reduce the number to the shortest form + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + # Both parts must be objects of whatever we are using today. + if (my $c = $LIB->_check($x->{_n})) { + Carp::croak("n did not pass the self-check ($c) in bnorm()"); + } + if (my $c = $LIB->_check($x->{_d})) { + Carp::croak("d did not pass the self-check ($c) in bnorm()"); + } + + # no normalize for NaN, inf etc. + return $x if $x->{sign} !~ /^[+-]$/; + + # normalize zeros to 0/1 + if ($LIB->_is_zero($x->{_n})) { + $x->{sign} = '+'; # never leave a -0 + $x->{_d} = $LIB->_one() unless $LIB->_is_one($x->{_d}); + return $x; + } + + return $x if $LIB->_is_one($x->{_d}); # no need to reduce + + # Compute the GCD. + my $gcd = $LIB->_gcd($LIB->_copy($x->{_n}), $x->{_d}); + if (!$LIB->_is_one($gcd)) { + $x->{_n} = $LIB->_div($x->{_n}, $gcd); + $x->{_d} = $LIB->_div($x->{_d}, $gcd); + } + + $x; +} + +############################################################################## +# sign manipulation + +sub bneg { + # (BRAT or num_str) return BRAT + # negate number or make a negated number from string + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x if $x->modify('bneg'); + + # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN' + $x->{sign} =~ tr/+-/-+/ + unless ($x->{sign} eq '+' && $LIB->_is_zero($x->{_n})); + $x; +} + +############################################################################## +# special values + +sub _bnan { + # used by parent class bnan() to initialize number to NaN + my $self = shift; + + if ($_trap_nan) { + my $class = ref($self); + # "$self" below will stringify the object, this blows up if $self is a + # partial object (happens under trap_nan), so fix it beforehand + $self->{_d} = $LIB->_zero() unless defined $self->{_d}; + $self->{_n} = $LIB->_zero() unless defined $self->{_n}; + Carp::croak ("Tried to set $self to NaN in $class\::_bnan()"); + } + $self->{_n} = $LIB->_zero(); + $self->{_d} = $LIB->_zero(); +} + +sub _binf { + # used by parent class bone() to initialize number to +inf/-inf + my $self = shift; + + if ($_trap_inf) { + my $class = ref($self); + # "$self" below will stringify the object, this blows up if $self is a + # partial object (happens under trap_nan), so fix it beforehand + $self->{_d} = $LIB->_zero() unless defined $self->{_d}; + $self->{_n} = $LIB->_zero() unless defined $self->{_n}; + Carp::croak ("Tried to set $self to inf in $class\::_binf()"); + } + $self->{_n} = $LIB->_zero(); + $self->{_d} = $LIB->_zero(); +} + +sub _bone { + # used by parent class bone() to initialize number to +1/-1 + my $self = shift; + $self->{_n} = $LIB->_one(); + $self->{_d} = $LIB->_one(); +} + +sub _bzero { + # used by parent class bzero() to initialize number to 0 + my $self = shift; + $self->{_n} = $LIB->_zero(); + $self->{_d} = $LIB->_one(); +} + +############################################################################## +# mul/add/div etc + +sub badd { + # add two rational numbers + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + # +inf + +inf => +inf, -inf + -inf => -inf + return $x->binf(substr($x->{sign}, 0, 1)) + if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/; + + # +inf + -inf or -inf + +inf => NaN + return $x->bnan() if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/); + + # 1 1 gcd(3, 4) = 1 1*3 + 1*4 7 + # - + - = --------- = -- + # 4 3 4*3 12 + + # we do not compute the gcd() here, but simple do: + # 5 7 5*3 + 7*4 43 + # - + - = --------- = -- + # 4 3 4*3 12 + + # and bnorm() will then take care of the rest + + # 5 * 3 + $x->{_n} = $LIB->_mul($x->{_n}, $y->{_d}); + + # 7 * 4 + my $m = $LIB->_mul($LIB->_copy($y->{_n}), $x->{_d}); + + # 5 * 3 + 7 * 4 + ($x->{_n}, $x->{sign}) = _e_add($x->{_n}, $m, $x->{sign}, $y->{sign}); + + # 4 * 3 + $x->{_d} = $LIB->_mul($x->{_d}, $y->{_d}); + + # normalize result, and possible round + $x->bnorm()->round(@r); +} + +sub bsub { + # subtract two rational numbers + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + # flip sign of $x, call badd(), then flip sign of result + $x->{sign} =~ tr/+-/-+/ + unless $x->{sign} eq '+' && $LIB->_is_zero($x->{_n}); # not -0 + $x->badd($y, @r); # does norm and round + $x->{sign} =~ tr/+-/-+/ + unless $x->{sign} eq '+' && $LIB->_is_zero($x->{_n}); # not -0 + + $x; +} + +sub bmul { + # multiply two rational numbers + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x->bnan() if $x->{sign} eq 'NaN' || $y->{sign} eq 'NaN'; + + # inf handling + if ($x->{sign} =~ /^[+-]inf$/ || $y->{sign} =~ /^[+-]inf$/) { + return $x->bnan() if $x->is_zero() || $y->is_zero(); + # result will always be +-inf: + # +inf * +/+inf => +inf, -inf * -/-inf => +inf + # +inf * -/-inf => -inf, -inf * +/+inf => -inf + return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); + return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); + return $x->binf('-'); + } + + # x == 0 # also: or y == 1 or y == -1 + return wantarray ? ($x, $class->bzero()) : $x if $x -> is_zero(); + + if ($y -> is_zero()) { + $x -> bzero(); + return wantarray ? ($x, $class->bzero()) : $x; + } + + # According to Knuth, this can be optimized by doing gcd twice (for d + # and n) and reducing in one step. This saves us a bnorm() at the end. + # + # p s p * s (p / gcd(p, r)) * (s / gcd(s, q)) + # - * - = ----- = --------------------------------- + # q r q * r (q / gcd(s, q)) * (r / gcd(p, r)) + + my $gcd_pr = $LIB -> _gcd($LIB -> _copy($x->{_n}), $y->{_d}); + my $gcd_sq = $LIB -> _gcd($LIB -> _copy($y->{_n}), $x->{_d}); + + $x->{_n} = $LIB -> _mul(scalar $LIB -> _div($x->{_n}, $gcd_pr), + scalar $LIB -> _div($LIB -> _copy($y->{_n}), + $gcd_sq)); + $x->{_d} = $LIB -> _mul(scalar $LIB -> _div($x->{_d}, $gcd_sq), + scalar $LIB -> _div($LIB -> _copy($y->{_d}), + $gcd_pr)); + + # compute new sign + $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; + + $x->round(@r); +} + +sub bdiv { + # (dividend: BRAT or num_str, divisor: BRAT or num_str) return + # (BRAT, BRAT) (quo, rem) or BRAT (only rem) + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bdiv'); + + my $wantarray = wantarray; # call only once + + # At least one argument is NaN. This is handled the same way as in + # Math::BigInt -> bdiv(). See the comments in the code implementing that + # method. + + if ($x -> is_nan() || $y -> is_nan()) { + return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan(); + } + + # Divide by zero and modulo zero. This is handled the same way as in + # Math::BigInt -> bdiv(). See the comments in the code implementing that + # method. + + if ($y -> is_zero()) { + my ($quo, $rem); + if ($wantarray) { + $rem = $x -> copy(); + } + if ($x -> is_zero()) { + $quo = $x -> bnan(); + } else { + $quo = $x -> binf($x -> {sign}); + } + return $wantarray ? ($quo, $rem) : $quo; + } + + # Numerator (dividend) is +/-inf. This is handled the same way as in + # Math::BigInt -> bdiv(). See the comments in the code implementing that + # method. + + if ($x -> is_inf()) { + my ($quo, $rem); + $rem = $class -> bnan() if $wantarray; + if ($y -> is_inf()) { + $quo = $x -> bnan(); + } else { + my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-'; + $quo = $x -> binf($sign); + } + return $wantarray ? ($quo, $rem) : $quo; + } + + # Denominator (divisor) is +/-inf. This is handled the same way as in + # Math::BigFloat -> bdiv(). See the comments in the code implementing that + # method. + + if ($y -> is_inf()) { + my ($quo, $rem); + if ($wantarray) { + if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) { + $rem = $x -> copy(); + $quo = $x -> bzero(); + } else { + $rem = $class -> binf($y -> {sign}); + $quo = $x -> bone('-'); + } + return ($quo, $rem); + } else { + if ($y -> is_inf()) { + if ($x -> is_nan() || $x -> is_inf()) { + return $x -> bnan(); + } else { + return $x -> bzero(); + } + } + } + } + + # At this point, both the numerator and denominator are finite numbers, and + # the denominator (divisor) is non-zero. + + # x == 0? + return wantarray ? ($x, $class->bzero()) : $x if $x->is_zero(); + + # XXX TODO: list context, upgrade + # According to Knuth, this can be optimized by doing gcd twice (for d and n) + # and reducing in one step. This would save us the bnorm() at the end. + # + # p r p * s (p / gcd(p, r)) * (s / gcd(s, q)) + # - / - = ----- = --------------------------------- + # q s q * r (q / gcd(s, q)) * (r / gcd(p, r)) + + $x->{_n} = $LIB->_mul($x->{_n}, $y->{_d}); + $x->{_d} = $LIB->_mul($x->{_d}, $y->{_n}); + + # compute new sign + $x->{sign} = $x->{sign} eq $y->{sign} ? '+' : '-'; + + $x -> bnorm(); + if (wantarray) { + my $rem = $x -> copy(); + $x -> bfloor(); + $x -> round(@r); + $rem -> bsub($x -> copy()) -> bmul($y); + return $x, $rem; + } else { + $x -> round(@r); + return $x; + } +} + +sub bmod { + # compute "remainder" (in Perl way) of $x / $y + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bmod'); + + # At least one argument is NaN. This is handled the same way as in + # Math::BigInt -> bmod(). + + if ($x -> is_nan() || $y -> is_nan()) { + return $x -> bnan(); + } + + # Modulo zero. This is handled the same way as in Math::BigInt -> bmod(). + + if ($y -> is_zero()) { + return $x; + } + + # Numerator (dividend) is +/-inf. This is handled the same way as in + # Math::BigInt -> bmod(). + + if ($x -> is_inf()) { + return $x -> bnan(); + } + + # Denominator (divisor) is +/-inf. This is handled the same way as in + # Math::BigInt -> bmod(). + + if ($y -> is_inf()) { + if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) { + return $x; + } else { + return $x -> binf($y -> sign()); + } + } + + # At this point, both the numerator and denominator are finite numbers, and + # the denominator (divisor) is non-zero. + + return $x if $x->is_zero(); # 0 / 7 = 0, mod 0 + + # Compute $x - $y * floor($x/$y). This can probably be optimized by working + # on a lower level. + + $x -> bsub($x -> copy() -> bdiv($y) -> bfloor() -> bmul($y)); + return $x -> round(@r); +} + +############################################################################## +# bdec/binc + +sub bdec { + # decrement value (subtract 1) + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf, -inf + + if ($x->{sign} eq '-') { + $x->{_n} = $LIB->_add($x->{_n}, $x->{_d}); # -5/2 => -7/2 + } else { + if ($LIB->_acmp($x->{_n}, $x->{_d}) < 0) # n < d? + { + # 1/3 -- => -2/3 + $x->{_n} = $LIB->_sub($LIB->_copy($x->{_d}), $x->{_n}); + $x->{sign} = '-'; + } else { + $x->{_n} = $LIB->_sub($x->{_n}, $x->{_d}); # 5/2 => 3/2 + } + } + $x->bnorm()->round(@r); +} + +sub binc { + # increment value (add 1) + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->{sign} !~ /^[+-]$/; # NaN, inf, -inf + + if ($x->{sign} eq '-') { + if ($LIB->_acmp($x->{_n}, $x->{_d}) < 0) { + # -1/3 ++ => 2/3 (overflow at 0) + $x->{_n} = $LIB->_sub($LIB->_copy($x->{_d}), $x->{_n}); + $x->{sign} = '+'; + } else { + $x->{_n} = $LIB->_sub($x->{_n}, $x->{_d}); # -5/2 => -3/2 + } + } else { + $x->{_n} = $LIB->_add($x->{_n}, $x->{_d}); # 5/2 => 7/2 + } + $x->bnorm()->round(@r); +} + +############################################################################## +# is_foo methods (the rest is inherited) + +sub is_int { + # return true if arg (BRAT or num_str) is an integer + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't + $LIB->_is_one($x->{_d}); # x/y && y != 1 => no integer + 0; +} + +sub is_zero { + # return true if arg (BRAT or num_str) is zero + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 1 if $x->{sign} eq '+' && $LIB->_is_zero($x->{_n}); + 0; +} + +sub is_one { + # return true if arg (BRAT or num_str) is +1 or -1 if signis given + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + my $sign = $_[2] || ''; $sign = '+' if $sign ne '-'; + return 1 + if ($x->{sign} eq $sign && $LIB->_is_one($x->{_n}) && $LIB->_is_one($x->{_d})); + 0; +} + +sub is_odd { + # return true if arg (BFLOAT or num_str) is odd or false if even + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 1 if ($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't + ($LIB->_is_one($x->{_d}) && $LIB->_is_odd($x->{_n})); # x/2 is not, but 3/1 + 0; +} + +sub is_even { + # return true if arg (BINT or num_str) is even or false if odd + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return 0 if $x->{sign} !~ /^[+-]$/; # NaN & +-inf aren't + return 1 if ($LIB->_is_one($x->{_d}) # x/3 is never + && $LIB->_is_even($x->{_n})); # but 4/1 is + 0; +} + +############################################################################## +# parts() and friends + +sub numerator { + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + # NaN, inf, -inf + return Math::BigInt->new($x->{sign}) if ($x->{sign} !~ /^[+-]$/); + + my $n = Math::BigInt->new($LIB->_str($x->{_n})); + $n->{sign} = $x->{sign}; + $n; +} + +sub denominator { + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + # NaN + return Math::BigInt->new($x->{sign}) if $x->{sign} eq 'NaN'; + # inf, -inf + return Math::BigInt->bone() if $x->{sign} !~ /^[+-]$/; + + Math::BigInt->new($LIB->_str($x->{_d})); +} + +sub parts { + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + my $c = 'Math::BigInt'; + + return ($c->bnan(), $c->bnan()) if $x->{sign} eq 'NaN'; + return ($c->binf(), $c->binf()) if $x->{sign} eq '+inf'; + return ($c->binf('-'), $c->binf()) if $x->{sign} eq '-inf'; + + my $n = $c->new($LIB->_str($x->{_n})); + $n->{sign} = $x->{sign}; + my $d = $c->new($LIB->_str($x->{_d})); + ($n, $d); +} + +sub length { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $nan unless $x->is_int(); + $LIB->_len($x->{_n}); # length(-123/1) => length(123) +} + +sub digit { + my ($class, $x, $n) = ref($_[0]) ? (undef, $_[0], $_[1]) : objectify(1, @_); + + return $nan unless $x->is_int(); + $LIB->_digit($x->{_n}, $n || 0); # digit(-123/1, 2) => digit(123, 2) +} + +############################################################################## +# special calc routines + +sub bceil { + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x if ($x->{sign} !~ /^[+-]$/ || # not for NaN, inf + $LIB->_is_one($x->{_d})); # 22/1 => 22, 0/1 => 0 + + $x->{_n} = $LIB->_div($x->{_n}, $x->{_d}); # 22/7 => 3/1 w/ truncate + $x->{_d} = $LIB->_one(); # d => 1 + $x->{_n} = $LIB->_inc($x->{_n}) if $x->{sign} eq '+'; # +22/7 => 4/1 + $x->{sign} = '+' if $x->{sign} eq '-' && $LIB->_is_zero($x->{_n}); # -0 => 0 + $x; +} + +sub bfloor { + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x if ($x->{sign} !~ /^[+-]$/ || # not for NaN, inf + $LIB->_is_one($x->{_d})); # 22/1 => 22, 0/1 => 0 + + $x->{_n} = $LIB->_div($x->{_n}, $x->{_d}); # 22/7 => 3/1 w/ truncate + $x->{_d} = $LIB->_one(); # d => 1 + $x->{_n} = $LIB->_inc($x->{_n}) if $x->{sign} eq '-'; # -22/7 => -4/1 + $x; +} + +sub bint { + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x if ($x->{sign} !~ /^[+-]$/ || # +/-inf or NaN + $LIB -> _is_one($x->{_d})); # already an integer + + $x->{_n} = $LIB->_div($x->{_n}, $x->{_d}); # 22/7 => 3/1 w/ truncate + $x->{_d} = $LIB->_one(); # d => 1 + $x->{sign} = '+' if $x->{sign} eq '-' && $LIB -> _is_zero($x->{_n}); + return $x; +} + +sub bfac { + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + # if $x is not an integer + if (($x->{sign} ne '+') || (!$LIB->_is_one($x->{_d}))) { + return $x->bnan(); + } + + $x->{_n} = $LIB->_fac($x->{_n}); + # since _d is 1, we don't need to reduce/norm the result + $x->round(@r); +} + +sub bpow { + # power ($x ** $y) + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->{sign} =~ /^[+-]inf$/; # -inf/+inf ** x + return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan; + return $x->bone(@r) if $y->is_zero(); + return $x->round(@r) if $x->is_one() || $y->is_one(); + + if ($x->{sign} eq '-' && $LIB->_is_one($x->{_n}) && $LIB->_is_one($x->{_d})) { + # if $x == -1 and odd/even y => +1/-1 + return $y->is_odd() ? $x->round(@r) : $x->babs()->round(@r); + # my Casio FX-5500L has a bug here: -1 ** 2 is -1, but -1 * -1 is 1; + } + # 1 ** -y => 1 / (1 ** |y|) + # so do test for negative $y after above's clause + + return $x->round(@r) if $x->is_zero(); # 0**y => 0 (if not y <= 0) + + # shortcut if y == 1/N (is then sqrt() respective broot()) + if ($LIB->_is_one($y->{_n})) { + return $x->bsqrt(@r) if $LIB->_is_two($y->{_d}); # 1/2 => sqrt + return $x->broot($LIB->_str($y->{_d}), @r); # 1/N => root(N) + } + + # shortcut y/1 (and/or x/1) + if ($LIB->_is_one($y->{_d})) { + # shortcut for x/1 and y/1 + if ($LIB->_is_one($x->{_d})) { + $x->{_n} = $LIB->_pow($x->{_n}, $y->{_n}); # x/1 ** y/1 => (x ** y)/1 + if ($y->{sign} eq '-') { + # 0.2 ** -3 => 1/(0.2 ** 3) + ($x->{_n}, $x->{_d}) = ($x->{_d}, $x->{_n}); # swap + } + # correct sign; + ** + => + + if ($x->{sign} eq '-') { + # - * - => +, - * - * - => - + $x->{sign} = '+' if $x->{sign} eq '-' && $LIB->_is_even($y->{_n}); + } + return $x->round(@r); + } + + # x/z ** y/1 + $x->{_n} = $LIB->_pow($x->{_n}, $y->{_n}); # 5/2 ** y/1 => 5 ** y / 2 ** y + $x->{_d} = $LIB->_pow($x->{_d}, $y->{_n}); + if ($y->{sign} eq '-') { + # 0.2 ** -3 => 1/(0.2 ** 3) + ($x->{_n}, $x->{_d}) = ($x->{_d}, $x->{_n}); # swap + } + # correct sign; + ** + => + + + $x->{sign} = '+' if $x->{sign} eq '-' && $LIB->_is_even($y->{_n}); + return $x->round(@r); + } + + # print STDERR "# $x $y\n"; + + # otherwise: + + # n/d n ______________ + # a/b = -\/ (a/b) ** d + + # (a/b) ** n == (a ** n) / (b ** n) + $LIB->_pow($x->{_n}, $y->{_n}); + $LIB->_pow($x->{_d}, $y->{_n}); + + return $x->broot($LIB->_str($y->{_d}), @r); # n/d => root(n) +} + +sub blog { + # Return the logarithm of the operand. If a second operand is defined, that + # value is used as the base, otherwise the base is assumed to be Euler's + # constant. + + my ($class, $x, $base, @r); + + # Don't objectify the base, since an undefined base, as in $x->blog() or + # $x->blog(undef) signals that the base is Euler's number. + + if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) { + # E.g., Math::BigFloat->blog(256, 2) + ($class, $x, $base, @r) = + defined $_[2] ? objectify(2, @_) : objectify(1, @_); + } else { + # E.g., Math::BigFloat::blog(256, 2) or $x->blog(2) + ($class, $x, $base, @r) = + defined $_[1] ? objectify(2, @_) : objectify(1, @_); + } + + return $x if $x->modify('blog'); + + # Handle all exception cases and all trivial cases. I have used Wolfram Alpha + # (http://www.wolframalpha.com) as the reference for these cases. + + return $x -> bnan() if $x -> is_nan(); + + if (defined $base) { + $base = $class -> new($base) unless ref $base; + if ($base -> is_nan() || $base -> is_one()) { + return $x -> bnan(); + } elsif ($base -> is_inf() || $base -> is_zero()) { + return $x -> bnan() if $x -> is_inf() || $x -> is_zero(); + return $x -> bzero(); + } elsif ($base -> is_negative()) { # -inf < base < 0 + return $x -> bzero() if $x -> is_one(); # x = 1 + return $x -> bone() if $x == $base; # x = base + return $x -> bnan(); # otherwise + } + return $x -> bone() if $x == $base; # 0 < base && 0 < x < inf + } + + # We now know that the base is either undefined or positive and finite. + + if ($x -> is_inf()) { # x = +/-inf + my $sign = defined $base && $base < 1 ? '-' : '+'; + return $x -> binf($sign); + } elsif ($x -> is_neg()) { # -inf < x < 0 + return $x -> bnan(); + } elsif ($x -> is_one()) { # x = 1 + return $x -> bzero(); + } elsif ($x -> is_zero()) { # x = 0 + my $sign = defined $base && $base < 1 ? '+' : '-'; + return $x -> binf($sign); + } + + # At this point we are done handling all exception cases and trivial cases. + + $base = Math::BigFloat -> new($base) if defined $base; + + my $xn = Math::BigFloat -> new($LIB -> _str($x->{_n})); + my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d})); + + my $xtmp = Math::BigRat -> new($xn -> bdiv($xd) -> blog($base, @r) -> bsstr()); + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + return $x; +} + +sub bexp { + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(1, @_); + } + + return $x->binf(@r) if $x->{sign} eq '+inf'; + return $x->bzero(@r) if $x->{sign} eq '-inf'; + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my ($scale, @params); + ($x, @params) = $x->_find_round_parameters(@r); + + # also takes care of the "error in _find_round_parameters?" case + return $x if $x->{sign} eq 'NaN'; + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # P = undef + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r[2]; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it's not enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + return $x->bone(@params) if $x->is_zero(); + + # See the comments in Math::BigFloat on how this algorithm works. + # Basically we calculate A and B (where B is faculty(N)) so that A/B = e + + my $x_org = $x->copy(); + if ($scale <= 75) { + # set $x directly from a cached string form + $x->{_n} = + $LIB->_new("90933395208605785401971970164779391644753259799242"); + $x->{_d} = + $LIB->_new("33452526613163807108170062053440751665152000000000"); + $x->{sign} = '+'; + } else { + # compute A and B so that e = A / B. + + # After some terms we end up with this, so we use it as a starting point: + my $A = $LIB->_new("90933395208605785401971970164779391644753259799242"); + my $F = $LIB->_new(42); my $step = 42; + + # Compute how many steps we need to take to get $A and $B sufficiently big + my $steps = Math::BigFloat::_len_to_steps($scale - 4); + # print STDERR "# Doing $steps steps for ", $scale-4, " digits\n"; + while ($step++ <= $steps) { + # calculate $a * $f + 1 + $A = $LIB->_mul($A, $F); + $A = $LIB->_inc($A); + # increment f + $F = $LIB->_inc($F); + } + # compute $B as factorial of $steps (this is faster than doing it manually) + my $B = $LIB->_fac($LIB->_new($steps)); + + # print "A ", $LIB->_str($A), "\nB ", $LIB->_str($B), "\n"; + + $x->{_n} = $A; + $x->{_d} = $B; + $x->{sign} = '+'; + } + + # $x contains now an estimate of e, with some surplus digits, so we can round + if (!$x_org->is_one()) { + # raise $x to the wanted power and round it in one step: + $x->bpow($x_org, @params); + } else { + # else just round the already computed result + delete $x->{_a}; delete $x->{_p}; + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; delete $x->{_p}; + } + + $x; +} + +sub bnok { + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + my $xint = Math::BigInt -> new($x -> bint() -> bsstr()); + my $yint = Math::BigInt -> new($y -> bint() -> bsstr()); + $xint -> bnok($yint); + + $x -> {sign} = $xint -> {sign}; + $x -> {_n} = $xint -> {_n}; + $x -> {_d} = $xint -> {_d}; + + return $x; +} + +sub broot { + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + # Convert $x into a Math::BigFloat. + + my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d})); + my $xflt = Math::BigFloat -> new($LIB -> _str($x->{_n})) -> bdiv($xd); + $xflt -> {sign} = $x -> {sign}; + + # Convert $y into a Math::BigFloat. + + my $yd = Math::BigFloat -> new($LIB -> _str($y->{_d})); + my $yflt = Math::BigFloat -> new($LIB -> _str($y->{_n})) -> bdiv($yd); + $yflt -> {sign} = $y -> {sign}; + + # Compute the root and convert back to a Math::BigRat. + + $xflt -> broot($yflt, @r); + my $xtmp = Math::BigRat -> new($xflt -> bsstr()); + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + return $x; +} + +sub bmodpow { + # set up parameters + my ($class, $x, $y, $m, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $m, @r) = objectify(3, @_); + } + + # Convert $x, $y, and $m into Math::BigInt objects. + + my $xint = Math::BigInt -> new($x -> copy() -> bint()); + my $yint = Math::BigInt -> new($y -> copy() -> bint()); + my $mint = Math::BigInt -> new($m -> copy() -> bint()); + + $xint -> bmodpow($y, $m, @r); + my $xtmp = Math::BigRat -> new($xint -> bsstr()); + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + return $x; +} + +sub bmodinv { + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + # Convert $x and $y into Math::BigInt objects. + + my $xint = Math::BigInt -> new($x -> copy() -> bint()); + my $yint = Math::BigInt -> new($y -> copy() -> bint()); + + $xint -> bmodinv($y, @r); + my $xtmp = Math::BigRat -> new($xint -> bsstr()); + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + return $x; +} + +sub bsqrt { + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x->bnan() if $x->{sign} !~ /^[+]/; # NaN, -inf or < 0 + return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf + return $x->round(@r) if $x->is_zero() || $x->is_one(); + + local $Math::BigFloat::upgrade = undef; + local $Math::BigFloat::downgrade = undef; + local $Math::BigFloat::precision = undef; + local $Math::BigFloat::accuracy = undef; + local $Math::BigInt::upgrade = undef; + local $Math::BigInt::precision = undef; + local $Math::BigInt::accuracy = undef; + + my $xn = Math::BigFloat -> new($LIB -> _str($x->{_n})); + my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d})); + + my $xtmp = Math::BigRat -> new($xn -> bdiv($xd) -> bsqrt() -> bsstr()); + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + $x->round(@r); +} + +sub blsft { + my ($class, $x, $y, $b, @r) = objectify(2, @_); + + $b = 2 if !defined $b; + $b = $class -> new($b) unless ref($b) && $b -> isa($class); + + return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan(); + + # shift by a negative amount? + return $x -> brsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/; + + $x -> bmul($b -> bpow($y)); +} + +sub brsft { + my ($class, $x, $y, $b, @r) = objectify(2, @_); + + $b = 2 if !defined $b; + $b = $class -> new($b) unless ref($b) && $b -> isa($class); + + return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan(); + + # shift by a negative amount? + return $x -> blsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/; + + # the following call to bdiv() will return either quotient (scalar context) + # or quotient and remainder (list context). + $x -> bdiv($b -> bpow($y)); +} + +sub band { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'band() is an instance method, not a class method' unless $xref; + Carp::croak 'Not enough arguments for band()' if @_ < 1; + + my $y = shift; + $y = $class -> new($y) unless ref($y); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> band($y); + $xtmp = $class -> new($xtmp); # back to Math::BigRat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + return $x -> round(@r); +} + +sub bior { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'bior() is an instance method, not a class method' unless $xref; + Carp::croak 'Not enough arguments for bior()' if @_ < 1; + + my $y = shift; + $y = $class -> new($y) unless ref($y); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> bior($y); + $xtmp = $class -> new($xtmp); # back to Math::BigRat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + return $x -> round(@r); +} + +sub bxor { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'bxor() is an instance method, not a class method' unless $xref; + Carp::croak 'Not enough arguments for bxor()' if @_ < 1; + + my $y = shift; + $y = $class -> new($y) unless ref($y); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> bxor($y); + $xtmp = $class -> new($xtmp); # back to Math::BigRat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + return $x -> round(@r); +} + +sub bnot { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'bnot() is an instance method, not a class method' unless $xref; + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> bnot(); + $xtmp = $class -> new($xtmp); # back to Math::BigRat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_n} = $xtmp -> {_n}; + $x -> {_d} = $xtmp -> {_d}; + + return $x -> round(@r); +} + +############################################################################## +# round + +sub round { + $_[0]; +} + +sub bround { + $_[0]; +} + +sub bfround { + $_[0]; +} + +############################################################################## +# comparing + +sub bcmp { + # compare two signed numbers + + # set up parameters + my ($class, $x, $y) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y) = objectify(2, @_); + } + + if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) { + # $x is NaN and/or $y is NaN + return undef if $x->{sign} eq $nan || $y->{sign} eq $nan; + # $x and $y are both either +inf or -inf + return 0 if $x->{sign} eq $y->{sign} && $x->{sign} =~ /^[+-]inf$/; + # $x = +inf and $y < +inf + return +1 if $x->{sign} eq '+inf'; + # $x = -inf and $y > -inf + return -1 if $x->{sign} eq '-inf'; + # $x < +inf and $y = +inf + return -1 if $y->{sign} eq '+inf'; + # $x > -inf and $y = -inf + return +1; + } + + # $x >= 0 and $y < 0 + return 1 if $x->{sign} eq '+' && $y->{sign} eq '-'; + # $x < 0 and $y >= 0 + return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; + + # At this point, we know that $x and $y have the same sign. + + # shortcut + my $xz = $LIB->_is_zero($x->{_n}); + my $yz = $LIB->_is_zero($y->{_n}); + return 0 if $xz && $yz; # 0 <=> 0 + return -1 if $xz && $y->{sign} eq '+'; # 0 <=> +y + return 1 if $yz && $x->{sign} eq '+'; # +x <=> 0 + + my $t = $LIB->_mul($LIB->_copy($x->{_n}), $y->{_d}); + my $u = $LIB->_mul($LIB->_copy($y->{_n}), $x->{_d}); + + my $cmp = $LIB->_acmp($t, $u); # signs are equal + $cmp = -$cmp if $x->{sign} eq '-'; # both are '-' => reverse + $cmp; +} + +sub bacmp { + # compare two numbers (as unsigned) + + # set up parameters + my ($class, $x, $y) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y) = objectify(2, @_); + } + + if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) { + # handle +-inf and NaN + return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + return 0 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} =~ /^[+-]inf$/; + return 1 if $x->{sign} =~ /^[+-]inf$/ && $y->{sign} !~ /^[+-]inf$/; + return -1; + } + + my $t = $LIB->_mul($LIB->_copy($x->{_n}), $y->{_d}); + my $u = $LIB->_mul($LIB->_copy($y->{_n}), $x->{_d}); + $LIB->_acmp($t, $u); # ignore signs +} + +sub beq { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'beq() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for beq()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && ! $cmp; +} + +sub bne { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'bne() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for bne()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && ! $cmp ? '' : 1; +} + +sub blt { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'blt() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for blt()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp < 0; +} + +sub ble { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'ble() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for ble()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp <= 0; +} + +sub bgt { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'bgt() is an instance method, not a class method' unless $selfref; + Carp::croak 'Wrong number of arguments for bgt()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp > 0; +} + +sub bge { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + Carp::croak 'bge() is an instance method, not a class method' + unless $selfref; + Carp::croak 'Wrong number of arguments for bge()' unless @_ == 1; + + my $cmp = $self -> bcmp(shift); + return defined($cmp) && $cmp >= 0; +} + +############################################################################## +# output conversion + +sub numify { + # convert 17/8 => float (aka 2.125) + my ($self, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + # Non-finite number. + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; + + # Finite number. + + my $abs = $LIB->_is_one($x->{_d}) + ? $LIB->_num($x->{_n}) + : Math::BigFloat -> new($LIB->_str($x->{_n})) + -> bdiv($LIB->_str($x->{_d})) + -> bstr(); + return $x->{sign} eq '-' ? 0 - $abs : 0 + $abs; +} + +sub as_number { + my ($self, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + # NaN, inf etc + return Math::BigInt->new($x->{sign}) if $x->{sign} !~ /^[+-]$/; + + my $u = Math::BigInt->bzero(); + $u->{value} = $LIB->_div($LIB->_copy($x->{_n}), $x->{_d}); # 22/7 => 3 + $u->bneg if $x->{sign} eq '-'; # no negative zero + $u; +} + +sub as_float { + # return N/D as Math::BigFloat + + # set up parameters + my ($class, $x, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + ($class, $x, @r) = objectify(1, @_) unless ref $_[0]; + + # NaN, inf etc + return Math::BigFloat->new($x->{sign}) if $x->{sign} !~ /^[+-]$/; + + my $xd = Math::BigFloat -> new($LIB -> _str($x->{_d})); + my $xflt = Math::BigFloat -> new($LIB -> _str($x->{_n})); + $xflt -> {sign} = $x -> {sign}; + $xflt -> bdiv($xd, @r); + + return $xflt; +} + +sub as_bin { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x unless $x->is_int(); + + my $s = $x->{sign}; + $s = '' if $s eq '+'; + $s . $LIB->_as_bin($x->{_n}); +} + +sub as_hex { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x unless $x->is_int(); + + my $s = $x->{sign}; $s = '' if $s eq '+'; + $s . $LIB->_as_hex($x->{_n}); +} + +sub as_oct { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x unless $x->is_int(); + + my $s = $x->{sign}; $s = '' if $s eq '+'; + $s . $LIB->_as_oct($x->{_n}); +} + +############################################################################## + +sub from_hex { + my $class = shift; + + $class->new(@_); +} + +sub from_bin { + my $class = shift; + + $class->new(@_); +} + +sub from_oct { + my $class = shift; + + my @parts; + for my $c (@_) { + push @parts, Math::BigInt->from_oct($c); + } + $class->new (@parts); +} + +############################################################################## +# import + +sub import { + my $class = shift; + my $l = scalar @_; + my $lib = ''; my @a; + my $try = 'try'; + + for (my $i = 0; $i < $l ; $i++) { + if ($_[$i] eq ':constant') { + # this rest causes overlord er load to step in + overload::constant float => sub { $class->new(shift); }; + } + # elsif ($_[$i] eq 'upgrade') + # { + # # this causes upgrading + # $upgrade = $_[$i+1]; # or undef to disable + # $i++; + # } + elsif ($_[$i] eq 'downgrade') { + # this causes downgrading + $downgrade = $_[$i+1]; # or undef to disable + $i++; + } elsif ($_[$i] =~ /^(lib|try|only)\z/) { + $lib = $_[$i+1] || ''; # default Calc + $try = $1; # lib, try or only + $i++; + } elsif ($_[$i] eq 'with') { + # this argument is no longer used + #$LIB = $_[$i+1] || 'Math::BigInt::Calc'; # default Math::BigInt::Calc + $i++; + } else { + push @a, $_[$i]; + } + } + require Math::BigInt; + + # let use Math::BigInt lib => 'GMP'; use Math::BigRat; still have GMP + if ($lib ne '') { + my @c = split /\s*,\s*/, $lib; + foreach (@c) { + $_ =~ tr/a-zA-Z0-9://cd; # limit to sane characters + } + $lib = join(",", @c); + } + my @import = ('objectify'); + push @import, $try => $lib if $lib ne ''; + + # LIB already loaded, so feed it our lib arguments + Math::BigInt->import(@import); + + $LIB = Math::BigFloat->config()->{lib}; + + # register us with LIB to get notified of future lib changes + Math::BigInt::_register_callback($class, sub { $LIB = $_[0]; }); + + # any non :constant stuff is handled by our parent, Exporter (loaded + # by Math::BigFloat, even if @_ is empty, to give it a chance + $class->SUPER::import(@a); # for subclasses + $class->export_to_level(1, $class, @a); # need this, too +} + +1; + +__END__ + +package Math::BigFloat; + +# +# Mike grinned. 'Two down, infinity to go' - Mike Nostrus in 'Before and After' +# + +# The following hash values are used internally: +# sign : "+", "-", "+inf", "-inf", or "NaN" if not a number +# _m : mantissa ($CALC object) +# _es : sign of _e +# _e : exponent ($CALC object) +# _a : accuracy +# _p : precision + +use 5.006001; +use strict; +use warnings; + +use Carp (); +use Math::BigInt (); + +our $VERSION = '1.999811'; + +require Exporter; +our @ISA = qw/Math::BigInt/; +our @EXPORT_OK = qw/bpi/; + +# $_trap_inf/$_trap_nan are internal and should never be accessed from outside +our ($AUTOLOAD, $accuracy, $precision, $div_scale, $round_mode, $rnd_mode, + $upgrade, $downgrade, $_trap_nan, $_trap_inf); + +my $class = "Math::BigFloat"; + +use overload + + # overload key: with_assign + + '+' => sub { $_[0] -> copy() -> badd($_[1]); }, + + '-' => sub { my $c = $_[0] -> copy(); + $_[2] ? $c -> bneg() -> badd($_[1]) + : $c -> bsub($_[1]); }, + + '*' => sub { $_[0] -> copy() -> bmul($_[1]); }, + + '/' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bdiv($_[0]) + : $_[0] -> copy() -> bdiv($_[1]); }, + + '%' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bmod($_[0]) + : $_[0] -> copy() -> bmod($_[1]); }, + + '**' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bpow($_[0]) + : $_[0] -> copy() -> bpow($_[1]); }, + + '<<' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> blsft($_[0]) + : $_[0] -> copy() -> blsft($_[1]); }, + + '>>' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> brsft($_[0]) + : $_[0] -> copy() -> brsft($_[1]); }, + + # overload key: assign + + '+=' => sub { $_[0]->badd($_[1]); }, + + '-=' => sub { $_[0]->bsub($_[1]); }, + + '*=' => sub { $_[0]->bmul($_[1]); }, + + '/=' => sub { scalar $_[0]->bdiv($_[1]); }, + + '%=' => sub { $_[0]->bmod($_[1]); }, + + '**=' => sub { $_[0]->bpow($_[1]); }, + + + '<<=' => sub { $_[0]->blsft($_[1]); }, + + '>>=' => sub { $_[0]->brsft($_[1]); }, + +# 'x=' => sub { }, + +# '.=' => sub { }, + + # overload key: num_comparison + + '<' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> blt($_[0]) + : $_[0] -> blt($_[1]); }, + + '<=' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> ble($_[0]) + : $_[0] -> ble($_[1]); }, + + '>' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bgt($_[0]) + : $_[0] -> bgt($_[1]); }, + + '>=' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bge($_[0]) + : $_[0] -> bge($_[1]); }, + + '==' => sub { $_[0] -> beq($_[1]); }, + + '!=' => sub { $_[0] -> bne($_[1]); }, + + # overload key: 3way_comparison + + '<=>' => sub { my $cmp = $_[0] -> bcmp($_[1]); + defined($cmp) && $_[2] ? -$cmp : $cmp; }, + + 'cmp' => sub { $_[2] ? "$_[1]" cmp $_[0] -> bstr() + : $_[0] -> bstr() cmp "$_[1]"; }, + + # overload key: str_comparison + +# 'lt' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrlt($_[0]) +# : $_[0] -> bstrlt($_[1]); }, +# +# 'le' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrle($_[0]) +# : $_[0] -> bstrle($_[1]); }, +# +# 'gt' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrgt($_[0]) +# : $_[0] -> bstrgt($_[1]); }, +# +# 'ge' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bstrge($_[0]) +# : $_[0] -> bstrge($_[1]); }, +# +# 'eq' => sub { $_[0] -> bstreq($_[1]); }, +# +# 'ne' => sub { $_[0] -> bstrne($_[1]); }, + + # overload key: binary + + '&' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> band($_[0]) + : $_[0] -> copy() -> band($_[1]); }, + + '&=' => sub { $_[0] -> band($_[1]); }, + + '|' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bior($_[0]) + : $_[0] -> copy() -> bior($_[1]); }, + + '|=' => sub { $_[0] -> bior($_[1]); }, + + '^' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> bxor($_[0]) + : $_[0] -> copy() -> bxor($_[1]); }, + + '^=' => sub { $_[0] -> bxor($_[1]); }, + +# '&.' => sub { }, + +# '&.=' => sub { }, + +# '|.' => sub { }, + +# '|.=' => sub { }, + +# '^.' => sub { }, + +# '^.=' => sub { }, + + # overload key: unary + + 'neg' => sub { $_[0] -> copy() -> bneg(); }, + +# '!' => sub { }, + + '~' => sub { $_[0] -> copy() -> bnot(); }, + +# '~.' => sub { }, + + # overload key: mutators + + '++' => sub { $_[0] -> binc() }, + + '--' => sub { $_[0] -> bdec() }, + + # overload key: func + + 'atan2' => sub { $_[2] ? ref($_[0]) -> new($_[1]) -> batan2($_[0]) + : $_[0] -> copy() -> batan2($_[1]); }, + + 'cos' => sub { $_[0] -> copy() -> bcos(); }, + + 'sin' => sub { $_[0] -> copy() -> bsin(); }, + + 'exp' => sub { $_[0] -> copy() -> bexp($_[1]); }, + + 'abs' => sub { $_[0] -> copy() -> babs(); }, + + 'log' => sub { $_[0] -> copy() -> blog(); }, + + 'sqrt' => sub { $_[0] -> copy() -> bsqrt(); }, + + 'int' => sub { $_[0] -> copy() -> bint(); }, + + # overload key: conversion + + 'bool' => sub { $_[0] -> is_zero() ? '' : 1; }, + + '""' => sub { $_[0] -> bstr(); }, + + '0+' => sub { $_[0] -> numify(); }, + + '=' => sub { $_[0]->copy(); }, + + ; + +############################################################################## +# global constants, flags and assorted stuff + +# the following are public, but their usage is not recommended. Use the +# accessor methods instead. + +# class constants, use Class->constant_name() to access +# one of 'even', 'odd', '+inf', '-inf', 'zero', 'trunc' or 'common' +$round_mode = 'even'; +$accuracy = undef; +$precision = undef; +$div_scale = 40; + +$upgrade = undef; +$downgrade = undef; +# the package we are using for our private parts, defaults to: +# Math::BigInt->config('lib') +my $MBI = 'Math::BigInt::Calc'; + +# are NaNs ok? (otherwise it dies when encountering an NaN) set w/ config() +$_trap_nan = 0; +# the same for infinity +$_trap_inf = 0; + +# constant for easier life +my $nan = 'NaN'; + +my $IMPORT = 0; # was import() called yet? used to make require work + +# some digits of accuracy for blog(undef, 10); which we use in blog() for speed +my $LOG_10 = + '2.3025850929940456840179914546843642076011014886287729760333279009675726097'; +my $LOG_10_A = length($LOG_10)-1; +# ditto for log(2) +my $LOG_2 = + '0.6931471805599453094172321214581765680755001343602552541206800094933936220'; +my $LOG_2_A = length($LOG_2)-1; +my $HALF = '0.5'; # made into an object if nec. + +############################################################################## +# the old code had $rnd_mode, so we need to support it, too + +sub TIESCALAR { + my ($class) = @_; + bless \$round_mode, $class; +} + +sub FETCH { + return $round_mode; +} + +sub STORE { + $rnd_mode = $_[0]->round_mode($_[1]); +} + +BEGIN { + # when someone sets $rnd_mode, we catch this and check the value to see + # whether it is valid or not. + $rnd_mode = 'even'; + tie $rnd_mode, 'Math::BigFloat'; + + # we need both of them in this package: + *as_int = \&as_number; +} + +sub DESTROY { + # going through AUTOLOAD for every DESTROY is costly, avoid it by empty sub +} + +sub AUTOLOAD { + # make fxxx and bxxx both work by selectively mapping fxxx() to MBF::bxxx() + my $name = $AUTOLOAD; + + $name =~ s/(.*):://; # split package + my $c = $1 || $class; + no strict 'refs'; + $c->import() if $IMPORT == 0; + if (!_method_alias($name)) { + if (!defined $name) { + # delayed load of Carp and avoid recursion + Carp::croak("$c: Can't call a method without name"); + } + if (!_method_hand_up($name)) { + # delayed load of Carp and avoid recursion + Carp::croak("Can't call $c\-\>$name, not a valid method"); + } + # try one level up, but subst. bxxx() for fxxx() since MBI only got bxxx() + $name =~ s/^f/b/; + return &{"Math::BigInt"."::$name"}(@_); + } + my $bname = $name; + $bname =~ s/^f/b/; + $c .= "::$name"; + *{$c} = \&{$bname}; + &{$c}; # uses @_ +} + +############################################################################## + +{ + # valid method aliases for AUTOLOAD + my %methods = map { $_ => 1 } + qw / fadd fsub fmul fdiv fround ffround fsqrt fmod fstr fsstr fpow fnorm + fint facmp fcmp fzero fnan finf finc fdec ffac fneg + fceil ffloor frsft flsft fone flog froot fexp + /; + # valid methods that can be handed up (for AUTOLOAD) + my %hand_ups = map { $_ => 1 } + qw / is_nan is_inf is_negative is_positive is_pos is_neg + accuracy precision div_scale round_mode fabs fnot + objectify upgrade downgrade + bone binf bnan bzero + bsub + /; + + sub _method_alias { exists $methods{$_[0]||''}; } + sub _method_hand_up { exists $hand_ups{$_[0]||''}; } +} + +sub DEBUG () { 0; } + +sub isa { + my ($self, $class) = @_; + return if $class =~ /^Math::BigInt/; # we aren't one of these + UNIVERSAL::isa($self, $class); +} + +sub config { + # return (later set?) configuration data as hash ref + my $class = shift || 'Math::BigFloat'; + + if (@_ == 1 && ref($_[0]) ne 'HASH') { + my $cfg = $class->SUPER::config(); + return $cfg->{$_[0]}; + } + + my $cfg = $class->SUPER::config(@_); + + # now we need only to override the ones that are different from our parent + $cfg->{class} = $class; + $cfg->{with} = $MBI; + $cfg; +} + +############################################################################### +# Constructor methods +############################################################################### + +sub new { + # Create a new Math::BigFloat object from a string or another bigfloat object. + # _e: exponent + # _m: mantissa + # sign => ("+", "-", "+inf", "-inf", or "NaN") + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + my ($wanted, @r) = @_; + + # avoid numify-calls by not using || on $wanted! + + unless (defined $wanted) { + #Carp::carp("Use of uninitialized value in new"); + return $self->bzero(@r); + } + + # Using $wanted->isa("Math::BigFloat") here causes a 'Deep recursion on + # subroutine "Math::BigFloat::as_number"' in some tests. Fixme! + + if (UNIVERSAL::isa($wanted, 'Math::BigFloat')) { + my $copy = $wanted -> copy(); + if ($selfref) { # if new() called as instance method + %$self = %$copy; + } else { # if new() called as class method + $self = $copy; + } + return $copy; + } + + $class->import() if $IMPORT == 0; # make require work + + # If called as a class method, initialize a new object. + + $self = bless {}, $class unless $selfref; + + # shortcut for bigints and its subclasses + if ((ref($wanted)) && $wanted -> can("as_number")) { + $self->{_m} = $wanted->as_number()->{value}; # get us a bigint copy + $self->{_e} = $MBI->_zero(); + $self->{_es} = '+'; + $self->{sign} = $wanted->sign(); + return $self->bnorm(); + } + + # else: got a string or something masquerading as number (with overload) + + # Handle Infs. + + if ($wanted =~ /^\s*([+-]?)inf(inity)?\s*\z/i) { + return $downgrade->new($wanted) if $downgrade; + my $sgn = $1 || '+'; + $self->{sign} = $sgn . 'inf'; # set a default sign for bstr() + return $self->binf($sgn); + } + + # Handle explicit NaNs (not the ones returned due to invalid input). + + if ($wanted =~ /^\s*([+-]?)nan\s*\z/i) { + return $downgrade->new($wanted) if $downgrade; + $self = $class -> bnan(); + $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1]; + return $self; + } + + # Handle hexadecimal numbers. + + if ($wanted =~ /^\s*[+-]?0[Xx]/) { + $self = $class -> from_hex($wanted); + $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1]; + return $self; + } + + # Handle binary numbers. + + if ($wanted =~ /^\s*[+-]?0[Bb]/) { + $self = $class -> from_bin($wanted); + $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1]; + return $self; + } + + # Shortcut for simple forms like '12' that have no trailing zeros. + if ($wanted =~ /^([+-]?)0*([1-9][0-9]*[1-9])$/) { + $self->{_e} = $MBI -> _zero(); + $self->{_es} = '+'; + $self->{sign} = $1 || '+'; + $self->{_m} = $MBI -> _new($2); + if (!$downgrade) { + $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1]; + return $self; + } + } + + my ($mis, $miv, $mfv, $es, $ev) = Math::BigInt::_split($wanted); + if (!ref $mis) { + if ($_trap_nan) { + Carp::croak("$wanted is not a number initialized to $class"); + } + + return $downgrade->bnan() if $downgrade; + + $self->{_e} = $MBI->_zero(); + $self->{_es} = '+'; + $self->{_m} = $MBI->_zero(); + $self->{sign} = $nan; + } else { + # make integer from mantissa by adjusting exp, then convert to int + $self->{_e} = $MBI->_new($$ev); # exponent + $self->{_es} = $$es || '+'; + my $mantissa = "$$miv$$mfv"; # create mant. + $mantissa =~ s/^0+(\d)/$1/; # strip leading zeros + $self->{_m} = $MBI->_new($mantissa); # create mant. + + # 3.123E0 = 3123E-3, and 3.123E-2 => 3123E-5 + if (CORE::length($$mfv) != 0) { + my $len = $MBI->_new(CORE::length($$mfv)); + ($self->{_e}, $self->{_es}) = + _e_sub($self->{_e}, $len, $self->{_es}, '+'); + } + # we can only have trailing zeros on the mantissa if $$mfv eq '' + else { + # Use a regexp to count the trailing zeros in $$miv instead of + # _zeros() because that is faster, especially when _m is not stored + # in base 10. + my $zeros = 0; + $zeros = CORE::length($1) if $$miv =~ /[1-9](0*)$/; + if ($zeros != 0) { + my $z = $MBI->_new($zeros); + # turn '120e2' into '12e3' + $self->{_m} = $MBI->_rsft($self->{_m}, $z, 10); + ($self->{_e}, $self->{_es}) = + _e_add($self->{_e}, $z, $self->{_es}, '+'); + } + } + $self->{sign} = $$mis; + + # for something like 0Ey, set y to 0, and -0 => +0 + # Check $$miv for being '0' and $$mfv eq '', because otherwise _m could not + # have become 0. That's faster than to call $MBI->_is_zero(). + $self->{sign} = '+', $self->{_e} = $MBI->_zero() + if $$miv eq '0' and $$mfv eq ''; + + if (!$downgrade) { + $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1]; + return $self; + } + } + + # if downgrade, inf, NaN or integers go down + + if ($downgrade && $self->{_es} eq '+') { + if ($MBI->_is_zero($self->{_e})) { + return $downgrade->new($$mis . $MBI->_str($self->{_m})); + } + return $downgrade->new($self->bsstr()); + } + $self->bnorm(); + $self->round(@r) unless @r >= 2 && !defined $r[0] && !defined $r[1]; + return $self; +} + +sub from_hex { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_hex'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + + if ($str =~ s/ + ^ + \s* + + # sign + ( [+-]? ) + + # optional "hex marker" + (?: 0? x )? + + # significand using the hex digits 0..9 and a..f + ( + [0-9a-fA-F]+ (?: _ [0-9a-fA-F]+ )* + (?: + \. + (?: [0-9a-fA-F]+ (?: _ [0-9a-fA-F]+ )* )? + )? + | + \. + [0-9a-fA-F]+ (?: _ [0-9a-fA-F]+ )* + ) + + # exponent (power of 2) using decimal digits + (?: + [Pp] + ( [+-]? ) + ( \d+ (?: _ \d+ )* ) + )? + + \s* + $ + //x) + { + my $s_sign = $1 || '+'; + my $s_value = $2; + my $e_sign = $3 || '+'; + my $e_value = $4 || '0'; + $s_value =~ tr/_//d; + $e_value =~ tr/_//d; + + # The significand must be multiplied by 2 raised to this exponent. + + my $two_expon = $class -> new($e_value); + $two_expon -> bneg() if $e_sign eq '-'; + + # If there is a dot in the significand, remove it and adjust the + # exponent according to the number of digits in the fraction part of + # the significand. Since the digits in the significand are in base 16, + # but the exponent is only in base 2, multiply the exponent adjustment + # value by log(16) / log(2) = 4. + + my $idx = index($s_value, '.'); + if ($idx >= 0) { + substr($s_value, $idx, 1) = ''; + $two_expon -= $class -> new(CORE::length($s_value)) + -> bsub($idx) + -> bmul("4"); + } + + $self -> {sign} = $s_sign; + $self -> {_m} = $MBI -> _from_hex('0x' . $s_value); + + if ($two_expon > 0) { + my $factor = $class -> new("2") -> bpow($two_expon); + $self -> bmul($factor); + } elsif ($two_expon < 0) { + my $factor = $class -> new("0.5") -> bpow(-$two_expon); + $self -> bmul($factor); + } + + return $self; + } + + return $self->bnan(); +} + +sub from_oct { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_oct'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + + if ($str =~ s/ + ^ + \s* + + # sign + ( [+-]? ) + + # significand using the octal digits 0..7 + ( + [0-7]+ (?: _ [0-7]+ )* + (?: + \. + (?: [0-7]+ (?: _ [0-7]+ )* )? + )? + | + \. + [0-7]+ (?: _ [0-7]+ )* + ) + + # exponent (power of 2) using decimal digits + (?: + [Pp] + ( [+-]? ) + ( \d+ (?: _ \d+ )* ) + )? + + \s* + $ + //x) + { + my $s_sign = $1 || '+'; + my $s_value = $2; + my $e_sign = $3 || '+'; + my $e_value = $4 || '0'; + $s_value =~ tr/_//d; + $e_value =~ tr/_//d; + + # The significand must be multiplied by 2 raised to this exponent. + + my $two_expon = $class -> new($e_value); + $two_expon -> bneg() if $e_sign eq '-'; + + # If there is a dot in the significand, remove it and adjust the + # exponent according to the number of digits in the fraction part of + # the significand. Since the digits in the significand are in base 8, + # but the exponent is only in base 2, multiply the exponent adjustment + # value by log(8) / log(2) = 3. + + my $idx = index($s_value, '.'); + if ($idx >= 0) { + substr($s_value, $idx, 1) = ''; + $two_expon -= $class -> new(CORE::length($s_value)) + -> bsub($idx) + -> bmul("3"); + } + + $self -> {sign} = $s_sign; + $self -> {_m} = $MBI -> _from_oct($s_value); + + if ($two_expon > 0) { + my $factor = $class -> new("2") -> bpow($two_expon); + $self -> bmul($factor); + } elsif ($two_expon < 0) { + my $factor = $class -> new("0.5") -> bpow(-$two_expon); + $self -> bmul($factor); + } + + return $self; + } + + return $self->bnan(); +} + +sub from_bin { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # Don't modify constant (read-only) objects. + + return if $selfref && $self->modify('from_bin'); + + my $str = shift; + + # If called as a class method, initialize a new object. + + $self = $class -> bzero() unless $selfref; + + if ($str =~ s/ + ^ + \s* + + # sign + ( [+-]? ) + + # optional "bin marker" + (?: 0? b )? + + # significand using the binary digits 0 and 1 + ( + [01]+ (?: _ [01]+ )* + (?: + \. + (?: [01]+ (?: _ [01]+ )* )? + )? + | + \. + [01]+ (?: _ [01]+ )* + ) + + # exponent (power of 2) using decimal digits + (?: + [Pp] + ( [+-]? ) + ( \d+ (?: _ \d+ )* ) + )? + + \s* + $ + //x) + { + my $s_sign = $1 || '+'; + my $s_value = $2; + my $e_sign = $3 || '+'; + my $e_value = $4 || '0'; + $s_value =~ tr/_//d; + $e_value =~ tr/_//d; + + # The significand must be multiplied by 2 raised to this exponent. + + my $two_expon = $class -> new($e_value); + $two_expon -> bneg() if $e_sign eq '-'; + + # If there is a dot in the significand, remove it and adjust the + # exponent according to the number of digits in the fraction part of + # the significand. + + my $idx = index($s_value, '.'); + if ($idx >= 0) { + substr($s_value, $idx, 1) = ''; + $two_expon -= $class -> new(CORE::length($s_value)) + -> bsub($idx); + } + + $self -> {sign} = $s_sign; + $self -> {_m} = $MBI -> _from_bin('0b' . $s_value); + + if ($two_expon > 0) { + my $factor = $class -> new("2") -> bpow($two_expon); + $self -> bmul($factor); + } elsif ($two_expon < 0) { + my $factor = $class -> new("0.5") -> bpow(-$two_expon); + $self -> bmul($factor); + } + + return $self; + } + + return $self->bnan(); +} + +sub bzero { + # create/assign '+0' + + if (@_ == 0) { + #Carp::carp("Using bone() as a function is deprecated;", + # " use bone() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self->import() if $IMPORT == 0; # make require work + return if $selfref && $self->modify('bzero'); + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = '+'; + $self -> {_m} = $MBI -> _zero(); + $self -> {_es} = '+'; + $self -> {_e} = $MBI -> _zero(); + + if (@_ > 0) { + if (@_ > 3) { + # call like: $x->bzero($a, $p, $r, $y); + ($self, $self->{_a}, $self->{_p}) = $self->_find_round_parameters(@_); + } else { + # call like: $x->bzero($a, $p, $r); + $self->{_a} = $_[0] + if !defined $self->{_a} || (defined $_[0] && $_[0] > $self->{_a}); + $self->{_p} = $_[1] + if !defined $self->{_p} || (defined $_[1] && $_[1] > $self->{_p}); + } + } + + return $self; +} + +sub bone { + # Create or assign '+1' (or -1 if given sign '-'). + + if (@_ == 0 || (defined($_[0]) && ($_[0] eq '+' || $_[0] eq '-'))) { + #Carp::carp("Using bone() as a function is deprecated;", + # " use bone() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + $self->import() if $IMPORT == 0; # make require work + return if $selfref && $self->modify('bone'); + + my $sign = shift; + $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+"; + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = $sign; + $self -> {_m} = $MBI -> _one(); + $self -> {_es} = '+'; + $self -> {_e} = $MBI -> _zero(); + + if (@_ > 0) { + if (@_ > 3) { + # call like: $x->bone($sign, $a, $p, $r, $y, ...); + ($self, $self->{_a}, $self->{_p}) = $self->_find_round_parameters(@_); + } else { + # call like: $x->bone($sign, $a, $p, $r); + $self->{_a} = $_[0] + if ((!defined $self->{_a}) || (defined $_[0] && $_[0] > $self->{_a})); + $self->{_p} = $_[1] + if ((!defined $self->{_p}) || (defined $_[1] && $_[1] > $self->{_p})); + } + } + + return $self; +} + +sub binf { + # create/assign a '+inf' or '-inf' + + if (@_ == 0 || (defined($_[0]) && !ref($_[0]) && + $_[0] =~ /^\s*[+-](inf(inity)?)?\s*$/)) + { + #Carp::carp("Using binf() as a function is deprecated;", + # " use binf() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + { + no strict 'refs'; + if (${"${class}::_trap_inf"}) { + Carp::croak("Tried to create +-inf in $class->binf()"); + } + } + + $self->import() if $IMPORT == 0; # make require work + return if $selfref && $self->modify('binf'); + + my $sign = shift; + $sign = defined $sign && $sign =~ /^\s*-/ ? "-" : "+"; + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = $sign . 'inf'; + $self -> {_m} = $MBI -> _zero(); + $self -> {_es} = '+'; + $self -> {_e} = $MBI -> _zero(); + + return $self; +} + +sub bnan { + # create/assign a 'NaN' + + if (@_ == 0) { + #Carp::carp("Using bnan() as a function is deprecated;", + # " use bnan() as a method instead"); + unshift @_, __PACKAGE__; + } + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + { + no strict 'refs'; + if (${"${class}::_trap_nan"}) { + Carp::croak("Tried to create NaN in $class->bnan()"); + } + } + + $self->import() if $IMPORT == 0; # make require work + return if $selfref && $self->modify('bnan'); + + $self = bless {}, $class unless $selfref; + + $self -> {sign} = $nan; + $self -> {_m} = $MBI -> _zero(); + $self -> {_es} = '+'; + $self -> {_e} = $MBI -> _zero(); + + return $self; +} + +sub bpi { + + # Called as Argument list + # --------- ------------- + # Math::BigFloat->bpi() ("Math::BigFloat") + # Math::BigFloat->bpi(10) ("Math::BigFloat", 10) + # $x->bpi() ($x) + # $x->bpi(10) ($x, 10) + # Math::BigFloat::bpi() () + # Math::BigFloat::bpi(10) (10) + # + # In ambiguous cases, we favour the OO-style, so the following case + # + # $n = Math::BigFloat->new("10"); + # $x = Math::BigFloat->bpi($n); + # + # which gives an argument list with the single element $n, is resolved as + # + # $n->bpi(); + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + my @r; # rounding paramters + + # If bpi() is called as a function ... + # + # This cludge is necessary because we still support bpi() as a function. If + # bpi() is called with either no argument or one argument, and that one + # argument is either undefined or a scalar that looks like a number, then + # we assume bpi() is called as a function. + + if (@_ == 0 && + (defined($self) && !ref($self) && $self =~ /^\s*[+-]?\d/i) + || + !defined($self)) + { + $r[0] = $self; + $class = __PACKAGE__; + $self = $class -> bzero(@r); # initialize + } + + # ... or if bpi() is called as a method ... + + else { + @r = @_; + if ($selfref) { # bpi() called as instance method + return $self if $self -> modify('bpi'); + } else { # bpi() called as class method + $self = $class -> bzero(@r); # initialize + } + } + + ($self, @r) = $self -> _find_round_parameters(@r); + + # The accuracy, i.e., the number of digits. Pi has one digit before the + # dot, so a precision of 4 digits is equivalent to an accuracy of 5 digits. + + my $n = defined $r[0] ? $r[0] + : defined $r[1] ? 1 - $r[1] + : $self -> div_scale(); + + my $rmode = defined $r[2] ? $r[2] : $self -> round_mode(); + + my $pi; + + if ($n <= 1000) { + + # 75 x 14 = 1050 digits + + my $all_digits = <<EOF; +314159265358979323846264338327950288419716939937510582097494459230781640628 +620899862803482534211706798214808651328230664709384460955058223172535940812 +848111745028410270193852110555964462294895493038196442881097566593344612847 +564823378678316527120190914564856692346034861045432664821339360726024914127 +372458700660631558817488152092096282925409171536436789259036001133053054882 +046652138414695194151160943305727036575959195309218611738193261179310511854 +807446237996274956735188575272489122793818301194912983367336244065664308602 +139494639522473719070217986094370277053921717629317675238467481846766940513 +200056812714526356082778577134275778960917363717872146844090122495343014654 +958537105079227968925892354201995611212902196086403441815981362977477130996 +051870721134999999837297804995105973173281609631859502445945534690830264252 +230825334468503526193118817101000313783875288658753320838142061717766914730 +359825349042875546873115956286388235378759375195778185778053217122680661300 +192787661119590921642019893809525720106548586327886593615338182796823030195 +EOF + + # Should we round up? + + my $round_up; + + # From the string above, we need to extract the number of digits we + # want plus extra characters for the newlines. + + my $nchrs = $n + int($n / 75); + + # Extract the digits we want. + + my $digits = substr($all_digits, 0, $nchrs); + + # Find out whether we should round up or down. Since pi is a + # transcendental number, we only have to look at one digit after the + # last digit we want. + + if ($rmode eq '+inf') { + $round_up = 1; + } elsif ($rmode eq 'trunc' || $rmode eq 'zero' || $rmode eq '-inf') { + $round_up = 0; + } else { + my $next_digit = substr($all_digits, $nchrs, 1); + $round_up = $next_digit lt '5' ? 0 : 1; + } + + # Remove the newlines. + + $digits =~ tr/0-9//cd; + + # Now do the rounding. We could easily make the regex substitution + # handle all cases, but we avoid using the regex engine when it is + # simple to avoid it. + + if ($round_up) { + my $last_digit = substr($digits, -1, 1); + if ($last_digit lt '9') { + substr($digits, -1, 1) = ++$last_digit; + } else { + $digits =~ s/([0-8])(9+)$/ ($1 + 1) . ("0" x CORE::length($2)) /e; + } + } + + # Append the exponent and convert to an object. + + $pi = Math::BigFloat -> new($digits . 'e-' . ($n - 1)); + + } else { + + # For large accuracy, the arctan formulas become very inefficient with + # Math::BigFloat, so use Brent-Salamin (aka AGM or Gauss-Legendre). + + # Use a few more digits in the intermediate computations. + my $nextra = 8; + + $HALF = $class -> new($HALF) unless ref($HALF); + my ($an, $bn, $tn, $pn) = ($class -> bone, $HALF -> copy() -> bsqrt($n), + $HALF -> copy() -> bmul($HALF), $class -> bone); + while ($pn < $n) { + my $prev_an = $an -> copy(); + $an -> badd($bn) -> bmul($HALF, $n); + $bn -> bmul($prev_an) -> bsqrt($n); + $prev_an -> bsub($an); + $tn -> bsub($pn * $prev_an * $prev_an); + $pn -> badd($pn); + } + $an -> badd($bn); + $an -> bmul($an, $n) -> bdiv(4 * $tn, $n); + + $an -> round(@r); + $pi = $an; + } + + if (defined $r[0]) { + $pi -> accuracy($r[0]); + } elsif (defined $r[1]) { + $pi -> precision($r[1]); + } + + for my $key (qw/ sign _m _es _e _a _p /) { + $self -> {$key} = $pi -> {$key}; + } + + return $self; +} + +sub copy { + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + # If called as a class method, the object to copy is the next argument. + + $self = shift() unless $selfref; + + my $copy = bless {}, $class; + + $copy->{sign} = $self->{sign}; + $copy->{_es} = $self->{_es}; + $copy->{_m} = $MBI->_copy($self->{_m}); + $copy->{_e} = $MBI->_copy($self->{_e}); + $copy->{_a} = $self->{_a} if exists $self->{_a}; + $copy->{_p} = $self->{_p} if exists $self->{_p}; + + return $copy; +} + +sub as_number { + # return copy as a bigint representation of this Math::BigFloat number + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x if $x->modify('as_number'); + + if (!$x->isa('Math::BigFloat')) { + # if the object can as_number(), use it + return $x->as_number() if $x->can('as_number'); + # otherwise, get us a float and then a number + $x = $x->can('as_float') ? $x->as_float() : $class->new(0+"$x"); + } + + return Math::BigInt->binf($x->sign()) if $x->is_inf(); + return Math::BigInt->bnan() if $x->is_nan(); + + my $z = $MBI->_copy($x->{_m}); + if ($x->{_es} eq '-') { # < 0 + $z = $MBI->_rsft($z, $x->{_e}, 10); + } elsif (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + $z = Math::BigInt->new($x->{sign} . $MBI->_str($z)); + $z; +} + +############################################################################### +# Boolean methods +############################################################################### + +sub is_zero { + # return true if arg (BFLOAT or num_str) is zero + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + ($x->{sign} eq '+' && $MBI->_is_zero($x->{_m})) ? 1 : 0; +} + +sub is_one { + # return true if arg (BFLOAT or num_str) is +1 or -1 if signis given + my ($class, $x, $sign) = ref($_[0]) ? (undef, @_) : objectify(1, @_); + + $sign = '+' if !defined $sign || $sign ne '-'; + + ($x->{sign} eq $sign && + $MBI->_is_zero($x->{_e}) && + $MBI->_is_one($x->{_m})) ? 1 : 0; +} + +sub is_odd { + # return true if arg (BFLOAT or num_str) is odd or false if even + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + (($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't + ($MBI->_is_zero($x->{_e})) && + ($MBI->_is_odd($x->{_m}))) ? 1 : 0; +} + +sub is_even { + # return true if arg (BINT or num_str) is even or false if odd + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + (($x->{sign} =~ /^[+-]$/) && # NaN & +-inf aren't + ($x->{_es} eq '+') && # 123.45 isn't + ($MBI->_is_even($x->{_m}))) ? 1 : 0; # but 1200 is +} + +sub is_int { + # return true if arg (BFLOAT or num_str) is an integer + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + (($x->{sign} =~ /^[+-]$/) && # NaN and +-inf aren't + ($x->{_es} eq '+')) ? 1 : 0; # 1e-1 => no integer +} + +############################################################################### +# Comparison methods +############################################################################### + +sub bcmp { + # Compares 2 values. Returns one of undef, <0, =0, >0. (suitable for sort) + + # set up parameters + my ($class, $x, $y) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y) = objectify(2, @_); + } + + return $upgrade->bcmp($x, $y) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + # Handle all 'nan' cases. + + return undef if ($x->{sign} eq $nan) || ($y->{sign} eq $nan); + + # Handle all '+inf' and '-inf' cases. + + return 0 if ($x->{sign} eq '+inf' && $y->{sign} eq '+inf' || + $x->{sign} eq '-inf' && $y->{sign} eq '-inf'); + return +1 if $x->{sign} eq '+inf'; # x = +inf and y < +inf + return -1 if $x->{sign} eq '-inf'; # x = -inf and y > -inf + return -1 if $y->{sign} eq '+inf'; # x < +inf and y = +inf + return +1 if $y->{sign} eq '-inf'; # x > -inf and y = -inf + + # Handle all cases with opposite signs. + + return +1 if $x->{sign} eq '+' && $y->{sign} eq '-'; # also does 0 <=> -y + return -1 if $x->{sign} eq '-' && $y->{sign} eq '+'; # also does -x <=> 0 + + # Handle all remaining zero cases. + + my $xz = $x->is_zero(); + my $yz = $y->is_zero(); + return 0 if $xz && $yz; # 0 <=> 0 + return -1 if $xz && $y->{sign} eq '+'; # 0 <=> +y + return +1 if $yz && $x->{sign} eq '+'; # +x <=> 0 + + # Both arguments are now finite, non-zero numbers with the same sign. + + my $cmp; + + # The next step is to compare the exponents, but since each mantissa is an + # integer of arbitrary value, the exponents must be normalized by the length + # of the mantissas before we can compare them. + + my $mxl = $MBI->_len($x->{_m}); + my $myl = $MBI->_len($y->{_m}); + + # If the mantissas have the same length, there is no point in normalizing the + # exponents by the length of the mantissas, so treat that as a special case. + + if ($mxl == $myl) { + + # First handle the two cases where the exponents have different signs. + + if ($x->{_es} eq '+' && $y->{_es} eq '-') { + $cmp = +1; + } elsif ($x->{_es} eq '-' && $y->{_es} eq '+') { + $cmp = -1; + } + + # Then handle the case where the exponents have the same sign. + + else { + $cmp = $MBI->_acmp($x->{_e}, $y->{_e}); + $cmp = -$cmp if $x->{_es} eq '-'; + } + + # Adjust for the sign, which is the same for x and y, and bail out if + # we're done. + + $cmp = -$cmp if $x->{sign} eq '-'; # 124 > 123, but -124 < -123 + return $cmp if $cmp; + + } + + # We must normalize each exponent by the length of the corresponding + # mantissa. Life is a lot easier if we first make both exponents + # non-negative. We do this by adding the same positive value to both + # exponent. This is safe, because when comparing the exponents, only the + # relative difference is important. + + my $ex; + my $ey; + + if ($x->{_es} eq '+') { + + # If the exponent of x is >= 0 and the exponent of y is >= 0, there is no + # need to do anything special. + + if ($y->{_es} eq '+') { + $ex = $MBI->_copy($x->{_e}); + $ey = $MBI->_copy($y->{_e}); + } + + # If the exponent of x is >= 0 and the exponent of y is < 0, add the + # absolute value of the exponent of y to both. + + else { + $ex = $MBI->_copy($x->{_e}); + $ex = $MBI->_add($ex, $y->{_e}); # ex + |ey| + $ey = $MBI->_zero(); # -ex + |ey| = 0 + } + + } else { + + # If the exponent of x is < 0 and the exponent of y is >= 0, add the + # absolute value of the exponent of x to both. + + if ($y->{_es} eq '+') { + $ex = $MBI->_zero(); # -ex + |ex| = 0 + $ey = $MBI->_copy($y->{_e}); + $ey = $MBI->_add($ey, $x->{_e}); # ey + |ex| + } + + # If the exponent of x is < 0 and the exponent of y is < 0, add the + # absolute values of both exponents to both exponents. + + else { + $ex = $MBI->_copy($y->{_e}); # -ex + |ey| + |ex| = |ey| + $ey = $MBI->_copy($x->{_e}); # -ey + |ex| + |ey| = |ex| + } + + } + + # Now we can normalize the exponents by adding lengths of the mantissas. + + $ex = $MBI->_add($ex, $MBI->_new($mxl)); + $ey = $MBI->_add($ey, $MBI->_new($myl)); + + # We're done if the exponents are different. + + $cmp = $MBI->_acmp($ex, $ey); + $cmp = -$cmp if $x->{sign} eq '-'; # 124 > 123, but -124 < -123 + return $cmp if $cmp; + + # Compare the mantissas, but first normalize them by padding the shorter + # mantissa with zeros (shift left) until it has the same length as the longer + # mantissa. + + my $mx = $x->{_m}; + my $my = $y->{_m}; + + if ($mxl > $myl) { + $my = $MBI->_lsft($MBI->_copy($my), $MBI->_new($mxl - $myl), 10); + } elsif ($mxl < $myl) { + $mx = $MBI->_lsft($MBI->_copy($mx), $MBI->_new($myl - $mxl), 10); + } + + $cmp = $MBI->_acmp($mx, $my); + $cmp = -$cmp if $x->{sign} eq '-'; # 124 > 123, but -124 < -123 + return $cmp; + +} + +sub bacmp { + # Compares 2 values, ignoring their signs. + # Returns one of undef, <0, =0, >0. (suitable for sort) + + # set up parameters + my ($class, $x, $y) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y) = objectify(2, @_); + } + + return $upgrade->bacmp($x, $y) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + # handle +-inf and NaN's + if ($x->{sign} !~ /^[+-]$/ || $y->{sign} !~ /^[+-]$/) { + return undef if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + return 0 if ($x->is_inf() && $y->is_inf()); + return 1 if ($x->is_inf() && !$y->is_inf()); + return -1; + } + + # shortcut + my $xz = $x->is_zero(); + my $yz = $y->is_zero(); + return 0 if $xz && $yz; # 0 <=> 0 + return -1 if $xz && !$yz; # 0 <=> +y + return 1 if $yz && !$xz; # +x <=> 0 + + # adjust so that exponents are equal + my $lxm = $MBI->_len($x->{_m}); + my $lym = $MBI->_len($y->{_m}); + my ($xes, $yes) = (1, 1); + $xes = -1 if $x->{_es} ne '+'; + $yes = -1 if $y->{_es} ne '+'; + # the numify somewhat limits our length, but makes it much faster + my $lx = $lxm + $xes * $MBI->_num($x->{_e}); + my $ly = $lym + $yes * $MBI->_num($y->{_e}); + my $l = $lx - $ly; + return $l <=> 0 if $l != 0; + + # lengths (corrected by exponent) are equal + # so make mantissa equal-length by padding with zero (shift left) + my $diff = $lxm - $lym; + my $xm = $x->{_m}; # not yet copy it + my $ym = $y->{_m}; + if ($diff > 0) { + $ym = $MBI->_copy($y->{_m}); + $ym = $MBI->_lsft($ym, $MBI->_new($diff), 10); + } elsif ($diff < 0) { + $xm = $MBI->_copy($x->{_m}); + $xm = $MBI->_lsft($xm, $MBI->_new(-$diff), 10); + } + $MBI->_acmp($xm, $ym); +} + +############################################################################### +# Arithmetic methods +############################################################################### + +sub bneg { + # (BINT or num_str) return BINT + # negate number or make a negated number from string + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x if $x->modify('bneg'); + + # for +0 do not negate (to have always normalized +0). Does nothing for 'NaN' + $x->{sign} =~ tr/+-/-+/ unless ($x->{sign} eq '+' && $MBI->_is_zero($x->{_m})); + $x; +} + +sub bnorm { + # adjust m and e so that m is smallest possible + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + return $x if $x->{sign} !~ /^[+-]$/; # inf, nan etc + + my $zeros = $MBI->_zeros($x->{_m}); # correct for trailing zeros + if ($zeros != 0) { + my $z = $MBI->_new($zeros); + $x->{_m} = $MBI->_rsft($x->{_m}, $z, 10); + if ($x->{_es} eq '-') { + if ($MBI->_acmp($x->{_e}, $z) >= 0) { + $x->{_e} = $MBI->_sub($x->{_e}, $z); + $x->{_es} = '+' if $MBI->_is_zero($x->{_e}); + } else { + $x->{_e} = $MBI->_sub($MBI->_copy($z), $x->{_e}); + $x->{_es} = '+'; + } + } else { + $x->{_e} = $MBI->_add($x->{_e}, $z); + } + } else { + # $x can only be 0Ey if there are no trailing zeros ('0' has 0 trailing + # zeros). So, for something like 0Ey, set y to 1, and -0 => +0 + $x->{sign} = '+', $x->{_es} = '+', $x->{_e} = $MBI->_one() + if $MBI->_is_zero($x->{_m}); + } + + $x; +} + +sub binc { + # increment arg by one + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('binc'); + + if ($x->{_es} eq '-') { + return $x->badd($class->bone(), @r); # digits after dot + } + + if (!$MBI->_is_zero($x->{_e})) # _e == 0 for NaN, inf, -inf + { + # 1e2 => 100, so after the shift below _m has a '0' as last digit + $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e}, 10); # 1e2 => 100 + $x->{_e} = $MBI->_zero(); # normalize + $x->{_es} = '+'; + # we know that the last digit of $x will be '1' or '9', depending on the + # sign + } + # now $x->{_e} == 0 + if ($x->{sign} eq '+') { + $x->{_m} = $MBI->_inc($x->{_m}); + return $x->bnorm()->bround(@r); + } elsif ($x->{sign} eq '-') { + $x->{_m} = $MBI->_dec($x->{_m}); + $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # -1 +1 => -0 => +0 + return $x->bnorm()->bround(@r); + } + # inf, nan handling etc + $x->badd($class->bone(), @r); # badd() does round +} + +sub bdec { + # decrement arg by one + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('bdec'); + + if ($x->{_es} eq '-') { + return $x->badd($class->bone('-'), @r); # digits after dot + } + + if (!$MBI->_is_zero($x->{_e})) { + $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e}, 10); # 1e2 => 100 + $x->{_e} = $MBI->_zero(); # normalize + $x->{_es} = '+'; + } + # now $x->{_e} == 0 + my $zero = $x->is_zero(); + # <= 0 + if (($x->{sign} eq '-') || $zero) { + $x->{_m} = $MBI->_inc($x->{_m}); + $x->{sign} = '-' if $zero; # 0 => 1 => -1 + $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # -1 +1 => -0 => +0 + return $x->bnorm()->round(@r); + } + # > 0 + elsif ($x->{sign} eq '+') { + $x->{_m} = $MBI->_dec($x->{_m}); + return $x->bnorm()->round(@r); + } + # inf, nan handling etc + $x->badd($class->bone('-'), @r); # does round +} + +sub badd { + # add second arg (BFLOAT or string) to first (BFLOAT) (modifies first) + # return result as BFLOAT + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('badd'); + + # inf and NaN handling + if (($x->{sign} !~ /^[+-]$/) || ($y->{sign} !~ /^[+-]$/)) { + # NaN first + return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + # inf handling + if (($x->{sign} =~ /^[+-]inf$/) && ($y->{sign} =~ /^[+-]inf$/)) { + # +inf++inf or -inf+-inf => same, rest is NaN + return $x if $x->{sign} eq $y->{sign}; + return $x->bnan(); + } + # +-inf + something => +inf; something +-inf => +-inf + $x->{sign} = $y->{sign}, return $x if $y->{sign} =~ /^[+-]inf$/; + return $x; + } + + return $upgrade->badd($x, $y, @r) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + $r[3] = $y; # no push! + + # speed: no add for 0+y or x+0 + return $x->bround(@r) if $y->is_zero(); # x+0 + if ($x->is_zero()) # 0+y + { + # make copy, clobbering up x (modify in place!) + $x->{_e} = $MBI->_copy($y->{_e}); + $x->{_es} = $y->{_es}; + $x->{_m} = $MBI->_copy($y->{_m}); + $x->{sign} = $y->{sign} || $nan; + return $x->round(@r); + } + + # take lower of the two e's and adapt m1 to it to match m2 + my $e = $y->{_e}; + $e = $MBI->_zero() if !defined $e; # if no BFLOAT? + $e = $MBI->_copy($e); # make copy (didn't do it yet) + + my $es; + + ($e, $es) = _e_sub($e, $x->{_e}, $y->{_es} || '+', $x->{_es}); + + my $add = $MBI->_copy($y->{_m}); + + if ($es eq '-') # < 0 + { + $x->{_m} = $MBI->_lsft($x->{_m}, $e, 10); + ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es); + } elsif (!$MBI->_is_zero($e)) # > 0 + { + $add = $MBI->_lsft($add, $e, 10); + } + # else: both e are the same, so just leave them + + if ($x->{sign} eq $y->{sign}) { + # add + $x->{_m} = $MBI->_add($x->{_m}, $add); + } else { + ($x->{_m}, $x->{sign}) = + _e_add($x->{_m}, $add, $x->{sign}, $y->{sign}); + } + + # delete trailing zeros, then round + $x->bnorm()->round(@r); +} + +sub bsub { + # (BINT or num_str, BINT or num_str) return BINT + # subtract second arg from first, modify first + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x -> modify('bsub'); + + return $upgrade -> new($x) -> bsub($upgrade -> new($y), @r) + if defined $upgrade && (!$x -> isa($class) || !$y -> isa($class)); + + return $x -> round(@r) if $y -> is_zero(); + + # To correctly handle the lone special case $x -> bsub($x), we note the + # sign of $x, then flip the sign from $y, and if the sign of $x did change, + # too, then we caught the special case: + + my $xsign = $x -> {sign}; + $y -> {sign} =~ tr/+-/-+/; # does nothing for NaN + if ($xsign ne $x -> {sign}) { + # special case of $x -> bsub($x) results in 0 + return $x -> bzero(@r) if $xsign =~ /^[+-]$/; + return $x -> bnan(); # NaN, -inf, +inf + } + $x -> badd($y, @r); # badd does not leave internal zeros + $y -> {sign} =~ tr/+-/-+/; # refix $y (does nothing for NaN) + $x; # already rounded by badd() or no rounding +} + +sub bmul { + # multiply two numbers + + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bmul'); + + return $x->bnan() if (($x->{sign} eq $nan) || ($y->{sign} eq $nan)); + + # inf handling + if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) { + return $x->bnan() if $x->is_zero() || $y->is_zero(); + # result will always be +-inf: + # +inf * +/+inf => +inf, -inf * -/-inf => +inf + # +inf * -/-inf => -inf, -inf * +/+inf => -inf + return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); + return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); + return $x->binf('-'); + } + + return $upgrade->bmul($x, $y, @r) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + # aEb * cEd = (a*c)E(b+d) + $x->{_m} = $MBI->_mul($x->{_m}, $y->{_m}); + ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es}); + + $r[3] = $y; # no push! + + # adjust sign: + $x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+'; + $x->bnorm->round(@r); +} + +sub bmuladd { + # multiply two numbers and add the third to the result + + # set up parameters + my ($class, $x, $y, $z, @r) = objectify(3, @_); + + return $x if $x->modify('bmuladd'); + + return $x->bnan() if (($x->{sign} eq $nan) || + ($y->{sign} eq $nan) || + ($z->{sign} eq $nan)); + + # inf handling + if (($x->{sign} =~ /^[+-]inf$/) || ($y->{sign} =~ /^[+-]inf$/)) { + return $x->bnan() if $x->is_zero() || $y->is_zero(); + # result will always be +-inf: + # +inf * +/+inf => +inf, -inf * -/-inf => +inf + # +inf * -/-inf => -inf, -inf * +/+inf => -inf + return $x->binf() if ($x->{sign} =~ /^\+/ && $y->{sign} =~ /^\+/); + return $x->binf() if ($x->{sign} =~ /^-/ && $y->{sign} =~ /^-/); + return $x->binf('-'); + } + + return $upgrade->bmul($x, $y, @r) if defined $upgrade && + ((!$x->isa($class)) || (!$y->isa($class))); + + # aEb * cEd = (a*c)E(b+d) + $x->{_m} = $MBI->_mul($x->{_m}, $y->{_m}); + ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es}); + + $r[3] = $y; # no push! + + # adjust sign: + $x->{sign} = $x->{sign} ne $y->{sign} ? '-' : '+'; + + # z=inf handling (z=NaN handled above) + $x->{sign} = $z->{sign}, return $x if $z->{sign} =~ /^[+-]inf$/; + + # take lower of the two e's and adapt m1 to it to match m2 + my $e = $z->{_e}; + $e = $MBI->_zero() if !defined $e; # if no BFLOAT? + $e = $MBI->_copy($e); # make copy (didn't do it yet) + + my $es; + + ($e, $es) = _e_sub($e, $x->{_e}, $z->{_es} || '+', $x->{_es}); + + my $add = $MBI->_copy($z->{_m}); + + if ($es eq '-') # < 0 + { + $x->{_m} = $MBI->_lsft($x->{_m}, $e, 10); + ($x->{_e}, $x->{_es}) = _e_add($x->{_e}, $e, $x->{_es}, $es); + } elsif (!$MBI->_is_zero($e)) # > 0 + { + $add = $MBI->_lsft($add, $e, 10); + } + # else: both e are the same, so just leave them + + if ($x->{sign} eq $z->{sign}) { + # add + $x->{_m} = $MBI->_add($x->{_m}, $add); + } else { + ($x->{_m}, $x->{sign}) = + _e_add($x->{_m}, $add, $x->{sign}, $z->{sign}); + } + + # delete trailing zeros, then round + $x->bnorm()->round(@r); +} + +sub bdiv { + # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return + # (BFLOAT, BFLOAT) (quo, rem) or BFLOAT (only quo) + + # set up parameters + my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $a, $p, $r) = objectify(2, @_); + } + + return $x if $x->modify('bdiv'); + + my $wantarray = wantarray; # call only once + + # At least one argument is NaN. This is handled the same way as in + # Math::BigInt -> bdiv(). + + if ($x -> is_nan() || $y -> is_nan()) { + return $wantarray ? ($x -> bnan(), $class -> bnan()) : $x -> bnan(); + } + + # Divide by zero and modulo zero. This is handled the same way as in + # Math::BigInt -> bdiv(). See the comment in the code for Math::BigInt -> + # bdiv() for further details. + + if ($y -> is_zero()) { + my ($quo, $rem); + if ($wantarray) { + $rem = $x -> copy(); + } + if ($x -> is_zero()) { + $quo = $x -> bnan(); + } else { + $quo = $x -> binf($x -> {sign}); + } + return $wantarray ? ($quo, $rem) : $quo; + } + + # Numerator (dividend) is +/-inf. This is handled the same way as in + # Math::BigInt -> bdiv(). See the comment in the code for Math::BigInt -> + # bdiv() for further details. + + if ($x -> is_inf()) { + my ($quo, $rem); + $rem = $class -> bnan() if $wantarray; + if ($y -> is_inf()) { + $quo = $x -> bnan(); + } else { + my $sign = $x -> bcmp(0) == $y -> bcmp(0) ? '+' : '-'; + $quo = $x -> binf($sign); + } + return $wantarray ? ($quo, $rem) : $quo; + } + + # Denominator (divisor) is +/-inf. This is handled the same way as in + # Math::BigInt -> bdiv(), with one exception: In scalar context, + # Math::BigFloat does true division (although rounded), not floored division + # (F-division), so a finite number divided by +/-inf is always zero. See the + # comment in the code for Math::BigInt -> bdiv() for further details. + + if ($y -> is_inf()) { + my ($quo, $rem); + if ($wantarray) { + if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) { + $rem = $x -> copy(); + $quo = $x -> bzero(); + } else { + $rem = $class -> binf($y -> {sign}); + $quo = $x -> bone('-'); + } + return ($quo, $rem); + } else { + if ($y -> is_inf()) { + if ($x -> is_nan() || $x -> is_inf()) { + return $x -> bnan(); + } else { + return $x -> bzero(); + } + } + } + } + + # At this point, both the numerator and denominator are finite numbers, and + # the denominator (divisor) is non-zero. + + # x == 0? + return wantarray ? ($x, $class->bzero()) : $x if $x->is_zero(); + + # upgrade ? + return $upgrade->bdiv($upgrade->new($x), $y, $a, $p, $r) if defined $upgrade; + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my (@params, $scale); + ($x, @params) = $x->_find_round_parameters($a, $p, $r, $y); + + return $x if $x->is_nan(); # error in _find_round_parameters? + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + my $rem; + $rem = $class -> bzero() if wantarray; + + $y = $class->new($y) unless $y->isa('Math::BigFloat'); + + my $lx = $MBI -> _len($x->{_m}); my $ly = $MBI -> _len($y->{_m}); + $scale = $lx if $lx > $scale; + $scale = $ly if $ly > $scale; + my $diff = $ly - $lx; + $scale += $diff if $diff > 0; # if lx << ly, but not if ly << lx! + + # check that $y is not 1 nor -1 and cache the result: + my $y_not_one = !($MBI->_is_zero($y->{_e}) && $MBI->_is_one($y->{_m})); + + # flipping the sign of $y will also flip the sign of $x for the special + # case of $x->bsub($x); so we can catch it below: + my $xsign = $x->{sign}; + $y->{sign} =~ tr/+-/-+/; + + if ($xsign ne $x->{sign}) { + # special case of $x /= $x results in 1 + $x->bone(); # "fixes" also sign of $y, since $x is $y + } else { + # correct $y's sign again + $y->{sign} =~ tr/+-/-+/; + # continue with normal div code: + + # make copy of $x in case of list context for later remainder calculation + if (wantarray && $y_not_one) { + $rem = $x->copy(); + } + + $x->{sign} = $x->{sign} ne $y->sign() ? '-' : '+'; + + # check for / +-1 (+/- 1E0) + if ($y_not_one) { + # promote BigInts and it's subclasses (except when already a Math::BigFloat) + $y = $class->new($y) unless $y->isa('Math::BigFloat'); + + # calculate the result to $scale digits and then round it + # a * 10 ** b / c * 10 ** d => a/c * 10 ** (b-d) + $x->{_m} = $MBI->_lsft($x->{_m}, $MBI->_new($scale), 10); + $x->{_m} = $MBI->_div($x->{_m}, $y->{_m}); # a/c + + # correct exponent of $x + ($x->{_e}, $x->{_es}) = _e_sub($x->{_e}, $y->{_e}, $x->{_es}, $y->{_es}); + # correct for 10**scale + ($x->{_e}, $x->{_es}) = _e_sub($x->{_e}, $MBI->_new($scale), $x->{_es}, '+'); + $x->bnorm(); # remove trailing 0's + } + } # end else $x != $y + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + delete $x->{_a}; # clear before round + $x->bround($params[0], $params[2]); # then round accordingly + } else { + delete $x->{_p}; # clear before round + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; delete $x->{_p}; + } + + if (wantarray) { + if ($y_not_one) { + $x -> bfloor(); + $rem->bmod($y, @params); # copy already done + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $rem->{_a}; delete $rem->{_p}; + } + return ($x, $rem); + } + $x; +} + +sub bmod { + # (dividend: BFLOAT or num_str, divisor: BFLOAT or num_str) return remainder + + # set up parameters + my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $a, $p, $r) = objectify(2, @_); + } + + return $x if $x->modify('bmod'); + + # At least one argument is NaN. This is handled the same way as in + # Math::BigInt -> bmod(). + + if ($x -> is_nan() || $y -> is_nan()) { + return $x -> bnan(); + } + + # Modulo zero. This is handled the same way as in Math::BigInt -> bmod(). + + if ($y -> is_zero()) { + return $x; + } + + # Numerator (dividend) is +/-inf. This is handled the same way as in + # Math::BigInt -> bmod(). + + if ($x -> is_inf()) { + return $x -> bnan(); + } + + # Denominator (divisor) is +/-inf. This is handled the same way as in + # Math::BigInt -> bmod(). + + if ($y -> is_inf()) { + if ($x -> is_zero() || $x -> bcmp(0) == $y -> bcmp(0)) { + return $x; + } else { + return $x -> binf($y -> sign()); + } + } + + return $x->bzero() if $x->is_zero() + || ($x->is_int() && + # check that $y == +1 or $y == -1: + ($MBI->_is_zero($y->{_e}) && $MBI->_is_one($y->{_m}))); + + my $cmp = $x->bacmp($y); # equal or $x < $y? + if ($cmp == 0) { # $x == $y => result 0 + return $x -> bzero($a, $p); + } + + # only $y of the operands negative? + my $neg = $x->{sign} ne $y->{sign} ? 1 : 0; + + $x->{sign} = $y->{sign}; # calc sign first + if ($cmp < 0 && $neg == 0) { # $x < $y => result $x + return $x -> round($a, $p, $r); + } + + my $ym = $MBI->_copy($y->{_m}); + + # 2e1 => 20 + $ym = $MBI->_lsft($ym, $y->{_e}, 10) + if $y->{_es} eq '+' && !$MBI->_is_zero($y->{_e}); + + # if $y has digits after dot + my $shifty = 0; # correct _e of $x by this + if ($y->{_es} eq '-') # has digits after dot + { + # 123 % 2.5 => 1230 % 25 => 5 => 0.5 + $shifty = $MBI->_num($y->{_e}); # no more digits after dot + $x->{_m} = $MBI->_lsft($x->{_m}, $y->{_e}, 10); # 123 => 1230, $y->{_m} is already 25 + } + # $ym is now mantissa of $y based on exponent 0 + + my $shiftx = 0; # correct _e of $x by this + if ($x->{_es} eq '-') # has digits after dot + { + # 123.4 % 20 => 1234 % 200 + $shiftx = $MBI->_num($x->{_e}); # no more digits after dot + $ym = $MBI->_lsft($ym, $x->{_e}, 10); # 123 => 1230 + } + # 123e1 % 20 => 1230 % 20 + if ($x->{_es} eq '+' && !$MBI->_is_zero($x->{_e})) { + $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e}, 10); # es => '+' here + } + + $x->{_e} = $MBI->_new($shiftx); + $x->{_es} = '+'; + $x->{_es} = '-' if $shiftx != 0 || $shifty != 0; + $x->{_e} = $MBI->_add($x->{_e}, $MBI->_new($shifty)) if $shifty != 0; + + # now mantissas are equalized, exponent of $x is adjusted, so calc result + + $x->{_m} = $MBI->_mod($x->{_m}, $ym); + + $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # fix sign for -0 + $x->bnorm(); + + if ($neg != 0 && ! $x -> is_zero()) # one of them negative => correct in place + { + my $r = $y - $x; + $x->{_m} = $r->{_m}; + $x->{_e} = $r->{_e}; + $x->{_es} = $r->{_es}; + $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # fix sign for -0 + $x->bnorm(); + } + + $x->round($a, $p, $r, $y); # round and return +} + +sub bmodpow { + # takes a very large number to a very large exponent in a given very + # large modulus, quickly, thanks to binary exponentiation. Supports + # negative exponents. + my ($class, $num, $exp, $mod, @r) = objectify(3, @_); + + return $num if $num->modify('bmodpow'); + + # check modulus for valid values + return $num->bnan() if ($mod->{sign} ne '+' # NaN, -, -inf, +inf + || $mod->is_zero()); + + # check exponent for valid values + if ($exp->{sign} =~ /\w/) { + # i.e., if it's NaN, +inf, or -inf... + return $num->bnan(); + } + + $num->bmodinv ($mod) if ($exp->{sign} eq '-'); + + # check num for valid values (also NaN if there was no inverse but $exp < 0) + return $num->bnan() if $num->{sign} !~ /^[+-]$/; + + # $mod is positive, sign on $exp is ignored, result also positive + + # XXX TODO: speed it up when all three numbers are integers + $num->bpow($exp)->bmod($mod); +} + +sub bpow { + # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT + # compute power of two numbers, second arg is used as integer + # modifies first argument + + # set up parameters + my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $a, $p, $r) = objectify(2, @_); + } + + return $x if $x->modify('bpow'); + + return $x->bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan; + return $x if $x->{sign} =~ /^[+-]inf$/; + + # cache the result of is_zero + my $y_is_zero = $y->is_zero(); + return $x->bone() if $y_is_zero; + return $x if $x->is_one() || $y->is_one(); + + my $x_is_zero = $x->is_zero(); + return $x->_pow($y, $a, $p, $r) if !$x_is_zero && !$y->is_int(); # non-integer power + + my $y1 = $y->as_number()->{value}; # make MBI part + + # if ($x == -1) + if ($x->{sign} eq '-' && $MBI->_is_one($x->{_m}) && $MBI->_is_zero($x->{_e})) { + # if $x == -1 and odd/even y => +1/-1 because +-1 ^ (+-1) => +-1 + return $MBI->_is_odd($y1) ? $x : $x->babs(1); + } + if ($x_is_zero) { + return $x if $y->{sign} eq '+'; # 0**y => 0 (if not y <= 0) + # 0 ** -y => 1 / (0 ** y) => 1 / 0! (1 / 0 => +inf) + return $x->binf(); + } + + my $new_sign = '+'; + $new_sign = $MBI->_is_odd($y1) ? '-' : '+' if $x->{sign} ne '+'; + + # calculate $x->{_m} ** $y and $x->{_e} * $y separately (faster) + $x->{_m} = $MBI->_pow($x->{_m}, $y1); + $x->{_e} = $MBI->_mul ($x->{_e}, $y1); + + $x->{sign} = $new_sign; + $x->bnorm(); + if ($y->{sign} eq '-') { + # modify $x in place! + my $z = $x->copy(); $x->bone(); + return scalar $x->bdiv($z, $a, $p, $r); # round in one go (might ignore y's A!) + } + $x->round($a, $p, $r, $y); +} + +sub blog { + # Return the logarithm of the operand. If a second operand is defined, that + # value is used as the base, otherwise the base is assumed to be Euler's + # constant. + + my ($class, $x, $base, $a, $p, $r); + + # Don't objectify the base, since an undefined base, as in $x->blog() or + # $x->blog(undef) signals that the base is Euler's number. + + if (!ref($_[0]) && $_[0] =~ /^[A-Za-z]|::/) { + # E.g., Math::BigFloat->blog(256, 2) + ($class, $x, $base, $a, $p, $r) = + defined $_[2] ? objectify(2, @_) : objectify(1, @_); + } else { + # E.g., Math::BigFloat::blog(256, 2) or $x->blog(2) + ($class, $x, $base, $a, $p, $r) = + defined $_[1] ? objectify(2, @_) : objectify(1, @_); + } + + return $x if $x->modify('blog'); + + return $x -> bnan() if $x -> is_nan(); + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my ($scale, @params); + ($x, @params) = $x->_find_round_parameters($a, $p, $r); + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # P = undef + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + my $done = 0; + if (defined $base) { + $base = $class -> new($base) unless ref $base; + if ($base -> is_nan() || $base -> is_one()) { + $x -> bnan(); + $done = 1; + } elsif ($base -> is_inf() || $base -> is_zero()) { + if ($x -> is_inf() || $x -> is_zero()) { + $x -> bnan(); + } else { + $x -> bzero(@params); + } + $done = 1; + } elsif ($base -> is_negative()) { # -inf < base < 0 + if ($x -> is_one()) { # x = 1 + $x -> bzero(@params); + } elsif ($x == $base) { + $x -> bone('+', @params); # x = base + } else { + $x -> bnan(); # otherwise + } + $done = 1; + } elsif ($x == $base) { + $x -> bone('+', @params); # 0 < base && 0 < x < inf + $done = 1; + } + } + + # We now know that the base is either undefined or positive and finite. + + unless ($done) { + if ($x -> is_inf()) { # x = +/-inf + my $sign = defined $base && $base < 1 ? '-' : '+'; + $x -> binf($sign); + $done = 1; + } elsif ($x -> is_neg()) { # -inf < x < 0 + $x -> bnan(); + $done = 1; + } elsif ($x -> is_one()) { # x = 1 + $x -> bzero(@params); + $done = 1; + } elsif ($x -> is_zero()) { # x = 0 + my $sign = defined $base && $base < 1 ? '+' : '-'; + $x -> binf($sign); + $done = 1; + } + } + + if ($done) { + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + return $x; + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; + local $Math::BigFloat::downgrade = undef; + + # upgrade $x if $x is not a Math::BigFloat (handle BigInt input) + # XXX TODO: rebless! + if (!$x->isa('Math::BigFloat')) { + $x = Math::BigFloat->new($x); + $class = ref($x); + } + + $done = 0; + + # If the base is defined and an integer, try to calculate integer result + # first. This is very fast, and in case the real result was found, we can + # stop right here. + if (defined $base && $base->is_int() && $x->is_int()) { + my $i = $MBI->_copy($x->{_m}); + $i = $MBI->_lsft($i, $x->{_e}, 10) unless $MBI->_is_zero($x->{_e}); + my $int = Math::BigInt->bzero(); + $int->{value} = $i; + $int->blog($base->as_number()); + # if ($exact) + if ($base->as_number()->bpow($int) == $x) { + # found result, return it + $x->{_m} = $int->{value}; + $x->{_e} = $MBI->_zero(); + $x->{_es} = '+'; + $x->bnorm(); + $done = 1; + } + } + + if ($done == 0) { + # base is undef, so base should be e (Euler's number), so first calculate the + # log to base e (using reduction by 10 (and probably 2)): + $class->_log_10($x, $scale); + + # and if a different base was requested, convert it + if (defined $base) { + $base = Math::BigFloat->new($base) unless $base->isa('Math::BigFloat'); + # not ln, but some other base (don't modify $base) + $x->bdiv($base->copy()->blog(undef, $scale), $scale); + } + } + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + + $x; +} + +sub bexp { + # Calculate e ** X (Euler's number to the power of X) + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('bexp'); + + return $x->binf() if $x->{sign} eq '+inf'; + return $x->bzero() if $x->{sign} eq '-inf'; + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my ($scale, @params); + ($x, @params) = $x->_find_round_parameters($a, $p, $r); + + # also takes care of the "error in _find_round_parameters?" case + return $x if $x->{sign} eq 'NaN'; + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # P = undef + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it's not enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + return $x->bone(@params) if $x->is_zero(); + + if (!$x->isa('Math::BigFloat')) { + $x = Math::BigFloat->new($x); + $class = ref($x); + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; + delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; + local $Math::BigFloat::downgrade = undef; + + my $x_org = $x->copy(); + + # We use the following Taylor series: + + # x x^2 x^3 x^4 + # e = 1 + --- + --- + --- + --- ... + # 1! 2! 3! 4! + + # The difference for each term is X and N, which would result in: + # 2 copy, 2 mul, 2 add, 1 inc, 1 div operations per term + + # But it is faster to compute exp(1) and then raising it to the + # given power, esp. if $x is really big and an integer because: + + # * The numerator is always 1, making the computation faster + # * the series converges faster in the case of x == 1 + # * We can also easily check when we have reached our limit: when the + # term to be added is smaller than "1E$scale", we can stop - f.i. + # scale == 5, and we have 1/40320, then we stop since 1/40320 < 1E-5. + # * we can compute the *exact* result by simulating bigrat math: + + # 1 1 gcd(3, 4) = 1 1*24 + 1*6 5 + # - + - = ---------- = -- + # 6 24 6*24 24 + + # We do not compute the gcd() here, but simple do: + # 1 1 1*24 + 1*6 30 + # - + - = --------- = -- + # 6 24 6*24 144 + + # In general: + # a c a*d + c*b and note that c is always 1 and d = (b*f) + # - + - = --------- + # b d b*d + + # This leads to: which can be reduced by b to: + # a 1 a*b*f + b a*f + 1 + # - + - = --------- = ------- + # b b*f b*b*f b*f + + # The first terms in the series are: + + # 1 1 1 1 1 1 1 1 13700 + # -- + -- + -- + -- + -- + --- + --- + ---- = ----- + # 1 1 2 6 24 120 720 5040 5040 + + # Note that we cannot simple reduce 13700/5040 to 685/252, but must keep A and B! + + if ($scale <= 75) { + # set $x directly from a cached string form + $x->{_m} = $MBI->_new( + "27182818284590452353602874713526624977572470936999595749669676277240766303535476"); + $x->{sign} = '+'; + $x->{_es} = '-'; + $x->{_e} = $MBI->_new(79); + } else { + # compute A and B so that e = A / B. + + # After some terms we end up with this, so we use it as a starting point: + my $A = $MBI->_new("90933395208605785401971970164779391644753259799242"); + my $F = $MBI->_new(42); + my $step = 42; + + # Compute how many steps we need to take to get $A and $B sufficiently big + my $steps = _len_to_steps($scale - 4); + # print STDERR "# Doing $steps steps for ", $scale-4, " digits\n"; + while ($step++ <= $steps) { + # calculate $a * $f + 1 + $A = $MBI->_mul($A, $F); + $A = $MBI->_inc($A); + # increment f + $F = $MBI->_inc($F); + } + # compute $B as factorial of $steps (this is faster than doing it manually) + my $B = $MBI->_fac($MBI->_new($steps)); + + # print "A ", $MBI->_str($A), "\nB ", $MBI->_str($B), "\n"; + + # compute A/B with $scale digits in the result (truncate, not round) + $A = $MBI->_lsft($A, $MBI->_new($scale), 10); + $A = $MBI->_div($A, $B); + + $x->{_m} = $A; + $x->{sign} = '+'; + $x->{_es} = '-'; + $x->{_e} = $MBI->_new($scale); + } + + # $x contains now an estimate of e, with some surplus digits, so we can round + if (!$x_org->is_one()) { + # Reduce size of fractional part, followup with integer power of two. + my $lshift = 0; + while ($lshift < 30 && $x_org->bacmp(2 << $lshift) > 0) { + $lshift++; + } + # Raise $x to the wanted power and round it. + if ($lshift == 0) { + $x->bpow($x_org, @params); + } else { + my($mul, $rescale) = (1 << $lshift, $scale+1+$lshift); + $x->bpow(scalar $x_org->bdiv($mul, $rescale), $rescale)->bpow($mul, @params); + } + } else { + # else just round the already computed result + delete $x->{_a}; + delete $x->{_p}; + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + + $x; # return modified $x +} + +sub bnok { + # Calculate n over k (binomial coefficient or "choose" function) as integer. + # set up parameters + my ($class, $x, $y, @r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, @r) = objectify(2, @_); + } + + return $x if $x->modify('bnok'); + + return $x->bnan() if $x->is_nan() || $y->is_nan(); + return $x->binf() if $x->is_inf(); + + my $u = $x->as_int(); + $u->bnok($y->as_int()); + + $x->{_m} = $u->{value}; + $x->{_e} = $MBI->_zero(); + $x->{_es} = '+'; + $x->{sign} = '+'; + $x->bnorm(@r); +} + +sub bsin { + # Calculate a sinus of x. + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + # taylor: x^3 x^5 x^7 x^9 + # sin = x - --- + --- - --- + --- ... + # 3! 5! 7! 9! + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my ($scale, @params); + ($x, @params) = $x->_find_round_parameters(@r); + + # constant object or error in _find_round_parameters? + return $x if $x->modify('bsin') || $x->is_nan(); + + return $x->bzero(@r) if $x->is_zero(); + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # disable P + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r[2]; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; + delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; + + my $last = 0; + my $over = $x * $x; # X ^ 2 + my $x2 = $over->copy(); # X ^ 2; difference between terms + $over->bmul($x); # X ^ 3 as starting value + my $sign = 1; # start with -= + my $below = $class->new(6); my $factorial = $class->new(4); + delete $x->{_a}; + delete $x->{_p}; + + my $limit = $class->new("1E-". ($scale-1)); + #my $steps = 0; + while (3 < 5) { + # we calculate the next term, and add it to the last + # when the next term is below our limit, it won't affect the outcome + # anymore, so we stop: + my $next = $over->copy()->bdiv($below, $scale); + last if $next->bacmp($limit) <= 0; + + if ($sign == 0) { + $x->badd($next); + } else { + $x->bsub($next); + } + $sign = 1-$sign; # alternate + # calculate things for the next term + $over->bmul($x2); # $x*$x + $below->bmul($factorial); $factorial->binc(); # n*(n+1) + $below->bmul($factorial); $factorial->binc(); # n*(n+1) + } + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + $x; +} + +sub bcos { + # Calculate a cosinus of x. + my ($class, $x, @r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + # Taylor: x^2 x^4 x^6 x^8 + # cos = 1 - --- + --- - --- + --- ... + # 2! 4! 6! 8! + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my ($scale, @params); + ($x, @params) = $x->_find_round_parameters(@r); + + # constant object or error in _find_round_parameters? + return $x if $x->modify('bcos') || $x->is_nan(); + + return $x->bone(@r) if $x->is_zero(); + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # disable P + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r[2]; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; + + my $last = 0; + my $over = $x * $x; # X ^ 2 + my $x2 = $over->copy(); # X ^ 2; difference between terms + my $sign = 1; # start with -= + my $below = $class->new(2); + my $factorial = $class->new(3); + $x->bone(); + delete $x->{_a}; + delete $x->{_p}; + + my $limit = $class->new("1E-". ($scale-1)); + #my $steps = 0; + while (3 < 5) { + # we calculate the next term, and add it to the last + # when the next term is below our limit, it won't affect the outcome + # anymore, so we stop: + my $next = $over->copy()->bdiv($below, $scale); + last if $next->bacmp($limit) <= 0; + + if ($sign == 0) { + $x->badd($next); + } else { + $x->bsub($next); + } + $sign = 1-$sign; # alternate + # calculate things for the next term + $over->bmul($x2); # $x*$x + $below->bmul($factorial); $factorial->binc(); # n*(n+1) + $below->bmul($factorial); $factorial->binc(); # n*(n+1) + } + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + $x; +} + +sub batan { + # Calculate a arcus tangens of x. + + my $self = shift; + my $selfref = ref $self; + my $class = $selfref || $self; + + my (@r) = @_; + + # taylor: x^3 x^5 x^7 x^9 + # atan = x - --- + --- - --- + --- ... + # 3 5 7 9 + + # We need to limit the accuracy to protect against overflow. + + my $fallback = 0; + my ($scale, @params); + ($self, @params) = $self->_find_round_parameters(@r); + + # Constant object or error in _find_round_parameters? + + return $self if $self->modify('batan') || $self->is_nan(); + + if ($self->{sign} =~ /^[+-]inf\z/) { + # +inf result is PI/2 + # -inf result is -PI/2 + # calculate PI/2 + my $pi = $class->bpi(@r); + # modify $self in place + $self->{_m} = $pi->{_m}; + $self->{_e} = $pi->{_e}; + $self->{_es} = $pi->{_es}; + # -y => -PI/2, +y => PI/2 + $self->{sign} = substr($self->{sign}, 0, 1); # "+inf" => "+" + $self -> {_m} = $MBI->_div($self->{_m}, $MBI->_new(2)); + return $self; + } + + return $self->bzero(@r) if $self->is_zero(); + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # disable P + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r[2]; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + # 1 or -1 => PI/4 + # inlined is_one() && is_one('-') + if ($MBI->_is_one($self->{_m}) && $MBI->_is_zero($self->{_e})) { + my $pi = $class->bpi($scale - 3); + # modify $self in place + $self->{_m} = $pi->{_m}; + $self->{_e} = $pi->{_e}; + $self->{_es} = $pi->{_es}; + # leave the sign of $self alone (+1 => +PI/4, -1 => -PI/4) + $self->{_m} = $MBI->_div($self->{_m}, $MBI->_new(4)); + return $self; + } + + # This series is only valid if -1 < x < 1, so for other x we need to + # calculate PI/2 - atan(1/x): + my $one = $MBI->_new(1); + my $pi = undef; + if ($self->bacmp($self->copy()->bone) >= 0) { + # calculate PI/2 + $pi = $class->bpi($scale - 3); + $pi->{_m} = $MBI->_div($pi->{_m}, $MBI->_new(2)); + # calculate 1/$self: + my $self_copy = $self->copy(); + # modify $self in place + $self->bone(); + $self->bdiv($self_copy, $scale); + } + + my $fmul = 1; + foreach my $k (0 .. int($scale / 20)) { + $fmul *= 2; + $self->bdiv($self->copy()->bmul($self)->binc->bsqrt($scale + 4)->binc, $scale + 4); + } + + # When user set globals, they would interfere with our calculation, so + # disable them and later re-enable them. + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # We also need to disable any set A or P on $self (_find_round_parameters + # took them already into account), since these would interfere, too + delete $self->{_a}; + delete $self->{_p}; + # Need to disable $upgrade in BigInt, to avoid deep recursion. + local $Math::BigInt::upgrade = undef; + + my $last = 0; + my $over = $self * $self; # X ^ 2 + my $self2 = $over->copy(); # X ^ 2; difference between terms + $over->bmul($self); # X ^ 3 as starting value + my $sign = 1; # start with -= + my $below = $class->new(3); + my $two = $class->new(2); + delete $self->{_a}; + delete $self->{_p}; + + my $limit = $class->new("1E-". ($scale-1)); + #my $steps = 0; + while (1) { + # We calculate the next term, and add it to the last. When the next + # term is below our limit, it won't affect the outcome anymore, so we + # stop: + my $next = $over->copy()->bdiv($below, $scale); + last if $next->bacmp($limit) <= 0; + + if ($sign == 0) { + $self->badd($next); + } else { + $self->bsub($next); + } + $sign = 1-$sign; # alternatex + # calculate things for the next term + $over->bmul($self2); # $self*$self + $below->badd($two); # n += 2 + } + $self->bmul($fmul); + + if (defined $pi) { + my $self_copy = $self->copy(); + # modify $self in place + $self->{_m} = $pi->{_m}; + $self->{_e} = $pi->{_e}; + $self->{_es} = $pi->{_es}; + # PI/2 - $self + $self->bsub($self_copy); + } + + # Shortcut to not run through _find_round_parameters again. + if (defined $params[0]) { + $self->bround($params[0], $params[2]); # then round accordingly + } else { + $self->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # Clear a/p after round, since user did not request it. + delete $self->{_a}; + delete $self->{_p}; + } + + # restore globals + $$abr = $ab; + $$pbr = $pb; + $self; +} + +sub batan2 { + # $y -> batan2($x) returns the arcus tangens of $y / $x. + + # Set up parameters. + my ($class, $y, $x, @r) = (ref($_[0]), @_); + + # Objectify is costly, so avoid it if we can. + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $y, $x, @r) = objectify(2, @_); + } + + # Quick exit if $y is read-only. + return $y if $y -> modify('batan2'); + + # Handle all NaN cases. + return $y -> bnan() if $x->{sign} eq $nan || $y->{sign} eq $nan; + + # We need to limit the accuracy to protect against overflow. + my $fallback = 0; + my ($scale, @params); + ($y, @params) = $y -> _find_round_parameters(@r); + + # Error in _find_round_parameters? + return $y if $y->is_nan(); + + # No rounding at all, so must use fallback. + if (scalar @params == 0) { + # Simulate old behaviour + $params[0] = $class -> div_scale(); # and round to it as accuracy + $params[1] = undef; # disable P + $scale = $params[0] + 4; # at least four more for proper round + $params[2] = $r[2]; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # The 4 below is empirical, and there might be cases where it is not + # enough ... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + if ($x -> is_inf("+")) { # x = inf + if ($y -> is_inf("+")) { # y = inf + $y -> bpi($scale) -> bmul("0.25"); # pi/4 + } elsif ($y -> is_inf("-")) { # y = -inf + $y -> bpi($scale) -> bmul("-0.25"); # -pi/4 + } else { # -inf < y < inf + return $y -> bzero(@r); # 0 + } + } elsif ($x -> is_inf("-")) { # x = -inf + if ($y -> is_inf("+")) { # y = inf + $y -> bpi($scale) -> bmul("0.75"); # 3/4 pi + } elsif ($y -> is_inf("-")) { # y = -inf + $y -> bpi($scale) -> bmul("-0.75"); # -3/4 pi + } elsif ($y >= 0) { # y >= 0 + $y -> bpi($scale); # pi + } else { # y < 0 + $y -> bpi($scale) -> bneg(); # -pi + } + } elsif ($x > 0) { # 0 < x < inf + if ($y -> is_inf("+")) { # y = inf + $y -> bpi($scale) -> bmul("0.5"); # pi/2 + } elsif ($y -> is_inf("-")) { # y = -inf + $y -> bpi($scale) -> bmul("-0.5"); # -pi/2 + } else { # -inf < y < inf + $y -> bdiv($x, $scale) -> batan($scale); # atan(y/x) + } + } elsif ($x < 0) { # -inf < x < 0 + my $pi = $class -> bpi($scale); + if ($y >= 0) { # y >= 0 + $y -> bdiv($x, $scale) -> batan() # atan(y/x) + pi + -> badd($pi); + } else { # y < 0 + $y -> bdiv($x, $scale) -> batan() # atan(y/x) - pi + -> bsub($pi); + } + } else { # x = 0 + if ($y > 0) { # y > 0 + $y -> bpi($scale) -> bmul("0.5"); # pi/2 + } elsif ($y < 0) { # y < 0 + $y -> bpi($scale) -> bmul("-0.5"); # -pi/2 + } else { # y = 0 + return $y -> bzero(@r); # 0 + } + } + + $y -> round(@r); + + if ($fallback) { + delete $y->{_a}; + delete $y->{_p}; + } + + return $y; +} +############################################################################## + +sub bsqrt { + # calculate square root + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('bsqrt'); + + return $x->bnan() if $x->{sign} !~ /^[+]/; # NaN, -inf or < 0 + return $x if $x->{sign} eq '+inf'; # sqrt(inf) == inf + return $x->round($a, $p, $r) if $x->is_zero() || $x->is_one(); + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my (@params, $scale); + ($x, @params) = $x->_find_round_parameters($a, $p, $r); + + return $x if $x->is_nan(); # error in _find_round_parameters? + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; + delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI + + my $i = $MBI->_copy($x->{_m}); + $i = $MBI->_lsft($i, $x->{_e}, 10) unless $MBI->_is_zero($x->{_e}); + my $xas = Math::BigInt->bzero(); + $xas->{value} = $i; + + my $gs = $xas->copy()->bsqrt(); # some guess + + if (($x->{_es} ne '-') # guess can't be accurate if there are + # digits after the dot + && ($xas->bacmp($gs * $gs) == 0)) # guess hit the nail on the head? + { + # exact result, copy result over to keep $x + $x->{_m} = $gs->{value}; + $x->{_e} = $MBI->_zero(); + $x->{_es} = '+'; + $x->bnorm(); + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # re-enable A and P, upgrade is taken care of by "local" + ${"$class\::accuracy"} = $ab; + ${"$class\::precision"} = $pb; + return $x; + } + + # sqrt(2) = 1.4 because sqrt(2*100) = 1.4*10; so we can increase the accuracy + # of the result by multiplying the input by 100 and then divide the integer + # result of sqrt(input) by 10. Rounding afterwards returns the real result. + + # The following steps will transform 123.456 (in $x) into 123456 (in $y1) + my $y1 = $MBI->_copy($x->{_m}); + + my $length = $MBI->_len($y1); + + # Now calculate how many digits the result of sqrt(y1) would have + my $digits = int($length / 2); + + # But we need at least $scale digits, so calculate how many are missing + my $shift = $scale - $digits; + + # This happens if the input had enough digits + # (we take care of integer guesses above) + $shift = 0 if $shift < 0; + + # Multiply in steps of 100, by shifting left two times the "missing" digits + my $s2 = $shift * 2; + + # We now make sure that $y1 has the same odd or even number of digits than + # $x had. So when _e of $x is odd, we must shift $y1 by one digit left, + # because we always must multiply by steps of 100 (sqrt(100) is 10) and not + # steps of 10. The length of $x does not count, since an even or odd number + # of digits before the dot is not changed by adding an even number of digits + # after the dot (the result is still odd or even digits long). + $s2++ if $MBI->_is_odd($x->{_e}); + + $y1 = $MBI->_lsft($y1, $MBI->_new($s2), 10); + + # now take the square root and truncate to integer + $y1 = $MBI->_sqrt($y1); + + # By "shifting" $y1 right (by creating a negative _e) we calculate the final + # result, which is than later rounded to the desired scale. + + # calculate how many zeros $x had after the '.' (or before it, depending + # on sign of $dat, the result should have half as many: + my $dat = $MBI->_num($x->{_e}); + $dat = -$dat if $x->{_es} eq '-'; + $dat += $length; + + if ($dat > 0) { + # no zeros after the dot (e.g. 1.23, 0.49 etc) + # preserve half as many digits before the dot than the input had + # (but round this "up") + $dat = int(($dat+1)/2); + } else { + $dat = int(($dat)/2); + } + $dat -= $MBI->_len($y1); + if ($dat < 0) { + $dat = abs($dat); + $x->{_e} = $MBI->_new($dat); + $x->{_es} = '-'; + } else { + $x->{_e} = $MBI->_new($dat); + $x->{_es} = '+'; + } + $x->{_m} = $y1; + $x->bnorm(); + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + $x; +} + +sub broot { + # calculate $y'th root of $x + + # set up parameters + my ($class, $x, $y, $a, $p, $r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $a, $p, $r) = objectify(2, @_); + } + + return $x if $x->modify('broot'); + + # NaN handling: $x ** 1/0, x or y NaN, or y inf/-inf or y == 0 + return $x->bnan() if $x->{sign} !~ /^\+/ || $y->is_zero() || + $y->{sign} !~ /^\+$/; + + return $x if $x->is_zero() || $x->is_one() || $x->is_inf() || $y->is_one(); + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my (@params, $scale); + ($x, @params) = $x->_find_round_parameters($a, $p, $r); + + return $x if $x->is_nan(); # error in _find_round_parameters? + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; + delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; # should be really parent class vs MBI + + # remember sign and make $x positive, since -4 ** (1/2) => -2 + my $sign = 0; + $sign = 1 if $x->{sign} eq '-'; + $x->{sign} = '+'; + + my $is_two = 0; + if ($y->isa('Math::BigFloat')) { + $is_two = ($y->{sign} eq '+' && $MBI->_is_two($y->{_m}) && $MBI->_is_zero($y->{_e})); + } else { + $is_two = ($y == 2); + } + + # normal square root if $y == 2: + if ($is_two) { + $x->bsqrt($scale+4); + } elsif ($y->is_one('-')) { + # $x ** -1 => 1/$x + my $u = $class->bone()->bdiv($x, $scale); + # copy private parts over + $x->{_m} = $u->{_m}; + $x->{_e} = $u->{_e}; + $x->{_es} = $u->{_es}; + } else { + # calculate the broot() as integer result first, and if it fits, return + # it rightaway (but only if $x and $y are integer): + + my $done = 0; # not yet + if ($y->is_int() && $x->is_int()) { + my $i = $MBI->_copy($x->{_m}); + $i = $MBI->_lsft($i, $x->{_e}, 10) unless $MBI->_is_zero($x->{_e}); + my $int = Math::BigInt->bzero(); + $int->{value} = $i; + $int->broot($y->as_number()); + # if ($exact) + if ($int->copy()->bpow($y) == $x) { + # found result, return it + $x->{_m} = $int->{value}; + $x->{_e} = $MBI->_zero(); + $x->{_es} = '+'; + $x->bnorm(); + $done = 1; + } + } + if ($done == 0) { + my $u = $class->bone()->bdiv($y, $scale+4); + delete $u->{_a}; delete $u->{_p}; # otherwise it conflicts + $x->bpow($u, $scale+4); # el cheapo + } + } + $x->bneg() if $sign == 1; + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + $x; +} + +sub bfac { + # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT + # compute factorial number, modifies first argument + + # set up parameters + my ($class, $x, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + ($class, $x, @r) = objectify(1, @_) if !ref($x); + + # inf => inf + return $x if $x->modify('bfac') || $x->{sign} eq '+inf'; + + return $x->bnan() + if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN + ($x->{_es} ne '+')); # digits after dot? + + if (! $MBI->_is_zero($x->{_e})) { + $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e}, 10); # change 12e1 to 120e0 + $x->{_e} = $MBI->_zero(); # normalize + $x->{_es} = '+'; + } + $x->{_m} = $MBI->_fac($x->{_m}); # calculate factorial + $x->bnorm()->round(@r); # norm again and round result +} + +sub bdfac { + # compute double factorial + + # set up parameters + my ($class, $x, @r) = (ref($_[0]), @_); + # objectify is costly, so avoid it + ($class, $x, @r) = objectify(1, @_) if !ref($x); + + # inf => inf + return $x if $x->modify('bfac') || $x->{sign} eq '+inf'; + + return $x->bnan() + if (($x->{sign} ne '+') || # inf, NaN, <0 etc => NaN + ($x->{_es} ne '+')); # digits after dot? + + Carp::croak("bdfac() requires a newer version of the $MBI library.") + unless $MBI->can('_dfac'); + + if (! $MBI->_is_zero($x->{_e})) { + $x->{_m} = $MBI->_lsft($x->{_m}, $x->{_e}, 10); # change 12e1 to 120e0 + $x->{_e} = $MBI->_zero(); # normalize + $x->{_es} = '+'; + } + $x->{_m} = $MBI->_dfac($x->{_m}); # calculate factorial + $x->bnorm()->round(@r); # norm again and round result +} + +sub blsft { + # shift left by $y (multiply by $b ** $y) + + # set up parameters + my ($class, $x, $y, $b, $a, $p, $r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $b, $a, $p, $r) = objectify(2, @_); + } + + return $x if $x -> modify('blsft'); + return $x if $x -> {sign} !~ /^[+-]$/; # nan, +inf, -inf + + $b = 2 if !defined $b; + $b = $class -> new($b) unless ref($b) && $b -> isa($class); + + return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan(); + + # shift by a negative amount? + return $x -> brsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/; + + $x -> bmul($b -> bpow($y), $a, $p, $r, $y); +} + +sub brsft { + # shift right by $y (divide $b ** $y) + + # set up parameters + my ($class, $x, $y, $b, $a, $p, $r) = (ref($_[0]), @_); + + # objectify is costly, so avoid it + if ((!ref($_[0])) || (ref($_[0]) ne ref($_[1]))) { + ($class, $x, $y, $b, $a, $p, $r) = objectify(2, @_); + } + + return $x if $x -> modify('brsft'); + return $x if $x -> {sign} !~ /^[+-]$/; # nan, +inf, -inf + + $b = 2 if !defined $b; + $b = $class -> new($b) unless ref($b) && $b -> isa($class); + + return $x -> bnan() if $x -> is_nan() || $y -> is_nan() || $b -> is_nan(); + + # shift by a negative amount? + return $x -> blsft($y -> copy() -> babs(), $b) if $y -> {sign} =~ /^-/; + + # the following call to bdiv() will return either quotient (scalar context) + # or quotient and remainder (list context). + $x -> bdiv($b -> bpow($y), $a, $p, $r, $y); +} + +############################################################################### +# Bitwise methods +############################################################################### + +sub band { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'band() is an instance method, not a class method' unless $xref; + Carp::croak 'Not enough arguments for band()' if @_ < 1; + + return if $x -> modify('band'); + + my $y = shift; + $y = $class -> new($y) unless ref($y); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> band($y); + $xtmp = $class -> new($xtmp); # back to Math::BigFloat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_m} = $xtmp -> {_m}; + $x -> {_es} = $xtmp -> {_es}; + $x -> {_e} = $xtmp -> {_e}; + + return $x -> round(@r); +} + +sub bior { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'bior() is an instance method, not a class method' unless $xref; + Carp::croak 'Not enough arguments for bior()' if @_ < 1; + + return if $x -> modify('bior'); + + my $y = shift; + $y = $class -> new($y) unless ref($y); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> bior($y); + $xtmp = $class -> new($xtmp); # back to Math::BigFloat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_m} = $xtmp -> {_m}; + $x -> {_es} = $xtmp -> {_es}; + $x -> {_e} = $xtmp -> {_e}; + + return $x -> round(@r); +} + +sub bxor { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'bxor() is an instance method, not a class method' unless $xref; + Carp::croak 'Not enough arguments for bxor()' if @_ < 1; + + return if $x -> modify('bxor'); + + my $y = shift; + $y = $class -> new($y) unless ref($y); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> bxor($y); + $xtmp = $class -> new($xtmp); # back to Math::BigFloat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_m} = $xtmp -> {_m}; + $x -> {_es} = $xtmp -> {_es}; + $x -> {_e} = $xtmp -> {_e}; + + return $x -> round(@r); +} + +sub bnot { + my $x = shift; + my $xref = ref($x); + my $class = $xref || $x; + + Carp::croak 'bnot() is an instance method, not a class method' unless $xref; + + return if $x -> modify('bnot'); + + my @r = @_; + + my $xtmp = Math::BigInt -> new($x -> bint()); # to Math::BigInt + $xtmp -> bnot(); + $xtmp = $class -> new($xtmp); # back to Math::BigFloat + + $x -> {sign} = $xtmp -> {sign}; + $x -> {_m} = $xtmp -> {_m}; + $x -> {_es} = $xtmp -> {_es}; + $x -> {_e} = $xtmp -> {_e}; + + return $x -> round(@r); +} + +############################################################################### +# Rounding methods +############################################################################### + +sub bround { + # accuracy: preserve $N digits, and overwrite the rest with 0's + my $x = shift; + my $class = ref($x) || $x; + $x = $class->new(shift) if !ref($x); + + if (($_[0] || 0) < 0) { + Carp::croak('bround() needs positive accuracy'); + } + + my ($scale, $mode) = $x->_scale_a(@_); + return $x if !defined $scale || $x->modify('bround'); # no-op + + # scale is now either $x->{_a}, $accuracy, or the user parameter + # test whether $x already has lower accuracy, do nothing in this case + # but do round if the accuracy is the same, since a math operation might + # want to round a number with A=5 to 5 digits afterwards again + return $x if defined $x->{_a} && $x->{_a} < $scale; + + # scale < 0 makes no sense + # scale == 0 => keep all digits + # never round a +-inf, NaN + return $x if ($scale <= 0) || $x->{sign} !~ /^[+-]$/; + + # 1: never round a 0 + # 2: if we should keep more digits than the mantissa has, do nothing + if ($x->is_zero() || $MBI->_len($x->{_m}) <= $scale) { + $x->{_a} = $scale if !defined $x->{_a} || $x->{_a} > $scale; + return $x; + } + + # pass sign to bround for '+inf' and '-inf' rounding modes + my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt'; + + $m->bround($scale, $mode); # round mantissa + $x->{_m} = $m->{value}; # get our mantissa back + $x->{_a} = $scale; # remember rounding + delete $x->{_p}; # and clear P + $x->bnorm(); # del trailing zeros gen. by bround() +} + +sub bfround { + # precision: round to the $Nth digit left (+$n) or right (-$n) from the '.' + # $n == 0 means round to integer + # expects and returns normalized numbers! + my $x = shift; + my $class = ref($x) || $x; + $x = $class->new(shift) if !ref($x); + + my ($scale, $mode) = $x->_scale_p(@_); + return $x if !defined $scale || $x->modify('bfround'); # no-op + + # never round a 0, +-inf, NaN + if ($x->is_zero()) { + $x->{_p} = $scale if !defined $x->{_p} || $x->{_p} < $scale; # -3 < -2 + return $x; + } + return $x if $x->{sign} !~ /^[+-]$/; + + # don't round if x already has lower precision + return $x if (defined $x->{_p} && $x->{_p} < 0 && $scale < $x->{_p}); + + $x->{_p} = $scale; # remember round in any case + delete $x->{_a}; # and clear A + if ($scale < 0) { + # round right from the '.' + + return $x if $x->{_es} eq '+'; # e >= 0 => nothing to round + + $scale = -$scale; # positive for simplicity + my $len = $MBI->_len($x->{_m}); # length of mantissa + + # the following poses a restriction on _e, but if _e is bigger than a + # scalar, you got other problems (memory etc) anyway + my $dad = -(0+ ($x->{_es}.$MBI->_num($x->{_e}))); # digits after dot + my $zad = 0; # zeros after dot + $zad = $dad - $len if (-$dad < -$len); # for 0.00..00xxx style + + # print "scale $scale dad $dad zad $zad len $len\n"; + # number bsstr len zad dad + # 0.123 123e-3 3 0 3 + # 0.0123 123e-4 3 1 4 + # 0.001 1e-3 1 2 3 + # 1.23 123e-2 3 0 2 + # 1.2345 12345e-4 5 0 4 + + # do not round after/right of the $dad + return $x if $scale > $dad; # 0.123, scale >= 3 => exit + + # round to zero if rounding inside the $zad, but not for last zero like: + # 0.0065, scale -2, round last '0' with following '65' (scale == zad case) + return $x->bzero() if $scale < $zad; + if ($scale == $zad) # for 0.006, scale -3 and trunc + { + $scale = -$len; + } else { + # adjust round-point to be inside mantissa + if ($zad != 0) { + $scale = $scale-$zad; + } else { + my $dbd = $len - $dad; + $dbd = 0 if $dbd < 0; # digits before dot + $scale = $dbd+$scale; + } + } + } else { + # round left from the '.' + + # 123 => 100 means length(123) = 3 - $scale (2) => 1 + + my $dbt = $MBI->_len($x->{_m}); + # digits before dot + my $dbd = $dbt + ($x->{_es} . $MBI->_num($x->{_e})); + # should be the same, so treat it as this + $scale = 1 if $scale == 0; + # shortcut if already integer + return $x if $scale == 1 && $dbt <= $dbd; + # maximum digits before dot + ++$dbd; + + if ($scale > $dbd) { + # not enough digits before dot, so round to zero + return $x->bzero; + } elsif ($scale == $dbd) { + # maximum + $scale = -$dbt; + } else { + $scale = $dbd - $scale; + } + } + # pass sign to bround for rounding modes '+inf' and '-inf' + my $m = bless { sign => $x->{sign}, value => $x->{_m} }, 'Math::BigInt'; + $m->bround($scale, $mode); + $x->{_m} = $m->{value}; # get our mantissa back + $x->bnorm(); +} + +sub bfloor { + # round towards minus infinity + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('bfloor'); + return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf + + # if $x has digits after dot + if ($x->{_es} eq '-') { + $x->{_m} = $MBI->_rsft($x->{_m}, $x->{_e}, 10); # cut off digits after dot + $x->{_e} = $MBI->_zero(); # trunc/norm + $x->{_es} = '+'; # abs e + $x->{_m} = $MBI->_inc($x->{_m}) if $x->{sign} eq '-'; # increment if negative + } + $x->round($a, $p, $r); +} + +sub bceil { + # round towards plus infinity + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('bceil'); + return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf + + # if $x has digits after dot + if ($x->{_es} eq '-') { + $x->{_m} = $MBI->_rsft($x->{_m}, $x->{_e}, 10); # cut off digits after dot + $x->{_e} = $MBI->_zero(); # trunc/norm + $x->{_es} = '+'; # abs e + if ($x->{sign} eq '+') { + $x->{_m} = $MBI->_inc($x->{_m}); # increment if positive + } else { + $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # avoid -0 + } + } + $x->round($a, $p, $r); +} + +sub bint { + # round towards zero + my ($class, $x, $a, $p, $r) = ref($_[0]) ? (ref($_[0]), @_) : objectify(1, @_); + + return $x if $x->modify('bint'); + return $x if $x->{sign} !~ /^[+-]$/; # nan, +inf, -inf + + # if $x has digits after the decimal point + if ($x->{_es} eq '-') { + $x->{_m} = $MBI->_rsft($x->{_m}, $x->{_e}, 10); # cut off digits after dot + $x->{_e} = $MBI->_zero(); # truncate/normalize + $x->{_es} = '+'; # abs e + $x->{sign} = '+' if $MBI->_is_zero($x->{_m}); # avoid -0 + } + $x->round($a, $p, $r); +} + +############################################################################### +# Other mathematical methods +############################################################################### + +sub bgcd { + # (BINT or num_str, BINT or num_str) return BINT + # does not modify arguments, but returns new object + + unshift @_, __PACKAGE__ + unless ref($_[0]) || $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i; + + my ($class, @args) = objectify(0, @_); + + my $x = shift @args; + $x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x); + return $class->bnan() unless $x -> is_int(); + + while (@args) { + my $y = shift @args; + $y = $class->new($y) unless ref($y) && $y -> isa($class); + return $class->bnan() unless $y -> is_int(); + + # greatest common divisor + while (! $y->is_zero()) { + ($x, $y) = ($y->copy(), $x->copy()->bmod($y)); + } + + last if $x -> is_one(); + } + return $x -> babs(); +} + +sub blcm { + # (BFLOAT or num_str, BFLOAT or num_str) return BFLOAT + # does not modify arguments, but returns new object + # Least Common Multiple + + unshift @_, __PACKAGE__ + unless ref($_[0]) || $_[0] =~ /^[a-z]\w*(?:::[a-z]\w*)*$/i; + + my ($class, @args) = objectify(0, @_); + + my $x = shift @args; + $x = ref($x) && $x -> isa($class) ? $x -> copy() : $class -> new($x); + return $class->bnan() if $x->{sign} !~ /^[+-]$/; # x NaN? + + while (@args) { + my $y = shift @args; + $y = $class -> new($y) unless ref($y) && $y -> isa($class); + return $x->bnan() unless $y -> is_int(); + my $gcd = $x -> bgcd($y); + $x -> bdiv($gcd) -> bmul($y); + } + + return $x -> babs(); +} + +############################################################################### +# Object property methods +############################################################################### + +sub length { + my $x = shift; + my $class = ref($x) || $x; + $x = $class->new(shift) unless ref($x); + + return 1 if $MBI->_is_zero($x->{_m}); + + my $len = $MBI->_len($x->{_m}); + $len += $MBI->_num($x->{_e}) if $x->{_es} eq '+'; + if (wantarray()) { + my $t = 0; + $t = $MBI->_num($x->{_e}) if $x->{_es} eq '-'; + return ($len, $t); + } + $len; +} + +sub mantissa { + # return a copy of the mantissa + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { + my $s = $x->{sign}; + $s =~ s/^[+]//; + return Math::BigInt->new($s, undef, undef); # -inf, +inf => +inf + } + my $m = Math::BigInt->new($MBI->_str($x->{_m}), undef, undef); + $m->bneg() if $x->{sign} eq '-'; + + $m; +} + +sub exponent { + # return a copy of the exponent + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { + my $s = $x->{sign}; +$s =~ s/^[+-]//; + return Math::BigInt->new($s, undef, undef); # -inf, +inf => +inf + } + Math::BigInt->new($x->{_es} . $MBI->_str($x->{_e}), undef, undef); +} + +sub parts { + # return a copy of both the exponent and the mantissa + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { + my $s = $x->{sign}; +$s =~ s/^[+]//; +my $se = $s; +$se =~ s/^[-]//; + return ($class->new($s), $class->new($se)); # +inf => inf and -inf, +inf => inf + } + my $m = Math::BigInt->bzero(); + $m->{value} = $MBI->_copy($x->{_m}); + $m->bneg() if $x->{sign} eq '-'; + ($m, Math::BigInt->new($x->{_es} . $MBI->_num($x->{_e}))); +} + +sub sparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("sparts() is an instance method, not a class method") + unless $class; + + # Not-a-number. + + if ($self -> is_nan()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> bnan(); # exponent + return ($mant, $expo); # list context + } + + # Infinity. + + if ($self -> is_inf()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> binf('+'); # exponent + return ($mant, $expo); # list context + } + + # Finite number. + + my $mant = $class -> bzero(); + $mant -> {sign} = $self -> {sign}; + $mant -> {_m} = $MBI->_copy($self -> {_m}); + return $mant unless wantarray; + + my $expo = $class -> bzero(); + $expo -> {sign} = $self -> {_es}; + $expo -> {_m} = $MBI->_copy($self -> {_e}); + + return ($mant, $expo); +} + +sub nparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("nparts() is an instance method, not a class method") + unless $class; + + # Not-a-number. + + if ($self -> is_nan()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> bnan(); # exponent + return ($mant, $expo); # list context + } + + # Infinity. + + if ($self -> is_inf()) { + my $mant = $self -> copy(); # mantissa + return $mant unless wantarray; # scalar context + my $expo = $class -> binf('+'); # exponent + return ($mant, $expo); # list context + } + + # Finite number. + + my ($mant, $expo) = $self -> sparts(); + + if ($mant -> bcmp(0)) { + my ($ndigtot, $ndigfrac) = $mant -> length(); + my $expo10adj = $ndigtot - $ndigfrac - 1; + + if ($expo10adj != 0) { + my $factor = "1e" . -$expo10adj; + $mant -> bmul($factor); + return $mant unless wantarray; + $expo -> badd($expo10adj); + return ($mant, $expo); + } + } + + return $mant unless wantarray; + return ($mant, $expo); +} + +sub eparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("eparts() is an instance method, not a class method") + unless $class; + + # Not-a-number and Infinity. + + return $self -> sparts() if $self -> is_nan() || $self -> is_inf(); + + # Finite number. + + my ($mant, $expo) = $self -> nparts(); + + my $c = $expo -> copy() -> bmod(3); + $mant -> blsft($c, 10); + return $mant unless wantarray; + + $expo -> bsub($c); + return ($mant, $expo); +} + +sub dparts { + my $self = shift; + my $class = ref $self; + + Carp::croak("dparts() is an instance method, not a class method") + unless $class; + + # Not-a-number and Infinity. + + if ($self -> is_nan() || $self -> is_inf()) { + my $int = $self -> copy(); + return $int unless wantarray; + my $frc = $class -> bzero(); + return ($int, $frc); + } + + my $int = $self -> copy(); + my $frc = $class -> bzero(); + + # If the input has a fraction part. + + if ($int->{_es} eq '-') { + $int->{_m} = $MBI -> _rsft($int->{_m}, $int->{_e}, 10); + $int->{_e} = $MBI -> _zero(); + $int->{_es} = '+'; + $int->{sign} = '+' if $MBI->_is_zero($int->{_m}); # avoid -0 + + return $int unless wantarray; + $frc = $self -> copy() -> bsub($int); + return ($int, $frc); + } + + return $int unless wantarray; + return ($int, $frc); +} + +############################################################################### +# String conversion methods +############################################################################### + +sub bstr { + # (ref to BFLOAT or num_str) return num_str + # Convert number from internal format to (non-scientific) string format. + # internal format is always normalized (no leading zeros, "-0" => "+0") + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x->{sign} !~ /^[+-]$/) { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my $es = '0'; +my $len = 1; +my $cad = 0; +my $dot = '.'; + + # $x is zero? + my $not_zero = !($x->{sign} eq '+' && $MBI->_is_zero($x->{_m})); + if ($not_zero) { + $es = $MBI->_str($x->{_m}); + $len = CORE::length($es); + my $e = $MBI->_num($x->{_e}); + $e = -$e if $x->{_es} eq '-'; + if ($e < 0) { + $dot = ''; + # if _e is bigger than a scalar, the following will blow your memory + if ($e <= -$len) { + my $r = abs($e) - $len; + $es = '0.'. ('0' x $r) . $es; + $cad = -($len+$r); + } else { + substr($es, $e, 0) = '.'; + $cad = $MBI->_num($x->{_e}); + $cad = -$cad if $x->{_es} eq '-'; + } + } elsif ($e > 0) { + # expand with zeros + $es .= '0' x $e; +$len += $e; +$cad = 0; + } + } # if not zero + + $es = '-'.$es if $x->{sign} eq '-'; + # if set accuracy or precision, pad with zeros on the right side + if ((defined $x->{_a}) && ($not_zero)) { + # 123400 => 6, 0.1234 => 4, 0.001234 => 4 + my $zeros = $x->{_a} - $cad; # cad == 0 => 12340 + $zeros = $x->{_a} - $len if $cad != $len; + $es .= $dot.'0' x $zeros if $zeros > 0; + } elsif ((($x->{_p} || 0) < 0)) { + # 123400 => 6, 0.1234 => 4, 0.001234 => 6 + my $zeros = -$x->{_p} + $cad; + $es .= $dot.'0' x $zeros if $zeros > 0; + } + $es; +} + +# Decimal notation, e.g., "12345.6789". + +sub bdstr { + my $x = shift; + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my $mant = $MBI->_str($x->{_m}); + my $expo = $x -> exponent(); + + my $str = $mant; + if ($expo >= 0) { + $str .= "0" x $expo; + } else { + my $mantlen = CORE::length($mant); + my $c = $mantlen + $expo; + $str = "0" x (1 - $c) . $str if $c <= 0; + substr($str, $expo, 0) = '.'; + } + + return $x->{sign} eq '-' ? "-$str" : $str; +} + +# Scientific notation with significand/mantissa as an integer, e.g., "12345.6789" +# is written as "123456789e-4". + +sub bsstr { + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my $str = $MBI->_str($x->{_m}) . 'e' . $x->{_es}. $MBI->_str($x->{_e}); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +# Normalized notation, e.g., "12345.6789" is written as "1.23456789e+4". + +sub bnstr { + my $x = shift; + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my ($mant, $expo) = $x -> nparts(); + + my $esgn = $expo < 0 ? '-' : '+'; + my $eabs = $expo -> babs() -> bfround(0) -> bstr(); + #$eabs = '0' . $eabs if length($eabs) < 2; + + return $mant . 'e' . $esgn . $eabs; +} + +# Engineering notation, e.g., "12345.6789" is written as "12.3456789e+3". + +sub bestr { + my $x = shift; + + if ($x->{sign} ne '+' && $x->{sign} ne '-') { + return $x->{sign} unless $x->{sign} eq '+inf'; # -inf, NaN + return 'inf'; # +inf + } + + my ($mant, $expo) = $x -> eparts(); + + my $esgn = $expo < 0 ? '-' : '+'; + my $eabs = $expo -> babs() -> bfround(0) -> bstr(); + #$eabs = '0' . $eabs if length($eabs) < 2; + + return $mant . 'e' . $esgn . $eabs; +} + +sub to_hex { + # return number as hexadecimal string (only for integers defined) + + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + return '0' if $x->is_zero(); + + return $nan if $x->{_es} ne '+'; # how to do 1e-1 in hex? + + my $z = $MBI->_copy($x->{_m}); + if (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + my $str = $MBI->_to_hex($z); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub to_oct { + # return number as octal digit string (only for integers defined) + + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + return '0' if $x->is_zero(); + + return $nan if $x->{_es} ne '+'; # how to do 1e-1 in octal? + + my $z = $MBI->_copy($x->{_m}); + if (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + my $str = $MBI->_to_oct($z); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub to_bin { + # return number as binary digit string (only for integers defined) + + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + return '0' if $x->is_zero(); + + return $nan if $x->{_es} ne '+'; # how to do 1e-1 in binary? + + my $z = $MBI->_copy($x->{_m}); + if (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + my $str = $MBI->_to_bin($z); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub as_hex { + # return number as hexadecimal string (only for integers defined) + + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + return '0x0' if $x->is_zero(); + + return $nan if $x->{_es} ne '+'; # how to do 1e-1 in hex? + + my $z = $MBI->_copy($x->{_m}); + if (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + my $str = $MBI->_as_hex($z); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub as_oct { + # return number as octal digit string (only for integers defined) + + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + return '00' if $x->is_zero(); + + return $nan if $x->{_es} ne '+'; # how to do 1e-1 in octal? + + my $z = $MBI->_copy($x->{_m}); + if (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + my $str = $MBI->_as_oct($z); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub as_bin { + # return number as binary digit string (only for integers defined) + + my ($class, $x) = ref($_[0]) ? (ref($_[0]), $_[0]) : objectify(1, @_); + + return $x->bstr() if $x->{sign} !~ /^[+-]$/; # inf, nan etc + return '0b0' if $x->is_zero(); + + return $nan if $x->{_es} ne '+'; # how to do 1e-1 in binary? + + my $z = $MBI->_copy($x->{_m}); + if (! $MBI->_is_zero($x->{_e})) { # > 0 + $z = $MBI->_lsft($z, $x->{_e}, 10); + } + my $str = $MBI->_as_bin($z); + return $x->{sign} eq '-' ? "-$str" : $str; +} + +sub numify { + # Make a Perl scalar number from a Math::BigFloat object. + my ($class, $x) = ref($_[0]) ? (undef, $_[0]) : objectify(1, @_); + + if ($x -> is_nan()) { + require Math::Complex; + my $inf = Math::Complex::Inf(); + return $inf - $inf; + } + + if ($x -> is_inf()) { + require Math::Complex; + my $inf = Math::Complex::Inf(); + return $x -> is_negative() ? -$inf : $inf; + } + + # Create a string and let Perl's atoi()/atof() handle the rest. + return 0 + $x -> bsstr(); +} + +############################################################################### +# Private methods and functions. +############################################################################### + +sub import { + my $class = shift; + my $l = scalar @_; + my $lib = ''; +my @a; + my $lib_kind = 'try'; + $IMPORT=1; + for (my $i = 0; $i < $l ; $i++) { + if ($_[$i] eq ':constant') { + # This causes overlord er load to step in. 'binary' and 'integer' + # are handled by BigInt. + overload::constant float => sub { $class->new(shift); }; + } elsif ($_[$i] eq 'upgrade') { + # this causes upgrading + $upgrade = $_[$i+1]; # or undef to disable + $i++; + } elsif ($_[$i] eq 'downgrade') { + # this causes downgrading + $downgrade = $_[$i+1]; # or undef to disable + $i++; + } elsif ($_[$i] =~ /^(lib|try|only)\z/) { + # alternative library + $lib = $_[$i+1] || ''; # default Calc + $lib_kind = $1; # lib, try or only + $i++; + } elsif ($_[$i] eq 'with') { + # alternative class for our private parts() + # XXX: no longer supported + # $MBI = $_[$i+1] || 'Math::BigInt'; + $i++; + } else { + push @a, $_[$i]; + } + } + + $lib =~ tr/a-zA-Z0-9,://cd; # restrict to sane characters + # let use Math::BigInt lib => 'GMP'; use Math::BigFloat; still work + my $mbilib = eval { Math::BigInt->config('lib') }; + if ((defined $mbilib) && ($MBI eq 'Math::BigInt::Calc')) { + # MBI already loaded + Math::BigInt->import($lib_kind, "$lib, $mbilib", 'objectify'); + } else { + # MBI not loaded, or with ne "Math::BigInt::Calc" + $lib .= ",$mbilib" if defined $mbilib; + $lib =~ s/^,//; # don't leave empty + + # replacement library can handle lib statement, but also could ignore it + + # Perl < 5.6.0 dies with "out of memory!" when eval() and ':constant' is + # used in the same script, or eval inside import(). So we require MBI: + require Math::BigInt; + Math::BigInt->import($lib_kind => $lib, 'objectify'); + } + if ($@) { + Carp::croak("Couldn't load $lib: $! $@"); + } + # find out which one was actually loaded + $MBI = Math::BigInt->config('lib'); + + # register us with MBI to get notified of future lib changes + Math::BigInt::_register_callback($class, sub { $MBI = $_[0]; }); + + $class->export_to_level(1, $class, @a); # export wanted functions +} + +sub _len_to_steps { + # Given D (digits in decimal), compute N so that N! (N factorial) is + # at least D digits long. D should be at least 50. + my $d = shift; + + # two constants for the Ramanujan estimate of ln(N!) + my $lg2 = log(2 * 3.14159265) / 2; + my $lg10 = log(10); + + # D = 50 => N => 42, so L = 40 and R = 50 + my $l = 40; +my $r = $d; + + # Otherwise this does not work under -Mbignum and we do not yet have "no bignum;" :( + $l = $l->numify if ref($l); + $r = $r->numify if ref($r); + $lg2 = $lg2->numify if ref($lg2); + $lg10 = $lg10->numify if ref($lg10); + + # binary search for the right value (could this be written as the reverse of lg(n!)?) + while ($r - $l > 1) { + my $n = int(($r - $l) / 2) + $l; + my $ramanujan = + int(($n * log($n) - $n + log($n * (1 + 4*$n*(1+2*$n))) / 6 + $lg2) / $lg10); + $ramanujan > $d ? $r = $n : $l = $n; + } + $l; +} + +sub _log { + # internal log function to calculate ln() based on Taylor series. + # Modifies $x in place. + my ($class, $x, $scale) = @_; + + # in case of $x == 1, result is 0 + return $x->bzero() if $x->is_one(); + + # XXX TODO: rewrite this in a similar manner to bexp() + + # http://www.efunda.com/math/taylor_series/logarithmic.cfm?search_string=log + + # u = x-1, v = x+1 + # _ _ + # Taylor: | u 1 u^3 1 u^5 | + # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 0 + # |_ v 3 v^3 5 v^5 _| + + # This takes much more steps to calculate the result and is thus not used + # u = x-1 + # _ _ + # Taylor: | u 1 u^2 1 u^3 | + # ln (x) = 2 | --- + - * --- + - * --- + ... | x > 1/2 + # |_ x 2 x^2 3 x^3 _| + + my ($limit, $v, $u, $below, $factor, $two, $next, $over, $f); + + $v = $x->copy(); $v->binc(); # v = x+1 + $x->bdec(); $u = $x->copy(); # u = x-1; x = x-1 + $x->bdiv($v, $scale); # first term: u/v + $below = $v->copy(); + $over = $u->copy(); + $u *= $u; $v *= $v; # u^2, v^2 + $below->bmul($v); # u^3, v^3 + $over->bmul($u); + $factor = $class->new(3); $f = $class->new(2); + + my $steps = 0; + $limit = $class->new("1E-". ($scale-1)); + while (3 < 5) { + # we calculate the next term, and add it to the last + # when the next term is below our limit, it won't affect the outcome + # anymore, so we stop + + # calculating the next term simple from over/below will result in quite + # a time hog if the input has many digits, since over and below will + # accumulate more and more digits, and the result will also have many + # digits, but in the end it is rounded to $scale digits anyway. So if we + # round $over and $below first, we save a lot of time for the division + # (not with log(1.2345), but try log (123**123) to see what I mean. This + # can introduce a rounding error if the division result would be f.i. + # 0.1234500000001 and we round it to 5 digits it would become 0.12346, but + # if we truncated $over and $below we might get 0.12345. Does this matter + # for the end result? So we give $over and $below 4 more digits to be + # on the safe side (unscientific error handling as usual... :+D + + $next = $over->copy()->bround($scale+4) + ->bdiv($below->copy()->bmul($factor)->bround($scale+4), + $scale); + + ## old version: + ## $next = $over->copy()->bdiv($below->copy()->bmul($factor), $scale); + + last if $next->bacmp($limit) <= 0; + + delete $next->{_a}; + delete $next->{_p}; + $x->badd($next); + # calculate things for the next term + $over *= $u; + $below *= $v; + $factor->badd($f); + if (DEBUG) { + $steps++; + print "step $steps = $x\n" if $steps % 10 == 0; + } + } + print "took $steps steps\n" if DEBUG; + $x->bmul($f); # $x *= 2 +} + +sub _log_10 { + # Internal log function based on reducing input to the range of 0.1 .. 9.99 + # and then "correcting" the result to the proper one. Modifies $x in place. + my ($class, $x, $scale) = @_; + + # Taking blog() from numbers greater than 10 takes a *very long* time, so we + # break the computation down into parts based on the observation that: + # blog(X*Y) = blog(X) + blog(Y) + # We set Y here to multiples of 10 so that $x becomes below 1 - the smaller + # $x is the faster it gets. Since 2*$x takes about 10 times as + # long, we make it faster by about a factor of 100 by dividing $x by 10. + + # The same observation is valid for numbers smaller than 0.1, e.g. computing + # log(1) is fastest, and the further away we get from 1, the longer it takes. + # So we also 'break' this down by multiplying $x with 10 and subtract the + # log(10) afterwards to get the correct result. + + # To get $x even closer to 1, we also divide by 2 and then use log(2) to + # correct for this. For instance if $x is 2.4, we use the formula: + # blog(2.4 * 2) == blog (1.2) + blog(2) + # and thus calculate only blog(1.2) and blog(2), which is faster in total + # than calculating blog(2.4). + + # In addition, the values for blog(2) and blog(10) are cached. + + # Calculate nr of digits before dot: + my $dbd = $MBI->_num($x->{_e}); + $dbd = -$dbd if $x->{_es} eq '-'; + $dbd += $MBI->_len($x->{_m}); + + # more than one digit (e.g. at least 10), but *not* exactly 10 to avoid + # infinite recursion + + my $calc = 1; # do some calculation? + + # disable the shortcut for 10, since we need log(10) and this would recurse + # infinitely deep + if ($x->{_es} eq '+' && $MBI->_is_one($x->{_e}) && $MBI->_is_one($x->{_m})) { + $dbd = 0; # disable shortcut + # we can use the cached value in these cases + if ($scale <= $LOG_10_A) { + $x->bzero(); + $x->badd($LOG_10); # modify $x in place + $calc = 0; # no need to calc, but round + } + # if we can't use the shortcut, we continue normally + } else { + # disable the shortcut for 2, since we maybe have it cached + if (($MBI->_is_zero($x->{_e}) && $MBI->_is_two($x->{_m}))) { + $dbd = 0; # disable shortcut + # we can use the cached value in these cases + if ($scale <= $LOG_2_A) { + $x->bzero(); + $x->badd($LOG_2); # modify $x in place + $calc = 0; # no need to calc, but round + } + # if we can't use the shortcut, we continue normally + } + } + + # if $x = 0.1, we know the result must be 0-log(10) + if ($calc != 0 && $x->{_es} eq '-' && $MBI->_is_one($x->{_e}) && + $MBI->_is_one($x->{_m})) { + $dbd = 0; # disable shortcut + # we can use the cached value in these cases + if ($scale <= $LOG_10_A) { + $x->bzero(); + $x->bsub($LOG_10); + $calc = 0; # no need to calc, but round + } + } + + return if $calc == 0; # already have the result + + # default: these correction factors are undef and thus not used + my $l_10; # value of ln(10) to A of $scale + my $l_2; # value of ln(2) to A of $scale + + my $two = $class->new(2); + + # $x == 2 => 1, $x == 13 => 2, $x == 0.1 => 0, $x == 0.01 => -1 + # so don't do this shortcut for 1 or 0 + if (($dbd > 1) || ($dbd < 0)) { + # convert our cached value to an object if not already (avoid doing this + # at import() time, since not everybody needs this) + $LOG_10 = $class->new($LOG_10, undef, undef) unless ref $LOG_10; + + #print "x = $x, dbd = $dbd, calc = $calc\n"; + # got more than one digit before the dot, or more than one zero after the + # dot, so do: + # log(123) == log(1.23) + log(10) * 2 + # log(0.0123) == log(1.23) - log(10) * 2 + + if ($scale <= $LOG_10_A) { + # use cached value + $l_10 = $LOG_10->copy(); # copy for mul + } else { + # else: slower, compute and cache result + # also disable downgrade for this code path + local $Math::BigFloat::downgrade = undef; + + # shorten the time to calculate log(10) based on the following: + # log(1.25 * 8) = log(1.25) + log(8) + # = log(1.25) + log(2) + log(2) + log(2) + + # first get $l_2 (and possible compute and cache log(2)) + $LOG_2 = $class->new($LOG_2, undef, undef) unless ref $LOG_2; + if ($scale <= $LOG_2_A) { + # use cached value + $l_2 = $LOG_2->copy(); # copy() for the mul below + } else { + # else: slower, compute and cache result + $l_2 = $two->copy(); + $class->_log($l_2, $scale); # scale+4, actually + $LOG_2 = $l_2->copy(); # cache the result for later + # the copy() is for mul below + $LOG_2_A = $scale; + } + + # now calculate log(1.25): + $l_10 = $class->new('1.25'); + $class->_log($l_10, $scale); # scale+4, actually + + # log(1.25) + log(2) + log(2) + log(2): + $l_10->badd($l_2); + $l_10->badd($l_2); + $l_10->badd($l_2); + $LOG_10 = $l_10->copy(); # cache the result for later + # the copy() is for mul below + $LOG_10_A = $scale; + } + $dbd-- if ($dbd > 1); # 20 => dbd=2, so make it dbd=1 + $l_10->bmul($class->new($dbd)); # log(10) * (digits_before_dot-1) + my $dbd_sign = '+'; + if ($dbd < 0) { + $dbd = -$dbd; + $dbd_sign = '-'; + } + ($x->{_e}, $x->{_es}) = + _e_sub($x->{_e}, $MBI->_new($dbd), $x->{_es}, $dbd_sign); # 123 => 1.23 + + } + + # Now: 0.1 <= $x < 10 (and possible correction in l_10) + + ### Since $x in the range 0.5 .. 1.5 is MUCH faster, we do a repeated div + ### or mul by 2 (maximum times 3, since x < 10 and x > 0.1) + + $HALF = $class->new($HALF) unless ref($HALF); + + my $twos = 0; # default: none (0 times) + while ($x->bacmp($HALF) <= 0) { # X <= 0.5 + $twos--; + $x->bmul($two); + } + while ($x->bacmp($two) >= 0) { # X >= 2 + $twos++; + $x->bdiv($two, $scale+4); # keep all digits + } + $x->bround($scale+4); + # $twos > 0 => did mul 2, < 0 => did div 2 (but we never did both) + # So calculate correction factor based on ln(2): + if ($twos != 0) { + $LOG_2 = $class->new($LOG_2, undef, undef) unless ref $LOG_2; + if ($scale <= $LOG_2_A) { + # use cached value + $l_2 = $LOG_2->copy(); # copy() for the mul below + } else { + # else: slower, compute and cache result + # also disable downgrade for this code path + local $Math::BigFloat::downgrade = undef; + $l_2 = $two->copy(); + $class->_log($l_2, $scale); # scale+4, actually + $LOG_2 = $l_2->copy(); # cache the result for later + # the copy() is for mul below + $LOG_2_A = $scale; + } + $l_2->bmul($twos); # * -2 => subtract, * 2 => add + } else { + undef $l_2; + } + + $class->_log($x, $scale); # need to do the "normal" way + $x->badd($l_10) if defined $l_10; # correct it by ln(10) + $x->badd($l_2) if defined $l_2; # and maybe by ln(2) + + # all done, $x contains now the result + $x; +} + +sub _e_add { + # Internal helper sub to take two positive integers and their signs and + # then add them. Input ($CALC, $CALC, ('+'|'-'), ('+'|'-')), output + # ($CALC, ('+'|'-')). + + my ($x, $y, $xs, $ys) = @_; + + # if the signs are equal we can add them (-5 + -3 => -(5 + 3) => -8) + if ($xs eq $ys) { + $x = $MBI->_add($x, $y); # +a + +b or -a + -b + } else { + my $a = $MBI->_acmp($x, $y); + if ($a == 0) { + # This does NOT modify $x in-place. TODO: Fix this? + $x = $MBI->_zero(); # result is 0 + $xs = '+'; + return ($x, $xs); + } + if ($a > 0) { + $x = $MBI->_sub($x, $y); # abs sub + } else { # a < 0 + $x = $MBI->_sub ($y, $x, 1); # abs sub + $xs = $ys; + } + } + + $xs = '+' if $xs eq '-' && $MBI->_is_zero($x); # no "-0" + + return ($x, $xs); +} + +sub _e_sub { + # Internal helper sub to take two positive integers and their signs and + # then subtract them. Input ($CALC, $CALC, ('+'|'-'), ('+'|'-')), + # output ($CALC, ('+'|'-')) + my ($x, $y, $xs, $ys) = @_; + + # flip sign + $ys = $ys eq '+' ? '-' : '+'; # swap sign of second operand ... + _e_add($x, $y, $xs, $ys); # ... and let _e_add() do the job +} + +sub _pow { + # Calculate a power where $y is a non-integer, like 2 ** 0.3 + my ($x, $y, @r) = @_; + my $class = ref($x); + + # if $y == 0.5, it is sqrt($x) + $HALF = $class->new($HALF) unless ref($HALF); + return $x->bsqrt(@r, $y) if $y->bcmp($HALF) == 0; + + # Using: + # a ** x == e ** (x * ln a) + + # u = y * ln x + # _ _ + # Taylor: | u u^2 u^3 | + # x ** y = 1 + | --- + --- + ----- + ... | + # |_ 1 1*2 1*2*3 _| + + # we need to limit the accuracy to protect against overflow + my $fallback = 0; + my ($scale, @params); + ($x, @params) = $x->_find_round_parameters(@r); + + return $x if $x->is_nan(); # error in _find_round_parameters? + + # no rounding at all, so must use fallback + if (scalar @params == 0) { + # simulate old behaviour + $params[0] = $class->div_scale(); # and round to it as accuracy + $params[1] = undef; # disable P + $scale = $params[0]+4; # at least four more for proper round + $params[2] = $r[2]; # round mode by caller or undef + $fallback = 1; # to clear a/p afterwards + } else { + # the 4 below is empirical, and there might be cases where it is not + # enough... + $scale = abs($params[0] || $params[1]) + 4; # take whatever is defined + } + + # when user set globals, they would interfere with our calculation, so + # disable them and later re-enable them + no strict 'refs'; + my $abr = "$class\::accuracy"; my $ab = $$abr; $$abr = undef; + my $pbr = "$class\::precision"; my $pb = $$pbr; $$pbr = undef; + # we also need to disable any set A or P on $x (_find_round_parameters took + # them already into account), since these would interfere, too + delete $x->{_a}; + delete $x->{_p}; + # need to disable $upgrade in BigInt, to avoid deep recursion + local $Math::BigInt::upgrade = undef; + + my ($limit, $v, $u, $below, $factor, $next, $over); + + $u = $x->copy()->blog(undef, $scale)->bmul($y); + my $do_invert = ($u->{sign} eq '-'); + $u->bneg() if $do_invert; + $v = $class->bone(); # 1 + $factor = $class->new(2); # 2 + $x->bone(); # first term: 1 + + $below = $v->copy(); + $over = $u->copy(); + + $limit = $class->new("1E-". ($scale-1)); + #my $steps = 0; + while (3 < 5) { + # we calculate the next term, and add it to the last + # when the next term is below our limit, it won't affect the outcome + # anymore, so we stop: + $next = $over->copy()->bdiv($below, $scale); + last if $next->bacmp($limit) <= 0; + $x->badd($next); + # calculate things for the next term + $over *= $u; + $below *= $factor; + $factor->binc(); + + last if $x->{sign} !~ /^[-+]$/; + + #$steps++; + } + + if ($do_invert) { + my $x_copy = $x->copy(); + $x->bone->bdiv($x_copy, $scale); + } + + # shortcut to not run through _find_round_parameters again + if (defined $params[0]) { + $x->bround($params[0], $params[2]); # then round accordingly + } else { + $x->bfround($params[1], $params[2]); # then round accordingly + } + if ($fallback) { + # clear a/p after round, since user did not request it + delete $x->{_a}; + delete $x->{_p}; + } + # restore globals + $$abr = $ab; + $$pbr = $pb; + $x; +} + +1; + +__END__ + +#!perl + +package Math::BigFloat::Trace; + +require 5.010; +use strict; +use warnings; + +use Exporter; +use Math::BigFloat; + +our ($accuracy, $precision, $round_mode, $div_scale); + +our @ISA = qw(Exporter Math::BigFloat); + +our $VERSION = '0.49'; + +use overload; # inherit overload from Math::BigFloat + +# Globals +$accuracy = $precision = undef; +$round_mode = 'even'; +$div_scale = 40; + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + + my $value = shift; + my $a = $accuracy; + $a = $_[0] if defined $_[0]; + my $p = $precision; + $p = $_[1] if defined $_[1]; + my $self = Math::BigFloat->new($value, $a, $p, $round_mode); + + # remember, downgrading may return a BigInt, so don't meddle with class + # bless $self, $class; + + print "MBF new '$value' => '$self' (", ref($self), ")"; + return $self; +} + +sub import { + print "MBF import ", join(' ', @_); + my $self = shift; + + # we catch the constants, the rest goes go BigFloat + my @a = (); + foreach (@_) { + push @a, $_ if $_ ne ':constant'; + } + overload::constant float => sub { $self->new(shift); }; + + Math::BigFloat->import(@a); # need it for subclasses +# $self->export_to_level(1,$self,@_); # need this ? +} + +1; +package Math::BigInt::Lib; + +use 5.006001; +use strict; +use warnings; + +our $VERSION = '1.999811'; + +use Carp; + +use overload + + # overload key: with_assign + + '+' => sub { + my $class = ref $_[0]; + my $x = $class -> _copy($_[0]); + my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + return $class -> _add($x, $y); + }, + + '-' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _sub($x, $y); + }, + + '*' => sub { + my $class = ref $_[0]; + my $x = $class -> _copy($_[0]); + my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + return $class -> _mul($x, $y); + }, + + '/' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _div($x, $y); + }, + + '%' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _mod($x, $y); + }, + + '**' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _pow($x, $y); + }, + + '<<' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $class -> _num($_[0]); + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $_[0]; + $y = ref($_[1]) ? $class -> _num($_[1]) : $_[1]; + } + return $class -> _blsft($x, $y); + }, + + '>>' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _brsft($x, $y); + }, + + # overload key: num_comparison + + '<' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _acmp($x, $y) < 0; + }, + + '<=' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _acmp($x, $y) <= 0; + }, + + '>' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _acmp($x, $y) > 0; + }, + + '>=' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _acmp($x, $y) >= 0; + }, + + '==' => sub { + my $class = ref $_[0]; + my $x = $class -> _copy($_[0]); + my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + return $class -> _acmp($x, $y) == 0; + }, + + '!=' => sub { + my $class = ref $_[0]; + my $x = $class -> _copy($_[0]); + my $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + return $class -> _acmp($x, $y) != 0; + }, + + # overload key: 3way_comparison + + '<=>' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _acmp($x, $y); + }, + + # overload key: binary + + '&' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _and($x, $y); + }, + + '|' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _or($x, $y); + }, + + '^' => sub { + my $class = ref $_[0]; + my ($x, $y); + if ($_[2]) { # if swapped + $y = $_[0]; + $x = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } else { + $x = $class -> _copy($_[0]); + $y = ref($_[1]) ? $_[1] : $class -> _new($_[1]); + } + return $class -> _xor($x, $y); + }, + + # overload key: func + + 'abs' => sub { $_[0] }, + + 'sqrt' => sub { + my $class = ref $_[0]; + return $class -> _sqrt($class -> _copy($_[0])); + }, + + 'int' => sub { $_[0] }, + + # overload key: conversion + + 'bool' => sub { ref($_[0]) -> _is_zero($_[0]) ? '' : 1; }, + + '""' => sub { ref($_[0]) -> _str($_[0]); }, + + '0+' => sub { ref($_[0]) -> _num($_[0]); }, + + '=' => sub { ref($_[0]) -> _copy($_[0]); }, + + ; + +# Do we need api_version() at all, now that we have a virtual parent class that +# will provide any missing methods? Fixme! + +sub api_version () { + croak "@{[(caller 0)[3]]} method not implemented"; +} + +sub _new { + croak "@{[(caller 0)[3]]} method not implemented"; +} + +sub _zero { + my $class = shift; + return $class -> _new("0"); +} + +sub _one { + my $class = shift; + return $class -> _new("1"); +} + +sub _two { + my $class = shift; + return $class -> _new("2"); + +} +sub _ten { + my $class = shift; + return $class -> _new("10"); +} + +sub _1ex { + my ($class, $exp) = @_; + $exp = $class -> _num($exp) if ref($exp); + return $class -> _new("1" . ("0" x $exp)); +} + +sub _copy { + my ($class, $x) = @_; + return $class -> _new($class -> _str($x)); +} + +# catch and throw away +sub import { } + +############################################################################## +# convert back to string and number + +sub _str { + # Convert number from internal base 1eN format to string format. Internal + # format is always normalized, i.e., no leading zeros. + croak "@{[(caller 0)[3]]} method not implemented"; +} + +sub _num { + my ($class, $x) = @_; + 0 + $class -> _str($x); +} + +############################################################################## +# actual math code + +sub _add { + croak "@{[(caller 0)[3]]} method not implemented"; +} + +sub _sub { + croak "@{[(caller 0)[3]]} method not implemented"; +} + +sub _mul { + my ($class, $x, $y) = @_; + my $sum = $class -> _zero(); + my $i = $class -> _zero(); + while ($class -> _acmp($i, $y) < 0) { + $sum = $class -> _add($sum, $x); + $i = $class -> _inc($i); + } + return $sum; +} + +sub _div { + my ($class, $x, $y) = @_; + + croak "@{[(caller 0)[3]]} requires non-zero divisor" + if $class -> _is_zero($y); + + my $r = $class -> _copy($x); + my $q = $class -> _zero(); + while ($class -> _acmp($r, $y) >= 0) { + $q = $class -> _inc($q); + $r = $class -> _sub($r, $y); + } + + return $q, $r if wantarray; + return $q; +} + +sub _inc { + my ($class, $x) = @_; + $class -> _add($x, $class -> _one()); +} + +sub _dec { + my ($class, $x) = @_; + $class -> _sub($x, $class -> _one()); +} + +############################################################################## +# testing + +sub _acmp { + # Compare two (absolute) values. Return -1, 0, or 1. + my ($class, $x, $y) = @_; + my $xstr = $class -> _str($x); + my $ystr = $class -> _str($y); + + length($xstr) <=> length($ystr) || $xstr cmp $ystr; +} + +sub _len { + my ($class, $x) = @_; + CORE::length($class -> _str($x)); +} + +sub _alen { + my ($class, $x) = @_; + $class -> _len($x); +} + +sub _digit { + my ($class, $x, $n) = @_; + substr($class ->_str($x), -($n+1), 1); +} + +sub _zeros { + my ($class, $x) = @_; + my $str = $class -> _str($x); + $str =~ /[^0](0*)\z/ ? CORE::length($1) : 0; +} + +############################################################################## +# _is_* routines + +sub _is_zero { + # return true if arg is zero + my ($class, $x) = @_; + $class -> _str($x) == 0; +} + +sub _is_even { + # return true if arg is even + my ($class, $x) = @_; + substr($class -> _str($x), -1, 1) % 2 == 0; +} + +sub _is_odd { + # return true if arg is odd + my ($class, $x) = @_; + substr($class -> _str($x), -1, 1) % 2 != 0; +} + +sub _is_one { + # return true if arg is one + my ($class, $x) = @_; + $class -> _str($x) == 1; +} + +sub _is_two { + # return true if arg is two + my ($class, $x) = @_; + $class -> _str($x) == 2; +} + +sub _is_ten { + # return true if arg is ten + my ($class, $x) = @_; + $class -> _str($x) == 10; +} + +############################################################################### +# check routine to test internal state for corruptions + +sub _check { + # used by the test suite + my ($class, $x) = @_; + return "Input is undefined" unless defined $x; + return "$x is not a reference" unless ref($x); + return 0; +} + +############################################################################### + +sub _mod { + # modulus + my ($class, $x, $y) = @_; + + croak "@{[(caller 0)[3]]} requires non-zero second operand" + if $class -> _is_zero($y); + + if ($class -> can('_div')) { + $x = $class -> _copy($x); + my ($q, $r) = $class -> _div($x, $y); + return $r; + } else { + my $r = $class -> _copy($x); + while ($class -> _acmp($r, $y) >= 0) { + $r = $class -> _sub($r, $y); + } + return $r; + } +} + +############################################################################## +# shifts + +sub _rsft { + my ($class, $x, $n, $b) = @_; + $b = $class -> _new($b) unless ref $b; + return scalar $class -> _div($x, $class -> _pow($class -> _copy($b), $n)); +} + +sub _lsft { + my ($class, $x, $n, $b) = @_; + $b = $class -> _new($b) unless ref $b; + return $class -> _mul($x, $class -> _pow($class -> _copy($b), $n)); +} + +sub _pow { + # power of $x to $y + my ($class, $x, $y) = @_; + + if ($class -> _is_zero($y)) { + return $class -> _one(); # y == 0 => x => 1 + } + + if (($class -> _is_one($x)) || # x == 1 + ($class -> _is_one($y))) # or y == 1 + { + return $x; + } + + if ($class -> _is_zero($x)) { + return $class -> _zero(); # 0 ** y => 0 (if not y <= 0) + } + + my $pow2 = $class -> _one(); + + my $y_bin = $class -> _as_bin($y); + $y_bin =~ s/^0b//; + my $len = length($y_bin); + + while (--$len > 0) { + $pow2 = $class -> _mul($pow2, $x) if substr($y_bin, $len, 1) eq '1'; + $x = $class -> _mul($x, $x); + } + + $x = $class -> _mul($x, $pow2); + return $x; +} + +sub _nok { + # Return binomial coefficient (n over k). + my ($class, $n, $k) = @_; + + # If k > n/2, or, equivalently, 2*k > n, compute nok(n, k) as + # nok(n, n-k), to minimize the number if iterations in the loop. + + { + my $twok = $class -> _mul($class -> _two(), $class -> _copy($k)); + if ($class -> _acmp($twok, $n) > 0) { + $k = $class -> _sub($class -> _copy($n), $k); + } + } + + # Example: + # + # / 7 \ 7! 1*2*3*4 * 5*6*7 5 * 6 * 7 + # | | = --------- = --------------- = --------- = ((5 * 6) / 2 * 7) / 3 + # \ 3 / (7-3)! 3! 1*2*3*4 * 1*2*3 1 * 2 * 3 + # + # Equivalently, _nok(11, 5) is computed as + # + # (((((((7 * 8) / 2) * 9) / 3) * 10) / 4) * 11) / 5 + + if ($class -> _is_zero($k)) { + return $class -> _one(); + } + + # Make a copy of the original n, in case the subclass modifies n in-place. + + my $n_orig = $class -> _copy($n); + + # n = 5, f = 6, d = 2 (cf. example above) + + $n = $class -> _sub($n, $k); + $n = $class -> _inc($n); + + my $f = $class -> _copy($n); + $f = $class -> _inc($f); + + my $d = $class -> _two(); + + # while f <= n (the original n, that is) ... + + while ($class -> _acmp($f, $n_orig) <= 0) { + $n = $class -> _mul($n, $f); + $n = $class -> _div($n, $d); + $f = $class -> _inc($f); + $d = $class -> _inc($d); + } + + return $n; +} + +sub _fac { + # factorial + my ($class, $x) = @_; + + my $two = $class -> _two(); + + if ($class -> _acmp($x, $two) < 0) { + return $class -> _one(); + } + + my $i = $class -> _copy($x); + while ($class -> _acmp($i, $two) > 0) { + $i = $class -> _dec($i); + $x = $class -> _mul($x, $i); + } + + return $x; +} + +sub _dfac { + # double factorial + my ($class, $x) = @_; + + my $two = $class -> _two(); + + if ($class -> _acmp($x, $two) < 0) { + return $class -> _one(); + } + + my $i = $class -> _copy($x); + while ($class -> _acmp($i, $two) > 0) { + $i = $class -> _sub($i, $two); + $x = $class -> _mul($x, $i); + } + + return $x; +} + +sub _log_int { + # calculate integer log of $x to base $base + # calculate integer log of $x to base $base + # ref to array, ref to array - return ref to array + my ($class, $x, $base) = @_; + + # X == 0 => NaN + return if $class -> _is_zero($x); + + $base = $class -> _new(2) unless defined($base); + $base = $class -> _new($base) unless ref($base); + + # BASE 0 or 1 => NaN + return if $class -> _is_zero($base) || $class -> _is_one($base); + + # X == 1 => 0 (is exact) + if ($class -> _is_one($x)) { + return $class -> _zero(), 1; + } + + my $cmp = $class -> _acmp($x, $base); + + # X == BASE => 1 (is exact) + if ($cmp == 0) { + return $class -> _one(), 1; + } + + # 1 < X < BASE => 0 (is truncated) + if ($cmp < 0) { + return $class -> _zero(), 0; + } + + my $y; + + # log(x) / log(b) = log(xm * 10^xe) / log(bm * 10^be) + # = (log(xm) + xe*(log(10))) / (log(bm) + be*log(10)) + + { + my $x_str = $class -> _str($x); + my $b_str = $class -> _str($base); + my $xm = "." . $x_str; + my $bm = "." . $b_str; + my $xe = length($x_str); + my $be = length($b_str); + my $log10 = log(10); + my $guess = int((log($xm) + $xe * $log10) / (log($bm) + $be * $log10)); + $y = $class -> _new($guess); + } + + my $trial = $class -> _pow($class -> _copy($base), $y); + my $acmp = $class -> _acmp($trial, $x); + + # Did we get the exact result? + + return $y, 1 if $acmp == 0; + + # Too small? + + while ($acmp < 0) { + $trial = $class -> _mul($trial, $base); + $y = $class -> _inc($y); + $acmp = $class -> _acmp($trial, $x); + } + + # Too big? + + while ($acmp > 0) { + $trial = $class -> _div($trial, $base); + $y = $class -> _dec($y); + $acmp = $class -> _acmp($trial, $x); + } + + return $y, 1 if $acmp == 0; # result is exact + return $y, 0; # result is too small +} + +sub _sqrt { + # square-root of $y in place + my ($class, $y) = @_; + + return $y if $class -> _is_zero($y); + + my $y_str = $class -> _str($y); + my $y_len = length($y_str); + + # Compute the guess $x. + + my $xm; + my $xe; + if ($y_len % 2 == 0) { + $xm = sqrt("." . $y_str); + $xe = $y_len / 2; + $xm = sprintf "%.0f", int($xm * 1e15); + $xe -= 15; + } else { + $xm = sqrt(".0" . $y_str); + $xe = ($y_len + 1) / 2; + $xm = sprintf "%.0f", int($xm * 1e16); + $xe -= 16; + } + + my $x; + if ($xe < 0) { + $x = substr $xm, 0, length($xm) + $xe; + } else { + $x = $xm . ("0" x $xe); + } + + $x = $class -> _new($x); + + # Newton's method for computing square root of y + # + # x(i+1) = x(i) - f(x(i)) / f'(x(i)) + # = x(i) - (x(i)^2 - y) / (2 * x(i)) # use if x(i)^2 > y + # = y(i) + (y - x(i)^2) / (2 * x(i)) # use if x(i)^2 < y + + # Determine if x, our guess, is too small, correct, or too large. + + my $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2 + my $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y + + # Only assign a value to this variable if we will be using it. + + my $two; + $two = $class -> _two() if $acmp != 0; + + # If x is too small, do one iteration of Newton's method. Since the + # function f(x) = x^2 - y is concave and monotonically increasing, the next + # guess for x will either be correct or too large. + + if ($acmp < 0) { + + # x(i+1) = x(i) + (y - x(i)^2) / (2 * x(i)) + + my $numer = $class -> _sub($class -> _copy($y), $xsq); # y - x(i)^2 + my $denom = $class -> _mul($class -> _copy($two), $x); # 2 * x(i) + my $delta = $class -> _div($numer, $denom); + + unless ($class -> _is_zero($delta)) { + $x = $class -> _add($x, $delta); + $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2 + $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y + } + } + + # If our guess for x is too large, apply Newton's method repeatedly until + # we either have got the correct value, or the delta is zero. + + while ($acmp > 0) { + + # x(i+1) = x(i) - (x(i)^2 - y) / (2 * x(i)) + + my $numer = $class -> _sub($xsq, $y); # x(i)^2 - y + my $denom = $class -> _mul($class -> _copy($two), $x); # 2 * x(i) + my $delta = $class -> _div($numer, $denom); + last if $class -> _is_zero($delta); + + $x = $class -> _sub($x, $delta); + $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2 + $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y + } + + # When the delta is zero, our value for x might still be too large. We + # require that the outout is either exact or too small (i.e., rounded down + # to the nearest integer), so do a final check. + + while ($acmp > 0) { + $x = $class -> _dec($x); + $xsq = $class -> _mul($class -> _copy($x), $x); # x(i)^2 + $acmp = $class -> _acmp($xsq, $y); # x(i)^2 <=> y + } + + return $x; +} + +sub _root { + my ($class, $y, $n) = @_; + + return $y if $class -> _is_zero($y) || $class -> _is_one($y) || + $class -> _is_one($n); + + # If y <= n, the result is always (truncated to) 1. + + return $class -> _one() if $class -> _acmp($y, $n) <= 0; + + # Compute the initial guess x of y^(1/n). When n is large, Newton's method + # converges slowly if the "guess" (initial value) is poor, so we need a + # good guess. It the guess is too small, the next guess will be too large, + # and from then on all guesses are too large. + + my $DEBUG = 0; + + # Split y into mantissa and exponent in base 10, so that + # + # y = xm * 10^xe, where 0 < xm < 1 and xe is an integer + + my $y_str = $class -> _str($y); + my $ym = "." . $y_str; + my $ye = length($y_str); + + # From this compute the approximate base 10 logarithm of y + # + # log_10(y) = log_10(ym) + log_10(ye^10) + # = log(ym)/log(10) + ye + + my $log10y = log($ym) / log(10) + $ye; + + # And from this compute the approximate base 10 logarithm of x, where + # x = y^(1/n) + # + # log_10(x) = log_10(y)/n + + my $log10x = $log10y / $class -> _num($n); + + # From this compute xm and xe, the mantissa and exponent (in base 10) of x, + # where 1 < xm <= 10 and xe is an integer. + + my $xe = int $log10x; + my $xm = 10 ** ($log10x - $xe); + + # Scale the mantissa and exponent to increase the integer part of ym, which + # gives us better accuracy. + + if ($DEBUG) { + print "\n"; + print "y_str = $y_str\n"; + print "ym = $ym\n"; + print "ye = $ye\n"; + print "log10y = $log10y\n"; + print "log10x = $log10x\n"; + print "xm = $xm\n"; + print "xe = $xe\n"; + } + + my $d = $xe < 15 ? $xe : 15; + $xm *= 10 ** $d; + $xe -= $d; + + if ($DEBUG) { + print "\n"; + print "xm = $xm\n"; + print "xe = $xe\n"; + } + + # If the mantissa is not an integer, round up to nearest integer, and then + # convert the number to a string. It is important to always round up due to + # how Newton's method behaves in this case. If the initial guess is too + # small, the next guess will be too large, after which every succeeding + # guess converges the correct value from above. Now, if the initial guess + # is too small and n is large, the next guess will be much too large and + # require a large number of iterations to get close to the solution. + # Because of this, we are likely to find the solution faster if we make + # sure the initial guess is not too small. + + my $xm_int = int($xm); + my $x_str = sprintf '%.0f', $xm > $xm_int ? $xm_int + 1 : $xm_int; + $x_str .= "0" x $xe; + + my $x = $class -> _new($x_str); + + if ($DEBUG) { + print "xm = $xm\n"; + print "xe = $xe\n"; + print "\n"; + print "x_str = $x_str (initial guess)\n"; + print "\n"; + } + + # Use Newton's method for computing n'th root of y. + # + # x(i+1) = x(i) - f(x(i)) / f'(x(i)) + # = x(i) - (x(i)^n - y) / (n * x(i)^(n-1)) # use if x(i)^n > y + # = x(i) + (y - x(i)^n) / (n * x(i)^(n-1)) # use if x(i)^n < y + + # Determine if x, our guess, is too small, correct, or too large. Rather + # than computing x(i)^n and x(i)^(n-1) directly, compute x(i)^(n-1) and + # then the same value multiplied by x. + + my $nm1 = $class -> _dec($class -> _copy($n)); # n-1 + my $xpownm1 = $class -> _pow($class -> _copy($x), $nm1); # x(i)^(n-1) + my $xpown = $class -> _mul($class -> _copy($xpownm1), $x); # x(i)^n + my $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y + + if ($DEBUG) { + print "\n"; + print "x = ", $class -> _str($x), "\n"; + print "x^n = ", $class -> _str($xpown), "\n"; + print "y = ", $class -> _str($y), "\n"; + print "acmp = $acmp\n"; + } + + # If x is too small, do one iteration of Newton's method. Since the + # function f(x) = x^n - y is concave and monotonically increasing, the next + # guess for x will either be correct or too large. + + if ($acmp < 0) { + + # x(i+1) = x(i) + (y - x(i)^n) / (n * x(i)^(n-1)) + + my $numer = $class -> _sub($class -> _copy($y), $xpown); # y - x(i)^n + my $denom = $class -> _mul($class -> _copy($n), $xpownm1); # n * x(i)^(n-1) + my $delta = $class -> _div($numer, $denom); + + if ($DEBUG) { + print "\n"; + print "numer = ", $class -> _str($numer), "\n"; + print "denom = ", $class -> _str($denom), "\n"; + print "delta = ", $class -> _str($delta), "\n"; + } + + unless ($class -> _is_zero($delta)) { + $x = $class -> _add($x, $delta); + $xpownm1 = $class -> _pow($class -> _copy($x), $nm1); # x(i)^(n-1) + $xpown = $class -> _mul($class -> _copy($xpownm1), $x); # x(i)^n + $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y + + if ($DEBUG) { + print "\n"; + print "x = ", $class -> _str($x), "\n"; + print "x^n = ", $class -> _str($xpown), "\n"; + print "y = ", $class -> _str($y), "\n"; + print "acmp = $acmp\n"; + } + } + } + + # If our guess for x is too large, apply Newton's method repeatedly until + # we either have got the correct value, or the delta is zero. + + while ($acmp > 0) { + + # x(i+1) = x(i) - (x(i)^n - y) / (n * x(i)^(n-1)) + + my $numer = $class -> _sub($class -> _copy($xpown), $y); # x(i)^n - y + my $denom = $class -> _mul($class -> _copy($n), $xpownm1); # n * x(i)^(n-1) + + if ($DEBUG) { + print "numer = ", $class -> _str($numer), "\n"; + print "denom = ", $class -> _str($denom), "\n"; + } + + my $delta = $class -> _div($numer, $denom); + + if ($DEBUG) { + print "delta = ", $class -> _str($delta), "\n"; + } + + last if $class -> _is_zero($delta); + + $x = $class -> _sub($x, $delta); + $xpownm1 = $class -> _pow($class -> _copy($x), $nm1); # x(i)^(n-1) + $xpown = $class -> _mul($class -> _copy($xpownm1), $x); # x(i)^n + $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y + + if ($DEBUG) { + print "\n"; + print "x = ", $class -> _str($x), "\n"; + print "x^n = ", $class -> _str($xpown), "\n"; + print "y = ", $class -> _str($y), "\n"; + print "acmp = $acmp\n"; + } + } + + # When the delta is zero, our value for x might still be too large. We + # require that the outout is either exact or too small (i.e., rounded down + # to the nearest integer), so do a final check. + + while ($acmp > 0) { + $x = $class -> _dec($x); + $xpown = $class -> _pow($class -> _copy($x), $n); # x(i)^n + $acmp = $class -> _acmp($xpown, $y); # x(i)^n <=> y + } + + return $x; +} + +############################################################################## +# binary stuff + +sub _and { + my ($class, $x, $y) = @_; + + return $x if $class -> _acmp($x, $y) == 0; + + my $m = $class -> _one(); + my $mask = $class -> _new("32768"); + + my ($xr, $yr); # remainders after division + + my $xc = $class -> _copy($x); + my $yc = $class -> _copy($y); + my $z = $class -> _zero(); + + until ($class -> _is_zero($xc) || $class -> _is_zero($yc)) { + ($xc, $xr) = $class -> _div($xc, $mask); + ($yc, $yr) = $class -> _div($yc, $mask); + my $bits = $class -> _new($class -> _num($xr) & $class -> _num($yr)); + $z = $class -> _add($z, $class -> _mul($bits, $m)); + $m = $class -> _mul($m, $mask); + } + + return $z; +} + +sub _xor { + my ($class, $x, $y) = @_; + + return $class -> _zero() if $class -> _acmp($x, $y) == 0; + + my $m = $class -> _one(); + my $mask = $class -> _new("32768"); + + my ($xr, $yr); # remainders after division + + my $xc = $class -> _copy($x); + my $yc = $class -> _copy($y); + my $z = $class -> _zero(); + + until ($class -> _is_zero($xc) || $class -> _is_zero($yc)) { + ($xc, $xr) = $class -> _div($xc, $mask); + ($yc, $yr) = $class -> _div($yc, $mask); + my $bits = $class -> _new($class -> _num($xr) ^ $class -> _num($yr)); + $z = $class -> _add($z, $class -> _mul($bits, $m)); + $m = $class -> _mul($m, $mask); + } + + # The loop above stops when the smallest of the two numbers is exhausted. + # The remainder of the longer one will survive bit-by-bit, so we simple + # multiply-add it in. + + $z = $class -> _add($z, $class -> _mul($xc, $m)) + unless $class -> _is_zero($xc); + $z = $class -> _add($z, $class -> _mul($yc, $m)) + unless $class -> _is_zero($yc); + + return $z; +} + +sub _or { + my ($class, $x, $y) = @_; + + return $x if $class -> _acmp($x, $y) == 0; # shortcut (see _and) + + my $m = $class -> _one(); + my $mask = $class -> _new("32768"); + + my ($xr, $yr); # remainders after division + + my $xc = $class -> _copy($x); + my $yc = $class -> _copy($y); + my $z = $class -> _zero(); + + until ($class -> _is_zero($xc) || $class -> _is_zero($yc)) { + ($xc, $xr) = $class -> _div($xc, $mask); + ($yc, $yr) = $class -> _div($yc, $mask); + my $bits = $class -> _new($class -> _num($xr) | $class -> _num($yr)); + $z = $class -> _add($z, $class -> _mul($bits, $m)); + $m = $class -> _mul($m, $mask); + } + + # The loop above stops when the smallest of the two numbers is exhausted. + # The remainder of the longer one will survive bit-by-bit, so we simple + # multiply-add it in. + + $z = $class -> _add($z, $class -> _mul($xc, $m)) + unless $class -> _is_zero($xc); + $z = $class -> _add($z, $class -> _mul($yc, $m)) + unless $class -> _is_zero($yc); + + return $z; +} + +sub _to_bin { + # convert the number to a string of binary digits without prefix + my ($class, $x) = @_; + my $str = ''; + my $tmp = $class -> _copy($x); + my $chunk = $class -> _new("16777216"); # 2^24 = 24 binary digits + my $rem; + until ($class -> _acmp($tmp, $chunk) < 0) { + ($tmp, $rem) = $class -> _div($tmp, $chunk); + $str = sprintf("%024b", $class -> _num($rem)) . $str; + } + unless ($class -> _is_zero($tmp)) { + $str = sprintf("%b", $class -> _num($tmp)) . $str; + } + return length($str) ? $str : '0'; +} + +sub _to_oct { + # convert the number to a string of octal digits without prefix + my ($class, $x) = @_; + my $str = ''; + my $tmp = $class -> _copy($x); + my $chunk = $class -> _new("16777216"); # 2^24 = 8 octal digits + my $rem; + until ($class -> _acmp($tmp, $chunk) < 0) { + ($tmp, $rem) = $class -> _div($tmp, $chunk); + $str = sprintf("%08o", $class -> _num($rem)) . $str; + } + unless ($class -> _is_zero($tmp)) { + $str = sprintf("%o", $class -> _num($tmp)) . $str; + } + return length($str) ? $str : '0'; +} + +sub _to_hex { + # convert the number to a string of hexadecimal digits without prefix + my ($class, $x) = @_; + my $str = ''; + my $tmp = $class -> _copy($x); + my $chunk = $class -> _new("16777216"); # 2^24 = 6 hexadecimal digits + my $rem; + until ($class -> _acmp($tmp, $chunk) < 0) { + ($tmp, $rem) = $class -> _div($tmp, $chunk); + $str = sprintf("%06x", $class -> _num($rem)) . $str; + } + unless ($class -> _is_zero($tmp)) { + $str = sprintf("%x", $class -> _num($tmp)) . $str; + } + return length($str) ? $str : '0'; +} + +sub _as_bin { + # convert the number to a string of binary digits with prefix + my ($class, $x) = @_; + return '0b' . $class -> _to_bin($x); +} + +sub _as_oct { + # convert the number to a string of octal digits with prefix + my ($class, $x) = @_; + return '0' . $class -> _to_oct($x); # yes, 0 becomes "00" +} + +sub _as_hex { + # convert the number to a string of hexadecimal digits with prefix + my ($class, $x) = @_; + return '0x' . $class -> _to_hex($x); +} + +sub _to_bytes { + # convert the number to a string of bytes + my ($class, $x) = @_; + my $str = ''; + my $tmp = $class -> _copy($x); + my $chunk = $class -> _new("65536"); + my $rem; + until ($class -> _is_zero($tmp)) { + ($tmp, $rem) = $class -> _div($tmp, $chunk); + $str = pack('n', $class -> _num($rem)) . $str; + } + $str =~ s/^\0+//; + return length($str) ? $str : "\x00"; +} + +*_as_bytes = \&_to_bytes; + +sub _from_hex { + # Convert a string of hexadecimal digits to a number. + + my ($class, $hex) = @_; + $hex =~ s/^0[xX]//; + + # Find the largest number of hexadecimal digits that we can safely use with + # 32 bit integers. There are 4 bits pr hexadecimal digit, and we use only + # 31 bits to play safe. This gives us int(31 / 4) = 7. + + my $len = length $hex; + my $rem = 1 + ($len - 1) % 7; + + # Do the first chunk. + + my $ret = $class -> _new(int hex substr $hex, 0, $rem); + return $ret if $rem == $len; + + # Do the remaining chunks, if any. + + my $shift = $class -> _new(1 << (4 * 7)); + for (my $offset = $rem ; $offset < $len ; $offset += 7) { + my $part = int hex substr $hex, $offset, 7; + $ret = $class -> _mul($ret, $shift); + $ret = $class -> _add($ret, $class -> _new($part)); + } + + return $ret; +} + +sub _from_oct { + # Convert a string of octal digits to a number. + + my ($class, $oct) = @_; + + # Find the largest number of octal digits that we can safely use with 32 + # bit integers. There are 3 bits pr octal digit, and we use only 31 bits to + # play safe. This gives us int(31 / 3) = 10. + + my $len = length $oct; + my $rem = 1 + ($len - 1) % 10; + + # Do the first chunk. + + my $ret = $class -> _new(int oct substr $oct, 0, $rem); + return $ret if $rem == $len; + + # Do the remaining chunks, if any. + + my $shift = $class -> _new(1 << (3 * 10)); + for (my $offset = $rem ; $offset < $len ; $offset += 10) { + my $part = int oct substr $oct, $offset, 10; + $ret = $class -> _mul($ret, $shift); + $ret = $class -> _add($ret, $class -> _new($part)); + } + + return $ret; +} + +sub _from_bin { + # Convert a string of binary digits to a number. + + my ($class, $bin) = @_; + $bin =~ s/^0[bB]//; + + # The largest number of binary digits that we can safely use with 32 bit + # integers is 31. We use only 31 bits to play safe. + + my $len = length $bin; + my $rem = 1 + ($len - 1) % 31; + + # Do the first chunk. + + my $ret = $class -> _new(int oct '0b' . substr $bin, 0, $rem); + return $ret if $rem == $len; + + # Do the remaining chunks, if any. + + my $shift = $class -> _new(1 << 31); + for (my $offset = $rem ; $offset < $len ; $offset += 31) { + my $part = int oct '0b' . substr $bin, $offset, 31; + $ret = $class -> _mul($ret, $shift); + $ret = $class -> _add($ret, $class -> _new($part)); + } + + return $ret; +} + +sub _from_bytes { + # convert string of bytes to a number + my ($class, $str) = @_; + my $x = $class -> _zero(); + my $base = $class -> _new("256"); + my $n = length($str); + for (my $i = 0 ; $i < $n ; ++$i) { + $x = $class -> _mul($x, $base); + my $byteval = $class -> _new(unpack 'C', substr($str, $i, 1)); + $x = $class -> _add($x, $byteval); + } + return $x; +} + +############################################################################## +# special modulus functions + +sub _modinv { + # modular multiplicative inverse + my ($class, $x, $y) = @_; + + # modulo zero + if ($class -> _is_zero($y)) { + return (undef, undef); + } + + # modulo one + if ($class -> _is_one($y)) { + return ($class -> _zero(), '+'); + } + + my $u = $class -> _zero(); + my $v = $class -> _one(); + my $a = $class -> _copy($y); + my $b = $class -> _copy($x); + + # Euclid's Algorithm for bgcd(). + + my $q; + my $sign = 1; + { + ($a, $q, $b) = ($b, $class -> _div($a, $b)); + last if $class -> _is_zero($b); + + my $vq = $class -> _mul($class -> _copy($v), $q); + my $t = $class -> _add($vq, $u); + $u = $v; + $v = $t; + $sign = -$sign; + redo; + } + + # if the gcd is not 1, there exists no modular multiplicative inverse + return (undef, undef) unless $class -> _is_one($a); + + ($v, $sign == 1 ? '+' : '-'); +} + +sub _modpow { + # modulus of power ($x ** $y) % $z + my ($class, $num, $exp, $mod) = @_; + + # a^b (mod 1) = 0 for all a and b + if ($class -> _is_one($mod)) { + return $class -> _zero(); + } + + # 0^a (mod m) = 0 if m != 0, a != 0 + # 0^0 (mod m) = 1 if m != 0 + if ($class -> _is_zero($num)) { + return $class -> _is_zero($exp) ? $class -> _one() + : $class -> _zero(); + } + + # $num = $class -> _mod($num, $mod); # this does not make it faster + + my $acc = $class -> _copy($num); + my $t = $class -> _one(); + + my $expbin = $class -> _as_bin($exp); + $expbin =~ s/^0b//; + my $len = length($expbin); + + while (--$len >= 0) { + if (substr($expbin, $len, 1) eq '1') { + $t = $class -> _mul($t, $acc); + $t = $class -> _mod($t, $mod); + } + $acc = $class -> _mul($acc, $acc); + $acc = $class -> _mod($acc, $mod); + } + return $t; +} + +sub _gcd { + # Greatest common divisor. + + my ($class, $x, $y) = @_; + + # gcd(0, 0) = 0 + # gcd(0, a) = a, if a != 0 + + if ($class -> _acmp($x, $y) == 0) { + return $class -> _copy($x); + } + + if ($class -> _is_zero($x)) { + if ($class -> _is_zero($y)) { + return $class -> _zero(); + } else { + return $class -> _copy($y); + } + } else { + if ($class -> _is_zero($y)) { + return $class -> _copy($x); + } else { + + # Until $y is zero ... + + $x = $class -> _copy($x); + until ($class -> _is_zero($y)) { + + # Compute remainder. + + $x = $class -> _mod($x, $y); + + # Swap $x and $y. + + my $tmp = $x; + $x = $class -> _copy($y); + $y = $tmp; + } + + return $x; + } + } +} + +sub _lcm { + # Least common multiple. + + my ($class, $x, $y) = @_; + + # lcm(0, x) = 0 for all x + + return $class -> _zero() + if ($class -> _is_zero($x) || + $class -> _is_zero($y)); + + my $gcd = $class -> _gcd($class -> _copy($x), $y); + $x = $class -> _div($x, $gcd); + $x = $class -> _mul($x, $y); + return $x; +} + +sub _lucas { + my ($class, $n) = @_; + + $n = $class -> _num($n) if ref $n; + + # In list context, use lucas(n) = lucas(n-1) + lucas(n-2) + + if (wantarray) { + my @y; + + push @y, $class -> _two(); + return @y if $n == 0; + + push @y, $class -> _one(); + return @y if $n == 1; + + for (my $i = 2 ; $i <= $n ; ++ $i) { + $y[$i] = $class -> _add($class -> _copy($y[$i - 1]), $y[$i - 2]); + } + + return @y; + } + + require Scalar::Util; + + # In scalar context use that lucas(n) = fib(n-1) + fib(n+1). + # + # Remember that _fib() behaves differently in scalar context and list + # context, so we must add scalar() to get the desired behaviour. + + return $class -> _two() if $n == 0; + + return $class -> _add(scalar $class -> _fib($n - 1), + scalar $class -> _fib($n + 1)); +} + +sub _fib { + my ($class, $n) = @_; + + $n = $class -> _num($n) if ref $n; + + # In list context, use fib(n) = fib(n-1) + fib(n-2) + + if (wantarray) { + my @y; + + push @y, $class -> _zero(); + return @y if $n == 0; + + push @y, $class -> _one(); + return @y if $n == 1; + + for (my $i = 2 ; $i <= $n ; ++ $i) { + $y[$i] = $class -> _add($class -> _copy($y[$i - 1]), $y[$i - 2]); + } + + return @y; + } + + # In scalar context use a fast algorithm that is much faster than the + # recursive algorith used in list context. + + my $cache = {}; + my $two = $class -> _two(); + my $fib; + + $fib = sub { + my $n = shift; + return $class -> _zero() if $n <= 0; + return $class -> _one() if $n <= 2; + return $cache -> {$n} if exists $cache -> {$n}; + + my $k = int($n / 2); + my $a = $fib -> ($k + 1); + my $b = $fib -> ($k); + my $y; + + if ($n % 2 == 1) { + # a*a + b*b + $y = $class -> _add($class -> _mul($class -> _copy($a), $a), + $class -> _mul($class -> _copy($b), $b)); + } else { + # (2*a - b)*b + $y = $class -> _mul($class -> _sub($class -> _mul( + $class -> _copy($two), $a), $b), $b); + } + + $cache -> {$n} = $y; + return $y; + }; + + return $fib -> ($n); +} + +############################################################################## +############################################################################## + +1; + +__END__ + +package Math::BigInt::Calc; + +use 5.006001; +use strict; +use warnings; + +use Carp; +use Math::BigInt::Lib; + +our $VERSION = '1.999811'; + +our @ISA = ('Math::BigInt::Lib'); + +# Package to store unsigned big integers in decimal and do math with them + +# Internally the numbers are stored in an array with at least 1 element, no +# leading zero parts (except the first) and in base 1eX where X is determined +# automatically at loading time to be the maximum possible value + +# todo: +# - fully remove funky $# stuff in div() (maybe - that code scares me...) + +# USE_MUL: due to problems on certain os (os390, posix-bc) "* 1e-5" is used +# instead of "/ 1e5" at some places, (marked with USE_MUL). Other platforms +# BS2000, some Crays need USE_DIV instead. +# The BEGIN block is used to determine which of the two variants gives the +# correct result. + +# Beware of things like: +# $i = $i * $y + $car; $car = int($i / $BASE); $i = $i % $BASE; +# This works on x86, but fails on ARM (SA1100, iPAQ) due to who knows what +# reasons. So, use this instead (slower, but correct): +# $i = $i * $y + $car; $car = int($i / $BASE); $i -= $BASE * $car; + +############################################################################## +# global constants, flags and accessory + +# announce that we are compatible with MBI v1.83 and up +sub api_version () { 2; } + +# constants for easier life +my ($BASE, $BASE_LEN, $RBASE, $MAX_VAL); +my ($AND_BITS, $XOR_BITS, $OR_BITS); +my ($AND_MASK, $XOR_MASK, $OR_MASK); + +sub _base_len { + # Set/get the BASE_LEN and assorted other, related values. + # Used only by the testsuite, the set variant is used only by the BEGIN + # block below: + + my ($class, $b, $int) = @_; + if (defined $b) { + # avoid redefinitions + undef &_mul; + undef &_div; + + if ($] >= 5.008 && $int && $b > 7) { + $BASE_LEN = $b; + *_mul = \&_mul_use_div_64; + *_div = \&_div_use_div_64; + $BASE = int("1e" . $BASE_LEN); + $MAX_VAL = $BASE-1; + return $BASE_LEN unless wantarray; + return ($BASE_LEN, $BASE, $AND_BITS, $XOR_BITS, $OR_BITS, $BASE_LEN, $MAX_VAL); + } + + # find whether we can use mul or div in mul()/div() + $BASE_LEN = $b + 1; + my $caught = 0; + while (--$BASE_LEN > 5) { + $BASE = int("1e" . $BASE_LEN); + $RBASE = abs('1e-' . $BASE_LEN); # see USE_MUL + $caught = 0; + $caught += 1 if (int($BASE * $RBASE) != 1); # should be 1 + $caught += 2 if (int($BASE / $BASE) != 1); # should be 1 + last if $caught != 3; + } + $BASE = int("1e" . $BASE_LEN); + $RBASE = abs('1e-' . $BASE_LEN); # see USE_MUL + $MAX_VAL = $BASE-1; + + # ($caught & 1) != 0 => cannot use MUL + # ($caught & 2) != 0 => cannot use DIV + if ($caught == 2) # 2 + { + # must USE_MUL since we cannot use DIV + *_mul = \&_mul_use_mul; + *_div = \&_div_use_mul; + } else # 0 or 1 + { + # can USE_DIV instead + *_mul = \&_mul_use_div; + *_div = \&_div_use_div; + } + } + return $BASE_LEN unless wantarray; + return ($BASE_LEN, $BASE, $AND_BITS, $XOR_BITS, $OR_BITS, $BASE_LEN, $MAX_VAL); +} + +sub _new { + # Given a string representing an integer, returns a reference to an array + # of integers, where each integer represents a chunk of the original input + # integer. + + my ($class, $str) = @_; + #unless ($str =~ /^([1-9]\d*|0)\z/) { + # require Carp; + # Carp::croak("Invalid input string '$str'"); + #} + + my $input_len = length($str) - 1; + + # Shortcut for small numbers. + return bless [ $str ], $class if $input_len < $BASE_LEN; + + my $format = "a" . (($input_len % $BASE_LEN) + 1); + $format .= $] < 5.008 ? "a$BASE_LEN" x int($input_len / $BASE_LEN) + : "(a$BASE_LEN)*"; + + my $self = [ reverse(map { 0 + $_ } unpack($format, $str)) ]; + return bless $self, $class; +} + +BEGIN { + # from Daniel Pfeiffer: determine largest group of digits that is precisely + # multipliable with itself plus carry + # Test now changed to expect the proper pattern, not a result off by 1 or 2 + my ($e, $num) = 3; # lowest value we will use is 3+1-1 = 3 + do { + $num = '9' x ++$e; + $num *= $num + 1; + } while $num =~ /9{$e}0{$e}/; # must be a certain pattern + $e--; # last test failed, so retract one step + # the limits below brush the problems with the test above under the rug: + # the test should be able to find the proper $e automatically + $e = 5 if $^O =~ /^uts/; # UTS get's some special treatment + $e = 5 if $^O =~ /^unicos/; # unicos is also problematic (6 seems to work + # there, but we play safe) + + my $int = 0; + if ($e > 7) { + use integer; + my $e1 = 7; + $num = 7; + do { + $num = ('9' x ++$e1) + 0; + $num *= $num + 1; + } while ("$num" =~ /9{$e1}0{$e1}/); # must be a certain pattern + $e1--; # last test failed, so retract one step + if ($e1 > 7) { + $int = 1; + $e = $e1; + } + } + + __PACKAGE__ -> _base_len($e, $int); # set and store + + use integer; + # find out how many bits _and, _or and _xor can take (old default = 16) + # I don't think anybody has yet 128 bit scalars, so let's play safe. + local $^W = 0; # don't warn about 'nonportable number' + $AND_BITS = 15; + $XOR_BITS = 15; + $OR_BITS = 15; + + # find max bits, we will not go higher than numberofbits that fit into $BASE + # to make _and etc simpler (and faster for smaller, slower for large numbers) + my $max = 16; + while (2 ** $max < $BASE) { + $max++; + } + { + no integer; + $max = 16 if $] < 5.006; # older Perls might not take >16 too well + } + my ($x, $y, $z); + + do { + $AND_BITS++; + $x = CORE::oct('0b' . '1' x $AND_BITS); + $y = $x & $x; + $z = (2 ** $AND_BITS) - 1; + } while ($AND_BITS < $max && $x == $z && $y == $x); + $AND_BITS --; # retreat one step + + do { + $XOR_BITS++; + $x = CORE::oct('0b' . '1' x $XOR_BITS); + $y = $x ^ 0; + $z = (2 ** $XOR_BITS) - 1; + } while ($XOR_BITS < $max && $x == $z && $y == $x); + $XOR_BITS --; # retreat one step + + do { + $OR_BITS++; + $x = CORE::oct('0b' . '1' x $OR_BITS); + $y = $x | $x; + $z = (2 ** $OR_BITS) - 1; + } while ($OR_BITS < $max && $x == $z && $y == $x); + $OR_BITS--; # retreat one step + + $AND_MASK = __PACKAGE__->_new(( 2 ** $AND_BITS )); + $XOR_MASK = __PACKAGE__->_new(( 2 ** $XOR_BITS )); + $OR_MASK = __PACKAGE__->_new(( 2 ** $OR_BITS )); + + # We can compute the approximate length no faster than the real length: + *_alen = \&_len; +} + +############################################################################### + +sub _zero { + # create a zero + my $class = shift; + return bless [ 0 ], $class; +} + +sub _one { + # create a one + my $class = shift; + return bless [ 1 ], $class; +} + +sub _two { + # create a two + my $class = shift; + return bless [ 2 ], $class; +} + +sub _ten { + # create a 10 + my $class = shift; + bless [ 10 ], $class; +} + +sub _1ex { + # create a 1Ex + my $class = shift; + + my $rem = $_[0] % $BASE_LEN; # remainder + my $parts = $_[0] / $BASE_LEN; # parts + + # 000000, 000000, 100 + bless [ (0) x $parts, '1' . ('0' x $rem) ], $class; +} + +sub _copy { + # make a true copy + my $class = shift; + return bless [ @{ $_[0] } ], $class; +} + +# catch and throw away +sub import { } + +############################################################################## +# convert back to string and number + +sub _str { + # Convert number from internal base 1eN format to string format. Internal + # format is always normalized, i.e., no leading zeros. + + my $ary = $_[1]; + my $idx = $#$ary; # index of last element + + if ($idx < 0) { # should not happen + require Carp; + Carp::croak("$_[1] has no elements"); + } + + # Handle first one differently, since it should not have any leading zeros. + my $ret = int($ary->[$idx]); + if ($idx > 0) { + # Interestingly, the pre-padd method uses more time. + # The old grep variant takes longer (14 vs. 10 sec). + my $z = '0' x ($BASE_LEN - 1); + while (--$idx >= 0) { + $ret .= substr($z . $ary->[$idx], -$BASE_LEN); + } + } + $ret; +} + +sub _num { + # Make a Perl scalar number (int/float) from a BigInt object. + my $x = $_[1]; + + return $x->[0] if @$x == 1; # below $BASE + + # Start with the most significant element and work towards the least + # significant element. Avoid multiplying "inf" (which happens if the number + # overflows) with "0" (if there are zero elements in $x) since this gives + # "nan" which propagates to the output. + + my $num = 0; + for (my $i = $#$x ; $i >= 0 ; --$i) { + $num *= $BASE; + $num += $x -> [$i]; + } + return $num; +} + +############################################################################## +# actual math code + +sub _add { + # (ref to int_num_array, ref to int_num_array) + # + # Routine to add two base 1eX numbers stolen from Knuth Vol 2 Algorithm A + # pg 231. There are separate routines to add and sub as per Knuth pg 233. + # This routine modifies array x, but not y. + + my ($c, $x, $y) = @_; + + # $x + 0 => $x + + return $x if @$y == 1 && $y->[0] == 0; + + # 0 + $y => $y->copy + + if (@$x == 1 && $x->[0] == 0) { + @$x = @$y; + return $x; + } + + # For each in Y, add Y to X and carry. If after that, something is left in + # X, foreach in X add carry to X and then return X, carry. Trades one + # "$j++" for having to shift arrays. + my $i; + my $car = 0; + my $j = 0; + for $i (@$y) { + $x->[$j] -= $BASE if $car = (($x->[$j] += $i + $car) >= $BASE) ? 1 : 0; + $j++; + } + while ($car != 0) { + $x->[$j] -= $BASE if $car = (($x->[$j] += $car) >= $BASE) ? 1 : 0; + $j++; + } + $x; +} + +sub _inc { + # (ref to int_num_array, ref to int_num_array) + # Add 1 to $x, modify $x in place + my ($c, $x) = @_; + + for my $i (@$x) { + return $x if ($i += 1) < $BASE; # early out + $i = 0; # overflow, next + } + push @$x, 1 if $x->[-1] == 0; # last overflowed, so extend + $x; +} + +sub _dec { + # (ref to int_num_array, ref to int_num_array) + # Sub 1 from $x, modify $x in place + my ($c, $x) = @_; + + my $MAX = $BASE - 1; # since MAX_VAL based on BASE + for my $i (@$x) { + last if ($i -= 1) >= 0; # early out + $i = $MAX; # underflow, next + } + pop @$x if $x->[-1] == 0 && @$x > 1; # last underflowed (but leave 0) + $x; +} + +sub _sub { + # (ref to int_num_array, ref to int_num_array, swap) + # + # Subtract base 1eX numbers -- stolen from Knuth Vol 2 pg 232, $x > $y + # subtract Y from X by modifying x in place + my ($c, $sx, $sy, $s) = @_; + + my $car = 0; + my $i; + my $j = 0; + if (!$s) { + for $i (@$sx) { + last unless defined $sy->[$j] || $car; + $i += $BASE if $car = (($i -= ($sy->[$j] || 0) + $car) < 0); + $j++; + } + # might leave leading zeros, so fix that + return __strip_zeros($sx); + } + for $i (@$sx) { + # We can't do an early out if $x < $y, since we need to copy the high + # chunks from $y. Found by Bob Mathews. + #last unless defined $sy->[$j] || $car; + $sy->[$j] += $BASE + if $car = ($sy->[$j] = $i - ($sy->[$j] || 0) - $car) < 0; + $j++; + } + # might leave leading zeros, so fix that + __strip_zeros($sy); +} + +sub _mul_use_mul { + # (ref to int_num_array, ref to int_num_array) + # multiply two numbers in internal representation + # modifies first arg, second need not be different from first + my ($c, $xv, $yv) = @_; + + if (@$yv == 1) { + # shortcut for two very short numbers (improved by Nathan Zook) + # works also if xv and yv are the same reference, and handles also $x == 0 + if (@$xv == 1) { + if (($xv->[0] *= $yv->[0]) >= $BASE) { + $xv->[0] = $xv->[0] - ($xv->[1] = int($xv->[0] * $RBASE)) * $BASE; + } + ; + return $xv; + } + # $x * 0 => 0 + if ($yv->[0] == 0) { + @$xv = (0); + return $xv; + } + # multiply a large number a by a single element one, so speed up + my $y = $yv->[0]; + my $car = 0; + foreach my $i (@$xv) { + $i = $i * $y + $car; + $car = int($i * $RBASE); + $i -= $car * $BASE; + } + push @$xv, $car if $car != 0; + return $xv; + } + # shortcut for result $x == 0 => result = 0 + return $xv if @$xv == 1 && $xv->[0] == 0; + + # since multiplying $x with $x fails, make copy in this case + $yv = [ @$xv ] if $xv == $yv; # same references? + + my @prod = (); + my ($prod, $car, $cty, $xi, $yi); + + for $xi (@$xv) { + $car = 0; + $cty = 0; + + # slow variant + # for $yi (@$yv) + # { + # $prod = $xi * $yi + ($prod[$cty] || 0) + $car; + # $prod[$cty++] = + # $prod - ($car = int($prod * RBASE)) * $BASE; # see USE_MUL + # } + # $prod[$cty] += $car if $car; # need really to check for 0? + # $xi = shift @prod; + + # faster variant + # looping through this if $xi == 0 is silly - so optimize it away! + $xi = (shift @prod || 0), next if $xi == 0; + for $yi (@$yv) { + $prod = $xi * $yi + ($prod[$cty] || 0) + $car; + ## this is actually a tad slower + ## $prod = $prod[$cty]; $prod += ($car + $xi * $yi); # no ||0 here + $prod[$cty++] = + $prod - ($car = int($prod * $RBASE)) * $BASE; # see USE_MUL + } + $prod[$cty] += $car if $car; # need really to check for 0? + $xi = shift @prod || 0; # || 0 makes v5.005_3 happy + } + push @$xv, @prod; + # can't have leading zeros + # __strip_zeros($xv); + $xv; +} + +sub _mul_use_div_64 { + # (ref to int_num_array, ref to int_num_array) + # multiply two numbers in internal representation + # modifies first arg, second need not be different from first + # works for 64 bit integer with "use integer" + my ($c, $xv, $yv) = @_; + + use integer; + if (@$yv == 1) { + # shortcut for two small numbers, also handles $x == 0 + if (@$xv == 1) { + # shortcut for two very short numbers (improved by Nathan Zook) + # works also if xv and yv are the same reference, and handles also $x == 0 + if (($xv->[0] *= $yv->[0]) >= $BASE) { + $xv->[0] = + $xv->[0] - ($xv->[1] = $xv->[0] / $BASE) * $BASE; + } + return $xv; + } + # $x * 0 => 0 + if ($yv->[0] == 0) { + @$xv = (0); + return $xv; + } + # multiply a large number a by a single element one, so speed up + my $y = $yv->[0]; + my $car = 0; + foreach my $i (@$xv) { + #$i = $i * $y + $car; $car = $i / $BASE; $i -= $car * $BASE; + $i = $i * $y + $car; + $i -= ($car = $i / $BASE) * $BASE; + } + push @$xv, $car if $car != 0; + return $xv; + } + # shortcut for result $x == 0 => result = 0 + return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) ); + + # since multiplying $x with $x fails, make copy in this case + $yv = $c->_copy($xv) if $xv == $yv; # same references? + + my @prod = (); + my ($prod, $car, $cty, $xi, $yi); + for $xi (@$xv) { + $car = 0; + $cty = 0; + # looping through this if $xi == 0 is silly - so optimize it away! + $xi = (shift @prod || 0), next if $xi == 0; + for $yi (@$yv) { + $prod = $xi * $yi + ($prod[$cty] || 0) + $car; + $prod[$cty++] = $prod - ($car = $prod / $BASE) * $BASE; + } + $prod[$cty] += $car if $car; # need really to check for 0? + $xi = shift @prod || 0; # || 0 makes v5.005_3 happy + } + push @$xv, @prod; + $xv; +} + +sub _mul_use_div { + # (ref to int_num_array, ref to int_num_array) + # multiply two numbers in internal representation + # modifies first arg, second need not be different from first + my ($c, $xv, $yv) = @_; + + if (@$yv == 1) { + # shortcut for two small numbers, also handles $x == 0 + if (@$xv == 1) { + # shortcut for two very short numbers (improved by Nathan Zook) + # works also if xv and yv are the same reference, and handles also $x == 0 + if (($xv->[0] *= $yv->[0]) >= $BASE) { + $xv->[0] = + $xv->[0] - ($xv->[1] = int($xv->[0] / $BASE)) * $BASE; + } + ; + return $xv; + } + # $x * 0 => 0 + if ($yv->[0] == 0) { + @$xv = (0); + return $xv; + } + # multiply a large number a by a single element one, so speed up + my $y = $yv->[0]; + my $car = 0; + foreach my $i (@$xv) { + $i = $i * $y + $car; + $car = int($i / $BASE); + $i -= $car * $BASE; + # This (together with use integer;) does not work on 32-bit Perls + #$i = $i * $y + $car; $i -= ($car = $i / $BASE) * $BASE; + } + push @$xv, $car if $car != 0; + return $xv; + } + # shortcut for result $x == 0 => result = 0 + return $xv if ( ((@$xv == 1) && ($xv->[0] == 0)) ); + + # since multiplying $x with $x fails, make copy in this case + $yv = $c->_copy($xv) if $xv == $yv; # same references? + + my @prod = (); + my ($prod, $car, $cty, $xi, $yi); + for $xi (@$xv) { + $car = 0; + $cty = 0; + # looping through this if $xi == 0 is silly - so optimize it away! + $xi = (shift @prod || 0), next if $xi == 0; + for $yi (@$yv) { + $prod = $xi * $yi + ($prod[$cty] || 0) + $car; + $prod[$cty++] = $prod - ($car = int($prod / $BASE)) * $BASE; + } + $prod[$cty] += $car if $car; # need really to check for 0? + $xi = shift @prod || 0; # || 0 makes v5.005_3 happy + } + push @$xv, @prod; + # can't have leading zeros + # __strip_zeros($xv); + $xv; +} + +sub _div_use_mul { + # ref to array, ref to array, modify first array and return remainder if + # in list context + + # see comments in _div_use_div() for more explanations + + my ($c, $x, $yorg) = @_; + + # the general div algorithm here is about O(N*N) and thus quite slow, so + # we first check for some special cases and use shortcuts to handle them. + + # This works, because we store the numbers in a chunked format where each + # element contains 5..7 digits (depending on system). + + # if both numbers have only one element: + if (@$x == 1 && @$yorg == 1) { + # shortcut, $yorg and $x are two small numbers + if (wantarray) { + my $rem = [ $x->[0] % $yorg->[0] ]; + bless $rem, $c; + $x->[0] = int($x->[0] / $yorg->[0]); + return ($x, $rem); + } else { + $x->[0] = int($x->[0] / $yorg->[0]); + return $x; + } + } + + # if x has more than one, but y has only one element: + if (@$yorg == 1) { + my $rem; + $rem = $c->_mod($c->_copy($x), $yorg) if wantarray; + + # shortcut, $y is < $BASE + my $j = @$x; + my $r = 0; + my $y = $yorg->[0]; + my $b; + while ($j-- > 0) { + $b = $r * $BASE + $x->[$j]; + $x->[$j] = int($b/$y); + $r = $b % $y; + } + pop @$x if @$x > 1 && $x->[-1] == 0; # splice up a leading zero + return ($x, $rem) if wantarray; + return $x; + } + + # now x and y have more than one element + + # check whether y has more elements than x, if yet, the result will be 0 + if (@$yorg > @$x) { + my $rem; + $rem = $c->_copy($x) if wantarray; # make copy + @$x = 0; # set to 0 + return ($x, $rem) if wantarray; # including remainder? + return $x; # only x, which is [0] now + } + # check whether the numbers have the same number of elements, in that case + # the result will fit into one element and can be computed efficiently + if (@$yorg == @$x) { + + # if $yorg has more digits than $x (it's leading element is longer than + # the one from $x), the result will also be 0: + if (length(int($yorg->[-1])) > length(int($x->[-1]))) { + my $rem = $c->_copy($x) if wantarray; # make copy + @$x = 0; # set to 0 + return ($x, $rem) if wantarray; # including remainder? + return $x; + } + # now calculate $x / $yorg + if (length(int($yorg->[-1])) == length(int($x->[-1]))) { + # same length, so make full compare + + my $a = 0; + my $j = @$x - 1; + # manual way (abort if unequal, good for early ne) + while ($j >= 0) { + last if ($a = $x->[$j] - $yorg->[$j]); + $j--; + } + # $a contains the result of the compare between X and Y + # a < 0: x < y, a == 0: x == y, a > 0: x > y + if ($a <= 0) { + # a = 0 => x == y => rem 0 + # a < 0 => x < y => rem = x + my $rem = $a == 0 ? $c->_zero() : $c->_copy($x); + @$x = 0; # if $a < 0 + $x->[0] = 1 if $a == 0; # $x == $y + return ($x, $rem) if wantarray; + return $x; + } + # $x >= $y, so proceed normally + } + } + + # all other cases: + + my $y = $c->_copy($yorg); # always make copy to preserve + + my ($car, $bar, $prd, $dd, $xi, $yi, @q, $v2, $v1, @d, $tmp, $q, $u2, $u1, $u0); + + $car = $bar = $prd = 0; + if (($dd = int($BASE / ($y->[-1] + 1))) != 1) { + for $xi (@$x) { + $xi = $xi * $dd + $car; + $xi -= ($car = int($xi * $RBASE)) * $BASE; # see USE_MUL + } + push(@$x, $car); + $car = 0; + for $yi (@$y) { + $yi = $yi * $dd + $car; + $yi -= ($car = int($yi * $RBASE)) * $BASE; # see USE_MUL + } + } else { + push(@$x, 0); + } + @q = (); + ($v2, $v1) = @$y[-2, -1]; + $v2 = 0 unless $v2; + while ($#$x > $#$y) { + ($u2, $u1, $u0) = @$x[-3 .. -1]; + $u2 = 0 unless $u2; + #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n" + # if $v1 == 0; + $q = (($u0 == $v1) ? $MAX_VAL : int(($u0 * $BASE + $u1) / $v1)); + --$q while ($v2 * $q > ($u0 * $BASE + $u1 - $q * $v1) * $BASE + $u2); + if ($q) { + ($car, $bar) = (0, 0); + for ($yi = 0, $xi = $#$x - $#$y-1; $yi <= $#$y; ++$yi, ++$xi) { + $prd = $q * $y->[$yi] + $car; + $prd -= ($car = int($prd * $RBASE)) * $BASE; # see USE_MUL + $x->[$xi] += $BASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0)); + } + if ($x->[-1] < $car + $bar) { + $car = 0; + --$q; + for ($yi = 0, $xi = $#$x - $#$y-1; $yi <= $#$y; ++$yi, ++$xi) { + $x->[$xi] -= $BASE + if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $BASE)); + } + } + } + pop(@$x); + unshift(@q, $q); + } + if (wantarray) { + my $d = bless [], $c; + if ($dd != 1) { + $car = 0; + for $xi (reverse @$x) { + $prd = $car * $BASE + $xi; + $car = $prd - ($tmp = int($prd / $dd)) * $dd; # see USE_MUL + unshift(@$d, $tmp); + } + } else { + @$d = @$x; + } + @$x = @q; + __strip_zeros($x); + __strip_zeros($d); + return ($x, $d); + } + @$x = @q; + __strip_zeros($x); + $x; +} + +sub _div_use_div_64 { + # ref to array, ref to array, modify first array and return remainder if + # in list context + # This version works on 64 bit integers + my ($c, $x, $yorg) = @_; + + use integer; + # the general div algorithm here is about O(N*N) and thus quite slow, so + # we first check for some special cases and use shortcuts to handle them. + + # This works, because we store the numbers in a chunked format where each + # element contains 5..7 digits (depending on system). + + # if both numbers have only one element: + if (@$x == 1 && @$yorg == 1) { + # shortcut, $yorg and $x are two small numbers + if (wantarray) { + my $rem = [ $x->[0] % $yorg->[0] ]; + bless $rem, $c; + $x->[0] = int($x->[0] / $yorg->[0]); + return ($x, $rem); + } else { + $x->[0] = int($x->[0] / $yorg->[0]); + return $x; + } + } + # if x has more than one, but y has only one element: + if (@$yorg == 1) { + my $rem; + $rem = $c->_mod($c->_copy($x), $yorg) if wantarray; + + # shortcut, $y is < $BASE + my $j = @$x; + my $r = 0; + my $y = $yorg->[0]; + my $b; + while ($j-- > 0) { + $b = $r * $BASE + $x->[$j]; + $x->[$j] = int($b/$y); + $r = $b % $y; + } + pop @$x if @$x > 1 && $x->[-1] == 0; # splice up a leading zero + return ($x, $rem) if wantarray; + return $x; + } + # now x and y have more than one element + + # check whether y has more elements than x, if yet, the result will be 0 + if (@$yorg > @$x) { + my $rem; + $rem = $c->_copy($x) if wantarray; # make copy + @$x = 0; # set to 0 + return ($x, $rem) if wantarray; # including remainder? + return $x; # only x, which is [0] now + } + # check whether the numbers have the same number of elements, in that case + # the result will fit into one element and can be computed efficiently + if (@$yorg == @$x) { + my $rem; + # if $yorg has more digits than $x (it's leading element is longer than + # the one from $x), the result will also be 0: + if (length(int($yorg->[-1])) > length(int($x->[-1]))) { + $rem = $c->_copy($x) if wantarray; # make copy + @$x = 0; # set to 0 + return ($x, $rem) if wantarray; # including remainder? + return $x; + } + # now calculate $x / $yorg + + if (length(int($yorg->[-1])) == length(int($x->[-1]))) { + # same length, so make full compare + + my $a = 0; + my $j = @$x - 1; + # manual way (abort if unequal, good for early ne) + while ($j >= 0) { + last if ($a = $x->[$j] - $yorg->[$j]); + $j--; + } + # $a contains the result of the compare between X and Y + # a < 0: x < y, a == 0: x == y, a > 0: x > y + if ($a <= 0) { + $rem = $c->_zero(); # a = 0 => x == y => rem 0 + $rem = $c->_copy($x) if $a != 0; # a < 0 => x < y => rem = x + @$x = 0; # if $a < 0 + $x->[0] = 1 if $a == 0; # $x == $y + return ($x, $rem) if wantarray; # including remainder? + return $x; + } + # $x >= $y, so proceed normally + } + } + + # all other cases: + + my $y = $c->_copy($yorg); # always make copy to preserve + + my ($car, $bar, $prd, $dd, $xi, $yi, @q, $v2, $v1, @d, $tmp, $q, $u2, $u1, $u0); + + $car = $bar = $prd = 0; + if (($dd = int($BASE / ($y->[-1] + 1))) != 1) { + for $xi (@$x) { + $xi = $xi * $dd + $car; + $xi -= ($car = int($xi / $BASE)) * $BASE; + } + push(@$x, $car); + $car = 0; + for $yi (@$y) { + $yi = $yi * $dd + $car; + $yi -= ($car = int($yi / $BASE)) * $BASE; + } + } else { + push(@$x, 0); + } + + # @q will accumulate the final result, $q contains the current computed + # part of the final result + + @q = (); + ($v2, $v1) = @$y[-2, -1]; + $v2 = 0 unless $v2; + while ($#$x > $#$y) { + ($u2, $u1, $u0) = @$x[-3..-1]; + $u2 = 0 unless $u2; + #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n" + # if $v1 == 0; + $q = (($u0 == $v1) ? $MAX_VAL : int(($u0 * $BASE + $u1) / $v1)); + --$q while ($v2 * $q > ($u0 * $BASE +$ u1- $q*$v1) * $BASE + $u2); + if ($q) { + ($car, $bar) = (0, 0); + for ($yi = 0, $xi = $#$x - $#$y - 1; $yi <= $#$y; ++$yi, ++$xi) { + $prd = $q * $y->[$yi] + $car; + $prd -= ($car = int($prd / $BASE)) * $BASE; + $x->[$xi] += $BASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0)); + } + if ($x->[-1] < $car + $bar) { + $car = 0; + --$q; + for ($yi = 0, $xi = $#$x - $#$y - 1; $yi <= $#$y; ++$yi, ++$xi) { + $x->[$xi] -= $BASE + if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $BASE)); + } + } + } + pop(@$x); + unshift(@q, $q); + } + if (wantarray) { + my $d = bless [], $c; + if ($dd != 1) { + $car = 0; + for $xi (reverse @$x) { + $prd = $car * $BASE + $xi; + $car = $prd - ($tmp = int($prd / $dd)) * $dd; + unshift(@$d, $tmp); + } + } else { + @$d = @$x; + } + @$x = @q; + __strip_zeros($x); + __strip_zeros($d); + return ($x, $d); + } + @$x = @q; + __strip_zeros($x); + $x; +} + +sub _div_use_div { + # ref to array, ref to array, modify first array and return remainder if + # in list context + my ($c, $x, $yorg) = @_; + + # the general div algorithm here is about O(N*N) and thus quite slow, so + # we first check for some special cases and use shortcuts to handle them. + + # This works, because we store the numbers in a chunked format where each + # element contains 5..7 digits (depending on system). + + # if both numbers have only one element: + if (@$x == 1 && @$yorg == 1) { + # shortcut, $yorg and $x are two small numbers + if (wantarray) { + my $rem = [ $x->[0] % $yorg->[0] ]; + bless $rem, $c; + $x->[0] = int($x->[0] / $yorg->[0]); + return ($x, $rem); + } else { + $x->[0] = int($x->[0] / $yorg->[0]); + return $x; + } + } + # if x has more than one, but y has only one element: + if (@$yorg == 1) { + my $rem; + $rem = $c->_mod($c->_copy($x), $yorg) if wantarray; + + # shortcut, $y is < $BASE + my $j = @$x; + my $r = 0; + my $y = $yorg->[0]; + my $b; + while ($j-- > 0) { + $b = $r * $BASE + $x->[$j]; + $x->[$j] = int($b/$y); + $r = $b % $y; + } + pop @$x if @$x > 1 && $x->[-1] == 0; # splice up a leading zero + return ($x, $rem) if wantarray; + return $x; + } + # now x and y have more than one element + + # check whether y has more elements than x, if yet, the result will be 0 + if (@$yorg > @$x) { + my $rem; + $rem = $c->_copy($x) if wantarray; # make copy + @$x = 0; # set to 0 + return ($x, $rem) if wantarray; # including remainder? + return $x; # only x, which is [0] now + } + # check whether the numbers have the same number of elements, in that case + # the result will fit into one element and can be computed efficiently + if (@$yorg == @$x) { + my $rem; + # if $yorg has more digits than $x (it's leading element is longer than + # the one from $x), the result will also be 0: + if (length(int($yorg->[-1])) > length(int($x->[-1]))) { + $rem = $c->_copy($x) if wantarray; # make copy + @$x = 0; # set to 0 + return ($x, $rem) if wantarray; # including remainder? + return $x; + } + # now calculate $x / $yorg + + if (length(int($yorg->[-1])) == length(int($x->[-1]))) { + # same length, so make full compare + + my $a = 0; + my $j = @$x - 1; + # manual way (abort if unequal, good for early ne) + while ($j >= 0) { + last if ($a = $x->[$j] - $yorg->[$j]); + $j--; + } + # $a contains the result of the compare between X and Y + # a < 0: x < y, a == 0: x == y, a > 0: x > y + if ($a <= 0) { + $rem = $c->_zero(); # a = 0 => x == y => rem 0 + $rem = $c->_copy($x) if $a != 0; # a < 0 => x < y => rem = x + @$x = 0; + $x->[0] = 0; # if $a < 0 + $x->[0] = 1 if $a == 0; # $x == $y + return ($x, $rem) if wantarray; # including remainder? + return $x; + } + # $x >= $y, so proceed normally + + } + } + + # all other cases: + + my $y = $c->_copy($yorg); # always make copy to preserve + + my ($car, $bar, $prd, $dd, $xi, $yi, @q, $v2, $v1, @d, $tmp, $q, $u2, $u1, $u0); + + $car = $bar = $prd = 0; + if (($dd = int($BASE / ($y->[-1] + 1))) != 1) { + for $xi (@$x) { + $xi = $xi * $dd + $car; + $xi -= ($car = int($xi / $BASE)) * $BASE; + } + push(@$x, $car); + $car = 0; + for $yi (@$y) { + $yi = $yi * $dd + $car; + $yi -= ($car = int($yi / $BASE)) * $BASE; + } + } else { + push(@$x, 0); + } + + # @q will accumulate the final result, $q contains the current computed + # part of the final result + + @q = (); + ($v2, $v1) = @$y[-2, -1]; + $v2 = 0 unless $v2; + while ($#$x > $#$y) { + ($u2, $u1, $u0) = @$x[-3..-1]; + $u2 = 0 unless $u2; + #warn "oups v1 is 0, u0: $u0 $y->[-2] $y->[-1] l ",scalar @$y,"\n" + # if $v1 == 0; + $q = (($u0 == $v1) ? $MAX_VAL : int(($u0 * $BASE + $u1) / $v1)); + --$q while ($v2 * $q > ($u0 * $BASE + $u1 - $q * $v1) * $BASE + $u2); + if ($q) { + ($car, $bar) = (0, 0); + for ($yi = 0, $xi = $#$x - $#$y - 1; $yi <= $#$y; ++$yi, ++$xi) { + $prd = $q * $y->[$yi] + $car; + $prd -= ($car = int($prd / $BASE)) * $BASE; + $x->[$xi] += $BASE if ($bar = (($x->[$xi] -= $prd + $bar) < 0)); + } + if ($x->[-1] < $car + $bar) { + $car = 0; + --$q; + for ($yi = 0, $xi = $#$x - $#$y - 1; $yi <= $#$y; ++$yi, ++$xi) { + $x->[$xi] -= $BASE + if ($car = (($x->[$xi] += $y->[$yi] + $car) >= $BASE)); + } + } + } + pop(@$x); + unshift(@q, $q); + } + if (wantarray) { + my $d = bless [], $c; + if ($dd != 1) { + $car = 0; + for $xi (reverse @$x) { + $prd = $car * $BASE + $xi; + $car = $prd - ($tmp = int($prd / $dd)) * $dd; + unshift(@$d, $tmp); + } + } else { + @$d = @$x; + } + @$x = @q; + __strip_zeros($x); + __strip_zeros($d); + return ($x, $d); + } + @$x = @q; + __strip_zeros($x); + $x; +} + +############################################################################## +# testing + +sub _acmp { + # Internal absolute post-normalized compare (ignore signs) + # ref to array, ref to array, return <0, 0, >0 + # Arrays must have at least one entry; this is not checked for. + my ($c, $cx, $cy) = @_; + + # shortcut for short numbers + return (($cx->[0] <=> $cy->[0]) <=> 0) + if @$cx == 1 && @$cy == 1; + + # fast comp based on number of array elements (aka pseudo-length) + my $lxy = (@$cx - @$cy) + # or length of first element if same number of elements (aka difference 0) + || + # need int() here because sometimes the last element is '00018' vs '18' + (length(int($cx->[-1])) - length(int($cy->[-1]))); + + return -1 if $lxy < 0; # already differs, ret + return 1 if $lxy > 0; # ditto + + # manual way (abort if unequal, good for early ne) + my $a; + my $j = @$cx; + while (--$j >= 0) { + last if $a = $cx->[$j] - $cy->[$j]; + } + $a <=> 0; +} + +sub _len { + # compute number of digits in base 10 + + # int() because add/sub sometimes leaves strings (like '00005') instead of + # '5' in this place, thus causing length() to report wrong length + my $cx = $_[1]; + + (@$cx - 1) * $BASE_LEN + length(int($cx->[-1])); +} + +sub _digit { + # Return the nth digit. Zero is rightmost, so _digit(123, 0) gives 3. + # Negative values count from the left, so _digit(123, -1) gives 1. + my ($c, $x, $n) = @_; + + my $len = _len('', $x); + + $n += $len if $n < 0; # -1 last, -2 second-to-last + + # Math::BigInt::Calc returns 0 if N is out of range, but this is not done + # by the other backend libraries. + + return "0" if $n < 0 || $n >= $len; # return 0 for digits out of range + + my $elem = int($n / $BASE_LEN); # index of array element + my $digit = $n % $BASE_LEN; # index of digit within the element + substr("0" x $BASE_LEN . "$x->[$elem]", -1 - $digit, 1); +} + +sub _zeros { + # Return number of trailing zeros in decimal. + # Check each array element for having 0 at end as long as elem == 0 + # Upon finding a elem != 0, stop. + + my $x = $_[1]; + + return 0 if @$x == 1 && $x->[0] == 0; + + my $zeros = 0; + foreach my $elem (@$x) { + if ($elem != 0) { + $elem =~ /[^0](0*)\z/; + $zeros += length($1); # count trailing zeros + last; # early out + } + $zeros += $BASE_LEN; + } + $zeros; +} + +############################################################################## +# _is_* routines + +sub _is_zero { + # return true if arg is zero + @{$_[1]} == 1 && $_[1]->[0] == 0 ? 1 : 0; +} + +sub _is_even { + # return true if arg is even + $_[1]->[0] & 1 ? 0 : 1; +} + +sub _is_odd { + # return true if arg is odd + $_[1]->[0] & 1 ? 1 : 0; +} + +sub _is_one { + # return true if arg is one + @{$_[1]} == 1 && $_[1]->[0] == 1 ? 1 : 0; +} + +sub _is_two { + # return true if arg is two + @{$_[1]} == 1 && $_[1]->[0] == 2 ? 1 : 0; +} + +sub _is_ten { + # return true if arg is ten + @{$_[1]} == 1 && $_[1]->[0] == 10 ? 1 : 0; +} + +sub __strip_zeros { + # Internal normalization function that strips leading zeros from the array. + # Args: ref to array + my $x = shift; + + push @$x, 0 if @$x == 0; # div might return empty results, so fix it + return $x if @$x == 1; # early out + + #print "strip: cnt $cnt i $i\n"; + # '0', '3', '4', '0', '0', + # 0 1 2 3 4 + # cnt = 5, i = 4 + # i = 4 + # i = 3 + # => fcnt = cnt - i (5-2 => 3, cnt => 5-1 = 4, throw away from 4th pos) + # >= 1: skip first part (this can be zero) + + my $i = $#$x; + while ($i > 0) { + last if $x->[$i] != 0; + $i--; + } + $i++; + splice(@$x, $i) if $i < @$x; + $x; +} + +############################################################################### +# check routine to test internal state for corruptions + +sub _check { + # used by the test suite + my ($class, $x) = @_; + + my $msg = $class -> SUPER::_check($x); + return $msg if $msg; + + my $n; + eval { $n = @$x }; + return "Not an array reference" unless $@ eq ''; + + return "Reference to an empty array" unless $n > 0; + + # The following fails with Math::BigInt::FastCalc because a + # Math::BigInt::FastCalc "object" is an unblessed array ref. + # + #return 0 unless ref($x) eq $class; + + for (my $i = 0 ; $i <= $#$x ; ++ $i) { + my $e = $x -> [$i]; + + return "Element at index $i is undefined" + unless defined $e; + + return "Element at index $i is a '" . ref($e) . + "', which is not a scalar" + unless ref($e) eq ""; + + # It would be better to use the regex /^([1-9]\d*|0)\z/, but that fails + # in Math::BigInt::FastCalc, because it sometimes creates array + # elements like "000000". + return "Element at index $i is '$e', which does not look like an" . + " normal integer" unless $e =~ /^\d+\z/; + + return "Element at index $i is '$e', which is not smaller than" . + " the base '$BASE'" if $e >= $BASE; + + return "Element at index $i (last element) is zero" + if $#$x > 0 && $i == $#$x && $e == 0; + } + + return 0; +} + +############################################################################### + +sub _mod { + # if possible, use mod shortcut + my ($c, $x, $yo) = @_; + + # slow way since $y too big + if (@$yo > 1) { + my ($xo, $rem) = $c->_div($x, $yo); + @$x = @$rem; + return $x; + } + + my $y = $yo->[0]; + + # if both are single element arrays + if (@$x == 1) { + $x->[0] %= $y; + return $x; + } + + # if @$x has more than one element, but @$y is a single element + my $b = $BASE % $y; + if ($b == 0) { + # when BASE % Y == 0 then (B * BASE) % Y == 0 + # (B * BASE) % $y + A % Y => A % Y + # so need to consider only last element: O(1) + $x->[0] %= $y; + } elsif ($b == 1) { + # else need to go through all elements in @$x: O(N), but loop is a bit + # simplified + my $r = 0; + foreach (@$x) { + $r = ($r + $_) % $y; # not much faster, but heh... + #$r += $_ % $y; $r %= $y; + } + $r = 0 if $r == $y; + $x->[0] = $r; + } else { + # else need to go through all elements in @$x: O(N) + my $r = 0; + my $bm = 1; + foreach (@$x) { + $r = ($_ * $bm + $r) % $y; + $bm = ($bm * $b) % $y; + + #$r += ($_ % $y) * $bm; + #$bm *= $b; + #$bm %= $y; + #$r %= $y; + } + $r = 0 if $r == $y; + $x->[0] = $r; + } + @$x = $x->[0]; # keep one element of @$x + return $x; +} + +############################################################################## +# shifts + +sub _rsft { + my ($c, $x, $y, $n) = @_; + + if ($n != 10) { + $n = $c->_new($n); + return scalar $c->_div($x, $c->_pow($n, $y)); + } + + # shortcut (faster) for shifting by 10) + # multiples of $BASE_LEN + my $dst = 0; # destination + my $src = $c->_num($y); # as normal int + my $xlen = (@$x - 1) * $BASE_LEN + length(int($x->[-1])); + if ($src >= $xlen or ($src == $xlen and !defined $x->[1])) { + # 12345 67890 shifted right by more than 10 digits => 0 + splice(@$x, 1); # leave only one element + $x->[0] = 0; # set to zero + return $x; + } + my $rem = $src % $BASE_LEN; # remainder to shift + $src = int($src / $BASE_LEN); # source + if ($rem == 0) { + splice(@$x, 0, $src); # even faster, 38.4 => 39.3 + } else { + my $len = @$x - $src; # elems to go + my $vd; + my $z = '0' x $BASE_LEN; + $x->[ @$x ] = 0; # avoid || 0 test inside loop + while ($dst < $len) { + $vd = $z . $x->[$src]; + $vd = substr($vd, -$BASE_LEN, $BASE_LEN - $rem); + $src++; + $vd = substr($z . $x->[$src], -$rem, $rem) . $vd; + $vd = substr($vd, -$BASE_LEN, $BASE_LEN) if length($vd) > $BASE_LEN; + $x->[$dst] = int($vd); + $dst++; + } + splice(@$x, $dst) if $dst > 0; # kill left-over array elems + pop @$x if $x->[-1] == 0 && @$x > 1; # kill last element if 0 + } # else rem == 0 + $x; +} + +sub _lsft { + my ($c, $x, $n, $b) = @_; + + return $x if $c->_is_zero($x); + + # Handle the special case when the base is a power of 10. Don't check + # whether log($b)/log(10) is an integer, because log(1000)/log(10) is not + # exactly 3. + + my $log10 = sprintf "%.0f", log($b) / log(10); + if ($b == 10 ** $log10) { + $b = 10; + $n = $c->_mul($n, $c->_new($log10)); + + # shortcut (faster) for shifting by 10) since we are in base 10eX + # multiples of $BASE_LEN: + my $src = @$x; # source + my $len = $c->_num($n); # shift-len as normal int + my $rem = $len % $BASE_LEN; # remainder to shift + my $dst = $src + int($len / $BASE_LEN); # destination + my $vd; # further speedup + $x->[$src] = 0; # avoid first ||0 for speed + my $z = '0' x $BASE_LEN; + while ($src >= 0) { + $vd = $x->[$src]; + $vd = $z . $vd; + $vd = substr($vd, -$BASE_LEN + $rem, $BASE_LEN - $rem); + $vd .= $src > 0 ? substr($z . $x->[$src - 1], -$BASE_LEN, $rem) + : '0' x $rem; + $vd = substr($vd, -$BASE_LEN, $BASE_LEN) if length($vd) > $BASE_LEN; + $x->[$dst] = int($vd); + $dst--; + $src--; + } + # set lowest parts to 0 + while ($dst >= 0) { + $x->[$dst--] = 0; + } + # fix spurious last zero element + splice @$x, -1 if $x->[-1] == 0; + return $x; + } else { + $b = $c->_new($b); + #print $c->_str($b); + return $c->_mul($x, $c->_pow($b, $n)); + } +} + +sub _pow { + # power of $x to $y + # ref to array, ref to array, return ref to array + my ($c, $cx, $cy) = @_; + + if (@$cy == 1 && $cy->[0] == 0) { + splice(@$cx, 1); + $cx->[0] = 1; # y == 0 => x => 1 + return $cx; + } + + if ((@$cx == 1 && $cx->[0] == 1) || # x == 1 + (@$cy == 1 && $cy->[0] == 1)) # or y == 1 + { + return $cx; + } + + if (@$cx == 1 && $cx->[0] == 0) { + splice (@$cx, 1); + $cx->[0] = 0; # 0 ** y => 0 (if not y <= 0) + return $cx; + } + + my $pow2 = $c->_one(); + + my $y_bin = $c->_as_bin($cy); + $y_bin =~ s/^0b//; + my $len = length($y_bin); + while (--$len > 0) { + $c->_mul($pow2, $cx) if substr($y_bin, $len, 1) eq '1'; # is odd? + $c->_mul($cx, $cx); + } + + $c->_mul($cx, $pow2); + $cx; +} + +sub _nok { + # Return binomial coefficient (n over k). + # Given refs to arrays, return ref to array. + # First input argument is modified. + + my ($c, $n, $k) = @_; + + # If k > n/2, or, equivalently, 2*k > n, compute nok(n, k) as + # nok(n, n-k), to minimize the number if iterations in the loop. + + { + my $twok = $c->_mul($c->_two(), $c->_copy($k)); # 2 * k + if ($c->_acmp($twok, $n) > 0) { # if 2*k > n + $k = $c->_sub($c->_copy($n), $k); # k = n - k + } + } + + # Example: + # + # / 7 \ 7! 1*2*3*4 * 5*6*7 5 * 6 * 7 6 7 + # | | = --------- = --------------- = --------- = 5 * - * - + # \ 3 / (7-3)! 3! 1*2*3*4 * 1*2*3 1 * 2 * 3 2 3 + + if ($c->_is_zero($k)) { + @$n = 1; + } else { + + # Make a copy of the original n, since we'll be modifying n in-place. + + my $n_orig = $c->_copy($n); + + # n = 5, f = 6, d = 2 (cf. example above) + + $c->_sub($n, $k); + $c->_inc($n); + + my $f = $c->_copy($n); + $c->_inc($f); + + my $d = $c->_two(); + + # while f <= n (the original n, that is) ... + + while ($c->_acmp($f, $n_orig) <= 0) { + + # n = (n * f / d) == 5 * 6 / 2 (cf. example above) + + $c->_mul($n, $f); + $c->_div($n, $d); + + # f = 7, d = 3 (cf. example above) + + $c->_inc($f); + $c->_inc($d); + } + + } + + return $n; +} + +my @factorials = ( + 1, + 1, + 2, + 2*3, + 2*3*4, + 2*3*4*5, + 2*3*4*5*6, + 2*3*4*5*6*7, + ); + +sub _fac { + # factorial of $x + # ref to array, return ref to array + my ($c, $cx) = @_; + + if ((@$cx == 1) && ($cx->[0] <= 7)) { + $cx->[0] = $factorials[$cx->[0]]; # 0 => 1, 1 => 1, 2 => 2 etc. + return $cx; + } + + if ((@$cx == 1) && # we do this only if $x >= 12 and $x <= 7000 + ($cx->[0] >= 12 && $cx->[0] < 7000)) { + + # Calculate (k-j) * (k-j+1) ... k .. (k+j-1) * (k + j) + # See http://blogten.blogspot.com/2007/01/calculating-n.html + # The above series can be expressed as factors: + # k * k - (j - i) * 2 + # We cache k*k, and calculate (j * j) as the sum of the first j odd integers + + # This will not work when N exceeds the storage of a Perl scalar, however, + # in this case the algorithm would be way too slow to terminate, anyway. + + # As soon as the last element of $cx is 0, we split it up and remember + # how many zeors we got so far. The reason is that n! will accumulate + # zeros at the end rather fast. + my $zero_elements = 0; + + # If n is even, set n = n -1 + my $k = $c->_num($cx); + my $even = 1; + if (($k & 1) == 0) { + $even = $k; + $k --; + } + # set k to the center point + $k = ($k + 1) / 2; + # print "k $k even: $even\n"; + # now calculate k * k + my $k2 = $k * $k; + my $odd = 1; + my $sum = 1; + my $i = $k - 1; + # keep reference to x + my $new_x = $c->_new($k * $even); + @$cx = @$new_x; + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + # print STDERR "x = ", $c->_str($cx), "\n"; + my $BASE2 = int(sqrt($BASE))-1; + my $j = 1; + while ($j <= $i) { + my $m = ($k2 - $sum); + $odd += 2; + $sum += $odd; + $j++; + while ($j <= $i && ($m < $BASE2) && (($k2 - $sum) < $BASE2)) { + $m *= ($k2 - $sum); + $odd += 2; + $sum += $odd; + $j++; + # print STDERR "\n k2 $k2 m $m sum $sum odd $odd\n"; sleep(1); + } + if ($m < $BASE) { + $c->_mul($cx, [$m]); + } else { + $c->_mul($cx, $c->_new($m)); + } + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + # print STDERR "Calculate $k2 - $sum = $m (x = ", $c->_str($cx), ")\n"; + } + # multiply in the zeros again + unshift @$cx, (0) x $zero_elements; + return $cx; + } + + # go forward until $base is exceeded limit is either $x steps (steps == 100 + # means a result always too high) or $base. + my $steps = 100; + $steps = $cx->[0] if @$cx == 1; + my $r = 2; + my $cf = 3; + my $step = 2; + my $last = $r; + while ($r * $cf < $BASE && $step < $steps) { + $last = $r; + $r *= $cf++; + $step++; + } + if ((@$cx == 1) && $step == $cx->[0]) { + # completely done, so keep reference to $x and return + $cx->[0] = $r; + return $cx; + } + + # now we must do the left over steps + my $n; # steps still to do + if (@$cx == 1) { + $n = $cx->[0]; + } else { + $n = $c->_copy($cx); + } + + # Set $cx to the last result below $BASE (but keep ref to $x) + $cx->[0] = $last; + splice (@$cx, 1); + # As soon as the last element of $cx is 0, we split it up and remember + # how many zeors we got so far. The reason is that n! will accumulate + # zeros at the end rather fast. + my $zero_elements = 0; + + # do left-over steps fit into a scalar? + if (ref $n eq 'ARRAY') { + # No, so use slower inc() & cmp() + # ($n is at least $BASE here) + my $base_2 = int(sqrt($BASE)) - 1; + #print STDERR "base_2: $base_2\n"; + while ($step < $base_2) { + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + my $b = $step * ($step + 1); + $step += 2; + $c->_mul($cx, [$b]); + } + $step = [$step]; + while ($c->_acmp($step, $n) <= 0) { + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + $c->_mul($cx, $step); + $c->_inc($step); + } + } else { + # Yes, so we can speed it up slightly + + # print "# left over steps $n\n"; + + my $base_4 = int(sqrt(sqrt($BASE))) - 2; + #print STDERR "base_4: $base_4\n"; + my $n4 = $n - 4; + while ($step < $n4 && $step < $base_4) { + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + my $b = $step * ($step + 1); + $step += 2; + $b *= $step * ($step + 1); + $step += 2; + $c->_mul($cx, [$b]); + } + my $base_2 = int(sqrt($BASE)) - 1; + my $n2 = $n - 2; + #print STDERR "base_2: $base_2\n"; + while ($step < $n2 && $step < $base_2) { + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + my $b = $step * ($step + 1); + $step += 2; + $c->_mul($cx, [$b]); + } + # do what's left over + while ($step <= $n) { + $c->_mul($cx, [$step]); + $step++; + if ($cx->[0] == 0) { + $zero_elements ++; + shift @$cx; + } + } + } + # multiply in the zeros again + unshift @$cx, (0) x $zero_elements; + $cx; # return result +} + +sub _log_int { + # calculate integer log of $x to base $base + # ref to array, ref to array - return ref to array + my ($c, $x, $base) = @_; + + # X == 0 => NaN + return if @$x == 1 && $x->[0] == 0; + + # BASE 0 or 1 => NaN + return if @$base == 1 && $base->[0] < 2; + + # X == 1 => 0 (is exact) + if (@$x == 1 && $x->[0] == 1) { + @$x = 0; + return $x, 1; + } + + my $cmp = $c->_acmp($x, $base); + + # X == BASE => 1 (is exact) + if ($cmp == 0) { + @$x = 1; + return $x, 1; + } + + # 1 < X < BASE => 0 (is truncated) + if ($cmp < 0) { + @$x = 0; + return $x, 0; + } + + my $x_org = $c->_copy($x); # preserve x + + # Compute a guess for the result based on: + # $guess = int ( length_in_base_10(X) / ( log(base) / log(10) ) ) + my $len = $c->_len($x_org); + my $log = log($base->[-1]) / log(10); + + # for each additional element in $base, we add $BASE_LEN to the result, + # based on the observation that log($BASE, 10) is BASE_LEN and + # log(x*y) == log(x) + log(y): + $log += (@$base - 1) * $BASE_LEN; + + # calculate now a guess based on the values obtained above: + my $res = int($len / $log); + + @$x = $res; + my $trial = $c->_pow($c->_copy($base), $x); + my $acmp = $c->_acmp($trial, $x_org); + + # Did we get the exact result? + + return $x, 1 if $acmp == 0; + + # Too small? + + while ($acmp < 0) { + $c->_mul($trial, $base); + $c->_inc($x); + $acmp = $c->_acmp($trial, $x_org); + } + + # Too big? + + while ($acmp > 0) { + $c->_div($trial, $base); + $c->_dec($x); + $acmp = $c->_acmp($trial, $x_org); + } + + return $x, 1 if $acmp == 0; # result is exact + return $x, 0; # result is too small +} + +# for debugging: +use constant DEBUG => 0; +my $steps = 0; +sub steps { $steps }; + +sub _sqrt { + # square-root of $x in place + # Compute a guess of the result (by rule of thumb), then improve it via + # Newton's method. + my ($c, $x) = @_; + + if (@$x == 1) { + # fits into one Perl scalar, so result can be computed directly + $x->[0] = int(sqrt($x->[0])); + return $x; + } + my $y = $c->_copy($x); + # hopefully _len/2 is < $BASE, the -1 is to always undershot the guess + # since our guess will "grow" + my $l = int(($c->_len($x)-1) / 2); + + my $lastelem = $x->[-1]; # for guess + my $elems = @$x - 1; + # not enough digits, but could have more? + if ((length($lastelem) <= 3) && ($elems > 1)) { + # right-align with zero pad + my $len = length($lastelem) & 1; + print "$lastelem => " if DEBUG; + $lastelem .= substr($x->[-2] . '0' x $BASE_LEN, 0, $BASE_LEN); + # former odd => make odd again, or former even to even again + $lastelem = $lastelem / 10 if (length($lastelem) & 1) != $len; + print "$lastelem\n" if DEBUG; + } + + # construct $x (instead of $c->_lsft($x, $l, 10) + my $r = $l % $BASE_LEN; # 10000 00000 00000 00000 ($BASE_LEN=5) + $l = int($l / $BASE_LEN); + print "l = $l " if DEBUG; + + splice @$x, $l; # keep ref($x), but modify it + + # we make the first part of the guess not '1000...0' but int(sqrt($lastelem)) + # that gives us: + # 14400 00000 => sqrt(14400) => guess first digits to be 120 + # 144000 000000 => sqrt(144000) => guess 379 + + print "$lastelem (elems $elems) => " if DEBUG; + $lastelem = $lastelem / 10 if ($elems & 1 == 1); # odd or even? + my $g = sqrt($lastelem); + $g =~ s/\.//; # 2.345 => 2345 + $r -= 1 if $elems & 1 == 0; # 70 => 7 + + # padd with zeros if result is too short + $x->[$l--] = int(substr($g . '0' x $r, 0, $r+1)); + print "now ", $x->[-1] if DEBUG; + print " would have been ", int('1' . '0' x $r), "\n" if DEBUG; + + # If @$x > 1, we could compute the second elem of the guess, too, to create + # an even better guess. Not implemented yet. Does it improve performance? + $x->[$l--] = 0 while ($l >= 0); # all other digits of guess are zero + + print "start x= ", $c->_str($x), "\n" if DEBUG; + my $two = $c->_two(); + my $last = $c->_zero(); + my $lastlast = $c->_zero(); + $steps = 0 if DEBUG; + while ($c->_acmp($last, $x) != 0 && $c->_acmp($lastlast, $x) != 0) { + $steps++ if DEBUG; + $lastlast = $c->_copy($last); + $last = $c->_copy($x); + $c->_add($x, $c->_div($c->_copy($y), $x)); + $c->_div($x, $two ); + print " x= ", $c->_str($x), "\n" if DEBUG; + } + print "\nsteps in sqrt: $steps, " if DEBUG; + $c->_dec($x) if $c->_acmp($y, $c->_mul($c->_copy($x), $x)) < 0; # overshot? + print " final ", $x->[-1], "\n" if DEBUG; + $x; +} + +sub _root { + # Take n'th root of $x in place. + + my ($c, $x, $n) = @_; + + # Small numbers. + + if (@$x == 1 && @$n == 1) { + # Result can be computed directly. Adjust initial result for numerical + # errors, e.g., int(1000**(1/3)) is 2, not 3. + my $y = int($x->[0] ** (1 / $n->[0])); + my $yp1 = $y + 1; + $y = $yp1 if $yp1 ** $n->[0] == $x->[0]; + $x->[0] = $y; + return $x; + } + + # If x <= n, the result is always (truncated to) 1. + + if ((@$x > 1 || $x -> [0] > 0) && # if x is non-zero ... + $c -> _acmp($x, $n) <= 0) # ... and x <= n + { + my $one = $x -> _one(); + @$x = @$one; + return $x; + } + + # If $n is a power of two, take sqrt($x) repeatedly, e.g., root($x, 4) = + # sqrt(sqrt($x)), root($x, 8) = sqrt(sqrt(sqrt($x))). + + my $b = $c -> _as_bin($n); + if ($b =~ /0b1(0+)$/) { + my $count = length($1); # 0b100 => len('00') => 2 + my $cnt = $count; # counter for loop + unshift @$x, 0; # add one element, together with one + # more below in the loop this makes 2 + while ($cnt-- > 0) { + # 'Inflate' $x by adding one element, basically computing + # $x * $BASE * $BASE. This gives us more $BASE_LEN digits for + # result since len(sqrt($X)) approx == len($x) / 2. + unshift @$x, 0; + # Calculate sqrt($x), $x is now one element to big, again. In the + # next round we make that two, again. + $c -> _sqrt($x); + } + + # $x is now one element too big, so truncate result by removing it. + shift @$x; + + return $x; + } + + my $DEBUG = 0; + + # Now the general case. This works by finding an initial guess. If this + # guess is incorrect, a relatively small delta is chosen. This delta is + # used to find a lower and upper limit for the correct value. The delta is + # doubled in each iteration. When a lower and upper limit is found, + # bisection is applied to narrow down the region until we have the correct + # value. + + # Split x into mantissa and exponent in base 10, so that + # + # x = xm * 10^xe, where 0 < xm < 1 and xe is an integer + + my $x_str = $c -> _str($x); + my $xm = "." . $x_str; + my $xe = length($x_str); + + # From this we compute the base 10 logarithm of x + # + # log_10(x) = log_10(xm) + log_10(xe^10) + # = log(xm)/log(10) + xe + # + # and then the base 10 logarithm of y, where y = x^(1/n) + # + # log_10(y) = log_10(x)/n + + my $log10x = log($xm) / log(10) + $xe; + my $log10y = $log10x / $c -> _num($n); + + # And from this we compute ym and ye, the mantissa and exponent (in + # base 10) of y, where 1 < ym <= 10 and ye is an integer. + + my $ye = int $log10y; + my $ym = 10 ** ($log10y - $ye); + + # Finally, we scale the mantissa and exponent to incraese the integer + # part of ym, before building the string representing our guess of y. + + if ($DEBUG) { + print "\n"; + print "xm = $xm\n"; + print "xe = $xe\n"; + print "log10x = $log10x\n"; + print "log10y = $log10y\n"; + print "ym = $ym\n"; + print "ye = $ye\n"; + print "\n"; + } + + my $d = $ye < 15 ? $ye : 15; + $ym *= 10 ** $d; + $ye -= $d; + + my $y_str = sprintf('%.0f', $ym) . "0" x $ye; + my $y = $c -> _new($y_str); + + if ($DEBUG) { + print "ym = $ym\n"; + print "ye = $ye\n"; + print "\n"; + print "y_str = $y_str (initial guess)\n"; + print "\n"; + } + + # See if our guess y is correct. + + my $trial = $c -> _pow($c -> _copy($y), $n); + my $acmp = $c -> _acmp($trial, $x); + + if ($acmp == 0) { + @$x = @$y; + return $x; + } + + # Find a lower and upper limit for the correct value of y. Start off with a + # delta value that is approximately the size of the accuracy of the guess. + + my $lower; + my $upper; + + my $delta = $c -> _new("1" . ("0" x $ye)); + my $two = $c -> _two(); + + if ($acmp < 0) { + $lower = $y; + while ($acmp < 0) { + $upper = $c -> _add($c -> _copy($lower), $delta); + + if ($DEBUG) { + print "lower = $lower\n"; + print "upper = $upper\n"; + print "delta = $delta\n"; + print "\n"; + } + $acmp = $c -> _acmp($c -> _pow($c -> _copy($upper), $n), $x); + if ($acmp == 0) { + @$x = @$upper; + return $x; + } + $delta = $c -> _mul($delta, $two); + } + } + + elsif ($acmp > 0) { + $upper = $y; + my $zero = $c -> _zero(); + while ($acmp > 0) { + if ($c -> _acmp($upper, $delta) <= 0) { + $lower = $c -> _zero(); + last; + } + $lower = $c -> _sub($c -> _copy($upper), $delta); + + if ($DEBUG) { + print "lower = $lower\n"; + print "upper = $upper\n"; + print "delta = $delta\n"; + print "\n"; + } + $acmp = $c -> _acmp($c -> _pow($c -> _copy($lower), $n), $x); + if ($acmp == 0) { + @$x = @$lower; + return $x; + } + $delta = $c -> _mul($delta, $two); + } + } + + # Use bisection to narrow down the interval. + + my $one = $c -> _one(); + { + + $delta = $c -> _sub($c -> _copy($upper), $lower); + if ($c -> _acmp($delta, $one) <= 0) { + @$x = @$lower; + return $x; + } + + if ($DEBUG) { + print "lower = $lower\n"; + print "upper = $upper\n"; + print "delta = $delta\n"; + print "\n"; + } + + $delta = $c -> _div($delta, $two); + my $middle = $c -> _add($c -> _copy($lower), $delta); + + $acmp = $c -> _acmp($c -> _pow($c -> _copy($middle), $n), $x); + if ($acmp < 0) { + $lower = $middle; + } elsif ($acmp > 0) { + $upper = $middle; + } else { + @$x = @$middle; + return $x; + } + + redo; + } + + $x; +} + +############################################################################## +# binary stuff + +sub _and { + my ($c, $x, $y) = @_; + + # the shortcut makes equal, large numbers _really_ fast, and makes only a + # very small performance drop for small numbers (e.g. something with less + # than 32 bit) Since we optimize for large numbers, this is enabled. + return $x if $c->_acmp($x, $y) == 0; # shortcut + + my $m = $c->_one(); + my ($xr, $yr); + my $mask = $AND_MASK; + + my $x1 = $c->_copy($x); + my $y1 = $c->_copy($y); + my $z = $c->_zero(); + + use integer; + until ($c->_is_zero($x1) || $c->_is_zero($y1)) { + ($x1, $xr) = $c->_div($x1, $mask); + ($y1, $yr) = $c->_div($y1, $mask); + + $c->_add($z, $c->_mul([ 0 + $xr->[0] & 0 + $yr->[0] ], $m)); + $c->_mul($m, $mask); + } + + @$x = @$z; + return $x; +} + +sub _xor { + my ($c, $x, $y) = @_; + + return $c->_zero() if $c->_acmp($x, $y) == 0; # shortcut (see -and) + + my $m = $c->_one(); + my ($xr, $yr); + my $mask = $XOR_MASK; + + my $x1 = $c->_copy($x); + my $y1 = $c->_copy($y); # make copy + my $z = $c->_zero(); + + use integer; + until ($c->_is_zero($x1) || $c->_is_zero($y1)) { + ($x1, $xr) = $c->_div($x1, $mask); + ($y1, $yr) = $c->_div($y1, $mask); + # make ints() from $xr, $yr (see _and()) + #$b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; } + #$b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; } + #$c->_add($x, $c->_mul($c->_new($xrr ^ $yrr)), $m) ); + + $c->_add($z, $c->_mul([ 0 + $xr->[0] ^ 0 + $yr->[0] ], $m)); + $c->_mul($m, $mask); + } + # the loop stops when the shorter of the two numbers is exhausted + # the remainder of the longer one will survive bit-by-bit, so we simple + # multiply-add it in + $c->_add($z, $c->_mul($x1, $m) ) if !$c->_is_zero($x1); + $c->_add($z, $c->_mul($y1, $m) ) if !$c->_is_zero($y1); + + @$x = @$z; + return $x; +} + +sub _or { + my ($c, $x, $y) = @_; + + return $x if $c->_acmp($x, $y) == 0; # shortcut (see _and) + + my $m = $c->_one(); + my ($xr, $yr); + my $mask = $OR_MASK; + + my $x1 = $c->_copy($x); + my $y1 = $c->_copy($y); # make copy + my $z = $c->_zero(); + + use integer; + until ($c->_is_zero($x1) || $c->_is_zero($y1)) { + ($x1, $xr) = $c->_div($x1, $mask); + ($y1, $yr) = $c->_div($y1, $mask); + # make ints() from $xr, $yr (see _and()) + # $b = 1; $xrr = 0; foreach (@$xr) { $xrr += $_ * $b; $b *= $BASE; } + # $b = 1; $yrr = 0; foreach (@$yr) { $yrr += $_ * $b; $b *= $BASE; } + # $c->_add($x, $c->_mul(_new( $c, ($xrr | $yrr) ), $m) ); + + $c->_add($z, $c->_mul([ 0 + $xr->[0] | 0 + $yr->[0] ], $m)); + $c->_mul($m, $mask); + } + # the loop stops when the shorter of the two numbers is exhausted + # the remainder of the longer one will survive bit-by-bit, so we simple + # multiply-add it in + $c->_add($z, $c->_mul($x1, $m) ) if !$c->_is_zero($x1); + $c->_add($z, $c->_mul($y1, $m) ) if !$c->_is_zero($y1); + + @$x = @$z; + return $x; +} + +sub _as_hex { + # convert a decimal number to hex (ref to array, return ref to string) + my ($c, $x) = @_; + + # fits into one element (handle also 0x0 case) + return sprintf("0x%x", $x->[0]) if @$x == 1; + + my $x1 = $c->_copy($x); + + my $es = ''; + my ($xr, $h, $x10000); + if ($] >= 5.006) { + $x10000 = [ 0x10000 ]; + $h = 'h4'; + } else { + $x10000 = [ 0x1000 ]; + $h = 'h3'; + } + while (@$x1 != 1 || $x1->[0] != 0) # _is_zero() + { + ($x1, $xr) = $c->_div($x1, $x10000); + $es .= unpack($h, pack('V', $xr->[0])); + } + $es = reverse $es; + $es =~ s/^[0]+//; # strip leading zeros + '0x' . $es; # return result prepended with 0x +} + +sub _as_bin { + # convert a decimal number to bin (ref to array, return ref to string) + my ($c, $x) = @_; + + # fits into one element (and Perl recent enough), handle also 0b0 case + # handle zero case for older Perls + if ($] <= 5.005 && @$x == 1 && $x->[0] == 0) { + my $t = '0b0'; + return $t; + } + if (@$x == 1 && $] >= 5.006) { + my $t = sprintf("0b%b", $x->[0]); + return $t; + } + my $x1 = $c->_copy($x); + + my $es = ''; + my ($xr, $b, $x10000); + if ($] >= 5.006) { + $x10000 = [ 0x10000 ]; + $b = 'b16'; + } else { + $x10000 = [ 0x1000 ]; + $b = 'b12'; + } + while (!(@$x1 == 1 && $x1->[0] == 0)) # _is_zero() + { + ($x1, $xr) = $c->_div($x1, $x10000); + $es .= unpack($b, pack('v', $xr->[0])); + } + $es = reverse $es; + $es =~ s/^[0]+//; # strip leading zeros + '0b' . $es; # return result prepended with 0b +} + +sub _as_oct { + # convert a decimal number to octal (ref to array, return ref to string) + my ($c, $x) = @_; + + # fits into one element (handle also 0 case) + return sprintf("0%o", $x->[0]) if @$x == 1; + + my $x1 = $c->_copy($x); + + my $es = ''; + my $xr; + my $x1000 = [ 0100000 ]; + while (@$x1 != 1 || $x1->[0] != 0) # _is_zero() + { + ($x1, $xr) = $c->_div($x1, $x1000); + $es .= reverse sprintf("%05o", $xr->[0]); + } + $es = reverse $es; + $es =~ s/^0+//; # strip leading zeros + '0' . $es; # return result prepended with 0 +} + +sub _from_oct { + # convert a octal number to decimal (string, return ref to array) + my ($c, $os) = @_; + + # for older Perls, play safe + my $m = [ 0100000 ]; + my $d = 5; # 5 digits at a time + + my $mul = $c->_one(); + my $x = $c->_zero(); + + my $len = int((length($os) - 1) / $d); # $d digit parts, w/o the '0' + my $val; + my $i = -$d; + while ($len >= 0) { + $val = substr($os, $i, $d); # get oct digits + $val = CORE::oct($val); + $i -= $d; + $len --; + my $adder = [ $val ]; + $c->_add($x, $c->_mul($adder, $mul)) if $val != 0; + $c->_mul($mul, $m) if $len >= 0; # skip last mul + } + $x; +} + +sub _from_hex { + # convert a hex number to decimal (string, return ref to array) + my ($c, $hs) = @_; + + my $m = $c->_new(0x10000000); # 28 bit at a time (<32 bit!) + my $d = 7; # 7 digits at a time + my $mul = $c->_one(); + my $x = $c->_zero(); + + my $len = int((length($hs) - 2) / $d); # $d digit parts, w/o the '0x' + my $val; + my $i = -$d; + while ($len >= 0) { + $val = substr($hs, $i, $d); # get hex digits + $val =~ s/^0x// if $len == 0; # for last part only because + $val = CORE::hex($val); # hex does not like wrong chars + $i -= $d; + $len --; + my $adder = [ $val ]; + # if the resulting number was to big to fit into one element, create a + # two-element version (bug found by Mark Lakata - Thanx!) + if (CORE::length($val) > $BASE_LEN) { + $adder = $c->_new($val); + } + $c->_add($x, $c->_mul($adder, $mul)) if $val != 0; + $c->_mul($mul, $m) if $len >= 0; # skip last mul + } + $x; +} + +sub _from_bin { + # convert a hex number to decimal (string, return ref to array) + my ($c, $bs) = @_; + + # instead of converting X (8) bit at a time, it is faster to "convert" the + # number to hex, and then call _from_hex. + + my $hs = $bs; + $hs =~ s/^[+-]?0b//; # remove sign and 0b + my $l = length($hs); # bits + $hs = '0' x (8 - ($l % 8)) . $hs if ($l % 8) != 0; # padd left side w/ 0 + my $h = '0x' . unpack('H*', pack ('B*', $hs)); # repack as hex + + $c->_from_hex($h); +} + +############################################################################## +# special modulus functions + +sub _modinv { + # modular multiplicative inverse + my ($c, $x, $y) = @_; + + # modulo zero + if ($c->_is_zero($y)) { + return undef, undef; + } + + # modulo one + if ($c->_is_one($y)) { + return $c->_zero(), '+'; + } + + my $u = $c->_zero(); + my $v = $c->_one(); + my $a = $c->_copy($y); + my $b = $c->_copy($x); + + # Euclid's Algorithm for bgcd(), only that we calc bgcd() ($a) and the result + # ($u) at the same time. See comments in BigInt for why this works. + my $q; + my $sign = 1; + { + ($a, $q, $b) = ($b, $c->_div($a, $b)); # step 1 + last if $c->_is_zero($b); + + my $t = $c->_add( # step 2: + $c->_mul($c->_copy($v), $q), # t = v * q + $u); # + u + $u = $v; # u = v + $v = $t; # v = t + $sign = -$sign; + redo; + } + + # if the gcd is not 1, then return NaN + return (undef, undef) unless $c->_is_one($a); + + ($v, $sign == 1 ? '+' : '-'); +} + +sub _modpow { + # modulus of power ($x ** $y) % $z + my ($c, $num, $exp, $mod) = @_; + + # a^b (mod 1) = 0 for all a and b + if ($c->_is_one($mod)) { + @$num = 0; + return $num; + } + + # 0^a (mod m) = 0 if m != 0, a != 0 + # 0^0 (mod m) = 1 if m != 0 + if ($c->_is_zero($num)) { + if ($c->_is_zero($exp)) { + @$num = 1; + } else { + @$num = 0; + } + return $num; + } + + # $num = $c->_mod($num, $mod); # this does not make it faster + + my $acc = $c->_copy($num); + my $t = $c->_one(); + + my $expbin = $c->_as_bin($exp); + $expbin =~ s/^0b//; + my $len = length($expbin); + while (--$len >= 0) { + if (substr($expbin, $len, 1) eq '1') { # is_odd + $t = $c->_mul($t, $acc); + $t = $c->_mod($t, $mod); + } + $acc = $c->_mul($acc, $acc); + $acc = $c->_mod($acc, $mod); + } + @$num = @$t; + $num; +} + +sub _gcd { + # Greatest common divisor. + + my ($c, $x, $y) = @_; + + # gcd(0, 0) = 0 + # gcd(0, a) = a, if a != 0 + + if (@$x == 1 && $x->[0] == 0) { + if (@$y == 1 && $y->[0] == 0) { + @$x = 0; + } else { + @$x = @$y; + } + return $x; + } + + # Until $y is zero ... + + until (@$y == 1 && $y->[0] == 0) { + + # Compute remainder. + + $c->_mod($x, $y); + + # Swap $x and $y. + + my $tmp = $c->_copy($x); + @$x = @$y; + $y = $tmp; # no deref here; that would modify input $y + } + + return $x; +} + +1; + +package Math::BigInt::CalcEmu; + +use 5.006001; +use strict; +use warnings; + +our $VERSION = '1.999811'; + +package Math::BigInt; + +# See SYNOPSIS below. + +my $CALC_EMU; + +BEGIN + { + $CALC_EMU = Math::BigInt->config('lib'); + # register us with MBI to get notified of future lib changes + Math::BigInt::_register_callback( __PACKAGE__, sub { $CALC_EMU = $_[0]; } ); + } + +sub __emu_band + { + my ($self,$x,$y,$sx,$sy,@r) = @_; + + return $x->bzero(@r) if $y->is_zero() || $x->is_zero(); + + my $sign = 0; # sign of result + $sign = 1 if $sx == -1 && $sy == -1; + + my ($bx,$by); + + if ($sx == -1) # if x is negative + { + # two's complement: inc and flip all "bits" in $bx + $bx = $x->binc()->as_hex(); # -1 => 0, -2 => 1, -3 => 2 etc + $bx =~ s/-?0x//; + $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + else + { + $bx = $x->as_hex(); # get binary representation + $bx =~ s/-?0x//; + $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + if ($sy == -1) # if y is negative + { + # two's complement: inc and flip all "bits" in $by + $by = $y->copy()->binc()->as_hex(); # -1 => 0, -2 => 1, -3 => 2 etc + $by =~ s/-?0x//; + $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + else + { + $by = $y->as_hex(); # get binary representation + $by =~ s/-?0x//; + $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + # now we have bit-strings from X and Y, reverse them for padding + $bx = reverse $bx; + $by = reverse $by; + + # padd the shorter string + my $xx = "\x00"; $xx = "\x0f" if $sx == -1; + my $yy = "\x00"; $yy = "\x0f" if $sy == -1; + my $diff = CORE::length($bx) - CORE::length($by); + if ($diff > 0) + { + # if $yy eq "\x00", we can cut $bx, otherwise we need to padd $by + $by .= $yy x $diff; + } + elsif ($diff < 0) + { + # if $xx eq "\x00", we can cut $by, otherwise we need to padd $bx + $bx .= $xx x abs($diff); + } + + # and the strings together + my $r = $bx & $by; + + # and reverse the result again + $bx = reverse $r; + + # One of $x or $y was negative, so need to flip bits in the result. + # In both cases (one or two of them negative, or both positive) we need + # to get the characters back. + if ($sign == 1) + { + $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/; + } + else + { + $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/; + } + + # leading zeros will be stripped by _from_hex() + $bx = '0x' . $bx; + $x->{value} = $CALC_EMU->_from_hex( $bx ); + + # calculate sign of result + $x->{sign} = '+'; + $x->{sign} = '-' if $sign == 1 && !$x->is_zero(); + + $x->bdec() if $sign == 1; + + $x->round(@r); + } + +sub __emu_bior + { + my ($self,$x,$y,$sx,$sy,@r) = @_; + + return $x->round(@r) if $y->is_zero(); + + my $sign = 0; # sign of result + $sign = 1 if ($sx == -1) || ($sy == -1); + + my ($bx,$by); + + if ($sx == -1) # if x is negative + { + # two's complement: inc and flip all "bits" in $bx + $bx = $x->binc()->as_hex(); # -1 => 0, -2 => 1, -3 => 2 etc + $bx =~ s/-?0x//; + $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + else + { + $bx = $x->as_hex(); # get binary representation + $bx =~ s/-?0x//; + $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + if ($sy == -1) # if y is negative + { + # two's complement: inc and flip all "bits" in $by + $by = $y->copy()->binc()->as_hex(); # -1 => 0, -2 => 1, -3 => 2 etc + $by =~ s/-?0x//; + $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + else + { + $by = $y->as_hex(); # get binary representation + $by =~ s/-?0x//; + $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + # now we have bit-strings from X and Y, reverse them for padding + $bx = reverse $bx; + $by = reverse $by; + + # padd the shorter string + my $xx = "\x00"; $xx = "\x0f" if $sx == -1; + my $yy = "\x00"; $yy = "\x0f" if $sy == -1; + my $diff = CORE::length($bx) - CORE::length($by); + if ($diff > 0) + { + $by .= $yy x $diff; + } + elsif ($diff < 0) + { + $bx .= $xx x abs($diff); + } + + # or the strings together + my $r = $bx | $by; + + # and reverse the result again + $bx = reverse $r; + + # one of $x or $y was negative, so need to flip bits in the result + # in both cases (one or two of them negative, or both positive) we need + # to get the characters back. + if ($sign == 1) + { + $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/; + } + else + { + $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/; + } + + # leading zeros will be stripped by _from_hex() + $bx = '0x' . $bx; + $x->{value} = $CALC_EMU->_from_hex( $bx ); + + # calculate sign of result + $x->{sign} = '+'; + $x->{sign} = '-' if $sign == 1 && !$x->is_zero(); + + # if one of X or Y was negative, we need to decrement result + $x->bdec() if $sign == 1; + + $x->round(@r); + } + +sub __emu_bxor + { + my ($self,$x,$y,$sx,$sy,@r) = @_; + + return $x->round(@r) if $y->is_zero(); + + my $sign = 0; # sign of result + $sign = 1 if $x->{sign} ne $y->{sign}; + + my ($bx,$by); + + if ($sx == -1) # if x is negative + { + # two's complement: inc and flip all "bits" in $bx + $bx = $x->binc()->as_hex(); # -1 => 0, -2 => 1, -3 => 2 etc + $bx =~ s/-?0x//; + $bx =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + else + { + $bx = $x->as_hex(); # get binary representation + $bx =~ s/-?0x//; + $bx =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + if ($sy == -1) # if y is negative + { + # two's complement: inc and flip all "bits" in $by + $by = $y->copy()->binc()->as_hex(); # -1 => 0, -2 => 1, -3 => 2 etc + $by =~ s/-?0x//; + $by =~ tr/0123456789abcdef/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + else + { + $by = $y->as_hex(); # get binary representation + $by =~ s/-?0x//; + $by =~ tr/fedcba9876543210/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/; + } + # now we have bit-strings from X and Y, reverse them for padding + $bx = reverse $bx; + $by = reverse $by; + + # padd the shorter string + my $xx = "\x00"; $xx = "\x0f" if $sx == -1; + my $yy = "\x00"; $yy = "\x0f" if $sy == -1; + my $diff = CORE::length($bx) - CORE::length($by); + if ($diff > 0) + { + $by .= $yy x $diff; + } + elsif ($diff < 0) + { + $bx .= $xx x abs($diff); + } + + # xor the strings together + my $r = $bx ^ $by; + + # and reverse the result again + $bx = reverse $r; + + # one of $x or $y was negative, so need to flip bits in the result + # in both cases (one or two of them negative, or both positive) we need + # to get the characters back. + if ($sign == 1) + { + $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/0123456789abcdef/; + } + else + { + $bx =~ tr/\x0f\x0e\x0d\x0c\x0b\x0a\x09\x08\x07\x06\x05\x04\x03\x02\x01\x00/fedcba9876543210/; + } + + # leading zeros will be stripped by _from_hex() + $bx = '0x' . $bx; + $x->{value} = $CALC_EMU->_from_hex( $bx ); + + # calculate sign of result + $x->{sign} = '+'; + $x->{sign} = '-' if $sx != $sy && !$x->is_zero(); + + $x->bdec() if $sign == 1; + + $x->round(@r); + } + +############################################################################## +############################################################################## + +1; + +__END__ + +#!perl + +package Math::BigInt::Trace; + +require 5.010; +use strict; +use warnings; + +use Exporter; +use Math::BigInt; + +our ($accuracy, $precision, $round_mode, $div_scale); + +our @ISA = qw(Exporter Math::BigInt); + +our $VERSION = '0.49'; + +use overload; # inherit overload from Math::BigInt + +# Globals +$accuracy = $precision = undef; +$round_mode = 'even'; +$div_scale = 40; + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + + my $value = shift; + my $a = $accuracy; + $a = $_[0] if defined $_[0]; + my $p = $precision; + $p = $_[1] if defined $_[1]; + my $self = Math::BigInt->new($value, $a, $p, $round_mode); + bless $self, $class; + print "MBI new '$value' => '$self' (", ref($self), ")"; + return $self; +} + +sub import { + print "MBI import ", join(' ', @_); + my $self = shift; + Math::BigInt::import($self, @_); # need it for subclasses +# $self->export_to_level(1, $self, @_); # need this ? + @_ = (); +} + +1; +package Exporter::Heavy; + +use strict; +no strict 'refs'; + +# On one line so MakeMaker will see it. +require Exporter; our $VERSION = $Exporter::VERSION; + + +# +# We go to a lot of trouble not to 'require Carp' at file scope, +# because Carp requires Exporter, and something has to give. +# + +sub _rebuild_cache { + my ($pkg, $exports, $cache) = @_; + s/^&// foreach @$exports; + @{$cache}{@$exports} = (1) x @$exports; + my $ok = \@{"${pkg}::EXPORT_OK"}; + if (@$ok) { + s/^&// foreach @$ok; + @{$cache}{@$ok} = (1) x @$ok; + } +} + +sub heavy_export { + + # Save the old __WARN__ handler in case it was defined + my $oldwarn = $SIG{__WARN__}; + + # First make import warnings look like they're coming from the "use". + local $SIG{__WARN__} = sub { + # restore it back so proper stacking occurs + local $SIG{__WARN__} = $oldwarn; + my $text = shift; + if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//) { + require Carp; + local $Carp::CarpLevel = 1; # ignore package calling us too. + Carp::carp($text); + } + else { + warn $text; + } + }; + local $SIG{__DIE__} = sub { + require Carp; + local $Carp::CarpLevel = 1; # ignore package calling us too. + Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT") + if $_[0] =~ /^Unable to create sub named "(.*?)::"/; + }; + + my($pkg, $callpkg, @imports) = @_; + my($type, $sym, $cache_is_current, $oops); + my($exports, $export_cache) = (\@{"${pkg}::EXPORT"}, + $Exporter::Cache{$pkg} ||= {}); + + if (@imports) { + if (!%$export_cache) { + _rebuild_cache ($pkg, $exports, $export_cache); + $cache_is_current = 1; + } + + if (grep m{^[/!:]}, @imports) { + my $tagsref = \%{"${pkg}::EXPORT_TAGS"}; + my $tagdata; + my %imports; + my($remove, $spec, @names, @allexports); + # negated first item implies starting with default set: + unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/; + foreach $spec (@imports){ + $remove = $spec =~ s/^!//; + + if ($spec =~ s/^://){ + if ($spec eq 'DEFAULT'){ + @names = @$exports; + } + elsif ($tagdata = $tagsref->{$spec}) { + @names = @$tagdata; + } + else { + warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS]; + ++$oops; + next; + } + } + elsif ($spec =~ m:^/(.*)/$:){ + my $patn = $1; + @allexports = keys %$export_cache unless @allexports; # only do keys once + @names = grep(/$patn/, @allexports); # not anchored by default + } + else { + @names = ($spec); # is a normal symbol name + } + + warn "Import ".($remove ? "del":"add").": @names " + if $Exporter::Verbose; + + if ($remove) { + foreach $sym (@names) { delete $imports{$sym} } + } + else { + @imports{@names} = (1) x @names; + } + } + @imports = keys %imports; + } + + my @carp; + foreach $sym (@imports) { + if (!$export_cache->{$sym}) { + if ($sym =~ m/^\d/) { + $pkg->VERSION($sym); # inherit from UNIVERSAL + # If the version number was the only thing specified + # then we should act as if nothing was specified: + if (@imports == 1) { + @imports = @$exports; + last; + } + # We need a way to emulate 'use Foo ()' but still + # allow an easy version check: "use Foo 1.23, ''"; + if (@imports == 2 and !$imports[1]) { + @imports = (); + last; + } + } elsif ($sym !~ s/^&// || !$export_cache->{$sym}) { + # Last chance - see if they've updated EXPORT_OK since we + # cached it. + + unless ($cache_is_current) { + %$export_cache = (); + _rebuild_cache ($pkg, $exports, $export_cache); + $cache_is_current = 1; + } + + if (!$export_cache->{$sym}) { + # accumulate the non-exports + push @carp, + qq["$sym" is not exported by the $pkg module\n]; + $oops++; + } + } + } + } + if ($oops) { + require Carp; + Carp::croak("@{carp}Can't continue after import errors"); + } + } + else { + @imports = @$exports; + } + + my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"}, + $Exporter::FailCache{$pkg} ||= {}); + + if (@$fail) { + if (!%$fail_cache) { + # Build cache of symbols. Optimise the lookup by adding + # barewords twice... both with and without a leading &. + # (Technique could be applied to $export_cache at cost of memory) + my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @$fail; + warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Exporter::Verbose; + @{$fail_cache}{@expanded} = (1) x @expanded; + } + my @failed; + foreach $sym (@imports) { push(@failed, $sym) if $fail_cache->{$sym} } + if (@failed) { + @failed = $pkg->export_fail(@failed); + foreach $sym (@failed) { + require Carp; + Carp::carp(qq["$sym" is not implemented by the $pkg module ], + "on this architecture"); + } + if (@failed) { + require Carp; + Carp::croak("Can't continue after import errors"); + } + } + } + + warn "Importing into $callpkg from $pkg: ", + join(", ",sort @imports) if $Exporter::Verbose; + + foreach $sym (@imports) { + # shortcut for the common case of no type character + (*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next) + unless $sym =~ s/^(\W)//; + $type = $1; + no warnings 'once'; + *{"${callpkg}::$sym"} = + $type eq '&' ? \&{"${pkg}::$sym"} : + $type eq '$' ? \${"${pkg}::$sym"} : + $type eq '@' ? \@{"${pkg}::$sym"} : + $type eq '%' ? \%{"${pkg}::$sym"} : + $type eq '*' ? *{"${pkg}::$sym"} : + do { require Carp; Carp::croak("Can't export symbol: $type$sym") }; + } +} + +sub heavy_export_to_level +{ + my $pkg = shift; + my $level = shift; + (undef) = shift; # XXX redundant arg + my $callpkg = caller($level); + $pkg->export($callpkg, @_); +} + +# Utility functions + +sub _push_tags { + my($pkg, $var, $syms) = @_; + my @nontag = (); + my $export_tags = \%{"${pkg}::EXPORT_TAGS"}; + push(@{"${pkg}::$var"}, + map { $export_tags->{$_} ? @{$export_tags->{$_}} + : scalar(push(@nontag,$_),$_) } + (@$syms) ? @$syms : keys %$export_tags); + if (@nontag and $^W) { + # This may change to a die one day + require Carp; + Carp::carp(join(", ", @nontag)." are not tags of $pkg"); + } +} + +sub heavy_require_version { + my($self, $wanted) = @_; + my $pkg = ref $self || $self; + return ${pkg}->VERSION($wanted); +} + +sub heavy_export_tags { + _push_tags((caller)[0], "EXPORT", \@_); +} + +sub heavy_export_ok_tags { + _push_tags((caller)[0], "EXPORT_OK", \@_); +} + +1; +package encoding::warnings; +$encoding::warnings::VERSION = '0.13'; + +use strict; +use 5.007; + + +# Constants. +sub ASCII () { 0 } +sub LATIN1 () { 1 } +sub FATAL () { 2 } + +sub import { + if ($] >= 5.025003) { + require Carp; + Carp::cluck( + "encoding::warnings is not supported on Perl 5.26.0 and later" + ); + return; + } + + # Install a ${^ENCODING} handler if no other one are already in place. + my $class = shift; + my $fatal = shift || ''; + + local $@; + return if ${^ENCODING} and ref(${^ENCODING}) ne $class; + return unless eval { require Encode; 1 }; + + my $ascii = Encode::find_encoding('us-ascii') or return; + my $latin1 = Encode::find_encoding('iso-8859-1') or return; + + # Have to undef explicitly here + undef ${^ENCODING}; + + # Install a warning handler for decode() + my $decoder = bless( + [ + $ascii, + $latin1, + (($fatal eq 'FATAL') ? 'Carp::croak' : 'Carp::carp'), + ], $class, + ); + + no warnings 'deprecated'; + ${^ENCODING} = $decoder; + use warnings 'deprecated'; + $^H{$class} = 1; +} + +sub unimport { + my $class = shift; + $^H{$class} = undef; + undef ${^ENCODING}; +} + +# Don't worry about source code literals. +sub cat_decode { + my $self = shift; + return $self->[LATIN1]->cat_decode(@_); +} + +# Warn if the data is not purely US-ASCII. +sub decode { + my $self = shift; + + DO_WARN: { + if ($] >= 5.009004) { + my $hints = (caller(0))[10]; + $hints->{ref($self)} or last DO_WARN; + } + + local $@; + my $rv = eval { $self->[ASCII]->decode($_[0], Encode::FB_CROAK()) }; + return $rv unless $@; + + require Carp; + no strict 'refs'; + $self->[FATAL]->( + "Bytes implicitly upgraded into wide characters as iso-8859-1" + ); + + } + + return $self->[LATIN1]->decode(@_); +} + +sub name { 'iso-8859-1' } + +1; + +__END__ + +package Module::Loaded; + +use strict; +use Carp qw[carp]; + +BEGIN { use base 'Exporter'; + use vars qw[@EXPORT $VERSION]; + + $VERSION = '0.08'; + @EXPORT = qw[mark_as_loaded mark_as_unloaded is_loaded]; +} + + +sub mark_as_loaded (*) { + my $pm = shift; + my $file = __PACKAGE__->_pm_to_file( $pm ) or return; + my $who = [caller]->[1]; + + my $where = is_loaded( $pm ); + if ( defined $where ) { + carp "'$pm' already marked as loaded ('$where')"; + + } else { + $INC{$file} = $who; + } + + return 1; +} + + +sub mark_as_unloaded (*) { + my $pm = shift; + my $file = __PACKAGE__->_pm_to_file( $pm ) or return; + + unless( defined is_loaded( $pm ) ) { + carp "'$pm' already marked as unloaded"; + + } else { + delete $INC{ $file }; + } + + return 1; +} + + +sub is_loaded (*) { + my $pm = shift; + my $file = __PACKAGE__->_pm_to_file( $pm ) or return; + + return $INC{$file} if exists $INC{$file}; + + return; +} + + +sub _pm_to_file { + my $pkg = shift; + my $pm = shift or return; + + my $file = join '/', split '::', $pm; + $file .= '.pm'; + + return $file; +} + + +# Local variables: +# c-indentation-style: bsd +# c-basic-offset: 4 +# indent-tabs-mode: nil +# End: +# vim: expandtab shiftwidth=4: + +1; +package Module::CoreList; +use strict; + +our ( %released, %version, %families, %upstream, %bug_tracker, %deprecated, %delta ); + +use version; +our $VERSION = '5.20181129_28'; + +sub PKG_PATTERN () { q#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z# } +sub _looks_like_invocant ($) { local $@; !!eval { $_[0]->isa(__PACKAGE__) } } + +sub _undelta { + my ($delta) = @_; + my (%expanded, $delta_from, $base, $changed, $removed); + for my $v (sort keys %$delta) { + ($delta_from, $changed, $removed) = @{$delta->{$v}}{qw( delta_from changed removed )}; + $base = $delta_from ? $expanded{$delta_from} : {}; + my %full = ( %$base, %{$changed || {}} ); + delete @full{ keys %$removed }; + $expanded{$v} = \%full; + } + return %expanded; +} + +sub _released_order { # Sort helper, to make '?' sort after everything else + (substr($released{$a}, 0, 1) eq "?") + ? ((substr($released{$b}, 0, 1) eq "?") + ? 0 + : 1) + : ((substr($released{$b}, 0, 1) eq "?") + ? -1 + : $released{$a} cmp $released{$b} ) +} + +my $dumpinc = 0; +sub import { + my $self = shift; + my $what = shift || ''; + if ($what eq 'dumpinc') { + $dumpinc = 1; + } +} + +END { + print "---INC---\n", join "\n" => keys %INC + if $dumpinc; +} + + +sub first_release_raw { + shift if defined $_[1] and $_[1] =~ PKG_PATTERN and _looks_like_invocant $_[0]; + my $module = shift; + my $version = shift; + + my @perls = $version + ? grep { defined $version{$_}{ $module } && + $version{$_}{ $module } ge $version } keys %version + : grep { exists $version{$_}{ $module } } keys %version; + + return @perls; +} + +sub first_release_by_date { + my @perls = &first_release_raw; + return unless @perls; + return (sort _released_order @perls)[0]; +} + +sub first_release { + my @perls = &first_release_raw; + return unless @perls; + return (sort { $a cmp $b } @perls)[0]; +} + +sub find_modules { + shift if _looks_like_invocant $_[0]; + my $regex = shift; + my @perls = @_ ? @_ : keys %version; + + my %mods; + foreach (@perls) { + while (my ($k, $v) = each %{$version{$_}}) { + $mods{$k}++ if $k =~ $regex; + } + } + return sort keys %mods +} + +sub find_version { + shift if _looks_like_invocant $_[0]; + my $v = shift; + return $version{$v} if defined $v and defined $version{$v}; + return; +} + +sub is_deprecated { + shift if defined $_[1] and $_[1] =~ PKG_PATTERN and _looks_like_invocant $_[0]; + my $module = shift; + my $perl_version = shift || $]; + return unless $module && exists $deprecated{$perl_version}{$module}; + return $deprecated{$perl_version}{$module}; +} + +sub deprecated_in { + shift if defined $_[1] and $_[1] =~ PKG_PATTERN and _looks_like_invocant $_[0]; + my $module = shift or return; + my @perls = grep { exists $deprecated{$_}{$module} } keys %deprecated; + return unless @perls; + require List::Util; + return List::Util::minstr(@perls); +} + +sub removed_from { + my @perls = &removed_raw; + return shift @perls; +} + +sub removed_from_by_date { + my @perls = sort _released_order &removed_raw; + return shift @perls; +} + +sub removed_raw { + shift if defined $_[1] and $_[1] =~ PKG_PATTERN and _looks_like_invocant $_[0]; + my $mod = shift; + return unless my @perls = sort { $a cmp $b } first_release_raw($mod); + my $last = pop @perls; + my @removed = grep { $_ > $last } sort { $a cmp $b } keys %version; + return @removed; +} + +sub changes_between { + shift if _looks_like_invocant $_[0]; + my $left_ver = shift; + my $right_ver = shift; + + my $left = $version{ $left_ver }; + my $right = $version{ $right_ver }; + + my %uniq = (%$left, %$right); + + my %changes; + for my $lib (keys %uniq) { + my $lhs = exists $left->{ $lib } + ? (defined $left->{ $lib } ? $left->{ $lib } : '(undef)') + : '(absent)'; + my $rhs = exists $right->{ $lib } + ? (defined $right->{ $lib } ? $right->{ $lib } : '(undef)') + : '(absent)'; + + next if $lhs eq $rhs; + + my $change = { + (exists $left->{$lib} ? (left => $left->{$lib}) : ()), + (exists $right->{$lib} ? (right => $right->{$lib}) : ()), + }; + + $changes{$lib} = $change; + } + + return %changes; +} + +# When things escaped. +# NB. If you put version numbers with trailing zeroes here, you +# should also add an alias for the numerical ($]) version; see +# just before the __END__ of this module. +%released = ( + 5.000 => '1994-10-17', + 5.001 => '1995-03-14', + 5.002 => '1996-02-29', + 5.00307 => '1996-10-10', + 5.004 => '1997-05-15', + 5.005 => '1998-07-22', + 5.00503 => '1999-03-28', + 5.00405 => '1999-04-29', + 5.006 => '2000-03-22', + 5.006001 => '2001-04-08', + 5.007003 => '2002-03-05', + 5.008 => '2002-07-19', + 5.008001 => '2003-09-25', + 5.009 => '2003-10-27', + 5.008002 => '2003-11-05', + 5.006002 => '2003-11-15', + 5.008003 => '2004-01-14', + 5.00504 => '2004-02-23', + 5.009001 => '2004-03-16', + 5.008004 => '2004-04-21', + 5.008005 => '2004-07-19', + 5.008006 => '2004-11-27', + 5.009002 => '2005-04-01', + 5.008007 => '2005-05-30', + 5.009003 => '2006-01-28', + 5.008008 => '2006-01-31', + 5.009004 => '2006-08-15', + 5.009005 => '2007-07-07', + 5.010000 => '2007-12-18', + 5.008009 => '2008-12-14', + 5.010001 => '2009-08-22', + 5.011000 => '2009-10-02', + 5.011001 => '2009-10-20', + 5.011002 => '2009-11-20', + 5.011003 => '2009-12-20', + 5.011004 => '2010-01-20', + 5.011005 => '2010-02-20', + 5.012000 => '2010-04-12', + 5.013000 => '2010-04-20', + 5.012001 => '2010-05-16', + 5.013001 => '2010-05-20', + 5.013002 => '2010-06-22', + 5.013003 => '2010-07-20', + 5.013004 => '2010-08-20', + 5.012002 => '2010-09-06', + 5.013005 => '2010-09-19', + 5.013006 => '2010-10-20', + 5.013007 => '2010-11-20', + 5.013008 => '2010-12-20', + 5.012003 => '2011-01-21', + 5.013009 => '2011-01-20', + 5.013010 => '2011-02-20', + 5.013011 => '2011-03-20', + 5.014000 => '2011-05-14', + 5.012004 => '2011-06-20', + 5.012005 => '2012-11-10', + 5.014001 => '2011-06-16', + 5.015000 => '2011-06-20', + 5.015001 => '2011-07-20', + 5.015002 => '2011-08-20', + 5.014002 => '2011-09-26', + 5.015003 => '2011-09-20', + 5.015004 => '2011-10-20', + 5.015005 => '2011-11-20', + 5.015006 => '2011-12-20', + 5.015007 => '2012-01-20', + 5.015008 => '2012-02-20', + 5.015009 => '2012-03-20', + 5.016000 => '2012-05-20', + 5.016001 => '2012-08-08', + 5.016002 => '2012-11-01', + 5.017000 => '2012-05-26', + 5.017001 => '2012-06-20', + 5.017002 => '2012-07-20', + 5.017003 => '2012-08-20', + 5.017004 => '2012-09-20', + 5.014003 => '2012-10-12', + 5.017005 => '2012-10-20', + 5.017006 => '2012-11-20', + 5.017007 => '2012-12-18', + 5.017008 => '2013-01-20', + 5.017009 => '2013-02-20', + 5.014004 => '2013-03-10', + 5.016003 => '2013-03-11', + 5.017010 => '2013-03-21', + 5.017011 => '2013-04-20', + 5.018000 => '2013-05-18', + 5.019000 => '2013-05-20', + 5.019001 => '2013-06-21', + 5.019002 => '2013-07-22', + 5.018001 => '2013-08-12', + 5.019003 => '2013-08-20', + 5.019004 => '2013-09-20', + 5.019005 => '2013-10-20', + 5.019006 => '2013-11-20', + 5.019007 => '2013-12-20', + 5.018002 => '2014-01-06', + 5.018003 => '2014-10-01', + 5.018004 => '2014-10-01', + 5.019008 => '2014-01-20', + 5.019009 => '2014-02-20', + 5.01901 => '2014-03-20', + 5.019011 => '2014-04-20', + 5.020000 => '2014-05-27', + 5.021000 => '2014-05-27', + 5.021001 => '2014-06-20', + 5.021002 => '2014-07-20', + 5.021003 => '2014-08-20', + 5.020001 => '2014-09-14', + 5.021004 => '2014-09-20', + 5.021005 => '2014-10-20', + 5.021006 => '2014-11-20', + 5.021007 => '2014-12-20', + 5.021008 => '2015-01-20', + 5.020002 => '2015-02-14', + 5.021009 => '2015-02-21', + 5.021010 => '2015-03-20', + 5.021011 => '2015-04-20', + 5.022000 => '2015-06-01', + 5.023000 => '2015-06-20', + 5.023001 => '2015-07-20', + 5.023002 => '2015-08-20', + 5.020003 => '2015-09-12', + 5.023003 => '2015-09-20', + 5.023004 => '2015-10-20', + 5.023005 => '2015-11-20', + 5.022001 => '2015-12-13', + 5.023006 => '2015-12-21', + 5.023007 => '2016-01-20', + 5.023008 => '2016-02-20', + 5.023009 => '2016-03-20', + 5.022002 => '2016-04-29', + 5.024000 => '2016-05-09', + 5.025000 => '2016-05-09', + 5.025001 => '2016-05-20', + 5.025002 => '2016-06-20', + 5.025003 => '2016-07-20', + 5.025004 => '2016-08-20', + 5.025005 => '2016-09-20', + 5.025006 => '2016-10-20', + 5.025007 => '2016-11-20', + 5.025008 => '2016-12-20', + 5.022003 => '2017-01-14', + 5.024001 => '2017-01-14', + 5.025009 => '2017-01-20', + 5.025010 => '2017-02-20', + 5.025011 => '2017-03-20', + 5.025012 => '2017-04-20', + 5.026000 => '2017-05-30', + 5.027000 => '2017-05-31', + 5.027001 => '2017-06-20', + 5.022004 => '2017-07-15', + 5.024002 => '2017-07-15', + 5.027002 => '2017-07-20', + 5.027003 => '2017-08-21', + 5.027004 => '2017-09-20', + 5.024003 => '2017-09-22', + 5.026001 => '2017-09-22', + 5.027005 => '2017-10-20', + 5.027006 => '2017-11-20', + 5.027007 => '2017-12-20', + 5.027008 => '2018-01-20', + 5.027009 => '2018-02-20', + 5.027010 => '2018-03-20', + 5.024004 => '2018-04-14', + 5.026002 => '2018-04-14', + 5.027011 => '2018-04-20', + 5.028000 => '2018-06-22', + 5.029000 => '2018-06-26', + 5.029001 => '2018-07-20', + 5.029002 => '2018-08-20', + 5.029003 => '2018-09-20', + 5.029004 => '2018-10-20', + 5.028001 => '2018-11-29', + ); + +for my $version ( sort { $a <=> $b } keys %released ) { + my $family = int ($version * 1000) / 1000; + push @{ $families{ $family }} , $version; +} + +%delta = ( + 5 => { + changed => { + 'AnyDBM_File' => undef, + 'AutoLoader' => undef, + 'AutoSplit' => undef, + 'Benchmark' => undef, + 'Carp' => undef, + 'Cwd' => undef, + 'DB_File' => undef, + 'DynaLoader' => undef, + 'English' => undef, + 'Env' => undef, + 'Exporter' => undef, + 'ExtUtils::MakeMaker' => undef, + 'Fcntl' => undef, + 'File::Basename' => undef, + 'File::CheckTree' => undef, + 'File::Find' => undef, + 'FileHandle' => undef, + 'GDBM_File' => undef, + 'Getopt::Long' => undef, + 'Getopt::Std' => undef, + 'I18N::Collate' => undef, + 'IPC::Open2' => undef, + 'IPC::Open3' => undef, + 'Math::BigFloat' => undef, + 'Math::BigInt' => undef, + 'Math::Complex' => undef, + 'NDBM_File' => undef, + 'Net::Ping' => undef, + 'ODBM_File' => undef, + 'POSIX' => undef, + 'SDBM_File' => undef, + 'Search::Dict' => undef, + 'Shell' => undef, + 'Socket' => undef, + 'Sys::Hostname' => undef, + 'Sys::Syslog' => undef, + 'Term::Cap' => undef, + 'Term::Complete' => undef, + 'Test::Harness' => undef, + 'Text::Abbrev' => undef, + 'Text::ParseWords' => undef, + 'Text::Soundex' => undef, + 'Text::Tabs' => undef, + 'TieHash' => undef, + 'Time::Local' => undef, + 'integer' => undef, + 'less' => undef, + 'sigtrap' => undef, + 'strict' => undef, + 'subs' => undef, + }, + removed => { + } + }, + 5.001 => { + delta_from => 5, + changed => { + 'ExtUtils::Liblist' => undef, + 'ExtUtils::Manifest' => undef, + 'ExtUtils::Mkbootstrap' => undef, + 'File::Path' => undef, + 'SubstrHash' => undef, + 'lib' => undef, + }, + removed => { + } + }, + 5.002 => { + delta_from => 5.001, + changed => { + 'DB_File' => '1.01', + 'Devel::SelfStubber' => '1.01', + 'DirHandle' => undef, + 'DynaLoader' => '1.00', + 'ExtUtils::Install' => undef, + 'ExtUtils::MM_OS2' => undef, + 'ExtUtils::MM_Unix' => undef, + 'ExtUtils::MM_VMS' => undef, + 'ExtUtils::MakeMaker' => '5.21', + 'ExtUtils::Manifest' => '1.22', + 'ExtUtils::Mksymlists' => '1.00', + 'Fcntl' => '1.00', + 'File::Copy' => '1.5', + 'File::Path' => '1.01', + 'FileCache' => undef, + 'FileHandle' => '1.00', + 'GDBM_File' => '1.00', + 'Getopt::Long' => '2.01', + 'NDBM_File' => '1.00', + 'Net::Ping' => '1', + 'ODBM_File' => '1.00', + 'POSIX' => '1.00', + 'Pod::Functions' => undef, + 'Pod::Text' => undef, + 'SDBM_File' => '1.00', + 'Safe' => '1.00', + 'SelectSaver' => undef, + 'SelfLoader' => '1.06', + 'Socket' => '1.5', + 'Symbol' => undef, + 'Term::ReadLine' => undef, + 'Test::Harness' => '1.07', + 'Text::Wrap' => undef, + 'Tie::Hash' => undef, + 'Tie::Scalar' => undef, + 'Tie::SubstrHash' => undef, + 'diagnostics' => undef, + 'overload' => undef, + 'vars' => undef, + }, + removed => { + 'SubstrHash' => 1, + 'TieHash' => 1, + } + }, + 5.00307 => { + delta_from => 5.002, + changed => { + 'Config' => undef, + 'DB_File' => '1.03', + 'ExtUtils::Embed' => '1.18', + 'ExtUtils::Install' => '1.15', + 'ExtUtils::Liblist' => '1.20', + 'ExtUtils::MM_Unix' => '1.107', + 'ExtUtils::MakeMaker' => '5.38', + 'ExtUtils::Manifest' => '1.27', + 'ExtUtils::Mkbootstrap' => '1.13', + 'ExtUtils::Mksymlists' => '1.12', + 'ExtUtils::testlib' => '1.11', + 'Fatal' => undef, + 'File::Basename' => '2.4', + 'FindBin' => '1.04', + 'Getopt::Long' => '2.04', + 'IO' => undef, + 'IO::File' => '1.05', + 'IO::Handle' => '1.12', + 'IO::Pipe' => '1.07', + 'IO::Seekable' => '1.05', + 'IO::Select' => '1.09', + 'IO::Socket' => '1.13', + 'Net::Ping' => '1.01', + 'OS2::ExtAttr' => '0.01', + 'OS2::PrfDB' => '0.02', + 'OS2::Process' => undef, + 'OS2::REXX' => undef, + 'Opcode' => '1.01', + 'Safe' => '2.06', + 'Test::Harness' => '1.13', + 'Text::Tabs' => '96.051501', + 'Text::Wrap' => '96.041801', + 'UNIVERSAL' => undef, + 'VMS::Filespec' => undef, + 'VMS::Stdio' => '2.0', + 'ops' => undef, + 'sigtrap' => '1.01', + }, + removed => { + } + }, + 5.004 => { + delta_from => 5.00307, + changed => { + 'Bundle::CPAN' => '0.02', + 'CGI' => '2.36', + 'CGI::Apache' => '1.01', + 'CGI::Carp' => '1.06', + 'CGI::Fast' => '1.00a', + 'CGI::Push' => '1.00', + 'CGI::Switch' => '0.05', + 'CPAN' => '1.2401', + 'CPAN::FirstTime' => '1.18', + 'CPAN::Nox' => undef, + 'Class::Struct' => undef, + 'Cwd' => '2.00', + 'DB_File' => '1.14', + 'DynaLoader' => '1.02', + 'ExtUtils::Command' => '1.00', + 'ExtUtils::Embed' => '1.2501', + 'ExtUtils::Install' => '1.16', + 'ExtUtils::Liblist' => '1.2201', + 'ExtUtils::MM_Unix' => '1.114', + 'ExtUtils::MM_Win32' => undef, + 'ExtUtils::MakeMaker' => '5.4002', + 'ExtUtils::Manifest' => '1.33', + 'ExtUtils::Mksymlists' => '1.13', + 'ExtUtils::XSSymSet' => '1.0', + 'Fcntl' => '1.03', + 'File::Basename' => '2.5', + 'File::Compare' => '1.1001', + 'File::Copy' => '2.02', + 'File::Path' => '1.04', + 'File::stat' => undef, + 'FileHandle' => '2.00', + 'Getopt::Long' => '2.10', + 'IO::File' => '1.0602', + 'IO::Handle' => '1.1504', + 'IO::Pipe' => '1.0901', + 'IO::Seekable' => '1.06', + 'IO::Select' => '1.10', + 'IO::Socket' => '1.1602', + 'IPC::Open2' => '1.01', + 'IPC::Open3' => '1.0101', + 'Math::Complex' => '1.01', + 'Math::Trig' => '1', + 'Net::Ping' => '2.02', + 'Net::hostent' => undef, + 'Net::netent' => undef, + 'Net::protoent' => undef, + 'Net::servent' => undef, + 'Opcode' => '1.04', + 'POSIX' => '1.02', + 'Pod::Html' => undef, + 'Pod::Text' => '1.0203', + 'SelfLoader' => '1.07', + 'Socket' => '1.6', + 'Symbol' => '1.02', + 'Test::Harness' => '1.1502', + 'Text::Tabs' => '96.121201', + 'Text::Wrap' => '97.011701', + 'Tie::RefHash' => undef, + 'Time::gmtime' => '1.01', + 'Time::localtime' => '1.01', + 'Time::tm' => undef, + 'User::grent' => undef, + 'User::pwent' => undef, + 'VMS::DCLsym' => '1.01', + 'VMS::Stdio' => '2.02', + 'autouse' => '1.01', + 'blib' => undef, + 'constant' => '1.00', + 'locale' => undef, + 'sigtrap' => '1.02', + 'vmsish' => undef, + }, + removed => { + 'Fatal' => 1, + } + }, + 5.00405 => { + delta_from => 5.004, + changed => { + 'AutoLoader' => '5.56', + 'AutoSplit' => '1.0303', + 'Bundle::CPAN' => '0.03', + 'CGI' => '2.42', + 'CGI::Apache' => '1.1', + 'CGI::Carp' => '1.10', + 'CGI::Cookie' => '1.06', + 'CGI::Push' => '1.01', + 'CGI::Switch' => '0.06', + 'CPAN' => '1.40', + 'CPAN::FirstTime' => '1.30', + 'Cwd' => '2.01', + 'DB_File' => '1.15', + 'DynaLoader' => '1.03', + 'ExtUtils::Command' => '1.01', + 'ExtUtils::Embed' => '1.2505', + 'ExtUtils::Install' => '1.28', + 'ExtUtils::Liblist' => '1.25', + 'ExtUtils::MM_Unix' => '1.118', + 'ExtUtils::MakeMaker' => '5.42', + 'ExtUtils::Mkbootstrap' => '1.14', + 'ExtUtils::Mksymlists' => '1.16', + 'File::Basename' => '2.6', + 'File::DosGlob' => undef, + 'File::Path' => '1.0402', + 'File::Spec' => '0.6', + 'File::Spec::Mac' => '1.0', + 'File::Spec::OS2' => undef, + 'File::Spec::Unix' => undef, + 'File::Spec::VMS' => undef, + 'File::Spec::Win32' => undef, + 'FindBin' => '1.41', + 'Getopt::Long' => '2.19', + 'IO::File' => '1.06021', + 'IO::Socket' => '1.1603', + 'IPC::Open3' => '1.0103', + 'Math::Complex' => '1.25', + 'NDBM_File' => '1.01', + 'Pod::Html' => '1.0101', + 'Pod::Text' => '1.0204', + 'SelfLoader' => '1.08', + 'Socket' => '1.7', + 'Test' => '1.04', + 'Test::Harness' => '1.1602', + 'Text::ParseWords' => '3.1001', + 'Text::Wrap' => '98.112902', + 'Tie::Handle' => undef, + 'attrs' => '0.1', + 'base' => undef, + 'blib' => '1.00', + 're' => undef, + 'strict' => '1.01', + }, + removed => { + } + }, + 5.005 => { + delta_from => 5.00405, + changed => { + 'AutoLoader' => undef, + 'AutoSplit' => '1.0302', + 'B' => undef, + 'B::Asmdata' => undef, + 'B::Assembler' => undef, + 'B::Bblock' => undef, + 'B::Bytecode' => undef, + 'B::C' => undef, + 'B::CC' => undef, + 'B::Debug' => undef, + 'B::Deparse' => '0.56', + 'B::Disassembler' => undef, + 'B::Lint' => undef, + 'B::Showlex' => undef, + 'B::Stackobj' => undef, + 'B::Terse' => undef, + 'B::Xref' => undef, + 'CGI::Carp' => '1.101', + 'CPAN' => '1.3901', + 'CPAN::FirstTime' => '1.29', + 'DB_File' => '1.60', + 'Data::Dumper' => '2.09', + 'Errno' => '1.09', + 'ExtUtils::Installed' => '0.02', + 'ExtUtils::MM_Unix' => '1.12601', + 'ExtUtils::MakeMaker' => '5.4301', + 'ExtUtils::Mkbootstrap' => '1.13', + 'ExtUtils::Mksymlists' => '1.17', + 'ExtUtils::Packlist' => '0.03', + 'Fatal' => '1.02', + 'File::Path' => '1.0401', + 'Getopt::Long' => '2.17', + 'IO::Handle' => '1.1505', + 'IPC::Msg' => '1.00', + 'IPC::Open3' => '1.0102', + 'IPC::Semaphore' => '1.00', + 'IPC::SysV' => '1.03', + 'O' => undef, + 'OS2::Process' => '0.2', + 'Pod::Html' => '1.01', + 'Pod::Text' => '1.0203', + 'Text::ParseWords' => '3.1', + 'Text::Wrap' => '97.02', + 'Thread' => '1.0', + 'Thread::Queue' => undef, + 'Thread::Semaphore' => undef, + 'Thread::Signal' => undef, + 'Thread::Specific' => undef, + 'Tie::Array' => '1.00', + 'VMS::Stdio' => '2.1', + 'attrs' => '1.0', + 'fields' => '0.02', + 're' => '0.02', + }, + removed => { + 'Bundle::CPAN' => 1, + } + }, + 5.00503 => { + delta_from => 5.005, + changed => { + 'AutoSplit' => '1.0303', + 'CGI' => '2.46', + 'CGI::Carp' => '1.13', + 'CGI::Fast' => '1.01', + 'CPAN' => '1.48', + 'CPAN::FirstTime' => '1.36', + 'CPAN::Nox' => '1.00', + 'DB_File' => '1.65', + 'Data::Dumper' => '2.101', + 'Dumpvalue' => undef, + 'Errno' => '1.111', + 'ExtUtils::Install' => '1.28', + 'ExtUtils::Liblist' => '1.25', + 'ExtUtils::MM_Unix' => '1.12602', + 'ExtUtils::MakeMaker' => '5.4302', + 'ExtUtils::Manifest' => '1.33', + 'ExtUtils::Mkbootstrap' => '1.14', + 'ExtUtils::Mksymlists' => '1.17', + 'ExtUtils::testlib' => '1.11', + 'FindBin' => '1.42', + 'Getopt::Long' => '2.19', + 'Getopt::Std' => '1.01', + 'IO::Pipe' => '1.0902', + 'IPC::Open3' => '1.0103', + 'Math::Complex' => '1.26', + 'Test' => '1.122', + 'Text::Wrap' => '98.112902', + }, + removed => { + } + }, + 5.00504 => { + delta_from => 5.00503, + changed => { + 'CPAN::FirstTime' => '1.36', + 'DB_File' => '1.807', + 'ExtUtils::Install' => '1.28', + 'ExtUtils::Liblist' => '1.25', + 'ExtUtils::MM_Unix' => '1.12602', + 'ExtUtils::Manifest' => '1.33', + 'ExtUtils::Miniperl' => undef, + 'ExtUtils::Mkbootstrap' => '1.14', + 'ExtUtils::Mksymlists' => '1.17', + 'ExtUtils::testlib' => '1.11', + 'File::Compare' => '1.1002', + 'File::Spec' => '0.8', + 'File::Spec::Functions' => undef, + 'File::Spec::Mac' => undef, + 'Getopt::Long' => '2.20', + 'Pod::Html' => '1.02', + }, + removed => { + } + }, + 5.006 => { + delta_from => 5.00504, + changed => { + 'AutoLoader' => '5.57', + 'AutoSplit' => '1.0305', + 'B::Deparse' => '0.59', + 'B::Stash' => undef, + 'Benchmark' => '1', + 'ByteLoader' => '0.03', + 'CGI' => '2.56', + 'CGI::Apache' => undef, + 'CGI::Carp' => '1.14', + 'CGI::Cookie' => '1.12', + 'CGI::Fast' => '1.02', + 'CGI::Pretty' => '1.03', + 'CGI::Switch' => undef, + 'CPAN' => '1.52', + 'CPAN::FirstTime' => '1.38', + 'Carp::Heavy' => undef, + 'Class::Struct' => '0.58', + 'Cwd' => '2.02', + 'DB' => '1.0', + 'DB_File' => '1.72', + 'Devel::DProf' => '20000000.00_00', + 'Devel::Peek' => '1.00_01', + 'DynaLoader' => '1.04', + 'Exporter' => '5.562', + 'Exporter::Heavy' => undef, + 'ExtUtils::MM_Cygwin' => undef, + 'ExtUtils::MM_Unix' => '1.12603', + 'ExtUtils::MakeMaker' => '5.45', + 'File::Copy' => '2.03', + 'File::Glob' => '0.991', + 'File::Path' => '1.0403', + 'GDBM_File' => '1.03', + 'Getopt::Long' => '2.23', + 'Getopt::Std' => '1.02', + 'IO' => '1.20', + 'IO::Dir' => '1.03', + 'IO::File' => '1.08', + 'IO::Handle' => '1.21', + 'IO::Pipe' => '1.121', + 'IO::Poll' => '0.01', + 'IO::Seekable' => '1.08', + 'IO::Select' => '1.14', + 'IO::Socket' => '1.26', + 'IO::Socket::INET' => '1.25', + 'IO::Socket::UNIX' => '1.20', + 'JNI' => '0.01', + 'JPL::AutoLoader' => undef, + 'JPL::Class' => undef, + 'JPL::Compile' => undef, + 'NDBM_File' => '1.03', + 'ODBM_File' => '1.02', + 'OS2::DLL' => undef, + 'POSIX' => '1.03', + 'Pod::Checker' => '1.098', + 'Pod::Find' => '0.12', + 'Pod::Html' => '1.03', + 'Pod::InputObjects' => '1.12', + 'Pod::Man' => '1.02', + 'Pod::ParseUtils' => '0.2', + 'Pod::Parser' => '1.12', + 'Pod::Plainer' => '0.01', + 'Pod::Select' => '1.12', + 'Pod::Text' => '2.03', + 'Pod::Text::Color' => '0.05', + 'Pod::Text::Termcap' => '0.04', + 'Pod::Usage' => '1.12', + 'SDBM_File' => '1.02', + 'SelfLoader' => '1.0901', + 'Shell' => '0.2', + 'Socket' => '1.72', + 'Sys::Hostname' => '1.1', + 'Sys::Syslog' => '0.01', + 'Term::ANSIColor' => '1.01', + 'Test' => '1.13', + 'Test::Harness' => '1.1604', + 'Text::ParseWords' => '3.2', + 'Text::Soundex' => '1.0', + 'Text::Tabs' => '98.112801', + 'Tie::Array' => '1.01', + 'Tie::Handle' => '1.0', + 'VMS::Stdio' => '2.2', + 'XSLoader' => '0.01', + 'attributes' => '0.03', + 'autouse' => '1.02', + 'base' => '1.01', + 'bytes' => undef, + 'charnames' => undef, + 'constant' => '1.02', + 'diagnostics' => '1.0', + 'fields' => '1.01', + 'filetest' => undef, + 'lib' => '0.5564', + 'open' => undef, + 'utf8' => undef, + 'warnings' => undef, + 'warnings::register' => undef, + }, + removed => { + } + }, + 5.006001 => { + delta_from => 5.006, + changed => { + 'AutoLoader' => '5.58', + 'B::Assembler' => '0.02', + 'B::Concise' => '0.51', + 'B::Deparse' => '0.6', + 'ByteLoader' => '0.04', + 'CGI' => '2.752', + 'CGI::Carp' => '1.20', + 'CGI::Cookie' => '1.18', + 'CGI::Pretty' => '1.05', + 'CGI::Push' => '1.04', + 'CGI::Util' => '1.1', + 'CPAN' => '1.59_54', + 'CPAN::FirstTime' => '1.53', + 'Class::Struct' => '0.59', + 'Cwd' => '2.04', + 'DB_File' => '1.75', + 'Data::Dumper' => '2.102', + 'ExtUtils::Install' => '1.28', + 'ExtUtils::Liblist' => '1.26', + 'ExtUtils::MM_Unix' => '1.12603', + 'ExtUtils::Manifest' => '1.33', + 'ExtUtils::Mkbootstrap' => '1.14', + 'ExtUtils::Mksymlists' => '1.17', + 'ExtUtils::testlib' => '1.11', + 'File::Path' => '1.0404', + 'File::Spec' => '0.82', + 'File::Spec::Epoc' => undef, + 'File::Spec::Functions' => '1.1', + 'File::Spec::Mac' => '1.2', + 'File::Spec::OS2' => '1.1', + 'File::Spec::Unix' => '1.2', + 'File::Spec::VMS' => '1.1', + 'File::Spec::Win32' => '1.2', + 'File::Temp' => '0.12', + 'GDBM_File' => '1.05', + 'Getopt::Long' => '2.25', + 'IO::Poll' => '0.05', + 'JNI' => '0.1', + 'Math::BigFloat' => '0.02', + 'Math::BigInt' => '0.01', + 'Math::Complex' => '1.31', + 'NDBM_File' => '1.04', + 'ODBM_File' => '1.03', + 'OS2::REXX' => '1.00', + 'Pod::Checker' => '1.2', + 'Pod::Find' => '0.21', + 'Pod::InputObjects' => '1.13', + 'Pod::LaTeX' => '0.53', + 'Pod::Man' => '1.15', + 'Pod::ParseUtils' => '0.22', + 'Pod::Parser' => '1.13', + 'Pod::Select' => '1.13', + 'Pod::Text' => '2.08', + 'Pod::Text::Color' => '0.06', + 'Pod::Text::Overstrike' => '1.01', + 'Pod::Text::Termcap' => '1', + 'Pod::Usage' => '1.14', + 'SDBM_File' => '1.03', + 'SelfLoader' => '1.0902', + 'Shell' => '0.3', + 'Term::ANSIColor' => '1.03', + 'Test' => '1.15', + 'Text::Wrap' => '2001.0131', + 'Tie::Handle' => '4.0', + 'Tie::RefHash' => '1.3', + }, + removed => { + } + }, + 5.006002 => { + delta_from => 5.006001, + changed => { + 'CPAN::FirstTime' => '1.53', + 'DB_File' => '1.806', + 'Data::Dumper' => '2.121', + 'ExtUtils::Command' => '1.05', + 'ExtUtils::Command::MM' => '0.03', + 'ExtUtils::Install' => '1.32', + 'ExtUtils::Installed' => '0.08', + 'ExtUtils::Liblist' => '1.01', + 'ExtUtils::Liblist::Kid'=> '1.3', + 'ExtUtils::MM' => '0.04', + 'ExtUtils::MM_Any' => '0.07', + 'ExtUtils::MM_BeOS' => '1.04', + 'ExtUtils::MM_Cygwin' => '1.06', + 'ExtUtils::MM_DOS' => '0.02', + 'ExtUtils::MM_MacOS' => '1.07', + 'ExtUtils::MM_NW5' => '2.06', + 'ExtUtils::MM_OS2' => '1.04', + 'ExtUtils::MM_UWIN' => '0.02', + 'ExtUtils::MM_Unix' => '1.42', + 'ExtUtils::MM_VMS' => '5.70', + 'ExtUtils::MM_Win32' => '1.09', + 'ExtUtils::MM_Win95' => '0.03', + 'ExtUtils::MY' => '0.01', + 'ExtUtils::MakeMaker' => '6.17', + 'ExtUtils::MakeMaker::bytes'=> '0.01', + 'ExtUtils::MakeMaker::vmsish'=> '0.01', + 'ExtUtils::Manifest' => '1.42', + 'ExtUtils::Mkbootstrap' => '1.15', + 'ExtUtils::Mksymlists' => '1.19', + 'ExtUtils::Packlist' => '0.04', + 'ExtUtils::testlib' => '1.15', + 'File::Spec' => '0.86', + 'File::Spec::Cygwin' => '1.1', + 'File::Spec::Epoc' => '1.1', + 'File::Spec::Functions' => '1.3', + 'File::Spec::Mac' => '1.4', + 'File::Spec::OS2' => '1.2', + 'File::Spec::Unix' => '1.5', + 'File::Spec::VMS' => '1.4', + 'File::Spec::Win32' => '1.4', + 'File::Temp' => '0.14', + 'Safe' => '2.10', + 'Test' => '1.24', + 'Test::Builder' => '0.17', + 'Test::Harness' => '2.30', + 'Test::Harness::Assert' => '0.01', + 'Test::Harness::Iterator'=> '0.01', + 'Test::Harness::Straps' => '0.15', + 'Test::More' => '0.47', + 'Test::Simple' => '0.47', + 'Unicode' => '3.0.1', + 'if' => '0.03', + 'ops' => '1.00', + }, + removed => { + } + }, + 5.007003 => { + delta_from => 5.006001, + changed => { + 'AnyDBM_File' => '1.00', + 'Attribute::Handlers' => '0.76', + 'AutoLoader' => '5.59', + 'AutoSplit' => '1.0307', + 'B' => '1.00', + 'B::Asmdata' => '1.00', + 'B::Assembler' => '0.04', + 'B::Bblock' => '1.00', + 'B::Bytecode' => '1.00', + 'B::C' => '1.01', + 'B::CC' => '1.00', + 'B::Concise' => '0.52', + 'B::Debug' => '1.00', + 'B::Deparse' => '0.63', + 'B::Disassembler' => '1.01', + 'B::Lint' => '1.00', + 'B::Showlex' => '1.00', + 'B::Stackobj' => '1.00', + 'B::Stash' => '1.00', + 'B::Terse' => '1.00', + 'B::Xref' => '1.00', + 'Benchmark' => '1.04', + 'CGI' => '2.80', + 'CGI::Apache' => '1.00', + 'CGI::Carp' => '1.22', + 'CGI::Cookie' => '1.20', + 'CGI::Fast' => '1.04', + 'CGI::Pretty' => '1.05_00', + 'CGI::Switch' => '1.00', + 'CGI::Util' => '1.3', + 'CPAN' => '1.59_56', + 'CPAN::FirstTime' => '1.54', + 'CPAN::Nox' => '1.00_01', + 'Carp' => '1.01', + 'Carp::Heavy' => '1.01', + 'Class::ISA' => '0.32', + 'Class::Struct' => '0.61', + 'Cwd' => '2.06', + 'DB_File' => '1.804', + 'Data::Dumper' => '2.12', + 'Devel::DProf' => '20000000.00_01', + 'Devel::PPPort' => '2.0002', + 'Devel::Peek' => '1.00_03', + 'Devel::SelfStubber' => '1.03', + 'Digest' => '1.00', + 'Digest::MD5' => '2.16', + 'DirHandle' => '1.00', + 'Dumpvalue' => '1.10', + 'Encode' => '0.40', + 'Encode::CN' => '0.02', + 'Encode::CN::HZ' => undef, + 'Encode::Encoding' => '0.02', + 'Encode::Internal' => '0.30', + 'Encode::JP' => '0.02', + 'Encode::JP::Constants' => '1.02', + 'Encode::JP::H2Z' => '0.77', + 'Encode::JP::ISO_2022_JP'=> undef, + 'Encode::JP::JIS' => undef, + 'Encode::JP::Tr' => '0.77', + 'Encode::KR' => '0.02', + 'Encode::TW' => '0.02', + 'Encode::Tcl' => '1.01', + 'Encode::Tcl::Escape' => '1.01', + 'Encode::Tcl::Extended' => '1.01', + 'Encode::Tcl::HanZi' => '1.01', + 'Encode::Tcl::Table' => '1.01', + 'Encode::Unicode' => '0.30', + 'Encode::XS' => '0.40', + 'Encode::iso10646_1' => '0.30', + 'Encode::usc2_le' => '0.30', + 'Encode::utf8' => '0.30', + 'English' => '1.00', + 'Env' => '1.00', + 'Exporter' => '5.566', + 'Exporter::Heavy' => '5.562', + 'ExtUtils::Command' => '1.02', + 'ExtUtils::Constant' => '0.11', + 'ExtUtils::Embed' => '1.250601', + 'ExtUtils::Install' => '1.29', + 'ExtUtils::Installed' => '0.04', + 'ExtUtils::Liblist' => '1.2701', + 'ExtUtils::MM_BeOS' => '1.00', + 'ExtUtils::MM_Cygwin' => '1.00', + 'ExtUtils::MM_OS2' => '1.00', + 'ExtUtils::MM_Unix' => '1.12607', + 'ExtUtils::MM_VMS' => '5.56', + 'ExtUtils::MM_Win32' => '1.00_02', + 'ExtUtils::MakeMaker' => '5.48_03', + 'ExtUtils::Manifest' => '1.35', + 'ExtUtils::Mkbootstrap' => '1.1401', + 'ExtUtils::Mksymlists' => '1.18', + 'ExtUtils::Packlist' => '0.04', + 'ExtUtils::testlib' => '1.1201', + 'Fatal' => '1.03', + 'Fcntl' => '1.04', + 'File::Basename' => '2.71', + 'File::CheckTree' => '4.1', + 'File::Compare' => '1.1003', + 'File::Copy' => '2.05', + 'File::DosGlob' => '1.00', + 'File::Find' => '1.04', + 'File::Glob' => '1.01', + 'File::Path' => '1.05', + 'File::Spec' => '0.83', + 'File::Spec::Cygwin' => '1.0', + 'File::Spec::Epoc' => '1.00', + 'File::Spec::Functions' => '1.2', + 'File::Spec::Mac' => '1.3', + 'File::Spec::Unix' => '1.4', + 'File::Spec::VMS' => '1.2', + 'File::Spec::Win32' => '1.3', + 'File::Temp' => '0.13', + 'File::stat' => '1.00', + 'FileCache' => '1.00', + 'FileHandle' => '2.01', + 'Filter::Simple' => '0.77', + 'Filter::Util::Call' => '1.06', + 'FindBin' => '1.43', + 'GDBM_File' => '1.06', + 'Getopt::Long' => '2.28', + 'Getopt::Std' => '1.03', + 'I18N::Collate' => '1.00', + 'I18N::LangTags' => '0.27', + 'I18N::LangTags::List' => '0.25', + 'I18N::Langinfo' => '0.01', + 'IO::Dir' => '1.03_00', + 'IO::File' => '1.09', + 'IO::Handle' => '1.21_00', + 'IO::Pipe' => '1.122', + 'IO::Poll' => '0.06', + 'IO::Seekable' => '1.08_00', + 'IO::Select' => '1.15', + 'IO::Socket' => '1.27', + 'IO::Socket::INET' => '1.26', + 'IO::Socket::UNIX' => '1.20_00', + 'IPC::Msg' => '1.00_00', + 'IPC::Open3' => '1.0104', + 'IPC::Semaphore' => '1.00_00', + 'IPC::SysV' => '1.03_00', + 'List::Util' => '1.06_00', + 'Locale::Constants' => '2.01', + 'Locale::Country' => '2.01', + 'Locale::Currency' => '2.01', + 'Locale::Language' => '2.01', + 'Locale::Maketext' => '1.03', + 'Locale::Script' => '2.01', + 'MIME::Base64' => '2.12', + 'MIME::QuotedPrint' => '2.03', + 'Math::BigFloat' => '1.30', + 'Math::BigInt' => '1.54', + 'Math::BigInt::Calc' => '0.25', + 'Math::Complex' => '1.34', + 'Math::Trig' => '1.01', + 'Memoize' => '0.66', + 'Memoize::AnyDBM_File' => '0.65', + 'Memoize::Expire' => '0.66', + 'Memoize::ExpireFile' => '0.65', + 'Memoize::ExpireTest' => '0.65', + 'Memoize::NDBM_File' => '0.65', + 'Memoize::SDBM_File' => '0.65', + 'Memoize::Storable' => '0.65', + 'NEXT' => '0.50', + 'Net::Cmd' => '2.21', + 'Net::Config' => '1.10', + 'Net::Domain' => '2.17', + 'Net::FTP' => '2.64', + 'Net::FTP::A' => '1.15', + 'Net::FTP::E' => '0.01', + 'Net::FTP::I' => '1.12', + 'Net::FTP::L' => '0.01', + 'Net::FTP::dataconn' => '0.10', + 'Net::NNTP' => '2.21', + 'Net::Netrc' => '2.12', + 'Net::POP3' => '2.23', + 'Net::Ping' => '2.12', + 'Net::SMTP' => '2.21', + 'Net::Time' => '2.09', + 'Net::hostent' => '1.00', + 'Net::netent' => '1.00', + 'Net::protoent' => '1.00', + 'Net::servent' => '1.00', + 'O' => '1.00', + 'OS2::DLL' => '1.00', + 'OS2::Process' => '1.0', + 'OS2::REXX' => '1.01', + 'Opcode' => '1.05', + 'POSIX' => '1.05', + 'PerlIO' => '1.00', + 'PerlIO::Scalar' => '0.01', + 'PerlIO::Via' => '0.01', + 'Pod::Checker' => '1.3', + 'Pod::Find' => '0.22', + 'Pod::Functions' => '1.01', + 'Pod::Html' => '1.04', + 'Pod::LaTeX' => '0.54', + 'Pod::Man' => '1.32', + 'Pod::ParseLink' => '1.05', + 'Pod::Text' => '2.18', + 'Pod::Text::Color' => '1.03', + 'Pod::Text::Overstrike' => '1.08', + 'Pod::Text::Termcap' => '1.09', + 'Safe' => '2.07', + 'Scalar::Util' => '1.06_00', + 'Search::Dict' => '1.02', + 'SelectSaver' => '1.00', + 'SelfLoader' => '1.0903', + 'Shell' => '0.4', + 'Socket' => '1.75', + 'Storable' => '1.015', + 'Switch' => '2.06', + 'Symbol' => '1.04', + 'Sys::Syslog' => '0.02', + 'Term::ANSIColor' => '1.04', + 'Term::Cap' => '1.07', + 'Term::Complete' => '1.4', + 'Term::ReadLine' => '1.00', + 'Test' => '1.18', + 'Test::Builder' => '0.11', + 'Test::Harness' => '2.01', + 'Test::Harness::Assert' => '0.01', + 'Test::Harness::Iterator'=> '0.01', + 'Test::Harness::Straps' => '0.08', + 'Test::More' => '0.41', + 'Test::Simple' => '0.41', + 'Text::Abbrev' => '1.00', + 'Text::Balanced' => '1.89', + 'Text::ParseWords' => '3.21', + 'Text::Soundex' => '1.01', + 'Text::Wrap' => '2001.0929', + 'Thread' => '2.00', + 'Thread::Queue' => '1.00', + 'Thread::Semaphore' => '1.00', + 'Thread::Signal' => '1.00', + 'Thread::Specific' => '1.00', + 'Tie::Array' => '1.02', + 'Tie::File' => '0.17', + 'Tie::Handle' => '4.1', + 'Tie::Hash' => '1.00', + 'Tie::Memoize' => '1.0', + 'Tie::RefHash' => '1.3_00', + 'Tie::Scalar' => '1.00', + 'Tie::SubstrHash' => '1.00', + 'Time::HiRes' => '1.20_00', + 'Time::Local' => '1.04', + 'Time::gmtime' => '1.02', + 'Time::localtime' => '1.02', + 'Time::tm' => '1.00', + 'UNIVERSAL' => '1.00', + 'Unicode::Collate' => '0.10', + 'Unicode::Normalize' => '0.14', + 'Unicode::UCD' => '0.2', + 'User::grent' => '1.00', + 'User::pwent' => '1.00', + 'VMS::DCLsym' => '1.02', + 'VMS::Filespec' => '1.1', + 'VMS::Stdio' => '2.3', + 'XS::Typemap' => '0.01', + 'attributes' => '0.04_01', + 'attrs' => '1.01', + 'autouse' => '1.03', + 'base' => '1.02', + 'blib' => '1.01', + 'bytes' => '1.00', + 'charnames' => '1.01', + 'constant' => '1.04', + 'diagnostics' => '1.1', + 'encoding' => '1.00', + 'fields' => '1.02', + 'filetest' => '1.00', + 'if' => '0.01', + 'integer' => '1.00', + 'less' => '0.01', + 'locale' => '1.00', + 'open' => '1.01', + 'ops' => '1.00', + 'overload' => '1.00', + 're' => '0.03', + 'sort' => '1.00', + 'strict' => '1.02', + 'subs' => '1.00', + 'threads' => '0.05', + 'threads::shared' => '0.90', + 'utf8' => '1.00', + 'vars' => '1.01', + 'vmsish' => '1.00', + 'warnings' => '1.00', + 'warnings::register' => '1.00', + }, + removed => { + } + }, + 5.008 => { + delta_from => 5.007003, + changed => { + 'Attribute::Handlers' => '0.77', + 'B' => '1.01', + 'B::Lint' => '1.01', + 'B::Xref' => '1.01', + 'CGI' => '2.81', + 'CGI::Carp' => '1.23', + 'CPAN' => '1.61', + 'CPAN::FirstTime' => '1.56', + 'CPAN::Nox' => '1.02', + 'Digest::MD5' => '2.20', + 'Dumpvalue' => '1.11', + 'Encode' => '1.75', + 'Encode::Alias' => '1.32', + 'Encode::Byte' => '1.22', + 'Encode::CJKConstants' => '1.00', + 'Encode::CN' => '1.24', + 'Encode::CN::HZ' => '1.04', + 'Encode::Config' => '1.06', + 'Encode::EBCDIC' => '1.21', + 'Encode::Encoder' => '0.05', + 'Encode::Encoding' => '1.30', + 'Encode::Guess' => '1.06', + 'Encode::JP' => '1.25', + 'Encode::JP::H2Z' => '1.02', + 'Encode::JP::JIS7' => '1.08', + 'Encode::KR' => '1.22', + 'Encode::KR::2022_KR' => '1.05', + 'Encode::MIME::Header' => '1.05', + 'Encode::Symbol' => '1.22', + 'Encode::TW' => '1.26', + 'Encode::Unicode' => '1.37', + 'Exporter::Heavy' => '5.566', + 'ExtUtils::Command' => '1.04', + 'ExtUtils::Command::MM' => '0.01', + 'ExtUtils::Constant' => '0.12', + 'ExtUtils::Installed' => '0.06', + 'ExtUtils::Liblist' => '1.00', + 'ExtUtils::Liblist::Kid'=> '1.29', + 'ExtUtils::MM' => '0.04', + 'ExtUtils::MM_Any' => '0.04', + 'ExtUtils::MM_BeOS' => '1.03', + 'ExtUtils::MM_Cygwin' => '1.04', + 'ExtUtils::MM_DOS' => '0.01', + 'ExtUtils::MM_MacOS' => '1.03', + 'ExtUtils::MM_NW5' => '2.05', + 'ExtUtils::MM_OS2' => '1.03', + 'ExtUtils::MM_UWIN' => '0.01', + 'ExtUtils::MM_Unix' => '1.33', + 'ExtUtils::MM_VMS' => '5.65', + 'ExtUtils::MM_Win32' => '1.05', + 'ExtUtils::MM_Win95' => '0.02', + 'ExtUtils::MY' => '0.01', + 'ExtUtils::MakeMaker' => '6.03', + 'ExtUtils::Manifest' => '1.38', + 'ExtUtils::Mkbootstrap' => '1.15', + 'ExtUtils::Mksymlists' => '1.19', + 'ExtUtils::testlib' => '1.15', + 'File::CheckTree' => '4.2', + 'FileCache' => '1.021', + 'Filter::Simple' => '0.78', + 'Getopt::Long' => '2.32', + 'Hash::Util' => '0.04', + 'List::Util' => '1.07_00', + 'Locale::Country' => '2.04', + 'Math::BigFloat' => '1.35', + 'Math::BigFloat::Trace' => '0.01', + 'Math::BigInt' => '1.60', + 'Math::BigInt::Calc' => '0.30', + 'Math::BigInt::Trace' => '0.01', + 'Math::BigRat' => '0.07', + 'Memoize' => '1.01', + 'Memoize::Expire' => '1.00', + 'Memoize::ExpireFile' => '1.01', + 'Net::FTP' => '2.65', + 'Net::FTP::dataconn' => '0.11', + 'Net::Ping' => '2.19', + 'Net::SMTP' => '2.24', + 'PerlIO' => '1.01', + 'PerlIO::encoding' => '0.06', + 'PerlIO::scalar' => '0.01', + 'PerlIO::via' => '0.01', + 'PerlIO::via::QuotedPrint'=> '0.04', + 'Pod::Man' => '1.33', + 'Pod::Text' => '2.19', + 'Scalar::Util' => '1.07_00', + 'Storable' => '2.04', + 'Switch' => '2.09', + 'Sys::Syslog' => '0.03', + 'Test' => '1.20', + 'Test::Builder' => '0.15', + 'Test::Harness' => '2.26', + 'Test::Harness::Straps' => '0.14', + 'Test::More' => '0.45', + 'Test::Simple' => '0.45', + 'Thread::Queue' => '2.00', + 'Thread::Semaphore' => '2.00', + 'Tie::File' => '0.93', + 'Tie::RefHash' => '1.30', + 'Unicode' => '3.2.0', + 'Unicode::Collate' => '0.12', + 'Unicode::Normalize' => '0.17', + 'XS::APItest' => '0.01', + 'attributes' => '0.05', + 'base' => '1.03', + 'bigint' => '0.02', + 'bignum' => '0.11', + 'bigrat' => '0.04', + 'blib' => '1.02', + 'encoding' => '1.35', + 'sort' => '1.01', + 'threads' => '0.99', + }, + removed => { + 'Encode::Internal' => 1, + 'Encode::JP::Constants' => 1, + 'Encode::JP::ISO_2022_JP'=> 1, + 'Encode::JP::JIS' => 1, + 'Encode::JP::Tr' => 1, + 'Encode::Tcl' => 1, + 'Encode::Tcl::Escape' => 1, + 'Encode::Tcl::Extended' => 1, + 'Encode::Tcl::HanZi' => 1, + 'Encode::Tcl::Table' => 1, + 'Encode::XS' => 1, + 'Encode::iso10646_1' => 1, + 'Encode::usc2_le' => 1, + 'Encode::utf8' => 1, + 'PerlIO::Scalar' => 1, + 'PerlIO::Via' => 1, + } + }, + 5.008001 => { + delta_from => 5.008, + changed => { + 'Attribute::Handlers' => '0.78', + 'AutoLoader' => '5.60', + 'AutoSplit' => '1.04', + 'B' => '1.02', + 'B::Asmdata' => '1.01', + 'B::Assembler' => '0.06', + 'B::Bblock' => '1.02', + 'B::Bytecode' => '1.01', + 'B::C' => '1.02', + 'B::Concise' => '0.56', + 'B::Debug' => '1.01', + 'B::Deparse' => '0.64', + 'B::Disassembler' => '1.03', + 'B::Lint' => '1.02', + 'B::Terse' => '1.02', + 'Benchmark' => '1.051', + 'ByteLoader' => '0.05', + 'CGI' => '3.00', + 'CGI::Carp' => '1.26', + 'CGI::Cookie' => '1.24', + 'CGI::Fast' => '1.041', + 'CGI::Pretty' => '1.07_00', + 'CGI::Util' => '1.31', + 'CPAN' => '1.76_01', + 'CPAN::FirstTime' => '1.60', + 'CPAN::Nox' => '1.03', + 'Class::Struct' => '0.63', + 'Cwd' => '2.08', + 'DB_File' => '1.806', + 'Data::Dumper' => '2.121', + 'Devel::DProf' => '20030813.00', + 'Devel::PPPort' => '2.007', + 'Devel::Peek' => '1.01', + 'Digest' => '1.02', + 'Digest::MD5' => '2.27', + 'Encode' => '1.9801', + 'Encode::Alias' => '1.38', + 'Encode::Byte' => '1.23', + 'Encode::CJKConstants' => '1.02', + 'Encode::CN::HZ' => '1.05', + 'Encode::Config' => '1.07', + 'Encode::Encoder' => '0.07', + 'Encode::Encoding' => '1.33', + 'Encode::Guess' => '1.09', + 'Encode::JP::JIS7' => '1.12', + 'Encode::KR' => '1.23', + 'Encode::KR::2022_KR' => '1.06', + 'Encode::MIME::Header' => '1.09', + 'Encode::Unicode' => '1.40', + 'Encode::Unicode::UTF7' => '0.02', + 'English' => '1.01', + 'Errno' => '1.09_00', + 'Exporter' => '5.567', + 'Exporter::Heavy' => '5.567', + 'ExtUtils::Command' => '1.05', + 'ExtUtils::Command::MM' => '0.03', + 'ExtUtils::Constant' => '0.14', + 'ExtUtils::Install' => '1.32', + 'ExtUtils::Installed' => '0.08', + 'ExtUtils::Liblist' => '1.01', + 'ExtUtils::Liblist::Kid'=> '1.3', + 'ExtUtils::MM_Any' => '0.07', + 'ExtUtils::MM_BeOS' => '1.04', + 'ExtUtils::MM_Cygwin' => '1.06', + 'ExtUtils::MM_DOS' => '0.02', + 'ExtUtils::MM_MacOS' => '1.07', + 'ExtUtils::MM_NW5' => '2.06', + 'ExtUtils::MM_OS2' => '1.04', + 'ExtUtils::MM_UWIN' => '0.02', + 'ExtUtils::MM_Unix' => '1.42', + 'ExtUtils::MM_VMS' => '5.70', + 'ExtUtils::MM_Win32' => '1.09', + 'ExtUtils::MM_Win95' => '0.03', + 'ExtUtils::MakeMaker' => '6.17', + 'ExtUtils::MakeMaker::bytes'=> '0.01', + 'ExtUtils::MakeMaker::vmsish'=> '0.01', + 'ExtUtils::Manifest' => '1.42', + 'Fcntl' => '1.05', + 'File::Basename' => '2.72', + 'File::Copy' => '2.06', + 'File::Find' => '1.05', + 'File::Glob' => '1.02', + 'File::Path' => '1.06', + 'File::Spec' => '0.86', + 'File::Spec::Cygwin' => '1.1', + 'File::Spec::Epoc' => '1.1', + 'File::Spec::Functions' => '1.3', + 'File::Spec::Mac' => '1.4', + 'File::Spec::OS2' => '1.2', + 'File::Spec::Unix' => '1.5', + 'File::Spec::VMS' => '1.4', + 'File::Spec::Win32' => '1.4', + 'File::Temp' => '0.14', + 'FileCache' => '1.03', + 'Filter::Util::Call' => '1.0601', + 'GDBM_File' => '1.07', + 'Getopt::Long' => '2.34', + 'Getopt::Std' => '1.04', + 'Hash::Util' => '0.05', + 'I18N::LangTags' => '0.28', + 'I18N::LangTags::List' => '0.26', + 'I18N::Langinfo' => '0.02', + 'IO' => '1.21', + 'IO::Dir' => '1.04', + 'IO::File' => '1.10', + 'IO::Handle' => '1.23', + 'IO::Seekable' => '1.09', + 'IO::Select' => '1.16', + 'IO::Socket' => '1.28', + 'IO::Socket::INET' => '1.27', + 'IO::Socket::UNIX' => '1.21', + 'IPC::Msg' => '1.02', + 'IPC::Open3' => '1.0105', + 'IPC::Semaphore' => '1.02', + 'IPC::SysV' => '1.04', + 'JNI' => '0.2', + 'List::Util' => '1.13', + 'Locale::Country' => '2.61', + 'Locale::Currency' => '2.21', + 'Locale::Language' => '2.21', + 'Locale::Maketext' => '1.06', + 'Locale::Maketext::Guts'=> undef, + 'Locale::Maketext::GutsLoader'=> undef, + 'Locale::Script' => '2.21', + 'MIME::Base64' => '2.20', + 'MIME::QuotedPrint' => '2.20', + 'Math::BigFloat' => '1.40', + 'Math::BigInt' => '1.66', + 'Math::BigInt::Calc' => '0.36', + 'Math::BigInt::Scalar' => '0.11', + 'Math::BigRat' => '0.10', + 'Math::Trig' => '1.02', + 'NDBM_File' => '1.05', + 'NEXT' => '0.60', + 'Net::Cmd' => '2.24', + 'Net::Domain' => '2.18', + 'Net::FTP' => '2.71', + 'Net::FTP::A' => '1.16', + 'Net::NNTP' => '2.22', + 'Net::POP3' => '2.24', + 'Net::Ping' => '2.31', + 'Net::SMTP' => '2.26', + 'Net::hostent' => '1.01', + 'Net::servent' => '1.01', + 'ODBM_File' => '1.04', + 'OS2::DLL' => '1.01', + 'OS2::ExtAttr' => '0.02', + 'OS2::PrfDB' => '0.03', + 'OS2::Process' => '1.01', + 'OS2::REXX' => '1.02', + 'POSIX' => '1.06', + 'PerlIO' => '1.02', + 'PerlIO::encoding' => '0.07', + 'PerlIO::scalar' => '0.02', + 'PerlIO::via' => '0.02', + 'PerlIO::via::QuotedPrint'=> '0.05', + 'Pod::Checker' => '1.41', + 'Pod::Find' => '0.24', + 'Pod::Functions' => '1.02', + 'Pod::Html' => '1.0501', + 'Pod::InputObjects' => '1.14', + 'Pod::LaTeX' => '0.55', + 'Pod::Man' => '1.37', + 'Pod::ParseLink' => '1.06', + 'Pod::ParseUtils' => '0.3', + 'Pod::Perldoc' => '3.10', + 'Pod::Perldoc::BaseTo' => undef, + 'Pod::Perldoc::GetOptsOO'=> undef, + 'Pod::Perldoc::ToChecker'=> undef, + 'Pod::Perldoc::ToMan' => undef, + 'Pod::Perldoc::ToNroff' => undef, + 'Pod::Perldoc::ToPod' => undef, + 'Pod::Perldoc::ToRtf' => undef, + 'Pod::Perldoc::ToText' => undef, + 'Pod::Perldoc::ToTk' => undef, + 'Pod::Perldoc::ToXml' => undef, + 'Pod::PlainText' => '2.01', + 'Pod::Text' => '2.21', + 'Pod::Text::Color' => '1.04', + 'Pod::Text::Overstrike' => '1.1', + 'Pod::Text::Termcap' => '1.11', + 'Pod::Usage' => '1.16', + 'SDBM_File' => '1.04', + 'Safe' => '2.10', + 'Scalar::Util' => '1.13', + 'SelfLoader' => '1.0904', + 'Shell' => '0.5', + 'Socket' => '1.76', + 'Storable' => '2.08', + 'Switch' => '2.10', + 'Symbol' => '1.05', + 'Sys::Hostname' => '1.11', + 'Sys::Syslog' => '0.04', + 'Term::ANSIColor' => '1.07', + 'Term::Cap' => '1.08', + 'Term::Complete' => '1.401', + 'Term::ReadLine' => '1.01', + 'Test' => '1.24', + 'Test::Builder' => '0.17', + 'Test::Harness' => '2.30', + 'Test::Harness::Straps' => '0.15', + 'Test::More' => '0.47', + 'Test::Simple' => '0.47', + 'Text::Abbrev' => '1.01', + 'Text::Balanced' => '1.95', + 'Text::Wrap' => '2001.09291', + 'Thread::Semaphore' => '2.01', + 'Tie::Array' => '1.03', + 'Tie::File' => '0.97', + 'Tie::RefHash' => '1.31', + 'Time::HiRes' => '1.51', + 'Time::Local' => '1.07', + 'UNIVERSAL' => '1.01', + 'Unicode' => '4.0.0', + 'Unicode::Collate' => '0.28', + 'Unicode::Normalize' => '0.23', + 'Unicode::UCD' => '0.21', + 'VMS::Filespec' => '1.11', + 'XS::APItest' => '0.02', + 'XSLoader' => '0.02', + 'attributes' => '0.06', + 'base' => '2.03', + 'bigint' => '0.04', + 'bignum' => '0.14', + 'bigrat' => '0.06', + 'bytes' => '1.01', + 'charnames' => '1.02', + 'diagnostics' => '1.11', + 'encoding' => '1.47', + 'fields' => '2.03', + 'filetest' => '1.01', + 'if' => '0.03', + 'lib' => '0.5565', + 'open' => '1.02', + 'overload' => '1.01', + 're' => '0.04', + 'sort' => '1.02', + 'strict' => '1.03', + 'threads' => '1.00', + 'threads::shared' => '0.91', + 'utf8' => '1.02', + 'vmsish' => '1.01', + 'warnings' => '1.03', + }, + removed => { + } + }, + 5.008002 => { + delta_from => 5.008001, + changed => { + 'DB_File' => '1.807', + 'Devel::PPPort' => '2.009', + 'Digest::MD5' => '2.30', + 'I18N::LangTags' => '0.29', + 'I18N::LangTags::List' => '0.29', + 'MIME::Base64' => '2.21', + 'MIME::QuotedPrint' => '2.21', + 'Net::Domain' => '2.19', + 'Net::FTP' => '2.72', + 'Pod::Perldoc' => '3.11', + 'Time::HiRes' => '1.52', + 'Unicode::Collate' => '0.30', + 'Unicode::Normalize' => '0.25', + }, + removed => { + } + }, + 5.008003 => { + delta_from => 5.008002, + changed => { + 'Benchmark' => '1.052', + 'CGI' => '3.01', + 'CGI::Carp' => '1.27', + 'CGI::Fast' => '1.05', + 'CGI::Pretty' => '1.08', + 'CGI::Util' => '1.4', + 'Cwd' => '2.12', + 'DB_File' => '1.808', + 'Devel::PPPort' => '2.011', + 'Digest' => '1.05', + 'Digest::MD5' => '2.33', + 'Digest::base' => '1.00', + 'Encode' => '1.99', + 'Exporter' => '5.57', + 'File::CheckTree' => '4.3', + 'File::Copy' => '2.07', + 'File::Find' => '1.06', + 'File::Spec' => '0.87', + 'FindBin' => '1.44', + 'Getopt::Std' => '1.05', + 'Math::BigFloat' => '1.42', + 'Math::BigInt' => '1.68', + 'Math::BigInt::Calc' => '0.38', + 'Math::BigInt::CalcEmu' => '0.02', + 'OS2::DLL' => '1.02', + 'POSIX' => '1.07', + 'PerlIO' => '1.03', + 'PerlIO::via::QuotedPrint'=> '0.06', + 'Pod::Html' => '1.0502', + 'Pod::Parser' => '1.14', + 'Pod::Perldoc' => '3.12', + 'Pod::PlainText' => '2.02', + 'Storable' => '2.09', + 'Test::Harness' => '2.40', + 'Test::Harness::Assert' => '0.02', + 'Test::Harness::Iterator'=> '0.02', + 'Test::Harness::Straps' => '0.19', + 'Tie::Hash' => '1.01', + 'Unicode::Collate' => '0.33', + 'Unicode::Normalize' => '0.28', + 'XS::APItest' => '0.03', + 'base' => '2.04', + 'diagnostics' => '1.12', + 'encoding' => '1.48', + 'threads' => '1.01', + 'threads::shared' => '0.92', + }, + removed => { + 'Math::BigInt::Scalar' => 1, + } + }, + 5.008004 => { + delta_from => 5.008003, + changed => { + 'Attribute::Handlers' => '0.78_01', + 'B::Assembler' => '0.07', + 'B::Concise' => '0.60', + 'B::Deparse' => '0.66', + 'Benchmark' => '1.06', + 'CGI' => '3.04', + 'Carp' => '1.02', + 'Cwd' => '2.17', + 'DBM_Filter' => '0.01', + 'DBM_Filter::compress' => '0.01', + 'DBM_Filter::encode' => '0.01', + 'DBM_Filter::int32' => '0.01', + 'DBM_Filter::null' => '0.01', + 'DBM_Filter::utf8' => '0.01', + 'Digest' => '1.06', + 'DynaLoader' => '1.05', + 'Encode' => '1.99_01', + 'Encode::CN::HZ' => '1.0501', + 'Exporter' => '5.58', + 'Exporter::Heavy' => '5.57', + 'ExtUtils::Liblist::Kid'=> '1.3001', + 'ExtUtils::MM_NW5' => '2.07_02', + 'ExtUtils::MM_Win95' => '0.0301', + 'File::Find' => '1.07', + 'IO::Handle' => '1.24', + 'IO::Pipe' => '1.123', + 'IPC::Open3' => '1.0106', + 'Locale::Maketext' => '1.08', + 'MIME::Base64' => '3.01', + 'MIME::QuotedPrint' => '3.01', + 'Math::BigFloat' => '1.44', + 'Math::BigInt' => '1.70', + 'Math::BigInt::Calc' => '0.40', + 'Math::BigInt::CalcEmu' => '0.04', + 'Math::BigRat' => '0.12', + 'ODBM_File' => '1.05', + 'POSIX' => '1.08', + 'Shell' => '0.5.2', + 'Socket' => '1.77', + 'Storable' => '2.12', + 'Sys::Syslog' => '0.05', + 'Term::ANSIColor' => '1.08', + 'Time::HiRes' => '1.59', + 'Unicode' => '4.0.1', + 'Unicode::UCD' => '0.22', + 'Win32' => '0.23', + 'base' => '2.05', + 'bigint' => '0.05', + 'bignum' => '0.15', + 'charnames' => '1.03', + 'open' => '1.03', + 'threads' => '1.03', + 'utf8' => '1.03', + }, + removed => { + } + }, + 5.008005 => { + delta_from => 5.008004, + changed => { + 'B::Concise' => '0.61', + 'B::Deparse' => '0.67', + 'CGI' => '3.05', + 'CGI::Carp' => '1.28', + 'CGI::Util' => '1.5', + 'Carp' => '1.03', + 'Carp::Heavy' => '1.03', + 'Cwd' => '2.19', + 'DB_File' => '1.809', + 'Digest' => '1.08', + 'Encode' => '2.01', + 'Encode::Alias' => '2.00', + 'Encode::Byte' => '2.00', + 'Encode::CJKConstants' => '2.00', + 'Encode::CN' => '2.00', + 'Encode::CN::HZ' => '2.01', + 'Encode::Config' => '2.00', + 'Encode::EBCDIC' => '2.00', + 'Encode::Encoder' => '2.00', + 'Encode::Encoding' => '2.00', + 'Encode::Guess' => '2.00', + 'Encode::JP' => '2.00', + 'Encode::JP::H2Z' => '2.00', + 'Encode::JP::JIS7' => '2.00', + 'Encode::KR' => '2.00', + 'Encode::KR::2022_KR' => '2.00', + 'Encode::MIME::Header' => '2.00', + 'Encode::Symbol' => '2.00', + 'Encode::TW' => '2.00', + 'Encode::Unicode' => '2.00', + 'Encode::Unicode::UTF7' => '2.01', + 'File::Basename' => '2.73', + 'File::Copy' => '2.08', + 'File::Glob' => '1.03', + 'FileCache' => '1.04_01', + 'I18N::LangTags' => '0.33', + 'I18N::LangTags::Detect'=> '1.03', + 'List::Util' => '1.14', + 'Locale::Constants' => '2.07', + 'Locale::Country' => '2.07', + 'Locale::Currency' => '2.07', + 'Locale::Language' => '2.07', + 'Locale::Maketext' => '1.09', + 'Locale::Script' => '2.07', + 'Net::Cmd' => '2.26', + 'Net::FTP' => '2.75', + 'Net::NNTP' => '2.23', + 'Net::POP3' => '2.28', + 'Net::SMTP' => '2.29', + 'Net::Time' => '2.10', + 'Pod::Checker' => '1.42', + 'Pod::Find' => '0.2401', + 'Pod::LaTeX' => '0.56', + 'Pod::ParseUtils' => '1.2', + 'Pod::Perldoc' => '3.13', + 'Safe' => '2.11', + 'Scalar::Util' => '1.14', + 'Shell' => '0.6', + 'Storable' => '2.13', + 'Term::Cap' => '1.09', + 'Test' => '1.25', + 'Test::Harness' => '2.42', + 'Text::ParseWords' => '3.22', + 'Text::Wrap' => '2001.09292', + 'Time::Local' => '1.10', + 'Unicode::Collate' => '0.40', + 'Unicode::Normalize' => '0.30', + 'XS::APItest' => '0.04', + 'autouse' => '1.04', + 'base' => '2.06', + 'charnames' => '1.04', + 'diagnostics' => '1.13', + 'encoding' => '2.00', + 'threads' => '1.05', + 'utf8' => '1.04', + }, + removed => { + } + }, + 5.008006 => { + delta_from => 5.008005, + changed => { + 'B' => '1.07', + 'B::C' => '1.04', + 'B::Concise' => '0.64', + 'B::Debug' => '1.02', + 'B::Deparse' => '0.69', + 'B::Lint' => '1.03', + 'B::Showlex' => '1.02', + 'Cwd' => '3.01', + 'DB_File' => '1.810', + 'Data::Dumper' => '2.121_02', + 'Devel::PPPort' => '3.03', + 'Devel::Peek' => '1.02', + 'Encode' => '2.08', + 'Encode::Alias' => '2.02', + 'Encode::Encoding' => '2.02', + 'Encode::JP' => '2.01', + 'Encode::Unicode' => '2.02', + 'Exporter::Heavy' => '5.58', + 'ExtUtils::Constant' => '0.1401', + 'File::Spec' => '3.01', + 'File::Spec::Win32' => '1.5', + 'I18N::LangTags' => '0.35', + 'I18N::LangTags::List' => '0.35', + 'MIME::Base64' => '3.05', + 'MIME::QuotedPrint' => '3.03', + 'Math::BigFloat' => '1.47', + 'Math::BigInt' => '1.73', + 'Math::BigInt::Calc' => '0.43', + 'Math::BigRat' => '0.13', + 'Text::ParseWords' => '3.23', + 'Time::HiRes' => '1.65', + 'XS::APItest' => '0.05', + 'diagnostics' => '1.14', + 'encoding' => '2.01', + 'open' => '1.04', + 'overload' => '1.02', + }, + removed => { + } + }, + 5.008007 => { + delta_from => 5.008006, + changed => { + 'B' => '1.09', + 'B::Concise' => '0.65', + 'B::Deparse' => '0.7', + 'B::Disassembler' => '1.04', + 'B::Terse' => '1.03', + 'Benchmark' => '1.07', + 'CGI' => '3.10', + 'CGI::Carp' => '1.29', + 'CGI::Cookie' => '1.25', + 'Carp' => '1.04', + 'Carp::Heavy' => '1.04', + 'Class::ISA' => '0.33', + 'Cwd' => '3.05', + 'DB_File' => '1.811', + 'Data::Dumper' => '2.121_04', + 'Devel::DProf' => '20050310.00', + 'Devel::PPPort' => '3.06', + 'Digest' => '1.10', + 'Digest::file' => '0.01', + 'Encode' => '2.10', + 'Encode::Alias' => '2.03', + 'Errno' => '1.09_01', + 'ExtUtils::Constant' => '0.16', + 'ExtUtils::Constant::Base'=> '0.01', + 'ExtUtils::Constant::Utils'=> '0.01', + 'ExtUtils::Constant::XS'=> '0.01', + 'File::Find' => '1.09', + 'File::Glob' => '1.04', + 'File::Path' => '1.07', + 'File::Spec' => '3.05', + 'File::Temp' => '0.16', + 'FileCache' => '1.05', + 'IO::File' => '1.11', + 'IO::Socket::INET' => '1.28', + 'Math::BigFloat' => '1.51', + 'Math::BigInt' => '1.77', + 'Math::BigInt::Calc' => '0.47', + 'Math::BigInt::CalcEmu' => '0.05', + 'Math::BigRat' => '0.15', + 'Pod::Find' => '1.3', + 'Pod::Html' => '1.0503', + 'Pod::InputObjects' => '1.3', + 'Pod::LaTeX' => '0.58', + 'Pod::ParseUtils' => '1.3', + 'Pod::Parser' => '1.3', + 'Pod::Perldoc' => '3.14', + 'Pod::Select' => '1.3', + 'Pod::Usage' => '1.3', + 'SelectSaver' => '1.01', + 'Symbol' => '1.06', + 'Sys::Syslog' => '0.06', + 'Term::ANSIColor' => '1.09', + 'Term::Complete' => '1.402', + 'Test::Builder' => '0.22', + 'Test::Harness' => '2.48', + 'Test::Harness::Point' => '0.01', + 'Test::Harness::Straps' => '0.23', + 'Test::More' => '0.54', + 'Test::Simple' => '0.54', + 'Text::ParseWords' => '3.24', + 'Text::Wrap' => '2001.09293', + 'Tie::RefHash' => '1.32', + 'Time::HiRes' => '1.66', + 'Time::Local' => '1.11', + 'Unicode' => '4.1.0', + 'Unicode::Normalize' => '0.32', + 'Unicode::UCD' => '0.23', + 'Win32' => '0.24', + 'XS::APItest' => '0.06', + 'base' => '2.07', + 'bigint' => '0.07', + 'bignum' => '0.17', + 'bigrat' => '0.08', + 'bytes' => '1.02', + 'constant' => '1.05', + 'overload' => '1.03', + 'threads::shared' => '0.93', + 'utf8' => '1.05', + }, + removed => { + 'JNI' => 1, + 'JPL::AutoLoader' => 1, + 'JPL::Class' => 1, + 'JPL::Compile' => 1, + } + }, + 5.008008 => { + delta_from => 5.008007, + changed => { + 'Attribute::Handlers' => '0.78_02', + 'B' => '1.09_01', + 'B::Bblock' => '1.02_01', + 'B::Bytecode' => '1.01_01', + 'B::C' => '1.04_01', + 'B::CC' => '1.00_01', + 'B::Concise' => '0.66', + 'B::Debug' => '1.02_01', + 'B::Deparse' => '0.71', + 'B::Disassembler' => '1.05', + 'B::Terse' => '1.03_01', + 'ByteLoader' => '0.06', + 'CGI' => '3.15', + 'CGI::Cookie' => '1.26', + 'CPAN' => '1.76_02', + 'Cwd' => '3.12', + 'DB' => '1.01', + 'DB_File' => '1.814', + 'Data::Dumper' => '2.121_08', + 'Devel::DProf' => '20050603.00', + 'Devel::PPPort' => '3.06_01', + 'Devel::Peek' => '1.03', + 'Digest' => '1.14', + 'Digest::MD5' => '2.36', + 'Digest::file' => '1.00', + 'Dumpvalue' => '1.12', + 'Encode' => '2.12', + 'Encode::Alias' => '2.04', + 'Encode::Config' => '2.01', + 'Encode::MIME::Header' => '2.01', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.01', + 'English' => '1.02', + 'ExtUtils::Command' => '1.09', + 'ExtUtils::Command::MM' => '0.05', + 'ExtUtils::Constant' => '0.17', + 'ExtUtils::Embed' => '1.26', + 'ExtUtils::Install' => '1.33', + 'ExtUtils::Liblist::Kid'=> '1.3', + 'ExtUtils::MM' => '0.05', + 'ExtUtils::MM_AIX' => '0.03', + 'ExtUtils::MM_Any' => '0.13', + 'ExtUtils::MM_BeOS' => '1.05', + 'ExtUtils::MM_Cygwin' => '1.08', + 'ExtUtils::MM_MacOS' => '1.08', + 'ExtUtils::MM_NW5' => '2.08', + 'ExtUtils::MM_OS2' => '1.05', + 'ExtUtils::MM_QNX' => '0.02', + 'ExtUtils::MM_Unix' => '1.50', + 'ExtUtils::MM_VMS' => '5.73', + 'ExtUtils::MM_VOS' => '0.02', + 'ExtUtils::MM_Win32' => '1.12', + 'ExtUtils::MM_Win95' => '0.04', + 'ExtUtils::MakeMaker' => '6.30', + 'ExtUtils::MakeMaker::Config'=> '0.02', + 'ExtUtils::Manifest' => '1.46', + 'File::Basename' => '2.74', + 'File::Copy' => '2.09', + 'File::Find' => '1.10', + 'File::Glob' => '1.05', + 'File::Path' => '1.08', + 'File::Spec' => '3.12', + 'File::Spec::Win32' => '1.6', + 'FileCache' => '1.06', + 'Filter::Simple' => '0.82', + 'FindBin' => '1.47', + 'GDBM_File' => '1.08', + 'Getopt::Long' => '2.35', + 'IO' => '1.22', + 'IO::Dir' => '1.05', + 'IO::File' => '1.13', + 'IO::Handle' => '1.25', + 'IO::Pipe' => '1.13', + 'IO::Poll' => '0.07', + 'IO::Seekable' => '1.10', + 'IO::Select' => '1.17', + 'IO::Socket' => '1.29', + 'IO::Socket::INET' => '1.29', + 'IO::Socket::UNIX' => '1.22', + 'IPC::Open2' => '1.02', + 'IPC::Open3' => '1.02', + 'List::Util' => '1.18', + 'MIME::Base64' => '3.07', + 'MIME::QuotedPrint' => '3.07', + 'Math::Complex' => '1.35', + 'Math::Trig' => '1.03', + 'NDBM_File' => '1.06', + 'ODBM_File' => '1.06', + 'OS2::PrfDB' => '0.04', + 'OS2::Process' => '1.02', + 'OS2::REXX' => '1.03', + 'Opcode' => '1.06', + 'POSIX' => '1.09', + 'PerlIO' => '1.04', + 'PerlIO::encoding' => '0.09', + 'PerlIO::scalar' => '0.04', + 'PerlIO::via' => '0.03', + 'Pod::Checker' => '1.43', + 'Pod::Find' => '1.34', + 'Pod::Functions' => '1.03', + 'Pod::Html' => '1.0504', + 'Pod::ParseUtils' => '1.33', + 'Pod::Parser' => '1.32', + 'Pod::Usage' => '1.33', + 'SDBM_File' => '1.05', + 'Safe' => '2.12', + 'Scalar::Util' => '1.18', + 'Socket' => '1.78', + 'Storable' => '2.15', + 'Switch' => '2.10_01', + 'Sys::Syslog' => '0.13', + 'Term::ANSIColor' => '1.10', + 'Term::ReadLine' => '1.02', + 'Test::Builder' => '0.32', + 'Test::Builder::Module' => '0.02', + 'Test::Builder::Tester' => '1.02', + 'Test::Builder::Tester::Color'=> undef, + 'Test::Harness' => '2.56', + 'Test::Harness::Straps' => '0.26', + 'Test::More' => '0.62', + 'Test::Simple' => '0.62', + 'Text::Tabs' => '2005.0824', + 'Text::Wrap' => '2005.082401', + 'Tie::Hash' => '1.02', + 'Time::HiRes' => '1.86', + 'Unicode::Collate' => '0.52', + 'Unicode::UCD' => '0.24', + 'User::grent' => '1.01', + 'Win32' => '0.2601', + 'XS::APItest' => '0.08', + 'XS::Typemap' => '0.02', + 'XSLoader' => '0.06', + 'attrs' => '1.02', + 'autouse' => '1.05', + 'blib' => '1.03', + 'charnames' => '1.05', + 'diagnostics' => '1.15', + 'encoding' => '2.02', + 'if' => '0.05', + 'open' => '1.05', + 'ops' => '1.01', + 'overload' => '1.04', + 're' => '0.05', + 'threads' => '1.07', + 'threads::shared' => '0.94', + 'utf8' => '1.06', + 'vmsish' => '1.02', + 'warnings' => '1.05', + 'warnings::register' => '1.01', + }, + removed => { + } + }, + 5.008009 => { + delta_from => 5.008008, + changed => { + 'Attribute::Handlers' => '0.78_03', + 'AutoLoader' => '5.67', + 'AutoSplit' => '1.06', + 'B' => '1.19', + 'B::Asmdata' => '1.02', + 'B::Assembler' => '0.08', + 'B::C' => '1.05', + 'B::Concise' => '0.76', + 'B::Debug' => '1.05', + 'B::Deparse' => '0.87', + 'B::Lint' => '1.11', + 'B::Lint::Debug' => undef, + 'B::Terse' => '1.05', + 'Benchmark' => '1.1', + 'CGI' => '3.42', + 'CGI::Carp' => '1.30_01', + 'CGI::Cookie' => '1.29', + 'CGI::Fast' => '1.07', + 'CGI::Util' => '1.5_01', + 'CPAN' => '1.9301', + 'CPAN::Debug' => '5.5', + 'CPAN::DeferedCode' => '5.50', + 'CPAN::Distroprefs' => '6', + 'CPAN::FirstTime' => '5.5_01', + 'CPAN::HandleConfig' => '5.5', + 'CPAN::Kwalify' => '5.50', + 'CPAN::Nox' => '5.50', + 'CPAN::Queue' => '5.5', + 'CPAN::Tarzip' => '5.5', + 'CPAN::Version' => '5.5', + 'Carp' => '1.10', + 'Carp::Heavy' => '1.10', + 'Cwd' => '3.29', + 'DBM_Filter' => '0.02', + 'DBM_Filter::compress' => '0.02', + 'DBM_Filter::encode' => '0.02', + 'DBM_Filter::int32' => '0.02', + 'DBM_Filter::null' => '0.02', + 'DBM_Filter::utf8' => '0.02', + 'DB_File' => '1.817', + 'Data::Dumper' => '2.121_17', + 'Devel::DProf' => '20080331.00', + 'Devel::InnerPackage' => '0.3', + 'Devel::PPPort' => '3.14', + 'Devel::Peek' => '1.04', + 'Digest' => '1.15', + 'Digest::MD5' => '2.37', + 'DirHandle' => '1.02', + 'DynaLoader' => '1.09', + 'Encode' => '2.26', + 'Encode::Alias' => '2.10', + 'Encode::Byte' => '2.03', + 'Encode::CJKConstants' => '2.02', + 'Encode::CN' => '2.02', + 'Encode::CN::HZ' => '2.05', + 'Encode::Config' => '2.05', + 'Encode::EBCDIC' => '2.02', + 'Encode::Encoder' => '2.01', + 'Encode::Encoding' => '2.05', + 'Encode::GSM0338' => '2.01', + 'Encode::Guess' => '2.02', + 'Encode::JP' => '2.03', + 'Encode::JP::H2Z' => '2.02', + 'Encode::JP::JIS7' => '2.04', + 'Encode::KR' => '2.02', + 'Encode::KR::2022_KR' => '2.02', + 'Encode::MIME::Header' => '2.05', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.03', + 'Encode::MIME::Name' => '1.01', + 'Encode::Symbol' => '2.02', + 'Encode::TW' => '2.02', + 'Encode::Unicode' => '2.05', + 'Encode::Unicode::UTF7' => '2.04', + 'English' => '1.03', + 'Errno' => '1.10', + 'Exporter' => '5.63', + 'Exporter::Heavy' => '5.63', + 'ExtUtils::Command' => '1.15', + 'ExtUtils::Command::MM' => '6.48', + 'ExtUtils::Constant' => '0.21', + 'ExtUtils::Constant::Base'=> '0.04', + 'ExtUtils::Constant::ProxySubs'=> '0.06', + 'ExtUtils::Constant::Utils'=> '0.02', + 'ExtUtils::Constant::XS'=> '0.02', + 'ExtUtils::Embed' => '1.28', + 'ExtUtils::Install' => '1.50_01', + 'ExtUtils::Installed' => '1.43', + 'ExtUtils::Liblist' => '6.48', + 'ExtUtils::Liblist::Kid'=> '6.48', + 'ExtUtils::MM' => '6.48', + 'ExtUtils::MM_AIX' => '6.48', + 'ExtUtils::MM_Any' => '6.48', + 'ExtUtils::MM_BeOS' => '6.48', + 'ExtUtils::MM_Cygwin' => '6.48', + 'ExtUtils::MM_DOS' => '6.48', + 'ExtUtils::MM_Darwin' => '6.48', + 'ExtUtils::MM_MacOS' => '6.48', + 'ExtUtils::MM_NW5' => '6.48', + 'ExtUtils::MM_OS2' => '6.48', + 'ExtUtils::MM_QNX' => '6.48', + 'ExtUtils::MM_UWIN' => '6.48', + 'ExtUtils::MM_Unix' => '6.48', + 'ExtUtils::MM_VMS' => '6.48', + 'ExtUtils::MM_VOS' => '6.48', + 'ExtUtils::MM_Win32' => '6.48', + 'ExtUtils::MM_Win95' => '6.48', + 'ExtUtils::MY' => '6.48', + 'ExtUtils::MakeMaker' => '6.48', + 'ExtUtils::MakeMaker::Config'=> '6.48', + 'ExtUtils::MakeMaker::bytes'=> '6.48', + 'ExtUtils::MakeMaker::vmsish'=> '6.48', + 'ExtUtils::Manifest' => '1.55', + 'ExtUtils::Mkbootstrap' => '6.48', + 'ExtUtils::Mksymlists' => '6.48', + 'ExtUtils::Packlist' => '1.43', + 'ExtUtils::ParseXS' => '2.19', + 'ExtUtils::XSSymSet' => '1.1', + 'ExtUtils::testlib' => '6.48', + 'Fatal' => '1.06', + 'Fcntl' => '1.06', + 'File::Basename' => '2.77', + 'File::CheckTree' => '4.4', + 'File::Compare' => '1.1005', + 'File::Copy' => '2.13', + 'File::DosGlob' => '1.01', + 'File::Find' => '1.13', + 'File::Glob' => '1.06', + 'File::Path' => '2.07_02', + 'File::Spec' => '3.29', + 'File::Spec::Cygwin' => '3.29', + 'File::Spec::Epoc' => '3.29', + 'File::Spec::Functions' => '3.29', + 'File::Spec::Mac' => '3.29', + 'File::Spec::OS2' => '3.29', + 'File::Spec::Unix' => '3.29', + 'File::Spec::VMS' => '3.29', + 'File::Spec::Win32' => '3.29', + 'File::Temp' => '0.20', + 'File::stat' => '1.01', + 'FileCache' => '1.07', + 'Filter::Simple' => '0.83', + 'Filter::Util::Call' => '1.07', + 'FindBin' => '1.49', + 'GDBM_File' => '1.09', + 'Getopt::Long' => '2.37', + 'Getopt::Std' => '1.06', + 'Hash::Util' => '0.06', + 'IO' => '1.23', + 'IO::Dir' => '1.06', + 'IO::File' => '1.14', + 'IO::Handle' => '1.27', + 'IO::Socket' => '1.30', + 'IO::Socket::INET' => '1.31', + 'IO::Socket::UNIX' => '1.23', + 'IPC::Msg' => '2.00', + 'IPC::Open2' => '1.03', + 'IPC::Open3' => '1.03', + 'IPC::Semaphore' => '2.00', + 'IPC::SharedMem' => '2.00', + 'IPC::SysV' => '2.00', + 'List::Util' => '1.19', + 'Locale::Maketext' => '1.13', + 'Locale::Maketext::Guts'=> '1.13', + 'Locale::Maketext::GutsLoader'=> '1.13', + 'Math::BigFloat' => '1.60', + 'Math::BigInt' => '1.89', + 'Math::BigInt::Calc' => '0.52', + 'Math::BigRat' => '0.22', + 'Math::Complex' => '1.54', + 'Math::Trig' => '1.18', + 'Module::CoreList' => '2.17', + 'Module::Pluggable' => '3.8', + 'Module::Pluggable::Object'=> '3.6', + 'NDBM_File' => '1.07', + 'NEXT' => '0.61', + 'Net::Cmd' => '2.29', + 'Net::Config' => '1.11', + 'Net::Domain' => '2.20', + 'Net::FTP' => '2.77', + 'Net::FTP::A' => '1.18', + 'Net::NNTP' => '2.24', + 'Net::POP3' => '2.29', + 'Net::Ping' => '2.35', + 'Net::SMTP' => '2.31', + 'O' => '1.01', + 'ODBM_File' => '1.07', + 'OS2::DLL' => '1.03', + 'OS2::Process' => '1.03', + 'Opcode' => '1.0601', + 'POSIX' => '1.15', + 'PerlIO' => '1.05', + 'PerlIO::encoding' => '0.11', + 'PerlIO::scalar' => '0.06', + 'PerlIO::via' => '0.05', + 'Pod::Html' => '1.09', + 'Pod::ParseUtils' => '1.35', + 'Pod::Parser' => '1.35', + 'Pod::Select' => '1.35', + 'Pod::Usage' => '1.35', + 'SDBM_File' => '1.06', + 'Safe' => '2.16', + 'Scalar::Util' => '1.19', + 'SelfLoader' => '1.17', + 'Shell' => '0.72', + 'Socket' => '1.81', + 'Storable' => '2.19', + 'Switch' => '2.13', + 'Sys::Syslog' => '0.27', + 'Sys::Syslog::win32::Win32'=> undef, + 'Term::ANSIColor' => '1.12', + 'Term::Cap' => '1.12', + 'Term::ReadLine' => '1.03', + 'Test::Builder' => '0.80', + 'Test::Builder::Module' => '0.80', + 'Test::Builder::Tester' => '1.13', + 'Test::Harness' => '2.64', + 'Test::Harness::Results'=> '0.01_01', + 'Test::Harness::Straps' => '0.26_01', + 'Test::Harness::Util' => '0.01', + 'Test::More' => '0.80', + 'Test::Simple' => '0.80', + 'Text::Balanced' => '1.98', + 'Text::ParseWords' => '3.27', + 'Text::Soundex' => '3.03', + 'Text::Tabs' => '2007.1117', + 'Text::Wrap' => '2006.1117', + 'Thread' => '2.01', + 'Thread::Queue' => '2.11', + 'Thread::Semaphore' => '2.09', + 'Tie::Handle' => '4.2', + 'Tie::Hash' => '1.03', + 'Tie::Memoize' => '1.1', + 'Tie::RefHash' => '1.38', + 'Tie::Scalar' => '1.01', + 'Tie::StdHandle' => '4.2', + 'Time::HiRes' => '1.9715', + 'Time::Local' => '1.1901', + 'Time::gmtime' => '1.03', + 'Unicode' => '5.1.0', + 'Unicode::Normalize' => '1.02', + 'Unicode::UCD' => '0.25', + 'VMS::DCLsym' => '1.03', + 'VMS::Stdio' => '2.4', + 'Win32' => '0.38', + 'Win32API::File' => '0.1001_01', + 'Win32API::File::ExtUtils::Myconst2perl'=> '1', + 'Win32CORE' => '0.02', + 'XS::APItest' => '0.15', + 'XS::Typemap' => '0.03', + 'XSLoader' => '0.10', + 'attributes' => '0.09', + 'autouse' => '1.06', + 'base' => '2.13', + 'bigint' => '0.23', + 'bignum' => '0.23', + 'bigrat' => '0.23', + 'blib' => '1.04', + 'charnames' => '1.06', + 'constant' => '1.17', + 'diagnostics' => '1.16', + 'encoding' => '2.6_01', + 'fields' => '2.12', + 'filetest' => '1.02', + 'lib' => '0.61', + 'open' => '1.06', + 'ops' => '1.02', + 'overload' => '1.06', + 're' => '0.0601', + 'sigtrap' => '1.04', + 'threads' => '1.71', + 'threads::shared' => '1.27', + 'utf8' => '1.07', + 'warnings' => '1.05_01', + }, + removed => { + } + }, + 5.009 => { + delta_from => 5.008002, + changed => { + 'B' => '1.03', + 'B::C' => '1.03', + 'B::Concise' => '0.57', + 'B::Deparse' => '0.65', + 'DB_File' => '1.806', + 'Devel::PPPort' => '2.008', + 'English' => '1.02', + 'Fatal' => '1.04', + 'OS2::DLL' => '1.02', + 'Opcode' => '1.06', + 'Time::HiRes' => '1.51', + 'Unicode::Collate' => '0.28', + 'Unicode::Normalize' => '0.23', + 'XSLoader' => '0.03', + 'assertions' => '0.01', + 'assertions::activate' => '0.01', + 'overload' => '1.02', + 'version' => '0.29', + }, + removed => { + } + }, + 5.009001 => { + delta_from => 5.008004, + changed => { + 'B' => '1.05', + 'B::Assembler' => '0.06', + 'B::C' => '1.04', + 'B::Concise' => '0.59', + 'B::Debug' => '1.02', + 'B::Deparse' => '0.65', + 'DB_File' => '1.808_01', + 'Devel::PPPort' => '2.011_01', + 'Digest' => '1.05', + 'DynaLoader' => '1.04', + 'English' => '1.02', + 'Exporter::Heavy' => '5.567', + 'ExtUtils::Command' => '1.07', + 'ExtUtils::Liblist::Kid'=> '1.3', + 'ExtUtils::MM_Any' => '0.0901', + 'ExtUtils::MM_Cygwin' => '1.07', + 'ExtUtils::MM_NW5' => '2.07_01', + 'ExtUtils::MM_Unix' => '1.45_01', + 'ExtUtils::MM_VMS' => '5.71_01', + 'ExtUtils::MM_Win32' => '1.10_01', + 'ExtUtils::MM_Win95' => '0.03', + 'ExtUtils::MakeMaker' => '6.21_02', + 'ExtUtils::Manifest' => '1.43', + 'Fatal' => '1.04', + 'Getopt::Long' => '2.3401', + 'IO::Handle' => '1.23', + 'IO::Pipe' => '1.122', + 'IPC::Open3' => '1.0105', + 'MIME::Base64' => '3.00_01', + 'MIME::QuotedPrint' => '3.00', + 'Memoize' => '1.01_01', + 'ODBM_File' => '1.04', + 'Opcode' => '1.06', + 'POSIX' => '1.07', + 'Storable' => '2.11', + 'Time::HiRes' => '1.56', + 'Time::Local' => '1.07_94', + 'UNIVERSAL' => '1.02', + 'Unicode' => '4.0.0', + 'Unicode::UCD' => '0.21', + 'XSLoader' => '0.03', + 'assertions' => '0.01', + 'assertions::activate' => '0.01', + 'base' => '2.04', + 'if' => '0.0401', + 'open' => '1.02', + 'overload' => '1.02', + 'threads' => '1.02', + 'utf8' => '1.02', + 'version' => '0.36', + }, + removed => { + } + }, + 5.009002 => { + delta_from => 5.008007, + changed => { + 'B' => '1.07', + 'B::Concise' => '0.64', + 'B::Deparse' => '0.69', + 'B::Disassembler' => '1.03', + 'B::Terse' => '1.02', + 'CGI' => '3.07', + 'Config::Extensions' => '0.01', + 'Devel::DProf' => '20030813.00', + 'DynaLoader' => '1.07', + 'Encode' => '2.09', + 'Encode::Alias' => '2.02', + 'English' => '1.03', + 'Exporter' => '5.59', + 'Exporter::Heavy' => '5.59', + 'ExtUtils::Command' => '1.07', + 'ExtUtils::Command::MM' => '0.03_01', + 'ExtUtils::Embed' => '1.26', + 'ExtUtils::Liblist::Kid'=> '1.3', + 'ExtUtils::MM_Any' => '0.10', + 'ExtUtils::MM_Cygwin' => '1.07', + 'ExtUtils::MM_MacOS' => '1.08', + 'ExtUtils::MM_NW5' => '2.07', + 'ExtUtils::MM_Unix' => '1.46_01', + 'ExtUtils::MM_VMS' => '5.71', + 'ExtUtils::MM_Win32' => '1.10', + 'ExtUtils::MM_Win95' => '0.03', + 'ExtUtils::MakeMaker' => '6.25', + 'ExtUtils::Manifest' => '1.44', + 'Fatal' => '1.04', + 'File::Path' => '1.06', + 'FileCache' => '1.04_01', + 'Getopt::Long' => '2.3401', + 'IO::File' => '1.10', + 'IO::Socket::INET' => '1.27', + 'Math::BigFloat' => '1.49', + 'Math::BigInt' => '1.75', + 'Math::BigInt::Calc' => '0.45', + 'Math::BigRat' => '0.14', + 'Memoize' => '1.01_01', + 'Module::CoreList' => '1.99', + 'NEXT' => '0.60_01', + 'Opcode' => '1.06', + 'Pod::Html' => '1.0502', + 'Scalar::Util' => '1.14_1', + 'Storable' => '2.14', + 'Symbol' => '1.05', + 'Test::Harness' => '2.46', + 'Test::Harness::Straps' => '0.20_01', + 'Text::Balanced' => '1.95_01', + 'Text::Wrap' => '2001.09292', + 'UNIVERSAL' => '1.02', + 'Unicode' => '4.0.1', + 'Unicode::Normalize' => '0.30', + 'Unicode::UCD' => '0.22', + 'Win32' => '0.23', + 'XS::APItest' => '0.05', + 'XSLoader' => '0.03', + 'assertions' => '0.01', + 'assertions::activate' => '0.01', + 'base' => '2.06', + 'bigint' => '0.06', + 'bignum' => '0.16', + 'bigrat' => '0.07', + 'bytes' => '1.01', + 'encoding::warnings' => '0.05', + 'if' => '0.0401', + 're' => '0.05', + 'threads::shared' => '0.92', + 'utf8' => '1.04', + 'version' => '0.42', + 'warnings' => '1.04', + }, + removed => { + 'Test::Harness::Point' => 1, + } + }, + 5.009003 => { + delta_from => 5.008008, + changed => { + 'Archive::Tar' => '1.26_01', + 'Archive::Tar::Constant'=> '0.02', + 'Archive::Tar::File' => '0.02', + 'AutoSplit' => '1.04_01', + 'B' => '1.10', + 'B::Bblock' => '1.02', + 'B::Bytecode' => '1.01', + 'B::C' => '1.04', + 'B::CC' => '1.00', + 'B::Concise' => '0.67', + 'B::Debug' => '1.02', + 'B::Deparse' => '0.73', + 'B::Lint' => '1.04', + 'B::Terse' => '1.03', + 'CGI' => '3.15_01', + 'CPAN' => '1.83_58', + 'CPAN::Debug' => '4.44', + 'CPAN::FirstTime' => '4.50', + 'CPAN::HandleConfig' => '4.31', + 'CPAN::Nox' => '2.31', + 'CPAN::Tarzip' => '3.36', + 'CPAN::Version' => '2.55', + 'Carp' => '1.05', + 'Carp::Heavy' => '1.05', + 'Compress::Zlib' => '2.000_07', + 'Compress::Zlib::Common'=> '2.000_07', + 'Compress::Zlib::Compress::Gzip::Constants'=> '2.000_07', + 'Compress::Zlib::Compress::Zip::Constants'=> '1.00', + 'Compress::Zlib::CompressPlugin::Deflate'=> '2.000_05', + 'Compress::Zlib::CompressPlugin::Identity'=> '2.000_05', + 'Compress::Zlib::File::GlobMapper'=> '0.000_02', + 'Compress::Zlib::FileConstants'=> '2.000_07', + 'Compress::Zlib::IO::Compress::Base'=> '2.000_05', + 'Compress::Zlib::IO::Compress::Deflate'=> '2.000_07', + 'Compress::Zlib::IO::Compress::Gzip'=> '2.000_07', + 'Compress::Zlib::IO::Compress::RawDeflate'=> '2.000_07', + 'Compress::Zlib::IO::Compress::Zip'=> '2.000_04', + 'Compress::Zlib::IO::Uncompress::AnyInflate'=> '2.000_07', + 'Compress::Zlib::IO::Uncompress::AnyUncompress'=> '2.000_05', + 'Compress::Zlib::IO::Uncompress::Base'=> '2.000_05', + 'Compress::Zlib::IO::Uncompress::Gunzip'=> '2.000_07', + 'Compress::Zlib::IO::Uncompress::Inflate'=> '2.000_07', + 'Compress::Zlib::IO::Uncompress::RawInflate'=> '2.000_07', + 'Compress::Zlib::IO::Uncompress::Unzip'=> '2.000_05', + 'Compress::Zlib::ParseParameters'=> '2.000_07', + 'Compress::Zlib::UncompressPlugin::Identity'=> '2.000_05', + 'Compress::Zlib::UncompressPlugin::Inflate'=> '2.000_05', + 'Config::Extensions' => '0.01', + 'Cwd' => '3.15', + 'Devel::PPPort' => '3.08', + 'Digest::SHA' => '5.32', + 'DirHandle' => '1.01', + 'DynaLoader' => '1.07', + 'Encode' => '2.14', + 'Encode::CN::HZ' => '2.02', + 'Encode::MIME::Header' => '2.02', + 'English' => '1.04', + 'Exporter' => '5.59', + 'Exporter::Heavy' => '5.59', + 'ExtUtils::CBuilder' => '0.15', + 'ExtUtils::CBuilder::Base'=> '0.12', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.12', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.12', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.12', + 'ExtUtils::CBuilder::Platform::aix'=> '0.12', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.12', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.12', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.01', + 'ExtUtils::CBuilder::Platform::os2'=> '0.13', + 'ExtUtils::Command::MM' => '0.05_01', + 'ExtUtils::Constant' => '0.2', + 'ExtUtils::Constant::Base'=> '0.02', + 'ExtUtils::Constant::ProxySubs'=> '0.01', + 'ExtUtils::Constant::XS'=> '0.02', + 'ExtUtils::MM_Any' => '0.13_01', + 'ExtUtils::MM_Unix' => '1.50_01', + 'ExtUtils::MakeMaker' => '6.30_01', + 'ExtUtils::ParseXS' => '2.15_02', + 'Fatal' => '1.04', + 'File::Compare' => '1.1005', + 'File::Spec' => '3.15', + 'File::Temp' => '0.16_01', + 'IO::File' => '1.13_01', + 'IO::Handle' => '1.26', + 'IO::Socket' => '1.29_01', + 'IO::Socket::INET' => '1.29_02', + 'IO::Socket::UNIX' => '1.22_01', + 'IO::Zlib' => '1.04_02', + 'Locale::Maketext' => '1.10_01', + 'Math::BigInt::FastCalc'=> '0.10', + 'Memoize' => '1.01_01', + 'Module::CoreList' => '2.02', + 'Moped::Msg' => '0.01', + 'NEXT' => '0.60_01', + 'Net::Cmd' => '2.26_01', + 'Net::Domain' => '2.19_01', + 'Net::Ping' => '2.31_04', + 'Opcode' => '1.08', + 'POSIX' => '1.10', + 'Pod::Escapes' => '1.04', + 'Pod::Man' => '2.04', + 'Pod::Perldoc' => '3.14_01', + 'Pod::Simple' => '3.04', + 'Pod::Simple::BlackBox' => undef, + 'Pod::Simple::Checker' => '2.02', + 'Pod::Simple::Debug' => undef, + 'Pod::Simple::DumpAsText'=> '2.02', + 'Pod::Simple::DumpAsXML'=> '2.02', + 'Pod::Simple::HTML' => '3.03', + 'Pod::Simple::HTMLBatch'=> '3.02', + 'Pod::Simple::HTMLLegacy'=> '5.01', + 'Pod::Simple::LinkSection'=> undef, + 'Pod::Simple::Methody' => '2.02', + 'Pod::Simple::Progress' => '1.01', + 'Pod::Simple::PullParser'=> '2.02', + 'Pod::Simple::PullParserEndToken'=> undef, + 'Pod::Simple::PullParserStartToken'=> undef, + 'Pod::Simple::PullParserTextToken'=> undef, + 'Pod::Simple::PullParserToken'=> '2.02', + 'Pod::Simple::RTF' => '2.02', + 'Pod::Simple::Search' => '3.04', + 'Pod::Simple::SimpleTree'=> '2.02', + 'Pod::Simple::Text' => '2.02', + 'Pod::Simple::TextContent'=> '2.02', + 'Pod::Simple::TiedOutFH'=> undef, + 'Pod::Simple::Transcode'=> undef, + 'Pod::Simple::TranscodeDumb'=> '2.02', + 'Pod::Simple::TranscodeSmart'=> undef, + 'Pod::Simple::XMLOutStream'=> '2.02', + 'Pod::Text' => '3.01', + 'Pod::Text::Color' => '2.01', + 'Pod::Text::Overstrike' => '2', + 'Pod::Text::Termcap' => '2.01', + 'Pod::Usage' => '1.33_01', + 'SelfLoader' => '1.0905', + 'Storable' => '2.15_02', + 'Test::Builder::Module' => '0.03', + 'Text::Balanced' => '1.95_01', + 'Tie::File' => '0.97_01', + 'UNIVERSAL' => '1.03', + 'XS::APItest' => '0.09', + 'assertions' => '0.02', + 'assertions::activate' => '0.02', + 'assertions::compat' => undef, + 'constant' => '1.07', + 'encoding::warnings' => '0.05', + 'feature' => '1.00', + 're' => '0.06', + 'sort' => '2.00', + 'version' => '0.53', + }, + removed => { + } + }, + 5.009004 => { + delta_from => 5.009003, + changed => { + 'Archive::Tar' => '1.30_01', + 'AutoLoader' => '5.61', + 'B' => '1.11', + 'B::Bytecode' => '1.02', + 'B::C' => '1.05', + 'B::Concise' => '0.69', + 'B::Deparse' => '0.76', + 'B::Lint' => '1.08', + 'Benchmark' => '1.08', + 'CGI' => '3.20', + 'CGI::Cookie' => '1.27', + 'CGI::Fast' => '1.07', + 'CPAN' => '1.87_55', + 'CPAN::Debug' => '5.400561', + 'CPAN::FirstTime' => '5.400742', + 'CPAN::HandleConfig' => '5.400740', + 'CPAN::Nox' => '5.400561', + 'CPAN::Tarzip' => '5.400714', + 'CPAN::Version' => '5.400561', + 'Compress::Raw::Zlib' => '2.000_13', + 'Compress::Zlib' => '2.000_13', + 'Cwd' => '3.19', + 'Devel::PPPort' => '3.10', + 'Digest' => '1.15', + 'Digest::SHA' => '5.43', + 'Encode' => '2.18_01', + 'Encode::Alias' => '2.06', + 'Encode::Byte' => '2.02', + 'Encode::CJKConstants' => '2.02', + 'Encode::CN' => '2.02', + 'Encode::CN::HZ' => '2.04', + 'Encode::Config' => '2.03', + 'Encode::EBCDIC' => '2.02', + 'Encode::Encoder' => '2.01', + 'Encode::Encoding' => '2.04', + 'Encode::Guess' => '2.02', + 'Encode::JP' => '2.03', + 'Encode::JP::H2Z' => '2.02', + 'Encode::JP::JIS7' => '2.02', + 'Encode::KR' => '2.02', + 'Encode::KR::2022_KR' => '2.02', + 'Encode::MIME::Header' => '2.04', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.03', + 'Encode::Symbol' => '2.02', + 'Encode::TW' => '2.02', + 'Encode::Unicode' => '2.03', + 'Encode::Unicode::UTF7' => '2.04', + 'ExtUtils::CBuilder' => '0.18', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.12_01', + 'ExtUtils::Constant::Base'=> '0.03', + 'ExtUtils::Constant::ProxySubs'=> '0.03', + 'ExtUtils::Install' => '1.41', + 'ExtUtils::Installed' => '1.41', + 'ExtUtils::MM_Any' => '0.13_02', + 'ExtUtils::MM_NW5' => '2.08_01', + 'ExtUtils::MM_Unix' => '1.5003', + 'ExtUtils::MM_VMS' => '5.73_03', + 'ExtUtils::MM_Win32' => '1.12_02', + 'ExtUtils::MM_Win95' => '0.04_01', + 'ExtUtils::MakeMaker' => '6.30_02', + 'ExtUtils::Manifest' => '1.46_01', + 'ExtUtils::Mkbootstrap' => '1.15_01', + 'ExtUtils::Mksymlists' => '1.19_01', + 'ExtUtils::Packlist' => '1.41', + 'File::Basename' => '2.75', + 'File::Find' => '1.11', + 'File::GlobMapper' => '0.000_02', + 'File::Spec' => '3.19', + 'FileCache' => '1.07', + 'Getopt::Long' => '2.3501', + 'Hash::Util' => '0.07', + 'Hash::Util::FieldHash' => '0.01', + 'IO' => '1.23_01', + 'IO::Compress::Adapter::Deflate'=> '2.000_13', + 'IO::Compress::Adapter::Identity'=> '2.000_13', + 'IO::Compress::Base' => '2.000_13', + 'IO::Compress::Base::Common'=> '2.000_13', + 'IO::Compress::Deflate' => '2.000_13', + 'IO::Compress::Gzip' => '2.000_13', + 'IO::Compress::Gzip::Constants'=> '2.000_13', + 'IO::Compress::RawDeflate'=> '2.000_13', + 'IO::Compress::Zip' => '2.000_13', + 'IO::Compress::Zip::Constants'=> '2.000_13', + 'IO::Compress::Zlib::Constants'=> '2.000_13', + 'IO::Compress::Zlib::Extra'=> '2.000_13', + 'IO::Dir' => '1.06', + 'IO::File' => '1.14', + 'IO::Handle' => '1.27', + 'IO::Socket' => '1.30_01', + 'IO::Socket::INET' => '1.31', + 'IO::Socket::UNIX' => '1.23', + 'IO::Uncompress::Adapter::Identity'=> '2.000_13', + 'IO::Uncompress::Adapter::Inflate'=> '2.000_13', + 'IO::Uncompress::AnyInflate'=> '2.000_13', + 'IO::Uncompress::AnyUncompress'=> '2.000_13', + 'IO::Uncompress::Base' => '2.000_13', + 'IO::Uncompress::Gunzip'=> '2.000_13', + 'IO::Uncompress::Inflate'=> '2.000_13', + 'IO::Uncompress::RawInflate'=> '2.000_13', + 'IO::Uncompress::Unzip' => '2.000_13', + 'MIME::Base64' => '3.07_01', + 'Math::Complex' => '1.36', + 'Math::Trig' => '1.04', + 'Module::Build' => '0.2805', + 'Module::Build::Base' => undef, + 'Module::Build::Compat' => '0.03', + 'Module::Build::ConfigData'=> undef, + 'Module::Build::Cookbook'=> undef, + 'Module::Build::ModuleInfo'=> undef, + 'Module::Build::Notes' => undef, + 'Module::Build::PPMMaker'=> undef, + 'Module::Build::Platform::Amiga'=> undef, + 'Module::Build::Platform::Default'=> undef, + 'Module::Build::Platform::EBCDIC'=> undef, + 'Module::Build::Platform::MPEiX'=> undef, + 'Module::Build::Platform::MacOS'=> undef, + 'Module::Build::Platform::RiscOS'=> undef, + 'Module::Build::Platform::Unix'=> undef, + 'Module::Build::Platform::VMS'=> undef, + 'Module::Build::Platform::VOS'=> undef, + 'Module::Build::Platform::Windows'=> undef, + 'Module::Build::Platform::aix'=> undef, + 'Module::Build::Platform::cygwin'=> undef, + 'Module::Build::Platform::darwin'=> undef, + 'Module::Build::Platform::os2'=> undef, + 'Module::Build::PodParser'=> undef, + 'Module::Build::Version'=> '0', + 'Module::Build::YAML' => '0.50', + 'Module::CoreList' => '2.08', + 'Module::Load' => '0.10', + 'Module::Loaded' => '0.01', + 'Package::Constants' => '0.01', + 'Pod::Html' => '1.07', + 'Pod::Man' => '2.09', + 'Pod::Text' => '3.07', + 'Pod::Text::Color' => '2.03', + 'Pod::Text::Termcap' => '2.03', + 'SDBM_File' => '1.06', + 'Shell' => '0.7', + 'Sys::Syslog' => '0.17', + 'Term::ANSIColor' => '1.11', + 'Test::Builder' => '0.33', + 'Test::Builder::Tester' => '1.04', + 'Test::Harness' => '2.62', + 'Test::Harness::Util' => '0.01', + 'Test::More' => '0.64', + 'Test::Simple' => '0.64', + 'Text::Balanced' => '1.98_01', + 'Text::ParseWords' => '3.25', + 'Text::Tabs' => '2007.071101', + 'Text::Wrap' => '2006.0711', + 'Tie::RefHash' => '1.34_01', + 'Time::HiRes' => '1.87', + 'Time::Local' => '1.13', + 'Time::gmtime' => '1.03', + 'UNIVERSAL' => '1.04', + 'Unicode::Normalize' => '1.01', + 'Win32API::File' => '0.1001', + 'Win32API::File::ExtUtils::Myconst2perl'=> '1', + 'assertions' => '0.03', + 'assertions::compat' => '0.02', + 'autouse' => '1.06', + 'diagnostics' => '1.16', + 'encoding' => '2.04', + 'encoding::warnings' => '0.10', + 'feature' => '1.01', + 're' => '0.0601', + 'threads' => '1.38', + 'threads::shared' => '0.94_01', + 'version' => '0.67', + }, + removed => { + 'Compress::Zlib::Common'=> 1, + 'Compress::Zlib::Compress::Gzip::Constants'=> 1, + 'Compress::Zlib::Compress::Zip::Constants'=> 1, + 'Compress::Zlib::CompressPlugin::Deflate'=> 1, + 'Compress::Zlib::CompressPlugin::Identity'=> 1, + 'Compress::Zlib::File::GlobMapper'=> 1, + 'Compress::Zlib::FileConstants'=> 1, + 'Compress::Zlib::IO::Compress::Base'=> 1, + 'Compress::Zlib::IO::Compress::Deflate'=> 1, + 'Compress::Zlib::IO::Compress::Gzip'=> 1, + 'Compress::Zlib::IO::Compress::RawDeflate'=> 1, + 'Compress::Zlib::IO::Compress::Zip'=> 1, + 'Compress::Zlib::IO::Uncompress::AnyInflate'=> 1, + 'Compress::Zlib::IO::Uncompress::AnyUncompress'=> 1, + 'Compress::Zlib::IO::Uncompress::Base'=> 1, + 'Compress::Zlib::IO::Uncompress::Gunzip'=> 1, + 'Compress::Zlib::IO::Uncompress::Inflate'=> 1, + 'Compress::Zlib::IO::Uncompress::RawInflate'=> 1, + 'Compress::Zlib::IO::Uncompress::Unzip'=> 1, + 'Compress::Zlib::ParseParameters'=> 1, + 'Compress::Zlib::UncompressPlugin::Identity'=> 1, + 'Compress::Zlib::UncompressPlugin::Inflate'=> 1, + } + }, + 5.009005 => { + delta_from => 5.009004, + changed => { + 'Archive::Extract' => '0.22_01', + 'Archive::Tar' => '1.32', + 'Attribute::Handlers' => '0.78_06', + 'AutoLoader' => '5.63', + 'AutoSplit' => '1.05', + 'B' => '1.16', + 'B::Concise' => '0.72', + 'B::Debug' => '1.05', + 'B::Deparse' => '0.82', + 'B::Lint' => '1.09', + 'B::Terse' => '1.05', + 'Benchmark' => '1.1', + 'CGI' => '3.29', + 'CGI::Cookie' => '1.28', + 'CGI::Util' => '1.5_01', + 'CPAN' => '1.9102', + 'CPAN::Debug' => '5.400955', + 'CPAN::FirstTime' => '5.401669', + 'CPAN::HandleConfig' => '5.401744', + 'CPAN::Kwalify' => '5.401418', + 'CPAN::Nox' => '5.400844', + 'CPAN::Queue' => '5.401704', + 'CPAN::Tarzip' => '5.401717', + 'CPAN::Version' => '5.401387', + 'CPANPLUS' => '0.81_01', + 'CPANPLUS::Backend' => undef, + 'CPANPLUS::Backend::RV' => undef, + 'CPANPLUS::Config' => undef, + 'CPANPLUS::Configure' => undef, + 'CPANPLUS::Configure::Setup'=> undef, + 'CPANPLUS::Dist' => undef, + 'CPANPLUS::Dist::Base' => '0.01', + 'CPANPLUS::Dist::Build' => '0.06_01', + 'CPANPLUS::Dist::Build::Constants'=> '0.01', + 'CPANPLUS::Dist::MM' => undef, + 'CPANPLUS::Dist::Sample'=> undef, + 'CPANPLUS::Error' => undef, + 'CPANPLUS::Internals' => '0.81_01', + 'CPANPLUS::Internals::Constants'=> '0.01', + 'CPANPLUS::Internals::Constants::Report'=> '0.01', + 'CPANPLUS::Internals::Extract'=> undef, + 'CPANPLUS::Internals::Fetch'=> undef, + 'CPANPLUS::Internals::Report'=> undef, + 'CPANPLUS::Internals::Search'=> undef, + 'CPANPLUS::Internals::Source'=> undef, + 'CPANPLUS::Internals::Utils'=> undef, + 'CPANPLUS::Internals::Utils::Autoflush'=> undef, + 'CPANPLUS::Module' => undef, + 'CPANPLUS::Module::Author'=> undef, + 'CPANPLUS::Module::Author::Fake'=> undef, + 'CPANPLUS::Module::Checksums'=> undef, + 'CPANPLUS::Module::Fake'=> undef, + 'CPANPLUS::Module::Signature'=> undef, + 'CPANPLUS::Selfupdate' => undef, + 'CPANPLUS::Shell' => undef, + 'CPANPLUS::Shell::Classic'=> '0.0562', + 'CPANPLUS::Shell::Default'=> '0.81_01', + 'CPANPLUS::Shell::Default::Plugins::Remote'=> undef, + 'CPANPLUS::Shell::Default::Plugins::Source'=> undef, + 'CPANPLUS::inc' => undef, + 'Carp' => '1.07', + 'Carp::Heavy' => '1.07', + 'Compress::Raw::Zlib' => '2.005', + 'Compress::Zlib' => '2.005', + 'Cwd' => '3.25', + 'DBM_Filter' => '0.02', + 'DB_File' => '1.815', + 'Data::Dumper' => '2.121_13', + 'Devel::InnerPackage' => '0.3', + 'Devel::PPPort' => '3.11_01', + 'Digest::MD5' => '2.36_01', + 'Digest::SHA' => '5.44', + 'DynaLoader' => '1.08', + 'Encode' => '2.23', + 'Encode::Alias' => '2.07', + 'Encode::Byte' => '2.03', + 'Encode::Config' => '2.04', + 'Encode::Encoding' => '2.05', + 'Encode::GSM0338' => '2.00', + 'Encode::JP::JIS7' => '2.03', + 'Encode::MIME::Header' => '2.05', + 'Encode::MIME::Name' => '1.01', + 'Encode::Unicode' => '2.05', + 'Errno' => '1.10', + 'Exporter' => '5.60', + 'Exporter::Heavy' => '5.60', + 'ExtUtils::CBuilder' => '0.19', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.13', + 'ExtUtils::Command' => '1.13', + 'ExtUtils::Command::MM' => '0.07', + 'ExtUtils::Constant::Base'=> '0.04', + 'ExtUtils::Install' => '1.41_01', + 'ExtUtils::Liblist' => '1.03', + 'ExtUtils::Liblist::Kid'=> '1.33', + 'ExtUtils::MM' => '0.07', + 'ExtUtils::MM_AIX' => '0.05', + 'ExtUtils::MM_Any' => '0.15', + 'ExtUtils::MM_BeOS' => '1.07', + 'ExtUtils::MM_Cygwin' => '1.1', + 'ExtUtils::MM_DOS' => '0.04', + 'ExtUtils::MM_MacOS' => '1.1', + 'ExtUtils::MM_NW5' => '2.1', + 'ExtUtils::MM_OS2' => '1.07', + 'ExtUtils::MM_QNX' => '0.04', + 'ExtUtils::MM_UWIN' => '0.04', + 'ExtUtils::MM_Unix' => '1.54_01', + 'ExtUtils::MM_VMS' => '5.76', + 'ExtUtils::MM_VOS' => '0.04', + 'ExtUtils::MM_Win32' => '1.15', + 'ExtUtils::MM_Win95' => '0.06', + 'ExtUtils::MY' => '0.03', + 'ExtUtils::MakeMaker' => '6.36', + 'ExtUtils::MakeMaker::Config'=> '0.04', + 'ExtUtils::MakeMaker::bytes'=> '0.03', + 'ExtUtils::MakeMaker::vmsish'=> '0.03', + 'ExtUtils::Manifest' => '1.51_01', + 'ExtUtils::Mkbootstrap' => '1.17', + 'ExtUtils::Mksymlists' => '1.21', + 'ExtUtils::ParseXS' => '2.18', + 'ExtUtils::XSSymSet' => '1.1', + 'ExtUtils::testlib' => '1.17', + 'Fatal' => '1.05', + 'Fcntl' => '1.06', + 'File::Basename' => '2.76', + 'File::Copy' => '2.10', + 'File::Fetch' => '0.10', + 'File::Glob' => '1.06', + 'File::Path' => '2.01', + 'File::Spec' => '3.25', + 'File::Spec::Cygwin' => '1.1_01', + 'File::Spec::VMS' => '1.4_01', + 'File::Temp' => '0.18', + 'Filter::Util::Call' => '1.0602', + 'FindBin' => '1.49', + 'Getopt::Long' => '2.36', + 'Hash::Util::FieldHash' => '1.01', + 'IO::Compress::Adapter::Deflate'=> '2.005', + 'IO::Compress::Adapter::Identity'=> '2.005', + 'IO::Compress::Base' => '2.005', + 'IO::Compress::Base::Common'=> '2.005', + 'IO::Compress::Deflate' => '2.005', + 'IO::Compress::Gzip' => '2.005', + 'IO::Compress::Gzip::Constants'=> '2.005', + 'IO::Compress::RawDeflate'=> '2.005', + 'IO::Compress::Zip' => '2.005', + 'IO::Compress::Zip::Constants'=> '2.005', + 'IO::Compress::Zlib::Constants'=> '2.005', + 'IO::Compress::Zlib::Extra'=> '2.005', + 'IO::Uncompress::Adapter::Identity'=> '2.005', + 'IO::Uncompress::Adapter::Inflate'=> '2.005', + 'IO::Uncompress::AnyInflate'=> '2.005', + 'IO::Uncompress::AnyUncompress'=> '2.005', + 'IO::Uncompress::Base' => '2.005', + 'IO::Uncompress::Gunzip'=> '2.005', + 'IO::Uncompress::Inflate'=> '2.005', + 'IO::Uncompress::RawInflate'=> '2.005', + 'IO::Uncompress::Unzip' => '2.005', + 'IO::Zlib' => '1.05_01', + 'IPC::Cmd' => '0.36_01', + 'List::Util' => '1.19', + 'Locale::Maketext::Simple'=> '0.18', + 'Log::Message' => '0.01', + 'Log::Message::Config' => '0.01', + 'Log::Message::Handlers'=> undef, + 'Log::Message::Item' => undef, + 'Log::Message::Simple' => '0.0201', + 'Math::BigFloat' => '1.58', + 'Math::BigInt' => '1.87', + 'Math::BigInt::Calc' => '0.51', + 'Math::BigInt::FastCalc'=> '0.15_01', + 'Math::BigRat' => '0.19', + 'Math::Complex' => '1.37', + 'Memoize' => '1.01_02', + 'Module::Build' => '0.2808', + 'Module::Build::Config' => undef, + 'Module::Build::Version'=> '0.7203', + 'Module::CoreList' => '2.12', + 'Module::Load::Conditional'=> '0.16', + 'Module::Pluggable' => '3.6', + 'Module::Pluggable::Object'=> '3.6', + 'NDBM_File' => '1.07', + 'Net::Cmd' => '2.28', + 'Net::Config' => '1.11', + 'Net::Domain' => '2.20', + 'Net::FTP' => '2.77', + 'Net::FTP::A' => '1.18', + 'Net::NNTP' => '2.24', + 'Net::POP3' => '2.29', + 'Net::SMTP' => '2.31', + 'ODBM_File' => '1.07', + 'OS2::DLL' => '1.03', + 'Object::Accessor' => '0.32', + 'Opcode' => '1.09', + 'POSIX' => '1.13', + 'Params::Check' => '0.26', + 'PerlIO::encoding' => '0.10', + 'PerlIO::scalar' => '0.05', + 'PerlIO::via' => '0.04', + 'Pod::Html' => '1.08', + 'Pod::Man' => '2.12', + 'Pod::ParseUtils' => '1.35', + 'Pod::Parser' => '1.35', + 'Pod::Select' => '1.35', + 'Pod::Simple' => '3.05', + 'Pod::Text' => '3.08', + 'Pod::Usage' => '1.35', + 'Scalar::Util' => '1.19', + 'SelfLoader' => '1.11', + 'Shell' => '0.72_01', + 'Socket' => '1.79', + 'Storable' => '2.16', + 'Switch' => '2.13', + 'Sys::Syslog' => '0.18_01', + 'Term::ANSIColor' => '1.12', + 'Term::UI' => '0.14_01', + 'Term::UI::History' => undef, + 'Test::Builder' => '0.70', + 'Test::Builder::Module' => '0.68', + 'Test::Builder::Tester' => '1.07', + 'Test::Harness' => '2.64', + 'Test::Harness::Results'=> '0.01', + 'Test::More' => '0.70', + 'Test::Simple' => '0.70', + 'Text::Balanced' => '2.0.0', + 'Text::Soundex' => '3.02', + 'Text::Tabs' => '2007.1117', + 'Text::Wrap' => '2006.1117', + 'Thread' => '3.02', + 'Tie::File' => '0.97_02', + 'Tie::Hash::NamedCapture'=> '0.06', + 'Tie::Memoize' => '1.1', + 'Tie::RefHash' => '1.37', + 'Time::HiRes' => '1.9707', + 'Time::Local' => '1.17', + 'Time::Piece' => '1.11_02', + 'Time::Seconds' => undef, + 'Unicode' => '5.0.0', + 'Unicode::Normalize' => '1.02', + 'Unicode::UCD' => '0.25', + 'VMS::DCLsym' => '1.03', + 'Win32' => '0.30', + 'Win32API::File' => '0.1001_01', + 'Win32CORE' => '0.02', + 'XS::APItest' => '0.12', + 'XSLoader' => '0.08', + 'attributes' => '0.08', + 'base' => '2.12', + 'bigint' => '0.22', + 'bignum' => '0.22', + 'bigrat' => '0.22', + 'bytes' => '1.03', + 'charnames' => '1.06', + 'constant' => '1.10', + 'diagnostics' => '1.17', + 'encoding' => '2.06', + 'encoding::warnings' => '0.11', + 'feature' => '1.10', + 'fields' => '2.12', + 'less' => '0.02', + 'mro' => '1.00', + 'overload' => '1.06', + 're' => '0.08', + 'sigtrap' => '1.04', + 'sort' => '2.01', + 'strict' => '1.04', + 'threads' => '1.63', + 'threads::shared' => '1.12', + 'utf8' => '1.07', + 'version' => '0.7203', + 'warnings' => '1.06', + }, + removed => { + 'B::Asmdata' => 1, + 'B::Assembler' => 1, + 'B::Bblock' => 1, + 'B::Bytecode' => 1, + 'B::C' => 1, + 'B::CC' => 1, + 'B::Disassembler' => 1, + 'B::Stackobj' => 1, + 'B::Stash' => 1, + 'ByteLoader' => 1, + 'Thread::Signal' => 1, + 'Thread::Specific' => 1, + 'assertions' => 1, + 'assertions::activate' => 1, + 'assertions::compat' => 1, + } + }, + 5.01 => { + delta_from => 5.009005, + changed => { + 'Archive::Extract' => '0.24', + 'Archive::Tar' => '1.38', + 'Attribute::Handlers' => '0.79', + 'B' => '1.17', + 'B::Concise' => '0.74', + 'B::Deparse' => '0.83', + 'CPAN' => '1.9205', + 'CPAN::API::HOWTO' => undef, + 'CPAN::Debug' => '5.402212', + 'CPAN::DeferedCode' => '5.50', + 'CPAN::FirstTime' => '5.402229', + 'CPAN::HandleConfig' => '5.402212', + 'CPAN::Nox' => '5.402411', + 'CPAN::Queue' => '5.402212', + 'CPAN::Tarzip' => '5.402213', + 'CPAN::Version' => '5.5', + 'CPANPLUS' => '0.84', + 'CPANPLUS::Dist::Build' => '0.06_02', + 'CPANPLUS::Internals' => '0.84', + 'CPANPLUS::Shell::Default'=> '0.84', + 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> undef, + 'Carp' => '1.08', + 'Carp::Heavy' => '1.08', + 'Compress::Raw::Zlib' => '2.008', + 'Compress::Zlib' => '2.008', + 'Cwd' => '3.2501', + 'DB_File' => '1.816_1', + 'Data::Dumper' => '2.121_14', + 'Devel::PPPort' => '3.13', + 'Digest::SHA' => '5.45', + 'Exporter' => '5.62', + 'Exporter::Heavy' => '5.62', + 'ExtUtils::CBuilder' => '0.21', + 'ExtUtils::CBuilder::Base'=> '0.21', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.21', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.22', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.21', + 'ExtUtils::CBuilder::Platform::aix'=> '0.21', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.21', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.21', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.21', + 'ExtUtils::CBuilder::Platform::os2'=> '0.21', + 'ExtUtils::Command::MM' => '6.42', + 'ExtUtils::Constant::ProxySubs'=> '0.05', + 'ExtUtils::Embed' => '1.27', + 'ExtUtils::Install' => '1.44', + 'ExtUtils::Installed' => '1.43', + 'ExtUtils::Liblist' => '6.42', + 'ExtUtils::Liblist::Kid'=> '6.42', + 'ExtUtils::MM' => '6.42', + 'ExtUtils::MM_AIX' => '6.42', + 'ExtUtils::MM_Any' => '6.42', + 'ExtUtils::MM_BeOS' => '6.42', + 'ExtUtils::MM_Cygwin' => '6.42', + 'ExtUtils::MM_DOS' => '6.42', + 'ExtUtils::MM_MacOS' => '6.42', + 'ExtUtils::MM_NW5' => '6.42', + 'ExtUtils::MM_OS2' => '6.42', + 'ExtUtils::MM_QNX' => '6.42', + 'ExtUtils::MM_UWIN' => '6.42', + 'ExtUtils::MM_Unix' => '6.42', + 'ExtUtils::MM_VMS' => '6.42', + 'ExtUtils::MM_VOS' => '6.42', + 'ExtUtils::MM_Win32' => '6.42', + 'ExtUtils::MM_Win95' => '6.42', + 'ExtUtils::MY' => '6.42', + 'ExtUtils::MakeMaker' => '6.42', + 'ExtUtils::MakeMaker::Config'=> '6.42', + 'ExtUtils::MakeMaker::bytes'=> '6.42', + 'ExtUtils::MakeMaker::vmsish'=> '6.42', + 'ExtUtils::Mkbootstrap' => '6.42', + 'ExtUtils::Mksymlists' => '6.42', + 'ExtUtils::Packlist' => '1.43', + 'ExtUtils::ParseXS' => '2.18_02', + 'ExtUtils::testlib' => '6.42', + 'File::Copy' => '2.11', + 'File::Fetch' => '0.14', + 'File::Find' => '1.12', + 'File::Path' => '2.04', + 'File::Spec' => '3.2501', + 'File::Spec::Cygwin' => '3.2501', + 'File::Spec::Epoc' => '3.2501', + 'File::Spec::Functions' => '3.2501', + 'File::Spec::Mac' => '3.2501', + 'File::Spec::OS2' => '3.2501', + 'File::Spec::Unix' => '3.2501', + 'File::Spec::VMS' => '3.2501', + 'File::Spec::Win32' => '3.2501', + 'Filter::Util::Call' => '1.07', + 'Getopt::Long' => '2.37', + 'Hash::Util::FieldHash' => '1.03', + 'IO::Compress::Adapter::Deflate'=> '2.008', + 'IO::Compress::Adapter::Identity'=> '2.008', + 'IO::Compress::Base' => '2.008', + 'IO::Compress::Base::Common'=> '2.008', + 'IO::Compress::Deflate' => '2.008', + 'IO::Compress::Gzip' => '2.008', + 'IO::Compress::Gzip::Constants'=> '2.008', + 'IO::Compress::RawDeflate'=> '2.008', + 'IO::Compress::Zip' => '2.008', + 'IO::Compress::Zip::Constants'=> '2.008', + 'IO::Compress::Zlib::Constants'=> '2.008', + 'IO::Compress::Zlib::Extra'=> '2.008', + 'IO::Uncompress::Adapter::Identity'=> '2.008', + 'IO::Uncompress::Adapter::Inflate'=> '2.008', + 'IO::Uncompress::AnyInflate'=> '2.008', + 'IO::Uncompress::AnyUncompress'=> '2.008', + 'IO::Uncompress::Base' => '2.008', + 'IO::Uncompress::Gunzip'=> '2.008', + 'IO::Uncompress::Inflate'=> '2.008', + 'IO::Uncompress::RawInflate'=> '2.008', + 'IO::Uncompress::Unzip' => '2.008', + 'IO::Zlib' => '1.07', + 'IPC::Cmd' => '0.40_1', + 'IPC::SysV' => '1.05', + 'Locale::Maketext' => '1.12', + 'Log::Message::Simple' => '0.04', + 'Math::BigFloat' => '1.59', + 'Math::BigInt' => '1.88', + 'Math::BigInt::Calc' => '0.52', + 'Math::BigInt::FastCalc'=> '0.16', + 'Math::BigRat' => '0.21', + 'Module::Build' => '0.2808_01', + 'Module::Build::Base' => '0.2808_01', + 'Module::Build::Compat' => '0.2808_01', + 'Module::Build::Config' => '0.2808_01', + 'Module::Build::Dumper' => undef, + 'Module::Build::ModuleInfo'=> '0.2808_01', + 'Module::Build::Notes' => '0.2808_01', + 'Module::Build::PPMMaker'=> '0.2808_01', + 'Module::Build::Platform::Amiga'=> '0.2808_01', + 'Module::Build::Platform::Default'=> '0.2808_01', + 'Module::Build::Platform::EBCDIC'=> '0.2808_01', + 'Module::Build::Platform::MPEiX'=> '0.2808_01', + 'Module::Build::Platform::MacOS'=> '0.2808_01', + 'Module::Build::Platform::RiscOS'=> '0.2808_01', + 'Module::Build::Platform::Unix'=> '0.2808_01', + 'Module::Build::Platform::VMS'=> '0.2808_01', + 'Module::Build::Platform::VOS'=> '0.2808_01', + 'Module::Build::Platform::Windows'=> '0.2808_01', + 'Module::Build::Platform::aix'=> '0.2808_01', + 'Module::Build::Platform::cygwin'=> '0.2808_01', + 'Module::Build::Platform::darwin'=> '0.2808_01', + 'Module::Build::Platform::os2'=> '0.2808_01', + 'Module::Build::PodParser'=> '0.2808_01', + 'Module::CoreList' => '2.13', + 'Module::Load' => '0.12', + 'Module::Load::Conditional'=> '0.22', + 'Net::Cmd' => '2.29', + 'Net::Ping' => '2.33', + 'Opcode' => '1.11', + 'Pod::Checker' => '1.43_01', + 'Pod::Man' => '2.16', + 'Pod::Perldoc' => '3.14_02', + 'Socket' => '1.80', + 'Storable' => '2.18', + 'Sys::Syslog' => '0.22', + 'Sys::Syslog::win32::Win32'=> undef, + 'Term::Cap' => '1.12', + 'Term::ReadLine' => '1.03', + 'Term::UI' => '0.18', + 'Test::Builder' => '0.72', + 'Test::Builder::Module' => '0.72', + 'Test::Builder::Tester' => '1.09', + 'Test::Harness::Straps' => '0.26_01', + 'Test::More' => '0.72', + 'Test::Simple' => '0.72', + 'Text::ParseWords' => '3.26', + 'Text::Soundex' => '3.03', + 'Tie::StdHandle' => undef, + 'Time::HiRes' => '1.9711', + 'Time::Local' => '1.18', + 'Time::Piece' => '1.12', + 'VMS::Filespec' => '1.12', + 'Win32' => '0.34', + 'base' => '2.13', + 'constant' => '1.13', + 'feature' => '1.11', + 'fields' => '2.13', + 'filetest' => '1.02', + 'open' => '1.06', + 'threads' => '1.67', + 'threads::shared' => '1.14', + 'version' => '0.74', + }, + removed => { + } + }, + 5.010001 => { + delta_from => 5.01, + changed => { + 'App::Prove' => '3.17', + 'App::Prove::State' => '3.17', + 'App::Prove::State::Result'=> '3.17', + 'App::Prove::State::Result::Test'=> '3.17', + 'Archive::Extract' => '0.34', + 'Archive::Tar' => '1.52', + 'Attribute::Handlers' => '0.85', + 'AutoLoader' => '5.68', + 'AutoSplit' => '1.06', + 'B' => '1.22', + 'B::Concise' => '0.76', + 'B::Debug' => '1.11', + 'B::Deparse' => '0.89', + 'B::Lint' => '1.11', + 'B::Lint::Debug' => undef, + 'B::Xref' => '1.02', + 'Benchmark' => '1.11', + 'CGI' => '3.43', + 'CGI::Carp' => '1.30_01', + 'CGI::Cookie' => '1.29', + 'CPAN' => '1.9402', + 'CPAN::Author' => '5.5', + 'CPAN::Bundle' => '5.5', + 'CPAN::CacheMgr' => '5.5', + 'CPAN::Complete' => '5.5', + 'CPAN::Debug' => '5.5', + 'CPAN::DeferredCode' => '5.50', + 'CPAN::Distribution' => '1.93', + 'CPAN::Distroprefs' => '6', + 'CPAN::Distrostatus' => '5.5', + 'CPAN::Exception::RecursiveDependency'=> '5.5', + 'CPAN::Exception::blocked_urllist'=> '1.0', + 'CPAN::Exception::yaml_not_installed'=> '5.5', + 'CPAN::FTP' => '5.5001', + 'CPAN::FTP::netrc' => '1.00', + 'CPAN::FirstTime' => '5.53', + 'CPAN::HandleConfig' => '5.5', + 'CPAN::Index' => '1.93', + 'CPAN::InfoObj' => '5.5', + 'CPAN::Kwalify' => '5.50', + 'CPAN::LWP::UserAgent' => '1.00', + 'CPAN::Module' => '5.5', + 'CPAN::Nox' => '5.50', + 'CPAN::Prompt' => '5.5', + 'CPAN::Queue' => '5.5', + 'CPAN::Shell' => '5.5', + 'CPAN::Tarzip' => '5.501', + 'CPAN::URL' => '5.5', + 'CPANPLUS' => '0.88', + 'CPANPLUS::Dist::Autobundle'=> undef, + 'CPANPLUS::Dist::Base' => undef, + 'CPANPLUS::Dist::Build' => '0.36', + 'CPANPLUS::Dist::Build::Constants'=> '0.36', + 'CPANPLUS::Internals' => '0.88', + 'CPANPLUS::Internals::Constants'=> undef, + 'CPANPLUS::Internals::Constants::Report'=> undef, + 'CPANPLUS::Internals::Source::Memory'=> undef, + 'CPANPLUS::Internals::Source::SQLite'=> undef, + 'CPANPLUS::Internals::Source::SQLite::Tie'=> undef, + 'CPANPLUS::Shell::Default'=> '0.88', + 'Carp' => '1.11', + 'Carp::Heavy' => '1.11', + 'Compress::Raw::Bzip2' => '2.020', + 'Compress::Raw::Zlib' => '2.020', + 'Compress::Zlib' => '2.020', + 'Cwd' => '3.30', + 'DB' => '1.02', + 'DBM_Filter::compress' => '0.02', + 'DBM_Filter::encode' => '0.02', + 'DBM_Filter::int32' => '0.02', + 'DBM_Filter::null' => '0.02', + 'DBM_Filter::utf8' => '0.02', + 'DB_File' => '1.820', + 'Data::Dumper' => '2.124', + 'Devel::DProf' => '20080331.00', + 'Devel::PPPort' => '3.19', + 'Devel::Peek' => '1.04', + 'Digest' => '1.16', + 'Digest::MD5' => '2.39', + 'Digest::SHA' => '5.47', + 'Digest::base' => '1.16', + 'Digest::file' => '1.16', + 'DirHandle' => '1.03', + 'Dumpvalue' => '1.13', + 'DynaLoader' => '1.10', + 'Encode' => '2.35', + 'Encode::Alias' => '2.12', + 'Encode::CN::HZ' => '2.05', + 'Encode::Config' => '2.05', + 'Encode::GSM0338' => '2.01', + 'Encode::Guess' => '2.03', + 'Encode::JP::JIS7' => '2.04', + 'Encode::MIME::Header' => '2.11', + 'Encode::Unicode' => '2.06', + 'Errno' => '1.11', + 'Exporter' => '5.63', + 'Exporter::Heavy' => '5.63', + 'ExtUtils::CBuilder' => '0.2602', + 'ExtUtils::CBuilder::Base'=> '0.2602', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.2602', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.2602', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.2602', + 'ExtUtils::CBuilder::Platform::aix'=> '0.2602', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2602', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.2602', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2602', + 'ExtUtils::CBuilder::Platform::os2'=> '0.2602', + 'ExtUtils::Command' => '1.16', + 'ExtUtils::Command::MM' => '6.55_02', + 'ExtUtils::Constant' => '0.22', + 'ExtUtils::Constant::ProxySubs'=> '0.06', + 'ExtUtils::Constant::Utils'=> '0.02', + 'ExtUtils::Constant::XS'=> '0.03', + 'ExtUtils::Embed' => '1.28', + 'ExtUtils::Install' => '1.54', + 'ExtUtils::Installed' => '1.999_001', + 'ExtUtils::Liblist' => '6.55_02', + 'ExtUtils::Liblist::Kid'=> '6.5502', + 'ExtUtils::MM' => '6.55_02', + 'ExtUtils::MM_AIX' => '6.55_02', + 'ExtUtils::MM_Any' => '6.55_02', + 'ExtUtils::MM_BeOS' => '6.55_02', + 'ExtUtils::MM_Cygwin' => '6.55_02', + 'ExtUtils::MM_DOS' => '6.5502', + 'ExtUtils::MM_Darwin' => '6.55_02', + 'ExtUtils::MM_MacOS' => '6.5502', + 'ExtUtils::MM_NW5' => '6.55_02', + 'ExtUtils::MM_OS2' => '6.55_02', + 'ExtUtils::MM_QNX' => '6.55_02', + 'ExtUtils::MM_UWIN' => '6.5502', + 'ExtUtils::MM_Unix' => '6.55_02', + 'ExtUtils::MM_VMS' => '6.55_02', + 'ExtUtils::MM_VOS' => '6.55_02', + 'ExtUtils::MM_Win32' => '6.55_02', + 'ExtUtils::MM_Win95' => '6.55_02', + 'ExtUtils::MY' => '6.5502', + 'ExtUtils::MakeMaker' => '6.55_02', + 'ExtUtils::MakeMaker::Config'=> '6.55_02', + 'ExtUtils::Manifest' => '1.56', + 'ExtUtils::Mkbootstrap' => '6.55_02', + 'ExtUtils::Mksymlists' => '6.55_02', + 'ExtUtils::ParseXS' => '2.2002', + 'ExtUtils::testlib' => '6.5502', + 'Fatal' => '2.06_01', + 'File::Basename' => '2.77', + 'File::CheckTree' => '4.4', + 'File::Compare' => '1.1006', + 'File::Copy' => '2.14', + 'File::DosGlob' => '1.01', + 'File::Fetch' => '0.20', + 'File::Find' => '1.14', + 'File::GlobMapper' => '1.000', + 'File::Path' => '2.07_03', + 'File::Spec' => '3.30', + 'File::Spec::Cygwin' => '3.30', + 'File::Spec::Epoc' => '3.30', + 'File::Spec::Functions' => '3.30', + 'File::Spec::Mac' => '3.30', + 'File::Spec::OS2' => '3.30', + 'File::Spec::Unix' => '3.30', + 'File::Spec::VMS' => '3.30', + 'File::Spec::Win32' => '3.30', + 'File::Temp' => '0.22', + 'File::stat' => '1.01', + 'FileCache' => '1.08', + 'FileHandle' => '2.02', + 'Filter::Simple' => '0.84', + 'Filter::Util::Call' => '1.08', + 'FindBin' => '1.50', + 'GDBM_File' => '1.09', + 'Getopt::Long' => '2.38', + 'Getopt::Std' => '1.06', + 'Hash::Util::FieldHash' => '1.04', + 'I18N::Collate' => '1.01', + 'IO' => '1.25', + 'IO::Compress::Adapter::Bzip2'=> '2.020', + 'IO::Compress::Adapter::Deflate'=> '2.020', + 'IO::Compress::Adapter::Identity'=> '2.020', + 'IO::Compress::Base' => '2.020', + 'IO::Compress::Base::Common'=> '2.020', + 'IO::Compress::Bzip2' => '2.020', + 'IO::Compress::Deflate' => '2.020', + 'IO::Compress::Gzip' => '2.020', + 'IO::Compress::Gzip::Constants'=> '2.020', + 'IO::Compress::RawDeflate'=> '2.020', + 'IO::Compress::Zip' => '2.020', + 'IO::Compress::Zip::Constants'=> '2.020', + 'IO::Compress::Zlib::Constants'=> '2.020', + 'IO::Compress::Zlib::Extra'=> '2.020', + 'IO::Dir' => '1.07', + 'IO::Handle' => '1.28', + 'IO::Socket' => '1.31', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.020', + 'IO::Uncompress::Adapter::Identity'=> '2.020', + 'IO::Uncompress::Adapter::Inflate'=> '2.020', + 'IO::Uncompress::AnyInflate'=> '2.020', + 'IO::Uncompress::AnyUncompress'=> '2.020', + 'IO::Uncompress::Base' => '2.020', + 'IO::Uncompress::Bunzip2'=> '2.020', + 'IO::Uncompress::Gunzip'=> '2.020', + 'IO::Uncompress::Inflate'=> '2.020', + 'IO::Uncompress::RawInflate'=> '2.020', + 'IO::Uncompress::Unzip' => '2.020', + 'IO::Zlib' => '1.09', + 'IPC::Cmd' => '0.46', + 'IPC::Msg' => '2.01', + 'IPC::Open2' => '1.03', + 'IPC::Open3' => '1.04', + 'IPC::Semaphore' => '2.01', + 'IPC::SharedMem' => '2.01', + 'IPC::SysV' => '2.01', + 'List::Util' => '1.21', + 'List::Util::PP' => '1.21', + 'List::Util::XS' => '1.21', + 'Locale::Maketext' => '1.13', + 'Locale::Maketext::Guts'=> '1.13', + 'Locale::Maketext::GutsLoader'=> '1.13', + 'Log::Message' => '0.02', + 'MIME::Base64' => '3.08', + 'MIME::QuotedPrint' => '3.08', + 'Math::BigFloat' => '1.60', + 'Math::BigInt' => '1.89', + 'Math::BigInt::FastCalc'=> '0.19', + 'Math::BigRat' => '0.22', + 'Math::Complex' => '1.56', + 'Math::Trig' => '1.2', + 'Memoize' => '1.01_03', + 'Module::Build' => '0.340201', + 'Module::Build::Base' => '0.340201', + 'Module::Build::Compat' => '0.340201', + 'Module::Build::Config' => '0.340201', + 'Module::Build::Cookbook'=> '0.340201', + 'Module::Build::Dumper' => '0.340201', + 'Module::Build::ModuleInfo'=> '0.340201', + 'Module::Build::Notes' => '0.340201', + 'Module::Build::PPMMaker'=> '0.340201', + 'Module::Build::Platform::Amiga'=> '0.340201', + 'Module::Build::Platform::Default'=> '0.340201', + 'Module::Build::Platform::EBCDIC'=> '0.340201', + 'Module::Build::Platform::MPEiX'=> '0.340201', + 'Module::Build::Platform::MacOS'=> '0.340201', + 'Module::Build::Platform::RiscOS'=> '0.340201', + 'Module::Build::Platform::Unix'=> '0.340201', + 'Module::Build::Platform::VMS'=> '0.340201', + 'Module::Build::Platform::VOS'=> '0.340201', + 'Module::Build::Platform::Windows'=> '0.340201', + 'Module::Build::Platform::aix'=> '0.340201', + 'Module::Build::Platform::cygwin'=> '0.340201', + 'Module::Build::Platform::darwin'=> '0.340201', + 'Module::Build::Platform::os2'=> '0.340201', + 'Module::Build::PodParser'=> '0.340201', + 'Module::Build::Version'=> '0.77', + 'Module::CoreList' => '2.18', + 'Module::Load' => '0.16', + 'Module::Load::Conditional'=> '0.30', + 'Module::Loaded' => '0.02', + 'Module::Pluggable' => '3.9', + 'Module::Pluggable::Object'=> '3.9', + 'NDBM_File' => '1.08', + 'NEXT' => '0.64', + 'Net::Ping' => '2.36', + 'O' => '1.01', + 'OS2::Process' => '1.03', + 'OS2::REXX' => '1.04', + 'Object::Accessor' => '0.34', + 'POSIX' => '1.17', + 'Package::Constants' => '0.02', + 'Parse::CPAN::Meta' => '1.39', + 'PerlIO' => '1.06', + 'PerlIO::encoding' => '0.11', + 'PerlIO::scalar' => '0.07', + 'PerlIO::via' => '0.07', + 'Pod::Checker' => '1.45', + 'Pod::Find' => '1.35', + 'Pod::Html' => '1.09', + 'Pod::InputObjects' => '1.31', + 'Pod::Man' => '2.22', + 'Pod::ParseLink' => '1.09', + 'Pod::ParseUtils' => '1.36', + 'Pod::Parser' => '1.37', + 'Pod::Perldoc' => '3.14_04', + 'Pod::PlainText' => '2.04', + 'Pod::Select' => '1.36', + 'Pod::Simple' => '3.07', + 'Pod::Simple::XHTML' => '3.04', + 'Pod::Text' => '3.13', + 'Pod::Text::Color' => '2.05', + 'Pod::Text::Overstrike' => '2.03', + 'Pod::Text::Termcap' => '2.05', + 'Pod::Usage' => '1.36', + 'Safe' => '2.18', + 'Scalar::Util' => '1.21', + 'Scalar::Util::PP' => '1.21', + 'SelectSaver' => '1.02', + 'SelfLoader' => '1.17', + 'Socket' => '1.82', + 'Storable' => '2.20', + 'Switch' => '2.14', + 'Symbol' => '1.07', + 'Sys::Syslog' => '0.27', + 'TAP::Base' => '3.17', + 'TAP::Formatter::Base' => '3.17', + 'TAP::Formatter::Color' => '3.17', + 'TAP::Formatter::Console'=> '3.17', + 'TAP::Formatter::Console::ParallelSession'=> '3.17', + 'TAP::Formatter::Console::Session'=> '3.17', + 'TAP::Formatter::File' => '3.17', + 'TAP::Formatter::File::Session'=> '3.17', + 'TAP::Formatter::Session'=> '3.17', + 'TAP::Harness' => '3.17', + 'TAP::Object' => '3.17', + 'TAP::Parser' => '3.17', + 'TAP::Parser::Aggregator'=> '3.17', + 'TAP::Parser::Grammar' => '3.17', + 'TAP::Parser::Iterator' => '3.17', + 'TAP::Parser::Iterator::Array'=> '3.17', + 'TAP::Parser::Iterator::Process'=> '3.17', + 'TAP::Parser::Iterator::Stream'=> '3.17', + 'TAP::Parser::IteratorFactory'=> '3.17', + 'TAP::Parser::Multiplexer'=> '3.17', + 'TAP::Parser::Result' => '3.17', + 'TAP::Parser::Result::Bailout'=> '3.17', + 'TAP::Parser::Result::Comment'=> '3.17', + 'TAP::Parser::Result::Plan'=> '3.17', + 'TAP::Parser::Result::Pragma'=> '3.17', + 'TAP::Parser::Result::Test'=> '3.17', + 'TAP::Parser::Result::Unknown'=> '3.17', + 'TAP::Parser::Result::Version'=> '3.17', + 'TAP::Parser::Result::YAML'=> '3.17', + 'TAP::Parser::ResultFactory'=> '3.17', + 'TAP::Parser::Scheduler'=> '3.17', + 'TAP::Parser::Scheduler::Job'=> '3.17', + 'TAP::Parser::Scheduler::Spinner'=> '3.17', + 'TAP::Parser::Source' => '3.17', + 'TAP::Parser::Source::Perl'=> '3.17', + 'TAP::Parser::Utils' => '3.17', + 'TAP::Parser::YAMLish::Reader'=> '3.17', + 'TAP::Parser::YAMLish::Writer'=> '3.17', + 'Term::ANSIColor' => '2.00', + 'Term::ReadLine' => '1.04', + 'Term::UI' => '0.20', + 'Test' => '1.25_02', + 'Test::Builder' => '0.92', + 'Test::Builder::Module' => '0.92', + 'Test::Builder::Tester' => '1.18', + 'Test::Builder::Tester::Color'=> '1.18', + 'Test::Harness' => '3.17', + 'Test::More' => '0.92', + 'Test::Simple' => '0.92', + 'Text::ParseWords' => '3.27', + 'Text::Tabs' => '2009.0305', + 'Text::Wrap' => '2009.0305', + 'Thread::Queue' => '2.11', + 'Thread::Semaphore' => '2.09', + 'Tie::Handle' => '4.2', + 'Tie::Hash' => '1.03', + 'Tie::RefHash' => '1.38', + 'Tie::Scalar' => '1.01', + 'Tie::StdHandle' => '4.2', + 'Time::HiRes' => '1.9719', + 'Time::Local' => '1.1901', + 'Time::Piece' => '1.15', + 'UNIVERSAL' => '1.05', + 'Unicode' => '5.1.0', + 'Unicode::Normalize' => '1.03', + 'Unicode::UCD' => '0.27', + 'VMS::Stdio' => '2.4', + 'Win32' => '0.39', + 'Win32API::File' => '0.1101', + 'XS::APItest' => '0.15', + 'XS::Typemap' => '0.03', + 'XSLoader' => '0.10', + 'attributes' => '0.09', + 'attrs' => '1.03', + 'autodie' => '2.06_01', + 'autodie::exception' => '2.06_01', + 'autodie::exception::system'=> '2.06_01', + 'autodie::hints' => '2.06_01', + 'base' => '2.14', + 'bigint' => '0.23', + 'bignum' => '0.23', + 'bigrat' => '0.23', + 'blib' => '1.04', + 'charnames' => '1.07', + 'constant' => '1.17', + 'encoding' => '2.6_01', + 'feature' => '1.13', + 'fields' => '2.14', + 'lib' => '0.62', + 'mro' => '1.01', + 'open' => '1.07', + 'ops' => '1.02', + 'overload' => '1.07', + 'overload::numbers' => undef, + 'overloading' => '0.01', + 'parent' => '0.221', + 're' => '0.09', + 'threads' => '1.72', + 'threads::shared' => '1.29', + 'version' => '0.77', + }, + removed => { + 'CPAN::API::HOWTO' => 1, + 'CPAN::DeferedCode' => 1, + 'CPANPLUS::inc' => 1, + 'ExtUtils::MakeMaker::bytes'=> 1, + 'ExtUtils::MakeMaker::vmsish'=> 1, + 'Test::Harness::Assert' => 1, + 'Test::Harness::Iterator'=> 1, + 'Test::Harness::Point' => 1, + 'Test::Harness::Results'=> 1, + 'Test::Harness::Straps' => 1, + 'Test::Harness::Util' => 1, + } + }, + 5.011 => { + delta_from => 5.010001, + changed => { + 'Archive::Tar' => '1.54', + 'Attribute::Handlers' => '0.87', + 'AutoLoader' => '5.70', + 'B::Deparse' => '0.91', + 'B::Lint' => '1.11_01', + 'B::Lint::Debug' => '0.01', + 'CGI' => '3.45', + 'CGI::Apache' => '1.01', + 'CGI::Carp' => '3.45', + 'CGI::Pretty' => '3.44', + 'CGI::Switch' => '1.01', + 'CGI::Util' => '3.45', + 'CPAN' => '1.94_51', + 'CPAN::Distribution' => '1.94', + 'CPAN::FTP' => '5.5002', + 'CPAN::Index' => '1.94', + 'CPAN::LWP::UserAgent' => '1.94', + 'CPANPLUS::Dist::Build' => '0.40', + 'CPANPLUS::Dist::Build::Constants'=> '0.40', + 'Carp' => '1.12', + 'Carp::Heavy' => '1.12', + 'Class::ISA' => '0.36', + 'Compress::Raw::Bzip2' => '2.021', + 'Compress::Raw::Zlib' => '2.021', + 'Compress::Zlib' => '2.021', + 'Cwd' => '3.3002', + 'Data::Dumper' => '2.125', + 'Encode' => '2.37', + 'Exporter' => '5.64', + 'Exporter::Heavy' => '5.64', + 'ExtUtils::ParseXS' => '2.200403', + 'File::Basename' => '2.78', + 'File::Copy' => '2.16', + 'File::stat' => '1.02', + 'IO' => '1.25_01', + 'IO::Compress::Adapter::Bzip2'=> '2.021', + 'IO::Compress::Adapter::Deflate'=> '2.021', + 'IO::Compress::Adapter::Identity'=> '2.021', + 'IO::Compress::Base' => '2.021', + 'IO::Compress::Base::Common'=> '2.021', + 'IO::Compress::Bzip2' => '2.021', + 'IO::Compress::Deflate' => '2.021', + 'IO::Compress::Gzip' => '2.021', + 'IO::Compress::Gzip::Constants'=> '2.021', + 'IO::Compress::RawDeflate'=> '2.021', + 'IO::Compress::Zip' => '2.021', + 'IO::Compress::Zip::Constants'=> '2.021', + 'IO::Compress::Zlib::Constants'=> '2.021', + 'IO::Compress::Zlib::Extra'=> '2.021', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.021', + 'IO::Uncompress::Adapter::Identity'=> '2.021', + 'IO::Uncompress::Adapter::Inflate'=> '2.021', + 'IO::Uncompress::AnyInflate'=> '2.021', + 'IO::Uncompress::AnyUncompress'=> '2.021', + 'IO::Uncompress::Base' => '2.021', + 'IO::Uncompress::Bunzip2'=> '2.021', + 'IO::Uncompress::Gunzip'=> '2.021', + 'IO::Uncompress::Inflate'=> '2.021', + 'IO::Uncompress::RawInflate'=> '2.021', + 'IO::Uncompress::Unzip' => '2.021', + 'IO::Zlib' => '1.10', + 'IPC::Cmd' => '0.50', + 'IPC::Open3' => '1.05', + 'Locale::Maketext::Simple'=> '0.21', + 'Log::Message::Simple' => '0.06', + 'Math::BigInt' => '1.89_01', + 'Math::BigRat' => '0.24', + 'Module::Build' => '0.35', + 'Module::Build::Base' => '0.35', + 'Module::Build::Compat' => '0.35', + 'Module::Build::Config' => '0.35', + 'Module::Build::Cookbook'=> '0.35', + 'Module::Build::Dumper' => '0.35', + 'Module::Build::ModuleInfo'=> '0.35', + 'Module::Build::Notes' => '0.35', + 'Module::Build::PPMMaker'=> '0.35', + 'Module::Build::Platform::Amiga'=> '0.35', + 'Module::Build::Platform::Default'=> '0.35', + 'Module::Build::Platform::EBCDIC'=> '0.35', + 'Module::Build::Platform::MPEiX'=> '0.35', + 'Module::Build::Platform::MacOS'=> '0.35', + 'Module::Build::Platform::RiscOS'=> '0.35', + 'Module::Build::Platform::Unix'=> '0.35', + 'Module::Build::Platform::VMS'=> '0.35', + 'Module::Build::Platform::VOS'=> '0.35', + 'Module::Build::Platform::Windows'=> '0.35', + 'Module::Build::Platform::aix'=> '0.35', + 'Module::Build::Platform::cygwin'=> '0.35', + 'Module::Build::Platform::darwin'=> '0.35', + 'Module::Build::Platform::os2'=> '0.35', + 'Module::Build::PodParser'=> '0.35', + 'Module::CoreList' => '2.19', + 'Module::Loaded' => '0.06', + 'Opcode' => '1.13', + 'PerlIO::via' => '0.08', + 'Pod::Perldoc' => '3.15_01', + 'Pod::Plainer' => '1.01', + 'Safe' => '2.19', + 'Socket' => '1.84', + 'Switch' => '2.14_01', + 'Term::ANSIColor' => '2.02', + 'Term::ReadLine' => '1.05', + 'Text::Balanced' => '2.02', + 'Text::Soundex' => '3.03_01', + 'Time::Local' => '1.1901_01', + 'Unicode::Collate' => '0.52_01', + 'attributes' => '0.12', + 'constant' => '1.19', + 'deprecate' => '0.01', + 'overload' => '1.08', + 'parent' => '0.223', + 're' => '0.10', + 'threads' => '1.74', + 'threads::shared' => '1.31', + 'warnings' => '1.07', + }, + removed => { + 'attrs' => 1, + } + }, + 5.011001 => { + delta_from => 5.011, + changed => { + 'B' => '1.23', + 'B::Concise' => '0.77', + 'B::Deparse' => '0.92', + 'CGI' => '3.48', + 'CGI::Pretty' => '3.46', + 'CGI::Util' => '3.48', + 'CPANPLUS' => '0.89_03', + 'CPANPLUS::Internals' => '0.89_03', + 'CPANPLUS::Shell::Default'=> '0.89_03', + 'Carp' => '1.13', + 'Carp::Heavy' => '1.13', + 'ExtUtils::CBuilder' => '0.260301', + 'ExtUtils::CBuilder::Base'=> '0.260301', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.260301', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.260301', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.260301', + 'ExtUtils::CBuilder::Platform::aix'=> '0.260301', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.260301', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.260301', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.260301', + 'ExtUtils::CBuilder::Platform::os2'=> '0.260301', + 'ExtUtils::Install' => '1.55', + 'ExtUtils::Manifest' => '1.57', + 'ExtUtils::Packlist' => '1.44', + 'ExtUtils::ParseXS' => '2.21', + 'File::Glob' => '1.07', + 'File::Path' => '2.08', + 'IO' => '1.25_02', + 'Module::CoreList' => '2.21', + 'OS2::DLL' => '1.04', + 'OS2::Process' => '1.04', + 'Object::Accessor' => '0.36', + 'Opcode' => '1.15', + 'POSIX' => '1.18', + 'Parse::CPAN::Meta' => '1.40', + 'PerlIO::via' => '0.09', + 'Pod::Simple' => '3.08', + 'Socket' => '1.85', + 'Storable' => '2.22', + 'Switch' => '2.15', + 'Test::Builder' => '0.94', + 'Test::Builder::Module' => '0.94', + 'Test::More' => '0.94', + 'Test::Simple' => '0.94', + 'XS::APItest' => '0.16', + 'mro' => '1.02', + 'overload' => '1.09', + 'threads::shared' => '1.32', + }, + removed => { + } + }, + 5.011002 => { + delta_from => 5.011001, + changed => { + 'B::Concise' => '0.78', + 'B::Deparse' => '0.93', + 'CPANPLUS' => '0.89_09', + 'CPANPLUS::Dist::Build' => '0.44', + 'CPANPLUS::Dist::Build::Constants'=> '0.44', + 'CPANPLUS::Internals' => '0.89_09', + 'CPANPLUS::Shell::Default'=> '0.89_09', + 'Carp' => '1.14', + 'Carp::Heavy' => '1.14', + 'Compress::Zlib' => '2.022', + 'DBM_Filter' => '0.03', + 'Encode' => '2.38', + 'Encode::Byte' => '2.04', + 'Encode::CN' => '2.03', + 'Encode::JP' => '2.04', + 'Encode::KR' => '2.03', + 'Encode::TW' => '2.03', + 'Encode::Unicode' => '2.07', + 'Env' => '1.01', + 'Exporter' => '5.64_01', + 'Exporter::Heavy' => '5.64_01', + 'ExtUtils::CBuilder' => '0.27', + 'ExtUtils::CBuilder::Base'=> '0.27', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.27', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.27', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.27', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.27', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.27', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.27', + 'ExtUtils::CBuilder::Platform::aix'=> '0.27', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.27', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.27', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.27', + 'ExtUtils::CBuilder::Platform::os2'=> '0.27', + 'File::Fetch' => '0.22', + 'I18N::LangTags::Detect'=> '1.04', + 'I18N::Langinfo' => '0.03', + 'IO::Compress::Adapter::Bzip2'=> '2.022', + 'IO::Compress::Adapter::Deflate'=> '2.022', + 'IO::Compress::Adapter::Identity'=> '2.022', + 'IO::Compress::Base' => '2.022', + 'IO::Compress::Base::Common'=> '2.022', + 'IO::Compress::Bzip2' => '2.022', + 'IO::Compress::Deflate' => '2.022', + 'IO::Compress::Gzip' => '2.022', + 'IO::Compress::Gzip::Constants'=> '2.022', + 'IO::Compress::RawDeflate'=> '2.022', + 'IO::Compress::Zip' => '2.022', + 'IO::Compress::Zip::Constants'=> '2.022', + 'IO::Compress::Zlib::Constants'=> '2.022', + 'IO::Compress::Zlib::Extra'=> '2.022', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.022', + 'IO::Uncompress::Adapter::Identity'=> '2.022', + 'IO::Uncompress::Adapter::Inflate'=> '2.022', + 'IO::Uncompress::AnyInflate'=> '2.022', + 'IO::Uncompress::AnyUncompress'=> '2.022', + 'IO::Uncompress::Base' => '2.022', + 'IO::Uncompress::Bunzip2'=> '2.022', + 'IO::Uncompress::Gunzip'=> '2.022', + 'IO::Uncompress::Inflate'=> '2.022', + 'IO::Uncompress::RawInflate'=> '2.022', + 'IO::Uncompress::Unzip' => '2.022', + 'IPC::Cmd' => '0.54', + 'List::Util' => '1.22', + 'List::Util::PP' => '1.22', + 'List::Util::XS' => '1.22', + 'Locale::Maketext' => '1.14', + 'Module::Build' => '0.35_09', + 'Module::Build::Base' => '0.35_09', + 'Module::Build::Compat' => '0.35_09', + 'Module::Build::Config' => '0.35_09', + 'Module::Build::Cookbook'=> '0.35_09', + 'Module::Build::Dumper' => '0.35_09', + 'Module::Build::ModuleInfo'=> '0.35_09', + 'Module::Build::Notes' => '0.35_09', + 'Module::Build::PPMMaker'=> '0.35_09', + 'Module::Build::Platform::Amiga'=> '0.35_09', + 'Module::Build::Platform::Default'=> '0.35_09', + 'Module::Build::Platform::EBCDIC'=> '0.35_09', + 'Module::Build::Platform::MPEiX'=> '0.35_09', + 'Module::Build::Platform::MacOS'=> '0.35_09', + 'Module::Build::Platform::RiscOS'=> '0.35_09', + 'Module::Build::Platform::Unix'=> '0.35_09', + 'Module::Build::Platform::VMS'=> '0.35_09', + 'Module::Build::Platform::VOS'=> '0.35_09', + 'Module::Build::Platform::Windows'=> '0.35_09', + 'Module::Build::Platform::aix'=> '0.35_09', + 'Module::Build::Platform::cygwin'=> '0.35_09', + 'Module::Build::Platform::darwin'=> '0.35_09', + 'Module::Build::Platform::os2'=> '0.35_09', + 'Module::Build::PodParser'=> '0.35_09', + 'Module::Build::YAML' => '1.40', + 'Module::CoreList' => '2.23', + 'Module::Load::Conditional'=> '0.34', + 'Pod::Simple' => '3.10', + 'Pod::Simple::XHTML' => '3.10', + 'Scalar::Util' => '1.22', + 'Scalar::Util::PP' => '1.22', + 'Switch' => '2.16', + 'XS::APItest' => '0.17', + 'XS::APItest::KeywordRPN'=> '0.003', + 'base' => '2.15', + 'diagnostics' => '1.18', + 'fields' => '2.15', + 'inc::latest' => '0.35_09', + 'legacy' => '1.00', + 'overload' => '1.10', + }, + removed => { + } + }, + 5.011003 => { + delta_from => 5.011002, + changed => { + 'App::Cpan' => '1.570001', + 'Archive::Extract' => '0.36', + 'CPAN' => '1.94_5301', + 'CPAN::FTP' => '5.5004', + 'CPAN::FirstTime' => '5.530001', + 'CPAN::Mirrors' => '1.770001', + 'CPANPLUS' => '0.90', + 'CPANPLUS::Internals' => '0.90', + 'CPANPLUS::Shell::Default'=> '0.90', + 'Cwd' => '3.31', + 'Encode' => '2.39', + 'ExtUtils::Command::MM' => '6.56', + 'ExtUtils::Liblist' => '6.56', + 'ExtUtils::Liblist::Kid'=> '6.56', + 'ExtUtils::MM' => '6.56', + 'ExtUtils::MM_AIX' => '6.56', + 'ExtUtils::MM_Any' => '6.56', + 'ExtUtils::MM_BeOS' => '6.56', + 'ExtUtils::MM_Cygwin' => '6.56', + 'ExtUtils::MM_DOS' => '6.56', + 'ExtUtils::MM_Darwin' => '6.56', + 'ExtUtils::MM_MacOS' => '6.56', + 'ExtUtils::MM_NW5' => '6.56', + 'ExtUtils::MM_OS2' => '6.56', + 'ExtUtils::MM_QNX' => '6.56', + 'ExtUtils::MM_UWIN' => '6.56', + 'ExtUtils::MM_Unix' => '6.56', + 'ExtUtils::MM_VMS' => '6.56', + 'ExtUtils::MM_VOS' => '6.56', + 'ExtUtils::MM_Win32' => '6.56', + 'ExtUtils::MM_Win95' => '6.56', + 'ExtUtils::MY' => '6.56', + 'ExtUtils::MakeMaker' => '6.56', + 'ExtUtils::MakeMaker::Config'=> '6.56', + 'ExtUtils::Mkbootstrap' => '6.56', + 'ExtUtils::Mksymlists' => '6.56', + 'ExtUtils::testlib' => '6.56', + 'File::Find' => '1.15', + 'File::Path' => '2.08_01', + 'File::Spec' => '3.31', + 'Module::Build' => '0.36', + 'Module::Build::Base' => '0.36', + 'Module::Build::Compat' => '0.36', + 'Module::Build::Config' => '0.36', + 'Module::Build::Cookbook'=> '0.36', + 'Module::Build::Dumper' => '0.36', + 'Module::Build::ModuleInfo'=> '0.36', + 'Module::Build::Notes' => '0.36', + 'Module::Build::PPMMaker'=> '0.36', + 'Module::Build::Platform::Amiga'=> '0.36', + 'Module::Build::Platform::Default'=> '0.36', + 'Module::Build::Platform::EBCDIC'=> '0.36', + 'Module::Build::Platform::MPEiX'=> '0.36', + 'Module::Build::Platform::MacOS'=> '0.36', + 'Module::Build::Platform::RiscOS'=> '0.36', + 'Module::Build::Platform::Unix'=> '0.36', + 'Module::Build::Platform::VMS'=> '0.36', + 'Module::Build::Platform::VOS'=> '0.36', + 'Module::Build::Platform::Windows'=> '0.36', + 'Module::Build::Platform::aix'=> '0.36', + 'Module::Build::Platform::cygwin'=> '0.36', + 'Module::Build::Platform::darwin'=> '0.36', + 'Module::Build::Platform::os2'=> '0.36', + 'Module::Build::PodParser'=> '0.36', + 'Module::CoreList' => '2.24', + 'POSIX' => '1.19', + 'Pod::Simple' => '3.13', + 'Pod::Simple::BlackBox' => '3.13', + 'Pod::Simple::Checker' => '3.13', + 'Pod::Simple::Debug' => '3.13', + 'Pod::Simple::DumpAsText'=> '3.13', + 'Pod::Simple::DumpAsXML'=> '3.13', + 'Pod::Simple::HTML' => '3.13', + 'Pod::Simple::HTMLBatch'=> '3.13', + 'Pod::Simple::LinkSection'=> '3.13', + 'Pod::Simple::Methody' => '3.13', + 'Pod::Simple::Progress' => '3.13', + 'Pod::Simple::PullParser'=> '3.13', + 'Pod::Simple::PullParserEndToken'=> '3.13', + 'Pod::Simple::PullParserStartToken'=> '3.13', + 'Pod::Simple::PullParserTextToken'=> '3.13', + 'Pod::Simple::PullParserToken'=> '3.13', + 'Pod::Simple::RTF' => '3.13', + 'Pod::Simple::Search' => '3.13', + 'Pod::Simple::SimpleTree'=> '3.13', + 'Pod::Simple::Text' => '3.13', + 'Pod::Simple::TextContent'=> '3.13', + 'Pod::Simple::TiedOutFH'=> '3.13', + 'Pod::Simple::Transcode'=> '3.13', + 'Pod::Simple::TranscodeDumb'=> '3.13', + 'Pod::Simple::TranscodeSmart'=> '3.13', + 'Pod::Simple::XHTML' => '3.13', + 'Pod::Simple::XMLOutStream'=> '3.13', + 'Safe' => '2.20', + 'Unicode' => '5.2.0', + 'constant' => '1.20', + 'diagnostics' => '1.19', + 'feature' => '1.14', + 'inc::latest' => '0.36', + 'threads' => '1.75', + 'warnings' => '1.08', + }, + removed => { + 'legacy' => 1, + } + }, + 5.011004 => { + delta_from => 5.011003, + changed => { + 'App::Cpan' => '1.5701', + 'Archive::Extract' => '0.38', + 'B::Deparse' => '0.94', + 'CPAN' => '1.94_54', + 'CPAN::FirstTime' => '5.53', + 'CPAN::Mirrors' => '1.77', + 'Carp' => '1.15', + 'Carp::Heavy' => '1.15', + 'Compress::Raw::Bzip2' => '2.024', + 'Compress::Raw::Zlib' => '2.024', + 'Compress::Zlib' => '2.024', + 'File::Copy' => '2.17', + 'File::Fetch' => '0.24', + 'GDBM_File' => '1.10', + 'IO::Compress::Adapter::Bzip2'=> '2.024', + 'IO::Compress::Adapter::Deflate'=> '2.024', + 'IO::Compress::Adapter::Identity'=> '2.024', + 'IO::Compress::Base' => '2.024', + 'IO::Compress::Base::Common'=> '2.024', + 'IO::Compress::Bzip2' => '2.024', + 'IO::Compress::Deflate' => '2.024', + 'IO::Compress::Gzip' => '2.024', + 'IO::Compress::Gzip::Constants'=> '2.024', + 'IO::Compress::RawDeflate'=> '2.024', + 'IO::Compress::Zip' => '2.024', + 'IO::Compress::Zip::Constants'=> '2.024', + 'IO::Compress::Zlib::Constants'=> '2.024', + 'IO::Compress::Zlib::Extra'=> '2.024', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.024', + 'IO::Uncompress::Adapter::Identity'=> '2.024', + 'IO::Uncompress::Adapter::Inflate'=> '2.024', + 'IO::Uncompress::AnyInflate'=> '2.024', + 'IO::Uncompress::AnyUncompress'=> '2.024', + 'IO::Uncompress::Base' => '2.024', + 'IO::Uncompress::Bunzip2'=> '2.024', + 'IO::Uncompress::Gunzip'=> '2.024', + 'IO::Uncompress::Inflate'=> '2.024', + 'IO::Uncompress::RawInflate'=> '2.024', + 'IO::Uncompress::Unzip' => '2.024', + 'Module::Build' => '0.3603', + 'Module::Build::Base' => '0.3603', + 'Module::Build::Compat' => '0.3603', + 'Module::Build::Config' => '0.3603', + 'Module::Build::Cookbook'=> '0.3603', + 'Module::Build::Dumper' => '0.3603', + 'Module::Build::ModuleInfo'=> '0.3603', + 'Module::Build::Notes' => '0.3603', + 'Module::Build::PPMMaker'=> '0.3603', + 'Module::Build::Platform::Amiga'=> '0.3603', + 'Module::Build::Platform::Default'=> '0.3603', + 'Module::Build::Platform::EBCDIC'=> '0.3603', + 'Module::Build::Platform::MPEiX'=> '0.3603', + 'Module::Build::Platform::MacOS'=> '0.3603', + 'Module::Build::Platform::RiscOS'=> '0.3603', + 'Module::Build::Platform::Unix'=> '0.3603', + 'Module::Build::Platform::VMS'=> '0.3603', + 'Module::Build::Platform::VOS'=> '0.3603', + 'Module::Build::Platform::Windows'=> '0.3603', + 'Module::Build::Platform::aix'=> '0.3603', + 'Module::Build::Platform::cygwin'=> '0.3603', + 'Module::Build::Platform::darwin'=> '0.3603', + 'Module::Build::Platform::os2'=> '0.3603', + 'Module::Build::PodParser'=> '0.3603', + 'Module::CoreList' => '2.25', + 'PerlIO::encoding' => '0.12', + 'Safe' => '2.21', + 'UNIVERSAL' => '1.06', + 'feature' => '1.15', + 'inc::latest' => '0.3603', + 'less' => '0.03', + 're' => '0.11', + 'version' => '0.81', + 'warnings' => '1.09', + }, + removed => { + } + }, + 5.011005 => { + delta_from => 5.011004, + changed => { + 'B::Debug' => '1.12', + 'CPAN' => '1.94_56', + 'CPAN::Debug' => '5.5001', + 'CPAN::Distribution' => '1.9456', + 'CPAN::FirstTime' => '5.5301', + 'CPAN::HandleConfig' => '5.5001', + 'CPAN::Shell' => '5.5001', + 'CPAN::Tarzip' => '5.5011', + 'CPANPLUS::Dist::Build' => '0.46', + 'CPANPLUS::Dist::Build::Constants'=> '0.46', + 'Module::CoreList' => '2.26', + 'Pod::Man' => '2.23', + 'Pod::ParseLink' => '1.10', + 'Pod::Perldoc' => '3.15_02', + 'Pod::Plainer' => '1.02', + 'Pod::Text' => '3.14', + 'Pod::Text::Color' => '2.06', + 'Pod::Text::Overstrike' => '2.04', + 'Pod::Text::Termcap' => '2.06', + 'Safe' => '2.22', + 'Socket' => '1.86', + 'version' => '0.82', + }, + removed => { + } + }, + 5.012 => { + delta_from => 5.011005, + changed => { + 'B::Deparse' => '0.96', + 'CPAN::Distribution' => '1.9456_01', + 'Module::CoreList' => '2.29', + 'Safe' => '2.25', + 'Socket' => '1.87', + 'Tie::Scalar' => '1.02', + 'Time::Piece' => '1.15_01', + 'bytes' => '1.04', + 'feature' => '1.16', + 'utf8' => '1.08', + }, + removed => { + } + }, + 5.012001 => { + delta_from => 5.012, + changed => { + 'B::Deparse' => '0.97', + 'CGI' => '3.49', + 'CGI::Fast' => '1.08', + 'Carp' => '1.16', + 'Carp::Heavy' => '1.16', + 'File::Copy' => '2.18', + 'Module::CoreList' => '2.32', + 'Pod::Functions' => '1.04', + 'Pod::Simple' => '3.14', + 'Pod::Simple::BlackBox' => '3.14', + 'Pod::Simple::Checker' => '3.14', + 'Pod::Simple::Debug' => '3.14', + 'Pod::Simple::DumpAsText'=> '3.14', + 'Pod::Simple::DumpAsXML'=> '3.14', + 'Pod::Simple::HTML' => '3.14', + 'Pod::Simple::HTMLBatch'=> '3.14', + 'Pod::Simple::LinkSection'=> '3.14', + 'Pod::Simple::Methody' => '3.14', + 'Pod::Simple::Progress' => '3.14', + 'Pod::Simple::PullParser'=> '3.14', + 'Pod::Simple::PullParserEndToken'=> '3.14', + 'Pod::Simple::PullParserStartToken'=> '3.14', + 'Pod::Simple::PullParserTextToken'=> '3.14', + 'Pod::Simple::PullParserToken'=> '3.14', + 'Pod::Simple::RTF' => '3.14', + 'Pod::Simple::Search' => '3.14', + 'Pod::Simple::SimpleTree'=> '3.14', + 'Pod::Simple::Text' => '3.14', + 'Pod::Simple::TextContent'=> '3.14', + 'Pod::Simple::TiedOutFH'=> '3.14', + 'Pod::Simple::Transcode'=> '3.14', + 'Pod::Simple::TranscodeDumb'=> '3.14', + 'Pod::Simple::TranscodeSmart'=> '3.14', + 'Pod::Simple::XHTML' => '3.14', + 'Pod::Simple::XMLOutStream'=> '3.14', + 'Safe' => '2.27', + }, + removed => { + } + }, + 5.012002 => { + delta_from => 5.012001, + changed => { + 'Carp' => '1.17', + 'Carp::Heavy' => '1.17', + 'File::Spec' => '3.31_01', + 'Module::CoreList' => '2.38', + 'Module::Load::Conditional'=> '0.38', + 'PerlIO::scalar' => '0.08', + }, + removed => { + } + }, + 5.012003 => { + delta_from => 5.012002, + changed => { + 'B::Deparse' => '0.9701', + 'Module::Build::Platform::cygwin'=> '0.360301', + 'Module::CoreList' => '2.43', + 'Socket' => '1.87_01', + }, + removed => { + } + }, + 5.012004 => { + delta_from => 5.012003, + changed => { + 'Module::CoreList' => '2.50', + }, + removed => { + } + }, + 5.012005 => { + delta_from => 5.012004, + changed => { + 'B::Concise' => '0.78_01', + 'Encode' => '2.39_01', + 'File::Glob' => '1.07_01', + 'Module::CoreList' => '2.50_02', + 'Unicode::UCD' => '0.29', + 'charnames' => '1.07_01', + }, + removed => { + } + }, + 5.013 => { + delta_from => 5.012, + changed => { + 'CGI' => '3.49', + 'CGI::Fast' => '1.08', + 'Data::Dumper' => '2.126', + 'ExtUtils::MM_Unix' => '6.5601', + 'ExtUtils::MakeMaker' => '6.5601', + 'File::Copy' => '2.18', + 'IPC::Open3' => '1.06', + 'MIME::Base64' => '3.09', + 'MIME::QuotedPrint' => '3.09', + 'Module::CoreList' => '2.31', + 'Pod::Functions' => '1.04', + 'XS::APItest' => '0.18', + 'XS::APItest::KeywordRPN'=> '0.004', + 'feature' => '1.17', + 'threads' => '1.77_01', + 'threads::shared' => '1.33', + }, + removed => { + } + }, + 5.013001 => { + delta_from => 5.012001, + changed => { + 'Data::Dumper' => '2.126', + 'Dumpvalue' => '1.14', + 'Errno' => '1.12', + 'ExtUtils::MM_Unix' => '6.5601', + 'ExtUtils::MakeMaker' => '6.5601', + 'ExtUtils::ParseXS' => '2.2205', + 'File::Find' => '1.16', + 'IPC::Cmd' => '0.58', + 'IPC::Open3' => '1.06', + 'List::Util' => '1.23', + 'List::Util::PP' => '1.23', + 'List::Util::XS' => '1.23', + 'Locale::Codes' => '3.12', + 'Locale::Codes::Country'=> '3.12', + 'Locale::Codes::Currency'=> '3.12', + 'Locale::Codes::Language'=> '3.12', + 'Locale::Codes::Script' => '3.12', + 'Locale::Constants' => '3.12', + 'Locale::Country' => '3.12', + 'Locale::Currency' => '3.12', + 'Locale::Language' => '3.12', + 'Locale::Script' => '3.12', + 'MIME::Base64' => '3.09', + 'MIME::QuotedPrint' => '3.09', + 'Module::Build::Platform::cygwin'=> '0.360301', + 'Module::CoreList' => '2.34', + 'Module::Load::Conditional'=> '0.38', + 'PerlIO::scalar' => '0.08', + 'Scalar::Util' => '1.23', + 'Scalar::Util::PP' => '1.23', + 'Socket' => '1.88', + 'Term::ReadLine' => '1.06', + 'Unicode::UCD' => '0.28', + 'XS::APItest' => '0.19', + 'XS::APItest::KeywordRPN'=> '0.004', + 'charnames' => '1.08', + 'feature' => '1.17', + 'threads' => '1.77_01', + 'threads::shared' => '1.33', + }, + removed => { + 'Class::ISA' => 1, + 'Pod::Plainer' => 1, + 'Switch' => 1, + } + }, + 5.013002 => { + delta_from => 5.013001, + changed => { + 'B::Concise' => '0.79', + 'B::Deparse' => '0.98', + 'CPAN' => '1.94_57', + 'CPAN::Distribution' => '1.9600', + 'Exporter' => '5.64_02', + 'Exporter::Heavy' => '5.64_02', + 'File::Copy' => '2.19', + 'Hash::Util' => '0.08', + 'IO::Socket' => '1.32', + 'Locale::Codes' => '3.13', + 'Locale::Codes::Country'=> '3.13', + 'Locale::Codes::Currency'=> '3.13', + 'Locale::Codes::Language'=> '3.13', + 'Locale::Codes::Script' => '3.13', + 'Locale::Constants' => '3.13', + 'Locale::Country' => '3.13', + 'Locale::Currency' => '3.13', + 'Locale::Language' => '3.13', + 'Locale::Script' => '3.13', + 'Search::Dict' => '1.03', + 'Socket' => '1.89', + 'Thread::Semaphore' => '2.11', + 'UNIVERSAL' => '1.07', + 'VMS::DCLsym' => '1.04', + 'mro' => '1.03', + 'threads' => '1.77_02', + 'threads::shared' => '1.33_01', + }, + removed => { + } + }, + 5.013003 => { + delta_from => 5.013002, + changed => { + 'App::Prove' => '3.21', + 'App::Prove::State' => '3.21', + 'App::Prove::State::Result'=> '3.21', + 'App::Prove::State::Result::Test'=> '3.21', + 'Archive::Extract' => '0.42', + 'Archive::Tar' => '1.64', + 'Archive::Tar::Constant'=> '1.64', + 'Archive::Tar::File' => '1.64', + 'Attribute::Handlers' => '0.88', + 'CPANPLUS' => '0.9007', + 'CPANPLUS::Internals' => '0.9007', + 'CPANPLUS::Shell::Default'=> '0.9007', + 'Compress::Raw::Bzip2' => '2.027', + 'Compress::Raw::Zlib' => '2.027_01', + 'Compress::Zlib' => '2.027', + 'DB' => '1.03', + 'Digest::MD5' => '2.40', + 'Digest::SHA' => '5.48', + 'Exporter' => '5.64_03', + 'Exporter::Heavy' => '5.64_03', + 'ExtUtils::CBuilder' => '0.2703', + 'ExtUtils::CBuilder::Base'=> '0.2703_01', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.2703', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.2703', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.2703', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.2703', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.2703', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.2703', + 'ExtUtils::CBuilder::Platform::aix'=> '0.2703', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.2703', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.2703', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.2703', + 'ExtUtils::CBuilder::Platform::os2'=> '0.2703', + 'ExtUtils::Manifest' => '1.58', + 'ExtUtils::ParseXS' => '2.2206', + 'Fatal' => '2.10', + 'File::Basename' => '2.79', + 'File::Copy' => '2.20', + 'File::DosGlob' => '1.02', + 'File::Find' => '1.17', + 'File::Glob' => '1.08', + 'File::stat' => '1.03', + 'I18N::LangTags' => '0.35_01', + 'I18N::LangTags::List' => '0.35_01', + 'IO::Compress::Adapter::Bzip2'=> '2.027', + 'IO::Compress::Adapter::Deflate'=> '2.027', + 'IO::Compress::Adapter::Identity'=> '2.027', + 'IO::Compress::Base' => '2.027', + 'IO::Compress::Base::Common'=> '2.027', + 'IO::Compress::Bzip2' => '2.027', + 'IO::Compress::Deflate' => '2.027', + 'IO::Compress::Gzip' => '2.027', + 'IO::Compress::Gzip::Constants'=> '2.027', + 'IO::Compress::RawDeflate'=> '2.027', + 'IO::Compress::Zip' => '2.027', + 'IO::Compress::Zip::Constants'=> '2.027', + 'IO::Compress::Zlib::Constants'=> '2.027', + 'IO::Compress::Zlib::Extra'=> '2.027', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.027', + 'IO::Uncompress::Adapter::Identity'=> '2.027', + 'IO::Uncompress::Adapter::Inflate'=> '2.027', + 'IO::Uncompress::AnyInflate'=> '2.027', + 'IO::Uncompress::AnyUncompress'=> '2.027', + 'IO::Uncompress::Base' => '2.027', + 'IO::Uncompress::Bunzip2'=> '2.027', + 'IO::Uncompress::Gunzip'=> '2.027', + 'IO::Uncompress::Inflate'=> '2.027', + 'IO::Uncompress::RawInflate'=> '2.027', + 'IO::Uncompress::Unzip' => '2.027', + 'IPC::Cmd' => '0.60', + 'IPC::Msg' => '2.03', + 'IPC::Semaphore' => '2.03', + 'IPC::SharedMem' => '2.03', + 'IPC::SysV' => '2.03', + 'Locale::Maketext' => '1.15', + 'Locale::Maketext::Guts'=> undef, + 'Locale::Maketext::GutsLoader'=> undef, + 'Module::Build' => '0.3607', + 'Module::Build::Base' => '0.3607', + 'Module::Build::Compat' => '0.3607', + 'Module::Build::Config' => '0.3607', + 'Module::Build::Cookbook'=> '0.3607', + 'Module::Build::Dumper' => '0.3607', + 'Module::Build::ModuleInfo'=> '0.3607', + 'Module::Build::Notes' => '0.3607', + 'Module::Build::PPMMaker'=> '0.3607', + 'Module::Build::Platform::Amiga'=> '0.3607', + 'Module::Build::Platform::Default'=> '0.3607', + 'Module::Build::Platform::EBCDIC'=> '0.3607', + 'Module::Build::Platform::MPEiX'=> '0.3607', + 'Module::Build::Platform::MacOS'=> '0.3607', + 'Module::Build::Platform::RiscOS'=> '0.3607', + 'Module::Build::Platform::Unix'=> '0.3607', + 'Module::Build::Platform::VMS'=> '0.3607', + 'Module::Build::Platform::VOS'=> '0.3607', + 'Module::Build::Platform::Windows'=> '0.3607', + 'Module::Build::Platform::aix'=> '0.3607', + 'Module::Build::Platform::cygwin'=> '0.3607', + 'Module::Build::Platform::darwin'=> '0.3607', + 'Module::Build::Platform::os2'=> '0.3607', + 'Module::Build::PodParser'=> '0.3607', + 'Module::CoreList' => '2.36', + 'Module::Load' => '0.18', + 'TAP::Base' => '3.21', + 'TAP::Formatter::Base' => '3.21', + 'TAP::Formatter::Color' => '3.21', + 'TAP::Formatter::Console'=> '3.21', + 'TAP::Formatter::Console::ParallelSession'=> '3.21', + 'TAP::Formatter::Console::Session'=> '3.21', + 'TAP::Formatter::File' => '3.21', + 'TAP::Formatter::File::Session'=> '3.21', + 'TAP::Formatter::Session'=> '3.21', + 'TAP::Harness' => '3.21', + 'TAP::Object' => '3.21', + 'TAP::Parser' => '3.21', + 'TAP::Parser::Aggregator'=> '3.21', + 'TAP::Parser::Grammar' => '3.21', + 'TAP::Parser::Iterator' => '3.21', + 'TAP::Parser::Iterator::Array'=> '3.21', + 'TAP::Parser::Iterator::Process'=> '3.21', + 'TAP::Parser::Iterator::Stream'=> '3.21', + 'TAP::Parser::IteratorFactory'=> '3.21', + 'TAP::Parser::Multiplexer'=> '3.21', + 'TAP::Parser::Result' => '3.21', + 'TAP::Parser::Result::Bailout'=> '3.21', + 'TAP::Parser::Result::Comment'=> '3.21', + 'TAP::Parser::Result::Plan'=> '3.21', + 'TAP::Parser::Result::Pragma'=> '3.21', + 'TAP::Parser::Result::Test'=> '3.21', + 'TAP::Parser::Result::Unknown'=> '3.21', + 'TAP::Parser::Result::Version'=> '3.21', + 'TAP::Parser::Result::YAML'=> '3.21', + 'TAP::Parser::ResultFactory'=> '3.21', + 'TAP::Parser::Scheduler'=> '3.21', + 'TAP::Parser::Scheduler::Job'=> '3.21', + 'TAP::Parser::Scheduler::Spinner'=> '3.21', + 'TAP::Parser::Source' => '3.21', + 'TAP::Parser::SourceHandler'=> '3.21', + 'TAP::Parser::SourceHandler::Executable'=> '3.21', + 'TAP::Parser::SourceHandler::File'=> '3.21', + 'TAP::Parser::SourceHandler::Handle'=> '3.21', + 'TAP::Parser::SourceHandler::Perl'=> '3.21', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.21', + 'TAP::Parser::SourceHandler::pgTAP'=> '3.21', + 'TAP::Parser::Utils' => '3.21', + 'TAP::Parser::YAMLish::Reader'=> '3.21', + 'TAP::Parser::YAMLish::Writer'=> '3.21', + 'Term::ANSIColor' => '3.00', + 'Term::ReadLine' => '1.07', + 'Test::Harness' => '3.21', + 'Tie::Array' => '1.04', + 'Time::HiRes' => '1.9721', + 'Time::Piece' => '1.20_01', + 'Unicode::Collate' => '0.53', + 'Unicode::Normalize' => '1.06', + 'Unicode::UCD' => '0.29', + 'autodie' => '2.10', + 'autodie::exception' => '2.10', + 'autodie::exception::system'=> '2.10', + 'autodie::hints' => '2.10', + 'blib' => '1.05', + 'charnames' => '1.11', + 'diagnostics' => '1.20', + 'inc::latest' => '0.3607', + 'lib' => '0.63', + 're' => '0.12', + 'threads' => '1.77_03', + 'threads::shared' => '1.33_02', + 'vars' => '1.02', + 'warnings' => '1.10', + }, + removed => { + 'TAP::Parser::Source::Perl'=> 1, + } + }, + 5.013004 => { + delta_from => 5.013003, + changed => { + 'App::Prove' => '3.22', + 'App::Prove::State' => '3.22', + 'App::Prove::State::Result'=> '3.22', + 'App::Prove::State::Result::Test'=> '3.22', + 'Archive::Tar' => '1.68', + 'Archive::Tar::Constant'=> '1.68', + 'Archive::Tar::File' => '1.68', + 'B::Lint' => '1.12', + 'B::Lint::Debug' => '1.12', + 'Carp' => '1.18', + 'Carp::Heavy' => '1.18', + 'Compress::Raw::Bzip2' => '2.030', + 'Compress::Raw::Zlib' => '2.030', + 'Compress::Zlib' => '2.030', + 'ExtUtils::ParseXS' => '2.2207', + 'File::Spec' => '3.31_01', + 'I18N::Langinfo' => '0.04', + 'IO::Compress::Adapter::Bzip2'=> '2.030', + 'IO::Compress::Adapter::Deflate'=> '2.030', + 'IO::Compress::Adapter::Identity'=> '2.030', + 'IO::Compress::Base' => '2.030', + 'IO::Compress::Base::Common'=> '2.030', + 'IO::Compress::Bzip2' => '2.030', + 'IO::Compress::Deflate' => '2.030', + 'IO::Compress::Gzip' => '2.030', + 'IO::Compress::Gzip::Constants'=> '2.030', + 'IO::Compress::RawDeflate'=> '2.030', + 'IO::Compress::Zip' => '2.030', + 'IO::Compress::Zip::Constants'=> '2.030', + 'IO::Compress::Zlib::Constants'=> '2.030', + 'IO::Compress::Zlib::Extra'=> '2.030', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.030', + 'IO::Uncompress::Adapter::Identity'=> '2.030', + 'IO::Uncompress::Adapter::Inflate'=> '2.030', + 'IO::Uncompress::AnyInflate'=> '2.030', + 'IO::Uncompress::AnyUncompress'=> '2.030', + 'IO::Uncompress::Base' => '2.030', + 'IO::Uncompress::Bunzip2'=> '2.030', + 'IO::Uncompress::Gunzip'=> '2.030', + 'IO::Uncompress::Inflate'=> '2.030', + 'IO::Uncompress::RawInflate'=> '2.030', + 'IO::Uncompress::Unzip' => '2.030', + 'Module::CoreList' => '2.37', + 'TAP::Base' => '3.22', + 'TAP::Formatter::Base' => '3.22', + 'TAP::Formatter::Color' => '3.22', + 'TAP::Formatter::Console'=> '3.22', + 'TAP::Formatter::Console::ParallelSession'=> '3.22', + 'TAP::Formatter::Console::Session'=> '3.22', + 'TAP::Formatter::File' => '3.22', + 'TAP::Formatter::File::Session'=> '3.22', + 'TAP::Formatter::Session'=> '3.22', + 'TAP::Harness' => '3.22', + 'TAP::Object' => '3.22', + 'TAP::Parser' => '3.22', + 'TAP::Parser::Aggregator'=> '3.22', + 'TAP::Parser::Grammar' => '3.22', + 'TAP::Parser::Iterator' => '3.22', + 'TAP::Parser::Iterator::Array'=> '3.22', + 'TAP::Parser::Iterator::Process'=> '3.22', + 'TAP::Parser::Iterator::Stream'=> '3.22', + 'TAP::Parser::IteratorFactory'=> '3.22', + 'TAP::Parser::Multiplexer'=> '3.22', + 'TAP::Parser::Result' => '3.22', + 'TAP::Parser::Result::Bailout'=> '3.22', + 'TAP::Parser::Result::Comment'=> '3.22', + 'TAP::Parser::Result::Plan'=> '3.22', + 'TAP::Parser::Result::Pragma'=> '3.22', + 'TAP::Parser::Result::Test'=> '3.22', + 'TAP::Parser::Result::Unknown'=> '3.22', + 'TAP::Parser::Result::Version'=> '3.22', + 'TAP::Parser::Result::YAML'=> '3.22', + 'TAP::Parser::ResultFactory'=> '3.22', + 'TAP::Parser::Scheduler'=> '3.22', + 'TAP::Parser::Scheduler::Job'=> '3.22', + 'TAP::Parser::Scheduler::Spinner'=> '3.22', + 'TAP::Parser::Source' => '3.22', + 'TAP::Parser::SourceHandler'=> '3.22', + 'TAP::Parser::SourceHandler::Executable'=> '3.22', + 'TAP::Parser::SourceHandler::File'=> '3.22', + 'TAP::Parser::SourceHandler::Handle'=> '3.22', + 'TAP::Parser::SourceHandler::Perl'=> '3.22', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.22', + 'TAP::Parser::Utils' => '3.22', + 'TAP::Parser::YAMLish::Reader'=> '3.22', + 'TAP::Parser::YAMLish::Writer'=> '3.22', + 'Test::Builder' => '0.96', + 'Test::Builder::Module' => '0.96', + 'Test::Builder::Tester' => '1.20', + 'Test::Builder::Tester::Color'=> '1.20', + 'Test::Harness' => '3.22', + 'Test::More' => '0.96', + 'Test::Simple' => '0.96', + 'Unicode::Collate' => '0.56', + 'Unicode::Collate::Locale'=> '0.56', + 'XS::APItest' => '0.20', + 'charnames' => '1.15', + 'feature' => '1.18', + }, + removed => { + 'TAP::Parser::SourceHandler::pgTAP'=> 1, + } + }, + 5.013005 => { + delta_from => 5.013004, + changed => { + 'B::Debug' => '1.16', + 'CPANPLUS::Dist::Build' => '0.48', + 'CPANPLUS::Dist::Build::Constants'=> '0.48', + 'Data::Dumper' => '2.128', + 'Encode' => '2.40', + 'Encode::Guess' => '2.04', + 'Encode::MIME::Header' => '2.12', + 'Encode::Unicode::UTF7' => '2.05', + 'Errno' => '1.13', + 'ExtUtils::Command::MM' => '6.57_05', + 'ExtUtils::Liblist' => '6.57_05', + 'ExtUtils::Liblist::Kid'=> '6.5705', + 'ExtUtils::MM' => '6.57_05', + 'ExtUtils::MM_AIX' => '6.57_05', + 'ExtUtils::MM_Any' => '6.57_05', + 'ExtUtils::MM_BeOS' => '6.57_05', + 'ExtUtils::MM_Cygwin' => '6.57_05', + 'ExtUtils::MM_DOS' => '6.5705', + 'ExtUtils::MM_Darwin' => '6.57_05', + 'ExtUtils::MM_MacOS' => '6.5705', + 'ExtUtils::MM_NW5' => '6.57_05', + 'ExtUtils::MM_OS2' => '6.57_05', + 'ExtUtils::MM_QNX' => '6.57_05', + 'ExtUtils::MM_UWIN' => '6.5705', + 'ExtUtils::MM_Unix' => '6.57_05', + 'ExtUtils::MM_VMS' => '6.57_05', + 'ExtUtils::MM_VOS' => '6.57_05', + 'ExtUtils::MM_Win32' => '6.57_05', + 'ExtUtils::MM_Win95' => '6.57_05', + 'ExtUtils::MY' => '6.5705', + 'ExtUtils::MakeMaker' => '6.57_05', + 'ExtUtils::MakeMaker::Config'=> '6.57_05', + 'ExtUtils::MakeMaker::YAML'=> '1.44', + 'ExtUtils::Mkbootstrap' => '6.57_05', + 'ExtUtils::Mksymlists' => '6.57_05', + 'ExtUtils::testlib' => '6.5705', + 'Filter::Simple' => '0.85', + 'Hash::Util' => '0.09', + 'Math::BigFloat' => '1.62', + 'Math::BigInt' => '1.95', + 'Math::BigInt::Calc' => '0.54', + 'Math::BigInt::CalcEmu' => '0.06', + 'Math::BigInt::FastCalc'=> '0.22', + 'Math::BigRat' => '0.26', + 'Module::CoreList' => '2.39', + 'POSIX' => '1.20', + 'PerlIO::scalar' => '0.09', + 'Safe' => '2.28', + 'Test::Builder' => '0.97_01', + 'Test::Builder::Module' => '0.97_01', + 'Test::Builder::Tester' => '1.21_01', + 'Test::Builder::Tester::Color'=> '1.21_01', + 'Test::More' => '0.97_01', + 'Test::Simple' => '0.97_01', + 'Tie::Hash' => '1.04', + 'Unicode::Collate' => '0.59', + 'Unicode::Collate::Locale'=> '0.59', + 'XS::APItest' => '0.21', + 'XS::APItest::KeywordRPN'=> '0.005', + 'XSLoader' => '0.11', + 'bigint' => '0.25', + 'bignum' => '0.25', + 'bigrat' => '0.25', + 'blib' => '1.06', + 'open' => '1.08', + 'threads::shared' => '1.33_03', + 'warnings' => '1.11', + 'warnings::register' => '1.02', + }, + removed => { + } + }, + 5.013006 => { + delta_from => 5.013005, + changed => { + 'Archive::Extract' => '0.44', + 'B' => '1.24', + 'B::Deparse' => '0.99', + 'CPAN' => '1.94_61', + 'CPAN::FTP' => '5.5005', + 'CPAN::Queue' => '5.5001', + 'CPAN::Version' => '5.5001', + 'Carp' => '1.19', + 'Carp::Heavy' => '1.19', + 'Compress::Raw::Bzip2' => '2.031', + 'Cwd' => '3.34', + 'Data::Dumper' => '2.129', + 'Devel::Peek' => '1.05', + 'Digest::MD5' => '2.51', + 'ExtUtils::Constant::Base'=> '0.05', + 'ExtUtils::Constant::ProxySubs'=> '0.07', + 'ExtUtils::Embed' => '1.29', + 'ExtUtils::XSSymSet' => '1.2', + 'Fcntl' => '1.09', + 'File::DosGlob' => '1.03', + 'File::Find' => '1.18', + 'File::Glob' => '1.09', + 'File::Spec' => '3.33', + 'File::Spec::Cygwin' => '3.33', + 'File::Spec::Epoc' => '3.33', + 'File::Spec::Functions' => '3.33', + 'File::Spec::Mac' => '3.33', + 'File::Spec::OS2' => '3.33', + 'File::Spec::Unix' => '3.33', + 'File::Spec::VMS' => '3.33', + 'File::Spec::Win32' => '3.33', + 'GDBM_File' => '1.11', + 'Hash::Util::FieldHash' => '1.05', + 'I18N::Langinfo' => '0.06', + 'IPC::Cmd' => '0.64', + 'IPC::Open3' => '1.07', + 'Locale::Codes' => '3.14', + 'Locale::Codes::Country'=> '3.14', + 'Locale::Codes::Currency'=> '3.14', + 'Locale::Codes::Language'=> '3.14', + 'Locale::Codes::Script' => '3.14', + 'Locale::Constants' => '3.14', + 'Locale::Country' => '3.14', + 'Locale::Currency' => '3.14', + 'Locale::Language' => '3.14', + 'Locale::Maketext' => '1.16', + 'Locale::Script' => '3.14', + 'Math::BigFloat' => '1.63', + 'Math::BigInt' => '1.97', + 'Math::BigInt::Calc' => '0.55', + 'Math::BigInt::CalcEmu' => '0.07', + 'Module::CoreList' => '2.40', + 'NDBM_File' => '1.09', + 'NEXT' => '0.65', + 'ODBM_File' => '1.08', + 'Opcode' => '1.16', + 'POSIX' => '1.21', + 'PerlIO::encoding' => '0.13', + 'PerlIO::scalar' => '0.10', + 'PerlIO::via' => '0.10', + 'Pod::Man' => '2.25', + 'Pod::Text' => '3.15', + 'SDBM_File' => '1.07', + 'Socket' => '1.90', + 'Sys::Hostname' => '1.13', + 'Tie::Hash::NamedCapture'=> '0.07', + 'Unicode::Collate' => '0.63', + 'Unicode::Collate::Locale'=> '0.63', + 'Unicode::Normalize' => '1.07', + 'XS::APItest' => '0.23', + 'XSLoader' => '0.13', + 'attributes' => '0.13', + 'charnames' => '1.16', + 'if' => '0.06', + 'mro' => '1.04', + 'overload' => '1.11', + 're' => '0.13', + 'sigtrap' => '1.05', + 'threads' => '1.81_01', + 'threads::shared' => '1.34', + }, + removed => { + 'XS::APItest::KeywordRPN'=> 1, + } + }, + 5.013007 => { + delta_from => 5.013006, + changed => { + 'Archive::Extract' => '0.46', + 'Archive::Tar' => '1.72', + 'Archive::Tar::Constant'=> '1.72', + 'Archive::Tar::File' => '1.72', + 'AutoLoader' => '5.71', + 'B' => '1.26', + 'B::Concise' => '0.81', + 'B::Deparse' => '1.01', + 'CGI' => '3.50', + 'CPAN' => '1.94_62', + 'CPANPLUS' => '0.9010', + 'CPANPLUS::Dist::Build' => '0.50', + 'CPANPLUS::Dist::Build::Constants'=> '0.50', + 'CPANPLUS::Internals' => '0.9010', + 'CPANPLUS::Shell::Default'=> '0.9010', + 'Data::Dumper' => '2.130_01', + 'DynaLoader' => '1.11', + 'ExtUtils::Constant' => '0.23', + 'ExtUtils::Constant::ProxySubs'=> '0.08', + 'Fcntl' => '1.10', + 'File::Fetch' => '0.28', + 'File::Glob' => '1.10', + 'File::stat' => '1.04', + 'GDBM_File' => '1.12', + 'Hash::Util' => '0.10', + 'Hash::Util::FieldHash' => '1.06', + 'I18N::Langinfo' => '0.07', + 'Locale::Maketext' => '1.17', + 'Locale::Maketext::Guts'=> '1.17', + 'Locale::Maketext::GutsLoader'=> '1.17', + 'MIME::Base64' => '3.10', + 'MIME::QuotedPrint' => '3.10', + 'Math::BigFloat' => '1.99_01', + 'Math::BigInt' => '1.99_01', + 'Math::BigInt::Calc' => '1.99_01', + 'Math::BigInt::CalcEmu' => '1.99_01', + 'Math::BigInt::FastCalc'=> '0.24_01', + 'Math::BigRat' => '0.26_01', + 'Module::CoreList' => '2.41', + 'NDBM_File' => '1.10', + 'ODBM_File' => '1.09', + 'Opcode' => '1.17', + 'POSIX' => '1.22', + 'Pod::Simple' => '3.15', + 'Pod::Simple::BlackBox' => '3.15', + 'Pod::Simple::Checker' => '3.15', + 'Pod::Simple::Debug' => '3.15', + 'Pod::Simple::DumpAsText'=> '3.15', + 'Pod::Simple::DumpAsXML'=> '3.15', + 'Pod::Simple::HTML' => '3.15', + 'Pod::Simple::HTMLBatch'=> '3.15', + 'Pod::Simple::LinkSection'=> '3.15', + 'Pod::Simple::Methody' => '3.15', + 'Pod::Simple::Progress' => '3.15', + 'Pod::Simple::PullParser'=> '3.15', + 'Pod::Simple::PullParserEndToken'=> '3.15', + 'Pod::Simple::PullParserStartToken'=> '3.15', + 'Pod::Simple::PullParserTextToken'=> '3.15', + 'Pod::Simple::PullParserToken'=> '3.15', + 'Pod::Simple::RTF' => '3.15', + 'Pod::Simple::Search' => '3.15', + 'Pod::Simple::SimpleTree'=> '3.15', + 'Pod::Simple::Text' => '3.15', + 'Pod::Simple::TextContent'=> '3.15', + 'Pod::Simple::TiedOutFH'=> '3.15', + 'Pod::Simple::Transcode'=> '3.15', + 'Pod::Simple::TranscodeDumb'=> '3.15', + 'Pod::Simple::TranscodeSmart'=> '3.15', + 'Pod::Simple::XHTML' => '3.15', + 'Pod::Simple::XMLOutStream'=> '3.15', + 'SDBM_File' => '1.08', + 'Safe' => '2.29', + 'SelfLoader' => '1.18', + 'Socket' => '1.91', + 'Storable' => '2.24', + 'Sys::Hostname' => '1.14', + 'Unicode' => '6.0.0', + 'Unicode::Collate' => '0.67', + 'Unicode::Collate::CJK::Big5'=> '0.65', + 'Unicode::Collate::CJK::GB2312'=> '0.65', + 'Unicode::Collate::CJK::JISX0208'=> '0.64', + 'Unicode::Collate::CJK::Korean'=> '0.66', + 'Unicode::Collate::CJK::Pinyin'=> '0.65', + 'Unicode::Collate::CJK::Stroke'=> '0.65', + 'Unicode::Collate::Locale'=> '0.67', + 'XS::APItest' => '0.26', + 'XS::Typemap' => '0.04', + 'charnames' => '1.17', + 'mro' => '1.05', + 'parent' => '0.224', + 're' => '0.14', + 'threads' => '1.81_02', + }, + removed => { + } + }, + 5.013008 => { + delta_from => 5.013007, + changed => { + 'Archive::Tar' => '1.74', + 'Archive::Tar::Constant'=> '1.74', + 'Archive::Tar::File' => '1.74', + 'B' => '1.27', + 'B::Concise' => '0.82', + 'B::Deparse' => '1.02', + 'Carp::Heavy' => '1.17', + 'Cwd' => '3.35', + 'Data::Dumper' => '2.130_02', + 'Devel::Peek' => '1.06', + 'Devel::SelfStubber' => '1.05', + 'Digest::SHA' => '5.50', + 'Dumpvalue' => '1.15', + 'DynaLoader' => '1.12', + 'Env' => '1.02', + 'Exporter::Heavy' => '5.64_01', + 'ExtUtils::CBuilder' => '0.280201', + 'ExtUtils::CBuilder::Base'=> '0.280201', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280201', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280201', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280201', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280201', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280201', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280201', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280201', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280201', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280201', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280201', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280201', + 'ExtUtils::Constant::Utils'=> '0.03', + 'ExtUtils::Embed' => '1.30', + 'ExtUtils::ParseXS' => '2.2208', + 'Fatal' => '2.1001', + 'Fcntl' => '1.11', + 'File::CheckTree' => '4.41', + 'File::Glob' => '1.11', + 'GDBM_File' => '1.13', + 'Hash::Util::FieldHash' => '1.07', + 'I18N::Collate' => '1.02', + 'IO' => '1.25_03', + 'IPC::Cmd' => '0.66', + 'IPC::Open3' => '1.08', + 'Locale::Codes' => '3.15', + 'Locale::Codes::Country'=> '3.15', + 'Locale::Codes::Currency'=> '3.15', + 'Locale::Codes::Language'=> '3.15', + 'Locale::Codes::Script' => '3.15', + 'Locale::Constants' => '3.15', + 'Locale::Country' => '3.15', + 'Locale::Currency' => '3.15', + 'Locale::Language' => '3.15', + 'Locale::Script' => '3.15', + 'MIME::Base64' => '3.13', + 'MIME::QuotedPrint' => '3.13', + 'Math::BigFloat' => '1.99_02', + 'Math::BigInt' => '1.99_02', + 'Math::BigInt::Calc' => '1.99_02', + 'Math::BigInt::CalcEmu' => '1.99_02', + 'Memoize' => '1.02', + 'Memoize::AnyDBM_File' => '1.02', + 'Memoize::Expire' => '1.02', + 'Memoize::ExpireFile' => '1.02', + 'Memoize::ExpireTest' => '1.02', + 'Memoize::NDBM_File' => '1.02', + 'Memoize::SDBM_File' => '1.02', + 'Memoize::Storable' => '1.02', + 'Module::CoreList' => '2.43', + 'NDBM_File' => '1.11', + 'Net::Ping' => '2.37', + 'ODBM_File' => '1.10', + 'Opcode' => '1.18', + 'POSIX' => '1.23', + 'PerlIO::encoding' => '0.14', + 'PerlIO::scalar' => '0.11', + 'PerlIO::via' => '0.11', + 'SDBM_File' => '1.09', + 'Socket' => '1.92', + 'Storable' => '2.25', + 'Time::HiRes' => '1.9721_01', + 'Unicode::Collate' => '0.6801', + 'Unicode::Collate::Locale'=> '0.68', + 'Unicode::Normalize' => '1.08', + 'Unicode::UCD' => '0.30', + 'Win32' => '0.41', + 'XS::APItest' => '0.27', + 'autodie' => '2.1001', + 'autodie::exception' => '2.1001', + 'autodie::exception::system'=> '2.1001', + 'autodie::hints' => '2.1001', + 'feature' => '1.19', + 'if' => '0.0601', + 'mro' => '1.06', + 'overload' => '1.12', + 're' => '0.15', + 'threads' => '1.81_03', + 'threads::shared' => '1.35', + 'version' => '0.86', + }, + removed => { + } + }, + 5.013009 => { + delta_from => 5.013008, + changed => { + 'Archive::Extract' => '0.48', + 'Archive::Tar' => '1.76', + 'Archive::Tar::Constant'=> '1.76', + 'Archive::Tar::File' => '1.76', + 'B::Concise' => '0.83', + 'B::Deparse' => '1.03', + 'B::Lint' => '1.13', + 'Benchmark' => '1.12', + 'CGI' => '3.51', + 'CGI::Carp' => '3.51', + 'CGI::Cookie' => '1.30', + 'CGI::Push' => '1.05', + 'CGI::Util' => '3.51', + 'CPAN' => '1.94_63', + 'CPAN::HTTP::Client' => '1.94', + 'CPAN::HTTP::Credentials'=> '1.94', + 'CPAN::Meta::YAML' => '0.003', + 'CPANPLUS' => '0.9011', + 'CPANPLUS::Dist::Build' => '0.52', + 'CPANPLUS::Dist::Build::Constants'=> '0.52', + 'CPANPLUS::Internals' => '0.9011', + 'CPANPLUS::Shell::Default'=> '0.9011', + 'Carp::Heavy' => '1.19', + 'Compress::Raw::Bzip2' => '2.033', + 'Compress::Raw::Zlib' => '2.033', + 'Compress::Zlib' => '2.033', + 'Cwd' => '3.36', + 'DBM_Filter' => '0.04', + 'DB_File' => '1.821', + 'Devel::Peek' => '1.07', + 'DirHandle' => '1.04', + 'Dumpvalue' => '1.16', + 'Encode' => '2.42', + 'Encode::Alias' => '2.13', + 'Encode::MIME::Header' => '2.13', + 'Exporter::Heavy' => '5.64_03', + 'ExtUtils::Install' => '1.56', + 'ExtUtils::ParseXS' => '2.2209', + 'File::Basename' => '2.80', + 'File::Copy' => '2.21', + 'File::DosGlob' => '1.04', + 'File::Fetch' => '0.32', + 'File::Find' => '1.19', + 'File::Spec::Mac' => '3.34', + 'File::Spec::VMS' => '3.34', + 'File::stat' => '1.05', + 'HTTP::Tiny' => '0.009', + 'Hash::Util::FieldHash' => '1.08', + 'IO::Compress::Adapter::Bzip2'=> '2.033', + 'IO::Compress::Adapter::Deflate'=> '2.033', + 'IO::Compress::Adapter::Identity'=> '2.033', + 'IO::Compress::Base' => '2.033', + 'IO::Compress::Base::Common'=> '2.033', + 'IO::Compress::Bzip2' => '2.033', + 'IO::Compress::Deflate' => '2.033', + 'IO::Compress::Gzip' => '2.033', + 'IO::Compress::Gzip::Constants'=> '2.033', + 'IO::Compress::RawDeflate'=> '2.033', + 'IO::Compress::Zip' => '2.033', + 'IO::Compress::Zip::Constants'=> '2.033', + 'IO::Compress::Zlib::Constants'=> '2.033', + 'IO::Compress::Zlib::Extra'=> '2.033', + 'IO::Handle' => '1.29', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.033', + 'IO::Uncompress::Adapter::Identity'=> '2.033', + 'IO::Uncompress::Adapter::Inflate'=> '2.033', + 'IO::Uncompress::AnyInflate'=> '2.033', + 'IO::Uncompress::AnyUncompress'=> '2.033', + 'IO::Uncompress::Base' => '2.033', + 'IO::Uncompress::Bunzip2'=> '2.033', + 'IO::Uncompress::Gunzip'=> '2.033', + 'IO::Uncompress::Inflate'=> '2.033', + 'IO::Uncompress::RawInflate'=> '2.033', + 'IO::Uncompress::Unzip' => '2.033', + 'IPC::Cmd' => '0.68', + 'IPC::Open3' => '1.09', + 'JSON::PP' => '2.27103', + 'JSON::PP::Boolean' => undef, + 'Locale::Maketext' => '1.18', + 'Log::Message' => '0.04', + 'Log::Message::Config' => '0.04', + 'Log::Message::Handlers'=> '0.04', + 'Log::Message::Item' => '0.04', + 'Log::Message::Simple' => '0.08', + 'Math::BigFloat' => '1.99_03', + 'Math::BigInt' => '1.99_03', + 'Math::BigInt::Calc' => '1.99_03', + 'Math::BigInt::FastCalc'=> '0.24_02', + 'Math::BigRat' => '0.26_02', + 'Module::CoreList' => '2.42_01', + 'Module::Load::Conditional'=> '0.40', + 'Module::Metadata' => '1.000003', + 'Net::Ping' => '2.38', + 'OS2::Process' => '1.05', + 'Object::Accessor' => '0.38', + 'POSIX' => '1.24', + 'Params::Check' => '0.28', + 'Perl::OSType' => '1.002', + 'Pod::LaTeX' => '0.59', + 'Pod::Perldoc' => '3.15_03', + 'Socket' => '1.93', + 'Storable' => '2.26', + 'Sys::Hostname' => '1.15', + 'Term::UI' => '0.24', + 'Thread::Queue' => '2.12', + 'Thread::Semaphore' => '2.12', + 'Time::Local' => '1.2000', + 'UNIVERSAL' => '1.08', + 'Unicode::Normalize' => '1.10', + 'Win32' => '0.44', + 'bigint' => '0.26', + 'bignum' => '0.26', + 'bigrat' => '0.26', + 'charnames' => '1.18', + 'diagnostics' => '1.21', + 're' => '0.16', + 'threads' => '1.83', + 'threads::shared' => '1.36', + 'version' => '0.88', + }, + removed => { + } + }, + 5.01301 => { + delta_from => 5.013009, + changed => { + 'Attribute::Handlers' => '0.89', + 'B' => '1.28', + 'B::Showlex' => '1.03', + 'CGI' => '3.52', + 'CPAN' => '1.94_65', + 'CPAN::Distribution' => '1.9601', + 'CPAN::FTP::netrc' => '1.01', + 'CPAN::FirstTime' => '5.5303', + 'CPAN::HandleConfig' => '5.5003', + 'CPAN::Meta' => '2.110440', + 'CPAN::Meta::Converter' => '2.110440', + 'CPAN::Meta::Feature' => '2.110440', + 'CPAN::Meta::History' => '2.110440', + 'CPAN::Meta::Prereqs' => '2.110440', + 'CPAN::Meta::Spec' => '2.110440', + 'CPAN::Meta::Validator' => '2.110440', + 'CPAN::Shell' => '5.5002', + 'CPANPLUS' => '0.9101', + 'CPANPLUS::Internals' => '0.9101', + 'CPANPLUS::Shell::Default'=> '0.9101', + 'Carp' => '1.20', + 'Carp::Heavy' => '1.20', + 'Cwd' => '3.37', + 'Devel::DProf' => '20110217.00', + 'DynaLoader' => '1.13', + 'ExtUtils::CBuilder' => '0.280202', + 'ExtUtils::CBuilder::Base'=> '0.280202', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280202', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280202', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280202', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280202', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280202', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280202', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280202', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280202', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280202', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280202', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280202', + 'File::Copy' => '2.22', + 'Filter::Simple' => '0.86', + 'HTTP::Tiny' => '0.010', + 'I18N::LangTags::Detect'=> '1.05', + 'IO::Select' => '1.18', + 'IPC::Cmd' => '0.70', + 'Locale::Maketext' => '1.19', + 'Math::BigFloat' => '1.992', + 'Math::BigInt' => '1.992', + 'Math::BigInt::Calc' => '1.992', + 'Math::BigInt::CalcEmu' => '1.992', + 'Module::Build' => '0.37_05', + 'Module::Build::Base' => '0.37_05', + 'Module::Build::Compat' => '0.37_05', + 'Module::Build::Config' => '0.37_05', + 'Module::Build::Cookbook'=> '0.37_05', + 'Module::Build::Dumper' => '0.37_05', + 'Module::Build::ModuleInfo'=> '0.37_05', + 'Module::Build::Notes' => '0.37_05', + 'Module::Build::PPMMaker'=> '0.37_05', + 'Module::Build::Platform::Amiga'=> '0.37_05', + 'Module::Build::Platform::Default'=> '0.37_05', + 'Module::Build::Platform::EBCDIC'=> '0.37_05', + 'Module::Build::Platform::MPEiX'=> '0.37_05', + 'Module::Build::Platform::MacOS'=> '0.37_05', + 'Module::Build::Platform::RiscOS'=> '0.37_05', + 'Module::Build::Platform::Unix'=> '0.37_05', + 'Module::Build::Platform::VMS'=> '0.37_05', + 'Module::Build::Platform::VOS'=> '0.37_05', + 'Module::Build::Platform::Windows'=> '0.37_05', + 'Module::Build::Platform::aix'=> '0.37_05', + 'Module::Build::Platform::cygwin'=> '0.37_05', + 'Module::Build::Platform::darwin'=> '0.37_05', + 'Module::Build::Platform::os2'=> '0.37_05', + 'Module::Build::PodParser'=> '0.37_05', + 'Module::Build::Version'=> '0.87', + 'Module::Build::YAML' => '1.41', + 'Module::CoreList' => '2.45', + 'Module::Load::Conditional'=> '0.44', + 'Module::Metadata' => '1.000004', + 'OS2::Process' => '1.06', + 'Parse::CPAN::Meta' => '1.4401', + 'Pod::Html' => '1.1', + 'Socket' => '1.94', + 'Term::UI' => '0.26', + 'Unicode::Collate' => '0.72', + 'Unicode::Collate::Locale'=> '0.71', + 'Unicode::UCD' => '0.31', + 'VMS::DCLsym' => '1.05', + 'Version::Requirements' => '0.101020', + 'bigrat' => '0.27', + 'deprecate' => '0.02', + 'diagnostics' => '1.22', + 'inc::latest' => '0.37_05', + 'overload' => '1.13', + 're' => '0.17', + 'utf8' => '1.09', + 'warnings' => '1.12', + }, + removed => { + } + }, + 5.013011 => { + delta_from => 5.01301, + changed => { + 'App::Prove' => '3.23', + 'App::Prove::State' => '3.23', + 'App::Prove::State::Result'=> '3.23', + 'App::Prove::State::Result::Test'=> '3.23', + 'B' => '1.29', + 'CPAN' => '1.9600', + 'CPAN::Author' => '5.5001', + 'CPAN::CacheMgr' => '5.5001', + 'CPAN::Distribution' => '1.9602', + 'CPAN::Exception::blocked_urllist'=> '1.001', + 'CPAN::HTTP::Client' => '1.9600', + 'CPAN::HTTP::Credentials'=> '1.9600', + 'CPAN::Index' => '1.9600', + 'CPAN::LWP::UserAgent' => '1.9600', + 'CPAN::Mirrors' => '1.9600', + 'CPAN::Module' => '5.5001', + 'CPANPLUS' => '0.9103', + 'CPANPLUS::Dist::Build' => '0.54', + 'CPANPLUS::Dist::Build::Constants'=> '0.54', + 'CPANPLUS::Internals' => '0.9103', + 'CPANPLUS::Shell::Default'=> '0.9103', + 'Cwd' => '3.36', + 'Devel::DProf' => '20110228.00', + 'Digest::SHA' => '5.61', + 'ExtUtils::Command' => '1.17', + 'File::Basename' => '2.81', + 'File::Copy' => '2.21', + 'File::Glob' => '1.12', + 'GDBM_File' => '1.14', + 'HTTP::Tiny' => '0.011', + 'Hash::Util' => '0.11', + 'Hash::Util::FieldHash' => '1.09', + 'I18N::Langinfo' => '0.08', + 'IO' => '1.25_04', + 'IO::Dir' => '1.08', + 'IO::File' => '1.15', + 'IO::Handle' => '1.30', + 'IO::Pipe' => '1.14', + 'IO::Poll' => '0.08', + 'IO::Select' => '1.20', + 'JSON::PP' => '2.27105', + 'Locale::Codes' => '3.16', + 'Locale::Codes::Country'=> '3.16', + 'Locale::Codes::Currency'=> '3.16', + 'Locale::Codes::Language'=> '3.16', + 'Locale::Codes::Script' => '3.16', + 'Locale::Constants' => '3.16', + 'Locale::Country' => '3.16', + 'Locale::Currency' => '3.16', + 'Locale::Language' => '3.16', + 'Locale::Script' => '3.16', + 'Math::BigFloat' => '1.993', + 'Math::BigInt' => '1.994', + 'Math::BigInt::Calc' => '1.993', + 'Math::BigInt::CalcEmu' => '1.993', + 'Math::BigInt::FastCalc'=> '0.28', + 'Module::Build' => '0.3800', + 'Module::Build::Base' => '0.3800', + 'Module::Build::Compat' => '0.3800', + 'Module::Build::Config' => '0.3800', + 'Module::Build::Cookbook'=> '0.3800', + 'Module::Build::Dumper' => '0.3800', + 'Module::Build::ModuleInfo'=> '0.3800', + 'Module::Build::Notes' => '0.3800', + 'Module::Build::PPMMaker'=> '0.3800', + 'Module::Build::Platform::Amiga'=> '0.3800', + 'Module::Build::Platform::Default'=> '0.3800', + 'Module::Build::Platform::EBCDIC'=> '0.3800', + 'Module::Build::Platform::MPEiX'=> '0.3800', + 'Module::Build::Platform::MacOS'=> '0.3800', + 'Module::Build::Platform::RiscOS'=> '0.3800', + 'Module::Build::Platform::Unix'=> '0.3800', + 'Module::Build::Platform::VMS'=> '0.3800', + 'Module::Build::Platform::VOS'=> '0.3800', + 'Module::Build::Platform::Windows'=> '0.3800', + 'Module::Build::Platform::aix'=> '0.3800', + 'Module::Build::Platform::cygwin'=> '0.3800', + 'Module::Build::Platform::darwin'=> '0.3800', + 'Module::Build::Platform::os2'=> '0.3800', + 'Module::Build::PodParser'=> '0.3800', + 'Module::CoreList' => '2.46', + 'NDBM_File' => '1.12', + 'Pod::Simple' => '3.16', + 'Pod::Simple::BlackBox' => '3.16', + 'Pod::Simple::Checker' => '3.16', + 'Pod::Simple::Debug' => '3.16', + 'Pod::Simple::DumpAsText'=> '3.16', + 'Pod::Simple::DumpAsXML'=> '3.16', + 'Pod::Simple::HTML' => '3.16', + 'Pod::Simple::HTMLBatch'=> '3.16', + 'Pod::Simple::LinkSection'=> '3.16', + 'Pod::Simple::Methody' => '3.16', + 'Pod::Simple::Progress' => '3.16', + 'Pod::Simple::PullParser'=> '3.16', + 'Pod::Simple::PullParserEndToken'=> '3.16', + 'Pod::Simple::PullParserStartToken'=> '3.16', + 'Pod::Simple::PullParserTextToken'=> '3.16', + 'Pod::Simple::PullParserToken'=> '3.16', + 'Pod::Simple::RTF' => '3.16', + 'Pod::Simple::Search' => '3.16', + 'Pod::Simple::SimpleTree'=> '3.16', + 'Pod::Simple::Text' => '3.16', + 'Pod::Simple::TextContent'=> '3.16', + 'Pod::Simple::TiedOutFH'=> '3.16', + 'Pod::Simple::Transcode'=> '3.16', + 'Pod::Simple::TranscodeDumb'=> '3.16', + 'Pod::Simple::TranscodeSmart'=> '3.16', + 'Pod::Simple::XHTML' => '3.16', + 'Pod::Simple::XMLOutStream'=> '3.16', + 'Storable' => '2.27', + 'Sys::Hostname' => '1.16', + 'TAP::Base' => '3.23', + 'TAP::Formatter::Base' => '3.23', + 'TAP::Formatter::Color' => '3.23', + 'TAP::Formatter::Console'=> '3.23', + 'TAP::Formatter::Console::ParallelSession'=> '3.23', + 'TAP::Formatter::Console::Session'=> '3.23', + 'TAP::Formatter::File' => '3.23', + 'TAP::Formatter::File::Session'=> '3.23', + 'TAP::Formatter::Session'=> '3.23', + 'TAP::Harness' => '3.23', + 'TAP::Object' => '3.23', + 'TAP::Parser' => '3.23', + 'TAP::Parser::Aggregator'=> '3.23', + 'TAP::Parser::Grammar' => '3.23', + 'TAP::Parser::Iterator' => '3.23', + 'TAP::Parser::Iterator::Array'=> '3.23', + 'TAP::Parser::Iterator::Process'=> '3.23', + 'TAP::Parser::Iterator::Stream'=> '3.23', + 'TAP::Parser::IteratorFactory'=> '3.23', + 'TAP::Parser::Multiplexer'=> '3.23', + 'TAP::Parser::Result' => '3.23', + 'TAP::Parser::Result::Bailout'=> '3.23', + 'TAP::Parser::Result::Comment'=> '3.23', + 'TAP::Parser::Result::Plan'=> '3.23', + 'TAP::Parser::Result::Pragma'=> '3.23', + 'TAP::Parser::Result::Test'=> '3.23', + 'TAP::Parser::Result::Unknown'=> '3.23', + 'TAP::Parser::Result::Version'=> '3.23', + 'TAP::Parser::Result::YAML'=> '3.23', + 'TAP::Parser::ResultFactory'=> '3.23', + 'TAP::Parser::Scheduler'=> '3.23', + 'TAP::Parser::Scheduler::Job'=> '3.23', + 'TAP::Parser::Scheduler::Spinner'=> '3.23', + 'TAP::Parser::Source' => '3.23', + 'TAP::Parser::SourceHandler'=> '3.23', + 'TAP::Parser::SourceHandler::Executable'=> '3.23', + 'TAP::Parser::SourceHandler::File'=> '3.23', + 'TAP::Parser::SourceHandler::Handle'=> '3.23', + 'TAP::Parser::SourceHandler::Perl'=> '3.23', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.23', + 'TAP::Parser::Utils' => '3.23', + 'TAP::Parser::YAMLish::Reader'=> '3.23', + 'TAP::Parser::YAMLish::Writer'=> '3.23', + 'Test::Builder' => '0.98', + 'Test::Builder::Module' => '0.98', + 'Test::Builder::Tester' => '1.22', + 'Test::Builder::Tester::Color'=> '1.22', + 'Test::Harness' => '3.23', + 'Test::More' => '0.98', + 'Test::Simple' => '0.98', + 'Tie::Hash::NamedCapture'=> '0.08', + 'Tie::RefHash' => '1.39', + 'Unicode::Collate' => '0.73', + 'Unicode::Collate::Locale'=> '0.73', + 'Unicode::UCD' => '0.32', + 'XS::Typemap' => '0.05', + 'attributes' => '0.14', + 'base' => '2.16', + 'inc::latest' => '0.3800', + 'mro' => '1.07', + 'parent' => '0.225', + }, + removed => { + } + }, + 5.014 => { + delta_from => 5.013011, + changed => { + 'ExtUtils::CBuilder' => '0.280203', + 'ExtUtils::CBuilder::Base'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280203', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280203', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280203', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280203', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280203', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280203', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280203', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280203', + 'ExtUtils::ParseXS' => '2.2210', + 'File::Basename' => '2.82', + 'HTTP::Tiny' => '0.012', + 'IO::Handle' => '1.31', + 'Module::CoreList' => '2.49', + 'PerlIO' => '1.07', + 'Pod::Html' => '1.11', + 'XS::APItest' => '0.28', + 'bigint' => '0.27', + 'bignum' => '0.27', + 'bigrat' => '0.28', + 'constant' => '1.21', + 'feature' => '1.20', + 're' => '0.18', + 'threads::shared' => '1.37', + }, + removed => { + } + }, + 5.014001 => { + delta_from => 5.014, + changed => { + 'B::Deparse' => '1.04', + 'Module::CoreList' => '2.49_01', + 'Pod::Perldoc' => '3.15_04', + }, + removed => { + } + }, + 5.014002 => { + delta_from => 5.014001, + changed => { + 'CPAN' => '1.9600_01', + 'CPAN::Distribution' => '1.9602_01', + 'Devel::DProf::dprof::V'=> undef, + 'Encode' => '2.42_01', + 'File::Glob' => '1.13', + 'Module::CoreList' => '2.49_02', + 'PerlIO::scalar' => '0.11_01', + 'Time::Piece::Seconds' => undef, + }, + removed => { + } + }, + 5.014003 => { + delta_from => 5.014002, + changed => { + 'Digest' => '1.16_01', + 'IPC::Open3' => '1.09_01', + 'Module::CoreList' => '2.49_04', + }, + removed => { + } + }, + 5.014004 => { + delta_from => 5.014003, + changed => { + 'Encode' => '2.42_02', + 'IPC::Open3' => '1.0901', + 'Module::CoreList' => '2.49_06', + }, + removed => { + } + }, + 5.015 => { + delta_from => 5.014001, + changed => { + 'Archive::Extract' => '0.52', + 'Attribute::Handlers' => '0.91', + 'B' => '1.30', + 'B::Concise' => '0.84', + 'B::Deparse' => '1.05', + 'Benchmark' => '1.13', + 'CGI' => '3.54', + 'CGI::Util' => '3.53', + 'CPAN::Meta' => '2.110930', + 'CPAN::Meta::Converter' => '2.110930', + 'CPAN::Meta::Feature' => '2.110930', + 'CPAN::Meta::History' => '2.110930', + 'CPAN::Meta::Prereqs' => '2.110930', + 'CPAN::Meta::Spec' => '2.110930', + 'CPAN::Meta::Validator' => '2.110930', + 'CPANPLUS' => '0.9105', + 'CPANPLUS::Dist::Build' => '0.56', + 'CPANPLUS::Dist::Build::Constants'=> '0.56', + 'CPANPLUS::Internals' => '0.9105', + 'CPANPLUS::Shell::Default'=> '0.9105', + 'Compress::Raw::Bzip2' => '2.035', + 'Compress::Raw::Zlib' => '2.035', + 'Compress::Zlib' => '2.035', + 'DB_File' => '1.822', + 'Data::Dumper' => '2.131', + 'Devel::Peek' => '1.08', + 'Digest::SHA' => '5.62', + 'Encode' => '2.43', + 'Encode::Alias' => '2.14', + 'ExtUtils::CBuilder' => '0.280204', + 'ExtUtils::CBuilder::Base'=> '0.280204', + 'Fatal' => '2.10', + 'File::Spec::Win32' => '3.34', + 'Filter::Simple' => '0.87', + 'Filter::Util::Call' => '1.39', + 'FindBin' => '1.51', + 'Hash::Util::FieldHash' => '1.10', + 'I18N::LangTags' => '0.36', + 'IO::Compress::Adapter::Bzip2'=> '2.035', + 'IO::Compress::Adapter::Deflate'=> '2.035', + 'IO::Compress::Adapter::Identity'=> '2.035', + 'IO::Compress::Base' => '2.035', + 'IO::Compress::Base::Common'=> '2.035', + 'IO::Compress::Bzip2' => '2.035', + 'IO::Compress::Deflate' => '2.035', + 'IO::Compress::Gzip' => '2.035', + 'IO::Compress::Gzip::Constants'=> '2.035', + 'IO::Compress::RawDeflate'=> '2.035', + 'IO::Compress::Zip' => '2.035', + 'IO::Compress::Zip::Constants'=> '2.035', + 'IO::Compress::Zlib::Constants'=> '2.035', + 'IO::Compress::Zlib::Extra'=> '2.035', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.035', + 'IO::Uncompress::Adapter::Identity'=> '2.035', + 'IO::Uncompress::Adapter::Inflate'=> '2.035', + 'IO::Uncompress::AnyInflate'=> '2.035', + 'IO::Uncompress::AnyUncompress'=> '2.035', + 'IO::Uncompress::Base' => '2.035', + 'IO::Uncompress::Bunzip2'=> '2.035', + 'IO::Uncompress::Gunzip'=> '2.035', + 'IO::Uncompress::Inflate'=> '2.035', + 'IO::Uncompress::RawInflate'=> '2.035', + 'IO::Uncompress::Unzip' => '2.035', + 'IPC::Open2' => '1.04', + 'IPC::Open3' => '1.11', + 'JSON::PP' => '2.27200', + 'Math::BigFloat' => '1.994', + 'Math::BigInt' => '1.995', + 'Math::Complex' => '1.57', + 'Math::Trig' => '1.21', + 'Module::CoreList' => '2.51', + 'ODBM_File' => '1.11', + 'Object::Accessor' => '0.42', + 'Opcode' => '1.19', + 'PerlIO::encoding' => '0.15', + 'PerlIO::scalar' => '0.12', + 'Pod::Perldoc' => '3.15_05', + 'Storable' => '2.28', + 'Sys::Syslog' => '0.29', + 'Time::HiRes' => '1.9722', + 'Unicode::Collate' => '0.76', + 'Unicode::Collate::CJK::Pinyin'=> '0.76', + 'Unicode::Collate::CJK::Stroke'=> '0.76', + 'Unicode::Collate::Locale'=> '0.76', + 'Unicode::Normalize' => '1.12', + 'XS::APItest' => '0.29', + 'XSLoader' => '0.15', + 'autodie' => '2.10', + 'autodie::exception' => '2.10', + 'autodie::exception::system'=> '2.10', + 'autodie::hints' => '2.10', + 'base' => '2.17', + 'charnames' => '1.22', + 'constant' => '1.22', + 'feature' => '1.21', + 'mro' => '1.08', + 'overload' => '1.14', + 'threads::shared' => '1.38', + 'vmsish' => '1.03', + }, + removed => { + 'Devel::DProf' => 1, + 'Shell' => 1, + } + }, + 5.015001 => { + delta_from => 5.015, + changed => { + 'B::Deparse' => '1.06', + 'CGI' => '3.55', + 'CPAN::Meta' => '2.110930001', + 'CPAN::Meta::Converter' => '2.110930001', + 'CPANPLUS' => '0.9108', + 'CPANPLUS::Internals' => '0.9108', + 'CPANPLUS::Shell::Default'=> '0.9108', + 'Carp' => '1.21', + 'Carp::Heavy' => '1.21', + 'Compress::Raw::Bzip2' => '2.037', + 'Compress::Raw::Zlib' => '2.037', + 'Compress::Zlib' => '2.037', + 'Cwd' => '3.37', + 'Env' => '1.03', + 'ExtUtils::Command::MM' => '6.58', + 'ExtUtils::Liblist' => '6.58', + 'ExtUtils::Liblist::Kid'=> '6.58', + 'ExtUtils::MM' => '6.58', + 'ExtUtils::MM_AIX' => '6.58', + 'ExtUtils::MM_Any' => '6.58', + 'ExtUtils::MM_BeOS' => '6.58', + 'ExtUtils::MM_Cygwin' => '6.58', + 'ExtUtils::MM_DOS' => '6.58', + 'ExtUtils::MM_Darwin' => '6.58', + 'ExtUtils::MM_MacOS' => '6.58', + 'ExtUtils::MM_NW5' => '6.58', + 'ExtUtils::MM_OS2' => '6.58', + 'ExtUtils::MM_QNX' => '6.58', + 'ExtUtils::MM_UWIN' => '6.58', + 'ExtUtils::MM_Unix' => '6.58', + 'ExtUtils::MM_VMS' => '6.58', + 'ExtUtils::MM_VOS' => '6.58', + 'ExtUtils::MM_Win32' => '6.58', + 'ExtUtils::MM_Win95' => '6.58', + 'ExtUtils::MY' => '6.58', + 'ExtUtils::MakeMaker' => '6.58', + 'ExtUtils::MakeMaker::Config'=> '6.58', + 'ExtUtils::Mkbootstrap' => '6.58', + 'ExtUtils::Mksymlists' => '6.58', + 'ExtUtils::ParseXS' => '3.00_01', + 'ExtUtils::ParseXS::Constants'=> undef, + 'ExtUtils::ParseXS::CountLines'=> undef, + 'ExtUtils::ParseXS::Utilities'=> undef, + 'ExtUtils::Typemaps' => '1.00', + 'ExtUtils::Typemaps::InputMap'=> undef, + 'ExtUtils::Typemaps::OutputMap'=> undef, + 'ExtUtils::Typemaps::Type'=> '0.05', + 'ExtUtils::testlib' => '6.58', + 'File::Basename' => '2.83', + 'File::Find' => '1.20', + 'HTTP::Tiny' => '0.013', + 'I18N::Langinfo' => '0.08_02', + 'IO::Compress::Adapter::Bzip2'=> '2.037', + 'IO::Compress::Adapter::Deflate'=> '2.037', + 'IO::Compress::Adapter::Identity'=> '2.037', + 'IO::Compress::Base' => '2.037', + 'IO::Compress::Base::Common'=> '2.037', + 'IO::Compress::Bzip2' => '2.037', + 'IO::Compress::Deflate' => '2.037', + 'IO::Compress::Gzip' => '2.037', + 'IO::Compress::Gzip::Constants'=> '2.037', + 'IO::Compress::RawDeflate'=> '2.037', + 'IO::Compress::Zip' => '2.037', + 'IO::Compress::Zip::Constants'=> '2.037', + 'IO::Compress::Zlib::Constants'=> '2.037', + 'IO::Compress::Zlib::Extra'=> '2.037', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.037', + 'IO::Uncompress::Adapter::Identity'=> '2.037', + 'IO::Uncompress::Adapter::Inflate'=> '2.037', + 'IO::Uncompress::AnyInflate'=> '2.037', + 'IO::Uncompress::AnyUncompress'=> '2.037', + 'IO::Uncompress::Base' => '2.037', + 'IO::Uncompress::Bunzip2'=> '2.037', + 'IO::Uncompress::Gunzip'=> '2.037', + 'IO::Uncompress::Inflate'=> '2.037', + 'IO::Uncompress::RawInflate'=> '2.037', + 'IO::Uncompress::Unzip' => '2.037', + 'IPC::Cmd' => '0.72', + 'Locale::Codes' => '3.17', + 'Locale::Codes::Constants'=> '3.17', + 'Locale::Codes::Country'=> '3.17', + 'Locale::Codes::Country_Codes'=> '3.17', + 'Locale::Codes::Currency'=> '3.17', + 'Locale::Codes::Currency_Codes'=> '3.17', + 'Locale::Codes::LangExt'=> '3.17', + 'Locale::Codes::LangExt_Codes'=> '3.17', + 'Locale::Codes::LangVar'=> '3.17', + 'Locale::Codes::LangVar_Codes'=> '3.17', + 'Locale::Codes::Language'=> '3.17', + 'Locale::Codes::Language_Codes'=> '3.17', + 'Locale::Codes::Script' => '3.17', + 'Locale::Codes::Script_Codes'=> '3.17', + 'Locale::Country' => '3.17', + 'Locale::Currency' => '3.17', + 'Locale::Language' => '3.17', + 'Locale::Script' => '3.17', + 'Math::BigFloat::Trace' => '0.28', + 'Math::BigInt::FastCalc'=> '0.29', + 'Math::BigInt::Trace' => '0.28', + 'Math::BigRat' => '0.2602', + 'Math::Complex' => '1.58', + 'Math::Trig' => '1.22', + 'Module::CoreList' => '2.54', + 'OS2::Process' => '1.07', + 'Pod::Perldoc' => '3.15_06', + 'Pod::Simple' => '3.18', + 'Pod::Simple::BlackBox' => '3.18', + 'Pod::Simple::Checker' => '3.18', + 'Pod::Simple::Debug' => '3.18', + 'Pod::Simple::DumpAsText'=> '3.18', + 'Pod::Simple::DumpAsXML'=> '3.18', + 'Pod::Simple::HTML' => '3.18', + 'Pod::Simple::HTMLBatch'=> '3.18', + 'Pod::Simple::LinkSection'=> '3.18', + 'Pod::Simple::Methody' => '3.18', + 'Pod::Simple::Progress' => '3.18', + 'Pod::Simple::PullParser'=> '3.18', + 'Pod::Simple::PullParserEndToken'=> '3.18', + 'Pod::Simple::PullParserStartToken'=> '3.18', + 'Pod::Simple::PullParserTextToken'=> '3.18', + 'Pod::Simple::PullParserToken'=> '3.18', + 'Pod::Simple::RTF' => '3.18', + 'Pod::Simple::Search' => '3.18', + 'Pod::Simple::SimpleTree'=> '3.18', + 'Pod::Simple::Text' => '3.18', + 'Pod::Simple::TextContent'=> '3.18', + 'Pod::Simple::TiedOutFH'=> '3.18', + 'Pod::Simple::Transcode'=> '3.18', + 'Pod::Simple::TranscodeDumb'=> '3.18', + 'Pod::Simple::TranscodeSmart'=> '3.18', + 'Pod::Simple::XHTML' => '3.18', + 'Pod::Simple::XMLOutStream'=> '3.18', + 'Storable' => '2.31', + 'Sys::Syslog::Win32' => undef, + 'Time::HiRes' => '1.9724', + 'Unicode::Collate' => '0.77', + 'Unicode::UCD' => '0.33', + 'Win32API::File' => '0.1200', + 'XS::APItest' => '0.30', + 'attributes' => '0.15', + 'bigint' => '0.28', + 'bignum' => '0.28', + 'charnames' => '1.23', + 'diagnostics' => '1.23', + 'feature' => '1.22', + 'overload' => '1.15', + 'perlfaq' => '5.015000', + 'threads' => '1.84', + 'version' => '0.93', + }, + removed => { + 'ExtUtils::MakeMaker::YAML'=> 1, + 'Locale::Constants' => 1, + 'Sys::Syslog::win32::Win32'=> 1, + } + }, + 5.015002 => { + delta_from => 5.015001, + changed => { + 'Attribute::Handlers' => '0.92', + 'B' => '1.31', + 'B::Concise' => '0.85', + 'B::Deparse' => '1.07', + 'B::Terse' => '1.06', + 'B::Xref' => '1.03', + 'CPAN' => '1.9800', + 'CPAN::Exception::yaml_process_error'=> '5.5', + 'CPAN::Meta' => '2.112150', + 'CPAN::Meta::Converter' => '2.112150', + 'CPAN::Meta::Feature' => '2.112150', + 'CPAN::Meta::History' => '2.112150', + 'CPAN::Meta::Prereqs' => '2.112150', + 'CPAN::Meta::Spec' => '2.112150', + 'CPAN::Meta::Validator' => '2.112150', + 'CPANPLUS' => '0.9109', + 'CPANPLUS::Internals' => '0.9109', + 'CPANPLUS::Shell::Default'=> '0.9109', + 'DB_File' => '1.824', + 'Data::Dumper' => '2.132', + 'Encode' => '2.44', + 'Encode::Alias' => '2.15', + 'Encode::Encoder' => '2.02', + 'Encode::Guess' => '2.05', + 'ExtUtils::Command::MM' => '6.59', + 'ExtUtils::Install' => '1.57', + 'ExtUtils::Installed' => '1.999002', + 'ExtUtils::Liblist' => '6.59', + 'ExtUtils::Liblist::Kid'=> '6.59', + 'ExtUtils::MM' => '6.59', + 'ExtUtils::MM_AIX' => '6.59', + 'ExtUtils::MM_Any' => '6.59', + 'ExtUtils::MM_BeOS' => '6.59', + 'ExtUtils::MM_Cygwin' => '6.59', + 'ExtUtils::MM_DOS' => '6.59', + 'ExtUtils::MM_Darwin' => '6.59', + 'ExtUtils::MM_MacOS' => '6.59', + 'ExtUtils::MM_NW5' => '6.59', + 'ExtUtils::MM_OS2' => '6.59', + 'ExtUtils::MM_QNX' => '6.59', + 'ExtUtils::MM_UWIN' => '6.59', + 'ExtUtils::MM_Unix' => '6.59', + 'ExtUtils::MM_VMS' => '6.59', + 'ExtUtils::MM_VOS' => '6.59', + 'ExtUtils::MM_Win32' => '6.59', + 'ExtUtils::MM_Win95' => '6.59', + 'ExtUtils::MY' => '6.59', + 'ExtUtils::MakeMaker' => '6.59', + 'ExtUtils::MakeMaker::Config'=> '6.59', + 'ExtUtils::Manifest' => '1.60', + 'ExtUtils::Mkbootstrap' => '6.59', + 'ExtUtils::Mksymlists' => '6.59', + 'ExtUtils::ParseXS' => '3.03_01', + 'ExtUtils::Typemaps' => '1.01', + 'ExtUtils::testlib' => '6.59', + 'File::Spec' => '3.34', + 'File::Spec::Mac' => '3.35', + 'File::Spec::Unix' => '3.34', + 'File::Spec::VMS' => '3.35', + 'File::Spec::Win32' => '3.35', + 'I18N::LangTags' => '0.37', + 'IO' => '1.25_05', + 'IO::Handle' => '1.32', + 'IO::Socket' => '1.33', + 'IO::Socket::INET' => '1.32', + 'IPC::Open3' => '1.12', + 'Math::BigFloat' => '1.995', + 'Math::BigFloat::Trace' => '0.29', + 'Math::BigInt' => '1.996', + 'Math::BigInt::Trace' => '0.29', + 'Module::Build' => '0.39_01', + 'Module::Build::Base' => '0.39_01', + 'Module::Build::Compat' => '0.39_01', + 'Module::Build::Config' => '0.39_01', + 'Module::Build::Cookbook'=> '0.39_01', + 'Module::Build::Dumper' => '0.39_01', + 'Module::Build::ModuleInfo'=> '0.39_01', + 'Module::Build::Notes' => '0.39_01', + 'Module::Build::PPMMaker'=> '0.39_01', + 'Module::Build::Platform::Amiga'=> '0.39_01', + 'Module::Build::Platform::Default'=> '0.39_01', + 'Module::Build::Platform::EBCDIC'=> '0.39_01', + 'Module::Build::Platform::MPEiX'=> '0.39_01', + 'Module::Build::Platform::MacOS'=> '0.39_01', + 'Module::Build::Platform::RiscOS'=> '0.39_01', + 'Module::Build::Platform::Unix'=> '0.39_01', + 'Module::Build::Platform::VMS'=> '0.39_01', + 'Module::Build::Platform::VOS'=> '0.39_01', + 'Module::Build::Platform::Windows'=> '0.39_01', + 'Module::Build::Platform::aix'=> '0.39_01', + 'Module::Build::Platform::cygwin'=> '0.39_01', + 'Module::Build::Platform::darwin'=> '0.39_01', + 'Module::Build::Platform::os2'=> '0.39_01', + 'Module::Build::PodParser'=> '0.39_01', + 'Module::CoreList' => '2.55', + 'Module::Load' => '0.20', + 'Module::Metadata' => '1.000005_01', + 'Opcode' => '1.20', + 'Params::Check' => '0.32', + 'PerlIO::via' => '0.12', + 'Term::ANSIColor' => '3.01', + 'Unicode::Collate' => '0.78', + 'Unicode::Normalize' => '1.13', + 'Unicode::UCD' => '0.34', + 'bigint' => '0.29', + 'bignum' => '0.29', + 'bigrat' => '0.29', + 'diagnostics' => '1.24', + 'fields' => '2.16', + 'inc::latest' => '0.39_01', + }, + removed => { + } + }, + 5.015003 => { + delta_from => 5.015002, + changed => { + 'AnyDBM_File' => '1.01', + 'Archive::Extract' => '0.56', + 'Archive::Tar' => '1.78', + 'Archive::Tar::Constant'=> '1.78', + 'Archive::Tar::File' => '1.78', + 'Attribute::Handlers' => '0.93', + 'B' => '1.32', + 'B::Concise' => '0.86', + 'B::Deparse' => '1.08', + 'CPAN::Meta' => '2.112621', + 'CPAN::Meta::Converter' => '2.112621', + 'CPAN::Meta::Feature' => '2.112621', + 'CPAN::Meta::History' => '2.112621', + 'CPAN::Meta::Prereqs' => '2.112621', + 'CPAN::Meta::Spec' => '2.112621', + 'CPAN::Meta::Validator' => '2.112621', + 'CPAN::Meta::YAML' => '0.004', + 'CPANPLUS' => '0.9111', + 'CPANPLUS::Dist::Build' => '0.58', + 'CPANPLUS::Dist::Build::Constants'=> '0.58', + 'CPANPLUS::Internals' => '0.9111', + 'CPANPLUS::Shell::Default'=> '0.9111', + 'Carp' => '1.23', + 'Carp::Heavy' => '1.23', + 'Data::Dumper' => '2.134', + 'Devel::PPPort' => '3.20', + 'Errno' => '1.14', + 'Exporter' => '5.65', + 'Exporter::Heavy' => '5.65', + 'ExtUtils::ParseXS' => '3.04_04', + 'ExtUtils::ParseXS::Constants'=> '3.04_04', + 'ExtUtils::ParseXS::CountLines'=> '3.04_04', + 'ExtUtils::ParseXS::Utilities'=> '3.04_04', + 'ExtUtils::Typemaps' => '1.02', + 'File::Glob' => '1.13', + 'Filter::Simple' => '0.88', + 'IO' => '1.25_06', + 'IO::Handle' => '1.33', + 'Locale::Codes' => '3.18', + 'Locale::Codes::Constants'=> '3.18', + 'Locale::Codes::Country'=> '3.18', + 'Locale::Codes::Country_Codes'=> '3.18', + 'Locale::Codes::Currency'=> '3.18', + 'Locale::Codes::Currency_Codes'=> '3.18', + 'Locale::Codes::LangExt'=> '3.18', + 'Locale::Codes::LangExt_Codes'=> '3.18', + 'Locale::Codes::LangVar'=> '3.18', + 'Locale::Codes::LangVar_Codes'=> '3.18', + 'Locale::Codes::Language'=> '3.18', + 'Locale::Codes::Language_Codes'=> '3.18', + 'Locale::Codes::Script' => '3.18', + 'Locale::Codes::Script_Codes'=> '3.18', + 'Locale::Country' => '3.18', + 'Locale::Currency' => '3.18', + 'Locale::Language' => '3.18', + 'Locale::Script' => '3.18', + 'Math::BigFloat' => '1.997', + 'Math::BigInt' => '1.997', + 'Math::BigInt::Calc' => '1.997', + 'Math::BigInt::CalcEmu' => '1.997', + 'Math::BigInt::FastCalc'=> '0.30', + 'Math::BigRat' => '0.2603', + 'Module::CoreList' => '2.56', + 'Module::Load::Conditional'=> '0.46', + 'Module::Metadata' => '1.000007', + 'ODBM_File' => '1.12', + 'POSIX' => '1.26', + 'Pod::Perldoc' => '3.15_07', + 'Pod::Simple' => '3.19', + 'Pod::Simple::BlackBox' => '3.19', + 'Pod::Simple::Checker' => '3.19', + 'Pod::Simple::Debug' => '3.19', + 'Pod::Simple::DumpAsText'=> '3.19', + 'Pod::Simple::DumpAsXML'=> '3.19', + 'Pod::Simple::HTML' => '3.19', + 'Pod::Simple::HTMLBatch'=> '3.19', + 'Pod::Simple::LinkSection'=> '3.19', + 'Pod::Simple::Methody' => '3.19', + 'Pod::Simple::Progress' => '3.19', + 'Pod::Simple::PullParser'=> '3.19', + 'Pod::Simple::PullParserEndToken'=> '3.19', + 'Pod::Simple::PullParserStartToken'=> '3.19', + 'Pod::Simple::PullParserTextToken'=> '3.19', + 'Pod::Simple::PullParserToken'=> '3.19', + 'Pod::Simple::RTF' => '3.19', + 'Pod::Simple::Search' => '3.19', + 'Pod::Simple::SimpleTree'=> '3.19', + 'Pod::Simple::Text' => '3.19', + 'Pod::Simple::TextContent'=> '3.19', + 'Pod::Simple::TiedOutFH'=> '3.19', + 'Pod::Simple::Transcode'=> '3.19', + 'Pod::Simple::TranscodeDumb'=> '3.19', + 'Pod::Simple::TranscodeSmart'=> '3.19', + 'Pod::Simple::XHTML' => '3.19', + 'Pod::Simple::XMLOutStream'=> '3.19', + 'Search::Dict' => '1.04', + 'Socket' => '1.94_01', + 'Storable' => '2.32', + 'Text::Abbrev' => '1.02', + 'Tie::Array' => '1.05', + 'UNIVERSAL' => '1.09', + 'Unicode::UCD' => '0.35', + 'XS::APItest' => '0.31', + 'XSLoader' => '0.16', + 'attributes' => '0.16', + 'diagnostics' => '1.25', + 'open' => '1.09', + 'perlfaq' => '5.0150034', + 'threads' => '1.85', + 'threads::shared' => '1.40', + }, + removed => { + } + }, + 5.015004 => { + delta_from => 5.015003, + changed => { + 'Archive::Tar' => '1.80', + 'Archive::Tar::Constant'=> '1.80', + 'Archive::Tar::File' => '1.80', + 'Digest' => '1.17', + 'DynaLoader' => '1.14', + 'ExtUtils::Command::MM' => '6.61_01', + 'ExtUtils::Liblist' => '6.61_01', + 'ExtUtils::Liblist::Kid'=> '6.61_01', + 'ExtUtils::MM' => '6.61_01', + 'ExtUtils::MM_AIX' => '6.61_01', + 'ExtUtils::MM_Any' => '6.61_01', + 'ExtUtils::MM_BeOS' => '6.61_01', + 'ExtUtils::MM_Cygwin' => '6.61_01', + 'ExtUtils::MM_DOS' => '6.61_01', + 'ExtUtils::MM_Darwin' => '6.61_01', + 'ExtUtils::MM_MacOS' => '6.61_01', + 'ExtUtils::MM_NW5' => '6.61_01', + 'ExtUtils::MM_OS2' => '6.61_01', + 'ExtUtils::MM_QNX' => '6.61_01', + 'ExtUtils::MM_UWIN' => '6.61_01', + 'ExtUtils::MM_Unix' => '6.61_01', + 'ExtUtils::MM_VMS' => '6.61_01', + 'ExtUtils::MM_VOS' => '6.61_01', + 'ExtUtils::MM_Win32' => '6.61_01', + 'ExtUtils::MM_Win95' => '6.61_01', + 'ExtUtils::MY' => '6.61_01', + 'ExtUtils::MakeMaker' => '6.61_01', + 'ExtUtils::MakeMaker::Config'=> '6.61_01', + 'ExtUtils::Mkbootstrap' => '6.61_01', + 'ExtUtils::Mksymlists' => '6.61_01', + 'ExtUtils::ParseXS' => '3.05', + 'ExtUtils::ParseXS::Constants'=> '3.05', + 'ExtUtils::ParseXS::CountLines'=> '3.05', + 'ExtUtils::ParseXS::Utilities'=> '3.05', + 'ExtUtils::testlib' => '6.61_01', + 'File::DosGlob' => '1.05', + 'Module::CoreList' => '2.57', + 'Module::Load' => '0.22', + 'Unicode::Collate' => '0.80', + 'Unicode::Collate::Locale'=> '0.80', + 'Unicode::UCD' => '0.36', + 'XS::APItest' => '0.32', + 'XS::Typemap' => '0.07', + 'attributes' => '0.17', + 'base' => '2.18', + 'constant' => '1.23', + 'mro' => '1.09', + 'open' => '1.10', + 'perlfaq' => '5.0150035', + }, + removed => { + } + }, + 5.015005 => { + delta_from => 5.015004, + changed => { + 'Archive::Extract' => '0.58', + 'B::Concise' => '0.87', + 'B::Deparse' => '1.09', + 'CGI' => '3.58', + 'CGI::Fast' => '1.09', + 'CPANPLUS' => '0.9112', + 'CPANPLUS::Dist::Build' => '0.60', + 'CPANPLUS::Dist::Build::Constants'=> '0.60', + 'CPANPLUS::Internals' => '0.9112', + 'CPANPLUS::Shell::Default'=> '0.9112', + 'Compress::Raw::Bzip2' => '2.042', + 'Compress::Raw::Zlib' => '2.042', + 'Compress::Zlib' => '2.042', + 'Digest::SHA' => '5.63', + 'Errno' => '1.15', + 'ExtUtils::Command::MM' => '6.63_02', + 'ExtUtils::Liblist' => '6.63_02', + 'ExtUtils::Liblist::Kid'=> '6.63_02', + 'ExtUtils::MM' => '6.63_02', + 'ExtUtils::MM_AIX' => '6.63_02', + 'ExtUtils::MM_Any' => '6.63_02', + 'ExtUtils::MM_BeOS' => '6.63_02', + 'ExtUtils::MM_Cygwin' => '6.63_02', + 'ExtUtils::MM_DOS' => '6.63_02', + 'ExtUtils::MM_Darwin' => '6.63_02', + 'ExtUtils::MM_MacOS' => '6.63_02', + 'ExtUtils::MM_NW5' => '6.63_02', + 'ExtUtils::MM_OS2' => '6.63_02', + 'ExtUtils::MM_QNX' => '6.63_02', + 'ExtUtils::MM_UWIN' => '6.63_02', + 'ExtUtils::MM_Unix' => '6.63_02', + 'ExtUtils::MM_VMS' => '6.63_02', + 'ExtUtils::MM_VOS' => '6.63_02', + 'ExtUtils::MM_Win32' => '6.63_02', + 'ExtUtils::MM_Win95' => '6.63_02', + 'ExtUtils::MY' => '6.63_02', + 'ExtUtils::MakeMaker' => '6.63_02', + 'ExtUtils::MakeMaker::Config'=> '6.63_02', + 'ExtUtils::Mkbootstrap' => '6.63_02', + 'ExtUtils::Mksymlists' => '6.63_02', + 'ExtUtils::testlib' => '6.63_02', + 'File::DosGlob' => '1.06', + 'File::Glob' => '1.14', + 'HTTP::Tiny' => '0.016', + 'IO::Compress::Adapter::Bzip2'=> '2.042', + 'IO::Compress::Adapter::Deflate'=> '2.042', + 'IO::Compress::Adapter::Identity'=> '2.042', + 'IO::Compress::Base' => '2.042', + 'IO::Compress::Base::Common'=> '2.042', + 'IO::Compress::Bzip2' => '2.042', + 'IO::Compress::Deflate' => '2.042', + 'IO::Compress::Gzip' => '2.042', + 'IO::Compress::Gzip::Constants'=> '2.042', + 'IO::Compress::RawDeflate'=> '2.042', + 'IO::Compress::Zip' => '2.042', + 'IO::Compress::Zip::Constants'=> '2.042', + 'IO::Compress::Zlib::Constants'=> '2.042', + 'IO::Compress::Zlib::Extra'=> '2.042', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.042', + 'IO::Uncompress::Adapter::Identity'=> '2.042', + 'IO::Uncompress::Adapter::Inflate'=> '2.042', + 'IO::Uncompress::AnyInflate'=> '2.042', + 'IO::Uncompress::AnyUncompress'=> '2.042', + 'IO::Uncompress::Base' => '2.042', + 'IO::Uncompress::Bunzip2'=> '2.042', + 'IO::Uncompress::Gunzip'=> '2.042', + 'IO::Uncompress::Inflate'=> '2.042', + 'IO::Uncompress::RawInflate'=> '2.042', + 'IO::Uncompress::Unzip' => '2.042', + 'Locale::Maketext' => '1.20', + 'Locale::Maketext::Guts'=> '1.20', + 'Locale::Maketext::GutsLoader'=> '1.20', + 'Module::CoreList' => '2.58', + 'Opcode' => '1.21', + 'Socket' => '1.94_02', + 'Storable' => '2.33', + 'UNIVERSAL' => '1.10', + 'Unicode::Collate' => '0.85', + 'Unicode::Collate::CJK::Pinyin'=> '0.85', + 'Unicode::Collate::CJK::Stroke'=> '0.85', + 'Unicode::Collate::Locale'=> '0.85', + 'Unicode::UCD' => '0.37', + 'XS::APItest' => '0.33', + 'arybase' => '0.01', + 'charnames' => '1.24', + 'feature' => '1.23', + 'perlfaq' => '5.0150036', + 'strict' => '1.05', + 'unicore::Name' => undef, + }, + removed => { + } + }, + 5.015006 => { + delta_from => 5.015005, + changed => { + 'Archive::Tar' => '1.82', + 'Archive::Tar::Constant'=> '1.82', + 'Archive::Tar::File' => '1.82', + 'AutoLoader' => '5.72', + 'B::Concise' => '0.88', + 'B::Debug' => '1.17', + 'B::Deparse' => '1.10', + 'CPAN::Meta::YAML' => '0.005', + 'CPANPLUS' => '0.9113', + 'CPANPLUS::Internals' => '0.9113', + 'CPANPLUS::Shell::Default'=> '0.9113', + 'Carp' => '1.24', + 'Compress::Raw::Bzip2' => '2.045', + 'Compress::Raw::Zlib' => '2.045', + 'Compress::Zlib' => '2.045', + 'Cwd' => '3.38', + 'DB' => '1.04', + 'Data::Dumper' => '2.135_01', + 'Digest::SHA' => '5.70', + 'Dumpvalue' => '1.17', + 'Exporter' => '5.66', + 'Exporter::Heavy' => '5.66', + 'ExtUtils::CBuilder' => '0.280205', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280204', + 'ExtUtils::Packlist' => '1.45', + 'ExtUtils::ParseXS' => '3.08', + 'ExtUtils::ParseXS::Constants'=> '3.08', + 'ExtUtils::ParseXS::CountLines'=> '3.08', + 'ExtUtils::ParseXS::Utilities'=> '3.08', + 'File::Basename' => '2.84', + 'File::Glob' => '1.15', + 'File::Spec::Unix' => '3.35', + 'Getopt::Std' => '1.07', + 'I18N::LangTags' => '0.38', + 'IO::Compress::Adapter::Bzip2'=> '2.045', + 'IO::Compress::Adapter::Deflate'=> '2.045', + 'IO::Compress::Adapter::Identity'=> '2.045', + 'IO::Compress::Base' => '2.046', + 'IO::Compress::Base::Common'=> '2.045', + 'IO::Compress::Bzip2' => '2.045', + 'IO::Compress::Deflate' => '2.045', + 'IO::Compress::Gzip' => '2.045', + 'IO::Compress::Gzip::Constants'=> '2.045', + 'IO::Compress::RawDeflate'=> '2.045', + 'IO::Compress::Zip' => '2.046', + 'IO::Compress::Zip::Constants'=> '2.045', + 'IO::Compress::Zlib::Constants'=> '2.045', + 'IO::Compress::Zlib::Extra'=> '2.045', + 'IO::Dir' => '1.09', + 'IO::File' => '1.16', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.045', + 'IO::Uncompress::Adapter::Identity'=> '2.045', + 'IO::Uncompress::Adapter::Inflate'=> '2.045', + 'IO::Uncompress::AnyInflate'=> '2.045', + 'IO::Uncompress::AnyUncompress'=> '2.045', + 'IO::Uncompress::Base' => '2.046', + 'IO::Uncompress::Bunzip2'=> '2.045', + 'IO::Uncompress::Gunzip'=> '2.045', + 'IO::Uncompress::Inflate'=> '2.045', + 'IO::Uncompress::RawInflate'=> '2.045', + 'IO::Uncompress::Unzip' => '2.046', + 'Locale::Codes' => '3.20', + 'Locale::Codes::Constants'=> '3.20', + 'Locale::Codes::Country'=> '3.20', + 'Locale::Codes::Country_Codes'=> '3.20', + 'Locale::Codes::Country_Retired'=> '3.20', + 'Locale::Codes::Currency'=> '3.20', + 'Locale::Codes::Currency_Codes'=> '3.20', + 'Locale::Codes::Currency_Retired'=> '3.20', + 'Locale::Codes::LangExt'=> '3.20', + 'Locale::Codes::LangExt_Codes'=> '3.20', + 'Locale::Codes::LangExt_Retired'=> '3.20', + 'Locale::Codes::LangFam'=> '3.20', + 'Locale::Codes::LangFam_Codes'=> '3.20', + 'Locale::Codes::LangFam_Retired'=> '3.20', + 'Locale::Codes::LangVar'=> '3.20', + 'Locale::Codes::LangVar_Codes'=> '3.20', + 'Locale::Codes::LangVar_Retired'=> '3.20', + 'Locale::Codes::Language'=> '3.20', + 'Locale::Codes::Language_Codes'=> '3.20', + 'Locale::Codes::Language_Retired'=> '3.20', + 'Locale::Codes::Script' => '3.20', + 'Locale::Codes::Script_Codes'=> '3.20', + 'Locale::Codes::Script_Retired'=> '3.20', + 'Locale::Country' => '3.20', + 'Locale::Currency' => '3.20', + 'Locale::Language' => '3.20', + 'Locale::Maketext' => '1.21', + 'Locale::Script' => '3.20', + 'Module::CoreList' => '2.59', + 'Module::Loaded' => '0.08', + 'Opcode' => '1.22', + 'POSIX' => '1.27', + 'Pod::Html' => '1.12', + 'Pod::LaTeX' => '0.60', + 'Pod::Perldoc' => '3.15_08', + 'Safe' => '2.30', + 'SelfLoader' => '1.20', + 'Socket' => '1.97', + 'Storable' => '2.34', + 'UNIVERSAL' => '1.11', + 'Unicode::Collate' => '0.87', + 'Unicode::Collate::Locale'=> '0.87', + 'XS::APItest' => '0.34', + 'arybase' => '0.02', + 'charnames' => '1.27', + 'diagnostics' => '1.26', + 'feature' => '1.24', + 'if' => '0.0602', + 'overload' => '1.16', + 'sigtrap' => '1.06', + 'strict' => '1.06', + 'threads' => '1.86', + 'version' => '0.96', + }, + removed => { + } + }, + 5.015007 => { + delta_from => 5.015006, + changed => { + 'B' => '1.33', + 'B::Deparse' => '1.11', + 'CGI' => '3.59', + 'CPAN::Meta' => '2.113640', + 'CPAN::Meta::Converter' => '2.113640', + 'CPAN::Meta::Feature' => '2.113640', + 'CPAN::Meta::History' => '2.113640', + 'CPAN::Meta::Prereqs' => '2.113640', + 'CPAN::Meta::Requirements'=> '2.113640', + 'CPAN::Meta::Spec' => '2.113640', + 'CPAN::Meta::Validator' => '2.113640', + 'CPANPLUS' => '0.9116', + 'CPANPLUS::Internals' => '0.9116', + 'CPANPLUS::Shell::Default'=> '0.9116', + 'Cwd' => '3.39_01', + 'Data::Dumper' => '2.135_03', + 'Devel::InnerPackage' => '0.4', + 'ExtUtils::CBuilder::Base'=> '0.280205', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280205', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280205', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280205', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280205', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280205', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280205', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280205', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280205', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280205', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280205', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280205', + 'ExtUtils::Manifest' => '1.61', + 'ExtUtils::Packlist' => '1.46', + 'ExtUtils::ParseXS' => '3.12', + 'ExtUtils::ParseXS::Constants'=> '3.12', + 'ExtUtils::ParseXS::CountLines'=> '3.12', + 'ExtUtils::ParseXS::Utilities'=> '3.12', + 'ExtUtils::Typemaps' => '1.03', + 'ExtUtils::Typemaps::Cmd'=> undef, + 'ExtUtils::Typemaps::Type'=> '0.06', + 'File::Glob' => '1.16', + 'File::Spec' => '3.39_01', + 'File::Spec::Cygwin' => '3.39_01', + 'File::Spec::Epoc' => '3.39_01', + 'File::Spec::Functions' => '3.39_01', + 'File::Spec::Mac' => '3.39_01', + 'File::Spec::OS2' => '3.39_01', + 'File::Spec::Unix' => '3.39_01', + 'File::Spec::VMS' => '3.39_01', + 'File::Spec::Win32' => '3.39_01', + 'IO::Dir' => '1.10', + 'IO::Pipe' => '1.15', + 'IO::Poll' => '0.09', + 'IO::Select' => '1.21', + 'IO::Socket' => '1.34', + 'IO::Socket::INET' => '1.33', + 'IO::Socket::UNIX' => '1.24', + 'Locale::Maketext' => '1.22', + 'Math::BigInt' => '1.998', + 'Module::CoreList' => '2.60', + 'Module::Pluggable' => '4.0', + 'POSIX' => '1.28', + 'PerlIO::scalar' => '0.13', + 'Pod::Html' => '1.13', + 'Pod::Perldoc' => '3.15_15', + 'Pod::Perldoc::BaseTo' => '3.15_15', + 'Pod::Perldoc::GetOptsOO'=> '3.15_15', + 'Pod::Perldoc::ToANSI' => '3.15_15', + 'Pod::Perldoc::ToChecker'=> '3.15_15', + 'Pod::Perldoc::ToMan' => '3.15_15', + 'Pod::Perldoc::ToNroff' => '3.15_15', + 'Pod::Perldoc::ToPod' => '3.15_15', + 'Pod::Perldoc::ToRtf' => '3.15_15', + 'Pod::Perldoc::ToTerm' => '3.15_15', + 'Pod::Perldoc::ToText' => '3.15_15', + 'Pod::Perldoc::ToTk' => '3.15_15', + 'Pod::Perldoc::ToXml' => '3.15_15', + 'Term::UI' => '0.30', + 'Tie::File' => '0.98', + 'Unicode::UCD' => '0.39', + 'Version::Requirements' => '0.101021', + 'XS::APItest' => '0.35', + '_charnames' => '1.28', + 'arybase' => '0.03', + 'autouse' => '1.07', + 'charnames' => '1.28', + 'diagnostics' => '1.27', + 'feature' => '1.25', + 'overload' => '1.17', + 'overloading' => '0.02', + 'perlfaq' => '5.0150038', + }, + removed => { + } + }, + 5.015008 => { + delta_from => 5.015007, + changed => { + 'B' => '1.34', + 'B::Deparse' => '1.12', + 'CPAN::Meta' => '2.120351', + 'CPAN::Meta::Converter' => '2.120351', + 'CPAN::Meta::Feature' => '2.120351', + 'CPAN::Meta::History' => '2.120351', + 'CPAN::Meta::Prereqs' => '2.120351', + 'CPAN::Meta::Requirements'=> '2.120351', + 'CPAN::Meta::Spec' => '2.120351', + 'CPAN::Meta::Validator' => '2.120351', + 'CPAN::Meta::YAML' => '0.007', + 'CPANPLUS' => '0.9118', + 'CPANPLUS::Dist::Build' => '0.62', + 'CPANPLUS::Dist::Build::Constants'=> '0.62', + 'CPANPLUS::Internals' => '0.9118', + 'CPANPLUS::Shell::Default'=> '0.9118', + 'Carp' => '1.25', + 'Carp::Heavy' => '1.25', + 'Compress::Raw::Bzip2' => '2.048', + 'Compress::Raw::Zlib' => '2.048', + 'Compress::Zlib' => '2.048', + 'Cwd' => '3.39_02', + 'DB_File' => '1.826', + 'Data::Dumper' => '2.135_05', + 'English' => '1.05', + 'ExtUtils::Install' => '1.58', + 'ExtUtils::ParseXS' => '3.16', + 'ExtUtils::ParseXS::Constants'=> '3.16', + 'ExtUtils::ParseXS::CountLines'=> '3.16', + 'ExtUtils::ParseXS::Utilities'=> '3.16', + 'ExtUtils::Typemaps' => '3.16', + 'ExtUtils::Typemaps::Cmd'=> '3.16', + 'ExtUtils::Typemaps::InputMap'=> '3.16', + 'ExtUtils::Typemaps::OutputMap'=> '3.16', + 'ExtUtils::Typemaps::Type'=> '3.16', + 'File::Copy' => '2.23', + 'File::Glob' => '1.17', + 'File::Spec' => '3.39_02', + 'File::Spec::Cygwin' => '3.39_02', + 'File::Spec::Epoc' => '3.39_02', + 'File::Spec::Functions' => '3.39_02', + 'File::Spec::Mac' => '3.39_02', + 'File::Spec::OS2' => '3.39_02', + 'File::Spec::Unix' => '3.39_02', + 'File::Spec::VMS' => '3.39_02', + 'File::Spec::Win32' => '3.39_02', + 'Filter::Util::Call' => '1.40', + 'IO::Compress::Adapter::Bzip2'=> '2.048', + 'IO::Compress::Adapter::Deflate'=> '2.048', + 'IO::Compress::Adapter::Identity'=> '2.048', + 'IO::Compress::Base' => '2.048', + 'IO::Compress::Base::Common'=> '2.048', + 'IO::Compress::Bzip2' => '2.048', + 'IO::Compress::Deflate' => '2.048', + 'IO::Compress::Gzip' => '2.048', + 'IO::Compress::Gzip::Constants'=> '2.048', + 'IO::Compress::RawDeflate'=> '2.048', + 'IO::Compress::Zip' => '2.048', + 'IO::Compress::Zip::Constants'=> '2.048', + 'IO::Compress::Zlib::Constants'=> '2.048', + 'IO::Compress::Zlib::Extra'=> '2.048', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.048', + 'IO::Uncompress::Adapter::Identity'=> '2.048', + 'IO::Uncompress::Adapter::Inflate'=> '2.048', + 'IO::Uncompress::AnyInflate'=> '2.048', + 'IO::Uncompress::AnyUncompress'=> '2.048', + 'IO::Uncompress::Base' => '2.048', + 'IO::Uncompress::Bunzip2'=> '2.048', + 'IO::Uncompress::Gunzip'=> '2.048', + 'IO::Uncompress::Inflate'=> '2.048', + 'IO::Uncompress::RawInflate'=> '2.048', + 'IO::Uncompress::Unzip' => '2.048', + 'IPC::Cmd' => '0.76', + 'Math::Complex' => '1.59', + 'Math::Trig' => '1.23', + 'Module::Metadata' => '1.000009', + 'Opcode' => '1.23', + 'POSIX' => '1.30', + 'Parse::CPAN::Meta' => '1.4402', + 'PerlIO::mmap' => '0.010', + 'Pod::Checker' => '1.51', + 'Pod::Find' => '1.51', + 'Pod::Functions' => '1.05', + 'Pod::Html' => '1.14', + 'Pod::InputObjects' => '1.51', + 'Pod::ParseUtils' => '1.51', + 'Pod::Parser' => '1.51', + 'Pod::PlainText' => '2.05', + 'Pod::Select' => '1.51', + 'Pod::Usage' => '1.51', + 'Safe' => '2.31', + 'Socket' => '1.98', + 'Term::Cap' => '1.13', + 'Term::ReadLine' => '1.08', + 'Time::HiRes' => '1.9725', + 'Unicode' => '6.1.0', + 'Unicode::UCD' => '0.41', + 'Version::Requirements' => '0.101022', + 'XS::APItest' => '0.36', + 'XS::Typemap' => '0.08', + '_charnames' => '1.29', + 'arybase' => '0.04', + 'charnames' => '1.29', + 'diagnostics' => '1.28', + 'feature' => '1.26', + 'locale' => '1.01', + 'overload' => '1.18', + 'perlfaq' => '5.0150039', + 're' => '0.19', + 'subs' => '1.01', + 'warnings' => '1.13', + }, + removed => { + } + }, + 5.015009 => { + delta_from => 5.015008, + changed => { + 'B::Deparse' => '1.13', + 'B::Lint' => '1.14', + 'B::Lint::Debug' => '1.14', + 'CPAN::Meta' => '2.120630', + 'CPAN::Meta::Converter' => '2.120630', + 'CPAN::Meta::Feature' => '2.120630', + 'CPAN::Meta::History' => '2.120630', + 'CPAN::Meta::Prereqs' => '2.120630', + 'CPAN::Meta::Requirements'=> '2.120630', + 'CPAN::Meta::Spec' => '2.120630', + 'CPAN::Meta::Validator' => '2.120630', + 'CPANPLUS' => '0.9121', + 'CPANPLUS::Internals' => '0.9121', + 'CPANPLUS::Shell::Default'=> '0.9121', + 'Data::Dumper' => '2.135_06', + 'Digest::SHA' => '5.71', + 'ExtUtils::CBuilder' => '0.280206', + 'ExtUtils::CBuilder::Base'=> '0.280206', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280206', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280206', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280206', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280206', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280206', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280206', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280206', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280206', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280206', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280206', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280206', + 'HTTP::Tiny' => '0.017', + 'Locale::Codes' => '3.21', + 'Locale::Codes::Constants'=> '3.21', + 'Locale::Codes::Country'=> '3.21', + 'Locale::Codes::Country_Codes'=> '3.21', + 'Locale::Codes::Country_Retired'=> '3.21', + 'Locale::Codes::Currency'=> '3.21', + 'Locale::Codes::Currency_Codes'=> '3.21', + 'Locale::Codes::Currency_Retired'=> '3.21', + 'Locale::Codes::LangExt'=> '3.21', + 'Locale::Codes::LangExt_Codes'=> '3.21', + 'Locale::Codes::LangExt_Retired'=> '3.21', + 'Locale::Codes::LangFam'=> '3.21', + 'Locale::Codes::LangFam_Codes'=> '3.21', + 'Locale::Codes::LangFam_Retired'=> '3.21', + 'Locale::Codes::LangVar'=> '3.21', + 'Locale::Codes::LangVar_Codes'=> '3.21', + 'Locale::Codes::LangVar_Retired'=> '3.21', + 'Locale::Codes::Language'=> '3.21', + 'Locale::Codes::Language_Codes'=> '3.21', + 'Locale::Codes::Language_Retired'=> '3.21', + 'Locale::Codes::Script' => '3.21', + 'Locale::Codes::Script_Codes'=> '3.21', + 'Locale::Codes::Script_Retired'=> '3.21', + 'Locale::Country' => '3.21', + 'Locale::Currency' => '3.21', + 'Locale::Language' => '3.21', + 'Locale::Script' => '3.21', + 'Module::CoreList' => '2.65', + 'Pod::Html' => '1.1501', + 'Pod::Perldoc' => '3.17', + 'Pod::Perldoc::BaseTo' => '3.17', + 'Pod::Perldoc::GetOptsOO'=> '3.17', + 'Pod::Perldoc::ToANSI' => '3.17', + 'Pod::Perldoc::ToChecker'=> '3.17', + 'Pod::Perldoc::ToMan' => '3.17', + 'Pod::Perldoc::ToNroff' => '3.17', + 'Pod::Perldoc::ToPod' => '3.17', + 'Pod::Perldoc::ToRtf' => '3.17', + 'Pod::Perldoc::ToTerm' => '3.17', + 'Pod::Perldoc::ToText' => '3.17', + 'Pod::Perldoc::ToTk' => '3.17', + 'Pod::Perldoc::ToXml' => '3.17', + 'Pod::Simple' => '3.20', + 'Pod::Simple::BlackBox' => '3.20', + 'Pod::Simple::Checker' => '3.20', + 'Pod::Simple::Debug' => '3.20', + 'Pod::Simple::DumpAsText'=> '3.20', + 'Pod::Simple::DumpAsXML'=> '3.20', + 'Pod::Simple::HTML' => '3.20', + 'Pod::Simple::HTMLBatch'=> '3.20', + 'Pod::Simple::LinkSection'=> '3.20', + 'Pod::Simple::Methody' => '3.20', + 'Pod::Simple::Progress' => '3.20', + 'Pod::Simple::PullParser'=> '3.20', + 'Pod::Simple::PullParserEndToken'=> '3.20', + 'Pod::Simple::PullParserStartToken'=> '3.20', + 'Pod::Simple::PullParserTextToken'=> '3.20', + 'Pod::Simple::PullParserToken'=> '3.20', + 'Pod::Simple::RTF' => '3.20', + 'Pod::Simple::Search' => '3.20', + 'Pod::Simple::SimpleTree'=> '3.20', + 'Pod::Simple::Text' => '3.20', + 'Pod::Simple::TextContent'=> '3.20', + 'Pod::Simple::TiedOutFH'=> '3.20', + 'Pod::Simple::Transcode'=> '3.20', + 'Pod::Simple::TranscodeDumb'=> '3.20', + 'Pod::Simple::TranscodeSmart'=> '3.20', + 'Pod::Simple::XHTML' => '3.20', + 'Pod::Simple::XMLOutStream'=> '3.20', + 'Socket' => '2.000', + 'Term::ReadLine' => '1.09', + 'Unicode::Collate' => '0.89', + 'Unicode::Collate::CJK::Korean'=> '0.88', + 'Unicode::Collate::Locale'=> '0.89', + 'Unicode::Normalize' => '1.14', + 'Unicode::UCD' => '0.42', + 'XS::APItest' => '0.37', + 'arybase' => '0.05', + 'attributes' => '0.18', + 'charnames' => '1.30', + 'feature' => '1.27', + }, + removed => { + } + }, + 5.016 => { + delta_from => 5.015009, + changed => { + 'B::Concise' => '0.89', + 'B::Deparse' => '1.14', + 'Carp' => '1.26', + 'Carp::Heavy' => '1.26', + 'IO::Socket' => '1.35', + 'Module::CoreList' => '2.66', + 'PerlIO::scalar' => '0.14', + 'Pod::Html' => '1.1502', + 'Safe' => '2.31_01', + 'Socket' => '2.001', + 'Unicode::UCD' => '0.43', + 'XS::APItest' => '0.38', + '_charnames' => '1.31', + 'attributes' => '0.19', + 'strict' => '1.07', + 'version' => '0.99', + }, + removed => { + } + }, + 5.016001 => { + delta_from => 5.016, + changed => { + 'B' => '1.35', + 'B::Deparse' => '1.14_01', + 'List::Util' => '1.25', + 'List::Util::PP' => '1.25', + 'List::Util::XS' => '1.25', + 'Module::CoreList' => '2.70', + 'PerlIO::scalar' => '0.14_01', + 'Scalar::Util' => '1.25', + 'Scalar::Util::PP' => '1.25', + 're' => '0.19_01', + }, + removed => { + } + }, + 5.016002 => { + delta_from => 5.016001, + changed => { + 'Module::CoreList' => '2.76', + }, + removed => { + } + }, + 5.016003 => { + delta_from => 5.016002, + changed => { + 'Encode' => '2.44_01', + 'Module::CoreList' => '2.76_02', + 'XS::APItest' => '0.39', + }, + removed => { + } + }, + 5.017 => { + delta_from => 5.016, + changed => { + 'B' => '1.35', + 'B::Concise' => '0.90', + 'ExtUtils::ParseXS' => '3.17', + 'ExtUtils::ParseXS::Utilities'=> '3.17', + 'File::DosGlob' => '1.07', + 'File::Find' => '1.21', + 'File::stat' => '1.06', + 'Hash::Util' => '0.12', + 'IO::Socket' => '1.34', + 'Module::CoreList' => '2.67', + 'Pod::Functions' => '1.06', + 'Storable' => '2.35', + 'XS::APItest' => '0.39', + 'diagnostics' => '1.29', + 'feature' => '1.28', + 'overload' => '1.19', + 'utf8' => '1.10', + }, + removed => { + 'Version::Requirements' => 1, + } + }, + 5.017001 => { + delta_from => 5.017, + changed => { + 'App::Prove' => '3.25', + 'App::Prove::State' => '3.25', + 'App::Prove::State::Result'=> '3.25', + 'App::Prove::State::Result::Test'=> '3.25', + 'Archive::Extract' => '0.60', + 'Archive::Tar' => '1.88', + 'Archive::Tar::Constant'=> '1.88', + 'Archive::Tar::File' => '1.88', + 'B' => '1.36', + 'B::Deparse' => '1.15', + 'CPAN::Meta' => '2.120921', + 'CPAN::Meta::Converter' => '2.120921', + 'CPAN::Meta::Feature' => '2.120921', + 'CPAN::Meta::History' => '2.120921', + 'CPAN::Meta::Prereqs' => '2.120921', + 'CPAN::Meta::Requirements'=> '2.122', + 'CPAN::Meta::Spec' => '2.120921', + 'CPAN::Meta::Validator' => '2.120921', + 'CPAN::Meta::YAML' => '0.008', + 'CPANPLUS' => '0.9130', + 'CPANPLUS::Config::HomeEnv'=> '0.04', + 'CPANPLUS::Internals' => '0.9130', + 'CPANPLUS::Shell::Default'=> '0.9130', + 'Class::Struct' => '0.64', + 'Compress::Raw::Bzip2' => '2.052', + 'Compress::Raw::Zlib' => '2.054', + 'Compress::Zlib' => '2.052', + 'Digest::MD5' => '2.52', + 'DynaLoader' => '1.15', + 'ExtUtils::CBuilder' => '0.280208', + 'ExtUtils::CBuilder::Base'=> '0.280208', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280208', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280208', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280208', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280208', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280208', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280208', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280208', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280208', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280208', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280208', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280208', + 'Fatal' => '2.11', + 'File::DosGlob' => '1.08', + 'File::Fetch' => '0.34', + 'File::Spec::Unix' => '3.39_03', + 'Filter::Util::Call' => '1.45', + 'HTTP::Tiny' => '0.022', + 'IO' => '1.25_07', + 'IO::Compress::Adapter::Bzip2'=> '2.052', + 'IO::Compress::Adapter::Deflate'=> '2.052', + 'IO::Compress::Adapter::Identity'=> '2.052', + 'IO::Compress::Base' => '2.052', + 'IO::Compress::Base::Common'=> '2.052', + 'IO::Compress::Bzip2' => '2.052', + 'IO::Compress::Deflate' => '2.052', + 'IO::Compress::Gzip' => '2.052', + 'IO::Compress::Gzip::Constants'=> '2.052', + 'IO::Compress::RawDeflate'=> '2.052', + 'IO::Compress::Zip' => '2.052', + 'IO::Compress::Zip::Constants'=> '2.052', + 'IO::Compress::Zlib::Constants'=> '2.052', + 'IO::Compress::Zlib::Extra'=> '2.052', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.052', + 'IO::Uncompress::Adapter::Identity'=> '2.052', + 'IO::Uncompress::Adapter::Inflate'=> '2.052', + 'IO::Uncompress::AnyInflate'=> '2.052', + 'IO::Uncompress::AnyUncompress'=> '2.052', + 'IO::Uncompress::Base' => '2.052', + 'IO::Uncompress::Bunzip2'=> '2.052', + 'IO::Uncompress::Gunzip'=> '2.052', + 'IO::Uncompress::Inflate'=> '2.052', + 'IO::Uncompress::RawInflate'=> '2.052', + 'IO::Uncompress::Unzip' => '2.052', + 'IPC::Cmd' => '0.78', + 'List::Util' => '1.25', + 'List::Util::XS' => '1.25', + 'Locale::Codes' => '3.22', + 'Locale::Codes::Constants'=> '3.22', + 'Locale::Codes::Country'=> '3.22', + 'Locale::Codes::Country_Codes'=> '3.22', + 'Locale::Codes::Country_Retired'=> '3.22', + 'Locale::Codes::Currency'=> '3.22', + 'Locale::Codes::Currency_Codes'=> '3.22', + 'Locale::Codes::Currency_Retired'=> '3.22', + 'Locale::Codes::LangExt'=> '3.22', + 'Locale::Codes::LangExt_Codes'=> '3.22', + 'Locale::Codes::LangExt_Retired'=> '3.22', + 'Locale::Codes::LangFam'=> '3.22', + 'Locale::Codes::LangFam_Codes'=> '3.22', + 'Locale::Codes::LangFam_Retired'=> '3.22', + 'Locale::Codes::LangVar'=> '3.22', + 'Locale::Codes::LangVar_Codes'=> '3.22', + 'Locale::Codes::LangVar_Retired'=> '3.22', + 'Locale::Codes::Language'=> '3.22', + 'Locale::Codes::Language_Codes'=> '3.22', + 'Locale::Codes::Language_Retired'=> '3.22', + 'Locale::Codes::Script' => '3.22', + 'Locale::Codes::Script_Codes'=> '3.22', + 'Locale::Codes::Script_Retired'=> '3.22', + 'Locale::Country' => '3.22', + 'Locale::Currency' => '3.22', + 'Locale::Language' => '3.22', + 'Locale::Script' => '3.22', + 'Memoize' => '1.03', + 'Memoize::AnyDBM_File' => '1.03', + 'Memoize::Expire' => '1.03', + 'Memoize::ExpireFile' => '1.03', + 'Memoize::ExpireTest' => '1.03', + 'Memoize::NDBM_File' => '1.03', + 'Memoize::SDBM_File' => '1.03', + 'Memoize::Storable' => '1.03', + 'Module::Build' => '0.40', + 'Module::Build::Base' => '0.40', + 'Module::Build::Compat' => '0.40', + 'Module::Build::Config' => '0.40', + 'Module::Build::Cookbook'=> '0.40', + 'Module::Build::Dumper' => '0.40', + 'Module::Build::ModuleInfo'=> '0.40', + 'Module::Build::Notes' => '0.40', + 'Module::Build::PPMMaker'=> '0.40', + 'Module::Build::Platform::Amiga'=> '0.40', + 'Module::Build::Platform::Default'=> '0.40', + 'Module::Build::Platform::EBCDIC'=> '0.40', + 'Module::Build::Platform::MPEiX'=> '0.40', + 'Module::Build::Platform::MacOS'=> '0.40', + 'Module::Build::Platform::RiscOS'=> '0.40', + 'Module::Build::Platform::Unix'=> '0.40', + 'Module::Build::Platform::VMS'=> '0.40', + 'Module::Build::Platform::VOS'=> '0.40', + 'Module::Build::Platform::Windows'=> '0.40', + 'Module::Build::Platform::aix'=> '0.40', + 'Module::Build::Platform::cygwin'=> '0.40', + 'Module::Build::Platform::darwin'=> '0.40', + 'Module::Build::Platform::os2'=> '0.40', + 'Module::Build::PodParser'=> '0.40', + 'Module::CoreList' => '2.68', + 'Module::Load::Conditional'=> '0.50', + 'Object::Accessor' => '0.44', + 'POSIX' => '1.31', + 'Params::Check' => '0.36', + 'Parse::CPAN::Meta' => '1.4404', + 'PerlIO::mmap' => '0.011', + 'PerlIO::via::QuotedPrint'=> '0.07', + 'Pod::Html' => '1.16', + 'Pod::Man' => '2.26', + 'Pod::Text' => '3.16', + 'Safe' => '2.33_01', + 'Scalar::Util' => '1.25', + 'Search::Dict' => '1.07', + 'Storable' => '2.36', + 'TAP::Base' => '3.25', + 'TAP::Formatter::Base' => '3.25', + 'TAP::Formatter::Color' => '3.25', + 'TAP::Formatter::Console'=> '3.25', + 'TAP::Formatter::Console::ParallelSession'=> '3.25', + 'TAP::Formatter::Console::Session'=> '3.25', + 'TAP::Formatter::File' => '3.25', + 'TAP::Formatter::File::Session'=> '3.25', + 'TAP::Formatter::Session'=> '3.25', + 'TAP::Harness' => '3.25', + 'TAP::Object' => '3.25', + 'TAP::Parser' => '3.25', + 'TAP::Parser::Aggregator'=> '3.25', + 'TAP::Parser::Grammar' => '3.25', + 'TAP::Parser::Iterator' => '3.25', + 'TAP::Parser::Iterator::Array'=> '3.25', + 'TAP::Parser::Iterator::Process'=> '3.25', + 'TAP::Parser::Iterator::Stream'=> '3.25', + 'TAP::Parser::IteratorFactory'=> '3.25', + 'TAP::Parser::Multiplexer'=> '3.25', + 'TAP::Parser::Result' => '3.25', + 'TAP::Parser::Result::Bailout'=> '3.25', + 'TAP::Parser::Result::Comment'=> '3.25', + 'TAP::Parser::Result::Plan'=> '3.25', + 'TAP::Parser::Result::Pragma'=> '3.25', + 'TAP::Parser::Result::Test'=> '3.25', + 'TAP::Parser::Result::Unknown'=> '3.25', + 'TAP::Parser::Result::Version'=> '3.25', + 'TAP::Parser::Result::YAML'=> '3.25', + 'TAP::Parser::ResultFactory'=> '3.25', + 'TAP::Parser::Scheduler'=> '3.25', + 'TAP::Parser::Scheduler::Job'=> '3.25', + 'TAP::Parser::Scheduler::Spinner'=> '3.25', + 'TAP::Parser::Source' => '3.25', + 'TAP::Parser::SourceHandler'=> '3.25', + 'TAP::Parser::SourceHandler::Executable'=> '3.25', + 'TAP::Parser::SourceHandler::File'=> '3.25', + 'TAP::Parser::SourceHandler::Handle'=> '3.25', + 'TAP::Parser::SourceHandler::Perl'=> '3.25', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.25', + 'TAP::Parser::Utils' => '3.25', + 'TAP::Parser::YAMLish::Reader'=> '3.25', + 'TAP::Parser::YAMLish::Writer'=> '3.25', + 'Term::ANSIColor' => '3.02', + 'Test::Harness' => '3.25', + 'Unicode' => '6.2.0', + 'Unicode::UCD' => '0.44', + 'XS::APItest' => '0.40', + '_charnames' => '1.32', + 'attributes' => '0.2', + 'autodie' => '2.11', + 'autodie::exception' => '2.11', + 'autodie::exception::system'=> '2.11', + 'autodie::hints' => '2.11', + 'bigint' => '0.30', + 'charnames' => '1.32', + 'feature' => '1.29', + 'inc::latest' => '0.40', + 'perlfaq' => '5.0150040', + 're' => '0.20', + }, + removed => { + 'List::Util::PP' => 1, + 'Scalar::Util::PP' => 1, + } + }, + 5.017002 => { + delta_from => 5.017001, + changed => { + 'App::Prove' => '3.25_01', + 'App::Prove::State' => '3.25_01', + 'App::Prove::State::Result'=> '3.25_01', + 'App::Prove::State::Result::Test'=> '3.25_01', + 'B::Concise' => '0.91', + 'Compress::Raw::Bzip2' => '2.05201', + 'Compress::Raw::Zlib' => '2.05401', + 'Exporter' => '5.67', + 'Exporter::Heavy' => '5.67', + 'Fatal' => '2.12', + 'File::Fetch' => '0.36', + 'File::stat' => '1.07', + 'IO' => '1.25_08', + 'IO::Socket' => '1.35', + 'Module::CoreList' => '2.69', + 'PerlIO::scalar' => '0.15', + 'Socket' => '2.002', + 'Storable' => '2.37', + 'TAP::Base' => '3.25_01', + 'TAP::Formatter::Base' => '3.25_01', + 'TAP::Formatter::Color' => '3.25_01', + 'TAP::Formatter::Console'=> '3.25_01', + 'TAP::Formatter::Console::ParallelSession'=> '3.25_01', + 'TAP::Formatter::Console::Session'=> '3.25_01', + 'TAP::Formatter::File' => '3.25_01', + 'TAP::Formatter::File::Session'=> '3.25_01', + 'TAP::Formatter::Session'=> '3.25_01', + 'TAP::Harness' => '3.25_01', + 'TAP::Object' => '3.25_01', + 'TAP::Parser' => '3.25_01', + 'TAP::Parser::Aggregator'=> '3.25_01', + 'TAP::Parser::Grammar' => '3.25_01', + 'TAP::Parser::Iterator' => '3.25_01', + 'TAP::Parser::Iterator::Array'=> '3.25_01', + 'TAP::Parser::Iterator::Process'=> '3.25_01', + 'TAP::Parser::Iterator::Stream'=> '3.25_01', + 'TAP::Parser::IteratorFactory'=> '3.25_01', + 'TAP::Parser::Multiplexer'=> '3.25_01', + 'TAP::Parser::Result' => '3.25_01', + 'TAP::Parser::Result::Bailout'=> '3.25_01', + 'TAP::Parser::Result::Comment'=> '3.25_01', + 'TAP::Parser::Result::Plan'=> '3.25_01', + 'TAP::Parser::Result::Pragma'=> '3.25_01', + 'TAP::Parser::Result::Test'=> '3.25_01', + 'TAP::Parser::Result::Unknown'=> '3.25_01', + 'TAP::Parser::Result::Version'=> '3.25_01', + 'TAP::Parser::Result::YAML'=> '3.25_01', + 'TAP::Parser::ResultFactory'=> '3.25_01', + 'TAP::Parser::Scheduler'=> '3.25_01', + 'TAP::Parser::Scheduler::Job'=> '3.25_01', + 'TAP::Parser::Scheduler::Spinner'=> '3.25_01', + 'TAP::Parser::Source' => '3.25_01', + 'TAP::Parser::SourceHandler'=> '3.25_01', + 'TAP::Parser::SourceHandler::Executable'=> '3.25_01', + 'TAP::Parser::SourceHandler::File'=> '3.25_01', + 'TAP::Parser::SourceHandler::Handle'=> '3.25_01', + 'TAP::Parser::SourceHandler::Perl'=> '3.25_01', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.25_01', + 'TAP::Parser::Utils' => '3.25_01', + 'TAP::Parser::YAMLish::Reader'=> '3.25_01', + 'TAP::Parser::YAMLish::Writer'=> '3.25_01', + 'Test::Harness' => '3.25_01', + 'Tie::StdHandle' => '4.3', + 'XS::APItest' => '0.41', + 'autodie' => '2.12', + 'autodie::exception' => '2.12', + 'autodie::exception::system'=> '2.12', + 'autodie::hints' => '2.12', + 'diagnostics' => '1.30', + 'overload' => '1.20', + 're' => '0.21', + 'vars' => '1.03', + }, + removed => { + } + }, + 5.017003 => { + delta_from => 5.017002, + changed => { + 'B' => '1.37', + 'B::Concise' => '0.92', + 'B::Debug' => '1.18', + 'B::Deparse' => '1.16', + 'CGI' => '3.60', + 'Compress::Raw::Bzip2' => '2.055', + 'Compress::Raw::Zlib' => '2.056', + 'Compress::Zlib' => '2.055', + 'Data::Dumper' => '2.135_07', + 'Devel::Peek' => '1.09', + 'Encode' => '2.47', + 'Encode::Alias' => '2.16', + 'Encode::GSM0338' => '2.02', + 'Encode::Unicode::UTF7' => '2.06', + 'IO::Compress::Adapter::Bzip2'=> '2.055', + 'IO::Compress::Adapter::Deflate'=> '2.055', + 'IO::Compress::Adapter::Identity'=> '2.055', + 'IO::Compress::Base' => '2.055', + 'IO::Compress::Base::Common'=> '2.055', + 'IO::Compress::Bzip2' => '2.055', + 'IO::Compress::Deflate' => '2.055', + 'IO::Compress::Gzip' => '2.055', + 'IO::Compress::Gzip::Constants'=> '2.055', + 'IO::Compress::RawDeflate'=> '2.055', + 'IO::Compress::Zip' => '2.055', + 'IO::Compress::Zip::Constants'=> '2.055', + 'IO::Compress::Zlib::Constants'=> '2.055', + 'IO::Compress::Zlib::Extra'=> '2.055', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.055', + 'IO::Uncompress::Adapter::Identity'=> '2.055', + 'IO::Uncompress::Adapter::Inflate'=> '2.055', + 'IO::Uncompress::AnyInflate'=> '2.055', + 'IO::Uncompress::AnyUncompress'=> '2.055', + 'IO::Uncompress::Base' => '2.055', + 'IO::Uncompress::Bunzip2'=> '2.055', + 'IO::Uncompress::Gunzip'=> '2.055', + 'IO::Uncompress::Inflate'=> '2.055', + 'IO::Uncompress::RawInflate'=> '2.055', + 'IO::Uncompress::Unzip' => '2.055', + 'Module::Build' => '0.4003', + 'Module::Build::Base' => '0.4003', + 'Module::Build::Compat' => '0.4003', + 'Module::Build::Config' => '0.4003', + 'Module::Build::Cookbook'=> '0.4003', + 'Module::Build::Dumper' => '0.4003', + 'Module::Build::ModuleInfo'=> '0.4003', + 'Module::Build::Notes' => '0.4003', + 'Module::Build::PPMMaker'=> '0.4003', + 'Module::Build::Platform::Amiga'=> '0.4003', + 'Module::Build::Platform::Default'=> '0.4003', + 'Module::Build::Platform::EBCDIC'=> '0.4003', + 'Module::Build::Platform::MPEiX'=> '0.4003', + 'Module::Build::Platform::MacOS'=> '0.4003', + 'Module::Build::Platform::RiscOS'=> '0.4003', + 'Module::Build::Platform::Unix'=> '0.4003', + 'Module::Build::Platform::VMS'=> '0.4003', + 'Module::Build::Platform::VOS'=> '0.4003', + 'Module::Build::Platform::Windows'=> '0.4003', + 'Module::Build::Platform::aix'=> '0.4003', + 'Module::Build::Platform::cygwin'=> '0.4003', + 'Module::Build::Platform::darwin'=> '0.4003', + 'Module::Build::Platform::os2'=> '0.4003', + 'Module::Build::PodParser'=> '0.4003', + 'Module::CoreList' => '2.71', + 'Module::CoreList::TieHashDelta'=> '2.71', + 'Module::Load::Conditional'=> '0.54', + 'Module::Metadata' => '1.000011', + 'Module::Pluggable' => '4.3', + 'Module::Pluggable::Object'=> '4.3', + 'Pod::Simple' => '3.23', + 'Pod::Simple::BlackBox' => '3.23', + 'Pod::Simple::Checker' => '3.23', + 'Pod::Simple::Debug' => '3.23', + 'Pod::Simple::DumpAsText'=> '3.23', + 'Pod::Simple::DumpAsXML'=> '3.23', + 'Pod::Simple::HTML' => '3.23', + 'Pod::Simple::HTMLBatch'=> '3.23', + 'Pod::Simple::LinkSection'=> '3.23', + 'Pod::Simple::Methody' => '3.23', + 'Pod::Simple::Progress' => '3.23', + 'Pod::Simple::PullParser'=> '3.23', + 'Pod::Simple::PullParserEndToken'=> '3.23', + 'Pod::Simple::PullParserStartToken'=> '3.23', + 'Pod::Simple::PullParserTextToken'=> '3.23', + 'Pod::Simple::PullParserToken'=> '3.23', + 'Pod::Simple::RTF' => '3.23', + 'Pod::Simple::Search' => '3.23', + 'Pod::Simple::SimpleTree'=> '3.23', + 'Pod::Simple::Text' => '3.23', + 'Pod::Simple::TextContent'=> '3.23', + 'Pod::Simple::TiedOutFH'=> '3.23', + 'Pod::Simple::Transcode'=> '3.23', + 'Pod::Simple::TranscodeDumb'=> '3.23', + 'Pod::Simple::TranscodeSmart'=> '3.23', + 'Pod::Simple::XHTML' => '3.23', + 'Pod::Simple::XMLOutStream'=> '3.23', + 'Socket' => '2.004', + 'Storable' => '2.38', + 'Sys::Syslog' => '0.31', + 'Term::ReadLine' => '1.10', + 'Text::Tabs' => '2012.0818', + 'Text::Wrap' => '2012.0818', + 'Time::Local' => '1.2300', + 'Unicode::UCD' => '0.45', + 'Win32' => '0.45', + 'Win32CORE' => '0.03', + 'XS::APItest' => '0.42', + 'inc::latest' => '0.4003', + 'perlfaq' => '5.0150041', + 're' => '0.22', + }, + removed => { + } + }, + 5.017004 => { + delta_from => 5.017003, + changed => { + 'Archive::Tar' => '1.90', + 'Archive::Tar::Constant'=> '1.90', + 'Archive::Tar::File' => '1.90', + 'B' => '1.38', + 'B::Concise' => '0.93', + 'B::Deparse' => '1.17', + 'B::Xref' => '1.04', + 'CPANPLUS' => '0.9131', + 'CPANPLUS::Internals' => '0.9131', + 'CPANPLUS::Shell::Default'=> '0.9131', + 'DB_File' => '1.827', + 'Devel::Peek' => '1.10', + 'DynaLoader' => '1.16', + 'Errno' => '1.16', + 'ExtUtils::ParseXS' => '3.18', + 'ExtUtils::ParseXS::Constants'=> '3.18', + 'ExtUtils::ParseXS::CountLines'=> '3.18', + 'ExtUtils::ParseXS::Utilities'=> '3.18', + 'File::Copy' => '2.24', + 'File::Find' => '1.22', + 'IPC::Open3' => '1.13', + 'Locale::Codes' => '3.23', + 'Locale::Codes::Constants'=> '3.23', + 'Locale::Codes::Country'=> '3.23', + 'Locale::Codes::Country_Codes'=> '3.23', + 'Locale::Codes::Country_Retired'=> '3.23', + 'Locale::Codes::Currency'=> '3.23', + 'Locale::Codes::Currency_Codes'=> '3.23', + 'Locale::Codes::Currency_Retired'=> '3.23', + 'Locale::Codes::LangExt'=> '3.23', + 'Locale::Codes::LangExt_Codes'=> '3.23', + 'Locale::Codes::LangExt_Retired'=> '3.23', + 'Locale::Codes::LangFam'=> '3.23', + 'Locale::Codes::LangFam_Codes'=> '3.23', + 'Locale::Codes::LangFam_Retired'=> '3.23', + 'Locale::Codes::LangVar'=> '3.23', + 'Locale::Codes::LangVar_Codes'=> '3.23', + 'Locale::Codes::LangVar_Retired'=> '3.23', + 'Locale::Codes::Language'=> '3.23', + 'Locale::Codes::Language_Codes'=> '3.23', + 'Locale::Codes::Language_Retired'=> '3.23', + 'Locale::Codes::Script' => '3.23', + 'Locale::Codes::Script_Codes'=> '3.23', + 'Locale::Codes::Script_Retired'=> '3.23', + 'Locale::Country' => '3.23', + 'Locale::Currency' => '3.23', + 'Locale::Language' => '3.23', + 'Locale::Script' => '3.23', + 'Math::BigFloat::Trace' => '0.30', + 'Math::BigInt::Trace' => '0.30', + 'Module::CoreList' => '2.73', + 'Module::CoreList::TieHashDelta'=> '2.73', + 'Opcode' => '1.24', + 'Socket' => '2.006', + 'Storable' => '2.39', + 'Sys::Syslog' => '0.32', + 'Unicode::UCD' => '0.46', + 'XS::APItest' => '0.43', + 'bignum' => '0.30', + 'bigrat' => '0.30', + 'constant' => '1.24', + 'feature' => '1.30', + 'threads::shared' => '1.41', + 'version' => '0.9901', + 'warnings' => '1.14', + }, + removed => { + } + }, + 5.017005 => { + delta_from => 5.017004, + changed => { + 'AutoLoader' => '5.73', + 'B' => '1.39', + 'B::Deparse' => '1.18', + 'CPANPLUS' => '0.9133', + 'CPANPLUS::Internals' => '0.9133', + 'CPANPLUS::Shell::Default'=> '0.9133', + 'Carp' => '1.27', + 'Carp::Heavy' => '1.27', + 'Data::Dumper' => '2.136', + 'Digest::SHA' => '5.72', + 'ExtUtils::CBuilder' => '0.280209', + 'ExtUtils::CBuilder::Base'=> '0.280209', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280209', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280209', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280209', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280209', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280209', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280209', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280209', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280209', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280209', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280209', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280209', + 'File::Copy' => '2.25', + 'File::Glob' => '1.18', + 'HTTP::Tiny' => '0.024', + 'Module::CoreList' => '2.75', + 'Module::CoreList::TieHashDelta'=> '2.75', + 'PerlIO::encoding' => '0.16', + 'Unicode::Collate' => '0.90', + 'Unicode::Collate::Locale'=> '0.90', + 'Unicode::Normalize' => '1.15', + 'Win32CORE' => '0.04', + 'XS::APItest' => '0.44', + 'attributes' => '0.21', + 'bigint' => '0.31', + 'bignum' => '0.31', + 'bigrat' => '0.31', + 'feature' => '1.31', + 'threads::shared' => '1.42', + 'warnings' => '1.15', + }, + removed => { + } + }, + 5.017006 => { + delta_from => 5.017005, + changed => { + 'B' => '1.40', + 'B::Concise' => '0.94', + 'B::Deparse' => '1.19', + 'B::Xref' => '1.05', + 'CGI' => '3.63', + 'CGI::Util' => '3.62', + 'CPAN' => '1.99_51', + 'CPANPLUS::Dist::Build' => '0.64', + 'CPANPLUS::Dist::Build::Constants'=> '0.64', + 'Carp' => '1.28', + 'Carp::Heavy' => '1.28', + 'Compress::Raw::Bzip2' => '2.058', + 'Compress::Raw::Zlib' => '2.058', + 'Compress::Zlib' => '2.058', + 'Data::Dumper' => '2.137', + 'Digest::SHA' => '5.73', + 'DynaLoader' => '1.17', + 'Env' => '1.04', + 'Errno' => '1.17', + 'ExtUtils::Manifest' => '1.62', + 'ExtUtils::Typemaps' => '3.18', + 'ExtUtils::Typemaps::Cmd'=> '3.18', + 'ExtUtils::Typemaps::InputMap'=> '3.18', + 'ExtUtils::Typemaps::OutputMap'=> '3.18', + 'ExtUtils::Typemaps::Type'=> '3.18', + 'Fatal' => '2.13', + 'File::Find' => '1.23', + 'Hash::Util' => '0.13', + 'IO::Compress::Adapter::Bzip2'=> '2.058', + 'IO::Compress::Adapter::Deflate'=> '2.058', + 'IO::Compress::Adapter::Identity'=> '2.058', + 'IO::Compress::Base' => '2.058', + 'IO::Compress::Base::Common'=> '2.058', + 'IO::Compress::Bzip2' => '2.058', + 'IO::Compress::Deflate' => '2.058', + 'IO::Compress::Gzip' => '2.058', + 'IO::Compress::Gzip::Constants'=> '2.058', + 'IO::Compress::RawDeflate'=> '2.058', + 'IO::Compress::Zip' => '2.058', + 'IO::Compress::Zip::Constants'=> '2.058', + 'IO::Compress::Zlib::Constants'=> '2.058', + 'IO::Compress::Zlib::Extra'=> '2.058', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.058', + 'IO::Uncompress::Adapter::Identity'=> '2.058', + 'IO::Uncompress::Adapter::Inflate'=> '2.058', + 'IO::Uncompress::AnyInflate'=> '2.058', + 'IO::Uncompress::AnyUncompress'=> '2.058', + 'IO::Uncompress::Base' => '2.058', + 'IO::Uncompress::Bunzip2'=> '2.058', + 'IO::Uncompress::Gunzip'=> '2.058', + 'IO::Uncompress::Inflate'=> '2.058', + 'IO::Uncompress::RawInflate'=> '2.058', + 'IO::Uncompress::Unzip' => '2.058', + 'Module::CoreList' => '2.78', + 'Module::CoreList::TieHashDelta'=> '2.77', + 'Module::Pluggable' => '4.5', + 'Module::Pluggable::Object'=> '4.5', + 'Opcode' => '1.25', + 'Sys::Hostname' => '1.17', + 'Term::UI' => '0.32', + 'Thread::Queue' => '3.01', + 'Tie::Hash::NamedCapture'=> '0.09', + 'Unicode::Collate' => '0.93', + 'Unicode::Collate::CJK::Korean'=> '0.93', + 'Unicode::Collate::Locale'=> '0.93', + 'Unicode::Normalize' => '1.16', + 'Unicode::UCD' => '0.47', + 'XS::APItest' => '0.46', + '_charnames' => '1.33', + 'autodie' => '2.13', + 'autodie::exception' => '2.13', + 'autodie::exception::system'=> '2.13', + 'autodie::hints' => '2.13', + 'charnames' => '1.33', + 're' => '0.23', + }, + removed => { + } + }, + 5.017007 => { + delta_from => 5.017006, + changed => { + 'B' => '1.41', + 'CPANPLUS::Dist::Build' => '0.68', + 'CPANPLUS::Dist::Build::Constants'=> '0.68', + 'Compress::Raw::Bzip2' => '2.059', + 'Compress::Raw::Zlib' => '2.059', + 'Compress::Zlib' => '2.059', + 'Cwd' => '3.39_03', + 'Data::Dumper' => '2.139', + 'Devel::Peek' => '1.11', + 'Digest::SHA' => '5.80', + 'DynaLoader' => '1.18', + 'English' => '1.06', + 'Errno' => '1.18', + 'ExtUtils::Command::MM' => '6.64', + 'ExtUtils::Liblist' => '6.64', + 'ExtUtils::Liblist::Kid'=> '6.64', + 'ExtUtils::MM' => '6.64', + 'ExtUtils::MM_AIX' => '6.64', + 'ExtUtils::MM_Any' => '6.64', + 'ExtUtils::MM_BeOS' => '6.64', + 'ExtUtils::MM_Cygwin' => '6.64', + 'ExtUtils::MM_DOS' => '6.64', + 'ExtUtils::MM_Darwin' => '6.64', + 'ExtUtils::MM_MacOS' => '6.64', + 'ExtUtils::MM_NW5' => '6.64', + 'ExtUtils::MM_OS2' => '6.64', + 'ExtUtils::MM_QNX' => '6.64', + 'ExtUtils::MM_UWIN' => '6.64', + 'ExtUtils::MM_Unix' => '6.64', + 'ExtUtils::MM_VMS' => '6.64', + 'ExtUtils::MM_VOS' => '6.64', + 'ExtUtils::MM_Win32' => '6.64', + 'ExtUtils::MM_Win95' => '6.64', + 'ExtUtils::MY' => '6.64', + 'ExtUtils::MakeMaker' => '6.64', + 'ExtUtils::MakeMaker::Config'=> '6.64', + 'ExtUtils::Mkbootstrap' => '6.64', + 'ExtUtils::Mksymlists' => '6.64', + 'ExtUtils::testlib' => '6.64', + 'File::DosGlob' => '1.09', + 'File::Glob' => '1.19', + 'GDBM_File' => '1.15', + 'IO::Compress::Adapter::Bzip2'=> '2.059', + 'IO::Compress::Adapter::Deflate'=> '2.059', + 'IO::Compress::Adapter::Identity'=> '2.059', + 'IO::Compress::Base' => '2.059', + 'IO::Compress::Base::Common'=> '2.059', + 'IO::Compress::Bzip2' => '2.059', + 'IO::Compress::Deflate' => '2.059', + 'IO::Compress::Gzip' => '2.059', + 'IO::Compress::Gzip::Constants'=> '2.059', + 'IO::Compress::RawDeflate'=> '2.059', + 'IO::Compress::Zip' => '2.059', + 'IO::Compress::Zip::Constants'=> '2.059', + 'IO::Compress::Zlib::Constants'=> '2.059', + 'IO::Compress::Zlib::Extra'=> '2.059', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.059', + 'IO::Uncompress::Adapter::Identity'=> '2.059', + 'IO::Uncompress::Adapter::Inflate'=> '2.059', + 'IO::Uncompress::AnyInflate'=> '2.059', + 'IO::Uncompress::AnyUncompress'=> '2.059', + 'IO::Uncompress::Base' => '2.059', + 'IO::Uncompress::Bunzip2'=> '2.059', + 'IO::Uncompress::Gunzip'=> '2.059', + 'IO::Uncompress::Inflate'=> '2.059', + 'IO::Uncompress::RawInflate'=> '2.059', + 'IO::Uncompress::Unzip' => '2.059', + 'List::Util' => '1.26', + 'List::Util::XS' => '1.26', + 'Locale::Codes' => '3.24', + 'Locale::Codes::Constants'=> '3.24', + 'Locale::Codes::Country'=> '3.24', + 'Locale::Codes::Country_Codes'=> '3.24', + 'Locale::Codes::Country_Retired'=> '3.24', + 'Locale::Codes::Currency'=> '3.24', + 'Locale::Codes::Currency_Codes'=> '3.24', + 'Locale::Codes::Currency_Retired'=> '3.24', + 'Locale::Codes::LangExt'=> '3.24', + 'Locale::Codes::LangExt_Codes'=> '3.24', + 'Locale::Codes::LangExt_Retired'=> '3.24', + 'Locale::Codes::LangFam'=> '3.24', + 'Locale::Codes::LangFam_Codes'=> '3.24', + 'Locale::Codes::LangFam_Retired'=> '3.24', + 'Locale::Codes::LangVar'=> '3.24', + 'Locale::Codes::LangVar_Codes'=> '3.24', + 'Locale::Codes::LangVar_Retired'=> '3.24', + 'Locale::Codes::Language'=> '3.24', + 'Locale::Codes::Language_Codes'=> '3.24', + 'Locale::Codes::Language_Retired'=> '3.24', + 'Locale::Codes::Script' => '3.24', + 'Locale::Codes::Script_Codes'=> '3.24', + 'Locale::Codes::Script_Retired'=> '3.24', + 'Locale::Country' => '3.24', + 'Locale::Currency' => '3.24', + 'Locale::Language' => '3.24', + 'Locale::Maketext' => '1.23', + 'Locale::Script' => '3.24', + 'Module::CoreList' => '2.79', + 'Module::CoreList::TieHashDelta'=> '2.79', + 'POSIX' => '1.32', + 'Scalar::Util' => '1.26', + 'Socket' => '2.006_001', + 'Storable' => '2.40', + 'Term::ReadLine' => '1.11', + 'Unicode::Collate' => '0.96', + 'Unicode::Collate::CJK::Stroke'=> '0.94', + 'Unicode::Collate::CJK::Zhuyin'=> '0.94', + 'Unicode::Collate::Locale'=> '0.96', + 'XS::APItest' => '0.48', + 'XS::Typemap' => '0.09', + '_charnames' => '1.34', + 'charnames' => '1.34', + 'feature' => '1.32', + 'mro' => '1.10', + 'sigtrap' => '1.07', + 'sort' => '2.02', + }, + removed => { + } + }, + 5.017008 => { + delta_from => 5.017007, + changed => { + 'Archive::Extract' => '0.62', + 'B' => '1.42', + 'B::Concise' => '0.95', + 'Compress::Raw::Bzip2' => '2.060', + 'Compress::Raw::Zlib' => '2.060', + 'Compress::Zlib' => '2.060', + 'Cwd' => '3.40', + 'Data::Dumper' => '2.141', + 'Digest::SHA' => '5.81', + 'ExtUtils::Install' => '1.59', + 'File::Fetch' => '0.38', + 'File::Path' => '2.09', + 'File::Spec' => '3.40', + 'File::Spec::Cygwin' => '3.40', + 'File::Spec::Epoc' => '3.40', + 'File::Spec::Functions' => '3.40', + 'File::Spec::Mac' => '3.40', + 'File::Spec::OS2' => '3.40', + 'File::Spec::Unix' => '3.40', + 'File::Spec::VMS' => '3.40', + 'File::Spec::Win32' => '3.40', + 'HTTP::Tiny' => '0.025', + 'Hash::Util' => '0.14', + 'I18N::LangTags' => '0.39', + 'I18N::LangTags::List' => '0.39', + 'I18N::Langinfo' => '0.09', + 'IO' => '1.26', + 'IO::Compress::Adapter::Bzip2'=> '2.060', + 'IO::Compress::Adapter::Deflate'=> '2.060', + 'IO::Compress::Adapter::Identity'=> '2.060', + 'IO::Compress::Base' => '2.060', + 'IO::Compress::Base::Common'=> '2.060', + 'IO::Compress::Bzip2' => '2.060', + 'IO::Compress::Deflate' => '2.060', + 'IO::Compress::Gzip' => '2.060', + 'IO::Compress::Gzip::Constants'=> '2.060', + 'IO::Compress::RawDeflate'=> '2.060', + 'IO::Compress::Zip' => '2.060', + 'IO::Compress::Zip::Constants'=> '2.060', + 'IO::Compress::Zlib::Constants'=> '2.060', + 'IO::Compress::Zlib::Extra'=> '2.060', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.060', + 'IO::Uncompress::Adapter::Identity'=> '2.060', + 'IO::Uncompress::Adapter::Inflate'=> '2.060', + 'IO::Uncompress::AnyInflate'=> '2.060', + 'IO::Uncompress::AnyUncompress'=> '2.060', + 'IO::Uncompress::Base' => '2.060', + 'IO::Uncompress::Bunzip2'=> '2.060', + 'IO::Uncompress::Gunzip'=> '2.060', + 'IO::Uncompress::Inflate'=> '2.060', + 'IO::Uncompress::RawInflate'=> '2.060', + 'IO::Uncompress::Unzip' => '2.060', + 'List::Util' => '1.27', + 'List::Util::XS' => '1.27', + 'Module::CoreList' => '2.80', + 'Module::CoreList::TieHashDelta'=> '2.80', + 'Pod::Html' => '1.17', + 'Pod::LaTeX' => '0.61', + 'Pod::Man' => '2.27', + 'Pod::Text' => '3.17', + 'Pod::Text::Color' => '2.07', + 'Pod::Text::Overstrike' => '2.05', + 'Pod::Text::Termcap' => '2.07', + 'Safe' => '2.34', + 'Scalar::Util' => '1.27', + 'Socket' => '2.009', + 'Term::ANSIColor' => '4.02', + 'Test' => '1.26', + 'Unicode::Collate' => '0.97', + 'XS::APItest' => '0.51', + 'XS::Typemap' => '0.10', + '_charnames' => '1.35', + 'charnames' => '1.35', + 'constant' => '1.25', + 'diagnostics' => '1.31', + 'threads::shared' => '1.43', + 'warnings' => '1.16', + }, + removed => { + } + }, + 5.017009 => { + delta_from => 5.017008, + changed => { + 'App::Cpan' => '1.60_02', + 'App::Prove' => '3.26', + 'App::Prove::State' => '3.26', + 'App::Prove::State::Result'=> '3.26', + 'App::Prove::State::Result::Test'=> '3.26', + 'Archive::Extract' => '0.68', + 'Attribute::Handlers' => '0.94', + 'B::Lint' => '1.17', + 'B::Lint::Debug' => '1.17', + 'Benchmark' => '1.14', + 'CPAN' => '2.00', + 'CPAN::Distribution' => '2.00', + 'CPAN::FirstTime' => '5.5304', + 'CPAN::Nox' => '5.5001', + 'CPANPLUS' => '0.9135', + 'CPANPLUS::Backend' => '0.9135', + 'CPANPLUS::Backend::RV' => '0.9135', + 'CPANPLUS::Config' => '0.9135', + 'CPANPLUS::Config::HomeEnv'=> '0.9135', + 'CPANPLUS::Configure' => '0.9135', + 'CPANPLUS::Configure::Setup'=> '0.9135', + 'CPANPLUS::Dist' => '0.9135', + 'CPANPLUS::Dist::Autobundle'=> '0.9135', + 'CPANPLUS::Dist::Base' => '0.9135', + 'CPANPLUS::Dist::Build' => '0.70', + 'CPANPLUS::Dist::Build::Constants'=> '0.70', + 'CPANPLUS::Dist::MM' => '0.9135', + 'CPANPLUS::Dist::Sample'=> '0.9135', + 'CPANPLUS::Error' => '0.9135', + 'CPANPLUS::Internals' => '0.9135', + 'CPANPLUS::Internals::Constants'=> '0.9135', + 'CPANPLUS::Internals::Constants::Report'=> '0.9135', + 'CPANPLUS::Internals::Extract'=> '0.9135', + 'CPANPLUS::Internals::Fetch'=> '0.9135', + 'CPANPLUS::Internals::Report'=> '0.9135', + 'CPANPLUS::Internals::Search'=> '0.9135', + 'CPANPLUS::Internals::Source'=> '0.9135', + 'CPANPLUS::Internals::Source::Memory'=> '0.9135', + 'CPANPLUS::Internals::Source::SQLite'=> '0.9135', + 'CPANPLUS::Internals::Source::SQLite::Tie'=> '0.9135', + 'CPANPLUS::Internals::Utils'=> '0.9135', + 'CPANPLUS::Internals::Utils::Autoflush'=> '0.9135', + 'CPANPLUS::Module' => '0.9135', + 'CPANPLUS::Module::Author'=> '0.9135', + 'CPANPLUS::Module::Author::Fake'=> '0.9135', + 'CPANPLUS::Module::Checksums'=> '0.9135', + 'CPANPLUS::Module::Fake'=> '0.9135', + 'CPANPLUS::Module::Signature'=> '0.9135', + 'CPANPLUS::Selfupdate' => '0.9135', + 'CPANPLUS::Shell' => '0.9135', + 'CPANPLUS::Shell::Classic'=> '0.9135', + 'CPANPLUS::Shell::Default'=> '0.9135', + 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> '0.9135', + 'CPANPLUS::Shell::Default::Plugins::Remote'=> '0.9135', + 'CPANPLUS::Shell::Default::Plugins::Source'=> '0.9135', + 'Config' => '5.017009', + 'Config::Perl::V' => '0.17', + 'DBM_Filter' => '0.05', + 'Data::Dumper' => '2.142', + 'Digest::SHA' => '5.82', + 'Encode' => '2.48', + 'ExtUtils::Installed' => '1.999003', + 'ExtUtils::Manifest' => '1.63', + 'ExtUtils::ParseXS::Utilities'=> '3.19', + 'ExtUtils::Typemaps' => '3.19', + 'File::CheckTree' => '4.42', + 'File::DosGlob' => '1.10', + 'File::Temp' => '0.22_90', + 'Filter::Simple' => '0.89', + 'IO' => '1.27', + 'Log::Message' => '0.06', + 'Log::Message::Config' => '0.06', + 'Log::Message::Handlers'=> '0.06', + 'Log::Message::Item' => '0.06', + 'Log::Message::Simple' => '0.10', + 'Math::BigInt' => '1.999', + 'Module::CoreList' => '2.82', + 'Module::CoreList::TieHashDelta'=> '2.82', + 'Module::Load' => '0.24', + 'Module::Pluggable' => '4.6', + 'Module::Pluggable::Object'=> '4.6', + 'OS2::DLL' => '1.05', + 'OS2::ExtAttr' => '0.03', + 'OS2::Process' => '1.08', + 'Object::Accessor' => '0.46', + 'PerlIO::scalar' => '0.16', + 'Pod::Checker' => '1.60', + 'Pod::Find' => '1.60', + 'Pod::Html' => '1.18', + 'Pod::InputObjects' => '1.60', + 'Pod::ParseUtils' => '1.60', + 'Pod::Parser' => '1.60', + 'Pod::Perldoc' => '3.19', + 'Pod::Perldoc::BaseTo' => '3.19', + 'Pod::Perldoc::GetOptsOO'=> '3.19', + 'Pod::Perldoc::ToANSI' => '3.19', + 'Pod::Perldoc::ToChecker'=> '3.19', + 'Pod::Perldoc::ToMan' => '3.19', + 'Pod::Perldoc::ToNroff' => '3.19', + 'Pod::Perldoc::ToPod' => '3.19', + 'Pod::Perldoc::ToRtf' => '3.19', + 'Pod::Perldoc::ToTerm' => '3.19', + 'Pod::Perldoc::ToText' => '3.19', + 'Pod::Perldoc::ToTk' => '3.19', + 'Pod::Perldoc::ToXml' => '3.19', + 'Pod::PlainText' => '2.06', + 'Pod::Select' => '1.60', + 'Pod::Usage' => '1.61', + 'SelfLoader' => '1.21', + 'TAP::Base' => '3.26', + 'TAP::Formatter::Base' => '3.26', + 'TAP::Formatter::Color' => '3.26', + 'TAP::Formatter::Console'=> '3.26', + 'TAP::Formatter::Console::ParallelSession'=> '3.26', + 'TAP::Formatter::Console::Session'=> '3.26', + 'TAP::Formatter::File' => '3.26', + 'TAP::Formatter::File::Session'=> '3.26', + 'TAP::Formatter::Session'=> '3.26', + 'TAP::Harness' => '3.26', + 'TAP::Object' => '3.26', + 'TAP::Parser' => '3.26', + 'TAP::Parser::Aggregator'=> '3.26', + 'TAP::Parser::Grammar' => '3.26', + 'TAP::Parser::Iterator' => '3.26', + 'TAP::Parser::Iterator::Array'=> '3.26', + 'TAP::Parser::Iterator::Process'=> '3.26', + 'TAP::Parser::Iterator::Stream'=> '3.26', + 'TAP::Parser::IteratorFactory'=> '3.26', + 'TAP::Parser::Multiplexer'=> '3.26', + 'TAP::Parser::Result' => '3.26', + 'TAP::Parser::Result::Bailout'=> '3.26', + 'TAP::Parser::Result::Comment'=> '3.26', + 'TAP::Parser::Result::Plan'=> '3.26', + 'TAP::Parser::Result::Pragma'=> '3.26', + 'TAP::Parser::Result::Test'=> '3.26', + 'TAP::Parser::Result::Unknown'=> '3.26', + 'TAP::Parser::Result::Version'=> '3.26', + 'TAP::Parser::Result::YAML'=> '3.26', + 'TAP::Parser::ResultFactory'=> '3.26', + 'TAP::Parser::Scheduler'=> '3.26', + 'TAP::Parser::Scheduler::Job'=> '3.26', + 'TAP::Parser::Scheduler::Spinner'=> '3.26', + 'TAP::Parser::Source' => '3.26', + 'TAP::Parser::SourceHandler'=> '3.26', + 'TAP::Parser::SourceHandler::Executable'=> '3.26', + 'TAP::Parser::SourceHandler::File'=> '3.26', + 'TAP::Parser::SourceHandler::Handle'=> '3.26', + 'TAP::Parser::SourceHandler::Perl'=> '3.26', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.26', + 'TAP::Parser::Utils' => '3.26', + 'TAP::Parser::YAMLish::Reader'=> '3.26', + 'TAP::Parser::YAMLish::Writer'=> '3.26', + 'Term::UI' => '0.34', + 'Test::Harness' => '3.26', + 'Text::Soundex' => '3.04', + 'Thread::Queue' => '3.02', + 'Unicode::UCD' => '0.50', + 'Win32' => '0.46', + 'Win32API::File' => '0.1201', + '_charnames' => '1.36', + 'arybase' => '0.06', + 'bigint' => '0.32', + 'bignum' => '0.32', + 'charnames' => '1.36', + 'filetest' => '1.03', + 'locale' => '1.02', + 'overload' => '1.21', + 'warnings' => '1.17', + }, + removed => { + } + }, + 5.017010 => { + delta_from => 5.017009, + changed => { + 'Benchmark' => '1.15', + 'Config' => '5.017009', + 'Data::Dumper' => '2.145', + 'Digest::SHA' => '5.84', + 'Encode' => '2.49', + 'ExtUtils::Command::MM' => '6.65_01', + 'ExtUtils::Liblist' => '6.65_01', + 'ExtUtils::Liblist::Kid'=> '6.65_01', + 'ExtUtils::MM' => '6.65_01', + 'ExtUtils::MM_AIX' => '6.65_01', + 'ExtUtils::MM_Any' => '6.65_01', + 'ExtUtils::MM_BeOS' => '6.65_01', + 'ExtUtils::MM_Cygwin' => '6.65_01', + 'ExtUtils::MM_DOS' => '6.65_01', + 'ExtUtils::MM_Darwin' => '6.65_01', + 'ExtUtils::MM_MacOS' => '6.65_01', + 'ExtUtils::MM_NW5' => '6.65_01', + 'ExtUtils::MM_OS2' => '6.65_01', + 'ExtUtils::MM_QNX' => '6.65_01', + 'ExtUtils::MM_UWIN' => '6.65_01', + 'ExtUtils::MM_Unix' => '6.65_01', + 'ExtUtils::MM_VMS' => '6.65_01', + 'ExtUtils::MM_VOS' => '6.65_01', + 'ExtUtils::MM_Win32' => '6.65_01', + 'ExtUtils::MM_Win95' => '6.65_01', + 'ExtUtils::MY' => '6.65_01', + 'ExtUtils::MakeMaker' => '6.65_01', + 'ExtUtils::MakeMaker::Config'=> '6.65_01', + 'ExtUtils::Mkbootstrap' => '6.65_01', + 'ExtUtils::Mksymlists' => '6.65_01', + 'ExtUtils::testlib' => '6.65_01', + 'File::Copy' => '2.26', + 'File::Temp' => '0.23', + 'Getopt::Long' => '2.39', + 'Hash::Util' => '0.15', + 'I18N::Langinfo' => '0.10', + 'IPC::Cmd' => '0.80', + 'JSON::PP' => '2.27202', + 'Locale::Codes' => '3.25', + 'Locale::Codes::Constants'=> '3.25', + 'Locale::Codes::Country'=> '3.25', + 'Locale::Codes::Country_Codes'=> '3.25', + 'Locale::Codes::Country_Retired'=> '3.25', + 'Locale::Codes::Currency'=> '3.25', + 'Locale::Codes::Currency_Codes'=> '3.25', + 'Locale::Codes::Currency_Retired'=> '3.25', + 'Locale::Codes::LangExt'=> '3.25', + 'Locale::Codes::LangExt_Codes'=> '3.25', + 'Locale::Codes::LangExt_Retired'=> '3.25', + 'Locale::Codes::LangFam'=> '3.25', + 'Locale::Codes::LangFam_Codes'=> '3.25', + 'Locale::Codes::LangFam_Retired'=> '3.25', + 'Locale::Codes::LangVar'=> '3.25', + 'Locale::Codes::LangVar_Codes'=> '3.25', + 'Locale::Codes::LangVar_Retired'=> '3.25', + 'Locale::Codes::Language'=> '3.25', + 'Locale::Codes::Language_Codes'=> '3.25', + 'Locale::Codes::Language_Retired'=> '3.25', + 'Locale::Codes::Script' => '3.25', + 'Locale::Codes::Script_Codes'=> '3.25', + 'Locale::Codes::Script_Retired'=> '3.25', + 'Locale::Country' => '3.25', + 'Locale::Currency' => '3.25', + 'Locale::Language' => '3.25', + 'Locale::Script' => '3.25', + 'Math::BigFloat' => '1.998', + 'Math::BigFloat::Trace' => '0.32', + 'Math::BigInt' => '1.9991', + 'Math::BigInt::CalcEmu' => '1.998', + 'Math::BigInt::Trace' => '0.32', + 'Math::BigRat' => '0.2604', + 'Module::CoreList' => '2.84', + 'Module::CoreList::TieHashDelta'=> '2.84', + 'Module::Pluggable' => '4.7', + 'Net::Ping' => '2.41', + 'Perl::OSType' => '1.003', + 'Pod::Simple' => '3.26', + 'Pod::Simple::BlackBox' => '3.26', + 'Pod::Simple::Checker' => '3.26', + 'Pod::Simple::Debug' => '3.26', + 'Pod::Simple::DumpAsText'=> '3.26', + 'Pod::Simple::DumpAsXML'=> '3.26', + 'Pod::Simple::HTML' => '3.26', + 'Pod::Simple::HTMLBatch'=> '3.26', + 'Pod::Simple::LinkSection'=> '3.26', + 'Pod::Simple::Methody' => '3.26', + 'Pod::Simple::Progress' => '3.26', + 'Pod::Simple::PullParser'=> '3.26', + 'Pod::Simple::PullParserEndToken'=> '3.26', + 'Pod::Simple::PullParserStartToken'=> '3.26', + 'Pod::Simple::PullParserTextToken'=> '3.26', + 'Pod::Simple::PullParserToken'=> '3.26', + 'Pod::Simple::RTF' => '3.26', + 'Pod::Simple::Search' => '3.26', + 'Pod::Simple::SimpleTree'=> '3.26', + 'Pod::Simple::Text' => '3.26', + 'Pod::Simple::TextContent'=> '3.26', + 'Pod::Simple::TiedOutFH'=> '3.26', + 'Pod::Simple::Transcode'=> '3.26', + 'Pod::Simple::TranscodeDumb'=> '3.26', + 'Pod::Simple::TranscodeSmart'=> '3.26', + 'Pod::Simple::XHTML' => '3.26', + 'Pod::Simple::XMLOutStream'=> '3.26', + 'Safe' => '2.35', + 'Term::ReadLine' => '1.12', + 'Text::ParseWords' => '3.28', + 'Tie::File' => '0.99', + 'Unicode::UCD' => '0.51', + 'Win32' => '0.47', + 'bigint' => '0.33', + 'bignum' => '0.33', + 'bigrat' => '0.33', + 'constant' => '1.27', + 'perlfaq' => '5.0150042', + 'version' => '0.9902', + }, + removed => { + } + }, + 5.017011 => { + delta_from => 5.017010, + changed => { + 'App::Cpan' => '1.61', + 'B::Deparse' => '1.20', + 'Config' => '5.017009', + 'Exporter' => '5.68', + 'Exporter::Heavy' => '5.68', + 'ExtUtils::CBuilder' => '0.280210', + 'ExtUtils::Command::MM' => '6.66', + 'ExtUtils::Liblist' => '6.66', + 'ExtUtils::Liblist::Kid'=> '6.66', + 'ExtUtils::MM' => '6.66', + 'ExtUtils::MM_AIX' => '6.66', + 'ExtUtils::MM_Any' => '6.66', + 'ExtUtils::MM_BeOS' => '6.66', + 'ExtUtils::MM_Cygwin' => '6.66', + 'ExtUtils::MM_DOS' => '6.66', + 'ExtUtils::MM_Darwin' => '6.66', + 'ExtUtils::MM_MacOS' => '6.66', + 'ExtUtils::MM_NW5' => '6.66', + 'ExtUtils::MM_OS2' => '6.66', + 'ExtUtils::MM_QNX' => '6.66', + 'ExtUtils::MM_UWIN' => '6.66', + 'ExtUtils::MM_Unix' => '6.66', + 'ExtUtils::MM_VMS' => '6.66', + 'ExtUtils::MM_VOS' => '6.66', + 'ExtUtils::MM_Win32' => '6.66', + 'ExtUtils::MM_Win95' => '6.66', + 'ExtUtils::MY' => '6.66', + 'ExtUtils::MakeMaker' => '6.66', + 'ExtUtils::MakeMaker::Config'=> '6.66', + 'ExtUtils::Mkbootstrap' => '6.66', + 'ExtUtils::Mksymlists' => '6.66', + 'ExtUtils::testlib' => '6.66', + 'File::Glob' => '1.20', + 'IO' => '1.28', + 'Module::CoreList' => '2.87', + 'Module::CoreList::TieHashDelta'=> '2.87', + 'Storable' => '2.41', + 'bigint' => '0.34', + 'mro' => '1.11', + 'overload' => '1.22', + 'warnings' => '1.18', + }, + removed => { + } + }, + 5.018000 => { + delta_from => 5.017011, + changed => { + 'Carp' => '1.29', + 'Carp::Heavy' => '1.29', + 'Config' => '5.018000', + 'Hash::Util' => '0.16', + 'IO::Handle' => '1.34', + 'IO::Socket' => '1.36', + 'Module::CoreList' => '2.89', + 'Module::CoreList::TieHashDelta'=> '2.89', + 'Pod::Simple' => '3.28', + 'Pod::Simple::BlackBox' => '3.28', + 'Pod::Simple::Checker' => '3.28', + 'Pod::Simple::Debug' => '3.28', + 'Pod::Simple::DumpAsText'=> '3.28', + 'Pod::Simple::DumpAsXML'=> '3.28', + 'Pod::Simple::HTML' => '3.28', + 'Pod::Simple::HTMLBatch'=> '3.28', + 'Pod::Simple::LinkSection'=> '3.28', + 'Pod::Simple::Methody' => '3.28', + 'Pod::Simple::Progress' => '3.28', + 'Pod::Simple::PullParser'=> '3.28', + 'Pod::Simple::PullParserEndToken'=> '3.28', + 'Pod::Simple::PullParserStartToken'=> '3.28', + 'Pod::Simple::PullParserTextToken'=> '3.28', + 'Pod::Simple::PullParserToken'=> '3.28', + 'Pod::Simple::RTF' => '3.28', + 'Pod::Simple::Search' => '3.28', + 'Pod::Simple::SimpleTree'=> '3.28', + 'Pod::Simple::Text' => '3.28', + 'Pod::Simple::TextContent'=> '3.28', + 'Pod::Simple::TiedOutFH'=> '3.28', + 'Pod::Simple::Transcode'=> '3.28', + 'Pod::Simple::TranscodeDumb'=> '3.28', + 'Pod::Simple::TranscodeSmart'=> '3.28', + 'Pod::Simple::XHTML' => '3.28', + 'Pod::Simple::XMLOutStream'=> '3.28', + }, + removed => { + } + }, + 5.018001 => { + delta_from => 5.018000, + changed => { + 'B' => '1.42_01', + 'Config' => '5.018001', + 'Digest::SHA' => '5.84_01', + 'Module::CoreList' => '2.96', + 'Module::CoreList::TieHashDelta'=> '2.96', + 'Module::CoreList::Utils'=> '2.96', + }, + removed => { + 'VMS::Filespec' => 1, + } + }, + 5.018002 => { + delta_from => 5.018001, + changed => { + 'B' => '1.42_02', + 'B::Concise' => '0.95_01', + 'Config' => '5.018002', + 'File::Glob' => '1.20_01', + 'Module::CoreList' => '3.03', + 'Module::CoreList::TieHashDelta'=> '3.03', + 'Module::CoreList::Utils'=> '3.03', + }, + }, + 5.018003 => { + delta_from => 5.018002, + changed => { + 'Config' => '5.018003', + 'Digest::SHA' => '5.84_02', + 'Module::CoreList' => '3.12', + 'Module::CoreList::TieHashDelta'=> '3.12', + 'Module::CoreList::Utils'=> '3.12', + }, + }, + 5.018004 => { + delta_from => 5.018003, + changed => { + 'Config' => '5.018004', + 'Module::CoreList' => '3.13', + 'Module::CoreList::TieHashDelta'=> '3.13', + 'Module::CoreList::Utils'=> '3.13', + }, + }, + 5.019000 => { + delta_from => 5.018000, + changed => { + 'Config' => '5.019000', + 'Getopt::Std' => '1.08', + 'Module::CoreList' => '2.91', + 'Module::CoreList::TieHashDelta'=> '2.91', + 'Storable' => '2.42', + 'feature' => '1.33', + 'utf8' => '1.11', + }, + removed => { + 'Archive::Extract' => 1, + 'B::Lint' => 1, + 'B::Lint::Debug' => 1, + 'CPANPLUS' => 1, + 'CPANPLUS::Backend' => 1, + 'CPANPLUS::Backend::RV' => 1, + 'CPANPLUS::Config' => 1, + 'CPANPLUS::Config::HomeEnv'=> 1, + 'CPANPLUS::Configure' => 1, + 'CPANPLUS::Configure::Setup'=> 1, + 'CPANPLUS::Dist' => 1, + 'CPANPLUS::Dist::Autobundle'=> 1, + 'CPANPLUS::Dist::Base' => 1, + 'CPANPLUS::Dist::Build' => 1, + 'CPANPLUS::Dist::Build::Constants'=> 1, + 'CPANPLUS::Dist::MM' => 1, + 'CPANPLUS::Dist::Sample'=> 1, + 'CPANPLUS::Error' => 1, + 'CPANPLUS::Internals' => 1, + 'CPANPLUS::Internals::Constants'=> 1, + 'CPANPLUS::Internals::Constants::Report'=> 1, + 'CPANPLUS::Internals::Extract'=> 1, + 'CPANPLUS::Internals::Fetch'=> 1, + 'CPANPLUS::Internals::Report'=> 1, + 'CPANPLUS::Internals::Search'=> 1, + 'CPANPLUS::Internals::Source'=> 1, + 'CPANPLUS::Internals::Source::Memory'=> 1, + 'CPANPLUS::Internals::Source::SQLite'=> 1, + 'CPANPLUS::Internals::Source::SQLite::Tie'=> 1, + 'CPANPLUS::Internals::Utils'=> 1, + 'CPANPLUS::Internals::Utils::Autoflush'=> 1, + 'CPANPLUS::Module' => 1, + 'CPANPLUS::Module::Author'=> 1, + 'CPANPLUS::Module::Author::Fake'=> 1, + 'CPANPLUS::Module::Checksums'=> 1, + 'CPANPLUS::Module::Fake'=> 1, + 'CPANPLUS::Module::Signature'=> 1, + 'CPANPLUS::Selfupdate' => 1, + 'CPANPLUS::Shell' => 1, + 'CPANPLUS::Shell::Classic'=> 1, + 'CPANPLUS::Shell::Default'=> 1, + 'CPANPLUS::Shell::Default::Plugins::CustomSource'=> 1, + 'CPANPLUS::Shell::Default::Plugins::Remote'=> 1, + 'CPANPLUS::Shell::Default::Plugins::Source'=> 1, + 'Devel::InnerPackage' => 1, + 'File::CheckTree' => 1, + 'Log::Message' => 1, + 'Log::Message::Config' => 1, + 'Log::Message::Handlers'=> 1, + 'Log::Message::Item' => 1, + 'Log::Message::Simple' => 1, + 'Module::Pluggable' => 1, + 'Module::Pluggable::Object'=> 1, + 'Object::Accessor' => 1, + 'Pod::LaTeX' => 1, + 'Term::UI' => 1, + 'Term::UI::History' => 1, + 'Text::Soundex' => 1, + } + }, + 5.019001 => { + delta_from => 5.019000, + changed => { + 'App::Prove' => '3.28', + 'App::Prove::State' => '3.28', + 'App::Prove::State::Result'=> '3.28', + 'App::Prove::State::Result::Test'=> '3.28', + 'Archive::Tar' => '1.92', + 'Archive::Tar::Constant'=> '1.92', + 'Archive::Tar::File' => '1.92', + 'Attribute::Handlers' => '0.95', + 'B' => '1.43', + 'B::Concise' => '0.96', + 'B::Deparse' => '1.21', + 'B::Showlex' => '1.04', + 'Benchmark' => '1.16', + 'CPAN::Meta' => '2.131560', + 'CPAN::Meta::Converter' => '2.131560', + 'CPAN::Meta::Feature' => '2.131560', + 'CPAN::Meta::History' => '2.131560', + 'CPAN::Meta::Prereqs' => '2.131560', + 'CPAN::Meta::Spec' => '2.131560', + 'CPAN::Meta::Validator' => '2.131560', + 'Carp' => '1.30', + 'Carp::Heavy' => '1.30', + 'Compress::Raw::Bzip2' => '2.061', + 'Compress::Raw::Zlib' => '2.061', + 'Compress::Zlib' => '2.061', + 'Config' => '5.019001', + 'Config::Perl::V' => '0.18', + 'Cwd' => '3.41', + 'DB' => '1.06', + 'DB_File' => '1.828', + 'Data::Dumper' => '2.146', + 'Encode' => '2.51', + 'Encode::CN::HZ' => '2.06', + 'Encode::GSM0338' => '2.03', + 'Encode::Unicode::UTF7' => '2.07', + 'ExtUtils::CBuilder::Base'=> '0.280210', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280210', + 'ExtUtils::Command::MM' => '6.68', + 'ExtUtils::Install' => '1.60', + 'ExtUtils::Liblist' => '6.68', + 'ExtUtils::Liblist::Kid'=> '6.68', + 'ExtUtils::MM' => '6.68', + 'ExtUtils::MM_AIX' => '6.68', + 'ExtUtils::MM_Any' => '6.68', + 'ExtUtils::MM_BeOS' => '6.68', + 'ExtUtils::MM_Cygwin' => '6.68', + 'ExtUtils::MM_DOS' => '6.68', + 'ExtUtils::MM_Darwin' => '6.68', + 'ExtUtils::MM_MacOS' => '6.68', + 'ExtUtils::MM_NW5' => '6.68', + 'ExtUtils::MM_OS2' => '6.68', + 'ExtUtils::MM_QNX' => '6.68', + 'ExtUtils::MM_UWIN' => '6.68', + 'ExtUtils::MM_Unix' => '6.68', + 'ExtUtils::MM_VMS' => '6.68', + 'ExtUtils::MM_VOS' => '6.68', + 'ExtUtils::MM_Win32' => '6.68', + 'ExtUtils::MM_Win95' => '6.68', + 'ExtUtils::MY' => '6.68', + 'ExtUtils::MakeMaker' => '6.68', + 'ExtUtils::MakeMaker::Config'=> '6.68', + 'ExtUtils::Mkbootstrap' => '6.68', + 'ExtUtils::Mksymlists' => '6.68', + 'ExtUtils::ParseXS' => '3.19', + 'ExtUtils::testlib' => '6.68', + 'Fatal' => '2.19', + 'File::Copy' => '2.27', + 'File::DosGlob' => '1.11', + 'File::Fetch' => '0.42', + 'File::Find' => '1.24', + 'File::Spec' => '3.41', + 'File::Spec::Cygwin' => '3.41', + 'File::Spec::Epoc' => '3.41', + 'File::Spec::Mac' => '3.41', + 'File::Spec::OS2' => '3.41', + 'File::Spec::Unix' => '3.41', + 'File::Spec::VMS' => '3.41', + 'File::Spec::Win32' => '3.41', + 'File::Temp' => '0.2301', + 'Filter::Simple' => '0.90', + 'Filter::Util::Call' => '1.49', + 'Getopt::Long' => '2.4', + 'HTTP::Tiny' => '0.031', + 'Hash::Util::FieldHash' => '1.11', + 'IO::Compress::Adapter::Bzip2'=> '2.061', + 'IO::Compress::Adapter::Deflate'=> '2.061', + 'IO::Compress::Adapter::Identity'=> '2.061', + 'IO::Compress::Base' => '2.061', + 'IO::Compress::Base::Common'=> '2.061', + 'IO::Compress::Bzip2' => '2.061', + 'IO::Compress::Deflate' => '2.061', + 'IO::Compress::Gzip' => '2.061', + 'IO::Compress::Gzip::Constants'=> '2.061', + 'IO::Compress::RawDeflate'=> '2.061', + 'IO::Compress::Zip' => '2.061', + 'IO::Compress::Zip::Constants'=> '2.061', + 'IO::Compress::Zlib::Constants'=> '2.061', + 'IO::Compress::Zlib::Extra'=> '2.061', + 'IO::Handle' => '1.35', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.061', + 'IO::Uncompress::Adapter::Identity'=> '2.061', + 'IO::Uncompress::Adapter::Inflate'=> '2.061', + 'IO::Uncompress::AnyInflate'=> '2.061', + 'IO::Uncompress::AnyUncompress'=> '2.061', + 'IO::Uncompress::Base' => '2.061', + 'IO::Uncompress::Bunzip2'=> '2.061', + 'IO::Uncompress::Gunzip'=> '2.061', + 'IO::Uncompress::Inflate'=> '2.061', + 'IO::Uncompress::RawInflate'=> '2.061', + 'IO::Uncompress::Unzip' => '2.061', + 'IPC::Open3' => '1.14', + 'Locale::Codes' => '3.26', + 'Locale::Codes::Constants'=> '3.26', + 'Locale::Codes::Country'=> '3.26', + 'Locale::Codes::Country_Codes'=> '3.26', + 'Locale::Codes::Country_Retired'=> '3.26', + 'Locale::Codes::Currency'=> '3.26', + 'Locale::Codes::Currency_Codes'=> '3.26', + 'Locale::Codes::Currency_Retired'=> '3.26', + 'Locale::Codes::LangExt'=> '3.26', + 'Locale::Codes::LangExt_Codes'=> '3.26', + 'Locale::Codes::LangExt_Retired'=> '3.26', + 'Locale::Codes::LangFam'=> '3.26', + 'Locale::Codes::LangFam_Codes'=> '3.26', + 'Locale::Codes::LangFam_Retired'=> '3.26', + 'Locale::Codes::LangVar'=> '3.26', + 'Locale::Codes::LangVar_Codes'=> '3.26', + 'Locale::Codes::LangVar_Retired'=> '3.26', + 'Locale::Codes::Language'=> '3.26', + 'Locale::Codes::Language_Codes'=> '3.26', + 'Locale::Codes::Language_Retired'=> '3.26', + 'Locale::Codes::Script' => '3.26', + 'Locale::Codes::Script_Codes'=> '3.26', + 'Locale::Codes::Script_Retired'=> '3.26', + 'Locale::Country' => '3.26', + 'Locale::Currency' => '3.26', + 'Locale::Language' => '3.26', + 'Locale::Maketext' => '1.24', + 'Locale::Script' => '3.26', + 'Math::BigFloat' => '1.999', + 'Math::BigInt' => '1.9992', + 'Math::BigInt::Calc' => '1.998', + 'Math::BigInt::CalcEmu' => '1.9991', + 'Math::BigRat' => '0.2606', + 'Module::Build' => '0.4005', + 'Module::Build::Base' => '0.4005', + 'Module::Build::Compat' => '0.4005', + 'Module::Build::Config' => '0.4005', + 'Module::Build::Cookbook'=> '0.4005', + 'Module::Build::Dumper' => '0.4005', + 'Module::Build::ModuleInfo'=> '0.4005', + 'Module::Build::Notes' => '0.4005', + 'Module::Build::PPMMaker'=> '0.4005', + 'Module::Build::Platform::Amiga'=> '0.4005', + 'Module::Build::Platform::Default'=> '0.4005', + 'Module::Build::Platform::EBCDIC'=> '0.4005', + 'Module::Build::Platform::MPEiX'=> '0.4005', + 'Module::Build::Platform::MacOS'=> '0.4005', + 'Module::Build::Platform::RiscOS'=> '0.4005', + 'Module::Build::Platform::Unix'=> '0.4005', + 'Module::Build::Platform::VMS'=> '0.4005', + 'Module::Build::Platform::VOS'=> '0.4005', + 'Module::Build::Platform::Windows'=> '0.4005', + 'Module::Build::Platform::aix'=> '0.4005', + 'Module::Build::Platform::cygwin'=> '0.4005', + 'Module::Build::Platform::darwin'=> '0.4005', + 'Module::Build::Platform::os2'=> '0.4005', + 'Module::Build::PodParser'=> '0.4005', + 'Module::CoreList' => '2.92', + 'Module::CoreList::TieHashDelta'=> '2.92', + 'Module::CoreList::Utils'=> '2.92', + 'Module::Metadata' => '1.000014', + 'Net::Ping' => '2.42', + 'OS2::Process' => '1.09', + 'POSIX' => '1.33', + 'Pod::Find' => '1.61', + 'Pod::Html' => '1.19', + 'Pod::InputObjects' => '1.61', + 'Pod::ParseUtils' => '1.61', + 'Pod::Parser' => '1.61', + 'Pod::Perldoc' => '3.20', + 'Pod::Perldoc::BaseTo' => '3.20', + 'Pod::Perldoc::GetOptsOO'=> '3.20', + 'Pod::Perldoc::ToANSI' => '3.20', + 'Pod::Perldoc::ToChecker'=> '3.20', + 'Pod::Perldoc::ToMan' => '3.20', + 'Pod::Perldoc::ToNroff' => '3.20', + 'Pod::Perldoc::ToPod' => '3.20', + 'Pod::Perldoc::ToRtf' => '3.20', + 'Pod::Perldoc::ToTerm' => '3.20', + 'Pod::Perldoc::ToText' => '3.20', + 'Pod::Perldoc::ToTk' => '3.20', + 'Pod::Perldoc::ToXml' => '3.20', + 'Pod::Select' => '1.61', + 'Pod::Usage' => '1.63', + 'Safe' => '2.36', + 'Storable' => '2.43', + 'Sys::Hostname' => '1.18', + 'Sys::Syslog' => '0.33', + 'TAP::Base' => '3.28', + 'TAP::Formatter::Base' => '3.28', + 'TAP::Formatter::Color' => '3.28', + 'TAP::Formatter::Console'=> '3.28', + 'TAP::Formatter::Console::ParallelSession'=> '3.28', + 'TAP::Formatter::Console::Session'=> '3.28', + 'TAP::Formatter::File' => '3.28', + 'TAP::Formatter::File::Session'=> '3.28', + 'TAP::Formatter::Session'=> '3.28', + 'TAP::Harness' => '3.28', + 'TAP::Object' => '3.28', + 'TAP::Parser' => '3.28', + 'TAP::Parser::Aggregator'=> '3.28', + 'TAP::Parser::Grammar' => '3.28', + 'TAP::Parser::Iterator' => '3.28', + 'TAP::Parser::Iterator::Array'=> '3.28', + 'TAP::Parser::Iterator::Process'=> '3.28', + 'TAP::Parser::Iterator::Stream'=> '3.28', + 'TAP::Parser::IteratorFactory'=> '3.28', + 'TAP::Parser::Multiplexer'=> '3.28', + 'TAP::Parser::Result' => '3.28', + 'TAP::Parser::Result::Bailout'=> '3.28', + 'TAP::Parser::Result::Comment'=> '3.28', + 'TAP::Parser::Result::Plan'=> '3.28', + 'TAP::Parser::Result::Pragma'=> '3.28', + 'TAP::Parser::Result::Test'=> '3.28', + 'TAP::Parser::Result::Unknown'=> '3.28', + 'TAP::Parser::Result::Version'=> '3.28', + 'TAP::Parser::Result::YAML'=> '3.28', + 'TAP::Parser::ResultFactory'=> '3.28', + 'TAP::Parser::Scheduler'=> '3.28', + 'TAP::Parser::Scheduler::Job'=> '3.28', + 'TAP::Parser::Scheduler::Spinner'=> '3.28', + 'TAP::Parser::Source' => '3.28', + 'TAP::Parser::SourceHandler'=> '3.28', + 'TAP::Parser::SourceHandler::Executable'=> '3.28', + 'TAP::Parser::SourceHandler::File'=> '3.28', + 'TAP::Parser::SourceHandler::Handle'=> '3.28', + 'TAP::Parser::SourceHandler::Perl'=> '3.28', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.28', + 'TAP::Parser::Utils' => '3.28', + 'TAP::Parser::YAMLish::Reader'=> '3.28', + 'TAP::Parser::YAMLish::Writer'=> '3.28', + 'Term::ReadLine' => '1.13', + 'Test::Harness' => '3.28', + 'Text::Tabs' => '2013.0523', + 'Text::Wrap' => '2013.0523', + 'Thread' => '3.04', + 'Tie::File' => '1.00', + 'Time::Piece' => '1.2002', + 'Unicode::Collate' => '0.98', + 'Unicode::UCD' => '0.53', + 'XS::APItest' => '0.53', + '_charnames' => '1.37', + 'autodie' => '2.19', + 'autodie::exception' => '2.19', + 'autodie::exception::system'=> '2.19', + 'autodie::hints' => '2.19', + 'autodie::skip' => '2.19', + 'bigint' => '0.35', + 'charnames' => '1.38', + 'encoding' => '2.12', + 'inc::latest' => '0.4005', + 'mro' => '1.12', + 'perlfaq' => '5.0150043', + 're' => '0.25', + 'threads' => '1.87', + 'threads::shared' => '1.44', + 'utf8' => '1.12', + }, + removed => { + } + }, + 5.019002 => { + delta_from => 5.019001, + changed => { + 'B' => '1.44', + 'B::Concise' => '0.98', + 'B::Deparse' => '1.22', + 'Benchmark' => '1.17', + 'Class::Struct' => '0.65', + 'Config' => '5.019002', + 'DB' => '1.07', + 'DBM_Filter' => '0.06', + 'DBM_Filter::compress' => '0.03', + 'DBM_Filter::encode' => '0.03', + 'DBM_Filter::int32' => '0.03', + 'DBM_Filter::null' => '0.03', + 'DBM_Filter::utf8' => '0.03', + 'DB_File' => '1.829', + 'Data::Dumper' => '2.147', + 'Devel::Peek' => '1.12', + 'Digest::MD5' => '2.53', + 'Digest::SHA' => '5.85', + 'English' => '1.07', + 'Errno' => '1.19', + 'ExtUtils::Embed' => '1.31', + 'ExtUtils::Miniperl' => '1', + 'ExtUtils::ParseXS' => '3.21', + 'ExtUtils::ParseXS::Constants'=> '3.21', + 'ExtUtils::ParseXS::CountLines'=> '3.21', + 'ExtUtils::ParseXS::Eval'=> '3.19', + 'ExtUtils::ParseXS::Utilities'=> '3.21', + 'ExtUtils::Typemaps' => '3.21', + 'ExtUtils::Typemaps::Cmd'=> '3.21', + 'ExtUtils::Typemaps::InputMap'=> '3.21', + 'ExtUtils::Typemaps::OutputMap'=> '3.21', + 'ExtUtils::Typemaps::Type'=> '3.21', + 'ExtUtils::XSSymSet' => '1.3', + 'Fatal' => '2.20', + 'File::Basename' => '2.85', + 'File::Spec::VMS' => '3.43', + 'File::Spec::Win32' => '3.42', + 'Getopt::Long' => '2.41', + 'Getopt::Std' => '1.09', + 'HTTP::Tiny' => '0.034', + 'Hash::Util::FieldHash' => '1.12', + 'I18N::Langinfo' => '0.11', + 'IO::Socket::INET' => '1.34', + 'IO::Socket::UNIX' => '1.25', + 'IPC::Cmd' => '0.82', + 'MIME::Base64' => '3.14', + 'Module::CoreList' => '2.94', + 'Module::CoreList::TieHashDelta'=> '2.94', + 'Module::CoreList::Utils'=> '2.94', + 'POSIX' => '1.34', + 'Params::Check' => '0.38', + 'Parse::CPAN::Meta' => '1.4405', + 'Pod::Functions' => '1.07', + 'Pod::Html' => '1.2', + 'Safe' => '2.37', + 'Socket' => '2.010', + 'Storable' => '2.45', + 'Text::ParseWords' => '3.29', + 'Tie::Array' => '1.06', + 'Tie::Hash' => '1.05', + 'Tie::Scalar' => '1.03', + 'Time::Piece' => '1.21', + 'Time::Seconds' => '1.21', + 'XS::APItest' => '0.54', + 'autodie' => '2.20', + 'autodie::exception' => '2.20', + 'autodie::exception::system'=> '2.20', + 'autodie::hints' => '2.20', + 'autodie::skip' => '2.20', + 'base' => '2.19', + 'deprecate' => '0.03', + 'if' => '0.0603', + 'integer' => '1.01', + 'strict' => '1.08', + 'subs' => '1.02', + 'vmsish' => '1.04', + }, + removed => { + } + }, + 5.019003 => { + delta_from => 5.019002, + changed => { + 'B' => '1.45', + 'CPAN::Meta' => '2.132140', + 'CPAN::Meta::Converter' => '2.132140', + 'CPAN::Meta::Feature' => '2.132140', + 'CPAN::Meta::History' => '2.132140', + 'CPAN::Meta::Prereqs' => '2.132140', + 'CPAN::Meta::Spec' => '2.132140', + 'CPAN::Meta::Validator' => '2.132140', + 'Carp' => '1.31', + 'Carp::Heavy' => '1.31', + 'Compress::Raw::Bzip2' => '2.062', + 'Compress::Raw::Zlib' => '2.062', + 'Compress::Zlib' => '2.062', + 'Config' => '5.019003', + 'Config::Perl::V' => '0.19', + 'Cwd' => '3.44', + 'Data::Dumper' => '2.148', + 'Devel::PPPort' => '3.21', + 'Devel::Peek' => '1.13', + 'DynaLoader' => '1.19', + 'Encode' => '2.52', + 'Encode::Alias' => '2.17', + 'Encode::Encoding' => '2.06', + 'Encode::GSM0338' => '2.04', + 'Encode::MIME::Header' => '2.14', + 'Encode::Unicode' => '2.08', + 'English' => '1.08', + 'Exporter' => '5.69', + 'Exporter::Heavy' => '5.69', + 'ExtUtils::Command::MM' => '6.72', + 'ExtUtils::Liblist' => '6.72', + 'ExtUtils::Liblist::Kid'=> '6.72', + 'ExtUtils::MM' => '6.72', + 'ExtUtils::MM_AIX' => '6.72', + 'ExtUtils::MM_Any' => '6.72', + 'ExtUtils::MM_BeOS' => '6.72', + 'ExtUtils::MM_Cygwin' => '6.72', + 'ExtUtils::MM_DOS' => '6.72', + 'ExtUtils::MM_Darwin' => '6.72', + 'ExtUtils::MM_MacOS' => '6.72', + 'ExtUtils::MM_NW5' => '6.72', + 'ExtUtils::MM_OS2' => '6.72', + 'ExtUtils::MM_QNX' => '6.72', + 'ExtUtils::MM_UWIN' => '6.72', + 'ExtUtils::MM_Unix' => '6.72', + 'ExtUtils::MM_VMS' => '6.72', + 'ExtUtils::MM_VOS' => '6.72', + 'ExtUtils::MM_Win32' => '6.72', + 'ExtUtils::MM_Win95' => '6.72', + 'ExtUtils::MY' => '6.72', + 'ExtUtils::MakeMaker' => '6.72', + 'ExtUtils::MakeMaker::Config'=> '6.72', + 'ExtUtils::Mkbootstrap' => '6.72', + 'ExtUtils::Mksymlists' => '6.72', + 'ExtUtils::ParseXS::Eval'=> '3.21', + 'ExtUtils::testlib' => '6.72', + 'File::Spec' => '3.44', + 'File::Spec::Cygwin' => '3.44', + 'File::Spec::Epoc' => '3.44', + 'File::Spec::Functions' => '3.44', + 'File::Spec::Mac' => '3.44', + 'File::Spec::OS2' => '3.44', + 'File::Spec::Unix' => '3.44', + 'File::Spec::VMS' => '3.44', + 'File::Spec::Win32' => '3.44', + 'Getopt::Std' => '1.10', + 'IO::Compress::Adapter::Bzip2'=> '2.062', + 'IO::Compress::Adapter::Deflate'=> '2.062', + 'IO::Compress::Adapter::Identity'=> '2.062', + 'IO::Compress::Base' => '2.062', + 'IO::Compress::Base::Common'=> '2.062', + 'IO::Compress::Bzip2' => '2.062', + 'IO::Compress::Deflate' => '2.062', + 'IO::Compress::Gzip' => '2.062', + 'IO::Compress::Gzip::Constants'=> '2.062', + 'IO::Compress::RawDeflate'=> '2.062', + 'IO::Compress::Zip' => '2.062', + 'IO::Compress::Zip::Constants'=> '2.062', + 'IO::Compress::Zlib::Constants'=> '2.062', + 'IO::Compress::Zlib::Extra'=> '2.062', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.062', + 'IO::Uncompress::Adapter::Identity'=> '2.062', + 'IO::Uncompress::Adapter::Inflate'=> '2.062', + 'IO::Uncompress::AnyInflate'=> '2.062', + 'IO::Uncompress::AnyUncompress'=> '2.062', + 'IO::Uncompress::Base' => '2.062', + 'IO::Uncompress::Bunzip2'=> '2.062', + 'IO::Uncompress::Gunzip'=> '2.062', + 'IO::Uncompress::Inflate'=> '2.062', + 'IO::Uncompress::RawInflate'=> '2.062', + 'IO::Uncompress::Unzip' => '2.062', + 'IPC::Cmd' => '0.84', + 'IPC::Msg' => '2.04', + 'IPC::Open3' => '1.15', + 'IPC::Semaphore' => '2.04', + 'IPC::SharedMem' => '2.04', + 'IPC::SysV' => '2.04', + 'List::Util' => '1.31', + 'List::Util::XS' => '1.31', + 'Math::BigFloat::Trace' => '0.36', + 'Math::BigInt::Trace' => '0.36', + 'Module::Build' => '0.4007', + 'Module::Build::Base' => '0.4007', + 'Module::Build::Compat' => '0.4007', + 'Module::Build::Config' => '0.4007', + 'Module::Build::Cookbook'=> '0.4007', + 'Module::Build::Dumper' => '0.4007', + 'Module::Build::ModuleInfo'=> '0.4007', + 'Module::Build::Notes' => '0.4007', + 'Module::Build::PPMMaker'=> '0.4007', + 'Module::Build::Platform::Default'=> '0.4007', + 'Module::Build::Platform::MacOS'=> '0.4007', + 'Module::Build::Platform::Unix'=> '0.4007', + 'Module::Build::Platform::VMS'=> '0.4007', + 'Module::Build::Platform::VOS'=> '0.4007', + 'Module::Build::Platform::Windows'=> '0.4007', + 'Module::Build::Platform::aix'=> '0.4007', + 'Module::Build::Platform::cygwin'=> '0.4007', + 'Module::Build::Platform::darwin'=> '0.4007', + 'Module::Build::Platform::os2'=> '0.4007', + 'Module::Build::PodParser'=> '0.4007', + 'Module::CoreList' => '2.97', + 'Module::CoreList::TieHashDelta'=> '2.97', + 'Module::CoreList::Utils'=> '2.97', + 'Net::Cmd' => '2.30', + 'Net::Config' => '1.12', + 'Net::Domain' => '2.22', + 'Net::FTP' => '2.78', + 'Net::FTP::dataconn' => '0.12', + 'Net::NNTP' => '2.25', + 'Net::Netrc' => '2.14', + 'Net::POP3' => '2.30', + 'Net::SMTP' => '2.32', + 'PerlIO' => '1.08', + 'Pod::Functions' => '1.08', + 'Scalar::Util' => '1.31', + 'Socket' => '2.011', + 'Storable' => '2.46', + 'Time::HiRes' => '1.9726', + 'Time::Piece' => '1.22', + 'Time::Seconds' => '1.22', + 'XS::APItest' => '0.55', + 'bigint' => '0.36', + 'bignum' => '0.36', + 'bigrat' => '0.36', + 'constant' => '1.28', + 'diagnostics' => '1.32', + 'inc::latest' => '0.4007', + 'mro' => '1.13', + 'parent' => '0.226', + 'utf8' => '1.13', + 'version' => '0.9903', + }, + removed => { + 'Module::Build::Platform::Amiga'=> 1, + 'Module::Build::Platform::EBCDIC'=> 1, + 'Module::Build::Platform::MPEiX'=> 1, + 'Module::Build::Platform::RiscOS'=> 1, + } + }, + 5.019004 => { + delta_from => 5.019003, + changed => { + 'B' => '1.46', + 'B::Concise' => '0.99', + 'B::Deparse' => '1.23', + 'CPAN' => '2.03', + 'CPAN::Meta' => '2.132620', + 'CPAN::Meta::Converter' => '2.132620', + 'CPAN::Meta::Feature' => '2.132620', + 'CPAN::Meta::History' => '2.132620', + 'CPAN::Meta::Prereqs' => '2.132620', + 'CPAN::Meta::Requirements'=> '2.123', + 'CPAN::Meta::Spec' => '2.132620', + 'CPAN::Meta::Validator' => '2.132620', + 'Carp' => '1.32', + 'Carp::Heavy' => '1.32', + 'Config' => '5.019004', + 'Data::Dumper' => '2.149', + 'Devel::Peek' => '1.14', + 'DynaLoader' => '1.20', + 'Encode' => '2.55', + 'Encode::Alias' => '2.18', + 'Encode::CN::HZ' => '2.07', + 'Encode::Encoder' => '2.03', + 'Encode::Encoding' => '2.07', + 'Encode::GSM0338' => '2.05', + 'Encode::Guess' => '2.06', + 'Encode::JP::JIS7' => '2.05', + 'Encode::KR::2022_KR' => '2.03', + 'Encode::MIME::Header' => '2.15', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.04', + 'Encode::Unicode' => '2.09', + 'Encode::Unicode::UTF7' => '2.08', + 'Errno' => '1.20', + 'Exporter' => '5.70', + 'Exporter::Heavy' => '5.70', + 'ExtUtils::CBuilder' => '0.280212', + 'ExtUtils::CBuilder::Base'=> '0.280212', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280212', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280212', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280212', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280212', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280212', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280212', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280212', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280212', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280212', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280212', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280212', + 'ExtUtils::Command' => '1.18', + 'ExtUtils::Command::MM' => '6.76', + 'ExtUtils::Liblist' => '6.76', + 'ExtUtils::Liblist::Kid'=> '6.76', + 'ExtUtils::MM' => '6.76', + 'ExtUtils::MM_AIX' => '6.76', + 'ExtUtils::MM_Any' => '6.76', + 'ExtUtils::MM_BeOS' => '6.76', + 'ExtUtils::MM_Cygwin' => '6.76', + 'ExtUtils::MM_DOS' => '6.76', + 'ExtUtils::MM_Darwin' => '6.76', + 'ExtUtils::MM_MacOS' => '6.76', + 'ExtUtils::MM_NW5' => '6.76', + 'ExtUtils::MM_OS2' => '6.76', + 'ExtUtils::MM_QNX' => '6.76', + 'ExtUtils::MM_UWIN' => '6.76', + 'ExtUtils::MM_Unix' => '6.76', + 'ExtUtils::MM_VMS' => '6.76', + 'ExtUtils::MM_VOS' => '6.76', + 'ExtUtils::MM_Win32' => '6.76', + 'ExtUtils::MM_Win95' => '6.76', + 'ExtUtils::MY' => '6.76', + 'ExtUtils::MakeMaker' => '6.76', + 'ExtUtils::MakeMaker::Config'=> '6.76', + 'ExtUtils::Mkbootstrap' => '6.76', + 'ExtUtils::Mksymlists' => '6.76', + 'ExtUtils::ParseXS' => '3.23', + 'ExtUtils::ParseXS::Constants'=> '3.23', + 'ExtUtils::ParseXS::CountLines'=> '3.23', + 'ExtUtils::ParseXS::Eval'=> '3.23', + 'ExtUtils::ParseXS::Utilities'=> '3.23', + 'ExtUtils::Typemaps' => '3.23', + 'ExtUtils::Typemaps::Cmd'=> '3.23', + 'ExtUtils::Typemaps::InputMap'=> '3.23', + 'ExtUtils::Typemaps::OutputMap'=> '3.23', + 'ExtUtils::Typemaps::Type'=> '3.23', + 'ExtUtils::testlib' => '6.76', + 'Fatal' => '2.21', + 'File::Copy' => '2.28', + 'File::Find' => '1.25', + 'File::Glob' => '1.21', + 'FileCache' => '1.09', + 'HTTP::Tiny' => '0.035', + 'Hash::Util::FieldHash' => '1.13', + 'I18N::LangTags' => '0.40', + 'IO' => '1.29', + 'IO::Socket' => '1.37', + 'IPC::Open3' => '1.16', + 'JSON::PP' => '2.27202_01', + 'List::Util' => '1.32', + 'List::Util::XS' => '1.32', + 'Locale::Codes' => '3.27', + 'Locale::Codes::Constants'=> '3.27', + 'Locale::Codes::Country'=> '3.27', + 'Locale::Codes::Country_Codes'=> '3.27', + 'Locale::Codes::Country_Retired'=> '3.27', + 'Locale::Codes::Currency'=> '3.27', + 'Locale::Codes::Currency_Codes'=> '3.27', + 'Locale::Codes::Currency_Retired'=> '3.27', + 'Locale::Codes::LangExt'=> '3.27', + 'Locale::Codes::LangExt_Codes'=> '3.27', + 'Locale::Codes::LangExt_Retired'=> '3.27', + 'Locale::Codes::LangFam'=> '3.27', + 'Locale::Codes::LangFam_Codes'=> '3.27', + 'Locale::Codes::LangFam_Retired'=> '3.27', + 'Locale::Codes::LangVar'=> '3.27', + 'Locale::Codes::LangVar_Codes'=> '3.27', + 'Locale::Codes::LangVar_Retired'=> '3.27', + 'Locale::Codes::Language'=> '3.27', + 'Locale::Codes::Language_Codes'=> '3.27', + 'Locale::Codes::Language_Retired'=> '3.27', + 'Locale::Codes::Script' => '3.27', + 'Locale::Codes::Script_Codes'=> '3.27', + 'Locale::Codes::Script_Retired'=> '3.27', + 'Locale::Country' => '3.27', + 'Locale::Currency' => '3.27', + 'Locale::Language' => '3.27', + 'Locale::Script' => '3.27', + 'Math::BigFloat' => '1.9991', + 'Math::BigInt' => '1.9993', + 'Math::BigInt::FastCalc'=> '0.31', + 'Module::CoreList' => '2.99', + 'Module::CoreList::TieHashDelta'=> '2.99', + 'Module::CoreList::Utils'=> '2.99', + 'Module::Load::Conditional'=> '0.58', + 'Module::Metadata' => '1.000018', + 'Opcode' => '1.26', + 'POSIX' => '1.35', + 'Parse::CPAN::Meta' => '1.4407', + 'Perl::OSType' => '1.005', + 'Pod::Html' => '1.21', + 'Scalar::Util' => '1.32', + 'Socket' => '2.012', + 'Storable' => '2.47', + 'Term::ReadLine' => '1.14', + 'Test::Builder' => '0.98_06', + 'Test::Builder::Module' => '0.98_06', + 'Test::More' => '0.98_06', + 'Test::Simple' => '0.98_06', + 'Time::Piece' => '1.23', + 'Time::Seconds' => '1.23', + 'Unicode::Collate' => '0.99', + 'Unicode::UCD' => '0.54', + 'XS::APItest' => '0.56', + 'XS::Typemap' => '0.11', + '_charnames' => '1.39', + 'autodie' => '2.21', + 'autodie::exception' => '2.21', + 'autodie::exception::system'=> '2.21', + 'autodie::hints' => '2.21', + 'autodie::skip' => '2.21', + 'charnames' => '1.39', + 'diagnostics' => '1.33', + 'mro' => '1.14', + 'parent' => '0.228', + 'perlfaq' => '5.0150044', + 're' => '0.26', + 'version' => '0.9904', + 'warnings' => '1.19', + }, + removed => { + } + }, + 5.019005 => { + delta_from => 5.019004, + changed => { + 'App::Prove' => '3.29', + 'App::Prove::State' => '3.29', + 'App::Prove::State::Result'=> '3.29', + 'App::Prove::State::Result::Test'=> '3.29', + 'CPAN::Meta' => '2.132830', + 'CPAN::Meta::Converter' => '2.132830', + 'CPAN::Meta::Feature' => '2.132830', + 'CPAN::Meta::History' => '2.132830', + 'CPAN::Meta::Prereqs' => '2.132830', + 'CPAN::Meta::Requirements'=> '2.125', + 'CPAN::Meta::Spec' => '2.132830', + 'CPAN::Meta::Validator' => '2.132830', + 'CPAN::Meta::YAML' => '0.010', + 'Config' => '5.019005', + 'Cwd' => '3.45', + 'ExtUtils::Command::MM' => '6.80', + 'ExtUtils::Install' => '1.61', + 'ExtUtils::Liblist' => '6.80', + 'ExtUtils::Liblist::Kid'=> '6.80', + 'ExtUtils::MM' => '6.80', + 'ExtUtils::MM_AIX' => '6.80', + 'ExtUtils::MM_Any' => '6.80', + 'ExtUtils::MM_BeOS' => '6.80', + 'ExtUtils::MM_Cygwin' => '6.80', + 'ExtUtils::MM_DOS' => '6.80', + 'ExtUtils::MM_Darwin' => '6.80', + 'ExtUtils::MM_MacOS' => '6.80', + 'ExtUtils::MM_NW5' => '6.80', + 'ExtUtils::MM_OS2' => '6.80', + 'ExtUtils::MM_QNX' => '6.80', + 'ExtUtils::MM_UWIN' => '6.80', + 'ExtUtils::MM_Unix' => '6.80', + 'ExtUtils::MM_VMS' => '6.80', + 'ExtUtils::MM_VOS' => '6.80', + 'ExtUtils::MM_Win32' => '6.80', + 'ExtUtils::MM_Win95' => '6.80', + 'ExtUtils::MY' => '6.80', + 'ExtUtils::MakeMaker' => '6.80', + 'ExtUtils::MakeMaker::Config'=> '6.80', + 'ExtUtils::Mkbootstrap' => '6.80', + 'ExtUtils::Mksymlists' => '6.80', + 'ExtUtils::testlib' => '6.80', + 'Fatal' => '2.22', + 'File::Fetch' => '0.44', + 'File::Glob' => '1.22', + 'File::Spec' => '3.45', + 'File::Spec::Cygwin' => '3.45', + 'File::Spec::Epoc' => '3.45', + 'File::Spec::Functions' => '3.45', + 'File::Spec::Mac' => '3.45', + 'File::Spec::OS2' => '3.45', + 'File::Spec::Unix' => '3.45', + 'File::Spec::VMS' => '3.45', + 'File::Spec::Win32' => '3.45', + 'File::Temp' => '0.2304', + 'Getopt::Long' => '2.42', + 'HTTP::Tiny' => '0.036', + 'IPC::Cmd' => '0.84_01', + 'JSON::PP' => '2.27203', + 'List::Util' => '1.35', + 'List::Util::XS' => '1.35', + 'Module::CoreList' => '3.00', + 'Module::CoreList::TieHashDelta'=> '3.00', + 'Module::CoreList::Utils'=> '3.00', + 'Module::Metadata' => '1.000019', + 'Parse::CPAN::Meta' => '1.4409', + 'Perl::OSType' => '1.006', + 'PerlIO::scalar' => '0.17', + 'Pod::Man' => '2.28', + 'Pod::Text' => '3.18', + 'Pod::Text::Termcap' => '2.08', + 'Scalar::Util' => '1.35', + 'TAP::Base' => '3.29', + 'TAP::Formatter::Base' => '3.29', + 'TAP::Formatter::Color' => '3.29', + 'TAP::Formatter::Console'=> '3.29', + 'TAP::Formatter::Console::ParallelSession'=> '3.29', + 'TAP::Formatter::Console::Session'=> '3.29', + 'TAP::Formatter::File' => '3.29', + 'TAP::Formatter::File::Session'=> '3.29', + 'TAP::Formatter::Session'=> '3.29', + 'TAP::Harness' => '3.29', + 'TAP::Harness::Env' => '3.29', + 'TAP::Object' => '3.29', + 'TAP::Parser' => '3.29', + 'TAP::Parser::Aggregator'=> '3.29', + 'TAP::Parser::Grammar' => '3.29', + 'TAP::Parser::Iterator' => '3.29', + 'TAP::Parser::Iterator::Array'=> '3.29', + 'TAP::Parser::Iterator::Process'=> '3.29', + 'TAP::Parser::Iterator::Stream'=> '3.29', + 'TAP::Parser::IteratorFactory'=> '3.29', + 'TAP::Parser::Multiplexer'=> '3.29', + 'TAP::Parser::Result' => '3.29', + 'TAP::Parser::Result::Bailout'=> '3.29', + 'TAP::Parser::Result::Comment'=> '3.29', + 'TAP::Parser::Result::Plan'=> '3.29', + 'TAP::Parser::Result::Pragma'=> '3.29', + 'TAP::Parser::Result::Test'=> '3.29', + 'TAP::Parser::Result::Unknown'=> '3.29', + 'TAP::Parser::Result::Version'=> '3.29', + 'TAP::Parser::Result::YAML'=> '3.29', + 'TAP::Parser::ResultFactory'=> '3.29', + 'TAP::Parser::Scheduler'=> '3.29', + 'TAP::Parser::Scheduler::Job'=> '3.29', + 'TAP::Parser::Scheduler::Spinner'=> '3.29', + 'TAP::Parser::Source' => '3.29', + 'TAP::Parser::SourceHandler'=> '3.29', + 'TAP::Parser::SourceHandler::Executable'=> '3.29', + 'TAP::Parser::SourceHandler::File'=> '3.29', + 'TAP::Parser::SourceHandler::Handle'=> '3.29', + 'TAP::Parser::SourceHandler::Perl'=> '3.29', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.29', + 'TAP::Parser::YAMLish::Reader'=> '3.29', + 'TAP::Parser::YAMLish::Writer'=> '3.29', + 'Test::Builder' => '0.99', + 'Test::Builder::Module' => '0.99', + 'Test::Builder::Tester' => '1.23_002', + 'Test::Builder::Tester::Color'=> '1.23_002', + 'Test::Harness' => '3.29', + 'Test::More' => '0.99', + 'Test::Simple' => '0.99', + 'Unicode' => '6.3.0', + 'Unicode::Normalize' => '1.17', + 'Unicode::UCD' => '0.55', + 'attributes' => '0.22', + 'autodie' => '2.22', + 'autodie::exception' => '2.22', + 'autodie::exception::system'=> '2.22', + 'autodie::hints' => '2.22', + 'autodie::skip' => '2.22', + 'feature' => '1.34', + 'threads' => '1.89', + 'warnings' => '1.20', + }, + removed => { + 'TAP::Parser::Utils' => 1, + } + }, + 5.019006 => { + delta_from => 5.019005, + changed => { + 'App::Prove' => '3.30', + 'App::Prove::State' => '3.30', + 'App::Prove::State::Result'=> '3.30', + 'App::Prove::State::Result::Test'=> '3.30', + 'Archive::Tar' => '1.96', + 'Archive::Tar::Constant'=> '1.96', + 'Archive::Tar::File' => '1.96', + 'AutoLoader' => '5.74', + 'B' => '1.47', + 'B::Concise' => '0.991', + 'B::Debug' => '1.19', + 'B::Deparse' => '1.24', + 'Benchmark' => '1.18', + 'Compress::Raw::Bzip2' => '2.063', + 'Compress::Raw::Zlib' => '2.063', + 'Compress::Zlib' => '2.063', + 'Config' => '5.019006', + 'DB_File' => '1.831', + 'Devel::Peek' => '1.15', + 'DynaLoader' => '1.21', + 'Errno' => '1.20_01', + 'ExtUtils::Command::MM' => '6.82', + 'ExtUtils::Liblist' => '6.82', + 'ExtUtils::Liblist::Kid'=> '6.82', + 'ExtUtils::MM' => '6.82', + 'ExtUtils::MM_AIX' => '6.82', + 'ExtUtils::MM_Any' => '6.82', + 'ExtUtils::MM_BeOS' => '6.82', + 'ExtUtils::MM_Cygwin' => '6.82', + 'ExtUtils::MM_DOS' => '6.82', + 'ExtUtils::MM_Darwin' => '6.82', + 'ExtUtils::MM_MacOS' => '6.82', + 'ExtUtils::MM_NW5' => '6.82', + 'ExtUtils::MM_OS2' => '6.82', + 'ExtUtils::MM_QNX' => '6.82', + 'ExtUtils::MM_UWIN' => '6.82', + 'ExtUtils::MM_Unix' => '6.82', + 'ExtUtils::MM_VMS' => '6.82', + 'ExtUtils::MM_VOS' => '6.82', + 'ExtUtils::MM_Win32' => '6.82', + 'ExtUtils::MM_Win95' => '6.82', + 'ExtUtils::MY' => '6.82', + 'ExtUtils::MakeMaker' => '6.82', + 'ExtUtils::MakeMaker::Config'=> '6.82', + 'ExtUtils::Mkbootstrap' => '6.82', + 'ExtUtils::Mksymlists' => '6.82', + 'ExtUtils::testlib' => '6.82', + 'File::DosGlob' => '1.12', + 'File::Find' => '1.26', + 'File::Glob' => '1.23', + 'HTTP::Tiny' => '0.038', + 'IO' => '1.30', + 'IO::Compress::Adapter::Bzip2'=> '2.063', + 'IO::Compress::Adapter::Deflate'=> '2.063', + 'IO::Compress::Adapter::Identity'=> '2.063', + 'IO::Compress::Base' => '2.063', + 'IO::Compress::Base::Common'=> '2.063', + 'IO::Compress::Bzip2' => '2.063', + 'IO::Compress::Deflate' => '2.063', + 'IO::Compress::Gzip' => '2.063', + 'IO::Compress::Gzip::Constants'=> '2.063', + 'IO::Compress::RawDeflate'=> '2.063', + 'IO::Compress::Zip' => '2.063', + 'IO::Compress::Zip::Constants'=> '2.063', + 'IO::Compress::Zlib::Constants'=> '2.063', + 'IO::Compress::Zlib::Extra'=> '2.063', + 'IO::Select' => '1.22', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.063', + 'IO::Uncompress::Adapter::Identity'=> '2.063', + 'IO::Uncompress::Adapter::Inflate'=> '2.063', + 'IO::Uncompress::AnyInflate'=> '2.063', + 'IO::Uncompress::AnyUncompress'=> '2.063', + 'IO::Uncompress::Base' => '2.063', + 'IO::Uncompress::Bunzip2'=> '2.063', + 'IO::Uncompress::Gunzip'=> '2.063', + 'IO::Uncompress::Inflate'=> '2.063', + 'IO::Uncompress::RawInflate'=> '2.063', + 'IO::Uncompress::Unzip' => '2.063', + 'IPC::Cmd' => '0.90', + 'Locale::Maketext' => '1.25', + 'Module::Build' => '0.4202', + 'Module::Build::Base' => '0.4202', + 'Module::Build::Compat' => '0.4202', + 'Module::Build::Config' => '0.4202', + 'Module::Build::Cookbook'=> '0.4202', + 'Module::Build::Dumper' => '0.4202', + 'Module::Build::ModuleInfo'=> '0.4202', + 'Module::Build::Notes' => '0.4202', + 'Module::Build::PPMMaker'=> '0.4202', + 'Module::Build::Platform::Default'=> '0.4202', + 'Module::Build::Platform::MacOS'=> '0.4202', + 'Module::Build::Platform::Unix'=> '0.4202', + 'Module::Build::Platform::VMS'=> '0.4202', + 'Module::Build::Platform::VOS'=> '0.4202', + 'Module::Build::Platform::Windows'=> '0.4202', + 'Module::Build::Platform::aix'=> '0.4202', + 'Module::Build::Platform::cygwin'=> '0.4202', + 'Module::Build::Platform::darwin'=> '0.4202', + 'Module::Build::Platform::os2'=> '0.4202', + 'Module::Build::PodParser'=> '0.4202', + 'Module::CoreList' => '3.01', + 'Module::CoreList::TieHashDelta'=> '3.01', + 'Module::CoreList::Utils'=> '3.01', + 'Opcode' => '1.27', + 'POSIX' => '1.36', + 'Package::Constants' => '0.04', + 'PerlIO::scalar' => '0.18', + 'PerlIO::via' => '0.13', + 'SDBM_File' => '1.10', + 'Socket' => '2.013', + 'TAP::Base' => '3.30', + 'TAP::Formatter::Base' => '3.30', + 'TAP::Formatter::Color' => '3.30', + 'TAP::Formatter::Console'=> '3.30', + 'TAP::Formatter::Console::ParallelSession'=> '3.30', + 'TAP::Formatter::Console::Session'=> '3.30', + 'TAP::Formatter::File' => '3.30', + 'TAP::Formatter::File::Session'=> '3.30', + 'TAP::Formatter::Session'=> '3.30', + 'TAP::Harness' => '3.30', + 'TAP::Harness::Env' => '3.30', + 'TAP::Object' => '3.30', + 'TAP::Parser' => '3.30', + 'TAP::Parser::Aggregator'=> '3.30', + 'TAP::Parser::Grammar' => '3.30', + 'TAP::Parser::Iterator' => '3.30', + 'TAP::Parser::Iterator::Array'=> '3.30', + 'TAP::Parser::Iterator::Process'=> '3.30', + 'TAP::Parser::Iterator::Stream'=> '3.30', + 'TAP::Parser::IteratorFactory'=> '3.30', + 'TAP::Parser::Multiplexer'=> '3.30', + 'TAP::Parser::Result' => '3.30', + 'TAP::Parser::Result::Bailout'=> '3.30', + 'TAP::Parser::Result::Comment'=> '3.30', + 'TAP::Parser::Result::Plan'=> '3.30', + 'TAP::Parser::Result::Pragma'=> '3.30', + 'TAP::Parser::Result::Test'=> '3.30', + 'TAP::Parser::Result::Unknown'=> '3.30', + 'TAP::Parser::Result::Version'=> '3.30', + 'TAP::Parser::Result::YAML'=> '3.30', + 'TAP::Parser::ResultFactory'=> '3.30', + 'TAP::Parser::Scheduler'=> '3.30', + 'TAP::Parser::Scheduler::Job'=> '3.30', + 'TAP::Parser::Scheduler::Spinner'=> '3.30', + 'TAP::Parser::Source' => '3.30', + 'TAP::Parser::SourceHandler'=> '3.30', + 'TAP::Parser::SourceHandler::Executable'=> '3.30', + 'TAP::Parser::SourceHandler::File'=> '3.30', + 'TAP::Parser::SourceHandler::Handle'=> '3.30', + 'TAP::Parser::SourceHandler::Perl'=> '3.30', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.30', + 'TAP::Parser::YAMLish::Reader'=> '3.30', + 'TAP::Parser::YAMLish::Writer'=> '3.30', + 'Term::Cap' => '1.15', + 'Test::Builder' => '1.001002', + 'Test::Builder::Module' => '1.001002', + 'Test::Harness' => '3.30', + 'Test::More' => '1.001002', + 'Test::Simple' => '1.001002', + 'Tie::StdHandle' => '4.4', + 'Unicode::Collate' => '1.02', + 'Unicode::Collate::CJK::Korean'=> '1.02', + 'Unicode::Collate::Locale'=> '1.02', + 'XS::APItest' => '0.57', + 'XS::Typemap' => '0.12', + 'arybase' => '0.07', + 'bignum' => '0.37', + 'constant' => '1.29', + 'fields' => '2.17', + 'inc::latest' => '0.4202', + 'threads' => '1.90', + 'threads::shared' => '1.45', + }, + removed => { + } + }, + 5.019007 => { + delta_from => 5.019006, + changed => { + 'CGI' => '3.64', + 'CGI::Apache' => '1.02', + 'CGI::Carp' => '3.64', + 'CGI::Cookie' => '1.31', + 'CGI::Fast' => '1.10', + 'CGI::Pretty' => '3.64', + 'CGI::Push' => '1.06', + 'CGI::Switch' => '1.02', + 'CGI::Util' => '3.64', + 'CPAN::Meta' => '2.133380', + 'CPAN::Meta::Converter' => '2.133380', + 'CPAN::Meta::Feature' => '2.133380', + 'CPAN::Meta::History' => '2.133380', + 'CPAN::Meta::Prereqs' => '2.133380', + 'CPAN::Meta::Spec' => '2.133380', + 'CPAN::Meta::Validator' => '2.133380', + 'Config' => '5.019007', + 'Data::Dumper' => '2.150', + 'DynaLoader' => '1.22', + 'ExtUtils::Command::MM' => '6.84', + 'ExtUtils::Liblist' => '6.84', + 'ExtUtils::Liblist::Kid'=> '6.84', + 'ExtUtils::MM' => '6.84', + 'ExtUtils::MM_AIX' => '6.84', + 'ExtUtils::MM_Any' => '6.84', + 'ExtUtils::MM_BeOS' => '6.84', + 'ExtUtils::MM_Cygwin' => '6.84', + 'ExtUtils::MM_DOS' => '6.84', + 'ExtUtils::MM_Darwin' => '6.84', + 'ExtUtils::MM_MacOS' => '6.84', + 'ExtUtils::MM_NW5' => '6.84', + 'ExtUtils::MM_OS2' => '6.84', + 'ExtUtils::MM_QNX' => '6.84', + 'ExtUtils::MM_UWIN' => '6.84', + 'ExtUtils::MM_Unix' => '6.84', + 'ExtUtils::MM_VMS' => '6.84', + 'ExtUtils::MM_VOS' => '6.84', + 'ExtUtils::MM_Win32' => '6.84', + 'ExtUtils::MM_Win95' => '6.84', + 'ExtUtils::MY' => '6.84', + 'ExtUtils::MakeMaker' => '6.84', + 'ExtUtils::MakeMaker::Config'=> '6.84', + 'ExtUtils::Mkbootstrap' => '6.84', + 'ExtUtils::Mksymlists' => '6.84', + 'ExtUtils::testlib' => '6.84', + 'File::Fetch' => '0.46', + 'HTTP::Tiny' => '0.039', + 'Locale::Codes' => '3.28', + 'Locale::Codes::Constants'=> '3.28', + 'Locale::Codes::Country'=> '3.28', + 'Locale::Codes::Country_Codes'=> '3.28', + 'Locale::Codes::Country_Retired'=> '3.28', + 'Locale::Codes::Currency'=> '3.28', + 'Locale::Codes::Currency_Codes'=> '3.28', + 'Locale::Codes::Currency_Retired'=> '3.28', + 'Locale::Codes::LangExt'=> '3.28', + 'Locale::Codes::LangExt_Codes'=> '3.28', + 'Locale::Codes::LangExt_Retired'=> '3.28', + 'Locale::Codes::LangFam'=> '3.28', + 'Locale::Codes::LangFam_Codes'=> '3.28', + 'Locale::Codes::LangFam_Retired'=> '3.28', + 'Locale::Codes::LangVar'=> '3.28', + 'Locale::Codes::LangVar_Codes'=> '3.28', + 'Locale::Codes::LangVar_Retired'=> '3.28', + 'Locale::Codes::Language'=> '3.28', + 'Locale::Codes::Language_Codes'=> '3.28', + 'Locale::Codes::Language_Retired'=> '3.28', + 'Locale::Codes::Script' => '3.28', + 'Locale::Codes::Script_Codes'=> '3.28', + 'Locale::Codes::Script_Retired'=> '3.28', + 'Locale::Country' => '3.28', + 'Locale::Currency' => '3.28', + 'Locale::Language' => '3.28', + 'Locale::Script' => '3.28', + 'Module::Build' => '0.4203', + 'Module::Build::Base' => '0.4203', + 'Module::Build::Compat' => '0.4203', + 'Module::Build::Config' => '0.4203', + 'Module::Build::Cookbook'=> '0.4203', + 'Module::Build::Dumper' => '0.4203', + 'Module::Build::ModuleInfo'=> '0.4203', + 'Module::Build::Notes' => '0.4203', + 'Module::Build::PPMMaker'=> '0.4203', + 'Module::Build::Platform::Default'=> '0.4203', + 'Module::Build::Platform::MacOS'=> '0.4203', + 'Module::Build::Platform::Unix'=> '0.4203', + 'Module::Build::Platform::VMS'=> '0.4203', + 'Module::Build::Platform::VOS'=> '0.4203', + 'Module::Build::Platform::Windows'=> '0.4203', + 'Module::Build::Platform::aix'=> '0.4203', + 'Module::Build::Platform::cygwin'=> '0.4203', + 'Module::Build::Platform::darwin'=> '0.4203', + 'Module::Build::Platform::os2'=> '0.4203', + 'Module::Build::PodParser'=> '0.4203', + 'Module::CoreList' => '3.02', + 'Module::CoreList::TieHashDelta'=> '3.02', + 'Module::CoreList::Utils'=> '3.02', + 'POSIX' => '1.37', + 'PerlIO::encoding' => '0.17', + 'PerlIO::via' => '0.14', + 'SDBM_File' => '1.11', + 'Storable' => '2.48', + 'Time::Piece' => '1.24', + 'Time::Seconds' => '1.24', + 'Unicode::Collate' => '1.04', + 'Win32' => '0.48', + 'XS::APItest' => '0.58', + 'base' => '2.20', + 'constant' => '1.30', + 'inc::latest' => '0.4203', + 'threads' => '1.91', + }, + removed => { + } + }, + 5.019008 => { + delta_from => 5.019007, + changed => { + 'Config' => '5.019008', + 'DynaLoader' => '1.24', + 'Encode' => '2.57', + 'Errno' => '1.20_02', + 'ExtUtils::CBuilder' => '0.280213', + 'ExtUtils::CBuilder::Base'=> '0.280213', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280213', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280213', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280213', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280213', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280213', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280213', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280213', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280213', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280213', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280213', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280213', + 'ExtUtils::Command::MM' => '6.86', + 'ExtUtils::Liblist' => '6.86', + 'ExtUtils::Liblist::Kid'=> '6.86', + 'ExtUtils::MM' => '6.86', + 'ExtUtils::MM_AIX' => '6.86', + 'ExtUtils::MM_Any' => '6.86', + 'ExtUtils::MM_BeOS' => '6.86', + 'ExtUtils::MM_Cygwin' => '6.86', + 'ExtUtils::MM_DOS' => '6.86', + 'ExtUtils::MM_Darwin' => '6.86', + 'ExtUtils::MM_MacOS' => '6.86', + 'ExtUtils::MM_NW5' => '6.86', + 'ExtUtils::MM_OS2' => '6.86', + 'ExtUtils::MM_QNX' => '6.86', + 'ExtUtils::MM_UWIN' => '6.86', + 'ExtUtils::MM_Unix' => '6.86', + 'ExtUtils::MM_VMS' => '6.86', + 'ExtUtils::MM_VOS' => '6.86', + 'ExtUtils::MM_Win32' => '6.86', + 'ExtUtils::MM_Win95' => '6.86', + 'ExtUtils::MY' => '6.86', + 'ExtUtils::MakeMaker' => '6.86', + 'ExtUtils::MakeMaker::Config'=> '6.86', + 'ExtUtils::Mkbootstrap' => '6.86', + 'ExtUtils::Mksymlists' => '6.86', + 'ExtUtils::testlib' => '6.86', + 'File::Copy' => '2.29', + 'Hash::Util::FieldHash' => '1.14', + 'IO::Socket::IP' => '0.26', + 'IO::Socket::UNIX' => '1.26', + 'List::Util' => '1.36', + 'List::Util::XS' => '1.36', + 'Module::Build' => '0.4204', + 'Module::Build::Base' => '0.4204', + 'Module::Build::Compat' => '0.4204', + 'Module::Build::Config' => '0.4204', + 'Module::Build::Cookbook'=> '0.4204', + 'Module::Build::Dumper' => '0.4204', + 'Module::Build::ModuleInfo'=> '0.4204', + 'Module::Build::Notes' => '0.4204', + 'Module::Build::PPMMaker'=> '0.4204', + 'Module::Build::Platform::Default'=> '0.4204', + 'Module::Build::Platform::MacOS'=> '0.4204', + 'Module::Build::Platform::Unix'=> '0.4204', + 'Module::Build::Platform::VMS'=> '0.4204', + 'Module::Build::Platform::VOS'=> '0.4204', + 'Module::Build::Platform::Windows'=> '0.4204', + 'Module::Build::Platform::aix'=> '0.4204', + 'Module::Build::Platform::cygwin'=> '0.4204', + 'Module::Build::Platform::darwin'=> '0.4204', + 'Module::Build::Platform::os2'=> '0.4204', + 'Module::Build::PodParser'=> '0.4204', + 'Module::CoreList' => '3.04', + 'Module::CoreList::TieHashDelta'=> '3.04', + 'Module::CoreList::Utils'=> '3.04', + 'Module::Load' => '0.28', + 'Module::Load::Conditional'=> '0.60', + 'Net::Config' => '1.13', + 'Net::FTP::A' => '1.19', + 'POSIX' => '1.38_01', + 'Perl::OSType' => '1.007', + 'PerlIO::encoding' => '0.18', + 'Pod::Perldoc' => '3.21', + 'Pod::Perldoc::BaseTo' => '3.21', + 'Pod::Perldoc::GetOptsOO'=> '3.21', + 'Pod::Perldoc::ToANSI' => '3.21', + 'Pod::Perldoc::ToChecker'=> '3.21', + 'Pod::Perldoc::ToMan' => '3.21', + 'Pod::Perldoc::ToNroff' => '3.21', + 'Pod::Perldoc::ToPod' => '3.21', + 'Pod::Perldoc::ToRtf' => '3.21', + 'Pod::Perldoc::ToTerm' => '3.21', + 'Pod::Perldoc::ToText' => '3.21', + 'Pod::Perldoc::ToTk' => '3.21', + 'Pod::Perldoc::ToXml' => '3.21', + 'Scalar::Util' => '1.36', + 'Time::Piece' => '1.27', + 'Time::Seconds' => '1.27', + 'Unicode::UCD' => '0.57', + 'XS::APItest' => '0.59', + 'XSLoader' => '0.17', + 'base' => '2.21', + 'constant' => '1.31', + 'inc::latest' => '0.4204', + 'threads::shared' => '1.46', + 'version' => '0.9907', + 'version::regex' => '0.9907', + 'version::vpp' => '0.9907', + 'warnings' => '1.21', + }, + removed => { + } + }, + 5.019009 => { + delta_from => 5.019008, + changed => { + 'B' => '1.48', + 'B::Concise' => '0.992', + 'B::Deparse' => '1.25', + 'CGI' => '3.65', + 'CPAN::Meta::YAML' => '0.011', + 'Compress::Raw::Bzip2' => '2.064', + 'Compress::Raw::Zlib' => '2.065', + 'Compress::Zlib' => '2.064', + 'Config' => '5.019009', + 'Config::Perl::V' => '0.20', + 'Cwd' => '3.47', + 'Devel::Peek' => '1.16', + 'Digest::SHA' => '5.87', + 'DynaLoader' => '1.25', + 'English' => '1.09', + 'ExtUtils::CBuilder' => '0.280216', + 'ExtUtils::CBuilder::Base'=> '0.280216', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280216', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280216', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280216', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280216', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280216', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280216', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280216', + 'ExtUtils::CBuilder::Platform::android'=> '0.280216', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280216', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280216', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280216', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280216', + 'ExtUtils::Command::MM' => '6.88', + 'ExtUtils::Embed' => '1.32', + 'ExtUtils::Install' => '1.62', + 'ExtUtils::Installed' => '1.999004', + 'ExtUtils::Liblist' => '6.88', + 'ExtUtils::Liblist::Kid'=> '6.88', + 'ExtUtils::MM' => '6.88', + 'ExtUtils::MM_AIX' => '6.88', + 'ExtUtils::MM_Any' => '6.88', + 'ExtUtils::MM_BeOS' => '6.88', + 'ExtUtils::MM_Cygwin' => '6.88', + 'ExtUtils::MM_DOS' => '6.88', + 'ExtUtils::MM_Darwin' => '6.88', + 'ExtUtils::MM_MacOS' => '6.88', + 'ExtUtils::MM_NW5' => '6.88', + 'ExtUtils::MM_OS2' => '6.88', + 'ExtUtils::MM_QNX' => '6.88', + 'ExtUtils::MM_UWIN' => '6.88', + 'ExtUtils::MM_Unix' => '6.88', + 'ExtUtils::MM_VMS' => '6.88', + 'ExtUtils::MM_VOS' => '6.88', + 'ExtUtils::MM_Win32' => '6.88', + 'ExtUtils::MM_Win95' => '6.88', + 'ExtUtils::MY' => '6.88', + 'ExtUtils::MakeMaker' => '6.88', + 'ExtUtils::MakeMaker::Config'=> '6.88', + 'ExtUtils::Mkbootstrap' => '6.88', + 'ExtUtils::Mksymlists' => '6.88', + 'ExtUtils::Packlist' => '1.47', + 'ExtUtils::testlib' => '6.88', + 'Fatal' => '2.23', + 'File::Fetch' => '0.48', + 'File::Spec' => '3.47', + 'File::Spec::Cygwin' => '3.47', + 'File::Spec::Epoc' => '3.47', + 'File::Spec::Functions' => '3.47', + 'File::Spec::Mac' => '3.47', + 'File::Spec::OS2' => '3.47', + 'File::Spec::Unix' => '3.47', + 'File::Spec::VMS' => '3.47', + 'File::Spec::Win32' => '3.47', + 'HTTP::Tiny' => '0.042', + 'IO::Compress::Adapter::Bzip2'=> '2.064', + 'IO::Compress::Adapter::Deflate'=> '2.064', + 'IO::Compress::Adapter::Identity'=> '2.064', + 'IO::Compress::Base' => '2.064', + 'IO::Compress::Base::Common'=> '2.064', + 'IO::Compress::Bzip2' => '2.064', + 'IO::Compress::Deflate' => '2.064', + 'IO::Compress::Gzip' => '2.064', + 'IO::Compress::Gzip::Constants'=> '2.064', + 'IO::Compress::RawDeflate'=> '2.064', + 'IO::Compress::Zip' => '2.064', + 'IO::Compress::Zip::Constants'=> '2.064', + 'IO::Compress::Zlib::Constants'=> '2.064', + 'IO::Compress::Zlib::Extra'=> '2.064', + 'IO::Socket::INET' => '1.35', + 'IO::Socket::IP' => '0.28', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.064', + 'IO::Uncompress::Adapter::Identity'=> '2.064', + 'IO::Uncompress::Adapter::Inflate'=> '2.064', + 'IO::Uncompress::AnyInflate'=> '2.064', + 'IO::Uncompress::AnyUncompress'=> '2.064', + 'IO::Uncompress::Base' => '2.064', + 'IO::Uncompress::Bunzip2'=> '2.064', + 'IO::Uncompress::Gunzip'=> '2.064', + 'IO::Uncompress::Inflate'=> '2.064', + 'IO::Uncompress::RawInflate'=> '2.064', + 'IO::Uncompress::Unzip' => '2.064', + 'IPC::Cmd' => '0.92', + 'List::Util' => '1.38', + 'List::Util::XS' => '1.38', + 'Locale::Codes' => '3.29', + 'Locale::Codes::Constants'=> '3.29', + 'Locale::Codes::Country'=> '3.29', + 'Locale::Codes::Country_Codes'=> '3.29', + 'Locale::Codes::Country_Retired'=> '3.29', + 'Locale::Codes::Currency'=> '3.29', + 'Locale::Codes::Currency_Codes'=> '3.29', + 'Locale::Codes::Currency_Retired'=> '3.29', + 'Locale::Codes::LangExt'=> '3.29', + 'Locale::Codes::LangExt_Codes'=> '3.29', + 'Locale::Codes::LangExt_Retired'=> '3.29', + 'Locale::Codes::LangFam'=> '3.29', + 'Locale::Codes::LangFam_Codes'=> '3.29', + 'Locale::Codes::LangFam_Retired'=> '3.29', + 'Locale::Codes::LangVar'=> '3.29', + 'Locale::Codes::LangVar_Codes'=> '3.29', + 'Locale::Codes::LangVar_Retired'=> '3.29', + 'Locale::Codes::Language'=> '3.29', + 'Locale::Codes::Language_Codes'=> '3.29', + 'Locale::Codes::Language_Retired'=> '3.29', + 'Locale::Codes::Script' => '3.29', + 'Locale::Codes::Script_Codes'=> '3.29', + 'Locale::Codes::Script_Retired'=> '3.29', + 'Locale::Country' => '3.29', + 'Locale::Currency' => '3.29', + 'Locale::Language' => '3.29', + 'Locale::Script' => '3.29', + 'Module::Build' => '0.4205', + 'Module::Build::Base' => '0.4205', + 'Module::Build::Compat' => '0.4205', + 'Module::Build::Config' => '0.4205', + 'Module::Build::Cookbook'=> '0.4205', + 'Module::Build::Dumper' => '0.4205', + 'Module::Build::ModuleInfo'=> '0.4205', + 'Module::Build::Notes' => '0.4205', + 'Module::Build::PPMMaker'=> '0.4205', + 'Module::Build::Platform::Default'=> '0.4205', + 'Module::Build::Platform::MacOS'=> '0.4205', + 'Module::Build::Platform::Unix'=> '0.4205', + 'Module::Build::Platform::VMS'=> '0.4205', + 'Module::Build::Platform::VOS'=> '0.4205', + 'Module::Build::Platform::Windows'=> '0.4205', + 'Module::Build::Platform::aix'=> '0.4205', + 'Module::Build::Platform::cygwin'=> '0.4205', + 'Module::Build::Platform::darwin'=> '0.4205', + 'Module::Build::Platform::os2'=> '0.4205', + 'Module::Build::PodParser'=> '0.4205', + 'Module::CoreList' => '3.06', + 'Module::CoreList::TieHashDelta'=> '3.06', + 'Module::CoreList::Utils'=> '3.06', + 'Module::Load' => '0.30', + 'Module::Load::Conditional'=> '0.62', + 'Net::Domain' => '2.23', + 'Net::FTP' => '2.79', + 'Net::NNTP' => '2.26', + 'Net::POP3' => '2.31', + 'Net::Ping' => '2.43', + 'Net::SMTP' => '2.33', + 'POSIX' => '1.38_02', + 'Parse::CPAN::Meta' => '1.4413', + 'Pod::Escapes' => '1.06', + 'Pod::Find' => '1.62', + 'Pod::InputObjects' => '1.62', + 'Pod::ParseUtils' => '1.62', + 'Pod::Parser' => '1.62', + 'Pod::Select' => '1.62', + 'Scalar::Util' => '1.38', + 'autodie' => '2.23', + 'autodie::exception' => '2.23', + 'autodie::exception::system'=> '2.23', + 'autodie::hints' => '2.23', + 'autodie::skip' => '2.23', + 'diagnostics' => '1.34', + 'feature' => '1.35', + 'inc::latest' => '0.4205', + 'locale' => '1.03', + 'mro' => '1.15', + 'threads' => '1.92', + 'version' => '0.9908', + 'version::regex' => '0.9908', + 'version::vpp' => '0.9908', + 'warnings' => '1.22', + }, + removed => { + } + }, + 5.01901 => { + delta_from => 5.019009, + changed => { + 'App::Cpan' => '1.62', + 'Attribute::Handlers' => '0.96', + 'B::Deparse' => '1.26', + 'CPAN' => '2.04', + 'CPAN::Bundle' => '5.5001', + 'CPAN::Complete' => '5.5001', + 'CPAN::Distribution' => '2.01', + 'CPAN::Distroprefs' => '6.0001', + 'CPAN::FirstTime' => '5.5305', + 'CPAN::Meta' => '2.140640', + 'CPAN::Meta::Converter' => '2.140640', + 'CPAN::Meta::Feature' => '2.140640', + 'CPAN::Meta::History' => '2.140640', + 'CPAN::Meta::Prereqs' => '2.140640', + 'CPAN::Meta::Spec' => '2.140640', + 'CPAN::Meta::Validator' => '2.140640', + 'CPAN::Meta::YAML' => '0.012', + 'CPAN::Queue' => '5.5002', + 'CPAN::Shell' => '5.5003', + 'CPAN::Tarzip' => '5.5012', + 'CPAN::Version' => '5.5003', + 'Carp' => '1.33', + 'Carp::Heavy' => '1.33', + 'Config' => '5.019010', + 'Data::Dumper' => '2.151', + 'Devel::PPPort' => '3.22', + 'Digest::SHA' => '5.88', + 'ExtUtils::Command::MM' => '6.92', + 'ExtUtils::Install' => '1.63', + 'ExtUtils::Installed' => '1.999005', + 'ExtUtils::Liblist' => '6.92', + 'ExtUtils::Liblist::Kid'=> '6.92', + 'ExtUtils::MM' => '6.92', + 'ExtUtils::MM_AIX' => '6.92', + 'ExtUtils::MM_Any' => '6.92', + 'ExtUtils::MM_BeOS' => '6.92', + 'ExtUtils::MM_Cygwin' => '6.92', + 'ExtUtils::MM_DOS' => '6.92', + 'ExtUtils::MM_Darwin' => '6.92', + 'ExtUtils::MM_MacOS' => '6.92', + 'ExtUtils::MM_NW5' => '6.92', + 'ExtUtils::MM_OS2' => '6.92', + 'ExtUtils::MM_QNX' => '6.92', + 'ExtUtils::MM_UWIN' => '6.92', + 'ExtUtils::MM_Unix' => '6.92', + 'ExtUtils::MM_VMS' => '6.92', + 'ExtUtils::MM_VOS' => '6.92', + 'ExtUtils::MM_Win32' => '6.92', + 'ExtUtils::MM_Win95' => '6.92', + 'ExtUtils::MY' => '6.92', + 'ExtUtils::MakeMaker' => '6.92', + 'ExtUtils::MakeMaker::Config'=> '6.92', + 'ExtUtils::Mkbootstrap' => '6.92', + 'ExtUtils::Mksymlists' => '6.92', + 'ExtUtils::Packlist' => '1.48', + 'ExtUtils::ParseXS' => '3.24', + 'ExtUtils::ParseXS::Constants'=> '3.24', + 'ExtUtils::ParseXS::CountLines'=> '3.24', + 'ExtUtils::ParseXS::Eval'=> '3.24', + 'ExtUtils::ParseXS::Utilities'=> '3.24', + 'ExtUtils::Typemaps' => '3.24', + 'ExtUtils::Typemaps::Cmd'=> '3.24', + 'ExtUtils::Typemaps::InputMap'=> '3.24', + 'ExtUtils::Typemaps::OutputMap'=> '3.24', + 'ExtUtils::Typemaps::Type'=> '3.24', + 'ExtUtils::testlib' => '6.92', + 'File::Find' => '1.27', + 'Filter::Simple' => '0.91', + 'HTTP::Tiny' => '0.043', + 'Hash::Util::FieldHash' => '1.15', + 'IO' => '1.31', + 'IO::Socket::IP' => '0.29', + 'Locale::Codes' => '3.30', + 'Locale::Codes::Constants'=> '3.30', + 'Locale::Codes::Country'=> '3.30', + 'Locale::Codes::Country_Codes'=> '3.30', + 'Locale::Codes::Country_Retired'=> '3.30', + 'Locale::Codes::Currency'=> '3.30', + 'Locale::Codes::Currency_Codes'=> '3.30', + 'Locale::Codes::Currency_Retired'=> '3.30', + 'Locale::Codes::LangExt'=> '3.30', + 'Locale::Codes::LangExt_Codes'=> '3.30', + 'Locale::Codes::LangExt_Retired'=> '3.30', + 'Locale::Codes::LangFam'=> '3.30', + 'Locale::Codes::LangFam_Codes'=> '3.30', + 'Locale::Codes::LangFam_Retired'=> '3.30', + 'Locale::Codes::LangVar'=> '3.30', + 'Locale::Codes::LangVar_Codes'=> '3.30', + 'Locale::Codes::LangVar_Retired'=> '3.30', + 'Locale::Codes::Language'=> '3.30', + 'Locale::Codes::Language_Codes'=> '3.30', + 'Locale::Codes::Language_Retired'=> '3.30', + 'Locale::Codes::Script' => '3.30', + 'Locale::Codes::Script_Codes'=> '3.30', + 'Locale::Codes::Script_Retired'=> '3.30', + 'Locale::Country' => '3.30', + 'Locale::Currency' => '3.30', + 'Locale::Language' => '3.30', + 'Locale::Script' => '3.30', + 'Module::CoreList' => '3.09', + 'Module::CoreList::TieHashDelta'=> '3.09', + 'Module::CoreList::Utils'=> '3.09', + 'Module::Load' => '0.32', + 'POSIX' => '1.38_03', + 'Parse::CPAN::Meta' => '1.4414', + 'Pod::Perldoc' => '3.23', + 'Pod::Perldoc::BaseTo' => '3.23', + 'Pod::Perldoc::GetOptsOO'=> '3.23', + 'Pod::Perldoc::ToANSI' => '3.23', + 'Pod::Perldoc::ToChecker'=> '3.23', + 'Pod::Perldoc::ToMan' => '3.23', + 'Pod::Perldoc::ToNroff' => '3.23', + 'Pod::Perldoc::ToPod' => '3.23', + 'Pod::Perldoc::ToRtf' => '3.23', + 'Pod::Perldoc::ToTerm' => '3.23', + 'Pod::Perldoc::ToText' => '3.23', + 'Pod::Perldoc::ToTk' => '3.23', + 'Pod::Perldoc::ToXml' => '3.23', + 'Thread::Queue' => '3.05', + 'XS::APItest' => '0.60', + 'XS::Typemap' => '0.13', + 'autouse' => '1.08', + 'base' => '2.22', + 'charnames' => '1.40', + 'feature' => '1.36', + 'mro' => '1.16', + 'threads' => '1.93', + 'warnings' => '1.23', + 'warnings::register' => '1.03', + }, + removed => { + } + }, + 5.019011 => { + delta_from => 5.01901, + changed => { + 'CPAN' => '2.05', + 'CPAN::Distribution' => '2.02', + 'CPAN::FirstTime' => '5.5306', + 'CPAN::Shell' => '5.5004', + 'Carp' => '1.3301', + 'Carp::Heavy' => '1.3301', + 'Config' => '5.019011', + 'ExtUtils::Command::MM' => '6.94', + 'ExtUtils::Install' => '1.67', + 'ExtUtils::Liblist' => '6.94', + 'ExtUtils::Liblist::Kid'=> '6.94', + 'ExtUtils::MM' => '6.94', + 'ExtUtils::MM_AIX' => '6.94', + 'ExtUtils::MM_Any' => '6.94', + 'ExtUtils::MM_BeOS' => '6.94', + 'ExtUtils::MM_Cygwin' => '6.94', + 'ExtUtils::MM_DOS' => '6.94', + 'ExtUtils::MM_Darwin' => '6.94', + 'ExtUtils::MM_MacOS' => '6.94', + 'ExtUtils::MM_NW5' => '6.94', + 'ExtUtils::MM_OS2' => '6.94', + 'ExtUtils::MM_QNX' => '6.94', + 'ExtUtils::MM_UWIN' => '6.94', + 'ExtUtils::MM_Unix' => '6.94', + 'ExtUtils::MM_VMS' => '6.94', + 'ExtUtils::MM_VOS' => '6.94', + 'ExtUtils::MM_Win32' => '6.94', + 'ExtUtils::MM_Win95' => '6.94', + 'ExtUtils::MY' => '6.94', + 'ExtUtils::MakeMaker' => '6.94', + 'ExtUtils::MakeMaker::Config'=> '6.94', + 'ExtUtils::Mkbootstrap' => '6.94', + 'ExtUtils::Mksymlists' => '6.94', + 'ExtUtils::testlib' => '6.94', + 'Module::CoreList' => '3.10', + 'Module::CoreList::TieHashDelta'=> '3.10', + 'Module::CoreList::Utils'=> '3.10', + 'PerlIO' => '1.09', + 'Storable' => '2.49', + 'Win32' => '0.49', + 'experimental' => '0.007', + }, + removed => { + } + }, + 5.020000 => { + delta_from => 5.019011, + changed => { + 'Config' => '5.02', + 'Devel::PPPort' => '3.21', + 'Encode' => '2.60', + 'Errno' => '1.20_03', + 'ExtUtils::Command::MM' => '6.98', + 'ExtUtils::Liblist' => '6.98', + 'ExtUtils::Liblist::Kid'=> '6.98', + 'ExtUtils::MM' => '6.98', + 'ExtUtils::MM_AIX' => '6.98', + 'ExtUtils::MM_Any' => '6.98', + 'ExtUtils::MM_BeOS' => '6.98', + 'ExtUtils::MM_Cygwin' => '6.98', + 'ExtUtils::MM_DOS' => '6.98', + 'ExtUtils::MM_Darwin' => '6.98', + 'ExtUtils::MM_MacOS' => '6.98', + 'ExtUtils::MM_NW5' => '6.98', + 'ExtUtils::MM_OS2' => '6.98', + 'ExtUtils::MM_QNX' => '6.98', + 'ExtUtils::MM_UWIN' => '6.98', + 'ExtUtils::MM_Unix' => '6.98', + 'ExtUtils::MM_VMS' => '6.98', + 'ExtUtils::MM_VOS' => '6.98', + 'ExtUtils::MM_Win32' => '6.98', + 'ExtUtils::MM_Win95' => '6.98', + 'ExtUtils::MY' => '6.98', + 'ExtUtils::MakeMaker' => '6.98', + 'ExtUtils::MakeMaker::Config'=> '6.98', + 'ExtUtils::Miniperl' => '1.01', + 'ExtUtils::Mkbootstrap' => '6.98', + 'ExtUtils::Mksymlists' => '6.98', + 'ExtUtils::testlib' => '6.98', + 'Pod::Functions::Functions'=> '1.08', + }, + removed => { + } + }, + 5.021000 => { + delta_from => 5.020000, + changed => { + 'Module::CoreList' => '5.021001', + 'Module::CoreList::TieHashDelta'=> '5.021001', + 'Module::CoreList::Utils'=> '5.021001', + 'feature' => '1.37', + }, + removed => { + 'CGI' => 1, + 'CGI::Apache' => 1, + 'CGI::Carp' => 1, + 'CGI::Cookie' => 1, + 'CGI::Fast' => 1, + 'CGI::Pretty' => 1, + 'CGI::Push' => 1, + 'CGI::Switch' => 1, + 'CGI::Util' => 1, + 'Module::Build' => 1, + 'Module::Build::Base' => 1, + 'Module::Build::Compat' => 1, + 'Module::Build::Config' => 1, + 'Module::Build::ConfigData'=> 1, + 'Module::Build::Cookbook'=> 1, + 'Module::Build::Dumper' => 1, + 'Module::Build::ModuleInfo'=> 1, + 'Module::Build::Notes' => 1, + 'Module::Build::PPMMaker'=> 1, + 'Module::Build::Platform::Default'=> 1, + 'Module::Build::Platform::MacOS'=> 1, + 'Module::Build::Platform::Unix'=> 1, + 'Module::Build::Platform::VMS'=> 1, + 'Module::Build::Platform::VOS'=> 1, + 'Module::Build::Platform::Windows'=> 1, + 'Module::Build::Platform::aix'=> 1, + 'Module::Build::Platform::cygwin'=> 1, + 'Module::Build::Platform::darwin'=> 1, + 'Module::Build::Platform::os2'=> 1, + 'Module::Build::PodParser'=> 1, + 'Module::Build::Version'=> 1, + 'Module::Build::YAML' => 1, + 'Package::Constants' => 1, + 'inc::latest' => 1, + } + }, + 5.021001 => { + delta_from => 5.021000, + changed => { + 'App::Prove' => '3.32', + 'App::Prove::State' => '3.32', + 'App::Prove::State::Result'=> '3.32', + 'App::Prove::State::Result::Test'=> '3.32', + 'Archive::Tar' => '2.00', + 'Archive::Tar::Constant'=> '2.00', + 'Archive::Tar::File' => '2.00', + 'B' => '1.49', + 'B::Deparse' => '1.27', + 'Benchmark' => '1.19', + 'CPAN::Meta' => '2.141520', + 'CPAN::Meta::Converter' => '2.141520', + 'CPAN::Meta::Feature' => '2.141520', + 'CPAN::Meta::History' => '2.141520', + 'CPAN::Meta::Prereqs' => '2.141520', + 'CPAN::Meta::Spec' => '2.141520', + 'CPAN::Meta::Validator' => '2.141520', + 'Carp' => '1.34', + 'Carp::Heavy' => '1.34', + 'Config' => '5.021001', + 'Cwd' => '3.48', + 'Data::Dumper' => '2.152', + 'Devel::PPPort' => '3.24', + 'Devel::Peek' => '1.17', + 'Digest::SHA' => '5.92', + 'DynaLoader' => '1.26', + 'Encode' => '2.62', + 'Errno' => '1.20_04', + 'Exporter' => '5.71', + 'Exporter::Heavy' => '5.71', + 'ExtUtils::Install' => '1.68', + 'ExtUtils::Miniperl' => '1.02', + 'ExtUtils::ParseXS' => '3.25', + 'ExtUtils::ParseXS::Constants'=> '3.25', + 'ExtUtils::ParseXS::CountLines'=> '3.25', + 'ExtUtils::ParseXS::Eval'=> '3.25', + 'ExtUtils::ParseXS::Utilities'=> '3.25', + 'ExtUtils::Typemaps' => '3.25', + 'ExtUtils::Typemaps::Cmd'=> '3.25', + 'ExtUtils::Typemaps::InputMap'=> '3.25', + 'ExtUtils::Typemaps::OutputMap'=> '3.25', + 'ExtUtils::Typemaps::Type'=> '3.25', + 'Fatal' => '2.25', + 'File::Spec' => '3.48', + 'File::Spec::Cygwin' => '3.48', + 'File::Spec::Epoc' => '3.48', + 'File::Spec::Functions' => '3.48', + 'File::Spec::Mac' => '3.48', + 'File::Spec::OS2' => '3.48', + 'File::Spec::Unix' => '3.48', + 'File::Spec::VMS' => '3.48', + 'File::Spec::Win32' => '3.48', + 'Hash::Util' => '0.17', + 'IO' => '1.32', + 'List::Util' => '1.39', + 'List::Util::XS' => '1.39', + 'Locale::Codes' => '3.31', + 'Locale::Codes::Constants'=> '3.31', + 'Locale::Codes::Country'=> '3.31', + 'Locale::Codes::Country_Codes'=> '3.31', + 'Locale::Codes::Country_Retired'=> '3.31', + 'Locale::Codes::Currency'=> '3.31', + 'Locale::Codes::Currency_Codes'=> '3.31', + 'Locale::Codes::Currency_Retired'=> '3.31', + 'Locale::Codes::LangExt'=> '3.31', + 'Locale::Codes::LangExt_Codes'=> '3.31', + 'Locale::Codes::LangExt_Retired'=> '3.31', + 'Locale::Codes::LangFam'=> '3.31', + 'Locale::Codes::LangFam_Codes'=> '3.31', + 'Locale::Codes::LangFam_Retired'=> '3.31', + 'Locale::Codes::LangVar'=> '3.31', + 'Locale::Codes::LangVar_Codes'=> '3.31', + 'Locale::Codes::LangVar_Retired'=> '3.31', + 'Locale::Codes::Language'=> '3.31', + 'Locale::Codes::Language_Codes'=> '3.31', + 'Locale::Codes::Language_Retired'=> '3.31', + 'Locale::Codes::Script' => '3.31', + 'Locale::Codes::Script_Codes'=> '3.31', + 'Locale::Codes::Script_Retired'=> '3.31', + 'Locale::Country' => '3.31', + 'Locale::Currency' => '3.31', + 'Locale::Language' => '3.31', + 'Locale::Script' => '3.31', + 'Math::BigFloat' => '1.9994', + 'Math::BigInt' => '1.9995', + 'Math::BigInt::Calc' => '1.9994', + 'Math::BigInt::CalcEmu' => '1.9994', + 'Math::BigRat' => '0.2608', + 'Module::CoreList' => '5.021001_01', + 'Module::CoreList::TieHashDelta'=> '5.021001_01', + 'Module::CoreList::Utils'=> '5.021001_01', + 'Module::Metadata' => '1.000024', + 'NDBM_File' => '1.13', + 'Net::Config' => '1.14', + 'Net::SMTP' => '2.34', + 'Net::Time' => '2.11', + 'OS2::Process' => '1.10', + 'POSIX' => '1.40', + 'PerlIO::encoding' => '0.19', + 'PerlIO::mmap' => '0.013', + 'PerlIO::scalar' => '0.19', + 'PerlIO::via' => '0.15', + 'Pod::Html' => '1.22', + 'Scalar::Util' => '1.39', + 'SelfLoader' => '1.22', + 'Socket' => '2.014', + 'Storable' => '2.51', + 'TAP::Base' => '3.32', + 'TAP::Formatter::Base' => '3.32', + 'TAP::Formatter::Color' => '3.32', + 'TAP::Formatter::Console'=> '3.32', + 'TAP::Formatter::Console::ParallelSession'=> '3.32', + 'TAP::Formatter::Console::Session'=> '3.32', + 'TAP::Formatter::File' => '3.32', + 'TAP::Formatter::File::Session'=> '3.32', + 'TAP::Formatter::Session'=> '3.32', + 'TAP::Harness' => '3.32', + 'TAP::Harness::Env' => '3.32', + 'TAP::Object' => '3.32', + 'TAP::Parser' => '3.32', + 'TAP::Parser::Aggregator'=> '3.32', + 'TAP::Parser::Grammar' => '3.32', + 'TAP::Parser::Iterator' => '3.32', + 'TAP::Parser::Iterator::Array'=> '3.32', + 'TAP::Parser::Iterator::Process'=> '3.32', + 'TAP::Parser::Iterator::Stream'=> '3.32', + 'TAP::Parser::IteratorFactory'=> '3.32', + 'TAP::Parser::Multiplexer'=> '3.32', + 'TAP::Parser::Result' => '3.32', + 'TAP::Parser::Result::Bailout'=> '3.32', + 'TAP::Parser::Result::Comment'=> '3.32', + 'TAP::Parser::Result::Plan'=> '3.32', + 'TAP::Parser::Result::Pragma'=> '3.32', + 'TAP::Parser::Result::Test'=> '3.32', + 'TAP::Parser::Result::Unknown'=> '3.32', + 'TAP::Parser::Result::Version'=> '3.32', + 'TAP::Parser::Result::YAML'=> '3.32', + 'TAP::Parser::ResultFactory'=> '3.32', + 'TAP::Parser::Scheduler'=> '3.32', + 'TAP::Parser::Scheduler::Job'=> '3.32', + 'TAP::Parser::Scheduler::Spinner'=> '3.32', + 'TAP::Parser::Source' => '3.32', + 'TAP::Parser::SourceHandler'=> '3.32', + 'TAP::Parser::SourceHandler::Executable'=> '3.32', + 'TAP::Parser::SourceHandler::File'=> '3.32', + 'TAP::Parser::SourceHandler::Handle'=> '3.32', + 'TAP::Parser::SourceHandler::Perl'=> '3.32', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.32', + 'TAP::Parser::YAMLish::Reader'=> '3.32', + 'TAP::Parser::YAMLish::Writer'=> '3.32', + 'Term::ANSIColor' => '4.03', + 'Test::Builder' => '1.001003', + 'Test::Builder::Module' => '1.001003', + 'Test::Builder::Tester' => '1.23_003', + 'Test::Harness' => '3.32', + 'Test::More' => '1.001003', + 'Test::Simple' => '1.001003', + 'Tie::File' => '1.01', + 'Unicode' => '7.0.0', + 'Unicode::Collate' => '1.07', + 'Unicode::Normalize' => '1.18', + 'Unicode::UCD' => '0.58', + 'XS::APItest' => '0.61', + '_charnames' => '1.41', + 'autodie' => '2.25', + 'autodie::Scope::Guard' => '2.25', + 'autodie::Scope::GuardStack'=> '2.25', + 'autodie::ScopeUtil' => '2.25', + 'autodie::exception' => '2.25', + 'autodie::exception::system'=> '2.25', + 'autodie::hints' => '2.25', + 'autodie::skip' => '2.25', + 'charnames' => '1.41', + 'locale' => '1.04', + 'threads' => '1.94', + 'utf8' => '1.14', + 'warnings' => '1.24', + }, + removed => { + } + }, + 5.021002 => { + delta_from => 5.021001, + changed => { + 'B' => '1.50', + 'Config' => '5.021002', + 'Cwd' => '3.49', + 'Devel::Peek' => '1.18', + 'ExtUtils::Manifest' => '1.64', + 'File::Copy' => '2.30', + 'File::Spec' => '3.49', + 'File::Spec::Cygwin' => '3.49', + 'File::Spec::Epoc' => '3.49', + 'File::Spec::Functions' => '3.49', + 'File::Spec::Mac' => '3.49', + 'File::Spec::OS2' => '3.49', + 'File::Spec::Unix' => '3.49', + 'File::Spec::VMS' => '3.49', + 'File::Spec::Win32' => '3.49', + 'Filter::Simple' => '0.92', + 'Hash::Util' => '0.18', + 'IO' => '1.33', + 'IO::Socket::IP' => '0.31', + 'IPC::Open3' => '1.17', + 'Math::BigFloat' => '1.9996', + 'Math::BigInt' => '1.9996', + 'Math::BigInt::Calc' => '1.9996', + 'Math::BigInt::CalcEmu' => '1.9996', + 'Module::CoreList' => '5.021002', + 'Module::CoreList::TieHashDelta'=> '5.021002', + 'Module::CoreList::Utils'=> '5.021002', + 'POSIX' => '1.41', + 'Pod::Usage' => '1.64', + 'XS::APItest' => '0.62', + 'arybase' => '0.08', + 'experimental' => '0.008', + 'threads' => '1.95', + 'warnings' => '1.26', + }, + removed => { + } + }, + 5.021003 => { + delta_from => 5.021002, + changed => { + 'B::Debug' => '1.21', + 'CPAN::Meta' => '2.142060', + 'CPAN::Meta::Converter' => '2.142060', + 'CPAN::Meta::Feature' => '2.142060', + 'CPAN::Meta::History' => '2.142060', + 'CPAN::Meta::Merge' => '2.142060', + 'CPAN::Meta::Prereqs' => '2.142060', + 'CPAN::Meta::Requirements'=> '2.126', + 'CPAN::Meta::Spec' => '2.142060', + 'CPAN::Meta::Validator' => '2.142060', + 'Config' => '5.021003', + 'Config::Perl::V' => '0.22', + 'ExtUtils::CBuilder' => '0.280217', + 'ExtUtils::CBuilder::Base'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280217', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280217', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280217', + 'ExtUtils::CBuilder::Platform::android'=> '0.280217', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280217', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280217', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280217', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280217', + 'ExtUtils::Manifest' => '1.65', + 'HTTP::Tiny' => '0.047', + 'IPC::Open3' => '1.18', + 'Module::CoreList' => '5.021003', + 'Module::CoreList::TieHashDelta'=> '5.021003', + 'Module::CoreList::Utils'=> '5.021003', + 'Opcode' => '1.28', + 'POSIX' => '1.42', + 'Safe' => '2.38', + 'Socket' => '2.015', + 'Sys::Hostname' => '1.19', + 'UNIVERSAL' => '1.12', + 'XS::APItest' => '0.63', + 'perlfaq' => '5.0150045', + }, + removed => { + } + }, + 5.020001 => { + delta_from => 5.020000, + changed => { + 'Config' => '5.020001', + 'Config::Perl::V' => '0.22', + 'Cwd' => '3.48', + 'Exporter' => '5.71', + 'Exporter::Heavy' => '5.71', + 'ExtUtils::CBuilder' => '0.280217', + 'ExtUtils::CBuilder::Base'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280217', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280217', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280217', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280217', + 'ExtUtils::CBuilder::Platform::android'=> '0.280217', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280217', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280217', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280217', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280217', + 'File::Copy' => '2.30', + 'File::Spec' => '3.48', + 'File::Spec::Cygwin' => '3.48', + 'File::Spec::Epoc' => '3.48', + 'File::Spec::Functions' => '3.48', + 'File::Spec::Mac' => '3.48', + 'File::Spec::OS2' => '3.48', + 'File::Spec::Unix' => '3.48', + 'File::Spec::VMS' => '3.48', + 'File::Spec::Win32' => '3.48', + 'Module::CoreList' => '5.020001', + 'Module::CoreList::TieHashDelta'=> '5.020001', + 'Module::CoreList::Utils'=> '5.020001', + 'PerlIO::via' => '0.15', + 'Unicode::UCD' => '0.58', + 'XS::APItest' => '0.60_01', + 'utf8' => '1.13_01', + 'version' => '0.9909', + 'version::regex' => '0.9909', + 'version::vpp' => '0.9909', + }, + removed => { + } + }, + 5.021004 => { + delta_from => 5.021003, + changed => { + 'App::Prove' => '3.33', + 'App::Prove::State' => '3.33', + 'App::Prove::State::Result'=> '3.33', + 'App::Prove::State::Result::Test'=> '3.33', + 'Archive::Tar' => '2.02', + 'Archive::Tar::Constant'=> '2.02', + 'Archive::Tar::File' => '2.02', + 'Attribute::Handlers' => '0.97', + 'B' => '1.51', + 'B::Concise' => '0.993', + 'B::Deparse' => '1.28', + 'B::Op_private' => '5.021004', + 'CPAN::Meta::Requirements'=> '2.128', + 'Config' => '5.021004', + 'Cwd' => '3.50', + 'Data::Dumper' => '2.154', + 'ExtUtils::CBuilder' => '0.280219', + 'ExtUtils::CBuilder::Base'=> '0.280219', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280219', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280219', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280219', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280219', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280219', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280219', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280219', + 'ExtUtils::CBuilder::Platform::android'=> '0.280219', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280219', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280219', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280219', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280219', + 'ExtUtils::Install' => '2.04', + 'ExtUtils::Installed' => '2.04', + 'ExtUtils::Liblist::Kid'=> '6.98_01', + 'ExtUtils::Manifest' => '1.68', + 'ExtUtils::Packlist' => '2.04', + 'File::Find' => '1.28', + 'File::Spec' => '3.50', + 'File::Spec::Cygwin' => '3.50', + 'File::Spec::Epoc' => '3.50', + 'File::Spec::Functions' => '3.50', + 'File::Spec::Mac' => '3.50', + 'File::Spec::OS2' => '3.50', + 'File::Spec::Unix' => '3.50', + 'File::Spec::VMS' => '3.50', + 'File::Spec::Win32' => '3.50', + 'Getopt::Std' => '1.11', + 'HTTP::Tiny' => '0.049', + 'IO' => '1.34', + 'IO::Socket::IP' => '0.32', + 'List::Util' => '1.41', + 'List::Util::XS' => '1.41', + 'Locale::Codes' => '3.32', + 'Locale::Codes::Constants'=> '3.32', + 'Locale::Codes::Country'=> '3.32', + 'Locale::Codes::Country_Codes'=> '3.32', + 'Locale::Codes::Country_Retired'=> '3.32', + 'Locale::Codes::Currency'=> '3.32', + 'Locale::Codes::Currency_Codes'=> '3.32', + 'Locale::Codes::Currency_Retired'=> '3.32', + 'Locale::Codes::LangExt'=> '3.32', + 'Locale::Codes::LangExt_Codes'=> '3.32', + 'Locale::Codes::LangExt_Retired'=> '3.32', + 'Locale::Codes::LangFam'=> '3.32', + 'Locale::Codes::LangFam_Codes'=> '3.32', + 'Locale::Codes::LangFam_Retired'=> '3.32', + 'Locale::Codes::LangVar'=> '3.32', + 'Locale::Codes::LangVar_Codes'=> '3.32', + 'Locale::Codes::LangVar_Retired'=> '3.32', + 'Locale::Codes::Language'=> '3.32', + 'Locale::Codes::Language_Codes'=> '3.32', + 'Locale::Codes::Language_Retired'=> '3.32', + 'Locale::Codes::Script' => '3.32', + 'Locale::Codes::Script_Codes'=> '3.32', + 'Locale::Codes::Script_Retired'=> '3.32', + 'Locale::Country' => '3.32', + 'Locale::Currency' => '3.32', + 'Locale::Language' => '3.32', + 'Locale::Script' => '3.32', + 'Math::BigFloat' => '1.9997', + 'Math::BigInt' => '1.9997', + 'Math::BigInt::Calc' => '1.9997', + 'Math::BigInt::CalcEmu' => '1.9997', + 'Module::CoreList' => '5.20140920', + 'Module::CoreList::TieHashDelta'=> '5.20140920', + 'Module::CoreList::Utils'=> '5.20140920', + 'POSIX' => '1.43', + 'Pod::Perldoc' => '3.24', + 'Pod::Perldoc::BaseTo' => '3.24', + 'Pod::Perldoc::GetOptsOO'=> '3.24', + 'Pod::Perldoc::ToANSI' => '3.24', + 'Pod::Perldoc::ToChecker'=> '3.24', + 'Pod::Perldoc::ToMan' => '3.24', + 'Pod::Perldoc::ToNroff' => '3.24', + 'Pod::Perldoc::ToPod' => '3.24', + 'Pod::Perldoc::ToRtf' => '3.24', + 'Pod::Perldoc::ToTerm' => '3.24', + 'Pod::Perldoc::ToText' => '3.24', + 'Pod::Perldoc::ToTk' => '3.24', + 'Pod::Perldoc::ToXml' => '3.24', + 'Scalar::Util' => '1.41', + 'Sub::Util' => '1.41', + 'TAP::Base' => '3.33', + 'TAP::Formatter::Base' => '3.33', + 'TAP::Formatter::Color' => '3.33', + 'TAP::Formatter::Console'=> '3.33', + 'TAP::Formatter::Console::ParallelSession'=> '3.33', + 'TAP::Formatter::Console::Session'=> '3.33', + 'TAP::Formatter::File' => '3.33', + 'TAP::Formatter::File::Session'=> '3.33', + 'TAP::Formatter::Session'=> '3.33', + 'TAP::Harness' => '3.33', + 'TAP::Harness::Env' => '3.33', + 'TAP::Object' => '3.33', + 'TAP::Parser' => '3.33', + 'TAP::Parser::Aggregator'=> '3.33', + 'TAP::Parser::Grammar' => '3.33', + 'TAP::Parser::Iterator' => '3.33', + 'TAP::Parser::Iterator::Array'=> '3.33', + 'TAP::Parser::Iterator::Process'=> '3.33', + 'TAP::Parser::Iterator::Stream'=> '3.33', + 'TAP::Parser::IteratorFactory'=> '3.33', + 'TAP::Parser::Multiplexer'=> '3.33', + 'TAP::Parser::Result' => '3.33', + 'TAP::Parser::Result::Bailout'=> '3.33', + 'TAP::Parser::Result::Comment'=> '3.33', + 'TAP::Parser::Result::Plan'=> '3.33', + 'TAP::Parser::Result::Pragma'=> '3.33', + 'TAP::Parser::Result::Test'=> '3.33', + 'TAP::Parser::Result::Unknown'=> '3.33', + 'TAP::Parser::Result::Version'=> '3.33', + 'TAP::Parser::Result::YAML'=> '3.33', + 'TAP::Parser::ResultFactory'=> '3.33', + 'TAP::Parser::Scheduler'=> '3.33', + 'TAP::Parser::Scheduler::Job'=> '3.33', + 'TAP::Parser::Scheduler::Spinner'=> '3.33', + 'TAP::Parser::Source' => '3.33', + 'TAP::Parser::SourceHandler'=> '3.33', + 'TAP::Parser::SourceHandler::Executable'=> '3.33', + 'TAP::Parser::SourceHandler::File'=> '3.33', + 'TAP::Parser::SourceHandler::Handle'=> '3.33', + 'TAP::Parser::SourceHandler::Perl'=> '3.33', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.33', + 'TAP::Parser::YAMLish::Reader'=> '3.33', + 'TAP::Parser::YAMLish::Writer'=> '3.33', + 'Term::ReadLine' => '1.15', + 'Test::Builder' => '1.001006', + 'Test::Builder::Module' => '1.001006', + 'Test::Builder::Tester' => '1.24', + 'Test::Builder::Tester::Color'=> '1.24', + 'Test::Harness' => '3.33', + 'Test::More' => '1.001006', + 'Test::Simple' => '1.001006', + 'Time::Piece' => '1.29', + 'Time::Seconds' => '1.29', + 'XS::APItest' => '0.64', + '_charnames' => '1.42', + 'attributes' => '0.23', + 'bigint' => '0.37', + 'bignum' => '0.38', + 'bigrat' => '0.37', + 'constant' => '1.32', + 'experimental' => '0.010', + 'overload' => '1.23', + 'threads' => '1.96', + 'version' => '0.9909', + 'version::regex' => '0.9909', + 'version::vpp' => '0.9909', + }, + removed => { + } + }, + 5.021005 => { + delta_from => 5.021004, + changed => { + 'B' => '1.52', + 'B::Concise' => '0.994', + 'B::Debug' => '1.22', + 'B::Deparse' => '1.29', + 'B::Op_private' => '5.021005', + 'CPAN::Meta' => '2.142690', + 'CPAN::Meta::Converter' => '2.142690', + 'CPAN::Meta::Feature' => '2.142690', + 'CPAN::Meta::History' => '2.142690', + 'CPAN::Meta::Merge' => '2.142690', + 'CPAN::Meta::Prereqs' => '2.142690', + 'CPAN::Meta::Spec' => '2.142690', + 'CPAN::Meta::Validator' => '2.142690', + 'Compress::Raw::Bzip2' => '2.066', + 'Compress::Raw::Zlib' => '2.066', + 'Compress::Zlib' => '2.066', + 'Config' => '5.021005', + 'Cwd' => '3.51', + 'DynaLoader' => '1.27', + 'Errno' => '1.21', + 'ExtUtils::CBuilder' => '0.280220', + 'ExtUtils::CBuilder::Base'=> '0.280220', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280220', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280220', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280220', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280220', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280220', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280220', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280220', + 'ExtUtils::CBuilder::Platform::android'=> '0.280220', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280220', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280220', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280220', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280220', + 'ExtUtils::Miniperl' => '1.03', + 'Fcntl' => '1.13', + 'File::Find' => '1.29', + 'File::Spec' => '3.51', + 'File::Spec::Cygwin' => '3.51', + 'File::Spec::Epoc' => '3.51', + 'File::Spec::Functions' => '3.51', + 'File::Spec::Mac' => '3.51', + 'File::Spec::OS2' => '3.51', + 'File::Spec::Unix' => '3.51', + 'File::Spec::VMS' => '3.51', + 'File::Spec::Win32' => '3.51', + 'HTTP::Tiny' => '0.050', + 'IO::Compress::Adapter::Bzip2'=> '2.066', + 'IO::Compress::Adapter::Deflate'=> '2.066', + 'IO::Compress::Adapter::Identity'=> '2.066', + 'IO::Compress::Base' => '2.066', + 'IO::Compress::Base::Common'=> '2.066', + 'IO::Compress::Bzip2' => '2.066', + 'IO::Compress::Deflate' => '2.066', + 'IO::Compress::Gzip' => '2.066', + 'IO::Compress::Gzip::Constants'=> '2.066', + 'IO::Compress::RawDeflate'=> '2.066', + 'IO::Compress::Zip' => '2.066', + 'IO::Compress::Zip::Constants'=> '2.066', + 'IO::Compress::Zlib::Constants'=> '2.066', + 'IO::Compress::Zlib::Extra'=> '2.066', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.066', + 'IO::Uncompress::Adapter::Identity'=> '2.066', + 'IO::Uncompress::Adapter::Inflate'=> '2.066', + 'IO::Uncompress::AnyInflate'=> '2.066', + 'IO::Uncompress::AnyUncompress'=> '2.066', + 'IO::Uncompress::Base' => '2.066', + 'IO::Uncompress::Bunzip2'=> '2.066', + 'IO::Uncompress::Gunzip'=> '2.066', + 'IO::Uncompress::Inflate'=> '2.066', + 'IO::Uncompress::RawInflate'=> '2.066', + 'IO::Uncompress::Unzip' => '2.066', + 'JSON::PP' => '2.27300', + 'Module::CoreList' => '5.20141020', + 'Module::CoreList::TieHashDelta'=> '5.20141020', + 'Module::CoreList::Utils'=> '5.20141020', + 'Net::Cmd' => '3.02', + 'Net::Config' => '3.02', + 'Net::Domain' => '3.02', + 'Net::FTP' => '3.02', + 'Net::FTP::A' => '3.02', + 'Net::FTP::E' => '3.02', + 'Net::FTP::I' => '3.02', + 'Net::FTP::L' => '3.02', + 'Net::FTP::dataconn' => '3.02', + 'Net::NNTP' => '3.02', + 'Net::Netrc' => '3.02', + 'Net::POP3' => '3.02', + 'Net::SMTP' => '3.02', + 'Net::Time' => '3.02', + 'Opcode' => '1.29', + 'POSIX' => '1.45', + 'Socket' => '2.016', + 'Test::Builder' => '1.001008', + 'Test::Builder::Module' => '1.001008', + 'Test::More' => '1.001008', + 'Test::Simple' => '1.001008', + 'XS::APItest' => '0.65', + 'XSLoader' => '0.18', + 'attributes' => '0.24', + 'experimental' => '0.012', + 'feature' => '1.38', + 'perlfaq' => '5.0150046', + 're' => '0.27', + 'threads::shared' => '1.47', + 'warnings' => '1.28', + 'warnings::register' => '1.04', + }, + removed => { + } + }, + 5.021006 => { + delta_from => 5.021005, + changed => { + 'App::Prove' => '3.34', + 'App::Prove::State' => '3.34', + 'App::Prove::State::Result'=> '3.34', + 'App::Prove::State::Result::Test'=> '3.34', + 'B' => '1.53', + 'B::Concise' => '0.995', + 'B::Deparse' => '1.30', + 'B::Op_private' => '5.021006', + 'CPAN::Meta' => '2.143240', + 'CPAN::Meta::Converter' => '2.143240', + 'CPAN::Meta::Feature' => '2.143240', + 'CPAN::Meta::History' => '2.143240', + 'CPAN::Meta::Merge' => '2.143240', + 'CPAN::Meta::Prereqs' => '2.143240', + 'CPAN::Meta::Requirements'=> '2.130', + 'CPAN::Meta::Spec' => '2.143240', + 'CPAN::Meta::Validator' => '2.143240', + 'Config' => '5.021006', + 'Devel::Peek' => '1.19', + 'Digest::SHA' => '5.93', + 'DynaLoader' => '1.28', + 'Encode' => '2.64', + 'Exporter' => '5.72', + 'Exporter::Heavy' => '5.72', + 'ExtUtils::Command::MM' => '7.02', + 'ExtUtils::Liblist' => '7.02', + 'ExtUtils::Liblist::Kid'=> '7.02', + 'ExtUtils::MM' => '7.02', + 'ExtUtils::MM_AIX' => '7.02', + 'ExtUtils::MM_Any' => '7.02', + 'ExtUtils::MM_BeOS' => '7.02', + 'ExtUtils::MM_Cygwin' => '7.02', + 'ExtUtils::MM_DOS' => '7.02', + 'ExtUtils::MM_Darwin' => '7.02', + 'ExtUtils::MM_MacOS' => '7.02', + 'ExtUtils::MM_NW5' => '7.02', + 'ExtUtils::MM_OS2' => '7.02', + 'ExtUtils::MM_QNX' => '7.02', + 'ExtUtils::MM_UWIN' => '7.02', + 'ExtUtils::MM_Unix' => '7.02', + 'ExtUtils::MM_VMS' => '7.02', + 'ExtUtils::MM_VOS' => '7.02', + 'ExtUtils::MM_Win32' => '7.02', + 'ExtUtils::MM_Win95' => '7.02', + 'ExtUtils::MY' => '7.02', + 'ExtUtils::MakeMaker' => '7.02', + 'ExtUtils::MakeMaker::Config'=> '7.02', + 'ExtUtils::MakeMaker::Locale'=> '7.02', + 'ExtUtils::MakeMaker::version'=> '7.02', + 'ExtUtils::MakeMaker::version::regex'=> '7.02', + 'ExtUtils::MakeMaker::version::vpp'=> '7.02', + 'ExtUtils::Manifest' => '1.69', + 'ExtUtils::Mkbootstrap' => '7.02', + 'ExtUtils::Mksymlists' => '7.02', + 'ExtUtils::ParseXS' => '3.26', + 'ExtUtils::ParseXS::Constants'=> '3.26', + 'ExtUtils::ParseXS::CountLines'=> '3.26', + 'ExtUtils::ParseXS::Eval'=> '3.26', + 'ExtUtils::ParseXS::Utilities'=> '3.26', + 'ExtUtils::testlib' => '7.02', + 'File::Spec::VMS' => '3.52', + 'HTTP::Tiny' => '0.051', + 'I18N::Langinfo' => '0.12', + 'IO::Socket' => '1.38', + 'Module::CoreList' => '5.20141120', + 'Module::CoreList::TieHashDelta'=> '5.20141120', + 'Module::CoreList::Utils'=> '5.20141120', + 'POSIX' => '1.46', + 'PerlIO::encoding' => '0.20', + 'PerlIO::scalar' => '0.20', + 'TAP::Base' => '3.34', + 'TAP::Formatter::Base' => '3.34', + 'TAP::Formatter::Color' => '3.34', + 'TAP::Formatter::Console'=> '3.34', + 'TAP::Formatter::Console::ParallelSession'=> '3.34', + 'TAP::Formatter::Console::Session'=> '3.34', + 'TAP::Formatter::File' => '3.34', + 'TAP::Formatter::File::Session'=> '3.34', + 'TAP::Formatter::Session'=> '3.34', + 'TAP::Harness' => '3.34', + 'TAP::Harness::Env' => '3.34', + 'TAP::Object' => '3.34', + 'TAP::Parser' => '3.34', + 'TAP::Parser::Aggregator'=> '3.34', + 'TAP::Parser::Grammar' => '3.34', + 'TAP::Parser::Iterator' => '3.34', + 'TAP::Parser::Iterator::Array'=> '3.34', + 'TAP::Parser::Iterator::Process'=> '3.34', + 'TAP::Parser::Iterator::Stream'=> '3.34', + 'TAP::Parser::IteratorFactory'=> '3.34', + 'TAP::Parser::Multiplexer'=> '3.34', + 'TAP::Parser::Result' => '3.34', + 'TAP::Parser::Result::Bailout'=> '3.34', + 'TAP::Parser::Result::Comment'=> '3.34', + 'TAP::Parser::Result::Plan'=> '3.34', + 'TAP::Parser::Result::Pragma'=> '3.34', + 'TAP::Parser::Result::Test'=> '3.34', + 'TAP::Parser::Result::Unknown'=> '3.34', + 'TAP::Parser::Result::Version'=> '3.34', + 'TAP::Parser::Result::YAML'=> '3.34', + 'TAP::Parser::ResultFactory'=> '3.34', + 'TAP::Parser::Scheduler'=> '3.34', + 'TAP::Parser::Scheduler::Job'=> '3.34', + 'TAP::Parser::Scheduler::Spinner'=> '3.34', + 'TAP::Parser::Source' => '3.34', + 'TAP::Parser::SourceHandler'=> '3.34', + 'TAP::Parser::SourceHandler::Executable'=> '3.34', + 'TAP::Parser::SourceHandler::File'=> '3.34', + 'TAP::Parser::SourceHandler::Handle'=> '3.34', + 'TAP::Parser::SourceHandler::Perl'=> '3.34', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.34', + 'TAP::Parser::YAMLish::Reader'=> '3.34', + 'TAP::Parser::YAMLish::Writer'=> '3.34', + 'Test::Builder' => '1.301001_075', + 'Test::Builder::Module' => '1.301001_075', + 'Test::Builder::Tester' => '1.301001_075', + 'Test::Builder::Tester::Color'=> '1.301001_075', + 'Test::Harness' => '3.34', + 'Test::More' => '1.301001_075', + 'Test::More::DeepCheck' => undef, + 'Test::More::DeepCheck::Strict'=> undef, + 'Test::More::DeepCheck::Tolerant'=> undef, + 'Test::More::Tools' => undef, + 'Test::MostlyLike' => undef, + 'Test::Simple' => '1.301001_075', + 'Test::Stream' => '1.301001_075', + 'Test::Stream::ArrayBase'=> undef, + 'Test::Stream::ArrayBase::Meta'=> undef, + 'Test::Stream::Carp' => undef, + 'Test::Stream::Context' => undef, + 'Test::Stream::Event' => undef, + 'Test::Stream::Event::Bail'=> undef, + 'Test::Stream::Event::Child'=> undef, + 'Test::Stream::Event::Diag'=> undef, + 'Test::Stream::Event::Finish'=> undef, + 'Test::Stream::Event::Note'=> undef, + 'Test::Stream::Event::Ok'=> undef, + 'Test::Stream::Event::Plan'=> undef, + 'Test::Stream::Event::Subtest'=> undef, + 'Test::Stream::ExitMagic'=> undef, + 'Test::Stream::ExitMagic::Context'=> undef, + 'Test::Stream::Exporter'=> undef, + 'Test::Stream::Exporter::Meta'=> undef, + 'Test::Stream::IOSets' => undef, + 'Test::Stream::Meta' => undef, + 'Test::Stream::PackageUtil'=> undef, + 'Test::Stream::Tester' => undef, + 'Test::Stream::Tester::Checks'=> undef, + 'Test::Stream::Tester::Checks::Event'=> undef, + 'Test::Stream::Tester::Events'=> undef, + 'Test::Stream::Tester::Events::Event'=> undef, + 'Test::Stream::Tester::Grab'=> undef, + 'Test::Stream::Threads' => undef, + 'Test::Stream::Toolset' => undef, + 'Test::Stream::Util' => undef, + 'Test::Tester' => '1.301001_075', + 'Test::Tester::Capture' => undef, + 'Test::use::ok' => '1.301001_075', + 'Unicode::UCD' => '0.59', + 'XS::APItest' => '0.68', + 'XSLoader' => '0.19', + 'experimental' => '0.013', + 'locale' => '1.05', + 'ok' => '1.301001_075', + 'overload' => '1.24', + 're' => '0.28', + 'warnings' => '1.29', + }, + removed => { + } + }, + 5.021007 => { + delta_from => 5.021006, + changed => { + 'Archive::Tar' => '2.04', + 'Archive::Tar::Constant'=> '2.04', + 'Archive::Tar::File' => '2.04', + 'B' => '1.54', + 'B::Concise' => '0.996', + 'B::Deparse' => '1.31', + 'B::Op_private' => '5.021007', + 'B::Showlex' => '1.05', + 'Compress::Raw::Bzip2' => '2.067', + 'Compress::Raw::Zlib' => '2.067', + 'Compress::Zlib' => '2.067', + 'Config' => '5.021007', + 'Cwd' => '3.54', + 'DB_File' => '1.834', + 'Data::Dumper' => '2.155', + 'Devel::PPPort' => '3.25', + 'Devel::Peek' => '1.20', + 'DynaLoader' => '1.29', + 'Encode' => '2.67', + 'Errno' => '1.22', + 'ExtUtils::CBuilder' => '0.280221', + 'ExtUtils::CBuilder::Base'=> '0.280221', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280221', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280221', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280221', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280221', + 'ExtUtils::CBuilder::Platform::android'=> '0.280221', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280221', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280221', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280221', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280221', + 'ExtUtils::Command::MM' => '7.04', + 'ExtUtils::Liblist' => '7.04', + 'ExtUtils::Liblist::Kid'=> '7.04', + 'ExtUtils::MM' => '7.04', + 'ExtUtils::MM_AIX' => '7.04', + 'ExtUtils::MM_Any' => '7.04', + 'ExtUtils::MM_BeOS' => '7.04', + 'ExtUtils::MM_Cygwin' => '7.04', + 'ExtUtils::MM_DOS' => '7.04', + 'ExtUtils::MM_Darwin' => '7.04', + 'ExtUtils::MM_MacOS' => '7.04', + 'ExtUtils::MM_NW5' => '7.04', + 'ExtUtils::MM_OS2' => '7.04', + 'ExtUtils::MM_QNX' => '7.04', + 'ExtUtils::MM_UWIN' => '7.04', + 'ExtUtils::MM_Unix' => '7.04', + 'ExtUtils::MM_VMS' => '7.04', + 'ExtUtils::MM_VOS' => '7.04', + 'ExtUtils::MM_Win32' => '7.04', + 'ExtUtils::MM_Win95' => '7.04', + 'ExtUtils::MY' => '7.04', + 'ExtUtils::MakeMaker' => '7.04', + 'ExtUtils::MakeMaker::Config'=> '7.04', + 'ExtUtils::MakeMaker::Locale'=> '7.04', + 'ExtUtils::MakeMaker::version'=> '7.04', + 'ExtUtils::MakeMaker::version::regex'=> '7.04', + 'ExtUtils::MakeMaker::version::vpp'=> '7.04', + 'ExtUtils::Mkbootstrap' => '7.04', + 'ExtUtils::Mksymlists' => '7.04', + 'ExtUtils::ParseXS' => '3.27', + 'ExtUtils::ParseXS::Constants'=> '3.27', + 'ExtUtils::ParseXS::CountLines'=> '3.27', + 'ExtUtils::ParseXS::Eval'=> '3.27', + 'ExtUtils::ParseXS::Utilities'=> '3.27', + 'ExtUtils::testlib' => '7.04', + 'File::Spec' => '3.53', + 'File::Spec::Cygwin' => '3.54', + 'File::Spec::Epoc' => '3.54', + 'File::Spec::Functions' => '3.54', + 'File::Spec::Mac' => '3.54', + 'File::Spec::OS2' => '3.54', + 'File::Spec::Unix' => '3.54', + 'File::Spec::VMS' => '3.54', + 'File::Spec::Win32' => '3.54', + 'Filter::Util::Call' => '1.51', + 'HTTP::Tiny' => '0.053', + 'IO' => '1.35', + 'IO::Compress::Adapter::Bzip2'=> '2.067', + 'IO::Compress::Adapter::Deflate'=> '2.067', + 'IO::Compress::Adapter::Identity'=> '2.067', + 'IO::Compress::Base' => '2.067', + 'IO::Compress::Base::Common'=> '2.067', + 'IO::Compress::Bzip2' => '2.067', + 'IO::Compress::Deflate' => '2.067', + 'IO::Compress::Gzip' => '2.067', + 'IO::Compress::Gzip::Constants'=> '2.067', + 'IO::Compress::RawDeflate'=> '2.067', + 'IO::Compress::Zip' => '2.067', + 'IO::Compress::Zip::Constants'=> '2.067', + 'IO::Compress::Zlib::Constants'=> '2.067', + 'IO::Compress::Zlib::Extra'=> '2.067', + 'IO::Socket::IP' => '0.34', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.067', + 'IO::Uncompress::Adapter::Identity'=> '2.067', + 'IO::Uncompress::Adapter::Inflate'=> '2.067', + 'IO::Uncompress::AnyInflate'=> '2.067', + 'IO::Uncompress::AnyUncompress'=> '2.067', + 'IO::Uncompress::Base' => '2.067', + 'IO::Uncompress::Bunzip2'=> '2.067', + 'IO::Uncompress::Gunzip'=> '2.067', + 'IO::Uncompress::Inflate'=> '2.067', + 'IO::Uncompress::RawInflate'=> '2.067', + 'IO::Uncompress::Unzip' => '2.067', + 'Locale::Codes' => '3.33', + 'Locale::Codes::Constants'=> '3.33', + 'Locale::Codes::Country'=> '3.33', + 'Locale::Codes::Country_Codes'=> '3.33', + 'Locale::Codes::Country_Retired'=> '3.33', + 'Locale::Codes::Currency'=> '3.33', + 'Locale::Codes::Currency_Codes'=> '3.33', + 'Locale::Codes::Currency_Retired'=> '3.33', + 'Locale::Codes::LangExt'=> '3.33', + 'Locale::Codes::LangExt_Codes'=> '3.33', + 'Locale::Codes::LangExt_Retired'=> '3.33', + 'Locale::Codes::LangFam'=> '3.33', + 'Locale::Codes::LangFam_Codes'=> '3.33', + 'Locale::Codes::LangFam_Retired'=> '3.33', + 'Locale::Codes::LangVar'=> '3.33', + 'Locale::Codes::LangVar_Codes'=> '3.33', + 'Locale::Codes::LangVar_Retired'=> '3.33', + 'Locale::Codes::Language'=> '3.33', + 'Locale::Codes::Language_Codes'=> '3.33', + 'Locale::Codes::Language_Retired'=> '3.33', + 'Locale::Codes::Script' => '3.33', + 'Locale::Codes::Script_Codes'=> '3.33', + 'Locale::Codes::Script_Retired'=> '3.33', + 'Locale::Country' => '3.33', + 'Locale::Currency' => '3.33', + 'Locale::Language' => '3.33', + 'Locale::Maketext' => '1.26', + 'Locale::Script' => '3.33', + 'Module::CoreList' => '5.20141220', + 'Module::CoreList::TieHashDelta'=> '5.20141220', + 'Module::CoreList::Utils'=> '5.20141220', + 'NDBM_File' => '1.14', + 'Net::Cmd' => '3.04', + 'Net::Config' => '3.04', + 'Net::Domain' => '3.04', + 'Net::FTP' => '3.04', + 'Net::FTP::A' => '3.04', + 'Net::FTP::E' => '3.04', + 'Net::FTP::I' => '3.04', + 'Net::FTP::L' => '3.04', + 'Net::FTP::dataconn' => '3.04', + 'Net::NNTP' => '3.04', + 'Net::Netrc' => '3.04', + 'Net::POP3' => '3.04', + 'Net::SMTP' => '3.04', + 'Net::Time' => '3.04', + 'Opcode' => '1.30', + 'POSIX' => '1.48', + 'PerlIO::scalar' => '0.21', + 'Pod::Escapes' => '1.07', + 'SDBM_File' => '1.12', + 'Storable' => '2.52', + 'Sys::Hostname' => '1.20', + 'Test::Builder' => '1.301001_090', + 'Test::Builder::Module' => '1.301001_090', + 'Test::Builder::Tester' => '1.301001_090', + 'Test::Builder::Tester::Color'=> '1.301001_090', + 'Test::CanFork' => undef, + 'Test::CanThread' => undef, + 'Test::More' => '1.301001_090', + 'Test::Simple' => '1.301001_090', + 'Test::Stream' => '1.301001_090', + 'Test::Stream::API' => undef, + 'Test::Stream::ForceExit'=> undef, + 'Test::Stream::Subtest' => undef, + 'Test::Tester' => '1.301001_090', + 'Test::use::ok' => '1.301001_090', + 'Unicode::Collate' => '1.09', + 'Unicode::Collate::CJK::Big5'=> '1.09', + 'Unicode::Collate::CJK::GB2312'=> '1.09', + 'Unicode::Collate::CJK::JISX0208'=> '1.09', + 'Unicode::Collate::CJK::Korean'=> '1.09', + 'Unicode::Collate::CJK::Pinyin'=> '1.09', + 'Unicode::Collate::CJK::Stroke'=> '1.09', + 'Unicode::Collate::CJK::Zhuyin'=> '1.09', + 'Unicode::Collate::Locale'=> '1.09', + 'XS::APItest' => '0.69', + 'XSLoader' => '0.20', + '_charnames' => '1.43', + 'arybase' => '0.09', + 'charnames' => '1.43', + 'feature' => '1.39', + 'mro' => '1.17', + 'ok' => '1.301001_090', + 'strict' => '1.09', + 'threads' => '1.96_001', + }, + removed => { + } + }, + 5.021008 => { + delta_from => 5.021007, + changed => { + 'App::Prove' => '3.35', + 'App::Prove::State' => '3.35', + 'App::Prove::State::Result'=> '3.35', + 'App::Prove::State::Result::Test'=> '3.35', + 'B' => '1.55', + 'B::Deparse' => '1.32', + 'B::Op_private' => '5.021008', + 'CPAN::Meta::Requirements'=> '2.131', + 'Compress::Raw::Bzip2' => '2.068', + 'Compress::Raw::Zlib' => '2.068', + 'Compress::Zlib' => '2.068', + 'Config' => '5.021008', + 'DB_File' => '1.835', + 'Data::Dumper' => '2.156', + 'Devel::PPPort' => '3.28', + 'Devel::Peek' => '1.21', + 'Digest::MD5' => '2.54', + 'Digest::SHA' => '5.95', + 'DynaLoader' => '1.30', + 'ExtUtils::Command' => '1.20', + 'ExtUtils::Manifest' => '1.70', + 'Fatal' => '2.26', + 'File::Glob' => '1.24', + 'Filter::Util::Call' => '1.54', + 'Getopt::Long' => '2.43', + 'IO::Compress::Adapter::Bzip2'=> '2.068', + 'IO::Compress::Adapter::Deflate'=> '2.068', + 'IO::Compress::Adapter::Identity'=> '2.068', + 'IO::Compress::Base' => '2.068', + 'IO::Compress::Base::Common'=> '2.068', + 'IO::Compress::Bzip2' => '2.068', + 'IO::Compress::Deflate' => '2.068', + 'IO::Compress::Gzip' => '2.068', + 'IO::Compress::Gzip::Constants'=> '2.068', + 'IO::Compress::RawDeflate'=> '2.068', + 'IO::Compress::Zip' => '2.068', + 'IO::Compress::Zip::Constants'=> '2.068', + 'IO::Compress::Zlib::Constants'=> '2.068', + 'IO::Compress::Zlib::Extra'=> '2.068', + 'IO::Socket::IP' => '0.36', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.068', + 'IO::Uncompress::Adapter::Identity'=> '2.068', + 'IO::Uncompress::Adapter::Inflate'=> '2.068', + 'IO::Uncompress::AnyInflate'=> '2.068', + 'IO::Uncompress::AnyUncompress'=> '2.068', + 'IO::Uncompress::Base' => '2.068', + 'IO::Uncompress::Bunzip2'=> '2.068', + 'IO::Uncompress::Gunzip'=> '2.068', + 'IO::Uncompress::Inflate'=> '2.068', + 'IO::Uncompress::RawInflate'=> '2.068', + 'IO::Uncompress::Unzip' => '2.068', + 'MIME::Base64' => '3.15', + 'Module::CoreList' => '5.20150220', + 'Module::CoreList::TieHashDelta'=> '5.20150220', + 'Module::CoreList::Utils'=> '5.20150220', + 'Module::Load::Conditional'=> '0.64', + 'Module::Metadata' => '1.000026', + 'Net::Cmd' => '3.05', + 'Net::Config' => '3.05', + 'Net::Domain' => '3.05', + 'Net::FTP' => '3.05', + 'Net::FTP::A' => '3.05', + 'Net::FTP::E' => '3.05', + 'Net::FTP::I' => '3.05', + 'Net::FTP::L' => '3.05', + 'Net::FTP::dataconn' => '3.05', + 'Net::NNTP' => '3.05', + 'Net::Netrc' => '3.05', + 'Net::POP3' => '3.05', + 'Net::SMTP' => '3.05', + 'Net::Time' => '3.05', + 'Opcode' => '1.31', + 'POSIX' => '1.49', + 'PerlIO::encoding' => '0.21', + 'Pod::Simple' => '3.29', + 'Pod::Simple::BlackBox' => '3.29', + 'Pod::Simple::Checker' => '3.29', + 'Pod::Simple::Debug' => '3.29', + 'Pod::Simple::DumpAsText'=> '3.29', + 'Pod::Simple::DumpAsXML'=> '3.29', + 'Pod::Simple::HTML' => '3.29', + 'Pod::Simple::HTMLBatch'=> '3.29', + 'Pod::Simple::LinkSection'=> '3.29', + 'Pod::Simple::Methody' => '3.29', + 'Pod::Simple::Progress' => '3.29', + 'Pod::Simple::PullParser'=> '3.29', + 'Pod::Simple::PullParserEndToken'=> '3.29', + 'Pod::Simple::PullParserStartToken'=> '3.29', + 'Pod::Simple::PullParserTextToken'=> '3.29', + 'Pod::Simple::PullParserToken'=> '3.29', + 'Pod::Simple::RTF' => '3.29', + 'Pod::Simple::Search' => '3.29', + 'Pod::Simple::SimpleTree'=> '3.29', + 'Pod::Simple::Text' => '3.29', + 'Pod::Simple::TextContent'=> '3.29', + 'Pod::Simple::TiedOutFH'=> '3.29', + 'Pod::Simple::Transcode'=> '3.29', + 'Pod::Simple::TranscodeDumb'=> '3.29', + 'Pod::Simple::TranscodeSmart'=> '3.29', + 'Pod::Simple::XHTML' => '3.29', + 'Pod::Simple::XMLOutStream'=> '3.29', + 'SDBM_File' => '1.13', + 'Safe' => '2.39', + 'TAP::Base' => '3.35', + 'TAP::Formatter::Base' => '3.35', + 'TAP::Formatter::Color' => '3.35', + 'TAP::Formatter::Console'=> '3.35', + 'TAP::Formatter::Console::ParallelSession'=> '3.35', + 'TAP::Formatter::Console::Session'=> '3.35', + 'TAP::Formatter::File' => '3.35', + 'TAP::Formatter::File::Session'=> '3.35', + 'TAP::Formatter::Session'=> '3.35', + 'TAP::Harness' => '3.35', + 'TAP::Harness::Env' => '3.35', + 'TAP::Object' => '3.35', + 'TAP::Parser' => '3.35', + 'TAP::Parser::Aggregator'=> '3.35', + 'TAP::Parser::Grammar' => '3.35', + 'TAP::Parser::Iterator' => '3.35', + 'TAP::Parser::Iterator::Array'=> '3.35', + 'TAP::Parser::Iterator::Process'=> '3.35', + 'TAP::Parser::Iterator::Stream'=> '3.35', + 'TAP::Parser::IteratorFactory'=> '3.35', + 'TAP::Parser::Multiplexer'=> '3.35', + 'TAP::Parser::Result' => '3.35', + 'TAP::Parser::Result::Bailout'=> '3.35', + 'TAP::Parser::Result::Comment'=> '3.35', + 'TAP::Parser::Result::Plan'=> '3.35', + 'TAP::Parser::Result::Pragma'=> '3.35', + 'TAP::Parser::Result::Test'=> '3.35', + 'TAP::Parser::Result::Unknown'=> '3.35', + 'TAP::Parser::Result::Version'=> '3.35', + 'TAP::Parser::Result::YAML'=> '3.35', + 'TAP::Parser::ResultFactory'=> '3.35', + 'TAP::Parser::Scheduler'=> '3.35', + 'TAP::Parser::Scheduler::Job'=> '3.35', + 'TAP::Parser::Scheduler::Spinner'=> '3.35', + 'TAP::Parser::Source' => '3.35', + 'TAP::Parser::SourceHandler'=> '3.35', + 'TAP::Parser::SourceHandler::Executable'=> '3.35', + 'TAP::Parser::SourceHandler::File'=> '3.35', + 'TAP::Parser::SourceHandler::Handle'=> '3.35', + 'TAP::Parser::SourceHandler::Perl'=> '3.35', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.35', + 'TAP::Parser::YAMLish::Reader'=> '3.35', + 'TAP::Parser::YAMLish::Writer'=> '3.35', + 'Test::Builder' => '1.301001_097', + 'Test::Builder::Module' => '1.301001_097', + 'Test::Builder::Tester' => '1.301001_097', + 'Test::Builder::Tester::Color'=> '1.301001_097', + 'Test::Harness' => '3.35', + 'Test::More' => '1.301001_097', + 'Test::Simple' => '1.301001_097', + 'Test::Stream' => '1.301001_097', + 'Test::Stream::Block' => undef, + 'Test::Tester' => '1.301001_097', + 'Test::Tester::CaptureRunner'=> undef, + 'Test::Tester::Delegate'=> undef, + 'Test::use::ok' => '1.301001_097', + 'Unicode::Collate' => '1.10', + 'Unicode::Collate::CJK::Big5'=> '1.10', + 'Unicode::Collate::CJK::GB2312'=> '1.10', + 'Unicode::Collate::CJK::JISX0208'=> '1.10', + 'Unicode::Collate::CJK::Korean'=> '1.10', + 'Unicode::Collate::CJK::Pinyin'=> '1.10', + 'Unicode::Collate::CJK::Stroke'=> '1.10', + 'Unicode::Collate::CJK::Zhuyin'=> '1.10', + 'Unicode::Collate::Locale'=> '1.10', + 'VMS::DCLsym' => '1.06', + 'XS::APItest' => '0.70', + 'arybase' => '0.10', + 'attributes' => '0.25', + 'autodie' => '2.26', + 'autodie::Scope::Guard' => '2.26', + 'autodie::Scope::GuardStack'=> '2.26', + 'autodie::ScopeUtil' => '2.26', + 'autodie::exception' => '2.26', + 'autodie::exception::system'=> '2.26', + 'autodie::hints' => '2.26', + 'autodie::skip' => '2.26', + 'ok' => '1.301001_097', + 're' => '0.30', + 'warnings' => '1.30', + }, + removed => { + } + }, + 5.020002 => { + delta_from => 5.020001, + changed => { + 'CPAN::Author' => '5.5002', + 'CPAN::CacheMgr' => '5.5002', + 'CPAN::FTP' => '5.5006', + 'CPAN::HTTP::Client' => '1.9601', + 'CPAN::HandleConfig' => '5.5005', + 'CPAN::Index' => '1.9601', + 'CPAN::LWP::UserAgent' => '1.9601', + 'CPAN::Mirrors' => '1.9601', + 'Config' => '5.020002', + 'Cwd' => '3.48_01', + 'Data::Dumper' => '2.151_01', + 'Errno' => '1.20_05', + 'File::Spec' => '3.48_01', + 'File::Spec::Cygwin' => '3.48_01', + 'File::Spec::Epoc' => '3.48_01', + 'File::Spec::Functions' => '3.48_01', + 'File::Spec::Mac' => '3.48_01', + 'File::Spec::OS2' => '3.48_01', + 'File::Spec::Unix' => '3.48_01', + 'File::Spec::VMS' => '3.48_01', + 'File::Spec::Win32' => '3.48_01', + 'IO::Socket' => '1.38', + 'Module::CoreList' => '5.20150214', + 'Module::CoreList::TieHashDelta'=> '5.20150214', + 'Module::CoreList::Utils'=> '5.20150214', + 'PerlIO::scalar' => '0.18_01', + 'Pod::PlainText' => '2.07', + 'Storable' => '2.49_01', + 'VMS::DCLsym' => '1.05_01', + 'VMS::Stdio' => '2.41', + 'attributes' => '0.23', + 'feature' => '1.36_01', + }, + removed => { + } + }, + 5.021009 => { + delta_from => 5.021008, + changed => { + 'B' => '1.56', + 'B::Debug' => '1.23', + 'B::Deparse' => '1.33', + 'B::Op_private' => '5.021009', + 'Benchmark' => '1.20', + 'CPAN::Author' => '5.5002', + 'CPAN::CacheMgr' => '5.5002', + 'CPAN::FTP' => '5.5006', + 'CPAN::HTTP::Client' => '1.9601', + 'CPAN::HandleConfig' => '5.5005', + 'CPAN::Index' => '1.9601', + 'CPAN::LWP::UserAgent' => '1.9601', + 'CPAN::Meta::Requirements'=> '2.132', + 'CPAN::Mirrors' => '1.9601', + 'Carp' => '1.35', + 'Carp::Heavy' => '1.35', + 'Config' => '5.021009', + 'Config::Perl::V' => '0.23', + 'Data::Dumper' => '2.157', + 'Devel::Peek' => '1.22', + 'DynaLoader' => '1.31', + 'Encode' => '2.70', + 'Encode::MIME::Header' => '2.16', + 'Errno' => '1.23', + 'ExtUtils::Miniperl' => '1.04', + 'HTTP::Tiny' => '0.054', + 'Module::CoreList' => '5.20150220', + 'Module::CoreList::TieHashDelta'=> '5.20150220', + 'Module::CoreList::Utils'=> '5.20150220', + 'Opcode' => '1.32', + 'POSIX' => '1.51', + 'Perl::OSType' => '1.008', + 'PerlIO::scalar' => '0.22', + 'Pod::Find' => '1.63', + 'Pod::InputObjects' => '1.63', + 'Pod::ParseUtils' => '1.63', + 'Pod::Parser' => '1.63', + 'Pod::Perldoc' => '3.25', + 'Pod::Perldoc::BaseTo' => '3.25', + 'Pod::Perldoc::GetOptsOO'=> '3.25', + 'Pod::Perldoc::ToANSI' => '3.25', + 'Pod::Perldoc::ToChecker'=> '3.25', + 'Pod::Perldoc::ToMan' => '3.25', + 'Pod::Perldoc::ToNroff' => '3.25', + 'Pod::Perldoc::ToPod' => '3.25', + 'Pod::Perldoc::ToRtf' => '3.25', + 'Pod::Perldoc::ToTerm' => '3.25', + 'Pod::Perldoc::ToText' => '3.25', + 'Pod::Perldoc::ToTk' => '3.25', + 'Pod::Perldoc::ToXml' => '3.25', + 'Pod::PlainText' => '2.07', + 'Pod::Select' => '1.63', + 'Socket' => '2.018', + 'Storable' => '2.53', + 'Test::Builder' => '1.301001_098', + 'Test::Builder::Module' => '1.301001_098', + 'Test::Builder::Tester' => '1.301001_098', + 'Test::Builder::Tester::Color'=> '1.301001_098', + 'Test::More' => '1.301001_098', + 'Test::Simple' => '1.301001_098', + 'Test::Stream' => '1.301001_098', + 'Test::Tester' => '1.301001_098', + 'Test::use::ok' => '1.301001_098', + 'Unicode::Collate' => '1.11', + 'Unicode::Collate::CJK::Big5'=> '1.11', + 'Unicode::Collate::CJK::GB2312'=> '1.11', + 'Unicode::Collate::CJK::JISX0208'=> '1.11', + 'Unicode::Collate::CJK::Korean'=> '1.11', + 'Unicode::Collate::CJK::Pinyin'=> '1.11', + 'Unicode::Collate::CJK::Stroke'=> '1.11', + 'Unicode::Collate::CJK::Zhuyin'=> '1.11', + 'Unicode::Collate::Locale'=> '1.11', + 'Unicode::UCD' => '0.61', + 'VMS::Stdio' => '2.41', + 'Win32' => '0.51', + 'Win32API::File' => '0.1202', + 'attributes' => '0.26', + 'bigint' => '0.39', + 'bignum' => '0.39', + 'bigrat' => '0.39', + 'constant' => '1.33', + 'encoding' => '2.13', + 'feature' => '1.40', + 'ok' => '1.301001_098', + 'overload' => '1.25', + 'perlfaq' => '5.021009', + 're' => '0.31', + 'threads::shared' => '1.48', + 'warnings' => '1.31', + }, + removed => { + } + }, + 5.021010 => { + delta_from => 5.021009, + changed => { + 'App::Cpan' => '1.63', + 'B' => '1.57', + 'B::Deparse' => '1.34', + 'B::Op_private' => '5.021010', + 'Benchmark' => '1.2', + 'CPAN' => '2.10', + 'CPAN::Distribution' => '2.04', + 'CPAN::FirstTime' => '5.5307', + 'CPAN::HTTP::Credentials'=> '1.9601', + 'CPAN::HandleConfig' => '5.5006', + 'CPAN::Meta' => '2.150001', + 'CPAN::Meta::Converter' => '2.150001', + 'CPAN::Meta::Feature' => '2.150001', + 'CPAN::Meta::History' => '2.150001', + 'CPAN::Meta::Merge' => '2.150001', + 'CPAN::Meta::Prereqs' => '2.150001', + 'CPAN::Meta::Spec' => '2.150001', + 'CPAN::Meta::Validator' => '2.150001', + 'CPAN::Module' => '5.5002', + 'CPAN::Plugin' => '0.95', + 'CPAN::Plugin::Specfile'=> '0.01', + 'CPAN::Shell' => '5.5005', + 'Carp' => '1.36', + 'Carp::Heavy' => '1.36', + 'Config' => '5.02101', + 'Cwd' => '3.55', + 'DB' => '1.08', + 'Data::Dumper' => '2.158', + 'Devel::PPPort' => '3.31', + 'DynaLoader' => '1.32', + 'Encode' => '2.72', + 'Encode::Alias' => '2.19', + 'File::Spec' => '3.55', + 'File::Spec::Cygwin' => '3.55', + 'File::Spec::Epoc' => '3.55', + 'File::Spec::Functions' => '3.55', + 'File::Spec::Mac' => '3.55', + 'File::Spec::OS2' => '3.55', + 'File::Spec::Unix' => '3.55', + 'File::Spec::VMS' => '3.55', + 'File::Spec::Win32' => '3.55', + 'Getopt::Long' => '2.45', + 'Locale::Codes' => '3.34', + 'Locale::Codes::Constants'=> '3.34', + 'Locale::Codes::Country'=> '3.34', + 'Locale::Codes::Country_Codes'=> '3.34', + 'Locale::Codes::Country_Retired'=> '3.34', + 'Locale::Codes::Currency'=> '3.34', + 'Locale::Codes::Currency_Codes'=> '3.34', + 'Locale::Codes::Currency_Retired'=> '3.34', + 'Locale::Codes::LangExt'=> '3.34', + 'Locale::Codes::LangExt_Codes'=> '3.34', + 'Locale::Codes::LangExt_Retired'=> '3.34', + 'Locale::Codes::LangFam'=> '3.34', + 'Locale::Codes::LangFam_Codes'=> '3.34', + 'Locale::Codes::LangFam_Retired'=> '3.34', + 'Locale::Codes::LangVar'=> '3.34', + 'Locale::Codes::LangVar_Codes'=> '3.34', + 'Locale::Codes::LangVar_Retired'=> '3.34', + 'Locale::Codes::Language'=> '3.34', + 'Locale::Codes::Language_Codes'=> '3.34', + 'Locale::Codes::Language_Retired'=> '3.34', + 'Locale::Codes::Script' => '3.34', + 'Locale::Codes::Script_Codes'=> '3.34', + 'Locale::Codes::Script_Retired'=> '3.34', + 'Locale::Country' => '3.34', + 'Locale::Currency' => '3.34', + 'Locale::Language' => '3.34', + 'Locale::Script' => '3.34', + 'Module::CoreList' => '5.20150320', + 'Module::CoreList::TieHashDelta'=> '5.20150320', + 'Module::CoreList::Utils'=> '5.20150320', + 'POSIX' => '1.52', + 'Pod::Functions' => '1.09', + 'Pod::Functions::Functions'=> '1.09', + 'Term::Complete' => '1.403', + 'Test::Builder' => '1.001014', + 'Test::Builder::IO::Scalar'=> '2.113', + 'Test::Builder::Module' => '1.001014', + 'Test::Builder::Tester' => '1.28', + 'Test::Builder::Tester::Color'=> '1.290001', + 'Test::More' => '1.001014', + 'Test::Simple' => '1.001014', + 'Test::Tester' => '0.114', + 'Test::use::ok' => '0.16', + 'Text::Balanced' => '2.03', + 'Text::ParseWords' => '3.30', + 'Unicode::Collate' => '1.12', + 'Unicode::Collate::CJK::Big5'=> '1.12', + 'Unicode::Collate::CJK::GB2312'=> '1.12', + 'Unicode::Collate::CJK::JISX0208'=> '1.12', + 'Unicode::Collate::CJK::Korean'=> '1.12', + 'Unicode::Collate::CJK::Pinyin'=> '1.12', + 'Unicode::Collate::CJK::Stroke'=> '1.12', + 'Unicode::Collate::CJK::Zhuyin'=> '1.12', + 'Unicode::Collate::Locale'=> '1.12', + 'XS::APItest' => '0.71', + 'encoding' => '2.14', + 'locale' => '1.06', + 'meta_notation' => undef, + 'ok' => '0.16', + 'parent' => '0.232', + 're' => '0.32', + 'sigtrap' => '1.08', + 'threads' => '2.01', + 'utf8' => '1.15', + }, + removed => { + 'Test::CanFork' => 1, + 'Test::CanThread' => 1, + 'Test::More::DeepCheck' => 1, + 'Test::More::DeepCheck::Strict'=> 1, + 'Test::More::DeepCheck::Tolerant'=> 1, + 'Test::More::Tools' => 1, + 'Test::MostlyLike' => 1, + 'Test::Stream' => 1, + 'Test::Stream::API' => 1, + 'Test::Stream::ArrayBase'=> 1, + 'Test::Stream::ArrayBase::Meta'=> 1, + 'Test::Stream::Block' => 1, + 'Test::Stream::Carp' => 1, + 'Test::Stream::Context' => 1, + 'Test::Stream::Event' => 1, + 'Test::Stream::Event::Bail'=> 1, + 'Test::Stream::Event::Child'=> 1, + 'Test::Stream::Event::Diag'=> 1, + 'Test::Stream::Event::Finish'=> 1, + 'Test::Stream::Event::Note'=> 1, + 'Test::Stream::Event::Ok'=> 1, + 'Test::Stream::Event::Plan'=> 1, + 'Test::Stream::Event::Subtest'=> 1, + 'Test::Stream::ExitMagic'=> 1, + 'Test::Stream::ExitMagic::Context'=> 1, + 'Test::Stream::Exporter'=> 1, + 'Test::Stream::Exporter::Meta'=> 1, + 'Test::Stream::ForceExit'=> 1, + 'Test::Stream::IOSets' => 1, + 'Test::Stream::Meta' => 1, + 'Test::Stream::PackageUtil'=> 1, + 'Test::Stream::Subtest' => 1, + 'Test::Stream::Tester' => 1, + 'Test::Stream::Tester::Checks'=> 1, + 'Test::Stream::Tester::Checks::Event'=> 1, + 'Test::Stream::Tester::Events'=> 1, + 'Test::Stream::Tester::Events::Event'=> 1, + 'Test::Stream::Tester::Grab'=> 1, + 'Test::Stream::Threads' => 1, + 'Test::Stream::Toolset' => 1, + 'Test::Stream::Util' => 1, + } + }, + 5.021011 => { + delta_from => 5.021010, + changed => { + 'B' => '1.58', + 'B::Deparse' => '1.35', + 'B::Op_private' => '5.021011', + 'CPAN' => '2.11', + 'Config' => '5.021011', + 'Config::Perl::V' => '0.24', + 'Cwd' => '3.56', + 'ExtUtils::Miniperl' => '1.05', + 'ExtUtils::ParseXS' => '3.28', + 'ExtUtils::ParseXS::Constants'=> '3.28', + 'ExtUtils::ParseXS::CountLines'=> '3.28', + 'ExtUtils::ParseXS::Eval'=> '3.28', + 'ExtUtils::ParseXS::Utilities'=> '3.28', + 'ExtUtils::Typemaps' => '3.28', + 'ExtUtils::Typemaps::Cmd'=> '3.28', + 'ExtUtils::Typemaps::InputMap'=> '3.28', + 'ExtUtils::Typemaps::OutputMap'=> '3.28', + 'ExtUtils::Typemaps::Type'=> '3.28', + 'File::Spec' => '3.56', + 'File::Spec::Cygwin' => '3.56', + 'File::Spec::Epoc' => '3.56', + 'File::Spec::Functions' => '3.56', + 'File::Spec::Mac' => '3.56', + 'File::Spec::OS2' => '3.56', + 'File::Spec::Unix' => '3.56', + 'File::Spec::VMS' => '3.56', + 'File::Spec::Win32' => '3.56', + 'IO::Socket::IP' => '0.37', + 'Module::CoreList' => '5.20150420', + 'Module::CoreList::TieHashDelta'=> '5.20150420', + 'Module::CoreList::Utils'=> '5.20150420', + 'PerlIO::mmap' => '0.014', + 'XS::APItest' => '0.72', + 'attributes' => '0.27', + 'if' => '0.0604', + 'utf8' => '1.16', + 'warnings' => '1.32', + }, + removed => { + } + }, + 5.022000 => { + delta_from => 5.021011, + changed => { + 'B::Op_private' => '5.022000', + 'Config' => '5.022', + 'ExtUtils::Command::MM' => '7.04_01', + 'ExtUtils::Liblist' => '7.04_01', + 'ExtUtils::Liblist::Kid'=> '7.04_01', + 'ExtUtils::MM' => '7.04_01', + 'ExtUtils::MM_AIX' => '7.04_01', + 'ExtUtils::MM_Any' => '7.04_01', + 'ExtUtils::MM_BeOS' => '7.04_01', + 'ExtUtils::MM_Cygwin' => '7.04_01', + 'ExtUtils::MM_DOS' => '7.04_01', + 'ExtUtils::MM_Darwin' => '7.04_01', + 'ExtUtils::MM_MacOS' => '7.04_01', + 'ExtUtils::MM_NW5' => '7.04_01', + 'ExtUtils::MM_OS2' => '7.04_01', + 'ExtUtils::MM_QNX' => '7.04_01', + 'ExtUtils::MM_UWIN' => '7.04_01', + 'ExtUtils::MM_Unix' => '7.04_01', + 'ExtUtils::MM_VMS' => '7.04_01', + 'ExtUtils::MM_VOS' => '7.04_01', + 'ExtUtils::MM_Win32' => '7.04_01', + 'ExtUtils::MM_Win95' => '7.04_01', + 'ExtUtils::MY' => '7.04_01', + 'ExtUtils::MakeMaker' => '7.04_01', + 'ExtUtils::MakeMaker::Config'=> '7.04_01', + 'ExtUtils::MakeMaker::Locale'=> '7.04_01', + 'ExtUtils::MakeMaker::version'=> '7.04_01', + 'ExtUtils::MakeMaker::version::regex'=> '7.04_01', + 'ExtUtils::MakeMaker::version::vpp'=> '7.04_01', + 'ExtUtils::Mkbootstrap' => '7.04_01', + 'ExtUtils::Mksymlists' => '7.04_01', + 'ExtUtils::testlib' => '7.04_01', + 'Module::CoreList' => '5.20150520', + 'Module::CoreList::TieHashDelta'=> '5.20150520', + 'Module::CoreList::Utils'=> '5.20150520', + 'POSIX' => '1.53', + 'PerlIO::via::QuotedPrint'=> '0.08', + 'overload' => '1.26', + 'utf8' => '1.17', + }, + removed => { + } + }, + 5.023000 => { + delta_from => 5.022000, + changed => { + 'B::Op_private' => '5.023000', + 'CPAN::Meta' => '2.150005', + 'CPAN::Meta::Converter' => '2.150005', + 'CPAN::Meta::Feature' => '2.150005', + 'CPAN::Meta::History' => '2.150005', + 'CPAN::Meta::Merge' => '2.150005', + 'CPAN::Meta::Prereqs' => '2.150005', + 'CPAN::Meta::Requirements'=> '2.133', + 'CPAN::Meta::Spec' => '2.150005', + 'CPAN::Meta::Validator' => '2.150005', + 'CPAN::Meta::YAML' => '0.016', + 'Config' => '5.023', + 'Encode' => '2.73', + 'ExtUtils::CBuilder' => '0.280223', + 'ExtUtils::CBuilder::Base'=> '0.280223', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280223', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280223', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280223', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280223', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280223', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280223', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280223', + 'ExtUtils::CBuilder::Platform::android'=> '0.280223', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280223', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280223', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280223', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280223', + 'Fatal' => '2.27', + 'Getopt::Long' => '2.46', + 'HTTP::Tiny' => '0.056', + 'List::Util' => '1.42_01', + 'List::Util::XS' => '1.42_01', + 'Locale::Codes' => '3.35', + 'Locale::Codes::Constants'=> '3.35', + 'Locale::Codes::Country'=> '3.35', + 'Locale::Codes::Country_Codes'=> '3.35', + 'Locale::Codes::Country_Retired'=> '3.35', + 'Locale::Codes::Currency'=> '3.35', + 'Locale::Codes::Currency_Codes'=> '3.35', + 'Locale::Codes::Currency_Retired'=> '3.35', + 'Locale::Codes::LangExt'=> '3.35', + 'Locale::Codes::LangExt_Codes'=> '3.35', + 'Locale::Codes::LangExt_Retired'=> '3.35', + 'Locale::Codes::LangFam'=> '3.35', + 'Locale::Codes::LangFam_Codes'=> '3.35', + 'Locale::Codes::LangFam_Retired'=> '3.35', + 'Locale::Codes::LangVar'=> '3.35', + 'Locale::Codes::LangVar_Codes'=> '3.35', + 'Locale::Codes::LangVar_Retired'=> '3.35', + 'Locale::Codes::Language'=> '3.35', + 'Locale::Codes::Language_Codes'=> '3.35', + 'Locale::Codes::Language_Retired'=> '3.35', + 'Locale::Codes::Script' => '3.35', + 'Locale::Codes::Script_Codes'=> '3.35', + 'Locale::Codes::Script_Retired'=> '3.35', + 'Locale::Country' => '3.35', + 'Locale::Currency' => '3.35', + 'Locale::Language' => '3.35', + 'Locale::Script' => '3.35', + 'Math::BigFloat' => '1.999701', + 'Math::BigInt' => '1.999701', + 'Math::BigInt::Calc' => '1.999701', + 'Math::BigInt::CalcEmu' => '1.999701', + 'Math::BigRat' => '0.260801', + 'Module::CoreList' => '5.20150620', + 'Module::CoreList::TieHashDelta'=> '5.20150620', + 'Module::CoreList::Utils'=> '5.20150620', + 'Module::Metadata' => '1.000027', + 'Net::Cmd' => '3.06', + 'Net::Config' => '3.06', + 'Net::Domain' => '3.06', + 'Net::FTP' => '3.06', + 'Net::FTP::A' => '3.06', + 'Net::FTP::E' => '3.06', + 'Net::FTP::I' => '3.06', + 'Net::FTP::L' => '3.06', + 'Net::FTP::dataconn' => '3.06', + 'Net::NNTP' => '3.06', + 'Net::Netrc' => '3.06', + 'Net::POP3' => '3.06', + 'Net::SMTP' => '3.06', + 'Net::Time' => '3.06', + 'POSIX' => '1.54', + 'Parse::CPAN::Meta' => '1.4417', + 'Pod::Simple' => '3.30', + 'Pod::Simple::BlackBox' => '3.30', + 'Pod::Simple::Checker' => '3.30', + 'Pod::Simple::Debug' => '3.30', + 'Pod::Simple::DumpAsText'=> '3.30', + 'Pod::Simple::DumpAsXML'=> '3.30', + 'Pod::Simple::HTML' => '3.30', + 'Pod::Simple::HTMLBatch'=> '3.30', + 'Pod::Simple::LinkSection'=> '3.30', + 'Pod::Simple::Methody' => '3.30', + 'Pod::Simple::Progress' => '3.30', + 'Pod::Simple::PullParser'=> '3.30', + 'Pod::Simple::PullParserEndToken'=> '3.30', + 'Pod::Simple::PullParserStartToken'=> '3.30', + 'Pod::Simple::PullParserTextToken'=> '3.30', + 'Pod::Simple::PullParserToken'=> '3.30', + 'Pod::Simple::RTF' => '3.30', + 'Pod::Simple::Search' => '3.30', + 'Pod::Simple::SimpleTree'=> '3.30', + 'Pod::Simple::Text' => '3.30', + 'Pod::Simple::TextContent'=> '3.30', + 'Pod::Simple::TiedOutFH'=> '3.30', + 'Pod::Simple::Transcode'=> '3.30', + 'Pod::Simple::TranscodeDumb'=> '3.30', + 'Pod::Simple::TranscodeSmart'=> '3.30', + 'Pod::Simple::XHTML' => '3.30', + 'Pod::Simple::XMLOutStream'=> '3.30', + 'Pod::Usage' => '1.67', + 'Scalar::Util' => '1.42_01', + 'Socket' => '2.019', + 'Sub::Util' => '1.42_01', + 'Time::Piece' => '1.30', + 'Time::Seconds' => '1.30', + 'UNIVERSAL' => '1.13', + 'Unicode' => '8.0.0', + 'XS::APItest' => '0.73', + 'autodie' => '2.27', + 'autodie::Scope::Guard' => '2.27', + 'autodie::Scope::GuardStack'=> '2.27', + 'autodie::Util' => '2.27', + 'autodie::exception' => '2.27', + 'autodie::exception::system'=> '2.27', + 'autodie::hints' => '2.27', + 'autodie::skip' => '2.27', + 'encoding' => '2.15', + 'feature' => '1.41', + 'parent' => '0.234', + 'threads' => '2.02', + }, + removed => { + } + }, + 5.023001 => { + delta_from => 5.023000, + changed => { + 'B::Op_private' => '5.023001', + 'Config' => '5.023001', + 'DynaLoader' => '1.33', + 'Encode' => '2.75', + 'Encode::MIME::Header' => '2.17', + 'Encode::Unicode' => '2.13', + 'Fatal' => '2.29', + 'File::Path' => '2.11', + 'Getopt::Long' => '2.47', + 'I18N::Langinfo' => '0.13', + 'IPC::Open3' => '1.19', + 'Module::CoreList' => '5.20150720', + 'Module::CoreList::TieHashDelta'=> '5.20150720', + 'Module::CoreList::Utils'=> '5.20150720', + 'Net::Cmd' => '3.07', + 'Net::Config' => '3.07', + 'Net::Domain' => '3.07', + 'Net::FTP' => '3.07', + 'Net::FTP::A' => '3.07', + 'Net::FTP::E' => '3.07', + 'Net::FTP::I' => '3.07', + 'Net::FTP::L' => '3.07', + 'Net::FTP::dataconn' => '3.07', + 'Net::NNTP' => '3.07', + 'Net::Netrc' => '3.07', + 'Net::POP3' => '3.07', + 'Net::SMTP' => '3.07', + 'Net::Time' => '3.07', + 'Opcode' => '1.33', + 'POSIX' => '1.55', + 'PerlIO::scalar' => '0.23', + 'Socket' => '2.020', + 'Storable' => '2.54', + 'Unicode::Collate' => '1.14', + 'Unicode::Collate::CJK::Big5'=> '1.14', + 'Unicode::Collate::CJK::GB2312'=> '1.14', + 'Unicode::Collate::CJK::JISX0208'=> '1.14', + 'Unicode::Collate::CJK::Korean'=> '1.14', + 'Unicode::Collate::CJK::Pinyin'=> '1.14', + 'Unicode::Collate::CJK::Stroke'=> '1.14', + 'Unicode::Collate::CJK::Zhuyin'=> '1.14', + 'Unicode::Collate::Locale'=> '1.14', + 'Unicode::Normalize' => '1.19', + 'XS::APItest' => '0.74', + 'XS::Typemap' => '0.14', + 'autodie' => '2.29', + 'autodie::Scope::Guard' => '2.29', + 'autodie::Scope::GuardStack'=> '2.29', + 'autodie::Util' => '2.29', + 'autodie::exception' => '2.29', + 'autodie::exception::system'=> '2.29', + 'autodie::hints' => '2.29', + 'autodie::skip' => '2.29', + 'encoding' => '2.16', + 'feature' => '1.42', + 'warnings' => '1.33', + }, + removed => { + 'autodie::ScopeUtil' => 1, + } + }, + 5.023002 => { + delta_from => 5.023001, + changed => { + 'Attribute::Handlers' => '0.99', + 'B::Op_private' => '5.023002', + 'CPAN::Meta::YAML' => '0.017', + 'Config' => '5.023002', + 'Cwd' => '3.57', + 'Encode' => '2.76', + 'ExtUtils::ParseXS' => '3.29', + 'ExtUtils::ParseXS::Constants'=> '3.29', + 'ExtUtils::ParseXS::CountLines'=> '3.29', + 'ExtUtils::ParseXS::Eval'=> '3.29', + 'ExtUtils::ParseXS::Utilities'=> '3.29', + 'ExtUtils::Typemaps' => '3.29', + 'File::Find' => '1.30', + 'File::Spec' => '3.57', + 'File::Spec::Cygwin' => '3.57', + 'File::Spec::Epoc' => '3.57', + 'File::Spec::Functions' => '3.57', + 'File::Spec::Mac' => '3.57', + 'File::Spec::OS2' => '3.57', + 'File::Spec::Unix' => '3.57', + 'File::Spec::VMS' => '3.57', + 'File::Spec::Win32' => '3.57', + 'Filter::Util::Call' => '1.55', + 'Hash::Util' => '0.19', + 'Module::CoreList' => '5.20150820', + 'Module::CoreList::TieHashDelta'=> '5.20150820', + 'Module::CoreList::Utils'=> '5.20150820', + 'POSIX' => '1.56', + 'Term::Cap' => '1.17', + 'Unicode::UCD' => '0.62', + 'perlfaq' => '5.021010', + }, + removed => { + } + }, + 5.020003 => { + delta_from => 5.020002, + changed => { + 'Config' => '5.020003', + 'Errno' => '1.20_06', + 'Module::CoreList' => '5.20150912', + 'Module::CoreList::TieHashDelta'=> '5.20150912', + 'Module::CoreList::Utils'=> '5.20150912', + }, + removed => { + } + }, + 5.023003 => { + delta_from => 5.023002, + changed => { + 'Amiga::ARexx' => '0.02', + 'Amiga::Exec' => '0.01', + 'B' => '1.59', + 'B::Op_private' => '5.023003', + 'Carp' => '1.37', + 'Carp::Heavy' => '1.37', + 'Compress::Raw::Zlib' => '2.068_01', + 'Config' => '5.023003', + 'Cwd' => '3.58', + 'DynaLoader' => '1.34', + 'Encode' => '2.77', + 'Encode::Unicode' => '2.14', + 'English' => '1.10', + 'Errno' => '1.24', + 'ExtUtils::Command' => '7.10', + 'ExtUtils::Command::MM' => '7.10', + 'ExtUtils::Liblist' => '7.10', + 'ExtUtils::Liblist::Kid'=> '7.10', + 'ExtUtils::MM' => '7.10', + 'ExtUtils::MM_AIX' => '7.10', + 'ExtUtils::MM_Any' => '7.10', + 'ExtUtils::MM_BeOS' => '7.10', + 'ExtUtils::MM_Cygwin' => '7.10', + 'ExtUtils::MM_DOS' => '7.10', + 'ExtUtils::MM_Darwin' => '7.10', + 'ExtUtils::MM_MacOS' => '7.10', + 'ExtUtils::MM_NW5' => '7.10', + 'ExtUtils::MM_OS2' => '7.10', + 'ExtUtils::MM_QNX' => '7.10', + 'ExtUtils::MM_UWIN' => '7.10', + 'ExtUtils::MM_Unix' => '7.10', + 'ExtUtils::MM_VMS' => '7.10', + 'ExtUtils::MM_VOS' => '7.10', + 'ExtUtils::MM_Win32' => '7.10', + 'ExtUtils::MM_Win95' => '7.10', + 'ExtUtils::MY' => '7.10', + 'ExtUtils::MakeMaker' => '7.10', + 'ExtUtils::MakeMaker::Config'=> '7.10', + 'ExtUtils::MakeMaker::Locale'=> '7.10', + 'ExtUtils::MakeMaker::version'=> '7.10', + 'ExtUtils::MakeMaker::version::regex'=> '7.10', + 'ExtUtils::MakeMaker::version::vpp'=> '7.10', + 'ExtUtils::Mkbootstrap' => '7.10', + 'ExtUtils::Mksymlists' => '7.10', + 'ExtUtils::ParseXS' => '3.30', + 'ExtUtils::ParseXS::Constants'=> '3.30', + 'ExtUtils::ParseXS::CountLines'=> '3.30', + 'ExtUtils::ParseXS::Eval'=> '3.30', + 'ExtUtils::ParseXS::Utilities'=> '3.30', + 'ExtUtils::Typemaps' => '3.30', + 'ExtUtils::Typemaps::Cmd'=> '3.30', + 'ExtUtils::Typemaps::InputMap'=> '3.30', + 'ExtUtils::Typemaps::OutputMap'=> '3.30', + 'ExtUtils::Typemaps::Type'=> '3.30', + 'ExtUtils::testlib' => '7.10', + 'File::Find' => '1.31', + 'File::Glob' => '1.25', + 'File::Spec' => '3.58', + 'File::Spec::AmigaOS' => '3.58', + 'File::Spec::Cygwin' => '3.58', + 'File::Spec::Epoc' => '3.58', + 'File::Spec::Functions' => '3.58', + 'File::Spec::Mac' => '3.58', + 'File::Spec::OS2' => '3.58', + 'File::Spec::Unix' => '3.58', + 'File::Spec::VMS' => '3.58', + 'File::Spec::Win32' => '3.58', + 'Hash::Util::FieldHash' => '1.17', + 'Locale::Codes' => '3.36', + 'Locale::Codes::Constants'=> '3.36', + 'Locale::Codes::Country'=> '3.36', + 'Locale::Codes::Country_Codes'=> '3.36', + 'Locale::Codes::Country_Retired'=> '3.36', + 'Locale::Codes::Currency'=> '3.36', + 'Locale::Codes::Currency_Codes'=> '3.36', + 'Locale::Codes::Currency_Retired'=> '3.36', + 'Locale::Codes::LangExt'=> '3.36', + 'Locale::Codes::LangExt_Codes'=> '3.36', + 'Locale::Codes::LangExt_Retired'=> '3.36', + 'Locale::Codes::LangFam'=> '3.36', + 'Locale::Codes::LangFam_Codes'=> '3.36', + 'Locale::Codes::LangFam_Retired'=> '3.36', + 'Locale::Codes::LangVar'=> '3.36', + 'Locale::Codes::LangVar_Codes'=> '3.36', + 'Locale::Codes::LangVar_Retired'=> '3.36', + 'Locale::Codes::Language'=> '3.36', + 'Locale::Codes::Language_Codes'=> '3.36', + 'Locale::Codes::Language_Retired'=> '3.36', + 'Locale::Codes::Script' => '3.36', + 'Locale::Codes::Script_Codes'=> '3.36', + 'Locale::Codes::Script_Retired'=> '3.36', + 'Locale::Country' => '3.36', + 'Locale::Currency' => '3.36', + 'Locale::Language' => '3.36', + 'Locale::Script' => '3.36', + 'Math::BigFloat::Trace' => '0.40', + 'Math::BigInt::Trace' => '0.40', + 'Module::CoreList' => '5.20150920', + 'Module::CoreList::TieHashDelta'=> '5.20150920', + 'Module::CoreList::Utils'=> '5.20150920', + 'OS2::DLL' => '1.06', + 'OS2::ExtAttr' => '0.04', + 'OS2::Process' => '1.11', + 'OS2::REXX' => '1.05', + 'POSIX' => '1.57', + 'Pod::Perldoc' => '3.25_01', + 'Socket' => '2.020_01', + 'Test' => '1.27', + 'Thread::Queue' => '3.06', + 'Time::HiRes' => '1.9727_02', + 'Unicode::UCD' => '0.63', + 'Win32' => '0.52', + 'XS::APItest' => '0.75', + 'bigint' => '0.40', + 'bignum' => '0.40', + 'bigrat' => '0.40', + 'encoding' => '2.17', + 'experimental' => '0.014', + 'if' => '0.0605', + 'locale' => '1.07', + 'mro' => '1.18', + 'threads' => '2.03', + }, + removed => { + } + }, + 5.023004 => { + delta_from => 5.023003, + changed => { + 'B' => '1.60', + 'B::Op_private' => '5.023004', + 'Compress::Raw::Bzip2' => '2.069', + 'Compress::Raw::Zlib' => '2.069', + 'Compress::Zlib' => '2.069', + 'Config' => '5.023004', + 'Devel::PPPort' => '3.32', + 'DynaLoader' => '1.35', + 'Encode' => '2.78', + 'ExtUtils::CBuilder' => '0.280224', + 'ExtUtils::CBuilder::Base'=> '0.280224', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280224', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280224', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280224', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280224', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280224', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280224', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280224', + 'ExtUtils::CBuilder::Platform::android'=> '0.280224', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280224', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280224', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280224', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280224', + 'File::Path' => '2.12', + 'IO' => '1.36', + 'IO::Compress::Adapter::Bzip2'=> '2.069', + 'IO::Compress::Adapter::Deflate'=> '2.069', + 'IO::Compress::Adapter::Identity'=> '2.069', + 'IO::Compress::Base' => '2.069', + 'IO::Compress::Base::Common'=> '2.069', + 'IO::Compress::Bzip2' => '2.069', + 'IO::Compress::Deflate' => '2.069', + 'IO::Compress::Gzip' => '2.069', + 'IO::Compress::Gzip::Constants'=> '2.069', + 'IO::Compress::RawDeflate'=> '2.069', + 'IO::Compress::Zip' => '2.069', + 'IO::Compress::Zip::Constants'=> '2.069', + 'IO::Compress::Zlib::Constants'=> '2.069', + 'IO::Compress::Zlib::Extra'=> '2.069', + 'IO::Poll' => '0.10', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.069', + 'IO::Uncompress::Adapter::Identity'=> '2.069', + 'IO::Uncompress::Adapter::Inflate'=> '2.069', + 'IO::Uncompress::AnyInflate'=> '2.069', + 'IO::Uncompress::AnyUncompress'=> '2.069', + 'IO::Uncompress::Base' => '2.069', + 'IO::Uncompress::Bunzip2'=> '2.069', + 'IO::Uncompress::Gunzip'=> '2.069', + 'IO::Uncompress::Inflate'=> '2.069', + 'IO::Uncompress::RawInflate'=> '2.069', + 'IO::Uncompress::Unzip' => '2.069', + 'Math::BigFloat' => '1.999704', + 'Math::BigFloat::Trace' => '0.41', + 'Math::BigInt' => '1.999704', + 'Math::BigInt::Calc' => '1.999704', + 'Math::BigInt::CalcEmu' => '1.999704', + 'Math::BigInt::FastCalc'=> '0.34', + 'Math::BigInt::Trace' => '0.41', + 'Module::CoreList' => '5.20151020', + 'Module::CoreList::TieHashDelta'=> '5.20151020', + 'Module::CoreList::Utils'=> '5.20151020', + 'Module::Metadata' => '1.000029', + 'POSIX' => '1.58', + 'Perl::OSType' => '1.009', + 'PerlIO::encoding' => '0.22', + 'Socket' => '2.020_02', + 'Unicode::Normalize' => '1.21', + 'XS::APItest' => '0.76', + 'bigint' => '0.41', + 'bignum' => '0.41', + 'bigrat' => '0.41', + 'experimental' => '0.016', + 'if' => '0.0606', + 'warnings' => '1.35', + }, + removed => { + } + }, + 5.023005 => { + delta_from => 5.023004, + changed => { + 'B' => '1.61', + 'B::Op_private' => '5.023005', + 'Carp' => '1.38', + 'Carp::Heavy' => '1.38', + 'Config' => '5.023005', + 'Config::Perl::V' => '0.25', + 'Cwd' => '3.59', + 'Devel::Peek' => '1.23', + 'Dumpvalue' => '1.18', + 'DynaLoader' => '1.36', + 'File::Find' => '1.32', + 'File::Spec' => '3.59', + 'File::Spec::AmigaOS' => '3.59', + 'File::Spec::Cygwin' => '3.59', + 'File::Spec::Epoc' => '3.59', + 'File::Spec::Functions' => '3.59', + 'File::Spec::Mac' => '3.59', + 'File::Spec::OS2' => '3.59', + 'File::Spec::Unix' => '3.59', + 'File::Spec::VMS' => '3.59', + 'File::Spec::Win32' => '3.59', + 'Getopt::Long' => '2.48', + 'Hash::Util::FieldHash' => '1.18', + 'IPC::Open3' => '1.20', + 'Math::BigFloat' => '1.999710', + 'Math::BigInt' => '1.999710', + 'Math::BigInt::Calc' => '1.999710', + 'Math::BigInt::CalcEmu' => '1.999710', + 'Math::BigInt::FastCalc'=> '0.37', + 'Module::CoreList' => '5.20151120', + 'Module::CoreList::TieHashDelta'=> '5.20151120', + 'Module::CoreList::Utils'=> '5.20151120', + 'Module::Metadata' => '1.000030', + 'POSIX' => '1.59', + 'PerlIO::encoding' => '0.23', + 'PerlIO::mmap' => '0.015', + 'PerlIO::scalar' => '0.24', + 'PerlIO::via' => '0.16', + 'Pod::Simple' => '3.32', + 'Pod::Simple::BlackBox' => '3.32', + 'Pod::Simple::Checker' => '3.32', + 'Pod::Simple::Debug' => '3.32', + 'Pod::Simple::DumpAsText'=> '3.32', + 'Pod::Simple::DumpAsXML'=> '3.32', + 'Pod::Simple::HTML' => '3.32', + 'Pod::Simple::HTMLBatch'=> '3.32', + 'Pod::Simple::LinkSection'=> '3.32', + 'Pod::Simple::Methody' => '3.32', + 'Pod::Simple::Progress' => '3.32', + 'Pod::Simple::PullParser'=> '3.32', + 'Pod::Simple::PullParserEndToken'=> '3.32', + 'Pod::Simple::PullParserStartToken'=> '3.32', + 'Pod::Simple::PullParserTextToken'=> '3.32', + 'Pod::Simple::PullParserToken'=> '3.32', + 'Pod::Simple::RTF' => '3.32', + 'Pod::Simple::Search' => '3.32', + 'Pod::Simple::SimpleTree'=> '3.32', + 'Pod::Simple::Text' => '3.32', + 'Pod::Simple::TextContent'=> '3.32', + 'Pod::Simple::TiedOutFH'=> '3.32', + 'Pod::Simple::Transcode'=> '3.32', + 'Pod::Simple::TranscodeDumb'=> '3.32', + 'Pod::Simple::TranscodeSmart'=> '3.32', + 'Pod::Simple::XHTML' => '3.32', + 'Pod::Simple::XMLOutStream'=> '3.32', + 'Thread::Queue' => '3.07', + 'Tie::Scalar' => '1.04', + 'Time::HiRes' => '1.9728', + 'Time::Piece' => '1.31', + 'Time::Seconds' => '1.31', + 'Unicode::Normalize' => '1.23', + 'XSLoader' => '0.21', + 'arybase' => '0.11', + 'base' => '2.22_01', + 'fields' => '2.22_01', + 'threads' => '2.04', + 'threads::shared' => '1.49', + }, + removed => { + 'ExtUtils::MakeMaker::version::vpp'=> 1, + 'version::vpp' => 1, + } + }, + 5.022001 => { + delta_from => 5.022, + changed => { + 'B::Op_private' => '5.022001', + 'Config' => '5.022001', + 'Module::CoreList' => '5.20151213', + 'Module::CoreList::TieHashDelta'=> '5.20151213', + 'Module::CoreList::Utils'=> '5.20151213', + 'POSIX' => '1.53_01', + 'PerlIO::scalar' => '0.23', + 'Storable' => '2.53_01', + 'Win32' => '0.52', + 'warnings' => '1.34', + }, + removed => { + } + }, + 5.023006 => { + delta_from => 5.023005, + changed => { + 'B::Deparse' => '1.36', + 'B::Op_private' => '5.023006', + 'Benchmark' => '1.21', + 'CPAN::Meta::Requirements'=> '2.140', + 'CPAN::Meta::YAML' => '0.018', + 'Config' => '5.023006', + 'Cwd' => '3.60', + 'Data::Dumper' => '2.159', + 'DynaLoader' => '1.37', + 'File::Spec' => '3.60', + 'File::Spec::AmigaOS' => '3.60', + 'File::Spec::Cygwin' => '3.60', + 'File::Spec::Epoc' => '3.60', + 'File::Spec::Functions' => '3.60', + 'File::Spec::Mac' => '3.60', + 'File::Spec::OS2' => '3.60', + 'File::Spec::Unix' => '3.60', + 'File::Spec::VMS' => '3.60', + 'File::Spec::Win32' => '3.60', + 'Hash::Util::FieldHash' => '1.19', + 'Locale::Codes' => '3.37', + 'Locale::Codes::Constants'=> '3.37', + 'Locale::Codes::Country'=> '3.37', + 'Locale::Codes::Country_Codes'=> '3.37', + 'Locale::Codes::Country_Retired'=> '3.37', + 'Locale::Codes::Currency'=> '3.37', + 'Locale::Codes::Currency_Codes'=> '3.37', + 'Locale::Codes::Currency_Retired'=> '3.37', + 'Locale::Codes::LangExt'=> '3.37', + 'Locale::Codes::LangExt_Codes'=> '3.37', + 'Locale::Codes::LangExt_Retired'=> '3.37', + 'Locale::Codes::LangFam'=> '3.37', + 'Locale::Codes::LangFam_Codes'=> '3.37', + 'Locale::Codes::LangFam_Retired'=> '3.37', + 'Locale::Codes::LangVar'=> '3.37', + 'Locale::Codes::LangVar_Codes'=> '3.37', + 'Locale::Codes::LangVar_Retired'=> '3.37', + 'Locale::Codes::Language'=> '3.37', + 'Locale::Codes::Language_Codes'=> '3.37', + 'Locale::Codes::Language_Retired'=> '3.37', + 'Locale::Codes::Script' => '3.37', + 'Locale::Codes::Script_Codes'=> '3.37', + 'Locale::Codes::Script_Retired'=> '3.37', + 'Locale::Country' => '3.37', + 'Locale::Currency' => '3.37', + 'Locale::Language' => '3.37', + 'Locale::Script' => '3.37', + 'Math::BigInt::FastCalc'=> '0.38', + 'Module::CoreList' => '5.20151220', + 'Module::CoreList::TieHashDelta'=> '5.20151220', + 'Module::CoreList::Utils'=> '5.20151220', + 'Module::Metadata' => '1.000031', + 'Opcode' => '1.34', + 'PerlIO::mmap' => '0.016', + 'Pod::Perldoc' => '3.25_02', + 'SDBM_File' => '1.14', + 'Term::ANSIColor' => '4.04', + 'Test' => '1.28', + 'Unicode::Normalize' => '1.24', + 'XS::APItest' => '0.77', + 'base' => '2.23', + 'encoding::warnings' => '0.12', + 'fields' => '2.23', + 'locale' => '1.08', + 'strict' => '1.10', + 'threads' => '2.05', + 'threads::shared' => '1.50', + 'utf8' => '1.18', + }, + removed => { + } + }, + 5.023007 => { + delta_from => 5.023006, + changed => { + 'App::Prove' => '3.36', + 'App::Prove::State' => '3.36', + 'App::Prove::State::Result'=> '3.36', + 'App::Prove::State::Result::Test'=> '3.36', + 'B' => '1.62', + 'B::Deparse' => '1.37', + 'B::Op_private' => '5.023007', + 'Benchmark' => '1.22', + 'Config' => '5.023007', + 'Cwd' => '3.62', + 'Data::Dumper' => '2.160', + 'ExtUtils::ParseXS' => '3.31', + 'ExtUtils::ParseXS::Constants'=> '3.31', + 'ExtUtils::ParseXS::CountLines'=> '3.31', + 'ExtUtils::ParseXS::Eval'=> '3.31', + 'ExtUtils::ParseXS::Utilities'=> '3.31', + 'ExtUtils::Typemaps' => '3.31', + 'ExtUtils::Typemaps::Cmd'=> '3.31', + 'ExtUtils::Typemaps::InputMap'=> '3.31', + 'ExtUtils::Typemaps::OutputMap'=> '3.31', + 'ExtUtils::Typemaps::Type'=> '3.31', + 'File::Find' => '1.33', + 'File::Spec' => '3.62', + 'File::Spec::AmigaOS' => '3.62', + 'File::Spec::Cygwin' => '3.62', + 'File::Spec::Epoc' => '3.62', + 'File::Spec::Functions' => '3.62', + 'File::Spec::Mac' => '3.62', + 'File::Spec::OS2' => '3.62', + 'File::Spec::Unix' => '3.62', + 'File::Spec::VMS' => '3.62', + 'File::Spec::Win32' => '3.62', + 'Math::BigFloat' => '1.999715', + 'Math::BigFloat::Trace' => '0.42', + 'Math::BigInt' => '1.999715', + 'Math::BigInt::Calc' => '1.999715', + 'Math::BigInt::CalcEmu' => '1.999715', + 'Math::BigInt::FastCalc'=> '0.40', + 'Math::BigInt::Trace' => '0.42', + 'Math::BigRat' => '0.260802', + 'Module::CoreList' => '5.20160120', + 'Module::CoreList::TieHashDelta'=> '5.20160120', + 'Module::CoreList::Utils'=> '5.20160120', + 'Net::Cmd' => '3.08', + 'Net::Config' => '3.08', + 'Net::Domain' => '3.08', + 'Net::FTP' => '3.08', + 'Net::FTP::A' => '3.08', + 'Net::FTP::E' => '3.08', + 'Net::FTP::I' => '3.08', + 'Net::FTP::L' => '3.08', + 'Net::FTP::dataconn' => '3.08', + 'Net::NNTP' => '3.08', + 'Net::Netrc' => '3.08', + 'Net::POP3' => '3.08', + 'Net::SMTP' => '3.08', + 'Net::Time' => '3.08', + 'Pod::Man' => '4.04', + 'Pod::ParseLink' => '4.04', + 'Pod::Text' => '4.04', + 'Pod::Text::Color' => '4.04', + 'Pod::Text::Overstrike' => '4.04', + 'Pod::Text::Termcap' => '4.04', + 'Pod::Usage' => '1.68', + 'TAP::Base' => '3.36', + 'TAP::Formatter::Base' => '3.36', + 'TAP::Formatter::Color' => '3.36', + 'TAP::Formatter::Console'=> '3.36', + 'TAP::Formatter::Console::ParallelSession'=> '3.36', + 'TAP::Formatter::Console::Session'=> '3.36', + 'TAP::Formatter::File' => '3.36', + 'TAP::Formatter::File::Session'=> '3.36', + 'TAP::Formatter::Session'=> '3.36', + 'TAP::Harness' => '3.36', + 'TAP::Harness::Env' => '3.36', + 'TAP::Object' => '3.36', + 'TAP::Parser' => '3.36', + 'TAP::Parser::Aggregator'=> '3.36', + 'TAP::Parser::Grammar' => '3.36', + 'TAP::Parser::Iterator' => '3.36', + 'TAP::Parser::Iterator::Array'=> '3.36', + 'TAP::Parser::Iterator::Process'=> '3.36', + 'TAP::Parser::Iterator::Stream'=> '3.36', + 'TAP::Parser::IteratorFactory'=> '3.36', + 'TAP::Parser::Multiplexer'=> '3.36', + 'TAP::Parser::Result' => '3.36', + 'TAP::Parser::Result::Bailout'=> '3.36', + 'TAP::Parser::Result::Comment'=> '3.36', + 'TAP::Parser::Result::Plan'=> '3.36', + 'TAP::Parser::Result::Pragma'=> '3.36', + 'TAP::Parser::Result::Test'=> '3.36', + 'TAP::Parser::Result::Unknown'=> '3.36', + 'TAP::Parser::Result::Version'=> '3.36', + 'TAP::Parser::Result::YAML'=> '3.36', + 'TAP::Parser::ResultFactory'=> '3.36', + 'TAP::Parser::Scheduler'=> '3.36', + 'TAP::Parser::Scheduler::Job'=> '3.36', + 'TAP::Parser::Scheduler::Spinner'=> '3.36', + 'TAP::Parser::Source' => '3.36', + 'TAP::Parser::SourceHandler'=> '3.36', + 'TAP::Parser::SourceHandler::Executable'=> '3.36', + 'TAP::Parser::SourceHandler::File'=> '3.36', + 'TAP::Parser::SourceHandler::Handle'=> '3.36', + 'TAP::Parser::SourceHandler::Perl'=> '3.36', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.36', + 'TAP::Parser::YAMLish::Reader'=> '3.36', + 'TAP::Parser::YAMLish::Writer'=> '3.36', + 'Test::Harness' => '3.36', + 'Unicode::Normalize' => '1.25', + 'Unicode::UCD' => '0.64', + 'XS::APItest' => '0.78', + 'bigint' => '0.42', + 'bignum' => '0.42', + 'bigrat' => '0.42', + 'utf8' => '1.19', + }, + removed => { + } + }, + 5.023008 => { + delta_from => 5.023007, + changed => { + 'B::Op_private' => '5.023008', + 'Config' => '5.023008', + 'Cwd' => '3.63', + 'DynaLoader' => '1.38', + 'Encode' => '2.80', + 'Encode::Alias' => '2.20', + 'Encode::MIME::Header' => '2.19', + 'Encode::Unicode' => '2.15', + 'ExtUtils::CBuilder' => '0.280225', + 'ExtUtils::CBuilder::Base'=> '0.280225', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280225', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280225', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280225', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280225', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280225', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280225', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280225', + 'ExtUtils::CBuilder::Platform::android'=> '0.280225', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280225', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280225', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280225', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280225', + 'ExtUtils::Command::MM' => '7.10_01', + 'ExtUtils::Liblist' => '7.10_01', + 'ExtUtils::Liblist::Kid'=> '7.10_01', + 'ExtUtils::MM' => '7.10_01', + 'ExtUtils::MM_AIX' => '7.10_01', + 'ExtUtils::MM_Any' => '7.10_01', + 'ExtUtils::MM_BeOS' => '7.10_01', + 'ExtUtils::MM_Cygwin' => '7.10_01', + 'ExtUtils::MM_DOS' => '7.10_01', + 'ExtUtils::MM_Darwin' => '7.10_01', + 'ExtUtils::MM_MacOS' => '7.10_01', + 'ExtUtils::MM_NW5' => '7.10_01', + 'ExtUtils::MM_OS2' => '7.10_01', + 'ExtUtils::MM_QNX' => '7.10_01', + 'ExtUtils::MM_UWIN' => '7.10_01', + 'ExtUtils::MM_Unix' => '7.10_01', + 'ExtUtils::MM_VMS' => '7.10_01', + 'ExtUtils::MM_VOS' => '7.10_01', + 'ExtUtils::MM_Win32' => '7.10_01', + 'ExtUtils::MM_Win95' => '7.10_01', + 'ExtUtils::MY' => '7.10_01', + 'ExtUtils::MakeMaker' => '7.10_01', + 'ExtUtils::MakeMaker::Config'=> '7.10_01', + 'ExtUtils::MakeMaker::version'=> '7.10_01', + 'ExtUtils::MakeMaker::version::regex'=> '7.10_01', + 'ExtUtils::Mkbootstrap' => '7.10_01', + 'ExtUtils::Mksymlists' => '7.10_01', + 'ExtUtils::testlib' => '7.10_01', + 'File::Spec' => '3.63', + 'File::Spec::AmigaOS' => '3.63', + 'File::Spec::Cygwin' => '3.63', + 'File::Spec::Epoc' => '3.63', + 'File::Spec::Functions' => '3.63', + 'File::Spec::Mac' => '3.63', + 'File::Spec::OS2' => '3.63', + 'File::Spec::Unix' => '3.63', + 'File::Spec::VMS' => '3.63', + 'File::Spec::Win32' => '3.63', + 'IPC::Msg' => '2.05', + 'IPC::Semaphore' => '2.05', + 'IPC::SharedMem' => '2.05', + 'IPC::SysV' => '2.05', + 'Module::CoreList' => '5.20160121', + 'Module::CoreList::TieHashDelta'=> '5.20160121', + 'Module::CoreList::Utils'=> '5.20160121', + 'ODBM_File' => '1.13', + 'POSIX' => '1.63', + 'PerlIO::encoding' => '0.24', + 'Pod::Man' => '4.06', + 'Pod::ParseLink' => '4.06', + 'Pod::Text' => '4.06', + 'Pod::Text::Color' => '4.06', + 'Pod::Text::Overstrike' => '4.06', + 'Pod::Text::Termcap' => '4.06', + 'Storable' => '2.55', + 'Time::HiRes' => '1.9730', + 'XS::APItest' => '0.79', + }, + removed => { + } + }, + 5.023009 => { + delta_from => 5.023008, + changed => { + 'Amiga::ARexx' => '0.04', + 'Amiga::Exec' => '0.02', + 'B::Op_private' => '5.023009', + 'Carp' => '1.40', + 'Carp::Heavy' => '1.40', + 'Config' => '5.023009', + 'Errno' => '1.25', + 'ExtUtils::Embed' => '1.33', + 'File::Find' => '1.34', + 'File::Glob' => '1.26', + 'File::Spec::AmigaOS' => ';.64', + 'IPC::Msg' => '2.06_01', + 'IPC::Semaphore' => '2.06_01', + 'IPC::SharedMem' => '2.06_01', + 'IPC::SysV' => '2.06_01', + 'List::Util' => '1.42_02', + 'List::Util::XS' => '1.42_02', + 'Module::CoreList' => '5.20160320', + 'Module::CoreList::TieHashDelta'=> '5.20160320', + 'Module::CoreList::Utils'=> '5.20160320', + 'POSIX' => '1.64', + 'Pod::Functions' => '1.10', + 'Pod::Functions::Functions'=> '1.10', + 'Scalar::Util' => '1.42_02', + 'SelfLoader' => '1.23', + 'Socket' => '2.020_03', + 'Storable' => '2.56', + 'Sub::Util' => '1.42_02', + 'Thread::Queue' => '3.08', + 'Tie::File' => '1.02', + 'Time::HiRes' => '1.9732', + 'Win32API::File' => '0.1203', + 'Win32API::File::inc::ExtUtils::Myconst2perl'=> '1', + 'XS::APItest' => '0.80', + 'autouse' => '1.11', + 'bytes' => '1.05', + 'strict' => '1.11', + 'threads' => '2.06', + 'version' => '0.9916', + 'version::regex' => '0.9916', + 'warnings' => '1.36', + }, + removed => { + 'Win32API::File::ExtUtils::Myconst2perl'=> 1, + } + }, + 5.022002 => { + delta_from => 5.022001, + changed => { + 'B::Op_private' => '5.022002', + 'Config' => '5.022002', + 'Cwd' => '3.56_01', + 'File::Spec' => '3.56_01', + 'File::Spec::Cygwin' => '3.56_01', + 'File::Spec::Epoc' => '3.56_01', + 'File::Spec::Functions' => '3.56_01', + 'File::Spec::Mac' => '3.56_01', + 'File::Spec::OS2' => '3.56_01', + 'File::Spec::Unix' => '3.56_01', + 'File::Spec::VMS' => '3.56_01', + 'File::Spec::Win32' => '3.56_01', + 'Module::CoreList' => '5.20160429', + 'Module::CoreList::TieHashDelta'=> '5.20160429', + 'Module::CoreList::Utils'=> '5.20160429', + 'XS::APItest' => '0.72_01', + }, + removed => { + } + }, + 5.024000 => { + delta_from => 5.023009, + changed => { + 'B::Op_private' => '5.024000', + 'Config' => '5.024', + 'File::Copy' => '2.31', + 'File::Path' => '2.12_01', + 'File::Spec::AmigaOS' => '3.64', + 'IO::Handle' => '1.36', + 'Module::CoreList' => '5.20160506', + 'Module::CoreList::TieHashDelta'=> '5.20160506', + 'Module::CoreList::Utils'=> '5.20160506', + 'ODBM_File' => '1.14', + 'POSIX' => '1.65', + 'Pod::Man' => '4.07', + 'Pod::ParseLink' => '4.07', + 'Pod::Text' => '4.07', + 'Pod::Text::Color' => '4.07', + 'Pod::Text::Overstrike' => '4.07', + 'Pod::Text::Termcap' => '4.07', + 'Thread::Queue' => '3.09', + 'Time::HiRes' => '1.9733', + 'threads' => '2.07', + 'threads::shared' => '1.51', + 'locale' => '1.09', + }, + removed => { + } + }, + 5.025000 => { + delta_from => 5.024, + changed => { + 'B::Op_private' => '5.025000', + 'Config' => '5.025', + 'Module::CoreList' => '5.20160507', + 'Module::CoreList::TieHashDelta'=> '5.20160507', + 'Module::CoreList::Utils'=> '5.20160507', + 'feature' => '1.43', + }, + removed => { + } + }, + 5.025001 => { + delta_from => 5.025, + changed => { + 'Archive::Tar' => '2.08', + 'Archive::Tar::Constant'=> '2.08', + 'Archive::Tar::File' => '2.08', + 'B::Op_private' => '5.025001', + 'Carp' => '1.41', + 'Carp::Heavy' => '1.41', + 'Config' => '5.025001', + 'Config::Perl::V' => '0.26', + 'DB_File' => '1.838', + 'Digest::MD5' => '2.55', + 'IPC::Cmd' => '0.94', + 'IPC::Msg' => '2.07', + 'IPC::Semaphore' => '2.07', + 'IPC::SharedMem' => '2.07', + 'IPC::SysV' => '2.07', + 'List::Util' => '1.45_01', + 'List::Util::XS' => '1.45_01', + 'Locale::Codes' => '3.38', + 'Locale::Codes::Constants'=> '3.38', + 'Locale::Codes::Country'=> '3.38', + 'Locale::Codes::Country_Codes'=> '3.38', + 'Locale::Codes::Country_Retired'=> '3.38', + 'Locale::Codes::Currency'=> '3.38', + 'Locale::Codes::Currency_Codes'=> '3.38', + 'Locale::Codes::Currency_Retired'=> '3.38', + 'Locale::Codes::LangExt'=> '3.38', + 'Locale::Codes::LangExt_Codes'=> '3.38', + 'Locale::Codes::LangExt_Retired'=> '3.38', + 'Locale::Codes::LangFam'=> '3.38', + 'Locale::Codes::LangFam_Codes'=> '3.38', + 'Locale::Codes::LangFam_Retired'=> '3.38', + 'Locale::Codes::LangVar'=> '3.38', + 'Locale::Codes::LangVar_Codes'=> '3.38', + 'Locale::Codes::LangVar_Retired'=> '3.38', + 'Locale::Codes::Language'=> '3.38', + 'Locale::Codes::Language_Codes'=> '3.38', + 'Locale::Codes::Language_Retired'=> '3.38', + 'Locale::Codes::Script' => '3.38', + 'Locale::Codes::Script_Codes'=> '3.38', + 'Locale::Codes::Script_Retired'=> '3.38', + 'Locale::Country' => '3.38', + 'Locale::Currency' => '3.38', + 'Locale::Language' => '3.38', + 'Locale::Maketext' => '1.27', + 'Locale::Script' => '3.38', + 'Module::CoreList' => '5.20160520', + 'Module::CoreList::TieHashDelta'=> '5.20160520', + 'Module::CoreList::Utils'=> '5.20160520', + 'Module::Metadata' => '1.000032', + 'POSIX' => '1.69', + 'Scalar::Util' => '1.45_01', + 'Sub::Util' => '1.45_01', + 'Sys::Syslog' => '0.34', + 'Term::ANSIColor' => '4.05', + 'Test2' => '1.302015', + 'Test2::API' => '1.302015', + 'Test2::API::Breakage' => '1.302015', + 'Test2::API::Context' => '1.302015', + 'Test2::API::Instance' => '1.302015', + 'Test2::API::Stack' => '1.302015', + 'Test2::Event' => '1.302015', + 'Test2::Event::Bail' => '1.302015', + 'Test2::Event::Diag' => '1.302015', + 'Test2::Event::Exception'=> '1.302015', + 'Test2::Event::Note' => '1.302015', + 'Test2::Event::Ok' => '1.302015', + 'Test2::Event::Plan' => '1.302015', + 'Test2::Event::Skip' => '1.302015', + 'Test2::Event::Subtest' => '1.302015', + 'Test2::Event::Waiting' => '1.302015', + 'Test2::Formatter' => '1.302015', + 'Test2::Formatter::TAP' => '1.302015', + 'Test2::Hub' => '1.302015', + 'Test2::Hub::Interceptor'=> '1.302015', + 'Test2::Hub::Interceptor::Terminator'=> '1.302015', + 'Test2::Hub::Subtest' => '1.302015', + 'Test2::IPC' => '1.302015', + 'Test2::IPC::Driver' => '1.302015', + 'Test2::IPC::Driver::Files'=> '1.302015', + 'Test2::Util' => '1.302015', + 'Test2::Util::ExternalMeta'=> '1.302015', + 'Test2::Util::HashBase' => '1.302015', + 'Test2::Util::Trace' => '1.302015', + 'Test::Builder' => '1.302015', + 'Test::Builder::Formatter'=> '1.302015', + 'Test::Builder::Module' => '1.302015', + 'Test::Builder::Tester' => '1.302015', + 'Test::Builder::Tester::Color'=> '1.302015', + 'Test::Builder::TodoDiag'=> '1.302015', + 'Test::More' => '1.302015', + 'Test::Simple' => '1.302015', + 'Test::Tester' => '1.302015', + 'Test::Tester::Capture' => '1.302015', + 'Test::Tester::CaptureRunner'=> '1.302015', + 'Test::Tester::Delegate'=> '1.302015', + 'Test::use::ok' => '1.302015', + 'XS::APItest' => '0.81', + '_charnames' => '1.44', + 'charnames' => '1.44', + 'ok' => '1.302015', + 'perlfaq' => '5.021011', + 're' => '0.33', + 'threads' => '2.08', + 'threads::shared' => '1.52', + }, + removed => { + } + }, + 5.025002 => { + delta_from => 5.025001, + changed => { + 'App::Cpan' => '1.64', + 'B::Op_private' => '5.025002', + 'CPAN' => '2.14', + 'CPAN::Distribution' => '2.12', + 'CPAN::FTP' => '5.5007', + 'CPAN::FirstTime' => '5.5309', + 'CPAN::HandleConfig' => '5.5007', + 'CPAN::Index' => '2.12', + 'CPAN::Mirrors' => '2.12', + 'CPAN::Plugin' => '0.96', + 'CPAN::Shell' => '5.5006', + 'Config' => '5.025002', + 'Cwd' => '3.64', + 'Devel::Peek' => '1.24', + 'DynaLoader' => '1.39', + 'ExtUtils::Command' => '7.18', + 'ExtUtils::Command::MM' => '7.18', + 'ExtUtils::Liblist' => '7.18', + 'ExtUtils::Liblist::Kid'=> '7.18', + 'ExtUtils::MM' => '7.18', + 'ExtUtils::MM_AIX' => '7.18', + 'ExtUtils::MM_Any' => '7.18', + 'ExtUtils::MM_BeOS' => '7.18', + 'ExtUtils::MM_Cygwin' => '7.18', + 'ExtUtils::MM_DOS' => '7.18', + 'ExtUtils::MM_Darwin' => '7.18', + 'ExtUtils::MM_MacOS' => '7.18', + 'ExtUtils::MM_NW5' => '7.18', + 'ExtUtils::MM_OS2' => '7.18', + 'ExtUtils::MM_QNX' => '7.18', + 'ExtUtils::MM_UWIN' => '7.18', + 'ExtUtils::MM_Unix' => '7.18', + 'ExtUtils::MM_VMS' => '7.18', + 'ExtUtils::MM_VOS' => '7.18', + 'ExtUtils::MM_Win32' => '7.18', + 'ExtUtils::MM_Win95' => '7.18', + 'ExtUtils::MY' => '7.18', + 'ExtUtils::MakeMaker' => '7.18', + 'ExtUtils::MakeMaker::Config'=> '7.18', + 'ExtUtils::MakeMaker::Locale'=> '7.18', + 'ExtUtils::MakeMaker::version'=> '7.18', + 'ExtUtils::MakeMaker::version::regex'=> '7.18', + 'ExtUtils::Miniperl' => '1.06', + 'ExtUtils::Mkbootstrap' => '7.18', + 'ExtUtils::Mksymlists' => '7.18', + 'ExtUtils::ParseXS' => '3.32', + 'ExtUtils::ParseXS::Constants'=> '3.32', + 'ExtUtils::ParseXS::CountLines'=> '3.32', + 'ExtUtils::ParseXS::Eval'=> '3.32', + 'ExtUtils::ParseXS::Utilities'=> '3.32', + 'ExtUtils::Typemaps' => '3.32', + 'ExtUtils::Typemaps::Cmd'=> '3.32', + 'ExtUtils::Typemaps::InputMap'=> '3.32', + 'ExtUtils::Typemaps::OutputMap'=> '3.32', + 'ExtUtils::Typemaps::Type'=> '3.32', + 'ExtUtils::testlib' => '7.18', + 'File::Copy' => '2.32', + 'File::Glob' => '1.27', + 'File::Spec' => '3.64', + 'File::Spec::Cygwin' => '3.64', + 'File::Spec::Epoc' => '3.64', + 'File::Spec::Functions' => '3.64', + 'File::Spec::Mac' => '3.64', + 'File::Spec::OS2' => '3.64', + 'File::Spec::Unix' => '3.64', + 'File::Spec::VMS' => '3.64', + 'File::Spec::Win32' => '3.64', + 'FileHandle' => '2.03', + 'Getopt::Long' => '2.49', + 'HTTP::Tiny' => '0.058', + 'JSON::PP' => '2.27400', + 'Locale::Codes' => '3.39', + 'Locale::Codes::Constants'=> '3.39', + 'Locale::Codes::Country'=> '3.39', + 'Locale::Codes::Country_Codes'=> '3.39', + 'Locale::Codes::Country_Retired'=> '3.39', + 'Locale::Codes::Currency'=> '3.39', + 'Locale::Codes::Currency_Codes'=> '3.39', + 'Locale::Codes::Currency_Retired'=> '3.39', + 'Locale::Codes::LangExt'=> '3.39', + 'Locale::Codes::LangExt_Codes'=> '3.39', + 'Locale::Codes::LangExt_Retired'=> '3.39', + 'Locale::Codes::LangFam'=> '3.39', + 'Locale::Codes::LangFam_Codes'=> '3.39', + 'Locale::Codes::LangFam_Retired'=> '3.39', + 'Locale::Codes::LangVar'=> '3.39', + 'Locale::Codes::LangVar_Codes'=> '3.39', + 'Locale::Codes::LangVar_Retired'=> '3.39', + 'Locale::Codes::Language'=> '3.39', + 'Locale::Codes::Language_Codes'=> '3.39', + 'Locale::Codes::Language_Retired'=> '3.39', + 'Locale::Codes::Script' => '3.39', + 'Locale::Codes::Script_Codes'=> '3.39', + 'Locale::Codes::Script_Retired'=> '3.39', + 'Locale::Country' => '3.39', + 'Locale::Currency' => '3.39', + 'Locale::Language' => '3.39', + 'Locale::Script' => '3.39', + 'Module::CoreList' => '5.20160620', + 'Module::CoreList::TieHashDelta'=> '5.20160620', + 'Module::CoreList::Utils'=> '5.20160620', + 'Opcode' => '1.35', + 'POSIX' => '1.70', + 'Pod::Checker' => '1.73', + 'Pod::Functions' => '1.11', + 'Pod::Functions::Functions'=> '1.11', + 'Pod::Usage' => '1.69', + 'Test2' => '1.302026', + 'Test2::API' => '1.302026', + 'Test2::API::Breakage' => '1.302026', + 'Test2::API::Context' => '1.302026', + 'Test2::API::Instance' => '1.302026', + 'Test2::API::Stack' => '1.302026', + 'Test2::Event' => '1.302026', + 'Test2::Event::Bail' => '1.302026', + 'Test2::Event::Diag' => '1.302026', + 'Test2::Event::Exception'=> '1.302026', + 'Test2::Event::Generic' => '1.302026', + 'Test2::Event::Note' => '1.302026', + 'Test2::Event::Ok' => '1.302026', + 'Test2::Event::Plan' => '1.302026', + 'Test2::Event::Skip' => '1.302026', + 'Test2::Event::Subtest' => '1.302026', + 'Test2::Event::Waiting' => '1.302026', + 'Test2::Formatter' => '1.302026', + 'Test2::Formatter::TAP' => '1.302026', + 'Test2::Hub' => '1.302026', + 'Test2::Hub::Interceptor'=> '1.302026', + 'Test2::Hub::Interceptor::Terminator'=> '1.302026', + 'Test2::Hub::Subtest' => '1.302026', + 'Test2::IPC' => '1.302026', + 'Test2::IPC::Driver' => '1.302026', + 'Test2::IPC::Driver::Files'=> '1.302026', + 'Test2::Util' => '1.302026', + 'Test2::Util::ExternalMeta'=> '1.302026', + 'Test2::Util::HashBase' => '1.302026', + 'Test2::Util::Trace' => '1.302026', + 'Test::Builder' => '1.302026', + 'Test::Builder::Formatter'=> '1.302026', + 'Test::Builder::Module' => '1.302026', + 'Test::Builder::Tester' => '1.302026', + 'Test::Builder::Tester::Color'=> '1.302026', + 'Test::Builder::TodoDiag'=> '1.302026', + 'Test::More' => '1.302026', + 'Test::Simple' => '1.302026', + 'Test::Tester' => '1.302026', + 'Test::Tester::Capture' => '1.302026', + 'Test::Tester::CaptureRunner'=> '1.302026', + 'Test::Tester::Delegate'=> '1.302026', + 'Test::use::ok' => '1.302026', + 'Thread::Queue' => '3.11', + 'Time::HiRes' => '1.9734', + 'Unicode::UCD' => '0.65', + 'VMS::DCLsym' => '1.07', + 'XS::APItest' => '0.82', + 'diagnostics' => '1.35', + 'feature' => '1.44', + 'ok' => '1.302026', + 'threads' => '2.09', + }, + removed => { + } + }, + 5.025003 => { + delta_from => 5.025002, + changed => { + 'B::Op_private' => '5.025003', + 'Config' => '5.025003', + 'Data::Dumper' => '2.161', + 'Devel::PPPort' => '3.35', + 'Encode' => '2.84', + 'Encode::MIME::Header' => '2.23', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.07', + 'ExtUtils::ParseXS' => '3.33', + 'ExtUtils::ParseXS::Constants'=> '3.33', + 'ExtUtils::ParseXS::CountLines'=> '3.33', + 'ExtUtils::ParseXS::Eval'=> '3.33', + 'ExtUtils::ParseXS::Utilities'=> '3.33', + 'ExtUtils::Typemaps' => '3.33', + 'ExtUtils::Typemaps::Cmd'=> '3.33', + 'ExtUtils::Typemaps::InputMap'=> '3.33', + 'ExtUtils::Typemaps::OutputMap'=> '3.33', + 'ExtUtils::Typemaps::Type'=> '3.33', + 'Hash::Util' => '0.20', + 'Math::BigFloat' => '1.999726', + 'Math::BigFloat::Trace' => '0.43', + 'Math::BigInt' => '1.999726', + 'Math::BigInt::Calc' => '1.999726', + 'Math::BigInt::CalcEmu' => '1.999726', + 'Math::BigInt::FastCalc'=> '0.42', + 'Math::BigInt::Trace' => '0.43', + 'Math::BigRat' => '0.260804', + 'Module::CoreList' => '5.20160720', + 'Module::CoreList::TieHashDelta'=> '5.20160720', + 'Module::CoreList::Utils'=> '5.20160720', + 'Net::Cmd' => '3.09', + 'Net::Config' => '3.09', + 'Net::Domain' => '3.09', + 'Net::FTP' => '3.09', + 'Net::FTP::A' => '3.09', + 'Net::FTP::E' => '3.09', + 'Net::FTP::I' => '3.09', + 'Net::FTP::L' => '3.09', + 'Net::FTP::dataconn' => '3.09', + 'Net::NNTP' => '3.09', + 'Net::Netrc' => '3.09', + 'Net::POP3' => '3.09', + 'Net::SMTP' => '3.09', + 'Net::Time' => '3.09', + 'Parse::CPAN::Meta' => '1.4422', + 'Perl::OSType' => '1.010', + 'Test2' => '1.302045', + 'Test2::API' => '1.302045', + 'Test2::API::Breakage' => '1.302045', + 'Test2::API::Context' => '1.302045', + 'Test2::API::Instance' => '1.302045', + 'Test2::API::Stack' => '1.302045', + 'Test2::Event' => '1.302045', + 'Test2::Event::Bail' => '1.302045', + 'Test2::Event::Diag' => '1.302045', + 'Test2::Event::Exception'=> '1.302045', + 'Test2::Event::Generic' => '1.302045', + 'Test2::Event::Info' => '1.302045', + 'Test2::Event::Note' => '1.302045', + 'Test2::Event::Ok' => '1.302045', + 'Test2::Event::Plan' => '1.302045', + 'Test2::Event::Skip' => '1.302045', + 'Test2::Event::Subtest' => '1.302045', + 'Test2::Event::Waiting' => '1.302045', + 'Test2::Formatter' => '1.302045', + 'Test2::Formatter::TAP' => '1.302045', + 'Test2::Hub' => '1.302045', + 'Test2::Hub::Interceptor'=> '1.302045', + 'Test2::Hub::Interceptor::Terminator'=> '1.302045', + 'Test2::Hub::Subtest' => '1.302045', + 'Test2::IPC' => '1.302045', + 'Test2::IPC::Driver' => '1.302045', + 'Test2::IPC::Driver::Files'=> '1.302045', + 'Test2::Util' => '1.302045', + 'Test2::Util::ExternalMeta'=> '1.302045', + 'Test2::Util::HashBase' => '1.302045', + 'Test2::Util::Trace' => '1.302045', + 'Test::Builder' => '1.302045', + 'Test::Builder::Formatter'=> '1.302045', + 'Test::Builder::Module' => '1.302045', + 'Test::Builder::Tester' => '1.302045', + 'Test::Builder::Tester::Color'=> '1.302045', + 'Test::Builder::TodoDiag'=> '1.302045', + 'Test::More' => '1.302045', + 'Test::Simple' => '1.302045', + 'Test::Tester' => '1.302045', + 'Test::Tester::Capture' => '1.302045', + 'Test::Tester::CaptureRunner'=> '1.302045', + 'Test::Tester::Delegate'=> '1.302045', + 'Test::use::ok' => '1.302045', + 'Time::HiRes' => '1.9739', + 'Unicode' => '9.0.0', + 'Unicode::UCD' => '0.66', + 'XSLoader' => '0.22', + 'bigint' => '0.43', + 'bignum' => '0.43', + 'bigrat' => '0.43', + 'encoding' => '2.17_01', + 'encoding::warnings' => '0.13', + 'feature' => '1.45', + 'ok' => '1.302045', + 'version' => '0.9917', + 'version::regex' => '0.9917', + 'warnings' => '1.37', + }, + removed => { + } + }, + 5.025004 => { + delta_from => 5.025003, + changed => { + 'App::Cpan' => '1.64_01', + 'App::Prove' => '3.36_01', + 'App::Prove::State' => '3.36_01', + 'App::Prove::State::Result'=> '3.36_01', + 'App::Prove::State::Result::Test'=> '3.36_01', + 'Archive::Tar' => '2.10', + 'Archive::Tar::Constant'=> '2.10', + 'Archive::Tar::File' => '2.10', + 'B' => '1.63', + 'B::Concise' => '0.998', + 'B::Deparse' => '1.38', + 'B::Op_private' => '5.025004', + 'CPAN' => '2.14_01', + 'CPAN::Meta' => '2.150010', + 'CPAN::Meta::Converter' => '2.150010', + 'CPAN::Meta::Feature' => '2.150010', + 'CPAN::Meta::History' => '2.150010', + 'CPAN::Meta::Merge' => '2.150010', + 'CPAN::Meta::Prereqs' => '2.150010', + 'CPAN::Meta::Spec' => '2.150010', + 'CPAN::Meta::Validator' => '2.150010', + 'Carp' => '1.42', + 'Carp::Heavy' => '1.42', + 'Compress::Zlib' => '2.069_01', + 'Config' => '5.025004', + 'Config::Perl::V' => '0.27', + 'Cwd' => '3.65', + 'Digest' => '1.17_01', + 'Digest::SHA' => '5.96', + 'Encode' => '2.86', + 'Errno' => '1.26', + 'ExtUtils::Command' => '7.24', + 'ExtUtils::Command::MM' => '7.24', + 'ExtUtils::Liblist' => '7.24', + 'ExtUtils::Liblist::Kid'=> '7.24', + 'ExtUtils::MM' => '7.24', + 'ExtUtils::MM_AIX' => '7.24', + 'ExtUtils::MM_Any' => '7.24', + 'ExtUtils::MM_BeOS' => '7.24', + 'ExtUtils::MM_Cygwin' => '7.24', + 'ExtUtils::MM_DOS' => '7.24', + 'ExtUtils::MM_Darwin' => '7.24', + 'ExtUtils::MM_MacOS' => '7.24', + 'ExtUtils::MM_NW5' => '7.24', + 'ExtUtils::MM_OS2' => '7.24', + 'ExtUtils::MM_QNX' => '7.24', + 'ExtUtils::MM_UWIN' => '7.24', + 'ExtUtils::MM_Unix' => '7.24', + 'ExtUtils::MM_VMS' => '7.24', + 'ExtUtils::MM_VOS' => '7.24', + 'ExtUtils::MM_Win32' => '7.24', + 'ExtUtils::MM_Win95' => '7.24', + 'ExtUtils::MY' => '7.24', + 'ExtUtils::MakeMaker' => '7.24', + 'ExtUtils::MakeMaker::Config'=> '7.24', + 'ExtUtils::MakeMaker::Locale'=> '7.24', + 'ExtUtils::MakeMaker::version'=> '7.24', + 'ExtUtils::MakeMaker::version::regex'=> '7.24', + 'ExtUtils::Mkbootstrap' => '7.24', + 'ExtUtils::Mksymlists' => '7.24', + 'ExtUtils::testlib' => '7.24', + 'File::Fetch' => '0.52', + 'File::Spec' => '3.65', + 'File::Spec::AmigaOS' => '3.65', + 'File::Spec::Cygwin' => '3.65', + 'File::Spec::Epoc' => '3.65', + 'File::Spec::Functions' => '3.65', + 'File::Spec::Mac' => '3.65', + 'File::Spec::OS2' => '3.65', + 'File::Spec::Unix' => '3.65', + 'File::Spec::VMS' => '3.65', + 'File::Spec::Win32' => '3.65', + 'HTTP::Tiny' => '0.064', + 'Hash::Util' => '0.21', + 'I18N::LangTags' => '0.41', + 'I18N::LangTags::Detect'=> '1.06', + 'IO' => '1.37', + 'IO::Compress::Adapter::Bzip2'=> '2.069_01', + 'IO::Compress::Adapter::Deflate'=> '2.069_01', + 'IO::Compress::Adapter::Identity'=> '2.069_01', + 'IO::Compress::Base' => '2.069_01', + 'IO::Compress::Base::Common'=> '2.069_01', + 'IO::Compress::Bzip2' => '2.069_01', + 'IO::Compress::Deflate' => '2.069_01', + 'IO::Compress::Gzip' => '2.069_01', + 'IO::Compress::Gzip::Constants'=> '2.069_01', + 'IO::Compress::RawDeflate'=> '2.069_01', + 'IO::Compress::Zip' => '2.069_01', + 'IO::Compress::Zip::Constants'=> '2.069_01', + 'IO::Compress::Zlib::Constants'=> '2.069_01', + 'IO::Compress::Zlib::Extra'=> '2.069_01', + 'IO::Socket::IP' => '0.38', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.069_01', + 'IO::Uncompress::Adapter::Identity'=> '2.069_01', + 'IO::Uncompress::Adapter::Inflate'=> '2.069_01', + 'IO::Uncompress::AnyInflate'=> '2.069_01', + 'IO::Uncompress::AnyUncompress'=> '2.069_01', + 'IO::Uncompress::Base' => '2.069_01', + 'IO::Uncompress::Bunzip2'=> '2.069_01', + 'IO::Uncompress::Gunzip'=> '2.069_01', + 'IO::Uncompress::Inflate'=> '2.069_01', + 'IO::Uncompress::RawInflate'=> '2.069_01', + 'IO::Uncompress::Unzip' => '2.069_01', + 'IPC::Cmd' => '0.96', + 'JSON::PP' => '2.27400_01', + 'Locale::Maketext' => '1.28', + 'Locale::Maketext::Simple'=> '0.21_01', + 'Math::BigFloat::Trace' => '0.43_01', + 'Math::BigInt::Trace' => '0.43_01', + 'Memoize' => '1.03_01', + 'Module::CoreList' => '5.20160820', + 'Module::CoreList::TieHashDelta'=> '5.20160820', + 'Module::CoreList::Utils'=> '5.20160820', + 'Module::Load::Conditional'=> '0.68', + 'Module::Metadata' => '1.000033', + 'NEXT' => '0.67', + 'Net::Cmd' => '3.10', + 'Net::Config' => '3.10', + 'Net::Domain' => '3.10', + 'Net::FTP' => '3.10', + 'Net::FTP::A' => '3.10', + 'Net::FTP::E' => '3.10', + 'Net::FTP::I' => '3.10', + 'Net::FTP::L' => '3.10', + 'Net::FTP::dataconn' => '3.10', + 'Net::NNTP' => '3.10', + 'Net::Netrc' => '3.10', + 'Net::POP3' => '3.10', + 'Net::Ping' => '2.44', + 'Net::SMTP' => '3.10', + 'Net::Time' => '3.10', + 'Opcode' => '1.37', + 'POSIX' => '1.71', + 'Parse::CPAN::Meta' => '2.150010', + 'Pod::Html' => '1.2201', + 'Pod::Perldoc' => '3.27', + 'Pod::Perldoc::BaseTo' => '3.27', + 'Pod::Perldoc::GetOptsOO'=> '3.27', + 'Pod::Perldoc::ToANSI' => '3.27', + 'Pod::Perldoc::ToChecker'=> '3.27', + 'Pod::Perldoc::ToMan' => '3.27', + 'Pod::Perldoc::ToNroff' => '3.27', + 'Pod::Perldoc::ToPod' => '3.27', + 'Pod::Perldoc::ToRtf' => '3.27', + 'Pod::Perldoc::ToTerm' => '3.27', + 'Pod::Perldoc::ToText' => '3.27', + 'Pod::Perldoc::ToTk' => '3.27', + 'Pod::Perldoc::ToXml' => '3.27', + 'Storable' => '2.57', + 'Sys::Syslog' => '0.34_01', + 'TAP::Base' => '3.36_01', + 'TAP::Formatter::Base' => '3.36_01', + 'TAP::Formatter::Color' => '3.36_01', + 'TAP::Formatter::Console'=> '3.36_01', + 'TAP::Formatter::Console::ParallelSession'=> '3.36_01', + 'TAP::Formatter::Console::Session'=> '3.36_01', + 'TAP::Formatter::File' => '3.36_01', + 'TAP::Formatter::File::Session'=> '3.36_01', + 'TAP::Formatter::Session'=> '3.36_01', + 'TAP::Harness' => '3.36_01', + 'TAP::Harness::Env' => '3.36_01', + 'TAP::Object' => '3.36_01', + 'TAP::Parser' => '3.36_01', + 'TAP::Parser::Aggregator'=> '3.36_01', + 'TAP::Parser::Grammar' => '3.36_01', + 'TAP::Parser::Iterator' => '3.36_01', + 'TAP::Parser::Iterator::Array'=> '3.36_01', + 'TAP::Parser::Iterator::Process'=> '3.36_01', + 'TAP::Parser::Iterator::Stream'=> '3.36_01', + 'TAP::Parser::IteratorFactory'=> '3.36_01', + 'TAP::Parser::Multiplexer'=> '3.36_01', + 'TAP::Parser::Result' => '3.36_01', + 'TAP::Parser::Result::Bailout'=> '3.36_01', + 'TAP::Parser::Result::Comment'=> '3.36_01', + 'TAP::Parser::Result::Plan'=> '3.36_01', + 'TAP::Parser::Result::Pragma'=> '3.36_01', + 'TAP::Parser::Result::Test'=> '3.36_01', + 'TAP::Parser::Result::Unknown'=> '3.36_01', + 'TAP::Parser::Result::Version'=> '3.36_01', + 'TAP::Parser::Result::YAML'=> '3.36_01', + 'TAP::Parser::ResultFactory'=> '3.36_01', + 'TAP::Parser::Scheduler'=> '3.36_01', + 'TAP::Parser::Scheduler::Job'=> '3.36_01', + 'TAP::Parser::Scheduler::Spinner'=> '3.36_01', + 'TAP::Parser::Source' => '3.36_01', + 'TAP::Parser::SourceHandler'=> '3.36_01', + 'TAP::Parser::SourceHandler::Executable'=> '3.36_01', + 'TAP::Parser::SourceHandler::File'=> '3.36_01', + 'TAP::Parser::SourceHandler::Handle'=> '3.36_01', + 'TAP::Parser::SourceHandler::Perl'=> '3.36_01', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.36_01', + 'TAP::Parser::YAMLish::Reader'=> '3.36_01', + 'TAP::Parser::YAMLish::Writer'=> '3.36_01', + 'Test' => '1.29', + 'Test2' => '1.302052', + 'Test2::API' => '1.302052', + 'Test2::API::Breakage' => '1.302052', + 'Test2::API::Context' => '1.302052', + 'Test2::API::Instance' => '1.302052', + 'Test2::API::Stack' => '1.302052', + 'Test2::Event' => '1.302052', + 'Test2::Event::Bail' => '1.302052', + 'Test2::Event::Diag' => '1.302052', + 'Test2::Event::Exception'=> '1.302052', + 'Test2::Event::Generic' => '1.302052', + 'Test2::Event::Info' => '1.302052', + 'Test2::Event::Note' => '1.302052', + 'Test2::Event::Ok' => '1.302052', + 'Test2::Event::Plan' => '1.302052', + 'Test2::Event::Skip' => '1.302052', + 'Test2::Event::Subtest' => '1.302052', + 'Test2::Event::Waiting' => '1.302052', + 'Test2::Formatter' => '1.302052', + 'Test2::Formatter::TAP' => '1.302052', + 'Test2::Hub' => '1.302052', + 'Test2::Hub::Interceptor'=> '1.302052', + 'Test2::Hub::Interceptor::Terminator'=> '1.302052', + 'Test2::Hub::Subtest' => '1.302052', + 'Test2::IPC' => '1.302052', + 'Test2::IPC::Driver' => '1.302052', + 'Test2::IPC::Driver::Files'=> '1.302052', + 'Test2::Util' => '1.302052', + 'Test2::Util::ExternalMeta'=> '1.302052', + 'Test2::Util::HashBase' => '1.302052', + 'Test2::Util::Trace' => '1.302052', + 'Test::Builder' => '1.302052', + 'Test::Builder::Formatter'=> '1.302052', + 'Test::Builder::Module' => '1.302052', + 'Test::Builder::Tester' => '1.302052', + 'Test::Builder::Tester::Color'=> '1.302052', + 'Test::Builder::TodoDiag'=> '1.302052', + 'Test::Harness' => '3.36_01', + 'Test::More' => '1.302052', + 'Test::Simple' => '1.302052', + 'Test::Tester' => '1.302052', + 'Test::Tester::Capture' => '1.302052', + 'Test::Tester::CaptureRunner'=> '1.302052', + 'Test::Tester::Delegate'=> '1.302052', + 'Test::use::ok' => '1.302052', + 'Tie::Hash::NamedCapture'=> '0.10', + 'Time::Local' => '1.24', + 'XS::APItest' => '0.83', + 'arybase' => '0.12', + 'base' => '2.24', + 'bigint' => '0.43_01', + 'bignum' => '0.43_01', + 'bigrat' => '0.43_01', + 'encoding' => '2.18', + 'ok' => '1.302052', + }, + removed => { + } + }, + 5.025005 => { + delta_from => 5.025004, + changed => { + 'B::Op_private' => '5.025005', + 'Config' => '5.025005', + 'Filter::Simple' => '0.93', + 'Locale::Codes' => '3.40', + 'Locale::Codes::Constants'=> '3.40', + 'Locale::Codes::Country'=> '3.40', + 'Locale::Codes::Country_Codes'=> '3.40', + 'Locale::Codes::Country_Retired'=> '3.40', + 'Locale::Codes::Currency'=> '3.40', + 'Locale::Codes::Currency_Codes'=> '3.40', + 'Locale::Codes::Currency_Retired'=> '3.40', + 'Locale::Codes::LangExt'=> '3.40', + 'Locale::Codes::LangExt_Codes'=> '3.40', + 'Locale::Codes::LangExt_Retired'=> '3.40', + 'Locale::Codes::LangFam'=> '3.40', + 'Locale::Codes::LangFam_Codes'=> '3.40', + 'Locale::Codes::LangFam_Retired'=> '3.40', + 'Locale::Codes::LangVar'=> '3.40', + 'Locale::Codes::LangVar_Codes'=> '3.40', + 'Locale::Codes::LangVar_Retired'=> '3.40', + 'Locale::Codes::Language'=> '3.40', + 'Locale::Codes::Language_Codes'=> '3.40', + 'Locale::Codes::Language_Retired'=> '3.40', + 'Locale::Codes::Script' => '3.40', + 'Locale::Codes::Script_Codes'=> '3.40', + 'Locale::Codes::Script_Retired'=> '3.40', + 'Locale::Country' => '3.40', + 'Locale::Currency' => '3.40', + 'Locale::Language' => '3.40', + 'Locale::Script' => '3.40', + 'Module::CoreList' => '5.20160920', + 'Module::CoreList::TieHashDelta'=> '5.20160920', + 'Module::CoreList::Utils'=> '5.20160920', + 'POSIX' => '1.72', + 'Sys::Syslog' => '0.35', + 'Test2' => '1.302056', + 'Test2::API' => '1.302056', + 'Test2::API::Breakage' => '1.302056', + 'Test2::API::Context' => '1.302056', + 'Test2::API::Instance' => '1.302056', + 'Test2::API::Stack' => '1.302056', + 'Test2::Event' => '1.302056', + 'Test2::Event::Bail' => '1.302056', + 'Test2::Event::Diag' => '1.302056', + 'Test2::Event::Exception'=> '1.302056', + 'Test2::Event::Generic' => '1.302056', + 'Test2::Event::Info' => '1.302056', + 'Test2::Event::Note' => '1.302056', + 'Test2::Event::Ok' => '1.302056', + 'Test2::Event::Plan' => '1.302056', + 'Test2::Event::Skip' => '1.302056', + 'Test2::Event::Subtest' => '1.302056', + 'Test2::Event::Waiting' => '1.302056', + 'Test2::Formatter' => '1.302056', + 'Test2::Formatter::TAP' => '1.302056', + 'Test2::Hub' => '1.302056', + 'Test2::Hub::Interceptor'=> '1.302056', + 'Test2::Hub::Interceptor::Terminator'=> '1.302056', + 'Test2::Hub::Subtest' => '1.302056', + 'Test2::IPC' => '1.302056', + 'Test2::IPC::Driver' => '1.302056', + 'Test2::IPC::Driver::Files'=> '1.302056', + 'Test2::Util' => '1.302056', + 'Test2::Util::ExternalMeta'=> '1.302056', + 'Test2::Util::HashBase' => '1.302056', + 'Test2::Util::Trace' => '1.302056', + 'Test::Builder' => '1.302056', + 'Test::Builder::Formatter'=> '1.302056', + 'Test::Builder::Module' => '1.302056', + 'Test::Builder::Tester' => '1.302056', + 'Test::Builder::Tester::Color'=> '1.302056', + 'Test::Builder::TodoDiag'=> '1.302056', + 'Test::More' => '1.302056', + 'Test::Simple' => '1.302056', + 'Test::Tester' => '1.302056', + 'Test::Tester::Capture' => '1.302056', + 'Test::Tester::CaptureRunner'=> '1.302056', + 'Test::Tester::Delegate'=> '1.302056', + 'Test::use::ok' => '1.302056', + 'Thread::Semaphore' => '2.13', + 'XS::APItest' => '0.84', + 'XSLoader' => '0.24', + 'ok' => '1.302056', + }, + removed => { + } + }, + 5.025006 => { + delta_from => 5.025005, + changed => { + 'Archive::Tar' => '2.14', + 'Archive::Tar::Constant'=> '2.14', + 'Archive::Tar::File' => '2.14', + 'B' => '1.64', + 'B::Concise' => '0.999', + 'B::Deparse' => '1.39', + 'B::Op_private' => '5.025006', + 'Config' => '5.025006', + 'Data::Dumper' => '2.162', + 'Devel::Peek' => '1.25', + 'HTTP::Tiny' => '0.070', + 'List::Util' => '1.46', + 'List::Util::XS' => '1.46', + 'Module::CoreList' => '5.20161020', + 'Module::CoreList::TieHashDelta'=> '5.20161020', + 'Module::CoreList::Utils'=> '5.20161020', + 'Net::Ping' => '2.51', + 'OS2::DLL' => '1.07', + 'Opcode' => '1.38', + 'POSIX' => '1.73', + 'PerlIO::encoding' => '0.25', + 'Pod::Man' => '4.08', + 'Pod::ParseLink' => '4.08', + 'Pod::Text' => '4.08', + 'Pod::Text::Color' => '4.08', + 'Pod::Text::Overstrike' => '4.08', + 'Pod::Text::Termcap' => '4.08', + 'Scalar::Util' => '1.46', + 'Storable' => '2.58', + 'Sub::Util' => '1.46', + 'Test2' => '1.302059', + 'Test2::API' => '1.302059', + 'Test2::API::Breakage' => '1.302059', + 'Test2::API::Context' => '1.302059', + 'Test2::API::Instance' => '1.302059', + 'Test2::API::Stack' => '1.302059', + 'Test2::Event' => '1.302059', + 'Test2::Event::Bail' => '1.302059', + 'Test2::Event::Diag' => '1.302059', + 'Test2::Event::Exception'=> '1.302059', + 'Test2::Event::Generic' => '1.302059', + 'Test2::Event::Info' => '1.302059', + 'Test2::Event::Note' => '1.302059', + 'Test2::Event::Ok' => '1.302059', + 'Test2::Event::Plan' => '1.302059', + 'Test2::Event::Skip' => '1.302059', + 'Test2::Event::Subtest' => '1.302059', + 'Test2::Event::Waiting' => '1.302059', + 'Test2::Formatter' => '1.302059', + 'Test2::Formatter::TAP' => '1.302059', + 'Test2::Hub' => '1.302059', + 'Test2::Hub::Interceptor'=> '1.302059', + 'Test2::Hub::Interceptor::Terminator'=> '1.302059', + 'Test2::Hub::Subtest' => '1.302059', + 'Test2::IPC' => '1.302059', + 'Test2::IPC::Driver' => '1.302059', + 'Test2::IPC::Driver::Files'=> '1.302059', + 'Test2::Util' => '1.302059', + 'Test2::Util::ExternalMeta'=> '1.302059', + 'Test2::Util::HashBase' => '1.302059', + 'Test2::Util::Trace' => '1.302059', + 'Test::Builder' => '1.302059', + 'Test::Builder::Formatter'=> '1.302059', + 'Test::Builder::Module' => '1.302059', + 'Test::Builder::Tester' => '1.302059', + 'Test::Builder::Tester::Color'=> '1.302059', + 'Test::Builder::TodoDiag'=> '1.302059', + 'Test::More' => '1.302059', + 'Test::Simple' => '1.302059', + 'Test::Tester' => '1.302059', + 'Test::Tester::Capture' => '1.302059', + 'Test::Tester::CaptureRunner'=> '1.302059', + 'Test::Tester::Delegate'=> '1.302059', + 'Test::use::ok' => '1.302059', + 'Time::HiRes' => '1.9740_01', + 'VMS::Stdio' => '2.42', + 'XS::APItest' => '0.86', + 'attributes' => '0.28', + 'mro' => '1.19', + 'ok' => '1.302059', + 'overload' => '1.27', + 'parent' => '0.236', + }, + removed => { + } + }, + 5.025007 => { + delta_from => 5.025006, + changed => { + 'Archive::Tar' => '2.18', + 'Archive::Tar::Constant'=> '2.18', + 'Archive::Tar::File' => '2.18', + 'B' => '1.65', + 'B::Op_private' => '5.025007', + 'Config' => '5.025007', + 'Cwd' => '3.66', + 'Data::Dumper' => '2.165', + 'Devel::Peek' => '1.26', + 'DynaLoader' => '1.40', + 'Errno' => '1.27', + 'ExtUtils::ParseXS::Utilities'=> '3.34', + 'File::Spec' => '3.66', + 'File::Spec::AmigaOS' => '3.66', + 'File::Spec::Cygwin' => '3.66', + 'File::Spec::Epoc' => '3.66', + 'File::Spec::Functions' => '3.66', + 'File::Spec::Mac' => '3.66', + 'File::Spec::OS2' => '3.66', + 'File::Spec::Unix' => '3.66', + 'File::Spec::VMS' => '3.66', + 'File::Spec::Win32' => '3.66', + 'Hash::Util' => '0.22', + 'JSON::PP' => '2.27400_02', + 'List::Util' => '1.46_02', + 'List::Util::XS' => '1.46_02', + 'Math::BigFloat' => '1.999727', + 'Math::BigInt' => '1.999727', + 'Math::BigInt::Calc' => '1.999727', + 'Math::BigInt::CalcEmu' => '1.999727', + 'Math::Complex' => '1.5901', + 'Module::CoreList' => '5.20161120', + 'Module::CoreList::TieHashDelta'=> '5.20161120', + 'Module::CoreList::Utils'=> '5.20161120', + 'Net::Ping' => '2.55', + 'Opcode' => '1.39', + 'POSIX' => '1.75', + 'Pod::Man' => '4.09', + 'Pod::ParseLink' => '4.09', + 'Pod::Text' => '4.09', + 'Pod::Text::Color' => '4.09', + 'Pod::Text::Overstrike' => '4.09', + 'Pod::Text::Termcap' => '4.09', + 'Scalar::Util' => '1.46_02', + 'Storable' => '2.59', + 'Sub::Util' => '1.46_02', + 'Term::ANSIColor' => '4.06', + 'Test2' => '1.302062', + 'Test2::API' => '1.302062', + 'Test2::API::Breakage' => '1.302062', + 'Test2::API::Context' => '1.302062', + 'Test2::API::Instance' => '1.302062', + 'Test2::API::Stack' => '1.302062', + 'Test2::Event' => '1.302062', + 'Test2::Event::Bail' => '1.302062', + 'Test2::Event::Diag' => '1.302062', + 'Test2::Event::Exception'=> '1.302062', + 'Test2::Event::Generic' => '1.302062', + 'Test2::Event::Info' => '1.302062', + 'Test2::Event::Note' => '1.302062', + 'Test2::Event::Ok' => '1.302062', + 'Test2::Event::Plan' => '1.302062', + 'Test2::Event::Skip' => '1.302062', + 'Test2::Event::Subtest' => '1.302062', + 'Test2::Event::Waiting' => '1.302062', + 'Test2::Formatter' => '1.302062', + 'Test2::Formatter::TAP' => '1.302062', + 'Test2::Hub' => '1.302062', + 'Test2::Hub::Interceptor'=> '1.302062', + 'Test2::Hub::Interceptor::Terminator'=> '1.302062', + 'Test2::Hub::Subtest' => '1.302062', + 'Test2::IPC' => '1.302062', + 'Test2::IPC::Driver' => '1.302062', + 'Test2::IPC::Driver::Files'=> '1.302062', + 'Test2::Util' => '1.302062', + 'Test2::Util::ExternalMeta'=> '1.302062', + 'Test2::Util::HashBase' => '1.302062', + 'Test2::Util::Trace' => '1.302062', + 'Test::Builder' => '1.302062', + 'Test::Builder::Formatter'=> '1.302062', + 'Test::Builder::Module' => '1.302062', + 'Test::Builder::Tester' => '1.302062', + 'Test::Builder::Tester::Color'=> '1.302062', + 'Test::Builder::TodoDiag'=> '1.302062', + 'Test::More' => '1.302062', + 'Test::Simple' => '1.302062', + 'Test::Tester' => '1.302062', + 'Test::Tester::Capture' => '1.302062', + 'Test::Tester::CaptureRunner'=> '1.302062', + 'Test::Tester::Delegate'=> '1.302062', + 'Test::use::ok' => '1.302062', + 'Time::HiRes' => '1.9740_03', + 'Unicode::Collate' => '1.18', + 'Unicode::Collate::CJK::Big5'=> '1.18', + 'Unicode::Collate::CJK::GB2312'=> '1.18', + 'Unicode::Collate::CJK::JISX0208'=> '1.18', + 'Unicode::Collate::CJK::Korean'=> '1.18', + 'Unicode::Collate::CJK::Pinyin'=> '1.18', + 'Unicode::Collate::CJK::Stroke'=> '1.18', + 'Unicode::Collate::CJK::Zhuyin'=> '1.18', + 'Unicode::Collate::Locale'=> '1.18', + 'Unicode::UCD' => '0.67', + 'XS::APItest' => '0.87', + 'XS::Typemap' => '0.15', + 'mro' => '1.20', + 'ok' => '1.302062', + 'threads' => '2.10', + }, + removed => { + } + }, + 5.025008 => { + delta_from => 5.025007, + changed => { + 'Archive::Tar' => '2.24', + 'Archive::Tar::Constant'=> '2.24', + 'Archive::Tar::File' => '2.24', + 'B::Debug' => '1.24', + 'B::Op_private' => '5.025008', + 'Config' => '5.025008', + 'Data::Dumper' => '2.166', + 'Encode' => '2.88', + 'Encode::Alias' => '2.21', + 'Encode::CN::HZ' => '2.08', + 'Encode::MIME::Header' => '2.24', + 'Encode::MIME::Name' => '1.02', + 'Encode::Unicode' => '2.1501', + 'IO' => '1.38', + 'Locale::Codes' => '3.42', + 'Locale::Codes::Constants'=> '3.42', + 'Locale::Codes::Country'=> '3.42', + 'Locale::Codes::Country_Codes'=> '3.42', + 'Locale::Codes::Country_Retired'=> '3.42', + 'Locale::Codes::Currency'=> '3.42', + 'Locale::Codes::Currency_Codes'=> '3.42', + 'Locale::Codes::Currency_Retired'=> '3.42', + 'Locale::Codes::LangExt'=> '3.42', + 'Locale::Codes::LangExt_Codes'=> '3.42', + 'Locale::Codes::LangExt_Retired'=> '3.42', + 'Locale::Codes::LangFam'=> '3.42', + 'Locale::Codes::LangFam_Codes'=> '3.42', + 'Locale::Codes::LangFam_Retired'=> '3.42', + 'Locale::Codes::LangVar'=> '3.42', + 'Locale::Codes::LangVar_Codes'=> '3.42', + 'Locale::Codes::LangVar_Retired'=> '3.42', + 'Locale::Codes::Language'=> '3.42', + 'Locale::Codes::Language_Codes'=> '3.42', + 'Locale::Codes::Language_Retired'=> '3.42', + 'Locale::Codes::Script' => '3.42', + 'Locale::Codes::Script_Codes'=> '3.42', + 'Locale::Codes::Script_Retired'=> '3.42', + 'Locale::Country' => '3.42', + 'Locale::Currency' => '3.42', + 'Locale::Language' => '3.42', + 'Locale::Script' => '3.42', + 'Math::BigFloat' => '1.999806', + 'Math::BigFloat::Trace' => '0.47', + 'Math::BigInt' => '1.999806', + 'Math::BigInt::Calc' => '1.999806', + 'Math::BigInt::CalcEmu' => '1.999806', + 'Math::BigInt::FastCalc'=> '0.5005', + 'Math::BigInt::Lib' => '1.999806', + 'Math::BigInt::Trace' => '0.47', + 'Math::BigRat' => '0.2611', + 'Module::CoreList' => '5.20161220', + 'Module::CoreList::TieHashDelta'=> '5.20161220', + 'Module::CoreList::Utils'=> '5.20161220', + 'POSIX' => '1.76', + 'PerlIO::scalar' => '0.25', + 'Pod::Simple' => '3.35', + 'Pod::Simple::BlackBox' => '3.35', + 'Pod::Simple::Checker' => '3.35', + 'Pod::Simple::Debug' => '3.35', + 'Pod::Simple::DumpAsText'=> '3.35', + 'Pod::Simple::DumpAsXML'=> '3.35', + 'Pod::Simple::HTML' => '3.35', + 'Pod::Simple::HTMLBatch'=> '3.35', + 'Pod::Simple::LinkSection'=> '3.35', + 'Pod::Simple::Methody' => '3.35', + 'Pod::Simple::Progress' => '3.35', + 'Pod::Simple::PullParser'=> '3.35', + 'Pod::Simple::PullParserEndToken'=> '3.35', + 'Pod::Simple::PullParserStartToken'=> '3.35', + 'Pod::Simple::PullParserTextToken'=> '3.35', + 'Pod::Simple::PullParserToken'=> '3.35', + 'Pod::Simple::RTF' => '3.35', + 'Pod::Simple::Search' => '3.35', + 'Pod::Simple::SimpleTree'=> '3.35', + 'Pod::Simple::Text' => '3.35', + 'Pod::Simple::TextContent'=> '3.35', + 'Pod::Simple::TiedOutFH'=> '3.35', + 'Pod::Simple::Transcode'=> '3.35', + 'Pod::Simple::TranscodeDumb'=> '3.35', + 'Pod::Simple::TranscodeSmart'=> '3.35', + 'Pod::Simple::XHTML' => '3.35', + 'Pod::Simple::XMLOutStream'=> '3.35', + 'Test2' => '1.302073', + 'Test2::API' => '1.302073', + 'Test2::API::Breakage' => '1.302073', + 'Test2::API::Context' => '1.302073', + 'Test2::API::Instance' => '1.302073', + 'Test2::API::Stack' => '1.302073', + 'Test2::Event' => '1.302073', + 'Test2::Event::Bail' => '1.302073', + 'Test2::Event::Diag' => '1.302073', + 'Test2::Event::Encoding'=> '1.302073', + 'Test2::Event::Exception'=> '1.302073', + 'Test2::Event::Generic' => '1.302073', + 'Test2::Event::Info' => '1.302073', + 'Test2::Event::Note' => '1.302073', + 'Test2::Event::Ok' => '1.302073', + 'Test2::Event::Plan' => '1.302073', + 'Test2::Event::Skip' => '1.302073', + 'Test2::Event::Subtest' => '1.302073', + 'Test2::Event::TAP::Version'=> '1.302073', + 'Test2::Event::Waiting' => '1.302073', + 'Test2::Formatter' => '1.302073', + 'Test2::Formatter::TAP' => '1.302073', + 'Test2::Hub' => '1.302073', + 'Test2::Hub::Interceptor'=> '1.302073', + 'Test2::Hub::Interceptor::Terminator'=> '1.302073', + 'Test2::Hub::Subtest' => '1.302073', + 'Test2::IPC' => '1.302073', + 'Test2::IPC::Driver' => '1.302073', + 'Test2::IPC::Driver::Files'=> '1.302073', + 'Test2::Tools::Tiny' => '1.302073', + 'Test2::Util' => '1.302073', + 'Test2::Util::ExternalMeta'=> '1.302073', + 'Test2::Util::HashBase' => '0.002', + 'Test2::Util::Trace' => '1.302073', + 'Test::Builder' => '1.302073', + 'Test::Builder::Formatter'=> '1.302073', + 'Test::Builder::Module' => '1.302073', + 'Test::Builder::Tester' => '1.302073', + 'Test::Builder::Tester::Color'=> '1.302073', + 'Test::Builder::TodoDiag'=> '1.302073', + 'Test::More' => '1.302073', + 'Test::Simple' => '1.302073', + 'Test::Tester' => '1.302073', + 'Test::Tester::Capture' => '1.302073', + 'Test::Tester::CaptureRunner'=> '1.302073', + 'Test::Tester::Delegate'=> '1.302073', + 'Test::use::ok' => '1.302073', + 'Time::HiRes' => '1.9741', + 'Time::Local' => '1.25', + 'Unicode::Collate' => '1.19', + 'Unicode::Collate::CJK::Big5'=> '1.19', + 'Unicode::Collate::CJK::GB2312'=> '1.19', + 'Unicode::Collate::CJK::JISX0208'=> '1.19', + 'Unicode::Collate::CJK::Korean'=> '1.19', + 'Unicode::Collate::CJK::Pinyin'=> '1.19', + 'Unicode::Collate::CJK::Stroke'=> '1.19', + 'Unicode::Collate::CJK::Zhuyin'=> '1.19', + 'Unicode::Collate::Locale'=> '1.19', + 'bigint' => '0.47', + 'bignum' => '0.47', + 'bigrat' => '0.47', + 'encoding' => '2.19', + 'ok' => '1.302073', + }, + removed => { + } + }, + 5.022003 => { + delta_from => 5.022002, + changed => { + 'App::Cpan' => '1.63_01', + 'App::Prove' => '3.35_01', + 'App::Prove::State' => '3.35_01', + 'App::Prove::State::Result'=> '3.35_01', + 'App::Prove::State::Result::Test'=> '3.35_01', + 'Archive::Tar' => '2.04_01', + 'Archive::Tar::Constant'=> '2.04_01', + 'Archive::Tar::File' => '2.04_01', + 'B::Op_private' => '5.022003', + 'CPAN' => '2.11_01', + 'Compress::Zlib' => '2.068_001', + 'Config' => '5.022003', + 'Cwd' => '3.56_02', + 'Digest' => '1.17_01', + 'Digest::SHA' => '5.95_01', + 'Encode' => '2.72_01', + 'ExtUtils::Command' => '1.20_01', + 'ExtUtils::Command::MM' => '7.04_02', + 'ExtUtils::Liblist' => '7.04_02', + 'ExtUtils::Liblist::Kid'=> '7.04_02', + 'ExtUtils::MM' => '7.04_02', + 'ExtUtils::MM_AIX' => '7.04_02', + 'ExtUtils::MM_Any' => '7.04_02', + 'ExtUtils::MM_BeOS' => '7.04_02', + 'ExtUtils::MM_Cygwin' => '7.04_02', + 'ExtUtils::MM_DOS' => '7.04_02', + 'ExtUtils::MM_Darwin' => '7.04_02', + 'ExtUtils::MM_MacOS' => '7.04_02', + 'ExtUtils::MM_NW5' => '7.04_02', + 'ExtUtils::MM_OS2' => '7.04_02', + 'ExtUtils::MM_QNX' => '7.04_02', + 'ExtUtils::MM_UWIN' => '7.04_02', + 'ExtUtils::MM_Unix' => '7.04_02', + 'ExtUtils::MM_VMS' => '7.04_02', + 'ExtUtils::MM_VOS' => '7.04_02', + 'ExtUtils::MM_Win32' => '7.04_02', + 'ExtUtils::MM_Win95' => '7.04_02', + 'ExtUtils::MY' => '7.04_02', + 'ExtUtils::MakeMaker' => '7.04_02', + 'ExtUtils::MakeMaker::Config'=> '7.04_02', + 'ExtUtils::Mkbootstrap' => '7.04_02', + 'ExtUtils::Mksymlists' => '7.04_02', + 'ExtUtils::testlib' => '7.04_02', + 'File::Fetch' => '0.48_01', + 'File::Spec' => '3.56_02', + 'File::Spec::Cygwin' => '3.56_02', + 'File::Spec::Epoc' => '3.56_02', + 'File::Spec::Functions' => '3.56_02', + 'File::Spec::Mac' => '3.56_02', + 'File::Spec::OS2' => '3.56_02', + 'File::Spec::Unix' => '3.56_02', + 'File::Spec::VMS' => '3.56_02', + 'File::Spec::Win32' => '3.56_02', + 'HTTP::Tiny' => '0.054_01', + 'I18N::LangTags::Detect'=> '1.05_01', + 'IO' => '1.35_01', + 'IO::Compress::Adapter::Bzip2'=> '2.068_001', + 'IO::Compress::Adapter::Deflate'=> '2.068_001', + 'IO::Compress::Adapter::Identity'=> '2.068_001', + 'IO::Compress::Base' => '2.068_001', + 'IO::Compress::Base::Common'=> '2.068_001', + 'IO::Compress::Bzip2' => '2.068_001', + 'IO::Compress::Deflate' => '2.068_001', + 'IO::Compress::Gzip' => '2.068_001', + 'IO::Compress::Gzip::Constants'=> '2.068_001', + 'IO::Compress::RawDeflate'=> '2.068_001', + 'IO::Compress::Zip' => '2.068_001', + 'IO::Compress::Zip::Constants'=> '2.068_001', + 'IO::Compress::Zlib::Constants'=> '2.068_001', + 'IO::Compress::Zlib::Extra'=> '2.068_001', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.068_001', + 'IO::Uncompress::Adapter::Identity'=> '2.068_001', + 'IO::Uncompress::Adapter::Inflate'=> '2.068_001', + 'IO::Uncompress::AnyInflate'=> '2.068_001', + 'IO::Uncompress::AnyUncompress'=> '2.068_001', + 'IO::Uncompress::Base' => '2.068_001', + 'IO::Uncompress::Bunzip2'=> '2.068_001', + 'IO::Uncompress::Gunzip'=> '2.068_001', + 'IO::Uncompress::Inflate'=> '2.068_001', + 'IO::Uncompress::RawInflate'=> '2.068_001', + 'IO::Uncompress::Unzip' => '2.068_001', + 'IPC::Cmd' => '0.92_01', + 'JSON::PP' => '2.27300_01', + 'Locale::Maketext' => '1.26_01', + 'Locale::Maketext::Simple'=> '0.21_01', + 'Memoize' => '1.03_01', + 'Module::CoreList' => '5.20170114_22', + 'Module::CoreList::TieHashDelta'=> '5.20170114_22', + 'Module::CoreList::Utils'=> '5.20170114_22', + 'Module::Metadata::corpus::BOMTest::UTF16BE'=> undef, + 'Module::Metadata::corpus::BOMTest::UTF16LE'=> undef, + 'Module::Metadata::corpus::BOMTest::UTF8'=> '1', + 'Net::Cmd' => '3.05_01', + 'Net::Config' => '3.05_01', + 'Net::Domain' => '3.05_01', + 'Net::FTP' => '3.05_01', + 'Net::FTP::A' => '3.05_01', + 'Net::FTP::E' => '3.05_01', + 'Net::FTP::I' => '3.05_01', + 'Net::FTP::L' => '3.05_01', + 'Net::FTP::dataconn' => '3.05_01', + 'Net::NNTP' => '3.05_01', + 'Net::Netrc' => '3.05_01', + 'Net::POP3' => '3.05_01', + 'Net::Ping' => '2.43_01', + 'Net::SMTP' => '3.05_01', + 'Net::Time' => '3.05_01', + 'Parse::CPAN::Meta' => '1.4414_001', + 'Pod::Html' => '1.2201', + 'Pod::Perldoc' => '3.25_01', + 'Storable' => '2.53_02', + 'Sys::Syslog' => '0.33_01', + 'TAP::Base' => '3.35_01', + 'TAP::Formatter::Base' => '3.35_01', + 'TAP::Formatter::Color' => '3.35_01', + 'TAP::Formatter::Console'=> '3.35_01', + 'TAP::Formatter::Console::ParallelSession'=> '3.35_01', + 'TAP::Formatter::Console::Session'=> '3.35_01', + 'TAP::Formatter::File' => '3.35_01', + 'TAP::Formatter::File::Session'=> '3.35_01', + 'TAP::Formatter::Session'=> '3.35_01', + 'TAP::Harness' => '3.35_01', + 'TAP::Harness::Env' => '3.35_01', + 'TAP::Object' => '3.35_01', + 'TAP::Parser' => '3.35_01', + 'TAP::Parser::Aggregator'=> '3.35_01', + 'TAP::Parser::Grammar' => '3.35_01', + 'TAP::Parser::Iterator' => '3.35_01', + 'TAP::Parser::Iterator::Array'=> '3.35_01', + 'TAP::Parser::Iterator::Process'=> '3.35_01', + 'TAP::Parser::Iterator::Stream'=> '3.35_01', + 'TAP::Parser::IteratorFactory'=> '3.35_01', + 'TAP::Parser::Multiplexer'=> '3.35_01', + 'TAP::Parser::Result' => '3.35_01', + 'TAP::Parser::Result::Bailout'=> '3.35_01', + 'TAP::Parser::Result::Comment'=> '3.35_01', + 'TAP::Parser::Result::Plan'=> '3.35_01', + 'TAP::Parser::Result::Pragma'=> '3.35_01', + 'TAP::Parser::Result::Test'=> '3.35_01', + 'TAP::Parser::Result::Unknown'=> '3.35_01', + 'TAP::Parser::Result::Version'=> '3.35_01', + 'TAP::Parser::Result::YAML'=> '3.35_01', + 'TAP::Parser::ResultFactory'=> '3.35_01', + 'TAP::Parser::Scheduler'=> '3.35_01', + 'TAP::Parser::Scheduler::Job'=> '3.35_01', + 'TAP::Parser::Scheduler::Spinner'=> '3.35_01', + 'TAP::Parser::Source' => '3.35_01', + 'TAP::Parser::SourceHandler'=> '3.35_01', + 'TAP::Parser::SourceHandler::Executable'=> '3.35_01', + 'TAP::Parser::SourceHandler::File'=> '3.35_01', + 'TAP::Parser::SourceHandler::Handle'=> '3.35_01', + 'TAP::Parser::SourceHandler::Perl'=> '3.35_01', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.35_01', + 'TAP::Parser::YAMLish::Reader'=> '3.35_01', + 'TAP::Parser::YAMLish::Writer'=> '3.35_01', + 'Test' => '1.26_01', + 'Test::Harness' => '3.35_01', + 'XSLoader' => '0.20_01', + 'bigint' => '0.39_01', + 'bignum' => '0.39_01', + 'bigrat' => '0.39_01', + }, + removed => { + } + }, + 5.024001 => { + delta_from => 5.024000, + changed => { + 'App::Cpan' => '1.63_01', + 'App::Prove' => '3.36_01', + 'App::Prove::State' => '3.36_01', + 'App::Prove::State::Result'=> '3.36_01', + 'App::Prove::State::Result::Test'=> '3.36_01', + 'Archive::Tar' => '2.04_01', + 'Archive::Tar::Constant'=> '2.04_01', + 'Archive::Tar::File' => '2.04_01', + 'B::Op_private' => '5.024001', + 'CPAN' => '2.11_01', + 'Compress::Zlib' => '2.069_001', + 'Config' => '5.024001', + 'Cwd' => '3.63_01', + 'Digest' => '1.17_01', + 'Digest::SHA' => '5.95_01', + 'Encode' => '2.80_01', + 'ExtUtils::Command' => '7.10_02', + 'ExtUtils::Command::MM' => '7.10_02', + 'ExtUtils::Liblist' => '7.10_02', + 'ExtUtils::Liblist::Kid'=> '7.10_02', + 'ExtUtils::MM' => '7.10_02', + 'ExtUtils::MM_AIX' => '7.10_02', + 'ExtUtils::MM_Any' => '7.10_02', + 'ExtUtils::MM_BeOS' => '7.10_02', + 'ExtUtils::MM_Cygwin' => '7.10_02', + 'ExtUtils::MM_DOS' => '7.10_02', + 'ExtUtils::MM_Darwin' => '7.10_02', + 'ExtUtils::MM_MacOS' => '7.10_02', + 'ExtUtils::MM_NW5' => '7.10_02', + 'ExtUtils::MM_OS2' => '7.10_02', + 'ExtUtils::MM_QNX' => '7.10_02', + 'ExtUtils::MM_UWIN' => '7.10_02', + 'ExtUtils::MM_Unix' => '7.10_02', + 'ExtUtils::MM_VMS' => '7.10_02', + 'ExtUtils::MM_VOS' => '7.10_02', + 'ExtUtils::MM_Win32' => '7.10_02', + 'ExtUtils::MM_Win95' => '7.10_02', + 'ExtUtils::MY' => '7.10_02', + 'ExtUtils::MakeMaker' => '7.10_02', + 'ExtUtils::MakeMaker::Config'=> '7.10_02', + 'ExtUtils::Mkbootstrap' => '7.10_02', + 'ExtUtils::Mksymlists' => '7.10_02', + 'ExtUtils::testlib' => '7.10_02', + 'File::Fetch' => '0.48_01', + 'File::Spec' => '3.63_01', + 'File::Spec::Cygwin' => '3.63_01', + 'File::Spec::Epoc' => '3.63_01', + 'File::Spec::Functions' => '3.63_01', + 'File::Spec::Mac' => '3.63_01', + 'File::Spec::OS2' => '3.63_01', + 'File::Spec::Unix' => '3.63_01', + 'File::Spec::VMS' => '3.63_01', + 'File::Spec::Win32' => '3.63_01', + 'HTTP::Tiny' => '0.056_001', + 'I18N::LangTags::Detect'=> '1.05_01', + 'IO' => '1.36_01', + 'IO::Compress::Adapter::Bzip2'=> '2.069_001', + 'IO::Compress::Adapter::Deflate'=> '2.069_001', + 'IO::Compress::Adapter::Identity'=> '2.069_001', + 'IO::Compress::Base' => '2.069_001', + 'IO::Compress::Base::Common'=> '2.069_001', + 'IO::Compress::Bzip2' => '2.069_001', + 'IO::Compress::Deflate' => '2.069_001', + 'IO::Compress::Gzip' => '2.069_001', + 'IO::Compress::Gzip::Constants'=> '2.069_001', + 'IO::Compress::RawDeflate'=> '2.069_001', + 'IO::Compress::Zip' => '2.069_001', + 'IO::Compress::Zip::Constants'=> '2.069_001', + 'IO::Compress::Zlib::Constants'=> '2.069_001', + 'IO::Compress::Zlib::Extra'=> '2.069_001', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.069_001', + 'IO::Uncompress::Adapter::Identity'=> '2.069_001', + 'IO::Uncompress::Adapter::Inflate'=> '2.069_001', + 'IO::Uncompress::AnyInflate'=> '2.069_001', + 'IO::Uncompress::AnyUncompress'=> '2.069_001', + 'IO::Uncompress::Base' => '2.069_001', + 'IO::Uncompress::Bunzip2'=> '2.069_001', + 'IO::Uncompress::Gunzip'=> '2.069_001', + 'IO::Uncompress::Inflate'=> '2.069_001', + 'IO::Uncompress::RawInflate'=> '2.069_001', + 'IO::Uncompress::Unzip' => '2.069_001', + 'IPC::Cmd' => '0.92_01', + 'JSON::PP' => '2.27300_01', + 'Locale::Maketext' => '1.26_01', + 'Locale::Maketext::Simple'=> '0.21_01', + 'Math::BigFloat::Trace' => '0.42_01', + 'Math::BigInt::Trace' => '0.42_01', + 'Memoize' => '1.03_01', + 'Module::CoreList' => '5.20170114_24', + 'Module::CoreList::TieHashDelta'=> '5.20170114_24', + 'Module::CoreList::Utils'=> '5.20170114_24', + 'Module::Metadata::corpus::BOMTest::UTF16BE'=> undef, + 'Module::Metadata::corpus::BOMTest::UTF16LE'=> undef, + 'Module::Metadata::corpus::BOMTest::UTF8'=> '1', + 'Net::Cmd' => '3.08_01', + 'Net::Config' => '3.08_01', + 'Net::Domain' => '3.08_01', + 'Net::FTP' => '3.08_01', + 'Net::FTP::A' => '3.08_01', + 'Net::FTP::E' => '3.08_01', + 'Net::FTP::I' => '3.08_01', + 'Net::FTP::L' => '3.08_01', + 'Net::FTP::dataconn' => '3.08_01', + 'Net::NNTP' => '3.08_01', + 'Net::Netrc' => '3.08_01', + 'Net::POP3' => '3.08_01', + 'Net::Ping' => '2.43_01', + 'Net::SMTP' => '3.08_01', + 'Net::Time' => '3.08_01', + 'Parse::CPAN::Meta' => '1.4417_001', + 'Pod::Html' => '1.2201', + 'Pod::Perldoc' => '3.25_03', + 'Storable' => '2.56_01', + 'Sys::Syslog' => '0.33_01', + 'TAP::Base' => '3.36_01', + 'TAP::Formatter::Base' => '3.36_01', + 'TAP::Formatter::Color' => '3.36_01', + 'TAP::Formatter::Console'=> '3.36_01', + 'TAP::Formatter::Console::ParallelSession'=> '3.36_01', + 'TAP::Formatter::Console::Session'=> '3.36_01', + 'TAP::Formatter::File' => '3.36_01', + 'TAP::Formatter::File::Session'=> '3.36_01', + 'TAP::Formatter::Session'=> '3.36_01', + 'TAP::Harness' => '3.36_01', + 'TAP::Harness::Env' => '3.36_01', + 'TAP::Object' => '3.36_01', + 'TAP::Parser' => '3.36_01', + 'TAP::Parser::Aggregator'=> '3.36_01', + 'TAP::Parser::Grammar' => '3.36_01', + 'TAP::Parser::Iterator' => '3.36_01', + 'TAP::Parser::Iterator::Array'=> '3.36_01', + 'TAP::Parser::Iterator::Process'=> '3.36_01', + 'TAP::Parser::Iterator::Stream'=> '3.36_01', + 'TAP::Parser::IteratorFactory'=> '3.36_01', + 'TAP::Parser::Multiplexer'=> '3.36_01', + 'TAP::Parser::Result' => '3.36_01', + 'TAP::Parser::Result::Bailout'=> '3.36_01', + 'TAP::Parser::Result::Comment'=> '3.36_01', + 'TAP::Parser::Result::Plan'=> '3.36_01', + 'TAP::Parser::Result::Pragma'=> '3.36_01', + 'TAP::Parser::Result::Test'=> '3.36_01', + 'TAP::Parser::Result::Unknown'=> '3.36_01', + 'TAP::Parser::Result::Version'=> '3.36_01', + 'TAP::Parser::Result::YAML'=> '3.36_01', + 'TAP::Parser::ResultFactory'=> '3.36_01', + 'TAP::Parser::Scheduler'=> '3.36_01', + 'TAP::Parser::Scheduler::Job'=> '3.36_01', + 'TAP::Parser::Scheduler::Spinner'=> '3.36_01', + 'TAP::Parser::Source' => '3.36_01', + 'TAP::Parser::SourceHandler'=> '3.36_01', + 'TAP::Parser::SourceHandler::Executable'=> '3.36_01', + 'TAP::Parser::SourceHandler::File'=> '3.36_01', + 'TAP::Parser::SourceHandler::Handle'=> '3.36_01', + 'TAP::Parser::SourceHandler::Perl'=> '3.36_01', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.36_01', + 'TAP::Parser::YAMLish::Reader'=> '3.36_01', + 'TAP::Parser::YAMLish::Writer'=> '3.36_01', + 'Test' => '1.28_01', + 'Test::Harness' => '3.36_01', + 'XSLoader' => '0.22', + 'bigint' => '0.42_01', + 'bignum' => '0.42_01', + 'bigrat' => '0.42_01', + }, + removed => { + } + }, + 5.025009 => { + delta_from => 5.025008, + changed => { + 'App::Cpan' => '1.66', + 'B::Deparse' => '1.40', + 'B::Op_private' => '5.025009', + 'B::Terse' => '1.07', + 'B::Xref' => '1.06', + 'CPAN' => '2.16', + 'CPAN::Bundle' => '5.5002', + 'CPAN::Distribution' => '2.16', + 'CPAN::Exception::RecursiveDependency'=> '5.5001', + 'CPAN::FTP' => '5.5008', + 'CPAN::FirstTime' => '5.5310', + 'CPAN::HandleConfig' => '5.5008', + 'CPAN::Module' => '5.5003', + 'Compress::Raw::Bzip2' => '2.070', + 'Compress::Raw::Zlib' => '2.070', + 'Config' => '5.025009', + 'DB_File' => '1.840', + 'Data::Dumper' => '2.167', + 'Devel::SelfStubber' => '1.06', + 'DynaLoader' => '1.41', + 'Errno' => '1.28', + 'ExtUtils::Embed' => '1.34', + 'File::Glob' => '1.28', + 'I18N::LangTags' => '0.42', + 'Module::CoreList' => '5.20170120', + 'Module::CoreList::TieHashDelta'=> '5.20170120', + 'Module::CoreList::Utils'=> '5.20170120', + 'OS2::Process' => '1.12', + 'PerlIO::scalar' => '0.26', + 'Pod::Html' => '1.2202', + 'Storable' => '2.61', + 'Symbol' => '1.08', + 'Term::ReadLine' => '1.16', + 'Test' => '1.30', + 'Unicode::UCD' => '0.68', + 'VMS::DCLsym' => '1.08', + 'XS::APItest' => '0.88', + 'XSLoader' => '0.26', + 'attributes' => '0.29', + 'diagnostics' => '1.36', + 'feature' => '1.46', + 'lib' => '0.64', + 'overload' => '1.28', + 're' => '0.34', + 'threads' => '2.12', + 'threads::shared' => '1.54', + }, + removed => { + } + }, + 5.025010 => { + delta_from => 5.025009, + changed => { + 'B' => '1.68', + 'B::Op_private' => '5.025010', + 'CPAN' => '2.17', + 'CPAN::Distribution' => '2.17', + 'Config' => '5.02501', + 'Getopt::Std' => '1.12', + 'Module::CoreList' => '5.20170220', + 'Module::CoreList::TieHashDelta'=> '5.20170220', + 'Module::CoreList::Utils'=> '5.20170220', + 'PerlIO' => '1.10', + 'Storable' => '2.62', + 'Thread::Queue' => '3.12', + 'feature' => '1.47', + 'open' => '1.11', + 'threads' => '2.13', + }, + removed => { + } + }, + 5.025011 => { + delta_from => 5.025010, + changed => { + 'App::Prove' => '3.38', + 'App::Prove::State' => '3.38', + 'App::Prove::State::Result'=> '3.38', + 'App::Prove::State::Result::Test'=> '3.38', + 'B::Op_private' => '5.025011', + 'Compress::Raw::Bzip2' => '2.074', + 'Compress::Raw::Zlib' => '2.074', + 'Compress::Zlib' => '2.074', + 'Config' => '5.025011', + 'Config::Perl::V' => '0.28', + 'Cwd' => '3.67', + 'ExtUtils::ParseXS' => '3.34', + 'ExtUtils::ParseXS::Constants'=> '3.34', + 'ExtUtils::ParseXS::CountLines'=> '3.34', + 'ExtUtils::ParseXS::Eval'=> '3.34', + 'ExtUtils::Typemaps' => '3.34', + 'ExtUtils::Typemaps::Cmd'=> '3.34', + 'ExtUtils::Typemaps::InputMap'=> '3.34', + 'ExtUtils::Typemaps::OutputMap'=> '3.34', + 'ExtUtils::Typemaps::Type'=> '3.34', + 'File::Spec' => '3.67', + 'File::Spec::AmigaOS' => '3.67', + 'File::Spec::Cygwin' => '3.67', + 'File::Spec::Epoc' => '3.67', + 'File::Spec::Functions' => '3.67', + 'File::Spec::Mac' => '3.67', + 'File::Spec::OS2' => '3.67', + 'File::Spec::Unix' => '3.67', + 'File::Spec::VMS' => '3.67', + 'File::Spec::Win32' => '3.67', + 'IO::Compress::Adapter::Bzip2'=> '2.074', + 'IO::Compress::Adapter::Deflate'=> '2.074', + 'IO::Compress::Adapter::Identity'=> '2.074', + 'IO::Compress::Base' => '2.074', + 'IO::Compress::Base::Common'=> '2.074', + 'IO::Compress::Bzip2' => '2.074', + 'IO::Compress::Deflate' => '2.074', + 'IO::Compress::Gzip' => '2.074', + 'IO::Compress::Gzip::Constants'=> '2.074', + 'IO::Compress::RawDeflate'=> '2.074', + 'IO::Compress::Zip' => '2.074', + 'IO::Compress::Zip::Constants'=> '2.074', + 'IO::Compress::Zlib::Constants'=> '2.074', + 'IO::Compress::Zlib::Extra'=> '2.074', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.074', + 'IO::Uncompress::Adapter::Identity'=> '2.074', + 'IO::Uncompress::Adapter::Inflate'=> '2.074', + 'IO::Uncompress::AnyInflate'=> '2.074', + 'IO::Uncompress::AnyUncompress'=> '2.074', + 'IO::Uncompress::Base' => '2.074', + 'IO::Uncompress::Bunzip2'=> '2.074', + 'IO::Uncompress::Gunzip'=> '2.074', + 'IO::Uncompress::Inflate'=> '2.074', + 'IO::Uncompress::RawInflate'=> '2.074', + 'IO::Uncompress::Unzip' => '2.074', + 'Module::CoreList' => '5.20170320', + 'Module::CoreList::TieHashDelta'=> '5.20170230', + 'Module::CoreList::Utils'=> '5.20170320', + 'Pod::Perldoc' => '3.28', + 'Pod::Perldoc::BaseTo' => '3.28', + 'Pod::Perldoc::GetOptsOO'=> '3.28', + 'Pod::Perldoc::ToANSI' => '3.28', + 'Pod::Perldoc::ToChecker'=> '3.28', + 'Pod::Perldoc::ToMan' => '3.28', + 'Pod::Perldoc::ToNroff' => '3.28', + 'Pod::Perldoc::ToPod' => '3.28', + 'Pod::Perldoc::ToRtf' => '3.28', + 'Pod::Perldoc::ToTerm' => '3.28', + 'Pod::Perldoc::ToText' => '3.28', + 'Pod::Perldoc::ToTk' => '3.28', + 'Pod::Perldoc::ToXml' => '3.28', + 'TAP::Base' => '3.38', + 'TAP::Formatter::Base' => '3.38', + 'TAP::Formatter::Color' => '3.38', + 'TAP::Formatter::Console'=> '3.38', + 'TAP::Formatter::Console::ParallelSession'=> '3.38', + 'TAP::Formatter::Console::Session'=> '3.38', + 'TAP::Formatter::File' => '3.38', + 'TAP::Formatter::File::Session'=> '3.38', + 'TAP::Formatter::Session'=> '3.38', + 'TAP::Harness' => '3.38', + 'TAP::Harness::Env' => '3.38', + 'TAP::Object' => '3.38', + 'TAP::Parser' => '3.38', + 'TAP::Parser::Aggregator'=> '3.38', + 'TAP::Parser::Grammar' => '3.38', + 'TAP::Parser::Iterator' => '3.38', + 'TAP::Parser::Iterator::Array'=> '3.38', + 'TAP::Parser::Iterator::Process'=> '3.38', + 'TAP::Parser::Iterator::Stream'=> '3.38', + 'TAP::Parser::IteratorFactory'=> '3.38', + 'TAP::Parser::Multiplexer'=> '3.38', + 'TAP::Parser::Result' => '3.38', + 'TAP::Parser::Result::Bailout'=> '3.38', + 'TAP::Parser::Result::Comment'=> '3.38', + 'TAP::Parser::Result::Plan'=> '3.38', + 'TAP::Parser::Result::Pragma'=> '3.38', + 'TAP::Parser::Result::Test'=> '3.38', + 'TAP::Parser::Result::Unknown'=> '3.38', + 'TAP::Parser::Result::Version'=> '3.38', + 'TAP::Parser::Result::YAML'=> '3.38', + 'TAP::Parser::ResultFactory'=> '3.38', + 'TAP::Parser::Scheduler'=> '3.38', + 'TAP::Parser::Scheduler::Job'=> '3.38', + 'TAP::Parser::Scheduler::Spinner'=> '3.38', + 'TAP::Parser::Source' => '3.38', + 'TAP::Parser::SourceHandler'=> '3.38', + 'TAP::Parser::SourceHandler::Executable'=> '3.38', + 'TAP::Parser::SourceHandler::File'=> '3.38', + 'TAP::Parser::SourceHandler::Handle'=> '3.38', + 'TAP::Parser::SourceHandler::Perl'=> '3.38', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.38', + 'TAP::Parser::YAMLish::Reader'=> '3.38', + 'TAP::Parser::YAMLish::Writer'=> '3.38', + 'Test::Harness' => '3.38', + 'VMS::Stdio' => '2.41', + 'threads' => '2.15', + 'threads::shared' => '1.55', + }, + removed => { + } + }, + 5.025012 => { + delta_from => 5.025011, + changed => { + 'B::Op_private' => '5.025012', + 'CPAN' => '2.18', + 'CPAN::Bundle' => '5.5003', + 'CPAN::Distribution' => '2.18', + 'Config' => '5.025012', + 'DynaLoader' => '1.42', + 'Module::CoreList' => '5.20170420', + 'Module::CoreList::TieHashDelta'=> '5.20170420', + 'Module::CoreList::Utils'=> '5.20170420', + 'Safe' => '2.40', + 'XSLoader' => '0.27', + 'base' => '2.25', + 'threads::shared' => '1.56', + }, + removed => { + } + }, + 5.026000 => { + delta_from => 5.025012, + changed => { + 'B::Op_private' => '5.026000', + 'Config' => '5.026', + 'Module::CoreList' => '5.20170530', + 'Module::CoreList::TieHashDelta'=> '5.20170530', + 'Module::CoreList::Utils'=> '5.20170530', + }, + removed => { + } + }, + 5.027000 => { + delta_from => 5.026000, + changed => { + 'Attribute::Handlers' => '1.00', + 'B::Concise' => '1.000', + 'B::Deparse' => '1.41', + 'B::Op_private' => '5.027000', + 'Config' => '5.027', + 'Module::CoreList' => '5.20170531', + 'Module::CoreList::TieHashDelta'=> '5.20170531', + 'Module::CoreList::Utils'=> '5.20170531', + 'O' => '1.02', + 'attributes' => '0.3', + 'feature' => '1.48', + }, + removed => { + } + }, + 5.027001 => { + delta_from => 5.027, + changed => { + 'App::Prove' => '3.39', + 'App::Prove::State' => '3.39', + 'App::Prove::State::Result'=> '3.39', + 'App::Prove::State::Result::Test'=> '3.39', + 'Archive::Tar' => '2.26', + 'Archive::Tar::Constant'=> '2.26', + 'Archive::Tar::File' => '2.26', + 'B::Op_private' => '5.027001', + 'B::Terse' => '1.08', + 'Config' => '5.027001', + 'Devel::PPPort' => '3.36', + 'DirHandle' => '1.05', + 'ExtUtils::Command' => '7.30', + 'ExtUtils::Command::MM' => '7.30', + 'ExtUtils::Install' => '2.14', + 'ExtUtils::Installed' => '2.14', + 'ExtUtils::Liblist' => '7.30', + 'ExtUtils::Liblist::Kid'=> '7.30', + 'ExtUtils::MM' => '7.30', + 'ExtUtils::MM_AIX' => '7.30', + 'ExtUtils::MM_Any' => '7.30', + 'ExtUtils::MM_BeOS' => '7.30', + 'ExtUtils::MM_Cygwin' => '7.30', + 'ExtUtils::MM_DOS' => '7.30', + 'ExtUtils::MM_Darwin' => '7.30', + 'ExtUtils::MM_MacOS' => '7.30', + 'ExtUtils::MM_NW5' => '7.30', + 'ExtUtils::MM_OS2' => '7.30', + 'ExtUtils::MM_QNX' => '7.30', + 'ExtUtils::MM_UWIN' => '7.30', + 'ExtUtils::MM_Unix' => '7.30', + 'ExtUtils::MM_VMS' => '7.30', + 'ExtUtils::MM_VOS' => '7.30', + 'ExtUtils::MM_Win32' => '7.30', + 'ExtUtils::MM_Win95' => '7.30', + 'ExtUtils::MY' => '7.30', + 'ExtUtils::MakeMaker' => '7.30', + 'ExtUtils::MakeMaker::Config'=> '7.30', + 'ExtUtils::MakeMaker::Locale'=> '7.30', + 'ExtUtils::MakeMaker::version'=> '7.30', + 'ExtUtils::MakeMaker::version::regex'=> '7.30', + 'ExtUtils::Mkbootstrap' => '7.30', + 'ExtUtils::Mksymlists' => '7.30', + 'ExtUtils::Packlist' => '2.14', + 'ExtUtils::testlib' => '7.30', + 'File::Path' => '2.14', + 'Filter::Util::Call' => '1.57', + 'GDBM_File' => '1.16', + 'Getopt::Long' => '2.5', + 'IO::Socket::IP' => '0.39', + 'IPC::Cmd' => '0.98', + 'JSON::PP' => '2.94', + 'JSON::PP::Boolean' => '2.94', + 'Locale::Codes' => '3.52', + 'Locale::Codes::Constants'=> '3.52', + 'Locale::Codes::Country'=> '3.52', + 'Locale::Codes::Country_Codes'=> '3.52', + 'Locale::Codes::Country_Retired'=> '3.52', + 'Locale::Codes::Currency'=> '3.52', + 'Locale::Codes::Currency_Codes'=> '3.52', + 'Locale::Codes::Currency_Retired'=> '3.52', + 'Locale::Codes::LangExt'=> '3.52', + 'Locale::Codes::LangExt_Codes'=> '3.52', + 'Locale::Codes::LangExt_Retired'=> '3.52', + 'Locale::Codes::LangFam'=> '3.52', + 'Locale::Codes::LangFam_Codes'=> '3.52', + 'Locale::Codes::LangFam_Retired'=> '3.52', + 'Locale::Codes::LangVar'=> '3.52', + 'Locale::Codes::LangVar_Codes'=> '3.52', + 'Locale::Codes::LangVar_Retired'=> '3.52', + 'Locale::Codes::Language'=> '3.52', + 'Locale::Codes::Language_Codes'=> '3.52', + 'Locale::Codes::Language_Retired'=> '3.52', + 'Locale::Codes::Script' => '3.52', + 'Locale::Codes::Script_Codes'=> '3.52', + 'Locale::Codes::Script_Retired'=> '3.52', + 'Locale::Country' => '3.52', + 'Locale::Currency' => '3.52', + 'Locale::Language' => '3.52', + 'Locale::Script' => '3.52', + 'Module::CoreList' => '5.20170621', + 'Module::CoreList::TieHashDelta'=> '5.20170621', + 'Module::CoreList::Utils'=> '5.20170621', + 'PerlIO::scalar' => '0.27', + 'PerlIO::via' => '0.17', + 'Storable' => '2.63', + 'TAP::Base' => '3.39', + 'TAP::Formatter::Base' => '3.39', + 'TAP::Formatter::Color' => '3.39', + 'TAP::Formatter::Console'=> '3.39', + 'TAP::Formatter::Console::ParallelSession'=> '3.39', + 'TAP::Formatter::Console::Session'=> '3.39', + 'TAP::Formatter::File' => '3.39', + 'TAP::Formatter::File::Session'=> '3.39', + 'TAP::Formatter::Session'=> '3.39', + 'TAP::Harness' => '3.39', + 'TAP::Harness::Env' => '3.39', + 'TAP::Object' => '3.39', + 'TAP::Parser' => '3.39', + 'TAP::Parser::Aggregator'=> '3.39', + 'TAP::Parser::Grammar' => '3.39', + 'TAP::Parser::Iterator' => '3.39', + 'TAP::Parser::Iterator::Array'=> '3.39', + 'TAP::Parser::Iterator::Process'=> '3.39', + 'TAP::Parser::Iterator::Stream'=> '3.39', + 'TAP::Parser::IteratorFactory'=> '3.39', + 'TAP::Parser::Multiplexer'=> '3.39', + 'TAP::Parser::Result' => '3.39', + 'TAP::Parser::Result::Bailout'=> '3.39', + 'TAP::Parser::Result::Comment'=> '3.39', + 'TAP::Parser::Result::Plan'=> '3.39', + 'TAP::Parser::Result::Pragma'=> '3.39', + 'TAP::Parser::Result::Test'=> '3.39', + 'TAP::Parser::Result::Unknown'=> '3.39', + 'TAP::Parser::Result::Version'=> '3.39', + 'TAP::Parser::Result::YAML'=> '3.39', + 'TAP::Parser::ResultFactory'=> '3.39', + 'TAP::Parser::Scheduler'=> '3.39', + 'TAP::Parser::Scheduler::Job'=> '3.39', + 'TAP::Parser::Scheduler::Spinner'=> '3.39', + 'TAP::Parser::Source' => '3.39', + 'TAP::Parser::SourceHandler'=> '3.39', + 'TAP::Parser::SourceHandler::Executable'=> '3.39', + 'TAP::Parser::SourceHandler::File'=> '3.39', + 'TAP::Parser::SourceHandler::Handle'=> '3.39', + 'TAP::Parser::SourceHandler::Perl'=> '3.39', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.39', + 'TAP::Parser::YAMLish::Reader'=> '3.39', + 'TAP::Parser::YAMLish::Writer'=> '3.39', + 'Test::Harness' => '3.39', + 'XS::APItest' => '0.89', + '_charnames' => '1.45', + 'charnames' => '1.45', + 'if' => '0.0607', + 'mro' => '1.21', + 'threads' => '2.16', + 'threads::shared' => '1.57', + 'version' => '0.9918', + 'version::regex' => '0.9918', + }, + removed => { + } + }, + 5.022004 => { + delta_from => 5.022003, + changed => { + 'B::Op_private' => '5.022004', + 'Config' => '5.022004', + 'Module::CoreList' => '5.20170715_22', + 'Module::CoreList::TieHashDelta'=> '5.20170715_22', + 'Module::CoreList::Utils'=> '5.20170715_22', + 'base' => '2.22_01', + }, + removed => { + } + }, + 5.024002 => { + delta_from => 5.024001, + changed => { + 'B::Op_private' => '5.024002', + 'Config' => '5.024002', + 'Module::CoreList' => '5.20170715_24', + 'Module::CoreList::TieHashDelta'=> '5.20170715_24', + 'Module::CoreList::Utils'=> '5.20170715_24', + 'base' => '2.23_01', + }, + removed => { + } + }, + 5.027002 => { + delta_from => 5.027001, + changed => { + 'B::Op_private' => '5.027002', + 'Carp' => '1.43', + 'Carp::Heavy' => '1.43', + 'Config' => '5.027002', + 'Cwd' => '3.68', + 'Encode' => '2.92', + 'Encode::Alias' => '2.23', + 'Encode::CN::HZ' => '2.09', + 'Encode::Encoding' => '2.08', + 'Encode::GSM0338' => '2.07', + 'Encode::Guess' => '2.07', + 'Encode::JP::JIS7' => '2.07', + 'Encode::KR::2022_KR' => '2.04', + 'Encode::MIME::Header' => '2.27', + 'Encode::MIME::Header::ISO_2022_JP'=> '1.09', + 'Encode::Unicode' => '2.16', + 'Encode::Unicode::UTF7' => '2.10', + 'ExtUtils::CBuilder' => '0.280228', + 'ExtUtils::CBuilder::Base'=> '0.280228', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280228', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280228', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280228', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280228', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280228', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280228', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280228', + 'ExtUtils::CBuilder::Platform::android'=> '0.280228', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280228', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280228', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280228', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280228', + 'File::Glob' => '1.29', + 'File::Spec' => '3.68', + 'File::Spec::AmigaOS' => '3.68', + 'File::Spec::Cygwin' => '3.68', + 'File::Spec::Epoc' => '3.68', + 'File::Spec::Functions' => '3.68', + 'File::Spec::Mac' => '3.68', + 'File::Spec::OS2' => '3.68', + 'File::Spec::Unix' => '3.68', + 'File::Spec::VMS' => '3.68', + 'File::Spec::Win32' => '3.68', + 'List::Util' => '1.48', + 'List::Util::XS' => '1.48', + 'Math::BigRat' => '0.2613', + 'Module::CoreList' => '5.20170720', + 'Module::CoreList::TieHashDelta'=> '5.20170720', + 'Module::CoreList::Utils'=> '5.20170720', + 'Opcode' => '1.40', + 'POSIX' => '1.77', + 'PerlIO::scalar' => '0.29', + 'Scalar::Util' => '1.48', + 'Sub::Util' => '1.48', + 'Time::HiRes' => '1.9743', + 'Time::Piece' => '1.3201', + 'Time::Seconds' => '1.3201', + 'Unicode' => '10.0.0', + 'XS::APItest' => '0.90', + 'arybase' => '0.13', + 'encoding' => '2.20', + 'feature' => '1.49', + 're' => '0.35', + }, + removed => { + } + }, + 5.027003 => { + delta_from => 5.027002, + changed => { + 'B' => '1.69', + 'B::Concise' => '1.001', + 'B::Debug' => '1.25', + 'B::Deparse' => '1.42', + 'B::Op_private' => '5.027003', + 'Config' => '5.027003', + 'Data::Dumper' => '2.167_02', + 'Devel::Peek' => '1.27', + 'ExtUtils::Constant' => '0.24', + 'ExtUtils::Constant::Base'=> '0.06', + 'ExtUtils::Constant::ProxySubs'=> '0.09', + 'ExtUtils::Constant::Utils'=> '0.04', + 'ExtUtils::ParseXS' => '3.35', + 'ExtUtils::ParseXS::Constants'=> '3.35', + 'ExtUtils::ParseXS::CountLines'=> '3.35', + 'ExtUtils::ParseXS::Eval'=> '3.35', + 'ExtUtils::ParseXS::Utilities'=> '3.35', + 'ExtUtils::Typemaps' => '3.35', + 'ExtUtils::Typemaps::Cmd'=> '3.35', + 'ExtUtils::Typemaps::InputMap'=> '3.35', + 'ExtUtils::Typemaps::OutputMap'=> '3.35', + 'ExtUtils::Typemaps::Type'=> '3.35', + 'Filter::Simple' => '0.94', + 'Module::CoreList' => '5.20170821', + 'Module::CoreList::TieHashDelta'=> '5.20170821', + 'Module::CoreList::Utils'=> '5.20170821', + 'SelfLoader' => '1.24', + 'Storable' => '2.64', + 'XS::APItest' => '0.91', + 'base' => '2.26', + 'threads' => '2.17', + 'utf8' => '1.20', + }, + removed => { + } + }, + 5.027004 => { + delta_from => 5.027003, + changed => { + 'B::Op_private' => '5.027004', + 'Config' => '5.027004', + 'File::Glob' => '1.30', + 'I18N::Langinfo' => '0.14', + 'Module::CoreList' => '5.20170920', + 'Module::CoreList::TieHashDelta'=> '5.20170920', + 'Module::CoreList::Utils'=> '5.20170920', + 'Term::ReadLine' => '1.17', + 'VMS::Stdio' => '2.42', + 'XS::APItest' => '0.92', + 'attributes' => '0.31', + 'sort' => '2.03', + 'threads' => '2.18', + }, + removed => { + } + }, + 5.024003 => { + delta_from => 5.024002, + changed => { + 'B::Op_private' => '5.024003', + 'Config' => '5.024003', + 'Module::CoreList' => '5.20170922_24', + 'Module::CoreList::TieHashDelta'=> '5.20170922_24', + 'Module::CoreList::Utils'=> '5.20170922_24', + 'POSIX' => '1.65_01', + 'Time::HiRes' => '1.9741', + }, + removed => { + } + }, + 5.026001 => { + delta_from => 5.026000, + changed => { + 'B::Op_private' => '5.026001', + 'Config' => '5.026001', + 'Module::CoreList' => '5.20170922_26', + 'Module::CoreList::TieHashDelta'=> '5.20170922_26', + 'Module::CoreList::Utils'=> '5.20170922_26', + '_charnames' => '1.45', + 'base' => '2.26', + 'charnames' => '1.45', + }, + removed => { + } + }, + 5.027005 => { + delta_from => 5.027004, + changed => { + 'B' => '1.70', + 'B::Concise' => '1.002', + 'B::Deparse' => '1.43', + 'B::Op_private' => '5.027005', + 'B::Xref' => '1.07', + 'Config' => '5.027005', + 'Config::Perl::V' => '0.29', + 'Digest::SHA' => '5.98', + 'Encode' => '2.93', + 'Encode::CN::HZ' => '2.10', + 'Encode::JP::JIS7' => '2.08', + 'Encode::MIME::Header' => '2.28', + 'Encode::MIME::Name' => '1.03', + 'File::Fetch' => '0.54', + 'File::Path' => '2.15', + 'List::Util' => '1.49', + 'List::Util::XS' => '1.49', + 'Locale::Codes' => '3.54', + 'Locale::Codes::Constants'=> '3.54', + 'Locale::Codes::Country'=> '3.54', + 'Locale::Codes::Country_Codes'=> '3.54', + 'Locale::Codes::Country_Retired'=> '3.54', + 'Locale::Codes::Currency'=> '3.54', + 'Locale::Codes::Currency_Codes'=> '3.54', + 'Locale::Codes::Currency_Retired'=> '3.54', + 'Locale::Codes::LangExt'=> '3.54', + 'Locale::Codes::LangExt_Codes'=> '3.54', + 'Locale::Codes::LangExt_Retired'=> '3.54', + 'Locale::Codes::LangFam'=> '3.54', + 'Locale::Codes::LangFam_Codes'=> '3.54', + 'Locale::Codes::LangFam_Retired'=> '3.54', + 'Locale::Codes::LangVar'=> '3.54', + 'Locale::Codes::LangVar_Codes'=> '3.54', + 'Locale::Codes::LangVar_Retired'=> '3.54', + 'Locale::Codes::Language'=> '3.54', + 'Locale::Codes::Language_Codes'=> '3.54', + 'Locale::Codes::Language_Retired'=> '3.54', + 'Locale::Codes::Script' => '3.54', + 'Locale::Codes::Script_Codes'=> '3.54', + 'Locale::Codes::Script_Retired'=> '3.54', + 'Locale::Country' => '3.54', + 'Locale::Currency' => '3.54', + 'Locale::Language' => '3.54', + 'Locale::Script' => '3.54', + 'Math::BigFloat' => '1.999811', + 'Math::BigInt' => '1.999811', + 'Math::BigInt::Calc' => '1.999811', + 'Math::BigInt::CalcEmu' => '1.999811', + 'Math::BigInt::FastCalc'=> '0.5006', + 'Math::BigInt::Lib' => '1.999811', + 'Module::CoreList' => '5.20171020', + 'Module::CoreList::TieHashDelta'=> '5.20171020', + 'Module::CoreList::Utils'=> '5.20171020', + 'NEXT' => '0.67_01', + 'POSIX' => '1.78', + 'Pod::Perldoc' => '3.2801', + 'Scalar::Util' => '1.49', + 'Sub::Util' => '1.49', + 'Sys::Hostname' => '1.21', + 'Test2' => '1.302103', + 'Test2::API' => '1.302103', + 'Test2::API::Breakage' => '1.302103', + 'Test2::API::Context' => '1.302103', + 'Test2::API::Instance' => '1.302103', + 'Test2::API::Stack' => '1.302103', + 'Test2::Event' => '1.302103', + 'Test2::Event::Bail' => '1.302103', + 'Test2::Event::Diag' => '1.302103', + 'Test2::Event::Encoding'=> '1.302103', + 'Test2::Event::Exception'=> '1.302103', + 'Test2::Event::Fail' => '1.302103', + 'Test2::Event::Generic' => '1.302103', + 'Test2::Event::Note' => '1.302103', + 'Test2::Event::Ok' => '1.302103', + 'Test2::Event::Pass' => '1.302103', + 'Test2::Event::Plan' => '1.302103', + 'Test2::Event::Skip' => '1.302103', + 'Test2::Event::Subtest' => '1.302103', + 'Test2::Event::TAP::Version'=> '1.302103', + 'Test2::Event::Waiting' => '1.302103', + 'Test2::EventFacet' => '1.302103', + 'Test2::EventFacet::About'=> '1.302103', + 'Test2::EventFacet::Amnesty'=> '1.302103', + 'Test2::EventFacet::Assert'=> '1.302103', + 'Test2::EventFacet::Control'=> '1.302103', + 'Test2::EventFacet::Error'=> '1.302103', + 'Test2::EventFacet::Info'=> '1.302103', + 'Test2::EventFacet::Meta'=> '1.302103', + 'Test2::EventFacet::Parent'=> '1.302103', + 'Test2::EventFacet::Plan'=> '1.302103', + 'Test2::EventFacet::Trace'=> '1.302103', + 'Test2::Formatter' => '1.302103', + 'Test2::Formatter::TAP' => '1.302103', + 'Test2::Hub' => '1.302103', + 'Test2::Hub::Interceptor'=> '1.302103', + 'Test2::Hub::Interceptor::Terminator'=> '1.302103', + 'Test2::Hub::Subtest' => '1.302103', + 'Test2::IPC' => '1.302103', + 'Test2::IPC::Driver' => '1.302103', + 'Test2::IPC::Driver::Files'=> '1.302103', + 'Test2::Tools::Tiny' => '1.302103', + 'Test2::Util' => '1.302103', + 'Test2::Util::ExternalMeta'=> '1.302103', + 'Test2::Util::Facets2Legacy'=> '1.302103', + 'Test2::Util::HashBase' => '0.005', + 'Test2::Util::Trace' => '1.302103', + 'Test::Builder' => '1.302103', + 'Test::Builder::Formatter'=> '1.302103', + 'Test::Builder::IO::Scalar'=> '2.114', + 'Test::Builder::Module' => '1.302103', + 'Test::Builder::Tester' => '1.302103', + 'Test::Builder::Tester::Color'=> '1.302103', + 'Test::Builder::TodoDiag'=> '1.302103', + 'Test::More' => '1.302103', + 'Test::Simple' => '1.302103', + 'Test::Tester' => '1.302103', + 'Test::Tester::Capture' => '1.302103', + 'Test::Tester::CaptureRunner'=> '1.302103', + 'Test::Tester::Delegate'=> '1.302103', + 'Test::use::ok' => '1.302103', + 'Time::HiRes' => '1.9746', + 'Time::Piece' => '1.3202', + 'Time::Seconds' => '1.3202', + 'arybase' => '0.14', + 'encoding' => '2.21', + 'ok' => '1.302103', + }, + removed => { + 'Test2::Event::Info' => 1, + } + }, + 5.027006 => { + delta_from => 5.027005, + changed => { + 'Attribute::Handlers' => '1.01', + 'B' => '1.72', + 'B::Concise' => '1.003', + 'B::Deparse' => '1.45', + 'B::Op_private' => '5.027006', + 'Carp' => '1.44', + 'Carp::Heavy' => '1.44', + 'Compress::Raw::Zlib' => '2.075', + 'Config' => '5.027006', + 'Config::Extensions' => '0.02', + 'Cwd' => '3.70', + 'DynaLoader' => '1.44', + 'ExtUtils::CBuilder' => '0.280229', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280229', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280229', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280229', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280229', + 'ExtUtils::CBuilder::Platform::android'=> '0.280229', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280229', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280229', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280229', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280229', + 'ExtUtils::Embed' => '1.35', + 'ExtUtils::Miniperl' => '1.07', + 'ExtUtils::ParseXS' => '3.36', + 'ExtUtils::ParseXS::Constants'=> '3.36', + 'ExtUtils::ParseXS::CountLines'=> '3.36', + 'ExtUtils::ParseXS::Eval'=> '3.36', + 'ExtUtils::ParseXS::Utilities'=> '3.36', + 'ExtUtils::Typemaps' => '3.36', + 'ExtUtils::Typemaps::Cmd'=> '3.36', + 'ExtUtils::Typemaps::InputMap'=> '3.36', + 'ExtUtils::Typemaps::OutputMap'=> '3.36', + 'ExtUtils::Typemaps::Type'=> '3.36', + 'ExtUtils::XSSymSet' => '1.4', + 'File::Copy' => '2.33', + 'File::Spec' => '3.69', + 'File::Spec::AmigaOS' => '3.69', + 'File::Spec::Cygwin' => '3.69', + 'File::Spec::Epoc' => '3.69', + 'File::Spec::Functions' => '3.69', + 'File::Spec::Mac' => '3.69', + 'File::Spec::OS2' => '3.69', + 'File::Spec::Unix' => '3.69', + 'File::Spec::VMS' => '3.69', + 'File::Spec::Win32' => '3.69', + 'File::stat' => '1.08', + 'FileCache' => '1.10', + 'Filter::Simple' => '0.95', + 'Hash::Util::FieldHash' => '1.20', + 'I18N::LangTags' => '0.43', + 'I18N::LangTags::Detect'=> '1.07', + 'I18N::LangTags::List' => '0.40', + 'I18N::Langinfo' => '0.15', + 'IO::Handle' => '1.37', + 'IO::Select' => '1.23', + 'Locale::Maketext' => '1.29', + 'Module::CoreList' => '5.20171120', + 'Module::CoreList::TieHashDelta'=> '5.20171120', + 'Module::CoreList::Utils'=> '5.20171120', + 'Net::Cmd' => '3.11', + 'Net::Config' => '3.11', + 'Net::Domain' => '3.11', + 'Net::FTP' => '3.11', + 'Net::FTP::A' => '3.11', + 'Net::FTP::E' => '3.11', + 'Net::FTP::I' => '3.11', + 'Net::FTP::L' => '3.11', + 'Net::FTP::dataconn' => '3.11', + 'Net::NNTP' => '3.11', + 'Net::Netrc' => '3.11', + 'Net::POP3' => '3.11', + 'Net::Ping' => '2.62', + 'Net::SMTP' => '3.11', + 'Net::Time' => '3.11', + 'Net::hostent' => '1.02', + 'Net::netent' => '1.01', + 'Net::protoent' => '1.01', + 'Net::servent' => '1.02', + 'O' => '1.03', + 'ODBM_File' => '1.15', + 'Opcode' => '1.41', + 'POSIX' => '1.80', + 'Pod::Html' => '1.2203', + 'SelfLoader' => '1.25', + 'Socket' => '2.020_04', + 'Storable' => '2.65', + 'Test' => '1.31', + 'Test2' => '1.302111', + 'Test2::API' => '1.302111', + 'Test2::API::Breakage' => '1.302111', + 'Test2::API::Context' => '1.302111', + 'Test2::API::Instance' => '1.302111', + 'Test2::API::Stack' => '1.302111', + 'Test2::Event' => '1.302111', + 'Test2::Event::Bail' => '1.302111', + 'Test2::Event::Diag' => '1.302111', + 'Test2::Event::Encoding'=> '1.302111', + 'Test2::Event::Exception'=> '1.302111', + 'Test2::Event::Fail' => '1.302111', + 'Test2::Event::Generic' => '1.302111', + 'Test2::Event::Note' => '1.302111', + 'Test2::Event::Ok' => '1.302111', + 'Test2::Event::Pass' => '1.302111', + 'Test2::Event::Plan' => '1.302111', + 'Test2::Event::Skip' => '1.302111', + 'Test2::Event::Subtest' => '1.302111', + 'Test2::Event::TAP::Version'=> '1.302111', + 'Test2::Event::Waiting' => '1.302111', + 'Test2::EventFacet' => '1.302111', + 'Test2::EventFacet::About'=> '1.302111', + 'Test2::EventFacet::Amnesty'=> '1.302111', + 'Test2::EventFacet::Assert'=> '1.302111', + 'Test2::EventFacet::Control'=> '1.302111', + 'Test2::EventFacet::Error'=> '1.302111', + 'Test2::EventFacet::Info'=> '1.302111', + 'Test2::EventFacet::Meta'=> '1.302111', + 'Test2::EventFacet::Parent'=> '1.302111', + 'Test2::EventFacet::Plan'=> '1.302111', + 'Test2::EventFacet::Trace'=> '1.302111', + 'Test2::Formatter' => '1.302111', + 'Test2::Formatter::TAP' => '1.302111', + 'Test2::Hub' => '1.302111', + 'Test2::Hub::Interceptor'=> '1.302111', + 'Test2::Hub::Interceptor::Terminator'=> '1.302111', + 'Test2::Hub::Subtest' => '1.302111', + 'Test2::IPC' => '1.302111', + 'Test2::IPC::Driver' => '1.302111', + 'Test2::IPC::Driver::Files'=> '1.302111', + 'Test2::Tools::Tiny' => '1.302111', + 'Test2::Util' => '1.302111', + 'Test2::Util::ExternalMeta'=> '1.302111', + 'Test2::Util::Facets2Legacy'=> '1.302111', + 'Test2::Util::HashBase' => '1.302111', + 'Test2::Util::Trace' => '1.302111', + 'Test::Builder' => '1.302111', + 'Test::Builder::Formatter'=> '1.302111', + 'Test::Builder::Module' => '1.302111', + 'Test::Builder::Tester' => '1.302111', + 'Test::Builder::Tester::Color'=> '1.302111', + 'Test::Builder::TodoDiag'=> '1.302111', + 'Test::More' => '1.302111', + 'Test::Simple' => '1.302111', + 'Test::Tester' => '1.302111', + 'Test::Tester::Capture' => '1.302111', + 'Test::Tester::CaptureRunner'=> '1.302111', + 'Test::Tester::Delegate'=> '1.302111', + 'Test::use::ok' => '1.302111', + 'Tie::Array' => '1.07', + 'Tie::StdHandle' => '4.5', + 'Time::HiRes' => '1.9747', + 'Time::gmtime' => '1.04', + 'Time::localtime' => '1.03', + 'Unicode::Collate' => '1.23', + 'Unicode::Collate::CJK::Big5'=> '1.23', + 'Unicode::Collate::CJK::GB2312'=> '1.23', + 'Unicode::Collate::CJK::JISX0208'=> '1.23', + 'Unicode::Collate::CJK::Korean'=> '1.23', + 'Unicode::Collate::CJK::Pinyin'=> '1.23', + 'Unicode::Collate::CJK::Stroke'=> '1.23', + 'Unicode::Collate::CJK::Zhuyin'=> '1.23', + 'Unicode::Collate::Locale'=> '1.23', + 'Unicode::Normalize' => '1.26', + 'User::grent' => '1.02', + 'User::pwent' => '1.01', + 'VMS::DCLsym' => '1.09', + 'VMS::Stdio' => '2.44', + 'XS::APItest' => '0.93', + 'XS::Typemap' => '0.16', + 'XSLoader' => '0.28', + 'attributes' => '0.32', + 'base' => '2.27', + 'blib' => '1.07', + 'experimental' => '0.017', + 'fields' => '2.24', + 'ok' => '1.302111', + 're' => '0.36', + 'sort' => '2.04', + 'threads' => '2.19', + 'warnings' => '1.38', + }, + removed => { + } + }, + 5.027007 => { + delta_from => 5.027006, + changed => { + 'App::Cpan' => '1.67', + 'B' => '1.73', + 'B::Debug' => '1.26', + 'B::Deparse' => '1.46', + 'B::Op_private' => '5.027007', + 'CPAN' => '2.20', + 'CPAN::Distribution' => '2.19', + 'CPAN::FTP' => '5.5011', + 'CPAN::FirstTime' => '5.5311', + 'CPAN::Shell' => '5.5007', + 'Carp' => '1.45', + 'Carp::Heavy' => '1.45', + 'Compress::Raw::Zlib' => '2.076', + 'Config' => '5.027007', + 'Cwd' => '3.71', + 'Data::Dumper' => '2.169', + 'Devel::PPPort' => '3.37', + 'Digest::SHA' => '6.00', + 'DynaLoader' => '1.45', + 'ExtUtils::CBuilder' => '0.280230', + 'ExtUtils::CBuilder::Base'=> '0.280230', + 'ExtUtils::CBuilder::Platform::Unix'=> '0.280230', + 'ExtUtils::CBuilder::Platform::VMS'=> '0.280230', + 'ExtUtils::CBuilder::Platform::Windows'=> '0.280230', + 'ExtUtils::CBuilder::Platform::Windows::BCC'=> '0.280230', + 'ExtUtils::CBuilder::Platform::Windows::GCC'=> '0.280230', + 'ExtUtils::CBuilder::Platform::Windows::MSVC'=> '0.280230', + 'ExtUtils::CBuilder::Platform::aix'=> '0.280230', + 'ExtUtils::CBuilder::Platform::android'=> '0.280230', + 'ExtUtils::CBuilder::Platform::cygwin'=> '0.280230', + 'ExtUtils::CBuilder::Platform::darwin'=> '0.280230', + 'ExtUtils::CBuilder::Platform::dec_osf'=> '0.280230', + 'ExtUtils::CBuilder::Platform::os2'=> '0.280230', + 'ExtUtils::Typemaps' => '3.37', + 'File::Fetch' => '0.56', + 'File::Spec' => '3.71', + 'File::Spec::AmigaOS' => '3.71', + 'File::Spec::Cygwin' => '3.71', + 'File::Spec::Epoc' => '3.71', + 'File::Spec::Functions' => '3.71', + 'File::Spec::Mac' => '3.71', + 'File::Spec::OS2' => '3.71', + 'File::Spec::Unix' => '3.71', + 'File::Spec::VMS' => '3.71', + 'File::Spec::Win32' => '3.71', + 'Filter::Util::Call' => '1.58', + 'GDBM_File' => '1.17', + 'JSON::PP' => '2.97000', + 'JSON::PP::Boolean' => '2.97000', + 'Locale::Codes' => '3.55', + 'Locale::Codes::Constants'=> '3.55', + 'Locale::Codes::Country'=> '3.55', + 'Locale::Codes::Country_Codes'=> '3.55', + 'Locale::Codes::Country_Retired'=> '3.55', + 'Locale::Codes::Currency'=> '3.55', + 'Locale::Codes::Currency_Codes'=> '3.55', + 'Locale::Codes::Currency_Retired'=> '3.55', + 'Locale::Codes::LangExt'=> '3.55', + 'Locale::Codes::LangExt_Codes'=> '3.55', + 'Locale::Codes::LangExt_Retired'=> '3.55', + 'Locale::Codes::LangFam'=> '3.55', + 'Locale::Codes::LangFam_Codes'=> '3.55', + 'Locale::Codes::LangFam_Retired'=> '3.55', + 'Locale::Codes::LangVar'=> '3.55', + 'Locale::Codes::LangVar_Codes'=> '3.55', + 'Locale::Codes::LangVar_Retired'=> '3.55', + 'Locale::Codes::Language'=> '3.55', + 'Locale::Codes::Language_Codes'=> '3.55', + 'Locale::Codes::Language_Retired'=> '3.55', + 'Locale::Codes::Script' => '3.55', + 'Locale::Codes::Script_Codes'=> '3.55', + 'Locale::Codes::Script_Retired'=> '3.55', + 'Locale::Country' => '3.55', + 'Locale::Currency' => '3.55', + 'Locale::Language' => '3.55', + 'Locale::Script' => '3.55', + 'Module::CoreList' => '5.20171220', + 'Module::CoreList::TieHashDelta'=> '5.20171220', + 'Module::CoreList::Utils'=> '5.20171220', + 'Opcode' => '1.42', + 'POSIX' => '1.81', + 'Pod::Functions' => '1.12', + 'Pod::Functions::Functions'=> '1.12', + 'Pod::Html' => '1.23', + 'Sys::Hostname' => '1.22', + 'Test2' => '1.302120', + 'Test2::API' => '1.302120', + 'Test2::API::Breakage' => '1.302120', + 'Test2::API::Context' => '1.302120', + 'Test2::API::Instance' => '1.302120', + 'Test2::API::Stack' => '1.302120', + 'Test2::Event' => '1.302120', + 'Test2::Event::Bail' => '1.302120', + 'Test2::Event::Diag' => '1.302120', + 'Test2::Event::Encoding'=> '1.302120', + 'Test2::Event::Exception'=> '1.302120', + 'Test2::Event::Fail' => '1.302120', + 'Test2::Event::Generic' => '1.302120', + 'Test2::Event::Note' => '1.302120', + 'Test2::Event::Ok' => '1.302120', + 'Test2::Event::Pass' => '1.302120', + 'Test2::Event::Plan' => '1.302120', + 'Test2::Event::Skip' => '1.302120', + 'Test2::Event::Subtest' => '1.302120', + 'Test2::Event::TAP::Version'=> '1.302120', + 'Test2::Event::Waiting' => '1.302120', + 'Test2::EventFacet' => '1.302120', + 'Test2::EventFacet::About'=> '1.302120', + 'Test2::EventFacet::Amnesty'=> '1.302120', + 'Test2::EventFacet::Assert'=> '1.302120', + 'Test2::EventFacet::Control'=> '1.302120', + 'Test2::EventFacet::Error'=> '1.302120', + 'Test2::EventFacet::Info'=> '1.302120', + 'Test2::EventFacet::Meta'=> '1.302120', + 'Test2::EventFacet::Parent'=> '1.302120', + 'Test2::EventFacet::Plan'=> '1.302120', + 'Test2::EventFacet::Trace'=> '1.302120', + 'Test2::Formatter' => '1.302120', + 'Test2::Formatter::TAP' => '1.302120', + 'Test2::Hub' => '1.302120', + 'Test2::Hub::Interceptor'=> '1.302120', + 'Test2::Hub::Interceptor::Terminator'=> '1.302120', + 'Test2::Hub::Subtest' => '1.302120', + 'Test2::IPC' => '1.302120', + 'Test2::IPC::Driver' => '1.302120', + 'Test2::IPC::Driver::Files'=> '1.302120', + 'Test2::Tools::Tiny' => '1.302120', + 'Test2::Util' => '1.302120', + 'Test2::Util::ExternalMeta'=> '1.302120', + 'Test2::Util::Facets2Legacy'=> '1.302120', + 'Test2::Util::HashBase' => '1.302120', + 'Test2::Util::Trace' => '1.302120', + 'Test::Builder' => '1.302120', + 'Test::Builder::Formatter'=> '1.302120', + 'Test::Builder::Module' => '1.302120', + 'Test::Builder::Tester' => '1.302120', + 'Test::Builder::Tester::Color'=> '1.302120', + 'Test::Builder::TodoDiag'=> '1.302120', + 'Test::More' => '1.302120', + 'Test::Simple' => '1.302120', + 'Test::Tester' => '1.302120', + 'Test::Tester::Capture' => '1.302120', + 'Test::Tester::CaptureRunner'=> '1.302120', + 'Test::Tester::Delegate'=> '1.302120', + 'Test::use::ok' => '1.302120', + 'Time::HiRes' => '1.9748', + 'Time::Piece' => '1.3203', + 'Time::Seconds' => '1.3203', + 'Unicode::Collate' => '1.25', + 'Unicode::Collate::CJK::Big5'=> '1.25', + 'Unicode::Collate::CJK::GB2312'=> '1.25', + 'Unicode::Collate::CJK::JISX0208'=> '1.25', + 'Unicode::Collate::CJK::Korean'=> '1.25', + 'Unicode::Collate::CJK::Pinyin'=> '1.25', + 'Unicode::Collate::CJK::Stroke'=> '1.25', + 'Unicode::Collate::CJK::Zhuyin'=> '1.25', + 'Unicode::Collate::Locale'=> '1.25', + 'Unicode::UCD' => '0.69', + 'XS::APItest' => '0.94', + 'XSLoader' => '0.29', + 'arybase' => '0.15', + 'autodie::exception' => '2.29001', + 'autodie::hints' => '2.29001', + 'experimental' => '0.019', + 'feature' => '1.50', + 'ok' => '1.302120', + 'overload' => '1.29', + 'threads' => '2.21', + 'threads::shared' => '1.58', + 'warnings' => '1.39', + }, + removed => { + } + }, + 5.027008 => { + delta_from => 5.027007, + changed => { + 'B' => '1.74', + 'B::Deparse' => '1.47', + 'B::Op_private' => '5.027008', + 'Config' => '5.027008', + 'Cwd' => '3.72', + 'Data::Dumper' => '2.170', + 'Devel::PPPort' => '3.38', + 'Digest::SHA' => '6.01', + 'Encode' => '2.94', + 'Encode::Alias' => '2.24', + 'ExtUtils::Miniperl' => '1.08', + 'File::Spec' => '3.72', + 'File::Spec::AmigaOS' => '3.72', + 'File::Spec::Cygwin' => '3.72', + 'File::Spec::Epoc' => '3.72', + 'File::Spec::Functions' => '3.72', + 'File::Spec::Mac' => '3.72', + 'File::Spec::OS2' => '3.72', + 'File::Spec::Unix' => '3.72', + 'File::Spec::VMS' => '3.72', + 'File::Spec::Win32' => '3.72', + 'JSON::PP' => '2.97001', + 'JSON::PP::Boolean' => '2.97001', + 'Module::CoreList' => '5.20180120', + 'Module::CoreList::TieHashDelta'=> '5.20180120', + 'Module::CoreList::Utils'=> '5.20180120', + 'Opcode' => '1.43', + 'Pod::Functions' => '1.13', + 'Pod::Functions::Functions'=> '1.13', + 'Pod::Html' => '1.24', + 'Pod::Man' => '4.10', + 'Pod::ParseLink' => '4.10', + 'Pod::Text' => '4.10', + 'Pod::Text::Color' => '4.10', + 'Pod::Text::Overstrike' => '4.10', + 'Pod::Text::Termcap' => '4.10', + 'Socket' => '2.027', + 'Time::HiRes' => '1.9752', + 'Unicode::UCD' => '0.70', + 'XS::APItest' => '0.95', + 'XSLoader' => '0.30', + 'autodie::exception' => '2.29002', + 'feature' => '1.51', + 'overload' => '1.30', + 'utf8' => '1.21', + 'warnings' => '1.40', + }, + removed => { + } + }, + 5.027009 => { + delta_from => 5.027008, + changed => { + 'B::Op_private' => '5.027009', + 'Carp' => '1.46', + 'Carp::Heavy' => '1.46', + 'Config' => '5.027009', + 'Cwd' => '3.74', + 'Devel::PPPort' => '3.39', + 'Encode' => '2.96', + 'Encode::Unicode' => '2.17', + 'Errno' => '1.29', + 'ExtUtils::Command' => '7.32', + 'ExtUtils::Command::MM' => '7.32', + 'ExtUtils::Liblist' => '7.32', + 'ExtUtils::Liblist::Kid'=> '7.32', + 'ExtUtils::MM' => '7.32', + 'ExtUtils::MM_AIX' => '7.32', + 'ExtUtils::MM_Any' => '7.32', + 'ExtUtils::MM_BeOS' => '7.32', + 'ExtUtils::MM_Cygwin' => '7.32', + 'ExtUtils::MM_DOS' => '7.32', + 'ExtUtils::MM_Darwin' => '7.32', + 'ExtUtils::MM_MacOS' => '7.32', + 'ExtUtils::MM_NW5' => '7.32', + 'ExtUtils::MM_OS2' => '7.32', + 'ExtUtils::MM_QNX' => '7.32', + 'ExtUtils::MM_UWIN' => '7.32', + 'ExtUtils::MM_Unix' => '7.32', + 'ExtUtils::MM_VMS' => '7.32', + 'ExtUtils::MM_VOS' => '7.32', + 'ExtUtils::MM_Win32' => '7.32', + 'ExtUtils::MM_Win95' => '7.32', + 'ExtUtils::MY' => '7.32', + 'ExtUtils::MakeMaker' => '7.32', + 'ExtUtils::MakeMaker::Config'=> '7.32', + 'ExtUtils::MakeMaker::Locale'=> '7.32', + 'ExtUtils::MakeMaker::version'=> '7.32', + 'ExtUtils::MakeMaker::version::regex'=> '7.32', + 'ExtUtils::Mkbootstrap' => '7.32', + 'ExtUtils::Mksymlists' => '7.32', + 'ExtUtils::ParseXS' => '3.38', + 'ExtUtils::ParseXS::Constants'=> '3.38', + 'ExtUtils::ParseXS::CountLines'=> '3.38', + 'ExtUtils::ParseXS::Eval'=> '3.38', + 'ExtUtils::ParseXS::Utilities'=> '3.38', + 'ExtUtils::Typemaps' => '3.38', + 'ExtUtils::Typemaps::Cmd'=> '3.38', + 'ExtUtils::Typemaps::InputMap'=> '3.38', + 'ExtUtils::Typemaps::OutputMap'=> '3.38', + 'ExtUtils::Typemaps::Type'=> '3.38', + 'ExtUtils::testlib' => '7.32', + 'File::Spec' => '3.74', + 'File::Spec::AmigaOS' => '3.74', + 'File::Spec::Cygwin' => '3.74', + 'File::Spec::Epoc' => '3.74', + 'File::Spec::Functions' => '3.74', + 'File::Spec::Mac' => '3.74', + 'File::Spec::OS2' => '3.74', + 'File::Spec::Unix' => '3.74', + 'File::Spec::VMS' => '3.74', + 'File::Spec::Win32' => '3.74', + 'IPC::Cmd' => '1.00', + 'Math::BigFloat::Trace' => '0.49', + 'Math::BigInt::Trace' => '0.49', + 'Module::CoreList' => '5.20180220', + 'Module::CoreList::Utils'=> '5.20180220', + 'POSIX' => '1.82', + 'PerlIO::encoding' => '0.26', + 'Storable' => '3.06', + 'Storable::Limit' => undef, + 'Test2' => '1.302122', + 'Test2::API' => '1.302122', + 'Test2::API::Breakage' => '1.302122', + 'Test2::API::Context' => '1.302122', + 'Test2::API::Instance' => '1.302122', + 'Test2::API::Stack' => '1.302122', + 'Test2::Event' => '1.302122', + 'Test2::Event::Bail' => '1.302122', + 'Test2::Event::Diag' => '1.302122', + 'Test2::Event::Encoding'=> '1.302122', + 'Test2::Event::Exception'=> '1.302122', + 'Test2::Event::Fail' => '1.302122', + 'Test2::Event::Generic' => '1.302122', + 'Test2::Event::Note' => '1.302122', + 'Test2::Event::Ok' => '1.302122', + 'Test2::Event::Pass' => '1.302122', + 'Test2::Event::Plan' => '1.302122', + 'Test2::Event::Skip' => '1.302122', + 'Test2::Event::Subtest' => '1.302122', + 'Test2::Event::TAP::Version'=> '1.302122', + 'Test2::Event::Waiting' => '1.302122', + 'Test2::EventFacet' => '1.302122', + 'Test2::EventFacet::About'=> '1.302122', + 'Test2::EventFacet::Amnesty'=> '1.302122', + 'Test2::EventFacet::Assert'=> '1.302122', + 'Test2::EventFacet::Control'=> '1.302122', + 'Test2::EventFacet::Error'=> '1.302122', + 'Test2::EventFacet::Info'=> '1.302122', + 'Test2::EventFacet::Meta'=> '1.302122', + 'Test2::EventFacet::Parent'=> '1.302122', + 'Test2::EventFacet::Plan'=> '1.302122', + 'Test2::EventFacet::Render'=> '1.302122', + 'Test2::EventFacet::Trace'=> '1.302122', + 'Test2::Formatter' => '1.302122', + 'Test2::Formatter::TAP' => '1.302122', + 'Test2::Hub' => '1.302122', + 'Test2::Hub::Interceptor'=> '1.302122', + 'Test2::Hub::Interceptor::Terminator'=> '1.302122', + 'Test2::Hub::Subtest' => '1.302122', + 'Test2::IPC' => '1.302122', + 'Test2::IPC::Driver' => '1.302122', + 'Test2::IPC::Driver::Files'=> '1.302122', + 'Test2::Tools::Tiny' => '1.302122', + 'Test2::Util' => '1.302122', + 'Test2::Util::ExternalMeta'=> '1.302122', + 'Test2::Util::Facets2Legacy'=> '1.302122', + 'Test2::Util::HashBase' => '1.302122', + 'Test2::Util::Trace' => '1.302122', + 'Test::Builder' => '1.302122', + 'Test::Builder::Formatter'=> '1.302122', + 'Test::Builder::Module' => '1.302122', + 'Test::Builder::Tester' => '1.302122', + 'Test::Builder::Tester::Color'=> '1.302122', + 'Test::Builder::TodoDiag'=> '1.302122', + 'Test::More' => '1.302122', + 'Test::Simple' => '1.302122', + 'Test::Tester' => '1.302122', + 'Test::Tester::Capture' => '1.302122', + 'Test::Tester::CaptureRunner'=> '1.302122', + 'Test::Tester::Delegate'=> '1.302122', + 'Test::use::ok' => '1.302122', + 'Time::HiRes' => '1.9753', + 'XS::APItest' => '0.96', + 'bigint' => '0.49', + 'bignum' => '0.49', + 'bigrat' => '0.49', + 'encoding' => '2.22', + 'if' => '0.0608', + 'mro' => '1.22', + 'ok' => '1.302122', + 'threads' => '2.22', + 'warnings' => '1.41', + }, + removed => { + 'Module::CoreList::TieHashDelta'=> 1, + } + }, + 5.027010 => { + delta_from => 5.027009, + changed => { + 'App::Prove' => '3.42', + 'App::Prove::State' => '3.42', + 'App::Prove::State::Result'=> '3.42', + 'App::Prove::State::Result::Test'=> '3.42', + 'B::Deparse' => '1.48', + 'B::Op_private' => '5.027010', + 'Carp' => '1.49', + 'Carp::Heavy' => '1.49', + 'Config' => '5.02701', + 'Encode' => '2.97', + 'ExtUtils::Command' => '7.34', + 'ExtUtils::Command::MM' => '7.34', + 'ExtUtils::Liblist' => '7.34', + 'ExtUtils::Liblist::Kid'=> '7.34', + 'ExtUtils::MM' => '7.34', + 'ExtUtils::MM_AIX' => '7.34', + 'ExtUtils::MM_Any' => '7.34', + 'ExtUtils::MM_BeOS' => '7.34', + 'ExtUtils::MM_Cygwin' => '7.34', + 'ExtUtils::MM_DOS' => '7.34', + 'ExtUtils::MM_Darwin' => '7.34', + 'ExtUtils::MM_MacOS' => '7.34', + 'ExtUtils::MM_NW5' => '7.34', + 'ExtUtils::MM_OS2' => '7.34', + 'ExtUtils::MM_QNX' => '7.34', + 'ExtUtils::MM_UWIN' => '7.34', + 'ExtUtils::MM_Unix' => '7.34', + 'ExtUtils::MM_VMS' => '7.34', + 'ExtUtils::MM_VOS' => '7.34', + 'ExtUtils::MM_Win32' => '7.34', + 'ExtUtils::MM_Win95' => '7.34', + 'ExtUtils::MY' => '7.34', + 'ExtUtils::MakeMaker' => '7.34', + 'ExtUtils::MakeMaker::Config'=> '7.34', + 'ExtUtils::MakeMaker::Locale'=> '7.34', + 'ExtUtils::MakeMaker::version'=> '7.34', + 'ExtUtils::MakeMaker::version::regex'=> '7.34', + 'ExtUtils::Mkbootstrap' => '7.34', + 'ExtUtils::Mksymlists' => '7.34', + 'ExtUtils::ParseXS' => '3.39', + 'ExtUtils::ParseXS::Constants'=> '3.39', + 'ExtUtils::ParseXS::CountLines'=> '3.39', + 'ExtUtils::ParseXS::Eval'=> '3.39', + 'ExtUtils::ParseXS::Utilities'=> '3.39', + 'ExtUtils::testlib' => '7.34', + 'File::Glob' => '1.31', + 'I18N::Langinfo' => '0.16', + 'List::Util' => '1.50', + 'List::Util::XS' => '1.50', + 'Locale::Codes' => '3.56', + 'Locale::Codes::Constants'=> '3.56', + 'Locale::Codes::Country'=> '3.56', + 'Locale::Codes::Country_Codes'=> '3.56', + 'Locale::Codes::Country_Retired'=> '3.56', + 'Locale::Codes::Currency'=> '3.56', + 'Locale::Codes::Currency_Codes'=> '3.56', + 'Locale::Codes::Currency_Retired'=> '3.56', + 'Locale::Codes::LangExt'=> '3.56', + 'Locale::Codes::LangExt_Codes'=> '3.56', + 'Locale::Codes::LangExt_Retired'=> '3.56', + 'Locale::Codes::LangFam'=> '3.56', + 'Locale::Codes::LangFam_Codes'=> '3.56', + 'Locale::Codes::LangFam_Retired'=> '3.56', + 'Locale::Codes::LangVar'=> '3.56', + 'Locale::Codes::LangVar_Codes'=> '3.56', + 'Locale::Codes::LangVar_Retired'=> '3.56', + 'Locale::Codes::Language'=> '3.56', + 'Locale::Codes::Language_Codes'=> '3.56', + 'Locale::Codes::Language_Retired'=> '3.56', + 'Locale::Codes::Script' => '3.56', + 'Locale::Codes::Script_Codes'=> '3.56', + 'Locale::Codes::Script_Retired'=> '3.56', + 'Locale::Country' => '3.56', + 'Locale::Currency' => '3.56', + 'Locale::Language' => '3.56', + 'Locale::Script' => '3.56', + 'Module::CoreList' => '5.20180221', + 'Module::CoreList::Utils'=> '5.20180221', + 'POSIX' => '1.83', + 'Scalar::Util' => '1.50', + 'Sub::Util' => '1.50', + 'TAP::Base' => '3.42', + 'TAP::Formatter::Base' => '3.42', + 'TAP::Formatter::Color' => '3.42', + 'TAP::Formatter::Console'=> '3.42', + 'TAP::Formatter::Console::ParallelSession'=> '3.42', + 'TAP::Formatter::Console::Session'=> '3.42', + 'TAP::Formatter::File' => '3.42', + 'TAP::Formatter::File::Session'=> '3.42', + 'TAP::Formatter::Session'=> '3.42', + 'TAP::Harness' => '3.42', + 'TAP::Harness::Env' => '3.42', + 'TAP::Object' => '3.42', + 'TAP::Parser' => '3.42', + 'TAP::Parser::Aggregator'=> '3.42', + 'TAP::Parser::Grammar' => '3.42', + 'TAP::Parser::Iterator' => '3.42', + 'TAP::Parser::Iterator::Array'=> '3.42', + 'TAP::Parser::Iterator::Process'=> '3.42', + 'TAP::Parser::Iterator::Stream'=> '3.42', + 'TAP::Parser::IteratorFactory'=> '3.42', + 'TAP::Parser::Multiplexer'=> '3.42', + 'TAP::Parser::Result' => '3.42', + 'TAP::Parser::Result::Bailout'=> '3.42', + 'TAP::Parser::Result::Comment'=> '3.42', + 'TAP::Parser::Result::Plan'=> '3.42', + 'TAP::Parser::Result::Pragma'=> '3.42', + 'TAP::Parser::Result::Test'=> '3.42', + 'TAP::Parser::Result::Unknown'=> '3.42', + 'TAP::Parser::Result::Version'=> '3.42', + 'TAP::Parser::Result::YAML'=> '3.42', + 'TAP::Parser::ResultFactory'=> '3.42', + 'TAP::Parser::Scheduler'=> '3.42', + 'TAP::Parser::Scheduler::Job'=> '3.42', + 'TAP::Parser::Scheduler::Spinner'=> '3.42', + 'TAP::Parser::Source' => '3.42', + 'TAP::Parser::SourceHandler'=> '3.42', + 'TAP::Parser::SourceHandler::Executable'=> '3.42', + 'TAP::Parser::SourceHandler::File'=> '3.42', + 'TAP::Parser::SourceHandler::Handle'=> '3.42', + 'TAP::Parser::SourceHandler::Perl'=> '3.42', + 'TAP::Parser::SourceHandler::RawTAP'=> '3.42', + 'TAP::Parser::YAMLish::Reader'=> '3.42', + 'TAP::Parser::YAMLish::Writer'=> '3.42', + 'Test2' => '1.302133', + 'Test2::API' => '1.302133', + 'Test2::API::Breakage' => '1.302133', + 'Test2::API::Context' => '1.302133', + 'Test2::API::Instance' => '1.302133', + 'Test2::API::Stack' => '1.302133', + 'Test2::Event' => '1.302133', + 'Test2::Event::Bail' => '1.302133', + 'Test2::Event::Diag' => '1.302133', + 'Test2::Event::Encoding'=> '1.302133', + 'Test2::Event::Exception'=> '1.302133', + 'Test2::Event::Fail' => '1.302133', + 'Test2::Event::Generic' => '1.302133', + 'Test2::Event::Note' => '1.302133', + 'Test2::Event::Ok' => '1.302133', + 'Test2::Event::Pass' => '1.302133', + 'Test2::Event::Plan' => '1.302133', + 'Test2::Event::Skip' => '1.302133', + 'Test2::Event::Subtest' => '1.302133', + 'Test2::Event::TAP::Version'=> '1.302133', + 'Test2::Event::V2' => '1.302133', + 'Test2::Event::Waiting' => '1.302133', + 'Test2::EventFacet' => '1.302133', + 'Test2::EventFacet::About'=> '1.302133', + 'Test2::EventFacet::Amnesty'=> '1.302133', + 'Test2::EventFacet::Assert'=> '1.302133', + 'Test2::EventFacet::Control'=> '1.302133', + 'Test2::EventFacet::Error'=> '1.302133', + 'Test2::EventFacet::Hub'=> '1.302133', + 'Test2::EventFacet::Info'=> '1.302133', + 'Test2::EventFacet::Meta'=> '1.302133', + 'Test2::EventFacet::Parent'=> '1.302133', + 'Test2::EventFacet::Plan'=> '1.302133', + 'Test2::EventFacet::Render'=> '1.302133', + 'Test2::EventFacet::Trace'=> '1.302133', + 'Test2::Formatter' => '1.302133', + 'Test2::Formatter::TAP' => '1.302133', + 'Test2::Hub' => '1.302133', + 'Test2::Hub::Interceptor'=> '1.302133', + 'Test2::Hub::Interceptor::Terminator'=> '1.302133', + 'Test2::Hub::Subtest' => '1.302133', + 'Test2::IPC' => '1.302133', + 'Test2::IPC::Driver' => '1.302133', + 'Test2::IPC::Driver::Files'=> '1.302133', + 'Test2::Tools::Tiny' => '1.302133', + 'Test2::Util' => '1.302133', + 'Test2::Util::ExternalMeta'=> '1.302133', + 'Test2::Util::Facets2Legacy'=> '1.302133', + 'Test2::Util::HashBase' => '1.302133', + 'Test2::Util::Trace' => '1.302133', + 'Test::Builder' => '1.302133', + 'Test::Builder::Formatter'=> '1.302133', + 'Test::Builder::Module' => '1.302133', + 'Test::Builder::Tester' => '1.302133', + 'Test::Builder::Tester::Color'=> '1.302133', + 'Test::Builder::TodoDiag'=> '1.302133', + 'Test::Harness' => '3.42', + 'Test::More' => '1.302133', + 'Test::Simple' => '1.302133', + 'Test::Tester' => '1.302133', + 'Test::Tester::Capture' => '1.302133', + 'Test::Tester::CaptureRunner'=> '1.302133', + 'Test::Tester::Delegate'=> '1.302133', + 'Test::use::ok' => '1.302133', + 'Time::HiRes' => '1.9757', + 'Time::Piece' => '1.3204', + 'Time::Seconds' => '1.3204', + 'attributes' => '0.33', + 'ok' => '1.302133', + 'warnings' => '1.42', + }, + removed => { + } + }, + 5.024004 => { + delta_from => 5.024003, + changed => { + 'B::Op_private' => '5.024004', + 'Config' => '5.024004', + 'Module::CoreList' => '5.20180414_24', + 'Module::CoreList::TieHashDelta'=> '5.20180414_24', + 'Module::CoreList::Utils'=> '5.20180414_24', + }, + removed => { + } + }, + 5.026002 => { + delta_from => 5.026001, + changed => { + 'B::Op_private' => '5.026002', + 'Config' => '5.026002', + 'Module::CoreList' => '5.20180414_26', + 'Module::CoreList::TieHashDelta'=> '5.20180414_26', + 'Module::CoreList::Utils'=> '5.20180414_26', + 'PerlIO::via' => '0.17', + 'Term::ReadLine' => '1.17', + 'Unicode::UCD' => '0.69', + }, + removed => { + } + }, + 5.027011 => { + delta_from => 5.027010, + changed => { + 'B::Op_private' => '5.027011', + 'Carp' => '1.50', + 'Carp::Heavy' => '1.50', + 'Config' => '5.027011', + 'Devel::PPPort' => '3.40', + 'Exporter' => '5.73', + 'Exporter::Heavy' => '5.73', + 'ExtUtils::Constant' => '0.25', + 'I18N::Langinfo' => '0.17', + 'IO' => '1.39', + 'IO::Dir' => '1.39', + 'IO::File' => '1.39', + 'IO::Handle' => '1.39', + 'IO::Pipe' => '1.39', + 'IO::Poll' => '1.39', + 'IO::Seekable' => '1.39', + 'IO::Select' => '1.39', + 'IO::Socket' => '1.39', + 'IO::Socket::INET' => '1.39', + 'IO::Socket::UNIX' => '1.39', + 'Module::CoreList' => '5.20180420', + 'Module::CoreList::Utils'=> '5.20180420', + 'POSIX' => '1.84', + 'Time::HiRes' => '1.9759', + 'XS::APItest' => '0.97', + 'bytes' => '1.06', + 'subs' => '1.03', + 'vars' => '1.04', + 'version' => '0.9923', + 'version::regex' => '0.9923', + }, + removed => { + } + }, + 5.028000 => { + delta_from => 5.027011, + changed => { + 'Archive::Tar' => '2.30', + 'Archive::Tar::Constant'=> '2.30', + 'Archive::Tar::File' => '2.30', + 'B::Op_private' => '5.028000', + 'Config' => '5.028', + 'Module::CoreList' => '5.20180622', + 'Module::CoreList::Utils'=> '5.20180622', + 'Storable' => '3.08', + 'XS::APItest' => '0.98', + 'feature' => '1.52', + }, + removed => { + } + }, + 5.029000 => { + delta_from => 5.028, + changed => { + 'B::Op_private' => '5.029000', + 'Config' => '5.029', + 'Module::CoreList' => '5.20180626', + 'Module::CoreList::Utils'=> '5.20180626', + 'Unicode::UCD' => '0.71', + 'XS::APItest' => '0.99', + 'feature' => '1.53', + }, + removed => { + } + }, + 5.029001 => { + delta_from => 5.029000, + changed => { + 'B::Op_private' => '5.029001', + 'Compress::Raw::Bzip2' => '2.081', + 'Compress::Raw::Zlib' => '2.081', + 'Compress::Zlib' => '2.081', + 'Config' => '5.029001', + 'Config::Perl::V' => '0.30', + 'DB_File' => '1.842', + 'Devel::PPPort' => '3.42', + 'Digest::SHA' => '6.02', + 'ExtUtils::Manifest' => '1.71', + 'File::GlobMapper' => '1.001', + 'File::Temp' => '0.2308', + 'IO::Compress::Adapter::Bzip2'=> '2.081', + 'IO::Compress::Adapter::Deflate'=> '2.081', + 'IO::Compress::Adapter::Identity'=> '2.081', + 'IO::Compress::Base' => '2.081', + 'IO::Compress::Base::Common'=> '2.081', + 'IO::Compress::Bzip2' => '2.081', + 'IO::Compress::Deflate' => '2.081', + 'IO::Compress::Gzip' => '2.081', + 'IO::Compress::Gzip::Constants'=> '2.081', + 'IO::Compress::RawDeflate'=> '2.081', + 'IO::Compress::Zip' => '2.081', + 'IO::Compress::Zip::Constants'=> '2.081', + 'IO::Compress::Zlib::Constants'=> '2.081', + 'IO::Compress::Zlib::Extra'=> '2.081', + 'IO::Uncompress::Adapter::Bunzip2'=> '2.081', + 'IO::Uncompress::Adapter::Identity'=> '2.081', + 'IO::Uncompress::Adapter::Inflate'=> '2.081', + 'IO::Uncompress::AnyInflate'=> '2.081', + 'IO::Uncompress::AnyUncompress'=> '2.081', + 'IO::Uncompress::Base' => '2.081', + 'IO::Uncompress::Bunzip2'=> '2.081', + 'IO::Uncompress::Gunzip'=> '2.081', + 'IO::Uncompress::Inflate'=> '2.081', + 'IO::Uncompress::RawInflate'=> '2.081', + 'IO::Uncompress::Unzip' => '2.081', + 'IPC::Cmd' => '1.02', + 'Locale::Codes' => '3.57', + 'Locale::Codes::Constants'=> '3.57', + 'Locale::Codes::Country'=> '3.57', + 'Locale::Codes::Country_Codes'=> '3.57', + 'Locale::Codes::Country_Retired'=> '3.57', + 'Locale::Codes::Currency'=> '3.57', + 'Locale::Codes::Currency_Codes'=> '3.57', + 'Locale::Codes::Currency_Retired'=> '3.57', + 'Locale::Codes::LangExt'=> '3.57', + 'Locale::Codes::LangExt_Codes'=> '3.57', + 'Locale::Codes::LangExt_Retired'=> '3.57', + 'Locale::Codes::LangFam'=> '3.57', + 'Locale::Codes::LangFam_Codes'=> '3.57', + 'Locale::Codes::LangFam_Retired'=> '3.57', + 'Locale::Codes::LangVar'=> '3.57', + 'Locale::Codes::LangVar_Codes'=> '3.57', + 'Locale::Codes::LangVar_Retired'=> '3.57', + 'Locale::Codes::Language'=> '3.57', + 'Locale::Codes::Language_Codes'=> '3.57', + 'Locale::Codes::Language_Retired'=> '3.57', + 'Locale::Codes::Script' => '3.57', + 'Locale::Codes::Script_Codes'=> '3.57', + 'Locale::Codes::Script_Retired'=> '3.57', + 'Locale::Country' => '3.57', + 'Locale::Currency' => '3.57', + 'Locale::Language' => '3.57', + 'Locale::Script' => '3.57', + 'Math::BigFloat' => '1.999813', + 'Math::BigFloat::Trace' => '0.50', + 'Math::BigInt' => '1.999813', + 'Math::BigInt::Calc' => '1.999813', + 'Math::BigInt::CalcEmu' => '1.999813', + 'Math::BigInt::FastCalc'=> '0.5007', + 'Math::BigInt::Lib' => '1.999813', + 'Math::BigInt::Trace' => '0.50', + 'Math::BigRat' => '0.2614', + 'Module::CoreList' => '5.20180720', + 'Module::CoreList::Utils'=> '5.20180720', + 'Pod::Man' => '4.11', + 'Pod::ParseLink' => '4.11', + 'Pod::Text' => '4.11', + 'Pod::Text::Color' => '4.11', + 'Pod::Text::Overstrike' => '4.11', + 'Pod::Text::Termcap' => '4.11', + 'Storable' => '3.11', + 'Test2' => '1.302138', + 'Test2::API' => '1.302138', + 'Test2::API::Breakage' => '1.302138', + 'Test2::API::Context' => '1.302138', + 'Test2::API::Instance' => '1.302138', + 'Test2::API::Stack' => '1.302138', + 'Test2::Event' => '1.302138', + 'Test2::Event::Bail' => '1.302138', + 'Test2::Event::Diag' => '1.302138', + 'Test2::Event::Encoding'=> '1.302138', + 'Test2::Event::Exception'=> '1.302138', + 'Test2::Event::Fail' => '1.302138', + 'Test2::Event::Generic' => '1.302138', + 'Test2::Event::Note' => '1.302138', + 'Test2::Event::Ok' => '1.302138', + 'Test2::Event::Pass' => '1.302138', + 'Test2::Event::Plan' => '1.302138', + 'Test2::Event::Skip' => '1.302138', + 'Test2::Event::Subtest' => '1.302138', + 'Test2::Event::TAP::Version'=> '1.302138', + 'Test2::Event::V2' => '1.302138', + 'Test2::Event::Waiting' => '1.302138', + 'Test2::EventFacet' => '1.302138', + 'Test2::EventFacet::About'=> '1.302138', + 'Test2::EventFacet::Amnesty'=> '1.302138', + 'Test2::EventFacet::Assert'=> '1.302138', + 'Test2::EventFacet::Control'=> '1.302138', + 'Test2::EventFacet::Error'=> '1.302138', + 'Test2::EventFacet::Hub'=> '1.302138', + 'Test2::EventFacet::Info'=> '1.302138', + 'Test2::EventFacet::Meta'=> '1.302138', + 'Test2::EventFacet::Parent'=> '1.302138', + 'Test2::EventFacet::Plan'=> '1.302138', + 'Test2::EventFacet::Render'=> '1.302138', + 'Test2::EventFacet::Trace'=> '1.302138', + 'Test2::Formatter' => '1.302138', + 'Test2::Formatter::TAP' => '1.302138', + 'Test2::Hub' => '1.302138', + 'Test2::Hub::Interceptor'=> '1.302138', + 'Test2::Hub::Interceptor::Terminator'=> '1.302138', + 'Test2::Hub::Subtest' => '1.302138', + 'Test2::IPC' => '1.302138', + 'Test2::IPC::Driver' => '1.302138', + 'Test2::IPC::Driver::Files'=> '1.302138', + 'Test2::Tools::Tiny' => '1.302138', + 'Test2::Util' => '1.302138', + 'Test2::Util::ExternalMeta'=> '1.302138', + 'Test2::Util::Facets2Legacy'=> '1.302138', + 'Test2::Util::HashBase' => '1.302138', + 'Test2::Util::Trace' => '1.302138', + 'Test::Builder' => '1.302138', + 'Test::Builder::Formatter'=> '1.302138', + 'Test::Builder::Module' => '1.302138', + 'Test::Builder::Tester' => '1.302138', + 'Test::Builder::Tester::Color'=> '1.302138', + 'Test::Builder::TodoDiag'=> '1.302138', + 'Test::More' => '1.302138', + 'Test::Simple' => '1.302138', + 'Test::Tester' => '1.302138', + 'Test::Tester::Capture' => '1.302138', + 'Test::Tester::CaptureRunner'=> '1.302138', + 'Test::Tester::Delegate'=> '1.302138', + 'Test::use::ok' => '1.302138', + 'Thread::Queue' => '3.13', + 'Time::Local' => '1.28', + 'bigint' => '0.50', + 'bignum' => '0.50', + 'bigrat' => '0.50', + 'experimental' => '0.020', + 'ok' => '1.302138', + 'parent' => '0.237', + 'perlfaq' => '5.20180605', + 'version' => '0.9924', + 'version::regex' => '0.9924', + }, + removed => { + } + }, + 5.029002 => { + delta_from => 5.029001, + changed => { + 'B::Op_private' => '5.029002', + 'Config' => '5.029002', + 'Config::Extensions' => '0.03', + 'Cwd' => '3.75', + 'Data::Dumper' => '2.171', + 'Filter::Util::Call' => '1.59', + 'HTTP::Tiny' => '0.076', + 'Module::CoreList' => '5.20180820', + 'Module::CoreList::Utils'=> '5.20180820', + 'PerlIO::scalar' => '0.30', + 'Storable' => '3.12', + 'Test2' => '1.302140', + 'Test2::API' => '1.302140', + 'Test2::API::Breakage' => '1.302140', + 'Test2::API::Context' => '1.302140', + 'Test2::API::Instance' => '1.302140', + 'Test2::API::Stack' => '1.302140', + 'Test2::Event' => '1.302140', + 'Test2::Event::Bail' => '1.302140', + 'Test2::Event::Diag' => '1.302140', + 'Test2::Event::Encoding'=> '1.302140', + 'Test2::Event::Exception'=> '1.302140', + 'Test2::Event::Fail' => '1.302140', + 'Test2::Event::Generic' => '1.302140', + 'Test2::Event::Note' => '1.302140', + 'Test2::Event::Ok' => '1.302140', + 'Test2::Event::Pass' => '1.302140', + 'Test2::Event::Plan' => '1.302140', + 'Test2::Event::Skip' => '1.302140', + 'Test2::Event::Subtest' => '1.302140', + 'Test2::Event::TAP::Version'=> '1.302140', + 'Test2::Event::V2' => '1.302140', + 'Test2::Event::Waiting' => '1.302140', + 'Test2::EventFacet' => '1.302140', + 'Test2::EventFacet::About'=> '1.302140', + 'Test2::EventFacet::Amnesty'=> '1.302140', + 'Test2::EventFacet::Assert'=> '1.302140', + 'Test2::EventFacet::Control'=> '1.302140', + 'Test2::EventFacet::Error'=> '1.302140', + 'Test2::EventFacet::Hub'=> '1.302140', + 'Test2::EventFacet::Info'=> '1.302140', + 'Test2::EventFacet::Meta'=> '1.302140', + 'Test2::EventFacet::Parent'=> '1.302140', + 'Test2::EventFacet::Plan'=> '1.302140', + 'Test2::EventFacet::Render'=> '1.302140', + 'Test2::EventFacet::Trace'=> '1.302140', + 'Test2::Formatter' => '1.302140', + 'Test2::Formatter::TAP' => '1.302140', + 'Test2::Hub' => '1.302140', + 'Test2::Hub::Interceptor'=> '1.302140', + 'Test2::Hub::Interceptor::Terminator'=> '1.302140', + 'Test2::Hub::Subtest' => '1.302140', + 'Test2::IPC' => '1.302140', + 'Test2::IPC::Driver' => '1.302140', + 'Test2::IPC::Driver::Files'=> '1.302140', + 'Test2::Tools::Tiny' => '1.302140', + 'Test2::Util' => '1.302140', + 'Test2::Util::ExternalMeta'=> '1.302140', + 'Test2::Util::Facets2Legacy'=> '1.302140', + 'Test2::Util::HashBase' => '1.302140', + 'Test2::Util::Trace' => '1.302140', + 'Test::Builder' => '1.302140', + 'Test::Builder::Formatter'=> '1.302140', + 'Test::Builder::Module' => '1.302140', + 'Test::Builder::Tester' => '1.302140', + 'Test::Builder::Tester::Color'=> '1.302140', + 'Test::Builder::TodoDiag'=> '1.302140', + 'Test::More' => '1.302140', + 'Test::Simple' => '1.302140', + 'Test::Tester' => '1.302140', + 'Test::Tester::Capture' => '1.302140', + 'Test::Tester::CaptureRunner'=> '1.302140', + 'Test::Tester::Delegate'=> '1.302140', + 'Test::use::ok' => '1.302140', + 'Time::HiRes' => '1.9760', + 'Time::Piece' => '1.33', + 'Time::Seconds' => '1.33', + 'Unicode' => '11.0.0', + 'ok' => '1.302140', + 'warnings' => '1.43', + }, + removed => { + } + }, + 5.029003 => { + delta_from => 5.029002, + changed => { + 'Archive::Tar' => '2.32', + 'Archive::Tar::Constant'=> '2.32', + 'Archive::Tar::File' => '2.32', + 'B::Op_private' => '5.029003', + 'Config' => '5.029003', + 'Data::Dumper' => '2.172', + 'Devel::PPPort' => '3.43', + 'File::Path' => '2.16', + 'File::Spec' => '3.75', + 'File::Spec::AmigaOS' => '3.75', + 'File::Spec::Cygwin' => '3.75', + 'File::Spec::Epoc' => '3.75', + 'File::Spec::Functions' => '3.75', + 'File::Spec::Mac' => '3.75', + 'File::Spec::OS2' => '3.75', + 'File::Spec::Unix' => '3.75', + 'File::Spec::VMS' => '3.75', + 'File::Spec::Win32' => '3.75', + 'Module::CoreList' => '5.20180920', + 'Module::CoreList::Utils'=> '5.20180920', + 'POSIX' => '1.85', + 'Storable' => '3.13', + 'User::grent' => '1.03', + 'perlfaq' => '5.20180915', + }, + removed => { + 'Locale::Codes' => 1, + 'Locale::Codes::Constants'=> 1, + 'Locale::Codes::Country'=> 1, + 'Locale::Codes::Country_Codes'=> 1, + 'Locale::Codes::Country_Retired'=> 1, + 'Locale::Codes::Currency'=> 1, + 'Locale::Codes::Currency_Codes'=> 1, + 'Locale::Codes::Currency_Retired'=> 1, + 'Locale::Codes::LangExt'=> 1, + 'Locale::Codes::LangExt_Codes'=> 1, + 'Locale::Codes::LangExt_Retired'=> 1, + 'Locale::Codes::LangFam'=> 1, + 'Locale::Codes::LangFam_Codes'=> 1, + 'Locale::Codes::LangFam_Retired'=> 1, + 'Locale::Codes::LangVar'=> 1, + 'Locale::Codes::LangVar_Codes'=> 1, + 'Locale::Codes::LangVar_Retired'=> 1, + 'Locale::Codes::Language'=> 1, + 'Locale::Codes::Language_Codes'=> 1, + 'Locale::Codes::Language_Retired'=> 1, + 'Locale::Codes::Script' => 1, + 'Locale::Codes::Script_Codes'=> 1, + 'Locale::Codes::Script_Retired'=> 1, + 'Locale::Country' => 1, + 'Locale::Currency' => 1, + 'Locale::Language' => 1, + 'Locale::Script' => 1, + } + }, + 5.029004 => { + delta_from => 5.029003, + changed => { + 'App::Cpan' => '1.671', + 'B' => '1.75', + 'B::Concise' => '1.004', + 'B::Deparse' => '1.49', + 'B::Op_private' => '5.029004', + 'B::Terse' => '1.09', + 'CPAN' => '2.21', + 'CPAN::Distribution' => '2.21', + 'CPAN::Mirrors' => '2.21', + 'CPAN::Plugin' => '0.97', + 'CPAN::Shell' => '5.5008', + 'Config' => '5.029004', + 'Devel::Peek' => '1.28', + 'File::Copy' => '2.34', + 'File::Glob' => '1.32', + 'Math::BigFloat::Trace' => '0.51', + 'Math::BigInt::Trace' => '0.51', + 'Module::CoreList' => '5.20181020', + 'Module::CoreList::Utils'=> '5.20181020', + 'Unicode::UCD' => '0.72', + 'bigint' => '0.51', + 'bignum' => '0.51', + 'bigrat' => '0.51', + 'bytes' => '1.07', + 'feature' => '1.54', + 'sigtrap' => '1.09', + 'vars' => '1.05', + }, + removed => { + 'B::Debug' => 1, + 'arybase' => 1, + } + }, + 5.028001 => { + delta_from => 5.028, + changed => { + 'B::Op_private' => '5.028001', + 'Config' => '5.028001', + 'Module::CoreList' => '5.20181129_28', + 'Module::CoreList::Utils'=> '5.20181129_28', + }, + removed => { + } + }, +); + +sub is_core +{ + shift if defined $_[1] and $_[1] =~ /^\w/ and _looks_like_invocant $_[0]; + my $module = shift; + my $module_version = @_ > 0 ? shift : undef; + my $perl_version = @_ > 0 ? shift : $]; + + my $first_release = first_release($module); + + return 0 if !defined($first_release) || $first_release > $perl_version; + + my $final_release = removed_from($module); + + return 0 if defined($final_release) && $perl_version >= $final_release; + + # If a minimum version of the module was specified: + # Step through all perl releases ($prn) + # so we can find what version of the module + # was included in the specified version of perl. + # On the way if we pass the required module version, we can + # short-circuit and return true + if (defined($module_version)) { + my $module_version_object = eval { version->parse($module_version) }; + if (!defined($module_version_object)) { + (my $err = $@) =~ s/^Invalid version format\b/Invalid version '$module_version' specified/; + die $err; + } + # The Perl releases aren't a linear sequence, but a tree. We need to build the path + # of releases from 5 to the specified release, and follow the module's version(s) + # along that path. + my @releases = ($perl_version); + my $rel = $perl_version; + while (defined($rel)) { + # XXX: This line is a sign of failure. -- rjbs, 2015-04-15 + my $this_delta = $delta{$rel} || $delta{ sprintf '%0.6f', $rel }; + $rel = $this_delta->{delta_from}; + unshift(@releases, $rel) if defined($rel); + } + RELEASE: + foreach my $prn (@releases) { + next RELEASE if $prn < $first_release; + last RELEASE if $prn > $perl_version; + next unless defined(my $next_module_version + = $delta{$prn}->{changed}->{$module}); + return 1 if eval { version->parse($next_module_version) >= $module_version_object }; + } + return 0; + } + + return 1 if !defined($final_release); + + return $perl_version <= $final_release; +} + +%version = _undelta(\%delta); + +%deprecated = ( + 5.011 => { + changed => { map { $_ => 1 } qw/ + Class::ISA + Pod::Plainer + Shell + Switch + /}, + }, + 5.011001 => { delta_from => 5.011 }, + 5.011002 => { delta_from => 5.011001 }, + 5.011003 => { delta_from => 5.011002 }, + 5.011004 => { delta_from => 5.011003 }, + 5.011005 => { delta_from => 5.011004 }, + + 5.012 => { delta_from => 5.011005 }, + 5.012001 => { delta_from => 5.012 }, + 5.012002 => { delta_from => 5.012001 }, + 5.012003 => { delta_from => 5.012002 }, + 5.012004 => { delta_from => 5.012003 }, + 5.012005 => { delta_from => 5.012004 }, + + 5.013 => { delta_from => 5.012005 }, + 5.013001 => { + delta_from => 5.013, + removed => { map { $_ => 1 } qw/ + Class::ISA + Pod::Plainer + Switch + /}, + }, + 5.013002 => { delta_from => 5.013001 }, + 5.013003 => { delta_from => 5.013002 }, + 5.013004 => { delta_from => 5.013003 }, + 5.013005 => { delta_from => 5.013004 }, + 5.013006 => { delta_from => 5.013005 }, + 5.013007 => { delta_from => 5.013006 }, + 5.013008 => { delta_from => 5.013007 }, + 5.013009 => { delta_from => 5.013008 }, + 5.01301 => { delta_from => 5.013009 }, + 5.013011 => { delta_from => 5.01301 }, + + 5.014 => { delta_from => 5.013011 }, + 5.014001 => { delta_from => 5.014 }, + 5.014002 => { delta_from => 5.014001 }, + 5.014003 => { delta_from => 5.014002 }, + 5.014004 => { delta_from => 5.014003 }, + + 5.015 => { + delta_from => 5.014004, + removed => { Shell => 1 }, + }, + 5.015001 => { delta_from => 5.015 }, + 5.015002 => { delta_from => 5.015001 }, + 5.015003 => { delta_from => 5.015002 }, + 5.015004 => { delta_from => 5.015003 }, + 5.015005 => { delta_from => 5.015004 }, + 5.015006 => { delta_from => 5.015005 }, + 5.015007 => { delta_from => 5.015006 }, + 5.015008 => { delta_from => 5.015007 }, + 5.015009 => { delta_from => 5.015008 }, + + 5.016 => { delta_from => 5.015009 }, + 5.016001 => { delta_from => 5.016 }, + 5.016002 => { delta_from => 5.016001 }, + 5.016003 => { delta_from => 5.016002 }, + + 5.017 => { delta_from => 5.016003 }, + 5.017001 => { delta_from => 5.017 }, + 5.017002 => { delta_from => 5.017001 }, + 5.017003 => { delta_from => 5.017002 }, + 5.017004 => { delta_from => 5.017003 }, + 5.017005 => { delta_from => 5.017004 }, + 5.017006 => { delta_from => 5.017005 }, + 5.017007 => { delta_from => 5.017006 }, + 5.017008 => { + delta_from => 5.017007, + changed => { 'Pod::LaTeX' => 1 }, + }, + 5.017009 => { + delta_from => 5.017008, + changed => { map { $_ => 1 } qw/ + Archive::Extract + B::Lint + B::Lint::Debug + CPANPLUS + CPANPLUS::Backend + CPANPLUS::Backend::RV + CPANPLUS::Config + CPANPLUS::Config::HomeEnv + CPANPLUS::Configure + CPANPLUS::Configure::Setup + CPANPLUS::Dist + CPANPLUS::Dist::Autobundle + CPANPLUS::Dist::Base + CPANPLUS::Dist::Build + CPANPLUS::Dist::Build::Constants + CPANPLUS::Dist::MM + CPANPLUS::Dist::Sample + CPANPLUS::Error + CPANPLUS::Internals + CPANPLUS::Internals::Constants + CPANPLUS::Internals::Constants::Report + CPANPLUS::Internals::Extract + CPANPLUS::Internals::Fetch + CPANPLUS::Internals::Report + CPANPLUS::Internals::Search + CPANPLUS::Internals::Source + CPANPLUS::Internals::Source::Memory + CPANPLUS::Internals::Source::SQLite + CPANPLUS::Internals::Source::SQLite::Tie + CPANPLUS::Internals::Utils + CPANPLUS::Internals::Utils::Autoflush + CPANPLUS::Module + CPANPLUS::Module::Author + CPANPLUS::Module::Author::Fake + CPANPLUS::Module::Checksums + CPANPLUS::Module::Fake + CPANPLUS::Module::Signature + CPANPLUS::Selfupdate + CPANPLUS::Shell + CPANPLUS::Shell::Classic + CPANPLUS::Shell::Default + CPANPLUS::Shell::Default::Plugins::CustomSource + CPANPLUS::Shell::Default::Plugins::Remote + CPANPLUS::Shell::Default::Plugins::Source + Devel::InnerPackage + File::CheckTree + Log::Message + Log::Message::Config + Log::Message::Handlers + Log::Message::Item + Log::Message::Simple + Module::Pluggable + Module::Pluggable::Object + Object::Accessor + Term::UI + Term::UI::History + Text::Soundex + /}, + }, + 5.01701 => { delta_from => 5.017009 }, + 5.017011 => { delta_from => 5.01701 }, + + 5.018 => { delta_from => 5.017011 }, + 5.018001 => { + delta_from => 5.018, + changed => { + }, + removed => { + } + }, + 5.018002 => { + delta_from => 5.018001, + changed => { + }, + removed => { + } + }, + 5.018003 => { + delta_from => 5.018, + changed => { + }, + removed => { + } + }, + 5.018004 => { + delta_from => 5.018, + changed => { + }, + removed => { + } + }, + + 5.019 => { + delta_from => 5.018, + changed => { 'Module::Build' => 1 }, + removed => { map { $_ => 1 } qw/ + Archive::Extract + B::Lint + B::Lint::Debug + CPANPLUS + CPANPLUS::Backend + CPANPLUS::Backend::RV + CPANPLUS::Config + CPANPLUS::Config::HomeEnv + CPANPLUS::Configure + CPANPLUS::Configure::Setup + CPANPLUS::Dist + CPANPLUS::Dist::Autobundle + CPANPLUS::Dist::Base + CPANPLUS::Dist::Build + CPANPLUS::Dist::Build::Constants + CPANPLUS::Dist::MM + CPANPLUS::Dist::Sample + CPANPLUS::Error + CPANPLUS::Internals + CPANPLUS::Internals::Constants + CPANPLUS::Internals::Constants::Report + CPANPLUS::Internals::Extract + CPANPLUS::Internals::Fetch + CPANPLUS::Internals::Report + CPANPLUS::Internals::Search + CPANPLUS::Internals::Source + CPANPLUS::Internals::Source::Memory + CPANPLUS::Internals::Source::SQLite + CPANPLUS::Internals::Source::SQLite::Tie + CPANPLUS::Internals::Utils + CPANPLUS::Internals::Utils::Autoflush + CPANPLUS::Module + CPANPLUS::Module::Author + CPANPLUS::Module::Author::Fake + CPANPLUS::Module::Checksums + CPANPLUS::Module::Fake + CPANPLUS::Module::Signature + CPANPLUS::Selfupdate + CPANPLUS::Shell + CPANPLUS::Shell::Classic + CPANPLUS::Shell::Default + CPANPLUS::Shell::Default::Plugins::CustomSource + CPANPLUS::Shell::Default::Plugins::Remote + CPANPLUS::Shell::Default::Plugins::Source + Devel::InnerPackage + File::CheckTree + Log::Message + Log::Message::Config + Log::Message::Handlers + Log::Message::Item + Log::Message::Simple + Module::Pluggable + Module::Pluggable::Object + Object::Accessor + Pod::LaTeX + Term::UI + Term::UI::History + Text::Soundex + /} + }, + 5.019001 => { + delta_from => 5.019, + changed => { + }, + removed => { + } + }, + 5.019002 => { + delta_from => 5.019001, + changed => { + }, + removed => { + } + }, + 5.019003 => { + delta_from => 5.019002, + changed => { + }, + removed => { + } + }, + 5.019004 => { + delta_from => 5.019003, + changed => { + 'Module::Build::Base' => '1', + 'Module::Build::Compat' => '1', + 'Module::Build::Config' => '1', + 'Module::Build::ConfigData'=> '1', + 'Module::Build::Cookbook'=> '1', + 'Module::Build::Dumper' => '1', + 'Module::Build::ModuleInfo'=> '1', + 'Module::Build::Notes' => '1', + 'Module::Build::PPMMaker'=> '1', + 'Module::Build::Platform::Default'=> '1', + 'Module::Build::Platform::MacOS'=> '1', + 'Module::Build::Platform::Unix'=> '1', + 'Module::Build::Platform::VMS'=> '1', + 'Module::Build::Platform::VOS'=> '1', + 'Module::Build::Platform::Windows'=> '1', + 'Module::Build::Platform::aix'=> '1', + 'Module::Build::Platform::cygwin'=> '1', + 'Module::Build::Platform::darwin'=> '1', + 'Module::Build::Platform::os2'=> '1', + 'Module::Build::PodParser'=> '1', + 'Module::Build::Version'=> '1', + 'Module::Build::YAML' => '1', + 'inc::latest' => '1', + }, + removed => { + } + }, + 5.019005 => { + delta_from => 5.019004, + changed => { + }, + removed => { + } + }, + 5.019006 => { + delta_from => 5.019005, + changed => { + 'Package::Constants' => '1', + }, + removed => { + } + }, + 5.019007 => { + delta_from => 5.019006, + changed => { + 'CGI' => '1', + 'CGI::Apache' => '1', + 'CGI::Carp' => '1', + 'CGI::Cookie' => '1', + 'CGI::Fast' => '1', + 'CGI::Pretty' => '1', + 'CGI::Push' => '1', + 'CGI::Switch' => '1', + 'CGI::Util' => '1', + }, + removed => { + } + }, + 5.019008 => { + delta_from => 5.019007, + changed => { + }, + removed => { + } + }, + 5.019009 => { + delta_from => 5.019008, + changed => { + }, + removed => { + } + }, + 5.01901 => { + delta_from => 5.019009, + changed => { + }, + removed => { + } + }, + 5.019011 => { + delta_from => 5.019010, + changed => { + }, + removed => { + } + }, + 5.020000 => { + delta_from => 5.019011, + changed => { + }, + removed => { + } + }, + 5.021000 => { + delta_from => 5.020000, + changed => { + }, + removed => { + 'CGI' => 1, + 'CGI::Apache' => 1, + 'CGI::Carp' => 1, + 'CGI::Cookie' => 1, + 'CGI::Fast' => 1, + 'CGI::Pretty' => 1, + 'CGI::Push' => 1, + 'CGI::Switch' => 1, + 'CGI::Util' => 1, + 'Module::Build' => 1, + 'Module::Build::Base' => 1, + 'Module::Build::Compat' => 1, + 'Module::Build::Config' => 1, + 'Module::Build::ConfigData'=> 1, + 'Module::Build::Cookbook'=> 1, + 'Module::Build::Dumper' => 1, + 'Module::Build::ModuleInfo'=> 1, + 'Module::Build::Notes' => 1, + 'Module::Build::PPMMaker'=> 1, + 'Module::Build::Platform::Default'=> 1, + 'Module::Build::Platform::MacOS'=> 1, + 'Module::Build::Platform::Unix'=> 1, + 'Module::Build::Platform::VMS'=> 1, + 'Module::Build::Platform::VOS'=> 1, + 'Module::Build::Platform::Windows'=> 1, + 'Module::Build::Platform::aix'=> 1, + 'Module::Build::Platform::cygwin'=> 1, + 'Module::Build::Platform::darwin'=> 1, + 'Module::Build::Platform::os2'=> 1, + 'Module::Build::PodParser'=> 1, + 'Module::Build::Version'=> 1, + 'Module::Build::YAML' => 1, + 'Package::Constants' => 1, + 'inc::latest' => 1, + } + }, + 5.021001 => { + delta_from => 5.021000, + changed => { + }, + removed => { + } + }, + 5.021002 => { + delta_from => 5.021001, + changed => { + }, + removed => { + } + }, + 5.021003 => { + delta_from => 5.021002, + changed => { + }, + removed => { + } + }, + 5.020001 => { + delta_from => 5.020000, + changed => { + }, + removed => { + } + }, + 5.021004 => { + delta_from => 5.021003, + changed => { + }, + removed => { + } + }, + 5.021005 => { + delta_from => 5.021004, + changed => { + }, + removed => { + } + }, + 5.021006 => { + delta_from => 5.021005, + changed => { + }, + removed => { + } + }, + 5.021007 => { + delta_from => 5.021006, + changed => { + }, + removed => { + } + }, + 5.021008 => { + delta_from => 5.021007, + changed => { + }, + removed => { + } + }, + 5.020002 => { + delta_from => 5.020001, + changed => { + }, + removed => { + } + }, + 5.021009 => { + delta_from => 5.021008, + changed => { + }, + removed => { + } + }, + 5.021010 => { + delta_from => 5.021009, + changed => { + }, + removed => { + } + }, + 5.021011 => { + delta_from => 5.02101, + changed => { + }, + removed => { + } + }, + 5.022000 => { + delta_from => 5.021011, + changed => { + }, + removed => { + } + }, + 5.023000 => { + delta_from => 5.022000, + changed => { + }, + removed => { + } + }, + 5.023001 => { + delta_from => 5.023000, + changed => { + }, + removed => { + } + }, + 5.023002 => { + delta_from => 5.023001, + changed => { + }, + removed => { + } + }, + 5.020003 => { + delta_from => 5.020002, + changed => { + }, + removed => { + } + }, + 5.023003 => { + delta_from => 5.023002, + changed => { + }, + removed => { + } + }, + 5.023004 => { + delta_from => 5.023003, + changed => { + }, + removed => { + } + }, + 5.023005 => { + delta_from => 5.023004, + changed => { + }, + removed => { + } + }, + 5.022001 => { + delta_from => 5.022, + changed => { + }, + removed => { + } + }, + 5.023006 => { + delta_from => 5.023005, + changed => { + }, + removed => { + } + }, + 5.023007 => { + delta_from => 5.023006, + changed => { + }, + removed => { + } + }, + 5.023008 => { + delta_from => 5.023007, + changed => { + }, + removed => { + } + }, + 5.023009 => { + delta_from => 5.023008, + changed => { + }, + removed => { + } + }, + 5.022002 => { + delta_from => 5.022001, + changed => { + }, + removed => { + } + }, + 5.024000 => { + delta_from => 5.023009, + changed => { + }, + removed => { + } + }, + 5.025000 => { + delta_from => 5.024, + changed => { + }, + removed => { + } + }, + 5.025001 => { + delta_from => 5.025, + changed => { + }, + removed => { + } + }, + 5.025002 => { + delta_from => 5.025001, + changed => { + }, + removed => { + } + }, + 5.025003 => { + delta_from => 5.025002, + changed => { + }, + removed => { + } + }, + 5.025004 => { + delta_from => 5.025003, + changed => { + }, + removed => { + } + }, + 5.025005 => { + delta_from => 5.025004, + changed => { + }, + removed => { + } + }, + 5.025006 => { + delta_from => 5.025005, + changed => { + }, + removed => { + } + }, + 5.025007 => { + delta_from => 5.025006, + changed => { + }, + removed => { + } + }, + 5.025008 => { + delta_from => 5.025007, + changed => { + }, + removed => { + } + }, + 5.022003 => { + delta_from => 5.022002, + changed => { + }, + removed => { + } + }, + 5.024001 => { + delta_from => 5.024000, + changed => { + }, + removed => { + } + }, + 5.025009 => { + delta_from => 5.025008, + changed => { + }, + removed => { + } + }, + 5.025010 => { + delta_from => 5.025009, + changed => { + }, + removed => { + } + }, + 5.025011 => { + delta_from => 5.025010, + changed => { + }, + removed => { + } + }, + 5.025012 => { + delta_from => 5.025011, + changed => { + }, + removed => { + } + }, + 5.026000 => { + delta_from => 5.025012, + changed => { + }, + removed => { + } + }, + 5.027000 => { + delta_from => 5.026, + changed => { + }, + removed => { + } + }, + 5.027001 => { + delta_from => 5.027, + changed => { + }, + removed => { + } + }, + 5.022004 => { + delta_from => 5.022003, + changed => { + }, + removed => { + } + }, + 5.024002 => { + delta_from => 5.024001, + changed => { + }, + removed => { + } + }, + 5.027002 => { + delta_from => 5.027001, + changed => { + }, + removed => { + } + }, + 5.027003 => { + delta_from => 5.027002, + changed => { + 'B::Debug' => '1', + }, + removed => { + } + }, + 5.027004 => { + delta_from => 5.027003, + changed => { + }, + removed => { + } + }, + 5.024003 => { + delta_from => 5.024002, + changed => { + }, + removed => { + } + }, + 5.026001 => { + delta_from => 5.026000, + changed => { + }, + removed => { + } + }, + 5.027005 => { + delta_from => 5.027004, + changed => { + }, + removed => { + } + }, + 5.027006 => { + delta_from => 5.027005, + changed => { + }, + removed => { + } + }, + 5.027007 => { + delta_from => 5.027006, + changed => { + }, + removed => { + } + }, + 5.027008 => { + delta_from => 5.027007, + changed => { + }, + removed => { + } + }, + 5.027009 => { + delta_from => 5.027008, + changed => { + }, + removed => { + } + }, + 5.027010 => { + delta_from => 5.027009, + changed => { + }, + removed => { + } + }, + 5.024004 => { + delta_from => 5.024003, + changed => { + }, + removed => { + } + }, + 5.026002 => { + delta_from => 5.026001, + changed => { + }, + removed => { + } + }, + 5.027011 => { + delta_from => 5.02701, + changed => { + }, + removed => { + } + }, + 5.028000 => { + delta_from => 5.027011, + changed => { + }, + removed => { + } + }, + 5.029000 => { + delta_from => 5.028, + changed => { + }, + removed => { + } + }, + 5.029001 => { + delta_from => 5.029, + changed => { + }, + removed => { + } + }, + 5.029002 => { + delta_from => 5.029001, + changed => { + }, + removed => { + } + }, + 5.029003 => { + delta_from => 5.029002, + changed => { + }, + removed => { + } + }, + 5.029004 => { + delta_from => 5.029003, + changed => { + }, + removed => { + arybase => '1', + } + }, + 5.028001 => { + delta_from => 5.028000, + changed => { + }, + removed => { + } + }, +); + +%deprecated = _undelta(\%deprecated); + +%upstream = ( + 'App::Cpan' => 'cpan', + 'App::Prove' => 'cpan', + 'App::Prove::State' => 'cpan', + 'App::Prove::State::Result'=> 'cpan', + 'App::Prove::State::Result::Test'=> 'cpan', + 'Archive::Tar' => 'cpan', + 'Archive::Tar::Constant'=> 'cpan', + 'Archive::Tar::File' => 'cpan', + 'AutoLoader' => 'cpan', + 'AutoSplit' => 'cpan', + 'B::Debug' => 'cpan', + 'CPAN' => 'cpan', + 'CPAN::Author' => 'cpan', + 'CPAN::Bundle' => 'cpan', + 'CPAN::CacheMgr' => 'cpan', + 'CPAN::Complete' => 'cpan', + 'CPAN::Debug' => 'cpan', + 'CPAN::DeferredCode' => 'cpan', + 'CPAN::Distribution' => 'cpan', + 'CPAN::Distroprefs' => 'cpan', + 'CPAN::Distrostatus' => 'cpan', + 'CPAN::Exception::RecursiveDependency'=> 'cpan', + 'CPAN::Exception::blocked_urllist'=> 'cpan', + 'CPAN::Exception::yaml_not_installed'=> 'cpan', + 'CPAN::Exception::yaml_process_error'=> 'cpan', + 'CPAN::FTP' => 'cpan', + 'CPAN::FTP::netrc' => 'cpan', + 'CPAN::FirstTime' => 'cpan', + 'CPAN::HTTP::Client' => 'cpan', + 'CPAN::HTTP::Credentials'=> 'cpan', + 'CPAN::HandleConfig' => 'cpan', + 'CPAN::Index' => 'cpan', + 'CPAN::InfoObj' => 'cpan', + 'CPAN::Kwalify' => 'cpan', + 'CPAN::LWP::UserAgent' => 'cpan', + 'CPAN::Meta' => 'cpan', + 'CPAN::Meta::Converter' => 'cpan', + 'CPAN::Meta::Feature' => 'cpan', + 'CPAN::Meta::History' => 'cpan', + 'CPAN::Meta::Merge' => 'cpan', + 'CPAN::Meta::Prereqs' => 'cpan', + 'CPAN::Meta::Requirements'=> 'cpan', + 'CPAN::Meta::Spec' => 'cpan', + 'CPAN::Meta::Validator' => 'cpan', + 'CPAN::Meta::YAML' => 'cpan', + 'CPAN::Mirrors' => 'cpan', + 'CPAN::Module' => 'cpan', + 'CPAN::Nox' => 'cpan', + 'CPAN::Plugin' => 'cpan', + 'CPAN::Plugin::Specfile'=> 'cpan', + 'CPAN::Prompt' => 'cpan', + 'CPAN::Queue' => 'cpan', + 'CPAN::Shell' => 'cpan', + 'CPAN::Tarzip' => 'cpan', + 'CPAN::URL' => 'cpan', + 'CPAN::Version' => 'cpan', + 'Compress::Raw::Bzip2' => 'cpan', + 'Compress::Raw::Zlib' => 'cpan', + 'Compress::Zlib' => 'cpan', + 'Config::Perl::V' => 'cpan', + 'DB_File' => 'cpan', + 'Digest' => 'cpan', + 'Digest::MD5' => 'cpan', + 'Digest::SHA' => 'cpan', + 'Digest::base' => 'cpan', + 'Digest::file' => 'cpan', + 'Encode' => 'cpan', + 'Encode::Alias' => 'cpan', + 'Encode::Byte' => 'cpan', + 'Encode::CJKConstants' => 'cpan', + 'Encode::CN' => 'cpan', + 'Encode::CN::HZ' => 'cpan', + 'Encode::Config' => 'cpan', + 'Encode::EBCDIC' => 'cpan', + 'Encode::Encoder' => 'cpan', + 'Encode::Encoding' => 'cpan', + 'Encode::GSM0338' => 'cpan', + 'Encode::Guess' => 'cpan', + 'Encode::JP' => 'cpan', + 'Encode::JP::H2Z' => 'cpan', + 'Encode::JP::JIS7' => 'cpan', + 'Encode::KR' => 'cpan', + 'Encode::KR::2022_KR' => 'cpan', + 'Encode::MIME::Header' => 'cpan', + 'Encode::MIME::Header::ISO_2022_JP'=> 'cpan', + 'Encode::MIME::Name' => 'cpan', + 'Encode::Symbol' => 'cpan', + 'Encode::TW' => 'cpan', + 'Encode::Unicode' => 'cpan', + 'Encode::Unicode::UTF7' => 'cpan', + 'ExtUtils::Command' => 'cpan', + 'ExtUtils::Command::MM' => 'cpan', + 'ExtUtils::Constant' => 'cpan', + 'ExtUtils::Constant::Base'=> 'cpan', + 'ExtUtils::Constant::ProxySubs'=> 'cpan', + 'ExtUtils::Constant::Utils'=> 'cpan', + 'ExtUtils::Constant::XS'=> 'cpan', + 'ExtUtils::Install' => 'cpan', + 'ExtUtils::Installed' => 'cpan', + 'ExtUtils::Liblist' => 'cpan', + 'ExtUtils::Liblist::Kid'=> 'cpan', + 'ExtUtils::MM' => 'cpan', + 'ExtUtils::MM_AIX' => 'cpan', + 'ExtUtils::MM_Any' => 'cpan', + 'ExtUtils::MM_BeOS' => 'cpan', + 'ExtUtils::MM_Cygwin' => 'cpan', + 'ExtUtils::MM_DOS' => 'cpan', + 'ExtUtils::MM_Darwin' => 'cpan', + 'ExtUtils::MM_MacOS' => 'cpan', + 'ExtUtils::MM_NW5' => 'cpan', + 'ExtUtils::MM_OS2' => 'cpan', + 'ExtUtils::MM_QNX' => 'cpan', + 'ExtUtils::MM_UWIN' => 'cpan', + 'ExtUtils::MM_Unix' => 'cpan', + 'ExtUtils::MM_VMS' => 'cpan', + 'ExtUtils::MM_VOS' => 'cpan', + 'ExtUtils::MM_Win32' => 'cpan', + 'ExtUtils::MM_Win95' => 'cpan', + 'ExtUtils::MY' => 'cpan', + 'ExtUtils::MakeMaker' => 'cpan', + 'ExtUtils::MakeMaker::Config'=> 'cpan', + 'ExtUtils::MakeMaker::Locale'=> 'cpan', + 'ExtUtils::MakeMaker::version'=> 'cpan', + 'ExtUtils::MakeMaker::version::regex'=> 'cpan', + 'ExtUtils::Manifest' => 'cpan', + 'ExtUtils::Mkbootstrap' => 'cpan', + 'ExtUtils::Mksymlists' => 'cpan', + 'ExtUtils::Packlist' => 'cpan', + 'ExtUtils::testlib' => 'cpan', + 'Fatal' => 'cpan', + 'File::Fetch' => 'cpan', + 'File::GlobMapper' => 'cpan', + 'File::Path' => 'cpan', + 'File::Temp' => 'cpan', + 'Filter::Util::Call' => 'cpan', + 'Getopt::Long' => 'cpan', + 'HTTP::Tiny' => 'cpan', + 'IO::Compress::Adapter::Bzip2'=> 'cpan', + 'IO::Compress::Adapter::Deflate'=> 'cpan', + 'IO::Compress::Adapter::Identity'=> 'cpan', + 'IO::Compress::Base' => 'cpan', + 'IO::Compress::Base::Common'=> 'cpan', + 'IO::Compress::Bzip2' => 'cpan', + 'IO::Compress::Deflate' => 'cpan', + 'IO::Compress::Gzip' => 'cpan', + 'IO::Compress::Gzip::Constants'=> 'cpan', + 'IO::Compress::RawDeflate'=> 'cpan', + 'IO::Compress::Zip' => 'cpan', + 'IO::Compress::Zip::Constants'=> 'cpan', + 'IO::Compress::Zlib::Constants'=> 'cpan', + 'IO::Compress::Zlib::Extra'=> 'cpan', + 'IO::Socket::IP' => 'cpan', + 'IO::Uncompress::Adapter::Bunzip2'=> 'cpan', + 'IO::Uncompress::Adapter::Identity'=> 'cpan', + 'IO::Uncompress::Adapter::Inflate'=> 'cpan', + 'IO::Uncompress::AnyInflate'=> 'cpan', + 'IO::Uncompress::AnyUncompress'=> 'cpan', + 'IO::Uncompress::Base' => 'cpan', + 'IO::Uncompress::Bunzip2'=> 'cpan', + 'IO::Uncompress::Gunzip'=> 'cpan', + 'IO::Uncompress::Inflate'=> 'cpan', + 'IO::Uncompress::RawInflate'=> 'cpan', + 'IO::Uncompress::Unzip' => 'cpan', + 'IO::Zlib' => 'cpan', + 'IPC::Cmd' => 'cpan', + 'IPC::Msg' => 'cpan', + 'IPC::Semaphore' => 'cpan', + 'IPC::SharedMem' => 'cpan', + 'IPC::SysV' => 'cpan', + 'JSON::PP' => 'cpan', + 'JSON::PP::Boolean' => 'cpan', + 'List::Util' => 'cpan', + 'List::Util::XS' => 'cpan', + 'Locale::Codes' => 'cpan', + 'Locale::Codes::Constants'=> 'cpan', + 'Locale::Codes::Country'=> 'cpan', + 'Locale::Codes::Country_Codes'=> 'cpan', + 'Locale::Codes::Country_Retired'=> 'cpan', + 'Locale::Codes::Currency'=> 'cpan', + 'Locale::Codes::Currency_Codes'=> 'cpan', + 'Locale::Codes::Currency_Retired'=> 'cpan', + 'Locale::Codes::LangExt'=> 'cpan', + 'Locale::Codes::LangExt_Codes'=> 'cpan', + 'Locale::Codes::LangExt_Retired'=> 'cpan', + 'Locale::Codes::LangFam'=> 'cpan', + 'Locale::Codes::LangFam_Codes'=> 'cpan', + 'Locale::Codes::LangFam_Retired'=> 'cpan', + 'Locale::Codes::LangVar'=> 'cpan', + 'Locale::Codes::LangVar_Codes'=> 'cpan', + 'Locale::Codes::LangVar_Retired'=> 'cpan', + 'Locale::Codes::Language'=> 'cpan', + 'Locale::Codes::Language_Codes'=> 'cpan', + 'Locale::Codes::Language_Retired'=> 'cpan', + 'Locale::Codes::Script' => 'cpan', + 'Locale::Codes::Script_Codes'=> 'cpan', + 'Locale::Codes::Script_Retired'=> 'cpan', + 'Locale::Country' => 'cpan', + 'Locale::Currency' => 'cpan', + 'Locale::Language' => 'cpan', + 'Locale::Maketext::Simple'=> 'cpan', + 'Locale::Script' => 'cpan', + 'MIME::Base64' => 'cpan', + 'MIME::QuotedPrint' => 'cpan', + 'Math::BigFloat' => 'cpan', + 'Math::BigFloat::Trace' => 'cpan', + 'Math::BigInt' => 'cpan', + 'Math::BigInt::Calc' => 'cpan', + 'Math::BigInt::CalcEmu' => 'cpan', + 'Math::BigInt::FastCalc'=> 'cpan', + 'Math::BigInt::Lib' => 'cpan', + 'Math::BigInt::Trace' => 'cpan', + 'Math::BigRat' => 'cpan', + 'Math::Complex' => 'cpan', + 'Math::Trig' => 'cpan', + 'Memoize' => 'cpan', + 'Memoize::AnyDBM_File' => 'cpan', + 'Memoize::Expire' => 'cpan', + 'Memoize::ExpireFile' => 'cpan', + 'Memoize::ExpireTest' => 'cpan', + 'Memoize::NDBM_File' => 'cpan', + 'Memoize::SDBM_File' => 'cpan', + 'Memoize::Storable' => 'cpan', + 'Module::Load' => 'cpan', + 'Module::Load::Conditional'=> 'cpan', + 'Module::Loaded' => 'cpan', + 'Module::Metadata' => 'cpan', + 'NEXT' => 'cpan', + 'Net::Cmd' => 'cpan', + 'Net::Config' => 'cpan', + 'Net::Domain' => 'cpan', + 'Net::FTP' => 'cpan', + 'Net::FTP::A' => 'cpan', + 'Net::FTP::E' => 'cpan', + 'Net::FTP::I' => 'cpan', + 'Net::FTP::L' => 'cpan', + 'Net::FTP::dataconn' => 'cpan', + 'Net::NNTP' => 'cpan', + 'Net::Netrc' => 'cpan', + 'Net::POP3' => 'cpan', + 'Net::SMTP' => 'cpan', + 'Net::Time' => 'cpan', + 'Params::Check' => 'cpan', + 'Parse::CPAN::Meta' => 'cpan', + 'Perl::OSType' => 'cpan', + 'PerlIO::via::QuotedPrint'=> 'cpan', + 'Pod::Checker' => 'cpan', + 'Pod::Escapes' => 'cpan', + 'Pod::Find' => 'cpan', + 'Pod::InputObjects' => 'cpan', + 'Pod::Man' => 'cpan', + 'Pod::ParseLink' => 'cpan', + 'Pod::ParseUtils' => 'cpan', + 'Pod::Parser' => 'cpan', + 'Pod::Perldoc' => 'cpan', + 'Pod::Perldoc::BaseTo' => 'cpan', + 'Pod::Perldoc::GetOptsOO'=> 'cpan', + 'Pod::Perldoc::ToANSI' => 'cpan', + 'Pod::Perldoc::ToChecker'=> 'cpan', + 'Pod::Perldoc::ToMan' => 'cpan', + 'Pod::Perldoc::ToNroff' => 'cpan', + 'Pod::Perldoc::ToPod' => 'cpan', + 'Pod::Perldoc::ToRtf' => 'cpan', + 'Pod::Perldoc::ToTerm' => 'cpan', + 'Pod::Perldoc::ToText' => 'cpan', + 'Pod::Perldoc::ToTk' => 'cpan', + 'Pod::Perldoc::ToXml' => 'cpan', + 'Pod::PlainText' => 'cpan', + 'Pod::Select' => 'cpan', + 'Pod::Simple' => 'cpan', + 'Pod::Simple::BlackBox' => 'cpan', + 'Pod::Simple::Checker' => 'cpan', + 'Pod::Simple::Debug' => 'cpan', + 'Pod::Simple::DumpAsText'=> 'cpan', + 'Pod::Simple::DumpAsXML'=> 'cpan', + 'Pod::Simple::HTML' => 'cpan', + 'Pod::Simple::HTMLBatch'=> 'cpan', + 'Pod::Simple::HTMLLegacy'=> 'cpan', + 'Pod::Simple::LinkSection'=> 'cpan', + 'Pod::Simple::Methody' => 'cpan', + 'Pod::Simple::Progress' => 'cpan', + 'Pod::Simple::PullParser'=> 'cpan', + 'Pod::Simple::PullParserEndToken'=> 'cpan', + 'Pod::Simple::PullParserStartToken'=> 'cpan', + 'Pod::Simple::PullParserTextToken'=> 'cpan', + 'Pod::Simple::PullParserToken'=> 'cpan', + 'Pod::Simple::RTF' => 'cpan', + 'Pod::Simple::Search' => 'cpan', + 'Pod::Simple::SimpleTree'=> 'cpan', + 'Pod::Simple::Text' => 'cpan', + 'Pod::Simple::TextContent'=> 'cpan', + 'Pod::Simple::TiedOutFH'=> 'cpan', + 'Pod::Simple::Transcode'=> 'cpan', + 'Pod::Simple::TranscodeDumb'=> 'cpan', + 'Pod::Simple::TranscodeSmart'=> 'cpan', + 'Pod::Simple::XHTML' => 'cpan', + 'Pod::Simple::XMLOutStream'=> 'cpan', + 'Pod::Text' => 'cpan', + 'Pod::Text::Color' => 'cpan', + 'Pod::Text::Overstrike' => 'cpan', + 'Pod::Text::Termcap' => 'cpan', + 'Pod::Usage' => 'cpan', + 'Scalar::Util' => 'cpan', + 'Socket' => 'cpan', + 'Sub::Util' => 'cpan', + 'Sys::Syslog' => 'cpan', + 'Sys::Syslog::Win32' => 'cpan', + 'TAP::Base' => 'cpan', + 'TAP::Formatter::Base' => 'cpan', + 'TAP::Formatter::Color' => 'cpan', + 'TAP::Formatter::Console'=> 'cpan', + 'TAP::Formatter::Console::ParallelSession'=> 'cpan', + 'TAP::Formatter::Console::Session'=> 'cpan', + 'TAP::Formatter::File' => 'cpan', + 'TAP::Formatter::File::Session'=> 'cpan', + 'TAP::Formatter::Session'=> 'cpan', + 'TAP::Harness' => 'cpan', + 'TAP::Harness::Env' => 'cpan', + 'TAP::Object' => 'cpan', + 'TAP::Parser' => 'cpan', + 'TAP::Parser::Aggregator'=> 'cpan', + 'TAP::Parser::Grammar' => 'cpan', + 'TAP::Parser::Iterator' => 'cpan', + 'TAP::Parser::Iterator::Array'=> 'cpan', + 'TAP::Parser::Iterator::Process'=> 'cpan', + 'TAP::Parser::Iterator::Stream'=> 'cpan', + 'TAP::Parser::IteratorFactory'=> 'cpan', + 'TAP::Parser::Multiplexer'=> 'cpan', + 'TAP::Parser::Result' => 'cpan', + 'TAP::Parser::Result::Bailout'=> 'cpan', + 'TAP::Parser::Result::Comment'=> 'cpan', + 'TAP::Parser::Result::Plan'=> 'cpan', + 'TAP::Parser::Result::Pragma'=> 'cpan', + 'TAP::Parser::Result::Test'=> 'cpan', + 'TAP::Parser::Result::Unknown'=> 'cpan', + 'TAP::Parser::Result::Version'=> 'cpan', + 'TAP::Parser::Result::YAML'=> 'cpan', + 'TAP::Parser::ResultFactory'=> 'cpan', + 'TAP::Parser::Scheduler'=> 'cpan', + 'TAP::Parser::Scheduler::Job'=> 'cpan', + 'TAP::Parser::Scheduler::Spinner'=> 'cpan', + 'TAP::Parser::Source' => 'cpan', + 'TAP::Parser::SourceHandler'=> 'cpan', + 'TAP::Parser::SourceHandler::Executable'=> 'cpan', + 'TAP::Parser::SourceHandler::File'=> 'cpan', + 'TAP::Parser::SourceHandler::Handle'=> 'cpan', + 'TAP::Parser::SourceHandler::Perl'=> 'cpan', + 'TAP::Parser::SourceHandler::RawTAP'=> 'cpan', + 'TAP::Parser::YAMLish::Reader'=> 'cpan', + 'TAP::Parser::YAMLish::Writer'=> 'cpan', + 'Term::ANSIColor' => 'cpan', + 'Term::Cap' => 'cpan', + 'Test2' => 'cpan', + 'Test2::API' => 'cpan', + 'Test2::API::Breakage' => 'cpan', + 'Test2::API::Context' => 'cpan', + 'Test2::API::Instance' => 'cpan', + 'Test2::API::Stack' => 'cpan', + 'Test2::Event' => 'cpan', + 'Test2::Event::Bail' => 'cpan', + 'Test2::Event::Diag' => 'cpan', + 'Test2::Event::Encoding'=> 'cpan', + 'Test2::Event::Exception'=> 'cpan', + 'Test2::Event::Fail' => 'cpan', + 'Test2::Event::Generic' => 'cpan', + 'Test2::Event::Note' => 'cpan', + 'Test2::Event::Ok' => 'cpan', + 'Test2::Event::Pass' => 'cpan', + 'Test2::Event::Plan' => 'cpan', + 'Test2::Event::Skip' => 'cpan', + 'Test2::Event::Subtest' => 'cpan', + 'Test2::Event::TAP::Version'=> 'cpan', + 'Test2::Event::V2' => 'cpan', + 'Test2::Event::Waiting' => 'cpan', + 'Test2::EventFacet' => 'cpan', + 'Test2::EventFacet::About'=> 'cpan', + 'Test2::EventFacet::Amnesty'=> 'cpan', + 'Test2::EventFacet::Assert'=> 'cpan', + 'Test2::EventFacet::Control'=> 'cpan', + 'Test2::EventFacet::Error'=> 'cpan', + 'Test2::EventFacet::Hub'=> 'cpan', + 'Test2::EventFacet::Info'=> 'cpan', + 'Test2::EventFacet::Meta'=> 'cpan', + 'Test2::EventFacet::Parent'=> 'cpan', + 'Test2::EventFacet::Plan'=> 'cpan', + 'Test2::EventFacet::Render'=> 'cpan', + 'Test2::EventFacet::Trace'=> 'cpan', + 'Test2::Formatter' => 'cpan', + 'Test2::Formatter::TAP' => 'cpan', + 'Test2::Hub' => 'cpan', + 'Test2::Hub::Interceptor'=> 'cpan', + 'Test2::Hub::Interceptor::Terminator'=> 'cpan', + 'Test2::Hub::Subtest' => 'cpan', + 'Test2::IPC' => 'cpan', + 'Test2::IPC::Driver' => 'cpan', + 'Test2::IPC::Driver::Files'=> 'cpan', + 'Test2::Tools::Tiny' => 'cpan', + 'Test2::Util' => 'cpan', + 'Test2::Util::ExternalMeta'=> 'cpan', + 'Test2::Util::Facets2Legacy'=> 'cpan', + 'Test2::Util::HashBase' => 'cpan', + 'Test2::Util::Trace' => 'cpan', + 'Test::Builder' => 'cpan', + 'Test::Builder::Formatter'=> 'cpan', + 'Test::Builder::IO::Scalar'=> 'cpan', + 'Test::Builder::Module' => 'cpan', + 'Test::Builder::Tester' => 'cpan', + 'Test::Builder::Tester::Color'=> 'cpan', + 'Test::Builder::TodoDiag'=> 'cpan', + 'Test::Harness' => 'cpan', + 'Test::More' => 'cpan', + 'Test::Simple' => 'cpan', + 'Test::Tester' => 'cpan', + 'Test::Tester::Capture' => 'cpan', + 'Test::Tester::CaptureRunner'=> 'cpan', + 'Test::Tester::Delegate'=> 'cpan', + 'Test::use::ok' => 'cpan', + 'Text::Balanced' => 'cpan', + 'Text::ParseWords' => 'cpan', + 'Text::Tabs' => 'cpan', + 'Text::Wrap' => 'cpan', + 'Tie::RefHash' => 'cpan', + 'Time::Local' => 'cpan', + 'Time::Piece' => 'cpan', + 'Time::Seconds' => 'cpan', + 'Unicode::Collate' => 'cpan', + 'Unicode::Collate::CJK::Big5'=> 'cpan', + 'Unicode::Collate::CJK::GB2312'=> 'cpan', + 'Unicode::Collate::CJK::JISX0208'=> 'cpan', + 'Unicode::Collate::CJK::Korean'=> 'cpan', + 'Unicode::Collate::CJK::Pinyin'=> 'cpan', + 'Unicode::Collate::CJK::Stroke'=> 'cpan', + 'Unicode::Collate::CJK::Zhuyin'=> 'cpan', + 'Unicode::Collate::Locale'=> 'cpan', + 'Win32' => 'cpan', + 'Win32API::File' => 'cpan', + 'Win32API::File::inc::ExtUtils::Myconst2perl'=> 'cpan', + 'autodie' => 'cpan', + 'autodie::Scope::Guard' => 'cpan', + 'autodie::Scope::GuardStack'=> 'cpan', + 'autodie::Util' => 'cpan', + 'autodie::exception' => 'cpan', + 'autodie::exception::system'=> 'cpan', + 'autodie::hints' => 'cpan', + 'autodie::skip' => 'cpan', + 'bigint' => 'cpan', + 'bignum' => 'cpan', + 'bigrat' => 'cpan', + 'encoding' => 'cpan', + 'experimental' => 'cpan', + 'ok' => 'cpan', + 'parent' => 'cpan', + 'perlfaq' => 'cpan', + 'version' => 'cpan', + 'version::regex' => 'cpan', +); + +%bug_tracker = ( + 'App::Cpan' => undef, + 'App::Prove' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'App::Prove::State' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'App::Prove::State::Result'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'App::Prove::State::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'Archive::Tar' => undef, + 'Archive::Tar::Constant'=> undef, + 'Archive::Tar::File' => undef, + 'B::Debug' => undef, + 'CPAN' => undef, + 'CPAN::Author' => undef, + 'CPAN::Bundle' => undef, + 'CPAN::CacheMgr' => undef, + 'CPAN::Complete' => undef, + 'CPAN::Debug' => undef, + 'CPAN::DeferredCode' => undef, + 'CPAN::Distribution' => undef, + 'CPAN::Distroprefs' => undef, + 'CPAN::Distrostatus' => undef, + 'CPAN::Exception::RecursiveDependency'=> undef, + 'CPAN::Exception::blocked_urllist'=> undef, + 'CPAN::Exception::yaml_not_installed'=> undef, + 'CPAN::Exception::yaml_process_error'=> undef, + 'CPAN::FTP' => undef, + 'CPAN::FTP::netrc' => undef, + 'CPAN::FirstTime' => undef, + 'CPAN::HTTP::Client' => undef, + 'CPAN::HTTP::Credentials'=> undef, + 'CPAN::HandleConfig' => undef, + 'CPAN::Index' => undef, + 'CPAN::InfoObj' => undef, + 'CPAN::Kwalify' => undef, + 'CPAN::LWP::UserAgent' => undef, + 'CPAN::Meta' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::Converter' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::Feature' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::History' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::Merge' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::Prereqs' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::Requirements'=> 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta-Requirements/issues', + 'CPAN::Meta::Spec' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::Validator' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'CPAN::Meta::YAML' => 'https://github.com/Perl-Toolchain-Gang/YAML-Tiny/issues', + 'CPAN::Mirrors' => undef, + 'CPAN::Module' => undef, + 'CPAN::Nox' => undef, + 'CPAN::Plugin' => undef, + 'CPAN::Plugin::Specfile'=> undef, + 'CPAN::Prompt' => undef, + 'CPAN::Queue' => undef, + 'CPAN::Shell' => undef, + 'CPAN::Tarzip' => undef, + 'CPAN::URL' => undef, + 'CPAN::Version' => undef, + 'Compress::Raw::Bzip2' => undef, + 'Compress::Raw::Zlib' => undef, + 'Compress::Zlib' => undef, + 'Config::Perl::V' => undef, + 'DB_File' => undef, + 'Digest' => undef, + 'Digest::MD5' => undef, + 'Digest::SHA' => undef, + 'Digest::base' => undef, + 'Digest::file' => undef, + 'Encode' => undef, + 'Encode::Alias' => undef, + 'Encode::Byte' => undef, + 'Encode::CJKConstants' => undef, + 'Encode::CN' => undef, + 'Encode::CN::HZ' => undef, + 'Encode::Config' => undef, + 'Encode::EBCDIC' => undef, + 'Encode::Encoder' => undef, + 'Encode::Encoding' => undef, + 'Encode::GSM0338' => undef, + 'Encode::Guess' => undef, + 'Encode::JP' => undef, + 'Encode::JP::H2Z' => undef, + 'Encode::JP::JIS7' => undef, + 'Encode::KR' => undef, + 'Encode::KR::2022_KR' => undef, + 'Encode::MIME::Header' => undef, + 'Encode::MIME::Header::ISO_2022_JP'=> undef, + 'Encode::MIME::Name' => undef, + 'Encode::Symbol' => undef, + 'Encode::TW' => undef, + 'Encode::Unicode' => undef, + 'Encode::Unicode::UTF7' => undef, + 'ExtUtils::Command' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::Command::MM' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::Constant' => undef, + 'ExtUtils::Constant::Base'=> undef, + 'ExtUtils::Constant::ProxySubs'=> undef, + 'ExtUtils::Constant::Utils'=> undef, + 'ExtUtils::Constant::XS'=> undef, + 'ExtUtils::Install' => 'https://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Install', + 'ExtUtils::Installed' => 'https://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Install', + 'ExtUtils::Liblist' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::Liblist::Kid'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_AIX' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_Any' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_BeOS' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_Cygwin' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_DOS' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_Darwin' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_MacOS' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_NW5' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_OS2' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_QNX' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_UWIN' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_Unix' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_VMS' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_VOS' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_Win32' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MM_Win95' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MY' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MakeMaker' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MakeMaker::Config'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MakeMaker::Locale'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MakeMaker::version'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::MakeMaker::version::regex'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::Manifest' => 'http://github.com/Perl-Toolchain-Gang/ExtUtils-Manifest/issues', + 'ExtUtils::Mkbootstrap' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::Mksymlists' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'ExtUtils::Packlist' => 'https://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-Install', + 'ExtUtils::testlib' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker', + 'Fatal' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'File::Fetch' => undef, + 'File::GlobMapper' => undef, + 'File::Path' => undef, + 'File::Temp' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=File-Temp', + 'Filter::Util::Call' => undef, + 'Getopt::Long' => undef, + 'HTTP::Tiny' => 'https://github.com/chansen/p5-http-tiny/issues', + 'IO::Compress::Adapter::Bzip2'=> undef, + 'IO::Compress::Adapter::Deflate'=> undef, + 'IO::Compress::Adapter::Identity'=> undef, + 'IO::Compress::Base' => undef, + 'IO::Compress::Base::Common'=> undef, + 'IO::Compress::Bzip2' => undef, + 'IO::Compress::Deflate' => undef, + 'IO::Compress::Gzip' => undef, + 'IO::Compress::Gzip::Constants'=> undef, + 'IO::Compress::RawDeflate'=> undef, + 'IO::Compress::Zip' => undef, + 'IO::Compress::Zip::Constants'=> undef, + 'IO::Compress::Zlib::Constants'=> undef, + 'IO::Compress::Zlib::Extra'=> undef, + 'IO::Socket::IP' => undef, + 'IO::Uncompress::Adapter::Bunzip2'=> undef, + 'IO::Uncompress::Adapter::Identity'=> undef, + 'IO::Uncompress::Adapter::Inflate'=> undef, + 'IO::Uncompress::AnyInflate'=> undef, + 'IO::Uncompress::AnyUncompress'=> undef, + 'IO::Uncompress::Base' => undef, + 'IO::Uncompress::Bunzip2'=> undef, + 'IO::Uncompress::Gunzip'=> undef, + 'IO::Uncompress::Inflate'=> undef, + 'IO::Uncompress::RawInflate'=> undef, + 'IO::Uncompress::Unzip' => undef, + 'IO::Zlib' => undef, + 'IPC::Cmd' => undef, + 'IPC::Msg' => undef, + 'IPC::Semaphore' => undef, + 'IPC::SharedMem' => undef, + 'IPC::SysV' => undef, + 'JSON::PP' => undef, + 'JSON::PP::Boolean' => undef, + 'List::Util' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils', + 'List::Util::XS' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils', + 'Locale::Codes' => undef, + 'Locale::Codes::Constants'=> undef, + 'Locale::Codes::Country'=> undef, + 'Locale::Codes::Country_Codes'=> undef, + 'Locale::Codes::Country_Retired'=> undef, + 'Locale::Codes::Currency'=> undef, + 'Locale::Codes::Currency_Codes'=> undef, + 'Locale::Codes::Currency_Retired'=> undef, + 'Locale::Codes::LangExt'=> undef, + 'Locale::Codes::LangExt_Codes'=> undef, + 'Locale::Codes::LangExt_Retired'=> undef, + 'Locale::Codes::LangFam'=> undef, + 'Locale::Codes::LangFam_Codes'=> undef, + 'Locale::Codes::LangFam_Retired'=> undef, + 'Locale::Codes::LangVar'=> undef, + 'Locale::Codes::LangVar_Codes'=> undef, + 'Locale::Codes::LangVar_Retired'=> undef, + 'Locale::Codes::Language'=> undef, + 'Locale::Codes::Language_Codes'=> undef, + 'Locale::Codes::Language_Retired'=> undef, + 'Locale::Codes::Script' => undef, + 'Locale::Codes::Script_Codes'=> undef, + 'Locale::Codes::Script_Retired'=> undef, + 'Locale::Country' => undef, + 'Locale::Currency' => undef, + 'Locale::Language' => undef, + 'Locale::Maketext::Simple'=> undef, + 'Locale::Script' => undef, + 'MIME::Base64' => undef, + 'MIME::QuotedPrint' => undef, + 'Math::BigFloat' => undef, + 'Math::BigFloat::Trace' => undef, + 'Math::BigInt' => undef, + 'Math::BigInt::Calc' => undef, + 'Math::BigInt::CalcEmu' => undef, + 'Math::BigInt::FastCalc'=> undef, + 'Math::BigInt::Lib' => undef, + 'Math::BigInt::Trace' => undef, + 'Math::BigRat' => undef, + 'Math::Complex' => undef, + 'Math::Trig' => undef, + 'Memoize' => undef, + 'Memoize::AnyDBM_File' => undef, + 'Memoize::Expire' => undef, + 'Memoize::ExpireFile' => undef, + 'Memoize::ExpireTest' => undef, + 'Memoize::NDBM_File' => undef, + 'Memoize::SDBM_File' => undef, + 'Memoize::Storable' => undef, + 'Module::Load' => undef, + 'Module::Load::Conditional'=> undef, + 'Module::Loaded' => undef, + 'Module::Metadata' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Module-Metadata', + 'NEXT' => undef, + 'Net::Cmd' => undef, + 'Net::Config' => undef, + 'Net::Domain' => undef, + 'Net::FTP' => undef, + 'Net::FTP::A' => undef, + 'Net::FTP::E' => undef, + 'Net::FTP::I' => undef, + 'Net::FTP::L' => undef, + 'Net::FTP::dataconn' => undef, + 'Net::NNTP' => undef, + 'Net::Netrc' => undef, + 'Net::POP3' => undef, + 'Net::SMTP' => undef, + 'Net::Time' => undef, + 'Params::Check' => undef, + 'Parse::CPAN::Meta' => 'https://github.com/Perl-Toolchain-Gang/CPAN-Meta/issues', + 'Perl::OSType' => 'https://github.com/Perl-Toolchain-Gang/Perl-OSType/issues', + 'PerlIO::via::QuotedPrint'=> undef, + 'Pod::Checker' => undef, + 'Pod::Escapes' => undef, + 'Pod::Find' => undef, + 'Pod::InputObjects' => undef, + 'Pod::Man' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + 'Pod::ParseLink' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + 'Pod::ParseUtils' => undef, + 'Pod::Parser' => undef, + 'Pod::Perldoc' => undef, + 'Pod::Perldoc::BaseTo' => undef, + 'Pod::Perldoc::GetOptsOO'=> undef, + 'Pod::Perldoc::ToANSI' => undef, + 'Pod::Perldoc::ToChecker'=> undef, + 'Pod::Perldoc::ToMan' => undef, + 'Pod::Perldoc::ToNroff' => undef, + 'Pod::Perldoc::ToPod' => undef, + 'Pod::Perldoc::ToRtf' => undef, + 'Pod::Perldoc::ToTerm' => undef, + 'Pod::Perldoc::ToText' => undef, + 'Pod::Perldoc::ToTk' => undef, + 'Pod::Perldoc::ToXml' => undef, + 'Pod::PlainText' => undef, + 'Pod::Select' => undef, + 'Pod::Simple' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::BlackBox' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Checker' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Debug' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::DumpAsText'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::DumpAsXML'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::HTML' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::HTMLBatch'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::HTMLLegacy'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::LinkSection'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Methody' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Progress' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::PullParser'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::PullParserEndToken'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::PullParserStartToken'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::PullParserTextToken'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::PullParserToken'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::RTF' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Search' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::SimpleTree'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Text' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::TextContent'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::TiedOutFH'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::Transcode'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::TranscodeDumb'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::TranscodeSmart'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::XHTML' => 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Simple::XMLOutStream'=> 'https://github.com/perl-pod/pod-simple/issues', + 'Pod::Text' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + 'Pod::Text::Color' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + 'Pod::Text::Overstrike' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + 'Pod::Text::Termcap' => 'https://rt.cpan.org/Dist/Display.html?Name=podlators', + 'Pod::Usage' => undef, + 'Scalar::Util' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils', + 'Socket' => undef, + 'Sub::Util' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=Scalar-List-Utils', + 'Sys::Syslog' => undef, + 'Sys::Syslog::Win32' => undef, + 'TAP::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::Base' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::Color' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::Console'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::Console::ParallelSession'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::Console::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::File' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::File::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Formatter::Session'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Harness::Env' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Object' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Aggregator'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Grammar' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Iterator' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Iterator::Array'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Iterator::Process'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Iterator::Stream'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::IteratorFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Multiplexer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Bailout'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Comment'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Plan'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Pragma'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Test'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Unknown'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::Version'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Result::YAML'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::ResultFactory'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Scheduler'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Scheduler::Job'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Scheduler::Spinner'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::Source' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::SourceHandler'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::SourceHandler::Executable'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::SourceHandler::File'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::SourceHandler::Handle'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::SourceHandler::Perl'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::SourceHandler::RawTAP'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::YAMLish::Reader'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'TAP::Parser::YAMLish::Writer'=> 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'Term::ANSIColor' => 'https://rt.cpan.org/Dist/Display.html?Name=Term-ANSIColor', + 'Term::Cap' => undef, + 'Test2' => 'http://github.com/Test-More/test-more/issues', + 'Test2::API' => 'http://github.com/Test-More/test-more/issues', + 'Test2::API::Breakage' => 'http://github.com/Test-More/test-more/issues', + 'Test2::API::Context' => 'http://github.com/Test-More/test-more/issues', + 'Test2::API::Instance' => 'http://github.com/Test-More/test-more/issues', + 'Test2::API::Stack' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Bail' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Diag' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Encoding'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Exception'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Fail' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Generic' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Note' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Ok' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Pass' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Plan' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Skip' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Subtest' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::TAP::Version'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::V2' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Event::Waiting' => 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet' => 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::About'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Amnesty'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Assert'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Control'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Error'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Hub'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Info'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Meta'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Parent'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Plan'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Render'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::EventFacet::Trace'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Formatter' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Formatter::TAP' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Hub' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Hub::Interceptor'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Hub::Interceptor::Terminator'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Hub::Subtest' => 'http://github.com/Test-More/test-more/issues', + 'Test2::IPC' => 'http://github.com/Test-More/test-more/issues', + 'Test2::IPC::Driver' => 'http://github.com/Test-More/test-more/issues', + 'Test2::IPC::Driver::Files'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Tools::Tiny' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Util' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Util::ExternalMeta'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Util::Facets2Legacy'=> 'http://github.com/Test-More/test-more/issues', + 'Test2::Util::HashBase' => 'http://github.com/Test-More/test-more/issues', + 'Test2::Util::Trace' => 'http://github.com/Test-More/test-more/issues', + 'Test::Builder' => 'http://github.com/Test-More/test-more/issues', + 'Test::Builder::Formatter'=> 'http://github.com/Test-More/test-more/issues', + 'Test::Builder::IO::Scalar'=> 'http://github.com/Test-More/test-more/issues', + 'Test::Builder::Module' => 'http://github.com/Test-More/test-more/issues', + 'Test::Builder::Tester' => 'http://github.com/Test-More/test-more/issues', + 'Test::Builder::Tester::Color'=> 'http://github.com/Test-More/test-more/issues', + 'Test::Builder::TodoDiag'=> 'http://github.com/Test-More/test-more/issues', + 'Test::Harness' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=Test-Harness', + 'Test::More' => 'http://github.com/Test-More/test-more/issues', + 'Test::Simple' => 'http://github.com/Test-More/test-more/issues', + 'Test::Tester' => 'http://github.com/Test-More/test-more/issues', + 'Test::Tester::Capture' => 'http://github.com/Test-More/test-more/issues', + 'Test::Tester::CaptureRunner'=> 'http://github.com/Test-More/test-more/issues', + 'Test::Tester::Delegate'=> 'http://github.com/Test-More/test-more/issues', + 'Test::use::ok' => 'http://github.com/Test-More/test-more/issues', + 'Text::Balanced' => undef, + 'Text::ParseWords' => undef, + 'Text::Tabs' => undef, + 'Text::Wrap' => undef, + 'Tie::RefHash' => undef, + 'Time::Local' => 'https://github.com/houseabsolute/Time-Local/issues', + 'Time::Piece' => undef, + 'Time::Seconds' => undef, + 'Unicode::Collate' => undef, + 'Unicode::Collate::CJK::Big5'=> undef, + 'Unicode::Collate::CJK::GB2312'=> undef, + 'Unicode::Collate::CJK::JISX0208'=> undef, + 'Unicode::Collate::CJK::Korean'=> undef, + 'Unicode::Collate::CJK::Pinyin'=> undef, + 'Unicode::Collate::CJK::Stroke'=> undef, + 'Unicode::Collate::CJK::Zhuyin'=> undef, + 'Unicode::Collate::Locale'=> undef, + 'Win32' => undef, + 'Win32API::File' => undef, + 'Win32API::File::inc::ExtUtils::Myconst2perl'=> undef, + 'autodie' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::Scope::Guard' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::Scope::GuardStack'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::Util' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::exception' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::exception::system'=> 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::hints' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'autodie::skip' => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=autodie', + 'bigint' => undef, + 'bignum' => undef, + 'bigrat' => undef, + 'encoding' => undef, + 'experimental' => 'http://rt.cpan.org/Public/Dist/Display.html?Name=experimental', + 'ok' => 'http://github.com/Test-More/test-more/issues', + 'parent' => undef, + 'perlfaq' => 'https://github.com/perl-doc-cats/perlfaq/issues', + 'version' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=version', + 'version::regex' => 'https://rt.cpan.org/Public/Dist/Display.html?Name=version', +); + +# Create aliases with trailing zeros for $] use + +$released{'5.000'} = $released{5}; +$version{'5.000'} = $version{5}; + +_create_aliases(\%delta); +_create_aliases(\%released); +_create_aliases(\%version); +_create_aliases(\%deprecated); + +sub _create_aliases { + my ($hash) = @_; + + for my $version (keys %$hash) { + next unless $version >= 5.006; + + my $padded = sprintf "%0.6f", $version; + + # If the version in string form isn't the same as the numeric version, + # alias it. + if ($padded ne $version && $version == $padded) { + $hash->{$padded} = $hash->{$version}; + } + } +} + +1; +__END__ +# -*- mode: cperl; tab-width: 8; indent-tabs-mode: nil; basic-offset: 2 -*- +# vim:ts=8:sw=2:et:sta:sts=2:tw=78 +package Module::Metadata; # git description: v1.000032-7-gb4e8a3f +# ABSTRACT: Gather package and POD information from perl module files + +# Adapted from Perl-licensed code originally distributed with +# Module-Build by Ken Williams + +# This module provides routines to gather information about +# perl modules (assuming this may be expanded in the distant +# parrot future to look at other types of modules). + +sub __clean_eval { eval $_[0] } +use strict; +use warnings; + +our $VERSION = '1.000033'; + +use Carp qw/croak/; +use File::Spec; +BEGIN { + # Try really hard to not depend ony any DynaLoaded module, such as IO::File or Fcntl + eval { + require Fcntl; Fcntl->import('SEEK_SET'); 1; + } or *SEEK_SET = sub { 0 } +} +use version 0.87; +BEGIN { + if ($INC{'Log/Contextual.pm'}) { + require "Log/Contextual/WarnLogger.pm"; # Hide from AutoPrereqs + Log::Contextual->import('log_info', + '-default_logger' => Log::Contextual::WarnLogger->new({ env_prefix => 'MODULE_METADATA', }), + ); + } + else { + *log_info = sub (&) { warn $_[0]->() }; + } +} +use File::Find qw(find); + +my $V_NUM_REGEXP = qr{v?[0-9._]+}; # crudely, a v-string or decimal + +my $PKG_FIRST_WORD_REGEXP = qr{ # the FIRST word in a package name + [a-zA-Z_] # the first word CANNOT start with a digit + (?: + [\w']? # can contain letters, digits, _, or ticks + \w # But, NO multi-ticks or trailing ticks + )* +}x; + +my $PKG_ADDL_WORD_REGEXP = qr{ # the 2nd+ word in a package name + \w # the 2nd+ word CAN start with digits + (?: + [\w']? # and can contain letters or ticks + \w # But, NO multi-ticks or trailing ticks + )* +}x; + +my $PKG_NAME_REGEXP = qr{ # match a package name + (?: :: )? # a pkg name can start with arisdottle + $PKG_FIRST_WORD_REGEXP # a package word + (?: + (?: :: )+ ### arisdottle (allow one or many times) + $PKG_ADDL_WORD_REGEXP ### a package word + )* # ^ zero, one or many times + (?: + :: # allow trailing arisdottle + )? +}x; + +my $PKG_REGEXP = qr{ # match a package declaration + ^[\s\{;]* # intro chars on a line + package # the word 'package' + \s+ # whitespace + ($PKG_NAME_REGEXP) # a package name + \s* # optional whitespace + ($V_NUM_REGEXP)? # optional version number + \s* # optional whitesapce + [;\{] # semicolon line terminator or block start (since 5.16) +}x; + +my $VARNAME_REGEXP = qr{ # match fully-qualified VERSION name + ([\$*]) # sigil - $ or * + ( + ( # optional leading package name + (?:::|\')? # possibly starting like just :: (a la $::VERSION) + (?:\w+(?:::|\'))* # Foo::Bar:: ... + )? + VERSION + )\b +}x; + +my $VERS_REGEXP = qr{ # match a VERSION definition + (?: + \(\s*$VARNAME_REGEXP\s*\) # with parens + | + $VARNAME_REGEXP # without parens + ) + \s* + =[^=~>] # = but not ==, nor =~, nor => +}x; + +sub new_from_file { + my $class = shift; + my $filename = File::Spec->rel2abs( shift ); + + return undef unless defined( $filename ) && -f $filename; + return $class->_init(undef, $filename, @_); +} + +sub new_from_handle { + my $class = shift; + my $handle = shift; + my $filename = shift; + return undef unless defined($handle) && defined($filename); + $filename = File::Spec->rel2abs( $filename ); + + return $class->_init(undef, $filename, @_, handle => $handle); + +} + + +sub new_from_module { + my $class = shift; + my $module = shift; + my %props = @_; + + $props{inc} ||= \@INC; + my $filename = $class->find_module_by_name( $module, $props{inc} ); + return undef unless defined( $filename ) && -f $filename; + return $class->_init($module, $filename, %props); +} + +{ + + my $compare_versions = sub { + my ($v1, $op, $v2) = @_; + $v1 = version->new($v1) + unless UNIVERSAL::isa($v1,'version'); + + my $eval_str = "\$v1 $op \$v2"; + my $result = eval $eval_str; + log_info { "error comparing versions: '$eval_str' $@" } if $@; + + return $result; + }; + + my $normalize_version = sub { + my ($version) = @_; + if ( $version =~ /[=<>!,]/ ) { # logic, not just version + # take as is without modification + } + elsif ( ref $version eq 'version' ) { # version objects + $version = $version->is_qv ? $version->normal : $version->stringify; + } + elsif ( $version =~ /^[^v][^.]*\.[^.]+\./ ) { # no leading v, multiple dots + # normalize string tuples without "v": "1.2.3" -> "v1.2.3" + $version = "v$version"; + } + else { + # leave alone + } + return $version; + }; + + # separate out some of the conflict resolution logic + + my $resolve_module_versions = sub { + my $packages = shift; + + my( $file, $version ); + my $err = ''; + foreach my $p ( @$packages ) { + if ( defined( $p->{version} ) ) { + if ( defined( $version ) ) { + if ( $compare_versions->( $version, '!=', $p->{version} ) ) { + $err .= " $p->{file} ($p->{version})\n"; + } + else { + # same version declared multiple times, ignore + } + } + else { + $file = $p->{file}; + $version = $p->{version}; + } + } + $file ||= $p->{file} if defined( $p->{file} ); + } + + if ( $err ) { + $err = " $file ($version)\n" . $err; + } + + my %result = ( + file => $file, + version => $version, + err => $err + ); + + return \%result; + }; + + sub provides { + my $class = shift; + + croak "provides() requires key/value pairs \n" if @_ % 2; + my %args = @_; + + croak "provides() takes only one of 'dir' or 'files'\n" + if $args{dir} && $args{files}; + + croak "provides() requires a 'version' argument" + unless defined $args{version}; + + croak "provides() does not support version '$args{version}' metadata" + unless grep { $args{version} eq $_ } qw/1.4 2/; + + $args{prefix} = 'lib' unless defined $args{prefix}; + + my $p; + if ( $args{dir} ) { + $p = $class->package_versions_from_directory($args{dir}); + } + else { + croak "provides() requires 'files' to be an array reference\n" + unless ref $args{files} eq 'ARRAY'; + $p = $class->package_versions_from_directory($args{files}); + } + + # Now, fix up files with prefix + if ( length $args{prefix} ) { # check in case disabled with q{} + $args{prefix} =~ s{/$}{}; + for my $v ( values %$p ) { + $v->{file} = "$args{prefix}/$v->{file}"; + } + } + + return $p + } + + sub package_versions_from_directory { + my ( $class, $dir, $files ) = @_; + + my @files; + + if ( $files ) { + @files = @$files; + } + else { + find( { + wanted => sub { + push @files, $_ if -f $_ && /\.pm$/; + }, + no_chdir => 1, + }, $dir ); + } + + # First, we enumerate all packages & versions, + # separating into primary & alternative candidates + my( %prime, %alt ); + foreach my $file (@files) { + my $mapped_filename = File::Spec::Unix->abs2rel( $file, $dir ); + my @path = split( /\//, $mapped_filename ); + (my $prime_package = join( '::', @path )) =~ s/\.pm$//; + + my $pm_info = $class->new_from_file( $file ); + + foreach my $package ( $pm_info->packages_inside ) { + next if $package eq 'main'; # main can appear numerous times, ignore + next if $package eq 'DB'; # special debugging package, ignore + next if grep /^_/, split( /::/, $package ); # private package, ignore + + my $version = $pm_info->version( $package ); + + $prime_package = $package if lc($prime_package) eq lc($package); + if ( $package eq $prime_package ) { + if ( exists( $prime{$package} ) ) { + croak "Unexpected conflict in '$package'; multiple versions found.\n"; + } + else { + $mapped_filename = "$package.pm" if lc("$package.pm") eq lc($mapped_filename); + $prime{$package}{file} = $mapped_filename; + $prime{$package}{version} = $version if defined( $version ); + } + } + else { + push( @{$alt{$package}}, { + file => $mapped_filename, + version => $version, + } ); + } + } + } + + # Then we iterate over all the packages found above, identifying conflicts + # and selecting the "best" candidate for recording the file & version + # for each package. + foreach my $package ( keys( %alt ) ) { + my $result = $resolve_module_versions->( $alt{$package} ); + + if ( exists( $prime{$package} ) ) { # primary package selected + + if ( $result->{err} ) { + # Use the selected primary package, but there are conflicting + # errors among multiple alternative packages that need to be + # reported + log_info { + "Found conflicting versions for package '$package'\n" . + " $prime{$package}{file} ($prime{$package}{version})\n" . + $result->{err} + }; + + } + elsif ( defined( $result->{version} ) ) { + # There is a primary package selected, and exactly one + # alternative package + + if ( exists( $prime{$package}{version} ) && + defined( $prime{$package}{version} ) ) { + # Unless the version of the primary package agrees with the + # version of the alternative package, report a conflict + if ( $compare_versions->( + $prime{$package}{version}, '!=', $result->{version} + ) + ) { + + log_info { + "Found conflicting versions for package '$package'\n" . + " $prime{$package}{file} ($prime{$package}{version})\n" . + " $result->{file} ($result->{version})\n" + }; + } + + } + else { + # The prime package selected has no version so, we choose to + # use any alternative package that does have a version + $prime{$package}{file} = $result->{file}; + $prime{$package}{version} = $result->{version}; + } + + } + else { + # no alt package found with a version, but we have a prime + # package so we use it whether it has a version or not + } + + } + else { # No primary package was selected, use the best alternative + + if ( $result->{err} ) { + log_info { + "Found conflicting versions for package '$package'\n" . + $result->{err} + }; + } + + # Despite possible conflicting versions, we choose to record + # something rather than nothing + $prime{$package}{file} = $result->{file}; + $prime{$package}{version} = $result->{version} + if defined( $result->{version} ); + } + } + + # Normalize versions. Can't use exists() here because of bug in YAML::Node. + # XXX "bug in YAML::Node" comment seems irrelevant -- dagolden, 2009-05-18 + for (grep defined $_->{version}, values %prime) { + $_->{version} = $normalize_version->( $_->{version} ); + } + + return \%prime; + } +} + + +sub _init { + my $class = shift; + my $module = shift; + my $filename = shift; + my %props = @_; + + my $handle = delete $props{handle}; + my( %valid_props, @valid_props ); + @valid_props = qw( collect_pod inc ); + @valid_props{@valid_props} = delete( @props{@valid_props} ); + warn "Unknown properties: @{[keys %props]}\n" if scalar( %props ); + + my %data = ( + module => $module, + filename => $filename, + version => undef, + packages => [], + versions => {}, + pod => {}, + pod_headings => [], + collect_pod => 0, + + %valid_props, + ); + + my $self = bless(\%data, $class); + + if ( not $handle ) { + my $filename = $self->{filename}; + open $handle, '<', $filename + or croak( "Can't open '$filename': $!" ); + + $self->_handle_bom($handle, $filename); + } + $self->_parse_fh($handle); + + @{$self->{packages}} = __uniq(@{$self->{packages}}); + + unless($self->{module} and length($self->{module})) { + # CAVEAT (possible TODO): .pmc files not treated the same as .pm + if ($self->{filename} =~ /\.pm$/) { + my ($v, $d, $f) = File::Spec->splitpath($self->{filename}); + $f =~ s/\..+$//; + my @candidates = grep /(^|::)$f$/, @{$self->{packages}}; + $self->{module} = shift(@candidates); # this may be undef + } + else { + # this seems like an atrocious heuristic, albeit marginally better than + # what was here before. It should be rewritten entirely to be more like + # "if it's not a .pm file, it's not require()able as a name, therefore + # name() should be undef." + if ((grep /main/, @{$self->{packages}}) + or (grep /main/, keys %{$self->{versions}})) { + $self->{module} = 'main'; + } + else { + # TODO: this should maybe default to undef instead + $self->{module} = $self->{packages}[0] || ''; + } + } + } + + $self->{version} = $self->{versions}{$self->{module}} + if defined( $self->{module} ); + + return $self; +} + +# class method +sub _do_find_module { + my $class = shift; + my $module = shift || croak 'find_module_by_name() requires a package name'; + my $dirs = shift || \@INC; + + my $file = File::Spec->catfile(split( /::/, $module)); + foreach my $dir ( @$dirs ) { + my $testfile = File::Spec->catfile($dir, $file); + return [ File::Spec->rel2abs( $testfile ), $dir ] + if -e $testfile and !-d _; # For stuff like ExtUtils::xsubpp + # CAVEAT (possible TODO): .pmc files are not discoverable here + $testfile .= '.pm'; + return [ File::Spec->rel2abs( $testfile ), $dir ] + if -e $testfile; + } + return; +} + +# class method +sub find_module_by_name { + my $found = shift()->_do_find_module(@_) or return; + return $found->[0]; +} + +# class method +sub find_module_dir_by_name { + my $found = shift()->_do_find_module(@_) or return; + return $found->[1]; +} + + +# given a line of perl code, attempt to parse it if it looks like a +# $VERSION assignment, returning sigil, full name, & package name +sub _parse_version_expression { + my $self = shift; + my $line = shift; + + my( $sigil, $variable_name, $package); + if ( $line =~ /$VERS_REGEXP/o ) { + ( $sigil, $variable_name, $package) = $2 ? ( $1, $2, $3 ) : ( $4, $5, $6 ); + if ( $package ) { + $package = ($package eq '::') ? 'main' : $package; + $package =~ s/::$//; + } + } + + return ( $sigil, $variable_name, $package ); +} + +# Look for a UTF-8/UTF-16BE/UTF-16LE BOM at the beginning of the stream. +# If there's one, then skip it and set the :encoding layer appropriately. +sub _handle_bom { + my ($self, $fh, $filename) = @_; + + my $pos = tell $fh; + return unless defined $pos; + + my $buf = ' ' x 2; + my $count = read $fh, $buf, length $buf; + return unless defined $count and $count >= 2; + + my $encoding; + if ( $buf eq "\x{FE}\x{FF}" ) { + $encoding = 'UTF-16BE'; + } + elsif ( $buf eq "\x{FF}\x{FE}" ) { + $encoding = 'UTF-16LE'; + } + elsif ( $buf eq "\x{EF}\x{BB}" ) { + $buf = ' '; + $count = read $fh, $buf, length $buf; + if ( defined $count and $count >= 1 and $buf eq "\x{BF}" ) { + $encoding = 'UTF-8'; + } + } + + if ( defined $encoding ) { + if ( "$]" >= 5.008 ) { + binmode( $fh, ":encoding($encoding)" ); + } + } + else { + seek $fh, $pos, SEEK_SET + or croak( sprintf "Can't reset position to the top of '$filename'" ); + } + + return $encoding; +} + +sub _parse_fh { + my ($self, $fh) = @_; + + my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 ); + my( @packages, %vers, %pod, @pod ); + my $package = 'main'; + my $pod_sect = ''; + my $pod_data = ''; + my $in_end = 0; + + while (defined( my $line = <$fh> )) { + my $line_num = $.; + + chomp( $line ); + + # From toke.c : any line that begins by "=X", where X is an alphabetic + # character, introduces a POD segment. + my $is_cut; + if ( $line =~ /^=([a-zA-Z].*)/ ) { + my $cmd = $1; + # Then it goes back to Perl code for "=cutX" where X is a non-alphabetic + # character (which includes the newline, but here we chomped it away). + $is_cut = $cmd =~ /^cut(?:[^a-zA-Z]|$)/; + $in_pod = !$is_cut; + } + + if ( $in_pod ) { + + if ( $line =~ /^=head[1-4]\s+(.+)\s*$/ ) { + push( @pod, $1 ); + if ( $self->{collect_pod} && length( $pod_data ) ) { + $pod{$pod_sect} = $pod_data; + $pod_data = ''; + } + $pod_sect = $1; + } + elsif ( $self->{collect_pod} ) { + $pod_data .= "$line\n"; + } + next; + } + elsif ( $is_cut ) { + if ( $self->{collect_pod} && length( $pod_data ) ) { + $pod{$pod_sect} = $pod_data; + $pod_data = ''; + } + $pod_sect = ''; + next; + } + + # Skip after __END__ + next if $in_end; + + # Skip comments in code + next if $line =~ /^\s*#/; + + # Would be nice if we could also check $in_string or something too + if ($line eq '__END__') { + $in_end++; + next; + } + + last if $line eq '__DATA__'; + + # parse $line to see if it's a $VERSION declaration + my( $version_sigil, $version_fullname, $version_package ) = + index($line, 'VERSION') >= 1 + ? $self->_parse_version_expression( $line ) + : (); + + if ( $line =~ /$PKG_REGEXP/o ) { + $package = $1; + my $version = $2; + push( @packages, $package ) unless grep( $package eq $_, @packages ); + $need_vers = defined $version ? 0 : 1; + + if ( not exists $vers{$package} and defined $version ){ + # Upgrade to a version object. + my $dwim_version = eval { _dwim_version($version) }; + croak "Version '$version' from $self->{filename} does not appear to be valid:\n$line\n\nThe fatal error was: $@\n" + unless defined $dwim_version; # "0" is OK! + $vers{$package} = $dwim_version; + } + } + + # VERSION defined with full package spec, i.e. $Module::VERSION + elsif ( $version_fullname && $version_package ) { + # we do NOT save this package in found @packages + $need_vers = 0 if $version_package eq $package; + + unless ( defined $vers{$version_package} && length $vers{$version_package} ) { + $vers{$version_package} = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line ); + } + } + + # first non-comment line in undeclared package main is VERSION + elsif ( $package eq 'main' && $version_fullname && !exists($vers{main}) ) { + $need_vers = 0; + my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line ); + $vers{$package} = $v; + push( @packages, 'main' ); + } + + # first non-comment line in undeclared package defines package main + elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w/ ) { + $need_vers = 1; + $vers{main} = ''; + push( @packages, 'main' ); + } + + # only keep if this is the first $VERSION seen + elsif ( $version_fullname && $need_vers ) { + $need_vers = 0; + my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line ); + + unless ( defined $vers{$package} && length $vers{$package} ) { + $vers{$package} = $v; + } + } + } # end loop over each line + + if ( $self->{collect_pod} && length($pod_data) ) { + $pod{$pod_sect} = $pod_data; + } + + $self->{versions} = \%vers; + $self->{packages} = \@packages; + $self->{pod} = \%pod; + $self->{pod_headings} = \@pod; +} + +sub __uniq (@) +{ + my (%seen, $key); + grep { not $seen{ $key = $_ }++ } @_; +} + +{ +my $pn = 0; +sub _evaluate_version_line { + my $self = shift; + my( $sigil, $variable_name, $line ) = @_; + + # We compile into a local sub because 'use version' would cause + # compiletime/runtime issues with local() + $pn++; # everybody gets their own package + my $eval = qq{ my \$dummy = q# Hide from _packages_inside() + #; package Module::Metadata::_version::p${pn}; + use version; + sub { + local $sigil$variable_name; + $line; + return \$$variable_name if defined \$$variable_name; + return \$Module::Metadata::_version::p${pn}::$variable_name; + }; + }; + + $eval = $1 if $eval =~ m{^(.+)}s; + + local $^W; + # Try to get the $VERSION + my $vsub = __clean_eval($eval); + # some modules say $VERSION <equal sign> $Foo::Bar::VERSION, but Foo::Bar isn't + # installed, so we need to hunt in ./lib for it + if ( $@ =~ /Can't locate/ && -d 'lib' ) { + local @INC = ('lib',@INC); + $vsub = __clean_eval($eval); + } + warn "Error evaling version line '$eval' in $self->{filename}: $@\n" + if $@; + + (ref($vsub) eq 'CODE') or + croak "failed to build version sub for $self->{filename}"; + + my $result = eval { $vsub->() }; + # FIXME: $eval is not the right thing to print here + croak "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n" + if $@; + + # Upgrade it into a version object + my $version = eval { _dwim_version($result) }; + + # FIXME: $eval is not the right thing to print here + croak "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n" + unless defined $version; # "0" is OK! + + return $version; +} +} + +# Try to DWIM when things fail the lax version test in obvious ways +{ + my @version_prep = ( + # Best case, it just works + sub { return shift }, + + # If we still don't have a version, try stripping any + # trailing junk that is prohibited by lax rules + sub { + my $v = shift; + $v =~ s{([0-9])[a-z-].*$}{$1}i; # 1.23-alpha or 1.23b + return $v; + }, + + # Activestate apparently creates custom versions like '1.23_45_01', which + # cause version.pm to think it's an invalid alpha. So check for that + # and strip them + sub { + my $v = shift; + my $num_dots = () = $v =~ m{(\.)}g; + my $num_unders = () = $v =~ m{(_)}g; + my $leading_v = substr($v,0,1) eq 'v'; + if ( ! $leading_v && $num_dots < 2 && $num_unders > 1 ) { + $v =~ s{_}{}g; + $num_unders = () = $v =~ m{(_)}g; + } + return $v; + }, + + # Worst case, try numifying it like we would have before version objects + sub { + my $v = shift; + no warnings 'numeric'; + return 0 + $v; + }, + + ); + + sub _dwim_version { + my ($result) = shift; + + return $result if ref($result) eq 'version'; + + my ($version, $error); + for my $f (@version_prep) { + $result = $f->($result); + $version = eval { version->new($result) }; + $error ||= $@ if $@; # capture first failure + last if defined $version; + } + + croak $error unless defined $version; + + return $version; + } +} + +############################################################ + +# accessors +sub name { $_[0]->{module} } + +sub filename { $_[0]->{filename} } +sub packages_inside { @{$_[0]->{packages}} } +sub pod_inside { @{$_[0]->{pod_headings}} } +sub contains_pod { 0+@{$_[0]->{pod_headings}} } + +sub version { + my $self = shift; + my $mod = shift || $self->{module}; + my $vers; + if ( defined( $mod ) && length( $mod ) && + exists( $self->{versions}{$mod} ) ) { + return $self->{versions}{$mod}; + } + else { + return undef; + } +} + +sub pod { + my $self = shift; + my $sect = shift; + if ( defined( $sect ) && length( $sect ) && + exists( $self->{pod}{$sect} ) ) { + return $self->{pod}{$sect}; + } + else { + return undef; + } +} + +sub is_indexable { + my ($self, $package) = @_; + + my @indexable_packages = grep { $_ ne 'main' } $self->packages_inside; + + # check for specific package, if provided + return !! grep { $_ eq $package } @indexable_packages if $package; + + # otherwise, check for any indexable packages at all + return !! @indexable_packages; +} + +1; + +__END__ + +package Module::Load; + +$VERSION = '0.32'; + +use strict; +use warnings; +use File::Spec (); + +sub import { + my $who = _who(); + my $h; shift; + + { no strict 'refs'; + + @_ or ( + *{"${who}::load"} = \&load, # compat to prev version + *{"${who}::autoload"} = \&autoload, + return + ); + + map { $h->{$_} = () if defined $_ } @_; + + (exists $h->{none} or exists $h->{''}) + and shift, last; + + ((exists $h->{autoload} and shift,1) or (exists $h->{all} and shift)) + and *{"${who}::autoload"} = \&autoload; + + ((exists $h->{load} and shift,1) or exists $h->{all}) + and *{"${who}::load"} = \&load; + + ((exists $h->{load_remote} and shift,1) or exists $h->{all}) + and *{"${who}::load_remote"} = \&load_remote; + + ((exists $h->{autoload_remote} and shift,1) or exists $h->{all}) + and *{"${who}::autoload_remote"} = \&autoload_remote; + + } + +} + +sub load(*;@){ + goto &_load; +} + +sub autoload(*;@){ + unshift @_, 'autoimport'; + goto &_load; +} + +sub load_remote($$;@){ + my ($dst, $src, @exp) = @_; + + eval "package $dst;Module::Load::load('$src', qw/@exp/);"; + $@ && die "$@"; +} + +sub autoload_remote($$;@){ + my ($dst, $src, @exp) = @_; + + eval "package $dst;Module::Load::autoload('$src', qw/@exp/);"; + $@ && die "$@"; +} + +sub _load{ + my $autoimport = $_[0] eq 'autoimport' and shift; + my $mod = shift or return; + my $who = _who(); + + if( _is_file( $mod ) ) { + require $mod; + } else { + LOAD: { + my $err; + for my $flag ( qw[1 0] ) { + my $file = _to_file( $mod, $flag); + eval { require $file }; + $@ ? $err .= $@ : last LOAD; + } + die $err if $err; + } + } + + ### This addresses #41883: Module::Load cannot import + ### non-Exporter module. ->import() routines weren't + ### properly called when load() was used. + + { no strict 'refs'; + my $import; + + ((@_ or $autoimport) and ( + $import = $mod->can('import') + ) and ( + unshift(@_, $mod), + goto &$import, + return + ) + ); + } + +} + +sub _to_file{ + local $_ = shift; + my $pm = shift || ''; + + ## trailing blanks ignored by default. [rt #69886] + my @parts = split /::|'/, $_, -1; + ## make sure that we can't hop out of @INC + shift @parts if @parts && !$parts[0]; + + ### because of [perl #19213], see caveats ### + my $file = $^O eq 'MSWin32' + ? join "/", @parts + : File::Spec->catfile( @parts ); + + $file .= '.pm' if $pm; + + ### on perl's before 5.10 (5.9.5@31746) if you require + ### a file in VMS format, it's stored in %INC in VMS + ### format. Therefor, better unixify it first + ### Patch in reply to John Malmbergs patch (as mentioned + ### above) on p5p Tue 21 Aug 2007 04:55:07 + $file = VMS::Filespec::unixify($file) if $^O eq 'VMS'; + + return $file; +} + +sub _who { (caller(1))[0] } + +sub _is_file { + local $_ = shift; + return /^\./ ? 1 : + /[^\w:']/ ? 1 : + undef + #' silly bbedit.. +} + + +1; + +__END__ + +package Module::Load::Conditional; + +use strict; + +use Module::Load qw/load autoload_remote/; +use Params::Check qw[check]; +use Locale::Maketext::Simple Style => 'gettext'; + +use Carp (); +use File::Spec (); +use FileHandle (); +use version; + +use Module::Metadata (); + +use constant ON_VMS => $^O eq 'VMS'; +use constant ON_WIN32 => $^O eq 'MSWin32' ? 1 : 0; +use constant QUOTE => do { ON_WIN32 ? q["] : q['] }; + +BEGIN { + use vars qw[ $VERSION @ISA $VERBOSE $CACHE @EXPORT_OK $DEPRECATED + $FIND_VERSION $ERROR $CHECK_INC_HASH $FORCE_SAFE_INC ]; + use Exporter; + @ISA = qw[Exporter]; + $VERSION = '0.68'; + $VERBOSE = 0; + $DEPRECATED = 0; + $FIND_VERSION = 1; + $CHECK_INC_HASH = 0; + $FORCE_SAFE_INC = 0; + @EXPORT_OK = qw[check_install can_load requires]; +} + + +### this checks if a certain module is installed already ### +### if it returns true, the module in question is already installed +### or we found the file, but couldn't open it, OR there was no version +### to be found in the module +### it will return 0 if the version in the module is LOWER then the one +### we are looking for, or if we couldn't find the desired module to begin with +### if the installed version is higher or equal to the one we want, it will return +### a hashref with he module name and version in it.. so 'true' as well. +sub check_install { + my %hash = @_; + + my $tmpl = { + version => { default => '0.0' }, + module => { required => 1 }, + verbose => { default => $VERBOSE }, + }; + + my $args; + unless( $args = check( $tmpl, \%hash, $VERBOSE ) ) { + warn loc( q[A problem occurred checking arguments] ) if $VERBOSE; + return; + } + + my $file = File::Spec->catfile( split /::/, $args->{module} ) . '.pm'; + my $file_inc = File::Spec::Unix->catfile( + split /::/, $args->{module} + ) . '.pm'; + + ### where we store the return value ### + my $href = { + file => undef, + version => undef, + uptodate => undef, + }; + + my $filename; + + ### check the inc hash if we're allowed to + if( $CHECK_INC_HASH ) { + $filename = $href->{'file'} = + $INC{ $file_inc } if defined $INC{ $file_inc }; + + ### find the version by inspecting the package + if( defined $filename && $FIND_VERSION ) { + no strict 'refs'; + $href->{version} = ${ "$args->{module}"."::VERSION" }; + } + } + + ### we didn't find the filename yet by looking in %INC, + ### so scan the dirs + unless( $filename ) { + + local @INC = @INC[0..$#INC-1] if $FORCE_SAFE_INC && $INC[-1] eq '.'; + + DIR: for my $dir ( @INC ) { + + my $fh; + + if ( ref $dir ) { + ### @INC hook -- we invoke it and get the filehandle back + ### this is actually documented behaviour as of 5.8 ;) + + my $existed_in_inc = $INC{$file_inc}; + + if (UNIVERSAL::isa($dir, 'CODE')) { + ($fh) = $dir->($dir, $file); + + } elsif (UNIVERSAL::isa($dir, 'ARRAY')) { + ($fh) = $dir->[0]->($dir, $file, @{$dir}{1..$#{$dir}}) + + } elsif (UNIVERSAL::can($dir, 'INC')) { + ($fh) = $dir->INC($file); + } + + if (!UNIVERSAL::isa($fh, 'GLOB')) { + warn loc(q[Cannot open file '%1': %2], $file, $!) + if $args->{verbose}; + next; + } + + $filename = $INC{$file_inc} || $file; + + delete $INC{$file_inc} if not $existed_in_inc; + + } else { + $filename = File::Spec->catfile($dir, $file); + next unless -e $filename; + + $fh = new FileHandle; + if (!$fh->open($filename)) { + warn loc(q[Cannot open file '%1': %2], $file, $!) + if $args->{verbose}; + next; + } + } + + ### store the directory we found the file in + $href->{dir} = $dir; + + ### files need to be in unix format under vms, + ### or they might be loaded twice + $href->{file} = ON_VMS + ? VMS::Filespec::unixify( $filename ) + : $filename; + + ### if we don't need the version, we're done + last DIR unless $FIND_VERSION; + + ### otherwise, the user wants us to find the version from files + my $mod_info = Module::Metadata->new_from_handle( $fh, $filename ); + my $ver = $mod_info->version( $args->{module} ); + + if( defined $ver ) { + $href->{version} = $ver; + + last DIR; + } + } + } + + ### if we couldn't find the file, return undef ### + return unless defined $href->{file}; + + ### only complain if we're expected to find a version higher than 0.0 anyway + if( $FIND_VERSION and not defined $href->{version} ) { + { ### don't warn about the 'not numeric' stuff ### + local $^W; + + ### if we got here, we didn't find the version + warn loc(q[Could not check version on '%1'], $args->{module} ) + if $args->{verbose} and $args->{version} > 0; + } + $href->{uptodate} = 1; + + } else { + ### don't warn about the 'not numeric' stuff ### + local $^W; + + ### use qv(), as it will deal with developer release number + ### ie ones containing _ as well. This addresses bug report + ### #29348: Version compare logic doesn't handle alphas? + ### + ### Update from JPeacock: apparently qv() and version->new + ### are different things, and we *must* use version->new + ### here, or things like #30056 might start happening + + ### We have to wrap this in an eval as version-0.82 raises + ### exceptions and not warnings now *sigh* + + eval { + + $href->{uptodate} = + version->new( $args->{version} ) <= version->new( $href->{version} ) + ? 1 + : 0; + + }; + } + + if ( $DEPRECATED and "$]" >= 5.011 ) { + local @INC = @INC[0..$#INC-1] if $FORCE_SAFE_INC && $INC[-1] eq '.'; + require Module::CoreList; + require Config; + + $href->{uptodate} = 0 if + exists $Module::CoreList::version{ 0+$] }{ $args->{module} } and + Module::CoreList::is_deprecated( $args->{module} ) and + $Config::Config{privlibexp} eq $href->{dir} + and $Config::Config{privlibexp} ne $Config::Config{sitelibexp}; + } + + return $href; +} + + +sub can_load { + my %hash = @_; + + my $tmpl = { + modules => { default => {}, strict_type => 1 }, + verbose => { default => $VERBOSE }, + nocache => { default => 0 }, + autoload => { default => 0 }, + }; + + my $args; + + unless( $args = check( $tmpl, \%hash, $VERBOSE ) ) { + $ERROR = loc(q[Problem validating arguments!]); + warn $ERROR if $VERBOSE; + return; + } + + ### layout of $CACHE: + ### $CACHE = { + ### $ module => { + ### usable => BOOL, + ### version => \d, + ### file => /path/to/file, + ### }, + ### }; + + $CACHE ||= {}; # in case it was undef'd + + my $error; + BLOCK: { + my $href = $args->{modules}; + + my @load; + for my $mod ( keys %$href ) { + + next if $CACHE->{$mod}->{usable} && !$args->{nocache}; + + ### else, check if the hash key is defined already, + ### meaning $mod => 0, + ### indicating UNSUCCESSFUL prior attempt of usage + + ### use qv(), as it will deal with developer release number + ### ie ones containing _ as well. This addresses bug report + ### #29348: Version compare logic doesn't handle alphas? + ### + ### Update from JPeacock: apparently qv() and version->new + ### are different things, and we *must* use version->new + ### here, or things like #30056 might start happening + if ( !$args->{nocache} + && defined $CACHE->{$mod}->{usable} + && (version->new( $CACHE->{$mod}->{version}||0 ) + >= version->new( $href->{$mod} ) ) + ) { + $error = loc( q[Already tried to use '%1', which was unsuccessful], $mod); + last BLOCK; + } + + my $mod_data = check_install( + module => $mod, + version => $href->{$mod} + ); + + if( !$mod_data or !defined $mod_data->{file} ) { + $error = loc(q[Could not find or check module '%1'], $mod); + $CACHE->{$mod}->{usable} = 0; + last BLOCK; + } + + map { + $CACHE->{$mod}->{$_} = $mod_data->{$_} + } qw[version file uptodate]; + + push @load, $mod; + } + + for my $mod ( @load ) { + + if ( $CACHE->{$mod}->{uptodate} ) { + + local @INC = @INC[0..$#INC-1] if $FORCE_SAFE_INC && $INC[-1] eq '.'; + + if ( $args->{autoload} ) { + my $who = (caller())[0]; + eval { autoload_remote $who, $mod }; + } else { + eval { load $mod }; + } + + ### in case anything goes wrong, log the error, the fact + ### we tried to use this module and return 0; + if( $@ ) { + $error = $@; + $CACHE->{$mod}->{usable} = 0; + last BLOCK; + } else { + $CACHE->{$mod}->{usable} = 1; + } + + ### module not found in @INC, store the result in + ### $CACHE and return 0 + } else { + + $error = loc(q[Module '%1' is not uptodate!], $mod); + $CACHE->{$mod}->{usable} = 0; + last BLOCK; + } + } + + } # BLOCK + + if( defined $error ) { + $ERROR = $error; + Carp::carp( loc(q|%1 [THIS MAY BE A PROBLEM!]|,$error) ) if $args->{verbose}; + return; + } else { + return 1; + } +} + + +sub requires { + my $who = shift; + + unless( check_install( module => $who ) ) { + warn loc(q[You do not have module '%1' installed], $who) if $VERBOSE; + return undef; + } + + local @INC = @INC[0..$#INC-1] if $FORCE_SAFE_INC && $INC[-1] eq '.'; + + my $lib = join " ", map { qq["-I$_"] } @INC; + my $oneliner = 'print(join(qq[\n],map{qq[BONG=$_]}keys(%INC)),qq[\n])'; + my $cmd = join '', qq["$^X" $lib -M$who -e], QUOTE, $oneliner, QUOTE; + + return sort + grep { !/^$who$/ } + map { chomp; s|/|::|g; $_ } + grep { s|\.pm$||i; } + map { s!^BONG\=!!; $_ } + grep { m!^BONG\=! } + `$cmd`; +} + +1; + +__END__ + +package Module::CoreList::Utils; + +use strict; +use warnings; +use Module::CoreList; + +our $VERSION = '5.20181129_28'; +our %utilities; + +sub utilities { + my $perl = shift; + $perl = shift if eval { $perl->isa(__PACKAGE__) }; + return unless $perl or exists $utilities{$perl}; + return sort keys %{ $utilities{$perl} }; +} + +sub _released_order { # Sort helper, to make '?' sort after everything else + (substr($Module::CoreList::released{$a}, 0, 1) eq "?") + ? ((substr($Module::CoreList::released{$b}, 0, 1) eq "?") + ? 0 + : 1) + : ((substr($Module::CoreList::released{$b}, 0, 1) eq "?") + ? -1 + : $Module::CoreList::released{$a} cmp $Module::CoreList::released{$b} ) +} + +sub first_release_raw { + my $util = shift; + $util = shift if eval { $util->isa(__PACKAGE__) }; + #and scalar @_ and $_[0] =~ m#\A[a-zA-Z_][0-9a-zA-Z_]*(?:(::|')[0-9a-zA-Z_]+)*\z#; + my $version = shift; + + my @perls = $version + ? grep { exists $utilities{$_}{ $util } && + $utilities{$_}{ $util } ge $version } keys %utilities + : grep { exists $utilities{$_}{ $util } } keys %utilities; + + return grep { exists $Module::CoreList::released{$_} } @perls; +} + +sub first_release_by_date { + my @perls = &first_release_raw; + return unless @perls; + return (sort _released_order @perls)[0]; +} + +sub first_release { + my @perls = &first_release_raw; + return unless @perls; + return (sort { $a cmp $b } @perls)[0]; +} + +sub removed_from { + my @perls = &removed_raw; + return shift @perls; +} + +sub removed_from_by_date { + my @perls = sort _released_order &removed_raw; + return shift @perls; +} + +sub removed_raw { + my $util = shift; + $util = shift if eval { $util->isa(__PACKAGE__) }; + return unless my @perls = sort { $a cmp $b } first_release_raw($util); + @perls = grep { exists $Module::CoreList::released{$_} } @perls; + my $last = pop @perls; + my @removed = grep { $_ > $last } sort { $a cmp $b } keys %utilities; + return @removed; +} + +my %delta = ( + 5 => { + changed => { + 'a2p' => '1', + 'c2ph' => '1', + 'cppstdin' => '1', + 'find2perl' => '1', + 'pstruct' => '1', + 's2p' => '1', + }, + removed => { + } + }, + + 5.001 => { + delta_from => 5, + changed => { + 'h2xs' => '1', + }, + removed => { + } + }, + + 5.002 => { + delta_from => 5.001, + changed => { + 'h2ph' => '1', + 'perlbug' => '1', + 'perldoc' => '1', + 'pod2html' => '1', + 'pod2latex' => '1', + 'pod2man' => '1', + 'pod2text' => '1', + }, + removed => { + } + }, + + 5.00307 => { + delta_from => 5.002, + changed => { + 'pl2pm' => '1', + }, + removed => { + 'cppstdin' => 1, + 'pstruct' => 1, + } + }, + + 5.004 => { + delta_from => 5.00307, + changed => { + 'splain' => '1', + }, + removed => { + } + }, + + 5.005 => { + delta_from => 5.00405, + changed => { + 'perlcc' => '1', + }, + removed => { + } + }, + + 5.00503 => { + delta_from => 5.005, + changed => { + }, + removed => { + } + }, + + 5.00405 => { + delta_from => 5.004, + changed => { + }, + removed => { + } + }, + + 5.006 => { + delta_from => 5.00504, + changed => { + 'dprofpp' => '1', + 'pod2usage' => '1', + 'podchecker' => '1', + 'podselect' => '1', + 'pstruct' => '1', + }, + removed => { + } + }, + + 5.006001 => { + delta_from => 5.006, + changed => { + }, + removed => { + } + }, + + 5.007003 => { + delta_from => 5.006002, + changed => { + 'libnetcfg' => '1', + 'perlivp' => '1', + 'psed' => '1', + 'xsubpp' => '1', + }, + removed => { + } + }, + + 5.008 => { + delta_from => 5.007003, + changed => { + 'enc2xs' => '1', + 'piconv' => '1', + }, + removed => { + } + }, + + 5.008001 => { + delta_from => 5.008, + changed => { + 'cpan' => '1', + }, + removed => { + } + }, + + 5.009 => { + delta_from => 5.008009, + changed => { + }, + removed => { + 'corelist' => 1, + 'instmodsh' => 1, + 'prove' => 1, + } + }, + + 5.008002 => { + delta_from => 5.008001, + changed => { + }, + removed => { + } + }, + + 5.006002 => { + delta_from => 5.006001, + changed => { + }, + removed => { + } + }, + + 5.008003 => { + delta_from => 5.008002, + changed => { + 'instmodsh' => '1', + 'prove' => '1', + }, + removed => { + } + }, + + 5.00504 => { + delta_from => 5.00503, + changed => { + }, + removed => { + } + }, + + 5.009001 => { + delta_from => 5.009, + changed => { + 'instmodsh' => '1', + 'prove' => '1', + }, + removed => { + } + }, + + 5.008004 => { + delta_from => 5.008003, + changed => { + }, + removed => { + } + }, + + 5.008005 => { + delta_from => 5.008004, + changed => { + }, + removed => { + } + }, + + 5.008006 => { + delta_from => 5.008005, + changed => { + }, + removed => { + } + }, + + 5.009002 => { + delta_from => 5.009001, + changed => { + 'corelist' => '1', + }, + removed => { + } + }, + + 5.008007 => { + delta_from => 5.008006, + changed => { + }, + removed => { + } + }, + + 5.009003 => { + delta_from => 5.009002, + changed => { + 'ptar' => '1', + 'ptardiff' => '1', + 'shasum' => '1', + }, + removed => { + } + }, + + 5.008008 => { + delta_from => 5.008007, + changed => { + }, + removed => { + } + }, + + 5.009004 => { + delta_from => 5.009003, + changed => { + 'config_data' => '1', + }, + removed => { + } + }, + + 5.009005 => { + delta_from => 5.009004, + changed => { + 'cpan2dist' => '1', + 'cpanp' => '1', + 'cpanp-run-perl' => '1', + }, + removed => { + 'perlcc' => 1, + } + }, + + 5.010000 => { + delta_from => 5.009005, + changed => { + }, + removed => { + } + }, + + 5.008009 => { + delta_from => 5.008008, + changed => { + 'corelist' => '1', + }, + removed => { + } + }, + + 5.010001 => { + delta_from => 5.010000, + changed => { + }, + removed => { + } + }, + + 5.011 => { + delta_from => 5.010001, + changed => { + }, + removed => { + } + }, + + 5.011001 => { + delta_from => 5.011, + changed => { + }, + removed => { + } + }, + + 5.011002 => { + delta_from => 5.011001, + changed => { + 'perlthanks' => '1', + }, + removed => { + } + }, + + 5.011003 => { + delta_from => 5.011002, + changed => { + }, + removed => { + } + }, + + 5.011004 => { + delta_from => 5.011003, + changed => { + }, + removed => { + } + }, + + 5.011005 => { + delta_from => 5.011004, + changed => { + }, + removed => { + } + }, + + 5.012 => { + delta_from => 5.011005, + changed => { + }, + removed => { + } + }, + + 5.013 => { + delta_from => 5.012005, + changed => { + }, + removed => { + } + }, + + 5.012001 => { + delta_from => 5.012, + changed => { + }, + removed => { + } + }, + + 5.013001 => { + delta_from => 5.013, + changed => { + }, + removed => { + } + }, + + 5.013002 => { + delta_from => 5.013001, + changed => { + }, + removed => { + } + }, + + 5.013003 => { + delta_from => 5.013002, + changed => { + }, + removed => { + } + }, + + 5.013004 => { + delta_from => 5.013003, + changed => { + }, + removed => { + } + }, + + 5.012002 => { + delta_from => 5.012001, + changed => { + }, + removed => { + } + }, + + 5.013005 => { + delta_from => 5.013004, + changed => { + }, + removed => { + } + }, + + 5.013006 => { + delta_from => 5.013005, + changed => { + }, + removed => { + } + }, + + 5.013007 => { + delta_from => 5.013006, + changed => { + 'ptargrep' => '1', + }, + removed => { + } + }, + + 5.013008 => { + delta_from => 5.013007, + changed => { + }, + removed => { + } + }, + + 5.013009 => { + delta_from => 5.013008, + changed => { + 'json_pp' => '1', + }, + removed => { + } + }, + + 5.012003 => { + delta_from => 5.012002, + changed => { + }, + removed => { + } + }, + + 5.013010 => { + delta_from => 5.013009, + changed => { + }, + removed => { + } + }, + + 5.013011 => { + delta_from => 5.013010, + changed => { + }, + removed => { + } + }, + + 5.014 => { + delta_from => 5.013011, + changed => { + }, + removed => { + } + }, + + 5.014001 => { + delta_from => 5.014, + changed => { + }, + removed => { + } + }, + + 5.015 => { + delta_from => 5.014004, + changed => { + }, + removed => { + 'dprofpp' => 1, + } + }, + + 5.012004 => { + delta_from => 5.012003, + changed => { + }, + removed => { + } + }, + + 5.015001 => { + delta_from => 5.015, + changed => { + }, + removed => { + } + }, + + 5.015002 => { + delta_from => 5.015001, + changed => { + }, + removed => { + } + }, + + 5.015003 => { + delta_from => 5.015002, + changed => { + }, + removed => { + } + }, + + 5.014002 => { + delta_from => 5.014001, + changed => { + }, + removed => { + } + }, + + 5.015004 => { + delta_from => 5.015003, + changed => { + }, + removed => { + } + }, + + 5.015005 => { + delta_from => 5.015004, + changed => { + }, + removed => { + } + }, + + 5.015006 => { + delta_from => 5.015005, + changed => { + 'zipdetails' => '1', + }, + removed => { + } + }, + + 5.015007 => { + delta_from => 5.015006, + changed => { + }, + removed => { + } + }, + + 5.015008 => { + delta_from => 5.015007, + changed => { + }, + removed => { + } + }, + + 5.015009 => { + delta_from => 5.015008, + changed => { + }, + removed => { + } + }, + + 5.016 => { + delta_from => 5.015009, + changed => { + }, + removed => { + } + }, + + 5.017 => { + delta_from => 5.016003, + changed => { + }, + removed => { + } + }, + + 5.017001 => { + delta_from => 5.017, + changed => { + }, + removed => { + } + }, + + 5.017002 => { + delta_from => 5.017001, + changed => { + }, + removed => { + } + }, + + 5.016001 => { + delta_from => 5.016, + changed => { + }, + removed => { + } + }, + + 5.017003 => { + delta_from => 5.017002, + changed => { + }, + removed => { + } + }, + + 5.017004 => { + delta_from => 5.017003, + changed => { + }, + removed => { + } + }, + + 5.014003 => { + delta_from => 5.014002, + changed => { + }, + removed => { + } + }, + + 5.017005 => { + delta_from => 5.017004, + changed => { + }, + removed => { + } + }, + + 5.016002 => { + delta_from => 5.016001, + changed => { + }, + removed => { + } + }, + + 5.012005 => { + delta_from => 5.012004, + changed => { + }, + removed => { + } + }, + + 5.017006 => { + delta_from => 5.017005, + changed => { + }, + removed => { + } + }, + + 5.017007 => { + delta_from => 5.017006, + changed => { + }, + removed => { + } + }, + + 5.017008 => { + delta_from => 5.017007, + changed => { + }, + removed => { + } + }, + + 5.017009 => { + delta_from => 5.017008, + changed => { + }, + removed => { + } + }, + + 5.014004 => { + delta_from => 5.014003, + changed => { + }, + removed => { + } + }, + + 5.016003 => { + delta_from => 5.016002, + changed => { + }, + removed => { + } + }, + + 5.017010 => { + delta_from => 5.017009, + changed => { + }, + removed => { + } + }, + + 5.017011 => { + delta_from => 5.017010, + changed => { + }, + removed => { + } + }, + 5.018000 => { + delta_from => 5.017011, + changed => { + }, + removed => { + } + }, + 5.018001 => { + delta_from => 5.018000, + changed => { + }, + removed => { + } + }, + 5.018002 => { + delta_from => 5.018001, + changed => { + }, + removed => { + } + }, + 5.018003 => { + delta_from => 5.018000, + changed => { + }, + removed => { + } + }, + 5.018004 => { + delta_from => 5.018000, + changed => { + }, + removed => { + } + }, + 5.019000 => { + delta_from => 5.018000, + changed => { + }, + removed => { + 'cpan2dist' => '1', + 'cpanp' => '1', + 'cpanp-run-perl' => '1', + 'pod2latex' => '1', + } + }, + 5.019001 => { + delta_from => 5.019000, + changed => { + }, + removed => { + } + }, + 5.019002 => { + delta_from => 5.019001, + changed => { + }, + removed => { + } + }, + 5.019003 => { + delta_from => 5.019002, + changed => { + }, + removed => { + } + }, + 5.019004 => { + delta_from => 5.019003, + changed => { + }, + removed => { + } + }, + 5.019005 => { + delta_from => 5.019004, + changed => { + }, + removed => { + } + }, + 5.019006 => { + delta_from => 5.019005, + changed => { + }, + removed => { + } + }, + 5.019007 => { + delta_from => 5.019006, + changed => { + }, + removed => { + } + }, + 5.019008 => { + delta_from => 5.019007, + changed => { + }, + removed => { + } + }, + 5.019009 => { + delta_from => 5.019008, + changed => { + }, + removed => { + } + }, + 5.019010 => { + delta_from => 5.019009, + changed => { + }, + removed => { + } + }, + 5.019011 => { + delta_from => 5.019010, + changed => { + }, + removed => { + } + }, + 5.020000 => { + delta_from => 5.019011, + changed => { + }, + removed => { + } + }, + 5.021000 => { + delta_from => 5.020000, + changed => { + }, + removed => { + } + }, + 5.021001 => { + delta_from => 5.021000, + changed => { + }, + removed => { + 'a2p' => 1, + 'config_data' => 1, + 'find2perl' => 1, + 'psed' => 1, + 's2p' => 1, + } + }, + 5.021002 => { + delta_from => 5.021001, + changed => { + }, + removed => { + } + }, + 5.021003 => { + delta_from => 5.021002, + changed => { + }, + removed => { + } + }, + 5.020001 => { + delta_from => 5.02, + changed => { + }, + removed => { + } + }, + 5.021004 => { + delta_from => 5.021003, + changed => { + }, + removed => { + } + }, + 5.021005 => { + delta_from => 5.021004, + changed => { + }, + removed => { + } + }, + 5.021006 => { + delta_from => 5.021005, + changed => { + }, + removed => { + } + }, + 5.021007 => { + delta_from => 5.021006, + changed => { + }, + removed => { + } + }, + 5.021008 => { + delta_from => 5.021007, + changed => { + }, + removed => { + } + }, + 5.020002 => { + delta_from => 5.020001, + changed => { + }, + removed => { + } + }, + 5.021009 => { + delta_from => 5.021008, + changed => { + 'encguess' => '1', + }, + removed => { + } + }, + 5.021010 => { + delta_from => 5.021009, + changed => { + }, + removed => { + } + }, + 5.021011 => { + delta_from => 5.02101, + changed => { + }, + removed => { + } + }, + 5.022000 => { + delta_from => 5.021011, + changed => { + }, + removed => { + } + }, + 5.023000 => { + delta_from => 5.022000, + changed => { + }, + removed => { + } + }, + 5.023001 => { + delta_from => 5.023, + changed => { + }, + removed => { + } + }, + 5.023002 => { + delta_from => 5.023001, + changed => { + }, + removed => { + } + }, + 5.020003 => { + delta_from => 5.020002, + changed => { + }, + removed => { + } + }, + 5.023003 => { + delta_from => 5.023002, + changed => { + }, + removed => { + } + }, + 5.023004 => { + delta_from => 5.023003, + changed => { + }, + removed => { + } + }, + 5.023005 => { + delta_from => 5.023004, + changed => { + }, + removed => { + } + }, + 5.022001 => { + delta_from => 5.022, + changed => { + }, + removed => { + } + }, + 5.023006 => { + delta_from => 5.023005, + changed => { + }, + removed => { + } + }, + 5.023007 => { + delta_from => 5.023006, + changed => { + }, + removed => { + } + }, + 5.023008 => { + delta_from => 5.023007, + changed => { + }, + removed => { + } + }, + 5.023009 => { + delta_from => 5.023008, + changed => { + }, + removed => { + } + }, + 5.022002 => { + delta_from => 5.022001, + changed => { + }, + removed => { + } + }, + 5.024000 => { + delta_from => 5.023009, + changed => { + }, + removed => { + } + }, + 5.025000 => { + delta_from => 5.024000, + changed => { + }, + removed => { + } + }, + 5.025001 => { + delta_from => 5.025000, + changed => { + }, + removed => { + } + }, + 5.025002 => { + delta_from => 5.025001, + changed => { + }, + removed => { + } + }, + 5.025003 => { + delta_from => 5.025002, + changed => { + }, + removed => { + } + }, + 5.025004 => { + delta_from => 5.025003, + changed => { + }, + removed => { + } + }, + 5.025005 => { + delta_from => 5.025004, + changed => { + }, + removed => { + } + }, + 5.025006 => { + delta_from => 5.025005, + changed => { + }, + removed => { + } + }, + 5.025007 => { + delta_from => 5.025006, + changed => { + }, + removed => { + } + }, + 5.025008 => { + delta_from => 5.025007, + changed => { + }, + removed => { + } + }, + 5.022003 => { + delta_from => 5.022002, + changed => { + }, + removed => { + } + }, + 5.024001 => { + delta_from => 5.024000, + changed => { + }, + removed => { + } + }, + 5.025009 => { + delta_from => 5.025008, + changed => { + }, + removed => { + 'c2ph' => 1, + 'pstruct' => 1, + } + }, + 5.025010 => { + delta_from => 5.025009, + changed => { + }, + removed => { + } + }, + 5.025011 => { + delta_from => 5.025010, + changed => { + }, + removed => { + } + }, + 5.025012 => { + delta_from => 5.025011, + changed => { + }, + removed => { + } + }, + 5.026000 => { + delta_from => 5.025012, + changed => { + }, + removed => { + } + }, + 5.027000 => { + delta_from => 5.026000, + changed => { + }, + removed => { + } + }, + 5.027001 => { + delta_from => 5.027000, + changed => { + }, + removed => { + } + }, + 5.022004 => { + delta_from => 5.022003, + changed => { + }, + removed => { + } + }, + 5.024002 => { + delta_from => 5.024001, + changed => { + }, + removed => { + } + }, + 5.027002 => { + delta_from => 5.027001, + changed => { + }, + removed => { + } + }, + 5.027003 => { + delta_from => 5.027002, + changed => { + }, + removed => { + } + }, + 5.027004 => { + delta_from => 5.027003, + changed => { + }, + removed => { + } + }, + 5.024003 => { + delta_from => 5.024002, + changed => { + }, + removed => { + } + }, + 5.026001 => { + delta_from => 5.026000, + changed => { + }, + removed => { + } + }, + 5.027005 => { + delta_from => 5.027004, + changed => { + }, + removed => { + } + }, + 5.027006 => { + delta_from => 5.027005, + changed => { + }, + removed => { + } + }, + 5.027007 => { + delta_from => 5.027006, + changed => { + }, + removed => { + } + }, + 5.027008 => { + delta_from => 5.027007, + changed => { + }, + removed => { + } + }, + 5.027009 => { + delta_from => 5.027008, + changed => { + }, + removed => { + } + }, + 5.027010 => { + delta_from => 5.027009, + changed => { + }, + removed => { + } + }, + 5.024004 => { + delta_from => 5.024003, + changed => { + }, + removed => { + } + }, + 5.026002 => { + delta_from => 5.026001, + changed => { + }, + removed => { + } + }, + 5.027011 => { + delta_from => 5.027010, + changed => { + }, + removed => { + } + }, + 5.028000 => { + delta_from => 5.027011, + changed => { + }, + removed => { + } + }, + 5.029000 => { + delta_from => 5.028, + changed => { + }, + removed => { + } + }, + 5.029001 => { + delta_from => 5.029000, + changed => { + }, + removed => { + } + }, + 5.029002 => { + delta_from => 5.029001, + changed => { + }, + removed => { + } + }, + 5.029003 => { + delta_from => 5.029002, + changed => { + }, + removed => { + } + }, + 5.029004 => { + delta_from => 5.029003, + changed => { + }, + removed => { + } + }, + 5.028001 => { + delta_from => 5.028000, + changed => { + }, + removed => { + } + }, +); + +%utilities = Module::CoreList::_undelta(\%delta); + +# Create aliases with trailing zeros for $] use + +$utilities{'5.000'} = $utilities{5}; + +_create_aliases(\%utilities); + +sub _create_aliases { + my ($hash) = @_; + + for my $version (keys %$hash) { + next unless $version >= 5.010; + + my $padded = sprintf "%0.6f", $version; + + # If the version in string form isn't the same as the numeric version, + # alias it. + if ($padded ne $version && $version == $padded) { + $hash->{$padded} = $hash->{$version}; + } + } +} + +'foo'; + +package attributes; + +our $VERSION = 0.33; + +@EXPORT_OK = qw(get reftype); +@EXPORT = (); +%EXPORT_TAGS = (ALL => [@EXPORT, @EXPORT_OK]); + +use strict; + +sub croak { + require Carp; + goto &Carp::croak; +} + +sub carp { + require Carp; + goto &Carp::carp; +} + +# Hash of SV type (CODE, SCALAR, etc.) to regex matching deprecated +# attributes for that type. +my %deprecated; + +my %msg = ( + lvalue => 'lvalue attribute applied to already-defined subroutine', + -lvalue => 'lvalue attribute removed from already-defined subroutine', + const => 'Useless use of attribute "const"', +); + +sub _modify_attrs_and_deprecate { + my $svtype = shift; + # After we've removed a deprecated attribute from the XS code, we need to + # remove it here, else it ends up in @badattrs. (If we do the deprecation in + # XS, we can't control the warning based on *our* caller's lexical settings, + # and the warned line is in this package) + grep { + $deprecated{$svtype} && /$deprecated{$svtype}/ ? do { + require warnings; + warnings::warnif('deprecated', "Attribute \"$1\" is deprecated, " . + "and will disappear in Perl 5.28"); + 0; + } : $svtype eq 'CODE' && exists $msg{$_} ? do { + require warnings; + warnings::warnif( + 'misc', + $msg{$_} + ); + 0; + } : 1 + } _modify_attrs(@_); +} + +sub import { + @_ > 2 && ref $_[2] or do { + require Exporter; + goto &Exporter::import; + }; + my (undef,$home_stash,$svref,@attrs) = @_; + + my $svtype = uc reftype($svref); + my $pkgmeth; + $pkgmeth = UNIVERSAL::can($home_stash, "MODIFY_${svtype}_ATTRIBUTES") + if defined $home_stash && $home_stash ne ''; + my @badattrs; + if ($pkgmeth) { + my @pkgattrs = _modify_attrs_and_deprecate($svtype, $svref, @attrs); + @badattrs = $pkgmeth->($home_stash, $svref, @pkgattrs); + if (!@badattrs && @pkgattrs) { + require warnings; + return unless warnings::enabled('reserved'); + @pkgattrs = grep { m/\A[[:lower:]]+(?:\z|\()/ } @pkgattrs; + if (@pkgattrs) { + for my $attr (@pkgattrs) { + $attr =~ s/\(.+\z//s; + } + my $s = ((@pkgattrs == 1) ? '' : 's'); + carp "$svtype package attribute$s " . + "may clash with future reserved word$s: " . + join(' : ' , @pkgattrs); + } + } + } + else { + @badattrs = _modify_attrs_and_deprecate($svtype, $svref, @attrs); + } + if (@badattrs) { + croak "Invalid $svtype attribute" . + (( @badattrs == 1 ) ? '' : 's') . + ": " . + join(' : ', @badattrs); + } +} + +sub get ($) { + @_ == 1 && ref $_[0] or + croak 'Usage: '.__PACKAGE__.'::get $ref'; + my $svref = shift; + my $svtype = uc reftype($svref); + my $stash = _guess_stash($svref); + $stash = caller unless defined $stash; + my $pkgmeth; + $pkgmeth = UNIVERSAL::can($stash, "FETCH_${svtype}_ATTRIBUTES") + if defined $stash && $stash ne ''; + return $pkgmeth ? + (_fetch_attrs($svref), $pkgmeth->($stash, $svref)) : + (_fetch_attrs($svref)) + ; +} + +sub require_version { goto &UNIVERSAL::VERSION } + +require XSLoader; +XSLoader::load(); + +1; +__END__ +#The POD goes here + +# This file was created by configpm when Perl was built. Any changes +# made to this file will be lost the next time perl is built. + +package Config; +use strict; +use warnings; +our %Config; + +sub bincompat_options { + return split ' ', (Internals::V())[0]; +} + +sub non_bincompat_options { + return split ' ', (Internals::V())[1]; +} + +sub compile_date { + return (Internals::V())[2] +} + +sub local_patches { + my (undef, undef, undef, @patches) = Internals::V(); + return @patches; +} + +sub _V { + die "Perl lib was built for 'emscripten' but is being run on '$^O'" + unless "emscripten" eq $^O; + + my ($bincompat, $non_bincompat, $date, @patches) = Internals::V(); + + my @opts = sort split ' ', "$bincompat $non_bincompat"; + + print Config::myconfig(); + print "\nCharacteristics of this binary (from libperl): \n"; + + print " Compile-time options:\n"; + print " $_\n" for @opts; + + if (@patches) { + print " Locally applied patches:\n"; + print " $_\n" foreach @patches; + } + + print " Built under emscripten\n"; + + print " $date\n" if defined $date; + + my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %ENV; + + if (@env) { + print " \%ENV:\n"; + print " $_\n" foreach @env; + } + print " \@INC:\n"; + print " $_\n" foreach @INC; +} + +sub header_files { + return qw(EXTERN.h INTERN.h XSUB.h av.h config.h cop.h cv.h + dosish.h embed.h embedvar.h form.h gv.h handy.h hv.h hv_func.h + intrpvar.h iperlsys.h keywords.h mg.h nostdio.h op.h opcode.h + pad.h parser.h patchlevel.h perl.h perlio.h perliol.h perlsdio.h + perlvars.h perly.h pp.h pp_proto.h proto.h regcomp.h regexp.h + regnodes.h scope.h sv.h thread.h time64.h unixish.h utf8.h + util.h); +} + +## +## This file was produced by running the Configure script. It holds all the +## definitions figured out by Configure. Should you modify one of these values, +## do not forget to propagate your changes by running "Configure -der". You may +## instead choose to run each of the .SH files by yourself, or "Configure -S". +## +# +## Package name : perl5 +## Source directory : . +## Configuration time: Sun Mar 3 21:17:25 CET 2019 +## Configured by : haukex +## Target system : linux devbox 4.15.0-45-generic #48-ubuntu smp tue jan 29 16:28:13 utc 2019 x86_64 x86_64 x86_64 gnulinux +# +#: Configure command line arguments. +# +#: Variables propagated from previous config.sh file. + +our $summary = <<'!END!'; +Summary of my $package (revision $revision $version_patchlevel_string) configuration: + $git_commit_id_title $git_commit_id$git_ancestor_line + Platform: + osname=$osname + osvers=$osvers + archname=$archname + uname='$myuname' + config_args='$config_args' + hint=$hint + useposix=$useposix + d_sigaction=$d_sigaction + useithreads=$useithreads + usemultiplicity=$usemultiplicity + use64bitint=$use64bitint + use64bitall=$use64bitall + uselongdouble=$uselongdouble + usemymalloc=$usemymalloc + default_inc_excludes_dot=$default_inc_excludes_dot + bincompat5005=undef + Compiler: + cc='$cc' + ccflags ='$ccflags' + optimize='$optimize' + cppflags='$cppflags' + ccversion='$ccversion' + gccversion='$gccversion' + gccosandvers='$gccosandvers' + intsize=$intsize + longsize=$longsize + ptrsize=$ptrsize + doublesize=$doublesize + byteorder=$byteorder + doublekind=$doublekind + d_longlong=$d_longlong + longlongsize=$longlongsize + d_longdbl=$d_longdbl + longdblsize=$longdblsize + longdblkind=$longdblkind + ivtype='$ivtype' + ivsize=$ivsize + nvtype='$nvtype' + nvsize=$nvsize + Off_t='$lseektype' + lseeksize=$lseeksize + alignbytes=$alignbytes + prototype=$prototype + Linker and Libraries: + ld='$ld' + ldflags ='$ldflags' + libpth=$libpth + libs=$libs + perllibs=$perllibs + libc=$libc + so=$so + useshrplib=$useshrplib + libperl=$libperl + gnulibc_version='$gnulibc_version' + Dynamic Linking: + dlsrc=$dlsrc + dlext=$dlext + d_dlsymun=$d_dlsymun + ccdlflags='$ccdlflags' + cccdlflags='$cccdlflags' + lddlflags='$lddlflags' + +!END! +my $summary_expanded; + +sub myconfig { + return $summary_expanded if $summary_expanded; + ($summary_expanded = $summary) =~ s{\$(\w+)} + { + my $c; + if ($1 eq 'git_ancestor_line') { + if ($Config::Config{git_ancestor}) { + $c= "\n Ancestor: $Config::Config{git_ancestor}"; + } else { + $c= ""; + } + } else { + $c = $Config::Config{$1}; + } + defined($c) ? $c : 'undef' + }ge; + $summary_expanded; +} + +local *_ = \my $a; +$_ = <<'!END!'; +Author='' +CONFIG='true' +Date='' +Header='' +Id='' +Locker='' +Log='' +PATCHLEVEL='28' +PERL_API_REVISION='5' +PERL_API_SUBVERSION='0' +PERL_API_VERSION='28' +PERL_CONFIG_SH='true' +PERL_PATCHLEVEL='' +PERL_REVISION='5' +PERL_SUBVERSION='1' +PERL_VERSION='28' +RCSfile='' +Revision='' +SUBVERSION='1' +Source='' +State='' +_a='.a' +_exe='' +_o='.o' +afs='false' +afsroot='/afs' +alignbytes='4' +aphostname='' +api_revision='5' +api_subversion='0' +api_version='28' +api_versionstring='5.28.0' +ar='ar' +archlib='/opt/perl/lib/5.28.1/wasm' +archlibexp='/opt/perl/lib/5.28.1/wasm' +archname='wasm' +archname64='' +archobjs='' +asctime_r_proto='0' +awk='awk' +baserev='5.0' +bash='' +bin='/opt/perl/bin' +bin_ELF='undef' +binexp='/opt/perl/bin' +bison='bison' +byacc='byacc' +byteorder='1234' +c='' +castflags='0' +cat='cat' +cc='emcc' +cccdlflags='' +ccdlflags='' +ccflags='-D_GNU_SOURCE -D_POSIX_C_SOURCE -DSTANDARD_C -DPERL_USE_SAFE_PUTENV -DNO_MATHOMS -Wno-null-pointer-arithmetic -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2' +ccflags_uselargefiles='' +ccname='gcc' +ccsymbols='=1' +ccversion='' +cf_by='haukex' +cf_email='haukex@zero-g.net' +cf_time='Sun Mar 3 21:17:25 CET 2019' +charbits='8' +charsize='1' +chgrp='' +chmod='chmod' +chown='' +clocktype='clock_t' +comm='comm' +compress='' +config_arg0='Configure' +config_arg1='-des' +config_arg2='-Dhintfile=emscripten' +config_argc='2' +config_args='-des -Dhintfile=emscripten' +contains='grep' +cp='cp' +cpio='' +cpp='cpp' +cpp_stuff='42' +cppccsymbols='' +cppflags='-D_GNU_SOURCE -D_POSIX_C_SOURCE -DSTANDARD_C -DPERL_USE_SAFE_PUTENV -DNO_MATHOMS -Wno-null-pointer-arithmetic -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' +cpplast='' +cppminus='' +cpprun='/usr/bin/cpp -D_GNU_SOURCE -D_POSIX_C_SOURCE -DSTANDARD_C -DPERL_USE_SAFE_PUTENV -DNO_MATHOMS -Wno-null-pointer-arithmetic -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include' +cppstdin='cppstdin' +cppsymbols='__BYTE_ORDER__=1234 __clang__=1 __EMSCRIPTEN__=1 EMSCRIPTEN=1 __GNUC__=4 __GNUC_MINOR__=2 _GNU_SOURCE=1 __ILP32__=1 _ILP32=1 __LITTLE_ENDIAN__=1 _POSIX_C_SOURCE=1 __STDC__=1 __unix=1 __unix__=1 unix=1' +crypt_r_proto='0' +cryptlib='' +csh='csh' +ctermid_r_proto='0' +ctime_r_proto='0' +d_Gconvert='gcvt((x),(n),(b))' +d_PRIEUldbl='define' +d_PRIFUldbl='define' +d_PRIGUldbl='define' +d_PRIXU64='define' +d_PRId64='define' +d_PRIeldbl='define' +d_PRIfldbl='define' +d_PRIgldbl='define' +d_PRIi64='define' +d_PRIo64='define' +d_PRIu64='define' +d_PRIx64='define' +d_SCNfldbl='define' +d__fwalk='undef' +d_accept4='undef' +d_access='define' +d_accessx='undef' +d_acosh='define' +d_aintl='undef' +d_alarm='define' +d_archlib='define' +d_asctime64='undef' +d_asctime_r='undef' +d_asinh='define' +d_atanh='define' +d_atolf='undef' +d_atoll='define' +d_attribute_deprecated='define' +d_attribute_format='define' +d_attribute_malloc='define' +d_attribute_nonnull='define' +d_attribute_noreturn='define' +d_attribute_pure='define' +d_attribute_unused='define' +d_attribute_warn_unused_result='define' +d_backtrace='undef' +d_bsd='undef' +d_bsdgetpgrp='undef' +d_bsdsetpgrp='undef' +d_builtin_add_overflow='define' +d_builtin_choose_expr='define' +d_builtin_expect='define' +d_builtin_mul_overflow='define' +d_builtin_sub_overflow='define' +d_c99_variadic_macros='define' +d_casti32='undef' +d_castneg='define' +d_cbrt='define' +d_chown='define' +d_chroot='define' +d_chsize='undef' +d_class='undef' +d_clearenv='define' +d_closedir='define' +d_cmsghdr_s='define' +d_const='define' +d_copysign='define' +d_copysignl='define' +d_cplusplus='undef' +d_crypt='define' +d_crypt_r='undef' +d_csh='undef' +d_ctermid='define' +d_ctermid_r='undef' +d_ctime64='undef' +d_ctime_r='undef' +d_cuserid='undef' +d_dbminitproto='undef' +d_difftime='define' +d_difftime64='undef' +d_dir_dd_fd='undef' +d_dirfd='define' +d_dirnamlen='undef' +d_dladdr='define' +d_dlerror='define' +d_dlopen='undef' +d_dlsymun='undef' +d_dosuid='undef' +d_double_has_inf='define' +d_double_has_nan='define' +d_double_has_negative_zero='define' +d_double_has_subnormals='define' +d_double_style_cray='undef' +d_double_style_ibm='undef' +d_double_style_ieee='define' +d_double_style_vax='undef' +d_drand48_r='undef' +d_drand48proto='define' +d_dup2='define' +d_dup3='define' +d_duplocale='define' +d_eaccess='undef' +d_endgrent='undef' +d_endgrent_r='undef' +d_endhent='define' +d_endhostent_r='undef' +d_endnent='define' +d_endnetent_r='undef' +d_endpent='define' +d_endprotoent_r='undef' +d_endpwent='define' +d_endpwent_r='undef' +d_endsent='define' +d_endservent_r='undef' +d_eofnblk='define' +d_erf='define' +d_erfc='define' +d_eunice='undef' +d_exp2='define' +d_expm1='define' +d_faststdio='undef' +d_fchdir='define' +d_fchmod='define' +d_fchmodat='define' +d_fchown='define' +d_fcntl='define' +d_fcntl_can_lock='define' +d_fd_macros='define' +d_fd_set='define' +d_fdclose='undef' +d_fdim='define' +d_fds_bits='define' +d_fegetround='define' +d_fgetpos='define' +d_finite='define' +d_finitel='undef' +d_flexfnam='define' +d_flock='define' +d_flockproto='undef' +d_fma='define' +d_fmax='define' +d_fmin='define' +d_fork='define' +d_fp_class='undef' +d_fp_classify='undef' +d_fp_classl='undef' +d_fpathconf='define' +d_fpclass='undef' +d_fpclassify='define' +d_fpclassl='undef' +d_fpgetround='undef' +d_fpos64_t='undef' +d_freelocale='define' +d_frexpl='define' +d_fs_data_s='undef' +d_fseeko='define' +d_fsetpos='define' +d_fstatfs='define' +d_fstatvfs='define' +d_fsync='define' +d_ftello='define' +d_ftime='undef' +d_futimes='undef' +d_gai_strerror='define' +d_gdbm_ndbm_h_uses_prototypes='undef' +d_gdbmndbm_h_uses_prototypes='undef' +d_getaddrinfo='define' +d_getcwd='define' +d_getespwnam='undef' +d_getfsstat='undef' +d_getgrent='undef' +d_getgrent_r='undef' +d_getgrgid_r='undef' +d_getgrnam_r='undef' +d_getgrps='define' +d_gethbyaddr='undef' +d_gethbyname='define' +d_gethent='define' +d_gethname='define' +d_gethostbyaddr_r='undef' +d_gethostbyname_r='undef' +d_gethostent_r='undef' +d_gethostprotos='define' +d_getitimer='define' +d_getlogin='define' +d_getlogin_r='undef' +d_getmnt='undef' +d_getmntent='define' +d_getnameinfo='define' +d_getnbyaddr='define' +d_getnbyname='define' +d_getnent='define' +d_getnetbyaddr_r='undef' +d_getnetbyname_r='undef' +d_getnetent_r='undef' +d_getnetprotos='define' +d_getpagsz='define' +d_getpbyname='define' +d_getpbynumber='define' +d_getpent='define' +d_getpgid='define' +d_getpgrp='define' +d_getpgrp2='undef' +d_getppid='define' +d_getprior='define' +d_getprotobyname_r='undef' +d_getprotobynumber_r='undef' +d_getprotoent_r='undef' +d_getprotoprotos='define' +d_getprpwnam='undef' +d_getpwent='define' +d_getpwent_r='undef' +d_getpwnam_r='undef' +d_getpwuid_r='undef' +d_getsbyname='define' +d_getsbyport='undef' +d_getsent='define' +d_getservbyname_r='undef' +d_getservbyport_r='undef' +d_getservent_r='undef' +d_getservprotos='define' +d_getspnam='undef' +d_getspnam_r='undef' +d_gettimeod='define' +d_gmtime64='undef' +d_gmtime_r='undef' +d_gnulibc='undef' +d_grpasswd='define' +d_hasmntopt='define' +d_htonl='define' +d_hypot='define' +d_ilogb='define' +d_ilogbl='define' +d_inc_version_list='undef' +d_inetaton='define' +d_inetntop='define' +d_inetpton='define' +d_int64_t='define' +d_ip_mreq='define' +d_ip_mreq_source='define' +d_ipv6_mreq='define' +d_ipv6_mreq_source='undef' +d_isascii='define' +d_isblank='define' +d_isfinite='define' +d_isfinitel='undef' +d_isinf='define' +d_isinfl='undef' +d_isless='undef' +d_isnan='define' +d_isnanl='undef' +d_isnormal='define' +d_j0='define' +d_j0l='undef' +d_killpg='undef' +d_lc_monetary_2008='define' +d_lchown='define' +d_ldbl_dig='define' +d_ldexpl='define' +d_lgamma='define' +d_lgamma_r='define' +d_libm_lib_version='undef' +d_libname_unique='define' +d_link='define' +d_linkat='define' +d_llrint='define' +d_llrintl='define' +d_llround='define' +d_llroundl='define' +d_localeconv_l='undef' +d_localtime64='undef' +d_localtime_r='undef' +d_localtime_r_needs_tzset='undef' +d_locconv='define' +d_lockf='define' +d_log1p='define' +d_log2='define' +d_logb='define' +d_long_double_style_ieee='undef' +d_long_double_style_ieee_doubledouble='undef' +d_long_double_style_ieee_extended='undef' +d_long_double_style_ieee_std='undef' +d_long_double_style_vax='undef' +d_longdbl='define' +d_longlong='define' +d_lrint='define' +d_lrintl='define' +d_lround='define' +d_lroundl='define' +d_lseekproto='define' +d_lstat='define' +d_madvise='define' +d_malloc_good_size='undef' +d_malloc_size='undef' +d_mblen='define' +d_mbrlen='define' +d_mbrtowc='define' +d_mbstowcs='define' +d_mbtowc='define' +d_memmem='define' +d_memrchr='define' +d_mkdir='define' +d_mkdtemp='define' +d_mkfifo='define' +d_mkostemp='define' +d_mkstemp='define' +d_mkstemps='define' +d_mktime='define' +d_mktime64='undef' +d_mmap='define' +d_modfl='define' +d_modflproto='define' +d_mprotect='define' +d_msg='undef' +d_msg_ctrunc='define' +d_msg_dontroute='define' +d_msg_oob='define' +d_msg_peek='define' +d_msg_proxy='define' +d_msgctl='undef' +d_msgget='undef' +d_msghdr_s='define' +d_msgrcv='undef' +d_msgsnd='undef' +d_msync='define' +d_munmap='define' +d_mymalloc='undef' +d_nan='define' +d_nanosleep='define' +d_ndbm='undef' +d_ndbm_h_uses_prototypes='undef' +d_nearbyint='define' +d_newlocale='define' +d_nextafter='define' +d_nexttoward='define' +d_nice='define' +d_nl_langinfo='define' +d_nv_preserves_uv='define' +d_nv_zero_is_allbits_zero='define' +d_off64_t='define' +d_old_pthread_create_joinable='undef' +d_oldpthreads='undef' +d_oldsock='define' +d_open3='define' +d_openat='define' +d_pathconf='define' +d_pause='undef' +d_perl_otherlibdirs='undef' +d_phostname='undef' +d_pipe='define' +d_pipe2='define' +d_poll='define' +d_portable='define' +d_prctl='undef' +d_prctl_set_name='undef' +d_printf_format_null='define' +d_procselfexe='undef' +d_pseudofork='undef' +d_pthread_atfork='undef' +d_pthread_attr_setscope='undef' +d_pthread_yield='undef' +d_ptrdiff_t='define' +d_pwage='undef' +d_pwchange='undef' +d_pwclass='undef' +d_pwcomment='undef' +d_pwexpire='undef' +d_pwgecos='define' +d_pwpasswd='define' +d_pwquota='undef' +d_qgcvt='undef' +d_quad='define' +d_querylocale='undef' +d_random_r='undef' +d_re_comp='undef' +d_readdir='define' +d_readdir64_r='undef' +d_readdir_r='undef' +d_readlink='define' +d_readv='define' +d_recvmsg='undef' +d_regcmp='undef' +d_regcomp='define' +d_remainder='define' +d_remquo='define' +d_rename='define' +d_renameat='define' +d_rewinddir='define' +d_rint='define' +d_rmdir='define' +d_round='define' +d_sbrkproto='define' +d_scalbn='define' +d_scalbnl='define' +d_sched_yield='define' +d_scm_rights='define' +d_seekdir='define' +d_select='define' +d_sem='undef' +d_semctl='undef' +d_semctl_semid_ds='undef' +d_semctl_semun='undef' +d_semget='undef' +d_semop='undef' +d_sendmsg='undef' +d_setegid='define' +d_seteuid='define' +d_setgrent='undef' +d_setgrent_r='undef' +d_setgrps='define' +d_sethent='define' +d_sethostent_r='undef' +d_setitimer='define' +d_setlinebuf='define' +d_setlocale='define' +d_setlocale_r='undef' +d_setnent='define' +d_setnetent_r='undef' +d_setpent='define' +d_setpgid='define' +d_setpgrp='define' +d_setpgrp2='undef' +d_setprior='define' +d_setproctitle='undef' +d_setprotoent_r='undef' +d_setpwent='define' +d_setpwent_r='undef' +d_setregid='define' +d_setresgid='define' +d_setresuid='define' +d_setreuid='define' +d_setrgid='undef' +d_setruid='undef' +d_setsent='define' +d_setservent_r='undef' +d_setsid='define' +d_setvbuf='define' +d_shm='undef' +d_shmat='undef' +d_shmatprototype='undef' +d_shmctl='undef' +d_shmdt='undef' +d_shmget='undef' +d_sigaction='undef' +d_siginfo_si_addr='undef' +d_siginfo_si_band='undef' +d_siginfo_si_errno='undef' +d_siginfo_si_fd='undef' +d_siginfo_si_pid='undef' +d_siginfo_si_status='undef' +d_siginfo_si_uid='undef' +d_siginfo_si_value='undef' +d_signbit='define' +d_sigprocmask='undef' +d_sigsetjmp='undef' +d_sin6_scope_id='define' +d_sitearch='define' +d_snprintf='define' +d_sockaddr_in6='define' +d_sockaddr_sa_len='undef' +d_sockatmark='define' +d_sockatmarkproto='define' +d_socket='define' +d_socklen_t='define' +d_sockpair='undef' +d_socks5_init='undef' +d_sqrtl='define' +d_srand48_r='undef' +d_srandom_r='undef' +d_sresgproto='define' +d_sresuproto='define' +d_stat='define' +d_statblks='define' +d_statfs_f_flags='define' +d_statfs_s='define' +d_static_inline='define' +d_statvfs='define' +d_stdio_cnt_lval='undef' +d_stdio_ptr_lval='undef' +d_stdio_ptr_lval_nochange_cnt='undef' +d_stdio_ptr_lval_sets_cnt='undef' +d_stdio_stream_array='undef' +d_stdiobase='undef' +d_stdstdio='undef' +d_strcoll='define' +d_strerror_l='define' +d_strerror_r='undef' +d_strftime='define' +d_strlcat='define' +d_strlcpy='define' +d_strnlen='define' +d_strtod='define' +d_strtod_l='define' +d_strtol='define' +d_strtold='define' +d_strtold_l='define' +d_strtoll='define' +d_strtoq='undef' +d_strtoul='define' +d_strtoull='define' +d_strtouq='undef' +d_strxfrm='define' +d_suidsafe='undef' +d_symlink='define' +d_syscall='undef' +d_syscallproto='undef' +d_sysconf='define' +d_sysernlst='' +d_syserrlst='undef' +d_system='define' +d_tcgetpgrp='define' +d_tcsetpgrp='define' +d_telldir='define' +d_telldirproto='define' +d_tgamma='define' +d_thread_safe_nl_langinfo_l='undef' +d_time='define' +d_timegm='define' +d_times='define' +d_tm_tm_gmtoff='define' +d_tm_tm_zone='define' +d_tmpnam_r='undef' +d_trunc='define' +d_truncate='define' +d_truncl='define' +d_ttyname_r='undef' +d_tzname='undef' +d_u32align='define' +d_ualarm='define' +d_umask='define' +d_uname='define' +d_union_semun='undef' +d_unlinkat='define' +d_unordered='undef' +d_unsetenv='define' +d_uselocale='define' +d_usleep='define' +d_usleepproto='define' +d_ustat='undef' +d_vendorarch='undef' +d_vendorbin='undef' +d_vendorlib='undef' +d_vendorscript='undef' +d_vfork='undef' +d_void_closedir='undef' +d_voidsig='define' +d_voidtty='' +d_vsnprintf='define' +d_wait4='undef' +d_waitpid='undef' +d_wcscmp='define' +d_wcstombs='define' +d_wcsxfrm='define' +d_wctomb='define' +d_writev='define' +d_xenix='undef' +date='date' +db_hashtype='u_int32_t' +db_prefixtype='size_t' +db_version_major='' +db_version_minor='' +db_version_patch='' +default_inc_excludes_dot='define' +direntrytype='struct dirent' +dlext='none' +dlsrc='dl_none.xs' +doubleinfbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f' +doublekind='3' +doublemantbits='52' +doublenanbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff' +doublesize='8' +drand01='Perl_drand48()' +drand48_r_proto='0' +dtrace='' +dtraceobject='' +dtracexnolibs='' +dynamic_ext='' +eagain='EAGAIN' +ebcdic='undef' +echo='echo' +egrep='egrep' +emacs='' +endgrent_r_proto='0' +endhostent_r_proto='0' +endnetent_r_proto='0' +endprotoent_r_proto='0' +endpwent_r_proto='0' +endservent_r_proto='0' +eunicefix=':' +exe_ext='' +expr='expr' +extensions='attributes B Cwd Data/Dumper Devel/Peek Digest/MD5 Digest/SHA Encode Fcntl File/Glob Hash/Util I18N/Langinfo IO List/Util mro Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Tie/Hash/NamedCapture Time/HiRes Time/Piece Unicode/Normalize WebPerl Cpanel/JSON/XS Encode/Byte Encode/Symbol Encode/Unicode Archive/Tar Attribute/Handlers autodie AutoLoader autouse base B/Debug bignum Carp Config/Perl/V constant CPAN CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Devel/SelfStubber Devel/StackTrace Digest Dumpvalue encoding/warnings Env Errno experimental Exporter ExtUtils/CBuilder ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS FileCache File/Fetch File/Find File/Path File/Temp Filter/Simple Future Getopt/Long HTTP/Tiny I18N/Collate I18N/LangTags if IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 JSON/PP lib libnet Locale/Codes Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigRat Math/Complex Memoize Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata Net/Ping NEXT Params/Check parent perlfaq PerlIO/via/QuotedPrint Perl/OSType Pod/Checker Pod/Escapes Pod/Functions Pod/Html podlators Pod/Parser Pod/Perldoc Pod/Simple Pod/Usage Safe Search/Dict SelfLoader Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue Thread/Semaphore Tie/File Tie/Memoize Tie/RefHash Time/Local version XSLoader' +extern_C='extern' +extras='' +fflushNULL='undef' +fflushall='undef' +find='' +firstmakefile='makefile' +flex='' +fpossize='16' +fpostype='fpos_t' +freetype='void' +from=':' +full_ar='/usr/bin/ar' +full_csh='csh' +full_sed='/bin/sed' +gccansipedantic='' +gccosandvers='' +gccversion='4.2.1 Compatible Clang 6.0.1 ' +getgrent_r_proto='0' +getgrgid_r_proto='0' +getgrnam_r_proto='0' +gethostbyaddr_r_proto='0' +gethostbyname_r_proto='0' +gethostent_r_proto='0' +getlogin_r_proto='0' +getnetbyaddr_r_proto='0' +getnetbyname_r_proto='0' +getnetent_r_proto='0' +getprotobyname_r_proto='0' +getprotobynumber_r_proto='0' +getprotoent_r_proto='0' +getpwent_r_proto='0' +getpwnam_r_proto='0' +getpwuid_r_proto='0' +getservbyname_r_proto='0' +getservbyport_r_proto='0' +getservent_r_proto='0' +getspnam_r_proto='0' +gidformat='"lu"' +gidsign='1' +gidsize='4' +gidtype='gid_t' +glibpth='' +gmake='gmake' +gmtime_r_proto='0' +gnulibc_version='' +grep='grep' +groupcat='cat /etc/group' +groupstype='gid_t' +gzip='gzip' +h_fcntl='true' +h_sysfile='false' +hint='recommended' +hostcat='cat /etc/hosts' +hostgenerate='/home/haukex/code/webperl/work/hostperl/generate_uudmap' +hostosname='' +hostperl='/home/haukex/code/webperl/work/hostperl/miniperl' +html1dir=' ' +html1direxp='' +html3dir=' ' +html3direxp='' +i16size='2' +i16type='short' +i32size='4' +i32type='long' +i64size='8' +i64type='long long' +i8size='1' +i8type='signed char' +i_arpainet='define' +i_bfd='undef' +i_bsdioctl='' +i_crypt='define' +i_db='undef' +i_dbm='undef' +i_dirent='define' +i_dlfcn='define' +i_execinfo='undef' +i_fcntl='define' +i_fenv='define' +i_fp='undef' +i_fp_class='undef' +i_gdbm='undef' +i_gdbm_ndbm='undef' +i_gdbmndbm='undef' +i_grp='define' +i_ieeefp='undef' +i_inttypes='define' +i_langinfo='define' +i_libutil='undef' +i_limits='define' +i_locale='define' +i_machcthr='undef' +i_malloc='define' +i_mallocmalloc='undef' +i_mntent='define' +i_ndbm='undef' +i_netdb='define' +i_neterrno='undef' +i_netinettcp='define' +i_niin='define' +i_poll='define' +i_prot='undef' +i_pthread='undef' +i_pwd='define' +i_quadmath='undef' +i_rpcsvcdbm='undef' +i_sgtty='undef' +i_shadow='define' +i_socks='undef' +i_stdbool='define' +i_stdint='define' +i_stdlib='define' +i_string='define' +i_sunmath='undef' +i_sysaccess='undef' +i_sysdir='define' +i_sysfile='undef' +i_sysfilio='undef' +i_sysin='undef' +i_sysioctl='define' +i_syslog='define' +i_sysmman='define' +i_sysmode='undef' +i_sysmount='define' +i_sysndir='undef' +i_sysparam='define' +i_syspoll='define' +i_sysresrc='define' +i_syssecrt='undef' +i_sysselct='define' +i_syssockio='undef' +i_sysstat='define' +i_sysstatfs='define' +i_sysstatvfs='define' +i_systime='define' +i_systimek='undef' +i_systimes='define' +i_systypes='define' +i_sysuio='define' +i_sysun='define' +i_sysutsname='define' +i_sysvfs='define' +i_syswait='define' +i_termio='undef' +i_termios='define' +i_time='define' +i_unistd='define' +i_ustat='undef' +i_utime='define' +i_vfork='undef' +i_wchar='define' +i_xlocale='define' +ignore_versioned_solibs='' +inc_version_list=' ' +inc_version_list_init='0' +incpath='' +incpth='/usr/local/include /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/include /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/include /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/local/include /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL /usr/local/include /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/include /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/include /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/local/include /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL' +inews='' +initialinstalllocation='/opt/perl/bin' +installarchlib='/opt/perl/lib/5.28.1/wasm' +installbin='/opt/perl/bin' +installhtml1dir='' +installhtml3dir='' +installman1dir='' +installman3dir='' +installprefix='/opt/perl' +installprefixexp='/opt/perl' +installprivlib='/opt/perl/lib/5.28.1' +installscript='/opt/perl/bin' +installsitearch='/opt/perl/lib/site_perl/5.28.1/wasm' +installsitebin='/opt/perl/bin' +installsitehtml1dir='' +installsitehtml3dir='' +installsitelib='/opt/perl/lib/site_perl/5.28.1' +installsiteman1dir='' +installsiteman3dir='' +installsitescript='/opt/perl/bin' +installstyle='lib' +installusrbinperl='undef' +installvendorarch='' +installvendorbin='' +installvendorhtml1dir='' +installvendorhtml3dir='' +installvendorlib='' +installvendorman1dir='' +installvendorman3dir='' +installvendorscript='' +intsize='4' +issymlink='test -h' +ivdformat='"ld"' +ivsize='4' +ivtype='long' +known_extensions='Amiga/ARexx Amiga/Exec Archive/Tar arybase Attribute/Handlers attributes autodie AutoLoader autouse B base B/Debug bignum Carp Compress/Raw/Bzip2 Compress/Raw/Zlib Config/Perl/V constant CPAN Cpanel/JSON/XS CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Cwd Data/Dumper DB_File Devel/Peek Devel/PPPort Devel/SelfStubber Devel/StackTrace Digest Digest/MD5 Digest/SHA Dumpvalue Encode encoding/warnings Env Errno experimental Exporter ExtUtils/CBuilder ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS Fcntl FileCache File/DosGlob File/Fetch File/Find File/Glob File/Path File/Temp Filter/Simple Filter/Util/Call Future GDBM_File Getopt/Long Hash/Util Hash/Util/FieldHash HTTP/Tiny I18N/Collate I18N/Langinfo I18N/LangTags if IO IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 IPC/SysV JSON/PP lib libnet List/Util Locale/Codes Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigInt/FastCalc Math/BigRat Math/Complex Memoize MIME/Base64 Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata mro NDBM_File Net/Ping NEXT ODBM_File Opcode Params/Check parent perlfaq PerlIO/encoding PerlIO/mmap PerlIO/scalar PerlIO/via PerlIO/via/QuotedPrint Perl/OSType Pod/Checker Pod/Escapes Pod/Functions Pod/Html podlators Pod/Parser Pod/Perldoc Pod/Simple Pod/Usage POSIX re Safe SDBM_File Search/Dict SelfLoader Socket Storable Sys/Hostname Sys/Syslog Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue threads Thread/Semaphore threads/shared Tie/File Tie/Hash/NamedCapture Tie/Memoize Tie/RefHash Time/HiRes Time/Local Time/Piece Unicode/Collate Unicode/Normalize version VMS/DCLsym VMS/Filespec VMS/Stdio WebPerl Win32 Win32API/File Win32CORE XS/APItest XSLoader XS/Typemap Encode/Byte Encode/Symbol Encode/Unicode' +ksh='' +ld='ld' +ld_can_script='undef' +lddlflags='' +ldflags=' -O2 -s NO_EXIT_RUNTIME=1 -s ALLOW_MEMORY_GROWTH=1 -Wno-almost-asm -s WASM=1 -s BINARYEN_METHOD=native-wasm -fstack-protector-strong' +ldflags_uselargefiles='' +ldlibpthname='LD_LIBRARY_PATH' +less='less' +lib_ext='.a' +libc='' +libperl='libperl.a' +libpth='/usr/local/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL /usr/local/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL' +libs=' ' +libsdirs='' +libsfiles='' +libsfound='' +libspath=' /usr/local/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL /usr/local/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL' +libswanted='cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld sun m crypt sec util c cposix posix ucb bsd BSD' +libswanted_uselargefiles='' +line='' +lint='' +lkflags='' +ln='ln' +lns='/bin/ln' +localtime_r_proto='0' +locincpth='/usr/local/include /opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include' +loclibpth='' +longdblinfbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f' +longdblkind='0' +longdblmantbits='52' +longdblnanbytes='0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff' +longdblsize='8' +longlongsize='8' +longsize='4' +lp='' +lpr='' +ls='ls' +lseeksize='4' +lseektype='off_t' +mail='' +mailx='' +make='make' +make_set_make='#' +mallocobj='' +mallocsrc='' +malloctype='void *' +man1dir=' ' +man1direxp='' +man1ext='0' +man3dir=' ' +man3direxp='' +man3ext='0' +mips_type='' +mistrustnm='' +mkdir='mkdir' +mmaptype='void *' +modetype='mode_t' +more='more' +multiarch='undef' +mv='' +myarchname='x86_64-emscripten' +mydomain='.local' +myhostname='localhost' +myuname='linux devbox 4.15.0-45-generic #48-ubuntu smp tue jan 29 16:28:13 utc 2019 x86_64 x86_64 x86_64 gnulinux ' +n='-n' +need_va_copy='define' +netdb_hlen_type='size_t' +netdb_host_type='char *' +netdb_name_type='const char *' +netdb_net_type='in_addr_t' +nm='nm' +nm_opt='' +nm_so_opt='--dynamic' +noextensions='IPC/SysV' +nonxs_ext='Archive/Tar Attribute/Handlers autodie AutoLoader autouse base B/Debug bignum Carp Config/Perl/V constant CPAN CPAN/Meta CPAN/Meta/Requirements CPAN/Meta/YAML Devel/SelfStubber Devel/StackTrace Digest Dumpvalue encoding/warnings Env Errno experimental Exporter ExtUtils/CBuilder ExtUtils/Constant ExtUtils/Install ExtUtils/MakeMaker ExtUtils/Manifest ExtUtils/Miniperl ExtUtils/ParseXS FileCache File/Fetch File/Find File/Path File/Temp Filter/Simple Future Getopt/Long HTTP/Tiny I18N/Collate I18N/LangTags if IO/Compress IO/Socket/IP IO/Zlib IPC/Cmd IPC/Open3 JSON/PP lib libnet Locale/Codes Locale/Maketext Locale/Maketext/Simple Math/BigInt Math/BigRat Math/Complex Memoize Module/CoreList Module/Load Module/Load/Conditional Module/Loaded Module/Metadata Net/Ping NEXT Params/Check parent perlfaq PerlIO/via/QuotedPrint Perl/OSType Pod/Checker Pod/Escapes Pod/Functions Pod/Html podlators Pod/Parser Pod/Perldoc Pod/Simple Pod/Usage Safe Search/Dict SelfLoader Term/ANSIColor Term/Cap Term/Complete Term/ReadLine Test Test/Harness Test/Simple Text/Abbrev Text/Balanced Text/ParseWords Text/Tabs Thread/Queue Thread/Semaphore Tie/File Tie/Memoize Tie/RefHash Time/Local version XSLoader' +nroff='nroff' +nvEUformat='"E"' +nvFUformat='"F"' +nvGUformat='"G"' +nv_overflows_integers_at='256.0*256.0*256.0*256.0*256.0*256.0*2.0*2.0*2.0*2.0*2.0' +nv_preserves_uv_bits='32' +nveformat='"e"' +nvfformat='"f"' +nvgformat='"g"' +nvmantbits='52' +nvsize='8' +nvtype='double' +o_nonblock='O_NONBLOCK' +obj_ext='.o' +old_pthread_create_joinable='' +optimize='-O2' +orderlib='false' +osname='emscripten' +osvers='1.38.28' +otherlibdirs=' ' +package='perl5' +pager='/usr/bin/less -R' +passcat='cat /etc/passwd' +patchlevel='28' +path_sep=':' +perl='perl' +perl5='/home/haukex/perl5/perlbrew/perls/perl-5.28.0/bin/perl' +perl_patchlevel='' +perl_static_inline='static __inline__' +perladmin='root@localhost' +perllibs=' ' +perlpath='/opt/perl/bin/perl' +pg='pg' +phostname='' +pidtype='pid_t' +plibpth='' +pmake='' +pr='' +prefix='/opt/perl' +prefixexp='/opt/perl' +privlib='/opt/perl/lib/5.28.1' +privlibexp='/opt/perl/lib/5.28.1' +procselfexe='' +prototype='define' +ptrsize='4' +quadkind='3' +quadtype='long long' +randbits='48' +randfunc='Perl_drand48' +random_r_proto='0' +randseedtype='U32' +ranlib='/home/haukex/emsdk/clang/e1.38.28_64bit/llvm-ranlib' +rd_nodata='-1' +readdir64_r_proto='0' +readdir_r_proto='0' +revision='5' +rm='rm' +rm_try='/bin/rm -f try try a.out .out try.[cho] try..o core core.try* try.core*' +rmail='' +run='' +runnm='false' +sGMTIME_max='2147483647' +sGMTIME_min='-2147483648' +sLOCALTIME_max='2147483647' +sLOCALTIME_min='-2147483648' +sPRIEUldbl='"E"' +sPRIFUldbl='"F"' +sPRIGUldbl='"G"' +sPRIXU64='"llX"' +sPRId64='"lld"' +sPRIeldbl='"e"' +sPRIfldbl='"f"' +sPRIgldbl='"g"' +sPRIi64='"lli"' +sPRIo64='"llo"' +sPRIu64='"llu"' +sPRIx64='"llx"' +sSCNfldbl='"f"' +sched_yield='sched_yield()' +scriptdir='/opt/perl/bin' +scriptdirexp='/opt/perl/bin' +sed='sed' +seedfunc='Perl_drand48_init' +selectminbits='32' +selecttype='fd_set *' +sendmail='' +setgrent_r_proto='0' +sethostent_r_proto='0' +setlocale_r_proto='0' +setnetent_r_proto='0' +setprotoent_r_proto='0' +setpwent_r_proto='0' +setservent_r_proto='0' +sh='/bin/sh' +shar='' +sharpbang='#!' +shmattype='' +shortsize='2' +shrpenv='' +shsharp='true' +sig_count='65' +sig_name='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS NUM32 NUM33 NUM34 NUM35 NUM36 NUM37 NUM38 NUM39 NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 NUM48 NUM49 NUM50 NUM51 NUM52 NUM53 NUM54 NUM55 NUM56 NUM57 NUM58 NUM59 NUM60 NUM61 NUM62 NUM63 NUM64 RTMIN IOT POLL UNUSED ' +sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "SYS", "NUM32", "NUM33", "NUM34", "NUM35", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41", "NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "NUM48", "NUM49", "NUM50", "NUM51", "NUM52", "NUM53", "NUM54", "NUM55", "NUM56", "NUM57", "NUM58", "NUM59", "NUM60", "NUM61", "NUM62", "NUM63", "NUM64", "RTMIN", "IOT", "POLL", "UNUSED", 0' +sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 0 6 29 31 ' +sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 0, 6, 29, 31, 0' +sig_size='69' +signal_t='void' +sitearch='/opt/perl/lib/site_perl/5.28.1/wasm' +sitearchexp='/opt/perl/lib/site_perl/5.28.1/wasm' +sitebin='/opt/perl/bin' +sitebinexp='/opt/perl/bin' +sitehtml1dir='' +sitehtml1direxp='' +sitehtml3dir='' +sitehtml3direxp='' +sitelib='/opt/perl/lib/site_perl/5.28.1' +sitelib_stem='/opt/perl/lib/site_perl' +sitelibexp='/opt/perl/lib/site_perl/5.28.1' +siteman1dir='' +siteman1direxp='' +siteman3dir='' +siteman3direxp='' +siteprefix='/opt/perl' +siteprefixexp='/opt/perl' +sitescript='/opt/perl/bin' +sitescriptexp='/opt/perl/bin' +sizesize='4' +sizetype='size_t' +sleep='' +smail='' +so='so' +sockethdr='' +socketlib='' +socksizetype='socklen_t' +sort='sort' +spackage='Perl5' +spitshell='cat' +srand48_r_proto='0' +srandom_r_proto='0' +src='.' +ssizetype='ssize_t' +st_ino_sign='1' +st_ino_size='4' +startperl='#!/opt/perl/bin/perl' +startsh='#!/bin/sh' +static_ext='attributes B Cwd Data/Dumper Devel/Peek Digest/MD5 Digest/SHA Encode Fcntl File/Glob Hash/Util I18N/Langinfo IO List/Util mro Opcode PerlIO/encoding PerlIO/scalar PerlIO/via POSIX re SDBM_File Socket Tie/Hash/NamedCapture Time/HiRes Time/Piece Unicode/Normalize WebPerl Cpanel/JSON/XS Encode/Byte Encode/Symbol Encode/Unicode' +stdchar='char' +stdio_base='((fp)->_base)' +stdio_bufsiz='((fp)->_cnt + (fp)->_ptr - (fp)->_base)' +stdio_cnt='((fp)->_cnt)' +stdio_filbuf='' +stdio_ptr='((fp)->_ptr)' +stdio_stream_array='' +strerror_r_proto='0' +submit='' +subversion='1' +sysman='/usr/share/man/man1' +sysroot='/home/haukex/emsdk/emscripten/1.38.28/system' +tail='' +tar='' +targetarch='' +targetdir='' +targetenv='' +targethost='' +targetmkdir='' +targetport='' +targetsh='/bin/sh' +tbl='' +tee='' +test='test' +timeincl='/home/haukex/emsdk/emscripten/1.38.28/system/include/libc/sys/time.h ' +timetype='time_t' +tmpnam_r_proto='0' +to=':' +touch='touch' +tr='tr' +trnl='\n' +troff='' +ttyname_r_proto='0' +u16size='2' +u16type='unsigned short' +u32size='4' +u32type='unsigned long' +u64size='8' +u64type='unsigned long long' +u8size='1' +u8type='unsigned char' +uidformat='"lu"' +uidsign='1' +uidsize='4' +uidtype='uid_t' +uname='uname' +uniq='uniq' +uquadtype='unsigned long long' +use5005threads='undef' +use64bitall='undef' +use64bitint='undef' +usecbacktrace='undef' +usecrosscompile='undef' +usedevel='undef' +usedl='undef' +usedtrace='undef' +usefaststdio='undef' +useithreads='undef' +usekernprocpathname='undef' +uselanginfo='true' +uselargefiles='undef' +uselongdouble='undef' +usemallocwrap='define' +usemorebits='undef' +usemultiplicity='undef' +usemymalloc='n' +usenm='false' +usensgetexecutablepath='undef' +useopcode='true' +useperlio='define' +useposix='true' +usequadmath='undef' +usereentrant='undef' +userelocatableinc='undef' +useshrplib='false' +usesitecustomize='undef' +usesocks='undef' +usethreads='undef' +usevendorprefix='undef' +useversionedarchname='undef' +usevfork='false' +usrinc='/home/haukex/emsdk/emscripten/1.38.28/system/usr/include' +uuname='' +uvXUformat='"lX"' +uvoformat='"lo"' +uvsize='4' +uvtype='unsigned long' +uvuformat='"lu"' +uvxformat='"lx"' +vendorarch='' +vendorarchexp='' +vendorbin='' +vendorbinexp='' +vendorhtml1dir=' ' +vendorhtml1direxp='' +vendorhtml3dir=' ' +vendorhtml3direxp='' +vendorlib='' +vendorlib_stem='' +vendorlibexp='' +vendorman1dir=' ' +vendorman1direxp='' +vendorman3dir=' ' +vendorman3direxp='' +vendorprefix='' +vendorprefixexp='' +vendorscript='' +vendorscriptexp='' +version='5.28.1' +version_patchlevel_string='version 28 subversion 1' +versiononly='undef' +vi='' +xlibpth='/usr/lib/386 /lib/386' +yacc='yacc' +yaccflags='' +zcat='' +zip='zip' +!END! + +my $i = ord(4); +foreach my $c (3,2,1) { $i <<= 8; $i |= ord($c); } +our $byteorder = join('', unpack('aaaa', pack('L!', $i))); +s/(byteorder=)(['"]).*?\2/$1$2$Config::byteorder$2/m; + +my $config_sh_len = length $_; + +our $Config_SH_expanded = "\n$_" . << 'EOVIRTUAL'; +ccflags_nolargefiles='-D_GNU_SOURCE -D_POSIX_C_SOURCE -DSTANDARD_C -DPERL_USE_SAFE_PUTENV -DNO_MATHOMS -Wno-null-pointer-arithmetic -fno-strict-aliasing -pipe -fstack-protector-strong -I/usr/local/include -D_FORTIFY_SOURCE=2' +ldflags_nolargefiles=' -O2 -s NO_EXIT_RUNTIME=1 -s ALLOW_MEMORY_GROWTH=1 -Wno-almost-asm -s WASM=1 -s BINARYEN_METHOD=native-wasm -fstack-protector-strong' +libs_nolargefiles=' ' +libswanted_nolargefiles='cl pthread socket bind inet nsl ndbm gdbm dbm db malloc dl ld sun m crypt sec util c cposix posix ucb bsd BSD' +ccwarnflags=' -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings' +ccstdflags=' -std=c89' +EOVIRTUAL +eval { + # do not have hairy conniptions if this isnt available + require 'Config_git.pl'; + $Config_SH_expanded .= $Config::Git_Data; + 1; +} or warn "Warning: failed to load Config_git.pl, something strange about this perl...\n"; + +# Search for it in the big string +sub fetch_string { + my($self, $key) = @_; + + return undef unless $Config_SH_expanded =~ /\n$key=\'(.*?)\'\n/s; + # So we can say "if $Config{'foo'}". + $self->{$key} = $1 eq 'undef' ? undef : $1; +} + +my $prevpos = 0; + +sub FIRSTKEY { + $prevpos = 0; + substr($Config_SH_expanded, 1, index($Config_SH_expanded, '=') - 1 ); +} + +sub NEXTKEY { + my $pos = index($Config_SH_expanded, qq('\n), $prevpos) + 2; + my $len = index($Config_SH_expanded, "=", $pos) - $pos; + $prevpos = $pos; + $len > 0 ? substr($Config_SH_expanded, $pos, $len) : undef; +} + +sub EXISTS { + return 1 if exists($_[0]->{$_[1]}); + + return(index($Config_SH_expanded, "\n$_[1]='") != -1 + ); +} + +sub STORE { die "\%Config::Config is read-only\n" } +*DELETE = *CLEAR = \*STORE; # Typeglob aliasing uses less space + +sub config_sh { + substr $Config_SH_expanded, 1, $config_sh_len; +} + +sub config_re { + my $re = shift; + return map { chomp; $_ } grep eval{ /^(?:$re)=/ }, split /^/, + $Config_SH_expanded; +} + +sub config_vars { + # implements -V:cfgvar option (see perlrun -V:) + foreach (@_) { + # find optional leading, trailing colons; and query-spec + my ($notag,$qry,$lncont) = m/^(:)?(.*?)(:)?$/; # flags fore and aft, + # map colon-flags to print decorations + my $prfx = $notag ? '': "$qry="; # tag-prefix for print + my $lnend = $lncont ? ' ' : ";\n"; # line ending for print + + # all config-vars are by definition \w only, any \W means regex + if ($qry =~ /\W/) { + my @matches = config_re($qry); + print map "$_$lnend", @matches ? @matches : "$qry: not found" if !$notag; + print map { s/\w+=//; "$_$lnend" } @matches ? @matches : "$qry: not found" if $notag; + } else { + my $v = (exists $Config::Config{$qry}) ? $Config::Config{$qry} + : 'UNKNOWN'; + $v = 'undef' unless defined $v; + print "${prfx}'${v}'$lnend"; + } + } +} + +# Called by the real AUTOLOAD +sub launcher { + undef &AUTOLOAD; + goto \&$Config::AUTOLOAD; +} + +1; +# + +package IO; + +use XSLoader (); +use Carp; +use strict; +use warnings; + +our $VERSION = "1.39"; +XSLoader::load 'IO', $VERSION; + +sub import { + shift; + + warnings::warnif('deprecated', qq{Parameterless "use IO" deprecated}) + if @_ == 0 ; + + my @l = @_ ? @_ : qw(Handle Seekable File Pipe Socket Dir); + + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + eval join("", map { "require IO::" . (/(\w+)/)[0] . ";\n" } @l) + or croak $@; +} + +1; + +__END__ + + +# $Id: encoding.pm,v 2.22 2018/02/11 05:32:03 dankogai Exp $ +package encoding; +our $VERSION = sprintf "%d.%02d", q$Revision: 2.22 $ =~ /(\d+)/g; + +use Encode; +use strict; +use warnings; +use Config; + +use constant { + DEBUG => !!$ENV{PERL_ENCODE_DEBUG}, + HAS_PERLIO => eval { require PerlIO::encoding; PerlIO::encoding->VERSION(0.02) }, + PERL_5_21_7 => $^V && $^V ge v5.21.7, # lexically scoped +}; + +sub _exception { + my $name = shift; + $] > 5.008 and return 0; # 5.8.1 or higher then no + my %utfs = map { $_ => 1 } + qw(utf8 UCS-2BE UCS-2LE UTF-16 UTF-16BE UTF-16LE + UTF-32 UTF-32BE UTF-32LE); + $utfs{$name} or return 0; # UTFs or no + require Config; + Config->import(); + our %Config; + return $Config{perl_patchlevel} ? 0 : 1 # maintperl then no +} + +sub in_locale { $^H & ( $locale::hint_bits || 0 ) } + +sub _get_locale_encoding { + my $locale_encoding; + + if ($^O eq 'MSWin32') { + my @tries = ( + # First try to get the OutputCP. This will work only if we + # are attached to a console + 'Win32.pm' => 'Win32::GetConsoleOutputCP', + 'Win32/Console.pm' => 'Win32::Console::OutputCP', + # If above failed, this means that we are a GUI app + # Let's assume that the ANSI codepage is what matters + 'Win32.pm' => 'Win32::GetACP', + ); + while (@tries) { + my $cp = eval { + require $tries[0]; + no strict 'refs'; + &{$tries[1]}() + }; + if ($cp) { + if ($cp == 65001) { # Code page for UTF-8 + $locale_encoding = 'UTF-8'; + } else { + $locale_encoding = 'cp' . $cp; + } + return $locale_encoding; + } + splice(@tries, 0, 2) + } + } + + # I18N::Langinfo isn't available everywhere + $locale_encoding = eval { + require I18N::Langinfo; + find_encoding( + I18N::Langinfo::langinfo( I18N::Langinfo::CODESET() ) + )->name + }; + return $locale_encoding if defined $locale_encoding; + + eval { + require POSIX; + # Get the current locale + # Remember that MSVCRT impl is quite different from Unixes + my $locale = POSIX::setlocale(POSIX::LC_CTYPE()); + if ( $locale =~ /^([^.]+)\.([^.@]+)(?:@.*)?$/ ) { + my $country_language; + ( $country_language, $locale_encoding ) = ( $1, $2 ); + + # Could do more heuristics based on the country and language + # since we have Locale::Country and Locale::Language available. + # TODO: get a database of Language -> Encoding mappings + # (the Estonian database at http://www.eki.ee/letter/ + # would be excellent!) --jhi + if (lc($locale_encoding) eq 'euc') { + if ( $country_language =~ /^ja_JP|japan(?:ese)?$/i ) { + $locale_encoding = 'euc-jp'; + } + elsif ( $country_language =~ /^ko_KR|korean?$/i ) { + $locale_encoding = 'euc-kr'; + } + elsif ( $country_language =~ /^zh_CN|chin(?:a|ese)$/i ) { + $locale_encoding = 'euc-cn'; + } + elsif ( $country_language =~ /^zh_TW|taiwan(?:ese)?$/i ) { + $locale_encoding = 'euc-tw'; + } + else { + require Carp; + Carp::croak( + "encoding: Locale encoding '$locale_encoding' too ambiguous" + ); + } + } + } + }; + + return $locale_encoding; +} + +sub import { + + if ( ord("A") == 193 ) { + require Carp; + Carp::croak("encoding: pragma does not support EBCDIC platforms"); + } + + my $deprecate = + ($] >= 5.017 and !$Config{usecperl}) + ? "Use of the encoding pragma is deprecated" : 0; + + my $class = shift; + my $name = shift; + if (!$name){ + require Carp; + Carp::croak("encoding: no encoding specified."); + } + if ( $name eq ':_get_locale_encoding' ) { # used by lib/open.pm + my $caller = caller(); + { + no strict 'refs'; + *{"${caller}::_get_locale_encoding"} = \&_get_locale_encoding; + } + return; + } + $name = _get_locale_encoding() if $name eq ':locale'; + BEGIN { strict->unimport('hashpairs') if $] >= 5.027 and $^V =~ /c$/; } + my %arg = @_; + $name = $ENV{PERL_ENCODING} unless defined $name; + my $enc = find_encoding($name); + unless ( defined $enc ) { + require Carp; + Carp::croak("encoding: Unknown encoding '$name'"); + } + $name = $enc->name; # canonize + unless ( $arg{Filter} ) { + if ($] >= 5.025003 and !$Config{usecperl}) { + require Carp; + Carp::croak("The encoding pragma is no longer supported. Check cperl"); + } + warnings::warnif("deprecated",$deprecate) if $deprecate; + + DEBUG and warn "_exception($name) = ", _exception($name); + if (! _exception($name)) { + if (!PERL_5_21_7) { + ${^ENCODING} = $enc; + } + else { + # Starting with 5.21.7, this pragma uses a shadow variable + # designed explicitly for it, ${^E_NCODING}, to enforce + # lexical scope; instead of ${^ENCODING}. + $^H{'encoding'} = 1; + ${^E_NCODING} = $enc; + } + } + if (! HAS_PERLIO ) { + return 1; + } + } + else { + warnings::warnif("deprecated",$deprecate) if $deprecate; + + defined( ${^ENCODING} ) and undef ${^ENCODING}; + undef ${^E_NCODING} if PERL_5_21_7; + + # implicitly 'use utf8' + require utf8; # to fetch $utf8::hint_bits; + $^H |= $utf8::hint_bits; + + require Filter::Util::Call; + Filter::Util::Call->import; + filter_add( + sub { + my $status = filter_read(); + if ( $status > 0 ) { + $_ = $enc->decode( $_, 1 ); + DEBUG and warn $_; + } + $status; + } + ); + } + defined ${^UNICODE} and ${^UNICODE} != 0 and return 1; + for my $h (qw(STDIN STDOUT)) { + if ( $arg{$h} ) { + unless ( defined find_encoding( $arg{$h} ) ) { + require Carp; + Carp::croak( + "encoding: Unknown encoding for $h, '$arg{$h}'"); + } + binmode( $h, ":raw :encoding($arg{$h})" ); + } + else { + unless ( exists $arg{$h} ) { + no warnings 'uninitialized'; + binmode( $h, ":raw :encoding($name)" ); + } + } + } + return 1; # I doubt if we need it, though +} + +sub unimport { + no warnings; + undef ${^ENCODING}; + undef ${^E_NCODING} if PERL_5_21_7; + if (HAS_PERLIO) { + binmode( STDIN, ":raw" ); + binmode( STDOUT, ":raw" ); + } + else { + binmode(STDIN); + binmode(STDOUT); + } + if ( $INC{"Filter/Util/Call.pm"} ) { + eval { filter_del() }; + } +} + +1; +__END__ + +package WebPerl; +use 5.026; +use warnings; +use Carp; +use Cpanel::JSON::XS qw/encode_json/; +use Scalar::Util qw/blessed refaddr/; +use Sub::Util qw/subname/; +use Data::Dumper (); + +=head1 SYNOPSIS + + use WebPerl qw/js/; + js(q{ alert("I am JavaScript!"); }); + +Please see the documentation at L<http://webperl.zero-g.net/using.html>! + +=head1 Author, Copyright, and License + +B<< WebPerl - L<http://webperl.zero-g.net> >> + +Copyright (c) 2018 Hauke Daempfling (haukex@zero-g.net) +at the Leibniz Institute of Freshwater Ecology and Inland Fisheries (IGB), +Berlin, Germany, L<http://www.igb-berlin.de> + +This program is free software; you can redistribute it and/or modify +it under the same terms as Perl 5 itself: either the GNU General Public +License as published by the Free Software Foundation (either version 1, +or, at your option, any later version), or the "Artistic License" which +comes with Perl 5. + +This program is distributed in the hope that it will be useful, but +B<WITHOUT ANY WARRANTY>; without even the implied warranty of +B<MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE>. +See the licenses for details. + +You should have received a copy of the licenses along with this program. +If not, see L<http://perldoc.perl.org/index-licence.html>. + +=cut + +our $VERSION = '0.09'; # v0.09-beta + +require XSLoader; +XSLoader::load('WebPerl', $VERSION); + +use Exporter 'import'; +our @EXPORT_OK = qw/ js encode_json unregister sub_once sub1 js_new /; + +our $JSON = Cpanel::JSON::XS->new->allow_nonref; +our $TRACE = 0; + +STDOUT->autoflush(1); # assume the user will always want this + +sub _perlstr { + confess "bad nr of args" unless @_==1; + my $str = shift; + croak "can only be used on scalars" if ref $str; + state $dumper = Data::Dumper->new([])->Useqq(1)->Terse(1)->Indent(0)->Purity(1); + return $dumper->Reset->Values([$str])->Dump; +} + +sub js { + croak "incorrect number of arguments to js()" unless @_==1; + my $code = shift; + return undef if !defined $code; # pass thru without calling JS + if (my $r = ref $code) { + if ($r eq 'HASH' || $r eq 'ARRAY' || $r eq 'CODE') + { $code = '('._to_js($code).')' } + else { croak "unsupported argument to js()" } + } + $TRACE and say STDERR "js(",_perlstr($code),")"; + carp "js: non-ASCII characters in non-UTF-8 string" #TODO Later: compare to how $JSON->encode() handles this + if !utf8::is_utf8($code) && $code=~/[\x80-\xFF]/aa; + my $rv = xs_eval_js($code, defined wantarray ? 1 : 0); + my $type = chop($rv); + if ($type eq 'U') { return undef } + elsif ($type eq 'B') { return !!$rv } + elsif ($type eq 'N') { return 0+$rv } + elsif ($type eq 'S') { return $rv } + elsif ($type eq 'E') { croak "JS Error: $rv" } + elsif ($type eq 'F' || $type eq 'A' || $type eq 'O') { + return bless { type => $type, id => $rv }, 'WebPerl::JSObject'; + } + elsif ($type eq 'X') { # e.g. "symbol", which we don't (yet) support + carp "unsupported return type from JS: $rv"; + return undef } + confess "js() internal error: $rv"; +} + +sub _my_subkey { sprintf("%06x",refaddr(shift)) } +our %CodeTable; # table to keep refs to anonymous subs which are passed to JS alive +sub _code_reg { + my $sub = shift; + my ($callcode,$is_anon); + my $name = subname($sub); + if ($name=~/\b__ANON__\z/) { $is_anon=1 } + else { # the code ref has a name, check if it's in the symbol table + my ($pack,$n) = $name=~/^(.+)::(.*?)$/; + my $st = do { no strict 'refs'; \%{$pack.'::'} }; + if ( exists $st->{$n} && $st->{$n} && *{$st->{$n}}{CODE} && *{$st->{$n}}{CODE}==$sub ) { + # the code is in the symbol table, so no CodeTable entry needed + $callcode = "do { no strict 'refs'; \\&{"._perlstr($name)."} }"; + } + else { + # the code has a name but it's not what's in the symbol table, treat like anonymous + # (this can happen for example if the caller used Sub::Util::set_subname on an anonymous sub) + $is_anon=1; + } + } + if ($is_anon) { + my $subkey = _my_subkey($sub); + $TRACE and say STDERR "Perl new code table entry ", _perlstr($subkey); + $CodeTable{$subkey} = $sub; + $callcode = _perlstr($subkey); + } + return 'Perl.dispatch.bind(null,' + . $JSON->encode( 'WebPerl::_call_code('.$callcode.')' ) + .')'; +} +sub _call_code { + my $code = shift; + # Handing over arguments via a global JS value is not pretty, but it works for now. + my @args = js('Perl._call_code_args')->@*; + js('delete Perl._call_code_args;'); + my $dbname; + if (my $r = ref $code) { + confess "_call_code was passed an invalid reference type: $r" + unless $r eq 'CODE'; + $dbname = _perlstr(subname($code)); + } + else { + if (!$CodeTable{$code}) { + js('Perl._call_code_error='.$JSON->encode("code table entry '$code' does not exist")); + return; + } + $dbname = _perlstr($code); + $code = $CodeTable{$code}; + } + $TRACE and say STDERR "Perl call $dbname"; + # Note that @args may contain JSObjects, and @args going out of scope could mean + # that those objects are deleted from the Perl.GlueTable before the JS has + # a chance to get to them - that's why we need to copy over the return value + # to JS here before we exit this sub. + my $rv; + if ( eval { $rv = $code->(@args); 1 } ) + { js('Perl._call_code_rv='._to_js($rv)) } + else + { js('Perl._call_code_error='.$JSON->encode( "Perl code $dbname died: ".( $@ ? $@ : 'unknown error' ) )) } + return; +} +# "unregister" exists so that anonymous subs passed to JS can do: WebPerl::unregister(__SUB__); +sub unregister { + croak "bad number of arguments to unregister" unless @_==1; + my $sub = shift; + my $subkey = _my_subkey($sub); + if (exists $CodeTable{$subkey}) { + $TRACE and say STDERR "Perl unregister code table entry ", _perlstr($subkey); + delete $CodeTable{$subkey}; + } + else { carp "attempt to unregister code table entry that doesn't exist: "._perlstr($subkey) } + return; +} +sub sub_once (&) { + my $sub = shift; + return sub { + if (wantarray) { + my @rv = $sub->(@_); + unregister(__SUB__); + return @rv; + } + elsif (defined wantarray) { + my $rv = $sub->(@_); + unregister(__SUB__); + return $rv; + } + else { + $sub->(@_); + unregister(__SUB__); + return; + } + } +} +*sub1 = *sub1 = \&sub_once; + +# It seems that many of the JSON:: modules don't allow hooking so as to be able to output JS "function"s. +# This is my current workaround, encoding the data structures manually... not pretty, but I guess it works. +sub _to_js { #TODO Later: should we provide this to the outside as well? (what for - doesn't js() cover the users' needs?) + confess "bad nr of args" unless @_==1; + my $what = shift; + if (my $r = ref $what) { + if ($r eq 'HASH') { + return '{' . join(',', + map { $JSON->encode("$_").':'._to_js($$what{$_}) } sort keys %$what + ) . '}'; + } + elsif ($r eq 'ARRAY') { + return '[' . join(',', map { _to_js($_) } @$what) . ']'; + } + elsif ($r eq 'CODE') + { return _code_reg($what) } + else { + if (blessed($what) && $what->isa('WebPerl::JSObject')) { + #TODO Later: Are there any cases where we might be passing GlueTable entries to JS that are deleted by our JSObject::DESTROY before JS can get to them? + # (that will depend on all of the places we use _to_js()) + return $what->jscode; + } + croak "can't encode ref $r to JS"; + } + } + else { return $JSON->encode($what) } +} + +sub _to_perl { #TODO: this needs tests + confess "bad nr of args" unless @_==1; + my $what = shift; + if (my $r = ref $what) { + if ($r eq 'HASH' && tied(%$what) && tied(%$what)->isa('WebPerl::JSObject::TiedHash')) { + return { map { ( $_ => _to_perl($$what{$_}) ) } keys %$what }; + } + elsif ($r eq 'ARRAY' && tied(@$what) && tied(@$what)->isa('WebPerl::JSObject::TiedArray')) { + return [ map { _to_perl($_) } @$what ]; + } + elsif (blessed($what) && $what->isa('WebPerl::JSObject')) { + no overloading '%{}'; + if ($what->{type} eq 'F') { # JS Function + # note we don't just return $what->coderef because that doesn't keep a reference to $what alive + return sub { $what->coderef->(@_) } + } + elsif ($what->{type} eq 'A') { # JS Array + return [ map { _to_perl($_) } $what->arrayref->@* ]; + } + elsif ($what->{type} eq 'O') { # JS Object + # I think this only keeps alive methods defined directly as keys on this object? (TODO: test) + my $hr = $what->hashref; + return { map { ( $_ => _to_perl($hr->{$_}) ) } keys $hr->%* }; + } + else { confess "internal error: unexpected type "._perlstr($what->{type}) } + } + else { return $what } + } + else { return $what } +} + +sub js_new { js( 'new '.shift.'('.join(',',map {_to_js($_)} @_).')' ) } + +{ + package WebPerl::JSObject; + use Scalar::Util (); + use overload + '&{}' => \&coderef, '@{}' => \&arrayref, '%{}' => \&hashref, + fallback => 0; #TODO Later: overload stringify? others? + no overloading '%{}'; # so we can do $self->{...} without overloading + + # Note: constructor is WebPerl::js() + + sub jscode { + my $self = shift; + return 'Perl.GlueTable['.$WebPerl::JSON->encode($self->{id}).']'; + } + + sub AUTOLOAD { + our $AUTOLOAD; + #$TRACE and say STDERR "AUTOLOAD ",_perlstr($AUTOLOAD); + ( my $meth = $AUTOLOAD ) =~ s/^.*:://; + splice @_, 1, 0, $meth; + goto &methodcall; + } + sub methodcall { + my $self = shift; + my $meth = shift; + return WebPerl::js($self->jscode + .'['.$WebPerl::JSON->encode("$meth").']('.join(',',map {WebPerl::_to_js($_)} @_).')'); + } + + sub coderef { + my $self = shift; + if (!$self->{sub}) { + my $gt = $self->jscode; + $self->{sub} = sub { + return WebPerl::js($gt.'('.join(',',map {WebPerl::_to_js($_)} @_).')'); + }; + } + return $self->{sub}; + } + + sub arrayref { + my $self = shift; + my $array = $self->{array}; + if (!$array) { + tie my @array, 'WebPerl::JSObject::TiedArray', $self; + $array = $self->{array} = \@array; + Scalar::Util::weaken($self->{array}); # tied obj holds a reference back to us, avoid circular references + } + return $array; + } + + sub hashref { + my $self = shift; + my $hash = $self->{hash}; + if (!$hash) { + tie my %hash, 'WebPerl::JSObject::TiedHash', $self; + $hash = $self->{hash} = \%hash; + Scalar::Util::weaken($self->{hash}); # tied obj holds a reference back to us, avoid circular references + } + return $hash; + } + + sub toperl { + my $self = shift; + return WebPerl::_to_perl($self); + } + + sub DESTROY { + my $self = shift; + #use Carp 'cluck'; cluck "DESTROY WebPerl::JSObject id $self->{id}"; # debug + WebPerl::js('Perl.unglue('.$WebPerl::JSON->encode($self->{id}).')'); + return; + } +} + +{ + package # hide from pause + WebPerl::JSObject::TiedArray; + use parent 'Tie::Array'; + use Carp; + sub TIEARRAY { + confess "bad nr of args" unless @_==2; + my $class = shift; + my $obj = shift; + return bless { obj=>$obj, gt=>$obj->jscode }, $class; + } + sub FETCH { + my ($self,$idx) = @_; + $idx=~/\A\d+\z/ or croak "bad array index '$idx'"; + return WebPerl::js($self->{gt}.'['.$idx.']'); + } + sub STORE { + my ($self,$idx,$val) = @_; + $idx=~/\A\d+\z/ or croak "bad array index '$idx'"; + WebPerl::js($self->{gt}.'['.$idx.']='.WebPerl::_to_js($val)); + return; + } + sub FETCHSIZE { + my ($self) = @_; + return WebPerl::js($self->{gt}.'.length'); + } + sub STORESIZE { + my ($self,$count) = @_; + $count=~/\A\d+\z/ or croak "bad array size '$count'"; + WebPerl::js($self->{gt}.'.length='.$count); + return; + } + sub DELETE { + my ($self,$idx) = @_; + $idx=~/\A\d+\z/ or croak "bad array index '$idx'"; + carp "WARNING: Calling delete on array values is strongly discouraged."; # as per the "delete" docs + WebPerl::js('delete '.$self->{gt}.'['.$idx.']'); + return; + } + sub EXISTS { + my ($self,$idx) = @_; + my $s = $self->FETCHSIZE; + return $idx>=0 && $idx<$s; + } + sub EXTEND {} # not needed + # provided by Tie::Array: - TODO Later: we could implement some of these more efficiently ourselves + #sub CLEAR {} # this + #sub PUSH {} # this, LIST + #sub POP {} # this + #sub SHIFT {} # this + #sub UNSHIFT {} # this, LIST + #sub SPLICE {} # this, offset, length, LIST + sub UNTIE { + my $self = shift; + $self->{obj} = undef; + return; + } + sub DESTROY {} +} + +{ + package # hide from pause + WebPerl::JSObject::TiedHash; + use Carp; + sub TIEHASH { + confess "bad nr of args" unless @_==2; + my $class = shift; + my $obj = shift; + return bless { obj=>$obj, gt=>$obj->jscode }, $class; + } + sub FETCH { + my ($self,$key) = @_; + return WebPerl::js($self->{gt}.'['.$WebPerl::JSON->encode("$key").']'); + } + sub STORE { + my ($self,$key,$val) = @_; + WebPerl::js($self->{gt}.'['.$WebPerl::JSON->encode("$key").'] = '.WebPerl::_to_js($val)); + return; + } + sub DELETE { + my ($self,$key) = @_; + WebPerl::js('delete '.$self->{gt}.'['.$WebPerl::JSON->encode("$key").']'); + return; + } + sub CLEAR { + my ($self) = @_; + WebPerl::js($self->{gt}.'={}'); #TODO Later: is replacing the whole object with a new one the right approach? + return; + } + sub EXISTS { + my ($self,$key) = @_; + # alternatively: ('key' in obj), but that includes inherited stuff - what does the user expect here? + return WebPerl::js($self->{gt}.'.hasOwnProperty('.$WebPerl::JSON->encode("$key").')'); + } + sub FIRSTKEY { + my ($self) = @_; + $self->{keys} = [ map {"$_"} WebPerl::js( 'Object.keys('.$self->{gt}.')' )->@* ]; + $self->{key_idx} = 1; + return $self->{keys}[0]; + } + sub NEXTKEY { + my ($self,$prevkey) = @_; + return $self->{keys}[ $self->{key_idx}++ ]; + } + sub SCALAR { + my ($self) = @_; + return WebPerl::js( 'Object.keys('.$self->{gt}.').length' ); + } + sub UNTIE { + my $self = shift; + $self->{obj} = undef; + return; + } + sub DESTROY {} +} + +1; +# B.pm +# +# Copyright (c) 1996, 1997, 1998 Malcolm Beattie +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +package B; + +@B::ISA = qw(Exporter); + +# If B is loaded without imports, we do not want to unnecessarily pollute the stash with Exporter. +sub import { + return unless scalar @_ > 1; # Called as a method call. + require Exporter; + B->export_to_level(1, @_); +} + +# walkoptree_slow comes from B.pm (you are there), +# walkoptree comes from B.xs + +BEGIN { + $B::VERSION = '1.74'; + @B::EXPORT_OK = (); + + # Our BOOT code needs $VERSION set, and will append to @EXPORT_OK. + # Want our constants loaded before the compiler meets OPf_KIDS below, as + # the combination of having the constant stay a Proxy Constant Subroutine + # and its value being inlined saves a little over .5K + + require XSLoader; + XSLoader::load(); +} + +push @B::EXPORT_OK, (qw(minus_c ppname save_BEGINs + class peekop cast_I32 cstring cchar hash threadsv_names + main_root main_start main_cv svref_2object opnumber + sub_generation amagic_generation perlstring + walkoptree_slow walkoptree walkoptree_exec walksymtable + parents comppadlist sv_undef compile_stats timing_info + begin_av init_av check_av end_av regex_padav dowarn + defstash curstash warnhook diehook inc_gv @optype + @specialsv_name unitcheck_av safename)); + +@B::SV::ISA = 'B::OBJECT'; +@B::NULL::ISA = 'B::SV'; +@B::PV::ISA = 'B::SV'; +@B::IV::ISA = 'B::SV'; +@B::NV::ISA = 'B::SV'; +# RV is eliminated with 5.11.0, but effectively is a specialisation of IV now. +@B::RV::ISA = 'B::IV'; +@B::PVIV::ISA = qw(B::PV B::IV); +@B::PVNV::ISA = qw(B::PVIV B::NV); +@B::PVMG::ISA = 'B::PVNV'; +@B::REGEXP::ISA = 'B::PVMG'; +@B::INVLIST::ISA = 'B::PV'; +@B::PVLV::ISA = 'B::GV'; +@B::BM::ISA = 'B::GV'; +@B::AV::ISA = 'B::PVMG'; +@B::GV::ISA = 'B::PVMG'; +@B::HV::ISA = 'B::PVMG'; +@B::CV::ISA = 'B::PVMG'; +@B::IO::ISA = 'B::PVMG'; +@B::FM::ISA = 'B::CV'; + +@B::OP::ISA = 'B::OBJECT'; +@B::UNOP::ISA = 'B::OP'; +@B::UNOP_AUX::ISA = 'B::UNOP'; +@B::BINOP::ISA = 'B::UNOP'; +@B::LOGOP::ISA = 'B::UNOP'; +@B::LISTOP::ISA = 'B::BINOP'; +@B::SVOP::ISA = 'B::OP'; +@B::PADOP::ISA = 'B::OP'; +@B::PVOP::ISA = 'B::OP'; +@B::LOOP::ISA = 'B::LISTOP'; +@B::PMOP::ISA = 'B::LISTOP'; +@B::COP::ISA = 'B::OP'; +@B::METHOP::ISA = 'B::OP'; + +@B::SPECIAL::ISA = 'B::OBJECT'; + +our @optype = qw(OP UNOP BINOP LOGOP LISTOP PMOP SVOP PADOP PVOP LOOP COP + METHOP UNOP_AUX); +# bytecode.pl contained the following comment: +# Nullsv *must* come first in the following so that the condition +# ($$sv == 0) can continue to be used to test (sv == Nullsv). +our @specialsv_name = qw(Nullsv &PL_sv_undef &PL_sv_yes &PL_sv_no + (SV*)pWARN_ALL (SV*)pWARN_NONE (SV*)pWARN_STD + &PL_sv_zero); + +{ + # Stop "-w" from complaining about the lack of a real B::OBJECT class + package B::OBJECT; +} + +sub B::GV::SAFENAME { + safename(shift()->NAME); +} + +sub safename { + my $name = shift; + + # The regex below corresponds to the isCONTROLVAR macro + # from toke.c + + $name =~ s/^\c?/^?/ + or $name =~ s/^([\cA-\cZ\c\\c[\c]\c_\c^])/ + "^" . chr( utf8::unicode_to_native( 64 ^ ord($1) ))/e; + + # When we say unicode_to_native we really mean ascii_to_native, + # which matters iff this is a non-ASCII platform (EBCDIC). '\c?' would + # not have to be special cased, except for non-ASCII. + + return $name; +} + +sub B::IV::int_value { + my ($self) = @_; + return (($self->FLAGS() & SVf_IVisUV()) ? $self->UVX : $self->IV); +} + +sub B::NULL::as_string() {""} +*B::IV::as_string = *B::IV::as_string = \*B::IV::int_value; +*B::PV::as_string = *B::PV::as_string = \*B::PV::PV; + +# The input typemap checking makes no distinction between different SV types, +# so the XS body will generate the same C code, despite the different XS +# "types". So there is no change in behaviour from doing "newXS" like this, +# compared with the old approach of having a (near) duplicate XS body. +# We should fix the typemap checking. + +# Since perl 5.12.0 +*B::IV::RV = *B::IV::RV = \*B::PV::RV; + +my $debug; +my $op_count = 0; +my @parents = (); + +sub debug { + my ($class, $value) = @_; + $debug = $value; + walkoptree_debug($value); +} + +sub class { + my $obj = shift; + my $name = ref $obj; + $name =~ s/^.*:://; + return $name; +} + +sub parents { \@parents } + +# For debugging +sub peekop { + my $op = shift; + return sprintf("%s (0x%x) %s", class($op), $$op, $op->name); +} + +sub walkoptree_slow { + my($op, $method, $level) = @_; + $op_count++; # just for statistics + $level ||= 0; + warn(sprintf("walkoptree: %d. %s\n", $level, peekop($op))) if $debug; + $op->$method($level) if $op->can($method); + if ($$op && ($op->flags & OPf_KIDS)) { + my $kid; + unshift(@parents, $op); + for ($kid = $op->first; $$kid; $kid = $kid->sibling) { + walkoptree_slow($kid, $method, $level + 1); + } + shift @parents; + } + if (class($op) eq 'PMOP' + && ref($op->pmreplroot) + && ${$op->pmreplroot} + && $op->pmreplroot->isa( 'B::OP' )) + { + unshift(@parents, $op); + walkoptree_slow($op->pmreplroot, $method, $level + 1); + shift @parents; + } +} + +sub compile_stats { + return "Total number of OPs processed: $op_count\n"; +} + +sub timing_info { + my ($sec, $min, $hr) = localtime; + my ($user, $sys) = times; + sprintf("%02d:%02d:%02d user=$user sys=$sys", + $hr, $min, $sec, $user, $sys); +} + +my %symtable; + +sub clearsym { + %symtable = (); +} + +sub savesym { + my ($obj, $value) = @_; +# warn(sprintf("savesym: sym_%x => %s\n", $$obj, $value)); # debug + $symtable{sprintf("sym_%x", $$obj)} = $value; +} + +sub objsym { + my $obj = shift; + return $symtable{sprintf("sym_%x", $$obj)}; +} + +sub walkoptree_exec { + my ($op, $method, $level) = @_; + $level ||= 0; + my ($sym, $ppname); + my $prefix = " " x $level; + for (; $$op; $op = $op->next) { + $sym = objsym($op); + if (defined($sym)) { + print $prefix, "goto $sym\n"; + return; + } + savesym($op, sprintf("%s (0x%lx)", class($op), $$op)); + $op->$method($level); + $ppname = $op->name; + if ($ppname =~ + /^(d?or(assign)?|and(assign)?|mapwhile|grepwhile|entertry|range|cond_expr)$/) + { + print $prefix, uc($1), " => {\n"; + walkoptree_exec($op->other, $method, $level + 1); + print $prefix, "}\n"; + } elsif ($ppname eq "match" || $ppname eq "subst") { + my $pmreplstart = $op->pmreplstart; + if ($$pmreplstart) { + print $prefix, "PMREPLSTART => {\n"; + walkoptree_exec($pmreplstart, $method, $level + 1); + print $prefix, "}\n"; + } + } elsif ($ppname eq "substcont") { + print $prefix, "SUBSTCONT => {\n"; + walkoptree_exec($op->other->pmreplstart, $method, $level + 1); + print $prefix, "}\n"; + $op = $op->other; + } elsif ($ppname eq "enterloop") { + print $prefix, "REDO => {\n"; + walkoptree_exec($op->redoop, $method, $level + 1); + print $prefix, "}\n", $prefix, "NEXT => {\n"; + walkoptree_exec($op->nextop, $method, $level + 1); + print $prefix, "}\n", $prefix, "LAST => {\n"; + walkoptree_exec($op->lastop, $method, $level + 1); + print $prefix, "}\n"; + } elsif ($ppname eq "subst") { + my $replstart = $op->pmreplstart; + if ($$replstart) { + print $prefix, "SUBST => {\n"; + walkoptree_exec($replstart, $method, $level + 1); + print $prefix, "}\n"; + } + } + } +} + +sub walksymtable { + my ($symref, $method, $recurse, $prefix) = @_; + my $sym; + my $fullname; + no strict 'refs'; + $prefix = '' unless defined $prefix; + foreach my $sym ( sort keys %$symref ) { + my $dummy = $symref->{$sym}; # Copying the glob and incrementing + # the GPs refcnt clears cached methods + $fullname = "*main::".$prefix.$sym; + if ($sym =~ /::$/) { + $sym = $prefix . $sym; + if (svref_2object(\*$sym)->NAME ne "main::" && $sym ne "<none>::" && &$recurse($sym)) { + walksymtable(\%$fullname, $method, $recurse, $sym); + } + } else { + svref_2object(\*$fullname)->$method(); + } + } +} + +1; + +__END__ + +package Cwd; +use strict; +use Exporter; + + +our $VERSION = '3.74'; +my $xs_version = $VERSION; +$VERSION =~ tr/_//d; + +our @ISA = qw/ Exporter /; +our @EXPORT = qw(cwd getcwd fastcwd fastgetcwd); +push @EXPORT, qw(getdcwd) if $^O eq 'MSWin32'; +our @EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath); + +# sys_cwd may keep the builtin command + +# All the functionality of this module may provided by builtins, +# there is no sense to process the rest of the file. +# The best choice may be to have this in BEGIN, but how to return from BEGIN? + +if ($^O eq 'os2') { + local $^W = 0; + + *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; + *getcwd = \&cwd; + *fastgetcwd = \&cwd; + *fastcwd = \&cwd; + + *fast_abs_path = \&sys_abspath if defined &sys_abspath; + *abs_path = \&fast_abs_path; + *realpath = \&fast_abs_path; + *fast_realpath = \&fast_abs_path; + + return 1; +} + +# Need to look up the feature settings on VMS. The preferred way is to use the +# VMS::Feature module, but that may not be available to dual life modules. + +my $use_vms_feature; +BEGIN { + if ($^O eq 'VMS') { + if (eval { local $SIG{__DIE__}; + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require VMS::Feature; }) { + $use_vms_feature = 1; + } + } +} + +# Need to look up the UNIX report mode. This may become a dynamic mode +# in the future. +sub _vms_unix_rpt { + my $unix_rpt; + if ($use_vms_feature) { + $unix_rpt = VMS::Feature::current("filename_unix_report"); + } else { + my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + $unix_rpt = $env_unix_rpt =~ /^[ET1]/i; + } + return $unix_rpt; +} + +# Need to look up the EFS character set mode. This may become a dynamic +# mode in the future. +sub _vms_efs { + my $efs; + if ($use_vms_feature) { + $efs = VMS::Feature::current("efs_charset"); + } else { + my $env_efs = $ENV{'DECC$EFS_CHARSET'} || ''; + $efs = $env_efs =~ /^[ET1]/i; + } + return $efs; +} + + +# If loading the XS stuff doesn't work, we can fall back to pure perl +if(! defined &getcwd && defined &DynaLoader::boot_DynaLoader) { # skipped on miniperl + require XSLoader; + XSLoader::load( __PACKAGE__, $xs_version); +} + +# Big nasty table of function aliases +my %METHOD_MAP = + ( + VMS => + { + cwd => '_vms_cwd', + getcwd => '_vms_cwd', + fastcwd => '_vms_cwd', + fastgetcwd => '_vms_cwd', + abs_path => '_vms_abs_path', + fast_abs_path => '_vms_abs_path', + }, + + MSWin32 => + { + # We assume that &_NT_cwd is defined as an XSUB or in the core. + cwd => '_NT_cwd', + getcwd => '_NT_cwd', + fastcwd => '_NT_cwd', + fastgetcwd => '_NT_cwd', + abs_path => 'fast_abs_path', + realpath => 'fast_abs_path', + }, + + dos => + { + cwd => '_dos_cwd', + getcwd => '_dos_cwd', + fastgetcwd => '_dos_cwd', + fastcwd => '_dos_cwd', + abs_path => 'fast_abs_path', + }, + + # QNX4. QNX6 has a $os of 'nto'. + qnx => + { + cwd => '_qnx_cwd', + getcwd => '_qnx_cwd', + fastgetcwd => '_qnx_cwd', + fastcwd => '_qnx_cwd', + abs_path => '_qnx_abs_path', + fast_abs_path => '_qnx_abs_path', + }, + + cygwin => + { + getcwd => 'cwd', + fastgetcwd => 'cwd', + fastcwd => 'cwd', + abs_path => 'fast_abs_path', + realpath => 'fast_abs_path', + }, + + amigaos => + { + getcwd => '_backtick_pwd', + fastgetcwd => '_backtick_pwd', + fastcwd => '_backtick_pwd', + abs_path => 'fast_abs_path', + } + ); + +$METHOD_MAP{NT} = $METHOD_MAP{MSWin32}; + + +# Find the pwd command in the expected locations. We assume these +# are safe. This prevents _backtick_pwd() consulting $ENV{PATH} +# so everything works under taint mode. +my $pwd_cmd; +if($^O ne 'MSWin32') { + foreach my $try ('/bin/pwd', + '/usr/bin/pwd', + '/QOpenSys/bin/pwd', # OS/400 PASE. + ) { + if( -x $try ) { + $pwd_cmd = $try; + last; + } + } +} + +# Android has a built-in pwd. Using $pwd_cmd will DTRT if +# this perl was compiled with -Dd_useshellcmds, which is the +# default for Android, but the block below is needed for the +# miniperl running on the host when cross-compiling, and +# potentially for native builds with -Ud_useshellcmds. +if ($^O =~ /android/) { + # If targetsh is executable, then we're either a full + # perl, or a miniperl for a native build. + if (-x $Config::Config{targetsh}) { + $pwd_cmd = "$Config::Config{targetsh} -c pwd" + } + else { + my $sh = $Config::Config{sh} || (-x '/system/bin/sh' ? '/system/bin/sh' : 'sh'); + $pwd_cmd = "$sh -c pwd" + } +} + +my $found_pwd_cmd = defined($pwd_cmd); +unless ($pwd_cmd) { + # Isn't this wrong? _backtick_pwd() will fail if someone has + # pwd in their path but it is not /bin/pwd or /usr/bin/pwd? + # See [perl #16774]. --jhi + $pwd_cmd = 'pwd'; +} + +# Lazy-load Carp +sub _carp { require Carp; Carp::carp(@_) } +sub _croak { require Carp; Carp::croak(@_) } + +# The 'natural and safe form' for UNIX (pwd may be setuid root) +sub _backtick_pwd { + + # Localize %ENV entries in a way that won't create new hash keys. + # Under AmigaOS we don't want to localize as it stops perl from + # finding 'sh' in the PATH. + my @localize = grep exists $ENV{$_}, qw(PATH IFS CDPATH ENV BASH_ENV) if $^O ne "amigaos"; + local @ENV{@localize} if @localize; + + my $cwd = `$pwd_cmd`; + # Belt-and-suspenders in case someone said "undef $/". + local $/ = "\n"; + # `pwd` may fail e.g. if the disk is full + chomp($cwd) if defined $cwd; + $cwd; +} + +# Since some ports may predefine cwd internally (e.g., NT) +# we take care not to override an existing definition for cwd(). + +unless ($METHOD_MAP{$^O}{cwd} or defined &cwd) { + # The pwd command is not available in some chroot(2)'ed environments + my $sep = $Config::Config{path_sep} || ':'; + my $os = $^O; # Protect $^O from tainting + + + # Try again to find a pwd, this time searching the whole PATH. + if (defined $ENV{PATH} and $os ne 'MSWin32') { # no pwd on Windows + my @candidates = split($sep, $ENV{PATH}); + while (!$found_pwd_cmd and @candidates) { + my $candidate = shift @candidates; + $found_pwd_cmd = 1 if -x "$candidate/pwd"; + } + } + + if( $found_pwd_cmd ) + { + *cwd = \&_backtick_pwd; + } + else { + *cwd = \&getcwd; + } +} + +if ($^O eq 'cygwin') { + # We need to make sure cwd() is called with no args, because it's + # got an arg-less prototype and will die if args are present. + local $^W = 0; + my $orig_cwd = \&cwd; + *cwd = sub { &$orig_cwd() } +} + + +# set a reasonable (and very safe) default for fastgetcwd, in case it +# isn't redefined later (20001212 rspier) +*fastgetcwd = \&cwd; + +# A non-XS version of getcwd() - also used to bootstrap the perl build +# process, when miniperl is running and no XS loading happens. +sub _perl_getcwd +{ + abs_path('.'); +} + +# By John Bazik +# +# Usage: $cwd = &fastcwd; +# +# This is a faster version of getcwd. It's also more dangerous because +# you might chdir out of a directory that you can't chdir back into. + +sub fastcwd_ { + my($odev, $oino, $cdev, $cino, $tdev, $tino); + my(@path, $path); + local(*DIR); + + my($orig_cdev, $orig_cino) = stat('.'); + ($cdev, $cino) = ($orig_cdev, $orig_cino); + for (;;) { + my $direntry; + ($odev, $oino) = ($cdev, $cino); + CORE::chdir('..') || return undef; + ($cdev, $cino) = stat('.'); + last if $odev == $cdev && $oino == $cino; + opendir(DIR, '.') || return undef; + for (;;) { + $direntry = readdir(DIR); + last unless defined $direntry; + next if $direntry eq '.'; + next if $direntry eq '..'; + + ($tdev, $tino) = lstat($direntry); + last unless $tdev != $odev || $tino != $oino; + } + closedir(DIR); + return undef unless defined $direntry; # should never happen + unshift(@path, $direntry); + } + $path = '/' . join('/', @path); + if ($^O eq 'apollo') { $path = "/".$path; } + # At this point $path may be tainted (if tainting) and chdir would fail. + # Untaint it then check that we landed where we started. + $path =~ /^(.*)\z/s # untaint + && CORE::chdir($1) or return undef; + ($cdev, $cino) = stat('.'); + die "Unstable directory path, current directory changed unexpectedly" + if $cdev != $orig_cdev || $cino != $orig_cino; + $path; +} +if (not defined &fastcwd) { *fastcwd = \&fastcwd_ } + + +# Keeps track of current working directory in PWD environment var +# Usage: +# use Cwd 'chdir'; +# chdir $newdir; + +my $chdir_init = 0; + +sub chdir_init { + if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') { + my($dd,$di) = stat('.'); + my($pd,$pi) = stat($ENV{'PWD'}); + if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) { + $ENV{'PWD'} = cwd(); + } + } + else { + my $wd = cwd(); + $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32'; + $ENV{'PWD'} = $wd; + } + # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar) + if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) { + my($pd,$pi) = stat($2); + my($dd,$di) = stat($1); + if (defined $pd and defined $dd and $di == $pi and $dd == $pd) { + $ENV{'PWD'}="$2$3"; + } + } + $chdir_init = 1; +} + +sub chdir { + my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir) + if ($^O eq "cygwin") { + $newdir =~ s|\A///+|//|; + $newdir =~ s|(?<=[^/])//+|/|g; + } + elsif ($^O ne 'MSWin32') { + $newdir =~ s|///*|/|g; + } + chdir_init() unless $chdir_init; + my $newpwd; + if ($^O eq 'MSWin32') { + # get the full path name *before* the chdir() + $newpwd = Win32::GetFullPathName($newdir); + } + + return 0 unless CORE::chdir $newdir; + + if ($^O eq 'VMS') { + return $ENV{'PWD'} = $ENV{'DEFAULT'} + } + elsif ($^O eq 'MSWin32') { + $ENV{'PWD'} = $newpwd; + return 1; + } + + if (ref $newdir eq 'GLOB') { # in case a file/dir handle is passed in + $ENV{'PWD'} = cwd(); + } elsif ($newdir =~ m#^/#s) { + $ENV{'PWD'} = $newdir; + } else { + my @curdir = split(m#/#,$ENV{'PWD'}); + @curdir = ('') unless @curdir; + my $component; + foreach $component (split(m#/#, $newdir)) { + next if $component eq '.'; + pop(@curdir),next if $component eq '..'; + push(@curdir,$component); + } + $ENV{'PWD'} = join('/',@curdir) || '/'; + } + 1; +} + + +sub _perl_abs_path +{ + my $start = @_ ? shift : '.'; + my($dotdots, $cwd, @pst, @cst, $dir, @tst); + + unless (@cst = stat( $start )) + { + return undef; + } + + unless (-d _) { + # Make sure we can be invoked on plain files, not just directories. + # NOTE that this routine assumes that '/' is the only directory separator. + + my ($dir, $file) = $start =~ m{^(.*)/(.+)$} + or return cwd() . '/' . $start; + + # Can't use "-l _" here, because the previous stat was a stat(), not an lstat(). + if (-l $start) { + my $link_target = readlink($start); + die "Can't resolve link $start: $!" unless defined $link_target; + + require File::Spec; + $link_target = $dir . '/' . $link_target + unless File::Spec->file_name_is_absolute($link_target); + + return abs_path($link_target); + } + + return $dir ? abs_path($dir) . "/$file" : "/$file"; + } + + $cwd = ''; + $dotdots = $start; + do + { + $dotdots .= '/..'; + @pst = @cst; + local *PARENT; + unless (opendir(PARENT, $dotdots)) + { + return undef; + } + unless (@cst = stat($dotdots)) + { + my $e = $!; + closedir(PARENT); + $! = $e; + return undef; + } + if ($pst[0] == $cst[0] && $pst[1] == $cst[1]) + { + $dir = undef; + } + else + { + do + { + unless (defined ($dir = readdir(PARENT))) + { + closedir(PARENT); + require Errno; + $! = Errno::ENOENT(); + return undef; + } + $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir")) + } + while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] || + $tst[1] != $pst[1]); + } + $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ; + closedir(PARENT); + } while (defined $dir); + chop($cwd) unless $cwd eq '/'; # drop the trailing / + $cwd; +} + + +my $Curdir; +sub fast_abs_path { + local $ENV{PWD} = $ENV{PWD} || ''; # Guard against clobberage + my $cwd = getcwd(); + defined $cwd or return undef; + require File::Spec; + my $path = @_ ? shift : ($Curdir ||= File::Spec->curdir); + + # Detaint else we'll explode in taint mode. This is safe because + # we're not doing anything dangerous with it. + ($path) = $path =~ /(.*)/s; + ($cwd) = $cwd =~ /(.*)/s; + + unless (-e $path) { + require Errno; + $! = Errno::ENOENT(); + return undef; + } + + unless (-d _) { + # Make sure we can be invoked on plain files, not just directories. + + my ($vol, $dir, $file) = File::Spec->splitpath($path); + return File::Spec->catfile($cwd, $path) unless length $dir; + + if (-l $path) { + my $link_target = readlink($path); + defined $link_target or return undef; + + $link_target = File::Spec->catpath($vol, $dir, $link_target) + unless File::Spec->file_name_is_absolute($link_target); + + return fast_abs_path($link_target); + } + + return $dir eq File::Spec->rootdir + ? File::Spec->catpath($vol, $dir, $file) + : fast_abs_path(File::Spec->catpath($vol, $dir, '')) . '/' . $file; + } + + if (!CORE::chdir($path)) { + return undef; + } + my $realpath = getcwd(); + if (! ((-d $cwd) && (CORE::chdir($cwd)))) { + _croak("Cannot chdir back to $cwd: $!"); + } + $realpath; +} + +# added function alias to follow principle of least surprise +# based on previous aliasing. --tchrist 27-Jan-00 +*fast_realpath = \&fast_abs_path; + + +# --- PORTING SECTION --- + +# VMS: $ENV{'DEFAULT'} points to default directory at all times +# 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu +# Note: Use of Cwd::chdir() causes the logical name PWD to be defined +# in the process logical name table as the default device and directory +# seen by Perl. This may not be the same as the default device +# and directory seen by DCL after Perl exits, since the effects +# the CRTL chdir() function persist only until Perl exits. + +sub _vms_cwd { + return $ENV{'DEFAULT'}; +} + +sub _vms_abs_path { + return $ENV{'DEFAULT'} unless @_; + my $path = shift; + + my $efs = _vms_efs; + my $unix_rpt = _vms_unix_rpt; + + if (defined &VMS::Filespec::vmsrealpath) { + my $path_unix = 0; + my $path_vms = 0; + + $path_unix = 1 if ($path =~ m#(?<=\^)/#); + $path_unix = 1 if ($path =~ /^\.\.?$/); + $path_vms = 1 if ($path =~ m#[\[<\]]#); + $path_vms = 1 if ($path =~ /^--?$/); + + my $unix_mode = $path_unix; + if ($efs) { + # In case of a tie, the Unix report mode decides. + if ($path_vms == $path_unix) { + $unix_mode = $unix_rpt; + } else { + $unix_mode = 0 if $path_vms; + } + } + + if ($unix_mode) { + # Unix format + return VMS::Filespec::unixrealpath($path); + } + + # VMS format + + my $new_path = VMS::Filespec::vmsrealpath($path); + + # Perl expects directories to be in directory format + $new_path = VMS::Filespec::pathify($new_path) if -d $path; + return $new_path; + } + + # Fallback to older algorithm if correct ones are not + # available. + + if (-l $path) { + my $link_target = readlink($path); + die "Can't resolve link $path: $!" unless defined $link_target; + + return _vms_abs_path($link_target); + } + + # may need to turn foo.dir into [.foo] + my $pathified = VMS::Filespec::pathify($path); + $path = $pathified if defined $pathified; + + return VMS::Filespec::rmsexpand($path); +} + +sub _os2_cwd { + my $pwd = `cmd /c cd`; + chomp $pwd; + $pwd =~ s:\\:/:g ; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _win32_cwd_simple { + my $pwd = `cd`; + chomp $pwd; + $pwd =~ s:\\:/:g ; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _win32_cwd { + my $pwd; + $pwd = Win32::GetCwd(); + $pwd =~ s:\\:/:g ; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +*_NT_cwd = defined &Win32::GetCwd ? \&_win32_cwd : \&_win32_cwd_simple; + +sub _dos_cwd { + my $pwd; + if (!defined &Dos::GetCwd) { + chomp($pwd = `command /c cd`); + $pwd =~ s:\\:/:g ; + } else { + $pwd = Dos::GetCwd(); + } + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _qnx_cwd { + local $ENV{PATH} = ''; + local $ENV{CDPATH} = ''; + local $ENV{ENV} = ''; + my $pwd = `/usr/bin/fullpath -t`; + chomp $pwd; + $ENV{'PWD'} = $pwd; + return $pwd; +} + +sub _qnx_abs_path { + local $ENV{PATH} = ''; + local $ENV{CDPATH} = ''; + local $ENV{ENV} = ''; + my $path = @_ ? shift : '.'; + local *REALPATH; + + defined( open(REALPATH, '-|') || exec '/usr/bin/fullpath', '-t', $path ) or + die "Can't open /usr/bin/fullpath: $!"; + my $realpath = <REALPATH>; + close REALPATH; + chomp $realpath; + return $realpath; +} + +# Now that all the base-level functions are set up, alias the +# user-level functions to the right places + +if (exists $METHOD_MAP{$^O}) { + my $map = $METHOD_MAP{$^O}; + foreach my $name (keys %$map) { + local $^W = 0; # assignments trigger 'subroutine redefined' warning + no strict 'refs'; + *{$name} = \&{$map->{$name}}; + } +} + +# In case the XS version doesn't load. +*abs_path = \&_perl_abs_path unless defined &abs_path; +*getcwd = \&_perl_getcwd unless defined &getcwd; + +# added function alias for those of us more +# used to the libc function. --tchrist 27-Jan-00 +*realpath = \&abs_path; + +1; +__END__ + +package SDBM_File; + +use strict; +use warnings; + +require Tie::Hash; +require XSLoader; + +our @ISA = qw(Tie::Hash); +our $VERSION = "1.14"; + +our @EXPORT_OK = qw(PAGFEXT DIRFEXT PAIRMAX); +use Exporter "import"; + +XSLoader::load(); + +1; + +__END__ + +package Opcode; + +use 5.006_001; + +use strict; + +our($VERSION, @ISA, @EXPORT_OK); + +$VERSION = "1.43"; + +use Carp; +use Exporter (); +use XSLoader; + +BEGIN { + @ISA = qw(Exporter); + @EXPORT_OK = qw( + opset ops_to_opset + opset_to_ops opset_to_hex invert_opset + empty_opset full_opset + opdesc opcodes opmask define_optag + opmask_add verify_opset opdump + ); +} + +sub opset (;@); +sub opset_to_hex ($); +sub opdump (;$); +use subs @EXPORT_OK; + +XSLoader::load(); + +_init_optags(); + +sub ops_to_opset { opset @_ } # alias for old name + +sub opset_to_hex ($) { + return "(invalid opset)" unless verify_opset($_[0]); + unpack("h*",$_[0]); +} + +sub opdump (;$) { + my $pat = shift; + # handy utility: perl -MOpcode=opdump -e 'opdump File' + foreach(opset_to_ops(full_opset)) { + my $op = sprintf " %12s %s\n", $_, opdesc($_); + next if defined $pat and $op !~ m/$pat/i; + print $op; + } +} + + + +sub _init_optags { + my(%all, %seen); + @all{opset_to_ops(full_opset)} = (); # keys only + + local($_); + local($/) = "\n=cut"; # skip to optags definition section + <DATA>; + $/ = "\n="; # now read in 'pod section' chunks + while(<DATA>) { + next unless m/^item\s+(:\w+)/; + my $tag = $1; + + # Split into lines, keep only indented lines + my @lines = grep { m/^\s/ } split(/\n/); + foreach (@lines) { s/(?:\t|--).*// } # delete comments + my @ops = map { split ' ' } @lines; # get op words + + foreach(@ops) { + warn "$tag - $_ already tagged in $seen{$_}\n" if $seen{$_}; + $seen{$_} = $tag; + delete $all{$_}; + } + # opset will croak on invalid names + define_optag($tag, opset(@ops)); + } + close(DATA); + warn "Untagged opnames: ".join(' ',keys %all)."\n" if %all; +} + + +1; + +__DATA__ + + +# the =cut above is used by _init_optags() to get here quickly + + +package Fcntl; + + +use strict; +our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); + +require Exporter; +require XSLoader; +@ISA = qw(Exporter); +$VERSION = '1.13'; + +XSLoader::load(); + +# Named groups of exports +%EXPORT_TAGS = ( + 'flock' => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)], + 'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE + FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)], + 'seek' => [qw(SEEK_SET SEEK_CUR SEEK_END)], + 'mode' => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT + _S_IFMT S_IFREG S_IFDIR S_IFLNK + S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT + S_IRUSR S_IWUSR S_IXUSR S_IRWXU + S_IRGRP S_IWGRP S_IXGRP S_IRWXG + S_IROTH S_IWOTH S_IXOTH S_IRWXO + S_IREAD S_IWRITE S_IEXEC + S_ISREG S_ISDIR S_ISLNK S_ISSOCK + S_ISBLK S_ISCHR S_ISFIFO + S_ISWHT S_ISENFMT + S_IFMT S_IMODE + )], +); + +# Items to export into callers namespace by default +# (move infrequently used names to @EXPORT_OK below) +@EXPORT = + qw( + FD_CLOEXEC + F_ALLOCSP + F_ALLOCSP64 + F_COMPAT + F_DUP2FD + F_DUPFD + F_EXLCK + F_FREESP + F_FREESP64 + F_FSYNC + F_FSYNC64 + F_GETFD + F_GETFL + F_GETLK + F_GETLK64 + F_GETOWN + F_NODNY + F_POSIX + F_RDACC + F_RDDNY + F_RDLCK + F_RWACC + F_RWDNY + F_SETFD + F_SETFL + F_SETLK + F_SETLK64 + F_SETLKW + F_SETLKW64 + F_SETOWN + F_SHARE + F_SHLCK + F_UNLCK + F_UNSHARE + F_WRACC + F_WRDNY + F_WRLCK + O_ACCMODE + O_ALIAS + O_APPEND + O_ASYNC + O_BINARY + O_CREAT + O_DEFER + O_DIRECT + O_DIRECTORY + O_DSYNC + O_EXCL + O_EXLOCK + O_LARGEFILE + O_NDELAY + O_NOCTTY + O_NOFOLLOW + O_NOINHERIT + O_NONBLOCK + O_RANDOM + O_RAW + O_RDONLY + O_RDWR + O_RSRC + O_RSYNC + O_SEQUENTIAL + O_SHLOCK + O_SYNC + O_TEMPORARY + O_TEXT + O_TRUNC + O_WRONLY + ); + +# Other items we are prepared to export if requested +@EXPORT_OK = (qw( + DN_ACCESS + DN_ATTRIB + DN_CREATE + DN_DELETE + DN_MODIFY + DN_MULTISHOT + DN_RENAME + F_GETLEASE + F_GETPIPE_SZ + F_GETSIG + F_NOTIFY + F_SETLEASE + F_SETPIPE_SZ + F_SETSIG + LOCK_MAND + LOCK_READ + LOCK_RW + LOCK_WRITE + O_ALT_IO + O_EVTONLY + O_IGNORE_CTTY + O_NOATIME + O_NOLINK + O_NOSIGPIPE + O_NOTRANS + O_SYMLINK + O_TTY_INIT +), map {@{$_}} values %EXPORT_TAGS); + +1; +package ops; + +our $VERSION = '1.02'; + +use Opcode qw(opmask_add opset invert_opset); + +sub import { + shift; + # Not that unimport is the preferred form since import's don't + # accumulate well owing to the 'only ever add opmask' rule. + # E.g., perl -Mops=:set1 -Mops=:setb is unlikely to do as expected. + opmask_add(invert_opset opset(@_)) if @_; +} + +sub unimport { + shift; + opmask_add(opset(@_)) if @_; +} + +1; + +__END__ + + +package O; + +our $VERSION = '1.03'; + +use B (); + +our $BEGIN_output; +our $saveout_fh; + +sub import { + my ($class, @options) = @_; + my ($quiet, $veryquiet) = (0, 0); + if ($options[0] eq '-q' || $options[0] eq '-qq') { + $quiet = 1; + open ($saveout_fh, ">&", STDOUT); + close STDOUT; + open (STDOUT, ">", \$O::BEGIN_output); + if ($options[0] eq '-qq') { + $veryquiet = 1; + } + shift @options; + } + my $backend = shift (@options); + eval q[ + BEGIN { + B::minus_c; + B::save_BEGINs; + } + + CHECK { + if ($quiet) { + close STDOUT; + open (STDOUT, ">&", $saveout_fh); + close $saveout_fh; + } + + # Note: if you change the code after this 'use', please + # change the fudge factors in B::Concise (grep for + # "fragile kludge") so that its output still looks + # nice. Thanks. --smcc + use B::].$backend.q[ (); + + my $compilesub = &{"B::${backend}::compile"}(@options); + if (ref($compilesub) ne "CODE") { + die $compilesub; + } + + local $savebackslash = $\; + local ($\,$",$,) = (undef,' ',''); + &$compilesub(); + + close STDERR if $veryquiet; + } + ]; + if ($@) { + my $msg = "$@"; + require Carp; + Carp::croak("Loading compiler backend 'B::$backend' failed: $msg"); + } +} + +1; + +__END__ + +package Socket; + +use strict; +{ use 5.006001; } + +our $VERSION = '2.027'; + + + + +# Still undocumented: SCM_*, SOMAXCONN, IOV_MAX, UIO_MAXIOV + + + + + + + +use Carp; +use warnings::register; + +require Exporter; +require XSLoader; +our @ISA = qw(Exporter); + +# <@Nicholas> you can't change @EXPORT without breaking the implicit API +# Please put any new constants in @EXPORT_OK! + +# List re-ordered to match documentation above. Try to keep the ordering +# consistent so it's easier to see which ones are or aren't documented. +our @EXPORT = qw( + PF_802 PF_AAL PF_APPLETALK PF_CCITT PF_CHAOS PF_CTF PF_DATAKIT + PF_DECnet PF_DLI PF_ECMA PF_GOSIP PF_HYLINK PF_IMPLINK PF_INET PF_INET6 + PF_ISO PF_KEY PF_LAST PF_LAT PF_LINK PF_MAX PF_NBS PF_NIT PF_NS PF_OSI + PF_OSINET PF_PUP PF_ROUTE PF_SNA PF_UNIX PF_UNSPEC PF_USER PF_WAN + PF_X25 + + AF_802 AF_AAL AF_APPLETALK AF_CCITT AF_CHAOS AF_CTF AF_DATAKIT + AF_DECnet AF_DLI AF_ECMA AF_GOSIP AF_HYLINK AF_IMPLINK AF_INET AF_INET6 + AF_ISO AF_KEY AF_LAST AF_LAT AF_LINK AF_MAX AF_NBS AF_NIT AF_NS AF_OSI + AF_OSINET AF_PUP AF_ROUTE AF_SNA AF_UNIX AF_UNSPEC AF_USER AF_WAN + AF_X25 + + SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM + + SOL_SOCKET + + SO_ACCEPTCONN SO_ATTACH_FILTER SO_BACKLOG SO_BROADCAST SO_CHAMELEON + SO_DEBUG SO_DETACH_FILTER SO_DGRAM_ERRIND SO_DOMAIN SO_DONTLINGER + SO_DONTROUTE SO_ERROR SO_FAMILY SO_KEEPALIVE SO_LINGER SO_OOBINLINE + SO_PASSCRED SO_PASSIFNAME SO_PEERCRED SO_PROTOCOL SO_PROTOTYPE + SO_RCVBUF SO_RCVLOWAT SO_RCVTIMEO SO_REUSEADDR SO_REUSEPORT + SO_SECURITY_AUTHENTICATION SO_SECURITY_ENCRYPTION_NETWORK + SO_SECURITY_ENCRYPTION_TRANSPORT SO_SNDBUF SO_SNDLOWAT SO_SNDTIMEO + SO_STATE SO_TYPE SO_USELOOPBACK SO_XOPEN SO_XSE + + IP_HDRINCL IP_OPTIONS IP_RECVOPTS IP_RECVRETOPTS IP_RETOPTS IP_TOS + IP_TTL + + MSG_BCAST MSG_BTAG MSG_CTLFLAGS MSG_CTLIGNORE MSG_CTRUNC MSG_DONTROUTE + MSG_DONTWAIT MSG_EOF MSG_EOR MSG_ERRQUEUE MSG_ETAG MSG_FASTOPEN MSG_FIN + MSG_MAXIOVLEN MSG_MCAST MSG_NOSIGNAL MSG_OOB MSG_PEEK MSG_PROXY MSG_RST + MSG_SYN MSG_TRUNC MSG_URG MSG_WAITALL MSG_WIRE + + SHUT_RD SHUT_RDWR SHUT_WR + + INADDR_ANY INADDR_BROADCAST INADDR_LOOPBACK INADDR_NONE + + SCM_CONNECT SCM_CREDENTIALS SCM_CREDS SCM_RIGHTS SCM_TIMESTAMP + + SOMAXCONN + + IOV_MAX + UIO_MAXIOV + + sockaddr_family + pack_sockaddr_in unpack_sockaddr_in sockaddr_in + pack_sockaddr_in6 unpack_sockaddr_in6 sockaddr_in6 + pack_sockaddr_un unpack_sockaddr_un sockaddr_un + + inet_aton inet_ntoa +); + +# List re-ordered to match documentation above. Try to keep the ordering +# consistent so it's easier to see which ones are or aren't documented. +our @EXPORT_OK = qw( + CR LF CRLF $CR $LF $CRLF + + SOCK_NONBLOCK SOCK_CLOEXEC + + IP_ADD_MEMBERSHIP IP_ADD_SOURCE_MEMBERSHIP IP_BIND_ADDRESS_NO_PORT + IP_DROP_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIP IP_FREEBIND + IP_MULTICAST_ALL IP_MULTICAST_IF IP_MULTICAST_LOOP IP_MULTICAST_TTL + IP_MTU IP_MTU_DISCOVER IP_NODEFRAG IP_RECVERR IP_TRANSPARENT + + IPPROTO_IP IPPROTO_IPV6 IPPROTO_RAW IPPROTO_ICMP IPPROTO_IGMP + IPPROTO_TCP IPPROTO_UDP IPPROTO_GRE IPPROTO_ESP IPPROTO_AH + IPPROTO_ICMPV6 IPPROTO_SCTP + + IP_PMTUDISC_DO IP_PMTUDISC_DONT IP_PMTUDISC_PROBE IP_PMTUDISC_WANT + + IPTOS_LOWDELAY IPTOS_THROUGHPUT IPTOS_RELIABILITY IPTOS_MINCOST + + TCP_CONGESTION TCP_CONNECTIONTIMEOUT TCP_CORK TCP_DEFER_ACCEPT + TCP_FASTOPEN TCP_INFO TCP_INIT_CWND TCP_KEEPALIVE TCP_KEEPCNT + TCP_KEEPIDLE TCP_KEEPINTVL TCP_LINGER2 TCP_MAXRT TCP_MAXSEG + TCP_MD5SIG TCP_NODELAY TCP_NOOPT TCP_NOPUSH TCP_QUICKACK + TCP_SACK_ENABLE TCP_STDURG TCP_SYNCNT TCP_USER_TIMEOUT + TCP_WINDOW_CLAMP + + IN6ADDR_ANY IN6ADDR_LOOPBACK + + IPV6_ADDRFROM IPV6_ADD_MEMBERSHIP IPV6_DROP_MEMBERSHIP IPV6_JOIN_GROUP + IPV6_LEAVE_GROUP IPV6_MTU IPV6_MTU_DISCOVER IPV6_MULTICAST_HOPS + IPV6_MULTICAST_IF IPV6_MULTICAST_LOOP IPV6_RECVERR IPV6_ROUTER_ALERT + IPV6_UNICAST_HOPS IPV6_V6ONLY + + SO_LOCK_FILTER SO_RCVBUFFORCE SO_SNDBUFFORCE + + pack_ip_mreq unpack_ip_mreq pack_ip_mreq_source unpack_ip_mreq_source + + pack_ipv6_mreq unpack_ipv6_mreq + + inet_pton inet_ntop + + getaddrinfo getnameinfo + + AI_ADDRCONFIG AI_ALL AI_CANONIDN AI_CANONNAME AI_IDN + AI_IDN_ALLOW_UNASSIGNED AI_IDN_USE_STD3_ASCII_RULES AI_NUMERICHOST + AI_NUMERICSERV AI_PASSIVE AI_V4MAPPED + + NI_DGRAM NI_IDN NI_IDN_ALLOW_UNASSIGNED NI_IDN_USE_STD3_ASCII_RULES + NI_NAMEREQD NI_NOFQDN NI_NUMERICHOST NI_NUMERICSERV + + NIx_NOHOST NIx_NOSERV + + EAI_ADDRFAMILY EAI_AGAIN EAI_BADFLAGS EAI_BADHINTS EAI_FAIL EAI_FAMILY + EAI_NODATA EAI_NONAME EAI_PROTOCOL EAI_SERVICE EAI_SOCKTYPE EAI_SYSTEM +); + +our %EXPORT_TAGS = ( + crlf => [qw(CR LF CRLF $CR $LF $CRLF)], + addrinfo => [qw(getaddrinfo getnameinfo), grep m/^(?:AI|NI|NIx|EAI)_/, @EXPORT_OK], + all => [@EXPORT, @EXPORT_OK], +); + +BEGIN { + sub CR () {"\015"} + sub LF () {"\012"} + sub CRLF () {"\015\012"} + + # These are not gni() constants; they're extensions for the perl API + # The definitions in Socket.pm and Socket.xs must match + sub NIx_NOHOST() {1 << 0} + sub NIx_NOSERV() {1 << 1} +} + +*CR = \CR(); +*LF = \LF(); +*CRLF = \CRLF(); + +sub sockaddr_in { + if (@_ == 6 && !wantarray) { # perl5.001m compat; use this && die + my($af, $port, @quad) = @_; + warnings::warn "6-ARG sockaddr_in call is deprecated" + if warnings::enabled(); + pack_sockaddr_in($port, inet_aton(join('.', @quad))); + } elsif (wantarray) { + croak "usage: (port,iaddr) = sockaddr_in(sin_sv)" unless @_ == 1; + unpack_sockaddr_in(@_); + } else { + croak "usage: sin_sv = sockaddr_in(port,iaddr))" unless @_ == 2; + pack_sockaddr_in(@_); + } +} + +sub sockaddr_in6 { + if (wantarray) { + croak "usage: (port,in6addr,scope_id,flowinfo) = sockaddr_in6(sin6_sv)" unless @_ == 1; + unpack_sockaddr_in6(@_); + } + else { + croak "usage: sin6_sv = sockaddr_in6(port,in6addr,[scope_id,[flowinfo]])" unless @_ >= 2 and @_ <= 4; + pack_sockaddr_in6(@_); + } +} + +sub sockaddr_un { + if (wantarray) { + croak "usage: (filename) = sockaddr_un(sun_sv)" unless @_ == 1; + unpack_sockaddr_un(@_); + } else { + croak "usage: sun_sv = sockaddr_un(filename)" unless @_ == 1; + pack_sockaddr_un(@_); + } +} + +XSLoader::load(__PACKAGE__, $VERSION); + +my %errstr; + +if( defined &getaddrinfo ) { + # These are not part of the API, nothing uses them, and deleting them + # reduces the size of %Socket:: by about 12K + delete $Socket::{fake_getaddrinfo}; + delete $Socket::{fake_getnameinfo}; +} else { + require Scalar::Util; + + *getaddrinfo = \&fake_getaddrinfo; + *getnameinfo = \&fake_getnameinfo; + + # These numbers borrowed from GNU libc's implementation, but since + # they're only used by our emulation, it doesn't matter if the real + # platform's values differ + my %constants = ( + AI_PASSIVE => 1, + AI_CANONNAME => 2, + AI_NUMERICHOST => 4, + AI_V4MAPPED => 8, + AI_ALL => 16, + AI_ADDRCONFIG => 32, + # RFC 2553 doesn't define this but Linux does - lets be nice and + # provide it since we can + AI_NUMERICSERV => 1024, + + EAI_BADFLAGS => -1, + EAI_NONAME => -2, + EAI_NODATA => -5, + EAI_FAMILY => -6, + EAI_SERVICE => -8, + + NI_NUMERICHOST => 1, + NI_NUMERICSERV => 2, + NI_NOFQDN => 4, + NI_NAMEREQD => 8, + NI_DGRAM => 16, + + # Constants we don't support. Export them, but croak if anyone tries to + # use them + AI_IDN => 64, + AI_CANONIDN => 128, + AI_IDN_ALLOW_UNASSIGNED => 256, + AI_IDN_USE_STD3_ASCII_RULES => 512, + NI_IDN => 32, + NI_IDN_ALLOW_UNASSIGNED => 64, + NI_IDN_USE_STD3_ASCII_RULES => 128, + + # Error constants we'll never return, so it doesn't matter what value + # these have, nor that we don't provide strings for them + EAI_SYSTEM => -11, + EAI_BADHINTS => -1000, + EAI_PROTOCOL => -1001 + ); + + foreach my $name ( keys %constants ) { + my $value = $constants{$name}; + + no strict 'refs'; + defined &$name or *$name = sub () { $value }; + } + + %errstr = ( + # These strings from RFC 2553 + EAI_BADFLAGS() => "invalid value for ai_flags", + EAI_NONAME() => "nodename nor servname provided, or not known", + EAI_NODATA() => "no address associated with nodename", + EAI_FAMILY() => "ai_family not supported", + EAI_SERVICE() => "servname not supported for ai_socktype", + ); +} + +# The following functions are used if the system does not have a +# getaddrinfo(3) function in libc; and are used to emulate it for the AF_INET +# family + +# Borrowed from Regexp::Common::net +my $REGEXP_IPv4_DECIMAL = qr/25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}/; +my $REGEXP_IPv4_DOTTEDQUAD = qr/$REGEXP_IPv4_DECIMAL\.$REGEXP_IPv4_DECIMAL\.$REGEXP_IPv4_DECIMAL\.$REGEXP_IPv4_DECIMAL/; + +sub fake_makeerr +{ + my ( $errno ) = @_; + my $errstr = $errno == 0 ? "" : ( $errstr{$errno} || $errno ); + return Scalar::Util::dualvar( $errno, $errstr ); +} + +sub fake_getaddrinfo +{ + my ( $node, $service, $hints ) = @_; + + $node = "" unless defined $node; + + $service = "" unless defined $service; + + my ( $family, $socktype, $protocol, $flags ) = @$hints{qw( family socktype protocol flags )}; + + $family ||= Socket::AF_INET(); # 0 == AF_UNSPEC, which we want too + $family == Socket::AF_INET() or return fake_makeerr( EAI_FAMILY() ); + + $socktype ||= 0; + + $protocol ||= 0; + + $flags ||= 0; + + my $flag_passive = $flags & AI_PASSIVE(); $flags &= ~AI_PASSIVE(); + my $flag_canonname = $flags & AI_CANONNAME(); $flags &= ~AI_CANONNAME(); + my $flag_numerichost = $flags & AI_NUMERICHOST(); $flags &= ~AI_NUMERICHOST(); + my $flag_numericserv = $flags & AI_NUMERICSERV(); $flags &= ~AI_NUMERICSERV(); + + # These constants don't apply to AF_INET-only lookups, so we might as well + # just ignore them. For AI_ADDRCONFIG we just presume the host has ability + # to talk AF_INET. If not we'd have to return no addresses at all. :) + $flags &= ~(AI_V4MAPPED()|AI_ALL()|AI_ADDRCONFIG()); + + $flags & (AI_IDN()|AI_CANONIDN()|AI_IDN_ALLOW_UNASSIGNED()|AI_IDN_USE_STD3_ASCII_RULES()) and + croak "Socket::getaddrinfo() does not support IDN"; + + $flags == 0 or return fake_makeerr( EAI_BADFLAGS() ); + + $node eq "" and $service eq "" and return fake_makeerr( EAI_NONAME() ); + + my $canonname; + my @addrs; + if( $node ne "" ) { + return fake_makeerr( EAI_NONAME() ) if( $flag_numerichost and $node !~ m/^$REGEXP_IPv4_DOTTEDQUAD$/ ); + ( $canonname, undef, undef, undef, @addrs ) = gethostbyname( $node ); + defined $canonname or return fake_makeerr( EAI_NONAME() ); + + undef $canonname unless $flag_canonname; + } + else { + $addrs[0] = $flag_passive ? Socket::inet_aton( "0.0.0.0" ) + : Socket::inet_aton( "127.0.0.1" ); + } + + my @ports; # Actually ARRAYrefs of [ socktype, protocol, port ] + my $protname = ""; + if( $protocol ) { + $protname = eval { getprotobynumber( $protocol ) }; + } + + if( $service ne "" and $service !~ m/^\d+$/ ) { + return fake_makeerr( EAI_NONAME() ) if( $flag_numericserv ); + getservbyname( $service, $protname ) or return fake_makeerr( EAI_SERVICE() ); + } + + foreach my $this_socktype ( Socket::SOCK_STREAM(), Socket::SOCK_DGRAM(), Socket::SOCK_RAW() ) { + next if $socktype and $this_socktype != $socktype; + + my $this_protname = "raw"; + $this_socktype == Socket::SOCK_STREAM() and $this_protname = "tcp"; + $this_socktype == Socket::SOCK_DGRAM() and $this_protname = "udp"; + + next if $protname and $this_protname ne $protname; + + my $port; + if( $service ne "" ) { + if( $service =~ m/^\d+$/ ) { + $port = "$service"; + } + else { + ( undef, undef, $port, $this_protname ) = getservbyname( $service, $this_protname ); + next unless defined $port; + } + } + else { + $port = 0; + } + + push @ports, [ $this_socktype, eval { scalar getprotobyname( $this_protname ) } || 0, $port ]; + } + + my @ret; + foreach my $addr ( @addrs ) { + foreach my $portspec ( @ports ) { + my ( $socktype, $protocol, $port ) = @$portspec; + push @ret, { + family => $family, + socktype => $socktype, + protocol => $protocol, + addr => Socket::pack_sockaddr_in( $port, $addr ), + canonname => undef, + }; + } + } + + # Only supply canonname for the first result + if( defined $canonname ) { + $ret[0]->{canonname} = $canonname; + } + + return ( fake_makeerr( 0 ), @ret ); +} + +sub fake_getnameinfo +{ + my ( $addr, $flags, $xflags ) = @_; + + my ( $port, $inetaddr ); + eval { ( $port, $inetaddr ) = Socket::unpack_sockaddr_in( $addr ) } + or return fake_makeerr( EAI_FAMILY() ); + + my $family = Socket::AF_INET(); + + $flags ||= 0; + + my $flag_numerichost = $flags & NI_NUMERICHOST(); $flags &= ~NI_NUMERICHOST(); + my $flag_numericserv = $flags & NI_NUMERICSERV(); $flags &= ~NI_NUMERICSERV(); + my $flag_nofqdn = $flags & NI_NOFQDN(); $flags &= ~NI_NOFQDN(); + my $flag_namereqd = $flags & NI_NAMEREQD(); $flags &= ~NI_NAMEREQD(); + my $flag_dgram = $flags & NI_DGRAM() ; $flags &= ~NI_DGRAM(); + + $flags & (NI_IDN()|NI_IDN_ALLOW_UNASSIGNED()|NI_IDN_USE_STD3_ASCII_RULES()) and + croak "Socket::getnameinfo() does not support IDN"; + + $flags == 0 or return fake_makeerr( EAI_BADFLAGS() ); + + $xflags ||= 0; + + my $node; + if( $xflags & NIx_NOHOST ) { + $node = undef; + } + elsif( $flag_numerichost ) { + $node = Socket::inet_ntoa( $inetaddr ); + } + else { + $node = gethostbyaddr( $inetaddr, $family ); + if( !defined $node ) { + return fake_makeerr( EAI_NONAME() ) if $flag_namereqd; + $node = Socket::inet_ntoa( $inetaddr ); + } + elsif( $flag_nofqdn ) { + my ( $shortname ) = split m/\./, $node; + my ( $fqdn ) = gethostbyname $shortname; + $node = $shortname if defined $fqdn and $fqdn eq $node; + } + } + + my $service; + if( $xflags & NIx_NOSERV ) { + $service = undef; + } + elsif( $flag_numericserv ) { + $service = "$port"; + } + else { + my $protname = $flag_dgram ? "udp" : ""; + $service = getservbyport( $port, $protname ); + if( !defined $service ) { + $service = "$port"; + } + } + + return ( fake_makeerr( 0 ), $node, $service ); +} + +1; +###################################################################### +# WARNING: 'lib/Config_git.pl' is generated by make_patchnum.pl +# DO NOT EDIT DIRECTLY - edit make_patchnum.pl instead +###################################################################### +$Config::Git_Data=<<'ENDOFGIT'; +git_commit_id='e70d909feb796ec99d5e91de5d1635d4526ec131' +git_describe='v5.28.1-14-ge70d909feb' +git_branch='emperl_v5.28.1' +git_uncommitted_changes='0' +git_commit_id_title='Local Commit:' +git_commit_date='2019-03-03 21:14:09 +0100' +git_ancestor='b819f1cc89ec36d866f249ae8b125a7a4e18eea2' +git_remote_branch='origin/emperl_v5.28.1' +git_unpushed='c61dedef1069e7802564dbae94ed511e12d500a1,e70d909feb796ec99d5e91de5d1635d4526ec131' +ENDOFGIT +package lib; + +# THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL. +# ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD. + +use Config; + +use strict; + +my $archname = $Config{archname}; +my $version = $Config{version}; +my @inc_version_list = reverse split / /, $Config{inc_version_list}; + + +our @ORIG_INC = @INC; # take a handy copy of 'original' value +our $VERSION = '0.64'; + +sub import { + shift; + + my %names; + foreach (reverse @_) { + my $path = $_; # we'll be modifying it, so break the alias + if ($path eq '') { + require Carp; + Carp::carp("Empty compile time value given to use lib"); + } + + if ($path !~ /\.par$/i && -e $path && ! -d _) { + require Carp; + Carp::carp("Parameter to use lib must be directory, not file"); + } + unshift(@INC, $path); + # Add any previous version directories we found at configure time + foreach my $incver (@inc_version_list) + { + my $dir = "$path/$incver"; + unshift(@INC, $dir) if -d $dir; + } + # Put a corresponding archlib directory in front of $path if it + # looks like $path has an archlib directory below it. + my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) + = _get_dirs($path); + unshift(@INC, $arch_dir) if -d $arch_auto_dir; + unshift(@INC, $version_dir) if -d $version_dir; + unshift(@INC, $version_arch_dir) if -d $version_arch_dir; + } + + # remove trailing duplicates + @INC = grep { ++$names{$_} == 1 } @INC; + return; +} + + +sub unimport { + shift; + + my %names; + foreach my $path (@_) { + my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) + = _get_dirs($path); + ++$names{$path}; + ++$names{$arch_dir} if -d $arch_auto_dir; + ++$names{$version_dir} if -d $version_dir; + ++$names{$version_arch_dir} if -d $version_arch_dir; + } + + # Remove ALL instances of each named directory. + @INC = grep { !exists $names{$_} } @INC; + return; +} + +sub _get_dirs { + my($dir) = @_; + my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); + + $arch_auto_dir = "$dir/$archname/auto"; + $arch_dir = "$dir/$archname"; + $version_dir = "$dir/$version"; + $version_arch_dir = "$dir/$version/$archname"; + + return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); +} + +1; +__END__ + +package POSIX; +use strict; +use warnings; + +our ($AUTOLOAD, %SIGRT); + +our $VERSION = '1.84'; + +require XSLoader; + +use Fcntl qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK F_SETFD + F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK O_ACCMODE O_APPEND + O_CREAT O_EXCL O_NOCTTY O_NONBLOCK O_RDONLY O_RDWR O_TRUNC + O_WRONLY SEEK_CUR SEEK_END SEEK_SET + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISREG + S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU S_ISGID S_ISUID + S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR); + +my $loaded; + +sub croak { require Carp; goto &Carp::croak } +sub usage { croak "Usage: POSIX::$_[0]" } + +XSLoader::load(); + +my %replacement = ( + L_tmpnam => undef, + atexit => 'END {}', + atof => undef, + atoi => undef, + atol => undef, + bsearch => \'not supplied', + calloc => undef, + clearerr => 'IO::Handle::clearerr', + div => '/, % and int', + execl => undef, + execle => undef, + execlp => undef, + execv => undef, + execve => undef, + execvp => undef, + fclose => 'IO::Handle::close', + fdopen => 'IO::Handle::new_from_fd', + feof => 'IO::Handle::eof', + ferror => 'IO::Handle::error', + fflush => 'IO::Handle::flush', + fgetc => 'IO::Handle::getc', + fgetpos => 'IO::Seekable::getpos', + fgets => 'IO::Handle::gets', + fileno => 'IO::Handle::fileno', + fopen => 'IO::File::open', + fprintf => 'printf', + fputc => 'print', + fputs => 'print', + fread => 'read', + free => undef, + freopen => 'open', + fscanf => '<> and regular expressions', + fseek => 'IO::Seekable::seek', + fsetpos => 'IO::Seekable::setpos', + fsync => 'IO::Handle::sync', + ftell => 'IO::Seekable::tell', + fwrite => 'print', + labs => 'abs', + ldiv => '/, % and int', + longjmp => 'die', + malloc => undef, + memchr => 'index()', + memcmp => 'eq', + memcpy => '=', + memmove => '=', + memset => 'x', + offsetof => undef, + putc => 'print', + putchar => 'print', + puts => 'print', + qsort => 'sort', + rand => \'non-portable, use Perl\'s rand instead', + realloc => undef, + scanf => '<> and regular expressions', + setbuf => 'IO::Handle::setbuf', + setjmp => 'eval {}', + setvbuf => 'IO::Handle::setvbuf', + siglongjmp => 'die', + sigsetjmp => 'eval {}', + srand => \'not supplied; refer to Perl\'s srand documentation', + sscanf => 'regular expressions', + strcat => '.=', + strchr => 'index()', + strcmp => 'eq', + strcpy => '=', + strcspn => 'regular expressions', + strlen => 'length', + strncat => '.=', + strncmp => 'eq', + strncpy => '=', + strpbrk => undef, + strrchr => 'rindex()', + strspn => undef, + strtok => undef, + tmpfile => 'IO::File::new_tmpfile', + tmpnam => 'use File::Temp', + ungetc => 'IO::Handle::ungetc', + vfprintf => undef, + vprintf => undef, + vsprintf => undef, +); + +my %reimpl = ( + abs => 'x => CORE::abs($_[0])', + alarm => 'seconds => CORE::alarm($_[0])', + assert => 'expr => croak "Assertion failed" if !$_[0]', + atan2 => 'x, y => CORE::atan2($_[0], $_[1])', + chdir => 'directory => CORE::chdir($_[0])', + chmod => 'mode, filename => CORE::chmod($_[0], $_[1])', + chown => 'uid, gid, filename => CORE::chown($_[0], $_[1], $_[2])', + closedir => 'dirhandle => CORE::closedir($_[0])', + cos => 'x => CORE::cos($_[0])', + creat => 'filename, mode => &open($_[0], &O_WRONLY | &O_CREAT | &O_TRUNC, $_[1])', + errno => '$! + 0', + exit => 'status => CORE::exit($_[0])', + exp => 'x => CORE::exp($_[0])', + fabs => 'x => CORE::abs($_[0])', + fcntl => 'filehandle, cmd, arg => CORE::fcntl($_[0], $_[1], $_[2])', + fork => 'CORE::fork', + fstat => 'fd => CORE::open my $dup, "<&", $_[0]; CORE::stat($dup)', # Gross. + getc => 'handle => CORE::getc($_[0])', + getchar => 'CORE::getc(STDIN)', + getegid => '$) + 0', + getenv => 'name => $ENV{$_[0]}', + geteuid => '$> + 0', + getgid => '$( + 0', + getgrgid => 'gid => CORE::getgrgid($_[0])', + getgrnam => 'name => CORE::getgrnam($_[0])', + getgroups => 'my %seen; grep !$seen{$_}++, split " ", $)', + getlogin => 'CORE::getlogin()', + getpgrp => 'CORE::getpgrp', + getpid => '$$', + getppid => 'CORE::getppid', + getpwnam => 'name => CORE::getpwnam($_[0])', + getpwuid => 'uid => CORE::getpwuid($_[0])', + gets => 'scalar <STDIN>', + getuid => '$<', + gmtime => 'time => CORE::gmtime($_[0])', + isatty => 'filehandle => -t $_[0]', + kill => 'pid, sig => CORE::kill $_[1], $_[0]', + link => 'oldfilename, newfilename => CORE::link($_[0], $_[1])', + localtime => 'time => CORE::localtime($_[0])', + log => 'x => CORE::log($_[0])', + mkdir => 'directoryname, mode => CORE::mkdir($_[0], $_[1])', + opendir => 'directory => my $dh; CORE::opendir($dh, $_[0]) ? $dh : undef', + pow => 'x, exponent => $_[0] ** $_[1]', + raise => 'sig => CORE::kill $_[0], $$; # Is this good enough', + readdir => 'dirhandle => CORE::readdir($_[0])', + remove => 'filename => (-d $_[0]) ? CORE::rmdir($_[0]) : CORE::unlink($_[0])', + rename => 'oldfilename, newfilename => CORE::rename($_[0], $_[1])', + rewind => 'filehandle => CORE::seek($_[0],0,0)', + rewinddir => 'dirhandle => CORE::rewinddir($_[0])', + rmdir => 'directoryname => CORE::rmdir($_[0])', + sin => 'x => CORE::sin($_[0])', + sqrt => 'x => CORE::sqrt($_[0])', + stat => 'filename => CORE::stat($_[0])', + strerror => 'errno => BEGIN { local $!; require locale; locale->import} my $e = $_[0] + 0; local $!; $! = $e; "$!"', + strstr => 'big, little => CORE::index($_[0], $_[1])', + system => 'command => CORE::system($_[0])', + time => 'CORE::time', + umask => 'mask => CORE::umask($_[0])', + unlink => 'filename => CORE::unlink($_[0])', + utime => 'filename, atime, mtime => CORE::utime($_[1], $_[2], $_[0])', + wait => 'CORE::wait()', + waitpid => 'pid, options => CORE::waitpid($_[0], $_[1])', +); + +sub import { + my $pkg = shift; + + load_imports() unless $loaded++; + + # Grandfather old foo_h form to new :foo_h form + s/^(?=\w+_h$)/:/ for my @list = @_; + + my @unimpl = sort grep { exists $replacement{$_} } @list; + if (@unimpl) { + for my $u (@unimpl) { + warn "Unimplemented: POSIX::$u(): ", unimplemented_message($u); + } + croak(sprintf("Unimplemented: %s", + join(" ", map { "POSIX::$_()" } @unimpl))); + } + + local $Exporter::ExportLevel = 1; + Exporter::import($pkg,@list); +} + +eval join ';', map "sub $_", keys %replacement, keys %reimpl; + +sub unimplemented_message { + my $func = shift; + my $how = $replacement{$func}; + return "C-specific, stopped" unless defined $how; + return "$$how" if ref $how; + return "$how instead" if $how =~ /^use /; + return "Use method $how() instead" if $how =~ /::/; + return "C-specific: use $how instead"; +} + +sub AUTOLOAD { + my ($func) = ($AUTOLOAD =~ /.*::(.*)/); + + die "POSIX.xs has failed to load\n" if $func eq 'constant'; + + if (my $code = $reimpl{$func}) { + my ($num, $arg) = (0, ''); + if ($code =~ s/^(.*?) *=> *//) { + $arg = $1; + $num = 1 + $arg =~ tr/,//; + } + # no warnings to be consistent with the old implementation, where each + # function was in its own little AutoSplit world: + eval qq{ sub $func { + no warnings; + usage "$func($arg)" if \@_ != $num; + $code + } }; + no strict; + goto &$AUTOLOAD; + } + if (exists $replacement{$func}) { + croak "Unimplemented: POSIX::$func(): ", unimplemented_message($func); + } + + constant($func); +} + +sub perror { + print STDERR "@_: " if @_; + print STDERR $!,"\n"; +} + +sub printf { + usage "printf(pattern, args...)" if @_ < 1; + CORE::printf STDOUT @_; +} + +sub sprintf { + usage "sprintf(pattern, args...)" if @_ == 0; + CORE::sprintf(shift,@_); +} + +sub load_imports { +my %default_export_tags = ( # cf. exports policy below + + assert_h => [qw(assert NDEBUG)], + + ctype_h => [], + + dirent_h => [], + + errno_h => [qw(E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN + EALREADY EBADF EBADMSG EBUSY ECANCELED ECHILD ECONNABORTED + ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT EEXIST + EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EIDRM EILSEQ EINPROGRESS + EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE + ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS + ENODATA ENODEV ENOENT ENOEXEC ENOLCK ENOLINK ENOMEM ENOMSG + ENOPROTOOPT ENOSPC ENOSR ENOSTR ENOSYS ENOTBLK ENOTCONN ENOTDIR + ENOTEMPTY ENOTRECOVERABLE ENOTSOCK ENOTSUP ENOTTY ENXIO + EOPNOTSUPP EOTHER EOVERFLOW EOWNERDEAD EPERM EPFNOSUPPORT EPIPE + EPROCLIM EPROTO EPROTONOSUPPORT EPROTOTYPE ERANGE EREMOTE + ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT ESPIPE ESRCH ESTALE + ETIME ETIMEDOUT ETOOMANYREFS ETXTBSY EUSERS EWOULDBLOCK EXDEV + errno)], + + fcntl_h => [qw(FD_CLOEXEC F_DUPFD F_GETFD F_GETFL F_GETLK F_RDLCK + F_SETFD F_SETFL F_SETLK F_SETLKW F_UNLCK F_WRLCK + O_ACCMODE O_APPEND O_CREAT O_EXCL O_NOCTTY O_NONBLOCK + O_RDONLY O_RDWR O_TRUNC O_WRONLY + creat + SEEK_CUR SEEK_END SEEK_SET + S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG S_ISUID + S_IWGRP S_IWOTH S_IWUSR)], + + float_h => [qw(DBL_DIG DBL_EPSILON DBL_MANT_DIG + DBL_MAX DBL_MAX_10_EXP DBL_MAX_EXP + DBL_MIN DBL_MIN_10_EXP DBL_MIN_EXP + FLT_DIG FLT_EPSILON FLT_MANT_DIG + FLT_MAX FLT_MAX_10_EXP FLT_MAX_EXP + FLT_MIN FLT_MIN_10_EXP FLT_MIN_EXP + FLT_RADIX FLT_ROUNDS + LDBL_DIG LDBL_EPSILON LDBL_MANT_DIG + LDBL_MAX LDBL_MAX_10_EXP LDBL_MAX_EXP + LDBL_MIN LDBL_MIN_10_EXP LDBL_MIN_EXP)], + + grp_h => [], + + limits_h => [qw( ARG_MAX CHAR_BIT CHAR_MAX CHAR_MIN CHILD_MAX + INT_MAX INT_MIN LINK_MAX LONG_MAX LONG_MIN MAX_CANON + MAX_INPUT MB_LEN_MAX NAME_MAX NGROUPS_MAX OPEN_MAX + PATH_MAX PIPE_BUF SCHAR_MAX SCHAR_MIN SHRT_MAX SHRT_MIN + SSIZE_MAX STREAM_MAX TZNAME_MAX UCHAR_MAX UINT_MAX + ULONG_MAX USHRT_MAX _POSIX_ARG_MAX _POSIX_CHILD_MAX + _POSIX_LINK_MAX _POSIX_MAX_CANON _POSIX_MAX_INPUT + _POSIX_NAME_MAX _POSIX_NGROUPS_MAX _POSIX_OPEN_MAX + _POSIX_PATH_MAX _POSIX_PIPE_BUF _POSIX_SSIZE_MAX + _POSIX_STREAM_MAX _POSIX_TZNAME_MAX)], + + locale_h => [qw(LC_ALL LC_COLLATE LC_CTYPE LC_MESSAGES + LC_MONETARY LC_NUMERIC LC_TIME LC_IDENTIFICATION + LC_MEASUREMENT LC_PAPER LC_TELEPHONE LC_ADDRESS NULL + localeconv setlocale)], + + math_h => [qw(FP_ILOGB0 FP_ILOGBNAN FP_INFINITE FP_NAN FP_NORMAL + FP_SUBNORMAL FP_ZERO + M_1_PI M_2_PI M_2_SQRTPI M_E M_LN10 M_LN2 M_LOG10E M_LOG2E + M_PI M_PI_2 M_PI_4 M_SQRT1_2 M_SQRT2 + HUGE_VAL INFINITY NAN + acos asin atan ceil cosh fabs floor fmod + frexp ldexp log10 modf pow sinh tan tanh)], + + pwd_h => [], + + setjmp_h => [qw(longjmp setjmp siglongjmp sigsetjmp)], + + signal_h => [qw(SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK + SA_RESETHAND SA_RESTART SA_SIGINFO SIGABRT SIGALRM + SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL + SIGPIPE %SIGRT SIGRTMIN SIGRTMAX SIGQUIT SIGSEGV SIGSTOP + SIGTERM SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2 SIGBUS + SIGPOLL SIGPROF SIGSYS SIGTRAP SIGURG SIGVTALRM SIGXCPU SIGXFSZ + SIG_BLOCK SIG_DFL SIG_ERR SIG_IGN SIG_SETMASK SIG_UNBLOCK + raise sigaction signal sigpending sigprocmask sigsuspend)], + + stdarg_h => [], + + stddef_h => [qw(NULL offsetof)], + + stdio_h => [qw(BUFSIZ EOF FILENAME_MAX L_ctermid L_cuserid + NULL SEEK_CUR SEEK_END SEEK_SET + STREAM_MAX TMP_MAX stderr stdin stdout + clearerr fclose fdopen feof ferror fflush fgetc fgetpos + fgets fopen fprintf fputc fputs fread freopen + fscanf fseek fsetpos ftell fwrite getchar gets + perror putc putchar puts remove rewind + scanf setbuf setvbuf sscanf tmpfile tmpnam + ungetc vfprintf vprintf vsprintf)], + + stdlib_h => [qw(EXIT_FAILURE EXIT_SUCCESS MB_CUR_MAX NULL RAND_MAX + abort atexit atof atoi atol bsearch calloc div + free getenv labs ldiv malloc mblen mbstowcs mbtowc + qsort realloc strtod strtol strtoul wcstombs wctomb)], + + string_h => [qw(NULL memchr memcmp memcpy memmove memset strcat + strchr strcmp strcoll strcpy strcspn strerror strlen + strncat strncmp strncpy strpbrk strrchr strspn strstr + strtok strxfrm)], + + sys_stat_h => [qw(S_IRGRP S_IROTH S_IRUSR S_IRWXG S_IRWXO S_IRWXU + S_ISBLK S_ISCHR S_ISDIR S_ISFIFO S_ISGID S_ISREG + S_ISUID S_IWGRP S_IWOTH S_IWUSR S_IXGRP S_IXOTH S_IXUSR + fstat mkfifo)], + + sys_times_h => [], + + sys_types_h => [], + + sys_utsname_h => [qw(uname)], + + sys_wait_h => [qw(WEXITSTATUS WIFEXITED WIFSIGNALED WIFSTOPPED + WNOHANG WSTOPSIG WTERMSIG WUNTRACED)], + + termios_h => [qw( B0 B110 B1200 B134 B150 B1800 B19200 B200 B2400 + B300 B38400 B4800 B50 B600 B75 B9600 BRKINT CLOCAL + CREAD CS5 CS6 CS7 CS8 CSIZE CSTOPB ECHO ECHOE ECHOK + ECHONL HUPCL ICANON ICRNL IEXTEN IGNBRK IGNCR IGNPAR + INLCR INPCK ISIG ISTRIP IXOFF IXON NCCS NOFLSH OPOST + PARENB PARMRK PARODD TCIFLUSH TCIOFF TCIOFLUSH TCION + TCOFLUSH TCOOFF TCOON TCSADRAIN TCSAFLUSH TCSANOW + TOSTOP VEOF VEOL VERASE VINTR VKILL VMIN VQUIT VSTART + VSTOP VSUSP VTIME + cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain + tcflow tcflush tcgetattr tcsendbreak tcsetattr )], + + time_h => [qw(CLK_TCK CLOCKS_PER_SEC NULL asctime clock ctime + difftime mktime strftime tzset tzname)], + + unistd_h => [qw(F_OK NULL R_OK SEEK_CUR SEEK_END SEEK_SET + STDERR_FILENO STDIN_FILENO STDOUT_FILENO W_OK X_OK + _PC_CHOWN_RESTRICTED _PC_LINK_MAX _PC_MAX_CANON + _PC_MAX_INPUT _PC_NAME_MAX _PC_NO_TRUNC _PC_PATH_MAX + _PC_PIPE_BUF _PC_VDISABLE _POSIX_CHOWN_RESTRICTED + _POSIX_JOB_CONTROL _POSIX_NO_TRUNC _POSIX_SAVED_IDS + _POSIX_VDISABLE _POSIX_VERSION _SC_ARG_MAX + _SC_CHILD_MAX _SC_CLK_TCK _SC_JOB_CONTROL + _SC_NGROUPS_MAX _SC_OPEN_MAX _SC_PAGESIZE _SC_SAVED_IDS + _SC_STREAM_MAX _SC_TZNAME_MAX _SC_VERSION + _exit access ctermid cuserid + dup2 dup execl execle execlp execv execve execvp + fpathconf fsync getcwd getegid geteuid getgid getgroups + getpid getuid isatty lseek pathconf pause setgid setpgid + setsid setuid sysconf tcgetpgrp tcsetpgrp ttyname)], + + utime_h => [], +); + +if ($^O eq 'MSWin32') { + $default_export_tags{winsock_h} = [qw( + WSAEINTR WSAEBADF WSAEACCES WSAEFAULT WSAEINVAL WSAEMFILE WSAEWOULDBLOCK + WSAEINPROGRESS WSAEALREADY WSAENOTSOCK WSAEDESTADDRREQ WSAEMSGSIZE + WSAEPROTOTYPE WSAENOPROTOOPT WSAEPROTONOSUPPORT WSAESOCKTNOSUPPORT + WSAEOPNOTSUPP WSAEPFNOSUPPORT WSAEAFNOSUPPORT WSAEADDRINUSE + WSAEADDRNOTAVAIL WSAENETDOWN WSAENETUNREACH WSAENETRESET WSAECONNABORTED + WSAECONNRESET WSAENOBUFS WSAEISCONN WSAENOTCONN WSAESHUTDOWN + WSAETOOMANYREFS WSAETIMEDOUT WSAECONNREFUSED WSAELOOP WSAENAMETOOLONG + WSAEHOSTDOWN WSAEHOSTUNREACH WSAENOTEMPTY WSAEPROCLIM WSAEUSERS + WSAEDQUOT WSAESTALE WSAEREMOTE WSAEDISCON WSAENOMORE WSAECANCELLED + WSAEINVALIDPROCTABLE WSAEINVALIDPROVIDER WSAEPROVIDERFAILEDINIT + WSAEREFUSED)]; +} + +my %other_export_tags = ( # cf. exports policy below + fenv_h => [qw( + FE_DOWNWARD FE_TONEAREST FE_TOWARDZERO FE_UPWARD fegetround fesetround + )], + + math_h_c99 => [ @{$default_export_tags{math_h}}, qw( + Inf NaN acosh asinh atanh cbrt copysign erf erfc exp2 expm1 fdim fma + fmax fmin fpclassify hypot ilogb isfinite isgreater isgreaterequal + isinf isless islessequal islessgreater isnan isnormal isunordered j0 j1 + jn lgamma log1p log2 logb lrint lround nan nearbyint nextafter nexttoward + remainder remquo rint round scalbn signbit tgamma trunc y0 y1 yn + )], + + netdb_h => [qw(EAI_AGAIN EAI_BADFLAGS EAI_FAIL + EAI_FAMILY EAI_MEMORY EAI_NONAME + EAI_OVERFLOW EAI_SERVICE EAI_SOCKTYPE + EAI_SYSTEM)], + + stdlib_h_c99 => [ @{$default_export_tags{stdlib_h}}, 'strtold' ], + + sys_resource_h => [qw(PRIO_PROCESS PRIO_PGRP PRIO_USER)], + + sys_socket_h => [qw( + MSG_CTRUNC MSG_DONTROUTE MSG_EOR MSG_OOB MSG_PEEK MSG_TRUNC MSG_WAITALL + )], + + nan_payload => [ qw(getpayload setpayload setpayloadsig issignaling) ], + + signal_h_si_code => [qw( + ILL_ILLOPC ILL_ILLOPN ILL_ILLADR ILL_ILLTRP ILL_PRVOPC ILL_PRVREG + ILL_COPROC ILL_BADSTK + FPE_INTDIV FPE_INTOVF FPE_FLTDIV FPE_FLTOVF FPE_FLTUND + FPE_FLTRES FPE_FLTINV FPE_FLTSUB + SEGV_MAPERR SEGV_ACCERR + BUS_ADRALN BUS_ADRERR BUS_OBJERR + TRAP_BRKPT TRAP_TRACE + CLD_EXITED CLD_KILLED CLD_DUMPED CLD_TRAPPED CLD_STOPPED CLD_CONTINUED + POLL_IN POLL_OUT POLL_MSG POLL_ERR POLL_PRI POLL_HUP + SI_USER SI_QUEUE SI_TIMER SI_ASYNCIO SI_MESGQ + )], +); + +# exports policy: +# - new functions may not be added to @EXPORT, only to @EXPORT_OK +# - new SHOUTYCONSTANTS are OK to add to @EXPORT + +{ + # De-duplicate the export list: + my ( %export, %export_ok ); + @export {map {@$_} values %default_export_tags} = (); + @export_ok{map {@$_} values %other_export_tags} = (); + # Doing the de-dup with a temporary hash has the advantage that the SVs in + # @EXPORT are actually shared hash key scalars, which will save some memory. + our @EXPORT = keys %export; + + # you do not want to add symbols to the following list. add a new tag instead + our @EXPORT_OK = (qw(close lchown nice open pipe read sleep times write + printf sprintf), + grep {!exists $export{$_}} keys %reimpl, keys %replacement, keys %export_ok); + + our %EXPORT_TAGS = ( %default_export_tags, %other_export_tags ); +} + +require Exporter; +} + +package POSIX::SigAction; + +sub new { bless {HANDLER => $_[1], MASK => $_[2], FLAGS => $_[3] || 0, SAFE => 0}, $_[0] } +sub handler { $_[0]->{HANDLER} = $_[1] if @_ > 1; $_[0]->{HANDLER} }; +sub mask { $_[0]->{MASK} = $_[1] if @_ > 1; $_[0]->{MASK} }; +sub flags { $_[0]->{FLAGS} = $_[1] if @_ > 1; $_[0]->{FLAGS} }; +sub safe { $_[0]->{SAFE} = $_[1] if @_ > 1; $_[0]->{SAFE} }; + +{ +package POSIX::SigSet; +# This package is here entirely to make sure that POSIX::SigSet is seen by the +# PAUSE indexer, so that it will always be clearly indexed in core. This is to +# prevent the accidental case where a third-party distribution can accidentally +# claim the POSIX::SigSet package, as occurred in 2011-12. -- rjbs, 2011-12-30 +} + +package POSIX::SigRt; + +require Tie::Hash; + +our @ISA = 'Tie::StdHash'; + +our ($_SIGRTMIN, $_SIGRTMAX, $_sigrtn); + +our $SIGACTION_FLAGS = 0; + +sub _init { + $_SIGRTMIN = &POSIX::SIGRTMIN; + $_SIGRTMAX = &POSIX::SIGRTMAX; + $_sigrtn = $_SIGRTMAX - $_SIGRTMIN; +} + +sub _croak { + &_init unless defined $_sigrtn; + die "POSIX::SigRt not available" unless defined $_sigrtn && $_sigrtn > 0; +} + +sub _getsig { + &_croak; + my $rtsig = $_[0]; + # Allow (SIGRT)?MIN( + n)?, a common idiom when doing these things in C. + $rtsig = $_SIGRTMIN + ($1 || 0) + if $rtsig =~ /^(?:(?:SIG)?RT)?MIN(\s*\+\s*(\d+))?$/; + return $rtsig; +} + +sub _exist { + my $rtsig = _getsig($_[1]); + my $ok = $rtsig >= $_SIGRTMIN && $rtsig <= $_SIGRTMAX; + ($rtsig, $ok); +} + +sub _check { + my ($rtsig, $ok) = &_exist; + die "No POSIX::SigRt signal $_[1] (valid range SIGRTMIN..SIGRTMAX, or $_SIGRTMIN..$_SIGRTMAX)" + unless $ok; + return $rtsig; +} + +sub new { + my ($rtsig, $handler, $flags) = @_; + my $sigset = POSIX::SigSet->new($rtsig); + my $sigact = POSIX::SigAction->new($handler, $sigset, $flags); + POSIX::sigaction($rtsig, $sigact); +} + +sub EXISTS { &_exist } +sub FETCH { my $rtsig = &_check; + my $oa = POSIX::SigAction->new(); + POSIX::sigaction($rtsig, undef, $oa); + return $oa->{HANDLER} } +sub STORE { my $rtsig = &_check; new($rtsig, $_[2], $SIGACTION_FLAGS) } +sub DELETE { delete $SIG{ &_check } } +sub CLEAR { &_exist; delete @SIG{ &POSIX::SIGRTMIN .. &POSIX::SIGRTMAX } } +sub SCALAR { &_croak; $_sigrtn + 1 } + +tie %POSIX::SIGRT, 'POSIX::SigRt'; +# and the expression on the line above is true, so we return true. + +# Generated from DynaLoader_pm.PL, this file is unique for every OS + +package DynaLoader; + +# And Gandalf said: 'Many folk like to know beforehand what is to +# be set on the table; but those who have laboured to prepare the +# feast like to keep their secret; for wonder makes the words of +# praise louder.' + +# (Quote from Tolkien suggested by Anno Siegel.) +# +# See pod text at end of file for documentation. +# See also ext/DynaLoader/README in source tree for other information. +# +# Tim.Bunce@ig.co.uk, August 1994 + +BEGIN { + $VERSION = '1.45'; +} + +use Config; + +# enable debug/trace messages from DynaLoader perl code +$dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug; + +# +# Flags to alter dl_load_file behaviour. Assigned bits: +# 0x01 make symbols available for linking later dl_load_file's. +# (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL)) +# (ignored under VMS; effect is built-in to image linking) +# (ignored under Android; the linker always uses RTLD_LOCAL) +# +# This is called as a class method $module->dl_load_flags. The +# definition here will be inherited and result on "default" loading +# behaviour unless a sub-class of DynaLoader defines its own version. +# + +sub dl_load_flags { 0x00 } + +($dl_dlext, $dl_so, $dlsrc) = @Config::Config{qw(dlext so dlsrc)}; + + +$do_expand = 0; + +@dl_require_symbols = (); # names of symbols we need +@dl_library_path = (); # path to look for files + +#XSLoader.pm may have added elements before we were required +#@dl_shared_objects = (); # shared objects for symbols we have +#@dl_librefs = (); # things we have loaded +#@dl_modules = (); # Modules we have loaded + +# Initialise @dl_library_path with the 'standard' library path +# for this platform as determined by Configure. + +push(@dl_library_path, split(' ', $Config::Config{libpth})); + + +my $ldlibpthname = $Config::Config{ldlibpthname}; +my $ldlibpthname_defined = defined $Config::Config{ldlibpthname}; +my $pthsep = $Config::Config{path_sep}; + +# Add to @dl_library_path any extra directories we can gather from environment +# during runtime. + +if ($ldlibpthname_defined && + exists $ENV{$ldlibpthname}) { + push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname})); +} + +# E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH. + +if ($ldlibpthname_defined && + $ldlibpthname ne 'LD_LIBRARY_PATH' && + exists $ENV{LD_LIBRARY_PATH}) { + push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH})); +} + + +sub mod2fname { + my $parts = shift; + my $so_len = 5; + my $name_max = 255; # No easy way to get this here + + my $libname = "PL_" . join("__", @$parts); + + return $libname if (length($libname)+$so_len) <= $name_max; + + # It's too darned big, so we need to go strip. We use the same + # algorithm as xsubpp does. First, strip out doubled __ + $libname =~ s/__/_/g; + return $libname if (length($libname)+$so_len) <= $name_max; + + # Strip duplicate letters + 1 while $libname =~ s/(.)\1/\U$1/i; + return $libname if (length($libname)+$so_len) <= $name_max; + + # Still too long. Truncate. + $libname = substr($libname, 0, $name_max - $so_len); + return $libname; +} +# No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. +# NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB +boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && + !defined(&dl_error); + +if ($dl_debug) { + print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n"; + print STDERR "DynaLoader not linked into this perl\n" + unless defined(&boot_DynaLoader); +} + +1; # End of main code + + +sub croak { require Carp; Carp::croak(@_) } + +sub bootstrap_inherit { + my $module = $_[0]; + local *isa = *{"$module\::ISA"}; + local @isa = (@isa, 'DynaLoader'); + # Cannot goto due to delocalization. Will report errors on a wrong line? + bootstrap(@_); +} + +sub bootstrap { + # use local vars to enable $module.bs script to edit values + local(@args) = @_; + local($module) = $args[0]; + local(@dirs, $file); + + unless ($module) { + require Carp; + Carp::confess("Usage: DynaLoader::bootstrap(module)"); + } + + # A common error on platforms which don't support dynamic loading. + # Since it's fatal and potentially confusing we give a detailed message. + croak("Can't load module $module, dynamic loading not available in this perl.\n". + " (You may need to build a new perl executable which either supports\n". + " dynamic loading or has the $module module statically linked into it.)\n") + unless defined(&dl_load_file); + + + + my @modparts = split(/::/,$module); + my $modfname = $modparts[-1]; + my $modfname_orig = $modfname; # For .bs file search + + # Some systems have restrictions on files names for DLL's etc. + # mod2fname returns appropriate file base name (typically truncated) + # It may also edit @modparts if required. + $modfname = &mod2fname(\@modparts) if defined &mod2fname; + + + + my $modpname = join('/',@modparts); + + print STDERR "DynaLoader::bootstrap for $module ", + "(auto/$modpname/$modfname.$dl_dlext)\n" + if $dl_debug; + + my $dir; + foreach (@INC) { + + $dir = "$_/auto/$modpname"; + + next unless -d $dir; # skip over uninteresting directories + + # check for common cases to avoid autoload of dl_findfile + my $try = "$dir/$modfname.$dl_dlext"; + last if $file = ($do_expand) ? dl_expandspec($try) : ((-f $try) && $try); + + # no luck here, save dir for possible later dl_findfile search + push @dirs, $dir; + } + # last resort, let dl_findfile have a go in all known locations + $file = dl_findfile(map("-L$_",@dirs,@INC), $modfname) unless $file; + + croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)") + unless $file; # wording similar to error from 'require' + + + my $bootname = "boot_$module"; + $bootname =~ s/\W/_/g; + @dl_require_symbols = ($bootname); + + # Execute optional '.bootstrap' perl script for this module. + # The .bs file can be used to configure @dl_resolve_using etc to + # match the needs of the individual module on this architecture. + # N.B. The .bs file does not following the naming convention used + # by mod2fname. + my $bs = "$dir/$modfname_orig"; + $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library + if (-s $bs) { # only read file if it's not empty + print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug; + eval { local @INC = ('.'); do $bs; }; + warn "$bs: $@\n" if $@; + } + + my $boot_symbol_ref; + + + + # Many dynamic extension loading problems will appear to come from + # this section of code: XYZ failed at line 123 of DynaLoader.pm. + # Often these errors are actually occurring in the initialisation + # C code of the extension XS file. Perl reports the error as being + # in this perl code simply because this was the last perl code + # it executed. + + my $flags = $module->dl_load_flags; + + my $libref = dl_load_file($file, $flags) or + croak("Can't load '$file' for module $module: ".dl_error()); + + push(@dl_librefs,$libref); # record loaded object + + $boot_symbol_ref = dl_find_symbol($libref, $bootname) or + croak("Can't find '$bootname' symbol in $file\n"); + + push(@dl_modules, $module); # record loaded module + + boot: + my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); + + # See comment block above + + push(@dl_shared_objects, $file); # record files loaded + + &$xs(@args); +} + +sub dl_findfile { + # This function does not automatically consider the architecture + # or the perl library auto directories. + my (@args) = @_; + my (@dirs, $dir); # which directories to search + my (@found); # full paths to real files we have found + #my $dl_ext= 'none'; # $Config::Config{'dlext'} suffix for perl extensions + #my $dl_so = 'so'; # $Config::Config{'so'} suffix for shared libraries + + print STDERR "dl_findfile(@args)\n" if $dl_debug; + + # accumulate directories but process files as they appear + arg: foreach(@args) { + # Special fast case: full filepath requires no search + + + if (m:/: && -f $_) { + push(@found,$_); + last arg unless wantarray; + next; + } + + + # Deal with directories first: + # Using a -L prefix is the preferred option (faster and more robust) + if ( s{^-L}{} ) { push(@dirs, $_); next; } + + # Otherwise we try to try to spot directories by a heuristic + # (this is a more complicated issue than it first appears) + if (m:/: && -d $_) { push(@dirs, $_); next; } + + + + # Only files should get this far... + my(@names, $name); # what filenames to look for + if ( s{^-l}{} ) { # convert -lname to appropriate library name + push(@names, "lib$_.$dl_so", "lib$_.a"); + } else { # Umm, a bare name. Try various alternatives: + # these should be ordered with the most likely first + push(@names,"$_.$dl_dlext") unless m/\.$dl_dlext$/o; + push(@names,"$_.$dl_so") unless m/\.$dl_so$/o; + + push(@names,"lib$_.$dl_so") unless m:/:; + push(@names, $_); + } + my $dirsep = '/'; + + foreach $dir (@dirs, @dl_library_path) { + next unless -d $dir; + + foreach $name (@names) { + my($file) = "$dir$dirsep$name"; + print STDERR " checking in $dir for $name\n" if $dl_debug; + $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file); + #$file = _check_file($file); + if ($file) { + push(@found, $file); + next arg; # no need to look any further + } + } + } + } + if ($dl_debug) { + foreach(@dirs) { + print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_; + } + print STDERR "dl_findfile found: @found\n"; + } + return $found[0] unless wantarray; + @found; +} + + + +sub dl_expandspec { + my($spec) = @_; + # Optional function invoked if DynaLoader.pm sets $do_expand. + # Most systems do not require or use this function. + # Some systems may implement it in the dl_*.xs file in which case + # this Perl version should be excluded at build time. + + # This function is designed to deal with systems which treat some + # 'filenames' in a special way. For example VMS 'Logical Names' + # (something like unix environment variables - but different). + # This function should recognise such names and expand them into + # full file paths. + # Must return undef if $spec is invalid or file does not exist. + + my $file = $spec; # default output to input + + return undef unless -f $file; + print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug; + $file; +} + +sub dl_find_symbol_anywhere +{ + my $sym = shift; + my $libref; + foreach $libref (@dl_librefs) { + my $symref = dl_find_symbol($libref,$sym,1); + return $symref if $symref; + } + return undef; +} + +__END__ + +# -*- buffer-read-only: t -*- +# +# This file is auto-generated by ext/Errno/Errno_pm.PL. +# ***ANY*** changes here will be lost. +# + +package Errno; +require Exporter; +use strict; + +use Config; +"$Config{'archname'}-$Config{'osvers'}" eq +"wasm-1.38.28" or + die "Errno architecture (wasm-1.38.28) does not match executable architecture ($Config{'archname'}-$Config{'osvers'})"; + +our $VERSION = "1.29"; +$VERSION = eval $VERSION; +our @ISA = 'Exporter'; + +my %err; + +BEGIN { + %err = ( + EPERM => 1, + ENOENT => 2, + ESRCH => 3, + EINTR => 4, + EIO => 5, + ENXIO => 6, + E2BIG => 7, + ENOEXEC => 8, + EBADF => 9, + ECHILD => 10, + EAGAIN => 11, + EWOULDBLOCK => 11, + ENOMEM => 12, + EACCES => 13, + EFAULT => 14, + ENOTBLK => 15, + EBUSY => 16, + EEXIST => 17, + EXDEV => 18, + ENODEV => 19, + ENOTDIR => 20, + EISDIR => 21, + EINVAL => 22, + ENFILE => 23, + EMFILE => 24, + ENOTTY => 25, + ETXTBSY => 26, + EFBIG => 27, + ENOSPC => 28, + ESPIPE => 29, + EROFS => 30, + EMLINK => 31, + EPIPE => 32, + EDOM => 33, + ERANGE => 34, + EDEADLK => 35, + EDEADLOCK => 35, + ENAMETOOLONG => 36, + ENOLCK => 37, + ENOSYS => 38, + ENOTEMPTY => 39, + ELOOP => 40, + ENOMSG => 42, + EIDRM => 43, + ECHRNG => 44, + EL2NSYNC => 45, + EL3HLT => 46, + EL3RST => 47, + ELNRNG => 48, + EUNATCH => 49, + ENOCSI => 50, + EL2HLT => 51, + EBADE => 52, + EBADR => 53, + EXFULL => 54, + ENOANO => 55, + EBADRQC => 56, + EBADSLT => 57, + EBFONT => 59, + ENOSTR => 60, + ENODATA => 61, + ETIME => 62, + ENOSR => 63, + ENONET => 64, + ENOPKG => 65, + EREMOTE => 66, + ENOLINK => 67, + EADV => 68, + ESRMNT => 69, + ECOMM => 70, + EPROTO => 71, + EMULTIHOP => 72, + EDOTDOT => 73, + EBADMSG => 74, + EOVERFLOW => 75, + ENOTUNIQ => 76, + EBADFD => 77, + EREMCHG => 78, + ELIBACC => 79, + ELIBBAD => 80, + ELIBSCN => 81, + ELIBMAX => 82, + ELIBEXEC => 83, + EILSEQ => 84, + ERESTART => 85, + ESTRPIPE => 86, + EUSERS => 87, + ENOTSOCK => 88, + EDESTADDRREQ => 89, + EMSGSIZE => 90, + EPROTOTYPE => 91, + ENOPROTOOPT => 92, + EPROTONOSUPPORT => 93, + ESOCKTNOSUPPORT => 94, + ENOTSUP => 95, + EOPNOTSUPP => 95, + EPFNOSUPPORT => 96, + EAFNOSUPPORT => 97, + EADDRINUSE => 98, + EADDRNOTAVAIL => 99, + ENETDOWN => 100, + ENETUNREACH => 101, + ENETRESET => 102, + ECONNABORTED => 103, + ECONNRESET => 104, + ENOBUFS => 105, + EISCONN => 106, + ENOTCONN => 107, + ESHUTDOWN => 108, + ETOOMANYREFS => 109, + ETIMEDOUT => 110, + ECONNREFUSED => 111, + EHOSTDOWN => 112, + EHOSTUNREACH => 113, + EALREADY => 114, + EINPROGRESS => 115, + ESTALE => 116, + EUCLEAN => 117, + ENOTNAM => 118, + ENAVAIL => 119, + EISNAM => 120, + EREMOTEIO => 121, + EDQUOT => 122, + ENOMEDIUM => 123, + EMEDIUMTYPE => 124, + ECANCELED => 125, + ENOKEY => 126, + EKEYEXPIRED => 127, + EKEYREVOKED => 128, + EKEYREJECTED => 129, + EOWNERDEAD => 130, + ENOTRECOVERABLE => 131, + ERFKILL => 132, + EHWPOISON => 133, + ); + # Generate proxy constant subroutines for all the values. + # Well, almost all the values. Unfortunately we can't assume that at this + # point that our symbol table is empty, as code such as if the parser has + # seen code such as C<exists &Errno::EINVAL>, it will have created the + # typeglob. + # Doing this before defining @EXPORT_OK etc means that even if a platform is + # crazy enough to define EXPORT_OK as an error constant, everything will + # still work, because the parser will upgrade the PCS to a real typeglob. + # We rely on the subroutine definitions below to update the internal caches. + # Don't use %each, as we don't want a copy of the value. + foreach my $name (keys %err) { + if ($Errno::{$name}) { + # We expect this to be reached fairly rarely, so take an approach + # which uses the least compile time effort in the common case: + eval "sub $name() { $err{$name} }; 1" or die $@; + } else { + $Errno::{$name} = \$err{$name}; + } + } +} + +our @EXPORT_OK = keys %err; + +our %EXPORT_TAGS = ( + POSIX => [qw( + E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY + EBADF EBUSY ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK + EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH + EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK + EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS + ENODEV ENOENT ENOEXEC ENOLCK ENOMEM ENOPROTOOPT ENOSPC ENOSYS ENOTBLK + ENOTCONN ENOTDIR ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM + EPFNOSUPPORT EPIPE EPROTONOSUPPORT EPROTOTYPE ERANGE EREMOTE ERESTART + EROFS ESHUTDOWN ESOCKTNOSUPPORT ESPIPE ESRCH ESTALE ETIMEDOUT + ETOOMANYREFS ETXTBSY EUSERS EWOULDBLOCK EXDEV + )], +); + +sub TIEHASH { bless \%err } + +sub FETCH { + my (undef, $errname) = @_; + return "" unless exists $err{$errname}; + my $errno = $err{$errname}; + return $errno == $! ? $errno : 0; +} + +sub STORE { + require Carp; + Carp::confess("ERRNO hash is read only!"); +} + +# This is the true return value +*CLEAR = *DELETE = \*STORE; # Typeglob aliasing uses less space + +sub NEXTKEY { + each %err; +} + +sub FIRSTKEY { + my $s = scalar keys %err; # initialize iterator + each %err; +} + +sub EXISTS { + my (undef, $errname) = @_; + exists $err{$errname}; +} + +sub _tie_it { + tie %{$_[0]}, __PACKAGE__; +} + +__END__ + + +# ex: set ro: +# +# $Id: Encode.pm,v 2.97 2018/02/21 12:14:24 dankogai Exp $ +# +package Encode; +use strict; +use warnings; +use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; +our $VERSION; +BEGIN { + $VERSION = sprintf "%d.%02d", q$Revision: 2.97 $ =~ /(\d+)/g; + require XSLoader; + XSLoader::load( __PACKAGE__, $VERSION ); +} + +use Exporter 5.57 'import'; + +our @CARP_NOT = qw(Encode::Encoder); + +# Public, encouraged API is exported by default + +our @EXPORT = qw( + decode decode_utf8 encode encode_utf8 str2bytes bytes2str + encodings find_encoding find_mime_encoding clone_encoding +); +our @FB_FLAGS = qw( + DIE_ON_ERR WARN_ON_ERR RETURN_ON_ERR LEAVE_SRC + PERLQQ HTMLCREF XMLCREF STOP_AT_PARTIAL +); +our @FB_CONSTS = qw( + FB_DEFAULT FB_CROAK FB_QUIET FB_WARN + FB_PERLQQ FB_HTMLCREF FB_XMLCREF +); +our @EXPORT_OK = ( + qw( + _utf8_off _utf8_on define_encoding from_to is_16bit is_8bit + is_utf8 perlio_ok resolve_alias utf8_downgrade utf8_upgrade + ), + @FB_FLAGS, @FB_CONSTS, +); + +our %EXPORT_TAGS = ( + all => [ @EXPORT, @EXPORT_OK ], + default => [ @EXPORT ], + fallbacks => [ @FB_CONSTS ], + fallback_all => [ @FB_CONSTS, @FB_FLAGS ], +); + +# Documentation moved after __END__ for speed - NI-S + +our $ON_EBCDIC = ( ord("A") == 193 ); + +use Encode::Alias (); +use Encode::MIME::Name; + +use Storable; + +# Make a %Encoding package variable to allow a certain amount of cheating +our %Encoding; +our %ExtModule; +require Encode::Config; +# See +# https://bugzilla.redhat.com/show_bug.cgi?id=435505#c2 +# to find why sig handlers inside eval{} are disabled. +eval { + local $SIG{__DIE__}; + local $SIG{__WARN__}; + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require Encode::ConfigLocal; +}; + +sub encodings { + my %enc; + my $arg = $_[1] || ''; + if ( $arg eq ":all" ) { + %enc = ( %Encoding, %ExtModule ); + } + else { + %enc = %Encoding; + for my $mod ( map { m/::/ ? $_ : "Encode::$_" } @_ ) { + DEBUG and warn $mod; + for my $enc ( keys %ExtModule ) { + $ExtModule{$enc} eq $mod and $enc{$enc} = $mod; + } + } + } + return sort { lc $a cmp lc $b } + grep { !/^(?:Internal|Unicode|Guess)$/o } keys %enc; +} + +sub perlio_ok { + my $obj = ref( $_[0] ) ? $_[0] : find_encoding( $_[0] ); + $obj->can("perlio_ok") and return $obj->perlio_ok(); + return 0; # safety net +} + +sub define_encoding { + my $obj = shift; + my $name = shift; + $Encoding{$name} = $obj; + my $lc = lc($name); + define_alias( $lc => $obj ) unless $lc eq $name; + while (@_) { + my $alias = shift; + define_alias( $alias, $obj ); + } + my $class = ref($obj); + push @Encode::CARP_NOT, $class unless grep { $_ eq $class } @Encode::CARP_NOT; + push @Encode::Encoding::CARP_NOT, $class unless grep { $_ eq $class } @Encode::Encoding::CARP_NOT; + return $obj; +} + +sub getEncoding { + my ( $class, $name, $skip_external ) = @_; + + defined($name) or return; + + $name =~ s/\s+//g; # https://rt.cpan.org/Ticket/Display.html?id=65796 + + ref($name) && $name->can('renew') and return $name; + exists $Encoding{$name} and return $Encoding{$name}; + my $lc = lc $name; + exists $Encoding{$lc} and return $Encoding{$lc}; + + my $oc = $class->find_alias($name); + defined($oc) and return $oc; + $lc ne $name and $oc = $class->find_alias($lc); + defined($oc) and return $oc; + + unless ($skip_external) { + if ( my $mod = $ExtModule{$name} || $ExtModule{$lc} ) { + $mod =~ s,::,/,g; + $mod .= '.pm'; + eval { require $mod; }; + exists $Encoding{$name} and return $Encoding{$name}; + } + } + return; +} + +# HACK: These two functions must be defined in Encode and because of +# cyclic dependency between Encode and Encode::Alias, Exporter does not work +sub find_alias { + goto &Encode::Alias::find_alias; +} +sub define_alias { + goto &Encode::Alias::define_alias; +} + +sub find_encoding($;$) { + my ( $name, $skip_external ) = @_; + return __PACKAGE__->getEncoding( $name, $skip_external ); +} + +sub find_mime_encoding($;$) { + my ( $mime_name, $skip_external ) = @_; + my $name = Encode::MIME::Name::get_encode_name( $mime_name ); + return find_encoding( $name, $skip_external ); +} + +sub resolve_alias($) { + my $obj = find_encoding(shift); + defined $obj and return $obj->name; + return; +} + +sub clone_encoding($) { + my $obj = find_encoding(shift); + ref $obj or return; + return Storable::dclone($obj); +} + +sub encode($$;$) { + my ( $name, $string, $check ) = @_; + return undef unless defined $string; + $string .= ''; # stringify; + $check ||= 0; + unless ( defined $name ) { + require Carp; + Carp::croak("Encoding name should not be undef"); + } + my $enc = find_encoding($name); + unless ( defined $enc ) { + require Carp; + Carp::croak("Unknown encoding '$name'"); + } + # For Unicode, warnings need to be caught and re-issued at this level + # so that callers can disable utf8 warnings lexically. + my $octets; + if ( ref($enc) eq 'Encode::Unicode' ) { + my $warn = ''; + { + local $SIG{__WARN__} = sub { $warn = shift }; + $octets = $enc->encode( $string, $check ); + } + warnings::warnif('utf8', $warn) if length $warn; + } + else { + $octets = $enc->encode( $string, $check ); + } + $_[1] = $string if $check and !ref $check and !( $check & LEAVE_SRC ); + return $octets; +} +*str2bytes = \&encode; + +sub decode($$;$) { + my ( $name, $octets, $check ) = @_; + return undef unless defined $octets; + $octets .= ''; + $check ||= 0; + my $enc = find_encoding($name); + unless ( defined $enc ) { + require Carp; + Carp::croak("Unknown encoding '$name'"); + } + # For Unicode, warnings need to be caught and re-issued at this level + # so that callers can disable utf8 warnings lexically. + my $string; + if ( ref($enc) eq 'Encode::Unicode' ) { + my $warn = ''; + { + local $SIG{__WARN__} = sub { $warn = shift }; + $string = $enc->decode( $octets, $check ); + } + warnings::warnif('utf8', $warn) if length $warn; + } + else { + $string = $enc->decode( $octets, $check ); + } + $_[1] = $octets if $check and !ref $check and !( $check & LEAVE_SRC ); + return $string; +} +*bytes2str = \&decode; + +sub from_to($$$;$) { + my ( $string, $from, $to, $check ) = @_; + return undef unless defined $string; + $check ||= 0; + my $f = find_encoding($from); + unless ( defined $f ) { + require Carp; + Carp::croak("Unknown encoding '$from'"); + } + my $t = find_encoding($to); + unless ( defined $t ) { + require Carp; + Carp::croak("Unknown encoding '$to'"); + } + + # For Unicode, warnings need to be caught and re-issued at this level + # so that callers can disable utf8 warnings lexically. + my $uni; + if ( ref($f) eq 'Encode::Unicode' ) { + my $warn = ''; + { + local $SIG{__WARN__} = sub { $warn = shift }; + $uni = $f->decode($string); + } + warnings::warnif('utf8', $warn) if length $warn; + } + else { + $uni = $f->decode($string); + } + + if ( ref($t) eq 'Encode::Unicode' ) { + my $warn = ''; + { + local $SIG{__WARN__} = sub { $warn = shift }; + $_[0] = $string = $t->encode( $uni, $check ); + } + warnings::warnif('utf8', $warn) if length $warn; + } + else { + $_[0] = $string = $t->encode( $uni, $check ); + } + + return undef if ( $check && length($uni) ); + return defined( $_[0] ) ? length($string) : undef; +} + +sub encode_utf8($) { + my ($str) = @_; + return undef unless defined $str; + utf8::encode($str); + return $str; +} + +my $utf8enc; + +sub decode_utf8($;$) { + my ( $octets, $check ) = @_; + return undef unless defined $octets; + $octets .= ''; + $check ||= 0; + $utf8enc ||= find_encoding('utf8'); + my $string = $utf8enc->decode( $octets, $check ); + $_[0] = $octets if $check and !ref $check and !( $check & LEAVE_SRC ); + return $string; +} + +onBOOT; + +if ($ON_EBCDIC) { + package Encode::UTF_EBCDIC; + use parent 'Encode::Encoding'; + my $obj = bless { Name => "UTF_EBCDIC" } => "Encode::UTF_EBCDIC"; + Encode::define_encoding($obj, 'Unicode'); + sub decode { + my ( undef, $str, $chk ) = @_; + my $res = ''; + for ( my $i = 0 ; $i < length($str) ; $i++ ) { + $res .= + chr( + utf8::unicode_to_native( ord( substr( $str, $i, 1 ) ) ) + ); + } + $_[1] = '' if $chk; + return $res; + } + sub encode { + my ( undef, $str, $chk ) = @_; + my $res = ''; + for ( my $i = 0 ; $i < length($str) ; $i++ ) { + $res .= + chr( + utf8::native_to_unicode( ord( substr( $str, $i, 1 ) ) ) + ); + } + $_[1] = '' if $chk; + return $res; + } +} else { + package Encode::Internal; + use parent 'Encode::Encoding'; + my $obj = bless { Name => "Internal" } => "Encode::Internal"; + Encode::define_encoding($obj, 'Unicode'); + sub decode { + my ( undef, $str, $chk ) = @_; + utf8::upgrade($str); + $_[1] = '' if $chk; + return $str; + } + *encode = \&decode; +} + +{ + # https://rt.cpan.org/Public/Bug/Display.html?id=103253 + package Encode::XS; + use parent 'Encode::Encoding'; +} + +{ + package Encode::utf8; + use parent 'Encode::Encoding'; + my %obj = ( + 'utf8' => { Name => 'utf8' }, + 'utf-8-strict' => { Name => 'utf-8-strict', strict_utf8 => 1 } + ); + for ( keys %obj ) { + bless $obj{$_} => __PACKAGE__; + Encode::define_encoding( $obj{$_} => $_ ); + } + sub cat_decode { + # ($obj, $dst, $src, $pos, $trm, $chk) + # currently ignores $chk + my ( undef, undef, undef, $pos, $trm ) = @_; + my ( $rdst, $rsrc, $rpos ) = \@_[ 1, 2, 3 ]; + use bytes; + if ( ( my $npos = index( $$rsrc, $trm, $pos ) ) >= 0 ) { + $$rdst .= + substr( $$rsrc, $pos, $npos - $pos + length($trm) ); + $$rpos = $npos + length($trm); + return 1; + } + $$rdst .= substr( $$rsrc, $pos ); + $$rpos = length($$rsrc); + return ''; + } +} + +1; + +__END__ + +# mro.pm +# +# Copyright (c) 2007 Brandon L Black +# Copyright (c) 2008,2009 Larry Wall and others +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +package mro; +use strict; +use warnings; + +# mro.pm versions < 1.00 reserved for MRO::Compat +# for partial back-compat to 5.[68].x +our $VERSION = '1.22'; + +require XSLoader; +XSLoader::load('mro'); + +sub import { + mro::set_mro(scalar(caller), $_[1]) if $_[1]; +} + +package # hide me from PAUSE + next; + +sub can { mro::_nextcan($_[0], 0) } + +sub method { + my $method = mro::_nextcan($_[0], 1); + goto &$method; +} + +package # hide me from PAUSE + maybe::next; + +sub method { + my $method = mro::_nextcan($_[0], 0); + goto &$method if defined $method; + return; +} + +1; + +__END__ + +package re; + +# pragma for controlling the regexp engine +use strict; +use warnings; + +our $VERSION = "0.36"; +our @ISA = qw(Exporter); +our @EXPORT_OK = ('regmust', + qw(is_regexp regexp_pattern + regname regnames regnames_count)); +our %EXPORT_OK = map { $_ => 1 } @EXPORT_OK; + +my %bitmask = ( + taint => 0x00100000, # HINT_RE_TAINT + eval => 0x00200000, # HINT_RE_EVAL +); + +my $flags_hint = 0x02000000; # HINT_RE_FLAGS +my $PMMOD_SHIFT = 0; +my %reflags = ( + m => 1 << ($PMMOD_SHIFT + 0), + s => 1 << ($PMMOD_SHIFT + 1), + i => 1 << ($PMMOD_SHIFT + 2), + x => 1 << ($PMMOD_SHIFT + 3), + xx => 1 << ($PMMOD_SHIFT + 4), + n => 1 << ($PMMOD_SHIFT + 5), + p => 1 << ($PMMOD_SHIFT + 6), + strict => 1 << ($PMMOD_SHIFT + 10), +# special cases: + d => 0, + l => 1, + u => 2, + a => 3, + aa => 4, +); + +sub setcolor { + eval { # Ignore errors + require Term::Cap; + + my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning. + my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue'; + my @props = split /,/, $props; + my $colors = join "\t", map {$terminal->Tputs($_,1)} @props; + + $colors =~ s/\0//g; + $ENV{PERL_RE_COLORS} = $colors; + }; + if ($@) { + $ENV{PERL_RE_COLORS} ||= qq'\t\t> <\t> <\t\t'; + } + +} + +my %flags = ( + COMPILE => 0x0000FF, + PARSE => 0x000001, + OPTIMISE => 0x000002, + TRIEC => 0x000004, + DUMP => 0x000008, + FLAGS => 0x000010, + TEST => 0x000020, + + EXECUTE => 0x00FF00, + INTUIT => 0x000100, + MATCH => 0x000200, + TRIEE => 0x000400, + + EXTRA => 0xFF0000, + TRIEM => 0x010000, + OFFSETS => 0x020000, + OFFSETSDBG => 0x040000, + STATE => 0x080000, + OPTIMISEM => 0x100000, + STACK => 0x280000, + BUFFERS => 0x400000, + GPOS => 0x800000, +); +$flags{ALL} = -1 & ~($flags{OFFSETS}|$flags{OFFSETSDBG}|$flags{BUFFERS}); +$flags{All} = $flags{all} = $flags{DUMP} | $flags{EXECUTE}; +$flags{Extra} = $flags{EXECUTE} | $flags{COMPILE} | $flags{GPOS}; +$flags{More} = $flags{MORE} = $flags{All} | $flags{TRIEC} | $flags{TRIEM} | $flags{STATE}; +$flags{State} = $flags{DUMP} | $flags{EXECUTE} | $flags{STATE}; +$flags{TRIE} = $flags{DUMP} | $flags{EXECUTE} | $flags{TRIEC}; + +if (defined &DynaLoader::boot_DynaLoader) { + require XSLoader; + XSLoader::load(); +} +# else we're miniperl +# We need to work for miniperl, because the XS toolchain uses Text::Wrap, which +# uses re 'taint'. + +sub _load_unload { + my ($on)= @_; + if ($on) { + # We call install() every time, as if we didn't, we wouldn't + # "see" any changes to the color environment var since + # the last time it was called. + + # install() returns an integer, which if casted properly + # in C resolves to a structure containing the regexp + # hooks. Setting it to a random integer will guarantee + # segfaults. + $^H{regcomp} = install(); + } else { + delete $^H{regcomp}; + } +} + +sub bits { + my $on = shift; + my $bits = 0; + my $turning_all_off = ! @_ && ! $on; + if ($turning_all_off) { + + # Pretend were called with certain parameters, which are best dealt + # with that way. + push @_, keys %bitmask; # taint and eval + push @_, 'strict'; + } + + # Process each subpragma parameter + ARG: + foreach my $idx (0..$#_){ + my $s=$_[$idx]; + if ($s eq 'Debug' or $s eq 'Debugcolor') { + setcolor() if $s =~/color/i; + ${^RE_DEBUG_FLAGS} = 0 unless defined ${^RE_DEBUG_FLAGS}; + for my $idx ($idx+1..$#_) { + if ($flags{$_[$idx]}) { + if ($on) { + ${^RE_DEBUG_FLAGS} |= $flags{$_[$idx]}; + } else { + ${^RE_DEBUG_FLAGS} &= ~ $flags{$_[$idx]}; + } + } else { + require Carp; + Carp::carp("Unknown \"re\" Debug flag '$_[$idx]', possible flags: ", + join(", ",sort keys %flags ) ); + } + } + _load_unload($on ? 1 : ${^RE_DEBUG_FLAGS}); + last; + } elsif ($s eq 'debug' or $s eq 'debugcolor') { + setcolor() if $s =~/color/i; + _load_unload($on); + last; + } elsif (exists $bitmask{$s}) { + $bits |= $bitmask{$s}; + } elsif ($EXPORT_OK{$s}) { + require Exporter; + re->export_to_level(2, 're', $s); + } elsif ($s eq 'strict') { + if ($on) { + $^H{reflags} |= $reflags{$s}; + warnings::warnif('experimental::re_strict', + "\"use re 'strict'\" is experimental"); + + # Turn on warnings if not already done. + if (! warnings::enabled('regexp')) { + require warnings; + warnings->import('regexp'); + $^H{re_strict} = 1; + } + } + else { + $^H{reflags} &= ~$reflags{$s} if $^H{reflags}; + + # Turn off warnings if we turned them on. + warnings->unimport('regexp') if $^H{re_strict}; + } + if ($^H{reflags}) { + $^H |= $flags_hint; + } + else { + $^H &= ~$flags_hint; + } + } elsif ($s =~ s/^\///) { + my $reflags = $^H{reflags} || 0; + my $seen_charset; + my $x_count = 0; + while ($s =~ m/( . )/gx) { + local $_ = $1; + if (/[adul]/) { + # The 'a' may be repeated; hide this from the rest of the + # code by counting and getting rid of all of them, then + # changing to 'aa' if there is a repeat. + if ($_ eq 'a') { + my $sav_pos = pos $s; + my $a_count = $s =~ s/a//g; + pos $s = $sav_pos - 1; # -1 because got rid of the 'a' + if ($a_count > 2) { + require Carp; + Carp::carp( + qq 'The "a" flag may only appear a maximum of twice' + ); + } + elsif ($a_count == 2) { + $_ = 'aa'; + } + } + if ($on) { + if ($seen_charset) { + require Carp; + if ($seen_charset ne $_) { + Carp::carp( + qq 'The "$seen_charset" and "$_" flags ' + .qq 'are exclusive' + ); + } + else { + Carp::carp( + qq 'The "$seen_charset" flag may not appear ' + .qq 'twice' + ); + } + } + $^H{reflags_charset} = $reflags{$_}; + $seen_charset = $_; + } + else { + delete $^H{reflags_charset} + if defined $^H{reflags_charset} + && $^H{reflags_charset} == $reflags{$_}; + } + } elsif (exists $reflags{$_}) { + if ($_ eq 'x') { + $x_count++; + if ($x_count > 2) { + require Carp; + Carp::carp( + qq 'The "x" flag may only appear a maximum of twice' + ); + } + elsif ($x_count == 2) { + $_ = 'xx'; # First time through got the /x + } + } + + $on + ? $reflags |= $reflags{$_} + : ($reflags &= ~$reflags{$_}); + } else { + require Carp; + Carp::carp( + qq'Unknown regular expression flag "$_"' + ); + next ARG; + } + } + ($^H{reflags} = $reflags or defined $^H{reflags_charset}) + ? $^H |= $flags_hint + : ($^H &= ~$flags_hint); + } else { + require Carp; + Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: ", + join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask), + ")"); + } + } + + if ($turning_all_off) { + _load_unload(0); + $^H{reflags} = 0; + $^H{reflags_charset} = 0; + $^H &= ~$flags_hint; + } + + $bits; +} + +sub import { + shift; + $^H |= bits(1, @_); +} + +sub unimport { + shift; + $^H &= ~ bits(0, @_); +} + +1; + +__END__ + +# This file was created by configpm when Perl was built. Any changes +# made to this file will be lost the next time perl is built. + +# for a description of the variables, please have a look at the +# Glossary file, as written in the Porting folder, or use the url: +# http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/Glossary + +package Config; +use strict; +use warnings; +our ( %Config, $VERSION ); + +$VERSION = "5.028001"; + +# Skip @Config::EXPORT because it only contains %Config, which we special +# case below as it's not a function. @Config::EXPORT won't change in the +# lifetime of Perl 5. +my %Export_Cache = (myconfig => 1, config_sh => 1, config_vars => 1, + config_re => 1, compile_date => 1, local_patches => 1, + bincompat_options => 1, non_bincompat_options => 1, + header_files => 1); + +@Config::EXPORT = qw(%Config); +@Config::EXPORT_OK = keys %Export_Cache; + +# Need to stub all the functions to make code such as print Config::config_sh +# keep working + +sub bincompat_options; +sub compile_date; +sub config_re; +sub config_sh; +sub config_vars; +sub header_files; +sub local_patches; +sub myconfig; +sub non_bincompat_options; + +# Define our own import method to avoid pulling in the full Exporter: +sub import { + shift; + @_ = @Config::EXPORT unless @_; + + my @funcs = grep $_ ne '%Config', @_; + my $export_Config = @funcs < @_ ? 1 : 0; + + no strict 'refs'; + my $callpkg = caller(0); + foreach my $func (@funcs) { + die qq{"$func" is not exported by the Config module\n} + unless $Export_Cache{$func}; + *{$callpkg.'::'.$func} = \&{$func}; + } + + *{"$callpkg\::Config"} = \%Config if $export_Config; + return; +} + +die "$0: Perl lib version (5.28.1) doesn't match executable '$^X' version ($])" + unless $^V; + +$^V eq 5.28.1 + or die sprintf "%s: Perl lib version (5.28.1) doesn't match executable '$^X' version (%vd)", $0, $^V; + + +sub FETCH { + my($self, $key) = @_; + + # check for cached value (which may be undef so we use exists not defined) + return exists $self->{$key} ? $self->{$key} : $self->fetch_string($key); +} + +sub TIEHASH { + bless $_[1], $_[0]; +} + +sub DESTROY { } + +sub AUTOLOAD { + require 'Config_heavy.pl'; + goto \&launcher unless $Config::AUTOLOAD =~ /launcher$/; + die "&Config::AUTOLOAD failed on $Config::AUTOLOAD"; +} + +# tie returns the object, so the value returned to require will be true. +tie %Config, 'Config', { + archlibexp => '/opt/perl/lib/5.28.1/wasm', + archname => 'wasm', + cc => 'emcc', + d_readlink => 'define', + d_symlink => 'define', + dlext => 'none', + dlsrc => 'dl_none.xs', + dont_use_nlink => undef, + exe_ext => '', + inc_version_list => ' ', + intsize => '4', + ldlibpthname => 'LD_LIBRARY_PATH', + libpth => '/usr/local/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL /usr/local/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libcxx /home/haukex/emsdk/emscripten/1.38.28/system/lib/libcxxabi/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/compat /home/haukex/emsdk/emscripten/1.38.28/system/lib /home/haukex/emsdk/emscripten/1.38.28/system/include/libc /home/haukex/emsdk/emscripten/1.38.28/system/include/SDL', + osname => 'emscripten', + osvers => '1.38.28', + path_sep => ':', + privlibexp => '/opt/perl/lib/5.28.1', + scriptdir => '/opt/perl/bin', + sitearchexp => '/opt/perl/lib/site_perl/5.28.1/wasm', + sitelibexp => '/opt/perl/lib/site_perl/5.28.1', + so => 'so', + useithreads => undef, + usevendorprefix => undef, + version => '5.28.1', +}; +# Copyright (c) 1997-2007 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +# Maintained since 2013 by Paul Evans <leonerd@leonerd.org.uk> + +package Scalar::Util; + +use strict; +use warnings; +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + blessed refaddr reftype weaken unweaken isweak + + dualvar isdual isvstring looks_like_number openhandle readonly set_prototype + tainted +); +our $VERSION = "1.50"; +$VERSION = eval $VERSION; + +require List::Util; # List::Util loads the XS +List::Util->VERSION( $VERSION ); # Ensure we got the right XS version (RT#100863) + +our @EXPORT_FAIL; + +unless (defined &weaken) { + push @EXPORT_FAIL, qw(weaken); +} +unless (defined &isweak) { + push @EXPORT_FAIL, qw(isweak isvstring); +} +unless (defined &isvstring) { + push @EXPORT_FAIL, qw(isvstring); +} + +sub export_fail { + if (grep { /^(?:weaken|isweak)$/ } @_ ) { + require Carp; + Carp::croak("Weak references are not implemented in the version of perl"); + } + + if (grep { /^isvstring$/ } @_ ) { + require Carp; + Carp::croak("Vstrings are not implemented in the version of perl"); + } + + @_; +} + +# set_prototype has been moved to Sub::Util with a different interface +sub set_prototype(&$) +{ + my ( $code, $proto ) = @_; + return Sub::Util::set_prototype( $proto, $code ); +} + +1; + +__END__ + + +use strict; +package Tie::Hash::NamedCapture; + +our $VERSION = "0.10"; + +require XSLoader; +XSLoader::load(); # This returns true, which makes require happy. + +__END__ + +# Copyright (c) 2014 Paul Evans <leonerd@leonerd.org.uk>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package Sub::Util; + +use strict; +use warnings; + +require Exporter; + +our @ISA = qw( Exporter ); +our @EXPORT_OK = qw( + prototype set_prototype + subname set_subname +); + +our $VERSION = "1.50"; +$VERSION = eval $VERSION; + +require List::Util; # as it has the XS +List::Util->VERSION( $VERSION ); # Ensure we got the right XS version (RT#100863) + + + + +sub prototype +{ + my ( $code ) = @_; + return CORE::prototype( $code ); +} + + + + + +1; +package B::Terse; + +our $VERSION = '1.08'; + +use strict; +use B qw(class @specialsv_name); +use B::Concise qw(concise_subref set_style_standard); +use Carp; + +sub terse { + my ($order, $subref) = @_; + set_style_standard("terse"); + if ($order eq "exec") { + concise_subref('exec', $subref); + } else { + concise_subref('basic', $subref); + } +} + +sub compile { + my @args = @_; + my $order = @args ? shift(@args) : ""; + $order = "-exec" if $order eq "exec"; + unshift @args, $order if $order ne ""; + B::Concise::compile("-terse", @args); +} + +sub indent { + my ($level) = @_ ? shift : 0; + return " " x $level; +} + + +sub B::SV::terse { + my($sv, $level) = (@_, 0); + my %info; + B::Concise::concise_sv($sv, \%info); + my $s = indent($level) + . B::Concise::fmt_line(\%info, $sv, + "#svclass~(?((#svaddr))?)~#svval", 0); + chomp $s; + print "$s\n" unless defined wantarray; + $s; +} + +sub B::NULL::terse { + my ($sv, $level) = (@_, 0); + my $s = indent($level) . sprintf "%s (0x%lx)", class($sv), $$sv; + print "$s\n" unless defined wantarray; + $s; +} + +sub B::SPECIAL::terse { + my ($sv, $level) = (@_, 0); + my $s = indent($level) + . sprintf( "%s #%d %s", class($sv), $$sv, $specialsv_name[$$sv]); + print "$s\n" unless defined wantarray; + $s; +} + +1; + +__END__ + +package B::Xref; + +our $VERSION = '1.07'; + + +use strict; +use Config; +use B qw(peekop class comppadlist main_start svref_2object walksymtable + OPpLVAL_INTRO SVf_POK SVf_ROK OPpOUR_INTRO cstring + ); + +sub UNKNOWN { ["?", "?", "?"] } + +my @pad; # lexicals in current pad + # as ["(lexical)", type, name] +my %done; # keyed by $$op: set when each $op is done +my $top = UNKNOWN; # shadows top element of stack as + # [pack, type, name] (pack can be "(lexical)") +my $file; # shadows current filename +my $line; # shadows current line number +my $subname; # shadows current sub name +my %table; # Multi-level hash to record all uses etc. +my @todo = (); # List of CVs that need processing + +my %code = (intro => "i", used => "", + subdef => "s", subused => "&", + formdef => "f", meth => "->"); + + +# Options +my ($debug_op, $debug_top, $nodefs, $raw); + +sub process { + my ($var, $event) = @_; + my ($pack, $type, $name) = @$var; + if ($type eq "*") { + if ($event eq "used") { + return; + } elsif ($event eq "subused") { + $type = "&"; + } + } + $type =~ s/(.)\*$/$1/g; + if ($raw) { + printf "%-16s %-12s %5d %-12s %4s %-16s %s\n", + $file, $subname, $line, $pack, $type, $name, $event; + } else { + # Wheee + push(@{$table{$file}->{$subname}->{$pack}->{$type.$name}->{$event}}, + $line); + } +} + +sub load_pad { + my $padlist = shift; + my ($namelistav, $vallistav, @namelist, $ix); + @pad = (); + return if class($padlist) =~ '^(?:SPECIAL|NULL)\z'; + ($namelistav,$vallistav) = $padlist->ARRAY; + @namelist = $namelistav->ARRAY; + for ($ix = 1; $ix < @namelist; $ix++) { + my $namesv = $namelist[$ix]; + next if class($namesv) eq "SPECIAL"; + my ($type, $name) = $namesv->PV =~ /^(.)([^\0]*)(\0.*)?$/; + $pad[$ix] = ["(lexical)", $type || '?', $name || '?']; + } + if ($Config{useithreads}) { + my (@vallist); + @vallist = $vallistav->ARRAY; + for ($ix = 1; $ix < @vallist; $ix++) { + my $valsv = $vallist[$ix]; + next unless class($valsv) eq "GV"; + next if class($valsv->STASH) eq 'SPECIAL'; + # these pad GVs don't have corresponding names, so same @pad + # array can be used without collisions + $pad[$ix] = [$valsv->STASH->NAME, "*", $valsv->NAME]; + } + } +} + +sub xref { + my $start = shift; + my $op; + for ($op = $start; $$op; $op = $op->next) { + last if $done{$$op}++; + warn sprintf("top = [%s, %s, %s]\n", @$top) if $debug_top; + warn peekop($op), "\n" if $debug_op; + my $opname = $op->name; + if ($opname =~ /^(or|and|mapwhile|grepwhile|range|cond_expr)$/) { + xref($op->other); + } elsif ($opname eq "match" || $opname eq "subst") { + xref($op->pmreplstart); + } elsif ($opname eq "substcont") { + xref($op->other->pmreplstart); + $op = $op->other; + redo; + } elsif ($opname eq "enterloop") { + xref($op->redoop); + xref($op->nextop); + xref($op->lastop); + } elsif ($opname eq "subst") { + xref($op->pmreplstart); + } else { + no strict 'refs'; + my $ppname = "pp_$opname"; + &$ppname($op) if defined(&$ppname); + } + } +} + +sub xref_cv { + my $cv = shift; + my $pack = $cv->GV->STASH->NAME; + $subname = ($pack eq "main" ? "" : "$pack\::") . $cv->GV->NAME; + load_pad($cv->PADLIST); + xref($cv->START); + $subname = "(main)"; +} + +sub xref_object { + my $cvref = shift; + xref_cv(svref_2object($cvref)); +} + +sub xref_main { + $subname = "(main)"; + load_pad(comppadlist); + xref(main_start); + while (@todo) { + xref_cv(shift @todo); + } +} + +sub pp_nextstate { + my $op = shift; + $file = $op->file; + $line = $op->line; + $top = UNKNOWN; +} + +sub pp_padrange { + my $op = shift; + my $count = $op->private & 127; + for my $i (0..$count-1) { + $top = $pad[$op->targ + $i]; + process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used"); + } +} + +sub pp_padsv { + my $op = shift; + $top = $pad[$op->targ]; + process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used"); +} + +sub pp_padav { pp_padsv(@_) } +sub pp_padhv { pp_padsv(@_) } + +sub deref { + my ($op, $var, $as) = @_; + $var->[1] = $as . $var->[1]; + process($var, $op->private & OPpOUR_INTRO ? "intro" : "used"); +} + +sub pp_rv2cv { deref(shift, $top, "&"); } +sub pp_rv2hv { deref(shift, $top, "%"); } +sub pp_rv2sv { deref(shift, $top, "\$"); } +sub pp_rv2av { deref(shift, $top, "\@"); } +sub pp_rv2gv { deref(shift, $top, "*"); } + +sub pp_gvsv { + my $op = shift; + my $gv; + if ($Config{useithreads}) { + $top = $pad[$op->padix]; + $top = UNKNOWN unless $top; + $top->[1] = '$'; + } + else { + $gv = $op->gv; + $top = [$gv->STASH->NAME, '$', $gv->SAFENAME]; + } + process($top, $op->private & OPpLVAL_INTRO || + $op->private & OPpOUR_INTRO ? "intro" : "used"); +} + +sub pp_gv { + my $op = shift; + my $gv; + if ($Config{useithreads}) { + $top = $pad[$op->padix]; + $top = UNKNOWN unless $top; + $top->[1] = '*'; + } + else { + $gv = $op->gv; + if ($gv->FLAGS & SVf_ROK) { # sub ref + my $cv = $gv->RV; + $top = [$cv->STASH->NAME, '*', B::safename($cv->NAME_HEK)] + } + else { + $top = [$gv->STASH->NAME, '*', $gv->SAFENAME]; + } + } + process($top, $op->private & OPpLVAL_INTRO ? "intro" : "used"); +} + +sub pp_const { + my $op = shift; + my $sv = $op->sv; + # constant could be in the pad (under useithreads) + if ($$sv) { + $top = ["?", "", + (class($sv) ne "SPECIAL" && $sv->FLAGS & SVf_POK) + ? cstring($sv->PV) : "?"]; + } + else { + $top = $pad[$op->targ]; + $top = UNKNOWN unless $top; + } +} + +sub pp_method { + my $op = shift; + $top = ["(method)", "->".$top->[1], $top->[2]]; +} + +sub pp_entersub { + my $op = shift; + if ($top->[1] eq "m") { + process($top, "meth"); + } else { + process($top, "subused"); + } + $top = UNKNOWN; +} + +# +# Stuff for cross referencing definitions of variables and subs +# + +sub B::GV::xref { + my $gv = shift; + my $cv = $gv->CV; + if ($$cv) { + #return if $done{$$cv}++; + $file = $gv->FILE; + $line = $gv->LINE; + process([$gv->STASH->NAME, "&", $gv->NAME], "subdef"); + push(@todo, $cv); + } + my $form = $gv->FORM; + if ($$form) { + return if $done{$$form}++; + $file = $gv->FILE; + $line = $gv->LINE; + process([$gv->STASH->NAME, "", $gv->NAME], "formdef"); + } +} + +sub xref_definitions { + my ($pack, %exclude); + return if $nodefs; + $subname = "(definitions)"; + foreach $pack (qw(B O AutoLoader DynaLoader XSLoader Config DB VMS + strict vars FileHandle Exporter Carp PerlIO::Layer + attributes utf8 warnings)) { + $exclude{$pack."::"} = 1; + } + no strict qw(vars refs); + walksymtable(\%{"main::"}, "xref", sub { !defined($exclude{$_[0]}) }); +} + +sub output { + return if $raw; + my ($file, $subname, $pack, $name, $ev, $perfile, $persubname, + $perpack, $pername, $perev); + foreach $file (sort(keys(%table))) { + $perfile = $table{$file}; + print "File $file\n"; + foreach $subname (sort(keys(%$perfile))) { + $persubname = $perfile->{$subname}; + print " Subroutine $subname\n"; + foreach $pack (sort(keys(%$persubname))) { + $perpack = $persubname->{$pack}; + print " Package $pack\n"; + foreach $name (sort(keys(%$perpack))) { + $pername = $perpack->{$name}; + my @lines; + foreach $ev (qw(intro formdef subdef meth subused used)) { + $perev = $pername->{$ev}; + if (defined($perev) && @$perev) { + my $code = $code{$ev}; + push(@lines, map("$code$_", @$perev)); + } + } + printf " %-16s %s\n", $name, join(", ", @lines); + } + } + } + } +} + +sub compile { + my @options = @_; + my ($option, $opt, $arg); + OPTION: + while ($option = shift @options) { + if ($option =~ /^-(.)(.*)/) { + $opt = $1; + $arg = $2; + } else { + unshift @options, $option; + last OPTION; + } + if ($opt eq "-" && $arg eq "-") { + shift @options; + last OPTION; + } elsif ($opt eq "o") { + $arg ||= shift @options; + open(STDOUT, '>', $arg) or return "$arg: $!\n"; + } elsif ($opt eq "d") { + $nodefs = 1; + } elsif ($opt eq "r") { + $raw = 1; + } elsif ($opt eq "D") { + $arg ||= shift @options; + foreach $arg (split(//, $arg)) { + if ($arg eq "o") { + B->debug(1); + } elsif ($arg eq "O") { + $debug_op = 1; + } elsif ($arg eq "t") { + $debug_top = 1; + } + } + } + } + if (@options) { + return sub { + my $objname; + xref_definitions(); + foreach $objname (@options) { + $objname = "main::$objname" unless $objname =~ /::/; + eval "xref_object(\\&$objname)"; + die "xref_object(\\&$objname) failed: $@" if $@; + } + output(); + } + } else { + return sub { + xref_definitions(); + xref_main(); + output(); + } + } +} + +1; +package B::Showlex; + +our $VERSION = '1.05'; + +use strict; +use B qw(svref_2object comppadlist class); +use B::Terse (); +use B::Concise (); + +# +# Invoke as +# perl -MO=Showlex,foo bar.pl +# to see the names of lexical variables used by &foo +# or as +# perl -MO=Showlex bar.pl +# to see the names of file scope lexicals used by bar.pl +# + + +# borrowed from B::Concise +our $walkHandle = \*STDOUT; + +sub walk_output { # updates $walkHandle + $walkHandle = B::Concise::walk_output(@_); + #print "got $walkHandle"; + #print $walkHandle "using it"; + $walkHandle; +} + +sub shownamearray { + my ($name, $av) = @_; + my @els = $av->ARRAY; + my $count = @els; + my $i; + print $walkHandle "$name has $count entries\n"; + for ($i = 0; $i < $count; $i++) { + my $sv = $els[$i]; + if (class($sv) ne "SPECIAL") { + printf $walkHandle "$i: (0x%lx) %s\n", + $$sv, $sv->PVX // "undef" || "const"; + } else { + printf $walkHandle "$i: %s\n", $sv->terse; + #printf $walkHandle "$i: %s\n", B::Concise::concise_sv($sv); + } + } +} + +sub showvaluearray { + my ($name, $av) = @_; + my @els = $av->ARRAY; + my $count = @els; + my $i; + print $walkHandle "$name has $count entries\n"; + for ($i = 0; $i < $count; $i++) { + printf $walkHandle "$i: %s\n", $els[$i]->terse; + #print $walkHandle "$i: %s\n", B::Concise::concise_sv($els[$i]); + } +} + +sub showlex { + my ($objname, $namesav, $valsav) = @_; + shownamearray("Pad of lexical names for $objname", $namesav); + showvaluearray("Pad of lexical values for $objname", $valsav); +} + +my ($newlex, $nosp1); # rendering state vars + +sub padname_terse { + my $name = shift; + return $name->terse if class($name) eq 'SPECIAL'; + my $str = $name->PVX; + return sprintf "(0x%lx) %s", + $$name, + length $str ? qq'"$str"' : defined $str ? "const" : 'undef'; +} + +sub newlex { # drop-in for showlex + my ($objname, $names, $vals) = @_; + my @names = $names->ARRAY; + my @vals = $vals->ARRAY; + my $count = @names; + print $walkHandle "$objname Pad has $count entries\n"; + printf $walkHandle "0: %s\n", padname_terse($names[0]) unless $nosp1; + for (my $i = 1; $i < $count; $i++) { + printf $walkHandle "$i: %s = %s\n", padname_terse($names[$i]), + $vals[$i]->terse, + unless $nosp1 + and class($names[$i]) eq 'SPECIAL' || !$names[$i]->LEN; + } +} + +sub showlex_obj { + my ($objname, $obj) = @_; + $objname =~ s/^&main::/&/; + showlex($objname, svref_2object($obj)->PADLIST->ARRAY) if !$newlex; + newlex ($objname, svref_2object($obj)->PADLIST->ARRAY) if $newlex; +} + +sub showlex_main { + showlex("comppadlist", comppadlist->ARRAY) if !$newlex; + newlex ("main", comppadlist->ARRAY) if $newlex; +} + +sub compile { + my @options = grep(/^-/, @_); + my @args = grep(!/^-/, @_); + for my $o (@options) { + $newlex = 1 if $o eq "-newlex"; + $nosp1 = 1 if $o eq "-nosp"; + } + + return \&showlex_main unless @args; + return sub { + my $objref; + foreach my $objname (@args) { + next unless $objname; # skip nulls w/o carping + + if (ref $objname) { + print $walkHandle "B::Showlex::compile($objname)\n"; + $objref = $objname; + } else { + $objname = "main::$objname" unless $objname =~ /::/; + print $walkHandle "$objname:\n"; + no strict 'refs'; + die "err: unknown function ($objname)\n" + unless *{$objname}{CODE}; + $objref = \&$objname; + } + showlex_obj($objname, $objref); + } + } +} + +1; + +__END__ + +package B::Concise; +# Copyright (C) 2000-2003 Stephen McCamant. All rights reserved. +# This program is free software; you can redistribute and/or modify it +# under the same terms as Perl itself. + +# Note: we need to keep track of how many use declarations/BEGIN +# blocks this module uses, so we can avoid printing them when user +# asks for the BEGIN blocks in her program. Update the comments and +# the count in concise_specials if you add or delete one. The +# -MO=Concise counts as use #1. + +use strict; # use #2 +use warnings; # uses #3 and #4, since warnings uses Carp + +use Exporter (); # use #5 + +our $VERSION = "1.003"; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( set_style set_style_standard add_callback + concise_subref concise_cv concise_main + add_style walk_output compile reset_sequence ); +our %EXPORT_TAGS = + ( io => [qw( walk_output compile reset_sequence )], + style => [qw( add_style set_style_standard )], + cb => [qw( add_callback )], + mech => [qw( concise_subref concise_cv concise_main )], ); + +# use #6 +use B qw(class ppname main_start main_root main_cv cstring svref_2object + SVf_IOK SVf_NOK SVf_POK SVf_IVisUV SVf_FAKE OPf_KIDS OPf_SPECIAL + OPf_STACKED + OPpSPLIT_ASSIGN OPpSPLIT_LEX + CVf_ANON CVf_LEXICAL CVf_NAMED + PAD_FAKELEX_ANON PAD_FAKELEX_MULTI SVf_ROK); + +my %style = + ("terse" => + ["(?(#label =>\n)?)(*( )*)#class (#addr) #name (?([#targ])?) " + . "#svclass~(?((#svaddr))?)~#svval~(?(label \"#coplabel\")?)\n", + "(*( )*)goto #class (#addr)\n", + "#class pp_#name"], + "concise" => + ["#hyphseq2 (*( (x( ;)x))*)<#classsym> #exname#arg(?([#targarglife])?)" + . "~#flags(?(/#private)?)(?(:#hints)?)(x(;~->#next)x)\n" + , " (*( )*) goto #seq\n", + "(?(<#seq>)?)#exname#arg(?([#targarglife])?)"], + "linenoise" => + ["(x(;(*( )*))x)#noise#arg(?([#targarg])?)(x( ;\n)x)", + "gt_#seq ", + "(?(#seq)?)#noise#arg(?([#targarg])?)"], + "debug" => + ["#class (#addr)\n\top_next\t\t#nextaddr\n\t(?(op_other\t#otheraddr\n\t)?)" + . "op_sibling\t#sibaddr\n\t" + . "op_ppaddr\tPL_ppaddr[OP_#NAME]\n\top_type\t\t#typenum\n" + . "\top_flags\t#flagval\n\top_private\t#privval\t#hintsval\n" + . "(?(\top_first\t#firstaddr\n)?)(?(\top_last\t\t#lastaddr\n)?)" + . "(?(\top_sv\t\t#svaddr\n)?)", + " GOTO #addr\n", + "#addr"], + "env" => [$ENV{B_CONCISE_FORMAT}, $ENV{B_CONCISE_GOTO_FORMAT}, + $ENV{B_CONCISE_TREE_FORMAT}], + ); + +# Renderings, ie how Concise prints, is controlled by these vars +# primary: +our $stylename; # selects current style from %style +my $order = "basic"; # how optree is walked & printed: basic, exec, tree + +# rendering mechanics: +# these 'formats' are the line-rendering templates +# they're updated from %style when $stylename changes +my ($format, $gotofmt, $treefmt); + +# lesser players: +my $base = 36; # how <sequence#> is displayed +my $big_endian = 1; # more <sequence#> display +my $tree_style = 0; # tree-order details +my $banner = 1; # print banner before optree is traversed +my $do_main = 0; # force printing of main routine +my $show_src; # show source code + +# another factor: can affect all styles! +our @callbacks; # allow external management + +set_style_standard("concise"); + +my $curcv; +my $cop_seq_base; + +sub set_style { + ($format, $gotofmt, $treefmt) = @_; + #warn "set_style: deprecated, use set_style_standard instead\n"; # someday + die "expecting 3 style-format args\n" unless @_ == 3; +} + +sub add_style { + my ($newstyle,@args) = @_; + die "style '$newstyle' already exists, choose a new name\n" + if exists $style{$newstyle}; + die "expecting 3 style-format args\n" unless @args == 3; + $style{$newstyle} = [@args]; + $stylename = $newstyle; # update rendering state +} + +sub set_style_standard { + ($stylename) = @_; # update rendering state + die "err: style '$stylename' unknown\n" unless exists $style{$stylename}; + set_style(@{$style{$stylename}}); +} + +sub add_callback { + push @callbacks, @_; +} + +# output handle, used with all Concise-output printing +our $walkHandle; # public for your convenience +BEGIN { $walkHandle = \*STDOUT } + +sub walk_output { # updates $walkHandle + my $handle = shift; + return $walkHandle unless $handle; # allow use as accessor + + if (ref $handle eq 'SCALAR') { + require Config; + die "no perlio in this build, can't call walk_output (\\\$scalar)\n" + unless $Config::Config{useperlio}; + # in 5.8+, open(FILEHANDLE,MODE,REFERENCE) writes to string + open my $tmp, '>', $handle; # but cant re-set existing STDOUT + $walkHandle = $tmp; # so use my $tmp as intermediate var + return $walkHandle; + } + my $iotype = ref $handle; + die "expecting argument/object that can print\n" + unless $iotype eq 'GLOB' or $iotype and $handle->can('print'); + $walkHandle = $handle; +} + +sub concise_subref { + my($order, $coderef, $name) = @_; + my $codeobj = svref_2object($coderef); + + return concise_stashref(@_) + unless ref($codeobj) =~ '^B::(?:CV|FM)\z'; + concise_cv_obj($order, $codeobj, $name); +} + +sub concise_stashref { + my($order, $h) = @_; + my $name = svref_2object($h)->NAME; + foreach my $k (sort keys %$h) { + next unless defined $h->{$k}; + my $coderef = ref $h->{$k} eq 'CODE' ? $h->{$k} + : ref\$h->{$k} eq 'GLOB' ? *{$h->{$k}}{CODE} || next + : next; + reset_sequence(); + print "FUNC: *", $name, "::", $k, "\n"; + my $codeobj = svref_2object($coderef); + next unless ref $codeobj eq 'B::CV'; + eval { concise_cv_obj($order, $codeobj, $k) }; + warn "err $@ on $codeobj" if $@; + } +} + +# This should have been called concise_subref, but it was exported +# under this name in versions before 0.56 +*concise_cv = \&concise_subref; + +sub concise_cv_obj { + my ($order, $cv, $name) = @_; + # name is either a string, or a CODE ref (copy of $cv arg??) + + $curcv = $cv; + + if (ref($cv->XSUBANY) =~ /B::(\w+)/) { + print $walkHandle "$name is a constant sub, optimized to a $1\n"; + return; + } + if ($cv->XSUB) { + print $walkHandle "$name is XS code\n"; + return; + } + if (class($cv->START) eq "NULL") { + no strict 'refs'; + if (ref $name eq 'CODE') { + print $walkHandle "coderef $name has no START\n"; + } + elsif (exists &$name) { + print $walkHandle "$name exists in stash, but has no START\n"; + } + else { + print $walkHandle "$name not in symbol table\n"; + } + return; + } + sequence($cv->START); + if ($order eq "exec") { + walk_exec($cv->START); + } + elsif ($order eq "basic") { + # walk_topdown($cv->ROOT, sub { $_[0]->concise($_[1]) }, 0); + my $root = $cv->ROOT; + unless (ref $root eq 'B::NULL') { + walk_topdown($root, sub { $_[0]->concise($_[1]) }, 0); + } else { + print $walkHandle "B::NULL encountered doing ROOT on $cv. avoiding disaster\n"; + } + } else { + print $walkHandle tree($cv->ROOT, 0); + } +} + +sub concise_main { + my($order) = @_; + sequence(main_start); + $curcv = main_cv; + if ($order eq "exec") { + return if class(main_start) eq "NULL"; + walk_exec(main_start); + } elsif ($order eq "tree") { + return if class(main_root) eq "NULL"; + print $walkHandle tree(main_root, 0); + } elsif ($order eq "basic") { + return if class(main_root) eq "NULL"; + walk_topdown(main_root, + sub { $_[0]->concise($_[1]) }, 0); + } +} + +sub concise_specials { + my($name, $order, @cv_s) = @_; + my $i = 1; + if ($name eq "BEGIN") { + splice(@cv_s, 0, 8); # skip 7 BEGIN blocks in this file. NOW 8 ?? + } elsif ($name eq "CHECK") { + pop @cv_s; # skip the CHECK block that calls us + } + for my $cv (@cv_s) { + print $walkHandle "$name $i:\n"; + $i++; + concise_cv_obj($order, $cv, $name); + } +} + +my $start_sym = "\e(0"; # "\cN" sometimes also works +my $end_sym = "\e(B"; # "\cO" respectively + +my @tree_decorations = + ([" ", "--", "+-", "|-", "| ", "`-", "-", 1], + [" ", "-", "+", "+", "|", "`", "", 0], + [" ", map("$start_sym$_$end_sym", "qq", "wq", "tq", "x ", "mq", "q"), 1], + [" ", map("$start_sym$_$end_sym", "q", "w", "t", "x", "m"), "", 0], + ); + +my @render_packs; # collect -stash=<packages> + +sub compileOpts { + # set rendering state from options and args + my (@options,@args); + if (@_) { + @options = grep(/^-/, @_); + @args = grep(!/^-/, @_); + } + for my $o (@options) { + # mode/order + if ($o eq "-basic") { + $order = "basic"; + } elsif ($o eq "-exec") { + $order = "exec"; + } elsif ($o eq "-tree") { + $order = "tree"; + } + # tree-specific + elsif ($o eq "-compact") { + $tree_style |= 1; + } elsif ($o eq "-loose") { + $tree_style &= ~1; + } elsif ($o eq "-vt") { + $tree_style |= 2; + } elsif ($o eq "-ascii") { + $tree_style &= ~2; + } + # sequence numbering + elsif ($o =~ /^-base(\d+)$/) { + $base = $1; + } elsif ($o eq "-bigendian") { + $big_endian = 1; + } elsif ($o eq "-littleendian") { + $big_endian = 0; + } + # miscellaneous, presentation + elsif ($o eq "-nobanner") { + $banner = 0; + } elsif ($o eq "-banner") { + $banner = 1; + } + elsif ($o eq "-main") { + $do_main = 1; + } elsif ($o eq "-nomain") { + $do_main = 0; + } elsif ($o eq "-src") { + $show_src = 1; + } + elsif ($o =~ /^-stash=(.*)/) { + my $pkg = $1; + no strict 'refs'; + if (! %{$pkg.'::'}) { + eval "require $pkg"; + } else { + require Config; + if (!$Config::Config{usedl} + && keys %{$pkg.'::'} == 1 + && $pkg->can('bootstrap')) { + # It is something that we're statically linked to, but hasn't + # yet been used. + eval "require $pkg"; + } + } + push @render_packs, $pkg; + } + # line-style options + elsif (exists $style{substr($o, 1)}) { + $stylename = substr($o, 1); + set_style_standard($stylename); + } else { + warn "Option $o unrecognized"; + } + } + return (@args); +} + +sub compile { + my (@args) = compileOpts(@_); + return sub { + my @newargs = compileOpts(@_); # accept new rendering options + warn "disregarding non-options: @newargs\n" if @newargs; + + for my $objname (@args) { + next unless $objname; # skip null args to avoid noisy responses + + if ($objname eq "BEGIN") { + concise_specials("BEGIN", $order, + B::begin_av->isa("B::AV") ? + B::begin_av->ARRAY : ()); + } elsif ($objname eq "INIT") { + concise_specials("INIT", $order, + B::init_av->isa("B::AV") ? + B::init_av->ARRAY : ()); + } elsif ($objname eq "CHECK") { + concise_specials("CHECK", $order, + B::check_av->isa("B::AV") ? + B::check_av->ARRAY : ()); + } elsif ($objname eq "UNITCHECK") { + concise_specials("UNITCHECK", $order, + B::unitcheck_av->isa("B::AV") ? + B::unitcheck_av->ARRAY : ()); + } elsif ($objname eq "END") { + concise_specials("END", $order, + B::end_av->isa("B::AV") ? + B::end_av->ARRAY : ()); + } + else { + # convert function names to subrefs + if (ref $objname) { + print $walkHandle "B::Concise::compile($objname)\n" + if $banner; + concise_subref($order, ($objname)x2); + next; + } else { + $objname = "main::" . $objname unless $objname =~ /::/; + no strict 'refs'; + my $glob = \*$objname; + unless (*$glob{CODE} || *$glob{FORMAT}) { + print $walkHandle "$objname:\n" if $banner; + print $walkHandle "err: unknown function ($objname)\n"; + return; + } + if (my $objref = *$glob{CODE}) { + print $walkHandle "$objname:\n" if $banner; + concise_subref($order, $objref, $objname); + } + if (my $objref = *$glob{FORMAT}) { + print $walkHandle "$objname (FORMAT):\n" + if $banner; + concise_subref($order, $objref, $objname); + } + } + } + } + for my $pkg (@render_packs) { + no strict 'refs'; + concise_stashref($order, \%{$pkg.'::'}); + } + + if (!@args or $do_main or @render_packs) { + print $walkHandle "main program:\n" if $do_main; + concise_main($order); + } + return @args; # something + } +} + +my %labels; +my $lastnext; # remembers op-chain, used to insert gotos + +my %opclass = ('OP' => "0", 'UNOP' => "1", 'BINOP' => "2", 'LOGOP' => "|", + 'LISTOP' => "@", 'PMOP' => "/", 'SVOP' => "\$", 'GVOP' => "*", + 'PVOP' => '"', 'LOOP' => "{", 'COP' => ";", 'PADOP' => "#", + 'METHOP' => '.', UNOP_AUX => '+'); + +no warnings 'qw'; # "Possible attempt to put comments..."; use #7 +my @linenoise = + qw'# () sc ( @? 1 $* gv *{ m$ m@ m% m? p/ *$ $ $# & a& pt \\ s\\ rf bl + ` *? <> ?? ?/ r/ c/ // qr s/ /c y/ = @= C sC Cp sp df un BM po +1 +I + -1 -I 1+ I+ 1- I- ** * i* / i/ %$ i% x + i+ - i- . " << >> < i< + > i> <= i, >= i. == i= != i! <? i? s< s> s, s. s= s! s? b& b^ b| -0 -i + ! ~ a2 si cs rd sr e^ lg sq in %x %o ab le ss ve ix ri sf FL od ch cy + uf lf uc lc qm @ [f [ @[ eh vl ky dl ex % ${ @{ uk pk st jn ) )[ a@ + a% sl +] -] [- [+ so rv GS GW MS MW .. f. .f && || ^^ ?: &= |= -> s{ s} + v} ca wa di rs ;; ; ;d }{ { } {} f{ it {l l} rt }l }n }r dm }g }e ^o + ^c ^| ^# um bm t~ u~ ~d DB db ^s se ^g ^r {w }w pf pr ^O ^K ^R ^W ^d ^v + ^e ^t ^k t. fc ic fl .s .p .b .c .l .a .h g1 s1 g2 s2 ?. l? -R -W -X -r + -w -x -e -o -O -z -s -M -A -C -S -c -b -f -d -p -l -u -g -k -t -T -B cd + co cr u. cm ut r. l@ s@ r@ mD uD oD rD tD sD wD cD f$ w$ p$ sh e$ k$ g3 + g4 s4 g5 s5 T@ C@ L@ G@ A@ S@ Hg Hc Hr Hw Mg Mc Ms Mr Sg Sc So rq do {e + e} {t t} g6 G6 6e g7 G7 7e g8 G8 8e g9 G9 9e 6s 7s 8s 9s 6E 7E 8E 9E Pn + Pu GP SP EP Gn Gg GG SG EG g0 c$ lk t$ ;s n> // /= CO'; + +my $chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +sub op_flags { # common flags (see BASOP.op_flags in op.h) + my($x) = @_; + my(@v); + push @v, "v" if ($x & 3) == 1; + push @v, "s" if ($x & 3) == 2; + push @v, "l" if ($x & 3) == 3; + push @v, "K" if $x & 4; + push @v, "P" if $x & 8; + push @v, "R" if $x & 16; + push @v, "M" if $x & 32; + push @v, "S" if $x & 64; + push @v, "*" if $x & 128; + return join("", @v); +} + +sub base_n { + my $x = shift; + return "-" . base_n(-$x) if $x < 0; + my $str = ""; + do { $str .= substr($chars, $x % $base, 1) } while $x = int($x / $base); + $str = reverse $str if $big_endian; + return $str; +} + +my %sequence_num; +my $seq_max = 1; + +sub reset_sequence { + # reset the sequence + %sequence_num = (); + $seq_max = 1; + $lastnext = 0; +} + +sub seq { + my($op) = @_; + return "-" if not exists $sequence_num{$$op}; + return base_n($sequence_num{$$op}); +} + +sub walk_topdown { + my($op, $sub, $level) = @_; + $sub->($op, $level); + if ($op->flags & OPf_KIDS) { + for (my $kid = $op->first; $$kid; $kid = $kid->sibling) { + walk_topdown($kid, $sub, $level + 1); + } + } + if (class($op) eq "PMOP") { + my $maybe_root = $op->code_list; + if ( ref($maybe_root) and $maybe_root->isa("B::OP") + and not $op->flags & OPf_KIDS) { + walk_topdown($maybe_root, $sub, $level + 1); + } + $maybe_root = $op->pmreplroot; + if (ref($maybe_root) and $maybe_root->isa("B::OP")) { + # It really is the root of the replacement, not something + # else stored here for lack of space elsewhere + walk_topdown($maybe_root, $sub, $level + 1); + } + } +} + +sub walklines { + my($ar, $level) = @_; + for my $l (@$ar) { + if (ref($l) eq "ARRAY") { + walklines($l, $level + 1); + } else { + $l->concise($level); + } + } +} + +sub walk_exec { + my($top, $level) = @_; + my %opsseen; + my @lines; + my @todo = ([$top, \@lines]); + while (@todo and my($op, $targ) = @{shift @todo}) { + for (; $$op; $op = $op->next) { + last if $opsseen{$$op}++; + push @$targ, $op; + my $name = $op->name; + if (class($op) eq "LOGOP") { + my $ar = []; + push @$targ, $ar; + push @todo, [$op->other, $ar]; + } elsif ($name eq "subst" and $ {$op->pmreplstart}) { + my $ar = []; + push @$targ, $ar; + push @todo, [$op->pmreplstart, $ar]; + } elsif ($name =~ /^enter(loop|iter)$/) { + $labels{${$op->nextop}} = "NEXT"; + $labels{${$op->lastop}} = "LAST"; + $labels{${$op->redoop}} = "REDO"; + } + } + } + walklines(\@lines, 0); +} + +# The structure of this routine is purposely modeled after op.c's peep() +sub sequence { + my($op) = @_; + my $oldop = 0; + return if class($op) eq "NULL" or exists $sequence_num{$$op}; + for (; $$op; $op = $op->next) { + last if exists $sequence_num{$$op}; + my $name = $op->name; + $sequence_num{$$op} = $seq_max++; + if (class($op) eq "LOGOP") { + sequence($op->other); + } elsif (class($op) eq "LOOP") { + sequence($op->redoop); + sequence( $op->nextop); + sequence($op->lastop); + } elsif ($name eq "subst" and $ {$op->pmreplstart}) { + sequence($op->pmreplstart); + } + $oldop = $op; + } +} + +sub fmt_line { # generate text-line for op. + my($hr, $op, $text, $level) = @_; + + $_->($hr, $op, \$text, \$level, $stylename) for @callbacks; + + return '' if $hr->{SKIP}; # suppress line if a callback said so + return '' if $hr->{goto} and $hr->{goto} eq '-'; # no goto nowhere + + # spec: (?(text1#varText2)?) + $text =~ s/\(\?\(([^\#]*?)\#(\w+)([^\#]*?)\)\?\)/ + $hr->{$2} ? $1.$hr->{$2}.$3 : ""/eg; + + # spec: (x(exec_text;basic_text)x) + $text =~ s/\(x\((.*?);(.*?)\)x\)/$order eq "exec" ? $1 : $2/egs; + + # spec: (*(text)*) + $text =~ s/\(\*\(([^;]*?)\)\*\)/$1 x $level/egs; + + # spec: (*(text1;text2)*) + $text =~ s/\(\*\((.*?);(.*?)\)\*\)/$1 x ($level - 1) . $2 x ($level>0)/egs; + + # convert #Var to tag=>val form: Var\t#var + $text =~ s/\#([A-Z][a-z]+)(\d+)?/\t\u$1\t\L#$1$2/gs; + + # spec: #varN + $text =~ s/\#([a-zA-Z]+)(\d+)/sprintf("%-$2s", $hr->{$1})/eg; + + $text =~ s/\#([a-zA-Z]+)/$hr->{$1}/eg; # populate #var's + $text =~ s/[ \t]*~+[ \t]*/ /g; # squeeze tildes + + $text = "# $hr->{src}\n$text" if $show_src and $hr->{src}; + + chomp $text; + return "$text\n" if $text ne "" and $order ne "tree"; + return $text; # suppress empty lines +} + + + +# use require rather than use here to avoid disturbing tests that dump +# BEGIN blocks +require B::Op_private; + + + +our %hints; # used to display each COP's op_hints values + +# strict refs, subs, vars +@hints{0x2,0x200,0x400,0x20,0x40,0x80} = ('$', '&', '*', 'x$', 'x&', 'x*'); +# integers, locale, bytes +@hints{0x1,0x4,0x8,0x10} = ('i', 'l', 'b'); +# block scope, localise %^H, $^OPEN (in), $^OPEN (out) +@hints{0x100,0x20000,0x40000,0x80000} = ('{','%','<','>'); +# overload new integer, float, binary, string, re +@hints{0x1000,0x2000,0x4000,0x8000,0x10000} = ('I', 'F', 'B', 'S', 'R'); +# taint and eval +@hints{0x100000,0x200000} = ('T', 'E'); +# filetest access, use utf8, unicode_strings feature +@hints{0x400000,0x800000,0x800} = ('X', 'U', 'us'); + +# pick up the feature hints constants. +# Note that we're relying on non-API parts of feature.pm, +# but its less naughty than just blindly copying those constants into +# this src file. +# +require feature; + +sub hints_flags { + my($x) = @_; + my @s; + for my $flag (sort {$b <=> $a} keys %hints) { + if ($hints{$flag} and $x & $flag and $x >= $flag) { + $x -= $flag; + push @s, $hints{$flag}; + } + } + if ($x & $feature::hint_mask) { + push @s, "fea=" . (($x & $feature::hint_mask) >> $feature::hint_shift); + $x &= ~$feature::hint_mask; + } + push @s, sprintf "0x%x", $x if $x; + return join(",", @s); +} + + +# return a string like 'LVINTRO,1' for the op $name with op_private +# value $x + +sub private_flags { + my($name, $x) = @_; + my $entry = $B::Op_private::bits{$name}; + return $x ? "$x" : '' unless $entry; + + my @flags; + my $bit; + for ($bit = 7; $bit >= 0; $bit--) { + next unless exists $entry->{$bit}; + my $e = $entry->{$bit}; + if (ref($e) eq 'HASH') { + # bit field + + my ($bitmin, $bitmax, $bitmask, $enum, $label) = + @{$e}{qw(bitmin bitmax bitmask enum label)}; + $bit = $bitmin; + next if defined $label && $label eq '-'; # display as raw number + + my $val = $x & $bitmask; + $x &= ~$bitmask; + $val >>= $bitmin; + + if (defined $enum) { + # try to convert numeric $val into symbolic + my @enum = @$enum; + while (@enum) { + my $ix = shift @enum; + my $name = shift @enum; + my $label = shift @enum; + if ($val == $ix) { + $val = $label; + last; + } + } + } + next if $val eq '0'; # don't display anonymous zero values + push @flags, defined $label ? "$label=$val" : $val; + + } + else { + # flag bit + my $label = $B::Op_private::labels{$e}; + next if defined $label && $label eq '-'; # display as raw number + if ($x & (1<<$bit)) { + $x -= (1<<$bit); + push @flags, $label; + } + } + } + + push @flags, $x if $x; # display unknown bits numerically + return join ",", @flags; +} + +sub concise_sv { + my($sv, $hr, $preferpv) = @_; + $hr->{svclass} = class($sv); + $hr->{svclass} = "UV" + if $hr->{svclass} eq "IV" and $sv->FLAGS & SVf_IVisUV; + Carp::cluck("bad concise_sv: $sv") unless $sv and $$sv; + $hr->{svaddr} = sprintf("%#x", $$sv); + if ($hr->{svclass} eq "GV" && $sv->isGV_with_GP()) { + my $gv = $sv; + my $stash = $gv->STASH; + if (class($stash) eq "SPECIAL") { + $stash = "<none>"; + } + else { + $stash = $stash->NAME; + } + if ($stash eq "main") { + $stash = ""; + } else { + $stash = $stash . "::"; + } + $hr->{svval} = "*$stash" . $gv->SAFENAME; + return "*$stash" . $gv->SAFENAME; + } else { + while (class($sv) eq "IV" && $sv->FLAGS & SVf_ROK) { + $hr->{svval} .= "\\"; + $sv = $sv->RV; + } + if (class($sv) eq "SPECIAL") { + $hr->{svval} .= ["Null", "sv_undef", "sv_yes", "sv_no", + '', '', '', "sv_zero"]->[$$sv]; + } elsif ($preferpv + && ($sv->FLAGS & SVf_POK)) { + $hr->{svval} .= cstring($sv->PV); + } elsif ($sv->FLAGS & SVf_NOK) { + $hr->{svval} .= $sv->NV; + } elsif ($sv->FLAGS & SVf_IOK) { + $hr->{svval} .= $sv->int_value; + } elsif ($sv->FLAGS & SVf_POK) { + $hr->{svval} .= cstring($sv->PV); + } elsif (class($sv) eq "HV") { + $hr->{svval} .= 'HASH'; + } elsif (class($sv) eq "AV") { + $hr->{svval} .= 'ARRAY'; + } elsif (class($sv) eq "CV") { + if ($sv->CvFLAGS & CVf_ANON) { + $hr->{svval} .= 'CODE'; + } elsif ($sv->CvFLAGS & CVf_NAMED) { + $hr->{svval} .= "&"; + unless ($sv->CvFLAGS & CVf_LEXICAL) { + my $stash = $sv->STASH; + unless (class($stash) eq "SPECIAL") { + $hr->{svval} .= $stash->NAME . "::"; + } + } + $hr->{svval} .= $sv->NAME_HEK; + } else { + $hr->{svval} .= "&"; + $sv = $sv->GV; + my $stash = $sv->STASH; + unless (class($stash) eq "SPECIAL") { + $hr->{svval} .= $stash->NAME . "::"; + } + $hr->{svval} .= $sv->SAFENAME; + } + } + + $hr->{svval} = 'undef' unless defined $hr->{svval}; + my $out = $hr->{svclass}; + return $out .= " $hr->{svval}" ; + } +} + +my %srclines; + +sub fill_srclines { + my $fullnm = shift; + if ($fullnm eq '-e') { + $srclines{$fullnm} = [ $fullnm, "-src not supported for -e" ]; + return; + } + open (my $fh, '<', $fullnm) + or warn "# $fullnm: $!, (chdirs not supported by this feature yet)\n" + and return; + my @l = <$fh>; + chomp @l; + unshift @l, $fullnm; # like @{_<$fullnm} in debug, array starts at 1 + $srclines{$fullnm} = \@l; +} + +# Given a pad target, return the pad var's name and cop range / +# fakeness, or failing that, its target number. +# e.g. +# ('$i', '$i:5,7') +# or +# ('$i', '$i:fake:a') +# or +# ('t5', 't5') + +sub padname { + my ($targ) = @_; + + my ($targarg, $targarglife); + my $padname = (($curcv->PADLIST->ARRAY)[0]->ARRAY)[$targ]; + if (defined $padname and class($padname) ne "SPECIAL" and + $padname->LEN) + { + $targarg = $padname->PVX; + if ($padname->FLAGS & SVf_FAKE) { + # These changes relate to the jumbo closure fix. + # See changes 19939 and 20005 + my $fake = ''; + $fake .= 'a' + if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_ANON; + $fake .= 'm' + if $padname->PARENT_FAKELEX_FLAGS & PAD_FAKELEX_MULTI; + $fake .= ':' . $padname->PARENT_PAD_INDEX + if $curcv->CvFLAGS & CVf_ANON; + $targarglife = "$targarg:FAKE:$fake"; + } + else { + my $intro = $padname->COP_SEQ_RANGE_LOW - $cop_seq_base; + my $finish = int($padname->COP_SEQ_RANGE_HIGH) - $cop_seq_base; + $finish = "end" if $finish == 999999999 - $cop_seq_base; + $targarglife = "$targarg:$intro,$finish"; + } + } else { + $targarglife = $targarg = "t" . $targ; + } + return $targarg, $targarglife; +} + + + +sub concise_op { + my ($op, $level, $format) = @_; + my %h; + $h{exname} = $h{name} = $op->name; + $h{NAME} = uc $h{name}; + $h{class} = class($op); + $h{extarg} = $h{targ} = $op->targ; + $h{extarg} = "" unless $h{extarg}; + $h{privval} = $op->private; + # for null ops, targ holds the old type + my $origname = $h{name} eq "null" && $h{targ} + ? substr(ppname($h{targ}), 3) + : $h{name}; + $h{private} = private_flags($origname, $op->private); + if ($op->folded) { + $h{private} &&= "$h{private},"; + $h{private} .= "FOLD"; + } + + if ($h{name} ne $origname) { # a null op + $h{exname} = "ex-$origname"; + $h{extarg} = ""; + } elsif ($h{private} =~ /\bREFC\b/) { + # targ holds a reference count + my $refs = "ref" . ($h{targ} != 1 ? "s" : ""); + $h{targarglife} = $h{targarg} = "$h{targ} $refs"; + } elsif ($h{targ}) { + my $count = $h{name} eq 'padrange' + ? ($op->private & $B::Op_private::defines{'OPpPADRANGE_COUNTMASK'}) + : 1; + my (@targarg, @targarglife); + for my $i (0..$count-1) { + my ($targarg, $targarglife) = padname($h{targ} + $i); + push @targarg, $targarg; + push @targarglife, $targarglife; + } + $h{targarg} = join '; ', @targarg; + $h{targarglife} = join '; ', @targarglife; + } + + $h{arg} = ""; + $h{svclass} = $h{svaddr} = $h{svval} = ""; + if ($h{class} eq "PMOP") { + my $extra = ''; + my $precomp = $op->precomp; + if (defined $precomp) { + $precomp = cstring($precomp); # Escape literal control sequences + $precomp = "/$precomp/"; + } else { + $precomp = ""; + } + if ($op->name eq 'subst') { + if (class($op->pmreplstart) ne "NULL") { + undef $lastnext; + $extra = " replstart->" . seq($op->pmreplstart); + } + } + elsif ($op->name eq 'split') { + if ( ($op->private & OPpSPLIT_ASSIGN) # @array = split + && (not $op->flags & OPf_STACKED)) # @{expr} = split + { + # with C<@array = split(/pat/, str);>, + # array is stored in /pat/'s pmreplroot; either + # as an integer index into the pad (for a lexical array) + # or as GV for a package array (which will be a pad index + # on threaded builds) + + if ($op->private & $B::Op_private::defines{'OPpSPLIT_LEX'}) { + my $off = $op->pmreplroot; # union with op_pmtargetoff + my ($name, $full) = padname($off); + $extra = " => $full"; + } + else { + # union with op_pmtargetoff, op_pmtargetgv + my $gv = $op->pmreplroot; + if (!ref($gv)) { + # the value is actually a pad offset + $gv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$gv]->NAME; + } + else { + # unthreaded: its a GV + $gv = $gv->NAME; + } + $extra = " => \@$gv"; + } + } + } + $h{arg} = "($precomp$extra)"; + } elsif ($h{class} eq "PVOP" and $h{name} !~ '^transr?\z') { + $h{arg} = '("' . $op->pv . '")'; + $h{svval} = '"' . $op->pv . '"'; + } elsif ($h{class} eq "COP") { + my $label = $op->label; + $h{coplabel} = $label; + $label = $label ? "$label: " : ""; + my $loc = $op->file; + my $pathnm = $loc; + $loc =~ s[.*/][]; + my $ln = $op->line; + $loc .= ":$ln"; + my($stash, $cseq) = ($op->stash->NAME, $op->cop_seq - $cop_seq_base); + $h{arg} = "($label$stash $cseq $loc)"; + if ($show_src) { + fill_srclines($pathnm) unless exists $srclines{$pathnm}; + my $line = $srclines{$pathnm}[$ln] // "-src unavailable under -e"; + $h{src} = "$ln: $line"; + } + } elsif ($h{class} eq "LOOP") { + $h{arg} = "(next->" . seq($op->nextop) . " last->" . seq($op->lastop) + . " redo->" . seq($op->redoop) . ")"; + } elsif ($h{class} eq "LOGOP") { + undef $lastnext; + $h{arg} = "(other->" . seq($op->other) . ")"; + $h{otheraddr} = sprintf("%#x", $ {$op->other}); + if ($h{name} eq "argdefelem") { + # targ used for element index + $h{targarglife} = $h{targarg} = ""; + $h{arg} .= "[" . $op->targ . "]"; + } + } + elsif ($h{class} eq "SVOP" or $h{class} eq "PADOP") { + unless ($h{name} eq 'aelemfast' and $op->flags & OPf_SPECIAL) { + my $idx = ($h{class} eq "SVOP") ? $op->targ : $op->padix; + if ($h{class} eq "PADOP" or !${$op->sv}) { + my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$idx]; + $h{arg} = "[" . concise_sv($sv, \%h, 0) . "]"; + $h{targarglife} = $h{targarg} = ""; + } else { + $h{arg} = "(" . concise_sv($op->sv, \%h, 0) . ")"; + } + } + } + elsif ($h{class} eq "METHOP") { + my $prefix = ''; + if ($h{name} eq 'method_redir' or $h{name} eq 'method_redir_super') { + my $rclass_sv = $op->rclass; + $rclass_sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$rclass_sv] + unless ref $rclass_sv; + $prefix .= 'PACKAGE "'.$rclass_sv->PV.'", '; + } + if ($h{name} ne "method") { + if (${$op->meth_sv}) { + $h{arg} = "($prefix" . concise_sv($op->meth_sv, \%h, 1) . ")"; + } else { + my $sv = (($curcv->PADLIST->ARRAY)[1]->ARRAY)[$op->targ]; + $h{arg} = "[$prefix" . concise_sv($sv, \%h, 1) . "]"; + $h{targarglife} = $h{targarg} = ""; + } + } + } + elsif ($h{class} eq "UNOP_AUX") { + $h{arg} = "(" . $op->string($curcv) . ")"; + } + + $h{seq} = $h{hyphseq} = seq($op); + $h{seq} = "" if $h{seq} eq "-"; + $h{opt} = $op->opt; + $h{label} = $labels{$$op}; + $h{next} = $op->next; + $h{next} = (class($h{next}) eq "NULL") ? "(end)" : seq($h{next}); + $h{nextaddr} = sprintf("%#x", $ {$op->next}); + $h{sibaddr} = sprintf("%#x", $ {$op->sibling}); + $h{firstaddr} = sprintf("%#x", $ {$op->first}) if $op->can("first"); + $h{lastaddr} = sprintf("%#x", $ {$op->last}) if $op->can("last"); + + $h{classsym} = $opclass{$h{class}}; + $h{flagval} = $op->flags; + $h{flags} = op_flags($op->flags); + if ($op->can("hints")) { + $h{hintsval} = $op->hints; + $h{hints} = hints_flags($h{hintsval}); + } else { + $h{hintsval} = $h{hints} = ''; + } + $h{addr} = sprintf("%#x", $$op); + $h{typenum} = $op->type; + $h{noise} = $linenoise[$op->type]; + + return fmt_line(\%h, $op, $format, $level); +} + +sub B::OP::concise { + my($op, $level) = @_; + if ($order eq "exec" and $lastnext and $$lastnext != $$op) { + # insert a 'goto' line + my $synth = {"seq" => seq($lastnext), "class" => class($lastnext), + "addr" => sprintf("%#x", $$lastnext), + "goto" => seq($lastnext), # simplify goto '-' removal + }; + print $walkHandle fmt_line($synth, $op, $gotofmt, $level+1); + } + $lastnext = $op->next; + print $walkHandle concise_op($op, $level, $format); +} + +# B::OP::terse (see Terse.pm) now just calls this +sub b_terse { + my($op, $level) = @_; + + # This isn't necessarily right, but there's no easy way to get + # from an OP to the right CV. This is a limitation of the + # ->terse() interface style, and there isn't much to do about + # it. In particular, we can die in concise_op if the main pad + # isn't long enough, or has the wrong kind of entries, compared to + # the pad a sub was compiled with. The fix for that would be to + # make a backwards compatible "terse" format that never even + # looked at the pad, just like the old B::Terse. I don't think + # that's worth the effort, though. + $curcv = main_cv unless $curcv; + + if ($order eq "exec" and $lastnext and $$lastnext != $$op) { + # insert a 'goto' + my $h = {"seq" => seq($lastnext), "class" => class($lastnext), + "addr" => sprintf("%#x", $$lastnext)}; + print # $walkHandle + fmt_line($h, $op, $style{"terse"}[1], $level+1); + } + $lastnext = $op->next; + print # $walkHandle + concise_op($op, $level, $style{"terse"}[0]); +} + +sub tree { + my $op = shift; + my $level = shift; + my $style = $tree_decorations[$tree_style]; + my($space, $single, $kids, $kid, $nokid, $last, $lead, $size) = @$style; + my $name = concise_op($op, $level, $treefmt); + if (not $op->flags & OPf_KIDS) { + return $name . "\n"; + } + my @lines; + for (my $kid = $op->first; $$kid; $kid = $kid->sibling) { + push @lines, tree($kid, $level+1); + } + my $i; + for ($i = $#lines; substr($lines[$i], 0, 1) eq " "; $i--) { + $lines[$i] = $space . $lines[$i]; + } + if ($i > 0) { + $lines[$i] = $last . $lines[$i]; + while ($i-- > 1) { + if (substr($lines[$i], 0, 1) eq " ") { + $lines[$i] = $nokid . $lines[$i]; + } else { + $lines[$i] = $kid . $lines[$i]; + } + } + $lines[$i] = $kids . $lines[$i]; + } else { + $lines[0] = $single . $lines[0]; + } + return("$name$lead" . shift @lines, + map(" " x (length($name)+$size) . $_, @lines)); +} + +# *** Warning: fragile kludge ahead *** +# Because the B::* modules run in the same interpreter as the code +# they're compiling, their presence tends to distort the view we have of +# the code we're looking at. In particular, perl gives sequence numbers +# to COPs. If the program we're looking at were run on its own, this +# would start at 1. Because all of B::Concise and all the modules it +# uses are compiled first, though, by the time we get to the user's +# program the sequence number is already pretty high, which could be +# distracting if you're trying to tell OPs apart. Therefore we'd like to +# subtract an offset from all the sequence numbers we display, to +# restore the simpler view of the world. The trick is to know what that +# offset will be, when we're still compiling B::Concise! If we +# hardcoded a value, it would have to change every time B::Concise or +# other modules we use do. To help a little, what we do here is compile +# a little code at the end of the module, and compute the base sequence +# number for the user's program as being a small offset later, so all we +# have to worry about are changes in the offset. + +# When you say "perl -MO=Concise -e '$a'", the output should look like: + +# 4 <@> leave[t1] vKP/REFC ->(end) +# 1 <0> enter ->2 + #^ smallest OP sequence number should be 1 +# 2 <;> nextstate(main 1 -e:1) v ->3 + # ^ smallest COP sequence number should be 1 +# - <1> ex-rv2sv vK/1 ->4 +# 3 <$> gvsv(*a) s ->4 + +# If the second of the marked numbers there isn't 1, it means you need +# to update the corresponding magic number in the next line. +# Remember, this needs to stay the last things in the module. + +my $cop_seq_mnum = 12; +$cop_seq_base = svref_2object(eval 'sub{0;}')->START->cop_seq + $cop_seq_mnum; + +1; + +__END__ + +package Time::HiRes; + +{ use 5.006; } +use strict; + +require Exporter; +use XSLoader (); + +our @ISA = qw(Exporter); + +our @EXPORT = qw( ); +# More or less this same list is in Makefile.PL. Should unify. +our @EXPORT_OK = qw (usleep sleep ualarm alarm gettimeofday time tv_interval + getitimer setitimer nanosleep clock_gettime clock_getres + clock clock_nanosleep + CLOCKS_PER_SEC + CLOCK_BOOTTIME + CLOCK_HIGHRES + CLOCK_MONOTONIC + CLOCK_MONOTONIC_COARSE + CLOCK_MONOTONIC_FAST + CLOCK_MONOTONIC_PRECISE + CLOCK_MONOTONIC_RAW + CLOCK_PROCESS_CPUTIME_ID + CLOCK_PROF + CLOCK_REALTIME + CLOCK_REALTIME_COARSE + CLOCK_REALTIME_FAST + CLOCK_REALTIME_PRECISE + CLOCK_REALTIME_RAW + CLOCK_SECOND + CLOCK_SOFTTIME + CLOCK_THREAD_CPUTIME_ID + CLOCK_TIMEOFDAY + CLOCK_UPTIME + CLOCK_UPTIME_COARSE + CLOCK_UPTIME_FAST + CLOCK_UPTIME_PRECISE + CLOCK_UPTIME_RAW + CLOCK_VIRTUAL + ITIMER_PROF + ITIMER_REAL + ITIMER_REALPROF + ITIMER_VIRTUAL + TIMER_ABSTIME + d_usleep d_ualarm d_gettimeofday d_getitimer d_setitimer + d_nanosleep d_clock_gettime d_clock_getres + d_clock d_clock_nanosleep d_hires_stat + d_futimens d_utimensat d_hires_utime + stat lstat utime + ); + +our $VERSION = '1.9759'; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +our $AUTOLOAD; +sub AUTOLOAD { + my $constname; + ($constname = $AUTOLOAD) =~ s/.*:://; + # print "AUTOLOAD: constname = $constname ($AUTOLOAD)\n"; + die "&Time::HiRes::constant not defined" if $constname eq 'constant'; + my ($error, $val) = constant($constname); + # print "AUTOLOAD: error = $error, val = $val\n"; + if ($error) { + my (undef,$file,$line) = caller; + die "$error at $file line $line.\n"; + } + { + no strict 'refs'; + *$AUTOLOAD = sub { $val }; + } + goto &$AUTOLOAD; +} + +sub import { + my $this = shift; + for my $i (@_) { + if (($i eq 'clock_getres' && !&d_clock_getres) || + ($i eq 'clock_gettime' && !&d_clock_gettime) || + ($i eq 'clock_nanosleep' && !&d_clock_nanosleep) || + ($i eq 'clock' && !&d_clock) || + ($i eq 'nanosleep' && !&d_nanosleep) || + ($i eq 'usleep' && !&d_usleep) || + ($i eq 'utime' && !&d_hires_utime) || + ($i eq 'ualarm' && !&d_ualarm)) { + require Carp; + Carp::croak("Time::HiRes::$i(): unimplemented in this platform"); + } + } + Time::HiRes->export_to_level(1, $this, @_); +} + +XSLoader::load( 'Time::HiRes', $XS_VERSION ); + +# Preloaded methods go here. + +sub tv_interval { + # probably could have been done in C + my ($a, $b) = @_; + $b = [gettimeofday()] unless defined($b); + (${$b}[0] - ${$a}[0]) + ((${$b}[1] - ${$a}[1]) / 1_000_000); +} + +# Autoload methods go after =cut, and are processed by the autosplit program. + +1; +__END__ + +package Time::Seconds; +use strict; + +our $VERSION = '1.3204'; + +use Exporter 5.57 'import'; + +our @EXPORT = qw( + ONE_MINUTE + ONE_HOUR + ONE_DAY + ONE_WEEK + ONE_MONTH + ONE_YEAR + ONE_FINANCIAL_MONTH + LEAP_YEAR + NON_LEAP_YEAR +); + +our @EXPORT_OK = qw(cs_sec cs_mon); + +use constant { + ONE_MINUTE => 60, + ONE_HOUR => 3_600, + ONE_DAY => 86_400, + ONE_WEEK => 604_800, + ONE_MONTH => 2_629_744, # ONE_YEAR / 12 + ONE_YEAR => 31_556_930, # 365.24225 days + ONE_FINANCIAL_MONTH => 2_592_000, # 30 days + LEAP_YEAR => 31_622_400, # 366 * ONE_DAY + NON_LEAP_YEAR => 31_536_000, # 365 * ONE_DAY + # hacks to make Time::Piece compile once again + cs_sec => 0, + cs_mon => 1, +}; + +use overload + 'fallback' => 'undef', + '0+' => \&seconds, + '""' => \&seconds, + '<=>' => \&compare, + '+' => \&add, + '-' => \&subtract, + '-=' => \&subtract_from, + '+=' => \&add_to, + '=' => \© + +sub new { + my $class = shift; + my ($val) = @_; + $val = 0 unless defined $val; + bless \$val, $class; +} + +sub _get_ovlvals { + my ($lhs, $rhs, $reverse) = @_; + $lhs = $lhs->seconds; + + if (UNIVERSAL::isa($rhs, 'Time::Seconds')) { + $rhs = $rhs->seconds; + } + elsif (ref($rhs)) { + die "Can't use non Seconds object in operator overload"; + } + + if ($reverse) { + return $rhs, $lhs; + } + + return $lhs, $rhs; +} + +sub compare { + my ($lhs, $rhs) = _get_ovlvals(@_); + return $lhs <=> $rhs; +} + +sub add { + my ($lhs, $rhs) = _get_ovlvals(@_); + return Time::Seconds->new($lhs + $rhs); +} + +sub add_to { + my $lhs = shift; + my $rhs = shift; + $rhs = $rhs->seconds if UNIVERSAL::isa($rhs, 'Time::Seconds'); + $$lhs += $rhs; + return $lhs; +} + +sub subtract { + my ($lhs, $rhs) = _get_ovlvals(@_); + return Time::Seconds->new($lhs - $rhs); +} + +sub subtract_from { + my $lhs = shift; + my $rhs = shift; + $rhs = $rhs->seconds if UNIVERSAL::isa($rhs, 'Time::Seconds'); + $$lhs -= $rhs; + return $lhs; +} + +sub copy { + Time::Seconds->new(${$_[0]}); +} + +sub seconds { + my $s = shift; + return $$s; +} + +sub minutes { + my $s = shift; + return $$s / 60; +} + +sub hours { + my $s = shift; + $s->minutes / 60; +} + +sub days { + my $s = shift; + $s->hours / 24; +} + +sub weeks { + my $s = shift; + $s->days / 7; +} + +sub months { + my $s = shift; + $s->days / 30.4368541; +} + +sub financial_months { + my $s = shift; + $s->days / 30; +} + +sub years { + my $s = shift; + $s->days / 365.24225; +} + +sub _counted_objects { + my ($n, $counted) = @_; + my $number = sprintf("%d", $n); # does a "floor" + $counted .= 's' if 1 != $number; + return ($number, $counted); +} + +sub pretty { + my $s = shift; + my $str = ""; + if ($s < 0) { + $s = -$s; + $str = "minus "; + } + if ($s >= ONE_MINUTE) { + if ($s >= ONE_HOUR) { + if ($s >= ONE_DAY) { + my ($days, $sd) = _counted_objects($s->days, "day"); + $str .= "$days $sd, "; + $s -= ($days * ONE_DAY); + } + my ($hours, $sh) = _counted_objects($s->hours, "hour"); + $str .= "$hours $sh, "; + $s -= ($hours * ONE_HOUR); + } + my ($mins, $sm) = _counted_objects($s->minutes, "minute"); + $str .= "$mins $sm, "; + $s -= ($mins * ONE_MINUTE); + } + $str .= join " ", _counted_objects($s->seconds, "second"); + return $str; +} + +1; +__END__ + +package Time::Piece; + +use strict; + +use XSLoader (); +use Time::Seconds; +use Carp; +use Time::Local; + +use Exporter (); + +our @EXPORT = qw( + localtime + gmtime +); + +our %EXPORT_TAGS = ( + ':override' => 'internal', + ); + +our $VERSION = '1.3204'; + +XSLoader::load( 'Time::Piece', $VERSION ); + +my $DATE_SEP = '-'; +my $TIME_SEP = ':'; +my @MON_LIST = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); +my @FULLMON_LIST = qw(January February March April May June July + August September October November December); +my @DAY_LIST = qw(Sun Mon Tue Wed Thu Fri Sat); +my @FULLDAY_LIST = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday); +my $IS_WIN32 = ($^O =~ /Win32/); + +my $LOCALE; + +use constant { + 'c_sec' => 0, + 'c_min' => 1, + 'c_hour' => 2, + 'c_mday' => 3, + 'c_mon' => 4, + 'c_year' => 5, + 'c_wday' => 6, + 'c_yday' => 7, + 'c_isdst' => 8, + 'c_epoch' => 9, + 'c_islocal' => 10, +}; + +sub localtime { + unshift @_, __PACKAGE__ unless eval { $_[0]->isa('Time::Piece') }; + my $class = shift; + my $time = shift; + $time = time if (!defined $time); + $class->_mktime($time, 1); +} + +sub gmtime { + unshift @_, __PACKAGE__ unless eval { $_[0]->isa('Time::Piece') }; + my $class = shift; + my $time = shift; + $time = time if (!defined $time); + $class->_mktime($time, 0); +} + +sub new { + my $class = shift; + my ($time) = @_; + + my $self; + + if (ref($time)) { + $self = $time->[c_islocal] ? $class->localtime($time) : $class->gmtime($time); + } + elsif (defined($time)) { + $self = $class->localtime($time); + } + elsif (ref($class) && $class->isa(__PACKAGE__)) { + $self = $class->_mktime($class->epoch, $class->[c_islocal]); + } + else { + $self = $class->localtime(); + } + + return bless $self, ref($class) || $class; +} + +sub parse { + my $proto = shift; + my $class = ref($proto) || $proto; + my @components; + + warnings::warnif("deprecated", + "parse() is deprecated, use strptime() instead."); + + if (@_ > 1) { + @components = @_; + } + else { + @components = shift =~ /(\d+)$DATE_SEP(\d+)$DATE_SEP(\d+)(?:(?:T|\s+)(\d+)$TIME_SEP(\d+)(?:$TIME_SEP(\d+)))/; + @components = reverse(@components[0..5]); + } + return $class->new( timelocal(@components )); +} + +sub _mktime { + my ($class, $time, $islocal) = @_; + + $class = eval { (ref $class) && (ref $class)->isa('Time::Piece') } + ? ref $class + : $class; + if (ref($time)) { + my @new_time = @$time; + my @tm_parts = (@new_time[c_sec .. c_mon], $new_time[c_year]+1900); + $new_time[c_epoch] = $islocal ? timelocal(@tm_parts) : timegm(@tm_parts); + + return wantarray ? @new_time : bless [@new_time[0..9], $islocal], $class; + } + _tzset(); + my @time = $islocal ? + CORE::localtime($time) + : + CORE::gmtime($time); + wantarray ? @time : bless [@time, $time, $islocal], $class; +} + +my %_special_exports = ( + localtime => sub { my $c = $_[0]; sub { $c->localtime(@_) } }, + gmtime => sub { my $c = $_[0]; sub { $c->gmtime(@_) } }, +); + +sub export { + my ($class, $to, @methods) = @_; + for my $method (@methods) { + if (exists $_special_exports{$method}) { + no strict 'refs'; + no warnings 'redefine'; + *{$to . "::$method"} = $_special_exports{$method}->($class); + } else { + $class->Exporter::export($to, $method); + } + } +} + +sub import { + # replace CORE::GLOBAL localtime and gmtime if passed :override + my $class = shift; + my %params; + map($params{$_}++,@_,@EXPORT); + if (delete $params{':override'}) { + $class->export('CORE::GLOBAL', keys %params); + } + else { + $class->export(scalar caller, keys %params); + } +} + +## Methods ## + +sub sec { + my $time = shift; + $time->[c_sec]; +} + +*second = \&sec; + +sub min { + my $time = shift; + $time->[c_min]; +} + +*minute = \&min; + +sub hour { + my $time = shift; + $time->[c_hour]; +} + +sub mday { + my $time = shift; + $time->[c_mday]; +} + +*day_of_month = \&mday; + +sub mon { + my $time = shift; + $time->[c_mon] + 1; +} + +sub _mon { + my $time = shift; + $time->[c_mon]; +} + +sub month { + my $time = shift; + if (@_) { + return $_[$time->[c_mon]]; + } + elsif (@MON_LIST) { + return $MON_LIST[$time->[c_mon]]; + } + else { + return $time->strftime('%b'); + } +} + +*monname = \&month; + +sub fullmonth { + my $time = shift; + if (@_) { + return $_[$time->[c_mon]]; + } + elsif (@FULLMON_LIST) { + return $FULLMON_LIST[$time->[c_mon]]; + } + else { + return $time->strftime('%B'); + } +} + +sub year { + my $time = shift; + $time->[c_year] + 1900; +} + +sub _year { + my $time = shift; + $time->[c_year]; +} + +sub yy { + my $time = shift; + my $res = $time->[c_year] % 100; + return $res > 9 ? $res : "0$res"; +} + +sub wday { + my $time = shift; + $time->[c_wday] + 1; +} + +sub _wday { + my $time = shift; + $time->[c_wday]; +} + +*day_of_week = \&_wday; + +sub wdayname { + my $time = shift; + if (@_) { + return $_[$time->[c_wday]]; + } + elsif (@DAY_LIST) { + return $DAY_LIST[$time->[c_wday]]; + } + else { + return $time->strftime('%a'); + } +} + +*day = \&wdayname; + +sub fullday { + my $time = shift; + if (@_) { + return $_[$time->[c_wday]]; + } + elsif (@FULLDAY_LIST) { + return $FULLDAY_LIST[$time->[c_wday]]; + } + else { + return $time->strftime('%A'); + } +} + +sub yday { + my $time = shift; + $time->[c_yday]; +} + +*day_of_year = \&yday; + +sub isdst { + my $time = shift; + $time->[c_isdst]; +} + +*daylight_savings = \&isdst; + +# Thanks to Tony Olekshy <olekshy@cs.ualberta.ca> for this algorithm +sub tzoffset { + my $time = shift; + + return Time::Seconds->new(0) unless $time->[c_islocal]; + + my $epoch = $time->epoch; + + my $j = sub { + + my ($s,$n,$h,$d,$m,$y) = @_; $m += 1; $y += 1900; + + $time->_jd($y, $m, $d, $h, $n, $s); + + }; + + # Compute floating offset in hours. + # + # Note use of crt methods so the tz is properly set... + # See: http://perlmonks.org/?node_id=820347 + my $delta = 24 * ($j->(_crt_localtime($epoch)) - $j->(_crt_gmtime($epoch))); + + # Return value in seconds rounded to nearest minute. + return Time::Seconds->new( int($delta * 60 + ($delta >= 0 ? 0.5 : -0.5)) * 60 ); +} + +sub epoch { + my $time = shift; + if (defined($time->[c_epoch])) { + return $time->[c_epoch]; + } + else { + my $epoch = $time->[c_islocal] ? + timelocal(@{$time}[c_sec .. c_mon], $time->[c_year]+1900) + : + timegm(@{$time}[c_sec .. c_mon], $time->[c_year]+1900); + $time->[c_epoch] = $epoch; + return $epoch; + } +} + +sub hms { + my $time = shift; + my $sep = @_ ? shift(@_) : $TIME_SEP; + sprintf("%02d$sep%02d$sep%02d", $time->[c_hour], $time->[c_min], $time->[c_sec]); +} + +*time = \&hms; + +sub ymd { + my $time = shift; + my $sep = @_ ? shift(@_) : $DATE_SEP; + sprintf("%d$sep%02d$sep%02d", $time->year, $time->mon, $time->[c_mday]); +} + +*date = \&ymd; + +sub mdy { + my $time = shift; + my $sep = @_ ? shift(@_) : $DATE_SEP; + sprintf("%02d$sep%02d$sep%d", $time->mon, $time->[c_mday], $time->year); +} + +sub dmy { + my $time = shift; + my $sep = @_ ? shift(@_) : $DATE_SEP; + sprintf("%02d$sep%02d$sep%d", $time->[c_mday], $time->mon, $time->year); +} + +sub datetime { + my $time = shift; + my %seps = (date => $DATE_SEP, T => 'T', time => $TIME_SEP, @_); + return join($seps{T}, $time->date($seps{date}), $time->time($seps{time})); +} + + + +# Julian Day is always calculated for UT regardless +# of local time +sub julian_day { + my $time = shift; + # Correct for localtime + $time = $time->gmtime( $time->epoch ) if $time->[c_islocal]; + + # Calculate the Julian day itself + my $jd = $time->_jd( $time->year, $time->mon, $time->mday, + $time->hour, $time->min, $time->sec); + + return $jd; +} + +# MJD is defined as JD - 2400000.5 days +sub mjd { + return shift->julian_day - 2_400_000.5; +} + +# Internal calculation of Julian date. Needed here so that +# both tzoffset and mjd/jd methods can share the code +# Algorithm from Hatcher 1984 (QJRAS 25, 53-55), and +# Hughes et al, 1989, MNRAS, 238, 15 +# See: http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1989MNRAS.238.1529H&db_key=AST +# for more details + +sub _jd { + my $self = shift; + my ($y, $m, $d, $h, $n, $s) = @_; + + # Adjust input parameters according to the month + $y = ( $m > 2 ? $y : $y - 1); + $m = ( $m > 2 ? $m - 3 : $m + 9); + + # Calculate the Julian Date (assuming Julian calendar) + my $J = int( 365.25 *( $y + 4712) ) + + int( (30.6 * $m) + 0.5) + + 59 + + $d + - 0.5; + + # Calculate the Gregorian Correction (since we have Gregorian dates) + my $G = 38 - int( 0.75 * int(49+($y/100))); + + # Calculate the actual Julian Date + my $JD = $J + $G; + + # Modify to include hours/mins/secs in floating portion. + return $JD + ($h + ($n + $s / 60) / 60) / 24; +} + +sub week { + my $self = shift; + + my $J = $self->julian_day; + # Julian day is independent of time zone so add on tzoffset + # if we are using local time here since we want the week day + # to reflect the local time rather than UTC + $J += ($self->tzoffset/(24*3600)) if $self->[c_islocal]; + + # Now that we have the Julian day including fractions + # convert it to an integer Julian Day Number using nearest + # int (since the day changes at midday we convert all Julian + # dates to following midnight). + $J = int($J+0.5); + + use integer; + my $d4 = ((($J + 31741 - ($J % 7)) % 146097) % 36524) % 1461; + my $L = $d4 / 1460; + my $d1 = (($d4 - $L) % 365) + $L; + return $d1 / 7 + 1; +} + +sub _is_leap_year { + my $year = shift; + return (($year %4 == 0) && !($year % 100 == 0)) || ($year % 400 == 0) + ? 1 : 0; +} + +sub is_leap_year { + my $time = shift; + my $year = $time->year; + return _is_leap_year($year); +} + +my @MON_LAST = qw(31 28 31 30 31 30 31 31 30 31 30 31); + +sub month_last_day { + my $time = shift; + my $year = $time->year; + my $_mon = $time->_mon; + return $MON_LAST[$_mon] + ($_mon == 1 ? _is_leap_year($year) : 0); +} + +my $trans_map_common = { + + 'c' => sub { + my ( $format ) = @_; + if($LOCALE->{PM} && $LOCALE->{AM}){ + $format =~ s/%c/%a %d %b %Y %I:%M:%S %p/; + } + else{ + $format =~ s/%c/%a %d %b %Y %H:%M:%S/; + } + return $format; + }, + 'r' => sub { + my ( $format ) = @_; + if($LOCALE->{PM} && $LOCALE->{AM}){ + $format =~ s/%r/%I:%M:%S %p/; + } + else{ + $format =~ s/%r/%H:%M:%S/; + } + return $format; + }, + 'X' => sub { + my ( $format ) = @_; + if($LOCALE->{PM} && $LOCALE->{AM}){ + $format =~ s/%X/%I:%M:%S %p/; + } + else{ + $format =~ s/%X/%H:%M:%S/; + } + return $format; + }, +}; + +my $strftime_trans_map = { + %{$trans_map_common}, + + 'e' => sub { + my ( $format, $time ) = @_; + $format =~ s/%e/%d/ if $IS_WIN32; + return $format; + }, + 'D' => sub { + my ( $format, $time ) = @_; + $format =~ s/%D/%m\/%d\/%y/; + return $format; + }, + 'F' => sub { + my ( $format, $time ) = @_; + $format =~ s/%F/%Y-%m-%d/; + return $format; + }, + 'R' => sub { + my ( $format, $time ) = @_; + $format =~ s/%R/%H:%M/; + return $format; + }, + 's' => sub { + #%s not portable if time parts are from gmtime since %s will + #cause a call to native mktime (and thus uses local TZ) + my ( $format, $time ) = @_; + $format =~ s/%s/$time->[c_epoch]/; + return $format; + }, + 'T' => sub { + my ( $format, $time ) = @_; + $format =~ s/%T/%H:%M:%S/ if $IS_WIN32; + return $format; + }, + 'u' => sub { + my ( $format, $time ) = @_; + $format =~ s/%u/%w/ if $IS_WIN32; + return $format; + }, + 'V' => sub { + my ( $format, $time ) = @_; + my $week = sprintf( "%02d", $time->week() ); + $format =~ s/%V/$week/ if $IS_WIN32; + return $format; + }, + 'x' => sub { + my ( $format, $time ) = @_; + $format =~ s/%x/%a %d %b %Y/; + return $format; + }, + 'z' => sub { #%[zZ] not portable if time parts are from gmtime + my ( $format, $time ) = @_; + $format =~ s/%z/+0000/ if not $time->[c_islocal]; + return $format; + }, + 'Z' => sub { + my ( $format, $time ) = @_; + $format =~ s/%Z/UTC/ if not $time->[c_islocal]; + return $format; + }, +}; + +sub strftime { + my $time = shift; + my $format = @_ ? shift(@_) : '%a, %d %b %Y %H:%M:%S %Z'; + $format = _translate_format($format, $strftime_trans_map, $time); + + return $format unless $format =~ /%/; #if translate removes everything + + return _strftime($format, $time->epoch, $time->[c_islocal]); +} + +my $strptime_trans_map = { + %{$trans_map_common}, +}; + +sub strptime { + my $time = shift; + my $string = shift; + my $format = @_ ? shift(@_) : "%a, %d %b %Y %H:%M:%S %Z"; + my $islocal = (ref($time) ? $time->[c_islocal] : 0); + my $locales = $LOCALE || &Time::Piece::_default_locale(); + $format = _translate_format($format, $strptime_trans_map); + my @vals = _strptime($string, $format, $islocal, $locales); +# warn(sprintf("got vals: %d-%d-%d %d:%d:%d\n", reverse(@vals[c_sec..c_year]))); + return scalar $time->_mktime(\@vals, $islocal); +} + +sub day_list { + shift if ref($_[0]) && $_[0]->isa(__PACKAGE__); # strip first if called as a method + my @old = @DAY_LIST; + if (@_) { + @DAY_LIST = @_; + &Time::Piece::_default_locale(); + } + return @old; +} + +sub mon_list { + shift if ref($_[0]) && $_[0]->isa(__PACKAGE__); # strip first if called as a method + my @old = @MON_LIST; + if (@_) { + @MON_LIST = @_; + &Time::Piece::_default_locale(); + } + return @old; +} + +sub time_separator { + shift if ref($_[0]) && $_[0]->isa(__PACKAGE__); + my $old = $TIME_SEP; + if (@_) { + $TIME_SEP = $_[0]; + } + return $old; +} + +sub date_separator { + shift if ref($_[0]) && $_[0]->isa(__PACKAGE__); + my $old = $DATE_SEP; + if (@_) { + $DATE_SEP = $_[0]; + } + return $old; +} + +use overload '""' => \&cdate, + 'cmp' => \&str_compare, + 'fallback' => undef; + +sub cdate { + my $time = shift; + if ($time->[c_islocal]) { + return scalar(CORE::localtime($time->epoch)); + } + else { + return scalar(CORE::gmtime($time->epoch)); + } +} + +sub str_compare { + my ($lhs, $rhs, $reverse) = @_; + if (UNIVERSAL::isa($rhs, 'Time::Piece')) { + $rhs = "$rhs"; + } + return $reverse ? $rhs cmp $lhs->cdate : $lhs->cdate cmp $rhs; +} + +use overload + '-' => \&subtract, + '+' => \&add; + +sub subtract { + my $time = shift; + my $rhs = shift; + if (UNIVERSAL::isa($rhs, 'Time::Seconds')) { + $rhs = $rhs->seconds; + } + + if (shift) + { + # SWAPED is set (so someone tried an expression like NOTDATE - DATE). + # Imitate Perl's standard behavior and return the result as if the + # string $time resolves to was subtracted from NOTDATE. This way, + # classes which override this one and which have a stringify function + # that resolves to something that looks more like a number don't need + # to override this function. + return $rhs - "$time"; + } + + if (UNIVERSAL::isa($rhs, 'Time::Piece')) { + return Time::Seconds->new($time->epoch - $rhs->epoch); + } + else { + # rhs is seconds. + return $time->_mktime(($time->epoch - $rhs), $time->[c_islocal]); + } +} + +sub add { + my $time = shift; + my $rhs = shift; + if (UNIVERSAL::isa($rhs, 'Time::Seconds')) { + $rhs = $rhs->seconds; + } + croak "Invalid rhs of addition: $rhs" if ref($rhs); + + return $time->_mktime(($time->epoch + $rhs), $time->[c_islocal]); +} + +use overload + '<=>' => \&compare; + +sub get_epochs { + my ($lhs, $rhs, $reverse) = @_; + if (!UNIVERSAL::isa($rhs, 'Time::Piece')) { + $rhs = $lhs->new($rhs); + } + if ($reverse) { + return $rhs->epoch, $lhs->epoch; + } + return $lhs->epoch, $rhs->epoch; +} + +sub compare { + my ($lhs, $rhs) = get_epochs(@_); + return $lhs <=> $rhs; +} + +sub add_months { + my ($time, $num_months) = @_; + + croak("add_months requires a number of months") unless defined($num_months); + + my $final_month = $time->_mon + $num_months; + my $num_years = 0; + if ($final_month > 11 || $final_month < 0) { + # these two ops required because we have no POSIX::floor and don't + # want to load POSIX.pm + if ($final_month < 0 && $final_month % 12 == 0) { + $num_years = int($final_month / 12) + 1; + } + else { + $num_years = int($final_month / 12); + } + $num_years-- if ($final_month < 0); + + $final_month = $final_month % 12; + } + + my @vals = _mini_mktime($time->sec, $time->min, $time->hour, + $time->mday, $final_month, $time->year - 1900 + $num_years); + # warn(sprintf("got %d vals: %d-%d-%d %d:%d:%d [%d]\n", scalar(@vals), reverse(@vals), $time->[c_islocal])); + return scalar $time->_mktime(\@vals, $time->[c_islocal]); +} + +sub add_years { + my ($time, $years) = @_; + $time->add_months($years * 12); +} + +sub truncate { + my ($time, %params) = @_; + return $time unless exists $params{to}; + #if ($params{to} eq 'week') { return $time->_truncate_week; } + my %units = ( + second => 0, + minute => 1, + hour => 2, + day => 3, + month => 4, + quarter => 5, + year => 5 + ); + my $to = $units{$params{to}}; + croak "Invalid value of 'to' parameter: $params{to}" unless defined $to; + my $start_month = 0; + if ($params{to} eq 'quarter') { + $start_month = int( $time->_mon / 3 ) * 3; + } + my @down_to = (0, 0, 0, 1, $start_month, $time->year); + return $time->_mktime([@down_to[0..$to-1], @$time[$to..c_isdst]], + $time->[c_islocal]); +} + +#Given a format and a translate map, replace format flags in +#accordance with the logic from the translation map subroutines +sub _translate_format { + my ( $format, $trans_map, $time ) = @_; + + $format =~ s/%%/\e\e/g; #escape the escape + my $lexer = _build_format_lexer($format); + + while(my $flag = $lexer->() ){ + next unless exists $trans_map->{$flag}; + $format = $trans_map->{$flag}($format, $time); + } + + $format =~ s/\e\e/%%/g; + return $format; +} + +sub _build_format_lexer { + my $format = shift(); + + #Higher Order Perl p.359 (or thereabouts) + return sub { + LABEL: { + return $1 if $format =~ m/\G%([a-zA-Z])/gc; #return single char flags + + redo LABEL if $format =~ m/\G(.)/gc; + return; #return at empty string + } + }; +} + +sub use_locale { + #get locale month/day names from posix strftime (from Piece.xs) + my $locales = _get_localization(); + + $locales->{PM} ||= ''; + $locales->{AM} ||= ''; + + $locales->{pm} = lc $locales->{PM}; + $locales->{am} = lc $locales->{AM}; + #should probably figure out how to get a + #region specific format for %c someday + $locales->{c_fmt} = ''; + + #Set globals. If anything is + #weird just use original + if( @{$locales->{weekday}} < 7 ){ + @{$locales->{weekday}} = @FULLDAY_LIST; + } + else { + @FULLDAY_LIST = @{$locales->{weekday}}; + } + + if( @{$locales->{wday}} < 7 ){ + @{$locales->{wday}} = @DAY_LIST; + } + else { + @DAY_LIST = @{$locales->{wday}}; + } + + if( @{$locales->{month}} < 12 ){ + @{$locales->{month}} = @FULLMON_LIST; + }else { + @FULLMON_LIST = @{$locales->{month}}; + } + + if( @{$locales->{mon}} < 12 ){ + @{$locales->{mon}} = @MON_LIST; + } + else{ + @MON_LIST= @{$locales->{mon}}; + } + + $LOCALE = $locales; +} + +#$Time::Piece::LOCALE is used by strptime and thus needs to be +#in sync with what ever users change to via day_list() and mon_list(). +#Should probably deprecate this use of gloabl state, but oh well... +sub _default_locale { + my $locales = {}; + + @{ $locales->{weekday} } = @FULLDAY_LIST; + @{ $locales->{wday} } = @DAY_LIST; + @{ $locales->{month} } = @FULLMON_LIST; + @{ $locales->{mon} } = @MON_LIST; + $locales->{alt_month} = $locales->{month}; + + $locales->{PM} = 'PM'; + $locales->{AM} = 'AM'; + $locales->{pm} = 'pm'; + $locales->{am} = 'am'; + $locales->{c_fmt} = ''; + + $LOCALE = $locales; +} + +sub _locale { + return $LOCALE; +} + + +1; +__END__ + +package Encode::Unicode; + +use strict; +use warnings; + +our $VERSION = do { my @r = ( q$Revision: 2.17 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load( __PACKAGE__, $VERSION ); + +# +# Object Generator 8 transcoders all at once! +# + +use Encode (); + +our %BOM_Unknown = map { $_ => 1 } qw(UTF-16 UTF-32); + +for my $name ( + qw(UTF-16 UTF-16BE UTF-16LE + UTF-32 UTF-32BE UTF-32LE + UCS-2BE UCS-2LE) + ) +{ + my ( $size, $endian, $ucs2, $mask ); + $name =~ /^(\w+)-(\d+)(\w*)$/o; + if ( $ucs2 = ( $1 eq 'UCS' ) ) { + $size = 2; + } + else { + $size = $2 / 8; + } + $endian = ( $3 eq 'BE' ) ? 'n' : ( $3 eq 'LE' ) ? 'v' : ''; + $size == 4 and $endian = uc($endian); + + my $obj = bless { + Name => $name, + size => $size, + endian => $endian, + ucs2 => $ucs2, + } => __PACKAGE__; + Encode::define_encoding($obj, $name); +} + +use parent qw(Encode::Encoding); + +sub renew { + my $self = shift; + $BOM_Unknown{ $self->name } or return $self; + my $clone = bless {%$self} => ref($self); + $clone->{renewed}++; # so the caller knows it is renewed. + return $clone; +} + +1; +__END__ + + +package Encode::Symbol; +use strict; +use warnings; +use Encode; +our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load( __PACKAGE__, $VERSION ); + +1; +__END__ + +# +# $Id: GSM0338.pm,v 2.7 2017/06/10 17:23:50 dankogai Exp $ +# +package Encode::GSM0338; + +use strict; +use warnings; +use Carp; + +use vars qw($VERSION); +$VERSION = do { my @r = ( q$Revision: 2.7 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +use parent qw(Encode::Encoding); +__PACKAGE__->Define('gsm0338'); + +sub needs_lines { 1 } +sub perlio_ok { 0 } + +use utf8; +our %UNI2GSM = ( + "\x{0040}" => "\x00", # COMMERCIAL AT + "\x{000A}" => "\x0A", # LINE FEED + "\x{000C}" => "\x1B\x0A", # FORM FEED + "\x{000D}" => "\x0D", # CARRIAGE RETURN + "\x{0020}" => "\x20", # SPACE + "\x{0021}" => "\x21", # EXCLAMATION MARK + "\x{0022}" => "\x22", # QUOTATION MARK + "\x{0023}" => "\x23", # NUMBER SIGN + "\x{0024}" => "\x02", # DOLLAR SIGN + "\x{0025}" => "\x25", # PERCENT SIGN + "\x{0026}" => "\x26", # AMPERSAND + "\x{0027}" => "\x27", # APOSTROPHE + "\x{0028}" => "\x28", # LEFT PARENTHESIS + "\x{0029}" => "\x29", # RIGHT PARENTHESIS + "\x{002A}" => "\x2A", # ASTERISK + "\x{002B}" => "\x2B", # PLUS SIGN + "\x{002C}" => "\x2C", # COMMA + "\x{002D}" => "\x2D", # HYPHEN-MINUS + "\x{002E}" => "\x2E", # FULL STOP + "\x{002F}" => "\x2F", # SOLIDUS + "\x{0030}" => "\x30", # DIGIT ZERO + "\x{0031}" => "\x31", # DIGIT ONE + "\x{0032}" => "\x32", # DIGIT TWO + "\x{0033}" => "\x33", # DIGIT THREE + "\x{0034}" => "\x34", # DIGIT FOUR + "\x{0035}" => "\x35", # DIGIT FIVE + "\x{0036}" => "\x36", # DIGIT SIX + "\x{0037}" => "\x37", # DIGIT SEVEN + "\x{0038}" => "\x38", # DIGIT EIGHT + "\x{0039}" => "\x39", # DIGIT NINE + "\x{003A}" => "\x3A", # COLON + "\x{003B}" => "\x3B", # SEMICOLON + "\x{003C}" => "\x3C", # LESS-THAN SIGN + "\x{003D}" => "\x3D", # EQUALS SIGN + "\x{003E}" => "\x3E", # GREATER-THAN SIGN + "\x{003F}" => "\x3F", # QUESTION MARK + "\x{0041}" => "\x41", # LATIN CAPITAL LETTER A + "\x{0042}" => "\x42", # LATIN CAPITAL LETTER B + "\x{0043}" => "\x43", # LATIN CAPITAL LETTER C + "\x{0044}" => "\x44", # LATIN CAPITAL LETTER D + "\x{0045}" => "\x45", # LATIN CAPITAL LETTER E + "\x{0046}" => "\x46", # LATIN CAPITAL LETTER F + "\x{0047}" => "\x47", # LATIN CAPITAL LETTER G + "\x{0048}" => "\x48", # LATIN CAPITAL LETTER H + "\x{0049}" => "\x49", # LATIN CAPITAL LETTER I + "\x{004A}" => "\x4A", # LATIN CAPITAL LETTER J + "\x{004B}" => "\x4B", # LATIN CAPITAL LETTER K + "\x{004C}" => "\x4C", # LATIN CAPITAL LETTER L + "\x{004D}" => "\x4D", # LATIN CAPITAL LETTER M + "\x{004E}" => "\x4E", # LATIN CAPITAL LETTER N + "\x{004F}" => "\x4F", # LATIN CAPITAL LETTER O + "\x{0050}" => "\x50", # LATIN CAPITAL LETTER P + "\x{0051}" => "\x51", # LATIN CAPITAL LETTER Q + "\x{0052}" => "\x52", # LATIN CAPITAL LETTER R + "\x{0053}" => "\x53", # LATIN CAPITAL LETTER S + "\x{0054}" => "\x54", # LATIN CAPITAL LETTER T + "\x{0055}" => "\x55", # LATIN CAPITAL LETTER U + "\x{0056}" => "\x56", # LATIN CAPITAL LETTER V + "\x{0057}" => "\x57", # LATIN CAPITAL LETTER W + "\x{0058}" => "\x58", # LATIN CAPITAL LETTER X + "\x{0059}" => "\x59", # LATIN CAPITAL LETTER Y + "\x{005A}" => "\x5A", # LATIN CAPITAL LETTER Z + "\x{005F}" => "\x11", # LOW LINE + "\x{0061}" => "\x61", # LATIN SMALL LETTER A + "\x{0062}" => "\x62", # LATIN SMALL LETTER B + "\x{0063}" => "\x63", # LATIN SMALL LETTER C + "\x{0064}" => "\x64", # LATIN SMALL LETTER D + "\x{0065}" => "\x65", # LATIN SMALL LETTER E + "\x{0066}" => "\x66", # LATIN SMALL LETTER F + "\x{0067}" => "\x67", # LATIN SMALL LETTER G + "\x{0068}" => "\x68", # LATIN SMALL LETTER H + "\x{0069}" => "\x69", # LATIN SMALL LETTER I + "\x{006A}" => "\x6A", # LATIN SMALL LETTER J + "\x{006B}" => "\x6B", # LATIN SMALL LETTER K + "\x{006C}" => "\x6C", # LATIN SMALL LETTER L + "\x{006D}" => "\x6D", # LATIN SMALL LETTER M + "\x{006E}" => "\x6E", # LATIN SMALL LETTER N + "\x{006F}" => "\x6F", # LATIN SMALL LETTER O + "\x{0070}" => "\x70", # LATIN SMALL LETTER P + "\x{0071}" => "\x71", # LATIN SMALL LETTER Q + "\x{0072}" => "\x72", # LATIN SMALL LETTER R + "\x{0073}" => "\x73", # LATIN SMALL LETTER S + "\x{0074}" => "\x74", # LATIN SMALL LETTER T + "\x{0075}" => "\x75", # LATIN SMALL LETTER U + "\x{0076}" => "\x76", # LATIN SMALL LETTER V + "\x{0077}" => "\x77", # LATIN SMALL LETTER W + "\x{0078}" => "\x78", # LATIN SMALL LETTER X + "\x{0079}" => "\x79", # LATIN SMALL LETTER Y + "\x{007A}" => "\x7A", # LATIN SMALL LETTER Z + "\x{000C}" => "\x1B\x0A", # FORM FEED + "\x{005B}" => "\x1B\x3C", # LEFT SQUARE BRACKET + "\x{005C}" => "\x1B\x2F", # REVERSE SOLIDUS + "\x{005D}" => "\x1B\x3E", # RIGHT SQUARE BRACKET + "\x{005E}" => "\x1B\x14", # CIRCUMFLEX ACCENT + "\x{007B}" => "\x1B\x28", # LEFT CURLY BRACKET + "\x{007C}" => "\x1B\x40", # VERTICAL LINE + "\x{007D}" => "\x1B\x29", # RIGHT CURLY BRACKET + "\x{007E}" => "\x1B\x3D", # TILDE + "\x{00A0}" => "\x1B", # NO-BREAK SPACE + "\x{00A1}" => "\x40", # INVERTED EXCLAMATION MARK + "\x{00A3}" => "\x01", # POUND SIGN + "\x{00A4}" => "\x24", # CURRENCY SIGN + "\x{00A5}" => "\x03", # YEN SIGN + "\x{00A7}" => "\x5F", # SECTION SIGN + "\x{00BF}" => "\x60", # INVERTED QUESTION MARK + "\x{00C4}" => "\x5B", # LATIN CAPITAL LETTER A WITH DIAERESIS + "\x{00C5}" => "\x0E", # LATIN CAPITAL LETTER A WITH RING ABOVE + "\x{00C6}" => "\x1C", # LATIN CAPITAL LETTER AE + "\x{00C9}" => "\x1F", # LATIN CAPITAL LETTER E WITH ACUTE + "\x{00D1}" => "\x5D", # LATIN CAPITAL LETTER N WITH TILDE + "\x{00D6}" => "\x5C", # LATIN CAPITAL LETTER O WITH DIAERESIS + "\x{00D8}" => "\x0B", # LATIN CAPITAL LETTER O WITH STROKE + "\x{00DC}" => "\x5E", # LATIN CAPITAL LETTER U WITH DIAERESIS + "\x{00DF}" => "\x1E", # LATIN SMALL LETTER SHARP S + "\x{00E0}" => "\x7F", # LATIN SMALL LETTER A WITH GRAVE + "\x{00E4}" => "\x7B", # LATIN SMALL LETTER A WITH DIAERESIS + "\x{00E5}" => "\x0F", # LATIN SMALL LETTER A WITH RING ABOVE + "\x{00E6}" => "\x1D", # LATIN SMALL LETTER AE + #"\x{00E7}" => "\x09", # LATIN SMALL LETTER C WITH CEDILLA + "\x{00C7}" => "\x09", # LATIN CAPITAL LETTER C WITH CEDILLA + "\x{00E8}" => "\x04", # LATIN SMALL LETTER E WITH GRAVE + "\x{00E9}" => "\x05", # LATIN SMALL LETTER E WITH ACUTE + "\x{00EC}" => "\x07", # LATIN SMALL LETTER I WITH GRAVE + "\x{00F1}" => "\x7D", # LATIN SMALL LETTER N WITH TILDE + "\x{00F2}" => "\x08", # LATIN SMALL LETTER O WITH GRAVE + "\x{00F6}" => "\x7C", # LATIN SMALL LETTER O WITH DIAERESIS + "\x{00F8}" => "\x0C", # LATIN SMALL LETTER O WITH STROKE + "\x{00F9}" => "\x06", # LATIN SMALL LETTER U WITH GRAVE + "\x{00FC}" => "\x7E", # LATIN SMALL LETTER U WITH DIAERESIS + "\x{0393}" => "\x13", # GREEK CAPITAL LETTER GAMMA + "\x{0394}" => "\x10", # GREEK CAPITAL LETTER DELTA + "\x{0398}" => "\x19", # GREEK CAPITAL LETTER THETA + "\x{039B}" => "\x14", # GREEK CAPITAL LETTER LAMDA + "\x{039E}" => "\x1A", # GREEK CAPITAL LETTER XI + "\x{03A0}" => "\x16", # GREEK CAPITAL LETTER PI + "\x{03A3}" => "\x18", # GREEK CAPITAL LETTER SIGMA + "\x{03A6}" => "\x12", # GREEK CAPITAL LETTER PHI + "\x{03A8}" => "\x17", # GREEK CAPITAL LETTER PSI + "\x{03A9}" => "\x15", # GREEK CAPITAL LETTER OMEGA + "\x{20AC}" => "\x1B\x65", # EURO SIGN +); +our %GSM2UNI = reverse %UNI2GSM; +our $ESC = "\x1b"; +our $ATMARK = "\x40"; +our $FBCHAR = "\x3F"; +our $NBSP = "\x{00A0}"; + +#define ERR_DECODE_NOMAP "%s \"\\x%02" UVXf "\" does not map to Unicode" + +sub decode ($$;$) { + my ( $obj, $bytes, $chk ) = @_; + return undef unless defined $bytes; + my $str = substr($bytes, 0, 0); # to propagate taintedness; + while ( length $bytes ) { + my $c = substr( $bytes, 0, 1, '' ); + my $u; + if ( $c eq "\x00" ) { + my $c2 = substr( $bytes, 0, 1, '' ); + $u = + !length $c2 ? $ATMARK + : $c2 eq "\x00" ? "\x{0000}" + : exists $GSM2UNI{$c2} ? $ATMARK . $GSM2UNI{$c2} + : $chk + ? croak sprintf( "\\x%02X\\x%02X does not map to Unicode", + ord($c), ord($c2) ) + : $ATMARK . $FBCHAR; + + } + elsif ( $c eq $ESC ) { + my $c2 = substr( $bytes, 0, 1, '' ); + $u = + exists $GSM2UNI{ $c . $c2 } ? $GSM2UNI{ $c . $c2 } + : exists $GSM2UNI{$c2} ? $NBSP . $GSM2UNI{$c2} + : $chk + ? croak sprintf( "\\x%02X\\x%02X does not map to Unicode", + ord($c), ord($c2) ) + : $NBSP . $FBCHAR; + } + else { + $u = + exists $GSM2UNI{$c} + ? $GSM2UNI{$c} + : $chk ? ref $chk eq 'CODE' + ? $chk->( ord $c ) + : croak sprintf( "\\x%02X does not map to Unicode", ord($c) ) + : $FBCHAR; + } + $str .= $u; + } + $_[1] = $bytes if $chk; + return $str; +} + +#define ERR_ENCODE_NOMAP "\"\\x{%04" UVxf "}\" does not map to %s" + +sub encode($$;$) { + my ( $obj, $str, $chk ) = @_; + return undef unless defined $str; + my $bytes = substr($str, 0, 0); # to propagate taintedness + while ( length $str ) { + my $u = substr( $str, 0, 1, '' ); + my $c; + $bytes .= + exists $UNI2GSM{$u} + ? $UNI2GSM{$u} + : $chk ? ref $chk eq 'CODE' + ? $chk->( ord($u) ) + : croak sprintf( "\\x{%04x} does not map to %s", + ord($u), $obj->name ) + : $FBCHAR; + } + $_[1] = $str if $chk; + return $bytes; +} + +1; +__END__ + +# +# $Id: Encoder.pm,v 2.3 2013/09/14 07:51:59 dankogai Exp $ +# +package Encode::Encoder; +use strict; +use warnings; +our $VERSION = do { my @r = ( q$Revision: 2.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw ( encoder ); + +our $AUTOLOAD; +use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; +use Encode qw(encode decode find_encoding from_to); +use Carp; + +sub new { + my ( $class, $data, $encname ) = @_; + unless ($encname) { + $encname = Encode::is_utf8($data) ? 'utf8' : ''; + } + else { + my $obj = find_encoding($encname) + or croak __PACKAGE__, ": unknown encoding: $encname"; + $encname = $obj->name; + } + my $self = { + data => $data, + encoding => $encname, + }; + bless $self => $class; +} + +sub encoder { __PACKAGE__->new(@_) } + +sub data { + my ( $self, $data ) = @_; + if ( defined $data ) { + $self->{data} = $data; + return $data; + } + else { + return $self->{data}; + } +} + +sub encoding { + my ( $self, $encname ) = @_; + if ($encname) { + my $obj = find_encoding($encname) + or confess __PACKAGE__, ": unknown encoding: $encname"; + $self->{encoding} = $obj->name; + return $self; + } + else { + return $self->{encoding}; + } +} + +sub bytes { + my ( $self, $encname ) = @_; + $encname ||= $self->{encoding}; + my $obj = find_encoding($encname) + or confess __PACKAGE__, ": unknown encoding: $encname"; + $self->{data} = $obj->decode( $self->{data}, 1 ); + $self->{encoding} = ''; + return $self; +} + +sub DESTROY { # defined so it won't autoload. + DEBUG and warn shift; +} + +sub AUTOLOAD { + my $self = shift; + my $type = ref($self) + or confess "$self is not an object"; + my $myname = $AUTOLOAD; + $myname =~ s/.*://; # strip fully-qualified portion + my $obj = find_encoding($myname) + or confess __PACKAGE__, ": unknown encoding: $myname"; + DEBUG and warn $self->{encoding}, " => ", $obj->name; + if ( $self->{encoding} ) { + from_to( $self->{data}, $self->{encoding}, $obj->name, 1 ); + } + else { + $self->{data} = $obj->encode( $self->{data}, 1 ); + } + $self->{encoding} = $obj->name; + return $self; +} + +use overload + q("") => sub { $_[0]->{data} }, + q(0+) => sub { use bytes(); bytes::length( $_[0]->{data} ) }, + fallback => 1, + ; + +1; +__END__ + +package Encode::Guess; +use strict; +use warnings; +use Encode qw(:fallbacks find_encoding); +our $VERSION = do { my @r = ( q$Revision: 2.7 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +my $Canon = 'Guess'; +use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; +our %DEF_SUSPECTS = map { $_ => find_encoding($_) } qw(ascii utf8); +my $obj = bless { + Name => $Canon, + Suspects => {%DEF_SUSPECTS}, +} => __PACKAGE__; +Encode::define_encoding($obj, $Canon); + +use parent qw(Encode::Encoding); +sub needs_lines { 1 } +sub perlio_ok { 0 } + +our @EXPORT = qw(guess_encoding); +our $NoUTFAutoGuess = 0; +our $UTF8_BOM = pack( "C3", 0xef, 0xbb, 0xbf ); + +sub import { # Exporter not used so we do it on our own + my $callpkg = caller; + for my $item (@EXPORT) { + no strict 'refs'; + *{"$callpkg\::$item"} = \&{"$item"}; + } + set_suspects(@_); +} + +sub set_suspects { + my $class = shift; + my $self = ref($class) ? $class : $Encode::Encoding{$Canon}; + $self->{Suspects} = {%DEF_SUSPECTS}; + $self->add_suspects(@_); +} + +sub add_suspects { + my $class = shift; + my $self = ref($class) ? $class : $Encode::Encoding{$Canon}; + for my $c (@_) { + my $e = find_encoding($c) or die "Unknown encoding: $c"; + $self->{Suspects}{ $e->name } = $e; + DEBUG and warn "Added: ", $e->name; + } +} + +sub decode($$;$) { + my ( $obj, $octet, $chk ) = @_; + my $guessed = guess( $obj, $octet ); + unless ( ref($guessed) ) { + require Carp; + Carp::croak($guessed); + } + my $utf8 = $guessed->decode( $octet, $chk || 0 ); + $_[1] = $octet if $chk; + return $utf8; +} + +sub guess_encoding { + guess( $Encode::Encoding{$Canon}, @_ ); +} + +sub guess { + my $class = shift; + my $obj = ref($class) ? $class : $Encode::Encoding{$Canon}; + my $octet = shift; + + # sanity check + return "Empty string, empty guess" unless defined $octet and length $octet; + + # cheat 0: utf8 flag; + if ( Encode::is_utf8($octet) ) { + return find_encoding('utf8') unless $NoUTFAutoGuess; + Encode::_utf8_off($octet); + } + + # cheat 1: BOM + use Encode::Unicode; + unless ($NoUTFAutoGuess) { + my $BOM = pack( 'C3', unpack( "C3", $octet ) ); + return find_encoding('utf8') + if ( defined $BOM and $BOM eq $UTF8_BOM ); + $BOM = unpack( 'N', $octet ); + return find_encoding('UTF-32') + if ( defined $BOM and ( $BOM == 0xFeFF or $BOM == 0xFFFe0000 ) ); + $BOM = unpack( 'n', $octet ); + return find_encoding('UTF-16') + if ( defined $BOM and ( $BOM == 0xFeFF or $BOM == 0xFFFe ) ); + if ( $octet =~ /\x00/o ) + { # if \x00 found, we assume UTF-(16|32)(BE|LE) + my $utf; + my ( $be, $le ) = ( 0, 0 ); + if ( $octet =~ /\x00\x00/o ) { # UTF-32(BE|LE) assumed + $utf = "UTF-32"; + for my $char ( unpack( 'N*', $octet ) ) { + $char & 0x0000ffff and $be++; + $char & 0xffff0000 and $le++; + } + } + else { # UTF-16(BE|LE) assumed + $utf = "UTF-16"; + for my $char ( unpack( 'n*', $octet ) ) { + $char & 0x00ff and $be++; + $char & 0xff00 and $le++; + } + } + DEBUG and warn "$utf, be == $be, le == $le"; + $be == $le + and return + "Encodings ambiguous between $utf BE and LE ($be, $le)"; + $utf .= ( $be > $le ) ? 'BE' : 'LE'; + return find_encoding($utf); + } + } + my %try = %{ $obj->{Suspects} }; + for my $c (@_) { + my $e = find_encoding($c) or die "Unknown encoding: $c"; + $try{ $e->name } = $e; + DEBUG and warn "Added: ", $e->name; + } + my $nline = 1; + for my $line ( split /\r\n?|\n/, $octet ) { + + # cheat 2 -- \e in the string + if ( $line =~ /\e/o ) { + my @keys = keys %try; + delete @try{qw/utf8 ascii/}; + for my $k (@keys) { + ref( $try{$k} ) eq 'Encode::XS' and delete $try{$k}; + } + } + my %ok = %try; + + # warn join(",", keys %try); + for my $k ( keys %try ) { + my $scratch = $line; + $try{$k}->decode( $scratch, FB_QUIET ); + if ( $scratch eq '' ) { + DEBUG and warn sprintf( "%4d:%-24s ok\n", $nline, $k ); + } + else { + use bytes (); + DEBUG + and warn sprintf( "%4d:%-24s not ok; %d bytes left\n", + $nline, $k, bytes::length($scratch) ); + delete $ok{$k}; + } + } + %ok or return "No appropriate encodings found!"; + if ( scalar( keys(%ok) ) == 1 ) { + my ($retval) = values(%ok); + return $retval; + } + %try = %ok; + $nline++; + } + $try{ascii} + or return "Encodings too ambiguous: ", join( " or ", keys %try ); + return $try{ascii}; +} + +1; +__END__ + + +# +# $Id: CJKConstants.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $ +# + +package Encode::CJKConstants; + +use strict; +use warnings; +our $RCSID = q$Id: CJKConstants.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $; +our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Carp; + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT = qw(); +our @EXPORT_OK = qw(%CHARCODE %ESC %RE); +our %EXPORT_TAGS = ( 'all' => [ @EXPORT_OK, @EXPORT ] ); + +my %_0208 = ( + 1978 => '\e\$\@', + 1983 => '\e\$B', + 1990 => '\e&\@\e\$B', +); + +our %CHARCODE = ( + UNDEF_EUC => "\xa2\xae", # ¢® in EUC + UNDEF_SJIS => "\x81\xac", # ¢® in SJIS + UNDEF_JIS => "\xa2\xf7", # ¢÷ -- used in unicode + UNDEF_UNICODE => "\x20\x20", # ¢÷ -- used in unicode +); + +our %ESC = ( + GB_2312 => "\e\$A", + JIS_0208 => "\e\$B", + JIS_0212 => "\e\$(D", + KSC_5601 => "\e\$(C", + ASC => "\e\(B", + KANA => "\e\(I", + '2022_KR' => "\e\$)C", +); + +our %RE = ( + ASCII => '[\x00-\x7f]', + BIN => '[\x00-\x06\x7f\xff]', + EUC_0212 => '\x8f[\xa1-\xfe][\xa1-\xfe]', + EUC_C => '[\xa1-\xfe][\xa1-\xfe]', + EUC_KANA => '\x8e[\xa1-\xdf]', + JIS_0208 => "$_0208{1978}|$_0208{1983}|$_0208{1990}", + JIS_0212 => "\e" . '\$\(D', + ISO_ASC => "\e" . '\([BJ]', + JIS_KANA => "\e" . '\(I', + '2022_KR' => "\e" . '\$\)C', + SJIS_C => '[\x81-\x9f\xe0-\xfc][\x40-\x7e\x80-\xfc]', + SJIS_KANA => '[\xa1-\xdf]', + UTF8 => '[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf]' +); + +1; + + +package Encode::Alias; +use strict; +use warnings; +our $VERSION = do { my @r = ( q$Revision: 2.24 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; +use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; + +use Exporter 'import'; + +# Public, encouraged API is exported by default + +our @EXPORT = + qw ( + define_alias + find_alias +); + +our @Alias; # ordered matching list +our %Alias; # cached known aliases + +sub find_alias { + my $class = shift; + my $find = shift; + unless ( exists $Alias{$find} ) { + $Alias{$find} = undef; # Recursion guard + for ( my $i = 0 ; $i < @Alias ; $i += 2 ) { + my $alias = $Alias[$i]; + my $val = $Alias[ $i + 1 ]; + my $new; + if ( ref($alias) eq 'Regexp' && $find =~ $alias ) { + DEBUG and warn "eval $val"; + $new = eval $val; + DEBUG and $@ and warn "$val, $@"; + } + elsif ( ref($alias) eq 'CODE' ) { + DEBUG and warn "$alias", "->", "($find)"; + $new = $alias->($find); + } + elsif ( lc($find) eq lc($alias) ) { + $new = $val; + } + if ( defined($new) ) { + next if $new eq $find; # avoid (direct) recursion on bugs + DEBUG and warn "$alias, $new"; + my $enc = + ( ref($new) ) ? $new : Encode::find_encoding($new); + if ($enc) { + $Alias{$find} = $enc; + last; + } + } + } + + # case insensitive search when canonical is not in all lowercase + # RT ticket #7835 + unless ( $Alias{$find} ) { + my $lcfind = lc($find); + for my $name ( keys %Encode::Encoding, keys %Encode::ExtModule ) + { + $lcfind eq lc($name) or next; + $Alias{$find} = Encode::find_encoding($name); + DEBUG and warn "$find => $name"; + } + } + } + if (DEBUG) { + my $name; + if ( my $e = $Alias{$find} ) { + $name = $e->name; + } + else { + $name = ""; + } + warn "find_alias($class, $find)->name = $name"; + } + return $Alias{$find}; +} + +sub define_alias { + while (@_) { + my $alias = shift; + my $name = shift; + unshift( @Alias, $alias => $name ) # newer one has precedence + if defined $alias; + if ( ref($alias) ) { + + # clear %Alias cache to allow overrides + my @a = keys %Alias; + for my $k (@a) { + if ( ref($alias) eq 'Regexp' && $k =~ $alias ) { + DEBUG and warn "delete \$Alias\{$k\}"; + delete $Alias{$k}; + } + elsif ( ref($alias) eq 'CODE' && $alias->($k) ) { + DEBUG and warn "delete \$Alias\{$k\}"; + delete $Alias{$k}; + } + } + } + elsif (defined $alias) { + DEBUG and warn "delete \$Alias\{$alias\}"; + delete $Alias{$alias}; + } + elsif (DEBUG) { + require Carp; + Carp::croak("undef \$alias"); + } + } +} + +# HACK: Encode must be used after define_alias is declarated as Encode calls define_alias +use Encode (); + +# Allow latin-1 style names as well +# 0 1 2 3 4 5 6 7 8 9 10 +our @Latin2iso = ( 0, 1, 2, 3, 4, 9, 10, 13, 14, 15, 16 ); + +# Allow winlatin1 style names as well +our %Winlatin2cp = ( + 'latin1' => 1252, + 'latin2' => 1250, + 'cyrillic' => 1251, + 'greek' => 1253, + 'turkish' => 1254, + 'hebrew' => 1255, + 'arabic' => 1256, + 'baltic' => 1257, + 'vietnamese' => 1258, +); + +init_aliases(); + +sub undef_aliases { + @Alias = (); + %Alias = (); +} + +sub init_aliases { + undef_aliases(); + + # Try all-lower-case version should all else fails + define_alias( qr/^(.*)$/ => '"\L$1"' ); + + # UTF/UCS stuff + define_alias( qr/^(unicode-1-1-)?UTF-?7$/i => '"UTF-7"' ); + define_alias( qr/^UCS-?2-?LE$/i => '"UCS-2LE"' ); + define_alias( + qr/^UCS-?2-?(BE)?$/i => '"UCS-2BE"', + qr/^UCS-?4-?(BE|LE|)?$/i => 'uc("UTF-32$1")', + qr/^iso-10646-1$/i => '"UCS-2BE"' + ); + define_alias( + qr/^UTF-?(16|32)-?BE$/i => '"UTF-$1BE"', + qr/^UTF-?(16|32)-?LE$/i => '"UTF-$1LE"', + qr/^UTF-?(16|32)$/i => '"UTF-$1"', + ); + + # ASCII + define_alias( qr/^(?:US-?)ascii$/i => '"ascii"' ); + define_alias( 'C' => 'ascii' ); + define_alias( qr/\b(?:ISO[-_]?)?646(?:[-_]?US)?$/i => '"ascii"' ); + + # Allow variants of iso-8859-1 etc. + define_alias( qr/\biso[-_]?(\d+)[-_](\d+)$/i => '"iso-$1-$2"' ); + + # At least HP-UX has these. + define_alias( qr/\biso8859(\d+)$/i => '"iso-8859-$1"' ); + + # More HP stuff. + define_alias( + qr/\b(?:hp-)?(arabic|greek|hebrew|kana|roman|thai|turkish)8$/i => + '"${1}8"' ); + + # The Official name of ASCII. + define_alias( qr/\bANSI[-_]?X3\.4[-_]?1968$/i => '"ascii"' ); + + # This is a font issue, not an encoding issue. + # (The currency symbol of the Latin 1 upper half + # has been redefined as the euro symbol.) + define_alias( qr/^(.+)\@euro$/i => '"$1"' ); + + define_alias( qr/\b(?:iso[-_]?)?latin[-_]?(\d+)$/i => +'defined $Encode::Alias::Latin2iso[$1] ? "iso-8859-$Encode::Alias::Latin2iso[$1]" : undef' + ); + + define_alias( + qr/\bwin(latin[12]|cyrillic|baltic|greek|turkish| + hebrew|arabic|baltic|vietnamese)$/ix => + '"cp" . $Encode::Alias::Winlatin2cp{lc($1)}' + ); + + # Common names for non-latin preferred MIME names + define_alias( + 'ascii' => 'US-ascii', + 'cyrillic' => 'iso-8859-5', + 'arabic' => 'iso-8859-6', + 'greek' => 'iso-8859-7', + 'hebrew' => 'iso-8859-8', + 'thai' => 'iso-8859-11', + ); + # RT #20781 + define_alias(qr/\btis-?620\b/i => '"iso-8859-11"'); + + # At least AIX has IBM-NNN (surprisingly...) instead of cpNNN. + # And Microsoft has their own naming (again, surprisingly). + # And windows-* is registered in IANA! + define_alias( + qr/\b(?:cp|ibm|ms|windows)[-_ ]?(\d{2,4})$/i => '"cp$1"' ); + + # Sometimes seen with a leading zero. + # define_alias( qr/\bcp037\b/i => '"cp37"'); + + # Mac Mappings + # predefined in *.ucm; unneeded + # define_alias( qr/\bmacIcelandic$/i => '"macIceland"'); + define_alias( qr/^(?:x[_-])?mac[_-](.*)$/i => '"mac$1"' ); + # http://rt.cpan.org/Ticket/Display.html?id=36326 + define_alias( qr/^macintosh$/i => '"MacRoman"' ); + # https://rt.cpan.org/Ticket/Display.html?id=78125 + define_alias( qr/^macce$/i => '"MacCentralEurRoman"' ); + # Ououououou. gone. They are different! + # define_alias( qr/\bmacRomanian$/i => '"macRumanian"'); + + # Standardize on the dashed versions. + define_alias( qr/\bkoi8[\s\-_]*([ru])$/i => '"koi8-$1"' ); + + unless ($Encode::ON_EBCDIC) { + + # for Encode::CN + define_alias( qr/\beuc.*cn$/i => '"euc-cn"' ); + define_alias( qr/\bcn.*euc$/i => '"euc-cn"' ); + + # define_alias( qr/\bGB[- ]?(\d+)$/i => '"euc-cn"' ) + # CP936 doesn't have vendor-addon for GBK, so they're identical. + define_alias( qr/^gbk$/i => '"cp936"' ); + + # This fixes gb2312 vs. euc-cn confusion, practically + define_alias( qr/\bGB[-_ ]?2312(?!-?raw)/i => '"euc-cn"' ); + + # for Encode::JP + define_alias( qr/\bjis$/i => '"7bit-jis"' ); + define_alias( qr/\beuc.*jp$/i => '"euc-jp"' ); + define_alias( qr/\bjp.*euc$/i => '"euc-jp"' ); + define_alias( qr/\bujis$/i => '"euc-jp"' ); + define_alias( qr/\bshift.*jis$/i => '"shiftjis"' ); + define_alias( qr/\bsjis$/i => '"shiftjis"' ); + define_alias( qr/\bwindows-31j$/i => '"cp932"' ); + + # for Encode::KR + define_alias( qr/\beuc.*kr$/i => '"euc-kr"' ); + define_alias( qr/\bkr.*euc$/i => '"euc-kr"' ); + + # This fixes ksc5601 vs. euc-kr confusion, practically + define_alias( qr/(?:x-)?uhc$/i => '"cp949"' ); + define_alias( qr/(?:x-)?windows-949$/i => '"cp949"' ); + define_alias( qr/\bks_c_5601-1987$/i => '"cp949"' ); + + # for Encode::TW + define_alias( qr/\bbig-?5$/i => '"big5-eten"' ); + define_alias( qr/\bbig5-?et(?:en)?$/i => '"big5-eten"' ); + define_alias( qr/\btca[-_]?big5$/i => '"big5-eten"' ); + define_alias( qr/\bbig5-?hk(?:scs)?$/i => '"big5-hkscs"' ); + define_alias( qr/\bhk(?:scs)?[-_]?big5$/i => '"big5-hkscs"' ); + } + + # https://github.com/dankogai/p5-encode/issues/37 + define_alias(qr/cp65000/i => '"UTF-7"'); + define_alias(qr/cp65001/i => '"utf-8-strict"'); + + # utf8 is blessed :) + define_alias( qr/\bUTF-8$/i => '"utf-8-strict"' ); + + # At last, Map white space and _ to '-' + define_alias( qr/^([^\s_]+)[\s_]+([^\s_]*)$/i => '"$1-$2"' ); +} + +1; +__END__ + +# TODO: HP-UX '8' encodings arabic8 greek8 hebrew8 kana8 thai8 turkish8 +# TODO: HP-UX '15' encodings japanese15 korean15 roi15 +# TODO: Cyrillic encoding ISO-IR-111 (useful?) +# TODO: Armenian encoding ARMSCII-8 +# TODO: Hebrew encoding ISO-8859-8-1 +# TODO: Thai encoding TCVN +# TODO: Vietnamese encodings VPS +# TODO: Mac Asian+African encodings: Arabic Armenian Bengali Burmese +# ChineseSimp ChineseTrad Devanagari Ethiopic ExtArabic +# Farsi Georgian Gujarati Gurmukhi Hebrew Japanese +# Kannada Khmer Korean Laotian Malayalam Mongolian +# Oriya Sinhalese Symbol Tamil Telugu Tibetan Vietnamese + + +package Encode::Byte; +use strict; +use warnings; +use Encode; +our $VERSION = do { my @r = ( q$Revision: 2.4 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use XSLoader; +XSLoader::load( __PACKAGE__, $VERSION ); + +1; +__END__ + +package Encode::Encoding; + +# Base class for classes which implement encodings +use strict; +use warnings; +our $VERSION = do { my @r = ( q$Revision: 2.8 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +our @CARP_NOT = qw(Encode Encode::Encoder); + +use Carp (); +use Encode (); +use Encode::MIME::Name; + +use constant DEBUG => !!$ENV{PERL_ENCODE_DEBUG}; + +sub Define { + my $obj = shift; + my $canonical = shift; + $obj = bless { Name => $canonical }, $obj unless ref $obj; + + # warn "$canonical => $obj\n"; + Encode::define_encoding( $obj, $canonical, @_ ); +} + +sub name { return shift->{'Name'} } + +sub mime_name { + return Encode::MIME::Name::get_mime_name(shift->name); +} + +sub renew { + my $self = shift; + my $clone = bless {%$self} => ref($self); + $clone->{renewed}++; # so the caller can see it + DEBUG and warn $clone->{renewed}; + return $clone; +} + +sub renewed { return $_[0]->{renewed} || 0 } + +*new_sequence = \&renew; + +sub needs_lines { 0 } + +sub perlio_ok { + return eval { require PerlIO::encoding } ? 1 : 0; +} + +# (Temporary|legacy) methods + +sub toUnicode { shift->decode(@_) } +sub fromUnicode { shift->encode(@_) } + +# +# Needs to be overloaded or just croak +# + +sub encode { + my $obj = shift; + my $class = ref($obj) ? ref($obj) : $obj; + Carp::croak( $class . "->encode() not defined!" ); +} + +sub decode { + my $obj = shift; + my $class = ref($obj) ? ref($obj) : $obj; + Carp::croak( $class . "->encode() not defined!" ); +} + +sub DESTROY { } + +1; +__END__ + +# +# Demand-load module list +# +package Encode::Config; +our $VERSION = do { my @r = ( q$Revision: 2.5 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use strict; +use warnings; + +our %ExtModule = ( + + # Encode::Byte + #iso-8859-1 is in Encode.pm itself + 'iso-8859-2' => 'Encode::Byte', + 'iso-8859-3' => 'Encode::Byte', + 'iso-8859-4' => 'Encode::Byte', + 'iso-8859-5' => 'Encode::Byte', + 'iso-8859-6' => 'Encode::Byte', + 'iso-8859-7' => 'Encode::Byte', + 'iso-8859-8' => 'Encode::Byte', + 'iso-8859-9' => 'Encode::Byte', + 'iso-8859-10' => 'Encode::Byte', + 'iso-8859-11' => 'Encode::Byte', + 'iso-8859-13' => 'Encode::Byte', + 'iso-8859-14' => 'Encode::Byte', + 'iso-8859-15' => 'Encode::Byte', + 'iso-8859-16' => 'Encode::Byte', + 'koi8-f' => 'Encode::Byte', + 'koi8-r' => 'Encode::Byte', + 'koi8-u' => 'Encode::Byte', + 'viscii' => 'Encode::Byte', + 'cp424' => 'Encode::Byte', + 'cp437' => 'Encode::Byte', + 'cp737' => 'Encode::Byte', + 'cp775' => 'Encode::Byte', + 'cp850' => 'Encode::Byte', + 'cp852' => 'Encode::Byte', + 'cp855' => 'Encode::Byte', + 'cp856' => 'Encode::Byte', + 'cp857' => 'Encode::Byte', + 'cp858' => 'Encode::Byte', + 'cp860' => 'Encode::Byte', + 'cp861' => 'Encode::Byte', + 'cp862' => 'Encode::Byte', + 'cp863' => 'Encode::Byte', + 'cp864' => 'Encode::Byte', + 'cp865' => 'Encode::Byte', + 'cp866' => 'Encode::Byte', + 'cp869' => 'Encode::Byte', + 'cp874' => 'Encode::Byte', + 'cp1006' => 'Encode::Byte', + 'cp1250' => 'Encode::Byte', + 'cp1251' => 'Encode::Byte', + 'cp1252' => 'Encode::Byte', + 'cp1253' => 'Encode::Byte', + 'cp1254' => 'Encode::Byte', + 'cp1255' => 'Encode::Byte', + 'cp1256' => 'Encode::Byte', + 'cp1257' => 'Encode::Byte', + 'cp1258' => 'Encode::Byte', + 'AdobeStandardEncoding' => 'Encode::Byte', + 'MacArabic' => 'Encode::Byte', + 'MacCentralEurRoman' => 'Encode::Byte', + 'MacCroatian' => 'Encode::Byte', + 'MacCyrillic' => 'Encode::Byte', + 'MacFarsi' => 'Encode::Byte', + 'MacGreek' => 'Encode::Byte', + 'MacHebrew' => 'Encode::Byte', + 'MacIcelandic' => 'Encode::Byte', + 'MacRoman' => 'Encode::Byte', + 'MacRomanian' => 'Encode::Byte', + 'MacRumanian' => 'Encode::Byte', + 'MacSami' => 'Encode::Byte', + 'MacThai' => 'Encode::Byte', + 'MacTurkish' => 'Encode::Byte', + 'MacUkrainian' => 'Encode::Byte', + 'nextstep' => 'Encode::Byte', + 'hp-roman8' => 'Encode::Byte', + #'gsm0338' => 'Encode::Byte', + 'gsm0338' => 'Encode::GSM0338', + + # Encode::EBCDIC + 'cp37' => 'Encode::EBCDIC', + 'cp500' => 'Encode::EBCDIC', + 'cp875' => 'Encode::EBCDIC', + 'cp1026' => 'Encode::EBCDIC', + 'cp1047' => 'Encode::EBCDIC', + 'posix-bc' => 'Encode::EBCDIC', + + # Encode::Symbol + 'dingbats' => 'Encode::Symbol', + 'symbol' => 'Encode::Symbol', + 'AdobeSymbol' => 'Encode::Symbol', + 'AdobeZdingbat' => 'Encode::Symbol', + 'MacDingbats' => 'Encode::Symbol', + 'MacSymbol' => 'Encode::Symbol', + + # Encode::Unicode + 'UCS-2BE' => 'Encode::Unicode', + 'UCS-2LE' => 'Encode::Unicode', + 'UTF-16' => 'Encode::Unicode', + 'UTF-16BE' => 'Encode::Unicode', + 'UTF-16LE' => 'Encode::Unicode', + 'UTF-32' => 'Encode::Unicode', + 'UTF-32BE' => 'Encode::Unicode', + 'UTF-32LE' => 'Encode::Unicode', + 'UTF-7' => 'Encode::Unicode::UTF7', +); + +unless ( ord("A") == 193 ) { + %ExtModule = ( + %ExtModule, + 'euc-cn' => 'Encode::CN', + 'gb12345-raw' => 'Encode::CN', + 'gb2312-raw' => 'Encode::CN', + 'hz' => 'Encode::CN', + 'iso-ir-165' => 'Encode::CN', + 'cp936' => 'Encode::CN', + 'MacChineseSimp' => 'Encode::CN', + + '7bit-jis' => 'Encode::JP', + 'euc-jp' => 'Encode::JP', + 'iso-2022-jp' => 'Encode::JP', + 'iso-2022-jp-1' => 'Encode::JP', + 'jis0201-raw' => 'Encode::JP', + 'jis0208-raw' => 'Encode::JP', + 'jis0212-raw' => 'Encode::JP', + 'cp932' => 'Encode::JP', + 'MacJapanese' => 'Encode::JP', + 'shiftjis' => 'Encode::JP', + + 'euc-kr' => 'Encode::KR', + 'iso-2022-kr' => 'Encode::KR', + 'johab' => 'Encode::KR', + 'ksc5601-raw' => 'Encode::KR', + 'cp949' => 'Encode::KR', + 'MacKorean' => 'Encode::KR', + + 'big5-eten' => 'Encode::TW', + 'big5-hkscs' => 'Encode::TW', + 'cp950' => 'Encode::TW', + 'MacChineseTrad' => 'Encode::TW', + + #'big5plus' => 'Encode::HanExtra', + #'euc-tw' => 'Encode::HanExtra', + #'gb18030' => 'Encode::HanExtra', + + 'MIME-Header' => 'Encode::MIME::Header', + 'MIME-B' => 'Encode::MIME::Header', + 'MIME-Q' => 'Encode::MIME::Header', + + 'MIME-Header-ISO_2022_JP' => 'Encode::MIME::Header::ISO_2022_JP', + ); +} + +# +# Why not export ? to keep ConfigLocal Happy! +# +while ( my ( $enc, $mod ) = each %ExtModule ) { + $Encode::ExtModule{$enc} = $mod; +} + +1; +__END__ + +package Encode::JP::JIS7; +use strict; +use warnings; +our $VERSION = do { my @r = ( q$Revision: 2.8 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +for my $name ( '7bit-jis', 'iso-2022-jp', 'iso-2022-jp-1' ) { + my $h2z = ( $name eq '7bit-jis' ) ? 0 : 1; + my $jis0212 = ( $name eq 'iso-2022-jp' ) ? 0 : 1; + + my $obj = bless { + Name => $name, + h2z => $h2z, + jis0212 => $jis0212, + } => __PACKAGE__; + Encode::define_encoding($obj, $name); +} + +use parent qw(Encode::Encoding); + +# we override this to 1 so PerlIO works +sub needs_lines { 1 } + +use Encode::CJKConstants qw(:all); + +# +# decode is identical for all 2022 variants +# + +sub decode($$;$) { + my ( $obj, $str, $chk ) = @_; + return undef unless defined $str; + my $residue = ''; + if ($chk) { + $str =~ s/([^\x00-\x7f].*)$//so and $residue = $1; + } + $residue .= jis_euc( \$str ); + $_[1] = $residue if $chk; + return Encode::decode( 'euc-jp', $str, FB_PERLQQ ); +} + +# +# encode is different +# + +sub encode($$;$) { + require Encode::JP::H2Z; + my ( $obj, $utf8, $chk ) = @_; + return undef unless defined $utf8; + + # empty the input string in the stack so perlio is ok + $_[1] = '' if $chk; + my ( $h2z, $jis0212 ) = @$obj{qw(h2z jis0212)}; + my $octet = Encode::encode( 'euc-jp', $utf8, $chk || 0 ); + $h2z and &Encode::JP::H2Z::h2z( \$octet ); + euc_jis( \$octet, $jis0212 ); + return $octet; +} + +# +# cat_decode +# +my $re_scan_jis_g = qr{ + \G ( ($RE{JIS_0212}) | $RE{JIS_0208} | + ($RE{ISO_ASC}) | ($RE{JIS_KANA}) | ) + ([^\e]*) +}x; + +sub cat_decode { # ($obj, $dst, $src, $pos, $trm, $chk) + my ( $obj, undef, undef, $pos, $trm ) = @_; # currently ignores $chk + my ( $rdst, $rsrc, $rpos ) = \@_[ 1, 2, 3 ]; + local ${^ENCODING}; + use bytes; + my $opos = pos($$rsrc); + pos($$rsrc) = $pos; + while ( $$rsrc =~ /$re_scan_jis_g/gc ) { + my ( $esc, $esc_0212, $esc_asc, $esc_kana, $chunk ) = + ( $1, $2, $3, $4, $5 ); + + unless ($chunk) { $esc or last; next; } + + if ( $esc && !$esc_asc ) { + $chunk =~ tr/\x21-\x7e/\xa1-\xfe/; + if ($esc_kana) { + $chunk =~ s/([\xa1-\xdf])/\x8e$1/og; + } + elsif ($esc_0212) { + $chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og; + } + $chunk = Encode::decode( 'euc-jp', $chunk, 0 ); + } + elsif ( ( my $npos = index( $chunk, $trm ) ) >= 0 ) { + $$rdst .= substr( $chunk, 0, $npos + length($trm) ); + $$rpos += length($esc) + $npos + length($trm); + pos($$rsrc) = $opos; + return 1; + } + $$rdst .= $chunk; + $$rpos = pos($$rsrc); + } + $$rpos = pos($$rsrc); + pos($$rsrc) = $opos; + return ''; +} + +# JIS<->EUC +my $re_scan_jis = qr{ + (?:($RE{JIS_0212})|$RE{JIS_0208}|($RE{ISO_ASC})|($RE{JIS_KANA}))([^\e]*) +}x; + +sub jis_euc { + local ${^ENCODING}; + my $r_str = shift; + $$r_str =~ s($re_scan_jis) + { + my ($esc_0212, $esc_asc, $esc_kana, $chunk) = + ($1, $2, $3, $4); + if (!$esc_asc) { + $chunk =~ tr/\x21-\x7e/\xa1-\xfe/; + if ($esc_kana) { + $chunk =~ s/([\xa1-\xdf])/\x8e$1/og; + } + elsif ($esc_0212) { + $chunk =~ s/([\xa1-\xfe][\xa1-\xfe])/\x8f$1/og; + } + } + $chunk; + }geox; + my ($residue) = ( $$r_str =~ s/(\e.*)$//so ); + return $residue; +} + +sub euc_jis { + no warnings qw(uninitialized); + local ${^ENCODING}; + my $r_str = shift; + my $jis0212 = shift; + $$r_str =~ s{ + ((?:$RE{EUC_C})+|(?:$RE{EUC_KANA})+|(?:$RE{EUC_0212})+) + }{ + my $chunk = $1; + my $esc = + ( $chunk =~ tr/\x8E//d ) ? $ESC{KANA} : + ( $chunk =~ tr/\x8F//d ) ? $ESC{JIS_0212} : + $ESC{JIS_0208}; + if ($esc eq $ESC{JIS_0212} && !$jis0212){ + # fallback to '?' + $chunk =~ tr/\xA1-\xFE/\x3F/; + }else{ + $chunk =~ tr/\xA1-\xFE/\x21-\x7E/; + } + $esc . $chunk . $ESC{ASC}; + }geox; + $$r_str =~ s/\Q$ESC{ASC}\E + (\Q$ESC{KANA}\E|\Q$ESC{JIS_0212}\E|\Q$ESC{JIS_0208}\E)/$1/gox; + $$r_str; +} + +1; +__END__ + + +# +# $Id: H2Z.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $ +# + +package Encode::JP::H2Z; + +use strict; +use warnings; + +our $RCSID = q$Id: H2Z.pm,v 2.2 2006/06/03 20:28:48 dankogai Exp $; +our $VERSION = do { my @r = ( q$Revision: 2.2 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Encode::CJKConstants qw(:all); + +use vars qw(%_D2Z $_PAT_D2Z + %_Z2D $_PAT_Z2D + %_H2Z $_PAT_H2Z + %_Z2H $_PAT_Z2H); + +%_H2Z = ( + "\x8e\xa1" => "\xa1\xa3", #¡£ + "\x8e\xa2" => "\xa1\xd6", #¡Ö + "\x8e\xa3" => "\xa1\xd7", #¡× + "\x8e\xa4" => "\xa1\xa2", #¡¢ + "\x8e\xa5" => "\xa1\xa6", #¡¦ + "\x8e\xa6" => "\xa5\xf2", #¥ò + "\x8e\xa7" => "\xa5\xa1", #¥¡ + "\x8e\xa8" => "\xa5\xa3", #¥£ + "\x8e\xa9" => "\xa5\xa5", #¥¥ + "\x8e\xaa" => "\xa5\xa7", #¥§ + "\x8e\xab" => "\xa5\xa9", #¥© + "\x8e\xac" => "\xa5\xe3", #¥ã + "\x8e\xad" => "\xa5\xe5", #¥å + "\x8e\xae" => "\xa5\xe7", #¥ç + "\x8e\xaf" => "\xa5\xc3", #¥Ã + "\x8e\xb0" => "\xa1\xbc", #¡¼ + "\x8e\xb1" => "\xa5\xa2", #¥¢ + "\x8e\xb2" => "\xa5\xa4", #¥¤ + "\x8e\xb3" => "\xa5\xa6", #¥¦ + "\x8e\xb4" => "\xa5\xa8", #¥¨ + "\x8e\xb5" => "\xa5\xaa", #¥ª + "\x8e\xb6" => "\xa5\xab", #¥« + "\x8e\xb7" => "\xa5\xad", #¥­ + "\x8e\xb8" => "\xa5\xaf", #¥¯ + "\x8e\xb9" => "\xa5\xb1", #¥± + "\x8e\xba" => "\xa5\xb3", #¥³ + "\x8e\xbb" => "\xa5\xb5", #¥µ + "\x8e\xbc" => "\xa5\xb7", #¥· + "\x8e\xbd" => "\xa5\xb9", #¥¹ + "\x8e\xbe" => "\xa5\xbb", #¥» + "\x8e\xbf" => "\xa5\xbd", #¥½ + "\x8e\xc0" => "\xa5\xbf", #¥¿ + "\x8e\xc1" => "\xa5\xc1", #¥Á + "\x8e\xc2" => "\xa5\xc4", #¥Ä + "\x8e\xc3" => "\xa5\xc6", #¥Æ + "\x8e\xc4" => "\xa5\xc8", #¥È + "\x8e\xc5" => "\xa5\xca", #¥Ê + "\x8e\xc6" => "\xa5\xcb", #¥Ë + "\x8e\xc7" => "\xa5\xcc", #¥Ì + "\x8e\xc8" => "\xa5\xcd", #¥Í + "\x8e\xc9" => "\xa5\xce", #¥Î + "\x8e\xca" => "\xa5\xcf", #¥Ï + "\x8e\xcb" => "\xa5\xd2", #¥Ò + "\x8e\xcc" => "\xa5\xd5", #¥Õ + "\x8e\xcd" => "\xa5\xd8", #¥Ø + "\x8e\xce" => "\xa5\xdb", #¥Û + "\x8e\xcf" => "\xa5\xde", #¥Þ + "\x8e\xd0" => "\xa5\xdf", #¥ß + "\x8e\xd1" => "\xa5\xe0", #¥à + "\x8e\xd2" => "\xa5\xe1", #¥á + "\x8e\xd3" => "\xa5\xe2", #¥â + "\x8e\xd4" => "\xa5\xe4", #¥ä + "\x8e\xd5" => "\xa5\xe6", #¥æ + "\x8e\xd6" => "\xa5\xe8", #¥è + "\x8e\xd7" => "\xa5\xe9", #¥é + "\x8e\xd8" => "\xa5\xea", #¥ê + "\x8e\xd9" => "\xa5\xeb", #¥ë + "\x8e\xda" => "\xa5\xec", #¥ì + "\x8e\xdb" => "\xa5\xed", #¥í + "\x8e\xdc" => "\xa5\xef", #¥ï + "\x8e\xdd" => "\xa5\xf3", #¥ó + "\x8e\xde" => "\xa1\xab", #¡« + "\x8e\xdf" => "\xa1\xac", #¡¬ +); + +%_D2Z = ( + "\x8e\xb6\x8e\xde" => "\xa5\xac", #¥¬ + "\x8e\xb7\x8e\xde" => "\xa5\xae", #¥® + "\x8e\xb8\x8e\xde" => "\xa5\xb0", #¥° + "\x8e\xb9\x8e\xde" => "\xa5\xb2", #¥² + "\x8e\xba\x8e\xde" => "\xa5\xb4", #¥´ + "\x8e\xbb\x8e\xde" => "\xa5\xb6", #¥¶ + "\x8e\xbc\x8e\xde" => "\xa5\xb8", #¥¸ + "\x8e\xbd\x8e\xde" => "\xa5\xba", #¥º + "\x8e\xbe\x8e\xde" => "\xa5\xbc", #¥¼ + "\x8e\xbf\x8e\xde" => "\xa5\xbe", #¥¾ + "\x8e\xc0\x8e\xde" => "\xa5\xc0", #¥À + "\x8e\xc1\x8e\xde" => "\xa5\xc2", #¥Â + "\x8e\xc2\x8e\xde" => "\xa5\xc5", #¥Å + "\x8e\xc3\x8e\xde" => "\xa5\xc7", #¥Ç + "\x8e\xc4\x8e\xde" => "\xa5\xc9", #¥É + "\x8e\xca\x8e\xde" => "\xa5\xd0", #¥Ð + "\x8e\xcb\x8e\xde" => "\xa5\xd3", #¥Ó + "\x8e\xcc\x8e\xde" => "\xa5\xd6", #¥Ö + "\x8e\xcd\x8e\xde" => "\xa5\xd9", #¥Ù + "\x8e\xce\x8e\xde" => "\xa5\xdc", #¥Ü + "\x8e\xca\x8e\xdf" => "\xa5\xd1", #¥Ñ + "\x8e\xcb\x8e\xdf" => "\xa5\xd4", #¥Ô + "\x8e\xcc\x8e\xdf" => "\xa5\xd7", #¥× + "\x8e\xcd\x8e\xdf" => "\xa5\xda", #¥Ú + "\x8e\xce\x8e\xdf" => "\xa5\xdd", #¥Ý + "\x8e\xb3\x8e\xde" => "\xa5\xf4", #¥ô +); + +# init only once; + +#$_PAT_D2Z = join("|", keys %_D2Z); +#$_PAT_H2Z = join("|", keys %_H2Z); + +%_Z2H = reverse %_H2Z; +%_Z2D = reverse %_D2Z; + +#$_PAT_Z2H = join("|", keys %_Z2H); +#$_PAT_Z2D = join("|", keys %_Z2D); + +sub h2z { + no warnings qw(uninitialized); + my $r_str = shift; + my ($keep_dakuten) = @_; + my $n = 0; + unless ($keep_dakuten) { + $n = ( + $$r_str =~ s( + ($RE{EUC_KANA} + (?:\x8e[\xde\xdf])?) + ){ + my $str = $1; + $_D2Z{$str} || $_H2Z{$str} || + # in case dakuten and handakuten are side-by-side! + $_H2Z{substr($str,0,2)} . $_H2Z{substr($str,2,2)}; + }eogx + ); + } + else { + $n = ( + $$r_str =~ s( + ($RE{EUC_KANA}) + ){ + $_H2Z{$1}; + }eogx + ); + } + $n; +} + +sub z2h { + my $r_str = shift; + my $n = ( + $$r_str =~ s( + ($RE{EUC_C}|$RE{EUC_0212}|$RE{EUC_KANA}) + ){ + $_Z2D{$1} || $_Z2H{$1} || $1; + }eogx + ); + $n; +} + +1; +__END__ + + +# +# $Id: UTF7.pm,v 2.10 2017/06/10 17:23:50 dankogai Exp $ +# +package Encode::Unicode::UTF7; +use strict; +use warnings; +use parent qw(Encode::Encoding); +__PACKAGE__->Define('UTF-7'); +our $VERSION = do { my @r = ( q$Revision: 2.10 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; +use MIME::Base64; +use Encode qw(find_encoding); + +# +# Algorithms taken from Unicode::String by Gisle Aas +# + +our $OPTIONAL_DIRECT_CHARS = 1; +my $specials = quotemeta "\'(),-./:?"; +$OPTIONAL_DIRECT_CHARS + and $specials .= quotemeta "!\"#$%&*;<=>@[]^_`{|}"; + +# \s will not work because it matches U+3000 DEOGRAPHIC SPACE +# We use qr/[\n\r\t\ ] instead +my $re_asis = qr/(?:[\n\r\t\ A-Za-z0-9$specials])/; +my $re_encoded = qr/(?:[^\n\r\t\ A-Za-z0-9$specials])/; +my $e_utf16 = find_encoding("UTF-16BE"); + +sub needs_lines { 1 } + +sub encode($$;$) { + my ( $obj, $str, $chk ) = @_; + return undef unless defined $str; + my $len = length($str); + pos($str) = 0; + my $bytes = substr($str, 0, 0); # to propagate taintedness + while ( pos($str) < $len ) { + if ( $str =~ /\G($re_asis+)/ogc ) { + my $octets = $1; + utf8::downgrade($octets); + $bytes .= $octets; + } + elsif ( $str =~ /\G($re_encoded+)/ogsc ) { + if ( $1 eq "+" ) { + $bytes .= "+-"; + } + else { + my $s = $1; + my $base64 = encode_base64( $e_utf16->encode($s), '' ); + $base64 =~ s/=+$//; + $bytes .= "+$base64-"; + } + } + else { + die "This should not happen! (pos=" . pos($str) . ")"; + } + } + $_[1] = '' if $chk; + return $bytes; +} + +sub decode($$;$) { + use re 'taint'; + my ( $obj, $bytes, $chk ) = @_; + return undef unless defined $bytes; + my $len = length($bytes); + my $str = substr($bytes, 0, 0); # to propagate taintedness; + pos($bytes) = 0; + no warnings 'uninitialized'; + while ( pos($bytes) < $len ) { + if ( $bytes =~ /\G([^+]+)/ogc ) { + $str .= $1; + } + elsif ( $bytes =~ /\G\+-/ogc ) { + $str .= "+"; + } + elsif ( $bytes =~ /\G\+([A-Za-z0-9+\/]+)-?/ogsc ) { + my $base64 = $1; + my $pad = length($base64) % 4; + $base64 .= "=" x ( 4 - $pad ) if $pad; + $str .= $e_utf16->decode( decode_base64($base64) ); + } + elsif ( $bytes =~ /\G\+/ogc ) { + $^W and warn "Bad UTF7 data escape"; + $str .= "+"; + } + else { + die "This should not happen " . pos($bytes); + } + } + $_[1] = '' if $chk; + return $str; +} +1; +__END__ + +package Encode::KR::2022_KR; +use strict; +use warnings; +our $VERSION = do { my @r = ( q$Revision: 2.4 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +use parent qw(Encode::Encoding); +__PACKAGE__->Define('iso-2022-kr'); + +sub needs_lines { 1 } + +sub perlio_ok { + return 0; # for the time being +} + +sub decode { + my ( $obj, $str, $chk ) = @_; + return undef unless defined $str; + my $res = $str; + my $residue = iso_euc( \$res ); + + # This is for PerlIO + $_[1] = $residue if $chk; + return Encode::decode( 'euc-kr', $res, FB_PERLQQ ); +} + +sub encode { + my ( $obj, $utf8, $chk ) = @_; + return undef unless defined $utf8; + + # empty the input string in the stack so perlio is ok + $_[1] = '' if $chk; + my $octet = Encode::encode( 'euc-kr', $utf8, FB_PERLQQ ); + euc_iso( \$octet ); + return $octet; +} + +use Encode::CJKConstants qw(:all); + +# ISO<->EUC + +sub iso_euc { + my $r_str = shift; + $$r_str =~ s/$RE{'2022_KR'}//gox; # remove the designator + $$r_str =~ s{ # replace characters in GL + \x0e # between SO(\x0e) and SI(\x0f) + ([^\x0f]*) # with characters in GR + \x0f + } + { + my $out= $1; + $out =~ tr/\x21-\x7e/\xa1-\xfe/; + $out; + }geox; + my ($residue) = ( $$r_str =~ s/(\e.*)$//so ); + return $residue; +} + +sub euc_iso { + no warnings qw(uninitialized); + my $r_str = shift; + substr( $$r_str, 0, 0 ) = + $ESC{'2022_KR'}; # put the designator at the beg. + $$r_str =~ + s{ # move KS X 1001 characters in GR to GL + ($RE{EUC_C}+) # and enclose them with SO and SI + }{ + my $str = $1; + $str =~ tr/\xA1-\xFE/\x21-\x7E/; + "\x0e" . $str . "\x0f"; + }geox; + $$r_str; +} + +1; +__END__ + +package Encode::CN::HZ; + +use strict; +use warnings; +use utf8 (); + +use vars qw($VERSION); +$VERSION = do { my @r = ( q$Revision: 2.10 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Encode qw(:fallbacks); + +use parent qw(Encode::Encoding); +__PACKAGE__->Define('hz'); + +# HZ is a combination of ASCII and escaped GB, so we implement it +# with the GB2312(raw) encoding here. Cf. RFCs 1842 & 1843. + +# not ported for EBCDIC. Which should be used, "~" or "\x7E"? + +sub needs_lines { 1 } + +sub decode ($$;$) { + my ( $obj, $str, $chk ) = @_; + return undef unless defined $str; + + my $GB = Encode::find_encoding('gb2312-raw'); + my $ret = substr($str, 0, 0); # to propagate taintedness + my $in_ascii = 1; # default mode is ASCII. + + while ( length $str ) { + if ($in_ascii) { # ASCII mode + if ( $str =~ s/^([\x00-\x7D\x7F]+)// ) { # no '~' => ASCII + $ret .= $1; + + # EBCDIC should need ascii2native, but not ported. + } + elsif ( $str =~ s/^\x7E\x7E// ) { # escaped tilde + $ret .= '~'; + } + elsif ( $str =~ s/^\x7E\cJ// ) { # '\cJ' == LF in ASCII + 1; # no-op + } + elsif ( $str =~ s/^\x7E\x7B// ) { # '~{' + $in_ascii = 0; # to GB + } + else { # encounters an invalid escape, \x80 or greater + last; + } + } + else { # GB mode; the byte ranges are as in RFC 1843. + no warnings 'uninitialized'; + if ( $str =~ s/^((?:[\x21-\x77][\x21-\x7E])+)// ) { + my $prefix = $1; + $ret .= $GB->decode( $prefix, $chk ); + } + elsif ( $str =~ s/^\x7E\x7D// ) { # '~}' + $in_ascii = 1; + } + else { # invalid + last; + } + } + } + $_[1] = '' if $chk; # needs_lines guarantees no partial character + return $ret; +} + +sub cat_decode { + my ( $obj, undef, $src, $pos, $trm, $chk ) = @_; + my ( $rdst, $rsrc, $rpos ) = \@_[ 1 .. 3 ]; + + my $GB = Encode::find_encoding('gb2312-raw'); + my $ret = ''; + my $in_ascii = 1; # default mode is ASCII. + + my $ini_pos = pos($$rsrc); + + substr( $src, 0, $pos ) = ''; + + my $ini_len = bytes::length($src); + + # $trm is the first of the pair '~~', then 2nd tilde is to be removed. + # XXX: Is better C<$src =~ s/^\x7E// or die if ...>? + $src =~ s/^\x7E// if $trm eq "\x7E"; + + while ( length $src ) { + my $now; + if ($in_ascii) { # ASCII mode + if ( $src =~ s/^([\x00-\x7D\x7F])// ) { # no '~' => ASCII + $now = $1; + } + elsif ( $src =~ s/^\x7E\x7E// ) { # escaped tilde + $now = '~'; + } + elsif ( $src =~ s/^\x7E\cJ// ) { # '\cJ' == LF in ASCII + next; + } + elsif ( $src =~ s/^\x7E\x7B// ) { # '~{' + $in_ascii = 0; # to GB + next; + } + else { # encounters an invalid escape, \x80 or greater + last; + } + } + else { # GB mode; the byte ranges are as in RFC 1843. + if ( $src =~ s/^((?:[\x21-\x77][\x21-\x7F])+)// ) { + $now = $GB->decode( $1, $chk ); + } + elsif ( $src =~ s/^\x7E\x7D// ) { # '~}' + $in_ascii = 1; + next; + } + else { # invalid + last; + } + } + + next if !defined $now; + + $ret .= $now; + + if ( $now eq $trm ) { + $$rdst .= $ret; + $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src); + pos($$rsrc) = $ini_pos; + return 1; + } + } + + $$rdst .= $ret; + $$rpos = $ini_pos + $pos + $ini_len - bytes::length($src); + pos($$rsrc) = $ini_pos; + return ''; # terminator not found +} + +sub encode($$;$) { + my ( $obj, $str, $chk ) = @_; + return undef unless defined $str; + + my $GB = Encode::find_encoding('gb2312-raw'); + my $ret = substr($str, 0, 0); # to propagate taintedness; + my $in_ascii = 1; # default mode is ASCII. + + no warnings 'utf8'; # $str may be malformed UTF8 at the end of a chunk. + + while ( length $str ) { + if ( $str =~ s/^([[:ascii:]]+)// ) { + my $tmp = $1; + $tmp =~ s/~/~~/g; # escapes tildes + if ( !$in_ascii ) { + $ret .= "\x7E\x7D"; # '~}' + $in_ascii = 1; + } + $ret .= pack 'a*', $tmp; # remove UTF8 flag. + } + elsif ( $str =~ s/(.)// ) { + my $s = $1; + my $tmp = $GB->encode( $s, $chk || 0 ); + last if !defined $tmp; + if ( length $tmp == 2 ) { # maybe a valid GB char (XXX) + if ($in_ascii) { + $ret .= "\x7E\x7B"; # '~{' + $in_ascii = 0; + } + $ret .= $tmp; + } + elsif ( length $tmp ) { # maybe FALLBACK in ASCII (XXX) + if ( !$in_ascii ) { + $ret .= "\x7E\x7D"; # '~}' + $in_ascii = 1; + } + $ret .= $tmp; + } + } + else { # if $str is malformed UTF8 *and* if length $str != 0. + last; + } + } + $_[1] = $str if $chk; + + # The state at the end of the chunk is discarded, even if in GB mode. + # That results in the combination of GB-OUT and GB-IN, i.e. "~}~{". + # Parhaps it is harmless, but further investigations may be required... + + if ( !$in_ascii ) { + $ret .= "\x7E\x7D"; # '~}' + $in_ascii = 1; + } + utf8::encode($ret); # https://rt.cpan.org/Ticket/Display.html?id=35120 + return $ret; +} + +1; +__END__ + +package Encode::MIME::Header; +use strict; +use warnings; + +our $VERSION = do { my @r = ( q$Revision: 2.28 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +use Carp (); +use Encode (); +use MIME::Base64 (); + +my %seed = ( + decode_b => 1, # decodes 'B' encoding ? + decode_q => 1, # decodes 'Q' encoding ? + encode => 'B', # encode with 'B' or 'Q' ? + charset => 'UTF-8', # encode charset + bpl => 75, # bytes per line +); + +my @objs; + +push @objs, bless { + %seed, + Name => 'MIME-Header', +} => __PACKAGE__; + +push @objs, bless { + %seed, + decode_q => 0, + Name => 'MIME-B', +} => __PACKAGE__; + +push @objs, bless { + %seed, + decode_b => 0, + encode => 'Q', + Name => 'MIME-Q', +} => __PACKAGE__; + +Encode::define_encoding($_, $_->{Name}) foreach @objs; + +use parent qw(Encode::Encoding); + +sub needs_lines { 1 } +sub perlio_ok { 0 } + +# RFC 2047 and RFC 2231 grammar +my $re_charset = qr/[!"#\$%&'+\-0-9A-Z\\\^_`a-z\{\|\}~]+/; +my $re_language = qr/[A-Za-z]{1,8}(?:-[0-9A-Za-z]{1,8})*/; +my $re_encoding = qr/[QqBb]/; +my $re_encoded_text = qr/[^\?]*/; +my $re_encoded_word = qr/=\?$re_charset(?:\*$re_language)?\?$re_encoding\?$re_encoded_text\?=/; +my $re_capture_encoded_word = qr/=\?($re_charset)((?:\*$re_language)?)\?($re_encoding\?$re_encoded_text)\?=/; +my $re_capture_encoded_word_split = qr/=\?($re_charset)((?:\*$re_language)?)\?($re_encoding)\?($re_encoded_text)\?=/; + +# in strict mode check also for valid base64 characters and also for valid quoted printable codes +my $re_encoding_strict_b = qr/[Bb]/; +my $re_encoding_strict_q = qr/[Qq]/; +my $re_encoded_text_strict_b = qr/[0-9A-Za-z\+\/]*={0,2}/; +my $re_encoded_text_strict_q = qr/(?:[\x21-\x3C\x3E\x40-\x7E]|=[0-9A-Fa-f]{2})*/; # NOTE: first part are printable US-ASCII except ?, =, SPACE and TAB +my $re_encoded_word_strict = qr/=\?$re_charset(?:\*$re_language)?\?(?:$re_encoding_strict_b\?$re_encoded_text_strict_b|$re_encoding_strict_q\?$re_encoded_text_strict_q)\?=/; +my $re_capture_encoded_word_strict = qr/=\?($re_charset)((?:\*$re_language)?)\?($re_encoding_strict_b\?$re_encoded_text_strict_b|$re_encoding_strict_q\?$re_encoded_text_strict_q)\?=/; + +my $re_newline = qr/(?:\r\n|[\r\n])/; + +# in strict mode encoded words must be always separated by spaces or tabs (or folded newline) +# except in comments when separator between words and comment round brackets can be omitted +my $re_word_begin_strict = qr/(?:(?:[ \t]|\A)\(?|(?:[^\\]|\A)\)\()/; +my $re_word_sep_strict = qr/(?:$re_newline?[ \t])+/; +my $re_word_end_strict = qr/(?:\)\(|\)?(?:$re_newline?[ \t]|\z))/; + +my $re_match = qr/()((?:$re_encoded_word\s*)*$re_encoded_word)()/; +my $re_match_strict = qr/($re_word_begin_strict)((?:$re_encoded_word_strict$re_word_sep_strict)*$re_encoded_word_strict)(?=$re_word_end_strict)/; + +my $re_capture = qr/$re_capture_encoded_word(?:\s*)?/; +my $re_capture_strict = qr/$re_capture_encoded_word_strict$re_word_sep_strict?/; + +our $STRICT_DECODE = 0; + +sub decode($$;$) { + my ($obj, $str, $chk) = @_; + return undef unless defined $str; + + my $re_match_decode = $STRICT_DECODE ? $re_match_strict : $re_match; + my $re_capture_decode = $STRICT_DECODE ? $re_capture_strict : $re_capture; + + my $stop = 0; + my $output = substr($str, 0, 0); # to propagate taintedness + + # decode each line separately, match whole continuous folded line at one call + 1 while not $stop and $str =~ s{^((?:[^\r\n]*(?:$re_newline[ \t])?)*)($re_newline)?}{ + + my $line = $1; + my $sep = defined $2 ? $2 : ''; + + $stop = 1 unless length($line) or length($sep); + + # NOTE: this code partially could break $chk support + # in non strict mode concat consecutive encoded mime words with same charset, language and encoding + # fixes breaking inside multi-byte characters + 1 while not $STRICT_DECODE and $line =~ s/$re_capture_encoded_word_split\s*=\?\1\2\?\3\?($re_encoded_text)\?=/=\?$1$2\?$3\?$4$5\?=/so; + + # process sequence of encoded MIME words at once + 1 while not $stop and $line =~ s{^(.*?)$re_match_decode}{ + + my $begin = $1 . $2; + my $words = $3; + + $begin =~ tr/\r\n//d; + $output .= $begin; + + # decode one MIME word + 1 while not $stop and $words =~ s{^(.*?)($re_capture_decode)}{ + + $output .= $1; + my $orig = $2; + my $charset = $3; + my ($mime_enc, $text) = split /\?/, $5; + + $text =~ tr/\r\n//d; + + my $enc = Encode::find_mime_encoding($charset); + + # in non strict mode allow also perl encoding aliases + if ( not defined $enc and not $STRICT_DECODE ) { + # make sure that decoded string will be always strict UTF-8 + $charset = 'UTF-8' if lc($charset) eq 'utf8'; + $enc = Encode::find_encoding($charset); + } + + if ( not defined $enc ) { + Carp::croak qq(Unknown charset "$charset") if not ref $chk and $chk and $chk & Encode::DIE_ON_ERR; + Carp::carp qq(Unknown charset "$charset") if not ref $chk and $chk and $chk & Encode::WARN_ON_ERR; + $stop = 1 if not ref $chk and $chk and $chk & Encode::RETURN_ON_ERR; + $output .= ($output =~ /(?:\A|[ \t])$/ ? '' : ' ') . $orig unless $stop; # $orig mime word is separated by whitespace + $stop ? $orig : ''; + } else { + if ( uc($mime_enc) eq 'B' and $obj->{decode_b} ) { + my $decoded = _decode_b($enc, $text, $chk); + $stop = 1 if not defined $decoded and not ref $chk and $chk and $chk & Encode::RETURN_ON_ERR; + $output .= (defined $decoded ? $decoded : $text) unless $stop; + $stop ? $orig : ''; + } elsif ( uc($mime_enc) eq 'Q' and $obj->{decode_q} ) { + my $decoded = _decode_q($enc, $text, $chk); + $stop = 1 if not defined $decoded and not ref $chk and $chk and $chk & Encode::RETURN_ON_ERR; + $output .= (defined $decoded ? $decoded : $text) unless $stop; + $stop ? $orig : ''; + } else { + Carp::croak qq(MIME "$mime_enc" unsupported) if not ref $chk and $chk and $chk & Encode::DIE_ON_ERR; + Carp::carp qq(MIME "$mime_enc" unsupported) if not ref $chk and $chk and $chk & Encode::WARN_ON_ERR; + $stop = 1 if not ref $chk and $chk and $chk & Encode::RETURN_ON_ERR; + $output .= ($output =~ /(?:\A|[ \t])$/ ? '' : ' ') . $orig unless $stop; # $orig mime word is separated by whitespace + $stop ? $orig : ''; + } + } + + }se; + + if ( not $stop ) { + $output .= $words; + $words = ''; + } + + $words; + + }se; + + if ( not $stop ) { + $line =~ tr/\r\n//d; + $output .= $line . $sep; + $line = ''; + $sep = ''; + } + + $line . $sep; + + }se; + + $_[1] = $str if not ref $chk and $chk and !($chk & Encode::LEAVE_SRC); + return $output; +} + +sub _decode_b { + my ($enc, $text, $chk) = @_; + # MIME::Base64::decode ignores everything after a '=' padding character + # in non strict mode split string after each sequence of padding characters and decode each substring + my $octets = $STRICT_DECODE ? + MIME::Base64::decode($text) : + join('', map { MIME::Base64::decode($_) } split /(?<==)(?=[^=])/, $text); + return _decode_octets($enc, $octets, $chk); +} + +sub _decode_q { + my ($enc, $text, $chk) = @_; + $text =~ s/_/ /go; + $text =~ s/=([0-9A-Fa-f]{2})/pack('C', hex($1))/ego; + return _decode_octets($enc, $text, $chk); +} + +sub _decode_octets { + my ($enc, $octets, $chk) = @_; + $chk = 0 unless defined $chk; + $chk &= ~Encode::LEAVE_SRC if not ref $chk and $chk; + my $output = $enc->decode($octets, $chk); + return undef if not ref $chk and $chk and $octets ne ''; + return $output; +} + +sub encode($$;$) { + my ($obj, $str, $chk) = @_; + return undef unless defined $str; + my $output = $obj->_fold_line($obj->_encode_string($str, $chk)); + $_[1] = $str if not ref $chk and $chk and !($chk & Encode::LEAVE_SRC); + return $output . substr($str, 0, 0); # to propagate taintedness +} + +sub _fold_line { + my ($obj, $line) = @_; + my $bpl = $obj->{bpl}; + my $output = ''; + + while ( length($line) ) { + if ( $line =~ s/^(.{0,$bpl})(\s|\z)// ) { + $output .= $1; + $output .= "\r\n" . $2 if length($line); + } elsif ( $line =~ s/(\s)(.*)$// ) { + $output .= $line; + $line = $2; + $output .= "\r\n" . $1 if length($line); + } else { + $output .= $line; + last; + } + } + + return $output; +} + +sub _encode_string { + my ($obj, $str, $chk) = @_; + my $wordlen = $obj->{bpl} > 76 ? 76 : $obj->{bpl}; + my $enc = Encode::find_mime_encoding($obj->{charset}); + my $enc_chk = $chk; + $enc_chk = 0 unless defined $enc_chk; + $enc_chk |= Encode::LEAVE_SRC if not ref $enc_chk and $enc_chk; + my @result = (); + my $octets = ''; + while ( length( my $chr = substr($str, 0, 1, '') ) ) { + my $seq = $enc->encode($chr, $enc_chk); + if ( not length($seq) ) { + substr($str, 0, 0, $chr); + last; + } + if ( $obj->_encoded_word_len($octets . $seq) > $wordlen ) { + push @result, $obj->_encode_word($octets); + $octets = ''; + } + $octets .= $seq; + } + length($octets) and push @result, $obj->_encode_word($octets); + $_[1] = $str if not ref $chk and $chk and !($chk & Encode::LEAVE_SRC); + return join(' ', @result); +} + +sub _encode_word { + my ($obj, $octets) = @_; + my $charset = $obj->{charset}; + my $encode = $obj->{encode}; + my $text = $encode eq 'B' ? _encode_b($octets) : _encode_q($octets); + return "=?$charset?$encode?$text?="; +} + +sub _encoded_word_len { + my ($obj, $octets) = @_; + my $charset = $obj->{charset}; + my $encode = $obj->{encode}; + my $text_len = $encode eq 'B' ? _encoded_b_len($octets) : _encoded_q_len($octets); + return length("=?$charset?$encode??=") + $text_len; +} + +sub _encode_b { + my ($octets) = @_; + return MIME::Base64::encode($octets, ''); +} + +sub _encoded_b_len { + my ($octets) = @_; + return ( length($octets) + 2 ) / 3 * 4; +} + +my $re_invalid_q_char = qr/[^0-9A-Za-z !*+\-\/]/; + +sub _encode_q { + my ($octets) = @_; + $octets =~ s{($re_invalid_q_char)}{ + join('', map { sprintf('=%02X', $_) } unpack('C*', $1)) + }egox; + $octets =~ s/ /_/go; + return $octets; +} + +sub _encoded_q_len { + my ($octets) = @_; + my $invalid_count = () = $octets =~ /$re_invalid_q_char/sgo; + return ( $invalid_count * 3 ) + ( length($octets) - $invalid_count ); +} + +1; +__END__ + +package Encode::MIME::Name; +use strict; +use warnings; +our $VERSION = do { my @r = ( q$Revision: 1.3 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +# NOTE: This table must be 1:1 mapping +our %MIME_NAME_OF = ( + 'AdobeStandardEncoding' => 'Adobe-Standard-Encoding', + 'AdobeSymbol' => 'Adobe-Symbol-Encoding', + 'ascii' => 'US-ASCII', + 'big5-hkscs' => 'Big5-HKSCS', + 'cp1026' => 'IBM1026', + 'cp1047' => 'IBM1047', + 'cp1250' => 'windows-1250', + 'cp1251' => 'windows-1251', + 'cp1252' => 'windows-1252', + 'cp1253' => 'windows-1253', + 'cp1254' => 'windows-1254', + 'cp1255' => 'windows-1255', + 'cp1256' => 'windows-1256', + 'cp1257' => 'windows-1257', + 'cp1258' => 'windows-1258', + 'cp37' => 'IBM037', + 'cp424' => 'IBM424', + 'cp437' => 'IBM437', + 'cp500' => 'IBM500', + 'cp775' => 'IBM775', + 'cp850' => 'IBM850', + 'cp852' => 'IBM852', + 'cp855' => 'IBM855', + 'cp857' => 'IBM857', + 'cp860' => 'IBM860', + 'cp861' => 'IBM861', + 'cp862' => 'IBM862', + 'cp863' => 'IBM863', + 'cp864' => 'IBM864', + 'cp865' => 'IBM865', + 'cp866' => 'IBM866', + 'cp869' => 'IBM869', + 'cp936' => 'GBK', + 'euc-cn' => 'EUC-CN', + 'euc-jp' => 'EUC-JP', + 'euc-kr' => 'EUC-KR', + #'gb2312-raw' => 'GB2312', # no, you're wrong, I18N::Charset + 'hp-roman8' => 'hp-roman8', + 'hz' => 'HZ-GB-2312', + 'iso-2022-jp' => 'ISO-2022-JP', + 'iso-2022-jp-1' => 'ISO-2022-JP-1', + 'iso-2022-kr' => 'ISO-2022-KR', + 'iso-8859-1' => 'ISO-8859-1', + 'iso-8859-10' => 'ISO-8859-10', + 'iso-8859-13' => 'ISO-8859-13', + 'iso-8859-14' => 'ISO-8859-14', + 'iso-8859-15' => 'ISO-8859-15', + 'iso-8859-16' => 'ISO-8859-16', + 'iso-8859-2' => 'ISO-8859-2', + 'iso-8859-3' => 'ISO-8859-3', + 'iso-8859-4' => 'ISO-8859-4', + 'iso-8859-5' => 'ISO-8859-5', + 'iso-8859-6' => 'ISO-8859-6', + 'iso-8859-7' => 'ISO-8859-7', + 'iso-8859-8' => 'ISO-8859-8', + 'iso-8859-9' => 'ISO-8859-9', + #'jis0201-raw' => 'JIS_X0201', + #'jis0208-raw' => 'JIS_C6226-1983', + #'jis0212-raw' => 'JIS_X0212-1990', + 'koi8-r' => 'KOI8-R', + 'koi8-u' => 'KOI8-U', + #'ksc5601-raw' => 'KS_C_5601-1987', + 'shiftjis' => 'Shift_JIS', + 'UTF-16' => 'UTF-16', + 'UTF-16BE' => 'UTF-16BE', + 'UTF-16LE' => 'UTF-16LE', + 'UTF-32' => 'UTF-32', + 'UTF-32BE' => 'UTF-32BE', + 'UTF-32LE' => 'UTF-32LE', + 'UTF-7' => 'UTF-7', + 'utf-8-strict' => 'UTF-8', + 'viscii' => 'VISCII', +); + +# NOTE: %MIME_NAME_OF is still 1:1 mapping +our %ENCODE_NAME_OF = map { uc $MIME_NAME_OF{$_} => $_ } keys %MIME_NAME_OF; + +# Add additional 1:N mapping +$MIME_NAME_OF{'utf8'} = 'UTF-8'; + +sub get_mime_name($) { $MIME_NAME_OF{$_[0]} }; + +sub get_encode_name($) { $ENCODE_NAME_OF{uc $_[0]} }; + +1; +__END__ + +package Encode::MIME::Header::ISO_2022_JP; + +use strict; +use warnings; + +use parent qw(Encode::MIME::Header); + +my $obj = + bless { decode_b => '1', decode_q => '1', encode => 'B', bpl => 76, Name => 'MIME-Header-ISO_2022_JP' } => + __PACKAGE__; +Encode::define_encoding($obj, 'MIME-Header-ISO_2022_JP'); + +use constant HEAD => '=?ISO-2022-JP?B?'; +use constant TAIL => '?='; + +use Encode::CJKConstants qw(%RE); + +our $VERSION = do { my @r = ( q$Revision: 1.9 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r }; + +# I owe the below codes totally to +# Jcode by Dan Kogai & http://www.din.or.jp/~ohzaki/perl.htm#JP_Base64 + +sub encode { + my $self = shift; + my $str = shift; + return undef unless defined $str; + + utf8::encode($str) if ( Encode::is_utf8($str) ); + Encode::from_to( $str, 'utf8', 'euc-jp' ); + + my ($trailing_crlf) = ( $str =~ /(\n|\r|\x0d\x0a)$/o ); + + $str = _mime_unstructured_header( $str, $self->{bpl} ); + + not $trailing_crlf and $str =~ s/(\n|\r|\x0d\x0a)$//o; + + return $str; +} + +sub _mime_unstructured_header { + my ( $oldheader, $bpl ) = @_; + my $crlf = $oldheader =~ /\n$/; + my ( $header, @words, @wordstmp, $i ) = (''); + + $oldheader =~ s/\s+$//; + + @wordstmp = split /\s+/, $oldheader; + + for ( $i = 0 ; $i < $#wordstmp ; $i++ ) { + if ( $wordstmp[$i] !~ /^[\x21-\x7E]+$/ + and $wordstmp[ $i + 1 ] !~ /^[\x21-\x7E]+$/ ) + { + $wordstmp[ $i + 1 ] = "$wordstmp[$i] $wordstmp[$i + 1]"; + } + else { + push( @words, $wordstmp[$i] ); + } + } + + push( @words, $wordstmp[-1] ); + + for my $word (@words) { + if ( $word =~ /^[\x21-\x7E]+$/ ) { + $header =~ /(?:.*\n)*(.*)/; + if ( length($1) + length($word) > $bpl ) { + $header .= "\n $word"; + } + else { + $header .= $word; + } + } + else { + $header = _add_encoded_word( $word, $header, $bpl ); + } + + $header =~ /(?:.*\n)*(.*)/; + + if ( length($1) == $bpl ) { + $header .= "\n "; + } + else { + $header .= ' '; + } + } + + $header =~ s/\n? $//mg; + + $crlf ? "$header\n" : $header; +} + +sub _add_encoded_word { + my ( $str, $line, $bpl ) = @_; + my $result = ''; + + while ( length($str) ) { + my $target = $str; + $str = ''; + + if ( + length($line) + 22 + + ( $target =~ /^(?:$RE{EUC_0212}|$RE{EUC_C})/o ) * 8 > $bpl ) + { + $line =~ s/[ \t\n\r]*$/\n/; + $result .= $line; + $line = ' '; + } + + while (1) { + my $iso_2022_jp = $target; + Encode::from_to( $iso_2022_jp, 'euc-jp', 'iso-2022-jp' ); + + my $encoded = + HEAD . MIME::Base64::encode_base64( $iso_2022_jp, '' ) . TAIL; + + if ( length($encoded) + length($line) > $bpl ) { + $target =~ + s/($RE{EUC_0212}|$RE{EUC_KANA}|$RE{EUC_C}|$RE{ASCII})$//o; + $str = $1 . $str; + } + else { + $line .= $encoded; + last; + } + } + + } + + $result . $line; +} + +1; +__END__ + +package I18N::Langinfo; + +use 5.006; +use strict; +use warnings; +use Carp; + +require Exporter; +require XSLoader; + +our @ISA = qw(Exporter); + +our @EXPORT = qw(langinfo); + +our @EXPORT_OK = qw( + ABDAY_1 + ABDAY_2 + ABDAY_3 + ABDAY_4 + ABDAY_5 + ABDAY_6 + ABDAY_7 + ABMON_1 + ABMON_10 + ABMON_11 + ABMON_12 + ABMON_2 + ABMON_3 + ABMON_4 + ABMON_5 + ABMON_6 + ABMON_7 + ABMON_8 + ABMON_9 + ALT_DIGITS + AM_STR + CODESET + CRNCYSTR + DAY_1 + DAY_2 + DAY_3 + DAY_4 + DAY_5 + DAY_6 + DAY_7 + D_FMT + D_T_FMT + ERA + ERA_D_FMT + ERA_D_T_FMT + ERA_T_FMT + MON_1 + MON_10 + MON_11 + MON_12 + MON_2 + MON_3 + MON_4 + MON_5 + MON_6 + MON_7 + MON_8 + MON_9 + NOEXPR + NOSTR + PM_STR + RADIXCHAR + THOUSEP + T_FMT + T_FMT_AMPM + YESEXPR + YESSTR +); + +our $VERSION = '0.17'; + +XSLoader::load(); + +1; +__END__ + +package PerlIO::encoding; + +use strict; +our $VERSION = '0.26'; +our $DEBUG = 0; +$DEBUG and warn __PACKAGE__, " called by ", join(", ", caller), "\n"; + +# +# Equivalent of this is done in encoding.xs - do not uncomment. +# +# use Encode (); + +require XSLoader; +XSLoader::load(); + +our $fallback = + Encode::PERLQQ()|Encode::WARN_ON_ERR()|Encode::STOP_AT_PARTIAL(); + +1; +__END__ + +package PerlIO::via; +our $VERSION = '0.17'; +require XSLoader; +XSLoader::load(); +1; +__END__ + +package PerlIO::scalar; +our $VERSION = '0.29'; +require XSLoader; +XSLoader::load(); +1; +__END__ + +# Devel::Peek - A data debugging tool for the XS programmer +# The documentation is after the __END__ + +package Devel::Peek; + +$VERSION = '1.27'; +$XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +require Exporter; +require XSLoader; + +@ISA = qw(Exporter); +@EXPORT = qw(Dump mstat DeadCode DumpArray DumpWithOP DumpProg + fill_mstats mstats_fillhash mstats2hash runops_debug debug_flags); +@EXPORT_OK = qw(SvREFCNT CvGV); +%EXPORT_TAGS = ('ALL' => [@EXPORT, @EXPORT_OK]); + +XSLoader::load(); + +sub import { + my $c = shift; + my $ops_rx = qr/^:opd(=[stP]*)?\b/; + my @db = grep m/$ops_rx/, @_; + @_ = grep !m/$ops_rx/, @_; + if (@db) { + die "Too many :opd options" if @db > 1; + runops_debug(1); + my $flags = ($db[0] =~ m/$ops_rx/ and $1); + $flags = 'st' unless defined $flags; + my $f = 0; + $f |= 2 if $flags =~ /s/; + $f |= 8 if $flags =~ /t/; + $f |= 64 if $flags =~ /P/; + $^D |= $f if $f; + } + unshift @_, $c; + goto &Exporter::import; +} + +sub DumpWithOP ($;$) { + local($Devel::Peek::dump_ops)=1; + my $depth = @_ > 1 ? $_[1] : 4 ; + Dump($_[0],$depth); +} + +$D_flags = 'psltocPmfrxuLHXDSTR'; + +sub debug_flags (;$) { + my $out = ""; + for my $i (0 .. length($D_flags)-1) { + $out .= substr $D_flags, $i, 1 if $^D & (1<<$i); + } + my $arg = shift; + my $num = $arg; + if (defined $arg and $arg =~ /\D/) { + die "unknown flags in debug_flags()" if $arg =~ /[^-$D_flags]/; + my ($on,$off) = split /-/, "$arg-"; + $num = $^D; + $num |= (1<<index($D_flags, $_)) for split //, $on; + $num &= ~(1<<index($D_flags, $_)) for split //, $off; + } + $^D = $num if defined $arg; + $out +} + +sub B::Deparse::pp_Devel_Peek_Dump { + my ($deparse,$op,$cx) = @_; + my @kids = $deparse->deparse($op->first, 6); + my $sib = $op->first->sibling; + if (ref $sib ne 'B::NULL') { + push @kids, $deparse->deparse($sib, 6); + } + return "Devel::Peek::Dump(" . join(", ", @kids) . ")"; +} + +1; +__END__ + +package Unicode::Normalize; + +BEGIN { + unless ('A' eq pack('U', 0x41)) { + die "Unicode::Normalize cannot stringify a Unicode code point\n"; + } + unless (0x41 == unpack('U', 'A')) { + die "Unicode::Normalize cannot get Unicode code point\n"; + } +} + +use 5.006; +use strict; +use warnings; +use Carp; + +no warnings 'utf8'; + +our $VERSION = '1.26'; +our $PACKAGE = __PACKAGE__; + +our @EXPORT = qw( NFC NFD NFKC NFKD ); +our @EXPORT_OK = qw( + normalize decompose reorder compose + checkNFD checkNFKD checkNFC checkNFKC check + getCanon getCompat getComposite getCombinClass + isExclusion isSingleton isNonStDecomp isComp2nd isComp_Ex + isNFD_NO isNFC_NO isNFC_MAYBE isNFKD_NO isNFKC_NO isNFKC_MAYBE + FCD checkFCD FCC checkFCC composeContiguous splitOnLastStarter + normalize_partial NFC_partial NFD_partial NFKC_partial NFKD_partial +); +our %EXPORT_TAGS = ( + all => [ @EXPORT, @EXPORT_OK ], + normalize => [ @EXPORT, qw/normalize decompose reorder compose/ ], + check => [ qw/checkNFD checkNFKD checkNFC checkNFKC check/ ], + fast => [ qw/FCD checkFCD FCC checkFCC composeContiguous/ ], +); + +## +## utilities for tests +## + +sub pack_U { + return pack('U*', @_); +} + +sub unpack_U { + + # The empty pack returns an empty UTF-8 string, so the effect is to force + # the shifted parameter into being UTF-8. This allows this to work on + # Perl 5.6, where there is no utf8::upgrade(). + return unpack('U*', shift(@_).pack('U*')); +} + +require Exporter; + +##### The above part is common to XS and PP ##### + +our @ISA = qw(Exporter); +use XSLoader (); +XSLoader::load( 'Unicode::Normalize', $VERSION ); + +##### The below part is common to XS and PP ##### + +## +## normalize +## + +sub FCD ($) { + my $str = shift; + return checkFCD($str) ? $str : NFD($str); +} + +our %formNorm = ( + NFC => \&NFC, C => \&NFC, + NFD => \&NFD, D => \&NFD, + NFKC => \&NFKC, KC => \&NFKC, + NFKD => \&NFKD, KD => \&NFKD, + FCD => \&FCD, FCC => \&FCC, +); + +sub normalize($$) +{ + my $form = shift; + my $str = shift; + if (exists $formNorm{$form}) { + return $formNorm{$form}->($str); + } + croak($PACKAGE."::normalize: invalid form name: $form"); +} + +## +## partial +## + +sub normalize_partial ($$) { + if (exists $formNorm{$_[0]}) { + my $n = normalize($_[0], $_[1]); + my($p, $u) = splitOnLastStarter($n); + $_[1] = $u; + return $p; + } + croak($PACKAGE."::normalize_partial: invalid form name: $_[0]"); +} + +sub NFD_partial ($) { return normalize_partial('NFD', $_[0]) } +sub NFC_partial ($) { return normalize_partial('NFC', $_[0]) } +sub NFKD_partial($) { return normalize_partial('NFKD',$_[0]) } +sub NFKC_partial($) { return normalize_partial('NFKC',$_[0]) } + +## +## check +## + +our %formCheck = ( + NFC => \&checkNFC, C => \&checkNFC, + NFD => \&checkNFD, D => \&checkNFD, + NFKC => \&checkNFKC, KC => \&checkNFKC, + NFKD => \&checkNFKD, KD => \&checkNFKD, + FCD => \&checkFCD, FCC => \&checkFCC, +); + +sub check($$) +{ + my $form = shift; + my $str = shift; + if (exists $formCheck{$form}) { + return $formCheck{$form}->($str); + } + croak($PACKAGE."::check: invalid form name: $form"); +} + +1; +__END__ + + +# IO::Poll.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Poll; + +use strict; +use IO::Handle; +use Exporter (); + +our @ISA = qw(Exporter); +our $VERSION = "1.39"; + +our @EXPORT = qw( POLLIN + POLLOUT + POLLERR + POLLHUP + POLLNVAL + ); + +our @EXPORT_OK = qw( + POLLPRI + POLLRDNORM + POLLWRNORM + POLLRDBAND + POLLWRBAND + POLLNORM + ); + +# [0] maps fd's to requested masks +# [1] maps fd's to returned masks +# [2] maps fd's to handles +sub new { + my $class = shift; + + my $self = bless [{},{},{}], $class; + + $self; +} + +sub mask { + my $self = shift; + my $io = shift; + my $fd = fileno($io); + return unless defined $fd; + if (@_) { + my $mask = shift; + if($mask) { + $self->[0]{$fd}{$io} = $mask; # the error events are always returned + $self->[1]{$fd} = 0; # output mask + $self->[2]{$io} = $io; # remember handle + } else { + delete $self->[0]{$fd}{$io}; + unless(%{$self->[0]{$fd}}) { + # We no longer have any handles for this FD + delete $self->[1]{$fd}; + delete $self->[0]{$fd}; + } + delete $self->[2]{$io}; + } + } + + return unless exists $self->[0]{$fd} and exists $self->[0]{$fd}{$io}; + return $self->[0]{$fd}{$io}; +} + + +sub poll { + my($self,$timeout) = @_; + + $self->[1] = {}; + + my($fd,$mask,$iom); + my @poll = (); + + while(($fd,$iom) = each %{$self->[0]}) { + $mask = 0; + $mask |= $_ for values(%$iom); + push(@poll,$fd => $mask); + } + + my $ret = _poll(defined($timeout) ? $timeout * 1000 : -1,@poll); + + return $ret + unless $ret > 0; + + while(@poll) { + my($fd,$got) = splice(@poll,0,2); + $self->[1]{$fd} = $got if $got; + } + + return $ret; +} + +sub events { + my $self = shift; + my $io = shift; + my $fd = fileno($io); + exists $self->[1]{$fd} and exists $self->[0]{$fd}{$io} + ? $self->[1]{$fd} & ($self->[0]{$fd}{$io}|POLLHUP|POLLERR|POLLNVAL) + : 0; +} + +sub remove { + my $self = shift; + my $io = shift; + $self->mask($io,0); +} + +sub handles { + my $self = shift; + return values %{$self->[2]} unless @_; + + my $events = shift || 0; + my($fd,$ev,$io,$mask); + my @handles = (); + + while(($fd,$ev) = each %{$self->[1]}) { + while (($io,$mask) = each %{$self->[0]{$fd}}) { + $mask |= POLLHUP|POLLERR|POLLNVAL; # must allow these + push @handles,$self->[2]{$io} if ($ev & $mask) & $events; + } + } + return @handles; +} + +1; + +__END__ + +# + +package IO::Seekable; + + +use 5.008_001; +use Carp; +use strict; +use IO::Handle (); +# XXX we can't get these from IO::Handle or we'll get prototype +# mismatch warnings on C<use POSIX; use IO::File;> :-( +use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END); +require Exporter; + +our @EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END); +our @ISA = qw(Exporter); + +our $VERSION = "1.39"; + +sub seek { + @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)'; + seek($_[0], $_[1], $_[2]); +} + +sub sysseek { + @_ == 3 or croak 'usage: $io->sysseek(POS, WHENCE)'; + sysseek($_[0], $_[1], $_[2]); +} + +sub tell { + @_ == 1 or croak 'usage: $io->tell()'; + tell($_[0]); +} + +1; +# + +package IO::File; + + +use 5.008_001; +use strict; +use Carp; +use Symbol; +use SelectSaver; +use IO::Seekable; + +require Exporter; + +our @ISA = qw(IO::Handle IO::Seekable Exporter); + +our $VERSION = "1.39"; + +our @EXPORT = @IO::Seekable::EXPORT; + +eval { + # Make all Fcntl O_XXX constants available for importing + require Fcntl; + my @O = grep /^O_/, @Fcntl::EXPORT; + Fcntl->import(@O); # first we import what we want to export + push(@EXPORT, @O); +}; + +################################################ +## Constructor +## + +sub new { + my $type = shift; + my $class = ref($type) || $type || "IO::File"; + @_ >= 0 && @_ <= 3 + or croak "usage: $class->new([FILENAME [,MODE [,PERMS]]])"; + my $fh = $class->SUPER::new(); + if (@_) { + $fh->open(@_) + or return undef; + } + $fh; +} + +################################################ +## Open +## + +sub open { + @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])'; + my ($fh, $file) = @_; + if (@_ > 2) { + my ($mode, $perms) = @_[2, 3]; + if ($mode =~ /^\d+$/) { + defined $perms or $perms = 0666; + return sysopen($fh, $file, $mode, $perms); + } elsif ($mode =~ /:/) { + return open($fh, $mode, $file) if @_ == 3; + croak 'usage: $fh->open(FILENAME, IOLAYERS)'; + } else { + return open($fh, IO::Handle::_open_mode_string($mode), $file); + } + } + open($fh, $file); +} + +################################################ +## Binmode +## + +sub binmode { + ( @_ == 1 or @_ == 2 ) or croak 'usage $fh->binmode([LAYER])'; + + my($fh, $layer) = @_; + + return binmode $$fh unless $layer; + return binmode $$fh, $layer; +} + +1; + +# IO::Socket.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Socket; + +use 5.008_001; + +use IO::Handle; +use Socket 1.3; +use Carp; +use strict; +use Exporter; +use Errno; + +# legacy + +require IO::Socket::INET; +require IO::Socket::UNIX if ($^O ne 'epoc' && $^O ne 'symbian'); + +our @ISA = qw(IO::Handle); + +our $VERSION = "1.39"; + +our @EXPORT_OK = qw(sockatmark); + +sub import { + my $pkg = shift; + if (@_ && $_[0] eq 'sockatmark') { # not very extensible but for now, fast + Exporter::export_to_level('IO::Socket', 1, $pkg, 'sockatmark'); + } else { + my $callpkg = caller; + Exporter::export 'Socket', $callpkg, @_; + } +} + +sub new { + my($class,%arg) = @_; + my $sock = $class->SUPER::new(); + + $sock->autoflush(1); + + ${*$sock}{'io_socket_timeout'} = delete $arg{Timeout}; + + return scalar(%arg) ? $sock->configure(\%arg) + : $sock; +} + +my @domain2pkg; + +sub register_domain { + my($p,$d) = @_; + $domain2pkg[$d] = $p; +} + +sub configure { + my($sock,$arg) = @_; + my $domain = delete $arg->{Domain}; + + croak 'IO::Socket: Cannot configure a generic socket' + unless defined $domain; + + croak "IO::Socket: Unsupported socket domain" + unless defined $domain2pkg[$domain]; + + croak "IO::Socket: Cannot configure socket in domain '$domain'" + unless ref($sock) eq "IO::Socket"; + + bless($sock, $domain2pkg[$domain]); + $sock->configure($arg); +} + +sub socket { + @_ == 4 or croak 'usage: $sock->socket(DOMAIN, TYPE, PROTOCOL)'; + my($sock,$domain,$type,$protocol) = @_; + + socket($sock,$domain,$type,$protocol) or + return undef; + + ${*$sock}{'io_socket_domain'} = $domain; + ${*$sock}{'io_socket_type'} = $type; + ${*$sock}{'io_socket_proto'} = $protocol; + + $sock; +} + +sub socketpair { + @_ == 4 || croak 'usage: IO::Socket->socketpair(DOMAIN, TYPE, PROTOCOL)'; + my($class,$domain,$type,$protocol) = @_; + my $sock1 = $class->new(); + my $sock2 = $class->new(); + + socketpair($sock1,$sock2,$domain,$type,$protocol) or + return (); + + ${*$sock1}{'io_socket_type'} = ${*$sock2}{'io_socket_type'} = $type; + ${*$sock1}{'io_socket_proto'} = ${*$sock2}{'io_socket_proto'} = $protocol; + + ($sock1,$sock2); +} + +sub connect { + @_ == 2 or croak 'usage: $sock->connect(NAME)'; + my $sock = shift; + my $addr = shift; + my $timeout = ${*$sock}{'io_socket_timeout'}; + my $err; + my $blocking; + + $blocking = $sock->blocking(0) if $timeout; + if (!connect($sock, $addr)) { + if (defined $timeout && ($!{EINPROGRESS} || $!{EWOULDBLOCK})) { + require IO::Select; + + my $sel = new IO::Select $sock; + + undef $!; + my($r,$w,$e) = IO::Select::select(undef,$sel,$sel,$timeout); + if(@$e[0]) { + # Windows return from select after the timeout in case of + # WSAECONNREFUSED(10061) if exception set is not used. + # This behavior is different from Linux. + # Using the exception + # set we now emulate the behavior in Linux + # - Karthik Rajagopalan + $err = $sock->getsockopt(SOL_SOCKET,SO_ERROR); + $@ = "connect: $err"; + } + elsif(!@$w[0]) { + $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1); + $@ = "connect: timeout"; + } + elsif (!connect($sock,$addr) && + not ($!{EISCONN} || ($^O eq 'MSWin32' && + ($! == (($] < 5.019004) ? 10022 : Errno::EINVAL)))) + ) { + # Some systems refuse to re-connect() to + # an already open socket and set errno to EISCONN. + # Windows sets errno to WSAEINVAL (10022) (pre-5.19.4) or + # EINVAL (22) (5.19.4 onwards). + $err = $!; + $@ = "connect: $!"; + } + } + elsif ($blocking || !($!{EINPROGRESS} || $!{EWOULDBLOCK})) { + $err = $!; + $@ = "connect: $!"; + } + } + + $sock->blocking(1) if $blocking; + + $! = $err if $err; + + $err ? undef : $sock; +} + +# Enable/disable blocking IO on sockets. +# Without args return the current status of blocking, +# with args change the mode as appropriate, returning the +# old setting, or in case of error during the mode change +# undef. + +sub blocking { + my $sock = shift; + + return $sock->SUPER::blocking(@_) + if $^O ne 'MSWin32' && $^O ne 'VMS'; + + # Windows handles blocking differently + # + # http://groups.google.co.uk/group/perl.perl5.porters/browse_thread/thread/b4e2b1d88280ddff/630b667a66e3509f?#630b667a66e3509f + # http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/ioctlsocket_2.asp + # + # 0x8004667e is FIONBIO + # + # which is used to set blocking behaviour. + + # NOTE: + # This is a little confusing, the perl keyword for this is + # 'blocking' but the OS level behaviour is 'non-blocking', probably + # because sockets are blocking by default. + # Therefore internally we have to reverse the semantics. + + my $orig= !${*$sock}{io_sock_nonblocking}; + + return $orig unless @_; + + my $block = shift; + + if ( !$block != !$orig ) { + ${*$sock}{io_sock_nonblocking} = $block ? 0 : 1; + ioctl($sock, 0x8004667e, pack("L!",${*$sock}{io_sock_nonblocking})) + or return undef; + } + + return $orig; +} + + +sub close { + @_ == 1 or croak 'usage: $sock->close()'; + my $sock = shift; + ${*$sock}{'io_socket_peername'} = undef; + $sock->SUPER::close(); +} + +sub bind { + @_ == 2 or croak 'usage: $sock->bind(NAME)'; + my $sock = shift; + my $addr = shift; + + return bind($sock, $addr) ? $sock + : undef; +} + +sub listen { + @_ >= 1 && @_ <= 2 or croak 'usage: $sock->listen([QUEUE])'; + my($sock,$queue) = @_; + $queue = 5 + unless $queue && $queue > 0; + + return listen($sock, $queue) ? $sock + : undef; +} + +sub accept { + @_ == 1 || @_ == 2 or croak 'usage $sock->accept([PKG])'; + my $sock = shift; + my $pkg = shift || $sock; + my $timeout = ${*$sock}{'io_socket_timeout'}; + my $new = $pkg->new(Timeout => $timeout); + my $peer = undef; + + if(defined $timeout) { + require IO::Select; + + my $sel = new IO::Select $sock; + + unless ($sel->can_read($timeout)) { + $@ = 'accept: timeout'; + $! = (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1); + return; + } + } + + $peer = accept($new,$sock) + or return; + + ${*$new}{$_} = ${*$sock}{$_} for qw( io_socket_domain io_socket_type io_socket_proto ); + + return wantarray ? ($new, $peer) + : $new; +} + +sub sockname { + @_ == 1 or croak 'usage: $sock->sockname()'; + getsockname($_[0]); +} + +sub peername { + @_ == 1 or croak 'usage: $sock->peername()'; + my($sock) = @_; + ${*$sock}{'io_socket_peername'} ||= getpeername($sock); +} + +sub connected { + @_ == 1 or croak 'usage: $sock->connected()'; + my($sock) = @_; + getpeername($sock); +} + +sub send { + @_ >= 2 && @_ <= 4 or croak 'usage: $sock->send(BUF, [FLAGS, [TO]])'; + my $sock = $_[0]; + my $flags = $_[2] || 0; + my $peer = $_[3] || $sock->peername; + + croak 'send: Cannot determine peer address' + unless(defined $peer); + + my $r = defined(getpeername($sock)) + ? send($sock, $_[1], $flags) + : send($sock, $_[1], $flags, $peer); + + # remember who we send to, if it was successful + ${*$sock}{'io_socket_peername'} = $peer + if(@_ == 4 && defined $r); + + $r; +} + +sub recv { + @_ == 3 || @_ == 4 or croak 'usage: $sock->recv(BUF, LEN [, FLAGS])'; + my $sock = $_[0]; + my $len = $_[2]; + my $flags = $_[3] || 0; + + # remember who we recv'd from + ${*$sock}{'io_socket_peername'} = recv($sock, $_[1]='', $len, $flags); +} + +sub shutdown { + @_ == 2 or croak 'usage: $sock->shutdown(HOW)'; + my($sock, $how) = @_; + ${*$sock}{'io_socket_peername'} = undef; + shutdown($sock, $how); +} + +sub setsockopt { + @_ == 4 or croak '$sock->setsockopt(LEVEL, OPTNAME, OPTVAL)'; + setsockopt($_[0],$_[1],$_[2],$_[3]); +} + +my $intsize = length(pack("i",0)); + +sub getsockopt { + @_ == 3 or croak '$sock->getsockopt(LEVEL, OPTNAME)'; + my $r = getsockopt($_[0],$_[1],$_[2]); + # Just a guess + $r = unpack("i", $r) + if(defined $r && length($r) == $intsize); + $r; +} + +sub sockopt { + my $sock = shift; + @_ == 1 ? $sock->getsockopt(SOL_SOCKET,@_) + : $sock->setsockopt(SOL_SOCKET,@_); +} + +sub atmark { + @_ == 1 or croak 'usage: $sock->atmark()'; + my($sock) = @_; + sockatmark($sock); +} + +sub timeout { + @_ == 1 || @_ == 2 or croak 'usage: $sock->timeout([VALUE])'; + my($sock,$val) = @_; + my $r = ${*$sock}{'io_socket_timeout'}; + + ${*$sock}{'io_socket_timeout'} = defined $val ? 0 + $val : $val + if(@_ == 2); + + $r; +} + +sub sockdomain { + @_ == 1 or croak 'usage: $sock->sockdomain()'; + my $sock = shift; + if (!defined(${*$sock}{'io_socket_domain'})) { + my $addr = $sock->sockname(); + ${*$sock}{'io_socket_domain'} = sockaddr_family($addr) + if (defined($addr)); + } + ${*$sock}{'io_socket_domain'}; +} + +sub socktype { + @_ == 1 or croak 'usage: $sock->socktype()'; + my $sock = shift; + ${*$sock}{'io_socket_type'} = $sock->sockopt(Socket::SO_TYPE) + if (!defined(${*$sock}{'io_socket_type'}) && defined(eval{Socket::SO_TYPE})); + ${*$sock}{'io_socket_type'} +} + +sub protocol { + @_ == 1 or croak 'usage: $sock->protocol()'; + my($sock) = @_; + ${*$sock}{'io_socket_proto'} = $sock->sockopt(Socket::SO_PROTOCOL) + if (!defined(${*$sock}{'io_socket_proto'}) && defined(eval{Socket::SO_PROTOCOL})); + ${*$sock}{'io_socket_proto'}; +} + +1; + +__END__ + +# IO::Select.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Select; + +use strict; +use warnings::register; +require Exporter; + +our $VERSION = "1.39"; + +our @ISA = qw(Exporter); # This is only so we can do version checking + +sub VEC_BITS () {0} +sub FD_COUNT () {1} +sub FIRST_FD () {2} + +sub new +{ + my $self = shift; + my $type = ref($self) || $self; + + my $vec = bless [undef,0], $type; + + $vec->add(@_) + if @_; + + $vec; +} + +sub add +{ + shift->_update('add', @_); +} + + +sub remove +{ + shift->_update('remove', @_); +} + + +sub exists +{ + my $vec = shift; + my $fno = $vec->_fileno(shift); + return undef unless defined $fno; + $vec->[$fno + FIRST_FD]; +} + + +sub _fileno +{ + my($self, $f) = @_; + return unless defined $f; + $f = $f->[0] if ref($f) eq 'ARRAY'; + ($f =~ /^\d+$/) ? $f : fileno($f); +} + +sub _update +{ + my $vec = shift; + my $add = shift eq 'add'; + + my $bits = $vec->[VEC_BITS]; + $bits = '' unless defined $bits; + + my $count = 0; + my $f; + foreach $f (@_) + { + my $fn = $vec->_fileno($f); + if ($add) { + next unless defined $fn; + my $i = $fn + FIRST_FD; + if (defined $vec->[$i]) { + $vec->[$i] = $f; # if array rest might be different, so we update + next; + } + $vec->[FD_COUNT]++; + vec($bits, $fn, 1) = 1; + $vec->[$i] = $f; + } else { # remove + if ( ! defined $fn ) { # remove if fileno undef'd + $fn = 0; + for my $fe (@{$vec}[FIRST_FD .. $#$vec]) { + if (defined($fe) && $fe == $f) { + $vec->[FD_COUNT]--; + $fe = undef; + vec($bits, $fn, 1) = 0; + last; + } + ++$fn; + } + } + else { + my $i = $fn + FIRST_FD; + next unless defined $vec->[$i]; + $vec->[FD_COUNT]--; + vec($bits, $fn, 1) = 0; + $vec->[$i] = undef; + } + } + $count++; + } + $vec->[VEC_BITS] = $vec->[FD_COUNT] ? $bits : undef; + $count; +} + +sub can_read +{ + my $vec = shift; + my $timeout = shift; + my $r = $vec->[VEC_BITS]; + + defined($r) && (select($r,undef,undef,$timeout) > 0) + ? handles($vec, $r) + : (); +} + +sub can_write +{ + my $vec = shift; + my $timeout = shift; + my $w = $vec->[VEC_BITS]; + + defined($w) && (select(undef,$w,undef,$timeout) > 0) + ? handles($vec, $w) + : (); +} + +sub has_exception +{ + my $vec = shift; + my $timeout = shift; + my $e = $vec->[VEC_BITS]; + + defined($e) && (select(undef,undef,$e,$timeout) > 0) + ? handles($vec, $e) + : (); +} + +sub has_error +{ + warnings::warn("Call to deprecated method 'has_error', use 'has_exception'") + if warnings::enabled(); + goto &has_exception; +} + +sub count +{ + my $vec = shift; + $vec->[FD_COUNT]; +} + +sub bits +{ + my $vec = shift; + $vec->[VEC_BITS]; +} + +sub as_string # for debugging +{ + my $vec = shift; + my $str = ref($vec) . ": "; + my $bits = $vec->bits; + my $count = $vec->count; + $str .= defined($bits) ? unpack("b*", $bits) : "undef"; + $str .= " $count"; + my @handles = @$vec; + splice(@handles, 0, FIRST_FD); + for (@handles) { + $str .= " " . (defined($_) ? "$_" : "-"); + } + $str; +} + +sub _max +{ + my($a,$b,$c) = @_; + $a > $b + ? $a > $c + ? $a + : $c + : $b > $c + ? $b + : $c; +} + +sub select +{ + shift + if defined $_[0] && !ref($_[0]); + + my($r,$w,$e,$t) = @_; + my @result = (); + + my $rb = defined $r ? $r->[VEC_BITS] : undef; + my $wb = defined $w ? $w->[VEC_BITS] : undef; + my $eb = defined $e ? $e->[VEC_BITS] : undef; + + if(select($rb,$wb,$eb,$t) > 0) + { + my @r = (); + my @w = (); + my @e = (); + my $i = _max(defined $r ? scalar(@$r)-1 : 0, + defined $w ? scalar(@$w)-1 : 0, + defined $e ? scalar(@$e)-1 : 0); + + for( ; $i >= FIRST_FD ; $i--) + { + my $j = $i - FIRST_FD; + push(@r, $r->[$i]) + if defined $rb && defined $r->[$i] && vec($rb, $j, 1); + push(@w, $w->[$i]) + if defined $wb && defined $w->[$i] && vec($wb, $j, 1); + push(@e, $e->[$i]) + if defined $eb && defined $e->[$i] && vec($eb, $j, 1); + } + + @result = (\@r, \@w, \@e); + } + @result; +} + + +sub handles +{ + my $vec = shift; + my $bits = shift; + my @h = (); + my $i; + my $max = scalar(@$vec) - 1; + + for ($i = FIRST_FD; $i <= $max; $i++) + { + next unless defined $vec->[$i]; + push(@h, $vec->[$i]) + if !defined($bits) || vec($bits, $i - FIRST_FD, 1); + } + + @h; +} + +1; +__END__ + + +package IO::Handle; + + +use 5.008_001; +use strict; +use Carp; +use Symbol; +use SelectSaver; +use IO (); # Load the XS module + +require Exporter; +our @ISA = qw(Exporter); + +our $VERSION = "1.39"; + +our @EXPORT_OK = qw( + autoflush + output_field_separator + output_record_separator + input_record_separator + input_line_number + format_page_number + format_lines_per_page + format_lines_left + format_name + format_top_name + format_line_break_characters + format_formfeed + format_write + + print + printf + say + getline + getlines + + printflush + flush + + SEEK_SET + SEEK_CUR + SEEK_END + _IOFBF + _IOLBF + _IONBF +); + +################################################ +## Constructors, destructors. +## + +sub new { + my $class = ref($_[0]) || $_[0] || "IO::Handle"; + if (@_ != 1) { + # Since perl will automatically require IO::File if needed, but + # also initialises IO::File's @ISA as part of the core we must + # ensure IO::File is loaded if IO::Handle is. This avoids effect- + # ively "half-loading" IO::File. + if ($] > 5.013 && $class eq 'IO::File' && !$INC{"IO/File.pm"}) { + require IO::File; + shift; + return IO::File::->new(@_); + } + croak "usage: $class->new()"; + } + my $io = gensym; + bless $io, $class; +} + +sub new_from_fd { + my $class = ref($_[0]) || $_[0] || "IO::Handle"; + @_ == 3 or croak "usage: $class->new_from_fd(FD, MODE)"; + my $io = gensym; + shift; + IO::Handle::fdopen($io, @_) + or return undef; + bless $io, $class; +} + +# +# There is no need for DESTROY to do anything, because when the +# last reference to an IO object is gone, Perl automatically +# closes its associated files (if any). However, to avoid any +# attempts to autoload DESTROY, we here define it to do nothing. +# +sub DESTROY {} + + +################################################ +## Open and close. +## + +sub _open_mode_string { + my ($mode) = @_; + $mode =~ /^\+?(<|>>?)$/ + or $mode =~ s/^r(\+?)$/$1</ + or $mode =~ s/^w(\+?)$/$1>/ + or $mode =~ s/^a(\+?)$/$1>>/ + or croak "IO::Handle: bad open mode: $mode"; + $mode; +} + +sub fdopen { + @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)'; + my ($io, $fd, $mode) = @_; + local(*GLOB); + + if (ref($fd) && "$fd" =~ /GLOB\(/o) { + # It's a glob reference; Alias it as we cannot get name of anon GLOBs + my $n = qualify(*GLOB); + *GLOB = *{*$fd}; + $fd = $n; + } elsif ($fd =~ m#^\d+$#) { + # It's an FD number; prefix with "=". + $fd = "=$fd"; + } + + open($io, _open_mode_string($mode) . '&' . $fd) + ? $io : undef; +} + +sub close { + @_ == 1 or croak 'usage: $io->close()'; + my($io) = @_; + + close($io); +} + +################################################ +## Normal I/O functions. +## + +# flock +# select + +sub opened { + @_ == 1 or croak 'usage: $io->opened()'; + defined fileno($_[0]); +} + +sub fileno { + @_ == 1 or croak 'usage: $io->fileno()'; + fileno($_[0]); +} + +sub getc { + @_ == 1 or croak 'usage: $io->getc()'; + getc($_[0]); +} + +sub eof { + @_ == 1 or croak 'usage: $io->eof()'; + eof($_[0]); +} + +sub print { + @_ or croak 'usage: $io->print(ARGS)'; + my $this = shift; + print $this @_; +} + +sub printf { + @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])'; + my $this = shift; + printf $this @_; +} + +sub say { + @_ or croak 'usage: $io->say(ARGS)'; + my $this = shift; + local $\ = "\n"; + print $this @_; +} + +# Special XS wrapper to make them inherit lexical hints from the caller. +_create_getline_subs( <<'END' ) or die $@; +sub getline { + @_ == 1 or croak 'usage: $io->getline()'; + my $this = shift; + return scalar <$this>; +} + +sub getlines { + @_ == 1 or croak 'usage: $io->getlines()'; + wantarray or + croak 'Can\'t call $io->getlines in a scalar context, use $io->getline'; + my $this = shift; + return <$this>; +} +1; # return true for error checking +END + +*gets = \&getline; # deprecated + +sub truncate { + @_ == 2 or croak 'usage: $io->truncate(LEN)'; + truncate($_[0], $_[1]); +} + +sub read { + @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])'; + read($_[0], $_[1], $_[2], $_[3] || 0); +} + +sub sysread { + @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])'; + sysread($_[0], $_[1], $_[2], $_[3] || 0); +} + +sub write { + @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])'; + local($\) = ""; + $_[2] = length($_[1]) unless defined $_[2]; + print { $_[0] } substr($_[1], $_[3] || 0, $_[2]); +} + +sub syswrite { + @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])'; + if (defined($_[2])) { + syswrite($_[0], $_[1], $_[2], $_[3] || 0); + } else { + syswrite($_[0], $_[1]); + } +} + +sub stat { + @_ == 1 or croak 'usage: $io->stat()'; + stat($_[0]); +} + +################################################ +## State modification functions. +## + +sub autoflush { + my $old = SelectSaver->new(qualify($_[0], caller)); + my $prev = $|; + $| = @_ > 1 ? $_[1] : 1; + $prev; +} + +sub output_field_separator { + carp "output_field_separator is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $,; + $, = $_[1] if @_ > 1; + $prev; +} + +sub output_record_separator { + carp "output_record_separator is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $\; + $\ = $_[1] if @_ > 1; + $prev; +} + +sub input_record_separator { + carp "input_record_separator is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $/; + $/ = $_[1] if @_ > 1; + $prev; +} + +sub input_line_number { + local $.; + () = tell qualify($_[0], caller) if ref($_[0]); + my $prev = $.; + $. = $_[1] if @_ > 1; + $prev; +} + +sub format_page_number { + my $old; + $old = SelectSaver->new(qualify($_[0], caller)) if ref($_[0]); + my $prev = $%; + $% = $_[1] if @_ > 1; + $prev; +} + +sub format_lines_per_page { + my $old; + $old = SelectSaver->new(qualify($_[0], caller)) if ref($_[0]); + my $prev = $=; + $= = $_[1] if @_ > 1; + $prev; +} + +sub format_lines_left { + my $old; + $old = SelectSaver->new(qualify($_[0], caller)) if ref($_[0]); + my $prev = $-; + $- = $_[1] if @_ > 1; + $prev; +} + +sub format_name { + my $old; + $old = SelectSaver->new(qualify($_[0], caller)) if ref($_[0]); + my $prev = $~; + $~ = qualify($_[1], caller) if @_ > 1; + $prev; +} + +sub format_top_name { + my $old; + $old = SelectSaver->new(qualify($_[0], caller)) if ref($_[0]); + my $prev = $^; + $^ = qualify($_[1], caller) if @_ > 1; + $prev; +} + +sub format_line_break_characters { + carp "format_line_break_characters is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $:; + $: = $_[1] if @_ > 1; + $prev; +} + +sub format_formfeed { + carp "format_formfeed is not supported on a per-handle basis" + if ref($_[0]); + my $prev = $^L; + $^L = $_[1] if @_ > 1; + $prev; +} + +sub formline { + my $io = shift; + my $picture = shift; + local($^A) = $^A; + local($\) = ""; + formline($picture, @_); + print $io $^A; +} + +sub format_write { + @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )'; + if (@_ == 2) { + my ($io, $fmt) = @_; + my $oldfmt = $io->format_name(qualify($fmt,caller)); + CORE::write($io); + $io->format_name($oldfmt); + } else { + CORE::write($_[0]); + } +} + +sub fcntl { + @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );'; + my ($io, $op) = @_; + return fcntl($io, $op, $_[2]); +} + +sub ioctl { + @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );'; + my ($io, $op) = @_; + return ioctl($io, $op, $_[2]); +} + +# this sub is for compatibility with older releases of IO that used +# a sub called constant to determine if a constant existed -- GMB +# +# The SEEK_* and _IO?BF constants were the only constants at that time +# any new code should just check defined(&CONSTANT_NAME) + +sub constant { + no strict 'refs'; + my $name = shift; + (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name}) + ? &{$name}() : undef; +} + + +# so that flush.pl can be deprecated + +sub printflush { + my $io = shift; + my $old; + $old = SelectSaver->new(qualify($io, caller)) if ref($io); + local $| = 1; + if(ref($io)) { + print $io @_; + } + else { + print @_; + } +} + +1; +# IO::Pipe.pm +# +# Copyright (c) 1996-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Pipe; + +use 5.008_001; + +use IO::Handle; +use strict; +use Carp; +use Symbol; + +our $VERSION = "1.39"; + +sub new { + my $type = shift; + my $class = ref($type) || $type || "IO::Pipe"; + @_ == 0 || @_ == 2 or croak "usage: $class->([READFH, WRITEFH])"; + + my $me = bless gensym(), $class; + + my($readfh,$writefh) = @_ ? @_ : $me->handles; + + pipe($readfh, $writefh) + or return undef; + + @{*$me} = ($readfh, $writefh); + + $me; +} + +sub handles { + @_ == 1 or croak 'usage: $pipe->handles()'; + (IO::Pipe::End->new(), IO::Pipe::End->new()); +} + +my $do_spawn = $^O eq 'os2' || $^O eq 'MSWin32'; + +sub _doit { + my $me = shift; + my $rw = shift; + + my $pid = $do_spawn ? 0 : fork(); + + if($pid) { # Parent + return $pid; + } + elsif(defined $pid) { # Child or spawn + my $fh; + my $io = $rw ? \*STDIN : \*STDOUT; + my ($mode, $save) = $rw ? "r" : "w"; + if ($do_spawn) { + require Fcntl; + $save = IO::Handle->new_from_fd($io, $mode); + my $handle = shift; + # Close in child: + unless ($^O eq 'MSWin32') { + fcntl($handle, Fcntl::F_SETFD(), 1) or croak "fcntl: $!"; + } + $fh = $rw ? ${*$me}[0] : ${*$me}[1]; + } else { + shift; + $fh = $rw ? $me->reader() : $me->writer(); # close the other end + } + bless $io, "IO::Handle"; + $io->fdopen($fh, $mode); + $fh->close; + + if ($do_spawn) { + $pid = eval { system 1, @_ }; # 1 == P_NOWAIT + my $err = $!; + + $io->fdopen($save, $mode); + $save->close or croak "Cannot close $!"; + croak "IO::Pipe: Cannot spawn-NOWAIT: $err" if not $pid or $pid < 0; + return $pid; + } else { + exec @_ or + croak "IO::Pipe: Cannot exec: $!"; + } + } + else { + croak "IO::Pipe: Cannot fork: $!"; + } + + # NOT Reached +} + +sub reader { + @_ >= 1 or croak 'usage: $pipe->reader( [SUB_COMMAND_ARGS] )'; + my $me = shift; + + return undef + unless(ref($me) || ref($me = $me->new)); + + my $fh = ${*$me}[0]; + my $pid; + $pid = $me->_doit(0, $fh, @_) + if(@_); + + close ${*$me}[1]; + bless $me, ref($fh); + *$me = *$fh; # Alias self to handle + $me->fdopen($fh->fileno,"r") + unless defined($me->fileno); + bless $fh; # Really wan't un-bless here + ${*$me}{'io_pipe_pid'} = $pid + if defined $pid; + + $me; +} + +sub writer { + @_ >= 1 or croak 'usage: $pipe->writer( [SUB_COMMAND_ARGS] )'; + my $me = shift; + + return undef + unless(ref($me) || ref($me = $me->new)); + + my $fh = ${*$me}[1]; + my $pid; + $pid = $me->_doit(1, $fh, @_) + if(@_); + + close ${*$me}[0]; + bless $me, ref($fh); + *$me = *$fh; # Alias self to handle + $me->fdopen($fh->fileno,"w") + unless defined($me->fileno); + bless $fh; # Really wan't un-bless here + ${*$me}{'io_pipe_pid'} = $pid + if defined $pid; + + $me; +} + +package IO::Pipe::End; + +our(@ISA); + +@ISA = qw(IO::Handle); + +sub close { + my $fh = shift; + my $r = $fh->SUPER::close(@_); + + waitpid(${*$fh}{'io_pipe_pid'},0) + if(defined ${*$fh}{'io_pipe_pid'}); + + $r; +} + +1; + +__END__ + +# IO::Dir.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Dir; + +use 5.008_001; + +use strict; +use Carp; +use Symbol; +use Exporter; +use IO::File; +use Tie::Hash; +use File::stat; +use File::Spec; + +our @ISA = qw(Tie::Hash Exporter); +our $VERSION = "1.39"; + +our @EXPORT_OK = qw(DIR_UNLINK); + +sub DIR_UNLINK () { 1 } + +sub new { + @_ >= 1 && @_ <= 2 or croak 'usage: IO::Dir->new([DIRNAME])'; + my $class = shift; + my $dh = gensym; + if (@_) { + IO::Dir::open($dh, $_[0]) + or return undef; + } + bless $dh, $class; +} + +sub DESTROY { + my ($dh) = @_; + local($., $@, $!, $^E, $?); + no warnings 'io'; + closedir($dh); +} + +sub open { + @_ == 2 or croak 'usage: $dh->open(DIRNAME)'; + my ($dh, $dirname) = @_; + return undef + unless opendir($dh, $dirname); + # a dir name should always have a ":" in it; assume dirname is + # in current directory + $dirname = ':' . $dirname if ( ($^O eq 'MacOS') && ($dirname !~ /:/) ); + ${*$dh}{io_dir_path} = $dirname; + 1; +} + +sub close { + @_ == 1 or croak 'usage: $dh->close()'; + my ($dh) = @_; + closedir($dh); +} + +sub read { + @_ == 1 or croak 'usage: $dh->read()'; + my ($dh) = @_; + readdir($dh); +} + +sub seek { + @_ == 2 or croak 'usage: $dh->seek(POS)'; + my ($dh,$pos) = @_; + seekdir($dh,$pos); +} + +sub tell { + @_ == 1 or croak 'usage: $dh->tell()'; + my ($dh) = @_; + telldir($dh); +} + +sub rewind { + @_ == 1 or croak 'usage: $dh->rewind()'; + my ($dh) = @_; + rewinddir($dh); +} + +sub TIEHASH { + my($class,$dir,$options) = @_; + + my $dh = $class->new($dir) + or return undef; + + $options ||= 0; + + ${*$dh}{io_dir_unlink} = $options & DIR_UNLINK; + $dh; +} + +sub FIRSTKEY { + my($dh) = @_; + $dh->rewind; + scalar $dh->read; +} + +sub NEXTKEY { + my($dh) = @_; + scalar $dh->read; +} + +sub EXISTS { + my($dh,$key) = @_; + -e File::Spec->catfile(${*$dh}{io_dir_path}, $key); +} + +sub FETCH { + my($dh,$key) = @_; + &lstat(File::Spec->catfile(${*$dh}{io_dir_path}, $key)); +} + +sub STORE { + my($dh,$key,$data) = @_; + my($atime,$mtime) = ref($data) ? @$data : ($data,$data); + my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key); + unless(-e $file) { + my $io = IO::File->new($file,O_CREAT | O_RDWR); + $io->close if $io; + } + utime($atime,$mtime, $file); +} + +sub DELETE { + my($dh,$key) = @_; + + # Only unlink if unlink-ing is enabled + return 0 + unless ${*$dh}{io_dir_unlink}; + + my $file = File::Spec->catfile(${*$dh}{io_dir_path}, $key); + + -d $file + ? rmdir($file) + : unlink($file); +} + +1; + +__END__ + +# IO::Socket::UNIX.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Socket::UNIX; + +use strict; +use IO::Socket; +use Carp; + +our @ISA = qw(IO::Socket); +our $VERSION = "1.39"; + +IO::Socket::UNIX->register_domain( AF_UNIX ); + +sub new { + my $class = shift; + unshift(@_, "Peer") if @_ == 1; + return $class->SUPER::new(@_); +} + +sub configure { + my($sock,$arg) = @_; + my($bport,$cport); + + my $type = $arg->{Type} || SOCK_STREAM; + + $sock->socket(AF_UNIX, $type, 0) or + return undef; + + if(exists $arg->{Local}) { + my $addr = sockaddr_un($arg->{Local}); + $sock->bind($addr) or + return undef; + } + if(exists $arg->{Listen} && $type != SOCK_DGRAM) { + $sock->listen($arg->{Listen} || 5) or + return undef; + } + elsif(exists $arg->{Peer}) { + my $addr = sockaddr_un($arg->{Peer}); + $sock->connect($addr) or + return undef; + } + + $sock; +} + +sub hostpath { + @_ == 1 or croak 'usage: $sock->hostpath()'; + my $n = $_[0]->sockname || return undef; + (sockaddr_un($n))[0]; +} + +sub peerpath { + @_ == 1 or croak 'usage: $sock->peerpath()'; + my $n = $_[0]->peername || return undef; + (sockaddr_un($n))[0]; +} + +1; # Keep require happy + +__END__ + +# IO::Socket::INET.pm +# +# Copyright (c) 1997-8 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. + +package IO::Socket::INET; + +use strict; +use IO::Socket; +use Socket; +use Carp; +use Exporter; +use Errno; + +our @ISA = qw(IO::Socket); +our $VERSION = "1.39"; + +my $EINVAL = exists(&Errno::EINVAL) ? Errno::EINVAL() : 1; + +IO::Socket::INET->register_domain( AF_INET ); + +my %socket_type = ( tcp => SOCK_STREAM, + udp => SOCK_DGRAM, + icmp => SOCK_RAW + ); +my %proto_number; +$proto_number{tcp} = Socket::IPPROTO_TCP() if defined &Socket::IPPROTO_TCP; +$proto_number{udp} = Socket::IPPROTO_UDP() if defined &Socket::IPPROTO_UDP; +$proto_number{icmp} = Socket::IPPROTO_ICMP() if defined &Socket::IPPROTO_ICMP; +my %proto_name = reverse %proto_number; + +sub new { + my $class = shift; + unshift(@_, "PeerAddr") if @_ == 1; + return $class->SUPER::new(@_); +} + +sub _cache_proto { + my @proto = @_; + for (map lc($_), $proto[0], split(' ', $proto[1])) { + $proto_number{$_} = $proto[2]; + } + $proto_name{$proto[2]} = $proto[0]; +} + +sub _get_proto_number { + my $name = lc(shift); + return undef unless defined $name; + return $proto_number{$name} if exists $proto_number{$name}; + + my @proto = eval { getprotobyname($name) }; + return undef unless @proto; + _cache_proto(@proto); + + return $proto[2]; +} + +sub _get_proto_name { + my $num = shift; + return undef unless defined $num; + return $proto_name{$num} if exists $proto_name{$num}; + + my @proto = eval { getprotobynumber($num) }; + return undef unless @proto; + _cache_proto(@proto); + + return $proto[0]; +} + +sub _sock_info { + my($addr,$port,$proto) = @_; + my $origport = $port; + my @serv = (); + + $port = $1 + if(defined $addr && $addr =~ s,:([\w\(\)/]+)$,,); + + if(defined $proto && $proto =~ /\D/) { + my $num = _get_proto_number($proto); + unless (defined $num) { + $@ = "Bad protocol '$proto'"; + return; + } + $proto = $num; + } + + if(defined $port) { + my $defport = ($port =~ s,\((\d+)\)$,,) ? $1 : undef; + my $pnum = ($port =~ m,^(\d+)$,)[0]; + + @serv = getservbyname($port, _get_proto_name($proto) || "") + if ($port =~ m,\D,); + + $port = $serv[2] || $defport || $pnum; + unless (defined $port) { + $@ = "Bad service '$origport'"; + return; + } + + $proto = _get_proto_number($serv[3]) if @serv && !$proto; + } + + return ($addr || undef, + $port || undef, + $proto || undef + ); +} + +sub _error { + my $sock = shift; + my $err = shift; + { + local($!); + my $title = ref($sock).": "; + $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_); + $sock->close() + if(defined fileno($sock)); + } + $! = $err; + return undef; +} + +sub _get_addr { + my($sock,$addr_str, $multi) = @_; + my @addr; + if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) { + (undef, undef, undef, undef, @addr) = gethostbyname($addr_str); + } else { + my $h = inet_aton($addr_str); + push(@addr, $h) if defined $h; + } + @addr; +} + +sub configure { + my($sock,$arg) = @_; + my($lport,$rport,$laddr,$raddr,$proto,$type); + + + $arg->{LocalAddr} = $arg->{LocalHost} + if exists $arg->{LocalHost} && !exists $arg->{LocalAddr}; + + ($laddr,$lport,$proto) = _sock_info($arg->{LocalAddr}, + $arg->{LocalPort}, + $arg->{Proto}) + or return _error($sock, $!, $@); + + $laddr = defined $laddr ? inet_aton($laddr) + : INADDR_ANY; + + return _error($sock, $EINVAL, "Bad hostname '",$arg->{LocalAddr},"'") + unless(defined $laddr); + + $arg->{PeerAddr} = $arg->{PeerHost} + if exists $arg->{PeerHost} && !exists $arg->{PeerAddr}; + + unless(exists $arg->{Listen}) { + ($raddr,$rport,$proto) = _sock_info($arg->{PeerAddr}, + $arg->{PeerPort}, + $proto) + or return _error($sock, $!, $@); + } + + $proto ||= _get_proto_number('tcp'); + + $type = $arg->{Type} || $socket_type{lc _get_proto_name($proto)}; + + my @raddr = (); + + if(defined $raddr) { + @raddr = $sock->_get_addr($raddr, $arg->{MultiHomed}); + return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'") + unless @raddr; + } + + while(1) { + + $sock->socket(AF_INET, $type, $proto) or + return _error($sock, $!, "$!"); + + if (defined $arg->{Blocking}) { + defined $sock->blocking($arg->{Blocking}) + or return _error($sock, $!, "$!"); + } + + if ($arg->{Reuse} || $arg->{ReuseAddr}) { + $sock->sockopt(SO_REUSEADDR,1) or + return _error($sock, $!, "$!"); + } + + if ($arg->{ReusePort}) { + $sock->sockopt(SO_REUSEPORT,1) or + return _error($sock, $!, "$!"); + } + + if ($arg->{Broadcast}) { + $sock->sockopt(SO_BROADCAST,1) or + return _error($sock, $!, "$!"); + } + + if($lport || ($laddr ne INADDR_ANY) || exists $arg->{Listen}) { + $sock->bind($lport || 0, $laddr) or + return _error($sock, $!, "$!"); + } + + if(exists $arg->{Listen}) { + $sock->listen($arg->{Listen} || 5) or + return _error($sock, $!, "$!"); + last; + } + + # don't try to connect unless we're given a PeerAddr + last unless exists($arg->{PeerAddr}); + + $raddr = shift @raddr; + + return _error($sock, $EINVAL, 'Cannot determine remote port') + unless($rport || $type == SOCK_DGRAM || $type == SOCK_RAW); + + last + unless($type == SOCK_STREAM || defined $raddr); + + return _error($sock, $EINVAL, "Bad hostname '",$arg->{PeerAddr},"'") + unless defined $raddr; + +# my $timeout = ${*$sock}{'io_socket_timeout'}; +# my $before = time() if $timeout; + + undef $@; + if ($sock->connect(pack_sockaddr_in($rport, $raddr))) { +# ${*$sock}{'io_socket_timeout'} = $timeout; + return $sock; + } + + return _error($sock, $!, $@ || "Timeout") + unless @raddr; + +# if ($timeout) { +# my $new_timeout = $timeout - (time() - $before); +# return _error($sock, +# (exists(&Errno::ETIMEDOUT) ? Errno::ETIMEDOUT() : $EINVAL), +# "Timeout") if $new_timeout <= 0; +# ${*$sock}{'io_socket_timeout'} = $new_timeout; +# } + + } + + $sock; +} + +sub connect { + @_ == 2 || @_ == 3 or + croak 'usage: $sock->connect(NAME) or $sock->connect(PORT, ADDR)'; + my $sock = shift; + return $sock->SUPER::connect(@_ == 1 ? shift : pack_sockaddr_in(@_)); +} + +sub bind { + @_ == 2 || @_ == 3 or + croak 'usage: $sock->bind(NAME) or $sock->bind(PORT, ADDR)'; + my $sock = shift; + return $sock->SUPER::bind(@_ == 1 ? shift : pack_sockaddr_in(@_)) +} + +sub sockaddr { + @_ == 1 or croak 'usage: $sock->sockaddr()'; + my($sock) = @_; + my $name = $sock->sockname; + $name ? (sockaddr_in($name))[1] : undef; +} + +sub sockport { + @_ == 1 or croak 'usage: $sock->sockport()'; + my($sock) = @_; + my $name = $sock->sockname; + $name ? (sockaddr_in($name))[0] : undef; +} + +sub sockhost { + @_ == 1 or croak 'usage: $sock->sockhost()'; + my($sock) = @_; + my $addr = $sock->sockaddr; + $addr ? inet_ntoa($addr) : undef; +} + +sub peeraddr { + @_ == 1 or croak 'usage: $sock->peeraddr()'; + my($sock) = @_; + my $name = $sock->peername; + $name ? (sockaddr_in($name))[1] : undef; +} + +sub peerport { + @_ == 1 or croak 'usage: $sock->peerport()'; + my($sock) = @_; + my $name = $sock->peername; + $name ? (sockaddr_in($name))[0] : undef; +} + +sub peerhost { + @_ == 1 or croak 'usage: $sock->peerhost()'; + my($sock) = @_; + my $addr = $sock->peeraddr; + $addr ? inet_ntoa($addr) : undef; +} + +1; + +__END__ + +package Hash::Util; + +require 5.007003; +use strict; +use Carp; +use warnings; +no warnings 'uninitialized'; +use warnings::register; +use Scalar::Util qw(reftype); + +require Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + fieldhash fieldhashes + + all_keys + lock_keys unlock_keys + lock_value unlock_value + lock_hash unlock_hash + lock_keys_plus + hash_locked hash_unlocked + hashref_locked hashref_unlocked + hidden_keys legal_keys + + lock_ref_keys unlock_ref_keys + lock_ref_value unlock_ref_value + lock_hashref unlock_hashref + lock_ref_keys_plus + hidden_ref_keys legal_ref_keys + + hash_seed hash_value hv_store + bucket_stats bucket_stats_formatted bucket_info bucket_array + lock_hash_recurse unlock_hash_recurse + lock_hashref_recurse unlock_hashref_recurse + + hash_traversal_mask + + bucket_ratio + used_buckets + num_buckets + ); +BEGIN { + # make sure all our XS routines are available early so their prototypes + # are correctly applied in the following code. + our $VERSION = '0.22'; + require XSLoader; + XSLoader::load(); +} + +sub import { + my $class = shift; + if ( grep /fieldhash/, @_ ) { + require Hash::Util::FieldHash; + Hash::Util::FieldHash->import(':all'); # for re-export + } + unshift @_, $class; + goto &Exporter::import; +} + + + +sub lock_ref_keys { + my($hash, @keys) = @_; + + _clear_placeholders(%$hash); + if( @keys ) { + my %keys = map { ($_ => 1) } @keys; + my %original_keys = map { ($_ => 1) } keys %$hash; + foreach my $k (keys %original_keys) { + croak "Hash has key '$k' which is not in the new key set" + unless $keys{$k}; + } + + foreach my $k (@keys) { + $hash->{$k} = undef unless exists $hash->{$k}; + } + Internals::SvREADONLY %$hash, 1; + + foreach my $k (@keys) { + delete $hash->{$k} unless $original_keys{$k}; + } + } + else { + Internals::SvREADONLY %$hash, 1; + } + + return $hash; +} + +sub unlock_ref_keys { + my $hash = shift; + + Internals::SvREADONLY %$hash, 0; + return $hash; +} + +sub lock_keys (\%;@) { lock_ref_keys(@_) } +sub unlock_keys (\%) { unlock_ref_keys(@_) } + +#=item B<_clear_placeholders> +# +# This function removes any placeholder keys from a hash. See Perl_hv_clear_placeholders() +# in hv.c for what it does exactly. It is currently exposed as XS by universal.c and +# injected into the Hash::Util namespace. +# +# It is not intended for use outside of this module, and may be changed +# or removed without notice or deprecation cycle. +# +#=cut +# +# sub _clear_placeholders {} # just in case someone searches... + + + +sub lock_ref_keys_plus { + my ($hash,@keys) = @_; + my @delete; + _clear_placeholders(%$hash); + foreach my $key (@keys) { + unless (exists($hash->{$key})) { + $hash->{$key}=undef; + push @delete,$key; + } + } + Internals::SvREADONLY(%$hash,1); + delete @{$hash}{@delete}; + return $hash +} + +sub lock_keys_plus(\%;@) { lock_ref_keys_plus(@_) } + + + +sub lock_ref_value { + my($hash, $key) = @_; + # I'm doubtful about this warning, as it seems not to be true. + # Marking a value in the hash as RO is useful, regardless + # of the status of the hash itself. + carp "Cannot usefully lock values in an unlocked hash" + if !Internals::SvREADONLY(%$hash) && warnings::enabled; + Internals::SvREADONLY $hash->{$key}, 1; + return $hash +} + +sub unlock_ref_value { + my($hash, $key) = @_; + Internals::SvREADONLY $hash->{$key}, 0; + return $hash +} + +sub lock_value (\%$) { lock_ref_value(@_) } +sub unlock_value (\%$) { unlock_ref_value(@_) } + + + +sub lock_hashref { + my $hash = shift; + + lock_ref_keys($hash); + + foreach my $value (values %$hash) { + Internals::SvREADONLY($value,1); + } + + return $hash; +} + +sub unlock_hashref { + my $hash = shift; + + foreach my $value (values %$hash) { + Internals::SvREADONLY($value, 0); + } + + unlock_ref_keys($hash); + + return $hash; +} + +sub lock_hash (\%) { lock_hashref(@_) } +sub unlock_hash (\%) { unlock_hashref(@_) } + + +sub lock_hashref_recurse { + my $hash = shift; + + lock_ref_keys($hash); + foreach my $value (values %$hash) { + my $type = reftype($value); + if (defined($type) and $type eq 'HASH') { + lock_hashref_recurse($value); + } + Internals::SvREADONLY($value,1); + } + return $hash +} + +sub unlock_hashref_recurse { + my $hash = shift; + + foreach my $value (values %$hash) { + my $type = reftype($value); + if (defined($type) and $type eq 'HASH') { + unlock_hashref_recurse($value); + } + Internals::SvREADONLY($value,0); + } + unlock_ref_keys($hash); + return $hash; +} + +sub lock_hash_recurse (\%) { lock_hashref_recurse(@_) } +sub unlock_hash_recurse (\%) { unlock_hashref_recurse(@_) } + + +sub hashref_locked { + my $hash=shift; + Internals::SvREADONLY(%$hash); +} + +sub hash_locked(\%) { hashref_locked(@_) } + + +sub hashref_unlocked { + my $hash=shift; + !Internals::SvREADONLY(%$hash); +} + +sub hash_unlocked(\%) { hashref_unlocked(@_) } + + +sub legal_keys(\%) { legal_ref_keys(@_) } +sub hidden_keys(\%){ hidden_ref_keys(@_) } + + + +sub bucket_stats { + my ($hash) = @_; + my ($keys, $buckets, $used, @length_counts) = bucket_info($hash); + my $sum; + my $score; + for (1 .. $#length_counts) { + $sum += ($length_counts[$_] * $_); + $score += $length_counts[$_] * ( $_ * ($_ + 1 ) / 2 ); + } + $score = $score / + (( $keys / (2 * $buckets )) * ( $keys + ( 2 * $buckets ) - 1 )) + if $keys; + my ($mean, $stddev)= (0, 0); + if ($used) { + $mean= $sum / $used; + $sum= 0; + $sum += ($length_counts[$_] * (($_-$mean)**2)) for 1 .. $#length_counts; + + $stddev= sqrt($sum/$used); + } + return $keys, $buckets, $used, $keys ? ($score, $used/$buckets, ($keys-$used)/$keys, $mean, $stddev, @length_counts) : (); +} + + + +sub _bucket_stats_formatted_bars { + my ($total, $ary, $start_idx, $title, $row_title)= @_; + + my $return = ""; + my $max_width= $total > 64 ? 64 : $total; + my $bar_width= $max_width / $total; + + my $str= ""; + if ( @$ary < 10) { + for my $idx ($start_idx .. $#$ary) { + $str .= $idx x sprintf("%.0f", ($ary->[$idx] * $bar_width)); + } + } else { + $str= "-" x $max_width; + } + $return .= sprintf "%-7s %6d [%s]\n",$title, $total, $str; + + foreach my $idx ($start_idx .. $#$ary) { + $return .= sprintf "%-.3s %3d %6.2f%% %6d [%s]\n", + $row_title, + $idx, + $ary->[$idx] / $total * 100, + $ary->[$idx], + "#" x sprintf("%.0f", ($ary->[$idx] * $bar_width)), + ; + } + return $return; +} + +sub bucket_stats_formatted { + my ($hashref)= @_; + my ($keys, $buckets, $used, $score, $utilization_ratio, $collision_pct, + $mean, $stddev, @length_counts) = bucket_stats($hashref); + + my $return= sprintf "Keys: %d Buckets: %d/%d Quality-Score: %.2f (%s)\n" + . "Utilized Buckets: %.2f%% Optimal: %.2f%% Keys In Collision: %.2f%%\n" + . "Chain Length - mean: %.2f stddev: %.2f\n", + $keys, $used, $buckets, $score, $score <= 1.05 ? "Good" : $score < 1.2 ? "Poor" : "Bad", + $utilization_ratio * 100, + $keys/$buckets * 100, + $collision_pct * 100, + $mean, $stddev; + + my @key_depth; + $key_depth[$_]= $length_counts[$_] + ( $key_depth[$_+1] || 0 ) + for reverse 1 .. $#length_counts; + + if ($keys) { + $return .= _bucket_stats_formatted_bars($buckets, \@length_counts, 0, "Buckets", "Len"); + $return .= _bucket_stats_formatted_bars($keys, \@key_depth, 1, "Keys", "Pos"); + } + return $return +} + + +1; +# Copyright (c) 1997-2009 Graham Barr <gbarr@pobox.com>. All rights reserved. +# This program is free software; you can redistribute it and/or +# modify it under the same terms as Perl itself. +# +# Maintained since 2013 by Paul Evans <leonerd@leonerd.org.uk> + +package List::Util; + +use strict; +use warnings; +require Exporter; + +our @ISA = qw(Exporter); +our @EXPORT_OK = qw( + all any first min max minstr maxstr none notall product reduce sum sum0 shuffle uniq uniqnum uniqstr + head tail pairs unpairs pairkeys pairvalues pairmap pairgrep pairfirst +); +our $VERSION = "1.50"; +our $XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +require XSLoader; +XSLoader::load('List::Util', $XS_VERSION); + +sub import +{ + my $pkg = caller; + + # (RT88848) Touch the caller's $a and $b, to avoid the warning of + # Name "main::a" used only once: possible typo" warning + no strict 'refs'; + ${"${pkg}::a"} = ${"${pkg}::a"}; + ${"${pkg}::b"} = ${"${pkg}::b"}; + + goto &Exporter::import; +} + +# For objects returned by pairs() +sub List::Util::_Pair::key { shift->[0] } +sub List::Util::_Pair::value { shift->[1] } + + + + + + + + + +1; +package List::Util::XS; +use strict; +use warnings; +use List::Util; + +our $VERSION = "1.50"; # FIXUP +$VERSION = eval $VERSION; # FIXUP + +1; +__END__ + +# +# Data/Dumper.pm +# +# convert perl data structures into perl syntax suitable for both printing +# and eval +# +# Documentation at the __END__ +# + +package Data::Dumper; + +BEGIN { + $VERSION = '2.170'; # Don't forget to set version and release +} # date in POD below! + +#$| = 1; + +use 5.006_001; +require Exporter; + +use constant IS_PRE_520_PERL => $] < 5.020; + +use Carp (); + +BEGIN { + @ISA = qw(Exporter); + @EXPORT = qw(Dumper); + @EXPORT_OK = qw(DumperX); + + # if run under miniperl, or otherwise lacking dynamic loading, + # XSLoader should be attempted to load, or the pure perl flag + # toggled on load failure. + eval { + require XSLoader; + XSLoader::load( 'Data::Dumper' ); + 1 + } + or $Useperl = 1; +} + +my $IS_ASCII = ord 'A' == 65; + +# module vars and their defaults +$Indent = 2 unless defined $Indent; +$Trailingcomma = 0 unless defined $Trailingcomma; +$Purity = 0 unless defined $Purity; +$Pad = "" unless defined $Pad; +$Varname = "VAR" unless defined $Varname; +$Useqq = 0 unless defined $Useqq; +$Terse = 0 unless defined $Terse; +$Freezer = "" unless defined $Freezer; +$Toaster = "" unless defined $Toaster; +$Deepcopy = 0 unless defined $Deepcopy; +$Quotekeys = 1 unless defined $Quotekeys; +$Bless = "bless" unless defined $Bless; +#$Expdepth = 0 unless defined $Expdepth; +$Maxdepth = 0 unless defined $Maxdepth; +$Pair = ' => ' unless defined $Pair; +$Useperl = 0 unless defined $Useperl; +$Sortkeys = 0 unless defined $Sortkeys; +$Deparse = 0 unless defined $Deparse; +$Sparseseen = 0 unless defined $Sparseseen; +$Maxrecurse = 1000 unless defined $Maxrecurse; + +# +# expects an arrayref of values to be dumped. +# can optionally pass an arrayref of names for the values. +# names must have leading $ sign stripped. begin the name with * +# to cause output of arrays and hashes rather than refs. +# +sub new { + my($c, $v, $n) = @_; + + Carp::croak("Usage: PACKAGE->new(ARRAYREF, [ARRAYREF])") + unless (defined($v) && (ref($v) eq 'ARRAY')); + $n = [] unless (defined($n) && (ref($n) eq 'ARRAY')); + + my($s) = { + level => 0, # current recursive depth + indent => $Indent, # various styles of indenting + trailingcomma => $Trailingcomma, # whether to add comma after last elem + pad => $Pad, # all lines prefixed by this string + xpad => "", # padding-per-level + apad => "", # added padding for hash keys n such + sep => "", # list separator + pair => $Pair, # hash key/value separator: defaults to ' => ' + seen => {}, # local (nested) refs (id => [name, val]) + todump => $v, # values to dump [] + names => $n, # optional names for values [] + varname => $Varname, # prefix to use for tagging nameless ones + purity => $Purity, # degree to which output is evalable + useqq => $Useqq, # use "" for strings (backslashitis ensues) + terse => $Terse, # avoid name output (where feasible) + freezer => $Freezer, # name of Freezer method for objects + toaster => $Toaster, # name of method to revive objects + deepcopy => $Deepcopy, # do not cross-ref, except to stop recursion + quotekeys => $Quotekeys, # quote hash keys + 'bless' => $Bless, # keyword to use for "bless" +# expdepth => $Expdepth, # cutoff depth for explicit dumping + maxdepth => $Maxdepth, # depth beyond which we give up + maxrecurse => $Maxrecurse, # depth beyond which we abort + useperl => $Useperl, # use the pure Perl implementation + sortkeys => $Sortkeys, # flag or filter for sorting hash keys + deparse => $Deparse, # use B::Deparse for coderefs + noseen => $Sparseseen, # do not populate the seen hash unless necessary + }; + + if ($Indent > 0) { + $s->{xpad} = " "; + $s->{sep} = "\n"; + } + return bless($s, $c); +} + +# Packed numeric addresses take less memory. Plus pack is faster than sprintf + +# Most users of current versions of Data::Dumper will be 5.008 or later. +# Anyone on 5.6.1 and 5.6.2 upgrading will be rare (particularly judging by +# the bug reports from users on those platforms), so for the common case avoid +# complexity, and avoid even compiling the unneeded code. + +sub init_refaddr_format { +} + +sub format_refaddr { + require Scalar::Util; + pack "J", Scalar::Util::refaddr(shift); +}; + +if ($] < 5.008) { + eval <<'EOC' or die; + no warnings 'redefine'; + my $refaddr_format; + sub init_refaddr_format { + require Config; + my $f = $Config::Config{uvxformat}; + $f =~ tr/"//d; + $refaddr_format = "0x%" . $f; + } + + sub format_refaddr { + require Scalar::Util; + sprintf $refaddr_format, Scalar::Util::refaddr(shift); + } + + 1 +EOC +} + +# +# add-to or query the table of already seen references +# +sub Seen { + my($s, $g) = @_; + if (defined($g) && (ref($g) eq 'HASH')) { + init_refaddr_format(); + my($k, $v, $id); + while (($k, $v) = each %$g) { + if (defined $v) { + if (ref $v) { + $id = format_refaddr($v); + if ($k =~ /^[*](.*)$/) { + $k = (ref $v eq 'ARRAY') ? ( "\\\@" . $1 ) : + (ref $v eq 'HASH') ? ( "\\\%" . $1 ) : + (ref $v eq 'CODE') ? ( "\\\&" . $1 ) : + ( "\$" . $1 ) ; + } + elsif ($k !~ /^\$/) { + $k = "\$" . $k; + } + $s->{seen}{$id} = [$k, $v]; + } + else { + Carp::carp("Only refs supported, ignoring non-ref item \$$k"); + } + } + else { + Carp::carp("Value of ref must be defined; ignoring undefined item \$$k"); + } + } + return $s; + } + else { + return map { @$_ } values %{$s->{seen}}; + } +} + +# +# set or query the values to be dumped +# +sub Values { + my($s, $v) = @_; + if (defined($v)) { + if (ref($v) eq 'ARRAY') { + $s->{todump} = [@$v]; # make a copy + return $s; + } + else { + Carp::croak("Argument to Values, if provided, must be array ref"); + } + } + else { + return @{$s->{todump}}; + } +} + +# +# set or query the names of the values to be dumped +# +sub Names { + my($s, $n) = @_; + if (defined($n)) { + if (ref($n) eq 'ARRAY') { + $s->{names} = [@$n]; # make a copy + return $s; + } + else { + Carp::croak("Argument to Names, if provided, must be array ref"); + } + } + else { + return @{$s->{names}}; + } +} + +sub DESTROY {} + +sub Dump { + # On old versions of perl, the xs-deparse support can fail + # mysteriously. Barring copious spare time, it's best to revert + # to the previously standard behavior of using the pure perl dumper + # for deparsing on old perls. --Steffen + if (IS_PRE_520_PERL and ($Data::Dumper::Deparse or (ref($_[0]) && $_[0]->{deparse}))) { + return &Dumpperl; + } + + return &Dumpxs + unless $Data::Dumper::Useperl || (ref($_[0]) && $_[0]->{useperl}) + # Use pure perl version on earlier releases on EBCDIC platforms + || (! $IS_ASCII && $] lt 5.021_010); + return &Dumpperl; +} + +# +# dump the refs in the current dumper object. +# expects same args as new() if called via package name. +# +sub Dumpperl { + my($s) = shift; + my(@out, $val, $name); + my($i) = 0; + local(@post); + init_refaddr_format(); + + $s = $s->new(@_) unless ref $s; + + for $val (@{$s->{todump}}) { + @post = (); + $name = $s->{names}[$i++]; + $name = $s->_refine_name($name, $val, $i); + + my $valstr; + { + local($s->{apad}) = $s->{apad}; + $s->{apad} .= ' ' x (length($name) + 3) if $s->{indent} >= 2 and !$s->{terse}; + $valstr = $s->_dump($val, $name); + } + + $valstr = "$name = " . $valstr . ';' if @post or !$s->{terse}; + my $out = $s->_compose_out($valstr, \@post); + + push @out, $out; + } + return wantarray ? @out : join('', @out); +} + +# wrap string in single quotes (escaping if needed) +sub _quote { + my $val = shift; + $val =~ s/([\\\'])/\\$1/g; + return "'" . $val . "'"; +} + +# Old Perls (5.14-) have trouble resetting vstring magic when it is no +# longer valid. +use constant _bad_vsmg => defined &_vstring && (_vstring(~v0)||'') eq "v0"; + +# +# twist, toil and turn; +# and recurse, of course. +# sometimes sordidly; +# and curse if no recourse. +# +sub _dump { + my($s, $val, $name) = @_; + my($out, $type, $id, $sname); + + $type = ref $val; + $out = ""; + + if ($type) { + + # Call the freezer method if it's specified and the object has the + # method. Trap errors and warn() instead of die()ing, like the XS + # implementation. + my $freezer = $s->{freezer}; + if ($freezer and UNIVERSAL::can($val, $freezer)) { + eval { $val->$freezer() }; + warn "WARNING(Freezer method call failed): $@" if $@; + } + + require Scalar::Util; + my $realpack = Scalar::Util::blessed($val); + my $realtype = $realpack ? Scalar::Util::reftype($val) : ref $val; + $id = format_refaddr($val); + + # Note: By this point $name is always defined and of non-zero length. + # Keep a tab on it so that we do not fall into recursive pit. + if (exists $s->{seen}{$id}) { + if ($s->{purity} and $s->{level} > 0) { + $out = ($realtype eq 'HASH') ? '{}' : + ($realtype eq 'ARRAY') ? '[]' : + 'do{my $o}' ; + push @post, $name . " = " . $s->{seen}{$id}[0]; + } + else { + $out = $s->{seen}{$id}[0]; + if ($name =~ /^([\@\%])/) { + my $start = $1; + if ($out =~ /^\\$start/) { + $out = substr($out, 1); + } + else { + $out = $start . '{' . $out . '}'; + } + } + } + return $out; + } + else { + # store our name + $s->{seen}{$id} = [ ( + ($name =~ /^[@%]/) + ? ('\\' . $name ) + : ($realtype eq 'CODE' and $name =~ /^[*](.*)$/) + ? ('\\&' . $1 ) + : $name + ), $val ]; + } + my $no_bless = 0; + my $is_regex = 0; + if ( $realpack and ($] >= 5.009005 ? re::is_regexp($val) : $realpack eq 'Regexp') ) { + $is_regex = 1; + $no_bless = $realpack eq 'Regexp'; + } + + # If purity is not set and maxdepth is set, then check depth: + # if we have reached maximum depth, return the string + # representation of the thing we are currently examining + # at this depth (i.e., 'Foo=ARRAY(0xdeadbeef)'). + if (!$s->{purity} + and defined($s->{maxdepth}) + and $s->{maxdepth} > 0 + and $s->{level} >= $s->{maxdepth}) + { + return qq['$val']; + } + + # avoid recursing infinitely [perl #122111] + if ($s->{maxrecurse} > 0 + and $s->{level} >= $s->{maxrecurse}) { + die "Recursion limit of $s->{maxrecurse} exceeded"; + } + + # we have a blessed ref + my ($blesspad); + if ($realpack and !$no_bless) { + $out = $s->{'bless'} . '( '; + $blesspad = $s->{apad}; + $s->{apad} .= ' ' if ($s->{indent} >= 2); + } + + $s->{level}++; + my $ipad = $s->{xpad} x $s->{level}; + + if ($is_regex) { + my $pat; + my $flags = ""; + if (defined(*re::regexp_pattern{CODE})) { + ($pat, $flags) = re::regexp_pattern($val); + } + else { + $pat = "$val"; + } + $pat =~ s <(\\.)|/> { $1 || '\\/' }ge; + $out .= "qr/$pat/$flags"; + } + elsif ($realtype eq 'SCALAR' || $realtype eq 'REF' + || $realtype eq 'VSTRING') { + if ($realpack) { + $out .= 'do{\\(my $o = ' . $s->_dump($$val, "\${$name}") . ')}'; + } + else { + $out .= '\\' . $s->_dump($$val, "\${$name}"); + } + } + elsif ($realtype eq 'GLOB') { + $out .= '\\' . $s->_dump($$val, "*{$name}"); + } + elsif ($realtype eq 'ARRAY') { + my($pad, $mname); + my($i) = 0; + $out .= ($name =~ /^\@/) ? '(' : '['; + $pad = $s->{sep} . $s->{pad} . $s->{apad}; + ($name =~ /^\@(.*)$/) ? ($mname = "\$" . $1) : + # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar} + ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) : + ($mname = $name . '->'); + $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; + for my $v (@$val) { + $sname = $mname . '[' . $i . ']'; + $out .= $pad . $ipad . '#' . $i + if $s->{indent} >= 3; + $out .= $pad . $ipad . $s->_dump($v, $sname); + $out .= "," + if $i++ < $#$val + || ($s->{trailingcomma} && $s->{indent} >= 1); + } + $out .= $pad . ($s->{xpad} x ($s->{level} - 1)) if $i; + $out .= ($name =~ /^\@/) ? ')' : ']'; + } + elsif ($realtype eq 'HASH') { + my ($k, $v, $pad, $lpad, $mname, $pair); + $out .= ($name =~ /^\%/) ? '(' : '{'; + $pad = $s->{sep} . $s->{pad} . $s->{apad}; + $lpad = $s->{apad}; + $pair = $s->{pair}; + ($name =~ /^\%(.*)$/) ? ($mname = "\$" . $1) : + # omit -> if $foo->[0]->{bar}, but not ${$foo->[0]}->{bar} + ($name =~ /^\\?[\%\@\*\$][^{].*[]}]$/) ? ($mname = $name) : + ($mname = $name . '->'); + $mname .= '->' if $mname =~ /^\*.+\{[A-Z]+\}$/; + my $sortkeys = defined($s->{sortkeys}) ? $s->{sortkeys} : ''; + my $keys = []; + if ($sortkeys) { + if (ref($s->{sortkeys}) eq 'CODE') { + $keys = $s->{sortkeys}($val); + unless (ref($keys) eq 'ARRAY') { + Carp::carp("Sortkeys subroutine did not return ARRAYREF"); + $keys = []; + } + } + else { + $keys = [ sort keys %$val ]; + } + } + + # Ensure hash iterator is reset + keys(%$val); + + my $key; + while (($k, $v) = ! $sortkeys ? (each %$val) : + @$keys ? ($key = shift(@$keys), $val->{$key}) : + () ) + { + my $nk = $s->_dump($k, ""); + + # _dump doesn't quote numbers of this form + if ($s->{quotekeys} && $nk =~ /^(?:0|-?[1-9][0-9]{0,8})\z/) { + $nk = $s->{useqq} ? qq("$nk") : qq('$nk'); + } + elsif (!$s->{quotekeys} and $nk =~ /^[\"\']([A-Za-z_]\w*)[\"\']$/) { + $nk = $1 + } + + $sname = $mname . '{' . $nk . '}'; + $out .= $pad . $ipad . $nk . $pair; + + # temporarily alter apad + $s->{apad} .= (" " x (length($nk) + 4)) + if $s->{indent} >= 2; + $out .= $s->_dump($val->{$k}, $sname) . ","; + $s->{apad} = $lpad + if $s->{indent} >= 2; + } + if (substr($out, -1) eq ',') { + chop $out if !$s->{trailingcomma} || !$s->{indent}; + $out .= $pad . ($s->{xpad} x ($s->{level} - 1)); + } + $out .= ($name =~ /^\%/) ? ')' : '}'; + } + elsif ($realtype eq 'CODE') { + if ($s->{deparse}) { + require B::Deparse; + my $sub = 'sub ' . (B::Deparse->new)->coderef2text($val); + $pad = $s->{sep} . $s->{pad} . $s->{apad} . $s->{xpad} x ($s->{level} - 1); + $sub =~ s/\n/$pad/gs; + $out .= $sub; + } + else { + $out .= 'sub { "DUMMY" }'; + Carp::carp("Encountered CODE ref, using dummy placeholder") if $s->{purity}; + } + } + else { + Carp::croak("Can't handle '$realtype' type"); + } + + if ($realpack and !$no_bless) { # we have a blessed ref + $out .= ', ' . _quote($realpack) . ' )'; + $out .= '->' . $s->{toaster} . '()' + if $s->{toaster} ne ''; + $s->{apad} = $blesspad; + } + $s->{level}--; + } + else { # simple scalar + + my $ref = \$_[1]; + my $v; + # first, catalog the scalar + if ($name ne '') { + $id = format_refaddr($ref); + if (exists $s->{seen}{$id}) { + if ($s->{seen}{$id}[2]) { + $out = $s->{seen}{$id}[0]; + #warn "[<$out]\n"; + return "\${$out}"; + } + } + else { + #warn "[>\\$name]\n"; + $s->{seen}{$id} = ["\\$name", $ref]; + } + } + $ref = \$val; + if (ref($ref) eq 'GLOB') { # glob + my $name = substr($val, 1); + $name =~ s/^main::(?!\z)/::/; + if ($name =~ /\A(?:[A-Z_a-z][0-9A-Z_a-z]*)?::(?:[0-9A-Z_a-z]+::)*[0-9A-Z_a-z]*\z/ && $name ne 'main::') { + $sname = $name; + } + else { + $sname = $s->_dump( + $name eq 'main::' || $] < 5.007 && $name eq "main::\0" + ? '' + : $name, + "", + ); + $sname = '{' . $sname . '}'; + } + if ($s->{purity}) { + my $k; + local ($s->{level}) = 0; + for $k (qw(SCALAR ARRAY HASH)) { + my $gval = *$val{$k}; + next unless defined $gval; + next if $k eq "SCALAR" && ! defined $$gval; # always there + + # _dump can push into @post, so we hold our place using $postlen + my $postlen = scalar @post; + $post[$postlen] = "\*$sname = "; + local ($s->{apad}) = " " x length($post[$postlen]) if $s->{indent} >= 2; + $post[$postlen] .= $s->_dump($gval, "\*$sname\{$k\}"); + } + } + $out .= '*' . $sname; + } + elsif (!defined($val)) { + $out .= "undef"; + } + elsif (defined &_vstring and $v = _vstring($val) + and !_bad_vsmg || eval $v eq $val) { + $out .= $v; + } + elsif (!defined &_vstring + and ref $ref eq 'VSTRING' || eval{Scalar::Util::isvstring($val)}) { + $out .= sprintf "%vd", $val; + } + # \d here would treat "1\x{660}" as a safe decimal number + elsif ($val =~ /^(?:0|-?[1-9][0-9]{0,8})\z/) { # safe decimal number + $out .= $val; + } + else { # string + if ($s->{useqq} or $val =~ tr/\0-\377//c) { + # Fall back to qq if there's Unicode + $out .= qquote($val, $s->{useqq}); + } + else { + $out .= _quote($val); + } + } + } + if ($id) { + # if we made it this far, $id was added to seen list at current + # level, so remove it to get deep copies + if ($s->{deepcopy}) { + delete($s->{seen}{$id}); + } + elsif ($name) { + $s->{seen}{$id}[2] = 1; + } + } + return $out; +} + +# +# non-OO style of earlier version +# +sub Dumper { + return Data::Dumper->Dump([@_]); +} + +# compat stub +sub DumperX { + return Data::Dumper->Dumpxs([@_], []); +} + +# +# reset the "seen" cache +# +sub Reset { + my($s) = shift; + $s->{seen} = {}; + return $s; +} + +sub Indent { + my($s, $v) = @_; + if (@_ >= 2) { + if ($v == 0) { + $s->{xpad} = ""; + $s->{sep} = ""; + } + else { + $s->{xpad} = " "; + $s->{sep} = "\n"; + } + $s->{indent} = $v; + return $s; + } + else { + return $s->{indent}; + } +} + +sub Trailingcomma { + my($s, $v) = @_; + @_ >= 2 ? (($s->{trailingcomma} = $v), return $s) : $s->{trailingcomma}; +} + +sub Pair { + my($s, $v) = @_; + @_ >= 2 ? (($s->{pair} = $v), return $s) : $s->{pair}; +} + +sub Pad { + my($s, $v) = @_; + @_ >= 2 ? (($s->{pad} = $v), return $s) : $s->{pad}; +} + +sub Varname { + my($s, $v) = @_; + @_ >= 2 ? (($s->{varname} = $v), return $s) : $s->{varname}; +} + +sub Purity { + my($s, $v) = @_; + @_ >= 2 ? (($s->{purity} = $v), return $s) : $s->{purity}; +} + +sub Useqq { + my($s, $v) = @_; + @_ >= 2 ? (($s->{useqq} = $v), return $s) : $s->{useqq}; +} + +sub Terse { + my($s, $v) = @_; + @_ >= 2 ? (($s->{terse} = $v), return $s) : $s->{terse}; +} + +sub Freezer { + my($s, $v) = @_; + @_ >= 2 ? (($s->{freezer} = $v), return $s) : $s->{freezer}; +} + +sub Toaster { + my($s, $v) = @_; + @_ >= 2 ? (($s->{toaster} = $v), return $s) : $s->{toaster}; +} + +sub Deepcopy { + my($s, $v) = @_; + @_ >= 2 ? (($s->{deepcopy} = $v), return $s) : $s->{deepcopy}; +} + +sub Quotekeys { + my($s, $v) = @_; + @_ >= 2 ? (($s->{quotekeys} = $v), return $s) : $s->{quotekeys}; +} + +sub Bless { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'bless'} = $v), return $s) : $s->{'bless'}; +} + +sub Maxdepth { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'maxdepth'} = $v), return $s) : $s->{'maxdepth'}; +} + +sub Maxrecurse { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'maxrecurse'} = $v), return $s) : $s->{'maxrecurse'}; +} + +sub Useperl { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'useperl'} = $v), return $s) : $s->{'useperl'}; +} + +sub Sortkeys { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'sortkeys'} = $v), return $s) : $s->{'sortkeys'}; +} + +sub Deparse { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'deparse'} = $v), return $s) : $s->{'deparse'}; +} + +sub Sparseseen { + my($s, $v) = @_; + @_ >= 2 ? (($s->{'noseen'} = $v), return $s) : $s->{'noseen'}; +} + +# used by qquote below +my %esc = ( + "\a" => "\\a", + "\b" => "\\b", + "\t" => "\\t", + "\n" => "\\n", + "\f" => "\\f", + "\r" => "\\r", + "\e" => "\\e", +); + +my $low_controls = ($IS_ASCII) + + # This includes \177, because traditionally it has been + # output as octal, even though it isn't really a "low" + # control + ? qr/[\0-\x1f\177]/ + + # EBCDIC low controls. + : qr/[\0-\x3f]/; + +# put a string value in double quotes +sub qquote { + local($_) = shift; + s/([\\\"\@\$])/\\$1/g; + + # This efficiently changes the high ordinal characters to \x{} if the utf8 + # flag is on. On ASCII platforms, the high ordinals are all the + # non-ASCII's. On EBCDIC platforms, we don't include in these the non-ASCII + # controls whose ordinals are less than SPACE, excluded below by the range + # \0-\x3f. On ASCII platforms this range just compiles as part of :ascii:. + # On EBCDIC platforms, there is just one outlier high ordinal control, and + # it gets output as \x{}. + my $bytes; { use bytes; $bytes = length } + s/([^[:ascii:]\0-\x3f])/sprintf("\\x{%x}",ord($1))/ge + if $bytes > length + + # The above doesn't get the EBCDIC outlier high ordinal control when + # the string is UTF-8 but there are no UTF-8 variant characters in it. + # We want that to come out as \x{} anyway. We need is_utf8() to do + # this. + || (! $IS_ASCII && $] ge 5.008_001 && utf8::is_utf8($_)); + + return qq("$_") unless /[[:^print:]]/; # fast exit if only printables + + # Here, there is at least one non-printable to output. First, translate the + # escapes. + s/([\a\b\t\n\f\r\e])/$esc{$1}/g; + + # no need for 3 digits in escape for octals not followed by a digit. + s/($low_controls)(?!\d)/'\\'.sprintf('%o',ord($1))/eg; + + # But otherwise use 3 digits + s/($low_controls)/'\\'.sprintf('%03o',ord($1))/eg; + + # all but last branch below not supported --BEHAVIOR SUBJECT TO CHANGE-- + my $high = shift || ""; + if ($high eq "iso8859") { # Doesn't escape the Latin1 printables + if ($IS_ASCII) { + s/([\200-\240])/'\\'.sprintf('%o',ord($1))/eg; + } + elsif ($] ge 5.007_003) { + my $high_control = utf8::unicode_to_native(0x9F); + s/$high_control/sprintf('\\%o',ord($1))/eg; + } + } elsif ($high eq "utf8") { +# Some discussion of what to do here is in +# https://rt.perl.org/Ticket/Display.html?id=113088 +# use utf8; +# $str =~ s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge; + } elsif ($high eq "8bit") { + # leave it as it is + } else { + s/([[:^ascii:]])/'\\'.sprintf('%03o',ord($1))/eg; + #s/([^\040-\176])/sprintf "\\x{%04x}", ord($1)/ge; + } + + return qq("$_"); +} + +# helper sub to sort hash keys in Perl < 5.8.0 where we don't have +# access to sortsv() from XS +sub _sortkeys { [ sort keys %{$_[0]} ] } + +sub _refine_name { + my $s = shift; + my ($name, $val, $i) = @_; + if (defined $name) { + if ($name =~ /^[*](.*)$/) { + if (defined $val) { + $name = (ref $val eq 'ARRAY') ? ( "\@" . $1 ) : + (ref $val eq 'HASH') ? ( "\%" . $1 ) : + (ref $val eq 'CODE') ? ( "\*" . $1 ) : + ( "\$" . $1 ) ; + } + else { + $name = "\$" . $1; + } + } + elsif ($name !~ /^\$/) { + $name = "\$" . $name; + } + } + else { # no names provided + $name = "\$" . $s->{varname} . $i; + } + return $name; +} + +sub _compose_out { + my $s = shift; + my ($valstr, $postref) = @_; + my $out = ""; + $out .= $s->{pad} . $valstr . $s->{sep}; + if (@{$postref}) { + $out .= $s->{pad} . + join(';' . $s->{sep} . $s->{pad}, @{$postref}) . + ';' . + $s->{sep}; + } + return $out; +} + +1; +__END__ + +package Cpanel::JSON::XS; +our $VERSION = '4.09'; +our $XS_VERSION = $VERSION; +# $VERSION = eval $VERSION; + + +our @ISA = qw(Exporter); +our @EXPORT = qw(encode_json decode_json to_json from_json); + +sub to_json($@) { + if ($] >= 5.008) { + require Carp; + Carp::croak ("Cpanel::JSON::XS::to_json has been renamed to encode_json,". + " either downgrade to pre-2.0 versions of Cpanel::JSON::XS or". + " rename the call"); + } else { + _to_json(@_); + } +} + +sub from_json($@) { + if ($] >= 5.008) { + require Carp; + Carp::croak ("Cpanel::JSON::XS::from_json has been renamed to decode_json,". + " either downgrade to pre-2.0 versions of Cpanel::JSON::XS or". + " rename the call"); + } else { + _from_json(@_); + } +} + +use Exporter; +use XSLoader; + + +sub allow_bigint { + Carp::carp("allow_bigint() is obsoleted. use allow_bignum() instead."); +} + +BEGIN { + package + JSON::PP::Boolean; + + require overload; + + local $^W; # silence redefine warnings. no warnings 'redefine' does not help + &overload::import( 'overload', # workaround 5.6 reserved keyword warning + "0+" => sub { ${$_[0]} }, + "++" => sub { $_[0] = ${$_[0]} + 1 }, + "--" => sub { $_[0] = ${$_[0]} - 1 }, + '""' => sub { ${$_[0]} == 1 ? '1' : '0' }, # GH 29 + 'eq' => sub { + my ($obj, $op) = $_[2] ? ($_[1], $_[0]) : ($_[0], $_[1]); + #warn "eq obj:$obj op:$op len:", length($op) > 0, " swap:$_[2]"; + if (ref $op) { # if 2nd also blessed might recurse endlessly + return $obj ? 1 == $op : 0 == $op; + } + # if string, only accept numbers or true|false or "" (e.g. !!0 / SV_NO) + elsif ($op !~ /^[0-9]+$/) { + return "$obj" eq '1' ? 'true' eq $op : 'false' eq $op || "" eq $op; + } + else { + return $obj ? 1 == $op : 0 == $op; + } + }, + 'ne' => sub { + my ($obj, $op) = $_[2] ? ($_[1], $_[0]) : ($_[0], $_[1]); + #warn "ne obj:$obj op:$op"; + return !($obj eq $op); + }, + fallback => 1); +} + +our ($true, $false); +BEGIN { + if ($INC{'JSON/XS.pm'} + and $INC{'Types/Serialiser.pm'} + and $JSON::XS::VERSION ge "3.00") { + $true = $Types::Serialiser::true; # readonly if loaded by JSON::XS + $false = $Types::Serialiser::false; + } else { + $true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" }; + $false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" }; + } +} + +BEGIN { + my $const_true = $true; + my $const_false = $false; + *true = sub () { $const_true }; + *false = sub () { $const_false }; +} + +sub is_bool($) { + shift if @_ == 2; # as method call + (ref($_[0]) and UNIVERSAL::isa( $_[0], JSON::PP::Boolean::)) + or (exists $INC{'Types/Serialiser.pm'} and Types::Serialiser::is_bool($_[0])) +} + +XSLoader::load 'Cpanel::JSON::XS', $XS_VERSION; + +1; + + +package Cpanel::JSON::XS::Type; + + +use strict; +use warnings; + +BEGIN { + if (eval { require Scalar::Util }) { + Scalar::Util->import('weaken'); + } else { + *weaken = sub($) { die 'Scalar::Util is required for weaken' }; + } +} + +# This exports needed XS constants to perl +use Cpanel::JSON::XS (); + +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT = our @EXPORT_OK = qw( + json_type_arrayof + json_type_hashof + json_type_anyof + json_type_null_or_anyof + json_type_weaken + JSON_TYPE_NULL + JSON_TYPE_BOOL + JSON_TYPE_INT + JSON_TYPE_FLOAT + JSON_TYPE_STRING + JSON_TYPE_BOOL_OR_NULL + JSON_TYPE_INT_OR_NULL + JSON_TYPE_FLOAT_OR_NULL + JSON_TYPE_STRING_OR_NULL + JSON_TYPE_ARRAYOF_CLASS + JSON_TYPE_HASHOF_CLASS + JSON_TYPE_ANYOF_CLASS +); + +use constant JSON_TYPE_WEAKEN_CLASS => 'Cpanel::JSON::XS::Type::Weaken'; + +sub json_type_anyof { + my ($scalar, $array, $hash); + my ($scalar_weaken, $array_weaken, $hash_weaken); + foreach (@_) { + my $type = $_; + my $ref = ref($_); + my $weaken; + if ($ref eq JSON_TYPE_WEAKEN_CLASS) { + $type = ${$type}; + $ref = ref($type); + $weaken = 1; + } + if ($ref eq '') { + die 'Only one scalar type can be specified in anyof' if defined $scalar; + $scalar = $type; + $scalar_weaken = $weaken; + } elsif ($ref eq 'ARRAY' or $ref eq JSON_TYPE_ARRAYOF_CLASS) { + die 'Only one array type can be specified in anyof' if defined $array; + $array = $type; + $array_weaken = $weaken; + } elsif ($ref eq 'HASH' or $ref eq JSON_TYPE_HASHOF_CLASS) { + die 'Only one hash type can be specified in anyof' if defined $hash; + $hash = $type; + $hash_weaken = $weaken; + } else { + die 'Only scalar, array or hash can be specified in anyof'; + } + } + my $type = [$scalar, $array, $hash]; + weaken $type->[0] if $scalar_weaken; + weaken $type->[1] if $array_weaken; + weaken $type->[2] if $hash_weaken; + return bless $type, JSON_TYPE_ANYOF_CLASS; +} + +sub json_type_null_or_anyof { + foreach (@_) { + die 'Scalar cannot be specified in null_or_anyof' if ref($_) eq ''; + } + return json_type_anyof(JSON_TYPE_CAN_BE_NULL, @_); +} + +sub json_type_arrayof { + die 'Exactly one type must be specified in arrayof' if scalar @_ != 1; + my $type = $_[0]; + if (ref($type) eq JSON_TYPE_WEAKEN_CLASS) { + $type = ${$type}; + weaken $type; + } + return bless \$type, JSON_TYPE_ARRAYOF_CLASS; +} + +sub json_type_hashof { + die 'Exactly one type must be specified in hashof' if scalar @_ != 1; + my $type = $_[0]; + if (ref($type) eq JSON_TYPE_WEAKEN_CLASS) { + $type = ${$type}; + weaken $type; + } + return bless \$type, JSON_TYPE_HASHOF_CLASS; +} + +sub json_type_weaken { + die 'Exactly one type must be specified in weaken' if scalar @_ != 1; + die 'Scalar cannot be specfied in weaken' if ref($_[0]) eq ''; + return bless \(my $type = $_[0]), JSON_TYPE_WEAKEN_CLASS; +} + +1; + +use Cpanel::JSON::XS (); + +1; + + +package File::Spec; + +use strict; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +my %module = ( + MSWin32 => 'Win32', + os2 => 'OS2', + VMS => 'VMS', + NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare. + symbian => 'Win32', # Yes, File::Spec::Win32 works on symbian. + dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP. + cygwin => 'Cygwin', + amigaos => 'AmigaOS'); + + +my $module = $module{$^O} || 'Unix'; + +require "File/Spec/$module.pm"; +our @ISA = ("File::Spec::$module"); + +1; + +__END__ + +package File::Glob; + +use strict; +our($VERSION, @ISA, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS, $DEFAULT_FLAGS); + +require XSLoader; + +@ISA = qw(Exporter); + +# NOTE: The glob() export is only here for compatibility with 5.6.0. +# csh_glob() should not be used directly, unless you know what you're doing. + +%EXPORT_TAGS = ( + 'glob' => [ qw( + GLOB_ABEND + GLOB_ALPHASORT + GLOB_ALTDIRFUNC + GLOB_BRACE + GLOB_CSH + GLOB_ERR + GLOB_ERROR + GLOB_LIMIT + GLOB_MARK + GLOB_NOCASE + GLOB_NOCHECK + GLOB_NOMAGIC + GLOB_NOSORT + GLOB_NOSPACE + GLOB_QUOTE + GLOB_TILDE + bsd_glob + glob + ) ], +); +$EXPORT_TAGS{bsd_glob} = [@{$EXPORT_TAGS{glob}}]; +pop @{$EXPORT_TAGS{bsd_glob}}; # no "glob" + +@EXPORT_OK = (@{$EXPORT_TAGS{'glob'}}, 'csh_glob'); + +$VERSION = '1.31'; + +sub import { + require Exporter; + local $Exporter::ExportLevel = $Exporter::ExportLevel + 1; + Exporter::import(grep { + my $passthrough; + if ($_ eq ':case') { + $DEFAULT_FLAGS &= ~GLOB_NOCASE() + } + elsif ($_ eq ':nocase') { + $DEFAULT_FLAGS |= GLOB_NOCASE(); + } + elsif ($_ eq ':globally') { + no warnings 'redefine'; + *CORE::GLOBAL::glob = \&File::Glob::csh_glob; + } + elsif ($_ eq ':bsd_glob') { + no strict; *{caller."::glob"} = \&bsd_glob_override; + $passthrough = 1; + } + else { + $passthrough = 1; + } + $passthrough; + } @_); +} + +XSLoader::load(); + +$DEFAULT_FLAGS = GLOB_CSH(); +if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos)$/) { + $DEFAULT_FLAGS |= GLOB_NOCASE(); +} + +# File::Glob::glob() is deprecated because its prototype is different from +# CORE::glob() (use bsd_glob() instead) +sub glob { + use 5.024; + use warnings (); + warnings::warnif (deprecated => + "File::Glob::glob() will disappear in perl 5.30. " . + "Use File::Glob::bsd_glob() instead.") unless state $warned ++; + + splice @_, 1; # no flags + goto &bsd_glob; +} + +1; +__END__ + +package File::Spec::Win32; + +use strict; + +use Cwd (); +require File::Spec::Unix; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +our @ISA = qw(File::Spec::Unix); + +# Some regexes we use for path splitting +my $DRIVE_RX = '[a-zA-Z]:'; +my $UNC_RX = '(?:\\\\\\\\|//)[^\\\\/]+[\\\\/][^\\\\/]+'; +my $VOL_RX = "(?:$DRIVE_RX|$UNC_RX)"; + + + +sub devnull { + return "nul"; +} + +sub rootdir { '\\' } + + + +sub tmpdir { + my $tmpdir = $_[0]->_cached_tmpdir(qw(TMPDIR TEMP TMP)); + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( map( $ENV{$_}, qw(TMPDIR TEMP TMP) ), + 'SYS:/temp', + 'C:\system\temp', + 'C:/temp', + '/tmp', + '/' ); + $_[0]->_cache_tmpdir($tmpdir, qw(TMPDIR TEMP TMP)); +} + + +sub case_tolerant { + eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require Win32API::File; + } or return 1; + my $drive = shift || "C:"; + my $osFsType = "\0"x256; + my $osVolName = "\0"x256; + my $ouFsFlags = 0; + Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 ); + if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; } + else { return 1; } +} + + +sub file_name_is_absolute { + + my ($self,$file) = @_; + + if ($file =~ m{^($VOL_RX)}o) { + my $vol = $1; + return ($vol =~ m{^$UNC_RX}o ? 2 + : $file =~ m{^$DRIVE_RX[\\/]}o ? 2 + : 0); + } + return $file =~ m{^[\\/]} ? 1 : 0; +} + + +sub catfile { + shift; + + # Legacy / compatibility support + # + shift, return _canon_cat( "/", @_ ) + if $_[0] eq ""; + + # Compatibility with File::Spec <= 3.26: + # catfile('A:', 'foo') should return 'A:\foo'. + return _canon_cat( ($_[0].'\\'), @_[1..$#_] ) + if $_[0] =~ m{^$DRIVE_RX\z}o; + + return _canon_cat( @_ ); +} + +sub catdir { + shift; + + # Legacy / compatibility support + # + return "" + unless @_; + shift, return _canon_cat( "/", @_ ) + if $_[0] eq ""; + + # Compatibility with File::Spec <= 3.26: + # catdir('A:', 'foo') should return 'A:\foo'. + return _canon_cat( ($_[0].'\\'), @_[1..$#_] ) + if $_[0] =~ m{^$DRIVE_RX\z}o; + + return _canon_cat( @_ ); +} + +sub path { + my @path = split(';', $ENV{PATH}); + s/"//g for @path; + @path = grep length, @path; + unshift(@path, "."); + return @path; +} + + +sub canonpath { + # Legacy / compatibility support + # + return $_[1] if !defined($_[1]) or $_[1] eq ''; + return _canon_cat( $_[1] ); +} + + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file) = ('','',''); + if ( $nofile ) { + $path =~ + m{^ ( $VOL_RX ? ) (.*) }sox; + $volume = $1; + $directory = $2; + } + else { + $path =~ + m{^ ( $VOL_RX ? ) + ( (?:.*[\\/](?:\.\.?\Z(?!\n))?)? ) + (.*) + }sox; + $volume = $1; + $directory = $2; + $file = $3; + } + + return ($volume,$directory,$file); +} + + + +sub splitdir { + my ($self,$directories) = @_ ; + # + # split() likes to forget about trailing null fields, so here we + # check to be sure that there will not be any before handling the + # simple case. + # + if ( $directories !~ m|[\\/]\Z(?!\n)| ) { + return split( m|[\\/]|, $directories ); + } + else { + # + # since there was a trailing separator, add a file name to the end, + # then do the split, then replace it with ''. + # + my( @directories )= split( m|[\\/]|, "${directories}dummy" ) ; + $directories[ $#directories ]= '' ; + return @directories ; + } +} + + + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + # If it's UNC, make sure the glue separator is there, reusing + # whatever separator is first in the $volume + my $v; + $volume .= $v + if ( (($v) = $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s) && + $directory =~ m@^[^\\/]@s + ) ; + + $volume .= $directory ; + + # If the volume is not just A:, make sure the glue separator is + # there, reusing whatever separator is first in the $volume if possible. + if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s && + $volume =~ m@[^\\/]\Z(?!\n)@ && + $file =~ m@[^\\/]@ + ) { + $volume =~ m@([\\/])@ ; + my $sep = $1 ? $1 : '\\' ; + $volume .= $sep ; + } + + $volume .= $file ; + + return $volume ; +} + +sub _same { + lc($_[1]) eq lc($_[2]); +} + +sub rel2abs { + my ($self,$path,$base ) = @_; + + my $is_abs = $self->file_name_is_absolute($path); + + # Check for volume (should probably document the '2' thing...) + return $self->canonpath( $path ) if $is_abs == 2; + + if ($is_abs) { + # It's missing a volume, add one + my $vol = ($self->splitpath( Cwd::getcwd() ))[0]; + return $self->canonpath( $vol . $path ); + } + + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getdcwd( ($self->splitpath( $path ))[0] ) if defined &Cwd::getdcwd ; + $base = Cwd::getcwd() unless defined $base ; + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + my ( $path_directories, $path_file ) = + ($self->splitpath( $path, 1 ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base, 1 ) ; + + $path = $self->catpath( + $base_volume, + $self->catdir( $base_directories, $path_directories ), + $path_file + ) ; + + return $self->canonpath( $path ) ; +} + + + +sub _canon_cat # @path -> path +{ + my ($first, @rest) = @_; + + my $volume = $first =~ s{ \A ([A-Za-z]:) ([\\/]?) }{}x # drive letter + ? ucfirst( $1 ).( $2 ? "\\" : "" ) + : $first =~ s{ \A (?:\\\\|//) ([^\\/]+) + (?: [\\/] ([^\\/]+) )? + [\\/]? }{}xs # UNC volume + ? "\\\\$1".( defined $2 ? "\\$2" : "" )."\\" + : $first =~ s{ \A [\\/] }{}x # root dir + ? "\\" + : ""; + my $path = join "\\", $first, @rest; + + $path =~ tr#\\/#\\\\#s; # xx/yy --> xx\yy & xx\\yy --> xx\yy + + # xx/././yy --> xx/yy + $path =~ s{(?: + (?:\A|\\) # at begin or after a slash + \. + (?:\\\.)* # and more + (?:\\|\z) # at end or followed by slash + )+ # performance boost -- I do not know why + }{\\}gx; + + # XXX I do not know whether more dots are supported by the OS supporting + # this ... annotation (NetWare or symbian but not MSWin32). + # Then .... could easily become ../../.. etc: + # Replace \.\.\. by (\.\.\.+) and substitute with + # { $1 . ".." . "\\.." x (length($2)-2) }gex + # ... --> ../.. + $path =~ s{ (\A|\\) # at begin or after a slash + \.\.\. + (?=\\|\z) # at end or followed by slash + }{$1..\\..}gx; + # xx\yy\..\zz --> xx\zz + while ( $path =~ s{(?: + (?:\A|\\) # at begin or after a slash + [^\\]+ # rip this 'yy' off + \\\.\. + (?<!\A\.\.\\\.\.) # do *not* replace ^..\.. + (?<!\\\.\.\\\.\.) # do *not* replace \..\.. + (?:\\|\z) # at end or followed by slash + )+ # performance boost -- I do not know why + }{\\}sx ) {} + + $path =~ s#\A\\##; # \xx --> xx NOTE: this is *not* root + $path =~ s#\\\z##; # xx\ --> xx + + if ( $volume =~ m#\\\z# ) + { # <vol>\.. --> <vol>\ + $path =~ s{ \A # at begin + \.\. + (?:\\\.\.)* # and more + (?:\\|\z) # at end or followed by slash + }{}x; + + return $1 # \\HOST\SHARE\ --> \\HOST\SHARE + if $path eq "" + and $volume =~ m#\A(\\\\.*)\\\z#s; + } + return $path ne "" || $volume ? $volume.$path : "."; +} + +1; +package File::Spec::Cygwin; + +use strict; +require File::Spec::Unix; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +our @ISA = qw(File::Spec::Unix); + + + +sub canonpath { + my($self,$path) = @_; + return unless defined $path; + + $path =~ s|\\|/|g; + + # Handle network path names beginning with double slash + my $node = ''; + if ( $path =~ s@^(//[^/]+)(?:/|\z)@/@s ) { + $node = $1; + } + return $node . $self->SUPER::canonpath($path); +} + +sub catdir { + my $self = shift; + return unless @_; + + # Don't create something that looks like a //network/path + if ($_[0] and ($_[0] eq '/' or $_[0] eq '\\')) { + shift; + return $self->SUPER::catdir('', @_); + } + + $self->SUPER::catdir(@_); +} + + + +sub file_name_is_absolute { + my ($self,$file) = @_; + return 1 if $file =~ m{^([a-z]:)?[\\/]}is; # C:/test + return $self->SUPER::file_name_is_absolute($file); +} + + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir(qw 'TMPDIR TMP TEMP'); + return $cached if defined $cached; + $_[0]->_cache_tmpdir( + $_[0]->_tmpdir( + $ENV{TMPDIR}, "/tmp", $ENV{'TMP'}, $ENV{'TEMP'}, 'C:/temp' + ), + qw 'TMPDIR TMP TEMP' + ); +} + + +sub case_tolerant { + return 1 unless $^O eq 'cygwin' + and defined &Cygwin::mount_flags; + + my $drive = shift; + if (! $drive) { + my @flags = split(/,/, Cygwin::mount_flags('/cygwin')); + my $prefix = pop(@flags); + if (! $prefix || $prefix eq 'cygdrive') { + $drive = '/cygdrive/c'; + } elsif ($prefix eq '/') { + $drive = '/c'; + } else { + $drive = "$prefix/c"; + } + } + my $mntopts = Cygwin::mount_flags($drive); + if ($mntopts and ($mntopts =~ /,managed/)) { + return 0; + } + eval { + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require Win32API::File; + } or return 1; + my $osFsType = "\0"x256; + my $osVolName = "\0"x256; + my $ouFsFlags = 0; + Win32API::File::GetVolumeInformation($drive, $osVolName, 256, [], [], $ouFsFlags, $osFsType, 256 ); + if ($ouFsFlags & Win32API::File::FS_CASE_SENSITIVE()) { return 0; } + else { return 1; } +} + + +1; +package File::Spec::VMS; + +use strict; +use Cwd (); +require File::Spec::Unix; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +our @ISA = qw(File::Spec::Unix); + +use File::Basename; +use VMS::Filespec; + + +# Need to look up the feature settings. The preferred way is to use the +# VMS::Feature module, but that may not be available to dual life modules. + +my $use_feature; +BEGIN { + if (eval { local $SIG{__DIE__}; + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + require VMS::Feature; }) { + $use_feature = 1; + } +} + +# Need to look up the UNIX report mode. This may become a dynamic mode +# in the future. +sub _unix_rpt { + my $unix_rpt; + if ($use_feature) { + $unix_rpt = VMS::Feature::current("filename_unix_report"); + } else { + my $env_unix_rpt = $ENV{'DECC$FILENAME_UNIX_REPORT'} || ''; + $unix_rpt = $env_unix_rpt =~ /^[ET1]/i; + } + return $unix_rpt; +} + + + +sub canonpath { + my($self,$path) = @_; + + return undef unless defined $path; + + my $unix_rpt = $self->_unix_rpt; + + if ($path =~ m|/|) { + my $pathify = $path =~ m|/\Z(?!\n)|; + $path = $self->SUPER::canonpath($path); + + return $path if $unix_rpt; + $path = $pathify ? vmspath($path) : vmsify($path); + } + + $path =~ s/(?<!\^)</[/; # < and > ==> [ and ] + $path =~ s/(?<!\^)>/]/; + $path =~ s/(?<!\^)\]\[\./\.\]\[/g; # ][. ==> .][ + $path =~ s/(?<!\^)\[000000\.\]\[/\[/g; # [000000.][ ==> [ + $path =~ s/(?<!\^)\[000000\./\[/g; # [000000. ==> [ + $path =~ s/(?<!\^)\.\]\[000000\]/\]/g; # .][000000] ==> ] + $path =~ s/(?<!\^)\.\]\[/\./g; # foo.][bar ==> foo.bar + 1 while ($path =~ s/(?<!\^)([\[\.])(-+)\.(-+)([\.\]])/$1$2$3$4/); + # That loop does the following + # with any amount of dashes: + # .-.-. ==> .--. + # [-.-. ==> [--. + # .-.-] ==> .--] + # [-.-] ==> [--] + 1 while ($path =~ s/(?<!\^)([\[\.])(?:\^.|[^\]\.])+\.-(-+)([\]\.])/$1$2$3/); + # That loop does the following + # with any amount (minimum 2) + # of dashes: + # .foo.--. ==> .-. + # .foo.--] ==> .-] + # [foo.--. ==> [-. + # [foo.--] ==> [-] + # + # And then, the remaining cases + $path =~ s/(?<!\^)\[\.-/[-/; # [.- ==> [- + $path =~ s/(?<!\^)\.(?:\^.|[^\]\.])+\.-\./\./g; # .foo.-. ==> . + $path =~ s/(?<!\^)\[(?:\^.|[^\]\.])+\.-\./\[/g; # [foo.-. ==> [ + $path =~ s/(?<!\^)\.(?:\^.|[^\]\.])+\.-\]/\]/g; # .foo.-] ==> ] + # [foo.-] ==> [000000] + $path =~ s/(?<!\^)\[(?:\^.|[^\]\.])+\.-\]/\[000000\]/g; + # [] ==> + $path =~ s/(?<!\^)\[\]// unless $path eq '[]'; + return $unix_rpt ? unixify($path) : $path; +} + + +sub catdir { + my $self = shift; + my $dir = pop; + + my $unix_rpt = $self->_unix_rpt; + + my @dirs = grep {defined() && length()} @_; + + my $rslt; + if (@dirs) { + my $path = (@dirs == 1 ? $dirs[0] : $self->catdir(@dirs)); + my ($spath,$sdir) = ($path,$dir); + $spath =~ s/\.dir\Z(?!\n)//i; $sdir =~ s/\.dir\Z(?!\n)//i; + + if ($unix_rpt) { + $spath = unixify($spath) unless $spath =~ m#/#; + $sdir= unixify($sdir) unless $sdir =~ m#/#; + return $self->SUPER::catdir($spath, $sdir) + } + + $rslt = vmspath( unixify($spath) . '/' . unixify($sdir)); + + # Special case for VMS absolute directory specs: these will have + # had device prepended during trip through Unix syntax in + # eliminate_macros(), since Unix syntax has no way to express + # "absolute from the top of this device's directory tree". + if ($spath =~ /^[\[<][^.\-]/s) { $rslt =~ s/^[^\[<]+//s; } + + } else { + # Single directory. Return an empty string on null input; otherwise + # just return a canonical path. + + if (not defined $dir or not length $dir) { + $rslt = ''; + } else { + $rslt = $unix_rpt ? $dir : vmspath($dir); + } + } + return $self->canonpath($rslt); +} + + +sub catfile { + my $self = shift; + my $tfile = pop(); + my $file = $self->canonpath($tfile); + my @files = grep {defined() && length()} @_; + + my $unix_rpt = $self->_unix_rpt; + + my $rslt; + if (@files) { + my $path = (@files == 1 ? $files[0] : $self->catdir(@files)); + my $spath = $path; + + # Something building a VMS path in pieces may try to pass a + # directory name in filename format, so normalize it. + $spath =~ s/\.dir\Z(?!\n)//i; + + # If the spath ends with a directory delimiter and the file is bare, + # then just concatenate them. + if ($spath =~ /^(?<!\^)[^\)\]\/:>]+\)\Z(?!\n)/s && basename($file) eq $file) { + $rslt = "$spath$file"; + } else { + $rslt = unixify($spath); + $rslt .= (defined($rslt) && length($rslt) ? '/' : '') . unixify($file); + $rslt = vmsify($rslt) unless $unix_rpt; + } + } + else { + # Only passed a single file? + my $xfile = (defined($file) && length($file)) ? $file : ''; + + $rslt = $unix_rpt ? $xfile : vmsify($xfile); + } + return $self->canonpath($rslt) unless $unix_rpt; + + # In Unix report mode, do not strip off redundant path information. + return $rslt; +} + + + +sub curdir { + my $self = shift @_; + return '.' if ($self->_unix_rpt); + return '[]'; +} + + +sub devnull { + my $self = shift @_; + return '/dev/null' if ($self->_unix_rpt); + return "_NLA0:"; +} + + +sub rootdir { + my $self = shift @_; + if ($self->_unix_rpt) { + # Root may exist, try it first. + my $try = '/'; + my ($dev1, $ino1) = stat('/'); + my ($dev2, $ino2) = stat('.'); + + # Perl falls back to '.' if it can not determine '/' + if (($dev1 != $dev2) || ($ino1 != $ino2)) { + return $try; + } + # Fall back to UNIX format sys$disk. + return '/sys$disk/'; + } + return 'SYS$DISK:[000000]'; +} + + +sub tmpdir { + my $self = shift @_; + my $tmpdir = $self->_cached_tmpdir('TMPDIR'); + return $tmpdir if defined $tmpdir; + if ($self->_unix_rpt) { + $tmpdir = $self->_tmpdir('/tmp', '/sys$scratch', $ENV{TMPDIR}); + } + else { + $tmpdir = $self->_tmpdir( 'sys$scratch:', $ENV{TMPDIR} ); + } + $self->_cache_tmpdir($tmpdir, 'TMPDIR'); +} + + +sub updir { + my $self = shift @_; + return '..' if ($self->_unix_rpt); + return '[-]'; +} + + +sub case_tolerant { + return 1; +} + + +sub path { + my (@dirs,$dir,$i); + while ($dir = $ENV{'DCL$PATH;' . $i++}) { push(@dirs,$dir); } + return @dirs; +} + + +sub file_name_is_absolute { + my ($self,$file) = @_; + # If it's a logical name, expand it. + $file = $ENV{$file} while $file =~ /^[\w\$\-]+\Z(?!\n)/s && $ENV{$file}; + return scalar($file =~ m!^/!s || + $file =~ m![<\[][^.\-\]>]! || + $file =~ /^[A-Za-z0-9_\$\-\~]+(?<!\^):/); +} + + +sub splitpath { + my($self,$path, $nofile) = @_; + my($dev,$dir,$file) = ('','',''); + my $vmsify_path = vmsify($path); + + if ( $nofile ) { + #vmsify('d1/d2/d3') returns '[.d1.d2]d3' + #vmsify('/d1/d2/d3') returns 'd1:[d2]d3' + if( $vmsify_path =~ /(.*)\](.+)/ ){ + $vmsify_path = $1.'.'.$2.']'; + } + $vmsify_path =~ /(.+:)?(.*)/s; + $dir = defined $2 ? $2 : ''; # dir can be '0' + return ($1 || '',$dir,$file); + } + else { + $vmsify_path =~ /(.+:)?([\[<].*[\]>])?(.*)/s; + return ($1 || '',$2 || '',$3); + } +} + + +sub splitdir { + my($self,$dirspec) = @_; + my @dirs = (); + return @dirs if ( (!defined $dirspec) || ('' eq $dirspec) ); + + $dirspec =~ s/(?<!\^)</[/; # < and > ==> [ and ] + $dirspec =~ s/(?<!\^)>/]/; + $dirspec =~ s/(?<!\^)\]\[\./\.\]\[/g; # ][. ==> .][ + $dirspec =~ s/(?<!\^)\[000000\.\]\[/\[/g; # [000000.][ ==> [ + $dirspec =~ s/(?<!\^)\[000000\./\[/g; # [000000. ==> [ + $dirspec =~ s/(?<!\^)\.\]\[000000\]/\]/g; # .][000000] ==> ] + $dirspec =~ s/(?<!\^)\.\]\[/\./g; # foo.][bar ==> foo.bar + while ($dirspec =~ s/(^|[\[\<\.])\-(\-+)($|[\]\>\.])/$1-.$2$3/g) {} + # That loop does the following + # with any amount of dashes: + # .--. ==> .-.-. + # [--. ==> [-.-. + # .--] ==> .-.-] + # [--] ==> [-.-] + $dirspec = "[$dirspec]" unless $dirspec =~ /(?<!\^)[\[<]/; # make legal + $dirspec =~ s/^(\[|<)\./$1/; + @dirs = split /(?<!\^)\./, vmspath($dirspec); + $dirs[0] =~ s/^[\[<]//s; $dirs[-1] =~ s/[\]>]\Z(?!\n)//s; + @dirs; +} + + + +sub catpath { + my($self,$dev,$dir,$file) = @_; + + # We look for a volume in $dev, then in $dir, but not both + my ($dir_volume, $dir_dir, $dir_file) = $self->splitpath($dir); + $dev = $dir_volume unless length $dev; + $dir = length $dir_file ? $self->catfile($dir_dir, $dir_file) : $dir_dir; + + if ($dev =~ m|^(?<!\^)/+([^/]+)|) { $dev = "$1:"; } + else { $dev .= ':' unless $dev eq '' or $dev =~ /:\Z(?!\n)/; } + if (length($dev) or length($dir)) { + $dir = "[$dir]" unless $dir =~ /(?<!\^)[\[<\/]/; + $dir = vmspath($dir); + } + $dir = '' if length($dev) && ($dir eq '[]' || $dir eq '<>'); + "$dev$dir$file"; +} + + +sub abs2rel { + my $self = shift; + my($path,$base) = @_; + + $base = Cwd::getcwd() unless defined $base and length $base; + + # If there is no device or directory syntax on $base, make sure it + # is treated as a directory. + $base = vmspath($base) unless $base =~ m{(?<!\^)[\[<:]}; + + for ($path, $base) { $_ = $self->rel2abs($_) } + + # Are we even starting $path on the same (node::)device as $base? Note that + # logical paths or nodename differences may be on the "same device" + # but the comparison that ignores device differences so as to concatenate + # [---] up directory specs is not even a good idea in cases where there is + # a logical path difference between $path and $base nodename and/or device. + # Hence we fall back to returning the absolute $path spec + # if there is a case blind device (or node) difference of any sort + # and we do not even try to call $parse() or consult %ENV for $trnlnm() + # (this module needs to run on non VMS platforms after all). + + my ($path_volume, $path_directories, $path_file) = $self->splitpath($path); + my ($base_volume, $base_directories, $base_file) = $self->splitpath($base); + return $self->canonpath( $path ) unless lc($path_volume) eq lc($base_volume); + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my $pathchunks = @pathchunks; + unshift(@pathchunks,'000000') unless $pathchunks[0] eq '000000'; + my @basechunks = $self->splitdir( $base_directories ); + my $basechunks = @basechunks; + unshift(@basechunks,'000000') unless $basechunks[0] eq '000000'; + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + # @basechunks now contains the directories to climb out of, + # @pathchunks now has the directories to descend in to. + if ((@basechunks > 0) || ($basechunks != $pathchunks)) { + $path_directories = join '.', ('-' x @basechunks, @pathchunks) ; + } + else { + $path_directories = join '.', @pathchunks; + } + $path_directories = '['.$path_directories.']'; + return $self->canonpath( $self->catpath( '', $path_directories, $path_file ) ) ; +} + + + +sub rel2abs { + my $self = shift ; + my ($path,$base ) = @_; + return undef unless defined $path; + if ($path =~ m/\//) { + $path = ( -d $path || $path =~ m/\/\z/ # educated guessing about + ? vmspath($path) # whether it's a directory + : vmsify($path) ); + } + $base = vmspath($base) if defined $base && $base =~ m/\//; + + # Clean up and split up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getcwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Split up paths + my ( $path_directories, $path_file ) = + ($self->splitpath( $path ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base ) ; + + $path_directories = '' if $path_directories eq '[]' || + $path_directories eq '<>'; + my $sep = '' ; + $sep = '.' + if ( $base_directories =~ m{[^.\]>]\Z(?!\n)} && + $path_directories =~ m{^[^.\[<]}s + ) ; + $base_directories = "$base_directories$sep$path_directories"; + $base_directories =~ s{\.?[\]>][\[<]\.?}{.}; + + $path = $self->catpath( $base_volume, $base_directories, $path_file ); + } + + return $self->canonpath( $path ) ; +} + + + +1; +package File::Spec::Functions; + +use File::Spec; +use strict; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +require Exporter; + +our @ISA = qw(Exporter); + +our @EXPORT = qw( + canonpath + catdir + catfile + curdir + rootdir + updir + no_upwards + file_name_is_absolute + path +); + +our @EXPORT_OK = qw( + devnull + tmpdir + splitpath + splitdir + catpath + abs2rel + rel2abs + case_tolerant +); + +our %EXPORT_TAGS = ( ALL => [ @EXPORT_OK, @EXPORT ] ); + +require File::Spec::Unix; +my %udeps = ( + canonpath => [], + catdir => [qw(canonpath)], + catfile => [qw(canonpath catdir)], + case_tolerant => [], + curdir => [], + devnull => [], + rootdir => [], + updir => [], +); + +foreach my $meth (@EXPORT, @EXPORT_OK) { + my $sub = File::Spec->can($meth); + no strict 'refs'; + if (exists($udeps{$meth}) && $sub == File::Spec::Unix->can($meth) && + !(grep { + File::Spec->can($_) != File::Spec::Unix->can($_) + } @{$udeps{$meth}}) && + defined(&{"File::Spec::Unix::_fn_$meth"})) { + *{$meth} = \&{"File::Spec::Unix::_fn_$meth"}; + } else { + *{$meth} = sub {&$sub('File::Spec', @_)}; + } +} + + +1; +__END__ + + +package File::Spec::Epoc; + +use strict; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +require File::Spec::Unix; +our @ISA = qw(File::Spec::Unix); + + +sub case_tolerant { + return 1; +} + + +sub canonpath { + my ($self,$path) = @_; + return unless defined $path; + + $path =~ s|/+|/|g; # xx////xx -> xx/xx + $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx + $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx + $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx + return $path; +} + + +1; +package File::Spec::AmigaOS; + +use strict; +require File::Spec::Unix; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +our @ISA = qw(File::Spec::Unix); + + +my $tmpdir; +sub tmpdir { + return $tmpdir if defined $tmpdir; + $tmpdir = $_[0]->_tmpdir( $ENV{TMPDIR}, "/t" ); +} + + +sub file_name_is_absolute { + my ($self, $file) = @_; + + # Not 100% robust as a "/" must not preceded a ":" + # but this cannot happen in a well formed path. + return $file =~ m{^/|:}s; +} + + +1; +package File::Spec::Mac; + +use strict; +use Cwd (); +require File::Spec::Unix; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +our @ISA = qw(File::Spec::Unix); + +sub case_tolerant { 1 } + + + +sub canonpath { + my ($self,$path) = @_; + return $path; +} + + +sub catdir { + my $self = shift; + return '' unless @_; + my @args = @_; + my $first_arg; + my $relative; + + # take care of the first argument + + if ($args[0] eq '') { # absolute path, rootdir + shift @args; + $relative = 0; + $first_arg = $self->rootdir; + + } elsif ($args[0] =~ /^[^:]+:/) { # absolute path, volume name + $relative = 0; + $first_arg = shift @args; + # add a trailing ':' if need be (may be it's a path like HD:dir) + $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/); + + } else { # relative path + $relative = 1; + if ( $args[0] =~ /^::+\Z(?!\n)/ ) { + # updir colon path ('::', ':::' etc.), don't shift + $first_arg = ':'; + } elsif ($args[0] eq ':') { + $first_arg = shift @args; + } else { + # add a trailing ':' if need be + $first_arg = shift @args; + $first_arg = "$first_arg:" unless ($first_arg =~ /:\Z(?!\n)/); + } + } + + # For all other arguments, + # (a) ignore arguments that equal ':' or '', + # (b) handle updir paths specially: + # '::' -> concatenate '::' + # '::' . '::' -> concatenate ':::' etc. + # (c) add a trailing ':' if need be + + my $result = $first_arg; + while (@args) { + my $arg = shift @args; + unless (($arg eq '') || ($arg eq ':')) { + if ($arg =~ /^::+\Z(?!\n)/ ) { # updir colon path like ':::' + my $updir_count = length($arg) - 1; + while ((@args) && ($args[0] =~ /^::+\Z(?!\n)/) ) { # while updir colon path + $arg = shift @args; + $updir_count += (length($arg) - 1); + } + $arg = (':' x $updir_count); + } else { + $arg =~ s/^://s; # remove a leading ':' if any + $arg = "$arg:" unless ($arg =~ /:\Z(?!\n)/); # ensure trailing ':' + } + $result .= $arg; + }#unless + } + + if ( ($relative) && ($result !~ /^:/) ) { + # add a leading colon if need be + $result = ":$result"; + } + + unless ($relative) { + # remove updirs immediately following the volume name + $result =~ s/([^:]+:)(:*)(.*)\Z(?!\n)/$1$3/; + } + + return $result; +} + + +sub catfile { + my $self = shift; + return '' unless @_; + my $file = pop @_; + return $file unless @_; + my $dir = $self->catdir(@_); + $file =~ s/^://s; + return $dir.$file; +} + + +sub curdir { + return ":"; +} + + +sub devnull { + return "Dev:Null"; +} + + +sub rootdir { '' } + + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir('TMPDIR'); + return $cached if defined $cached; + $_[0]->_cache_tmpdir($_[0]->_tmpdir( $ENV{TMPDIR} ), 'TMPDIR'); +} + + +sub updir { + return "::"; +} + + +sub file_name_is_absolute { + my ($self,$file) = @_; + if ($file =~ /:/) { + return (! ($file =~ m/^:/s) ); + } elsif ( $file eq '' ) { + return 1 ; + } else { + return 0; # i.e. a file like "a" + } +} + + +sub path { +# +# The concept is meaningless under the MacPerl application. +# Under MPW, it has a meaning. +# + return unless exists $ENV{Commands}; + return split(/,/, $ENV{Commands}); +} + + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file); + + if ( $nofile ) { + ( $volume, $directory ) = $path =~ m|^((?:[^:]+:)?)(.*)|s; + } + else { + $path =~ + m|^( (?: [^:]+: )? ) + ( (?: .*: )? ) + ( .* ) + |xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + $volume = '' unless defined($volume); + $directory = ":$directory" if ( $volume && $directory ); # take care of "HD::dir" + if ($directory) { + # Make sure non-empty directories begin and end in ':' + $directory .= ':' unless (substr($directory,-1) eq ':'); + $directory = ":$directory" unless (substr($directory,0,1) eq ':'); + } else { + $directory = ''; + } + $file = '' unless defined($file); + + return ($volume,$directory,$file); +} + + + +sub splitdir { + my ($self, $path) = @_; + my @result = (); + my ($head, $sep, $tail, $volume, $directories); + + return @result if ( (!defined($path)) || ($path eq '') ); + return (':') if ($path eq ':'); + + ( $volume, $sep, $directories ) = $path =~ m|^((?:[^:]+:)?)(:*)(.*)|s; + + # deprecated, but handle it correctly + if ($volume) { + push (@result, $volume); + $sep .= ':'; + } + + while ($sep || $directories) { + if (length($sep) > 1) { + my $updir_count = length($sep) - 1; + for (my $i=0; $i<$updir_count; $i++) { + # push '::' updir_count times; + # simulate Unix '..' updirs + push (@result, '::'); + } + } + $sep = ''; + if ($directories) { + ( $head, $sep, $tail ) = $directories =~ m|^((?:[^:]+)?)(:*)(.*)|s; + push (@result, $head); + $directories = $tail; + } + } + return @result; +} + + + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + if ( (! $volume) && (! $directory) ) { + $file =~ s/^:// if $file; + return $file ; + } + + # We look for a volume in $volume, then in $directory, but not both + + my ($dir_volume, $dir_dirs) = $self->splitpath($directory, 1); + + $volume = $dir_volume unless length $volume; + my $path = $volume; # may be '' + $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':' + + if ($directory) { + $directory = $dir_dirs if $volume; + $directory =~ s/^://; # remove leading ':' if any + $path .= $directory; + $path .= ':' unless (substr($path, -1) eq ':'); # ensure trailing ':' + } + + if ($file) { + $file =~ s/^://; # remove leading ':' if any + $path .= $file; + } + + return $path; +} + + +# maybe this should be done in canonpath() ? +sub _resolve_updirs { + my $path = shift @_; + my $proceed; + + # resolve any updirs, e.g. "HD:tmp::file" -> "HD:file" + do { + $proceed = ($path =~ s/^(.*):[^:]+::(.*?)\z/$1:$2/); + } while ($proceed); + + return $path; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getcwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + $base = _resolve_updirs( $base ); # resolve updirs in $base + } + else { + $base = _resolve_updirs( $base ); + } + + # Split up paths - ignore $base's file + my ( $path_vol, $path_dirs, $path_file ) = $self->splitpath( $path ); + my ( $base_vol, $base_dirs ) = $self->splitpath( $base ); + + return $path unless lc( $path_vol ) eq lc( $base_vol ); + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_dirs ); + my @basechunks = $self->splitdir( $base_dirs ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) ) { + shift @pathchunks ; + shift @basechunks ; + } + + # @pathchunks now has the directories to descend in to. + # ensure relative path, even if @pathchunks is empty + $path_dirs = $self->catdir( ':', @pathchunks ); + + # @basechunks now contains the number of directories to climb out of. + $base_dirs = (':' x @basechunks) . ':' ; + + return $self->catpath( '', $self->catdir( $base_dirs, $path_dirs ), $path_file ) ; +} + + +sub rel2abs { + my ($self,$path,$base) = @_; + + if ( ! $self->file_name_is_absolute($path) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getcwd(); + } + elsif ( ! $self->file_name_is_absolute($base) ) { + $base = $self->rel2abs($base) ; + } + + # Split up paths + + # ignore $path's volume + my ( $path_dirs, $path_file ) = ($self->splitpath($path))[1,2] ; + + # ignore $base's file part + my ( $base_vol, $base_dirs ) = $self->splitpath($base) ; + + # Glom them together + $path_dirs = ':' if ($path_dirs eq ''); + $base_dirs =~ s/:$//; # remove trailing ':', if any + $base_dirs = $base_dirs . $path_dirs; + + $path = $self->catpath( $base_vol, $base_dirs, $path_file ); + } + return $path; +} + + + +1; +package File::Spec::OS2; + +use strict; +use Cwd (); +require File::Spec::Unix; + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + +our @ISA = qw(File::Spec::Unix); + +sub devnull { + return "/dev/nul"; +} + +sub case_tolerant { + return 1; +} + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m{^([a-z]:)?[\\/]}is); +} + +sub path { + my $path = $ENV{PATH}; + $path =~ s:\\:/:g; + my @path = split(';',$path); + foreach (@path) { $_ = '.' if $_ eq '' } + return @path; +} + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir(qw 'TMPDIR TEMP TMP'); + return $cached if defined $cached; + my @d = @ENV{qw(TMPDIR TEMP TMP)}; # function call could autovivivy + $_[0]->_cache_tmpdir( + $_[0]->_tmpdir( @d, '/tmp', '/' ), qw 'TMPDIR TEMP TMP' + ); +} + +sub catdir { + my $self = shift; + my @args = @_; + foreach (@args) { + tr[\\][/]; + # append a backslash to each argument unless it has one there + $_ .= "/" unless m{/$}; + } + return $self->canonpath(join('', @args)); +} + +sub canonpath { + my ($self,$path) = @_; + return unless defined $path; + + $path =~ s/^([a-z]:)/\l$1/s; + $path =~ s|\\|/|g; + $path =~ s|([^/])/+|$1/|g; # xx////xx -> xx/xx + $path =~ s|(/\.)+/|/|g; # xx/././xx -> xx/xx + $path =~ s|^(\./)+(?=[^/])||s; # ./xx -> xx + $path =~ s|/\Z(?!\n)|| + unless $path =~ m#^([a-z]:)?/\Z(?!\n)#si;# xx/ -> xx + $path =~ s{^/\.\.$}{/}; # /.. -> / + 1 while $path =~ s{^/\.\.}{}; # /../xx -> /xx + return $path; +} + + +sub splitpath { + my ($self,$path, $nofile) = @_; + my ($volume,$directory,$file) = ('','',''); + if ( $nofile ) { + $path =~ + m{^( (?:[a-zA-Z]:|(?:\\\\|//)[^\\/]+[\\/][^\\/]+)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + } + else { + $path =~ + m{^ ( (?: [a-zA-Z]: | + (?:\\\\|//)[^\\/]+[\\/][^\\/]+ + )? + ) + ( (?:.*[\\\\/](?:\.\.?\Z(?!\n))?)? ) + (.*) + }xs; + $volume = $1; + $directory = $2; + $file = $3; + } + + return ($volume,$directory,$file); +} + + +sub splitdir { + my ($self,$directories) = @_ ; + split m|[\\/]|, $directories, -1; +} + + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + # If it's UNC, make sure the glue separator is there, reusing + # whatever separator is first in the $volume + $volume .= $1 + if ( $volume =~ m@^([\\/])[\\/][^\\/]+[\\/][^\\/]+\Z(?!\n)@s && + $directory =~ m@^[^\\/]@s + ) ; + + $volume .= $directory ; + + # If the volume is not just A:, make sure the glue separator is + # there, reusing whatever separator is first in the $volume if possible. + if ( $volume !~ m@^[a-zA-Z]:\Z(?!\n)@s && + $volume =~ m@[^\\/]\Z(?!\n)@ && + $file =~ m@[^\\/]@ + ) { + $volume =~ m@([\\/])@ ; + my $sep = $1 ? $1 : '/' ; + $volume .= $sep ; + } + + $volume .= $file ; + + return $volume ; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + $path = $self->rel2abs( $path ) ; + } else { + $path = $self->canonpath( $path ) ; + } + + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getcwd(); + } elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } else { + $base = $self->canonpath( $base ) ; + } + + # Split up paths + my ( $path_volume, $path_directories, $path_file ) = $self->splitpath( $path, 1 ) ; + my ( $base_volume, $base_directories ) = $self->splitpath( $base, 1 ) ; + return $path unless $path_volume eq $base_volume; + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my @basechunks = $self->splitdir( $base_directories ); + + while ( @pathchunks && + @basechunks && + lc( $pathchunks[0] ) eq lc( $basechunks[0] ) + ) { + shift @pathchunks ; + shift @basechunks ; + } + + # No need to catdir, we know these are well formed. + $path_directories = CORE::join( '/', @pathchunks ); + $base_directories = CORE::join( '/', @basechunks ); + + # $base_directories now contains the directories the resulting relative + # path must ascend out of before it can descend to $path_directory. So, + # replace all names with $parentDir + + #FA Need to replace between backslashes... + $base_directories =~ s|[^\\/]+|..|g ; + + # Glue the two together, using a separator if necessary, and preventing an + # empty result. + + #FA Must check that new directories are not empty. + if ( $path_directories ne '' && $base_directories ne '' ) { + $path_directories = "$base_directories/$path_directories" ; + } else { + $path_directories = "$base_directories$path_directories" ; + } + + return $self->canonpath( + $self->catpath( "", $path_directories, $path_file ) + ) ; +} + + +sub rel2abs { + my ($self,$path,$base ) = @_; + + if ( ! $self->file_name_is_absolute( $path ) ) { + + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getcwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + my ( $path_directories, $path_file ) = + ($self->splitpath( $path, 1 ))[1,2] ; + + my ( $base_volume, $base_directories ) = + $self->splitpath( $base, 1 ) ; + + $path = $self->catpath( + $base_volume, + $self->catdir( $base_directories, $path_directories ), + $path_file + ) ; + } + + return $self->canonpath( $path ) ; +} + +1; +__END__ + +package File::Spec::Unix; + +use strict; +use Cwd (); + +our $VERSION = '3.74'; +$VERSION =~ tr/_//d; + + +sub _pp_canonpath { + my ($self,$path) = @_; + return unless defined $path; + + # Handle POSIX-style node names beginning with double slash (qnx, nto) + # (POSIX says: "a pathname that begins with two successive slashes + # may be interpreted in an implementation-defined manner, although + # more than two leading slashes shall be treated as a single slash.") + my $node = ''; + my $double_slashes_special = $^O eq 'qnx' || $^O eq 'nto'; + + + if ( $double_slashes_special + && ( $path =~ s{^(//[^/]+)/?\z}{}s || $path =~ s{^(//[^/]+)/}{/}s ) ) { + $node = $1; + } + # This used to be + # $path =~ s|/+|/|g unless ($^O eq 'cygwin'); + # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail + # (Mainly because trailing "" directories didn't get stripped). + # Why would cygwin avoid collapsing multiple slashes into one? --jhi + $path =~ s|/{2,}|/|g; # xx////xx -> xx/xx + $path =~ s{(?:/\.)+(?:/|\z)}{/}g; # xx/././xx -> xx/xx + $path =~ s|^(?:\./)+||s unless $path eq "./"; # ./xx -> xx + $path =~ s|^/(?:\.\./)+|/|; # /../../xx -> xx + $path =~ s|^/\.\.$|/|; # /.. -> / + $path =~ s|/\z|| unless $path eq "/"; # xx/ -> xx + return "$node$path"; +} +*canonpath = \&_pp_canonpath unless defined &canonpath; + + +sub _pp_catdir { + my $self = shift; + + $self->canonpath(join('/', @_, '')); # '' because need a trailing '/' +} +*catdir = \&_pp_catdir unless defined &catdir; + + +sub _pp_catfile { + my $self = shift; + my $file = $self->canonpath(pop @_); + return $file unless @_; + my $dir = $self->catdir(@_); + $dir .= "/" unless substr($dir,-1) eq "/"; + return $dir.$file; +} +*catfile = \&_pp_catfile unless defined &catfile; + + +sub curdir { '.' } +use constant _fn_curdir => "."; + + +sub devnull { '/dev/null' } +use constant _fn_devnull => "/dev/null"; + + +sub rootdir { '/' } +use constant _fn_rootdir => "/"; + + +my ($tmpdir, %tmpenv); +# Cache and return the calculated tmpdir, recording which env vars +# determined it. +sub _cache_tmpdir { + @tmpenv{@_[2..$#_]} = @ENV{@_[2..$#_]}; + return $tmpdir = $_[1]; +} +# Retrieve the cached tmpdir, checking first whether relevant env vars have +# changed and invalidated the cache. +sub _cached_tmpdir { + shift; + local $^W; + return if grep $ENV{$_} ne $tmpenv{$_}, @_; + return $tmpdir; +} +sub _tmpdir { + my $self = shift; + my @dirlist = @_; + my $taint = do { no strict 'refs'; ${"\cTAINT"} }; + if ($taint) { # Check for taint mode on perl >= 5.8.0 + require Scalar::Util; + @dirlist = grep { ! Scalar::Util::tainted($_) } @dirlist; + } + elsif ($] < 5.007) { # No ${^TAINT} before 5.8 + @dirlist = grep { !defined($_) || eval { eval('1'.substr $_,0,0) } } + @dirlist; + } + + foreach (@dirlist) { + next unless defined && -d && -w _; + $tmpdir = $_; + last; + } + $tmpdir = $self->curdir unless defined $tmpdir; + $tmpdir = defined $tmpdir && $self->canonpath($tmpdir); + if ( !$self->file_name_is_absolute($tmpdir) ) { + # See [perl #120593] for the full details + # If possible, return a full path, rather than '.' or 'lib', but + # jump through some hoops to avoid returning a tainted value. + ($tmpdir) = grep { + $taint ? ! Scalar::Util::tainted($_) : + $] < 5.007 ? eval { eval('1'.substr $_,0,0) } : 1 + } $self->rel2abs($tmpdir), $tmpdir; + } + return $tmpdir; +} + +sub tmpdir { + my $cached = $_[0]->_cached_tmpdir('TMPDIR'); + return $cached if defined $cached; + $_[0]->_cache_tmpdir($_[0]->_tmpdir( $ENV{TMPDIR}, "/tmp" ), 'TMPDIR'); +} + + +sub updir { '..' } +use constant _fn_updir => ".."; + + +sub no_upwards { + my $self = shift; + return grep(!/^\.{1,2}\z/s, @_); +} + + +sub case_tolerant { 0 } +use constant _fn_case_tolerant => 0; + + +sub file_name_is_absolute { + my ($self,$file) = @_; + return scalar($file =~ m:^/:s); +} + + +sub path { + return () unless exists $ENV{PATH}; + my @path = split(':', $ENV{PATH}); + foreach (@path) { $_ = '.' if $_ eq '' } + return @path; +} + + +sub join { + my $self = shift; + return $self->catfile(@_); +} + + +sub splitpath { + my ($self,$path, $nofile) = @_; + + my ($volume,$directory,$file) = ('','',''); + + if ( $nofile ) { + $directory = $path; + } + else { + $path =~ m|^ ( (?: .* / (?: \.\.?\z )? )? ) ([^/]*) |xs; + $directory = $1; + $file = $2; + } + + return ($volume,$directory,$file); +} + + + +sub splitdir { + return split m|/|, $_[1], -1; # Preserve trailing fields +} + + + +sub catpath { + my ($self,$volume,$directory,$file) = @_; + + if ( $directory ne '' && + $file ne '' && + substr( $directory, -1 ) ne '/' && + substr( $file, 0, 1 ) ne '/' + ) { + $directory .= "/$file" ; + } + else { + $directory .= $file ; + } + + return $directory ; +} + + +sub abs2rel { + my($self,$path,$base) = @_; + $base = Cwd::getcwd() unless defined $base and length $base; + + ($path, $base) = map $self->canonpath($_), $path, $base; + + my $path_directories; + my $base_directories; + + if (grep $self->file_name_is_absolute($_), $path, $base) { + ($path, $base) = map $self->rel2abs($_), $path, $base; + + my ($path_volume) = $self->splitpath($path, 1); + my ($base_volume) = $self->splitpath($base, 1); + + # Can't relativize across volumes + return $path unless $path_volume eq $base_volume; + + $path_directories = ($self->splitpath($path, 1))[1]; + $base_directories = ($self->splitpath($base, 1))[1]; + + # For UNC paths, the user might give a volume like //foo/bar that + # strictly speaking has no directory portion. Treat it as if it + # had the root directory for that volume. + if (!length($base_directories) and $self->file_name_is_absolute($base)) { + $base_directories = $self->rootdir; + } + } + else { + my $wd= ($self->splitpath(Cwd::getcwd(), 1))[1]; + $path_directories = $self->catdir($wd, $path); + $base_directories = $self->catdir($wd, $base); + } + + # Now, remove all leading components that are the same + my @pathchunks = $self->splitdir( $path_directories ); + my @basechunks = $self->splitdir( $base_directories ); + + if ($base_directories eq $self->rootdir) { + return $self->curdir if $path_directories eq $self->rootdir; + shift @pathchunks; + return $self->canonpath( $self->catpath('', $self->catdir( @pathchunks ), '') ); + } + + my @common; + while (@pathchunks && @basechunks && $self->_same($pathchunks[0], $basechunks[0])) { + push @common, shift @pathchunks ; + shift @basechunks ; + } + return $self->curdir unless @pathchunks || @basechunks; + + # @basechunks now contains the directories the resulting relative path + # must ascend out of before it can descend to $path_directory. If there + # are updir components, we must descend into the corresponding directories + # (this only works if they are no symlinks). + my @reverse_base; + while( defined(my $dir= shift @basechunks) ) { + if( $dir ne $self->updir ) { + unshift @reverse_base, $self->updir; + push @common, $dir; + } + elsif( @common ) { + if( @reverse_base && $reverse_base[0] eq $self->updir ) { + shift @reverse_base; + pop @common; + } + else { + unshift @reverse_base, pop @common; + } + } + } + my $result_dirs = $self->catdir( @reverse_base, @pathchunks ); + return $self->canonpath( $self->catpath('', $result_dirs, '') ); +} + +sub _same { + $_[1] eq $_[2]; +} + + +sub rel2abs { + my ($self,$path,$base ) = @_; + + # Clean up $path + if ( ! $self->file_name_is_absolute( $path ) ) { + # Figure out the effective $base and clean it up. + if ( !defined( $base ) || $base eq '' ) { + $base = Cwd::getcwd(); + } + elsif ( ! $self->file_name_is_absolute( $base ) ) { + $base = $self->rel2abs( $base ) ; + } + else { + $base = $self->canonpath( $base ) ; + } + + # Glom them together + $path = $self->catdir( $base, $path ) ; + } + + return $self->canonpath( $path ) ; +} + + +# Internal method to reduce xx\..\yy -> yy +sub _collapse { + my($fs, $path) = @_; + + my $updir = $fs->updir; + my $curdir = $fs->curdir; + + my($vol, $dirs, $file) = $fs->splitpath($path); + my @dirs = $fs->splitdir($dirs); + pop @dirs if @dirs && $dirs[-1] eq ''; + + my @collapsed; + foreach my $dir (@dirs) { + if( $dir eq $updir and # if we have an updir + @collapsed and # and something to collapse + length $collapsed[-1] and # and its not the rootdir + $collapsed[-1] ne $updir and # nor another updir + $collapsed[-1] ne $curdir # nor the curdir + ) + { # then + pop @collapsed; # collapse + } + else { # else + push @collapsed, $dir; # just hang onto it + } + } + + return $fs->catpath($vol, + $fs->catdir(@collapsed), + $file + ); +} + + +1; +package Digest::SHA; + +require 5.003000; + +use strict; +use warnings; +use vars qw($VERSION @ISA @EXPORT_OK $errmsg); +use Fcntl qw(O_RDONLY); +use integer; + +$VERSION = '6.01'; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT_OK = qw( + $errmsg + hmac_sha1 hmac_sha1_base64 hmac_sha1_hex + hmac_sha224 hmac_sha224_base64 hmac_sha224_hex + hmac_sha256 hmac_sha256_base64 hmac_sha256_hex + hmac_sha384 hmac_sha384_base64 hmac_sha384_hex + hmac_sha512 hmac_sha512_base64 hmac_sha512_hex + hmac_sha512224 hmac_sha512224_base64 hmac_sha512224_hex + hmac_sha512256 hmac_sha512256_base64 hmac_sha512256_hex + sha1 sha1_base64 sha1_hex + sha224 sha224_base64 sha224_hex + sha256 sha256_base64 sha256_hex + sha384 sha384_base64 sha384_hex + sha512 sha512_base64 sha512_hex + sha512224 sha512224_base64 sha512224_hex + sha512256 sha512256_base64 sha512256_hex); + +# Inherit from Digest::base if possible + +eval { + require Digest::base; + push(@ISA, 'Digest::base'); +}; + +# The following routines aren't time-critical, so they can be left in Perl + +sub new { + my($class, $alg) = @_; + $alg =~ s/\D+//g if defined $alg; + if (ref($class)) { # instance method + if (!defined($alg) || ($alg == $class->algorithm)) { + sharewind($class); + return($class); + } + return shainit($class, $alg) ? $class : undef; + } + $alg = 1 unless defined $alg; + return $class->newSHA($alg); +} + +BEGIN { *reset = \&new } + +sub add_bits { + my($self, $data, $nbits) = @_; + unless (defined $nbits) { + $nbits = length($data); + $data = pack("B*", $data); + } + $nbits = length($data) * 8 if $nbits > length($data) * 8; + shawrite($data, $nbits, $self); + return($self); +} + +sub _bail { + my $msg = shift; + + $errmsg = $!; + $msg .= ": $!"; + require Carp; + Carp::croak($msg); +} + +{ + my $_can_T_filehandle; + + sub _istext { + local *FH = shift; + my $file = shift; + + if (! defined $_can_T_filehandle) { + local $^W = 0; + my $istext = eval { -T FH }; + $_can_T_filehandle = $@ ? 0 : 1; + return $_can_T_filehandle ? $istext : -T $file; + } + return $_can_T_filehandle ? -T FH : -T $file; + } +} + +sub _addfile { + my ($self, $handle) = @_; + + my $n; + my $buf = ""; + + while (($n = read($handle, $buf, 4096))) { + $self->add($buf); + } + _bail("Read failed") unless defined $n; + + $self; +} + +sub addfile { + my ($self, $file, $mode) = @_; + + return(_addfile($self, $file)) unless ref(\$file) eq 'SCALAR'; + + $mode = defined($mode) ? $mode : ""; + my ($binary, $UNIVERSAL, $BITS) = + map { $_ eq $mode } ("b", "U", "0"); + + ## Always interpret "-" to mean STDIN; otherwise use + ## sysopen to handle full range of POSIX file names + + local *FH; + $file eq '-' and open(FH, '< -') + or sysopen(FH, $file, O_RDONLY) + or _bail('Open failed'); + + if ($BITS) { + my ($n, $buf) = (0, ""); + while (($n = read(FH, $buf, 4096))) { + $buf =~ tr/01//cd; + $self->add_bits($buf); + } + _bail("Read failed") unless defined $n; + close(FH); + return($self); + } + + binmode(FH) if $binary || $UNIVERSAL; + if ($UNIVERSAL && _istext(*FH, $file)) { + $self->_addfileuniv(*FH); + } + else { $self->_addfilebin(*FH) } + close(FH); + + $self; +} + +sub getstate { + my $self = shift; + + my $alg = $self->algorithm or return; + my $state = $self->_getstate or return; + my $nD = $alg <= 256 ? 8 : 16; + my $nH = $alg <= 256 ? 32 : 64; + my $nB = $alg <= 256 ? 64 : 128; + my($H, $block, $blockcnt, $lenhh, $lenhl, $lenlh, $lenll) = + $state =~ /^(.{$nH})(.{$nB})(.{4})(.{4})(.{4})(.{4})(.{4})$/s; + for ($alg, $H, $block, $blockcnt, $lenhh, $lenhl, $lenlh, $lenll) { + return unless defined $_; + } + + my @s = (); + push(@s, "alg:" . $alg); + push(@s, "H:" . join(":", unpack("H*", $H) =~ /.{$nD}/g)); + push(@s, "block:" . join(":", unpack("H*", $block) =~ /.{2}/g)); + push(@s, "blockcnt:" . unpack("N", $blockcnt)); + push(@s, "lenhh:" . unpack("N", $lenhh)); + push(@s, "lenhl:" . unpack("N", $lenhl)); + push(@s, "lenlh:" . unpack("N", $lenlh)); + push(@s, "lenll:" . unpack("N", $lenll)); + join("\n", @s) . "\n"; +} + +sub putstate { + my($class, $state) = @_; + + my %s = (); + for (split(/\n/, $state)) { + s/^\s+//; + s/\s+$//; + next if (/^(#|$)/); + my @f = split(/[:\s]+/); + my $tag = shift(@f); + $s{$tag} = join('', @f); + } + + # H and block may contain arbitrary values, but check everything else + grep { $_ == $s{'alg'} } (1,224,256,384,512,512224,512256) or return; + length($s{'H'}) == ($s{'alg'} <= 256 ? 64 : 128) or return; + length($s{'block'}) == ($s{'alg'} <= 256 ? 128 : 256) or return; + { + no integer; + for (qw(blockcnt lenhh lenhl lenlh lenll)) { + 0 <= $s{$_} or return; + $s{$_} <= 4294967295 or return; + } + $s{'blockcnt'} < ($s{'alg'} <= 256 ? 512 : 1024) or return; + } + + my $packed_state = ( + pack("H*", $s{'H'}) . + pack("H*", $s{'block'}) . + pack("N", $s{'blockcnt'}) . + pack("N", $s{'lenhh'}) . + pack("N", $s{'lenhl'}) . + pack("N", $s{'lenlh'}) . + pack("N", $s{'lenll'}) + ); + + return $class->new($s{'alg'})->_putstate($packed_state); +} + +sub dump { + my $self = shift; + my $file = shift; + + my $state = $self->getstate or return; + $file = "-" if (!defined($file) || $file eq ""); + + local *FH; + open(FH, "> $file") or return; + print FH $state; + close(FH); + + return($self); +} + +sub load { + my $class = shift; + my $file = shift; + + $file = "-" if (!defined($file) || $file eq ""); + + local *FH; + open(FH, "< $file") or return; + my $str = join('', <FH>); + close(FH); + + $class->putstate($str); +} + +eval { + require XSLoader; + XSLoader::load('Digest::SHA', $VERSION); + 1; +} or do { + require DynaLoader; + push @ISA, 'DynaLoader'; + Digest::SHA->bootstrap($VERSION); +}; + +1; +__END__ + +package Digest::MD5; + +use strict; +use vars qw($VERSION @ISA @EXPORT_OK); + +$VERSION = '2.55'; + +require Exporter; +*import = \&Exporter::import; +@EXPORT_OK = qw(md5 md5_hex md5_base64); + +eval { + require Digest::base; + push(@ISA, 'Digest::base'); +}; +if ($@) { + my $err = $@; + *add_bits = sub { die $err }; +} + + +eval { + require XSLoader; + XSLoader::load('Digest::MD5', $VERSION); +}; +if ($@) { + my $olderr = $@; + eval { + # Try to load the pure perl version + require Digest::Perl::MD5; + + Digest::Perl::MD5->import(qw(md5 md5_hex md5_base64)); + unshift(@ISA, "Digest::Perl::MD5"); # make OO interface work + }; + if ($@) { + # restore the original error + die $olderr; + } +} +else { + *reset = \&new; +} + +1; +__END__ + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Module; +use strict; +@CPAN::Module::ISA = qw(CPAN::InfoObj); + +use vars qw( + $VERSION +); +$VERSION = "5.5003"; + +BEGIN { + # alarm() is not implemented in perl 5.6.x and earlier under Windows + *ALARM_IMPLEMENTED = sub () { $] >= 5.007 || $^O !~ /MSWin/ }; +} + +# Accessors +#-> sub CPAN::Module::userid +sub userid { + my $self = shift; + my $ro = $self->ro; + return unless $ro; + return $ro->{userid} || $ro->{CPAN_USERID}; +} +#-> sub CPAN::Module::description +sub description { + my $self = shift; + my $ro = $self->ro or return ""; + $ro->{description} +} + +#-> sub CPAN::Module::distribution +sub distribution { + my($self) = @_; + CPAN::Shell->expand("Distribution",$self->cpan_file); +} + +#-> sub CPAN::Module::_is_representative_module +sub _is_representative_module { + my($self) = @_; + return $self->{_is_representative_module} if defined $self->{_is_representative_module}; + my $pm = $self->cpan_file or return $self->{_is_representative_module} = 0; + $pm =~ s|.+/||; + $pm =~ s{\.(?:tar\.(bz2|gz|Z)|t(?:gz|bz)|zip)$}{}i; # see base_id + $pm =~ s|-\d+\.\d+.+$||; + $pm =~ s|-[\d\.]+$||; + $pm =~ s/-/::/g; + $self->{_is_representative_module} = $pm eq $self->{ID} ? 1 : 0; + # warn "DEBUG: $pm eq $self->{ID} => $self->{_is_representative_module}"; + $self->{_is_representative_module}; +} + +#-> sub CPAN::Module::undelay +sub undelay { + my $self = shift; + delete $self->{later}; + if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) { + $dist->undelay; + } +} + +# mark as dirty/clean +#-> sub CPAN::Module::color_cmd_tmps ; +sub color_cmd_tmps { + my($self) = shift; + my($depth) = shift || 0; + my($color) = shift || 0; + my($ancestors) = shift || []; + # a module needs to recurse to its cpan_file + + return if exists $self->{incommandcolor} + && $color==1 + && $self->{incommandcolor}==$color; + return if $color==0 && !$self->{incommandcolor}; + if ($color>=1) { + if ( $self->uptodate ) { + $self->{incommandcolor} = $color; + return; + } elsif (my $have_version = $self->available_version) { + # maybe what we have is good enough + if (@$ancestors) { + my $who_asked_for_me = $ancestors->[-1]; + my $obj = CPAN::Shell->expandany($who_asked_for_me); + if (0) { + } elsif ($obj->isa("CPAN::Bundle")) { + # bundles cannot specify a minimum version + return; + } elsif ($obj->isa("CPAN::Distribution")) { + if (my $prereq_pm = $obj->prereq_pm) { + for my $k (keys %$prereq_pm) { + if (my $want_version = $prereq_pm->{$k}{$self->id}) { + if (CPAN::Version->vcmp($have_version,$want_version) >= 0) { + $self->{incommandcolor} = $color; + return; + } + } + } + } + } + } + } + } else { + $self->{incommandcolor} = $color; # set me before recursion, + # so we can break it + } + if ($depth>=$CPAN::MAX_RECURSION) { + my $e = CPAN::Exception::RecursiveDependency->new($ancestors); + if ($e->is_resolvable) { + return $self->{incommandcolor}=2; + } else { + die $e; + } + } + # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1; + + if ( my $dist = CPAN::Shell->expand("Distribution", $self->cpan_file) ) { + $dist->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]); + } + # unreached code? + # if ($color==0) { + # delete $self->{badtestcnt}; + # } + $self->{incommandcolor} = $color; +} + +#-> sub CPAN::Module::as_glimpse ; +sub as_glimpse { + my($self) = @_; + my(@m); + my $class = ref($self); + $class =~ s/^CPAN:://; + my $color_on = ""; + my $color_off = ""; + if ( + $CPAN::Shell::COLOR_REGISTERED + && + $CPAN::META->has_inst("Term::ANSIColor") + && + $self->description + ) { + $color_on = Term::ANSIColor::color("green"); + $color_off = Term::ANSIColor::color("reset"); + } + my $uptodateness = " "; + unless ($class eq "Bundle") { + my $u = $self->uptodate; + $uptodateness = $u ? "=" : "<" if defined $u; + }; + my $id = do { + my $d = $self->distribution; + $d ? $d -> pretty_id : $self->cpan_userid; + }; + push @m, sprintf("%-7s %1s %s%-22s%s (%s)\n", + $class, + $uptodateness, + $color_on, + $self->id, + $color_off, + $id, + ); + join "", @m; +} + +#-> sub CPAN::Module::dslip_status +sub dslip_status { + my($self) = @_; + my($stat); + # development status + @{$stat->{D}}{qw,i c a b R M S,} = qw,idea + pre-alpha alpha beta released + mature standard,; + # support level + @{$stat->{S}}{qw,m d u n a,} = qw,mailing-list + developer comp.lang.perl.* + none abandoned,; + # language + @{$stat->{L}}{qw,p c + o h,} = qw,perl C C++ other hybrid,; + # interface + @{$stat->{I}}{qw,f r O p h n,} = qw,functions + references+ties + object-oriented pragma + hybrid none,; + # public licence + @{$stat->{P}}{qw,p g l b a 2 o d r n,} = qw,Standard-Perl + GPL LGPL + BSD Artistic Artistic_2 + open-source + distribution_allowed + restricted_distribution + no_licence,; + for my $x (qw(d s l i p)) { + $stat->{$x}{' '} = 'unknown'; + $stat->{$x}{'?'} = 'unknown'; + } + my $ro = $self->ro; + return +{} unless $ro && $ro->{statd}; + return { + D => $ro->{statd}, + S => $ro->{stats}, + L => $ro->{statl}, + I => $ro->{stati}, + P => $ro->{statp}, + DV => $stat->{D}{$ro->{statd}}, + SV => $stat->{S}{$ro->{stats}}, + LV => $stat->{L}{$ro->{statl}}, + IV => $stat->{I}{$ro->{stati}}, + PV => $stat->{P}{$ro->{statp}}, + }; +} + +#-> sub CPAN::Module::as_string ; +sub as_string { + my($self) = @_; + my(@m); + CPAN->debug("$self entering as_string") if $CPAN::DEBUG; + my $class = ref($self); + $class =~ s/^CPAN:://; + local($^W) = 0; + push @m, $class, " id = $self->{ID}\n"; + my $sprintf = " %-12s %s\n"; + push @m, sprintf($sprintf, 'DESCRIPTION', $self->description) + if $self->description; + my $sprintf2 = " %-12s %s (%s)\n"; + my($userid); + $userid = $self->userid; + if ( $userid ) { + my $author; + if ($author = CPAN::Shell->expand('Author',$userid)) { + my $email = ""; + my $m; # old perls + if ($m = $author->email) { + $email = " <$m>"; + } + push @m, sprintf( + $sprintf2, + 'CPAN_USERID', + $userid, + $author->fullname . $email + ); + } + } + push @m, sprintf($sprintf, 'CPAN_VERSION', $self->cpan_version) + if $self->cpan_version; + if (my $cpan_file = $self->cpan_file) { + push @m, sprintf($sprintf, 'CPAN_FILE', $cpan_file); + if (my $dist = CPAN::Shell->expand("Distribution",$cpan_file)) { + my $upload_date = $dist->upload_date; + if ($upload_date) { + push @m, sprintf($sprintf, 'UPLOAD_DATE', $upload_date); + } + } + } + my $sprintf3 = " %-12s %1s%1s%1s%1s%1s (%s,%s,%s,%s,%s)\n"; + my $dslip = $self->dslip_status; + push @m, sprintf( + $sprintf3, + 'DSLIP_STATUS', + @{$dslip}{qw(D S L I P DV SV LV IV PV)}, + ) if $dslip->{D}; + my $local_file = $self->inst_file; + unless ($self->{MANPAGE}) { + my $manpage; + if ($local_file) { + $manpage = $self->manpage_headline($local_file); + } else { + # If we have already untarred it, we should look there + my $dist = $CPAN::META->instance('CPAN::Distribution', + $self->cpan_file); + # warn "dist[$dist]"; + # mff=manifest file; mfh=manifest handle + my($mff,$mfh); + if ( + $dist->{build_dir} + and + (-f ($mff = File::Spec->catfile($dist->{build_dir}, "MANIFEST"))) + and + $mfh = FileHandle->new($mff) + ) { + CPAN->debug("mff[$mff]") if $CPAN::DEBUG; + my $lfre = $self->id; # local file RE + $lfre =~ s/::/./g; + $lfre .= "\\.pm\$"; + my($lfl); # local file file + local $/ = "\n"; + my(@mflines) = <$mfh>; + for (@mflines) { + s/^\s+//; + s/\s.*//s; + } + while (length($lfre)>5 and !$lfl) { + ($lfl) = grep /$lfre/, @mflines; + CPAN->debug("lfl[$lfl]lfre[$lfre]") if $CPAN::DEBUG; + $lfre =~ s/.+?\.//; + } + $lfl =~ s/\s.*//; # remove comments + $lfl =~ s/\s+//g; # chomp would maybe be too system-specific + my $lfl_abs = File::Spec->catfile($dist->{build_dir},$lfl); + # warn "lfl_abs[$lfl_abs]"; + if (-f $lfl_abs) { + $manpage = $self->manpage_headline($lfl_abs); + } + } + } + $self->{MANPAGE} = $manpage if $manpage; + } + my($item); + for $item (qw/MANPAGE/) { + push @m, sprintf($sprintf, $item, $self->{$item}) + if exists $self->{$item}; + } + for $item (qw/CONTAINS/) { + push @m, sprintf($sprintf, $item, join(" ",@{$self->{$item}})) + if exists $self->{$item} && @{$self->{$item}}; + } + push @m, sprintf($sprintf, 'INST_FILE', + $local_file || "(not installed)"); + push @m, sprintf($sprintf, 'INST_VERSION', + $self->inst_version) if $local_file; + if (%{$CPAN::META->{is_tested}||{}}) { # XXX needs to be methodified somehow + my $available_file = $self->available_file; + if ($available_file && $available_file ne $local_file) { + push @m, sprintf($sprintf, 'AVAILABLE_FILE', $available_file); + push @m, sprintf($sprintf, 'AVAILABLE_VERSION', $self->available_version); + } + } + join "", @m, "\n"; +} + +#-> sub CPAN::Module::manpage_headline +sub manpage_headline { + my($self,$local_file) = @_; + my(@local_file) = $local_file; + $local_file =~ s/\.pm(?!\n)\Z/.pod/; + push @local_file, $local_file; + my(@result,$locf); + for $locf (@local_file) { + next unless -f $locf; + my $fh = FileHandle->new($locf) + or $Carp::Frontend->mydie("Couldn't open $locf: $!"); + my $inpod = 0; + local $/ = "\n"; + while (<$fh>) { + $inpod = m/^=(?!head1\s+NAME\s*$)/ ? 0 : + m/^=head1\s+NAME\s*$/ ? 1 : $inpod; + next unless $inpod; + next if /^=/; + next if /^\s+$/; + chomp; + push @result, $_; + } + close $fh; + last if @result; + } + for (@result) { + s/^\s+//; + s/\s+$//; + } + join " ", @result; +} + +#-> sub CPAN::Module::cpan_file ; +# Note: also inherited by CPAN::Bundle +sub cpan_file { + my $self = shift; + # CPAN->debug(sprintf "id[%s]", $self->id) if $CPAN::DEBUG; + unless ($self->ro) { + CPAN::Index->reload; + } + my $ro = $self->ro; + if ($ro && defined $ro->{CPAN_FILE}) { + return $ro->{CPAN_FILE}; + } else { + my $userid = $self->userid; + if ( $userid ) { + if ($CPAN::META->exists("CPAN::Author",$userid)) { + my $author = $CPAN::META->instance("CPAN::Author", + $userid); + my $fullname = $author->fullname; + my $email = $author->email; + unless (defined $fullname && defined $email) { + return sprintf("Contact Author %s", + $userid, + ); + } + return "Contact Author $fullname <$email>"; + } else { + return "Contact Author $userid (Email address not available)"; + } + } else { + return "N/A"; + } + } +} + +#-> sub CPAN::Module::cpan_version ; +sub cpan_version { + my $self = shift; + + my $ro = $self->ro; + unless ($ro) { + # Can happen with modules that are not on CPAN + $ro = {}; + } + $ro->{CPAN_VERSION} = 'undef' + unless defined $ro->{CPAN_VERSION}; + $ro->{CPAN_VERSION}; +} + +#-> sub CPAN::Module::force ; +sub force { + my($self) = @_; + $self->{force_update} = 1; +} + +#-> sub CPAN::Module::fforce ; +sub fforce { + my($self) = @_; + $self->{force_update} = 2; +} + +#-> sub CPAN::Module::notest ; +sub notest { + my($self) = @_; + # $CPAN::Frontend->mywarn("XDEBUG: set notest for Module"); + $self->{notest}++; +} + +#-> sub CPAN::Module::rematein ; +sub rematein { + my($self,$meth) = @_; + $CPAN::Frontend->myprint(sprintf("Running %s for module '%s'\n", + $meth, + $self->id)); + my $cpan_file = $self->cpan_file; + if ($cpan_file eq "N/A" || $cpan_file =~ /^Contact Author/) { + $CPAN::Frontend->mywarn(sprintf qq{ + The module %s isn\'t available on CPAN. + + Either the module has not yet been uploaded to CPAN, or it is + temporary unavailable. Please contact the author to find out + more about the status. Try 'i %s'. +}, + $self->id, + $self->id, + ); + return; + } + my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file); + $pack->called_for($self->id); + if (exists $self->{force_update}) { + if ($self->{force_update} == 2) { + $pack->fforce($meth); + } else { + $pack->force($meth); + } + } + $pack->notest($meth) if exists $self->{notest} && $self->{notest}; + + $pack->{reqtype} ||= ""; + CPAN->debug("dist-reqtype[$pack->{reqtype}]". + "self-reqtype[$self->{reqtype}]") if $CPAN::DEBUG; + if ($pack->{reqtype}) { + if ($pack->{reqtype} eq "b" && $self->{reqtype} =~ /^[rc]$/) { + $pack->{reqtype} = $self->{reqtype}; + if ( + exists $pack->{install} + && + ( + UNIVERSAL::can($pack->{install},"failed") ? + $pack->{install}->failed : + $pack->{install} =~ /^NO/ + ) + ) { + delete $pack->{install}; + $CPAN::Frontend->mywarn + ("Promoting $pack->{ID} from 'build_requires' to 'requires'"); + } + } + } else { + $pack->{reqtype} = $self->{reqtype}; + } + + my $success = eval { + $pack->$meth(); + }; + my $err = $@; + $pack->unforce if $pack->can("unforce") && exists $self->{force_update}; + $pack->unnotest if $pack->can("unnotest") && exists $self->{notest}; + delete $self->{force_update}; + delete $self->{notest}; + if ($err) { + die $err; + } + return $success; +} + +#-> sub CPAN::Module::perldoc ; +sub perldoc { shift->rematein('perldoc') } +#-> sub CPAN::Module::readme ; +sub readme { shift->rematein('readme') } +#-> sub CPAN::Module::look ; +sub look { shift->rematein('look') } +#-> sub CPAN::Module::cvs_import ; +sub cvs_import { shift->rematein('cvs_import') } +#-> sub CPAN::Module::get ; +sub get { shift->rematein('get',@_) } +#-> sub CPAN::Module::make ; +sub make { shift->rematein('make') } +#-> sub CPAN::Module::test ; +sub test { + my $self = shift; + # $self->{badtestcnt} ||= 0; + $self->rematein('test',@_); +} + +#-> sub CPAN::Module::deprecated_in_core ; +sub deprecated_in_core { + my ($self) = @_; + return unless $CPAN::META->has_inst('Module::CoreList') && Module::CoreList->can('is_deprecated'); + return Module::CoreList::is_deprecated($self->{ID}); +} + +#-> sub CPAN::Module::inst_deprecated; +# Indicates whether the *installed* version of the module is a deprecated *and* +# installed as part of the Perl core library path +sub inst_deprecated { + my ($self) = @_; + my $inst_file = $self->inst_file or return; + return $self->deprecated_in_core && $self->_in_priv_or_arch($inst_file); +} + +#-> sub CPAN::Module::uptodate ; +sub uptodate { + my ($self) = @_; + local ($_); + my $inst = $self->inst_version or return 0; + my $cpan = $self->cpan_version; + return 0 if CPAN::Version->vgt($cpan,$inst) || $self->inst_deprecated; + CPAN->debug + (join + ("", + "returning uptodate. ", + "cpan[$cpan]inst[$inst]", + )) if $CPAN::DEBUG; + return 1; +} + +# returns true if installed in privlib or archlib +sub _in_priv_or_arch { + my($self,$inst_file) = @_; + foreach my $pair ( + [qw(sitearchexp archlibexp)], + [qw(sitelibexp privlibexp)] + ) { + my ($site, $priv) = @Config::Config{@$pair}; + if ($^O eq 'VMS') { + for my $d ($site, $priv) { $d = VMS::Filespec::unixify($d) }; + } + s!/*$!!g foreach $site, $priv; + next if $site eq $priv; + + if ($priv eq substr($inst_file,0,length($priv))) { + return 1; + } + } + return 0; +} + +#-> sub CPAN::Module::install ; +sub install { + my($self) = @_; + my($doit) = 0; + if ($self->uptodate + && + not exists $self->{force_update} + ) { + $CPAN::Frontend->myprint(sprintf("%s is up to date (%s).\n", + $self->id, + $self->inst_version, + )); + } else { + $doit = 1; + } + my $ro = $self->ro; + if ($ro && $ro->{stats} && $ro->{stats} eq "a") { + $CPAN::Frontend->mywarn(qq{ +\n\n\n ***WARNING*** + The module $self->{ID} has no active maintainer (CPAN support level flag 'abandoned').\n\n\n +}); + $CPAN::Frontend->mysleep(5); + } + return $doit ? $self->rematein('install') : 1; +} +#-> sub CPAN::Module::clean ; +sub clean { shift->rematein('clean') } + +#-> sub CPAN::Module::inst_file ; +sub inst_file { + my($self) = @_; + $self->_file_in_path([@INC]); +} + +#-> sub CPAN::Module::available_file ; +sub available_file { + my($self) = @_; + my $sep = $Config::Config{path_sep}; + my $perllib = $ENV{PERL5LIB}; + $perllib = $ENV{PERLLIB} unless defined $perllib; + my @perllib = split(/$sep/,$perllib) if defined $perllib; + my @cpan_perl5inc; + if ($CPAN::Perl5lib_tempfile) { + my $yaml = CPAN->_yaml_loadfile($CPAN::Perl5lib_tempfile); + @cpan_perl5inc = @{$yaml->[0]{inc} || []}; + } + $self->_file_in_path([@cpan_perl5inc,@perllib,@INC]); +} + +#-> sub CPAN::Module::file_in_path ; +sub _file_in_path { + my($self,$path) = @_; + my($dir,@packpath); + @packpath = split /::/, $self->{ID}; + $packpath[-1] .= ".pm"; + if (@packpath == 1 && $packpath[0] eq "readline.pm") { + unshift @packpath, "Term", "ReadLine"; # historical reasons + } + foreach $dir (@$path) { + my $pmfile = File::Spec->catfile($dir,@packpath); + if (-f $pmfile) { + return $pmfile; + } + } + return; +} + +#-> sub CPAN::Module::xs_file ; +sub xs_file { + my($self) = @_; + my($dir,@packpath); + @packpath = split /::/, $self->{ID}; + push @packpath, $packpath[-1]; + $packpath[-1] .= "." . $Config::Config{'dlext'}; + foreach $dir (@INC) { + my $xsfile = File::Spec->catfile($dir,'auto',@packpath); + if (-f $xsfile) { + return $xsfile; + } + } + return; +} + +#-> sub CPAN::Module::inst_version ; +sub inst_version { + my($self) = @_; + my $parsefile = $self->inst_file or return; + my $have = $self->parse_version($parsefile); + $have; +} + +#-> sub CPAN::Module::inst_version ; +sub available_version { + my($self) = @_; + my $parsefile = $self->available_file or return; + my $have = $self->parse_version($parsefile); + $have; +} + +#-> sub CPAN::Module::parse_version ; +sub parse_version { + my($self,$parsefile) = @_; + if (ALARM_IMPLEMENTED) { + my $timeout = (exists($CPAN::Config{'version_timeout'})) + ? $CPAN::Config{'version_timeout'} + : 15; + alarm($timeout); + } + my $have = eval { + local $SIG{ALRM} = sub { die "alarm\n" }; + MM->parse_version($parsefile); + }; + if ($@) { + $CPAN::Frontend->mywarn("Error while parsing version number in file '$parsefile'\n"); + } + alarm(0) if ALARM_IMPLEMENTED; + my $leastsanity = eval { defined $have && length $have; }; + $have = "undef" unless $leastsanity; + $have =~ s/^ //; # since the %vd hack these two lines here are needed + $have =~ s/ $//; # trailing whitespace happens all the time + + $have = CPAN::Version->readable($have); + + $have =~ s/\s*//g; # stringify to float around floating point issues + $have; # no stringify needed, \s* above matches always +} + +#-> sub CPAN::Module::reports +sub reports { + my($self) = @_; + $self->distribution->reports; +} + +1; +package CPAN::Index; +use strict; +use vars qw($LAST_TIME $DATE_OF_02 $DATE_OF_03 $HAVE_REANIMATED $VERSION); +$VERSION = "2.12"; +@CPAN::Index::ISA = qw(CPAN::Debug); +$LAST_TIME ||= 0; +$DATE_OF_03 ||= 0; +# use constant PROTOCOL => "2.0"; # commented out to avoid warning on upgrade from 1.57 +sub PROTOCOL { 2.0 } + +#-> sub CPAN::Index::force_reload ; +sub force_reload { + my($class) = @_; + $CPAN::Index::LAST_TIME = 0; + $class->reload(1); +} + +my @indexbundle = + ( + { + reader => "rd_authindex", + dir => "authors", + remotefile => '01mailrc.txt.gz', + shortlocalfile => '01mailrc.gz', + }, + { + reader => "rd_modpacks", + dir => "modules", + remotefile => '02packages.details.txt.gz', + shortlocalfile => '02packag.gz', + }, + { + reader => "rd_modlist", + dir => "modules", + remotefile => '03modlist.data.gz', + shortlocalfile => '03mlist.gz', + }, + ); + +#-> sub CPAN::Index::reload ; +sub reload { + my($self,$force) = @_; + my $time = time; + + # XXX check if a newer one is available. (We currently read it + # from time to time) + for ($CPAN::Config->{index_expire}) { + $_ = 0.001 unless $_ && $_ > 0.001; + } + unless (1 || $CPAN::Have_warned->{readmetadatacache}++) { + # debug here when CPAN doesn't seem to read the Metadata + require Carp; + Carp::cluck("META-PROTOCOL[$CPAN::META->{PROTOCOL}]"); + } + unless ($CPAN::META->{PROTOCOL}) { + $self->read_metadata_cache; + $CPAN::META->{PROTOCOL} ||= "1.0"; + } + if ( $CPAN::META->{PROTOCOL} < PROTOCOL ) { + # warn "Setting last_time to 0"; + $LAST_TIME = 0; # No warning necessary + } + if ($LAST_TIME + $CPAN::Config->{index_expire}*86400 > $time + and ! $force) { + # called too often + # CPAN->debug("LAST_TIME[$LAST_TIME]index_expire[$CPAN::Config->{index_expire}]time[$time]"); + } elsif (0) { + # IFF we are developing, it helps to wipe out the memory + # between reloads, otherwise it is not what a user expects. + undef $CPAN::META; # Neue Gruendlichkeit since v1.52(r1.274) + $CPAN::META = CPAN->new; + } else { + my($debug,$t2); + local $LAST_TIME = $time; + local $CPAN::META->{PROTOCOL} = PROTOCOL; + + my $needshort = $^O eq "dos"; + + INX: for my $indexbundle (@indexbundle) { + my $reader = $indexbundle->{reader}; + my $localfile = $needshort ? $indexbundle->{shortlocalfile} : $indexbundle->{remotefile}; + my $localpath = File::Spec->catfile($indexbundle->{dir}, $localfile); + my $remote = join "/", $indexbundle->{dir}, $indexbundle->{remotefile}; + my $localized = $self->reload_x($remote, $localpath, $force); + $self->$reader($localized); # may die but we let the shell catch it + if ($CPAN::DEBUG){ + $t2 = time; + $debug = "timing reading 01[".($t2 - $time)."]"; + $time = $t2; + } + return if $CPAN::Signal; # this is sometimes lengthy + } + $self->write_metadata_cache; + if ($CPAN::DEBUG){ + $t2 = time; + $debug .= "03[".($t2 - $time)."]"; + $time = $t2; + } + CPAN->debug($debug) if $CPAN::DEBUG; + } + if ($CPAN::Config->{build_dir_reuse}) { + $self->reanimate_build_dir; + } + if (CPAN::_sqlite_running()) { + $CPAN::SQLite->reload(time => $time, force => $force) + if not $LAST_TIME; + } + $LAST_TIME = $time; + $CPAN::META->{PROTOCOL} = PROTOCOL; +} + +#-> sub CPAN::Index::reanimate_build_dir ; +sub reanimate_build_dir { + my($self) = @_; + unless ($CPAN::META->has_inst($CPAN::Config->{yaml_module}||"YAML")) { + return; + } + return if $HAVE_REANIMATED++; + my $d = $CPAN::Config->{build_dir}; + my $dh = DirHandle->new; + opendir $dh, $d or return; # does not exist + my $dirent; + my $i = 0; + my $painted = 0; + my $restored = 0; + my $start = CPAN::FTP::_mytime(); + my @candidates = map { $_->[0] } + sort { $b->[1] <=> $a->[1] } + map { [ $_, -M File::Spec->catfile($d,$_) ] } + grep {/(.+)\.yml$/ && -d File::Spec->catfile($d,$1)} readdir $dh; + if ( @candidates ) { + $CPAN::Frontend->myprint + (sprintf("Reading %d yaml file%s from %s/\n", + scalar @candidates, + @candidates==1 ? "" : "s", + $CPAN::Config->{build_dir} + )); + DISTRO: for $i (0..$#candidates) { + my $dirent = $candidates[$i]; + my $y = eval {CPAN->_yaml_loadfile(File::Spec->catfile($d,$dirent))}; + if ($@) { + warn "Error while parsing file '$dirent'; error: '$@'"; + next DISTRO; + } + my $c = $y->[0]; + if ($c && $c->{perl} && $c->{distribution} && CPAN->_perl_fingerprint($c->{perl})) { + my $key = $c->{distribution}{ID}; + for my $k (keys %{$c->{distribution}}) { + if ($c->{distribution}{$k} + && ref $c->{distribution}{$k} + && UNIVERSAL::isa($c->{distribution}{$k},"CPAN::Distrostatus")) { + $c->{distribution}{$k}{COMMANDID} = $i - @candidates; + } + } + + #we tried to restore only if element already + #exists; but then we do not work with metadata + #turned off. + my $do + = $CPAN::META->{readwrite}{'CPAN::Distribution'}{$key} + = $c->{distribution}; + for my $skipper (qw( + badtestcnt + configure_requires_later + configure_requires_later_for + force_update + later + later_for + notest + should_report + sponsored_mods + prefs + negative_prefs_cache + )) { + delete $do->{$skipper}; + } + if ($do->can("tested_ok_but_not_installed")) { + if ($do->tested_ok_but_not_installed) { + $CPAN::META->is_tested($do->{build_dir},$do->{make_test}{TIME}); + } else { + next DISTRO; + } + } + $restored++; + } + $i++; + while (($painted/76) < ($i/@candidates)) { + $CPAN::Frontend->myprint("."); + $painted++; + } + } + } + else { + $CPAN::Frontend->myprint("Build_dir empty, nothing to restore\n"); + } + my $took = CPAN::FTP::_mytime() - $start; + $CPAN::Frontend->myprint(sprintf( + "DONE\nRestored the state of %s (in %.4f secs)\n", + $restored || "none", + $took, + )); +} + + +#-> sub CPAN::Index::reload_x ; +sub reload_x { + my($cl,$wanted,$localname,$force) = @_; + $force |= 2; # means we're dealing with an index here + CPAN::HandleConfig->load; # we should guarantee loading wherever + # we rely on Config XXX + $localname ||= $wanted; + my $abs_wanted = File::Spec->catfile($CPAN::Config->{'keep_source_where'}, + $localname); + if ( + -f $abs_wanted && + -M $abs_wanted < $CPAN::Config->{'index_expire'} && + !($force & 1) + ) { + my $s = $CPAN::Config->{'index_expire'} == 1 ? "" : "s"; + $cl->debug(qq{$abs_wanted younger than $CPAN::Config->{'index_expire'} }. + qq{day$s. I\'ll use that.}); + return $abs_wanted; + } else { + $force |= 1; # means we're quite serious about it. + } + return CPAN::FTP->localize($wanted,$abs_wanted,$force); +} + +#-> sub CPAN::Index::rd_authindex ; +sub rd_authindex { + my($cl, $index_target) = @_; + return unless defined $index_target; + return if CPAN::_sqlite_running(); + my @lines; + $CPAN::Frontend->myprint("Reading '$index_target'\n"); + local(*FH); + tie *FH, 'CPAN::Tarzip', $index_target; + local($/) = "\n"; + local($_); + push @lines, split /\012/ while <FH>; + my $i = 0; + my $painted = 0; + foreach (@lines) { + my($userid,$fullname,$email) = + m/alias\s+(\S+)\s+\"([^\"\<]*)\s+\<(.*)\>\"/; + $fullname ||= $email; + if ($userid && $fullname && $email) { + my $userobj = $CPAN::META->instance('CPAN::Author',$userid); + $userobj->set('FULLNAME' => $fullname, 'EMAIL' => $email); + } else { + CPAN->debug(sprintf "line[%s]", $_) if $CPAN::DEBUG; + } + $i++; + while (($painted/76) < ($i/@lines)) { + $CPAN::Frontend->myprint("."); + $painted++; + } + return if $CPAN::Signal; + } + $CPAN::Frontend->myprint("DONE\n"); +} + +sub userid { + my($self,$dist) = @_; + $dist = $self->{'id'} unless defined $dist; + my($ret) = $dist =~ m|(?:\w/\w\w/)?([^/]+)/|; + $ret; +} + +#-> sub CPAN::Index::rd_modpacks ; +sub rd_modpacks { + my($self, $index_target) = @_; + return unless defined $index_target; + return if CPAN::_sqlite_running(); + $CPAN::Frontend->myprint("Reading '$index_target'\n"); + my $fh = CPAN::Tarzip->TIEHANDLE($index_target); + local $_; + CPAN->debug(sprintf "start[%d]", time) if $CPAN::DEBUG; + my $slurp = ""; + my $chunk; + while (my $bytes = $fh->READ(\$chunk,8192)) { + $slurp.=$chunk; + } + my @lines = split /\012/, $slurp; + CPAN->debug(sprintf "end[%d]", time) if $CPAN::DEBUG; + undef $fh; + # read header + my($line_count,$last_updated); + while (@lines) { + my $shift = shift(@lines); + last if $shift =~ /^\s*$/; + $shift =~ /^Line-Count:\s+(\d+)/ and $line_count = $1; + $shift =~ /^Last-Updated:\s+(.+)/ and $last_updated = $1; + } + CPAN->debug("line_count[$line_count]last_updated[$last_updated]") if $CPAN::DEBUG; + my $errors = 0; + if (not defined $line_count) { + + $CPAN::Frontend->mywarn(qq{Warning: Your $index_target does not contain a Line-Count header. +Please check the validity of the index file by comparing it to more +than one CPAN mirror. I'll continue but problems seem likely to +happen.\a +}); + $errors++; + $CPAN::Frontend->mysleep(5); + } elsif ($line_count != scalar @lines) { + + $CPAN::Frontend->mywarn(sprintf qq{Warning: Your %s +contains a Line-Count header of %d but I see %d lines there. Please +check the validity of the index file by comparing it to more than one +CPAN mirror. I'll continue but problems seem likely to happen.\a\n}, +$index_target, $line_count, scalar(@lines)); + + } + if (not defined $last_updated) { + + $CPAN::Frontend->mywarn(qq{Warning: Your $index_target does not contain a Last-Updated header. +Please check the validity of the index file by comparing it to more +than one CPAN mirror. I'll continue but problems seem likely to +happen.\a +}); + $errors++; + $CPAN::Frontend->mysleep(5); + } else { + + $CPAN::Frontend + ->myprint(sprintf qq{ Database was generated on %s\n}, + $last_updated); + $DATE_OF_02 = $last_updated; + + my $age = time; + if ($CPAN::META->has_inst('HTTP::Date')) { + require HTTP::Date; + $age -= HTTP::Date::str2time($last_updated); + } else { + $CPAN::Frontend->mywarn(" HTTP::Date not available\n"); + require Time::Local; + my(@d) = $last_updated =~ / (\d+) (\w+) (\d+) (\d+):(\d+):(\d+) /; + $d[1] = index("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", $d[1])/4; + $age -= $d[1]>=0 ? Time::Local::timegm(@d[5,4,3,0,1,2]) : 0; + } + $age /= 3600*24; + if ($age > 30) { + + $CPAN::Frontend + ->mywarn(sprintf + qq{Warning: This index file is %d days old. + Please check the host you chose as your CPAN mirror for staleness. + I'll continue but problems seem likely to happen.\a\n}, + $age); + + } elsif ($age < -1) { + + $CPAN::Frontend + ->mywarn(sprintf + qq{Warning: Your system date is %d days behind this index file! + System time: %s + Timestamp index file: %s + Please fix your system time, problems with the make command expected.\n}, + -$age, + scalar gmtime, + $DATE_OF_02, + ); + + } + } + + + # A necessity since we have metadata_cache: delete what isn't + # there anymore + my $secondtime = $CPAN::META->exists("CPAN::Module","CPAN"); + CPAN->debug("secondtime[$secondtime]") if $CPAN::DEBUG; + my(%exists); + my $i = 0; + my $painted = 0; + LINE: foreach (@lines) { + # before 1.56 we split into 3 and discarded the rest. From + # 1.57 we assign remaining text to $comment thus allowing to + # influence isa_perl + my($mod,$version,$dist,$comment) = split " ", $_, 4; + unless ($mod && defined $version && $dist) { + require Dumpvalue; + my $dv = Dumpvalue->new(tick => '"'); + $CPAN::Frontend->mywarn(sprintf "Could not split line[%s]\n", $dv->stringify($_)); + if ($errors++ >= 5){ + $CPAN::Frontend->mydie("Giving up parsing your $index_target, too many errors"); + } + next LINE; + } + my($bundle,$id,$userid); + + if ($mod eq 'CPAN' && + ! ( + CPAN::Queue->exists('Bundle::CPAN') || + CPAN::Queue->exists('CPAN') + ) + ) { + local($^W)= 0; + if ($version > $CPAN::VERSION) { + $CPAN::Frontend->mywarn(qq{ + New CPAN.pm version (v$version) available. + [Currently running version is v$CPAN::VERSION] + You might want to try + install CPAN + reload cpan + to both upgrade CPAN.pm and run the new version without leaving + the current session. + +}); #}); + $CPAN::Frontend->mysleep(2); + $CPAN::Frontend->myprint(qq{\n}); + } + last if $CPAN::Signal; + } elsif ($mod =~ /^Bundle::(.*)/) { + $bundle = $1; + } + + if ($bundle) { + $id = $CPAN::META->instance('CPAN::Bundle',$mod); + # Let's make it a module too, because bundles have so much + # in common with modules. + + # Changed in 1.57_63: seems like memory bloat now without + # any value, so commented out + + # $CPAN::META->instance('CPAN::Module',$mod); + + } else { + + # instantiate a module object + $id = $CPAN::META->instance('CPAN::Module',$mod); + + } + + # Although CPAN prohibits same name with different version the + # indexer may have changed the version for the same distro + # since the last time ("Force Reindexing" feature) + if ($id->cpan_file ne $dist + || + $id->cpan_version ne $version + ) { + $userid = $id->userid || $self->userid($dist); + $id->set( + 'CPAN_USERID' => $userid, + 'CPAN_VERSION' => $version, + 'CPAN_FILE' => $dist, + ); + } + + # instantiate a distribution object + if ($CPAN::META->exists('CPAN::Distribution',$dist)) { + # we do not need CONTAINSMODS unless we do something with + # this dist, so we better produce it on demand. + + ## my $obj = $CPAN::META->instance( + ## 'CPAN::Distribution' => $dist + ## ); + ## $obj->{CONTAINSMODS}{$mod} = undef; # experimental + } else { + $CPAN::META->instance( + 'CPAN::Distribution' => $dist + )->set( + 'CPAN_USERID' => $userid, + 'CPAN_COMMENT' => $comment, + ); + } + if ($secondtime) { + for my $name ($mod,$dist) { + # $self->debug("exists name[$name]") if $CPAN::DEBUG; + $exists{$name} = undef; + } + } + $i++; + while (($painted/76) < ($i/@lines)) { + $CPAN::Frontend->myprint("."); + $painted++; + } + return if $CPAN::Signal; + } + $CPAN::Frontend->myprint("DONE\n"); + if ($secondtime) { + for my $class (qw(CPAN::Module CPAN::Bundle CPAN::Distribution)) { + for my $o ($CPAN::META->all_objects($class)) { + next if exists $exists{$o->{ID}}; + $CPAN::META->delete($class,$o->{ID}); + # CPAN->debug("deleting ID[$o->{ID}] in class[$class]") + # if $CPAN::DEBUG; + } + } + } +} + +#-> sub CPAN::Index::rd_modlist ; +sub rd_modlist { + my($cl,$index_target) = @_; + return unless defined $index_target; + return if CPAN::_sqlite_running(); + $CPAN::Frontend->myprint("Reading '$index_target'\n"); + my $fh = CPAN::Tarzip->TIEHANDLE($index_target); + local $_; + my $slurp = ""; + my $chunk; + while (my $bytes = $fh->READ(\$chunk,8192)) { + $slurp.=$chunk; + } + my @eval2 = split /\012/, $slurp; + + while (@eval2) { + my $shift = shift(@eval2); + if ($shift =~ /^Date:\s+(.*)/) { + if ($DATE_OF_03 eq $1) { + $CPAN::Frontend->myprint("Unchanged.\n"); + return; + } + ($DATE_OF_03) = $1; + } + last if $shift =~ /^\s*$/; + } + push @eval2, q{CPAN::Modulelist->data;}; + local($^W) = 0; + my($compmt) = Safe->new("CPAN::Safe1"); + my($eval2) = join("\n", @eval2); + CPAN->debug(sprintf "length of eval2[%d]", length $eval2) if $CPAN::DEBUG; + my $ret = $compmt->reval($eval2); + Carp::confess($@) if $@; + return if $CPAN::Signal; + my $i = 0; + my $until = keys(%$ret); + my $painted = 0; + CPAN->debug(sprintf "until[%d]", $until) if $CPAN::DEBUG; + for (sort keys %$ret) { + my $obj = $CPAN::META->instance("CPAN::Module",$_); + delete $ret->{$_}{modid}; # not needed here, maybe elsewhere + $obj->set(%{$ret->{$_}}); + $i++; + while (($painted/76) < ($i/$until)) { + $CPAN::Frontend->myprint("."); + $painted++; + } + return if $CPAN::Signal; + } + $CPAN::Frontend->myprint("DONE\n"); +} + +#-> sub CPAN::Index::write_metadata_cache ; +sub write_metadata_cache { + my($self) = @_; + return unless $CPAN::Config->{'cache_metadata'}; + return if CPAN::_sqlite_running(); + return unless $CPAN::META->has_usable("Storable"); + my $cache; + foreach my $k (qw(CPAN::Bundle CPAN::Author CPAN::Module + CPAN::Distribution)) { + $cache->{$k} = $CPAN::META->{readonly}{$k}; # unsafe meta access, ok + } + my $metadata_file = File::Spec->catfile($CPAN::Config->{cpan_home},"Metadata"); + $cache->{last_time} = $LAST_TIME; + $cache->{DATE_OF_02} = $DATE_OF_02; + $cache->{PROTOCOL} = PROTOCOL; + $CPAN::Frontend->myprint("Writing $metadata_file\n"); + eval { Storable::nstore($cache, $metadata_file) }; + $CPAN::Frontend->mywarn($@) if $@; # ?? missing "\n" after $@ in mywarn ?? +} + +#-> sub CPAN::Index::read_metadata_cache ; +sub read_metadata_cache { + my($self) = @_; + return unless $CPAN::Config->{'cache_metadata'}; + return if CPAN::_sqlite_running(); + return unless $CPAN::META->has_usable("Storable"); + my $metadata_file = File::Spec->catfile($CPAN::Config->{cpan_home},"Metadata"); + return unless -r $metadata_file and -f $metadata_file; + $CPAN::Frontend->myprint("Reading '$metadata_file'\n"); + my $cache; + eval { $cache = Storable::retrieve($metadata_file) }; + $CPAN::Frontend->mywarn($@) if $@; # ?? missing "\n" after $@ in mywarn ?? + if (!$cache || !UNIVERSAL::isa($cache, 'HASH')) { + $LAST_TIME = 0; + return; + } + if (exists $cache->{PROTOCOL}) { + if (PROTOCOL > $cache->{PROTOCOL}) { + $CPAN::Frontend->mywarn(sprintf("Ignoring Metadata cache written ". + "with protocol v%s, requiring v%s\n", + $cache->{PROTOCOL}, + PROTOCOL) + ); + return; + } + } else { + $CPAN::Frontend->mywarn("Ignoring Metadata cache written ". + "with protocol v1.0\n"); + return; + } + my $clcnt = 0; + my $idcnt = 0; + while(my($class,$v) = each %$cache) { + next unless $class =~ /^CPAN::/; + $CPAN::META->{readonly}{$class} = $v; # unsafe meta access, ok + while (my($id,$ro) = each %$v) { + $CPAN::META->{readwrite}{$class}{$id} ||= + $class->new(ID=>$id, RO=>$ro); + $idcnt++; + } + $clcnt++; + } + unless ($clcnt) { # sanity check + $CPAN::Frontend->myprint("Warning: Found no data in $metadata_file\n"); + return; + } + if ($idcnt < 1000) { + $CPAN::Frontend->myprint("Warning: Found only $idcnt objects ". + "in $metadata_file\n"); + return; + } + $CPAN::META->{PROTOCOL} ||= + $cache->{PROTOCOL}; # reading does not up or downgrade, but it + # does initialize to some protocol + $LAST_TIME = $cache->{last_time}; + $DATE_OF_02 = $cache->{DATE_OF_02}; + $CPAN::Frontend->myprint(" Database was generated on $DATE_OF_02\n") + if defined $DATE_OF_02; # An old cache may not contain DATE_OF_02 + return; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Prompt; +use overload '""' => "as_string"; +use vars qw($prompt); +use vars qw( + $VERSION +); +$VERSION = "5.5"; + + +$prompt = "cpan> "; +$CPAN::CurrentCommandId ||= 0; +sub new { + bless {}, shift; +} +sub as_string { + my $word = "cpan"; + unless ($CPAN::META->{LOCK}) { + $word = "nolock_cpan"; + } + if ($CPAN::Config->{commandnumber_in_prompt}) { + sprintf "$word\[%d]> ", $CPAN::CurrentCommandId; + } else { + "$word> "; + } +} + +1; +package CPAN::Nox; +use strict; +use vars qw($VERSION @EXPORT); + +BEGIN{ + $CPAN::Suppress_readline=1 unless defined $CPAN::term; +} + +use Exporter (); +@CPAN::ISA = ('Exporter'); +use CPAN; + +$VERSION = "5.5001"; +$CPAN::META->has_inst('Digest::MD5','no'); +$CPAN::META->has_inst('LWP','no'); +$CPAN::META->has_inst('Compress::Zlib','no'); +@EXPORT = @CPAN::EXPORT; + +*AUTOLOAD = \&CPAN::AUTOLOAD; + +1; + +__END__ + + +use 5.006; +use strict; +use warnings; +package CPAN::Meta; + +our $VERSION = '2.150010'; + +#pod =head1 SYNOPSIS +#pod +#pod use v5.10; +#pod use strict; +#pod use warnings; +#pod use CPAN::Meta; +#pod use Module::Load; +#pod +#pod my $meta = CPAN::Meta->load_file('META.json'); +#pod +#pod printf "testing requirements for %s version %s\n", +#pod $meta->name, +#pod $meta->version; +#pod +#pod my $prereqs = $meta->effective_prereqs; +#pod +#pod for my $phase ( qw/configure runtime build test/ ) { +#pod say "Requirements for $phase:"; +#pod my $reqs = $prereqs->requirements_for($phase, "requires"); +#pod for my $module ( sort $reqs->required_modules ) { +#pod my $status; +#pod if ( eval { load $module unless $module eq 'perl'; 1 } ) { +#pod my $version = $module eq 'perl' ? $] : $module->VERSION; +#pod $status = $reqs->accepts_module($module, $version) +#pod ? "$version ok" : "$version not ok"; +#pod } else { +#pod $status = "missing" +#pod }; +#pod say " $module ($status)"; +#pod } +#pod } +#pod +#pod =head1 DESCRIPTION +#pod +#pod Software distributions released to the CPAN include a F<META.json> or, for +#pod older distributions, F<META.yml>, which describes the distribution, its +#pod contents, and the requirements for building and installing the distribution. +#pod The data structure stored in the F<META.json> file is described in +#pod L<CPAN::Meta::Spec>. +#pod +#pod CPAN::Meta provides a simple class to represent this distribution metadata (or +#pod I<distmeta>), along with some helpful methods for interrogating that data. +#pod +#pod The documentation below is only for the methods of the CPAN::Meta object. For +#pod information on the meaning of individual fields, consult the spec. +#pod +#pod =cut + +use Carp qw(carp croak); +use CPAN::Meta::Feature; +use CPAN::Meta::Prereqs; +use CPAN::Meta::Converter; +use CPAN::Meta::Validator; +use Parse::CPAN::Meta 1.4414 (); + +BEGIN { *_dclone = \&CPAN::Meta::Converter::_dclone } + +#pod =head1 STRING DATA +#pod +#pod The following methods return a single value, which is the value for the +#pod corresponding entry in the distmeta structure. Values should be either undef +#pod or strings. +#pod +#pod =for :list +#pod * abstract +#pod * description +#pod * dynamic_config +#pod * generated_by +#pod * name +#pod * release_status +#pod * version +#pod +#pod =cut + +BEGIN { + my @STRING_READERS = qw( + abstract + description + dynamic_config + generated_by + name + release_status + version + ); + + no strict 'refs'; + for my $attr (@STRING_READERS) { + *$attr = sub { $_[0]{ $attr } }; + } +} + +#pod =head1 LIST DATA +#pod +#pod These methods return lists of string values, which might be represented in the +#pod distmeta structure as arrayrefs or scalars: +#pod +#pod =for :list +#pod * authors +#pod * keywords +#pod * licenses +#pod +#pod The C<authors> and C<licenses> methods may also be called as C<author> and +#pod C<license>, respectively, to match the field name in the distmeta structure. +#pod +#pod =cut + +BEGIN { + my @LIST_READERS = qw( + author + keywords + license + ); + + no strict 'refs'; + for my $attr (@LIST_READERS) { + *$attr = sub { + my $value = $_[0]{ $attr }; + croak "$attr must be called in list context" + unless wantarray; + return @{ _dclone($value) } if ref $value; + return $value; + }; + } +} + +sub authors { $_[0]->author } +sub licenses { $_[0]->license } + +#pod =head1 MAP DATA +#pod +#pod These readers return hashrefs of arbitrary unblessed data structures, each +#pod described more fully in the specification: +#pod +#pod =for :list +#pod * meta_spec +#pod * resources +#pod * provides +#pod * no_index +#pod * prereqs +#pod * optional_features +#pod +#pod =cut + +BEGIN { + my @MAP_READERS = qw( + meta-spec + resources + provides + no_index + + prereqs + optional_features + ); + + no strict 'refs'; + for my $attr (@MAP_READERS) { + (my $subname = $attr) =~ s/-/_/; + *$subname = sub { + my $value = $_[0]{ $attr }; + return _dclone($value) if $value; + return {}; + }; + } +} + +#pod =head1 CUSTOM DATA +#pod +#pod A list of custom keys are available from the C<custom_keys> method and +#pod particular keys may be retrieved with the C<custom> method. +#pod +#pod say $meta->custom($_) for $meta->custom_keys; +#pod +#pod If a custom key refers to a data structure, a deep clone is returned. +#pod +#pod =cut + +sub custom_keys { + return grep { /^x_/i } keys %{$_[0]}; +} + +sub custom { + my ($self, $attr) = @_; + my $value = $self->{$attr}; + return _dclone($value) if ref $value; + return $value; +} + +#pod =method new +#pod +#pod my $meta = CPAN::Meta->new($distmeta_struct, \%options); +#pod +#pod Returns a valid CPAN::Meta object or dies if the supplied metadata hash +#pod reference fails to validate. Older-format metadata will be up-converted to +#pod version 2 if they validate against the original stated specification. +#pod +#pod It takes an optional hashref of options. Valid options include: +#pod +#pod =over +#pod +#pod =item * +#pod +#pod lazy_validation -- if true, new will attempt to convert the given metadata +#pod to version 2 before attempting to validate it. This means than any +#pod fixable errors will be handled by CPAN::Meta::Converter before validation. +#pod (Note that this might result in invalid optional data being silently +#pod dropped.) The default is false. +#pod +#pod =back +#pod +#pod =cut + +sub _new { + my ($class, $struct, $options) = @_; + my $self; + + if ( $options->{lazy_validation} ) { + # try to convert to a valid structure; if succeeds, then return it + my $cmc = CPAN::Meta::Converter->new( $struct ); + $self = $cmc->convert( version => 2 ); # valid or dies + return bless $self, $class; + } + else { + # validate original struct + my $cmv = CPAN::Meta::Validator->new( $struct ); + unless ( $cmv->is_valid) { + die "Invalid metadata structure. Errors: " + . join(", ", $cmv->errors) . "\n"; + } + } + + # up-convert older spec versions + my $version = $struct->{'meta-spec'}{version} || '1.0'; + if ( $version == 2 ) { + $self = $struct; + } + else { + my $cmc = CPAN::Meta::Converter->new( $struct ); + $self = $cmc->convert( version => 2 ); + } + + return bless $self, $class; +} + +sub new { + my ($class, $struct, $options) = @_; + my $self = eval { $class->_new($struct, $options) }; + croak($@) if $@; + return $self; +} + +#pod =method create +#pod +#pod my $meta = CPAN::Meta->create($distmeta_struct, \%options); +#pod +#pod This is same as C<new()>, except that C<generated_by> and C<meta-spec> fields +#pod will be generated if not provided. This means the metadata structure is +#pod assumed to otherwise follow the latest L<CPAN::Meta::Spec>. +#pod +#pod =cut + +sub create { + my ($class, $struct, $options) = @_; + my $version = __PACKAGE__->VERSION || 2; + $struct->{generated_by} ||= __PACKAGE__ . " version $version" ; + $struct->{'meta-spec'}{version} ||= int($version); + my $self = eval { $class->_new($struct, $options) }; + croak ($@) if $@; + return $self; +} + +#pod =method load_file +#pod +#pod my $meta = CPAN::Meta->load_file($distmeta_file, \%options); +#pod +#pod Given a pathname to a file containing metadata, this deserializes the file +#pod according to its file suffix and constructs a new C<CPAN::Meta> object, just +#pod like C<new()>. It will die if the deserialized version fails to validate +#pod against its stated specification version. +#pod +#pod It takes the same options as C<new()> but C<lazy_validation> defaults to +#pod true. +#pod +#pod =cut + +sub load_file { + my ($class, $file, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + croak "load_file() requires a valid, readable filename" + unless -r $file; + + my $self; + eval { + my $struct = Parse::CPAN::Meta->load_file( $file ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; +} + +#pod =method load_yaml_string +#pod +#pod my $meta = CPAN::Meta->load_yaml_string($yaml, \%options); +#pod +#pod This method returns a new CPAN::Meta object using the first document in the +#pod given YAML string. In other respects it is identical to C<load_file()>. +#pod +#pod =cut + +sub load_yaml_string { + my ($class, $yaml, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + my $self; + eval { + my ($struct) = Parse::CPAN::Meta->load_yaml_string( $yaml ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; +} + +#pod =method load_json_string +#pod +#pod my $meta = CPAN::Meta->load_json_string($json, \%options); +#pod +#pod This method returns a new CPAN::Meta object using the structure represented by +#pod the given JSON string. In other respects it is identical to C<load_file()>. +#pod +#pod =cut + +sub load_json_string { + my ($class, $json, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + my $self; + eval { + my $struct = Parse::CPAN::Meta->load_json_string( $json ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; +} + +#pod =method load_string +#pod +#pod my $meta = CPAN::Meta->load_string($string, \%options); +#pod +#pod If you don't know if a string contains YAML or JSON, this method will use +#pod L<Parse::CPAN::Meta> to guess. In other respects it is identical to +#pod C<load_file()>. +#pod +#pod =cut + +sub load_string { + my ($class, $string, $options) = @_; + $options->{lazy_validation} = 1 unless exists $options->{lazy_validation}; + + my $self; + eval { + my $struct = Parse::CPAN::Meta->load_string( $string ); + $self = $class->_new($struct, $options); + }; + croak($@) if $@; + return $self; +} + +#pod =method save +#pod +#pod $meta->save($distmeta_file, \%options); +#pod +#pod Serializes the object as JSON and writes it to the given file. The only valid +#pod option is C<version>, which defaults to '2'. On Perl 5.8.1 or later, the file +#pod is saved with UTF-8 encoding. +#pod +#pod For C<version> 2 (or higher), the filename should end in '.json'. L<JSON::PP> +#pod is the default JSON backend. Using another JSON backend requires L<JSON> 2.5 or +#pod later and you must set the C<$ENV{PERL_JSON_BACKEND}> to a supported alternate +#pod backend like L<JSON::XS>. +#pod +#pod For C<version> less than 2, the filename should end in '.yml'. +#pod L<CPAN::Meta::Converter> is used to generate an older metadata structure, which +#pod is serialized to YAML. CPAN::Meta::YAML is the default YAML backend. You may +#pod set the C<$ENV{PERL_YAML_BACKEND}> to a supported alternative backend, though +#pod this is not recommended due to subtle incompatibilities between YAML parsers on +#pod CPAN. +#pod +#pod =cut + +sub save { + my ($self, $file, $options) = @_; + + my $version = $options->{version} || '2'; + my $layer = $] ge '5.008001' ? ':utf8' : ''; + + if ( $version ge '2' ) { + carp "'$file' should end in '.json'" + unless $file =~ m{\.json$}; + } + else { + carp "'$file' should end in '.yml'" + unless $file =~ m{\.yml$}; + } + + my $data = $self->as_string( $options ); + open my $fh, ">$layer", $file + or die "Error opening '$file' for writing: $!\n"; + + print {$fh} $data; + close $fh + or die "Error closing '$file': $!\n"; + + return 1; +} + +#pod =method meta_spec_version +#pod +#pod This method returns the version part of the C<meta_spec> entry in the distmeta +#pod structure. It is equivalent to: +#pod +#pod $meta->meta_spec->{version}; +#pod +#pod =cut + +sub meta_spec_version { + my ($self) = @_; + return $self->meta_spec->{version}; +} + +#pod =method effective_prereqs +#pod +#pod my $prereqs = $meta->effective_prereqs; +#pod +#pod my $prereqs = $meta->effective_prereqs( \@feature_identifiers ); +#pod +#pod This method returns a L<CPAN::Meta::Prereqs> object describing all the +#pod prereqs for the distribution. If an arrayref of feature identifiers is given, +#pod the prereqs for the identified features are merged together with the +#pod distribution's core prereqs before the CPAN::Meta::Prereqs object is returned. +#pod +#pod =cut + +sub effective_prereqs { + my ($self, $features) = @_; + $features ||= []; + + my $prereq = CPAN::Meta::Prereqs->new($self->prereqs); + + return $prereq unless @$features; + + my @other = map {; $self->feature($_)->prereqs } @$features; + + return $prereq->with_merged_prereqs(\@other); +} + +#pod =method should_index_file +#pod +#pod ... if $meta->should_index_file( $filename ); +#pod +#pod This method returns true if the given file should be indexed. It decides this +#pod by checking the C<file> and C<directory> keys in the C<no_index> property of +#pod the distmeta structure. Note that neither the version format nor +#pod C<release_status> are considered. +#pod +#pod C<$filename> should be given in unix format. +#pod +#pod =cut + +sub should_index_file { + my ($self, $filename) = @_; + + for my $no_index_file (@{ $self->no_index->{file} || [] }) { + return if $filename eq $no_index_file; + } + + for my $no_index_dir (@{ $self->no_index->{directory} }) { + $no_index_dir =~ s{$}{/} unless $no_index_dir =~ m{/\z}; + return if index($filename, $no_index_dir) == 0; + } + + return 1; +} + +#pod =method should_index_package +#pod +#pod ... if $meta->should_index_package( $package ); +#pod +#pod This method returns true if the given package should be indexed. It decides +#pod this by checking the C<package> and C<namespace> keys in the C<no_index> +#pod property of the distmeta structure. Note that neither the version format nor +#pod C<release_status> are considered. +#pod +#pod =cut + +sub should_index_package { + my ($self, $package) = @_; + + for my $no_index_pkg (@{ $self->no_index->{package} || [] }) { + return if $package eq $no_index_pkg; + } + + for my $no_index_ns (@{ $self->no_index->{namespace} }) { + return if index($package, "${no_index_ns}::") == 0; + } + + return 1; +} + +#pod =method features +#pod +#pod my @feature_objects = $meta->features; +#pod +#pod This method returns a list of L<CPAN::Meta::Feature> objects, one for each +#pod optional feature described by the distribution's metadata. +#pod +#pod =cut + +sub features { + my ($self) = @_; + + my $opt_f = $self->optional_features; + my @features = map {; CPAN::Meta::Feature->new($_ => $opt_f->{ $_ }) } + keys %$opt_f; + + return @features; +} + +#pod =method feature +#pod +#pod my $feature_object = $meta->feature( $identifier ); +#pod +#pod This method returns a L<CPAN::Meta::Feature> object for the optional feature +#pod with the given identifier. If no feature with that identifier exists, an +#pod exception will be raised. +#pod +#pod =cut + +sub feature { + my ($self, $ident) = @_; + + croak "no feature named $ident" + unless my $f = $self->optional_features->{ $ident }; + + return CPAN::Meta::Feature->new($ident, $f); +} + +#pod =method as_struct +#pod +#pod my $copy = $meta->as_struct( \%options ); +#pod +#pod This method returns a deep copy of the object's metadata as an unblessed hash +#pod reference. It takes an optional hashref of options. If the hashref contains +#pod a C<version> argument, the copied metadata will be converted to the version +#pod of the specification and returned. For example: +#pod +#pod my $old_spec = $meta->as_struct( {version => "1.4"} ); +#pod +#pod =cut + +sub as_struct { + my ($self, $options) = @_; + my $struct = _dclone($self); + if ( $options->{version} ) { + my $cmc = CPAN::Meta::Converter->new( $struct ); + $struct = $cmc->convert( version => $options->{version} ); + } + return $struct; +} + +#pod =method as_string +#pod +#pod my $string = $meta->as_string( \%options ); +#pod +#pod This method returns a serialized copy of the object's metadata as a character +#pod string. (The strings are B<not> UTF-8 encoded.) It takes an optional hashref +#pod of options. If the hashref contains a C<version> argument, the copied metadata +#pod will be converted to the version of the specification and returned. For +#pod example: +#pod +#pod my $string = $meta->as_string( {version => "1.4"} ); +#pod +#pod For C<version> greater than or equal to 2, the string will be serialized as +#pod JSON. For C<version> less than 2, the string will be serialized as YAML. In +#pod both cases, the same rules are followed as in the C<save()> method for choosing +#pod a serialization backend. +#pod +#pod The serialized structure will include a C<x_serialization_backend> entry giving +#pod the package and version used to serialize. Any existing key in the given +#pod C<$meta> object will be clobbered. +#pod +#pod =cut + +sub as_string { + my ($self, $options) = @_; + + my $version = $options->{version} || '2'; + + my $struct; + if ( $self->meta_spec_version ne $version ) { + my $cmc = CPAN::Meta::Converter->new( $self->as_struct ); + $struct = $cmc->convert( version => $version ); + } + else { + $struct = $self->as_struct; + } + + my ($data, $backend); + if ( $version ge '2' ) { + $backend = Parse::CPAN::Meta->json_backend(); + local $struct->{x_serialization_backend} = sprintf '%s version %s', + $backend, $backend->VERSION; + $data = $backend->new->pretty->canonical->encode($struct); + } + else { + $backend = Parse::CPAN::Meta->yaml_backend(); + local $struct->{x_serialization_backend} = sprintf '%s version %s', + $backend, $backend->VERSION; + $data = eval { no strict 'refs'; &{"$backend\::Dump"}($struct) }; + if ( $@ ) { + croak $backend->can('errstr') ? $backend->errstr : $@ + } + } + + return $data; +} + +# Used by JSON::PP, etc. for "convert_blessed" +sub TO_JSON { + return { %{ $_[0] } }; +} + +1; + +# ABSTRACT: the distribution metadata for a CPAN dist + + +__END__ + + +# vim: ts=2 sts=2 sw=2 et : +package CPAN::Version; + +use strict; +use vars qw($VERSION); +$VERSION = "5.5003"; + +# CPAN::Version::vcmp courtesy Jost Krieger +sub vcmp { + my($self,$l,$r) = @_; + local($^W) = 0; + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + + # treat undef as zero + $l = 0 if $l eq 'undef'; + $r = 0 if $r eq 'undef'; + + return 0 if $l eq $r; # short circuit for quicker success + + for ($l,$r) { + s/_//g; + } + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + for ($l,$r) { + next unless tr/.// > 1 || /^v/; + s/^v?/v/; + 1 while s/\.0+(\d)/.$1/; # remove leading zeroes per group + } + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + if ($l=~/^v/ <=> $r=~/^v/) { + for ($l,$r) { + next if /^v/; + $_ = $self->float2vv($_); + } + } + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + my $lvstring = "v0"; + my $rvstring = "v0"; + if ($] >= 5.006 + && $l =~ /^v/ + && $r =~ /^v/) { + $lvstring = $self->vstring($l); + $rvstring = $self->vstring($r); + CPAN->debug(sprintf "lv[%vd] rv[%vd]", $lvstring, $rvstring) if $CPAN::DEBUG; + } + + return ( + ($l ne "undef") <=> ($r ne "undef") + || + $lvstring cmp $rvstring + || + $l <=> $r + || + $l cmp $r + ); +} + +sub vgt { + my($self,$l,$r) = @_; + $self->vcmp($l,$r) > 0; +} + +sub vlt { + my($self,$l,$r) = @_; + $self->vcmp($l,$r) < 0; +} + +sub vge { + my($self,$l,$r) = @_; + $self->vcmp($l,$r) >= 0; +} + +sub vle { + my($self,$l,$r) = @_; + $self->vcmp($l,$r) <= 0; +} + +sub vstring { + my($self,$n) = @_; + $n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]"; + pack "U*", split /\./, $n; +} + +# vv => visible vstring +sub float2vv { + my($self,$n) = @_; + my($rev) = int($n); + $rev ||= 0; + my($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits to limit + # architecture influence + $mantissa ||= 0; + $mantissa .= "0" while length($mantissa)%3; + my $ret = "v" . $rev; + while ($mantissa) { + $mantissa =~ s/(\d{1,3})// or + die "Panic: length>0 but not a digit? mantissa[$mantissa]"; + $ret .= ".".int($1); + } + # warn "n[$n]ret[$ret]"; + $ret =~ s/(\.0)+/.0/; # v1.0.0 => v1.0 + $ret; +} + +sub readable { + my($self,$n) = @_; + $n =~ /^([\w\-\+\.]+)/; + + return $1 if defined $1 && length($1)>0; + # if the first user reaches version v43, he will be treated as "+". + # We'll have to decide about a new rule here then, depending on what + # will be the prevailing versioning behavior then. + + if ($] < 5.006) { # or whenever v-strings were introduced + # we get them wrong anyway, whatever we do, because 5.005 will + # have already interpreted 0.2.4 to be "0.24". So even if he + # indexer sends us something like "v0.2.4" we compare wrongly. + + # And if they say v1.2, then the old perl takes it as "v12" + + if (defined $CPAN::Frontend) { + $CPAN::Frontend->mywarn("Suspicious version string seen [$n]\n"); + } else { + warn("Suspicious version string seen [$n]\n"); + } + return $n; + } + my $better = sprintf "v%vd", $n; + CPAN->debug("n[$n] better[$better]") if $CPAN::DEBUG; + return $better; +} + +1; + +__END__ + + +# Local Variables: +# mode: cperl +# cperl-indent-level: 4 +# End: +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: + +use 5.006; +use strict; +package CPAN::Distroprefs; + +use vars qw($VERSION); +$VERSION = '6.0001'; + +package CPAN::Distroprefs::Result; + +use File::Spec; + +sub new { bless $_[1] || {} => $_[0] } + +sub abs { File::Spec->catfile($_[0]->dir, $_[0]->file) } + +sub __cloner { + my ($class, $name, $newclass) = @_; + $newclass = 'CPAN::Distroprefs::Result::' . $newclass; + no strict 'refs'; + *{$class . '::' . $name} = sub { + $newclass->new({ + %{ $_[0] }, + %{ $_[1] }, + }); + }; +} +BEGIN { __PACKAGE__->__cloner(as_warning => 'Warning') } +BEGIN { __PACKAGE__->__cloner(as_fatal => 'Fatal') } +BEGIN { __PACKAGE__->__cloner(as_success => 'Success') } + +sub __accessor { + my ($class, $key) = @_; + no strict 'refs'; + *{$class . '::' . $key} = sub { $_[0]->{$key} }; +} +BEGIN { __PACKAGE__->__accessor($_) for qw(type file ext dir) } + +sub is_warning { 0 } +sub is_fatal { 0 } +sub is_success { 0 } + +package CPAN::Distroprefs::Result::Error; +use vars qw(@ISA); +BEGIN { @ISA = 'CPAN::Distroprefs::Result' } ## no critic +BEGIN { __PACKAGE__->__accessor($_) for qw(msg) } + +sub as_string { + my ($self) = @_; + if ($self->msg) { + return sprintf $self->fmt_reason, $self->file, $self->msg; + } else { + return sprintf $self->fmt_unknown, $self->file; + } +} + +package CPAN::Distroprefs::Result::Warning; +use vars qw(@ISA); +BEGIN { @ISA = 'CPAN::Distroprefs::Result::Error' } ## no critic +sub is_warning { 1 } +sub fmt_reason { "Error reading distroprefs file %s, skipping: %s" } +sub fmt_unknown { "Unknown error reading distroprefs file %s, skipping." } + +package CPAN::Distroprefs::Result::Fatal; +use vars qw(@ISA); +BEGIN { @ISA = 'CPAN::Distroprefs::Result::Error' } ## no critic +sub is_fatal { 1 } +sub fmt_reason { "Error reading distroprefs file %s: %s" } +sub fmt_unknown { "Unknown error reading distroprefs file %s." } + +package CPAN::Distroprefs::Result::Success; +use vars qw(@ISA); +BEGIN { @ISA = 'CPAN::Distroprefs::Result' } ## no critic +BEGIN { __PACKAGE__->__accessor($_) for qw(prefs extension) } +sub is_success { 1 } + +package CPAN::Distroprefs::Iterator; + +sub new { bless $_[1] => $_[0] } + +sub next { $_[0]->() } + +package CPAN::Distroprefs; + +use Carp (); +use DirHandle; + +sub _load_method { + my ($self, $loader, $result) = @_; + return '_load_yaml' if $loader eq 'CPAN' or $loader =~ /^YAML(::|$)/; + return '_load_' . $result->ext; +} + +sub _load_yaml { + my ($self, $loader, $result) = @_; + my $data = eval { + $loader eq 'CPAN' + ? $loader->_yaml_loadfile($result->abs) + : [ $loader->can('LoadFile')->($result->abs) ] + }; + if (my $err = $@) { + die $result->as_warning({ + msg => $err, + }); + } elsif (!$data) { + die $result->as_warning; + } else { + return @$data; + } +} + +sub _load_dd { + my ($self, $loader, $result) = @_; + my @data; + { + package CPAN::Eval; + # this caused a die in CPAN.pm, and I am leaving it 'fatal', though I'm + # not sure why we wouldn't just skip the file as we do for all other + # errors. -- hdp + my $abs = $result->abs; + open FH, "<$abs" or die $result->as_fatal(msg => "$!"); + local $/; + my $eval = <FH>; + close FH; + no strict; + eval $eval; + if (my $err = $@) { + die $result->as_warning({ msg => $err }); + } + my $i = 1; + while (${"VAR$i"}) { + push @data, ${"VAR$i"}; + $i++; + } + } + return @data; +} + +sub _load_st { + my ($self, $loader, $result) = @_; + # eval because Storable is never forward compatible + my @data = eval { @{scalar $loader->can('retrieve')->($result->abs) } }; + if (my $err = $@) { + die $result->as_warning({ msg => $err }); + } + return @data; +} + +sub _build_file_list { + if (@_ > 3) { + die "_build_file_list should be called with 3 arguments, was called with more. First argument is '$_[0]'."; + } + my ($dir, $dir1, $ext_re) = @_; + my @list; + my $dh; + unless (opendir($dh, $dir)) { + $CPAN::Frontend->mywarn("ignoring prefs directory '$dir': $!"); + return @list; + } + while (my $fn = readdir $dh) { + next if $fn eq '.' || $fn eq '..'; + if (-d "$dir/$fn") { + next if $fn =~ /^[._]/; # prune .svn, .git, .hg, _darcs and what the user wants to hide + push @list, _build_file_list("$dir/$fn", "$dir1$fn/", $ext_re); + } else { + if ($fn =~ $ext_re) { + push @list, "$dir1$fn"; + } + } + } + return @list; +} + +sub find { + my ($self, $dir, $ext_map) = @_; + + return CPAN::Distroprefs::Iterator->new(sub { return }) unless %$ext_map; + + my $possible_ext = join "|", map { quotemeta } keys %$ext_map; + my $ext_re = qr/\.($possible_ext)$/; + + my @files = _build_file_list($dir, '', $ext_re); + @files = sort @files if @files; + + # label the block so that we can use redo in the middle + return CPAN::Distroprefs::Iterator->new(sub { LOOP: { + + my $fn = shift @files; + return unless defined $fn; + my ($ext) = $fn =~ $ext_re; + + my $loader = $ext_map->{$ext}; + + my $result = CPAN::Distroprefs::Result->new({ + file => $fn, ext => $ext, dir => $dir + }); + # copied from CPAN.pm; is this ever actually possible? + redo unless -f $result->abs; + + my $load_method = $self->_load_method($loader, $result); + my @prefs = eval { $self->$load_method($loader, $result) }; + if (my $err = $@) { + if (ref($err) && eval { $err->isa('CPAN::Distroprefs::Result') }) { + return $err; + } + # rethrow any exceptions that we did not generate + die $err; + } elsif (!@prefs) { + # the loader should have handled this, but just in case: + return $result->as_warning; + } + return $result->as_success({ + prefs => [ + map { CPAN::Distroprefs::Pref->new({ data => $_ }) } @prefs + ], + }); + } }); +} + +package CPAN::Distroprefs::Pref; + +use Carp (); + +sub new { bless $_[1] => $_[0] } + +sub data { shift->{data} } + +sub has_any_match { $_[0]->data->{match} ? 1 : 0 } + +sub has_match { + my $match = $_[0]->data->{match} || return 0; + exists $match->{$_[1]} || exists $match->{"not_$_[1]"} +} + +sub has_valid_subkeys { + grep { exists $_[0]->data->{match}{$_} } + map { $_, "not_$_" } + $_[0]->match_attributes +} + +sub _pattern { + my $re = shift; + my $p = eval sprintf 'qr{%s}', $re; + if ($@) { + $@ =~ s/\n$//; + die "Error in Distroprefs pattern qr{$re}\n$@"; + } + return $p; +} + +sub _match_scalar { + my ($match, $data) = @_; + my $qr = _pattern($match); + return $data =~ /$qr/; +} + +sub _match_hash { + my ($match, $data) = @_; + for my $mkey (keys %$match) { + (my $dkey = $mkey) =~ s/^not_//; + my $val = defined $data->{$dkey} ? $data->{$dkey} : ''; + if (_match_scalar($match->{$mkey}, $val)) { + return 0 if $mkey =~ /^not_/; + } + else { + return 0 if $mkey !~ /^not_/; + } + } + return 1; +} + +sub _match { + my ($self, $key, $data, $matcher) = @_; + my $m = $self->data->{match}; + if (exists $m->{$key}) { + return 0 unless $matcher->($m->{$key}, $data); + } + if (exists $m->{"not_$key"}) { + return 0 if $matcher->($m->{"not_$key"}, $data); + } + return 1; +} + +sub _scalar_match { + my ($self, $key, $data) = @_; + return $self->_match($key, $data, \&_match_scalar); +} + +sub _hash_match { + my ($self, $key, $data) = @_; + return $self->_match($key, $data, \&_match_hash); +} + +# do not take the order of C<keys %$match> because "module" is by far the +# slowest +sub match_attributes { qw(env distribution perl perlconfig module) } + +sub match_module { + my ($self, $modules) = @_; + return $self->_match("module", $modules, sub { + my($match, $data) = @_; + my $qr = _pattern($match); + for my $module (@$data) { + return 1 if $module =~ /$qr/; + } + return 0; + }); +} + +sub match_distribution { shift->_scalar_match(distribution => @_) } +sub match_perl { shift->_scalar_match(perl => @_) } + +sub match_perlconfig { shift->_hash_match(perlconfig => @_) } +sub match_env { shift->_hash_match(env => @_) } + +sub matches { + my ($self, $arg) = @_; + + my $default_match = 0; + for my $key (grep { $self->has_match($_) } $self->match_attributes) { + unless (exists $arg->{$key}) { + Carp::croak "Can't match pref: missing argument key $key"; + } + $default_match = 1; + my $val = $arg->{$key}; + # make it possible to avoid computing things until we have to + if (ref($val) eq 'CODE') { $val = $val->() } + my $meth = "match_$key"; + return 0 unless $self->$meth($val); + } + + return $default_match; +} + +1; + +__END__ + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +use strict; +package CPAN::Queue::Item; + +# CPAN::Queue::Item::new ; +sub new { + my($class,@attr) = @_; + my $self = bless { @attr }, $class; + return $self; +} + +sub as_string { + my($self) = @_; + $self->{qmod}; +} + +# r => requires, b => build_requires, c => commandline +sub reqtype { + my($self) = @_; + $self->{reqtype}; +} + +sub optional { + my($self) = @_; + $self->{optional}; +} + +package CPAN::Queue; + +# One use of the queue is to determine if we should or shouldn't +# announce the availability of a new CPAN module + +# Now we try to use it for dependency tracking. For that to happen +# we need to draw a dependency tree and do the leaves first. This can +# easily be reached by running CPAN.pm recursively, but we don't want +# to waste memory and run into deep recursion. So what we can do is +# this: + +# CPAN::Queue is the package where the queue is maintained. Dependencies +# often have high priority and must be brought to the head of the queue, +# possibly by jumping the queue if they are already there. My first code +# attempt tried to be extremely correct. Whenever a module needed +# immediate treatment, I either unshifted it to the front of the queue, +# or, if it was already in the queue, I spliced and let it bypass the +# others. This became a too correct model that made it impossible to put +# an item more than once into the queue. Why would you need that? Well, +# you need temporary duplicates as the manager of the queue is a loop +# that +# +# (1) looks at the first item in the queue without shifting it off +# +# (2) cares for the item +# +# (3) removes the item from the queue, *even if its agenda failed and +# even if the item isn't the first in the queue anymore* (that way +# protecting against never ending queues) +# +# So if an item has prerequisites, the installation fails now, but we +# want to retry later. That's easy if we have it twice in the queue. +# +# I also expect insane dependency situations where an item gets more +# than two lives in the queue. Simplest example is triggered by 'install +# Foo Foo Foo'. People make this kind of mistakes and I don't want to +# get in the way. I wanted the queue manager to be a dumb servant, not +# one that knows everything. +# +# Who would I tell in this model that the user wants to be asked before +# processing? I can't attach that information to the module object, +# because not modules are installed but distributions. So I'd have to +# tell the distribution object that it should ask the user before +# processing. Where would the question be triggered then? Most probably +# in CPAN::Distribution::rematein. + +use vars qw{ @All $VERSION }; +$VERSION = "5.5002"; + +# CPAN::Queue::queue_item ; +sub queue_item { + my($class,@attr) = @_; + my $item = "$class\::Item"->new(@attr); + $class->qpush($item); + return 1; +} + +# CPAN::Queue::qpush ; +sub qpush { + my($class,$obj) = @_; + push @All, $obj; + CPAN->debug(sprintf("in new All[%s]", + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All), + )) if $CPAN::DEBUG; +} + +# CPAN::Queue::first ; +sub first { + my $obj = $All[0]; + $obj; +} + +# CPAN::Queue::delete_first ; +sub delete_first { + my($class,$what) = @_; + my $i; + for my $i (0..$#All) { + if ( $All[$i]->{qmod} eq $what ) { + splice @All, $i, 1; + last; + } + } + CPAN->debug(sprintf("after delete_first mod[%s] All[%s]", + $what, + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All) + )) if $CPAN::DEBUG; +} + +# CPAN::Queue::jumpqueue ; +sub jumpqueue { + my $class = shift; + my @what = @_; + CPAN->debug(sprintf("before jumpqueue All[%s] what[%s]", + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All), + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @what), + )) if $CPAN::DEBUG; + unless (defined $what[0]{reqtype}) { + # apparently it was not the Shell that sent us this enquiry, + # treat it as commandline + $what[0]{reqtype} = "c"; + } + my $inherit_reqtype = $what[0]{reqtype} =~ /^(c|r)$/ ? "r" : "b"; + WHAT: for my $what_tuple (@what) { + my($qmod,$reqtype,$optional) = @$what_tuple{qw(qmod reqtype optional)}; + if ($reqtype eq "r" + && + $inherit_reqtype eq "b" + ) { + $reqtype = "b"; + } + my $jumped = 0; + for (my $i=0; $i<$#All;$i++) { #prevent deep recursion + if ($All[$i]{qmod} eq $qmod) { + $jumped++; + } + } + # high jumped values are normal for popular modules when + # dealing with large bundles: XML::Simple, + # namespace::autoclean, UNIVERSAL::require + CPAN->debug("qmod[$qmod]jumped[$jumped]") if $CPAN::DEBUG; + my $obj = "$class\::Item"->new( + qmod => $qmod, + reqtype => $reqtype, + optional => !! $optional, + ); + unshift @All, $obj; + } + CPAN->debug(sprintf("after jumpqueue All[%s]", + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All) + )) if $CPAN::DEBUG; +} + +# CPAN::Queue::exists ; +sub exists { + my($self,$what) = @_; + my @all = map { $_->{qmod} } @All; + my $exists = grep { $_->{qmod} eq $what } @All; + # warn "in exists what[$what] all[@all] exists[$exists]"; + $exists; +} + +# CPAN::Queue::delete ; +sub delete { + my($self,$mod) = @_; + @All = grep { $_->{qmod} ne $mod } @All; + CPAN->debug(sprintf("after delete mod[%s] All[%s]", + $mod, + join("",map {sprintf " %s\[%s][%s]\n",$_->{qmod},$_->{reqtype},$_->{optional}} @All) + )) if $CPAN::DEBUG; +} + +# CPAN::Queue::nullify_queue ; +sub nullify_queue { + @All = (); +} + +# CPAN::Queue::size ; +sub size { + return scalar @All; +} + +sub reqtype_of { + my($self,$mod) = @_; + my $best = ""; + for my $item (grep { $_->{qmod} eq $mod } @All) { + my $c = $item->{reqtype}; + if ($c eq "c") { + $best = $c; + last; + } elsif ($c eq "r") { + $best = $c; + } elsif ($c eq "b") { + if ($best eq "") { + $best = $c; + } + } else { + die "Panic: in reqtype_of: reqtype[$c] seen, should never happen"; + } + } + return $best; +} + +1; + +__END__ + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Author; +use strict; + +use CPAN::InfoObj; +@CPAN::Author::ISA = qw(CPAN::InfoObj); +use vars qw( + $VERSION +); +$VERSION = "5.5002"; + +package CPAN::Author; +use strict; + +#-> sub CPAN::Author::force +sub force { + my $self = shift; + $self->{force}++; +} + +#-> sub CPAN::Author::force +sub unforce { + my $self = shift; + delete $self->{force}; +} + +#-> sub CPAN::Author::id +sub id { + my $self = shift; + my $id = $self->{ID}; + $CPAN::Frontend->mydie("Illegal author id[$id]") unless $id =~ /^[A-Z]/; + $id; +} + +#-> sub CPAN::Author::as_glimpse ; +sub as_glimpse { + my($self) = @_; + my(@m); + my $class = ref($self); + $class =~ s/^CPAN:://; + push @m, sprintf(qq{%-15s %s ("%s" <%s>)\n}, + $class, + $self->{ID}, + $self->fullname, + $self->email); + join "", @m; +} + +#-> sub CPAN::Author::fullname ; +sub fullname { + shift->ro->{FULLNAME}; +} +*name = \&fullname; + +#-> sub CPAN::Author::email ; +sub email { shift->ro->{EMAIL}; } + +#-> sub CPAN::Author::ls ; +sub ls { + my $self = shift; + my $glob = shift || ""; + my $silent = shift || 0; + my $id = $self->id; + + # adapted from CPAN::Distribution::verifyCHECKSUM ; + my(@csf); # chksumfile + @csf = $self->id =~ /(.)(.)(.*)/; + $csf[1] = join "", @csf[0,1]; + $csf[2] = join "", @csf[1,2]; # ("A","AN","ANDK") + my(@dl); + @dl = $self->dir_listing([$csf[0],"CHECKSUMS"], 0, 1); + unless (grep {$_->[2] eq $csf[1]} @dl) { + $CPAN::Frontend->myprint("Directory $csf[1]/ does not exist\n") unless $silent ; + return; + } + @dl = $self->dir_listing([@csf[0,1],"CHECKSUMS"], 0, 1); + unless (grep {$_->[2] eq $csf[2]} @dl) { + $CPAN::Frontend->myprint("Directory $id/ does not exist\n") unless $silent; + return; + } + @dl = $self->dir_listing([@csf,"CHECKSUMS"], 1, 1); + if ($glob) { + if ($CPAN::META->has_inst("Text::Glob")) { + $glob =~ s|/$|/*|; + my $rglob = Text::Glob::glob_to_regex($glob); + CPAN->debug("glob[$glob]rglob[$rglob]dl[@dl]") if $CPAN::DEBUG; + my @tmpdl = grep { $_->[2] =~ /$rglob/ } @dl; + if (1==@tmpdl && $tmpdl[0][0]==0) { + $rglob = Text::Glob::glob_to_regex("$glob/*"); + @dl = grep { $_->[2] =~ /$rglob/ } @dl; + } else { + @dl = @tmpdl; + } + CPAN->debug("rglob[$rglob]dl[@dl]") if $CPAN::DEBUG; + } else { + $CPAN::Frontend->mydie("Text::Glob not installed, cannot proceed"); + } + } + unless ($silent >= 2) { + $CPAN::Frontend->myprint + ( + join "", + map { + sprintf + ( + "%8d %10s %s/%s%s\n", + $_->[0], + $_->[1], + $id, + $_->[2], + 0==$_->[0]?"/":"", + ) + } sort { $a->[2] cmp $b->[2] } @dl + ); + } + @dl; +} + +# returns an array of arrays, the latter contain (size,mtime,filename) +#-> sub CPAN::Author::dir_listing ; +sub dir_listing { + my $self = shift; + my $chksumfile = shift; + my $recursive = shift; + my $may_ftp = shift; + + my $lc_want = + File::Spec->catfile($CPAN::Config->{keep_source_where}, + "authors", "id", @$chksumfile); + + my $fh; + + CPAN->debug("chksumfile[@$chksumfile]recursive[$recursive]may_ftp[$may_ftp]") if $CPAN::DEBUG; + # Purge and refetch old (pre-PGP) CHECKSUMS; they are a security + # hazard. (Without GPG installed they are not that much better, + # though.) + $fh = FileHandle->new; + if (open($fh, $lc_want)) { + my $line = <$fh>; close $fh; + unlink($lc_want) unless $line =~ /PGP/; + } + + local($") = "/"; + # connect "force" argument with "index_expire". + my $force = $self->{force}; + if (my @stat = stat $lc_want) { + $force ||= $stat[9] + $CPAN::Config->{index_expire}*86400 <= time; + } + my $lc_file; + if ($may_ftp) { + $lc_file = eval { + CPAN::FTP->localize + ( + "authors/id/@$chksumfile", + $lc_want, + $force, + ); + }; + unless ($lc_file) { + $CPAN::Frontend->myprint("Trying $lc_want.gz\n"); + $chksumfile->[-1] .= ".gz"; + $lc_file = eval { + CPAN::FTP->localize + ("authors/id/@$chksumfile", + "$lc_want.gz", + 1, + ); + }; + if ($lc_file) { + $lc_file =~ s{\.gz(?!\n)\Z}{}; #}; + eval{CPAN::Tarzip->new("$lc_file.gz")->gunzip($lc_file)}; + } else { + return; + } + } + } else { + $lc_file = $lc_want; + # we *could* second-guess and if the user has a file: URL, + # then we could look there. But on the other hand, if they do + # have a file: URL, why did they choose to set + # $CPAN::Config->{show_upload_date} to false? + } + + # adapted from CPAN::Distribution::CHECKSUM_check_file ; + $fh = FileHandle->new; + my($cksum); + if (open $fh, $lc_file) { + local($/); + my $eval = <$fh>; + $eval =~ s/\015?\012/\n/g; + close $fh; + my($compmt) = Safe->new(); + $cksum = $compmt->reval($eval); + if ($@) { + rename $lc_file, "$lc_file.bad"; + Carp::confess($@) if $@; + } + } elsif ($may_ftp) { + Carp::carp ("Could not open '$lc_file' for reading."); + } else { + # Maybe should warn: "You may want to set show_upload_date to a true value" + return; + } + my(@result,$f); + for $f (sort keys %$cksum) { + if (exists $cksum->{$f}{isdir}) { + if ($recursive) { + my(@dir) = @$chksumfile; + pop @dir; + push @dir, $f, "CHECKSUMS"; + push @result, [ 0, "-", $f ]; + push @result, map { + [$_->[0], $_->[1], "$f/$_->[2]"] + } $self->dir_listing(\@dir,1,$may_ftp); + } else { + push @result, [ 0, "-", $f ]; + } + } else { + push @result, [ + ($cksum->{$f}{"size"}||0), + $cksum->{$f}{"mtime"}||"---", + $f + ]; + } + } + @result; +} + +#-> sub CPAN::Author::reports +sub reports { + $CPAN::Frontend->mywarn("reports on authors not implemented. +Please file a bugreport if you need this.\n"); +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: + +package CPAN::Mirrors; +use strict; +use vars qw($VERSION $urllist $silent); +$VERSION = "2.12"; + +use Carp; +use FileHandle; +use Fcntl ":flock"; +use Net::Ping (); + + +sub new { + my ($class, $file) = @_; + croak "CPAN::Mirrors->new requires a filename" unless defined $file; + croak "The file [$file] was not found" unless -e $file; + + my $self = bless { + mirrors => [], + geography => {}, + }, $class; + + $self->parse_mirrored_by( $file ); + + return $self; +} + +sub parse_mirrored_by { + my ($self, $file) = @_; + my $handle = FileHandle->new; + $handle->open($file) + or croak "Couldn't open $file: $!"; + flock $handle, LOCK_SH; + $self->_parse($file,$handle); + flock $handle, LOCK_UN; + $handle->close; +} + + +sub continents { + my ($self) = @_; + return sort keys %{$self->{geography}}; +} + + +sub countries { + my ($self, @continents) = @_; + @continents = $self->continents unless @continents; + my @countries; + for my $c (@continents) { + push @countries, sort keys %{ $self->{geography}{$c} }; + } + return @countries; +} + + +sub mirrors { + my ($self, @countries) = @_; + return @{$self->{mirrors}} unless @countries; + my %wanted = map { $_ => 1 } @countries; + my @found; + for my $m (@{$self->{mirrors}}) { + push @found, $m if exists $wanted{$m->country}; + } + return @found; +} + + +sub get_mirrors_by_countries { &mirrors } + + +sub get_mirrors_by_continents { + my ($self, $continents ) = @_; + $continents = [ $continents ] unless ref $continents; + + eval { + $self->mirrors( $self->get_countries_by_continents( @$continents ) ); + }; + } + + +sub get_countries_by_continents { &countries } + + +sub default_mirror { 'http://www.cpan.org/' } + + +sub best_mirrors { + my ($self, %args) = @_; + my $how_many = $args{how_many} || 1; + my $callback = $args{callback}; + my $verbose = defined $args{verbose} ? $args{verbose} : 0; + my $continents = $args{continents} || []; + $continents = [$continents] unless ref $continents; + + # Old Net::Ping did not do timings at all + my $min_version = '2.13'; + unless( Net::Ping->VERSION gt $min_version ) { + carp sprintf "Net::Ping version is %s (< %s). Returning %s", + Net::Ping->VERSION, $min_version, $self->default_mirror; + return $self->default_mirror; + } + + my $seen = {}; + + if ( ! @$continents ) { + print "Searching for the best continent ...\n" if $verbose; + my @best_continents = $self->find_best_continents( + seen => $seen, + verbose => $verbose, + callback => $callback, + ); + + # Only add enough continents to find enough mirrors + my $count = 0; + for my $continent ( @best_continents ) { + push @$continents, $continent; + $count += $self->mirrors( $self->countries($continent) ); + last if $count >= $how_many; + } + } + + print "Scanning " . join(", ", @$continents) . " ...\n" if $verbose; + + my $trial_mirrors = $self->get_n_random_mirrors_by_continents( 3 * $how_many, $continents->[0] ); + + my $timings = $self->get_mirrors_timings( $trial_mirrors, $seen, $callback ); + return [] unless @$timings; + + $how_many = @$timings if $how_many > @$timings; + + return wantarray ? @{$timings}[0 .. $how_many-1] : $timings->[0]; +} + + +sub get_n_random_mirrors_by_continents { + my( $self, $n, $continents ) = @_; + $n ||= 3; + $continents = [ $continents ] unless ref $continents; + + if ( $n <= 0 ) { + return wantarray ? () : []; + } + + my @long_list = $self->get_mirrors_by_continents( $continents ); + + if ( $n eq '*' or $n > @long_list ) { + return wantarray ? @long_list : \@long_list; + } + + @long_list = map {$_->[0]} + sort {$a->[1] <=> $b->[1]} + map {[$_, rand]} @long_list; + + splice @long_list, $n; # truncate + + \@long_list; +} + + +sub get_mirrors_timings { + my( $self, $mirror_list, $seen, $callback ) = @_; + + $seen = {} unless defined $seen; + croak "The mirror list argument must be an array reference" + unless ref $mirror_list eq ref []; + croak "The seen argument must be a hash reference" + unless ref $seen eq ref {}; + croak "callback must be a subroutine" + if( defined $callback and ref $callback ne ref sub {} ); + + my $timings = []; + for my $m ( @$mirror_list ) { + $seen->{$m->hostname} = $m; + next unless eval{ $m->http }; + + if( $self->_try_a_ping( $seen, $m, ) ) { + my $ping = $m->ping; + next unless defined $ping; + push @$timings, $m; + $callback->( $m ) if $callback; + } + else { + push @$timings, $seen->{$m->hostname} + if defined $seen->{$m->hostname}->rtt; + } + } + + my @best = sort { + if( defined $a->rtt and defined $b->rtt ) { + $a->rtt <=> $b->rtt + } + elsif( defined $a->rtt and ! defined $b->rtt ) { + return -1; + } + elsif( ! defined $a->rtt and defined $b->rtt ) { + return 1; + } + elsif( ! defined $a->rtt and ! defined $b->rtt ) { + return 0; + } + + } @$timings; + + return wantarray ? @best : \@best; +} + + +sub find_best_continents { + my ($self, %args) = @_; + + $args{n} ||= 3; + $args{verbose} = 0 unless defined $args{verbose}; + $args{seen} = {} unless defined $args{seen}; + croak "The seen argument must be a hash reference" + unless ref $args{seen} eq ref {}; + $args{ping_cache_limit} = 24 * 60 * 60 + unless defined $args{ping_cache_time}; + croak "callback must be a subroutine" + if( defined $args{callback} and ref $args{callback} ne ref sub {} ); + + my %medians; + CONT: for my $c ( $self->continents ) { + print "Testing $c\n" if $args{verbose}; + my @mirrors = $self->mirrors( $self->countries($c) ); + + next CONT unless @mirrors; + my $n = (@mirrors < $args{n}) ? @mirrors : $args{n}; + + my @tests; + my $tries = 0; + RANDOM: while ( @mirrors && @tests < $n && $tries++ < 15 ) { + my $m = splice( @mirrors, int(rand(@mirrors)), 1 ); + if( $self->_try_a_ping( $args{seen}, $m, $args{ping_cache_limit} ) ) { + $self->get_mirrors_timings( [ $m ], @args{qw(seen callback)} ); + next RANDOM unless defined $args{seen}{$m->hostname}->rtt; + } + printf "\t%s -> %0.2f ms\n", + $m->hostname, + join ' ', 1000 * $args{seen}{$m->hostname}->rtt + if $args{verbose}; + + push @tests, $args{seen}{$m->hostname}->rtt; + } + + my $median = $self->_get_median_ping_time( \@tests, $args{verbose} ); + $medians{$c} = $median if defined $median; + } + + my @best_cont = sort { $medians{$a} <=> $medians{$b} } keys %medians; + + if ( $args{verbose} ) { + print "Median result by continent:\n"; + for my $c ( @best_cont ) { + printf( " %4d ms %s\n", int($medians{$c}*1000+.5), $c ); + } + } + + return wantarray ? @best_cont : $best_cont[0]; +} + +# retry if +sub _try_a_ping { + my ($self, $seen, $mirror, $ping_cache_limit ) = @_; + + ( ! exists $seen->{$mirror->hostname} ) + or + ( + ! defined $seen->{$mirror->hostname}->rtt + or + time - $seen->{$mirror->hostname}->rtt > $ping_cache_limit + ) +} + +sub _get_median_ping_time { + my ($self, $tests, $verbose ) = @_; + + my @sorted = sort { $a <=> $b } @$tests; + + my $median = do { + if ( @sorted == 0 ) { undef } + elsif ( @sorted == 1 ) { $sorted[0] } + elsif ( @sorted % 2 ) { $sorted[ int(@sorted / 2) ] } + else { + my $mid_high = int(@sorted/2); + ($sorted[$mid_high-1] + $sorted[$mid_high])/2; + } + }; + + printf "\t-->median time: %0.2f ms\n", $median * 1000 if $verbose; + + return $median; +} + +# Adapted from Parse::CPAN::MirroredBy by Adam Kennedy +sub _parse { + my ($self, $file, $handle) = @_; + my $output = $self->{mirrors}; + my $geo = $self->{geography}; + + local $/ = "\012"; + my $line = 0; + my $mirror = undef; + while ( 1 ) { + # Next line + my $string = <$handle>; + last if ! defined $string; + $line = $line + 1; + + # Remove the useless lines + chomp( $string ); + next if $string =~ /^\s*$/; + next if $string =~ /^\s*#/; + + # Hostname or property? + if ( $string =~ /^\s/ ) { + # Property + unless ( $string =~ /^\s+(\w+)\s+=\s+\"(.*)\"$/ ) { + croak("Invalid property on line $line"); + } + my ($prop, $value) = ($1,$2); + $mirror ||= {}; + if ( $prop eq 'dst_location' ) { + my (@location,$continent,$country); + @location = (split /\s*,\s*/, $value) + and ($continent, $country) = @location[-1,-2]; + $continent =~ s/\s\(.*//; + $continent =~ s/\W+$//; # if Jarkko doesn't know latitude/longitude + $geo->{$continent}{$country} = 1 if $continent && $country; + $mirror->{continent} = $continent || "unknown"; + $mirror->{country} = $country || "unknown"; + } + elsif ( $prop eq 'dst_http' ) { + $mirror->{http} = $value; + } + elsif ( $prop eq 'dst_ftp' ) { + $mirror->{ftp} = $value; + } + elsif ( $prop eq 'dst_rsync' ) { + $mirror->{rsync} = $value; + } + else { + $prop =~ s/^dst_//; + $mirror->{$prop} = $value; + } + } else { + # Hostname + unless ( $string =~ /^([\w\.-]+)\:\s*$/ ) { + croak("Invalid host name on line $line"); + } + my $current = $mirror; + $mirror = { hostname => "$1" }; + if ( $current ) { + push @$output, CPAN::Mirrored::By->new($current); + } + } + } + if ( $mirror ) { + push @$output, CPAN::Mirrored::By->new($mirror); + } + + return; +} + +#--------------------------------------------------------------------------# + +package CPAN::Mirrored::By; +use strict; +use Net::Ping (); + +sub new { + my($self,$arg) = @_; + $arg ||= {}; + bless $arg, $self; +} +sub hostname { shift->{hostname} } +sub continent { shift->{continent} } +sub country { shift->{country} } +sub http { shift->{http} || '' } +sub ftp { shift->{ftp} || '' } +sub rsync { shift->{rsync} || '' } +sub rtt { shift->{rtt} } +sub ping_time { shift->{ping_time} } + +sub url { + my $self = shift; + return $self->{http} || $self->{ftp}; +} + +sub ping { + my $self = shift; + + my $ping = Net::Ping->new($^O eq 'VMS' ? 'icmp' : 'tcp', 1); + my ($proto) = $self->url =~ m{^([^:]+)}; + my $port = $proto eq 'http' ? 80 : 21; + return unless $port; + + if ( $ping->can('port_number') ) { + $ping->port_number($port); + } + else { + $ping->{'port_num'} = $port; + } + + $ping->hires(1) if $ping->can('hires'); + my ($alive,$rtt) = $ping->ping($self->hostname); + + $self->{rtt} = $alive ? $rtt : undef; + $self->{ping_time} = time; + + $self->rtt; +} + + +1; + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::FirstTime; +use strict; + +use ExtUtils::MakeMaker (); +use FileHandle (); +use File::Basename (); +use File::Path (); +use File::Spec (); +use CPAN::Mirrors (); +use vars qw($VERSION $auto_config); +$VERSION = "5.5311"; + + +# down until the next =back the manpage must be parsed by the program +# because the text is used in the init dialogues. + +my @podpara = split /\n\n/, <<'=back'; + + +use vars qw( %prompts ); + +{ + + my @prompts = ( + +auto_config => qq{ +CPAN.pm requires configuration, but most of it can be done automatically. +If you answer 'no' below, you will enter an interactive dialog for each +configuration option instead. + +Would you like to configure as much as possible automatically?}, + +auto_pick => qq{ +Would you like me to automatically choose some CPAN mirror +sites for you? (This means connecting to the Internet)}, + +config_intro => qq{ + +The following questions are intended to help you with the +configuration. The CPAN module needs a directory of its own to cache +important index files and maybe keep a temporary mirror of CPAN files. +This may be a site-wide or a personal directory. + +}, + +# cpan_home => qq{ }, + +cpan_home_where => qq{ + +First of all, I'd like to create this directory. Where? + +}, + +external_progs => qq{ + +The CPAN module will need a few external programs to work properly. +Please correct me, if I guess the wrong path for a program. Don't +panic if you do not have some of them, just press ENTER for those. To +disable the use of a program, you can type a space followed by ENTER. + +}, + +proxy_intro => qq{ + +If you're accessing the net via proxies, you can specify them in the +CPAN configuration or via environment variables. The variable in +the \$CPAN::Config takes precedence. + +}, + +proxy_user => qq{ + +If your proxy is an authenticating proxy, you can store your username +permanently. If you do not want that, just press ENTER. You will then +be asked for your username in every future session. + +}, + +proxy_pass => qq{ + +Your password for the authenticating proxy can also be stored +permanently on disk. If this violates your security policy, just press +ENTER. You will then be asked for the password in every future +session. + +}, + +urls_intro => qq{ +Now you need to choose your CPAN mirror sites. You can let me +pick mirrors for you, you can select them from a list or you +can enter them by hand. +}, + +urls_picker_intro => qq{First, pick a nearby continent and country by typing in the number(s) +in front of the item(s) you want to select. You can pick several of +each, separated by spaces. Then, you will be presented with a list of +URLs of CPAN mirrors in the countries you selected, along with +previously selected URLs. Select some of those URLs, or just keep the +old list. Finally, you will be prompted for any extra URLs -- file:, +ftp:, or http: -- that host a CPAN mirror. + +You should select more than one (just in case the first isn't available). + +}, + +password_warn => qq{ + +Warning: Term::ReadKey seems not to be available, your password will +be echoed to the terminal! + +}, + +install_help => qq{ +Warning: You do not have write permission for Perl library directories. + +To install modules, you need to configure a local Perl library directory or +escalate your privileges. CPAN can help you by bootstrapping the local::lib +module or by configuring itself to use 'sudo' (if available). You may also +resolve this problem manually if you need to customize your setup. + +What approach do you want? (Choose 'local::lib', 'sudo' or 'manual') +}, + +local_lib_installed => qq{ +local::lib is installed. You must now add the following environment variables +to your shell configuration files (or registry, if you are on Windows) and +then restart your command line shell and CPAN before installing modules: + +}, + + ); + + die "Coding error in \@prompts declaration. Odd number of elements, above" + if (@prompts % 2); + + %prompts = @prompts; + + if (scalar(keys %prompts) != scalar(@prompts)/2) { + my %already; + for my $item (0..$#prompts) { + next if $item % 2; + die "$prompts[$item] is duplicated\n" if $already{$prompts[$item]}++; + } + } + + shift @podpara; + while (@podpara) { + warn "Alert: cannot parse my own manpage for init dialog" unless $podpara[0] =~ s/^=item\s+//; + my $name = shift @podpara; + my @para; + while (@podpara && $podpara[0] !~ /^=item/) { + push @para, shift @podpara; + } + $prompts{$name} = pop @para; + if (@para) { + $prompts{$name . "_intro"} = join "", map { "$_\n\n" } @para; + } + } + +} + +sub init { + my($configpm, %args) = @_; + use Config; + # extra args after 'o conf init' + my $matcher = $args{args} && @{$args{args}} ? $args{args}[0] : ''; + if ($matcher =~ /^\/(.*)\/$/) { + # case /regex/ => take the first, ignore the rest + $matcher = $1; + shift @{$args{args}}; + if (@{$args{args}}) { + local $" = " "; + $CPAN::Frontend->mywarn("Ignoring excessive arguments '@{$args{args}}'"); + $CPAN::Frontend->mysleep(2); + } + } elsif (0 == length $matcher) { + } elsif (0 && $matcher eq "~") { # extremely buggy, but a nice idea + my @unconfigured = sort grep { not exists $CPAN::Config->{$_} + or not defined $CPAN::Config->{$_} + or not length $CPAN::Config->{$_} + } keys %$CPAN::Config; + $matcher = "\\b(".join("|", @unconfigured).")\\b"; + $CPAN::Frontend->mywarn("matcher[$matcher]"); + } else { + # case WORD... => all arguments must be valid + for my $arg (@{$args{args}}) { + unless (exists $CPAN::HandleConfig::keys{$arg}) { + $CPAN::Frontend->mywarn("'$arg' is not a valid configuration variable\n"); + return; + } + } + $matcher = "\\b(".join("|",@{$args{args}}).")\\b"; + } + CPAN->debug("matcher[$matcher]") if $CPAN::DEBUG; + + unless ($CPAN::VERSION) { + require CPAN::Nox; + } + require CPAN::HandleConfig; + CPAN::HandleConfig::require_myconfig_or_config(); + $CPAN::Config ||= {}; + local($/) = "\n"; + local($\) = ""; + local($|) = 1; + + my($ans,$default); # why so half global? + + # + #= Files, directories + # + + local *_real_prompt; + if ( $args{autoconfig} ) { + $auto_config = 1; + } elsif ($matcher) { + $auto_config = 0; + } else { + my $_conf = prompt($prompts{auto_config}, "yes"); + $auto_config = ($_conf and $_conf =~ /^y/i) ? 1 : 0; + } + CPAN->debug("auto_config[$auto_config]") if $CPAN::DEBUG; + if ( $auto_config ) { + local $^W = 0; + # prototype should match that of &MakeMaker::prompt + my $current_second = time; + my $current_second_count = 0; + my $i_am_mad = 0; + # silent prompting -- just quietly use default + *_real_prompt = sub { return $_[1] }; + } + + # + # bootstrap local::lib or sudo + # + unless ( $matcher + || _can_write_to_libdirs() || _using_installbase() || _using_sudo() + ) { + local $auto_config = 0; # We *must* ask, even under autoconfig + local *_real_prompt; # We *must* show prompt + my_prompt_loop(install_help => 'local::lib', $matcher, + 'local::lib|sudo|manual'); + } + $CPAN::Config->{install_help} ||= ''; # Temporary to suppress warnings + + if (!$matcher or q{ + build_dir + build_dir_reuse + cpan_home + keep_source_where + prefs_dir + } =~ /$matcher/) { + $CPAN::Frontend->myprint($prompts{config_intro}) unless $auto_config; + + init_cpan_home($matcher); + + my_dflt_prompt("keep_source_where", + File::Spec->catdir($CPAN::Config->{cpan_home},"sources"), + $matcher, + ); + my_dflt_prompt("build_dir", + File::Spec->catdir($CPAN::Config->{cpan_home},"build"), + $matcher + ); + my_yn_prompt(build_dir_reuse => 0, $matcher); + my_dflt_prompt("prefs_dir", + File::Spec->catdir($CPAN::Config->{cpan_home},"prefs"), + $matcher + ); + } + + # + #= Config: auto_commit + # + + my_yn_prompt(auto_commit => 0, $matcher); + + # + #= Cache size, Index expire + # + my_dflt_prompt(build_cache => 100, $matcher); + + my_dflt_prompt(index_expire => 1, $matcher); + my_prompt_loop(scan_cache => 'atstart', $matcher, 'atstart|atexit|never'); + my_yn_prompt(cleanup_after_install => 0, $matcher); + + # + #= cache_metadata + # + + my_yn_prompt(cache_metadata => 1, $matcher); + my_yn_prompt(use_sqlite => 0, $matcher); + + # + #= Do we follow PREREQ_PM? + # + + my_prompt_loop(prerequisites_policy => 'follow', $matcher, + 'follow|ask|ignore'); + my_prompt_loop(build_requires_install_policy => 'yes', $matcher, + 'yes|no|ask/yes|ask/no'); + my_yn_prompt(recommends_policy => 1, $matcher); + my_yn_prompt(suggests_policy => 0, $matcher); + + # + #= Module::Signature + # + my_yn_prompt(check_sigs => 0, $matcher); + + # + #= CPAN::Reporter + # + if (!$matcher or 'test_report' =~ /$matcher/) { + my_yn_prompt(test_report => 0, $matcher); + if ( + $matcher && + $CPAN::Config->{test_report} && + $CPAN::META->has_inst("CPAN::Reporter") && + CPAN::Reporter->can('configure') + ) { + my $_conf = prompt("Would you like me configure CPAN::Reporter now?", "yes"); + if ($_conf =~ /^y/i) { + $CPAN::Frontend->myprint("\nProceeding to configure CPAN::Reporter.\n"); + CPAN::Reporter::configure(); + $CPAN::Frontend->myprint("\nReturning to CPAN configuration.\n"); + } + } + } + + my_yn_prompt(trust_test_report_history => 0, $matcher); + + # + #= YAML vs. YAML::Syck + # + if (!$matcher or "yaml_module" =~ /$matcher/) { + my_dflt_prompt(yaml_module => "YAML", $matcher); + my $old_v = $CPAN::Config->{load_module_verbosity}; + $CPAN::Config->{load_module_verbosity} = q[none]; + if (!$auto_config && !$CPAN::META->has_inst($CPAN::Config->{yaml_module})) { + $CPAN::Frontend->mywarn + ("Warning (maybe harmless): '$CPAN::Config->{yaml_module}' not installed.\n"); + $CPAN::Frontend->mysleep(3); + } + $CPAN::Config->{load_module_verbosity} = $old_v; + } + + # + #= YAML code deserialisation + # + my_yn_prompt(yaml_load_code => 0, $matcher); + + # + #= External programs + # + my(@path) = split /$Config{'path_sep'}/, $ENV{'PATH'}; + $CPAN::Frontend->myprint($prompts{external_progs}) + if !$matcher && !$auto_config; + _init_external_progs($matcher, { + path => \@path, + progs => [ qw/make bzip2 gzip tar unzip gpg patch applypatch/ ], + shortcut => 0 + }); + _init_external_progs($matcher, { + path => \@path, + progs => [ qw/wget curl lynx ncftpget ncftp ftp/ ], + shortcut => 1 + }); + + { + my $path = $CPAN::Config->{'pager'} || + $ENV{PAGER} || find_exe("less",\@path) || + find_exe("more",\@path) || ($^O eq 'MacOS' ? $ENV{EDITOR} : 0 ) + || "more"; + my_dflt_prompt(pager => $path, $matcher); + } + + { + my $path = $CPAN::Config->{'shell'}; + if ($path && File::Spec->file_name_is_absolute($path)) { + $CPAN::Frontend->mywarn("Warning: configured $path does not exist\n") + unless -e $path; + $path = ""; + } + $path ||= $ENV{SHELL}; + $path ||= $ENV{COMSPEC} if $^O eq "MSWin32"; + if ($^O eq 'MacOS') { + $CPAN::Config->{'shell'} = 'not_here'; + } else { + $path ||= 'sh', $path =~ s,\\,/,g if $^O eq 'os2'; # Cosmetic only + my_dflt_prompt(shell => $path, $matcher); + } + } + + { + my $tar = $CPAN::Config->{tar}; + my $prefer_external_tar = $CPAN::Config->{prefer_external_tar}; # XXX not yet supported + unless (defined $prefer_external_tar) { + if ($^O =~ /(MSWin32|solaris)/) { + # both have a record of broken tars + $prefer_external_tar = 0; + } elsif ($tar) { + $prefer_external_tar = 1; + } else { + $prefer_external_tar = 0; + } + } + my_yn_prompt(prefer_external_tar => $prefer_external_tar, $matcher); + } + + # + # verbosity + # + + my_prompt_loop(tar_verbosity => 'none', $matcher, + 'none|v|vv'); + my_prompt_loop(load_module_verbosity => 'none', $matcher, + 'none|v'); + my_prompt_loop(perl5lib_verbosity => 'none', $matcher, + 'none|v'); + my_yn_prompt(inhibit_startup_message => 0, $matcher); + + # + #= Installer, arguments to make etc. + # + + my_prompt_loop(prefer_installer => 'MB', $matcher, 'MB|EUMM|RAND'); + + if (!$matcher or 'makepl_arg make_arg' =~ /$matcher/) { + my_dflt_prompt(makepl_arg => "", $matcher); + my_dflt_prompt(make_arg => "", $matcher); + if ( $CPAN::Config->{makepl_arg} =~ /LIBS=|INC=/ ) { + $CPAN::Frontend->mywarn( + "Warning: Using LIBS or INC in makepl_arg will likely break distributions\n" . + "that specify their own LIBS or INC options in Makefile.PL.\n" + ); + } + + } + + require CPAN::HandleConfig; + if (exists $CPAN::HandleConfig::keys{make_install_make_command}) { + # as long as Windows needs $self->_build_command, we cannot + # support sudo on windows :-) + my $default = $CPAN::Config->{make} || ""; + if ( $default && $CPAN::Config->{install_help} eq 'sudo' ) { + if ( find_exe('sudo') ) { + $default = "sudo $default"; + delete $CPAN::Config->{make_install_make_command} + unless $CPAN::Config->{make_install_make_command} =~ /sudo/; + } + else { + $CPAN::Frontend->mywarnonce("Could not find 'sudo' in PATH\n"); + } + } + my_dflt_prompt(make_install_make_command => $default, $matcher); + } + + my_dflt_prompt(make_install_arg => $CPAN::Config->{make_arg} || "", + $matcher); + + my_dflt_prompt(mbuildpl_arg => "", $matcher); + my_dflt_prompt(mbuild_arg => "", $matcher); + + if (exists $CPAN::HandleConfig::keys{mbuild_install_build_command} + and $^O ne "MSWin32") { + # as long as Windows needs $self->_build_command, we cannot + # support sudo on windows :-) + my $default = $^O eq 'VMS' ? '@Build.com' : "./Build"; + if ( $CPAN::Config->{install_help} eq 'sudo' ) { + if ( find_exe('sudo') ) { + $default = "sudo $default"; + delete $CPAN::Config->{mbuild_install_build_command} + unless $CPAN::Config->{mbuild_install_build_command} =~ /sudo/; + } + else { + $CPAN::Frontend->mywarnonce("Could not find 'sudo' in PATH\n"); + } + } + my_dflt_prompt(mbuild_install_build_command => $default, $matcher); + } + + my_dflt_prompt(mbuild_install_arg => "", $matcher); + + # + #== use_prompt_default + # + my_yn_prompt(use_prompt_default => 0, $matcher); + + # + #= Alarm period + # + + my_dflt_prompt(inactivity_timeout => 0, $matcher); + my_dflt_prompt(version_timeout => 15, $matcher); + + # + #== halt_on_failure + # + my_yn_prompt(halt_on_failure => 0, $matcher); + + # + #= Proxies + # + + my @proxy_vars = qw/ftp_proxy http_proxy no_proxy/; + my @proxy_user_vars = qw/proxy_user proxy_pass/; + if (!$matcher or "@proxy_vars @proxy_user_vars" =~ /$matcher/) { + $CPAN::Frontend->myprint($prompts{proxy_intro}) unless $auto_config; + + for (@proxy_vars) { + $prompts{$_} = "Your $_?"; + my_dflt_prompt($_ => $ENV{$_}||"", $matcher); + } + + if ($CPAN::Config->{ftp_proxy} || + $CPAN::Config->{http_proxy}) { + + $default = $CPAN::Config->{proxy_user} || $CPAN::LWP::UserAgent::USER || ""; + + $CPAN::Frontend->myprint($prompts{proxy_user}) unless $auto_config; + + if ($CPAN::Config->{proxy_user} = prompt("Your proxy user id?",$default)) { + $CPAN::Frontend->myprint($prompts{proxy_pass}) unless $auto_config; + + if ($CPAN::META->has_inst("Term::ReadKey")) { + Term::ReadKey::ReadMode("noecho"); + } else { + $CPAN::Frontend->myprint($prompts{password_warn}) unless $auto_config; + } + $CPAN::Config->{proxy_pass} = prompt_no_strip("Your proxy password?"); + if ($CPAN::META->has_inst("Term::ReadKey")) { + Term::ReadKey::ReadMode("restore"); + } + $CPAN::Frontend->myprint("\n\n") unless $auto_config; + } + } + } + + # + #= how plugins work + # + + # XXX MISSING: my_array_prompt to be used with plugins. We did something like this near + # git log -p fd68f8f5e33f4cecea4fdb7abc5ee19c12f138f0..test-notest-test-dependency + # Need to do similar steps for plugin_list. As long as we do not support it here, people + # must use the cpan shell prompt to write something like + # o conf plugin_list push CPAN::Plugin::Specfile=dir,/tmp/foo-20141013,... + # o conf commit + + # + #= how FTP works + # + + my_yn_prompt(ftp_passive => 1, $matcher); + + # + #= how cwd works + # + + my_prompt_loop(getcwd => 'cwd', $matcher, + 'cwd|getcwd|fastcwd|getdcwd|backtickcwd'); + + # + #= the CPAN shell itself (prompt, color) + # + + my_yn_prompt(commandnumber_in_prompt => 1, $matcher); + my_yn_prompt(term_ornaments => 1, $matcher); + if ("colorize_output colorize_print colorize_warn colorize_debug" =~ $matcher) { + my_yn_prompt(colorize_output => 0, $matcher); + if ($CPAN::Config->{colorize_output}) { + if ($CPAN::META->has_inst("Term::ANSIColor")) { + my $T="gYw"; + $CPAN::Frontend->myprint( " on_ on_y ". + " on_ma on_\n") unless $auto_config; + $CPAN::Frontend->myprint( " on_black on_red green ellow ". + "on_blue genta on_cyan white\n") unless $auto_config; + + for my $FG ("", "bold", + map {$_,"bold $_"} "black","red","green", + "yellow","blue", + "magenta", + "cyan","white") { + $CPAN::Frontend->myprint(sprintf( "%12s ", $FG)) unless $auto_config; + for my $BG ("",map {"on_$_"} qw(black red green yellow + blue magenta cyan white)) { + $CPAN::Frontend->myprint( $FG||$BG ? + Term::ANSIColor::colored(" $T ","$FG $BG") : " $T ") unless $auto_config; + } + $CPAN::Frontend->myprint( "\n" ) unless $auto_config; + } + $CPAN::Frontend->myprint( "\n" ) unless $auto_config; + } + for my $tuple ( + ["colorize_print", "bold blue on_white"], + ["colorize_warn", "bold red on_white"], + ["colorize_debug", "black on_cyan"], + ) { + my_dflt_prompt($tuple->[0] => $tuple->[1], $matcher); + if ($CPAN::META->has_inst("Term::ANSIColor")) { + eval { Term::ANSIColor::color($CPAN::Config->{$tuple->[0]})}; + if ($@) { + $CPAN::Config->{$tuple->[0]} = $tuple->[1]; + $CPAN::Frontend->mywarn($@."setting to default '$tuple->[1]'\n"); + } + } + } + } + } + + # + #== term_is_latin + # + + my_yn_prompt(term_is_latin => 1, $matcher); + + # + #== save history in file 'histfile' + # + + if (!$matcher or 'histfile histsize' =~ /$matcher/) { + $CPAN::Frontend->myprint($prompts{histfile_intro}) unless $auto_config; + defined($default = $CPAN::Config->{histfile}) or + $default = File::Spec->catfile($CPAN::Config->{cpan_home},"histfile"); + my_dflt_prompt(histfile => $default, $matcher); + + if ($CPAN::Config->{histfile}) { + defined($default = $CPAN::Config->{histsize}) or $default = 100; + my_dflt_prompt(histsize => $default, $matcher); + } + } + + # + #== do an ls on the m or the d command + # + my_yn_prompt(show_upload_date => 0, $matcher); + + # + #== verbosity at the end of the r command + # + if (!$matcher + or 'show_unparsable_versions' =~ /$matcher/ + or 'show_zero_versions' =~ /$matcher/ + ) { + my_yn_prompt(show_unparsable_versions => 0, $matcher); + my_yn_prompt(show_zero_versions => 0, $matcher); + } + + # + #= MIRRORED.BY and conf_sites() + # + + # Let's assume they want to use the internet and make them turn it + # off if they really don't. + my_yn_prompt("connect_to_internet_ok" => 1, $matcher); + + # Allow matching but don't show during manual config + if ($matcher) { + if ("randomize_urllist" =~ $matcher) { + my_dflt_prompt(randomize_urllist => 0, $matcher); + } + if ("ftpstats_size" =~ $matcher) { + my_dflt_prompt(ftpstats_size => 99, $matcher); + } + if ("ftpstats_period" =~ $matcher) { + my_dflt_prompt(ftpstats_period => 14, $matcher); + } + } + + $CPAN::Config->{urllist} ||= []; + + if ($auto_config) { + if(@{ $CPAN::Config->{urllist} }) { + $CPAN::Frontend->myprint( + "Your 'urllist' is already configured. Type 'o conf init urllist' to change it.\n" + ); + } + else { + $CPAN::Config->{urllist} = [ 'http://www.cpan.org/' ]; + } + } + elsif (!$matcher || "urllist" =~ $matcher) { + _do_pick_mirrors(); + } + + if ($auto_config) { + $CPAN::Frontend->myprint( + "\nAutoconfiguration complete.\n" + ); + $auto_config = 0; # reset + } + + # bootstrap local::lib now if requested + if ( $CPAN::Config->{install_help} eq 'local::lib' ) { + if ( ! @{ $CPAN::Config->{urllist} } ) { + $CPAN::Frontend->myprint( + "Skipping local::lib bootstrap because 'urllist' is not configured.\n" + ); + } + else { + $CPAN::Frontend->myprint("\nAttempting to bootstrap local::lib...\n"); + $CPAN::Frontend->myprint("\nWriting $configpm for bootstrap...\n"); + delete $CPAN::Config->{install_help}; # temporary only + CPAN::HandleConfig->commit; + my($dist, $locallib); + $locallib = CPAN::Shell->expand('Module', 'local::lib'); + if ( $locallib and $dist = $locallib->distribution ) { + # this is a hack to force bootstrapping + $dist->{prefs}{pl}{commandline} = "$^X Makefile.PL --bootstrap"; + # Set @INC for this process so we find things as they bootstrap + require lib; + lib->import(_local_lib_inc_path()); + eval { $dist->install }; + } + if ( ! $dist || (my $err = $@) ) { + $err ||= 'Could not locate local::lib in the CPAN index'; + $CPAN::Frontend->mywarn("Error bootstrapping local::lib: $@\n"); + $CPAN::Frontend->myprint("From the CPAN Shell, you might try 'look local::lib' and \n" + . "run 'perl Makefile --bootstrap' and see if that is successful. Then\n" + . "restart your CPAN client\n" + ); + } + else { + _local_lib_config(); + } + } + } + + # install_help is temporary for configuration and not saved + delete $CPAN::Config->{install_help}; + + $CPAN::Frontend->myprint("\n"); + if ($matcher && !$CPAN::Config->{auto_commit}) { + $CPAN::Frontend->myprint("Please remember to call 'o conf commit' to ". + "make the config permanent!\n"); + } else { + CPAN::HandleConfig->commit; + } + + if (! $matcher) { + $CPAN::Frontend->myprint( + "\nYou can re-run configuration any time with 'o conf init' in the CPAN shell\n" + ); + } + +} + +sub _local_lib_config { + # Set environment stuff for this process + require local::lib; + + # Tell user about environment vars to set + $CPAN::Frontend->myprint($prompts{local_lib_installed}); + local $ENV{SHELL} = $CPAN::Config->{shell} || $ENV{SHELL}; + my $shellvars = local::lib->environment_vars_string_for(_local_lib_path()); + $CPAN::Frontend->myprint($shellvars); + + # Set %ENV after getting string above + my %env = local::lib->build_environment_vars_for(_local_lib_path(), 1); + while ( my ($k, $v) = each %env ) { + $ENV{$k} = $v; + } + + # Offer to mangle the shell config + my $munged_rc; + if ( my $rc = _find_shell_config() ) { + local $auto_config = 0; # We *must* ask, even under autoconfig + local *_real_prompt; # We *must* show prompt + my $_conf = prompt( + "\nWould you like me to append that to $rc now?", "yes" + ); + if ($_conf =~ /^y/i) { + open my $fh, ">>", $rc; + print {$fh} "\n$shellvars"; + close $fh; + $munged_rc++; + } + } + + # Warn at exit time + if ($munged_rc) { + push @{$CPAN::META->_exit_messages}, << "HERE"; + +*** Remember to restart your shell before running cpan again *** +HERE + } + else { + push @{$CPAN::META->_exit_messages}, << "HERE"; + +*** Remember to add these environment variables to your shell config + and restart your shell before running cpan again *** + +$shellvars +HERE + } +} + +{ + my %shell_rc_map = ( + map { $_ => ".${_}rc" } qw/ bash tcsh csh /, + map { $_ => ".profile" } qw/dash ash sh/, + zsh => ".zshenv", + ); + + sub _find_shell_config { + my $shell = File::Basename::basename($CPAN::Config->{shell}); + if ( my $rc = $shell_rc_map{$shell} ) { + my $path = File::Spec->catfile($ENV{HOME}, $rc); + return $path if -w $path; + } + } +} + + +sub _local_lib_inc_path { + return File::Spec->catdir(_local_lib_path(), qw/lib perl5/); +} + +sub _local_lib_path { + return File::Spec->catdir(_local_lib_home(), 'perl5'); +} + +# Adapted from resolve_home_path() in local::lib -- this is where +# local::lib thinks the user's home is +{ + my $local_lib_home; + sub _local_lib_home { + $local_lib_home ||= File::Spec->rel2abs( do { + if ($CPAN::META->has_usable("File::HomeDir") && File::HomeDir->VERSION >= 0.65) { + File::HomeDir->my_home; + } elsif (defined $ENV{HOME}) { + $ENV{HOME}; + } else { + (getpwuid $<)[7] || "~"; + } + }); + } +} + +sub _do_pick_mirrors { + local *_real_prompt; + *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt; + $CPAN::Frontend->myprint($prompts{urls_intro}); + # Only prompt for auto-pick if Net::Ping is new enough to do timings + my $_conf = 'n'; + if ( $CPAN::META->has_usable("Net::Ping") && Net::Ping->VERSION gt '2.13') { + $_conf = prompt($prompts{auto_pick}, "yes"); + } else { + prompt("Autoselection disabled due to Net::Ping missing or insufficient. Please press ENTER"); + } + my @old_list = @{ $CPAN::Config->{urllist} }; + if ( $_conf =~ /^y/i ) { + conf_sites( auto_pick => 1 ) or bring_your_own(); + } + else { + _print_urllist('Current') if @old_list; + my $msg = scalar @old_list + ? "\nWould you like to edit the urllist or pick new mirrors from a list?" + : "\nWould you like to pick from the CPAN mirror list?" ; + my $_conf = prompt($msg, "yes"); + if ( $_conf =~ /^y/i ) { + conf_sites(); + } + bring_your_own(); + } + _print_urllist('New'); +} + +sub _init_external_progs { + my($matcher,$args) = @_; + my $PATH = $args->{path}; + my @external_progs = @{ $args->{progs} }; + my $shortcut = $args->{shortcut}; + my $showed_make_warning; + + if (!$matcher or "@external_progs" =~ /$matcher/) { + my $old_warn = $^W; + local $^W if $^O eq 'MacOS'; + local $^W = $old_warn; + my $progname; + for $progname (@external_progs) { + next if $matcher && $progname !~ /$matcher/; + if ($^O eq 'MacOS') { + $CPAN::Config->{$progname} = 'not_here'; + next; + } + + my $progcall = $progname; + unless ($matcher) { + # we really don't need ncftp if we have ncftpget, but + # if they chose this dialog via matcher, they shall have it + next if $progname eq "ncftp" && $CPAN::Config->{ncftpget} gt " "; + } + my $path = $CPAN::Config->{$progname} + || $Config::Config{$progname} + || ""; + if (File::Spec->file_name_is_absolute($path)) { + # testing existence is not good enough, some have these exe + # extensions + + # warn "Warning: configured $path does not exist\n" unless -e $path; + # $path = ""; + } elsif ($path =~ /^\s+$/) { + # preserve disabled programs + } else { + $path = ''; + } + unless ($path) { + # e.g. make -> nmake + $progcall = $Config::Config{$progname} if $Config::Config{$progname}; + } + + $path ||= find_exe($progcall,$PATH); + unless ($path) { # not -e $path, because find_exe already checked that + local $"=";"; + $CPAN::Frontend->mywarn("Warning: $progcall not found in PATH[@$PATH]\n") unless $auto_config; + _beg_for_make(), $showed_make_warning++ if $progname eq "make"; + } + $prompts{$progname} = "Where is your $progname program?"; + $path = my_dflt_prompt($progname,$path,$matcher,1); # 1 => no strip spaces + my $disabling = $path =~ m/^\s*$/; + + # don't let them disable or misconfigure make without warning + if ( $progname eq "make" && ( $disabling || ! _check_found($path) ) ) { + if ( $disabling && $showed_make_warning ) { + next; + } + else { + _beg_for_make() unless $showed_make_warning++; + undef $CPAN::Config->{$progname}; + $CPAN::Frontend->mywarn("Press SPACE and ENTER to disable make (NOT RECOMMENDED)\n"); + redo; + } + } + elsif ( $disabling ) { + next; + } + elsif ( _check_found( $CPAN::Config->{$progname} ) ) { + last if $shortcut && !$matcher; + } + else { + undef $CPAN::Config->{$progname}; + $CPAN::Frontend->mywarn("Press SPACE and ENTER to disable $progname\n"); + redo; + } + } + } +} + +sub _check_found { + my ($prog) = @_; + if ( ! -f $prog ) { + $CPAN::Frontend->mywarn("Warning: '$prog' does not exist\n") + unless $auto_config; + return; + } + elsif ( ! -x $prog ) { + $CPAN::Frontend->mywarn("Warning: '$prog' is not executable\n") + unless $auto_config; + return; + } + return 1; +} + +sub _beg_for_make { + $CPAN::Frontend->mywarn(<<"HERE"); + +ALERT: 'make' is an essential tool for building perl Modules. +Please make sure you have 'make' (or some equivalent) working. + +HERE + if ($^O eq "MSWin32") { + $CPAN::Frontend->mywarn(<<"HERE"); +Windows users may want to follow this procedure when back in the CPAN shell: + + look YVES/scripts/alien_nmake.pl + perl alien_nmake.pl + +This will install nmake on your system which can be used as a 'make' +substitute. You can then revisit this dialog with + + o conf init make + +HERE + } +} + +sub init_cpan_home { + my($matcher) = @_; + if (!$matcher or 'cpan_home' =~ /$matcher/) { + my $cpan_home = + $CPAN::Config->{cpan_home} || CPAN::HandleConfig::cpan_home(); + if (-d $cpan_home) { + $CPAN::Frontend->myprint( + "\nI see you already have a directory\n" . + "\n$cpan_home\n" . + "Shall we use it as the general CPAN build and cache directory?\n\n" + ) unless $auto_config; + } else { + # no cpan-home, must prompt and get one + $CPAN::Frontend->myprint($prompts{cpan_home_where}) unless $auto_config; + } + + my $default = $cpan_home; + my $loop = 0; + my($last_ans,$ans); + $CPAN::Frontend->myprint(" <cpan_home>\n") unless $auto_config; + PROMPT: while ($ans = prompt("CPAN build and cache directory?",$default)) { + if (File::Spec->file_name_is_absolute($ans)) { + my @cpan_home = split /[\/\\]/, $ans; + DIR: for my $dir (@cpan_home) { + if ($dir =~ /^~/ and (!$last_ans or $ans ne $last_ans)) { + $CPAN::Frontend + ->mywarn("Warning: a tilde in the path will be ". + "taken as a literal tilde. Please ". + "confirm again if you want to keep it\n"); + $last_ans = $default = $ans; + next PROMPT; + } + } + } else { + require Cwd; + my $cwd = Cwd::cwd(); + my $absans = File::Spec->catdir($cwd,$ans); + $CPAN::Frontend->mywarn("The path '$ans' is not an ". + "absolute path. Please specify ". + "an absolute path\n"); + $default = $absans; + next PROMPT; + } + eval { File::Path::mkpath($ans); }; # dies if it can't + if ($@) { + $CPAN::Frontend->mywarn("Couldn't create directory $ans.\n". + "Please retry.\n"); + next PROMPT; + } + if (-d $ans && -w _) { + last PROMPT; + } else { + $CPAN::Frontend->mywarn("Couldn't find directory $ans\n". + "or directory is not writable. Please retry.\n"); + if (++$loop > 5) { + $CPAN::Frontend->mydie("Giving up"); + } + } + } + $CPAN::Config->{cpan_home} = $ans; + } +} + +sub my_dflt_prompt { + my ($item, $dflt, $m, $no_strip) = @_; + my $default = $CPAN::Config->{$item} || $dflt; + + if (!$auto_config && (!$m || $item =~ /$m/)) { + if (my $intro = $prompts{$item . "_intro"}) { + $CPAN::Frontend->myprint($intro); + } + $CPAN::Frontend->myprint(" <$item>\n"); + $CPAN::Config->{$item} = + $no_strip ? prompt_no_strip($prompts{$item}, $default) + : prompt( $prompts{$item}, $default); + } else { + $CPAN::Config->{$item} = $default; + } + return $CPAN::Config->{$item}; +} + +sub my_yn_prompt { + my ($item, $dflt, $m) = @_; + my $default; + defined($default = $CPAN::Config->{$item}) or $default = $dflt; + + # $DB::single = 1; + if (!$auto_config && (!$m || $item =~ /$m/)) { + if (my $intro = $prompts{$item . "_intro"}) { + $CPAN::Frontend->myprint($intro); + } + $CPAN::Frontend->myprint(" <$item>\n"); + my $ans = prompt($prompts{$item}, $default ? 'yes' : 'no'); + $CPAN::Config->{$item} = ($ans =~ /^[y1]/i ? 1 : 0); + } else { + $CPAN::Config->{$item} = $default; + } +} + +sub my_prompt_loop { + my ($item, $dflt, $m, $ok) = @_; + my $default = $CPAN::Config->{$item} || $dflt; + my $ans; + + if (!$auto_config && (!$m || $item =~ /$m/)) { + $CPAN::Frontend->myprint($prompts{$item . "_intro"}); + $CPAN::Frontend->myprint(" <$item>\n"); + do { $ans = prompt($prompts{$item}, $default); + } until $ans =~ /$ok/; + $CPAN::Config->{$item} = $ans; + } else { + $CPAN::Config->{$item} = $default; + } +} + + +# Here's the logic about the MIRRORED.BY file. There are a number of scenarios: +# (1) We have a cached MIRRORED.BY file +# (1a) We're auto-picking +# - Refresh it automatically if it's old +# (1b) Otherwise, ask if using cached is ok. If old, default to no. +# - If cached is not ok, get it from the Internet. If it succeeds we use +# the new file. Otherwise, we use the old file. +# (2) We don't have a copy at all +# (2a) If we are allowed to connect, we try to get a new copy. If it succeeds, +# we use it, otherwise, we warn about failure +# (2b) If we aren't allowed to connect, + +sub conf_sites { + my %args = @_; + # auto pick implies using the internet + $CPAN::Config->{connect_to_internet_ok} = 1 if $args{auto_pick}; + + my $m = 'MIRRORED.BY'; + my $mby = File::Spec->catfile($CPAN::Config->{keep_source_where},$m); + File::Path::mkpath(File::Basename::dirname($mby)); + # Why are we using MIRRORED.BY from the current directory? + # Is this for testing? -- dagolden, 2009-11-05 + if (-f $mby && -f $m && -M $m < -M $mby) { + require File::Copy; + File::Copy::copy($m,$mby) or die "Could not update $mby: $!"; + } + local $^T = time; + # if we have a cached copy is not older than 60 days, we either + # use it or refresh it or fall back to it if the refresh failed. + if ($mby && -f $mby && -s _ > 0 ) { + my $very_old = (-M $mby > 60); + my $mtime = localtime((stat _)[9]); + # if auto_pick, refresh anything old automatically + if ( $args{auto_pick} ) { + if ( $very_old ) { + $CPAN::Frontend->myprint(qq{Trying to refresh your mirror list\n}); + eval { CPAN::FTP->localize($m,$mby,3,1) } + or $CPAN::Frontend->myprint(qq{Refresh failed. Using the old cached copy instead.\n}); + $CPAN::Frontend->myprint("\n"); + } + } + else { + my $prompt = qq{Found a cached mirror list as of $mtime + +If you'd like to just use the cached copy, answer 'yes', below. +If you'd like an updated copy of the mirror list, answer 'no' and +I'll get a fresh one from the Internet. + +Shall I use the cached mirror list?}; + my $ans = prompt($prompt, $very_old ? "no" : "yes"); + if ($ans =~ /^n/i) { + $CPAN::Frontend->myprint(qq{Trying to refresh your mirror list\n}); + # you asked for it from the Internet + $CPAN::Config->{connect_to_internet_ok} = 1; + eval { CPAN::FTP->localize($m,$mby,3,1) } + or $CPAN::Frontend->myprint(qq{Refresh failed. Using the old cached copy instead.\n}); + $CPAN::Frontend->myprint("\n"); + } + } + } + # else there is no cached copy and we must fetch or fail + else { + # If they haven't agree to connect to the internet, ask again + if ( ! $CPAN::Config->{connect_to_internet_ok} ) { + my $prompt = q{You are missing a copy of the CPAN mirror list. + +May I connect to the Internet to get it?}; + my $ans = prompt($prompt, "yes"); + if ($ans =~ /^y/i) { + $CPAN::Config->{connect_to_internet_ok} = 1; + } + } + + # Now get it from the Internet or complain + if ( $CPAN::Config->{connect_to_internet_ok} ) { + $CPAN::Frontend->myprint(qq{Trying to fetch a mirror list from the Internet\n}); + eval { CPAN::FTP->localize($m,$mby,3,1) } + or $CPAN::Frontend->mywarn(<<'HERE'); +We failed to get a copy of the mirror list from the Internet. +You will need to provide CPAN mirror URLs yourself. +HERE + $CPAN::Frontend->myprint("\n"); + } + else { + $CPAN::Frontend->mywarn(<<'HERE'); +You will need to provide CPAN mirror URLs yourself or set +'o conf connect_to_internet_ok 1' and try again. +HERE + } + } + + # if we finally have a good local MIRRORED.BY, get on with picking + if (-f $mby && -s _ > 0){ + $CPAN::Config->{urllist} = + $args{auto_pick} ? auto_mirrored_by($mby) : choose_mirrored_by($mby); + return 1; + } + + return; +} + +sub find_exe { + my($exe,$path) = @_; + $path ||= [split /$Config{'path_sep'}/, $ENV{'PATH'}]; + my($dir); + #warn "in find_exe exe[$exe] path[@$path]"; + for $dir (@$path) { + my $abs = File::Spec->catfile($dir,$exe); + if (($abs = MM->maybe_command($abs))) { + return $abs; + } + } +} + +sub picklist { + my($items,$prompt,$default,$require_nonempty,$empty_warning)=@_; + CPAN->debug("picklist('$items','$prompt','$default','$require_nonempty',". + "'$empty_warning')") if $CPAN::DEBUG; + $default ||= ''; + + my $pos = 0; + + my @nums; + SELECTION: while (1) { + + # display, at most, 15 items at a time + my $limit = $#{ $items } - $pos; + $limit = 15 if $limit > 15; + + # show the next $limit items, get the new position + $pos = display_some($items, $limit, $pos, $default); + $pos = 0 if $pos >= @$items; + + my $num = prompt($prompt,$default); + + @nums = split (' ', $num); + { + my %seen; + @nums = grep { !$seen{$_}++ } @nums; + } + my $i = scalar @$items; + unrangify(\@nums); + if (0 == @nums) { + # cannot allow nothing because nothing means paging! + # return; + } elsif (grep (/\D/ || $_ < 1 || $_ > $i, @nums)) { + $CPAN::Frontend->mywarn("invalid items entered, try again\n"); + if ("@nums" =~ /\D/) { + $CPAN::Frontend->mywarn("(we are expecting only numbers between 1 and $i)\n"); + } + next SELECTION; + } + if ($require_nonempty && !@nums) { + $CPAN::Frontend->mywarn("$empty_warning\n"); + } + + # a blank line continues... + unless (@nums){ + $CPAN::Frontend->mysleep(0.1); # prevent hot spinning process on the next bug + next SELECTION; + } + last; + } + for (@nums) { $_-- } + @{$items}[@nums]; +} + +sub unrangify ($) { + my($nums) = $_[0]; + my @nums2 = (); + while (@{$nums||[]}) { + my $n = shift @$nums; + if ($n =~ /^(\d+)-(\d+)$/) { + my @range = $1 .. $2; + # warn "range[@range]"; + push @nums2, @range; + } else { + push @nums2, $n; + } + } + push @$nums, @nums2; +} + +sub display_some { + my ($items, $limit, $pos, $default) = @_; + $pos ||= 0; + + my @displayable = @$items[$pos .. ($pos + $limit)]; + for my $item (@displayable) { + $CPAN::Frontend->myprint(sprintf "(%d) %s\n", ++$pos, $item); + } + my $hit_what = $default ? "SPACE ENTER" : "ENTER"; + $CPAN::Frontend->myprint(sprintf("%d more items, hit %s to show them\n", + (@$items - $pos), + $hit_what, + )) + if $pos < @$items; + return $pos; +} + +sub auto_mirrored_by { + my $local = shift or return; + local $|=1; + $CPAN::Frontend->myprint("Looking for CPAN mirrors near you (please be patient)\n"); + my $mirrors = CPAN::Mirrors->new($local); + + my $cnt = 0; + my @best = $mirrors->best_mirrors( + how_many => 3, + callback => sub { + $CPAN::Frontend->myprint("."); + if ($cnt++>60) { $cnt=0; $CPAN::Frontend->myprint("\n"); } + }, + ); + + my $urllist = [ map { $_->http } @best ]; + push @$urllist, grep { /^file:/ } @{$CPAN::Config->{urllist}}; + $CPAN::Frontend->myprint(" done!\n\n"); + + return $urllist +} + +sub choose_mirrored_by { + my $local = shift or return; + my ($default); + my $mirrors = CPAN::Mirrors->new($local); + my @previous_urls = @{$CPAN::Config->{urllist}}; + + $CPAN::Frontend->myprint($prompts{urls_picker_intro}); + + my (@cont, $cont, %cont, @countries, @urls, %seen); + my $no_previous_warn = + "Sorry! since you don't have any existing picks, you must make a\n" . + "geographic selection."; + my $offer_cont = [sort $mirrors->continents]; + if (@previous_urls) { + push @$offer_cont, "(edit previous picks)"; + $default = @$offer_cont; + } else { + # cannot allow nothing because nothing means paging! + # push @$offer_cont, "(none of the above)"; + } + @cont = picklist($offer_cont, + "Select your continent (or several nearby continents)", + $default, + ! @previous_urls, + $no_previous_warn); + # cannot allow nothing because nothing means paging! + # return unless @cont; + + foreach $cont (@cont) { + my @c = sort $mirrors->countries($cont); + @cont{@c} = map ($cont, 0..$#c); + @c = map ("$_ ($cont)", @c) if @cont > 1; + push (@countries, @c); + } + if (@previous_urls && @countries) { + push @countries, "(edit previous picks)"; + $default = @countries; + } + + if (@countries) { + @countries = picklist (\@countries, + "Select your country (or several nearby countries)", + $default, + ! @previous_urls, + $no_previous_warn); + %seen = map (($_ => 1), @previous_urls); + # hmmm, should take list of defaults from CPAN::Config->{'urllist'}... + foreach my $country (@countries) { + next if $country =~ /edit previous picks/; + (my $bare_country = $country) =~ s/ \(.*\)//; + my @u; + for my $m ( $mirrors->mirrors($bare_country) ) { + push @u, $m->ftp if $m->ftp; + push @u, $m->http if $m->http; + } + @u = grep (! $seen{$_}, @u); + @u = map ("$_ ($bare_country)", @u) + if @countries > 1; + push (@urls, sort @u); + } + } + push (@urls, map ("$_ (previous pick)", @previous_urls)); + my $prompt = "Select as many URLs as you like (by number), +put them on one line, separated by blanks, hyphenated ranges allowed + e.g. '1 4 5' or '7 1-4 8'"; + if (@previous_urls) { + $default = join (' ', ((scalar @urls) - (scalar @previous_urls) + 1) .. + (scalar @urls)); + $prompt .= "\n(or just hit ENTER to keep your previous picks)"; + } + + @urls = picklist (\@urls, $prompt, $default); + foreach (@urls) { s/ \(.*\)//; } + return [ @urls ]; +} + +sub bring_your_own { + my $urllist = [ @{$CPAN::Config->{urllist}} ]; + my %seen = map (($_ => 1), @$urllist); + my($ans,@urls); + my $eacnt = 0; # empty answers + $CPAN::Frontend->myprint(<<'HERE'); +Now you can enter your own CPAN URLs by hand. A local CPAN mirror can be +listed using a 'file:' URL like 'file:///path/to/cpan/' + +HERE + do { + my $prompt = "Enter another URL or ENTER to quit:"; + unless (%seen) { + $prompt = qq{CPAN.pm needs at least one URL where it can fetch CPAN files from. + +Please enter your CPAN site:}; + } + $ans = prompt ($prompt, ""); + + if ($ans) { + $ans =~ s|/?\z|/|; # has to end with one slash + # XXX This manipulation is odd. Shouldn't we check that $ans is + # a directory before converting to file:///? And we need /// below, + # too, don't we? -- dagolden, 2009-11-05 + $ans = "file:$ans" unless $ans =~ /:/; # without a scheme is a file: + if ($ans =~ /^\w+:\/./) { + push @urls, $ans unless $seen{$ans}++; + } else { + $CPAN::Frontend-> + myprint(sprintf(qq{"%s" doesn\'t look like an URL at first sight. +I\'ll ignore it for now. +You can add it to your %s +later if you\'re sure it\'s right.\n}, + $ans, + $INC{'CPAN/MyConfig.pm'} + || $INC{'CPAN/Config.pm'} + || "configuration file", + )); + } + } else { + if (++$eacnt >= 5) { + $CPAN::Frontend-> + mywarn("Giving up.\n"); + $CPAN::Frontend->mysleep(5); + return; + } + } + } while $ans || !%seen; + + @$urllist = CPAN::_uniq(@$urllist, @urls); + $CPAN::Config->{urllist} = $urllist; +} + +sub _print_urllist { + my ($which) = @_; + $CPAN::Frontend->myprint("$which urllist\n"); + for ( @{$CPAN::Config->{urllist} || []} ) { + $CPAN::Frontend->myprint(" $_\n") + }; +} + +sub _can_write_to_libdirs { + return -w $Config{installprivlib} + && -w $Config{installarchlib} + && -w $Config{installsitelib} + && -w $Config{installsitearch} +} + +sub _using_installbase { + return 1 if $ENV{PERL_MM_OPT} && $ENV{PERL_MM_OPT} =~ /install_base/i; + return 1 if grep { ($CPAN::Config->{$_}||q{}) =~ /install_base/i } + qw(makepl_arg make_install_arg mbuildpl_arg mbuild_install_arg); + return; +} + +sub _using_sudo { + return 1 if grep { ($CPAN::Config->{$_}||q{}) =~ /sudo/ } + qw(make_install_make_command mbuild_install_build_command); + return; +} + +sub _strip_spaces { + $_[0] =~ s/^\s+//; # no leading spaces + $_[0] =~ s/\s+\z//; # no trailing spaces +} + +sub prompt ($;$) { + unless (defined &_real_prompt) { + *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt; + } + my $ans = _real_prompt(@_); + + _strip_spaces($ans); + $CPAN::Frontend->myprint("\n") unless $auto_config; + + return $ans; +} + + +sub prompt_no_strip ($;$) { + unless (defined &_real_prompt) { + *_real_prompt = \&CPAN::Shell::colorable_makemaker_prompt; + } + return _real_prompt(@_); +} + + + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Distrostatus; +use overload '""' => "as_string", + fallback => 1; +use vars qw($something_has_failed_at); +use vars qw( + $VERSION +); +$VERSION = "5.5"; + + +sub new { + my($class,$arg) = @_; + my $failed = substr($arg,0,2) eq "NO"; + if ($failed) { + $something_has_failed_at = $CPAN::CurrentCommandId; + } + bless { + TEXT => $arg, + FAILED => $failed, + COMMANDID => $CPAN::CurrentCommandId, + TIME => time, + }, $class; +} +sub something_has_just_failed () { + defined $something_has_failed_at && + $something_has_failed_at == $CPAN::CurrentCommandId; +} +sub commandid { shift->{COMMANDID} } +sub failed { shift->{FAILED} } +sub text { + my($self,$set) = @_; + if (defined $set) { + $self->{TEXT} = $set; + } + $self->{TEXT}; +} +sub as_string { + my($self) = @_; + $self->text; +} + + +1; +package CPAN::DeferredCode; + +use strict; +use vars qw/$VERSION/; + +use overload fallback => 1, map { ($_ => 'run') } qw/ + bool "" 0+ +/; + +$VERSION = "5.50"; + +sub run { + $_[0]->(); +} + +1; + + +use strict; + +package CPAN::Kwalify; +use vars qw($VERSION $VAR1); +$VERSION = "5.50"; + +use File::Spec (); + +my %vcache = (); + +my $schema_loaded = {}; + +sub _validate { + my($schema_name,$data,$abs,$y) = @_; + my $yaml_module = CPAN->_yaml_module; + if ( + $CPAN::META->has_inst($yaml_module) + && + $CPAN::META->has_inst("Kwalify") + ) { + my $load = UNIVERSAL::can($yaml_module,"Load"); + unless ($schema_loaded->{$schema_name}) { + eval { + my $schema_yaml = yaml($schema_name); + $schema_loaded->{$schema_name} = $load->($schema_yaml); + }; + if ($@) { + # we know that YAML.pm 0.62 cannot parse the schema, + # so we try a fallback + my $content = do { + my $path = __FILE__; + $path =~ s/\.pm$//; + $path = File::Spec->catfile($path, "$schema_name.dd"); + local *FH; + open FH, $path or die "Could not open '$path': $!"; + local $/; + <FH>; + }; + $VAR1 = undef; + eval $content; + if (my $err = $@) { + die "parsing of '$schema_name.dd' failed: $err"; + } + $schema_loaded->{$schema_name} = $VAR1; + } + } + } + if (my $schema = $schema_loaded->{$schema_name}) { + my $mtime = (stat $abs)[9]; + for my $k (keys %{$vcache{$abs}}) { + delete $vcache{$abs}{$k} unless $k eq $mtime; + } + return if $vcache{$abs}{$mtime}{$y}++; + eval { Kwalify::validate($schema, $data) }; + if (my $err = $@) { + my $info = {}; yaml($schema_name, info => $info); + die "validation of distropref '$abs'[$y] against schema '$info->{path}' failed: $err"; + } + } +} + +sub _clear_cache { + %vcache = (); +} + +sub yaml { + my($schema_name, %opt) = @_; + my $content = do { + my $path = __FILE__; + $path =~ s/\.pm$//; + $path = File::Spec->catfile($path, "$schema_name.yml"); + if ($opt{info}) { + $opt{info}{path} = $path; + } + local *FH; + open FH, $path or die "Could not open '$path': $!"; + local $/; + <FH>; + }; + return $content; +} + +1; + +# Local Variables: +# mode: cperl +# cperl-indent-level: 4 +# End: + +package CPAN::Shell; +use strict; + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: + +use vars qw( + $ADVANCED_QUERY + $AUTOLOAD + $COLOR_REGISTERED + $Help + $autoload_recursion + $reload + @ISA + @relo + $VERSION + ); +@relo = ( + "CPAN.pm", + "CPAN/Author.pm", + "CPAN/CacheMgr.pm", + "CPAN/Complete.pm", + "CPAN/Debug.pm", + "CPAN/DeferredCode.pm", + "CPAN/Distribution.pm", + "CPAN/Distroprefs.pm", + "CPAN/Distrostatus.pm", + "CPAN/Exception/RecursiveDependency.pm", + "CPAN/Exception/yaml_not_installed.pm", + "CPAN/FirstTime.pm", + "CPAN/FTP.pm", + "CPAN/FTP/netrc.pm", + "CPAN/HandleConfig.pm", + "CPAN/Index.pm", + "CPAN/InfoObj.pm", + "CPAN/Kwalify.pm", + "CPAN/LWP/UserAgent.pm", + "CPAN/Module.pm", + "CPAN/Prompt.pm", + "CPAN/Queue.pm", + "CPAN/Reporter/Config.pm", + "CPAN/Reporter/History.pm", + "CPAN/Reporter/PrereqCheck.pm", + "CPAN/Reporter.pm", + "CPAN/Shell.pm", + "CPAN/SQLite.pm", + "CPAN/Tarzip.pm", + "CPAN/Version.pm", + ); +$VERSION = "5.5007"; +# record the initial timestamp for reload. +$reload = { map {$INC{$_} ? ($_,(stat $INC{$_})[9]) : ()} @relo }; +@CPAN::Shell::ISA = qw(CPAN::Debug); +use Cwd qw(chdir); +use Carp (); +$COLOR_REGISTERED ||= 0; +$Help = { + '?' => \"help", + '!' => "eval the rest of the line as perl", + a => "whois author", + autobundle => "write inventory into a bundle file", + b => "info about bundle", + bye => \"quit", + clean => "clean up a distribution's build directory", + # cvs_import + d => "info about a distribution", + # dump + exit => \"quit", + failed => "list all failed actions within current session", + fforce => "redo a command from scratch", + force => "redo a command", + get => "download a distribution", + h => \"help", + help => "overview over commands; 'help ...' explains specific commands", + hosts => "statistics about recently used hosts", + i => "info about authors/bundles/distributions/modules", + install => "install a distribution", + install_tested => "install all distributions tested OK", + is_tested => "list all distributions tested OK", + look => "open a subshell in a distribution's directory", + ls => "list distributions matching a fileglob", + m => "info about a module", + make => "make/build a distribution", + mkmyconfig => "write current config into a CPAN/MyConfig.pm file", + notest => "run a (usually install) command but leave out the test phase", + o => "'o conf ...' for config stuff; 'o debug ...' for debugging", + perldoc => "try to get a manpage for a module", + q => \"quit", + quit => "leave the cpan shell", + r => "review upgradable modules", + readme => "display the README of a distro with a pager", + recent => "show recent uploads to the CPAN", + # recompile + reload => "'reload cpan' or 'reload index'", + report => "test a distribution and send a test report to cpantesters", + reports => "info about reported tests from cpantesters", + # scripts + # smoke + test => "test a distribution", + u => "display uninstalled modules", + upgrade => "combine 'r' command with immediate installation", + }; +{ + $autoload_recursion ||= 0; + + #-> sub CPAN::Shell::AUTOLOAD ; + sub AUTOLOAD { ## no critic + $autoload_recursion++; + my($l) = $AUTOLOAD; + my $class = shift(@_); + # warn "autoload[$l] class[$class]"; + $l =~ s/.*:://; + if ($CPAN::Signal) { + warn "Refusing to autoload '$l' while signal pending"; + $autoload_recursion--; + return; + } + if ($autoload_recursion > 1) { + my $fullcommand = join " ", map { "'$_'" } $l, @_; + warn "Refusing to autoload $fullcommand in recursion\n"; + $autoload_recursion--; + return; + } + if ($l =~ /^w/) { + # XXX needs to be reconsidered + if ($CPAN::META->has_inst('CPAN::WAIT')) { + CPAN::WAIT->$l(@_); + } else { + $CPAN::Frontend->mywarn(qq{ +Commands starting with "w" require CPAN::WAIT to be installed. +Please consider installing CPAN::WAIT to use the fulltext index. +For this you just need to type + install CPAN::WAIT +}); + } + } else { + $CPAN::Frontend->mywarn(qq{Unknown shell command '$l'. }. + qq{Type ? for help. +}); + } + $autoload_recursion--; + } +} + + +#-> sub CPAN::Shell::h ; +sub h { + my($class,$about) = @_; + if (defined $about) { + my $help; + if (exists $Help->{$about}) { + if (ref $Help->{$about}) { # aliases + $about = ${$Help->{$about}}; + } + $help = $Help->{$about}; + } else { + $help = "No help available"; + } + $CPAN::Frontend->myprint("$about\: $help\n"); + } else { + my $filler = " " x (80 - 28 - length($CPAN::VERSION)); + $CPAN::Frontend->myprint(qq{ +Display Information $filler (ver $CPAN::VERSION) + command argument description + a,b,d,m WORD or /REGEXP/ about authors, bundles, distributions, modules + i WORD or /REGEXP/ about any of the above + ls AUTHOR or GLOB about files in the author's directory + (with WORD being a module, bundle or author name or a distribution + name of the form AUTHOR/DISTRIBUTION) + +Download, Test, Make, Install... + get download clean make clean + make make (implies get) look open subshell in dist directory + test make test (implies make) readme display these README files + install make install (implies test) perldoc display POD documentation + +Upgrade installed modules + r WORDs or /REGEXP/ or NONE report updates for some/matching/all + upgrade WORDs or /REGEXP/ or NONE upgrade some/matching/all modules + +Pragmas + force CMD try hard to do command fforce CMD try harder + notest CMD skip testing + +Other + h,? display this menu ! perl-code eval a perl command + o conf [opt] set and query options q quit the cpan shell + reload cpan load CPAN.pm again reload index load newer indices + autobundle Snapshot recent latest CPAN uploads}); +} +} + +*help = \&h; + +#-> sub CPAN::Shell::a ; +sub a { + my($self,@arg) = @_; + # authors are always UPPERCASE + for (@arg) { + $_ = uc $_ unless /=/; + } + $CPAN::Frontend->myprint($self->format_result('Author',@arg)); +} + +#-> sub CPAN::Shell::globls ; +sub globls { + my($self,$s,$pragmas) = @_; + # ls is really very different, but we had it once as an ordinary + # command in the Shell (up to rev. 321) and we could not handle + # force well then + my(@accept,@preexpand); + if ($s =~ /[\*\?\/]/) { + if ($CPAN::META->has_inst("Text::Glob")) { + if (my($au,$pathglob) = $s =~ m|(.*?)/(.*)|) { + my $rau = Text::Glob::glob_to_regex(uc $au); + CPAN::Shell->debug("au[$au]pathglob[$pathglob]rau[$rau]") + if $CPAN::DEBUG; + push @preexpand, map { $_->id . "/" . $pathglob } + CPAN::Shell->expand_by_method('CPAN::Author',['id'],"/$rau/"); + } else { + my $rau = Text::Glob::glob_to_regex(uc $s); + push @preexpand, map { $_->id } + CPAN::Shell->expand_by_method('CPAN::Author', + ['id'], + "/$rau/"); + } + } else { + $CPAN::Frontend->mydie("Text::Glob not installed, cannot proceed"); + } + } else { + push @preexpand, uc $s; + } + for (@preexpand) { + unless (/^[A-Z0-9\-]+(\/|$)/i) { + $CPAN::Frontend->mywarn("ls command rejects argument $_: not an author\n"); + next; + } + push @accept, $_; + } + my $silent = @accept>1; + my $last_alpha = ""; + my @results; + for my $a (@accept) { + my($author,$pathglob); + if ($a =~ m|(.*?)/(.*)|) { + my $a2 = $1; + $pathglob = $2; + $author = CPAN::Shell->expand_by_method('CPAN::Author', + ['id'], + $a2) + or $CPAN::Frontend->mydie("No author found for $a2\n"); + } else { + $author = CPAN::Shell->expand_by_method('CPAN::Author', + ['id'], + $a) + or $CPAN::Frontend->mydie("No author found for $a\n"); + } + if ($silent) { + my $alpha = substr $author->id, 0, 1; + my $ad; + if ($alpha eq $last_alpha) { + $ad = ""; + } else { + $ad = "[$alpha]"; + $last_alpha = $alpha; + } + $CPAN::Frontend->myprint($ad); + } + for my $pragma (@$pragmas) { + if ($author->can($pragma)) { + $author->$pragma(); + } + } + CPAN->debug("author[$author]pathglob[$pathglob]silent[$silent]") if $CPAN::DEBUG; + push @results, $author->ls($pathglob,$silent); # silent if + # more than one + # author + for my $pragma (@$pragmas) { + my $unpragma = "un$pragma"; + if ($author->can($unpragma)) { + $author->$unpragma(); + } + } + } + @results; +} + +#-> sub CPAN::Shell::local_bundles ; +sub local_bundles { + my($self,@which) = @_; + my($incdir,$bdir,$dh); + foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) { + my @bbase = "Bundle"; + while (my $bbase = shift @bbase) { + $bdir = File::Spec->catdir($incdir,split /::/, $bbase); + CPAN->debug("bdir[$bdir]\@bbase[@bbase]") if $CPAN::DEBUG; + if ($dh = DirHandle->new($bdir)) { # may fail + my($entry); + for $entry ($dh->read) { + next if $entry =~ /^\./; + next unless $entry =~ /^\w+(\.pm)?(?!\n)\Z/; + if (-d File::Spec->catdir($bdir,$entry)) { + push @bbase, "$bbase\::$entry"; + } else { + next unless $entry =~ s/\.pm(?!\n)\Z//; + $CPAN::META->instance('CPAN::Bundle',"$bbase\::$entry"); + } + } + } + } + } +} + +#-> sub CPAN::Shell::b ; +sub b { + my($self,@which) = @_; + CPAN->debug("which[@which]") if $CPAN::DEBUG; + $self->local_bundles; + $CPAN::Frontend->myprint($self->format_result('Bundle',@which)); +} + +#-> sub CPAN::Shell::d ; +sub d { $CPAN::Frontend->myprint(shift->format_result('Distribution',@_));} + +#-> sub CPAN::Shell::m ; +sub m { # emacs confused here }; sub mimimimimi { # emacs in sync here + my $self = shift; + my @m = @_; + for (@m) { + if (m|(?:\w+/)*\w+\.pm$|) { # same regexp in expandany + s/.pm$//; + s|/|::|g; + } + } + $CPAN::Frontend->myprint($self->format_result('Module',@m)); +} + +#-> sub CPAN::Shell::i ; +sub i { + my($self) = shift; + my(@args) = @_; + @args = '/./' unless @args; + my(@result); + for my $type (qw/Bundle Distribution Module/) { + push @result, $self->expand($type,@args); + } + # Authors are always uppercase. + push @result, $self->expand("Author", map { uc $_ } @args); + + my $result = @result == 1 ? + $result[0]->as_string : + @result == 0 ? + "No objects found of any type for argument @args\n" : + join("", + (map {$_->as_glimpse} @result), + scalar @result, " items found\n", + ); + $CPAN::Frontend->myprint($result); +} + +#-> sub CPAN::Shell::o ; + +# CPAN::Shell::o and CPAN::HandleConfig::edit are closely related. 'o +# conf' calls through to CPAN::HandleConfig::edit. 'o conf' should +# probably have been called 'set' and 'o debug' maybe 'set debug' or +# 'debug'; 'o conf ARGS' calls ->edit in CPAN/HandleConfig.pm +sub o { + my($self,$o_type,@o_what) = @_; + $o_type ||= ""; + CPAN->debug("o_type[$o_type] o_what[".join(" | ",@o_what)."]\n"); + if ($o_type eq 'conf') { + my($cfilter); + ($cfilter) = $o_what[0] =~ m|^/(.*)/$| if @o_what; + if (!@o_what or $cfilter) { # print all things, "o conf" + $cfilter ||= ""; + my $qrfilter = eval 'qr/$cfilter/'; + if ($@) { + $CPAN::Frontend->mydie("Cannot parse commandline: $@"); + } + my($k,$v); + my $configpm = CPAN::HandleConfig->require_myconfig_or_config; + $CPAN::Frontend->myprint("\$CPAN::Config options from $configpm\:\n"); + for $k (sort keys %CPAN::HandleConfig::can) { + next unless $k =~ /$qrfilter/; + $v = $CPAN::HandleConfig::can{$k}; + $CPAN::Frontend->myprint(sprintf " %-18s [%s]\n", $k, $v); + } + $CPAN::Frontend->myprint("\n"); + for $k (sort keys %CPAN::HandleConfig::keys) { + next unless $k =~ /$qrfilter/; + CPAN::HandleConfig->prettyprint($k); + } + $CPAN::Frontend->myprint("\n"); + } else { + if (CPAN::HandleConfig->edit(@o_what)) { + } else { + $CPAN::Frontend->myprint(qq{Type 'o conf' to view all configuration }. + qq{items\n\n}); + } + } + } elsif ($o_type eq 'debug') { + my(%valid); + @o_what = () if defined $o_what[0] && $o_what[0] =~ /help/i; + if (@o_what) { + while (@o_what) { + my($what) = shift @o_what; + if ($what =~ s/^-// && exists $CPAN::DEBUG{$what}) { + $CPAN::DEBUG &= $CPAN::DEBUG ^ $CPAN::DEBUG{$what}; + next; + } + if ( exists $CPAN::DEBUG{$what} ) { + $CPAN::DEBUG |= $CPAN::DEBUG{$what}; + } elsif ($what =~ /^\d/) { + $CPAN::DEBUG = $what; + } elsif (lc $what eq 'all') { + my($max) = 0; + for (values %CPAN::DEBUG) { + $max += $_; + } + $CPAN::DEBUG = $max; + } else { + my($known) = 0; + for (keys %CPAN::DEBUG) { + next unless lc($_) eq lc($what); + $CPAN::DEBUG |= $CPAN::DEBUG{$_}; + $known = 1; + } + $CPAN::Frontend->myprint("unknown argument [$what]\n") + unless $known; + } + } + } else { + my $raw = "Valid options for debug are ". + join(", ",sort(keys %CPAN::DEBUG), 'all'). + qq{ or a number. Completion works on the options. }. + qq{Case is ignored.}; + require Text::Wrap; + $CPAN::Frontend->myprint(Text::Wrap::fill("","",$raw)); + $CPAN::Frontend->myprint("\n\n"); + } + if ($CPAN::DEBUG) { + $CPAN::Frontend->myprint("Options set for debugging ($CPAN::DEBUG):\n"); + my($k,$v); + for $k (sort {$CPAN::DEBUG{$a} <=> $CPAN::DEBUG{$b}} keys %CPAN::DEBUG) { + $v = $CPAN::DEBUG{$k}; + $CPAN::Frontend->myprint(sprintf " %-14s(%s)\n", $k, $v) + if $v & $CPAN::DEBUG; + } + } else { + $CPAN::Frontend->myprint("Debugging turned off completely.\n"); + } + } else { + $CPAN::Frontend->myprint(qq{ +Known options: + conf set or get configuration variables + debug set or get debugging options +}); + } +} + +# CPAN::Shell::paintdots_onreload +sub paintdots_onreload { + my($ref) = shift; + sub { + if ( $_[0] =~ /[Ss]ubroutine ([\w:]+) redefined/ ) { + my($subr) = $1; + ++$$ref; + local($|) = 1; + # $CPAN::Frontend->myprint(".($subr)"); + $CPAN::Frontend->myprint("."); + if ($subr =~ /\bshell\b/i) { + # warn "debug[$_[0]]"; + + # It would be nice if we could detect that a + # subroutine has actually changed, but for now we + # practically always set the GOTOSHELL global + + $CPAN::GOTOSHELL=1; + } + return; + } + warn @_; + }; +} + +#-> sub CPAN::Shell::hosts ; +sub hosts { + my($self) = @_; + my $fullstats = CPAN::FTP->_ftp_statistics(); + my $history = $fullstats->{history} || []; + my %S; # statistics + while (my $last = pop @$history) { + my $attempts = $last->{attempts} or next; + my $start; + if (@$attempts) { + $start = $attempts->[-1]{start}; + if ($#$attempts > 0) { + for my $i (0..$#$attempts-1) { + my $url = $attempts->[$i]{url} or next; + $S{no}{$url}++; + } + } + } else { + $start = $last->{start}; + } + next unless $last->{thesiteurl}; # C-C? bad filenames? + $S{start} = $start; + $S{end} ||= $last->{end}; + my $dltime = $last->{end} - $start; + my $dlsize = $last->{filesize} || 0; + my $url = ref $last->{thesiteurl} ? $last->{thesiteurl}->text : $last->{thesiteurl}; + my $s = $S{ok}{$url} ||= {}; + $s->{n}++; + $s->{dlsize} ||= 0; + $s->{dlsize} += $dlsize/1024; + $s->{dltime} ||= 0; + $s->{dltime} += $dltime; + } + my $res; + for my $url (sort keys %{$S{ok}}) { + next if $S{ok}{$url}{dltime} == 0; # div by zero + push @{$res->{ok}}, [@{$S{ok}{$url}}{qw(n dlsize dltime)}, + $S{ok}{$url}{dlsize}/$S{ok}{$url}{dltime}, + $url, + ]; + } + for my $url (sort keys %{$S{no}}) { + push @{$res->{no}}, [$S{no}{$url}, + $url, + ]; + } + my $R = ""; # report + if ($S{start} && $S{end}) { + $R .= sprintf "Log starts: %s\n", $S{start} ? scalar(localtime $S{start}) : "unknown"; + $R .= sprintf "Log ends : %s\n", $S{end} ? scalar(localtime $S{end}) : "unknown"; + } + if ($res->{ok} && @{$res->{ok}}) { + $R .= sprintf "\nSuccessful downloads: + N kB secs kB/s url\n"; + my $i = 20; + for (sort { $b->[3] <=> $a->[3] } @{$res->{ok}}) { + $R .= sprintf "%4d %8d %5d %9.1f %s\n", @$_; + last if --$i<=0; + } + } + if ($res->{no} && @{$res->{no}}) { + $R .= sprintf "\nUnsuccessful downloads:\n"; + my $i = 20; + for (sort { $b->[0] <=> $a->[0] } @{$res->{no}}) { + $R .= sprintf "%4d %s\n", @$_; + last if --$i<=0; + } + } + $CPAN::Frontend->myprint($R); +} + +# here is where 'reload cpan' is done +#-> sub CPAN::Shell::reload ; +sub reload { + my($self,$command,@arg) = @_; + $command ||= ""; + $self->debug("self[$self]command[$command]arg[@arg]") if $CPAN::DEBUG; + if ($command =~ /^cpan$/i) { + my $redef = 0; + chdir $CPAN::iCwd if $CPAN::iCwd; # may fail + my $failed; + MFILE: for my $f (@relo) { + next unless exists $INC{$f}; + my $p = $f; + $p =~ s/\.pm$//; + $p =~ s|/|::|g; + $CPAN::Frontend->myprint("($p"); + local($SIG{__WARN__}) = paintdots_onreload(\$redef); + $self->_reload_this($f) or $failed++; + my $v = eval "$p\::->VERSION"; + $CPAN::Frontend->myprint("v$v)"); + } + $CPAN::Frontend->myprint("\n$redef subroutines redefined\n"); + if ($failed) { + my $errors = $failed == 1 ? "error" : "errors"; + $CPAN::Frontend->mywarn("\n$failed $errors during reload. You better quit ". + "this session.\n"); + } + } elsif ($command =~ /^index$/i) { + CPAN::Index->force_reload; + } else { + $CPAN::Frontend->myprint(qq{cpan re-evals the CPAN modules +index re-reads the index files\n}); + } +} + +# reload means only load again what we have loaded before +#-> sub CPAN::Shell::_reload_this ; +sub _reload_this { + my($self,$f,$args) = @_; + CPAN->debug("f[$f]") if $CPAN::DEBUG; + return 1 unless $INC{$f}; # we never loaded this, so we do not + # reload but say OK + my $pwd = CPAN::anycwd(); + CPAN->debug("pwd[$pwd]") if $CPAN::DEBUG; + my($file); + for my $inc (@INC) { + $file = File::Spec->catfile($inc,split /\//, $f); + last if -f $file; + $file = ""; + } + CPAN->debug("file[$file]") if $CPAN::DEBUG; + my @inc = @INC; + unless ($file && -f $file) { + # this thingy is not in the INC path, maybe CPAN/MyConfig.pm? + $file = $INC{$f}; + unless (CPAN->has_inst("File::Basename")) { + @inc = File::Basename::dirname($file); + } else { + # do we ever need this? + @inc = substr($file,0,-length($f)-1); # bring in back to me! + } + } + CPAN->debug("file[$file]inc[@inc]") if $CPAN::DEBUG; + unless (-f $file) { + $CPAN::Frontend->mywarn("Found no file to reload for '$f'\n"); + return; + } + my $mtime = (stat $file)[9]; + $reload->{$f} ||= -1; + my $must_reload = $mtime != $reload->{$f}; + $args ||= {}; + $must_reload ||= $args->{reloforce}; # o conf defaults needs this + if ($must_reload) { + my $fh = FileHandle->new($file) or + $CPAN::Frontend->mydie("Could not open $file: $!"); + my $content; + { + local($/); + local $^W = 1; + $content = <$fh>; + } + CPAN->debug(sprintf("reload file[%s] content[%s...]",$file,substr($content,0,128))) + if $CPAN::DEBUG; + my $includefile; + if ($includefile = $INC{$f} and -e $includefile) { + $f = $includefile; + } + delete $INC{$f}; + local @INC = @inc; + eval "require '$f'"; + if ($@) { + warn $@; + return; + } + $reload->{$f} = $mtime; + } else { + $CPAN::Frontend->myprint("__unchanged__"); + } + return 1; +} + +#-> sub CPAN::Shell::mkmyconfig ; +sub mkmyconfig { + my($self) = @_; + if ( my $configpm = $INC{'CPAN/MyConfig.pm'} ) { + $CPAN::Frontend->myprint( + "CPAN::MyConfig already exists as $configpm.\n" . + "Running configuration again...\n" + ); + require CPAN::FirstTime; + CPAN::FirstTime::init($configpm); + } + else { + # force some missing values to be filled in with defaults + delete $CPAN::Config->{$_} + for qw/build_dir cpan_home keep_source_where histfile/; + CPAN::HandleConfig->load( make_myconfig => 1 ); + } +} + +#-> sub CPAN::Shell::_binary_extensions ; +sub _binary_extensions { + my($self) = shift @_; + my(@result,$module,%seen,%need,$headerdone); + for $module ($self->expand('Module','/./')) { + my $file = $module->cpan_file; + next if $file eq "N/A"; + next if $file =~ /^Contact Author/; + my $dist = $CPAN::META->instance('CPAN::Distribution',$file); + next if $dist->isa_perl; + next unless $module->xs_file; + local($|) = 1; + $CPAN::Frontend->myprint("."); + push @result, $module; + } +# print join " | ", @result; + $CPAN::Frontend->myprint("\n"); + return @result; +} + +#-> sub CPAN::Shell::recompile ; +sub recompile { + my($self) = shift @_; + my($module,@module,$cpan_file,%dist); + @module = $self->_binary_extensions(); + for $module (@module) { # we force now and compile later, so we + # don't do it twice + $cpan_file = $module->cpan_file; + my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file); + $pack->force; + $dist{$cpan_file}++; + } + for $cpan_file (sort keys %dist) { + $CPAN::Frontend->myprint(" CPAN: Recompiling $cpan_file\n\n"); + my $pack = $CPAN::META->instance('CPAN::Distribution',$cpan_file); + $pack->install; + $CPAN::Signal = 0; # it's tempting to reset Signal, so we can + # stop a package from recompiling, + # e.g. IO-1.12 when we have perl5.003_10 + } +} + +#-> sub CPAN::Shell::scripts ; +sub scripts { + my($self, $arg) = @_; + $CPAN::Frontend->mywarn(">>>> experimental command, currently unsupported <<<<\n\n"); + + for my $req (qw( HTML::LinkExtor Sort::Versions List::Util )) { + unless ($CPAN::META->has_inst($req)) { + $CPAN::Frontend->mywarn(" $req not available\n"); + } + } + my $p = HTML::LinkExtor->new(); + my $indexfile = "/home/ftp/pub/PAUSE/scripts/new/index.html"; + unless (-f $indexfile) { + $CPAN::Frontend->mydie("found no indexfile[$indexfile]\n"); + } + $p->parse_file($indexfile); + my @hrefs; + my $qrarg; + if ($arg =~ s|^/(.+)/$|$1|) { + $qrarg = eval 'qr/$arg/'; # hide construct from 5.004 + } + for my $l ($p->links) { + my $tag = shift @$l; + next unless $tag eq "a"; + my %att = @$l; + my $href = $att{href}; + next unless $href =~ s|^\.\./authors/id/./../||; + if ($arg) { + if ($qrarg) { + if ($href =~ $qrarg) { + push @hrefs, $href; + } + } else { + if ($href =~ /\Q$arg\E/) { + push @hrefs, $href; + } + } + } else { + push @hrefs, $href; + } + } + # now filter for the latest version if there is more than one of a name + my %stems; + for (sort @hrefs) { + my $href = $_; + s/-v?\d.*//; + my $stem = $_; + $stems{$stem} ||= []; + push @{$stems{$stem}}, $href; + } + for (sort keys %stems) { + my $highest; + if (@{$stems{$_}} > 1) { + $highest = List::Util::reduce { + Sort::Versions::versioncmp($a,$b) > 0 ? $a : $b + } @{$stems{$_}}; + } else { + $highest = $stems{$_}[0]; + } + $CPAN::Frontend->myprint("$highest\n"); + } +} + +sub _guess_manpage { + my($self,$d,$contains,$dist) = @_; + $dist =~ s/-/::/g; + my $module; + if (exists $contains->{$dist}) { + $module = $dist; + } elsif (1 == keys %$contains) { + ($module) = keys %$contains; + } + my $manpage; + if ($module) { + my $m = $self->expand("Module",$module); + $m->as_string; # called for side-effects, shame + $manpage = $m->{MANPAGE}; + } else { + $manpage = "unknown"; + } + return $manpage; +} + +#-> sub CPAN::Shell::_specfile ; +sub _specfile { + die "CPAN::Shell::_specfile() has been moved to CPAN::Plugin::Specfile::post_test()"; +} + +#-> sub CPAN::Shell::report ; +sub report { + my($self,@args) = @_; + unless ($CPAN::META->has_inst("CPAN::Reporter")) { + $CPAN::Frontend->mydie("CPAN::Reporter not installed; cannot continue"); + } + local $CPAN::Config->{test_report} = 1; + $self->force("test",@args); # force is there so that the test be + # re-run (as documented) +} + +# compare with is_tested +#-> sub CPAN::Shell::install_tested +sub install_tested { + my($self,@some) = @_; + $CPAN::Frontend->mywarn("install_tested() must not be called with arguments.\n"), + return if @some; + CPAN::Index->reload; + + for my $b (reverse $CPAN::META->_list_sorted_descending_is_tested) { + my $yaml = "$b.yml"; + unless (-f $yaml) { + $CPAN::Frontend->mywarn("No YAML file for $b available, skipping\n"); + next; + } + my $yaml_content = CPAN->_yaml_loadfile($yaml); + my $id = $yaml_content->[0]{distribution}{ID}; + unless ($id) { + $CPAN::Frontend->mywarn("No ID found in '$yaml', skipping\n"); + next; + } + my $do = CPAN::Shell->expandany($id); + unless ($do) { + $CPAN::Frontend->mywarn("Could not expand ID '$id', skipping\n"); + next; + } + unless ($do->{build_dir}) { + $CPAN::Frontend->mywarn("Distro '$id' has no build_dir, skipping\n"); + next; + } + unless ($do->{build_dir} eq $b) { + $CPAN::Frontend->mywarn("Distro '$id' has build_dir '$do->{build_dir}' but expected '$b', skipping\n"); + next; + } + push @some, $do; + } + + $CPAN::Frontend->mywarn("No tested distributions found.\n"), + return unless @some; + + @some = grep { $_->{make_test} && ! $_->{make_test}->failed } @some; + $CPAN::Frontend->mywarn("No distributions tested with this build of perl found.\n"), + return unless @some; + + # @some = grep { not $_->uptodate } @some; + # $CPAN::Frontend->mywarn("No non-uptodate distributions tested with this build of perl found.\n"), + # return unless @some; + + CPAN->debug("some[@some]"); + for my $d (@some) { + my $id = $d->can("pretty_id") ? $d->pretty_id : $d->id; + $CPAN::Frontend->myprint("install_tested: Running for $id\n"); + $CPAN::Frontend->mysleep(1); + $self->install($d); + } +} + +#-> sub CPAN::Shell::upgrade ; +sub upgrade { + my($self,@args) = @_; + $self->install($self->r(@args)); +} + +#-> sub CPAN::Shell::_u_r_common ; +sub _u_r_common { + my($self) = shift @_; + my($what) = shift @_; + CPAN->debug("self[$self] what[$what] args[@_]") if $CPAN::DEBUG; + Carp::croak "Usage: \$obj->_u_r_common(a|r|u)" unless + $what && $what =~ /^[aru]$/; + my(@args) = @_; + @args = '/./' unless @args; + my(@result,$module,%seen,%need,$headerdone, + $version_undefs,$version_zeroes, + @version_undefs,@version_zeroes); + $version_undefs = $version_zeroes = 0; + my $sprintf = "%s%-25s%s %9s %9s %s\n"; + my @expand = $self->expand('Module',@args); + if ($CPAN::DEBUG) { # Looks like noise to me, was very useful for debugging + # for metadata cache + my $expand = scalar @expand; + $CPAN::Frontend->myprint(sprintf "%d matches in the database, time[%d]\n", $expand, time); + } + my @sexpand; + if ($] < 5.008) { + # hard to believe that the more complex sorting can lead to + # stack curruptions on older perl + @sexpand = sort {$a->id cmp $b->id} @expand; + } else { + @sexpand = map { + $_->[1] + } sort { + $b->[0] <=> $a->[0] + || + $a->[1]{ID} cmp $b->[1]{ID}, + } map { + [$_->_is_representative_module, + $_ + ] + } @expand; + } + if ($CPAN::DEBUG) { + $CPAN::Frontend->myprint(sprintf "sorted at time[%d]\n", time); + sleep 1; + } + MODULE: for $module (@sexpand) { + my $file = $module->cpan_file; + next MODULE unless defined $file; # ?? + $file =~ s!^./../!!; + my($latest) = $module->cpan_version; + my($inst_file) = $module->inst_file; + CPAN->debug("file[$file]latest[$latest]") if $CPAN::DEBUG; + my($have); + return if $CPAN::Signal; + my($next_MODULE); + eval { # version.pm involved! + if ($inst_file) { + if ($what eq "a") { + $have = $module->inst_version; + } elsif ($what eq "r") { + $have = $module->inst_version; + local($^W) = 0; + if ($have eq "undef") { + $version_undefs++; + push @version_undefs, $module->as_glimpse; + } elsif (CPAN::Version->vcmp($have,0)==0) { + $version_zeroes++; + push @version_zeroes, $module->as_glimpse; + } + ++$next_MODULE unless CPAN::Version->vgt($latest, $have); + # to be pedantic we should probably say: + # && !($have eq "undef" && $latest ne "undef" && $latest gt ""); + # to catch the case where CPAN has a version 0 and we have a version undef + } elsif ($what eq "u") { + ++$next_MODULE; + } + } else { + if ($what eq "a") { + ++$next_MODULE; + } elsif ($what eq "r") { + ++$next_MODULE; + } elsif ($what eq "u") { + $have = "-"; + } + } + }; + next MODULE if $next_MODULE; + if ($@) { + $CPAN::Frontend->mywarn + (sprintf("Error while comparing cpan/installed versions of '%s': +INST_FILE: %s +INST_VERSION: %s %s +CPAN_VERSION: %s %s +", + $module->id, + $inst_file || "", + (defined $have ? $have : "[UNDEFINED]"), + (ref $have ? ref $have : ""), + $latest, + (ref $latest ? ref $latest : ""), + )); + next MODULE; + } + return if $CPAN::Signal; # this is sometimes lengthy + $seen{$file} ||= 0; + if ($what eq "a") { + push @result, sprintf "%s %s\n", $module->id, $have; + } elsif ($what eq "r") { + push @result, $module->id; + next MODULE if $seen{$file}++; + } elsif ($what eq "u") { + push @result, $module->id; + next MODULE if $seen{$file}++; + next MODULE if $file =~ /^Contact/; + } + unless ($headerdone++) { + $CPAN::Frontend->myprint("\n"); + $CPAN::Frontend->myprint(sprintf( + $sprintf, + "", + "Package namespace", + "", + "installed", + "latest", + "in CPAN file" + )); + } + my $color_on = ""; + my $color_off = ""; + if ( + $COLOR_REGISTERED + && + $CPAN::META->has_inst("Term::ANSIColor") + && + $module->description + ) { + $color_on = Term::ANSIColor::color("green"); + $color_off = Term::ANSIColor::color("reset"); + } + $CPAN::Frontend->myprint(sprintf $sprintf, + $color_on, + $module->id, + $color_off, + $have, + $latest, + $file); + $need{$module->id}++; + } + unless (%need) { + if (!@expand || $what eq "u") { + $CPAN::Frontend->myprint("No modules found for @args\n"); + } elsif ($what eq "r") { + $CPAN::Frontend->myprint("All modules are up to date for @args\n"); + } + } + if ($what eq "r") { + if ($version_zeroes) { + my $s_has = $version_zeroes > 1 ? "s have" : " has"; + $CPAN::Frontend->myprint(qq{$version_zeroes installed module$s_has }. + qq{a version number of 0\n}); + if ($CPAN::Config->{show_zero_versions}) { + local $" = "\t"; + $CPAN::Frontend->myprint(qq{ they are\n\t@version_zeroes\n}); + $CPAN::Frontend->myprint(qq{(use 'o conf show_zero_versions 0' }. + qq{to hide them)\n}); + } else { + $CPAN::Frontend->myprint(qq{(use 'o conf show_zero_versions 1' }. + qq{to show them)\n}); + } + } + if ($version_undefs) { + my $s_has = $version_undefs > 1 ? "s have" : " has"; + $CPAN::Frontend->myprint(qq{$version_undefs installed module$s_has no }. + qq{parsable version number\n}); + if ($CPAN::Config->{show_unparsable_versions}) { + local $" = "\t"; + $CPAN::Frontend->myprint(qq{ they are\n\t@version_undefs\n}); + $CPAN::Frontend->myprint(qq{(use 'o conf show_unparsable_versions 0' }. + qq{to hide them)\n}); + } else { + $CPAN::Frontend->myprint(qq{(use 'o conf show_unparsable_versions 1' }. + qq{to show them)\n}); + } + } + } + @result; +} + +#-> sub CPAN::Shell::r ; +sub r { + shift->_u_r_common("r",@_); +} + +#-> sub CPAN::Shell::u ; +sub u { + shift->_u_r_common("u",@_); +} + +#-> sub CPAN::Shell::failed ; +sub failed { + my($self,$only_id,$silent) = @_; + my @failed = $self->find_failed($only_id); + my $scope; + if ($only_id) { + $scope = "this command"; + } elsif ($CPAN::Index::HAVE_REANIMATED) { + $scope = "this or a previous session"; + # it might be nice to have a section for previous session and + # a second for this + } else { + $scope = "this session"; + } + if (@failed) { + my $print; + my $debug = 0; + if ($debug) { + $print = join "", + map { sprintf "%5d %-45s: %s %s\n", @$_ } + sort { $a->[0] <=> $b->[0] } @failed; + } else { + $print = join "", + map { sprintf " %-45s: %s %s\n", @$_[1..3] } + sort { + $a->[0] <=> $b->[0] + || + $a->[4] <=> $b->[4] + } @failed; + } + $CPAN::Frontend->myprint("Failed during $scope:\n$print"); + } elsif (!$only_id || !$silent) { + $CPAN::Frontend->myprint("Nothing failed in $scope\n"); + } +} + +sub find_failed { + my($self,$only_id) = @_; + my @failed; + DIST: for my $d (sort { $a->id cmp $b->id } $CPAN::META->all_objects("CPAN::Distribution")) { + my $failed = ""; + NAY: for my $nosayer ( # order matters! + "unwrapped", + "writemakefile", + "signature_verify", + "make", + "make_test", + "install", + "make_clean", + ) { + next unless exists $d->{$nosayer}; + next unless defined $d->{$nosayer}; + next unless ( + UNIVERSAL::can($d->{$nosayer},"failed") ? + $d->{$nosayer}->failed : + $d->{$nosayer} =~ /^NO/ + ); + next NAY if $only_id && $only_id != ( + UNIVERSAL::can($d->{$nosayer},"commandid") + ? + $d->{$nosayer}->commandid + : + $CPAN::CurrentCommandId + ); + $failed = $nosayer; + last; + } + next DIST unless $failed; + my $id = $d->id; + $id =~ s|^./../||; + ### XXX need to flag optional modules as '(optional)' if they are + # from recommends/suggests -- i.e. *show* failure, but make it clear + # it was failure of optional module -- xdg, 2012-04-01 + $id = "(optional) $id" if ! $d->{mandatory}; + #$print .= sprintf( + # " %-45s: %s %s\n", + push @failed, + ( + UNIVERSAL::can($d->{$failed},"failed") ? + [ + $d->{$failed}->commandid, + $id, + $failed, + $d->{$failed}->text, + $d->{$failed}{TIME}||0, + !! $d->{mandatory}, + ] : + [ + 1, + $id, + $failed, + $d->{$failed}, + 0, + !! $d->{mandatory}, + ] + ); + } + return @failed; +} + +sub mandatory_dist_failed { + my ($self) = @_; + return grep { $_->[5] } $self->find_failed($CPAN::CurrentCommandID); +} + +# XXX intentionally undocumented because completely bogus, unportable, +# useless, etc. + +#-> sub CPAN::Shell::status ; +sub status { + my($self) = @_; + require Devel::Size; + my $ps = FileHandle->new; + open $ps, "/proc/$$/status"; + my $vm = 0; + while (<$ps>) { + next unless /VmSize:\s+(\d+)/; + $vm = $1; + last; + } + $CPAN::Frontend->mywarn(sprintf( + "%-27s %6d\n%-27s %6d\n", + "vm", + $vm, + "CPAN::META", + Devel::Size::total_size($CPAN::META)/1024, + )); + for my $k (sort keys %$CPAN::META) { + next unless substr($k,0,4) eq "read"; + warn sprintf " %-26s %6d\n", $k, Devel::Size::total_size($CPAN::META->{$k})/1024; + for my $k2 (sort keys %{$CPAN::META->{$k}}) { + warn sprintf " %-25s %6d (keys: %6d)\n", + $k2, + Devel::Size::total_size($CPAN::META->{$k}{$k2})/1024, + scalar keys %{$CPAN::META->{$k}{$k2}}; + } + } +} + +# compare with install_tested +#-> sub CPAN::Shell::is_tested +sub is_tested { + my($self) = @_; + CPAN::Index->reload; + for my $b (reverse $CPAN::META->_list_sorted_descending_is_tested) { + my $time; + if ($CPAN::META->{is_tested}{$b}) { + $time = scalar(localtime $CPAN::META->{is_tested}{$b}); + } else { + $time = scalar localtime; + $time =~ s/\S/?/g; + } + $CPAN::Frontend->myprint(sprintf "%s %s\n", $time, $b); + } +} + +#-> sub CPAN::Shell::autobundle ; +sub autobundle { + my($self) = shift; + CPAN::HandleConfig->load unless $CPAN::Config_loaded++; + my(@bundle) = $self->_u_r_common("a",@_); + my($todir) = File::Spec->catdir($CPAN::Config->{'cpan_home'},"Bundle"); + File::Path::mkpath($todir); + unless (-d $todir) { + $CPAN::Frontend->myprint("Couldn't mkdir $todir for some reason\n"); + return; + } + my($y,$m,$d) = (localtime)[5,4,3]; + $y+=1900; + $m++; + my($c) = 0; + my($me) = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, $c; + my($to) = File::Spec->catfile($todir,"$me.pm"); + while (-f $to) { + $me = sprintf "Snapshot_%04d_%02d_%02d_%02d", $y, $m, $d, ++$c; + $to = File::Spec->catfile($todir,"$me.pm"); + } + my($fh) = FileHandle->new(">$to") or Carp::croak "Can't open >$to: $!"; + $fh->print( + "package Bundle::$me;\n\n", + "\$","VERSION = '0.01';\n\n", # hide from perl-reversion + "1;\n\n", + "__END__\n\n", + "=head1 NAME\n\n", + "Bundle::$me - Snapshot of installation on ", + $Config::Config{'myhostname'}, + " on ", + scalar(localtime), + "\n\n=head1 SYNOPSIS\n\n", + "perl -MCPAN -e 'install Bundle::$me'\n\n", + "=head1 CONTENTS\n\n", + join("\n", @bundle), + "\n\n=head1 CONFIGURATION\n\n", + Config->myconfig, + "\n\n=head1 AUTHOR\n\n", + "This Bundle has been generated automatically ", + "by the autobundle routine in CPAN.pm.\n", + ); + $fh->close; + $CPAN::Frontend->myprint("\nWrote bundle file + $to\n\n"); + return $to; +} + +#-> sub CPAN::Shell::expandany ; +sub expandany { + my($self,$s) = @_; + CPAN->debug("s[$s]") if $CPAN::DEBUG; + my $module_as_path = ""; + if ($s =~ m|(?:\w+/)*\w+\.pm$|) { # same regexp in sub m + $module_as_path = $s; + $module_as_path =~ s/.pm$//; + $module_as_path =~ s|/|::|g; + } + if ($module_as_path) { + if ($module_as_path =~ m|^Bundle::|) { + $self->local_bundles; + return $self->expand('Bundle',$module_as_path); + } else { + return $self->expand('Module',$module_as_path) + if $CPAN::META->exists('CPAN::Module',$module_as_path); + } + } elsif ($s =~ m|/| or substr($s,-1,1) eq ".") { # looks like a file or a directory + $s = CPAN::Distribution->normalize($s); + return $CPAN::META->instance('CPAN::Distribution',$s); + # Distributions spring into existence, not expand + } elsif ($s =~ m|^Bundle::|) { + $self->local_bundles; # scanning so late for bundles seems + # both attractive and crumpy: always + # current state but easy to forget + # somewhere + return $self->expand('Bundle',$s); + } else { + return $self->expand('Module',$s) + if $CPAN::META->exists('CPAN::Module',$s); + } + return; +} + +#-> sub CPAN::Shell::expand ; +sub expand { + my $self = shift; + my($type,@args) = @_; + CPAN->debug("type[$type]args[@args]") if $CPAN::DEBUG; + my $class = "CPAN::$type"; + my $methods = ['id']; + for my $meth (qw(name)) { + next unless $class->can($meth); + push @$methods, $meth; + } + $self->expand_by_method($class,$methods,@args); +} + +#-> sub CPAN::Shell::expand_by_method ; +sub expand_by_method { + my $self = shift; + my($class,$methods,@args) = @_; + my($arg,@m); + for $arg (@args) { + my($regex,$command); + if ($arg =~ m|^/(.*)/$|) { + $regex = $1; +# FIXME: there seem to be some ='s in the author data, which trigger +# a failure here. This needs to be contemplated. +# } elsif ($arg =~ m/=/) { +# $command = 1; + } + my $obj; + CPAN->debug(sprintf "class[%s]regex[%s]command[%s]", + $class, + defined $regex ? $regex : "UNDEFINED", + defined $command ? $command : "UNDEFINED", + ) if $CPAN::DEBUG; + if (defined $regex) { + if (CPAN::_sqlite_running()) { + CPAN::Index->reload; + $CPAN::SQLite->search($class, $regex); + } + for $obj ( + $CPAN::META->all_objects($class) + ) { + unless ($obj && UNIVERSAL::can($obj,"id") && $obj->id) { + # BUG, we got an empty object somewhere + require Data::Dumper; + CPAN->debug(sprintf( + "Bug in CPAN: Empty id on obj[%s][%s]", + $obj, + Data::Dumper::Dumper($obj) + )) if $CPAN::DEBUG; + next; + } + for my $method (@$methods) { + my $match = eval {$obj->$method() =~ /$regex/i}; + if ($@) { + my($err) = $@ =~ /^(.+) at .+? line \d+\.$/; + $err ||= $@; # if we were too restrictive above + $CPAN::Frontend->mydie("$err\n"); + } elsif ($match) { + push @m, $obj; + last; + } + } + } + } elsif ($command) { + die "equal sign in command disabled (immature interface), ". + "you can set + ! \$CPAN::Shell::ADVANCED_QUERY=1 +to enable it. But please note, this is HIGHLY EXPERIMENTAL code +that may go away anytime.\n" + unless $ADVANCED_QUERY; + my($method,$criterion) = $arg =~ /(.+?)=(.+)/; + my($matchcrit) = $criterion =~ m/^~(.+)/; + for my $self ( + sort + {$a->id cmp $b->id} + $CPAN::META->all_objects($class) + ) { + my $lhs = $self->$method() or next; # () for 5.00503 + if ($matchcrit) { + push @m, $self if $lhs =~ m/$matchcrit/; + } else { + push @m, $self if $lhs eq $criterion; + } + } + } else { + my($xarg) = $arg; + if ( $class eq 'CPAN::Bundle' ) { + $xarg =~ s/^(Bundle::)?(.*)/Bundle::$2/; + } elsif ($class eq "CPAN::Distribution") { + $xarg = CPAN::Distribution->normalize($arg); + } else { + $xarg =~ s/:+/::/g; + } + if ($CPAN::META->exists($class,$xarg)) { + $obj = $CPAN::META->instance($class,$xarg); + } elsif ($CPAN::META->exists($class,$arg)) { + $obj = $CPAN::META->instance($class,$arg); + } else { + next; + } + push @m, $obj; + } + } + @m = sort {$a->id cmp $b->id} @m; + if ( $CPAN::DEBUG ) { + my $wantarray = wantarray; + my $join_m = join ",", map {$_->id} @m; + # $self->debug("wantarray[$wantarray]join_m[$join_m]"); + my $count = scalar @m; + $self->debug("class[$class]wantarray[$wantarray]count m[$count]"); + } + return wantarray ? @m : $m[0]; +} + +#-> sub CPAN::Shell::format_result ; +sub format_result { + my($self) = shift; + my($type,@args) = @_; + @args = '/./' unless @args; + my(@result) = $self->expand($type,@args); + my $result = @result == 1 ? + $result[0]->as_string : + @result == 0 ? + "No objects of type $type found for argument @args\n" : + join("", + (map {$_->as_glimpse} @result), + scalar @result, " items found\n", + ); + $result; +} + +#-> sub CPAN::Shell::report_fh ; +{ + my $installation_report_fh; + my $previously_noticed = 0; + + sub report_fh { + return $installation_report_fh if $installation_report_fh; + if ($CPAN::META->has_usable("File::Temp")) { + $installation_report_fh + = File::Temp->new( + dir => File::Spec->tmpdir, + template => 'cpan_install_XXXX', + suffix => '.txt', + unlink => 0, + ); + } + unless ( $installation_report_fh ) { + warn("Couldn't open installation report file; " . + "no report file will be generated." + ) unless $previously_noticed++; + } + } +} + + +# The only reason for this method is currently to have a reliable +# debugging utility that reveals which output is going through which +# channel. No, I don't like the colors ;-) + +# to turn colordebugging on, write +# cpan> o conf colorize_output 1 + +#-> sub CPAN::Shell::colorize_output ; +{ + my $print_ornamented_have_warned = 0; + sub colorize_output { + my $colorize_output = $CPAN::Config->{colorize_output}; + if ($colorize_output && $^O eq 'MSWin32' && !$CPAN::META->has_inst("Win32::Console::ANSI")) { + unless ($print_ornamented_have_warned++) { + # no myprint/mywarn within myprint/mywarn! + warn "Colorize_output is set to true but Win32::Console::ANSI is not +installed. To activate colorized output, please install Win32::Console::ANSI.\n\n"; + } + $colorize_output = 0; + } + if ($colorize_output && !$CPAN::META->has_inst("Term::ANSIColor")) { + unless ($print_ornamented_have_warned++) { + # no myprint/mywarn within myprint/mywarn! + warn "Colorize_output is set to true but Term::ANSIColor is not +installed. To activate colorized output, please install Term::ANSIColor.\n\n"; + } + $colorize_output = 0; + } + return $colorize_output; + } +} + + +#-> sub CPAN::Shell::print_ornamented ; +sub print_ornamented { + my($self,$what,$ornament) = @_; + return unless defined $what; + + local $| = 1; # Flush immediately + if ( $CPAN::Be_Silent ) { + # WARNING: variable Be_Silent is poisoned and must be eliminated. + print {report_fh()} $what; + return; + } + my $swhat = "$what"; # stringify if it is an object + if ($CPAN::Config->{term_is_latin}) { + # note: deprecated, need to switch to $LANG and $LC_* + # courtesy jhi: + $swhat + =~ s{([\xC0-\xDF])([\x80-\xBF])}{chr(ord($1)<<6&0xC0|ord($2)&0x3F)}eg; #}; + } + if ($self->colorize_output) { + if ( $CPAN::DEBUG && $swhat =~ /^Debug\(/ ) { + # if you want to have this configurable, please file a bug report + $ornament = $CPAN::Config->{colorize_debug} || "black on_cyan"; + } + my $color_on = eval { Term::ANSIColor::color($ornament) } || ""; + if ($@) { + print "Term::ANSIColor rejects color[$ornament]: $@\n +Please choose a different color (Hint: try 'o conf init /color/')\n"; + } + # GGOLDBACH/Test-GreaterVersion-0.008 broke without this + # $trailer construct. We want the newline be the last thing if + # there is a newline at the end ensuring that the next line is + # empty for other players + my $trailer = ""; + $trailer = $1 if $swhat =~ s/([\r\n]+)\z//; + print $color_on, + $swhat, + Term::ANSIColor::color("reset"), + $trailer; + } else { + print $swhat; + } +} + +#-> sub CPAN::Shell::myprint ; + +# where is myprint/mywarn/Frontend/etc. documented? Where to use what? +# I think, we send everything to STDOUT and use print for normal/good +# news and warn for news that need more attention. Yes, this is our +# working contract for now. +sub myprint { + my($self,$what) = @_; + $self->print_ornamented($what, + $CPAN::Config->{colorize_print}||'bold blue on_white', + ); +} + +my %already_printed; +#-> sub CPAN::Shell::mywarnonce ; +sub myprintonce { + my($self,$what) = @_; + $self->myprint($what) unless $already_printed{$what}++; +} + +sub optprint { + my($self,$category,$what) = @_; + my $vname = $category . "_verbosity"; + CPAN::HandleConfig->load unless $CPAN::Config_loaded++; + if (!$CPAN::Config->{$vname} + || $CPAN::Config->{$vname} =~ /^v/ + ) { + $CPAN::Frontend->myprint($what); + } +} + +#-> sub CPAN::Shell::myexit ; +sub myexit { + my($self,$what) = @_; + $self->myprint($what); + exit; +} + +#-> sub CPAN::Shell::mywarn ; +sub mywarn { + my($self,$what) = @_; + $self->print_ornamented($what, $CPAN::Config->{colorize_warn}||'bold red on_white'); +} + +my %already_warned; +#-> sub CPAN::Shell::mywarnonce ; +sub mywarnonce { + my($self,$what) = @_; + $self->mywarn($what) unless $already_warned{$what}++; +} + +# only to be used for shell commands +#-> sub CPAN::Shell::mydie ; +sub mydie { + my($self,$what) = @_; + $self->mywarn($what); + + # If it is the shell, we want the following die to be silent, + # but if it is not the shell, we would need a 'die $what'. We need + # to take care that only shell commands use mydie. Is this + # possible? + + die "\n"; +} + +# sub CPAN::Shell::colorable_makemaker_prompt ; +sub colorable_makemaker_prompt { + my($foo,$bar) = @_; + if (CPAN::Shell->colorize_output) { + my $ornament = $CPAN::Config->{colorize_print}||'bold blue on_white'; + my $color_on = eval { Term::ANSIColor::color($ornament); } || ""; + print $color_on; + } + my $ans = ExtUtils::MakeMaker::prompt($foo,$bar); + if (CPAN::Shell->colorize_output) { + print Term::ANSIColor::color('reset'); + } + return $ans; +} + +# use this only for unrecoverable errors! +#-> sub CPAN::Shell::unrecoverable_error ; +sub unrecoverable_error { + my($self,$what) = @_; + my @lines = split /\n/, $what; + my $longest = 0; + for my $l (@lines) { + $longest = length $l if length $l > $longest; + } + $longest = 62 if $longest > 62; + for my $l (@lines) { + if ($l =~ /^\s*$/) { + $l = "\n"; + next; + } + $l = "==> $l"; + if (length $l < 66) { + $l = pack "A66 A*", $l, "<=="; + } + $l .= "\n"; + } + unshift @lines, "\n"; + $self->mydie(join "", @lines); +} + +#-> sub CPAN::Shell::mysleep ; +sub mysleep { + return if $ENV{AUTOMATED_TESTING} || ! -t STDOUT; + my($self, $sleep) = @_; + if (CPAN->has_inst("Time::HiRes")) { + Time::HiRes::sleep($sleep); + } else { + sleep($sleep < 1 ? 1 : int($sleep + 0.5)); + } +} + +#-> sub CPAN::Shell::setup_output ; +sub setup_output { + return if -t STDOUT; + my $odef = select STDERR; + $| = 1; + select STDOUT; + $| = 1; + select $odef; +} + +#-> sub CPAN::Shell::rematein ; +# RE-adme||MA-ke||TE-st||IN-stall : nearly everything runs through here +sub rematein { + my $self = shift; + # this variable was global and disturbed programmers, so localize: + local $CPAN::Distrostatus::something_has_failed_at; + my($meth,@some) = @_; + my @pragma; + while($meth =~ /^(ff?orce|notest)$/) { + push @pragma, $meth; + $meth = shift @some or + $CPAN::Frontend->mydie("Pragma $pragma[-1] used without method: ". + "cannot continue"); + } + setup_output(); + CPAN->debug("pragma[@pragma]meth[$meth]some[@some]") if $CPAN::DEBUG; + + # Here is the place to set "test_count" on all involved parties to + # 0. We then can pass this counter on to the involved + # distributions and those can refuse to test if test_count > X. In + # the first stab at it we could use a 1 for "X". + + # But when do I reset the distributions to start with 0 again? + # Jost suggested to have a random or cycling interaction ID that + # we pass through. But the ID is something that is just left lying + # around in addition to the counter, so I'd prefer to set the + # counter to 0 now, and repeat at the end of the loop. But what + # about dependencies? They appear later and are not reset, they + # enter the queue but not its copy. How do they get a sensible + # test_count? + + # With configure_requires, "get" is vulnerable in recursion. + + my $needs_recursion_protection = "get|make|test|install"; + + # construct the queue + my($s,@s,@qcopy); + STHING: foreach $s (@some) { + my $obj; + if (ref $s) { + CPAN->debug("s is an object[$s]") if $CPAN::DEBUG; + $obj = $s; + } elsif ($s =~ m|[\$\@\%]|) { # looks like a perl variable + } elsif ($s =~ m|^/|) { # looks like a regexp + if (substr($s,-1,1) eq ".") { + $obj = CPAN::Shell->expandany($s); + } else { + my @obj; + CLASS: for my $class (qw(Distribution Bundle Module)) { + if (@obj = $self->expand($class,$s)) { + last CLASS; + } + } + if (@obj) { + if (1==@obj) { + $obj = $obj[0]; + } else { + $CPAN::Frontend->mywarn("Sorry, $meth with a regular expression is ". + "only supported when unambiguous.\nRejecting argument '$s'\n"); + $CPAN::Frontend->mysleep(2); + next STHING; + } + } + } + } elsif ($meth eq "ls") { + $self->globls($s,\@pragma); + next STHING; + } else { + CPAN->debug("calling expandany [$s]") if $CPAN::DEBUG; + $obj = CPAN::Shell->expandany($s); + } + if (0) { + } elsif (ref $obj) { + if ($meth =~ /^($needs_recursion_protection)$/) { + # it would be silly to check for recursion for look or dump + # (we are in CPAN::Shell::rematein) + CPAN->debug("Testing against recursion") if $CPAN::DEBUG; + eval { $obj->color_cmd_tmps(0,1); }; + if ($@) { + if (ref $@ + and $@->isa("CPAN::Exception::RecursiveDependency")) { + $CPAN::Frontend->mywarn($@); + } else { + if (0) { + require Carp; + Carp::confess(sprintf "DEBUG: \$\@[%s]ref[%s]", $@, ref $@); + } + die; + } + } + } + CPAN::Queue->queue_item(qmod => $obj->id, reqtype => "c", optional => ''); + push @qcopy, $obj; + } elsif ($CPAN::META->exists('CPAN::Author',uc($s))) { + $obj = $CPAN::META->instance('CPAN::Author',uc($s)); + if ($meth =~ /^(dump|ls|reports)$/) { + $obj->$meth(); + } else { + $CPAN::Frontend->mywarn( + join "", + "Don't be silly, you can't $meth ", + $obj->fullname, + " ;-)\n" + ); + $CPAN::Frontend->mysleep(2); + } + } elsif ($s =~ m|[\$\@\%]| && $meth eq "dump") { + CPAN::InfoObj->dump($s); + } else { + $CPAN::Frontend + ->mywarn(qq{Warning: Cannot $meth $s, }. + qq{don't know what it is. +Try the command + + i /$s/ + +to find objects with matching identifiers. +}); + $CPAN::Frontend->mysleep(2); + } + } + + # queuerunner (please be warned: when I started to change the + # queue to hold objects instead of names, I made one or two + # mistakes and never found which. I reverted back instead) + QITEM: while (my $q = CPAN::Queue->first) { + my $obj; + my $s = $q->as_string; + my $reqtype = $q->reqtype || ""; + my $optional = $q->optional || ""; + $obj = CPAN::Shell->expandany($s); + unless ($obj) { + # don't know how this can happen, maybe we should panic, + # but maybe we get a solution from the first user who hits + # this unfortunate exception? + $CPAN::Frontend->mywarn("Warning: Could not expand string '$s' ". + "to an object. Skipping.\n"); + $CPAN::Frontend->mysleep(5); + CPAN::Queue->delete_first($s); + next QITEM; + } + $obj->{reqtype} ||= ""; + my $type = ref $obj; + if ( $type eq 'CPAN::Distribution' || $type eq 'CPAN::Bundle' ) { + $obj->{mandatory} ||= ! $optional; # once mandatory, always mandatory + } + elsif ( $type eq 'CPAN::Module' ) { + $obj->{mandatory} ||= ! $optional; # once mandatory, always mandatory + if (my $d = $obj->distribution) { + $d->{mandatory} ||= ! $optional; # once mandatory, always mandatory + } elsif ($optional) { + # the queue object does not know who was recommending/suggesting us:( + # So we only vaguely write "optional". + $CPAN::Frontend->mywarn("Warning: optional module '$s' ". + "not known. Skipping.\n"); + CPAN::Queue->delete_first($s); + next QITEM; + } + } + { + # force debugging because CPAN::SQLite somehow delivers us + # an empty object; + + # local $CPAN::DEBUG = 1024; # Shell; probably fixed now + + CPAN->debug("s[$s]obj-reqtype[$obj->{reqtype}]". + "q-reqtype[$reqtype]") if $CPAN::DEBUG; + } + if ($obj->{reqtype}) { + if ($obj->{reqtype} eq "b" && $reqtype =~ /^[rc]$/) { + $obj->{reqtype} = $reqtype; + if ( + exists $obj->{install} + && + ( + UNIVERSAL::can($obj->{install},"failed") ? + $obj->{install}->failed : + $obj->{install} =~ /^NO/ + ) + ) { + delete $obj->{install}; + $CPAN::Frontend->mywarn + ("Promoting $obj->{ID} from 'build_requires' to 'requires'"); + } + } + } else { + $obj->{reqtype} = $reqtype; + } + + for my $pragma (@pragma) { + if ($pragma + && + $obj->can($pragma)) { + $obj->$pragma($meth); + } + } + if (UNIVERSAL::can($obj, 'called_for')) { + $obj->called_for($s); + } + CPAN->debug(qq{pragma[@pragma]meth[$meth]}. + qq{ID[$obj->{ID}]}) if $CPAN::DEBUG; + + push @qcopy, $obj; + if ($meth =~ /^(report)$/) { # they came here with a pragma? + $self->$meth($obj); + } elsif (! UNIVERSAL::can($obj,$meth)) { + # Must never happen + my $serialized = ""; + if (0) { + } elsif ($CPAN::META->has_inst("YAML::Syck")) { + $serialized = YAML::Syck::Dump($obj); + } elsif ($CPAN::META->has_inst("YAML")) { + $serialized = YAML::Dump($obj); + } elsif ($CPAN::META->has_inst("Data::Dumper")) { + $serialized = Data::Dumper::Dumper($obj); + } else { + require overload; + $serialized = overload::StrVal($obj); + } + CPAN->debug("Going to panic. meth[$meth]s[$s]") if $CPAN::DEBUG; + $CPAN::Frontend->mydie("Panic: obj[$serialized] cannot meth[$meth]"); + } else { + my $upgraded_meth = $meth; + if ( $meth eq "make" and $obj->{reqtype} eq "b" ) { + # rt 86915 + $upgraded_meth = "test"; + } + if ($obj->$upgraded_meth()) { + CPAN::Queue->delete($s); + CPAN->debug("Succeeded and deleted from queue. pragma[@pragma]meth[$meth][s][$s]") if $CPAN::DEBUG; + } else { + CPAN->debug("Failed. pragma[@pragma]meth[$meth]s[$s]") if $CPAN::DEBUG; + } + } + + $obj->undelay; + for my $pragma (@pragma) { + my $unpragma = "un$pragma"; + if ($obj->can($unpragma)) { + $obj->$unpragma(); + } + } + # if any failures occurred and the current object is mandatory, we + # still don't know if *it* failed or if it was another (optional) + # module, so we have to check that explicitly (and expensively) + if ( $CPAN::Config->{halt_on_failure} + && $obj->{mandatory} + && CPAN::Distrostatus::something_has_just_failed() + && $self->mandatory_dist_failed() + ) { + $CPAN::Frontend->mywarn("Stopping: '$meth' failed for '$s'.\n"); + CPAN::Queue->nullify_queue; + last QITEM; + } + CPAN::Queue->delete_first($s); + } + if ($meth =~ /^($needs_recursion_protection)$/) { + for my $obj (@qcopy) { + $obj->color_cmd_tmps(0,0); + } + } +} + +#-> sub CPAN::Shell::recent ; +sub recent { + my($self) = @_; + if ($CPAN::META->has_inst("XML::LibXML")) { + my $url = $CPAN::Defaultrecent; + $CPAN::Frontend->myprint("Fetching '$url'\n"); + unless ($CPAN::META->has_usable("LWP")) { + $CPAN::Frontend->mydie("LWP not installed; cannot continue"); + } + CPAN::LWP::UserAgent->config; + my $Ua; + eval { $Ua = CPAN::LWP::UserAgent->new; }; + if ($@) { + $CPAN::Frontend->mydie("CPAN::LWP::UserAgent->new dies with $@\n"); + } + my $resp = $Ua->get($url); + unless ($resp->is_success) { + $CPAN::Frontend->mydie(sprintf "Could not download '%s': %s\n", $url, $resp->code); + } + $CPAN::Frontend->myprint("DONE\n\n"); + my $xml = XML::LibXML->new->parse_string($resp->content); + if (0) { + my $s = $xml->serialize(2); + $s =~ s/\n\s*\n/\n/g; + $CPAN::Frontend->myprint($s); + return; + } + my @distros; + if ($url =~ /winnipeg/) { + my $pubdate = $xml->findvalue("/rss/channel/pubDate"); + $CPAN::Frontend->myprint(" pubDate: $pubdate\n\n"); + for my $eitem ($xml->findnodes("/rss/channel/item")) { + my $distro = $eitem->findvalue("enclosure/\@url"); + $distro =~ s|.*?/authors/id/./../||; + my $size = $eitem->findvalue("enclosure/\@length"); + my $desc = $eitem->findvalue("description"); + $desc =~ s/.+? - //; + $CPAN::Frontend->myprint("$distro [$size b]\n $desc\n"); + push @distros, $distro; + } + } elsif ($url =~ /search.*uploads.rdf/) { + # xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + # xmlns="http://purl.org/rss/1.0/" + # xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" + # xmlns:dc="http://purl.org/dc/elements/1.1/" + # xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" + # xmlns:admin="http://webns.net/mvcb/" + + + my $dc_date = $xml->findvalue("//*[local-name(.) = 'RDF']/*[local-name(.) = 'channel']/*[local-name(.) = 'date']"); + $CPAN::Frontend->myprint(" dc:date: $dc_date\n\n"); + my $finish_eitem = 0; + local $SIG{INT} = sub { $finish_eitem = 1 }; + EITEM: for my $eitem ($xml->findnodes("//*[local-name(.) = 'RDF']/*[local-name(.) = 'item']")) { + my $distro = $eitem->findvalue("\@rdf:about"); + $distro =~ s|.*~||; # remove up to the tilde before the name + $distro =~ s|/$||; # remove trailing slash + $distro =~ s|([^/]+)|\U$1\E|; # upcase the name + my $author = uc $1 or die "distro[$distro] without author, cannot continue"; + my $desc = $eitem->findvalue("*[local-name(.) = 'description']"); + my $i = 0; + SUBDIRTEST: while () { + last SUBDIRTEST if ++$i >= 6; # half a dozen must do! + if (my @ret = $self->globls("$distro*")) { + @ret = grep {$_->[2] !~ /meta/} @ret; + @ret = grep {length $_->[2]} @ret; + if (@ret) { + $distro = "$author/$ret[0][2]"; + last SUBDIRTEST; + } + } + $distro =~ s|/|/*/|; # allow it to reside in a subdirectory + } + + next EITEM if $distro =~ m|\*|; # did not find the thing + $CPAN::Frontend->myprint("____$desc\n"); + push @distros, $distro; + last EITEM if $finish_eitem; + } + } + return \@distros; + } else { + # deprecated old version + $CPAN::Frontend->mydie("no XML::LibXML installed, cannot continue\n"); + } +} + +#-> sub CPAN::Shell::smoke ; +sub smoke { + my($self) = @_; + my $distros = $self->recent; + DISTRO: for my $distro (@$distros) { + next if $distro =~ m|/Bundle-|; # XXX crude heuristic to skip bundles + $CPAN::Frontend->myprint(sprintf "Downloading and testing '$distro'\n"); + { + my $skip = 0; + local $SIG{INT} = sub { $skip = 1 }; + for (0..9) { + $CPAN::Frontend->myprint(sprintf "\r%2d (Hit ^C to skip)", 10-$_); + sleep 1; + if ($skip) { + $CPAN::Frontend->myprint(" skipped\n"); + next DISTRO; + } + } + } + $CPAN::Frontend->myprint("\r \n"); # leave the dirty line with a newline + $self->test($distro); + } +} + +{ + # set up the dispatching methods + no strict "refs"; + for my $command (qw( + clean + cvs_import + dump + force + fforce + get + install + look + ls + make + notest + perldoc + readme + reports + test + )) { + *$command = sub { shift->rematein($command, @_); }; + } +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Bundle; +use strict; +use CPAN::Module; +@CPAN::Bundle::ISA = qw(CPAN::Module); + +use vars qw( + $VERSION +); +$VERSION = "5.5003"; + +sub look { + my $self = shift; + $CPAN::Frontend->myprint($self->as_string); +} + +#-> CPAN::Bundle::undelay +sub undelay { + my $self = shift; + delete $self->{later}; + for my $c ( $self->contains ) { + my $obj = CPAN::Shell->expandany($c) or next; + if ($obj->id eq $self->id){ + my $id = $obj->id; + $CPAN::Frontend->mywarn("$id seems to contain itself, skipping\n"); + next; + } + $obj->undelay; + } +} + +# mark as dirty/clean +#-> sub CPAN::Bundle::color_cmd_tmps ; +sub color_cmd_tmps { + my($self) = shift; + my($depth) = shift || 0; + my($color) = shift || 0; + my($ancestors) = shift || []; + # a module needs to recurse to its cpan_file, a distribution needs + # to recurse into its prereq_pms, a bundle needs to recurse into its modules + + return if exists $self->{incommandcolor} + && $color==1 + && $self->{incommandcolor}==$color; + if ($depth>=$CPAN::MAX_RECURSION) { + my $e = CPAN::Exception::RecursiveDependency->new($ancestors); + if ($e->is_resolvable) { + return $self->{incommandcolor}=2; + } else { + die $e; + } + } + # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1; + + for my $c ( $self->contains ) { + my $obj = CPAN::Shell->expandany($c) or next; + CPAN->debug("c[$c]obj[$obj]") if $CPAN::DEBUG; + $obj->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]); + } + # never reached code? + #if ($color==0) { + #delete $self->{badtestcnt}; + #} + $self->{incommandcolor} = $color; +} + +#-> sub CPAN::Bundle::as_string ; +sub as_string { + my($self) = @_; + $self->contains; + # following line must be "=", not "||=" because we have a moving target + $self->{INST_VERSION} = $self->inst_version; + return $self->SUPER::as_string; +} + +#-> sub CPAN::Bundle::contains ; +sub contains { + my($self) = @_; + my($inst_file) = $self->inst_file || ""; + my($id) = $self->id; + $self->debug("inst_file[$inst_file]id[$id]") if $CPAN::DEBUG; + if ($inst_file && CPAN::Version->vlt($self->inst_version,$self->cpan_version)) { + undef $inst_file; + } + unless ($inst_file) { + # Try to get at it in the cpan directory + $self->debug("no inst_file") if $CPAN::DEBUG; + my $cpan_file; + $CPAN::Frontend->mydie("I don't know a bundle with ID $id\n") unless + $cpan_file = $self->cpan_file; + if ($cpan_file eq "N/A") { + $CPAN::Frontend->mydie("Bundle $id not found on disk and not on CPAN. + Maybe stale symlink? Maybe removed during session? Giving up.\n"); + } + my $dist = $CPAN::META->instance('CPAN::Distribution', + $self->cpan_file); + $self->debug("before get id[$dist->{ID}]") if $CPAN::DEBUG; + $dist->get; + $self->debug("after get id[$dist->{ID}]") if $CPAN::DEBUG; + my($todir) = $CPAN::Config->{'cpan_home'}; + my(@me,$from,$to,$me); + @me = split /::/, $self->id; + $me[-1] .= ".pm"; + $me = File::Spec->catfile(@me); + $from = $self->find_bundle_file($dist->{build_dir},join('/',@me)); + $to = File::Spec->catfile($todir,$me); + File::Path::mkpath(File::Basename::dirname($to)); + File::Copy::copy($from, $to) + or Carp::confess("Couldn't copy $from to $to: $!"); + $inst_file = $to; + } + my @result; + my $fh = FileHandle->new; + local $/ = "\n"; + open($fh,$inst_file) or die "Could not open '$inst_file': $!"; + my $in_cont = 0; + $self->debug("inst_file[$inst_file]") if $CPAN::DEBUG; + while (<$fh>) { + $in_cont = m/^=(?!head1\s+(?i-xsm:CONTENTS))/ ? 0 : + m/^=head1\s+(?i-xsm:CONTENTS)/ ? 1 : $in_cont; + next unless $in_cont; + next if /^=/; + s/\#.*//; + next if /^\s+$/; + chomp; + push @result, (split " ", $_, 2)[0]; + } + close $fh; + delete $self->{STATUS}; + $self->{CONTAINS} = \@result; + $self->debug("CONTAINS[@result]") if $CPAN::DEBUG; + unless (@result) { + $CPAN::Frontend->mywarn(qq{ +The bundle file "$inst_file" may be a broken +bundlefile. It seems not to contain any bundle definition. +Please check the file and if it is bogus, please delete it. +Sorry for the inconvenience. +}); + } + @result; +} + +#-> sub CPAN::Bundle::find_bundle_file +# $where is in local format, $what is in unix format +sub find_bundle_file { + my($self,$where,$what) = @_; + $self->debug("where[$where]what[$what]") if $CPAN::DEBUG; +### The following two lines let CPAN.pm become Bundle/CPAN.pm :-( +### my $bu = File::Spec->catfile($where,$what); +### return $bu if -f $bu; + my $manifest = File::Spec->catfile($where,"MANIFEST"); + unless (-f $manifest) { + require ExtUtils::Manifest; + my $cwd = CPAN::anycwd(); + $self->safe_chdir($where); + ExtUtils::Manifest::mkmanifest(); + $self->safe_chdir($cwd); + } + my $fh = FileHandle->new($manifest) + or Carp::croak("Couldn't open $manifest: $!"); + local($/) = "\n"; + my $bundle_filename = $what; + $bundle_filename =~ s|Bundle.*/||; + my $bundle_unixpath; + while (<$fh>) { + next if /^\s*\#/; + my($file) = /(\S+)/; + if ($file =~ m|\Q$what\E$|) { + $bundle_unixpath = $file; + # return File::Spec->catfile($where,$bundle_unixpath); # bad + last; + } + # retry if she managed to have no Bundle directory + $bundle_unixpath = $file if $file =~ m|\Q$bundle_filename\E$|; + } + return File::Spec->catfile($where, split /\//, $bundle_unixpath) + if $bundle_unixpath; + Carp::croak("Couldn't find a Bundle file in $where"); +} + +# needs to work quite differently from Module::inst_file because of +# cpan_home/Bundle/ directory and the possibility that we have +# shadowing effect. As it makes no sense to take the first in @INC for +# Bundles, we parse them all for $VERSION and take the newest. + +#-> sub CPAN::Bundle::inst_file ; +sub inst_file { + my($self) = @_; + my($inst_file); + my(@me); + @me = split /::/, $self->id; + $me[-1] .= ".pm"; + my($incdir,$bestv); + foreach $incdir ($CPAN::Config->{'cpan_home'},@INC) { + my $parsefile = File::Spec->catfile($incdir, @me); + CPAN->debug("parsefile[$parsefile]") if $CPAN::DEBUG; + next unless -f $parsefile; + my $have = eval { MM->parse_version($parsefile); }; + if ($@) { + $CPAN::Frontend->mywarn("Error while parsing version number in file '$parsefile'\n"); + } + if (!$bestv || CPAN::Version->vgt($have,$bestv)) { + $self->{INST_FILE} = $parsefile; + $self->{INST_VERSION} = $bestv = $have; + } + } + $self->{INST_FILE}; +} + +#-> sub CPAN::Bundle::inst_version ; +sub inst_version { + my($self) = @_; + $self->inst_file; # finds INST_VERSION as side effect + $self->{INST_VERSION}; +} + +#-> sub CPAN::Bundle::rematein ; +sub rematein { + my($self,$meth) = @_; + $self->debug("self[$self] meth[$meth]") if $CPAN::DEBUG; + my($id) = $self->id; + Carp::croak( "Can't $meth $id, don't have an associated bundle file. :-(\n" ) + unless $self->inst_file || $self->cpan_file; + my($s,%fail); + for $s ($self->contains) { + my($type) = $s =~ m|/| ? 'CPAN::Distribution' : + $s =~ m|^Bundle::| ? 'CPAN::Bundle' : 'CPAN::Module'; + if ($type eq 'CPAN::Distribution') { + $CPAN::Frontend->mywarn(qq{ +The Bundle }.$self->id.qq{ contains +explicitly a file '$s'. +Going to $meth that. +}); + $CPAN::Frontend->mysleep(5); + } + # possibly noisy action: + $self->debug("type[$type] s[$s]") if $CPAN::DEBUG; + my $obj = $CPAN::META->instance($type,$s); + $obj->{reqtype} = $self->{reqtype}; + # $obj->$meth(); + # XXX should optional be based on whether bundle was optional? -- xdg, 2012-04-01 + # A: Sure, what could demand otherwise? --andk, 2013-11-25 + CPAN::Queue->queue_item(qmod => $obj->id, reqtype => $self->{reqtype}, optional => !$self->{mandatory}); + } +} + +# If a bundle contains another that contains an xs_file we have here, +# we just don't bother I suppose +#-> sub CPAN::Bundle::xs_file +sub xs_file { + return 0; +} + +#-> sub CPAN::Bundle::force ; +sub fforce { shift->rematein('fforce',@_); } +#-> sub CPAN::Bundle::force ; +sub force { shift->rematein('force',@_); } +#-> sub CPAN::Bundle::notest ; +sub notest { shift->rematein('notest',@_); } +#-> sub CPAN::Bundle::get ; +sub get { shift->rematein('get',@_); } +#-> sub CPAN::Bundle::make ; +sub make { shift->rematein('make',@_); } +#-> sub CPAN::Bundle::test ; +sub test { + my $self = shift; + # $self->{badtestcnt} ||= 0; + $self->rematein('test',@_); +} +#-> sub CPAN::Bundle::install ; +sub install { + my $self = shift; + $self->rematein('install',@_); +} +#-> sub CPAN::Bundle::clean ; +sub clean { shift->rematein('clean',@_); } + +#-> sub CPAN::Bundle::uptodate ; +sub uptodate { + my($self) = @_; + return 0 unless $self->SUPER::uptodate; # we must have the current Bundle def + my $c; + foreach $c ($self->contains) { + my $obj = CPAN::Shell->expandany($c); + return 0 unless $obj->uptodate; + } + return 1; +} + +#-> sub CPAN::Bundle::readme ; +sub readme { + my($self) = @_; + my($file) = $self->cpan_file or $CPAN::Frontend->myprint(qq{ +No File found for bundle } . $self->id . qq{\n}), return; + $self->debug("self[$self] file[$file]") if $CPAN::DEBUG; + $CPAN::META->instance('CPAN::Distribution',$file)->readme; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Complete; +use strict; +@CPAN::Complete::ISA = qw(CPAN::Debug); +# Q: where is the "How do I add a new command" HOWTO? +# A: git log -p -1 355c44e9caaec857e4b12f51afb96498833c3e36 where andk added the report command +@CPAN::Complete::COMMANDS = sort qw( + ? ! a b d h i m o q r u + autobundle + bye + clean + cvs_import + dump + exit + failed + force + fforce + hosts + install + install_tested + is_tested + look + ls + make + mkmyconfig + notest + perldoc + quit + readme + recent + recompile + reload + report + reports + scripts + smoke + test + upgrade +); + +use vars qw( + $VERSION +); +$VERSION = "5.5001"; + +package CPAN::Complete; +use strict; + +sub gnu_cpl { + my($text, $line, $start, $end) = @_; + my(@perlret) = cpl($text, $line, $start); + # find longest common match. Can anybody show me how to peruse + # T::R::Gnu to have this done automatically? Seems expensive. + return () unless @perlret; + my($newtext) = $text; + for (my $i = length($text)+1;;$i++) { + last unless length($perlret[0]) && length($perlret[0]) >= $i; + my $try = substr($perlret[0],0,$i); + my @tries = grep {substr($_,0,$i) eq $try} @perlret; + # warn "try[$try]tries[@tries]"; + if (@tries == @perlret) { + $newtext = $try; + } else { + last; + } + } + ($newtext,@perlret); +} + +#-> sub CPAN::Complete::cpl ; +sub cpl { + my($word,$line,$pos) = @_; + $word ||= ""; + $line ||= ""; + $pos ||= 0; + CPAN->debug("word [$word] line[$line] pos[$pos]") if $CPAN::DEBUG; + $line =~ s/^\s*//; + if ($line =~ s/^((?:notest|f?force)\s*)//) { + $pos -= length($1); + } + my @return; + if ($pos == 0 || $line =~ /^(?:h(?:elp)?|\?)\s/) { + @return = grep /^\Q$word\E/, @CPAN::Complete::COMMANDS; + } elsif ( $line !~ /^[\!abcdghimorutl]/ ) { + @return = (); + } elsif ($line =~ /^a\s/) { + @return = cplx('CPAN::Author',uc($word)); + } elsif ($line =~ /^ls\s/) { + my($author,$rest) = $word =~ m|([^/]+)/?(.*)|; + @return = $rest ? () : map {"$_/"} cplx('CPAN::Author',uc($author||"")); + if (0 && 1==@return) { # XXX too slow and even wrong when there is a * already + @return = grep /^\Q$word\E/, map {"$author/$_->[2]"} CPAN::Shell->expand("Author",$author)->ls("$rest*","2"); + } + } elsif ($line =~ /^b\s/) { + CPAN::Shell->local_bundles; + @return = cplx('CPAN::Bundle',$word); + } elsif ($line =~ /^d\s/) { + @return = cplx('CPAN::Distribution',$word); + } elsif ($line =~ m/^( + [mru]|make|clean|dump|get|test|install|readme|look|cvs_import|perldoc|recent + )\s/x ) { + if ($word =~ /^Bundle::/) { + CPAN::Shell->local_bundles; + } + @return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word)); + } elsif ($line =~ /^i\s/) { + @return = cpl_any($word); + } elsif ($line =~ /^reload\s/) { + @return = cpl_reload($word,$line,$pos); + } elsif ($line =~ /^o\s/) { + @return = cpl_option($word,$line,$pos); + } elsif ($line =~ m/^\S+\s/ ) { + # fallback for future commands and what we have forgotten above + @return = (cplx('CPAN::Module',$word),cplx('CPAN::Bundle',$word)); + } else { + @return = (); + } + return @return; +} + +#-> sub CPAN::Complete::cplx ; +sub cplx { + my($class, $word) = @_; + if (CPAN::_sqlite_running()) { + $CPAN::SQLite->search($class, "^\Q$word\E"); + } + my $method = "id"; + $method = "pretty_id" if $class eq "CPAN::Distribution"; + sort grep /^\Q$word\E/, map { $_->$method() } $CPAN::META->all_objects($class); +} + +#-> sub CPAN::Complete::cpl_any ; +sub cpl_any { + my($word) = shift; + return ( + cplx('CPAN::Author',$word), + cplx('CPAN::Bundle',$word), + cplx('CPAN::Distribution',$word), + cplx('CPAN::Module',$word), + ); +} + +#-> sub CPAN::Complete::cpl_reload ; +sub cpl_reload { + my($word,$line,$pos) = @_; + $word ||= ""; + my(@words) = split " ", $line; + CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG; + my(@ok) = qw(cpan index); + return @ok if @words == 1; + return grep /^\Q$word\E/, @ok if @words == 2 && $word; +} + +#-> sub CPAN::Complete::cpl_option ; +sub cpl_option { + my($word,$line,$pos) = @_; + $word ||= ""; + my(@words) = split " ", $line; + CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG; + my(@ok) = qw(conf debug); + return @ok if @words == 1; + return grep /^\Q$word\E/, @ok if @words == 2 && length($word); + if (0) { + } elsif ($words[1] eq 'index') { + return (); + } elsif ($words[1] eq 'conf') { + return CPAN::HandleConfig::cpl(@_); + } elsif ($words[1] eq 'debug') { + return sort grep /^\Q$word\E/i, + sort keys %CPAN::DEBUG, 'all'; + } +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +package CPAN::Debug; +use strict; +use vars qw($VERSION); + +$VERSION = "5.5001"; +# module is internal to CPAN.pm + +%CPAN::DEBUG = qw[ + CPAN 1 + Index 2 + InfoObj 4 + Author 8 + Distribution 16 + Bundle 32 + Module 64 + CacheMgr 128 + Complete 256 + FTP 512 + Shell 1024 + Eval 2048 + HandleConfig 4096 + Tarzip 8192 + Version 16384 + Queue 32768 + FirstTime 65536 +]; + +$CPAN::DEBUG ||= 0; + +#-> sub CPAN::Debug::debug ; +sub debug { + my($self,$arg) = @_; + + my @caller; + my $i = 0; + while () { + my(@c) = (caller($i))[0 .. ($i ? 3 : 2)]; + last unless defined $c[0]; + push @caller, \@c; + for (0,3) { + last if $_ > $#c; + $c[$_] =~ s/.*:://; + } + for (1) { + $c[$_] =~ s|.*/||; + } + last if ++$i>=3; + } + pop @caller; + if ($CPAN::DEBUG{$caller[0][0]} & $CPAN::DEBUG) { + if ($arg and ref $arg) { + eval { require Data::Dumper }; + if ($@) { + $CPAN::Frontend->myprint("Debug(\n" . $arg->as_string . ")\n"); + } else { + $CPAN::Frontend->myprint("Debug(\n" . Data::Dumper::Dumper($arg) . ")\n"); + } + } else { + my $outer = ""; + local $" = ","; + if (@caller>1) { + $outer = ",[@{$caller[1]}]"; + } + $CPAN::Frontend->myprint("Debug(@{$caller[0]}$outer): $arg\n"); + } + } +} + +1; + +__END__ + +package CPAN::HandleConfig; +use strict; +use vars qw(%can %keys $loading $VERSION); +use File::Path (); +use File::Spec (); +use File::Basename (); +use Carp (); + + +$VERSION = "5.5008"; # see also CPAN::Config::VERSION at end of file + +%can = ( + commit => "Commit changes to disk", + defaults => "Reload defaults from disk", + help => "Short help about 'o conf' usage", + init => "Interactive setting of all options", +); + +# Q: where is the "How do I add a new config option" HOWTO? +# A1: svn diff -r 757:758 # where dagolden added test_report [git e997b71de88f1019a1472fc13cb97b1b7f96610f] +# A2: svn diff -r 985:986 # where andk added yaml_module [git 312b6d9b12b1bdec0b6e282d853482145475021f] +# A3: 1. add new config option to %keys below +# 2. add a Pod description in CPAN::FirstTime; it should include a +# prompt line; see others for examples +# 3. add a "matcher" section in CPAN::FirstTime::init that includes +# a prompt function; see others for examples +# 4. add config option to documentation section in CPAN.pm + +%keys = map { $_ => undef } + ( + "applypatch", + "auto_commit", + "build_cache", + "build_dir", + "build_dir_reuse", + "build_requires_install_policy", + "bzip2", + "cache_metadata", + "check_sigs", + "cleanup_after_install", + "colorize_debug", + "colorize_output", + "colorize_print", + "colorize_warn", + "commandnumber_in_prompt", + "commands_quote", + "connect_to_internet_ok", + "cpan_home", + "curl", + "dontload_hash", # deprecated after 1.83_68 (rev. 581) + "dontload_list", + "ftp", + "ftp_passive", + "ftp_proxy", + "ftpstats_size", + "ftpstats_period", + "getcwd", + "gpg", + "gzip", + "halt_on_failure", + "histfile", + "histsize", + "http_proxy", + "inactivity_timeout", + "index_expire", + "inhibit_startup_message", + "keep_source_where", + "load_module_verbosity", + "lynx", + "make", + "make_arg", + "make_install_arg", + "make_install_make_command", + "makepl_arg", + "mbuild_arg", + "mbuild_install_arg", + "mbuild_install_build_command", + "mbuildpl_arg", + "ncftp", + "ncftpget", + "no_proxy", + "pager", + "password", + "patch", + "patches_dir", + "perl5lib_verbosity", + "plugin_list", + "prefer_external_tar", + "prefer_installer", + "prefs_dir", + "prerequisites_policy", + "proxy_pass", + "proxy_user", + "randomize_urllist", + "recommends_policy", + "scan_cache", + "shell", + "show_unparsable_versions", + "show_upload_date", + "show_zero_versions", + "suggests_policy", + "tar", + "tar_verbosity", + "term_is_latin", + "term_ornaments", + "test_report", + "trust_test_report_history", + "unzip", + "urllist", + "use_prompt_default", + "use_sqlite", + "username", + "version_timeout", + "wait_list", + "wget", + "yaml_load_code", + "yaml_module", + ); + +my %prefssupport = map { $_ => 1 } + ( + "build_requires_install_policy", + "check_sigs", + "make", + "make_install_make_command", + "prefer_installer", + "test_report", + ); + +# returns true on successful action +sub edit { + my($self,@args) = @_; + return unless @args; + CPAN->debug("self[$self]args[".join(" | ",@args)."]"); + my($o,$str,$func,$args,$key_exists); + $o = shift @args; + if($can{$o}) { + my $success = $self->$o(args => \@args); # o conf init => sub init => sub load + unless ($success) { + die "Panic: could not configure CPAN.pm for args [@args]. Giving up."; + } + } else { + CPAN->debug("o[$o]") if $CPAN::DEBUG; + unless (exists $keys{$o}) { + $CPAN::Frontend->mywarn("Warning: unknown configuration variable '$o'\n"); + } + my $changed; + + + # one day I used randomize_urllist for a boolean, so we must + # list them explicitly --ak + if (0) { + } elsif ($o =~ /^(wait_list|urllist|dontload_list|plugin_list)$/) { + + # + # ARRAYS + # + + $func = shift @args; + $func ||= ""; + CPAN->debug("func[$func]args[@args]") if $CPAN::DEBUG; + # Let's avoid eval, it's easier to comprehend without. + if ($func eq "push") { + push @{$CPAN::Config->{$o}}, @args; + $changed = 1; + } elsif ($func eq "pop") { + pop @{$CPAN::Config->{$o}}; + $changed = 1; + } elsif ($func eq "shift") { + shift @{$CPAN::Config->{$o}}; + $changed = 1; + } elsif ($func eq "unshift") { + unshift @{$CPAN::Config->{$o}}, @args; + $changed = 1; + } elsif ($func eq "splice") { + my $offset = shift @args || 0; + my $length = shift @args || 0; + splice @{$CPAN::Config->{$o}}, $offset, $length, @args; # may warn + $changed = 1; + } elsif ($func) { + $CPAN::Config->{$o} = [$func, @args]; + $changed = 1; + } else { + $self->prettyprint($o); + } + if ($changed) { + if ($o eq "urllist") { + # reset the cached values + undef $CPAN::FTP::Thesite; + undef $CPAN::FTP::Themethod; + $CPAN::Index::LAST_TIME = 0; + } elsif ($o eq "dontload_list") { + # empty it, it will be built up again + $CPAN::META->{dontload_hash} = {}; + } + } + } elsif ($o =~ /_hash$/) { + + # + # HASHES + # + + if (@args==1 && $args[0] eq "") { + @args = (); + } elsif (@args % 2) { + push @args, ""; + } + $CPAN::Config->{$o} = { @args }; + $changed = 1; + } else { + + # + # SCALARS + # + + if (defined $args[0]) { + $CPAN::CONFIG_DIRTY = 1; + $CPAN::Config->{$o} = $args[0]; + $changed = 1; + } + $self->prettyprint($o) + if exists $keys{$o} or defined $CPAN::Config->{$o}; + } + if ($changed) { + if ($CPAN::Config->{auto_commit}) { + $self->commit; + } else { + $CPAN::CONFIG_DIRTY = 1; + $CPAN::Frontend->myprint("Please use 'o conf commit' to ". + "make the config permanent!\n\n"); + } + } + } +} + +sub prettyprint { + my($self,$k) = @_; + my $v = $CPAN::Config->{$k}; + if (ref $v) { + my(@report); + if (ref $v eq "ARRAY") { + @report = map {"\t$_ \[$v->[$_]]\n"} 0..$#$v; + } else { + @report = map + { + sprintf "\t%-18s => %s\n", + "[$_]", + defined $v->{$_} ? "[$v->{$_}]" : "undef" + } sort keys %$v; + } + $CPAN::Frontend->myprint( + join( + "", + sprintf( + " %-18s\n", + $k + ), + @report + ) + ); + } elsif (defined $v) { + $CPAN::Frontend->myprint(sprintf " %-18s [%s]\n", $k, $v); + } else { + $CPAN::Frontend->myprint(sprintf " %-18s undef\n", $k); + } +} + +# generally, this should be called without arguments so that the currently +# loaded config file is where changes are committed. +sub commit { + my($self,@args) = @_; + CPAN->debug("args[@args]") if $CPAN::DEBUG; + if ($CPAN::RUN_DEGRADED) { + $CPAN::Frontend->mydie( + "'o conf commit' disabled in ". + "degraded mode. Maybe try\n". + " !undef \$CPAN::RUN_DEGRADED\n" + ); + } + my ($configpm, $must_reload); + + # XXX does anything do this? can it be simplified? -- dagolden, 2011-01-19 + if (@args) { + if ($args[0] eq "args") { + # we have not signed that contract + } else { + $configpm = $args[0]; + } + } + + # use provided name or the current config or create a new MyConfig + $configpm ||= require_myconfig_or_config() || make_new_config(); + + # commit to MyConfig if we can't write to Config + if ( ! -w $configpm && $configpm =~ m{CPAN/Config\.pm} ) { + my $myconfig = _new_config_name(); + $CPAN::Frontend->mywarn( + "Your $configpm file\n". + "is not writable. I will attempt to write your configuration to\n" . + "$myconfig instead.\n\n" + ); + $configpm = make_new_config(); + $must_reload++; # so it gets loaded as $INC{'CPAN/MyConfig.pm'} + } + + # XXX why not just "-w $configpm"? -- dagolden, 2011-01-19 + my($mode); + if (-f $configpm) { + $mode = (stat $configpm)[2]; + if ($mode && ! -w _) { + _die_cant_write_config($configpm); + } + } + + $self->_write_config_file($configpm); + require_myconfig_or_config() if $must_reload; + + #$mode = 0444 | ( $mode & 0111 ? 0111 : 0 ); + #chmod $mode, $configpm; +###why was that so? $self->defaults; + $CPAN::Frontend->myprint("commit: wrote '$configpm'\n"); + $CPAN::CONFIG_DIRTY = 0; + 1; +} + +sub _write_config_file { + my ($self, $configpm) = @_; + my $msg; + $msg = <<EOF if $configpm =~ m{CPAN/Config\.pm}; + +# This is CPAN.pm's systemwide configuration file. This file provides +# defaults for users, and the values can be changed in a per-user +# configuration file. + +EOF + $msg ||= "\n"; + my($fh) = FileHandle->new; + rename $configpm, "$configpm~" if -f $configpm; + open $fh, ">$configpm" or + $CPAN::Frontend->mydie("Couldn't open >$configpm: $!"); + $fh->print(qq[$msg\$CPAN::Config = \{\n]); + foreach (sort keys %$CPAN::Config) { + unless (exists $keys{$_}) { + # do not drop them: forward compatibility! + $CPAN::Frontend->mywarn("Unknown config variable '$_'\n"); + next; + } + $fh->print( + " '$_' => ", + $self->neatvalue($CPAN::Config->{$_}), + ",\n" + ); + } + $fh->print("};\n1;\n__END__\n"); + close $fh; + + return; +} + + +# stolen from MakeMaker; not taking the original because it is buggy; +# bugreport will have to say: keys of hashes remain unquoted and can +# produce syntax errors +sub neatvalue { + my($self, $v) = @_; + return "undef" unless defined $v; + my($t) = ref $v; + unless ($t) { + $v =~ s/\\/\\\\/g; + return "q[$v]"; + } + if ($t eq 'ARRAY') { + my(@m, @neat); + push @m, "["; + foreach my $elem (@$v) { + push @neat, "q[$elem]"; + } + push @m, join ", ", @neat; + push @m, "]"; + return join "", @m; + } + return "$v" unless $t eq 'HASH'; + my @m; + foreach my $key (sort keys %$v) { + my $val = $v->{$key}; + push(@m,"q[$key]=>".$self->neatvalue($val)) ; + } + return "{ ".join(', ',@m)." }"; +} + +sub defaults { + my($self) = @_; + if ($CPAN::RUN_DEGRADED) { + $CPAN::Frontend->mydie( + "'o conf defaults' disabled in ". + "degraded mode. Maybe try\n". + " !undef \$CPAN::RUN_DEGRADED\n" + ); + } + my $done; + for my $config (qw(CPAN/MyConfig.pm CPAN/Config.pm)) { + if ($INC{$config}) { + CPAN->debug("INC{'$config'}[$INC{$config}]") if $CPAN::DEBUG; + CPAN::Shell->_reload_this($config,{reloforce => 1}); + $CPAN::Frontend->myprint("'$INC{$config}' reread\n"); + last; + } + } + $CPAN::CONFIG_DIRTY = 0; + 1; +} + + +{ + # Instead of patching the guess, set commands_quote + # to the right value + my ($quotes,$use_quote) + = $^O eq 'MSWin32' + ? ('"', '"') + : (q{"'}, "'") + ; + + sub safe_quote { + my ($self, $command) = @_; + # Set up quote/default quote + my $quote = $CPAN::Config->{commands_quote} || $quotes; + + if ($quote ne ' ' + and defined($command ) + and $command =~ /\s/ + and $command !~ /[$quote]/) { + return qq<$use_quote$command$use_quote> + } + return $command; + } +} + +sub init { + my($self,@args) = @_; + CPAN->debug("self[$self]args[".join(",",@args)."]"); + $self->load(do_init => 1, @args); + 1; +} + +# Loads CPAN::MyConfig or fall-back to CPAN::Config. Will not reload a file +# if already loaded. Returns the path to the file %INC or else the empty string +# +# Note -- if CPAN::Config were loaded and CPAN::MyConfig subsequently +# created, calling this again will leave *both* in %INC + +sub require_myconfig_or_config () { + if ( $INC{"CPAN/MyConfig.pm"} || _try_loading("CPAN::MyConfig", cpan_home())) { + return $INC{"CPAN/MyConfig.pm"}; + } + elsif ( $INC{"CPAN/Config.pm"} || _try_loading("CPAN::Config") ) { + return $INC{"CPAN/Config.pm"}; + } + else { + return q{}; + } +} + +# Load a module, but ignore "can't locate..." errors +# Optionally take a list of directories to add to @INC for the load +sub _try_loading { + my ($module, @dirs) = @_; + (my $file = $module) =~ s{::}{/}g; + $file .= ".pm"; + + local @INC = @INC; + for my $dir ( @dirs ) { + if ( -f File::Spec->catfile($dir, $file) ) { + unshift @INC, $dir; + last; + } + } + + eval { require $file }; + my $err_myconfig = $@; + if ($err_myconfig and $err_myconfig !~ m#locate \Q$file\E#) { + die "Error while requiring ${module}:\n$err_myconfig"; + } + return $INC{$file}; +} + +# prioritized list of possible places for finding "CPAN/MyConfig.pm" +sub cpan_home_dir_candidates { + my @dirs; + my $old_v = $CPAN::Config->{load_module_verbosity}; + $CPAN::Config->{load_module_verbosity} = q[none]; + if ($CPAN::META->has_usable('File::HomeDir')) { + if ($^O ne 'darwin') { + push @dirs, File::HomeDir->my_data; + # my_data is ~/Library/Application Support on darwin, + # which causes issues in the toolchain. + } + push @dirs, File::HomeDir->my_home; + } + # Windows might not have HOME, so check it first + push @dirs, $ENV{HOME} if $ENV{HOME}; + # Windows might have these instead + push( @dirs, File::Spec->catpath($ENV{HOMEDRIVE}, $ENV{HOMEPATH}, '') ) + if $ENV{HOMEDRIVE} && $ENV{HOMEPATH}; + push @dirs, $ENV{USERPROFILE} if $ENV{USERPROFILE}; + + $CPAN::Config->{load_module_verbosity} = $old_v; + my $dotcpan = $^O eq 'VMS' ? '_cpan' : '.cpan'; + @dirs = map { File::Spec->catdir($_, $dotcpan) } grep { defined } @dirs; + return wantarray ? @dirs : $dirs[0]; +} + +sub load { + my($self, %args) = @_; + $CPAN::Be_Silent+=0; # protect against 'used only once' + $CPAN::Be_Silent++ if $args{be_silent}; # do not use; planned to be removed in 2011 + my $do_init = delete $args{do_init} || 0; + my $make_myconfig = delete $args{make_myconfig}; + $loading = 0 unless defined $loading; + + my $configpm = require_myconfig_or_config; + my @miss = $self->missing_config_data; + CPAN->debug("do_init[$do_init]loading[$loading]miss[@miss]") if $CPAN::DEBUG; + return unless $do_init || @miss; + + # I'm not how we'd ever wind up in a recursive loop, but I'm leaving + # this here for safety's sake -- dagolden, 2011-01-19 + return if $loading; + local $loading = ($loading||0) + 1; + + # Warn if we have a config file, but things were found missing + if ($configpm && @miss && !$do_init) { + if ($make_myconfig || ( ! -w $configpm && $configpm =~ m{CPAN/Config\.pm})) { + $configpm = make_new_config(); + $CPAN::Frontend->myprint(<<END); +The system CPAN configuration file has provided some default values, +but you need to complete the configuration dialog for CPAN.pm. +Configuration will be written to + <<$configpm>> +END + } + else { + $CPAN::Frontend->myprint(<<END); +Sorry, we have to rerun the configuration dialog for CPAN.pm due to +some missing parameters. Configuration will be written to + <<$configpm>> + +END + } + } + + require CPAN::FirstTime; + return CPAN::FirstTime::init($configpm || make_new_config(), %args); +} + +# Creates a new, empty config file at the preferred location +# Any existing will be renamed with a ".bak" suffix if possible +# If the file cannot be created, an exception is thrown +sub make_new_config { + my $configpm = _new_config_name(); + my $configpmdir = File::Basename::dirname( $configpm ); + File::Path::mkpath($configpmdir) unless -d $configpmdir; + + if ( -w $configpmdir ) { + #_#_# following code dumped core on me with 5.003_11, a.k. + if( -f $configpm ) { + my $configpm_bak = "$configpm.bak"; + unlink $configpm_bak if -f $configpm_bak; + if( rename $configpm, $configpm_bak ) { + $CPAN::Frontend->mywarn(<<END); +Old configuration file $configpm + moved to $configpm_bak +END + } + } + my $fh = FileHandle->new; + if ($fh->open(">$configpm")) { + $fh->print("1;\n"); + return $configpm; + } + } + _die_cant_write_config($configpm); +} + +sub _die_cant_write_config { + my ($configpm) = @_; + $CPAN::Frontend->mydie(<<"END"); +WARNING: CPAN.pm is unable to write a configuration file. You +must be able to create and write to '$configpm'. + +Aborting configuration. +END + +} + +# From candidate directories, we would like (in descending preference order): +# * the one that contains a MyConfig file +# * one that exists (even without MyConfig) +# * the first one on the list +sub cpan_home { + my @dirs = cpan_home_dir_candidates(); + for my $d (@dirs) { + return $d if -f "$d/CPAN/MyConfig.pm"; + } + for my $d (@dirs) { + return $d if -d $d; + } + return $dirs[0]; +} + +sub _new_config_name { + return File::Spec->catfile(cpan_home(), 'CPAN', 'MyConfig.pm'); +} + +# returns mandatory but missing entries in the Config +sub missing_config_data { + my(@miss); + for ( + "auto_commit", + "build_cache", + "build_dir", + "cache_metadata", + "cpan_home", + "ftp_proxy", + #"gzip", + "http_proxy", + "index_expire", + #"inhibit_startup_message", + "keep_source_where", + #"make", + "make_arg", + "make_install_arg", + "makepl_arg", + "mbuild_arg", + "mbuild_install_arg", + ($^O eq "MSWin32" ? "" : "mbuild_install_build_command"), + "mbuildpl_arg", + "no_proxy", + #"pager", + "prerequisites_policy", + "scan_cache", + #"tar", + #"unzip", + "urllist", + ) { + next unless exists $keys{$_}; + push @miss, $_ unless defined $CPAN::Config->{$_}; + } + return @miss; +} + +sub help { + $CPAN::Frontend->myprint(q[ +Known options: + commit commit session changes to disk + defaults reload default config values from disk + help this help + init enter a dialog to set all or a set of parameters + +Edit key values as in the following (the "o" is a literal letter o): + o conf build_cache 15 + o conf build_dir "/foo/bar" + o conf urllist shift + o conf urllist unshift ftp://ftp.foo.bar/ + o conf inhibit_startup_message 1 + +]); + 1; #don't reprint CPAN::Config +} + +sub cpl { + my($word,$line,$pos) = @_; + $word ||= ""; + CPAN->debug("word[$word] line[$line] pos[$pos]") if $CPAN::DEBUG; + my(@words) = split " ", substr($line,0,$pos+1); + if ( + defined($words[2]) + and + $words[2] =~ /list$/ + and + ( + @words == 3 + || + @words == 4 && length($word) + ) + ) { + return grep /^\Q$word\E/, qw(splice shift unshift pop push); + } elsif (defined($words[2]) + and + $words[2] eq "init" + and + ( + @words == 3 + || + @words >= 4 && length($word) + )) { + return sort grep /^\Q$word\E/, keys %keys; + } elsif (@words >= 4) { + return (); + } + my %seen; + my(@o_conf) = sort grep { !$seen{$_}++ } + keys %can, + keys %$CPAN::Config, + keys %keys; + return grep /^\Q$word\E/, @o_conf; +} + +sub prefs_lookup { + my($self,$distro,$what) = @_; + + if ($prefssupport{$what}) { + return $CPAN::Config->{$what} unless + $distro + and $distro->prefs + and $distro->prefs->{cpanconfig} + and defined $distro->prefs->{cpanconfig}{$what}; + return $distro->prefs->{cpanconfig}{$what}; + } else { + $CPAN::Frontend->mywarn("Warning: $what not yet officially ". + "supported for distroprefs, doing a normal lookup"); + return $CPAN::Config->{$what}; + } +} + + +{ + package + CPAN::Config; ####::###### #hide from indexer + # note: J. Nick Koston wrote me that they are using + # CPAN::Config->commit although undocumented. I suggested + # CPAN::Shell->o("conf","commit") even when ugly it is at least + # documented + + # that's why I added the CPAN::Config class with autoload and + # deprecated warning + + use strict; + use vars qw($AUTOLOAD $VERSION); + $VERSION = "5.5008"; + + # formerly CPAN::HandleConfig was known as CPAN::Config + sub AUTOLOAD { ## no critic + my $class = shift; # e.g. in dh-make-perl: CPAN::Config + my($l) = $AUTOLOAD; + $CPAN::Frontend->mywarn("Dispatching deprecated method '$l' to CPAN::HandleConfig\n"); + $l =~ s/.*:://; + CPAN::HandleConfig->$l(@_); + } +} + +1; + +__END__ + + +# Local Variables: +# mode: cperl +# cperl-indent-level: 4 +# End: +# vim: ts=4 sts=4 sw=4: +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::URL; +use overload '""' => "as_string", fallback => 1; +# accessors: TEXT(the url string), FROM(DEF=>defaultlist,USER=>urllist), +# planned are things like age or quality + +use vars qw( + $VERSION +); +$VERSION = "5.5"; + +sub new { + my($class,%args) = @_; + bless { + %args + }, $class; +} +sub as_string { + my($self) = @_; + $self->text; +} +sub text { + my($self,$set) = @_; + if (defined $set) { + $self->{TEXT} = $set; + } + $self->{TEXT}; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::FTP; +use strict; + +use Errno (); +use Fcntl qw(:flock); +use File::Basename qw(dirname); +use File::Path qw(mkpath); +use CPAN::FTP::netrc; +use vars qw($connect_to_internet_ok $Ua $Thesite $ThesiteURL $Themethod); + +@CPAN::FTP::ISA = qw(CPAN::Debug); + +use vars qw( + $VERSION +); +$VERSION = "5.5011"; + +sub _plus_append_open { + my($fh, $file) = @_; + my $parent_dir = dirname $file; + mkpath $parent_dir; + my($cnt); + until (open $fh, "+>>$file") { + next if $! == Errno::EAGAIN; # don't increment on EAGAIN + $CPAN::Frontend->mydie("Could not open '$file' after 10000 tries: $!") if ++$cnt > 100000; + sleep 0.0001; + mkpath $parent_dir; + } +} + +#-> sub CPAN::FTP::ftp_statistics +# if they want to rewrite, they need to pass in a filehandle +sub _ftp_statistics { + my($self,$fh) = @_; + my $locktype = $fh ? LOCK_EX : LOCK_SH; + # XXX On Windows flock() implements mandatory locking, so we can + # XXX only use shared locking to still allow _yaml_load_file() to + # XXX read from the file using a different filehandle. + $locktype = LOCK_SH if $^O eq "MSWin32"; + + $fh ||= FileHandle->new; + my $file = File::Spec->catfile($CPAN::Config->{cpan_home},"FTPstats.yml"); + _plus_append_open($fh,$file); + my $sleep = 1; + my $waitstart; + while (!CPAN::_flock($fh, $locktype|LOCK_NB)) { + $waitstart ||= localtime(); + if ($sleep>3) { + my $now = localtime(); + $CPAN::Frontend->mywarn("$now: waiting for read lock on '$file' (since $waitstart)\n"); + } + sleep($sleep); # this sleep must not be overridden; + # Frontend->mysleep with AUTOMATED_TESTING has + # provoked complete lock contention on my NFS + if ($sleep <= 6) { + $sleep+=0.5; + } else { + # retry to get a fresh handle. If it is NFS and the handle is stale, we will never get an flock + _plus_append_open($fh, $file); + } + } + my $stats = eval { CPAN->_yaml_loadfile($file); }; + if ($@) { + if (ref $@) { + if (ref $@ eq "CPAN::Exception::yaml_not_installed") { + chomp $@; + $CPAN::Frontend->myprintonce("Warning (usually harmless): $@\n"); + return; + } elsif (ref $@ eq "CPAN::Exception::yaml_process_error") { + my $time = time; + my $to = "$file.$time"; + $CPAN::Frontend->mywarn("Error reading '$file': $@ + Trying to stash it away as '$to' to prevent further interruptions. + You may want to remove that file later.\n"); + # may fail because somebody else has moved it away in the meantime: + rename $file, $to or $CPAN::Frontend->mywarn("Could not rename '$file' to '$to': $!\n"); + return; + } + } else { + $CPAN::Frontend->mydie($@); + } + } + CPAN::_flock($fh, LOCK_UN); + return $stats->[0]; +} + +#-> sub CPAN::FTP::_mytime +sub _mytime () { + if (CPAN->has_inst("Time::HiRes")) { + return Time::HiRes::time(); + } else { + return time; + } +} + +#-> sub CPAN::FTP::_new_stats +sub _new_stats { + my($self,$file) = @_; + my $ret = { + file => $file, + attempts => [], + start => _mytime, + }; + $ret; +} + +#-> sub CPAN::FTP::_add_to_statistics +sub _add_to_statistics { + my($self,$stats) = @_; + my $yaml_module = CPAN::_yaml_module(); + $self->debug("yaml_module[$yaml_module]") if $CPAN::DEBUG; + if ($CPAN::META->has_inst($yaml_module)) { + $stats->{thesiteurl} = $ThesiteURL; + $stats->{end} = CPAN::FTP::_mytime(); + my $fh = FileHandle->new; + my $time = time; + my $sdebug = 0; + my @debug; + @debug = $time if $sdebug; + my $fullstats = $self->_ftp_statistics($fh); + close $fh; + $fullstats->{history} ||= []; + push @debug, scalar @{$fullstats->{history}} if $sdebug; + push @debug, time if $sdebug; + push @{$fullstats->{history}}, $stats; + # YAML.pm 0.62 is unacceptably slow with 999; + # YAML::Syck 0.82 has no noticable performance problem with 999; + my $ftpstats_size = $CPAN::Config->{ftpstats_size} || 99; + my $ftpstats_period = $CPAN::Config->{ftpstats_period} || 14; + while ( + @{$fullstats->{history}} > $ftpstats_size + || $time - $fullstats->{history}[0]{start} > 86400*$ftpstats_period + ) { + shift @{$fullstats->{history}} + } + push @debug, scalar @{$fullstats->{history}} if $sdebug; + push @debug, time if $sdebug; + push @debug, scalar localtime($fullstats->{history}[0]{start}) if $sdebug; + # need no eval because if this fails, it is serious + my $sfile = File::Spec->catfile($CPAN::Config->{cpan_home},"FTPstats.yml"); + CPAN->_yaml_dumpfile("$sfile.$$",$fullstats); + if ( $sdebug ) { + local $CPAN::DEBUG = 512; # FTP + push @debug, time; + CPAN->debug(sprintf("DEBUG history: before_read[%d]before[%d]at[%d]". + "after[%d]at[%d]oldest[%s]dumped backat[%d]", + @debug, + )); + } + # Win32 cannot rename a file to an existing filename + unlink($sfile) if ($^O eq 'MSWin32' or $^O eq 'os2'); + _copy_stat($sfile, "$sfile.$$") if -e $sfile; + rename "$sfile.$$", $sfile + or $CPAN::Frontend->mywarn("Could not rename '$sfile.$$' to '$sfile': $!\nGiving up\n"); + } +} + +# Copy some stat information (owner, group, mode and) from one file to +# another. +# This is a utility function which might be moved to a utility repository. +#-> sub CPAN::FTP::_copy_stat +sub _copy_stat { + my($src, $dest) = @_; + my @stat = stat($src); + if (!@stat) { + $CPAN::Frontend->mywarn("Can't stat '$src': $!\n"); + return; + } + + eval { + chmod $stat[2], $dest + or $CPAN::Frontend->mywarn("Can't chmod '$dest' to " . sprintf("0%o", $stat[2]) . ": $!\n"); + }; + warn $@ if $@; + eval { + chown $stat[4], $stat[5], $dest + or do { + my $save_err = $!; # otherwise it's lost in the get... calls + $CPAN::Frontend->mywarn("Can't chown '$dest' to " . + (getpwuid($stat[4]))[0] . "/" . + (getgrgid($stat[5]))[0] . ": $save_err\n" + ); + }; + }; + warn $@ if $@; +} + +# if file is CHECKSUMS, suggest the place where we got the file to be +# checked from, maybe only for young files? +#-> sub CPAN::FTP::_recommend_url_for +sub _recommend_url_for { + my($self, $file, $urllist) = @_; + if ($file =~ s|/CHECKSUMS(.gz)?$||) { + my $fullstats = $self->_ftp_statistics(); + my $history = $fullstats->{history} || []; + while (my $last = pop @$history) { + last if $last->{end} - time > 3600; # only young results are interesting + next unless $last->{file}; # dirname of nothing dies! + next unless $file eq dirname($last->{file}); + return $last->{thesiteurl}; + } + } + if ($CPAN::Config->{randomize_urllist} + && + rand(1) < $CPAN::Config->{randomize_urllist} + ) { + $urllist->[int rand scalar @$urllist]; + } else { + return (); + } +} + +#-> sub CPAN::FTP::_get_urllist +sub _get_urllist { + my($self, $with_defaults) = @_; + $with_defaults ||= 0; + CPAN->debug("with_defaults[$with_defaults]") if $CPAN::DEBUG; + + $CPAN::Config->{urllist} ||= []; + unless (ref $CPAN::Config->{urllist} eq 'ARRAY') { + $CPAN::Frontend->mywarn("Malformed urllist; ignoring. Configuration file corrupt?\n"); + $CPAN::Config->{urllist} = []; + } + my @urllist = grep { defined $_ and length $_ } @{$CPAN::Config->{urllist}}; + push @urllist, @CPAN::Defaultsites if $with_defaults; + for my $u (@urllist) { + CPAN->debug("u[$u]") if $CPAN::DEBUG; + if (UNIVERSAL::can($u,"text")) { + $u->{TEXT} .= "/" unless substr($u->{TEXT},-1) eq "/"; + } else { + $u .= "/" unless substr($u,-1) eq "/"; + $u = CPAN::URL->new(TEXT => $u, FROM => "USER"); + } + } + \@urllist; +} + +#-> sub CPAN::FTP::ftp_get ; +sub ftp_get { + my($class,$host,$dir,$file,$target) = @_; + $class->debug( + qq[Going to fetch file [$file] from dir [$dir] + on host [$host] as local [$target]\n] + ) if $CPAN::DEBUG; + my $ftp = Net::FTP->new($host); + unless ($ftp) { + $CPAN::Frontend->mywarn(" Could not connect to host '$host' with Net::FTP\n"); + return; + } + return 0 unless defined $ftp; + $ftp->debug(1) if $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG; + $class->debug(qq[Going to login("anonymous","$Config::Config{cf_email}")]); + unless ( $ftp->login("anonymous",$Config::Config{'cf_email'}) ) { + my $msg = $ftp->message; + $CPAN::Frontend->mywarn(" Couldn't login on $host: $msg\n"); + return; + } + unless ( $ftp->cwd($dir) ) { + my $msg = $ftp->message; + $CPAN::Frontend->mywarn(" Couldn't cwd $dir: $msg\n"); + return; + } + $ftp->binary; + $class->debug(qq[Going to ->get("$file","$target")\n]) if $CPAN::DEBUG; + unless ( $ftp->get($file,$target) ) { + my $msg = $ftp->message; + $CPAN::Frontend->mywarn(" Couldn't fetch $file from $host: $msg\n"); + return; + } + $ftp->quit; # it's ok if this fails + return 1; +} + +# If more accuracy is wanted/needed, Chris Leach sent me this patch... + + # > *** /install/perl/live/lib/CPAN.pm- Wed Sep 24 13:08:48 1997 + # > --- /tmp/cp Wed Sep 24 13:26:40 1997 + # > *************** + # > *** 1562,1567 **** + # > --- 1562,1580 ---- + # > return 1 if substr($url,0,4) eq "file"; + # > return 1 unless $url =~ m|://([^/]+)|; + # > my $host = $1; + # > + my $proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'}; + # > + if ($proxy) { + # > + $proxy =~ m|://([^/:]+)|; + # > + $proxy = $1; + # > + my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'}; + # > + if ($noproxy) { + # > + if ($host !~ /$noproxy$/) { + # > + $host = $proxy; + # > + } + # > + } else { + # > + $host = $proxy; + # > + } + # > + } + # > require Net::Ping; + # > return 1 unless $Net::Ping::VERSION >= 2; + # > my $p; + + +#-> sub CPAN::FTP::localize ; +sub localize { + my($self,$file,$aslocal,$force,$with_defaults) = @_; + $force ||= 0; + Carp::croak( "Usage: ->localize(cpan_file,as_local_file[,\$force])" ) + unless defined $aslocal; + if ($CPAN::DEBUG){ + require Carp; + my $longmess = Carp::longmess(); + $self->debug("file[$file] aslocal[$aslocal] force[$force] carplongmess[$longmess]"); + } + if ($^O eq 'MacOS') { + # Comment by AK on 2000-09-03: Uniq short filenames would be + # available in CHECKSUMS file + my($name, $path) = File::Basename::fileparse($aslocal, ''); + if (length($name) > 31) { + $name =~ s/( + \.( + readme(\.(gz|Z))? | + (tar\.)?(gz|Z) | + tgz | + zip | + pm\.(gz|Z) + ) + )$//x; + my $suf = $1; + my $size = 31 - length($suf); + while (length($name) > $size) { + chop $name; + } + $name .= $suf; + $aslocal = File::Spec->catfile($path, $name); + } + } + + if (-f $aslocal && -r _ && !($force & 1)) { + my $size; + if ($size = -s $aslocal) { + $self->debug("aslocal[$aslocal]size[$size]") if $CPAN::DEBUG; + return $aslocal; + } else { + # empty file from a previous unsuccessful attempt to download it + unlink $aslocal or + $CPAN::Frontend->mydie("Found a zero-length '$aslocal' that I ". + "could not remove."); + } + } + my($maybe_restore) = 0; + if (-f $aslocal) { + rename $aslocal, "$aslocal.bak$$"; + $maybe_restore++; + } + + my($aslocal_dir) = dirname($aslocal); + # Inheritance is not easier to manage than a few if/else branches + if ($CPAN::META->has_usable('LWP::UserAgent')) { + unless ($Ua) { + CPAN::LWP::UserAgent->config; + eval {$Ua = CPAN::LWP::UserAgent->new;}; # Why is has_usable still not fit enough? + if ($@) { + $CPAN::Frontend->mywarn("CPAN::LWP::UserAgent->new dies with $@\n") + if $CPAN::DEBUG; + } else { + my($var); + $Ua->proxy('ftp', $var) + if $var = $CPAN::Config->{ftp_proxy} || $ENV{ftp_proxy}; + $Ua->proxy('http', $var) + if $var = $CPAN::Config->{http_proxy} || $ENV{http_proxy}; + $Ua->no_proxy($var) + if $var = $CPAN::Config->{no_proxy} || $ENV{no_proxy}; + } + } + } + for my $prx (qw(ftp_proxy http_proxy no_proxy)) { + $ENV{$prx} = $CPAN::Config->{$prx} if $CPAN::Config->{$prx}; + } + + # Try the list of urls for each single object. We keep a record + # where we did get a file from + my(@reordered,$last); + my $ccurllist = $self->_get_urllist($with_defaults); + $last = $#$ccurllist; + if ($force & 2) { # local cpans probably out of date, don't reorder + @reordered = (0..$last); + } else { + @reordered = + sort { + (substr($ccurllist->[$b],0,4) eq "file") + <=> + (substr($ccurllist->[$a],0,4) eq "file") + or + defined($ThesiteURL) + and + ($ccurllist->[$b] eq $ThesiteURL) + <=> + ($ccurllist->[$a] eq $ThesiteURL) + } 0..$last; + } + my(@levels); + $Themethod ||= ""; + $self->debug("Themethod[$Themethod]reordered[@reordered]") if $CPAN::DEBUG; + my @all_levels = ( + ["dleasy", "file"], + ["dleasy"], + ["dlhard"], + ["dlhardest"], + ["dleasy", "http","defaultsites"], + ["dlhard", "http","defaultsites"], + ["dleasy", "ftp", "defaultsites"], + ["dlhard", "ftp", "defaultsites"], + ["dlhardest","", "defaultsites"], + ); + if ($Themethod) { + @levels = grep {$_->[0] eq $Themethod} @all_levels; + push @levels, grep {$_->[0] ne $Themethod} @all_levels; + } else { + @levels = @all_levels; + } + @levels = qw/dleasy/ if $^O eq 'MacOS'; + my($levelno); + local $ENV{FTP_PASSIVE} = + exists $CPAN::Config->{ftp_passive} ? + $CPAN::Config->{ftp_passive} : 1; + my $ret; + my $stats = $self->_new_stats($file); + for ($CPAN::Config->{connect_to_internet_ok}) { + $connect_to_internet_ok = $_ if not defined $connect_to_internet_ok and defined $_; + } + LEVEL: for $levelno (0..$#levels) { + my $level_tuple = $levels[$levelno]; + my($level,$scheme,$sitetag) = @$level_tuple; + $self->mymkpath($aslocal_dir) unless $scheme && "file" eq $scheme; + my $defaultsites = $sitetag && $sitetag eq "defaultsites" && !@$ccurllist; + my @urllist; + if ($defaultsites) { + unless (defined $connect_to_internet_ok) { + $CPAN::Frontend->myprint(sprintf qq{ +I would like to connect to one of the following sites to get '%s': + +%s +}, + $file, + join("",map { " ".$_->text."\n" } @CPAN::Defaultsites), + ); + my $answer = CPAN::Shell::colorable_makemaker_prompt("Is it OK to try to connect to the Internet?", "yes"); + if ($answer =~ /^y/i) { + $connect_to_internet_ok = 1; + } else { + $connect_to_internet_ok = 0; + } + } + if ($connect_to_internet_ok) { + @urllist = @CPAN::Defaultsites; + } else { + my $sleep = 2; + # the tricky thing about dying here is that everybody + # believes that calls to exists() or all_objects() are + # safe. + require CPAN::Exception::blocked_urllist; + die CPAN::Exception::blocked_urllist->new; + } + } else { # ! $defaultsites + my @host_seq = $level =~ /dleasy/ ? + @reordered : 0..$last; # reordered has file and $Thesiteurl first + @urllist = map { $ccurllist->[$_] } @host_seq; + } + $self->debug("synth. urllist[@urllist]") if $CPAN::DEBUG; + my $aslocal_tempfile = $aslocal . ".tmp" . $$; + if (my $recommend = $self->_recommend_url_for($file,\@urllist)) { + @urllist = grep { $_ ne $recommend } @urllist; + unshift @urllist, $recommend; + } + $self->debug("synth. urllist[@urllist]") if $CPAN::DEBUG; + $ret = $self->hostdlxxx($level,$scheme,\@urllist,$file,$aslocal_tempfile,$stats); + if ($ret) { + CPAN->debug("ret[$ret]aslocal[$aslocal]") if $CPAN::DEBUG; + if ($ret eq $aslocal_tempfile) { + # if we got it exactly as we asked for, only then we + # want to rename + rename $aslocal_tempfile, $aslocal + or $CPAN::Frontend->mydie("Error while trying to rename ". + "'$ret' to '$aslocal': $!"); + $ret = $aslocal; + } + elsif (-f $ret && $scheme eq 'file' ) { + # it's a local file, so there's nothing left to do, we + # let them read from where it is + } + $Themethod = $level; + my $now = time; + # utime $now, $now, $aslocal; # too bad, if we do that, we + # might alter a local mirror + $self->debug("level[$level]") if $CPAN::DEBUG; + last LEVEL; + } else { + unlink $aslocal_tempfile; + last if $CPAN::Signal; # need to cleanup + } + } + if ($ret) { + $stats->{filesize} = -s $ret; + } + $self->debug("before _add_to_statistics") if $CPAN::DEBUG; + $self->_add_to_statistics($stats); + $self->debug("after _add_to_statistics") if $CPAN::DEBUG; + if ($ret) { + unlink "$aslocal.bak$$"; + return $ret; + } + unless ($CPAN::Signal) { + my(@mess); + local $" = " "; + if (@{$CPAN::Config->{urllist}}) { + push @mess, + qq{Please check, if the URLs I found in your configuration file \(}. + join(", ", @{$CPAN::Config->{urllist}}). + qq{\) are valid.}; + } else { + push @mess, qq{Your urllist is empty!}; + } + push @mess, qq{The urllist can be edited.}, + qq{E.g. with 'o conf urllist push ftp://myurl/'}; + $CPAN::Frontend->mywarn(Text::Wrap::wrap("","","@mess"). "\n\n"); + $CPAN::Frontend->mydie("Could not fetch $file\n"); + } + if ($maybe_restore) { + rename "$aslocal.bak$$", $aslocal; + $CPAN::Frontend->myprint("Trying to get away with old file:\n" . + $self->ls($aslocal) . "\n"); + return $aslocal; + } + return; +} + +sub mymkpath { + my($self, $aslocal_dir) = @_; + mkpath($aslocal_dir); + $CPAN::Frontend->mywarn(qq{Warning: You are not allowed to write into }. + qq{directory "$aslocal_dir". + I\'ll continue, but if you encounter problems, they may be due + to insufficient permissions.\n}) unless -w $aslocal_dir; +} + +sub hostdlxxx { + my $self = shift; + my $level = shift; + my $scheme = shift; + my $h = shift; + $h = [ grep /^\Q$scheme\E:/, @$h ] if $scheme; + my $method = "host$level"; + $self->$method($h, @_); +} + +sub _set_attempt { + my($self,$stats,$method,$url) = @_; + push @{$stats->{attempts}}, { + method => $method, + start => _mytime, + url => $url, + }; +} + +# package CPAN::FTP; +sub hostdleasy { #called from hostdlxxx + my($self,$host_seq,$file,$aslocal,$stats) = @_; + my($ro_url); + HOSTEASY: for $ro_url (@$host_seq) { + $self->_set_attempt($stats,"dleasy",$ro_url); + my $url = "$ro_url$file"; + $self->debug("localizing perlish[$url]") if $CPAN::DEBUG; + if ($url =~ /^file:/) { + my $l; + if ($CPAN::META->has_inst('URI::URL')) { + my $u = URI::URL->new($url); + $l = $u->file; + } else { # works only on Unix, is poorly constructed, but + # hopefully better than nothing. + # RFC 1738 says fileurl BNF is + # fileurl = "file://" [ host | "localhost" ] "/" fpath + # Thanks to "Mark D. Baushke" <mdb@cisco.com> for + # the code + ($l = $url) =~ s|^file://[^/]*/|/|; # discard the host part + $l =~ s|^file:||; # assume they + # meant + # file://localhost + $l =~ s|^/||s + if ! -f $l && $l =~ m|^/\w:|; # e.g. /P: + } + $self->debug("local file[$l]") if $CPAN::DEBUG; + if ( -f $l && -r _) { + $ThesiteURL = $ro_url; + return $l; + } + # If request is for a compressed file and we can find the + # uncompressed file also, return the path of the uncompressed file + # otherwise, decompress it and return the resulting path + if ($l =~ /(.+)\.gz$/) { + my $ungz = $1; + if ( -f $ungz && -r _) { + $ThesiteURL = $ro_url; + return $ungz; + } + elsif (-f $l && -r _) { + eval { CPAN::Tarzip->new($l)->gunzip($aslocal) }; + if ( -f $aslocal && -s _) { + $ThesiteURL = $ro_url; + return $aslocal; + } + elsif (! -s $aslocal) { + unlink $aslocal; + } + elsif (-f $l) { + $CPAN::Frontend->mywarn("Error decompressing '$l': $@\n") + if $@; + return; + } + } + } + # Otherwise, return the local file path if it exists + elsif ( -f $l && -r _) { + $ThesiteURL = $ro_url; + return $l; + } + # If we can't find it, but there is a compressed version + # of it, then decompress it + elsif (-f "$l.gz") { + $self->debug("found compressed $l.gz") if $CPAN::DEBUG; + eval { CPAN::Tarzip->new("$l.gz")->gunzip($aslocal) }; + if ( -f $aslocal) { + $ThesiteURL = $ro_url; + return $aslocal; + } + else { + $CPAN::Frontend->mywarn("Error decompressing '$l': $@\n") + if $@; + return; + } + } + $CPAN::Frontend->mywarn("Could not find '$l'\n"); + } + $self->debug("it was not a file URL") if $CPAN::DEBUG; + if ($CPAN::META->has_usable('LWP')) { + $CPAN::Frontend->myprint("Fetching with LWP:\n$url\n"); + unless ($Ua) { + CPAN::LWP::UserAgent->config; + eval { $Ua = CPAN::LWP::UserAgent->new; }; + if ($@) { + $CPAN::Frontend->mywarn("CPAN::LWP::UserAgent->new dies with $@\n"); + } + } + my $res = $Ua->mirror($url, $aslocal); + if ($res->is_success) { + $ThesiteURL = $ro_url; + my $now = time; + utime $now, $now, $aslocal; # download time is more + # important than upload + # time + return $aslocal; + } elsif ($url !~ /\.gz(?!\n)\Z/) { + my $gzurl = "$url.gz"; + $CPAN::Frontend->myprint("Fetching with LWP:\n$gzurl\n"); + $res = $Ua->mirror($gzurl, "$aslocal.gz"); + if ($res->is_success) { + if (eval {CPAN::Tarzip->new("$aslocal.gz")->gunzip($aslocal)}) { + $ThesiteURL = $ro_url; + return $aslocal; + } + } + } else { + $CPAN::Frontend->myprint(sprintf( + "LWP failed with code[%s] message[%s]\n", + $res->code, + $res->message, + )); + # Alan Burlison informed me that in firewall environments + # Net::FTP can still succeed where LWP fails. So we do not + # skip Net::FTP anymore when LWP is available. + } + } elsif ($url =~ /^http:/i && $CPAN::META->has_usable('HTTP::Tiny')) { + require CPAN::HTTP::Client; + my $chc = CPAN::HTTP::Client->new( + proxy => $CPAN::Config->{http_proxy} || $ENV{http_proxy}, + no_proxy => $CPAN::Config->{no_proxy} || $ENV{no_proxy}, + ); + for my $try ( $url, ( $url !~ /\.gz(?!\n)\Z/ ? "$url.gz" : () ) ) { + $CPAN::Frontend->myprint("Fetching with HTTP::Tiny:\n$try\n"); + my $res = eval { $chc->mirror($try, $aslocal) }; + if ( $res && $res->{success} ) { + $ThesiteURL = $ro_url; + my $now = time; + utime $now, $now, $aslocal; # download time is more + # important than upload + # time + return $aslocal; + } + elsif ( $res && $res->{status} ne '599') { + $CPAN::Frontend->myprint(sprintf( + "HTTP::Tiny failed with code[%s] message[%s]\n", + $res->{status}, + $res->{reason}, + ) + ); + } + elsif ( $res && $res->{status} eq '599') { + $CPAN::Frontend->myprint(sprintf( + "HTTP::Tiny failed with an internal error: %s\n", + $res->{content}, + ) + ); + } + else { + my $err = $@ || 'Unknown error'; + $CPAN::Frontend->myprint(sprintf( + "Error downloading with HTTP::Tiny: %s\n", $err + ) + ); + } + } + } + return if $CPAN::Signal; + if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) { + # that's the nice and easy way thanks to Graham + $self->debug("recognized ftp") if $CPAN::DEBUG; + my($host,$dir,$getfile) = ($1,$2,$3); + if ($CPAN::META->has_usable('Net::FTP')) { + $dir =~ s|/+|/|g; + $CPAN::Frontend->myprint("Fetching with Net::FTP:\n$url\n"); + $self->debug("getfile[$getfile]dir[$dir]host[$host]" . + "aslocal[$aslocal]") if $CPAN::DEBUG; + if (CPAN::FTP->ftp_get($host,$dir,$getfile,$aslocal)) { + $ThesiteURL = $ro_url; + return $aslocal; + } + if ($aslocal !~ /\.gz(?!\n)\Z/) { + my $gz = "$aslocal.gz"; + $CPAN::Frontend->myprint("Fetching with Net::FTP\n$url.gz\n"); + if (CPAN::FTP->ftp_get($host, + $dir, + "$getfile.gz", + $gz) && + eval{CPAN::Tarzip->new($gz)->gunzip($aslocal)} + ) { + $ThesiteURL = $ro_url; + return $aslocal; + } + } + # next HOSTEASY; + } else { + CPAN->debug("Net::FTP does not count as usable atm") if $CPAN::DEBUG; + } + } + if ( + UNIVERSAL::can($ro_url,"text") + and + $ro_url->{FROM} eq "USER" + ) { + ##address #17973: default URLs should not try to override + ##user-defined URLs just because LWP is not available + my $ret = $self->hostdlhard([$ro_url],$file,$aslocal,$stats); + return $ret if $ret; + } + return if $CPAN::Signal; + } +} + +# package CPAN::FTP; +sub hostdlhard { + my($self,$host_seq,$file,$aslocal,$stats) = @_; + + # Came back if Net::FTP couldn't establish connection (or + # failed otherwise) Maybe they are behind a firewall, but they + # gave us a socksified (or other) ftp program... + + my($ro_url); + my($devnull) = $CPAN::Config->{devnull} || ""; + # < /dev/null "; + my($aslocal_dir) = dirname($aslocal); + mkpath($aslocal_dir); + my $some_dl_success = 0; + my $any_attempt = 0; + HOSTHARD: for $ro_url (@$host_seq) { + $self->_set_attempt($stats,"dlhard",$ro_url); + my $url = "$ro_url$file"; + my($proto,$host,$dir,$getfile); + + # Courtesy Mark Conty mark_conty@cargill.com change from + # if ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) { + # to + if ($url =~ m|^([^:]+)://(.*?)/(.*)/(.*)|) { + # proto not yet used + ($proto,$host,$dir,$getfile) = ($1,$2,$3,$4); + } else { + next HOSTHARD; # who said, we could ftp anything except ftp? + } + next HOSTHARD if $proto eq "file"; # file URLs would have had + # success above. Likely a bogus URL + + # making at least one attempt against a host + $any_attempt++; + + $self->debug("localizing funkyftpwise[$url]") if $CPAN::DEBUG; + + # Try the most capable first and leave ncftp* for last as it only + # does FTP. + my $proxy_vars = $self->_proxy_vars($ro_url); + DLPRG: for my $f (qw(curl wget lynx ncftpget ncftp)) { + my $funkyftp = CPAN::HandleConfig->safe_quote($CPAN::Config->{$f}); + next DLPRG unless defined $funkyftp; + next DLPRG if $funkyftp =~ /^\s*$/; + + my($src_switch) = ""; + my($chdir) = ""; + my($stdout_redir) = " > \"$aslocal\""; + if ($f eq "lynx") { + $src_switch = " -source"; + } elsif ($f eq "ncftp") { + next DLPRG unless $url =~ m{\Aftp://}; + $src_switch = " -c"; + } elsif ($f eq "wget") { + $src_switch = " -O \"$aslocal\""; + $stdout_redir = ""; + } elsif ($f eq 'curl') { + $src_switch = ' -L -f -s -S --netrc-optional'; + if ($proxy_vars->{http_proxy}) { + $src_switch .= qq{ -U "$proxy_vars->{proxy_user}:$proxy_vars->{proxy_pass}" -x "$proxy_vars->{http_proxy}"}; + } + } elsif ($f eq "ncftpget") { + next DLPRG unless $url =~ m{\Aftp://}; + $chdir = "cd $aslocal_dir && "; + $stdout_redir = ""; + } + $CPAN::Frontend->myprint( + qq[ +Trying with + $funkyftp$src_switch +to get + $url +]); + my($system) = + "$chdir$funkyftp$src_switch \"$url\" $devnull$stdout_redir"; + $self->debug("system[$system]") if $CPAN::DEBUG; + my($wstatus) = system($system); + if ($f eq "lynx") { + # lynx returns 0 when it fails somewhere + if (-s $aslocal) { + my $content = do { local *FH; + open FH, $aslocal or die; + local $/; + <FH> }; + if ($content =~ /^<.*(<title>[45]|Error [45])/si) { + $CPAN::Frontend->mywarn(qq{ +No success, the file that lynx has downloaded looks like an error message: +$content +}); + $CPAN::Frontend->mysleep(1); + next DLPRG; + } + $some_dl_success++; + } else { + $CPAN::Frontend->myprint(qq{ +No success, the file that lynx has downloaded is an empty file. +}); + next DLPRG; + } + } + if ($wstatus == 0) { + if (-s $aslocal) { + # Looks good + $some_dl_success++; + } + $ThesiteURL = $ro_url; + return $aslocal; + } else { + my $estatus = $wstatus >> 8; + my $size = -f $aslocal ? + ", left\n$aslocal with size ".-s _ : + "\nWarning: expected file [$aslocal] doesn't exist"; + $CPAN::Frontend->myprint(qq{ + Function system("$system") + returned status $estatus (wstat $wstatus)$size + }); + } + return if $CPAN::Signal; + } # download/transfer programs (DLPRG) + } # host + return unless $any_attempt; + if ($some_dl_success) { + $CPAN::Frontend->mywarn("Warning: doesn't seem we had substantial success downloading '$aslocal'. Don't know how to proceed.\n"); + } else { + $CPAN::Frontend->mywarn("Warning: no success downloading '$aslocal'. Giving up on it.\n"); + } + return; +} + +#-> CPAN::FTP::_proxy_vars +sub _proxy_vars { + my($self,$url) = @_; + my $ret = +{}; + my $http_proxy = $CPAN::Config->{'http_proxy'} || $ENV{'http_proxy'}; + if ($http_proxy) { + my($host) = $url =~ m|://([^/:]+)|; + my $want_proxy = 1; + my $noproxy = $CPAN::Config->{'no_proxy'} || $ENV{'no_proxy'} || ""; + my @noproxy = split /\s*,\s*/, $noproxy; + if ($host) { + DOMAIN: for my $domain (@noproxy) { + if ($host =~ /\Q$domain\E$/) { # cf. LWP::UserAgent + $want_proxy = 0; + last DOMAIN; + } + } + } else { + $CPAN::Frontend->mywarn(" Could not determine host from http_proxy '$http_proxy'\n"); + } + if ($want_proxy) { + my($user, $pass) = + CPAN::HTTP::Credentials->get_proxy_credentials(); + $ret = { + proxy_user => $user, + proxy_pass => $pass, + http_proxy => $http_proxy + }; + } + } + return $ret; +} + +# package CPAN::FTP; +sub hostdlhardest { + my($self,$host_seq,$file,$aslocal,$stats) = @_; + + return unless @$host_seq; + my($ro_url); + my($aslocal_dir) = dirname($aslocal); + mkpath($aslocal_dir); + my $ftpbin = $CPAN::Config->{ftp}; + unless ($ftpbin && length $ftpbin && MM->maybe_command($ftpbin)) { + $CPAN::Frontend->myprint("No external ftp command available\n\n"); + return; + } + $CPAN::Frontend->mywarn(qq{ +As a last resort we now switch to the external ftp command '$ftpbin' +to get '$aslocal'. + +Doing so often leads to problems that are hard to diagnose. + +If you're the victim of such problems, please consider unsetting the +ftp config variable with + + o conf ftp "" + o conf commit + +}); + $CPAN::Frontend->mysleep(2); + HOSTHARDEST: for $ro_url (@$host_seq) { + $self->_set_attempt($stats,"dlhardest",$ro_url); + my $url = "$ro_url$file"; + $self->debug("localizing ftpwise[$url]") if $CPAN::DEBUG; + unless ($url =~ m|^ftp://(.*?)/(.*)/(.*)|) { + next; + } + my($host,$dir,$getfile) = ($1,$2,$3); + my $timestamp = 0; + my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime, + $ctime,$blksize,$blocks) = stat($aslocal); + $timestamp = $mtime ||= 0; + my($netrc) = CPAN::FTP::netrc->new; + my($netrcfile) = $netrc->netrc; + my($verbose) = $CPAN::DEBUG{'FTP'} & $CPAN::DEBUG ? " -v" : ""; + my $targetfile = File::Basename::basename($aslocal); + my(@dialog); + push( + @dialog, + "lcd $aslocal_dir", + "cd /", + map("cd $_", split /\//, $dir), # RFC 1738 + "bin", + "passive", + "get $getfile $targetfile", + "quit" + ); + if (! $netrcfile) { + CPAN->debug("No ~/.netrc file found") if $CPAN::DEBUG; + } elsif ($netrc->hasdefault || $netrc->contains($host)) { + CPAN->debug(sprintf("hasdef[%d]cont($host)[%d]", + $netrc->hasdefault, + $netrc->contains($host))) if $CPAN::DEBUG; + if ($netrc->protected) { + my $dialog = join "", map { " $_\n" } @dialog; + my $netrc_explain; + if ($netrc->contains($host)) { + $netrc_explain = "Relying that your .netrc entry for '$host' ". + "manages the login"; + } else { + $netrc_explain = "Relying that your default .netrc entry ". + "manages the login"; + } + $CPAN::Frontend->myprint(qq{ + Trying with external ftp to get + '$url' + $netrc_explain + Sending the dialog +$dialog +} + ); + $self->talk_ftp("$ftpbin$verbose $host", + @dialog); + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal); + $mtime ||= 0; + if ($mtime > $timestamp) { + $CPAN::Frontend->myprint("GOT $aslocal\n"); + $ThesiteURL = $ro_url; + return $aslocal; + } else { + $CPAN::Frontend->myprint("Hmm... Still failed!\n"); + } + return if $CPAN::Signal; + } else { + $CPAN::Frontend->mywarn(qq{Your $netrcfile is not }. + qq{correctly protected.\n}); + } + } else { + $CPAN::Frontend->mywarn("Your ~/.netrc neither contains $host + nor does it have a default entry\n"); + } + + # OK, they don't have a valid ~/.netrc. Use 'ftp -n' + # then and login manually to host, using e-mail as + # password. + $CPAN::Frontend->myprint(qq{Issuing "$ftpbin$verbose -n"\n}); + unshift( + @dialog, + "open $host", + "user anonymous $Config::Config{'cf_email'}" + ); + my $dialog = join "", map { " $_\n" } @dialog; + $CPAN::Frontend->myprint(qq{ + Trying with external ftp to get + $url + Sending the dialog +$dialog +} + ); + $self->talk_ftp("$ftpbin$verbose -n", @dialog); + ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) = stat($aslocal); + $mtime ||= 0; + if ($mtime > $timestamp) { + $CPAN::Frontend->myprint("GOT $aslocal\n"); + $ThesiteURL = $ro_url; + return $aslocal; + } else { + $CPAN::Frontend->myprint("Bad luck... Still failed!\n"); + } + return if $CPAN::Signal; + $CPAN::Frontend->mywarn("Can't access URL $url.\n\n"); + $CPAN::Frontend->mysleep(2); + } # host +} + +# package CPAN::FTP; +sub talk_ftp { + my($self,$command,@dialog) = @_; + my $fh = FileHandle->new; + $fh->open("|$command") or die "Couldn't open ftp: $!"; + foreach (@dialog) { $fh->print("$_\n") } + $fh->close; # Wait for process to complete + my $wstatus = $?; + my $estatus = $wstatus >> 8; + $CPAN::Frontend->myprint(qq{ +Subprocess "|$command" + returned status $estatus (wstat $wstatus) +}) if $wstatus; +} + +# find2perl needs modularization, too, all the following is stolen +# from there +# CPAN::FTP::ls +sub ls { + my($self,$name) = @_; + my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$sizemm, + $atime,$mtime,$ctime,$blksize,$blocks) = lstat($name); + + my($perms,%user,%group); + my $pname = $name; + + if ($blocks) { + $blocks = int(($blocks + 1) / 2); + } + else { + $blocks = int(($sizemm + 1023) / 1024); + } + + if (-f _) { $perms = '-'; } + elsif (-d _) { $perms = 'd'; } + elsif (-c _) { $perms = 'c'; $sizemm = &sizemm; } + elsif (-b _) { $perms = 'b'; $sizemm = &sizemm; } + elsif (-p _) { $perms = 'p'; } + elsif (-S _) { $perms = 's'; } + else { $perms = 'l'; $pname .= ' -> ' . readlink($_); } + + my(@rwx) = ('---','--x','-w-','-wx','r--','r-x','rw-','rwx'); + my(@moname) = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); + my $tmpmode = $mode; + my $tmp = $rwx[$tmpmode & 7]; + $tmpmode >>= 3; + $tmp = $rwx[$tmpmode & 7] . $tmp; + $tmpmode >>= 3; + $tmp = $rwx[$tmpmode & 7] . $tmp; + substr($tmp,2,1) =~ tr/-x/Ss/ if -u _; + substr($tmp,5,1) =~ tr/-x/Ss/ if -g _; + substr($tmp,8,1) =~ tr/-x/Tt/ if -k _; + $perms .= $tmp; + + my $user = $user{$uid} || $uid; # too lazy to implement lookup + my $group = $group{$gid} || $gid; + + my($sec,$min,$hour,$mday,$mon,$year) = localtime($mtime); + my($timeyear); + my($moname) = $moname[$mon]; + if (-M _ > 365.25 / 2) { + $timeyear = $year + 1900; + } + else { + $timeyear = sprintf("%02d:%02d", $hour, $min); + } + + sprintf "%5lu %4ld %-10s %2d %-8s %-8s %8s %s %2d %5s %s\n", + $ino, + $blocks, + $perms, + $nlink, + $user, + $group, + $sizemm, + $moname, + $mday, + $timeyear, + $pname; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::CacheMgr; +use strict; +use CPAN::InfoObj; +@CPAN::CacheMgr::ISA = qw(CPAN::InfoObj CPAN); +use Cwd qw(chdir); +use File::Find; + +use vars qw( + $VERSION +); +$VERSION = "5.5002"; + +package CPAN::CacheMgr; +use strict; + +#-> sub CPAN::CacheMgr::as_string ; +sub as_string { + eval { require Data::Dumper }; + if ($@) { + return shift->SUPER::as_string; + } else { + return Data::Dumper::Dumper(shift); + } +} + +#-> sub CPAN::CacheMgr::cachesize ; +sub cachesize { + shift->{DU}; +} + +#-> sub CPAN::CacheMgr::tidyup ; +sub tidyup { + my($self) = @_; + return unless $CPAN::META->{LOCK}; + return unless -d $self->{ID}; + my @toremove = grep { $self->{SIZE}{$_}==0 } @{$self->{FIFO}}; + for my $current (0..$#toremove) { + my $toremove = $toremove[$current]; + $CPAN::Frontend->myprint(sprintf( + "DEL(%d/%d): %s \n", + $current+1, + scalar @toremove, + $toremove, + ) + ); + return if $CPAN::Signal; + $self->_clean_cache($toremove); + return if $CPAN::Signal; + } + $self->{FIFO} = []; +} + +#-> sub CPAN::CacheMgr::dir ; +sub dir { + shift->{ID}; +} + +#-> sub CPAN::CacheMgr::entries ; +sub entries { + my($self,$dir) = @_; + return unless defined $dir; + $self->debug("reading dir[$dir]") if $CPAN::DEBUG; + $dir ||= $self->{ID}; + my($cwd) = CPAN::anycwd(); + chdir $dir or Carp::croak("Can't chdir to $dir: $!"); + my $dh = DirHandle->new(File::Spec->curdir) + or Carp::croak("Couldn't opendir $dir: $!"); + my(@entries); + for ($dh->read) { + next if $_ eq "." || $_ eq ".."; + if (-f $_) { + push @entries, File::Spec->catfile($dir,$_); + } elsif (-d _) { + push @entries, File::Spec->catdir($dir,$_); + } else { + $CPAN::Frontend->mywarn("Warning: weird direntry in $dir: $_\n"); + } + } + chdir $cwd or Carp::croak("Can't chdir to $cwd: $!"); + sort { -M $a <=> -M $b} @entries; +} + +#-> sub CPAN::CacheMgr::disk_usage ; +sub disk_usage { + my($self,$dir,$fast) = @_; + return if exists $self->{SIZE}{$dir}; + return if $CPAN::Signal; + my($Du) = 0; + if (-e $dir) { + if (-d $dir) { + unless (-x $dir) { + unless (chmod 0755, $dir) { + $CPAN::Frontend->mywarn("I have neither the -x permission nor the ". + "permission to change the permission; cannot ". + "estimate disk usage of '$dir'\n"); + $CPAN::Frontend->mysleep(5); + return; + } + } + } elsif (-f $dir) { + # nothing to say, no matter what the permissions + } + } else { + $CPAN::Frontend->mywarn("File or directory '$dir' has gone, ignoring\n"); + return; + } + if ($fast) { + $Du = 0; # placeholder + } else { + find( + sub { + $File::Find::prune++ if $CPAN::Signal; + return if -l $_; + if ($^O eq 'MacOS') { + require Mac::Files; + my $cat = Mac::Files::FSpGetCatInfo($_); + $Du += $cat->ioFlLgLen() + $cat->ioFlRLgLen() if $cat; + } else { + if (-d _) { + unless (-x _) { + unless (chmod 0755, $_) { + $CPAN::Frontend->mywarn("I have neither the -x permission nor ". + "the permission to change the permission; ". + "can only partially estimate disk usage ". + "of '$_'\n"); + $CPAN::Frontend->mysleep(5); + return; + } + } + } else { + $Du += (-s _); + } + } + }, + $dir + ); + } + return if $CPAN::Signal; + $self->{SIZE}{$dir} = $Du/1024/1024; + unshift @{$self->{FIFO}}, $dir; + $self->debug("measured $dir is $Du") if $CPAN::DEBUG; + $self->{DU} += $Du/1024/1024; + $self->{DU}; +} + +#-> sub CPAN::CacheMgr::_clean_cache ; +sub _clean_cache { + my($self,$dir) = @_; + return unless -e $dir; + unless (File::Spec->canonpath(File::Basename::dirname($dir)) + eq File::Spec->canonpath($CPAN::Config->{build_dir})) { + $CPAN::Frontend->mywarn("Directory '$dir' not below $CPAN::Config->{build_dir}, ". + "will not remove\n"); + $CPAN::Frontend->mysleep(5); + return; + } + $self->debug("have to rmtree $dir, will free $self->{SIZE}{$dir}") + if $CPAN::DEBUG; + File::Path::rmtree($dir); + my $id_deleted = 0; + if ($dir !~ /\.yml$/ && -f "$dir.yml") { + my $yaml_module = CPAN::_yaml_module(); + if ($CPAN::META->has_inst($yaml_module)) { + my($peek_yaml) = eval { CPAN->_yaml_loadfile("$dir.yml"); }; + if ($@) { + $CPAN::Frontend->mywarn("(parse error on '$dir.yml' removing anyway)"); + unlink "$dir.yml" or + $CPAN::Frontend->mywarn("(Could not unlink '$dir.yml': $!)"); + return; + } elsif (my $id = $peek_yaml->[0]{distribution}{ID}) { + $CPAN::META->delete("CPAN::Distribution", $id); + + # XXX we should restore the state NOW, otherwise this + # distro does not exist until we read an index. BUG ALERT(?) + + # $CPAN::Frontend->mywarn (" +++\n"); + $id_deleted++; + } + } + unlink "$dir.yml"; # may fail + unless ($id_deleted) { + CPAN->debug("no distro found associated with '$dir'"); + } + } + $self->{DU} -= $self->{SIZE}{$dir}; + delete $self->{SIZE}{$dir}; +} + +#-> sub CPAN::CacheMgr::new ; +sub new { + my($class,$phase) = @_; + $phase ||= "atstart"; + my $time = time; + my($debug,$t2); + $debug = ""; + my $self = { + ID => $CPAN::Config->{build_dir}, + MAX => $CPAN::Config->{'build_cache'}, + SCAN => $CPAN::Config->{'scan_cache'} || 'atstart', + DU => 0 + }; + $CPAN::Frontend->mydie("Unknown scan_cache argument: $self->{SCAN}") + unless $self->{SCAN} =~ /never|atstart|atexit/; + File::Path::mkpath($self->{ID}); + my $dh = DirHandle->new($self->{ID}); + bless $self, $class; + $self->scan_cache($phase); + $t2 = time; + $debug .= "timing of CacheMgr->new: ".($t2 - $time); + $time = $t2; + CPAN->debug($debug) if $CPAN::DEBUG; + $self; +} + +#-> sub CPAN::CacheMgr::scan_cache ; +sub scan_cache { + my ($self, $phase) = @_; + $phase = '' unless defined $phase; + return unless $phase eq $self->{SCAN}; + return unless $CPAN::META->{LOCK}; + $CPAN::Frontend->myprint( + sprintf("Scanning cache %s for sizes\n", + $self->{ID})); + my $e; + my @entries = $self->entries($self->{ID}); + my $i = 0; + my $painted = 0; + for $e (@entries) { + my $symbol = "."; + if ($self->{DU} > $self->{MAX}) { + $symbol = "-"; + $self->disk_usage($e,1); + } else { + $self->disk_usage($e); + } + $i++; + while (($painted/76) < ($i/@entries)) { + $CPAN::Frontend->myprint($symbol); + $painted++; + } + return if $CPAN::Signal; + } + $CPAN::Frontend->myprint("DONE\n"); + $self->tidyup; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::InfoObj; +use strict; + +use CPAN::Debug; +@CPAN::InfoObj::ISA = qw(CPAN::Debug); + +use Cwd qw(chdir); + +use vars qw( + $VERSION +); +$VERSION = "5.5"; + +sub ro { + my $self = shift; + exists $self->{RO} and return $self->{RO}; +} + +#-> sub CPAN::InfoObj::cpan_userid +sub cpan_userid { + my $self = shift; + my $ro = $self->ro; + if ($ro) { + return $ro->{CPAN_USERID} || "N/A"; + } else { + $self->debug("ID[$self->{ID}]"); + # N/A for bundles found locally + return "N/A"; + } +} + +sub id { shift->{ID}; } + +#-> sub CPAN::InfoObj::new ; +sub new { + my $this = bless {}, shift; + %$this = @_; + $this +} + +# The set method may only be used by code that reads index data or +# otherwise "objective" data from the outside world. All session +# related material may do anything else with instance variables but +# must not touch the hash under the RO attribute. The reason is that +# the RO hash gets written to Metadata file and is thus persistent. + +#-> sub CPAN::InfoObj::safe_chdir ; +sub safe_chdir { + my($self,$todir) = @_; + # we die if we cannot chdir and we are debuggable + Carp::confess("safe_chdir called without todir argument") + unless defined $todir and length $todir; + if (chdir $todir) { + $self->debug(sprintf "changed directory to %s", CPAN::anycwd()) + if $CPAN::DEBUG; + } else { + if (-e $todir) { + unless (-x $todir) { + unless (chmod 0755, $todir) { + my $cwd = CPAN::anycwd(); + $CPAN::Frontend->mywarn("I have neither the -x permission nor the ". + "permission to change the permission; cannot ". + "chdir to '$todir'\n"); + $CPAN::Frontend->mysleep(5); + $CPAN::Frontend->mydie(qq{Could not chdir from cwd[$cwd] }. + qq{to todir[$todir]: $!}); + } + } + } else { + $CPAN::Frontend->mydie("Directory '$todir' has gone. Cannot continue.\n"); + } + if (chdir $todir) { + $self->debug(sprintf "changed directory to %s", CPAN::anycwd()) + if $CPAN::DEBUG; + } else { + my $cwd = CPAN::anycwd(); + $CPAN::Frontend->mydie(qq{Could not chdir from cwd[$cwd] }. + qq{to todir[$todir] (a chmod has been issued): $!}); + } + } +} + +#-> sub CPAN::InfoObj::set ; +sub set { + my($self,%att) = @_; + my $class = ref $self; + + # This must be ||=, not ||, because only if we write an empty + # reference, only then the set method will write into the readonly + # area. But for Distributions that spring into existence, maybe + # because of a typo, we do not like it that they are written into + # the readonly area and made permanent (at least for a while) and + # that is why we do not "allow" other places to call ->set. + unless ($self->id) { + CPAN->debug("Bug? Empty ID, rejecting"); + return; + } + my $ro = $self->{RO} = + $CPAN::META->{readonly}{$class}{$self->id} ||= {}; + + while (my($k,$v) = each %att) { + $ro->{$k} = $v; + } +} + +#-> sub CPAN::InfoObj::as_glimpse ; +sub as_glimpse { + my($self) = @_; + my(@m); + my $class = ref($self); + $class =~ s/^CPAN:://; + my $id = $self->can("pretty_id") ? $self->pretty_id : $self->{ID}; + push @m, sprintf "%-15s %s\n", $class, $id; + join "", @m; +} + +#-> sub CPAN::InfoObj::as_string ; +sub as_string { + my($self) = @_; + my(@m); + my $class = ref($self); + $class =~ s/^CPAN:://; + push @m, $class, " id = $self->{ID}\n"; + my $ro; + unless ($ro = $self->ro) { + if (substr($self->{ID},-1,1) eq ".") { # directory + $ro = +{}; + } else { + $CPAN::Frontend->mywarn("Unknown object $self->{ID}\n"); + $CPAN::Frontend->mysleep(5); + return; + } + } + for (sort keys %$ro) { + # next if m/^(ID|RO)$/; + my $extra = ""; + if ($_ eq "CPAN_USERID") { + $extra .= " ("; + $extra .= $self->fullname; + my $email; # old perls! + if ($email = $CPAN::META->instance("CPAN::Author", + $self->cpan_userid + )->email) { + $extra .= " <$email>"; + } else { + $extra .= " <no email>"; + } + $extra .= ")"; + } elsif ($_ eq "FULLNAME") { # potential UTF-8 conversion + push @m, sprintf " %-12s %s\n", $_, $self->fullname; + next; + } + next unless defined $ro->{$_}; + push @m, sprintf " %-12s %s%s\n", $_, $ro->{$_}, $extra; + } + KEY: for (sort keys %$self) { + next if m/^(ID|RO)$/; + unless (defined $self->{$_}) { + delete $self->{$_}; + next KEY; + } + if (ref($self->{$_}) eq "ARRAY") { + push @m, sprintf " %-12s %s\n", $_, "@{$self->{$_}}"; + } elsif (ref($self->{$_}) eq "HASH") { + my $value; + if (/^CONTAINSMODS$/) { + $value = join(" ",sort keys %{$self->{$_}}); + } elsif (/^prereq_pm$/) { + my @value; + my $v = $self->{$_}; + for my $x (sort keys %$v) { + my @svalue; + for my $y (sort keys %{$v->{$x}}) { + push @svalue, "$y=>$v->{$x}{$y}"; + } + push @value, "$x\:" . join ",", @svalue if @svalue; + } + $value = join ";", @value; + } else { + $value = $self->{$_}; + } + push @m, sprintf( + " %-12s %s\n", + $_, + $value, + ); + } else { + push @m, sprintf " %-12s %s\n", $_, $self->{$_}; + } + } + join "", @m, "\n"; +} + +#-> sub CPAN::InfoObj::fullname ; +sub fullname { + my($self) = @_; + $CPAN::META->instance("CPAN::Author",$self->cpan_userid)->fullname; +} + +#-> sub CPAN::InfoObj::dump ; +sub dump { + my($self, $what) = @_; + unless ($CPAN::META->has_inst("Data::Dumper")) { + $CPAN::Frontend->mydie("dump command requires Data::Dumper installed"); + } + local $Data::Dumper::Sortkeys; + $Data::Dumper::Sortkeys = 1; + my $out = Data::Dumper::Dumper($what ? eval $what : $self); + if (length $out > 100000) { + my $fh_pager = FileHandle->new; + local($SIG{PIPE}) = "IGNORE"; + my $pager = $CPAN::Config->{'pager'} || "cat"; + $fh_pager->open("|$pager") + or die "Could not open pager $pager\: $!"; + $fh_pager->print($out); + close $fh_pager; + } else { + $CPAN::Frontend->myprint($out); + } +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Distribution; +use strict; +use Cwd qw(chdir); +use CPAN::Distroprefs; +use CPAN::InfoObj; +use File::Path (); +@CPAN::Distribution::ISA = qw(CPAN::InfoObj); +use vars qw($VERSION); +$VERSION = "2.19"; + +# no prepare, because prepare is not a command on the shell command line +# TODO: clear instance cache on reload +my %instance; +for my $method (qw(get make test install)) { + no strict 'refs'; + for my $prefix (qw(pre post)) { + my $hookname = sprintf "%s_%s", $prefix, $method; + *$hookname = sub { + my($self) = @_; + for my $plugin (@{$CPAN::Config->{plugin_list}}) { + my($plugin_proper,$args) = split /=/, $plugin, 2; + $args = "" unless defined $args; + if ($CPAN::META->has_inst($plugin_proper)){ + my @args = split /,/, $args; + $instance{$plugin} ||= $plugin_proper->new(@args); + if ($instance{$plugin}->can($hookname)) { + $instance{$plugin}->$hookname($self); + } + } else { + $CPAN::Frontend->mydie("Plugin '$plugin_proper' not found"); + } + } + }; + } +} + +# Accessors +sub cpan_comment { + my $self = shift; + my $ro = $self->ro or return; + $ro->{CPAN_COMMENT} +} + +#-> CPAN::Distribution::undelay +sub undelay { + my $self = shift; + for my $delayer ( + "configure_requires_later", + "configure_requires_later_for", + "later", + "later_for", + ) { + delete $self->{$delayer}; + } +} + +#-> CPAN::Distribution::is_dot_dist +sub is_dot_dist { + my($self) = @_; + return substr($self->id,-1,1) eq "."; +} + +# add the A/AN/ stuff +#-> CPAN::Distribution::normalize +sub normalize { + my($self,$s) = @_; + $s = $self->id unless defined $s; + if (substr($s,-1,1) eq ".") { + # using a global because we are sometimes called as static method + if (!$CPAN::META->{LOCK} + && !$CPAN::Have_warned->{"$s is unlocked"}++ + ) { + $CPAN::Frontend->mywarn("You are visiting the local directory + '$s' + without lock, take care that concurrent processes do not do likewise.\n"); + $CPAN::Frontend->mysleep(1); + } + if ($s eq ".") { + $s = "$CPAN::iCwd/."; + } elsif (File::Spec->file_name_is_absolute($s)) { + } elsif (File::Spec->can("rel2abs")) { + $s = File::Spec->rel2abs($s); + } else { + $CPAN::Frontend->mydie("Your File::Spec is too old, please upgrade File::Spec"); + } + CPAN->debug("s[$s]") if $CPAN::DEBUG; + unless ($CPAN::META->exists("CPAN::Distribution", $s)) { + for ($CPAN::META->instance("CPAN::Distribution", $s)) { + $_->{build_dir} = $s; + $_->{archived} = "local_directory"; + $_->{unwrapped} = CPAN::Distrostatus->new("YES -- local_directory"); + } + } + } elsif ( + $s =~ tr|/|| == 1 + or + $s !~ m|[A-Z]/[A-Z-0-9]{2}/[A-Z-0-9]{2,}/| + ) { + return $s if $s =~ m:^N/A|^Contact Author: ; + $s =~ s|^(.)(.)([^/]*/)(.+)$|$1/$1$2/$1$2$3$4|; + CPAN->debug("s[$s]") if $CPAN::DEBUG; + } + $s; +} + +#-> sub CPAN::Distribution::author ; +sub author { + my($self) = @_; + my($authorid); + if (substr($self->id,-1,1) eq ".") { + $authorid = "LOCAL"; + } else { + ($authorid) = $self->pretty_id =~ /^([\w\-]+)/; + } + CPAN::Shell->expand("Author",$authorid); +} + +# tries to get the yaml from CPAN instead of the distro itself: +# EXPERIMENTAL, UNDOCUMENTED AND UNTESTED, for Tels +sub fast_yaml { + my($self) = @_; + my $meta = $self->pretty_id; + $meta =~ s/\.(tar.gz|tgz|zip|tar.bz2)/.meta/; + my(@ls) = CPAN::Shell->globls($meta); + my $norm = $self->normalize($meta); + + my($local_file); + my($local_wanted) = + File::Spec->catfile( + $CPAN::Config->{keep_source_where}, + "authors", + "id", + split(/\//,$norm) + ); + $self->debug("Doing localize") if $CPAN::DEBUG; + unless ($local_file = + CPAN::FTP->localize("authors/id/$norm", + $local_wanted)) { + $CPAN::Frontend->mydie("Giving up on downloading yaml file '$local_wanted'\n"); + } + my $yaml = CPAN->_yaml_loadfile($local_file)->[0]; +} + +#-> sub CPAN::Distribution::cpan_userid +sub cpan_userid { + my $self = shift; + if ($self->{ID} =~ m{[A-Z]/[A-Z\-]{2}/([A-Z\-]+)/}) { + return $1; + } + return $self->SUPER::cpan_userid; +} + +#-> sub CPAN::Distribution::pretty_id +sub pretty_id { + my $self = shift; + my $id = $self->id; + return $id unless $id =~ m|^./../|; + substr($id,5); +} + +#-> sub CPAN::Distribution::base_id +sub base_id { + my $self = shift; + my $id = $self->pretty_id(); + my $base_id = File::Basename::basename($id); + $base_id =~ s{\.(?:tar\.(bz2|gz|Z)|t(?:gz|bz)|zip)$}{}i; + return $base_id; +} + +#-> sub CPAN::Distribution::tested_ok_but_not_installed +sub tested_ok_but_not_installed { + my $self = shift; + return ( + $self->{make_test} + && $self->{build_dir} + && (UNIVERSAL::can($self->{make_test},"failed") ? + ! $self->{make_test}->failed : + $self->{make_test} =~ /^YES/ + ) + && ( + !$self->{install} + || + $self->{install}->failed + ) + ); +} + + +# mark as dirty/clean for the sake of recursion detection. $color=1 +# means "in use", $color=0 means "not in use anymore". $color=2 means +# we have determined prereqs now and thus insist on passing this +# through (at least) once again. + +#-> sub CPAN::Distribution::color_cmd_tmps ; +sub color_cmd_tmps { + my($self) = shift; + my($depth) = shift || 0; + my($color) = shift || 0; + my($ancestors) = shift || []; + # a distribution needs to recurse into its prereq_pms + $self->debug("color_cmd_tmps[$depth,$color,@$ancestors]") if $CPAN::DEBUG; + + return if exists $self->{incommandcolor} + && $color==1 + && $self->{incommandcolor}==$color; + $CPAN::MAX_RECURSION||=0; # silence 'once' warnings + if ($depth>=$CPAN::MAX_RECURSION) { + my $e = CPAN::Exception::RecursiveDependency->new($ancestors); + if ($e->is_resolvable) { + return $self->{incommandcolor}=2; + } else { + die $e; + } + } + # warn "color_cmd_tmps $depth $color " . $self->id; # sleep 1; + my $prereq_pm = $self->prereq_pm; + if (defined $prereq_pm) { + # XXX also optional_req & optional_breq? -- xdg, 2012-04-01 + # A: no, optional deps may recurse -- ak, 2014-05-07 + PREREQ: for my $pre (sort( + keys %{$prereq_pm->{requires}||{}}, + keys %{$prereq_pm->{build_requires}||{}}, + )) { + next PREREQ if $pre eq "perl"; + my $premo; + unless ($premo = CPAN::Shell->expand("Module",$pre)) { + $CPAN::Frontend->mywarn("prerequisite module[$pre] not known\n"); + $CPAN::Frontend->mysleep(0.2); + next PREREQ; + } + $premo->color_cmd_tmps($depth+1,$color,[@$ancestors, $self->id]); + } + } + if ($color==0) { + delete $self->{sponsored_mods}; + + # as we are at the end of a command, we'll give up this + # reminder of a broken test. Other commands may test this guy + # again. Maybe 'badtestcnt' should be renamed to + # 'make_test_failed_within_command'? + delete $self->{badtestcnt}; + } + $self->{incommandcolor} = $color; +} + +#-> sub CPAN::Distribution::as_string ; +sub as_string { + my $self = shift; + $self->containsmods; + $self->upload_date; + $self->SUPER::as_string(@_); +} + +#-> sub CPAN::Distribution::containsmods ; +sub containsmods { + my $self = shift; + return sort keys %{$self->{CONTAINSMODS}} if exists $self->{CONTAINSMODS}; + my $dist_id = $self->{ID}; + for my $mod ($CPAN::META->all_objects("CPAN::Module")) { + my $mod_file = $mod->cpan_file or next; + my $mod_id = $mod->{ID} or next; + # warn "mod_file[$mod_file] dist_id[$dist_id] mod_id[$mod_id]"; + # sleep 1; + if ($CPAN::Signal) { + delete $self->{CONTAINSMODS}; + return; + } + $self->{CONTAINSMODS}{$mod_id} = undef if $mod_file eq $dist_id; + } + sort keys %{$self->{CONTAINSMODS}||={}}; +} + +#-> sub CPAN::Distribution::upload_date ; +sub upload_date { + my $self = shift; + return $self->{UPLOAD_DATE} if exists $self->{UPLOAD_DATE}; + my(@local_wanted) = split(/\//,$self->id); + my $filename = pop @local_wanted; + push @local_wanted, "CHECKSUMS"; + my $author = CPAN::Shell->expand("Author",$self->cpan_userid); + return unless $author; + my @dl = $author->dir_listing(\@local_wanted,0,$CPAN::Config->{show_upload_date}); + return unless @dl; + my($dirent) = grep { $_->[2] eq $filename } @dl; + # warn sprintf "dirent[%s]id[%s]", $dirent, $self->id; + return unless $dirent->[1]; + return $self->{UPLOAD_DATE} = $dirent->[1]; +} + +#-> sub CPAN::Distribution::uptodate ; +sub uptodate { + my($self) = @_; + my $c; + foreach $c ($self->containsmods) { + my $obj = CPAN::Shell->expandany($c); + unless ($obj->uptodate) { + my $id = $self->pretty_id; + $self->debug("$id not uptodate due to $c") if $CPAN::DEBUG; + return 0; + } + } + return 1; +} + +#-> sub CPAN::Distribution::called_for ; +sub called_for { + my($self,$id) = @_; + $self->{CALLED_FOR} = $id if defined $id; + return $self->{CALLED_FOR}; +} + +#-> sub CPAN::Distribution::shortcut_get ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_get { + my ($self) = @_; + + if (my $why = $self->check_disabled) { + $self->{unwrapped} = CPAN::Distrostatus->new("NO $why"); + # XXX why is this goodbye() instead of just print/warn? + # Alternatively, should other print/warns here be goodbye()? + # -- xdg, 2012-04-05 + return $self->goodbye("[disabled] -- NA $why"); + } + + $self->debug("checking already unwrapped[$self->{ID}]") if $CPAN::DEBUG; + if (exists $self->{build_dir} && -d $self->{build_dir}) { + # this deserves print, not warn: + return $self->success("Has already been unwrapped into directory ". + "$self->{build_dir}" + ); + } + + # XXX I'm not sure this should be here because it's not really + # a test for whether get should continue or return; this is + # a side effect -- xdg, 2012-04-05 + $self->debug("checking missing build_dir[$self->{ID}]") if $CPAN::DEBUG; + if (exists $self->{build_dir} && ! -d $self->{build_dir}){ + # we have lost it. + $self->fforce(""); # no method to reset all phases but not set force (dodge) + return undef; # no shortcut + } + + # although we talk about 'force' we shall not test on + # force directly. New model of force tries to refrain from + # direct checking of force. + $self->debug("checking unwrapping error[$self->{ID}]") if $CPAN::DEBUG; + if ( exists $self->{unwrapped} and ( + UNIVERSAL::can($self->{unwrapped},"failed") ? + $self->{unwrapped}->failed : + $self->{unwrapped} =~ /^NO/ ) + ) { + return $self->goodbye("Unwrapping had some problem, won't try again without force"); + } + + return undef; # no shortcut +} + +#-> sub CPAN::Distribution::get ; +sub get { + my($self) = @_; + + $self->pre_get(); + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; + if (my $goto = $self->prefs->{goto}) { + return $self->goto($goto); + } + + if ( defined( my $sc = $self->shortcut_get) ) { + return $sc; + } + + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + # local $ENV{PERL_USE_UNSAFE_INC} = exists $ENV{PERL_USE_UNSAFE_INC} ? $ENV{PERL_USE_UNSAFE_INC} : 1; # get + $CPAN::META->set_perl5lib; + local $ENV{MAKEFLAGS}; # protect us from outer make calls + + my $sub_wd = CPAN::anycwd(); # for cleaning up as good as possible + + my($local_file); + # XXX I don't think this check needs to be here, as it + # is already checked in shortcut_get() -- xdg, 2012-04-05 + unless ($self->{build_dir} && -d $self->{build_dir}) { + $self->get_file_onto_local_disk; + return if $CPAN::Signal; + $self->check_integrity; + return if $CPAN::Signal; + (my $packagedir,$local_file) = $self->run_preps_on_packagedir; + # XXX why is this check here? -- xdg, 2012-04-08 + if (exists $self->{writemakefile} && ref $self->{writemakefile} + && $self->{writemakefile}->can("failed") && + $self->{writemakefile}->failed) { + # + return; + } + $packagedir ||= $self->{build_dir}; + $self->{build_dir} = $packagedir; + } + + # XXX should this move up to after run_preps_on_packagedir? + # Otherwise, failing writemakefile can return without + # a $CPAN::Signal check -- xdg, 2012-04-05 + if ($CPAN::Signal) { + $self->safe_chdir($sub_wd); + return; + } + return unless $self->patch; + $self->store_persistent_state; + + $self->post_get(); + + return 1; # success +} + +#-> CPAN::Distribution::get_file_onto_local_disk +sub get_file_onto_local_disk { + my($self) = @_; + + return if $self->is_dot_dist; + my($local_file); + my($local_wanted) = + File::Spec->catfile( + $CPAN::Config->{keep_source_where}, + "authors", + "id", + split(/\//,$self->id) + ); + + $self->debug("Doing localize") if $CPAN::DEBUG; + unless ($local_file = + CPAN::FTP->localize("authors/id/$self->{ID}", + $local_wanted)) { + my $note = ""; + if ($CPAN::Index::DATE_OF_02) { + $note = "Note: Current database in memory was generated ". + "on $CPAN::Index::DATE_OF_02\n"; + } + $CPAN::Frontend->mydie("Giving up on '$local_wanted'\n$note"); + } + + $self->debug("local_wanted[$local_wanted]local_file[$local_file]") if $CPAN::DEBUG; + $self->{localfile} = $local_file; +} + + +#-> CPAN::Distribution::check_integrity +sub check_integrity { + my($self) = @_; + + return if $self->is_dot_dist; + if ($CPAN::META->has_inst("Digest::SHA")) { + $self->debug("Digest::SHA is installed, verifying"); + $self->verifyCHECKSUM; + } else { + $self->debug("Digest::SHA is NOT installed"); + } +} + +#-> CPAN::Distribution::run_preps_on_packagedir +sub run_preps_on_packagedir { + my($self) = @_; + return if $self->is_dot_dist; + + $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new(); # unsafe meta access, ok + my $builddir = $CPAN::META->{cachemgr}->dir; # unsafe meta access, ok + $self->safe_chdir($builddir); + $self->debug("Removing tmp-$$") if $CPAN::DEBUG; + File::Path::rmtree("tmp-$$"); + unless (mkdir "tmp-$$", 0755) { + $CPAN::Frontend->unrecoverable_error(<<EOF); +Couldn't mkdir '$builddir/tmp-$$': $! + +Cannot continue: Please find the reason why I cannot make the +directory +$builddir/tmp-$$ +and fix the problem, then retry. + +EOF + } + if ($CPAN::Signal) { + return; + } + $self->safe_chdir("tmp-$$"); + + # + # Unpack the goods + # + my $local_file = $self->{localfile}; + my $ct = eval{CPAN::Tarzip->new($local_file)}; + unless ($ct) { + $self->{unwrapped} = CPAN::Distrostatus->new("NO"); + delete $self->{build_dir}; + return; + } + if ($local_file =~ /(\.tar\.(bz2|gz|Z)|\.tgz)(?!\n)\Z/i) { + $self->{was_uncompressed}++ unless eval{$ct->gtest()}; + $self->untar_me($ct); + } elsif ( $local_file =~ /\.zip(?!\n)\Z/i ) { + $self->unzip_me($ct); + } else { + $self->{was_uncompressed}++ unless $ct->gtest(); + $local_file = $self->handle_singlefile($local_file); + } + + # we are still in the tmp directory! + # Let's check if the package has its own directory. + my $dh = DirHandle->new(File::Spec->curdir) + or Carp::croak("Couldn't opendir .: $!"); + my @readdir = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh->read; ### MAC?? + if (grep { $_ eq "pax_global_header" } @readdir) { + $CPAN::Frontend->mywarn("Your (un)tar seems to have extracted a file named 'pax_global_header' +from the tarball '$local_file'. +This is almost certainly an error. Please upgrade your tar. +I'll ignore this file for now. +See also http://rt.cpan.org/Ticket/Display.html?id=38932\n"); + $CPAN::Frontend->mysleep(5); + @readdir = grep { $_ ne "pax_global_header" } @readdir; + } + $dh->close; + my $tdir_base; + my $from_dir; + my @dirents; + if (@readdir == 1 && -d $readdir[0]) { + $tdir_base = $readdir[0]; + $from_dir = File::Spec->catdir(File::Spec->curdir,$readdir[0]); + my $dh2; + unless ($dh2 = DirHandle->new($from_dir)) { + my($mode) = (stat $from_dir)[2]; + my $why = sprintf + ( + "Couldn't opendir '%s', mode '%o': %s", + $from_dir, + $mode, + $!, + ); + $CPAN::Frontend->mywarn("$why\n"); + $self->{writemakefile} = CPAN::Distrostatus->new("NO -- $why"); + return; + } + @dirents = grep $_ !~ /^\.\.?(?!\n)\Z/s, $dh2->read; ### MAC?? + } else { + my $userid = $self->cpan_userid; + CPAN->debug("userid[$userid]"); + if (!$userid or $userid eq "N/A") { + $userid = "anon"; + } + $tdir_base = $userid; + $from_dir = File::Spec->curdir; + @dirents = @readdir; + } + eval { File::Path::mkpath $builddir; }; + if ($@) { + $CPAN::Frontend->mydie("Cannot create directory $builddir: $@"); + } + my $packagedir; + my $eexist = $CPAN::META->has_usable("Errno") ? &Errno::EEXIST : undef; + for(my $suffix = 0; ; $suffix++) { + $packagedir = File::Spec->catdir($builddir, "$tdir_base-$suffix"); + my $parent = $builddir; + mkdir($packagedir, 0777) and last; + if((defined($eexist) && $! != $eexist) || $suffix == 999) { + $CPAN::Frontend->mydie("Cannot create directory $packagedir: $!\n"); + } + } + my $f; + for $f (@dirents) { # is already without "." and ".." + my $from = File::Spec->catfile($from_dir,$f); + my $to = File::Spec->catfile($packagedir,$f); + unless (File::Copy::move($from,$to)) { + my $err = $!; + $from = File::Spec->rel2abs($from); + $CPAN::Frontend->mydie( + "Couldn't move $from to $to: $err; #82295? ". + "CPAN::VERSION=$CPAN::VERSION; ". + "File::Copy::VERSION=$File::Copy::VERSION; ". + "$from " . (-e $from ? "exists; " : "does not exist; "). + "$to " . (-e $to ? "exists; " : "does not exist; "). + "cwd=" . CPAN::anycwd() . ";" + ); + } + } + $self->{build_dir} = $packagedir; + $self->safe_chdir($builddir); + File::Path::rmtree("tmp-$$"); + + $self->safe_chdir($packagedir); + $self->_signature_business(); + $self->safe_chdir($builddir); + + return($packagedir,$local_file); +} + +#-> sub CPAN::Distribution::pick_meta_file ; +sub pick_meta_file { + my($self, $filter) = @_; + $filter = '.' unless defined $filter; + + my $build_dir; + unless ($build_dir = $self->{build_dir}) { + # maybe permission on build_dir was missing + $CPAN::Frontend->mywarn("Warning: cannot determine META.yml without a build_dir.\n"); + return; + } + + my $has_cm = $CPAN::META->has_usable("CPAN::Meta"); + my $has_pcm = $CPAN::META->has_usable("Parse::CPAN::Meta"); + + my @choices; + push @choices, 'MYMETA.json' if $has_cm; + push @choices, 'MYMETA.yml' if $has_cm || $has_pcm; + push @choices, 'META.json' if $has_cm; + push @choices, 'META.yml' if $has_cm || $has_pcm; + + for my $file ( grep { /$filter/ } @choices ) { + my $path = File::Spec->catfile( $build_dir, $file ); + return $path if -f $path + } + + return; +} + +#-> sub CPAN::Distribution::parse_meta_yml ; +sub parse_meta_yml { + my($self, $yaml) = @_; + $self->debug(sprintf("parse_meta_yml[%s]",$yaml||'undef')) if $CPAN::DEBUG; + my $build_dir = $self->{build_dir} or die "PANIC: cannot parse yaml without a build_dir"; + $yaml ||= File::Spec->catfile($build_dir,"META.yml"); + $self->debug("meta[$yaml]") if $CPAN::DEBUG; + return unless -f $yaml; + my $early_yaml; + eval { + $CPAN::META->has_inst("Parse::CPAN::Meta") or die; + die "Parse::CPAN::Meta yaml too old" unless $Parse::CPAN::Meta::VERSION >= "1.40"; + # P::C::M returns last document in scalar context + $early_yaml = Parse::CPAN::Meta::LoadFile($yaml); + }; + unless ($early_yaml) { + eval { $early_yaml = CPAN->_yaml_loadfile($yaml)->[0]; }; + } + $self->debug(sprintf("yaml[%s]", $early_yaml || 'UNDEF')) if $CPAN::DEBUG; + $self->debug($early_yaml) if $CPAN::DEBUG && $early_yaml; + if (!ref $early_yaml or ref $early_yaml ne "HASH"){ + # fix rt.cpan.org #95271 + $CPAN::Frontend->mywarn("The content of '$yaml' is not a HASH reference. Cannot use it.\n"); + return {}; + } + return $early_yaml || undef; +} + +#-> sub CPAN::Distribution::satisfy_requires ; +# return values: 1 means requirements are satisfied; +# and 0 means not satisfied (and maybe queued) +sub satisfy_requires { + my ($self) = @_; + $self->debug("Entering satisfy_requires") if $CPAN::DEBUG; + if (my @prereq = $self->unsat_prereq("later")) { + if ($CPAN::DEBUG){ + require Data::Dumper; + my $prereq = Data::Dumper->new(\@prereq)->Terse(1)->Indent(0)->Dump; + $self->debug("unsatisfied[$prereq]"); + } + if ($prereq[0][0] eq "perl") { + my $need = "requires perl '$prereq[0][1]'"; + my $id = $self->pretty_id; + $CPAN::Frontend->mywarn("$id $need; you have only $]; giving up\n"); + $self->{make} = CPAN::Distrostatus->new("NO $need"); + $self->store_persistent_state; + die "[prereq] -- NOT OK\n"; + } else { + my $follow = eval { $self->follow_prereqs("later",@prereq); }; + if (0) { + } elsif ($follow) { + return; # we need deps + } elsif ($@ && ref $@ && $@->isa("CPAN::Exception::RecursiveDependency")) { + $CPAN::Frontend->mywarn($@); + die "[depend] -- NOT OK\n"; + } + } + } + return 1; +} + +#-> sub CPAN::Distribution::satisfy_configure_requires ; +# return values: 1 means configure_require is satisfied; +# and 0 means not satisfied (and maybe queued) +sub satisfy_configure_requires { + my($self) = @_; + $self->debug("Entering satisfy_configure_requires") if $CPAN::DEBUG; + my $enable_configure_requires = 1; + if (!$enable_configure_requires) { + return 1; + # if we return 1 here, everything is as before we introduced + # configure_requires that means, things with + # configure_requires simply fail, all others succeed + } + my @prereq = $self->unsat_prereq("configure_requires_later"); + $self->debug(sprintf "configure_requires[%s]", join(",",map {join "/",@$_} @prereq)) if $CPAN::DEBUG; + return 1 unless @prereq; + $self->debug(\@prereq) if $CPAN::DEBUG; + if ($self->{configure_requires_later}) { + for my $k (sort keys %{$self->{configure_requires_later_for}||{}}) { + if ($self->{configure_requires_later_for}{$k}>1) { + my $type = ""; + for my $p (@prereq) { + if ($p->[0] eq $k) { + $type = $p->[1]; + } + } + $type = " $type" if $type; + $CPAN::Frontend->mywarn("Warning: unmanageable(?) prerequisite $k$type"); + sleep 1; + } + } + } + if ($prereq[0][0] eq "perl") { + my $need = "requires perl '$prereq[0][1]'"; + my $id = $self->pretty_id; + $CPAN::Frontend->mywarn("$id $need; you have only $]; giving up\n"); + $self->{make} = CPAN::Distrostatus->new("NO $need"); + $self->store_persistent_state; + return $self->goodbye("[prereq] -- NOT OK"); + } else { + my $follow = eval { + $self->follow_prereqs("configure_requires_later", @prereq); + }; + if (0) { + } elsif ($follow) { + return; # we need deps + } elsif ($@ && ref $@ && $@->isa("CPAN::Exception::RecursiveDependency")) { + $CPAN::Frontend->mywarn($@); + return $self->goodbye("[depend] -- NOT OK"); + } + else { + return $self->goodbye("[configure_requires] -- NOT OK"); + } + } + die "never reached"; +} + +#-> sub CPAN::Distribution::choose_MM_or_MB ; +sub choose_MM_or_MB { + my($self) = @_; + $self->satisfy_configure_requires() or return; + my $local_file = $self->{localfile}; + my($mpl) = File::Spec->catfile($self->{build_dir},"Makefile.PL"); + my($mpl_exists) = -f $mpl; + unless ($mpl_exists) { + # NFS has been reported to have racing problems after the + # renaming of a directory in some environments. + # This trick helps. + $CPAN::Frontend->mysleep(1); + my $mpldh = DirHandle->new($self->{build_dir}) + or Carp::croak("Couldn't opendir $self->{build_dir}: $!"); + $mpl_exists = grep /^Makefile\.PL$/, $mpldh->read; + $mpldh->close; + } + my $prefer_installer = "eumm"; # eumm|mb + if (-f File::Spec->catfile($self->{build_dir},"Build.PL")) { + if ($mpl_exists) { # they *can* choose + if ($CPAN::META->has_inst("Module::Build")) { + $prefer_installer = CPAN::HandleConfig->prefs_lookup( + $self, q{prefer_installer} + ); + # M::B <= 0.35 left a DATA handle open that + # causes problems upgrading M::B on Windows + close *Module::Build::Version::DATA + if fileno *Module::Build::Version::DATA; + } + } else { + $prefer_installer = "mb"; + } + } + if (lc($prefer_installer) eq "rand") { + $prefer_installer = rand()<.5 ? "eumm" : "mb"; + } + if (lc($prefer_installer) eq "mb") { + $self->{modulebuild} = 1; + } elsif ($self->{archived} eq "patch") { + # not an edge case, nothing to install for sure + my $why = "A patch file cannot be installed"; + $CPAN::Frontend->mywarn("Refusing to handle this file: $why\n"); + $self->{writemakefile} = CPAN::Distrostatus->new("NO $why"); + } elsif (! $mpl_exists) { + $self->_edge_cases($mpl,$local_file); + } + if ($self->{build_dir} + && + $CPAN::Config->{build_dir_reuse} + ) { + $self->store_persistent_state; + } + return $self; +} + +# see also reanimate_build_dir +#-> CPAN::Distribution::store_persistent_state +sub store_persistent_state { + my($self) = @_; + my $dir = $self->{build_dir}; + unless (defined $dir && length $dir) { + my $id = $self->id; + $CPAN::Frontend->mywarnonce("build_dir of $id is not known, ". + "will not store persistent state\n"); + return; + } + # self-build-dir + my $sbd = Cwd::realpath( + File::Spec->catdir($dir, File::Spec->updir ()) + ); + # config-build-dir + my $cbd = Cwd::realpath( + # the catdir is a workaround for bug https://rt.cpan.org/Ticket/Display.html?id=101283 + File::Spec->catdir($CPAN::Config->{build_dir}, File::Spec->curdir()) + ); + unless ($sbd eq $cbd) { + $CPAN::Frontend->mywarnonce("Directory '$dir' not below $CPAN::Config->{build_dir}, ". + "will not store persistent state\n"); + return; + } + my $file = sprintf "%s.yml", $dir; + my $yaml_module = CPAN::_yaml_module(); + if ($CPAN::META->has_inst($yaml_module)) { + CPAN->_yaml_dumpfile( + $file, + { + time => time, + perl => CPAN::_perl_fingerprint(), + distribution => $self, + } + ); + } else { + $CPAN::Frontend->myprintonce("'$yaml_module' not installed, ". + "will not store persistent state\n"); + } +} + +#-> CPAN::Distribution::try_download +sub try_download { + my($self,$patch) = @_; + my $norm = $self->normalize($patch); + my($local_wanted) = + File::Spec->catfile( + $CPAN::Config->{keep_source_where}, + "authors", + "id", + split(/\//,$norm), + ); + $self->debug("Doing localize") if $CPAN::DEBUG; + return CPAN::FTP->localize("authors/id/$norm", + $local_wanted); +} + +{ + my $stdpatchargs = ""; + #-> CPAN::Distribution::patch + sub patch { + my($self) = @_; + $self->debug("checking patches id[$self->{ID}]") if $CPAN::DEBUG; + my $patches = $self->prefs->{patches}; + $patches ||= ""; + $self->debug("patches[$patches]") if $CPAN::DEBUG; + if ($patches) { + return unless @$patches; + $self->safe_chdir($self->{build_dir}); + CPAN->debug("patches[$patches]") if $CPAN::DEBUG; + my $patchbin = $CPAN::Config->{patch}; + unless ($patchbin && length $patchbin) { + $CPAN::Frontend->mydie("No external patch command configured\n\n". + "Please run 'o conf init /patch/'\n\n"); + } + unless (MM->maybe_command($patchbin)) { + $CPAN::Frontend->mydie("No external patch command available\n\n". + "Please run 'o conf init /patch/'\n\n"); + } + $patchbin = CPAN::HandleConfig->safe_quote($patchbin); + local $ENV{PATCH_GET} = 0; # formerly known as -g0 + unless ($stdpatchargs) { + my $system = "$patchbin --version |"; + local *FH; + open FH, $system or die "Could not fork '$system': $!"; + local $/ = "\n"; + my $pversion; + PARSEVERSION: while (<FH>) { + if (/^patch\s+([\d\.]+)/) { + $pversion = $1; + last PARSEVERSION; + } + } + if ($pversion) { + $stdpatchargs = "-N --fuzz=3"; + } else { + $stdpatchargs = "-N"; + } + } + my $countedpatches = @$patches == 1 ? "1 patch" : (scalar @$patches . " patches"); + $CPAN::Frontend->myprint("Applying $countedpatches:\n"); + my $patches_dir = $CPAN::Config->{patches_dir}; + for my $patch (@$patches) { + if ($patches_dir && !File::Spec->file_name_is_absolute($patch)) { + my $f = File::Spec->catfile($patches_dir, $patch); + $patch = $f if -f $f; + } + unless (-f $patch) { + CPAN->debug("not on disk: patch[$patch]") if $CPAN::DEBUG; + if (my $trydl = $self->try_download($patch)) { + $patch = $trydl; + } else { + my $fail = "Could not find patch '$patch'"; + $CPAN::Frontend->mywarn("$fail; cannot continue\n"); + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- $fail"); + delete $self->{build_dir}; + return; + } + } + $CPAN::Frontend->myprint(" $patch\n"); + my $readfh = CPAN::Tarzip->TIEHANDLE($patch); + + my $pcommand; + my($ppp,$pfiles) = $self->_patch_p_parameter($readfh); + if ($ppp eq "applypatch") { + $pcommand = "$CPAN::Config->{applypatch} -verbose"; + } else { + my $thispatchargs = join " ", $stdpatchargs, $ppp; + $pcommand = "$patchbin $thispatchargs"; + require Config; # usually loaded from CPAN.pm + if ($Config::Config{osname} eq "solaris") { + # native solaris patch cannot patch readonly files + for my $file (@{$pfiles||[]}) { + my @stat = stat $file or next; + chmod $stat[2] | 0600, $file; # may fail + } + } + } + + $readfh = CPAN::Tarzip->TIEHANDLE($patch); # open again + my $writefh = FileHandle->new; + $CPAN::Frontend->myprint(" $pcommand\n"); + unless (open $writefh, "|$pcommand") { + my $fail = "Could not fork '$pcommand'"; + $CPAN::Frontend->mywarn("$fail; cannot continue\n"); + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- $fail"); + delete $self->{build_dir}; + return; + } + binmode($writefh); + while (my $x = $readfh->READLINE) { + print $writefh $x; + } + unless (close $writefh) { + my $fail = "Could not apply patch '$patch'"; + $CPAN::Frontend->mywarn("$fail; cannot continue\n"); + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- $fail"); + delete $self->{build_dir}; + return; + } + } + $self->{patched}++; + } + return 1; + } +} + +# may return +# - "applypatch" +# - ("-p0"|"-p1", $files) +sub _patch_p_parameter { + my($self,$fh) = @_; + my $cnt_files = 0; + my $cnt_p0files = 0; + my @files; + local($_); + while ($_ = $fh->READLINE) { + if ( + $CPAN::Config->{applypatch} + && + /\#\#\#\# ApplyPatch data follows \#\#\#\#/ + ) { + return "applypatch" + } + next unless /^[\*\+]{3}\s(\S+)/; + my $file = $1; + push @files, $file; + $cnt_files++; + $cnt_p0files++ if -f $file; + CPAN->debug("file[$file]cnt_files[$cnt_files]cnt_p0files[$cnt_p0files]") + if $CPAN::DEBUG; + } + return "-p1" unless $cnt_files; + my $opt_p = $cnt_files==$cnt_p0files ? "-p0" : "-p1"; + return ($opt_p, \@files); +} + +#-> sub CPAN::Distribution::_edge_cases +# with "configure" or "Makefile" or single file scripts +sub _edge_cases { + my($self,$mpl,$local_file) = @_; + $self->debug(sprintf("makefilepl[%s]anycwd[%s]", + $mpl, + CPAN::anycwd(), + )) if $CPAN::DEBUG; + my $build_dir = $self->{build_dir}; + my($configure) = File::Spec->catfile($build_dir,"Configure"); + if (-f $configure) { + # do we have anything to do? + $self->{configure} = $configure; + } elsif (-f File::Spec->catfile($build_dir,"Makefile")) { + $CPAN::Frontend->mywarn(qq{ +Package comes with a Makefile and without a Makefile.PL. +We\'ll try to build it with that Makefile then. +}); + $self->{writemakefile} = CPAN::Distrostatus->new("YES"); + $CPAN::Frontend->mysleep(2); + } else { + my $cf = $self->called_for || "unknown"; + if ($cf =~ m|/|) { + $cf =~ s|.*/||; + $cf =~ s|\W.*||; + } + $cf =~ s|[/\\:]||g; # risk of filesystem damage + $cf = "unknown" unless length($cf); + if (my $crud = $self->_contains_crud($build_dir)) { + my $why = qq{Package contains $crud; not recognized as a perl package, giving up}; + $CPAN::Frontend->mywarn("$why\n"); + $self->{writemakefile} = CPAN::Distrostatus->new(qq{NO -- $why}); + return; + } + $CPAN::Frontend->mywarn(qq{Package seems to come without Makefile.PL. + (The test -f "$mpl" returned false.) + Writing one on our own (setting NAME to $cf)\a\n}); + $self->{had_no_makefile_pl}++; + $CPAN::Frontend->mysleep(3); + + # Writing our own Makefile.PL + + my $exefile_stanza = ""; + if ($self->{archived} eq "maybe_pl") { + $exefile_stanza = $self->_exefile_stanza($build_dir,$local_file); + } + + my $fh = FileHandle->new; + $fh->open(">$mpl") + or Carp::croak("Could not open >$mpl: $!"); + $fh->print( + qq{# This Makefile.PL has been autogenerated by the module CPAN.pm +# because there was no Makefile.PL supplied. +# Autogenerated on: }.scalar localtime().qq{ + +use ExtUtils::MakeMaker; +WriteMakefile( + NAME => q[$cf],$exefile_stanza + ); +}); + $fh->close; + } +} + +#-> CPAN;:Distribution::_contains_crud +sub _contains_crud { + my($self,$dir) = @_; + my(@dirs, $dh, @files); + opendir $dh, $dir or return; + my $dirent; + for $dirent (readdir $dh) { + next if $dirent =~ /^\.\.?$/; + my $path = File::Spec->catdir($dir,$dirent); + if (-d $path) { + push @dirs, $dirent; + } elsif (-f $path) { + push @files, $dirent; + } + } + if (@dirs && @files) { + return "both files[@files] and directories[@dirs]"; + } elsif (@files > 2) { + return "several files[@files] but no Makefile.PL or Build.PL"; + } + return; +} + +#-> CPAN;:Distribution::_exefile_stanza +sub _exefile_stanza { + my($self,$build_dir,$local_file) = @_; + + my $fh = FileHandle->new; + my $script_file = File::Spec->catfile($build_dir,$local_file); + $fh->open($script_file) + or Carp::croak("Could not open script '$script_file': $!"); + local $/ = "\n"; + # parse name and prereq + my($state) = "poddir"; + my($name, $prereq) = ("", ""); + while (<$fh>) { + if ($state eq "poddir" && /^=head\d\s+(\S+)/) { + if ($1 eq 'NAME') { + $state = "name"; + } elsif ($1 eq 'PREREQUISITES') { + $state = "prereq"; + } + } elsif ($state =~ m{^(name|prereq)$}) { + if (/^=/) { + $state = "poddir"; + } elsif (/^\s*$/) { + # nop + } elsif ($state eq "name") { + if ($name eq "") { + ($name) = /^(\S+)/; + $state = "poddir"; + } + } elsif ($state eq "prereq") { + $prereq .= $_; + } + } elsif (/^=cut\b/) { + last; + } + } + $fh->close; + + for ($name) { + s{.*<}{}; # strip X<...> + s{>.*}{}; + } + chomp $prereq; + $prereq = join " ", split /\s+/, $prereq; + my($PREREQ_PM) = join("\n", map { + s{.*<}{}; # strip X<...> + s{>.*}{}; + if (/[\s\'\"]/) { # prose? + } else { + s/[^\w:]$//; # period? + " "x28 . "'$_' => 0,"; + } + } split /\s*,\s*/, $prereq); + + if ($name) { + my $to_file = File::Spec->catfile($build_dir, $name); + rename $script_file, $to_file + or die "Can't rename $script_file to $to_file: $!"; + } + + return " + EXE_FILES => ['$name'], + PREREQ_PM => { +$PREREQ_PM + }, +"; +} + +#-> CPAN::Distribution::_signature_business +sub _signature_business { + my($self) = @_; + my $check_sigs = CPAN::HandleConfig->prefs_lookup($self, + q{check_sigs}); + if ($check_sigs) { + if ($CPAN::META->has_inst("Module::Signature")) { + if (-f "SIGNATURE") { + $self->debug("Module::Signature is installed, verifying") if $CPAN::DEBUG; + my $rv = Module::Signature::verify(); + if ($rv != Module::Signature::SIGNATURE_OK() and + $rv != Module::Signature::SIGNATURE_MISSING()) { + $CPAN::Frontend->mywarn( + qq{\nSignature invalid for }. + qq{distribution file. }. + qq{Please investigate.\n\n} + ); + + my $wrap = + sprintf(qq{I'd recommend removing %s. Some error occurred }. + qq{while checking its signature, so it could }. + qq{be invalid. Maybe you have configured }. + qq{your 'urllist' with a bad URL. Please check this }. + qq{array with 'o conf urllist' and retry. Or }. + qq{examine the distribution in a subshell. Try + look %s +and run + cpansign -v +}, + $self->{localfile}, + $self->pretty_id, + ); + $self->{signature_verify} = CPAN::Distrostatus->new("NO"); + $CPAN::Frontend->mywarn(Text::Wrap::wrap("","",$wrap)); + $CPAN::Frontend->mysleep(5) if $CPAN::Frontend->can("mysleep"); + } else { + $self->{signature_verify} = CPAN::Distrostatus->new("YES"); + $self->debug("Module::Signature has verified") if $CPAN::DEBUG; + } + } else { + $CPAN::Frontend->mywarn(qq{Package came without SIGNATURE\n\n}); + } + } else { + $self->debug("Module::Signature is NOT installed") if $CPAN::DEBUG; + } + } +} + +#-> CPAN::Distribution::untar_me ; +sub untar_me { + my($self,$ct) = @_; + $self->{archived} = "tar"; + my $result = eval { $ct->untar() }; + if ($result) { + $self->{unwrapped} = CPAN::Distrostatus->new("YES"); + } else { + # unfortunately we have no $@ here, Tarzip is using mydie which dies with "\n" + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- untar failed"); + } +} + +# CPAN::Distribution::unzip_me ; +sub unzip_me { + my($self,$ct) = @_; + $self->{archived} = "zip"; + if ($ct->unzip()) { + $self->{unwrapped} = CPAN::Distrostatus->new("YES"); + } else { + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- unzip failed"); + } + return; +} + +sub handle_singlefile { + my($self,$local_file) = @_; + + if ( $local_file =~ /\.pm(\.(gz|Z))?(?!\n)\Z/ ) { + $self->{archived} = "pm"; + } elsif ( $local_file =~ /\.patch(\.(gz|bz2))?(?!\n)\Z/ ) { + $self->{archived} = "patch"; + } else { + $self->{archived} = "maybe_pl"; + } + + my $to = File::Basename::basename($local_file); + if ($to =~ s/\.(gz|Z)(?!\n)\Z//) { + if (eval{CPAN::Tarzip->new($local_file)->gunzip($to)}) { + $self->{unwrapped} = CPAN::Distrostatus->new("YES"); + } else { + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- uncompressing failed"); + } + } else { + if (File::Copy::cp($local_file,".")) { + $self->{unwrapped} = CPAN::Distrostatus->new("YES"); + } else { + $self->{unwrapped} = CPAN::Distrostatus->new("NO -- copying failed"); + } + } + return $to; +} + +#-> sub CPAN::Distribution::new ; +sub new { + my($class,%att) = @_; + + # $CPAN::META->{cachemgr} ||= CPAN::CacheMgr->new(); + + my $this = { %att }; + return bless $this, $class; +} + +#-> sub CPAN::Distribution::look ; +sub look { + my($self) = @_; + + if ($^O eq 'MacOS') { + $self->Mac::BuildTools::look; + return; + } + + if ( $CPAN::Config->{'shell'} ) { + $CPAN::Frontend->myprint(qq{ +Trying to open a subshell in the build directory... +}); + } else { + $CPAN::Frontend->myprint(qq{ +Your configuration does not define a value for subshells. +Please define it with "o conf shell <your shell>" +}); + return; + } + my $dist = $self->id; + my $dir; + unless ($dir = $self->dir) { + $self->get; + } + unless ($dir ||= $self->dir) { + $CPAN::Frontend->mywarn(qq{ +Could not determine which directory to use for looking at $dist. +}); + return; + } + my $pwd = CPAN::anycwd(); + $self->safe_chdir($dir); + $CPAN::Frontend->myprint(qq{Working directory is $dir\n}); + { + local $ENV{CPAN_SHELL_LEVEL} = $ENV{CPAN_SHELL_LEVEL}||0; + $ENV{CPAN_SHELL_LEVEL} += 1; + my $shell = CPAN::HandleConfig->safe_quote($CPAN::Config->{'shell'}); + + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + # local $ENV{PERL_USE_UNSAFE_INC} = exists $ENV{PERL_USE_UNSAFE_INC} ? $ENV{PERL_USE_UNSAFE_INC} : 1; # look + $CPAN::META->set_perl5lib; + local $ENV{MAKEFLAGS}; # protect us from outer make calls + + unless (system($shell) == 0) { + my $code = $? >> 8; + $CPAN::Frontend->mywarn("Subprocess shell exit code $code\n"); + } + } + $self->safe_chdir($pwd); +} + +# CPAN::Distribution::cvs_import ; +sub cvs_import { + my($self) = @_; + $self->get; + my $dir = $self->dir; + + my $package = $self->called_for; + my $module = $CPAN::META->instance('CPAN::Module', $package); + my $version = $module->cpan_version; + + my $userid = $self->cpan_userid; + + my $cvs_dir = (split /\//, $dir)[-1]; + $cvs_dir =~ s/-\d+[^-]+(?!\n)\Z//; + my $cvs_root = + $CPAN::Config->{cvsroot} || $ENV{CVSROOT}; + my $cvs_site_perl = + $CPAN::Config->{cvs_site_perl} || $ENV{CVS_SITE_PERL}; + if ($cvs_site_perl) { + $cvs_dir = "$cvs_site_perl/$cvs_dir"; + } + my $cvs_log = qq{"imported $package $version sources"}; + $version =~ s/\./_/g; + # XXX cvs: undocumented and unclear how it was meant to work + my @cmd = ('cvs', '-d', $cvs_root, 'import', '-m', $cvs_log, + "$cvs_dir", $userid, "v$version"); + + my $pwd = CPAN::anycwd(); + chdir($dir) or $CPAN::Frontend->mydie(qq{Could not chdir to "$dir": $!}); + + $CPAN::Frontend->myprint(qq{Working directory is $dir\n}); + + $CPAN::Frontend->myprint(qq{@cmd\n}); + system(@cmd) == 0 or + # XXX cvs + $CPAN::Frontend->mydie("cvs import failed"); + chdir($pwd) or $CPAN::Frontend->mydie(qq{Could not chdir to "$pwd": $!}); +} + +#-> sub CPAN::Distribution::readme ; +sub readme { + my($self) = @_; + my($dist) = $self->id; + my($sans,$suffix) = $dist =~ /(.+)\.(tgz|tar[\._-]gz|tar\.Z|zip)$/; + $self->debug("sans[$sans] suffix[$suffix]\n") if $CPAN::DEBUG; + my($local_file); + my($local_wanted) = + File::Spec->catfile( + $CPAN::Config->{keep_source_where}, + "authors", + "id", + split(/\//,"$sans.readme"), + ); + my $readme = "authors/id/$sans.readme"; + $self->debug("Doing localize for '$readme'") if $CPAN::DEBUG; + $local_file = CPAN::FTP->localize($readme, + $local_wanted) + or $CPAN::Frontend->mydie(qq{No $sans.readme found}); + + if ($^O eq 'MacOS') { + Mac::BuildTools::launch_file($local_file); + return; + } + + my $fh_pager = FileHandle->new; + local($SIG{PIPE}) = "IGNORE"; + my $pager = $CPAN::Config->{'pager'} || "cat"; + $fh_pager->open("|$pager") + or die "Could not open pager $pager\: $!"; + my $fh_readme = FileHandle->new; + $fh_readme->open($local_file) + or $CPAN::Frontend->mydie(qq{Could not open "$local_file": $!}); + $CPAN::Frontend->myprint(qq{ +Displaying file + $local_file +with pager "$pager" +}); + $fh_pager->print(<$fh_readme>); + $fh_pager->close; +} + +#-> sub CPAN::Distribution::verifyCHECKSUM ; +sub verifyCHECKSUM { + my($self) = @_; + EXCUSE: { + my @e; + $self->{CHECKSUM_STATUS} ||= ""; + $self->{CHECKSUM_STATUS} eq "OK" and push @e, "Checksum was ok"; + $CPAN::Frontend->myprint(join "", map {" $_\n"} @e) and return if @e; + } + my($lc_want,$lc_file,@local,$basename); + @local = split(/\//,$self->id); + pop @local; + push @local, "CHECKSUMS"; + $lc_want = + File::Spec->catfile($CPAN::Config->{keep_source_where}, + "authors", "id", @local); + local($") = "/"; + if (my $size = -s $lc_want) { + $self->debug("lc_want[$lc_want]size[$size]") if $CPAN::DEBUG; + if ($self->CHECKSUM_check_file($lc_want,1)) { + return $self->{CHECKSUM_STATUS} = "OK"; + } + } + $lc_file = CPAN::FTP->localize("authors/id/@local", + $lc_want,1); + unless ($lc_file) { + $CPAN::Frontend->myprint("Trying $lc_want.gz\n"); + $local[-1] .= ".gz"; + $lc_file = CPAN::FTP->localize("authors/id/@local", + "$lc_want.gz",1); + if ($lc_file) { + $lc_file =~ s/\.gz(?!\n)\Z//; + eval{CPAN::Tarzip->new("$lc_file.gz")->gunzip($lc_file)}; + } else { + return; + } + } + if ($self->CHECKSUM_check_file($lc_file)) { + return $self->{CHECKSUM_STATUS} = "OK"; + } +} + +#-> sub CPAN::Distribution::SIG_check_file ; +sub SIG_check_file { + my($self,$chk_file) = @_; + my $rv = eval { Module::Signature::_verify($chk_file) }; + + if ($rv == Module::Signature::SIGNATURE_OK()) { + $CPAN::Frontend->myprint("Signature for $chk_file ok\n"); + return $self->{SIG_STATUS} = "OK"; + } else { + $CPAN::Frontend->myprint(qq{\nSignature invalid for }. + qq{distribution file. }. + qq{Please investigate.\n\n}. + $self->as_string, + $CPAN::META->instance( + 'CPAN::Author', + $self->cpan_userid + )->as_string); + + my $wrap = qq{I\'d recommend removing $chk_file. Its signature +is invalid. Maybe you have configured your 'urllist' with +a bad URL. Please check this array with 'o conf urllist', and +retry.}; + + $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap)); + } +} + +#-> sub CPAN::Distribution::CHECKSUM_check_file ; + +# sloppy is 1 when we have an old checksums file that maybe is good +# enough + +sub CHECKSUM_check_file { + my($self,$chk_file,$sloppy) = @_; + my($cksum,$file,$basename); + + $sloppy ||= 0; + $self->debug("chk_file[$chk_file]sloppy[$sloppy]") if $CPAN::DEBUG; + my $check_sigs = CPAN::HandleConfig->prefs_lookup($self, + q{check_sigs}); + if ($check_sigs) { + if ($CPAN::META->has_inst("Module::Signature")) { + $self->debug("Module::Signature is installed, verifying") if $CPAN::DEBUG; + $self->SIG_check_file($chk_file); + } else { + $self->debug("Module::Signature is NOT installed") if $CPAN::DEBUG; + } + } + + $file = $self->{localfile}; + $basename = File::Basename::basename($file); + my $fh = FileHandle->new; + if (open $fh, $chk_file) { + local($/); + my $eval = <$fh>; + $eval =~ s/\015?\012/\n/g; + close $fh; + my($compmt) = Safe->new(); + $cksum = $compmt->reval($eval); + if ($@) { + rename $chk_file, "$chk_file.bad"; + Carp::confess($@) if $@; + } + } else { + Carp::carp "Could not open $chk_file for reading"; + } + + if (! ref $cksum or ref $cksum ne "HASH") { + $CPAN::Frontend->mywarn(qq{ +Warning: checksum file '$chk_file' broken. + +When trying to read that file I expected to get a hash reference +for further processing, but got garbage instead. +}); + my $answer = CPAN::Shell::colorable_makemaker_prompt("Proceed nonetheless?", "no"); + $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.\n"); + $self->{CHECKSUM_STATUS} = "NIL -- CHECKSUMS file broken"; + return; + } elsif (exists $cksum->{$basename}{sha256}) { + $self->debug("Found checksum for $basename:" . + "$cksum->{$basename}{sha256}\n") if $CPAN::DEBUG; + + open($fh, $file); + binmode $fh; + my $eq = $self->eq_CHECKSUM($fh,$cksum->{$basename}{sha256}); + $fh->close; + $fh = CPAN::Tarzip->TIEHANDLE($file); + + unless ($eq) { + my $dg = Digest::SHA->new(256); + my($data,$ref); + $ref = \$data; + while ($fh->READ($ref, 4096) > 0) { + $dg->add($data); + } + my $hexdigest = $dg->hexdigest; + $eq += $hexdigest eq $cksum->{$basename}{'sha256-ungz'}; + } + + if ($eq) { + $CPAN::Frontend->myprint("Checksum for $file ok\n"); + return $self->{CHECKSUM_STATUS} = "OK"; + } else { + $CPAN::Frontend->myprint(qq{\nChecksum mismatch for }. + qq{distribution file. }. + qq{Please investigate.\n\n}. + $self->as_string, + $CPAN::META->instance( + 'CPAN::Author', + $self->cpan_userid + )->as_string); + + my $wrap = qq{I\'d recommend removing $file. Its +checksum is incorrect. Maybe you have configured your 'urllist' with +a bad URL. Please check this array with 'o conf urllist', and +retry.}; + + $CPAN::Frontend->mydie(Text::Wrap::wrap("","",$wrap)); + + # former versions just returned here but this seems a + # serious threat that deserves a die + + # $CPAN::Frontend->myprint("\n\n"); + # sleep 3; + # return; + } + # close $fh if fileno($fh); + } else { + return if $sloppy; + unless ($self->{CHECKSUM_STATUS}) { + $CPAN::Frontend->mywarn(qq{ +Warning: No checksum for $basename in $chk_file. + +The cause for this may be that the file is very new and the checksum +has not yet been calculated, but it may also be that something is +going awry right now. +}); + my $answer = CPAN::Shell::colorable_makemaker_prompt("Proceed?", "yes"); + $answer =~ /^\s*y/i or $CPAN::Frontend->mydie("Aborted.\n"); + } + $self->{CHECKSUM_STATUS} = "NIL -- distro not in CHECKSUMS file"; + return; + } +} + +#-> sub CPAN::Distribution::eq_CHECKSUM ; +sub eq_CHECKSUM { + my($self,$fh,$expect) = @_; + if ($CPAN::META->has_inst("Digest::SHA")) { + my $dg = Digest::SHA->new(256); + my($data); + while (read($fh, $data, 4096)) { + $dg->add($data); + } + my $hexdigest = $dg->hexdigest; + # warn "fh[$fh] hex[$hexdigest] aexp[$expectMD5]"; + return $hexdigest eq $expect; + } + return 1; +} + +#-> sub CPAN::Distribution::force ; + +# Both CPAN::Modules and CPAN::Distributions know if "force" is in +# effect by autoinspection, not by inspecting a global variable. One +# of the reason why this was chosen to work that way was the treatment +# of dependencies. They should not automatically inherit the force +# status. But this has the downside that ^C and die() will return to +# the prompt but will not be able to reset the force_update +# attributes. We try to correct for it currently in the read_metadata +# routine, and immediately before we check for a Signal. I hope this +# works out in one of v1.57_53ff + +# "Force get forgets previous error conditions" + +#-> sub CPAN::Distribution::fforce ; +sub fforce { + my($self, $method) = @_; + $self->force($method,1); +} + +#-> sub CPAN::Distribution::force ; +sub force { + my($self, $method,$fforce) = @_; + my %phase_map = ( + get => [ + "unwrapped", + "build_dir", + "archived", + "localfile", + "CHECKSUM_STATUS", + "signature_verify", + "prefs", + "prefs_file", + "prefs_file_doc", + ], + make => [ + "writemakefile", + "make", + "modulebuild", + "prereq_pm", + ], + test => [ + "badtestcnt", + "make_test", + ], + install => [ + "install", + ], + unknown => [ + "reqtype", + "yaml_content", + ], + ); + my $methodmatch = 0; + my $ldebug = 0; + PHASE: for my $phase (qw(unknown get make test install)) { # order matters + $methodmatch = 1 if $fforce || $phase eq $method; + next unless $methodmatch; + ATTRIBUTE: for my $att (@{$phase_map{$phase}}) { + if ($phase eq "get") { + if (substr($self->id,-1,1) eq "." + && $att =~ /(unwrapped|build_dir|archived)/ ) { + # cannot be undone for local distros + next ATTRIBUTE; + } + if ($att eq "build_dir" + && $self->{build_dir} + && $CPAN::META->{is_tested} + ) { + delete $CPAN::META->{is_tested}{$self->{build_dir}}; + } + } elsif ($phase eq "test") { + if ($att eq "make_test" + && $self->{make_test} + && $self->{make_test}{COMMANDID} + && $self->{make_test}{COMMANDID} == $CPAN::CurrentCommandId + ) { + # endless loop too likely + next ATTRIBUTE; + } + } + delete $self->{$att}; + if ($ldebug || $CPAN::DEBUG) { + # local $CPAN::DEBUG = 16; # Distribution + CPAN->debug(sprintf "id[%s]phase[%s]att[%s]", $self->id, $phase, $att); + } + } + } + if ($method && $method =~ /make|test|install/) { + $self->{force_update} = 1; # name should probably have been force_install + } +} + +#-> sub CPAN::Distribution::notest ; +sub notest { + my($self, $method) = @_; + # $CPAN::Frontend->mywarn("XDEBUG: set notest for $self $method"); + $self->{"notest"}++; # name should probably have been force_install +} + +#-> sub CPAN::Distribution::unnotest ; +sub unnotest { + my($self) = @_; + # warn "XDEBUG: deleting notest"; + delete $self->{notest}; +} + +#-> sub CPAN::Distribution::unforce ; +sub unforce { + my($self) = @_; + delete $self->{force_update}; +} + +#-> sub CPAN::Distribution::isa_perl ; +sub isa_perl { + my($self) = @_; + my $file = File::Basename::basename($self->id); + if ($file =~ m{ ^ perl + ( + -5\.\d+\.\d+ + | + 5[._-]00[0-5](_[0-4][0-9])? + ) + \.tar[._-](?:gz|bz2) + (?!\n)\Z + }xs) { + return "$1.$3"; + } elsif ($self->cpan_comment + && + $self->cpan_comment =~ /isa_perl\(.+?\)/) { + return $1; + } +} + + +#-> sub CPAN::Distribution::perl ; +sub perl { + my ($self) = @_; + if (! $self) { + use Carp qw(carp); + carp __PACKAGE__ . "::perl was called without parameters."; + } + return CPAN::HandleConfig->safe_quote($CPAN::Perl); +} + +#-> sub CPAN::Distribution::shortcut_prepare ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success + +sub shortcut_prepare { + my ($self) = @_; + + $self->debug("checking archive type[$self->{ID}]") if $CPAN::DEBUG; + if (!$self->{archived} || $self->{archived} eq "NO") { + return $self->goodbye("Is neither a tar nor a zip archive."); + } + + $self->debug("checking unwrapping[$self->{ID}]") if $CPAN::DEBUG; + if (!$self->{unwrapped} + || ( + UNIVERSAL::can($self->{unwrapped},"failed") ? + $self->{unwrapped}->failed : + $self->{unwrapped} =~ /^NO/ + )) { + return $self->goodbye("Had problems unarchiving. Please build manually"); + } + + $self->debug("checking signature[$self->{ID}]") if $CPAN::DEBUG; + if ( ! $self->{force_update} + && exists $self->{signature_verify} + && ( + UNIVERSAL::can($self->{signature_verify},"failed") ? + $self->{signature_verify}->failed : + $self->{signature_verify} =~ /^NO/ + ) + ) { + return $self->goodbye("Did not pass the signature test."); + } + + $self->debug("checking writemakefile[$self->{ID}]") if $CPAN::DEBUG; + if ($self->{writemakefile}) { + if ( + UNIVERSAL::can($self->{writemakefile},"failed") ? + $self->{writemakefile}->failed : + $self->{writemakefile} =~ /^NO/ + ) { + # XXX maybe a retry would be in order? + my $err = UNIVERSAL::can($self->{writemakefile},"text") ? + $self->{writemakefile}->text : + $self->{writemakefile}; + $err =~ s/^NO\s*(--\s+)?//; + $err ||= "Had some problem writing Makefile"; + $err .= ", not re-running"; + return $self->goodbye($err); + } else { + return $self->success("Has already been prepared"); + } + } + + $self->debug("checking configure_requires_later[$self->{ID}]") if $CPAN::DEBUG; + if( my $later = $self->{configure_requires_later} ) { # see also undelay + return $self->goodbye($later); + } + + return undef; # no shortcut +} + +sub prepare { + my ($self) = @_; + + $self->get + or return; + + if ( defined( my $sc = $self->shortcut_prepare) ) { + return $sc; + } + + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + local $ENV{PERL_USE_UNSAFE_INC} = exists $ENV{PERL_USE_UNSAFE_INC} ? $ENV{PERL_USE_UNSAFE_INC} : 1; # prepare + $CPAN::META->set_perl5lib; + local $ENV{MAKEFLAGS}; # protect us from outer make calls + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); + + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; + } + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + $self->debug("Changed directory to $builddir") if $CPAN::DEBUG; + + local $ENV{PERL_AUTOINSTALL} = $ENV{PERL_AUTOINSTALL} || ''; + local $ENV{PERL_EXTUTILS_AUTOINSTALL} = $ENV{PERL_EXTUTILS_AUTOINSTALL} || ''; + $self->choose_MM_or_MB + or return; + + my $configurator = $self->{configure} ? "Configure" + : $self->{modulebuild} ? "Build.PL" + : "Makefile.PL"; + + $CPAN::Frontend->myprint("Configuring ".$self->id." with $configurator\n"); + + if ($CPAN::Config->{prerequisites_policy} eq "follow") { + $ENV{PERL_AUTOINSTALL} ||= "--defaultdeps"; + $ENV{PERL_EXTUTILS_AUTOINSTALL} ||= "--defaultdeps"; + } + + my $system; + my $pl_commandline; + if ($self->prefs->{pl}) { + $pl_commandline = $self->prefs->{pl}{commandline}; + } + local $ENV{PERL} = defined $ENV{PERL}? $ENV{PERL} : $^X; + local $ENV{PERL5_CPAN_IS_EXECUTING} = $ENV{PERL5_CPAN_IS_EXECUTING} || ''; + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; + if ($pl_commandline) { + $system = $pl_commandline; + $ENV{PERL} = $^X; + } elsif ($self->{'configure'}) { + $system = $self->{'configure'}; + } elsif ($self->{modulebuild}) { + my($perl) = $self->perl or die "Couldn\'t find executable perl\n"; + my $mbuildpl_arg = $self->_make_phase_arg("pl"); + $system = sprintf("%s Build.PL%s", + $perl, + $mbuildpl_arg ? " $mbuildpl_arg" : "", + ); + } else { + my($perl) = $self->perl or die "Couldn\'t find executable perl\n"; + my $switch = ""; +# This needs a handler that can be turned on or off: +# $switch = "-MExtUtils::MakeMaker ". +# "-Mops=:default,:filesys_read,:filesys_open,require,chdir" +# if $] > 5.00310; + my $makepl_arg = $self->_make_phase_arg("pl"); + $ENV{PERL5_CPAN_IS_EXECUTING} = File::Spec->catfile($self->{build_dir}, + "Makefile.PL"); + $system = sprintf("%s%s Makefile.PL%s", + $perl, + $switch ? " $switch" : "", + $makepl_arg ? " $makepl_arg" : "", + ); + } + my $pl_env; + if ($self->prefs->{pl}) { + $pl_env = $self->prefs->{pl}{env}; + } + local @ENV{keys %$pl_env} = values %$pl_env if $pl_env; + if (exists $self->{writemakefile}) { + } else { + local($SIG{ALRM}) = sub { die "inactivity_timeout reached\n" }; + my($ret,$pid,$output); + $@ = ""; + my $go_via_alarm; + if ($CPAN::Config->{inactivity_timeout}) { + require Config; + if ($Config::Config{d_alarm} + && + $Config::Config{d_alarm} eq "define" + ) { + $go_via_alarm++ + } else { + $CPAN::Frontend->mywarn("Warning: you have configured the config ". + "variable 'inactivity_timeout' to ". + "'$CPAN::Config->{inactivity_timeout}'. But ". + "on this machine the system call 'alarm' ". + "isn't available. This means that we cannot ". + "provide the feature of intercepting long ". + "waiting code and will turn this feature off.\n" + ); + $CPAN::Config->{inactivity_timeout} = 0; + } + } + if ($go_via_alarm) { + if ( $self->_should_report('pl') ) { + ($output, $ret) = CPAN::Reporter::record_command( + $system, + $CPAN::Config->{inactivity_timeout}, + ); + CPAN::Reporter::grade_PL( $self, $system, $output, $ret ); + } + else { + eval { + alarm $CPAN::Config->{inactivity_timeout}; + local $SIG{CHLD}; # = sub { wait }; + if (defined($pid = fork)) { + if ($pid) { #parent + # wait; + waitpid $pid, 0; + } else { #child + # note, this exec isn't necessary if + # inactivity_timeout is 0. On the Mac I'd + # suggest, we set it always to 0. + exec $system; + } + } else { + $CPAN::Frontend->myprint("Cannot fork: $!"); + return; + } + }; + alarm 0; + if ($@) { + kill 9, $pid; + waitpid $pid, 0; + my $err = "$@"; + $CPAN::Frontend->myprint($err); + $self->{writemakefile} = CPAN::Distrostatus->new("NO $err"); + $@ = ""; + $self->store_persistent_state; + return $self->goodbye("$system -- TIMED OUT"); + } + } + } else { + if (my $expect_model = $self->_prefs_with_expect("pl")) { + # XXX probably want to check _should_report here and warn + # about not being able to use CPAN::Reporter with expect + $ret = $self->_run_via_expect($system,'writemakefile',$expect_model); + if (! defined $ret + && $self->{writemakefile} + && $self->{writemakefile}->failed) { + # timeout + return; + } + } + elsif ( $self->_should_report('pl') ) { + ($output, $ret) = eval { CPAN::Reporter::record_command($system) }; + if (! defined $output or $@) { + my $err = $@ || "Unknown error"; + $CPAN::Frontend->mywarn("Error while running PL phase: $err"); + return $self->goodbye("$system -- NOT OK"); + } + CPAN::Reporter::grade_PL( $self, $system, $output, $ret ); + } + else { + $ret = system($system); + } + if ($ret != 0) { + $self->{writemakefile} = CPAN::Distrostatus + ->new("NO '$system' returned status $ret"); + $CPAN::Frontend->mywarn("Warning: No success on command[$system]\n"); + $self->store_persistent_state; + return $self->goodbye("$system -- NOT OK"); + } + } + if (-f "Makefile" || -f "Build" || ($^O eq 'VMS' && (-f 'descrip.mms' || -f 'Build.com'))) { + $self->{writemakefile} = CPAN::Distrostatus->new("YES"); + delete $self->{make_clean}; # if cleaned before, enable next + $self->store_persistent_state; + return $self->success("$system -- OK"); + } else { + my $makefile = $self->{modulebuild} ? "Build" : "Makefile"; + my $why = "No '$makefile' created"; + $CPAN::Frontend->mywarn($why); + $self->{writemakefile} = CPAN::Distrostatus + ->new(qq{NO -- $why\n}); + $self->store_persistent_state; + return $self->goodbye("$system -- NOT OK"); + } + } + $self->store_persistent_state; + return 1; # success +} + +#-> sub CPAN::Distribution::shortcut_make ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_make { + my ($self) = @_; + + $self->debug("checking make/build results[$self->{ID}]") if $CPAN::DEBUG; + if (defined $self->{make}) { + if (UNIVERSAL::can($self->{make},"failed") ? + $self->{make}->failed : + $self->{make} =~ /^NO/ + ) { + if ($self->{force_update}) { + # Trying an already failed 'make' (unless somebody else blocks) + return undef; # no shortcut + } else { + # introduced for turning recursion detection into a distrostatus + my $error = length $self->{make}>3 + ? substr($self->{make},3) : "Unknown error"; + $self->store_persistent_state; + return $self->goodbye("Could not make: $error\n"); + } + } else { + return $self->success("Has already been made") + } + } + return undef; # no shortcut +} + +#-> sub CPAN::Distribution::make ; +sub make { + my($self) = @_; + + $self->pre_make(); + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; + if (my $goto = $self->prefs->{goto}) { + return $self->goto($goto); + } + # Emergency brake if they said install Pippi and get newest perl + + # XXX Would this make more sense in shortcut_prepare, since + # that doesn't make sense on a perl dist either? Broader + # question: what is the purpose of suggesting force install + # on a perl distribution? That seems unlikely to result in + # such a dependency being satisfied, even if the perl is + # successfully installed. This situation is tantamount to + # a prereq on a version of perl greater than the current one + # so I think we should just abort. -- xdg, 2012-04-06 + if ($self->isa_perl) { + if ( + $self->called_for ne $self->id && + ! $self->{force_update} + ) { + # if we die here, we break bundles + $CPAN::Frontend + ->mywarn(sprintf( + qq{The most recent version "%s" of the module "%s" +is part of the perl-%s distribution. To install that, you need to run + force install %s --or-- + install %s +}, + $CPAN::META->instance( + 'CPAN::Module', + $self->called_for + )->cpan_version, + $self->called_for, + $self->isa_perl, + $self->called_for, + $self->pretty_id, + )); + $self->{make} = CPAN::Distrostatus->new("NO isa perl"); + $CPAN::Frontend->mysleep(1); + return; + } + } + + $self->prepare + or return; + + if ( defined( my $sc = $self->shortcut_make) ) { + return $sc; + } + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); + + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; + } + + my $make = $self->{modulebuild} ? "Build" : "make"; + $CPAN::Frontend->myprint(sprintf "Running %s for %s\n", $make, $self->id); + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + local $ENV{PERL_USE_UNSAFE_INC} = exists $ENV{PERL_USE_UNSAFE_INC} ? $ENV{PERL_USE_UNSAFE_INC} : 1; # make + $CPAN::META->set_perl5lib; + local $ENV{MAKEFLAGS}; # protect us from outer make calls + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + if ($^O eq 'MacOS') { + Mac::BuildTools::make($self); + return; + } + + my %env; + while (my($k,$v) = each %ENV) { + next if defined $v; + $env{$k} = ''; + } + local @ENV{keys %env} = values %env; + my $satisfied = eval { $self->satisfy_requires }; + return $self->goodbye($@) if $@; + return unless $satisfied ; + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + # need to chdir again, because $self->satisfy_requires might change the directory + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; + } + + my $system; + my $make_commandline; + if ($self->prefs->{make}) { + $make_commandline = $self->prefs->{make}{commandline}; + } + local $ENV{PERL} = defined $ENV{PERL}? $ENV{PERL} : $^X; + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; + if ($make_commandline) { + $system = $make_commandline; + $ENV{PERL} = CPAN::find_perl(); + } else { + if ($self->{modulebuild}) { + unless (-f "Build" || ($^O eq 'VMS' && -f 'Build.com')) { + my $cwd = CPAN::anycwd(); + $CPAN::Frontend->mywarn("Alert: no Build file available for 'make $self->{id}'". + " in cwd[$cwd]. Danger, Will Robinson!\n"); + $CPAN::Frontend->mysleep(5); + } + $system = join " ", $self->_build_command(), $CPAN::Config->{mbuild_arg}; + } else { + $system = join " ", $self->_make_command(), $CPAN::Config->{make_arg}; + } + $system =~ s/\s+$//; + my $make_arg = $self->_make_phase_arg("make"); + $system = sprintf("%s%s", + $system, + $make_arg ? " $make_arg" : "", + ); + } + my $make_env; + if ($self->prefs->{make}) { + $make_env = $self->prefs->{make}{env}; + } + local @ENV{keys %$make_env} = values %$make_env if $make_env; + my $expect_model = $self->_prefs_with_expect("make"); + my $want_expect = 0; + if ( $expect_model && @{$expect_model->{talk}} ) { + my $can_expect = $CPAN::META->has_inst("Expect"); + if ($can_expect) { + $want_expect = 1; + } else { + $CPAN::Frontend->mywarn("Expect not installed, falling back to ". + "system()\n"); + } + } + my ($system_ok, $system_err); + if ($want_expect) { + # XXX probably want to check _should_report here and + # warn about not being able to use CPAN::Reporter with expect + $system_ok = $self->_run_via_expect($system,'make',$expect_model) == 0; + } + elsif ( $self->_should_report('make') ) { + my ($output, $ret) = CPAN::Reporter::record_command($system); + CPAN::Reporter::grade_make( $self, $system, $output, $ret ); + $system_ok = ! $ret; + } + else { + my $rc = system($system); + $system_ok = $rc == 0; + $system_err = $! if $rc == -1; + } + $self->introduce_myself; + if ( $system_ok ) { + $CPAN::Frontend->myprint(" $system -- OK\n"); + $self->{make} = CPAN::Distrostatus->new("YES"); + } else { + $self->{writemakefile} ||= CPAN::Distrostatus->new("YES"); + $self->{make} = CPAN::Distrostatus->new("NO"); + $CPAN::Frontend->mywarn(" $system -- NOT OK\n"); + $CPAN::Frontend->mywarn(" $system_err\n") if defined $system_err; + } + $self->store_persistent_state; + + $self->post_make(); + + return !! $system_ok; +} + +# CPAN::Distribution::goodbye ; +sub goodbye { + my($self,$goodbye) = @_; + my $id = $self->pretty_id; + $CPAN::Frontend->mywarn(" $id\n $goodbye\n"); + return 0; # must be explicit false, not undef +} + +sub success { + my($self,$why) = @_; + my $id = $self->pretty_id; + $CPAN::Frontend->myprint(" $id\n $why\n"); + return 1; +} + +# CPAN::Distribution::_run_via_expect ; +sub _run_via_expect { + my($self,$system,$phase,$expect_model) = @_; + CPAN->debug("system[$system]expect_model[$expect_model]") if $CPAN::DEBUG; + if ($CPAN::META->has_inst("Expect")) { + my $expo = Expect->new; # expo Expect object; + $expo->spawn($system); + $expect_model->{mode} ||= "deterministic"; + if ($expect_model->{mode} eq "deterministic") { + return $self->_run_via_expect_deterministic($expo,$phase,$expect_model); + } elsif ($expect_model->{mode} eq "anyorder") { + return $self->_run_via_expect_anyorder($expo,$phase,$expect_model); + } else { + die "Panic: Illegal expect mode: $expect_model->{mode}"; + } + } else { + $CPAN::Frontend->mywarn("Expect not installed, falling back to system()\n"); + return system($system); + } +} + +sub _run_via_expect_anyorder { + my($self,$expo,$phase,$expect_model) = @_; + my $timeout = $expect_model->{timeout} || 5; + my $reuse = $expect_model->{reuse}; + my @expectacopy = @{$expect_model->{talk}}; # we trash it! + my $but = ""; + my $timeout_start = time; + EXPECT: while () { + my($eof,$ran_into_timeout); + # XXX not up to the full power of expect. one could certainly + # wrap all of the talk pairs into a single expect call and on + # success tweak it and step ahead to the next question. The + # current implementation unnecessarily limits itself to a + # single match. + my @match = $expo->expect(1, + [ eof => sub { + $eof++; + } ], + [ timeout => sub { + $ran_into_timeout++; + } ], + -re => eval"qr{.}", + ); + if ($match[2]) { + $but .= $match[2]; + } + $but .= $expo->clear_accum; + if ($eof) { + $expo->soft_close; + return $expo->exitstatus(); + } elsif ($ran_into_timeout) { + # warn "DEBUG: they are asking a question, but[$but]"; + for (my $i = 0; $i <= $#expectacopy; $i+=2) { + my($next,$send) = @expectacopy[$i,$i+1]; + my $regex = eval "qr{$next}"; + # warn "DEBUG: will compare with regex[$regex]."; + if ($but =~ /$regex/) { + # warn "DEBUG: will send send[$send]"; + $expo->send($send); + # never allow reusing an QA pair unless they told us + splice @expectacopy, $i, 2 unless $reuse; + $but =~ s/(?s:^.*?)$regex//; + $timeout_start = time; + next EXPECT; + } + } + my $have_waited = time - $timeout_start; + if ($have_waited < $timeout) { + # warn "DEBUG: have_waited[$have_waited]timeout[$timeout]"; + next EXPECT; + } + my $why = "could not answer a question during the dialog"; + $CPAN::Frontend->mywarn("Failing: $why\n"); + $self->{$phase} = + CPAN::Distrostatus->new("NO $why"); + return 0; + } + } +} + +sub _run_via_expect_deterministic { + my($self,$expo,$phase,$expect_model) = @_; + my $ran_into_timeout; + my $ran_into_eof; + my $timeout = $expect_model->{timeout} || 15; # currently unsettable + my $expecta = $expect_model->{talk}; + EXPECT: for (my $i = 0; $i <= $#$expecta; $i+=2) { + my($re,$send) = @$expecta[$i,$i+1]; + CPAN->debug("timeout[$timeout]re[$re]") if $CPAN::DEBUG; + my $regex = eval "qr{$re}"; + $expo->expect($timeout, + [ eof => sub { + my $but = $expo->clear_accum; + $CPAN::Frontend->mywarn("EOF (maybe harmless) +expected[$regex]\nbut[$but]\n\n"); + $ran_into_eof++; + } ], + [ timeout => sub { + my $but = $expo->clear_accum; + $CPAN::Frontend->mywarn("TIMEOUT +expected[$regex]\nbut[$but]\n\n"); + $ran_into_timeout++; + } ], + -re => $regex); + if ($ran_into_timeout) { + # note that the caller expects 0 for success + $self->{$phase} = + CPAN::Distrostatus->new("NO timeout during expect dialog"); + return 0; + } elsif ($ran_into_eof) { + last EXPECT; + } + $expo->send($send); + } + $expo->soft_close; + return $expo->exitstatus(); +} + +#-> CPAN::Distribution::_validate_distropref +sub _validate_distropref { + my($self,@args) = @_; + if ( + $CPAN::META->has_inst("CPAN::Kwalify") + && + $CPAN::META->has_inst("Kwalify") + ) { + eval {CPAN::Kwalify::_validate("distroprefs",@args);}; + if ($@) { + $CPAN::Frontend->mywarn($@); + } + } else { + CPAN->debug("not validating '@args'") if $CPAN::DEBUG; + } +} + +#-> CPAN::Distribution::_find_prefs +sub _find_prefs { + my($self) = @_; + my $distroid = $self->pretty_id; + #CPAN->debug("distroid[$distroid]") if $CPAN::DEBUG; + my $prefs_dir = $CPAN::Config->{prefs_dir}; + return if $prefs_dir =~ /^\s*$/; + eval { File::Path::mkpath($prefs_dir); }; + if ($@) { + $CPAN::Frontend->mydie("Cannot create directory $prefs_dir"); + } + # shortcut if there are no distroprefs files + { + my $dh = DirHandle->new($prefs_dir) or $CPAN::Frontend->mydie("Couldn't open '$prefs_dir': $!"); + my @files = map { /\.(yml|dd|st)\z/i } $dh->read; + return unless @files; + } + my $yaml_module = CPAN::_yaml_module(); + my $ext_map = {}; + my @extensions; + if ($CPAN::META->has_inst($yaml_module)) { + $ext_map->{yml} = 'CPAN'; + } else { + my @fallbacks; + if ($CPAN::META->has_inst("Data::Dumper")) { + push @fallbacks, $ext_map->{dd} = 'Data::Dumper'; + } + if ($CPAN::META->has_inst("Storable")) { + push @fallbacks, $ext_map->{st} = 'Storable'; + } + if (@fallbacks) { + local $" = " and "; + unless ($self->{have_complained_about_missing_yaml}++) { + $CPAN::Frontend->mywarnonce("'$yaml_module' not installed, falling back ". + "to @fallbacks to read prefs '$prefs_dir'\n"); + } + } else { + unless ($self->{have_complained_about_missing_yaml}++) { + $CPAN::Frontend->mywarnonce("'$yaml_module' not installed, cannot ". + "read prefs '$prefs_dir'\n"); + } + } + } + my $finder = CPAN::Distroprefs->find($prefs_dir, $ext_map); + DIRENT: while (my $result = $finder->next) { + if ($result->is_warning) { + $CPAN::Frontend->mywarn($result->as_string); + $CPAN::Frontend->mysleep(1); + next DIRENT; + } elsif ($result->is_fatal) { + $CPAN::Frontend->mydie($result->as_string); + } + + my @prefs = @{ $result->prefs }; + + ELEMENT: for my $y (0..$#prefs) { + my $pref = $prefs[$y]; + $self->_validate_distropref($pref->data, $result->abs, $y); + + # I don't know why we silently skip when there's no match, but + # complain if there's an empty match hashref, and there's no + # comment explaining why -- hdp, 2008-03-18 + unless ($pref->has_any_match) { + next ELEMENT; + } + + unless ($pref->has_valid_subkeys) { + $CPAN::Frontend->mydie(sprintf + "Nonconforming .%s file '%s': " . + "missing match/* subattribute. " . + "Please remove, cannot continue.", + $result->ext, $result->abs, + ); + } + + my $arg = { + env => \%ENV, + distribution => $distroid, + perl => \&CPAN::find_perl, + perlconfig => \%Config::Config, + module => sub { [ $self->containsmods ] }, + }; + + if ($pref->matches($arg)) { + return { + prefs => $pref->data, + prefs_file => $result->abs, + prefs_file_doc => $y, + }; + } + + } + } + return; +} + +# CPAN::Distribution::prefs +sub prefs { + my($self) = @_; + if (exists $self->{negative_prefs_cache} + && + $self->{negative_prefs_cache} != $CPAN::CurrentCommandId + ) { + delete $self->{negative_prefs_cache}; + delete $self->{prefs}; + } + if (exists $self->{prefs}) { + return $self->{prefs}; # XXX comment out during debugging + } + if ($CPAN::Config->{prefs_dir}) { + CPAN->debug("prefs_dir[$CPAN::Config->{prefs_dir}]") if $CPAN::DEBUG; + my $prefs = $self->_find_prefs(); + $prefs ||= ""; # avoid warning next line + CPAN->debug("prefs[$prefs]") if $CPAN::DEBUG; + if ($prefs) { + for my $x (qw(prefs prefs_file prefs_file_doc)) { + $self->{$x} = $prefs->{$x}; + } + my $bs = sprintf( + "%s[%s]", + File::Basename::basename($self->{prefs_file}), + $self->{prefs_file_doc}, + ); + my $filler1 = "_" x 22; + my $filler2 = int(66 - length($bs))/2; + $filler2 = 0 if $filler2 < 0; + $filler2 = " " x $filler2; + $CPAN::Frontend->myprint(" +$filler1 D i s t r o P r e f s $filler1 +$filler2 $bs $filler2 +"); + $CPAN::Frontend->mysleep(1); + return $self->{prefs}; + } + } + $self->{negative_prefs_cache} = $CPAN::CurrentCommandId; + return $self->{prefs} = +{}; +} + +# CPAN::Distribution::_make_phase_arg +sub _make_phase_arg { + my($self, $phase) = @_; + my $_make_phase_arg; + my $prefs = $self->prefs; + if ( + $prefs + && exists $prefs->{$phase} + && exists $prefs->{$phase}{args} + && $prefs->{$phase}{args} + ) { + $_make_phase_arg = join(" ", + map {CPAN::HandleConfig + ->safe_quote($_)} @{$prefs->{$phase}{args}}, + ); + } + +# cpan[2]> o conf make[TAB] +# make make_install_make_command +# make_arg makepl_arg +# make_install_arg +# cpan[2]> o conf mbuild[TAB] +# mbuild_arg mbuild_install_build_command +# mbuild_install_arg mbuildpl_arg + + my $mantra; # must switch make/mbuild here + if ($self->{modulebuild}) { + $mantra = "mbuild"; + } else { + $mantra = "make"; + } + my %map = ( + pl => "pl_arg", + make => "_arg", + test => "_test_arg", # does not really exist but maybe + # will some day and now protects + # us from unini warnings + install => "_install_arg", + ); + my $phase_underscore_meshup = $map{$phase}; + my $what = sprintf "%s%s", $mantra, $phase_underscore_meshup; + + $_make_phase_arg ||= $CPAN::Config->{$what}; + return $_make_phase_arg; +} + +# CPAN::Distribution::_make_command +sub _make_command { + my ($self) = @_; + if ($self) { + return + CPAN::HandleConfig + ->safe_quote( + CPAN::HandleConfig->prefs_lookup($self, + q{make}) + || $Config::Config{make} + || 'make' + ); + } else { + # Old style call, without object. Deprecated + Carp::confess("CPAN::_make_command() used as function. Don't Do That."); + return + safe_quote(undef, + CPAN::HandleConfig->prefs_lookup($self,q{make}) + || $CPAN::Config->{make} + || $Config::Config{make} + || 'make'); + } +} + +sub _make_install_make_command { + my ($self) = @_; + my $mimc = + CPAN::HandleConfig->prefs_lookup($self, q{make_install_make_command}); + return $self->_make_command() unless $mimc; + + # Quote the "make install" make command on Windows, where it is commonly + # found in, e.g., C:\Program Files\... and therefore needs quoting. We can't + # do this in general because the command maybe "sudo make..." (i.e. a + # program with arguments), but that is unlikely to be the case on Windows. + $mimc = CPAN::HandleConfig->safe_quote($mimc) if $^O eq 'MSWin32'; + + return $mimc; +} + +#-> sub CPAN::Distribution::is_locally_optional +sub is_locally_optional { + my($self, $prereq_pm, $prereq) = @_; + $prereq_pm ||= $self->{prereq_pm}; + my($nmo,$opt); + for my $rt (qw(requires build_requires)) { + if (exists $prereq_pm->{$rt}{$prereq}) { + # rt 121914 + $nmo ||= $CPAN::META->instance("CPAN::Module",$prereq); + my $av = $nmo->available_version; + return 0 if !$av || CPAN::Version->vlt($av,$prereq_pm->{$rt}{$prereq}); + } + if (exists $prereq_pm->{"opt_$rt"}{$prereq}) { + $opt = 1; + } + } + return $opt||0; +} + +#-> sub CPAN::Distribution::follow_prereqs ; +sub follow_prereqs { + my($self) = shift; + my($slot) = shift; + my(@prereq_tuples) = grep {$_->[0] ne "perl"} @_; + return unless @prereq_tuples; + my(@good_prereq_tuples); + for my $p (@prereq_tuples) { + # e.g. $p = ['Devel::PartialDump', 'r', 1] + # promote if possible + if ($p->[1] =~ /^(r|c)$/) { + push @good_prereq_tuples, $p; + } elsif ($p->[1] =~ /^(b)$/) { + my $reqtype = CPAN::Queue->reqtype_of($p->[0]); + if ($reqtype =~ /^(r|c)$/) { + push @good_prereq_tuples, [$p->[0], $reqtype, $p->[2]]; + } else { + push @good_prereq_tuples, $p; + } + } else { + die "Panic: in follow_prereqs: reqtype[$p->[1]] seen, should never happen"; + } + } + my $pretty_id = $self->pretty_id; + my %map = ( + b => "build_requires", + r => "requires", + c => "commandline", + ); + my($filler1,$filler2,$filler3,$filler4); + my $unsat = "Unsatisfied dependencies detected during"; + my $w = length($unsat) > length($pretty_id) ? length($unsat) : length($pretty_id); + { + my $r = int(($w - length($unsat))/2); + my $l = $w - length($unsat) - $r; + $filler1 = "-"x4 . " "x$l; + $filler2 = " "x$r . "-"x4 . "\n"; + } + { + my $r = int(($w - length($pretty_id))/2); + my $l = $w - length($pretty_id) - $r; + $filler3 = "-"x4 . " "x$l; + $filler4 = " "x$r . "-"x4 . "\n"; + } + $CPAN::Frontend-> + myprint("$filler1 $unsat $filler2". + "$filler3 $pretty_id $filler4". + join("", map {sprintf " %s \[%s%s]\n", $_->[0], $map{$_->[1]}, $self->is_locally_optional(undef,$_->[0]) ? ",optional" : ""} @good_prereq_tuples), + ); + my $follow = 0; + if ($CPAN::Config->{prerequisites_policy} eq "follow") { + $follow = 1; + } elsif ($CPAN::Config->{prerequisites_policy} eq "ask") { + my $answer = CPAN::Shell::colorable_makemaker_prompt( +"Shall I follow them and prepend them to the queue +of modules we are processing right now?", "yes"); + $follow = $answer =~ /^\s*y/i; + } else { + my @prereq = map { $_->[0] } @good_prereq_tuples; + local($") = ", "; + $CPAN::Frontend-> + myprint(" Ignoring dependencies on modules @prereq\n"); + } + if ($follow) { + my $id = $self->id; + my(@to_queue_mand,@to_queue_opt); + for my $gp (@good_prereq_tuples) { + my($prereq,$reqtype,$optional) = @$gp; + my $qthing = +{qmod=>$prereq,reqtype=>$reqtype,optional=>$optional}; + if ($optional && + $self->is_locally_optional(undef,$prereq) + ){ + # Since we do not depend on this one, we do not need + # this in a mandatory arrangement: + push @to_queue_opt, $qthing; + } else { + my $any = CPAN::Shell->expandany($prereq); + $self->{$slot . "_for"}{$any->id}++; + if ($any) { + unless ($optional) { + # No recursion check in an optional area of the tree + $any->color_cmd_tmps(0,2); + } + } else { + $CPAN::Frontend->mywarn("Warning (maybe a bug): Cannot expand prereq '$prereq'\n"); + $CPAN::Frontend->mysleep(2); + } + # order everything that is not locally_optional just + # like mandatory items: this keeps leaves before + # branches + unshift @to_queue_mand, $qthing; + } + } + if (@to_queue_mand) { + unshift @to_queue_mand, {qmod => $id, reqtype => $self->{reqtype}, optional=> !$self->{mandatory}}; + CPAN::Queue->jumpqueue(@to_queue_opt,@to_queue_mand); + $self->{$slot} = "Delayed until after prerequisites"; + return 1; # signal we need dependencies + } elsif (@to_queue_opt) { + CPAN::Queue->jumpqueue(@to_queue_opt); + } + } + return; +} + +sub _feature_depends { + my($self) = @_; + my $meta_yml = $self->parse_meta_yml(); + my $optf = $meta_yml->{optional_features} or return; + if (!ref $optf or ref $optf ne "HASH"){ + $CPAN::Frontend->mywarn("The content of optional_features is not a HASH reference. Cannot use it.\n"); + $optf = {}; + } + my $wantf = $self->prefs->{features} or return; + if (!ref $wantf or ref $wantf ne "ARRAY"){ + $CPAN::Frontend->mywarn("The content of 'features' is not an ARRAY reference. Cannot use it.\n"); + $wantf = []; + } + my $dep = +{}; + for my $wf (@$wantf) { + if (my $f = $optf->{$wf}) { + $CPAN::Frontend->myprint("Found the demanded feature '$wf' that ". + "is accompanied by this description:\n". + $f->{description}. + "\n\n" + ); + # configure_requires currently not in the spec, unlikely to be useful anyway + for my $reqtype (qw(configure_requires build_requires requires)) { + my $reqhash = $f->{$reqtype} or next; + while (my($k,$v) = each %$reqhash) { + $dep->{$reqtype}{$k} = $v; + } + } + } else { + $CPAN::Frontend->mywarn("The demanded feature '$wf' was not ". + "found in the META.yml file". + "\n\n" + ); + } + } + $dep; +} + +sub prereqs_for_slot { + my($self,$slot) = @_; + my($prereq_pm); + unless ($CPAN::META->has_usable("CPAN::Meta::Requirements")) { + my $whynot = "not available"; + if (defined $CPAN::Meta::Requirements::VERSION) { + $whynot = "version $CPAN::Meta::Requirements::VERSION not sufficient"; + } + $CPAN::Frontend->mywarn("CPAN::Meta::Requirements $whynot\n"); + my $before = ""; + if ($self->{CALLED_FOR}){ + if ($self->{CALLED_FOR} =~ + /^( + CPAN::Meta::Requirements + |version + |parent + |ExtUtils::MakeMaker + |Test::Harness + )$/x) { + $CPAN::Frontend->mywarn("Setting requirements to nil as a workaround\n"); + return; + } + $before = " before $self->{CALLED_FOR}"; + } + $CPAN::Frontend->mydie("Please install CPAN::Meta::Requirements manually$before"); + } + my $merged = CPAN::Meta::Requirements->new; + my $prefs_depends = $self->prefs->{depends}||{}; + my $feature_depends = $self->_feature_depends(); + if ($slot eq "configure_requires_later") { + for my $hash ( $self->configure_requires, + $prefs_depends->{configure_requires}, + $feature_depends->{configure_requires}, + ) { + $merged->add_requirements( + CPAN::Meta::Requirements->from_string_hash($hash) + ); + } + if (-f "Build.PL" + && ! -f File::Spec->catfile($self->{build_dir},"Makefile.PL") + && ! $merged->requirements_for_module("Module::Build") + && ! $CPAN::META->has_inst("Module::Build") + ) { + $CPAN::Frontend->mywarn( + " Warning: CPAN.pm discovered Module::Build as undeclared prerequisite.\n". + " Adding it now as such.\n" + ); + $CPAN::Frontend->mysleep(5); + $merged->add_minimum( "Module::Build" => 0 ); + delete $self->{writemakefile}; + } + $prereq_pm = {}; # configure_requires defined as "b" + } elsif ($slot eq "later") { + my $prereq_pm_0 = $self->prereq_pm || {}; + for my $reqtype (qw(requires build_requires opt_requires opt_build_requires)) { + $prereq_pm->{$reqtype} = {%{$prereq_pm_0->{$reqtype}||{}}}; # copy to not pollute it + for my $dep ($prefs_depends,$feature_depends) { + for my $k (keys %{$dep->{$reqtype}||{}}) { + $prereq_pm->{$reqtype}{$k} = $dep->{$reqtype}{$k}; + } + } + } + # XXX what about optional_req|breq? -- xdg, 2012-04-01 + for my $hash ( + $prereq_pm->{requires}, + $prereq_pm->{build_requires}, + $prereq_pm->{opt_requires}, + $prereq_pm->{opt_build_requires}, + + ) { + $merged->add_requirements( + CPAN::Meta::Requirements->from_string_hash($hash) + ); + } + } else { + die "Panic: illegal slot '$slot'"; + } + return ($merged->as_string_hash, $prereq_pm); +} + +#-> sub CPAN::Distribution::unsat_prereq ; +# return ([Foo,"r"],[Bar,"b"]) for normal modules +# return ([perl=>5.008]) if we need a newer perl than we are running under +# (sorry for the inconsistency, it was an accident) +sub unsat_prereq { + my($self,$slot) = @_; + my($merged_hash,$prereq_pm) = $self->prereqs_for_slot($slot); + my(@need); + unless ($CPAN::META->has_usable("CPAN::Meta::Requirements")) { + $CPAN::Frontend->mywarn("CPAN::Meta::Requirements not available, please install as soon as possible, trying to continue with severly limited capabilities\n"); + return; + } + my $merged = CPAN::Meta::Requirements->from_string_hash($merged_hash); + my @merged = sort $merged->required_modules; + CPAN->debug("all merged_prereqs[@merged]") if $CPAN::DEBUG; + NEED: for my $need_module ( @merged ) { + my $need_version = $merged->requirements_for_module($need_module); + my($available_version,$inst_file,$available_file,$nmo); + if ($need_module eq "perl") { + $available_version = $]; + $available_file = CPAN::find_perl(); + } else { + if (CPAN::_sqlite_running()) { + CPAN::Index->reload; + $CPAN::SQLite->search("CPAN::Module",$need_module); + } + $nmo = $CPAN::META->instance("CPAN::Module",$need_module); + $inst_file = $nmo->inst_file || ''; + $available_file = $nmo->available_file || ''; + $available_version = $nmo->available_version; + if ($nmo->uptodate) { + my $accepts = eval { + $merged->accepts_module($need_module, $available_version); + }; + unless ($accepts) { + my $rq = $merged->requirements_for_module( $need_module ); + $CPAN::Frontend->mywarn( + "Warning: Version '$available_version' of ". + "'$need_module' is up to date but does not ". + "fulfill requirements ($rq). I will continue, ". + "but chances to succeed are low.\n"); + } + next NEED; + } + + # if they have not specified a version, we accept any installed one + if ( $available_file + and ( # a few quick short circuits + not defined $need_version + or $need_version eq '0' # "==" would trigger warning when not numeric + or $need_version eq "undef" + )) { + unless ($nmo->inst_deprecated) { + next NEED; + } + } + } + + # We only want to install prereqs if either they're not installed + # or if the installed version is too old. We cannot omit this + # check, because if 'force' is in effect, nobody else will check. + # But we don't want to accept a deprecated module installed as part + # of the Perl core, so we continue if the available file is the installed + # one and is deprecated + + if ( $available_file ) { + my $fulfills_all_version_rqs = $self->_fulfills_all_version_rqs + ( + $need_module, + $available_file, + $available_version, + $need_version, + ); + if ( $inst_file + && $available_file eq $inst_file + && $nmo->inst_deprecated + ) { + # continue installing as a prereq. we really want that + # because the deprecated module may spit out warnings + # and third party did not know until today. Only one + # exception is OK, because CPANPLUS is special after + # all: + if ( $fulfills_all_version_rqs and + $nmo->id =~ /^CPANPLUS(?:::Dist::Build)$/ + ) { + # here we have an available version that is good + # enough although deprecated (preventing circular + # loop CPANPLUS => CPANPLUS::Dist::Build RT#83042) + next NEED; + } + } elsif ( + $self->{reqtype} =~ /^(r|c)$/ + && (exists $prereq_pm->{requires}{$need_module} || exists $prereq_pm->{opt_requires} ) + && $nmo + && !$inst_file + ) { + # continue installing as a prereq; this may be a + # distro we already used when it was a build_requires + # so we did not install it. But suddenly somebody + # wants it as a requires + my $need_distro = $nmo->distribution; + if ($need_distro->{install} && $need_distro->{install}->failed && $need_distro->{install}->text =~ /is only/) { + CPAN->debug("promotion from build_requires to requires") if $CPAN::DEBUG; + delete $need_distro->{install}; # promote to another installation attempt + $need_distro->{reqtype} = "r"; + $need_distro->install; + next NEED; + } + } + else { + next NEED if $fulfills_all_version_rqs; + } + } + + if ($need_module eq "perl") { + return ["perl", $need_version]; + } + $self->{sponsored_mods}{$need_module} ||= 0; + CPAN->debug("need_module[$need_module]s/s/n[$self->{sponsored_mods}{$need_module}]") if $CPAN::DEBUG; + if (my $sponsoring = $self->{sponsored_mods}{$need_module}++) { + # We have already sponsored it and for some reason it's still + # not available. So we do ... what?? + + # if we push it again, we have a potential infinite loop + + # The following "next" was a very problematic construct. + # It helped a lot but broke some day and had to be + # replaced. + + # We must be able to deal with modules that come again and + # again as a prereq and have themselves prereqs and the + # queue becomes long but finally we would find the correct + # order. The RecursiveDependency check should trigger a + # die when it's becoming too weird. Unfortunately removing + # this next breaks many other things. + + # The bug that brought this up is described in Todo under + # "5.8.9 cannot install Compress::Zlib" + + # next; # this is the next that had to go away + + # The following "next NEED" are fine and the error message + # explains well what is going on. For example when the DBI + # fails and consequently DBD::SQLite fails and now we are + # processing CPAN::SQLite. Then we must have a "next" for + # DBD::SQLite. How can we get it and how can we identify + # all other cases we must identify? + + my $do = $nmo->distribution; + next NEED unless $do; # not on CPAN + if (CPAN::Version->vcmp($need_version, $nmo->ro->{CPAN_VERSION}) > 0){ + $CPAN::Frontend->mywarn("Warning: Prerequisite ". + "'$need_module => $need_version' ". + "for '$self->{ID}' seems ". + "not available according to the indices\n" + ); + next NEED; + } + NOSAYER: for my $nosayer ( + "unwrapped", + "writemakefile", + "signature_verify", + "make", + "make_test", + "install", + "make_clean", + ) { + if ($do->{$nosayer}) { + my $selfid = $self->pretty_id; + my $did = $do->pretty_id; + if (UNIVERSAL::can($do->{$nosayer},"failed") ? + $do->{$nosayer}->failed : + $do->{$nosayer} =~ /^NO/) { + if ($nosayer eq "make_test" + && + $do->{make_test}{COMMANDID} != $CPAN::CurrentCommandId + ) { + next NOSAYER; + } + ### XXX don't complain about missing optional deps -- xdg, 2012-04-01 + if ($self->is_locally_optional($prereq_pm, $need_module)) { + # don't complain about failing optional prereqs + } + else { + $CPAN::Frontend->mywarn("Warning: Prerequisite ". + "'$need_module => $need_version' ". + "for '$selfid' failed when ". + "processing '$did' with ". + "'$nosayer => $do->{$nosayer}'. Continuing, ". + "but chances to succeed are limited.\n" + ); + $CPAN::Frontend->mysleep($sponsoring/10); + } + next NEED; + } else { # the other guy succeeded + if ($nosayer =~ /^(install|make_test)$/) { + # we had this with + # DMAKI/DateTime-Calendar-Chinese-0.05.tar.gz + # in 2007-03 for 'make install' + # and 2008-04: #30464 (for 'make test') + # $CPAN::Frontend->mywarn("Warning: Prerequisite ". + # "'$need_module => $need_version' ". + # "for '$selfid' already built ". + # "but the result looks suspicious. ". + # "Skipping another build attempt, ". + # "to prevent looping endlessly.\n" + # ); + next NEED; + } + } + } + } + } + my $needed_as; + if (0) { + } elsif (exists $prereq_pm->{requires}{$need_module} + || exists $prereq_pm->{opt_requires}{$need_module} + ) { + $needed_as = "r"; + } elsif ($slot eq "configure_requires_later") { + # in ae872487d5 we said: C< we have not yet run the + # {Build,Makefile}.PL, we must presume "r" >; but the + # meta.yml standard says C< These dependencies are not + # required after the distribution is installed. >; so now + # we change it back to "b" and care for the proper + # promotion later. + $needed_as = "b"; + } else { + $needed_as = "b"; + } + # here need to flag as optional for recommends/suggests + # -- xdg, 2012-04-01 + $self->debug(sprintf "%s manadory?[%s]", + $self->pretty_id, + $self->{mandatory}) + if $CPAN::DEBUG; + my $optional = !$self->{mandatory} + || $self->is_locally_optional($prereq_pm, $need_module); + push @need, [$need_module,$needed_as,$optional]; + } + my @unfolded = map { "[".join(",",@$_)."]" } @need; + CPAN->debug("returning from unsat_prereq[@unfolded]") if $CPAN::DEBUG; + @need; +} + +sub _fulfills_all_version_rqs { + my($self,$need_module,$available_file,$available_version,$need_version) = @_; + my(@all_requirements) = split /\s*,\s*/, $need_version; + local($^W) = 0; + my $ok = 0; + RQ: for my $rq (@all_requirements) { + if ($rq =~ s|>=\s*||) { + } elsif ($rq =~ s|>\s*||) { + # 2005-12: one user + if (CPAN::Version->vgt($available_version,$rq)) { + $ok++; + } + next RQ; + } elsif ($rq =~ s|!=\s*||) { + # 2005-12: no user + if (CPAN::Version->vcmp($available_version,$rq)) { + $ok++; + next RQ; + } else { + $ok=0; + last RQ; + } + } elsif ($rq =~ m|<=?\s*|) { + # 2005-12: no user + $CPAN::Frontend->mywarn("Downgrading not supported (rq[$rq])\n"); + $ok++; + next RQ; + } elsif ($rq =~ s|==\s*||) { + # 2009-07: ELLIOTJS/Perl-Critic-1.099_002.tar.gz + if (CPAN::Version->vcmp($available_version,$rq)) { + $ok=0; + last RQ; + } else { + $ok++; + next RQ; + } + } + if (! CPAN::Version->vgt($rq, $available_version)) { + $ok++; + } + CPAN->debug(sprintf("need_module[%s]available_file[%s]". + "available_version[%s]rq[%s]ok[%d]", + $need_module, + $available_file, + $available_version, + CPAN::Version->readable($rq), + $ok, + )) if $CPAN::DEBUG; + } + my $ret = $ok == @all_requirements; + CPAN->debug(sprintf("need_module[%s]ok[%s]all_requirements[%d]",$need_module, $ok, scalar @all_requirements)) if $CPAN::DEBUG; + return $ret; +} + +#-> sub CPAN::Distribution::read_meta +# read any sort of meta files, return CPAN::Meta object if no errors +sub read_meta { + my($self) = @_; + my $meta_file = $self->pick_meta_file + or return; + + return unless $CPAN::META->has_usable("CPAN::Meta"); + my $meta = eval { CPAN::Meta->load_file($meta_file)} + or return; + + # Very old EU::MM could have wrong META + if ($meta_file eq 'META.yml' + && $meta->generated_by =~ /ExtUtils::MakeMaker version ([\d\._]+)/ + ) { + my $eummv = do { local $^W = 0; $1+0; }; + return if $eummv < 6.2501; + } + + return $meta; +} + +#-> sub CPAN::Distribution::read_yaml ; +# XXX This should be DEPRECATED -- dagolden, 2011-02-05 +sub read_yaml { + my($self) = @_; + my $meta_file = $self->pick_meta_file('\.yml$'); + $self->debug("meta_file[$meta_file]") if $CPAN::DEBUG; + return unless $meta_file; + my $yaml; + eval { $yaml = $self->parse_meta_yml($meta_file) }; + if ($@ or ! $yaml) { + return undef; # if we die, then we cannot read YAML's own META.yml + } + # not "authoritative" + if (defined $yaml && (! ref $yaml || ref $yaml ne "HASH")) { + $CPAN::Frontend->mywarn("META.yml does not seem to be conforming, cannot use it.\n"); + $yaml = undef; + } + $self->debug(sprintf "yaml[%s]", $yaml || "UNDEF") + if $CPAN::DEBUG; + $self->debug($yaml) if $CPAN::DEBUG && $yaml; + # MYMETA.yml is static and authoritative by definition + if ( $meta_file =~ /MYMETA\.yml/ ) { + return $yaml; + } + # META.yml is authoritative only if dynamic_config is defined and false + if ( defined $yaml->{dynamic_config} && ! $yaml->{dynamic_config} ) { + return $yaml; + } + # otherwise, we can't use what we found + return undef; +} + +#-> sub CPAN::Distribution::configure_requires ; +sub configure_requires { + my($self) = @_; + return unless my $meta_file = $self->pick_meta_file('^META'); + if (my $meta_obj = $self->read_meta) { + my $prereqs = $meta_obj->effective_prereqs; + my $cr = $prereqs->requirements_for(qw/configure requires/); + return $cr ? $cr->as_string_hash : undef; + } + else { + my $yaml = eval { $self->parse_meta_yml($meta_file) }; + return $yaml->{configure_requires}; + } +} + +#-> sub CPAN::Distribution::prereq_pm ; +sub prereq_pm { + my($self) = @_; + return unless $self->{writemakefile} # no need to have succeeded + # but we must have run it + || $self->{modulebuild}; + unless ($self->{build_dir}) { + return; + } + # no Makefile/Build means configuration aborted, so don't look for prereqs + my $makefile = File::Spec->catfile($self->{build_dir}, $^O eq 'VMS' ? 'descrip.mms' : 'Makefile'); + my $buildfile = File::Spec->catfile($self->{build_dir}, $^O eq 'VMS' ? 'Build.com' : 'Build'); + return unless -f $makefile || -f $buildfile; + CPAN->debug(sprintf "writemakefile[%s]modulebuild[%s]", + $self->{writemakefile}||"", + $self->{modulebuild}||"", + ) if $CPAN::DEBUG; + my($req,$breq, $opt_req, $opt_breq); + my $meta_obj = $self->read_meta; + # META/MYMETA is only authoritative if dynamic_config is false + if ($meta_obj && ! $meta_obj->dynamic_config) { + my $prereqs = $meta_obj->effective_prereqs; + my $requires = $prereqs->requirements_for(qw/runtime requires/); + my $build_requires = $prereqs->requirements_for(qw/build requires/); + my $test_requires = $prereqs->requirements_for(qw/test requires/); + # XXX we don't yet distinguish build vs test, so merge them for now + $build_requires->add_requirements($test_requires); + $req = $requires->as_string_hash; + $breq = $build_requires->as_string_hash; + + # XXX assemble optional_req && optional_breq from recommends/suggests + # depending on corresponding policies -- xdg, 2012-04-01 + CPAN->use_inst("CPAN::Meta::Requirements"); + my $opt_runtime = CPAN::Meta::Requirements->new; + my $opt_build = CPAN::Meta::Requirements->new; + if ( $CPAN::Config->{recommends_policy} ) { + $opt_runtime->add_requirements( $prereqs->requirements_for(qw/runtime recommends/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/build recommends/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/test recommends/)); + + } + if ( $CPAN::Config->{suggests_policy} ) { + $opt_runtime->add_requirements( $prereqs->requirements_for(qw/runtime suggests/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/build suggests/)); + $opt_build->add_requirements( $prereqs->requirements_for(qw/test suggests/)); + } + $opt_req = $opt_runtime->as_string_hash; + $opt_breq = $opt_build->as_string_hash; + } + elsif (my $yaml = $self->read_yaml) { # often dynamic_config prevents a result here + $req = $yaml->{requires} || {}; + $breq = $yaml->{build_requires} || {}; + if ( $CPAN::Config->{recommends_policy} ) { + $opt_req = $yaml->{recommends} || {}; + } + undef $req unless ref $req eq "HASH" && %$req; + if ($req) { + if ($yaml->{generated_by} && + $yaml->{generated_by} =~ /ExtUtils::MakeMaker version ([\d\._]+)/) { + my $eummv = do { local $^W = 0; $1+0; }; + if ($eummv < 6.2501) { + # thanks to Slaven for digging that out: MM before + # that could be wrong because it could reflect a + # previous release + undef $req; + } + } + my $areq; + my $do_replace; + foreach my $k (sort keys %{$req||{}}) { + my $v = $req->{$k}; + next unless defined $v; + if ($v =~ /\d/) { + $areq->{$k} = $v; + } elsif ($k =~ /[A-Za-z]/ && + $v =~ /[A-Za-z]/ && + $CPAN::META->exists("CPAN::Module",$v) + ) { + $CPAN::Frontend->mywarn("Suspicious key-value pair in META.yml's ". + "requires hash: $k => $v; I'll take both ". + "key and value as a module name\n"); + $CPAN::Frontend->mysleep(1); + $areq->{$k} = 0; + $areq->{$v} = 0; + $do_replace++; + } + } + $req = $areq if $do_replace; + } + } + else { + $CPAN::Frontend->mywarnonce("Could not read metadata file. Falling back to other ". + "methods to determine prerequisites\n"); + } + + unless ($req || $breq) { + my $build_dir; + unless ( $build_dir = $self->{build_dir} ) { + return; + } + my $makefile = File::Spec->catfile($build_dir,"Makefile"); + my $fh; + if (-f $makefile + and + $fh = FileHandle->new("<$makefile\0")) { + CPAN->debug("Getting prereq from Makefile") if $CPAN::DEBUG; + local($/) = "\n"; + while (<$fh>) { + last if /MakeMaker post_initialize section/; + my($p) = m{^[\#] + \s+PREREQ_PM\s+=>\s+(.+) + }x; + next unless $p; + # warn "Found prereq expr[$p]"; + + # Regexp modified by A.Speer to remember actual version of file + # PREREQ_PM hash key wants, then add to + while ( $p =~ m/(?:\s)([\w\:]+)=>(q\[.*?\]|undef),?/g ) { + my($m,$n) = ($1,$2); + # When a prereq is mentioned twice: let the bigger + # win; usual culprit is that they declared + # build_requires separately from requires; see + # rt.cpan.org #47774 + my($prevn); + if ( defined $req->{$m} ) { + $prevn = $req->{$m}; + } + if ($n =~ /^q\[(.*?)\]$/) { + $n = $1; + } + if (!$prevn || CPAN::Version->vlt($prevn, $n)){ + $req->{$m} = $n; + } + } + last; + } + } + } + unless ($req || $breq) { + my $build_dir = $self->{build_dir} or die "Panic: no build_dir?"; + my $buildfile = File::Spec->catfile($build_dir,"Build"); + if (-f $buildfile) { + CPAN->debug("Found '$buildfile'") if $CPAN::DEBUG; + my $build_prereqs = File::Spec->catfile($build_dir,"_build","prereqs"); + if (-f $build_prereqs) { + CPAN->debug("Getting prerequisites from '$build_prereqs'") if $CPAN::DEBUG; + my $content = do { local *FH; + open FH, $build_prereqs + or $CPAN::Frontend->mydie("Could not open ". + "'$build_prereqs': $!"); + local $/; + <FH>; + }; + my $bphash = eval $content; + if ($@) { + } else { + $req = $bphash->{requires} || +{}; + $breq = $bphash->{build_requires} || +{}; + } + } + } + } + # XXX needs to be adapted for optional_req & optional_breq -- xdg, 2012-04-01 + if ($req || $breq || $opt_req || $opt_breq ) { + return $self->{prereq_pm} = { + requires => $req, + build_requires => $breq, + opt_requires => $opt_req, + opt_build_requires => $opt_breq, + }; + } +} + +#-> sub CPAN::Distribution::shortcut_test ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_test { + my ($self) = @_; + + $self->debug("checking badtestcnt[$self->{ID}]") if $CPAN::DEBUG; + $self->{badtestcnt} ||= 0; + if ($self->{badtestcnt} > 0) { + require Data::Dumper; + CPAN->debug(sprintf "NOREPEAT[%s]", Data::Dumper::Dumper($self)) if $CPAN::DEBUG; + return $self->goodbye("Won't repeat unsuccessful test during this command"); + } + + for my $slot ( qw/later configure_requires_later/ ) { + $self->debug("checking $slot slot[$self->{ID}]") if $CPAN::DEBUG; + return $self->success($self->{$slot}) + if $self->{$slot}; + } + + $self->debug("checking if tests passed[$self->{ID}]") if $CPAN::DEBUG; + if ( $self->{make_test} ) { + if ( + UNIVERSAL::can($self->{make_test},"failed") ? + $self->{make_test}->failed : + $self->{make_test} =~ /^NO/ + ) { + if ( + UNIVERSAL::can($self->{make_test},"commandid") + && + $self->{make_test}->commandid == $CPAN::CurrentCommandId + ) { + return $self->goodbye("Has already been tested within this command"); + } + } else { + # if global "is_tested" has been cleared, we need to mark this to + # be added to PERL5LIB if not already installed + if ($self->tested_ok_but_not_installed) { + $CPAN::META->is_tested($self->{build_dir},$self->{make_test}{TIME}); + } + return $self->success("Has already been tested successfully"); + } + } + + if ($self->{notest}) { + $self->{make_test} = CPAN::Distrostatus->new("YES"); + return $self->success("Skipping test because of notest pragma"); + } + + return undef; # no shortcut +} + +#-> sub CPAN::Distribution::_exe_files ; +sub _exe_files { + my($self) = @_; + return unless $self->{writemakefile} # no need to have succeeded + # but we must have run it + || $self->{modulebuild}; + unless ($self->{build_dir}) { + return; + } + CPAN->debug(sprintf "writemakefile[%s]modulebuild[%s]", + $self->{writemakefile}||"", + $self->{modulebuild}||"", + ) if $CPAN::DEBUG; + my $build_dir; + unless ( $build_dir = $self->{build_dir} ) { + return; + } + my $makefile = File::Spec->catfile($build_dir,"Makefile"); + my $fh; + my @exe_files; + if (-f $makefile + and + $fh = FileHandle->new("<$makefile\0")) { + CPAN->debug("Getting exefiles from Makefile") if $CPAN::DEBUG; + local($/) = "\n"; + while (<$fh>) { + last if /MakeMaker post_initialize section/; + my($p) = m{^[\#] + \s+EXE_FILES\s+=>\s+\[(.+)\] + }x; + next unless $p; + # warn "Found exefiles expr[$p]"; + my @p = split /,\s*/, $p; + for my $p2 (@p) { + if ($p2 =~ /^q\[(.+)\]/) { + push @exe_files, $1; + } + } + } + } + return \@exe_files if @exe_files; + my $buildparams = File::Spec->catfile($build_dir,"_build","build_params"); + if (-f $buildparams) { + CPAN->debug("Found '$buildparams'") if $CPAN::DEBUG; + my $x = do $buildparams; + for my $sf (@{$x->[2]{script_files} || []}) { + push @exe_files, $sf; + } + } + return \@exe_files; +} + +#-> sub CPAN::Distribution::test ; +sub test { + my($self) = @_; + + $self->pre_test(); + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; + if (my $goto = $self->prefs->{goto}) { + return $self->goto($goto); + } + + $self->make + or return; + + if ( defined( my $sc = $self->shortcut_test ) ) { + return $sc; + } + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + # warn "XDEBUG: checking for notest: $self->{notest} $self"; + my $make = $self->{modulebuild} ? "Build" : "make"; + + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + local $ENV{PERL_USE_UNSAFE_INC} = exists $ENV{PERL_USE_UNSAFE_INC} ? $ENV{PERL_USE_UNSAFE_INC} : 1; # test + $CPAN::META->set_perl5lib; + local $ENV{MAKEFLAGS}; # protect us from outer make calls + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; + + $CPAN::Frontend->myprint("Running $make test\n"); + + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); + + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; + } + + $self->debug("Changed directory to $self->{build_dir}") + if $CPAN::DEBUG; + + if ($^O eq 'MacOS') { + Mac::BuildTools::make_test($self); + return; + } + + if ($self->{modulebuild}) { + my $thm = CPAN::Shell->expand("Module","Test::Harness"); + my $v = $thm->inst_version; + if (CPAN::Version->vlt($v,2.62)) { + # XXX Eric Wilhelm reported this as a bug: klapperl: + # Test::Harness 3.0 self-tests, so that should be 'unless + # installing Test::Harness' + unless ($self->id eq $thm->distribution->id) { + $CPAN::Frontend->mywarn(qq{The version of your Test::Harness is only + '$v', you need at least '2.62'. Please upgrade your Test::Harness.\n}); + $self->{make_test} = CPAN::Distrostatus->new("NO Test::Harness too old"); + return; + } + } + } + + if ( ! $self->{force_update} ) { + # bypass actual tests if "trust_test_report_history" and have a report + my $have_tested_fcn; + if ( $CPAN::Config->{trust_test_report_history} + && $CPAN::META->has_inst("CPAN::Reporter::History") + && ( $have_tested_fcn = CPAN::Reporter::History->can("have_tested" ))) { + if ( my @reports = $have_tested_fcn->( dist => $self->base_id ) ) { + # Do nothing if grade was DISCARD + if ( $reports[-1]->{grade} =~ /^(?:PASS|UNKNOWN)$/ ) { + $self->{make_test} = CPAN::Distrostatus->new("YES"); + # if global "is_tested" has been cleared, we need to mark this to + # be added to PERL5LIB if not already installed + if ($self->tested_ok_but_not_installed) { + $CPAN::META->is_tested($self->{build_dir},$self->{make_test}{TIME}); + } + $CPAN::Frontend->myprint("Found prior test report -- OK\n"); + return; + } + elsif ( $reports[-1]->{grade} =~ /^(?:FAIL|NA)$/ ) { + $self->{make_test} = CPAN::Distrostatus->new("NO"); + $self->{badtestcnt}++; + $CPAN::Frontend->mywarn("Found prior test report -- NOT OK\n"); + return; + } + } + } + } + + my $system; + my $prefs_test = $self->prefs->{test}; + if (my $commandline + = exists $prefs_test->{commandline} ? $prefs_test->{commandline} : "") { + $system = $commandline; + $ENV{PERL} = CPAN::find_perl(); + } elsif ($self->{modulebuild}) { + $system = sprintf "%s test", $self->_build_command(); + unless (-e "Build" || ($^O eq 'VMS' && -e "Build.com")) { + my $id = $self->pretty_id; + $CPAN::Frontend->mywarn("Alert: no 'Build' file found while trying to test '$id'"); + } + } else { + $system = join " ", $self->_make_command(), "test"; + } + my $make_test_arg = $self->_make_phase_arg("test"); + $system = sprintf("%s%s", + $system, + $make_test_arg ? " $make_test_arg" : "", + ); + my($tests_ok); + my $test_env; + if ($self->prefs->{test}) { + $test_env = $self->prefs->{test}{env}; + } + local @ENV{keys %$test_env} = values %$test_env if $test_env; + my $expect_model = $self->_prefs_with_expect("test"); + my $want_expect = 0; + if ( $expect_model && @{$expect_model->{talk}} ) { + my $can_expect = $CPAN::META->has_inst("Expect"); + if ($can_expect) { + $want_expect = 1; + } else { + $CPAN::Frontend->mywarn("Expect not installed, falling back to ". + "testing without\n"); + } + } + if ($want_expect) { + if ($self->_should_report('test')) { + $CPAN::Frontend->mywarn("Reporting via CPAN::Reporter is currently ". + "not supported when distroprefs specify ". + "an interactive test\n"); + } + $tests_ok = $self->_run_via_expect($system,'test',$expect_model) == 0; + } elsif ( $self->_should_report('test') ) { + $tests_ok = CPAN::Reporter::test($self, $system); + } else { + $tests_ok = system($system) == 0; + } + $self->introduce_myself; + my $but = $self->_make_test_illuminate_prereqs(); + if ( $tests_ok ) { + if ($but) { + $CPAN::Frontend->mywarn("Tests succeeded but $but\n"); + $self->{make_test} = CPAN::Distrostatus->new("NO $but"); + $self->store_persistent_state; + return $self->goodbye("[dependencies] -- NA"); + } + $CPAN::Frontend->myprint(" $system -- OK\n"); + $self->{make_test} = CPAN::Distrostatus->new("YES"); + $CPAN::META->is_tested($self->{build_dir},$self->{make_test}{TIME}); + # probably impossible to need the next line because badtestcnt + # has a lifespan of one command + delete $self->{badtestcnt}; + } else { + if ($but) { + $but .= "; additionally test harness failed"; + $CPAN::Frontend->mywarn("$but\n"); + $self->{make_test} = CPAN::Distrostatus->new("NO $but"); + } elsif ( $self->{force_update} ) { + $self->{make_test} = CPAN::Distrostatus->new( + "NO but failure ignored because 'force' in effect" + ); + } else { + $self->{make_test} = CPAN::Distrostatus->new("NO"); + } + $self->{badtestcnt}++; + $CPAN::Frontend->mywarn(" $system -- NOT OK\n"); + CPAN::Shell->optprint + ("hint", + sprintf + ("//hint// to see the cpan-testers results for installing this module, try: + reports %s\n", + $self->pretty_id)); + } + $self->store_persistent_state; + + $self->post_test(); + + return $self->{force_update} ? 1 : !! $tests_ok; +} + +sub _make_test_illuminate_prereqs { + my($self) = @_; + my @prereq; + + # local $CPAN::DEBUG = 16; # Distribution + for my $m (sort keys %{$self->{sponsored_mods}}) { + next unless $self->{sponsored_mods}{$m} > 0; + my $m_obj = CPAN::Shell->expand("Module",$m) or next; + # XXX we need available_version which reflects + # $ENV{PERL5LIB} so that already tested but not yet + # installed modules are counted. + my $available_version = $m_obj->available_version; + my $available_file = $m_obj->available_file; + if ($available_version && + !CPAN::Version->vlt($available_version,$self->{prereq_pm}{$m}) + ) { + CPAN->debug("m[$m] good enough available_version[$available_version]") + if $CPAN::DEBUG; + } elsif ($available_file + && ( + !$self->{prereq_pm}{$m} + || + $self->{prereq_pm}{$m} == 0 + ) + ) { + # lex Class::Accessor::Chained::Fast which has no $VERSION + CPAN->debug("m[$m] have available_file[$available_file]") + if $CPAN::DEBUG; + } else { + push @prereq, $m + if $m_obj->{mandatory}; + } + } + my $but; + if (@prereq) { + my $cnt = @prereq; + my $which = join ",", @prereq; + $but = $cnt == 1 ? "one dependency not OK ($which)" : + "$cnt dependencies missing ($which)"; + } + $but; +} + +sub _prefs_with_expect { + my($self,$where) = @_; + return unless my $prefs = $self->prefs; + return unless my $where_prefs = $prefs->{$where}; + if ($where_prefs->{expect}) { + return { + mode => "deterministic", + timeout => 15, + talk => $where_prefs->{expect}, + }; + } elsif ($where_prefs->{"eexpect"}) { + return $where_prefs->{"eexpect"}; + } + return; +} + +#-> sub CPAN::Distribution::clean ; +sub clean { + my($self) = @_; + my $make = $self->{modulebuild} ? "Build" : "make"; + $CPAN::Frontend->myprint("Running $make clean\n"); + unless (exists $self->{archived}) { + $CPAN::Frontend->mywarn("Distribution seems to have never been unzipped". + "/untarred, nothing done\n"); + return 1; + } + unless (exists $self->{build_dir}) { + $CPAN::Frontend->mywarn("Distribution has no own directory, nothing to do.\n"); + return 1; + } + if (exists $self->{writemakefile} + and $self->{writemakefile}->failed + ) { + $CPAN::Frontend->mywarn("No Makefile, don't know how to 'make clean'\n"); + return 1; + } + EXCUSE: { + my @e; + exists $self->{make_clean} and $self->{make_clean} eq "YES" and + push @e, "make clean already called once"; + $CPAN::Frontend->myprint(join "", map {" $_\n"} @e) and return if @e; + } + chdir $self->{build_dir} or + Carp::confess("Couldn't chdir to $self->{build_dir}: $!"); + $self->debug("Changed directory to $self->{build_dir}") if $CPAN::DEBUG; + + if ($^O eq 'MacOS') { + Mac::BuildTools::make_clean($self); + return; + } + + my $system; + if ($self->{modulebuild}) { + unless (-f "Build") { + my $cwd = CPAN::anycwd(); + $CPAN::Frontend->mywarn("Alert: no Build file available for 'clean $self->{id}". + " in cwd[$cwd]. Danger, Will Robinson!"); + $CPAN::Frontend->mysleep(5); + } + $system = sprintf "%s clean", $self->_build_command(); + } else { + $system = join " ", $self->_make_command(), "clean"; + } + my $system_ok = system($system) == 0; + $self->introduce_myself; + if ( $system_ok ) { + $CPAN::Frontend->myprint(" $system -- OK\n"); + + # $self->force; + + # Jost Krieger pointed out that this "force" was wrong because + # it has the effect that the next "install" on this distribution + # will untar everything again. Instead we should bring the + # object's state back to where it is after untarring. + + for my $k (qw( + force_update + install + writemakefile + make + make_test + )) { + delete $self->{$k}; + } + $self->{make_clean} = CPAN::Distrostatus->new("YES"); + + } else { + # Hmmm, what to do if make clean failed? + + $self->{make_clean} = CPAN::Distrostatus->new("NO"); + $CPAN::Frontend->mywarn(qq{ $system -- NOT OK\n}); + + # 2006-02-27: seems silly to me to force a make now + # $self->force("make"); # so that this directory won't be used again + + } + $self->store_persistent_state; +} + +#-> sub CPAN::Distribution::check_disabled ; +sub check_disabled { + my ($self) = @_; + $self->debug("checking disabled id[$self->{ID}]") if $CPAN::DEBUG; + if ($self->prefs->{disabled} && ! $self->{force_update}) { + return sprintf( + "Disabled via prefs file '%s' doc %d", + $self->{prefs_file}, + $self->{prefs_file_doc}, + ); + } + return; +} + +#-> sub CPAN::Distribution::goto ; +sub goto { + my($self,$goto) = @_; + $goto = $self->normalize($goto); + my $why = sprintf( + "Goto '$goto' via prefs file '%s' doc %d", + $self->{prefs_file}, + $self->{prefs_file_doc}, + ); + $self->{unwrapped} = CPAN::Distrostatus->new("NO $why"); + # 2007-07-16 akoenig : Better than NA would be if we could inherit + # the status of the $goto distro but given the exceptional nature + # of 'goto' I feel reluctant to implement it + my $goodbye_message = "[goto] -- NA $why"; + $self->goodbye($goodbye_message); + + # inject into the queue + + CPAN::Queue->delete($self->id); + CPAN::Queue->jumpqueue({qmod => $goto, reqtype => $self->{reqtype}}); + + # and run where we left off + + my($method) = (caller(1))[3]; + CPAN->instance("CPAN::Distribution",$goto)->$method(); + CPAN::Queue->delete_first($goto); + # XXX delete_first returns undef; is that what this should return + # up the call stack, eg. return $sefl->goto($goto) -- xdg, 2012-04-04 +} + +#-> sub CPAN::Distribution::shortcut_install ; +# return values: undef means don't shortcut; 0 means shortcut as fail; +# and 1 means shortcut as success +sub shortcut_install { + my ($self) = @_; + + $self->debug("checking previous install results[$self->{ID}]") if $CPAN::DEBUG; + if (exists $self->{install}) { + my $text = UNIVERSAL::can($self->{install},"text") ? + $self->{install}->text : + $self->{install}; + if ($text =~ /^YES/) { + $CPAN::META->is_installed($self->{build_dir}); + return $self->success("Already done"); + } elsif ($text =~ /is only/) { + # e.g. 'is only build_requires' + return $self->goodbye($text); + } else { + # comment in Todo on 2006-02-11; maybe retry? + return $self->goodbye("Already tried without success"); + } + } + + for my $slot ( qw/later configure_requires_later/ ) { + return $self->success($self->{$slot}) + if $self->{$slot}; + } + + return undef; +} + +#-> sub CPAN::Distribution::install ; +sub install { + my($self) = @_; + + $self->pre_install(); + + $self->debug("checking goto id[$self->{ID}]") if $CPAN::DEBUG; + if (my $goto = $self->prefs->{goto}) { + return $self->goto($goto); + } + + $self->test + or return; + + if ( defined( my $sc = $self->shortcut_install ) ) { + return $sc; + } + + if ($CPAN::Signal) { + delete $self->{force_update}; + return; + } + + my $builddir = $self->dir or + $CPAN::Frontend->mydie("PANIC: Cannot determine build directory\n"); + + unless (chdir $builddir) { + $CPAN::Frontend->mywarn("Couldn't chdir to '$builddir': $!"); + return; + } + + $self->debug("Changed directory to $self->{build_dir}") + if $CPAN::DEBUG; + + my $make = $self->{modulebuild} ? "Build" : "make"; + $CPAN::Frontend->myprint("Running $make install\n"); + + if ($^O eq 'MacOS') { + Mac::BuildTools::make_install($self); + return; + } + + my $system; + if (my $commandline = $self->prefs->{install}{commandline}) { + $system = $commandline; + $ENV{PERL} = CPAN::find_perl(); + } elsif ($self->{modulebuild}) { + my($mbuild_install_build_command) = + exists $CPAN::HandleConfig::keys{mbuild_install_build_command} && + $CPAN::Config->{mbuild_install_build_command} ? + $CPAN::Config->{mbuild_install_build_command} : + $self->_build_command(); + my $install_directive = $^O eq 'VMS' ? '"install"' : 'install'; + $system = sprintf("%s %s %s", + $mbuild_install_build_command, + $install_directive, + $CPAN::Config->{mbuild_install_arg}, + ); + } else { + my($make_install_make_command) = $self->_make_install_make_command(); + $system = sprintf("%s install %s", + $make_install_make_command, + $CPAN::Config->{make_install_arg}, + ); + } + + my($stderr) = $^O eq "MSWin32" || $^O eq 'VMS' ? "" : " 2>&1 "; + my $brip = CPAN::HandleConfig->prefs_lookup($self, + q{build_requires_install_policy}); + $brip ||="ask/yes"; + my $id = $self->id; + my $reqtype = $self->{reqtype} ||= "c"; # in doubt it was a command + my $want_install = "yes"; + if ($reqtype eq "b") { + if ($brip eq "no") { + $want_install = "no"; + } elsif ($brip =~ m|^ask/(.+)|) { + my $default = $1; + $default = "yes" unless $default =~ /^(y|n)/i; + $want_install = + CPAN::Shell::colorable_makemaker_prompt + ("$id is just needed temporarily during building or testing. ". + "Do you want to install it permanently?", + $default); + } + } + unless ($want_install =~ /^y/i) { + my $is_only = "is only 'build_requires'"; + $self->{install} = CPAN::Distrostatus->new("NO -- $is_only"); + delete $self->{force_update}; + return $self->goodbye("Not installing because $is_only"); + } + local $ENV{PERL5LIB} = defined($ENV{PERL5LIB}) + ? $ENV{PERL5LIB} + : ($ENV{PERLLIB} || ""); + + local $ENV{PERL5OPT} = defined $ENV{PERL5OPT} ? $ENV{PERL5OPT} : ""; + local $ENV{PERL_USE_UNSAFE_INC} = exists $ENV{PERL_USE_UNSAFE_INC} ? $ENV{PERL_USE_UNSAFE_INC} : 1; # install + $CPAN::META->set_perl5lib; + local $ENV{PERL_MM_USE_DEFAULT} = 1 if $CPAN::Config->{use_prompt_default}; + local $ENV{NONINTERACTIVE_TESTING} = 1 if $CPAN::Config->{use_prompt_default}; + + my($pipe) = FileHandle->new("$system $stderr |"); + unless ($pipe) { + $CPAN::Frontend->mywarn("Can't execute $system: $!"); + $self->introduce_myself; + $self->{install} = CPAN::Distrostatus->new("NO"); + $CPAN::Frontend->mywarn(" $system -- NOT OK\n"); + delete $self->{force_update}; + return; + } + my($makeout) = ""; + while (<$pipe>) { + print $_; # intentionally NOT use Frontend->myprint because it + # looks irritating when we markup in color what we + # just pass through from an external program + $makeout .= $_; + } + $pipe->close; + my $close_ok = $? == 0; + $self->introduce_myself; + if ( $close_ok ) { + $CPAN::Frontend->myprint(" $system -- OK\n"); + $CPAN::META->is_installed($self->{build_dir}); + $self->{install} = CPAN::Distrostatus->new("YES"); + if ($CPAN::Config->{'cleanup_after_install'} + && ! $self->is_dot_dist) { + my $parent = File::Spec->catdir( $self->{build_dir}, File::Spec->updir ); + chdir $parent or $CPAN::Frontend->mydie("Couldn't chdir to $parent: $!\n"); + File::Path::rmtree($self->{build_dir}); + my $yml = "$self->{build_dir}.yml"; + if (-e $yml) { + unlink $yml or $CPAN::Frontend->mydie("Couldn't unlink $yml: $!\n"); + } + } + } else { + $self->{install} = CPAN::Distrostatus->new("NO"); + $CPAN::Frontend->mywarn(" $system -- NOT OK\n"); + my $mimc = + CPAN::HandleConfig->prefs_lookup($self, + q{make_install_make_command}); + if ( + $makeout =~ /permission/s + && $> > 0 + && ( + ! $mimc + || $mimc eq (CPAN::HandleConfig->prefs_lookup($self, + q{make})) + ) + ) { + $CPAN::Frontend->myprint( + qq{----\n}. + qq{ You may have to su }. + qq{to root to install the package\n}. + qq{ (Or you may want to run something like\n}. + qq{ o conf make_install_make_command 'sudo make'\n}. + qq{ to raise your permissions.} + ); + } + } + delete $self->{force_update}; + unless ($CPAN::Config->{'cleanup_after_install'}) { + $self->store_persistent_state; + } + + $self->post_install(); + + return !! $close_ok; +} + +sub introduce_myself { + my($self) = @_; + $CPAN::Frontend->myprint(sprintf(" %s\n",$self->pretty_id)); +} + +#-> sub CPAN::Distribution::dir ; +sub dir { + shift->{build_dir}; +} + +#-> sub CPAN::Distribution::perldoc ; +sub perldoc { + my($self) = @_; + + my($dist) = $self->id; + my $package = $self->called_for; + + if ($CPAN::META->has_inst("Pod::Perldocs")) { + my($perl) = $self->perl + or $CPAN::Frontend->mydie("Couldn't find executable perl\n"); + my @args = ($perl, q{-MPod::Perldocs}, q{-e}, + q{Pod::Perldocs->run()}, $package); + my($wstatus); + unless ( ($wstatus = system(@args)) == 0 ) { + my $estatus = $wstatus >> 8; + $CPAN::Frontend->myprint(qq{ + Function system("@args") + returned status $estatus (wstat $wstatus) + }); + } + } + else { + $self->_display_url( $CPAN::Defaultdocs . $package ); + } +} + +#-> sub CPAN::Distribution::_check_binary ; +sub _check_binary { + my ($dist,$shell,$binary) = @_; + my ($pid,$out); + + $CPAN::Frontend->myprint(qq{ + _check_binary($binary)\n}) + if $CPAN::DEBUG; + + if ($CPAN::META->has_inst("File::Which")) { + return File::Which::which($binary); + } else { + local *README; + $pid = open README, "which $binary|" + or $CPAN::Frontend->mywarn(qq{Could not fork 'which $binary': $!\n}); + return unless $pid; + while (<README>) { + $out .= $_; + } + close README + or $CPAN::Frontend->mywarn("Could not run 'which $binary': $!\n") + and return; + } + + $CPAN::Frontend->myprint(qq{ + $out \n}) + if $CPAN::DEBUG && $out; + + return $out; +} + +#-> sub CPAN::Distribution::_display_url ; +sub _display_url { + my($self,$url) = @_; + my($res,$saved_file,$pid,$out); + + $CPAN::Frontend->myprint(qq{ + _display_url($url)\n}) + if $CPAN::DEBUG; + + # should we define it in the config instead? + my $html_converter = "html2text.pl"; + + my $web_browser = $CPAN::Config->{'lynx'} || undef; + my $web_browser_out = $web_browser + ? CPAN::Distribution->_check_binary($self,$web_browser) + : undef; + + if ($web_browser_out) { + # web browser found, run the action + my $browser = CPAN::HandleConfig->safe_quote($CPAN::Config->{'lynx'}); + $CPAN::Frontend->myprint(qq{system[$browser $url]}) + if $CPAN::DEBUG; + $CPAN::Frontend->myprint(qq{ +Displaying URL + $url +with browser $browser +}); + $CPAN::Frontend->mysleep(1); + system("$browser $url"); + if ($saved_file) { 1 while unlink($saved_file) } + } else { + # web browser not found, let's try text only + my $html_converter_out = + CPAN::Distribution->_check_binary($self,$html_converter); + $html_converter_out = CPAN::HandleConfig->safe_quote($html_converter_out); + + if ($html_converter_out ) { + # html2text found, run it + $saved_file = CPAN::Distribution->_getsave_url( $self, $url ); + $CPAN::Frontend->mydie(qq{ERROR: problems while getting $url\n}) + unless defined($saved_file); + + local *README; + $pid = open README, "$html_converter $saved_file |" + or $CPAN::Frontend->mydie(qq{ +Could not fork '$html_converter $saved_file': $!}); + my($fh,$filename); + if ($CPAN::META->has_usable("File::Temp")) { + $fh = File::Temp->new( + dir => File::Spec->tmpdir, + template => 'cpan_htmlconvert_XXXX', + suffix => '.txt', + unlink => 0, + ); + $filename = $fh->filename; + } else { + $filename = "cpan_htmlconvert_$$.txt"; + $fh = FileHandle->new(); + open $fh, ">$filename" or die; + } + while (<README>) { + $fh->print($_); + } + close README or + $CPAN::Frontend->mydie(qq{Could not run '$html_converter $saved_file': $!}); + my $tmpin = $fh->filename; + $CPAN::Frontend->myprint(sprintf(qq{ +Run '%s %s' and +saved output to %s\n}, + $html_converter, + $saved_file, + $tmpin, + )) if $CPAN::DEBUG; + close $fh; + local *FH; + open FH, $tmpin + or $CPAN::Frontend->mydie(qq{Could not open "$tmpin": $!}); + my $fh_pager = FileHandle->new; + local($SIG{PIPE}) = "IGNORE"; + my $pager = $CPAN::Config->{'pager'} || "cat"; + $fh_pager->open("|$pager") + or $CPAN::Frontend->mydie(qq{ +Could not open pager '$pager': $!}); + $CPAN::Frontend->myprint(qq{ +Displaying URL + $url +with pager "$pager" +}); + $CPAN::Frontend->mysleep(1); + $fh_pager->print(<FH>); + $fh_pager->close; + } else { + # coldn't find the web browser or html converter + $CPAN::Frontend->myprint(qq{ +You need to install lynx or $html_converter to use this feature.}); + } + } +} + +#-> sub CPAN::Distribution::_getsave_url ; +sub _getsave_url { + my($dist, $shell, $url) = @_; + + $CPAN::Frontend->myprint(qq{ + _getsave_url($url)\n}) + if $CPAN::DEBUG; + + my($fh,$filename); + if ($CPAN::META->has_usable("File::Temp")) { + $fh = File::Temp->new( + dir => File::Spec->tmpdir, + template => "cpan_getsave_url_XXXX", + suffix => ".html", + unlink => 0, + ); + $filename = $fh->filename; + } else { + $fh = FileHandle->new; + $filename = "cpan_getsave_url_$$.html"; + } + my $tmpin = $filename; + if ($CPAN::META->has_usable('LWP')) { + $CPAN::Frontend->myprint("Fetching with LWP: + $url +"); + my $Ua; + CPAN::LWP::UserAgent->config; + eval { $Ua = CPAN::LWP::UserAgent->new; }; + if ($@) { + $CPAN::Frontend->mywarn("ERROR: CPAN::LWP::UserAgent->new dies with $@\n"); + return; + } else { + my($var); + $Ua->proxy('http', $var) + if $var = $CPAN::Config->{http_proxy} || $ENV{http_proxy}; + $Ua->no_proxy($var) + if $var = $CPAN::Config->{no_proxy} || $ENV{no_proxy}; + } + + my $req = HTTP::Request->new(GET => $url); + $req->header('Accept' => 'text/html'); + my $res = $Ua->request($req); + if ($res->is_success) { + $CPAN::Frontend->myprint(" + request successful.\n") + if $CPAN::DEBUG; + print $fh $res->content; + close $fh; + $CPAN::Frontend->myprint(qq{ + saved content to $tmpin \n}) + if $CPAN::DEBUG; + return $tmpin; + } else { + $CPAN::Frontend->myprint(sprintf( + "LWP failed with code[%s], message[%s]\n", + $res->code, + $res->message, + )); + return; + } + } else { + $CPAN::Frontend->mywarn(" LWP not available\n"); + return; + } +} + +#-> sub CPAN::Distribution::_build_command +sub _build_command { + my($self) = @_; + if ($^O eq "MSWin32") { # special code needed at least up to + # Module::Build 0.2611 and 0.2706; a fix + # in M:B has been promised 2006-01-30 + my($perl) = $self->perl or $CPAN::Frontend->mydie("Couldn't find executable perl\n"); + return "$perl ./Build"; + } + elsif ($^O eq 'VMS') { + return "$^X Build.com"; + } + return "./Build"; +} + +#-> sub CPAN::Distribution::_should_report +sub _should_report { + my($self, $phase) = @_; + die "_should_report() requires a 'phase' argument" + if ! defined $phase; + + # configured + my $test_report = CPAN::HandleConfig->prefs_lookup($self, + q{test_report}); + return unless $test_report; + + # don't repeat if we cached a result + return $self->{should_report} + if exists $self->{should_report}; + + # don't report if we generated a Makefile.PL + if ( $self->{had_no_makefile_pl} ) { + $CPAN::Frontend->mywarn( + "Will not send CPAN Testers report with generated Makefile.PL.\n" + ); + return $self->{should_report} = 0; + } + + # available + if ( ! $CPAN::META->has_inst("CPAN::Reporter")) { + $CPAN::Frontend->mywarnonce( + "CPAN::Reporter not installed. No reports will be sent.\n" + ); + return $self->{should_report} = 0; + } + + # capable + my $crv = CPAN::Reporter->VERSION; + if ( CPAN::Version->vlt( $crv, 0.99 ) ) { + # don't cache $self->{should_report} -- need to check each phase + if ( $phase eq 'test' ) { + return 1; + } + else { + $CPAN::Frontend->mywarn( + "Reporting on the '$phase' phase requires CPAN::Reporter 0.99, but \n" . + "you only have version $crv\. Only 'test' phase reports will be sent.\n" + ); + return; + } + } + + # appropriate + if ($self->is_dot_dist) { + $CPAN::Frontend->mywarn("Reporting via CPAN::Reporter is disabled ". + "for local directories\n"); + return $self->{should_report} = 0; + } + if ($self->prefs->{patches} + && + @{$self->prefs->{patches}} + && + $self->{patched} + ) { + $CPAN::Frontend->mywarn("Reporting via CPAN::Reporter is disabled ". + "when the source has been patched\n"); + return $self->{should_report} = 0; + } + + # proceed and cache success + return $self->{should_report} = 1; +} + +#-> sub CPAN::Distribution::reports +sub reports { + my($self) = @_; + my $pathname = $self->id; + $CPAN::Frontend->myprint("Distribution: $pathname\n"); + + unless ($CPAN::META->has_inst("CPAN::DistnameInfo")) { + $CPAN::Frontend->mydie("CPAN::DistnameInfo not installed; cannot continue"); + } + unless ($CPAN::META->has_usable("LWP")) { + $CPAN::Frontend->mydie("LWP not installed; cannot continue"); + } + unless ($CPAN::META->has_usable("File::Temp")) { + $CPAN::Frontend->mydie("File::Temp not installed; cannot continue"); + } + + my $d = CPAN::DistnameInfo->new($pathname); + + my $dist = $d->dist; # "CPAN-DistnameInfo" + my $version = $d->version; # "0.02" + my $maturity = $d->maturity; # "released" + my $filename = $d->filename; # "CPAN-DistnameInfo-0.02.tar.gz" + my $cpanid = $d->cpanid; # "GBARR" + my $distvname = $d->distvname; # "CPAN-DistnameInfo-0.02" + + my $url = sprintf "http://www.cpantesters.org/show/%s.yaml", $dist; + + CPAN::LWP::UserAgent->config; + my $Ua; + eval { $Ua = CPAN::LWP::UserAgent->new; }; + if ($@) { + $CPAN::Frontend->mydie("CPAN::LWP::UserAgent->new dies with $@\n"); + } + $CPAN::Frontend->myprint("Fetching '$url'..."); + my $resp = $Ua->get($url); + unless ($resp->is_success) { + $CPAN::Frontend->mydie(sprintf "Could not download '%s': %s\n", $url, $resp->code); + } + $CPAN::Frontend->myprint("DONE\n\n"); + my $yaml = $resp->content; + # what a long way round! + my $fh = File::Temp->new( + dir => File::Spec->tmpdir, + template => 'cpan_reports_XXXX', + suffix => '.yaml', + unlink => 0, + ); + my $tfilename = $fh->filename; + print $fh $yaml; + close $fh or $CPAN::Frontend->mydie("Could not close '$tfilename': $!"); + my $unserialized = CPAN->_yaml_loadfile($tfilename)->[0]; + unlink $tfilename or $CPAN::Frontend->mydie("Could not unlink '$tfilename': $!"); + my %other_versions; + my $this_version_seen; + for my $rep (@$unserialized) { + my $rversion = $rep->{version}; + if ($rversion eq $version) { + unless ($this_version_seen++) { + $CPAN::Frontend->myprint ("$rep->{version}:\n"); + } + my $arch = $rep->{archname} || $rep->{platform} || '????'; + my $grade = $rep->{action} || $rep->{status} || '????'; + my $ostext = $rep->{ostext} || ucfirst($rep->{osname}) || '????'; + $CPAN::Frontend->myprint + (sprintf("%1s%1s%-4s %s on %s %s (%s)\n", + $arch eq $Config::Config{archname}?"*":"", + $grade eq "PASS"?"+":$grade eq"FAIL"?"-":"", + $grade, + $rep->{perl}, + $ostext, + $rep->{osvers}, + $arch, + )); + } else { + $other_versions{$rep->{version}}++; + } + } + unless ($this_version_seen) { + $CPAN::Frontend->myprint("No reports found for version '$version' +Reports for other versions:\n"); + for my $v (sort keys %other_versions) { + $CPAN::Frontend->myprint(" $v\: $other_versions{$v}\n"); + } + } + $url =~ s/\.yaml/.html/; + $CPAN::Frontend->myprint("See $url for details\n"); +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +package CPAN::Tarzip; +use strict; +use vars qw($VERSION @ISA $BUGHUNTING); +use CPAN::Debug; +use File::Basename qw(basename); +$VERSION = "5.5012"; +# module is internal to CPAN.pm + +@ISA = qw(CPAN::Debug); ## no critic +$BUGHUNTING ||= 0; # released code must have turned off + +# it's ok if file doesn't exist, it just matters if it is .gz or .bz2 +sub new { + my($class,$file) = @_; + $CPAN::Frontend->mydie("CPAN::Tarzip->new called without arg") unless defined $file; + my $me = { FILE => $file }; + if ($file =~ /\.(bz2|gz|zip|tbz|tgz)$/i) { + $me->{ISCOMPRESSED} = 1; + } else { + $me->{ISCOMPRESSED} = 0; + } + if (0) { + } elsif ($file =~ /\.(?:bz2|tbz)$/i) { + unless ($me->{UNGZIPPRG} = $CPAN::Config->{bzip2}) { + my $bzip2 = _my_which("bzip2"); + if ($bzip2) { + $me->{UNGZIPPRG} = $bzip2; + } else { + $CPAN::Frontend->mydie(qq{ +CPAN.pm needs the external program bzip2 in order to handle '$file'. +Please install it now and run 'o conf init bzip2' from the +CPAN shell prompt to register it as external program. +}); + } + } + } else { + $me->{UNGZIPPRG} = _my_which("gzip"); + } + $me->{TARPRG} = _my_which("tar") || _my_which("gtar"); + bless $me, $class; +} + +sub _my_which { + my($what) = @_; + if ($CPAN::Config->{$what}) { + return $CPAN::Config->{$what}; + } + if ($CPAN::META->has_inst("File::Which")) { + return File::Which::which($what); + } + my @cand = MM->maybe_command($what); + return $cand[0] if @cand; + require File::Spec; + my $component; + PATH_COMPONENT: foreach $component (File::Spec->path()) { + next unless defined($component) && $component; + my($abs) = File::Spec->catfile($component,$what); + if (MM->maybe_command($abs)) { + return $abs; + } + } + return; +} + +sub gzip { + my($self,$read) = @_; + my $write = $self->{FILE}; + if ($CPAN::META->has_inst("Compress::Zlib")) { + my($buffer,$fhw); + $fhw = FileHandle->new($read) + or $CPAN::Frontend->mydie("Could not open $read: $!"); + my $cwd = `pwd`; + my $gz = Compress::Zlib::gzopen($write, "wb") + or $CPAN::Frontend->mydie("Cannot gzopen $write: $! (pwd is $cwd)\n"); + binmode($fhw); + $gz->gzwrite($buffer) + while read($fhw,$buffer,4096) > 0 ; + $gz->gzclose() ; + $fhw->close; + return 1; + } else { + my $command = CPAN::HandleConfig->safe_quote($self->{UNGZIPPRG}); + system(qq{$command -c "$read" > "$write"})==0; + } +} + + +sub gunzip { + my($self,$write) = @_; + my $read = $self->{FILE}; + if ($CPAN::META->has_inst("Compress::Zlib")) { + my($buffer,$fhw); + $fhw = FileHandle->new(">$write") + or $CPAN::Frontend->mydie("Could not open >$write: $!"); + my $gz = Compress::Zlib::gzopen($read, "rb") + or $CPAN::Frontend->mydie("Cannot gzopen $read: $!\n"); + binmode($fhw); + $fhw->print($buffer) + while $gz->gzread($buffer) > 0 ; + $CPAN::Frontend->mydie("Error reading from $read: $!\n") + if $gz->gzerror != Compress::Zlib::Z_STREAM_END(); + $gz->gzclose() ; + $fhw->close; + return 1; + } else { + my $command = CPAN::HandleConfig->safe_quote($self->{UNGZIPPRG}); + system(qq{$command -d -c "$read" > "$write"})==0; + } +} + + +sub gtest { + my($self) = @_; + return $self->{GTEST} if exists $self->{GTEST}; + defined $self->{FILE} or $CPAN::Frontend->mydie("gtest called but no FILE specified"); + my $read = $self->{FILE}; + my $success; + if ($read=~/\.(?:bz2|tbz)$/ && $CPAN::META->has_inst("Compress::Bzip2")) { + my($buffer,$len); + $len = 0; + my $gz = Compress::Bzip2::bzopen($read, "rb") + or $CPAN::Frontend->mydie(sprintf("Cannot gzopen %s: %s\n", + $read, + $Compress::Bzip2::bzerrno)); + while ($gz->bzread($buffer) > 0 ) { + $len += length($buffer); + $buffer = ""; + } + my $err = $gz->bzerror; + $success = ! $err || $err == Compress::Bzip2::BZ_STREAM_END(); + if ($len == -s $read) { + $success = 0; + CPAN->debug("hit an uncompressed file") if $CPAN::DEBUG; + } + $gz->gzclose(); + CPAN->debug("err[$err]success[$success]") if $CPAN::DEBUG; + } elsif ( $read=~/\.(?:gz|tgz)$/ && $CPAN::META->has_inst("Compress::Zlib") ) { + # After I had reread the documentation in zlib.h, I discovered that + # uncompressed files do not lead to an gzerror (anymore?). + my($buffer,$len); + $len = 0; + my $gz = Compress::Zlib::gzopen($read, "rb") + or $CPAN::Frontend->mydie(sprintf("Cannot gzopen %s: %s\n", + $read, + $Compress::Zlib::gzerrno)); + while ($gz->gzread($buffer) > 0 ) { + $len += length($buffer); + $buffer = ""; + } + my $err = $gz->gzerror; + $success = ! $err || $err == Compress::Zlib::Z_STREAM_END(); + if ($len == -s $read) { + $success = 0; + CPAN->debug("hit an uncompressed file") if $CPAN::DEBUG; + } + $gz->gzclose(); + CPAN->debug("err[$err]success[$success]") if $CPAN::DEBUG; + } elsif (!$self->{ISCOMPRESSED}) { + $success = 0; + } else { + my $command = CPAN::HandleConfig->safe_quote($self->{UNGZIPPRG}); + $success = 0==system(qq{$command -qdt "$read"}); + } + return $self->{GTEST} = $success; +} + + +sub TIEHANDLE { + my($class,$file) = @_; + my $ret; + $class->debug("file[$file]"); + my $self = $class->new($file); + if (0) { + } elsif (!$self->gtest) { + my $fh = FileHandle->new($file) + or $CPAN::Frontend->mydie("Could not open file[$file]: $!"); + binmode $fh; + $self->{FH} = $fh; + $class->debug("via uncompressed FH"); + } elsif ($file =~ /\.(?:bz2|tbz)$/ && $CPAN::META->has_inst("Compress::Bzip2")) { + my $gz = Compress::Bzip2::bzopen($file,"rb") or + $CPAN::Frontend->mydie("Could not bzopen $file"); + $self->{GZ} = $gz; + $class->debug("via Compress::Bzip2"); + } elsif ($file =~/\.(?:gz|tgz)$/ && $CPAN::META->has_inst("Compress::Zlib")) { + my $gz = Compress::Zlib::gzopen($file,"rb") or + $CPAN::Frontend->mydie("Could not gzopen $file"); + $self->{GZ} = $gz; + $class->debug("via Compress::Zlib"); + } else { + my $gzip = CPAN::HandleConfig->safe_quote($self->{UNGZIPPRG}); + my $pipe = "$gzip -d -c $file |"; + my $fh = FileHandle->new($pipe) or $CPAN::Frontend->mydie("Could not pipe[$pipe]: $!"); + binmode $fh; + $self->{FH} = $fh; + $class->debug("via external $gzip"); + } + $self; +} + + +sub READLINE { + my($self) = @_; + if (exists $self->{GZ}) { + my $gz = $self->{GZ}; + my($line,$bytesread); + $bytesread = $gz->gzreadline($line); + return undef if $bytesread <= 0; + return $line; + } else { + my $fh = $self->{FH}; + return scalar <$fh>; + } +} + + +sub READ { + my($self,$ref,$length,$offset) = @_; + $CPAN::Frontend->mydie("read with offset not implemented") if defined $offset; + if (exists $self->{GZ}) { + my $gz = $self->{GZ}; + my $byteread = $gz->gzread($$ref,$length);# 30eaf79e8b446ef52464b5422da328a8 + return $byteread; + } else { + my $fh = $self->{FH}; + return read($fh,$$ref,$length); + } +} + + +sub DESTROY { + my($self) = @_; + if (exists $self->{GZ}) { + my $gz = $self->{GZ}; + $gz->gzclose() if defined $gz; # hard to say if it is allowed + # to be undef ever. AK, 2000-09 + } else { + my $fh = $self->{FH}; + $fh->close if defined $fh; + } + undef $self; +} + +sub untar { + my($self) = @_; + my $file = $self->{FILE}; + my($prefer) = 0; + + my $exttar = $self->{TARPRG} || ""; + $exttar = "" if $exttar =~ /^\s+$/; # user refuses to use it + my $extgzip = $self->{UNGZIPPRG} || ""; + $extgzip = "" if $extgzip =~ /^\s+$/; # user refuses to use it + + if (0) { # makes changing order easier + } elsif ($BUGHUNTING) { + $prefer=2; + } elsif ($CPAN::Config->{prefer_external_tar}) { + $prefer = 1; + } elsif ( + $CPAN::META->has_usable("Archive::Tar") + && + $CPAN::META->has_inst("Compress::Zlib") ) { + my $prefer_external_tar = $CPAN::Config->{prefer_external_tar}; + unless (defined $prefer_external_tar) { + if ($^O =~ /(MSWin32|solaris)/) { + $prefer_external_tar = 0; + } else { + $prefer_external_tar = 1; + } + } + $prefer = $prefer_external_tar ? 1 : 2; + } elsif ($exttar && $extgzip) { + # no modules and not bz2 + $prefer = 1; + # but solaris binary tar is a problem + if ($^O eq 'solaris' && qx($exttar --version 2>/dev/null) !~ /gnu/i) { + $CPAN::Frontend->mywarn(<< 'END_WARN'); + +WARNING: Many CPAN distributions were archived with GNU tar and some of +them may be incompatible with Solaris tar. We respectfully suggest you +configure CPAN to use a GNU tar instead ("o conf init tar") or install +a recent Archive::Tar instead; + +END_WARN + } + } else { + my $foundtar = $exttar ? "'$exttar'" : "nothing"; + my $foundzip = $extgzip ? "'$extgzip'" : $foundtar ? "nothing" : "also nothing"; + my $foundAT; + if ($CPAN::META->has_usable("Archive::Tar")) { + $foundAT = sprintf "'%s'", "Archive::Tar::"->VERSION; + } else { + $foundAT = "nothing"; + } + my $foundCZ; + if ($CPAN::META->has_inst("Compress::Zlib")) { + $foundCZ = sprintf "'%s'", "Compress::Zlib::"->VERSION; + } elsif ($foundAT) { + $foundCZ = "nothing"; + } else { + $foundCZ = "also nothing"; + } + $CPAN::Frontend->mydie(qq{ + +CPAN.pm needs either the external programs tar and gzip -or- both +modules Archive::Tar and Compress::Zlib installed. + +For tar I found $foundtar, for gzip $foundzip. + +For Archive::Tar I found $foundAT, for Compress::Zlib $foundCZ; + +Can't continue cutting file '$file'. +}); + } + my $tar_verb = "v"; + if (defined $CPAN::Config->{tar_verbosity}) { + $tar_verb = $CPAN::Config->{tar_verbosity} eq "none" ? "" : + $CPAN::Config->{tar_verbosity}; + } + if ($prefer==1) { # 1 => external gzip+tar + my($system); + my $is_compressed = $self->gtest(); + my $tarcommand = CPAN::HandleConfig->safe_quote($exttar); + if ($is_compressed) { + my $command = CPAN::HandleConfig->safe_quote($extgzip); + $system = qq{$command -d -c }. + qq{< "$file" | $tarcommand x${tar_verb}f -}; + } else { + $system = qq{$tarcommand x${tar_verb}f "$file"}; + } + if (system($system) != 0) { + # people find the most curious tar binaries that cannot handle + # pipes + if ($is_compressed) { + (my $ungzf = $file) =~ s/\.gz(?!\n)\Z//; + $ungzf = basename $ungzf; + my $ct = CPAN::Tarzip->new($file); + if ($ct->gunzip($ungzf)) { + $CPAN::Frontend->myprint(qq{Uncompressed $file successfully\n}); + } else { + $CPAN::Frontend->mydie(qq{Couldn\'t uncompress $file\n}); + } + $file = $ungzf; + } + $system = qq{$tarcommand x${tar_verb}f "$file"}; + $CPAN::Frontend->myprint(qq{Using Tar:$system:\n}); + my $ret = system($system); + if ($ret==0) { + $CPAN::Frontend->myprint(qq{Untarred $file successfully\n}); + } else { + if ($? == -1) { + $CPAN::Frontend->mydie(sprintf qq{Couldn\'t untar %s: '%s'\n}, + $file, $!); + } elsif ($? & 127) { + $CPAN::Frontend->mydie(sprintf qq{Couldn\'t untar %s: child died with signal %d, %s coredump\n}, + $file, ($? & 127), ($? & 128) ? 'with' : 'without'); + } else { + $CPAN::Frontend->mydie(sprintf qq{Couldn\'t untar %s: child exited with value %d\n}, + $file, $? >> 8); + } + } + return 1; + } else { + return 1; + } + } elsif ($prefer==2) { # 2 => modules + unless ($CPAN::META->has_usable("Archive::Tar")) { + $CPAN::Frontend->mydie("Archive::Tar not installed, please install it to continue"); + } + # Make sure AT does not use uid/gid/permissions in the archive + # This leaves it to the user's umask instead + local $Archive::Tar::CHMOD = 1; + local $Archive::Tar::SAME_PERMISSIONS = 0; + # Make sure AT leaves current user as owner + local $Archive::Tar::CHOWN = 0; + my $tar = Archive::Tar->new($file,1); + my $af; # archive file + my @af; + if ($BUGHUNTING) { + # RCS 1.337 had this code, it turned out unacceptable slow but + # it revealed a bug in Archive::Tar. Code is only here to hunt + # the bug again. It should never be enabled in published code. + # GDGraph3d-0.53 was an interesting case according to Larry + # Virden. + warn(">>>Bughunting code enabled<<< " x 20); + for $af ($tar->list_files) { + if ($af =~ m!^(/|\.\./)!) { + $CPAN::Frontend->mydie("ALERT: Archive contains ". + "illegal member [$af]"); + } + $CPAN::Frontend->myprint("$af\n"); + $tar->extract($af); # slow but effective for finding the bug + return if $CPAN::Signal; + } + } else { + for $af ($tar->list_files) { + if ($af =~ m!^(/|\.\./)!) { + $CPAN::Frontend->mydie("ALERT: Archive contains ". + "illegal member [$af]"); + } + if ($tar_verb eq "v" || $tar_verb eq "vv") { + $CPAN::Frontend->myprint("$af\n"); + } + push @af, $af; + return if $CPAN::Signal; + } + $tar->extract(@af) or + $CPAN::Frontend->mydie("Could not untar with Archive::Tar."); + } + + Mac::BuildTools::convert_files([$tar->list_files], 1) + if ($^O eq 'MacOS'); + + return 1; + } +} + +sub unzip { + my($self) = @_; + my $file = $self->{FILE}; + if ($CPAN::META->has_inst("Archive::Zip")) { + # blueprint of the code from Archive::Zip::Tree::extractTree(); + my $zip = Archive::Zip->new(); + my $status; + $status = $zip->read($file); + $CPAN::Frontend->mydie("Read of file[$file] failed\n") + if $status != Archive::Zip::AZ_OK(); + $CPAN::META->debug("Successfully read file[$file]") if $CPAN::DEBUG; + my @members = $zip->members(); + for my $member ( @members ) { + my $af = $member->fileName(); + if ($af =~ m!^(/|\.\./)!) { + $CPAN::Frontend->mydie("ALERT: Archive contains ". + "illegal member [$af]"); + } + $status = $member->extractToFileNamed( $af ); + $CPAN::META->debug("af[$af]status[$status]") if $CPAN::DEBUG; + $CPAN::Frontend->mydie("Extracting of file[$af] from zipfile[$file] failed\n") if + $status != Archive::Zip::AZ_OK(); + return if $CPAN::Signal; + } + return 1; + } elsif ( my $unzip = $CPAN::Config->{unzip} ) { + my @system = ($unzip, $file); + return system(@system) == 0; + } + else { + $CPAN::Frontend->mydie(<<"END"); + +Can't unzip '$file': + +You have not configured an 'unzip' program and do not have Archive::Zip +installed. Please either install Archive::Zip or else configure 'unzip' +by running the command 'o conf init unzip' from the CPAN shell prompt. + +END + } +} + +1; + +__END__ + +package CPAN::Plugin; + +use strict; +use warnings; + +our $VERSION = '0.96'; + +require CPAN; + +###################################################################### + +sub new { # ; + my ($class, %params) = @_; + + my $self = +{ + (ref $class ? (%$class) : ()), + %params, + }; + + $self = bless $self, ref $class ? ref $class : $class; + + unless (ref $class) { + local $_; + no warnings 'once'; + $CPAN::META->use_inst ($_) for $self->plugin_requires; + } + + $self; +} + +###################################################################### +sub plugin_requires { # ; +} + +###################################################################### +sub distribution_object { # ; + my ($self) = @_; + $self->{distribution_object}; +} + +###################################################################### +sub distribution { # ; + my ($self) = @_; + + my $distribution = $self->distribution_object->id; + CPAN::Shell->expand("Distribution",$distribution) + or $self->frontend->mydie("Unknowns distribution '$distribution'\n"); +} + +###################################################################### +sub distribution_info { # ; + my ($self) = @_; + + CPAN::DistnameInfo->new ($self->distribution->id); +} + +###################################################################### +sub build_dir { # ; + my ($self) = @_; + + my $build_dir = $self->distribution->{build_dir} + or $self->frontend->mydie("Distribution has not been built yet, cannot proceed"); +} + +###################################################################### +sub is_xs { # + my ($self) = @_; + + my @xs = glob File::Spec->catfile ($self->build_dir, '*.xs'); # quick try + + unless (@xs) { + require ExtUtils::Manifest; + my $manifest_file = File::Spec->catfile ($self->build_dir, "MANIFEST"); + my $manifest = ExtUtils::Manifest::maniread($manifest_file); + @xs = grep /\.xs$/, keys %$manifest; + } + + scalar @xs; +} + +###################################################################### + +package CPAN::Plugin; + +1; + +__END__ + + +package CPAN::FTP::netrc; +use strict; + +$CPAN::FTP::netrc::VERSION = $CPAN::FTP::netrc::VERSION = "1.01"; + +# package CPAN::FTP::netrc; +sub new { + my($class) = @_; + my $file = File::Spec->catfile($ENV{HOME},".netrc"); + + my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, + $atime,$mtime,$ctime,$blksize,$blocks) + = stat($file); + $mode ||= 0; + my $protected = 0; + + my($fh,@machines,$hasdefault); + $hasdefault = 0; + $fh = FileHandle->new or die "Could not create a filehandle"; + + if($fh->open($file)) { + $protected = ($mode & 077) == 0; + local($/) = ""; + NETRC: while (<$fh>) { + my(@tokens) = split " ", $_; + TOKEN: while (@tokens) { + my($t) = shift @tokens; + if ($t eq "default") { + $hasdefault++; + last NETRC; + } + last TOKEN if $t eq "macdef"; + if ($t eq "machine") { + push @machines, shift @tokens; + } + } + } + } else { + $file = $hasdefault = $protected = ""; + } + + bless { + 'mach' => [@machines], + 'netrc' => $file, + 'hasdefault' => $hasdefault, + 'protected' => $protected, + }, $class; +} + +# CPAN::FTP::netrc::hasdefault; +sub hasdefault { shift->{'hasdefault'} } +sub netrc { shift->{'netrc'} } +sub protected { shift->{'protected'} } +sub contains { + my($self,$mach) = @_; + for ( @{$self->{'mach'}} ) { + return 1 if $_ eq $mach; + } + return 0; +} + +1; +--- +type: map +mapping: + comment: + type: text + depends: + type: map + mapping: + configure_requires: + &requires_common + type: map + mapping: + =: + type: text + build_requires: *requires_common + requires: *requires_common + match: + type: map + mapping: + distribution: + type: text + module: + type: text + perl: + type: text + perlconfig: + &matchhash_common + type: map + mapping: + =: + type: text + env: *matchhash_common + install: + &args_env_expect + type: map + mapping: + args: + type: seq + sequence: + - type: text + commandline: + type: text + env: + type: map + mapping: + =: + type: text + expect: + type: seq + sequence: + - type: text + eexpect: + type: map + mapping: + mode: + type: text + enum: + - deterministic + - anyorder + timeout: + type: number + reuse: + type: int + talk: + type: seq + sequence: + - type: text + make: *args_env_expect + pl: *args_env_expect + test: *args_env_expect + patches: + type: seq + sequence: + - type: text + disabled: + type: int + enum: + - 0 + - 1 + goto: + type: text + cpanconfig: + type: map + mapping: + =: + type: text + features: + type: seq + sequence: + - type: text + reminder: + type: text +$VAR1 = { + "mapping" => { + "comment" => { + "type" => "text" + }, + "cpanconfig" => { + "mapping" => { + "=" => { + "type" => "text" + } + }, + "type" => "map" + }, + "depends" => { + "mapping" => { + "build_requires" => { + "mapping" => { + "=" => { + "type" => "text" + } + }, + "type" => "map" + }, + "configure_requires" => {}, + "requires" => {} + }, + "type" => "map" + }, + "disabled" => { + "enum" => [ + 0, + 1 + ], + "type" => "int" + }, + "features" => { + "sequence" => [ + { + "type" => "text" + } + ], + "type" => "seq" + }, + "goto" => { + "type" => "text" + }, + "install" => { + "mapping" => { + "args" => { + "sequence" => [ + { + "type" => "text" + } + ], + "type" => "seq" + }, + "commandline" => { + "type" => "text" + }, + "eexpect" => { + "mapping" => { + "mode" => { + "enum" => [ + "deterministic", + "anyorder" + ], + "type" => "text" + }, + "reuse" => { + "type" => "int" + }, + "talk" => { + "sequence" => [ + { + "type" => "text" + } + ], + "type" => "seq" + }, + "timeout" => { + "type" => "number" + } + }, + "type" => "map" + }, + "env" => { + "mapping" => { + "=" => { + "type" => "text" + } + }, + "type" => "map" + }, + "expect" => { + "sequence" => [ + { + "type" => "text" + } + ], + "type" => "seq" + } + }, + "type" => "map" + }, + "make" => {}, + "match" => { + "mapping" => { + "distribution" => { + "type" => "text" + }, + "env" => { + "mapping" => { + "=" => { + "type" => "text" + } + }, + "type" => "map" + }, + "module" => { + "type" => "text" + }, + "perl" => { + "type" => "text" + }, + "perlconfig" => {} + }, + "type" => "map" + }, + "patches" => { + "sequence" => [ + { + "type" => "text" + } + ], + "type" => "seq" + }, + "pl" => {}, + "reminder" => { + "type" => "text" + }, + "test" => {} + }, + "type" => "map" +}; +$VAR1->{"mapping"}{"depends"}{"mapping"}{"configure_requires"} = $VAR1->{"mapping"}{"depends"}{"mapping"}{"build_requires"}; +$VAR1->{"mapping"}{"depends"}{"mapping"}{"requires"} = $VAR1->{"mapping"}{"depends"}{"mapping"}{"build_requires"}; +$VAR1->{"mapping"}{"make"} = $VAR1->{"mapping"}{"install"}; +$VAR1->{"mapping"}{"match"}{"mapping"}{"perlconfig"} = $VAR1->{"mapping"}{"match"}{"mapping"}{"env"}; +$VAR1->{"mapping"}{"pl"} = $VAR1->{"mapping"}{"install"}; +$VAR1->{"mapping"}{"test"} = $VAR1->{"mapping"}{"install"}; + +package CPAN::Plugin::Specfile; + +our $VERSION = '0.01'; + +use File::Path; +use File::Spec; + +sub __accessor { + my ($class, $key) = @_; + no strict 'refs'; + *{$class . '::' . $key} = sub { + my $self = shift; + if (@_) { + $self->{$key} = shift; + } + return $self->{$key}; + }; +} +BEGIN { __PACKAGE__->__accessor($_) for qw(dir dir_default) } + +sub new { + my($class, @rest) = @_; + my $self = bless {}, $class; + while (my($arg,$val) = splice @rest, 0, 2) { + $self->$arg($val); + } + $self->dir_default(File::Spec->catdir($CPAN::Config->{cpan_home},"plugins",__PACKAGE__)); + $self; +} + +sub post_test { + my $self = shift; + my $distribution_object = shift; + my $distribution = $distribution_object->pretty_id; + unless ($CPAN::META->has_inst("CPAN::DistnameInfo")){ + $CPAN::Frontend->mydie("CPAN::DistnameInfo not installed; cannot continue"); + } + my $d = CPAN::Shell->expand("Distribution",$distribution) + or $CPAN::Frontend->mydie("Unknowns distribution '$distribution'\n"); + my $build_dir = $d->{build_dir} or $CPAN::Frontend->mydie("Distribution has not been built yet, cannot proceed"); + my %contains = map {($_ => undef)} $d->containsmods; + my @m; + my $width = 16; + my $header = sub { + my($header,$value) = @_; + push @m, sprintf("%-s:%*s%s\n", $header, $width-length($header), "", $value); + }; + my $dni = CPAN::DistnameInfo->new($distribution); + my $dist = $dni->dist; + my $summary = CPAN::Shell->_guess_manpage($d,\%contains,$dist); + $header->("Name", "perl-$dist"); + my $version = $dni->version; + $header->("Version", $version); + $header->("Release", "1%{?dist}"); +#Summary: Template processing system +#Group: Development/Libraries +#License: GPL+ or Artistic +#URL: http://www.template-toolkit.org/ +#Source0: http://search.cpan.org/CPAN/authors/id/A/AB/ABW/Template-Toolkit-%{version}.tar.gz +#Patch0: Template-2.22-SREZIC-01.patch +#BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + for my $h_tuple + ([Summary => $summary], + [Group => "Development/Libraries"], + [License =>], + [URL =>], + [BuildRoot => "%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)"], + [Requires => "perl(:MODULE_COMPAT_%(eval \"`%{__perl} -V:version`\"; echo \$version))"], + ) { + my($h,$v) = @$h_tuple; + $v = "unknown" unless defined $v; + $header->($h, $v); + } + $header->("Source0", sprintf( + "http://search.cpan.org/CPAN/authors/id/%s/%s/%s", + substr($distribution,0,1), + substr($distribution,0,2), + $distribution + )); + require POSIX; + my @xs = glob "$build_dir/*.xs"; # quick try + unless (@xs) { + require ExtUtils::Manifest; + my $manifest_file = "$build_dir/MANIFEST"; + my $manifest = ExtUtils::Manifest::maniread($manifest_file); + @xs = grep /\.xs$/, keys %$manifest; + } + if (! @xs) { + $header->('BuildArch', 'noarch'); + } + for my $k (sort keys %contains) { + my $m = CPAN::Shell->expand("Module",$k); + my $v = $contains{$k} = $m->cpan_version; + my $vspec = $v eq "undef" ? "" : " = $v"; + $header->("Provides", "perl($k)$vspec"); + } + if (my $prereq_pm = $d->{prereq_pm}) { + my %req; + for my $reqkey (keys %$prereq_pm) { + while (my($k,$v) = each %{$prereq_pm->{$reqkey}}) { + $req{$k} = $v; + } + } + if (-e "$build_dir/Build.PL" && ! exists $req{"Module::Build"}) { + $req{"Module::Build"} = 0; + } + for my $k (sort keys %req) { + next if $k eq "perl"; + my $v = $req{$k}; + my $vspec = defined $v && length $v && $v > 0 ? " >= $v" : ""; + $header->(BuildRequires => "perl($k)$vspec"); + next if $k =~ /^(Module::Build)$/; # MB is always only a + # BuildRequires; if we + # turn it into a + # Requires, then we + # would have to make it + # a BuildRequires + # everywhere we depend + # on *one* MB built + # module. + $header->(Requires => "perl($k)$vspec"); + } + } + push @m, "\n%define _use_internal_dependency_generator 0 +%define __find_requires %{nil} +%define __find_provides %{nil} +"; + push @m, "\n%description\n%{summary}.\n"; + push @m, "\n%prep\n%setup -q -n $dist-%{version}\n"; + if (-e "$build_dir/Build.PL") { + # see http://www.redhat.com/archives/rpm-list/2002-July/msg00110.html about RPM_BUILD_ROOT vs %{buildroot} + push @m, <<'EOF'; + +%build +%{__perl} Build.PL --installdirs=vendor --libdoc installvendorman3dir +./Build + +%install +rm -rf $RPM_BUILD_ROOT +./Build install destdir=$RPM_BUILD_ROOT create_packlist=0 +find $RPM_BUILD_ROOT -depth -type d -exec rmdir {} 2>/dev/null \; +%{_fixperms} $RPM_BUILD_ROOT/* + +%check +./Build test +EOF + } elsif (-e "$build_dir/Makefile.PL") { + push @m, <<'EOF'; + +%build +%{__perl} Makefile.PL INSTALLDIRS=vendor +make %{?_smp_mflags} + +%install +rm -rf $RPM_BUILD_ROOT +make pure_install DESTDIR=$RPM_BUILD_ROOT +find $RPM_BUILD_ROOT -type f -name .packlist -exec rm -f {} ';' +find $RPM_BUILD_ROOT -depth -type d -exec rmdir {} 2>/dev/null ';' +%{_fixperms} $RPM_BUILD_ROOT/* + +%check +make test +EOF + } else { + $CPAN::Frontend->mydie("'$distribution' has neither a Build.PL nor a Makefile.PL\n"); + } + push @m, "\n%clean\nrm -rf \$RPM_BUILD_ROOT\n"; + my $vendorlib = @xs ? "vendorarch" : "vendorlib"; + my $date = POSIX::strftime("%a %b %d %Y", gmtime); + my @doc = grep { -e "$build_dir/$_" } qw(README Changes); + my $exe_stanza = "\n"; + if (my $exe_files = $d->_exe_files) { + if (@$exe_files) { + $exe_stanza = "%{_mandir}/man1/*.1*\n"; + for my $e (@$exe_files) { + unless (CPAN->has_inst("File::Basename")) { + $CPAN::Frontend->mydie("File::Basename not installed, cannot continue"); + } + my $basename = File::Basename::basename($e); + $exe_stanza .= "/usr/bin/$basename\n"; + } + } + } + push @m, <<EOF; + +%files +%defattr(-,root,root,-) +%doc @doc +%{perl_$vendorlib}/* +%{_mandir}/man3/*.3* +$exe_stanza +%changelog +* $date <specfile\@specfile.cpan.org> - $version-1 +- autogenerated by CPAN::Plugin::Specfile() + +EOF + + my $ret = join "", @m; + $CPAN::Frontend->myprint($ret); + my $target_dir = $self->dir || $self->dir_default; + File::Path::mkpath($target_dir); + my $outfile = File::Spec->catfile($target_dir, "perl-$dist.spec"); + open my $specout, ">", $outfile + or $CPAN::Frontend->mydie("Could not open >$outfile: $!"); + print $specout $ret; + $CPAN::Frontend->myprint("Wrote $outfile"); + $ret; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::HTTP::Credentials; +use strict; +use vars qw($USER $PASSWORD $PROXY_USER $PROXY_PASSWORD); + +$CPAN::HTTP::Credentials::VERSION = $CPAN::HTTP::Credentials::VERSION = "1.9601"; + +sub clear_credentials { + clear_non_proxy_credentials(); + clear_proxy_credentials(); +} + +sub clear_non_proxy_credentials { + undef $USER; + undef $PASSWORD; +} + +sub clear_proxy_credentials { + undef $PROXY_USER; + undef $PROXY_PASSWORD; +} + +sub get_proxy_credentials { + my $self = shift; + if ($PROXY_USER && $PROXY_PASSWORD) { + return ($PROXY_USER, $PROXY_PASSWORD); + } + if ( defined $CPAN::Config->{proxy_user} + && $CPAN::Config->{proxy_user} + ) { + $PROXY_USER = $CPAN::Config->{proxy_user}; + $PROXY_PASSWORD = $CPAN::Config->{proxy_pass} || ""; + return ($PROXY_USER, $PROXY_PASSWORD); + } + my $username_prompt = "\nProxy authentication needed! + (Note: to permanently configure username and password run + o conf proxy_user your_username + o conf proxy_pass your_password + )\nUsername:"; + ($PROXY_USER, $PROXY_PASSWORD) = + _get_username_and_password_from_user($username_prompt); + return ($PROXY_USER,$PROXY_PASSWORD); +} + +sub get_non_proxy_credentials { + my $self = shift; + if ($USER && $PASSWORD) { + return ($USER, $PASSWORD); + } + if ( defined $CPAN::Config->{username} ) { + $USER = $CPAN::Config->{username}; + $PASSWORD = $CPAN::Config->{password} || ""; + return ($USER, $PASSWORD); + } + my $username_prompt = "\nAuthentication needed! + (Note: to permanently configure username and password run + o conf username your_username + o conf password your_password + )\nUsername:"; + + ($USER, $PASSWORD) = + _get_username_and_password_from_user($username_prompt); + return ($USER,$PASSWORD); +} + +sub _get_username_and_password_from_user { + my $username_message = shift; + my ($username,$password); + + ExtUtils::MakeMaker->import(qw(prompt)); + $username = prompt($username_message); + if ($CPAN::META->has_inst("Term::ReadKey")) { + Term::ReadKey::ReadMode("noecho"); + } + else { + $CPAN::Frontend->mywarn( + "Warning: Term::ReadKey seems not to be available, your password will be echoed to the terminal!\n" + ); + } + $password = prompt("Password:"); + + if ($CPAN::META->has_inst("Term::ReadKey")) { + Term::ReadKey::ReadMode("restore"); + } + $CPAN::Frontend->myprint("\n\n"); + return ($username,$password); +} + +1; + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::HTTP::Client; +use strict; +use vars qw(@ISA); +use CPAN::HTTP::Credentials; +use HTTP::Tiny 0.005; + +$CPAN::HTTP::Client::VERSION = $CPAN::HTTP::Client::VERSION = "1.9601"; + +# CPAN::HTTP::Client is adapted from parts of cpanm by Tatsuhiko Miyagawa +# and parts of LWP by Gisle Aas + +sub new { + my $class = shift; + my %args = @_; + for my $k ( keys %args ) { + $args{$k} = '' unless defined $args{$k}; + } + $args{no_proxy} = [split(",", $args{no_proxy}) ] if $args{no_proxy}; + return bless \%args, $class; +} + +# This executes a request with redirection (up to 5) and returns the +# response structure generated by HTTP::Tiny +# +# If authentication fails, it will attempt to get new authentication +# information and repeat up to 5 times + +sub mirror { + my($self, $uri, $path) = @_; + + my $want_proxy = $self->_want_proxy($uri); + my $http = HTTP::Tiny->new( + $want_proxy ? (proxy => $self->{proxy}) : () + ); + + my ($response, %headers); + my $retries = 0; + while ( $retries++ < 5 ) { + $response = $http->mirror( $uri, $path, {headers => \%headers} ); + if ( $response->{status} eq '401' ) { + last unless $self->_get_auth_params( $response, 'non_proxy' ); + } + elsif ( $response->{status} eq '407' ) { + last unless $self->_get_auth_params( $response, 'proxy' ); + } + else { + last; # either success or failure + } + my %headers = ( + $self->_auth_headers( $uri, 'non_proxy' ), + ( $want_proxy ? $self->_auth_headers($uri, 'proxy') : () ), + ); + } + + return $response; +} + +sub _want_proxy { + my ($self, $uri) = @_; + return unless $self->{proxy}; + my($host) = $uri =~ m|://([^/:]+)|; + return ! grep { $host =~ /\Q$_\E$/ } @{ $self->{no_proxy} || [] }; +} + +# Generates the authentication headers for a given mode +# C<mode> is 'proxy' or 'non_proxy' +# C<_${mode}_type> is 'basic' or 'digest' +# C<_${mode}_params> will be the challenge parameters from the 401/407 headers +sub _auth_headers { + my ($self, $uri, $mode) = @_; + # Get names for our mode-specific attributes + my ($type_key, $param_key) = map {"_" . $mode . $_} qw/_type _params/; + + # If _prepare_auth has not been called, we can't prepare headers + return unless $self->{$type_key}; + + # Get user credentials for mode + my $cred_method = "get_" . ($mode ? "proxy" : "non_proxy") ."_credentials"; + my ($user, $pass) = CPAN::HTTP::Credentials->$cred_method; + + # Generate the header for the mode & type + my $header = $mode eq 'proxy' ? 'Proxy-Authorization' : 'Authorization'; + my $value_method = "_" . $self->{$type_key} . "_auth"; + my $value = $self->$value_method($user, $pass, $self->{$param_key}, $uri); + + # If we didn't get a value, we didn't have the right modules available + return $value ? ( $header, $value ) : (); +} + +# Extract authentication parameters from headers, but clear any prior +# credentials if we failed (so we might prompt user for password again) +sub _get_auth_params { + my ($self, $response, $mode) = @_; + my $prefix = $mode eq 'proxy' ? 'Proxy' : 'WWW'; + my ($type_key, $param_key) = map {"_" . $mode . $_} qw/_type _params/; + if ( ! $response->{success} ) { # auth failed + my $method = "clear_${mode}_credentials"; + CPAN::HTTP::Credentials->$method; + delete $self->{$_} for $type_key, $param_key; + } + ($self->{$type_key}, $self->{$param_key}) = + $self->_get_challenge( $response, "${prefix}-Authenticate"); + return $self->{$type_key}; +} + +# Extract challenge type and parameters for a challenge list +sub _get_challenge { + my ($self, $response, $auth_header) = @_; + + my $auth_list = $response->{headers}(lc $auth_header); + return unless defined $auth_list; + $auth_list = [$auth_list] unless ref $auth_list; + + for my $challenge (@$auth_list) { + $challenge =~ tr/,/;/; # "," is used to separate auth-params!! + ($challenge) = $self->split_header_words($challenge); + my $scheme = shift(@$challenge); + shift(@$challenge); # no value + $challenge = { @$challenge }; # make rest into a hash + + unless ($scheme =~ /^(basic|digest)$/) { + next; # bad scheme + } + $scheme = $1; # untainted now + + return ($scheme, $challenge); + } + return; +} + +# Generate a basic authentication header value +sub _basic_auth { + my ($self, $user, $pass) = @_; + unless ( $CPAN::META->has_usable('MIME::Base64') ) { + $CPAN::Frontend->mywarn( + "MIME::Base64 is required for 'Basic' style authentication" + ); + return; + } + return "Basic " . MIME::Base64::encode_base64("$user\:$pass", q{}); +} + +# Generate a digest authentication header value +sub _digest_auth { + my ($self, $user, $pass, $auth_param, $uri) = @_; + unless ( $CPAN::META->has_usable('Digest::MD5') ) { + $CPAN::Frontend->mywarn( + "Digest::MD5 is required for 'Digest' style authentication" + ); + return; + } + + my $nc = sprintf "%08X", ++$self->{_nonce_count}{$auth_param->{nonce}}; + my $cnonce = sprintf "%8x", time; + + my ($path) = $uri =~ m{^\w+?://[^/]+(/.*)$}; + $path = "/" unless defined $path; + + my $md5 = Digest::MD5->new; + + my(@digest); + $md5->add(join(":", $user, $auth_param->{realm}, $pass)); + push(@digest, $md5->hexdigest); + $md5->reset; + + push(@digest, $auth_param->{nonce}); + + if ($auth_param->{qop}) { + push(@digest, $nc, $cnonce, ($auth_param->{qop} =~ m|^auth[,;]auth-int$|) ? 'auth' : $auth_param->{qop}); + } + + $md5->add(join(":", 'GET', $path)); + push(@digest, $md5->hexdigest); + $md5->reset; + + $md5->add(join(":", @digest)); + my($digest) = $md5->hexdigest; + $md5->reset; + + my %resp = map { $_ => $auth_param->{$_} } qw(realm nonce opaque); + @resp{qw(username uri response algorithm)} = ($user, $path, $digest, "MD5"); + + if (($auth_param->{qop} || "") =~ m|^auth([,;]auth-int)?$|) { + @resp{qw(qop cnonce nc)} = ("auth", $cnonce, $nc); + } + + my(@order) = + qw(username realm qop algorithm uri nonce nc cnonce response opaque); + my @pairs; + for (@order) { + next unless defined $resp{$_}; + push(@pairs, "$_=" . qq("$resp{$_}")); + } + + my $auth_value = "Digest " . join(", ", @pairs); + return $auth_value; +} + +# split_header_words adapted from HTTP::Headers::Util +sub split_header_words { + my ($self, @words) = @_; + my @res = $self->_split_header_words(@words); + for my $arr (@res) { + for (my $i = @$arr - 2; $i >= 0; $i -= 2) { + $arr->[$i] = lc($arr->[$i]); + } + } + return @res; +} + +sub _split_header_words { + my($self, @val) = @_; + my @res; + for (@val) { + my @cur; + while (length) { + if (s/^\s*(=*[^\s=;,]+)//) { # 'token' or parameter 'attribute' + push(@cur, $1); + # a quoted value + if (s/^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"//) { + my $val = $1; + $val =~ s/\\(.)/$1/g; + push(@cur, $val); + # some unquoted value + } + elsif (s/^\s*=\s*([^;,\s]*)//) { + my $val = $1; + $val =~ s/\s+$//; + push(@cur, $val); + # no value, a lone token + } + else { + push(@cur, undef); + } + } + elsif (s/^\s*,//) { + push(@res, [@cur]) if @cur; + @cur = (); + } + elsif (s/^\s*;// || s/^\s+//) { + # continue + } + else { + die "This should not happen: '$_'"; + } + } + push(@res, \@cur) if @cur; + } + @res; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Exception::yaml_not_installed; +use strict; +use overload '""' => "as_string"; + +use vars qw( + $VERSION +); +$VERSION = "5.5"; + + +sub new { + my($class,$module,$file,$during) = @_; + bless { module => $module, file => $file, during => $during }, $class; +} + +sub as_string { + my($self) = shift; + "'$self->{module}' not installed, cannot $self->{during} '$self->{file}'\n"; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Exception::yaml_process_error; +use strict; +use overload '""' => "as_string"; + +use vars qw( + $VERSION +); +$VERSION = "5.5"; + + +sub new { + my($class,$module,$file,$during,$error) = @_; + # my $at = Carp::longmess(""); # XXX find something more beautiful + bless { module => $module, + file => $file, + during => $during, + error => $error, + # at => $at, + }, $class; +} + +sub as_string { + my($self) = shift; + if ($self->{during}) { + if ($self->{file}) { + if ($self->{module}) { + if ($self->{error}) { + return "Alert: While trying to '$self->{during}' YAML file\n". + " '$self->{file}'\n". + "with '$self->{module}' the following error was encountered:\n". + " $self->{error}\n"; + } else { + return "Alert: While trying to '$self->{during}' YAML file\n". + " '$self->{file}'\n". + "with '$self->{module}' some unknown error was encountered\n"; + } + } else { + return "Alert: While trying to '$self->{during}' YAML file\n". + " '$self->{file}'\n". + "some unknown error was encountered\n"; + } + } else { + return "Alert: While trying to '$self->{during}' some YAML file\n". + "some unknown error was encountered\n"; + } + } else { + return "Alert: unknown error encountered\n"; + } +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Exception::RecursiveDependency; +use strict; +use overload '""' => "as_string"; + +use vars qw( + $VERSION +); +$VERSION = "5.5001"; + +{ + package CPAN::Exception::RecursiveDependency::na; + use overload '""' => "as_string"; + sub new { bless {}, shift }; + sub as_string { "N/A" }; +} + +my $NA = CPAN::Exception::RecursiveDependency::na->new; + +# a module sees its distribution (no version) +# a distribution sees its prereqs (which are module names) (usually with versions) +# a bundle sees its module names and/or its distributions (no version) + +sub new { + my($class) = shift; + my($deps_arg) = shift; + my (@deps,%seen,$loop_starts_with); + DCHAIN: for my $dep (@$deps_arg) { + push @deps, {name => $dep, display_as => $dep}; + if ($seen{$dep}++) { + $loop_starts_with = $dep; + last DCHAIN; + } + } + my $in_loop = 0; + my %mark; + DWALK: for my $i (0..$#deps) { + my $x = $deps[$i]{name}; + $in_loop ||= $loop_starts_with && $x eq $loop_starts_with; + my $xo = CPAN::Shell->expandany($x) or next; + if ($xo->isa("CPAN::Module")) { + my $have = $xo->inst_version || $NA; + my($want,$d,$want_type); + if ($i>0 and $d = $deps[$i-1]{name}) { + my $do = CPAN::Shell->expandany($d); + $want = $do->{prereq_pm}{requires}{$x}; + if (defined $want) { + $want_type = "requires: "; + } else { + $want = $do->{prereq_pm}{build_requires}{$x}; + if (defined $want) { + $want_type = "build_requires: "; + } else { + $want_type = "unknown status"; + $want = "???"; + } + } + } else { + $want = $xo->cpan_version; + $want_type = "want: "; + } + $deps[$i]{have} = $have; + $deps[$i]{want_type} = $want_type; + $deps[$i]{want} = $want; + $deps[$i]{display_as} = "$x (have: $have; $want_type$want)"; + if ((! ref $have || !$have->isa('CPAN::Exception::RecursiveDependency::na')) + && CPAN::Version->vge($have, $want)) { + # https://rt.cpan.org/Ticket/Display.html?id=115340 + undef $loop_starts_with; + last DWALK; + } + } elsif ($xo->isa("CPAN::Distribution")) { + my $pretty = $deps[$i]{display_as} = $xo->pretty_id; + my $mark_as; + if ($in_loop) { + $mark_as = CPAN::Distrostatus->new("NO cannot resolve circular dependency"); + } else { + $mark_as = CPAN::Distrostatus->new("NO one dependency ($loop_starts_with) is a circular dependency"); + } + $mark{$pretty} = { xo => $xo, mark_as => $mark_as }; + } + } + if ($loop_starts_with) { + while (my($k,$v) = each %mark) { + my $xo = $v->{xo}; + $xo->{make} = $v->{mark_as}; + $xo->store_persistent_state; # otherwise I will not reach + # all involved parties for + # the next session + } + } + bless { deps => \@deps, loop_starts_with => $loop_starts_with }, $class; +} + +sub is_resolvable { + ! defined shift->{loop_starts_with}; +} + +sub as_string { + my($self) = shift; + my $deps = $self->{deps}; + my $loop_starts_with = $self->{loop_starts_with}; + unless ($loop_starts_with) { + return "--not a recursive/circular dependency--"; + } + my $ret = "\nRecursive dependency detected:\n "; + $ret .= join("\n => ", map {$_->{display_as}} @$deps); + $ret .= ".\nCannot resolve.\n"; + $ret; +} + +1; +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::Exception::blocked_urllist; +use strict; +use overload '""' => "as_string"; + +use vars qw( + $VERSION +); +$VERSION = "1.001"; + + +sub new { + my($class) = @_; + bless {}, $class; +} + +sub as_string { + my($self) = shift; + if ($CPAN::Config->{connect_to_internet_ok}) { + return qq{ + +You have not configured a urllist for CPAN mirrors. Configure it with + + o conf init urllist + +}; + } else { + return qq{ + +You have not configured a urllist and do not allow connections to the +internet to get a list of mirrors. If you wish to get a list of CPAN +mirrors to pick from, use this command + + o conf init connect_to_internet_ok urllist + +If you do not wish to get a list of mirrors and would prefer to set +your urllist manually, use just this command instead + + o conf init urllist + +}; + } +} + +1; +# vi:tw=72 +use 5.006; +use strict; +use warnings; +package CPAN::Meta::History; + +our $VERSION = '2.150010'; + +1; + +# ABSTRACT: history of CPAN Meta Spec changes + +__END__ + +use 5.006; +use strict; +use warnings; +package CPAN::Meta::Feature; + +our $VERSION = '2.150010'; + +use CPAN::Meta::Prereqs; + +#pod =head1 DESCRIPTION +#pod +#pod A CPAN::Meta::Feature object describes an optional feature offered by a CPAN +#pod distribution and specified in the distribution's F<META.json> (or F<META.yml>) +#pod file. +#pod +#pod For the most part, this class will only be used when operating on the result of +#pod the C<feature> or C<features> methods on a L<CPAN::Meta> object. +#pod +#pod =method new +#pod +#pod my $feature = CPAN::Meta::Feature->new( $identifier => \%spec ); +#pod +#pod This returns a new Feature object. The C<%spec> argument to the constructor +#pod should be the same as the value of the C<optional_feature> entry in the +#pod distmeta. It must contain entries for C<description> and C<prereqs>. +#pod +#pod =cut + +sub new { + my ($class, $identifier, $spec) = @_; + + my %guts = ( + identifier => $identifier, + description => $spec->{description}, + prereqs => CPAN::Meta::Prereqs->new($spec->{prereqs}), + ); + + bless \%guts => $class; +} + +#pod =method identifier +#pod +#pod This method returns the feature's identifier. +#pod +#pod =cut + +sub identifier { $_[0]{identifier} } + +#pod =method description +#pod +#pod This method returns the feature's long description. +#pod +#pod =cut + +sub description { $_[0]{description} } + +#pod =method prereqs +#pod +#pod This method returns the feature's prerequisites as a L<CPAN::Meta::Prereqs> +#pod object. +#pod +#pod =cut + +sub prereqs { $_[0]{prereqs} } + +1; + +# ABSTRACT: an optional feature provided by a CPAN distribution + + +__END__ + + +# vim: ts=2 sts=2 sw=2 et : +use 5.006; +use strict; +use warnings; +package CPAN::Meta::Converter; + +our $VERSION = '2.150010'; + +#pod =head1 SYNOPSIS +#pod +#pod my $struct = decode_json_file('META.json'); +#pod +#pod my $cmc = CPAN::Meta::Converter->new( $struct ); +#pod +#pod my $new_struct = $cmc->convert( version => "2" ); +#pod +#pod =head1 DESCRIPTION +#pod +#pod This module converts CPAN Meta structures from one form to another. The +#pod primary use is to convert older structures to the most modern version of +#pod the specification, but other transformations may be implemented in the +#pod future as needed. (E.g. stripping all custom fields or stripping all +#pod optional fields.) +#pod +#pod =cut + +use CPAN::Meta::Validator; +use CPAN::Meta::Requirements; +use Parse::CPAN::Meta 1.4400 (); + +# To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls +# before 5.10, we fall back to the EUMM bundled compatibility version module if +# that's the only thing available. This shouldn't ever happen in a normal CPAN +# install of CPAN::Meta::Requirements, as version.pm will be picked up from +# prereqs and be available at runtime. + +BEGIN { + eval "use version ()"; ## no critic + if ( my $err = $@ ) { + eval "use ExtUtils::MakeMaker::version" or die $err; ## no critic + } +} + +# Perl 5.10.0 didn't have "is_qv" in version.pm +*_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} }; + +# We limit cloning to a maximum depth to bail out on circular data +# structures. While actual cycle detection might be technically better, +# we expect circularity in META data structures to be rare and generally +# the result of user error. Therefore, a depth counter is lower overhead. +our $DCLONE_MAXDEPTH = 1024; +our $_CLONE_DEPTH; + +sub _dclone { + my ( $ref ) = @_; + return $ref unless my $reftype = ref $ref; + + local $_CLONE_DEPTH = defined $_CLONE_DEPTH ? $_CLONE_DEPTH - 1 : $DCLONE_MAXDEPTH; + die "Depth Limit $DCLONE_MAXDEPTH Exceeded" if $_CLONE_DEPTH == 0; + + return [ map { _dclone( $_ ) } @{$ref} ] if 'ARRAY' eq $reftype; + return { map { $_ => _dclone( $ref->{$_} ) } keys %{$ref} } if 'HASH' eq $reftype; + + if ( 'SCALAR' eq $reftype ) { + my $new = _dclone(${$ref}); + return \$new; + } + + # We can't know if TO_JSON gives us cloned data, so refs must recurse + if ( eval { $ref->can('TO_JSON') } ) { + my $data = $ref->TO_JSON; + return ref $data ? _dclone( $data ) : $data; + } + + # Just stringify everything else + return "$ref"; +} + +my %known_specs = ( + '2' => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec', + '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html', + '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html', + '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html', + '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html', + '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html' +); + +my @spec_list = sort { $a <=> $b } keys %known_specs; +my ($LOWEST, $HIGHEST) = @spec_list[0,-1]; + +#--------------------------------------------------------------------------# +# converters +# +# called as $converter->($element, $field_name, $full_meta, $to_version) +# +# defined return value used for field +# undef return value means field is skipped +#--------------------------------------------------------------------------# + +sub _keep { $_[0] } + +sub _keep_or_one { defined($_[0]) ? $_[0] : 1 } + +sub _keep_or_zero { defined($_[0]) ? $_[0] : 0 } + +sub _keep_or_unknown { defined($_[0]) && length($_[0]) ? $_[0] : "unknown" } + +sub _generated_by { + my $gen = shift; + my $sig = __PACKAGE__ . " version " . (__PACKAGE__->VERSION || "<dev>"); + + return $sig unless defined $gen and length $gen; + return $gen if $gen =~ /\Q$sig/; + return "$gen, $sig"; +} + +sub _listify { ! defined $_[0] ? undef : ref $_[0] eq 'ARRAY' ? $_[0] : [$_[0]] } + +sub _prefix_custom { + my $key = shift; + $key =~ s/^(?!x_) # Unless it already starts with x_ + (?:x-?)? # Remove leading x- or x (if present) + /x_/ix; # and prepend x_ + return $key; +} + +sub _ucfirst_custom { + my $key = shift; + $key = ucfirst $key unless $key =~ /[A-Z]/; + return $key; +} + +sub _no_prefix_ucfirst_custom { + my $key = shift; + $key =~ s/^x_//; + return _ucfirst_custom($key); +} + +sub _change_meta_spec { + my ($element, undef, undef, $version) = @_; + return { + version => $version, + url => $known_specs{$version}, + }; +} + +my @open_source = ( + 'perl', + 'gpl', + 'apache', + 'artistic', + 'artistic_2', + 'lgpl', + 'bsd', + 'gpl', + 'mit', + 'mozilla', + 'open_source', +); + +my %is_open_source = map {; $_ => 1 } @open_source; + +my @valid_licenses_1 = ( + @open_source, + 'unrestricted', + 'restrictive', + 'unknown', +); + +my %license_map_1 = ( + ( map { $_ => $_ } @valid_licenses_1 ), + artistic2 => 'artistic_2', +); + +sub _license_1 { + my ($element) = @_; + return 'unknown' unless defined $element; + if ( $license_map_1{lc $element} ) { + return $license_map_1{lc $element}; + } + else { + return 'unknown'; + } +} + +my @valid_licenses_2 = qw( + agpl_3 + apache_1_1 + apache_2_0 + artistic_1 + artistic_2 + bsd + freebsd + gfdl_1_2 + gfdl_1_3 + gpl_1 + gpl_2 + gpl_3 + lgpl_2_1 + lgpl_3_0 + mit + mozilla_1_0 + mozilla_1_1 + openssl + perl_5 + qpl_1_0 + ssleay + sun + zlib + open_source + restricted + unrestricted + unknown +); + +# The "old" values were defined by Module::Build, and were often vague. I have +# made the decisions below based on reading Module::Build::API and how clearly +# it specifies the version of the license. +my %license_map_2 = ( + (map { $_ => $_ } @valid_licenses_2), + apache => 'apache_2_0', # clearly stated as 2.0 + artistic => 'artistic_1', # clearly stated as 1 + artistic2 => 'artistic_2', # clearly stated as 2 + gpl => 'open_source', # we don't know which GPL; punt + lgpl => 'open_source', # we don't know which LGPL; punt + mozilla => 'open_source', # we don't know which MPL; punt + perl => 'perl_5', # clearly Perl 5 + restrictive => 'restricted', +); + +sub _license_2 { + my ($element) = @_; + return [ 'unknown' ] unless defined $element; + $element = [ $element ] unless ref $element eq 'ARRAY'; + my @new_list; + for my $lic ( @$element ) { + next unless defined $lic; + if ( my $new = $license_map_2{lc $lic} ) { + push @new_list, $new; + } + } + return @new_list ? \@new_list : [ 'unknown' ]; +} + +my %license_downgrade_map = qw( + agpl_3 open_source + apache_1_1 apache + apache_2_0 apache + artistic_1 artistic + artistic_2 artistic_2 + bsd bsd + freebsd open_source + gfdl_1_2 open_source + gfdl_1_3 open_source + gpl_1 gpl + gpl_2 gpl + gpl_3 gpl + lgpl_2_1 lgpl + lgpl_3_0 lgpl + mit mit + mozilla_1_0 mozilla + mozilla_1_1 mozilla + openssl open_source + perl_5 perl + qpl_1_0 open_source + ssleay open_source + sun open_source + zlib open_source + open_source open_source + restricted restrictive + unrestricted unrestricted + unknown unknown +); + +sub _downgrade_license { + my ($element) = @_; + if ( ! defined $element ) { + return "unknown"; + } + elsif( ref $element eq 'ARRAY' ) { + if ( @$element > 1) { + if (grep { !$is_open_source{ $license_downgrade_map{lc $_} || 'unknown' } } @$element) { + return 'unknown'; + } + else { + return 'open_source'; + } + } + elsif ( @$element == 1 ) { + return $license_downgrade_map{lc $element->[0]} || "unknown"; + } + } + elsif ( ! ref $element ) { + return $license_downgrade_map{lc $element} || "unknown"; + } + return "unknown"; +} + +my $no_index_spec_1_2 = { + 'file' => \&_listify, + 'dir' => \&_listify, + 'package' => \&_listify, + 'namespace' => \&_listify, +}; + +my $no_index_spec_1_3 = { + 'file' => \&_listify, + 'directory' => \&_listify, + 'package' => \&_listify, + 'namespace' => \&_listify, +}; + +my $no_index_spec_2 = { + 'file' => \&_listify, + 'directory' => \&_listify, + 'package' => \&_listify, + 'namespace' => \&_listify, + ':custom' => \&_prefix_custom, +}; + +sub _no_index_1_2 { + my (undef, undef, $meta) = @_; + my $no_index = $meta->{no_index} || $meta->{private}; + return unless $no_index; + + # cleanup wrong format + if ( ! ref $no_index ) { + my $item = $no_index; + $no_index = { dir => [ $item ], file => [ $item ] }; + } + elsif ( ref $no_index eq 'ARRAY' ) { + my $list = $no_index; + $no_index = { dir => [ @$list ], file => [ @$list ] }; + } + + # common mistake: files -> file + if ( exists $no_index->{files} ) { + $no_index->{file} = delete $no_index->{files}; + } + # common mistake: modules -> module + if ( exists $no_index->{modules} ) { + $no_index->{module} = delete $no_index->{modules}; + } + return _convert($no_index, $no_index_spec_1_2); +} + +sub _no_index_directory { + my ($element, $key, $meta, $version) = @_; + return unless $element; + + # clean up wrong format + if ( ! ref $element ) { + my $item = $element; + $element = { directory => [ $item ], file => [ $item ] }; + } + elsif ( ref $element eq 'ARRAY' ) { + my $list = $element; + $element = { directory => [ @$list ], file => [ @$list ] }; + } + + if ( exists $element->{dir} ) { + $element->{directory} = delete $element->{dir}; + } + # common mistake: files -> file + if ( exists $element->{files} ) { + $element->{file} = delete $element->{files}; + } + # common mistake: modules -> module + if ( exists $element->{modules} ) { + $element->{module} = delete $element->{modules}; + } + my $spec = $version == 2 ? $no_index_spec_2 : $no_index_spec_1_3; + return _convert($element, $spec); +} + +sub _is_module_name { + my $mod = shift; + return unless defined $mod && length $mod; + return $mod =~ m{^[A-Za-z][A-Za-z0-9_]*(?:::[A-Za-z0-9_]+)*$}; +} + +sub _clean_version { + my ($element) = @_; + return 0 if ! defined $element; + + $element =~ s{^\s*}{}; + $element =~ s{\s*$}{}; + $element =~ s{^\.}{0.}; + + return 0 if ! length $element; + return 0 if ( $element eq 'undef' || $element eq '<undef>' ); + + my $v = eval { version->new($element) }; + # XXX check defined $v and not just $v because version objects leak memory + # in boolean context -- dagolden, 2012-02-03 + if ( defined $v ) { + return _is_qv($v) ? $v->normal : $element; + } + else { + return 0; + } +} + +sub _bad_version_hook { + my ($v) = @_; + $v =~ s{^\s*}{}; + $v =~ s{\s*$}{}; + $v =~ s{[a-z]+$}{}; # strip trailing alphabetics + my $vobj = eval { version->new($v) }; + return defined($vobj) ? $vobj : version->new(0); # or give up +} + +sub _version_map { + my ($element) = @_; + return unless defined $element; + if ( ref $element eq 'HASH' ) { + # XXX turn this into CPAN::Meta::Requirements with bad version hook + # and then turn it back into a hash + my $new_map = CPAN::Meta::Requirements->new( + { bad_version_hook => \&_bad_version_hook } # punt + ); + while ( my ($k,$v) = each %$element ) { + next unless _is_module_name($k); + if ( !defined($v) || !length($v) || $v eq 'undef' || $v eq '<undef>' ) { + $v = 0; + } + # some weird, old META have bad yml with module => module + # so check if value is like a module name and not like a version + if ( _is_module_name($v) && ! version::is_lax($v) ) { + $new_map->add_minimum($k => 0); + $new_map->add_minimum($v => 0); + } + $new_map->add_string_requirement($k => $v); + } + return $new_map->as_string_hash; + } + elsif ( ref $element eq 'ARRAY' ) { + my $hashref = { map { $_ => 0 } @$element }; + return _version_map($hashref); # clean up any weird stuff + } + elsif ( ref $element eq '' && length $element ) { + return { $element => 0 } + } + return; +} + +sub _prereqs_from_1 { + my (undef, undef, $meta) = @_; + my $prereqs = {}; + for my $phase ( qw/build configure/ ) { + my $key = "${phase}_requires"; + $prereqs->{$phase}{requires} = _version_map($meta->{$key}) + if $meta->{$key}; + } + for my $rel ( qw/requires recommends conflicts/ ) { + $prereqs->{runtime}{$rel} = _version_map($meta->{$rel}) + if $meta->{$rel}; + } + return $prereqs; +} + +my $prereqs_spec = { + configure => \&_prereqs_rel, + build => \&_prereqs_rel, + test => \&_prereqs_rel, + runtime => \&_prereqs_rel, + develop => \&_prereqs_rel, + ':custom' => \&_prefix_custom, +}; + +my $relation_spec = { + requires => \&_version_map, + recommends => \&_version_map, + suggests => \&_version_map, + conflicts => \&_version_map, + ':custom' => \&_prefix_custom, +}; + +sub _cleanup_prereqs { + my ($prereqs, $key, $meta, $to_version) = @_; + return unless $prereqs && ref $prereqs eq 'HASH'; + return _convert( $prereqs, $prereqs_spec, $to_version ); +} + +sub _prereqs_rel { + my ($relation, $key, $meta, $to_version) = @_; + return unless $relation && ref $relation eq 'HASH'; + return _convert( $relation, $relation_spec, $to_version ); +} + + +BEGIN { + my @old_prereqs = qw( + requires + configure_requires + recommends + conflicts + ); + + for ( @old_prereqs ) { + my $sub = "_get_$_"; + my ($phase,$type) = split qr/_/, $_; + if ( ! defined $type ) { + $type = $phase; + $phase = 'runtime'; + } + no strict 'refs'; + *{$sub} = sub { _extract_prereqs($_[2]->{prereqs},$phase,$type) }; + } +} + +sub _get_build_requires { + my ($data, $key, $meta) = @_; + + my $test_h = _extract_prereqs($_[2]->{prereqs}, qw(test requires)) || {}; + my $build_h = _extract_prereqs($_[2]->{prereqs}, qw(build requires)) || {}; + + my $test_req = CPAN::Meta::Requirements->from_string_hash($test_h); + my $build_req = CPAN::Meta::Requirements->from_string_hash($build_h); + + $test_req->add_requirements($build_req)->as_string_hash; +} + +sub _extract_prereqs { + my ($prereqs, $phase, $type) = @_; + return unless ref $prereqs eq 'HASH'; + return scalar _version_map($prereqs->{$phase}{$type}); +} + +sub _downgrade_optional_features { + my (undef, undef, $meta) = @_; + return unless exists $meta->{optional_features}; + my $origin = $meta->{optional_features}; + my $features = {}; + for my $name ( keys %$origin ) { + $features->{$name} = { + description => $origin->{$name}{description}, + requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','requires'), + configure_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','configure_requires'), + build_requires => _extract_prereqs($origin->{$name}{prereqs},'runtime','build_requires'), + recommends => _extract_prereqs($origin->{$name}{prereqs},'runtime','recommends'), + conflicts => _extract_prereqs($origin->{$name}{prereqs},'runtime','conflicts'), + }; + for my $k (keys %{$features->{$name}} ) { + delete $features->{$name}{$k} unless defined $features->{$name}{$k}; + } + } + return $features; +} + +sub _upgrade_optional_features { + my (undef, undef, $meta) = @_; + return unless exists $meta->{optional_features}; + my $origin = $meta->{optional_features}; + my $features = {}; + for my $name ( keys %$origin ) { + $features->{$name} = { + description => $origin->{$name}{description}, + prereqs => _prereqs_from_1(undef, undef, $origin->{$name}), + }; + delete $features->{$name}{prereqs}{configure}; + } + return $features; +} + +my $optional_features_2_spec = { + description => \&_keep, + prereqs => \&_cleanup_prereqs, + ':custom' => \&_prefix_custom, +}; + +sub _feature_2 { + my ($element, $key, $meta, $to_version) = @_; + return unless $element && ref $element eq 'HASH'; + _convert( $element, $optional_features_2_spec, $to_version ); +} + +sub _cleanup_optional_features_2 { + my ($element, $key, $meta, $to_version) = @_; + return unless $element && ref $element eq 'HASH'; + my $new_data = {}; + for my $k ( keys %$element ) { + $new_data->{$k} = _feature_2( $element->{$k}, $k, $meta, $to_version ); + } + return unless keys %$new_data; + return $new_data; +} + +sub _optional_features_1_4 { + my ($element) = @_; + return unless $element; + $element = _optional_features_as_map($element); + for my $name ( keys %$element ) { + for my $drop ( qw/requires_packages requires_os excluded_os/ ) { + delete $element->{$name}{$drop}; + } + } + return $element; +} + +sub _optional_features_as_map { + my ($element) = @_; + return unless $element; + if ( ref $element eq 'ARRAY' ) { + my %map; + for my $feature ( @$element ) { + my (@parts) = %$feature; + $map{$parts[0]} = $parts[1]; + } + $element = \%map; + } + return $element; +} + +sub _is_urlish { defined $_[0] && $_[0] =~ m{\A[-+.a-z0-9]+:.+}i } + +sub _url_or_drop { + my ($element) = @_; + return $element if _is_urlish($element); + return; +} + +sub _url_list { + my ($element) = @_; + return unless $element; + $element = _listify( $element ); + $element = [ grep { _is_urlish($_) } @$element ]; + return unless @$element; + return $element; +} + +sub _author_list { + my ($element) = @_; + return [ 'unknown' ] unless $element; + $element = _listify( $element ); + $element = [ map { defined $_ && length $_ ? $_ : 'unknown' } @$element ]; + return [ 'unknown' ] unless @$element; + return $element; +} + +my $resource2_upgrade = { + license => sub { return _is_urlish($_[0]) ? _listify( $_[0] ) : undef }, + homepage => \&_url_or_drop, + bugtracker => sub { + my ($item) = @_; + return unless $item; + if ( $item =~ m{^mailto:(.*)$} ) { return { mailto => $1 } } + elsif( _is_urlish($item) ) { return { web => $item } } + else { return } + }, + repository => sub { return _is_urlish($_[0]) ? { url => $_[0] } : undef }, + ':custom' => \&_prefix_custom, +}; + +sub _upgrade_resources_2 { + my (undef, undef, $meta, $version) = @_; + return unless exists $meta->{resources}; + return _convert($meta->{resources}, $resource2_upgrade); +} + +my $bugtracker2_spec = { + web => \&_url_or_drop, + mailto => \&_keep, + ':custom' => \&_prefix_custom, +}; + +sub _repo_type { + my ($element, $key, $meta, $to_version) = @_; + return $element if defined $element; + return unless exists $meta->{url}; + my $repo_url = $meta->{url}; + for my $type ( qw/git svn/ ) { + return $type if $repo_url =~ m{\A$type}; + } + return; +} + +my $repository2_spec = { + web => \&_url_or_drop, + url => \&_url_or_drop, + type => \&_repo_type, + ':custom' => \&_prefix_custom, +}; + +my $resources2_cleanup = { + license => \&_url_list, + homepage => \&_url_or_drop, + bugtracker => sub { ref $_[0] ? _convert( $_[0], $bugtracker2_spec ) : undef }, + repository => sub { my $data = shift; ref $data ? _convert( $data, $repository2_spec ) : undef }, + ':custom' => \&_prefix_custom, +}; + +sub _cleanup_resources_2 { + my ($resources, $key, $meta, $to_version) = @_; + return unless $resources && ref $resources eq 'HASH'; + return _convert($resources, $resources2_cleanup, $to_version); +} + +my $resource1_spec = { + license => \&_url_or_drop, + homepage => \&_url_or_drop, + bugtracker => \&_url_or_drop, + repository => \&_url_or_drop, + ':custom' => \&_keep, +}; + +sub _resources_1_3 { + my (undef, undef, $meta, $version) = @_; + return unless exists $meta->{resources}; + return _convert($meta->{resources}, $resource1_spec); +} + +*_resources_1_4 = *_resources_1_3; + +sub _resources_1_2 { + my (undef, undef, $meta) = @_; + my $resources = $meta->{resources} || {}; + if ( $meta->{license_url} && ! $resources->{license} ) { + $resources->{license} = $meta->{license_url} + if _is_urlish($meta->{license_url}); + } + return unless keys %$resources; + return _convert($resources, $resource1_spec); +} + +my $resource_downgrade_spec = { + license => sub { return ref $_[0] ? $_[0]->[0] : $_[0] }, + homepage => \&_url_or_drop, + bugtracker => sub { return $_[0]->{web} }, + repository => sub { return $_[0]->{url} || $_[0]->{web} }, + ':custom' => \&_no_prefix_ucfirst_custom, +}; + +sub _downgrade_resources { + my (undef, undef, $meta, $version) = @_; + return unless exists $meta->{resources}; + return _convert($meta->{resources}, $resource_downgrade_spec); +} + +sub _release_status { + my ($element, undef, $meta) = @_; + return $element if $element && $element =~ m{\A(?:stable|testing|unstable)\z}; + return _release_status_from_version(undef, undef, $meta); +} + +sub _release_status_from_version { + my (undef, undef, $meta) = @_; + my $version = $meta->{version} || ''; + return ( $version =~ /_/ ) ? 'testing' : 'stable'; +} + +my $provides_spec = { + file => \&_keep, + version => \&_keep, +}; + +my $provides_spec_2 = { + file => \&_keep, + version => \&_keep, + ':custom' => \&_prefix_custom, +}; + +sub _provides { + my ($element, $key, $meta, $to_version) = @_; + return unless defined $element && ref $element eq 'HASH'; + my $spec = $to_version == 2 ? $provides_spec_2 : $provides_spec; + my $new_data = {}; + for my $k ( keys %$element ) { + $new_data->{$k} = _convert($element->{$k}, $spec, $to_version); + $new_data->{$k}{version} = _clean_version($element->{$k}{version}) + if exists $element->{$k}{version}; + } + return $new_data; +} + +sub _convert { + my ($data, $spec, $to_version, $is_fragment) = @_; + + my $new_data = {}; + for my $key ( keys %$spec ) { + next if $key eq ':custom' || $key eq ':drop'; + next unless my $fcn = $spec->{$key}; + if ( $is_fragment && $key eq 'generated_by' ) { + $fcn = \&_keep; + } + die "spec for '$key' is not a coderef" + unless ref $fcn && ref $fcn eq 'CODE'; + my $new_value = $fcn->($data->{$key}, $key, $data, $to_version); + $new_data->{$key} = $new_value if defined $new_value; + } + + my $drop_list = $spec->{':drop'}; + my $customizer = $spec->{':custom'} || \&_keep; + + for my $key ( keys %$data ) { + next if $drop_list && grep { $key eq $_ } @$drop_list; + next if exists $spec->{$key}; # we handled it + $new_data->{ $customizer->($key) } = $data->{$key}; + } + + return $new_data; +} + +#--------------------------------------------------------------------------# +# define converters for each conversion +#--------------------------------------------------------------------------# + +# each converts from prior version +# special ":custom" field is used for keys not recognized in spec +my %up_convert = ( + '2-from-1.4' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_2, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'dynamic_config' => \&_keep_or_one, + # ADDED MANDATORY + 'release_status' => \&_release_status, + # PRIOR OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_upgrade_optional_features, + 'provides' => \&_provides, + 'resources' => \&_upgrade_resources_2, + # ADDED OPTIONAL + 'description' => \&_keep, + 'prereqs' => \&_prereqs_from_1, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + build_requires + configure_requires + conflicts + distribution_type + license_url + private + recommends + requires + ) ], + + # other random keys need x_ prefixing + ':custom' => \&_prefix_custom, + }, + '1.4-from-1.3' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_1_4, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_4, + # ADDED OPTIONAL + 'configure_requires' => \&_keep, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + license_url + private + )], + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.3-from-1.2' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + license_url + private + )], + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.2-from-1.1' => { + # PRIOR MANDATORY + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'license' => \&_license_1, + 'name' => \&_keep, + 'generated_by' => \&_generated_by, + # ADDED MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'meta-spec' => \&_change_meta_spec, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_1_2, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'resources' => \&_resources_1_2, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + license_url + private + )], + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.1-from-1.0' => { + # CHANGED TO MANDATORY + 'version' => \&_keep, + # IMPLIED MANDATORY + 'name' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'license_url' => \&_url_or_drop, + 'private' => \&_keep, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, +); + +my %down_convert = ( + '1.4-from-2' => { + # MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_downgrade_license, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # OPTIONAL + 'build_requires' => \&_get_build_requires, + 'configure_requires' => \&_get_configure_requires, + 'conflicts' => \&_get_conflicts, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_downgrade_optional_features, + 'provides' => \&_provides, + 'recommends' => \&_get_recommends, + 'requires' => \&_get_requires, + 'resources' => \&_downgrade_resources, + + # drop these unsupported fields (after conversion) + ':drop' => [ qw( + description + prereqs + release_status + )], + + # custom keys will be left unchanged + ':custom' => \&_keep + }, + '1.3-from-1.4' => { + # MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # drop these unsupported fields, but only after we convert + ':drop' => [ qw( + configure_requires + )], + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + '1.2-from-1.3' => { + # MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_1_2, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + '1.1-from-1.2' => { + # MANDATORY + 'version' => \&_keep, + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + # OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'private' => \&_keep, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + + # drop unsupported fields + ':drop' => [ qw( + abstract + author + provides + no_index + keywords + resources + )], + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, + '1.0-from-1.1' => { + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, +); + +my %cleanup = ( + '2' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_2, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'dynamic_config' => \&_keep_or_one, + # ADDED MANDATORY + 'release_status' => \&_release_status, + # PRIOR OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_cleanup_optional_features_2, + 'provides' => \&_provides, + 'resources' => \&_cleanup_resources_2, + # ADDED OPTIONAL + 'description' => \&_keep, + 'prereqs' => \&_cleanup_prereqs, + + # drop these deprecated fields, but only after we convert + ':drop' => [ qw( + build_requires + configure_requires + conflicts + distribution_type + license_url + private + recommends + requires + ) ], + + # other random keys need x_ prefixing + ':custom' => \&_prefix_custom, + }, + '1.4' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_1_4, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_4, + # ADDED OPTIONAL + 'configure_requires' => \&_keep, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.3' => { + # PRIOR MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'meta-spec' => \&_change_meta_spec, + 'name' => \&_keep, + 'version' => \&_keep, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'keywords' => \&_keep, + 'no_index' => \&_no_index_directory, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + 'resources' => \&_resources_1_3, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.2' => { + # PRIOR MANDATORY + 'version' => \&_keep, + # CHANGED TO MANDATORY + 'license' => \&_license_1, + 'name' => \&_keep, + 'generated_by' => \&_generated_by, + # ADDED MANDATORY + 'abstract' => \&_keep_or_unknown, + 'author' => \&_author_list, + 'meta-spec' => \&_change_meta_spec, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'keywords' => \&_keep, + 'no_index' => \&_no_index_1_2, + 'optional_features' => \&_optional_features_as_map, + 'provides' => \&_provides, + 'resources' => \&_resources_1_2, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.1' => { + # CHANGED TO MANDATORY + 'version' => \&_keep, + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + # PRIOR OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + # ADDED OPTIONAL + 'license_url' => \&_url_or_drop, + 'private' => \&_keep, + + # other random keys are OK if already valid + ':custom' => \&_keep + }, + '1.0' => { + # IMPLIED MANDATORY + 'name' => \&_keep, + 'meta-spec' => \&_change_meta_spec, + 'version' => \&_keep, + # IMPLIED OPTIONAL + 'build_requires' => \&_version_map, + 'conflicts' => \&_version_map, + 'distribution_type' => \&_keep, + 'dynamic_config' => \&_keep_or_one, + 'generated_by' => \&_generated_by, + 'license' => \&_license_1, + 'recommends' => \&_version_map, + 'requires' => \&_version_map, + + # other random keys are OK if already valid + ':custom' => \&_keep, + }, +); + +# for a given field in a spec version, what fields will it feed +# into in the *latest* spec (i.e. v2); meta-spec omitted because +# we always expect a meta-spec to be generated +my %fragments_generate = ( + '2' => { + 'abstract' => 'abstract', + 'author' => 'author', + 'generated_by' => 'generated_by', + 'license' => 'license', + 'name' => 'name', + 'version' => 'version', + 'dynamic_config' => 'dynamic_config', + 'release_status' => 'release_status', + 'keywords' => 'keywords', + 'no_index' => 'no_index', + 'optional_features' => 'optional_features', + 'provides' => 'provides', + 'resources' => 'resources', + 'description' => 'description', + 'prereqs' => 'prereqs', + }, + '1.4' => { + 'abstract' => 'abstract', + 'author' => 'author', + 'generated_by' => 'generated_by', + 'license' => 'license', + 'name' => 'name', + 'version' => 'version', + 'build_requires' => 'prereqs', + 'conflicts' => 'prereqs', + 'distribution_type' => 'distribution_type', + 'dynamic_config' => 'dynamic_config', + 'keywords' => 'keywords', + 'no_index' => 'no_index', + 'optional_features' => 'optional_features', + 'provides' => 'provides', + 'recommends' => 'prereqs', + 'requires' => 'prereqs', + 'resources' => 'resources', + 'configure_requires' => 'prereqs', + }, +); +# this is not quite true but will work well enough +# as 1.4 is a superset of earlier ones +$fragments_generate{$_} = $fragments_generate{'1.4'} for qw/1.3 1.2 1.1 1.0/; + +#--------------------------------------------------------------------------# +# Code +#--------------------------------------------------------------------------# + +#pod =method new +#pod +#pod my $cmc = CPAN::Meta::Converter->new( $struct ); +#pod +#pod The constructor should be passed a valid metadata structure but invalid +#pod structures are accepted. If no meta-spec version is provided, version 1.0 will +#pod be assumed. +#pod +#pod Optionally, you can provide a C<default_version> argument after C<$struct>: +#pod +#pod my $cmc = CPAN::Meta::Converter->new( $struct, default_version => "1.4" ); +#pod +#pod This is only needed when converting a metadata fragment that does not include a +#pod C<meta-spec> field. +#pod +#pod =cut + +sub new { + my ($class,$data,%args) = @_; + + # create an attributes hash + my $self = { + 'data' => $data, + 'spec' => _extract_spec_version($data, $args{default_version}), + }; + + # create the object + return bless $self, $class; +} + +sub _extract_spec_version { + my ($data, $default) = @_; + my $spec = $data->{'meta-spec'}; + + # is meta-spec there and valid? + return( $default || "1.0" ) unless defined $spec && ref $spec eq 'HASH'; # before meta-spec? + + # does the version key look like a valid version? + my $v = $spec->{version}; + if ( defined $v && $v =~ /^\d+(?:\.\d+)?$/ ) { + return $v if defined $v && grep { $v eq $_ } keys %known_specs; # known spec + return $v+0 if defined $v && grep { $v == $_ } keys %known_specs; # 2.0 => 2 + } + + # otherwise, use heuristics: look for 1.x vs 2.0 fields + return "2" if exists $data->{prereqs}; + return "1.4" if exists $data->{configure_requires}; + return( $default || "1.2" ); # when meta-spec was first defined +} + +#pod =method convert +#pod +#pod my $new_struct = $cmc->convert( version => "2" ); +#pod +#pod Returns a new hash reference with the metadata converted to a different form. +#pod C<convert> will die if any conversion/standardization still results in an +#pod invalid structure. +#pod +#pod Valid parameters include: +#pod +#pod =over +#pod +#pod =item * +#pod +#pod C<version> -- Indicates the desired specification version (e.g. "1.0", "1.1" ... "1.4", "2"). +#pod Defaults to the latest version of the CPAN Meta Spec. +#pod +#pod =back +#pod +#pod Conversion proceeds through each version in turn. For example, a version 1.2 +#pod structure might be converted to 1.3 then 1.4 then finally to version 2. The +#pod conversion process attempts to clean-up simple errors and standardize data. +#pod For example, if C<author> is given as a scalar, it will converted to an array +#pod reference containing the item. (Converting a structure to its own version will +#pod also clean-up and standardize.) +#pod +#pod When data are cleaned and standardized, missing or invalid fields will be +#pod replaced with sensible defaults when possible. This may be lossy or imprecise. +#pod For example, some badly structured META.yml files on CPAN have prerequisite +#pod modules listed as both keys and values: +#pod +#pod requires => { 'Foo::Bar' => 'Bam::Baz' } +#pod +#pod These would be split and each converted to a prerequisite with a minimum +#pod version of zero. +#pod +#pod When some mandatory fields are missing or invalid, the conversion will attempt +#pod to provide a sensible default or will fill them with a value of 'unknown'. For +#pod example a missing or unrecognized C<license> field will result in a C<license> +#pod field of 'unknown'. Fields that may get an 'unknown' include: +#pod +#pod =for :list +#pod * abstract +#pod * author +#pod * license +#pod +#pod =cut + +sub convert { + my ($self, %args) = @_; + my $args = { %args }; + + my $new_version = $args->{version} || $HIGHEST; + my $is_fragment = $args->{is_fragment}; + + my ($old_version) = $self->{spec}; + my $converted = _dclone($self->{data}); + + if ( $old_version == $new_version ) { + $converted = _convert( $converted, $cleanup{$old_version}, $old_version, $is_fragment ); + unless ( $args->{is_fragment} ) { + my $cmv = CPAN::Meta::Validator->new( $converted ); + unless ( $cmv->is_valid ) { + my $errs = join("\n", $cmv->errors); + die "Failed to clean-up $old_version metadata. Errors:\n$errs\n"; + } + } + return $converted; + } + elsif ( $old_version > $new_version ) { + my @vers = sort { $b <=> $a } keys %known_specs; + for my $i ( 0 .. $#vers-1 ) { + next if $vers[$i] > $old_version; + last if $vers[$i+1] < $new_version; + my $spec_string = "$vers[$i+1]-from-$vers[$i]"; + $converted = _convert( $converted, $down_convert{$spec_string}, $vers[$i+1], $is_fragment ); + unless ( $args->{is_fragment} ) { + my $cmv = CPAN::Meta::Validator->new( $converted ); + unless ( $cmv->is_valid ) { + my $errs = join("\n", $cmv->errors); + die "Failed to downconvert metadata to $vers[$i+1]. Errors:\n$errs\n"; + } + } + } + return $converted; + } + else { + my @vers = sort { $a <=> $b } keys %known_specs; + for my $i ( 0 .. $#vers-1 ) { + next if $vers[$i] < $old_version; + last if $vers[$i+1] > $new_version; + my $spec_string = "$vers[$i+1]-from-$vers[$i]"; + $converted = _convert( $converted, $up_convert{$spec_string}, $vers[$i+1], $is_fragment ); + unless ( $args->{is_fragment} ) { + my $cmv = CPAN::Meta::Validator->new( $converted ); + unless ( $cmv->is_valid ) { + my $errs = join("\n", $cmv->errors); + die "Failed to upconvert metadata to $vers[$i+1]. Errors:\n$errs\n"; + } + } + } + return $converted; + } +} + +#pod =method upgrade_fragment +#pod +#pod my $new_struct = $cmc->upgrade_fragment; +#pod +#pod Returns a new hash reference with the metadata converted to the latest version +#pod of the CPAN Meta Spec. No validation is done on the result -- you must +#pod validate after merging fragments into a complete metadata document. +#pod +#pod Available since version 2.141170. +#pod +#pod =cut + +sub upgrade_fragment { + my ($self) = @_; + my ($old_version) = $self->{spec}; + my %expected = + map {; $_ => 1 } + grep { defined } + map { $fragments_generate{$old_version}{$_} } + keys %{ $self->{data} }; + my $converted = $self->convert( version => $HIGHEST, is_fragment => 1 ); + for my $key ( keys %$converted ) { + next if $key =~ /^x_/i || $key eq 'meta-spec'; + delete $converted->{$key} unless $expected{$key}; + } + return $converted; +} + +1; + +# ABSTRACT: Convert CPAN distribution metadata structures + + +__END__ + + +# vim: ts=2 sts=2 sw=2 et : +use 5.006; +use strict; +use warnings; +package CPAN::Meta::Validator; + +our $VERSION = '2.150010'; + +#pod =head1 SYNOPSIS +#pod +#pod my $struct = decode_json_file('META.json'); +#pod +#pod my $cmv = CPAN::Meta::Validator->new( $struct ); +#pod +#pod unless ( $cmv->is_valid ) { +#pod my $msg = "Invalid META structure. Errors found:\n"; +#pod $msg .= join( "\n", $cmv->errors ); +#pod die $msg; +#pod } +#pod +#pod =head1 DESCRIPTION +#pod +#pod This module validates a CPAN Meta structure against the version of the +#pod the specification claimed in the C<meta-spec> field of the structure. +#pod +#pod =cut + +#--------------------------------------------------------------------------# +# This code copied and adapted from Test::CPAN::Meta +# by Barbie, <barbie@cpan.org> for Miss Barbell Productions, +# L<http://www.missbarbell.co.uk> +#--------------------------------------------------------------------------# + +#--------------------------------------------------------------------------# +# Specification Definitions +#--------------------------------------------------------------------------# + +my %known_specs = ( + '1.4' => 'http://module-build.sourceforge.net/META-spec-v1.4.html', + '1.3' => 'http://module-build.sourceforge.net/META-spec-v1.3.html', + '1.2' => 'http://module-build.sourceforge.net/META-spec-v1.2.html', + '1.1' => 'http://module-build.sourceforge.net/META-spec-v1.1.html', + '1.0' => 'http://module-build.sourceforge.net/META-spec-v1.0.html' +); +my %known_urls = map {$known_specs{$_} => $_} keys %known_specs; + +my $module_map1 = { 'map' => { ':key' => { name => \&module, value => \&exversion } } }; + +my $module_map2 = { 'map' => { ':key' => { name => \&module, value => \&version } } }; + +my $no_index_2 = { + 'map' => { file => { list => { value => \&string } }, + directory => { list => { value => \&string } }, + 'package' => { list => { value => \&string } }, + namespace => { list => { value => \&string } }, + ':key' => { name => \&custom_2, value => \&anything }, + } +}; + +my $no_index_1_3 = { + 'map' => { file => { list => { value => \&string } }, + directory => { list => { value => \&string } }, + 'package' => { list => { value => \&string } }, + namespace => { list => { value => \&string } }, + ':key' => { name => \&string, value => \&anything }, + } +}; + +my $no_index_1_2 = { + 'map' => { file => { list => { value => \&string } }, + dir => { list => { value => \&string } }, + 'package' => { list => { value => \&string } }, + namespace => { list => { value => \&string } }, + ':key' => { name => \&string, value => \&anything }, + } +}; + +my $no_index_1_1 = { + 'map' => { ':key' => { name => \&string, list => { value => \&string } }, + } +}; + +my $prereq_map = { + map => { + ':key' => { + name => \&phase, + 'map' => { + ':key' => { + name => \&relation, + %$module_map1, + }, + }, + } + }, +}; + +my %definitions = ( + '2' => { + # REQUIRED + 'abstract' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'dynamic_config' => { mandatory => 1, value => \&boolean }, + 'generated_by' => { mandatory => 1, value => \&string }, + 'license' => { mandatory => 1, list => { value => \&license } }, + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { value => \&url }, + ':key' => { name => \&custom_2, value => \&anything }, + } + }, + 'name' => { mandatory => 1, value => \&string }, + 'release_status' => { mandatory => 1, value => \&release_status }, + 'version' => { mandatory => 1, value => \&version }, + + # OPTIONAL + 'description' => { value => \&string }, + 'keywords' => { list => { value => \&string } }, + 'no_index' => $no_index_2, + 'optional_features' => { + 'map' => { + ':key' => { + name => \&string, + 'map' => { + description => { value => \&string }, + prereqs => $prereq_map, + ':key' => { name => \&custom_2, value => \&anything }, + } + } + } + }, + 'prereqs' => $prereq_map, + 'provides' => { + 'map' => { + ':key' => { + name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&custom_2, value => \&anything }, + } + } + } + }, + 'resources' => { + 'map' => { + license => { list => { value => \&url } }, + homepage => { value => \&url }, + bugtracker => { + 'map' => { + web => { value => \&url }, + mailto => { value => \&string}, + ':key' => { name => \&custom_2, value => \&anything }, + } + }, + repository => { + 'map' => { + web => { value => \&url }, + url => { value => \&url }, + type => { value => \&string }, + ':key' => { name => \&custom_2, value => \&anything }, + } + }, + ':key' => { value => \&string, name => \&custom_2 }, + } + }, + + # CUSTOM -- additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&custom_2, value => \&anything }, + }, + +'1.4' => { + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { mandatory => 1, value => \&urlspec }, + ':key' => { name => \&string, value => \&anything }, + }, + }, + + 'name' => { mandatory => 1, value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'abstract' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'license' => { mandatory => 1, value => \&license }, + 'generated_by' => { mandatory => 1, value => \&string }, + + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'configure_requires' => $module_map1, + 'conflicts' => $module_map2, + + 'optional_features' => { + 'map' => { + ':key' => { name => \&string, + 'map' => { description => { value => \&string }, + requires => $module_map1, + recommends => $module_map1, + build_requires => $module_map1, + conflicts => $module_map2, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'provides' => { + 'map' => { + ':key' => { name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'no_index' => $no_index_1_3, + 'private' => $no_index_1_3, + + 'keywords' => { list => { value => \&string } }, + + 'resources' => { + 'map' => { license => { value => \&url }, + homepage => { value => \&url }, + bugtracker => { value => \&url }, + repository => { value => \&url }, + ':key' => { value => \&string, name => \&custom_1 }, + } + }, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, +}, + +'1.3' => { + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { mandatory => 1, value => \&urlspec }, + ':key' => { name => \&string, value => \&anything }, + }, + }, + + 'name' => { mandatory => 1, value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'abstract' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'license' => { mandatory => 1, value => \&license }, + 'generated_by' => { mandatory => 1, value => \&string }, + + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + 'optional_features' => { + 'map' => { + ':key' => { name => \&string, + 'map' => { description => { value => \&string }, + requires => $module_map1, + recommends => $module_map1, + build_requires => $module_map1, + conflicts => $module_map2, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'provides' => { + 'map' => { + ':key' => { name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + + 'no_index' => $no_index_1_3, + 'private' => $no_index_1_3, + + 'keywords' => { list => { value => \&string } }, + + 'resources' => { + 'map' => { license => { value => \&url }, + homepage => { value => \&url }, + bugtracker => { value => \&url }, + repository => { value => \&url }, + ':key' => { value => \&string, name => \&custom_1 }, + } + }, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, +}, + +# v1.2 is misleading, it seems to assume that a number of fields where created +# within v1.1, when they were created within v1.2. This may have been an +# original mistake, and that a v1.1 was retro fitted into the timeline, when +# v1.2 was originally slated as v1.1. But I could be wrong ;) +'1.2' => { + 'meta-spec' => { + mandatory => 1, + 'map' => { + version => { mandatory => 1, value => \&version}, + url => { mandatory => 1, value => \&urlspec }, + ':key' => { name => \&string, value => \&anything }, + }, + }, + + + 'name' => { mandatory => 1, value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'license' => { mandatory => 1, value => \&license }, + 'generated_by' => { mandatory => 1, value => \&string }, + 'author' => { mandatory => 1, list => { value => \&string } }, + 'abstract' => { mandatory => 1, value => \&string }, + + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'keywords' => { list => { value => \&string } }, + + 'private' => $no_index_1_2, + '$no_index' => $no_index_1_2, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + 'optional_features' => { + 'map' => { + ':key' => { name => \&string, + 'map' => { description => { value => \&string }, + requires => $module_map1, + recommends => $module_map1, + build_requires => $module_map1, + conflicts => $module_map2, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'provides' => { + 'map' => { + ':key' => { name => \&module, + 'map' => { + file => { mandatory => 1, value => \&file }, + version => { value => \&version }, + ':key' => { name => \&string, value => \&anything }, + } + } + } + }, + + 'resources' => { + 'map' => { license => { value => \&url }, + homepage => { value => \&url }, + bugtracker => { value => \&url }, + repository => { value => \&url }, + ':key' => { value => \&string, name => \&custom_1 }, + } + }, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, +}, + +# note that the 1.1 spec only specifies 'version' as mandatory +'1.1' => { + 'name' => { value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'license' => { value => \&license }, + 'generated_by' => { value => \&string }, + + 'license_uri' => { value => \&url }, + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'private' => $no_index_1_1, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, +}, + +# note that the 1.0 spec doesn't specify optional or mandatory fields +# but we will treat version as mandatory since otherwise META 1.0 is +# completely arbitrary and pointless +'1.0' => { + 'name' => { value => \&string }, + 'version' => { mandatory => 1, value => \&version }, + 'license' => { value => \&license }, + 'generated_by' => { value => \&string }, + + 'license_uri' => { value => \&url }, + 'distribution_type' => { value => \&string }, + 'dynamic_config' => { value => \&boolean }, + + 'requires' => $module_map1, + 'recommends' => $module_map1, + 'build_requires' => $module_map1, + 'conflicts' => $module_map2, + + # additional user defined key/value pairs + # note we can only validate the key name, as the structure is user defined + ':key' => { name => \&string, value => \&anything }, +}, +); + +#--------------------------------------------------------------------------# +# Code +#--------------------------------------------------------------------------# + +#pod =method new +#pod +#pod my $cmv = CPAN::Meta::Validator->new( $struct ) +#pod +#pod The constructor must be passed a metadata structure. +#pod +#pod =cut + +sub new { + my ($class,$data) = @_; + + # create an attributes hash + my $self = { + 'data' => $data, + 'spec' => eval { $data->{'meta-spec'}{'version'} } || "1.0", + 'errors' => undef, + }; + + # create the object + return bless $self, $class; +} + +#pod =method is_valid +#pod +#pod if ( $cmv->is_valid ) { +#pod ... +#pod } +#pod +#pod Returns a boolean value indicating whether the metadata provided +#pod is valid. +#pod +#pod =cut + +sub is_valid { + my $self = shift; + my $data = $self->{data}; + my $spec_version = $self->{spec}; + $self->check_map($definitions{$spec_version},$data); + return ! $self->errors; +} + +#pod =method errors +#pod +#pod warn( join "\n", $cmv->errors ); +#pod +#pod Returns a list of errors seen during validation. +#pod +#pod =cut + +sub errors { + my $self = shift; + return () unless(defined $self->{errors}); + return @{$self->{errors}}; +} + +#pod =begin :internals +#pod +#pod =head2 Check Methods +#pod +#pod =over +#pod +#pod =item * +#pod +#pod check_map($spec,$data) +#pod +#pod Checks whether a map (or hash) part of the data structure conforms to the +#pod appropriate specification definition. +#pod +#pod =item * +#pod +#pod check_list($spec,$data) +#pod +#pod Checks whether a list (or array) part of the data structure conforms to +#pod the appropriate specification definition. +#pod +#pod =item * +#pod +#pod =back +#pod +#pod =cut + +my $spec_error = "Missing validation action in specification. " + . "Must be one of 'map', 'list', or 'value'"; + +sub check_map { + my ($self,$spec,$data) = @_; + + if(ref($spec) ne 'HASH') { + $self->_error( "Unknown META specification, cannot validate." ); + return; + } + + if(ref($data) ne 'HASH') { + $self->_error( "Expected a map structure from string or file." ); + return; + } + + for my $key (keys %$spec) { + next unless($spec->{$key}->{mandatory}); + next if(defined $data->{$key}); + push @{$self->{stack}}, $key; + $self->_error( "Missing mandatory field, '$key'" ); + pop @{$self->{stack}}; + } + + for my $key (keys %$data) { + push @{$self->{stack}}, $key; + if($spec->{$key}) { + if($spec->{$key}{value}) { + $spec->{$key}{value}->($self,$key,$data->{$key}); + } elsif($spec->{$key}{'map'}) { + $self->check_map($spec->{$key}{'map'},$data->{$key}); + } elsif($spec->{$key}{'list'}) { + $self->check_list($spec->{$key}{'list'},$data->{$key}); + } else { + $self->_error( "$spec_error for '$key'" ); + } + + } elsif ($spec->{':key'}) { + $spec->{':key'}{name}->($self,$key,$key); + if($spec->{':key'}{value}) { + $spec->{':key'}{value}->($self,$key,$data->{$key}); + } elsif($spec->{':key'}{'map'}) { + $self->check_map($spec->{':key'}{'map'},$data->{$key}); + } elsif($spec->{':key'}{'list'}) { + $self->check_list($spec->{':key'}{'list'},$data->{$key}); + } else { + $self->_error( "$spec_error for ':key'" ); + } + + + } else { + $self->_error( "Unknown key, '$key', found in map structure" ); + } + pop @{$self->{stack}}; + } +} + +sub check_list { + my ($self,$spec,$data) = @_; + + if(ref($data) ne 'ARRAY') { + $self->_error( "Expected a list structure" ); + return; + } + + if(defined $spec->{mandatory}) { + if(!defined $data->[0]) { + $self->_error( "Missing entries from mandatory list" ); + } + } + + for my $value (@$data) { + push @{$self->{stack}}, $value || "<undef>"; + if(defined $spec->{value}) { + $spec->{value}->($self,'list',$value); + } elsif(defined $spec->{'map'}) { + $self->check_map($spec->{'map'},$value); + } elsif(defined $spec->{'list'}) { + $self->check_list($spec->{'list'},$value); + } elsif ($spec->{':key'}) { + $self->check_map($spec,$value); + } else { + $self->_error( "$spec_error associated with '$self->{stack}[-2]'" ); + } + pop @{$self->{stack}}; + } +} + +#pod =head2 Validator Methods +#pod +#pod =over +#pod +#pod =item * +#pod +#pod header($self,$key,$value) +#pod +#pod Validates that the header is valid. +#pod +#pod Note: No longer used as we now read the data structure, not the file. +#pod +#pod =item * +#pod +#pod url($self,$key,$value) +#pod +#pod Validates that a given value is in an acceptable URL format +#pod +#pod =item * +#pod +#pod urlspec($self,$key,$value) +#pod +#pod Validates that the URL to a META specification is a known one. +#pod +#pod =item * +#pod +#pod string_or_undef($self,$key,$value) +#pod +#pod Validates that the value is either a string or an undef value. Bit of a +#pod catchall function for parts of the data structure that are completely user +#pod defined. +#pod +#pod =item * +#pod +#pod string($self,$key,$value) +#pod +#pod Validates that a string exists for the given key. +#pod +#pod =item * +#pod +#pod file($self,$key,$value) +#pod +#pod Validate that a file is passed for the given key. This may be made more +#pod thorough in the future. For now it acts like \&string. +#pod +#pod =item * +#pod +#pod exversion($self,$key,$value) +#pod +#pod Validates a list of versions, e.g. '<= 5, >=2, ==3, !=4, >1, <6, 0'. +#pod +#pod =item * +#pod +#pod version($self,$key,$value) +#pod +#pod Validates a single version string. Versions of the type '5.8.8' and '0.00_00' +#pod are both valid. A leading 'v' like 'v1.2.3' is also valid. +#pod +#pod =item * +#pod +#pod boolean($self,$key,$value) +#pod +#pod Validates for a boolean value: a defined value that is either "1" or "0" or +#pod stringifies to those values. +#pod +#pod =item * +#pod +#pod license($self,$key,$value) +#pod +#pod Validates that a value is given for the license. Returns 1 if an known license +#pod type, or 2 if a value is given but the license type is not a recommended one. +#pod +#pod =item * +#pod +#pod custom_1($self,$key,$value) +#pod +#pod Validates that the given key is in CamelCase, to indicate a user defined +#pod keyword and only has characters in the class [-_a-zA-Z]. In version 1.X +#pod of the spec, this was only explicitly stated for 'resources'. +#pod +#pod =item * +#pod +#pod custom_2($self,$key,$value) +#pod +#pod Validates that the given key begins with 'x_' or 'X_', to indicate a user +#pod defined keyword and only has characters in the class [-_a-zA-Z] +#pod +#pod =item * +#pod +#pod identifier($self,$key,$value) +#pod +#pod Validates that key is in an acceptable format for the META specification, +#pod for an identifier, i.e. any that matches the regular expression +#pod qr/[a-z][a-z_]/i. +#pod +#pod =item * +#pod +#pod module($self,$key,$value) +#pod +#pod Validates that a given key is in an acceptable module name format, e.g. +#pod 'Test::CPAN::Meta::Version'. +#pod +#pod =back +#pod +#pod =end :internals +#pod +#pod =cut + +sub header { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value && $value =~ /^--- #YAML:1.0/); + } + $self->_error( "file does not have a valid YAML header." ); + return 0; +} + +sub release_status { + my ($self,$key,$value) = @_; + if(defined $value) { + my $version = $self->{data}{version} || ''; + if ( $version =~ /_/ ) { + return 1 if ( $value =~ /\A(?:testing|unstable)\z/ ); + $self->_error( "'$value' for '$key' is invalid for version '$version'" ); + } + else { + return 1 if ( $value =~ /\A(?:stable|testing|unstable)\z/ ); + $self->_error( "'$value' for '$key' is invalid" ); + } + } + else { + $self->_error( "'$key' is not defined" ); + } + return 0; +} + +# _uri_split taken from URI::Split by Gisle Aas, Copyright 2003 +sub _uri_split { + return $_[0] =~ m,(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*)(?:\?([^#]*))?(?:#(.*))?,; +} + +sub url { + my ($self,$key,$value) = @_; + if(defined $value) { + my ($scheme, $auth, $path, $query, $frag) = _uri_split($value); + unless ( defined $scheme && length $scheme ) { + $self->_error( "'$value' for '$key' does not have a URL scheme" ); + return 0; + } + unless ( defined $auth && length $auth ) { + $self->_error( "'$value' for '$key' does not have a URL authority" ); + return 0; + } + return 1; + } + $value ||= ''; + $self->_error( "'$value' for '$key' is not a valid URL." ); + return 0; +} + +sub urlspec { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value && $known_specs{$self->{spec}} eq $value); + if($value && $known_urls{$value}) { + $self->_error( 'META specification URL does not match version' ); + return 0; + } + } + $self->_error( 'Unknown META specification' ); + return 0; +} + +sub anything { return 1 } + +sub string { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value || $value =~ /^0$/); + } + $self->_error( "value is an undefined string" ); + return 0; +} + +sub string_or_undef { + my ($self,$key,$value) = @_; + return 1 unless(defined $value); + return 1 if($value || $value =~ /^0$/); + $self->_error( "No string defined for '$key'" ); + return 0; +} + +sub file { + my ($self,$key,$value) = @_; + return 1 if(defined $value); + $self->_error( "No file defined for '$key'" ); + return 0; +} + +sub exversion { + my ($self,$key,$value) = @_; + if(defined $value && ($value || $value =~ /0/)) { + my $pass = 1; + for(split(",",$value)) { $self->version($key,$_) or ($pass = 0); } + return $pass; + } + $value = '<undef>' unless(defined $value); + $self->_error( "'$value' for '$key' is not a valid version." ); + return 0; +} + +sub version { + my ($self,$key,$value) = @_; + if(defined $value) { + return 0 unless($value || $value =~ /0/); + return 1 if($value =~ /^\s*((<|<=|>=|>|!=|==)\s*)?v?\d+((\.\d+((_|\.)\d+)?)?)/); + } else { + $value = '<undef>'; + } + $self->_error( "'$value' for '$key' is not a valid version." ); + return 0; +} + +sub boolean { + my ($self,$key,$value) = @_; + if(defined $value) { + return 1 if($value =~ /^(0|1)$/); + } else { + $value = '<undef>'; + } + $self->_error( "'$value' for '$key' is not a boolean value." ); + return 0; +} + +my %v1_licenses = ( + 'perl' => 'http://dev.perl.org/licenses/', + 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php', + 'apache' => 'http://apache.org/licenses/LICENSE-2.0', + 'artistic' => 'http://opensource.org/licenses/artistic-license.php', + 'artistic_2' => 'http://opensource.org/licenses/artistic-license-2.0.php', + 'lgpl' => 'http://www.opensource.org/licenses/lgpl-license.php', + 'bsd' => 'http://www.opensource.org/licenses/bsd-license.php', + 'gpl' => 'http://www.opensource.org/licenses/gpl-license.php', + 'mit' => 'http://opensource.org/licenses/mit-license.php', + 'mozilla' => 'http://opensource.org/licenses/mozilla1.1.php', + 'open_source' => undef, + 'unrestricted' => undef, + 'restrictive' => undef, + 'unknown' => undef, +); + +my %v2_licenses = map { $_ => 1 } qw( + agpl_3 + apache_1_1 + apache_2_0 + artistic_1 + artistic_2 + bsd + freebsd + gfdl_1_2 + gfdl_1_3 + gpl_1 + gpl_2 + gpl_3 + lgpl_2_1 + lgpl_3_0 + mit + mozilla_1_0 + mozilla_1_1 + openssl + perl_5 + qpl_1_0 + ssleay + sun + zlib + open_source + restricted + unrestricted + unknown +); + +sub license { + my ($self,$key,$value) = @_; + my $licenses = $self->{spec} < 2 ? \%v1_licenses : \%v2_licenses; + if(defined $value) { + return 1 if($value && exists $licenses->{$value}); + } else { + $value = '<undef>'; + } + $self->_error( "License '$value' is invalid" ); + return 0; +} + +sub custom_1 { + my ($self,$key) = @_; + if(defined $key) { + # a valid user defined key should be alphabetic + # and contain at least one capital case letter. + return 1 if($key && $key =~ /^[_a-z]+$/i && $key =~ /[A-Z]/); + } else { + $key = '<undef>'; + } + $self->_error( "Custom resource '$key' must be in CamelCase." ); + return 0; +} + +sub custom_2 { + my ($self,$key) = @_; + if(defined $key) { + return 1 if($key && $key =~ /^x_/i); # user defined + } else { + $key = '<undef>'; + } + $self->_error( "Custom key '$key' must begin with 'x_' or 'X_'." ); + return 0; +} + +sub identifier { + my ($self,$key) = @_; + if(defined $key) { + return 1 if($key && $key =~ /^([a-z][_a-z]+)$/i); # spec 2.0 defined + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal identifier." ); + return 0; +} + +sub module { + my ($self,$key) = @_; + if(defined $key) { + return 1 if($key && $key =~ /^[A-Za-z0-9_]+(::[A-Za-z0-9_]+)*$/); + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal module name." ); + return 0; +} + +my @valid_phases = qw/ configure build test runtime develop /; +sub phase { + my ($self,$key) = @_; + if(defined $key) { + return 1 if( length $key && grep { $key eq $_ } @valid_phases ); + return 1 if $key =~ /x_/i; + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal phase." ); + return 0; +} + +my @valid_relations = qw/ requires recommends suggests conflicts /; +sub relation { + my ($self,$key) = @_; + if(defined $key) { + return 1 if( length $key && grep { $key eq $_ } @valid_relations ); + return 1 if $key =~ /x_/i; + } else { + $key = '<undef>'; + } + $self->_error( "Key '$key' is not a legal prereq relationship." ); + return 0; +} + +sub _error { + my $self = shift; + my $mess = shift; + + $mess .= ' ('.join(' -> ',@{$self->{stack}}).')' if($self->{stack}); + $mess .= " [Validation: $self->{spec}]"; + + push @{$self->{errors}}, $mess; +} + +1; + +# ABSTRACT: validate CPAN distribution metadata structures + + +__END__ + + +# vim: ts=2 sts=2 sw=2 et : +use 5.006; +use strict; +use warnings; +package CPAN::Meta::Prereqs; + +our $VERSION = '2.150010'; + +#pod =head1 DESCRIPTION +#pod +#pod A CPAN::Meta::Prereqs object represents the prerequisites for a CPAN +#pod distribution or one of its optional features. Each set of prereqs is +#pod organized by phase and type, as described in L<CPAN::Meta::Prereqs>. +#pod +#pod =cut + +use Carp qw(confess); +use Scalar::Util qw(blessed); +use CPAN::Meta::Requirements 2.121; + +#pod =method new +#pod +#pod my $prereq = CPAN::Meta::Prereqs->new( \%prereq_spec ); +#pod +#pod This method returns a new set of Prereqs. The input should look like the +#pod contents of the C<prereqs> field described in L<CPAN::Meta::Spec>, meaning +#pod something more or less like this: +#pod +#pod my $prereq = CPAN::Meta::Prereqs->new({ +#pod runtime => { +#pod requires => { +#pod 'Some::Module' => '1.234', +#pod ..., +#pod }, +#pod ..., +#pod }, +#pod ..., +#pod }); +#pod +#pod You can also construct an empty set of prereqs with: +#pod +#pod my $prereqs = CPAN::Meta::Prereqs->new; +#pod +#pod This empty set of prereqs is useful for accumulating new prereqs before finally +#pod dumping the whole set into a structure or string. +#pod +#pod =cut + +# note we also accept anything matching /\Ax_/i +sub __legal_phases { qw(configure build test runtime develop) } +sub __legal_types { qw(requires recommends suggests conflicts) } + +# expect a prereq spec from META.json -- rjbs, 2010-04-11 +sub new { + my ($class, $prereq_spec) = @_; + $prereq_spec ||= {}; + + my %is_legal_phase = map {; $_ => 1 } $class->__legal_phases; + my %is_legal_type = map {; $_ => 1 } $class->__legal_types; + + my %guts; + PHASE: for my $phase (keys %$prereq_spec) { + next PHASE unless $phase =~ /\Ax_/i or $is_legal_phase{$phase}; + + my $phase_spec = $prereq_spec->{ $phase }; + next PHASE unless keys %$phase_spec; + + TYPE: for my $type (keys %$phase_spec) { + next TYPE unless $type =~ /\Ax_/i or $is_legal_type{$type}; + + my $spec = $phase_spec->{ $type }; + + next TYPE unless keys %$spec; + + $guts{prereqs}{$phase}{$type} = CPAN::Meta::Requirements->from_string_hash( + $spec + ); + } + } + + return bless \%guts => $class; +} + +#pod =method requirements_for +#pod +#pod my $requirements = $prereqs->requirements_for( $phase, $type ); +#pod +#pod This method returns a L<CPAN::Meta::Requirements> object for the given +#pod phase/type combination. If no prerequisites are registered for that +#pod combination, a new CPAN::Meta::Requirements object will be returned, and it may +#pod be added to as needed. +#pod +#pod If C<$phase> or C<$type> are undefined or otherwise invalid, an exception will +#pod be raised. +#pod +#pod =cut + +sub requirements_for { + my ($self, $phase, $type) = @_; + + confess "requirements_for called without phase" unless defined $phase; + confess "requirements_for called without type" unless defined $type; + + unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) { + confess "requested requirements for unknown phase: $phase"; + } + + unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) { + confess "requested requirements for unknown type: $type"; + } + + my $req = ($self->{prereqs}{$phase}{$type} ||= CPAN::Meta::Requirements->new); + + $req->finalize if $self->is_finalized; + + return $req; +} + +#pod =method phases +#pod +#pod my @phases = $prereqs->phases; +#pod +#pod This method returns the list of all phases currently populated in the prereqs +#pod object, suitable for iterating. +#pod +#pod =cut + +sub phases { + my ($self) = @_; + + my %is_legal_phase = map {; $_ => 1 } $self->__legal_phases; + grep { /\Ax_/i or $is_legal_phase{$_} } keys %{ $self->{prereqs} }; +} + +#pod =method types_in +#pod +#pod my @runtime_types = $prereqs->types_in('runtime'); +#pod +#pod This method returns the list of all types currently populated in the prereqs +#pod object for the provided phase, suitable for iterating. +#pod +#pod =cut + +sub types_in { + my ($self, $phase) = @_; + + return unless $phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases; + + my %is_legal_type = map {; $_ => 1 } $self->__legal_types; + grep { /\Ax_/i or $is_legal_type{$_} } keys %{ $self->{prereqs}{$phase} }; +} + +#pod =method with_merged_prereqs +#pod +#pod my $new_prereqs = $prereqs->with_merged_prereqs( $other_prereqs ); +#pod +#pod my $new_prereqs = $prereqs->with_merged_prereqs( \@other_prereqs ); +#pod +#pod This method returns a new CPAN::Meta::Prereqs objects in which all the +#pod other prerequisites given are merged into the current set. This is primarily +#pod provided for combining a distribution's core prereqs with the prereqs of one of +#pod its optional features. +#pod +#pod The new prereqs object has no ties to the originals, and altering it further +#pod will not alter them. +#pod +#pod =cut + +sub with_merged_prereqs { + my ($self, $other) = @_; + + my @other = blessed($other) ? $other : @$other; + + my @prereq_objs = ($self, @other); + + my %new_arg; + + for my $phase (__uniq(map { $_->phases } @prereq_objs)) { + for my $type (__uniq(map { $_->types_in($phase) } @prereq_objs)) { + + my $req = CPAN::Meta::Requirements->new; + + for my $prereq (@prereq_objs) { + my $this_req = $prereq->requirements_for($phase, $type); + next unless $this_req->required_modules; + + $req->add_requirements($this_req); + } + + next unless $req->required_modules; + + $new_arg{ $phase }{ $type } = $req->as_string_hash; + } + } + + return (ref $self)->new(\%new_arg); +} + +#pod =method merged_requirements +#pod +#pod my $new_reqs = $prereqs->merged_requirements( \@phases, \@types ); +#pod my $new_reqs = $prereqs->merged_requirements( \@phases ); +#pod my $new_reqs = $prereqs->merged_requirements(); +#pod +#pod This method joins together all requirements across a number of phases +#pod and types into a new L<CPAN::Meta::Requirements> object. If arguments +#pod are omitted, it defaults to "runtime", "build" and "test" for phases +#pod and "requires" and "recommends" for types. +#pod +#pod =cut + +sub merged_requirements { + my ($self, $phases, $types) = @_; + $phases = [qw/runtime build test/] unless defined $phases; + $types = [qw/requires recommends/] unless defined $types; + + confess "merged_requirements phases argument must be an arrayref" + unless ref $phases eq 'ARRAY'; + confess "merged_requirements types argument must be an arrayref" + unless ref $types eq 'ARRAY'; + + my $req = CPAN::Meta::Requirements->new; + + for my $phase ( @$phases ) { + unless ($phase =~ /\Ax_/i or grep { $phase eq $_ } $self->__legal_phases) { + confess "requested requirements for unknown phase: $phase"; + } + for my $type ( @$types ) { + unless ($type =~ /\Ax_/i or grep { $type eq $_ } $self->__legal_types) { + confess "requested requirements for unknown type: $type"; + } + $req->add_requirements( $self->requirements_for($phase, $type) ); + } + } + + $req->finalize if $self->is_finalized; + + return $req; +} + + +#pod =method as_string_hash +#pod +#pod This method returns a hashref containing structures suitable for dumping into a +#pod distmeta data structure. It is made up of hashes and strings, only; there will +#pod be no Prereqs, CPAN::Meta::Requirements, or C<version> objects inside it. +#pod +#pod =cut + +sub as_string_hash { + my ($self) = @_; + + my %hash; + + for my $phase ($self->phases) { + for my $type ($self->types_in($phase)) { + my $req = $self->requirements_for($phase, $type); + next unless $req->required_modules; + + $hash{ $phase }{ $type } = $req->as_string_hash; + } + } + + return \%hash; +} + +#pod =method is_finalized +#pod +#pod This method returns true if the set of prereqs has been marked "finalized," and +#pod cannot be altered. +#pod +#pod =cut + +sub is_finalized { $_[0]{finalized} } + +#pod =method finalize +#pod +#pod Calling C<finalize> on a Prereqs object will close it for further modification. +#pod Attempting to make any changes that would actually alter the prereqs will +#pod result in an exception being thrown. +#pod +#pod =cut + +sub finalize { + my ($self) = @_; + + $self->{finalized} = 1; + + for my $phase (keys %{ $self->{prereqs} }) { + $_->finalize for values %{ $self->{prereqs}{$phase} }; + } +} + +#pod =method clone +#pod +#pod my $cloned_prereqs = $prereqs->clone; +#pod +#pod This method returns a Prereqs object that is identical to the original object, +#pod but can be altered without affecting the original object. Finalization does +#pod not survive cloning, meaning that you may clone a finalized set of prereqs and +#pod then modify the clone. +#pod +#pod =cut + +sub clone { + my ($self) = @_; + + my $clone = (ref $self)->new( $self->as_string_hash ); +} + +sub __uniq { + my (%s, $u); + grep { defined($_) ? !$s{$_}++ : !$u++ } @_; +} + +1; + +# ABSTRACT: a set of distribution prerequisites by phase and type + + +__END__ + + +# vim: ts=2 sts=2 sw=2 et : +use 5.006; # keep at v5.6 for CPAN.pm +use strict; +use warnings; +package CPAN::Meta::Requirements; +# ABSTRACT: a set of version requirements for a CPAN dist + +our $VERSION = '2.140'; + +#pod =head1 SYNOPSIS +#pod +#pod use CPAN::Meta::Requirements; +#pod +#pod my $build_requires = CPAN::Meta::Requirements->new; +#pod +#pod $build_requires->add_minimum('Library::Foo' => 1.208); +#pod +#pod $build_requires->add_minimum('Library::Foo' => 2.602); +#pod +#pod $build_requires->add_minimum('Module::Bar' => 'v1.2.3'); +#pod +#pod $METAyml->{build_requires} = $build_requires->as_string_hash; +#pod +#pod =head1 DESCRIPTION +#pod +#pod A CPAN::Meta::Requirements object models a set of version constraints like +#pod those specified in the F<META.yml> or F<META.json> files in CPAN distributions, +#pod and as defined by L<CPAN::Meta::Spec>; +#pod It can be built up by adding more and more constraints, and it will reduce them +#pod to the simplest representation. +#pod +#pod Logically impossible constraints will be identified immediately by thrown +#pod exceptions. +#pod +#pod =cut + +use Carp (); + +# To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls +# before 5.10, we fall back to the EUMM bundled compatibility version module if +# that's the only thing available. This shouldn't ever happen in a normal CPAN +# install of CPAN::Meta::Requirements, as version.pm will be picked up from +# prereqs and be available at runtime. + +BEGIN { + eval "use version ()"; ## no critic + if ( my $err = $@ ) { + eval "use ExtUtils::MakeMaker::version" or die $err; ## no critic + } +} + +# Perl 5.10.0 didn't have "is_qv" in version.pm +*_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} }; + +# construct once, reuse many times +my $V0 = version->new(0); + +#pod =method new +#pod +#pod my $req = CPAN::Meta::Requirements->new; +#pod +#pod This returns a new CPAN::Meta::Requirements object. It takes an optional +#pod hash reference argument. Currently, only one key is supported: +#pod +#pod =for :list +#pod * C<bad_version_hook> -- if provided, when a version cannot be parsed into +#pod a version object, this code reference will be called with the invalid +#pod version string as first argument, and the module name as second +#pod argument. It must return a valid version object. +#pod +#pod All other keys are ignored. +#pod +#pod =cut + +my @valid_options = qw( bad_version_hook ); + +sub new { + my ($class, $options) = @_; + $options ||= {}; + Carp::croak "Argument to $class\->new() must be a hash reference" + unless ref $options eq 'HASH'; + my %self = map {; $_ => $options->{$_}} @valid_options; + + return bless \%self => $class; +} + +# from version::vpp +sub _find_magic_vstring { + my $value = shift; + my $tvalue = ''; + require B; + my $sv = B::svref_2object(\$value); + my $magic = ref($sv) eq 'B::PVMG' ? $sv->MAGIC : undef; + while ( $magic ) { + if ( $magic->TYPE eq 'V' ) { + $tvalue = $magic->PTR; + $tvalue =~ s/^v?(.+)$/v$1/; + last; + } + else { + $magic = $magic->MOREMAGIC; + } + } + return $tvalue; +} + +# safe if given an unblessed reference +sub _isa_version { + UNIVERSAL::isa( $_[0], 'UNIVERSAL' ) && $_[0]->isa('version') +} + +sub _version_object { + my ($self, $module, $version) = @_; + + my ($vobj, $err); + + if (not defined $version or (!ref($version) && $version eq '0')) { + return $V0; + } + elsif ( ref($version) eq 'version' || ( ref($version) && _isa_version($version) ) ) { + $vobj = $version; + } + else { + # hack around version::vpp not handling <3 character vstring literals + if ( $INC{'version/vpp.pm'} || $INC{'ExtUtils/MakeMaker/version/vpp.pm'} ) { + my $magic = _find_magic_vstring( $version ); + $version = $magic if length $magic; + } + # pad to 3 characters if before 5.8.1 and appears to be a v-string + if ( $] < 5.008001 && $version !~ /\A[0-9]/ && substr($version,0,1) ne 'v' && length($version) < 3 ) { + $version .= "\0" x (3 - length($version)); + } + eval { + local $SIG{__WARN__} = sub { die "Invalid version: $_[0]" }; + # avoid specific segfault on some older version.pm versions + die "Invalid version: $version" if $version eq 'version'; + $vobj = version->new($version); + }; + if ( my $err = $@ ) { + my $hook = $self->{bad_version_hook}; + $vobj = eval { $hook->($version, $module) } + if ref $hook eq 'CODE'; + unless (eval { $vobj->isa("version") }) { + $err =~ s{ at .* line \d+.*$}{}; + die "Can't convert '$version': $err"; + } + } + } + + # ensure no leading '.' + if ( $vobj =~ m{\A\.} ) { + $vobj = version->new("0$vobj"); + } + + # ensure normal v-string form + if ( _is_qv($vobj) ) { + $vobj = version->new($vobj->normal); + } + + return $vobj; +} + +#pod =method add_minimum +#pod +#pod $req->add_minimum( $module => $version ); +#pod +#pod This adds a new minimum version requirement. If the new requirement is +#pod redundant to the existing specification, this has no effect. +#pod +#pod Minimum requirements are inclusive. C<$version> is required, along with any +#pod greater version number. +#pod +#pod This method returns the requirements object. +#pod +#pod =method add_maximum +#pod +#pod $req->add_maximum( $module => $version ); +#pod +#pod This adds a new maximum version requirement. If the new requirement is +#pod redundant to the existing specification, this has no effect. +#pod +#pod Maximum requirements are inclusive. No version strictly greater than the given +#pod version is allowed. +#pod +#pod This method returns the requirements object. +#pod +#pod =method add_exclusion +#pod +#pod $req->add_exclusion( $module => $version ); +#pod +#pod This adds a new excluded version. For example, you might use these three +#pod method calls: +#pod +#pod $req->add_minimum( $module => '1.00' ); +#pod $req->add_maximum( $module => '1.82' ); +#pod +#pod $req->add_exclusion( $module => '1.75' ); +#pod +#pod Any version between 1.00 and 1.82 inclusive would be acceptable, except for +#pod 1.75. +#pod +#pod This method returns the requirements object. +#pod +#pod =method exact_version +#pod +#pod $req->exact_version( $module => $version ); +#pod +#pod This sets the version required for the given module to I<exactly> the given +#pod version. No other version would be considered acceptable. +#pod +#pod This method returns the requirements object. +#pod +#pod =cut + +BEGIN { + for my $type (qw(maximum exclusion exact_version)) { + my $method = "with_$type"; + my $to_add = $type eq 'exact_version' ? $type : "add_$type"; + + my $code = sub { + my ($self, $name, $version) = @_; + + $version = $self->_version_object( $name, $version ); + + $self->__modify_entry_for($name, $method, $version); + + return $self; + }; + + no strict 'refs'; + *$to_add = $code; + } +} + +# add_minimum is optimized compared to generated subs above because +# it is called frequently and with "0" or equivalent input +sub add_minimum { + my ($self, $name, $version) = @_; + + # stringify $version so that version->new("0.00")->stringify ne "0" + # which preserves the user's choice of "0.00" as the requirement + if (not defined $version or "$version" eq '0') { + return $self if $self->__entry_for($name); + Carp::confess("can't add new requirements to finalized requirements") + if $self->is_finalized; + + $self->{requirements}{ $name } = + CPAN::Meta::Requirements::_Range::Range->with_minimum($V0, $name); + } + else { + $version = $self->_version_object( $name, $version ); + + $self->__modify_entry_for($name, 'with_minimum', $version); + } + return $self; +} + +#pod =method add_requirements +#pod +#pod $req->add_requirements( $another_req_object ); +#pod +#pod This method adds all the requirements in the given CPAN::Meta::Requirements +#pod object to the requirements object on which it was called. If there are any +#pod conflicts, an exception is thrown. +#pod +#pod This method returns the requirements object. +#pod +#pod =cut + +sub add_requirements { + my ($self, $req) = @_; + + for my $module ($req->required_modules) { + my $modifiers = $req->__entry_for($module)->as_modifiers; + for my $modifier (@$modifiers) { + my ($method, @args) = @$modifier; + $self->$method($module => @args); + }; + } + + return $self; +} + +#pod =method accepts_module +#pod +#pod my $bool = $req->accepts_module($module => $version); +#pod +#pod Given an module and version, this method returns true if the version +#pod specification for the module accepts the provided version. In other words, +#pod given: +#pod +#pod Module => '>= 1.00, < 2.00' +#pod +#pod We will accept 1.00 and 1.75 but not 0.50 or 2.00. +#pod +#pod For modules that do not appear in the requirements, this method will return +#pod true. +#pod +#pod =cut + +sub accepts_module { + my ($self, $module, $version) = @_; + + $version = $self->_version_object( $module, $version ); + + return 1 unless my $range = $self->__entry_for($module); + return $range->_accepts($version); +} + +#pod =method clear_requirement +#pod +#pod $req->clear_requirement( $module ); +#pod +#pod This removes the requirement for a given module from the object. +#pod +#pod This method returns the requirements object. +#pod +#pod =cut + +sub clear_requirement { + my ($self, $module) = @_; + + return $self unless $self->__entry_for($module); + + Carp::confess("can't clear requirements on finalized requirements") + if $self->is_finalized; + + delete $self->{requirements}{ $module }; + + return $self; +} + +#pod =method requirements_for_module +#pod +#pod $req->requirements_for_module( $module ); +#pod +#pod This returns a string containing the version requirements for a given module in +#pod the format described in L<CPAN::Meta::Spec> or undef if the given module has no +#pod requirements. This should only be used for informational purposes such as error +#pod messages and should not be interpreted or used for comparison (see +#pod L</accepts_module> instead). +#pod +#pod =cut + +sub requirements_for_module { + my ($self, $module) = @_; + my $entry = $self->__entry_for($module); + return unless $entry; + return $entry->as_string; +} + +#pod =method structured_requirements_for_module +#pod +#pod $req->structured_requirements_for_module( $module ); +#pod +#pod This returns a data structure containing the version requirements for a given +#pod module or undef if the given module has no requirements. This should +#pod not be used for version checks (see L</accepts_module> instead). +#pod +#pod Added in version 2.134. +#pod +#pod =cut + +sub structured_requirements_for_module { + my ($self, $module) = @_; + my $entry = $self->__entry_for($module); + return unless $entry; + return $entry->as_struct; +} + +#pod =method required_modules +#pod +#pod This method returns a list of all the modules for which requirements have been +#pod specified. +#pod +#pod =cut + +sub required_modules { keys %{ $_[0]{requirements} } } + +#pod =method clone +#pod +#pod $req->clone; +#pod +#pod This method returns a clone of the invocant. The clone and the original object +#pod can then be changed independent of one another. +#pod +#pod =cut + +sub clone { + my ($self) = @_; + my $new = (ref $self)->new; + + return $new->add_requirements($self); +} + +sub __entry_for { $_[0]{requirements}{ $_[1] } } + +sub __modify_entry_for { + my ($self, $name, $method, $version) = @_; + + my $fin = $self->is_finalized; + my $old = $self->__entry_for($name); + + Carp::confess("can't add new requirements to finalized requirements") + if $fin and not $old; + + my $new = ($old || 'CPAN::Meta::Requirements::_Range::Range') + ->$method($version, $name); + + Carp::confess("can't modify finalized requirements") + if $fin and $old->as_string ne $new->as_string; + + $self->{requirements}{ $name } = $new; +} + +#pod =method is_simple +#pod +#pod This method returns true if and only if all requirements are inclusive minimums +#pod -- that is, if their string expression is just the version number. +#pod +#pod =cut + +sub is_simple { + my ($self) = @_; + for my $module ($self->required_modules) { + # XXX: This is a complete hack, but also entirely correct. + return if $self->__entry_for($module)->as_string =~ /\s/; + } + + return 1; +} + +#pod =method is_finalized +#pod +#pod This method returns true if the requirements have been finalized by having the +#pod C<finalize> method called on them. +#pod +#pod =cut + +sub is_finalized { $_[0]{finalized} } + +#pod =method finalize +#pod +#pod This method marks the requirements finalized. Subsequent attempts to change +#pod the requirements will be fatal, I<if> they would result in a change. If they +#pod would not alter the requirements, they have no effect. +#pod +#pod If a finalized set of requirements is cloned, the cloned requirements are not +#pod also finalized. +#pod +#pod =cut + +sub finalize { $_[0]{finalized} = 1 } + +#pod =method as_string_hash +#pod +#pod This returns a reference to a hash describing the requirements using the +#pod strings in the L<CPAN::Meta::Spec> specification. +#pod +#pod For example after the following program: +#pod +#pod my $req = CPAN::Meta::Requirements->new; +#pod +#pod $req->add_minimum('CPAN::Meta::Requirements' => 0.102); +#pod +#pod $req->add_minimum('Library::Foo' => 1.208); +#pod +#pod $req->add_maximum('Library::Foo' => 2.602); +#pod +#pod $req->add_minimum('Module::Bar' => 'v1.2.3'); +#pod +#pod $req->add_exclusion('Module::Bar' => 'v1.2.8'); +#pod +#pod $req->exact_version('Xyzzy' => '6.01'); +#pod +#pod my $hashref = $req->as_string_hash; +#pod +#pod C<$hashref> would contain: +#pod +#pod { +#pod 'CPAN::Meta::Requirements' => '0.102', +#pod 'Library::Foo' => '>= 1.208, <= 2.206', +#pod 'Module::Bar' => '>= v1.2.3, != v1.2.8', +#pod 'Xyzzy' => '== 6.01', +#pod } +#pod +#pod =cut + +sub as_string_hash { + my ($self) = @_; + + my %hash = map {; $_ => $self->{requirements}{$_}->as_string } + $self->required_modules; + + return \%hash; +} + +#pod =method add_string_requirement +#pod +#pod $req->add_string_requirement('Library::Foo' => '>= 1.208, <= 2.206'); +#pod $req->add_string_requirement('Library::Foo' => v1.208); +#pod +#pod This method parses the passed in string and adds the appropriate requirement +#pod for the given module. A version can be a Perl "v-string". It understands +#pod version ranges as described in the L<CPAN::Meta::Spec/Version Ranges>. For +#pod example: +#pod +#pod =over 4 +#pod +#pod =item 1.3 +#pod +#pod =item >= 1.3 +#pod +#pod =item <= 1.3 +#pod +#pod =item == 1.3 +#pod +#pod =item != 1.3 +#pod +#pod =item > 1.3 +#pod +#pod =item < 1.3 +#pod +#pod =item >= 1.3, != 1.5, <= 2.0 +#pod +#pod A version number without an operator is equivalent to specifying a minimum +#pod (C<E<gt>=>). Extra whitespace is allowed. +#pod +#pod =back +#pod +#pod =cut + +my %methods_for_op = ( + '==' => [ qw(exact_version) ], + '!=' => [ qw(add_exclusion) ], + '>=' => [ qw(add_minimum) ], + '<=' => [ qw(add_maximum) ], + '>' => [ qw(add_minimum add_exclusion) ], + '<' => [ qw(add_maximum add_exclusion) ], +); + +sub add_string_requirement { + my ($self, $module, $req) = @_; + + unless ( defined $req && length $req ) { + $req = 0; + $self->_blank_carp($module); + } + + my $magic = _find_magic_vstring( $req ); + if (length $magic) { + $self->add_minimum($module => $magic); + return; + } + + my @parts = split qr{\s*,\s*}, $req; + + for my $part (@parts) { + my ($op, $ver) = $part =~ m{\A\s*(==|>=|>|<=|<|!=)\s*(.*)\z}; + + if (! defined $op) { + $self->add_minimum($module => $part); + } else { + Carp::confess("illegal requirement string: $req") + unless my $methods = $methods_for_op{ $op }; + + $self->$_($module => $ver) for @$methods; + } + } +} + +#pod =method from_string_hash +#pod +#pod my $req = CPAN::Meta::Requirements->from_string_hash( \%hash ); +#pod my $req = CPAN::Meta::Requirements->from_string_hash( \%hash, \%opts ); +#pod +#pod This is an alternate constructor for a CPAN::Meta::Requirements +#pod object. It takes a hash of module names and version requirement +#pod strings and returns a new CPAN::Meta::Requirements object. As with +#pod add_string_requirement, a version can be a Perl "v-string". Optionally, +#pod you can supply a hash-reference of options, exactly as with the L</new> +#pod method. +#pod +#pod =cut + +sub _blank_carp { + my ($self, $module) = @_; + Carp::carp("Undefined requirement for $module treated as '0'"); +} + +sub from_string_hash { + my ($class, $hash, $options) = @_; + + my $self = $class->new($options); + + for my $module (keys %$hash) { + my $req = $hash->{$module}; + unless ( defined $req && length $req ) { + $req = 0; + $class->_blank_carp($module); + } + $self->add_string_requirement($module, $req); + } + + return $self; +} + +############################################################## + +{ + package + CPAN::Meta::Requirements::_Range::Exact; + sub _new { bless { version => $_[1] } => $_[0] } + + sub _accepts { return $_[0]{version} == $_[1] } + + sub as_string { return "== $_[0]{version}" } + + sub as_struct { return [ [ '==', "$_[0]{version}" ] ] } + + sub as_modifiers { return [ [ exact_version => $_[0]{version} ] ] } + + sub _reject_requirements { + my ($self, $module, $error) = @_; + Carp::confess("illegal requirements for $module: $error") + } + + sub _clone { + (ref $_[0])->_new( version->new( $_[0]{version} ) ) + } + + sub with_exact_version { + my ($self, $version, $module) = @_; + $module = 'module' unless defined $module; + + return $self->_clone if $self->_accepts($version); + + $self->_reject_requirements( + $module, + "can't be exactly $version when exact requirement is already $self->{version}", + ); + } + + sub with_minimum { + my ($self, $minimum, $module) = @_; + $module = 'module' unless defined $module; + + return $self->_clone if $self->{version} >= $minimum; + $self->_reject_requirements( + $module, + "minimum $minimum exceeds exact specification $self->{version}", + ); + } + + sub with_maximum { + my ($self, $maximum, $module) = @_; + $module = 'module' unless defined $module; + + return $self->_clone if $self->{version} <= $maximum; + $self->_reject_requirements( + $module, + "maximum $maximum below exact specification $self->{version}", + ); + } + + sub with_exclusion { + my ($self, $exclusion, $module) = @_; + $module = 'module' unless defined $module; + + return $self->_clone unless $exclusion == $self->{version}; + $self->_reject_requirements( + $module, + "tried to exclude $exclusion, which is already exactly specified", + ); + } +} + +############################################################## + +{ + package + CPAN::Meta::Requirements::_Range::Range; + + sub _self { ref($_[0]) ? $_[0] : (bless { } => $_[0]) } + + sub _clone { + return (bless { } => $_[0]) unless ref $_[0]; + + my ($s) = @_; + my %guts = ( + (exists $s->{minimum} ? (minimum => version->new($s->{minimum})) : ()), + (exists $s->{maximum} ? (maximum => version->new($s->{maximum})) : ()), + + (exists $s->{exclusions} + ? (exclusions => [ map { version->new($_) } @{ $s->{exclusions} } ]) + : ()), + ); + + bless \%guts => ref($s); + } + + sub as_modifiers { + my ($self) = @_; + my @mods; + push @mods, [ add_minimum => $self->{minimum} ] if exists $self->{minimum}; + push @mods, [ add_maximum => $self->{maximum} ] if exists $self->{maximum}; + push @mods, map {; [ add_exclusion => $_ ] } @{$self->{exclusions} || []}; + return \@mods; + } + + sub as_struct { + my ($self) = @_; + + return 0 if ! keys %$self; + + my @exclusions = @{ $self->{exclusions} || [] }; + + my @parts; + + for my $tuple ( + [ qw( >= > minimum ) ], + [ qw( <= < maximum ) ], + ) { + my ($op, $e_op, $k) = @$tuple; + if (exists $self->{$k}) { + my @new_exclusions = grep { $_ != $self->{ $k } } @exclusions; + if (@new_exclusions == @exclusions) { + push @parts, [ $op, "$self->{ $k }" ]; + } else { + push @parts, [ $e_op, "$self->{ $k }" ]; + @exclusions = @new_exclusions; + } + } + } + + push @parts, map {; [ "!=", "$_" ] } @exclusions; + + return \@parts; + } + + sub as_string { + my ($self) = @_; + + my @parts = @{ $self->as_struct }; + + return $parts[0][1] if @parts == 1 and $parts[0][0] eq '>='; + + return join q{, }, map {; join q{ }, @$_ } @parts; + } + + sub _reject_requirements { + my ($self, $module, $error) = @_; + Carp::confess("illegal requirements for $module: $error") + } + + sub with_exact_version { + my ($self, $version, $module) = @_; + $module = 'module' unless defined $module; + $self = $self->_clone; + + unless ($self->_accepts($version)) { + $self->_reject_requirements( + $module, + "exact specification $version outside of range " . $self->as_string + ); + } + + return CPAN::Meta::Requirements::_Range::Exact->_new($version); + } + + sub _simplify { + my ($self, $module) = @_; + + if (defined $self->{minimum} and defined $self->{maximum}) { + if ($self->{minimum} == $self->{maximum}) { + if (grep { $_ == $self->{minimum} } @{ $self->{exclusions} || [] }) { + $self->_reject_requirements( + $module, + "minimum and maximum are both $self->{minimum}, which is excluded", + ); + } + + return CPAN::Meta::Requirements::_Range::Exact->_new($self->{minimum}) + } + + if ($self->{minimum} > $self->{maximum}) { + $self->_reject_requirements( + $module, + "minimum $self->{minimum} exceeds maximum $self->{maximum}", + ); + } + } + + # eliminate irrelevant exclusions + if ($self->{exclusions}) { + my %seen; + @{ $self->{exclusions} } = grep { + (! defined $self->{minimum} or $_ >= $self->{minimum}) + and + (! defined $self->{maximum} or $_ <= $self->{maximum}) + and + ! $seen{$_}++ + } @{ $self->{exclusions} }; + } + + return $self; + } + + sub with_minimum { + my ($self, $minimum, $module) = @_; + $module = 'module' unless defined $module; + $self = $self->_clone; + + if (defined (my $old_min = $self->{minimum})) { + $self->{minimum} = (sort { $b cmp $a } ($minimum, $old_min))[0]; + } else { + $self->{minimum} = $minimum; + } + + return $self->_simplify($module); + } + + sub with_maximum { + my ($self, $maximum, $module) = @_; + $module = 'module' unless defined $module; + $self = $self->_clone; + + if (defined (my $old_max = $self->{maximum})) { + $self->{maximum} = (sort { $a cmp $b } ($maximum, $old_max))[0]; + } else { + $self->{maximum} = $maximum; + } + + return $self->_simplify($module); + } + + sub with_exclusion { + my ($self, $exclusion, $module) = @_; + $module = 'module' unless defined $module; + $self = $self->_clone; + + push @{ $self->{exclusions} ||= [] }, $exclusion; + + return $self->_simplify($module); + } + + sub _accepts { + my ($self, $version) = @_; + + return if defined $self->{minimum} and $version < $self->{minimum}; + return if defined $self->{maximum} and $version > $self->{maximum}; + return if defined $self->{exclusions} + and grep { $version == $_ } @{ $self->{exclusions} }; + + return 1; + } +} + +1; +# vim: ts=2 sts=2 sw=2 et: + +__END__ + +use 5.008001; # sane UTF-8 support +use strict; +use warnings; +package CPAN::Meta::YAML; # git description: v1.68-2-gcc5324e +# XXX-INGY is 5.8.1 too old/broken for utf8? +# XXX-XDG Lancaster consensus was that it was sufficient until +# proven otherwise +$CPAN::Meta::YAML::VERSION = '0.018'; +; # original $VERSION removed by Doppelgaenger + +##################################################################### +# The CPAN::Meta::YAML API. +# +# These are the currently documented API functions/methods and +# exports: + +use Exporter; +our @ISA = qw{ Exporter }; +our @EXPORT = qw{ Load Dump }; +our @EXPORT_OK = qw{ LoadFile DumpFile freeze thaw }; + +### +# Functional/Export API: + +sub Dump { + return CPAN::Meta::YAML->new(@_)->_dump_string; +} + +# XXX-INGY Returning last document seems a bad behavior. +# XXX-XDG I think first would seem more natural, but I don't know +# that it's worth changing now +sub Load { + my $self = CPAN::Meta::YAML->_load_string(@_); + if ( wantarray ) { + return @$self; + } else { + # To match YAML.pm, return the last document + return $self->[-1]; + } +} + +# XXX-INGY Do we really need freeze and thaw? +# XXX-XDG I don't think so. I'd support deprecating them. +BEGIN { + *freeze = \&Dump; + *thaw = \&Load; +} + +sub DumpFile { + my $file = shift; + return CPAN::Meta::YAML->new(@_)->_dump_file($file); +} + +sub LoadFile { + my $file = shift; + my $self = CPAN::Meta::YAML->_load_file($file); + if ( wantarray ) { + return @$self; + } else { + # Return only the last document to match YAML.pm, + return $self->[-1]; + } +} + + +### +# Object Oriented API: + +# Create an empty CPAN::Meta::YAML object +# XXX-INGY Why do we use ARRAY object? +# NOTE: I get it now, but I think it's confusing and not needed. +# Will change it on a branch later, for review. +# +# XXX-XDG I don't support changing it yet. It's a very well-documented +# "API" of CPAN::Meta::YAML. I'd support deprecating it, but Adam suggested +# we not change it until YAML.pm's own OO API is established so that +# users only have one API change to digest, not two +sub new { + my $class = shift; + bless [ @_ ], $class; +} + +# XXX-INGY It probably doesn't matter, and it's probably too late to +# change, but 'read/write' are the wrong names. Read and Write +# are actions that take data from storage to memory +# characters/strings. These take the data to/from storage to native +# Perl objects, which the terms dump and load are meant. As long as +# this is a legacy quirk to CPAN::Meta::YAML it's ok, but I'd prefer not +# to add new {read,write}_* methods to this API. + +sub read_string { + my $self = shift; + $self->_load_string(@_); +} + +sub write_string { + my $self = shift; + $self->_dump_string(@_); +} + +sub read { + my $self = shift; + $self->_load_file(@_); +} + +sub write { + my $self = shift; + $self->_dump_file(@_); +} + + + + +##################################################################### +# Constants + +# Printed form of the unprintable characters in the lowest range +# of ASCII characters, listed by ASCII ordinal position. +my @UNPRINTABLE = qw( + 0 x01 x02 x03 x04 x05 x06 a + b t n v f r x0E x0F + x10 x11 x12 x13 x14 x15 x16 x17 + x18 x19 x1A e x1C x1D x1E x1F +); + +# Printable characters for escapes +my %UNESCAPES = ( + 0 => "\x00", z => "\x00", N => "\x85", + a => "\x07", b => "\x08", t => "\x09", + n => "\x0a", v => "\x0b", f => "\x0c", + r => "\x0d", e => "\x1b", '\\' => '\\', +); + +# XXX-INGY +# I(ngy) need to decide if these values should be quoted in +# CPAN::Meta::YAML or not. Probably yes. + +# These 3 values have special meaning when unquoted and using the +# default YAML schema. They need quotes if they are strings. +my %QUOTE = map { $_ => 1 } qw{ + null true false +}; + +# The commented out form is simpler, but overloaded the Perl regex +# engine due to recursion and backtracking problems on strings +# larger than 32,000ish characters. Keep it for reference purposes. +# qr/\"((?:\\.|[^\"])*)\"/ +my $re_capture_double_quoted = qr/\"([^\\"]*(?:\\.[^\\"]*)*)\"/; +my $re_capture_single_quoted = qr/\'([^\']*(?:\'\'[^\']*)*)\'/; +# unquoted re gets trailing space that needs to be stripped +my $re_capture_unquoted_key = qr/([^:]+(?::+\S(?:[^:]*|.*?(?=:)))*)(?=\s*\:(?:\s+|$))/; +my $re_trailing_comment = qr/(?:\s+\#.*)?/; +my $re_key_value_separator = qr/\s*:(?:\s+(?:\#.*)?|$)/; + + + + + +##################################################################### +# CPAN::Meta::YAML Implementation. +# +# These are the private methods that do all the work. They may change +# at any time. + + +### +# Loader functions: + +# Create an object from a file +sub _load_file { + my $class = ref $_[0] ? ref shift : shift; + + # Check the file + my $file = shift or $class->_error( 'You did not specify a file name' ); + $class->_error( "File '$file' does not exist" ) + unless -e $file; + $class->_error( "'$file' is a directory, not a file" ) + unless -f _; + $class->_error( "Insufficient permissions to read '$file'" ) + unless -r _; + + # Open unbuffered with strict UTF-8 decoding and no translation layers + open( my $fh, "<:unix:encoding(UTF-8)", $file ); + unless ( $fh ) { + $class->_error("Failed to open file '$file': $!"); + } + + # flock if available (or warn if not possible for OS-specific reasons) + if ( _can_flock() ) { + flock( $fh, Fcntl::LOCK_SH() ) + or warn "Couldn't lock '$file' for reading: $!"; + } + + # slurp the contents + my $contents = eval { + use warnings FATAL => 'utf8'; + local $/; + <$fh> + }; + if ( my $err = $@ ) { + $class->_error("Error reading from file '$file': $err"); + } + + # close the file (release the lock) + unless ( close $fh ) { + $class->_error("Failed to close file '$file': $!"); + } + + $class->_load_string( $contents ); +} + +# Create an object from a string +sub _load_string { + my $class = ref $_[0] ? ref shift : shift; + my $self = bless [], $class; + my $string = $_[0]; + eval { + unless ( defined $string ) { + die \"Did not provide a string to load"; + } + + # Check if Perl has it marked as characters, but it's internally + # inconsistent. E.g. maybe latin1 got read on a :utf8 layer + if ( utf8::is_utf8($string) && ! utf8::valid($string) ) { + die \<<'...'; +Read an invalid UTF-8 string (maybe mixed UTF-8 and 8-bit character set). +Did you decode with lax ":utf8" instead of strict ":encoding(UTF-8)"? +... + } + + # Ensure Unicode character semantics, even for 0x80-0xff + utf8::upgrade($string); + + # Check for and strip any leading UTF-8 BOM + $string =~ s/^\x{FEFF}//; + + # Check for some special cases + return $self unless length $string; + + # Split the file into lines + my @lines = grep { ! /^\s*(?:\#.*)?\z/ } + split /(?:\015{1,2}\012|\015|\012)/, $string; + + # Strip the initial YAML header + @lines and $lines[0] =~ /^\%YAML[: ][\d\.]+.*\z/ and shift @lines; + + # A nibbling parser + my $in_document = 0; + while ( @lines ) { + # Do we have a document header? + if ( $lines[0] =~ /^---\s*(?:(.+)\s*)?\z/ ) { + # Handle scalar documents + shift @lines; + if ( defined $1 and $1 !~ /^(?:\#.+|\%YAML[: ][\d\.]+)\z/ ) { + push @$self, + $self->_load_scalar( "$1", [ undef ], \@lines ); + next; + } + $in_document = 1; + } + + if ( ! @lines or $lines[0] =~ /^(?:---|\.\.\.)/ ) { + # A naked document + push @$self, undef; + while ( @lines and $lines[0] !~ /^---/ ) { + shift @lines; + } + $in_document = 0; + + # XXX The final '-+$' is to look for -- which ends up being an + # error later. + } elsif ( ! $in_document && @$self ) { + # only the first document can be explicit + die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; + } elsif ( $lines[0] =~ /^\s*\-(?:\s|$|-+$)/ ) { + # An array at the root + my $document = [ ]; + push @$self, $document; + $self->_load_array( $document, [ 0 ], \@lines ); + + } elsif ( $lines[0] =~ /^(\s*)\S/ ) { + # A hash at the root + my $document = { }; + push @$self, $document; + $self->_load_hash( $document, [ length($1) ], \@lines ); + + } else { + # Shouldn't get here. @lines have whitespace-only lines + # stripped, and previous match is a line with any + # non-whitespace. So this clause should only be reachable via + # a perlbug where \s is not symmetric with \S + + # uncoverable statement + die \"CPAN::Meta::YAML failed to classify the line '$lines[0]'"; + } + } + }; + my $err = $@; + if ( ref $err eq 'SCALAR' ) { + $self->_error(${$err}); + } elsif ( $err ) { + $self->_error($err); + } + + return $self; +} + +sub _unquote_single { + my ($self, $string) = @_; + return '' unless length $string; + $string =~ s/\'\'/\'/g; + return $string; +} + +sub _unquote_double { + my ($self, $string) = @_; + return '' unless length $string; + $string =~ s/\\"/"/g; + $string =~ + s{\\([Nnever\\fartz0b]|x([0-9a-fA-F]{2}))} + {(length($1)>1)?pack("H2",$2):$UNESCAPES{$1}}gex; + return $string; +} + +# Load a YAML scalar string to the actual Perl scalar +sub _load_scalar { + my ($self, $string, $indent, $lines) = @_; + + # Trim trailing whitespace + $string =~ s/\s*\z//; + + # Explitic null/undef + return undef if $string eq '~'; + + # Single quote + if ( $string =~ /^$re_capture_single_quoted$re_trailing_comment\z/ ) { + return $self->_unquote_single($1); + } + + # Double quote. + if ( $string =~ /^$re_capture_double_quoted$re_trailing_comment\z/ ) { + return $self->_unquote_double($1); + } + + # Special cases + if ( $string =~ /^[\'\"!&]/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$string'"; + } + return {} if $string =~ /^{}(?:\s+\#.*)?\z/; + return [] if $string =~ /^\[\](?:\s+\#.*)?\z/; + + # Regular unquoted string + if ( $string !~ /^[>|]/ ) { + die \"CPAN::Meta::YAML found illegal characters in plain scalar: '$string'" + if $string =~ /^(?:-(?:\s|$)|[\@\%\`])/ or + $string =~ /:(?:\s|$)/; + $string =~ s/\s+#.*\z//; + return $string; + } + + # Error + die \"CPAN::Meta::YAML failed to find multi-line scalar content" unless @$lines; + + # Check the indent depth + $lines->[0] =~ /^(\s*)/; + $indent->[-1] = length("$1"); + if ( defined $indent->[-2] and $indent->[-1] <= $indent->[-2] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + # Pull the lines + my @multiline = (); + while ( @$lines ) { + $lines->[0] =~ /^(\s*)/; + last unless length($1) >= $indent->[-1]; + push @multiline, substr(shift(@$lines), length($1)); + } + + my $j = (substr($string, 0, 1) eq '>') ? ' ' : "\n"; + my $t = (substr($string, 1, 1) eq '-') ? '' : "\n"; + return join( $j, @multiline ) . $t; +} + +# Load an array +sub _load_array { + my ($self, $array, $indent, $lines) = @_; + + while ( @$lines ) { + # Check for a new document + if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { + while ( @$lines and $lines->[0] !~ /^---/ ) { + shift @$lines; + } + return 1; + } + + # Check the indent level + $lines->[0] =~ /^(\s*)/; + if ( length($1) < $indent->[-1] ) { + return 1; + } elsif ( length($1) > $indent->[-1] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + if ( $lines->[0] =~ /^(\s*\-\s+)[^\'\"]\S*\s*:(?:\s+|$)/ ) { + # Inline nested hash + my $indent2 = length("$1"); + $lines->[0] =~ s/-/ /; + push @$array, { }; + $self->_load_hash( $array->[-1], [ @$indent, $indent2 ], $lines ); + + } elsif ( $lines->[0] =~ /^\s*\-\s*\z/ ) { + shift @$lines; + unless ( @$lines ) { + push @$array, undef; + return 1; + } + if ( $lines->[0] =~ /^(\s*)\-/ ) { + my $indent2 = length("$1"); + if ( $indent->[-1] == $indent2 ) { + # Null array entry + push @$array, undef; + } else { + # Naked indenter + push @$array, [ ]; + $self->_load_array( + $array->[-1], [ @$indent, $indent2 ], $lines + ); + } + + } elsif ( $lines->[0] =~ /^(\s*)\S/ ) { + push @$array, { }; + $self->_load_hash( + $array->[-1], [ @$indent, length("$1") ], $lines + ); + + } else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + + } elsif ( $lines->[0] =~ /^\s*\-(\s*)(.+?)\s*\z/ ) { + # Array entry with a value + shift @$lines; + push @$array, $self->_load_scalar( + "$2", [ @$indent, undef ], $lines + ); + + } elsif ( defined $indent->[-2] and $indent->[-1] == $indent->[-2] ) { + # This is probably a structure like the following... + # --- + # foo: + # - list + # bar: value + # + # ... so lets return and let the hash parser handle it + return 1; + + } else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + } + + return 1; +} + +# Load a hash +sub _load_hash { + my ($self, $hash, $indent, $lines) = @_; + + while ( @$lines ) { + # Check for a new document + if ( $lines->[0] =~ /^(?:---|\.\.\.)/ ) { + while ( @$lines and $lines->[0] !~ /^---/ ) { + shift @$lines; + } + return 1; + } + + # Check the indent level + $lines->[0] =~ /^(\s*)/; + if ( length($1) < $indent->[-1] ) { + return 1; + } elsif ( length($1) > $indent->[-1] ) { + die \"CPAN::Meta::YAML found bad indenting in line '$lines->[0]'"; + } + + # Find the key + my $key; + + # Quoted keys + if ( $lines->[0] =~ + s/^\s*$re_capture_single_quoted$re_key_value_separator// + ) { + $key = $self->_unquote_single($1); + } + elsif ( $lines->[0] =~ + s/^\s*$re_capture_double_quoted$re_key_value_separator// + ) { + $key = $self->_unquote_double($1); + } + elsif ( $lines->[0] =~ + s/^\s*$re_capture_unquoted_key$re_key_value_separator// + ) { + $key = $1; + $key =~ s/\s+$//; + } + elsif ( $lines->[0] =~ /^\s*\?/ ) { + die \"CPAN::Meta::YAML does not support a feature in line '$lines->[0]'"; + } + else { + die \"CPAN::Meta::YAML failed to classify line '$lines->[0]'"; + } + + if ( exists $hash->{$key} ) { + warn "CPAN::Meta::YAML found a duplicate key '$key' in line '$lines->[0]'"; + } + + # Do we have a value? + if ( length $lines->[0] ) { + # Yes + $hash->{$key} = $self->_load_scalar( + shift(@$lines), [ @$indent, undef ], $lines + ); + } else { + # An indent + shift @$lines; + unless ( @$lines ) { + $hash->{$key} = undef; + return 1; + } + if ( $lines->[0] =~ /^(\s*)-/ ) { + $hash->{$key} = []; + $self->_load_array( + $hash->{$key}, [ @$indent, length($1) ], $lines + ); + } elsif ( $lines->[0] =~ /^(\s*)./ ) { + my $indent2 = length("$1"); + if ( $indent->[-1] >= $indent2 ) { + # Null hash entry + $hash->{$key} = undef; + } else { + $hash->{$key} = {}; + $self->_load_hash( + $hash->{$key}, [ @$indent, length($1) ], $lines + ); + } + } + } + } + + return 1; +} + + +### +# Dumper functions: + +# Save an object to a file +sub _dump_file { + my $self = shift; + + require Fcntl; + + # Check the file + my $file = shift or $self->_error( 'You did not specify a file name' ); + + my $fh; + # flock if available (or warn if not possible for OS-specific reasons) + if ( _can_flock() ) { + # Open without truncation (truncate comes after lock) + my $flags = Fcntl::O_WRONLY()|Fcntl::O_CREAT(); + sysopen( $fh, $file, $flags ); + unless ( $fh ) { + $self->_error("Failed to open file '$file' for writing: $!"); + } + + # Use no translation and strict UTF-8 + binmode( $fh, ":raw:encoding(UTF-8)"); + + flock( $fh, Fcntl::LOCK_EX() ) + or warn "Couldn't lock '$file' for reading: $!"; + + # truncate and spew contents + truncate $fh, 0; + seek $fh, 0, 0; + } + else { + open $fh, ">:unix:encoding(UTF-8)", $file; + } + + # serialize and spew to the handle + print {$fh} $self->_dump_string; + + # close the file (release the lock) + unless ( close $fh ) { + $self->_error("Failed to close file '$file': $!"); + } + + return 1; +} + +# Save an object to a string +sub _dump_string { + my $self = shift; + return '' unless ref $self && @$self; + + # Iterate over the documents + my $indent = 0; + my @lines = (); + + eval { + foreach my $cursor ( @$self ) { + push @lines, '---'; + + # An empty document + if ( ! defined $cursor ) { + # Do nothing + + # A scalar document + } elsif ( ! ref $cursor ) { + $lines[-1] .= ' ' . $self->_dump_scalar( $cursor ); + + # A list at the root + } elsif ( ref $cursor eq 'ARRAY' ) { + unless ( @$cursor ) { + $lines[-1] .= ' []'; + next; + } + push @lines, $self->_dump_array( $cursor, $indent, {} ); + + # A hash at the root + } elsif ( ref $cursor eq 'HASH' ) { + unless ( %$cursor ) { + $lines[-1] .= ' {}'; + next; + } + push @lines, $self->_dump_hash( $cursor, $indent, {} ); + + } else { + die \("Cannot serialize " . ref($cursor)); + } + } + }; + if ( ref $@ eq 'SCALAR' ) { + $self->_error(${$@}); + } elsif ( $@ ) { + $self->_error($@); + } + + join '', map { "$_\n" } @lines; +} + +sub _has_internal_string_value { + my $value = shift; + my $b_obj = B::svref_2object(\$value); # for round trip problem + return $b_obj->FLAGS & B::SVf_POK(); +} + +sub _dump_scalar { + my $string = $_[1]; + my $is_key = $_[2]; + # Check this before checking length or it winds up looking like a string! + my $has_string_flag = _has_internal_string_value($string); + return '~' unless defined $string; + return "''" unless length $string; + if (Scalar::Util::looks_like_number($string)) { + # keys and values that have been used as strings get quoted + if ( $is_key || $has_string_flag ) { + return qq['$string']; + } + else { + return $string; + } + } + if ( $string =~ /[\x00-\x09\x0b-\x0d\x0e-\x1f\x7f-\x9f\'\n]/ ) { + $string =~ s/\\/\\\\/g; + $string =~ s/"/\\"/g; + $string =~ s/\n/\\n/g; + $string =~ s/[\x85]/\\N/g; + $string =~ s/([\x00-\x1f])/\\$UNPRINTABLE[ord($1)]/g; + $string =~ s/([\x7f-\x9f])/'\x' . sprintf("%X",ord($1))/ge; + return qq|"$string"|; + } + if ( $string =~ /(?:^[~!@#%&*|>?:,'"`{}\[\]]|^-+$|\s|:\z)/ or + $QUOTE{$string} + ) { + return "'$string'"; + } + return $string; +} + +sub _dump_array { + my ($self, $array, $indent, $seen) = @_; + if ( $seen->{refaddr($array)}++ ) { + die \"CPAN::Meta::YAML does not support circular references"; + } + my @lines = (); + foreach my $el ( @$array ) { + my $line = (' ' x $indent) . '-'; + my $type = ref $el; + if ( ! $type ) { + $line .= ' ' . $self->_dump_scalar( $el ); + push @lines, $line; + + } elsif ( $type eq 'ARRAY' ) { + if ( @$el ) { + push @lines, $line; + push @lines, $self->_dump_array( $el, $indent + 1, $seen ); + } else { + $line .= ' []'; + push @lines, $line; + } + + } elsif ( $type eq 'HASH' ) { + if ( keys %$el ) { + push @lines, $line; + push @lines, $self->_dump_hash( $el, $indent + 1, $seen ); + } else { + $line .= ' {}'; + push @lines, $line; + } + + } else { + die \"CPAN::Meta::YAML does not support $type references"; + } + } + + @lines; +} + +sub _dump_hash { + my ($self, $hash, $indent, $seen) = @_; + if ( $seen->{refaddr($hash)}++ ) { + die \"CPAN::Meta::YAML does not support circular references"; + } + my @lines = (); + foreach my $name ( sort keys %$hash ) { + my $el = $hash->{$name}; + my $line = (' ' x $indent) . $self->_dump_scalar($name, 1) . ":"; + my $type = ref $el; + if ( ! $type ) { + $line .= ' ' . $self->_dump_scalar( $el ); + push @lines, $line; + + } elsif ( $type eq 'ARRAY' ) { + if ( @$el ) { + push @lines, $line; + push @lines, $self->_dump_array( $el, $indent + 1, $seen ); + } else { + $line .= ' []'; + push @lines, $line; + } + + } elsif ( $type eq 'HASH' ) { + if ( keys %$el ) { + push @lines, $line; + push @lines, $self->_dump_hash( $el, $indent + 1, $seen ); + } else { + $line .= ' {}'; + push @lines, $line; + } + + } else { + die \"CPAN::Meta::YAML does not support $type references"; + } + } + + @lines; +} + + + +##################################################################### +# DEPRECATED API methods: + +# Error storage (DEPRECATED as of 1.57) +our $errstr = ''; + +# Set error +sub _error { + require Carp; + $errstr = $_[1]; + $errstr =~ s/ at \S+ line \d+.*//; + Carp::croak( $errstr ); +} + +# Retrieve error +my $errstr_warned; +sub errstr { + require Carp; + Carp::carp( "CPAN::Meta::YAML->errstr and \$CPAN::Meta::YAML::errstr is deprecated" ) + unless $errstr_warned++; + $errstr; +} + + + + +##################################################################### +# Helper functions. Possibly not needed. + + +# Use to detect nv or iv +use B; + +# XXX-INGY Is flock CPAN::Meta::YAML's responsibility? +# Some platforms can't flock :-( +# XXX-XDG I think it is. When reading and writing files, we ought +# to be locking whenever possible. People (foolishly) use YAML +# files for things like session storage, which has race issues. +my $HAS_FLOCK; +sub _can_flock { + if ( defined $HAS_FLOCK ) { + return $HAS_FLOCK; + } + else { + require Config; + my $c = \%Config::Config; + $HAS_FLOCK = grep { $c->{$_} } qw/d_flock d_fcntl_can_lock d_lockf/; + require Fcntl if $HAS_FLOCK; + return $HAS_FLOCK; + } +} + + +# XXX-INGY Is this core in 5.8.1? Can we remove this? +# XXX-XDG Scalar::Util 1.18 didn't land until 5.8.8, so we need this +##################################################################### +# Use Scalar::Util if possible, otherwise emulate it + +use Scalar::Util (); +BEGIN { + local $@; + if ( eval { Scalar::Util->VERSION(1.18); } ) { + *refaddr = *Scalar::Util::refaddr; + } + else { + eval <<'END_PERL'; +# Scalar::Util failed to load or too old +sub refaddr { + my $pkg = ref($_[0]) or return undef; + if ( !! UNIVERSAL::can($_[0], 'can') ) { + bless $_[0], 'Scalar::Util::Fake'; + } else { + $pkg = undef; + } + "$_[0]" =~ /0x(\w+)/; + my $i = do { no warnings 'portable'; hex $1 }; + bless $_[0], $pkg if defined $pkg; + $i; +} +END_PERL + } +} + +delete $CPAN::Meta::YAML::{refaddr}; + +1; + +# XXX-INGY Doc notes I'm putting up here. Changing the doc when it's wrong +# but leaving grey area stuff up here. +# +# I would like to change Read/Write to Load/Dump below without +# changing the actual API names. +# +# It might be better to put Load/Dump API in the SYNOPSIS instead of the +# dubious OO API. +# +# null and bool explanations may be outdated. + + +__END__ + + +# ABSTRACT: Read and write a subset of YAML for CPAN Meta files + + +use strict; +use warnings; + +package CPAN::Meta::Merge; + +our $VERSION = '2.150010'; + +use Carp qw/croak/; +use Scalar::Util qw/blessed/; +use CPAN::Meta::Converter 2.141170; + +sub _is_identical { + my ($left, $right) = @_; + return + (not defined $left and not defined $right) + # if either of these are references, we compare the serialized value + || (defined $left and defined $right and $left eq $right); +} + +sub _identical { + my ($left, $right, $path) = @_; + croak sprintf "Can't merge attribute %s: '%s' does not equal '%s'", join('.', @{$path}), $left, $right + unless _is_identical($left, $right); + return $left; +} + +sub _merge { + my ($current, $next, $mergers, $path) = @_; + for my $key (keys %{$next}) { + if (not exists $current->{$key}) { + $current->{$key} = $next->{$key}; + } + elsif (my $merger = $mergers->{$key}) { + $current->{$key} = $merger->($current->{$key}, $next->{$key}, [ @{$path}, $key ]); + } + elsif ($merger = $mergers->{':default'}) { + $current->{$key} = $merger->($current->{$key}, $next->{$key}, [ @{$path}, $key ]); + } + else { + croak sprintf "Can't merge unknown attribute '%s'", join '.', @{$path}, $key; + } + } + return $current; +} + +sub _uniq { + my %seen = (); + return grep { not $seen{$_}++ } @_; +} + +sub _set_addition { + my ($left, $right) = @_; + return [ +_uniq(@{$left}, @{$right}) ]; +} + +sub _uniq_map { + my ($left, $right, $path) = @_; + for my $key (keys %{$right}) { + if (not exists $left->{$key}) { + $left->{$key} = $right->{$key}; + } + # identical strings or references are merged identically + elsif (_is_identical($left->{$key}, $right->{$key})) { + 1; # do nothing - keep left + } + elsif (ref $left->{$key} eq 'HASH' and ref $right->{$key} eq 'HASH') { + $left->{$key} = _uniq_map($left->{$key}, $right->{$key}, [ @{$path}, $key ]); + } + else { + croak 'Duplication of element ' . join '.', @{$path}, $key; + } + } + return $left; +} + +sub _improvise { + my ($left, $right, $path) = @_; + my ($name) = reverse @{$path}; + if ($name =~ /^x_/) { + if (ref($left) eq 'ARRAY') { + return _set_addition($left, $right, $path); + } + elsif (ref($left) eq 'HASH') { + return _uniq_map($left, $right, $path); + } + else { + return _identical($left, $right, $path); + } + } + croak sprintf "Can't merge '%s'", join '.', @{$path}; +} + +sub _optional_features { + my ($left, $right, $path) = @_; + + for my $key (keys %{$right}) { + if (not exists $left->{$key}) { + $left->{$key} = $right->{$key}; + } + else { + for my $subkey (keys %{ $right->{$key} }) { + next if $subkey eq 'prereqs'; + if (not exists $left->{$key}{$subkey}) { + $left->{$key}{$subkey} = $right->{$key}{$subkey}; + } + else { + Carp::croak "Cannot merge two optional_features named '$key' with different '$subkey' values" + if do { no warnings 'uninitialized'; $left->{$key}{$subkey} ne $right->{$key}{$subkey} }; + } + } + + require CPAN::Meta::Prereqs; + $left->{$key}{prereqs} = + CPAN::Meta::Prereqs->new($left->{$key}{prereqs}) + ->with_merged_prereqs(CPAN::Meta::Prereqs->new($right->{$key}{prereqs})) + ->as_string_hash; + } + } + return $left; +} + + +my %default = ( + abstract => \&_identical, + author => \&_set_addition, + dynamic_config => sub { + my ($left, $right) = @_; + return $left || $right; + }, + generated_by => sub { + my ($left, $right) = @_; + return join ', ', _uniq(split(/, /, $left), split(/, /, $right)); + }, + license => \&_set_addition, + 'meta-spec' => { + version => \&_identical, + url => \&_identical + }, + name => \&_identical, + release_status => \&_identical, + version => \&_identical, + description => \&_identical, + keywords => \&_set_addition, + no_index => { map { ($_ => \&_set_addition) } qw/file directory package namespace/ }, + optional_features => \&_optional_features, + prereqs => sub { + require CPAN::Meta::Prereqs; + my ($left, $right) = map { CPAN::Meta::Prereqs->new($_) } @_[0,1]; + return $left->with_merged_prereqs($right)->as_string_hash; + }, + provides => \&_uniq_map, + resources => { + license => \&_set_addition, + homepage => \&_identical, + bugtracker => \&_uniq_map, + repository => \&_uniq_map, + ':default' => \&_improvise, + }, + ':default' => \&_improvise, +); + +sub new { + my ($class, %arguments) = @_; + croak 'default version required' if not exists $arguments{default_version}; + my %mapping = %default; + my %extra = %{ $arguments{extra_mappings} || {} }; + for my $key (keys %extra) { + if (ref($mapping{$key}) eq 'HASH') { + $mapping{$key} = { %{ $mapping{$key} }, %{ $extra{$key} } }; + } + else { + $mapping{$key} = $extra{$key}; + } + } + return bless { + default_version => $arguments{default_version}, + mapping => _coerce_mapping(\%mapping, []), + }, $class; +} + +my %coderef_for = ( + set_addition => \&_set_addition, + uniq_map => \&_uniq_map, + identical => \&_identical, + improvise => \&_improvise, + improvize => \&_improvise, # [sic] for backwards compatibility +); + +sub _coerce_mapping { + my ($orig, $map_path) = @_; + my %ret; + for my $key (keys %{$orig}) { + my $value = $orig->{$key}; + if (ref($orig->{$key}) eq 'CODE') { + $ret{$key} = $value; + } + elsif (ref($value) eq 'HASH') { + my $mapping = _coerce_mapping($value, [ @{$map_path}, $key ]); + $ret{$key} = sub { + my ($left, $right, $path) = @_; + return _merge($left, $right, $mapping, [ @{$path} ]); + }; + } + elsif ($coderef_for{$value}) { + $ret{$key} = $coderef_for{$value}; + } + else { + croak "Don't know what to do with " . join '.', @{$map_path}, $key; + } + } + return \%ret; +} + +sub merge { + my ($self, @items) = @_; + my $current = {}; + for my $next (@items) { + if ( blessed($next) && $next->isa('CPAN::Meta') ) { + $next = $next->as_struct; + } + elsif ( ref($next) eq 'HASH' ) { + my $cmc = CPAN::Meta::Converter->new( + $next, default_version => $self->{default_version} + ); + $next = $cmc->upgrade_fragment; + } + else { + croak "Don't know how to merge '$next'"; + } + $current = _merge($current, $next, $self->{mapping}, []); + } + return $current; +} + +1; + +# ABSTRACT: Merging CPAN Meta fragments + + +# vim: ts=2 sts=2 sw=2 et : + +__END__ + +# XXX RULES FOR PATCHING THIS FILE XXX +# Patches that fix typos or formatting are acceptable. Patches +# that change semantics are not acceptable without prior approval +# by David Golden or Ricardo Signes. + +use 5.006; +use strict; +use warnings; +package CPAN::Meta::Spec; + +our $VERSION = '2.150010'; + +1; + +# ABSTRACT: specification for CPAN distribution metadata + + +# vi:tw=72 + +__END__ + +# -*- Mode: cperl; coding: utf-8; cperl-indent-level: 4 -*- +# vim: ts=4 sts=4 sw=4: +package CPAN::LWP::UserAgent; +use strict; +use vars qw(@ISA $USER $PASSWD $SETUPDONE); +use CPAN::HTTP::Credentials; +# we delay requiring LWP::UserAgent and setting up inheritance until we need it + +$CPAN::LWP::UserAgent::VERSION = $CPAN::LWP::UserAgent::VERSION = "1.9601"; + + +sub config { + return if $SETUPDONE; + if ($CPAN::META->has_usable('LWP::UserAgent')) { + require LWP::UserAgent; + @ISA = qw(Exporter LWP::UserAgent); ## no critic + $SETUPDONE++; + } else { + $CPAN::Frontend->mywarn(" LWP::UserAgent not available\n"); + } +} + +sub get_basic_credentials { + my($self, $realm, $uri, $proxy) = @_; + if ( $proxy ) { + return CPAN::HTTP::Credentials->get_proxy_credentials(); + } else { + return CPAN::HTTP::Credentials->get_non_proxy_credentials(); + } +} + +sub no_proxy { + my ( $self, $no_proxy ) = @_; + return $self->SUPER::no_proxy( split(',',$no_proxy) ); +} + +# mirror(): Its purpose is to deal with proxy authentication. When we +# call SUPER::mirror, we really call the mirror method in +# LWP::UserAgent. LWP::UserAgent will then call +# $self->get_basic_credentials or some equivalent and this will be +# $self->dispatched to our own get_basic_credentials method. + +# Our own get_basic_credentials sets $USER and $PASSWD, two globals. + +# 407 stands for HTTP_PROXY_AUTHENTICATION_REQUIRED. Which means +# although we have gone through our get_basic_credentials, the proxy +# server refuses to connect. This could be a case where the username or +# password has changed in the meantime, so I'm trying once again without +# $USER and $PASSWD to give the get_basic_credentials routine another +# chance to set $USER and $PASSWD. + +sub mirror { + my($self,$url,$aslocal) = @_; + my $result = $self->SUPER::mirror($url,$aslocal); + if ($result->code == 407) { + CPAN::HTTP::Credentials->clear_credentials; + $result = $self->SUPER::mirror($url,$aslocal); + } + $result; +} + +1; +package App::Cpan; + +use strict; +use warnings; +use vars qw($VERSION); + +use if $] < 5.008 => 'IO::Scalar'; + +$VERSION = '1.67'; + + +use autouse Carp => qw(carp croak cluck); +use CPAN 1.80 (); # needs no test +use Config; +use autouse Cwd => qw(cwd); +use autouse 'Data::Dumper' => qw(Dumper); +use File::Spec::Functions; +use File::Basename; +use Getopt::Std; + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# Internal constants +use constant TRUE => 1; +use constant FALSE => 0; + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# The return values +use constant HEY_IT_WORKED => 0; +use constant I_DONT_KNOW_WHAT_HAPPENED => 1; # 0b0000_0001 +use constant ITS_NOT_MY_FAULT => 2; +use constant THE_PROGRAMMERS_AN_IDIOT => 4; +use constant A_MODULE_FAILED_TO_INSTALL => 8; + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# set up the order of options that we layer over CPAN::Shell +BEGIN { # most of this should be in methods +use vars qw( @META_OPTIONS $Default %CPAN_METHODS @CPAN_OPTIONS @option_order + %Method_table %Method_table_index ); + +@META_OPTIONS = qw( h v V I g G M: C A D O l L a r p P j: J w x X ); + +$Default = 'default'; + +%CPAN_METHODS = ( # map switches to method names in CPAN::Shell + $Default => 'install', + 'c' => 'clean', + 'f' => 'force', + 'i' => 'install', + 'm' => 'make', + 't' => 'test', + 'u' => 'upgrade', + 'T' => 'notest', + 's' => 'shell', + ); +@CPAN_OPTIONS = grep { $_ ne $Default } sort keys %CPAN_METHODS; + +@option_order = ( @META_OPTIONS, @CPAN_OPTIONS ); + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# map switches to the subroutines in this script, along with other information. +# use this stuff instead of hard-coded indices and values +sub NO_ARGS () { 0 } +sub ARGS () { 1 } +sub GOOD_EXIT () { 0 } + +%Method_table = ( +# key => [ sub ref, takes args?, exit value, description ] + + # options that do their thing first, then exit + h => [ \&_print_help, NO_ARGS, GOOD_EXIT, 'Printing help' ], + v => [ \&_print_version, NO_ARGS, GOOD_EXIT, 'Printing version' ], + V => [ \&_print_details, NO_ARGS, GOOD_EXIT, 'Printing detailed version' ], + X => [ \&_list_all_namespaces, NO_ARGS, GOOD_EXIT, 'Listing all namespaces' ], + + # options that affect other options + j => [ \&_load_config, ARGS, GOOD_EXIT, 'Use specified config file' ], + J => [ \&_dump_config, NO_ARGS, GOOD_EXIT, 'Dump configuration to stdout' ], + F => [ \&_lock_lobotomy, NO_ARGS, GOOD_EXIT, 'Turn off CPAN.pm lock files' ], + I => [ \&_load_local_lib, NO_ARGS, GOOD_EXIT, 'Loading local::lib' ], + M => [ \&_use_these_mirrors, ARGS, GOOD_EXIT, 'Setting per session mirrors' ], + P => [ \&_find_good_mirrors, NO_ARGS, GOOD_EXIT, 'Finding good mirrors' ], + w => [ \&_turn_on_warnings, NO_ARGS, GOOD_EXIT, 'Turning on warnings' ], + + # options that do their one thing + g => [ \&_download, ARGS, GOOD_EXIT, 'Download the latest distro' ], + G => [ \&_gitify, ARGS, GOOD_EXIT, 'Down and gitify the latest distro' ], + + C => [ \&_show_Changes, ARGS, GOOD_EXIT, 'Showing Changes file' ], + A => [ \&_show_Author, ARGS, GOOD_EXIT, 'Showing Author' ], + D => [ \&_show_Details, ARGS, GOOD_EXIT, 'Showing Details' ], + O => [ \&_show_out_of_date, NO_ARGS, GOOD_EXIT, 'Showing Out of date' ], + l => [ \&_list_all_mods, NO_ARGS, GOOD_EXIT, 'Listing all modules' ], + + L => [ \&_show_author_mods, ARGS, GOOD_EXIT, 'Showing author mods' ], + a => [ \&_create_autobundle, NO_ARGS, GOOD_EXIT, 'Creating autobundle' ], + p => [ \&_ping_mirrors, NO_ARGS, GOOD_EXIT, 'Pinging mirrors' ], + + r => [ \&_recompile, NO_ARGS, GOOD_EXIT, 'Recompiling' ], + u => [ \&_upgrade, NO_ARGS, GOOD_EXIT, 'Running `make test`' ], + 's' => [ \&_shell, NO_ARGS, GOOD_EXIT, 'Running `make test`' ], + + 'x' => [ \&_guess_namespace, ARGS, GOOD_EXIT, 'Guessing namespaces' ], + c => [ \&_default, ARGS, GOOD_EXIT, 'Running `make clean`' ], + f => [ \&_default, ARGS, GOOD_EXIT, 'Installing with force' ], + i => [ \&_default, ARGS, GOOD_EXIT, 'Running `make install`' ], + 'm' => [ \&_default, ARGS, GOOD_EXIT, 'Running `make`' ], + t => [ \&_default, ARGS, GOOD_EXIT, 'Running `make test`' ], + T => [ \&_default, ARGS, GOOD_EXIT, 'Installing with notest' ], + ); + +%Method_table_index = ( + code => 0, + takes_args => 1, + exit_value => 2, + description => 3, + ); +} + + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# finally, do some argument processing + +sub _stupid_interface_hack_for_non_rtfmers + { + no warnings 'uninitialized'; + shift @ARGV if( $ARGV[0] eq 'install' and @ARGV > 1 ) + } + +sub _process_options + { + my %options; + + push @ARGV, grep $_, split /\s+/, $ENV{CPAN_OPTS} || ''; + + # if no arguments, just drop into the shell + if( 0 == @ARGV ) { CPAN::shell(); exit 0 } + else + { + Getopt::Std::getopts( + join( '', @option_order ), \%options ); + \%options; + } + } + +sub _process_setup_options + { + my( $class, $options ) = @_; + + if( $options->{j} ) + { + $Method_table{j}[ $Method_table_index{code} ]->( $options->{j} ); + delete $options->{j}; + } + else + { + # this is what CPAN.pm would do otherwise + local $CPAN::Be_Silent = 1; + CPAN::HandleConfig->load( + # be_silent => 1, deprecated + write_file => 0, + ); + } + + $class->_turn_off_testing if $options->{T}; + + foreach my $o ( qw(F I w P M) ) + { + next unless exists $options->{$o}; + $Method_table{$o}[ $Method_table_index{code} ]->( $options->{$o} ); + delete $options->{$o}; + } + + if( $options->{o} ) + { + my @pairs = map { [ split /=/, $_, 2 ] } split /,/, $options->{o}; + foreach my $pair ( @pairs ) + { + my( $setting, $value ) = @$pair; + $CPAN::Config->{$setting} = $value; + # $logger->debug( "Setting [$setting] to [$value]" ); + } + delete $options->{o}; + } + + my $option_count = grep { $options->{$_} } @option_order; + no warnings 'uninitialized'; + + # don't count options that imply installation + foreach my $opt ( qw(f T) ) { # don't count force or notest + $option_count -= $options->{$opt}; + } + + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # if there are no options, set -i (this line fixes RT ticket 16915) + $options->{i}++ unless $option_count; + } + +sub _setup_environment { +# should we override or set defaults? If this were a true interactive +# session, we'd be in the CPAN shell. + +# https://github.com/Perl-Toolchain-Gang/toolchain-site/blob/master/lancaster-consensus.md + $ENV{NONINTERACTIVE_TESTING} = 1 unless defined $ENV{NONINTERACTIVE_TESTING}; + $ENV{PERL_MM_USE_DEFAULT} = 1 unless defined $ENV{PERL_MM_USE_DEFAULT}; + } + + +my $logger; + +sub run + { + my $class = shift; + + my $return_value = HEY_IT_WORKED; # assume that things will work + + $logger = $class->_init_logger; + $logger->debug( "Using logger from @{[ref $logger]}" ); + + $class->_hook_into_CPANpm_report; + $logger->debug( "Hooked into output" ); + + $class->_stupid_interface_hack_for_non_rtfmers; + $logger->debug( "Patched cargo culting" ); + + my $options = $class->_process_options; + $logger->debug( "Options are @{[Dumper($options)]}" ); + + $class->_process_setup_options( $options ); + + $class->_setup_environment( $options ); + + OPTION: foreach my $option ( @option_order ) + { + next unless $options->{$option}; + + my( $sub, $takes_args, $description ) = + map { $Method_table{$option}[ $Method_table_index{$_} ] } + qw( code takes_args description ); + + unless( ref $sub eq ref sub {} ) + { + $return_value = THE_PROGRAMMERS_AN_IDIOT; + last OPTION; + } + + $logger->info( "[$option] $description -- ignoring other arguments" ) + if( @ARGV && ! $takes_args ); + + $return_value = $sub->( \ @ARGV, $options ); + + last; + } + + return $return_value; + } + +{ +package + Local::Null::Logger; # hide from PAUSE + +sub new { bless \ my $x, $_[0] } +sub AUTOLOAD { + my $autoload = our $AUTOLOAD; + $autoload =~ s/.*://; + return if $autoload =~ /^(debug|trace)$/; + $CPAN::Frontend->mywarn(">($autoload): $_\n") + for split /[\r\n]+/, $_[1]; +} +sub DESTROY { 1 } +} + +# load a module without searching the default entry for the current +# directory +sub _safe_load_module { + my $name = shift; + + local @INC = @INC; + pop @INC if $INC[-1] eq '.'; + + eval "require $name; 1"; +} + +sub _init_logger + { + my $log4perl_loaded = _safe_load_module("Log::Log4perl"); + + unless( $log4perl_loaded ) + { + print STDOUT "Loading internal logger. Log::Log4perl recommended for better logging\n"; + $logger = Local::Null::Logger->new; + return $logger; + } + + my $LEVEL = $ENV{CPANSCRIPT_LOGLEVEL} || 'INFO'; + + Log::Log4perl::init( \ <<"HERE" ); +log4perl.rootLogger=$LEVEL, A1 +log4perl.appender.A1=Log::Log4perl::Appender::Screen +log4perl.appender.A1.layout=PatternLayout +log4perl.appender.A1.layout.ConversionPattern=%m%n +HERE + + $logger = Log::Log4perl->get_logger( 'App::Cpan' ); + } + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +sub _default + { + my( $args, $options ) = @_; + + my $switch = ''; + + # choose the option that we're going to use + # we'll deal with 'f' (force) later, so skip it + foreach my $option ( @CPAN_OPTIONS ) + { + next if ( $option eq 'f' or $option eq 'T' ); + next unless $options->{$option}; + $switch = $option; + last; + } + + # 1. with no switches, but arguments, use the default switch (install) + # 2. with no switches and no args, start the shell + # 3. With a switch but no args, die! These switches need arguments. + if( not $switch and @$args ) { $switch = $Default; } + elsif( not $switch and not @$args ) { return CPAN::shell() } + elsif( $switch and not @$args ) + { die "Nothing to $CPAN_METHODS{$switch}!\n"; } + + # Get and check the method from CPAN::Shell + my $method = $CPAN_METHODS{$switch}; + die "CPAN.pm cannot $method!\n" unless CPAN::Shell->can( $method ); + + # call the CPAN::Shell method, with force or notest if specified + my $action = do { + if( $options->{f} ) { sub { CPAN::Shell->force( $method, @_ ) } } + elsif( $options->{T} ) { sub { CPAN::Shell->notest( $method, @_ ) } } + else { sub { CPAN::Shell->$method( @_ ) } } + }; + + # How do I handle exit codes for multiple arguments? + my @errors = (); + + $options->{x} or _disable_guessers(); + + foreach my $arg ( @$args ) + { + # check the argument and perhaps capture typos + my $module = _expand_module( $arg ) or do { + $logger->error( "Skipping $arg because I couldn't find a matching namespace." ); + next; + }; + + _clear_cpanpm_output(); + $action->( $arg ); + + my $error = _cpanpm_output_indicates_failure(); + push @errors, $error if $error; + } + + return do { + if( @errors ) { $errors[0] } + else { HEY_IT_WORKED } + }; + + } + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + + +BEGIN { +my $scalar = ''; + +sub _hook_into_CPANpm_report + { + no warnings 'redefine'; + + *CPAN::Shell::myprint = sub { + my($self,$what) = @_; + $scalar .= $what; + $self->print_ornamented($what, + $CPAN::Config->{colorize_print}||'bold blue on_white', + ); + }; + + *CPAN::Shell::mywarn = sub { + my($self,$what) = @_; + $scalar .= $what; + $self->print_ornamented($what, + $CPAN::Config->{colorize_warn}||'bold red on_white' + ); + }; + + } + +sub _clear_cpanpm_output { $scalar = '' } + +sub _get_cpanpm_output { $scalar } + +# These are lines I don't care about in CPAN.pm output. If I can +# filter out the informational noise, I have a better chance to +# catch the error signal +my @skip_lines = ( + qr/^\QWarning \(usually harmless\)/, + qr/\bwill not store persistent state\b/, + qr(//hint//), + qr/^\s+reports\s+/, + qr/^Try the command/, + qr/^\s+$/, + qr/^to find objects/, + qr/^\s*Database was generated on/, + qr/^Going to read/, + qr|^\s+i\s+/|, # the i /Foo::Whatever/ line when it doesn't know + ); + +sub _get_cpanpm_last_line + { + my $fh; + + if( $] < 5.008 ) { + $fh = IO::Scalar->new( \ $scalar ); + } + else { + eval q{ open $fh, '<', \\ $scalar; }; + } + + my @lines = <$fh>; + + # This is a bit ugly. Once we examine a line, we have to + # examine the line before it and go through all of the same + # regexes. I could do something fancy, but this works. + REGEXES: { + foreach my $regex ( @skip_lines ) + { + if( $lines[-1] =~ m/$regex/ ) + { + pop @lines; + redo REGEXES; # we have to go through all of them for every line! + } + } + } + + $logger->debug( "Last interesting line of CPAN.pm output is:\n\t$lines[-1]" ); + + $lines[-1]; + } +} + +BEGIN { +my $epic_fail_words = join '|', + qw( Error stop(?:ping)? problems force not unsupported + fail(?:ed)? Cannot\s+install ); + +sub _cpanpm_output_indicates_failure + { + my $last_line = _get_cpanpm_last_line(); + + my $result = $last_line =~ /\b(?:$epic_fail_words)\b/i; + return A_MODULE_FAILED_TO_INSTALL if $last_line =~ /\b(?:Cannot\s+install)\b/i; + + $result || (); + } +} + +sub _cpanpm_output_indicates_success + { + my $last_line = _get_cpanpm_last_line(); + + my $result = $last_line =~ /\b(?:\s+-- OK|PASS)\b/; + $result || (); + } + +sub _cpanpm_output_is_vague + { + return FALSE if + _cpanpm_output_indicates_failure() || + _cpanpm_output_indicates_success(); + + return TRUE; + } + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +sub _turn_on_warnings { + carp "Warnings are implemented yet"; + return HEY_IT_WORKED; + } + +sub _turn_off_testing { + $logger->debug( 'Trusting test report history' ); + $CPAN::Config->{trust_test_report_history} = 1; + return HEY_IT_WORKED; + } + +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +sub _print_help + { + $logger->info( "Use perldoc to read the documentation" ); + exec "perldoc $0"; + } + +sub _print_version # -v + { + $logger->info( + "$0 script version $VERSION, CPAN.pm version " . CPAN->VERSION ); + + return HEY_IT_WORKED; + } + +sub _print_details # -V + { + _print_version(); + + _check_install_dirs(); + + $logger->info( '-' x 50 . "\nChecking configured mirrors..." ); + foreach my $mirror ( @{ $CPAN::Config->{urllist} } ) { + _print_ping_report( $mirror ); + } + + $logger->info( '-' x 50 . "\nChecking for faster mirrors..." ); + + { + require CPAN::Mirrors; + + if ( $CPAN::Config->{connect_to_internet_ok} ) { + $CPAN::Frontend->myprint(qq{Trying to fetch a mirror list from the Internet\n}); + eval { CPAN::FTP->localize('MIRRORED.BY',File::Spec->catfile($CPAN::Config->{keep_source_where},'MIRRORED.BY'),3,1) } + or $CPAN::Frontend->mywarn(<<'HERE'); +We failed to get a copy of the mirror list from the Internet. +You will need to provide CPAN mirror URLs yourself. +HERE + $CPAN::Frontend->myprint("\n"); + } + + my $mirrors = CPAN::Mirrors->new( _mirror_file() ); + my @continents = $mirrors->find_best_continents; + + my @mirrors = $mirrors->get_mirrors_by_continents( $continents[0] ); + my @timings = $mirrors->get_mirrors_timings( \@mirrors ); + + foreach my $timing ( @timings ) { + $logger->info( sprintf "%s (%0.2f ms)", + $timing->hostname, $timing->rtt ); + } + } + + return HEY_IT_WORKED; + } + +sub _check_install_dirs + { + my $makepl_arg = $CPAN::Config->{makepl_arg}; + my $mbuildpl_arg = $CPAN::Config->{mbuildpl_arg}; + + my @custom_dirs; + # PERL_MM_OPT + push @custom_dirs, + $makepl_arg =~ m/INSTALL_BASE\s*=\s*(\S+)/g, + $mbuildpl_arg =~ m/--install_base\s*=\s*(\S+)/g; + + if( @custom_dirs ) { + foreach my $dir ( @custom_dirs ) { + _print_inc_dir_report( $dir ); + } + } + + # XXX: also need to check makepl_args, etc + + my @checks = ( + [ 'core', [ grep $_, @Config{qw(installprivlib installarchlib)} ] ], + [ 'vendor', [ grep $_, @Config{qw(installvendorlib installvendorarch)} ] ], + [ 'site', [ grep $_, @Config{qw(installsitelib installsitearch)} ] ], + [ 'PERL5LIB', _split_paths( $ENV{PERL5LIB} ) ], + [ 'PERLLIB', _split_paths( $ENV{PERLLIB} ) ], + ); + + $logger->info( '-' x 50 . "\nChecking install dirs..." ); + foreach my $tuple ( @checks ) { + my( $label ) = $tuple->[0]; + + $logger->info( "Checking $label" ); + $logger->info( "\tno directories for $label" ) unless @{ $tuple->[1] }; + foreach my $dir ( @{ $tuple->[1] } ) { + _print_inc_dir_report( $dir ); + } + } + + } + +sub _split_paths + { + [ map { _expand_filename( $_ ) } split /$Config{path_sep}/, $_[0] || '' ]; + } + + + +sub _expand_filename + { + my( $path ) = @_; + no warnings 'uninitialized'; + $logger->debug( "Expanding path $path\n" ); + $path =~ s{\A~([^/]+)?}{ + _home_of( $1 || $> ) || "~$1" + }e; + return $path; + } + +sub _home_of + { + require User::pwent; + my( $user ) = @_; + my $ent = User::pwent::getpw($user) or return; + return $ent->dir; + } + +sub _get_default_inc + { + require Config; + + [ @Config::Config{ _vars() }, '.' ]; + } + +sub _vars { + qw( + installarchlib + installprivlib + installsitearch + installsitelib + ); + } + +sub _ping_mirrors { + my $urls = $CPAN::Config->{urllist}; + require URI; + + foreach my $url ( @$urls ) { + my( $obj ) = URI->new( $url ); + next unless _is_pingable_scheme( $obj ); + my $host = $obj->host; + _print_ping_report( $obj ); + } + + } + +sub _is_pingable_scheme { + my( $uri ) = @_; + + $uri->scheme eq 'file' + } + +sub _mirror_file { + my $file = do { + my $file = 'MIRRORED.BY'; + my $local_path = File::Spec->catfile( + $CPAN::Config->{keep_source_where}, $file ); + + if( -e $local_path ) { $local_path } + else { + require CPAN::FTP; + CPAN::FTP->localize( $file, $local_path, 3, 1 ); + $local_path; + } + }; + } + +sub _find_good_mirrors { + require CPAN::Mirrors; + + my $mirrors = CPAN::Mirrors->new( _mirror_file() ); + + my @mirrors = $mirrors->best_mirrors( + how_many => 5, + verbose => 1, + ); + + foreach my $mirror ( @mirrors ) { + next unless eval { $mirror->can( 'http' ) }; + _print_ping_report( $mirror->http ); + } + + $CPAN::Config->{urllist} = [ + map { $_->http } @mirrors + ]; + } + +sub _print_inc_dir_report + { + my( $dir ) = shift; + + my $writeable = -w $dir ? '+' : '!!! (not writeable)'; + $logger->info( "\t$writeable $dir" ); + return -w $dir; + } + +sub _print_ping_report + { + my( $mirror ) = @_; + + my $rtt = eval { _get_ping_report( $mirror ) }; + my $result = $rtt ? sprintf "+ (%4d ms)", $rtt * 1000 : '!'; + + $logger->info( + sprintf "\t%s %s", $result, $mirror + ); + } + +sub _get_ping_report + { + require URI; + my( $mirror ) = @_; + my( $url ) = ref $mirror ? $mirror : URI->new( $mirror ); #XXX + require Net::Ping; + + my $ping = Net::Ping->new( 'tcp', 1 ); + + if( $url->scheme eq 'file' ) { + return -e $url->file; + } + + my( $port ) = $url->port; + + return unless $port; + + if ( $ping->can('port_number') ) { + $ping->port_number($port); + } + else { + $ping->{'port_num'} = $port; + } + + $ping->hires(1) if $ping->can( 'hires' ); + my( $alive, $rtt ) = eval{ $ping->ping( $url->host ) }; + $alive ? $rtt : undef; + } + +sub _load_local_lib # -I + { + $logger->debug( "Loading local::lib" ); + + my $rc = _safe_load_module("local::lib"); + unless( $rc ) { + $logger->logdie( "Could not load local::lib" ); + } + + local::lib->import; + + return HEY_IT_WORKED; + } + +sub _use_these_mirrors # -M + { + $logger->debug( "Setting per session mirrors" ); + unless( $_[0] ) { + $logger->logdie( "The -M switch requires a comma-separated list of mirrors" ); + } + + $CPAN::Config->{urllist} = [ split /,/, $_[0] ]; + + $logger->debug( "Mirrors are @{$CPAN::Config->{urllist}}" ); + + } + +sub _create_autobundle + { + $logger->info( + "Creating autobundle in $CPAN::Config->{cpan_home}/Bundle" ); + + CPAN::Shell->autobundle; + + return HEY_IT_WORKED; + } + +sub _recompile + { + $logger->info( "Recompiling dynamically-loaded extensions" ); + + CPAN::Shell->recompile; + + return HEY_IT_WORKED; + } + +sub _upgrade + { + $logger->info( "Upgrading all modules" ); + + CPAN::Shell->upgrade(); + + return HEY_IT_WORKED; + } + +sub _shell + { + $logger->info( "Dropping into shell" ); + + CPAN::shell(); + + return HEY_IT_WORKED; + } + +sub _load_config # -j + { + my $file = shift || ''; + + # should I clear out any existing config here? + $CPAN::Config = {}; + delete $INC{'CPAN/Config.pm'}; + croak( "Config file [$file] does not exist!\n" ) unless -e $file; + + my $rc = eval "require '$file'"; + + # CPAN::HandleConfig::require_myconfig_or_config looks for this + $INC{'CPAN/MyConfig.pm'} = 'fake out!'; + + # CPAN::HandleConfig::load looks for this + $CPAN::Config_loaded = 'fake out'; + + croak( "Could not load [$file]: $@\n") unless $rc; + + return HEY_IT_WORKED; + } + +sub _dump_config # -J + { + my $args = shift; + require Data::Dumper; + + my $fh = $args->[0] || \*STDOUT; + + local $Data::Dumper::Sortkeys = 1; + my $dd = Data::Dumper->new( + [$CPAN::Config], + ['$CPAN::Config'] + ); + + print $fh $dd->Dump, "\n1;\n__END__\n"; + + return HEY_IT_WORKED; + } + +sub _lock_lobotomy # -F + { + no warnings 'redefine'; + + *CPAN::_flock = sub { 1 }; + *CPAN::checklock = sub { 1 }; + + return HEY_IT_WORKED; + } + +sub _download + { + my $args = shift; + + local $CPAN::DEBUG = 1; + + my %paths; + + foreach my $arg ( @$args ) { + $logger->info( "Checking $arg" ); + + my $module = _expand_module( $arg ) or next; + my $path = $module->cpan_file; + + $logger->debug( "Inst file would be $path\n" ); + + $paths{$arg} = _get_file( _make_path( $path ) ); + + $logger->info( "Downloaded [$arg] to [$paths{$module}]" ); + } + + return \%paths; + } + +sub _make_path { join "/", qw(authors id), $_[0] } + +sub _get_file + { + my $path = shift; + + my $loaded = _safe_load_module("LWP::Simple"); + croak "You need LWP::Simple to use features that fetch files from CPAN\n" + unless $loaded; + + my $file = substr $path, rindex( $path, '/' ) + 1; + my $store_path = catfile( cwd(), $file ); + $logger->debug( "Store path is $store_path" ); + + foreach my $site ( @{ $CPAN::Config->{urllist} } ) + { + my $fetch_path = join "/", $site, $path; + $logger->debug( "Trying $fetch_path" ); + last if LWP::Simple::getstore( $fetch_path, $store_path ); + } + + return $store_path; + } + +sub _gitify + { + my $args = shift; + + my $loaded = _safe_load_module("Archive::Extract"); + croak "You need Archive::Extract to use features that gitify distributions\n" + unless $loaded; + + my $starting_dir = cwd(); + + foreach my $arg ( @$args ) + { + $logger->info( "Checking $arg" ); + my $store_paths = _download( [ $arg ] ); + $logger->debug( "gitify Store path is $store_paths->{$arg}" ); + my $dirname = dirname( $store_paths->{$arg} ); + + my $ae = Archive::Extract->new( archive => $store_paths->{$arg} ); + $ae->extract( to => $dirname ); + + chdir $ae->extract_path; + + my $git = $ENV{GIT_COMMAND} || '/usr/local/bin/git'; + croak "Could not find $git" unless -e $git; + croak "$git is not executable" unless -x $git; + + # can we do this in Pure Perl? + system( $git, 'init' ); + system( $git, qw( add . ) ); + system( $git, qw( commit -a -m ), 'initial import' ); + } + + chdir $starting_dir; + + return HEY_IT_WORKED; + } + +sub _show_Changes + { + my $args = shift; + + foreach my $arg ( @$args ) + { + $logger->info( "Checking $arg\n" ); + + my $module = _expand_module( $arg ) or next; + + my $out = _get_cpanpm_output(); + + next unless eval { $module->inst_file }; + #next if $module->uptodate; + + ( my $id = $module->id() ) =~ s/::/\-/; + + my $url = "http://search.cpan.org/~" . lc( $module->userid ) . "/" . + $id . "-" . $module->cpan_version() . "/"; + + #print "URL: $url\n"; + _get_changes_file($url); + } + + return HEY_IT_WORKED; + } + +sub _get_changes_file + { + croak "Reading Changes files requires LWP::Simple and URI\n" + unless _safe_load_module("LWP::Simple") && _safe_load_module("URI"); + + my $url = shift; + + my $content = LWP::Simple::get( $url ); + $logger->info( "Got $url ..." ) if defined $content; + #print $content; + + my( $change_link ) = $content =~ m|<a href="(.*?)">Changes</a>|gi; + + my $changes_url = URI->new_abs( $change_link, $url ); + $logger->debug( "Change link is: $changes_url" ); + + my $changes = LWP::Simple::get( $changes_url ); + + print $changes; + + return HEY_IT_WORKED; + } + +sub _show_Author + { + my $args = shift; + + foreach my $arg ( @$args ) + { + my $module = _expand_module( $arg ) or next; + + unless( $module ) + { + $logger->info( "Didn't find a $arg module, so no author!" ); + next; + } + + my $author = CPAN::Shell->expand( "Author", $module->userid ); + + next unless $module->userid; + + printf "%-25s %-8s %-25s %s\n", + $arg, $module->userid, $author->email, $author->name; + } + + return HEY_IT_WORKED; + } + +sub _show_Details + { + my $args = shift; + + foreach my $arg ( @$args ) + { + my $module = _expand_module( $arg ) or next; + my $author = CPAN::Shell->expand( "Author", $module->userid ); + + next unless $module->userid; + + print "$arg\n", "-" x 73, "\n\t"; + print join "\n\t", + $module->description ? $module->description : "(no description)", + $module->cpan_file ? $module->cpan_file : "(no cpanfile)", + $module->inst_file ? $module->inst_file :"(no installation file)" , + 'Installed: ' . ($module->inst_version ? $module->inst_version : "not installed"), + 'CPAN: ' . $module->cpan_version . ' ' . + ($module->uptodate ? "" : "Not ") . "up to date", + $author->fullname . " (" . $module->userid . ")", + $author->email; + print "\n\n"; + + } + + return HEY_IT_WORKED; + } + +BEGIN { +my $modules; +sub _get_all_namespaces + { + return $modules if $modules; + $modules = [ map { $_->id } CPAN::Shell->expand( "Module", "/./" ) ]; + } +} + +sub _show_out_of_date + { + my $modules = _get_all_namespaces(); + + printf "%-40s %6s %6s\n", "Module Name", "Local", "CPAN"; + print "-" x 73, "\n"; + + foreach my $module ( @$modules ) + { + next unless $module = _expand_module($module); + next unless $module->inst_file; + next if $module->uptodate; + printf "%-40s %.4f %.4f\n", + $module->id, + $module->inst_version ? $module->inst_version : '', + $module->cpan_version; + } + + return HEY_IT_WORKED; + } + +sub _show_author_mods + { + my $args = shift; + + my %hash = map { lc $_, 1 } @$args; + + my $modules = _get_all_namespaces(); + + foreach my $module ( @$modules ) { + next unless exists $hash{ lc $module->userid }; + print $module->id, "\n"; + } + + return HEY_IT_WORKED; + } + +sub _list_all_mods # -l + { + require File::Find; + + my $args = shift; + + + my $fh = \*STDOUT; + + INC: foreach my $inc ( @INC ) + { + my( $wanted, $reporter ) = _generator(); + File::Find::find( { wanted => $wanted }, $inc ); + + my $count = 0; + FILE: foreach my $file ( @{ $reporter->() } ) + { + my $version = _parse_version_safely( $file ); + + my $module_name = _path_to_module( $inc, $file ); + next FILE unless defined $module_name; + + print $fh "$module_name\t$version\n"; + + #last if $count++ > 5; + } + } + + return HEY_IT_WORKED; + } + +sub _generator + { + my @files = (); + + sub { push @files, + File::Spec->canonpath( $File::Find::name ) + if m/\A\w+\.pm\z/ }, + sub { \@files }, + } + +sub _parse_version_safely # stolen from PAUSE's mldistwatch, but refactored + { + my( $file ) = @_; + + local $/ = "\n"; + local $_; # don't mess with the $_ in the map calling this + + return unless open FILE, "<$file"; + + my $in_pod = 0; + my $version; + while( <FILE> ) + { + chomp; + $in_pod = /^=(?!cut)/ ? 1 : /^=cut/ ? 0 : $in_pod; + next if $in_pod || /^\s*#/; + + next unless /([\$*])(([\w\:\']*)\bVERSION)\b.*\=/; + my( $sigil, $var ) = ( $1, $2 ); + + $version = _eval_version( $_, $sigil, $var ); + last; + } + close FILE; + + return 'undef' unless defined $version; + + return $version; + } + +sub _eval_version + { + my( $line, $sigil, $var ) = @_; + + # split package line to hide from PAUSE + my $eval = qq{ + package + ExtUtils::MakeMaker::_version; + + local $sigil$var; + \$$var=undef; do { + $line + }; \$$var + }; + + my $version = do { + local $^W = 0; + no strict; + eval( $eval ); + }; + + return $version; + } + +sub _path_to_module + { + my( $inc, $path ) = @_; + return if length $path < length $inc; + + my $module_path = substr( $path, length $inc ); + $module_path =~ s/\.pm\z//; + + # XXX: this is cheating and doesn't handle everything right + my @dirs = grep { ! /\W/ } File::Spec->splitdir( $module_path ); + shift @dirs; + + my $module_name = join "::", @dirs; + + return $module_name; + } + + +sub _expand_module + { + my( $module ) = @_; + + my $expanded = CPAN::Shell->expandany( $module ); + return $expanded if $expanded; + $expanded = CPAN::Shell->expand( "Module", $module ); + unless( defined $expanded ) { + $logger->error( "Could not expand [$module]. Check the module name." ); + my $threshold = ( + grep { int } + sort { length $a <=> length $b } + length($module)/4, 4 + )[0]; + + my $guesses = _guess_at_module_name( $module, $threshold ); + if( defined $guesses and @$guesses ) { + $logger->info( "Perhaps you meant one of these:" ); + foreach my $guess ( @$guesses ) { + $logger->info( "\t$guess" ); + } + } + return; + } + + return $expanded; + } + +my $guessers = [ + [ qw( Text::Levenshtein::XS distance 7 1 ) ], + [ qw( Text::Levenshtein::Damerau::XS xs_edistance 7 1 ) ], + + [ qw( Text::Levenshtein distance 7 1 ) ], + [ qw( Text::Levenshtein::Damerau::PP pp_edistance 7 1 ) ], + + ]; + +sub _disable_guessers + { + $_->[-1] = 0 for @$guessers; + } + +# for -x +sub _guess_namespace + { + my $args = shift; + + foreach my $arg ( @$args ) + { + $logger->debug( "Checking $arg" ); + my $guesses = _guess_at_module_name( $arg ); + + foreach my $guess ( @$guesses ) { + print $guess, "\n"; + } + } + + return HEY_IT_WORKED; + } + +sub _list_all_namespaces { + my $modules = _get_all_namespaces(); + + foreach my $module ( @$modules ) { + print $module, "\n"; + } + } + +BEGIN { +my $distance; +my $_threshold; +my $can_guess; +my $shown_help = 0; +sub _guess_at_module_name + { + my( $target, $threshold ) = @_; + + unless( defined $distance ) { + foreach my $try ( @$guessers ) { + $can_guess = eval "require $try->[0]; 1" or next; + + $try->[-1] or next; # disabled + no strict 'refs'; + $distance = \&{ join "::", @$try[0,1] }; + $threshold ||= $try->[2]; + } + } + $_threshold ||= $threshold; + + unless( $distance ) { + unless( $shown_help ) { + my $modules = join ", ", map { $_->[0] } @$guessers; + substr $modules, rindex( $modules, ',' ), 1, ', and'; + + # Should this be colorized? + if( $can_guess ) { + $logger->info( "I can suggest names if you provide the -x option on invocation." ); + } + else { + $logger->info( "I can suggest names if you install one of $modules" ); + $logger->info( "and you provide the -x option on invocation." ); + } + $shown_help++; + } + return; + } + + my $modules = _get_all_namespaces(); + $logger->info( "Checking " . @$modules . " namespaces for close match suggestions" ); + + my %guesses; + foreach my $guess ( @$modules ) { + my $distance = $distance->( $target, $guess ); + next if $distance > $_threshold; + $guesses{$guess} = $distance; + } + + my @guesses = sort { $guesses{$a} <=> $guesses{$b} } keys %guesses; + return [ grep { defined } @guesses[0..9] ]; + } +} + +1; + +package App::Prove; + +use strict; +use warnings; + +use TAP::Harness::Env; +use Text::ParseWords qw(shellwords); +use File::Spec; +use Getopt::Long; +use App::Prove::State; +use Carp; + +use base 'TAP::Object'; + + +our $VERSION = '3.42'; + + +use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ ); +use constant IS_VMS => $^O eq 'VMS'; +use constant IS_UNIXY => !( IS_VMS || IS_WIN32 ); + +use constant STATE_FILE => IS_UNIXY ? '.prove' : '_prove'; +use constant RC_FILE => IS_UNIXY ? '.proverc' : '_proverc'; + +use constant PLUGINS => 'App::Prove::Plugin'; + +my @ATTR; + +BEGIN { + @ATTR = qw( + archive argv blib show_count color directives exec failures comments + formatter harness includes modules plugins jobs lib merge parse quiet + really_quiet recurse backwards shuffle taint_fail taint_warn timer + verbose warnings_fail warnings_warn show_help show_man show_version + state_class test_args state dry extensions ignore_exit rules state_manager + normalize sources tapversion trap + statefile + ); + __PACKAGE__->mk_methods(@ATTR); +} + + +# new() implementation supplied by TAP::Object + +sub _initialize { + my $self = shift; + my $args = shift || {}; + + my @is_array = qw( + argv rc_opts includes modules state plugins rules sources + ); + + # setup defaults: + for my $key (@is_array) { + $self->{$key} = []; + } + + for my $attr (@ATTR) { + if ( exists $args->{$attr} ) { + + # TODO: Some validation here + $self->{$attr} = $args->{$attr}; + } + } + + $self->state_class('App::Prove::State'); + return $self; +} + + + +sub add_rc_file { + my ( $self, $rc_file ) = @_; + + local *RC; + open RC, "<$rc_file" or croak "Can't read $rc_file ($!)"; + while ( defined( my $line = <RC> ) ) { + push @{ $self->{rc_opts} }, + grep { defined and not /^#/ } + $line =~ m{ ' ([^']*) ' | " ([^"]*) " | (\#.*) | (\S+) }xg; + } + close RC; +} + + +sub process_args { + my $self = shift; + + my @rc = RC_FILE; + unshift @rc, glob '~/' . RC_FILE if IS_UNIXY; + + # Preprocess meta-args. + my @args; + while ( defined( my $arg = shift ) ) { + if ( $arg eq '--norc' ) { + @rc = (); + } + elsif ( $arg eq '--rc' ) { + defined( my $rc = shift ) + or croak "Missing argument to --rc"; + push @rc, $rc; + } + elsif ( $arg =~ m{^--rc=(.+)$} ) { + push @rc, $1; + } + else { + push @args, $arg; + } + } + + # Everything after the arisdottle '::' gets passed as args to + # test programs. + if ( defined( my $stop_at = _first_pos( '::', @args ) ) ) { + my @test_args = splice @args, $stop_at; + shift @test_args; + $self->{test_args} = \@test_args; + } + + # Grab options from RC files + $self->add_rc_file($_) for grep -f, @rc; + unshift @args, @{ $self->{rc_opts} }; + + if ( my @bad = map {"-$_"} grep {/^-(man|help)$/} @args ) { + die "Long options should be written with two dashes: ", + join( ', ', @bad ), "\n"; + } + + # And finally... + + { + local @ARGV = @args; + Getopt::Long::Configure(qw(no_ignore_case bundling pass_through)); + + # Don't add coderefs to GetOptions + GetOptions( + 'v|verbose' => \$self->{verbose}, + 'f|failures' => \$self->{failures}, + 'o|comments' => \$self->{comments}, + 'l|lib' => \$self->{lib}, + 'b|blib' => \$self->{blib}, + 's|shuffle' => \$self->{shuffle}, + 'color!' => \$self->{color}, + 'colour!' => \$self->{color}, + 'count!' => \$self->{show_count}, + 'c' => \$self->{color}, + 'D|dry' => \$self->{dry}, + 'ext=s@' => sub { + my ( $opt, $val ) = @_; + + # Workaround for Getopt::Long 2.25 handling of + # multivalue options + push @{ $self->{extensions} ||= [] }, $val; + }, + 'harness=s' => \$self->{harness}, + 'ignore-exit' => \$self->{ignore_exit}, + 'source=s@' => $self->{sources}, + 'formatter=s' => \$self->{formatter}, + 'r|recurse' => \$self->{recurse}, + 'reverse' => \$self->{backwards}, + 'p|parse' => \$self->{parse}, + 'q|quiet' => \$self->{quiet}, + 'Q|QUIET' => \$self->{really_quiet}, + 'e|exec=s' => \$self->{exec}, + 'm|merge' => \$self->{merge}, + 'I=s@' => $self->{includes}, + 'M=s@' => $self->{modules}, + 'P=s@' => $self->{plugins}, + 'state=s@' => $self->{state}, + 'statefile=s' => \$self->{statefile}, + 'directives' => \$self->{directives}, + 'h|help|?' => \$self->{show_help}, + 'H|man' => \$self->{show_man}, + 'V|version' => \$self->{show_version}, + 'a|archive=s' => \$self->{archive}, + 'j|jobs=i' => \$self->{jobs}, + 'timer' => \$self->{timer}, + 'T' => \$self->{taint_fail}, + 't' => \$self->{taint_warn}, + 'W' => \$self->{warnings_fail}, + 'w' => \$self->{warnings_warn}, + 'normalize' => \$self->{normalize}, + 'rules=s@' => $self->{rules}, + 'tapversion=s' => \$self->{tapversion}, + 'trap' => \$self->{trap}, + ) or croak('Unable to continue'); + + # Stash the remainder of argv for later + $self->{argv} = [@ARGV]; + } + + return; +} + +sub _first_pos { + my $want = shift; + for ( 0 .. $#_ ) { + return $_ if $_[$_] eq $want; + } + return; +} + +sub _help { + my ( $self, $verbosity ) = @_; + + eval('use Pod::Usage 1.12 ()'); + if ( my $err = $@ ) { + die 'Please install Pod::Usage for the --help option ' + . '(or try `perldoc prove`.)' + . "\n ($@)"; + } + + Pod::Usage::pod2usage( { -verbose => $verbosity } ); + + return; +} + +sub _color_default { + my $self = shift; + + return -t STDOUT && !$ENV{HARNESS_NOTTY}; +} + +sub _get_args { + my $self = shift; + + my %args; + + $args{trap} = 1 if $self->trap; + + if ( defined $self->color ? $self->color : $self->_color_default ) { + $args{color} = 1; + } + if ( !defined $self->show_count ) { + $args{show_count} = 1; + } + else { + $args{show_count} = $self->show_count; + } + + if ( $self->archive ) { + $self->require_harness( archive => 'TAP::Harness::Archive' ); + $args{archive} = $self->archive; + } + + if ( my $jobs = $self->jobs ) { + $args{jobs} = $jobs; + } + + if ( my $harness_opt = $self->harness ) { + $self->require_harness( harness => $harness_opt ); + } + + if ( my $formatter = $self->formatter ) { + $args{formatter_class} = $formatter; + } + + for my $handler ( @{ $self->sources } ) { + my ( $name, $config ) = $self->_parse_source($handler); + $args{sources}->{$name} = $config; + } + + if ( $self->ignore_exit ) { + $args{ignore_exit} = 1; + } + + if ( $self->taint_fail && $self->taint_warn ) { + die '-t and -T are mutually exclusive'; + } + + if ( $self->warnings_fail && $self->warnings_warn ) { + die '-w and -W are mutually exclusive'; + } + + for my $a (qw( lib switches )) { + my $method = "_get_$a"; + my $val = $self->$method(); + $args{$a} = $val if defined $val; + } + + # Handle verbose, quiet, really_quiet flags + my %verb_map = ( verbose => 1, quiet => -1, really_quiet => -2, ); + + my @verb_adj = grep {$_} map { $self->$_() ? $verb_map{$_} : 0 } + keys %verb_map; + + die "Only one of verbose, quiet or really_quiet should be specified\n" + if @verb_adj > 1; + + $args{verbosity} = shift @verb_adj || 0; + + for my $a (qw( merge failures comments timer directives normalize )) { + $args{$a} = 1 if $self->$a(); + } + + $args{errors} = 1 if $self->parse; + + # defined but zero-length exec runs test files as binaries + $args{exec} = [ split( /\s+/, $self->exec ) ] + if ( defined( $self->exec ) ); + + $args{version} = $self->tapversion if defined( $self->tapversion ); + + if ( defined( my $test_args = $self->test_args ) ) { + $args{test_args} = $test_args; + } + + if ( @{ $self->rules } ) { + my @rules; + for ( @{ $self->rules } ) { + if (/^par=(.*)/) { + push @rules, $1; + } + elsif (/^seq=(.*)/) { + push @rules, { seq => $1 }; + } + } + $args{rules} = { par => [@rules] }; + } + $args{harness_class} = $self->{harness_class} if $self->{harness_class}; + + return \%args; +} + +sub _find_module { + my ( $self, $class, @search ) = @_; + + croak "Bad module name $class" + unless $class =~ /^ \w+ (?: :: \w+ ) *$/x; + + for my $pfx (@search) { + my $name = join( '::', $pfx, $class ); + eval "require $name"; + return $name unless $@; + } + + eval "require $class"; + return $class unless $@; + return; +} + +sub _load_extension { + my ( $self, $name, @search ) = @_; + + my @args = (); + if ( $name =~ /^(.*?)=(.*)/ ) { + $name = $1; + @args = split( /,/, $2 ); + } + + if ( my $class = $self->_find_module( $name, @search ) ) { + $class->import(@args); + if ( $class->can('load') ) { + $class->load( { app_prove => $self, args => [@args] } ); + } + } + else { + croak "Can't load module $name"; + } +} + +sub _load_extensions { + my ( $self, $ext, @search ) = @_; + $self->_load_extension( $_, @search ) for @$ext; +} + +sub _parse_source { + my ( $self, $handler ) = @_; + + # Load any options. + ( my $opt_name = lc $handler ) =~ s/::/-/g; + local @ARGV = @{ $self->{argv} }; + my %config; + Getopt::Long::GetOptions( + "$opt_name-option=s%" => sub { + my ( $name, $k, $v ) = @_; + if ( $v =~ /(?<!\\)=/ ) { + + # It's a hash option. + croak "Option $name must be consistently used as a hash" + if exists $config{$k} && ref $config{$k} ne 'HASH'; + $config{$k} ||= {}; + my ( $hk, $hv ) = split /(?<!\\)=/, $v, 2; + $config{$k}{$hk} = $hv; + } + else { + $v =~ s/\\=/=/g; + if ( exists $config{$k} ) { + $config{$k} = [ $config{$k} ] + unless ref $config{$k} eq 'ARRAY'; + push @{ $config{$k} } => $v; + } + else { + $config{$k} = $v; + } + } + } + ); + $self->{argv} = \@ARGV; + return ( $handler, \%config ); +} + + +sub run { + my $self = shift; + + unless ( $self->state_manager ) { + $self->state_manager( + $self->state_class->new( { store => $self->statefile || STATE_FILE } ) ); + } + + if ( $self->show_help ) { + $self->_help(1); + } + elsif ( $self->show_man ) { + $self->_help(2); + } + elsif ( $self->show_version ) { + $self->print_version; + } + elsif ( $self->dry ) { + print "$_\n" for $self->_get_tests; + } + else { + + $self->_load_extensions( $self->modules ); + $self->_load_extensions( $self->plugins, PLUGINS ); + + local $ENV{TEST_VERBOSE} = 1 if $self->verbose; + + return $self->_runtests( $self->_get_args, $self->_get_tests ); + } + + return 1; +} + +sub _get_tests { + my $self = shift; + + my $state = $self->state_manager; + my $ext = $self->extensions; + $state->extensions($ext) if defined $ext; + if ( defined( my $state_switch = $self->state ) ) { + $state->apply_switch(@$state_switch); + } + + my @tests = $state->get_tests( $self->recurse, @{ $self->argv } ); + + $self->_shuffle(@tests) if $self->shuffle; + @tests = reverse @tests if $self->backwards; + + return @tests; +} + +sub _runtests { + my ( $self, $args, @tests ) = @_; + my $harness = TAP::Harness::Env->create($args); + + my $state = $self->state_manager; + + $harness->callback( + after_test => sub { + $state->observe_test(@_); + } + ); + + $harness->callback( + after_runtests => sub { + $state->commit(@_); + } + ); + + my $aggregator = $harness->runtests(@tests); + + return !$aggregator->has_errors; +} + +sub _get_switches { + my $self = shift; + my @switches; + + # notes that -T or -t must be at the front of the switches! + if ( $self->taint_fail ) { + push @switches, '-T'; + } + elsif ( $self->taint_warn ) { + push @switches, '-t'; + } + if ( $self->warnings_fail ) { + push @switches, '-W'; + } + elsif ( $self->warnings_warn ) { + push @switches, '-w'; + } + + return @switches ? \@switches : (); +} + +sub _get_lib { + my $self = shift; + my @libs; + if ( $self->lib ) { + push @libs, 'lib'; + } + if ( $self->blib ) { + push @libs, 'blib/lib', 'blib/arch'; + } + if ( @{ $self->includes } ) { + push @libs, @{ $self->includes }; + } + + #24926 + @libs = map { File::Spec->rel2abs($_) } @libs; + + # Huh? + return @libs ? \@libs : (); +} + +sub _shuffle { + my $self = shift; + + # Fisher-Yates shuffle + my $i = @_; + while ($i) { + my $j = rand $i--; + @_[ $i, $j ] = @_[ $j, $i ]; + } + return; +} + + +sub require_harness { + my ( $self, $for, $class ) = @_; + + my ($class_name) = $class =~ /^(\w+(?:::\w+)*)/; + + # Emulate Perl's -MModule=arg1,arg2 behaviour + $class =~ s!^(\w+(?:::\w+)*)=(.*)$!$1 split(/,/,q{$2})!; + + eval("use $class;"); + die "$class_name is required to use the --$for feature: $@" if $@; + + $self->{harness_class} = $class_name; + + return; +} + + +sub print_version { + my $self = shift; + require TAP::Harness; + printf( + "TAP::Harness v%s and Perl v%vd\n", + $TAP::Harness::VERSION, $^V + ); + + return; +} + +1; + +# vim:ts=4:sw=4:et:sta + +__END__ + +package App::Prove::State; + +use strict; +use warnings; + +use File::Find; +use File::Spec; +use Carp; + +use App::Prove::State::Result; +use TAP::Parser::YAMLish::Reader (); +use TAP::Parser::YAMLish::Writer (); +use base 'TAP::Base'; + +BEGIN { + __PACKAGE__->mk_methods('result_class'); +} + +use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ ); +use constant NEED_GLOB => IS_WIN32; + + +our $VERSION = '3.42'; + + + +# override TAP::Base::new: +sub new { + my $class = shift; + my %args = %{ shift || {} }; + + my $self = bless { + select => [], + seq => 1, + store => delete $args{store}, + extensions => ( delete $args{extensions} || ['.t'] ), + result_class => + ( delete $args{result_class} || 'App::Prove::State::Result' ), + }, $class; + + $self->{_} = $self->result_class->new( + { tests => {}, + generation => 1, + } + ); + my $store = $self->{store}; + $self->load($store) + if defined $store && -f $store; + + return $self; +} + + + +sub extensions { + my $self = shift; + $self->{extensions} = shift if @_; + return $self->{extensions}; +} + + +sub results { + my $self = shift; + $self->{_} || $self->result_class->new; +} + + +sub commit { + my $self = shift; + if ( $self->{should_save} ) { + $self->save; + } +} + + +sub apply_switch { + my $self = shift; + my @opts = @_; + + my $last_gen = $self->results->generation - 1; + my $last_run_time = $self->results->last_run_time; + my $now = $self->get_time; + + my @switches = map { split /,/ } @opts; + + my %handler = ( + last => sub { + $self->_select( + limit => shift, + where => sub { $_->generation >= $last_gen }, + order => sub { $_->sequence } + ); + }, + failed => sub { + $self->_select( + limit => shift, + where => sub { $_->result != 0 }, + order => sub { -$_->result } + ); + }, + passed => sub { + $self->_select( + limit => shift, + where => sub { $_->result == 0 } + ); + }, + all => sub { + $self->_select( limit => shift ); + }, + todo => sub { + $self->_select( + limit => shift, + where => sub { $_->num_todo != 0 }, + order => sub { -$_->num_todo; } + ); + }, + hot => sub { + $self->_select( + limit => shift, + where => sub { defined $_->last_fail_time }, + order => sub { $now - $_->last_fail_time } + ); + }, + slow => sub { + $self->_select( + limit => shift, + order => sub { -$_->elapsed } + ); + }, + fast => sub { + $self->_select( + limit => shift, + order => sub { $_->elapsed } + ); + }, + new => sub { + $self->_select( + limit => shift, + order => sub { -$_->mtime } + ); + }, + old => sub { + $self->_select( + limit => shift, + order => sub { $_->mtime } + ); + }, + fresh => sub { + $self->_select( + limit => shift, + where => sub { $_->mtime >= $last_run_time } + ); + }, + save => sub { + $self->{should_save}++; + }, + adrian => sub { + unshift @switches, qw( hot all save ); + }, + ); + + while ( defined( my $ele = shift @switches ) ) { + my ( $opt, $arg ) + = ( $ele =~ /^([^:]+):(.*)/ ) + ? ( $1, $2 ) + : ( $ele, undef ); + my $code = $handler{$opt} + || croak "Illegal state option: $opt"; + $code->($arg); + } + return; +} + +sub _select { + my ( $self, %spec ) = @_; + push @{ $self->{select} }, \%spec; +} + + +sub get_tests { + my $self = shift; + my $recurse = shift; + my @argv = @_; + my %seen; + + my @selected = $self->_query; + + unless ( @argv || @{ $self->{select} } ) { + @argv = $recurse ? '.' : 't'; + croak qq{No tests named and '@argv' directory not found} + unless -d $argv[0]; + } + + push @selected, $self->_get_raw_tests( $recurse, @argv ) if @argv; + return grep { !$seen{$_}++ } @selected; +} + +sub _query { + my $self = shift; + if ( my @sel = @{ $self->{select} } ) { + warn "No saved state, selection will be empty\n" + unless $self->results->num_tests; + return map { $self->_query_clause($_) } @sel; + } + return; +} + +sub _query_clause { + my ( $self, $clause ) = @_; + my @got; + my $results = $self->results; + my $where = $clause->{where} || sub {1}; + + # Select + for my $name ( $results->test_names ) { + next unless -f $name; + local $_ = $results->test($name); + push @got, $name if $where->(); + } + + # Sort + if ( my $order = $clause->{order} ) { + @got = map { $_->[0] } + sort { + ( defined $b->[1] <=> defined $a->[1] ) + || ( ( $a->[1] || 0 ) <=> ( $b->[1] || 0 ) ) + } map { + [ $_, + do { local $_ = $results->test($_); $order->() } + ] + } @got; + } + + if ( my $limit = $clause->{limit} ) { + @got = splice @got, 0, $limit if @got > $limit; + } + + return @got; +} + +sub _get_raw_tests { + my $self = shift; + my $recurse = shift; + my @argv = @_; + my @tests; + + # Do globbing on Win32. + if (NEED_GLOB) { + eval "use File::Glob::Windows"; # [49732] + @argv = map { glob "$_" } @argv; + } + my $extensions = $self->{extensions}; + + for my $arg (@argv) { + if ( '-' eq $arg ) { + push @argv => <STDIN>; + chomp(@argv); + next; + } + + push @tests, + sort -d $arg + ? $recurse + ? $self->_expand_dir_recursive( $arg, $extensions ) + : map { glob( File::Spec->catfile( $arg, "*$_" ) ) } + @{$extensions} + : $arg; + } + return @tests; +} + +sub _expand_dir_recursive { + my ( $self, $dir, $extensions ) = @_; + + my @tests; + my $ext_string = join( '|', map {quotemeta} @{$extensions} ); + + find( + { follow => 1, #21938 + follow_skip => 2, + wanted => sub { + -f + && /(?:$ext_string)$/ + && push @tests => $File::Find::name; + } + }, + $dir + ); + return @tests; +} + + +# Store: +# last fail time +# last pass time +# last run time +# most recent result +# most recent todos +# total failures +# total passes +# state generation +# parser + +sub observe_test { + + my ( $self, $test_info, $parser ) = @_; + my $name = $test_info->[0]; + my $fail = scalar( $parser->failed ) + ( $parser->has_problems ? 1 : 0 ); + my $todo = scalar( $parser->todo ); + my $start_time = $parser->start_time; + my $end_time = $parser->end_time, + + my $test = $self->results->test($name); + + $test->sequence( $self->{seq}++ ); + $test->generation( $self->results->generation ); + + $test->run_time($end_time); + $test->result($fail); + $test->num_todo($todo); + $test->elapsed( $end_time - $start_time ); + + $test->parser($parser); + + if ($fail) { + $test->total_failures( $test->total_failures + 1 ); + $test->last_fail_time($end_time); + } + else { + $test->total_passes( $test->total_passes + 1 ); + $test->last_pass_time($end_time); + } +} + + +sub save { + my ($self) = @_; + + my $store = $self->{store} or return; + $self->results->last_run_time( $self->get_time ); + + my $writer = TAP::Parser::YAMLish::Writer->new; + local *FH; + open FH, ">$store" or croak "Can't write $store ($!)"; + $writer->write( $self->results->raw, \*FH ); + close FH; +} + + +sub load { + my ( $self, $name ) = @_; + my $reader = TAP::Parser::YAMLish::Reader->new; + local *FH; + open FH, "<$name" or croak "Can't read $name ($!)"; + + # XXX this is temporary + $self->{_} = $self->result_class->new( + $reader->read( + sub { + my $line = <FH>; + defined $line && chomp $line; + return $line; + } + ) + ); + + # $writer->write( $self->{tests} || {}, \*FH ); + close FH; + $self->_regen_seq; + $self->_prune_and_stamp; + $self->results->generation( $self->results->generation + 1 ); +} + +sub _prune_and_stamp { + my $self = shift; + + my $results = $self->results; + my @tests = $self->results->tests; + for my $test (@tests) { + my $name = $test->name; + if ( my @stat = stat $name ) { + $test->mtime( $stat[9] ); + } + else { + $results->remove($name); + } + } +} + +sub _regen_seq { + my $self = shift; + for my $test ( $self->results->tests ) { + $self->{seq} = $test->sequence + 1 + if defined $test->sequence && $test->sequence >= $self->{seq}; + } +} + +1; +package App::Prove::State::Result; + +use strict; +use warnings; +use Carp 'croak'; + +use App::Prove::State::Result::Test; + +use constant STATE_VERSION => 1; + + +our $VERSION = '3.42'; + + + +sub new { + my ( $class, $arg_for ) = @_; + $arg_for ||= {}; + my %instance_data = %$arg_for; # shallow copy + $instance_data{version} = $class->state_version; + my $tests = delete $instance_data{tests} || {}; + my $self = bless \%instance_data => $class; + $self->_initialize($tests); + return $self; +} + +sub _initialize { + my ( $self, $tests ) = @_; + my %tests; + while ( my ( $name, $test ) = each %$tests ) { + $tests{$name} = $self->test_class->new( + { %$test, + name => $name + } + ); + } + $self->tests( \%tests ); + return $self; +} + + +sub state_version {STATE_VERSION} + + +sub test_class { + return 'App::Prove::State::Result::Test'; +} + +my %methods = ( + generation => { method => 'generation', default => 0 }, + last_run_time => { method => 'last_run_time', default => undef }, +); + +while ( my ( $key, $description ) = each %methods ) { + my $default = $description->{default}; + no strict 'refs'; + *{ $description->{method} } = sub { + my $self = shift; + if (@_) { + $self->{$key} = shift; + return $self; + } + return $self->{$key} || $default; + }; +} + + +sub tests { + my $self = shift; + if (@_) { + $self->{tests} = shift; + return $self; + } + my %tests = %{ $self->{tests} }; + my @tests = sort { $a->sequence <=> $b->sequence } values %tests; + return wantarray ? @tests : \@tests; +} + + +sub test { + my ( $self, $name ) = @_; + croak("test() requires a test name") unless defined $name; + + my $tests = $self->{tests} ||= {}; + if ( my $test = $tests->{$name} ) { + return $test; + } + else { + my $test = $self->test_class->new( { name => $name } ); + $self->{tests}->{$name} = $test; + return $test; + } +} + + +sub test_names { + my $self = shift; + return map { $_->name } $self->tests; +} + + +sub remove { + my ( $self, $name ) = @_; + delete $self->{tests}->{$name}; + return $self; +} + + +sub num_tests { keys %{ shift->{tests} } } + + +sub raw { + my $self = shift; + my %raw = %$self; + + my %tests; + for my $test ( $self->tests ) { + $tests{ $test->name } = $test->raw; + } + $raw{tests} = \%tests; + return \%raw; +} + +1; +package App::Prove::State::Result::Test; + +use strict; +use warnings; + + +our $VERSION = '3.42'; + + +my %methods = ( + name => { method => 'name' }, + elapsed => { method => 'elapsed', default => 0 }, + gen => { method => 'generation', default => 1 }, + last_pass_time => { method => 'last_pass_time', default => undef }, + last_fail_time => { method => 'last_fail_time', default => undef }, + last_result => { method => 'result', default => 0 }, + last_run_time => { method => 'run_time', default => undef }, + last_todo => { method => 'num_todo', default => 0 }, + mtime => { method => 'mtime', default => undef }, + seq => { method => 'sequence', default => 1 }, + total_passes => { method => 'total_passes', default => 0 }, + total_failures => { method => 'total_failures', default => 0 }, + parser => { method => 'parser' }, +); + +while ( my ( $key, $description ) = each %methods ) { + my $default = $description->{default}; + no strict 'refs'; + *{ $description->{method} } = sub { + my $self = shift; + if (@_) { + $self->{$key} = shift; + return $self; + } + return $self->{$key} || $default; + }; +} + + +sub new { + my ( $class, $arg_for ) = @_; + $arg_for ||= {}; + bless $arg_for => $class; +} + + +sub raw { + my $self = shift; + my %raw = %$self; + + # this is backwards-compatibility hack and is not guaranteed. + delete $raw{name}; + delete $raw{parser}; + return \%raw; +} + +1; +package warnings::register; + +our $VERSION = '1.04'; +require warnings; + +# left here as cruft in case other users were using this undocumented routine +# -- rjbs, 2010-09-08 +sub mkMask +{ + my ($bit) = @_; + my $mask = ""; + + vec($mask, $bit, 1) = 1; + return $mask; +} + +sub import +{ + shift; + my @categories = @_; + + my $package = (caller(0))[0]; + warnings::register_categories($package); + + warnings::register_categories($package . "::$_") for @categories; +} +1; +__END__ + +# -*- buffer-read-only: t -*- +# +# lib/overload/numbers.pm +# +# Copyright (C) 2008 by Larry Wall and others +# +# You may distribute under the terms of either the GNU General Public +# License or the Artistic License, as specified in the README file. +# +# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! +# This file is built by regen/overload.pl. +# Any changes made here will be lost! + +package overload::numbers; + +our @names = qw# + () + (${} + (@{} + (%{} + (*{} + (&{} + (++ + (-- + (bool + (0+ + ("" + (! + (= + (abs + (neg + (<> + (int + (< + (<= + (> + (>= + (== + (!= + (lt + (le + (gt + (ge + (eq + (ne + (nomethod + (+ + (+= + (- + (-= + (* + (*= + (/ + (/= + (% + (%= + (** + (**= + (<< + (<<= + (>> + (>>= + (& + (&= + (&. + (&.= + (| + (|= + (|. + (|.= + (^ + (^= + (^. + (^.= + (<=> + (cmp + (~ + (~. + (atan2 + (cos + (sin + (exp + (log + (sqrt + (x + (x= + (. + (.= + (~~ + (-X + (qr +#; + +our @enums = qw# + fallback + to_sv + to_av + to_hv + to_gv + to_cv + inc + dec + bool_ + numer + string + not + copy + abs + neg + iter + int + lt + le + gt + ge + eq + ne + slt + sle + sgt + sge + seq + sne + nomethod + add + add_ass + subtr + subtr_ass + mult + mult_ass + div + div_ass + modulo + modulo_ass + pow + pow_ass + lshift + lshift_ass + rshift + rshift_ass + band + band_ass + sband + sband_ass + bor + bor_ass + sbor + sbor_ass + bxor + bxor_ass + sbxor + sbxor_ass + ncmp + scmp + compl + scompl + atan2 + cos + sin + exp + log + sqrt + repeat + repeat_ass + concat + concat_ass + smart + ftest + regexp +#; + +{ my $i = 0; our %names = map { $_ => $i++ } @names } + +{ my $i = 0; our %enums = map { $_ => $i++ } @enums } + +# ex: set ro: +package Memoize::Storable; + + +use Storable (); +$VERSION = '1.03'; +$Verbose = 0; + +sub TIEHASH { + require Carp if $Verbose; + my $package = shift; + my $filename = shift; + my $truehash = (-e $filename) ? Storable::retrieve($filename) : {}; + my %options; + print STDERR "Memoize::Storable::TIEHASH($filename, @_)\n" if $Verbose; + @options{@_} = (); + my $self = + {FILENAME => $filename, + H => $truehash, + OPTIONS => \%options + }; + bless $self => $package; +} + +sub STORE { + require Carp if $Verbose; + my $self = shift; + print STDERR "Memoize::Storable::STORE(@_)\n" if $Verbose; + $self->{H}{$_[0]} = $_[1]; +} + +sub FETCH { + require Carp if $Verbose; + my $self = shift; + print STDERR "Memoize::Storable::FETCH(@_)\n" if $Verbose; + $self->{H}{$_[0]}; +} + +sub EXISTS { + require Carp if $Verbose; + my $self = shift; + print STDERR "Memoize::Storable::EXISTS(@_)\n" if $Verbose; + exists $self->{H}{$_[0]}; +} + +sub DESTROY { + require Carp if $Verbose; + my $self= shift; + print STDERR "Memoize::Storable::DESTROY(@_)\n" if $Verbose; + if ($self->{OPTIONS}{'nstore'}) { + Storable::nstore($self->{H}, $self->{FILENAME}); + } else { + Storable::store($self->{H}, $self->{FILENAME}); + } +} + +sub FIRSTKEY { + 'Fake hash from Memoize::Storable'; +} + +sub NEXTKEY { + undef; +} +1; +package Memoize::SDBM_File; + + +use SDBM_File; +@ISA = qw(SDBM_File); +$VERSION = '1.03'; + +$Verbose = 0; + +sub AUTOLOAD { + warn "Nonexistent function $AUTOLOAD invoked in Memoize::SDBM_File\n"; +} + +sub import { + warn "Importing Memoize::SDBM_File\n" if $Verbose; +} + + +my %keylist; + +# This is so ridiculous... +sub _backhash { + my $self = shift; + my %fakehash; + my $k; + for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) { + $fakehash{$k} = undef; + } + $keylist{$self} = \%fakehash; +} + +sub EXISTS { + warn "Memoize::SDBM_File EXISTS (@_)\n" if $Verbose; + my $self = shift; + _backhash($self) unless exists $keylist{$self}; + my $r = exists $keylist{$self}{$_[0]}; + warn "Memoize::SDBM_File EXISTS (@_) ==> $r\n" if $Verbose; + $r; +} + +sub DEFINED { + warn "Memoize::SDBM_File DEFINED (@_)\n" if $Verbose; + my $self = shift; + _backhash($self) unless exists $keylist{$self}; + defined $keylist{$self}{$_[0]}; +} + +sub DESTROY { + warn "Memoize::SDBM_File DESTROY (@_)\n" if $Verbose; + my $self = shift; + delete $keylist{$self}; # So much for reference counting... + $self->SUPER::DESTROY(@_); +} + +# Maybe establish the keylist at TIEHASH time instead? + +sub STORE { + warn "Memoize::SDBM_File STORE (@_)\n" if $VERBOSE; + my $self = shift; + $keylist{$self}{$_[0]} = undef; + $self->SUPER::STORE(@_); +} + +# Inherit FETCH and TIEHASH + +1; +package Memoize::ExpireFile; + + +$VERSION = '1.03'; +use Carp; + +my $Zero = pack("N", 0); + +sub TIEHASH { + my ($package, %args) = @_; + my $cache = $args{HASH} || {}; + bless {ARGS => \%args, C => $cache} => $package; +} + + +sub STORE { +# print "Expiry manager STORE handler\n"; + my ($self, $key, $data) = @_; + my $cache = $self->{C}; + my $cur_date = pack("N", (stat($key))[9]); + $cache->{"C$key"} = $data; + $cache->{"T$key"} = $cur_date; +} + +sub FETCH { + my ($self, $key) = @_; + $self->{C}{"C$key"}; +} + +sub EXISTS { +# print "Expiry manager EXISTS handler\n"; + my ($self, $key) = @_; + my $cache_date = $self->{C}{"T$key"} || $Zero; + my $file_date = pack("N", (stat($key))[9]);# +# if ($self->{ARGS}{CHECK_DATE} && $old_date gt $cur_date) { +# return $self->{ARGS}{CHECK_DATE}->($key, $old_date, $cur_date); +# } + my $res = $cache_date ge $file_date; +# print $res ? "... still good\n" : "... expired\n"; + $res; +} + +1; + +package Memoize::Expire; +# require 5.00556; +use Carp; +$DEBUG = 0; +$VERSION = '1.03'; + +# This package will implement expiration by prepending a fixed-length header +# to the font of the cached data. The format of the header will be: +# (4-byte number of last-access-time) (For LRU when I implement it) +# (4-byte expiration time: unsigned seconds-since-unix-epoch) +# (2-byte number-of-uses-before-expire) + +sub _header_fmt () { "N N n" } +sub _header_size () { length(_header_fmt) } + +# Usage: memoize func +# TIE => [Memoize::Expire, LIFETIME => sec, NUM_USES => n, +# TIE => [...] ] + +BEGIN { + eval {require Time::HiRes}; + unless ($@) { + Time::HiRes->import('time'); + } +} + +sub TIEHASH { + my ($package, %args) = @_; + my %cache; + if ($args{TIE}) { + my ($module, @opts) = @{$args{TIE}}; + my $modulefile = $module . '.pm'; + $modulefile =~ s{::}{/}g; + eval { require $modulefile }; + if ($@) { + croak "Memoize::Expire: Couldn't load hash tie module `$module': $@; aborting"; + } + my $rc = (tie %cache => $module, @opts); + unless ($rc) { + croak "Memoize::Expire: Couldn't tie hash to `$module': $@; aborting"; + } + } + $args{LIFETIME} ||= 0; + $args{NUM_USES} ||= 0; + $args{C} = \%cache; + bless \%args => $package; +} + +sub STORE { + $DEBUG and print STDERR " >> Store $_[1] $_[2]\n"; + my ($self, $key, $value) = @_; + my $expire_time = $self->{LIFETIME} > 0 ? $self->{LIFETIME} + time : 0; + # The call that results in a value to store into the cache is the + # first of the NUM_USES allowed calls. + my $header = _make_header(time, $expire_time, $self->{NUM_USES}-1); + $self->{C}{$key} = $header . $value; + $value; +} + +sub FETCH { + $DEBUG and print STDERR " >> Fetch cached value for $_[1]\n"; + my ($data, $last_access, $expire_time, $num_uses_left) = _get_item($_[0]{C}{$_[1]}); + $DEBUG and print STDERR " >> (ttl: ", ($expire_time-time()), ", nuses: $num_uses_left)\n"; + $num_uses_left--; + $last_access = time; + _set_header(@_, $data, $last_access, $expire_time, $num_uses_left); + $data; +} + +sub EXISTS { + $DEBUG and print STDERR " >> Exists $_[1]\n"; + unless (exists $_[0]{C}{$_[1]}) { + $DEBUG and print STDERR " Not in underlying hash at all.\n"; + return 0; + } + my $item = $_[0]{C}{$_[1]}; + my ($last_access, $expire_time, $num_uses_left) = _get_header($item); + my $ttl = $expire_time - time; + if ($DEBUG) { + $_[0]{LIFETIME} and print STDERR " Time to live for this item: $ttl\n"; + $_[0]{NUM_USES} and print STDERR " Uses remaining: $num_uses_left\n"; + } + if ( (! $_[0]{LIFETIME} || $expire_time > time) + && (! $_[0]{NUM_USES} || $num_uses_left > 0 )) { + $DEBUG and print STDERR " (Still good)\n"; + return 1; + } else { + $DEBUG and print STDERR " (Expired)\n"; + return 0; + } +} + +# Arguments: last access time, expire time, number of uses remaining +sub _make_header { + pack "N N n", @_; +} + +sub _strip_header { + substr($_[0], 10); +} + +# Arguments: last access time, expire time, number of uses remaining +sub _set_header { + my ($self, $key, $data, @header) = @_; + $self->{C}{$key} = _make_header(@header) . $data; +} + +sub _get_item { + my $data = substr($_[0], 10); + my @header = unpack "N N n", substr($_[0], 0, 10); +# print STDERR " >> _get_item: $data => $data @header\n"; + ($data, @header); +} + +# Return last access time, expire time, number of uses remaining +sub _get_header { + unpack "N N n", substr($_[0], 0, 10); +} + +1; + +package Memoize::AnyDBM_File; + + +use vars qw(@ISA $VERSION); +$VERSION = '1.03'; +@ISA = qw(DB_File GDBM_File Memoize::NDBM_File Memoize::SDBM_File ODBM_File) unless @ISA; + +my $verbose = 1; + +my $mod; +for $mod (@ISA) { +# (my $truemod = $mod) =~ s/^Memoize:://; +# my $file = "$mod.pm"; +# $file =~ s{::}{/}g; + if (eval "require $mod") { + print STDERR "AnyDBM_File => Selected $mod.\n" if $Verbose; + @ISA = ($mod); # if we leave @ISA alone, warnings abound + return 1; + } +} + +die "No DBM package was successfully found or installed"; +package Memoize::ExpireTest; + + +$VERSION = '1.03'; +my %cache; + +sub TIEHASH { + my ($pack) = @_; + bless \%cache => $pack; +} + +sub EXISTS { + my ($cache, $key) = @_; + exists $cache->{$key} ? 1 : 0; +} + +sub FETCH { + my ($cache, $key) = @_; + $cache->{$key}; +} + +sub STORE { + my ($cache, $key, $val) = @_; + $cache->{$key} = $val; +} + +sub expire { + my ($key) = @_; + delete $cache{$key}; +} + +1; +package Memoize::NDBM_File; + + +use NDBM_File; +@ISA = qw(NDBM_File); +$VERSION = '1.03'; + +$Verbose = 0; + +sub AUTOLOAD { + warn "Nonexistent function $AUTOLOAD invoked in Memoize::NDBM_File\n"; +} + +sub import { + warn "Importing Memoize::NDBM_File\n" if $Verbose; +} + + +my %keylist; + +# This is so ridiculous... +sub _backhash { + my $self = shift; + my %fakehash; + my $k; + for ($k = $self->FIRSTKEY(); defined $k; $k = $self->NEXTKEY($k)) { + $fakehash{$k} = undef; + } + $keylist{$self} = \%fakehash; +} + +sub EXISTS { + warn "Memoize::NDBM_File EXISTS (@_)\n" if $Verbose; + my $self = shift; + _backhash($self) unless exists $keylist{$self}; + my $r = exists $keylist{$self}{$_[0]}; + warn "Memoize::NDBM_File EXISTS (@_) ==> $r\n" if $Verbose; + $r; +} + +sub DEFINED { + warn "Memoize::NDBM_File DEFINED (@_)\n" if $Verbose; + my $self = shift; + _backhash($self) unless exists $keylist{$self}; + defined $keylist{$self}{$_[0]}; +} + +sub DESTROY { + warn "Memoize::NDBM_File DESTROY (@_)\n" if $Verbose; + my $self = shift; + delete $keylist{$self}; # So much for reference counting... + $self->SUPER::DESTROY(@_); +} + +# Maybe establish the keylist at TIEHASH time instead? + +sub STORE { + warn "Memoize::NDBM_File STORE (@_)\n" if $VERBOSE; + my $self = shift; + $keylist{$self}{$_[0]} = undef; + $self->SUPER::STORE(@_); +} + + + +# Inherit FETCH and TIEHASH + +1; +#! perl + +# Getopt::Long.pm -- Universal options parsing +# Author : Johan Vromans +# Created On : Tue Sep 11 15:00:12 1990 +# Last Modified By: Johan Vromans +# Last Modified On: Sat May 27 12:11:39 2017 +# Update Count : 1715 +# Status : Released + +################ Module Preamble ################ + +use 5.004; + +use strict; +use warnings; + +package Getopt::Long; + +use vars qw($VERSION); +$VERSION = 2.50; +# For testing versions only. +use vars qw($VERSION_STRING); +$VERSION_STRING = "2.50"; + +use Exporter; +use vars qw(@ISA @EXPORT @EXPORT_OK); +@ISA = qw(Exporter); + +# Exported subroutines. +sub GetOptions(@); # always +sub GetOptionsFromArray(@); # on demand +sub GetOptionsFromString(@); # on demand +sub Configure(@); # on demand +sub HelpMessage(@); # on demand +sub VersionMessage(@); # in demand + +BEGIN { + # Init immediately so their contents can be used in the 'use vars' below. + @EXPORT = qw(&GetOptions $REQUIRE_ORDER $PERMUTE $RETURN_IN_ORDER); + @EXPORT_OK = qw(&HelpMessage &VersionMessage &Configure + &GetOptionsFromArray &GetOptionsFromString); +} + +# User visible variables. +use vars @EXPORT, @EXPORT_OK; +use vars qw($error $debug $major_version $minor_version); +# Deprecated visible variables. +use vars qw($autoabbrev $getopt_compat $ignorecase $bundling $order + $passthrough); +# Official invisible variables. +use vars qw($genprefix $caller $gnu_compat $auto_help $auto_version $longprefix); + +# Really invisible variables. +my $bundling_values; + +# Public subroutines. +sub config(@); # deprecated name + +# Private subroutines. +sub ConfigDefaults(); +sub ParseOptionSpec($$); +sub OptCtl($); +sub FindOption($$$$$); +sub ValidValue ($$$$$); + +################ Local Variables ################ + +# $requested_version holds the version that was mentioned in the 'use' +# or 'require', if any. It can be used to enable or disable specific +# features. +my $requested_version = 0; + +################ Resident subroutines ################ + +sub ConfigDefaults() { + # Handle POSIX compliancy. + if ( defined $ENV{"POSIXLY_CORRECT"} ) { + $genprefix = "(--|-)"; + $autoabbrev = 0; # no automatic abbrev of options + $bundling = 0; # no bundling of single letter switches + $getopt_compat = 0; # disallow '+' to start options + $order = $REQUIRE_ORDER; + } + else { + $genprefix = "(--|-|\\+)"; + $autoabbrev = 1; # automatic abbrev of options + $bundling = 0; # bundling off by default + $getopt_compat = 1; # allow '+' to start options + $order = $PERMUTE; + } + # Other configurable settings. + $debug = 0; # for debugging + $error = 0; # error tally + $ignorecase = 1; # ignore case when matching options + $passthrough = 0; # leave unrecognized options alone + $gnu_compat = 0; # require --opt=val if value is optional + $longprefix = "(--)"; # what does a long prefix look like + $bundling_values = 0; # no bundling of values +} + +# Override import. +sub import { + my $pkg = shift; # package + my @syms = (); # symbols to import + my @config = (); # configuration + my $dest = \@syms; # symbols first + for ( @_ ) { + if ( $_ eq ':config' ) { + $dest = \@config; # config next + next; + } + push(@$dest, $_); # push + } + # Hide one level and call super. + local $Exporter::ExportLevel = 1; + push(@syms, qw(&GetOptions)) if @syms; # always export GetOptions + $requested_version = 0; + $pkg->SUPER::import(@syms); + # And configure. + Configure(@config) if @config; +} + +################ Initialization ################ + +# Values for $order. See GNU getopt.c for details. +($REQUIRE_ORDER, $PERMUTE, $RETURN_IN_ORDER) = (0..2); +# Version major/minor numbers. +($major_version, $minor_version) = $VERSION =~ /^(\d+)\.(\d+)/; + +ConfigDefaults(); + +################ OO Interface ################ + +package Getopt::Long::Parser; + +# Store a copy of the default configuration. Since ConfigDefaults has +# just been called, what we get from Configure is the default. +my $default_config = do { + Getopt::Long::Configure () +}; + +sub new { + my $that = shift; + my $class = ref($that) || $that; + my %atts = @_; + + # Register the callers package. + my $self = { caller_pkg => (caller)[0] }; + + bless ($self, $class); + + # Process config attributes. + if ( defined $atts{config} ) { + my $save = Getopt::Long::Configure ($default_config, @{$atts{config}}); + $self->{settings} = Getopt::Long::Configure ($save); + delete ($atts{config}); + } + # Else use default config. + else { + $self->{settings} = $default_config; + } + + if ( %atts ) { # Oops + die(__PACKAGE__.": unhandled attributes: ". + join(" ", sort(keys(%atts)))."\n"); + } + + $self; +} + +sub configure { + my ($self) = shift; + + # Restore settings, merge new settings in. + my $save = Getopt::Long::Configure ($self->{settings}, @_); + + # Restore orig config and save the new config. + $self->{settings} = Getopt::Long::Configure ($save); +} + +sub getoptions { + my ($self) = shift; + + return $self->getoptionsfromarray(\@ARGV, @_); +} + +sub getoptionsfromarray { + my ($self) = shift; + + # Restore config settings. + my $save = Getopt::Long::Configure ($self->{settings}); + + # Call main routine. + my $ret = 0; + $Getopt::Long::caller = $self->{caller_pkg}; + + eval { + # Locally set exception handler to default, otherwise it will + # be called implicitly here, and again explicitly when we try + # to deliver the messages. + local ($SIG{__DIE__}) = 'DEFAULT'; + $ret = Getopt::Long::GetOptionsFromArray (@_); + }; + + # Restore saved settings. + Getopt::Long::Configure ($save); + + # Handle errors and return value. + die ($@) if $@; + return $ret; +} + +package Getopt::Long; + +################ Back to Normal ################ + +# Indices in option control info. +# Note that ParseOptions uses the fields directly. Search for 'hard-wired'. +use constant CTL_TYPE => 0; +#use constant CTL_TYPE_FLAG => ''; +#use constant CTL_TYPE_NEG => '!'; +#use constant CTL_TYPE_INCR => '+'; +#use constant CTL_TYPE_INT => 'i'; +#use constant CTL_TYPE_INTINC => 'I'; +#use constant CTL_TYPE_XINT => 'o'; +#use constant CTL_TYPE_FLOAT => 'f'; +#use constant CTL_TYPE_STRING => 's'; + +use constant CTL_CNAME => 1; + +use constant CTL_DEFAULT => 2; + +use constant CTL_DEST => 3; + use constant CTL_DEST_SCALAR => 0; + use constant CTL_DEST_ARRAY => 1; + use constant CTL_DEST_HASH => 2; + use constant CTL_DEST_CODE => 3; + +use constant CTL_AMIN => 4; +use constant CTL_AMAX => 5; + +# FFU. +#use constant CTL_RANGE => ; +#use constant CTL_REPEAT => ; + +# Rather liberal patterns to match numbers. +use constant PAT_INT => "[-+]?_*[0-9][0-9_]*"; +use constant PAT_XINT => + "(?:". + "[-+]?_*[1-9][0-9_]*". + "|". + "0x_*[0-9a-f][0-9a-f_]*". + "|". + "0b_*[01][01_]*". + "|". + "0[0-7_]*". + ")"; +use constant PAT_FLOAT => + "[-+]?". # optional sign + "(?=[0-9.])". # must start with digit or dec.point + "[0-9_]*". # digits before the dec.point + "(\.[0-9_]+)?". # optional fraction + "([eE][-+]?[0-9_]+)?"; # optional exponent + +sub GetOptions(@) { + # Shift in default array. + unshift(@_, \@ARGV); + # Try to keep caller() and Carp consistent. + goto &GetOptionsFromArray; +} + +sub GetOptionsFromString(@) { + my ($string) = shift; + require Text::ParseWords; + my $args = [ Text::ParseWords::shellwords($string) ]; + $caller ||= (caller)[0]; # current context + my $ret = GetOptionsFromArray($args, @_); + return ( $ret, $args ) if wantarray; + if ( @$args ) { + $ret = 0; + warn("GetOptionsFromString: Excess data \"@$args\" in string \"$string\"\n"); + } + $ret; +} + +sub GetOptionsFromArray(@) { + + my ($argv, @optionlist) = @_; # local copy of the option descriptions + my $argend = '--'; # option list terminator + my %opctl = (); # table of option specs + my $pkg = $caller || (caller)[0]; # current context + # Needed if linkage is omitted. + my @ret = (); # accum for non-options + my %linkage; # linkage + my $userlinkage; # user supplied HASH + my $opt; # current option + my $prefix = $genprefix; # current prefix + + $error = ''; + + if ( $debug ) { + # Avoid some warnings if debugging. + local ($^W) = 0; + print STDERR + ("Getopt::Long $Getopt::Long::VERSION ", + "called from package \"$pkg\".", + "\n ", + "argv: ", + defined($argv) + ? UNIVERSAL::isa( $argv, 'ARRAY' ) ? "(@$argv)" : $argv + : "<undef>", + "\n ", + "autoabbrev=$autoabbrev,". + "bundling=$bundling,", + "bundling_values=$bundling_values,", + "getopt_compat=$getopt_compat,", + "gnu_compat=$gnu_compat,", + "order=$order,", + "\n ", + "ignorecase=$ignorecase,", + "requested_version=$requested_version,", + "passthrough=$passthrough,", + "genprefix=\"$genprefix\",", + "longprefix=\"$longprefix\".", + "\n"); + } + + # Check for ref HASH as first argument. + # First argument may be an object. It's OK to use this as long + # as it is really a hash underneath. + $userlinkage = undef; + if ( @optionlist && ref($optionlist[0]) and + UNIVERSAL::isa($optionlist[0],'HASH') ) { + $userlinkage = shift (@optionlist); + print STDERR ("=> user linkage: $userlinkage\n") if $debug; + } + + # See if the first element of the optionlist contains option + # starter characters. + # Be careful not to interpret '<>' as option starters. + if ( @optionlist && $optionlist[0] =~ /^\W+$/ + && !($optionlist[0] eq '<>' + && @optionlist > 0 + && ref($optionlist[1])) ) { + $prefix = shift (@optionlist); + # Turn into regexp. Needs to be parenthesized! + $prefix =~ s/(\W)/\\$1/g; + $prefix = "([" . $prefix . "])"; + print STDERR ("=> prefix=\"$prefix\"\n") if $debug; + } + + # Verify correctness of optionlist. + %opctl = (); + while ( @optionlist ) { + my $opt = shift (@optionlist); + + unless ( defined($opt) ) { + $error .= "Undefined argument in option spec\n"; + next; + } + + # Strip leading prefix so people can specify "--foo=i" if they like. + $opt = $+ if $opt =~ /^$prefix+(.*)$/s; + + if ( $opt eq '<>' ) { + if ( (defined $userlinkage) + && !(@optionlist > 0 && ref($optionlist[0])) + && (exists $userlinkage->{$opt}) + && ref($userlinkage->{$opt}) ) { + unshift (@optionlist, $userlinkage->{$opt}); + } + unless ( @optionlist > 0 + && ref($optionlist[0]) && ref($optionlist[0]) eq 'CODE' ) { + $error .= "Option spec <> requires a reference to a subroutine\n"; + # Kill the linkage (to avoid another error). + shift (@optionlist) + if @optionlist && ref($optionlist[0]); + next; + } + $linkage{'<>'} = shift (@optionlist); + next; + } + + # Parse option spec. + my ($name, $orig) = ParseOptionSpec ($opt, \%opctl); + unless ( defined $name ) { + # Failed. $orig contains the error message. Sorry for the abuse. + $error .= $orig; + # Kill the linkage (to avoid another error). + shift (@optionlist) + if @optionlist && ref($optionlist[0]); + next; + } + + # If no linkage is supplied in the @optionlist, copy it from + # the userlinkage if available. + if ( defined $userlinkage ) { + unless ( @optionlist > 0 && ref($optionlist[0]) ) { + if ( exists $userlinkage->{$orig} && + ref($userlinkage->{$orig}) ) { + print STDERR ("=> found userlinkage for \"$orig\": ", + "$userlinkage->{$orig}\n") + if $debug; + unshift (@optionlist, $userlinkage->{$orig}); + } + else { + # Do nothing. Being undefined will be handled later. + next; + } + } + } + + # Copy the linkage. If omitted, link to global variable. + if ( @optionlist > 0 && ref($optionlist[0]) ) { + print STDERR ("=> link \"$orig\" to $optionlist[0]\n") + if $debug; + my $rl = ref($linkage{$orig} = shift (@optionlist)); + + if ( $rl eq "ARRAY" ) { + $opctl{$name}[CTL_DEST] = CTL_DEST_ARRAY; + } + elsif ( $rl eq "HASH" ) { + $opctl{$name}[CTL_DEST] = CTL_DEST_HASH; + } + elsif ( $rl eq "SCALAR" || $rl eq "REF" ) { +# if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) { +# my $t = $linkage{$orig}; +# $$t = $linkage{$orig} = []; +# } +# elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) { +# } +# else { + # Ok. +# } + } + elsif ( $rl eq "CODE" ) { + # Ok. + } + else { + $error .= "Invalid option linkage for \"$opt\"\n"; + } + } + else { + # Link to global $opt_XXX variable. + # Make sure a valid perl identifier results. + my $ov = $orig; + $ov =~ s/\W/_/g; + if ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY ) { + print STDERR ("=> link \"$orig\" to \@$pkg","::opt_$ov\n") + if $debug; + eval ("\$linkage{\$orig} = \\\@".$pkg."::opt_$ov;"); + } + elsif ( $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) { + print STDERR ("=> link \"$orig\" to \%$pkg","::opt_$ov\n") + if $debug; + eval ("\$linkage{\$orig} = \\\%".$pkg."::opt_$ov;"); + } + else { + print STDERR ("=> link \"$orig\" to \$$pkg","::opt_$ov\n") + if $debug; + eval ("\$linkage{\$orig} = \\\$".$pkg."::opt_$ov;"); + } + } + + if ( $opctl{$name}[CTL_TYPE] eq 'I' + && ( $opctl{$name}[CTL_DEST] == CTL_DEST_ARRAY + || $opctl{$name}[CTL_DEST] == CTL_DEST_HASH ) + ) { + $error .= "Invalid option linkage for \"$opt\"\n"; + } + + } + + $error .= "GetOptionsFromArray: 1st parameter is not an array reference\n" + unless $argv && UNIVERSAL::isa( $argv, 'ARRAY' ); + + # Bail out if errors found. + die ($error) if $error; + $error = 0; + + # Supply --version and --help support, if needed and allowed. + if ( defined($auto_version) ? $auto_version : ($requested_version >= 2.3203) ) { + if ( !defined($opctl{version}) ) { + $opctl{version} = ['','version',0,CTL_DEST_CODE,undef]; + $linkage{version} = \&VersionMessage; + } + $auto_version = 1; + } + if ( defined($auto_help) ? $auto_help : ($requested_version >= 2.3203) ) { + if ( !defined($opctl{help}) && !defined($opctl{'?'}) ) { + $opctl{help} = $opctl{'?'} = ['','help',0,CTL_DEST_CODE,undef]; + $linkage{help} = \&HelpMessage; + } + $auto_help = 1; + } + + # Show the options tables if debugging. + if ( $debug ) { + my ($arrow, $k, $v); + $arrow = "=> "; + while ( ($k,$v) = each(%opctl) ) { + print STDERR ($arrow, "\$opctl{$k} = $v ", OptCtl($v), "\n"); + $arrow = " "; + } + } + + # Process argument list + my $goon = 1; + while ( $goon && @$argv > 0 ) { + + # Get next argument. + $opt = shift (@$argv); + print STDERR ("=> arg \"", $opt, "\"\n") if $debug; + + # Double dash is option list terminator. + if ( defined($opt) && $opt eq $argend ) { + push (@ret, $argend) if $passthrough; + last; + } + + # Look it up. + my $tryopt = $opt; + my $found; # success status + my $key; # key (if hash type) + my $arg; # option argument + my $ctl; # the opctl entry + + ($found, $opt, $ctl, $arg, $key) = + FindOption ($argv, $prefix, $argend, $opt, \%opctl); + + if ( $found ) { + + # FindOption undefines $opt in case of errors. + next unless defined $opt; + + my $argcnt = 0; + while ( defined $arg ) { + + # Get the canonical name. + print STDERR ("=> cname for \"$opt\" is ") if $debug; + $opt = $ctl->[CTL_CNAME]; + print STDERR ("\"$ctl->[CTL_CNAME]\"\n") if $debug; + + if ( defined $linkage{$opt} ) { + print STDERR ("=> ref(\$L{$opt}) -> ", + ref($linkage{$opt}), "\n") if $debug; + + if ( ref($linkage{$opt}) eq 'SCALAR' + || ref($linkage{$opt}) eq 'REF' ) { + if ( $ctl->[CTL_TYPE] eq '+' ) { + print STDERR ("=> \$\$L{$opt} += \"$arg\"\n") + if $debug; + if ( defined ${$linkage{$opt}} ) { + ${$linkage{$opt}} += $arg; + } + else { + ${$linkage{$opt}} = $arg; + } + } + elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) { + print STDERR ("=> ref(\$L{$opt}) auto-vivified", + " to ARRAY\n") + if $debug; + my $t = $linkage{$opt}; + $$t = $linkage{$opt} = []; + print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n") + if $debug; + push (@{$linkage{$opt}}, $arg); + } + elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) { + print STDERR ("=> ref(\$L{$opt}) auto-vivified", + " to HASH\n") + if $debug; + my $t = $linkage{$opt}; + $$t = $linkage{$opt} = {}; + print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n") + if $debug; + $linkage{$opt}->{$key} = $arg; + } + else { + print STDERR ("=> \$\$L{$opt} = \"$arg\"\n") + if $debug; + ${$linkage{$opt}} = $arg; + } + } + elsif ( ref($linkage{$opt}) eq 'ARRAY' ) { + print STDERR ("=> push(\@{\$L{$opt}, \"$arg\")\n") + if $debug; + push (@{$linkage{$opt}}, $arg); + } + elsif ( ref($linkage{$opt}) eq 'HASH' ) { + print STDERR ("=> \$\$L{$opt}->{$key} = \"$arg\"\n") + if $debug; + $linkage{$opt}->{$key} = $arg; + } + elsif ( ref($linkage{$opt}) eq 'CODE' ) { + print STDERR ("=> &L{$opt}(\"$opt\"", + $ctl->[CTL_DEST] == CTL_DEST_HASH ? ", \"$key\"" : "", + ", \"$arg\")\n") + if $debug; + my $eval_error = do { + local $@; + local $SIG{__DIE__} = 'DEFAULT'; + eval { + &{$linkage{$opt}} + (Getopt::Long::CallBack->new + (name => $opt, + ctl => $ctl, + opctl => \%opctl, + linkage => \%linkage, + prefix => $prefix, + ), + $ctl->[CTL_DEST] == CTL_DEST_HASH ? ($key) : (), + $arg); + }; + $@; + }; + print STDERR ("=> die($eval_error)\n") + if $debug && $eval_error ne ''; + if ( $eval_error =~ /^!/ ) { + if ( $eval_error =~ /^!FINISH\b/ ) { + $goon = 0; + } + } + elsif ( $eval_error ne '' ) { + warn ($eval_error); + $error++; + } + } + else { + print STDERR ("Invalid REF type \"", ref($linkage{$opt}), + "\" in linkage\n"); + die("Getopt::Long -- internal error!\n"); + } + } + # No entry in linkage means entry in userlinkage. + elsif ( $ctl->[CTL_DEST] == CTL_DEST_ARRAY ) { + if ( defined $userlinkage->{$opt} ) { + print STDERR ("=> push(\@{\$L{$opt}}, \"$arg\")\n") + if $debug; + push (@{$userlinkage->{$opt}}, $arg); + } + else { + print STDERR ("=>\$L{$opt} = [\"$arg\"]\n") + if $debug; + $userlinkage->{$opt} = [$arg]; + } + } + elsif ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) { + if ( defined $userlinkage->{$opt} ) { + print STDERR ("=> \$L{$opt}->{$key} = \"$arg\"\n") + if $debug; + $userlinkage->{$opt}->{$key} = $arg; + } + else { + print STDERR ("=>\$L{$opt} = {$key => \"$arg\"}\n") + if $debug; + $userlinkage->{$opt} = {$key => $arg}; + } + } + else { + if ( $ctl->[CTL_TYPE] eq '+' ) { + print STDERR ("=> \$L{$opt} += \"$arg\"\n") + if $debug; + if ( defined $userlinkage->{$opt} ) { + $userlinkage->{$opt} += $arg; + } + else { + $userlinkage->{$opt} = $arg; + } + } + else { + print STDERR ("=>\$L{$opt} = \"$arg\"\n") if $debug; + $userlinkage->{$opt} = $arg; + } + } + + $argcnt++; + last if $argcnt >= $ctl->[CTL_AMAX] && $ctl->[CTL_AMAX] != -1; + undef($arg); + + # Need more args? + if ( $argcnt < $ctl->[CTL_AMIN] ) { + if ( @$argv ) { + if ( ValidValue($ctl, $argv->[0], 1, $argend, $prefix) ) { + $arg = shift(@$argv); + if ( $ctl->[CTL_TYPE] =~ /^[iIo]$/ ) { + $arg =~ tr/_//d; + $arg = $ctl->[CTL_TYPE] eq 'o' && $arg =~ /^0/ + ? oct($arg) + : 0+$arg + } + ($key,$arg) = $arg =~ /^([^=]+)=(.*)/ + if $ctl->[CTL_DEST] == CTL_DEST_HASH; + next; + } + warn("Value \"$$argv[0]\" invalid for option $opt\n"); + $error++; + } + else { + warn("Insufficient arguments for option $opt\n"); + $error++; + } + } + + # Any more args? + if ( @$argv && ValidValue($ctl, $argv->[0], 0, $argend, $prefix) ) { + $arg = shift(@$argv); + if ( $ctl->[CTL_TYPE] =~ /^[iIo]$/ ) { + $arg =~ tr/_//d; + $arg = $ctl->[CTL_TYPE] eq 'o' && $arg =~ /^0/ + ? oct($arg) + : 0+$arg + } + ($key,$arg) = $arg =~ /^([^=]+)=(.*)/ + if $ctl->[CTL_DEST] == CTL_DEST_HASH; + next; + } + } + } + + # Not an option. Save it if we $PERMUTE and don't have a <>. + elsif ( $order == $PERMUTE ) { + # Try non-options call-back. + my $cb; + if ( defined ($cb = $linkage{'<>'}) ) { + print STDERR ("=> &L{$tryopt}(\"$tryopt\")\n") + if $debug; + my $eval_error = do { + local $@; + local $SIG{__DIE__} = 'DEFAULT'; + eval { + # The arg to <> cannot be the CallBack object + # since it may be passed to other modules that + # get confused (e.g., Archive::Tar). Well, + # it's not relevant for this callback anyway. + &$cb($tryopt); + }; + $@; + }; + print STDERR ("=> die($eval_error)\n") + if $debug && $eval_error ne ''; + if ( $eval_error =~ /^!/ ) { + if ( $eval_error =~ /^!FINISH\b/ ) { + $goon = 0; + } + } + elsif ( $eval_error ne '' ) { + warn ($eval_error); + $error++; + } + } + else { + print STDERR ("=> saving \"$tryopt\" ", + "(not an option, may permute)\n") if $debug; + push (@ret, $tryopt); + } + next; + } + + # ...otherwise, terminate. + else { + # Push this one back and exit. + unshift (@$argv, $tryopt); + return ($error == 0); + } + + } + + # Finish. + if ( @ret && $order == $PERMUTE ) { + # Push back accumulated arguments + print STDERR ("=> restoring \"", join('" "', @ret), "\"\n") + if $debug; + unshift (@$argv, @ret); + } + + return ($error == 0); +} + +# A readable representation of what's in an optbl. +sub OptCtl ($) { + my ($v) = @_; + my @v = map { defined($_) ? ($_) : ("<undef>") } @$v; + "[". + join(",", + "\"$v[CTL_TYPE]\"", + "\"$v[CTL_CNAME]\"", + "\"$v[CTL_DEFAULT]\"", + ("\$","\@","\%","\&")[$v[CTL_DEST] || 0], + $v[CTL_AMIN] || '', + $v[CTL_AMAX] || '', +# $v[CTL_RANGE] || '', +# $v[CTL_REPEAT] || '', + ). "]"; +} + +# Parse an option specification and fill the tables. +sub ParseOptionSpec ($$) { + my ($opt, $opctl) = @_; + + # Match option spec. + if ( $opt !~ m;^ + ( + # Option name + (?: \w+[-\w]* ) + # Alias names, or "?" + (?: \| (?: \? | \w[-\w]* ) )* + # Aliases + (?: \| (?: [^-|!+=:][^|!+=:]* )? )* + )? + ( + # Either modifiers ... + [!+] + | + # ... or a value/dest/repeat specification + [=:] [ionfs] [@%]? (?: \{\d*,?\d*\} )? + | + # ... or an optional-with-default spec + : (?: -?\d+ | \+ ) [@%]? + )? + $;x ) { + return (undef, "Error in option spec: \"$opt\"\n"); + } + + my ($names, $spec) = ($1, $2); + $spec = '' unless defined $spec; + + # $orig keeps track of the primary name the user specified. + # This name will be used for the internal or external linkage. + # In other words, if the user specifies "FoO|BaR", it will + # match any case combinations of 'foo' and 'bar', but if a global + # variable needs to be set, it will be $opt_FoO in the exact case + # as specified. + my $orig; + + my @names; + if ( defined $names ) { + @names = split (/\|/, $names); + $orig = $names[0]; + } + else { + @names = (''); + $orig = ''; + } + + # Construct the opctl entries. + my $entry; + if ( $spec eq '' || $spec eq '+' || $spec eq '!' ) { + # Fields are hard-wired here. + $entry = [$spec,$orig,undef,CTL_DEST_SCALAR,0,0]; + } + elsif ( $spec =~ /^:(-?\d+|\+)([@%])?$/ ) { + my $def = $1; + my $dest = $2; + my $type = $def eq '+' ? 'I' : 'i'; + $dest ||= '$'; + $dest = $dest eq '@' ? CTL_DEST_ARRAY + : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR; + # Fields are hard-wired here. + $entry = [$type,$orig,$def eq '+' ? undef : $def, + $dest,0,1]; + } + else { + my ($mand, $type, $dest) = + $spec =~ /^([=:])([ionfs])([@%])?(\{(\d+)?(,)?(\d+)?\})?$/; + return (undef, "Cannot repeat while bundling: \"$opt\"\n") + if $bundling && defined($4); + my ($mi, $cm, $ma) = ($5, $6, $7); + return (undef, "{0} is useless in option spec: \"$opt\"\n") + if defined($mi) && !$mi && !defined($ma) && !defined($cm); + + $type = 'i' if $type eq 'n'; + $dest ||= '$'; + $dest = $dest eq '@' ? CTL_DEST_ARRAY + : $dest eq '%' ? CTL_DEST_HASH : CTL_DEST_SCALAR; + # Default minargs to 1/0 depending on mand status. + $mi = $mand eq '=' ? 1 : 0 unless defined $mi; + # Adjust mand status according to minargs. + $mand = $mi ? '=' : ':'; + # Adjust maxargs. + $ma = $mi ? $mi : 1 unless defined $ma || defined $cm; + return (undef, "Max must be greater than zero in option spec: \"$opt\"\n") + if defined($ma) && !$ma; + return (undef, "Max less than min in option spec: \"$opt\"\n") + if defined($ma) && $ma < $mi; + + # Fields are hard-wired here. + $entry = [$type,$orig,undef,$dest,$mi,$ma||-1]; + } + + # Process all names. First is canonical, the rest are aliases. + my $dups = ''; + foreach ( @names ) { + + $_ = lc ($_) + if $ignorecase > (($bundling && length($_) == 1) ? 1 : 0); + + if ( exists $opctl->{$_} ) { + $dups .= "Duplicate specification \"$opt\" for option \"$_\"\n"; + } + + if ( $spec eq '!' ) { + $opctl->{"no$_"} = $entry; + $opctl->{"no-$_"} = $entry; + $opctl->{$_} = [@$entry]; + $opctl->{$_}->[CTL_TYPE] = ''; + } + else { + $opctl->{$_} = $entry; + } + } + + if ( $dups && $^W ) { + foreach ( split(/\n+/, $dups) ) { + warn($_."\n"); + } + } + ($names[0], $orig); +} + +# Option lookup. +sub FindOption ($$$$$) { + + # returns (1, $opt, $ctl, $arg, $key) if okay, + # returns (1, undef) if option in error, + # returns (0) otherwise. + + my ($argv, $prefix, $argend, $opt, $opctl) = @_; + + print STDERR ("=> find \"$opt\"\n") if $debug; + + return (0) unless defined($opt); + return (0) unless $opt =~ /^($prefix)(.*)$/s; + return (0) if $opt eq "-" && !defined $opctl->{''}; + + $opt = substr( $opt, length($1) ); # retain taintedness + my $starter = $1; + + print STDERR ("=> split \"$starter\"+\"$opt\"\n") if $debug; + + my $optarg; # value supplied with --opt=value + my $rest; # remainder from unbundling + + # If it is a long option, it may include the value. + # With getopt_compat, only if not bundling. + if ( ($starter=~/^$longprefix$/ + || ($getopt_compat && ($bundling == 0 || $bundling == 2))) + && (my $oppos = index($opt, '=', 1)) > 0) { + my $optorg = $opt; + $opt = substr($optorg, 0, $oppos); + $optarg = substr($optorg, $oppos + 1); # retain tainedness + print STDERR ("=> option \"", $opt, + "\", optarg = \"$optarg\"\n") if $debug; + } + + #### Look it up ### + + my $tryopt = $opt; # option to try + + if ( ( $bundling || $bundling_values ) && $starter eq '-' ) { + + # To try overrides, obey case ignore. + $tryopt = $ignorecase ? lc($opt) : $opt; + + # If bundling == 2, long options can override bundles. + if ( $bundling == 2 && length($tryopt) > 1 + && defined ($opctl->{$tryopt}) ) { + print STDERR ("=> $starter$tryopt overrides unbundling\n") + if $debug; + } + + # If bundling_values, option may be followed by the value. + elsif ( $bundling_values ) { + $tryopt = $opt; + # Unbundle single letter option. + $rest = length ($tryopt) > 0 ? substr ($tryopt, 1) : ''; + $tryopt = substr ($tryopt, 0, 1); + $tryopt = lc ($tryopt) if $ignorecase > 1; + print STDERR ("=> $starter$tryopt unbundled from ", + "$starter$tryopt$rest\n") if $debug; + # Whatever remains may not be considered an option. + $optarg = $rest eq '' ? undef : $rest; + $rest = undef; + } + + # Split off a single letter and leave the rest for + # further processing. + else { + $tryopt = $opt; + # Unbundle single letter option. + $rest = length ($tryopt) > 0 ? substr ($tryopt, 1) : ''; + $tryopt = substr ($tryopt, 0, 1); + $tryopt = lc ($tryopt) if $ignorecase > 1; + print STDERR ("=> $starter$tryopt unbundled from ", + "$starter$tryopt$rest\n") if $debug; + $rest = undef unless $rest ne ''; + } + } + + # Try auto-abbreviation. + elsif ( $autoabbrev && $opt ne "" ) { + # Sort the possible long option names. + my @names = sort(keys (%$opctl)); + # Downcase if allowed. + $opt = lc ($opt) if $ignorecase; + $tryopt = $opt; + # Turn option name into pattern. + my $pat = quotemeta ($opt); + # Look up in option names. + my @hits = grep (/^$pat/, @names); + print STDERR ("=> ", scalar(@hits), " hits (@hits) with \"$pat\" ", + "out of ", scalar(@names), "\n") if $debug; + + # Check for ambiguous results. + unless ( (@hits <= 1) || (grep ($_ eq $opt, @hits) == 1) ) { + # See if all matches are for the same option. + my %hit; + foreach ( @hits ) { + my $hit = $opctl->{$_}->[CTL_CNAME] + if defined $opctl->{$_}->[CTL_CNAME]; + $hit = "no" . $hit if $opctl->{$_}->[CTL_TYPE] eq '!'; + $hit{$hit} = 1; + } + # Remove auto-supplied options (version, help). + if ( keys(%hit) == 2 ) { + if ( $auto_version && exists($hit{version}) ) { + delete $hit{version}; + } + elsif ( $auto_help && exists($hit{help}) ) { + delete $hit{help}; + } + } + # Now see if it really is ambiguous. + unless ( keys(%hit) == 1 ) { + return (0) if $passthrough; + warn ("Option ", $opt, " is ambiguous (", + join(", ", @hits), ")\n"); + $error++; + return (1, undef); + } + @hits = keys(%hit); + } + + # Complete the option name, if appropriate. + if ( @hits == 1 && $hits[0] ne $opt ) { + $tryopt = $hits[0]; + $tryopt = lc ($tryopt) + if $ignorecase > (($bundling && length($tryopt) == 1) ? 1 : 0); + print STDERR ("=> option \"$opt\" -> \"$tryopt\"\n") + if $debug; + } + } + + # Map to all lowercase if ignoring case. + elsif ( $ignorecase ) { + $tryopt = lc ($opt); + } + + # Check validity by fetching the info. + my $ctl = $opctl->{$tryopt}; + unless ( defined $ctl ) { + return (0) if $passthrough; + # Pretend one char when bundling. + if ( $bundling == 1 && length($starter) == 1 ) { + $opt = substr($opt,0,1); + unshift (@$argv, $starter.$rest) if defined $rest; + } + if ( $opt eq "" ) { + warn ("Missing option after ", $starter, "\n"); + } + else { + warn ("Unknown option: ", $opt, "\n"); + } + $error++; + return (1, undef); + } + # Apparently valid. + $opt = $tryopt; + print STDERR ("=> found ", OptCtl($ctl), + " for \"", $opt, "\"\n") if $debug; + + #### Determine argument status #### + + # If it is an option w/o argument, we're almost finished with it. + my $type = $ctl->[CTL_TYPE]; + my $arg; + + if ( $type eq '' || $type eq '!' || $type eq '+' ) { + if ( defined $optarg ) { + return (0) if $passthrough; + warn ("Option ", $opt, " does not take an argument\n"); + $error++; + undef $opt; + undef $optarg if $bundling_values; + } + elsif ( $type eq '' || $type eq '+' ) { + # Supply explicit value. + $arg = 1; + } + else { + $opt =~ s/^no-?//i; # strip NO prefix + $arg = 0; # supply explicit value + } + unshift (@$argv, $starter.$rest) if defined $rest; + return (1, $opt, $ctl, $arg); + } + + # Get mandatory status and type info. + my $mand = $ctl->[CTL_AMIN]; + + # Check if there is an option argument available. + if ( $gnu_compat ) { + my $optargtype = 0; # none, 1 = empty, 2 = nonempty, 3 = aux + if ( defined($optarg) ) { + $optargtype = (length($optarg) == 0) ? 1 : 2; + } + elsif ( defined $rest || @$argv > 0 ) { + # GNU getopt_long() does not accept the (optional) + # argument to be passed to the option without = sign. + # We do, since not doing so breaks existing scripts. + $optargtype = 3; + } + if(($optargtype == 0) && !$mand) { + my $val + = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] + : $type eq 's' ? '' + : 0; + return (1, $opt, $ctl, $val); + } + return (1, $opt, $ctl, $type eq 's' ? '' : 0) + if $optargtype == 1; # --foo= -> return nothing + } + + # Check if there is an option argument available. + if ( defined $optarg + ? ($optarg eq '') + : !(defined $rest || @$argv > 0) ) { + # Complain if this option needs an argument. +# if ( $mand && !($type eq 's' ? defined($optarg) : 0) ) { + if ( $mand ) { + return (0) if $passthrough; + warn ("Option ", $opt, " requires an argument\n"); + $error++; + return (1, undef); + } + if ( $type eq 'I' ) { + # Fake incremental type. + my @c = @$ctl; + $c[CTL_TYPE] = '+'; + return (1, $opt, \@c, 1); + } + return (1, $opt, $ctl, + defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : + $type eq 's' ? '' : 0); + } + + # Get (possibly optional) argument. + $arg = (defined $rest ? $rest + : (defined $optarg ? $optarg : shift (@$argv))); + + # Get key if this is a "name=value" pair for a hash option. + my $key; + if ($ctl->[CTL_DEST] == CTL_DEST_HASH && defined $arg) { + ($key, $arg) = ($arg =~ /^([^=]*)=(.*)$/s) ? ($1, $2) + : ($arg, defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : + ($mand ? undef : ($type eq 's' ? "" : 1))); + if (! defined $arg) { + warn ("Option $opt, key \"$key\", requires a value\n"); + $error++; + # Push back. + unshift (@$argv, $starter.$rest) if defined $rest; + return (1, undef); + } + } + + #### Check if the argument is valid for this option #### + + my $key_valid = $ctl->[CTL_DEST] == CTL_DEST_HASH ? "[^=]+=" : ""; + + if ( $type eq 's' ) { # string + # A mandatory string takes anything. + return (1, $opt, $ctl, $arg, $key) if $mand; + + # Same for optional string as a hash value + return (1, $opt, $ctl, $arg, $key) + if $ctl->[CTL_DEST] == CTL_DEST_HASH; + + # An optional string takes almost anything. + return (1, $opt, $ctl, $arg, $key) + if defined $optarg || defined $rest; + return (1, $opt, $ctl, $arg, $key) if $arg eq "-"; # ?? + + # Check for option or option list terminator. + if ($arg eq $argend || + $arg =~ /^$prefix.+/) { + # Push back. + unshift (@$argv, $arg); + # Supply empty value. + $arg = ''; + } + } + + elsif ( $type eq 'i' # numeric/integer + || $type eq 'I' # numeric/integer w/ incr default + || $type eq 'o' ) { # dec/oct/hex/bin value + + my $o_valid = $type eq 'o' ? PAT_XINT : PAT_INT; + + if ( $bundling && defined $rest + && $rest =~ /^($key_valid)($o_valid)(.*)$/si ) { + ($key, $arg, $rest) = ($1, $2, $+); + chop($key) if $key; + $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg; + unshift (@$argv, $starter.$rest) if defined $rest && $rest ne ''; + } + elsif ( $arg =~ /^$o_valid$/si ) { + $arg =~ tr/_//d; + $arg = ($type eq 'o' && $arg =~ /^0/) ? oct($arg) : 0+$arg; + } + else { + if ( defined $optarg || $mand ) { + if ( $passthrough ) { + unshift (@$argv, defined $rest ? $starter.$rest : $arg) + unless defined $optarg; + return (0); + } + warn ("Value \"", $arg, "\" invalid for option ", + $opt, " (", + $type eq 'o' ? "extended " : '', + "number expected)\n"); + $error++; + # Push back. + unshift (@$argv, $starter.$rest) if defined $rest; + return (1, undef); + } + else { + # Push back. + unshift (@$argv, defined $rest ? $starter.$rest : $arg); + if ( $type eq 'I' ) { + # Fake incremental type. + my @c = @$ctl; + $c[CTL_TYPE] = '+'; + return (1, $opt, \@c, 1); + } + # Supply default value. + $arg = defined($ctl->[CTL_DEFAULT]) ? $ctl->[CTL_DEFAULT] : 0; + } + } + } + + elsif ( $type eq 'f' ) { # real number, int is also ok + my $o_valid = PAT_FLOAT; + if ( $bundling && defined $rest && + $rest =~ /^($key_valid)($o_valid)(.*)$/s ) { + $arg =~ tr/_//d; + ($key, $arg, $rest) = ($1, $2, $+); + chop($key) if $key; + unshift (@$argv, $starter.$rest) if defined $rest && $rest ne ''; + } + elsif ( $arg =~ /^$o_valid$/ ) { + $arg =~ tr/_//d; + } + else { + if ( defined $optarg || $mand ) { + if ( $passthrough ) { + unshift (@$argv, defined $rest ? $starter.$rest : $arg) + unless defined $optarg; + return (0); + } + warn ("Value \"", $arg, "\" invalid for option ", + $opt, " (real number expected)\n"); + $error++; + # Push back. + unshift (@$argv, $starter.$rest) if defined $rest; + return (1, undef); + } + else { + # Push back. + unshift (@$argv, defined $rest ? $starter.$rest : $arg); + # Supply default value. + $arg = 0.0; + } + } + } + else { + die("Getopt::Long internal error (Can't happen)\n"); + } + return (1, $opt, $ctl, $arg, $key); +} + +sub ValidValue ($$$$$) { + my ($ctl, $arg, $mand, $argend, $prefix) = @_; + + if ( $ctl->[CTL_DEST] == CTL_DEST_HASH ) { + return 0 unless $arg =~ /[^=]+=(.*)/; + $arg = $1; + } + + my $type = $ctl->[CTL_TYPE]; + + if ( $type eq 's' ) { # string + # A mandatory string takes anything. + return (1) if $mand; + + return (1) if $arg eq "-"; + + # Check for option or option list terminator. + return 0 if $arg eq $argend || $arg =~ /^$prefix.+/; + return 1; + } + + elsif ( $type eq 'i' # numeric/integer + || $type eq 'I' # numeric/integer w/ incr default + || $type eq 'o' ) { # dec/oct/hex/bin value + + my $o_valid = $type eq 'o' ? PAT_XINT : PAT_INT; + return $arg =~ /^$o_valid$/si; + } + + elsif ( $type eq 'f' ) { # real number, int is also ok + my $o_valid = PAT_FLOAT; + return $arg =~ /^$o_valid$/; + } + die("ValidValue: Cannot happen\n"); +} + +# Getopt::Long Configuration. +sub Configure (@) { + my (@options) = @_; + + my $prevconfig = + [ $error, $debug, $major_version, $minor_version, $caller, + $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order, + $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help, + $longprefix, $bundling_values ]; + + if ( ref($options[0]) eq 'ARRAY' ) { + ( $error, $debug, $major_version, $minor_version, $caller, + $autoabbrev, $getopt_compat, $ignorecase, $bundling, $order, + $gnu_compat, $passthrough, $genprefix, $auto_version, $auto_help, + $longprefix, $bundling_values ) = @{shift(@options)}; + } + + my $opt; + foreach $opt ( @options ) { + my $try = lc ($opt); + my $action = 1; + if ( $try =~ /^no_?(.*)$/s ) { + $action = 0; + $try = $+; + } + if ( ($try eq 'default' or $try eq 'defaults') && $action ) { + ConfigDefaults (); + } + elsif ( ($try eq 'posix_default' or $try eq 'posix_defaults') ) { + local $ENV{POSIXLY_CORRECT}; + $ENV{POSIXLY_CORRECT} = 1 if $action; + ConfigDefaults (); + } + elsif ( $try eq 'auto_abbrev' or $try eq 'autoabbrev' ) { + $autoabbrev = $action; + } + elsif ( $try eq 'getopt_compat' ) { + $getopt_compat = $action; + $genprefix = $action ? "(--|-|\\+)" : "(--|-)"; + } + elsif ( $try eq 'gnu_getopt' ) { + if ( $action ) { + $gnu_compat = 1; + $bundling = 1; + $getopt_compat = 0; + $genprefix = "(--|-)"; + $order = $PERMUTE; + $bundling_values = 0; + } + } + elsif ( $try eq 'gnu_compat' ) { + $gnu_compat = $action; + $bundling = 0; + $bundling_values = 1; + } + elsif ( $try =~ /^(auto_?)?version$/ ) { + $auto_version = $action; + } + elsif ( $try =~ /^(auto_?)?help$/ ) { + $auto_help = $action; + } + elsif ( $try eq 'ignorecase' or $try eq 'ignore_case' ) { + $ignorecase = $action; + } + elsif ( $try eq 'ignorecase_always' or $try eq 'ignore_case_always' ) { + $ignorecase = $action ? 2 : 0; + } + elsif ( $try eq 'bundling' ) { + $bundling = $action; + $bundling_values = 0 if $action; + } + elsif ( $try eq 'bundling_override' ) { + $bundling = $action ? 2 : 0; + $bundling_values = 0 if $action; + } + elsif ( $try eq 'bundling_values' ) { + $bundling_values = $action; + $bundling = 0 if $action; + } + elsif ( $try eq 'require_order' ) { + $order = $action ? $REQUIRE_ORDER : $PERMUTE; + } + elsif ( $try eq 'permute' ) { + $order = $action ? $PERMUTE : $REQUIRE_ORDER; + } + elsif ( $try eq 'pass_through' or $try eq 'passthrough' ) { + $passthrough = $action; + } + elsif ( $try =~ /^prefix=(.+)$/ && $action ) { + $genprefix = $1; + # Turn into regexp. Needs to be parenthesized! + $genprefix = "(" . quotemeta($genprefix) . ")"; + eval { '' =~ /$genprefix/; }; + die("Getopt::Long: invalid pattern \"$genprefix\"\n") if $@; + } + elsif ( $try =~ /^prefix_pattern=(.+)$/ && $action ) { + $genprefix = $1; + # Parenthesize if needed. + $genprefix = "(" . $genprefix . ")" + unless $genprefix =~ /^\(.*\)$/; + eval { '' =~ m"$genprefix"; }; + die("Getopt::Long: invalid pattern \"$genprefix\"\n") if $@; + } + elsif ( $try =~ /^long_prefix_pattern=(.+)$/ && $action ) { + $longprefix = $1; + # Parenthesize if needed. + $longprefix = "(" . $longprefix . ")" + unless $longprefix =~ /^\(.*\)$/; + eval { '' =~ m"$longprefix"; }; + die("Getopt::Long: invalid long prefix pattern \"$longprefix\"\n") if $@; + } + elsif ( $try eq 'debug' ) { + $debug = $action; + } + else { + die("Getopt::Long: unknown or erroneous config parameter \"$opt\"\n") + } + } + $prevconfig; +} + +# Deprecated name. +sub config (@) { + Configure (@_); +} + +# Issue a standard message for --version. +# +# The arguments are mostly the same as for Pod::Usage::pod2usage: +# +# - a number (exit value) +# - a string (lead in message) +# - a hash with options. See Pod::Usage for details. +# +sub VersionMessage(@) { + # Massage args. + my $pa = setup_pa_args("version", @_); + + my $v = $main::VERSION; + my $fh = $pa->{-output} || + ( ($pa->{-exitval} eq "NOEXIT" || $pa->{-exitval} < 2) ? \*STDOUT : \*STDERR ); + + print $fh (defined($pa->{-message}) ? $pa->{-message} : (), + $0, defined $v ? " version $v" : (), + "\n", + "(", __PACKAGE__, "::", "GetOptions", + " version ", + defined($Getopt::Long::VERSION_STRING) + ? $Getopt::Long::VERSION_STRING : $VERSION, ";", + " Perl version ", + $] >= 5.006 ? sprintf("%vd", $^V) : $], + ")\n"); + exit($pa->{-exitval}) unless $pa->{-exitval} eq "NOEXIT"; +} + +# Issue a standard message for --help. +# +# The arguments are the same as for Pod::Usage::pod2usage: +# +# - a number (exit value) +# - a string (lead in message) +# - a hash with options. See Pod::Usage for details. +# +sub HelpMessage(@) { + eval { + require Pod::Usage; + import Pod::Usage; + 1; + } || die("Cannot provide help: cannot load Pod::Usage\n"); + + # Note that pod2usage will issue a warning if -exitval => NOEXIT. + pod2usage(setup_pa_args("help", @_)); + +} + +# Helper routine to set up a normalized hash ref to be used as +# argument to pod2usage. +sub setup_pa_args($@) { + my $tag = shift; # who's calling + + # If called by direct binding to an option, it will get the option + # name and value as arguments. Remove these, if so. + @_ = () if @_ == 2 && $_[0] eq $tag; + + my $pa; + if ( @_ > 1 ) { + $pa = { @_ }; + } + else { + $pa = shift || {}; + } + + # At this point, $pa can be a number (exit value), string + # (message) or hash with options. + + if ( UNIVERSAL::isa($pa, 'HASH') ) { + # Get rid of -msg vs. -message ambiguity. + $pa->{-message} = $pa->{-msg}; + delete($pa->{-msg}); + } + elsif ( $pa =~ /^-?\d+$/ ) { + $pa = { -exitval => $pa }; + } + else { + $pa = { -message => $pa }; + } + + # These are _our_ defaults. + $pa->{-verbose} = 0 unless exists($pa->{-verbose}); + $pa->{-exitval} = 0 unless exists($pa->{-exitval}); + $pa; +} + +# Sneak way to know what version the user requested. +sub VERSION { + $requested_version = $_[1]; + shift->SUPER::VERSION(@_); +} + +package Getopt::Long::CallBack; + +sub new { + my ($pkg, %atts) = @_; + bless { %atts }, $pkg; +} + +sub name { + my $self = shift; + ''.$self->{name}; +} + +use overload + # Treat this object as an ordinary string for legacy API. + '""' => \&name, + fallback => 1; + +1; + +################ Documentation ################ + + +package Getopt::Std; +require 5.000; +require Exporter; + + +@ISA = qw(Exporter); +@EXPORT = qw(getopt getopts); +$VERSION = '1.12'; +# uncomment the next line to disable 1.03-backward compatibility paranoia +# $STANDARD_HELP_VERSION = 1; + +# Process single-character switches with switch clustering. Pass one argument +# which is a string containing all switches that take an argument. For each +# switch found, sets $opt_x (where x is the switch name) to the value of the +# argument, or 1 if no argument. Switches which take an argument don't care +# whether there is a space between the switch and the argument. + +# Usage: +# getopt('oDI'); # -o, -D & -I take arg. Sets opt_* as a side effect. + +sub getopt (;$$) { + my ($argumentative, $hash) = @_; + $argumentative = '' if !defined $argumentative; + my ($first,$rest); + local $_; + local @EXPORT; + + while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) { + ($first,$rest) = ($1,$2); + if (/^--$/) { # early exit if -- + shift @ARGV; + last; + } + if (index($argumentative,$first) >= 0) { + if ($rest ne '') { + shift(@ARGV); + } + else { + shift(@ARGV); + $rest = shift(@ARGV); + } + if (ref $hash) { + $$hash{$first} = $rest; + } + else { + ${"opt_$first"} = $rest; + push( @EXPORT, "\$opt_$first" ); + } + } + else { + if (ref $hash) { + $$hash{$first} = 1; + } + else { + ${"opt_$first"} = 1; + push( @EXPORT, "\$opt_$first" ); + } + if ($rest ne '') { + $ARGV[0] = "-$rest"; + } + else { + shift(@ARGV); + } + } + } + unless (ref $hash) { + local $Exporter::ExportLevel = 1; + import Getopt::Std; + } +} + +sub output_h () { + return $OUTPUT_HELP_VERSION if defined $OUTPUT_HELP_VERSION; + return \*STDOUT if $STANDARD_HELP_VERSION; + return \*STDERR; +} + +sub try_exit () { + exit 0 if $STANDARD_HELP_VERSION; + my $p = __PACKAGE__; + print {output_h()} <<EOM; + [Now continuing due to backward compatibility and excessive paranoia. + See 'perldoc $p' about \$$p\::STANDARD_HELP_VERSION.] +EOM +} + +sub version_mess ($;$) { + my $args = shift; + my $h = output_h; + if (@_ and defined &main::VERSION_MESSAGE) { + main::VERSION_MESSAGE($h, __PACKAGE__, $VERSION, $args); + } else { + my $v = $main::VERSION; + $v = '[unknown]' unless defined $v; + my $myv = $VERSION; + $myv .= ' [paranoid]' unless $STANDARD_HELP_VERSION; + my $perlv = $]; + $perlv = sprintf "%vd", $^V if $] >= 5.006; + print $h <<EOH; +$0 version $v calling Getopt::Std::getopts (version $myv), +running under Perl version $perlv. +EOH + } +} + +sub help_mess ($;$) { + my $args = shift; + my $h = output_h; + if (@_ and defined &main::HELP_MESSAGE) { + main::HELP_MESSAGE($h, __PACKAGE__, $VERSION, $args); + } else { + my (@witharg) = ($args =~ /(\S)\s*:/g); + my (@rest) = ($args =~ /([^\s:])(?!\s*:)/g); + my ($help, $arg) = ('', ''); + if (@witharg) { + $help .= "\n\tWith arguments: -" . join " -", @witharg; + $arg = "\nSpace is not required between options and their arguments."; + } + if (@rest) { + $help .= "\n\tBoolean (without arguments): -" . join " -", @rest; + } + my ($scr) = ($0 =~ m,([^/\\]+)$,); + print $h <<EOH if @_; # Let the script override this + +Usage: $scr [-OPTIONS [-MORE_OPTIONS]] [--] [PROGRAM_ARG1 ...] +EOH + print $h <<EOH; + +The following single-character options are accepted:$help + +Options may be merged together. -- stops processing of options.$arg +EOH + my $has_pod; + if ( defined $0 and $0 ne '-e' and -f $0 and -r $0 + and open my $script, '<', $0 ) { + while (<$script>) { + $has_pod = 1, last if /^=(pod|head1)/; + } + } + print $h <<EOH if $has_pod; + +For more details run + perldoc -F $0 +EOH + } +} + +# Usage: +# getopts('a:bc'); # -a takes arg. -b & -c not. Sets opt_* as a +# # side effect. + +sub getopts ($;$) { + my ($argumentative, $hash) = @_; + my (@args,$first,$rest,$exit); + my $errs = 0; + local $_; + local @EXPORT; + + @args = split( / */, $argumentative ); + while(@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/s) { + ($first,$rest) = ($1,$2); + if (/^--$/) { # early exit if -- + shift @ARGV; + last; + } + my $pos = index($argumentative,$first); + if ($pos >= 0) { + if (defined($args[$pos+1]) and ($args[$pos+1] eq ':')) { + shift(@ARGV); + if ($rest eq '') { + ++$errs unless @ARGV; + $rest = shift(@ARGV); + } + if (ref $hash) { + $$hash{$first} = $rest; + } + else { + ${"opt_$first"} = $rest; + push( @EXPORT, "\$opt_$first" ); + } + } + else { + if (ref $hash) { + $$hash{$first} = 1; + } + else { + ${"opt_$first"} = 1; + push( @EXPORT, "\$opt_$first" ); + } + if ($rest eq '') { + shift(@ARGV); + } + else { + $ARGV[0] = "-$rest"; + } + } + } + else { + if ($first eq '-' and $rest eq 'help') { + version_mess($argumentative, 'main'); + help_mess($argumentative, 'main'); + try_exit(); + shift(@ARGV); + next; + } elsif ($first eq '-' and $rest eq 'version') { + version_mess($argumentative, 'main'); + try_exit(); + shift(@ARGV); + next; + } + warn "Unknown option: $first\n"; + ++$errs; + if ($rest ne '') { + $ARGV[0] = "-$rest"; + } + else { + shift(@ARGV); + } + } + } + unless (ref $hash) { + local $Exporter::ExportLevel = 1; + import Getopt::Std; + } + $errs == 0; +} + +1; +package Params::Check; + +use strict; + +use Carp qw[carp croak]; +use Locale::Maketext::Simple Style => 'gettext'; + +BEGIN { + use Exporter (); + use vars qw[ @ISA $VERSION @EXPORT_OK $VERBOSE $ALLOW_UNKNOWN + $STRICT_TYPE $STRIP_LEADING_DASHES $NO_DUPLICATES + $PRESERVE_CASE $ONLY_ALLOW_DEFINED $WARNINGS_FATAL + $SANITY_CHECK_TEMPLATE $CALLER_DEPTH $_ERROR_STRING + ]; + + @ISA = qw[ Exporter ]; + @EXPORT_OK = qw[check allow last_error]; + + $VERSION = '0.38'; + $VERBOSE = $^W ? 1 : 0; + $NO_DUPLICATES = 0; + $STRIP_LEADING_DASHES = 0; + $STRICT_TYPE = 0; + $ALLOW_UNKNOWN = 0; + $PRESERVE_CASE = 0; + $ONLY_ALLOW_DEFINED = 0; + $SANITY_CHECK_TEMPLATE = 1; + $WARNINGS_FATAL = 0; + $CALLER_DEPTH = 0; +} + +my %known_keys = map { $_ => 1 } + qw| required allow default strict_type no_override + store defined |; + + +sub check { + my ($utmpl, $href, $verbose) = @_; + + ### clear the current error string ### + _clear_error(); + + ### did we get the arguments we need? ### + if ( !$utmpl or !$href ) { + _store_error(loc('check() expects two arguments')); + return unless $WARNINGS_FATAL; + croak(__PACKAGE__->last_error); + } + + ### sensible defaults ### + $verbose ||= $VERBOSE || 0; + + ### XXX what type of template is it? ### + ### { key => { } } ? + #if (ref $args eq 'HASH') { + # 1; + #} + + ### clean up the template ### + my $args; + + ### don't even bother to loop, if there's nothing to clean up ### + if( $PRESERVE_CASE and !$STRIP_LEADING_DASHES ) { + $args = $href; + } else { + ### keys are not aliased ### + for my $key (keys %$href) { + my $org = $key; + $key = lc $key unless $PRESERVE_CASE; + $key =~ s/^-// if $STRIP_LEADING_DASHES; + $args->{$key} = $href->{$org}; + } + } + + my %defs; + + ### which template entries have a 'store' member + my @want_store; + + ### sanity check + defaults + required keys set? ### + my $fail; + for my $key (keys %$utmpl) { + my $tmpl = $utmpl->{$key}; + + ### check if required keys are provided + ### keys are now lower cased, unless preserve case was enabled + ### at which point, the utmpl keys must match, but that's the users + ### problem. + if( $tmpl->{'required'} and not exists $args->{$key} ) { + _store_error( + loc(q|Required option '%1' is not provided for %2 by %3|, + $key, _who_was_it(), _who_was_it(1)), $verbose ); + + ### mark the error ### + $fail++; + next; + } + + ### next, set the default, make sure the key exists in %defs ### + $defs{$key} = $tmpl->{'default'} + if exists $tmpl->{'default'}; + + if( $SANITY_CHECK_TEMPLATE ) { + ### last, check if they provided any weird template keys + ### -- do this last so we don't always execute this code. + ### just a small optimization. + map { _store_error( + loc(q|Template type '%1' not supported [at key '%2']|, + $_, $key), 1, 0 ); + } grep { + not $known_keys{$_} + } keys %$tmpl; + + ### make sure you passed a ref, otherwise, complain about it! + if ( exists $tmpl->{'store'} ) { + _store_error( loc( + q|Store variable for '%1' is not a reference!|, $key + ), 1, 0 ) unless ref $tmpl->{'store'}; + } + } + + push @want_store, $key if $tmpl->{'store'}; + } + + ### errors found ### + return if $fail; + + ### flag to see if anything went wrong ### + my $wrong; + + ### flag to see if we warned for anything, needed for warnings_fatal + my $warned; + + for my $key (keys %$args) { + my $arg = $args->{$key}; + + ### you gave us this key, but it's not in the template ### + unless( $utmpl->{$key} ) { + + ### but we'll allow it anyway ### + if( $ALLOW_UNKNOWN ) { + $defs{$key} = $arg; + + ### warn about the error ### + } else { + _store_error( + loc("Key '%1' is not a valid key for %2 provided by %3", + $key, _who_was_it(), _who_was_it(1)), $verbose); + $warned ||= 1; + } + next; + } + + ### copy of this keys template instructions, to save derefs ### + my %tmpl = %{$utmpl->{$key}}; + + ### check if you're even allowed to override this key ### + if( $tmpl{'no_override'} ) { + _store_error( + loc(q[You are not allowed to override key '%1']. + q[for %2 from %3], $key, _who_was_it(), _who_was_it(1)), + $verbose + ); + $warned ||= 1; + next; + } + + ### check if you were supposed to provide defined() values ### + if( ($tmpl{'defined'} || $ONLY_ALLOW_DEFINED) and not defined $arg ) { + _store_error(loc(q|Key '%1' must be defined when passed|, $key), + $verbose ); + $wrong ||= 1; + next; + } + + ### check if they should be of a strict type, and if it is ### + if( ($tmpl{'strict_type'} || $STRICT_TYPE) and + (ref $arg ne ref $tmpl{'default'}) + ) { + _store_error(loc(q|Key '%1' needs to be of type '%2'|, + $key, ref $tmpl{'default'} || 'SCALAR'), $verbose ); + $wrong ||= 1; + next; + } + + ### check if we have an allow handler, to validate against ### + ### allow() will report its own errors ### + if( exists $tmpl{'allow'} and not do { + local $_ERROR_STRING; + allow( $arg, $tmpl{'allow'} ) + } + ) { + ### stringify the value in the error report -- we don't want dumps + ### of objects, but we do want to see *roughly* what we passed + _store_error(loc(q|Key '%1' (%2) is of invalid type for '%3' |. + q|provided by %4|, + $key, "$arg", _who_was_it(), + _who_was_it(1)), $verbose); + $wrong ||= 1; + next; + } + + ### we got here, then all must be OK ### + $defs{$key} = $arg; + + } + + ### croak with the collected errors if there were errors and + ### we have the fatal flag toggled. + croak(__PACKAGE__->last_error) if ($wrong || $warned) && $WARNINGS_FATAL; + + ### done with our loop... if $wrong is set, something went wrong + ### and the user is already informed, just return... + return if $wrong; + + ### check if we need to store any of the keys ### + ### can't do it before, because something may go wrong later, + ### leaving the user with a few set variables + for my $key (@want_store) { + next unless exists $defs{$key}; + my $ref = $utmpl->{$key}{'store'}; + $$ref = $NO_DUPLICATES ? delete $defs{$key} : $defs{$key}; + } + + return \%defs; +} + + +sub allow { + ### use $_[0] and $_[1] since this is hot code... ### + #my ($val, $ref) = @_; + + ### it's a regexp ### + if( ref $_[1] eq 'Regexp' ) { + local $^W; # silence warnings if $val is undef # + return if $_[0] !~ /$_[1]/; + + ### it's a sub ### + } elsif ( ref $_[1] eq 'CODE' ) { + return unless $_[1]->( $_[0] ); + + ### it's an array ### + } elsif ( ref $_[1] eq 'ARRAY' ) { + + ### loop over the elements, see if one of them says the + ### value is OK + ### also, short-circuit when possible + for ( @{$_[1]} ) { + return 1 if allow( $_[0], $_ ); + } + + return; + + ### fall back to a simple, but safe 'eq' ### + } else { + return unless _safe_eq( $_[0], $_[1] ); + } + + ### we got here, no failures ### + return 1; +} + +### helper functions ### + +sub _safe_eq { + ### only do a straight 'eq' if they're both defined ### + return defined($_[0]) && defined($_[1]) + ? $_[0] eq $_[1] + : defined($_[0]) eq defined($_[1]); +} + +sub _who_was_it { + my $level = $_[0] || 0; + + return (caller(2 + $CALLER_DEPTH + $level))[3] || 'ANON' +} + + +{ $_ERROR_STRING = ''; + + sub _store_error { + my($err, $verbose, $offset) = @_[0..2]; + $verbose ||= 0; + $offset ||= 0; + my $level = 1 + $offset; + + local $Carp::CarpLevel = $level; + + carp $err if $verbose; + + $_ERROR_STRING .= $err . "\n"; + } + + sub _clear_error { + $_ERROR_STRING = ''; + } + + sub last_error { $_ERROR_STRING } +} + +1; + + +# Local variables: +# c-indentation-style: bsd +# c-basic-offset: 4 +# indent-tabs-mode: nil +# End: +# vim: expandtab shiftwidth=4: +# Color screen output using ANSI escape sequences. +# +# Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2005, 2006, 2008, 2009, 2010, +# 2011, 2012, 2013, 2014, 2015, 2016 Russ Allbery <rra@cpan.org> +# Copyright 1996 Zenin +# Copyright 2012 Kurt Starsinic <kstarsinic@gmail.com> +# +# This program is free software; you may redistribute it and/or modify it +# under the same terms as Perl itself. +# +# PUSH/POP support submitted 2007 by openmethods.com voice solutions +# +# Ah, September, when the sysadmins turn colors and fall off the trees.... +# -- Dave Van Domelen + +############################################################################## +# Modules and declarations +############################################################################## + +package Term::ANSIColor; + +use 5.006; +use strict; +use warnings; + +# Also uses Carp but loads it on demand to reduce memory usage. + +use Exporter (); + +# use Exporter plus @ISA instead of use base for 5.6 compatibility. +## no critic (ClassHierarchies::ProhibitExplicitISA) + +# Declare variables that should be set in BEGIN for robustness. +## no critic (Modules::ProhibitAutomaticExportation) +our (@EXPORT, @EXPORT_OK, %EXPORT_TAGS, @ISA, $VERSION); + +# We use autoloading, which sets this variable to the name of the called sub. +our $AUTOLOAD; + +# Set $VERSION and everything export-related in a BEGIN block for robustness +# against circular module loading (not that we load any modules, but +# consistency is good). +BEGIN { + $VERSION = '4.06'; + + # All of the basic supported constants, used in %EXPORT_TAGS. + my @colorlist = qw( + CLEAR RESET BOLD DARK + FAINT ITALIC UNDERLINE UNDERSCORE + BLINK REVERSE CONCEALED + + BLACK RED GREEN YELLOW + BLUE MAGENTA CYAN WHITE + ON_BLACK ON_RED ON_GREEN ON_YELLOW + ON_BLUE ON_MAGENTA ON_CYAN ON_WHITE + + BRIGHT_BLACK BRIGHT_RED BRIGHT_GREEN BRIGHT_YELLOW + BRIGHT_BLUE BRIGHT_MAGENTA BRIGHT_CYAN BRIGHT_WHITE + ON_BRIGHT_BLACK ON_BRIGHT_RED ON_BRIGHT_GREEN ON_BRIGHT_YELLOW + ON_BRIGHT_BLUE ON_BRIGHT_MAGENTA ON_BRIGHT_CYAN ON_BRIGHT_WHITE + ); + + # 256-color constants, used in %EXPORT_TAGS. + my @colorlist256 = ( + (map { ("ANSI$_", "ON_ANSI$_") } 0 .. 255), + (map { ("GREY$_", "ON_GREY$_") } 0 .. 23), + ); + for my $r (0 .. 5) { + for my $g (0 .. 5) { + push(@colorlist256, map { ("RGB$r$g$_", "ON_RGB$r$g$_") } 0 .. 5); + } + } + + # Exported symbol configuration. + @ISA = qw(Exporter); + @EXPORT = qw(color colored); + @EXPORT_OK = qw(uncolor colorstrip colorvalid coloralias); + %EXPORT_TAGS = ( + constants => \@colorlist, + constants256 => \@colorlist256, + pushpop => [@colorlist, qw(PUSHCOLOR POPCOLOR LOCALCOLOR)], + ); + Exporter::export_ok_tags('pushpop', 'constants256'); +} + +############################################################################## +# Package variables +############################################################################## + +# If this is set, any color changes will implicitly push the current color +# onto the stack and then pop it at the end of the constant sequence, just as +# if LOCALCOLOR were used. +our $AUTOLOCAL; + +# Caller sets this to force a reset at the end of each constant sequence. +our $AUTORESET; + +# Caller sets this to force colors to be reset at the end of each line. +our $EACHLINE; + +############################################################################## +# Internal data structures +############################################################################## + +# This module does quite a bit of initialization at the time it is first +# loaded, primarily to set up the package-global %ATTRIBUTES hash. The +# entries for 256-color names are easier to handle programmatically, and +# custom colors are also imported from the environment if any are set. + +# All basic supported attributes, including aliases. +#<<< +our %ATTRIBUTES = ( + 'clear' => 0, + 'reset' => 0, + 'bold' => 1, + 'dark' => 2, + 'faint' => 2, + 'italic' => 3, + 'underline' => 4, + 'underscore' => 4, + 'blink' => 5, + 'reverse' => 7, + 'concealed' => 8, + + 'black' => 30, 'on_black' => 40, + 'red' => 31, 'on_red' => 41, + 'green' => 32, 'on_green' => 42, + 'yellow' => 33, 'on_yellow' => 43, + 'blue' => 34, 'on_blue' => 44, + 'magenta' => 35, 'on_magenta' => 45, + 'cyan' => 36, 'on_cyan' => 46, + 'white' => 37, 'on_white' => 47, + + 'bright_black' => 90, 'on_bright_black' => 100, + 'bright_red' => 91, 'on_bright_red' => 101, + 'bright_green' => 92, 'on_bright_green' => 102, + 'bright_yellow' => 93, 'on_bright_yellow' => 103, + 'bright_blue' => 94, 'on_bright_blue' => 104, + 'bright_magenta' => 95, 'on_bright_magenta' => 105, + 'bright_cyan' => 96, 'on_bright_cyan' => 106, + 'bright_white' => 97, 'on_bright_white' => 107, +); +#>>> + +# Generating the 256-color codes involves a lot of codes and offsets that are +# not helped by turning them into constants. + +# The first 16 256-color codes are duplicates of the 16 ANSI colors. The rest +# are RBG and greyscale values. +for my $code (0 .. 15) { + $ATTRIBUTES{"ansi$code"} = "38;5;$code"; + $ATTRIBUTES{"on_ansi$code"} = "48;5;$code"; +} + +# 256-color RGB colors. Red, green, and blue can each be values 0 through 5, +# and the resulting 216 colors start with color 16. +for my $r (0 .. 5) { + for my $g (0 .. 5) { + for my $b (0 .. 5) { + my $code = 16 + (6 * 6 * $r) + (6 * $g) + $b; + $ATTRIBUTES{"rgb$r$g$b"} = "38;5;$code"; + $ATTRIBUTES{"on_rgb$r$g$b"} = "48;5;$code"; + } + } +} + +# The last 256-color codes are 24 shades of grey. +for my $n (0 .. 23) { + my $code = $n + 232; + $ATTRIBUTES{"grey$n"} = "38;5;$code"; + $ATTRIBUTES{"on_grey$n"} = "48;5;$code"; +} + +# Reverse lookup. Alphabetically first name for a sequence is preferred. +our %ATTRIBUTES_R; +for my $attr (reverse sort keys %ATTRIBUTES) { + $ATTRIBUTES_R{ $ATTRIBUTES{$attr} } = $attr; +} + +# Provide ansiN names for all 256 characters to provide a convenient flat +# namespace if one doesn't want to mess with the RGB and greyscale naming. Do +# this after creating %ATTRIBUTES_R since we want to use the canonical names +# when reversing a color. +for my $code (16 .. 255) { + $ATTRIBUTES{"ansi$code"} = "38;5;$code"; + $ATTRIBUTES{"on_ansi$code"} = "48;5;$code"; +} + +# Import any custom colors set in the environment. +our %ALIASES; +if (exists $ENV{ANSI_COLORS_ALIASES}) { + my $spec = $ENV{ANSI_COLORS_ALIASES}; + $spec =~ s{\s+}{}xmsg; + + # Error reporting here is an interesting question. Use warn rather than + # carp because carp would report the line of the use or require, which + # doesn't help anyone understand what's going on, whereas seeing this code + # will be more helpful. + ## no critic (ErrorHandling::RequireCarping) + for my $definition (split m{,}xms, $spec) { + my ($new, $old) = split m{=}xms, $definition, 2; + if (!$new || !$old) { + warn qq{Bad color mapping "$definition"}; + } else { + my $result = eval { coloralias($new, $old) }; + if (!$result) { + my $error = $@; + $error =~ s{ [ ] at [ ] .* }{}xms; + warn qq{$error in "$definition"}; + } + } + } +} + +# Stores the current color stack maintained by PUSHCOLOR and POPCOLOR. This +# is global and therefore not threadsafe. +our @COLORSTACK; + +############################################################################## +# Helper functions +############################################################################## + +# Stub to load the Carp module on demand. +sub croak { + my (@args) = @_; + require Carp; + Carp::croak(@args); +} + +############################################################################## +# Implementation (constant form) +############################################################################## + +# Time to have fun! We now want to define the constant subs, which are named +# the same as the attributes above but in all caps. Each constant sub needs +# to act differently depending on whether $AUTORESET is set. Without +# autoreset: +# +# BLUE "text\n" ==> "\e[34mtext\n" +# +# If $AUTORESET is set, we should instead get: +# +# BLUE "text\n" ==> "\e[34mtext\n\e[0m" +# +# The sub also needs to handle the case where it has no arguments correctly. +# Maintaining all of this as separate subs would be a major nightmare, as well +# as duplicate the %ATTRIBUTES hash, so instead we define an AUTOLOAD sub to +# define the constant subs on demand. To do that, we check the name of the +# called sub against the list of attributes, and if it's an all-caps version +# of one of them, we define the sub on the fly and then run it. +# +# If the environment variable ANSI_COLORS_DISABLED is set to a true value, +# just return the arguments without adding any escape sequences. This is to +# make it easier to write scripts that also work on systems without any ANSI +# support, like Windows consoles. +# +# Avoid using character classes like [:upper:] and \w here, since they load +# Unicode character tables and consume a ton of memory. All of our constants +# only use ASCII characters. +# +## no critic (ClassHierarchies::ProhibitAutoloading) +## no critic (Subroutines::RequireArgUnpacking) +## no critic (RegularExpressions::ProhibitEnumeratedClasses) +sub AUTOLOAD { + my ($sub, $attr) = $AUTOLOAD =~ m{ + \A ( [a-zA-Z0-9:]* :: ([A-Z0-9_]+) ) \z + }xms; + + # Check if we were called with something that doesn't look like an + # attribute. + if (!($attr && defined($ATTRIBUTES{ lc $attr }))) { + croak("undefined subroutine &$AUTOLOAD called"); + } + + # If colors are disabled, just return the input. Do this without + # installing a sub for (marginal, unbenchmarked) speed. + if ($ENV{ANSI_COLORS_DISABLED}) { + return join(q{}, @_); + } + + # We've untainted the name of the sub. + $AUTOLOAD = $sub; + + # Figure out the ANSI string to set the desired attribute. + my $escape = "\e[" . $ATTRIBUTES{ lc $attr } . 'm'; + + # Save the current value of $@. We can't just use local since we want to + # restore it before dispatching to the newly-created sub. (The caller may + # be colorizing output that includes $@.) + my $eval_err = $@; + + # Generate the constant sub, which should still recognize some of our + # package variables. Use string eval to avoid a dependency on + # Sub::Install, even though it makes it somewhat less readable. + ## no critic (BuiltinFunctions::ProhibitStringyEval) + ## no critic (ValuesAndExpressions::ProhibitImplicitNewlines) + my $eval_result = eval qq{ + sub $AUTOLOAD { + if (\$ENV{ANSI_COLORS_DISABLED}) { + return join(q{}, \@_); + } elsif (\$AUTOLOCAL && \@_) { + return PUSHCOLOR('$escape') . join(q{}, \@_) . POPCOLOR; + } elsif (\$AUTORESET && \@_) { + return '$escape' . join(q{}, \@_) . "\e[0m"; + } else { + return '$escape' . join(q{}, \@_); + } + } + 1; + }; + + # Failure is an internal error, not a problem with the caller. + ## no critic (ErrorHandling::RequireCarping) + if (!$eval_result) { + die "failed to generate constant $attr: $@"; + } + + # Restore $@. + ## no critic (Variables::RequireLocalizedPunctuationVars) + $@ = $eval_err; + + # Dispatch to the newly-created sub. + ## no critic (References::ProhibitDoubleSigils) + goto &$AUTOLOAD; +} +## use critic + +# Append a new color to the top of the color stack and return the top of +# the stack. +# +# $text - Any text we're applying colors to, with color escapes prepended +# +# Returns: The text passed in +sub PUSHCOLOR { + my (@text) = @_; + my $text = join(q{}, @text); + + # Extract any number of color-setting escape sequences from the start of + # the string. + my ($color) = $text =~ m{ \A ( (?:\e\[ [\d;]+ m)+ ) }xms; + + # If we already have a stack, append these escapes to the set from the top + # of the stack. This way, each position in the stack stores the complete + # enabled colors for that stage, at the cost of some potential + # inefficiency. + if (@COLORSTACK) { + $color = $COLORSTACK[-1] . $color; + } + + # Push the color onto the stack. + push(@COLORSTACK, $color); + return $text; +} + +# Pop the color stack and return the new top of the stack (or reset, if +# the stack is empty). +# +# @text - Any text we're applying colors to +# +# Returns: The concatenation of @text prepended with the new stack color +sub POPCOLOR { + my (@text) = @_; + pop(@COLORSTACK); + if (@COLORSTACK) { + return $COLORSTACK[-1] . join(q{}, @text); + } else { + return RESET(@text); + } +} + +# Surround arguments with a push and a pop. The effect will be to reset the +# colors to whatever was on the color stack before this sequence of colors was +# applied. +# +# @text - Any text we're applying colors to +# +# Returns: The concatenation of the text and the proper color reset sequence. +sub LOCALCOLOR { + my (@text) = @_; + return PUSHCOLOR(join(q{}, @text)) . POPCOLOR(); +} + +############################################################################## +# Implementation (attribute string form) +############################################################################## + +# Return the escape code for a given set of color attributes. +# +# @codes - A list of possibly space-separated color attributes +# +# Returns: The escape sequence setting those color attributes +# undef if no escape sequences were given +# Throws: Text exception for any invalid attribute +sub color { + my (@codes) = @_; + @codes = map { split } @codes; + + # Return the empty string if colors are disabled. + if ($ENV{ANSI_COLORS_DISABLED}) { + return q{}; + } + + # Build the attribute string from semicolon-separated numbers. + my $attribute = q{}; + for my $code (@codes) { + $code = lc($code); + if (defined($ATTRIBUTES{$code})) { + $attribute .= $ATTRIBUTES{$code} . q{;}; + } elsif (defined($ALIASES{$code})) { + $attribute .= $ALIASES{$code} . q{;}; + } else { + croak("Invalid attribute name $code"); + } + } + + # We added one too many semicolons for simplicity. Remove the last one. + chop($attribute); + + # Return undef if there were no attributes. + return ($attribute ne q{}) ? "\e[${attribute}m" : undef; +} + +# Return a list of named color attributes for a given set of escape codes. +# Escape sequences can be given with or without enclosing "\e[" and "m". The +# empty escape sequence '' or "\e[m" gives an empty list of attrs. +# +# There is one special case. 256-color codes start with 38 or 48, followed by +# a 5 and then the 256-color code. +# +# @escapes - A list of escape sequences or escape sequence numbers +# +# Returns: An array of attribute names corresponding to those sequences +# Throws: Text exceptions on invalid escape sequences or unknown colors +sub uncolor { + my (@escapes) = @_; + my (@nums, @result); + + # Walk the list of escapes and build a list of attribute numbers. + for my $escape (@escapes) { + $escape =~ s{ \A \e\[ }{}xms; + $escape =~ s{ m \z } {}xms; + my ($attrs) = $escape =~ m{ \A ((?:\d+;)* \d*) \z }xms; + if (!defined($attrs)) { + croak("Bad escape sequence $escape"); + } + + # Pull off 256-color codes (38;5;n or 48;5;n) as a unit. + push(@nums, $attrs =~ m{ ( 0*[34]8;0*5;\d+ | \d+ ) (?: ; | \z ) }xmsg); + } + + # Now, walk the list of numbers and convert them to attribute names. + # Strip leading zeroes from any of the numbers. (xterm, at least, allows + # leading zeroes to be added to any number in an escape sequence.) + for my $num (@nums) { + $num =~ s{ ( \A | ; ) 0+ (\d) }{$1$2}xmsg; + my $name = $ATTRIBUTES_R{$num}; + if (!defined($name)) { + croak("No name for escape sequence $num"); + } + push(@result, $name); + } + + # Return the attribute names. + return @result; +} + +# Given a string and a set of attributes, returns the string surrounded by +# escape codes to set those attributes and then clear them at the end of the +# string. The attributes can be given either as an array ref as the first +# argument or as a list as the second and subsequent arguments. +# +# If $EACHLINE is set, insert a reset before each occurrence of the string +# $EACHLINE and the starting attribute code after the string $EACHLINE, so +# that no attribute crosses line delimiters (this is often desirable if the +# output is to be piped to a pager or some other program). +# +# $first - An anonymous array of attributes or the text to color +# @rest - The text to color or the list of attributes +# +# Returns: The text, concatenated if necessary, surrounded by escapes to set +# the desired colors and reset them afterwards +# Throws: Text exception on invalid attributes +sub colored { + my ($first, @rest) = @_; + my ($string, @codes); + if (ref($first) && ref($first) eq 'ARRAY') { + @codes = @{$first}; + $string = join(q{}, @rest); + } else { + $string = $first; + @codes = @rest; + } + + # Return the string unmolested if colors are disabled. + if ($ENV{ANSI_COLORS_DISABLED}) { + return $string; + } + + # Find the attribute string for our colors. + my $attr = color(@codes); + + # If $EACHLINE is defined, split the string on line boundaries, suppress + # empty segments, and then colorize each of the line sections. + if (defined($EACHLINE)) { + my @text = map { ($_ ne $EACHLINE) ? $attr . $_ . "\e[0m" : $_ } + grep { length > 0 } + split(m{ (\Q$EACHLINE\E) }xms, $string); + return join(q{}, @text); + } else { + return $attr . $string . "\e[0m"; + } +} + +# Define a new color alias, or return the value of an existing alias. +# +# $alias - The color alias to define +# $color - The standard color the alias will correspond to (optional) +# +# Returns: The standard color value of the alias +# undef if one argument was given and the alias was not recognized +# Throws: Text exceptions for invalid alias names, attempts to use a +# standard color name as an alias, or an unknown standard color name +sub coloralias { + my ($alias, $color) = @_; + if (!defined($color)) { + if (!exists $ALIASES{$alias}) { + return; + } else { + return $ATTRIBUTES_R{ $ALIASES{$alias} }; + } + } + + # Avoid \w here to not load Unicode character tables, which increases the + # memory footprint of this module considerably. + # + ## no critic (RegularExpressions::ProhibitEnumeratedClasses) + if ($alias !~ m{ \A [a-zA-Z0-9._-]+ \z }xms) { + croak(qq{Invalid alias name "$alias"}); + } elsif ($ATTRIBUTES{$alias}) { + croak(qq{Cannot alias standard color "$alias"}); + } elsif (!exists $ATTRIBUTES{$color}) { + croak(qq{Invalid attribute name "$color"}); + } + ## use critic + + # Set the alias and return. + $ALIASES{$alias} = $ATTRIBUTES{$color}; + return $color; +} + +# Given a string, strip the ANSI color codes out of that string and return the +# result. This removes only ANSI color codes, not movement codes and other +# escape sequences. +# +# @string - The list of strings to sanitize +# +# Returns: (array) The strings stripped of ANSI color escape sequences +# (scalar) The same, concatenated +sub colorstrip { + my (@string) = @_; + for my $string (@string) { + $string =~ s{ \e\[ [\d;]* m }{}xmsg; + } + return wantarray ? @string : join(q{}, @string); +} + +# Given a list of color attributes (arguments for color, for instance), return +# true if they're all valid or false if any of them are invalid. +# +# @codes - A list of color attributes, possibly space-separated +# +# Returns: True if all the attributes are valid, false otherwise. +sub colorvalid { + my (@codes) = @_; + @codes = map { split(q{ }, lc) } @codes; + for my $code (@codes) { + if (!(defined($ATTRIBUTES{$code}) || defined($ALIASES{$code}))) { + return; + } + } + return 1; +} + +############################################################################## +# Module return value and documentation +############################################################################## + +# Ensure we evaluate to true. +1; +__END__ + +package Term::Complete; +require 5.000; +require Exporter; + +use strict; +our @ISA = qw(Exporter); +our @EXPORT = qw(Complete); +our $VERSION = '1.403'; + +# @(#)complete.pl,v1.2 (me@anywhere.EBay.Sun.COM) 09/23/91 + + +our($complete, $kill, $erase1, $erase2, $tty_raw_noecho, $tty_restore, $stty, $tty_safe_restore); +our($tty_saved_state) = ''; +CONFIG: { + $complete = "\004"; + $kill = "\025"; + $erase1 = "\177"; + $erase2 = "\010"; + foreach my $s (qw(/bin/stty /usr/bin/stty)) { + if (-x $s) { + $tty_raw_noecho = "$s raw -echo"; + $tty_restore = "$s -raw echo"; + $tty_safe_restore = $tty_restore; + $stty = $s; + last; + } + } +} + +sub Complete { + my($prompt, @cmp_lst, $cmp, $test, $l, @match); + my ($return, $r) = ("", 0); + + $return = ""; + $r = 0; + + $prompt = shift; + if (ref $_[0] || $_[0] =~ /^\*/) { + @cmp_lst = sort @{$_[0]}; + } + else { + @cmp_lst = sort(@_); + } + + # Attempt to save the current stty state, to be restored later + if (defined $stty && defined $tty_saved_state && $tty_saved_state eq '') { + $tty_saved_state = qx($stty -g 2>/dev/null); + if ($?) { + # stty -g not supported + $tty_saved_state = undef; + } + else { + $tty_saved_state =~ s/\s+$//g; + $tty_restore = qq($stty "$tty_saved_state" 2>/dev/null); + } + } + system $tty_raw_noecho if defined $tty_raw_noecho; + LOOP: { + local $_; + print($prompt, $return); + while (($_ = getc(STDIN)) ne "\r") { + CASE: { + # (TAB) attempt completion + $_ eq "\t" && do { + @match = grep(/^\Q$return/, @cmp_lst); + unless ($#match < 0) { + $l = length($test = shift(@match)); + foreach $cmp (@match) { + until (substr($cmp, 0, $l) eq substr($test, 0, $l)) { + $l--; + } + } + print("\a"); + print($test = substr($test, $r, $l - $r)); + $r = length($return .= $test); + } + last CASE; + }; + + # (^D) completion list + $_ eq $complete && do { + print(join("\r\n", '', grep(/^\Q$return/, @cmp_lst)), "\r\n"); + redo LOOP; + }; + + # (^U) kill + $_ eq $kill && do { + if ($r) { + $r = 0; + $return = ""; + print("\r\n"); + redo LOOP; + } + last CASE; + }; + + # (DEL) || (BS) erase + ($_ eq $erase1 || $_ eq $erase2) && do { + if($r) { + print("\b \b"); + chop($return); + $r--; + } + last CASE; + }; + + # printable char + ord >= ord(" ") && do { + $return .= $_; + $r++; + print; + last CASE; + }; + } + } + } + + # system $tty_restore if defined $tty_restore; + if (defined $tty_saved_state && defined $tty_restore && defined $tty_safe_restore) + { + system $tty_restore; + if ($?) { + # tty_restore caused error + system $tty_safe_restore; + } + } + print("\n"); + $return; +} + +1; + +use strict; + +package Term::ReadLine::Stub; +our @ISA = qw'Term::ReadLine::Tk Term::ReadLine::TermCap'; + +$DB::emacs = $DB::emacs; # To pacify -w +our @rl_term_set; +*rl_term_set = \@Term::ReadLine::TermCap::rl_term_set; + +sub PERL_UNICODE_STDIN () { 0x0001 } + +sub ReadLine {'Term::ReadLine::Stub'} +sub readline { + my $self = shift; + my ($in,$out,$str) = @$self; + my $prompt = shift; + print $out $rl_term_set[0], $prompt, $rl_term_set[1], $rl_term_set[2]; + $self->register_Tk + if not $Term::ReadLine::registered and $Term::ReadLine::toloop; + #$str = scalar <$in>; + $str = $self->get_line; + utf8::upgrade($str) + if (${^UNICODE} & PERL_UNICODE_STDIN || defined ${^ENCODING}) && + utf8::valid($str); + print $out $rl_term_set[3]; + # bug in 5.000: chomping empty string creates length -1: + chomp $str if defined $str; + $str; +} +sub addhistory {} + +# used for testing purpose +sub devtty { return '/dev/tty' } + +sub findConsole { + my $console; + my $consoleOUT; + + my $devtty = devtty(); + + if ($^O ne 'MSWin32' and -e $devtty) { + $console = $devtty; + } elsif ($^O eq 'MSWin32' or $^O eq 'msys' or -e "con") { + $console = 'CONIN$'; + $consoleOUT = 'CONOUT$'; + } elsif ($^O eq 'VMS') { + $console = "sys\$command"; + } elsif ($^O eq 'os2' && !$DB::emacs) { + $console = "/dev/con"; + } else { + $console = undef; + } + + $consoleOUT = $console unless defined $consoleOUT; + $console = "&STDIN" unless defined $console; + if ($console eq $devtty && !open(my $fh, "<", $console)) { + $console = "&STDIN"; + undef($consoleOUT); + } + if (!defined $consoleOUT) { + $consoleOUT = defined fileno(STDERR) && $^O ne 'MSWin32' ? "&STDERR" : "&STDOUT"; + } + ($console,$consoleOUT); +} + +sub new { + die "method new called with wrong number of arguments" + unless @_==2 or @_==4; + #local (*FIN, *FOUT); + my ($FIN, $FOUT, $ret); + if (@_==2) { + my($console, $consoleOUT) = $_[0]->findConsole; + + # the Windows CONIN$ needs GENERIC_WRITE mode to allow + # a SetConsoleMode() if we end up using Term::ReadKey + open FIN, (( $^O eq 'MSWin32' && $console eq 'CONIN$' ) ? '+<' : '<' ), $console; + # RT #132008: Still need 2-arg open here + open FOUT,">$consoleOUT"; + + #OUT->autoflush(1); # Conflicts with debugger? + my $sel = select(FOUT); + $| = 1; # for DB::OUT + select($sel); + $ret = bless [\*FIN, \*FOUT]; + } else { # Filehandles supplied + $FIN = $_[2]; $FOUT = $_[3]; + #OUT->autoflush(1); # Conflicts with debugger? + my $sel = select($FOUT); + $| = 1; # for DB::OUT + select($sel); + $ret = bless [$FIN, $FOUT]; + } + if ($ret->Features->{ornaments} + and not ($ENV{PERL_RL} and $ENV{PERL_RL} =~ /\bo\w*=0/)) { + local $Term::ReadLine::termcap_nowarn = 1; + $ret->ornaments(1); + } + return $ret; +} + +sub newTTY { + my ($self, $in, $out) = @_; + $self->[0] = $in; + $self->[1] = $out; + my $sel = select($out); + $| = 1; # for DB::OUT + select($sel); +} + +sub IN { shift->[0] } +sub OUT { shift->[1] } +sub MinLine { undef } +sub Attribs { {} } + +my %features = (tkRunning => 1, ornaments => 1, 'newTTY' => 1); +sub Features { \%features } + +#sub get_line { +# my $self = shift; +# my $in = $self->IN; +# local ($/) = "\n"; +# return scalar <$in>; +#} + +package Term::ReadLine; # So late to allow the above code be defined? + +our $VERSION = '1.17'; + +my ($which) = exists $ENV{PERL_RL} ? split /\s+/, $ENV{PERL_RL} : undef; +if ($which) { + if ($which =~ /\bgnu\b/i){ + eval "use Term::ReadLine::Gnu;"; + } elsif ($which =~ /\bperl\b/i) { + eval "use Term::ReadLine::Perl;"; + } elsif ($which =~ /^(Stub|TermCap|Tk)$/) { + # it is already in memory to avoid false exception as seen in: + # PERL_RL=Stub perl -e'$SIG{__DIE__} = sub { print @_ }; require Term::ReadLine' + } else { + eval "use Term::ReadLine::$which;"; + } +} elsif (defined $which and $which ne '') { # Defined but false + # Do nothing fancy +} else { + eval "use Term::ReadLine::Gnu; 1" or eval "use Term::ReadLine::EditLine; 1" or eval "use Term::ReadLine::Perl; 1"; +} + +#require FileHandle; + +# To make possible switch off RL in debugger: (Not needed, work done +# in debugger). +our @ISA; +if (defined &Term::ReadLine::Gnu::readline) { + @ISA = qw(Term::ReadLine::Gnu Term::ReadLine::Stub); +} elsif (defined &Term::ReadLine::EditLine::readline) { + @ISA = qw(Term::ReadLine::EditLine Term::ReadLine::Stub); +} elsif (defined &Term::ReadLine::Perl::readline) { + @ISA = qw(Term::ReadLine::Perl Term::ReadLine::Stub); +} elsif (defined $which && defined &{"Term::ReadLine::$which\::readline"}) { + @ISA = "Term::ReadLine::$which"; +} else { + @ISA = qw(Term::ReadLine::Stub); +} + +package Term::ReadLine::TermCap; + +# Prompt-start, prompt-end, command-line-start, command-line-end +# -- zero-width beautifies to emit around prompt and the command line. +our @rl_term_set = ("","","",""); +# string encoded: +our $rl_term_set = ',,,'; + +our $terminal; +sub LoadTermCap { + return if defined $terminal; + + require Term::Cap; + $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning. +} + +sub ornaments { + shift; + return $rl_term_set unless @_; + $rl_term_set = shift; + $rl_term_set ||= ',,,'; + $rl_term_set = 'us,ue,md,me' if $rl_term_set eq '1'; + my @ts = split /,/, $rl_term_set, 4; + eval { LoadTermCap }; + unless (defined $terminal) { + warn("Cannot find termcap: $@\n") unless $Term::ReadLine::termcap_nowarn; + $rl_term_set = ',,,'; + return; + } + @rl_term_set = map {$_ ? $terminal->Tputs($_,1) || '' : ''} @ts; + return $rl_term_set; +} + + +package Term::ReadLine::Tk; + +# This package inserts a Tk->fileevent() before the diamond operator. +# The Tk watcher dispatches Tk events until the filehandle returned by +# the$term->IN() accessor becomes ready for reading. It's assumed +# that the diamond operator will return a line of input immediately at +# that point. + +my ($giveup); + +# maybe in the future the Tk-specific aspects will be removed. +sub Tk_loop{ + if (ref $Term::ReadLine::toloop) + { + $Term::ReadLine::toloop->[0]->($Term::ReadLine::toloop->[2]); + } + else + { + Tk::DoOneEvent(0) until $giveup; + $giveup = 0; + } +}; + +sub register_Tk { + my $self = shift; + unless ($Term::ReadLine::registered++) + { + if (ref $Term::ReadLine::toloop) + { + $Term::ReadLine::toloop->[2] = $Term::ReadLine::toloop->[1]->($self->IN) if $Term::ReadLine::toloop->[1]; + } + else + { + Tk->fileevent($self->IN,'readable',sub { $giveup = 1}); + } + } +}; + +sub tkRunning { + $Term::ReadLine::toloop = $_[1] if @_ > 1; + $Term::ReadLine::toloop; +} + +sub event_loop { + shift; + + # T::RL::Gnu and T::RL::Perl check that this exists, if not, + # it doesn't call the loop. Those modules will need to be + # fixed before this can be removed. + if (not defined &Tk::DoOneEvent) + { + *Tk::DoOneEvent = sub { + die "what?"; # this shouldn't be called. + } + } + + # store the callback in toloop, again so that other modules will + # recognise it and call us for the loop. + $Term::ReadLine::toloop = [ @_ ] if @_ > 0; # 0 because we shifted off $self. + $Term::ReadLine::toloop; +} + +sub PERL_UNICODE_STDIN () { 0x0001 } + +sub get_line { + my $self = shift; + my ($in,$out,$str) = @$self; + + if ($Term::ReadLine::toloop) { + $self->register_Tk if not $Term::ReadLine::registered; + $self->Tk_loop; + } + + local ($/) = "\n"; + $str = <$in>; + + utf8::upgrade($str) + if (${^UNICODE} & PERL_UNICODE_STDIN || defined ${^ENCODING}) && + utf8::valid($str); + print $out $rl_term_set[3]; + # bug in 5.000: chomping empty string creates length -1: + chomp $str if defined $str; + + $str; +} + +1; + +package Term::Cap; + +# Since the debugger uses Term::ReadLine which uses Term::Cap, we want +# to load as few modules as possible. This includes Carp.pm. +sub carp +{ + require Carp; + goto &Carp::carp; +} + +sub croak +{ + require Carp; + goto &Carp::croak; +} + +use strict; + +use vars qw($VERSION $VMS_TERMCAP); +use vars qw($termpat $state $first $entry); + +$VERSION = '1.17'; + +# TODO: +# support Berkeley DB termcaps +# force $FH into callers package? +# keep $FH in object at Tgetent time? + + +# Preload the default VMS termcap. +# If a different termcap is required then the text of one can be supplied +# in $Term::Cap::VMS_TERMCAP before Tgetent is called. + +if ( $^O eq 'VMS' ) +{ + chomp( my @entry = <DATA> ); + $VMS_TERMCAP = join '', @entry; +} + +# Returns a list of termcap files to check. + +sub termcap_path +{ ## private + my @termcap_path; + + # $TERMCAP, if it's a filespec + push( @termcap_path, $ENV{TERMCAP} ) + if ( + ( exists $ENV{TERMCAP} ) + && ( + ( $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'dos' ) + ? $ENV{TERMCAP} =~ /^[a-z]:[\\\/]/is + : $ENV{TERMCAP} =~ /^\//s + ) + ); + if ( ( exists $ENV{TERMPATH} ) && ( $ENV{TERMPATH} ) ) + { + + # Add the users $TERMPATH + push( @termcap_path, split( /(:|\s+)/, $ENV{TERMPATH} ) ); + } + else + { + + # Defaults + push( @termcap_path, + exists $ENV{'HOME'} ? $ENV{'HOME'} . '/.termcap' : undef, + '/etc/termcap', '/usr/share/misc/termcap', ); + } + + # return the list of those termcaps that exist + return grep { defined $_ && -f $_ } @termcap_path; +} + + +sub Tgetent +{ ## public -- static method + my $class = shift; + my ($self) = @_; + + $self = {} unless defined $self; + bless $self, $class; + + my ( $term, $cap, $search, $field, $max, $tmp_term, $TERMCAP ); + local ( $termpat, $state, $first, $entry ); # used inside eval + local $_; + + # Compute PADDING factor from OSPEED (to be used by Tpad) + if ( !$self->{OSPEED} ) + { + if ($^W) + { + carp "OSPEED was not set, defaulting to 9600"; + } + $self->{OSPEED} = 9600; + } + if ( $self->{OSPEED} < 16 ) + { + + # delays for old style speeds + my @pad = ( + 0, 200, 133.3, 90.9, 74.3, 66.7, 50, 33.3, + 16.7, 8.3, 5.5, 4.1, 2, 1, .5, .2 + ); + $self->{PADDING} = $pad[ $self->{OSPEED} ]; + } + else + { + $self->{PADDING} = 10000 / $self->{OSPEED}; + } + + unless ( $self->{TERM} ) + { + if ( $ENV{TERM} ) + { + $self->{TERM} = $ENV{TERM} ; + } + else + { + if ( $^O eq 'MSWin32' ) + { + $self->{TERM} = 'dumb'; + } + else + { + croak "TERM not set"; + } + } + } + + $term = $self->{TERM}; # $term is the term type we are looking for + + # $tmp_term is always the next term (possibly :tc=...:) we are looking for + $tmp_term = $self->{TERM}; + + # protect any pattern metacharacters in $tmp_term + $termpat = $tmp_term; + $termpat =~ s/(\W)/\\$1/g; + + my $foo = ( exists $ENV{TERMCAP} ? $ENV{TERMCAP} : '' ); + + # $entry is the extracted termcap entry + if ( ( $foo !~ m:^/:s ) && ( $foo =~ m/(^|\|)${termpat}[:|]/s ) ) + { + $entry = $foo; + } + + my @termcap_path = termcap_path(); + + if ( !@termcap_path && !$entry ) + { + + # last resort--fake up a termcap from terminfo + local $ENV{TERM} = $term; + + if ( $^O eq 'VMS' ) + { + $entry = $VMS_TERMCAP; + } + else + { + if ( grep { -x "$_/infocmp" } split /:/, $ENV{PATH} ) + { + eval { + my $tmp = `infocmp -C 2>/dev/null`; + $tmp =~ s/^#.*\n//gm; # remove comments + if ( ( $tmp !~ m%^/%s ) + && ( $tmp =~ /(^|\|)${termpat}[:|]/s ) ) + { + $entry = $tmp; + } + }; + warn "Can't run infocmp to get a termcap entry: $@" if $@; + } + else + { + # this is getting desperate now + if ( $self->{TERM} eq 'dumb' ) + { + $entry = 'dumb|80-column dumb tty::am::co#80::bl=^G:cr=^M:do=^J:sf=^J:'; + } + } + } + } + + croak "Can't find a valid termcap file" unless @termcap_path || $entry; + + $state = 1; # 0 == finished + # 1 == next file + # 2 == search again + + $first = 0; # first entry (keeps term name) + + $max = 32; # max :tc=...:'s + + if ($entry) + { + + # ok, we're starting with $TERMCAP + $first++; # we're the first entry + # do we need to continue? + if ( $entry =~ s/:tc=([^:]+):/:/ ) + { + $tmp_term = $1; + + # protect any pattern metacharacters in $tmp_term + $termpat = $tmp_term; + $termpat =~ s/(\W)/\\$1/g; + } + else + { + $state = 0; # we're already finished + } + } + + # This is eval'ed inside the while loop for each file + $search = q{ + while (<TERMCAP>) { + next if /^\\t/ || /^#/; + if ($_ =~ m/(^|\\|)${termpat}[:|]/o) { + chomp; + s/^[^:]*:// if $first++; + $state = 0; + while ($_ =~ s/\\\\$//) { + defined(my $x = <TERMCAP>) or last; + $_ .= $x; chomp; + } + last; + } + } + defined $entry or $entry = ''; + $entry .= $_ if $_; + }; + + while ( $state != 0 ) + { + if ( $state == 1 ) + { + + # get the next TERMCAP + $TERMCAP = shift @termcap_path + || croak "failed termcap lookup on $tmp_term"; + } + else + { + + # do the same file again + # prevent endless recursion + $max-- || croak "failed termcap loop at $tmp_term"; + $state = 1; # ok, maybe do a new file next time + } + + open( TERMCAP, "< $TERMCAP\0" ) || croak "open $TERMCAP: $!"; + eval $search; + die $@ if $@; + close TERMCAP; + + # If :tc=...: found then search this file again + $entry =~ s/:tc=([^:]+):/:/ && ( $tmp_term = $1, $state = 2 ); + + # protect any pattern metacharacters in $tmp_term + $termpat = $tmp_term; + $termpat =~ s/(\W)/\\$1/g; + } + + croak "Can't find $term" if $entry eq ''; + $entry =~ s/:+\s*:+/:/g; # cleanup $entry + $entry =~ s/:+/:/g; # cleanup $entry + $self->{TERMCAP} = $entry; # save it + # print STDERR "DEBUG: $entry = ", $entry, "\n"; + + # Precompile $entry into the object + $entry =~ s/^[^:]*://; + foreach $field ( split( /:[\s:\\]*/, $entry ) ) + { + if ( defined $field && $field =~ /^(\w{2,})$/ ) + { + $self->{ '_' . $field } = 1 unless defined $self->{ '_' . $1 }; + + # print STDERR "DEBUG: flag $1\n"; + } + elsif ( defined $field && $field =~ /^(\w{2,})\@/ ) + { + $self->{ '_' . $1 } = ""; + + # print STDERR "DEBUG: unset $1\n"; + } + elsif ( defined $field && $field =~ /^(\w{2,})#(.*)/ ) + { + $self->{ '_' . $1 } = $2 unless defined $self->{ '_' . $1 }; + + # print STDERR "DEBUG: numeric $1 = $2\n"; + } + elsif ( defined $field && $field =~ /^(\w{2,})=(.*)/ ) + { + + # print STDERR "DEBUG: string $1 = $2\n"; + next if defined $self->{ '_' . ( $cap = $1 ) }; + $_ = $2; + if ( ord('A') == 193 ) + { + s/\\E/\047/g; + s/\\(\d\d\d)/pack('c',oct($1) & 0177)/eg; + s/\\n/\n/g; + s/\\r/\r/g; + s/\\t/\t/g; + s/\\b/\b/g; + s/\\f/\f/g; + s/\\\^/\337/g; + s/\^\?/\007/g; + s/\^(.)/pack('c',ord($1) & 31)/eg; + s/\\(.)/$1/g; + s/\337/^/g; + } + else + { + s/\\E/\033/g; + s/\\(\d\d\d)/pack('c',oct($1) & 0177)/eg; + s/\\n/\n/g; + s/\\r/\r/g; + s/\\t/\t/g; + s/\\b/\b/g; + s/\\f/\f/g; + s/\\\^/\377/g; + s/\^\?/\177/g; + s/\^(.)/pack('c',ord($1) & 31)/eg; + s/\\(.)/$1/g; + s/\377/^/g; + } + $self->{ '_' . $cap } = $_; + } + + # else { carp "junk in $term ignored: $field"; } + } + $self->{'_pc'} = "\0" unless defined $self->{'_pc'}; + $self->{'_bc'} = "\b" unless defined $self->{'_bc'}; + $self; +} + +# $terminal->Tpad($string, $cnt, $FH); + + +sub Tpad +{ ## public + my $self = shift; + my ( $string, $cnt, $FH ) = @_; + my ( $decr, $ms ); + + if ( defined $string && $string =~ /(^[\d.]+)(\*?)(.*)$/ ) + { + $ms = $1; + $ms *= $cnt if $2; + $string = $3; + $decr = $self->{PADDING}; + if ( $decr > .1 ) + { + $ms += $decr / 2; + $string .= $self->{'_pc'} x ( $ms / $decr ); + } + } + print $FH $string if $FH; + $string; +} + +# $terminal->Tputs($cap, $cnt, $FH); + + +sub Tputs +{ ## public + my $self = shift; + my ( $cap, $cnt, $FH ) = @_; + my $string; + + $cnt = 0 unless $cnt; + + if ( $cnt > 1 ) + { + $string = Tpad( $self, $self->{ '_' . $cap }, $cnt ); + } + else + { + + # cache result because Tpad can be slow + unless ( exists $self->{$cap} ) + { + $self->{$cap} = + exists $self->{"_$cap"} + ? Tpad( $self, $self->{"_$cap"}, 1 ) + : undef; + } + $string = $self->{$cap}; + } + print $FH $string if $FH; + $string; +} + +# $terminal->Tgoto($cap, $col, $row, $FH); + + +sub Tgoto +{ ## public + my $self = shift; + my ( $cap, $code, $tmp, $FH ) = @_; + my $string = $self->{ '_' . $cap }; + my $result = ''; + my $after = ''; + my $online = 0; + my @tmp = ( $tmp, $code ); + my $cnt = $code; + + while ( $string =~ /^([^%]*)%(.)(.*)/ ) + { + $result .= $1; + $code = $2; + $string = $3; + if ( $code eq 'd' ) + { + $result .= sprintf( "%d", shift(@tmp) ); + } + elsif ( $code eq '.' ) + { + $tmp = shift(@tmp); + if ( $tmp == 0 || $tmp == 4 || $tmp == 10 ) + { + if ($online) + { + ++$tmp, $after .= $self->{'_up'} if $self->{'_up'}; + } + else + { + ++$tmp, $after .= $self->{'_bc'}; + } + } + $result .= sprintf( "%c", $tmp ); + $online = !$online; + } + elsif ( $code eq '+' ) + { + $result .= sprintf( "%c", shift(@tmp) + ord($string) ); + $string = substr( $string, 1, 99 ); + $online = !$online; + } + elsif ( $code eq 'r' ) + { + ( $code, $tmp ) = @tmp; + @tmp = ( $tmp, $code ); + $online = !$online; + } + elsif ( $code eq '>' ) + { + ( $code, $tmp, $string ) = unpack( "CCa99", $string ); + if ( $tmp[0] > $code ) + { + $tmp[0] += $tmp; + } + } + elsif ( $code eq '2' ) + { + $result .= sprintf( "%02d", shift(@tmp) ); + $online = !$online; + } + elsif ( $code eq '3' ) + { + $result .= sprintf( "%03d", shift(@tmp) ); + $online = !$online; + } + elsif ( $code eq 'i' ) + { + ( $code, $tmp ) = @tmp; + @tmp = ( $code + 1, $tmp + 1 ); + } + else + { + return "OOPS"; + } + } + $string = Tpad( $self, $result . $string . $after, $cnt ); + print $FH $string if $FH; + $string; +} + +# $terminal->Trequire(qw/ce ku kd/); + + +sub Trequire +{ ## public + my $self = shift; + my ( $cap, @undefined ); + foreach $cap (@_) + { + push( @undefined, $cap ) + unless defined $self->{ '_' . $cap } && $self->{ '_' . $cap }; + } + croak "Terminal does not support: (@undefined)" if @undefined; +} + + +# Below is a default entry for systems where there are terminals but no +# termcap +1; +__DATA__ +vt220|vt200|DEC VT220 in vt100 emulation mode: +am:mi:xn:xo: +co#80:li#24: +RA=\E[?7l:SA=\E[?7h: +ac=kkllmmjjnnwwqquuttvvxx:ae=\E(B:al=\E[L:as=\E(0: +bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH: +cr=^M:cs=\E[%i%d;%dr:dc=\E[P:dl=\E[M:do=\E[B: +ei=\E[4l:ho=\E[H:im=\E[4h: +is=\E[1;24r\E[24;1H: +nd=\E[C: +kd=\E[B::kl=\E[D:kr=\E[C:ku=\E[A:le=^H: +mb=\E[5m:md=\E[1m:me=\E[m:mr=\E[7m: +kb=\0177: +r2=\E>\E[24;1H\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E=:rc=\E8: +sc=\E7:se=\E[27m:sf=\ED:so=\E[7m:sr=\EM:ta=^I: +ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?25h:vi=\E[?25l: + +package Carp::Heavy; + +use Carp (); + +our $VERSION = '1.50'; +$VERSION =~ tr/_//d; + +# Carp::Heavy was merged into Carp in version 1.12. Any mismatched versions +# after this point are not significant and can be ignored. +if(($Carp::VERSION || 0) < 1.12) { + my $cv = defined($Carp::VERSION) ? $Carp::VERSION : "undef"; + die "Version mismatch between Carp $cv ($INC{q(Carp.pm)}) and Carp::Heavy $VERSION ($INC{q(Carp/Heavy.pm)}). Did you alter \@INC after Carp was loaded?\n"; +} + +1; + +# Most of the machinery of Carp used to be here. +# It has been moved in Carp.pm now, but this placeholder remains for +# the benefit of modules that like to preload Carp::Heavy directly. +# This must load Carp, because some modules rely on the historical +# behaviour of Carp::Heavy loading Carp. + +package Compress::Zlib; + +require 5.006 ; +require Exporter; +use Carp ; +use IO::Handle ; +use Scalar::Util qw(dualvar); + +use IO::Compress::Base::Common 2.074 ; +use Compress::Raw::Zlib 2.074 ; +use IO::Compress::Gzip 2.074 ; +use IO::Uncompress::Gunzip 2.074 ; + +use strict ; +use warnings ; +use bytes ; +our ($VERSION, $XS_VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); + +$VERSION = '2.074'; +$XS_VERSION = $VERSION; +$VERSION = eval $VERSION; + +@ISA = qw(Exporter); +# Items to export into callers namespace by default. Note: do not export +# names by default without a very good reason. Use EXPORT_OK instead. +# Do not simply export all your public functions/methods/constants. +@EXPORT = qw( + deflateInit inflateInit + + compress uncompress + + gzopen $gzerrno + ); + +push @EXPORT, @Compress::Raw::Zlib::EXPORT ; + +@EXPORT_OK = qw(memGunzip memGzip zlib_version); +%EXPORT_TAGS = ( + ALL => \@EXPORT +); + +BEGIN +{ + *zlib_version = \&Compress::Raw::Zlib::zlib_version; +} + +use constant FLAG_APPEND => 1 ; +use constant FLAG_CRC => 2 ; +use constant FLAG_ADLER => 4 ; +use constant FLAG_CONSUME_INPUT => 8 ; + +our (@my_z_errmsg); + +@my_z_errmsg = ( + "need dictionary", # Z_NEED_DICT 2 + "stream end", # Z_STREAM_END 1 + "", # Z_OK 0 + "file error", # Z_ERRNO (-1) + "stream error", # Z_STREAM_ERROR (-2) + "data error", # Z_DATA_ERROR (-3) + "insufficient memory", # Z_MEM_ERROR (-4) + "buffer error", # Z_BUF_ERROR (-5) + "incompatible version",# Z_VERSION_ERROR(-6) + ); + + +sub _set_gzerr +{ + my $value = shift ; + + if ($value == 0) { + $Compress::Zlib::gzerrno = 0 ; + } + elsif ($value == Z_ERRNO() || $value > 2) { + $Compress::Zlib::gzerrno = $! ; + } + else { + $Compress::Zlib::gzerrno = dualvar($value+0, $my_z_errmsg[2 - $value]); + } + + return $value ; +} + +sub _set_gzerr_undef +{ + _set_gzerr(@_); + return undef; +} + +sub _save_gzerr +{ + my $gz = shift ; + my $test_eof = shift ; + + my $value = $gz->errorNo() || 0 ; + my $eof = $gz->eof() ; + + if ($test_eof) { + # gzread uses Z_STREAM_END to denote a successful end + $value = Z_STREAM_END() if $gz->eof() && $value == 0 ; + } + + _set_gzerr($value) ; +} + +sub gzopen($$) +{ + my ($file, $mode) = @_ ; + + my $gz ; + my %defOpts = (Level => Z_DEFAULT_COMPRESSION(), + Strategy => Z_DEFAULT_STRATEGY(), + ); + + my $writing ; + $writing = ! ($mode =~ /r/i) ; + $writing = ($mode =~ /[wa]/i) ; + + $defOpts{Level} = $1 if $mode =~ /(\d)/; + $defOpts{Strategy} = Z_FILTERED() if $mode =~ /f/i; + $defOpts{Strategy} = Z_HUFFMAN_ONLY() if $mode =~ /h/i; + $defOpts{Append} = 1 if $mode =~ /a/i; + + my $infDef = $writing ? 'deflate' : 'inflate'; + my @params = () ; + + croak "gzopen: file parameter is not a filehandle or filename" + unless isaFilehandle $file || isaFilename $file || + (ref $file && ref $file eq 'SCALAR'); + + return undef unless $mode =~ /[rwa]/i ; + + _set_gzerr(0) ; + + if ($writing) { + $gz = new IO::Compress::Gzip($file, Minimal => 1, AutoClose => 1, + %defOpts) + or $Compress::Zlib::gzerrno = $IO::Compress::Gzip::GzipError; + } + else { + $gz = new IO::Uncompress::Gunzip($file, + Transparent => 1, + Append => 0, + AutoClose => 1, + MultiStream => 1, + Strict => 0) + or $Compress::Zlib::gzerrno = $IO::Uncompress::Gunzip::GunzipError; + } + + return undef + if ! defined $gz ; + + bless [$gz, $infDef], 'Compress::Zlib::gzFile'; +} + +sub Compress::Zlib::gzFile::gzread +{ + my $self = shift ; + + return _set_gzerr(Z_STREAM_ERROR()) + if $self->[1] ne 'inflate'; + + my $len = defined $_[1] ? $_[1] : 4096 ; + + my $gz = $self->[0] ; + if ($self->gzeof() || $len == 0) { + # Zap the output buffer to match ver 1 behaviour. + $_[0] = "" ; + _save_gzerr($gz, 1); + return 0 ; + } + + my $status = $gz->read($_[0], $len) ; + _save_gzerr($gz, 1); + return $status ; +} + +sub Compress::Zlib::gzFile::gzreadline +{ + my $self = shift ; + + my $gz = $self->[0] ; + { + # Maintain backward compatibility with 1.x behaviour + # It didn't support $/, so this can't either. + local $/ = "\n" ; + $_[0] = $gz->getline() ; + } + _save_gzerr($gz, 1); + return defined $_[0] ? length $_[0] : 0 ; +} + +sub Compress::Zlib::gzFile::gzwrite +{ + my $self = shift ; + my $gz = $self->[0] ; + + return _set_gzerr(Z_STREAM_ERROR()) + if $self->[1] ne 'deflate'; + + $] >= 5.008 and (utf8::downgrade($_[0], 1) + or croak "Wide character in gzwrite"); + + my $status = $gz->write($_[0]) ; + _save_gzerr($gz); + return $status ; +} + +sub Compress::Zlib::gzFile::gztell +{ + my $self = shift ; + my $gz = $self->[0] ; + my $status = $gz->tell() ; + _save_gzerr($gz); + return $status ; +} + +sub Compress::Zlib::gzFile::gzseek +{ + my $self = shift ; + my $offset = shift ; + my $whence = shift ; + + my $gz = $self->[0] ; + my $status ; + eval { $status = $gz->seek($offset, $whence) ; }; + if ($@) + { + my $error = $@; + $error =~ s/^.*: /gzseek: /; + $error =~ s/ at .* line \d+\s*$//; + croak $error; + } + _save_gzerr($gz); + return $status ; +} + +sub Compress::Zlib::gzFile::gzflush +{ + my $self = shift ; + my $f = shift ; + + my $gz = $self->[0] ; + my $status = $gz->flush($f) ; + my $err = _save_gzerr($gz); + return $status ? 0 : $err; +} + +sub Compress::Zlib::gzFile::gzclose +{ + my $self = shift ; + my $gz = $self->[0] ; + + my $status = $gz->close() ; + my $err = _save_gzerr($gz); + return $status ? 0 : $err; +} + +sub Compress::Zlib::gzFile::gzeof +{ + my $self = shift ; + my $gz = $self->[0] ; + + return 0 + if $self->[1] ne 'inflate'; + + my $status = $gz->eof() ; + _save_gzerr($gz); + return $status ; +} + +sub Compress::Zlib::gzFile::gzsetparams +{ + my $self = shift ; + croak "Usage: Compress::Zlib::gzFile::gzsetparams(file, level, strategy)" + unless @_ eq 2 ; + + my $gz = $self->[0] ; + my $level = shift ; + my $strategy = shift; + + return _set_gzerr(Z_STREAM_ERROR()) + if $self->[1] ne 'deflate'; + + my $status = *$gz->{Compress}->deflateParams(-Level => $level, + -Strategy => $strategy); + _save_gzerr($gz); + return $status ; +} + +sub Compress::Zlib::gzFile::gzerror +{ + my $self = shift ; + my $gz = $self->[0] ; + + return $Compress::Zlib::gzerrno ; +} + + +sub compress($;$) +{ + my ($x, $output, $err, $in) =('', '', '', '') ; + + if (ref $_[0] ) { + $in = $_[0] ; + croak "not a scalar reference" unless ref $in eq 'SCALAR' ; + } + else { + $in = \$_[0] ; + } + + $] >= 5.008 and (utf8::downgrade($$in, 1) + or croak "Wide character in compress"); + + my $level = (@_ == 2 ? $_[1] : Z_DEFAULT_COMPRESSION() ); + + $x = Compress::Raw::Zlib::_deflateInit(FLAG_APPEND, + $level, + Z_DEFLATED, + MAX_WBITS, + MAX_MEM_LEVEL, + Z_DEFAULT_STRATEGY, + 4096, + '') + or return undef ; + + $err = $x->deflate($in, $output) ; + return undef unless $err == Z_OK() ; + + $err = $x->flush($output) ; + return undef unless $err == Z_OK() ; + + return $output ; +} + +sub uncompress($) +{ + my ($output, $in) =('', '') ; + + if (ref $_[0] ) { + $in = $_[0] ; + croak "not a scalar reference" unless ref $in eq 'SCALAR' ; + } + else { + $in = \$_[0] ; + } + + $] >= 5.008 and (utf8::downgrade($$in, 1) + or croak "Wide character in uncompress"); + + my ($obj, $status) = Compress::Raw::Zlib::_inflateInit(0, + MAX_WBITS, 4096, "") ; + + $status == Z_OK + or return undef; + + $obj->inflate($in, $output) == Z_STREAM_END + or return undef; + + return $output; +} + +sub deflateInit(@) +{ + my ($got) = ParseParameters(0, + { + 'bufsize' => [IO::Compress::Base::Common::Parse_unsigned, 4096], + 'level' => [IO::Compress::Base::Common::Parse_signed, Z_DEFAULT_COMPRESSION()], + 'method' => [IO::Compress::Base::Common::Parse_unsigned, Z_DEFLATED()], + 'windowbits' => [IO::Compress::Base::Common::Parse_signed, MAX_WBITS()], + 'memlevel' => [IO::Compress::Base::Common::Parse_unsigned, MAX_MEM_LEVEL()], + 'strategy' => [IO::Compress::Base::Common::Parse_unsigned, Z_DEFAULT_STRATEGY()], + 'dictionary' => [IO::Compress::Base::Common::Parse_any, ""], + }, @_ ) ; + + croak "Compress::Zlib::deflateInit: Bufsize must be >= 1, you specified " . + $got->getValue('bufsize') + unless $got->getValue('bufsize') >= 1; + + my $obj ; + + my $status = 0 ; + ($obj, $status) = + Compress::Raw::Zlib::_deflateInit(0, + $got->getValue('level'), + $got->getValue('method'), + $got->getValue('windowbits'), + $got->getValue('memlevel'), + $got->getValue('strategy'), + $got->getValue('bufsize'), + $got->getValue('dictionary')) ; + + my $x = ($status == Z_OK() ? bless $obj, "Zlib::OldDeflate" : undef) ; + return wantarray ? ($x, $status) : $x ; +} + +sub inflateInit(@) +{ + my ($got) = ParseParameters(0, + { + 'bufsize' => [IO::Compress::Base::Common::Parse_unsigned, 4096], + 'windowbits' => [IO::Compress::Base::Common::Parse_signed, MAX_WBITS()], + 'dictionary' => [IO::Compress::Base::Common::Parse_any, ""], + }, @_) ; + + + croak "Compress::Zlib::inflateInit: Bufsize must be >= 1, you specified " . + $got->getValue('bufsize') + unless $got->getValue('bufsize') >= 1; + + my $status = 0 ; + my $obj ; + ($obj, $status) = Compress::Raw::Zlib::_inflateInit(FLAG_CONSUME_INPUT, + $got->getValue('windowbits'), + $got->getValue('bufsize'), + $got->getValue('dictionary')) ; + + my $x = ($status == Z_OK() ? bless $obj, "Zlib::OldInflate" : undef) ; + + wantarray ? ($x, $status) : $x ; +} + +package Zlib::OldDeflate ; + +our (@ISA); +@ISA = qw(Compress::Raw::Zlib::deflateStream); + + +sub deflate +{ + my $self = shift ; + my $output ; + + my $status = $self->SUPER::deflate($_[0], $output) ; + wantarray ? ($output, $status) : $output ; +} + +sub flush +{ + my $self = shift ; + my $output ; + my $flag = shift || Compress::Zlib::Z_FINISH(); + my $status = $self->SUPER::flush($output, $flag) ; + + wantarray ? ($output, $status) : $output ; +} + +package Zlib::OldInflate ; + +our (@ISA); +@ISA = qw(Compress::Raw::Zlib::inflateStream); + +sub inflate +{ + my $self = shift ; + my $output ; + my $status = $self->SUPER::inflate($_[0], $output) ; + wantarray ? ($output, $status) : $output ; +} + +package Compress::Zlib ; + +use IO::Compress::Gzip::Constants 2.074 ; + +sub memGzip($) +{ + _set_gzerr(0); + my $x = Compress::Raw::Zlib::_deflateInit(FLAG_APPEND|FLAG_CRC, + Z_BEST_COMPRESSION, + Z_DEFLATED, + -MAX_WBITS(), + MAX_MEM_LEVEL, + Z_DEFAULT_STRATEGY, + 4096, + '') + or return undef ; + + # if the deflation buffer isn't a reference, make it one + my $string = (ref $_[0] ? $_[0] : \$_[0]) ; + + $] >= 5.008 and (utf8::downgrade($$string, 1) + or croak "Wide character in memGzip"); + + my $out; + my $status ; + + $x->deflate($string, $out) == Z_OK + or return undef ; + + $x->flush($out) == Z_OK + or return undef ; + + return IO::Compress::Gzip::Constants::GZIP_MINIMUM_HEADER . + $out . + pack("V V", $x->crc32(), $x->total_in()); +} + + +sub _removeGzipHeader($) +{ + my $string = shift ; + + return Z_DATA_ERROR() + if length($$string) < GZIP_MIN_HEADER_SIZE ; + + my ($magic1, $magic2, $method, $flags, $time, $xflags, $oscode) = + unpack ('CCCCVCC', $$string); + + return Z_DATA_ERROR() + unless $magic1 == GZIP_ID1 and $magic2 == GZIP_ID2 and + $method == Z_DEFLATED() and !($flags & GZIP_FLG_RESERVED) ; + substr($$string, 0, GZIP_MIN_HEADER_SIZE) = '' ; + + # skip extra field + if ($flags & GZIP_FLG_FEXTRA) + { + return Z_DATA_ERROR() + if length($$string) < GZIP_FEXTRA_HEADER_SIZE ; + + my ($extra_len) = unpack ('v', $$string); + $extra_len += GZIP_FEXTRA_HEADER_SIZE; + return Z_DATA_ERROR() + if length($$string) < $extra_len ; + + substr($$string, 0, $extra_len) = ''; + } + + # skip orig name + if ($flags & GZIP_FLG_FNAME) + { + my $name_end = index ($$string, GZIP_NULL_BYTE); + return Z_DATA_ERROR() + if $name_end == -1 ; + substr($$string, 0, $name_end + 1) = ''; + } + + # skip comment + if ($flags & GZIP_FLG_FCOMMENT) + { + my $comment_end = index ($$string, GZIP_NULL_BYTE); + return Z_DATA_ERROR() + if $comment_end == -1 ; + substr($$string, 0, $comment_end + 1) = ''; + } + + # skip header crc + if ($flags & GZIP_FLG_FHCRC) + { + return Z_DATA_ERROR() + if length ($$string) < GZIP_FHCRC_SIZE ; + substr($$string, 0, GZIP_FHCRC_SIZE) = ''; + } + + return Z_OK(); +} + +sub _ret_gun_error +{ + $Compress::Zlib::gzerrno = $IO::Uncompress::Gunzip::GunzipError; + return undef; +} + + +sub memGunzip($) +{ + # if the buffer isn't a reference, make it one + my $string = (ref $_[0] ? $_[0] : \$_[0]); + + $] >= 5.008 and (utf8::downgrade($$string, 1) + or croak "Wide character in memGunzip"); + + _set_gzerr(0); + + my $status = _removeGzipHeader($string) ; + $status == Z_OK() + or return _set_gzerr_undef($status); + + my $bufsize = length $$string > 4096 ? length $$string : 4096 ; + my $x = Compress::Raw::Zlib::_inflateInit(FLAG_CRC | FLAG_CONSUME_INPUT, + -MAX_WBITS(), $bufsize, '') + or return _ret_gun_error(); + + my $output = '' ; + $status = $x->inflate($string, $output); + + if ( $status == Z_OK() ) + { + _set_gzerr(Z_DATA_ERROR()); + return undef; + } + + return _ret_gun_error() + if ($status != Z_STREAM_END()); + + if (length $$string >= 8) + { + my ($crc, $len) = unpack ("VV", substr($$string, 0, 8)); + substr($$string, 0, 8) = ''; + return _set_gzerr_undef(Z_DATA_ERROR()) + unless $len == length($output) and + $crc == Compress::Raw::Zlib::crc32($output); + } + else + { + $$string = ''; + } + + return $output; +} + +# Autoload methods go after __END__, and are processed by the autosplit program. + +1; +__END__ + + +package File::Fetch; + +use strict; +use FileHandle; +use File::Temp; +use File::Copy; +use File::Spec; +use File::Spec::Unix; +use File::Basename qw[dirname]; + +use Cwd qw[cwd]; +use Carp qw[carp]; +use IPC::Cmd qw[can_run run QUOTE]; +use File::Path qw[mkpath]; +use File::Temp qw[tempdir]; +use Params::Check qw[check]; +use Module::Load::Conditional qw[can_load]; +use Locale::Maketext::Simple Style => 'gettext'; + +use vars qw[ $VERBOSE $PREFER_BIN $FROM_EMAIL $USER_AGENT + $BLACKLIST $METHOD_FAIL $VERSION $METHODS + $FTP_PASSIVE $TIMEOUT $DEBUG $WARN $FORCEIPV4 + ]; + +$VERSION = '0.56'; +$VERSION = eval $VERSION; # avoid warnings with development releases +$PREFER_BIN = 0; # XXX TODO implement +$FROM_EMAIL = 'File-Fetch@example.com'; +$USER_AGENT = "File::Fetch/$VERSION"; +$BLACKLIST = [qw|ftp|]; +push @$BLACKLIST, qw|lftp| if $^O eq 'dragonfly' || $^O eq 'hpux'; +$METHOD_FAIL = { }; +$FTP_PASSIVE = 1; +$TIMEOUT = 0; +$DEBUG = 0; +$WARN = 1; +$FORCEIPV4 = 0; + +### methods available to fetch the file depending on the scheme +$METHODS = { + http => [ qw|lwp httptiny wget curl lftp fetch httplite lynx iosock| ], + https => [ qw|lwp wget curl| ], + ftp => [ qw|lwp netftp wget curl lftp fetch ncftp ftp| ], + file => [ qw|lwp lftp file| ], + rsync => [ qw|rsync| ], + git => [ qw|git| ], +}; + +### silly warnings ### +local $Params::Check::VERBOSE = 1; +local $Params::Check::VERBOSE = 1; +local $Module::Load::Conditional::VERBOSE = 0; +local $Module::Load::Conditional::VERBOSE = 0; + +### Fix CVE-2016-1238 ### +local $Module::Load::Conditional::FORCE_SAFE_INC = 1; + +### see what OS we are on, important for file:// uris ### +use constant ON_WIN => ($^O eq 'MSWin32'); +use constant ON_VMS => ($^O eq 'VMS'); +use constant ON_UNIX => (!ON_WIN); +use constant HAS_VOL => (ON_WIN); +use constant HAS_SHARE => (ON_WIN); +use constant HAS_FETCH => ( $^O =~ m!^(freebsd|netbsd|dragonfly)$! ); + + + +########################## +### Object & Accessors ### +########################## + +{ + ### template for autogenerated accessors ### + my $Tmpl = { + scheme => { default => 'http' }, + host => { default => 'localhost' }, + path => { default => '/' }, + file => { required => 1 }, + uri => { required => 1 }, + userinfo => { default => '' }, + vol => { default => '' }, # windows for file:// uris + share => { default => '' }, # windows for file:// uris + file_default => { default => 'file_default' }, + tempdir_root => { required => 1 }, # Should be lazy-set at ->new() + _error_msg => { no_override => 1 }, + _error_msg_long => { no_override => 1 }, + }; + + for my $method ( keys %$Tmpl ) { + no strict 'refs'; + *$method = sub { + my $self = shift; + $self->{$method} = $_[0] if @_; + return $self->{$method}; + } + } + + sub _create { + my $class = shift; + my %hash = @_; + + my $args = check( $Tmpl, \%hash ) or return; + + bless $args, $class; + + if( lc($args->scheme) ne 'file' and not $args->host ) { + return $class->_error(loc( + "Hostname required when fetching from '%1'",$args->scheme)); + } + + for (qw[path]) { + unless( $args->$_() ) { # 5.5.x needs the () + return $class->_error(loc("No '%1' specified",$_)); + } + } + + return $args; + } +} + + +sub output_file { + my $self = shift; + my $file = $self->file; + + $file =~ s/\?.*$//g; + + $file ||= $self->file_default; + + return $file; +} + +### XXX do this or just point to URI::Escape? +# =head2 $esc_uri = $ff->escaped_uri +# +# =cut +# +# ### most of this is stolen straight from URI::escape +# { ### Build a char->hex map +# my %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255; +# +# sub escaped_uri { +# my $self = shift; +# my $uri = $self->uri; +# +# ### Default unsafe characters. RFC 2732 ^(uric - reserved) +# $uri =~ s/([^A-Za-z0-9\-_.!~*'()])/ +# $escapes{$1} || $self->_fail_hi($1)/ge; +# +# return $uri; +# } +# +# sub _fail_hi { +# my $self = shift; +# my $char = shift; +# +# $self->_error(loc( +# "Can't escape '%1', try using the '%2' module instead", +# sprintf("\\x{%04X}", ord($char)), 'URI::Escape' +# )); +# } +# +# sub output_file { +# +# } +# +# +# } + + +sub new { + my $class = shift; + my %hash = @_; + + my ($uri, $file_default, $tempdir_root); + my $tmpl = { + uri => { required => 1, store => \$uri }, + file_default => { required => 0, store => \$file_default }, + tempdir_root => { required => 0, store => \$tempdir_root }, + }; + + check( $tmpl, \%hash ) or return; + + ### parse the uri to usable parts ### + my $href = $class->_parse_uri( $uri ) or return; + + $href->{file_default} = $file_default if $file_default; + $href->{tempdir_root} = File::Spec->rel2abs( $tempdir_root ) if $tempdir_root; + $href->{tempdir_root} = File::Spec->rel2abs( Cwd::cwd ) if not $href->{tempdir_root}; + + ### make it into a FFI object ### + my $ff = $class->_create( %$href ) or return; + + + ### return the object ### + return $ff; +} + +### parses an uri to a hash structure: +### +### $class->_parse_uri( 'ftp://ftp.cpan.org/pub/mirror/index.txt' ) +### +### becomes: +### +### $href = { +### scheme => 'ftp', +### host => 'ftp.cpan.org', +### path => '/pub/mirror', +### file => 'index.html' +### }; +### +### In the case of file:// urls there maybe be additional fields +### +### For systems with volume specifications such as Win32 there will be +### a volume specifier provided in the 'vol' field. +### +### 'vol' => 'volumename' +### +### For windows file shares there may be a 'share' key specified +### +### 'share' => 'sharename' +### +### Note that the rules of what a file:// url means vary by the operating system +### of the host being addressed. Thus file:///d|/foo/bar.txt means the obvious +### 'D:\foo\bar.txt' on windows, but on unix it means '/d|/foo/bar.txt' and +### not '/foo/bar.txt' +### +### Similarly if the host interpreting the url is VMS then +### file:///disk$user/my/notes/note12345.txt' means +### 'DISK$USER:[MY.NOTES]NOTE123456.TXT' but will be returned the same as +### if it is unix where it means /disk$user/my/notes/note12345.txt'. +### Except for some cases in the File::Spec methods, Perl on VMS will generally +### handle UNIX format file specifications. +### +### This means it is impossible to serve certain file:// urls on certain systems. +### +### Thus are the problems with a protocol-less specification. :-( +### + +sub _parse_uri { + my $self = shift; + my $uri = shift or return; + + my $href = { uri => $uri }; + + ### find the scheme ### + $uri =~ s|^(\w+)://||; + $href->{scheme} = $1; + + ### See rfc 1738 section 3.10 + ### http://www.faqs.org/rfcs/rfc1738.html + ### And wikipedia for more on windows file:// urls + ### http://en.wikipedia.org/wiki/File:// + if( $href->{scheme} eq 'file' ) { + + my @parts = split '/',$uri; + + ### file://hostname/... + ### file://hostname/... + ### normalize file://localhost with file:/// + $href->{host} = $parts[0] || ''; + + ### index in @parts where the path components begin; + my $index = 1; + + ### file:////hostname/sharename/blah.txt + if ( HAS_SHARE and not length $parts[0] and not length $parts[1] ) { + + $href->{host} = $parts[2] || ''; # avoid warnings + $href->{share} = $parts[3] || ''; # avoid warnings + + $index = 4 # index after the share + + ### file:///D|/blah.txt + ### file:///D:/blah.txt + } elsif (HAS_VOL) { + + ### this code comes from dmq's patch, but: + ### XXX if volume is empty, wouldn't that be an error? --kane + ### if so, our file://localhost test needs to be fixed as wel + $href->{vol} = $parts[1] || ''; + + ### correct D| style colume descriptors + $href->{vol} =~ s/\A([A-Z])\|\z/$1:/i if ON_WIN; + + $index = 2; # index after the volume + } + + ### rebuild the path from the leftover parts; + $href->{path} = join '/', '', splice( @parts, $index, $#parts ); + + } else { + ### using anything but qw() in hash slices may produce warnings + ### in older perls :-( + @{$href}{ qw(userinfo host path) } = $uri =~ m|(?:([^\@:]*:[^\:\@]*)@)?([^/]*)(/.*)$|s; + } + + ### split the path into file + dir ### + { my @parts = File::Spec::Unix->splitpath( delete $href->{path} ); + $href->{path} = $parts[1]; + $href->{file} = $parts[2]; + } + + ### host will be empty if the target was 'localhost' and the + ### scheme was 'file' + $href->{host} = '' if ($href->{host} eq 'localhost') and + ($href->{scheme} eq 'file'); + + return $href; +} + + +sub fetch { + my $self = shift or return; + my %hash = @_; + + my $target; + my $tmpl = { + to => { default => cwd(), store => \$target }, + }; + + check( $tmpl, \%hash ) or return; + + my ($to, $fh); + ### you want us to slurp the contents + if( ref $target and UNIVERSAL::isa( $target, 'SCALAR' ) ) { + $to = tempdir( 'FileFetch.XXXXXX', DIR => $self->tempdir_root, CLEANUP => 1 ); + + ### plain old fetch + } else { + $to = $target; + + ### On VMS force to VMS format so File::Spec will work. + $to = VMS::Filespec::vmspath($to) if ON_VMS; + + ### create the path if it doesn't exist yet ### + unless( -d $to ) { + eval { mkpath( $to ) }; + + return $self->_error(loc("Could not create path '%1'",$to)) if $@; + } + } + + ### set passive ftp if required ### + local $ENV{FTP_PASSIVE} = $FTP_PASSIVE; + + ### we dont use catfile on win32 because if we are using a cygwin tool + ### under cmd.exe they wont understand windows style separators. + my $out_to = ON_WIN ? $to.'/'.$self->output_file + : File::Spec->catfile( $to, $self->output_file ); + + for my $method ( @{ $METHODS->{$self->scheme} } ) { + my $sub = '_'.$method.'_fetch'; + + unless( __PACKAGE__->can($sub) ) { + $self->_error(loc("Cannot call method for '%1' -- WEIRD!", + $method)); + next; + } + + ### method is blacklisted ### + next if grep { lc $_ eq $method } @$BLACKLIST; + + ### method is known to fail ### + next if $METHOD_FAIL->{$method}; + + ### there's serious issues with IPC::Run and quoting of command + ### line arguments. using quotes in the wrong place breaks things, + ### and in the case of say, + ### C:\cygwin\bin\wget.EXE --quiet --passive-ftp --output-document + ### "index.html" "http://www.cpan.org/index.html?q=1&y=2" + ### it doesn't matter how you quote, it always fails. + local $IPC::Cmd::USE_IPC_RUN = 0; + + if( my $file = $self->$sub( + to => $out_to + )){ + + unless( -e $file && -s _ ) { + $self->_error(loc("'%1' said it fetched '%2', ". + "but it was not created",$method,$file)); + + ### mark the failure ### + $METHOD_FAIL->{$method} = 1; + + next; + + } else { + + ### slurp mode? + if( ref $target and UNIVERSAL::isa( $target, 'SCALAR' ) ) { + + ### open the file + open my $fh, "<$file" or do { + $self->_error( + loc("Could not open '%1': %2", $file, $!)); + return; + }; + + ### slurp + $$target = do { local $/; <$fh> }; + + } + + my $abs = File::Spec->rel2abs( $file ); + return $abs; + + } + } + } + + + ### if we got here, we looped over all methods, but we weren't able + ### to fetch it. + return; +} + +######################## +### _*_fetch methods ### +######################## + +### LWP fetching ### +sub _lwp_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### modules required to download with lwp ### + my $use_list = { + LWP => '0.0', + 'LWP::UserAgent' => '0.0', + 'HTTP::Request' => '0.0', + 'HTTP::Status' => '0.0', + URI => '0.0', + + }; + + if ($self->scheme eq 'https') { + $use_list->{'LWP::Protocol::https'} = '0'; + } + + unless( can_load( modules => $use_list ) ) { + $METHOD_FAIL->{'lwp'} = 1; + return; + } + + ### setup the uri object + my $uri = URI->new( File::Spec::Unix->catfile( + $self->path, $self->file + ) ); + + ### special rules apply for file:// uris ### + $uri->scheme( $self->scheme ); + $uri->host( $self->scheme eq 'file' ? '' : $self->host ); + + if ($self->userinfo) { + $uri->userinfo($self->userinfo); + } elsif ($self->scheme ne 'file') { + $uri->userinfo("anonymous:$FROM_EMAIL"); + } + + ### set up the useragent object + my $ua = LWP::UserAgent->new(); + $ua->timeout( $TIMEOUT ) if $TIMEOUT; + $ua->agent( $USER_AGENT ); + $ua->from( $FROM_EMAIL ); + $ua->env_proxy; + + my $res = $ua->mirror($uri, $to) or return; + + ### uptodate or fetched ok ### + if ( $res->code == 304 or $res->code == 200 ) { + return $to; + + } else { + return $self->_error(loc("Fetch failed! HTTP response: %1 %2 [%3]", + $res->code, HTTP::Status::status_message($res->code), + $res->status_line)); + } + +} + +### HTTP::Tiny fetching ### +sub _httptiny_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + my $use_list = { + 'HTTP::Tiny' => '0.008', + + }; + + unless( can_load(modules => $use_list) ) { + $METHOD_FAIL->{'httptiny'} = 1; + return; + } + + my $uri = $self->uri; + + my $http = HTTP::Tiny->new( ( $TIMEOUT ? ( timeout => $TIMEOUT ) : () ) ); + + my $rc = $http->mirror( $uri, $to ); + + unless ( $rc->{success} ) { + + return $self->_error(loc( "Fetch failed! HTTP response: %1 [%2]", + $rc->{status}, $rc->{reason} ) ); + + } + + return $to; + +} + +### HTTP::Lite fetching ### +sub _httplite_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### modules required to download with lwp ### + my $use_list = { + 'HTTP::Lite' => '2.2', + 'MIME::Base64' => '0', + }; + + unless( can_load(modules => $use_list) ) { + $METHOD_FAIL->{'httplite'} = 1; + return; + } + + my $uri = $self->uri; + my $retries = 0; + + RETRIES: while ( $retries++ < 5 ) { + + my $http = HTTP::Lite->new(); + # Naughty naughty but there isn't any accessor/setter + $http->{timeout} = $TIMEOUT if $TIMEOUT; + $http->http11_mode(1); + + if ($self->userinfo) { + my $encoded = MIME::Base64::encode($self->userinfo, ''); + $http->add_req_header("Authorization", "Basic $encoded"); + } + + my $fh = FileHandle->new; + + unless ( $fh->open($to,'>') ) { + return $self->_error(loc( + "Could not open '%1' for writing: %2",$to,$!)); + } + + $fh->autoflush(1); + + binmode $fh; + + my $rc = $http->request( $uri, sub { my ($self,$dref,$cbargs) = @_; local $\; print {$cbargs} $$dref }, $fh ); + + close $fh; + + if ( $rc == 301 || $rc == 302 ) { + my $loc; + HEADERS: for ($http->headers_array) { + /Location: (\S+)/ and $loc = $1, last HEADERS; + } + #$loc or last; # Think we should squeal here. + if ($loc =~ m!^/!) { + $uri =~ s{^(\w+?://[^/]+)/.*$}{$1}; + $uri .= $loc; + } + else { + $uri = $loc; + } + next RETRIES; + } + elsif ( $rc == 200 ) { + return $to; + } + else { + return $self->_error(loc("Fetch failed! HTTP response: %1 [%2]", + $rc, $http->status_message)); + } + + } # Loop for 5 retries. + + return $self->_error("Fetch failed! Gave up after 5 tries"); + +} + +### Simple IO::Socket::INET fetching ### +sub _iosock_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + my $use_list = { + 'IO::Socket::INET' => '0.0', + 'IO::Select' => '0.0', + }; + + unless( can_load(modules => $use_list) ) { + $METHOD_FAIL->{'iosock'} = 1; + return; + } + + my $sock = IO::Socket::INET->new( + PeerHost => $self->host, + ( $self->host =~ /:/ ? () : ( PeerPort => 80 ) ), + ); + + unless ( $sock ) { + return $self->_error(loc("Could not open socket to '%1', '%2'",$self->host,$!)); + } + + my $fh = FileHandle->new; + + # Check open() + + unless ( $fh->open($to,'>') ) { + return $self->_error(loc( + "Could not open '%1' for writing: %2",$to,$!)); + } + + $fh->autoflush(1); + binmode $fh; + + my $path = File::Spec::Unix->catfile( $self->path, $self->file ); + my $req = "GET $path HTTP/1.0\x0d\x0aHost: " . $self->host . "\x0d\x0a\x0d\x0a"; + $sock->send( $req ); + + my $select = IO::Select->new( $sock ); + + my $resp = ''; + my $normal = 0; + while ( $select->can_read( $TIMEOUT || 60 ) ) { + my $ret = $sock->sysread( $resp, 4096, length($resp) ); + if ( !defined $ret or $ret == 0 ) { + $select->remove( $sock ); + $normal++; + } + } + close $sock; + + unless ( $normal ) { + return $self->_error(loc("Socket timed out after '%1' seconds", ( $TIMEOUT || 60 ))); + } + + # Check the "response" + # Strip preceding blank lines apparently they are allowed (RFC 2616 4.1) + $resp =~ s/^(\x0d?\x0a)+//; + # Check it is an HTTP response + unless ( $resp =~ m!^HTTP/(\d+)\.(\d+)!i ) { + return $self->_error(loc("Did not get a HTTP response from '%1'",$self->host)); + } + + # Check for OK + my ($code) = $resp =~ m!^HTTP/\d+\.\d+\s+(\d+)!i; + unless ( $code eq '200' ) { + return $self->_error(loc("Got a '%1' from '%2' expected '200'",$code,$self->host)); + } + + { + local $\; + print $fh +($resp =~ m/\x0d\x0a\x0d\x0a(.*)$/s )[0]; + } + close $fh; + return $to; +} + +### Net::FTP fetching +sub _netftp_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### required modules ### + my $use_list = { 'Net::FTP' => 0 }; + + unless( can_load( modules => $use_list ) ) { + $METHOD_FAIL->{'netftp'} = 1; + return; + } + + ### make connection ### + my $ftp; + my @options = ($self->host); + push(@options, Timeout => $TIMEOUT) if $TIMEOUT; + unless( $ftp = Net::FTP->new( @options ) ) { + return $self->_error(loc("Ftp creation failed: %1",$@)); + } + + ### login ### + unless( $ftp->login( anonymous => $FROM_EMAIL ) ) { + return $self->_error(loc("Could not login to '%1'",$self->host)); + } + + ### set binary mode, just in case ### + $ftp->binary; + + ### create the remote path + ### remember remote paths are unix paths! [#11483] + my $remote = File::Spec::Unix->catfile( $self->path, $self->file ); + + ### fetch the file ### + my $target; + unless( $target = $ftp->get( $remote, $to ) ) { + return $self->_error(loc("Could not fetch '%1' from '%2'", + $remote, $self->host)); + } + + ### log out ### + $ftp->quit; + + return $target; + +} + +### /bin/wget fetch ### +sub _wget_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + my $wget; + ### see if we have a wget binary ### + unless( $wget = can_run('wget') ) { + $METHOD_FAIL->{'wget'} = 1; + return; + } + + ### no verboseness, thanks ### + my $cmd = [ $wget, '--quiet' ]; + + ### if a timeout is set, add it ### + push(@$cmd, '--timeout=' . $TIMEOUT) if $TIMEOUT; + + ### run passive if specified ### + push @$cmd, '--passive-ftp' if $FTP_PASSIVE; + + ### set the output document, add the uri ### + push @$cmd, '--output-document', $to, $self->uri; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? ($to, $self->uri) + # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE); + + ### shell out ### + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG + )) { + ### wget creates the output document always, even if the fetch + ### fails.. so unlink it in that case + 1 while unlink $to; + + return $self->_error(loc( "Command failed: %1", $captured || '' )); + } + + return $to; +} + +### /bin/lftp fetch ### +sub _lftp_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### see if we have a lftp binary ### + my $lftp; + unless( $lftp = can_run('lftp') ) { + $METHOD_FAIL->{'lftp'} = 1; + return; + } + + ### no verboseness, thanks ### + my $cmd = [ $lftp, '-f' ]; + + my $fh = File::Temp->new; + + my $str; + + ### if a timeout is set, add it ### + $str .= "set net:timeout $TIMEOUT;\n" if $TIMEOUT; + + ### run passive if specified ### + $str .= "set ftp:passive-mode 1;\n" if $FTP_PASSIVE; + + ### set the output document, add the uri ### + ### quote the URI, because lftp supports certain shell + ### expansions, most notably & for backgrounding. + ### ' quote does nto work, must be " + $str .= q[get ']. $self->uri .q[' -o ]. $to . $/; + + if( $DEBUG ) { + my $pp_str = join ' ', split $/, $str; + print "# lftp command: $pp_str\n"; + } + + ### write straight to the file. + $fh->autoflush(1); + print $fh $str; + + ### the command needs to be 1 string to be executed + push @$cmd, $fh->filename; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? ($to, $self->uri) + # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE); + + + ### shell out ### + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG + )) { + ### wget creates the output document always, even if the fetch + ### fails.. so unlink it in that case + 1 while unlink $to; + + return $self->_error(loc( "Command failed: %1", $captured || '' )); + } + + return $to; +} + + + +### /bin/ftp fetch ### +sub _ftp_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### see if we have a ftp binary ### + my $ftp; + unless( $ftp = can_run('ftp') ) { + $METHOD_FAIL->{'ftp'} = 1; + return; + } + + my $fh = FileHandle->new; + + local $SIG{CHLD} = 'IGNORE'; + + unless ($fh->open("$ftp -n", '|-')) { + return $self->_error(loc("%1 creation failed: %2", $ftp, $!)); + } + + my @dialog = ( + "lcd " . dirname($to), + "open " . $self->host, + "user anonymous $FROM_EMAIL", + "cd /", + "cd " . $self->path, + "binary", + "get " . $self->file . " " . $self->output_file, + "quit", + ); + + foreach (@dialog) { $fh->print($_, "\n") } + $fh->close or return; + + return $to; +} + +### lynx is stupid - it decompresses any .gz file it finds to be text +### use /bin/lynx to fetch files +sub _lynx_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### see if we have a lynx binary ### + my $lynx; + unless ( $lynx = can_run('lynx') ){ + $METHOD_FAIL->{'lynx'} = 1; + return; + } + + unless( IPC::Cmd->can_capture_buffer ) { + $METHOD_FAIL->{'lynx'} = 1; + + return $self->_error(loc( + "Can not capture buffers. Can not use '%1' to fetch files", + 'lynx' )); + } + + ### check if the HTTP resource exists ### + if ($self->uri =~ /^https?:\/\//i) { + my $cmd = [ + $lynx, + '-head', + '-source', + "-auth=anonymous:$FROM_EMAIL", + ]; + + push @$cmd, "-connect_timeout=$TIMEOUT" if $TIMEOUT; + + push @$cmd, $self->uri; + + ### shell out ### + my $head; + unless(run( command => $cmd, + buffer => \$head, + verbose => $DEBUG ) + ) { + return $self->_error(loc("Command failed: %1", $head || '')); + } + + unless($head =~ /^HTTP\/\d+\.\d+ 200\b/) { + return $self->_error(loc("Command failed: %1", $head || '')); + } + } + + ### write to the output file ourselves, since lynx ass_u_mes to much + my $local = FileHandle->new( $to, 'w' ) + or return $self->_error(loc( + "Could not open '%1' for writing: %2",$to,$!)); + + ### dump to stdout ### + my $cmd = [ + $lynx, + '-source', + "-auth=anonymous:$FROM_EMAIL", + ]; + + push @$cmd, "-connect_timeout=$TIMEOUT" if $TIMEOUT; + + ### DO NOT quote things for IPC::Run, it breaks stuff. + push @$cmd, $self->uri; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? $self->uri + # : QUOTE. $self->uri .QUOTE; + + + ### shell out ### + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG ) + ) { + return $self->_error(loc("Command failed: %1", $captured || '')); + } + + ### print to local file ### + ### XXX on a 404 with a special error page, $captured will actually + ### hold the contents of that page, and make it *appear* like the + ### request was a success, when really it wasn't :( + ### there doesn't seem to be an option for lynx to change the exit + ### code based on a 4XX status or so. + ### the closest we can come is using --error_file and parsing that, + ### which is very unreliable ;( + $local->print( $captured ); + $local->close or return; + + return $to; +} + +### use /bin/ncftp to fetch files +sub _ncftp_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### we can only set passive mode in interactive sessions, so bail out + ### if $FTP_PASSIVE is set + return if $FTP_PASSIVE; + + ### see if we have a ncftp binary ### + my $ncftp; + unless( $ncftp = can_run('ncftp') ) { + $METHOD_FAIL->{'ncftp'} = 1; + return; + } + + my $cmd = [ + $ncftp, + '-V', # do not be verbose + '-p', $FROM_EMAIL, # email as password + $self->host, # hostname + dirname($to), # local dir for the file + # remote path to the file + ### DO NOT quote things for IPC::Run, it breaks stuff. + $IPC::Cmd::USE_IPC_RUN + ? File::Spec::Unix->catdir( $self->path, $self->file ) + : QUOTE. File::Spec::Unix->catdir( + $self->path, $self->file ) .QUOTE + + ]; + + ### shell out ### + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG ) + ) { + return $self->_error(loc("Command failed: %1", $captured || '')); + } + + return $to; + +} + +### use /bin/curl to fetch files +sub _curl_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + my $curl; + unless ( $curl = can_run('curl') ) { + $METHOD_FAIL->{'curl'} = 1; + return; + } + + ### these long opts are self explanatory - I like that -jmb + my $cmd = [ $curl, '-q' ]; + + push(@$cmd, '-4') if $^O eq 'netbsd' && $FORCEIPV4; # only seen this on NetBSD so far + + push(@$cmd, '--connect-timeout', $TIMEOUT) if $TIMEOUT; + + push(@$cmd, '--silent') unless $DEBUG; + + ### curl does the right thing with passive, regardless ### + if ($self->scheme eq 'ftp') { + push(@$cmd, '--user', "anonymous:$FROM_EMAIL"); + } + + ### curl doesn't follow 302 (temporarily moved) etc automatically + ### so we add --location to enable that. + push @$cmd, '--fail', '--location', '--output', $to, $self->uri; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? ($to, $self->uri) + # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE); + + + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG ) + ) { + + return $self->_error(loc("Command failed: %1", $captured || '')); + } + + return $to; + +} + +### /usr/bin/fetch fetch! ### +sub _fetch_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + ### see if we have a fetch binary ### + my $fetch; + unless( HAS_FETCH and $fetch = can_run('fetch') ) { + $METHOD_FAIL->{'fetch'} = 1; + return; + } + + ### no verboseness, thanks ### + my $cmd = [ $fetch, '-q' ]; + + ### if a timeout is set, add it ### + push(@$cmd, '-T', $TIMEOUT) if $TIMEOUT; + + ### run passive if specified ### + #push @$cmd, '-p' if $FTP_PASSIVE; + local $ENV{'FTP_PASSIVE_MODE'} = 1 if $FTP_PASSIVE; + + ### set the output document, add the uri ### + push @$cmd, '-o', $to, $self->uri; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? ($to, $self->uri) + # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE); + + ### shell out ### + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG + )) { + ### wget creates the output document always, even if the fetch + ### fails.. so unlink it in that case + 1 while unlink $to; + + return $self->_error(loc( "Command failed: %1", $captured || '' )); + } + + return $to; +} + +### use File::Copy for fetching file:// urls ### +### +### See section 3.10 of RFC 1738 (http://www.faqs.org/rfcs/rfc1738.html) +### Also see wikipedia on file:// (http://en.wikipedia.org/wiki/File://) +### + +sub _file_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + + + + ### prefix a / on unix systems with a file uri, since it would + ### look somewhat like this: + ### file:///home/kane/file + ### whereas windows file uris for 'c:\some\dir\file' might look like: + ### file:///C:/some/dir/file + ### file:///C|/some/dir/file + ### or for a network share '\\host\share\some\dir\file': + ### file:////host/share/some/dir/file + ### + ### VMS file uri's for 'DISK$USER:[MY.NOTES]NOTE123456.TXT' might look like: + ### file://vms.host.edu/disk$user/my/notes/note12345.txt + ### + + my $path = $self->path; + my $vol = $self->vol; + my $share = $self->share; + + my $remote; + if (!$share and $self->host) { + return $self->_error(loc( + "Currently %1 cannot handle hosts in %2 urls", + 'File::Fetch', 'file://' + )); + } + + if( $vol ) { + $path = File::Spec->catdir( split /\//, $path ); + $remote = File::Spec->catpath( $vol, $path, $self->file); + + } elsif( $share ) { + ### win32 specific, and a share name, so we wont bother with File::Spec + $path =~ s|/+|\\|g; + $remote = "\\\\".$self->host."\\$share\\$path"; + + } else { + ### File::Spec on VMS can not currently handle UNIX syntax. + my $file_class = ON_VMS + ? 'File::Spec::Unix' + : 'File::Spec'; + + $remote = $file_class->catfile( $path, $self->file ); + } + + ### File::Copy is littered with 'die' statements :( ### + my $rv = eval { File::Copy::copy( $remote, $to ) }; + + ### something went wrong ### + if( !$rv or $@ ) { + return $self->_error(loc("Could not copy '%1' to '%2': %3 %4", + $remote, $to, $!, $@)); + } + + return $to; +} + +### use /usr/bin/rsync to fetch files +sub _rsync_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + my $rsync; + unless ( $rsync = can_run('rsync') ) { + $METHOD_FAIL->{'rsync'} = 1; + return; + } + + my $cmd = [ $rsync ]; + + ### XXX: rsync has no I/O timeouts at all, by default + push(@$cmd, '--timeout=' . $TIMEOUT) if $TIMEOUT; + + push(@$cmd, '--quiet') unless $DEBUG; + + ### DO NOT quote things for IPC::Run, it breaks stuff. + push @$cmd, $self->uri, $to; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? ($to, $self->uri) + # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE); + + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG ) + ) { + + return $self->_error(loc("Command %1 failed: %2", + "@$cmd" || '', $captured || '')); + } + + return $to; + +} + +### use git to fetch files +sub _git_fetch { + my $self = shift; + my %hash = @_; + + my ($to); + my $tmpl = { + to => { required => 1, store => \$to } + }; + check( $tmpl, \%hash ) or return; + my $git; + unless ( $git = can_run('git') ) { + $METHOD_FAIL->{'git'} = 1; + return; + } + + my $cmd = [ $git, 'clone' ]; + + #push(@$cmd, '--timeout=' . $TIMEOUT) if $TIMEOUT; + + push(@$cmd, '--quiet') unless $DEBUG; + + ### DO NOT quote things for IPC::Run, it breaks stuff. + push @$cmd, $self->uri, $to; + + ### with IPC::Cmd > 0.41, this is fixed in teh library, + ### and there's no need for special casing any more. + ### DO NOT quote things for IPC::Run, it breaks stuff. + # $IPC::Cmd::USE_IPC_RUN + # ? ($to, $self->uri) + # : (QUOTE. $to .QUOTE, QUOTE. $self->uri .QUOTE); + + my $captured; + unless(run( command => $cmd, + buffer => \$captured, + verbose => $DEBUG ) + ) { + + return $self->_error(loc("Command %1 failed: %2", + "@$cmd" || '', $captured || '')); + } + + return $to; + +} + +################################# +# +# Error code +# +################################# + + +### error handling the way Archive::Extract does it +sub _error { + my $self = shift; + my $error = shift; + + $self->_error_msg( $error ); + $self->_error_msg_long( Carp::longmess($error) ); + + if( $WARN ) { + carp $DEBUG ? $self->_error_msg_long : $self->_error_msg; + } + + return; +} + +sub error { + my $self = shift; + return shift() ? $self->_error_msg_long : $self->_error_msg; +} + + +1; + + +# Local variables: +# c-indentation-style: bsd +# c-basic-offset: 4 +# indent-tabs-mode: nil +# End: +# vim: expandtab shiftwidth=4: + + + + +package File::Path; + +use 5.005_04; +use strict; + +use Cwd 'getcwd'; +use File::Basename (); +use File::Spec (); + +BEGIN { + if ( $] < 5.006 ) { + + # can't say 'opendir my $dh, $dirname' + # need to initialise $dh + eval 'use Symbol'; + } +} + +use Exporter (); +use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); +$VERSION = '2.15'; +$VERSION = eval $VERSION; +@ISA = qw(Exporter); +@EXPORT = qw(mkpath rmtree); +@EXPORT_OK = qw(make_path remove_tree); + +BEGIN { + for (qw(VMS MacOS MSWin32 os2)) { + no strict 'refs'; + *{"_IS_\U$_"} = $^O eq $_ ? sub () { 1 } : sub () { 0 }; + } + + # These OSes complain if you want to remove a file that you have no + # write permission to: + *_FORCE_WRITABLE = ( + grep { $^O eq $_ } qw(amigaos dos epoc MSWin32 MacOS os2) + ) ? sub () { 1 } : sub () { 0 }; + + # Unix-like systems need to stat each directory in order to detect + # race condition. MS-Windows is immune to this particular attack. + *_NEED_STAT_CHECK = !(_IS_MSWIN32()) ? sub () { 1 } : sub () { 0 }; +} + +sub _carp { + require Carp; + goto &Carp::carp; +} + +sub _croak { + require Carp; + goto &Carp::croak; +} + +sub _error { + my $arg = shift; + my $message = shift; + my $object = shift; + + if ( $arg->{error} ) { + $object = '' unless defined $object; + $message .= ": $!" if $!; + push @{ ${ $arg->{error} } }, { $object => $message }; + } + else { + _carp( defined($object) ? "$message for $object: $!" : "$message: $!" ); + } +} + +sub __is_arg { + my ($arg) = @_; + + # If client code blessed an array ref to HASH, this will not work + # properly. We could have done $arg->isa() wrapped in eval, but + # that would be expensive. This implementation should suffice. + # We could have also used Scalar::Util:blessed, but we choose not + # to add this dependency + return ( ref $arg eq 'HASH' ); +} + +sub make_path { + push @_, {} unless @_ and __is_arg( $_[-1] ); + goto &mkpath; +} + +sub mkpath { + my $old_style = !( @_ and __is_arg( $_[-1] ) ); + + my $data; + my $paths; + + if ($old_style) { + my ( $verbose, $mode ); + ( $paths, $verbose, $mode ) = @_; + $paths = [$paths] unless UNIVERSAL::isa( $paths, 'ARRAY' ); + $data->{verbose} = $verbose; + $data->{mode} = defined $mode ? $mode : oct '777'; + } + else { + my %args_permitted = map { $_ => 1 } ( qw| + chmod + error + group + mask + mode + owner + uid + user + verbose + | ); + my %not_on_win32_args = map { $_ => 1 } ( qw| + group + owner + uid + user + | ); + my @bad_args = (); + my @win32_implausible_args = (); + my $arg = pop @_; + for my $k (sort keys %{$arg}) { + if (! $args_permitted{$k}) { + push @bad_args, $k; + } + elsif ($not_on_win32_args{$k} and _IS_MSWIN32) { + push @win32_implausible_args, $k; + } + else { + $data->{$k} = $arg->{$k}; + } + } + _carp("Unrecognized option(s) passed to mkpath() or make_path(): @bad_args") + if @bad_args; + _carp("Option(s) implausible on Win32 passed to mkpath() or make_path(): @win32_implausible_args") + if @win32_implausible_args; + $data->{mode} = delete $data->{mask} if exists $data->{mask}; + $data->{mode} = oct '777' unless exists $data->{mode}; + ${ $data->{error} } = [] if exists $data->{error}; + unless (@win32_implausible_args) { + $data->{owner} = delete $data->{user} if exists $data->{user}; + $data->{owner} = delete $data->{uid} if exists $data->{uid}; + if ( exists $data->{owner} and $data->{owner} =~ /\D/ ) { + my $uid = ( getpwnam $data->{owner} )[2]; + if ( defined $uid ) { + $data->{owner} = $uid; + } + else { + _error( $data, + "unable to map $data->{owner} to a uid, ownership not changed" + ); + delete $data->{owner}; + } + } + if ( exists $data->{group} and $data->{group} =~ /\D/ ) { + my $gid = ( getgrnam $data->{group} )[2]; + if ( defined $gid ) { + $data->{group} = $gid; + } + else { + _error( $data, + "unable to map $data->{group} to a gid, group ownership not changed" + ); + delete $data->{group}; + } + } + if ( exists $data->{owner} and not exists $data->{group} ) { + $data->{group} = -1; # chown will leave group unchanged + } + if ( exists $data->{group} and not exists $data->{owner} ) { + $data->{owner} = -1; # chown will leave owner unchanged + } + } + $paths = [@_]; + } + return _mkpath( $data, $paths ); +} + +sub _mkpath { + my $data = shift; + my $paths = shift; + + my ( @created ); + foreach my $path ( @{$paths} ) { + next unless defined($path) and length($path); + $path .= '/' if _IS_OS2 and $path =~ /^\w:\z/s; # feature of CRT + + # Logic wants Unix paths, so go with the flow. + if (_IS_VMS) { + next if $path eq '/'; + $path = VMS::Filespec::unixify($path); + } + next if -d $path; + my $parent = File::Basename::dirname($path); + # Coverage note: It's not clear how we would test the condition: + # '-d $parent or $path eq $parent' + unless ( -d $parent or $path eq $parent ) { + push( @created, _mkpath( $data, [$parent] ) ); + } + print "mkdir $path\n" if $data->{verbose}; + if ( mkdir( $path, $data->{mode} ) ) { + push( @created, $path ); + if ( exists $data->{owner} ) { + + # NB: $data->{group} guaranteed to be set during initialisation + if ( !chown $data->{owner}, $data->{group}, $path ) { + _error( $data, + "Cannot change ownership of $path to $data->{owner}:$data->{group}" + ); + } + } + if ( exists $data->{chmod} ) { + # Coverage note: It's not clear how we would trigger the next + # 'if' block. Failure of 'chmod' might first result in a + # system error: "Permission denied". + if ( !chmod $data->{chmod}, $path ) { + _error( $data, + "Cannot change permissions of $path to $data->{chmod}" ); + } + } + } + else { + my $save_bang = $!; + + # From 'perldoc perlvar': $EXTENDED_OS_ERROR ($^E) is documented + # as: + # Error information specific to the current operating system. At the + # moment, this differs from "$!" under only VMS, OS/2, and Win32 + # (and for MacPerl). On all other platforms, $^E is always just the + # same as $!. + + my ( $e, $e1 ) = ( $save_bang, $^E ); + $e .= "; $e1" if $e ne $e1; + + # allow for another process to have created it meanwhile + if ( ! -d $path ) { + $! = $save_bang; + if ( $data->{error} ) { + push @{ ${ $data->{error} } }, { $path => $e }; + } + else { + _croak("mkdir $path: $e"); + } + } + } + } + return @created; +} + +sub remove_tree { + push @_, {} unless @_ and __is_arg( $_[-1] ); + goto &rmtree; +} + +sub _is_subdir { + my ( $dir, $test ) = @_; + + my ( $dv, $dd ) = File::Spec->splitpath( $dir, 1 ); + my ( $tv, $td ) = File::Spec->splitpath( $test, 1 ); + + # not on same volume + return 0 if $dv ne $tv; + + my @d = File::Spec->splitdir($dd); + my @t = File::Spec->splitdir($td); + + # @t can't be a subdir if it's shorter than @d + return 0 if @t < @d; + + return join( '/', @d ) eq join( '/', splice @t, 0, +@d ); +} + +sub rmtree { + my $old_style = !( @_ and __is_arg( $_[-1] ) ); + + my ($arg, $data, $paths); + + if ($old_style) { + my ( $verbose, $safe ); + ( $paths, $verbose, $safe ) = @_; + $data->{verbose} = $verbose; + $data->{safe} = defined $safe ? $safe : 0; + + if ( defined($paths) and length($paths) ) { + $paths = [$paths] unless UNIVERSAL::isa( $paths, 'ARRAY' ); + } + else { + _carp("No root path(s) specified\n"); + return 0; + } + } + else { + my %args_permitted = map { $_ => 1 } ( qw| + error + keep_root + result + safe + verbose + | ); + my @bad_args = (); + my $arg = pop @_; + for my $k (sort keys %{$arg}) { + if (! $args_permitted{$k}) { + push @bad_args, $k; + } + else { + $data->{$k} = $arg->{$k}; + } + } + _carp("Unrecognized option(s) passed to remove_tree(): @bad_args") + if @bad_args; + ${ $data->{error} } = [] if exists $data->{error}; + ${ $data->{result} } = [] if exists $data->{result}; + + # Wouldn't it make sense to do some validation on @_ before assigning + # to $paths here? + # In the $old_style case we guarantee that each path is both defined + # and non-empty. We don't check that here, which means we have to + # check it later in the first condition in this line: + # if ( $ortho_root_length && _is_subdir( $ortho_root, $ortho_cwd ) ) { + # Granted, that would be a change in behavior for the two + # non-old-style interfaces. + + $paths = [@_]; + } + + $data->{prefix} = ''; + $data->{depth} = 0; + + my @clean_path; + $data->{cwd} = getcwd() or do { + _error( $data, "cannot fetch initial working directory" ); + return 0; + }; + for ( $data->{cwd} ) { /\A(.*)\Z/s; $_ = $1 } # untaint + + for my $p (@$paths) { + + # need to fixup case and map \ to / on Windows + my $ortho_root = _IS_MSWIN32 ? _slash_lc($p) : $p; + my $ortho_cwd = + _IS_MSWIN32 ? _slash_lc( $data->{cwd} ) : $data->{cwd}; + my $ortho_root_length = length($ortho_root); + $ortho_root_length-- if _IS_VMS; # don't compare '.' with ']' + if ( $ortho_root_length && _is_subdir( $ortho_root, $ortho_cwd ) ) { + local $! = 0; + _error( $data, "cannot remove path when cwd is $data->{cwd}", $p ); + next; + } + + if (_IS_MACOS) { + $p = ":$p" unless $p =~ /:/; + $p .= ":" unless $p =~ /:\z/; + } + elsif ( _IS_MSWIN32 ) { + $p =~ s{[/\\]\z}{}; + } + else { + $p =~ s{/\z}{}; + } + push @clean_path, $p; + } + + @{$data}{qw(device inode)} = ( lstat $data->{cwd} )[ 0, 1 ] or do { + _error( $data, "cannot stat initial working directory", $data->{cwd} ); + return 0; + }; + + return _rmtree( $data, \@clean_path ); +} + +sub _rmtree { + my $data = shift; + my $paths = shift; + + my $count = 0; + my $curdir = File::Spec->curdir(); + my $updir = File::Spec->updir(); + + my ( @files, $root ); + ROOT_DIR: + foreach my $root (@$paths) { + + # since we chdir into each directory, it may not be obvious + # to figure out where we are if we generate a message about + # a file name. We therefore construct a semi-canonical + # filename, anchored from the directory being unlinked (as + # opposed to being truly canonical, anchored from the root (/). + + my $canon = + $data->{prefix} + ? File::Spec->catfile( $data->{prefix}, $root ) + : $root; + + my ( $ldev, $lino, $perm ) = ( lstat $root )[ 0, 1, 2 ] + or next ROOT_DIR; + + if ( -d _ ) { + $root = VMS::Filespec::vmspath( VMS::Filespec::pathify($root) ) + if _IS_VMS; + + if ( !chdir($root) ) { + + # see if we can escalate privileges to get in + # (e.g. funny protection mask such as -w- instead of rwx) + # This uses fchmod to avoid traversing outside of the proper + # location (CVE-2017-6512) + my $root_fh; + if (open($root_fh, '<', $root)) { + my ($fh_dev, $fh_inode) = (stat $root_fh )[0,1]; + $perm &= oct '7777'; + my $nperm = $perm | oct '700'; + local $@; + if ( + !( + $data->{safe} + or $nperm == $perm + or !-d _ + or $fh_dev ne $ldev + or $fh_inode ne $lino + or eval { chmod( $nperm, $root_fh ) } + ) + ) + { + _error( $data, + "cannot make child directory read-write-exec", $canon ); + next ROOT_DIR; + } + close $root_fh; + } + if ( !chdir($root) ) { + _error( $data, "cannot chdir to child", $canon ); + next ROOT_DIR; + } + } + + my ( $cur_dev, $cur_inode, $perm ) = ( stat $curdir )[ 0, 1, 2 ] + or do { + _error( $data, "cannot stat current working directory", $canon ); + next ROOT_DIR; + }; + + if (_NEED_STAT_CHECK) { + ( $ldev eq $cur_dev and $lino eq $cur_inode ) + or _croak( +"directory $canon changed before chdir, expected dev=$ldev ino=$lino, actual dev=$cur_dev ino=$cur_inode, aborting." + ); + } + + $perm &= oct '7777'; # don't forget setuid, setgid, sticky bits + my $nperm = $perm | oct '700'; + + # notabene: 0700 is for making readable in the first place, + # it's also intended to change it to writable in case we have + # to recurse in which case we are better than rm -rf for + # subtrees with strange permissions + + if ( + !( + $data->{safe} + or $nperm == $perm + or chmod( $nperm, $curdir ) + ) + ) + { + _error( $data, "cannot make directory read+writeable", $canon ); + $nperm = $perm; + } + + my $d; + $d = gensym() if $] < 5.006; + if ( !opendir $d, $curdir ) { + _error( $data, "cannot opendir", $canon ); + @files = (); + } + else { + if ( !defined ${^TAINT} or ${^TAINT} ) { + # Blindly untaint dir names if taint mode is active + @files = map { /\A(.*)\z/s; $1 } readdir $d; + } + else { + @files = readdir $d; + } + closedir $d; + } + + if (_IS_VMS) { + + # Deleting large numbers of files from VMS Files-11 + # filesystems is faster if done in reverse ASCIIbetical order. + # include '.' to '.;' from blead patch #31775 + @files = map { $_ eq '.' ? '.;' : $_ } reverse @files; + } + + @files = grep { $_ ne $updir and $_ ne $curdir } @files; + + if (@files) { + + # remove the contained files before the directory itself + my $narg = {%$data}; + @{$narg}{qw(device inode cwd prefix depth)} = + ( $cur_dev, $cur_inode, $updir, $canon, $data->{depth} + 1 ); + $count += _rmtree( $narg, \@files ); + } + + # restore directory permissions of required now (in case the rmdir + # below fails), while we are still in the directory and may do so + # without a race via '.' + if ( $nperm != $perm and not chmod( $perm, $curdir ) ) { + _error( $data, "cannot reset chmod", $canon ); + } + + # don't leave the client code in an unexpected directory + chdir( $data->{cwd} ) + or + _croak("cannot chdir to $data->{cwd} from $canon: $!, aborting."); + + # ensure that a chdir upwards didn't take us somewhere other + # than we expected (see CVE-2002-0435) + ( $cur_dev, $cur_inode ) = ( stat $curdir )[ 0, 1 ] + or _croak( + "cannot stat prior working directory $data->{cwd}: $!, aborting." + ); + + if (_NEED_STAT_CHECK) { + ( $data->{device} eq $cur_dev and $data->{inode} eq $cur_inode ) + or _croak( "previous directory $data->{cwd} " + . "changed before entering $canon, " + . "expected dev=$ldev ino=$lino, " + . "actual dev=$cur_dev ino=$cur_inode, aborting." + ); + } + + if ( $data->{depth} or !$data->{keep_root} ) { + if ( $data->{safe} + && ( _IS_VMS + ? !&VMS::Filespec::candelete($root) + : !-w $root ) ) + { + print "skipped $root\n" if $data->{verbose}; + next ROOT_DIR; + } + if ( _FORCE_WRITABLE and !chmod $perm | oct '700', $root ) { + _error( $data, "cannot make directory writeable", $canon ); + } + print "rmdir $root\n" if $data->{verbose}; + if ( rmdir $root ) { + push @{ ${ $data->{result} } }, $root if $data->{result}; + ++$count; + } + else { + _error( $data, "cannot remove directory", $canon ); + if ( + _FORCE_WRITABLE + && !chmod( $perm, + ( _IS_VMS ? VMS::Filespec::fileify($root) : $root ) + ) + ) + { + _error( + $data, + sprintf( "cannot restore permissions to 0%o", + $perm ), + $canon + ); + } + } + } + } + else { + # not a directory + $root = VMS::Filespec::vmsify("./$root") + if _IS_VMS + && !File::Spec->file_name_is_absolute($root) + && ( $root !~ m/(?<!\^)[\]>]+/ ); # not already in VMS syntax + + if ( + $data->{safe} + && ( + _IS_VMS + ? !&VMS::Filespec::candelete($root) + : !( -l $root || -w $root ) + ) + ) + { + print "skipped $root\n" if $data->{verbose}; + next ROOT_DIR; + } + + my $nperm = $perm & oct '7777' | oct '600'; + if ( _FORCE_WRITABLE + and $nperm != $perm + and not chmod $nperm, $root ) + { + _error( $data, "cannot make file writeable", $canon ); + } + print "unlink $canon\n" if $data->{verbose}; + + # delete all versions under VMS + for ( ; ; ) { + if ( unlink $root ) { + push @{ ${ $data->{result} } }, $root if $data->{result}; + } + else { + _error( $data, "cannot unlink file", $canon ); + _FORCE_WRITABLE and chmod( $perm, $root ) + or _error( $data, + sprintf( "cannot restore permissions to 0%o", $perm ), + $canon ); + last; + } + ++$count; + last unless _IS_VMS && lstat $root; + } + } + } + return $count; +} + +sub _slash_lc { + + # fix up slashes and case on MSWin32 so that we can determine that + # c:\path\to\dir is underneath C:/Path/To + my $path = shift; + $path =~ tr{\\}{/}; + return lc($path); +} + +1; + +__END__ + +# File/Copy.pm. Written in 1994 by Aaron Sherman <ajs@ajs.com>. This +# source code has been placed in the public domain by the author. +# Please be kind and preserve the documentation. +# +# Additions copyright 1996 by Charles Bailey. Permission is granted +# to distribute the revised code under the same terms as Perl itself. + +package File::Copy; + +use 5.006; +use strict; +use warnings; no warnings 'newline'; +use File::Spec; +use Config; +# During perl build, we need File::Copy but Scalar::Util might not be built yet +# And then we need these games to avoid loading overload, as that will +# confuse miniperl during the bootstrap of perl. +my $Scalar_Util_loaded = eval q{ require Scalar::Util; require overload; 1 }; +# We want HiRes stat and utime if available +BEGIN { eval q{ use Time::HiRes qw( stat utime ) } }; +our(@ISA, @EXPORT, @EXPORT_OK, $VERSION, $Too_Big, $Syscopy_is_copy); +sub copy; +sub syscopy; +sub cp; +sub mv; + +$VERSION = '2.33'; + +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(copy move); +@EXPORT_OK = qw(cp mv); + +$Too_Big = 1024 * 1024 * 2; + +sub croak { + require Carp; + goto &Carp::croak; +} + +sub carp { + require Carp; + goto &Carp::carp; +} + +sub _catname { + my($from, $to) = @_; + if (not defined &basename) { + require File::Basename; + import File::Basename 'basename'; + } + + return File::Spec->catfile($to, basename($from)); +} + +# _eq($from, $to) tells whether $from and $to are identical +sub _eq { + my ($from, $to) = map { + $Scalar_Util_loaded && Scalar::Util::blessed($_) + && overload::Method($_, q{""}) + ? "$_" + : $_ + } (@_); + return '' if ( (ref $from) xor (ref $to) ); + return $from == $to if ref $from; + return $from eq $to; +} + +sub copy { + croak("Usage: copy(FROM, TO [, BUFFERSIZE]) ") + unless(@_ == 2 || @_ == 3); + + my $from = shift; + my $to = shift; + + my $size; + if (@_) { + $size = shift(@_) + 0; + croak("Bad buffer size for copy: $size\n") unless ($size > 0); + } + + my $from_a_handle = (ref($from) + ? (ref($from) eq 'GLOB' + || UNIVERSAL::isa($from, 'GLOB') + || UNIVERSAL::isa($from, 'IO::Handle')) + : (ref(\$from) eq 'GLOB')); + my $to_a_handle = (ref($to) + ? (ref($to) eq 'GLOB' + || UNIVERSAL::isa($to, 'GLOB') + || UNIVERSAL::isa($to, 'IO::Handle')) + : (ref(\$to) eq 'GLOB')); + + if (_eq($from, $to)) { # works for references, too + carp("'$from' and '$to' are identical (not copied)"); + return 0; + } + + if (!$from_a_handle && !$to_a_handle && -d $to && ! -d $from) { + $to = _catname($from, $to); + } + + if ((($Config{d_symlink} && $Config{d_readlink}) || $Config{d_link}) && + !($^O eq 'MSWin32' || $^O eq 'os2')) { + my @fs = stat($from); + if (@fs) { + my @ts = stat($to); + if (@ts && $fs[0] == $ts[0] && $fs[1] == $ts[1] && !-p $from) { + carp("'$from' and '$to' are identical (not copied)"); + return 0; + } + } + } + elsif (_eq($from, $to)) { + carp("'$from' and '$to' are identical (not copied)"); + return 0; + } + + if (defined &syscopy && !$Syscopy_is_copy + && !$to_a_handle + && !($from_a_handle && $^O eq 'os2' ) # OS/2 cannot handle handles + && !($from_a_handle && $^O eq 'MSWin32') + && !($from_a_handle && $^O eq 'NetWare') + ) + { + if ($^O eq 'VMS' && -e $from + && ! -d $to && ! -d $from) { + + # VMS natively inherits path components from the source of a + # copy, but we want the Unixy behavior of inheriting from + # the current working directory. Also, default in a trailing + # dot for null file types. + + $to = VMS::Filespec::rmsexpand(VMS::Filespec::vmsify($to), '.'); + + # Get rid of the old versions to be like UNIX + 1 while unlink $to; + } + + return syscopy($from, $to) || 0; + } + + my $closefrom = 0; + my $closeto = 0; + my ($status, $r, $buf); + local($\) = ''; + + my $from_h; + if ($from_a_handle) { + $from_h = $from; + } else { + open $from_h, "<", $from or goto fail_open1; + binmode $from_h or die "($!,$^E)"; + $closefrom = 1; + } + + # Seems most logical to do this here, in case future changes would want to + # make this croak for some reason. + unless (defined $size) { + $size = tied(*$from_h) ? 0 : -s $from_h || 0; + $size = 1024 if ($size < 512); + $size = $Too_Big if ($size > $Too_Big); + } + + my $to_h; + if ($to_a_handle) { + $to_h = $to; + } else { + $to_h = \do { local *FH }; # XXX is this line obsolete? + open $to_h, ">", $to or goto fail_open2; + binmode $to_h or die "($!,$^E)"; + $closeto = 1; + } + + $! = 0; + for (;;) { + my ($r, $w, $t); + defined($r = sysread($from_h, $buf, $size)) + or goto fail_inner; + last unless $r; + for ($w = 0; $w < $r; $w += $t) { + $t = syswrite($to_h, $buf, $r - $w, $w) + or goto fail_inner; + } + } + + close($to_h) || goto fail_open2 if $closeto; + close($from_h) || goto fail_open1 if $closefrom; + + # Use this idiom to avoid uninitialized value warning. + return 1; + + # All of these contortions try to preserve error messages... + fail_inner: + if ($closeto) { + $status = $!; + $! = 0; + close $to_h; + $! = $status unless $!; + } + fail_open2: + if ($closefrom) { + $status = $!; + $! = 0; + close $from_h; + $! = $status unless $!; + } + fail_open1: + return 0; +} + +sub cp { + my($from,$to) = @_; + my(@fromstat) = stat $from; + my(@tostat) = stat $to; + my $perm; + + return 0 unless copy(@_) and @fromstat; + + if (@tostat) { + $perm = $tostat[2]; + } else { + $perm = $fromstat[2] & ~(umask || 0); + @tostat = stat $to; + } + # Might be more robust to look for S_I* in Fcntl, but we're + # trying to avoid dependence on any XS-containing modules, + # since File::Copy is used during the Perl build. + $perm &= 07777; + if ($perm & 06000) { + croak("Unable to check setuid/setgid permissions for $to: $!") + unless @tostat; + + if ($perm & 04000 and # setuid + $fromstat[4] != $tostat[4]) { # owner must match + $perm &= ~06000; + } + + if ($perm & 02000 && $> != 0) { # if not root, setgid + my $ok = $fromstat[5] == $tostat[5]; # group must match + if ($ok) { # and we must be in group + $ok = grep { $_ == $fromstat[5] } split /\s+/, $) + } + $perm &= ~06000 unless $ok; + } + } + return 0 unless @tostat; + return 1 if $perm == ($tostat[2] & 07777); + return eval { chmod $perm, $to; } ? 1 : 0; +} + +sub _move { + croak("Usage: move(FROM, TO) ") unless @_ == 3; + + my($from,$to,$fallback) = @_; + + my($fromsz,$tosz1,$tomt1,$tosz2,$tomt2,$sts,$ossts); + + if (-d $to && ! -d $from) { + $to = _catname($from, $to); + } + + ($tosz1,$tomt1) = (stat($to))[7,9]; + $fromsz = -s $from; + if ($^O eq 'os2' and defined $tosz1 and defined $fromsz) { + # will not rename with overwrite + unlink $to; + } + + if ($^O eq 'VMS' && -e $from + && ! -d $to && ! -d $from) { + + # VMS natively inherits path components from the source of a + # copy, but we want the Unixy behavior of inheriting from + # the current working directory. Also, default in a trailing + # dot for null file types. + + $to = VMS::Filespec::rmsexpand(VMS::Filespec::vmsify($to), '.'); + + # Get rid of the old versions to be like UNIX + 1 while unlink $to; + } + + return 1 if rename $from, $to; + + # Did rename return an error even though it succeeded, because $to + # is on a remote NFS file system, and NFS lost the server's ack? + return 1 if defined($fromsz) && !-e $from && # $from disappeared + (($tosz2,$tomt2) = (stat($to))[7,9]) && # $to's there + ((!defined $tosz1) || # not before or + ($tosz1 != $tosz2 or $tomt1 != $tomt2)) && # was changed + $tosz2 == $fromsz; # it's all there + + ($tosz1,$tomt1) = (stat($to))[7,9]; # just in case rename did something + + { + local $@; + eval { + local $SIG{__DIE__}; + $fallback->($from,$to) or die; + my($atime, $mtime) = (stat($from))[8,9]; + utime($atime, $mtime, $to); + unlink($from) or die; + }; + return 1 unless $@; + } + ($sts,$ossts) = ($! + 0, $^E + 0); + + ($tosz2,$tomt2) = ((stat($to))[7,9],0,0) if defined $tomt1; + unlink($to) if !defined($tomt1) or $tomt1 != $tomt2 or $tosz1 != $tosz2; + ($!,$^E) = ($sts,$ossts); + return 0; +} + +sub move { _move(@_,\©); } +sub mv { _move(@_,\&cp); } + +# &syscopy is an XSUB under OS/2 +unless (defined &syscopy) { + if ($^O eq 'VMS') { + *syscopy = \&rmscopy; + } elsif ($^O eq 'MSWin32' && defined &DynaLoader::boot_DynaLoader) { + # Win32::CopyFile() fill only work if we can load Win32.xs + *syscopy = sub { + return 0 unless @_ == 2; + return Win32::CopyFile(@_, 1); + }; + } else { + $Syscopy_is_copy = 1; + *syscopy = \© + } +} + +1; + +__END__ + + +package File::Find; +use 5.006; +use strict; +use warnings; +use warnings::register; +our $VERSION = '1.34'; +require Exporter; +require Cwd; + +our @ISA = qw(Exporter); +our @EXPORT = qw(find finddepth); + + +use strict; +my $Is_VMS; +my $Is_Win32; + +require File::Basename; +require File::Spec; + +# Should ideally be my() not our() but local() currently +# refuses to operate on lexicals + +our %SLnkSeen; +our ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, + $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, + $pre_process, $post_process, $dangling_symlinks); + +sub contract_name { + my ($cdir,$fn) = @_; + + return substr($cdir,0,rindex($cdir,'/')) if $fn eq $File::Find::current_dir; + + $cdir = substr($cdir,0,rindex($cdir,'/')+1); + + $fn =~ s|^\./||; + + my $abs_name= $cdir . $fn; + + if (substr($fn,0,3) eq '../') { + 1 while $abs_name =~ s!/[^/]*/\.\./+!/!; + } + + return $abs_name; +} + +sub PathCombine($$) { + my ($Base,$Name) = @_; + my $AbsName; + + if (substr($Name,0,1) eq '/') { + $AbsName= $Name; + } + else { + $AbsName= contract_name($Base,$Name); + } + + # (simple) check for recursion + my $newlen= length($AbsName); + if ($newlen <= length($Base)) { + if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/') + && $AbsName eq substr($Base,0,$newlen)) + { + return undef; + } + } + return $AbsName; +} + +sub Follow_SymLink($) { + my ($AbsName) = @_; + + my ($NewName,$DEV, $INO); + ($DEV, $INO)= lstat $AbsName; + + while (-l _) { + if ($SLnkSeen{$DEV, $INO}++) { + if ($follow_skip < 2) { + die "$AbsName is encountered a second time"; + } + else { + return undef; + } + } + $NewName= PathCombine($AbsName, readlink($AbsName)); + unless(defined $NewName) { + if ($follow_skip < 2) { + die "$AbsName is a recursive symbolic link"; + } + else { + return undef; + } + } + else { + $AbsName= $NewName; + } + ($DEV, $INO) = lstat($AbsName); + return undef unless defined $DEV; # dangling symbolic link + } + + if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) { + if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) { + die "$AbsName encountered a second time"; + } + else { + return undef; + } + } + + return $AbsName; +} + +our($dir, $name, $fullname, $prune); +sub _find_dir_symlnk($$$); +sub _find_dir($$$); + +# check whether or not a scalar variable is tainted +# (code straight from the Camel, 3rd ed., page 561) +sub is_tainted_pp { + my $arg = shift; + my $nada = substr($arg, 0, 0); # zero-length + local $@; + eval { eval "# $nada" }; + return length($@) != 0; +} + +sub _find_opt { + my $wanted = shift; + return unless @_; + die "invalid top directory" unless defined $_[0]; + + # This function must local()ize everything because callbacks may + # call find() or finddepth() + + local %SLnkSeen; + local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, + $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, + $pre_process, $post_process, $dangling_symlinks); + local($dir, $name, $fullname, $prune); + local *_ = \my $a; + + my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd(); + if ($Is_VMS) { + # VMS returns this by default in VMS format which just doesn't + # work for the rest of this module. + $cwd = VMS::Filespec::unixpath($cwd); + + # Apparently this is not expected to have a trailing space. + # To attempt to make VMS/UNIX conversions mostly reversible, + # a trailing slash is needed. The run-time functions ignore the + # resulting double slash, but it causes the perl tests to fail. + $cwd =~ s#/\z##; + + # This comes up in upper case now, but should be lower. + # In the future this could be exact case, no need to change. + } + my $cwd_untainted = $cwd; + my $check_t_cwd = 1; + $wanted_callback = $wanted->{wanted}; + $bydepth = $wanted->{bydepth}; + $pre_process = $wanted->{preprocess}; + $post_process = $wanted->{postprocess}; + $no_chdir = $wanted->{no_chdir}; + $full_check = $Is_Win32 ? 0 : $wanted->{follow}; + $follow = $Is_Win32 ? 0 : + $full_check || $wanted->{follow_fast}; + $follow_skip = $wanted->{follow_skip}; + $untaint = $wanted->{untaint}; + $untaint_pat = $wanted->{untaint_pattern}; + $untaint_skip = $wanted->{untaint_skip}; + $dangling_symlinks = $wanted->{dangling_symlinks}; + + # for compatibility reasons (find.pl, find2perl) + local our ($topdir, $topdev, $topino, $topmode, $topnlink); + + # a symbolic link to a directory doesn't increase the link count + $avoid_nlink = $follow || $File::Find::dont_use_nlink; + + my ($abs_dir, $Is_Dir); + + Proc_Top_Item: + foreach my $TOP (@_) { + my $top_item = $TOP; + $top_item = VMS::Filespec::unixify($top_item) if $Is_VMS; + + ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item; + + if ($Is_Win32) { + $top_item =~ s|[/\\]\z|| + unless $top_item =~ m{^(?:\w:)?[/\\]$}; + } + else { + $top_item =~ s|/\z|| unless $top_item eq '/'; + } + + $Is_Dir= 0; + + if ($follow) { + + if (substr($top_item,0,1) eq '/') { + $abs_dir = $top_item; + } + elsif ($top_item eq $File::Find::current_dir) { + $abs_dir = $cwd; + } + else { # care about any ../ + $top_item =~ s/\.dir\z//i if $Is_VMS; + $abs_dir = contract_name("$cwd/",$top_item); + } + $abs_dir= Follow_SymLink($abs_dir); + unless (defined $abs_dir) { + if ($dangling_symlinks) { + if (ref $dangling_symlinks eq 'CODE') { + $dangling_symlinks->($top_item, $cwd); + } else { + warnings::warnif "$top_item is a dangling symbolic link\n"; + } + } + next Proc_Top_Item; + } + + if (-d _) { + $top_item =~ s/\.dir\z//i if $Is_VMS; + _find_dir_symlnk($wanted, $abs_dir, $top_item); + $Is_Dir= 1; + } + } + else { # no follow + $topdir = $top_item; + unless (defined $topnlink) { + warnings::warnif "Can't stat $top_item: $!\n"; + next Proc_Top_Item; + } + if (-d _) { + $top_item =~ s/\.dir\z//i if $Is_VMS; + _find_dir($wanted, $top_item, $topnlink); + $Is_Dir= 1; + } + else { + $abs_dir= $top_item; + } + } + + unless ($Is_Dir) { + unless (($_,$dir) = File::Basename::fileparse($abs_dir)) { + ($dir,$_) = ('./', $top_item); + } + + $abs_dir = $dir; + if (( $untaint ) && (is_tainted($dir) )) { + ( $abs_dir ) = $dir =~ m|$untaint_pat|; + unless (defined $abs_dir) { + if ($untaint_skip == 0) { + die "directory $dir is still tainted"; + } + else { + next Proc_Top_Item; + } + } + } + + unless ($no_chdir || chdir $abs_dir) { + warnings::warnif "Couldn't chdir $abs_dir: $!\n"; + next Proc_Top_Item; + } + + $name = $abs_dir . $_; # $File::Find::name + $_ = $name if $no_chdir; + + { $wanted_callback->() }; # protect against wild "next" + + } + + unless ( $no_chdir ) { + if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) { + ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|; + unless (defined $cwd_untainted) { + die "insecure cwd in find(depth)"; + } + $check_t_cwd = 0; + } + unless (chdir $cwd_untainted) { + die "Can't cd to $cwd: $!\n"; + } + } + } +} + +# API: +# $wanted +# $p_dir : "parent directory" +# $nlink : what came back from the stat +# preconditions: +# chdir (if not no_chdir) to dir + +sub _find_dir($$$) { + my ($wanted, $p_dir, $nlink) = @_; + my ($CdLvl,$Level) = (0,0); + my @Stack; + my @filenames; + my ($subcount,$sub_nlink); + my $SE= []; + my $dir_name= $p_dir; + my $dir_pref; + my $dir_rel = $File::Find::current_dir; + my $tainted = 0; + my $no_nlink; + + if ($Is_Win32) { + $dir_pref + = ($p_dir =~ m{^(?:\w:[/\\]?|[/\\])$} ? $p_dir : "$p_dir/" ); + } elsif ($Is_VMS) { + + # VMS is returning trailing .dir on directories + # and trailing . on files and symbolic links + # in UNIX syntax. + # + + $p_dir =~ s/\.(dir)?$//i unless $p_dir eq '.'; + + $dir_pref = ($p_dir =~ m/[\]>]+$/ ? $p_dir : "$p_dir/" ); + } + else { + $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" ); + } + + local ($dir, $name, $prune, *DIR); + + unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) { + my $udir = $p_dir; + if (( $untaint ) && (is_tainted($p_dir) )) { + ( $udir ) = $p_dir =~ m|$untaint_pat|; + unless (defined $udir) { + if ($untaint_skip == 0) { + die "directory $p_dir is still tainted"; + } + else { + return; + } + } + } + unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { + warnings::warnif "Can't cd to $udir: $!\n"; + return; + } + } + + # push the starting directory + push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; + + while (defined $SE) { + unless ($bydepth) { + $dir= $p_dir; # $File::Find::dir + $name= $dir_name; # $File::Find::name + $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ + # prune may happen here + $prune= 0; + { $wanted_callback->() }; # protect against wild "next" + next if $prune; + } + + # change to that directory + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + my $udir= $dir_rel; + if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) { + ( $udir ) = $dir_rel =~ m|$untaint_pat|; + unless (defined $udir) { + if ($untaint_skip == 0) { + die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted"; + } else { # $untaint_skip == 1 + next; + } + } + } + unless (chdir ($Is_VMS && $udir !~ /[\/\[<]+/ ? "./$udir" : $udir)) { + warnings::warnif "Can't cd to (" . + ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n"; + next; + } + $CdLvl++; + } + + $dir= $dir_name; # $File::Find::dir + + # Get the list of files in the current directory. + unless (opendir DIR, ($no_chdir ? $dir_name : $File::Find::current_dir)) { + warnings::warnif "Can't opendir($dir_name): $!\n"; + next; + } + @filenames = readdir DIR; + closedir(DIR); + @filenames = $pre_process->(@filenames) if $pre_process; + push @Stack,[$CdLvl,$dir_name,"",-2] if $post_process; + + # default: use whatever was specified + # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back) + $no_nlink = $avoid_nlink; + # if dir has wrong nlink count, force switch to slower stat method + $no_nlink = 1 if ($nlink < 2); + + if ($nlink == 2 && !$no_nlink) { + # This dir has no subdirectories. + for my $FN (@filenames) { + if ($Is_VMS) { + # Big hammer here - Compensate for VMS trailing . and .dir + # No win situation until this is changed, but this + # will handle the majority of the cases with breaking the fewest + + $FN =~ s/\.dir\z//i; + $FN =~ s#\.$## if ($FN ne '.'); + } + next if $FN =~ $File::Find::skip_pattern; + + $name = $dir_pref . $FN; # $File::Find::name + $_ = ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + + } + else { + # This dir has subdirectories. + $subcount = $nlink - 2; + + # HACK: insert directories at this position, so as to preserve + # the user pre-processed ordering of files (thus ensuring + # directory traversal is in user sorted order, not at random). + my $stack_top = @Stack; + + for my $FN (@filenames) { + next if $FN =~ $File::Find::skip_pattern; + if ($subcount > 0 || $no_nlink) { + # Seen all the subdirs? + # check for directoriness. + # stat is faster for a file in the current directory + $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3]; + + if (-d _) { + --$subcount; + $FN =~ s/\.dir\z//i if $Is_VMS; + # HACK: replace push to preserve dir traversal order + #push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink]; + splice @Stack, $stack_top, 0, + [$CdLvl,$dir_name,$FN,$sub_nlink]; + } + else { + $name = $dir_pref . $FN; # $File::Find::name + $_= ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + else { + $name = $dir_pref . $FN; # $File::Find::name + $_= ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + } + } + continue { + while ( defined ($SE = pop @Stack) ) { + ($Level, $p_dir, $dir_rel, $nlink) = @$SE; + if ($CdLvl > $Level && !$no_chdir) { + my $tmp; + if ($Is_VMS) { + $tmp = '[' . ('-' x ($CdLvl-$Level)) . ']'; + } + else { + $tmp = join('/',('..') x ($CdLvl-$Level)); + } + die "Can't cd to $tmp from $dir_name: $!" + unless chdir ($tmp); + $CdLvl = $Level; + } + + if ($Is_Win32) { + $dir_name = ($p_dir =~ m{^(?:\w:[/\\]?|[/\\])$} + ? "$p_dir$dir_rel" : "$p_dir/$dir_rel"); + $dir_pref = "$dir_name/"; + } + elsif ($^O eq 'VMS') { + if ($p_dir =~ m/[\]>]+$/) { + $dir_name = $p_dir; + $dir_name =~ s/([\]>]+)$/.$dir_rel$1/; + $dir_pref = $dir_name; + } + else { + $dir_name = "$p_dir/$dir_rel"; + $dir_pref = "$dir_name/"; + } + } + else { + $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); + $dir_pref = "$dir_name/"; + } + + if ( $nlink == -2 ) { + $name = $dir = $p_dir; # $File::Find::name / dir + $_ = $File::Find::current_dir; + $post_process->(); # End-of-directory processing + } + elsif ( $nlink < 0 ) { # must be finddepth, report dirname now + $name = $dir_name; + if ( substr($name,-2) eq '/.' ) { + substr($name, length($name) == 2 ? -1 : -2) = ''; + } + $dir = $p_dir; + $_ = ($no_chdir ? $dir_name : $dir_rel ); + if ( substr($_,-2) eq '/.' ) { + substr($_, length($_) == 2 ? -1 : -2) = ''; + } + { $wanted_callback->() }; # protect against wild "next" + } + else { + push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; + last; + } + } + } +} + + +# API: +# $wanted +# $dir_loc : absolute location of a dir +# $p_dir : "parent directory" +# preconditions: +# chdir (if not no_chdir) to dir + +sub _find_dir_symlnk($$$) { + my ($wanted, $dir_loc, $p_dir) = @_; # $dir_loc is the absolute directory + my @Stack; + my @filenames; + my $new_loc; + my $updir_loc = $dir_loc; # untainted parent directory + my $SE = []; + my $dir_name = $p_dir; + my $dir_pref; + my $loc_pref; + my $dir_rel = $File::Find::current_dir; + my $byd_flag; # flag for pending stack entry if $bydepth + my $tainted = 0; + my $ok = 1; + + $dir_pref = ( $p_dir eq '/' ? '/' : "$p_dir/" ); + $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" ); + + local ($dir, $name, $fullname, $prune, *DIR); + + unless ($no_chdir) { + # untaint the topdir + if (( $untaint ) && (is_tainted($dir_loc) )) { + ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted + # once untainted, $updir_loc is pushed on the stack (as parent directory); + # hence, we don't need to untaint the parent directory every time we chdir + # to it later + unless (defined $updir_loc) { + if ($untaint_skip == 0) { + die "directory $dir_loc is still tainted"; + } + else { + return; + } + } + } + $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir); + unless ($ok) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + return; + } + } + + push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1] if $bydepth; + + while (defined $SE) { + + unless ($bydepth) { + # change (back) to parent directory (always untainted) + unless ($no_chdir) { + unless (chdir $updir_loc) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + $dir= $p_dir; # $File::Find::dir + $name= $dir_name; # $File::Find::name + $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ + $fullname= $dir_loc; # $File::Find::fullname + # prune may happen here + $prune= 0; + lstat($_); # make sure file tests with '_' work + { $wanted_callback->() }; # protect against wild "next" + next if $prune; + } + + # change to that directory + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + $updir_loc = $dir_loc; + if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) { + # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir + ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; + unless (defined $updir_loc) { + if ($untaint_skip == 0) { + die "directory $dir_loc is still tainted"; + } + else { + next; + } + } + } + unless (chdir $updir_loc) { + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + + $dir = $dir_name; # $File::Find::dir + + # Get the list of files in the current directory. + unless (opendir DIR, ($no_chdir ? $dir_loc : $File::Find::current_dir)) { + warnings::warnif "Can't opendir($dir_loc): $!\n"; + next; + } + @filenames = readdir DIR; + closedir(DIR); + + for my $FN (@filenames) { + if ($Is_VMS) { + # Big hammer here - Compensate for VMS trailing . and .dir + # No win situation until this is changed, but this + # will handle the majority of the cases with breaking the fewest. + + $FN =~ s/\.dir\z//i; + $FN =~ s#\.$## if ($FN ne '.'); + } + next if $FN =~ $File::Find::skip_pattern; + + # follow symbolic links / do an lstat + $new_loc = Follow_SymLink($loc_pref.$FN); + + # ignore if invalid symlink + unless (defined $new_loc) { + if (!defined -l _ && $dangling_symlinks) { + $fullname = undef; + if (ref $dangling_symlinks eq 'CODE') { + $dangling_symlinks->($FN, $dir_pref); + } else { + warnings::warnif "$dir_pref$FN is a dangling symbolic link\n"; + } + } + else { + $fullname = $loc_pref . $FN; + } + $name = $dir_pref . $FN; + $_ = ($no_chdir ? $name : $FN); + { $wanted_callback->() }; + next; + } + + if (-d _) { + if ($Is_VMS) { + $FN =~ s/\.dir\z//i; + $FN =~ s#\.$## if ($FN ne '.'); + $new_loc =~ s/\.dir\z//i; + $new_loc =~ s#\.$## if ($new_loc ne '.'); + } + push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1]; + } + else { + $fullname = $new_loc; # $File::Find::fullname + $name = $dir_pref . $FN; # $File::Find::name + $_ = ($no_chdir ? $name : $FN); # $_ + { $wanted_callback->() }; # protect against wild "next" + } + } + + } + continue { + while (defined($SE = pop @Stack)) { + ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE; + $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); + $dir_pref = "$dir_name/"; + $loc_pref = "$dir_loc/"; + if ( $byd_flag < 0 ) { # must be finddepth, report dirname now + unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { + unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted + warnings::warnif "Can't cd to $updir_loc: $!\n"; + next; + } + } + $fullname = $dir_loc; # $File::Find::fullname + $name = $dir_name; # $File::Find::name + if ( substr($name,-2) eq '/.' ) { + substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name + } + $dir = $p_dir; # $File::Find::dir + $_ = ($no_chdir ? $dir_name : $dir_rel); # $_ + if ( substr($_,-2) eq '/.' ) { + substr($_, length($_) == 2 ? -1 : -2) = ''; + } + + lstat($_); # make sure file tests with '_' work + { $wanted_callback->() }; # protect against wild "next" + } + else { + push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1] if $bydepth; + last; + } + } + } +} + + +sub wrap_wanted { + my $wanted = shift; + if ( ref($wanted) eq 'HASH' ) { + # RT #122547 + my %valid_options = map {$_ => 1} qw( + wanted + bydepth + preprocess + postprocess + follow + follow_fast + follow_skip + dangling_symlinks + no_chdir + untaint + untaint_pattern + untaint_skip + ); + my @invalid_options = (); + for my $v (keys %{$wanted}) { + push @invalid_options, $v unless exists $valid_options{$v}; + } + warn "Invalid option(s): @invalid_options" if @invalid_options; + + unless( exists $wanted->{wanted} and ref( $wanted->{wanted} ) eq 'CODE' ) { + die 'no &wanted subroutine given'; + } + if ( $wanted->{follow} || $wanted->{follow_fast}) { + $wanted->{follow_skip} = 1 unless defined $wanted->{follow_skip}; + } + if ( $wanted->{untaint} ) { + $wanted->{untaint_pattern} = $File::Find::untaint_pattern + unless defined $wanted->{untaint_pattern}; + $wanted->{untaint_skip} = 0 unless defined $wanted->{untaint_skip}; + } + return $wanted; + } + elsif( ref( $wanted ) eq 'CODE' ) { + return { wanted => $wanted }; + } + else { + die 'no &wanted subroutine given'; + } +} + +sub find { + my $wanted = shift; + _find_opt(wrap_wanted($wanted), @_); +} + +sub finddepth { + my $wanted = wrap_wanted(shift); + $wanted->{bydepth} = 1; + _find_opt($wanted, @_); +} + +# default +$File::Find::skip_pattern = qr/^\.{1,2}\z/; +$File::Find::untaint_pattern = qr|^([-+@\w./]+)$|; + +# These are hard-coded for now, but may move to hint files. +if ($^O eq 'VMS') { + $Is_VMS = 1; + $File::Find::dont_use_nlink = 1; +} +elsif ($^O eq 'MSWin32') { + $Is_Win32 = 1; +} + +# this _should_ work properly on all platforms +# where File::Find can be expected to work +$File::Find::current_dir = File::Spec->curdir || '.'; + +$File::Find::dont_use_nlink = 1 + if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos' || $Is_Win32 || + $^O eq 'interix' || $^O eq 'cygwin' || $^O eq 'qnx' || $^O eq 'nto'; + +# Set dont_use_nlink in your hint file if your system's stat doesn't +# report the number of links in a directory as an indication +# of the number of files. +# See e.g. hints/haiku.sh for Haiku. +unless ($File::Find::dont_use_nlink) { + require Config; + $File::Find::dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'}); +} + +# We need a function that checks if a scalar is tainted. Either use the +# Scalar::Util module's tainted() function or our (slower) pure Perl +# fallback is_tainted_pp() +{ + local $@; + eval { require Scalar::Util }; + *is_tainted = $@ ? \&is_tainted_pp : \&Scalar::Util::tainted; +} + +1; + +__END__ + +package File::Compare; + +use 5.006; +use strict; +use warnings; +our($VERSION, @ISA, @EXPORT, @EXPORT_OK, $Too_Big); + +require Exporter; + +$VERSION = '1.1006'; +@ISA = qw(Exporter); +@EXPORT = qw(compare); +@EXPORT_OK = qw(cmp compare_text); + +$Too_Big = 1024 * 1024 * 2; + +sub croak { + require Carp; + goto &Carp::croak; +} + +sub compare { + croak("Usage: compare( file1, file2 [, buffersize]) ") + unless(@_ == 2 || @_ == 3); + + my ($from,$to,$size) = @_; + my $text_mode = defined($size) && (ref($size) eq 'CODE' || $size < 0); + + my ($fromsize,$closefrom,$closeto); + local (*FROM, *TO); + + croak("from undefined") unless (defined $from); + croak("to undefined") unless (defined $to); + + if (ref($from) && + (UNIVERSAL::isa($from,'GLOB') || UNIVERSAL::isa($from,'IO::Handle'))) { + *FROM = *$from; + } elsif (ref(\$from) eq 'GLOB') { + *FROM = $from; + } else { + open(FROM,"<",$from) or goto fail_open1; + unless ($text_mode) { + binmode FROM; + $fromsize = -s FROM; + } + $closefrom = 1; + } + + if (ref($to) && + (UNIVERSAL::isa($to,'GLOB') || UNIVERSAL::isa($to,'IO::Handle'))) { + *TO = *$to; + } elsif (ref(\$to) eq 'GLOB') { + *TO = $to; + } else { + open(TO,"<",$to) or goto fail_open2; + binmode TO unless $text_mode; + $closeto = 1; + } + + if (!$text_mode && $closefrom && $closeto) { + # If both are opened files we know they differ if their size differ + goto fail_inner if $fromsize != -s TO; + } + + if ($text_mode) { + local $/ = "\n"; + my ($fline,$tline); + while (defined($fline = <FROM>)) { + goto fail_inner unless defined($tline = <TO>); + if (ref $size) { + # $size contains ref to comparison function + goto fail_inner if &$size($fline, $tline); + } else { + goto fail_inner if $fline ne $tline; + } + } + goto fail_inner if defined($tline = <TO>); + } + else { + unless (defined($size) && $size > 0) { + $size = $fromsize || -s TO || 0; + $size = 1024 if $size < 512; + $size = $Too_Big if $size > $Too_Big; + } + + my ($fr,$tr,$fbuf,$tbuf); + $fbuf = $tbuf = ''; + while(defined($fr = read(FROM,$fbuf,$size)) && $fr > 0) { + unless (defined($tr = read(TO,$tbuf,$fr)) && $tbuf eq $fbuf) { + goto fail_inner; + } + } + goto fail_inner if defined($tr = read(TO,$tbuf,$size)) && $tr > 0; + } + + close(TO) || goto fail_open2 if $closeto; + close(FROM) || goto fail_open1 if $closefrom; + + return 0; + + # All of these contortions try to preserve error messages... + fail_inner: + close(TO) || goto fail_open2 if $closeto; + close(FROM) || goto fail_open1 if $closefrom; + + return 1; + + fail_open2: + if ($closefrom) { + my $status = $!; + $! = 0; + close FROM; + $! = $status unless $!; + } + fail_open1: + return -1; +} + +sub cmp; +*cmp = \&compare; + +sub compare_text { + my ($from,$to,$cmp) = @_; + croak("Usage: compare_text( file1, file2 [, cmp-function])") + unless @_ == 2 || @_ == 3; + croak("Third arg to compare_text() function must be a code reference") + if @_ == 3 && ref($cmp) ne 'CODE'; + + # Using a negative buffer size puts compare into text_mode too + $cmp = -1 unless defined $cmp; + compare($from, $to, $cmp); +} + +1; + +__END__ + + +package File::stat; +use 5.006; + +use strict; +use warnings; +use warnings::register; +use Carp; + +BEGIN { *warnif = \&warnings::warnif } + +our(@EXPORT, @EXPORT_OK, %EXPORT_TAGS); + +our $VERSION = '1.08'; + +our @fields; +our ( $st_dev, $st_ino, $st_mode, + $st_nlink, $st_uid, $st_gid, + $st_rdev, $st_size, + $st_atime, $st_mtime, $st_ctime, + $st_blksize, $st_blocks +); + +BEGIN { + use Exporter (); + @EXPORT = qw(stat lstat); + @fields = qw( $st_dev $st_ino $st_mode + $st_nlink $st_uid $st_gid + $st_rdev $st_size + $st_atime $st_mtime $st_ctime + $st_blksize $st_blocks + ); + @EXPORT_OK = ( @fields, "stat_cando" ); + %EXPORT_TAGS = ( FIELDS => [ @fields, @EXPORT ] ); +} + +use Fcntl qw(S_IRUSR S_IWUSR S_IXUSR); + +BEGIN { + # These constants will croak on use if the platform doesn't define + # them. It's important to avoid inflicting that on the user. + no strict 'refs'; + for (qw(suid sgid svtx)) { + my $val = eval { &{"Fcntl::S_I\U$_"} }; + *{"_$_"} = defined $val ? sub { $_[0] & $val ? 1 : "" } : sub { "" }; + } + for (qw(SOCK CHR BLK REG DIR LNK)) { + *{"S_IS$_"} = defined eval { &{"Fcntl::S_IF$_"} } + ? \&{"Fcntl::S_IS$_"} : sub { "" }; + } + # FIFO flag and macro don't quite follow the S_IF/S_IS pattern above + # RT #111638 + *{"S_ISFIFO"} = defined &Fcntl::S_IFIFO + ? \&Fcntl::S_ISFIFO : sub { "" }; +} + +# from doio.c +sub _ingroup { + my ($gid, $eff) = @_; + + # I am assuming that since VMS doesn't have getgroups(2), $) will + # always only contain a single entry. + $^O eq "VMS" and return $_[0] == $); + + my ($egid, @supp) = split " ", $); + my ($rgid) = split " ", $(; + + $gid == ($eff ? $egid : $rgid) and return 1; + grep $gid == $_, @supp and return 1; + + return ""; +} + +# VMS uses the Unix version of the routine, even though this is very +# suboptimal. VMS has a permissions structure that doesn't really fit +# into struct stat, and unlike on Win32 the normal -X operators respect +# that, but unfortunately by the time we get here we've already lost the +# information we need. It looks to me as though if we were to preserve +# the st_devnam entry of vmsish.h's fake struct stat (which actually +# holds the filename) it might be possible to do this right, but both +# getting that value out of the struct (perl's stat doesn't return it) +# and interpreting it later would require this module to have an XS +# component (at which point we might as well just call Perl_cando and +# have done with it). + +if (grep $^O eq $_, qw/os2 MSWin32 dos/) { + + # from doio.c + *cando = sub { ($_[0][2] & $_[1]) ? 1 : "" }; +} +else { + + # from doio.c + *cando = sub { + my ($s, $mode, $eff) = @_; + my $uid = $eff ? $> : $<; + my ($stmode, $stuid, $stgid) = @$s[2,4,5]; + + # This code basically assumes that the rwx bits of the mode are + # the 0777 bits, but so does Perl_cando. + + if ($uid == 0 && $^O ne "VMS") { + # If we're root on unix + # not testing for executable status => all file tests are true + return 1 if !($mode & 0111); + # testing for executable status => + # for a file, any x bit will do + # for a directory, always true + return 1 if $stmode & 0111 || S_ISDIR($stmode); + return ""; + } + + if ($stuid == $uid) { + $stmode & $mode and return 1; + } + elsif (_ingroup($stgid, $eff)) { + $stmode & ($mode >> 3) and return 1; + } + else { + $stmode & ($mode >> 6) and return 1; + } + return ""; + }; +} + +# alias for those who don't like objects +*stat_cando = \&cando; + +my %op = ( + r => sub { cando($_[0], S_IRUSR, 1) }, + w => sub { cando($_[0], S_IWUSR, 1) }, + x => sub { cando($_[0], S_IXUSR, 1) }, + o => sub { $_[0][4] == $> }, + + R => sub { cando($_[0], S_IRUSR, 0) }, + W => sub { cando($_[0], S_IWUSR, 0) }, + X => sub { cando($_[0], S_IXUSR, 0) }, + O => sub { $_[0][4] == $< }, + + e => sub { 1 }, + z => sub { $_[0][7] == 0 }, + s => sub { $_[0][7] }, + + f => sub { S_ISREG ($_[0][2]) }, + d => sub { S_ISDIR ($_[0][2]) }, + l => sub { S_ISLNK ($_[0][2]) }, + p => sub { S_ISFIFO($_[0][2]) }, + S => sub { S_ISSOCK($_[0][2]) }, + b => sub { S_ISBLK ($_[0][2]) }, + c => sub { S_ISCHR ($_[0][2]) }, + + u => sub { _suid($_[0][2]) }, + g => sub { _sgid($_[0][2]) }, + k => sub { _svtx($_[0][2]) }, + + M => sub { ($^T - $_[0][9] ) / 86400 }, + C => sub { ($^T - $_[0][10]) / 86400 }, + A => sub { ($^T - $_[0][8] ) / 86400 }, +); + +use constant HINT_FILETEST_ACCESS => 0x00400000; + +# we need fallback=>1 or stringifying breaks +use overload + fallback => 1, + -X => sub { + my ($s, $op) = @_; + + if (index("rwxRWX", $op) >= 0) { + (caller 0)[8] & HINT_FILETEST_ACCESS + and warnif("File::stat ignores use filetest 'access'"); + + $^O eq "VMS" and warnif("File::stat ignores VMS ACLs"); + + # It would be nice to have a warning about using -l on a + # non-lstat, but that would require an extra member in the + # object. + } + + if ($op{$op}) { + return $op{$op}->($_[0]); + } + else { + croak "-$op is not implemented on a File::stat object"; + } + }; + +# Class::Struct forbids use of @ISA +sub import { goto &Exporter::import } + +use Class::Struct qw(struct); +struct 'File::stat' => [ + map { $_ => '$' } qw{ + dev ino mode nlink uid gid rdev size + atime mtime ctime blksize blocks + } +]; + +sub populate (@) { + return unless @_; + my $stob = new(); + @$stob = ( + $st_dev, $st_ino, $st_mode, $st_nlink, $st_uid, $st_gid, $st_rdev, + $st_size, $st_atime, $st_mtime, $st_ctime, $st_blksize, $st_blocks ) + = @_; + return $stob; +} + +sub lstat ($) { populate(CORE::lstat(shift)) } + +sub stat ($) { + my $arg = shift; + my $st = populate(CORE::stat $arg); + return $st if defined $st; + my $fh; + { + local $!; + no strict 'refs'; + require Symbol; + $fh = \*{ Symbol::qualify( $arg, caller() )}; + return unless defined fileno $fh; + } + return populate(CORE::stat $fh); +} + +1; +__END__ + + + +package File::Basename; + +# File::Basename is used during the Perl build, when the re extension may +# not be available, but we only actually need it if running under tainting. +BEGIN { + if (${^TAINT}) { + require re; + re->import('taint'); + } +} + + +use strict; +use 5.006; +use warnings; +our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase); +require Exporter; +@ISA = qw(Exporter); +@EXPORT = qw(fileparse fileparse_set_fstype basename dirname); +$VERSION = "2.85"; + +fileparse_set_fstype($^O); + + + + +sub fileparse { + my($fullname,@suffices) = @_; + + unless (defined $fullname) { + require Carp; + Carp::croak("fileparse(): need a valid pathname"); + } + + my $orig_type = ''; + my($type,$igncase) = ($Fileparse_fstype, $Fileparse_igncase); + + my($taint) = substr($fullname,0,0); # Is $fullname tainted? + + if ($type eq "VMS" and $fullname =~ m{/} ) { + # We're doing Unix emulation + $orig_type = $type; + $type = 'Unix'; + } + + my($dirpath, $basename); + + if (grep { $type eq $_ } qw(MSDOS DOS MSWin32 Epoc)) { + ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s); + $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/; + } + elsif ($type eq "OS2") { + ($dirpath,$basename) = ($fullname =~ m#^((?:.*[:\\/])?)(.*)#s); + $dirpath = './' unless $dirpath; # Can't be 0 + $dirpath .= '/' unless $dirpath =~ m#[\\/]\z#; + } + elsif ($type eq "MacOS") { + ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s); + $dirpath = ':' unless $dirpath; + } + elsif ($type eq "AmigaOS") { + ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s); + $dirpath = './' unless $dirpath; + } + elsif ($type eq 'VMS' ) { + ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/s); + $dirpath ||= ''; # should always be defined + } + else { # Default to Unix semantics. + ($dirpath,$basename) = ($fullname =~ m{^(.*/)?(.*)}s); + if ($orig_type eq 'VMS' and $fullname =~ m{^(/[^/]+/000000(/|$))(.*)}) { + # dev:[000000] is top of VMS tree, similar to Unix '/' + # so strip it off and treat the rest as "normal" + my $devspec = $1; + my $remainder = $3; + ($dirpath,$basename) = ($remainder =~ m{^(.*/)?(.*)}s); + $dirpath ||= ''; # should always be defined + $dirpath = $devspec.$dirpath; + } + $dirpath = './' unless $dirpath; + } + + + my $tail = ''; + my $suffix = ''; + if (@suffices) { + foreach $suffix (@suffices) { + my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$"; + if ($basename =~ s/$pat//s) { + $taint .= substr($suffix,0,0); + $tail = $1 . $tail; + } + } + } + + # Ensure taint is propagated from the path to its pieces. + $tail .= $taint; + wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail) + : ($basename .= $taint); +} + + + + + +sub basename { + my($path) = shift; + + # From BSD basename(1) + # The basename utility deletes any prefix ending with the last slash '/' + # character present in string (after first stripping trailing slashes) + _strip_trailing_sep($path); + + my($basename, $dirname, $suffix) = fileparse( $path, map("\Q$_\E",@_) ); + + # From BSD basename(1) + # The suffix is not stripped if it is identical to the remaining + # characters in string. + if( length $suffix and !length $basename ) { + $basename = $suffix; + } + + # Ensure that basename '/' == '/' + if( !length $basename ) { + $basename = $dirname; + } + + return $basename; +} + + + + + +sub dirname { + my $path = shift; + + my($type) = $Fileparse_fstype; + + if( $type eq 'VMS' and $path =~ m{/} ) { + # Parse as Unix + local($File::Basename::Fileparse_fstype) = ''; + return dirname($path); + } + + my($basename, $dirname) = fileparse($path); + + if ($type eq 'VMS') { + $dirname ||= $ENV{DEFAULT}; + } + elsif ($type eq 'MacOS') { + if( !length($basename) && $dirname !~ /^[^:]+:\z/) { + _strip_trailing_sep($dirname); + ($basename,$dirname) = fileparse $dirname; + } + $dirname .= ":" unless $dirname =~ /:\z/; + } + elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { + _strip_trailing_sep($dirname); + unless( length($basename) ) { + ($basename,$dirname) = fileparse $dirname; + _strip_trailing_sep($dirname); + } + } + elsif ($type eq 'AmigaOS') { + if ( $dirname =~ /:\z/) { return $dirname } + chop $dirname; + $dirname =~ s{[^:/]+\z}{} unless length($basename); + } + else { + _strip_trailing_sep($dirname); + unless( length($basename) ) { + ($basename,$dirname) = fileparse $dirname; + _strip_trailing_sep($dirname); + } + } + + $dirname; +} + + +# Strip the trailing path separator. +sub _strip_trailing_sep { + my $type = $Fileparse_fstype; + + if ($type eq 'MacOS') { + $_[0] =~ s/([^:]):\z/$1/s; + } + elsif (grep { $type eq $_ } qw(MSDOS DOS MSWin32 OS2)) { + $_[0] =~ s/([^:])[\\\/]*\z/$1/; + } + else { + $_[0] =~ s{(.)/*\z}{$1}s; + } +} + + + + +BEGIN { + +my @Ignore_Case = qw(MacOS VMS AmigaOS OS2 RISCOS MSWin32 MSDOS DOS Epoc); +my @Types = (@Ignore_Case, qw(Unix)); + +sub fileparse_set_fstype { + my $old = $Fileparse_fstype; + + if (@_) { + my $new_type = shift; + + $Fileparse_fstype = 'Unix'; # default + foreach my $type (@Types) { + $Fileparse_fstype = $type if $new_type =~ /^$type/i; + } + + $Fileparse_igncase = + (grep $Fileparse_fstype eq $_, @Ignore_Case) ? 1 : 0; + } + + return $old; +} + +} + + +1; + + +package File::Temp; +# ABSTRACT: return name and handle of a temporary file safely +our $VERSION = '0.2304'; # VERSION + + +# Toolchain targets v5.8.1, but we'll try to support back to v5.6 anyway. +# It might be possible to make this v5.5, but many v5.6isms are creeping +# into the code and tests. +use 5.006; +use strict; +use Carp; +use File::Spec 0.8; +use Cwd (); +use File::Path 2.06 qw/ rmtree /; +use Fcntl 1.03; +use IO::Seekable; # For SEEK_* +use Errno; +use Scalar::Util 'refaddr'; +require VMS::Stdio if $^O eq 'VMS'; + +# pre-emptively load Carp::Heavy. If we don't when we run out of file +# handles and attempt to call croak() we get an error message telling +# us that Carp::Heavy won't load rather than an error telling us we +# have run out of file handles. We either preload croak() or we +# switch the calls to croak from _gettemp() to use die. +eval { require Carp::Heavy; }; + +# Need the Symbol package if we are running older perl +require Symbol if $] < 5.006; + +### For the OO interface +use parent 0.221 qw/ IO::Handle IO::Seekable /; +use overload '""' => "STRINGIFY", '0+' => "NUMIFY", + fallback => 1; + +# use 'our' on v5.6.0 +use vars qw(@EXPORT_OK %EXPORT_TAGS $DEBUG $KEEP_ALL); + +$DEBUG = 0; +$KEEP_ALL = 0; + +# We are exporting functions + +use Exporter 5.57 'import'; # 5.57 lets us import 'import' + +# Export list - to allow fine tuning of export table + +@EXPORT_OK = qw{ + tempfile + tempdir + tmpnam + tmpfile + mktemp + mkstemp + mkstemps + mkdtemp + unlink0 + cleanup + SEEK_SET + SEEK_CUR + SEEK_END + }; + +# Groups of functions for export + +%EXPORT_TAGS = ( + 'POSIX' => [qw/ tmpnam tmpfile /], + 'mktemp' => [qw/ mktemp mkstemp mkstemps mkdtemp/], + 'seekable' => [qw/ SEEK_SET SEEK_CUR SEEK_END /], + ); + +# add contents of these tags to @EXPORT +Exporter::export_tags('POSIX','mktemp','seekable'); + +# This is a list of characters that can be used in random filenames + +my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z + a b c d e f g h i j k l m n o p q r s t u v w x y z + 0 1 2 3 4 5 6 7 8 9 _ + /); + +# Maximum number of tries to make a temp file before failing + +use constant MAX_TRIES => 1000; + +# Minimum number of X characters that should be in a template +use constant MINX => 4; + +# Default template when no template supplied + +use constant TEMPXXX => 'X' x 10; + +# Constants for the security level + +use constant STANDARD => 0; +use constant MEDIUM => 1; +use constant HIGH => 2; + +# OPENFLAGS. If we defined the flag to use with Sysopen here this gives +# us an optimisation when many temporary files are requested + +my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR; +my $LOCKFLAG; + +unless ($^O eq 'MacOS') { + for my $oflag (qw/ NOFOLLOW BINARY LARGEFILE NOINHERIT /) { + my ($bit, $func) = (0, "Fcntl::O_" . $oflag); + no strict 'refs'; + $OPENFLAGS |= $bit if eval { + # Make sure that redefined die handlers do not cause problems + # e.g. CGI::Carp + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + $bit = &$func(); + 1; + }; + } + # Special case O_EXLOCK + $LOCKFLAG = eval { + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + &Fcntl::O_EXLOCK(); + }; +} + +# On some systems the O_TEMPORARY flag can be used to tell the OS +# to automatically remove the file when it is closed. This is fine +# in most cases but not if tempfile is called with UNLINK=>0 and +# the filename is requested -- in the case where the filename is to +# be passed to another routine. This happens on windows. We overcome +# this by using a second open flags variable + +my $OPENTEMPFLAGS = $OPENFLAGS; +unless ($^O eq 'MacOS') { + for my $oflag (qw/ TEMPORARY /) { + my ($bit, $func) = (0, "Fcntl::O_" . $oflag); + local($@); + no strict 'refs'; + $OPENTEMPFLAGS |= $bit if eval { + # Make sure that redefined die handlers do not cause problems + # e.g. CGI::Carp + local $SIG{__DIE__} = sub {}; + local $SIG{__WARN__} = sub {}; + $bit = &$func(); + 1; + }; + } +} + +# Private hash tracking which files have been created by each process id via the OO interface +my %FILES_CREATED_BY_OBJECT; + +# INTERNAL ROUTINES - not to be used outside of package + +# Generic routine for getting a temporary filename +# modelled on OpenBSD _gettemp() in mktemp.c + +# The template must contain X's that are to be replaced +# with the random values + +# Arguments: + +# TEMPLATE - string containing the XXXXX's that is converted +# to a random filename and opened if required + +# Optionally, a hash can also be supplied containing specific options +# "open" => if true open the temp file, else just return the name +# default is 0 +# "mkdir"=> if true, we are creating a temp directory rather than tempfile +# default is 0 +# "suffixlen" => number of characters at end of PATH to be ignored. +# default is 0. +# "unlink_on_close" => indicates that, if possible, the OS should remove +# the file as soon as it is closed. Usually indicates +# use of the O_TEMPORARY flag to sysopen. +# Usually irrelevant on unix +# "use_exlock" => Indicates that O_EXLOCK should be used. Default is true. + +# Optionally a reference to a scalar can be passed into the function +# On error this will be used to store the reason for the error +# "ErrStr" => \$errstr + +# "open" and "mkdir" can not both be true +# "unlink_on_close" is not used when "mkdir" is true. + +# The default options are equivalent to mktemp(). + +# Returns: +# filehandle - open file handle (if called with doopen=1, else undef) +# temp name - name of the temp file or directory + +# For example: +# ($fh, $name) = _gettemp($template, "open" => 1); + +# for the current version, failures are associated with +# stored in an error string and returned to give the reason whilst debugging +# This routine is not called by any external function +sub _gettemp { + + croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);' + unless scalar(@_) >= 1; + + # the internal error string - expect it to be overridden + # Need this in case the caller decides not to supply us a value + # need an anonymous scalar + my $tempErrStr; + + # Default options + my %options = ( + "open" => 0, + "mkdir" => 0, + "suffixlen" => 0, + "unlink_on_close" => 0, + "use_exlock" => 1, + "ErrStr" => \$tempErrStr, + ); + + # Read the template + my $template = shift; + if (ref($template)) { + # Use a warning here since we have not yet merged ErrStr + carp "File::Temp::_gettemp: template must not be a reference"; + return (); + } + + # Check that the number of entries on stack are even + if (scalar(@_) % 2 != 0) { + # Use a warning here since we have not yet merged ErrStr + carp "File::Temp::_gettemp: Must have even number of options"; + return (); + } + + # Read the options and merge with defaults + %options = (%options, @_) if @_; + + # Make sure the error string is set to undef + ${$options{ErrStr}} = undef; + + # Can not open the file and make a directory in a single call + if ($options{"open"} && $options{"mkdir"}) { + ${$options{ErrStr}} = "doopen and domkdir can not both be true\n"; + return (); + } + + # Find the start of the end of the Xs (position of last X) + # Substr starts from 0 + my $start = length($template) - 1 - $options{"suffixlen"}; + + # Check that we have at least MINX x X (e.g. 'XXXX") at the end of the string + # (taking suffixlen into account). Any fewer is insecure. + + # Do it using substr - no reason to use a pattern match since + # we know where we are looking and what we are looking for + + if (substr($template, $start - MINX + 1, MINX) ne 'X' x MINX) { + ${$options{ErrStr}} = "The template must end with at least ". + MINX . " 'X' characters\n"; + return (); + } + + # Replace all the X at the end of the substring with a + # random character or just all the XX at the end of a full string. + # Do it as an if, since the suffix adjusts which section to replace + # and suffixlen=0 returns nothing if used in the substr directly + # and generate a full path from the template + + my $path = _replace_XX($template, $options{"suffixlen"}); + + + # Split the path into constituent parts - eventually we need to check + # whether the directory exists + # We need to know whether we are making a temp directory + # or a tempfile + + my ($volume, $directories, $file); + my $parent; # parent directory + if ($options{"mkdir"}) { + # There is no filename at the end + ($volume, $directories, $file) = File::Spec->splitpath( $path, 1); + + # The parent is then $directories without the last directory + # Split the directory and put it back together again + my @dirs = File::Spec->splitdir($directories); + + # If @dirs only has one entry (i.e. the directory template) that means + # we are in the current directory + if ($#dirs == 0) { + $parent = File::Spec->curdir; + } else { + + if ($^O eq 'VMS') { # need volume to avoid relative dir spec + $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]); + $parent = 'sys$disk:[]' if $parent eq ''; + } else { + + # Put it back together without the last one + $parent = File::Spec->catdir(@dirs[0..$#dirs-1]); + + # ...and attach the volume (no filename) + $parent = File::Spec->catpath($volume, $parent, ''); + } + + } + + } else { + + # Get rid of the last filename (use File::Basename for this?) + ($volume, $directories, $file) = File::Spec->splitpath( $path ); + + # Join up without the file part + $parent = File::Spec->catpath($volume,$directories,''); + + # If $parent is empty replace with curdir + $parent = File::Spec->curdir + unless $directories ne ''; + + } + + # Check that the parent directories exist + # Do this even for the case where we are simply returning a name + # not a file -- no point returning a name that includes a directory + # that does not exist or is not writable + + unless (-e $parent) { + ${$options{ErrStr}} = "Parent directory ($parent) does not exist"; + return (); + } + unless (-d $parent) { + ${$options{ErrStr}} = "Parent directory ($parent) is not a directory"; + return (); + } + + # Check the stickiness of the directory and chown giveaway if required + # If the directory is world writable the sticky bit + # must be set + + if (File::Temp->safe_level == MEDIUM) { + my $safeerr; + unless (_is_safe($parent,\$safeerr)) { + ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; + return (); + } + } elsif (File::Temp->safe_level == HIGH) { + my $safeerr; + unless (_is_verysafe($parent, \$safeerr)) { + ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; + return (); + } + } + + + # Now try MAX_TRIES time to open the file + for (my $i = 0; $i < MAX_TRIES; $i++) { + + # Try to open the file if requested + if ($options{"open"}) { + my $fh; + + # If we are running before perl5.6.0 we can not auto-vivify + if ($] < 5.006) { + $fh = &Symbol::gensym; + } + + # Try to make sure this will be marked close-on-exec + # XXX: Win32 doesn't respect this, nor the proper fcntl, + # but may have O_NOINHERIT. This may or may not be in Fcntl. + local $^F = 2; + + # Attempt to open the file + my $open_success = undef; + if ( $^O eq 'VMS' and $options{"unlink_on_close"} && !$KEEP_ALL) { + # make it auto delete on close by setting FAB$V_DLT bit + $fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt'); + $open_success = $fh; + } else { + my $flags = ( ($options{"unlink_on_close"} && !$KEEP_ALL) ? + $OPENTEMPFLAGS : + $OPENFLAGS ); + $flags |= $LOCKFLAG if (defined $LOCKFLAG && $options{use_exlock}); + $open_success = sysopen($fh, $path, $flags, 0600); + } + if ( $open_success ) { + + # in case of odd umask force rw + chmod(0600, $path); + + # Opened successfully - return file handle and name + return ($fh, $path); + + } else { + + # Error opening file - abort with error + # if the reason was anything but EEXIST + unless ($!{EEXIST}) { + ${$options{ErrStr}} = "Could not create temp file $path: $!"; + return (); + } + + # Loop round for another try + + } + } elsif ($options{"mkdir"}) { + + # Open the temp directory + if (mkdir( $path, 0700)) { + # in case of odd umask + chmod(0700, $path); + + return undef, $path; + } else { + + # Abort with error if the reason for failure was anything + # except EEXIST + unless ($!{EEXIST}) { + ${$options{ErrStr}} = "Could not create directory $path: $!"; + return (); + } + + # Loop round for another try + + } + + } else { + + # Return true if the file can not be found + # Directory has been checked previously + + return (undef, $path) unless -e $path; + + # Try again until MAX_TRIES + + } + + # Did not successfully open the tempfile/dir + # so try again with a different set of random letters + # No point in trying to increment unless we have only + # 1 X say and the randomness could come up with the same + # file MAX_TRIES in a row. + + # Store current attempt - in principal this implies that the + # 3rd time around the open attempt that the first temp file + # name could be generated again. Probably should store each + # attempt and make sure that none are repeated + + my $original = $path; + my $counter = 0; # Stop infinite loop + my $MAX_GUESS = 50; + + do { + + # Generate new name from original template + $path = _replace_XX($template, $options{"suffixlen"}); + + $counter++; + + } until ($path ne $original || $counter > $MAX_GUESS); + + # Check for out of control looping + if ($counter > $MAX_GUESS) { + ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)"; + return (); + } + + } + + # If we get here, we have run out of tries + ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts (" + . MAX_TRIES . ") to open temp file/dir"; + + return (); + +} + +# Internal routine to replace the XXXX... with random characters +# This has to be done by _gettemp() every time it fails to +# open a temp file/dir + +# Arguments: $template (the template with XXX), +# $ignore (number of characters at end to ignore) + +# Returns: modified template + +sub _replace_XX { + + croak 'Usage: _replace_XX($template, $ignore)' + unless scalar(@_) == 2; + + my ($path, $ignore) = @_; + + # Do it as an if, since the suffix adjusts which section to replace + # and suffixlen=0 returns nothing if used in the substr directly + # Alternatively, could simply set $ignore to length($path)-1 + # Don't want to always use substr when not required though. + my $end = ( $] >= 5.006 ? "\\z" : "\\Z" ); + + if ($ignore) { + substr($path, 0, - $ignore) =~ s/X(?=X*$end)/$CHARS[ int( rand( @CHARS ) ) ]/ge; + } else { + $path =~ s/X(?=X*$end)/$CHARS[ int( rand( @CHARS ) ) ]/ge; + } + return $path; +} + +# Internal routine to force a temp file to be writable after +# it is created so that we can unlink it. Windows seems to occasionally +# force a file to be readonly when written to certain temp locations +sub _force_writable { + my $file = shift; + chmod 0600, $file; +} + + +# internal routine to check to see if the directory is safe +# First checks to see if the directory is not owned by the +# current user or root. Then checks to see if anyone else +# can write to the directory and if so, checks to see if +# it has the sticky bit set + +# Will not work on systems that do not support sticky bit + +#Args: directory path to check +# Optionally: reference to scalar to contain error message +# Returns true if the path is safe and false otherwise. +# Returns undef if can not even run stat() on the path + +# This routine based on version written by Tom Christiansen + +# Presumably, by the time we actually attempt to create the +# file or directory in this directory, it may not be safe +# anymore... Have to run _is_safe directly after the open. + +sub _is_safe { + + my $path = shift; + my $err_ref = shift; + + # Stat path + my @info = stat($path); + unless (scalar(@info)) { + $$err_ref = "stat(path) returned no values"; + return 0; + } + ; + return 1 if $^O eq 'VMS'; # owner delete control at file level + + # Check to see whether owner is neither superuser (or a system uid) nor me + # Use the effective uid from the $> variable + # UID is in [4] + if ($info[4] > File::Temp->top_system_uid() && $info[4] != $>) { + + Carp::cluck(sprintf "uid=$info[4] topuid=%s euid=$> path='$path'", + File::Temp->top_system_uid()); + + $$err_ref = "Directory owned neither by root nor the current user" + if ref($err_ref); + return 0; + } + + # check whether group or other can write file + # use 066 to detect either reading or writing + # use 022 to check writability + # Do it with S_IWOTH and S_IWGRP for portability (maybe) + # mode is in info[2] + if (($info[2] & &Fcntl::S_IWGRP) || # Is group writable? + ($info[2] & &Fcntl::S_IWOTH) ) { # Is world writable? + # Must be a directory + unless (-d $path) { + $$err_ref = "Path ($path) is not a directory" + if ref($err_ref); + return 0; + } + # Must have sticky bit set + unless (-k $path) { + $$err_ref = "Sticky bit not set on $path when dir is group|world writable" + if ref($err_ref); + return 0; + } + } + + return 1; +} + +# Internal routine to check whether a directory is safe +# for temp files. Safer than _is_safe since it checks for +# the possibility of chown giveaway and if that is a possibility +# checks each directory in the path to see if it is safe (with _is_safe) + +# If _PC_CHOWN_RESTRICTED is not set, does the full test of each +# directory anyway. + +# Takes optional second arg as scalar ref to error reason + +sub _is_verysafe { + + # Need POSIX - but only want to bother if really necessary due to overhead + require POSIX; + + my $path = shift; + print "_is_verysafe testing $path\n" if $DEBUG; + return 1 if $^O eq 'VMS'; # owner delete control at file level + + my $err_ref = shift; + + # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined + # and If it is not there do the extensive test + local($@); + my $chown_restricted; + $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED() + if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1}; + + # If chown_resticted is set to some value we should test it + if (defined $chown_restricted) { + + # Return if the current directory is safe + return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted ); + + } + + # To reach this point either, the _PC_CHOWN_RESTRICTED symbol + # was not available or the symbol was there but chown giveaway + # is allowed. Either way, we now have to test the entire tree for + # safety. + + # Convert path to an absolute directory if required + unless (File::Spec->file_name_is_absolute($path)) { + $path = File::Spec->rel2abs($path); + } + + # Split directory into components - assume no file + my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1); + + # Slightly less efficient than having a function in File::Spec + # to chop off the end of a directory or even a function that + # can handle ../ in a directory tree + # Sometimes splitdir() returns a blank at the end + # so we will probably check the bottom directory twice in some cases + my @dirs = File::Spec->splitdir($directories); + + # Concatenate one less directory each time around + foreach my $pos (0.. $#dirs) { + # Get a directory name + my $dir = File::Spec->catpath($volume, + File::Spec->catdir(@dirs[0.. $#dirs - $pos]), + '' + ); + + print "TESTING DIR $dir\n" if $DEBUG; + + # Check the directory + return 0 unless _is_safe($dir,$err_ref); + + } + + return 1; +} + + + +# internal routine to determine whether unlink works on this +# platform for files that are currently open. +# Returns true if we can, false otherwise. + +# Currently WinNT, OS/2 and VMS can not unlink an opened file +# On VMS this is because the O_EXCL flag is used to open the +# temporary file. Currently I do not know enough about the issues +# on VMS to decide whether O_EXCL is a requirement. + +sub _can_unlink_opened_file { + + if (grep { $^O eq $_ } qw/MSWin32 os2 VMS dos MacOS haiku/) { + return 0; + } else { + return 1; + } + +} + +# internal routine to decide which security levels are allowed +# see safe_level() for more information on this + +# Controls whether the supplied security level is allowed + +# $cando = _can_do_level( $level ) + +sub _can_do_level { + + # Get security level + my $level = shift; + + # Always have to be able to do STANDARD + return 1 if $level == STANDARD; + + # Currently, the systems that can do HIGH or MEDIUM are identical + if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos' || $^O eq 'MacOS' || $^O eq 'mpeix') { + return 0; + } else { + return 1; + } + +} + +# This routine sets up a deferred unlinking of a specified +# filename and filehandle. It is used in the following cases: +# - Called by unlink0 if an opened file can not be unlinked +# - Called by tempfile() if files are to be removed on shutdown +# - Called by tempdir() if directories are to be removed on shutdown + +# Arguments: +# _deferred_unlink( $fh, $fname, $isdir ); +# +# - filehandle (so that it can be explicitly closed if open +# - filename (the thing we want to remove) +# - isdir (flag to indicate that we are being given a directory) +# [and hence no filehandle] + +# Status is not referred to since all the magic is done with an END block + +{ + # Will set up two lexical variables to contain all the files to be + # removed. One array for files, another for directories They will + # only exist in this block. + + # This means we only have to set up a single END block to remove + # all files. + + # in order to prevent child processes inadvertently deleting the parent + # temp files we use a hash to store the temp files and directories + # created by a particular process id. + + # %files_to_unlink contains values that are references to an array of + # array references containing the filehandle and filename associated with + # the temp file. + my (%files_to_unlink, %dirs_to_unlink); + + # Set up an end block to use these arrays + END { + local($., $@, $!, $^E, $?); + cleanup(at_exit => 1); + } + + # Cleanup function. Always triggered on END (with at_exit => 1) but + # can be invoked manually. + sub cleanup { + my %h = @_; + my $at_exit = delete $h{at_exit}; + $at_exit = 0 if not defined $at_exit; + { my @k = sort keys %h; die "unrecognized parameters: @k" if @k } + + if (!$KEEP_ALL) { + # Files + my @files = (exists $files_to_unlink{$$} ? + @{ $files_to_unlink{$$} } : () ); + foreach my $file (@files) { + # close the filehandle without checking its state + # in order to make real sure that this is closed + # if its already closed then I don't care about the answer + # probably a better way to do this + close($file->[0]); # file handle is [0] + + if (-f $file->[1]) { # file name is [1] + _force_writable( $file->[1] ); # for windows + unlink $file->[1] or warn "Error removing ".$file->[1]; + } + } + # Dirs + my @dirs = (exists $dirs_to_unlink{$$} ? + @{ $dirs_to_unlink{$$} } : () ); + my ($cwd, $cwd_to_remove); + foreach my $dir (@dirs) { + if (-d $dir) { + # Some versions of rmtree will abort if you attempt to remove + # the directory you are sitting in. For automatic cleanup + # at program exit, we avoid this by chdir()ing out of the way + # first. If not at program exit, it's best not to mess with the + # current directory, so just let it fail with a warning. + if ($at_exit) { + $cwd = Cwd::abs_path(File::Spec->curdir) if not defined $cwd; + my $abs = Cwd::abs_path($dir); + if ($abs eq $cwd) { + $cwd_to_remove = $dir; + next; + } + } + eval { rmtree($dir, $DEBUG, 0); }; + warn $@ if ($@ && $^W); + } + } + + if (defined $cwd_to_remove) { + # We do need to clean up the current directory, and everything + # else is done, so get out of there and remove it. + chdir $cwd_to_remove or die "cannot chdir to $cwd_to_remove: $!"; + my $updir = File::Spec->updir; + chdir $updir or die "cannot chdir to $updir: $!"; + eval { rmtree($cwd_to_remove, $DEBUG, 0); }; + warn $@ if ($@ && $^W); + } + + # clear the arrays + @{ $files_to_unlink{$$} } = () + if exists $files_to_unlink{$$}; + @{ $dirs_to_unlink{$$} } = () + if exists $dirs_to_unlink{$$}; + } + } + + + # This is the sub called to register a file for deferred unlinking + # This could simply store the input parameters and defer everything + # until the END block. For now we do a bit of checking at this + # point in order to make sure that (1) we have a file/dir to delete + # and (2) we have been called with the correct arguments. + sub _deferred_unlink { + + croak 'Usage: _deferred_unlink($fh, $fname, $isdir)' + unless scalar(@_) == 3; + + my ($fh, $fname, $isdir) = @_; + + warn "Setting up deferred removal of $fname\n" + if $DEBUG; + + # make sure we save the absolute path for later cleanup + # OK to untaint because we only ever use this internally + # as a file path, never interpolating into the shell + $fname = Cwd::abs_path($fname); + ($fname) = $fname =~ /^(.*)$/; + + # If we have a directory, check that it is a directory + if ($isdir) { + + if (-d $fname) { + + # Directory exists so store it + # first on VMS turn []foo into [.foo] for rmtree + $fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS'; + $dirs_to_unlink{$$} = [] + unless exists $dirs_to_unlink{$$}; + push (@{ $dirs_to_unlink{$$} }, $fname); + + } else { + carp "Request to remove directory $fname could not be completed since it does not exist!\n" if $^W; + } + + } else { + + if (-f $fname) { + + # file exists so store handle and name for later removal + $files_to_unlink{$$} = [] + unless exists $files_to_unlink{$$}; + push(@{ $files_to_unlink{$$} }, [$fh, $fname]); + + } else { + carp "Request to remove file $fname could not be completed since it is not there!\n" if $^W; + } + + } + + } + + +} + +# normalize argument keys to upper case and do consistent handling +# of leading template vs TEMPLATE +sub _parse_args { + my $leading_template = (scalar(@_) % 2 == 1 ? shift(@_) : '' ); + my %args = @_; + %args = map { uc($_), $args{$_} } keys %args; + + # template (store it in an array so that it will + # disappear from the arg list of tempfile) + my @template = ( + exists $args{TEMPLATE} ? $args{TEMPLATE} : + $leading_template ? $leading_template : () + ); + delete $args{TEMPLATE}; + + return( \@template, \%args ); +} + + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + + my ($maybe_template, $args) = _parse_args(@_); + + # see if they are unlinking (defaulting to yes) + my $unlink = (exists $args->{UNLINK} ? $args->{UNLINK} : 1 ); + delete $args->{UNLINK}; + + # Protect OPEN + delete $args->{OPEN}; + + # Open the file and retain file handle and file name + my ($fh, $path) = tempfile( @$maybe_template, %$args ); + + print "Tmp: $fh - $path\n" if $DEBUG; + + # Store the filename in the scalar slot + ${*$fh} = $path; + + # Cache the filename by pid so that the destructor can decide whether to remove it + $FILES_CREATED_BY_OBJECT{$$}{$path} = 1; + + # Store unlink information in hash slot (plus other constructor info) + %{*$fh} = %$args; + + # create the object + bless $fh, $class; + + # final method-based configuration + $fh->unlink_on_destroy( $unlink ); + + return $fh; +} + + +sub newdir { + my $self = shift; + + my ($maybe_template, $args) = _parse_args(@_); + + # handle CLEANUP without passing CLEANUP to tempdir + my $cleanup = (exists $args->{CLEANUP} ? $args->{CLEANUP} : 1 ); + delete $args->{CLEANUP}; + + my $tempdir = tempdir( @$maybe_template, %$args); + + # get a safe absolute path for cleanup, just like + # happens in _deferred_unlink + my $real_dir = Cwd::abs_path( $tempdir ); + ($real_dir) = $real_dir =~ /^(.*)$/; + + return bless { DIRNAME => $tempdir, + REALNAME => $real_dir, + CLEANUP => $cleanup, + LAUNCHPID => $$, + }, "File::Temp::Dir"; +} + + +sub filename { + my $self = shift; + return ${*$self}; +} + +sub STRINGIFY { + my $self = shift; + return $self->filename; +} + +# For reference, can't use '0+'=>\&Scalar::Util::refaddr directly because +# refaddr() demands one parameter only, whereas overload.pm calls with three +# even for unary operations like '0+'. +sub NUMIFY { + return refaddr($_[0]); +} + + +sub unlink_on_destroy { + my $self = shift; + if (@_) { + ${*$self}{UNLINK} = shift; + } + return ${*$self}{UNLINK}; +} + + +sub DESTROY { + local($., $@, $!, $^E, $?); + my $self = shift; + + # Make sure we always remove the file from the global hash + # on destruction. This prevents the hash from growing uncontrollably + # and post-destruction there is no reason to know about the file. + my $file = $self->filename; + my $was_created_by_proc; + if (exists $FILES_CREATED_BY_OBJECT{$$}{$file}) { + $was_created_by_proc = 1; + delete $FILES_CREATED_BY_OBJECT{$$}{$file}; + } + + if (${*$self}{UNLINK} && !$KEEP_ALL) { + print "# ---------> Unlinking $self\n" if $DEBUG; + + # only delete if this process created it + return unless $was_created_by_proc; + + # The unlink1 may fail if the file has been closed + # by the caller. This leaves us with the decision + # of whether to refuse to remove the file or simply + # do an unlink without test. Seems to be silly + # to do this when we are trying to be careful + # about security + _force_writable( $file ); # for windows + unlink1( $self, $file ) + or unlink($file); + } +} + + +sub tempfile { + if ( @_ && $_[0] eq 'File::Temp' ) { + croak "'tempfile' can't be called as a method"; + } + # Can not check for argument count since we can have any + # number of args + + # Default options + my %options = ( + "DIR" => undef, # Directory prefix + "SUFFIX" => '', # Template suffix + "UNLINK" => 0, # Do not unlink file on exit + "OPEN" => 1, # Open file + "TMPDIR" => 0, # Place tempfile in tempdir if template specified + "EXLOCK" => 1, # Open file with O_EXLOCK + ); + + # Check to see whether we have an odd or even number of arguments + my ($maybe_template, $args) = _parse_args(@_); + my $template = @$maybe_template ? $maybe_template->[0] : undef; + + # Read the options and merge with defaults + %options = (%options, %$args); + + # First decision is whether or not to open the file + if (! $options{"OPEN"}) { + + warn "tempfile(): temporary filename requested but not opened.\nPossibly unsafe, consider using tempfile() with OPEN set to true\n" + if $^W; + + } + + if ($options{"DIR"} and $^O eq 'VMS') { + + # on VMS turn []foo into [.foo] for concatenation + $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"}); + } + + # Construct the template + + # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc + # functions or simply constructing a template and using _gettemp() + # explicitly. Go for the latter + + # First generate a template if not defined and prefix the directory + # If no template must prefix the temp directory + if (defined $template) { + # End up with current directory if neither DIR not TMPDIR are set + if ($options{"DIR"}) { + + $template = File::Spec->catfile($options{"DIR"}, $template); + + } elsif ($options{TMPDIR}) { + + $template = File::Spec->catfile(File::Spec->tmpdir, $template ); + + } + + } else { + + if ($options{"DIR"}) { + + $template = File::Spec->catfile($options{"DIR"}, TEMPXXX); + + } else { + + $template = File::Spec->catfile(File::Spec->tmpdir, TEMPXXX); + + } + + } + + # Now add a suffix + $template .= $options{"SUFFIX"}; + + # Determine whether we should tell _gettemp to unlink the file + # On unix this is irrelevant and can be worked out after the file is + # opened (simply by unlinking the open filehandle). On Windows or VMS + # we have to indicate temporary-ness when we open the file. In general + # we only want a true temporary file if we are returning just the + # filehandle - if the user wants the filename they probably do not + # want the file to disappear as soon as they close it (which may be + # important if they want a child process to use the file) + # For this reason, tie unlink_on_close to the return context regardless + # of OS. + my $unlink_on_close = ( wantarray ? 0 : 1); + + # Create the file + my ($fh, $path, $errstr); + croak "Error in tempfile() using template $template: $errstr" + unless (($fh, $path) = _gettemp($template, + "open" => $options{'OPEN'}, + "mkdir"=> 0 , + "unlink_on_close" => $unlink_on_close, + "suffixlen" => length($options{'SUFFIX'}), + "ErrStr" => \$errstr, + "use_exlock" => $options{EXLOCK}, + ) ); + + # Set up an exit handler that can do whatever is right for the + # system. This removes files at exit when requested explicitly or when + # system is asked to unlink_on_close but is unable to do so because + # of OS limitations. + # The latter should be achieved by using a tied filehandle. + # Do not check return status since this is all done with END blocks. + _deferred_unlink($fh, $path, 0) if $options{"UNLINK"}; + + # Return + if (wantarray()) { + + if ($options{'OPEN'}) { + return ($fh, $path); + } else { + return (undef, $path); + } + + } else { + + # Unlink the file. It is up to unlink0 to decide what to do with + # this (whether to unlink now or to defer until later) + unlink0($fh, $path) or croak "Error unlinking file $path using unlink0"; + + # Return just the filehandle. + return $fh; + } + + +} + + +# ' + +sub tempdir { + if ( @_ && $_[0] eq 'File::Temp' ) { + croak "'tempdir' can't be called as a method"; + } + + # Can not check for argument count since we can have any + # number of args + + # Default options + my %options = ( + "CLEANUP" => 0, # Remove directory on exit + "DIR" => '', # Root directory + "TMPDIR" => 0, # Use tempdir with template + ); + + # Check to see whether we have an odd or even number of arguments + my ($maybe_template, $args) = _parse_args(@_); + my $template = @$maybe_template ? $maybe_template->[0] : undef; + + # Read the options and merge with defaults + %options = (%options, %$args); + + # Modify or generate the template + + # Deal with the DIR and TMPDIR options + if (defined $template) { + + # Need to strip directory path if using DIR or TMPDIR + if ($options{'TMPDIR'} || $options{'DIR'}) { + + # Strip parent directory from the filename + # + # There is no filename at the end + $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS'; + my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1); + + # Last directory is then our template + $template = (File::Spec->splitdir($directories))[-1]; + + # Prepend the supplied directory or temp dir + if ($options{"DIR"}) { + + $template = File::Spec->catdir($options{"DIR"}, $template); + + } elsif ($options{TMPDIR}) { + + # Prepend tmpdir + $template = File::Spec->catdir(File::Spec->tmpdir, $template); + + } + + } + + } else { + + if ($options{"DIR"}) { + + $template = File::Spec->catdir($options{"DIR"}, TEMPXXX); + + } else { + + $template = File::Spec->catdir(File::Spec->tmpdir, TEMPXXX); + + } + + } + + # Create the directory + my $tempdir; + my $suffixlen = 0; + if ($^O eq 'VMS') { # dir names can end in delimiters + $template =~ m/([\.\]:>]+)$/; + $suffixlen = length($1); + } + if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) { + # dir name has a trailing ':' + ++$suffixlen; + } + + my $errstr; + croak "Error in tempdir() using $template: $errstr" + unless ((undef, $tempdir) = _gettemp($template, + "open" => 0, + "mkdir"=> 1 , + "suffixlen" => $suffixlen, + "ErrStr" => \$errstr, + ) ); + + # Install exit handler; must be dynamic to get lexical + if ( $options{'CLEANUP'} && -d $tempdir) { + _deferred_unlink(undef, $tempdir, 1); + } + + # Return the dir name + return $tempdir; + +} + + + + +sub mkstemp { + + croak "Usage: mkstemp(template)" + if scalar(@_) != 1; + + my $template = shift; + + my ($fh, $path, $errstr); + croak "Error in mkstemp using $template: $errstr" + unless (($fh, $path) = _gettemp($template, + "open" => 1, + "mkdir"=> 0 , + "suffixlen" => 0, + "ErrStr" => \$errstr, + ) ); + + if (wantarray()) { + return ($fh, $path); + } else { + return $fh; + } + +} + + + +sub mkstemps { + + croak "Usage: mkstemps(template, suffix)" + if scalar(@_) != 2; + + + my $template = shift; + my $suffix = shift; + + $template .= $suffix; + + my ($fh, $path, $errstr); + croak "Error in mkstemps using $template: $errstr" + unless (($fh, $path) = _gettemp($template, + "open" => 1, + "mkdir"=> 0 , + "suffixlen" => length($suffix), + "ErrStr" => \$errstr, + ) ); + + if (wantarray()) { + return ($fh, $path); + } else { + return $fh; + } + +} + + +#' # for emacs + +sub mkdtemp { + + croak "Usage: mkdtemp(template)" + if scalar(@_) != 1; + + my $template = shift; + my $suffixlen = 0; + if ($^O eq 'VMS') { # dir names can end in delimiters + $template =~ m/([\.\]:>]+)$/; + $suffixlen = length($1); + } + if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) { + # dir name has a trailing ':' + ++$suffixlen; + } + my ($junk, $tmpdir, $errstr); + croak "Error creating temp directory from template $template\: $errstr" + unless (($junk, $tmpdir) = _gettemp($template, + "open" => 0, + "mkdir"=> 1 , + "suffixlen" => $suffixlen, + "ErrStr" => \$errstr, + ) ); + + return $tmpdir; + +} + + +sub mktemp { + + croak "Usage: mktemp(template)" + if scalar(@_) != 1; + + my $template = shift; + + my ($tmpname, $junk, $errstr); + croak "Error getting name to temp file from template $template: $errstr" + unless (($junk, $tmpname) = _gettemp($template, + "open" => 0, + "mkdir"=> 0 , + "suffixlen" => 0, + "ErrStr" => \$errstr, + ) ); + + return $tmpname; +} + + +sub tmpnam { + + # Retrieve the temporary directory name + my $tmpdir = File::Spec->tmpdir; + + croak "Error temporary directory is not writable" + if $tmpdir eq ''; + + # Use a ten character template and append to tmpdir + my $template = File::Spec->catfile($tmpdir, TEMPXXX); + + if (wantarray() ) { + return mkstemp($template); + } else { + return mktemp($template); + } + +} + + +sub tmpfile { + + # Simply call tmpnam() in a list context + my ($fh, $file) = tmpnam(); + + # Make sure file is removed when filehandle is closed + # This will fail on NFS + unlink0($fh, $file) + or return undef; + + return $fh; + +} + + +sub tempnam { + + croak 'Usage tempnam($dir, $prefix)' unless scalar(@_) == 2; + + my ($dir, $prefix) = @_; + + # Add a string to the prefix + $prefix .= 'XXXXXXXX'; + + # Concatenate the directory to the file + my $template = File::Spec->catfile($dir, $prefix); + + return mktemp($template); + +} + + +sub unlink0 { + + croak 'Usage: unlink0(filehandle, filename)' + unless scalar(@_) == 2; + + # Read args + my ($fh, $path) = @_; + + cmpstat($fh, $path) or return 0; + + # attempt remove the file (does not work on some platforms) + if (_can_unlink_opened_file()) { + + # return early (Without unlink) if we have been instructed to retain files. + return 1 if $KEEP_ALL; + + # XXX: do *not* call this on a directory; possible race + # resulting in recursive removal + croak "unlink0: $path has become a directory!" if -d $path; + unlink($path) or return 0; + + # Stat the filehandle + my @fh = stat $fh; + + print "Link count = $fh[3] \n" if $DEBUG; + + # Make sure that the link count is zero + # - Cygwin provides deferred unlinking, however, + # on Win9x the link count remains 1 + # On NFS the link count may still be 1 but we can't know that + # we are on NFS. Since we can't be sure, we'll defer it + + return 1 if $fh[3] == 0 || $^O eq 'cygwin'; + } + # fall-through if we can't unlink now + _deferred_unlink($fh, $path, 0); + return 1; +} + + +sub cmpstat { + + croak 'Usage: cmpstat(filehandle, filename)' + unless scalar(@_) == 2; + + # Read args + my ($fh, $path) = @_; + + warn "Comparing stat\n" + if $DEBUG; + + # Stat the filehandle - which may be closed if someone has manually + # closed the file. Can not turn off warnings without using $^W + # unless we upgrade to 5.006 minimum requirement + my @fh; + { + local ($^W) = 0; + @fh = stat $fh; + } + return unless @fh; + + if ($fh[3] > 1 && $^W) { + carp "unlink0: fstat found too many links; SB=@fh" if $^W; + } + + # Stat the path + my @path = stat $path; + + unless (@path) { + carp "unlink0: $path is gone already" if $^W; + return; + } + + # this is no longer a file, but may be a directory, or worse + unless (-f $path) { + confess "panic: $path is no longer a file: SB=@fh"; + } + + # Do comparison of each member of the array + # On WinNT dev and rdev seem to be different + # depending on whether it is a file or a handle. + # Cannot simply compare all members of the stat return + # Select the ones we can use + my @okstat = (0..$#fh); # Use all by default + if ($^O eq 'MSWin32') { + @okstat = (1,2,3,4,5,7,8,9,10); + } elsif ($^O eq 'os2') { + @okstat = (0, 2..$#fh); + } elsif ($^O eq 'VMS') { # device and file ID are sufficient + @okstat = (0, 1); + } elsif ($^O eq 'dos') { + @okstat = (0,2..7,11..$#fh); + } elsif ($^O eq 'mpeix') { + @okstat = (0..4,8..10); + } + + # Now compare each entry explicitly by number + for (@okstat) { + print "Comparing: $_ : $fh[$_] and $path[$_]\n" if $DEBUG; + # Use eq rather than == since rdev, blksize, and blocks (6, 11, + # and 12) will be '' on platforms that do not support them. This + # is fine since we are only comparing integers. + unless ($fh[$_] eq $path[$_]) { + warn "Did not match $_ element of stat\n" if $DEBUG; + return 0; + } + } + + return 1; +} + + +sub unlink1 { + croak 'Usage: unlink1(filehandle, filename)' + unless scalar(@_) == 2; + + # Read args + my ($fh, $path) = @_; + + cmpstat($fh, $path) or return 0; + + # Close the file + close( $fh ) or return 0; + + # Make sure the file is writable (for windows) + _force_writable( $path ); + + # return early (without unlink) if we have been instructed to retain files. + return 1 if $KEEP_ALL; + + # remove the file + return unlink($path); +} + + +{ + # protect from using the variable itself + my $LEVEL = STANDARD; + sub safe_level { + my $self = shift; + if (@_) { + my $level = shift; + if (($level != STANDARD) && ($level != MEDIUM) && ($level != HIGH)) { + carp "safe_level: Specified level ($level) not STANDARD, MEDIUM or HIGH - ignoring\n" if $^W; + } else { + # Don't allow this on perl 5.005 or earlier + if ($] < 5.006 && $level != STANDARD) { + # Cant do MEDIUM or HIGH checks + croak "Currently requires perl 5.006 or newer to do the safe checks"; + } + # Check that we are allowed to change level + # Silently ignore if we can not. + $LEVEL = $level if _can_do_level($level); + } + } + return $LEVEL; + } +} + + +{ + my $TopSystemUID = 10; + $TopSystemUID = 197108 if $^O eq 'interix'; # "Administrator" + sub top_system_uid { + my $self = shift; + if (@_) { + my $newuid = shift; + croak "top_system_uid: UIDs should be numeric" + unless $newuid =~ /^\d+$/s; + $TopSystemUID = $newuid; + } + return $TopSystemUID; + } +} + + +package File::Temp::Dir; + +use File::Path qw/ rmtree /; +use strict; +use overload '""' => "STRINGIFY", + '0+' => \&File::Temp::NUMIFY, + fallback => 1; + +# private class specifically to support tempdir objects +# created by File::Temp->newdir + +# ostensibly the same method interface as File::Temp but without +# inheriting all the IO::Seekable methods and other cruft + +# Read-only - returns the name of the temp directory + +sub dirname { + my $self = shift; + return $self->{DIRNAME}; +} + +sub STRINGIFY { + my $self = shift; + return $self->dirname; +} + +sub unlink_on_destroy { + my $self = shift; + if (@_) { + $self->{CLEANUP} = shift; + } + return $self->{CLEANUP}; +} + +sub DESTROY { + my $self = shift; + local($., $@, $!, $^E, $?); + if ($self->unlink_on_destroy && + $$ == $self->{LAUNCHPID} && !$File::Temp::KEEP_ALL) { + if (-d $self->{REALNAME}) { + # Some versions of rmtree will abort if you attempt to remove + # the directory you are sitting in. We protect that and turn it + # into a warning. We do this because this occurs during object + # destruction and so can not be caught by the user. + eval { rmtree($self->{REALNAME}, $File::Temp::DEBUG, 0); }; + warn $@ if ($@ && $^W); + } + } +} + +1; + +__END__ + +package File::GlobMapper; + +use strict; +use warnings; +use Carp; + +our ($CSH_GLOB); + +BEGIN +{ + if ($] < 5.006) + { + require File::BSDGlob; import File::BSDGlob qw(:glob) ; + $CSH_GLOB = File::BSDGlob::GLOB_CSH() ; + *globber = \&File::BSDGlob::csh_glob; + } + else + { + require File::Glob; import File::Glob qw(:glob) ; + $CSH_GLOB = File::Glob::GLOB_CSH() ; + #*globber = \&File::Glob::bsd_glob; + *globber = \&File::Glob::csh_glob; + } +} + +our ($Error); + +our ($VERSION, @EXPORT_OK); +$VERSION = '1.000'; +@EXPORT_OK = qw( globmap ); + + +our ($noPreBS, $metachars, $matchMetaRE, %mapping, %wildCount); +$noPreBS = '(?<!\\\)' ; # no preceding backslash +$metachars = '.*?[](){}'; +$matchMetaRE = '[' . quotemeta($metachars) . ']'; + +%mapping = ( + '*' => '([^/]*)', + '?' => '([^/])', + '.' => '\.', + '[' => '([', + '(' => '(', + ')' => ')', + ); + +%wildCount = map { $_ => 1 } qw/ * ? . { ( [ /; + +sub globmap ($$;) +{ + my $inputGlob = shift ; + my $outputGlob = shift ; + + my $obj = new File::GlobMapper($inputGlob, $outputGlob, @_) + or croak "globmap: $Error" ; + return $obj->getFileMap(); +} + +sub new +{ + my $class = shift ; + my $inputGlob = shift ; + my $outputGlob = shift ; + # TODO -- flags needs to default to whatever File::Glob does + my $flags = shift || $CSH_GLOB ; + #my $flags = shift ; + + $inputGlob =~ s/^\s*\<\s*//; + $inputGlob =~ s/\s*\>\s*$//; + + $outputGlob =~ s/^\s*\<\s*//; + $outputGlob =~ s/\s*\>\s*$//; + + my %object = + ( InputGlob => $inputGlob, + OutputGlob => $outputGlob, + GlobFlags => $flags, + Braces => 0, + WildCount => 0, + Pairs => [], + Sigil => '#', + ); + + my $self = bless \%object, ref($class) || $class ; + + $self->_parseInputGlob() + or return undef ; + + $self->_parseOutputGlob() + or return undef ; + + my @inputFiles = globber($self->{InputGlob}, $flags) ; + + if (GLOB_ERROR) + { + $Error = $!; + return undef ; + } + + #if (whatever) + { + my $missing = grep { ! -e $_ } @inputFiles ; + + if ($missing) + { + $Error = "$missing input files do not exist"; + return undef ; + } + } + + $self->{InputFiles} = \@inputFiles ; + + $self->_getFiles() + or return undef ; + + return $self; +} + +sub _retError +{ + my $string = shift ; + $Error = "$string in input fileglob" ; + return undef ; +} + +sub _unmatched +{ + my $delimeter = shift ; + + _retError("Unmatched $delimeter"); + return undef ; +} + +sub _parseBit +{ + my $self = shift ; + + my $string = shift ; + + my $out = ''; + my $depth = 0 ; + + while ($string =~ s/(.*?)$noPreBS(,|$matchMetaRE)//) + { + $out .= quotemeta($1) ; + $out .= $mapping{$2} if defined $mapping{$2}; + + ++ $self->{WildCount} if $wildCount{$2} ; + + if ($2 eq ',') + { + return _unmatched("(") + if $depth ; + + $out .= '|'; + } + elsif ($2 eq '(') + { + ++ $depth ; + } + elsif ($2 eq ')') + { + return _unmatched(")") + if ! $depth ; + + -- $depth ; + } + elsif ($2 eq '[') + { + # TODO -- quotemeta & check no '/' + # TODO -- check for \] & other \ within the [] + $string =~ s#(.*?\])## + or return _unmatched("["); + $out .= "$1)" ; + } + elsif ($2 eq ']') + { + return _unmatched("]"); + } + elsif ($2 eq '{' || $2 eq '}') + { + return _retError("Nested {} not allowed"); + } + } + + $out .= quotemeta $string; + + return _unmatched("(") + if $depth ; + + return $out ; +} + +sub _parseInputGlob +{ + my $self = shift ; + + my $string = $self->{InputGlob} ; + my $inGlob = ''; + + # Multiple concatenated *'s don't make sense + #$string =~ s#\*\*+#*# ; + + # TODO -- Allow space to delimit patterns? + #my @strings = split /\s+/, $string ; + #for my $str (@strings) + my $out = ''; + my $depth = 0 ; + + while ($string =~ s/(.*?)$noPreBS($matchMetaRE)//) + { + $out .= quotemeta($1) ; + $out .= $mapping{$2} if defined $mapping{$2}; + ++ $self->{WildCount} if $wildCount{$2} ; + + if ($2 eq '(') + { + ++ $depth ; + } + elsif ($2 eq ')') + { + return _unmatched(")") + if ! $depth ; + + -- $depth ; + } + elsif ($2 eq '[') + { + # TODO -- quotemeta & check no '/' or '(' or ')' + # TODO -- check for \] & other \ within the [] + $string =~ s#(.*?\])## + or return _unmatched("["); + $out .= "$1)" ; + } + elsif ($2 eq ']') + { + return _unmatched("]"); + } + elsif ($2 eq '}') + { + return _unmatched("}"); + } + elsif ($2 eq '{') + { + # TODO -- check no '/' within the {} + # TODO -- check for \} & other \ within the {} + + my $tmp ; + unless ( $string =~ s/(.*?)$noPreBS\}//) + { + return _unmatched("{"); + } + #$string =~ s#(.*?)\}##; + + #my $alt = join '|', + # map { quotemeta $_ } + # split "$noPreBS,", $1 ; + my $alt = $self->_parseBit($1); + defined $alt or return 0 ; + $out .= "($alt)" ; + + ++ $self->{Braces} ; + } + } + + return _unmatched("(") + if $depth ; + + $out .= quotemeta $string ; + + + $self->{InputGlob} =~ s/$noPreBS[\(\)]//g; + $self->{InputPattern} = $out ; + + #print "# INPUT '$self->{InputGlob}' => '$out'\n"; + + return 1 ; + +} + +sub _parseOutputGlob +{ + my $self = shift ; + + my $string = $self->{OutputGlob} ; + my $maxwild = $self->{WildCount}; + + if ($self->{GlobFlags} & GLOB_TILDE) + #if (1) + { + $string =~ s{ + ^ ~ # find a leading tilde + ( # save this in $1 + [^/] # a non-slash character + * # repeated 0 or more times (0 means me) + ) + }{ + $1 + ? (getpwnam($1))[7] + : ( $ENV{HOME} || $ENV{LOGDIR} ) + }ex; + + } + + # max #1 must be == to max no of '*' in input + while ( $string =~ m/#(\d)/g ) + { + croak "Max wild is #$maxwild, you tried #$1" + if $1 > $maxwild ; + } + + my $noPreBS = '(?<!\\\)' ; # no preceding backslash + #warn "noPreBS = '$noPreBS'\n"; + + #$string =~ s/${noPreBS}\$(\d)/\${$1}/g; + $string =~ s/${noPreBS}#(\d)/\${$1}/g; + $string =~ s#${noPreBS}\*#\${inFile}#g; + $string = '"' . $string . '"'; + + #print "OUTPUT '$self->{OutputGlob}' => '$string'\n"; + $self->{OutputPattern} = $string ; + + return 1 ; +} + +sub _getFiles +{ + my $self = shift ; + + my %outInMapping = (); + my %inFiles = () ; + + foreach my $inFile (@{ $self->{InputFiles} }) + { + next if $inFiles{$inFile} ++ ; + + my $outFile = $inFile ; + + if ( $inFile =~ m/$self->{InputPattern}/ ) + { + no warnings 'uninitialized'; + eval "\$outFile = $self->{OutputPattern};" ; + + if (defined $outInMapping{$outFile}) + { + $Error = "multiple input files map to one output file"; + return undef ; + } + $outInMapping{$outFile} = $inFile; + push @{ $self->{Pairs} }, [$inFile, $outFile]; + } + } + + return 1 ; +} + +sub getFileMap +{ + my $self = shift ; + + return $self->{Pairs} ; +} + +sub getHash +{ + my $self = shift ; + + return { map { $_->[0] => $_->[1] } @{ $self->{Pairs} } } ; +} + +1; + +__END__ + +package JSON::PP; + +# JSON-2.0 + +use 5.005; +use strict; + +use Exporter (); +BEGIN { @JSON::PP::ISA = ('Exporter') } + +use overload (); +use JSON::PP::Boolean; + +use Carp (); +#use Devel::Peek; + +$JSON::PP::VERSION = '2.97001'; + +@JSON::PP::EXPORT = qw(encode_json decode_json from_json to_json); + +# instead of hash-access, i tried index-access for speed. +# but this method is not faster than what i expected. so it will be changed. + +use constant P_ASCII => 0; +use constant P_LATIN1 => 1; +use constant P_UTF8 => 2; +use constant P_INDENT => 3; +use constant P_CANONICAL => 4; +use constant P_SPACE_BEFORE => 5; +use constant P_SPACE_AFTER => 6; +use constant P_ALLOW_NONREF => 7; +use constant P_SHRINK => 8; +use constant P_ALLOW_BLESSED => 9; +use constant P_CONVERT_BLESSED => 10; +use constant P_RELAXED => 11; + +use constant P_LOOSE => 12; +use constant P_ALLOW_BIGNUM => 13; +use constant P_ALLOW_BAREKEY => 14; +use constant P_ALLOW_SINGLEQUOTE => 15; +use constant P_ESCAPE_SLASH => 16; +use constant P_AS_NONBLESSED => 17; + +use constant P_ALLOW_UNKNOWN => 18; + +use constant OLD_PERL => $] < 5.008 ? 1 : 0; +use constant USE_B => 0; + +BEGIN { +if (USE_B) { + require B; +} +} + +BEGIN { + my @xs_compati_bit_properties = qw( + latin1 ascii utf8 indent canonical space_before space_after allow_nonref shrink + allow_blessed convert_blessed relaxed allow_unknown + ); + my @pp_bit_properties = qw( + allow_singlequote allow_bignum loose + allow_barekey escape_slash as_nonblessed + ); + + # Perl version check, Unicode handling is enabled? + # Helper module sets @JSON::PP::_properties. + if ( OLD_PERL ) { + my $helper = $] >= 5.006 ? 'JSON::PP::Compat5006' : 'JSON::PP::Compat5005'; + eval qq| require $helper |; + if ($@) { Carp::croak $@; } + } + + for my $name (@xs_compati_bit_properties, @pp_bit_properties) { + my $property_id = 'P_' . uc($name); + + eval qq/ + sub $name { + my \$enable = defined \$_[1] ? \$_[1] : 1; + + if (\$enable) { + \$_[0]->{PROPS}->[$property_id] = 1; + } + else { + \$_[0]->{PROPS}->[$property_id] = 0; + } + + \$_[0]; + } + + sub get_$name { + \$_[0]->{PROPS}->[$property_id] ? 1 : ''; + } + /; + } + +} + + + +# Functions + +my $JSON; # cache + +sub encode_json ($) { # encode + ($JSON ||= __PACKAGE__->new->utf8)->encode(@_); +} + + +sub decode_json { # decode + ($JSON ||= __PACKAGE__->new->utf8)->decode(@_); +} + +# Obsoleted + +sub to_json($) { + Carp::croak ("JSON::PP::to_json has been renamed to encode_json."); +} + + +sub from_json($) { + Carp::croak ("JSON::PP::from_json has been renamed to decode_json."); +} + + +# Methods + +sub new { + my $class = shift; + my $self = { + max_depth => 512, + max_size => 0, + indent_length => 3, + }; + + bless $self, $class; +} + + +sub encode { + return $_[0]->PP_encode_json($_[1]); +} + + +sub decode { + return $_[0]->PP_decode_json($_[1], 0x00000000); +} + + +sub decode_prefix { + return $_[0]->PP_decode_json($_[1], 0x00000001); +} + + +# accessor + + +# pretty printing + +sub pretty { + my ($self, $v) = @_; + my $enable = defined $v ? $v : 1; + + if ($enable) { # indent_length(3) for JSON::XS compatibility + $self->indent(1)->space_before(1)->space_after(1); + } + else { + $self->indent(0)->space_before(0)->space_after(0); + } + + $self; +} + +# etc + +sub max_depth { + my $max = defined $_[1] ? $_[1] : 0x80000000; + $_[0]->{max_depth} = $max; + $_[0]; +} + + +sub get_max_depth { $_[0]->{max_depth}; } + + +sub max_size { + my $max = defined $_[1] ? $_[1] : 0; + $_[0]->{max_size} = $max; + $_[0]; +} + + +sub get_max_size { $_[0]->{max_size}; } + + +sub filter_json_object { + if (defined $_[1] and ref $_[1] eq 'CODE') { + $_[0]->{cb_object} = $_[1]; + } else { + delete $_[0]->{cb_object}; + } + $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0; + $_[0]; +} + +sub filter_json_single_key_object { + if (@_ == 1 or @_ > 3) { + Carp::croak("Usage: JSON::PP::filter_json_single_key_object(self, key, callback = undef)"); + } + if (defined $_[2] and ref $_[2] eq 'CODE') { + $_[0]->{cb_sk_object}->{$_[1]} = $_[2]; + } else { + delete $_[0]->{cb_sk_object}->{$_[1]}; + delete $_[0]->{cb_sk_object} unless %{$_[0]->{cb_sk_object} || {}}; + } + $_[0]->{F_HOOK} = ($_[0]->{cb_object} or $_[0]->{cb_sk_object}) ? 1 : 0; + $_[0]; +} + +sub indent_length { + if (!defined $_[1] or $_[1] > 15 or $_[1] < 0) { + Carp::carp "The acceptable range of indent_length() is 0 to 15."; + } + else { + $_[0]->{indent_length} = $_[1]; + } + $_[0]; +} + +sub get_indent_length { + $_[0]->{indent_length}; +} + +sub sort_by { + $_[0]->{sort_by} = defined $_[1] ? $_[1] : 1; + $_[0]; +} + +sub allow_bigint { + Carp::carp("allow_bigint() is obsoleted. use allow_bignum() instead."); + $_[0]->allow_bignum; +} + +############################### + +### +### Perl => JSON +### + + +{ # Convert + + my $max_depth; + my $indent; + my $ascii; + my $latin1; + my $utf8; + my $space_before; + my $space_after; + my $canonical; + my $allow_blessed; + my $convert_blessed; + + my $indent_length; + my $escape_slash; + my $bignum; + my $as_nonblessed; + + my $depth; + my $indent_count; + my $keysort; + + + sub PP_encode_json { + my $self = shift; + my $obj = shift; + + $indent_count = 0; + $depth = 0; + + my $props = $self->{PROPS}; + + ($ascii, $latin1, $utf8, $indent, $canonical, $space_before, $space_after, $allow_blessed, + $convert_blessed, $escape_slash, $bignum, $as_nonblessed) + = @{$props}[P_ASCII .. P_SPACE_AFTER, P_ALLOW_BLESSED, P_CONVERT_BLESSED, + P_ESCAPE_SLASH, P_ALLOW_BIGNUM, P_AS_NONBLESSED]; + + ($max_depth, $indent_length) = @{$self}{qw/max_depth indent_length/}; + + $keysort = $canonical ? sub { $a cmp $b } : undef; + + if ($self->{sort_by}) { + $keysort = ref($self->{sort_by}) eq 'CODE' ? $self->{sort_by} + : $self->{sort_by} =~ /\D+/ ? $self->{sort_by} + : sub { $a cmp $b }; + } + + encode_error("hash- or arrayref expected (not a simple scalar, use allow_nonref to allow this)") + if(!ref $obj and !$props->[ P_ALLOW_NONREF ]); + + my $str = $self->object_to_json($obj); + + $str .= "\n" if ( $indent ); # JSON::XS 2.26 compatible + + unless ($ascii or $latin1 or $utf8) { + utf8::upgrade($str); + } + + if ($props->[ P_SHRINK ]) { + utf8::downgrade($str, 1); + } + + return $str; + } + + + sub object_to_json { + my ($self, $obj) = @_; + my $type = ref($obj); + + if($type eq 'HASH'){ + return $self->hash_to_json($obj); + } + elsif($type eq 'ARRAY'){ + return $self->array_to_json($obj); + } + elsif ($type) { # blessed object? + if (blessed($obj)) { + + return $self->value_to_json($obj) if ( $obj->isa('JSON::PP::Boolean') ); + + if ( $convert_blessed and $obj->can('TO_JSON') ) { + my $result = $obj->TO_JSON(); + if ( defined $result and ref( $result ) ) { + if ( refaddr( $obj ) eq refaddr( $result ) ) { + encode_error( sprintf( + "%s::TO_JSON method returned same object as was passed instead of a new one", + ref $obj + ) ); + } + } + + return $self->object_to_json( $result ); + } + + return "$obj" if ( $bignum and _is_bignum($obj) ); + + if ($allow_blessed) { + return $self->blessed_to_json($obj) if ($as_nonblessed); # will be removed. + return 'null'; + } + encode_error( sprintf("encountered object '%s', but neither allow_blessed " + . "nor convert_blessed settings are enabled", $obj) + ); + } + else { + return $self->value_to_json($obj); + } + } + else{ + return $self->value_to_json($obj); + } + } + + + sub hash_to_json { + my ($self, $obj) = @_; + my @res; + + encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)") + if (++$depth > $max_depth); + + my ($pre, $post) = $indent ? $self->_up_indent() : ('', ''); + my $del = ($space_before ? ' ' : '') . ':' . ($space_after ? ' ' : ''); + + for my $k ( _sort( $obj ) ) { + if ( OLD_PERL ) { utf8::decode($k) } # key for Perl 5.6 / be optimized + push @res, $self->string_to_json( $k ) + . $del + . ( ref $obj->{$k} ? $self->object_to_json( $obj->{$k} ) : $self->value_to_json( $obj->{$k} ) ); + } + + --$depth; + $self->_down_indent() if ($indent); + + return '{}' unless @res; + return '{' . $pre . join( ",$pre", @res ) . $post . '}'; + } + + + sub array_to_json { + my ($self, $obj) = @_; + my @res; + + encode_error("json text or perl structure exceeds maximum nesting level (max_depth set too low?)") + if (++$depth > $max_depth); + + my ($pre, $post) = $indent ? $self->_up_indent() : ('', ''); + + for my $v (@$obj){ + push @res, ref($v) ? $self->object_to_json($v) : $self->value_to_json($v); + } + + --$depth; + $self->_down_indent() if ($indent); + + return '[]' unless @res; + return '[' . $pre . join( ",$pre", @res ) . $post . ']'; + } + + sub _looks_like_number { + my $value = shift; + if (USE_B) { + my $b_obj = B::svref_2object(\$value); + my $flags = $b_obj->FLAGS; + return 1 if $flags & ( B::SVp_IOK() | B::SVp_NOK() ) and !( $flags & B::SVp_POK() ); + return; + } else { + no warnings 'numeric'; + # if the utf8 flag is on, it almost certainly started as a string + return if utf8::is_utf8($value); + # detect numbers + # string & "" -> "" + # number & "" -> 0 (with warning) + # nan and inf can detect as numbers, so check with * 0 + return unless length((my $dummy = "") & $value); + return unless 0 + $value eq $value; + return 1 if $value * 0 == 0; + return -1; # inf/nan + } + } + + sub value_to_json { + my ($self, $value) = @_; + + return 'null' if(!defined $value); + + my $type = ref($value); + + if (!$type) { + if (_looks_like_number($value)) { + return $value; + } + return $self->string_to_json($value); + } + elsif( blessed($value) and $value->isa('JSON::PP::Boolean') ){ + return $$value == 1 ? 'true' : 'false'; + } + else { + if ((overload::StrVal($value) =~ /=(\w+)/)[0]) { + return $self->value_to_json("$value"); + } + + if ($type eq 'SCALAR' and defined $$value) { + return $$value eq '1' ? 'true' + : $$value eq '0' ? 'false' + : $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ? 'null' + : encode_error("cannot encode reference to scalar"); + } + + if ( $self->{PROPS}->[ P_ALLOW_UNKNOWN ] ) { + return 'null'; + } + else { + if ( $type eq 'SCALAR' or $type eq 'REF' ) { + encode_error("cannot encode reference to scalar"); + } + else { + encode_error("encountered $value, but JSON can only represent references to arrays or hashes"); + } + } + + } + } + + + my %esc = ( + "\n" => '\n', + "\r" => '\r', + "\t" => '\t', + "\f" => '\f', + "\b" => '\b', + "\"" => '\"', + "\\" => '\\\\', + "\'" => '\\\'', + ); + + + sub string_to_json { + my ($self, $arg) = @_; + + $arg =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/g; + $arg =~ s/\//\\\//g if ($escape_slash); + $arg =~ s/([\x00-\x08\x0b\x0e-\x1f])/'\\u00' . unpack('H2', $1)/eg; + + if ($ascii) { + $arg = JSON_PP_encode_ascii($arg); + } + + if ($latin1) { + $arg = JSON_PP_encode_latin1($arg); + } + + if ($utf8) { + utf8::encode($arg); + } + + return '"' . $arg . '"'; + } + + + sub blessed_to_json { + my $reftype = reftype($_[1]) || ''; + if ($reftype eq 'HASH') { + return $_[0]->hash_to_json($_[1]); + } + elsif ($reftype eq 'ARRAY') { + return $_[0]->array_to_json($_[1]); + } + else { + return 'null'; + } + } + + + sub encode_error { + my $error = shift; + Carp::croak "$error"; + } + + + sub _sort { + defined $keysort ? (sort $keysort (keys %{$_[0]})) : keys %{$_[0]}; + } + + + sub _up_indent { + my $self = shift; + my $space = ' ' x $indent_length; + + my ($pre,$post) = ('',''); + + $post = "\n" . $space x $indent_count; + + $indent_count++; + + $pre = "\n" . $space x $indent_count; + + return ($pre,$post); + } + + + sub _down_indent { $indent_count--; } + + + sub PP_encode_box { + { + depth => $depth, + indent_count => $indent_count, + }; + } + +} # Convert + + +sub _encode_ascii { + join('', + map { + $_ <= 127 ? + chr($_) : + $_ <= 65535 ? + sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_)); + } unpack('U*', $_[0]) + ); +} + + +sub _encode_latin1 { + join('', + map { + $_ <= 255 ? + chr($_) : + $_ <= 65535 ? + sprintf('\u%04x', $_) : sprintf('\u%x\u%x', _encode_surrogates($_)); + } unpack('U*', $_[0]) + ); +} + + +sub _encode_surrogates { # from perlunicode + my $uni = $_[0] - 0x10000; + return ($uni / 0x400 + 0xD800, $uni % 0x400 + 0xDC00); +} + + +sub _is_bignum { + $_[0]->isa('Math::BigInt') or $_[0]->isa('Math::BigFloat'); +} + + + +# +# JSON => Perl +# + +my $max_intsize; + +BEGIN { + my $checkint = 1111; + for my $d (5..64) { + $checkint .= 1; + my $int = eval qq| $checkint |; + if ($int =~ /[eE]/) { + $max_intsize = $d - 1; + last; + } + } +} + +{ # PARSE + + my %escapes = ( # by Jeremy Muhlich <jmuhlich [at] bitflood.org> + b => "\x8", + t => "\x9", + n => "\xA", + f => "\xC", + r => "\xD", + '\\' => '\\', + '"' => '"', + '/' => '/', + ); + + my $text; # json data + my $at; # offset + my $ch; # first character + my $len; # text length (changed according to UTF8 or NON UTF8) + # INTERNAL + my $depth; # nest counter + my $encoding; # json text encoding + my $is_valid_utf8; # temp variable + my $utf8_len; # utf8 byte length + # FLAGS + my $utf8; # must be utf8 + my $max_depth; # max nest number of objects and arrays + my $max_size; + my $relaxed; + my $cb_object; + my $cb_sk_object; + + my $F_HOOK; + + my $allow_bignum; # using Math::BigInt/BigFloat + my $singlequote; # loosely quoting + my $loose; # + my $allow_barekey; # bareKey + + sub _detect_utf_encoding { + my $text = shift; + my @octets = unpack('C4', $text); + return 'unknown' unless defined $octets[3]; + return ( $octets[0] and $octets[1]) ? 'UTF-8' + : (!$octets[0] and $octets[1]) ? 'UTF-16BE' + : (!$octets[0] and !$octets[1]) ? 'UTF-32BE' + : ( $octets[2] ) ? 'UTF-16LE' + : (!$octets[2] ) ? 'UTF-32LE' + : 'unknown'; + } + + sub PP_decode_json { + my ($self, $want_offset); + + ($self, $text, $want_offset) = @_; + + ($at, $ch, $depth) = (0, '', 0); + + if ( !defined $text or ref $text ) { + decode_error("malformed JSON string, neither array, object, number, string or atom"); + } + + my $props = $self->{PROPS}; + + ($utf8, $relaxed, $loose, $allow_bignum, $allow_barekey, $singlequote) + = @{$props}[P_UTF8, P_RELAXED, P_LOOSE .. P_ALLOW_SINGLEQUOTE]; + + if ( $utf8 ) { + $encoding = _detect_utf_encoding($text); + if ($encoding ne 'UTF-8' and $encoding ne 'unknown') { + require Encode; + Encode::from_to($text, $encoding, 'utf-8'); + } else { + utf8::downgrade( $text, 1 ) or Carp::croak("Wide character in subroutine entry"); + } + } + else { + utf8::upgrade( $text ); + utf8::encode( $text ); + } + + $len = length $text; + + ($max_depth, $max_size, $cb_object, $cb_sk_object, $F_HOOK) + = @{$self}{qw/max_depth max_size cb_object cb_sk_object F_HOOK/}; + + if ($max_size > 1) { + use bytes; + my $bytes = length $text; + decode_error( + sprintf("attempted decode of JSON text of %s bytes size, but max_size is set to %s" + , $bytes, $max_size), 1 + ) if ($bytes > $max_size); + } + + white(); # remove head white space + + decode_error("malformed JSON string, neither array, object, number, string or atom") unless defined $ch; # Is there a first character for JSON structure? + + my $result = value(); + + if ( !$props->[ P_ALLOW_NONREF ] and !ref $result ) { + decode_error( + 'JSON text must be an object or array (but found number, string, true, false or null,' + . ' use allow_nonref to allow this)', 1); + } + + Carp::croak('something wrong.') if $len < $at; # we won't arrive here. + + my $consumed = defined $ch ? $at - 1 : $at; # consumed JSON text length + + white(); # remove tail white space + + return ( $result, $consumed ) if $want_offset; # all right if decode_prefix + + decode_error("garbage after JSON object") if defined $ch; + + $result; + } + + + sub next_chr { + return $ch = undef if($at >= $len); + $ch = substr($text, $at++, 1); + } + + + sub value { + white(); + return if(!defined $ch); + return object() if($ch eq '{'); + return array() if($ch eq '['); + return string() if($ch eq '"' or ($singlequote and $ch eq "'")); + return number() if($ch =~ /[0-9]/ or $ch eq '-'); + return word(); + } + + sub string { + my $utf16; + my $is_utf8; + + ($is_valid_utf8, $utf8_len) = ('', 0); + + my $s = ''; # basically UTF8 flag on + + if($ch eq '"' or ($singlequote and $ch eq "'")){ + my $boundChar = $ch; + + OUTER: while( defined(next_chr()) ){ + + if($ch eq $boundChar){ + next_chr(); + + if ($utf16) { + decode_error("missing low surrogate character in surrogate pair"); + } + + utf8::decode($s) if($is_utf8); + + return $s; + } + elsif($ch eq '\\'){ + next_chr(); + if(exists $escapes{$ch}){ + $s .= $escapes{$ch}; + } + elsif($ch eq 'u'){ # UNICODE handling + my $u = ''; + + for(1..4){ + $ch = next_chr(); + last OUTER if($ch !~ /[0-9a-fA-F]/); + $u .= $ch; + } + + # U+D800 - U+DBFF + if ($u =~ /^[dD][89abAB][0-9a-fA-F]{2}/) { # UTF-16 high surrogate? + $utf16 = $u; + } + # U+DC00 - U+DFFF + elsif ($u =~ /^[dD][c-fC-F][0-9a-fA-F]{2}/) { # UTF-16 low surrogate? + unless (defined $utf16) { + decode_error("missing high surrogate character in surrogate pair"); + } + $is_utf8 = 1; + $s .= JSON_PP_decode_surrogates($utf16, $u) || next; + $utf16 = undef; + } + else { + if (defined $utf16) { + decode_error("surrogate pair expected"); + } + + if ( ( my $hex = hex( $u ) ) > 127 ) { + $is_utf8 = 1; + $s .= JSON_PP_decode_unicode($u) || next; + } + else { + $s .= chr $hex; + } + } + + } + else{ + unless ($loose) { + $at -= 2; + decode_error('illegal backslash escape sequence in string'); + } + $s .= $ch; + } + } + else{ + + if ( ord $ch > 127 ) { + unless( $ch = is_valid_utf8($ch) ) { + $at -= 1; + decode_error("malformed UTF-8 character in JSON string"); + } + else { + $at += $utf8_len - 1; + } + + $is_utf8 = 1; + } + + if (!$loose) { + if ($ch =~ /[\x00-\x1f\x22\x5c]/) { # '/' ok + $at--; + decode_error('invalid character encountered while parsing JSON string'); + } + } + + $s .= $ch; + } + } + } + + decode_error("unexpected end of string while parsing JSON string"); + } + + + sub white { + while( defined $ch ){ + if($ch eq '' or $ch =~ /\A[ \t\r\n]\z/){ + next_chr(); + } + elsif($relaxed and $ch eq '/'){ + next_chr(); + if(defined $ch and $ch eq '/'){ + 1 while(defined(next_chr()) and $ch ne "\n" and $ch ne "\r"); + } + elsif(defined $ch and $ch eq '*'){ + next_chr(); + while(1){ + if(defined $ch){ + if($ch eq '*'){ + if(defined(next_chr()) and $ch eq '/'){ + next_chr(); + last; + } + } + else{ + next_chr(); + } + } + else{ + decode_error("Unterminated comment"); + } + } + next; + } + else{ + $at--; + decode_error("malformed JSON string, neither array, object, number, string or atom"); + } + } + else{ + if ($relaxed and $ch eq '#') { # correctly? + pos($text) = $at; + $text =~ /\G([^\n]*(?:\r\n|\r|\n|$))/g; + $at = pos($text); + next_chr; + next; + } + + last; + } + } + } + + + sub array { + my $a = $_[0] || []; # you can use this code to use another array ref object. + + decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)') + if (++$depth > $max_depth); + + next_chr(); + white(); + + if(defined $ch and $ch eq ']'){ + --$depth; + next_chr(); + return $a; + } + else { + while(defined($ch)){ + push @$a, value(); + + white(); + + if (!defined $ch) { + last; + } + + if($ch eq ']'){ + --$depth; + next_chr(); + return $a; + } + + if($ch ne ','){ + last; + } + + next_chr(); + white(); + + if ($relaxed and $ch eq ']') { + --$depth; + next_chr(); + return $a; + } + + } + } + + $at-- if defined $ch and $ch ne ''; + decode_error(", or ] expected while parsing array"); + } + + + sub object { + my $o = $_[0] || {}; # you can use this code to use another hash ref object. + my $k; + + decode_error('json text or perl structure exceeds maximum nesting level (max_depth set too low?)') + if (++$depth > $max_depth); + next_chr(); + white(); + + if(defined $ch and $ch eq '}'){ + --$depth; + next_chr(); + if ($F_HOOK) { + return _json_object_hook($o); + } + return $o; + } + else { + while (defined $ch) { + $k = ($allow_barekey and $ch ne '"' and $ch ne "'") ? bareKey() : string(); + white(); + + if(!defined $ch or $ch ne ':'){ + $at--; + decode_error("':' expected"); + } + + next_chr(); + $o->{$k} = value(); + white(); + + last if (!defined $ch); + + if($ch eq '}'){ + --$depth; + next_chr(); + if ($F_HOOK) { + return _json_object_hook($o); + } + return $o; + } + + if($ch ne ','){ + last; + } + + next_chr(); + white(); + + if ($relaxed and $ch eq '}') { + --$depth; + next_chr(); + if ($F_HOOK) { + return _json_object_hook($o); + } + return $o; + } + + } + + } + + $at-- if defined $ch and $ch ne ''; + decode_error(", or } expected while parsing object/hash"); + } + + + sub bareKey { # doesn't strictly follow Standard ECMA-262 3rd Edition + my $key; + while($ch =~ /[^\x00-\x23\x25-\x2F\x3A-\x40\x5B-\x5E\x60\x7B-\x7F]/){ + $key .= $ch; + next_chr(); + } + return $key; + } + + + sub word { + my $word = substr($text,$at-1,4); + + if($word eq 'true'){ + $at += 3; + next_chr; + return $JSON::PP::true; + } + elsif($word eq 'null'){ + $at += 3; + next_chr; + return undef; + } + elsif($word eq 'fals'){ + $at += 3; + if(substr($text,$at,1) eq 'e'){ + $at++; + next_chr; + return $JSON::PP::false; + } + } + + $at--; # for decode_error report + + decode_error("'null' expected") if ($word =~ /^n/); + decode_error("'true' expected") if ($word =~ /^t/); + decode_error("'false' expected") if ($word =~ /^f/); + decode_error("malformed JSON string, neither array, object, number, string or atom"); + } + + + sub number { + my $n = ''; + my $v; + my $is_dec; + my $is_exp; + + if($ch eq '-'){ + $n = '-'; + next_chr; + if (!defined $ch or $ch !~ /\d/) { + decode_error("malformed number (no digits after initial minus)"); + } + } + + # According to RFC4627, hex or oct digits are invalid. + if($ch eq '0'){ + my $peek = substr($text,$at,1); + if($peek =~ /^[0-9a-dfA-DF]/){ # e may be valid (exponential) + decode_error("malformed number (leading zero must not be followed by another digit)"); + } + $n .= $ch; + next_chr; + } + + while(defined $ch and $ch =~ /\d/){ + $n .= $ch; + next_chr; + } + + if(defined $ch and $ch eq '.'){ + $n .= '.'; + $is_dec = 1; + + next_chr; + if (!defined $ch or $ch !~ /\d/) { + decode_error("malformed number (no digits after decimal point)"); + } + else { + $n .= $ch; + } + + while(defined(next_chr) and $ch =~ /\d/){ + $n .= $ch; + } + } + + if(defined $ch and ($ch eq 'e' or $ch eq 'E')){ + $n .= $ch; + $is_exp = 1; + next_chr; + + if(defined($ch) and ($ch eq '+' or $ch eq '-')){ + $n .= $ch; + next_chr; + if (!defined $ch or $ch =~ /\D/) { + decode_error("malformed number (no digits after exp sign)"); + } + $n .= $ch; + } + elsif(defined($ch) and $ch =~ /\d/){ + $n .= $ch; + } + else { + decode_error("malformed number (no digits after exp sign)"); + } + + while(defined(next_chr) and $ch =~ /\d/){ + $n .= $ch; + } + + } + + $v .= $n; + + if ($is_dec or $is_exp) { + if ($allow_bignum) { + require Math::BigFloat; + return Math::BigFloat->new($v); + } + } else { + if (length $v > $max_intsize) { + if ($allow_bignum) { # from Adam Sussman + require Math::BigInt; + return Math::BigInt->new($v); + } + else { + return "$v"; + } + } + } + + return $is_dec ? $v/1.0 : 0+$v; + } + + + sub is_valid_utf8 { + + $utf8_len = $_[0] =~ /[\x00-\x7F]/ ? 1 + : $_[0] =~ /[\xC2-\xDF]/ ? 2 + : $_[0] =~ /[\xE0-\xEF]/ ? 3 + : $_[0] =~ /[\xF0-\xF4]/ ? 4 + : 0 + ; + + return unless $utf8_len; + + my $is_valid_utf8 = substr($text, $at - 1, $utf8_len); + + return ( $is_valid_utf8 =~ /^(?: + [\x00-\x7F] + |[\xC2-\xDF][\x80-\xBF] + |[\xE0][\xA0-\xBF][\x80-\xBF] + |[\xE1-\xEC][\x80-\xBF][\x80-\xBF] + |[\xED][\x80-\x9F][\x80-\xBF] + |[\xEE-\xEF][\x80-\xBF][\x80-\xBF] + |[\xF0][\x90-\xBF][\x80-\xBF][\x80-\xBF] + |[\xF1-\xF3][\x80-\xBF][\x80-\xBF][\x80-\xBF] + |[\xF4][\x80-\x8F][\x80-\xBF][\x80-\xBF] + )$/x ) ? $is_valid_utf8 : ''; + } + + + sub decode_error { + my $error = shift; + my $no_rep = shift; + my $str = defined $text ? substr($text, $at) : ''; + my $mess = ''; + my $type = 'U*'; + + if ( OLD_PERL ) { + my $type = $] < 5.006 ? 'C*' + : utf8::is_utf8( $str ) ? 'U*' # 5.6 + : 'C*' + ; + } + + for my $c ( unpack( $type, $str ) ) { # emulate pv_uni_display() ? + $mess .= $c == 0x07 ? '\a' + : $c == 0x09 ? '\t' + : $c == 0x0a ? '\n' + : $c == 0x0d ? '\r' + : $c == 0x0c ? '\f' + : $c < 0x20 ? sprintf('\x{%x}', $c) + : $c == 0x5c ? '\\\\' + : $c < 0x80 ? chr($c) + : sprintf('\x{%x}', $c) + ; + if ( length $mess >= 20 ) { + $mess .= '...'; + last; + } + } + + unless ( length $mess ) { + $mess = '(end of string)'; + } + + Carp::croak ( + $no_rep ? "$error" : "$error, at character offset $at (before \"$mess\")" + ); + + } + + + sub _json_object_hook { + my $o = $_[0]; + my @ks = keys %{$o}; + + if ( $cb_sk_object and @ks == 1 and exists $cb_sk_object->{ $ks[0] } and ref $cb_sk_object->{ $ks[0] } ) { + my @val = $cb_sk_object->{ $ks[0] }->( $o->{$ks[0]} ); + if (@val == 1) { + return $val[0]; + } + } + + my @val = $cb_object->($o) if ($cb_object); + if (@val == 0 or @val > 1) { + return $o; + } + else { + return $val[0]; + } + } + + + sub PP_decode_box { + { + text => $text, + at => $at, + ch => $ch, + len => $len, + depth => $depth, + encoding => $encoding, + is_valid_utf8 => $is_valid_utf8, + }; + } + +} # PARSE + + +sub _decode_surrogates { # from perlunicode + my $uni = 0x10000 + (hex($_[0]) - 0xD800) * 0x400 + (hex($_[1]) - 0xDC00); + my $un = pack('U*', $uni); + utf8::encode( $un ); + return $un; +} + + +sub _decode_unicode { + my $un = pack('U', hex shift); + utf8::encode( $un ); + return $un; +} + +# +# Setup for various Perl versions (the code from JSON::PP58) +# + +BEGIN { + + unless ( defined &utf8::is_utf8 ) { + require Encode; + *utf8::is_utf8 = *Encode::is_utf8; + } + + if ( !OLD_PERL ) { + *JSON::PP::JSON_PP_encode_ascii = \&_encode_ascii; + *JSON::PP::JSON_PP_encode_latin1 = \&_encode_latin1; + *JSON::PP::JSON_PP_decode_surrogates = \&_decode_surrogates; + *JSON::PP::JSON_PP_decode_unicode = \&_decode_unicode; + + if ($] < 5.008003) { # join() in 5.8.0 - 5.8.2 is broken. + package JSON::PP; + require subs; + subs->import('join'); + eval q| + sub join { + return '' if (@_ < 2); + my $j = shift; + my $str = shift; + for (@_) { $str .= $j . $_; } + return $str; + } + |; + } + } + + + sub JSON::PP::incr_parse { + local $Carp::CarpLevel = 1; + ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_parse( @_ ); + } + + + sub JSON::PP::incr_skip { + ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_skip; + } + + + sub JSON::PP::incr_reset { + ( $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new )->incr_reset; + } + + eval q{ + sub JSON::PP::incr_text : lvalue { + $_[0]->{_incr_parser} ||= JSON::PP::IncrParser->new; + + if ( $_[0]->{_incr_parser}->{incr_pos} ) { + Carp::croak("incr_text cannot be called when the incremental parser already started parsing"); + } + $_[0]->{_incr_parser}->{incr_text}; + } + } if ( $] >= 5.006 ); + +} # Setup for various Perl versions (the code from JSON::PP58) + + +############################### +# Utilities +# + +BEGIN { + eval 'require Scalar::Util'; + unless($@){ + *JSON::PP::blessed = \&Scalar::Util::blessed; + *JSON::PP::reftype = \&Scalar::Util::reftype; + *JSON::PP::refaddr = \&Scalar::Util::refaddr; + } + else{ # This code is from Scalar::Util. + # warn $@; + eval 'sub UNIVERSAL::a_sub_not_likely_to_be_here { ref($_[0]) }'; + *JSON::PP::blessed = sub { + local($@, $SIG{__DIE__}, $SIG{__WARN__}); + ref($_[0]) ? eval { $_[0]->a_sub_not_likely_to_be_here } : undef; + }; + require B; + my %tmap = qw( + B::NULL SCALAR + B::HV HASH + B::AV ARRAY + B::CV CODE + B::IO IO + B::GV GLOB + B::REGEXP REGEXP + ); + *JSON::PP::reftype = sub { + my $r = shift; + + return undef unless length(ref($r)); + + my $t = ref(B::svref_2object($r)); + + return + exists $tmap{$t} ? $tmap{$t} + : length(ref($$r)) ? 'REF' + : 'SCALAR'; + }; + *JSON::PP::refaddr = sub { + return undef unless length(ref($_[0])); + + my $addr; + if(defined(my $pkg = blessed($_[0]))) { + $addr .= bless $_[0], 'Scalar::Util::Fake'; + bless $_[0], $pkg; + } + else { + $addr .= $_[0] + } + + $addr =~ /0x(\w+)/; + local $^W; + #no warnings 'portable'; + hex($1); + } + } +} + + +# shamelessly copied and modified from JSON::XS code. + +$JSON::PP::true = do { bless \(my $dummy = 1), "JSON::PP::Boolean" }; +$JSON::PP::false = do { bless \(my $dummy = 0), "JSON::PP::Boolean" }; + +sub is_bool { blessed $_[0] and $_[0]->isa("JSON::PP::Boolean"); } + +sub true { $JSON::PP::true } +sub false { $JSON::PP::false } +sub null { undef; } + +############################### + +package JSON::PP::IncrParser; + +use strict; + +use constant INCR_M_WS => 0; # initial whitespace skipping +use constant INCR_M_STR => 1; # inside string +use constant INCR_M_BS => 2; # inside backslash +use constant INCR_M_JSON => 3; # outside anything, count nesting +use constant INCR_M_C0 => 4; +use constant INCR_M_C1 => 5; + +$JSON::PP::IncrParser::VERSION = '1.01'; + +sub new { + my ( $class ) = @_; + + bless { + incr_nest => 0, + incr_text => undef, + incr_pos => 0, + incr_mode => 0, + }, $class; +} + + +sub incr_parse { + my ( $self, $coder, $text ) = @_; + + $self->{incr_text} = '' unless ( defined $self->{incr_text} ); + + if ( defined $text ) { + if ( utf8::is_utf8( $text ) and !utf8::is_utf8( $self->{incr_text} ) ) { + utf8::upgrade( $self->{incr_text} ) ; + utf8::decode( $self->{incr_text} ) ; + } + $self->{incr_text} .= $text; + } + + if ( defined wantarray ) { + my $max_size = $coder->get_max_size; + my $p = $self->{incr_pos}; + my @ret; + { + do { + unless ( $self->{incr_nest} <= 0 and $self->{incr_mode} == INCR_M_JSON ) { + $self->_incr_parse( $coder ); + + if ( $max_size and $self->{incr_pos} > $max_size ) { + Carp::croak("attempted decode of JSON text of $self->{incr_pos} bytes size, but max_size is set to $max_size"); + } + unless ( $self->{incr_nest} <= 0 and $self->{incr_mode} == INCR_M_JSON ) { + # as an optimisation, do not accumulate white space in the incr buffer + if ( $self->{incr_mode} == INCR_M_WS and $self->{incr_pos} ) { + $self->{incr_pos} = 0; + $self->{incr_text} = ''; + } + last; + } + } + + my ($obj, $offset) = $coder->PP_decode_json( $self->{incr_text}, 0x00000001 ); + push @ret, $obj; + use bytes; + $self->{incr_text} = substr( $self->{incr_text}, $offset || 0 ); + $self->{incr_pos} = 0; + $self->{incr_nest} = 0; + $self->{incr_mode} = 0; + last unless wantarray; + } while ( wantarray ); + } + + if ( wantarray ) { + return @ret; + } + else { # in scalar context + return $ret[0] ? $ret[0] : undef; + } + } +} + + +sub _incr_parse { + my ($self, $coder) = @_; + my $text = $self->{incr_text}; + my $len = length $text; + my $p = $self->{incr_pos}; + +INCR_PARSE: + while ( $len > $p ) { + my $s = substr( $text, $p, 1 ); + last INCR_PARSE unless defined $s; + my $mode = $self->{incr_mode}; + + if ( $mode == INCR_M_WS ) { + while ( $len > $p ) { + $s = substr( $text, $p, 1 ); + last INCR_PARSE unless defined $s; + if ( ord($s) > 0x20 ) { + if ( $s eq '#' ) { + $self->{incr_mode} = INCR_M_C0; + redo INCR_PARSE; + } else { + $self->{incr_mode} = INCR_M_JSON; + redo INCR_PARSE; + } + } + $p++; + } + } elsif ( $mode == INCR_M_BS ) { + $p++; + $self->{incr_mode} = INCR_M_STR; + redo INCR_PARSE; + } elsif ( $mode == INCR_M_C0 or $mode == INCR_M_C1 ) { + while ( $len > $p ) { + $s = substr( $text, $p, 1 ); + last INCR_PARSE unless defined $s; + if ( $s eq "\n" ) { + $self->{incr_mode} = $self->{incr_mode} == INCR_M_C0 ? INCR_M_WS : INCR_M_JSON; + last; + } + $p++; + } + next; + } elsif ( $mode == INCR_M_STR ) { + while ( $len > $p ) { + $s = substr( $text, $p, 1 ); + last INCR_PARSE unless defined $s; + if ( $s eq '"' ) { + $p++; + $self->{incr_mode} = INCR_M_JSON; + + last INCR_PARSE unless $self->{incr_nest}; + redo INCR_PARSE; + } + elsif ( $s eq '\\' ) { + $p++; + if ( !defined substr($text, $p, 1) ) { + $self->{incr_mode} = INCR_M_BS; + last INCR_PARSE; + } + } + $p++; + } + } elsif ( $mode == INCR_M_JSON ) { + while ( $len > $p ) { + $s = substr( $text, $p++, 1 ); + if ( $s eq "\x00" ) { + $p--; + last INCR_PARSE; + } elsif ( $s eq "\x09" or $s eq "\x0a" or $s eq "\x0d" or $s eq "\x20" ) { + if ( !$self->{incr_nest} ) { + $p--; # do not eat the whitespace, let the next round do it + last INCR_PARSE; + } + next; + } elsif ( $s eq '"' ) { + $self->{incr_mode} = INCR_M_STR; + redo INCR_PARSE; + } elsif ( $s eq '[' or $s eq '{' ) { + if ( ++$self->{incr_nest} > $coder->get_max_depth ) { + Carp::croak('json text or perl structure exceeds maximum nesting level (max_depth set too low?)'); + } + next; + } elsif ( $s eq ']' or $s eq '}' ) { + if ( --$self->{incr_nest} <= 0 ) { + last INCR_PARSE; + } + } elsif ( $s eq '#' ) { + $self->{incr_mode} = INCR_M_C1; + redo INCR_PARSE; + } + } + } + } + + $self->{incr_pos} = $p; + $self->{incr_parsing} = $p ? 1 : 0; # for backward compatibility +} + + +sub incr_text { + if ( $_[0]->{incr_pos} ) { + Carp::croak("incr_text cannot be called when the incremental parser already started parsing"); + } + $_[0]->{incr_text}; +} + + +sub incr_skip { + my $self = shift; + $self->{incr_text} = substr( $self->{incr_text}, $self->{incr_pos} ); + $self->{incr_pos} = 0; + $self->{incr_mode} = 0; + $self->{incr_nest} = 0; +} + + +sub incr_reset { + my $self = shift; + $self->{incr_text} = undef; + $self->{incr_pos} = 0; + $self->{incr_mode} = 0; + $self->{incr_nest} = 0; +} + +############################### + + +1; +__END__ +package JSON::PP::Boolean; + +use strict; +use overload ( + "0+" => sub { ${$_[0]} }, + "++" => sub { $_[0] = ${$_[0]} + 1 }, + "--" => sub { $_[0] = ${$_[0]} - 1 }, + fallback => 1, +); + +$JSON::PP::Boolean::VERSION = '2.97001'; + +1; + +__END__ + + +package Test2::EventFacet; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Test2::Util::HashBase qw/-details/; +use Carp qw/croak/; + +my $SUBLEN = length(__PACKAGE__ . '::'); +sub facet_key { + my $key = ref($_[0]) || $_[0]; + substr($key, 0, $SUBLEN, ''); + return lc($key); +} + +sub is_list { 0 } + +sub clone { + my $self = shift; + my $type = ref($self); + return bless {%$self, @_}, $type; +} + +1; + +__END__ + +package Test2::API; +use strict; +use warnings; + +use Test2::Util qw/USE_THREADS/; + +BEGIN { + $ENV{TEST_ACTIVE} ||= 1; + $ENV{TEST2_ACTIVE} = 1; +} + +our $VERSION = '1.302133'; + + +my $INST; +my $ENDING = 0; +sub test2_set_is_end { ($ENDING) = @_ ? @_ : (1) } +sub test2_get_is_end { $ENDING } + +use Test2::API::Instance(\$INST); + +# Set the exit status +END { + test2_set_is_end(); # See gh #16 + $INST->set_exit(); +} + +sub CLONE { + my $init = test2_init_done(); + my $load = test2_load_done(); + + return if $init && $load; + + require Carp; + Carp::croak "Test2 must be fully loaded before you start a new thread!\n"; +} + +# See gh #16 +{ + no warnings; + INIT { eval 'END { test2_set_is_end() }; 1' or die $@ } +} + +BEGIN { + no warnings 'once'; + if($] ge '5.014' || $ENV{T2_CHECK_DEPTH} || $Test2::API::DO_DEPTH_CHECK) { + *DO_DEPTH_CHECK = sub() { 1 }; + } + else { + *DO_DEPTH_CHECK = sub() { 0 }; + } +} + +use Test2::EventFacet::Trace(); +use Test2::Util::Trace(); # Legacy + +use Test2::Hub::Subtest(); +use Test2::Hub::Interceptor(); +use Test2::Hub::Interceptor::Terminator(); + +use Test2::Event::Ok(); +use Test2::Event::Diag(); +use Test2::Event::Note(); +use Test2::Event::Plan(); +use Test2::Event::Bail(); +use Test2::Event::Exception(); +use Test2::Event::Waiting(); +use Test2::Event::Skip(); +use Test2::Event::Subtest(); + +use Carp qw/carp croak confess/; +use Scalar::Util qw/blessed weaken/; +use Test2::Util qw/get_tid clone_io pkg_to_file/; + +our @EXPORT_OK = qw{ + context release + context_do + no_context + intercept intercept_deep + run_subtest + + test2_init_done + test2_load_done + test2_load + test2_start_preload + test2_stop_preload + test2_in_preload + + test2_set_is_end + test2_get_is_end + + test2_pid + test2_tid + test2_stack + test2_no_wait + test2_ipc_wait_enable + test2_ipc_wait_disable + test2_ipc_wait_enabled + + test2_add_uuid_via + + test2_add_callback_context_aquire + test2_add_callback_context_acquire + test2_add_callback_context_init + test2_add_callback_context_release + test2_add_callback_exit + test2_add_callback_post_load + test2_add_callback_pre_subtest + test2_list_context_aquire_callbacks + test2_list_context_acquire_callbacks + test2_list_context_init_callbacks + test2_list_context_release_callbacks + test2_list_exit_callbacks + test2_list_post_load_callbacks + test2_list_pre_subtest_callbacks + + test2_ipc + test2_has_ipc + test2_ipc_disable + test2_ipc_disabled + test2_ipc_drivers + test2_ipc_add_driver + test2_ipc_polling + test2_ipc_disable_polling + test2_ipc_enable_polling + test2_ipc_get_pending + test2_ipc_set_pending + test2_ipc_get_timeout + test2_ipc_set_timeout + test2_ipc_enable_shm + + test2_formatter + test2_formatters + test2_formatter_add + test2_formatter_set + + test2_stdout + test2_stderr + test2_reset_io +}; +BEGIN { require Exporter; our @ISA = qw(Exporter) } + +my $STACK = $INST->stack; +my $CONTEXTS = $INST->contexts; +my $INIT_CBS = $INST->context_init_callbacks; +my $ACQUIRE_CBS = $INST->context_acquire_callbacks; + +my $STDOUT = clone_io(\*STDOUT); +my $STDERR = clone_io(\*STDERR); +sub test2_stdout { $STDOUT ||= clone_io(\*STDOUT) } +sub test2_stderr { $STDERR ||= clone_io(\*STDERR) } + +sub test2_post_preload_reset { + test2_reset_io(); + $INST->post_preload_reset; +} + +sub test2_reset_io { + $STDOUT = clone_io(\*STDOUT); + $STDERR = clone_io(\*STDERR); +} + +sub test2_init_done { $INST->finalized } +sub test2_load_done { $INST->loaded } + +sub test2_load { $INST->load } +sub test2_start_preload { $ENV{T2_IN_PRELOAD} = 1; $INST->start_preload } +sub test2_stop_preload { $ENV{T2_IN_PRELOAD} = 0; $INST->stop_preload } +sub test2_in_preload { $INST->preload } + +sub test2_pid { $INST->pid } +sub test2_tid { $INST->tid } +sub test2_stack { $INST->stack } +sub test2_ipc_wait_enable { $INST->set_no_wait(0) } +sub test2_ipc_wait_disable { $INST->set_no_wait(1) } +sub test2_ipc_wait_enabled { !$INST->no_wait } + +sub test2_no_wait { + $INST->set_no_wait(@_) if @_; + $INST->no_wait; +} + +sub test2_add_callback_context_acquire { $INST->add_context_acquire_callback(@_) } +sub test2_add_callback_context_aquire { $INST->add_context_acquire_callback(@_) } +sub test2_add_callback_context_init { $INST->add_context_init_callback(@_) } +sub test2_add_callback_context_release { $INST->add_context_release_callback(@_) } +sub test2_add_callback_exit { $INST->add_exit_callback(@_) } +sub test2_add_callback_post_load { $INST->add_post_load_callback(@_) } +sub test2_add_callback_pre_subtest { $INST->add_pre_subtest_callback(@_) } +sub test2_list_context_aquire_callbacks { @{$INST->context_acquire_callbacks} } +sub test2_list_context_acquire_callbacks { @{$INST->context_acquire_callbacks} } +sub test2_list_context_init_callbacks { @{$INST->context_init_callbacks} } +sub test2_list_context_release_callbacks { @{$INST->context_release_callbacks} } +sub test2_list_exit_callbacks { @{$INST->exit_callbacks} } +sub test2_list_post_load_callbacks { @{$INST->post_load_callbacks} } +sub test2_list_pre_subtest_callbacks { @{$INST->pre_subtest_callbacks} } + +sub test2_add_uuid_via { + $INST->set_add_uuid_via(@_) if @_; + $INST->add_uuid_via(); +} + +sub test2_ipc { $INST->ipc } +sub test2_has_ipc { $INST->has_ipc } +sub test2_ipc_disable { $INST->ipc_disable } +sub test2_ipc_disabled { $INST->ipc_disabled } +sub test2_ipc_add_driver { $INST->add_ipc_driver(@_) } +sub test2_ipc_drivers { @{$INST->ipc_drivers} } +sub test2_ipc_polling { $INST->ipc_polling } +sub test2_ipc_enable_polling { $INST->enable_ipc_polling } +sub test2_ipc_disable_polling { $INST->disable_ipc_polling } +sub test2_ipc_get_pending { $INST->get_ipc_pending } +sub test2_ipc_set_pending { $INST->set_ipc_pending(@_) } +sub test2_ipc_set_timeout { $INST->set_ipc_timeout(@_) } +sub test2_ipc_get_timeout { $INST->ipc_timeout() } +sub test2_ipc_enable_shm { $INST->ipc_enable_shm } + +sub test2_formatter { + if ($ENV{T2_FORMATTER} && $ENV{T2_FORMATTER} =~ m/^(\+)?(.*)$/) { + my $formatter = $1 ? $2 : "Test2::Formatter::$2"; + my $file = pkg_to_file($formatter); + require $file; + return $formatter; + } + + return $INST->formatter; +} + +sub test2_formatters { @{$INST->formatters} } +sub test2_formatter_add { $INST->add_formatter(@_) } +sub test2_formatter_set { + my ($formatter) = @_; + croak "No formatter specified" unless $formatter; + croak "Global Formatter already set" if $INST->formatter_set; + $INST->set_formatter($formatter); +} + +# Private, for use in Test2::API::Context +sub _contexts_ref { $INST->contexts } +sub _context_acquire_callbacks_ref { $INST->context_acquire_callbacks } +sub _context_init_callbacks_ref { $INST->context_init_callbacks } +sub _context_release_callbacks_ref { $INST->context_release_callbacks } +sub _add_uuid_via_ref { \($INST->{Test2::API::Instance::ADD_UUID_VIA()}) } + +# Private, for use in Test2::IPC +sub _set_ipc { $INST->set_ipc(@_) } + +sub context_do(&;@) { + my $code = shift; + my @args = @_; + + my $ctx = context(level => 1); + + my $want = wantarray; + + my @out; + my $ok = eval { + $want ? @out = $code->($ctx, @args) : + defined($want) ? $out[0] = $code->($ctx, @args) : + $code->($ctx, @args) ; + 1; + }; + my $err = $@; + + $ctx->release; + + die $err unless $ok; + + return @out if $want; + return $out[0] if defined $want; + return; +} + +sub no_context(&;$) { + my ($code, $hid) = @_; + $hid ||= $STACK->top->hid; + + my $ctx = $CONTEXTS->{$hid}; + delete $CONTEXTS->{$hid}; + my $ok = eval { $code->(); 1 }; + my $err = $@; + + $CONTEXTS->{$hid} = $ctx; + weaken($CONTEXTS->{$hid}); + + die $err unless $ok; + + return; +}; + +my $UUID_VIA = _add_uuid_via_ref(); +my $CID = 1; +sub context { + # We need to grab these before anything else to ensure they are not + # changed. + my ($errno, $eval_error, $child_error, $extended_error) = (0 + $!, $@, $?, $^E); + + my %params = (level => 0, wrapped => 0, @_); + + # If something is getting a context then the sync system needs to be + # considered loaded... + $INST->load unless $INST->{loaded}; + + croak "context() called, but return value is ignored" + unless defined wantarray; + + my $stack = $params{stack} || $STACK; + my $hub = $params{hub} || (@$stack ? $stack->[-1] : $stack->top); + my $hid = $hub->{hid}; + my $current = $CONTEXTS->{$hid}; + + $_->(\%params) for @$ACQUIRE_CBS; + map $_->(\%params), @{$hub->{_context_acquire}} if $hub->{_context_acquire}; + + # This is for https://github.com/Test-More/test-more/issues/16 + # and https://rt.perl.org/Public/Bug/Display.html?id=127774 + my $phase = ${^GLOBAL_PHASE} || 'NA'; + my $end_phase = $ENDING || $phase eq 'END' || $phase eq 'DESTRUCT'; + + my $level = 1 + $params{level}; + my ($pkg, $file, $line, $sub) = $end_phase ? caller(0) : caller($level); + unless ($pkg || $end_phase) { + confess "Could not find context at depth $level" unless $params{fudge}; + ($pkg, $file, $line, $sub) = caller(--$level) while ($level >= 0 && !$pkg); + } + + my $depth = $level; + $depth++ while DO_DEPTH_CHECK && !$end_phase && (!$current || $depth <= $current->{_depth} + $params{wrapped}) && caller($depth + 1); + $depth -= $params{wrapped}; + my $depth_ok = !DO_DEPTH_CHECK || $end_phase || !$current || $current->{_depth} < $depth; + + if ($current && $params{on_release} && $depth_ok) { + $current->{_on_release} ||= []; + push @{$current->{_on_release}} => $params{on_release}; + } + + # I know this is ugly.... + ($!, $@, $?, $^E) = ($errno, $eval_error, $child_error, $extended_error) and return bless( + { + %$current, + _is_canon => undef, + errno => $errno, + eval_error => $eval_error, + child_error => $child_error, + _is_spawn => [$pkg, $file, $line, $sub], + }, + 'Test2::API::Context' + ) if $current && $depth_ok; + + # Handle error condition of bad level + if ($current) { + unless (${$current->{_aborted}}) { + _canon_error($current, [$pkg, $file, $line, $sub, $depth]) + unless $current->{_is_canon}; + + _depth_error($current, [$pkg, $file, $line, $sub, $depth]) + unless $depth_ok; + } + + $current->release if $current->{_is_canon}; + + delete $CONTEXTS->{$hid}; + } + + # Directly bless the object here, calling new is a noticeable performance + # hit with how often this needs to be called. + my $trace = bless( + { + frame => [$pkg, $file, $line, $sub], + pid => $$, + tid => get_tid(), + cid => 'C' . $CID++, + hid => $hid, + nested => $hub->{nested}, + buffered => $hub->{buffered}, + + $$UUID_VIA ? ( + huuid => $hub->{uuid}, + uuid => ${$UUID_VIA}->('context'), + ) : (), + }, + 'Test2::EventFacet::Trace' + ); + + # Directly bless the object here, calling new is a noticeable performance + # hit with how often this needs to be called. + my $aborted = 0; + $current = bless( + { + _aborted => \$aborted, + stack => $stack, + hub => $hub, + trace => $trace, + _is_canon => 1, + _depth => $depth, + errno => $errno, + eval_error => $eval_error, + child_error => $child_error, + $params{on_release} ? (_on_release => [$params{on_release}]) : (), + }, + 'Test2::API::Context' + ); + + $CONTEXTS->{$hid} = $current; + weaken($CONTEXTS->{$hid}); + + $_->($current) for @$INIT_CBS; + map $_->($current), @{$hub->{_context_init}} if $hub->{_context_init}; + + $params{on_init}->($current) if $params{on_init}; + + ($!, $@, $?, $^E) = ($errno, $eval_error, $child_error, $extended_error); + + return $current; +} + +sub _depth_error { + _existing_error(@_, <<" EOT"); +context() was called to retrieve an existing context, however the existing +context was created in a stack frame at the same, or deeper level. This usually +means that a tool failed to release the context when it was finished. + EOT +} + +sub _canon_error { + _existing_error(@_, <<" EOT"); +context() was called to retrieve an existing context, however the existing +context has an invalid internal state (!_canon_count). This should not normally +happen unless something is mucking about with internals... + EOT +} + +sub _existing_error { + my ($ctx, $details, $msg) = @_; + my ($pkg, $file, $line, $sub, $depth) = @$details; + + my $oldframe = $ctx->{trace}->frame; + my $olddepth = $ctx->{_depth}; + + # Older versions of Carp do not export longmess() function, so it needs to be called with package name + my $mess = Carp::longmess(); + + warn <<" EOT"; +$msg +Old context details: + File: $oldframe->[1] + Line: $oldframe->[2] + Tool: $oldframe->[3] + Depth: $olddepth + +New context details: + File: $file + Line: $line + Tool: $sub + Depth: $depth + +Trace: $mess + +Removing the old context and creating a new one... + EOT +} + +sub release($;$) { + $_[0]->release; + return $_[1]; +} + +sub intercept(&) { + my $code = shift; + my $ctx = context(); + + my $events = _intercept($code, deep => 0); + + $ctx->release; + + return $events; +} + +sub intercept_deep(&) { + my $code = shift; + my $ctx = context(); + + my $events = _intercept($code, deep => 1); + + $ctx->release; + + return $events; +} + +sub _intercept { + my $code = shift; + my %params = @_; + my $ctx = context(); + + my $ipc; + if (my $global_ipc = test2_ipc()) { + my $driver = blessed($global_ipc); + $ipc = $driver->new; + } + + my $hub = Test2::Hub::Interceptor->new( + ipc => $ipc, + no_ending => 1, + ); + + my @events; + $hub->listen(sub { push @events => $_[1] }, inherit => $params{deep}); + + $ctx->stack->top; # Make sure there is a top hub before we begin. + $ctx->stack->push($hub); + + my ($ok, $err) = (1, undef); + T2_SUBTEST_WRAPPER: { + # Do not use 'try' cause it localizes __DIE__ + $ok = eval { $code->(hub => $hub, context => $ctx->snapshot); 1 }; + $err = $@; + + # They might have done 'BEGIN { skip_all => "whatever" }' + if (!$ok && $err =~ m/Label not found for "last T2_SUBTEST_WRAPPER"/ || (blessed($err) && $err->isa('Test2::Hub::Interceptor::Terminator'))) { + $ok = 1; + $err = undef; + } + } + + $hub->cull; + $ctx->stack->pop($hub); + + my $trace = $ctx->trace; + $ctx->release; + + die $err unless $ok; + + $hub->finalize($trace, 1) + if $ok + && !$hub->no_ending + && !$hub->ended; + + return \@events; +} + +sub run_subtest { + my ($name, $code, $params, @args) = @_; + + $_->($name,$code,@args) + for Test2::API::test2_list_pre_subtest_callbacks(); + + $params = {buffered => $params} unless ref $params; + my $inherit_trace = delete $params->{inherit_trace}; + + my $ctx = context(); + + my $parent = $ctx->hub; + + # If a parent is buffered then the child must be as well. + my $buffered = $params->{buffered} || $parent->{buffered}; + + $ctx->note($name) unless $buffered; + + my $stack = $ctx->stack || $STACK; + my $hub = $stack->new_hub( + class => 'Test2::Hub::Subtest', + %$params, + buffered => $buffered, + ); + + my @events; + $hub->listen(sub { push @events => $_[1] }); + + if ($buffered) { + if (my $format = $hub->format) { + my $hide = $format->can('hide_buffered') ? $format->hide_buffered : 1; + $hub->format(undef) if $hide; + } + } + + if ($inherit_trace) { + my $orig = $code; + $code = sub { + my $base_trace = $ctx->trace; + my $trace = $base_trace->snapshot(nested => 1 + $base_trace->nested); + my $st_ctx = Test2::API::Context->new( + trace => $trace, + hub => $hub, + ); + $st_ctx->do_in_context($orig, @args); + }; + } + + my ($ok, $err, $finished); + T2_SUBTEST_WRAPPER: { + # Do not use 'try' cause it localizes __DIE__ + $ok = eval { $code->(@args); 1 }; + $err = $@; + + # They might have done 'BEGIN { skip_all => "whatever" }' + if (!$ok && $err =~ m/Label not found for "last T2_SUBTEST_WRAPPER"/ || (blessed($err) && blessed($err) eq 'Test::Builder::Exception')) { + $ok = undef; + $err = undef; + } + else { + $finished = 1; + } + } + + if ($params->{no_fork}) { + if ($$ != $ctx->trace->pid) { + warn $ok ? "Forked inside subtest, but subtest never finished!\n" : $err; + exit 255; + } + + if (get_tid() != $ctx->trace->tid) { + warn $ok ? "Started new thread inside subtest, but thread never finished!\n" : $err; + exit 255; + } + } + elsif (!$parent->is_local && !$parent->ipc) { + warn $ok ? "A new process or thread was started inside subtest, but IPC is not enabled!\n" : $err; + exit 255; + } + + $stack->pop($hub); + + my $trace = $ctx->trace; + + my $bailed = $hub->bailed_out; + + if (!$finished) { + if ($bailed && !$buffered) { + $ctx->bail($bailed->reason); + } + elsif ($bailed && $buffered) { + $ok = 1; + } + else { + my $code = $hub->exit_code; + $ok = !$code; + $err = "Subtest ended with exit code $code" if $code; + } + } + + $hub->finalize($trace->snapshot(huuid => $hub->uuid, hid => $hub->hid, nested => $hub->nested, buffered => $buffered), 1) + if $ok + && !$hub->no_ending + && !$hub->ended; + + my $pass = $ok && $hub->is_passing; + my $e = $ctx->build_event( + 'Subtest', + pass => $pass, + name => $name, + subtest_id => $hub->id, + subtest_uuid => $hub->uuid, + buffered => $buffered, + subevents => \@events, + ); + + my $plan_ok = $hub->check_plan; + + $ctx->hub->send($e); + + $ctx->failure_diag($e) unless $e->pass; + + $ctx->diag("Caught exception in subtest: $err") unless $ok; + + $ctx->diag("Bad subtest plan, expected " . $hub->plan . " but ran " . $hub->count) + if defined($plan_ok) && !$plan_ok; + + $ctx->bail($bailed->reason) if $bailed && $buffered; + + $ctx->release; + return $pass; +} + +# There is a use-cycle between API and API/Context. Context needs to use some +# API functions as the package is compiling. Test2::API::context() needs +# Test2::API::Context to be loaded, but we cannot 'require' the module there as +# it causes a very noticeable performance impact with how often context() is +# called. +require Test2::API::Context; + +1; + +__END__ + +package Test2::IPC; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Test2::API::Instance; +use Test2::Util qw/get_tid/; +use Test2::API qw{ + test2_init_done + test2_ipc + test2_has_ipc + test2_ipc_enable_polling + test2_pid + test2_stack + test2_tid + context +}; + +use Carp qw/confess/; + +our @EXPORT_OK = qw/cull/; +BEGIN { require Exporter; our @ISA = qw(Exporter) } + +sub unimport { Test2::API::test2_ipc_disable() } + +sub import { + goto &Exporter::import if test2_has_ipc || !test2_init_done(); + + confess "IPC is disabled" if Test2::API::test2_ipc_disabled(); + confess "Cannot add IPC in a child process (" . test2_pid() . " vs $$)" if test2_pid() != $$; + confess "Cannot add IPC in a child thread (" . test2_tid() . " vs " . get_tid() . ")" if test2_tid() != get_tid(); + + Test2::API::_set_ipc(_make_ipc()); + apply_ipc(test2_stack()); + + goto &Exporter::import; +} + +sub _make_ipc { + # Find a driver + my ($driver) = Test2::API::test2_ipc_drivers(); + unless ($driver) { + require Test2::IPC::Driver::Files; + $driver = 'Test2::IPC::Driver::Files'; + } + + return $driver->new(); +} + +sub apply_ipc { + my $stack = shift; + + my ($root) = @$stack; + + return unless $root; + + confess "Cannot add IPC in a child process" if $root->pid != $$; + confess "Cannot add IPC in a child thread" if $root->tid != get_tid(); + + my $ipc = $root->ipc || test2_ipc() || _make_ipc(); + + # Add the IPC to all hubs + for my $hub (@$stack) { + my $has = $hub->ipc; + confess "IPC Mismatch!" if $has && $has != $ipc; + next if $has; + $hub->set_ipc($ipc); + $ipc->add_hub($hub->hid); + } + + test2_ipc_enable_polling(); + + return $ipc; +} + +sub cull { + my $ctx = context(); + $ctx->hub->cull; + $ctx->release; +} + +1; + +__END__ + +package Test2::Util; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use POSIX(); +use Config qw/%Config/; +use Carp qw/croak/; + +BEGIN { + local ($@, $!, $SIG{__DIE__}); + *HAVE_PERLIO = eval { require PerlIO; PerlIO->VERSION(1.02); } ? sub() { 1 } : sub() { 0 }; +} + +our @EXPORT_OK = qw{ + try + + pkg_to_file + + get_tid USE_THREADS + CAN_THREAD + CAN_REALLY_FORK + CAN_FORK + + CAN_SIGSYS + + IS_WIN32 + + ipc_separator + + do_rename do_unlink + + try_sig_mask + + clone_io +}; +BEGIN { require Exporter; our @ISA = qw(Exporter) } + +BEGIN { + *IS_WIN32 = ($^O eq 'MSWin32') ? sub() { 1 } : sub() { 0 }; +} + +sub _can_thread { + return 0 unless $] >= 5.008001; + return 0 unless $Config{'useithreads'}; + + # Threads are broken on perl 5.10.0 built with gcc 4.8+ + if ($] == 5.010000 && $Config{'ccname'} eq 'gcc' && $Config{'gccversion'}) { + my @parts = split /\./, $Config{'gccversion'}; + return 0 if $parts[0] > 4 || ($parts[0] == 4 && $parts[1] >= 8); + } + + # Change to a version check if this ever changes + return 0 if $INC{'Devel/Cover.pm'}; + return 1; +} + +sub _can_fork { + return 1 if $Config{d_fork}; + return 0 unless IS_WIN32 || $^O eq 'NetWare'; + return 0 unless $Config{useithreads}; + return 0 unless $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/; + + return _can_thread(); +} + +BEGIN { + no warnings 'once'; + *CAN_THREAD = _can_thread() ? sub() { 1 } : sub() { 0 }; +} +my $can_fork; +sub CAN_FORK () { + return $can_fork + if defined $can_fork; + $can_fork = !!_can_fork(); + no warnings 'redefine'; + *CAN_FORK = $can_fork ? sub() { 1 } : sub() { 0 }; + $can_fork; +} +my $can_really_fork; +sub CAN_REALLY_FORK () { + return $can_really_fork + if defined $can_really_fork; + $can_really_fork = !!$Config{d_fork}; + no warnings 'redefine'; + *CAN_REALLY_FORK = $can_really_fork ? sub() { 1 } : sub() { 0 }; + $can_really_fork; +} + +sub _manual_try(&;@) { + my $code = shift; + my $args = \@_; + my $err; + + my $die = delete $SIG{__DIE__}; + + eval { $code->(@$args); 1 } or $err = $@ || "Error was squashed!\n"; + + $die ? $SIG{__DIE__} = $die : delete $SIG{__DIE__}; + + return (!defined($err), $err); +} + +sub _local_try(&;@) { + my $code = shift; + my $args = \@_; + my $err; + + no warnings; + local $SIG{__DIE__}; + eval { $code->(@$args); 1 } or $err = $@ || "Error was squashed!\n"; + + return (!defined($err), $err); +} + +# Older versions of perl have a nasty bug on win32 when localizing a variable +# before forking or starting a new thread. So for those systems we use the +# non-local form. When possible though we use the faster 'local' form. +BEGIN { + if (IS_WIN32 && $] < 5.020002) { + *try = \&_manual_try; + } + else { + *try = \&_local_try; + } +} + +BEGIN { + if (CAN_THREAD) { + if ($INC{'threads.pm'}) { + # Threads are already loaded, so we do not need to check if they + # are loaded each time + *USE_THREADS = sub() { 1 }; + *get_tid = sub() { threads->tid() }; + } + else { + # :-( Need to check each time to see if they have been loaded. + *USE_THREADS = sub() { $INC{'threads.pm'} ? 1 : 0 }; + *get_tid = sub() { $INC{'threads.pm'} ? threads->tid() : 0 }; + } + } + else { + # No threads, not now, not ever! + *USE_THREADS = sub() { 0 }; + *get_tid = sub() { 0 }; + } +} + +sub pkg_to_file { + my $pkg = shift; + my $file = $pkg; + $file =~ s{(::|')}{/}g; + $file .= '.pm'; + return $file; +} + +sub ipc_separator() { "~" } + +sub _check_for_sig_sys { + my $sig_list = shift; + return $sig_list =~ m/\bSYS\b/; +} + +BEGIN { + if (_check_for_sig_sys($Config{sig_name})) { + *CAN_SIGSYS = sub() { 1 }; + } + else { + *CAN_SIGSYS = sub() { 0 }; + } +} + +my %PERLIO_SKIP = ( + unix => 1, + via => 1, +); + +sub clone_io { + my ($fh) = @_; + my $fileno = fileno($fh); + + return $fh if !defined($fileno) || !length($fileno) || $fileno < 0; + + open(my $out, '>&' . $fileno) or die "Can't dup fileno $fileno: $!"; + + my %seen; + my @layers = HAVE_PERLIO ? grep { !$PERLIO_SKIP{$_} and !$seen{$_}++ } PerlIO::get_layers($fh) : (); + binmode($out, join(":", "", "raw", @layers)); + + my $old = select $fh; + my $af = $|; + select $out; + $| = $af; + select $old; + + return $out; +} + +BEGIN { + if (IS_WIN32) { + my $max_tries = 5; + + *do_rename = sub { + my ($from, $to) = @_; + + my $err; + for (1 .. $max_tries) { + return (1) if rename($from, $to); + $err = "$!"; + last if $_ == $max_tries; + sleep 1; + } + + return (0, $err); + }; + *do_unlink = sub { + my ($file) = @_; + + my $err; + for (1 .. $max_tries) { + return (1) if unlink($file); + $err = "$!"; + last if $_ == $max_tries; + sleep 1; + } + + return (0, "$!"); + }; + } + else { + *do_rename = sub { + my ($from, $to) = @_; + return (1) if rename($from, $to); + return (0, "$!"); + }; + *do_unlink = sub { + my ($file) = @_; + return (1) if unlink($file); + return (0, "$!"); + }; + } +} + +sub try_sig_mask(&) { + my $code = shift; + + my ($old, $blocked); + unless(IS_WIN32) { + my $to_block = POSIX::SigSet->new( + POSIX::SIGINT(), + POSIX::SIGALRM(), + POSIX::SIGHUP(), + POSIX::SIGTERM(), + POSIX::SIGUSR1(), + POSIX::SIGUSR2(), + ); + $old = POSIX::SigSet->new; + $blocked = POSIX::sigprocmask(POSIX::SIG_BLOCK(), $to_block, $old); + # Silently go on if we failed to log signals, not much we can do. + } + + my ($ok, $err) = &try($code); + + # If our block was successful we want to restore the old mask. + POSIX::sigprocmask(POSIX::SIG_SETMASK(), $old, POSIX::SigSet->new()) if defined $blocked; + + return ($ok, $err); +} + +1; + +__END__ + +package Test2::Event; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Scalar::Util qw/blessed reftype/; +use Carp qw/croak/; + +use Test2::Util::HashBase qw/trace -amnesty uuid -hubs/; +use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/; +use Test2::Util qw(pkg_to_file); + +use Test2::EventFacet::About(); +use Test2::EventFacet::Amnesty(); +use Test2::EventFacet::Assert(); +use Test2::EventFacet::Control(); +use Test2::EventFacet::Error(); +use Test2::EventFacet::Info(); +use Test2::EventFacet::Meta(); +use Test2::EventFacet::Parent(); +use Test2::EventFacet::Plan(); +use Test2::EventFacet::Trace(); +use Test2::EventFacet::Hub(); + +# Legacy tools will expect this to be loaded now +require Test2::Util::Trace; + +my %LOADED_FACETS = ( + 'about' => 'Test2::EventFacet::About', + 'amnesty' => 'Test2::EventFacet::Amnesty', + 'assert' => 'Test2::EventFacet::Assert', + 'control' => 'Test2::EventFacet::Control', + 'errors' => 'Test2::EventFacet::Error', + 'info' => 'Test2::EventFacet::Info', + 'meta' => 'Test2::EventFacet::Meta', + 'parent' => 'Test2::EventFacet::Parent', + 'plan' => 'Test2::EventFacet::Plan', + 'trace' => 'Test2::EventFacet::Trace', + 'hubs' => 'Test2::EventFacet::Hub', +); + +sub FACET_TYPES { sort values %LOADED_FACETS } + +sub load_facet { + my $class = shift; + my ($facet) = @_; + + return $LOADED_FACETS{$facet} if exists $LOADED_FACETS{$facet}; + + my @check = ($facet); + if ('s' eq substr($facet, -1, 1)) { + push @check => substr($facet, 0, -1); + } + else { + push @check => $facet . 's'; + } + + my $found; + for my $check (@check) { + my $mod = "Test2::EventFacet::" . ucfirst($facet); + my $file = pkg_to_file($mod); + next unless eval { require $file; 1 }; + $found = $mod; + last; + } + + return undef unless $found; + $LOADED_FACETS{$facet} = $found; +} + +sub causes_fail { 0 } +sub increments_count { 0 } +sub diagnostics { 0 } +sub no_display { 0 } +sub subtest_id { undef } + +sub callback { } + +sub terminate { () } +sub global { () } +sub sets_plan { () } + +sub summary { ref($_[0]) } + +sub related { + my $self = shift; + my ($event) = @_; + + my $tracea = $self->trace or return undef; + my $traceb = $event->trace or return undef; + + my $uuida = $tracea->uuid; + my $uuidb = $traceb->uuid; + if ($uuida && $uuidb) { + return 1 if $uuida eq $uuidb; + return 0; + } + + my $siga = $tracea->signature or return undef; + my $sigb = $traceb->signature or return undef; + + return 1 if $siga eq $sigb; + return 0; +} + +sub add_hub { + my $self = shift; + unshift @{$self->{+HUBS}} => @_; +} + +sub add_amnesty { + my $self = shift; + + for my $am (@_) { + $am = {%$am} if ref($am) ne 'ARRAY'; + $am = Test2::EventFacet::Amnesty->new($am); + + push @{$self->{+AMNESTY}} => $am; + } +} + +sub common_facet_data { + my $self = shift; + + my %out; + + $out{about} = {package => ref($self) || undef}; + if (my $uuid = $self->uuid) { + $out{about}->{uuid} = $uuid; + } + + if (my $trace = $self->trace) { + $out{trace} = { %$trace }; + } + + if (my $hubs = $self->hubs) { + $out{hubs} = $hubs; + } + + $out{amnesty} = [map {{ %{$_} }} @{$self->{+AMNESTY}}] + if $self->{+AMNESTY}; + + if (my $meta = $self->meta_facet_data) { + $out{meta} = $meta; + } + + return \%out; +} + +sub meta_facet_data { + my $self = shift; + + my $key = Test2::Util::ExternalMeta::META_KEY(); + + my $hash = $self->{$key} or return undef; + return {%$hash}; +} + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{about}->{details} = $self->summary || undef; + $out->{about}->{no_display} = $self->no_display || undef; + + # Might be undef, we want to preserve that + my $terminate = $self->terminate; + $out->{control} = { + global => $self->global || 0, + terminate => $terminate, + has_callback => $self->can('callback') == \&callback ? 0 : 1, + }; + + $out->{assert} = { + no_debug => 1, # Legacy behavior + pass => $self->causes_fail ? 0 : 1, + details => $self->summary, + } if $self->increments_count; + + $out->{parent} = {hid => $self->subtest_id} if $self->subtest_id; + + if (my @plan = $self->sets_plan) { + $out->{plan} = {}; + + $out->{plan}->{count} = $plan[0] if defined $plan[0]; + $out->{plan}->{details} = $plan[2] if defined $plan[2]; + + if ($plan[1]) { + $out->{plan}->{skip} = 1 if $plan[1] eq 'SKIP'; + $out->{plan}->{none} = 1 if $plan[1] eq 'NO PLAN'; + } + + $out->{control}->{terminate} ||= 0 if $out->{plan}->{skip}; + } + + if ($self->causes_fail && !$out->{assert}) { + $out->{errors} = [ + { + tag => 'FAIL', + fail => 1, + details => $self->summary, + } + ]; + } + + my %IGNORE = (trace => 1, about => 1, control => 1); + my $do_info = !grep { !$IGNORE{$_} } keys %$out; + + if ($do_info && !$self->no_display && $self->diagnostics) { + $out->{info} = [ + { + tag => 'DIAG', + debug => 1, + details => $self->summary, + } + ]; + } + + return $out; +} + +sub facets { + my $self = shift; + my %out; + + my $data = $self->facet_data; + my @errors = $self->validate_facet_data($data); + die join "\n" => @errors if @errors; + + for my $facet (keys %$data) { + my $class = $self->load_facet($facet); + my $val = $data->{$facet}; + + unless($class) { + $out{$facet} = $val; + next; + } + + my $is_list = reftype($val) eq 'ARRAY' ? 1 : 0; + if ($is_list) { + $out{$facet} = [map { $class->new($_) } @$val]; + } + else { + $out{$facet} = $class->new($val); + } + } + + return \%out; +} + +sub validate_facet_data { + my $class_or_self = shift; + my ($f, %params); + + $f = shift if @_ && (reftype($_[0]) || '') eq 'HASH'; + %params = @_; + + $f ||= $class_or_self->facet_data if blessed($class_or_self); + croak "No facet data" unless $f; + + my @errors; + + for my $k (sort keys %$f) { + my $fclass = $class_or_self->load_facet($k); + + push @errors => "Could not find a facet class for facet '$k'" + if $params{require_facet_class} && !$fclass; + + next unless $fclass; + + my $v = $f->{$k}; + next unless defined($v); # undef is always fine + + my $is_list = $fclass->is_list(); + my $got_list = reftype($v) eq 'ARRAY' ? 1 : 0; + + push @errors => "Facet '$k' should be a list, but got a single item ($v)" + if $is_list && !$got_list; + + push @errors => "Facet '$k' should not be a list, but got a a list ($v)" + if $got_list && !$is_list; + } + + return @errors; +} + +sub nested { + my $self = shift; + + Carp::cluck("Use of Test2::Event->nested() is deprecated, use Test2::Event->trace->nested instead") + if $ENV{AUTHOR_TESTING}; + + if (my $hubs = $self->{+HUBS}) { + return $hubs->[0]->{nested} if @$hubs; + } + + my $trace = $self->{+TRACE} or return undef; + return $trace->{nested}; +} + +sub in_subtest { + my $self = shift; + + Carp::cluck("Use of Test2::Event->in_subtest() is deprecated, use Test2::Event->trace->hid instead") + if $ENV{AUTHOR_TESTING}; + + my $hubs = $self->{+HUBS}; + if ($hubs && @$hubs) { + return undef unless $hubs->[0]->{nested}; + return $hubs->[0]->{hid} + } + + my $trace = $self->{+TRACE} or return undef; + return undef unless $trace->{nested}; + return $trace->{hid}; +} + +1; + +__END__ + +package Test2::Hub; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Carp qw/carp croak confess/; +use Test2::Util qw/get_tid ipc_separator/; + +use Scalar::Util qw/weaken/; +use List::Util qw/first/; + +use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/; +use Test2::Util::HashBase qw{ + pid tid hid ipc + nested buffered + no_ending + _filters + _pre_filters + _listeners + _follow_ups + _formatter + _context_acquire + _context_init + _context_release + + uuid + active + count + failed + ended + bailed_out + _passing + _plan + skip_reason +}; + +my $UUID_VIA; + +my $ID_POSTFIX = 1; +sub init { + my $self = shift; + + $self->{+PID} = $$; + $self->{+TID} = get_tid(); + $self->{+HID} = join ipc_separator, $self->{+PID}, $self->{+TID}, $ID_POSTFIX++; + + $UUID_VIA ||= Test2::API::_add_uuid_via_ref(); + $self->{+UUID} = ${$UUID_VIA}->('hub') if $$UUID_VIA; + + $self->{+NESTED} = 0 unless defined $self->{+NESTED}; + $self->{+BUFFERED} = 0 unless defined $self->{+BUFFERED}; + + $self->{+COUNT} = 0; + $self->{+FAILED} = 0; + $self->{+_PASSING} = 1; + + if (my $formatter = delete $self->{formatter}) { + $self->format($formatter); + } + + if (my $ipc = $self->{+IPC}) { + $ipc->add_hub($self->{+HID}); + } +} + +sub is_subtest { 0 } + +sub _tb_reset { + my $self = shift; + + # Nothing to do + return if $self->{+PID} == $$ && $self->{+TID} == get_tid(); + + $self->{+PID} = $$; + $self->{+TID} = get_tid(); + $self->{+HID} = join ipc_separator, $self->{+PID}, $self->{+TID}, $ID_POSTFIX++; + + if (my $ipc = $self->{+IPC}) { + $ipc->add_hub($self->{+HID}); + } +} + +sub reset_state { + my $self = shift; + + $self->{+COUNT} = 0; + $self->{+FAILED} = 0; + $self->{+_PASSING} = 1; + + delete $self->{+_PLAN}; + delete $self->{+ENDED}; + delete $self->{+BAILED_OUT}; + delete $self->{+SKIP_REASON}; +} + +sub inherit { + my $self = shift; + my ($from, %params) = @_; + + $self->{+NESTED} ||= 0; + + $self->{+_FORMATTER} = $from->{+_FORMATTER} + unless $self->{+_FORMATTER} || exists($params{formatter}); + + if ($from->{+IPC} && !$self->{+IPC} && !exists($params{ipc})) { + my $ipc = $from->{+IPC}; + $self->{+IPC} = $ipc; + $ipc->add_hub($self->{+HID}); + } + + if (my $ls = $from->{+_LISTENERS}) { + push @{$self->{+_LISTENERS}} => grep { $_->{inherit} } @$ls; + } + + if (my $pfs = $from->{+_PRE_FILTERS}) { + push @{$self->{+_PRE_FILTERS}} => grep { $_->{inherit} } @$pfs; + } + + if (my $fs = $from->{+_FILTERS}) { + push @{$self->{+_FILTERS}} => grep { $_->{inherit} } @$fs; + } +} + +sub format { + my $self = shift; + + my $old = $self->{+_FORMATTER}; + ($self->{+_FORMATTER}) = @_ if @_; + + return $old; +} + +sub is_local { + my $self = shift; + return $$ == $self->{+PID} + && get_tid() == $self->{+TID}; +} + +sub listen { + my $self = shift; + my ($sub, %params) = @_; + + carp "Useless addition of a listener in a child process or thread!" + if $$ != $self->{+PID} || get_tid() != $self->{+TID}; + + croak "listen only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_LISTENERS}} => { %params, code => $sub }; + + $sub; # Intentional return. +} + +sub unlisten { + my $self = shift; + + carp "Useless removal of a listener in a child process or thread!" + if $$ != $self->{+PID} || get_tid() != $self->{+TID}; + + my %subs = map {$_ => $_} @_; + + @{$self->{+_LISTENERS}} = grep { !$subs{$_->{code}} } @{$self->{+_LISTENERS}}; +} + +sub filter { + my $self = shift; + my ($sub, %params) = @_; + + carp "Useless addition of a filter in a child process or thread!" + if $$ != $self->{+PID} || get_tid() != $self->{+TID}; + + croak "filter only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_FILTERS}} => { %params, code => $sub }; + + $sub; # Intentional Return +} + +sub unfilter { + my $self = shift; + carp "Useless removal of a filter in a child process or thread!" + if $$ != $self->{+PID} || get_tid() != $self->{+TID}; + my %subs = map {$_ => $_} @_; + @{$self->{+_FILTERS}} = grep { !$subs{$_->{code}} } @{$self->{+_FILTERS}}; +} + +sub pre_filter { + my $self = shift; + my ($sub, %params) = @_; + + croak "pre_filter only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_PRE_FILTERS}} => { %params, code => $sub }; + + $sub; # Intentional Return +} + +sub pre_unfilter { + my $self = shift; + my %subs = map {$_ => $_} @_; + @{$self->{+_PRE_FILTERS}} = grep { !$subs{$_->{code}} } @{$self->{+_PRE_FILTERS}}; +} + +sub follow_up { + my $self = shift; + my ($sub) = @_; + + carp "Useless addition of a follow-up in a child process or thread!" + if $$ != $self->{+PID} || get_tid() != $self->{+TID}; + + croak "follow_up only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_FOLLOW_UPS}} => $sub; +} + +*add_context_aquire = \&add_context_acquire; +sub add_context_acquire { + my $self = shift; + my ($sub) = @_; + + croak "add_context_acquire only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_CONTEXT_ACQUIRE}} => $sub; + + $sub; # Intentional return. +} + +*remove_context_aquire = \&remove_context_acquire; +sub remove_context_acquire { + my $self = shift; + my %subs = map {$_ => $_} @_; + @{$self->{+_CONTEXT_ACQUIRE}} = grep { !$subs{$_} == $_ } @{$self->{+_CONTEXT_ACQUIRE}}; +} + +sub add_context_init { + my $self = shift; + my ($sub) = @_; + + croak "add_context_init only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_CONTEXT_INIT}} => $sub; + + $sub; # Intentional return. +} + +sub remove_context_init { + my $self = shift; + my %subs = map {$_ => $_} @_; + @{$self->{+_CONTEXT_INIT}} = grep { !$subs{$_} == $_ } @{$self->{+_CONTEXT_INIT}}; +} + +sub add_context_release { + my $self = shift; + my ($sub) = @_; + + croak "add_context_release only takes coderefs for arguments, got '$sub'" + unless ref $sub && ref $sub eq 'CODE'; + + push @{$self->{+_CONTEXT_RELEASE}} => $sub; + + $sub; # Intentional return. +} + +sub remove_context_release { + my $self = shift; + my %subs = map {$_ => $_} @_; + @{$self->{+_CONTEXT_RELEASE}} = grep { !$subs{$_} == $_ } @{$self->{+_CONTEXT_RELEASE}}; +} + +sub send { + my $self = shift; + my ($e) = @_; + + $e->add_hub( + { + details => ref($self), + + buffered => $self->{+BUFFERED}, + hid => $self->{+HID}, + nested => $self->{+NESTED}, + pid => $self->{+PID}, + tid => $self->{+TID}, + uuid => $self->{+UUID}, + + ipc => $self->{+IPC} ? 1 : 0, + } + ); + + $e->set_uuid(${$UUID_VIA}->('event')) if $$UUID_VIA; + + if ($self->{+_PRE_FILTERS}) { + for (@{$self->{+_PRE_FILTERS}}) { + $e = $_->{code}->($self, $e); + return unless $e; + } + } + + my $ipc = $self->{+IPC} || return $self->process($e); + + if($e->global) { + $ipc->send($self->{+HID}, $e, 'GLOBAL'); + return $self->process($e); + } + + return $ipc->send($self->{+HID}, $e) + if $$ != $self->{+PID} || get_tid() != $self->{+TID}; + + $self->process($e); +} + +sub process { + my $self = shift; + my ($e) = @_; + + if ($self->{+_FILTERS}) { + for (@{$self->{+_FILTERS}}) { + $e = $_->{code}->($self, $e); + return unless $e; + } + } + + # Optimize the most common case + my $type = ref($e); + if ($type eq 'Test2::Event::Pass' || ($type eq 'Test2::Event::Ok' && $e->{pass})) { + my $count = ++($self->{+COUNT}); + $self->{+_FORMATTER}->write($e, $count) if $self->{+_FORMATTER}; + + if ($self->{+_LISTENERS}) { + $_->{code}->($self, $e, $count) for @{$self->{+_LISTENERS}}; + } + + return $e; + } + + my $f = $e->facet_data; + + my $fail = 0; + $fail = 1 if $f->{assert} && !$f->{assert}->{pass}; + $fail = 1 if $f->{errors} && grep { $_->{fail} } @{$f->{errors}}; + $fail = 0 if $f->{amnesty}; + + $self->{+COUNT}++ if $f->{assert}; + $self->{+FAILED}++ if $fail && $f->{assert}; + $self->{+_PASSING} = 0 if $fail; + + my $code = $f->{control}->{terminate}; + my $count = $self->{+COUNT}; + + if (my $plan = $f->{plan}) { + if ($plan->{skip}) { + $self->plan('SKIP'); + $self->set_skip_reason($plan->{details} || 1); + $code ||= 0; + } + elsif ($plan->{none}) { + $self->plan('NO PLAN'); + } + else { + $self->plan($plan->{count}); + } + } + + $e->callback($self) if $f->{control}->{has_callback}; + + $self->{+_FORMATTER}->write($e, $count, $f) if $self->{+_FORMATTER}; + + if ($self->{+_LISTENERS}) { + $_->{code}->($self, $e, $count, $f) for @{$self->{+_LISTENERS}}; + } + + if ($f->{control}->{halt}) { + $code ||= 255; + $self->set_bailed_out($e); + } + + if (defined $code) { + $self->{+_FORMATTER}->terminate($e, $f) if $self->{+_FORMATTER}; + $self->terminate($code, $e, $f); + } + + return $e; +} + +sub terminate { + my $self = shift; + my ($code) = @_; + exit($code); +} + +sub cull { + my $self = shift; + + my $ipc = $self->{+IPC} || return; + return if $self->{+PID} != $$ || $self->{+TID} != get_tid(); + + # No need to do IPC checks on culled events + $self->process($_) for $ipc->cull($self->{+HID}); +} + +sub finalize { + my $self = shift; + my ($trace, $do_plan) = @_; + + $self->cull(); + + my $plan = $self->{+_PLAN}; + my $count = $self->{+COUNT}; + my $failed = $self->{+FAILED}; + my $active = $self->{+ACTIVE}; + + # return if NOTHING was done. + unless ($active || $do_plan || defined($plan) || $count || $failed) { + $self->{+_FORMATTER}->finalize($plan, $count, $failed, 0, $self->is_subtest) if $self->{+_FORMATTER}; + return; + } + + unless ($self->{+ENDED}) { + if ($self->{+_FOLLOW_UPS}) { + $_->($trace, $self) for reverse @{$self->{+_FOLLOW_UPS}}; + } + + # These need to be refreshed now + $plan = $self->{+_PLAN}; + $count = $self->{+COUNT}; + $failed = $self->{+FAILED}; + + if (($plan && $plan eq 'NO PLAN') || ($do_plan && !$plan)) { + $self->send( + Test2::Event::Plan->new( + trace => $trace, + max => $count, + ) + ); + } + $plan = $self->{+_PLAN}; + } + + my $frame = $trace->frame; + if($self->{+ENDED}) { + my (undef, $ffile, $fline) = @{$self->{+ENDED}}; + my (undef, $sfile, $sline) = @$frame; + + die <<" EOT" +Test already ended! +First End: $ffile line $fline +Second End: $sfile line $sline + EOT + } + + $self->{+ENDED} = $frame; + my $pass = $self->is_passing(); # Generate the final boolean. + + $self->{+_FORMATTER}->finalize($plan, $count, $failed, $pass, $self->is_subtest) if $self->{+_FORMATTER}; + + return $pass; +} + +sub is_passing { + my $self = shift; + + ($self->{+_PASSING}) = @_ if @_; + + # If we already failed just return 0. + my $pass = $self->{+_PASSING} or return 0; + return $self->{+_PASSING} = 0 if $self->{+FAILED}; + + my $count = $self->{+COUNT}; + my $ended = $self->{+ENDED}; + my $plan = $self->{+_PLAN}; + + return $pass if !$count && $plan && $plan =~ m/^SKIP$/; + + return $self->{+_PASSING} = 0 + if $ended && (!$count || !$plan); + + return $pass unless $plan && $plan =~ m/^\d+$/; + + if ($ended) { + return $self->{+_PASSING} = 0 if $count != $plan; + } + else { + return $self->{+_PASSING} = 0 if $count > $plan; + } + + return $pass; +} + +sub plan { + my $self = shift; + + return $self->{+_PLAN} unless @_; + + my ($plan) = @_; + + confess "You cannot unset the plan" + unless defined $plan; + + confess "You cannot change the plan" + if $self->{+_PLAN} && $self->{+_PLAN} !~ m/^NO PLAN$/; + + confess "'$plan' is not a valid plan! Plan must be an integer greater than 0, 'NO PLAN', or 'SKIP'" + unless $plan =~ m/^(\d+|NO PLAN|SKIP)$/; + + $self->{+_PLAN} = $plan; +} + +sub check_plan { + my $self = shift; + + return undef unless $self->{+ENDED}; + my $plan = $self->{+_PLAN} || return undef; + + return 1 if $plan !~ m/^\d+$/; + + return 1 if $plan == $self->{+COUNT}; + return 0; +} + +sub DESTROY { + my $self = shift; + my $ipc = $self->{+IPC} || return; + return unless $$ == $self->{+PID}; + return unless get_tid() == $self->{+TID}; + $ipc->drop_hub($self->{+HID}); +} + +1; + +__END__ + +package Test2::Formatter; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +my %ADDED; +sub import { + my $class = shift; + return if $class eq __PACKAGE__; + return if $ADDED{$class}++; + require Test2::API; + Test2::API::test2_formatter_add($class); +} + +sub new_root { + my $class = shift; + return $class->new(@_); +} + +sub hide_buffered { 1 } + +sub terminate { } + +sub finalize { } + +1; + +__END__ + +package Test2::Tools::Tiny; +use strict; +use warnings; + +BEGIN { + if ($] lt "5.008") { + require Test::Builder::IO::Scalar; + } +} + +use Scalar::Util qw/blessed/; + +use Test2::Util qw/try/; +use Test2::API qw/context run_subtest test2_stack/; + +use Test2::Hub::Interceptor(); +use Test2::Hub::Interceptor::Terminator(); + +our $VERSION = '1.302133'; + +BEGIN { require Exporter; our @ISA = qw(Exporter) } +our @EXPORT = qw{ + ok is isnt like unlike is_deeply diag note skip_all todo plan done_testing + warnings exception tests capture +}; + +sub ok($;$@) { + my ($bool, $name, @diag) = @_; + my $ctx = context(); + + return $ctx->pass_and_release($name) if $bool; + return $ctx->fail_and_release($name, @diag); +} + +sub is($$;$@) { + my ($got, $want, $name, @diag) = @_; + my $ctx = context(); + + my $bool; + if (defined($got) && defined($want)) { + $bool = "$got" eq "$want"; + } + elsif (defined($got) xor defined($want)) { + $bool = 0; + } + else { # Both are undef + $bool = 1; + } + + return $ctx->pass_and_release($name) if $bool; + + $got = '*NOT DEFINED*' unless defined $got; + $want = '*NOT DEFINED*' unless defined $want; + unshift @diag => ( + "GOT: $got", + "EXPECTED: $want", + ); + + return $ctx->fail_and_release($name, @diag); +} + +sub isnt($$;$@) { + my ($got, $want, $name, @diag) = @_; + my $ctx = context(); + + my $bool; + if (defined($got) && defined($want)) { + $bool = "$got" ne "$want"; + } + elsif (defined($got) xor defined($want)) { + $bool = 1; + } + else { # Both are undef + $bool = 0; + } + + return $ctx->pass_and_release($name) if $bool; + + unshift @diag => "Strings are the same (they should not be)" + unless $bool; + + return $ctx->fail_and_release($name, @diag); +} + +sub like($$;$@) { + my ($thing, $pattern, $name, @diag) = @_; + my $ctx = context(); + + my $bool; + if (defined($thing)) { + $bool = "$thing" =~ $pattern; + unshift @diag => ( + "Value: $thing", + "Does not match: $pattern" + ) unless $bool; + } + else { + $bool = 0; + unshift @diag => "Got an undefined value."; + } + + return $ctx->pass_and_release($name) if $bool; + return $ctx->fail_and_release($name, @diag); +} + +sub unlike($$;$@) { + my ($thing, $pattern, $name, @diag) = @_; + my $ctx = context(); + + my $bool; + if (defined($thing)) { + $bool = "$thing" !~ $pattern; + unshift @diag => ( + "Unexpected pattern match (it should not match)", + "Value: $thing", + "Matches: $pattern" + ) unless $bool; + } + else { + $bool = 0; + unshift @diag => "Got an undefined value."; + } + + return $ctx->pass_and_release($name) if $bool; + return $ctx->fail_and_release($name, @diag); +} + +sub is_deeply($$;$@) { + my ($got, $want, $name, @diag) = @_; + my $ctx = context(); + + no warnings 'once'; + require Data::Dumper; + + # Otherwise numbers might be unquoted + local $Data::Dumper::Useperl = 1; + + local $Data::Dumper::Sortkeys = 1; + local $Data::Dumper::Deparse = 1; + local $Data::Dumper::Freezer = 'XXX'; + local *UNIVERSAL::XXX = sub { + my ($thing) = @_; + if (ref($thing)) { + $thing = {%$thing} if "$thing" =~ m/=HASH/; + $thing = [@$thing] if "$thing" =~ m/=ARRAY/; + $thing = \"$$thing" if "$thing" =~ m/=SCALAR/; + } + $_[0] = $thing; + }; + + my $g = Data::Dumper::Dumper($got); + my $w = Data::Dumper::Dumper($want); + + my $bool = $g eq $w; + + return $ctx->pass_and_release($name) if $bool; + return $ctx->fail_and_release($name, $g, $w, @diag); +} + +sub diag { + my $ctx = context(); + $ctx->diag(join '', @_); + $ctx->release; +} + +sub note { + my $ctx = context(); + $ctx->note(join '', @_); + $ctx->release; +} + +sub skip_all { + my ($reason) = @_; + my $ctx = context(); + $ctx->plan(0, SKIP => $reason); + $ctx->release if $ctx; +} + +sub todo { + my ($reason, $sub) = @_; + my $ctx = context(); + + # This code is mostly copied from Test2::Todo in the Test2-Suite + # distribution. + my $hub = test2_stack->top; + my $filter = $hub->pre_filter( + sub { + my ($active_hub, $event) = @_; + if ($active_hub == $hub) { + $event->set_todo($reason) if $event->can('set_todo'); + $event->add_amnesty({tag => 'TODO', details => $reason}); + } + else { + $event->add_amnesty({tag => 'TODO', details => $reason, inherited => 1}); + } + return $event; + }, + inherit => 1, + todo => $reason, + ); + $sub->(); + $hub->pre_unfilter($filter); + + $ctx->release if $ctx; +} + +sub plan { + my ($max) = @_; + my $ctx = context(); + $ctx->plan($max); + $ctx->release; +} + +sub done_testing { + my $ctx = context(); + $ctx->done_testing; + $ctx->release; +} + +sub warnings(&) { + my $code = shift; + my @warnings; + local $SIG{__WARN__} = sub { push @warnings => @_ }; + $code->(); + return \@warnings; +} + +sub exception(&) { + my $code = shift; + local ($@, $!, $SIG{__DIE__}); + my $ok = eval { $code->(); 1 }; + my $error = $@ || 'SQUASHED ERROR'; + return $ok ? undef : $error; +} + +sub tests { + my ($name, $code) = @_; + my $ctx = context(); + + my $be = caller->can('before_each'); + + $be->($name) if $be; + + my $bool = run_subtest($name, $code, 1); + + $ctx->release; + + return $bool; +} + +sub capture(&) { + my $code = shift; + + my ($err, $out) = ("", ""); + + my $handles = test2_stack->top->format->handles; + my ($ok, $e); + { + my ($out_fh, $err_fh); + + ($ok, $e) = try { + # Scalar refs as filehandles were added in 5.8. + if ($] ge "5.008") { + open($out_fh, '>', \$out) or die "Failed to open a temporary STDOUT: $!"; + open($err_fh, '>', \$err) or die "Failed to open a temporary STDERR: $!"; + } + # Emulate scalar ref filehandles with a tie. + else { + $out_fh = Test::Builder::IO::Scalar->new(\$out) or die "Failed to open a temporary STDOUT"; + $err_fh = Test::Builder::IO::Scalar->new(\$err) or die "Failed to open a temporary STDERR"; + } + + test2_stack->top->format->set_handles([$out_fh, $err_fh, $out_fh]); + + $code->(); + }; + } + test2_stack->top->format->set_handles($handles); + + die $e unless $ok; + + $err =~ s/ $/_/mg; + $out =~ s/ $/_/mg; + + return { + STDOUT => $out, + STDERR => $err, + }; +} + +1; + +__END__ + +package Test2::IPC::Driver; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Carp qw/confess/; +use Test2::Util::HashBase qw{no_fatal no_bail}; + +use Test2::API qw/test2_ipc_add_driver/; + +my %ADDED; +sub import { + my $class = shift; + return if $class eq __PACKAGE__; + return if $ADDED{$class}++; + test2_ipc_add_driver($class); +} + +sub use_shm { 0 } + +for my $meth (qw/send cull add_hub drop_hub waiting is_viable/) { + no strict 'refs'; + *$meth = sub { + my $thing = shift; + confess "'$thing' did not define the required method '$meth'." + }; +} + +# Print the error and call exit. We are not using 'die' cause this is a +# catastrophic error that should never be caught. If we get here it +# means some serious shit has happened in a child process, the only way +# to inform the parent may be to exit false. + +sub abort { + my $self = shift; + chomp(my ($msg) = @_); + + $self->driver_abort($msg) if $self->can('driver_abort'); + + print STDERR "IPC Fatal Error: $msg\n"; + print STDOUT "Bail out! IPC Fatal Error: $msg\n" unless $self->no_bail; + + CORE::exit(255) unless $self->no_fatal; +} + +sub abort_trace { + my $self = shift; + my ($msg) = @_; + # Older versions of Carp do not export longmess() function, so it needs to be called with package name + $self->abort(Carp::longmess($msg)); +} + +1; + +__END__ + +package Test2::IPC::Driver::Files; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::IPC::Driver; our @ISA = qw(Test2::IPC::Driver) } + +use Test2::Util::HashBase qw{tempdir event_ids read_ids timeouts tid pid globals}; + +use Scalar::Util qw/blessed/; +use File::Temp(); +use Storable(); +use File::Spec(); +use POSIX(); + +use Test2::Util qw/try get_tid pkg_to_file IS_WIN32 ipc_separator do_rename do_unlink try_sig_mask/; +use Test2::API qw/test2_ipc_set_pending/; + +sub use_shm { 1 } +sub shm_size() { 64 } + +sub is_viable { 1 } + +sub init { + my $self = shift; + + my $tmpdir = File::Temp::tempdir( + $ENV{T2_TEMPDIR_TEMPLATE} || "test2" . ipc_separator . $$ . ipc_separator . "XXXXXX", + CLEANUP => 0, + TMPDIR => 1, + ); + + $self->abort_trace("Could not get a temp dir") unless $tmpdir; + + $self->{+TEMPDIR} = File::Spec->canonpath($tmpdir); + + print STDERR "\nIPC Temp Dir: $tmpdir\n\n" + if $ENV{T2_KEEP_TEMPDIR}; + + $self->{+EVENT_IDS} = {}; + $self->{+READ_IDS} = {}; + $self->{+TIMEOUTS} = {}; + + $self->{+TID} = get_tid(); + $self->{+PID} = $$; + + $self->{+GLOBALS} = {}; + + return $self; +} + +sub hub_file { + my $self = shift; + my ($hid) = @_; + my $tdir = $self->{+TEMPDIR}; + return File::Spec->catfile($tdir, "HUB" . ipc_separator . $hid); +} + +sub event_file { + my $self = shift; + my ($hid, $e) = @_; + + my $tempdir = $self->{+TEMPDIR}; + my $type = blessed($e) or $self->abort("'$e' is not a blessed object!"); + + $self->abort("'$e' is not an event object!") + unless $type->isa('Test2::Event'); + + my $tid = get_tid(); + my $eid = $self->{+EVENT_IDS}->{$hid}->{$$}->{$tid} += 1; + + my @type = split '::', $type; + my $name = join(ipc_separator, $hid, $$, $tid, $eid, @type); + + return File::Spec->catfile($tempdir, $name); +} + +sub add_hub { + my $self = shift; + my ($hid) = @_; + + my $hfile = $self->hub_file($hid); + + $self->abort_trace("File for hub '$hid' already exists") + if -e $hfile; + + open(my $fh, '>', $hfile) or $self->abort_trace("Could not create hub file '$hid': $!"); + print $fh "$$\n" . get_tid() . "\n"; + close($fh); +} + +sub drop_hub { + my $self = shift; + my ($hid) = @_; + + my $tdir = $self->{+TEMPDIR}; + my $hfile = $self->hub_file($hid); + + $self->abort_trace("File for hub '$hid' does not exist") + unless -e $hfile; + + open(my $fh, '<', $hfile) or $self->abort_trace("Could not open hub file '$hid': $!"); + my ($pid, $tid) = <$fh>; + close($fh); + + $self->abort_trace("A hub file can only be closed by the process that started it\nExpected $pid, got $$") + unless $pid == $$; + + $self->abort_trace("A hub file can only be closed by the thread that started it\nExpected $tid, got " . get_tid()) + unless get_tid() == $tid; + + if ($ENV{T2_KEEP_TEMPDIR}) { + my ($ok, $err) = do_rename($hfile, File::Spec->canonpath("$hfile.complete")); + $self->abort_trace("Could not rename file '$hfile' -> '$hfile.complete': $err") unless $ok + } + else { + my ($ok, $err) = do_unlink($hfile); + $self->abort_trace("Could not remove file for hub '$hid': $err") unless $ok + } + + opendir(my $dh, $tdir) or $self->abort_trace("Could not open temp dir!"); + for my $file (readdir($dh)) { + next if $file =~ m{\.complete$}; + next unless $file =~ m{^$hid}; + $self->abort_trace("Not all files from hub '$hid' have been collected!"); + } + closedir($dh); +} + +sub send { + my $self = shift; + my ($hid, $e, $global) = @_; + + my $tempdir = $self->{+TEMPDIR}; + my $hfile = $self->hub_file($hid); + my $dest = $global ? 'GLOBAL' : $hid; + + $self->abort(<<" EOT") unless $global || -f $hfile; +hub '$hid' is not available, failed to send event! + +There was an attempt to send an event to a hub in a parent process or thread, +but that hub appears to be gone. This can happen if you fork, or start a new +thread from inside subtest, and the parent finishes the subtest before the +child returns. + +This can also happen if the parent process is done testing before the child +finishes. Test2 normally waits automatically in the root process, but will not +do so if Test::Builder is loaded for legacy reasons. + EOT + + my $file = $self->event_file($dest, $e); + my $ready = File::Spec->canonpath("$file.ready"); + + if ($global) { + my $name = $ready; + $name =~ s{^.*(GLOBAL)}{GLOBAL}; + $self->{+GLOBALS}->{$hid}->{$name}++; + } + + # Write and rename the file. + my ($ren_ok, $ren_err); + my ($ok, $err) = try_sig_mask { + Storable::store($e, $file); + ($ren_ok, $ren_err) = do_rename("$file", $ready); + }; + + if ($ok) { + $self->abort("Could not rename file '$file' -> '$ready': $ren_err") unless $ren_ok; + test2_ipc_set_pending(substr($file, -(shm_size))); + } + else { + my $src_file = __FILE__; + $err =~ s{ at \Q$src_file\E.*$}{}; + chomp($err); + my $tid = get_tid(); + my $trace = $e->trace->debug; + my $type = blessed($e); + + $self->abort(<<" EOT"); + +******************************************************************************* +There was an error writing an event: +Destination: $dest +Origin PID: $$ +Origin TID: $tid +Event Type: $type +Event Trace: $trace +File Name: $file +Ready Name: $ready +Error: $err +******************************************************************************* + + EOT + } + + return 1; +} + +sub driver_abort { + my $self = shift; + my ($msg) = @_; + + local ($@, $!, $?, $^E); + eval { + my $abort = File::Spec->catfile($self->{+TEMPDIR}, "ABORT"); + open(my $fh, '>>', $abort) or die "Could not open abort file: $!"; + print $fh $msg, "\n"; + close($fh) or die "Could not close abort file: $!"; + 1; + } or warn $@; +} + +sub cull { + my $self = shift; + my ($hid) = @_; + + my $tempdir = $self->{+TEMPDIR}; + + opendir(my $dh, $tempdir) or $self->abort("could not open IPC temp dir ($tempdir)!"); + + my $read = $self->{+READ_IDS}; + my $timeouts = $self->{+TIMEOUTS}; + + my @out; + for my $info (sort cmp_events map { $self->should_read_event($hid, $_) } readdir($dh)) { + unless ($info->{global}) { + my $next = $self->{+READ_IDS}->{$info->{hid}}->{$info->{pid}}->{$info->{tid}} ||= 1; + + $timeouts->{$info->{file}} ||= time; + + if ($next != $info->{eid}) { + # Wait up to N seconds for missing events + next unless 5 < time - $timeouts->{$info->{file}}; + $self->abort("Missing event HID: $info->{hid}, PID: $info->{pid}, TID: $info->{tid}, EID: $info->{eid}."); + } + + $self->{+READ_IDS}->{$info->{hid}}->{$info->{pid}}->{$info->{tid}} = $info->{eid} + 1; + } + + my $full = $info->{full_path}; + my $obj = $self->read_event_file($full); + push @out => $obj; + + # Do not remove global events + next if $info->{global}; + + if ($ENV{T2_KEEP_TEMPDIR}) { + my $complete = File::Spec->canonpath("$full.complete"); + my ($ok, $err) = do_rename($full, $complete); + $self->abort("Could not rename IPC file '$full', '$complete': $err") unless $ok; + } + else { + my ($ok, $err) = do_unlink("$full"); + $self->abort("Could not unlink IPC file '$full': $err") unless $ok; + } + } + + closedir($dh); + return @out; +} + +sub parse_event_filename { + my $self = shift; + my ($file) = @_; + + # The || is to force 0 in false + my $complete = substr($file, -9, 9) eq '.complete' || 0 and substr($file, -9, 9, ""); + my $ready = substr($file, -6, 6) eq '.ready' || 0 and substr($file, -6, 6, ""); + + my @parts = split ipc_separator, $file; + my ($global, $hid) = $parts[0] eq 'GLOBAL' ? (1, shift @parts) : (0, join ipc_separator, splice(@parts, 0, 3)); + my ($pid, $tid, $eid) = splice(@parts, 0, 3); + my $type = join '::' => @parts; + + return { + file => $file, + ready => $ready, + complete => $complete, + global => $global, + type => $type, + hid => $hid, + pid => $pid, + tid => $tid, + eid => $eid, + }; +} + +sub should_read_event { + my $self = shift; + my ($hid, $file) = @_; + + return if substr($file, 0, 1) eq '.'; + return if substr($file, 0, 3) eq 'HUB'; + CORE::exit(255) if $file eq 'ABORT'; + + my $parsed = $self->parse_event_filename($file); + + return if $parsed->{complete}; + return unless $parsed->{ready}; + return unless $parsed->{global} || $parsed->{hid} eq $hid; + + return if $parsed->{global} && $self->{+GLOBALS}->{$hid}->{$file}++; + + # Untaint the path. + my $full = File::Spec->catfile($self->{+TEMPDIR}, $file); + ($full) = ($full =~ m/^(.*)$/gs) if ${^TAINT}; + + $parsed->{full_path} = $full; + + return $parsed; +} + +sub cmp_events { + # Globals first + return -1 if $a->{global} && !$b->{global}; + return 1 if $b->{global} && !$a->{global}; + + return $a->{pid} <=> $b->{pid} + || $a->{tid} <=> $b->{tid} + || $a->{eid} <=> $b->{eid}; +} + +sub read_event_file { + my $self = shift; + my ($file) = @_; + + my $obj = Storable::retrieve($file); + $self->abort("Got an unblessed object: '$obj'") + unless blessed($obj); + + unless ($obj->isa('Test2::Event')) { + my $pkg = blessed($obj); + my $mod_file = pkg_to_file($pkg); + my ($ok, $err) = try { require $mod_file }; + + $self->abort("Event has unknown type ($pkg), tried to load '$mod_file' but failed: $err") + unless $ok; + + $self->abort("'$obj' is not a 'Test2::Event' object") + unless $obj->isa('Test2::Event'); + } + + return $obj; +} + +sub waiting { + my $self = shift; + require Test2::Event::Waiting; + $self->send( + GLOBAL => Test2::Event::Waiting->new( + trace => Test2::EventFacet::Trace->new(frame => [caller()]), + ), + 'GLOBAL' + ); + return; +} + +sub DESTROY { + my $self = shift; + + return unless defined $self->pid; + return unless defined $self->tid; + + return unless $$ == $self->pid; + return unless get_tid() == $self->tid; + + my $tempdir = $self->{+TEMPDIR}; + + my $aborted = 0; + my $abort_file = File::Spec->catfile($self->{+TEMPDIR}, "ABORT"); + if (-e $abort_file) { + $aborted = 1; + my ($ok, $err) = do_unlink($abort_file); + warn $err unless $ok; + } + + opendir(my $dh, $tempdir) or $self->abort("Could not open temp dir! ($tempdir)"); + while(my $file = readdir($dh)) { + next if $file =~ m/^\.+$/; + next if $file =~ m/\.complete$/; + my $full = File::Spec->catfile($tempdir, $file); + + my $sep = ipc_separator; + if ($aborted || $file =~ m/^(GLOBAL|HUB$sep)/) { + $full =~ m/^(.*)$/; + $full = $1; # Untaint it + next if $ENV{T2_KEEP_TEMPDIR}; + my ($ok, $err) = do_unlink($full); + $self->abort("Could not unlink IPC file '$full': $err") unless $ok; + next; + } + + $self->abort("Leftover files in the directory ($full)!\n"); + } + closedir($dh); + + if ($ENV{T2_KEEP_TEMPDIR}) { + print STDERR "# Not removing temp dir: $tempdir\n"; + return; + } + + my $abort = File::Spec->catfile($self->{+TEMPDIR}, "ABORT"); + unlink($abort) if -e $abort; + rmdir($tempdir) or warn "Could not remove IPC temp dir ($tempdir)"; +} + +1; + +__END__ + +package Test2::Hub::Subtest; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::Hub; our @ISA = qw(Test2::Hub) } +use Test2::Util::HashBase qw/nested exit_code manual_skip_all/; +use Test2::Util qw/get_tid/; + +sub is_subtest { 1 } + +sub inherit { + my $self = shift; + my ($from) = @_; + + $self->SUPER::inherit($from); + + $self->{+NESTED} = $from->nested + 1; +} + +{ + # Legacy + no warnings 'once'; + *ID = \&Test2::Hub::HID; + *id = \&Test2::Hub::hid; + *set_id = \&Test2::Hub::set_hid; +} + +sub send { + my $self = shift; + my ($e) = @_; + + my $out = $self->SUPER::send($e); + + return $out if $self->{+MANUAL_SKIP_ALL}; + + my $f = $e->facet_data; + + my $plan = $f->{plan} or return $out; + return $out unless $plan->{skip}; + + my $trace = $f->{trace} or die "Missing Trace!"; + return $out unless $trace->{pid} != $self->pid + || $trace->{tid} != $self->tid; + + no warnings 'exiting'; + last T2_SUBTEST_WRAPPER; +} + +sub terminate { + my $self = shift; + my ($code, $e, $f) = @_; + $self->set_exit_code($code); + + return if $self->{+MANUAL_SKIP_ALL}; + + $f ||= $e->facet_data; + + if(my $plan = $f->{plan}) { + my $trace = $f->{trace} or die "Missing Trace!"; + return if $plan->{skip} + && ($trace->{pid} != $$ || $trace->{tid} != get_tid); + } + + no warnings 'exiting'; + last T2_SUBTEST_WRAPPER; +} + +1; + +__END__ + +package Test2::Hub::Interceptor; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Test2::Hub::Interceptor::Terminator(); + +BEGIN { require Test2::Hub; our @ISA = qw(Test2::Hub) } +use Test2::Util::HashBase; + +sub init { + my $self = shift; + $self->SUPER::init(); + $self->{+NESTED} = 0; +} + +sub inherit { + my $self = shift; + my ($from, %params) = @_; + + $self->{+NESTED} = 0; + + if ($from->{+IPC} && !$self->{+IPC} && !exists($params{ipc})) { + my $ipc = $from->{+IPC}; + $self->{+IPC} = $ipc; + $ipc->add_hub($self->{+HID}); + } +} + +sub terminate { + my $self = shift; + my ($code) = @_; + + eval { + no warnings 'exiting'; + last T2_SUBTEST_WRAPPER; + }; + my $err = $@; + + # Fallback + die bless(\$err, 'Test2::Hub::Interceptor::Terminator'); +} + +1; + +__END__ + +package Test2::Hub::Interceptor::Terminator; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +1; + +__END__ + +package Test2::Formatter::TAP; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Test2::Util qw/clone_io/; + +use Test2::Util::HashBase qw{ + no_numbers handles _encoding _last_fh + -made_assertion +}; + +sub OUT_STD() { 0 } +sub OUT_ERR() { 1 } + +BEGIN { require Test2::Formatter; our @ISA = qw(Test2::Formatter) } + +sub _autoflush { + my($fh) = pop; + my $old_fh = select $fh; + $| = 1; + select $old_fh; +} + +_autoflush(\*STDOUT); +_autoflush(\*STDERR); + +sub hide_buffered { 1 } + +sub init { + my $self = shift; + + $self->{+HANDLES} ||= $self->_open_handles; + if(my $enc = delete $self->{encoding}) { + $self->encoding($enc); + } +} + +sub _open_handles { + my $self = shift; + + require Test2::API; + my $out = clone_io(Test2::API::test2_stdout()); + my $err = clone_io(Test2::API::test2_stderr()); + + _autoflush($out); + _autoflush($err); + + return [$out, $err]; +} + +sub encoding { + my $self = shift; + + if ($] ge "5.007003" and @_) { + my ($enc) = @_; + my $handles = $self->{+HANDLES}; + + # https://rt.perl.org/Public/Bug/Display.html?id=31923 + # If utf8 is requested we use ':utf8' instead of ':encoding(utf8)' in + # order to avoid the thread segfault. + if ($enc =~ m/^utf-?8$/i) { + binmode($_, ":utf8") for @$handles; + } + else { + binmode($_, ":encoding($enc)") for @$handles; + } + $self->{+_ENCODING} = $enc; + } + + return $self->{+_ENCODING}; +} + +if ($^C) { + no warnings 'redefine'; + *write = sub {}; +} +sub write { + my ($self, $e, $num, $f) = @_; + + # The most common case, a pass event with no amnesty and a normal name. + return if $self->print_optimal_pass($e, $num); + + $f ||= $e->facet_data; + + $self->encoding($f->{control}->{encoding}) if $f->{control}->{encoding}; + + my @tap = $self->event_tap($f, $num) or return; + + $self->{+MADE_ASSERTION} = 1 if $f->{assert}; + + my $nesting = $f->{trace}->{nested} || 0; + my $handles = $self->{+HANDLES}; + my $indent = ' ' x $nesting; + + # Local is expensive! Only do it if we really need to. + local($\, $,) = (undef, '') if $\ || $,; + for my $set (@tap) { + no warnings 'uninitialized'; + my ($hid, $msg) = @$set; + next unless $msg; + my $io = $handles->[$hid] or next; + + print $io "\n" + if $ENV{HARNESS_ACTIVE} + && !$ENV{HARNESS_IS_VERBOSE} + && $hid == OUT_ERR + && $self->{+_LAST_FH} != $io + && $msg =~ m/^#\s*Failed test /; + + $msg =~ s/^/$indent/mg if $nesting; + print $io $msg; + $self->{+_LAST_FH} = $io; + } +} + +sub print_optimal_pass { + my ($self, $e, $num) = @_; + + my $type = ref($e); + + # Only optimal if this is a Pass or a passing Ok + return unless $type eq 'Test2::Event::Pass' || ($type eq 'Test2::Event::Ok' && $e->{pass}); + + # Amnesty requires further processing (todo is a form of amnesty) + return if ($e->{amnesty} && @{$e->{amnesty}}) || defined($e->{todo}); + + # A name with a newline or hash symbol needs extra processing + return if defined($e->{name}) && (-1 != index($e->{name}, "\n") || -1 != index($e->{name}, '#')); + + my $ok = 'ok'; + $ok .= " $num" if $num && !$self->{+NO_NUMBERS}; + $ok .= defined($e->{name}) ? " - $e->{name}\n" : "\n"; + + if (my $nesting = $e->{trace}->{nested}) { + my $indent = ' ' x $nesting; + $ok = "$indent$ok"; + } + + my $io = $self->{+HANDLES}->[OUT_STD]; + + local($\, $,) = (undef, '') if $\ || $,; + print $io $ok; + $self->{+_LAST_FH} = $io; + + return 1; +} + +sub event_tap { + my ($self, $f, $num) = @_; + + my @tap; + + # If this IS the first event the plan should come first + # (plan must be before or after assertions, not in the middle) + push @tap => $self->plan_tap($f) if $f->{plan} && !$self->{+MADE_ASSERTION}; + + # The assertion is most important, if present. + if ($f->{assert}) { + push @tap => $self->assert_tap($f, $num); + push @tap => $self->debug_tap($f, $num) unless $f->{assert}->{no_debug} || $f->{assert}->{pass}; + } + + # Almost as important as an assertion + push @tap => $self->error_tap($f) if $f->{errors}; + + # Now lets see the diagnostics messages + push @tap => $self->info_tap($f) if $f->{info}; + + # If this IS NOT the first event the plan should come last + # (plan must be before or after assertions, not in the middle) + push @tap => $self->plan_tap($f) if $self->{+MADE_ASSERTION} && $f->{plan}; + + # Bail out + push @tap => $self->halt_tap($f) if $f->{control}->{halt}; + + return @tap if @tap; + return @tap if $f->{control}->{halt}; + return @tap if grep { $f->{$_} } qw/assert plan info errors/; + + # Use the summary as a fallback if nothing else is usable. + return $self->summary_tap($f, $num); +} + +sub error_tap { + my $self = shift; + my ($f) = @_; + + my $IO = ($f->{amnesty} && @{$f->{amnesty}}) ? OUT_STD : OUT_ERR; + + return map { + my $details = $_->{details}; + + my $msg; + if (ref($details)) { + require Data::Dumper; + my $dumper = Data::Dumper->new([$details])->Indent(2)->Terse(1)->Pad('# ')->Useqq(1)->Sortkeys(1); + chomp($msg = $dumper->Dump); + } + else { + chomp($msg = $details); + $msg =~ s/^/# /; + $msg =~ s/\n/\n# /g; + } + + [$IO, "$msg\n"]; + } @{$f->{errors}}; +} + +sub plan_tap { + my $self = shift; + my ($f) = @_; + my $plan = $f->{plan} or return; + + return if $plan->{none}; + + if ($plan->{skip}) { + my $reason = $plan->{details} or return [OUT_STD, "1..0 # SKIP\n"]; + chomp($reason); + return [OUT_STD, '1..0 # SKIP ' . $reason . "\n"]; + } + + return [OUT_STD, "1.." . $plan->{count} . "\n"]; +} + +sub no_subtest_space { 0 } +sub assert_tap { + my $self = shift; + my ($f, $num) = @_; + + my $assert = $f->{assert} or return; + my $pass = $assert->{pass}; + my $name = $assert->{details}; + + my $ok = $pass ? 'ok' : 'not ok'; + $ok .= " $num" if $num && !$self->{+NO_NUMBERS}; + + # The regex form is ~250ms, the index form is ~50ms + my @extra; + defined($name) && ( + (index($name, "\n") != -1 && (($name, @extra) = split(/\n\r?/, $name, -1))), + ((index($name, "#" ) != -1 || substr($name, -1) eq '\\') && (($name =~ s|\\|\\\\|g), ($name =~ s|#|\\#|g))) + ); + + my $extra_space = @extra ? ' ' x (length($ok) + 2) : ''; + my $extra_indent = ''; + + my ($directives, $reason, $is_skip); + if ($f->{amnesty}) { + my %directives; + + for my $am (@{$f->{amnesty}}) { + next if $am->{inherited}; + my $tag = $am->{tag} or next; + $is_skip = 1 if $tag eq 'skip'; + + $directives{$tag} ||= $am->{details}; + } + + my %seen; + my @order = grep { !$seen{$_}++ } sort keys %directives; + + $directives = ' # ' . join ' & ' => @order; + + for my $tag ('skip', @order) { + next unless defined($directives{$tag}) && length($directives{$tag}); + $reason = $directives{$tag}; + last; + } + } + + $ok .= " - $name" if defined $name && !($is_skip && !$name); + + my @subtap; + if ($f->{parent} && $f->{parent}->{buffered}) { + $ok .= ' {'; + + # In a verbose harness we indent the extra since they will appear + # inside the subtest braces. This helps readability. In a non-verbose + # harness we do not do this because it is less readable. + if ($ENV{HARNESS_IS_VERBOSE} || !$ENV{HARNESS_ACTIVE}) { + $extra_indent = " "; + $extra_space = ' '; + } + + # Render the sub-events, we use our own counter for these. + my $count = 0; + @subtap = map { + my $f2 = $_; + + # Bump the count for any event that should bump it. + $count++ if $f2->{assert}; + + # This indents all output lines generated for the sub-events. + # index 0 is the filehandle, index 1 is the message we want to indent. + map { $_->[1] =~ s/^(.*\S.*)$/ $1/mg; $_ } $self->event_tap($f2, $count); + } @{$f->{parent}->{children}}; + + push @subtap => [OUT_STD, "}\n"]; + } + + if ($directives) { + $directives = ' # TODO & SKIP' if $directives eq ' # TODO & skip'; + $ok .= $directives; + $ok .= " $reason" if defined($reason); + } + + $extra_space = ' ' if $self->no_subtest_space; + + my @out = ([OUT_STD, "$ok\n"]); + push @out => map {[OUT_STD, "${extra_indent}#${extra_space}$_\n"]} @extra if @extra; + push @out => @subtap; + + return @out; +} + +sub debug_tap { + my ($self, $f, $num) = @_; + + # Figure out the debug info, this is typically the file name and line + # number, but can also be a custom message. If no trace object is provided + # then we have nothing useful to display. + my $name = $f->{assert}->{details}; + my $trace = $f->{trace}; + + my $debug = "[No trace info available]"; + if ($trace->{details}) { + $debug = $trace->{details}; + } + elsif ($trace->{frame}) { + my ($pkg, $file, $line) = @{$trace->{frame}}; + $debug = "at $file line $line." if $file && $line; + } + + my $amnesty = $f->{amnesty} && @{$f->{amnesty}} + ? ' (with amnesty)' + : ''; + + # Create the initial diagnostics. If the test has a name we put the debug + # info on a second line, this behavior is inherited from Test::Builder. + my $msg = defined($name) + ? qq[# Failed test${amnesty} '$name'\n# $debug\n] + : qq[# Failed test${amnesty} $debug\n]; + + my $IO = $f->{amnesty} && @{$f->{amnesty}} ? OUT_STD : OUT_ERR; + + return [$IO, $msg]; +} + +sub halt_tap { + my ($self, $f) = @_; + + return if $f->{trace}->{nested} && !$f->{trace}->{buffered}; + my $details = $f->{control}->{details}; + + return [OUT_STD, "Bail out!\n"] unless defined($details) && length($details); + return [OUT_STD, "Bail out! $details\n"]; +} + +sub info_tap { + my ($self, $f) = @_; + + return map { + my $details = $_->{details}; + + my $IO = $_->{debug} && !($f->{amnesty} && @{$f->{amnesty}}) ? OUT_ERR : OUT_STD; + + my $msg; + if (ref($details)) { + require Data::Dumper; + my $dumper = Data::Dumper->new([$details])->Indent(2)->Terse(1)->Pad('# ')->Useqq(1)->Sortkeys(1); + chomp($msg = $dumper->Dump); + } + else { + chomp($msg = $details); + $msg =~ s/^/# /; + $msg =~ s/\n/\n# /g; + } + + [$IO, "$msg\n"]; + } @{$f->{info}}; +} + +sub summary_tap { + my ($self, $f, $num) = @_; + + return if $f->{about}->{no_display}; + + my $summary = $f->{about}->{details} or return; + chomp($summary); + $summary =~ s/^/# /smg; + + return [OUT_STD, "$summary\n"]; +} + +1; + +__END__ + +package Test2::Util::Facets2Legacy; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Carp qw/croak confess/; +use Scalar::Util qw/blessed/; + +use base 'Exporter'; +our @EXPORT_OK = qw{ + causes_fail + diagnostics + global + increments_count + no_display + sets_plan + subtest_id + summary + terminate + uuid +}; +our %EXPORT_TAGS = ( ALL => \@EXPORT_OK ); + +our $CYCLE_DETECT = 0; +sub _get_facet_data { + my $in = shift; + + if (blessed($in) && $in->isa('Test2::Event')) { + confess "Cycle between Facets2Legacy and $in\->facet_data() (Did you forget to override the facet_data() method?)" + if $CYCLE_DETECT; + + local $CYCLE_DETECT = 1; + return $in->facet_data; + } + + return $in if ref($in) eq 'HASH'; + + croak "'$in' Does not appear to be either a Test::Event or an EventFacet hashref"; +} + +sub causes_fail { + my $facet_data = _get_facet_data(shift @_); + + return 1 if $facet_data->{errors} && grep { $_->{fail} } @{$facet_data->{errors}}; + + if (my $control = $facet_data->{control}) { + return 1 if $control->{halt}; + return 1 if $control->{terminate}; + } + + return 0 if $facet_data->{amnesty} && @{$facet_data->{amnesty}}; + return 1 if $facet_data->{assert} && !$facet_data->{assert}->{pass}; + return 0; +} + +sub diagnostics { + my $facet_data = _get_facet_data(shift @_); + return 1 if $facet_data->{errors} && @{$facet_data->{errors}}; + return 0 unless $facet_data->{info} && @{$facet_data->{info}}; + return (grep { $_->{debug} } @{$facet_data->{info}}) ? 1 : 0; +} + +sub global { + my $facet_data = _get_facet_data(shift @_); + return 0 unless $facet_data->{control}; + return $facet_data->{control}->{global}; +} + +sub increments_count { + my $facet_data = _get_facet_data(shift @_); + return $facet_data->{assert} ? 1 : 0; +} + +sub no_display { + my $facet_data = _get_facet_data(shift @_); + return 0 unless $facet_data->{about}; + return $facet_data->{about}->{no_display}; +} + +sub sets_plan { + my $facet_data = _get_facet_data(shift @_); + my $plan = $facet_data->{plan} or return; + my @out = ($plan->{count} || 0); + + if ($plan->{skip}) { + push @out => 'SKIP'; + push @out => $plan->{details} if defined $plan->{details}; + } + elsif ($plan->{none}) { + push @out => 'NO PLAN' + } + + return @out; +} + +sub subtest_id { + my $facet_data = _get_facet_data(shift @_); + return undef unless $facet_data->{parent}; + return $facet_data->{parent}->{hid}; +} + +sub summary { + my $facet_data = _get_facet_data(shift @_); + return '' unless $facet_data->{about} && $facet_data->{about}->{details}; + return $facet_data->{about}->{details}; +} + +sub terminate { + my $facet_data = _get_facet_data(shift @_); + return undef unless $facet_data->{control}; + return $facet_data->{control}->{terminate}; +} + +sub uuid { + my $in = shift; + + if ($CYCLE_DETECT) { + if (blessed($in) && $in->isa('Test2::Event')) { + my $meth = $in->can('uuid'); + $meth = $in->can('SUPER::uuid') if $meth == \&uuid; + my $uuid = $in->$meth if $meth && $meth != \&uuid; + return $uuid if $uuid; + } + + return undef; + } + + my $facet_data = _get_facet_data($in); + return $facet_data->{about}->{uuid} if $facet_data->{about} && $facet_data->{about}->{uuid}; + + return undef; +} + +1; + +package Test2::Util::HashBase; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +################################################################# +# # +# This is a generated file! Do not modify this file directly! # +# Use hashbase_inc.pl script to regenerate this file. # +# The script is part of the Object::HashBase distribution. # +# Note: You can modify the version number above this comment # +# if needed, that is fine. # +# # +################################################################# + +{ + no warnings 'once'; + $Test2::Util::HashBase::HB_VERSION = '0.006'; + *Test2::Util::HashBase::ATTR_SUBS = \%Object::HashBase::ATTR_SUBS; + *Test2::Util::HashBase::ATTR_LIST = \%Object::HashBase::ATTR_LIST; + *Test2::Util::HashBase::VERSION = \%Object::HashBase::VERSION; + *Test2::Util::HashBase::CAN_CACHE = \%Object::HashBase::CAN_CACHE; +} + + +require Carp; +{ + no warnings 'once'; + $Carp::Internal{+__PACKAGE__} = 1; +} + +BEGIN { + # these are not strictly equivalent, but for out use we don't care + # about order + *_isa = ($] >= 5.010 && require mro) ? \&mro::get_linear_isa : sub { + no strict 'refs'; + my @packages = ($_[0]); + my %seen; + for my $package (@packages) { + push @packages, grep !$seen{$_}++, @{"$package\::ISA"}; + } + return \@packages; + } +} + +my %STRIP = ( + '^' => 1, + '-' => 1, +); + +sub import { + my $class = shift; + my $into = caller; + + # Make sure we list the OLDEST version used to create this class. + my $ver = $Test2::Util::HashBase::HB_VERSION || $Test2::Util::HashBase::VERSION; + $Test2::Util::HashBase::VERSION{$into} = $ver if !$Test2::Util::HashBase::VERSION{$into} || $Test2::Util::HashBase::VERSION{$into} > $ver; + + my $isa = _isa($into); + my $attr_list = $Test2::Util::HashBase::ATTR_LIST{$into} ||= []; + my $attr_subs = $Test2::Util::HashBase::ATTR_SUBS{$into} ||= {}; + + my %subs = ( + ($into->can('new') ? () : (new => \&_new)), + (map %{$Test2::Util::HashBase::ATTR_SUBS{$_} || {}}, @{$isa}[1 .. $#$isa]), + ( + map { + my $p = substr($_, 0, 1); + my $x = $_; + substr($x, 0, 1) = '' if $STRIP{$p}; + push @$attr_list => $x; + my ($sub, $attr) = (uc $x, $x); + $sub => ($attr_subs->{$sub} = sub() { $attr }), + $attr => sub { $_[0]->{$attr} }, + $p eq '-' ? ("set_$attr" => sub { Carp::croak("'$attr' is read-only") }) + : $p eq '^' ? ("set_$attr" => sub { Carp::carp("set_$attr() is deprecated"); $_[0]->{$attr} = $_[1] }) + : ("set_$attr" => sub { $_[0]->{$attr} = $_[1] }), + } @_ + ), + ); + + no strict 'refs'; + *{"$into\::$_"} = $subs{$_} for keys %subs; +} + +sub attr_list { + my $class = shift; + + my $isa = _isa($class); + + my %seen; + my @list = grep { !$seen{$_}++ } map { + my @out; + + if (0.004 > ($Test2::Util::HashBase::VERSION{$_} || 0)) { + Carp::carp("$_ uses an inlined version of Test2::Util::HashBase too old to support attr_list()"); + } + else { + my $list = $Test2::Util::HashBase::ATTR_LIST{$_}; + @out = $list ? @$list : () + } + + @out; + } reverse @$isa; + + return @list; +} + +sub _new { + my $class = shift; + + my $self; + + if (@_ == 1) { + my $arg = shift; + my $type = ref($arg); + + if ($type eq 'HASH') { + $self = bless({%$arg}, $class) + } + else { + Carp::croak("Not sure what to do with '$type' in $class constructor") + unless $type eq 'ARRAY'; + + my %proto; + my @attributes = attr_list($class); + while (@$arg) { + my $val = shift @$arg; + my $key = shift @attributes or Carp::croak("Too many arguments for $class constructor"); + $proto{$key} = $val; + } + + $self = bless(\%proto, $class); + } + } + else { + $self = bless({@_}, $class); + } + + $Test2::Util::HashBase::CAN_CACHE{$class} = $self->can('init') + unless exists $Test2::Util::HashBase::CAN_CACHE{$class}; + + $self->init if $Test2::Util::HashBase::CAN_CACHE{$class}; + + $self; +} + +1; + +__END__ + +package Test2::Util::Trace; +require Test2::EventFacet::Trace; +@ISA = ('Test2::EventFacet::Trace'); + +our $VERSION = '1.302133'; + +1; + +__END__ + +package Test2::Util::ExternalMeta; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Carp qw/croak/; + +sub META_KEY() { '_meta' } + +our @EXPORT = qw/meta set_meta get_meta delete_meta/; +BEGIN { require Exporter; our @ISA = qw(Exporter) } + +sub set_meta { + my $self = shift; + my ($key, $value) = @_; + + validate_key($key); + + $self->{+META_KEY} ||= {}; + $self->{+META_KEY}->{$key} = $value; +} + +sub get_meta { + my $self = shift; + my ($key) = @_; + + validate_key($key); + + my $meta = $self->{+META_KEY} or return undef; + return $meta->{$key}; +} + +sub delete_meta { + my $self = shift; + my ($key) = @_; + + validate_key($key); + + my $meta = $self->{+META_KEY} or return undef; + delete $meta->{$key}; +} + +sub meta { + my $self = shift; + my ($key, $default) = @_; + + validate_key($key); + + my $meta = $self->{+META_KEY}; + return undef unless $meta || defined($default); + + unless($meta) { + $meta = {}; + $self->{+META_KEY} = $meta; + } + + $meta->{$key} = $default + if defined($default) && !defined($meta->{$key}); + + return $meta->{$key}; +} + +sub validate_key { + my $key = shift; + + return if $key && !ref($key); + + my $render_key = defined($key) ? "'$key'" : 'undef'; + croak "Invalid META key: $render_key, keys must be true, and may not be references"; +} + +1; + +__END__ + +package Test2::EventFacet::Parent; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Carp qw/confess/; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -hid -children -buffered }; + +sub init { + confess "Attribute 'hid' must be set" + unless defined $_[0]->{+HID}; + + $_[0]->{+CHILDREN} ||= []; +} + +1; + +__END__ + +package Test2::EventFacet::Meta; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use vars qw/$AUTOLOAD/; + +# replace set_details +{ + no warnings 'redefine'; + sub set_details { $_[0]->{'set_details'} } +} + +sub can { + my $self = shift; + my ($name) = @_; + + my $existing = $self->SUPER::can($name); + return $existing if $existing; + + # Only vivify when called on an instance, do not vivify for a class. There + # are a lot of magic class methods used in things like serialization (or + # the forks.pm module) which cause problems when vivified. + return undef unless ref($self); + + my $sub = sub { $_[0]->{$name} }; + { + no strict 'refs'; + *$name = $sub; + } + + return $sub; +} + +sub AUTOLOAD { + my $name = $AUTOLOAD; + $name =~ s/^.*:://g; + my $sub = $_[0]->can($name); + goto &$sub; +} + +1; + +__END__ + +package Test2::EventFacet::Amnesty; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +sub is_list { 1 } + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -tag -inherited }; + +1; + +__END__ + +package Test2::EventFacet::Info; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +sub is_list { 1 } + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{-tag -debug -important}; + +1; + +__END__ + +package Test2::EventFacet::Assert; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -pass -no_debug -number }; + +1; + +__END__ + +package Test2::EventFacet::Render; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +sub is_list { 1 } + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -tag -facet -mode }; + +1; + +__END__ + +package Test2::EventFacet::Error; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +sub facet_key { 'errors' } +sub is_list { 1 } + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -tag -fail }; + +1; + +__END__ + +package Test2::EventFacet::Trace; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } + +use Test2::Util qw/get_tid pkg_to_file/; +use Carp qw/confess/; + +use Test2::Util::HashBase qw{^frame ^pid ^tid ^cid -hid -nested details -buffered -uuid -huuid}; + +{ + no warnings 'once'; + *DETAIL = \&DETAILS; + *detail = \&details; + *set_detail = \&set_details; +} + +sub init { + confess "The 'frame' attribute is required" + unless $_[0]->{+FRAME}; + + $_[0]->{+DETAILS} = delete $_[0]->{detail} if $_[0]->{detail}; + + $_[0]->{+PID} = $$ unless defined $_[0]->{+PID}; + $_[0]->{+TID} = get_tid() unless defined $_[0]->{+TID}; +} + +sub snapshot { + my ($orig, @override) = @_; + bless {%$orig, @override}, __PACKAGE__; +} + +sub signature { + my $self = shift; + + # Signature is only valid if all of these fields are defined, there is no + # signature if any is missing. '0' is ok, but '' is not. + return join ':' => map { (defined($_) && length($_)) ? $_ : return undef } ( + $self->{+CID}, + $self->{+PID}, + $self->{+TID}, + $self->{+FRAME}->[1], + $self->{+FRAME}->[2], + ); +} + +sub debug { + my $self = shift; + return $self->{+DETAILS} if $self->{+DETAILS}; + my ($pkg, $file, $line) = $self->call; + return "at $file line $line"; +} + +sub alert { + my $self = shift; + my ($msg) = @_; + warn $msg . ' ' . $self->debug . ".\n"; +} + +sub throw { + my $self = shift; + my ($msg) = @_; + die $msg . ' ' . $self->debug . ".\n"; +} + +sub call { @{$_[0]->{+FRAME}} } + +sub package { $_[0]->{+FRAME}->[0] } +sub file { $_[0]->{+FRAME}->[1] } +sub line { $_[0]->{+FRAME}->[2] } +sub subname { $_[0]->{+FRAME}->[3] } + +1; + +__END__ + +package Test2::EventFacet::Hub; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +sub is_list { 1 } +sub facet_key { 'hubs' } + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{-pid -tid -hid -nested -buffered -uuid -ipc}; + +1; + +__END__ + +package Test2::EventFacet::Control; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -global -terminate -halt -has_callback -encoding }; + +1; + +__END__ + +package Test2::EventFacet::About; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -package -no_display -uuid }; + +1; + +__END__ + +package Test2::EventFacet::Plan; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::EventFacet; our @ISA = qw(Test2::EventFacet) } +use Test2::Util::HashBase qw{ -count -skip -none }; + +1; + +__END__ + +package Test2::Event::Waiting; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase; + +sub global { 1 }; + +sub summary { "IPC is waiting for children to finish..." } + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + push @{$out->{info}} => { + tag => 'INFO', + debug => 0, + details => $self->summary, + }; + + return $out; +} + +1; + +__END__ + +package Test2::Event::V2; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Scalar::Util qw/reftype/; +use Carp qw/croak/; + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } + +use Test2::Util::Facets2Legacy qw{ + causes_fail diagnostics global increments_count no_display sets_plan + subtest_id summary terminate +}; + +use Test2::Util::HashBase qw/-about/; + +sub non_facet_keys { + return ( + +UUID, + Test2::Util::ExternalMeta::META_KEY(), + ); +} + +sub init { + my $self = shift; + + my $uuid; + if ($uuid = $self->{+UUID}) { + croak "uuid '$uuid' passed to constructor, but uuid '$self->{+ABOUT}->{uuid}' is already set in the 'about' facet" + if $self->{+ABOUT}->{uuid} && $self->{+ABOUT}->{uuid} ne $uuid; + + $self->{+ABOUT}->{uuid} = $uuid; + } + elsif ($uuid = $self->{+ABOUT}->{uuid}) { + $self->SUPER::set_uuid($uuid); + } + + # Clone the trace, make sure it is blessed + if (my $trace = $self->{+TRACE}) { + $self->{+TRACE} = Test2::EventFacet::Trace->new(%$trace); + } +} + +sub set_uuid { + my $self = shift; + my ($uuid) = @_; + $self->{+ABOUT}->{uuid} = $uuid; + $self->SUPER::set_uuid($uuid); +} + +sub facet_data { + my $self = shift; + my $f = { %{$self} }; + + delete $f->{$_} for $self->non_facet_keys; + + my %out; + for my $k (keys %$f) { + next if substr($k, 0, 1) eq '_'; + + my $data = $f->{$k}; + my $is_list = reftype($data) eq 'ARRAY'; + $out{$k} = $is_list ? [ map { {%{$_}} } @$data ] : {%$data}; + } + + if (my $meta = $self->meta_facet_data) { + $out{meta} = {%$meta, %{$out{meta} || {}}}; + } + + return \%out; +} + +1; + +__END__ + +package Test2::Event::Bail; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw{reason buffered}; + +# Make sure the tests terminate +sub terminate { 255 }; + +sub global { 1 }; + +sub causes_fail { 1 } + +sub summary { + my $self = shift; + return "Bail out! " . $self->{+REASON} + if $self->{+REASON}; + + return "Bail out!"; +} + +sub diagnostics { 1 } + +sub facet_data { + my $self = shift; + my $out = $self->common_facet_data; + + $out->{control} = { + global => 1, + halt => 1, + details => $self->{+REASON}, + terminate => 255, + }; + + return $out; +} + +1; + +__END__ + +package Test2::Event::Ok; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw{ + pass effective_pass name todo +}; + +sub init { + my $self = shift; + + # Do not store objects here, only true or false + $self->{+PASS} = $self->{+PASS} ? 1 : 0; + $self->{+EFFECTIVE_PASS} = $self->{+PASS} || (defined($self->{+TODO}) ? 1 : 0); +} + +{ + no warnings 'redefine'; + sub set_todo { + my $self = shift; + my ($todo) = @_; + $self->{+TODO} = $todo; + $self->{+EFFECTIVE_PASS} = defined($todo) ? 1 : $self->{+PASS}; + } +} + +sub increments_count { 1 }; + +sub causes_fail { !$_[0]->{+EFFECTIVE_PASS} } + +sub summary { + my $self = shift; + + my $name = $self->{+NAME} || "Nameless Assertion"; + + my $todo = $self->{+TODO}; + if ($todo) { + $name .= " (TODO: $todo)"; + } + elsif (defined $todo) { + $name .= " (TODO)" + } + + return $name; +} + +sub extra_amnesty { + my $self = shift; + return unless defined($self->{+TODO}) || ($self->{+EFFECTIVE_PASS} && !$self->{+PASS}); + return { + tag => 'TODO', + details => $self->{+TODO}, + }; +} + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{assert} = { + no_debug => 1, # Legacy behavior + pass => $self->{+PASS}, + details => $self->{+NAME}, + }; + + if (my @exra_amnesty = $self->extra_amnesty) { + unshift @{$out->{amnesty}} => @exra_amnesty; + } + + return $out; +} + +1; + +__END__ + +package Test2::Event::Subtest; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::Event::Ok; our @ISA = qw(Test2::Event::Ok) } +use Test2::Util::HashBase qw{subevents buffered subtest_id subtest_uuid}; + +sub init { + my $self = shift; + $self->SUPER::init(); + $self->{+SUBEVENTS} ||= []; + if ($self->{+EFFECTIVE_PASS}) { + $_->set_effective_pass(1) for grep { $_->can('effective_pass') } @{$self->{+SUBEVENTS}}; + } +} + +{ + no warnings 'redefine'; + + sub set_subevents { + my $self = shift; + my @subevents = @_; + + if ($self->{+EFFECTIVE_PASS}) { + $_->set_effective_pass(1) for grep { $_->can('effective_pass') } @subevents; + } + + $self->{+SUBEVENTS} = \@subevents; + } + + sub set_effective_pass { + my $self = shift; + my ($pass) = @_; + + if ($pass) { + $_->set_effective_pass(1) for grep { $_->can('effective_pass') } @{$self->{+SUBEVENTS}}; + } + elsif ($self->{+EFFECTIVE_PASS} && !$pass) { + for my $s (grep { $_->can('effective_pass') } @{$self->{+SUBEVENTS}}) { + $_->set_effective_pass(0) unless $s->can('todo') && defined $s->todo; + } + } + + $self->{+EFFECTIVE_PASS} = $pass; + } +} + +sub summary { + my $self = shift; + + my $name = $self->{+NAME} || "Nameless Subtest"; + + my $todo = $self->{+TODO}; + if ($todo) { + $name .= " (TODO: $todo)"; + } + elsif (defined $todo) { + $name .= " (TODO)"; + } + + return $name; +} + +sub facet_data { + my $self = shift; + + my $out = $self->SUPER::facet_data(); + + $out->{parent} = { + hid => $self->subtest_id, + children => [map {$_->facet_data} @{$self->{+SUBEVENTS}}], + buffered => $self->{+BUFFERED}, + }; + + return $out; +} + +sub add_amnesty { + my $self = shift; + + for my $am (@_) { + $am = {%$am} if ref($am) ne 'ARRAY'; + $am = Test2::EventFacet::Amnesty->new($am); + + push @{$self->{+AMNESTY}} => $am; + + for my $e (@{$self->{+SUBEVENTS}}) { + $e->add_amnesty($am->clone(inherited => 1)); + } + } +} + + +1; + +__END__ + +package Test2::Event::Exception; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw{error}; + +sub init { + my $self = shift; + $self->{+ERROR} = "$self->{+ERROR}"; +} + +sub causes_fail { 1 } + +sub summary { + my $self = shift; + chomp(my $msg = "Exception: " . $self->{+ERROR}); + return $msg; +} + +sub diagnostics { 1 } + +sub facet_data { + my $self = shift; + my $out = $self->common_facet_data; + + $out->{errors} = [ + { + tag => 'ERROR', + fail => 1, + details => $self->{+ERROR}, + } + ]; + + return $out; +} + + +1; + +__END__ + +package Test2::Event::Pass; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Test2::EventFacet::Info; + +BEGIN { + require Test2::Event; + our @ISA = qw(Test2::Event); + *META_KEY = \&Test2::Util::ExternalMeta::META_KEY; +} + +use Test2::Util::HashBase qw{ -name -info }; + +############## +# Old API +sub summary { "pass" } +sub increments_count { 1 } +sub causes_fail { 0 } +sub diagnostics { 0 } +sub no_display { 0 } +sub subtest_id { undef } +sub terminate { () } +sub global { () } +sub sets_plan { () } + +############## +# New API + +sub add_info { + my $self = shift; + + for my $in (@_) { + $in = {%$in} if ref($in) ne 'ARRAY'; + $in = Test2::EventFacet::Info->new($in); + + push @{$self->{+INFO}} => $in; + } +} + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{about}->{details} = 'pass'; + + $out->{assert} = {pass => 1, details => $self->{+NAME}}; + + $out->{info} = [map {{ %{$_} }} @{$self->{+INFO}}] if $self->{+INFO}; + + return $out; +} + +1; + +__END__ + +package Test2::Event::Fail; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Test2::EventFacet::Info; + +BEGIN { + require Test2::Event; + our @ISA = qw(Test2::Event); + *META_KEY = \&Test2::Util::ExternalMeta::META_KEY; +} + +use Test2::Util::HashBase qw{ -name -info }; + +############# +# Old API +sub summary { "fail" } +sub increments_count { 1 } +sub diagnostics { 0 } +sub no_display { 0 } +sub subtest_id { undef } +sub terminate { () } +sub global { () } +sub sets_plan { () } + +sub causes_fail { + my $self = shift; + return 0 if $self->{+AMNESTY} && @{$self->{+AMNESTY}}; + return 1; +} + +############# +# New API + +sub add_info { + my $self = shift; + + for my $in (@_) { + $in = {%$in} if ref($in) ne 'ARRAY'; + $in = Test2::EventFacet::Info->new($in); + + push @{$self->{+INFO}} => $in; + } +} + +sub facet_data { + my $self = shift; + my $out = $self->common_facet_data; + + $out->{about}->{details} = 'fail'; + + $out->{assert} = {pass => 0, details => $self->{+NAME}}; + + $out->{info} = [map {{ %{$_} }} @{$self->{+INFO}}] if $self->{+INFO}; + + return $out; +} + +1; + +__END__ + +package Test2::Event::Generic; +use strict; +use warnings; + +use Carp qw/croak/; +use Scalar::Util qw/reftype/; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase; + +my @FIELDS = qw{ + causes_fail increments_count diagnostics no_display callback terminate + global sets_plan summary facet_data +}; +my %DEFAULTS = ( + causes_fail => 0, + increments_count => 0, + diagnostics => 0, + no_display => 0, +); + +sub init { + my $self = shift; + + for my $field (@FIELDS) { + my $val = defined $self->{$field} ? delete $self->{$field} : $DEFAULTS{$field}; + next unless defined $val; + + my $set = "set_$field"; + $self->$set($val); + } +} + +for my $field (@FIELDS) { + no strict 'refs'; + + *$field = sub { exists $_[0]->{$field} ? $_[0]->{$field} : () } + unless exists &{$field}; + + *{"set_$field"} = sub { $_[0]->{$field} = $_[1] } + unless exists &{"set_$field"}; +} + +sub can { + my $self = shift; + my ($name) = @_; + return $self->SUPER::can($name) unless $name eq 'callback'; + return $self->{callback} || \&Test2::Event::callback; +} + +sub facet_data { + my $self = shift; + return $self->{facet_data} || $self->SUPER::facet_data(); +} + +sub summary { + my $self = shift; + return $self->{summary} if defined $self->{summary}; + $self->SUPER::summary(); +} + +sub sets_plan { + my $self = shift; + return unless $self->{sets_plan}; + return @{$self->{sets_plan}}; +} + +sub callback { + my $self = shift; + my $cb = $self->{callback} || return; + $self->$cb(@_); +} + +sub set_global { + my $self = shift; + my ($bool) = @_; + + if(!defined $bool) { + delete $self->{global}; + return undef; + } + + $self->{global} = $bool; +} + +sub set_callback { + my $self = shift; + my ($cb) = @_; + + if(!defined $cb) { + delete $self->{callback}; + return undef; + } + + croak "callback must be a code reference" + unless ref($cb) && reftype($cb) eq 'CODE'; + + $self->{callback} = $cb; +} + +sub set_terminate { + my $self = shift; + my ($exit) = @_; + + if(!defined $exit) { + delete $self->{terminate}; + return undef; + } + + croak "terminate must be a positive integer" + unless $exit =~ m/^\d+$/; + + $self->{terminate} = $exit; +} + +sub set_sets_plan { + my $self = shift; + my ($plan) = @_; + + if(!defined $plan) { + delete $self->{sets_plan}; + return undef; + } + + croak "'sets_plan' must be an array reference" + unless ref($plan) && reftype($plan) eq 'ARRAY'; + + $self->{sets_plan} = $plan; +} + +1; + +__END__ + +package Test2::Event::Diag; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw/message/; + +sub init { + $_[0]->{+MESSAGE} = 'undef' unless defined $_[0]->{+MESSAGE}; +} + +sub summary { $_[0]->{+MESSAGE} } + +sub diagnostics { 1 } + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{info} = [ + { + tag => 'DIAG', + debug => 1, + details => $self->{+MESSAGE}, + } + ]; + + return $out; +} + +1; + +__END__ + +package Test2::Event::Note; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw/message/; + +sub init { + $_[0]->{+MESSAGE} = 'undef' unless defined $_[0]->{+MESSAGE}; +} + +sub summary { $_[0]->{+MESSAGE} } + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{info} = [ + { + tag => 'NOTE', + debug => 0, + details => $self->{+MESSAGE}, + } + ]; + + return $out; +} + +1; + +__END__ + +package Test2::Event::Skip; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event::Ok; our @ISA = qw(Test2::Event::Ok) } +use Test2::Util::HashBase qw{reason}; + +sub init { + my $self = shift; + $self->SUPER::init; + $self->{+EFFECTIVE_PASS} = 1; +} + +sub causes_fail { 0 } + +sub summary { + my $self = shift; + my $out = $self->SUPER::summary(@_); + + if (my $reason = $self->reason) { + $out .= " (SKIP: $reason)"; + } + else { + $out .= " (SKIP)"; + } + + return $out; +} + +sub extra_amnesty { + my $self = shift; + + my @out; + + push @out => { + tag => 'TODO', + details => $self->{+TODO}, + } if defined $self->{+TODO}; + + push @out => { + tag => 'skip', + details => $self->{+REASON}, + inherited => 0, + }; + + return @out; +} + +1; + +__END__ + +package Test2::Event::Encoding; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Carp qw/croak/; + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw/encoding/; + +sub init { + my $self = shift; + defined $self->{+ENCODING} or croak "'encoding' is a required attribute"; +} + +sub summary { 'Encoding set to ' . $_[0]->{+ENCODING} } + +sub facet_data { + my $self = shift; + my $out = $self->common_facet_data; + $out->{control}->{encoding} = $self->{+ENCODING}; + $out->{about}->{details} = $self->summary; + return $out; +} + + +1; + +__END__ + +package Test2::Event::Plan; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw{max directive reason}; + +use Carp qw/confess/; + +my %ALLOWED = ( + 'SKIP' => 1, + 'NO PLAN' => 1, +); + +sub init { + if ($_[0]->{+DIRECTIVE}) { + $_[0]->{+DIRECTIVE} = 'SKIP' if $_[0]->{+DIRECTIVE} eq 'skip_all'; + $_[0]->{+DIRECTIVE} = 'NO PLAN' if $_[0]->{+DIRECTIVE} eq 'no_plan'; + + confess "'" . $_[0]->{+DIRECTIVE} . "' is not a valid plan directive" + unless $ALLOWED{$_[0]->{+DIRECTIVE}}; + } + else { + confess "Cannot have a reason without a directive!" + if defined $_[0]->{+REASON}; + + confess "No number of tests specified" + unless defined $_[0]->{+MAX}; + + confess "Plan test count '" . $_[0]->{+MAX} . "' does not appear to be a valid positive integer" + unless $_[0]->{+MAX} =~ m/^\d+$/; + + $_[0]->{+DIRECTIVE} = ''; + } +} + +sub sets_plan { + my $self = shift; + return ( + $self->{+MAX}, + $self->{+DIRECTIVE}, + $self->{+REASON}, + ); +} + +sub terminate { + my $self = shift; + # On skip_all we want to terminate the hub + return 0 if $self->{+DIRECTIVE} && $self->{+DIRECTIVE} eq 'SKIP'; + return undef; +} + +sub summary { + my $self = shift; + my $max = $self->{+MAX}; + my $directive = $self->{+DIRECTIVE}; + my $reason = $self->{+REASON}; + + return "Plan is $max assertions" + if $max || !$directive; + + return "Plan is '$directive', $reason" + if $reason; + + return "Plan is '$directive'"; +} + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{control}->{terminate} = $self->{+DIRECTIVE} eq 'SKIP' ? 0 : undef + unless defined $out->{control}->{terminate}; + + $out->{plan} = {count => $self->{+MAX}}; + $out->{plan}->{details} = $self->{+REASON} if defined $self->{+REASON}; + + if (my $dir = $self->{+DIRECTIVE}) { + $out->{plan}->{skip} = 1 if $dir eq 'SKIP'; + $out->{plan}->{none} = 1 if $dir eq 'NO PLAN'; + } + + return $out; +} + + +1; + +__END__ + +package Test2::Event::TAP::Version; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +use Carp qw/croak/; + +BEGIN { require Test2::Event; our @ISA = qw(Test2::Event) } +use Test2::Util::HashBase qw/version/; + +sub init { + my $self = shift; + defined $self->{+VERSION} or croak "'version' is a required attribute"; +} + +sub summary { 'TAP version ' . $_[0]->{+VERSION} } + +sub facet_data { + my $self = shift; + + my $out = $self->common_facet_data; + + $out->{about}->{details} = $self->summary; + + push @{$out->{info}} => { + tag => 'INFO', + debug => 0, + details => $self->summary, + }; + + return $out; +} + +1; + +__END__ + +package Test2::API::Instance; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +our @CARP_NOT = qw/Test2::API Test2::API::Instance Test2::IPC::Driver Test2::Formatter/; +use Carp qw/confess carp/; +use Scalar::Util qw/reftype/; + +use Test2::Util qw/get_tid USE_THREADS CAN_FORK pkg_to_file try CAN_SIGSYS/; + +use Test2::EventFacet::Trace(); +use Test2::API::Stack(); + +use Test2::Util::HashBase qw{ + _pid _tid + no_wait + finalized loaded + ipc stack formatter + contexts + + add_uuid_via + + -preload + + ipc_disabled + ipc_shm_size + ipc_shm_last + ipc_shm_id + ipc_polling + ipc_drivers + ipc_timeout + formatters + + exit_callbacks + post_load_callbacks + context_acquire_callbacks + context_init_callbacks + context_release_callbacks + pre_subtest_callbacks +}; + +sub DEFAULT_IPC_TIMEOUT() { 30 } + +sub pid { $_[0]->{+_PID} } +sub tid { $_[0]->{+_TID} } + +# Wrap around the getters that should call _finalize. +BEGIN { + for my $finalizer (IPC, FORMATTER) { + my $orig = __PACKAGE__->can($finalizer); + my $new = sub { + my $self = shift; + $self->_finalize unless $self->{+FINALIZED}; + $self->$orig; + }; + + no strict 'refs'; + no warnings 'redefine'; + *{$finalizer} = $new; + } +} + +sub has_ipc { !!$_[0]->{+IPC} } + +sub import { + my $class = shift; + return unless @_; + my ($ref) = @_; + $$ref = $class->new; +} + +sub init { $_[0]->reset } + +sub start_preload { + my $self = shift; + + confess "preload cannot be started, Test2::API has already been initialized" + if $self->{+FINALIZED} || $self->{+LOADED}; + + return $self->{+PRELOAD} = 1; +} + +sub stop_preload { + my $self = shift; + + return 0 unless $self->{+PRELOAD}; + $self->{+PRELOAD} = 0; + + $self->post_preload_reset(); + + return 1; +} + +sub post_preload_reset { + my $self = shift; + + delete $self->{+_PID}; + delete $self->{+_TID}; + + $self->{+ADD_UUID_VIA} = undef unless exists $self->{+ADD_UUID_VIA}; + + $self->{+CONTEXTS} = {}; + + $self->{+FORMATTERS} = []; + + $self->{+FINALIZED} = undef; + $self->{+IPC} = undef; + $self->{+IPC_DISABLED} = $ENV{T2_NO_IPC} ? 1 : 0; + + $self->{+IPC_TIMEOUT} = DEFAULT_IPC_TIMEOUT() unless defined $self->{+IPC_TIMEOUT}; + + $self->{+LOADED} = 0; + + $self->{+STACK} ||= Test2::API::Stack->new; +} + +sub reset { + my $self = shift; + + delete $self->{+_PID}; + delete $self->{+_TID}; + + $self->{+ADD_UUID_VIA} = undef; + + $self->{+CONTEXTS} = {}; + + $self->{+IPC_DRIVERS} = []; + $self->{+IPC_POLLING} = undef; + + $self->{+FORMATTERS} = []; + $self->{+FORMATTER} = undef; + + $self->{+FINALIZED} = undef; + $self->{+IPC} = undef; + $self->{+IPC_DISABLED} = $ENV{T2_NO_IPC} ? 1 : 0; + + $self->{+IPC_TIMEOUT} = DEFAULT_IPC_TIMEOUT() unless defined $self->{+IPC_TIMEOUT}; + + $self->{+NO_WAIT} = 0; + $self->{+LOADED} = 0; + + $self->{+EXIT_CALLBACKS} = []; + $self->{+POST_LOAD_CALLBACKS} = []; + $self->{+CONTEXT_ACQUIRE_CALLBACKS} = []; + $self->{+CONTEXT_INIT_CALLBACKS} = []; + $self->{+CONTEXT_RELEASE_CALLBACKS} = []; + $self->{+PRE_SUBTEST_CALLBACKS} = []; + + $self->{+STACK} = Test2::API::Stack->new; +} + +sub _finalize { + my $self = shift; + my ($caller) = @_; + $caller ||= [caller(1)]; + + confess "Attempt to initialize Test2::API during preload" + if $self->{+PRELOAD}; + + $self->{+FINALIZED} = $caller; + + $self->{+_PID} = $$ unless defined $self->{+_PID}; + $self->{+_TID} = get_tid() unless defined $self->{+_TID}; + + unless ($self->{+FORMATTER}) { + my ($formatter, $source); + if ($ENV{T2_FORMATTER}) { + $source = "set by the 'T2_FORMATTER' environment variable"; + + if ($ENV{T2_FORMATTER} =~ m/^(\+)?(.*)$/) { + $formatter = $1 ? $2 : "Test2::Formatter::$2" + } + else { + $formatter = ''; + } + } + elsif (@{$self->{+FORMATTERS}}) { + ($formatter) = @{$self->{+FORMATTERS}}; + $source = "Most recently added"; + } + else { + $formatter = 'Test2::Formatter::TAP'; + $source = 'default formatter'; + } + + unless (ref($formatter) || $formatter->can('write')) { + my $file = pkg_to_file($formatter); + my ($ok, $err) = try { require $file }; + unless ($ok) { + my $line = "* COULD NOT LOAD FORMATTER '$formatter' ($source) *"; + my $border = '*' x length($line); + die "\n\n $border\n $line\n $border\n\n$err"; + } + } + + $self->{+FORMATTER} = $formatter; + } + + # Turn on IPC if threads are on, drivers are registered, or the Test2::IPC + # module is loaded. + return if $self->{+IPC_DISABLED}; + return unless USE_THREADS || $INC{'Test2/IPC.pm'} || @{$self->{+IPC_DRIVERS}}; + + # Turn on polling by default, people expect it. + $self->enable_ipc_polling; + + unless (@{$self->{+IPC_DRIVERS}}) { + my ($ok, $error) = try { require Test2::IPC::Driver::Files }; + die $error unless $ok; + push @{$self->{+IPC_DRIVERS}} => 'Test2::IPC::Driver::Files'; + } + + for my $driver (@{$self->{+IPC_DRIVERS}}) { + next unless $driver->can('is_viable') && $driver->is_viable; + $self->{+IPC} = $driver->new or next; + $self->ipc_enable_shm if $self->{+IPC}->use_shm; + return; + } + + die "IPC has been requested, but no viable drivers were found. Aborting...\n"; +} + +sub formatter_set { $_[0]->{+FORMATTER} ? 1 : 0 } + +sub add_formatter { + my $self = shift; + my ($formatter) = @_; + unshift @{$self->{+FORMATTERS}} => $formatter; + + return unless $self->{+FINALIZED}; + + # Why is the @CARP_NOT entry not enough? + local %Carp::Internal = %Carp::Internal; + $Carp::Internal{'Test2::Formatter'} = 1; + + carp "Formatter $formatter loaded too late to be used as the global formatter"; +} + +sub add_context_acquire_callback { + my $self = shift; + my ($code) = @_; + + my $rtype = reftype($code) || ""; + + confess "Context-acquire callbacks must be coderefs" + unless $code && $rtype eq 'CODE'; + + push @{$self->{+CONTEXT_ACQUIRE_CALLBACKS}} => $code; +} + +sub add_context_init_callback { + my $self = shift; + my ($code) = @_; + + my $rtype = reftype($code) || ""; + + confess "Context-init callbacks must be coderefs" + unless $code && $rtype eq 'CODE'; + + push @{$self->{+CONTEXT_INIT_CALLBACKS}} => $code; +} + +sub add_context_release_callback { + my $self = shift; + my ($code) = @_; + + my $rtype = reftype($code) || ""; + + confess "Context-release callbacks must be coderefs" + unless $code && $rtype eq 'CODE'; + + push @{$self->{+CONTEXT_RELEASE_CALLBACKS}} => $code; +} + +sub add_post_load_callback { + my $self = shift; + my ($code) = @_; + + my $rtype = reftype($code) || ""; + + confess "Post-load callbacks must be coderefs" + unless $code && $rtype eq 'CODE'; + + push @{$self->{+POST_LOAD_CALLBACKS}} => $code; + $code->() if $self->{+LOADED}; +} + +sub add_pre_subtest_callback { + my $self = shift; + my ($code) = @_; + + my $rtype = reftype($code) || ""; + + confess "Pre-subtest callbacks must be coderefs" + unless $code && $rtype eq 'CODE'; + + push @{$self->{+PRE_SUBTEST_CALLBACKS}} => $code; +} + +sub load { + my $self = shift; + unless ($self->{+LOADED}) { + confess "Attempt to initialize Test2::API during preload" + if $self->{+PRELOAD}; + + $self->{+_PID} = $$ unless defined $self->{+_PID}; + $self->{+_TID} = get_tid() unless defined $self->{+_TID}; + + # This is for https://github.com/Test-More/test-more/issues/16 + # and https://rt.perl.org/Public/Bug/Display.html?id=127774 + # END blocks run in reverse order. This insures the END block is loaded + # as late as possible. It will not solve all cases, but it helps. + eval "END { Test2::API::test2_set_is_end() }; 1" or die $@; + + $self->{+LOADED} = 1; + $_->() for @{$self->{+POST_LOAD_CALLBACKS}}; + } + return $self->{+LOADED}; +} + +sub add_exit_callback { + my $self = shift; + my ($code) = @_; + my $rtype = reftype($code) || ""; + + confess "End callbacks must be coderefs" + unless $code && $rtype eq 'CODE'; + + push @{$self->{+EXIT_CALLBACKS}} => $code; +} + +sub ipc_disable { + my $self = shift; + + confess "Attempt to disable IPC after it has been initialized" + if $self->{+IPC}; + + $self->{+IPC_DISABLED} = 1; +} + +sub add_ipc_driver { + my $self = shift; + my ($driver) = @_; + unshift @{$self->{+IPC_DRIVERS}} => $driver; + + return unless $self->{+FINALIZED}; + + # Why is the @CARP_NOT entry not enough? + local %Carp::Internal = %Carp::Internal; + $Carp::Internal{'Test2::IPC::Driver'} = 1; + + carp "IPC driver $driver loaded too late to be used as the global ipc driver"; +} + +sub enable_ipc_polling { + my $self = shift; + + $self->{+_PID} = $$ unless defined $self->{+_PID}; + $self->{+_TID} = get_tid() unless defined $self->{+_TID}; + + $self->add_context_init_callback( + # This is called every time a context is created, it needs to be fast. + # $_[0] is a context object + sub { + return unless $self->{+IPC_POLLING}; + return $_[0]->{hub}->cull unless $self->{+IPC_SHM_ID}; + + my $val; + if(shmread($self->{+IPC_SHM_ID}, $val, 0, $self->{+IPC_SHM_SIZE})) { + return if $val eq $self->{+IPC_SHM_LAST}; + $self->{+IPC_SHM_LAST} = $val; + } + else { + warn "SHM Read error: $!\n"; + } + + $_[0]->{hub}->cull; + } + ) unless defined $self->ipc_polling; + + $self->set_ipc_polling(1); +} + +sub ipc_enable_shm { + my $self = shift; + + return 1 if defined $self->{+IPC_SHM_ID}; + + $self->{+_PID} = $$ unless defined $self->{+_PID}; + $self->{+_TID} = get_tid() unless defined $self->{+_TID}; + + my ($ok, $err) = try { + # SysV IPC can be available but not enabled. + # + # In some systems (*BSD) accessing the SysV IPC APIs without + # them being enabled can cause a SIGSYS. We suppress the SIGSYS + # and then get ENOSYS from the calls. + local $SIG{SYS} = 'IGNORE' if CAN_SIGSYS; + + require IPC::SysV; + + my $ipc_key = IPC::SysV::IPC_PRIVATE(); + my $shm_size = $self->{+IPC}->can('shm_size') ? $self->{+IPC}->shm_size : 64; + my $shm_id = shmget($ipc_key, $shm_size, 0666) or die "Could not get shm: $!"; + + my $initial = 'a' x $shm_size; + shmwrite($shm_id, $initial, 0, $shm_size) or die "Could not write to shm: $!"; + my $val; + shmread($shm_id, $val, 0, $shm_size) or die "Could not read from shm: $!"; + die "Read SHM value does not match the initial value ('$val' vs '$initial')" + unless $val eq $initial; + + $self->{+IPC_SHM_SIZE} = $shm_size; + $self->{+IPC_SHM_ID} = $shm_id; + $self->{+IPC_SHM_LAST} = $initial; + }; + + return $ok; +} + +sub ipc_free_shm { + my $self = shift; + + my $id = delete $self->{+IPC_SHM_ID}; + return unless defined $id; + + shmctl($id, IPC::SysV::IPC_RMID(), 0); +} + +sub get_ipc_pending { + my $self = shift; + return -1 unless defined $self->{+IPC_SHM_ID}; + my $val; + shmread($self->{+IPC_SHM_ID}, $val, 0, $self->{+IPC_SHM_SIZE}) or return -1; + return 0 if $val eq $self->{+IPC_SHM_LAST}; + $self->{+IPC_SHM_LAST} = $val; + return 1; +} + +sub set_ipc_pending { + my $self = shift; + + return undef unless defined $self->{+IPC_SHM_ID}; + + my ($val) = @_; + + confess "value is required for set_ipc_pending" + unless $val; + + shmwrite($self->{+IPC_SHM_ID}, $val, 0, $self->{+IPC_SHM_SIZE}); +} + +sub disable_ipc_polling { + my $self = shift; + return unless defined $self->{+IPC_POLLING}; + $self->{+IPC_POLLING} = 0; +} + +sub _ipc_wait { + my ($timeout) = @_; + my $fail = 0; + + $timeout = DEFAULT_IPC_TIMEOUT() unless defined $timeout; + + my $ok = eval { + if (CAN_FORK) { + local $SIG{ALRM} = sub { die "Timeout waiting on child processes" }; + alarm $timeout; + + while (1) { + my $pid = CORE::wait(); + my $err = $?; + last if $pid == -1; + next unless $err; + $fail++; + + my $sig = $err & 127; + my $exit = $err >> 8; + warn "Process $pid did not exit cleanly (wstat: $err, exit: $exit, sig: $sig)\n"; + } + + alarm 0; + } + + if (USE_THREADS) { + my $start = time; + + while (1) { + last unless threads->list(); + die "Timeout waiting on child thread" if time - $start >= $timeout; + sleep 1; + for my $t (threads->list) { + # threads older than 1.34 do not have this :-( + next if $t->can('is_joinable') && !$t->is_joinable; + $t->join; + # In older threads we cannot check if a thread had an error unless + # we control it and its return. + my $err = $t->can('error') ? $t->error : undef; + next unless $err; + my $tid = $t->tid(); + $fail++; + chomp($err); + warn "Thread $tid did not end cleanly: $err\n"; + } + } + } + + 1; + }; + my $error = $@; + + return 0 if $ok && !$fail; + warn $error unless $ok; + return 255; +} + +sub DESTROY { + my $self = shift; + + return if $self->{+PRELOAD}; + + return unless defined($self->{+_PID}) && $self->{+_PID} == $$; + return unless defined($self->{+_TID}) && $self->{+_TID} == get_tid(); + + shmctl($self->{+IPC_SHM_ID}, IPC::SysV::IPC_RMID(), 0) + if defined $self->{+IPC_SHM_ID}; +} + +sub set_exit { + my $self = shift; + + return if $self->{+PRELOAD}; + + my $exit = $?; + my $new_exit = $exit; + + if ($INC{'Test/Builder.pm'} && $Test::Builder::VERSION ne $Test2::API::VERSION) { + print STDERR <<" EOT"; + +******************************************************************************** +* * +* Test::Builder -- Test2::API version mismatch detected * +* * +******************************************************************************** + Test2::API Version: $Test2::API::VERSION +Test::Builder Version: $Test::Builder::VERSION + +This is not a supported configuration, you will have problems. + + EOT + } + + for my $ctx (values %{$self->{+CONTEXTS}}) { + next unless $ctx; + + next if $ctx->_aborted && ${$ctx->_aborted}; + + # Only worry about contexts in this PID + my $trace = $ctx->trace || next; + next unless $trace->pid && $trace->pid == $$; + + # Do not worry about contexts that have no hub + my $hub = $ctx->hub || next; + + # Do not worry if the state came to a sudden end. + next if $hub->bailed_out; + next if defined $hub->skip_reason; + + # now we worry + $trace->alert("context object was never released! This means a testing tool is behaving very badly"); + + $exit = 255; + $new_exit = 255; + } + + if (!defined($self->{+_PID}) or !defined($self->{+_TID}) or $self->{+_PID} != $$ or $self->{+_TID} != get_tid()) { + $? = $exit; + return; + } + + my @hubs = $self->{+STACK} ? $self->{+STACK}->all : (); + + if (@hubs and $self->{+IPC} and !$self->{+NO_WAIT}) { + local $?; + my %seen; + for my $hub (reverse @hubs) { + my $ipc = $hub->ipc or next; + next if $seen{$ipc}++; + $ipc->waiting(); + } + + my $ipc_exit = _ipc_wait($self->{+IPC_TIMEOUT}); + $new_exit ||= $ipc_exit; + } + + # None of this is necessary if we never got a root hub + if(my $root = shift @hubs) { + my $trace = Test2::EventFacet::Trace->new( + frame => [__PACKAGE__, __FILE__, 0, __PACKAGE__ . '::END'], + detail => __PACKAGE__ . ' END Block finalization', + ); + my $ctx = Test2::API::Context->new( + trace => $trace, + hub => $root, + ); + + if (@hubs) { + $ctx->diag("Test ended with extra hubs on the stack!"); + $new_exit = 255; + } + + unless ($root->no_ending) { + local $?; + $root->finalize($trace) unless $root->ended; + $_->($ctx, $exit, \$new_exit) for @{$self->{+EXIT_CALLBACKS}}; + $new_exit ||= $root->failed; + $new_exit ||= 255 unless $root->is_passing; + } + } + + $new_exit = 255 if $new_exit > 255; + + if ($new_exit && eval { require Test2::API::Breakage; 1 }) { + my @warn = Test2::API::Breakage->report(); + + if (@warn) { + print STDERR "\nYou have loaded versions of test modules known to have problems with Test2.\nThis could explain some test failures.\n"; + print STDERR "$_\n" for @warn; + print STDERR "\n"; + } + } + + $? = $new_exit; +} + +1; + +__END__ + +package Test2::API::Breakage; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Test2::Util qw/pkg_to_file/; + +our @EXPORT_OK = qw{ + upgrade_suggested + upgrade_required + known_broken +}; +BEGIN { require Exporter; our @ISA = qw(Exporter) } + +sub upgrade_suggested { + return ( + 'Test::Exception' => '0.42', + 'Test::FITesque' => '0.04', + 'Test::Module::Used' => '0.2.5', + 'Test::Moose::More' => '0.025', + ); +} + +sub upgrade_required { + return ( + 'Test::Builder::Clutch' => '0.07', + 'Test::Dist::VersionSync' => '1.1.4', + 'Test::Modern' => '0.012', + 'Test::SharedFork' => '0.34', + 'Test::Alien' => '0.04', + 'Test::UseAllModules' => '0.14', + 'Test::More::Prefix' => '0.005', + + 'Test2::Tools::EventDumper' => 0.000007, + 'Test2::Harness' => 0.000013, + + 'Test::DBIx::Class::Schema' => '1.0.9', + 'Test::Clustericious::Cluster' => '0.30', + ); +} + +sub known_broken { + return ( + 'Net::BitTorrent' => '0.052', + 'Test::Able' => '0.11', + 'Test::Aggregate' => '0.373', + 'Test::Flatten' => '0.11', + 'Test::Group' => '0.20', + 'Test::ParallelSubtest' => '0.05', + 'Test::Pretty' => '0.32', + 'Test::Wrapper' => '0.3.0', + + 'Log::Dispatch::Config::TestLog' => '0.02', + ); +} + +# Not reportable: +# Device::Chip => 0.07 - Tests will not pass, but not broken if already installed, also no fixed version we can upgrade to. + +sub report { + my $class = shift; + my ($require) = @_; + + my %suggest = __PACKAGE__->upgrade_suggested(); + my %required = __PACKAGE__->upgrade_required(); + my %broken = __PACKAGE__->known_broken(); + + my @warn; + for my $mod (keys %suggest) { + my $file = pkg_to_file($mod); + next unless $INC{$file} || ($require && eval { require $file; 1 }); + my $want = $suggest{$mod}; + next if eval { $mod->VERSION($want); 1 }; + push @warn => " * Module '$mod' is outdated, we recommed updating above $want."; + } + + for my $mod (keys %required) { + my $file = pkg_to_file($mod); + next unless $INC{$file} || ($require && eval { require $file; 1 }); + my $want = $required{$mod}; + next if eval { $mod->VERSION($want); 1 }; + push @warn => " * Module '$mod' is outdated and known to be broken, please update to $want or higher."; + } + + for my $mod (keys %broken) { + my $file = pkg_to_file($mod); + next unless $INC{$file} || ($require && eval { require $file; 1 }); + my $tested = $broken{$mod}; + push @warn => " * Module '$mod' is known to be broken in version $tested and below, newer versions have not been tested. You have: " . $mod->VERSION; + } + + return @warn; +} + +1; + +__END__ + + +package Test2::API::Context; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Carp qw/confess croak/; +use Scalar::Util qw/weaken blessed/; +use Test2::Util qw/get_tid try pkg_to_file get_tid/; + +use Test2::EventFacet::Trace(); +use Test2::API(); + +# Preload some key event types +my %LOADED = ( + map { + my $pkg = "Test2::Event::$_"; + my $file = "Test2/Event/$_.pm"; + require $file unless $INC{$file}; + ( $pkg => $pkg, $_ => $pkg ) + } qw/Ok Diag Note Plan Bail Exception Waiting Skip Subtest Pass Fail V2/ +); + +use Test2::Util::ExternalMeta qw/meta get_meta set_meta delete_meta/; +use Test2::Util::HashBase qw{ + stack hub trace _on_release _depth _is_canon _is_spawn _aborted + errno eval_error child_error thrown +}; + +# Private, not package vars +# It is safe to cache these. +my $ON_RELEASE = Test2::API::_context_release_callbacks_ref(); +my $CONTEXTS = Test2::API::_contexts_ref(); + +sub init { + my $self = shift; + + confess "The 'trace' attribute is required" + unless $self->{+TRACE}; + + confess "The 'hub' attribute is required" + unless $self->{+HUB}; + + $self->{+_DEPTH} = 0 unless defined $self->{+_DEPTH}; + + $self->{+ERRNO} = $! unless exists $self->{+ERRNO}; + $self->{+EVAL_ERROR} = $@ unless exists $self->{+EVAL_ERROR}; + $self->{+CHILD_ERROR} = $? unless exists $self->{+CHILD_ERROR}; +} + +sub snapshot { bless {%{$_[0]}, _is_canon => undef, _is_spawn => undef, _aborted => undef}, __PACKAGE__ } + +sub restore_error_vars { + my $self = shift; + ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR}; +} + +sub DESTROY { + return unless $_[0]->{+_IS_CANON} || $_[0]->{+_IS_SPAWN}; + return if $_[0]->{+_ABORTED} && ${$_[0]->{+_ABORTED}}; + my ($self) = @_; + + my $hub = $self->{+HUB}; + my $hid = $hub->{hid}; + + # Do not show the warning if it looks like an exception has been thrown, or + # if the context is not local to this process or thread. + { + # Sometimes $@ is uninitialized, not a problem in this case so do not + # show the warning about using eq. + no warnings 'uninitialized'; + if($self->{+EVAL_ERROR} eq $@ && $hub->is_local) { + my $frame = $self->{+_IS_SPAWN} || $self->{+TRACE}->frame; + warn <<" EOT"; +A context appears to have been destroyed without first calling release(). +Based on \$@ it does not look like an exception was thrown (this is not always +a reliable test) + +This is a problem because the global error variables (\$!, \$@, and \$?) will +not be restored. In addition some release callbacks will not work properly from +inside a DESTROY method. + +Here are the context creation details, just in case a tool forgot to call +release(): + File: $frame->[1] + Line: $frame->[2] + Tool: $frame->[3] + +Cleaning up the CONTEXT stack... + EOT + } + } + + return if $self->{+_IS_SPAWN}; + + # Remove the key itself to avoid a slow memory leak + delete $CONTEXTS->{$hid}; + $self->{+_IS_CANON} = undef; + + if (my $cbk = $self->{+_ON_RELEASE}) { + $_->($self) for reverse @$cbk; + } + if (my $hcbk = $hub->{_context_release}) { + $_->($self) for reverse @$hcbk; + } + $_->($self) for reverse @$ON_RELEASE; +} + +# release exists to implement behaviors like die-on-fail. In die-on-fail you +# want to die after a failure, but only after diagnostics have been reported. +# The ideal time for the die to happen is when the context is released. +# Unfortunately die does not work in a DESTROY block. +sub release { + my ($self) = @_; + + ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR} and return if $self->{+THROWN}; + + ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR} and return $self->{+_IS_SPAWN} = undef + if $self->{+_IS_SPAWN}; + + croak "release() should not be called on context that is neither canon nor a child" + unless $self->{+_IS_CANON}; + + my $hub = $self->{+HUB}; + my $hid = $hub->{hid}; + + croak "context thinks it is canon, but it is not" + unless $CONTEXTS->{$hid} && $CONTEXTS->{$hid} == $self; + + # Remove the key itself to avoid a slow memory leak + $self->{+_IS_CANON} = undef; + delete $CONTEXTS->{$hid}; + + if (my $cbk = $self->{+_ON_RELEASE}) { + $_->($self) for reverse @$cbk; + } + if (my $hcbk = $hub->{_context_release}) { + $_->($self) for reverse @$hcbk; + } + $_->($self) for reverse @$ON_RELEASE; + + # Do this last so that nothing else changes them. + # If one of the hooks dies then these do not get restored, this is + # intentional + ($!, $@, $?) = @$self{+ERRNO, +EVAL_ERROR, +CHILD_ERROR}; + + return; +} + +sub do_in_context { + my $self = shift; + my ($sub, @args) = @_; + + # We need to update the pid/tid and error vars. + my $clone = $self->snapshot; + @$clone{+ERRNO, +EVAL_ERROR, +CHILD_ERROR} = ($!, $@, $?); + $clone->{+TRACE} = $clone->{+TRACE}->snapshot(pid => $$, tid => get_tid()); + + my $hub = $clone->{+HUB}; + my $hid = $hub->hid; + + my $old = $CONTEXTS->{$hid}; + + $clone->{+_IS_CANON} = 1; + $CONTEXTS->{$hid} = $clone; + weaken($CONTEXTS->{$hid}); + my ($ok, $err) = &try($sub, @args); + my ($rok, $rerr) = try { $clone->release }; + delete $clone->{+_IS_CANON}; + + if ($old) { + $CONTEXTS->{$hid} = $old; + weaken($CONTEXTS->{$hid}); + } + else { + delete $CONTEXTS->{$hid}; + } + + die $err unless $ok; + die $rerr unless $rok; +} + +sub done_testing { + my $self = shift; + $self->hub->finalize($self->trace, 1); + return; +} + +sub throw { + my ($self, $msg) = @_; + $self->{+THROWN} = 1; + ${$self->{+_ABORTED}}++ if $self->{+_ABORTED}; + $self->release if $self->{+_IS_CANON} || $self->{+_IS_SPAWN}; + $self->trace->throw($msg); +} + +sub alert { + my ($self, $msg) = @_; + $self->trace->alert($msg); +} + +sub send_ev2_and_release { + my $self = shift; + my $out = $self->send_ev2(@_); + $self->release; + return $out; +} + +sub send_ev2 { + my $self = shift; + + my $e; + { + local $Carp::CarpLevel = $Carp::CarpLevel + 1; + $e = Test2::Event::V2->new( + trace => $self->{+TRACE}->snapshot, + @_, + ); + } + + if ($self->{+_ABORTED}) { + my $f = $e->facet_data; + ${$self->{+_ABORTED}}++ if $f->{control}->{halt} || defined($f->{control}->{terminate}) || defined($e->terminate); + } + $self->{+HUB}->send($e); +} + +sub build_ev2 { + my $self = shift; + + local $Carp::CarpLevel = $Carp::CarpLevel + 1; + Test2::Event::V2->new( + trace => $self->{+TRACE}->snapshot, + @_, + ); +} + +sub send_event_and_release { + my $self = shift; + my $out = $self->send_event(@_); + $self->release; + return $out; +} + +sub send_event { + my $self = shift; + my $event = shift; + my %args = @_; + + my $pkg = $LOADED{$event} || $self->_parse_event($event); + + my $e; + { + local $Carp::CarpLevel = $Carp::CarpLevel + 1; + $e = $pkg->new( + trace => $self->{+TRACE}->snapshot, + %args, + ); + } + + if ($self->{+_ABORTED}) { + my $f = $e->facet_data; + ${$self->{+_ABORTED}}++ if $f->{control}->{halt} || defined($f->{control}->{terminate}) || defined($e->terminate); + } + $self->{+HUB}->send($e); +} + +sub build_event { + my $self = shift; + my $event = shift; + my %args = @_; + + my $pkg = $LOADED{$event} || $self->_parse_event($event); + + local $Carp::CarpLevel = $Carp::CarpLevel + 1; + $pkg->new( + trace => $self->{+TRACE}->snapshot, + %args, + ); +} + +sub pass { + my $self = shift; + my ($name) = @_; + + my $e = bless( + { + trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'), + name => $name, + }, + "Test2::Event::Pass" + ); + + $self->{+HUB}->send($e); + return $e; +} + +sub pass_and_release { + my $self = shift; + my ($name) = @_; + + my $e = bless( + { + trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'), + name => $name, + }, + "Test2::Event::Pass" + ); + + $self->{+HUB}->send($e); + $self->release; + return 1; +} + +sub fail { + my $self = shift; + my ($name, @diag) = @_; + + my $e = bless( + { + trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'), + name => $name, + }, + "Test2::Event::Fail" + ); + + $e->add_info({tag => 'DIAG', debug => 1, details => $_}) for @diag; + $self->{+HUB}->send($e); + return $e; +} + +sub fail_and_release { + my $self = shift; + my ($name, @diag) = @_; + + my $e = bless( + { + trace => bless({%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'), + name => $name, + }, + "Test2::Event::Fail" + ); + + $e->add_info({tag => 'DIAG', debug => 1, details => $_}) for @diag; + $self->{+HUB}->send($e); + $self->release; + return 0; +} + +sub ok { + my $self = shift; + my ($pass, $name, $on_fail) = @_; + + my $hub = $self->{+HUB}; + + my $e = bless { + trace => bless( {%{$self->{+TRACE}}}, 'Test2::EventFacet::Trace'), + pass => $pass, + name => $name, + }, 'Test2::Event::Ok'; + $e->init; + + $hub->send($e); + return $e if $pass; + + $self->failure_diag($e); + + if ($on_fail && @$on_fail) { + $self->diag($_) for @$on_fail; + } + + return $e; +} + +sub failure_diag { + my $self = shift; + my ($e) = @_; + + # Figure out the debug info, this is typically the file name and line + # number, but can also be a custom message. If no trace object is provided + # then we have nothing useful to display. + my $name = $e->name; + my $trace = $e->trace; + my $debug = $trace ? $trace->debug : "[No trace info available]"; + + # Create the initial diagnostics. If the test has a name we put the debug + # info on a second line, this behavior is inherited from Test::Builder. + my $msg = defined($name) + ? qq[Failed test '$name'\n$debug.\n] + : qq[Failed test $debug.\n]; + + $self->diag($msg); +} + +sub skip { + my $self = shift; + my ($name, $reason, @extra) = @_; + $self->send_event( + 'Skip', + name => $name, + reason => $reason, + pass => 1, + @extra, + ); +} + +sub note { + my $self = shift; + my ($message) = @_; + $self->send_event('Note', message => $message); +} + +sub diag { + my $self = shift; + my ($message) = @_; + my $hub = $self->{+HUB}; + $self->send_event( + 'Diag', + message => $message, + ); +} + +sub plan { + my ($self, $max, $directive, $reason) = @_; + $self->send_event('Plan', max => $max, directive => $directive, reason => $reason); +} + +sub bail { + my ($self, $reason) = @_; + $self->send_event('Bail', reason => $reason); +} + +sub _parse_event { + my $self = shift; + my $event = shift; + + my $pkg; + if ($event =~ m/^\+(.*)/) { + $pkg = $1; + } + else { + $pkg = "Test2::Event::$event"; + } + + unless ($LOADED{$pkg}) { + my $file = pkg_to_file($pkg); + my ($ok, $err) = try { require $file }; + $self->throw("Could not load event module '$pkg': $err") + unless $ok; + + $LOADED{$pkg} = $pkg; + } + + confess "'$pkg' is not a subclass of 'Test2::Event'" + unless $pkg->isa('Test2::Event'); + + $LOADED{$event} = $pkg; + + return $pkg; +} + +1; + +__END__ + +package Test2::API::Stack; +use strict; +use warnings; + +our $VERSION = '1.302133'; + + +use Test2::Hub(); + +use Carp qw/confess/; + +sub new { + my $class = shift; + return bless [], $class; +} + +sub new_hub { + my $self = shift; + my %params = @_; + + my $class = delete $params{class} || 'Test2::Hub'; + + my $hub = $class->new(%params); + + if (@$self) { + $hub->inherit($self->[-1], %params); + } + else { + require Test2::API; + $hub->format(Test2::API::test2_formatter()->new_root) + unless $hub->format || exists($params{formatter}); + + my $ipc = Test2::API::test2_ipc(); + if ($ipc && !$hub->ipc && !exists($params{ipc})) { + $hub->set_ipc($ipc); + $ipc->add_hub($hub->hid); + } + } + + push @$self => $hub; + + $hub; +} + +sub top { + my $self = shift; + return $self->new_hub unless @$self; + return $self->[-1]; +} + +sub peek { + my $self = shift; + return @$self ? $self->[-1] : undef; +} + +sub cull { + my $self = shift; + $_->cull for reverse @$self; +} + +sub all { + my $self = shift; + return @$self; +} + +sub clear { + my $self = shift; + @$self = (); +} + +# Do these last without keywords in order to prevent them from getting used +# when we want the real push/pop. + +{ + no warnings 'once'; + + *push = sub { + my $self = shift; + my ($hub) = @_; + $hub->inherit($self->[-1]) if @$self; + push @$self => $hub; + }; + + *pop = sub { + my $self = shift; + my ($hub) = @_; + confess "No hubs on the stack" + unless @$self; + confess "You cannot pop the root hub" + if 1 == @$self; + confess "Hub stack mismatch, attempted to pop incorrect hub" + unless $self->[-1] == $hub; + pop @$self; + }; +} + +1; + +__END__ + +package Test::More; + +use 5.006; +use strict; +use warnings; + +#---- perlcritic exemptions. ----# + +# We use a lot of subroutine prototypes +## no critic (Subroutines::ProhibitSubroutinePrototypes) + +# Can't use Carp because it might cause C<use_ok()> to accidentally succeed +# even though the module being used forgot to use Carp. Yes, this +# actually happened. +sub _carp { + my( $file, $line ) = ( caller(1) )[ 1, 2 ]; + return warn @_, " at $file line $line\n"; +} + +our $VERSION = '1.302133'; + +use Test::Builder::Module; +our @ISA = qw(Test::Builder::Module); +our @EXPORT = qw(ok use_ok require_ok + is isnt like unlike is_deeply + cmp_ok + skip todo todo_skip + pass fail + eq_array eq_hash eq_set + $TODO + plan + done_testing + can_ok isa_ok new_ok + diag note explain + subtest + BAIL_OUT +); + + +sub plan { + my $tb = Test::More->builder; + + return $tb->plan(@_); +} + +# This implements "use Test::More 'no_diag'" but the behavior is +# deprecated. +sub import_extra { + my $class = shift; + my $list = shift; + + my @other = (); + my $idx = 0; + my $import; + while( $idx <= $#{$list} ) { + my $item = $list->[$idx]; + + if( defined $item and $item eq 'no_diag' ) { + $class->builder->no_diag(1); + } + elsif( defined $item and $item eq 'import' ) { + if ($import) { + push @$import, @{$list->[ ++$idx ]}; + } + else { + $import = $list->[ ++$idx ]; + push @other, $item, $import; + } + } + else { + push @other, $item; + } + + $idx++; + } + + @$list = @other; + + if ($class eq __PACKAGE__ && (!$import || grep $_ eq '$TODO', @$import)) { + my $to = $class->builder->exported_to; + no strict 'refs'; + *{"$to\::TODO"} = \our $TODO; + if ($import) { + @$import = grep $_ ne '$TODO', @$import; + } + else { + push @$list, import => [grep $_ ne '$TODO', @EXPORT]; + } + } + + return; +} + + +sub done_testing { + my $tb = Test::More->builder; + $tb->done_testing(@_); +} + + +sub ok ($;$) { + my( $test, $name ) = @_; + my $tb = Test::More->builder; + + return $tb->ok( $test, $name ); +} + + +sub is ($$;$) { + my $tb = Test::More->builder; + + return $tb->is_eq(@_); +} + +sub isnt ($$;$) { + my $tb = Test::More->builder; + + return $tb->isnt_eq(@_); +} + +*isn't = \&isnt; +# ' to unconfuse syntax higlighters + + +sub like ($$;$) { + my $tb = Test::More->builder; + + return $tb->like(@_); +} + + +sub unlike ($$;$) { + my $tb = Test::More->builder; + + return $tb->unlike(@_); +} + + +sub cmp_ok($$$;$) { + my $tb = Test::More->builder; + + return $tb->cmp_ok(@_); +} + + +sub can_ok ($@) { + my( $proto, @methods ) = @_; + my $class = ref $proto || $proto; + my $tb = Test::More->builder; + + unless($class) { + my $ok = $tb->ok( 0, "->can(...)" ); + $tb->diag(' can_ok() called with empty class or reference'); + return $ok; + } + + unless(@methods) { + my $ok = $tb->ok( 0, "$class->can(...)" ); + $tb->diag(' can_ok() called with no methods'); + return $ok; + } + + my @nok = (); + foreach my $method (@methods) { + $tb->_try( sub { $proto->can($method) } ) or push @nok, $method; + } + + my $name = (@methods == 1) ? "$class->can('$methods[0]')" : + "$class->can(...)" ; + + my $ok = $tb->ok( !@nok, $name ); + + $tb->diag( map " $class->can('$_') failed\n", @nok ); + + return $ok; +} + + +sub isa_ok ($$;$) { + my( $thing, $class, $thing_name ) = @_; + my $tb = Test::More->builder; + + my $whatami; + if( !defined $thing ) { + $whatami = 'undef'; + } + elsif( ref $thing ) { + $whatami = 'reference'; + + local($@,$!); + require Scalar::Util; + if( Scalar::Util::blessed($thing) ) { + $whatami = 'object'; + } + } + else { + $whatami = 'class'; + } + + # We can't use UNIVERSAL::isa because we want to honor isa() overrides + my( $rslt, $error ) = $tb->_try( sub { $thing->isa($class) } ); + + if($error) { + die <<WHOA unless $error =~ /^Can't (locate|call) method "isa"/; +WHOA! I tried to call ->isa on your $whatami and got some weird error. +Here's the error. +$error +WHOA + } + + # Special case for isa_ok( [], "ARRAY" ) and like + if( $whatami eq 'reference' ) { + $rslt = UNIVERSAL::isa($thing, $class); + } + + my($diag, $name); + if( defined $thing_name ) { + $name = "'$thing_name' isa '$class'"; + $diag = defined $thing ? "'$thing_name' isn't a '$class'" : "'$thing_name' isn't defined"; + } + elsif( $whatami eq 'object' ) { + my $my_class = ref $thing; + $thing_name = qq[An object of class '$my_class']; + $name = "$thing_name isa '$class'"; + $diag = "The object of class '$my_class' isn't a '$class'"; + } + elsif( $whatami eq 'reference' ) { + my $type = ref $thing; + $thing_name = qq[A reference of type '$type']; + $name = "$thing_name isa '$class'"; + $diag = "The reference of type '$type' isn't a '$class'"; + } + elsif( $whatami eq 'undef' ) { + $thing_name = 'undef'; + $name = "$thing_name isa '$class'"; + $diag = "$thing_name isn't defined"; + } + elsif( $whatami eq 'class' ) { + $thing_name = qq[The class (or class-like) '$thing']; + $name = "$thing_name isa '$class'"; + $diag = "$thing_name isn't a '$class'"; + } + else { + die; + } + + my $ok; + if($rslt) { + $ok = $tb->ok( 1, $name ); + } + else { + $ok = $tb->ok( 0, $name ); + $tb->diag(" $diag\n"); + } + + return $ok; +} + + +sub new_ok { + my $tb = Test::More->builder; + $tb->croak("new_ok() must be given at least a class") unless @_; + + my( $class, $args, $object_name ) = @_; + + $args ||= []; + + my $obj; + my( $success, $error ) = $tb->_try( sub { $obj = $class->new(@$args); 1 } ); + if($success) { + local $Test::Builder::Level = $Test::Builder::Level + 1; + isa_ok $obj, $class, $object_name; + } + else { + $class = 'undef' if !defined $class; + $tb->ok( 0, "$class->new() died" ); + $tb->diag(" Error was: $error"); + } + + return $obj; +} + + +sub subtest { + my $tb = Test::More->builder; + return $tb->subtest(@_); +} + + +sub pass (;$) { + my $tb = Test::More->builder; + + return $tb->ok( 1, @_ ); +} + +sub fail (;$) { + my $tb = Test::More->builder; + + return $tb->ok( 0, @_ ); +} + + +sub require_ok ($) { + my($module) = shift; + my $tb = Test::More->builder; + + my $pack = caller; + + # Try to determine if we've been given a module name or file. + # Module names must be barewords, files not. + $module = qq['$module'] unless _is_module_name($module); + + my $code = <<REQUIRE; +package $pack; +require $module; +1; +REQUIRE + + my( $eval_result, $eval_error ) = _eval($code); + my $ok = $tb->ok( $eval_result, "require $module;" ); + + unless($ok) { + chomp $eval_error; + $tb->diag(<<DIAGNOSTIC); + Tried to require '$module'. + Error: $eval_error +DIAGNOSTIC + + } + + return $ok; +} + +sub _is_module_name { + my $module = shift; + + # Module names start with a letter. + # End with an alphanumeric. + # The rest is an alphanumeric or :: + $module =~ s/\b::\b//g; + + return $module =~ /^[a-zA-Z]\w*$/ ? 1 : 0; +} + + + +sub use_ok ($;@) { + my( $module, @imports ) = @_; + @imports = () unless @imports; + my $tb = Test::More->builder; + + my %caller; + @caller{qw/pack file line sub args want eval req strict warn/} = caller(0); + + my ($pack, $filename, $line, $warn) = @caller{qw/pack file line warn/}; + $filename =~ y/\n\r/_/; # so it doesn't run off the "#line $line $f" line + + my $code; + if( @imports == 1 and $imports[0] =~ /^\d+(?:\.\d+)?$/ ) { + # probably a version check. Perl needs to see the bare number + # for it to work with non-Exporter based modules. + $code = <<USE; +package $pack; +BEGIN { \${^WARNING_BITS} = \$args[-1] if defined \$args[-1] } +#line $line $filename +use $module $imports[0]; +1; +USE + } + else { + $code = <<USE; +package $pack; +BEGIN { \${^WARNING_BITS} = \$args[-1] if defined \$args[-1] } +#line $line $filename +use $module \@{\$args[0]}; +1; +USE + } + + my ($eval_result, $eval_error) = _eval($code, \@imports, $warn); + my $ok = $tb->ok( $eval_result, "use $module;" ); + + unless($ok) { + chomp $eval_error; + $@ =~ s{^BEGIN failed--compilation aborted at .*$} + {BEGIN failed--compilation aborted at $filename line $line.}m; + $tb->diag(<<DIAGNOSTIC); + Tried to use '$module'. + Error: $eval_error +DIAGNOSTIC + + } + + return $ok; +} + +sub _eval { + my( $code, @args ) = @_; + + # Work around oddities surrounding resetting of $@ by immediately + # storing it. + my( $sigdie, $eval_result, $eval_error ); + { + local( $@, $!, $SIG{__DIE__} ); # isolate eval + $eval_result = eval $code; ## no critic (BuiltinFunctions::ProhibitStringyEval) + $eval_error = $@; + $sigdie = $SIG{__DIE__} || undef; + } + # make sure that $code got a chance to set $SIG{__DIE__} + $SIG{__DIE__} = $sigdie if defined $sigdie; + + return( $eval_result, $eval_error ); +} + + + +our( @Data_Stack, %Refs_Seen ); +my $DNE = bless [], 'Does::Not::Exist'; + +sub _dne { + return ref $_[0] eq ref $DNE; +} + +## no critic (Subroutines::RequireArgUnpacking) +sub is_deeply { + my $tb = Test::More->builder; + + unless( @_ == 2 or @_ == 3 ) { + my $msg = <<'WARNING'; +is_deeply() takes two or three args, you gave %d. +This usually means you passed an array or hash instead +of a reference to it +WARNING + chop $msg; # clip off newline so carp() will put in line/file + + _carp sprintf $msg, scalar @_; + + return $tb->ok(0); + } + + my( $got, $expected, $name ) = @_; + + $tb->_unoverload_str( \$expected, \$got ); + + my $ok; + if( !ref $got and !ref $expected ) { # neither is a reference + $ok = $tb->is_eq( $got, $expected, $name ); + } + elsif( !ref $got xor !ref $expected ) { # one's a reference, one isn't + $ok = $tb->ok( 0, $name ); + $tb->diag( _format_stack({ vals => [ $got, $expected ] }) ); + } + else { # both references + local @Data_Stack = (); + if( _deep_check( $got, $expected ) ) { + $ok = $tb->ok( 1, $name ); + } + else { + $ok = $tb->ok( 0, $name ); + $tb->diag( _format_stack(@Data_Stack) ); + } + } + + return $ok; +} + +sub _format_stack { + my(@Stack) = @_; + + my $var = '$FOO'; + my $did_arrow = 0; + foreach my $entry (@Stack) { + my $type = $entry->{type} || ''; + my $idx = $entry->{'idx'}; + if( $type eq 'HASH' ) { + $var .= "->" unless $did_arrow++; + $var .= "{$idx}"; + } + elsif( $type eq 'ARRAY' ) { + $var .= "->" unless $did_arrow++; + $var .= "[$idx]"; + } + elsif( $type eq 'REF' ) { + $var = "\${$var}"; + } + } + + my @vals = @{ $Stack[-1]{vals} }[ 0, 1 ]; + my @vars = (); + ( $vars[0] = $var ) =~ s/\$FOO/ \$got/; + ( $vars[1] = $var ) =~ s/\$FOO/\$expected/; + + my $out = "Structures begin differing at:\n"; + foreach my $idx ( 0 .. $#vals ) { + my $val = $vals[$idx]; + $vals[$idx] + = !defined $val ? 'undef' + : _dne($val) ? "Does not exist" + : ref $val ? "$val" + : "'$val'"; + } + + $out .= "$vars[0] = $vals[0]\n"; + $out .= "$vars[1] = $vals[1]\n"; + + $out =~ s/^/ /msg; + return $out; +} + +sub _type { + my $thing = shift; + + return '' if !ref $thing; + + for my $type (qw(Regexp ARRAY HASH REF SCALAR GLOB CODE VSTRING)) { + return $type if UNIVERSAL::isa( $thing, $type ); + } + + return ''; +} + + +sub diag { + return Test::More->builder->diag(@_); +} + +sub note { + return Test::More->builder->note(@_); +} + + +sub explain { + return Test::More->builder->explain(@_); +} + + +## no critic (Subroutines::RequireFinalReturn) +sub skip { + my( $why, $how_many ) = @_; + my $tb = Test::More->builder; + + # If the plan is set, and is static, then skip needs a count. If the plan + # is 'no_plan' we are fine. As well if plan is undefined then we are + # waiting for done_testing. + unless (defined $how_many) { + my $plan = $tb->has_plan; + _carp "skip() needs to know \$how_many tests are in the block" + if $plan && $plan =~ m/^\d+$/; + $how_many = 1; + } + + if( defined $how_many and $how_many =~ /\D/ ) { + _carp + "skip() was passed a non-numeric number of tests. Did you get the arguments backwards?"; + $how_many = 1; + } + + for( 1 .. $how_many ) { + $tb->skip($why); + } + + no warnings 'exiting'; + last SKIP; +} + + +sub todo_skip { + my( $why, $how_many ) = @_; + my $tb = Test::More->builder; + + unless( defined $how_many ) { + # $how_many can only be avoided when no_plan is in use. + _carp "todo_skip() needs to know \$how_many tests are in the block" + unless $tb->has_plan eq 'no_plan'; + $how_many = 1; + } + + for( 1 .. $how_many ) { + $tb->todo_skip($why); + } + + no warnings 'exiting'; + last TODO; +} + + +sub BAIL_OUT { + my $reason = shift; + my $tb = Test::More->builder; + + $tb->BAIL_OUT($reason); +} + + +#'# +sub eq_array { + local @Data_Stack = (); + _deep_check(@_); +} + +sub _eq_array { + my( $a1, $a2 ) = @_; + + if( grep _type($_) ne 'ARRAY', $a1, $a2 ) { + warn "eq_array passed a non-array ref"; + return 0; + } + + return 1 if $a1 eq $a2; + + my $ok = 1; + my $max = $#$a1 > $#$a2 ? $#$a1 : $#$a2; + for( 0 .. $max ) { + my $e1 = $_ > $#$a1 ? $DNE : $a1->[$_]; + my $e2 = $_ > $#$a2 ? $DNE : $a2->[$_]; + + next if _equal_nonrefs($e1, $e2); + + push @Data_Stack, { type => 'ARRAY', idx => $_, vals => [ $e1, $e2 ] }; + $ok = _deep_check( $e1, $e2 ); + pop @Data_Stack if $ok; + + last unless $ok; + } + + return $ok; +} + +sub _equal_nonrefs { + my( $e1, $e2 ) = @_; + + return if ref $e1 or ref $e2; + + if ( defined $e1 ) { + return 1 if defined $e2 and $e1 eq $e2; + } + else { + return 1 if !defined $e2; + } + + return; +} + +sub _deep_check { + my( $e1, $e2 ) = @_; + my $tb = Test::More->builder; + + my $ok = 0; + + # Effectively turn %Refs_Seen into a stack. This avoids picking up + # the same referenced used twice (such as [\$a, \$a]) to be considered + # circular. + local %Refs_Seen = %Refs_Seen; + + { + $tb->_unoverload_str( \$e1, \$e2 ); + + # Either they're both references or both not. + my $same_ref = !( !ref $e1 xor !ref $e2 ); + my $not_ref = ( !ref $e1 and !ref $e2 ); + + if( defined $e1 xor defined $e2 ) { + $ok = 0; + } + elsif( !defined $e1 and !defined $e2 ) { + # Shortcut if they're both undefined. + $ok = 1; + } + elsif( _dne($e1) xor _dne($e2) ) { + $ok = 0; + } + elsif( $same_ref and( $e1 eq $e2 ) ) { + $ok = 1; + } + elsif($not_ref) { + push @Data_Stack, { type => '', vals => [ $e1, $e2 ] }; + $ok = 0; + } + else { + if( $Refs_Seen{$e1} ) { + return $Refs_Seen{$e1} eq $e2; + } + else { + $Refs_Seen{$e1} = "$e2"; + } + + my $type = _type($e1); + $type = 'DIFFERENT' unless _type($e2) eq $type; + + if( $type eq 'DIFFERENT' ) { + push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] }; + $ok = 0; + } + elsif( $type eq 'ARRAY' ) { + $ok = _eq_array( $e1, $e2 ); + } + elsif( $type eq 'HASH' ) { + $ok = _eq_hash( $e1, $e2 ); + } + elsif( $type eq 'REF' ) { + push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] }; + $ok = _deep_check( $$e1, $$e2 ); + pop @Data_Stack if $ok; + } + elsif( $type eq 'SCALAR' ) { + push @Data_Stack, { type => 'REF', vals => [ $e1, $e2 ] }; + $ok = _deep_check( $$e1, $$e2 ); + pop @Data_Stack if $ok; + } + elsif($type) { + push @Data_Stack, { type => $type, vals => [ $e1, $e2 ] }; + $ok = 0; + } + else { + _whoa( 1, "No type in _deep_check" ); + } + } + } + + return $ok; +} + +sub _whoa { + my( $check, $desc ) = @_; + if($check) { + die <<"WHOA"; +WHOA! $desc +This should never happen! Please contact the author immediately! +WHOA + } +} + + +sub eq_hash { + local @Data_Stack = (); + return _deep_check(@_); +} + +sub _eq_hash { + my( $a1, $a2 ) = @_; + + if( grep _type($_) ne 'HASH', $a1, $a2 ) { + warn "eq_hash passed a non-hash ref"; + return 0; + } + + return 1 if $a1 eq $a2; + + my $ok = 1; + my $bigger = keys %$a1 > keys %$a2 ? $a1 : $a2; + foreach my $k ( keys %$bigger ) { + my $e1 = exists $a1->{$k} ? $a1->{$k} : $DNE; + my $e2 = exists $a2->{$k} ? $a2->{$k} : $DNE; + + next if _equal_nonrefs($e1, $e2); + + push @Data_Stack, { type => 'HASH', idx => $k, vals => [ $e1, $e2 ] }; + $ok = _deep_check( $e1, $e2 ); + pop @Data_Stack if $ok; + + last unless $ok; + } + + return $ok; +} + + +sub eq_set { + my( $a1, $a2 ) = @_; + return 0 unless @$a1 == @$a2; + + no warnings 'uninitialized'; + + # It really doesn't matter how we sort them, as long as both arrays are + # sorted with the same algorithm. + # + # Ensure that references are not accidentally treated the same as a + # string containing the reference. + # + # Have to inline the sort routine due to a threading/sort bug. + # See [rt.cpan.org 6782] + # + # I don't know how references would be sorted so we just don't sort + # them. This means eq_set doesn't really work with refs. + return eq_array( + [ grep( ref, @$a1 ), sort( grep( !ref, @$a1 ) ) ], + [ grep( ref, @$a2 ), sort( grep( !ref, @$a2 ) ) ], + ); +} + + +1; +# You may distribute under the terms of either the GNU General Public License +# or the Artistic License (the same terms as Perl itself) +# +# (C) Paul Evans, 2014-2015 -- leonerd@leonerd.org.uk + +package Test::Future; + +use strict; +use warnings; +use base qw( Test::Builder::Module ); + +our $VERSION = '0.39'; + +our @EXPORT = qw( + no_pending_futures +); + +use Scalar::Util qw( refaddr ); + +use constant HAVE_DEVEL_MAT_DUMPER => defined eval { require Devel::MAT::Dumper }; + + + + +sub no_pending_futures(&@) +{ + my ( $code, $name ) = @_; + + my @futures; + + no warnings 'redefine'; + + my $new = Future->can( "new" ); + local *Future::new = sub { + my $f = $new->(@_); + push @futures, $f; + $f->on_ready( sub { + my $f = shift; + for ( 0 .. $#futures ) { + refaddr( $futures[$_] ) == refaddr( $f ) or next; + + splice @futures, $_, 1, (); + return; + } + }); + return $f; + }; + + my $done = Future->can( "done" ); + local *Future::done = sub { + my $f = $done->(@_); + pop @futures if !ref $_[0]; # class method + return $f; + }; + + my $fail = Future->can( "fail" ); + local *Future::fail = sub { + my $f = $fail->(@_); + pop @futures if !ref $_[0]; # class method + return $f; + }; + + my $tb = __PACKAGE__->builder; + + $code->(); + + my @pending = grep { !$_->is_ready } @futures; + + return $tb->ok( 1, $name ) if !@pending; + + my $ok = $tb->ok( 0, $name ); + + $tb->diag( "The following Futures are still pending:" ); + $tb->diag( join ", ", map { sprintf "0x%x", refaddr $_ } @pending ); + + if( HAVE_DEVEL_MAT_DUMPER ) { + my $file = $0; + my $num = $tb->current_test; + + # Trim the .t off first then append -$num.pmat, in case $0 wasn't a .t file + $file =~ s/\.(?:t|pm|pl)$//; + $file .= "-$num.pmat"; + + $tb->diag( "Writing heap dump to $file" ); + Devel::MAT::Dumper::dump( $file ); + } + + return $ok; +} + + +0x55AA; +package Test::Builder; + +use 5.006; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { + if( $] < 5.008 ) { + require Test::Builder::IO::Scalar; + } +} + +use Scalar::Util qw/blessed reftype weaken/; + +use Test2::Util qw/USE_THREADS try get_tid/; +use Test2::API qw/context release/; +# Make Test::Builder thread-safe for ithreads. +BEGIN { + warn "Test::Builder was loaded after Test2 initialization, this is not recommended." + if Test2::API::test2_init_done() || Test2::API::test2_load_done(); + + if (USE_THREADS && ! Test2::API::test2_ipc_disabled()) { + require Test2::IPC; + require Test2::IPC::Driver::Files; + Test2::IPC::Driver::Files->import; + Test2::API::test2_ipc_enable_polling(); + Test2::API::test2_no_wait(1); + Test2::API::test2_ipc_enable_shm(); + } +} + +use Test2::Event::Subtest; +use Test2::Hub::Subtest; + +use Test::Builder::Formatter; +use Test::Builder::TodoDiag; + +our $Level = 1; +our $Test = $ENV{TB_NO_EARLY_INIT} ? undef : Test::Builder->new; + +sub _add_ts_hooks { + my $self = shift; + + my $hub = $self->{Stack}->top; + + # Take a reference to the hash key, we do this to avoid closing over $self + # which is the singleton. We use a reference because the value could change + # in rare cases. + my $epkgr = \$self->{Exported_To}; + + #$hub->add_context_aquire(sub {$_[0]->{level} += $Level - 1}); + + $hub->pre_filter(sub { + my ($active_hub, $e) = @_; + + my $epkg = $$epkgr; + my $cpkg = $e->{trace} ? $e->{trace}->{frame}->[0] : undef; + + no strict 'refs'; + no warnings 'once'; + my $todo; + $todo = ${"$cpkg\::TODO"} if $cpkg; + $todo = ${"$epkg\::TODO"} if $epkg && !$todo; + + return $e unless $todo; + + # Turn a diag into a todo diag + return Test::Builder::TodoDiag->new(%$e) if ref($e) eq 'Test2::Event::Diag'; + + if ($active_hub == $hub) { + $e->set_todo($todo) if $e->can('set_todo'); + $e->add_amnesty({tag => 'TODO', details => $todo}); + } + else { + $e->add_amnesty({tag => 'TODO', details => $todo, inherited => 1}); + } + + # Set todo on ok's + if ($e->isa('Test2::Event::Ok')) { + $e->set_effective_pass(1); + + if (my $result = $e->get_meta(__PACKAGE__)) { + $result->{reason} ||= $todo; + $result->{type} ||= 'todo'; + $result->{ok} = 1; + } + } + + return $e; + }, inherit => 1); +} + +{ + no warnings; + INIT { + use warnings; + Test2::API::test2_load() unless Test2::API::test2_in_preload(); + } +} + +sub new { + my($class) = shift; + unless($Test) { + $Test = $class->create(singleton => 1); + + Test2::API::test2_add_callback_post_load( + sub { + $Test->{Original_Pid} = $$ if !$Test->{Original_Pid} || $Test->{Original_Pid} == 0; + $Test->reset(singleton => 1); + $Test->_add_ts_hooks; + } + ); + + # Non-TB tools normally expect 0 added to the level. $Level is normally 1. So + # we only want the level to change if $Level != 1. + # TB->ctx compensates for this later. + Test2::API::test2_add_callback_context_aquire(sub { $_[0]->{level} += $Level - 1 }); + + Test2::API::test2_add_callback_exit(sub { $Test->_ending(@_) }); + + Test2::API::test2_ipc()->set_no_fatal(1) if Test2::API::test2_has_ipc(); + } + return $Test; +} + +sub create { + my $class = shift; + my %params = @_; + + my $self = bless {}, $class; + if ($params{singleton}) { + $self->{Stack} = Test2::API::test2_stack(); + } + else { + $self->{Stack} = Test2::API::Stack->new; + $self->{Stack}->new_hub( + formatter => Test::Builder::Formatter->new, + ipc => Test2::API::test2_ipc(), + ); + + $self->reset(%params); + $self->_add_ts_hooks; + } + + return $self; +} + +sub ctx { + my $self = shift; + context( + # 1 for our frame, another for the -1 off of $Level in our hook at the top. + level => 2, + fudge => 1, + stack => $self->{Stack}, + hub => $self->{Hub}, + wrapped => 1, + @_ + ); +} + +sub parent { + my $self = shift; + my $ctx = $self->ctx; + my $chub = $self->{Hub} || $ctx->hub; + $ctx->release; + + my $meta = $chub->meta(__PACKAGE__, {}); + my $parent = $meta->{parent}; + + return undef unless $parent; + + return bless { + Original_Pid => $$, + Stack => $self->{Stack}, + Hub => $parent, + }, blessed($self); +} + +sub child { + my( $self, $name ) = @_; + + $name ||= "Child of " . $self->name; + my $ctx = $self->ctx; + + my $parent = $ctx->hub; + my $pmeta = $parent->meta(__PACKAGE__, {}); + $self->croak("You already have a child named ($pmeta->{child}) running") + if $pmeta->{child}; + + $pmeta->{child} = $name; + + # Clear $TODO for the child. + my $orig_TODO = $self->find_TODO(undef, 1, undef); + + my $subevents = []; + + my $hub = $ctx->stack->new_hub( + class => 'Test2::Hub::Subtest', + ); + + $hub->pre_filter(sub { + my ($active_hub, $e) = @_; + + # Turn a diag into a todo diag + return Test::Builder::TodoDiag->new(%$e) if ref($e) eq 'Test2::Event::Diag'; + + return $e; + }, inherit => 1) if $orig_TODO; + + $hub->listen(sub { push @$subevents => $_[1] }); + + $hub->set_nested( $parent->nested + 1 ); + + my $meta = $hub->meta(__PACKAGE__, {}); + $meta->{Name} = $name; + $meta->{TODO} = $orig_TODO; + $meta->{TODO_PKG} = $ctx->trace->package; + $meta->{parent} = $parent; + $meta->{Test_Results} = []; + $meta->{subevents} = $subevents; + $meta->{subtest_id} = $hub->id; + $meta->{subtest_uuid} = $hub->uuid; + $meta->{subtest_buffered} = $parent->format ? 0 : 1; + + $self->_add_ts_hooks; + + $ctx->release; + return bless { Original_Pid => $$, Stack => $self->{Stack}, Hub => $hub, no_log_results => $self->{no_log_results} }, blessed($self); +} + +sub finalize { + my $self = shift; + my $ok = 1; + ($ok) = @_ if @_; + + my $st_ctx = $self->ctx; + my $chub = $self->{Hub} || return $st_ctx->release; + + my $meta = $chub->meta(__PACKAGE__, {}); + if ($meta->{child}) { + $self->croak("Can't call finalize() with child ($meta->{child}) active"); + } + + local $? = 0; # don't fail if $subtests happened to set $? nonzero + + $self->{Stack}->pop($chub); + + $self->find_TODO($meta->{TODO_PKG}, 1, $meta->{TODO}); + + my $parent = $self->parent; + my $ctx = $parent->ctx; + my $trace = $ctx->trace; + delete $ctx->hub->meta(__PACKAGE__, {})->{child}; + + $chub->finalize($trace->snapshot(hid => $chub->hid, nested => $chub->nested), 1) + if $ok + && $chub->count + && !$chub->no_ending + && !$chub->ended; + + my $plan = $chub->plan || 0; + my $count = $chub->count; + my $failed = $chub->failed; + my $passed = $chub->is_passing; + + my $num_extra = $plan =~ m/\D/ ? 0 : $count - $plan; + if ($count && $num_extra != 0) { + my $s = $plan == 1 ? '' : 's'; + $st_ctx->diag(<<"FAIL"); +Looks like you planned $plan test$s but ran $count. +FAIL + } + + if ($failed) { + my $s = $failed == 1 ? '' : 's'; + + my $qualifier = $num_extra == 0 ? '' : ' run'; + + $st_ctx->diag(<<"FAIL"); +Looks like you failed $failed test$s of $count$qualifier. +FAIL + } + + if (!$passed && !$failed && $count && !$num_extra) { + $st_ctx->diag(<<"FAIL"); +All assertions inside the subtest passed, but errors were encountered. +FAIL + } + + $st_ctx->release; + + unless ($chub->bailed_out) { + my $plan = $chub->plan; + if ( $plan && $plan eq 'SKIP' ) { + $parent->skip($chub->skip_reason, $meta->{Name}); + } + elsif ( !$chub->count ) { + $parent->ok( 0, sprintf q[No tests run for subtest "%s"], $meta->{Name} ); + } + else { + $parent->{subevents} = $meta->{subevents}; + $parent->{subtest_id} = $meta->{subtest_id}; + $parent->{subtest_uuid} = $meta->{subtest_uuid}; + $parent->{subtest_buffered} = $meta->{subtest_buffered}; + $parent->ok( $chub->is_passing, $meta->{Name} ); + } + } + + $ctx->release; + return $chub->is_passing; +} + +sub subtest { + my $self = shift; + my ($name, $code, @args) = @_; + my $ctx = $self->ctx; + $ctx->throw("subtest()'s second argument must be a code ref") + unless $code && reftype($code) eq 'CODE'; + + $name ||= "Child of " . $self->name; + + + $_->($name,$code,@args) + for Test2::API::test2_list_pre_subtest_callbacks(); + + $ctx->note("Subtest: $name"); + + my $child = $self->child($name); + + my $start_pid = $$; + my $st_ctx; + my ($ok, $err, $finished, $child_error); + T2_SUBTEST_WRAPPER: { + my $ctx = $self->ctx; + $st_ctx = $ctx->snapshot; + $ctx->release; + $ok = eval { local $Level = 1; $code->(@args); 1 }; + ($err, $child_error) = ($@, $?); + + # They might have done 'BEGIN { skip_all => "whatever" }' + if (!$ok && $err =~ m/Label not found for "last T2_SUBTEST_WRAPPER"/ || (blessed($err) && blessed($err) eq 'Test::Builder::Exception')) { + $ok = undef; + $err = undef; + } + else { + $finished = 1; + } + } + + if ($start_pid != $$ && !$INC{'Test2/IPC.pm'}) { + warn $ok ? "Forked inside subtest, but subtest never finished!\n" : $err; + exit 255; + } + + my $trace = $ctx->trace; + + if (!$finished) { + if(my $bailed = $st_ctx->hub->bailed_out) { + my $chub = $child->{Hub}; + $self->{Stack}->pop($chub); + $ctx->bail($bailed->reason); + } + my $code = $st_ctx->hub->exit_code; + $ok = !$code; + $err = "Subtest ended with exit code $code" if $code; + } + + my $st_hub = $st_ctx->hub; + my $plan = $st_hub->plan; + my $count = $st_hub->count; + + if (!$count && (!defined($plan) || "$plan" ne 'SKIP')) { + $st_ctx->plan(0) unless defined $plan; + $st_ctx->diag('No tests run!'); + } + + $child->finalize($st_ctx->trace); + + $ctx->release; + + die $err unless $ok; + + $? = $child_error if defined $child_error; + + return $st_hub->is_passing; +} + +sub name { + my $self = shift; + my $ctx = $self->ctx; + release $ctx, $ctx->hub->meta(__PACKAGE__, {})->{Name}; +} + +sub reset { ## no critic (Subroutines::ProhibitBuiltinHomonyms) + my ($self, %params) = @_; + + Test2::API::test2_set_is_end(0); + + # We leave this a global because it has to be localized and localizing + # hash keys is just asking for pain. Also, it was documented. + $Level = 1; + + $self->{no_log_results} = $ENV{TEST_NO_LOG_RESULTS} ? 1 : 0 + unless $params{singleton}; + + $self->{Original_Pid} = Test2::API::test2_in_preload() ? -1 : $$; + + my $ctx = $self->ctx; + my $hub = $ctx->hub; + $ctx->release; + unless ($params{singleton}) { + $hub->reset_state(); + $hub->_tb_reset(); + } + + $ctx = $self->ctx; + + my $meta = $ctx->hub->meta(__PACKAGE__, {}); + %$meta = ( + Name => $0, + Ending => 0, + Done_Testing => undef, + Skip_All => 0, + Test_Results => [], + parent => $meta->{parent}, + ); + + $self->{Exported_To} = undef unless $params{singleton}; + + $self->{Orig_Handles} ||= do { + my $format = $ctx->hub->format; + my $out; + if ($format && $format->isa('Test2::Formatter::TAP')) { + $out = $format->handles; + } + $out ? [@$out] : []; + }; + + $self->use_numbers(1); + $self->no_header(0) unless $params{singleton}; + $self->no_ending(0) unless $params{singleton}; + $self->reset_outputs; + + $ctx->release; + + return; +} + + +my %plan_cmds = ( + no_plan => \&no_plan, + skip_all => \&skip_all, + tests => \&_plan_tests, +); + +sub plan { + my( $self, $cmd, $arg ) = @_; + + return unless $cmd; + + my $ctx = $self->ctx; + my $hub = $ctx->hub; + + $ctx->throw("You tried to plan twice") if $hub->plan; + + local $Level = $Level + 1; + + if( my $method = $plan_cmds{$cmd} ) { + local $Level = $Level + 1; + $self->$method($arg); + } + else { + my @args = grep { defined } ( $cmd, $arg ); + $ctx->throw("plan() doesn't understand @args"); + } + + release $ctx, 1; +} + + +sub _plan_tests { + my($self, $arg) = @_; + + my $ctx = $self->ctx; + + if($arg) { + local $Level = $Level + 1; + $self->expected_tests($arg); + } + elsif( !defined $arg ) { + $ctx->throw("Got an undefined number of tests"); + } + else { + $ctx->throw("You said to run 0 tests"); + } + + $ctx->release; +} + + +sub expected_tests { + my $self = shift; + my($max) = @_; + + my $ctx = $self->ctx; + + if(@_) { + $self->croak("Number of tests must be a positive integer. You gave it '$max'") + unless $max =~ /^\+?\d+$/; + + $ctx->plan($max); + } + + my $hub = $ctx->hub; + + $ctx->release; + + my $plan = $hub->plan; + return 0 unless $plan; + return 0 if $plan =~ m/\D/; + return $plan; +} + + +sub no_plan { + my($self, $arg) = @_; + + my $ctx = $self->ctx; + + if (defined $ctx->hub->plan) { + warn "Plan already set, no_plan() is a no-op, this will change to a hard failure in the future."; + $ctx->release; + return; + } + + $ctx->alert("no_plan takes no arguments") if $arg; + + $ctx->hub->plan('NO PLAN'); + + release $ctx, 1; +} + + +sub done_testing { + my($self, $num_tests) = @_; + + my $ctx = $self->ctx; + + my $meta = $ctx->hub->meta(__PACKAGE__, {}); + + if ($meta->{Done_Testing}) { + my ($file, $line) = @{$meta->{Done_Testing}}[1,2]; + local $ctx->hub->{ended}; # OMG This is awful. + $self->ok(0, "done_testing() was already called at $file line $line"); + $ctx->release; + return; + } + $meta->{Done_Testing} = [$ctx->trace->call]; + + my $plan = $ctx->hub->plan; + my $count = $ctx->hub->count; + + # If done_testing() specified the number of tests, shut off no_plan + if( defined $num_tests ) { + $ctx->plan($num_tests) if !$plan || $plan eq 'NO PLAN'; + } + elsif ($count && defined $num_tests && $count != $num_tests) { + $self->ok(0, "planned to run @{[ $self->expected_tests ]} but done_testing() expects $num_tests"); + } + else { + $num_tests = $self->current_test; + } + + if( $self->expected_tests && $num_tests != $self->expected_tests ) { + $self->ok(0, "planned to run @{[ $self->expected_tests ]} ". + "but done_testing() expects $num_tests"); + } + + $ctx->plan($num_tests) if $ctx->hub->plan && $ctx->hub->plan eq 'NO PLAN'; + + $ctx->hub->finalize($ctx->trace, 1); + + release $ctx, 1; +} + + +sub has_plan { + my $self = shift; + + my $ctx = $self->ctx; + my $plan = $ctx->hub->plan; + $ctx->release; + + return( $plan ) if $plan && $plan !~ m/\D/; + return('no_plan') if $plan && $plan eq 'NO PLAN'; + return(undef); +} + + +sub skip_all { + my( $self, $reason ) = @_; + + my $ctx = $self->ctx; + + $ctx->hub->meta(__PACKAGE__, {})->{Skip_All} = $reason || 1; + + # Work around old perl bug + if ($] < 5.020000) { + my $begin = 0; + my $level = 0; + while (my @call = caller($level++)) { + last unless @call && $call[0]; + next unless $call[3] =~ m/::BEGIN$/; + $begin++; + last; + } + # HACK! + die 'Label not found for "last T2_SUBTEST_WRAPPER"' if $begin && $ctx->hub->meta(__PACKAGE__, {})->{parent}; + } + + $ctx->plan(0, SKIP => $reason); +} + + +sub exported_to { + my( $self, $pack ) = @_; + + if( defined $pack ) { + $self->{Exported_To} = $pack; + } + return $self->{Exported_To}; +} + + +sub ok { + my( $self, $test, $name ) = @_; + + my $ctx = $self->ctx; + + # $test might contain an object which we don't want to accidentally + # store, so we turn it into a boolean. + $test = $test ? 1 : 0; + + # In case $name is a string overloaded object, force it to stringify. + no warnings qw/uninitialized numeric/; + $name = "$name" if defined $name; + + # Profiling showed that the regex here was a huge time waster, doing the + # numeric addition first cuts our profile time from ~300ms to ~50ms + $self->diag(<<" ERR") if 0 + $name && $name =~ /^[\d\s]+$/; + You named your test '$name'. You shouldn't use numbers for your test names. + Very confusing. + ERR + use warnings qw/uninitialized numeric/; + + my $trace = $ctx->{trace}; + my $hub = $ctx->{hub}; + + my $result = { + ok => $test, + actual_ok => $test, + reason => '', + type => '', + (name => defined($name) ? $name : ''), + }; + + $hub->{_meta}->{+__PACKAGE__}->{Test_Results}[ $hub->{count} ] = $result unless $self->{no_log_results}; + + my $orig_name = $name; + + my @attrs; + my $subevents = delete $self->{subevents}; + my $subtest_id = delete $self->{subtest_id}; + my $subtest_uuid = delete $self->{subtest_uuid}; + my $subtest_buffered = delete $self->{subtest_buffered}; + my $epkg = 'Test2::Event::Ok'; + if ($subevents) { + $epkg = 'Test2::Event::Subtest'; + push @attrs => (subevents => $subevents, subtest_id => $subtest_id, subtest_uuid => $subtest_uuid, buffered => $subtest_buffered); + } + + my $e = bless { + trace => bless( {%$trace}, 'Test2::EventFacet::Trace'), + pass => $test, + name => $name, + _meta => {'Test::Builder' => $result}, + effective_pass => $test, + @attrs, + }, $epkg; + $hub->send($e); + + $self->_ok_debug($trace, $orig_name) unless($test); + + $ctx->release; + return $test; +} + +sub _ok_debug { + my $self = shift; + my ($trace, $orig_name) = @_; + + my $is_todo = defined($self->todo); + + my $msg = $is_todo ? "Failed (TODO)" : "Failed"; + + my (undef, $file, $line) = $trace->call; + if (defined $orig_name) { + $self->diag(qq[ $msg test '$orig_name'\n at $file line $line.\n]); + } + else { + $self->diag(qq[ $msg test at $file line $line.\n]); + } +} + +sub _diag_fh { + my $self = shift; + local $Level = $Level + 1; + return $self->in_todo ? $self->todo_output : $self->failure_output; +} + +sub _unoverload { + my ($self, $type, $thing) = @_; + + return unless ref $$thing; + return unless blessed($$thing) || scalar $self->_try(sub{ $$thing->isa('UNIVERSAL') }); + { + local ($!, $@); + require overload; + } + my $string_meth = overload::Method( $$thing, $type ) || return; + $$thing = $$thing->$string_meth(); +} + +sub _unoverload_str { + my $self = shift; + + $self->_unoverload( q[""], $_ ) for @_; +} + +sub _unoverload_num { + my $self = shift; + + $self->_unoverload( '0+', $_ ) for @_; + + for my $val (@_) { + next unless $self->_is_dualvar($$val); + $$val = $$val + 0; + } +} + +# This is a hack to detect a dualvar such as $! +sub _is_dualvar { + my( $self, $val ) = @_; + + # Objects are not dualvars. + return 0 if ref $val; + + no warnings 'numeric'; + my $numval = $val + 0; + return ($numval != 0 and $numval ne $val ? 1 : 0); +} + + +sub is_eq { + my( $self, $got, $expect, $name ) = @_; + + my $ctx = $self->ctx; + + local $Level = $Level + 1; + + if( !defined $got || !defined $expect ) { + # undef only matches undef and nothing else + my $test = !defined $got && !defined $expect; + + $self->ok( $test, $name ); + $self->_is_diag( $got, 'eq', $expect ) unless $test; + $ctx->release; + return $test; + } + + release $ctx, $self->cmp_ok( $got, 'eq', $expect, $name ); +} + + +sub is_num { + my( $self, $got, $expect, $name ) = @_; + my $ctx = $self->ctx; + local $Level = $Level + 1; + + if( !defined $got || !defined $expect ) { + # undef only matches undef and nothing else + my $test = !defined $got && !defined $expect; + + $self->ok( $test, $name ); + $self->_is_diag( $got, '==', $expect ) unless $test; + $ctx->release; + return $test; + } + + release $ctx, $self->cmp_ok( $got, '==', $expect, $name ); +} + + +sub _diag_fmt { + my( $self, $type, $val ) = @_; + + if( defined $$val ) { + if( $type eq 'eq' or $type eq 'ne' ) { + # quote and force string context + $$val = "'$$val'"; + } + else { + # force numeric context + $self->_unoverload_num($val); + } + } + else { + $$val = 'undef'; + } + + return; +} + + +sub _is_diag { + my( $self, $got, $type, $expect ) = @_; + + $self->_diag_fmt( $type, $_ ) for \$got, \$expect; + + local $Level = $Level + 1; + return $self->diag(<<"DIAGNOSTIC"); + got: $got + expected: $expect +DIAGNOSTIC + +} + +sub _isnt_diag { + my( $self, $got, $type ) = @_; + + $self->_diag_fmt( $type, \$got ); + + local $Level = $Level + 1; + return $self->diag(<<"DIAGNOSTIC"); + got: $got + expected: anything else +DIAGNOSTIC +} + + +sub isnt_eq { + my( $self, $got, $dont_expect, $name ) = @_; + my $ctx = $self->ctx; + local $Level = $Level + 1; + + if( !defined $got || !defined $dont_expect ) { + # undef only matches undef and nothing else + my $test = defined $got || defined $dont_expect; + + $self->ok( $test, $name ); + $self->_isnt_diag( $got, 'ne' ) unless $test; + $ctx->release; + return $test; + } + + release $ctx, $self->cmp_ok( $got, 'ne', $dont_expect, $name ); +} + +sub isnt_num { + my( $self, $got, $dont_expect, $name ) = @_; + my $ctx = $self->ctx; + local $Level = $Level + 1; + + if( !defined $got || !defined $dont_expect ) { + # undef only matches undef and nothing else + my $test = defined $got || defined $dont_expect; + + $self->ok( $test, $name ); + $self->_isnt_diag( $got, '!=' ) unless $test; + $ctx->release; + return $test; + } + + release $ctx, $self->cmp_ok( $got, '!=', $dont_expect, $name ); +} + + +sub like { + my( $self, $thing, $regex, $name ) = @_; + my $ctx = $self->ctx; + + local $Level = $Level + 1; + + release $ctx, $self->_regex_ok( $thing, $regex, '=~', $name ); +} + +sub unlike { + my( $self, $thing, $regex, $name ) = @_; + my $ctx = $self->ctx; + + local $Level = $Level + 1; + + release $ctx, $self->_regex_ok( $thing, $regex, '!~', $name ); +} + + +my %numeric_cmps = map { ( $_, 1 ) } ( "<", "<=", ">", ">=", "==", "!=", "<=>" ); + +# Bad, these are not comparison operators. Should we include more? +my %cmp_ok_bl = map { ( $_, 1 ) } ( "=", "+=", ".=", "x=", "^=", "|=", "||=", "&&=", "..."); + +sub cmp_ok { + my( $self, $got, $type, $expect, $name ) = @_; + my $ctx = $self->ctx; + + if ($cmp_ok_bl{$type}) { + $ctx->throw("$type is not a valid comparison operator in cmp_ok()"); + } + + my ($test, $succ); + my $error; + { + ## no critic (BuiltinFunctions::ProhibitStringyEval) + + local( $@, $!, $SIG{__DIE__} ); # isolate eval + + my($pack, $file, $line) = $ctx->trace->call(); + + # This is so that warnings come out at the caller's level + $succ = eval qq[ +#line $line "(eval in cmp_ok) $file" +\$test = (\$got $type \$expect); +1; +]; + $error = $@; + } + local $Level = $Level + 1; + my $ok = $self->ok( $test, $name ); + + # Treat overloaded objects as numbers if we're asked to do a + # numeric comparison. + my $unoverload + = $numeric_cmps{$type} + ? '_unoverload_num' + : '_unoverload_str'; + + $self->diag(<<"END") unless $succ; +An error occurred while using $type: +------------------------------------ +$error +------------------------------------ +END + + unless($ok) { + $self->$unoverload( \$got, \$expect ); + + if( $type =~ /^(eq|==)$/ ) { + $self->_is_diag( $got, $type, $expect ); + } + elsif( $type =~ /^(ne|!=)$/ ) { + no warnings; + my $eq = ($got eq $expect || $got == $expect) + && ( + (defined($got) xor defined($expect)) + || (length($got) != length($expect)) + ); + use warnings; + + if ($eq) { + $self->_cmp_diag( $got, $type, $expect ); + } + else { + $self->_isnt_diag( $got, $type ); + } + } + else { + $self->_cmp_diag( $got, $type, $expect ); + } + } + return release $ctx, $ok; +} + +sub _cmp_diag { + my( $self, $got, $type, $expect ) = @_; + + $got = defined $got ? "'$got'" : 'undef'; + $expect = defined $expect ? "'$expect'" : 'undef'; + + local $Level = $Level + 1; + return $self->diag(<<"DIAGNOSTIC"); + $got + $type + $expect +DIAGNOSTIC +} + +sub _caller_context { + my $self = shift; + + my( $pack, $file, $line ) = $self->caller(1); + + my $code = ''; + $code .= "#line $line $file\n" if defined $file and defined $line; + + return $code; +} + + +sub BAIL_OUT { + my( $self, $reason ) = @_; + + my $ctx = $self->ctx; + + $self->{Bailed_Out} = 1; + + $ctx->bail($reason); +} + + +{ + no warnings 'once'; + *BAILOUT = \&BAIL_OUT; +} + +sub skip { + my( $self, $why, $name ) = @_; + $why ||= ''; + $name = '' unless defined $name; + $self->_unoverload_str( \$why ); + + my $ctx = $self->ctx; + + $ctx->hub->meta(__PACKAGE__, {})->{Test_Results}[ $ctx->hub->count ] = { + 'ok' => 1, + actual_ok => 1, + name => $name, + type => 'skip', + reason => $why, + } unless $self->{no_log_results}; + + $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. + $name =~ s{\n}{\n# }sg; + $why =~ s{\n}{\n# }sg; + + my $tctx = $ctx->snapshot; + $tctx->skip('', $why); + + return release $ctx, 1; +} + + +sub todo_skip { + my( $self, $why ) = @_; + $why ||= ''; + + my $ctx = $self->ctx; + + $ctx->hub->meta(__PACKAGE__, {})->{Test_Results}[ $ctx->hub->count ] = { + 'ok' => 1, + actual_ok => 0, + name => '', + type => 'todo_skip', + reason => $why, + } unless $self->{no_log_results}; + + $why =~ s{\n}{\n# }sg; + my $tctx = $ctx->snapshot; + $tctx->send_event( 'Skip', todo => $why, todo_diag => 1, reason => $why, pass => 0); + + return release $ctx, 1; +} + + +sub maybe_regex { + my( $self, $regex ) = @_; + my $usable_regex = undef; + + return $usable_regex unless defined $regex; + + my( $re, $opts ); + + # Check for qr/foo/ + if( _is_qr($regex) ) { + $usable_regex = $regex; + } + # Check for '/foo/' or 'm,foo,' + elsif(( $re, $opts ) = $regex =~ m{^ /(.*)/ (\w*) $ }sx or + ( undef, $re, $opts ) = $regex =~ m,^ m([^\w\s]) (.+) \1 (\w*) $,sx + ) + { + $usable_regex = length $opts ? "(?$opts)$re" : $re; + } + + return $usable_regex; +} + +sub _is_qr { + my $regex = shift; + + # is_regexp() checks for regexes in a robust manner, say if they're + # blessed. + return re::is_regexp($regex) if defined &re::is_regexp; + return ref $regex eq 'Regexp'; +} + +sub _regex_ok { + my( $self, $thing, $regex, $cmp, $name ) = @_; + + my $ok = 0; + my $usable_regex = $self->maybe_regex($regex); + unless( defined $usable_regex ) { + local $Level = $Level + 1; + $ok = $self->ok( 0, $name ); + $self->diag(" '$regex' doesn't look much like a regex to me."); + return $ok; + } + + { + my $test; + my $context = $self->_caller_context; + + { + ## no critic (BuiltinFunctions::ProhibitStringyEval) + + local( $@, $!, $SIG{__DIE__} ); # isolate eval + + # No point in issuing an uninit warning, they'll see it in the diagnostics + no warnings 'uninitialized'; + + $test = eval $context . q{$test = $thing =~ /$usable_regex/ ? 1 : 0}; + } + + $test = !$test if $cmp eq '!~'; + + local $Level = $Level + 1; + $ok = $self->ok( $test, $name ); + } + + unless($ok) { + $thing = defined $thing ? "'$thing'" : 'undef'; + my $match = $cmp eq '=~' ? "doesn't match" : "matches"; + + local $Level = $Level + 1; + $self->diag( sprintf <<'DIAGNOSTIC', $thing, $match, $regex ); + %s + %13s '%s' +DIAGNOSTIC + + } + + return $ok; +} + + +sub is_fh { + my $self = shift; + my $maybe_fh = shift; + return 0 unless defined $maybe_fh; + + return 1 if ref $maybe_fh eq 'GLOB'; # its a glob ref + return 1 if ref \$maybe_fh eq 'GLOB'; # its a glob + + return eval { $maybe_fh->isa("IO::Handle") } || + eval { tied($maybe_fh)->can('TIEHANDLE') }; +} + + +sub level { + my( $self, $level ) = @_; + + if( defined $level ) { + $Level = $level; + } + return $Level; +} + + +sub use_numbers { + my( $self, $use_nums ) = @_; + + my $ctx = $self->ctx; + my $format = $ctx->hub->format; + unless ($format && $format->can('no_numbers') && $format->can('set_no_numbers')) { + warn "The current formatter does not support 'use_numbers'" if $format; + return release $ctx, 0; + } + + $format->set_no_numbers(!$use_nums) if defined $use_nums; + + return release $ctx, $format->no_numbers ? 0 : 1; +} + +BEGIN { + for my $method (qw(no_header no_diag)) { + my $set = "set_$method"; + my $code = sub { + my( $self, $no ) = @_; + + my $ctx = $self->ctx; + my $format = $ctx->hub->format; + unless ($format && $format->can($set)) { + warn "The current formatter does not support '$method'" if $format; + $ctx->release; + return + } + + $format->$set($no) if defined $no; + + return release $ctx, $format->$method ? 1 : 0; + }; + + no strict 'refs'; ## no critic + *$method = $code; + } +} + +sub no_ending { + my( $self, $no ) = @_; + + my $ctx = $self->ctx; + + $ctx->hub->set_no_ending($no) if defined $no; + + return release $ctx, $ctx->hub->no_ending; +} + +sub diag { + my $self = shift; + return unless @_; + + my $text = join '' => map {defined($_) ? $_ : 'undef'} @_; + + if (Test2::API::test2_in_preload()) { + chomp($text); + $text =~ s/^/# /msg; + print STDERR $text, "\n"; + return 0; + } + + my $ctx = $self->ctx; + $ctx->diag($text); + $ctx->release; + return 0; +} + + +sub note { + my $self = shift; + return unless @_; + + my $text = join '' => map {defined($_) ? $_ : 'undef'} @_; + + if (Test2::API::test2_in_preload()) { + chomp($text); + $text =~ s/^/# /msg; + print STDOUT $text, "\n"; + return 0; + } + + my $ctx = $self->ctx; + $ctx->note($text); + $ctx->release; + return 0; +} + + +sub explain { + my $self = shift; + + local ($@, $!); + require Data::Dumper; + + return map { + ref $_ + ? do { + my $dumper = Data::Dumper->new( [$_] ); + $dumper->Indent(1)->Terse(1); + $dumper->Sortkeys(1) if $dumper->can("Sortkeys"); + $dumper->Dump; + } + : $_ + } @_; +} + + +sub output { + my( $self, $fh ) = @_; + + my $ctx = $self->ctx; + my $format = $ctx->hub->format; + $ctx->release; + return unless $format && $format->isa('Test2::Formatter::TAP'); + + $format->handles->[Test2::Formatter::TAP::OUT_STD()] = $self->_new_fh($fh) + if defined $fh; + + return $format->handles->[Test2::Formatter::TAP::OUT_STD()]; +} + +sub failure_output { + my( $self, $fh ) = @_; + + my $ctx = $self->ctx; + my $format = $ctx->hub->format; + $ctx->release; + return unless $format && $format->isa('Test2::Formatter::TAP'); + + $format->handles->[Test2::Formatter::TAP::OUT_ERR()] = $self->_new_fh($fh) + if defined $fh; + + return $format->handles->[Test2::Formatter::TAP::OUT_ERR()]; +} + +sub todo_output { + my( $self, $fh ) = @_; + + my $ctx = $self->ctx; + my $format = $ctx->hub->format; + $ctx->release; + return unless $format && $format->isa('Test::Builder::Formatter'); + + $format->handles->[Test::Builder::Formatter::OUT_TODO()] = $self->_new_fh($fh) + if defined $fh; + + return $format->handles->[Test::Builder::Formatter::OUT_TODO()]; +} + +sub _new_fh { + my $self = shift; + my($file_or_fh) = shift; + + my $fh; + if( $self->is_fh($file_or_fh) ) { + $fh = $file_or_fh; + } + elsif( ref $file_or_fh eq 'SCALAR' ) { + # Scalar refs as filehandles was added in 5.8. + if( $] >= 5.008 ) { + open $fh, ">>", $file_or_fh + or $self->croak("Can't open scalar ref $file_or_fh: $!"); + } + # Emulate scalar ref filehandles with a tie. + else { + $fh = Test::Builder::IO::Scalar->new($file_or_fh) + or $self->croak("Can't tie scalar ref $file_or_fh"); + } + } + else { + open $fh, ">", $file_or_fh + or $self->croak("Can't open test output log $file_or_fh: $!"); + _autoflush($fh); + } + + return $fh; +} + +sub _autoflush { + my($fh) = shift; + my $old_fh = select $fh; + $| = 1; + select $old_fh; + + return; +} + + +sub reset_outputs { + my $self = shift; + + my $ctx = $self->ctx; + my $format = $ctx->hub->format; + $ctx->release; + return unless $format && $format->isa('Test2::Formatter::TAP'); + $format->set_handles([@{$self->{Orig_Handles}}]) if $self->{Orig_Handles}; + + return; +} + + +sub carp { + my $self = shift; + my $ctx = $self->ctx; + $ctx->alert(join "", @_); + $ctx->release; +} + +sub croak { + my $self = shift; + my $ctx = $self->ctx; + $ctx->throw(join "", @_); + $ctx->release; +} + + +sub current_test { + my( $self, $num ) = @_; + + my $ctx = $self->ctx; + my $hub = $ctx->hub; + + if( defined $num ) { + $hub->set_count($num); + + unless ($self->{no_log_results}) { + # If the test counter is being pushed forward fill in the details. + my $test_results = $ctx->hub->meta(__PACKAGE__, {})->{Test_Results}; + if ($num > @$test_results) { + my $start = @$test_results ? @$test_results : 0; + for ($start .. $num - 1) { + $test_results->[$_] = { + 'ok' => 1, + actual_ok => undef, + reason => 'incrementing test number', + type => 'unknown', + name => undef + }; + } + } + # If backward, wipe history. Its their funeral. + elsif ($num < @$test_results) { + $#{$test_results} = $num - 1; + } + } + } + return release $ctx, $hub->count; +} + + +sub is_passing { + my $self = shift; + + my $ctx = $self->ctx; + my $hub = $ctx->hub; + + if( @_ ) { + my ($bool) = @_; + $hub->set_failed(0) if $bool; + $hub->is_passing($bool); + } + + return release $ctx, $hub->is_passing; +} + + +sub summary { + my($self) = shift; + + return if $self->{no_log_results}; + + my $ctx = $self->ctx; + my $data = $ctx->hub->meta(__PACKAGE__, {})->{Test_Results}; + $ctx->release; + return map { $_ ? $_->{'ok'} : () } @$data; +} + + +sub details { + my $self = shift; + + return if $self->{no_log_results}; + + my $ctx = $self->ctx; + my $data = $ctx->hub->meta(__PACKAGE__, {})->{Test_Results}; + $ctx->release; + return @$data; +} + + +sub find_TODO { + my( $self, $pack, $set, $new_value ) = @_; + + my $ctx = $self->ctx; + + $pack ||= $ctx->trace->package || $self->exported_to; + $ctx->release; + + return unless $pack; + + no strict 'refs'; ## no critic + no warnings 'once'; + my $old_value = ${ $pack . '::TODO' }; + $set and ${ $pack . '::TODO' } = $new_value; + return $old_value; +} + +sub todo { + my( $self, $pack ) = @_; + + local $Level = $Level + 1; + my $ctx = $self->ctx; + $ctx->release; + + my $meta = $ctx->hub->meta(__PACKAGE__, {todo => []})->{todo}; + return $meta->[-1]->[1] if $meta && @$meta; + + $pack ||= $ctx->trace->package; + + return unless $pack; + + no strict 'refs'; ## no critic + no warnings 'once'; + return ${ $pack . '::TODO' }; +} + +sub in_todo { + my $self = shift; + + local $Level = $Level + 1; + my $ctx = $self->ctx; + $ctx->release; + + my $meta = $ctx->hub->meta(__PACKAGE__, {todo => []})->{todo}; + return 1 if $meta && @$meta; + + my $pack = $ctx->trace->package || return 0; + + no strict 'refs'; ## no critic + no warnings 'once'; + my $todo = ${ $pack . '::TODO' }; + + return 0 unless defined $todo; + return 0 if "$todo" eq ''; + return 1; +} + +sub todo_start { + my $self = shift; + my $message = @_ ? shift : ''; + + my $ctx = $self->ctx; + + my $hub = $ctx->hub; + my $filter = $hub->pre_filter(sub { + my ($active_hub, $e) = @_; + + # Turn a diag into a todo diag + return Test::Builder::TodoDiag->new(%$e) if ref($e) eq 'Test2::Event::Diag'; + + # Set todo on ok's + if ($hub == $active_hub && $e->isa('Test2::Event::Ok')) { + $e->set_todo($message); + $e->set_effective_pass(1); + + if (my $result = $e->get_meta(__PACKAGE__)) { + $result->{reason} ||= $message; + $result->{type} ||= 'todo'; + $result->{ok} = 1; + } + } + + return $e; + }, inherit => 1); + + push @{$ctx->hub->meta(__PACKAGE__, {todo => []})->{todo}} => [$filter, $message]; + + $ctx->release; + + return; +} + +sub todo_end { + my $self = shift; + + my $ctx = $self->ctx; + + my $set = pop @{$ctx->hub->meta(__PACKAGE__, {todo => []})->{todo}}; + + $ctx->throw('todo_end() called without todo_start()') unless $set; + + $ctx->hub->pre_unfilter($set->[0]); + + $ctx->release; + + return; +} + + +sub caller { ## no critic (Subroutines::ProhibitBuiltinHomonyms) + my( $self ) = @_; + + my $ctx = $self->ctx; + + my $trace = $ctx->trace; + $ctx->release; + return wantarray ? $trace->call : $trace->package; +} + + +sub _try { + my( $self, $code, %opts ) = @_; + + my $error; + my $return; + { + local $!; # eval can mess up $! + local $@; # don't set $@ in the test + local $SIG{__DIE__}; # don't trip an outside DIE handler. + $return = eval { $code->() }; + $error = $@; + } + + die $error if $error and $opts{die_on_fail}; + + return wantarray ? ( $return, $error ) : $return; +} + +sub _ending { + my $self = shift; + my ($ctx, $real_exit_code, $new) = @_; + + unless ($ctx) { + my $octx = $self->ctx; + $ctx = $octx->snapshot; + $octx->release; + } + + return if $ctx->hub->no_ending; + return if $ctx->hub->meta(__PACKAGE__, {})->{Ending}++; + + # Don't bother with an ending if this is a forked copy. Only the parent + # should do the ending. + return unless $self->{Original_Pid} == $$; + + my $hub = $ctx->hub; + return if $hub->bailed_out; + + my $plan = $hub->plan; + my $count = $hub->count; + my $failed = $hub->failed; + my $passed = $hub->is_passing; + return unless $plan || $count || $failed; + + # Ran tests but never declared a plan or hit done_testing + if( !$hub->plan and $hub->count ) { + $self->diag("Tests were run but no plan was declared and done_testing() was not seen."); + + if($real_exit_code) { + $self->diag(<<"FAIL"); +Looks like your test exited with $real_exit_code just after $count. +FAIL + $$new ||= $real_exit_code; + return; + } + + # But if the tests ran, handle exit code. + if($failed > 0) { + my $exit_code = $failed <= 254 ? $failed : 254; + $$new ||= $exit_code; + return; + } + + $$new ||= 254; + return; + } + + if ($real_exit_code && !$count) { + $self->diag("Looks like your test exited with $real_exit_code before it could output anything."); + $$new ||= $real_exit_code; + return; + } + + return if $plan && "$plan" eq 'SKIP'; + + if (!$count) { + $self->diag('No tests run!'); + $$new ||= 255; + return; + } + + if ($real_exit_code) { + $self->diag(<<"FAIL"); +Looks like your test exited with $real_exit_code just after $count. +FAIL + $$new ||= $real_exit_code; + return; + } + + if ($plan eq 'NO PLAN') { + $ctx->plan( $count ); + $plan = $hub->plan; + } + + # Figure out if we passed or failed and print helpful messages. + my $num_extra = $count - $plan; + + if ($num_extra != 0) { + my $s = $plan == 1 ? '' : 's'; + $self->diag(<<"FAIL"); +Looks like you planned $plan test$s but ran $count. +FAIL + } + + if ($failed) { + my $s = $failed == 1 ? '' : 's'; + + my $qualifier = $num_extra == 0 ? '' : ' run'; + + $self->diag(<<"FAIL"); +Looks like you failed $failed test$s of $count$qualifier. +FAIL + } + + if (!$passed && !$failed && $count && !$num_extra) { + $ctx->diag(<<"FAIL"); +All assertions passed, but errors were encountered. +FAIL + } + + my $exit_code = 0; + if ($failed) { + $exit_code = $failed <= 254 ? $failed : 254; + } + elsif ($num_extra != 0) { + $exit_code = 255; + } + elsif (!$passed) { + $exit_code = 255; + } + + $$new ||= $exit_code; + return; +} + +# Some things used this even though it was private... I am looking at you +# Test::Builder::Prefix... +sub _print_comment { + my( $self, $fh, @msgs ) = @_; + + return if $self->no_diag; + return unless @msgs; + + # Prevent printing headers when compiling (i.e. -c) + return if $^C; + + # Smash args together like print does. + # Convert undef to 'undef' so its readable. + my $msg = join '', map { defined($_) ? $_ : 'undef' } @msgs; + + # Escape the beginning, _print will take care of the rest. + $msg =~ s/^/# /; + + local( $\, $", $, ) = ( undef, ' ', '' ); + print $fh $msg; + + return 0; +} + +# This is used by Test::SharedFork to turn on IPC after the fact. Not +# documenting because I do not want it used. The method name is borrowed from +# Test::Builder 2 +# Once Test2 stuff goes stable this method will be removed and Test::SharedFork +# will be made smarter. +sub coordinate_forks { + my $self = shift; + + { + local ($@, $!); + require Test2::IPC; + } + Test2::IPC->import; + Test2::API::test2_ipc_enable_polling(); + Test2::API::test2_load(); + my $ipc = Test2::IPC::apply_ipc($self->{Stack}); + $ipc->set_no_fatal(1); + Test2::API::test2_no_wait(1); + Test2::API::test2_ipc_enable_shm(); +} + +sub no_log_results { $_[0]->{no_log_results} = 1 } + +1; + +__END__ + + + +package Test::Simple; + +use 5.006; + +use strict; + +our $VERSION = '1.302133'; + +use Test::Builder::Module; +our @ISA = qw(Test::Builder::Module); +our @EXPORT = qw(ok); + +my $CLASS = __PACKAGE__; + + +sub ok ($;$) { ## no critic (Subroutines::ProhibitSubroutinePrototypes) + return $CLASS->builder->ok(@_); +} + + +1; +package Test::Harness; + +use 5.006; + +use strict; +use warnings; + +use constant IS_WIN32 => ( $^O =~ /^(MS)?Win32$/ ); +use constant IS_VMS => ( $^O eq 'VMS' ); + +use TAP::Harness (); +use TAP::Parser::Aggregator (); +use TAP::Parser::Source (); +use TAP::Parser::SourceHandler::Perl (); + +use Text::ParseWords qw(shellwords); + +use Config; +use base 'Exporter'; + +# $ML $Last_ML_Print + +BEGIN { + eval q{use Time::HiRes 'time'}; + our $has_time_hires = !$@; +} + + +our $VERSION = '3.42'; + +# Backwards compatibility for exportable variable names. +*verbose = *Verbose; +*switches = *Switches; +*debug = *Debug; + +$ENV{HARNESS_ACTIVE} = 1; +$ENV{HARNESS_VERSION} = $VERSION; + +END { + + # For VMS. + delete $ENV{HARNESS_ACTIVE}; + delete $ENV{HARNESS_VERSION}; +} + +our @EXPORT = qw(&runtests); +our @EXPORT_OK = qw(&execute_tests $verbose $switches); + +our $Verbose = $ENV{HARNESS_VERBOSE} || 0; +our $Debug = $ENV{HARNESS_DEBUG} || 0; +our $Switches = '-w'; +our $Columns = $ENV{HARNESS_COLUMNS} || $ENV{COLUMNS} || 80; +$Columns--; # Some shells have trouble with a full line of text. +our $Timer = $ENV{HARNESS_TIMER} || 0; +our $Color = $ENV{HARNESS_COLOR} || 0; +our $IgnoreExit = $ENV{HARNESS_IGNORE_EXIT} || 0; + + +sub _has_taint { + my $test = shift; + return TAP::Parser::SourceHandler::Perl->get_taint( + TAP::Parser::Source->shebang($test) ); +} + +sub _aggregate { + my ( $harness, $aggregate, @tests ) = @_; + + # Don't propagate to our children + local $ENV{HARNESS_OPTIONS}; + + _apply_extra_INC($harness); + _aggregate_tests( $harness, $aggregate, @tests ); +} + +# Make sure the child sees all the extra junk in @INC +sub _apply_extra_INC { + my $harness = shift; + + $harness->callback( + parser_args => sub { + my ( $args, $test ) = @_; + push @{ $args->{switches} }, map {"-I$_"} _filtered_inc(); + } + ); +} + +sub _aggregate_tests { + my ( $harness, $aggregate, @tests ) = @_; + $aggregate->start(); + $harness->aggregate_tests( $aggregate, @tests ); + $aggregate->stop(); + +} + +sub runtests { + my @tests = @_; + + # shield against -l + local ( $\, $, ); + + my $harness = _new_harness(); + my $aggregate = TAP::Parser::Aggregator->new(); + + local $ENV{PERL_USE_UNSAFE_INC} = 1 if not exists $ENV{PERL_USE_UNSAFE_INC}; + _aggregate( $harness, $aggregate, @tests ); + + $harness->formatter->summary($aggregate); + + my $total = $aggregate->total; + my $passed = $aggregate->passed; + my $failed = $aggregate->failed; + + my @parsers = $aggregate->parsers; + + my $num_bad = 0; + for my $parser (@parsers) { + $num_bad++ if $parser->has_problems; + } + + die(sprintf( + "Failed %d/%d test programs. %d/%d subtests failed.\n", + $num_bad, scalar @parsers, $failed, $total + ) + ) if $num_bad; + + return $total && $total == $passed; +} + +sub _canon { + my @list = sort { $a <=> $b } @_; + my @ranges = (); + my $count = scalar @list; + my $pos = 0; + + while ( $pos < $count ) { + my $end = $pos + 1; + $end++ while $end < $count && $list[$end] <= $list[ $end - 1 ] + 1; + push @ranges, ( $end == $pos + 1 ) + ? $list[$pos] + : join( '-', $list[$pos], $list[ $end - 1 ] ); + $pos = $end; + } + + return join( ' ', @ranges ); +} + +sub _new_harness { + my $sub_args = shift || {}; + + my ( @lib, @switches ); + my @opt = map { shellwords($_) } grep { defined } $Switches, $ENV{HARNESS_PERL_SWITCHES}; + while ( my $opt = shift @opt ) { + if ( $opt =~ /^ -I (.*) $ /x ) { + push @lib, length($1) ? $1 : shift @opt; + } + else { + push @switches, $opt; + } + } + + # Do things the old way on VMS... + push @lib, _filtered_inc() if IS_VMS; + + # If $Verbose isn't numeric default to 1. This helps core. + my $verbosity = ( $Verbose ? ( $Verbose !~ /\d/ ) ? 1 : $Verbose : 0 ); + + my $args = { + timer => $Timer, + directives => our $Directives, + lib => \@lib, + switches => \@switches, + color => $Color, + verbosity => $verbosity, + ignore_exit => $IgnoreExit, + }; + + $args->{stdout} = $sub_args->{out} + if exists $sub_args->{out}; + + my $class = $ENV{HARNESS_SUBCLASS} || 'TAP::Harness'; + if ( defined( my $env_opt = $ENV{HARNESS_OPTIONS} ) ) { + for my $opt ( split /:/, $env_opt ) { + if ( $opt =~ /^j(\d*)$/ ) { + $args->{jobs} = $1 || 9; + } + elsif ( $opt eq 'c' ) { + $args->{color} = 1; + } + elsif ( $opt =~ m/^f(.*)$/ ) { + my $fmt = $1; + $fmt =~ s/-/::/g; + $args->{formatter_class} = $fmt; + } + elsif ( $opt =~ m/^a(.*)$/ ) { + my $archive = $1; + $class = "TAP::Harness::Archive"; + $args->{archive} = $archive; + } + else { + die "Unknown HARNESS_OPTIONS item: $opt\n"; + } + } + } + + return TAP::Harness->_construct( $class, $args ); +} + +# Get the parts of @INC which are changed from the stock list AND +# preserve reordering of stock directories. +sub _filtered_inc { + my @inc = grep { !ref } @INC; #28567 + + if (IS_VMS) { + + # VMS has a 255-byte limit on the length of %ENV entries, so + # toss the ones that involve perl_root, the install location + @inc = grep !/perl_root/i, @inc; + + } + elsif (IS_WIN32) { + + # Lose any trailing backslashes in the Win32 paths + s/[\\\/]+$// for @inc; + } + + my @default_inc = _default_inc(); + + my @new_inc; + my %seen; + for my $dir (@inc) { + next if $seen{$dir}++; + + if ( $dir eq ( $default_inc[0] || '' ) ) { + shift @default_inc; + } + else { + push @new_inc, $dir; + } + + shift @default_inc while @default_inc and $seen{ $default_inc[0] }; + } + + return @new_inc; +} + +{ + + # Cache this to avoid repeatedly shelling out to Perl. + my @inc; + + sub _default_inc { + return @inc if @inc; + + local $ENV{PERL5LIB}; + local $ENV{PERLLIB}; + + my $perl = $ENV{HARNESS_PERL} || $^X; + + # Avoid using -l for the benefit of Perl 6 + chomp( @inc = `"$perl" -e "print join qq[\\n], \@INC, q[]"` ); + return @inc; + } +} + +sub _check_sequence { + my @list = @_; + my $prev; + while ( my $next = shift @list ) { + return if defined $prev && $next <= $prev; + $prev = $next; + } + + return 1; +} + +sub execute_tests { + my %args = @_; + + my $harness = _new_harness( \%args ); + my $aggregate = TAP::Parser::Aggregator->new(); + + my %tot = ( + bonus => 0, + max => 0, + ok => 0, + bad => 0, + good => 0, + files => 0, + tests => 0, + sub_skipped => 0, + todo => 0, + skipped => 0, + bench => undef, + ); + + # Install a callback so we get to see any plans the + # harness executes. + $harness->callback( + made_parser => sub { + my $parser = shift; + $parser->callback( + plan => sub { + my $plan = shift; + if ( $plan->directive eq 'SKIP' ) { + $tot{skipped}++; + } + } + ); + } + ); + + local $ENV{PERL_USE_UNSAFE_INC} = 1 if not exists $ENV{PERL_USE_UNSAFE_INC}; + _aggregate( $harness, $aggregate, @{ $args{tests} } ); + + $tot{bench} = $aggregate->elapsed; + my @tests = $aggregate->descriptions; + + # TODO: Work out the circumstances under which the files + # and tests totals can differ. + $tot{files} = $tot{tests} = scalar @tests; + + my %failedtests = (); + my %todo_passed = (); + + for my $test (@tests) { + my ($parser) = $aggregate->parsers($test); + + my @failed = $parser->failed; + + my $wstat = $parser->wait; + my $estat = $parser->exit; + my $planned = $parser->tests_planned; + my @errors = $parser->parse_errors; + my $passed = $parser->passed; + my $actual_passed = $parser->actual_passed; + + my $ok_seq = _check_sequence( $parser->actual_passed ); + + # Duplicate exit, wait status semantics of old version + $estat ||= '' unless $wstat; + $wstat ||= ''; + + $tot{max} += ( $planned || 0 ); + $tot{bonus} += $parser->todo_passed; + $tot{ok} += $passed > $actual_passed ? $passed : $actual_passed; + $tot{sub_skipped} += $parser->skipped; + $tot{todo} += $parser->todo; + + if ( @failed || $estat || @errors ) { + $tot{bad}++; + + my $huh_planned = $planned ? undef : '??'; + my $huh_errors = $ok_seq ? undef : '??'; + + $failedtests{$test} = { + 'canon' => $huh_planned + || $huh_errors + || _canon(@failed) + || '??', + 'estat' => $estat, + 'failed' => $huh_planned + || $huh_errors + || scalar @failed, + 'max' => $huh_planned || $planned, + 'name' => $test, + 'wstat' => $wstat + }; + } + else { + $tot{good}++; + } + + my @todo = $parser->todo_passed; + if (@todo) { + $todo_passed{$test} = { + 'canon' => _canon(@todo), + 'estat' => $estat, + 'failed' => scalar @todo, + 'max' => scalar $parser->todo, + 'name' => $test, + 'wstat' => $wstat + }; + } + } + + return ( \%tot, \%failedtests, \%todo_passed ); +} + + +1; +__END__ + +use strict; + +package Test::Tester; + +BEGIN +{ + if (*Test::Builder::new{CODE}) + { + warn "You should load Test::Tester before Test::Builder (or anything that loads Test::Builder)" + } +} + +use Test::Builder; +use Test::Tester::CaptureRunner; +use Test::Tester::Delegate; + +require Exporter; + +use vars qw( @ISA @EXPORT ); + +our $VERSION = '1.302133'; + +@EXPORT = qw( run_tests check_tests check_test cmp_results show_space ); +@ISA = qw( Exporter ); + +my $Test = Test::Builder->new; +my $Capture = Test::Tester::Capture->new; +my $Delegator = Test::Tester::Delegate->new; +$Delegator->{Object} = $Test; + +my $runner = Test::Tester::CaptureRunner->new; + +my $want_space = $ENV{TESTTESTERSPACE}; + +sub show_space +{ + $want_space = 1; +} + +my $colour = ''; +my $reset = ''; + +if (my $want_colour = $ENV{TESTTESTERCOLOUR} || $ENV{TESTTESTERCOLOR}) +{ + if (eval { require Term::ANSIColor; 1 }) + { + eval { require Win32::Console::ANSI } if 'MSWin32' eq $^O; # support color on windows platforms + my ($f, $b) = split(",", $want_colour); + $colour = Term::ANSIColor::color($f).Term::ANSIColor::color("on_$b"); + $reset = Term::ANSIColor::color("reset"); + } + +} + +sub new_new +{ + return $Delegator; +} + +sub capture +{ + return Test::Tester::Capture->new; +} + +sub fh +{ + # experiment with capturing output, I don't like it + $runner = Test::Tester::FHRunner->new; + + return $Test; +} + +sub find_run_tests +{ + my $d = 1; + my $found = 0; + while ((not $found) and (my ($sub) = (caller($d))[3]) ) + { +# print "$d: $sub\n"; + $found = ($sub eq "Test::Tester::run_tests"); + $d++; + } + +# die "Didn't find 'run_tests' in caller stack" unless $found; + return $d; +} + +sub run_tests +{ + local($Delegator->{Object}) = $Capture; + + $runner->run_tests(@_); + + return ($runner->get_premature, $runner->get_results); +} + +sub check_test +{ + my $test = shift; + my $expect = shift; + my $name = shift; + $name = "" unless defined($name); + + @_ = ($test, [$expect], $name); + goto &check_tests; +} + +sub check_tests +{ + my $test = shift; + my $expects = shift; + my $name = shift; + $name = "" unless defined($name); + + my ($prem, @results) = eval { run_tests($test, $name) }; + + $Test->ok(! $@, "Test '$name' completed") || $Test->diag($@); + $Test->ok(! length($prem), "Test '$name' no premature diagnostication") || + $Test->diag("Before any testing anything, your tests said\n$prem"); + + local $Test::Builder::Level = $Test::Builder::Level + 1; + cmp_results(\@results, $expects, $name); + return ($prem, @results); +} + +sub cmp_field +{ + my ($result, $expect, $field, $desc) = @_; + + if (defined $expect->{$field}) + { + $Test->is_eq($result->{$field}, $expect->{$field}, + "$desc compare $field"); + } +} + +sub cmp_result +{ + my ($result, $expect, $name) = @_; + + my $sub_name = $result->{name}; + $sub_name = "" unless defined($name); + + my $desc = "subtest '$sub_name' of '$name'"; + + { + local $Test::Builder::Level = $Test::Builder::Level + 1; + + cmp_field($result, $expect, "ok", $desc); + + cmp_field($result, $expect, "actual_ok", $desc); + + cmp_field($result, $expect, "type", $desc); + + cmp_field($result, $expect, "reason", $desc); + + cmp_field($result, $expect, "name", $desc); + } + + # if we got no depth then default to 1 + my $depth = 1; + if (exists $expect->{depth}) + { + $depth = $expect->{depth}; + } + + # if depth was explicitly undef then don't test it + if (defined $depth) + { + $Test->is_eq($result->{depth}, $depth, "checking depth") || + $Test->diag('You need to change $Test::Builder::Level'); + } + + if (defined(my $exp = $expect->{diag})) + { + + my $got = ''; + if (ref $exp eq 'Regexp') { + + if (not $Test->like($result->{diag}, $exp, + "subtest '$sub_name' of '$name' compare diag")) + { + $got = $result->{diag}; + } + + } else { + + # if there actually is some diag then put a \n on the end if it's not + # there already + $exp .= "\n" if (length($exp) and $exp !~ /\n$/); + + if (not $Test->ok($result->{diag} eq $exp, + "subtest '$sub_name' of '$name' compare diag")) + { + $got = $result->{diag}; + } + } + + if ($got) { + my $glen = length($got); + my $elen = length($exp); + for ($got, $exp) + { + my @lines = split("\n", $_); + $_ = join("\n", map { + if ($want_space) + { + $_ = $colour.escape($_).$reset; + } + else + { + "'$colour$_$reset'" + } + } @lines); + } + + $Test->diag(<<EOM); +Got diag ($glen bytes): +$got +Expected diag ($elen bytes): +$exp +EOM + } + } +} + +sub escape +{ + my $str = shift; + my $res = ''; + for my $char (split("", $str)) + { + my $c = ord($char); + if(($c>32 and $c<125) or $c == 10) + { + $res .= $char; + } + else + { + $res .= sprintf('\x{%x}', $c) + } + } + return $res; +} + +sub cmp_results +{ + my ($results, $expects, $name) = @_; + + $Test->is_num(scalar @$results, scalar @$expects, "Test '$name' result count"); + + for (my $i = 0; $i < @$expects; $i++) + { + my $expect = $expects->[$i]; + my $result = $results->[$i]; + + local $Test::Builder::Level = $Test::Builder::Level + 1; + cmp_result($result, $expect, $name); + } +} + +######## nicked from Test::More +sub plan { + my(@plan) = @_; + + my $caller = caller; + + $Test->exported_to($caller); + + my @imports = (); + foreach my $idx (0..$#plan) { + if( $plan[$idx] eq 'import' ) { + my($tag, $imports) = splice @plan, $idx, 2; + @imports = @$imports; + last; + } + } + + $Test->plan(@plan); + + __PACKAGE__->_export_to_level(1, __PACKAGE__, @imports); +} + +sub import { + my($class) = shift; + { + no warnings 'redefine'; + *Test::Builder::new = \&new_new; + } + goto &plan; +} + +sub _export_to_level +{ + my $pkg = shift; + my $level = shift; + (undef) = shift; # redundant arg + my $callpkg = caller($level); + $pkg->export($callpkg, @_); +} + + +############ + +1; + +__END__ + +package Test::use::ok; +use 5.005; + +our $VERSION = '1.302133'; + + +__END__ + +# You may distribute under the terms of either the GNU General Public License +# or the Artistic License (the same terms as Perl itself) +# +# (C) Paul Evans, 2018 -- leonerd@leonerd.org.uk + +package Test::Future::Deferred; + +use strict; +use warnings; +use base qw( Future ); + +our $VERSION = '0.39'; + + +my @deferrals; + +sub await +{ + while( my $d = shift @deferrals ) { + my ( $f, $method, @args ) = @$d; + $f->$method( @args ); + } + # TODO: detect if still not done with no more deferrals +} + + + +sub done_later +{ + my $self = ref $_[0] ? shift : shift->new; + push @deferrals, [ $self, done => @_ ]; + return $self; +} + + +sub fail_later +{ + my $self = ref $_[0] ? shift : shift->new; + push @deferrals, [ $self, fail => @_ ]; + return $self; +} + + +0x55AA; +package Test::Builder::Module; + +use strict; + +use Test::Builder; + +require Exporter; +our @ISA = qw(Exporter); + +our $VERSION = '1.302133'; + + + +sub import { + my($class) = shift; + + Test2::API::test2_load() unless Test2::API::test2_in_preload(); + + # Don't run all this when loading ourself. + return 1 if $class eq 'Test::Builder::Module'; + + my $test = $class->builder; + + my $caller = caller; + + $test->exported_to($caller); + + $class->import_extra( \@_ ); + my(@imports) = $class->_strip_imports( \@_ ); + + $test->plan(@_); + + local $Exporter::ExportLevel = $Exporter::ExportLevel + 1; + $class->Exporter::import(@imports); +} + +sub _strip_imports { + my $class = shift; + my $list = shift; + + my @imports = (); + my @other = (); + my $idx = 0; + while( $idx <= $#{$list} ) { + my $item = $list->[$idx]; + + if( defined $item and $item eq 'import' ) { + push @imports, @{ $list->[ $idx + 1 ] }; + $idx++; + } + else { + push @other, $item; + } + + $idx++; + } + + @$list = @other; + + return @imports; +} + + +sub import_extra { } + + +sub builder { + return Test::Builder->new; +} + +1; +package Test::Builder::TodoDiag; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::Event::Diag; our @ISA = qw(Test2::Event::Diag) } + +sub diagnostics { 0 } + +sub facet_data { + my $self = shift; + my $out = $self->SUPER::facet_data(); + $out->{info}->[0]->{debug} = 0; + return $out; +} + +1; + +__END__ + +package Test::Builder::Tester; + +use strict; +our $VERSION = '1.302133'; + +use Test::Builder; +use Symbol; +use Carp; + + +#### +# set up testing +#### + +my $t = Test::Builder->new; + +### +# make us an exporter +### + +use Exporter; +our @ISA = qw(Exporter); + +our @EXPORT = qw(test_out test_err test_fail test_diag test_test line_num); + +sub import { + my $class = shift; + my(@plan) = @_; + + my $caller = caller; + + $t->exported_to($caller); + $t->plan(@plan); + + my @imports = (); + foreach my $idx ( 0 .. $#plan ) { + if( $plan[$idx] eq 'import' ) { + @imports = @{ $plan[ $idx + 1 ] }; + last; + } + } + + __PACKAGE__->export_to_level( 1, __PACKAGE__, @imports ); +} + +### +# set up file handles +### + +# create some private file handles +my $output_handle = gensym; +my $error_handle = gensym; + +# and tie them to this package +my $out = tie *$output_handle, "Test::Builder::Tester::Tie", "STDOUT"; +my $err = tie *$error_handle, "Test::Builder::Tester::Tie", "STDERR"; + +#### +# exported functions +#### + +# for remembering that we're testing and where we're testing at +my $testing = 0; +my $testing_num; +my $original_is_passing; + +# remembering where the file handles were originally connected +my $original_output_handle; +my $original_failure_handle; +my $original_todo_handle; +my $original_formatter; + +my $original_harness_env; + +# function that starts testing and redirects the filehandles for now +sub _start_testing { + # Hack for things that conditioned on Test-Stream being loaded + $INC{'Test/Stream.pm'} ||= 'fake' if $INC{'Test/Moose/More.pm'}; + # even if we're running under Test::Harness pretend we're not + # for now. This needed so Test::Builder doesn't add extra spaces + $original_harness_env = $ENV{HARNESS_ACTIVE} || 0; + $ENV{HARNESS_ACTIVE} = 0; + + my $hub = $t->{Hub} || ($t->{Stack} ? $t->{Stack}->top : Test2::API::test2_stack->top); + $original_formatter = $hub->format; + unless ($original_formatter && $original_formatter->isa('Test::Builder::Formatter')) { + my $fmt = Test::Builder::Formatter->new; + $hub->format($fmt); + } + + # remember what the handles were set to + $original_output_handle = $t->output(); + $original_failure_handle = $t->failure_output(); + $original_todo_handle = $t->todo_output(); + + # switch out to our own handles + $t->output($output_handle); + $t->failure_output($error_handle); + $t->todo_output($output_handle); + + # clear the expected list + $out->reset(); + $err->reset(); + + # remember that we're testing + $testing = 1; + $testing_num = $t->current_test; + $t->current_test(0); + $original_is_passing = $t->is_passing; + $t->is_passing(1); + + # look, we shouldn't do the ending stuff + $t->no_ending(1); +} + + +sub test_out { + # do we need to do any setup? + _start_testing() unless $testing; + + $out->expect(@_); +} + +sub test_err { + # do we need to do any setup? + _start_testing() unless $testing; + + $err->expect(@_); +} + + +sub test_fail { + # do we need to do any setup? + _start_testing() unless $testing; + + # work out what line we should be on + my( $package, $filename, $line ) = caller; + $line = $line + ( shift() || 0 ); # prevent warnings + + # expect that on stderr + $err->expect("# Failed test ($filename at line $line)"); +} + + +sub test_diag { + # do we need to do any setup? + _start_testing() unless $testing; + + # expect the same thing, but prepended with "# " + local $_; + $err->expect( map { "# $_" } @_ ); +} + + +sub test_test { + # END the hack + delete $INC{'Test/Stream.pm'} if $INC{'Test/Stream.pm'} && $INC{'Test/Stream.pm'} eq 'fake'; + # decode the arguments as described in the pod + my $mess; + my %args; + if( @_ == 1 ) { + $mess = shift + } + else { + %args = @_; + $mess = $args{name} if exists( $args{name} ); + $mess = $args{title} if exists( $args{title} ); + $mess = $args{label} if exists( $args{label} ); + } + + # er, are we testing? + croak "Not testing. You must declare output with a test function first." + unless $testing; + + + my $hub = $t->{Hub} || Test2::API::test2_stack->top; + $hub->format($original_formatter); + + # okay, reconnect the test suite back to the saved handles + $t->output($original_output_handle); + $t->failure_output($original_failure_handle); + $t->todo_output($original_todo_handle); + + # restore the test no, etc, back to the original point + $t->current_test($testing_num); + $testing = 0; + $t->is_passing($original_is_passing); + + # re-enable the original setting of the harness + $ENV{HARNESS_ACTIVE} = $original_harness_env; + + # check the output we've stashed + unless( $t->ok( ( $args{skip_out} || $out->check ) && + ( $args{skip_err} || $err->check ), $mess ) + ) + { + # print out the diagnostic information about why this + # test failed + + local $_; + + $t->diag( map { "$_\n" } $out->complaint ) + unless $args{skip_out} || $out->check; + + $t->diag( map { "$_\n" } $err->complaint ) + unless $args{skip_err} || $err->check; + } +} + + +sub line_num { + my( $package, $filename, $line ) = caller; + return $line + ( shift() || 0 ); # prevent warnings +} + + +my $color; + +sub color { + $color = shift if @_; + $color; +} + + +1; + +#################################################################### +# Helper class that is used to remember expected and received data + +package Test::Builder::Tester::Tie; + +## +# add line(s) to be expected + +sub expect { + my $self = shift; + + my @checks = @_; + foreach my $check (@checks) { + $check = $self->_account_for_subtest($check); + $check = $self->_translate_Failed_check($check); + push @{ $self->{wanted} }, ref $check ? $check : "$check\n"; + } +} + +sub _account_for_subtest { + my( $self, $check ) = @_; + + my $hub = $t->{Stack}->top; + my $nesting = $hub->isa('Test2::Hub::Subtest') ? $hub->nested : 0; + return ref($check) ? $check : (' ' x $nesting) . $check; +} + +sub _translate_Failed_check { + my( $self, $check ) = @_; + + if( $check =~ /\A(.*)# (Failed .*test) \((.*?) at line (\d+)\)\Z(?!\n)/ ) { + $check = "/\Q$1\E#\\s+\Q$2\E.*?\\n?.*?\Qat $3\E line \Q$4\E.*\\n?/"; + } + + return $check; +} + +## +# return true iff the expected data matches the got data + +sub check { + my $self = shift; + + # turn off warnings as these might be undef + local $^W = 0; + + my @checks = @{ $self->{wanted} }; + my $got = $self->{got}; + foreach my $check (@checks) { + $check = "\Q$check\E" unless( $check =~ s,^/(.*)/$,$1, or ref $check ); + return 0 unless $got =~ s/^$check//; + } + + return length $got == 0; +} + +## +# a complaint message about the inputs not matching (to be +# used for debugging messages) + +sub complaint { + my $self = shift; + my $type = $self->type; + my $got = $self->got; + my $wanted = join '', @{ $self->wanted }; + + # are we running in colour mode? + if(Test::Builder::Tester::color) { + # get color + eval { require Term::ANSIColor }; + unless($@) { + eval { require Win32::Console::ANSI } if 'MSWin32' eq $^O; # support color on windows platforms + + # colours + + my $green = Term::ANSIColor::color("black") . Term::ANSIColor::color("on_green"); + my $red = Term::ANSIColor::color("black") . Term::ANSIColor::color("on_red"); + my $reset = Term::ANSIColor::color("reset"); + + # work out where the two strings start to differ + my $char = 0; + $char++ while substr( $got, $char, 1 ) eq substr( $wanted, $char, 1 ); + + # get the start string and the two end strings + my $start = $green . substr( $wanted, 0, $char ); + my $gotend = $red . substr( $got, $char ) . $reset; + my $wantedend = $red . substr( $wanted, $char ) . $reset; + + # make the start turn green on and off + $start =~ s/\n/$reset\n$green/g; + + # make the ends turn red on and off + $gotend =~ s/\n/$reset\n$red/g; + $wantedend =~ s/\n/$reset\n$red/g; + + # rebuild the strings + $got = $start . $gotend; + $wanted = $start . $wantedend; + } + } + + my @got = split "\n", $got; + my @wanted = split "\n", $wanted; + + $got = ""; + $wanted = ""; + + while (@got || @wanted) { + my $g = shift @got || ""; + my $w = shift @wanted || ""; + if ($g ne $w) { + if($g =~ s/(\s+)$/ |> /g) { + $g .= ($_ eq ' ' ? '_' : '\t') for split '', $1; + } + if($w =~ s/(\s+)$/ |> /g) { + $w .= ($_ eq ' ' ? '_' : '\t') for split '', $1; + } + $g = "> $g"; + $w = "> $w"; + } + else { + $g = " $g"; + $w = " $w"; + } + $got = $got ? "$got\n$g" : $g; + $wanted = $wanted ? "$wanted\n$w" : $w; + } + + return "$type is:\n" . "$got\nnot:\n$wanted\nas expected"; +} + +## +# forget all expected and got data + +sub reset { + my $self = shift; + %$self = ( + type => $self->{type}, + got => '', + wanted => [], + ); +} + +sub got { + my $self = shift; + return $self->{got}; +} + +sub wanted { + my $self = shift; + return $self->{wanted}; +} + +sub type { + my $self = shift; + return $self->{type}; +} + +### +# tie interface +### + +sub PRINT { + my $self = shift; + $self->{got} .= join '', @_; +} + +sub TIEHANDLE { + my( $class, $type ) = @_; + + my $self = bless { type => $type }, $class; + + $self->reset; + + return $self; +} + +sub READ { } +sub READLINE { } +sub GETC { } +sub FILENO { } + +1; +package Test::Builder::Formatter; +use strict; +use warnings; + +our $VERSION = '1.302133'; + +BEGIN { require Test2::Formatter::TAP; our @ISA = qw(Test2::Formatter::TAP) } + +use Test2::Util::HashBase qw/no_header no_diag/; + +BEGIN { + *OUT_STD = Test2::Formatter::TAP->can('OUT_STD'); + *OUT_ERR = Test2::Formatter::TAP->can('OUT_ERR'); + + my $todo = OUT_ERR() + 1; + *OUT_TODO = sub() { $todo }; +} + +sub init { + my $self = shift; + $self->SUPER::init(@_); + $self->{+HANDLES}->[OUT_TODO] = $self->{+HANDLES}->[OUT_STD]; +} + +sub plan_tap { + my ($self, $f) = @_; + + return if $self->{+NO_HEADER}; + return $self->SUPER::plan_tap($f); +} + +sub debug_tap { + my ($self, $f, $num) = @_; + return if $self->{+NO_DIAG}; + my @out = $self->SUPER::debug_tap($f, $num); + $self->redirect(\@out) if @out && $f->{about}->{package} eq 'Test::Builder::TodoDiag'; + return @out; +} + +sub info_tap { + my ($self, $f) = @_; + return if $self->{+NO_DIAG}; + my @out = $self->SUPER::info_tap($f); + $self->redirect(\@out) if @out && $f->{about}->{package} eq 'Test::Builder::TodoDiag'; + return @out; +} + +sub redirect { + my ($self, $out) = @_; + $_->[0] = OUT_TODO for @$out; +} + +sub no_subtest_space { 1 } + +1; + +__END__ + +package Test::Builder::IO::Scalar; + + + +# This is copied code, I don't care. +##no critic + +use Carp; +use strict; +use vars qw($VERSION @ISA); +use IO::Handle; + +use 5.005; + +### The package version, both in 1.23 style *and* usable by MakeMaker: +$VERSION = "2.114"; + +### Inheritance: +@ISA = qw(IO::Handle); + +#============================== + + +#------------------------------ + + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = bless \do { local *FH }, $class; + tie *$self, $class, $self; + $self->open(@_); ### open on anonymous by default + $self; +} +sub DESTROY { + shift->close; +} + +#------------------------------ + + +sub open { + my ($self, $sref) = @_; + + ### Sanity: + defined($sref) or do {my $s = ''; $sref = \$s}; + (ref($sref) eq "SCALAR") or croak "open() needs a ref to a scalar"; + + ### Setup: + *$self->{Pos} = 0; ### seek position + *$self->{SR} = $sref; ### scalar reference + $self; +} + +#------------------------------ + + +sub opened { + *{shift()}->{SR}; +} + +#------------------------------ + + +sub close { + my $self = shift; + %{*$self} = (); + 1; +} + + + + +#============================== + + + +#------------------------------ + + +sub flush { "0 but true" } + +#------------------------------ + + +sub getc { + my $self = shift; + + ### Return undef right away if at EOF; else, move pos forward: + return undef if $self->eof; + substr(${*$self->{SR}}, *$self->{Pos}++, 1); +} + +#------------------------------ + + +sub getline { + my $self = shift; + + ### Return undef right away if at EOF: + return undef if $self->eof; + + ### Get next line: + my $sr = *$self->{SR}; + my $i = *$self->{Pos}; ### Start matching at this point. + + ### Minimal impact implementation! + ### We do the fast fast thing (no regexps) if using the + ### classic input record separator. + + ### Case 1: $/ is undef: slurp all... + if (!defined($/)) { + *$self->{Pos} = length $$sr; + return substr($$sr, $i); + } + + ### Case 2: $/ is "\n": zoom zoom zoom... + elsif ($/ eq "\012") { + + ### Seek ahead for "\n"... yes, this really is faster than regexps. + my $len = length($$sr); + for (; $i < $len; ++$i) { + last if ord (substr ($$sr, $i, 1)) == 10; + } + + ### Extract the line: + my $line; + if ($i < $len) { ### We found a "\n": + $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos} + 1); + *$self->{Pos} = $i+1; ### Remember where we finished up. + } + else { ### No "\n"; slurp the remainder: + $line = substr ($$sr, *$self->{Pos}, $i - *$self->{Pos}); + *$self->{Pos} = $len; + } + return $line; + } + + ### Case 3: $/ is ref to int. Do fixed-size records. + ### (Thanks to Dominique Quatravaux.) + elsif (ref($/)) { + my $len = length($$sr); + my $i = ${$/} + 0; + my $line = substr ($$sr, *$self->{Pos}, $i); + *$self->{Pos} += $i; + *$self->{Pos} = $len if (*$self->{Pos} > $len); + return $line; + } + + ### Case 4: $/ is either "" (paragraphs) or something weird... + ### This is Graham's general-purpose stuff, which might be + ### a tad slower than Case 2 for typical data, because + ### of the regexps. + else { + pos($$sr) = $i; + + ### If in paragraph mode, skip leading lines (and update i!): + length($/) or + (($$sr =~ m/\G\n*/g) and ($i = pos($$sr))); + + ### If we see the separator in the buffer ahead... + if (length($/) + ? $$sr =~ m,\Q$/\E,g ### (ordinary sep) TBD: precomp! + : $$sr =~ m,\n\n,g ### (a paragraph) + ) { + *$self->{Pos} = pos $$sr; + return substr($$sr, $i, *$self->{Pos}-$i); + } + ### Else if no separator remains, just slurp the rest: + else { + *$self->{Pos} = length $$sr; + return substr($$sr, $i); + } + } +} + +#------------------------------ + + +sub getlines { + my $self = shift; + wantarray or croak("can't call getlines in scalar context!"); + my ($line, @lines); + push @lines, $line while (defined($line = $self->getline)); + @lines; +} + +#------------------------------ + + +sub print { + my $self = shift; + *$self->{Pos} = length(${*$self->{SR}} .= join('', @_) . (defined($\) ? $\ : "")); + 1; +} +sub _unsafe_print { + my $self = shift; + my $append = join('', @_) . $\; + ${*$self->{SR}} .= $append; + *$self->{Pos} += length($append); + 1; +} +sub _old_print { + my $self = shift; + ${*$self->{SR}} .= join('', @_) . $\; + *$self->{Pos} = length(${*$self->{SR}}); + 1; +} + + +#------------------------------ + + +sub read { + my $self = $_[0]; + my $n = $_[2]; + my $off = $_[3] || 0; + + my $read = substr(${*$self->{SR}}, *$self->{Pos}, $n); + $n = length($read); + *$self->{Pos} += $n; + ($off ? substr($_[1], $off) : $_[1]) = $read; + return $n; +} + +#------------------------------ + + +sub write { + my $self = $_[0]; + my $n = $_[2]; + my $off = $_[3] || 0; + + my $data = substr($_[1], $off, $n); + $n = length($data); + $self->print($data); + return $n; +} + +#------------------------------ + + +sub sysread { + my $self = shift; + $self->read(@_); +} + +#------------------------------ + + +sub syswrite { + my $self = shift; + $self->write(@_); +} + + + +#============================== + + + +#------------------------------ + + +sub autoflush {} + +#------------------------------ + + +sub binmode {} + +#------------------------------ + + +sub clearerr { 1 } + +#------------------------------ + + +sub eof { + my $self = shift; + (*$self->{Pos} >= length(${*$self->{SR}})); +} + +#------------------------------ + + +sub seek { + my ($self, $pos, $whence) = @_; + my $eofpos = length(${*$self->{SR}}); + + ### Seek: + if ($whence == 0) { *$self->{Pos} = $pos } ### SEEK_SET + elsif ($whence == 1) { *$self->{Pos} += $pos } ### SEEK_CUR + elsif ($whence == 2) { *$self->{Pos} = $eofpos + $pos} ### SEEK_END + else { croak "bad seek whence ($whence)" } + + ### Fixup: + if (*$self->{Pos} < 0) { *$self->{Pos} = 0 } + if (*$self->{Pos} > $eofpos) { *$self->{Pos} = $eofpos } + return 1; +} + +#------------------------------ + + +sub sysseek { + my $self = shift; + $self->seek (@_); +} + +#------------------------------ + + +sub tell { *{shift()}->{Pos} } + +#------------------------------ + + +sub use_RS { + my ($self, $yesno) = @_; + carp "use_RS is deprecated and ignored; \$/ is always consulted\n"; + } + +#------------------------------ + + +sub setpos { shift->seek($_[0],0) } + +#------------------------------ + + +*getpos = \&tell; + + +#------------------------------ + + +sub sref { *{shift()}->{SR} } + + +#------------------------------ +# Tied handle methods... +#------------------------------ + +# Conventional tiehandle interface: +sub TIEHANDLE { + ((defined($_[1]) && UNIVERSAL::isa($_[1], __PACKAGE__)) + ? $_[1] + : shift->new(@_)); +} +sub GETC { shift->getc(@_) } +sub PRINT { shift->print(@_) } +sub PRINTF { shift->print(sprintf(shift, @_)) } +sub READ { shift->read(@_) } +sub READLINE { wantarray ? shift->getlines(@_) : shift->getline(@_) } +sub WRITE { shift->write(@_); } +sub CLOSE { shift->close(@_); } +sub SEEK { shift->seek(@_); } +sub TELL { shift->tell(@_); } +sub EOF { shift->eof(@_); } +sub FILENO { -1 } + +#------------------------------------------------------------ + +1; + +__END__ + + + + + + +package Test::Builder::Tester::Color; + +use strict; +our $VERSION = '1.302133'; + +require Test::Builder::Tester; + + + +sub import { + Test::Builder::Tester::color(1); +} + + +1; +use strict; + +package Test::Tester::Capture; + +our $VERSION = '1.302133'; + + +use Test::Builder; + +use vars qw( @ISA ); +@ISA = qw( Test::Builder ); + +# Make Test::Tester::Capture thread-safe for ithreads. +BEGIN { + use Config; + if( $] >= 5.008 && $Config{useithreads} ) { + require threads::shared; + threads::shared->import; + } + else { + *share = sub { 0 }; + *lock = sub { 0 }; + } +} + +my $Curr_Test = 0; share($Curr_Test); +my @Test_Results = (); share(@Test_Results); +my $Prem_Diag = {diag => ""}; share($Curr_Test); + +sub new +{ + # Test::Tester::Capgture::new used to just return __PACKAGE__ + # because Test::Builder::new enforced it's singleton nature by + # return __PACKAGE__. That has since changed, Test::Builder::new now + # returns a blessed has and around version 0.78, Test::Builder::todo + # started wanting to modify $self. To cope with this, we now return + # a blessed hash. This is a short-term hack, the correct thing to do + # is to detect which style of Test::Builder we're dealing with and + # act appropriately. + + my $class = shift; + return bless {}, $class; +} + +sub ok { + my($self, $test, $name) = @_; + + my $ctx = $self->ctx; + + # $test might contain an object which we don't want to accidentally + # store, so we turn it into a boolean. + $test = $test ? 1 : 0; + + lock $Curr_Test; + $Curr_Test++; + + my($pack, $file, $line) = $self->caller; + + my $todo = $self->todo(); + + my $result = {}; + share($result); + + unless( $test ) { + @$result{ 'ok', 'actual_ok' } = ( ( $todo ? 1 : 0 ), 0 ); + } + else { + @$result{ 'ok', 'actual_ok' } = ( 1, $test ); + } + + if( defined $name ) { + $name =~ s|#|\\#|g; # # in a name can confuse Test::Harness. + $result->{name} = $name; + } + else { + $result->{name} = ''; + } + + if( $todo ) { + my $what_todo = $todo; + $result->{reason} = $what_todo; + $result->{type} = 'todo'; + } + else { + $result->{reason} = ''; + $result->{type} = ''; + } + + $Test_Results[$Curr_Test-1] = $result; + + unless( $test ) { + my $msg = $todo ? "Failed (TODO)" : "Failed"; + $result->{fail_diag} = (" $msg test ($file at line $line)\n"); + } + + $result->{diag} = ""; + $result->{_level} = $Test::Builder::Level; + $result->{_depth} = Test::Tester::find_run_tests(); + + $ctx->release; + + return $test ? 1 : 0; +} + +sub skip { + my($self, $why) = @_; + $why ||= ''; + + my $ctx = $self->ctx; + + lock($Curr_Test); + $Curr_Test++; + + my %result; + share(%result); + %result = ( + 'ok' => 1, + actual_ok => 1, + name => '', + type => 'skip', + reason => $why, + diag => "", + _level => $Test::Builder::Level, + _depth => Test::Tester::find_run_tests(), + ); + $Test_Results[$Curr_Test-1] = \%result; + + $ctx->release; + return 1; +} + +sub todo_skip { + my($self, $why) = @_; + $why ||= ''; + + my $ctx = $self->ctx; + + lock($Curr_Test); + $Curr_Test++; + + my %result; + share(%result); + %result = ( + 'ok' => 1, + actual_ok => 0, + name => '', + type => 'todo_skip', + reason => $why, + diag => "", + _level => $Test::Builder::Level, + _depth => Test::Tester::find_run_tests(), + ); + + $Test_Results[$Curr_Test-1] = \%result; + + $ctx->release; + return 1; +} + +sub diag { + my($self, @msgs) = @_; + return unless @msgs; + + # Prevent printing headers when compiling (i.e. -c) + return if $^C; + + my $ctx = $self->ctx; + + # Escape each line with a #. + foreach (@msgs) { + $_ = 'undef' unless defined; + } + + push @msgs, "\n" unless $msgs[-1] =~ /\n\Z/; + + my $result = $Curr_Test ? $Test_Results[$Curr_Test - 1] : $Prem_Diag; + + $result->{diag} .= join("", @msgs); + + $ctx->release; + return 0; +} + +sub details { + return @Test_Results; +} + + +# Stub. Feel free to send me a patch to implement this. +sub note { +} + +sub explain { + return Test::Builder::explain(@_); +} + +sub premature +{ + return $Prem_Diag->{diag}; +} + +sub current_test +{ + if (@_ > 1) + { + die "Don't try to change the test number!"; + } + else + { + return $Curr_Test; + } +} + +sub reset +{ + $Curr_Test = 0; + @Test_Results = (); + $Prem_Diag = {diag => ""}; +} + +1; + +__END__ + +use strict; +use warnings; + +package Test::Tester::Delegate; + +our $VERSION = '1.302133'; + +use Scalar::Util(); + +use vars '$AUTOLOAD'; + +sub new +{ + my $pkg = shift; + + my $obj = shift; + my $self = bless {}, $pkg; + + return $self; +} + +sub AUTOLOAD +{ + my ($sub) = $AUTOLOAD =~ /.*::(.*?)$/; + + return if $sub eq "DESTROY"; + + my $obj = $_[0]->{Object}; + + my $ref = $obj->can($sub); + shift(@_); + unshift(@_, $obj); + goto &$ref; +} + +sub can { + my $this = shift; + my ($sub) = @_; + + return $this->{Object}->can($sub) if Scalar::Util::blessed($this); + + return $this->SUPER::can(@_); +} + +1; +# $Header: /home/fergal/my/cvs/Test-Tester/lib/Test/Tester/CaptureRunner.pm,v 1.3 2003/03/05 01:07:55 fergal Exp $ +use strict; + +package Test::Tester::CaptureRunner; + +our $VERSION = '1.302133'; + + +use Test::Tester::Capture; +require Exporter; + +sub new +{ + my $pkg = shift; + my $self = bless {}, $pkg; + return $self; +} + +sub run_tests +{ + my $self = shift; + + my $test = shift; + + capture()->reset; + + $self->{StartLevel} = $Test::Builder::Level; + &$test(); +} + +sub get_results +{ + my $self = shift; + my @results = capture()->details; + + my $start = $self->{StartLevel}; + foreach my $res (@results) + { + next if defined $res->{depth}; + my $depth = $res->{_depth} - $res->{_level} - $start - 3; +# print "my $depth = $res->{_depth} - $res->{_level} - $start - 1\n"; + $res->{depth} = $depth; + } + + return @results; +} + +sub get_premature +{ + return capture()->premature; +} + +sub capture +{ + return Test::Tester::Capture->new; +} + +__END__ + +package Digest::base; + +use strict; +use vars qw($VERSION); +$VERSION = "1.16"; + +# subclass is supposed to implement at least these +sub new; +sub clone; +sub add; +sub digest; + +sub reset { + my $self = shift; + $self->new(@_); # ugly +} + +sub addfile { + my ($self, $handle) = @_; + + my $n; + my $buf = ""; + + while (($n = read($handle, $buf, 4*1024))) { + $self->add($buf); + } + unless (defined $n) { + require Carp; + Carp::croak("Read failed: $!"); + } + + $self; +} + +sub add_bits { + my $self = shift; + my $bits; + my $nbits; + if (@_ == 1) { + my $arg = shift; + $bits = pack("B*", $arg); + $nbits = length($arg); + } + else { + ($bits, $nbits) = @_; + } + if (($nbits % 8) != 0) { + require Carp; + Carp::croak("Number of bits must be multiple of 8 for this algorithm"); + } + return $self->add(substr($bits, 0, $nbits/8)); +} + +sub hexdigest { + my $self = shift; + return unpack("H*", $self->digest(@_)); +} + +sub b64digest { + my $self = shift; + require MIME::Base64; + my $b64 = MIME::Base64::encode($self->digest(@_), ""); + $b64 =~ s/=+$//; + return $b64; +} + +1; + +__END__ + +package Digest::file; + +use strict; + +use Exporter (); +use Carp qw(croak); +use Digest (); + +use vars qw($VERSION @ISA @EXPORT_OK); + +$VERSION = "1.16"; +@ISA = qw(Exporter); +@EXPORT_OK = qw(digest_file_ctx digest_file digest_file_hex digest_file_base64); + +sub digest_file_ctx { + my $file = shift; + croak("No digest algorithm specified") unless @_; + local *F; + open(F, "<", $file) || croak("Can't open '$file': $!"); + binmode(F); + my $ctx = Digest->new(@_); + $ctx->addfile(*F); + close(F); + return $ctx; +} + +sub digest_file { + digest_file_ctx(@_)->digest; +} + +sub digest_file_hex { + digest_file_ctx(@_)->hexdigest; +} + +sub digest_file_base64 { + digest_file_ctx(@_)->b64digest; +} + +1; + +__END__ + diff --git a/lib/webperl/emperl.js b/lib/webperl/emperl.js new file mode 100644 index 0000000..5ded600 --- /dev/null +++ b/lib/webperl/emperl.js @@ -0,0 +1 @@ +var Module=typeof Module!=="undefined"?Module:{};if(!Module.expectedDataFileDownloads){Module.expectedDataFileDownloads=0;Module.finishedDataFileDownloads=0}Module.expectedDataFileDownloads++;(function(){var loadPackage=function(metadata){var PACKAGE_PATH;if(typeof window==="object"){PACKAGE_PATH=window["encodeURIComponent"](window.location.pathname.toString().substring(0,window.location.pathname.toString().lastIndexOf("/"))+"/")}else if(typeof location!=="undefined"){PACKAGE_PATH=encodeURIComponent(location.pathname.toString().substring(0,location.pathname.toString().lastIndexOf("/"))+"/")}else{throw"using preloaded data can only be done on a web page or in a web worker"}var PACKAGE_NAME="emperl.data";var REMOTE_PACKAGE_BASE="emperl.data";if(typeof Module["locateFilePackage"]==="function"&&!Module["locateFile"]){Module["locateFile"]=Module["locateFilePackage"];err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)")}var REMOTE_PACKAGE_NAME=Module["locateFile"]?Module["locateFile"](REMOTE_PACKAGE_BASE,""):REMOTE_PACKAGE_BASE;var REMOTE_PACKAGE_SIZE=metadata.remote_package_size;var PACKAGE_UUID=metadata.package_uuid;function fetchRemotePackage(packageName,packageSize,callback,errback){var xhr=new XMLHttpRequest;xhr.open("GET",packageName,true);xhr.responseType="arraybuffer";xhr.onprogress=function(event){var url=packageName;var size=packageSize;if(event.total)size=event.total;if(event.loaded){if(!xhr.addedTotal){xhr.addedTotal=true;if(!Module.dataFileDownloads)Module.dataFileDownloads={};Module.dataFileDownloads[url]={loaded:event.loaded,total:size}}else{Module.dataFileDownloads[url].loaded=event.loaded}var total=0;var loaded=0;var num=0;for(var download in Module.dataFileDownloads){var data=Module.dataFileDownloads[download];total+=data.total;loaded+=data.loaded;num++}total=Math.ceil(total*Module.expectedDataFileDownloads/num);if(Module["setStatus"])Module["setStatus"]("Downloading data... ("+loaded+"/"+total+")")}else if(!Module.dataFileDownloads){if(Module["setStatus"])Module["setStatus"]("Downloading data...")}};xhr.onerror=function(event){throw new Error("NetworkError for: "+packageName)};xhr.onload=function(event){if(xhr.status==200||xhr.status==304||xhr.status==206||xhr.status==0&&xhr.response){var packageData=xhr.response;callback(packageData)}else{throw new Error(xhr.statusText+" : "+xhr.responseURL)}};xhr.send(null)}function handleError(error){console.error("package error:",error)}var fetchedCallback=null;var fetched=Module["getPreloadedPackage"]?Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE):null;if(!fetched)fetchRemotePackage(REMOTE_PACKAGE_NAME,REMOTE_PACKAGE_SIZE,function(data){if(fetchedCallback){fetchedCallback(data);fetchedCallback=null}else{fetched=data}},handleError);function runWithFS(){function assert(check,msg){if(!check)throw msg+(new Error).stack}Module["FS_createPath"]("/","opt",true,true);Module["FS_createPath"]("/opt","perl",true,true);Module["FS_createPath"]("/opt/perl","dev",true,true);Module["FS_createPath"]("/opt/perl","lib",true,true);Module["FS_createPath"]("/opt/perl/lib","5.28.1",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","autodie",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/autodie","exception",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/autodie","Scope",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Tie",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","DBM_Filter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Archive",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Archive","Tar",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Config",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Config","Perl",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","ExtUtils",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","MakeMaker",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","Constant",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","CBuilder",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils/CBuilder","Platform",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform","Windows",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","Command",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","ParseXS",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","Typemaps",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/ExtUtils","Liblist",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Filter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","B",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Net",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Net","FTP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Time",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Perl",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","User",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Attribute",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Encode",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Parse",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Parse","CPAN",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Thread",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Future",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","I18N",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/I18N","LangTags",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Pod",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Pod","Text",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Pod","Simple",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Pod","Perldoc",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Class",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","HTTP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","PerlIO",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/PerlIO","via",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Text",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","IPC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Devel",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Devel","StackTrace",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Unicode",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","TAP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP","Formatter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Formatter","Console",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Formatter","File",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP","Harness",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP","Parser",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Parser","Iterator",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Parser","YAMLish",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Parser","Scheduler",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Parser","Result",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/TAP/Parser","SourceHandler",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Search",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","unicore",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore","To",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore","lib",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","QMark",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","IDC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Age",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","BidiC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","XIDS",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","UIdeo",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CE",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Upper",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","XIDC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","NFKDQC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CWU",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Sc",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CWCM",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","WB",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Nv",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CWCF",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Gc",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Perl",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CWL",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","In",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Ext",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Ea",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Bc",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","InPC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Lb",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Hst",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Bpt",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Hyphen",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Vo",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Dash",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","BidiM",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Hex",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","GrBase",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","PatSyn",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Ideo",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Blk",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","NFDQC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","SB",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","SD",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Nt",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Lower",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Dt",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","NFCQC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Ccc",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","GCB",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Math",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Cased",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","DI",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","PCM",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","InSC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Jt",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","IDS",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CI",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CWKCF",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CWT",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Dia",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Term",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","STerm",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Alpha",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Jg",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Scx",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","CompEx",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","NFKCQC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/unicore/lib","Dep",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","IO",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO","Compress",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO/Compress","Gzip",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO/Compress","Zip",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO/Compress","Zlib",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO/Compress","Adapter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO/Compress","Base",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO","Uncompress",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO/Uncompress","Adapter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/IO","Socket",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Locale",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Locale","Codes",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Locale","Maketext",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","version",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Math",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Math","BigFloat",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Math","BigInt",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Exporter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","encoding",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Module",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Module","Load",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Module","CoreList",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","wasm",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Scalar",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Tie",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Tie","Hash",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Sub",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","B",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Time",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Encode",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Encode","JP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Encode","Unicode",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Encode","KR",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Encode","CN",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Encode","MIME",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Encode/MIME","Header",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","I18N",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","PerlIO",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Devel",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Unicode",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","IO",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/IO","Socket",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Hash",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","List",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/List","Util",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Data",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Cpanel",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Cpanel","JSON",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/Cpanel/JSON","XS",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","File",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm/File","Spec",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/wasm","Digest",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","CPAN",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","FTP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","Kwalify",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","Plugin",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","HTTP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","Exception",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","Meta",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/CPAN","LWP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","App",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/App","Prove",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/App/Prove","State",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/App/Prove/State","Result",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","warnings",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","overload",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Memoize",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Getopt",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Params",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Term",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Carp",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Compress",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","File",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","JSON",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/JSON","PP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Test2",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","Tools",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","IPC",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2/IPC","Driver",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","Hub",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2/Hub","Interceptor",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","Formatter",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","Util",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","EventFacet",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","Event",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2/Event","TAP",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test2","API",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Test",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test","use",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test","Future",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test","Builder",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test/Builder","IO",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test/Builder","Tester",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1/Test","Tester",true,true);Module["FS_createPath"]("/opt/perl/lib/5.28.1","Digest",true,true);function DataRequest(start,end,audio){this.start=start;this.end=end;this.audio=audio}DataRequest.prototype={requests:{},open:function(mode,name){this.name=name;this.requests[name]=this;Module["addRunDependency"]("fp "+this.name)},send:function(){},onload:function(){var byteArray=this.byteArray.subarray(this.start,this.end);this.finish(byteArray)},finish:function(byteArray){var that=this;Module["FS_createDataFile"](this.name,null,byteArray,true,true,true);Module["removeRunDependency"]("fp "+that.name);this.requests[this.name]=null}};var files=metadata.files;for(var i=0;i<files.length;++i){new DataRequest(files[i].start,files[i].end,files[i].audio).open("GET",files[i].filename)}function processPackageData(arrayBuffer){Module.finishedDataFileDownloads++;assert(arrayBuffer,"Loading data file failed.");assert(arrayBuffer instanceof ArrayBuffer,"bad input to processPackageData");var byteArray=new Uint8Array(arrayBuffer);DataRequest.prototype.byteArray=byteArray;var files=metadata.files;for(var i=0;i<files.length;++i){DataRequest.prototype.requests[files[i].filename].onload()}Module["removeRunDependency"]("datafile_emperl.data")}Module["addRunDependency"]("datafile_emperl.data");if(!Module.preloadResults)Module.preloadResults={};Module.preloadResults[PACKAGE_NAME]={fromCache:false};if(fetched){processPackageData(fetched);fetched=null}else{fetchedCallback=processPackageData}}if(Module["calledRun"]){runWithFS()}else{if(!Module["preRun"])Module["preRun"]=[];Module["preRun"].push(runWithFS)}};loadPackage({"files":[{"start":0,"audio":0,"end":4278,"filename":"/opt/perl/dev/WebPerl.t"},{"start":4278,"audio":0,"end":28730,"filename":"/opt/perl/lib/5.28.1/warnings.pm"},{"start":28730,"audio":0,"end":34274,"filename":"/opt/perl/lib/5.28.1/DBM_Filter.pm"},{"start":34274,"audio":0,"end":38517,"filename":"/opt/perl/lib/5.28.1/XSLoader.pm"},{"start":38517,"audio":0,"end":44906,"filename":"/opt/perl/lib/5.28.1/bigrat.pm"},{"start":44906,"audio":0,"end":99003,"filename":"/opt/perl/lib/5.28.1/Fatal.pm"},{"start":99003,"audio":0,"end":112367,"filename":"/opt/perl/lib/5.28.1/Test.pm"},{"start":112367,"audio":0,"end":119300,"filename":"/opt/perl/lib/5.28.1/NEXT.pm"},{"start":119300,"audio":0,"end":170294,"filename":"/opt/perl/lib/5.28.1/CPAN.pm"},{"start":170294,"audio":0,"end":171232,"filename":"/opt/perl/lib/5.28.1/vmsish.pm"},{"start":171232,"audio":0,"end":180148,"filename":"/opt/perl/lib/5.28.1/base.pm"},{"start":180148,"audio":0,"end":208157,"filename":"/opt/perl/lib/5.28.1/Future.pm"},{"start":208157,"audio":0,"end":208915,"filename":"/opt/perl/lib/5.28.1/bytes_heavy.pl"},{"start":208915,"audio":0,"end":214652,"filename":"/opt/perl/lib/5.28.1/constant.pm"},{"start":214652,"audio":0,"end":220139,"filename":"/opt/perl/lib/5.28.1/AutoLoader.pm"},{"start":220139,"audio":0,"end":235694,"filename":"/opt/perl/lib/5.28.1/dumpvar.pl"},{"start":235694,"audio":0,"end":237617,"filename":"/opt/perl/lib/5.28.1/deprecate.pm"},{"start":237617,"audio":0,"end":249940,"filename":"/opt/perl/lib/5.28.1/AutoSplit.pm"},{"start":249940,"audio":0,"end":263065,"filename":"/opt/perl/lib/5.28.1/diagnostics.pm"},{"start":263065,"audio":0,"end":263480,"filename":"/opt/perl/lib/5.28.1/ok.pm"},{"start":263480,"audio":0,"end":276462,"filename":"/opt/perl/lib/5.28.1/Safe.pm"},{"start":276462,"audio":0,"end":279953,"filename":"/opt/perl/lib/5.28.1/Env.pm"},{"start":279953,"audio":0,"end":282297,"filename":"/opt/perl/lib/5.28.1/FindBin.pm"},{"start":282297,"audio":0,"end":284398,"filename":"/opt/perl/lib/5.28.1/Symbol.pm"},{"start":284398,"audio":0,"end":285801,"filename":"/opt/perl/lib/5.28.1/blib.pm"},{"start":285801,"audio":0,"end":287828,"filename":"/opt/perl/lib/5.28.1/autouse.pm"},{"start":287828,"audio":0,"end":298018,"filename":"/opt/perl/lib/5.28.1/Memoize.pm"},{"start":298018,"audio":0,"end":300644,"filename":"/opt/perl/lib/5.28.1/charnames.pm"},{"start":300644,"audio":0,"end":305653,"filename":"/opt/perl/lib/5.28.1/fields.pm"},{"start":305653,"audio":0,"end":306315,"filename":"/opt/perl/lib/5.28.1/Thread.pm"},{"start":306315,"audio":0,"end":306793,"filename":"/opt/perl/lib/5.28.1/parent.pm"},{"start":306793,"audio":0,"end":308129,"filename":"/opt/perl/lib/5.28.1/less.pm"},{"start":308129,"audio":0,"end":326103,"filename":"/opt/perl/lib/5.28.1/Benchmark.pm"},{"start":326103,"audio":0,"end":351493,"filename":"/opt/perl/lib/5.28.1/Carp.pm"},{"start":351493,"audio":0,"end":363730,"filename":"/opt/perl/lib/5.28.1/DB.pm"},{"start":363730,"audio":0,"end":365841,"filename":"/opt/perl/lib/5.28.1/FileHandle.pm"},{"start":365841,"audio":0,"end":366270,"filename":"/opt/perl/lib/5.28.1/filetest.pm"},{"start":366270,"audio":0,"end":372997,"filename":"/opt/perl/lib/5.28.1/bignum.pm"},{"start":372997,"audio":0,"end":406163,"filename":"/opt/perl/lib/5.28.1/_charnames.pm"},{"start":406163,"audio":0,"end":409911,"filename":"/opt/perl/lib/5.28.1/open.pm"},{"start":409911,"audio":0,"end":410431,"filename":"/opt/perl/lib/5.28.1/UNIVERSAL.pm"},{"start":410431,"audio":0,"end":639159,"filename":"/opt/perl/lib/5.28.1/perl5db.pl"},{"start":639159,"audio":0,"end":639754,"filename":"/opt/perl/lib/5.28.1/if.pm"},{"start":639754,"audio":0,"end":642642,"filename":"/opt/perl/lib/5.28.1/FileCache.pm"},{"start":642642,"audio":0,"end":644337,"filename":"/opt/perl/lib/5.28.1/Digest.pm"},{"start":644337,"audio":0,"end":644679,"filename":"/opt/perl/lib/5.28.1/utf8.pm"},{"start":644679,"audio":0,"end":645643,"filename":"/opt/perl/lib/5.28.1/overloading.pm"},{"start":645643,"audio":0,"end":645988,"filename":"/opt/perl/lib/5.28.1/SelectSaver.pm"},{"start":645988,"audio":0,"end":646435,"filename":"/opt/perl/lib/5.28.1/bytes.pm"},{"start":646435,"audio":0,"end":649409,"filename":"/opt/perl/lib/5.28.1/experimental.pm"},{"start":649409,"audio":0,"end":649493,"filename":"/opt/perl/lib/5.28.1/Test2.pm"},{"start":649493,"audio":0,"end":681108,"filename":"/opt/perl/lib/5.28.1/utf8_heavy.pl"},{"start":681108,"audio":0,"end":695057,"filename":"/opt/perl/lib/5.28.1/Dumpvalue.pm"},{"start":695057,"audio":0,"end":696294,"filename":"/opt/perl/lib/5.28.1/sort.pm"},{"start":696294,"audio":0,"end":696661,"filename":"/opt/perl/lib/5.28.1/AnyDBM_File.pm"},{"start":696661,"audio":0,"end":701331,"filename":"/opt/perl/lib/5.28.1/feature.pm"},{"start":701331,"audio":0,"end":701568,"filename":"/opt/perl/lib/5.28.1/subs.pm"},{"start":701568,"audio":0,"end":708187,"filename":"/opt/perl/lib/5.28.1/SelfLoader.pm"},{"start":708187,"audio":0,"end":712629,"filename":"/opt/perl/lib/5.28.1/overload.pm"},{"start":712629,"audio":0,"end":714235,"filename":"/opt/perl/lib/5.28.1/strict.pm"},{"start":714235,"audio":0,"end":717561,"filename":"/opt/perl/lib/5.28.1/English.pm"},{"start":717561,"audio":0,"end":717734,"filename":"/opt/perl/lib/5.28.1/integer.pm"},{"start":717734,"audio":0,"end":719710,"filename":"/opt/perl/lib/5.28.1/version.pm"},{"start":719710,"audio":0,"end":730588,"filename":"/opt/perl/lib/5.28.1/bigint.pm"},{"start":730588,"audio":0,"end":732271,"filename":"/opt/perl/lib/5.28.1/autodie.pm"},{"start":732271,"audio":0,"end":732678,"filename":"/opt/perl/lib/5.28.1/PerlIO.pm"},{"start":732678,"audio":0,"end":732756,"filename":"/opt/perl/lib/5.28.1/perlfaq.pm"},{"start":732756,"audio":0,"end":733905,"filename":"/opt/perl/lib/5.28.1/vars.pm"},{"start":733905,"audio":0,"end":736275,"filename":"/opt/perl/lib/5.28.1/Exporter.pm"},{"start":736275,"audio":0,"end":739697,"filename":"/opt/perl/lib/5.28.1/locale.pm"},{"start":739697,"audio":0,"end":742569,"filename":"/opt/perl/lib/5.28.1/sigtrap.pm"},{"start":742569,"audio":0,"end":743516,"filename":"/opt/perl/lib/5.28.1/DirHandle.pm"},{"start":743516,"audio":0,"end":745633,"filename":"/opt/perl/lib/5.28.1/meta_notation.pm"},{"start":745633,"audio":0,"end":750484,"filename":"/opt/perl/lib/5.28.1/autodie/Util.pm"},{"start":750484,"audio":0,"end":750896,"filename":"/opt/perl/lib/5.28.1/autodie/skip.pm"},{"start":750896,"audio":0,"end":755983,"filename":"/opt/perl/lib/5.28.1/autodie/hints.pm"},{"start":755983,"audio":0,"end":771068,"filename":"/opt/perl/lib/5.28.1/autodie/exception.pm"},{"start":771068,"audio":0,"end":771679,"filename":"/opt/perl/lib/5.28.1/autodie/exception/system.pm"},{"start":771679,"audio":0,"end":772127,"filename":"/opt/perl/lib/5.28.1/autodie/Scope/Guard.pm"},{"start":772127,"audio":0,"end":774220,"filename":"/opt/perl/lib/5.28.1/autodie/Scope/GuardStack.pm"},{"start":774220,"audio":0,"end":776737,"filename":"/opt/perl/lib/5.28.1/Tie/Array.pm"},{"start":776737,"audio":0,"end":780759,"filename":"/opt/perl/lib/5.28.1/Tie/SubstrHash.pm"},{"start":780759,"audio":0,"end":781534,"filename":"/opt/perl/lib/5.28.1/Tie/StdHandle.pm"},{"start":781534,"audio":0,"end":783193,"filename":"/opt/perl/lib/5.28.1/Tie/Memoize.pm"},{"start":783193,"audio":0,"end":838533,"filename":"/opt/perl/lib/5.28.1/Tie/File.pm"},{"start":838533,"audio":0,"end":840571,"filename":"/opt/perl/lib/5.28.1/Tie/Hash.pm"},{"start":840571,"audio":0,"end":842218,"filename":"/opt/perl/lib/5.28.1/Tie/Handle.pm"},{"start":842218,"audio":0,"end":846329,"filename":"/opt/perl/lib/5.28.1/Tie/RefHash.pm"},{"start":846329,"audio":0,"end":847710,"filename":"/opt/perl/lib/5.28.1/Tie/Scalar.pm"},{"start":847710,"audio":0,"end":847933,"filename":"/opt/perl/lib/5.28.1/DBM_Filter/null.pm"},{"start":847933,"audio":0,"end":848245,"filename":"/opt/perl/lib/5.28.1/DBM_Filter/compress.pm"},{"start":848245,"audio":0,"end":848529,"filename":"/opt/perl/lib/5.28.1/DBM_Filter/int32.pm"},{"start":848529,"audio":0,"end":848843,"filename":"/opt/perl/lib/5.28.1/DBM_Filter/utf8.pm"},{"start":848843,"audio":0,"end":849442,"filename":"/opt/perl/lib/5.28.1/DBM_Filter/encode.pm"},{"start":849442,"audio":0,"end":893647,"filename":"/opt/perl/lib/5.28.1/Archive/Tar.pm"},{"start":893647,"audio":0,"end":897850,"filename":"/opt/perl/lib/5.28.1/Archive/Tar/Constant.pm"},{"start":897850,"audio":0,"end":910618,"filename":"/opt/perl/lib/5.28.1/Archive/Tar/File.pm"},{"start":910618,"audio":0,"end":910959,"filename":"/opt/perl/lib/5.28.1/Config/Extensions.pm"},{"start":910959,"audio":0,"end":921233,"filename":"/opt/perl/lib/5.28.1/Config/Perl/V.pm"},{"start":921233,"audio":0,"end":921542,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_UWIN.pm"},{"start":921542,"audio":0,"end":937386,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Manifest.pm"},{"start":937386,"audio":0,"end":939655,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Mkbootstrap.pm"},{"start":939655,"audio":0,"end":951125,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_Win32.pm"},{"start":951125,"audio":0,"end":958197,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Mksymlists.pm"},{"start":958197,"audio":0,"end":963268,"filename":"/opt/perl/lib/5.28.1/ExtUtils/xsubpp"},{"start":963268,"audio":0,"end":963645,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_Win95.pm"},{"start":963645,"audio":0,"end":970332,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Embed.pm"},{"start":970332,"audio":0,"end":981647,"filename":"/opt/perl/lib/5.28.1/ExtUtils/typemap"},{"start":981647,"audio":0,"end":982439,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_AIX.pm"},{"start":982439,"audio":0,"end":991673,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Constant.pm"},{"start":991673,"audio":0,"end":994321,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_OS2.pm"},{"start":994321,"audio":0,"end":995172,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder.pm"},{"start":995172,"audio":0,"end":1020703,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Install.pm"},{"start":1020703,"audio":0,"end":1023662,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_Cygwin.pm"},{"start":1023662,"audio":0,"end":1024196,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_BeOS.pm"},{"start":1024196,"audio":0,"end":1028444,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Packlist.pm"},{"start":1028444,"audio":0,"end":1028652,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MY.pm"},{"start":1028652,"audio":0,"end":1045556,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Typemaps.pm"},{"start":1045556,"audio":0,"end":1050265,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Command.pm"},{"start":1050265,"audio":0,"end":1054862,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_NW5.pm"},{"start":1054862,"audio":0,"end":1111435,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_Any.pm"},{"start":1111435,"audio":0,"end":1111764,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_QNX.pm"},{"start":1111764,"audio":0,"end":1111971,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_VOS.pm"},{"start":1111971,"audio":0,"end":1112548,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_Darwin.pm"},{"start":1112548,"audio":0,"end":1155367,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MakeMaker.pm"},{"start":1155367,"audio":0,"end":1155818,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Liblist.pm"},{"start":1155818,"audio":0,"end":1164519,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Installed.pm"},{"start":1164519,"audio":0,"end":1164699,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_MacOS.pm"},{"start":1164699,"audio":0,"end":1171111,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Miniperl.pm"},{"start":1171111,"audio":0,"end":1171499,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_DOS.pm"},{"start":1171499,"audio":0,"end":1172049,"filename":"/opt/perl/lib/5.28.1/ExtUtils/testlib.pm"},{"start":1172049,"audio":0,"end":1238877,"filename":"/opt/perl/lib/5.28.1/ExtUtils/ParseXS.pm"},{"start":1238877,"audio":0,"end":1296489,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_VMS.pm"},{"start":1296489,"audio":0,"end":1297460,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MANIFEST.SKIP"},{"start":1297460,"audio":0,"end":1392247,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM_Unix.pm"},{"start":1392247,"audio":0,"end":1393854,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MM.pm"},{"start":1393854,"audio":0,"end":1396230,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MakeMaker/version.pm"},{"start":1396230,"audio":0,"end":1396534,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MakeMaker/Config.pm"},{"start":1396534,"audio":0,"end":1401742,"filename":"/opt/perl/lib/5.28.1/ExtUtils/MakeMaker/Locale.pm"},{"start":1401742,"audio":0,"end":1404411,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Constant/Utils.pm"},{"start":1404411,"audio":0,"end":1424153,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Constant/ProxySubs.pm"},{"start":1424153,"audio":0,"end":1449369,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Constant/Base.pm"},{"start":1449369,"audio":0,"end":1455300,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Constant/XS.pm"},{"start":1455300,"audio":0,"end":1466083,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Base.pm"},{"start":1466083,"audio":0,"end":1473553,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/Windows.pm"},{"start":1473553,"audio":0,"end":1483841,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/VMS.pm"},{"start":1483841,"audio":0,"end":1486252,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/os2.pm"},{"start":1486252,"audio":0,"end":1486680,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/dec_osf.pm"},{"start":1486680,"audio":0,"end":1487200,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/darwin.pm"},{"start":1487200,"audio":0,"end":1488132,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/cygwin.pm"},{"start":1488132,"audio":0,"end":1489348,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/android.pm"},{"start":1489348,"audio":0,"end":1489973,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/aix.pm"},{"start":1489973,"audio":0,"end":1491019,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/Unix.pm"},{"start":1491019,"audio":0,"end":1494267,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/Windows/MSVC.pm"},{"start":1494267,"audio":0,"end":1497770,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/Windows/BCC.pm"},{"start":1497770,"audio":0,"end":1502030,"filename":"/opt/perl/lib/5.28.1/ExtUtils/CBuilder/Platform/Windows/GCC.pm"},{"start":1502030,"audio":0,"end":1506793,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Command/MM.pm"},{"start":1506793,"audio":0,"end":1507418,"filename":"/opt/perl/lib/5.28.1/ExtUtils/ParseXS/Constants.pm"},{"start":1507418,"audio":0,"end":1508291,"filename":"/opt/perl/lib/5.28.1/ExtUtils/ParseXS/Eval.pm"},{"start":1508291,"audio":0,"end":1509262,"filename":"/opt/perl/lib/5.28.1/ExtUtils/ParseXS/CountLines.pm"},{"start":1509262,"audio":0,"end":1519862,"filename":"/opt/perl/lib/5.28.1/ExtUtils/ParseXS/Utilities.pm"},{"start":1519862,"audio":0,"end":1520842,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Typemaps/Type.pm"},{"start":1520842,"audio":0,"end":1523006,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Typemaps/OutputMap.pm"},{"start":1523006,"audio":0,"end":1523998,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Typemaps/InputMap.pm"},{"start":1523998,"audio":0,"end":1526330,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Typemaps/Cmd.pm"},{"start":1526330,"audio":0,"end":1551183,"filename":"/opt/perl/lib/5.28.1/ExtUtils/Liblist/Kid.pm"},{"start":1551183,"audio":0,"end":1558971,"filename":"/opt/perl/lib/5.28.1/Filter/Simple.pm"},{"start":1558971,"audio":0,"end":1753592,"filename":"/opt/perl/lib/5.28.1/B/Deparse.pm"},{"start":1753592,"audio":0,"end":1789216,"filename":"/opt/perl/lib/5.28.1/B/Op_private.pm"},{"start":1789216,"audio":0,"end":1799394,"filename":"/opt/perl/lib/5.28.1/B/Debug.pm"},{"start":1799394,"audio":0,"end":1814629,"filename":"/opt/perl/lib/5.28.1/Net/SMTP.pm"},{"start":1814629,"audio":0,"end":1816222,"filename":"/opt/perl/lib/5.28.1/Net/hostent.pm"},{"start":1816222,"audio":0,"end":1823078,"filename":"/opt/perl/lib/5.28.1/Net/Domain.pm"},{"start":1823078,"audio":0,"end":1824205,"filename":"/opt/perl/lib/5.28.1/Net/protoent.pm"},{"start":1824205,"audio":0,"end":1826251,"filename":"/opt/perl/lib/5.28.1/Net/Time.pm"},{"start":1826251,"audio":0,"end":1827453,"filename":"/opt/perl/lib/5.28.1/Net/servent.pm"},{"start":1827453,"audio":0,"end":1888058,"filename":"/opt/perl/lib/5.28.1/Net/Ping.pm"},{"start":1888058,"audio":0,"end":1903830,"filename":"/opt/perl/lib/5.28.1/Net/NNTP.pm"},{"start":1903830,"audio":0,"end":1936553,"filename":"/opt/perl/lib/5.28.1/Net/FTP.pm"},{"start":1936553,"audio":0,"end":1940594,"filename":"/opt/perl/lib/5.28.1/Net/Netrc.pm"},{"start":1940594,"audio":0,"end":1944275,"filename":"/opt/perl/lib/5.28.1/Net/Config.pm"},{"start":1944275,"audio":0,"end":1957388,"filename":"/opt/perl/lib/5.28.1/Net/Cmd.pm"},{"start":1957388,"audio":0,"end":1970503,"filename":"/opt/perl/lib/5.28.1/Net/POP3.pm"},{"start":1970503,"audio":0,"end":1971834,"filename":"/opt/perl/lib/5.28.1/Net/netent.pm"},{"start":1971834,"audio":0,"end":1974275,"filename":"/opt/perl/lib/5.28.1/Net/FTP/dataconn.pm"},{"start":1974275,"audio":0,"end":1975934,"filename":"/opt/perl/lib/5.28.1/Net/FTP/I.pm"},{"start":1975934,"audio":0,"end":1978334,"filename":"/opt/perl/lib/5.28.1/Net/FTP/A.pm"},{"start":1978334,"audio":0,"end":1978471,"filename":"/opt/perl/lib/5.28.1/Net/FTP/L.pm"},{"start":1978471,"audio":0,"end":1978608,"filename":"/opt/perl/lib/5.28.1/Net/FTP/E.pm"},{"start":1978608,"audio":0,"end":1979523,"filename":"/opt/perl/lib/5.28.1/Time/gmtime.pm"},{"start":1979523,"audio":0,"end":1980455,"filename":"/opt/perl/lib/5.28.1/Time/localtime.pm"},{"start":1980455,"audio":0,"end":1986022,"filename":"/opt/perl/lib/5.28.1/Time/Local.pm"},{"start":1986022,"audio":0,"end":1986219,"filename":"/opt/perl/lib/5.28.1/Time/tm.pm"},{"start":1986219,"audio":0,"end":1987877,"filename":"/opt/perl/lib/5.28.1/Perl/OSType.pm"},{"start":1987877,"audio":0,"end":1988917,"filename":"/opt/perl/lib/5.28.1/User/grent.pm"},{"start":1988917,"audio":0,"end":1994441,"filename":"/opt/perl/lib/5.28.1/User/pwent.pm"},{"start":1994441,"audio":0,"end":2002594,"filename":"/opt/perl/lib/5.28.1/Attribute/Handlers.pm"},{"start":2002594,"audio":0,"end":2003147,"filename":"/opt/perl/lib/5.28.1/Encode/README.e2x"},{"start":2003147,"audio":0,"end":2008315,"filename":"/opt/perl/lib/5.28.1/Encode/Makefile_PL.e2x"},{"start":2008315,"audio":0,"end":2008494,"filename":"/opt/perl/lib/5.28.1/Encode/Changes.e2x"},{"start":2008494,"audio":0,"end":2008678,"filename":"/opt/perl/lib/5.28.1/Encode/ConfigLocal_PM.e2x"},{"start":2008678,"audio":0,"end":2008928,"filename":"/opt/perl/lib/5.28.1/Encode/_PM.e2x"},{"start":2008928,"audio":0,"end":2009079,"filename":"/opt/perl/lib/5.28.1/Encode/_T.e2x"},{"start":2009079,"audio":0,"end":2013281,"filename":"/opt/perl/lib/5.28.1/Parse/CPAN/Meta.pm"},{"start":2013281,"audio":0,"end":2020943,"filename":"/opt/perl/lib/5.28.1/Thread/Queue.pm"},{"start":2020943,"audio":0,"end":2023525,"filename":"/opt/perl/lib/5.28.1/Thread/Semaphore.pm"},{"start":2023525,"audio":0,"end":2031446,"filename":"/opt/perl/lib/5.28.1/Future/Utils.pm"},{"start":2031446,"audio":0,"end":2032386,"filename":"/opt/perl/lib/5.28.1/Future/Mutex.pm"},{"start":2032386,"audio":0,"end":2043504,"filename":"/opt/perl/lib/5.28.1/I18N/LangTags.pm"},{"start":2043504,"audio":0,"end":2046997,"filename":"/opt/perl/lib/5.28.1/I18N/Collate.pm"},{"start":2046997,"audio":0,"end":2051315,"filename":"/opt/perl/lib/5.28.1/I18N/LangTags/List.pm"},{"start":2051315,"audio":0,"end":2055944,"filename":"/opt/perl/lib/5.28.1/I18N/LangTags/Detect.pm"},{"start":2055944,"audio":0,"end":2076806,"filename":"/opt/perl/lib/5.28.1/Pod/PlainText.pm"},{"start":2076806,"audio":0,"end":2080561,"filename":"/opt/perl/lib/5.28.1/Pod/ParseLink.pm"},{"start":2080561,"audio":0,"end":2108382,"filename":"/opt/perl/lib/5.28.1/Pod/Text.pm"},{"start":2108382,"audio":0,"end":2120623,"filename":"/opt/perl/lib/5.28.1/Pod/Escapes.pm"},{"start":2120623,"audio":0,"end":2133749,"filename":"/opt/perl/lib/5.28.1/Pod/Usage.pm"},{"start":2133749,"audio":0,"end":2144718,"filename":"/opt/perl/lib/5.28.1/Pod/Find.pm"},{"start":2144718,"audio":0,"end":2158012,"filename":"/opt/perl/lib/5.28.1/Pod/Functions.pm"},{"start":2158012,"audio":0,"end":2211939,"filename":"/opt/perl/lib/5.28.1/Pod/Simple.pm"},{"start":2211939,"audio":0,"end":2224298,"filename":"/opt/perl/lib/5.28.1/Pod/ParseUtils.pm"},{"start":2224298,"audio":0,"end":2249677,"filename":"/opt/perl/lib/5.28.1/Pod/Parser.pm"},{"start":2249677,"audio":0,"end":2271010,"filename":"/opt/perl/lib/5.28.1/Pod/Html.pm"},{"start":2271010,"audio":0,"end":2281315,"filename":"/opt/perl/lib/5.28.1/Pod/Select.pm"},{"start":2281315,"audio":0,"end":2294343,"filename":"/opt/perl/lib/5.28.1/Pod/InputObjects.pm"},{"start":2294343,"audio":0,"end":2313585,"filename":"/opt/perl/lib/5.28.1/Pod/Checker.pm"},{"start":2313585,"audio":0,"end":2377593,"filename":"/opt/perl/lib/5.28.1/Pod/Man.pm"},{"start":2377593,"audio":0,"end":2441374,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc.pm"},{"start":2441374,"audio":0,"end":2444403,"filename":"/opt/perl/lib/5.28.1/Pod/Text/Color.pm"},{"start":2444403,"audio":0,"end":2448798,"filename":"/opt/perl/lib/5.28.1/Pod/Text/Overstrike.pm"},{"start":2448798,"audio":0,"end":2453242,"filename":"/opt/perl/lib/5.28.1/Pod/Text/Termcap.pm"},{"start":2453242,"audio":0,"end":2474884,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Search.pm"},{"start":2474884,"audio":0,"end":2477224,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/DumpAsXML.pm"},{"start":2477224,"audio":0,"end":2480654,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Text.pm"},{"start":2480654,"audio":0,"end":2483405,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/TiedOutFH.pm"},{"start":2483405,"audio":0,"end":2502028,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/RTF.pm"},{"start":2502028,"audio":0,"end":2574626,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/BlackBox.pm"},{"start":2574626,"audio":0,"end":2576900,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/DumpAsText.pm"},{"start":2576900,"audio":0,"end":2577529,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Methody.pm"},{"start":2577529,"audio":0,"end":2591971,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/XHTML.pm"},{"start":2591971,"audio":0,"end":2622775,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/HTMLBatch.pm"},{"start":2622775,"audio":0,"end":2623605,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/TextContent.pm"},{"start":2623605,"audio":0,"end":2625237,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/LinkSection.pm"},{"start":2625237,"audio":0,"end":2627650,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Progress.pm"},{"start":2627650,"audio":0,"end":2629405,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Debug.pm"},{"start":2629405,"audio":0,"end":2629917,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/PullParserEndToken.pm"},{"start":2629917,"audio":0,"end":2648579,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/PullParser.pm"},{"start":2648579,"audio":0,"end":2649506,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/PullParserStartToken.pm"},{"start":2649506,"audio":0,"end":2677214,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/HTML.pm"},{"start":2677214,"audio":0,"end":2677929,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/TranscodeSmart.pm"},{"start":2677929,"audio":0,"end":2681509,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Checker.pm"},{"start":2681509,"audio":0,"end":2684172,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/XMLOutStream.pm"},{"start":2684172,"audio":0,"end":2686930,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/HTMLLegacy.pm"},{"start":2686930,"audio":0,"end":2687346,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/PullParserTextToken.pm"},{"start":2687346,"audio":0,"end":2688082,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/Transcode.pm"},{"start":2688082,"audio":0,"end":2689797,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/SimpleTree.pm"},{"start":2689797,"audio":0,"end":2690725,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/PullParserToken.pm"},{"start":2690725,"audio":0,"end":2693418,"filename":"/opt/perl/lib/5.28.1/Pod/Simple/TranscodeDumb.pm"},{"start":2693418,"audio":0,"end":2693919,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToChecker.pm"},{"start":2693919,"audio":0,"end":2694465,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToRtf.pm"},{"start":2694465,"audio":0,"end":2695521,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToText.pm"},{"start":2695521,"audio":0,"end":2696596,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToANSI.pm"},{"start":2696596,"audio":0,"end":2696868,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToXml.pm"},{"start":2696868,"audio":0,"end":2699103,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/GetOptsOO.pm"},{"start":2699103,"audio":0,"end":2700560,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToNroff.pm"},{"start":2700560,"audio":0,"end":2703070,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToTerm.pm"},{"start":2703070,"audio":0,"end":2703977,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToPod.pm"},{"start":2703977,"audio":0,"end":2707300,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToTk.pm"},{"start":2707300,"audio":0,"end":2709799,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/BaseTo.pm"},{"start":2709799,"audio":0,"end":2722679,"filename":"/opt/perl/lib/5.28.1/Pod/Perldoc/ToMan.pm"},{"start":2722679,"audio":0,"end":2729446,"filename":"/opt/perl/lib/5.28.1/Class/Struct.pm"},{"start":2729446,"audio":0,"end":2784344,"filename":"/opt/perl/lib/5.28.1/HTTP/Tiny.pm"},{"start":2784344,"audio":0,"end":2785743,"filename":"/opt/perl/lib/5.28.1/PerlIO/via/QuotedPrint.pm"},{"start":2785743,"audio":0,"end":2790234,"filename":"/opt/perl/lib/5.28.1/Text/ParseWords.pm"},{"start":2790234,"audio":0,"end":2816110,"filename":"/opt/perl/lib/5.28.1/Text/Balanced.pm"},{"start":2816110,"audio":0,"end":2817813,"filename":"/opt/perl/lib/5.28.1/Text/Tabs.pm"},{"start":2817813,"audio":0,"end":2819291,"filename":"/opt/perl/lib/5.28.1/Text/Abbrev.pm"},{"start":2819291,"audio":0,"end":2822213,"filename":"/opt/perl/lib/5.28.1/Text/Wrap.pm"},{"start":2822213,"audio":0,"end":2831269,"filename":"/opt/perl/lib/5.28.1/IPC/Open3.pm"},{"start":2831269,"audio":0,"end":2882179,"filename":"/opt/perl/lib/5.28.1/IPC/Cmd.pm"},{"start":2882179,"audio":0,"end":2882996,"filename":"/opt/perl/lib/5.28.1/IPC/Open2.pm"},{"start":2882996,"audio":0,"end":2885142,"filename":"/opt/perl/lib/5.28.1/Devel/SelfStubber.pm"},{"start":2885142,"audio":0,"end":2891232,"filename":"/opt/perl/lib/5.28.1/Devel/StackTrace.pm"},{"start":2891232,"audio":0,"end":2895823,"filename":"/opt/perl/lib/5.28.1/Devel/StackTrace/Frame.pm"},{"start":2895823,"audio":0,"end":2983440,"filename":"/opt/perl/lib/5.28.1/Unicode/UCD.pm"},{"start":2983440,"audio":0,"end":3003868,"filename":"/opt/perl/lib/5.28.1/TAP/Parser.pm"},{"start":3003868,"audio":0,"end":3005300,"filename":"/opt/perl/lib/5.28.1/TAP/Base.pm"},{"start":3005300,"audio":0,"end":3018846,"filename":"/opt/perl/lib/5.28.1/TAP/Harness.pm"},{"start":3018846,"audio":0,"end":3019914,"filename":"/opt/perl/lib/5.28.1/TAP/Object.pm"},{"start":3019914,"audio":0,"end":3023986,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/Session.pm"},{"start":3023986,"audio":0,"end":3025603,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/Console.pm"},{"start":3025603,"audio":0,"end":3026098,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/File.pm"},{"start":3026098,"audio":0,"end":3027190,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/Color.pm"},{"start":3027190,"audio":0,"end":3035917,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/Base.pm"},{"start":3035917,"audio":0,"end":3041104,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/Console/Session.pm"},{"start":3041104,"audio":0,"end":3044759,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/Console/ParallelSession.pm"},{"start":3044759,"audio":0,"end":3046450,"filename":"/opt/perl/lib/5.28.1/TAP/Formatter/File/Session.pm"},{"start":3046450,"audio":0,"end":3049675,"filename":"/opt/perl/lib/5.28.1/TAP/Harness/Env.pm"},{"start":3049675,"audio":0,"end":3054198,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/IteratorFactory.pm"},{"start":3054198,"audio":0,"end":3055081,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Iterator.pm"},{"start":3055081,"audio":0,"end":3057409,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Multiplexer.pm"},{"start":3057409,"audio":0,"end":3058828,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/ResultFactory.pm"},{"start":3058828,"audio":0,"end":3065494,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Scheduler.pm"},{"start":3065494,"audio":0,"end":3075800,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Grammar.pm"},{"start":3075800,"audio":0,"end":3080525,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Source.pm"},{"start":3080525,"audio":0,"end":3082611,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result.pm"},{"start":3082611,"audio":0,"end":3083080,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/SourceHandler.pm"},{"start":3083080,"audio":0,"end":3087781,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Aggregator.pm"},{"start":3087781,"audio":0,"end":3088345,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Iterator/Array.pm"},{"start":3088345,"audio":0,"end":3095657,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Iterator/Process.pm"},{"start":3095657,"audio":0,"end":3096489,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Iterator/Stream.pm"},{"start":3096489,"audio":0,"end":3102745,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/YAMLish/Reader.pm"},{"start":3102745,"audio":0,"end":3105810,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/YAMLish/Writer.pm"},{"start":3105810,"audio":0,"end":3106565,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Scheduler/Job.pm"},{"start":3106565,"audio":0,"end":3106724,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Scheduler/Spinner.pm"},{"start":3106724,"audio":0,"end":3109163,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Test.pm"},{"start":3109163,"audio":0,"end":3109397,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/YAML.pm"},{"start":3109397,"audio":0,"end":3109640,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Version.pm"},{"start":3109640,"audio":0,"end":3109916,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Comment.pm"},{"start":3109916,"audio":0,"end":3110200,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Bailout.pm"},{"start":3110200,"audio":0,"end":3110328,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Unknown.pm"},{"start":3110328,"audio":0,"end":3110639,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Pragma.pm"},{"start":3110639,"audio":0,"end":3111298,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/Result/Plan.pm"},{"start":3111298,"audio":0,"end":3112887,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/SourceHandler/Executable.pm"},{"start":3112887,"audio":0,"end":3113965,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/SourceHandler/RawTAP.pm"},{"start":3113965,"audio":0,"end":3120092,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/SourceHandler/Perl.pm"},{"start":3120092,"audio":0,"end":3121217,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/SourceHandler/File.pm"},{"start":3121217,"audio":0,"end":3122076,"filename":"/opt/perl/lib/5.28.1/TAP/Parser/SourceHandler/Handle.pm"},{"start":3122076,"audio":0,"end":3124211,"filename":"/opt/perl/lib/5.28.1/Search/Dict.pm"},{"start":3124211,"audio":0,"end":3141041,"filename":"/opt/perl/lib/5.28.1/unicore/SpecialCasing.txt"},{"start":3141041,"audio":0,"end":3160046,"filename":"/opt/perl/lib/5.28.1/unicore/NamedSequences.txt"},{"start":3160046,"audio":0,"end":3280008,"filename":"/opt/perl/lib/5.28.1/unicore/UCD.pl"},{"start":3280008,"audio":0,"end":4282714,"filename":"/opt/perl/lib/5.28.1/unicore/Name.pl"},{"start":4282714,"audio":0,"end":4282721,"filename":"/opt/perl/lib/5.28.1/unicore/version"},{"start":4282721,"audio":0,"end":4292312,"filename":"/opt/perl/lib/5.28.1/unicore/Name.pm"},{"start":4292312,"audio":0,"end":4301796,"filename":"/opt/perl/lib/5.28.1/unicore/Blocks.txt"},{"start":4301796,"audio":0,"end":4440015,"filename":"/opt/perl/lib/5.28.1/unicore/Heavy.pl"},{"start":4440015,"audio":0,"end":4549134,"filename":"/opt/perl/lib/5.28.1/unicore/Decomposition.pl"},{"start":4549134,"audio":0,"end":4553501,"filename":"/opt/perl/lib/5.28.1/unicore/CombiningClass.pl"},{"start":4553501,"audio":0,"end":4569014,"filename":"/opt/perl/lib/5.28.1/unicore/To/Cf.pl"},{"start":4569014,"audio":0,"end":4592776,"filename":"/opt/perl/lib/5.28.1/unicore/To/Fold.pl"},{"start":4592776,"audio":0,"end":4612232,"filename":"/opt/perl/lib/5.28.1/unicore/To/_PerlSCX.pl"},{"start":4612232,"audio":0,"end":4631717,"filename":"/opt/perl/lib/5.28.1/unicore/To/GCB.pl"},{"start":4631717,"audio":0,"end":4662639,"filename":"/opt/perl/lib/5.28.1/unicore/To/_PerlLB.pl"},{"start":4662639,"audio":0,"end":5061963,"filename":"/opt/perl/lib/5.28.1/unicore/To/NFKCCF.pl"},{"start":5061963,"audio":0,"end":5075503,"filename":"/opt/perl/lib/5.28.1/unicore/To/Vo.pl"},{"start":5075503,"audio":0,"end":5079359,"filename":"/opt/perl/lib/5.28.1/unicore/To/Ea.pl"},{"start":5079359,"audio":0,"end":5094697,"filename":"/opt/perl/lib/5.28.1/unicore/To/Uc.pl"},{"start":5094697,"audio":0,"end":5111859,"filename":"/opt/perl/lib/5.28.1/unicore/To/WB.pl"},{"start":5111859,"audio":0,"end":5144975,"filename":"/opt/perl/lib/5.28.1/unicore/To/Gc.pl"},{"start":5144975,"audio":0,"end":5148690,"filename":"/opt/perl/lib/5.28.1/unicore/To/NFKCQC.pl"},{"start":5148690,"audio":0,"end":5162306,"filename":"/opt/perl/lib/5.28.1/unicore/To/NameAlia.pl"},{"start":5162306,"audio":0,"end":5170857,"filename":"/opt/perl/lib/5.28.1/unicore/To/InPC.pl"},{"start":5170857,"audio":0,"end":5179385,"filename":"/opt/perl/lib/5.28.1/unicore/To/Bc.pl"},{"start":5179385,"audio":0,"end":5195383,"filename":"/opt/perl/lib/5.28.1/unicore/To/Sc.pl"},{"start":5195383,"audio":0,"end":5214054,"filename":"/opt/perl/lib/5.28.1/unicore/To/Scx.pl"},{"start":5214054,"audio":0,"end":5217458,"filename":"/opt/perl/lib/5.28.1/unicore/To/Jg.pl"},{"start":5217458,"audio":0,"end":5232569,"filename":"/opt/perl/lib/5.28.1/unicore/To/InSC.pl"},{"start":5232569,"audio":0,"end":5238603,"filename":"/opt/perl/lib/5.28.1/unicore/To/Digit.pl"},{"start":5238603,"audio":0,"end":5239402,"filename":"/opt/perl/lib/5.28.1/unicore/To/Isc.pl"},{"start":5239402,"audio":0,"end":5241080,"filename":"/opt/perl/lib/5.28.1/unicore/To/PerlDeci.pl"},{"start":5241080,"audio":0,"end":5242773,"filename":"/opt/perl/lib/5.28.1/unicore/To/Bpt.pl"},{"start":5242773,"audio":0,"end":5250551,"filename":"/opt/perl/lib/5.28.1/unicore/To/Nv.pl"},{"start":5250551,"audio":0,"end":5270471,"filename":"/opt/perl/lib/5.28.1/unicore/To/Title.pl"},{"start":5270471,"audio":0,"end":5275590,"filename":"/opt/perl/lib/5.28.1/unicore/To/Bmg.pl"},{"start":5275590,"audio":0,"end":5307902,"filename":"/opt/perl/lib/5.28.1/unicore/To/SB.pl"},{"start":5307902,"audio":0,"end":5331197,"filename":"/opt/perl/lib/5.28.1/unicore/To/Upper.pl"},{"start":5331197,"audio":0,"end":5335917,"filename":"/opt/perl/lib/5.28.1/unicore/To/NFKDQC.pl"},{"start":5335917,"audio":0,"end":5353275,"filename":"/opt/perl/lib/5.28.1/unicore/To/_PerlWB.pl"},{"start":5353275,"audio":0,"end":5355401,"filename":"/opt/perl/lib/5.28.1/unicore/To/Bpb.pl"},{"start":5355401,"audio":0,"end":5367067,"filename":"/opt/perl/lib/5.28.1/unicore/To/Tc.pl"},{"start":5367067,"audio":0,"end":5377066,"filename":"/opt/perl/lib/5.28.1/unicore/To/Hst.pl"},{"start":5377066,"audio":0,"end":5382304,"filename":"/opt/perl/lib/5.28.1/unicore/To/Jt.pl"},{"start":5382304,"audio":0,"end":5445868,"filename":"/opt/perl/lib/5.28.1/unicore/To/Na1.pl"},{"start":5445868,"audio":0,"end":5448789,"filename":"/opt/perl/lib/5.28.1/unicore/To/NFDQC.pl"},{"start":5448789,"audio":0,"end":5450541,"filename":"/opt/perl/lib/5.28.1/unicore/To/NFCQC.pl"},{"start":5450541,"audio":0,"end":5481465,"filename":"/opt/perl/lib/5.28.1/unicore/To/Lb.pl"},{"start":5481465,"audio":0,"end":5500726,"filename":"/opt/perl/lib/5.28.1/unicore/To/Age.pl"},{"start":5500726,"audio":0,"end":5517172,"filename":"/opt/perl/lib/5.28.1/unicore/To/Lower.pl"},{"start":5517172,"audio":0,"end":5525406,"filename":"/opt/perl/lib/5.28.1/unicore/To/Lc.pl"},{"start":5525406,"audio":0,"end":5529734,"filename":"/opt/perl/lib/5.28.1/unicore/To/Nt.pl"},{"start":5529734,"audio":0,"end":5530357,"filename":"/opt/perl/lib/5.28.1/unicore/lib/QMark/Y.pl"},{"start":5530357,"audio":0,"end":5538615,"filename":"/opt/perl/lib/5.28.1/unicore/lib/IDC/Y.pl"},{"start":5538615,"audio":0,"end":5539941,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V40.pl"},{"start":5539941,"audio":0,"end":5541371,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V41.pl"},{"start":5541371,"audio":0,"end":5543081,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V30.pl"},{"start":5543081,"audio":0,"end":5543923,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V20.pl"},{"start":5543923,"audio":0,"end":5544794,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V50.pl"},{"start":5544794,"audio":0,"end":5546008,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V80.pl"},{"start":5546008,"audio":0,"end":5547149,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V90.pl"},{"start":5547149,"audio":0,"end":5549363,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V70.pl"},{"start":5549363,"audio":0,"end":5552811,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V11.pl"},{"start":5552811,"audio":0,"end":5553927,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V32.pl"},{"start":5553927,"audio":0,"end":5555387,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V51.pl"},{"start":5555387,"audio":0,"end":5563520,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/NA.pl"},{"start":5563520,"audio":0,"end":5565146,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V61.pl"},{"start":5565146,"audio":0,"end":5566686,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V52.pl"},{"start":5566686,"audio":0,"end":5567667,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V100.pl"},{"start":5567667,"audio":0,"end":5568646,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V31.pl"},{"start":5568646,"audio":0,"end":5570462,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Age/V60.pl"},{"start":5570462,"audio":0,"end":5570992,"filename":"/opt/perl/lib/5.28.1/unicore/lib/BidiC/Y.pl"},{"start":5570992,"audio":0,"end":5578164,"filename":"/opt/perl/lib/5.28.1/unicore/lib/XIDS/Y.pl"},{"start":5578164,"audio":0,"end":5578833,"filename":"/opt/perl/lib/5.28.1/unicore/lib/UIdeo/Y.pl"},{"start":5578833,"audio":0,"end":5579680,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CE/Y.pl"},{"start":5579680,"audio":0,"end":5586635,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Upper/Y.pl"},{"start":5586635,"audio":0,"end":5594977,"filename":"/opt/perl/lib/5.28.1/unicore/lib/XIDC/Y.pl"},{"start":5594977,"audio":0,"end":5599769,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFKDQC/N.pl"},{"start":5599769,"audio":0,"end":5604563,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFKDQC/Y.pl"},{"start":5604563,"audio":0,"end":5611116,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CWU/Y.pl"},{"start":5611116,"audio":0,"end":5611679,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Cprt.pl"},{"start":5611679,"audio":0,"end":5612481,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Latn.pl"},{"start":5612481,"audio":0,"end":5613322,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Grek.pl"},{"start":5613322,"audio":0,"end":5614029,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Han.pl"},{"start":5614029,"audio":0,"end":5614660,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Gujr.pl"},{"start":5614660,"audio":0,"end":5615331,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Gran.pl"},{"start":5615331,"audio":0,"end":5616545,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Arab.pl"},{"start":5616545,"audio":0,"end":5617196,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Taml.pl"},{"start":5617196,"audio":0,"end":5617749,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Armn.pl"},{"start":5617749,"audio":0,"end":5618310,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Dupl.pl"},{"start":5618310,"audio":0,"end":5618851,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Limb.pl"},{"start":5618851,"audio":0,"end":5619440,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Kana.pl"},{"start":5619440,"audio":0,"end":5620071,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Knda.pl"},{"start":5620071,"audio":0,"end":5620692,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Telu.pl"},{"start":5620692,"audio":0,"end":5623152,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Zyyy.pl"},{"start":5623152,"audio":0,"end":5623783,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Beng.pl"},{"start":5623783,"audio":0,"end":5624313,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Syrc.pl"},{"start":5624313,"audio":0,"end":5624890,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Geor.pl"},{"start":5624890,"audio":0,"end":5625453,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Mong.pl"},{"start":5625453,"audio":0,"end":5626024,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Mlym.pl"},{"start":5626024,"audio":0,"end":5626556,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Deva.pl"},{"start":5626556,"audio":0,"end":5627098,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Hira.pl"},{"start":5627098,"audio":0,"end":5627721,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Sinh.pl"},{"start":5627721,"audio":0,"end":5628272,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Mult.pl"},{"start":5628272,"audio":0,"end":5628847,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Linb.pl"},{"start":5628847,"audio":0,"end":5629504,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Hang.pl"},{"start":5629504,"audio":0,"end":5630135,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Orya.pl"},{"start":5630135,"audio":0,"end":5630926,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Zinh.pl"},{"start":5630926,"audio":0,"end":5631503,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Cyrl.pl"},{"start":5631503,"audio":0,"end":5632088,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Glag.pl"},{"start":5632088,"audio":0,"end":5632739,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Sc/Guru.pl"},{"start":5632739,"audio":0,"end":5634373,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CWCM/Y.pl"},{"start":5634373,"audio":0,"end":5635006,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/MN.pl"},{"start":5635006,"audio":0,"end":5635613,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/HL.pl"},{"start":5635613,"audio":0,"end":5639043,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/Extend.pl"},{"start":5639043,"audio":0,"end":5639720,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/FO.pl"},{"start":5639720,"audio":0,"end":5640283,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/EX.pl"},{"start":5640283,"audio":0,"end":5649312,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/XX.pl"},{"start":5649312,"audio":0,"end":5655531,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/LE.pl"},{"start":5655531,"audio":0,"end":5656132,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/KA.pl"},{"start":5656132,"audio":0,"end":5656701,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/ML.pl"},{"start":5656701,"audio":0,"end":5657793,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/NU.pl"},{"start":5657793,"audio":0,"end":5658346,"filename":"/opt/perl/lib/5.28.1/unicore/lib/WB/MB.pl"},{"start":5658346,"audio":0,"end":5658919,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/2_3.pl"},{"start":5658919,"audio":0,"end":5660685,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/4.pl"},{"start":5660685,"audio":0,"end":5662537,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/2.pl"},{"start":5662537,"audio":0,"end":5664105,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/8.pl"},{"start":5664105,"audio":0,"end":5664716,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/90.pl"},{"start":5664716,"audio":0,"end":5665339,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/60.pl"},{"start":5665339,"audio":0,"end":5666194,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/20.pl"},{"start":5666194,"audio":0,"end":5666817,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/70.pl"},{"start":5666817,"audio":0,"end":5667430,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1_4.pl"},{"start":5667430,"audio":0,"end":5668025,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/10000.pl"},{"start":5668025,"audio":0,"end":5668566,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/19.pl"},{"start":5668566,"audio":0,"end":5669177,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/80.pl"},{"start":5669177,"audio":0,"end":5669728,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/11.pl"},{"start":5669728,"audio":0,"end":5670415,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/40.pl"},{"start":5670415,"audio":0,"end":5671040,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1_2.pl"},{"start":5671040,"audio":0,"end":5671578,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/700.pl"},{"start":5671578,"audio":0,"end":5673428,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1.pl"},{"start":5673428,"audio":0,"end":5673966,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/200.pl"},{"start":5673966,"audio":0,"end":5674527,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1_3.pl"},{"start":5674527,"audio":0,"end":5675068,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/16.pl"},{"start":5675068,"audio":0,"end":5675598,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/14.pl"},{"start":5675598,"audio":0,"end":5676136,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/800.pl"},{"start":5676136,"audio":0,"end":5677742,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/7.pl"},{"start":5677742,"audio":0,"end":5678272,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/13.pl"},{"start":5678272,"audio":0,"end":5679912,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/6.pl"},{"start":5679912,"audio":0,"end":5681506,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/9.pl"},{"start":5681506,"audio":0,"end":5682279,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/50.pl"},{"start":5682279,"audio":0,"end":5682834,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1_8.pl"},{"start":5682834,"audio":0,"end":5683372,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/600.pl"},{"start":5683372,"audio":0,"end":5683923,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/900.pl"},{"start":5683923,"audio":0,"end":5684453,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/15.pl"},{"start":5684453,"audio":0,"end":5685018,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/3_4.pl"},{"start":5685018,"audio":0,"end":5685559,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/17.pl"},{"start":5685559,"audio":0,"end":5686110,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/300.pl"},{"start":5686110,"audio":0,"end":5686795,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/30.pl"},{"start":5686795,"audio":0,"end":5687356,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/5000.pl"},{"start":5687356,"audio":0,"end":5689190,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/3.pl"},{"start":5689190,"audio":0,"end":5689901,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1000.pl"},{"start":5689901,"audio":0,"end":5690439,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/400.pl"},{"start":5690439,"audio":0,"end":5690980,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/18.pl"},{"start":5690980,"audio":0,"end":5692056,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/10.pl"},{"start":5692056,"audio":0,"end":5692663,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/500.pl"},{"start":5692663,"audio":0,"end":5693212,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/50000.pl"},{"start":5693212,"audio":0,"end":5694520,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/0.pl"},{"start":5694520,"audio":0,"end":5695052,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/1_16.pl"},{"start":5695052,"audio":0,"end":5695584,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/3_16.pl"},{"start":5695584,"audio":0,"end":5697370,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/5.pl"},{"start":5697370,"audio":0,"end":5698211,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/100.pl"},{"start":5698211,"audio":0,"end":5698762,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nv/12.pl"},{"start":5698762,"audio":0,"end":5705289,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CWCF/Y.pl"},{"start":5705289,"audio":0,"end":5705980,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Cf.pl"},{"start":5705980,"audio":0,"end":5706753,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Sk.pl"},{"start":5706753,"audio":0,"end":5714746,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Cn.pl"},{"start":5714746,"audio":0,"end":5715303,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Zs.pl"},{"start":5715303,"audio":0,"end":5715932,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Nl.pl"},{"start":5715932,"audio":0,"end":5722825,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Lu.pl"},{"start":5722825,"audio":0,"end":5725802,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/S.pl"},{"start":5725802,"audio":0,"end":5727156,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Ps.pl"},{"start":5727156,"audio":0,"end":5730550,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/M.pl"},{"start":5730550,"audio":0,"end":5731742,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Sm.pl"},{"start":5731742,"audio":0,"end":5734084,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Po.pl"},{"start":5734084,"audio":0,"end":5735876,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/N.pl"},{"start":5735876,"audio":0,"end":5736980,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Lm.pl"},{"start":5736980,"audio":0,"end":5737647,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Sc.pl"},{"start":5737647,"audio":0,"end":5744731,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/L.pl"},{"start":5744731,"audio":0,"end":5745332,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Pf.pl"},{"start":5745332,"audio":0,"end":5747230,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/LC.pl"},{"start":5747230,"audio":0,"end":5752913,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Lo.pl"},{"start":5752913,"audio":0,"end":5753456,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Me.pl"},{"start":5753456,"audio":0,"end":5757272,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Mn.pl"},{"start":5757272,"audio":0,"end":5764237,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Ll.pl"},{"start":5764237,"audio":0,"end":5766599,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/P.pl"},{"start":5766599,"audio":0,"end":5767771,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/No.pl"},{"start":5767771,"audio":0,"end":5775780,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/C.pl"},{"start":5775780,"audio":0,"end":5777102,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Pe.pl"},{"start":5777102,"audio":0,"end":5777669,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Z.pl"},{"start":5777669,"audio":0,"end":5778280,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Pi.pl"},{"start":5778280,"audio":0,"end":5778959,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Pd.pl"},{"start":5778959,"audio":0,"end":5779512,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Pc.pl"},{"start":5779512,"audio":0,"end":5782023,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/So.pl"},{"start":5782023,"audio":0,"end":5784263,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Mc.pl"},{"start":5784263,"audio":0,"end":5785357,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Gc/Nd.pl"},{"start":5785357,"audio":0,"end":5792545,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlIDS.pl"},{"start":5792545,"audio":0,"end":5799701,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlCha.pl"},{"start":5799701,"audio":0,"end":5801415,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlAny.pl"},{"start":5801415,"audio":0,"end":5809459,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Graph.pl"},{"start":5809459,"audio":0,"end":5817773,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Word.pl"},{"start":5817773,"audio":0,"end":5818368,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlPro.pl"},{"start":5818368,"audio":0,"end":5826710,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlIDC.pl"},{"start":5826710,"audio":0,"end":5827483,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlFol.pl"},{"start":5827483,"audio":0,"end":5828045,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Blank.pl"},{"start":5828045,"audio":0,"end":5828628,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Title.pl"},{"start":5828628,"audio":0,"end":5829158,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlPat.pl"},{"start":5829158,"audio":0,"end":5837153,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Assigned.pl"},{"start":5837153,"audio":0,"end":5845445,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Alnum.pl"},{"start":5845445,"audio":0,"end":5853459,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/Print.pl"},{"start":5853459,"audio":0,"end":5854039,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/SpacePer.pl"},{"start":5854039,"audio":0,"end":5854920,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlQuo.pl"},{"start":5854920,"audio":0,"end":5863280,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlCh2.pl"},{"start":5863280,"audio":0,"end":5863795,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/PerlWord.pl"},{"start":5863795,"audio":0,"end":5864398,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlPr2.pl"},{"start":5864398,"audio":0,"end":5864914,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/PosixPun.pl"},{"start":5864914,"audio":0,"end":5867244,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/XPosixPu.pl"},{"start":5867244,"audio":0,"end":5867987,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Perl/_PerlNch.pl"},{"start":5867987,"audio":0,"end":5874388,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CWL/Y.pl"},{"start":5874388,"audio":0,"end":5879129,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/3_2.pl"},{"start":5879129,"audio":0,"end":5886795,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/8_0.pl"},{"start":5886795,"audio":0,"end":5891146,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/3_0.pl"},{"start":5891146,"audio":0,"end":5897408,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/6_0.pl"},{"start":5897408,"audio":0,"end":5905403,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/9_0.pl"},{"start":5905403,"audio":0,"end":5912163,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/6_3.pl"},{"start":5912163,"audio":0,"end":5915910,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/2_1.pl"},{"start":5915910,"audio":0,"end":5922670,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/6_1.pl"},{"start":5922670,"audio":0,"end":5927473,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/3_1.pl"},{"start":5927473,"audio":0,"end":5932644,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/4_1.pl"},{"start":5932644,"audio":0,"end":5937943,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/5_0.pl"},{"start":5937943,"audio":0,"end":5945459,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/7_0.pl"},{"start":5945459,"audio":0,"end":5953594,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/10_0.pl"},{"start":5953594,"audio":0,"end":5959597,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/5_2.pl"},{"start":5959597,"audio":0,"end":5963344,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/2_0.pl"},{"start":5963344,"audio":0,"end":5968269,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/4_0.pl"},{"start":5968269,"audio":0,"end":5975029,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/6_2.pl"},{"start":5975029,"audio":0,"end":5980520,"filename":"/opt/perl/lib/5.28.1/unicore/lib/In/5_1.pl"},{"start":5980520,"audio":0,"end":5981335,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ext/Y.pl"},{"start":5981335,"audio":0,"end":5983554,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ea/A.pl"},{"start":5983554,"audio":0,"end":5985333,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ea/W.pl"},{"start":5985333,"audio":0,"end":5988666,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ea/N.pl"},{"start":5988666,"audio":0,"end":5989239,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ea/H.pl"},{"start":5989239,"audio":0,"end":5989793,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ea/Na.pl"},{"start":5989793,"audio":0,"end":5990408,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/EN.pl"},{"start":5990408,"audio":0,"end":5991271,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/R.pl"},{"start":5991271,"audio":0,"end":5991826,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/WS.pl"},{"start":5991826,"audio":0,"end":5997172,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/L.pl"},{"start":5997172,"audio":0,"end":5997791,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/CS.pl"},{"start":5997791,"audio":0,"end":5998674,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/BN.pl"},{"start":5998674,"audio":0,"end":6001155,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/ON.pl"},{"start":6001155,"audio":0,"end":6004919,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/NSM.pl"},{"start":6004919,"audio":0,"end":6005472,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/AN.pl"},{"start":6005472,"audio":0,"end":6005999,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/B.pl"},{"start":6005999,"audio":0,"end":6006580,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/ES.pl"},{"start":6006580,"audio":0,"end":6007295,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/ET.pl"},{"start":6007295,"audio":0,"end":6008014,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bc/AL.pl"},{"start":6008014,"audio":0,"end":6008941,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/Left.pl"},{"start":6008941,"audio":0,"end":6009473,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/TopAndL2.pl"},{"start":6009473,"audio":0,"end":6010040,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/VisualOr.pl"},{"start":6010040,"audio":0,"end":6012436,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/Top.pl"},{"start":6012436,"audio":0,"end":6012970,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/Overstru.pl"},{"start":6012970,"audio":0,"end":6013599,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/LeftAndR.pl"},{"start":6013599,"audio":0,"end":6016143,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/NA.pl"},{"start":6016143,"audio":0,"end":6018267,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/Right.pl"},{"start":6018267,"audio":0,"end":6020195,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/Bottom.pl"},{"start":6020195,"audio":0,"end":6020780,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/TopAndRi.pl"},{"start":6020780,"audio":0,"end":6021333,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/TopAndBo.pl"},{"start":6021333,"audio":0,"end":6021888,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InPC/TopAndLe.pl"},{"start":6021888,"audio":0,"end":6022509,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/QU.pl"},{"start":6022509,"audio":0,"end":6023963,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/CL.pl"},{"start":6023963,"audio":0,"end":6024558,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/GL.pl"},{"start":6024558,"audio":0,"end":6025485,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/SA.pl"},{"start":6025485,"audio":0,"end":6026188,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/PR.pl"},{"start":6026188,"audio":0,"end":6026935,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/EX.pl"},{"start":6026935,"audio":0,"end":6034361,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/XX.pl"},{"start":6034361,"audio":0,"end":6035817,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/OP.pl"},{"start":6035817,"audio":0,"end":6038308,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/ID.pl"},{"start":6038308,"audio":0,"end":6038999,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/NS.pl"},{"start":6038999,"audio":0,"end":6039692,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/PO.pl"},{"start":6039692,"audio":0,"end":6040226,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/IN.pl"},{"start":6040226,"audio":0,"end":6041017,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/CJ.pl"},{"start":6041017,"audio":0,"end":6042599,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/AI.pl"},{"start":6042599,"audio":0,"end":6044120,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/BA.pl"},{"start":6044120,"audio":0,"end":6047372,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/CM.pl"},{"start":6047372,"audio":0,"end":6048299,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/EB.pl"},{"start":6048299,"audio":0,"end":6048880,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/IS.pl"},{"start":6048880,"audio":0,"end":6057446,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/AL.pl"},{"start":6057446,"audio":0,"end":6058159,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lb/BB.pl"},{"start":6058159,"audio":0,"end":6058710,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Hst/NA.pl"},{"start":6058710,"audio":0,"end":6059888,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bpt/O.pl"},{"start":6059888,"audio":0,"end":6060689,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bpt/N.pl"},{"start":6060689,"audio":0,"end":6061867,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Bpt/C.pl"},{"start":6061867,"audio":0,"end":6062462,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Hyphen/T.pl"},{"start":6062462,"audio":0,"end":6063913,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Vo/R.pl"},{"start":6063913,"audio":0,"end":6064570,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Vo/Tr.pl"},{"start":6064570,"audio":0,"end":6066487,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Vo/U.pl"},{"start":6066487,"audio":0,"end":6067388,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Vo/Tu.pl"},{"start":6067388,"audio":0,"end":6068107,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dash/Y.pl"},{"start":6068107,"audio":0,"end":6069825,"filename":"/opt/perl/lib/5.28.1/unicore/lib/BidiM/Y.pl"},{"start":6069825,"audio":0,"end":6070371,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Hex/Y.pl"},{"start":6070371,"audio":0,"end":6079910,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GrBase/Y.pl"},{"start":6079910,"audio":0,"end":6080658,"filename":"/opt/perl/lib/5.28.1/unicore/lib/PatSyn/Y.pl"},{"start":6080658,"audio":0,"end":6081358,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ideo/Y.pl"},{"start":6081358,"audio":0,"end":6082451,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Blk/NB.pl"},{"start":6082451,"audio":0,"end":6085337,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFDQC/N.pl"},{"start":6085337,"audio":0,"end":6088225,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFDQC/Y.pl"},{"start":6088225,"audio":0,"end":6089188,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/CL.pl"},{"start":6089188,"audio":0,"end":6089875,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/FO.pl"},{"start":6089875,"audio":0,"end":6093305,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/EX.pl"},{"start":6093305,"audio":0,"end":6102364,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/XX.pl"},{"start":6102364,"audio":0,"end":6108291,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/LE.pl"},{"start":6108291,"audio":0,"end":6115276,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/UP.pl"},{"start":6115276,"audio":0,"end":6115971,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/SC.pl"},{"start":6115971,"audio":0,"end":6117063,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/NU.pl"},{"start":6117063,"audio":0,"end":6118285,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/ST.pl"},{"start":6118285,"audio":0,"end":6118815,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/AT.pl"},{"start":6118815,"audio":0,"end":6119383,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/Sp.pl"},{"start":6119383,"audio":0,"end":6126398,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SB/LO.pl"},{"start":6126398,"audio":0,"end":6127241,"filename":"/opt/perl/lib/5.28.1/unicore/lib/SD/Y.pl"},{"start":6127241,"audio":0,"end":6129931,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nt/None.pl"},{"start":6129931,"audio":0,"end":6130634,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nt/Di.pl"},{"start":6130634,"audio":0,"end":6132806,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Nt/Nu.pl"},{"start":6132806,"audio":0,"end":6139829,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Lower/Y.pl"},{"start":6139829,"audio":0,"end":6140392,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Nar.pl"},{"start":6140392,"audio":0,"end":6143050,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/NonCanon.pl"},{"start":6143050,"audio":0,"end":6144718,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Iso.pl"},{"start":6144718,"audio":0,"end":6145858,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Med.pl"},{"start":6145858,"audio":0,"end":6147108,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Com.pl"},{"start":6147108,"audio":0,"end":6148956,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Fin.pl"},{"start":6148956,"audio":0,"end":6149543,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Enc.pl"},{"start":6149543,"audio":0,"end":6150282,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Sup.pl"},{"start":6150282,"audio":0,"end":6151674,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Init.pl"},{"start":6151674,"audio":0,"end":6153054,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Font.pl"},{"start":6153054,"audio":0,"end":6153593,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Nb.pl"},{"start":6153593,"audio":0,"end":6154144,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Vert.pl"},{"start":6154144,"audio":0,"end":6154751,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Sqr.pl"},{"start":6154751,"audio":0,"end":6155283,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dt/Sub.pl"},{"start":6155283,"audio":0,"end":6156178,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFCQC/M.pl"},{"start":6156178,"audio":0,"end":6157820,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFCQC/Y.pl"},{"start":6157820,"audio":0,"end":6158431,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/OV.pl"},{"start":6158431,"audio":0,"end":6160087,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/A.pl"},{"start":6160087,"audio":0,"end":6161112,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/VR.pl"},{"start":6161112,"audio":0,"end":6161636,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/DB.pl"},{"start":6161636,"audio":0,"end":6162168,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/BR.pl"},{"start":6162168,"audio":0,"end":6162705,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/AR.pl"},{"start":6162705,"audio":0,"end":6163241,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/ATAR.pl"},{"start":6163241,"audio":0,"end":6165591,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/NR.pl"},{"start":6165591,"audio":0,"end":6166340,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/NK.pl"},{"start":6166340,"audio":0,"end":6167562,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/B.pl"},{"start":6167562,"audio":0,"end":6168094,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Ccc/AL.pl"},{"start":6168094,"audio":0,"end":6168695,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/PP.pl"},{"start":6168695,"audio":0,"end":6169385,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/CN.pl"},{"start":6169385,"audio":0,"end":6174665,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/LVT.pl"},{"start":6174665,"audio":0,"end":6178685,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/EX.pl"},{"start":6178685,"audio":0,"end":6183e3,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/XX.pl"},{"start":6183e3,"audio":0,"end":6183753,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/GAZ.pl"},{"start":6183753,"audio":0,"end":6189033,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/LV.pl"},{"start":6189033,"audio":0,"end":6191117,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/SM.pl"},{"start":6191117,"audio":0,"end":6192030,"filename":"/opt/perl/lib/5.28.1/unicore/lib/GCB/EB.pl"},{"start":6192030,"audio":0,"end":6194124,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Math/Y.pl"},{"start":6194124,"audio":0,"end":6196110,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Cased/Y.pl"},{"start":6196110,"audio":0,"end":6196789,"filename":"/opt/perl/lib/5.28.1/unicore/lib/DI/Y.pl"},{"start":6196789,"audio":0,"end":6197332,"filename":"/opt/perl/lib/5.28.1/unicore/lib/PCM/Y.pl"},{"start":6197332,"audio":0,"end":6197943,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Consona3.pl"},{"start":6197943,"audio":0,"end":6200035,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Consonan.pl"},{"start":6200035,"audio":0,"end":6201373,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/VowelInd.pl"},{"start":6201373,"audio":0,"end":6202024,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/ToneMark.pl"},{"start":6202024,"audio":0,"end":6202567,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Consona6.pl"},{"start":6202567,"audio":0,"end":6203170,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Invisibl.pl"},{"start":6203170,"audio":0,"end":6203927,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Nukta.pl"},{"start":6203927,"audio":0,"end":6204882,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Number.pl"},{"start":6204882,"audio":0,"end":6205533,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Syllable.pl"},{"start":6205533,"audio":0,"end":6206154,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Consona2.pl"},{"start":6206154,"audio":0,"end":6206753,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Cantilla.pl"},{"start":6206753,"audio":0,"end":6207774,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Bindu.pl"},{"start":6207774,"audio":0,"end":6211508,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Other.pl"},{"start":6211508,"audio":0,"end":6212139,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Consona4.pl"},{"start":6212139,"audio":0,"end":6212896,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Virama.pl"},{"start":6212896,"audio":0,"end":6213445,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Vowel.pl"},{"start":6213445,"audio":0,"end":6215203,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/VowelDep.pl"},{"start":6215203,"audio":0,"end":6215854,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Avagraha.pl"},{"start":6215854,"audio":0,"end":6216551,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/PureKill.pl"},{"start":6216551,"audio":0,"end":6217150,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Consona5.pl"},{"start":6217150,"audio":0,"end":6218007,"filename":"/opt/perl/lib/5.28.1/unicore/lib/InSC/Visarga.pl"},{"start":6218007,"audio":0,"end":6219059,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jt/R.pl"},{"start":6219059,"audio":0,"end":6223229,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jt/U.pl"},{"start":6223229,"audio":0,"end":6224341,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jt/D.pl"},{"start":6224341,"audio":0,"end":6224871,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jt/C.pl"},{"start":6224871,"audio":0,"end":6228823,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jt/T.pl"},{"start":6228823,"audio":0,"end":6235911,"filename":"/opt/perl/lib/5.28.1/unicore/lib/IDS/Y.pl"},{"start":6235911,"audio":0,"end":6240579,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CI/Y.pl"},{"start":6240579,"audio":0,"end":6249610,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CWKCF/Y.pl"},{"start":6249610,"audio":0,"end":6256171,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CWT/Y.pl"},{"start":6256171,"audio":0,"end":6258377,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dia/Y.pl"},{"start":6258377,"audio":0,"end":6259935,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Term/Y.pl"},{"start":6259935,"audio":0,"end":6261187,"filename":"/opt/perl/lib/5.28.1/unicore/lib/STerm/Y.pl"},{"start":6261187,"audio":0,"end":6269093,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Alpha/Y.pl"},{"start":6269093,"audio":0,"end":6269654,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Seen.pl"},{"start":6269654,"audio":0,"end":6270235,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Reh.pl"},{"start":6270235,"audio":0,"end":6270796,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Waw.pl"},{"start":6270796,"audio":0,"end":6271337,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Dal.pl"},{"start":6271337,"audio":0,"end":6271867,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/FarsiYeh.pl"},{"start":6271867,"audio":0,"end":6272438,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Yeh.pl"},{"start":6272438,"audio":0,"end":6272968,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Kaf.pl"},{"start":6272968,"audio":0,"end":6273498,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Qaf.pl"},{"start":6273498,"audio":0,"end":6274028,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Sad.pl"},{"start":6274028,"audio":0,"end":6274558,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Feh.pl"},{"start":6274558,"audio":0,"end":6275129,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Hah.pl"},{"start":6275129,"audio":0,"end":6275690,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Beh.pl"},{"start":6275690,"audio":0,"end":6276231,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Ain.pl"},{"start":6276231,"audio":0,"end":6276966,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/NoJoinin.pl"},{"start":6276966,"audio":0,"end":6277496,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Lam.pl"},{"start":6277496,"audio":0,"end":6278047,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Alef.pl"},{"start":6278047,"audio":0,"end":6278598,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Jg/Gaf.pl"},{"start":6278598,"audio":0,"end":6279197,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Cprt.pl"},{"start":6279197,"audio":0,"end":6280059,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Latn.pl"},{"start":6280059,"audio":0,"end":6280595,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Phlp.pl"},{"start":6280595,"audio":0,"end":6281125,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Tagb.pl"},{"start":6281125,"audio":0,"end":6281700,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Yi.pl"},{"start":6281700,"audio":0,"end":6282238,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Bhks.pl"},{"start":6282238,"audio":0,"end":6283095,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Grek.pl"},{"start":6283095,"audio":0,"end":6283986,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Han.pl"},{"start":6283986,"audio":0,"end":6284649,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Gujr.pl"},{"start":6284649,"audio":0,"end":6285179,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Khmr.pl"},{"start":6285179,"audio":0,"end":6285730,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Hmng.pl"},{"start":6285730,"audio":0,"end":6286291,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Tibt.pl"},{"start":6286291,"audio":0,"end":6287062,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Gran.pl"},{"start":6287062,"audio":0,"end":6288228,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Arab.pl"},{"start":6288228,"audio":0,"end":6288957,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Taml.pl"},{"start":6288957,"audio":0,"end":6289495,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Xsux.pl"},{"start":6289495,"audio":0,"end":6290048,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Armn.pl"},{"start":6290048,"audio":0,"end":6290623,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Gonm.pl"},{"start":6290623,"audio":0,"end":6291184,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Dupl.pl"},{"start":6291184,"audio":0,"end":6291735,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Limb.pl"},{"start":6291735,"audio":0,"end":6292396,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Kana.pl"},{"start":6292396,"audio":0,"end":6293079,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Knda.pl"},{"start":6293079,"audio":0,"end":6293644,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Shrd.pl"},{"start":6293644,"audio":0,"end":6294295,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Telu.pl"},{"start":6294295,"audio":0,"end":6296467,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Zyyy.pl"},{"start":6296467,"audio":0,"end":6297140,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Beng.pl"},{"start":6297140,"audio":0,"end":6297731,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Syrc.pl"},{"start":6297731,"audio":0,"end":6298570,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Ethi.pl"},{"start":6298570,"audio":0,"end":6299106,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Tirh.pl"},{"start":6299106,"audio":0,"end":6299640,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Cakm.pl"},{"start":6299640,"audio":0,"end":6307602,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Zzzz.pl"},{"start":6307602,"audio":0,"end":6308167,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Thaa.pl"},{"start":6308167,"audio":0,"end":6308744,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Geor.pl"},{"start":6308744,"audio":0,"end":6309282,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Lina.pl"},{"start":6309282,"audio":0,"end":6309875,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Hebr.pl"},{"start":6309875,"audio":0,"end":6310506,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Bopo.pl"},{"start":6310506,"audio":0,"end":6311047,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Lana.pl"},{"start":6311047,"audio":0,"end":6311590,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Mong.pl"},{"start":6311590,"audio":0,"end":6312177,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Khar.pl"},{"start":6312177,"audio":0,"end":6312778,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Mlym.pl"},{"start":6312778,"audio":0,"end":6313333,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Deva.pl"},{"start":6313333,"audio":0,"end":6314008,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Hira.pl"},{"start":6314008,"audio":0,"end":6314546,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Cham.pl"},{"start":6314546,"audio":0,"end":6315082,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Takr.pl"},{"start":6315082,"audio":0,"end":6315715,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Sinh.pl"},{"start":6315715,"audio":0,"end":6316276,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Mult.pl"},{"start":6316276,"audio":0,"end":6316806,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Talu.pl"},{"start":6316806,"audio":0,"end":6317342,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Sind.pl"},{"start":6317342,"audio":0,"end":6317877,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Copt.pl"},{"start":6317877,"audio":0,"end":6318488,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Linb.pl"},{"start":6318488,"audio":0,"end":6319030,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Adlm.pl"},{"start":6319030,"audio":0,"end":6319771,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Hang.pl"},{"start":6319771,"audio":0,"end":6320422,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Orya.pl"},{"start":6320422,"audio":0,"end":6320958,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Mymr.pl"},{"start":6320958,"audio":0,"end":6321629,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Zinh.pl"},{"start":6321629,"audio":0,"end":6322208,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Cyrl.pl"},{"start":6322208,"audio":0,"end":6322837,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Glag.pl"},{"start":6322837,"audio":0,"end":6323520,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Guru.pl"},{"start":6323520,"audio":0,"end":6324191,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Scx/Lao.pl"},{"start":6324191,"audio":0,"end":6325451,"filename":"/opt/perl/lib/5.28.1/unicore/lib/CompEx/Y.pl"},{"start":6325451,"audio":0,"end":6328773,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFKCQC/N.pl"},{"start":6328773,"audio":0,"end":6332465,"filename":"/opt/perl/lib/5.28.1/unicore/lib/NFKCQC/Y.pl"},{"start":6332465,"audio":0,"end":6333038,"filename":"/opt/perl/lib/5.28.1/unicore/lib/Dep/Y.pl"},{"start":6333038,"audio":0,"end":6341004,"filename":"/opt/perl/lib/5.28.1/IO/Zlib.pm"},{"start":6341004,"audio":0,"end":6343829,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Bzip2.pm"},{"start":6343829,"audio":0,"end":6351577,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Gzip.pm"},{"start":6351577,"audio":0,"end":6374133,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Base.pm"},{"start":6374133,"audio":0,"end":6401623,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Zip.pm"},{"start":6401623,"audio":0,"end":6406831,"filename":"/opt/perl/lib/5.28.1/IO/Compress/RawDeflate.pm"},{"start":6406831,"audio":0,"end":6410158,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Deflate.pm"},{"start":6410158,"audio":0,"end":6414061,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Gzip/Constants.pm"},{"start":6414061,"audio":0,"end":6417909,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Zip/Constants.pm"},{"start":6417909,"audio":0,"end":6419567,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Zlib/Constants.pm"},{"start":6419567,"audio":0,"end":6425278,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Zlib/Extra.pm"},{"start":6425278,"audio":0,"end":6427874,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Adapter/Bzip2.pm"},{"start":6427874,"audio":0,"end":6429312,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Adapter/Identity.pm"},{"start":6429312,"audio":0,"end":6432456,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Adapter/Deflate.pm"},{"start":6432456,"audio":0,"end":6455555,"filename":"/opt/perl/lib/5.28.1/IO/Compress/Base/Common.pm"},{"start":6455555,"audio":0,"end":6460375,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Inflate.pm"},{"start":6460375,"audio":0,"end":6467785,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Gunzip.pm"},{"start":6467785,"audio":0,"end":6473454,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/AnyUncompress.pm"},{"start":6473454,"audio":0,"end":6502528,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Unzip.pm"},{"start":6502528,"audio":0,"end":6505159,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Bunzip2.pm"},{"start":6505159,"audio":0,"end":6541974,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Base.pm"},{"start":6541974,"audio":0,"end":6550675,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/RawInflate.pm"},{"start":6550675,"audio":0,"end":6553265,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/AnyInflate.pm"},{"start":6553265,"audio":0,"end":6556544,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Adapter/Inflate.pm"},{"start":6556544,"audio":0,"end":6558586,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Adapter/Bunzip2.pm"},{"start":6558586,"audio":0,"end":6563169,"filename":"/opt/perl/lib/5.28.1/IO/Uncompress/Adapter/Identity.pm"},{"start":6563169,"audio":0,"end":6584445,"filename":"/opt/perl/lib/5.28.1/IO/Socket/IP.pm"},{"start":6584445,"audio":0,"end":6614830,"filename":"/opt/perl/lib/5.28.1/Locale/Maketext.pm"},{"start":6614830,"audio":0,"end":6639474,"filename":"/opt/perl/lib/5.28.1/Locale/Codes.pm"},{"start":6639474,"audio":0,"end":6641379,"filename":"/opt/perl/lib/5.28.1/Locale/Currency.pm"},{"start":6641379,"audio":0,"end":6643242,"filename":"/opt/perl/lib/5.28.1/Locale/Script.pm"},{"start":6643242,"audio":0,"end":6645126,"filename":"/opt/perl/lib/5.28.1/Locale/Country.pm"},{"start":6645126,"audio":0,"end":6647031,"filename":"/opt/perl/lib/5.28.1/Locale/Language.pm"},{"start":6647031,"audio":0,"end":6648922,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangVar.pm"},{"start":6648922,"audio":0,"end":6649653,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangExt_Retired.pm"},{"start":6649653,"audio":0,"end":6653211,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Script_Retired.pm"},{"start":6653211,"audio":0,"end":6682183,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Country_Retired.pm"},{"start":6682183,"audio":0,"end":6688488,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Constants.pm"},{"start":6688488,"audio":0,"end":6708649,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Language_Retired.pm"},{"start":6708649,"audio":0,"end":6966449,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Country_Codes.pm"},{"start":6966449,"audio":0,"end":6968361,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Currency.pm"},{"start":6968361,"audio":0,"end":8572579,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Language_Codes.pm"},{"start":8572579,"audio":0,"end":8597467,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangFam_Codes.pm"},{"start":8597467,"audio":0,"end":8599337,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Script.pm"},{"start":8599337,"audio":0,"end":8650331,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Currency_Codes.pm"},{"start":8650331,"audio":0,"end":8701481,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangExt_Codes.pm"},{"start":8701481,"audio":0,"end":8703372,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Country.pm"},{"start":8703372,"audio":0,"end":8726450,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangVar_Codes.pm"},{"start":8726450,"audio":0,"end":8790972,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Script_Codes.pm"},{"start":8790972,"audio":0,"end":8791844,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangVar_Retired.pm"},{"start":8791844,"audio":0,"end":8793735,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangFam.pm"},{"start":8793735,"audio":0,"end":8794148,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangFam_Retired.pm"},{"start":8794148,"audio":0,"end":8796039,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/LangExt.pm"},{"start":8796039,"audio":0,"end":8797951,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Language.pm"},{"start":8797951,"audio":0,"end":8806087,"filename":"/opt/perl/lib/5.28.1/Locale/Codes/Currency_Retired.pm"},{"start":8806087,"audio":0,"end":8810938,"filename":"/opt/perl/lib/5.28.1/Locale/Maketext/Simple.pm"},{"start":8810938,"audio":0,"end":8811059,"filename":"/opt/perl/lib/5.28.1/Locale/Maketext/GutsLoader.pm"},{"start":8811059,"audio":0,"end":8811143,"filename":"/opt/perl/lib/5.28.1/Locale/Maketext/Guts.pm"},{"start":8811143,"audio":0,"end":8815215,"filename":"/opt/perl/lib/5.28.1/version/regex.pm"},{"start":8815215,"audio":0,"end":8820551,"filename":"/opt/perl/lib/5.28.1/Math/Trig.pm"},{"start":8820551,"audio":0,"end":8953191,"filename":"/opt/perl/lib/5.28.1/Math/BigInt.pm"},{"start":8953191,"audio":0,"end":8986107,"filename":"/opt/perl/lib/5.28.1/Math/Complex.pm"},{"start":8986107,"audio":0,"end":9049744,"filename":"/opt/perl/lib/5.28.1/Math/BigRat.pm"},{"start":9049744,"audio":0,"end":9204269,"filename":"/opt/perl/lib/5.28.1/Math/BigFloat.pm"},{"start":9204269,"audio":0,"end":9205538,"filename":"/opt/perl/lib/5.28.1/Math/BigFloat/Trace.pm"},{"start":9205538,"audio":0,"end":9247910,"filename":"/opt/perl/lib/5.28.1/Math/BigInt/Lib.pm"},{"start":9247910,"audio":0,"end":9323640,"filename":"/opt/perl/lib/5.28.1/Math/BigInt/Calc.pm"},{"start":9323640,"audio":0,"end":9331477,"filename":"/opt/perl/lib/5.28.1/Math/BigInt/CalcEmu.pm"},{"start":9331477,"audio":0,"end":9332468,"filename":"/opt/perl/lib/5.28.1/Math/BigInt/Trace.pm"},{"start":9332468,"audio":0,"end":9338875,"filename":"/opt/perl/lib/5.28.1/Exporter/Heavy.pm"},{"start":9338875,"audio":0,"end":9340749,"filename":"/opt/perl/lib/5.28.1/encoding/warnings.pm"},{"start":9340749,"audio":0,"end":9342037,"filename":"/opt/perl/lib/5.28.1/Module/Loaded.pm"},{"start":9342037,"audio":0,"end":10149968,"filename":"/opt/perl/lib/5.28.1/Module/CoreList.pm"},{"start":10149968,"audio":0,"end":10174052,"filename":"/opt/perl/lib/5.28.1/Module/Metadata.pm"},{"start":10174052,"audio":0,"end":10177275,"filename":"/opt/perl/lib/5.28.1/Module/Load.pm"},{"start":10177275,"audio":0,"end":10188491,"filename":"/opt/perl/lib/5.28.1/Module/Load/Conditional.pm"},{"start":10188491,"audio":0,"end":10214738,"filename":"/opt/perl/lib/5.28.1/Module/CoreList/Utils.pm"},{"start":10214738,"audio":0,"end":10217807,"filename":"/opt/perl/lib/5.28.1/wasm/attributes.pm"},{"start":10217807,"audio":0,"end":10259333,"filename":"/opt/perl/lib/5.28.1/wasm/Config_heavy.pl"},{"start":10259333,"audio":0,"end":10259803,"filename":"/opt/perl/lib/5.28.1/wasm/IO.pm"},{"start":10259803,"audio":0,"end":10267089,"filename":"/opt/perl/lib/5.28.1/wasm/encoding.pm"},{"start":10267089,"audio":0,"end":10280380,"filename":"/opt/perl/lib/5.28.1/wasm/WebPerl.pm"},{"start":10280380,"audio":0,"end":10288443,"filename":"/opt/perl/lib/5.28.1/wasm/B.pm"},{"start":10288443,"audio":0,"end":10305966,"filename":"/opt/perl/lib/5.28.1/wasm/Cwd.pm"},{"start":10305966,"audio":0,"end":10306203,"filename":"/opt/perl/lib/5.28.1/wasm/SDBM_File.pm"},{"start":10306203,"audio":0,"end":10307973,"filename":"/opt/perl/lib/5.28.1/wasm/Opcode.pm"},{"start":10307973,"audio":0,"end":10310130,"filename":"/opt/perl/lib/5.28.1/wasm/Fcntl.pm"},{"start":10310130,"audio":0,"end":10310561,"filename":"/opt/perl/lib/5.28.1/wasm/ops.pm"},{"start":10310561,"audio":0,"end":10311824,"filename":"/opt/perl/lib/5.28.1/wasm/O.pm"},{"start":10311824,"audio":0,"end":10325697,"filename":"/opt/perl/lib/5.28.1/wasm/Socket.pm"},{"start":10325697,"audio":0,"end":10326434,"filename":"/opt/perl/lib/5.28.1/wasm/Config_git.pl"},{"start":10326434,"audio":0,"end":10328720,"filename":"/opt/perl/lib/5.28.1/wasm/lib.pm"},{"start":10328720,"audio":0,"end":10349067,"filename":"/opt/perl/lib/5.28.1/wasm/POSIX.pm"},{"start":10349067,"audio":0,"end":10360219,"filename":"/opt/perl/lib/5.28.1/wasm/DynaLoader.pm"},{"start":10360219,"audio":0,"end":10365346,"filename":"/opt/perl/lib/5.28.1/wasm/Errno.pm"},{"start":10365346,"audio":0,"end":10375750,"filename":"/opt/perl/lib/5.28.1/wasm/Encode.pm"},{"start":10375750,"audio":0,"end":10376596,"filename":"/opt/perl/lib/5.28.1/wasm/mro.pm"},{"start":10376596,"audio":0,"end":10385298,"filename":"/opt/perl/lib/5.28.1/wasm/re.pm"},{"start":10385298,"audio":0,"end":10389116,"filename":"/opt/perl/lib/5.28.1/wasm/Config.pm"},{"start":10389116,"audio":0,"end":10390538,"filename":"/opt/perl/lib/5.28.1/wasm/Scalar/Util.pm"},{"start":10390538,"audio":0,"end":10390702,"filename":"/opt/perl/lib/5.28.1/wasm/Tie/Hash/NamedCapture.pm"},{"start":10390702,"audio":0,"end":10391323,"filename":"/opt/perl/lib/5.28.1/wasm/Sub/Util.pm"},{"start":10391323,"audio":0,"end":10392630,"filename":"/opt/perl/lib/5.28.1/wasm/B/Terse.pm"},{"start":10392630,"audio":0,"end":10401243,"filename":"/opt/perl/lib/5.28.1/wasm/B/Xref.pm"},{"start":10401243,"audio":0,"end":10404683,"filename":"/opt/perl/lib/5.28.1/wasm/B/Showlex.pm"},{"start":10404683,"audio":0,"end":10439962,"filename":"/opt/perl/lib/5.28.1/wasm/B/Concise.pm"},{"start":10439962,"audio":0,"end":10442764,"filename":"/opt/perl/lib/5.28.1/wasm/Time/HiRes.pm"},{"start":10442764,"audio":0,"end":10446205,"filename":"/opt/perl/lib/5.28.1/wasm/Time/Seconds.pm"},{"start":10446205,"audio":0,"end":10466980,"filename":"/opt/perl/lib/5.28.1/wasm/Time/Piece.pm"},{"start":10466980,"audio":0,"end":10468155,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Unicode.pm"},{"start":10468155,"audio":0,"end":10468383,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Symbol.pm"},{"start":10468383,"audio":0,"end":10478853,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/GSM0338.pm"},{"start":10478853,"audio":0,"end":10481284,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Encoder.pm"},{"start":10481284,"audio":0,"end":10486364,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Guess.pm"},{"start":10486364,"audio":0,"end":10487959,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/CJKConstants.pm"},{"start":10487959,"audio":0,"end":10497632,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Alias.pm"},{"start":10497632,"audio":0,"end":10497858,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Byte.pm"},{"start":10497858,"audio":0,"end":10499364,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Encoding.pm"},{"start":10499364,"audio":0,"end":10505366,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Config.pm"},{"start":10505366,"audio":0,"end":10509559,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/JP/JIS7.pm"},{"start":10509559,"audio":0,"end":10514623,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/JP/H2Z.pm"},{"start":10514623,"audio":0,"end":10517262,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/Unicode/UTF7.pm"},{"start":10517262,"audio":0,"end":10519167,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/KR/2022_KR.pm"},{"start":10519167,"audio":0,"end":10525184,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/CN/HZ.pm"},{"start":10525184,"audio":0,"end":10536270,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/MIME/Header.pm"},{"start":10536270,"audio":0,"end":10539989,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/MIME/Name.pm"},{"start":10539989,"audio":0,"end":10543189,"filename":"/opt/perl/lib/5.28.1/wasm/Encode/MIME/Header/ISO_2022_JP.pm"},{"start":10543189,"audio":0,"end":10543918,"filename":"/opt/perl/lib/5.28.1/wasm/I18N/Langinfo.pm"},{"start":10543918,"audio":0,"end":10544289,"filename":"/opt/perl/lib/5.28.1/wasm/PerlIO/encoding.pm"},{"start":10544289,"audio":0,"end":10544381,"filename":"/opt/perl/lib/5.28.1/wasm/PerlIO/via.pm"},{"start":10544381,"audio":0,"end":10544476,"filename":"/opt/perl/lib/5.28.1/wasm/PerlIO/scalar.pm"},{"start":10544476,"audio":0,"end":10546389,"filename":"/opt/perl/lib/5.28.1/wasm/Devel/Peek.pm"},{"start":10546389,"audio":0,"end":10549539,"filename":"/opt/perl/lib/5.28.1/wasm/Unicode/Normalize.pm"},{"start":10549539,"audio":0,"end":10552142,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Poll.pm"},{"start":10552142,"audio":0,"end":10552785,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Seekable.pm"},{"start":10552785,"audio":0,"end":10554422,"filename":"/opt/perl/lib/5.28.1/wasm/IO/File.pm"},{"start":10554422,"audio":0,"end":10563858,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Socket.pm"},{"start":10563858,"audio":0,"end":10568198,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Select.pm"},{"start":10568198,"audio":0,"end":10576402,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Handle.pm"},{"start":10576402,"audio":0,"end":10579816,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Pipe.pm"},{"start":10579816,"audio":0,"end":10582520,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Dir.pm"},{"start":10582520,"audio":0,"end":10583856,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Socket/UNIX.pm"},{"start":10583856,"audio":0,"end":10591318,"filename":"/opt/perl/lib/5.28.1/wasm/IO/Socket/INET.pm"},{"start":10591318,"audio":0,"end":10599590,"filename":"/opt/perl/lib/5.28.1/wasm/Hash/Util.pm"},{"start":10599590,"audio":0,"end":10600708,"filename":"/opt/perl/lib/5.28.1/wasm/List/Util.pm"},{"start":10600708,"audio":0,"end":10600862,"filename":"/opt/perl/lib/5.28.1/wasm/List/Util/XS.pm"},{"start":10600862,"audio":0,"end":10625148,"filename":"/opt/perl/lib/5.28.1/wasm/Data/Dumper.pm"},{"start":10625148,"audio":0,"end":10627983,"filename":"/opt/perl/lib/5.28.1/wasm/Cpanel/JSON/XS.pm"},{"start":10627983,"audio":0,"end":10630848,"filename":"/opt/perl/lib/5.28.1/wasm/Cpanel/JSON/XS/Type.pm"},{"start":10630848,"audio":0,"end":10630880,"filename":"/opt/perl/lib/5.28.1/wasm/Cpanel/JSON/XS/Boolean.pm"},{"start":10630880,"audio":0,"end":10631437,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec.pm"},{"start":10631437,"audio":0,"end":10633482,"filename":"/opt/perl/lib/5.28.1/wasm/File/Glob.pm"},{"start":10633482,"audio":0,"end":10641075,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/Win32.pm"},{"start":10641075,"audio":0,"end":10643189,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/Cygwin.pm"},{"start":10643189,"audio":0,"end":10655989,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/VMS.pm"},{"start":10655989,"audio":0,"end":10657092,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/Functions.pm"},{"start":10657092,"audio":0,"end":10657736,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/Epoc.pm"},{"start":10657736,"audio":0,"end":10658194,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/AmigaOS.pm"},{"start":10658194,"audio":0,"end":10666276,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/Mac.pm"},{"start":10666276,"audio":0,"end":10672266,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/OS2.pm"},{"start":10672266,"audio":0,"end":10681588,"filename":"/opt/perl/lib/5.28.1/wasm/File/Spec/Unix.pm"},{"start":10681588,"audio":0,"end":10687071,"filename":"/opt/perl/lib/5.28.1/wasm/Digest/SHA.pm"},{"start":10687071,"audio":0,"end":10687808,"filename":"/opt/perl/lib/5.28.1/wasm/Digest/MD5.pm"},{"start":10687808,"audio":0,"end":10710198,"filename":"/opt/perl/lib/5.28.1/CPAN/Module.pm"},{"start":10710198,"audio":0,"end":10732414,"filename":"/opt/perl/lib/5.28.1/CPAN/Index.pm"},{"start":10732414,"audio":0,"end":10732981,"filename":"/opt/perl/lib/5.28.1/CPAN/Prompt.pm"},{"start":10732981,"audio":0,"end":10733382,"filename":"/opt/perl/lib/5.28.1/CPAN/Nox.pm"},{"start":10733382,"audio":0,"end":10751077,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta.pm"},{"start":10751077,"audio":0,"end":10754496,"filename":"/opt/perl/lib/5.28.1/CPAN/Version.pm"},{"start":10754496,"audio":0,"end":10763470,"filename":"/opt/perl/lib/5.28.1/CPAN/Distroprefs.pm"},{"start":10763470,"audio":0,"end":10770218,"filename":"/opt/perl/lib/5.28.1/CPAN/Queue.pm"},{"start":10770218,"audio":0,"end":10777060,"filename":"/opt/perl/lib/5.28.1/CPAN/Author.pm"},{"start":10777060,"audio":0,"end":10788576,"filename":"/opt/perl/lib/5.28.1/CPAN/Mirrors.pm"},{"start":10788576,"audio":0,"end":10839191,"filename":"/opt/perl/lib/5.28.1/CPAN/FirstTime.pm"},{"start":10839191,"audio":0,"end":10840163,"filename":"/opt/perl/lib/5.28.1/CPAN/Distrostatus.pm"},{"start":10840163,"audio":0,"end":10840352,"filename":"/opt/perl/lib/5.28.1/CPAN/DeferredCode.pm"},{"start":10840352,"audio":0,"end":10842776,"filename":"/opt/perl/lib/5.28.1/CPAN/Kwalify.pm"},{"start":10842776,"audio":0,"end":10916393,"filename":"/opt/perl/lib/5.28.1/CPAN/Shell.pm"},{"start":10916393,"audio":0,"end":10926219,"filename":"/opt/perl/lib/5.28.1/CPAN/Bundle.pm"},{"start":10926219,"audio":0,"end":10932242,"filename":"/opt/perl/lib/5.28.1/CPAN/Complete.pm"},{"start":10932242,"audio":0,"end":10934154,"filename":"/opt/perl/lib/5.28.1/CPAN/Debug.pm"},{"start":10934154,"audio":0,"end":10956503,"filename":"/opt/perl/lib/5.28.1/CPAN/HandleConfig.pm"},{"start":10956503,"audio":0,"end":10957091,"filename":"/opt/perl/lib/5.28.1/CPAN/URL.pm"},{"start":10957091,"audio":0,"end":11000057,"filename":"/opt/perl/lib/5.28.1/CPAN/FTP.pm"},{"start":11000057,"audio":0,"end":11007721,"filename":"/opt/perl/lib/5.28.1/CPAN/CacheMgr.pm"},{"start":11007721,"audio":0,"end":11014630,"filename":"/opt/perl/lib/5.28.1/CPAN/InfoObj.pm"},{"start":11014630,"audio":0,"end":11179218,"filename":"/opt/perl/lib/5.28.1/CPAN/Distribution.pm"},{"start":11179218,"audio":0,"end":11195727,"filename":"/opt/perl/lib/5.28.1/CPAN/Tarzip.pm"},{"start":11195727,"audio":0,"end":11197959,"filename":"/opt/perl/lib/5.28.1/CPAN/Plugin.pm"},{"start":11197959,"audio":0,"end":11199521,"filename":"/opt/perl/lib/5.28.1/CPAN/FTP/netrc.pm"},{"start":11199521,"audio":0,"end":11201114,"filename":"/opt/perl/lib/5.28.1/CPAN/Kwalify/distroprefs.yml"},{"start":11201114,"audio":0,"end":11204341,"filename":"/opt/perl/lib/5.28.1/CPAN/Kwalify/distroprefs.dd"},{"start":11204341,"audio":0,"end":11211682,"filename":"/opt/perl/lib/5.28.1/CPAN/Plugin/Specfile.pm"},{"start":11211682,"audio":0,"end":11214315,"filename":"/opt/perl/lib/5.28.1/CPAN/HTTP/Credentials.pm"},{"start":11214315,"audio":0,"end":11222266,"filename":"/opt/perl/lib/5.28.1/CPAN/HTTP/Client.pm"},{"start":11222266,"audio":0,"end":11222756,"filename":"/opt/perl/lib/5.28.1/CPAN/Exception/yaml_not_installed.pm"},{"start":11222756,"audio":0,"end":11224459,"filename":"/opt/perl/lib/5.28.1/CPAN/Exception/yaml_process_error.pm"},{"start":11224459,"audio":0,"end":11228345,"filename":"/opt/perl/lib/5.28.1/CPAN/Exception/RecursiveDependency.pm"},{"start":11228345,"audio":0,"end":11229265,"filename":"/opt/perl/lib/5.28.1/CPAN/Exception/blocked_urllist.pm"},{"start":11229265,"audio":0,"end":11229431,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/History.pm"},{"start":11229431,"audio":0,"end":11231068,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Feature.pm"},{"start":11231068,"audio":0,"end":11277209,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Converter.pm"},{"start":11277209,"audio":0,"end":11306662,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Validator.pm"},{"start":11306662,"audio":0,"end":11315573,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Prereqs.pm"},{"start":11315573,"audio":0,"end":11338738,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Requirements.pm"},{"start":11338738,"audio":0,"end":11364009,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/YAML.pm"},{"start":11364009,"audio":0,"end":11370482,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Merge.pm"},{"start":11370482,"audio":0,"end":11370865,"filename":"/opt/perl/lib/5.28.1/CPAN/Meta/Spec.pm"},{"start":11370865,"audio":0,"end":11372899,"filename":"/opt/perl/lib/5.28.1/CPAN/LWP/UserAgent.pm"},{"start":11372899,"audio":0,"end":11404177,"filename":"/opt/perl/lib/5.28.1/App/Cpan.pm"},{"start":11404177,"audio":0,"end":11418350,"filename":"/opt/perl/lib/5.28.1/App/Prove.pm"},{"start":11418350,"audio":0,"end":11427564,"filename":"/opt/perl/lib/5.28.1/App/Prove/State.pm"},{"start":11427564,"audio":0,"end":11430011,"filename":"/opt/perl/lib/5.28.1/App/Prove/State/Result.pm"},{"start":11430011,"audio":0,"end":11431552,"filename":"/opt/perl/lib/5.28.1/App/Prove/State/Result/Test.pm"},{"start":11431552,"audio":0,"end":11432040,"filename":"/opt/perl/lib/5.28.1/warnings/register.pm"},{"start":11432040,"audio":0,"end":11433991,"filename":"/opt/perl/lib/5.28.1/overload/numbers.pm"},{"start":11433991,"audio":0,"end":11435287,"filename":"/opt/perl/lib/5.28.1/Memoize/Storable.pm"},{"start":11435287,"audio":0,"end":11436642,"filename":"/opt/perl/lib/5.28.1/Memoize/SDBM_File.pm"},{"start":11436642,"audio":0,"end":11437568,"filename":"/opt/perl/lib/5.28.1/Memoize/ExpireFile.pm"},{"start":11437568,"audio":0,"end":11441030,"filename":"/opt/perl/lib/5.28.1/Memoize/Expire.pm"},{"start":11441030,"audio":0,"end":11441569,"filename":"/opt/perl/lib/5.28.1/Memoize/AnyDBM_File.pm"},{"start":11441569,"audio":0,"end":11441960,"filename":"/opt/perl/lib/5.28.1/Memoize/ExpireTest.pm"},{"start":11441960,"audio":0,"end":11443317,"filename":"/opt/perl/lib/5.28.1/Memoize/NDBM_File.pm"},{"start":11443317,"audio":0,"end":11486584,"filename":"/opt/perl/lib/5.28.1/Getopt/Long.pm"},{"start":11486584,"audio":0,"end":11491851,"filename":"/opt/perl/lib/5.28.1/Getopt/Std.pm"},{"start":11491851,"audio":0,"end":11500914,"filename":"/opt/perl/lib/5.28.1/Params/Check.pm"},{"start":11500914,"audio":0,"end":11521939,"filename":"/opt/perl/lib/5.28.1/Term/ANSIColor.pm"},{"start":11521939,"audio":0,"end":11525482,"filename":"/opt/perl/lib/5.28.1/Term/Complete.pm"},{"start":11525482,"audio":0,"end":11533204,"filename":"/opt/perl/lib/5.28.1/Term/ReadLine.pm"},{"start":11533204,"audio":0,"end":11546180,"filename":"/opt/perl/lib/5.28.1/Term/Cap.pm"},{"start":11546180,"audio":0,"end":11546953,"filename":"/opt/perl/lib/5.28.1/Carp/Heavy.pm"},{"start":11546953,"audio":0,"end":11562800,"filename":"/opt/perl/lib/5.28.1/Compress/Zlib.pm"},{"start":11562800,"audio":0,"end":11599919,"filename":"/opt/perl/lib/5.28.1/File/Fetch.pm"},{"start":11599919,"audio":0,"end":11620643,"filename":"/opt/perl/lib/5.28.1/File/Path.pm"},{"start":11620643,"audio":0,"end":11629744,"filename":"/opt/perl/lib/5.28.1/File/Copy.pm"},{"start":11629744,"audio":0,"end":11651975,"filename":"/opt/perl/lib/5.28.1/File/Find.pm"},{"start":11651975,"audio":0,"end":11655125,"filename":"/opt/perl/lib/5.28.1/File/Compare.pm"},{"start":11655125,"audio":0,"end":11661459,"filename":"/opt/perl/lib/5.28.1/File/stat.pm"},{"start":11661459,"audio":0,"end":11666908,"filename":"/opt/perl/lib/5.28.1/File/Basename.pm"},{"start":11666908,"audio":0,"end":11713868,"filename":"/opt/perl/lib/5.28.1/File/Temp.pm"},{"start":11713868,"audio":0,"end":11721940,"filename":"/opt/perl/lib/5.28.1/File/GlobMapper.pm"},{"start":11721940,"audio":0,"end":11766635,"filename":"/opt/perl/lib/5.28.1/JSON/PP.pm"},{"start":11766635,"audio":0,"end":11766895,"filename":"/opt/perl/lib/5.28.1/JSON/PP/Boolean.pm"},{"start":11766895,"audio":0,"end":11767322,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet.pm"},{"start":11767322,"audio":0,"end":11786538,"filename":"/opt/perl/lib/5.28.1/Test2/API.pm"},{"start":11786538,"audio":0,"end":11788365,"filename":"/opt/perl/lib/5.28.1/Test2/IPC.pm"},{"start":11788365,"audio":0,"end":11794543,"filename":"/opt/perl/lib/5.28.1/Test2/Util.pm"},{"start":11794543,"audio":0,"end":11802337,"filename":"/opt/perl/lib/5.28.1/Test2/Event.pm"},{"start":11802337,"audio":0,"end":11815219,"filename":"/opt/perl/lib/5.28.1/Test2/Hub.pm"},{"start":11815219,"audio":0,"end":11815633,"filename":"/opt/perl/lib/5.28.1/Test2/Formatter.pm"},{"start":11815633,"audio":0,"end":11822297,"filename":"/opt/perl/lib/5.28.1/Test2/Tools/Tiny.pm"},{"start":11822297,"audio":0,"end":11823654,"filename":"/opt/perl/lib/5.28.1/Test2/IPC/Driver.pm"},{"start":11823654,"audio":0,"end":11835190,"filename":"/opt/perl/lib/5.28.1/Test2/IPC/Driver/Files.pm"},{"start":11835190,"audio":0,"end":11836625,"filename":"/opt/perl/lib/5.28.1/Test2/Hub/Subtest.pm"},{"start":11836625,"audio":0,"end":11837455,"filename":"/opt/perl/lib/5.28.1/Test2/Hub/Interceptor.pm"},{"start":11837455,"audio":0,"end":11837569,"filename":"/opt/perl/lib/5.28.1/Test2/Hub/Interceptor/Terminator.pm"},{"start":11837569,"audio":0,"end":11848413,"filename":"/opt/perl/lib/5.28.1/Test2/Formatter/TAP.pm"},{"start":11848413,"audio":0,"end":11851802,"filename":"/opt/perl/lib/5.28.1/Test2/Util/Facets2Legacy.pm"},{"start":11851802,"audio":0,"end":11856299,"filename":"/opt/perl/lib/5.28.1/Test2/Util/HashBase.pm"},{"start":11856299,"audio":0,"end":11856440,"filename":"/opt/perl/lib/5.28.1/Test2/Util/Trace.pm"},{"start":11856440,"audio":0,"end":11857796,"filename":"/opt/perl/lib/5.28.1/Test2/Util/ExternalMeta.pm"},{"start":11857796,"audio":0,"end":11858177,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Parent.pm"},{"start":11858177,"audio":0,"end":11859104,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Meta.pm"},{"start":11859104,"audio":0,"end":11859347,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Amnesty.pm"},{"start":11859347,"audio":0,"end":11859592,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Info.pm"},{"start":11859592,"audio":0,"end":11859823,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Assert.pm"},{"start":11859823,"audio":0,"end":11860067,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Render.pm"},{"start":11860067,"audio":0,"end":11860330,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Error.pm"},{"start":11860330,"audio":0,"end":11862100,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Trace.pm"},{"start":11862100,"audio":0,"end":11862390,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Hub.pm"},{"start":11862390,"audio":0,"end":11862647,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Control.pm"},{"start":11862647,"audio":0,"end":11862880,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/About.pm"},{"start":11862880,"audio":0,"end":11863104,"filename":"/opt/perl/lib/5.28.1/Test2/EventFacet/Plan.pm"},{"start":11863104,"audio":0,"end":11863594,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Waiting.pm"},{"start":11863594,"audio":0,"end":11865280,"filename":"/opt/perl/lib/5.28.1/Test2/Event/V2.pm"},{"start":11865280,"audio":0,"end":11865988,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Bail.pm"},{"start":11865988,"audio":0,"end":11867578,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Ok.pm"},{"start":11867578,"audio":0,"end":11869740,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Subtest.pm"},{"start":11869740,"audio":0,"end":11870423,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Exception.pm"},{"start":11870423,"audio":0,"end":11871508,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Pass.pm"},{"start":11871508,"audio":0,"end":11872679,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Fail.pm"},{"start":11872679,"audio":0,"end":11875328,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Generic.pm"},{"start":11875328,"audio":0,"end":11875912,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Diag.pm"},{"start":11875912,"audio":0,"end":11876473,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Note.pm"},{"start":11876473,"audio":0,"end":11877332,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Skip.pm"},{"start":11877332,"audio":0,"end":11877926,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Encoding.pm"},{"start":11877926,"audio":0,"end":11880089,"filename":"/opt/perl/lib/5.28.1/Test2/Event/Plan.pm"},{"start":11880089,"audio":0,"end":11880749,"filename":"/opt/perl/lib/5.28.1/Test2/Event/TAP/Version.pm"},{"start":11880749,"audio":0,"end":11898155,"filename":"/opt/perl/lib/5.28.1/Test2/API/Instance.pm"},{"start":11898155,"audio":0,"end":11901068,"filename":"/opt/perl/lib/5.28.1/Test2/API/Breakage.pm"},{"start":11901068,"audio":0,"end":11912438,"filename":"/opt/perl/lib/5.28.1/Test2/API/Context.pm"},{"start":11912438,"audio":0,"end":11914244,"filename":"/opt/perl/lib/5.28.1/Test2/API/Stack.pm"},{"start":11914244,"audio":0,"end":11932642,"filename":"/opt/perl/lib/5.28.1/Test/More.pm"},{"start":11932642,"audio":0,"end":11934595,"filename":"/opt/perl/lib/5.28.1/Test/Future.pm"},{"start":11934595,"audio":0,"end":11977260,"filename":"/opt/perl/lib/5.28.1/Test/Builder.pm"},{"start":11977260,"audio":0,"end":11977572,"filename":"/opt/perl/lib/5.28.1/Test/Simple.pm"},{"start":11977572,"audio":0,"end":11987505,"filename":"/opt/perl/lib/5.28.1/Test/Harness.pm"},{"start":11987505,"audio":0,"end":11993332,"filename":"/opt/perl/lib/5.28.1/Test/Tester.pm"},{"start":11993332,"audio":0,"end":11993405,"filename":"/opt/perl/lib/5.28.1/Test/use/ok.pm"},{"start":11993405,"audio":0,"end":11994169,"filename":"/opt/perl/lib/5.28.1/Test/Future/Deferred.pm"},{"start":11994169,"audio":0,"end":11995357,"filename":"/opt/perl/lib/5.28.1/Test/Builder/Module.pm"},{"start":11995357,"audio":0,"end":11995691,"filename":"/opt/perl/lib/5.28.1/Test/Builder/TodoDiag.pm"},{"start":11995691,"audio":0,"end":12005476,"filename":"/opt/perl/lib/5.28.1/Test/Builder/Tester.pm"},{"start":12005476,"audio":0,"end":12006711,"filename":"/opt/perl/lib/5.28.1/Test/Builder/Formatter.pm"},{"start":12006711,"audio":0,"end":12014269,"filename":"/opt/perl/lib/5.28.1/Test/Builder/IO/Scalar.pm"},{"start":12014269,"audio":0,"end":12014439,"filename":"/opt/perl/lib/5.28.1/Test/Builder/Tester/Color.pm"},{"start":12014439,"audio":0,"end":12018356,"filename":"/opt/perl/lib/5.28.1/Test/Tester/Capture.pm"},{"start":12018356,"audio":0,"end":12018927,"filename":"/opt/perl/lib/5.28.1/Test/Tester/Delegate.pm"},{"start":12018927,"audio":0,"end":12019846,"filename":"/opt/perl/lib/5.28.1/Test/Tester/CaptureRunner.pm"},{"start":12019846,"audio":0,"end":12020972,"filename":"/opt/perl/lib/5.28.1/Digest/base.pm"},{"start":12020972,"audio":0,"end":12021691,"filename":"/opt/perl/lib/5.28.1/Digest/file.pm"}],"remote_package_size":12021691,"package_uuid":"d4d5d231-aa17-434a-ac1f-dd0d6af95261"})})();"use strict";var my_UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function my_UTF8ArrayToString(ptr,len){var endPtr=ptr+len;if(len>16&&HEAPU8.subarray&&my_UTF8Decoder){return my_UTF8Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(ptr<endPtr){u0=HEAPU8[ptr++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=HEAPU8[ptr++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=HEAPU8[ptr++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=HEAPU8[ptr++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=HEAPU8[ptr++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=HEAPU8[ptr++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}}var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}Module["arguments"]=[];Module["thisProgram"]="./this.program";Module["quit"]=function(status,toThrow){throw toThrow};Module["preRun"]=[];Module["postRun"]=[];var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}else{return scriptDirectory+path}}if(ENVIRONMENT_IS_NODE){scriptDirectory=__dirname+"/";var nodeFS;var nodePath;Module["read"]=function shell_read(filename,binary){var ret;if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);Module["quit"]=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){Module["read"]=function shell_read(f){return read(f)}}Module["readBinary"]=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof quit==="function"){Module["quit"]=function(status){quit(status)}}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}Module["read"]=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module["readBinary"]=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)};Module["setWindowTitle"]=function(title){document.title=title}}else{}var out=Module["print"]||(typeof console!=="undefined"?console.log.bind(console):typeof print!=="undefined"?print:null);var err=Module["printErr"]||(typeof printErr!=="undefined"?printErr:typeof console!=="undefined"&&console.warn.bind(console)||out);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;if(end<=_emscripten_get_heap_size()){HEAP32[DYNAMICTOP_PTR>>2]=end}else{var success=_emscripten_resize_heap(end);if(!success)return 0}return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var asm2wasmImports={"f64-rem":function(x,y){return x%y},"debugger":function(){debugger}};var jsCallStartIndex=1;var functionPointers=new Array(0);var funcWrappers={};function dynCall(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var getTempRet0=function(){return tempRet0};if(typeof WebAssembly!=="object"){err("no native wasm support detected")}var wasmMemory;var wasmTable;var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i<args.length;i++){var converter=toC[argTypes[i]];if(converter){if(stack===0)stack=stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var ret=func.apply(null,cArgs);ret=convertReturnValue(ret);if(stack!==0)stackRestore(stack);return ret}function cwrap(ident,returnType,argTypes,opts){argTypes=argTypes||[];var numericArgs=argTypes.every(function(type){return type==="number"});var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return function(){return ccall(ident,returnType,argTypes,arguments,opts)}}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var ALLOC_NORMAL=0;var ALLOC_NONE=3;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,stackAlloc,dynamicAlloc][allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i<size){var curr=slab[i];type=singleType||types[i];if(type===0){i++;continue}if(type=="i64")type="i32";setValue(ret+i,curr,type);if(previousType!==type){typeSize=getNativeTypeSize(type);previousType=type}i+=typeSize}return ret}function getMemory(size){if(!runtimeInitialized)return dynamicAlloc(size);return _malloc(size)}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(u8Array[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str="";while(idx<endPtr){var u0=u8Array[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|u8Array[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function allocateUTF8OnStack(str){var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function demangle(func){return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var PAGE_SIZE=16384;var WASM_PAGE_SIZE=65536;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STACK_BASE=1278416,DYNAMIC_BASE=6521296,DYNAMICTOP_PTR=1278160;var TOTAL_STACK=5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)err("TOTAL_MEMORY should be larger than TOTAL_STACK, was "+TOTAL_MEMORY+"! (TOTAL_STACK="+TOTAL_STACK+")");if(Module["buffer"]){buffer=Module["buffer"]}else{if(typeof WebAssembly==="object"&&typeof WebAssembly.Memory==="function"){wasmMemory=new WebAssembly.Memory({"initial":TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=wasmMemory.buffer}else{buffer=new ArrayBuffer(TOTAL_MEMORY)}Module["buffer"]=buffer}updateGlobalBufferViews();HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);PIPEFS.root=FS.mount(PIPEFS,{},null);callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var wasmBinaryFile="emperl.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(Module["wasmBinary"]){return new Uint8Array(Module["wasmBinary"])}if(Module["readBinary"]){return Module["readBinary"](wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!Module["wasmBinary"]&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(env){var info={"env":env,"global":{"NaN":NaN,Infinity:Infinity},"global.Math":Math,"asm2wasm":asm2wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}if(!Module["wasmBinary"]&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){WebAssembly.instantiateStreaming(fetch(wasmBinaryFile,{credentials:"same-origin"}),info).then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})}else{instantiateArrayBuffer(receiveInstantiatedSource)}return{}}Module["asm"]=function(global,env,providedBuffer){env["memory"]=wasmMemory;env["table"]=wasmTable=new WebAssembly.Table({"initial":2142,"maximum":2142,"element":"anyfunc"});env["__memory_base"]=1024;env["__table_base"]=0;var exports=createWasm(env);return exports};function _js_eval_js(codestr,ilen,wantrv,olen){var out="";try{var code=my_UTF8ArrayToString(codestr,ilen);if(Perl.trace)console.debug("Perl: eval",code,"- wantrv",wantrv);var rv=eval(code);if(wantrv==0)rv=undefined;switch(typeof rv){case"undefined":out="U";break;case"boolean":out=(rv?"1":"0")+"B";break;case"number":out=String(rv)+"N";break;case"string":out=rv+"S";break;case"function":out=Perl.glue(rv)+"F";break;case"object":if(rv==null)out="U";else if(Array.isArray(rv))out=Perl.glue(rv)+"A";else out=Perl.glue(rv)+"O";break;default:console.warn("js_get_js: unsupported return type",rv);out=typeof rv+"X";break}}catch(ex){out=ex+"E"}if(Perl.trace)console.debug("Perl: returning",out);var lengthBytes=lengthBytesUTF8(out);HEAP32[olen>>2]=lengthBytes;var stringOnWasmHeap=_malloc(lengthBytes+1);stringToUTF8(out,stringOnWasmHeap,lengthBytes+1);return stringOnWasmHeap}__ATINIT__.push({func:function(){___emscripten_environ_constructor()}});var tempDoublePtr=1278400;function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}var ENV={};function ___buildEnvironment(environ){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C.UTF-8";ENV["_"]=Module["thisProgram"];poolPtr=getMemory(TOTAL_ENV_SIZE);envPtr=getMemory(MAX_ENV_VALUES*4);HEAP32[envPtr>>2]=poolPtr;HEAP32[environ>>2]=envPtr}else{envPtr=HEAP32[environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in ENV){if(typeof ENV[key]==="string"){var line=key+"="+ENV[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i<strings.length;i++){var line=strings[i];writeAsciiToMemory(line,poolPtr);HEAP32[envPtr+i*ptrSize>>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return 0||ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(22);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(a0,a1){return _clock_gettime(a0,a1)}function ___lock(){}function ___map_file(pathname,size){___setErrNo(1);return-1}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)},resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.flush(stream.tty)},flush:function(stream){stream.tty.ops.flush(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(ERRNO_CODES.ENXIO)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EIO)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=new Buffer(BUFSIZE);var bytesRead=0;var isPosixPlatform=process.platform!="win32";var fd=process.stdin.fd;if(isPosixPlatform){var usingDevice=false;try{fd=fs.openSync("/dev/stdin","r");usingDevice=true}catch(e){}}try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null)}catch(e){if(e.toString().indexOf("EOF")!=-1)bytesRead=0;else throw e}if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return arr}return node.contents},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array;if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(new ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[ERRNO_CODES.ENOENT]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name]},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete parent.contents[name]},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){canOwn=false;if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=new Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw new FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var IDBFS={dbs:{},indexedDB:function(){if(typeof indexedDB!=="undefined")return indexedDB;var ret=null;if(typeof window==="object")ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,"IDBFS used, but indexedDB not supported");return ret},DB_VERSION:21,DB_STORE_NAME:"FILE_DATA",mount:function(mount){return MEMFS.mount.apply(null,arguments)},syncfs:function(mount,populate,callback){IDBFS.getLocalSet(mount,function(err,local){if(err)return callback(err);IDBFS.getRemoteSet(mount,function(err,remote){if(err)return callback(err);var src=populate?remote:local;var dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)})})},getDB:function(name,callback){var db=IDBFS.dbs[name];if(db){return callback(null,db)}var req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return callback(e)}if(!req){return callback("Unable to connect to IndexedDB")}req.onupgradeneeded=function(e){var db=e.target.result;var transaction=e.target.transaction;var fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains("timestamp")){fileStore.createIndex("timestamp","timestamp",{unique:false})}};req.onsuccess=function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)};req.onerror=function(e){callback(this.error);e.preventDefault()}},getLocalSet:function(mount,callback){var entries={};function isRealDir(p){return p!=="."&&p!==".."}function toAbsolute(root){return function(p){return PATH.join2(root,p)}}var check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var path=check.pop();var stat;try{stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return callback(null,{type:"local",entries:entries})},getRemoteSet:function(mount,callback){var entries={};IDBFS.getDB(mount.mountpoint,function(err,db){if(err)return callback(err);try{var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readonly");transaction.onerror=function(e){callback(this.error);e.preventDefault()};var store=transaction.objectStore(IDBFS.DB_STORE_NAME);var index=store.index("timestamp");index.openKeyCursor().onsuccess=function(event){var cursor=event.target.result;if(!cursor){return callback(null,{type:"remote",db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()}}catch(e){return callback(e)}})},loadLocalEntry:function(path,callback){var stat,node;try{var lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return callback(e)}if(FS.isDir(stat.mode)){return callback(null,{timestamp:stat.mtime,mode:stat.mode})}else if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return callback(new Error("node type not supported"))}},storeLocalEntry:function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{canOwn:true})}else{return callback(new Error("node type not supported"))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return callback(e)}callback(null)},removeLocalEntry:function(path,callback){try{var lookup=FS.lookupPath(path);var stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return callback(e)}callback(null)},loadRemoteEntry:function(store,path,callback){var req=store.get(path);req.onsuccess=function(event){callback(null,event.target.result)};req.onerror=function(e){callback(this.error);e.preventDefault()}},storeRemoteEntry:function(store,path,entry,callback){var req=store.put(entry,path);req.onsuccess=function(){callback(null)};req.onerror=function(e){callback(this.error);e.preventDefault()}},removeRemoteEntry:function(store,path,callback){var req=store.delete(path);req.onsuccess=function(){callback(null)};req.onerror=function(e){callback(this.error);e.preventDefault()}},reconcile:function(src,dst,callback){var total=0;var create=[];Object.keys(src.entries).forEach(function(key){var e=src.entries[key];var e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}});var remove=[];Object.keys(dst.entries).forEach(function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}});if(!total){return callback(null)}var errored=false;var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=function(e){done(this.error);e.preventDefault()};create.sort().forEach(function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)})}else{IDBFS.loadLocalEntry(path,function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)})}});remove.sort().reverse().forEach(function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}})}};var NODEFS={isWindows:false,staticInit:function(){NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"]}},bufferFrom:function(arrayBuffer){return Buffer.alloc?Buffer.from(arrayBuffer):new Buffer(arrayBuffer)},mount:function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode:function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode:function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode},realPath:function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)},flagsForNode:function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}},node_ops:{getattr:function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr:function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},lookup:function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod:function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node},rename:function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},unlink:function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},rmdir:function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readdir:function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},symlink:function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},readlink:function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}},stream_ops:{open:function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},close:function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}},read:function(stream,buffer,offset,length,position){if(length===0)return 0;try{return fs.readSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}},write:function(stream,buffer,offset,length,position){try{return fs.writeSync(stream.nfd,NODEFS.bufferFrom(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}}};var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)});(mount.opts["blobs"]||[]).forEach(function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])});(mount.opts["packages"]||[]).forEach(function(pack){pack["metadata"].files.forEach(function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))})});return root},createNode:function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node},node_ops:{getattr:function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}},lookup:function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.ENOENT)},mknod:function(parent,name,mode,dev){throw new FS.ErrnoError(ERRNO_CODES.EPERM)},rename:function(oldNode,newDir,newName){throw new FS.ErrnoError(ERRNO_CODES.EPERM)},unlink:function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)},rmdir:function(parent,name){throw new FS.ErrnoError(ERRNO_CODES.EPERM)},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newName,oldPath){throw new FS.ErrnoError(ERRNO_CODES.EPERM)},readlink:function(node){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}},stream_ops:{read:function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size},write:function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)},lookupPath:function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(40)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(40)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 13}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 13}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 13}return 0},mayLookup:function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return 13;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 17}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return 20}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 16}}else{if(FS.isDir(node.mode)){return 21}}return 0},mayOpen:function(node,flags){if(!node){return 2}if(FS.isLink(node.mode)){return 40}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 21}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(24)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(29)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(16)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(16)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(20)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(22)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(22)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(1)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=17)throw e}}},mkdev:function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw new FS.ErrnoError(2)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(2)}var newname=PATH.basename(newpath);var err=FS.mayCreate(parent,newname);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(1)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw new FS.ErrnoError(16)}if(!old_dir||!new_dir)throw new FS.ErrnoError(2);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(18)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(22)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(39)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw new FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw new FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(1)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(16)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,"w");if(err){throw new FS.ErrnoError(err)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){console.log("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){console.log("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}},rmdir:function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,true);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(1)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(16)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}},readdir:function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(20)}return node.node_ops.readdir(node)},unlink:function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var err=FS.mayDelete(parent,name,false);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(1)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(16)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){console.log("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){console.log("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}},readlink:function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(2)}if(!link.node_ops.readlink){throw new FS.ErrnoError(22)}return PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(2)}if(!node.node_ops.getattr){throw new FS.ErrnoError(1)}return node.node_ops.getattr(node)},lstat:function(path){return FS.stat(path,true)},chmod:function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(1)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:function(path,mode){FS.chmod(path,mode,true)},fchmod:function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(9)}FS.chmod(stream.node,mode)},chown:function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(1)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:function(path,uid,gid){FS.chown(path,uid,gid,true)},fchown:function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(9)}FS.chown(stream.node,uid,gid)},truncate:function(path,len){if(len<0){throw new FS.ErrnoError(22)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(1)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(21)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(22)}var err=FS.nodePermissions(node,"w");if(err){throw new FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(9)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(22)}FS.truncate(stream.node,len)},utime:function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(2)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(17)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(2)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(20)}if(!created){var err=FS.mayOpen(node,flags);if(err){throw new FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;console.log("FS.trackingDelegate error on read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){console.log("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream},close:function(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(9)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:function(stream){return stream.fd===null},llseek:function(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(9)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(29)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(22)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(22)}if(FS.isClosed(stream)){throw new FS.ErrnoError(9)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(9)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(21)}if(!stream.stream_ops.read){throw new FS.ErrnoError(22)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(29)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(22)}if(FS.isClosed(stream)){throw new FS.ErrnoError(9)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(9)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(21)}if(!stream.stream_ops.write){throw new FS.ErrnoError(22)}if(stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(29)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){console.log("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: "+e.message)}return bytesWritten},allocate:function(stream,offset,length){if(FS.isClosed(stream)){throw new FS.ErrnoError(9)}if(offset<0||length<=0){throw new FS.ErrnoError(22)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(9)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(19)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(95)}stream.stream_ops.allocate(stream,offset,length)},mmap:function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw new FS.ErrnoError(13)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(19)}return stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)},msync:function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:function(stream){return 0},ioctl:function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(25)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:function(path,opts){opts=opts||{};opts.flags=opts.flags||"r";opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:function(path,data,opts){opts=opts||{};opts.flags=opts.flags||"w";var stream=FS.open(path,opts.flags,opts.mode);if(typeof data==="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:function(){return FS.currentPath},chdir:function(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(2)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(20)}var err=FS.nodePermissions(lookup.node,"x");if(err){throw new FS.ErrnoError(err)}FS.currentPath=lookup.path},createDefaultDirectories:function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:function(){return 0},write:function(stream,buffer,offset,length,pos){return length}});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device;if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);random_device=function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");random_device=function(){return crypto_module["randomBytes"](1)[0]}}catch(e){random_device=function(){return Math.random()*256|0}}}else{random_device=function(){abort("random_device")}}FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:function(){FS.mkdir("/proc");FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:function(){var node=FS.createNode("/proc/self","fd",16384|511,73);node.node_ops={lookup:function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(9);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:function(){return stream.path}}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin","r");var stdout=FS.open("/dev/stdout","w");var stderr=FS.open("/dev/stderr","w")},ensureErrnoError:function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error";if(this.stack)Object.defineProperty(this,"stack",{value:(new Error).stack,writable:true})};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[2].forEach(function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"})},staticInit:function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"IDBFS":IDBFS,"NODEFS":NODEFS,"WORKERFS":WORKERFS}},init:function(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},getMode:function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},joinPath:function(parts,forceRelative){var path=PATH.join.apply(null,parts);if(forceRelative&&path[0]=="/")path=path.substr(1);return path},absolutePath:function(relative,base){return PATH.resolve(base,relative)},standardizePath:function(path){return PATH.normalize(path)},findObject:function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{___setErrNo(ret.error);return null}},analyzePath:function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createFolder:function(parent,name,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.mkdir(path,mode)},createPath:function(parent,path,canRead,canWrite){parent=typeof parent==="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,"w");FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:function(parent,name,input,output){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:function(stream){stream.seekable=false},close:function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}},read:function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(5)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(11)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(5)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},createLink:function(parent,name,target,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);return FS.symlink(target,path)},forceLoadFile:function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;var success=true;if(typeof XMLHttpRequest!=="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(Module["read"]){try{obj.contents=intArrayFromString(Module["read"](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}if(!success)___setErrNo(5);return success},createLazyFile:function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(5)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node},createPreloadedFile:function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,function(){if(onerror)onerror();removeRunDependency(dep)});handled=true}});if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){Browser.asyncLoad(url,function(byteArray){processData(byteArray)},onerror)}else{processData(url)}},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:function(){return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths,onload,onerror){onload=onload||function(){};onerror=onerror||function(){};var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){console.log("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:function(paths,onload,onerror){onload=onload||function(){};onerror=onerror||function(){};var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};var SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:function(dirfd,path){if(path[0]!=="/"){var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return path},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0},doMsync:function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret},doWritev:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:0,get:function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(){var ret=UTF8ToString(SYSCALLS.get());return ret},getStreamFromFD:function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream},getSocketFromFD:function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket},getSocketAddress:function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info},get64:function(){var low=SYSCALLS.get(),high=SYSCALLS.get();return low},getZero:function(){SYSCALLS.get()}};function ___syscall10(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){var streaming=type==1;if(protocol){assert(streaming==(protocol==6))}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:FS.modeStringToFlags("r+"),seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr==="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);var opts=ENVIRONMENT_IS_NODE?{"protocol":subProtocols.toString()}:subProtocols;if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;if(ENVIRONMENT_IS_NODE){WebSocketConstructor=require("ws")}else if(ENVIRONMENT_IS_WEB){WebSocketConstructor=window["WebSocket"]}else{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EHOSTUNREACH)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!=="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){assert(typeof data!=="string"&&data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data);var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,flags){if(!flags.binary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=ERRNO_CODES.ECONNREFUSED;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return ERRNO_CODES.EINVAL}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i<peers.length;i++){var peer=sock.peers[peers[i]];try{peer.socket.close()}catch(e){}SOCKFS.websocket_sock_ops.removePeer(sock,peer)}return 0},bind:function(sock,addr,port){if(typeof sock.saddr!=="undefined"||typeof sock.sport!=="undefined"){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}sock.saddr=addr;sock.sport=port;if(sock.type===2){if(sock.server){sock.server.close();sock.server=null}try{sock.sock_ops.listen(sock,0)}catch(e){if(!(e instanceof FS.ErrnoError))throw e;if(e.errno!==ERRNO_CODES.EOPNOTSUPP)throw e}}},connect:function(sock,addr,port){if(sock.server){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}if(typeof sock.daddr!=="undefined"&&typeof sock.dport!=="undefined"){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(dest){if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(ERRNO_CODES.EALREADY)}else{throw new FS.ErrnoError(ERRNO_CODES.EISCONN)}}}var peer=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port);sock.daddr=peer.addr;sock.dport=peer.port;throw new FS.ErrnoError(ERRNO_CODES.EINPROGRESS)},listen:function(sock,backlog){if(!ENVIRONMENT_IS_NODE){throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}if(sock.server){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var WebSocketServer=require("ws").Server;var host=sock.saddr;sock.server=new WebSocketServer({host:host,port:sock.sport});Module["websocket"].emit("listen",sock.stream.fd);sock.server.on("connection",function(ws){if(sock.type===1){var newsock=SOCKFS.createSocket(sock.family,sock.type,sock.protocol);var peer=SOCKFS.websocket_sock_ops.createPeer(newsock,ws);newsock.daddr=peer.addr;newsock.dport=peer.port;sock.pending.push(newsock);Module["websocket"].emit("connection",newsock.stream.fd)}else{SOCKFS.websocket_sock_ops.createPeer(sock,ws);Module["websocket"].emit("connection",sock.stream.fd)}});sock.server.on("closed",function(){Module["websocket"].emit("close",sock.stream.fd);sock.server=null});sock.server.on("error",function(error){sock.error=ERRNO_CODES.EHOSTUNREACH;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"EHOSTUNREACH: Host is unreachable"])})},accept:function(listensock){if(!listensock.server){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var newsock=listensock.pending.shift();newsock.stream.flags=listensock.stream.flags;return newsock},getname:function(sock,peer){var addr,port;if(peer){if(sock.daddr===undefined||sock.dport===undefined){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}addr=sock.daddr;port=sock.dport}else{addr=sock.saddr||0;port=sock.sport||0}return{addr:addr,port:port}},sendmsg:function(sock,buffer,offset,length,addr,port){if(sock.type===2){if(addr===undefined||port===undefined){addr=sock.daddr;port=sock.dport}if(addr===undefined||port===undefined){throw new FS.ErrnoError(ERRNO_CODES.EDESTADDRREQ)}}else{addr=sock.daddr;port=sock.dport}var dest=SOCKFS.websocket_sock_ops.getPeer(sock,addr,port);if(sock.type===1){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}else if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}if(ArrayBuffer.isView(buffer)){offset+=buffer.byteOffset;buffer=buffer.buffer}var data;data=buffer.slice(offset,offset+length);if(sock.type===2){if(!dest||dest.socket.readyState!==dest.socket.OPEN){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){dest=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port)}dest.dgram_send_queue.push(data);return length}}try{dest.socket.send(data);return length}catch(e){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}},recvmsg:function(sock,length){if(sock.type===1&&sock.server){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}var queued=sock.recv_queue.shift();if(!queued){if(sock.type===1){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(!dest){throw new FS.ErrnoError(ERRNO_CODES.ENOTCONN)}else if(dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){return null}else{throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}else{throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}}var queuedLength=queued.data.byteLength||queued.data.length;var queuedOffset=queued.data.byteOffset||0;var queuedBuffer=queued.data.buffer||queued.data;var bytesRead=Math.min(length,queuedLength);var res={buffer:new Uint8Array(queuedBuffer,queuedOffset,bytesRead),addr:queued.addr,port:queued.port};if(sock.type===1&&bytesRead<queuedLength){var bytesRemaining=queuedLength-bytesRead;queued.data=new Uint8Array(queuedBuffer,queuedOffset+bytesRead,bytesRemaining);sock.recv_queue.unshift(queued)}return res}}};function __inet_pton4_raw(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function __inet_pton6_raw(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.indexOf("::")===0){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=parseInt(words[words.length-4])+parseInt(words[words.length-3])*256;words[words.length-3]=parseInt(words[words.length-2])+parseInt(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w<words.length;w++){if(typeof words[w]==="string"){if(words[w]==="Z"){for(z=0;z<8-words.length+1;z++){parts[w+z]=0}offset=z-1}else{parts[w+offset]=_htons(parseInt(words[w],16))}}else{parts[w+offset]=words[w]}}return[parts[1]<<16|parts[0],parts[3]<<16|parts[2],parts[5]<<16|parts[4],parts[7]<<16|parts[6]]}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=__inet_pton4_raw(name);if(res!==null){return name}res=__inet_pton6_raw(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function __inet_ntop4_raw(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function __inet_ntop6_raw(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=__inet_ntop4_raw(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word<zstart+longest){if(word===zstart){str+=":";if(zstart===0)str+=":"}continue}}str+=Number(_ntohs(parts[word]&65535)).toString(16);str+=word<7?":":""}return str}function __read_sockaddr(sa,salen){var family=HEAP16[sa>>1];var port=_ntohs(HEAP16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:22}}addr=HEAP32[sa+4>>2];addr=__inet_ntop4_raw(addr);break;case 10:if(salen!==28){return{errno:22}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=__inet_ntop6_raw(addr);break;default:return{errno:97}}return{family:family,addr:addr,port:port}}function __write_sockaddr(sa,family,addr,port){switch(family){case 2:addr=__inet_pton4_raw(addr);HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=__inet_pton6_raw(addr);HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);HEAP32[sa+4>>2]=0;HEAP32[sa+24>>2]=0;break;default:return{errno:97}}return{}}function ___syscall102(which,varargs){SYSCALLS.varargs=varargs;try{var call=SYSCALLS.get(),socketvararg=SYSCALLS.get();SYSCALLS.varargs=socketvararg;switch(call){case 1:{var domain=SYSCALLS.get(),type=SYSCALLS.get(),protocol=SYSCALLS.get();var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}case 2:{var sock=SYSCALLS.getSocketFromFD(),info=SYSCALLS.getSocketAddress();sock.sock_ops.bind(sock,info.addr,info.port);return 0}case 3:{var sock=SYSCALLS.getSocketFromFD(),info=SYSCALLS.getSocketAddress();sock.sock_ops.connect(sock,info.addr,info.port);return 0}case 4:{var sock=SYSCALLS.getSocketFromFD(),backlog=SYSCALLS.get();sock.sock_ops.listen(sock,backlog);return 0}case 5:{var sock=SYSCALLS.getSocketFromFD(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();var newsock=sock.sock_ops.accept(sock);if(addr){var res=__write_sockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport)}return newsock.stream.fd}case 6:{var sock=SYSCALLS.getSocketFromFD(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();var res=__write_sockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport);return 0}case 7:{var sock=SYSCALLS.getSocketFromFD(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();if(!sock.daddr){return-ERRNO_CODES.ENOTCONN}var res=__write_sockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport);return 0}case 11:{var sock=SYSCALLS.getSocketFromFD(),message=SYSCALLS.get(),length=SYSCALLS.get(),flags=SYSCALLS.get(),dest=SYSCALLS.getSocketAddress(true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}else{return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}}case 12:{var sock=SYSCALLS.getSocketFromFD(),buf=SYSCALLS.get(),len=SYSCALLS.get(),flags=SYSCALLS.get(),addr=SYSCALLS.get(),addrlen=SYSCALLS.get();var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var res=__write_sockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}case 14:{return-ERRNO_CODES.ENOPROTOOPT}case 15:{var sock=SYSCALLS.getSocketFromFD(),level=SYSCALLS.get(),optname=SYSCALLS.get(),optval=SYSCALLS.get(),optlen=SYSCALLS.get();if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-ERRNO_CODES.ENOPROTOOPT}case 16:{var sock=SYSCALLS.getSocketFromFD(),message=SYSCALLS.get(),flags=SYSCALLS.get();var iov=HEAP32[message+8>>2];var num=HEAP32[message+12>>2];var addr,port;var name=HEAP32[message>>2];var namelen=HEAP32[message+4>>2];if(name){var info=__read_sockaddr(name,namelen);if(info.errno)return-info.errno;port=info.port;addr=DNS.lookup_addr(info.addr)||info.addr}var total=0;for(var i=0;i<num;i++){total+=HEAP32[iov+(8*i+4)>>2]}var view=new Uint8Array(total);var offset=0;for(var i=0;i<num;i++){var iovbase=HEAP32[iov+(8*i+0)>>2];var iovlen=HEAP32[iov+(8*i+4)>>2];for(var j=0;j<iovlen;j++){view[offset++]=HEAP8[iovbase+j>>0]}}return sock.sock_ops.sendmsg(sock,view,0,total,addr,port)}case 17:{var sock=SYSCALLS.getSocketFromFD(),message=SYSCALLS.get(),flags=SYSCALLS.get();var iov=HEAP32[message+8>>2];var num=HEAP32[message+12>>2];var total=0;for(var i=0;i<num;i++){total+=HEAP32[iov+(8*i+4)>>2]}var msg=sock.sock_ops.recvmsg(sock,total);if(!msg)return 0;var name=HEAP32[message>>2];if(name){var res=__write_sockaddr(name,sock.family,DNS.lookup_name(msg.addr),msg.port)}var bytesRead=0;var bytesRemaining=msg.buffer.byteLength;for(var i=0;bytesRemaining>0&&i<num;i++){var iovbase=HEAP32[iov+(8*i+0)>>2];var iovlen=HEAP32[iov+(8*i+4)>>2];if(!iovlen){continue}var length=Math.min(iovlen,bytesRemaining);var buf=msg.buffer.subarray(bytesRead,bytesRead+length);HEAPU8.set(buf,iovbase+bytesRead);bytesRead+=length;bytesRemaining-=length}return bytesRead}default:abort("unsupported socketcall syscall "+call)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall118(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall12(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.chdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall122(which,varargs){SYSCALLS.varargs=varargs;try{var buf=SYSCALLS.get();if(!buf)return-ERRNO_CODES.EFAULT;var layout={"sysname":0,"nodename":65,"domainname":325,"machine":260,"version":195,"release":130,"__size__":390};function copyString(element,value){var offset=layout[element];writeAsciiToMemory(value,buf+offset)}copyString("sysname","Emscripten");copyString("nodename","emscripten");copyString("release","1.0");copyString("version","#1");copyString("machine","x86-JS");return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PROCINFO={ppid:1,pid:42,sid:42,pgid:42};function ___syscall132(which,varargs){SYSCALLS.varargs=varargs;try{var pid=SYSCALLS.get();if(pid&&pid!==PROCINFO.pid)return-ERRNO_CODES.ESRCH;return PROCINFO.pgid}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall133(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.chdir(stream.path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall14(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),mode=SYSCALLS.get(),dev=SYSCALLS.get();return SYSCALLS.doMknod(path,mode,dev)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall142(which,varargs){SYSCALLS.varargs=varargs;try{var nfds=SYSCALLS.get(),readfds=SYSCALLS.get(),writefds=SYSCALLS.get(),exceptfds=SYSCALLS.get(),timeout=SYSCALLS.get();var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);function check(fd,low,high,val){return fd<32?low&val:high&val}for(var fd=0;fd<nfds;fd++){var mask=1<<fd%32;if(!check(fd,allLow,allHigh,mask)){continue}var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);var flags=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){flags=stream.stream_ops.poll(stream)}if(flags&1&&check(fd,srcReadLow,srcReadHigh,mask)){fd<32?dstReadLow=dstReadLow|mask:dstReadHigh=dstReadHigh|mask;total++}if(flags&4&&check(fd,srcWriteLow,srcWriteHigh,mask)){fd<32?dstWriteLow=dstWriteLow|mask:dstWriteHigh=dstWriteHigh|mask;total++}if(flags&2&&check(fd,srcExceptLow,srcExceptHigh,mask)){fd<32?dstExceptLow=dstExceptLow|mask:dstExceptHigh=dstExceptHigh|mask;total++}}if(readfds){HEAP32[readfds>>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall15(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),mode=SYSCALLS.get();FS.chmod(path,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall168(which,varargs){SYSCALLS.varargs=varargs;try{var fds=SYSCALLS.get(),nfds=SYSCALLS.get(),timeout=SYSCALLS.get();var nonzero=0;for(var i=0;i<nfds;i++){var pollfd=fds+8*i;var fd=HEAP32[pollfd>>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall183(which,varargs){SYSCALLS.varargs=varargs;try{var buf=SYSCALLS.get(),size=SYSCALLS.get();if(size===0)return-ERRNO_CODES.EINVAL;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd);if(size<cwdLengthInBytes+1)return-ERRNO_CODES.ERANGE;stringToUTF8(cwd,buf,size);return buf}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall193(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),zero=SYSCALLS.getZero(),length=SYSCALLS.get64();FS.truncate(path,length);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall194(which,varargs){SYSCALLS.varargs=varargs;try{var fd=SYSCALLS.get(),zero=SYSCALLS.getZero(),length=SYSCALLS.get64();FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall195(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall196(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall197(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall198(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),owner=SYSCALLS.get(),group=SYSCALLS.get();FS.chown(path,owner,group);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall202(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall199(a0,a1){return ___syscall202(a0,a1)}function ___syscall20(which,varargs){SYSCALLS.varargs=varargs;try{return PROCINFO.pid}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall200(a0,a1){return ___syscall202(a0,a1)}function ___syscall201(a0,a1){return ___syscall202(a0,a1)}function ___syscall205(which,varargs){SYSCALLS.varargs=varargs;try{var size=SYSCALLS.get(),list=SYSCALLS.get();if(size<1)return-ERRNO_CODES.EINVAL;HEAP32[list>>2]=0;return 1}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall207(which,varargs){SYSCALLS.varargs=varargs;try{var fd=SYSCALLS.get(),owner=SYSCALLS.get(),group=SYSCALLS.get();FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall212(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),owner=SYSCALLS.get(),group=SYSCALLS.get();FS.chown(path,owner,group);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall220(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),dirp=SYSCALLS.get(),count=SYSCALLS.get();if(!stream.getdents){stream.getdents=FS.readdir(stream.path)}var pos=0;while(stream.getdents.length>0&&pos+268<=count){var id;var type;var name=stream.getdents.pop();if(name[0]==="."){id=1;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP32[dirp+pos>>2]=id;HEAP32[dirp+pos+4>>2]=stream.position;HEAP16[dirp+pos+8>>1]=268;HEAP8[dirp+pos+10>>0]=type;stringToUTF8(name,dirp+pos+11,256);pos+=268}return pos}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall29(which,varargs){SYSCALLS.varargs=varargs;try{return-ERRNO_CODES.EINTR}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall3(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get();return FS.read(stream,HEAP8,buf,count)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall301(which,varargs){SYSCALLS.varargs=varargs;try{var dirfd=SYSCALLS.get(),path=SYSCALLS.getStr(),flags=SYSCALLS.get();path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall302(which,varargs){SYSCALLS.varargs=varargs;try{var olddirfd=SYSCALLS.get(),oldpath=SYSCALLS.getStr(),newdirfd=SYSCALLS.get(),newpath=SYSCALLS.getStr();oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall303(which,varargs){SYSCALLS.varargs=varargs;try{return-ERRNO_CODES.EMLINK}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall33(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),amode=SYSCALLS.get();return SYSCALLS.doAccess(path,amode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall330(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD(),suggestFD=SYSCALLS.get(),flags=SYSCALLS.get();if(old.fd===suggestFD)return-ERRNO_CODES.EINVAL;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall331(which,varargs){SYSCALLS.varargs=varargs;try{return-ERRNO_CODES.ENOSYS}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall34(which,varargs){SYSCALLS.varargs=varargs;try{var inc=SYSCALLS.get();return-ERRNO_CODES.EPERM}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall38(which,varargs){SYSCALLS.varargs=varargs;try{var old_path=SYSCALLS.getStr(),new_path=SYSCALLS.getStr();FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall39(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),mode=SYSCALLS.get();return SYSCALLS.doMkdir(path,mode)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall4(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),buf=SYSCALLS.get(),count=SYSCALLS.get();return FS.write(stream,HEAP8,buf,count)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall40(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall41(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD();return FS.open(old.path,old.flags,0).fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PIPEFS={BUCKET_BUFFER_SIZE:8192,mount:function(mount){return FS.createNode(null,"/",16384|511,0)},createPipe:function(){var pipe={buckets:[]};pipe.buckets.push({buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0});var rName=PIPEFS.nextname();var wName=PIPEFS.nextname();var rNode=FS.createNode(PIPEFS.root,rName,4096,0);var wNode=FS.createNode(PIPEFS.root,wName,4096,0);rNode.pipe=pipe;wNode.pipe=pipe;var readableStream=FS.createStream({path:rName,node:rNode,flags:FS.modeStringToFlags("r"),seekable:false,stream_ops:PIPEFS.stream_ops});rNode.stream=readableStream;var writableStream=FS.createStream({path:wName,node:wNode,flags:FS.modeStringToFlags("w"),seekable:false,stream_ops:PIPEFS.stream_ops});wNode.stream=writableStream;return{readable_fd:readableStream.fd,writable_fd:writableStream.fd}},stream_ops:{poll:function(stream){var pipe=stream.node.pipe;if((stream.flags&2097155)===1){return 256|4}else{if(pipe.buckets.length>0){for(var i=0;i<pipe.buckets.length;i++){var bucket=pipe.buckets[i];if(bucket.offset-bucket.roffset>0){return 64|1}}}}return 0},ioctl:function(stream,request,varargs){return ERRNO_CODES.EINVAL},read:function(stream,buffer,offset,length,position){var pipe=stream.node.pipe;var currentLength=0;for(var i=0;i<pipe.buckets.length;i++){var bucket=pipe.buckets[i];currentLength+=bucket.offset-bucket.roffset}assert(buffer instanceof ArrayBuffer||ArrayBuffer.isView(buffer));var data=buffer.subarray(offset,offset+length);if(length<=0){return 0}if(currentLength==0){throw new FS.ErrnoError(ERRNO_CODES.EAGAIN)}var toRead=Math.min(currentLength,length);var totalRead=toRead;var toRemove=0;for(var i=0;i<pipe.buckets.length;i++){var currBucket=pipe.buckets[i];var bucketSize=currBucket.offset-currBucket.roffset;if(toRead<=bucketSize){var tmpSlice=currBucket.buffer.subarray(currBucket.roffset,currBucket.offset);if(toRead<bucketSize){tmpSlice=tmpSlice.subarray(0,toRead);currBucket.roffset+=toRead}else{toRemove++}data.set(tmpSlice);break}else{var tmpSlice=currBucket.buffer.subarray(currBucket.roffset,currBucket.offset);data.set(tmpSlice);data=data.subarray(tmpSlice.byteLength);toRead-=tmpSlice.byteLength;toRemove++}}if(toRemove&&toRemove==pipe.buckets.length){toRemove--;pipe.buckets[toRemove].offset=0;pipe.buckets[toRemove].roffset=0}pipe.buckets.splice(0,toRemove);return totalRead},write:function(stream,buffer,offset,length,position){var pipe=stream.node.pipe;assert(buffer instanceof ArrayBuffer||ArrayBuffer.isView(buffer));var data=buffer.subarray(offset,offset+length);var dataLen=data.byteLength;if(dataLen<=0){return 0}var currBucket=null;if(pipe.buckets.length==0){currBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:0,roffset:0};pipe.buckets.push(currBucket)}else{currBucket=pipe.buckets[pipe.buckets.length-1]}assert(currBucket.offset<=PIPEFS.BUCKET_BUFFER_SIZE);var freeBytesInCurrBuffer=PIPEFS.BUCKET_BUFFER_SIZE-currBucket.offset;if(freeBytesInCurrBuffer>=dataLen){currBucket.buffer.set(data,currBucket.offset);currBucket.offset+=dataLen;return dataLen}else if(freeBytesInCurrBuffer>0){currBucket.buffer.set(data.subarray(0,freeBytesInCurrBuffer),currBucket.offset);currBucket.offset+=freeBytesInCurrBuffer;data=data.subarray(freeBytesInCurrBuffer,data.byteLength)}var numBuckets=data.byteLength/PIPEFS.BUCKET_BUFFER_SIZE|0;var remElements=data.byteLength%PIPEFS.BUCKET_BUFFER_SIZE;for(var i=0;i<numBuckets;i++){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:PIPEFS.BUCKET_BUFFER_SIZE,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data.subarray(0,PIPEFS.BUCKET_BUFFER_SIZE));data=data.subarray(PIPEFS.BUCKET_BUFFER_SIZE,data.byteLength)}if(remElements>0){var newBucket={buffer:new Uint8Array(PIPEFS.BUCKET_BUFFER_SIZE),offset:data.byteLength,roffset:0};pipe.buckets.push(newBucket);newBucket.buffer.set(data)}return dataLen},close:function(stream){var pipe=stream.node.pipe;pipe.buckets=null}},nextname:function(){if(!PIPEFS.nextname.current){PIPEFS.nextname.current=0}return"pipe["+PIPEFS.nextname.current+++"]"}};function ___syscall42(which,varargs){SYSCALLS.varargs=varargs;try{var fdPtr=SYSCALLS.get();if(fdPtr==0){throw new FS.ErrnoError(ERRNO_CODES.EFAULT)}var res=PIPEFS.createPipe();HEAP32[fdPtr>>2]=res.readable_fd;HEAP32[fdPtr+4>>2]=res.writable_fd;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21509:case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0}case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0}case 21524:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall57(which,varargs){SYSCALLS.varargs=varargs;try{var pid=SYSCALLS.get(),pgid=SYSCALLS.get();if(pid&&pid!==PROCINFO.pid)return-ERRNO_CODES.ESRCH;if(pgid&&pgid!==PROCINFO.pgid)return-ERRNO_CODES.EPERM;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall60(which,varargs){SYSCALLS.varargs=varargs;try{var mask=SYSCALLS.get();var old=SYSCALLS.umask;SYSCALLS.umask=mask;return old}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall63(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD(),suggestFD=SYSCALLS.get();if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall64(which,varargs){SYSCALLS.varargs=varargs;try{return PROCINFO.ppid}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall66(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall83(which,varargs){SYSCALLS.varargs=varargs;try{var target=SYSCALLS.getStr(),linkpath=SYSCALLS.getStr();FS.symlink(target,linkpath);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall85(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get(),bufsize=SYSCALLS.get();return SYSCALLS.doReadlink(path,buf,bufsize)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall9(which,varargs){SYSCALLS.varargs=varargs;try{var oldpath=SYSCALLS.get(),newpath=SYSCALLS.get();return-ERRNO_CODES.EMLINK}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall94(which,varargs){SYSCALLS.varargs=varargs;try{var fd=SYSCALLS.get(),mode=SYSCALLS.get();FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall96(which,varargs){SYSCALLS.varargs=varargs;try{return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall97(which,varargs){SYSCALLS.varargs=varargs;try{return-ERRNO_CODES.EPERM}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___unlock(){}function _exit(status){exit(status)}function __exit(a0){return _exit(a0)}function _abort(){Module["abort"]()}var __sigalrm_handler=0;function _alarm(seconds){setTimeout(function(){if(__sigalrm_handler)dynCall_vi(__sigalrm_handler,0)},seconds*1e3)}var ___tm_formatted=1278320;function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()<winter.getTimezoneOffset()){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _mktime(tmPtr){_tzset();var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(2e3,6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return date.getTime()/1e3|0}function _asctime_r(tmPtr,buf){var date={tm_sec:HEAP32[tmPtr>>2],tm_min:HEAP32[tmPtr+4>>2],tm_hour:HEAP32[tmPtr+8>>2],tm_mday:HEAP32[tmPtr+12>>2],tm_mon:HEAP32[tmPtr+16>>2],tm_year:HEAP32[tmPtr+20>>2],tm_wday:HEAP32[tmPtr+24>>2]};var days=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];var months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var s=days[date.tm_wday]+" "+months[date.tm_mon]+(date.tm_mday<10?" ":" ")+date.tm_mday+(date.tm_hour<10?" 0":" ")+date.tm_hour+(date.tm_min<10?":0":":")+date.tm_min+(date.tm_sec<10?":0":":")+date.tm_sec+" "+(1900+date.tm_year)+"\n";stringToUTF8(s,buf,26);return buf}function _asctime(tmPtr){return _asctime_r(tmPtr,___tm_formatted)}function _chroot(path){___setErrNo(13);return-1}function _clearenv(){ENV={};___buildEnvironment(__get_environ());return 0}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}var ___tm_current=1278256;var ___tm_timezone=(stringToUTF8("GMT",1278304,4),1278304);function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(2e3,6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _ctime_r(time,buf){var stack=stackSave();var rv=_asctime_r(_localtime_r(time,stackAlloc(44)),buf);stackRestore(stack);return rv}function _ctime(timer){return _ctime_r(timer,___tm_current)}function _difftime(time1,time0){return time1-time0}function _emscripten_get_heap_size(){return TOTAL_MEMORY}function _longjmp(env,value){_setThrew(env,value||1);throw"longjmp"}function _emscripten_longjmp(env,value){_longjmp(env,value)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function emscripten_realloc_buffer(size){var PAGE_MULTIPLE=65536;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;try{var result=wasmMemory.grow((size-oldSize)/65536);if(result!==(-1|0)){return Module["buffer"]=wasmMemory.buffer}else{return null}}catch(e){return null}}function _emscripten_resize_heap(requestedSize){var oldSize=_emscripten_get_heap_size();var PAGE_MULTIPLE=65536;var LIMIT=2147483648-PAGE_MULTIPLE;if(requestedSize>LIMIT){return false}var MIN_TOTAL_MEMORY=16777216;var newSize=Math.max(oldSize,MIN_TOTAL_MEMORY);while(newSize<requestedSize){if(newSize<=536870912){newSize=alignUp(2*newSize,PAGE_MULTIPLE)}else{newSize=Math.min(alignUp((3*newSize+2147483648)/4,PAGE_MULTIPLE),LIMIT)}}var replacement=emscripten_realloc_buffer(newSize);if(!replacement||replacement.byteLength!=newSize){return false}updateGlobalBuffer(replacement);updateGlobalBufferViews();TOTAL_MEMORY=newSize;HEAPU32[DYNAMICTOP_PTR>>2]=requestedSize;return true}function _endprotoent(){}function _endpwent(){throw"endpwent: TODO"}function _execl(){___setErrNo(8);return-1}function _execv(){return _execl.apply(null,arguments)}function _execvp(){return _execl.apply(null,arguments)}function _flock(fd,operation){return 0}function _fork(){___setErrNo(95);return-1}function _fpathconf(fildes,name){switch(name){case 0:return 32e3;case 1:case 2:case 3:return 255;case 4:case 5:case 16:case 17:case 18:return 4096;case 6:case 7:case 20:return 1;case 8:return 0;case 9:case 10:case 11:case 12:case 14:case 15:case 19:return-1;case 13:return 64}___setErrNo(22);return-1}var GAI_ERRNO_MESSAGES={};function _gai_strerror(val){var buflen=256;if(!_gai_strerror.buffer){_gai_strerror.buffer=_malloc(buflen);GAI_ERRNO_MESSAGES["0"]="Success";GAI_ERRNO_MESSAGES[""+-1]="Invalid value for 'ai_flags' field";GAI_ERRNO_MESSAGES[""+-2]="NAME or SERVICE is unknown";GAI_ERRNO_MESSAGES[""+-3]="Temporary failure in name resolution";GAI_ERRNO_MESSAGES[""+-4]="Non-recoverable failure in name res";GAI_ERRNO_MESSAGES[""+-6]="'ai_family' not supported";GAI_ERRNO_MESSAGES[""+-7]="'ai_socktype' not supported";GAI_ERRNO_MESSAGES[""+-8]="SERVICE not supported for 'ai_socktype'";GAI_ERRNO_MESSAGES[""+-10]="Memory allocation failure";GAI_ERRNO_MESSAGES[""+-11]="System error returned in 'errno'";GAI_ERRNO_MESSAGES[""+-12]="Argument buffer overflow"}var msg="Unknown error";if(val in GAI_ERRNO_MESSAGES){if(GAI_ERRNO_MESSAGES[val].length>buflen-1){msg="Message too long"}else{msg=GAI_ERRNO_MESSAGES[val]}}writeAsciiToMemory(msg,_gai_strerror.buffer);return _gai_strerror.buffer}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var res;salen=family===10?28:16;addr=family===10?__inet_ntop6_raw(addr):__inet_ntop4_raw(addr);sa=_malloc(salen);res=__write_sockaddr(sa,family,addr,port);assert(!res.errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAP32[ai+24>>2]=canon;HEAP32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAP32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=__inet_pton4_raw(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=__inet_pton6_raw(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAP32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=__inet_pton4_raw(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAP32[out>>2]=ai;return 0}function _getenv(name){if(name===0)return 0;name=UTF8ToString(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocateUTF8(ENV[name]);return _getenv.ret}function _getgrgid(){err("missing function: getgrgid");abort(-1)}function _getgrnam(){err("missing function: getgrnam");abort(-1)}function _gethostbyname(name){name=UTF8ToString(name);var ret=_malloc(20);var nameBuf=_malloc(name.length+1);stringToUTF8(name,nameBuf,name.length+1);HEAP32[ret>>2]=nameBuf;var aliasesBuf=_malloc(4);HEAP32[aliasesBuf>>2]=0;HEAP32[ret+4>>2]=aliasesBuf;var afinet=2;HEAP32[ret+8>>2]=afinet;HEAP32[ret+12>>2]=4;var addrListBuf=_malloc(12);HEAP32[addrListBuf>>2]=addrListBuf+8;HEAP32[addrListBuf+4>>2]=0;HEAP32[addrListBuf+8>>2]=__inet_pton4_raw(DNS.lookup_name(name));HEAP32[ret+16>>2]=addrListBuf;return ret}function _getitimer(){throw"getitimer() is not implemented yet"}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=__read_sockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}var Protocols={list:[],map:{}};function _setprotoent(stayopen){function allocprotoent(name,proto,aliases){var nameBuf=_malloc(name.length+1);writeAsciiToMemory(name,nameBuf);var j=0;var length=aliases.length;var aliasListBuf=_malloc((length+1)*4);for(var i=0;i<length;i++,j+=4){var alias=aliases[i];var aliasBuf=_malloc(alias.length+1);writeAsciiToMemory(alias,aliasBuf);HEAP32[aliasListBuf+j>>2]=aliasBuf}HEAP32[aliasListBuf+j>>2]=0;var pe=_malloc(12);HEAP32[pe>>2]=nameBuf;HEAP32[pe+4>>2]=aliasListBuf;HEAP32[pe+8>>2]=proto;return pe}var list=Protocols.list;var map=Protocols.map;if(list.length===0){var entry=allocprotoent("tcp",6,["TCP"]);list.push(entry);map["tcp"]=map["6"]=entry;entry=allocprotoent("udp",17,["UDP"]);list.push(entry);map["udp"]=map["17"]=entry}_setprotoent.index=0}function _getprotobyname(name){name=UTF8ToString(name);_setprotoent(true);var result=Protocols.map[name];return result}function _getprotobynumber(number){_setprotoent(true);var result=Protocols.map[number];return result}function _getprotoent(number){if(_setprotoent.index===Protocols.list.length){return 0}else{var result=Protocols.list[_setprotoent.index++];return result}}function _getpwent(){throw"getpwent: TODO"}function _getpwnam(){throw"getpwnam: TODO"}function _getpwuid(uid){return 0}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _gmtime(time){return _gmtime_r(time,___tm_current)}function _kill(pid,sig){___setErrNo(ERRNO_CODES.EPERM);return-1}function _llvm_exp2_f32(x){return Math.pow(2,x)}function _llvm_exp2_f64(a0){return _llvm_exp2_f32(a0)}function _llvm_fma_f64(){err("missing function: llvm_fma_f64");abort(-1)}function _llvm_log10_f32(x){return Math.log(x)/Math.LN10}function _llvm_log10_f64(a0){return _llvm_log10_f32(a0)}function _llvm_log2_f32(x){return Math.log(x)/Math.LN2}function _llvm_log2_f64(a0){return _llvm_log2_f32(a0)}function _llvm_trap(){abort("trap!")}var _llvm_trunc_f64=Math_trunc;function _localtime(time){return _localtime_r(time,___tm_current)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest)}function _usleep(useconds){var msec=useconds/1e3;if((ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]){var start=self["performance"]["now"]();while(self["performance"]["now"]()-start<msec){}}else{var start=Date.now();while(Date.now()-start<msec){}}return 0}Module["_usleep"]=_usleep;function _nanosleep(rqtp,rmtp){var seconds=HEAP32[rqtp>>2];var nanoseconds=HEAP32[rqtp+4>>2];if(rmtp!==0){HEAP32[rmtp>>2]=0;HEAP32[rmtp+4>>2]=0}return _usleep(seconds*1e6+nanoseconds/1e3)}function _pathconf(){return _fpathconf.apply(null,arguments)}function _putenv(string){if(string===0){___setErrNo(22);return-1}string=UTF8ToString(string);var splitPoint=string.indexOf("=");if(string===""||string.indexOf("=")===-1){___setErrNo(22);return-1}var name=string.slice(0,splitPoint);var value=string.slice(splitPoint+1);if(!(name in ENV)||ENV[name]!==value){ENV[name]=value;___buildEnvironment(__get_environ())}return 0}function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:var maxHeapSize=2*1024*1024*1024-65536;return maxHeapSize/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(22);return-1}function _setgroups(ngroups,gidset){if(ngroups<1||ngroups>_sysconf(3)){___setErrNo(22);return-1}else{___setErrNo(1);return-1}}function _setitimer(){throw"setitimer() is not implemented yet"}function _setpwent(){throw"setpwent: TODO"}function _sigaction(signum,act,oldact){return 0}function _sigaddset(set,signum){HEAP32[set>>2]=HEAP32[set>>2]|1<<signum-1;return 0}function _sigdelset(set,signum){HEAP32[set>>2]=HEAP32[set>>2]&~(1<<signum-1);return 0}function _sigemptyset(set){HEAP32[set>>2]=0;return 0}function _sigfillset(set){HEAP32[set>>2]=-1>>>0;return 0}function _sigismember(set,signum){return HEAP32[set>>2]&1<<signum-1}function _signal(sig,func){if(sig==14){__sigalrm_handler=func}else{}return 0}function _sigpending(set){HEAP32[set>>2]=0;return 0}function _sigprocmask(){return 0}function _sigsuspend(){err("missing function: sigsuspend");abort(-1)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,"0")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()<date.tm_year+1900){daysDifference=date.tm_yday+32-firstWeekStartThisYear.getDate()}else{daysDifference=date.tm_yday+1-firstWeekStartThisYear.getDate()}return leadingNulls(Math.ceil(daysDifference/7),2)},"%w":function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()},"%W":function(date){var janFirst=new Date(date.tm_year,0,1);var firstMonday=janFirst.getDay()===1?janFirst:__addDays(janFirst,janFirst.getDay()===0?1:7-janFirst.getDay()+1);var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstMonday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstMondayUntilEndJanuary=31-firstMonday.getDate();var days=firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstMonday,janFirst)===0?"01":"00"},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function _times(buffer){if(buffer!==0){_memset(buffer,0,16)}return 0}function _unsetenv(name){if(name===0){___setErrNo(22);return-1}name=UTF8ToString(name);if(name===""||name.indexOf("=")!==-1){___setErrNo(22);return-1}if(ENV.hasOwnProperty(name)){delete ENV[name];___buildEnvironment(__get_environ())}return 0}function _utime(path,times){var time;if(times){var offset=4;time=HEAP32[times+offset>>2];time*=1e3}else{time=Date.now()}path=UTF8ToString(path);try{FS.utime(path,time,time);return 0}catch(e){FS.handleFSError(e);return-1}}function _wait(stat_loc){___setErrNo(10);return-1}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=function(){return self["performance"]["now"]()}}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=function(){return performance["now"]()}}else{_emscripten_get_now=Date.now}FS.staticInit();Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function invoke_i(index){var sp=stackSave();try{return dynCall_i(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return dynCall_ii(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return dynCall_iii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return dynCall_iiii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return dynCall_iiiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_iiiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{return dynCall_iiiiiii(index,a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_v(index){var sp=stackSave();try{dynCall_v(index)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{dynCall_vi(index,a1)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viii(index,a1,a2,a3){var sp=stackSave();try{dynCall_viii(index,a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{dynCall_viiii(index,a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}var asmGlobalArg={};var asmLibraryArg={"abort":abort,"setTempRet0":setTempRet0,"getTempRet0":getTempRet0,"invoke_i":invoke_i,"invoke_ii":invoke_ii,"invoke_iii":invoke_iii,"invoke_iiii":invoke_iiii,"invoke_iiiii":invoke_iiiii,"invoke_iiiiiii":invoke_iiiiiii,"invoke_v":invoke_v,"invoke_vi":invoke_vi,"invoke_vii":invoke_vii,"invoke_viii":invoke_viii,"invoke_viiii":invoke_viiii,"___assert_fail":___assert_fail,"___buildEnvironment":___buildEnvironment,"___clock_gettime":___clock_gettime,"___lock":___lock,"___map_file":___map_file,"___setErrNo":___setErrNo,"___syscall10":___syscall10,"___syscall102":___syscall102,"___syscall118":___syscall118,"___syscall12":___syscall12,"___syscall122":___syscall122,"___syscall132":___syscall132,"___syscall133":___syscall133,"___syscall14":___syscall14,"___syscall140":___syscall140,"___syscall142":___syscall142,"___syscall145":___syscall145,"___syscall146":___syscall146,"___syscall15":___syscall15,"___syscall168":___syscall168,"___syscall183":___syscall183,"___syscall193":___syscall193,"___syscall194":___syscall194,"___syscall195":___syscall195,"___syscall196":___syscall196,"___syscall197":___syscall197,"___syscall198":___syscall198,"___syscall199":___syscall199,"___syscall20":___syscall20,"___syscall200":___syscall200,"___syscall201":___syscall201,"___syscall202":___syscall202,"___syscall205":___syscall205,"___syscall207":___syscall207,"___syscall212":___syscall212,"___syscall220":___syscall220,"___syscall221":___syscall221,"___syscall29":___syscall29,"___syscall3":___syscall3,"___syscall301":___syscall301,"___syscall302":___syscall302,"___syscall303":___syscall303,"___syscall33":___syscall33,"___syscall330":___syscall330,"___syscall331":___syscall331,"___syscall34":___syscall34,"___syscall38":___syscall38,"___syscall39":___syscall39,"___syscall4":___syscall4,"___syscall40":___syscall40,"___syscall41":___syscall41,"___syscall42":___syscall42,"___syscall5":___syscall5,"___syscall54":___syscall54,"___syscall57":___syscall57,"___syscall6":___syscall6,"___syscall60":___syscall60,"___syscall63":___syscall63,"___syscall64":___syscall64,"___syscall66":___syscall66,"___syscall83":___syscall83,"___syscall85":___syscall85,"___syscall9":___syscall9,"___syscall91":___syscall91,"___syscall94":___syscall94,"___syscall96":___syscall96,"___syscall97":___syscall97,"___unlock":___unlock,"__addDays":__addDays,"__arraySum":__arraySum,"__exit":__exit,"__inet_ntop4_raw":__inet_ntop4_raw,"__inet_ntop6_raw":__inet_ntop6_raw,"__inet_pton4_raw":__inet_pton4_raw,"__inet_pton6_raw":__inet_pton6_raw,"__isLeapYear":__isLeapYear,"__read_sockaddr":__read_sockaddr,"__write_sockaddr":__write_sockaddr,"_abort":_abort,"_alarm":_alarm,"_asctime":_asctime,"_asctime_r":_asctime_r,"_chroot":_chroot,"_clearenv":_clearenv,"_clock":_clock,"_clock_gettime":_clock_gettime,"_ctime":_ctime,"_ctime_r":_ctime_r,"_difftime":_difftime,"_emscripten_get_heap_size":_emscripten_get_heap_size,"_emscripten_get_now":_emscripten_get_now,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_emscripten_longjmp":_emscripten_longjmp,"_emscripten_memcpy_big":_emscripten_memcpy_big,"_emscripten_resize_heap":_emscripten_resize_heap,"_endprotoent":_endprotoent,"_endpwent":_endpwent,"_execl":_execl,"_execv":_execv,"_execvp":_execvp,"_exit":_exit,"_flock":_flock,"_fork":_fork,"_fpathconf":_fpathconf,"_gai_strerror":_gai_strerror,"_getaddrinfo":_getaddrinfo,"_getenv":_getenv,"_getgrgid":_getgrgid,"_getgrnam":_getgrnam,"_gethostbyname":_gethostbyname,"_getitimer":_getitimer,"_getnameinfo":_getnameinfo,"_getprotobyname":_getprotobyname,"_getprotobynumber":_getprotobynumber,"_getprotoent":_getprotoent,"_getpwent":_getpwent,"_getpwnam":_getpwnam,"_getpwuid":_getpwuid,"_gettimeofday":_gettimeofday,"_gmtime":_gmtime,"_gmtime_r":_gmtime_r,"_js_eval_js":_js_eval_js,"_kill":_kill,"_llvm_exp2_f32":_llvm_exp2_f32,"_llvm_exp2_f64":_llvm_exp2_f64,"_llvm_fma_f64":_llvm_fma_f64,"_llvm_log10_f32":_llvm_log10_f32,"_llvm_log10_f64":_llvm_log10_f64,"_llvm_log2_f32":_llvm_log2_f32,"_llvm_log2_f64":_llvm_log2_f64,"_llvm_trap":_llvm_trap,"_llvm_trunc_f64":_llvm_trunc_f64,"_localtime":_localtime,"_localtime_r":_localtime_r,"_longjmp":_longjmp,"_mktime":_mktime,"_nanosleep":_nanosleep,"_pathconf":_pathconf,"_putenv":_putenv,"_setgroups":_setgroups,"_setitimer":_setitimer,"_setprotoent":_setprotoent,"_setpwent":_setpwent,"_sigaction":_sigaction,"_sigaddset":_sigaddset,"_sigdelset":_sigdelset,"_sigemptyset":_sigemptyset,"_sigfillset":_sigfillset,"_sigismember":_sigismember,"_signal":_signal,"_sigpending":_sigpending,"_sigprocmask":_sigprocmask,"_sigsuspend":_sigsuspend,"_strftime":_strftime,"_sysconf":_sysconf,"_time":_time,"_times":_times,"_tzset":_tzset,"_unsetenv":_unsetenv,"_usleep":_usleep,"_utime":_utime,"_wait":_wait,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"emscripten_realloc_buffer":emscripten_realloc_buffer,"tempDoublePtr":tempDoublePtr,"DYNAMICTOP_PTR":DYNAMICTOP_PTR};var asm=Module["asm"](asmGlobalArg,asmLibraryArg,buffer);Module["asm"]=asm;var _Perl_call_argv=Module["_Perl_call_argv"]=function(){return Module["asm"]["_Perl_call_argv"].apply(null,arguments)};var _Perl_call_method=Module["_Perl_call_method"]=function(){return Module["asm"]["_Perl_call_method"].apply(null,arguments)};var _Perl_call_pv=Module["_Perl_call_pv"]=function(){return Module["asm"]["_Perl_call_pv"].apply(null,arguments)};var _Perl_call_sv=Module["_Perl_call_sv"]=function(){return Module["asm"]["_Perl_call_sv"].apply(null,arguments)};var _Perl_eval_pv=Module["_Perl_eval_pv"]=function(){return Module["asm"]["_Perl_eval_pv"].apply(null,arguments)};var _Perl_eval_sv=Module["_Perl_eval_sv"]=function(){return Module["asm"]["_Perl_eval_sv"].apply(null,arguments)};var ___em_js__js_eval_js=Module["___em_js__js_eval_js"]=function(){return Module["asm"]["___em_js__js_eval_js"].apply(null,arguments)};var ___emscripten_environ_constructor=Module["___emscripten_environ_constructor"]=function(){return Module["asm"]["___emscripten_environ_constructor"].apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return Module["asm"]["___errno_location"].apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return Module["asm"]["__get_daylight"].apply(null,arguments)};var __get_environ=Module["__get_environ"]=function(){return Module["asm"]["__get_environ"].apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return Module["asm"]["__get_timezone"].apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return Module["asm"]["__get_tzname"].apply(null,arguments)};var _emperl_end_perl=Module["_emperl_end_perl"]=function(){return Module["asm"]["_emperl_end_perl"].apply(null,arguments)};var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=function(){return Module["asm"]["_emscripten_replace_memory"].apply(null,arguments)};var _free=Module["_free"]=function(){return Module["asm"]["_free"].apply(null,arguments)};var _htonl=Module["_htonl"]=function(){return Module["asm"]["_htonl"].apply(null,arguments)};var _htons=Module["_htons"]=function(){return Module["asm"]["_htons"].apply(null,arguments)};var _llvm_bswap_i16=Module["_llvm_bswap_i16"]=function(){return Module["asm"]["_llvm_bswap_i16"].apply(null,arguments)};var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=function(){return Module["asm"]["_llvm_bswap_i32"].apply(null,arguments)};var _llvm_maxnum_f64=Module["_llvm_maxnum_f64"]=function(){return Module["asm"]["_llvm_maxnum_f64"].apply(null,arguments)};var _llvm_minnum_f64=Module["_llvm_minnum_f64"]=function(){return Module["asm"]["_llvm_minnum_f64"].apply(null,arguments)};var _llvm_nearbyint_f64=Module["_llvm_nearbyint_f64"]=function(){return Module["asm"]["_llvm_nearbyint_f64"].apply(null,arguments)};var _llvm_rint_f64=Module["_llvm_rint_f64"]=function(){return Module["asm"]["_llvm_rint_f64"].apply(null,arguments)};var _llvm_round_f64=Module["_llvm_round_f64"]=function(){return Module["asm"]["_llvm_round_f64"].apply(null,arguments)};var _main=Module["_main"]=function(){return Module["asm"]["_main"].apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return Module["asm"]["_malloc"].apply(null,arguments)};var _memcpy=Module["_memcpy"]=function(){return Module["asm"]["_memcpy"].apply(null,arguments)};var _memmove=Module["_memmove"]=function(){return Module["asm"]["_memmove"].apply(null,arguments)};var _memset=Module["_memset"]=function(){return Module["asm"]["_memset"].apply(null,arguments)};var _ntohs=Module["_ntohs"]=function(){return Module["asm"]["_ntohs"].apply(null,arguments)};var _realloc=Module["_realloc"]=function(){return Module["asm"]["_realloc"].apply(null,arguments)};var _round=Module["_round"]=function(){return Module["asm"]["_round"].apply(null,arguments)};var _saveSetjmp=Module["_saveSetjmp"]=function(){return Module["asm"]["_saveSetjmp"].apply(null,arguments)};var _sbrk=Module["_sbrk"]=function(){return Module["asm"]["_sbrk"].apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return Module["asm"]["_setThrew"].apply(null,arguments)};var _testSetjmp=Module["_testSetjmp"]=function(){return Module["asm"]["_testSetjmp"].apply(null,arguments)};var _webperl_eval_perl=Module["_webperl_eval_perl"]=function(){return Module["asm"]["_webperl_eval_perl"].apply(null,arguments)};var establishStackSpace=Module["establishStackSpace"]=function(){return Module["asm"]["establishStackSpace"].apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return Module["asm"]["stackAlloc"].apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return Module["asm"]["stackRestore"].apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return Module["asm"]["stackSave"].apply(null,arguments)};var dynCall_d=Module["dynCall_d"]=function(){return Module["asm"]["dynCall_d"].apply(null,arguments)};var dynCall_i=Module["dynCall_i"]=function(){return Module["asm"]["dynCall_i"].apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return Module["asm"]["dynCall_iiiiii"].apply(null,arguments)};var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=function(){return Module["asm"]["dynCall_iiiiiii"].apply(null,arguments)};var dynCall_iiiiiiii=Module["dynCall_iiiiiiii"]=function(){return Module["asm"]["dynCall_iiiiiiii"].apply(null,arguments)};var dynCall_iiiiiiiii=Module["dynCall_iiiiiiiii"]=function(){return Module["asm"]["dynCall_iiiiiiiii"].apply(null,arguments)};var dynCall_iiiiiiiiiii=Module["dynCall_iiiiiiiiiii"]=function(){return Module["asm"]["dynCall_iiiiiiiiiii"].apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return Module["asm"]["dynCall_v"].apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return Module["asm"]["dynCall_vi"].apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return Module["asm"]["dynCall_viii"].apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return Module["asm"]["dynCall_viiii"].apply(null,arguments)};Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["getMemory"]=getMemory;Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;var argv=stackAlloc((argc+1)*4);HEAP32[argv>>2]=allocateUTF8OnStack(Module["thisProgram"]);for(var i=1;i<argc;i++){HEAP32[(argv>>2)+i]=allocateUTF8OnStack(args[i-1])}HEAP32[(argv>>2)+argc]=0;try{var ret=Module["_main"](argc,argv,0);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="SimulateInfiniteLoop"){Module["noExitRuntime"]=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);Module["quit"](1,e)}}finally{calledMain=true}};function run(args){args=args||Module["arguments"];if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]&&status===0){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}Module["quit"](status,new ExitStatus(status))}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(what!==undefined){out(what);err(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;throw"abort("+what+"). Build with -s ASSERTIONS=1 for more info."}Module["abort"]=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}Module["noExitRuntime"]=true;run(); diff --git a/lib/webperl/emperl.wasm b/lib/webperl/emperl.wasm new file mode 100644 index 0000000000000000000000000000000000000000..006a403433eec403820fdcf2e9e576f56480f4fb GIT binary patch literal 3734063 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�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⋘^!u3XArI@ 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%0A7s}!P^&5@Ufk-Jh6Y8M)8 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ʙ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�kJd_(Zwt7sSN3KSm&+P><3dA+|qP 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Ξn!>{~^pS%NbjM_ExCjB53Oi27Gb8m?40kECG`HkiWNBx#hr8J9G;1f>Gh zYHv)^u--&TW0n9YgbC_vyO7H9195s>lt?8KAYtrvGw{8Pw-hDz>K$Un9v3C{RNw8< zJ9cy%qW+=!ZiC)|ZZpu*1X|ikxe6T~kRAm%h_<{qD*1xT(^tY#L!}^5BS?x62?7O? zBUqad3qxXk4Ouz8A`(nI+_*5bAmIajsRC-EnCx(7qBZ9x5Yuj|R0T$1b)wU6zz_ls zk&@_`INphxur6Q0jI*Pb_RK%E6)Kg6qK31g;3a$<87kj3k0t!#1HEInLn)g<PO4#{ zYy^cs5a|_`trGyMHbIh)-D9S@nrsnB9HC$R6~EZr#_rsaSTFLyra8n#cq)=bz-b-E z4Wu<N{wkfNkA!>$URn1p$g`>d1!pzpdG(CnX~#T8j8qy45M`*{=9kQ|5V>Vs^gzC7 zl@Sq%0!@_$!^~ivPC=_2S*)zrHA?1TWbz9GagVkN+0Z~s8mCeO<<a1{VqL-!^Df#Y z84byTXFBh*Gs8s9DSWIz9Y6;GLu#HDz_4323*KQ|9aN))TH=;sMh$wI2&<fyUAH0< znQ`GN^Qiag3qqdWTTrWXhauFsFOBfpVxu?#VFi?qK|omA#ajtR76a20)_M{20xQ?$ zSGyA~Q=TW<niA;x+WHYyCrN?@iknS{BEv%1tdVy}VE*vU6d&TW<=!<kk*S9^mraBl zJ%*YHv7Bvcj=lq$ARNqbG)1RvJxN9tI;I0Kq%PMOBw@wAAX&{oR_X=C>8n<i3AEsf z;(NfAYl1cZsN;3GFum@XDkzaH<hD>pd;EtL^~JrWgEJ3ra=F<S)Xa5#<{(|9GKKb_ zAweq}=;8?4Q!;s}1nlNnw7!j*Eb3>bV9J&H$)J7-9$r7YVfBCZAd-!ofV4gne&kgb zprA!><+fVMmGhM*<~23akLZGQ`c9tpG16SMa_t1$ukw3HQFW;ou*8e(g-TvTFGlb; z(T!!O{ZpKh^Y=-mv~ud2ORjMhi5R#m5Ez30FJArB)%NKvV4flI)GT<!7}S?+$uJjM zEh^%(z}ZdRX1Q+2$J*?K9XdeS?7=?f(pnDhY=Nbl5j_X2z|BE{;zUFxHLR#Gm9tD# zb3%t|$czk83&NK)A16V6@m|(HuYAxVY6%}XonQ@Uk}ML_=@m&lEGAxaM1hAS9RMQh ztUWovAF-fJn{$-W^h{XOK*D;JK};O^T2ub9V)vF|LfWh9s2t)9RH40^CV?In-LFeR z*u0W%R$!23*c=59W`dTlzzy??CHf1cIKWspt3<}3igY22BJ3As6dB0`iX`j`@nsC3 z$g7!fEdUfbfC5C!)Nu=+ujYHSem3X-5m+UpoWF4^k>Fk1SF?3TU-#9zT6*?0)Rivw zw5VHMRCM_J>vf*Tc(m*{=Z~l^9&BO<=DwI|XJBMZT$`z~DKqJ(0c_EuWKBA!MW<h( z0cGjhM>UsUtw%-^<cgX$;QOXWYuM&LnWaaSf?SQs%q61s<-Y(f(G1C(GG$ZB_?fk+ zxFW6@lrPiH8lY#|Ltaif!EQhGu7qpkm%2@|wxheLGc=2iRxObriwUNwU=&+$imhWC z0xNXrC$M5JawgJaZSej@LRKyJ(;oh_L)>SB?(`9d@lXvdzPIRA1T#^1Dk2YAcq+23 zaUjsmM7{@LL1?K+Yt<wfb(mH}@q%5?k+Paqkh($afg)HT&oXWiTsVh*#0XZVF6G2y zE>{FAwyrfms*p2vF*y$;LjA>&nL3lQ%7Bg{SfO)ZwP*;|c+Af120$$}j%S1%0DTl` zgx^qQiRJpxBaPS-c^nOUAP(J4N7uXRzDjuvE0cwobLFsO29p_b##=2a#Y^!JR!W5y z3~Sa{HE<M4@VCxi%BP(MqpJ(;C^rY%F$p#*L>c`s)xYXdD69G7x@(#PmN1{H6cmSn z+ooJ?vU!!-nWIqo=o3w`#RIZOO?7jhfGISfq6Aw2Karn=?^9m-K1@Ne5cf_n8y>?- z-ck_g*j@DqIS+>bb;&x2^Pv4ymzuPnBDNEp#}vQin0cx9)J)`_+`KoNU_bbef^HPh zita{`7$#Zd9>RCg>vIOQ;uE7~1OGI}z~XvOroGLW5uXK7L-e{Rjh1rO1V-R$C8VLp zvjS|2hrtdI3<DP}o|S(qEEEt$!E%B35`!}(e5!aOnL;o^U=3?}JNua0TLX%6ls4!U zs6|OSSd$v02yCUed-QiAu$7_YC=gK_@Ue(2W+=N(&{GIOBq}kbN^~pcjE2rkM7KiP zHugX#^~7YwCxFkBM<cSQ20M9&kVhj@ral>3L0?o3b`dYVWgHehP{4C0s-eR<2?p}s znP6~$3Nl-OMqpwOksmbGfZ|cr)EbvE(h9_ZyD;jJI0$OEpPxap10(rGOCm&VL<qyk z(6+U&H$n#Mrhz7|eZBCm+br;L7f!5P!GAFWa%ipiX`2%(19-bxS1W*XPhvxXFRSqo zi25Zi&|4a3xrxs3v4N6K8Fs>NjbIpKQO)Xc*Ey-`^XP}A3QW?ENPhAP=1?S!nWOK+ z59?M^HqmB(Y-l8~rRbPcrNNxap8}MsUld9u=R>IiKh7KAY8<5s+^Ymki!1pOQA)gM zgfCQE!IxsnM;AIJ@lGJUso;zC#=>*hlcBnVdriaGsx|@ZtGKF(K5(8@&D*c?s!lEq z`WEd2^!9jwC5|KRiOOd3ZFlfBA&RVb@v~r|3w^x<<Nprv=isVzF(l`RKWCy(TkD-b z9WMK<W-a}e<iBRUQ`d}%286;>=(&c+-FBpaM%mGd7VQ79@e<7GeB%|_$VTIB8hyLO zczcAE5|N7}NzFZ#k@hV7sPVRGk@k37T?Jo-NPAx)Z!`9<O^H^7n2rmfW#C6v1qdai zin7JUMcs4md0`s&6-VAv1A{+m6DE%RLxcST#!74;ECwe*cHx(e{3h*#8?skY;7qKS zhzE^!snENpCPAu?`i~KMP>TP6KkKg~_15^G#`w=Qzs~)>xu)z_o>7aRCg-SP^j^9* zp?Lnz58B@%BA;>P`05|n?bWBfc%YL%(BXvz>@(r=mpT~fOe^}+RL|dOub!;uPmWh# zfY?+q2{vO9<j^aW!0h6<2>Ov5SJdtMq!;5KyulNRWI7QdG~m$A;1JN`@OYDW+ejX0 zMhMsZdz9h5$<z{kDut1sVqs<*DO8#{SZV_c1KLE&VTa4Zx!a(K)O(>PdmFX@EE>Pd z!z7};^#^pQW1^G2JD}&C`e!evx~NJzdS-ui!Z)%U2SKn`IX(`Ol8CD<9hFYn>dI^9 zKlX3@_K$Y{uD@q(qGJ>d>yj{5)G5esItCl&AJrWhZB7#;i}@i0=hAEvWj;b&Mrp|r z`&5`6v2-p&$!r{Obyh={Ed}-`^o5w*JTK-8`P*q3X7Nr{*kGxBzE41RmRh&is&}<% zf}R#KXfvbx=$HX$u?OZ9%kIe3W=L@5r$$e(vSx<zmr2Gf_PA~gu&{2GEI6;$<oTm^ z_M$wU<h{{edL&OzlaClVHzhh+L+vb3Ws1x!Z3LShg;68gB2=R2na~3oBBY@Ex->wy zvoj!Rx<bv^kkF>w2-xlHb~3$2Qvh?O4ih_2-p9@}|JHfENzswlM>Kd+5n#PwO)EI9 zic7PHyrRv3e%eG>8QTnCC9H#>$<2TQ*H3H)_?X)b^pD4-1rhu@Ng?>~GeZx&PpSXE z4PVk%Eh9obdJNVI*Z~AW{Z=N)@xu=?*+0r6TiOt5OdC=wjIdX58|?-)QG(|v<}91` z5dv_8*f=)=loM07r4AB<&112S?u2hDxW5)6e;W<4Hj5aKivM5@3P%4ib=OCABWFk^ zex6Y`eWH~{saTZeIt@x|h(`T7RvcA8+6bML9j(;SX@gu&qI4i0e`%}Y5n-X#4X3*~ z1(Ec87bE4m>XPYVd!$#OPZoNUcc$9GEF<6G*B5JNnis<qd3uy<9Qcy@w2ii_X{^lX z8iZ;Yih%qXqwpB9Dyn4-!FS{qKv*z#nT*Z7trpRC!EChKb<)9ZmjwcLh+uI2ymTnm z`dj|oFJbT=(zRB61AkI?X&=gL-3LUppGFcic)aTh(LPi*NS^7tm5WEmCM%OQj~hO> zfqeZKKY~Kj#yq10xj7FsDcR&G8-UwD(JyPLbyVhZ6YfhAXb@yKKVnA&xok+c`i~^P zW%Q$-FYAXUQQHKCglP^MP-h1U@pnzC*0}a5gq|836>UR3VF+~@64?iEK@-DcpVXZ@ zXOsL0VZ4s0e(M)n7imgr`IFLETE~URw5h|lteJMTz(B8tMnj_(<WVEglXqWF-gmY; z9I$!UTSeEIve*+Hka*XnSS2W6EQ*B|3!>~gx-K89dPa@9FXf17bTvW;h|ypRMBK~& zMMb*FTbO)-{9NqOsw?0dc*t>WFAw6F%4e3u1YH5cc9Zk(=!kSX-Rb4a^7Dw!@xA=% zt8*_g-{itAc}kj0$-AViIv#M0CCOipnYPU7n>xa@oHOKD)MWjv=Wjw}-d3w6=lH`L z&KK=-LOKa)d(?^6m60{`f2Y7poG}seN3@J$oHWU#E3o9y6l!+*vY+DM8!`n>OVx}q zUGyLE8_Ju^6Cc!9BI+pE{lGCzvzm3Kr=|j#A2=$5_?kT?nIOVKH}JEHf?7&iYv^Z9 zJV{nvy<T44W<sM5l2JY8_x+AbYM{FWu9jbC2K}hrnYls|?jYf-Rk@5!FXF{*Ey-?b za_ASgsYyga$)!(e6A#p}T|<s*Lt)<16p3l)51<gGcf%jq;A^>!=0Aa^{k=5dbolSJ z!uc04LC9TyfCBfoKmHra)f#*nrJuH<4=}HDeK$u}s8lG{*WsfnQKHgU3L#pAq>6Az zBztRLJP|f|Z*dw<vnF+kE(11}HIpIUAz179T0l1tiOJ~b>`c=;dq$c}e(4CpyVB0@ zqqzoCnb=K=DlL7lzN2tA|E<@3ga$MLf72dGxxS(7YWs+op6~SQL3AXF;3%E(F)mXf zxd|MlC&!nDpX?z5wB0$OBd&oOmWs95MN^D0_Ib+T%;Fpzifft~**R{Mk*PWOCo6n{ z?Ne09<u}U24`p}Iv9Pdyql_05;u;#pQf~arNwc@cM=SZqrGGDSTt3kGo*C7NU)jYC zuJ>jc0#nup5WH5WNK})#Sj6b;t}Xo(Df>XJm7gV)reOq|H{NsLhfr|yfSZs+_2R_@ zXo&@rTK=~L%Juyyn)S0ESmz>&tY;9sP0&4>>24}*RfGsVbrIJ!4X~U4<&UsU>Dk)h z+(9EUZKPcU!pgR#sCzPWXpX@;RDp+X98O}4g^;tV*Qf;3%FStNO<RH%TLN2?59nSa z#Uw9iGG|**5mgiTl8x!dxev#`;LM73JL<(~Nvj26Wmm^3aBOWCwL@zZdq&WV!)=xx zi8hQKElZwfvgAb8rc;nGHObCS1Jfeyu?f_^4!a=j>&W+gowkRe9rtzouxH)t^j;P% zlE?2r+Y`hNPUp1coUGVv1lQJDyI`%Hij|wzZvF!ww@oXzeyNvemaM-sJkj5{Y3*wA za&A)SCvzf99SGBzM1-m1aO!BgqvaPP^Go2#be~VwW{pV>(0}>o|HOnYrVsH4Ilu%W z+q&3B2riOg)&m0e>&KWf8#YJNBaOouLa1}&TWI)EW<OVyx(}MA2U6zncZZdiZ3dDj zf?N*<NyTR=YY_z5bhoKf3Jn6vo?6?0lv9$2unU6pvZ98+G~}n)S5Fu=)}xj}>bE4; zxO``atU!{{i#Lic3qi(o5RrkXj0iTb4b4(}?22Rw$smW0WEi-@<%|ZMkSi<H`QLoZ zd6_8^gl8D1Mmz(-gl8NgIi3-tA3uPIXZ*0|#r(H_(6CG_O{%!Lh-GVQHs2S++p%if z7pNA>P@-8Y|BDY8nqloJG!qF{cVV@*9$YtK{FOBeR3xVhf1s%bq&lJo$B83(P^O@e zq>0&ht#}jvAmd6}FoDmfLiDRb915}08i97HE}@^(Ke{Jqa2{Tr>g1&4LRf8ybJ{a~ zf~d(SUED-YPM+m8CDi2j=C>+Dd}~kQTXJ&1l@o?)R2ET9QjP%7!7f884+88VVsn3m z1;(zEq9<izC$=XlD+meM&zyP7nL7Ul$3!_2*OrEl%#5t?#p8+EmDIrG7ER>81{y(X zqFnP}lDT0Hgn0Dd@O>B+(jD7?>4AO)ZU7atnTpr$eIb#^NF(<EI6hlHBT7qRbCgEW zCLyz)e<7kYf$c>)q4Oxdge{ENSgP_lD$ZF?9B7B8p|px|@XB*U>AH_5O=K=&_GD{o z#?Wh8wcP)C-f9tTN|bKo|N4W5(qO1+Lt?S+!qwH?NI6Yn5#12X#H-K>LJ;ydh{T&N z5VHCQcO@?sSsh5;Yl*B5JRrKPDs=2$5K!h7fd*(wpfTm?!X$%sIUp>EK(@kyKzuao z-r-{Ly@pnGppB!d7_o_GgqCiFEKfzKGI=02Ni-(s+;VDWs?GeMng6QviBK0ShO}Q6 zb0muOcC2QJS7cD3HYR*Zr|_s2IG9r2YA2DWM$5H=76OX0M4w0sU`x#E3)rC=L)8~- z3>f>p+7!CtybyW@`Mucn+z8yxklso9BnCq#NFO(U6No?QBEKIbJwo~x(r1w(cBVIx z-b?yy(kB}$>CL21kUod>VbW#Nhe)p=eUS7n()&rDMtUFVb4kyT-a`6#eI?yX`Y`F0 zqz{oEAibaTD$*yh1=&LSIO)}-XGyn`K1g~EDT7OwNS|QEUrQ?g?ro$j_3KE&N*YKW zV3bEm?<W<f{9)1;u()k<SRP`<idymUo}-Ri$w?rFFJBK?V3SrqW_X0)tX*^Z5`IBe z;4>C6|1wg7^6w@gD1S;qjQo8h_>x~vf|2h|5+p<1&ui*lP9i#W1F3qyi}XH5vyt?E z(oLiY4aDrXDNLVE`osL*LyDjJ*CTOf{O$6$Q6T)qrP7dudb&>JUjK!4rY%^VdtNPh z%Kyk(FiW2iy6M-129ER#+#2xKh8znT`9D7?dMvgz8*1Tbc**dyJzZHVl|%8LPen(} zrj=j5I`_3nQjPN#pQq(bDK<4r#9h8I*<8uds%(r)b7mn`nsd}O^qM(<u&FFAvGBHv zbYr(8w@|QX=iSK<uzkRoQJ-Y?fmyjud?4rDfO>#)9uwyBzpKfEd@hB((NLROWXOgo zJsTL4<#5-tDow%Iu=ixF=?XVg@ku-OrV;C1?=Bni@0#eyv3xK7T*tx-h7S@5q$j=E zG3F*?(=7k#-d4Drq%R30t);951Z;$`c-b7vT6B<MvADM0oA{<u?}ut$F`_|HF&^6T zLR{}xa<oHSb7aVl6v?8kdZYHpb}H?-Q}Jc1UNv+JH(O|tQG%z1CL_m4&J14F*=!CK zV0_mAvhlq+A>v8kA5~tcWu%ByFnFc~BCwH~@hCf)uU*N8VW(c+Dk1Z9xRssFGgn*T zR!pkCR104#^K~MoeC>d~09o;Yy%LXaldW-+XWK#S4bK#_=8c&3UYIq035EQ*H{2SA zQT|-W|Kr0j!M($Gb0kcaMNgR#4S~jO5bm)Hwi@425FvJ#(4>skJWdTG-OLBM%mX!} zLTd69pae8x!<=E~s!Km-wP{>Omy6Bio(mO;sBZP&j!elaP&^V;0mleP(ufr?!dWRc zI&ne$D`_%X*ssE)liIb3KrnkkpX2;te0MhgBq<SMoYj$BTayqU=We#S)$oK#wb{bi zQ9aen7qj(slAmn0ZaZQ3EU`xo$C)iuUHRv0;p;S8y{+Nv<au&{-Y`w3H#p!M(*xnS zq!!+2whk~&s3lf$m)EQv2)D5&^t_NS<X`-Crs;sDX*RFh{#<C-S&P$74XQ}p8As|| zRtj?bTpE#henSN})spderS^-E+f1k&^;u0cio8(#h;Ni%mn(=rgrk5+@`X~a2Qw~5 zxBekHo}q-{c3F0VyqZ8R6C?2Tr7z8MBUTf{lB8;gWfses41SphyLELA#A<51OtT@@ z`HCRhKtnN)r-CYCss2s8^oqcnx+9jgEsT<GWDK$Dj#za^ta^S>c*QR!Y7lm*f6W|c z=3`;ksM;I+nw~R3T9pVqmYv;ed)y9oCO@pN@OAw=ZFuY;4Tf#enCkKr;I(09aT;|H zpeRyZoKs+EZdbDoLukYJ;&d2JFLEIm`YH#J4Tf`R1%_?GupJkt3fST-VR(21LxGaD zDe?55IN}@{4SFr&G<@c#A&zdTj2OXfNF_%2n#vza!v2s84ZrQK+0NFm-|^Hx5ck@j zU!{i07isD7P%NTYRA3J?D#`|)eKjJM?b7qlxjlIL&+=c;u?rGlTM{5>F>=yHn~IZe z+q_$aOS%q~?aNX&cPla)S`U~}HZ1C$MTs+|ZhYtG(l*$wrM(|+me*eiBOSGK45lU? z2&W5eExdtCdj(wDI&*uvuZDjT3k2Hr()@$Q%IdJ@>>D(DwYXMBqh`(`eJClcXyiYJ zIuyuJp|F$GA=1u^qp+7u9bTI6*Us5TJRogo<U&#$4#21x&GkQtNxpJK5Q>>K5{RLa zj{0UCquF^01T0-ZfDk&!4)Qkt>m(fXb^o%vB!?WVuKTR1<$O?(q*$@?4+=GOG9*rP zz6Jk6RB!|l`l>8=s~act(SkpCQ43zYugVL{U#_BvYeMw#>%-RrDcHZ{*QXm0^GIGN zxh}Vr7Wf`{Q-v5Revh<dts4^%4*~B^D4Vo`wL6zip&oRxhX$t*ZGbnb$z-J-780%e zou8=PDH&<EdN>$<Y|h2dITu53ABmw^8#UDBlw#xXymI4khi@G2KuWnCQS=V9J8!Os z=SdWW^gmAylFKNX5k*ZtSf<0Bu#Q8Ju<j0o%_eWTbg-*Jl1i6d;kO)am+hNnE(U#s z1G?`hwvl^B+))HX)t~!~->8LUiK-ewJiHcG*}<N}93ehZXWL2H+4cU_xsB7d+}cVv zD}pZ0N1wP+JGaCDvt)CKU~Z}w`6<}~(N!e{GT1b`V05X%W!$xxaH(BOfeIDUH@(P( z1fxhGzXIX%BerV+7q#H)^awUMV&%r4TkvP!2z)N`=Won^uI~KVeZEJ06K%Tj=hlcn z%P?E~xpQl}4)GWCfLDt@tKM~x)+u$vpE-bv{288Z{25YI$^nWaDV?$uojlQbi<%>$ zZhUtC<RWJG(B$m4@(<L*At!d<e%EY!YdEx)*d59f5j)-(t>j@Uv0DqhZ$g#$l|T=j z2GDCSW$Oy)wbww;>K=n0mtjtU9y4Lm4Jp0XE_e#2+Ya3~QRms6PuT!WBJtSn+&2Kz zi(ClL;|Aa>!1E7}<GJn5<B$)-y7E7$hr>SM-(gbi;k6TfI6t5X=Z#PJ;jszlc54@B z*G~91=YRZFn{capY{CzpXTr5ye9CRPOt7>n5q-XNXHsU?YRTF^)AH7qnx4b;cKMg< zGHQ|%GCUt-o>23h4$qe^(|32K%M?jJr!G@lIaN7QXS$%MZ=AM_>p!QcGmp=<aL++O z=b_icKeKN|=Y7&mL=?TGm2W~{k-|Re_;-JgA_oo8yVgD6aJH`GDOiojzNyeC_p2IZ zZ8s9Lf8g`p$y0uoj9W0991|59#m>IrtSvHiNoQTHdNhKp5h+rg7B|vw$=@U;qV1C! zC4IzY+2}A)?COI|Ix_;*L5CYlSrhFaC$G?SXtL^*XJ89T(p_6Gc7#~{MLG<CjgoLO zUABXYOx8T?lSoBLVth4|C(qI27v*pMs`S|Ez4RVSuZ`Um6Vf~>?TMXQg#|^K%$S5U zbNy_=R&*|bTZHC;W3D*Sb&d{36Ad}dH?7XSsZrZB`6r1P^~#Gzd~R0qraiV|W_#Mp zOU&zd`R*ltHd(yq8U4xp%I`ttdHivv`g7KQ%vJNopXdGOa6EU@y5jfx;$hRK4Wq|R z3&r!sO+?#eVY}p8(|Nly0C9h5(vf1*dI;fLCB_FgV+yh;#5%<+3hPL;UEXjeHxoj| zqEIh}`Tz4_MAcwt)gx(J+TPRykrwrfy8L6CnAuoxZ0)<s<_6_Jx<1VLk$_(a_gDxv zUC&%Uk@fj{TmEkJ!RpaAo&GjS2;Oby^xFavC5b$t{2>KV2;hWG^h$~EDuxjW&+(jo zn~lBBa2tM3Kc!~bkMZSXwMdBPt+o}eE6?e#%U}EZbhjC<Gix-Gnss-EC+dyo^w+5~ zGhAanl4jR}DQghe$Q1HKN)&EX74m(BJvW6sfRY+_NvA=A(~{b0lGMX?gVR#jE;w2K zkaB`kcNM8ua8fbot>6S;eqFlvB{KyRq=@V#i-xsT_XVi6^+KjEP;ZNfPlX55wfXlr zsIJu+K{s3rsMKR(vZ%)qRM#4)Hk=<+5IqCb#bDId5~H>{M#+xdF>0$%z2y&eYddes zsaLTvjM_ShQB!I*j9Oc51*4``+ae5B0j6v6H#wNDag4gA#Hed37<G+-i3=Q`I*i&< zVAK}Js4W1%F=~rrl;sZz@jix8DmH;pTP87TZPkVWYwN9G)H&*Hg{w<YU7g?Opt{;I z>gp1suC8Fz)dni=$G)okkSG7}s_=C}#j7}xI&P?Vl@6{VDqh8h+=xxc;9_pB%-`<c zT^YVs-(4AQ<qT6Oe5KAM<98NS7-O7U@~gB!Z}GrHw}fxw6E}LfMKu$L^||4nsl;>h z&xwY3OycM29oH>9E#I$qPYVaNyq^|cR(}07l^_WAUEzf)aaZ;0yYvph?uxR{SL8qZ zS)))_gy*TxSD@0k-THimG#|0gSLi!z^_~;HQFT72TIX~04r|eyW&2wTH-|&&(aqu8 z%O2gV66naE9ll8=o?ZR=*?LD{?VIugdUsPetgmkh-%);jlS&|hKP!B*N<6Fj^|SQO zj=G<Z{NrwWBi&L-M2%Lah)V_U948Rvx#k*vvzWj6BhGIYojNRn&Q2W`ojO=P0h-6D zgNlt&hebLnongsurqpcIVQsY)>M*t17IDA}3_Ozml+Wf7rw&I->Tsk&9ge6oI!5j1 zkF#&6H8I9X?-m@#gbrdGnM{w+Q4t^zy=!-7O%72@Xx0Ovwlz09ToTzKNyHa@mpssG zhJ@h_^LGQzu)}~cnjIHBp87Uq7jq(fi+XmViZv&MHSCV=3@_5VJFD;R)I0WiUxP6( zAVT2A#)b@)H_JEt3~FZ9k1?Ei0=b2HO~!6fv5Hx#o4(a_=6|EF)Efn&X1Gz{i0k}D zg995j>GZL{qymXZeOFDBug$wj`z!R5WjjyB^Ghkj;~B&w#7bg5eX(!RwsYQmicnRU z@6FE-(z~^HyIX@(&Wi`X|24@m8Trj&<o8fVMt*boTd*F7si}~<p5a~5F&kw}%jWX? zdArBoK8-#xpZPz$T9<*G$}r7F*WOK8^IRR%u_Ief9g6o>p=iO|5=Eo=l8iQ^#he}a zhB>z^CEmE1Y%P#Jj>#60)MW#<kpwfZAqiISSECEZ$R__`uBL$1$@FkhoxO@@Cg5@j z#5Eb5SzK+iFpGD#)b-*4HbvM(YHu{i39jpE1Njc|n%I)o*RTN_>%v$~B`n6Zo8;_W zo#O!ZlK<2bUFMFR44!7{BBs39V@OZ&shWOokWNc5qho}`5u%dCFE^90l7CQ?%-{OS zsP>g_o2h*r9qkJ<l}(2KiQtrX65zus7ci)dCO}$%ZyI{+9}=k4HDS;2Q~3U(yC0Rc z=tkV6A<*t6d$06Gs7GrVaa_%9M$(@ulv;)Wx5PgxwV2*-4Q}6U#AhzXCTn=bnH8S+ z;RMS@BLHvv69!1dxc$PN7$_F3oM8^p=UGpBs~D496*T<<p=#1LMRray+7>+5%kI31 zMjZNsYot-C0m5vTH|7AbzCvX5VwivVCm~4dZ6VTLG>un#m?l2eO=y~Z0GWA8I^}RB z3kbppQ0qA5NJKfV&ev;HSBrEuNmx^na+uHpUK{1`Dn&WSP{~HVUfMr?iGWCwFSMFt zE%wx+<2o@c88UX6%v7ABs=>P1h!x%}8{&C`lLe!CMj6aYhD8l=X+WVim>mic6!2!G zZh3E+RlBghHvDwY8U{&auBX37Rw8&bmeFij#CedYn2x=A*Ud2Ll%In6#K;+Dz2Xg% zHIubYSkS+X`A6R2%zI<lE4XY#E4>NXrpwbNF(u0%a(#@9r24B|Dxpn~ieUxKbKER$ zH1ueJ5$k;mG^J){YFf2KT0d{K9NL%6dzk-UPulzqgVi=<Z0ha|XH0ZAief``MjT2f zG3DJ~f{0GKAh{8~Qk0J{gZGZxW;XBs9^-Iy0_rXwYe2b>|4jttf`f9Q1SRpP)kVu6 z%6z&CN);Oe<-#N=r_^kNUt4VjlvAs1VMtcUK?m}8J17r0D1{~t$^#Wp`aK<R7g-34 zy~8dt84StaN_1z7Ks@A`h@?k&<_T7#TgiCZyOLeOlVhIjhzVl1Umt*en?T@Jrjx=H zC*ca_^f*Xbue?Fo*FpYs-d8A@kVs}sLz{MPVkoD5Aix>RBtYOn`uqgxRis}e#UL_& zm~@HsA<}C}?<3tt`Xtub*O5L(dKu|i(xar<`lIfhGu!p+Nx#T>+78l3NpB#1h%}Ji zPkJM%Y|~TH$4PG@m2LVVQrV^-CY3FEM*1Y`a3Y!KkCE!U^(?7a{98zOlHN-y9{)vP zzKirxQnCJrZ4Ty$D`Q+gzmN1v^4~y;LzukiO%iyBIobzp=NwmpNZ2RK&n5}5>XI0p z-v=5t!=BZ!NkpF9R@h_D3;8wq4?YOV-$&#U4w?UMCL0pVVyi#)^k@=5oMQ~uwaf^1 z3K6A)eG?q0T`d#E*aQc^g^%V`5?T2pHNP;#P6BR`raHa35Il<1>XGdT>o)Bcx%Ff0 z3e(lOZ<>(>V!hEy_@{2xh!^`$w^KX+2beVi%^Dv5`P&I1!?nC(O9hFpVXT+`SVF!o z-wj*op>p0jmcxO%#NpBF_vy7R-?a}`C7T}0i_D>#BcwIj{7P=q$BsbBk$+jXsGxp3 zO>p?~genH@RmW>M6ez3th4@0%NIX!m8LCnX<tttN^;*fSuRC+*)smLQ*6q>>#IfP0 zxv|lXT+-$U{5Ao*SLePyX*L_pI{#hTpW699sJj&@`-)s4N--nVz0{bH>i%?w`(Ynd zwLkQT=$iNBi?1}qu=q^`cWSii{C8=8n&<zZ&P}N;PEbg6kU}3DB=nI(1obf?p^qOe zreyeM1Be*`flhE?)0G|{lIdU@VN?1xA(y6(a`Ma^&&S8V_zx-8$0xX(tespk+?lNN z{YenUQO7X-(1k0BeIk^vWIWn)e6|vamw>~@4Z@5s_p<zqqKcHiuAw>;O<a1$_rbpB zgimMehMq1$%QC@4XdOVcECjM78j!Fk$hVTUWeFP#Qd9-$EcwvDbJmDgqZc%AcPM=k z?Q30W$lMRh__e_l*@JC~lF<dpgAlQ}hhgc+g<=+bWHWQjDB$q-dM=0T#-<ggnqyvr z8RxdKp*V(r%3~sj)ZGqGmr$$hb~RfYhZ`jEO}@cI5}Ip9S?UHHms0sBVs&~;KV-7y zZ{?1Vf3osc+MM$3r?j=sf4B153{fEB``94$hmT<<<^dzJe7x0t`tT3S5A*R>?d_k& zx5z#;nD50Nq^n6YawtcNk_Orhf#0hoggU4rXpe}OpnXA_m8a^C)j$iXK^z49F6duu zRrI|mrPjGCVMINP7ZoBb${Dk%w`V;cer^WT;6h^s5oTc0(`h@&p3rxltR{G&wv&AQ zMvV$BUktlp7@U6^l#yZyUMZYP=mq~3+f{LdqI_k$if_CMsg+9oKdk!cfsQxE+W3^U z(PC?DZL#OwipM`x2k1a`UMII)zr@tR#U-XVAnDd2VaG+R69Wc8J!#k#CS0BBbj|T= zMBLt^K5}#QK6=t*MOi7R<S^VkeB6MESG1NJ^k+>TEVaZF4RV6FDd!^4LwjQ<0=g{e z+@s@a;Yf#=AJ%@QL)u+L*#u%B82}uX(uDps4UL4jqUjhq7`3Mz;5^1`<!@`umcTH^ zZ0*cGdxj(M-y5I?;sJJ=<>8-wEyx`o8bi=h1;8+8BeNrrZL18cJj@b(#M;nf3daF6 z@^g>37_A0sT|;EBvE7a;#QMgZ$<xg3F!mj{m!WBarScyUH`6M!Tpfc66l06Zih$}9 ziz;S2fOT-E+qer-!_5ffNHkfa5OLHp>Z+S_O0({QZB9$MCg&ry)wxHK+OYhS)Eniq zJv8Ib)_8XO)h=>7{?PTL7qk1t>)~)vJkAskmzvIweK0rnYxHA&ILQB6BD=Ogh^x*O z=F@e~S&&nW5tJFop<Lra1c;&pXCWf#SPM#b6fTE=N>31VJ)%o8o_0qO>62{N*AKSg zYlpbUYw3j5ws%drJRJ)=^MC(Su3gyaTBn^Lhetu!DOK-GuzbAQpknwcuewVUxw@Z6 z?oCm<u+z50M2rXX?0|Jj&9D{Dch^+gzCg7tR2#*Xcw_#b|HiZns5e|!QA9!5sCuJz z!BidM)?#x{F~pYhFGPqfJH(bth%NijEPoi5$04R-V-Q=OgxHjtZH#NHtw3yQwW#|` zh~a$Z5JTM{h%F$(c-)AE3dBsKA#NUd5)upE7~EI$6yjQzzvG>bYnekXD<PLT<Sc)P z70?*2sn{6g%$+_|aBWJ>HrBP(Rv<UETCR63A-5s_JBOU<g1hJf3&?G#Ku&j?4Rms- zW#y}m8(&)C@>0iJtjQ(@kA;r+uo-b-+K7%9)k-{#()=8j8_W!E{`HUkW-WjCZyo^_ z+Wxza_pl+&Xx(d-gWykf6Ow=~Vmyb+@f`B;99lb`Lq48E)5mk@LgRUAnvlfxRmAKx z|Lus`sbh9pVs`47ZTZ8Hj$^ipjbXMf--Gv#sOXfM4YSu)Tfyw9)wVdCE~w~D`EP&O zs3>08!nvDD%)Y6D**dZw=*+r=oVEqFBSt`2o5^1L?RAtOXn#IKoG?TU<U=opv#3xM zqn>F(!Z|68zCrFRm|N3NN-mDG?a1H!(@t%6_?+x0=fuu=b(o9jJPbR==S0QE=ETo= zD|0fXW`p9|YAbUxwc1v=p`4Q&^6&p!o0A)SPHrgY<c7+e++cHpj4c@~Yr(;7<J~sk z`o>#cb>+sp>HFy^WW1CWa0}==-P+{Rg1}t}44j`jCCCsMw0++mo*}-lU43ejG~-#s zc2}TV{xEDem=0EB%w-j0BPnTt{yxrH;l^sk<`Pt6Y_7?Q%@clYt;C(XK&`ECeF@a- z^Pg~_Uhkgu*8^17pkH6npkHr5MHGMPfI1<7RYAH&2D>c(nTV;EIi_A#V(Mj1JuH71 zE*r;G6&u6U%O<JEl$s4w*H&A>)T!0B!qF0_NAveNP>(vM9xXBTXa!S`sxusSA>Xo@ zvn|qmc)FA^^Wm6;S1oSH!TiLYflIT~b!-$`VK=E?UNkG8CibDuQ>RG27(Nv&u<f|q zbX;CnAhJYhmwd4;?9u$L{QfA%?J~#HunV0)lM{<BPi$LeNFYo@3QAirzse=_I#*M% zd3%nM?=FLSJ=IaANxoBRHlvue)g~9HcKk5t6E2Mq)J&Z`5C}VI2P_BF-6;9mVGz#5 zkYR11OCs&jC8v-9C$8XrgkRP`vt<-ELNF;H*i*O!+dBZkc`6U#W|4xR$!U@l;0q2u z%O8f23w-TWOg;oY6>HnGPIQeFglI`em_G;LWW^kYbotOGrBbVfnmTW-EzDL5o_AyZ zj{j!#^+p}8bTMHm;CEvMerC)f_`S_8NST479iPQX!Okj+;{}`LDX=Von6?~*yVnxb zHtIZw;{1th9Z=ks|KJZfpW3G7BxB(Du-ou(Ti7i;w0t)Po|oz7Is>GN;m#$R>T&4Y z7<fLF<E-^?O3fg&jDaVs?OmYSabw_L_tk%$mPZ#8;GT6?#=z7Y@z9KcOC3cn)k{Ua zAyt!ZE4K?-q8@{DU&_eLhR8a?t7u>oW5a?wCJdvvdGl<#+qI5_x6|!ST;V813zTGW z6(>$9^yhPeUTMDY6XD`>R4OvVPzgLUv?c6uJt3PM%!+F~)#cSrX%;b1)uoVn@3sQ- z<y+V)o7({p?kITEd_#ThX`SsAPSv>h{7EP|@mPL`YYnclFl8jXYVzvLyLfdKucFEn zo?YoY!E9pZ@wG2IkG5Uf=3bg`1)bQkirEO((L?jPVG`IOsE_O72-t%A2&CfHTQm#t zZ8-wzi0~Y-=&=gG@0v|)v$1DG+jy^O8!ejj)n@E&eYGJ1#}uEB-Pm>LW=}wQwE<3| zp7mvqexgtZHbp=l_A9mgUs_aJ5d$4UqV%do1uRb}U)}0wwCPAznZ|MxRoy+<W@#OF zkrgxxBR(!GQ11@9k;y@ALws>`$;0AghJ@b5UDQD%*%P~{<g3xfRPz#Kpaq$>u<_G@ zK=%}ua~zvXja-vXr<Pl=XF+rxP-$R$9KlR6m{20CyRetwLRucj)a^KCw+>j&QD!&y zF>(^)=Nt9ntk<kv6j^V!V9Mt-n<31Og22i=h7Y8?Ja=OqZ%jJF^AgK>CzkEC#FCQ{ zqFHFTM21zspr!m{QB*2D0>lMGhn6(IV;%tt8;k#yxXzLmsy#<yxnvlSq@be{%PBR3 zQPZl$H08Y2j=KYV%!%c-!q2X`1E{-l2QYNB3r)-&0J`<=9m$nN5JQ6M0b_#V0bh2F z!hu2lw@5J%IQ^)}hC|m7XNhp=_YtyAqub%QAqM-4m~{5lC;j}$FU|nF9!StYlfI2K zuR#b<ej|yWGKEi`q?d<UD<nAP2oqUk&{MIL82=a~B~qMK!($$6A{^RQj#w38oNm4a zBMSBXUNffP{2L`4o2_U}G05M?Zw2skV+s%Gw~5~h=(meh0sV%g3h1|+Q~~|Cl-fe# zarL|f^jk+t#5~0b#K01hIm|T_?>gNNfiVlp!*n0Yk80j6C>1o1tCHqOFwmSQAu8Vz z2~qjBkzlT=h<y<D?Idrb%_AXAIlZyFw#Saw-Sn~=l5UzFo0csgYByWV_pQ!7ck|-n z;tYSwKgzg>Kb^&XcX6?|SX*3dCC%Poak0MGUR-P}7Oss>E@Ukqt?<l<P5RIHyM79k zk#^62Lp;9yBxEPl^Tku4eJe{uOo9=&rO1jOnVG8;K^D>ueKZ8?`0Olk%!nYx1sBq( z_$xx0>eUQXmsh$>0HuLt#S*OCM&7t>wx54aB@|_i<0X40+B&5r+t1GXH;RaiwaIMP ziP5qA^F^(lR(uBSq}RrJ+rL!|DK2ZBZR88X_w;4532V%CAo6D@BC-P~$uV8R6@It$ z#;{FaKtor|{2S{h%$~N|t?(Jr?LO90J#17cNBj-B?d(|$AMEaiP5EPQBOLsv_{Vyi zU1`AE6c)wgH|3wvTT|NU1?BZ(hU5yF`tXbqoGvNCFf44;cGwDR<4f6^Z(R-h_$-iH z=lD<0JM)G7^J;C=@Mkzt3<pl>76nYG;*je$WX6kSk-TGlocqo<&c$+^ThBSpEtBIs zVB_3U8K82SVT;Z-Z_D;+uv;{;84^Z@3r!$%!8~cYVR1EVrTikfvgOqCHb(a0w==RW zHnO~}kwJ+-9PRKT7M`sc?vfuz%&S&v7aG`%ZuOBOB~Q*MmTwz<q%e;~MoPRD-HnDQ zWk!ZGA;G&CEfA-nw`E(k26ni6#16kkiZ>dL^g}|1ut=v-7g5hfdsbk#cl;y+*r8|{ z)+s||jo|nxFovvxdid5r!B<7IQ!o$0YtLDiPT;s(D?%9x%?RU)`*0Dp)hHQ8k@XZ) zw)9|_PY<z9&23iX-lVQ}s(_U4r!0wd-ryysz<43o@tjDlOFk}kdwpoT-Ivad)&gL& zSP!XAinfy_#m@{CuFpSbjK^${G5@2euI7?aGTW9Jw@t?86KJ89SPe5kYr%@)fnihM z&wuExKx=)}{4_%9tanY#>GWzF7p!(%d;j{6*?w<Bu=+M&l<aqjnL0o2Q%rj=DrLqy zKt5s_Ad(E^AQe2Nxm*LutX+krF05kfwE{ne%NSG}230f<4%ci0l%}^*U?tT;shBFV zb!l310#sP%VIe(U1iw%#7?{^dw4G5f0b$`fz^q`&L7uP+Rt#~=z}(G0EHJM#FzcqK zxU0T!Q*2baR5jTSD!L1_gE4)%&)%DVpTphuMBP9XOB;dWSyFR^`(DXk9D`pNs&f^n z&W}NLLjl#9X;8%kyaLr(t!y?q?)5k8imTZOT*A3q*GK^F0tS&4;4YF2qz$;TM14ZQ zot*~Ui)s-VPiwA(@j08r_OpcXp8O3CW7`&V*&P%x-cy0`9>LfY_>dD33id&;Nkj2* z9h%XkiVjGaEMaOICKEo+Xv8#JMzJ%7%ecR&$)Uh1^N|9VhmK>GKg4#t0`3JXHp1nf zd>h~%MsO3|(@6$_HZRbW;quycuq7#QS>2h^4qMw2&b#v;bU5#JozZSEPOEVy?5@Ch zx8N-Epk3vMyYjdBhr67WNNKpyKHO!@(S!9%b0~9+o#l5Nn)`P<{kxszcRMTJ>8xEc zz;gNBa{i0{-Lmjp(VxWZ)X`;C6c?RNoW)^fL7LWrc^7jD7^0vk9Bd*Vo-*%4nNG1` zqSz@%8f0a2kRn?SQk49MSHI$9Xyl!H#Gd7!#rCmMgDN;r$puUSPrH0a;0$A1m6)f} z;RN=67mcs7M<@QFxO;`{k|j?`hyyD3PC;}POd4x`Gfe3_zwgU=l@JrIVU#qhNgk2` z!Qzx$`HR?#RnT-Bxdr+Ju<|b+08RTPRfska=WoUc`Pw#0QgF^Th;>rVe3t*d&wS=I zEh|YuRzXn@Ko7x{2w~fxgCuN&4h_OVU=$8bAqYWxxyRYV*)0R^ZPAe|(bX+O@>-!T zceTL6-1dtzy7N<~QtkY`KjvCZhNHz#9g&eis)U%9Ppn6vihQ+7a1_B>#qjA8BXg~$ z1^A~QGSufX8Kj)xBw$JlL9@8FdIYEQRxfL;LQCAt|BHhYg|=!FUipe=<(CV|0`(7m z{<h>cZP#aTM|`}k?K;p1>}(qnDCIoC@6QwNg{SWDkEI9M5|U^0YX;xJ*RWu8IHH*P zGnxwDziKm&cU`s-12NEf6G_-;ckb2l&qKpykVa%LRq59Lop_0*8slD8TsSmAM2sK1 zV~5ZR>~ZB*)IE{y(ATLfJK5r_Hz!E2+jPb~vir)bnn67IU!x$!nV-xcdXbiGsL-S+ zNG-yp7(CP$+Yxz!G)dSFumcbYoiP{VLD;q$b}+|y9Mg$y_Pl_s^@(3*6)g_GAREIx zNwK(36?VfE0C?S*0$_beBrMk}H`?4M)5!aD;L$h+*%7A;Tcq?oXGyyrZ4)Hu;(&_x zuYhV7km}rpU-H%BM1;Wo5vbb)RL;2<SJTS`QfR1yR3ZC%%3EJz+4}t6|JOij!n8za zRAff3*K5BR$+h|OF&)~0+?EXl(tfy1AnmJ^2o{+$Mwpne)v(P#3Q=Q@^em7*`hFu! z5u|c~OWD%Tn1c-hOMX8NHdm9LF-M!3{EIl$T*L22N!bVG?<2jIRE{=#NOeiXb)-+= zP;&+8W28q(&yrqAs>>m+Cq;jSR%XT=ZuXLjj$B5nb-a&M4mW{Rmq1)jdWJM5{UW-d z?WB*AZY7nj=m4p7MN6b|yg5kv1lkICTmBg7A=3Ae3Ps*RnuVEkaioz635zNl<cC)0 zuBatre<ps8y|W+0&SJi|<lk*(<UFHN&vf&EZBd149YZw`&+a3zD-Wy4`P$+-ozTk< z>JnhMM)8@j5Tbz7pnWVROeKk|C-f-WHG({au449!YY`6$Bp`memcMAoX=n)e2aTzX zWkGC4@1-cjY*gq&*=ctunLL0thu3~pSDsQ#7>|Rp$cRyWVf?X`>}F-nWStY4blZK` zOIsqmyvgyh6Rt9J#?{psDfuu`XniN#yc(V+`c7$n*z-0F^*;J5B?r}2SjT+voTL6@ zhWBeKZ(XqRan|`EUxitqzHWen#%^a;vkPgFb;5$svCh_Wlu>vOd%||#9+0U<#6;%V zSy%JXaSGiXr_csdQ3?aCk*m`Cb5MGJqO-`TLi;z=39IR0>0~?f!pL-o?1AzQl{Dp0 z{%If0AyI`c(G>B|ut_*1$sp1cv$sNWBu)r4#gJmzgH<fM{ID!cL2P8IWbGC*qbZUn z`}U0FmVeJ#rfS*Abm(cTkZ=j*If*S7UVL@P@?l5P0+RX_$+Af-#_JSssf+d)*OJxr zmI=Z<3t=YjU<t&7`4=3B2VLMl2w`?09;^V-j*kW$DjY5e^HR7)gn7w<$n7%%qQVk! zDCTjNh*Cr+fN7O5FO|Fwq5yG5Iht^bpr<0#B3<cVP!Kcb-@S}(;0mf5(cdWQ@Rv$V z<O%XuMMgUZGGt7qBBRMHUAA<Fj79<kLImbnW!aT{L&L*4PyoZm&B8-P`H$iPu|Snq zbz1#P2cg}IAUg$44-5|vRE|8N)9O~ygeWd-4VwkRtty2o)WrqGD<Z)7Y8V<GZlx2m z_AEU7-VcC>TT2iMZaAJQiH`%I0s%KsY$QDmD$>(nd~J?{BPlRy1P-L9Im0M?90ZP? zE<KgtU`wmK?IlKS&%f;8*zTyYy#&Yh3OKfF3pogB1srMEDR86?j?}@yNf7&Ez%ggw zNa@6^JuiS6Z~P$ONaM1Mh(q>UvF~@Jk#?}I8+vgu5xS8W#sE~mW~L%ky+wSBf3V{N zsZ3}%_X7V%$z2zo4nxI?+=UGVr#MmW5_Wd6SpgEO=`Np+XaLbOCoS?WFQ?=3{0IKr zB(KXIu9q_%vxc3QhuM-!UhdNoD$^0dE=@;JsV<2Lvw`VAUsqsfpc8WuJ2|D2<P{3+ z1mF%t7BsSm&g+iVVG-aW_<GppAxjWpY~mbk3!bj60>iDcdCMx;JU?LYszk?bsYDjr zQdg!E@i@xJBF4BriP4yhY(Xrhm7I`~FGNXfM!JYHMoDZTiITw4A~A-e>E6YJqc@$* zrn^N+DjaQ|u9LT~oU48LPxxHzbB>0OG~bD^ntycUX#0Gw<P=_Tw990Og2vTp_+`$~ zWIQ)7VytT%v8AIETxVm%xa)IuS#_>JBp@03Ojnf0Hq!Z0^16sADUJt$_Gy<HbEDcO zQi@n#N@W%K;zAQ)tEHTXQgmY?j8T@itR^_L+e93hm<VV|N?ui^`#zrtPFscjd&`M1 z9dDcnQ|T&>3F^}*TC5L8G!f-4$3zRA5a5fjYIn7AU_d9(o5zVTlD@t=5v&>@_!{l$ zz^rWup1#eS*aVhxwj^xnE-BwRVG_2jEk%@t+;z1&{5*JP*pl8t)ofG_;9<g5rmWGE zD|!8n^dJ&HN6CBnq!ap35yY^91s7@KSn<R%#$?Wpn)!gyrvv_K^C}VxTG}xXT+l3r zW)a=y(^*!bu2{>46Du{F*H*UJ&$^M4*AAIz^LJJuP<xz@6S|0gVE`%ujZmsnRDvss zXglQwUuENz&U;7Ev--wjHeJyD>^dVd3SbtP(<lHGO2L^H8dw&HVsMzJ$N=<#<0}w& zVPX!-j$>G0g$VB3#&9WJfIjJ8=G|IcC|6avNQS;RT%=hS7^P$z`p+Vq6%&WX8wt%f z5O|@bE*K2t>cSW?*E0WZlav@KD{W`(Lc6<KQlnylLx$>>SV*D{EOO|r7^D|KoOS$f z?(Jz$y#ZBZlR&~9r&d@~5)01B-fD40u^ej5zT!ksdakUC&{jR`Xq=dh`Hquw3zGp4 zYK=xhzr@654Rg!s29r8EnD5bpA+I|$O;&*sI>T>4Ws5I|vCAMHS&UV8u+HcA2~YS( zd(E=PTy8iL7S#O&WERObOoG=j5{-W+n;h;TLkc{F7Nz`Lo6Onq(u9kT;8+)KQKW1@ zlK;CTKQMe(9|3vz%Yu@B6o|849)n^9%$IB|1}V;QbNQU#;*?0y?hAr3gBfcUgF#1b zt2IPHUyH>$<fI|(@z)oPc5>Jk17jj7+-XgiqK(>*^Q(57u5s9l&Tj7no|h{uYb`Ma zh`{-dd-5HxWR8U;oczu@p3iE9uZf6Vel7_hqCm?q7B9yO{i!t^#UXLp0)W6w4`^sa zYACFb0HKxcLvZ<`T0rH4#AvQ7=GqCL9Hvv>WNijym2q?fQHFZy+?<CY<{rEd@+;wQ z*IHKe5Um8^AuDpGsiuerRQw#&#xokCQqUgnf2&nfE$oU|-E-;2{ItypU2EKd-!F(- zLTD~;uFf^s^Dtli{1bAHY7U<ujMHrneCDwzTTR0Of#Y-dlP=VHy<XDm)f>HLtIcz- z)9d!wQ0FKv^6&dq3^!Ea5_U7>Nn7!zQ66`9v&_l+p;4ZFi;_OSf0PGMPUoA*`|(j8 zfIFRQr}Gn|yteY@$a}{q55(^0?<#)ZI;+@U?;ZW*3mq2q^PeyCAjb6+f01;*EN=Sw z|6P4EQ@)`o)pfRby9BJL3<`TX*SW^8=|$Vd&g`CME1#bR73{<(@mg3^H}ZkzBOJtj z403Q1jh6FE$h~gt7I{{z9Mo0{sRLSMqJD6?Iru9K=AjRoiE6fMl@@9tSrr!CxfGUV z`Fkkrl5TDH%X#+?{AqB#B=76@41b`XZKjG{D_Ib!*e#6RydwR4Eo@fO<kJR>TiH3% zy}K>K7H9M=$gV7CfJ$0|;yYh_dH#g=$9X%KIWsOyHpJKw4JBrYG|H|6g2&HpmbeSE z#%fiwGE_B#QPs#XNJqlw1;$LYAh$kSP{$U{HkVqdk@dlQtaR0aBG{>F;=zM=vBOqt z(P0airf$I9cRM4#?B&@J;2QzKJ;K;SRiUz=mA%i~O)sY_yI-EB`V@N*rbH{UZC%*q zT`ZvyWGZZ3MJ%(f&Qor^*&eH_W^g?}>gv2y{K(Y~00eu9hx4(kNGpnG7CUBRT3_v@ zTJ;9=FGbAQUV<H-!^D}y<c$KXu$?R7fr6}$$!uoxFORkBWt(k5Yjp*e3TckpAsxL# zbBrij^klmQ=FaA29MgtYEun1S?;T4md%zBL^d*~@_0^g(cI{#N9ZTe6aC*m*hS=sa z9ubW(ZV9_|z_T7pI?dNSq%9Hmagd)jyqg#^wy6=-rjB{(V#mxysnwnWgQe;~;X|xQ z^>w}eYP5P7AMKL#4K}6<2)0v^hHP;1AzLL385RGi0>_0m5MUwM$l={gqD@X*N|-!r zg~jD$Z+v{*S*<n1Hcs%nEM<pa3s0x&Sm|Y;@Tf}+qh-4QEgb~J*6>YioDE+s`T^Ef z%4vsXDubuo0K)I*?~M@9fn<G5!}7U1Kqi(tLJXX=*IUbpRCG=^ah*<UaMpn=9xrXv zb_qN9e0^>kWw_AErPPT!9+m6!uJ%3E+{R$|XIzAEiGAU`Ak<JK_(1|%3=R_ZtA97@ zpV4V$jbAlCt<)!n!woBZrAQv-iGxlQ5Fmu_bj?o`w3xW_i{H`GOw-N|I)C`Xg+=7y zrF6duj@lp2bFtNHq+kXq?TYo0MqHIhbug@|4y1M4pmTa+J?cDO5jw#b9d&UkIpdi_ z5^2kI*kD#(i=MxY<IEaw*!@d!7OWVz9Pzvp;`I@_7&gSi`?^WB7uy=b>$IlK;px0h zjfePt;;)Q@T<ziCuGSGagO~|dSG3L+EtAutut{>MA6yE^nO!R%)w}gVpD6*IZ2_Px z0Xtg&c1$NDz$OGe65P^fi00y}>Dt{U*#qTO9V#F3u3qn|fa^J*@~&QA>8d$Y5>p&d zGSy~kai#o5n`DVcl8{M2ac1S|#jFs;NmCTnnf3gmNF@ZJvXe_J^e$o8Q59uMvjYga z5ufm7oz#FllNJZ7>8(EO=!x1)pUIYrysFFNqdx4TQYLk|mmDD33~_~gsWyx*k5?f4 z6vMtE+^S)7?Y%y`!iSA5aCjzQiyDwC1pBA~sk<ubielKZ9VkhT9ru|Y`vUWB!z8SY zMqU9xSI)d-nF^?9^M0JRJFDq!4gl<86%?kK9uHmRRj+{fxC7uiH!!*m0CWrh*9js~ z1r)u$_DIT#^S&qCCIIYlxb1NOU?UKY%aK<ul|x=K3(>u@?ppml4gfZHGJv>vjKBDi z-|i#7V`AjDGjj5(H#&UMM}Do3{MvHl*H%VuE*t}lgGVFZ5$@2)clgNh{}#r}nE3Y5 z$Yo4C8u`aQ1jg@(Q_n8<t2OjHeds49hJGhQC$D--!|(afukoQ@Qx5%_%FykW2246C zL*EuoXz1H~=-Yhgy3FLx(a^Vz4gHZ{W9ZuotUnjVkDqcw+VV4J&NNTLdhj6QPA+hp z|Fs9xj-udK4HH4cIV@-JGryZ8k0eDP@iX%tNc@Spl`PBu?C*a5FTYzw3GGS7y(Zf0 z*XQ|l%r_Tv`Q!X}X7S_G{P@0Du7>_3yH%w39Z5g~cw6@UxF_a`ca8h2$Qq>IKz)z# z)%8Uczrzo}<Ly4mk8iUd`RD)S5e+F@Zl3m?a9D;lX3KLuskZ#@Ag^hEvV5S%R^I9d z1qVp|7G_))+~TkK-_}+#U7wpin9%x1Y2$_D!pL<2OZEfEIOb<Y1XEtUp&Sl&Njn13 zk2Qpau*3Ebc(37Qfo%6vRFy903;BA3d>$jOFJ&*4QZv2FzQ}%Ag4xr#!Qt!&)~%pP z2@mR&(pp<cx2Rgicr<%s!d`?uN=;$pt=qg?4tEJC%Pt%)hc{}2;nz!8_#EUnB)Bbf z43U#>g>?(zrE;$0m*Pfm=K;F6tZH_I<yg+zuvP#8uk!nF&dmFuQy4xnlidYOBw4;O zq1*aeaMvy0FOm<Vz#T6gwcykFeQ)|`ExijV|Bbvccy2-Iz+U(p7}4^Cg14&PZD?<` zMdIid^-o`A=Ps|kkBmNbjOYGd@nd7KHCabx>Swkkx7*5>t!gUfid~jSb3%(%YHK;4 zKTSW(o7Ad0XGu2twe+Rz^R=ZJOW_$WMW5aj>PZKHGnK;m4rQ$K{RtALO_aqyoHWC! z)eMu9^Zk*YR(=I9M0cpLd+Aj+dCWV845x2D6@ChwdPOvoLvFlQ(`A>hYC1F-+#zB1 zaok-bk?0B~2f_<^t0#$@`&TmVRuOl^<KY@+u8A50)@`;IP0afCJ9ped_I}x3RLutd z>I|6K3<uqkl=B0=6TLqet|+-<G#l8fLlK;W{cMC&7NOoR%Q^T+e)DnuIduHglKT)b zw&QR}ow!^lVgi=PjGoIyh9uNXyy`&aB8N5DaE7Z_!!?xOMy?{Q>seR2epZ$5m6M9# zLJ$_lW>GlDuXG&*xmX(h3Ks$-Or$I{Pb@*s*e>$JVl)EJc$CmVWoINaeQvls-3-WH z#+&p5l<sii;;$gbn0{TJ&gYk>TnR>y<++vg---;K;o%4M@Wkv&`a^nnm<Oq1A0qvB z(tAlyr~qzx-$D8q={J#{CH-GWA0+)|()&nPNS_?6q~AjNI4Qz@{ut>8Rq;bSJd5;x z(wCDy(RVG?W2E1y_oVyvp7gu)zPFM-oAfc#f3EkWhxMNHe<ghq=fUTZK2Ca)^em|` z{z1}Hr1z3OpY#a=Kfi+XG17ZT-$#0olzS`ESCXC~JwmDg*smg00Bi}63V{7DNM)b* zB2opyey0W^1HH>hWuW(J(uYZZRWBaoL7}woBmLh<WvTbm_5~+gSCjE5>Hkjp5a~6f zii!O%Nfi@Yv9=#4{a2)CNfm4RLDKIgRZQ#`lPV_mYe*FnTd}pzl1lggAnDzt_mQ4a zgR;$2ux;7qy;d1==)8?o#(9dmEr-t6S=TUsy_t+hNxw%KUjiduK>9w?Eu;^UzJ&B` zq@PfMxA5>GJv_j}uO+6e+mzc48gDSExQIC^>A<8}p{*@+9UzE^^oZLpN@|$i0nO!N ze>{B?=Hlrc=<nZ^gpfW54aWbGgbnG_*aCfhm`T5v!{GE=!)*E^N&c>8x=9;wnf$R` z5}EfqBB!6C8JWkjhf`p!d@~e0cX=oC{$2-mr@xZE5wM<frvb}yiPO!+^!*7c`Q6m? zD+yyc%DA>N(v*Sj3s<IRlkkn{E|%=eSiv7)YoFc{IHcM<2$|OWroiVf!^Q^^G`p1U zL2yuvc|QaC03HMu*jYzG;%6@_2bzVK!E-Y9=QZr^sKLm|%T~h+bO^-BkG<lP7ifw! z9S)&EIEw(n;XJUVznn0<LYij0F+1u1nM6sbA1@)1N#T|ti3KL01Ev4e%Pw;PkVI;y z7n*;$_@EJ@1B|-KiN!8zPt#7=htUL~X2NF9t+rx?y)i|k;v|Flb&Tpzhm874j1t$# z`qtq)g2zreVZ5g^{1XsMXW$;AO0!LM)=aEk=dKEjj8B-V0Vj<!_SaaaUOZc*rqTGt z9k*W6IHeLp=l6>64K@bu8?pG!*od6Uf9kAs;Q5EaftfBwPSEj-1s~y9LBch{j|Ezd z6$(^+g6nFMI))rsUkA*;rRF*=+ZmD}+-cFUo_WeBi|J?ui)>YmVUbWyV%mCO4W{a+ zz7sa8FanVVEPu&3aclZHI)jg+UIb~b1Zlo8B2AcrG)<0StlQNSs0%&QjU%gbcNDi~ zZm#@k@!YfD{mp~Tn;V-qcark;`r*dry7|pr%b3|P*gRXG+uW`#Y!>=nHi>sLi#nKC zn@#D3DcPF_`Nk>P8x===Z6ynevc5KZ!yw;2C42oK-!Ub7-5?KBvWc6TPRT|mDXS3H zFQkOI#j^t4QGNIs^coDbqjhHdfOD^!g7be-NQL;(&x3w`DgN|@n%n&V1i)4izU*sD zxwrnXwk}6$;})4+=va5z)`)QqGYvW@J8;KG#ij9377&!9RKQ2!Xv@tmXNlvCf6!kJ zyf|d)4+kv&R2NCpCA-3*Km6igD;*5;9$T4ZNk`8lbP890ZHcr2I|dFa=)P%EAzLC# z*^eelxh6z~c#=H(9uPmeCt$2SphKPTqlqFPaB)W`{q-cgN5^mEzeflBzn--6H>j;G z?CiL03-tr!ew|j%i`{GT#e6Pdlvk2NUku#)ayzgqh{)}rR<*ll5IKMGAw<p>OXO5< z>sUmV-LJsYl$3D@_fHwZyQd7{{?QOVoP>ABA-r2d_%K8GvgXi-aCc=0cl!|T4)@y- zc%>oSJwAlH$A<9N?_mgcYX~-xgB0z5rl@hE>HY9r==y<l$*98~e0X-FZ6#8`3c9ln zoJyP|WqS4*w{gM&3&;_HL9ua8)VTmB;(Ep{d0TtdtxW$`iSB*CN!V(q)KHKZ17>Rx zY2PsP^-20ONqD`B@mWWtl}j-;K`Y3Fo@V|0zZvm0F8`2<=6?sN4L_5t4qv~40j^gT zli+eo`d+kE?BxiKK`of`m?Sg5hIZa7`=xu$u!LPeLqdUD913<?HW)dXEo#Mwr}zfx z2hjx#eJ{q0GG`j?cC+wMl80ANiB(w<sG#c{Eaqn)xlw1AYTG-Y%BZS8NFPSc83y8I zKNtJXo7FU@rd*RIUxa*xr*l;W;QMI~Pr;PQxLWo}9Zr{Rey^-)_(vL&B+Y?a#xD8& z-k4BlJ?aN70ts{*At@;c;xa)$K$=(F*1_x@?05FFN%m%26Wg->YCfZt-_PIwvuqY; zII6!D(>C>4t6hgfEY|Rn;pd0$8>Z=ZONy5OZobS+k^_3~N0b7HWYhsgQQw-%rxc!D zydxuQ#-5{igW*PCKapz^NkNHb{+o1%AH%owhY$3#XXO3i$L8phVILctKESP^Q3lHA zK$Wwask6y#Omy$KXlwpE0vTk`r#JL<N@rSYjgpbD*Wn}qg_fHB)uQQ+H7&IS))s&D zhrcN-eg^TWO*fM#k~fJn@f%2-0^{&Az=?;{R4&MtNUjbK#w#cc^2brVmHIcr1FX=Y zGynAw!igAYnF>~+Zkqy^Z53`{2yqpPf)iz_b)ibQ01;q4V<rFK?|r0}e~5pEKibdw zx28V^nCb8{Xa$o94#|EjSz5s)hF*SA;DH_RPPv(Jq2G`@Qu&Ikgr)uGwzSbd#y4BQ z-0x=-lmBV$HjUS6f>KfqV>4@~I`bqc7p>|LSo=?;Zib0o1SAFHkz6(EzUInt%#1?F z9D><Smzo%tNDHZ5h}l>PS5c%vLv?U3lWi+Vs21Mvh&qB}V9I>qvp_;-I8+~=LGj$s z(iBcCB6h$=ib!>wlz-~qg9Pss5@em>k8H4I+#mipzYHJfK&+$0AO;Gj5aZF)hVY_% zf1di{c!J3la=$45&s6Ig7=;&Xh8KkmVtg<1qsAAR@|$A+Wvti&y23B2KQAK28(K&+ zawL2Sbh}t<01Pu!F>iAc0u<d$BPAbVAc1v5UiUzD*}B!tXl?Pz#YjLzq?#+~KFm#% zu@1CD;iUjuY$@O?V){JXz64^rEeF&2A#F6mI*mI1h)rU1B($ZZhmW(@&o(zFLLN$p zqDN!zsAq%SCCZ0z1_Z)suN%nrl9;IeIZQ0knV<m#2cV_zoc!iQssmZkzz~+`J>TeI z{&rjWTqUbPDNvvK`dV=F)e_(exKu%@zLfx+U$q;Y>~0u7bXbgltsbfpSuM@`K9{v{ zuVhBpwt`Gaw8OZPg?MkG%W{Y?Pnat*Sosp(SYx*GB~#kUr@DUFC}~Hs-g~)m$A61* zs-h%TB<a%Vht*<S{4}GET-?86=@>8fUm)^Cv-)7H+3`jh9E;~?lYvWcViJJ8yyg^l z55ERg_zrqjuQ|<syl&imkY~u<ofM>`s{a2++q(crR#f-@{haQZ?%C<xo!y<?S(fVF z1y&w{0`kT!WFN4+6pY6BengxBahG*PMRvd!`I*0xxA9LDUkTA)B1U6;pjn9;6i|#} zOkxC0G$zJ~nkdOHKly#W=hVG@yQgQ_HOVMjx9e8btvYqisdG-9It7L<hZb>e>_zEQ zholVR!P$#)7&xR__AMPHKBQWN!RkeV9voUN=DrsdBjk|2g@n?JVj7233;*0+6dyaJ zTDW#fj`Dq)6>dwB-s57$cC?>*#@9N3xk8Bkdz#3itO<!7gyF-4l@T9u5q|JPU$qb2 zrVq(Q5`;1Pz`=b8pGB7p0R<9@ma?QLZ0~$!g`1TIpmcD}!qe79+sOF2Sc`-TF|O{g zb4gYvgrB2Osq;?rUvt|58kz)`x!%ptgBGJI8~_d|E$m}H!mN9Gc^=`mO5tXgu64KG z&BF(zxXFzj6AwuyGJ{VW3(hwt;Mg*K5lW>8xxyhO^k@+S67d9+_-y@z@sY!eJ>qY3 z>fIjW^;(?vz%Io)7!#{2;m))#-y|ChYm-2%o%ogyvM}voon-z^>k1Mao4wyDD|N+@ zZ|jG2#}AB9ynd&zczw1UK9Cfz4@mL)EQ;6X9oeKiKG}VPo*V*eY!9-pkp%;9lKc*^ zZF`AMcrv^-S0Sg#%~Z%4RLC#>DqViEVuJ~2$h9UQz<U`d8T1x796EO6LYs6^peFkd zvzz1XK~M+vJ<e7^_`hDlKmVZm#ru(@M0|(X<`8xW=k60krF1gdp=o<-VcN1e`{0N< zduxBrK35JOOml_`G!;I_oc*o7fMXkTcA3xFWraDr%;)T~@K&2ME71v;4bItR19SE* zq1k29nbVvdIv{MFD^BqtL6Vc%hXQ!>Mh`lcmf0uvg-0Q|f|W<j>!0&xyMGL<MY@XN z?t6+!dhFd*?mp4U=t+Gl%BJIWOvmeOn%ccfcXpp@Y~))4IBf5!NC20HC(R>iTv`v8 zcJD5S*QLpMom~0vW^%sg)33?7Fg#H-e_{AzW}-%Vl!(c4+a%aBIwVihexPN}gbQs9 zuP@Jsr^5Z#lYMERH~OI+!Jqsw^K_x+NuzS5$jk~RmnYJ~e?u|h;&Jh~&K+8Yaj?B4 zT*7m!t56SY_YmgzQQgP3h)iGJOSdIvq(Gq<?YEJ=VTXB<XVBe(IMcVjKbE0kd5=0b zfUI~}JWSq4hs7S8Pr}ENg%O}FTHSK94yfi&tGnWcZL>&uasOZ3Q<52gT&NPYcs;_~ zl1=elYlW^%M#cPw;ZNZ8Ne`AG?jVv+Ld|6Qw|uLkJin}6Ddm4+L*d+@u9tW9me2a# zy6A3&&d8cZ*sufi1c5aClEhEGU#yu8<Ci3aE;$Z5dL+P;(jlXw0L~VL*$b1eg7Hh< z(7at5sMA=cqf~bHCS+VP{|PpdId9JMX58&*1ja*mq<Ax<43Kq(4(*YvN#*LfJ$lhj zTW8GUucM!7|Ln2F{j*EhKRZ?XXRYq@u%%`DXLUXkyj2e(l_7~-)E!Ac5E?ZE2}cl9 zJ<3HU-t;5$ib*pv3RG)#o24+sF+1(XKoUX)8^29akCvqualL?xRT8?Fo9Yhk%QCDL zhHjg+k6z6NEPX;(#=MO&X+vr`gH><c#D}Rc%EVW1X{TIn7XjPgByVf%986HsOfwUq zL$FJB$%o&n-45+~!1*Q5<|dbof>mwUZk6p{uxP5ynzczR)BIVZvX!MJ%`(hv?Y&8n z)T{hQ-=)Nu6~|mQj+4<!J^{AbDR&Y3!6lkYeU|c*K0>ya2(Z-Z-Q<FjoP2JQ@ew}( zDOfA`CDw9Nx%)P@Cbe>w9nPp5ogBs)ToIjxCf!@G_EYrTRa?N2fo~}r?V7a3$CZKS zw#z!R&ZOU7b}r3#l9=-$c(eueF`p0FFKXfKESU_9K6mdahYuyL{2|UWhI`=3x9N)r z)xh%t5Q?@~C>R?nMbB)*7sy0h3l}(#zCb}BwkwDR<+a3iNZ!tfr%B13u~rC+<Y&m& zldFhHigqAAeZ!x?r!SBUq*2!y6h4OXVH#%5rpp?78rZgJuKF07K~L9twlPp9Odbhg z?4_D9;Q$<|4##gnBk|WXZlH3Ba07)_ldHzI04IVM9bn4D*A!lW<KMPG^a%FTAXqI` z!Oct&?MY)}p#?PWVt$S-{d1YGenem8(!lTnN}7>#7w~CqqcS+#iuY^Q;n4W#-|SqW zX93{2lD64XwwU_f&_1p-)7vrM>yVS|C=_dl9kL2=uA!~<{ZDMWh->QM1$31MY$&X9 zb{@unV8P{h!p~ineqM!HTWMNuG3mI)girQgsC(RmBv>&gJv(lfRZ8ywkl9M$DzcSy z>~JtaBKg3T0~L05cfhMUv=itWPjpg!bVJFXKtAfa0I9FJr34UYRqmn{EBx4VBPV=# zX|8&;ZL^&(c6u&h3acoYw!GTf^nl}r=TbSWo$Ks}Vf8Oyz{{LjzoTp%L=#64Z{2)w zM_IP75u0CaE)2EJFCOyEFVIOpZS$+<n_o<>-7J|lTC~Yh#I0=%5WI%#8kZGn!3HuF z7=)3sWw-$|+Y%njeAmM-$j_XBY@iOI&d(F#nF^HH!aEE?gL`L0lgb!FduLCKp&i~~ zi~)(K-Tizyd^j-%?gyU?pNBDg%~?^49zQcD`V!Bk|2&iGlG%7AR`5(%heCd(uqMx> zc_(_s6#h#Q{WBqYncsx%lO<!(atR?8FY~m>d1Sv75dOi4DpV7>=@`wTs2*84SR-dT z;{ELl!H-t_>l0Za;ulWbDPheBYvH!Wd1T%5zQ#_$i^B79oa6Kq{-b-ZnTr!I;ca@_ zIVoNcKZV={vJ4VnwLpNK`Q8k%xibQkA=79Mj20Pc`wTLCQzFBej0|UrWLVRBts6t| zN}FsL!i(BEMus&f!x=5CMuaI_b&UFSbw*ZprzVwhc1;;)c8vrH#U~P+86d%dT1JA% z0Eq;tP$0oKB@&dS3&AlX!Kz24G^Qj75Ckt{O0&k4GMG3xB*o@jDFcUbC4FsauG9xd z#$e2jo4AsVB6|TqW)8rW^llMXnyCUs4l<77N+53n2~Q(IGRT#-Qf3l8Sy$@}5aT;X z5aUNi5aT=h#Q24B_(&qgkBAt*05QHv4q9?iZiS~8i1F!8j86~mG-BkHi1F!z#Q1cL z(xbRQjCXwmVthKpXe>Oe)*h8nh%acvl&A$`*H#r;Oneo>(94H_Aa){G{;^wm7Z=Q4 z>*gUV&nbO7s=s|V$hnB9v$q`39D=4+(#*P}Cz*CWIs%&S>O=G1a`<S1=0^q1dx7Tn z#M*F~1Dek$K=T<6&1Zyn88mq%Xg*^Qn$H-3<{cjfn$G~5baXYmO#<jP(15F$q;;5> zFk*;6HRoI~`A>Y5R$81`e(g$#cr6}8w#T9!ryk+w=R!;Bj3}NT?oeK2`0p-2rMEhR z%g08*<=uU_e6bupmf-R+!R3p<<t@UphQVbg!#N7OTPf_6;8!ETFSkk3m;ZLU{I@f_ z8+c9YmE^yjMR;*=B8QjczfWnTJ2UKKbB5CnvV)lt(Q!{W=ckFQI&!#{+L&Lqs#G4U zHLCSS@vp)b>Fpo;tS&;2A5qF-^baYmx8etsa_sOE-@i-yRPi?buC(GO^&2LS;5Xw0 zyF-9$_I@`3vy;K`cHn3$YrDtNsjztM@Vk9D{zW<5p5S=9;P@B7@m9eR&nfWheAtJ> z@qCBl`5x->{IEl7xLu}jzQgf+niU+a#7sEf;5a)URs+`c<mxUMJ?C&d-|!AJ%M?wM zT@NS>qXmJOBa4KDzL-P0LDG^*Bo#zsQ>cow^0PdL)$ua~E%=9Oshj@F*~4&JA*0%@ z6|(F0JXXkQ6rOo(W<STXhm=m_zgziJ@u6M(k)9_<<UL~6vb@Ap_SDH9@SEvBW=|{p zVP*O~ozhh)U7gYcCu<hHp6TbT%^uff4@;-B!>`s4XDs@CSU+b&|B<J|`7eO`X(NZF z1IkLLXpPW+tL%#;6ws|Y*;SMr8-B~EPi)=pl_M{Yz<gG`?+-iz^I3{qTnhy53>DiN zI7^oiwaFmA6V8Hg5U1u-1ZEZEOs9C0o8Zq<fUQvKqH()J^@x@^+~1_V;bwKi-hrB} zhgX;La9=#$e?1gkBh!Pkk(RB?ZDrATI%fFlvbuzk<i8nYXU6{zpD!`-GaY0cZB8IN z)5m7{op9zL$W&|qWOj3I5o9A;HjpiDwg9q`&DO&WeUS0^EeF{R31p-h$aw67>;?zf z;pPX?M$hI{Q%%x3oS8#X5~$5qm`vNC+4lI`2^iZQ7~6HJS|wEM`ZZmv)ePGe@S#o7 z{$162(TP8L1MAjyN1Pm&^*ylYzxxyI4V)?2gkJ?Np(99WDbf*TiHJrL&l&OdH25=o z@Mq+haE4=o<#)mvgP5RV1DIg<Nft3-M9YQ=i<>QA!pLUp;rc!%=<x<4p6e4PkY<>` zV;>W)cT8B{3Jd+}Jl^8f7vxi^x#a=>O1v#K!~BrrWTL+XHPN2c?yaCGMU9s_UnfM8 zMP`VBEy=&iOU}UQ@tf~+T0Grn;PiY3PWKtG{0=uLmjv{ThI4A_my#TgjUvdzHa zW(zYgve|mrmvgUu@m2>QF+~JEg-sH-ZS&Lz{yt+|c(+}bSG+F1*DGF!AFgU%hbyie zbyfE|bGc1mzfMqJn~5(Y!2G^GoO=yOSkkq2NV-jdx!FsL20o!n;k}*iE^(8mtr(n@ zOYH9y2f5{UbQY}$aurJ;4~_V-_e1)pSTKdcnlaq4!Dw--1&A-vYCXIv2i>dUUpeSr z<uHF$4)a$PVE!tDdG0|y0&edgf*Wq8i=l?^>rzm&li{WCIEUKfa;Vv*f4b_=*4f7m zLQTc`Q2Vr?_PAlF4L591Tij{^YD=_Q57*{UyEfkMP`lQlc5M!|YYR}j)}Y1-AYU6s zK<&<hff|0dOF_*Jm6yWF4z-hWsGaP%X89dXqYvPkiuIxPO+oGCVW<r^Y*1U=Y5{6X zv|10Z%%S$m_-_uiS31;QnM3WB1*pB!pvEbK6}HUvw4;KbaN%wf9D~!nUZVi3wXs`v z^{ztDDd{}&4j-mulLC)rHSPn~o^$E%B%RnVg_CsjUPnQ*%QsFEv=vu`{7yK@fLqCU zr;4S^Hz4GH5pYi$2JUdf2HeH1iuonUZ;4jx;T1V>UlA8x4ezUkS2%EA0dT9v0AFFW z<B`~3VZh}=h!r@tX>_9?Xae(FhENkI<=pQrOJn4Tez*OJj*-M^Pu%ZB$4JZXaNu|V zBUP-Ak@w0gnM;1zrz&v2;f4)pi(4&V<Pxpc!^?A^y*$3xf%b9-+RJl{e0c#QUv5Cd zSN~vu7GEuo*7wMX72jgK{*tWL(;amN#DsVU0OHZ^p?kFYpbLDX*0iGq**1xmLJ~*E zX`VpG8P8uIjxItrSTTp}rqGP{s8>f1L-wG)2DnFkDhKzHpQ?vza&TW0f8^l4#=(6} zj-%HUaP%4jHwP?`zO?$<C7QW-Is#$Ylo8G6pdM224k)EQ#zFlU$JfW?`1%;fSIh5& z#}uJD9aJpgtLt}<QJ0I@I^3*b>*6+Z@Ga41J-jRj-pk_suQ39DnFH@-Ij+8}fU7Sv z;4NQ5jQ`o;bb`a_1c%cJIh;;#I9Yy&gZBe;tzrXkI$;=2!_69;7Pnb|)5tdKVQ&tn zz3~SQr@aoRy*Zrr7T~nk;KZq*!Ybp=hsA|PM|2^#(PH_Cg@$FONa9PcEyu;5LW^qo zIA30l15{$yx@+5(7t8MuAVCn#7XlSa%Zp=Px`vwtFIg5wv}{0K+-zZe8QE+-yfg>u zOXF)_YsmLf2kJ|6%6(~pa$jmdMTfjPuXuI5$tzxsyQ7A8HJ*-mFxtv=wYf4T(fn#E zw{ddL_+=)24@uq!q~^`OWZNx?H6l1<tIuY~QolXX0zH73+2X2V{nh8Aa=+vD`N7p^ zxM2h7;#LcIx<sq>uses%?s&7qh6{uRn%z03a;<Q#Deg9);>W!!ued9|!z=E>A5k@T z;fjchp#gQ5`5Gpm?h;Vhw|*)L<?-$TcYN}IJKnu3EVs=|`O;}+Io_S%EPo~(5B|yR zEpviXxy%VJ+{HaR@`5|wz;$W2lsxbr@msH>*Q35vI+!oj!%K2Vyd-|qA@LGEEl9kC z$<#R7JmJij!0-}-A!h5V@|su0{a*8`RP!o422<6m3RSNX1Yzzb6qR!`54vexv|g|= zwpifh%F<tmSo3YMZ}yBY97xzaMr2e9$B50=NX$FYGTZzTwhCg$h*?aN*ph!tkvFWj zV$K`5L?M3RLrlyu!+3n)&wz!azL7JECBIP*FU|q`;`pDMiduNFWA%#xihAEBLlUzK zqA#`?fym6u2oe8nBjAbbKHwb$G&And%vi1Q*kkzylOa1)KSCYX=*h9+(GFQlYWy<D z5|u_hdUWCt9iE`LX%g~h!lMncDZ1QxE9TMV1ljKjvX9Ooi{H3hE)V<}W_8pz6fn?y z>zDjSJzSYX_R9EMuQ$kEDJ*G*D;c%hN3JaJiz^MXoOHM%uXshg*(+XwGnQ&zfghH< zv;>1I%$F)n%N4@*#uB2}eBR)E{HZrMj}wO)oX3Ad-W_Ui-uyIDgY#;T(*$#Q-MRQH zH`*xX*d<lnIW|by|FpVuwh@}@&Z#agfG^7Hz9@dx>%NHnYSn!aTh;7DTiqAgmUOE7 zBGqN<_wu~%<?(x7_i}b2Rrhi>AlXN>x|iFAVyb(&>Y_TnFt7W<_-|hKh3vek?hDy; z)0UjZ`$F49OLbqUy5%hFMHR%TBAcQ+IhL@<r`RdsHF(#=KV@$)R@jtO%q&8(THLd7 zXEtjvF|P-qCEGSB?(OtyQO7~?@T*q0kefLL>B+o;dUXnRzTYA|tAc7_bs$uIRlDh9 z@eV%Mc@1mHSXjkA2ah0nR=#TG@swFt#Q>L;r6?m%(V>F)$*`5#>dO6~CZ8hq`4q}u z;hyEpLiQUOA}xK&zZ%AT1W@i+c!O)`q`m5VtaLul?bp0E0LZ^_EZ%biXF2IBThi2c z1LLLJ@%{&F1c2sP-A(T7m1!ucbxvK{zW;(<#=189V9!`9@7vuvWXx`NrE@#at~SuD zUBAs~6$REr+>+n!m_!0QC9;)|_!H+Dkq4{tuS0QGJT(<Ahv#C@FVA&8J#Gtt=E+>X z;`d9tcB{+^-O5A<T{z*60sUGPP5j%c3s%4i|Ak*KhcnE3hlb^I178ES6sd>b<XMij zQiVbVDeHNhMI{Euu7Jz%8+qEc+kE;eTPj<~G9SfiT;3(Fcs-nF_{S?d9jzk%KVDSk zmw`+5dX2yOz@Ks}m2$aMnuLVUi+ks~=fxTAb<b#{8w6#n?gxjbXl)%uxL-4DygF`} z<FnLJfgbqXAi$ume4DYm0#dH_;mg#)F=NH<?s*~`z3D=F6?cJ;tC7DW_ua>}1Wm@E zs5SOH_4z7>3n}=W0l3qcwNck|Z@jv@5yG#Br<ld3SCQZCMj-i=II*qRVLxJ0rgWd* zRc*dJ3|vKBuf~asAhuGs$^{k7GNl<+h50g9@PQX_s;A%_r$|T)<7P!{<Gq?saH#sA z7(!L&u;oL#k)b^d$h0R^**QxjJ)wIwZj3#0baPb2+Nd!ggIa2Xp#yOS=|`L@@w9Eu z6XIF{zRpMSp3-NwLX|a+g<IiI+Ii+m{Oi*8N$8pr2kwL(D{~G&tBz0MQ{p#D+vvf6 zm}`lOR`zP1s#nuFeL|N*_(aLfTeV^A>Q(SYl7E9awz8k@*`iz%pA-oE4Wb_5UM@-* zxH2@7k@OtG8&XJEpvEiV@a(pgM0C|SHy3N?DWap7iE9|XXz_8C{a{fgY{bK3oyKqD z0(g}cbLp)q1|xCUrv=bcdv(nhannrABef9Pq>8cYQ4)X6c6;R7e|pIcX1%)a^wqmn zA?<Xi4n<3Zh{bc<1KrOK(9smU5!5lpa=749(NLP=c-3&Y20tBYd?sIk4I}A(eCAvn zS24~Q$foJ$%yQ@Jx;xPABvuq$Bc3?l4qJr3CDjm5F>HoMh^HW?W;~@7%3>)Ty*Q-O zcE;l18@FQw2i=v6v{s47O~d0ZT9P5ABK2^QvBj(gKrdic-i+X&AyzyBf**qj&&LVe zxKrfd*=%<#zQ&`4@>#_?-~@!lwz0EvuxnigOOU)(RZbatW7ABuo|qxoM{Dq!8l(~` zcuUWlGZkpMMT;$}D0y;A<f0u`6tJLY%K{gt><Qy?zGQQW@PDASz4tSUYx1{D83(ht z=oGJ1IzYE8Gz}dYl~62;qXDAh<fQW^_Hw~uvuW_=Gfr<#3#VCs;=TWPhJtnUY6uZ_ zI?4RR$86oC*+s7bt=bOeKSc*D+-TNvT&S5#ECUsxg|W^T$3=K7kN2^x0nlPe^O~-Q zPnE-`%bmaKbh)I^1R5*T*c%(WdTZcY*>V-Ceph3tOECMCR!C9ar){yV#_QxrE)ce0 zjC3pc;I4s5G9SrdIgP77SQ_BvKB8xow+G7V9Ai2az(SHhLga1-SDquu2G+^Uhjka) z`TB}}Rl>OalIX+xeWF1-h-U~w5s{u4Wm?V~L|QV^vtw97I6GNm2){&?i?S+Ce-)cy zBQBHgz-2xvxac#fJufOw=*|kMBVx^|BNVodw47yBoflL92KdvTvkLtu!$jKnkUJ{# zku9PUaSvM!<XBh9-<HF<92No`St~$b3q^H*JWV}9&#mOab=<fYi%)rRo1jYp8dh-W zHg#mj!2z1VgjHPJD6tFmD1OinNicL{5JpPIB?R)*bT~@IfI`_}<D;~>xB6*bY;-Km z1XQOuG;8?5=d)?yvUHR7wwP#G2QgJetBT)0kk4qUO8KlR0*0fObxs|iGp8|8w(cs^ z*8|WDo~1df!kdh9A^r=2V3P@7mTaAf_SPGUXD~?^rdBxv6)`!Q*noH=b_nl<N!9s9 zsIb|3<On3*`IRliD*3-{u~7?}f}5`Tlls^Wb%NJ8O4mCdZ?mTJ#sv?)-n5^hHP&Da zle~^aWYqwhi1^A4m18-(QaPO=>Ziq8sqxU0%8(t3hG~ykFUJHA!k~$XiLGdSrB?bD zXDv`8xGdu{tJZO{!xRgfU@#h1Cw$2WPtS0pY=XfDF#s*)iS8glo8WT|j)u8i@Nd1f zVrFNjNWsf_gU=kT=#xX)2lJ&gW1x7#iT)Dj(yrj4;Ga1<xI|({92fQ}3=7135V%1p zivpqr5gE-OB*yU@+RWW(vtSd{tLr_(V-fU4vsan#=@ud4FOrE@3=5@}8=Lqx--get zv~hdhOFhJ4_u)S)?IghE)%u0NC|XD`OZ~{_VVKa+qF@}Ab!e|fHQ8^LE(^L|BI7s8 zuogT{(qT`B1YfF$=kYb+Fx;%9`A*{bvP!um#v}RLk4uH;`|A>CX&o_i#$A{W*_Ffd z#YMe{z12k20a#6RDd23^X%k~y#xAJi*d)yxo*=eWGi-XkVUtmenonJBYwomk`c#Nh zX7u8eBhu9;1$CxE-!=Kgw0fi*>FzxgWEVN83nfrS6M>jN#!AN$XsRrCuI~voEyldy zmSf33dT;WKt+*9MdPp6ssbkiwu9P-5F^t1m=S0>Th|peK*wC<aksvW0S0Zvp;{<6) zVI%XOjuud|99QZ%mem;(OSza<7$fn|v0T`U=_6^}0+kP(FjYMr*aY!l0BQn504)oC zHU;S8ozGynJew}jfsOokw%(jQ$TD>fGBIS8h)mJhhG71y)!hh@{4W_unl^lf9dsMK zHM4{T;A}Sl6b0O*E9Js)(vXte%UZD!wqy|E-1GKbeGr*K#?|n^Ko~P^PfnCNzbek% zmtwnB16U=32_TB(T}9FY>&JBjX$@I@@mAz#;w?r>gX*48F?1NSMjEOr=m2ligA8G; z1h{M>E?2)upHts#T|i!tqDPO!m>e&qL}$`BoK#q5qy)#X&jzrJGFsI172$po%ElxR zvg}a<gg{T{%tz?C(qu$j$xIquWC4*d6TLC^LKSUXkq6*p@d$quvm6tmfb^OCok`!Z zN0|mUMQ+K|3bW<;h-}q0RY61QHJ$4TKmZlxqK%;$+JfY;JYeZEPyjMGB6t<*9Oz<- z{9NUjSb-FhFvdAD4O8n@Xb9+J8JaR-^hV+hiDK0889twv(owgXtFu*+GLtj(PSyN` z7i*YKc%l7Pw}4$$zIG)mUBALkExh7uuxk3rTx(yVSMfuZs{ks)Fa?>;UXQYJjlo#( z!fvfOV1?I0V~RkU1v+TR>We)vpW_?Az^o>k0!ft+7cfGR+s9byEDknrZb)J3U@(at z(}nqEE$#<Re`R#>azT#{i;Y0Cq+u!&;<@oh8K8rqsi}XX2!~M=h(^W+Saw3lCFsV~ zcbfpGiq<w5=n&E9k~t@<L^Q-{)>`vOgTRWVKKBQqj5=}3d>kf9arKul$Hyh?)W_z! z)l9B;7O+Zh)~OqC1hir%*_M#4U4{EHW;!<C<C;)i^alPmF-Swf>*jg8YPPpZ6fV?I z<0)8OaRQ1nNeEnB*5#+{b%!+b%c3bxw6(WxHmsW4o@l)`2Y9cY3uI>P>i8<LnXQB> zuzYB=OMdHczQy|n$h5Cp6P<8@kp4B=LmIIuWY|^FmuT(Q{Uyjpr9%a@qoZ`b%72Ik zRjN|C8Yi(s#$$DDY#+D{BYgud1Vfq!-f$30AQja5AU25=pzjT<=GiWQ=n-J`vnj9w zYB5uG3nUE^yj-y8cKPPItzm2{*UV-N#s!qfg);_{D(bh6EFo(!BTb8qSy3LxmtdU$ zFf?Rf9DL6^*7g2O)Bw6>f{L`WDs%%mYD`({*(%WfsFt>9rmA>COX~XLcP)ENpAIv6 zTsl=*QEOFf3g&no6DnQ-2k6uPAYImlYT4|F1=h@d8DPTPHt&A#VjDJpEyrDB%T;H~ z&UalB9rO9qYz+va7!fX><Ny{u(Q?Y{Lk2LShs$O+Zt??m2`V&Tj!lnL)op4%EZ2yw zAy#3mzUx!Fj&;vwTbN?&UT@vSSaJ=8l&4;Fj}WW{jU%=4b%ifS*n-;#M{*}4ZRou( zwnye~6W`D#iWqfc9tsalt%?n<fffbGlEU#<?%L!(Wf|c}(gVX9Qo^_d)Rz}UsMP(^ zNQk`SM#$<GfX0--X&P7WwkO5kqeb113j{=ySML@MtLKfdN-NNqe}+^IjR7<JESn`_ znFan|w{=cVFJk=cTz%t=IfS-7+sQBD7z8QGdYI_<6y$5HaYW^=uo5^M9w;5Z0?jfK zjXqy%=tRDx$hc|-?6m#EbQ<D;#xm|oY=m!wbY0ImpgP0j!wk_xo$2nE;YP{w+>p#t zuqxZTUxlq{sHA3zCe>cATcUr}EYaFC|FT8q;DSeOv`+_g+o9WfXro^22R%@;)7>xi zJ7A)Du>*SdE2#sd)&WvJk~;7!c?Z6fIxzfY4~ru>P3U{I1K6zrUM;tNn+-jg9t5ye z2<Z$=5t~6Q6JTv`j5VgzE4lW=);~zB&$zfNOSpE(il*RcH0RHa+Xhh5ILfBRno=Q& z!P_>gmPogtXfJIhl5}IbyL3d^+;Y{>W0gu7C~dbrIXn7qGQDXVP?HYLORlt@M`r14 zYfFmj*$6)jTBD^W7o)0VTFbUs(+(;7zssGwxYW16M>8Eqq?_5hfsnRBvfniRiAuSl z`?_iyClDyLgSZtTFS{M9D&;`BxUW{YQuL}LZpf-0TN>An5jSv|rai{?!4I{wqMc?f z=(SA~813uoO0`>p3D|s@b+Y0?DyrG-ifr8yrotN_Ad$AJF{Y*#YOEEyd<*I=MJ~{4 zkZ=(a_8x0>jP}c16hRaJicLt1SZK&r(G=(u8&Hf`lBCYe$LV;->+UWAW`e-jZisPP z*q#Jutnoe<d@7mTY*2%JYJGHLxhMFwf#1DV0k9qKtcr7$bOo5gkO~t8$lehezHJjL zh{$bK-NVwhJ7A_sbq9>%rQA!ZfDIoeT~GRE(p97jq=%6{0H0k=%BFL711SMDx*JK~ zOuB}2f%I_F2TF4sD5e}~Al=Lz>Lh?`isVy#{YXZ}YSj7CxTy)fM)xR>k7%LGD{%bd z(3cAuj0LMgl$h&BRHUldThrLtaMAG;VzC*IMa;o{z?r%#jE|_WPdn1sg;@stu=W4t z5@&d>M}(yoG1WDj6Powzc2s5XBRO2Ds6v91b2D~;?cEi6BowfcW7*0lkvkA)^d|M( z?v3y4EvJcP@y~HbFs2b!h<h#r16JZefFz(0#c&Vhb9Xx=I36bF!*Y(}aTB$E*mFA5 zxeQMamI=C;d^<+8%ufHPW*d*tY&}fnt|wFRqYu#C8WAe3H3C&yciRdDoV!y^sWS>s zW8tjK!Jw%)^d()U*9BJKX|p%3ko3JNQ70hbY$T+m?Q!-H`CWi)%LCCFWP2;RoAkQb z>nS;wFuWv!?aH~{Iz6|0lRJC519c{T-XP2IcJ-K`U7=@?oe4cb*77?PEAeI>cS{*$ zRcxI-&x94xPVvl`chw}lSm}N<i(0l|(u<p2{)o*IFD!>`h@W)W1`kdh7@IoW4nZAG zE<M3v%Ro!L<=GxuNukr0jQ@)eE#)M+uItJ~PF6}>;=*hMBmUD&5tm$xhd}6aF#^RA zvUu$%Zh&w0;9;5uV{e*<I)*o&1}<F_XIvA%o=|*^;u_Yps~9G1BG!2LZOiXakQF+N zy9?U16&p8qw1nbo48_HZk$~jcGoob)2h?P>Z<AOUMK#NA*a4em2R)yL!{c2(4P5=H z)()q(y319c9(ncdH+~iuY@Y__t%hdC1DZkTEmnX`Dv2rq476?@2PY}Ib2m*`C<PQ3 zcp+<#C?U-b#BgTX%&i$=$a4fbv0EQ)j#yJwUm6k<aB8n4WqxBkMpL*^QX9@EfsPd~ zS46@wuL1OJda3!X#bYF_k*}*2QGn6ZXaVd<f|vSJW)YntF8MgFQTU(0VLpH3T_xO> z-fltNg*;k%^yTu_?mE}%Z0SBCh#U5nDI{yDt5}CCs>a``om;5j;<kxf;q_!dA)&}5 zM)ZdtFZ+=cAVhLz6f%vqJ)tf>J{ia7AXKbUySC28sa?BSj1_H|7x%ODo81^(6v+D@ z(r0)@i)u{mD4czr8t{G|0(ZKs)B-^({aOSCS3QPJ?<QOYu))C>HN#eeEB>sXWXX6G zCXw8kQkb{Gq9w;V-6u1SLQWt)m1%ONyyCa5!`y2!e*Deb-JOip%~l`OAa_O^k9WEM znPqoz`bl6hps&!<sA%EVpL%zNsXw||1k;>`njzJA!C?(wK8YvPGmNc(u*e~8pGMRz z)kE(y%>#C8xLO7Q%V=>ZOL8z%k*0qE1n~;SLdIo$Hd%|glT>3Q>*$IN-gX9#)W@49 zI8wkl6!Xbcsv%o@E7mpPb%up~YGMy>keXbf%%~}^(L^9ITO6OTzGbk0Xxa>i71_2h zD)U|AWZ5#brEmhC+d)d__r`U6D(8Oq?YZY1etn{~wK_|W0ozW|<02-0u~ty*#2Y^j zzgTO`i|T1z(?`3NgZPNxB#0cscR+<f#K&Z2C=7u~RThCEISmq+&t^_wO%a&X;+(+7 z!ng>md58oyo)H)i2v|^)2u$YW%tDP&<^+bmjRZ4h*b8x84E0;-B5@^TC{4+1A>(05 zJ{YBzJac6vfK?pQD%RALE?&h5zL8e3`c6}#SH-tLoSKMLn)ezBJi}HoZV}LITYg8L zl)PcNX_z>nVvsY>X%$;#h)`!0OGjizv<yaJ%UIN`tzrjgwoV|||Nl+i%fsRid=)#) z{oW7DSFytitJq=c3}!VDA~BSlHL^c0&9^^Inj{oO*efxsj1ZR;6WrC(<+X8SVGvUG zL4$M>iA}~E6p4ZK1k>B`y^oHFr$!Vq@bqCGo4i00CR`fLNkZ=Mgxodl`HEL2z#}0~ z0POWv41UdX2;=b%CNFeMjuYsUjQq%-VyZ`dr}Bv3K^M>GVtstwH$WX-pKU@jT6z+i z*B6B5^)?qsSQRY}Eu9SLb8fK3*rK!9sRJ;^sbR)AWvqJ<W3(B(MLXb?0jUJ}t%5Mm zf5boiA0egboRp@WlrS76Qkr(0xBQN*QM}1XNyP?8X?mEHMzn0Cw7A&<DUEElPL!{V zlxE}meflsc3lC>=QkpH0(yTfoXRNdog6vDu2L~c~?PByG1Io3TMGR<l{C*OnS3A^J z=TKYiP_z6FVWtM4reXt7TRjZ55iQ#|7dKmg+Q?>!MV&)!L;SikpbZYS4LQ_^SDkA! z8yspGx*q}N`@ZOqINXM4O(Zr?M~pS-iapzwb&(j4W!6a-i9@x!SvE01j6<z$#k$z5 zx_VWK9T5}qu80!ZB$tva)*bd2HcL3hoG;<H>cX-1K2w-&^3*_5t8Dv#9_hAj?I-lO zcU)p}CbXE;WJG8=t(#lrrffG8*lvPMHxq10S%Y$T=;Mvqw4e-ao;2JNCSjUzq1Z?a zf5a$wkfVp~3nQ+{U03oM{liSI?H^?N`*m|$YQZ)!m(@$9a=Bz?^=A#$U^An^Ra46K zRCaAKg6P{xgC8;LTK1*nZ$fwU!7LXrWzL(K|0A2+WDc({c14w-Y{ld^sc?zq*kcwn z5Dm2}9mQQeZO|0A$hRCf02n@giNZBNs|gzZNFG{oRs*b4$GZ0q=6Wg>%ReVVE<mx| zO3>4VWk7#$pk&nIZIv{*-8Qz{<e*6QXDf1ySL(kX;x~4G%x?bsVScN(52xP`R=2SW zRErN*{r%02ZIk2tzPWLswR3y=eS7--Pv^`<oYE#J@|Lr_$Xn0aX20K>e!u4q>{%+n zgO_;qkE=q^TI6AV8S%VZEp}mR@%k*Ehxujf99r(ekE=VZ^n33p&2Qxh3?<3aWA+D+ zsR8t{2&UKs%Aq#Yv<F<z-3{E#DQOF^12fx{t!h)T#m+2NPYH;Qr@WOif@;i;5|WsC z9oWSNXf%*^v*>VO5oFc4BFJig#T^dJi8-VQvTWSc^}*!ZOi4xrnxX_1GPUU=FM9d@ zkh*^XR$dJs_q{4rID8}jf?}<mU1TRj3bw6Uv-qM=K@U~)FHpEo^=R0^U=qzwxV<r& z9jlaKF=$z42i!c9Iv2|fDeM^A%Z=OSo1|Zlmya;N1_(2iEOkE7SqB3%4Io(?{M%A7 z<u}E+=uwqn>;>S)RHX>QgN&(;_w5Y2e@HdNyEH6=-<WYSIH2f9(cKvY``mCxc_Gqq zXT_)-WodGWZrGnGInSbk6EHiqhDjZ^1S6Ze<SxkFJXZZ#M7}T9>QO%r-y6qvTakru z-mK6rKq$U9miU{ohxnStF8GJwCIQ=6GiFh<#A{#^wj)rML)H;u@&3D%_9yt&`p!Gb zl~?U6UzZs4y|z0s5#Njf`%HN80_oYL4@~LO_KA2W>ElUnB|U}oCQ_P>4{@3KS)>n; zM$-MH$B^p!^K(dVBz+v|gOhVz-3s_s(#Mj1nDkWATS(6(y^(Y)>38sHIF|HY(ru)- zkse3-X437X3#2EKKG>S$at7KXJ(BcJ(x;N%N{Wdj-b8vb>4OvU{HGl0X`~+}MdOIK zknSK|AVmO(-x=qW73rO%%Smq|J)iU@(v_qSHRrlJNxw=uL%N^z0@7Pak0QO16uVh` zurb%Ykn{o4pC`SS^l7BGlAc6*6X`{y-x<?J0q;pKCcTXmjU~RB^b*pC>e{}b9nvR~ z-b>0g3~@i{(@Ae3)rA;0l0J#_Ar{YPkbZ~snWSGOeHQ7Rq|YY(FzIth-%PrWbb<6z z(g&(@T`sWFrb_oRQf-@TCcTL?kZRlH$)pdE9#5+6ljoA|Cw(62ZKTg9y@m7zq&JcN zBB{1hUP$^W@aP26{iKf}{UGTk(%VR}Uv^LD`F32b)@%R1#E%d2gRL(8z^108#1hwi z6bW%5P_im8pzdydvj0P1>Qc8W+FSg;YT8#Dd=t7T_i@wwvY#&#S+>d1yGEl@j4`X{ z!Kkx?Z>wXC(qPWeuNuK=s~EhZBJ9S^sP6GJI9<HYd_BHy-W}hz(6rw&mzQpM6r+&% z*2Z7pJNKO-#m3KR&KeJb{UpojdPZGAJKc>@$_-e%1b}+{GBS+3cfY_=A3O4JT^9r! z_8+`)_J+D$<M|aXyu$9;!uH47_x#etqQCN@oXT)cbvQ%6YjyoQ*3iHDYkD#<K7mNX z4b7|#?*8hV;>B^xEfSfqJFL@nhX7z)TsD51N}{oNI~ndFBss?gWuzU;b)KFH$+EG% zFq#bdLYInPSdfZ!idbug$%F_mG~nW~9W+bgu{`}U+wpo6XWQIbb1)zNMUyVWFZzdn zvGCzvT<XKN&wqdqV-OO02ZyB`e1$`QzcdaRRzLx6iCsJ^nkfwO|3whLAewpQ1wPUj z6h``jrAAsWXdoj%%wE~SfcW`-d*1W?!_O~#`1wnH7)2sieMWs45GU|vB>FE)gLet= zF++x<w!u4k9FqHsSo*xkrjESeO?P`<VI<F6Y9z}?j$|po4S(>tt}H&+Klt3j2cNst z2a8%`0dzQys1f*g(OtszMtA;>6FVS8X*k9TT5|9d;=&@#4F^6)<=qjgjwM~G@;%b+ z`T-;Sn{ku#{BXVLp$*x-X%Ml-VyOb_Hh7H5+XTL9vdOubLei1g4GqFNj`t0K<2BqG zVOKD2b70Nv;0h$%qyR%9P)osrtrwm6FQ3EGcD#Xx?<H%u?KD&e+E)(+jQ`pvjG5yH zqRWRgf~xWLi&3fC@T1@P%94wQgVvx*H%D1&Yz@V#+y@E;n-Y_?-)XyUvR{sy(}i|U zsylm4x)Ac1!@;2!=+&56ii1oc+Rg>49SW9s)0huU05?r8KkPYKifyMi$Ww6K_d7?l zjMctL&EaNI#tztQJv=!#)I2%<#<!RW-RNkoJ(;noySmencGI@=lQpCAV@$}~v2B_R zv+B0XBDbYv8p&P&tAuiHxS3}(IlPM~hsi}yDUt9|q9qCCOn)z(kB^>)x!F-}a{=Y_ zq7y%Q7bv%R2<6P!(?>bAFQMSS`U&kbI0%p^e6tF55nR*t+M|I(EcgDHwQvG}L>Go* zR3D9FR&6AX_2Tt+yPd!1IM&N?%#IGUgXMQZZxF{+Yyii4&cpgRHlk(2ip9+qaBO6= zbuO07OsJQ|4>*op<~Vj)j$@Y<aO^U}F&KX0dB!YrZ29kj+`9P21UVeFglHV)O4Nzk zEUdTu4vww^)Tv?vkXttlxe+ZJ<Q6wufZWJtxj!<8+@<lO4!KJma+l_iyR-ngOAT@; zy#>gbd_NRlV^HQlxL-l+b=fOdZ#cxind~psD~;D%8#a`eZP-xRuwm7P=?#-BHf-oL z#x_(_fr$<64I9=>ZP>708Pgj!tlY3+d2_>t8sWefOJrmrkjXsJgQdtETo*raDR)4i z_Jea+5kz>W_No$gpW`y;bKFtlIpQqIQQ|o^uQeBT-Tu+jwZSaPCUx>gt`f50vB@nI z)w*sA3C1BWSjILY>yEGU6|u^8Z=?)FyN@K7KRdGfRSM5mA8RCFZR+Z?9R(N5<&BXN zPcDCy;zO9K6O3xc$OpRGT^inl0`Nif{#o(s#&e(L-G5f0`_Edc`(H=VIDqUq09U|Q z7>t9O-GmX+`ayK|nJy+j)BF0&LSLV`R9_D)CJ%RYSlMeUeE(v_;vl;Ej0m&h<{j_q zGYVaO#!_9yd-)Kcx~Qw7!UIT3Kf@}vA^v{i#T(TB8gA?vFSbpiHW}o1*i{<f#VR(y zi)|Mv6eOh)EgLUh+-!jtk8HLco|N<AC&dSy7eC2)@so01{G<Xeev;tdKI~_m*r&&! ziG8|H?9&Sq`}CzIHXPK%nmM+;z7@4Cw5EkGNVUCMzm9BA>DQ5jyR>&CdPiKYpA9vi zhL3=T@H8L7(+Wd)+EPQf|KLd8?78h#*pRrpaD96PXM{MH!4Exdu)L1v@uSV7#)`>F z<8fU|9m~`x)0>u3qfCRUNAvv3q*)2LZ8H^Q7JV>LhNO!pbw^sV)>MbBHPr!YO}k^3 znS&LJj}rJw;V5BPEgZF2EIvwLZu6#pWrvH!rimS85bsNzi^SriY?1mee?qZRC46LV zSlBHg+HwwE+};0nd~%tuhzi+)F*>QG4#M-$+302hi}_@spf0H`92tM}3oZfUjwZ+) zxfn7>I%JMq1R1-`<j5h&m`7GoVfgR)gyNk#V3K-{G{xqKeBE`CRyX20DJjClEReZu z+rD`1*v_Th(<@b0Rzgap*K5OJprRpK!9fRCEppcyk{0%yRQ)=yjsl0Sf-6pfxo>6? zLHdNwtt)h_Iy^=K72lTAjkqzI=dRh_jAzI?F*C`ej$8-&YK*NE90gRtV~t+)Bu!@d zTyM&zS=#bynp+uv^YcEBD?>~3xKhmBwB?nuLA1#rA6Fk+1E%~ouxTqcWw(JPZF!}$ z7Hk(>{Vea`5iMgnYEpB!S$xe7*la!Q%-4XO@z(Fa-E<wCwYHNzGIh622JI$od8ay4 z$F<zxI1k9oP{E#J81_kJ(%3K_4N<G5{klv)90Y8xAL9Bx2-W5BzMCDY%N?rAbEq!& z;ah$OSZQU=hp%D-P+guwHMzczXxW_K7dKmg>d0p6T=16Zhv&!lI#kbh*Z1>tsGeVd z>iOyn2rLW-U<>6y7#B!GXgL~yeaIOuvh%EhgD6Q*KLe{7aHeQ#Rs4KH$yNHeT>Y3f zLrJ{(G}V^xu6}Iw&W9;8;HVhRKRge(`ib0DJ4%jdnX9Gc>Nni%*dsJs4?A+;?T8<A z;O)>w)y=R2<wV`(9#gfOP;!T(BtjC1ImW*@3u5YHKiSqs1HqDJumTDu2<EtFZjzYA zhRtBB;|CHHaTO92R|6h5gRK_FZj+(jnZJ@qKAFK(Y(Thkf2D$OH=<<|?iM#&5bj1c zt3Z?)3Z57L(4lyq3wK<Wo6KP66@<I<1Vu%tt7c5I<}8y_oyIa{?=_ZLi{s)#wty`N zMG-<8?J+JJhQrEW`BS_rPu)J*P`*uqd|9nfUAA@bw3H$a9EBh@ERK^ktoI-SG<U<Q z(++-$J_rx8kccMBtrmA*MP1b8mBZ>X>}oJ3piWKGjZ=Fysm#BidmBq6t2CRxAeA@i zp}$~E0>@Xm1gs4Di1c9SL4qmyQkYls(BB`T4M_(QvZ5(%wq0XPa=A%VL_%cOX1O-% zIeq1iCB%U?EQ^yW&}E6$s(}`39$pO{FT(f3judGp0j{j^sW=O)9YIpR!pae5B%(Yd z2HV@r=5dXUafaROt#xK$9(r25IJ}fj7;&_vN9%_PRZ1iq1d_v;?6t-w4%1bkZO`wB z&UnKCBV8IlZN=8v^9)u_yYS{Pb4;yuo7jYH?HX<vm7qz*;Z~cE*ech%=NNuTy!G3* zbX^jxy-RTEP=DLu61AN8#3jaLL%jzk&v%<e8<C&V`v)$uTwYRm*0TPo)hhf~t@(x< zUNG~^s-=3Fjooth=h)x135feq^f=1E;d}Ts`LG{cXcPs3DXzwEGR2ix;RT$=UX=SU z%CX9eN_t^P;WbLJ#tXB0!AVMncq1p6uVoXw0b;|KWuDD`n`4{mf;oRJGK${VY9Jwt z6K-nT&b#T@+d55!W$Mfu@sojIhbJ&$+Vf{PFQ-*?`FuEx8DDS3mfLecmHjh75vFX$ z#njgNj34+jnw}Bgs6FC0>fz#i{x6Q7_xZorZ?e4@tW@vYob9FeY5p(v`Ck=&&K!Ki zqe}vaoDA`_lZ46O4s_Zqk+olxl7#$L#us2R6I@Ep#M`;z32_L`4bCOS`4A^S=2f03 zk1*<e0Y@P>T!tN=@3NQ)iYe@QjkUI+yo>TtUlbqkQD3BqY!aU{8}&tnQD5Yv<}M^> zQsE@SlK3iAH*Q;sx4-W0QhfW{?m`iZ)osjblM)C|+qE&L+m~9Jp_3d7P7-gNp_Vqy zkgZl37Mui1Oxd&Uul)yM!AYGzP-ySg(wN&{czaV|u7PNH1#ZFL^u|zj9N?^VbEF+V z0m1mLOD}6Rnc1-vMG@ppbKcIZOj|LIU(i+Iubq2bn~)S?#F2EkVFnEgS=1__r5~Zy zdU#?!K~Ict^$B{SfY=OA%*B@{nt<RD`k!bMBw`<2XTYbHooY99;+kkhen@K&I-$;y z`=NT%pj>6D&B;Ei^I1TxB&=q2u3#{z6A~H~Oph$atvJmCGXTp{KpEGW(EQo(w<K zbB)EL=9fLWR37m+GIK<^C9>q6E8WdiYBySR<Jqiq5o>@nNQIR-bK7j^J}pDK&ztgQ ziDq0&%5nu}NXSD+sYl$@oC#g=0V1x59*A6+M7bFk<t*Qi(iTKH6-%NV81&<Nz<57O zTM*`k8)hU;+BX5Q&}u=FTcXu^xFAQV3*vwNgROKIh#;Hc0%+d1G%qN~au*1tw54fc zN1DtbpJaI^R3%1eOWrr(mnvwnS8G7DVOq88?;Iru|Gc{9h$%hL+^}4ZR`qP2#0gh% zUd@Re8ARI3c>MPyXOFw8hqrK2pmF;by<2{Vf)YdOnYN;0sA!^hzq@B#;6V5xJd#uU zh?WuC;1P?OmA;XbppnfIwKkud)8gN{oPC-E$tLk^VcE6{ou+ovDs-BWJHV20+@w}U zEva?+ww@h2HT`3HbL9jH*?=@{sAkYh65I$21OT)-X!jBTo4Kyc(1hK%Unc-^SWW=6 z{0>Wl0GO+LDmI|*HHQH>qGcQM;${o#-pFR_+?tpvDksNpIsi|00G^x!@Z<sjPtE~| z9<WCcvhbfe|5|gkqQ?dnHmG=JJ)RLykEaR6;VAsObC!4-rz#qfREM#!QXsaI$G&F- z*BMq63@1<RHKZs!RWw#2F<$Xhbt)+ePc;ak<Vdtwo+}D0;etCmbdm;m?fOC;PZb)1 zs}UGVEhfRj4A}@F?)_&3Y}_e+tJ0m6#Hqph7!|R<9@paRO_+FeFAD<1i0T6&+T)ro zb}>2pi~4Z@r9%o{h74-}NN==_FLX3dhJ=oGwL@_S4}Lueo78!}t$v-_8yARvUL!7% z7>It}xReLg`S~J<KorfJZ9k&47odX>Tikv$@UWOmxskiH#!=p@RW9F!Os>$fRx7TD z+O^Y?VrOQJl&-p}^T4<yyfy+AT9$Q^UN5<p^u-f&7YgPEmfSorl^>+U;Mbz*!{ePS z1RDL}evavIRtc9+?7+Q_+1shR!%aTn^j8ZWMU;Gs!O8mk%1+=134&A3uST@Yp=2H4 z2RsAKa+LLe&DO((Ik{aJ-|uV5g*toJ3>W6&$%Se+@v93Hxe+-^?r>s5B#i+#d}N6J z0-gD;ay|gO)grMe^Xdh~R%&{ZL;mvZ-I@gn9t+EdRdyC7L2|uO92nv#W;@(Zi9Nk~ zieA-7n9D?kPcalDoRw3deald6%ud=s21bA@c_{2~8%?9snEs5(NMfrIn(mGWC9s=J zcgR;g9GI&uJh@BpT?kK{afsg|-9WnDBEVR@n4>U%le?K*b005pjSAl0B?XN^`BrrM z!%6;`GRMbqIK4-hxs$X!;hP=_XBJjLs@Si1Zp7W)@!0Fus>o(`9YL4CfsW^<{WIqx ziyjfkRH7y0S8!7Unx&3|jCDB*NTXHa;M53O)9lU$E|kGvnhM$f!mRA~O?gT`O-gXd zG-3Nky70mLmCDrvmaml1ro*!Cqlu5TF?6~|#2e}`HpJC6oJve$NY<aF(_n&1ec3CQ zO&!|bWZVDB<y5c4-_(@-H#JqAD)}S7$<<%8)G9T`()-GIX{uJLQ)Ytqt@sl$<(XD| zdzF;ihd0Fu;iZORf^D0_knQXTlU))a1g<s{Un*_4eIr;>{13ImJ-j}rYJ$xZC7YlX zX7)n1;6!$lop^&j#jUcN;^g3`h-0xSN>(m>o_(uLQE{0Hd2D@dig21@UR!xAWyL&5 zU=3{P1Z;uChT-Gevu=Z}Nfhb)rGh=gUs9jA;BiwpL9}h0RgvI?cq*wfzos(FIdy~_ zc7n&4d*tT7YR&(Ks%m%x%`a56*ksMW&AVWVkHGKSlADClm|?vCov*BjGkfC9OBtx5 zpUxgv!Y-2^)mJnCTC8<n9^a+b02KC5-#sF*3*%ssv@Il7+GGz^u$Eo3;V53pP+#rW zm2M^LGo~H1D<Z4M52{f{@4eYJ$;x1BS-%IpYFxOU)s26)^IBsgEXNE<@A7aMiJFS9 zA#S_=k$h8OE;K|_n21Nw!kS<gX&_BsE!FvOReq6Hr+wi?7!)s`uZI^gj;pn-><dKk z{)D=PgaEgBoWz+D33^tIge$Ae2GHc$mYK(e%Vi3%0@FcPgqxCW3m3UBLYma`dTao1 zX9trj!m$AWh!foR<T37rzlmDF6}R4Zt{9Chf8?MN1{%N#d!uo1eA_yh;bSva&yxyl z;j%ouRUep4Culd_`9qz%XLG8`^oSt?LQ&rdT5dE!(y6z~E@!LFRwhN^;%elvN60gs zMbq2HnKuOaCfT5On*@En6W^jMEVp)UA#{pQSIehs&ZkSg=9}4!aNLhzJQ~To0x#?f z?C^v+W@Mfj+2b>^ryk$u*w><~r%GHXk%*<s(yJ_Hr%6ID+g_j(PPM5(QSk^0r-pe% zB@fIn?HbUjL}X)@H5=1H^Vy)_8y8}$nq`p30g(deG8DsbNd#=b1tjlOuS7Lrv*`K& zwFKGOc%5Q2#;-|7^t!gaHOo=D2e9Mh&1KY(EM@4&g3lEWKdlHE@Lrk&?@9;Wl>qMw zfOjRpd#MBOrS<qFbrWj=z&lG?jX|x%v*Gkv;R*qdHv-;SMW}Viy)r><I^M83-gqx_ zdsgQ?cFA1U%@X66e98SI1{g&%H#$ud|Ki0R-<x;*D)0DJbo|A1{3<%W*E_zq9{<MS ztB#-Ivwlip)=%+SKP9|a9k&9Va7wZN)8t-NnDtw~NcT^H06`tNh!K!s{=N&CAN83; zq$sHwbGQf+lKi+GA75jv)+&iCOdx_?GaW)lYJo63AtfoY6%n3Hi1TkGrxCmS0b#_x zdG!3UCzVEpo*k99bU@m{H)TTRmSuIIH^VXY2>b{|4^ut*lC*~crrYU^j1APYn0gv$ zPaStPaj1gD)Z<_=YEK?hPmT>BoAk=^)lgWkN(kV<^<K-muZY)6#AztjsZGW7)^3&J zUE6;MQ^I%DRY{s!?j`lfY=;mD=>WjG9lx$~y6(Ibb6+{4+&U+(O)Db3(AJZO((i}( zjnc`<Yk&VRzv(U~uYKKlu<E~c0$b~lpTMq1oxs*_KY?A3=>)d2`~-GA>IAla`w8s2 z4qkgkI)Po+!E2qswg*mN>kmUzJv)JI51hbGx#<LUJ-(L{*psHm>HxL^{OZp_z_aqk zBd}LWbhH`liL3l-4X{pVTd@k5J<u@U`Gf9)GZV47h4MKIKYjS&saKy<dZP7dX#Ugn zO$x`c-B@zo{yqfmG<9vJk=f2{3leRHBcivuFC+Fd;kL9abCtM0bEFvISPD0=i4=;# z{;H$otV4RiTz4cP^hAPzsfxE~Oh_K61ZXg9CpBo2!+z)>Qj4FpD}IT4;;h|$#$fN~ zLu64^Wp&U{n^O&ih>7=d@*gDD6W34iv~3rR5%Xr?<Q4XNb%T4)0i6zIXCn_)p;`Pb z^#r-x3wxWY>y-p=mJ+biZl-z!Fr$rUfL7r40|63HXEVGnzE6EH=!-4Nv_aqlAQ1;5 z9Srr&1_MT<W^6F;If%iywvnIcw<uj4T}s#X;34gIBJ@t4w~K7NxPp1LF<|K^zl`Y| zWVNef5E)ojdk7n$Q9RFI*V?J3L%n!`K+7%=s6*6XGZCJJY*@BZw(3;Hk}zE4nL5ue z#-;Q8q<)?skwtQ7L#iU5=1xA&^A~IFWGTP`NMm7gmhQ<9iidQbpN~&sv@G~ni7o(r zHQgP6;Yb&+Wv~TJdfivXyKS1V7m9rWc}%Z7^{Q!$U)7Dh$#&y`D=PU_0`;gU0cM`F zMSBzTJH}e%!4`}U*4PF3qAg3VUVz=;ArvIi@eVp;HQt-`P4f<0NWF7JW~ur_2Q659 zmhSl}d{GNs=BJ<5&wr*9`~BbP)V^gz)$o)1)LhWXedUW~$rM6d?tm|35*q+nw%}%8 zmhzH+(!QPt2(b400Ro0U!xwrrzSRNL5QRus)CdV1A@m7U9Z(^?#iC)duFbIevekiL z1gxcMfG6OIXVfNeA+nCmw-oiU5vBpU!dQTCk7kG)L$#X}cr24+VVwpA7{nP&7VwkE zJuY43149;w1{Me|?G~;R^MLkYL54QX6z^rxH(2RC#O)8cYfkN(q~S3MM-)y3YJlGd zIY_YYS%AeR0ViyIRjjXiIGxbzDs0x3rmKh&%h(_1Bfb_Z>;mHC;?+Y}CY9?I3p$4d zX53s~?$FXrXU9-33Czw%%LKOAU6dn08Lr<d1FCqdUvmcO5zWZrRY~$N(So45Z00ku zTE^Mrh}aL2toM?ou8f^Oy9>=j%AEp9cE_tkn58lwqukgYMUEU7;}|D6J(6k@UeRoI zAqI;#!pX&EueDWyD8=0f;yKepCn08IEdj47hIX=W7IzH64|7sj2SY<&+M`C=A@GFn zh%vBnajJEinem-C!7A>F%B7di-6l2TihYu0tBwMUSYXO5Q``*+$+#P-b2nmQin~pA z71NDj8+TJU%dFPUZeZJDQrs=f(pM_zp_!tUoNPTZhZ#9s_;o0gNOD2~&DiR$u5&Ho z$|6jGP5`h+%9QNszto&2Bn2g*y;bvbT_ir>ogonFy3BYhC5H(U!|9NVzBQzL8D`YB zXtN*{BjShk@gy}VN^bJ6Q8JUKefXBv|CQaQJ|N0<ocETCQCVAal1|o`nxB;q?1xN& zC#QEcEewJ_mRf8YWa6ssmt(+c+wD;%glw1GWtl2nH4ho1g2Q($n=X|H{wn;^hVLRG zg?~4@XYe8ZpIUIlJD7i&=bvz)@*66pHEYUi{IB9kHT_((rnaV@KaZ_xtXb2{f36u{ zvu0vVEC1cjpC<FCHOtcDR6pxbo;oVLJgc!HdswqlPt*C&5f7_I<UL~6YHW~Lzoerr zGO=P_G`Igs++Q+7SH=AQSu@U%=`vNrTDeqh87^EqugqgX&X%@fFj3at()qp4Y<JpF zP_jccoEU%m4}DYQMBfWLQQqv!LWeIk!-*bF^h8~O(23@}exlj%vA?H%Pgw-I#c-nk zeV>sfwHy`8tz>|hmc7=NE{hH*vuD~B$a^F0Ul(%7Fa^no)HKd%2Mr!^s#D3V7PyXb z+b~(Z%1*B6+Y*kGC9OnaS3Vp^$&T5TjtfXQZO`w7<D%L?DX#&fX>$2t&uKsVI0I3I zX-I)Khnr<bqe->lHkUm@oAt0g-yGT=|LLCqOf78JHcOL)IkU~|?P@n|4sBOY+A9aa zxZ-~tjK?|{k99CAM7M+SSRb<GcfzrQU{tXIFdjP$#^Gjd;EUTVfN^A-^{_1m<F@$P z?;04nT1sHtmV<Fy0gT%WjBFPau@RH{Qq+t&d`);c3&coj#qNJ@-hp%DpL+++4SUpq zb1@Fi**u;r8)BNrbLoH-&*Jyl7Wi3-{;~NHmd85LKekBpk9DGdY=P(>Yg2KkME^5= zMlQ}z$ief3c%Osk3E^si=LwjxFE{W!!K~fxqV)uU2jjhVa}ZS?kvkkJTR0})IX=cw z`j{N0k8zZ?{7yJ#5T#XY0Hu#HI2Jg=h?Wfx7dKnL>XFUX!#O$B&WS&8sGZ|jeNK+m z=M=E|9Cb!UgqT;1@h4s}2KHf^A!2mB!oVG6n@!jl1#XPZTk?8a;!nNamatd#wqWdh zvDMomn`o-HMfFfsoNQvRJG9S;9cn3xLW4=KUN&3{eQv2*(sXReT>LH8h*ay9!wn(} zrB|=$zJ#67YtYlKb*E9J_*cc(U@(*%dxIVOHt#?3D|WZeqp7ix8b?s0lFBOVC$a9e zZK%adt68ag253G>Qxa@n6<(s(FEJri#<PNIW4elcW21W*n$|<i&2Vjgho$5(YTNFa zwudXFGQ+b<M^Z_Gu>E+Hx4^EwR>5+(#wEs5=j-Fy!ivjIDO?k6zii3%mG&|U!t+kc z=Q3Yd%h|#@J=fdl3u}3&-2!uT{J&Vd)%elEz#0jc@_->to|b8Cwfs&v8VV|hjq~9M zTU%9Zqdlj!^=PA@GT@$eEpSB3EZ(D<WrhyeY&|?aN9f1LfBL?y3y&AUH^bwhWOcXA z6WvV+{djdoqPAx94CXEOIcBoW@-9b(z7LD}zLcc`+J!SV57Itm2WAS(VqTpgg~M#% z6q)Omt6qe$tBs!9Qijdtm98dS2E%j(jkRhO7RA-3Z8MjnwaAES_?NDr(FAvoQ1_e6 zE(z<b5_tmRpJUJMUTJ4<Bf~CruL}r`^WA-N#wdgDrl6O}t|;&99Ij`_e{;BU*^}UU zc0z+TPkp$aEx5MAnc)b8x1QnTnSq<nYGhHWNkV2joC&gAhinlxf-D_!OLS7t{Vk$1 z*&;$ea|-B|G((}(dV95uK^RO!$&2_3=&-0JMMhrxshQw49vc9?G&Cg(H=<1P50qLC zrL3syfnEu71<emt(|Nl>c@#ID5$4n-(<Kw3`tvh<P(5d=w^Zn8)|db3ZWAWYyDeXw ziX?0f5<XJzb><@Pp?p@eArlB3v$oFx=(h`sYPD{xl*fUg(9jMkx(Yub?nuC8qB8Sg zS;944WX$w*xt9H^LV0(zdgj=mw`D>r?&=b585cTqf=c`p7etMTX_`&RP#oo}jnz&% z7`g-oloA{8poksKMdgP0Fy7D<<_x<}wrBT|SP&4d5R2_A{1QxAf(S#(?=V3QckAIR zpxC5Ng_ub2HDGiaVyF?$K4iU}<V<+i_VUE94GF2=xvSlJQ!R&t`~V4}HBL8;SPdMQ z!Q0@Eh2L@j2pqcC*M8ObHs8$t*ZFX(r~6*)9plAuPW3eizywmZbPGK(38mFxJYZuZ z0i`CO2+gYT1eqGE21qQAYE0b8)**q!;WUv&`(n&yRqx5xoIy%qS@jDuxWS3v@y>t0 zhkoj^67%9KF=>NCB?w4c23*q4<_b>oV4Wg-Ny>_c?}{Jo%q?$~0HEEY*7>Hv1%tF* zuqNWbZsVho(FtP=KeT`2y~i+Q6HLc#Vr`?$b{Yt*n|EAOY#ncA6D%S~^IO|tR>M|d zD2Ba!VQ46Zam+NS4W-Ob40dq${!l`N`;q{0Her>{+a_DTQ7KOxm^5q>0iq~`(Z6jn zBNDsqIc3y3f7V(D+;VEkN;<)aQXrTy5)n+J3V#v0SjYYP6p;$V;iO`)B;1>k%7jBw zAVRs;hNJnDidkd`P#_iUq%0zp@gk|z6=U0wLL|X-f&;1JG81b=0!wY+X1~SEgZR%d z8<2>>ab2IF!%cmLEI<fCayC-T1Q?sNrKdP~48QY@cDJPWMxt!(Fwh0}P2y3q-5=cd z*%BRM1q*fR<;=?FIf$8w6jiOW8*qTNcQodf116ep3%b}O7mO6S+V5|OWJ#93+yaG4 z<`-!&jpo3`6uX+q!fV$jIwlr++4@?gT;3NSqE}dpjVa#pEyzr?rtaQW{IT%u!khiY zH}@8QJW%{`n}}BXp}5?sW$q%pd7_uMO`pd*?^xMWG*QMaL6_p(Z>|o&rPT+0_F&4X zM+Z|*ojr(hc@a_9Qe&c!I&JTHHXn<akGb{33M)f?eI!Hq!99{9Ok#3qKls(Nz^zjJ z%=@^xicR3o*AfHv7iBSYkc9b9h!nFL3pdD_Y{7hV9SJ(>sl7H<)%il(@wtTafIicO z7HB4~w=Y}Kvf?c!>4V?DN0b4!!9ojtjJMEtUVwg0*&y?Nq@D-iZRbx~y-NS3cih;* zVDCZiycY%yS}yj!#F@;z_d@+<HU#m+LS<)kR0hMXPOJ6$GSXXw0?8@unC+Ie@Wh(d zEj1+a0dSfGiOMY5k&w(t#k63g!^pGjo^6m*PL_LHcp<uvbCsqBW->+uL(RjSJ62`w zQxnQV0&eYfhEvI|5*2lYN(wH5ATANG%yytwr*CNS3}x9{MEu{NiCX;bFT*R!#w)7v z-u-rSuIL1INN0~njiV77wC;w|ocP9U>wV?&m>6CDU0v?0e(@nyg=dq<y{e1r3Sgm; zv3Sehe)ltWCP-|gjco}aq_Oyu4nfSMJXSa)9s2Dj4zq$Ce{Fy;#4Xu(f%t2<@l_+U z&Q8_i>%YRt>KYkB#M>(6y3eC9z3HObK5<;_Y*n<gRm0m(Xhp7x5ez_Qm$Z9TgU7+T zY)M8?^nDi|*yyUL0D}lHLp&F<CtA_!<@;NbFT4P26Z{e(i#YG5@>p2;^j>>fbuE*S zc+W<kS7c6UuWr&A5|QK!twrurTG6@~Dz@7-P)(vHy=AwnPDfQi4<!j6tX@o!1|s$c zBE6%=rL+c01^PuK0~GYd?kT7VJi0;N@&ud;Ule%Qg$F!}%MW-YC;=+%>alyp1K=_E zWuvzh*Z>t#$yjb}_s@h`<!%8wgqCyYD5-G{QM+N8#G7C&@aV%X2B%Dij$K}WE+Z*c z0~COW_h0~WXNQ5-^f}rGKx1-t0EP9C0f=){8Gx9SP-cFBNSPA}27#(U!DCE|EB6ot zFJiA09+64t;LXKc<Kgg95w`nw^v1L)*Y5}QC}mR$W*}7r1^%YX;C?92Bi>YT5#**6 zDRanhv9W89U59`>gHY2h>t(b<t@^hOXVC5h573cyVM<KKux#Hp<_h-CIZ>Z%NfP_6 zW);u}%c1NaWXbRkwm6zpq@l97iILB-;73{NfJ;<JqE|!6x@WTl$KKcZ%y{e1%37uR z9J4N<IL8#e^*N?^m4G9TSr^9?P4%Q<WZ8bN4dpV9$;=tYlz?Pvh`1wX$@u9U)1HiD z0#Uf#9fS*3t7RsfQO*btVQeMz_NGWiA5#Hd@n#N@M?_L>y|!9zXY$>ad6=R)D?S}D zH%Ux42t#uJ{%tok@qu`!_)xX;5T^s}0*0DSc!*?XB-++=`h&e{bs0p^u@7x9+p1Pq zvu3ej>)*H*EXEiXd&21w`eopXsW#fp^-Jgpvw>j`+%QIO``>kOpzgRKA`Tx4FQGE- z(`-D$O27bl<JU0vs#0_t`A{0VxkwH{cB)hZ+y9pgtiiz0V)9~RUW^kbf+Z@Nad}F= zOQpvsZHrtpuRts;wQJ`Lk?AS<dX;RdB%%MYI?2Hn%eo&50EVrPl@l{>JHx6na$Gl= zDbz6*3SUfmW6G9u(_EJc5c~{V>+?)?d6t=jpQk+TnzX!fsJI=Bp~K)xhT)i2)var3 zrd^R3!x0>1aL`A5M#8^2V7RVJt*yd*)>)__>A!rReh>m;YwK4gP@PyhC$lAcQVlT@ zUv*EV`@Qt6gyGbLrzGaj_ahcih!Ct1?b*_!8Vp5iY&)`oG7`-;euN~Vt+FZ2Hu*J8 zFt3|PU9@7Cg<}H%!Z2TFKElJSX2m21wQaRJwl+vKx?UIV-mtK6jgUm-CE02c=)mwh zUu*NI8Iv2KbXzw!kXRplNQ|N)Us!bpMMP|<SJ^H56vl#3nPu(5G$<<o{M;<aNUqyK zNV}ihcBo6rNSA|~xLBf~RAGFa;*Y<Luqz3lDrymo?|in?D|f!rT8BC-xlFN6)V&Jd zSSkgmrld_m?c=b`$*vD#oc@n@{+0%}G7eZM|9a2N9fE$S=L|x9?7zweWbEE9XRpXc z;N0J*3s6J-n3t-s0mxXglu)h_Dl)W9XvluFzd_M41V@nv#|4l`Z7f~hv*yXAs#)Dq z*}_EF86OI1Zecd$lsfNN(Va-Q%#+2piDRS>jAOnpm$2r@PQk}D23R}er6XYi<|!8v z)+3%;YEX4?SG6%r@bPjB;JOzpQiJd?7>|Q_aH-Wg?=DVb_|tA-j5b~Al3SR8`p}!w zFwH}fyT2`r!7|#JNcUs%Rz#qR7=qcY(i~qmS62ay$nr&F+uOLSu#*u}u=9CTZk}Y@ z!G7bN23_y`K6nBt@!mVik!)y0{@YBT#CZ{$>qj-3)8$>ZttuKfW?|E4YVGg-P;Kc8 zkP;Nr`N231zZ#b&hh`7%B1s}jFuiwN*&<aJNpYNv$BBOSGU+Cg&YN_}LMSZSF<X!0 zj7=o8Xx&tYQ$rkI#g$7<18-Xv^`@Xm*kWk%vpw0enD+uGD_5vC(<A2ZjQuq4eJf)u zvneKmhu7X97Rz09`YkIBXriT*j{~~21RFD^Q@SAuTvCVzAcrifX)~&7-BIZ;t0&B9 zS=H?>E>*&&i7OEMkOc|ppq5KCAuX3}a7bBjca}?AIL$W1CF`P5byI8nyiMo0mP;+E zmS<}Nc1OuUEa2*qIj+fY3NJBkg;SxHOO^5E(tOjb1ZpU6$_yNd*K}m;w~mdrrj5lP z`V#qNP|s~MtOIt=9<f32sYVJ)jQ%?ntaiTKw$+hEM$ItcS{myrBpm*t3e{5~ljl@Q zmY}iLXX|KW1_wBnVXSy~GSPx}wvx~dj(|be)4eKi!0i?}PoRU($j#1&LZj+#MOPJz z3zKiFiy<qP!j8TG5<ko#gts*3mY3<2*{u$)NoJpe6iBZ6Fcf61A8dcj@T$e;P%DH( zt+46PDs<k6wM}RUa0Gck3N^r}@apNqeskp#20WBw3*b$!x!Vi|Vlf49UjnIr#KoM{ zFqEvRPmRl6Ud1)Bn>kpA-NAzKYkCXKTtN4{cfPi#>J*~OZR1v)P41Pfj7~3JwF@jT zrge!kEul)HGD8(1fU!X^1V#s{Sm|^1A+X`{L#nmIY(T88C4uoz8&XB-y<`~E@g<A* zyNn%|oe~N&cEfaAs5tH-uw4J257*Uqo-<gKI{%EPN(M5xY*PjaH;S8}EfR#odM$W; zx+iGiy3`Ouw<$&85|v13&xc;K3%vyy>oIc)t>PaI10;rn3_@t_AUrFe@@zd-f58v> zN6b1qz-NdfD}zrfAAve-pFwMu4S(Ur>#_2hg~L9@k}mUvmL^s|lIo)>rBgKUz*F-S z*JK`5>70V0$ns`Rsm%COIHeN&Y4a(S&Hi-4DU}oa>C{syr_z-z^Du}l^Tk$ooKo50 zWiC0Ta*01Z^_0p}^|ZP2?8jA}jT-7mRT4Y_dqbvs<I3bSb0?T$67PG@eeV%4JKvYg z$cNfj^s1dVOlUPfS8Is?n%%0`5W5f%1Q$IMgQKLv=4NBxMnf!i^uIiOCt>EG&jtK$ zKe{hG(R*7{2UyWkMGDMksUn;D1XC;mRT*x8-F&f+9xfpYt07x#ANDelEieN1m%z<| z_p}uGt+UQ(MZ~GF4MQ>lE6ud9?ecyRYN)+bghqDQq(YzB1j79J(>0w;ptU0P<_)Y< zJFq2vd8)F>ZxL*w<Sdl6q;t)9yzS4IKdM?frK(l-!|7RG;QQ0F!pz*6o@aReS1@Nq zw56~akKn8*bhH2w%=Xr~5g(OdrRCveZ`Rfb+I8-4BjB@?%@NB$$Ks?~5Mqr-b{Dr) zwn(uE6(|vdZn^WDD|-!|0oELz@3!QRMFa?}9!Rg`W6jvRn|~{NcgO0U*xaQUSfNZv z6`C6JM?{b@$<F&OzyPEZ7NBTjmu>J-5OLHtuNsWLcl0?6*Wd7(8*jR0|H8gk`>8XL zFI{M0L<=~^bHRen_%QX2aP&Fl8_(IF)hNBXcQjf1u6^w}<!jGr+<4BP{>$wj`QhJv z`t^<L&N=l)<yCL|J$MtXxgHcG?-V*m)7CliWdxLzh^9^%hBDrru99j{62U#HT;%i% zMi?@uk=W^?7*ui@-@%bV&v>Y;{WUI0Lfk5K{<K4+CRq2Xt=#qsZ1t5!JbNy=2dRY( zW|))X3FjZcknNO|FrO8Ew$w_xfwv*=Z}Im!$DS9DRX<14h=&&&o*LEg5*1&Pe}vnM z3!OXRBK2mVl73bTALo3H4zc*?A1q%0B&@et_v~lCxAwDNpYS!*Pv(9=#ISuHGQ;fn zc3e3CJ@F7A1A3>kF!4L2+@c;IAmzU6_*K%wNbe<GLwYCa2GT9_T~W`e3Lw(dM)_Kj z&2!yA66U&HC;@r_;nrz3yOW_3^KEq~Y9m^CcM~3GI#9^H_glM1=;1~@zPd;1iMs^5 zJw3=#yn9r<{r=CE;-~qCpnxd!ynxVH-%#9UyR0r-yN|+<gCZ+`vz{!ht730kciQS$ z?XY~d3+B)z&N2!G{eMEounDZH+R4^X?=F+m-w|Os1Z)Q$=fes}{;lPBZ0CPZ%z}F# zho*I4qSb3d`RDBlN22R;E^D{g!%>FkljJb&-qbc^0D=;33z!{vI|U1i`|mkJvVYva zAUwAtw#<X=&1AjGQg0^V4NCK6m0G!89lH3@evUO72fiM1R3*zRA?Da#m-@iaTS1&J zR`|sm;>y{^pnifuEf{9@7H`E?{9*o63UB<E{3oc}ir>zE!ohXsKMj;uy{s81_fcVL ztHEa`SVWPTfaFnQLIZ}vna=-N!AysplVVuRiJZ11k#JNFKFdTDfohIqYrL5?iYR2w z#4ihV*5oaX8|zx_#a8!={f&yP&WmwYNgYN*>G7$xUVLr8bDP83ylkx=x_X28B8GUc z8tUdRB~Ncef*Iq?u0>N!XqI#$3jl_>qhclkKDQF&<B-2_NG+D)18Q#;wM=54j32Gg z6GCO}=nS5uQ-=*_?hH0!(cr3~v^3%n{|HM2Eyg#K23>%r^UQ}2W-IWMIM0T`Y+V8Z z*a){f(8yuRW?t40X0In({&wXqj^I)_YIx_C=lM3_Bh~X}+CW6~KsnG)R`u6ceb29v z87{{lbQlTcS#`5@w}CNR5(|QGcOrfp(8RyfKczrqBtoIE{;+<xU=F>uz7$#@Ndb;c zskhdtQmA!agPUtZN<NmlP?nfU15L9P%3PB2BD^NFImbohO$<E$I=&80SDmAA))W;s z$Cm&*z=l$4St<2>w-v2x0I1deEmmU8sAQGZGm|~i4418E!!6qA?e>YPBS<g@mjt<n zASb=XArdB#sdWf)@O4!XEZU)p#kEimly7~y%s$M<iEcfch#dUz-d+KgG8H7a$%@cM zvx%=>DEp|TGK>urA5(F+{s==$esx4PEVH#BsfUX8DOIcs)YABv8rkg@zbM6j)a*O) z4Ag4<(z5b&wwc0`MoTqY%GkKErHuU&EoI7PDdSkOma=6eEM-$9EM>&1(k{wM60Qzj zPQvu92pEhy|Aq%yhLvW%LR)0_s-hAYj=EKro03?$EizS8NaPCb4|Wz7twb<lq$c&; zM;rrml6c!2?=Edas;<Tbd&0TP?dUyi1l(eI?cKX~s{kiAx5;m)#ebFfV?Y6#xqSc+ zgP;D{8pBQ=wR^qG_^h=>_sVd1$z8%l^uj{bxbU@4{$&ZV>F(?Iv-wxHZ_-Qi+?gzg z@-fw!b4%&(x#_*N$O?kZmF8aiK))x8n$xhd=GfSvfnQEJ*l&@OCFnke?Ba(We7ruS zn%Rfs;m4PLz3?S0bT(#$>1@DMDr;e@#9uBH9O#lJMKJGoNjbM?UE(X&BMaCwF!bl7 ziq<2AFw!4i`s!bQPSYUZngtA{ro=H<>+U;KFQol+WkrquoV%pRup*3!zy95`tTPh# ziQDvD^I4G{QY}hT*b~~4BGk_^TM}?!OuiQ&*!$iQ876uo;`y0Z3RL3X|LAjKL(rgg zh+PXA8&<f{z7oIu6JD<{9#kfOdHg-P8sE)7fl#0&AR2bDe_5iXJ6?A;vX~XE#NStm zmHNTpO|1p`x(*sjj{o`Qy9^_#Wg~)X&k>`Vo}zA}`{GKdTT?3W2abPC7OPAd-k<<l zP1~rjs#Z|~1!ctzfiGok;F7h<aZ<o=?@D#Gb59#-uVbbS;q3`z$`>4+|L!I$6SgdT zl=v-8R5~^qZVk@Nb_7I856W@*70gjA@mz=ZjB6*mxkqxU*m`pAa(KK~Am{*stV<p7 z;7a@>^7D>rau5LT{qyCTI?G0J)}`4Q(9&WD_@Gsd#?U~^P`&d9E8=RlsgM(7r+@%Y zL(8qi&+E$*_GL9zS;t5I17Eua_+^kZ0oywB+pjgO^n5iULo1N*lMv&6o~;tUq!!10 zEXWVdEdQ^Ruf@|EV9BV8-^(-A5&JFw>+XE4X&$ssQKyp`&Ksx0C}jpj)$DQis%^(i zn4-Yw)Yf=><=o~{smtU}A=TiLjFt?meYn*5G4^T=`@`xCVcuEEmr=z1W7QzDX|{Q! zr+(>=tMoET8>B%5Lj}%pQ`Lj6QY(&K5eW^&$qjwrld3XlAFx=UX^Nm2?NTMnB;pt? z$Tlhec2<5PXdz`K{&T`-TL?69tX);%#Qn6)<b&bzjgdkYe}_#(@jT=RGtn|R=C7d8 z+2HGsoI`)ZD;kTj0yj#9SRhEM`+IhgXS7-h;w40d+a+09POEh>{*f%`H5T+>3!(dH znO6-vCGnxRoPB(`bcM!VwaJs{T#oPl22iMW-m(I;LN=;(ew!z4kpE<Td4n31sCG+5 zEy}il5M`DIejy0lgtm>ShQkMhXn{#uk1m&b-S}{I7n|u1v!AgK^s2I-^*Xj<Y!a;l z0x)ARCR6MD2YMSDZ;&O#bK8$hds<X%f?@&3R~0qJA`7_I_rW?aD~)JeBXU`qtzX$i zSnAo#VyVa6Q|<g8_H_2dn?7TNs&A1gfI!fyzS02Vh{Gnve<C^xZL3kNq7px@GU~T* ztMf|@D<UZqv4Y--YG#G1wXI>y^d8@{qO{lll<L>1uR2n_xxK*Tl@2NL3YP&%UV(2* zUNLQ!R#(jRrokZu2the6oQiP>Oe|31n3fj*Ur^ClC5)}^lPFh^_s8PBd>6!&@IMy6 zl77I9$Ku!14-k7S{=NS|qdTsY;znUfiC_7u)kd;Ld<Gh0@oW7YBY3LzbL{4~vG|Yu z9AkM@`<H$e_-!ryB+D`cA~;q0!uRM(WY<hPt9oT_^IChX){pg8+oOYT)0Y>%$y<Ck zhTdkqxN-FBtVcKLwSQSkskj3qDc-=U#;Q?R9kOZtZK|Yctw!#YTF(^dKz0RL*SH@+ zFf?;eM=WC}_>(i|L@pEN@l%*a?M6<-&YswLsmeX@@iXTj-CiA8n~mLu%q<X?TB+{^ z-=q$8SMd?)6~F}rk~Qc<guz`Vh_Rjh=yC<ZMQF5Iy%w=jAS0L=s#CYl*Ep79oeFh} z=b@6Ui`D}^s&{sujD?`!2bID&u{8E=w>!ut<Ad)%Q%pW`-5NYM{=k1CAF%MFHtg~y z)`Zqxd+G{@)M{8W?-^*1W>^+HaQ=gD;NFL<y{tQC-LtNQ)^-~n7U=Q3;Fh>go{$PW zJC3uLd}+YpN0*T~QrGo`ZP=_^TTRhy$KPX~#GiG4np~LFd;M<5-}g66IImVH{$h#T z_iA1xHpwe$EKN+RBpukt!b(>TlY4rGxwrw-Xb*#40!qCI6xz)CK!f`9cxYyj5cij< z%fEx}f(?|l*gv8k=XIs52#SSXN@CN*qV;P@(Jr;Hb_-$>&%#@0tj>qtuYq;oLvRGX zDvc;>FT?3is>qaBm3Y;SFnp~53#5mUK7@q3f%HMr!%4qG8b}`?RSfK}l8U$8OFBb( zC#iVceo`$cA0{P8cf5^MO!`(*8H8^k{eRTG3!q&^b^pKjK976vIrp&%0V9dB&ylvV z2BEDLs#r5r!b4m8u6@5>_lDL0QrjZAJdJ=D9$IWsBUp<T6zc=5R-&S&g37P8iWN(I zBT`HSg^H5@=eyR-KKtBz!^8Uf{eQneGW*PP&6+i9)~s2xMojQBLUF<EgghD+wh<mk z$aw(jO4^5a&Js$!IYTJ*CeL;R_JYRkrQSS<-xmOHKe5K;VPz}U?B1d+&%LcIiynN( z15|Jm-Cl1za@nt9S<H74u?&EGdU|54p6+zFJFUN6{h6Me<cDQoTfnc*bZ2^cN`L4N zf5<mh+<#E$|I8mA5nZYMC5?BH^;$B(kY=F#4%69p`+8*DJX#=`Xpv5|`Ek+aK_Xv> z6PaKQtn@T9yU@byB>pAkv88&7Szuc-9n9pX$lA!PdL=>FHMflR>K9sQPYt2|VZHyF zDtRmoF+t2;7Ueo@Mwj(xtYP47&a3Yz|BUi;-@Sa$B-#Yfd7me3RzS1*<L{E=wer5P z9Dl7Gk5LXbwUQ&kKb?+A%<(f_DQr_cpHwc%5X4Z)Iu}z?>TOEx)~VHa>SvWYS*IRi zsZ#%@;$Kn*lenyMj(m}U>}deWKlEwuloX3v;5bIrqEi~AO(fi<I>cPuA*{0AXsW)r z(xok&<U_{X4z$}GrNIdFhJy}s;`U4%GFLc(4CXZ_6KV*%q9!$bOYN<(_7G`QCs_@` zmH>pgEg7W?zd!-8HtnL6Xj>il5-(OXJMt>!n-;bz*_k3PN7}kt36&ChA>;H4g7U?* zjkP=^rqvx7@O{KFpybDcos3iYcd7irf*86oJ98dSQv*oGN_xDc(2gEF^T=I_e4HXB zk@Pl!p*d3x6=vJyLN7_ssG6;MS}sv!NmpRX0uh^eh&j-!On_V|)E#Jmv?L+hR>+jP zahqcD7ASJvo-ZU!n>1=B;xK@v+5?fOc#>F}Mj87eVVG3g_fVnTbXZoQUjUGv%`|TO zEIlXkPqO8NEm)_t4bxU$ZccGBFAeR(WJUqNZeU-TbFJm0n#t@GXyT6bPL$}Rf)Q-a zFxam)zKy3$ae$^+$^+XdPC^cdQJ8EHwL%O-bO4(kaTr!?c+|aPT;R<blLIs+TAEwz z_p<V{(gCg-pFdC|FT9du4#<Z9l%|c@Cx!z~Wwmy&mb7q#T3BVH&I6<Ci$j{U{ShVZ zXNk6x;N*_B(M6+)HZn4cR{w2WRcZ#fDok^bwIuR_OZY8!I&y^9FpEXv7H$e+p7Y;q z_n8?`2JC>{3=&G4ZL%F!v+=}0zN3w2H|=D*($C5k)V819VboVht1;{WR8}ssO$9}F ze+jwnGWLC^>&^q)QY?>K?AmO+AxcfGyvk0&?F3%#PQXw&GZS)cqVA<^Uxi7+?6X5) zSDmoDvFRg)z{vw?Y-L7h8Knlbw|w9T;X%s#1k?uboG&{h5R`+3?V?RvfPN0eFi3>| zYOCEfjG9glj_dFmFa}uycx^bJ8o69Bf{>0lgt<dFUZ?m_YlV6qY59Kt&Mp>I3`663 zmbS;JzF7f~)iJ6xb@*~=YFSL<0SJKBB`8Vn9DKL7%r3U#D~NdT-S?kj-$~!Il<a#} z)BjTy@m5Bd&_niqLX>0;3~jl(vPv6HR8Z_j+%F4?Sot#}Y5&l*q}IvPcr+6=wo&qk z-<iHuyxB&WWg=Yrw@2BD_~PTYppgxeSkqG9NwcLC6YWlSVsZ)}J~Oj(dU0OQ&KJDJ z5LE@;pJ3dpkkfOIHGxr#T5=oC-}%}gG|{vO@T2B2weS&O_B<eDegt7Q8EpJQz$ z4d4bGQ5Mu7;7iUG>B5$^Gz^m>0}P~nstyXLP9_B@XDz#=FpaPf%otllY>F-nnNW0T zQo{(rfjD7QO6evM9MJ`jaGiKWyL<z?JFN$O2Z3YJzt6eY#9V8o)3_pB6nR;N7^}*Q za9N6JIm-|~F2c3rvC=(JZ7!CGdhf}3+0eypRAmvwTGux4qrr?)aHY5exLn1_CF=RG zLtwj#kf!?|Df|pK9UYD@N1ReeZSi>&3#cTde$g2pJ^(6vz+23tyQEYurlFMpSI8_3 zs5TZCdEOLs*}2)DA^*yPS|cSSe|A#zrQ^gQWyIIB@@*{t$QDUuO7|N{-a8}-;@HNk zmLcj>+u$>PU$h=d*KD?;CJeSlb%ALVmNX>zOw#8EcV!r9mL*j*aEo1<QCST;X91u) zs~6+el9iY(jgZp6IHFTyZ;D$QS;LLj@pF#c>$MHhq_@(x8_bHAAu2&hd>-zlFM-ho z?GhX8EEf|fbk&R@`f<27P~kC6LU&Q0<@!10Sav(hH6u!0CZy`IBWgT{+Db+za>)c* zosnb&n?&!T#c=vc>Xw+IEDkP&X|GshAW)jiYz2W~h5Uxed?x9h?T%bS*f1?Lnp_%d zX&Q4{BKt*?8#{p60*iK!ZUEUa7AA5^V<zf=eaW19HVU7h6NTLGp@JZF8qPIK1%^;I zHzbmV>@H!ti`u0;6)q7DJ85Wp(JqQ3UhbGA16B{p!Q?SvPDZs!vi_JvcJ0Fu1T_1g z)Xyr)mB&&_n_dOIvD6~`l-2}sXNE0>fHn3D-ttpUl5{m|(?s`9m<-nCu4q#v2Lz)Y zHo8G~Hmon6f_Nn{$EnIsZB!m@j%pjuG2eV6*9rFmAUY}ZK}5Pbv=hFSBDIaSl5+dY z*>+FG{pGi4sLoLhQ*1KXlBa4H8G2K7IkaQt8sjnG=uTS?7=gxwUz2FF&^&rS)ZI9Y zjY4!#99k@~6JD~sAv2C!shF(YO<mjxm#$b$`f#Tj>Q1CVXlC*{Zd8k}^rEa!J3p|W zD;4NuHD{?R<yI(WY0at02lq3B45LZ06gndMW0hS&sr)+Xc3r~glxn#VIXH9s`Br54 z;c{Cx><;RfVE;DNr`@bX(?eX>LMIY+?ozUL?aa(#9{mN-GlvdiA*n_9HX^+3NjAi- zqAqpEy@4HE=%7Uh7rq0j593lBA6FZux`=Jq)(}SljW%qX!1jWUjqk=ktHL&YNbT3| zQfe{PSD&W$f^s*vA<KJlhahA(xH>1pwnh*u?nJ7V24<Tr4TDzr_MLVtZ#N6<N0>JE z4CH3@0cTnhLd9ZY9wpRtDkEMjLg%EHvwizVd8IwFwp2JALPvH_Tj7IJ77EJyK(hGJ z`UcEnw<Z0Kjx&7As|8J0CR5pd|Ga))B@T-6RVz(%jHG{+d?vlCIF9tL(w|E2Dt)T- zuF~5|?<&S5y{q)G(z{9@E4{1qztX!(|0}(#^uN0arT>-QbwH@Its$YzN}oW;+14Qh zoNet-0Ew(7fcZ(cTe)f%=J$R4Vl|P1m+c06V|&bwrVoN-2_&hZ&|Sw8^VrJl_cdrQ z(+=sex+Be+)pnbEID0GX{P0o7D|p{g&((yKT`S)Uq4NTXX*=I*vZ)UWb}*`Cja^8_ z9yZ0kN3oC5bz&!wPw4me+4bV$$vLhdsP{nHNZND3bEong=y?Lpn0jcy2Ap(4S9?hs zOp2G&g_bPBx9>8q8P$|jHtOWiqAw*{RHSZfz+495lLwqfaGiSxZ5%)w5{FjnzBFV^ z+gB=nb!=PjThq1y$uXzcS;}{V^6gJPTUP`j?S4_-04fzh^amVO_z7h^gp8GSLr+?% zNvkY;*&K3=7q~+Oo*)RsyS-xLma6T3B@R`aQY0<45WQnl=Y565!FZybsi@>%DX|() zH06}_T8RgbCmM5C;+vHCcoI2XQP&zk`wFE@?^346DHBi^+N#<jtKnVc=jqC|OSx95 z9joc<)_q$OdEXJMF$w&B`CoGv_kIChq0gv`Icu>vsr-fwmW(-WQ+4~PI<sXl{-F3f z6<->}hFe45I(U|v!hBRJzHWJ@d<^Q&ziBURkmp9Aep_|SsSX?ALPDRmBf}}FLuN-5 zbK#w2oF!wy(rX#q`=RylK63^%Gm;)~_ODtjC!Om?tBpLoR@Kbd>G_ln^uAwJahFME zNZ-%Ii+7$Fcw4SIg32J93a2NRpBN=ji)kv<TWe_4Tj`x6P`sBQf&FbUH+aZHul%c3 zx*ja*OxbAL`mABpho%!OLYm%S(!42r+vt5!?_$qDHD6UfrZpzyob&>?VZ*N3%sC-x z$$Zf5Sb@F}t>I9w3!U0&jr!K_6c^-Mi_@Oa8`xczIkDr(umh7`EC<Av)#6!SrA2u{ zkf|&Jbs^zuR?tqv?xOVu;+mKn<tD>b`2F^#G@JQyh#)IYb#165hysGV{BQ$RcXU$x znsC0F>z7}a&pfQ#{Y1SN{)uRl{S;@ju7_*qMx4#3UijxvHR62!^uouQkuEs)!Y9Wf zjfQ*Swy{W?`n~YkMr6$QrAAcD_0>jH1aMCy%AEkrfK=ddz$;-fEN;is0NY9h+EDkx z$78>Al^vcq+&@eoJDf9YNbEHOV=<*(_zXGYR#ur2XpHCd!Z#W%*ZBI@SY$%Z;=eaA z7W;BuGtTAEUbv(Y8L|D>ji^-Ljz(O<_3Kld_oC2SA$IkhNi8IB6DsYkg@RSqZ8Ru) zcw|D?<@XPL9J%n=h`wxkQDVE)$J<TC(ZffWb%Vo&@b!d0<1KL>J1W<Vt~7LuqMc{* z1)y1hl^%+}1n<=eUY#gAs{dgW6+8crqnOn9_l}|>CjWU9V>h$_@0L+itou`=7+csN zxlv3U(XWhR68(R(5fx$D+lWd)ZToZ_U^<gJcyS{xHt;u%sMP7#HREEB{(cmPA2Td1 zd*N*!CG#C4!c_d-DXYiE3O+Q7wVgT`NijM`=!H+GpR5H1zrX0ebsA>GqJFp{M#SRx zl%$A}GQh`jlCg}K+><K9;KoPtzEMns=)n|YY>n4=s5CVpkz>?^-Ih0U;p&o~67<5i zoZeE~O5m^0<umRw<Qvxy$ry12WW@cp+v*{T19`zHCXM6vQB)enOH))Yoa+tg;Mds7 z))VCZv=`1x@pE9uQtE9Fo*82zOOjX-jNQZvyisV~mg((0E2E?mxxm$-f-jV2m1|{K zgs@Y^HdZD$x3Y5R%rV&+ssfe-ts*a{C35WQ&TA#vKbVy&A6g>ptOBKAc&##-g&dWz zNHZ%l)Uvins}ftJZ5fhPo{S%TO|r)CpPfgBXIKcokMIsct?auAe}M2-!u5o=5I&J` z7vT>Q?j%HV4c8OuZpF2PPa?dEa0B5E!b1r!BYZO9cEZC5w-FvrxJdXzg!j+P4}O?% z58;mx-a+^j!rg>=eCJj|-E_N!P&eIn5$cB9PD0&myPoi=gx3=C#$~vQ@JPZPgg-`j z8R63iw-Y{{a2w%Kgo}iF?el&VtUpe;hwzz%cMu{nh24aK@K(a332!0%3Bp~3&m!DO zcnsn7gqsMjB|Mh!Dni|{+d+67;bnx!6K*Fwfp8n)vk4aopF?<me}3?jgnI~oitrA? z=MwHF{At2l34ez07Q&w;+(r0vggXg;p746YUm(1e@D~ZMBK#%79fZ##yo|6S+)nt* zgxd&zg>aGZR|)U$%@2N!a1Y_H6W&4i8-%+Ff0OW5!rvmih48ltcM<*$;ZDNeCA^++ zKzJ?T?-5=_`1^!A2>*caGQvM3+)j8=&c`-B{)ljq@Q(@apPC=c6Ye2gAiRTcGvRK+ z6A5o6{1d`k2>+CD7vYd_C*ku6uP4;gRo4=pM0ge9$%H!yPa(XF@CAh12~Q>5M)+rh zi-a#Eyq`VkpA+sO{0qW62z8ZmH{o9r-b#2H;VpzOBHTrIu{v@+AG$_)Eg{#Gk?Uxj z@6!o)5MnADE+br2=Iwl(VcqBBOnof!ah5*r=d$P7`q;zAIr_MRk8}00n-Aj<gfCXa zEqrX#$1XlzqK}<?oTrcL`IsZTmhgN<T*b!)`q;t8D#FVMU#f`hd|arHZG5~;AB%i! z*T)`s(Gv*oAl#2|Hz7}Ag<FtL9|HqohrM`HZDniELWu?ajablQv`<Jo0NVvbxj_d* z9HJG74*ah_tVxfSRi!md_Z0L7+QTer@;0UA=nP3a{Hq1Y7m&7ZmZmmjy`YCkb7b@P zW#wmje8rV4<}6{$6K=_YNnhGzzfFCefgkIwzB={>#cJ1A?^>c5RVCpG%iXzLf3i&f z+t<VPf^E-uFMt;IE{#aKdE>pHcixL*G)kK|43`rqeWPb!pRnv=0(%uI;#$Js5?(V1 zT)kw2UtN;_Sj)FeA6AF7<ClvjE#`hn!69~&UBpm`#x|?EpOO&tNtN85t0;$M+=pSq zgZm<6QZk_$;JdNc<)}{*$fG0&k=M%q(PbIL%Gi|VB%P+?Ct9&9sUx|BSNtljR8eG3 ze&B_W4OuYNGe1?H`~TiSd;M;|w7a|cKk1^jhr;m`P52ICKVSCQYOn!e3AY<W`^C!< z7<)0-%-@z)<u3|LFB6tz;7KAga=(PaZz%CXL!qFk8({kOpt^|#(Pd+wewN^QDQ>1@ zOXM#ePHxi28E10hdEO#-4o-rTz$o?)ZCUZ>Zep~`w)Q!)Mp52PPdgPHLoEmul4{s{ zx{W^H96*gU17_=gfwgFe5{NFq!hBFqMlv0{q>%@^q;Y<PGr}-uFyQ%G<UxxG2QO8h z&NCc%$~0pkitgEKws60C^8K~4zQk}@!5-`Qs};XZ@ri5!(&f)srM=5q!CNQneM8A@ zhsMjN;OLzy|6(uC0r^i#L1CDoG;9QdVk8m78Z><deWxE9P&FZkX37*kp{gdzvwE<F znk7su%uZ#kiHtLITxr)ZF6CLm%sAJQS~1OcF|gPoiw0TkLX6t{54Cx&f!}C!a$$C| z=yo}%&nGf_YKI4gWi9B;PhYG;Hmh}(l!oJORd$Xl^CKoxT`*qda6&?ERMm7UmNHnz zLMV8vM?gHNa%VfCu-*yO28b`co7A%$!z_!QT9d%5m3pSNc}7aKJKL)GY9*dwiP-C* zb;rraXwEODed9aHrgJLqo!F_F=Jmo2p3turAy|V-CpUI+ZtUbnZGBK}Em~W~(z+1` za%T}?M!&{UX?6n3Q`Z<C>!#>p(AV^?rUqFHO3*;Hs;$ljW~liSs(Guh$}dh4WMJTW zKq@h_9B0%_jN^bEO)|$N$C+}KT3c=`q%qTgv1B*c#a5mn*^dSzgwrhEXrJx$NPYUe zT0UJZGwq8$;7(iiu>m)onejd`1N8$^1WiSGgWEhzSsBz4%%G_S4j$b%AI=t4eQ9$W zwH)fPau-G@f`@&BYJ{N-N^pa_2KhIILNQM{r8+<wa;6Pe8hD(P-IH(#MOmzLa8uz! z`SDy5{Sa5{$pQz~>!e&8(G|<#gyp1+x*>i+65hBcsNCu)t5upjQ#$t;NUhlS=Fz2D z1!{(g4K$DS`vQ**-=Zg`fFsX`a`~QalL(WM<?*-G&Bt0d;rF@@oQJc&M%=~D<>Xeu z8iw-Zh-AteCD#+B+7vmS(BAm0EdF6Jrq8U%_5!nA83nNun>Sy#L+i9Qk|vbMe<yXB zPnb@#G~IyF&zW->T0X^dpK5$))V8TrdE#mA`r)N{EWYQ49o41z6;=QGD+zZ1#Fa7S zmp5LayNl}Di`BIk8AFXTzB*0*7(DegN<B>^rExX}8An>kokGD0Nkb+u2lswsy6<Dc z!KZ|SUm*3VDVZ6ypJbrpviO&yCG#3p|Cg#BR}eG+1*Mja8R>IRQ3Se_?>6%m4v# z)$H+Is_rjT=Fgj@wysb{moUt@L^$}c%Kf>@z3}16t!tM1w9373DU48>P11xYY_kAU zYwtRrZXB42th4}glZLN9bBu7JpbGy?v^Ua~ixE5xVb%s*i-CQdIzr;NROnQo7_B!Z zyzCneTf|5P0$Bw6OhgD5FJ%)m7taxp0PGI$DzncV<3lTTP<L7EinS(jkWZnaZzV~P z*{|6#zy^}nRQy~rTP1G+0A{~ak0P^M?SM|Jd!yIQL%8e__>byP)&PTc7Gd$cw(%7M z$r|K{nfChC3pg~I)8ZB+`?-0q=;4ArVDts!<EpwDit>}{23y0GFu=mGnw=wo4-ziI z6FL8lsysziu24|kM6~E=WEmDKUl<#)v7r;3!$1aG#czZx)Q!R$F`H(JrK2@Q!br_4 zG&r<Jwso{2UYW*AXi>E!0>5AK%IpM47!rSyTw$<~DsNEsTX3+h)y|GYP9`luOTzN^ zsyZi<vFZd1nE9@tqq<~0&XxkRaf5TtW~6O;F|Wx^V0IEEyjv%=1vAX6j~X=%*2?DP zV`#-;Otl4SW9>3(D;m^xvq)nLq@ly(C4)J)(&!nbK(fVx+DH14uN7DfD+3R`oQh|j zz5@)4Mh#G~{)oDCn_Z8nX!Bw7+T{@0VzpU3Pi9%dbaNgkSJg&wJi!-dQsdseXnHQZ zNnoFBm+t1m+xbyn#uTOi!rhNmCke4AB$C}9oPY=nIY2K)5!m=)E0CtidsOL3&dYQ^ z?)mP~N0ah4B|Tp=C=0gv<OEkANxJG+IH&eyz1hVw$c#=X>mQa+YVkDwz&K2edimtM z*SsFU;J{i`h+)G#LeLHU{7#VU5hQjx{-+hLQtKt_g8w4^PX*zhD862nUaR;&Q9QAn zJJPQcM`jUkQ|gJ0eks$kt_h{ar&W6MsPsowdUK<+GA%ESM!PNz)g*M^rP2!zTbdgu zURrvC`BCw6zfN&eWXB;{p>eaXmG3mMAvx3SxGc?4I-|#0BUu^|d_m&0&1I;zFp-h2 zLb_CaoNwi2=>(w`<&Ay3i_s;q;s#;K#Nz;>AUAi5&yVQ=ly*RMU@#-l>FPk$;b&bU zhCgO!D>@o&y?J{iyj=bIW1+=cNE_ilBKHBQiO_IXkcU^P$RF9tJ;r~>=dXz?CVEtM zT$hJ8s@z3!|7`Y{S@nn2Dh*H`-mb(yG*J|=AX)B6rM-law2rW~XtRkZl1zk~t_r?v z4dXKmd06+tl-)dV*eS{qM&Ns?A!?6$l5XVco0s7XNzfo$D*~si>@BLtI6f!rsZmmF zFNV<m2W)znU@(&8xnn9BRls89v?Gz;`_;EU0LN*QY>xp6a#?YYGpbcqKU)zy@q<X_ zq>eFnBm8iv3|a|Ucp34NBHP+<Dg%|VcUNbIh-5K&tI#!#Lve+Z3mprj8>+KNGo((> zn3yu2eJ}&B1`onVtQyjXpiGvTWalLZ<&rvPMBn@+<@e#Nz=T<9!p+=1aPtY_=J!Q^ zLI=x?R3s)E;DwcbY{)hwG`{>BWPP5p{*ooFFRGMug_3?rNxvAA>Yd_SmGp~B`h}RZ zK9#yrNxz_^pO0-Fnvy=Qq@P!kArp^08^Z03!^h2O(uf7DU&4QUgpnw8h>uO`CMdS4 z$CA#DH7Oot!k6t3Q)jA6=m2jvM#lC;0T;olpJRV5qfI77r^YH%WaTxh7VUmcefZf_ z8OvYl;pf%EpH-^z-m72U;u`ck)z8EqwKn6G_mbgflpR00Iw_R#N~-HYmHufZDps7Y zRXx{gNI5R}COMv~96x1w8cT+m7X6fxeljN2FkY@wKdGeW#H4kp!mE|^93?$FCap<H zJC*coC7lqHcyQMDc(*9&1SK6Glj;ucR?_iGIxZ&Fi`^b29jBy&W6~kW9;)+T8#V2z zg~YS&BcIuP9b4y<U)hP;#_d(gaja_E6mzV{?p?>JybzIqyhfQeDU&LFkA4ZQkb8NK zIm<gnsI8&<pfVhz?9YmWR(JQ`l=Lhm{X|Tvk@N*6{e+T^j!E?zey@^_R#J#bHP+9% zpQNB9<3)lgL4A>uHY(|vu~a<;uT;`AmE@C&H*alw{o^BL=XJ{R<0%Ua#f4q$tX;_| zmSc<%`;e@9#%QzguPXQq6^xV8iFm{Kyp$X(WPVt=CqUzflO1lL95n*vi^_A<3ZOh? zB~YF|0_BYVrr^_;f%24<LAif9C`TG7PaA=9iE4b>3ZNXd5-2}50_E*0_+!gJIcjB4 z-k{tgtY8_-@&B-e8Nb_9$})AiAJOVazoKJ!RSiedUZ*-@6#FT~9zkrsda4cmp;<`e zV*KQ(q>1ONiaWIsNT`A}hy&@<);I)yv#l!1TPIkwekW$CDfun;Q1ExuS1-L9K~~!B z-yR8X?^TxHR+dO4V_NSsd!6dHMwxF{=HC+3+KIBtuC`&BqS}7+_VRn9-1iCW-y=6( zNOaL@sv3CWK*Q*K;l-+Ppc?zt?=A)ZwMzV5!RFxeOvN#9`21wqatK^_LyjP5X6}X* zC_K6s+gSak@VX8TlJIK#`QJ2ngw;K&U0KSrq50p4ZPb(Y0VV&28vpf}^psT5d1Cm# zuB2a!Nr$H-8@pdq(yzv(dX0XgO8u&mMxfg0{j#8_Il{jv+b@$%DE^hPq#Km<E2?4n z`5QHq*9wb{s`W#3ExZ!*ITi8!2B?v2m*bA;pzvjj54-l5<vfhzpm3L>$WT~@d*Uyh z{cJ_wD_3no7TOi^jtgef<1P4ck%}M{)ol+T1681#G?J&GWzMyA#%6{{k085mP#<jx zPI$-KV5zX_18fo#4J?=5)+GguKr7e~%t@wL)sWPfJziJB2pw4$I|Fpf<qd?t#W&r= zX=71UdWt?HFauB#;CF;#Gm<uf;2*7c*|8d39XHsa&*5P=7iRcQJbXEy0;}4g`thed zmqQHu9d!RPUD8;Uck24U7x33Rqg&ownB-C~jYX@l%aY+#k*vc0ZWI%(!mb;|M0?Kn zj$)$W*2hLM$xQ2Wqo`=hwI{{&G!B5O9hg>n`XJ^sWoI>GmR7>MTRZ6(C!Ojr{bgx| zMZF{7@l~U9!u8`vxc-Xxt<1{D5RxvW{r`-J0-{P*j1MO4C^Dk{{Le&tIK@Tezp5D* zF?&@rE)Bq2n~}*<?uN0*XbE`BSY&Mb_C{nJ<+~bDwTbOLW04V{2gf24L>K%=qdT<? z=F7)pBTTOykBvZGJ&KJslW$EiA}VMp>Utn2qnQ2@a_T<<a(bNjgURua8`05O--3>G z^PpPCgi03=Op~%MTux&6TjeP9oUNZIX{KMJxOFO}DlHAjnp5*BuEs!Pe#-~<GhLla zgl3~DzUf!f%-X!r>k4)?ZLG8Zqq(!zc(NwV+EHh36xeG4yHowB)|Gkz{EQNQl!Siu z6eZNl-+w9LDeCBtDE_FlES~uQ@js&Y9|mn37b0SXo0lu;hn4h0DpIe%*C_sn6o0tl z>-F)U6o0tl4^w=-W4%T3hbjKa)r{_Z&(&Lt|4`DCm2@bre_US68vuM=sfQ|cgDQMp z4fD5&-=O#>DgM_|{L2;pB*hc^920<eFHU2m`?|8EfRP>Kk}6O8CQ0WFDs~XX(0tMD z_vojt1of*Q1gNN;Ol^ErsXwSTv=%@ss@+tED=z~u!6yowTJrn6DtMwQSg-h62>F)c z*DL-96n|uD@TK1&{s$EQ{fd89ihr%*zhCj(_TuG`6#o{*>t<EOMKPW_O7S05ye=R; zoFQ1#WVPSl5uJ(1EoNzMF|{5@BWP0#BqTK6rUu$-*sh6as_Xi&IH<8F-K@9ajT=K< z*R+E-1P(61n)*bt2ROCsj67&2GpaF-xZN{ORhmoBw9Tw*Q=3C~tRa^+{M6Z&wNbxi z$UvLsEuIu`*5ocuR>&-uHshIHk0HUqvTwAr39Dajd$0yV0+z_Jl1rOb$OkMH(Vflc z*MMC_B~R&yHF60|6;TzJhc64S=KZ9?tthWrLQ?4@Sbj#|8C}9R9G5=C&`4|6D9t?? zbK8x5;~1h{DWZ$?ni6;0&;p#PIy0)Eha4Hik>$s<VVH1iP&*n_cOK)z;DaMgi<ScF zwg`I)Mlz&7umdfalgN1dGvHFZ#&iO86PRO{f%AieLga(=i>vcImO(X0Po}_AL2HF! z)<~P7!t!yU6gROMHNDFsOuG)0ZHRh3>4&}G+|?PSNVpB;a(X^&iM?phwChP)Luy(s zZ)zHHdtX($CkPGQt8;fEKR&s1WA`COus$ZTCl1HKYN2S;8fRqGsv*MR*uEe#>gw3I z0#T<)8~y%~bgLe0P2!N1m#m_z2&(+exH|_ujv|$yNVy;~-#2;k$&e4SaDn^iW~)d= z2Zm3afiLZ>d?N<(@v<>KP2?&-9wac?DRkhFJb&}X(c5RsPtT^`CJom={ObKyU~?n8 zHvQ?8UoLrMw9X^xEP+sN>ornL`YGzf0gj1lcjJ|=#B*oIHe*bO@Vc}wgEw8;yxpuH z;iX)|EML|eN;pAVldh6;V#3l!Z^aM&MJGy|foQnQ0#=gp-Lw7j9kU6>0TpPLMZ|%0 zHU^x;?bm_58B^zMAuKuwl>R1uT`sXXjOgts?O#8UPbL>cded>Gj?ld&-8Hu^T%V=` zVZ;1D8=UBJ$o3|vSNv>*c=y)Qf{mNo;Q_O(&~;>aJ>fdCSQ$ggc?UHxvLZ~h!g%%o z5%dA((D+YIN4=Mwh1s+4xtnwK3A?%P>QCppD)n%M+7FkZ+x>0<e)yXI=Q*-RS4FGa zXG%c;FcmaP(aT~U&OeixYdnLKE6;(>NIAY^$47bCt{j?$2kEvcNvsRyOH2=}9~CDg z`{R9li{c8a0_UaB(_N88z-xKbR~Kl_i=D1{JEe%-wTI#nM{b6t;nNOjQm^H<iXwyh zI^knH%5W1GusK6C*YzD0(aY%hrWu$PIp%O*mWS3RHt!uS#52c+Iiw0rmQ2n*{&O(- z!e30lx*!i3J<x)C<mRf)spopB{_0<cv#umnjalcF=Wzp;!%D}1t=eR99I@y{SC$b$ zwh$=Mxt1+8KKc3|YUh2;T&)ap;8J6T1&$@CftdzwZ1K~ai@2FcxM{bAn~54XjESwe zoXQ9{ETWuVSw9eq3K%+hg{8u=)Wy|~uvBR7CM>mtB^H*1r4Hwqphk_e+K365Iehw! zs{*BJA&<*Fgm4IhNsLUk413gX?~F_cC%S~@Gz7lo^i7evvDFlYTzZKwxHE<V3ddGr z+DL6Jm7!8F&zh`(>4aB^G<^w1d4U~<s+BWgHV9_S4K{RI%bOecvs<}II)mRu^|40) zhXV_?HMG^2i{#~XQ-iMB#(<jzw0mf_4xT8n7NG>OPoUr%RiZPG>G*}?kJW%l0=FZc zzC+uKfQ^GY{Yb#=-!`4E6Cugj6wWEQINga(DLT<91&T0EU{?_@XB0}8GYUQFx0`S^ zp`1}1KqzMv2NKE|#bXGM)Log5yilwm02_}bsB}B6Bc!Y)fZyXqh<jumbBXad!b@pw zMm%B7kbi`b{FuS)xctc+#I|-$b6zvQ>bmh+bG1lm%{Y`%b6aL-JAJ&NbthN1ixz~x z8lz0!c|uNkhydP$0Y`TL6$mETxH1hWhI6-v2)vkeW1^ac>TG4J3ETFC=>H%G`xLQj zNoPTXB1EgqR^p&IrV>0-bb+~p=z`Z!MHlUGx#(hAo~I^cn3K(iLs;PhPt$Zz3E0_x z+v&ugzruf;RBvcOR9j41M|p}c@vWnR*yJ$MUr+s*24(oWvK)M!Gc(kho$>kENp{S! zrZ)?cgA5X33(iR;e(O<O$Mk@z0teLS{`KMm4N8nrZfnxqP>nTd>_!b5EAa-SPm*@9 z1|O>i&1A{kDlmKG3jq%V-k=`vl0)6M$gy0rF)+Hqh}hl~=ok@wrV*irI3iRWM`Rz) z3gU?L4Xnn9$cZ{O84aXAhAbFMXf$vD+(=kMg7~owI~JF+2XBYBX&}J54Fr!a$T;_K zbip#}X@~2S`c92NcWr<nk}Huu*m>rbP%g|OF^~Vr$A7l;ih)K$bS`S;5hgn8klm`c zZB{$T7Cnrk^)9sxhoeQ^0@H%Y{tJaA<{qpYSd<83wm_&Re&FaqOn1i2$Dna+HsFta zS^0Qd=1uKDVNeXP2#@E{w6n1G*Q;T?OW4SCfHFOf@>OxX#%s)nniiazxV{JDjbA}E zZQPe<@!UB@9B(}!1EGy(py(W9Cx_Km6?wQfipL;iEI}{-Xa`!uno!%Ady*t<<~1e) zw}QNSn+S4E{}2-)O#`T{9d6Q?ePoPUpeA-YY`v$##HnyLINUhVnLoYuoJlJgu2jTK z)qECiP(^;TKtA`#<9Yi($eSso=W?w2nN`D_5yF>UcoX{&gflI|bDi=6b|zW>6taq7 z!xz4md_w80P{br#AvpxsFYJZ!Wh;^wW$GMLKLA#%sit@N5Bm)>yHOI}c0XG#Nt_6m z|G+6&#*<Y~4|C;pt9iMEn125c*<a&MQPN#o>xia&E=Yl`f+WR#BCs<#fNK5D%ia4- z*JA~|_8l@ZmjA&$3e-SIHT`M8RgJ{;`#&M1=;bXv%NzLolPZID?U7!`6>Z$klZ}+X zr(*(O3|o(*jwkdQzGM9{dS*d+QLle~A<@>nW!)dK2_rN6ZgYpyhLS!wiL-Z)G#H7x zxL01%gJWmqr9JeY<sRIFUhf;o(3J#umv3$zGUjk7g)4(ozapm8GscwlG*opz2AyT; zaA+0|_-S<7EmtutZc-a9wprq=In6QMJQ!C$iOnz+8Q#n#`~mT+>~7CWU3mS3yVI=o zU!p0DnOy5Al0>l~cVH{`)o6B5#J<+Q_R&{QU!kwKK~-PTU}?&LWAznP-&kKYo0s)f z1O(}xIbD7Mb_l5Q^9lIa+tGK9)ESr+M@b~+Bjix+dxSi_`w%093<~Go_Xt%j_V!Ch z3693hhsl2vub4JD<2qpN*=$ayJ2H<;;{e+k<Vh9b)CC4iS+b~OFw^VmN<cs9LKy#7 zK)Cq&Su6G1YFoN<iB9V%?|NYEOM3YK^IIca>@vM{_=;GUy&5TQhd3&OG`ZIdSN*5+ zAp<tCq2!)}&ET}NGx4LbEOY9L6d1I~0K6_$BdSA|eh_E*x(myvshl1(030!{A10+< zJ%K&eWdgsN?SRxGm<K(0s0<6YhX1CLU^Th8xQRD3^;6p>3vrTO_b1%pJV7&BFCjwQ z3EuK1USyOfzm!`V8#U@1F?uurbH3`>wAJ#=n#cv^aQ0bXQXWvHfoAqMX_DkiNDc=< z404;Ag*WLZht~Y`aqs^IEG^vom56jnA9B&>h&2C)(PJONg`F2zDm4}5Su?4eX32-A zQHjNRK&xmL@cLJDa`Sqgbg5w{SP1XtpDH)1!8k~bGQ(Jv`lu7(fFI=_RY1oe3vNoa zA+;-ckqt$h?IKflZGfqOleSS6l62NIstns)dogH9S9v2&+R58!LyOnvrg8Pj$q2kn zurKP#$&=K6H}uPYLA{wYjnnQku?kNp-#W{Jmoy`=5OEo?7onN^Ky>e^#Tvf1%1@Q5 zO;`zcq}nvMFZCa~3Pv6FGv<aS00B)TxQgW=36y%iX|{fi5+*%iC{f8;uq6EujDiej z&wSZG0!3Q|BC7(avlVW1Fd)wI`q@DZme>cRR%H&KLqq8*UkGj8mdM2n%YT?PinR@e zHqKcDPW9v7v-~?eTGu$l)iA?Tz8v{ugo!jt4~Y-!+Y0zF-R(;F@C3E892=q~QC;4j zcXfZxUR-BsBT<O{f%s%B=)YVN@^2Cmg!CP5b%utjBFZ>@(^4#rerqn#hqd!qQ8+%S zRG9fD3CLNFv9Y9~-j(Z)CK(WLU_VOJk1F4gt-`Y)r8Q|ZTUQTl-QibDY%Zq;cI)V- z)dJ&Z>?FLOTbs5bs5ZC;?7Ks{UeX8|vrLR$_DaePf0dpMo^pMT8*k-DTxxAB?7ymj z3l1m4ZRS+5kaC7wxbkm=lT?y)x1OCa?P`CJkx%+><SaHh@;yt4ZV@?+rYSOMPPtNU zt9*t0){Nlb2ofxiU5{0AOW5cbL}X^+QpdQUnE-c?yWweu(+F7AZMI`ij3BYAJImU^ zKzd0#DW?C8T#}zqVtRCY$5`H@4a*DoMm15>#;QgYkh9<lpBhf)i57-gM~D<=!@SC# z%LovKu0z{`BFq|f*x?TQs%6Ei37ymEX)!8ot5PA_UhAUIAs^U1wfNSLut>!!peuUz zG;@IjAP^Msa4<j`uj%+fMq=*ZA1118C*tg4vP`F={K8!cf%X(E=J~UYE}4FFx(^VS z7W=7gj=Yr^#Z#Zi(FES;tVGB&cY>Ka`$)eHZdA`ap*`VS3jxDrM*b8gx$!Z<Yr+)B zOuvh`tkqCtn1%b~{$v2+n@P4{<T@tTsz}fD{zk>nf?Ehet1d%PXkOTsTg}~}H;C<h zOMZ-r70$`gZHt!pfnbqQ6^>W%wyt;HnCW5h)#rXBZsaxb_Fd+^UWS)k)B#B$#)viP z9X~c0c!H<4t{$gmZ7Q!v+>bfo?P2dLYqN4>`uDLy>@we;<p<;$Qgzbj0__f_j`enO zu!7jCC#CiZFMIRjd2w8g4zd3$?83V#R99E*Gg#G7K9X(gyoemx9JfacJj5q%X8KxQ zDzEZGGY;oa|G-MXYgI5$MH{A^iL}{)-xwnRMvV2+LR(EdE#na-PIBKj<qp?t0@dw@ zLPUxUhS=9=Y{W;@SKFo7JZEg^rQi#83krTkItpV69l9H%qxLhRTOIK`LluebAr2H^ z!gx28Pa3hC<fFp6ILYaSwil|VBmE~;9-6H|Xry+gRSKbEz|DtH<^rBcC&WqhsH`r( zo9ho$RYDFuwM9gm`$|vq*{lJFQ{^6evp!}Jow}ICFyNP^C6d*D)dUAMS#H}qGZ&^( zY6ACEanAn3Oe<E^S&KdaVZm$Df}~-fIfUVKb3LU><)@lxC_C1k3Kd+^-*b0pC_pz^ z>7iKPuoYdIq>d<5i?HBLJX~RYA`|oks;DS;$LxcNSVxsTTk{Vp(SDgj6sD&Li73NK z%Q(JRA(jK0PYc#7K%<-a@j7t=$J9%EtY8`Ex#}|v61|ZjP56ZrR56nQ8k`c|9=3&J zW*`&1U{EzTj_Zn_EzcO0E;U6+<SL^@vZ2#J@YcKjzEu-1%ESTydIb#F17^MqWfBee zuyrPt(I^bHzmMa9k?aEFkZI){jUPX>dezjUKHA~|v7J8OAR~6cYFz0yjExe-$|X!- zNl^KYf{rtp$}113sYx}O?<tlw9doh#;T8>eDgs%7NQ@`|5=mzukKU)tp*OCp<l<j+ zQEDv6Frzn4GCPAb4Q)onq}zBt7cJYIQG}1O(Sv-*rcn?|20B^P^qhkEX*p*-Y%%Wy zQpeD(uNGfMYW#pEMHrJ>H}zm=7M07H6P%Het*|~#adN5t_^d#9W;_HPJ#C<QgtY#% zBz&1tiAdAEs9pwuYd&JfraB+s17wMAq{?ZgC_jj^k-Y!&s)WXXoPsSYsMiQsx0V;g zOpC&Wn+t2Yuv1qx^sWfdoAGmcbeOC0#M7FP*&4wLByH3f5ZKj>KL^tq0HXx#CL6XW zW5e41D1Ca6nI!3K7-+;e86jXaR2a9e@nKqly6g7v#<(_*H76m)Q<E<A`}VEfdu<P5 zG@tbSx2YFn+w59F=R=W{R`stX1CtbVo{mOkNjklXN-NZHqF?PQ2_(ae6m&w)GS!b( z6*@PrpkvNV_aCBfSC0Djj{oQS#%}B4UVpK0Ekpg#P;1Z@JE*sEdad3zHJajSOE;!f z(i8?$QOq==1l?FC6~u@Cl3+Nr1MH+Ir%E~E2)A5xGc<~j3CY`!@Ubg+uKw~F6Y*fk zw)bXSB-ovc&u~u9A3)Iy?HMnHo7NDSx}9IP$xJX)yLNZAx?PegGxD;MiCunaKdY%f zrBQ!9tiQijdhQH`iR+bFM@_GsORs$JzA5}7l^uF|7I(r_bIYfn4x#yr=2^MD*Z<Ld zS8-);m@yug_Jm58&db-KI7JY9X`K2=5Ucf!HVJf*gAa`u*v43EVYXA`c`ow^Rt}g8 zarSuKpam~(1)h(2<`(2eSUvcJrJWMGTTa<BqwmR6hb_cHFQ^64^=6<9#Q#0VB!F{M z!5lUMkvfXe3yb%BMAvbfa5*pr+w4@HWtsnVV6ZVnOb{3m2mlcfAwLN?n1q7E9(nQ| zHhHnXaCq5(jk2nq@{whQlENCYf?jlb`=}3t5B`WSU*pF;t|y@PMX8w{ZoaFj>x<Np zi8>@syhdb9^-eS%ot0mkm1yBr)MIQs|8>3osZd0XH#6=L&iIgtsUb195zR0g%Q<?{ zYY#}kj4kn)^uSGX>Ru6@8dE)82r@H92WcO9#{TxN(Vm;bm_$;nWgWFvgVNHRXQKmc z@fAVYCvhQ>jS*M(;fYH~-Vu?E-UPfEu_Bs{NUoDe?nUERGBzYE0dWIIIXKFM9+oUq zAVdstGc8XTs`7D?14n3VB955u{XT=$01U~m{{)}4BmOvouq6m#M*Riy!0I?W4Xd8L zRt=l^H8V29JD*KQpOP(BcnzOKf!(Y6L)IuQRIXC2@+fpri)2iR2FURU6RLT^WQVMO zrTBrJ#)bPiE@TFRJ|n1C<_B5$iv5{lIVVj+6qV>YkpJwct_Uw;D;htM(+d#ef{<}= z1ImOIwfPJwcWB)tF?rr>yC6fZ_I#3W%5&6YT7|7{lL-1>==$zaSTj4#%-F5A6gVe% zRXR;Azf^{M{^q7EyanZY`NdKUqLQ`IIe2xGjuhmYgw#TsoIuC0X{cAe*u0&rU6}5V zVzb;P`>@AdaH0qO@((yFQ(<i~>_k;es*lJSdf^?kgQ4Fwz0fJ&v-+Tzm(7Z#OkSqL z+b<?@S$V^1ZdHu`G)J5X9$8sfCO+Es5mR&*Ve1KcDMv&-C&G?d5sSS-d%|JJz7u2w zUJ4mXeYLdlf@iDQd+6CfjEh2s<U6CPcwwUan^Kz6pQS0f@^&DVFAM`>)Po^nU##DS z?MF~u$Le@QEys>o*GC=Gww#6|6hpi8kh`k8Q=Y-1s~88=cl^@iAoqI|X=q@=jecY+ zk-PkoE<8$iWEv4+RI%4{P{3lP-AzkoxV)$><0^y%a?7-*4EIur8~Fffu`wX@+CU6) zaSRqhD8HJW53Fzt<*SepaQT9zSOKE*s<)QYv`W5wHFg8ChW7DV7jprs>6^xs^E>%4 ztGh);?Uym3*UJCOuRv^5TKQ=ZOMX^{w?ZAFL>=@~H;z=LkF}pRied(ll6WesNj=^Q zlFB{%4J;2QMBnD6RPpf<Z-VtmV`@AFbh$x+8E~rBt*{3}Tqo>ygK#EO7R=F>EDqbD zg4g)NRkSS#hgsOpiJN+rTLdR+>RT*tg>Iybm9q2sEP)3rl^4qQ_YX?B$@D&W9&n}N zS@{7J*%I`if=`JbN<-v3FC&rh=9-nMh)}ri)~gnvz}muXn)N1vF@%@r^a)3s@G<qT zI98*6!WP8U7JVcNc$hrRPI3+t4v&3Q84yzwB*Kdkq>!ay$8F9&n~=&)_?9Cx#={sq ziUc)P6NE4w)0Wu6n{kNkYb?G0k*-_RCLZe({!ppYnELrKIyvSliF015I|fDKyvI~s zX_i)Ezw4c!E@8iLW$BOHP{i1?aoav~#s~^63G=To4qY%Wi^!qHjY022apUPGH&$Ne zojak4j73Ju&NcAcb&A<6`%ekWvY<2e!AImqU7|Y)q2<+j=pfwhe1ALkFq#OgtkOwI z6UmQb8F6FRS_V^v@+f4jxxN$TlGwGKB^fWTA%lmpbc+>B&uQ?CG7QnR#j+aQ2_<W_ z5j#VvCZ66aFONLkIG47qS(+o|%}m<33`PKBM-za?XW=vvUd@W3oiH-3jP2T-(vrq} zRHCYf#0^fR4KPedY*+N`Y<DFpH-5_zx~ySk_lw;DWK0!H*)EV48)3T{lS(M1r(LmI z^hK~+$m2Nl+bB7i4RGSAwdiqRvWR2ohRJTAnbA}YJLy87b2sO$?V7hTiVw+K)onVR z5Q&^AnDQnweLOJglxS<1C1E>SA)9dDuc6r5?>|pM=pDKeV-;Ce4xRY#Wq^?nRpg*% znMP?XYbr{cwuW(7|F;+_mVYk&(gB<~tJ;_Wd5aeNKP-t7jvFCjP?kbuN8C)btx<#A z|G{Plgu|sJMp^%{7+s^WJCKDI0u0eyv0W2G%ZR~eKw5>RI0rNukZ}daVoVK?wv|uR zH(<(-%Ctf8_s7_FxP7Y>fkt`Uzp%Hy5afJR$_sI=yNSgFMm(U`<>!GUO<^tU?XAeX zyk}~|45_e)ZcXX7h=#2Yw6-|#JcfC+%Ept&xcb=^ja{_~l?<hX6VpwxGKxktJTcja z-{4aUwOYph135RrXhCJ8ENw>#kQ1}qReV}!smhjH&6c*g4=%LQ!kl>yl-+{51=ibx z$(E!)6ysQFD&R=hRKpU$g)%aMLLHoSDbw>ZNFid6XeAMhkE7O(OuXSkVr;Y^8Cic% zSc_%?2#OPj9c~=Zl-61}?B-$DmRXRhCJ}&6A!Fw`wnkBcH45;RnN0vT3!9a@|HV!| zCyAqnT)(^G#2@~-$l4%2x}6Z82OKcifwh#0Svah`Lgy&qZlrwfTul%;AsaZnM9$J{ zmE{EliEr}ZT<|w9HcCP(7>Gf~LJZNh9m>t{enu9%UCY^~H##s!k8KCjMYW&Kc`#|U zy^C;(R!?WPjt`x)&)NYvc|5DTbr7QFk<gSZKhLHFw6k6`xqA<OwxJi;uxaK~7z>A4 z6UbU!S!hvzw~x?IhEQy>(F;%BwB;lg7PRK{vT84sSD**h!P4Ejz_ALF3X8k(jA5n& zn;7EkxRZQ+RSZuq6rA@lh*RaOaWh$jop9##0|YQ&eF=!dN`ZGc?32M4`xwa>lO#-H zz=-(uiv2|-bf#*X>e>`>No}h8L!6^&UGV)Kp94LlEiH&Cq4B$YEPF`3-@!+IlEeni z=OowO&4@uIfp64q))@fjmI+se0dBx^!M1<o$XL^=A6|Sm7E~|eA2aaDI6c73$-ddu zxV_}1DK$M<7hYvC)yzrQ1WkuG>sMcFpFVO-h<R$oG4M2#US}&de|u?q$G!`RzRflL z_Mlv@Hpa>*ZoMg7mHi1=0~^-<)rAY#^;5EiwjIKBTU7dJ^d&G4v4ag6!lWrYEW)%+ z<BAZESM_uUHH?<wVGGQ<w>nuB+j*Y(tm70n+yG9(KfUrMP^t5p@Z%V&<aCIFC_}3u zU&pL<cI_57NF0oZFQf!)!rGw|-Y?X)%Qu_W5%~xTSh;GEi#BeQxkF_-u}uFvQ6Lqz zwCS(xt|Y=>eOzkV)ni=^r*64@P*Nrf;9&=fy1*@}qAAa?%amljZY#}Yeshf#D($4= zP1d1}t!vLfouQ8<2yJN6ooUKke9niNt05osu=x`|XGq}Mn9Axd?UEe$74WfWD1?^h zlCL7wLnS$v2ML%_=;+#-h_$_Eqbr_{<UB?}Nn?#(You}W4itHwOPyPT+l3cA0umCl z3VnM066-aqL*rM_I;pcdk=J07=~Ppg^aV=>W@TD(I?7~%X^$zZ>wW~E{)JPAKb#Nc zDWQCUy@VSI)~c}M%{ReIc|}_nfWIbrBE0$E6*Ykf8}{sdx+H!CiOKNgccC15$$vm) z-EijVV>QhjH|&d9V}^Ee)fbCt<d%5n4%EUu8S?=_Uq^FvR{f>DU0<U;HzsutzK9NH zS{i?`qS<veO*XUSekDi*h<jc%2E<xCA!9-%qf&NevJ6N4z-CB(|M54gZRBdE<>e~e z(md&j75YdDMu}Etap_U4X7+SUooC9g&2i|fM(_@+MmW?}BYAkUs+~&H@AusnZ^Wz0 zSD*kc%EjCcSYoSii6>^+5gA-TUz0~<#)O}kl}BV^gT$>l0vizfs*cDieXY;dKQ&vg z8v0jt@}8zKUPL6Qhr4FOS7-UH#a$g@T{>Y{AkVi#`$S2Vvi^}P8dgeh`JcsR1($C< zQNi}siFnLF;4appnhmeaH;2xNvS`*oQPneeg@+Zct)&;14AVhi<_pnMGFdo^$}-uc z^z>`{y3JU{xKNjap2aIWNIhZkGk-yRp?KuB%8sK8HIl=iERjtiCnCfYOc$72*n34s z@)lWC$)5~I*{|$uUO=3e?u|RI>rQkj9Ge^JqWuNhKPpB7E0ITSUSP{A$XnqYnWlxe zd}ERv^nJ5s;3vh3aP_N@(Q<5Y=#z{+_-)m_y?-LhH)=p~x5L}}M7BXAJ>vkN*jR{@ zcZ65$fLI%faLaixR7xLD_M1<cC+T>ea>^<_HF4<{ff6wB2#<3)y%Qe5ScnB+GpKrH zexhk(iZ~Ptp#G$AI`x01JYk3x3y3IG5$FO|ug&e>rozGM<OBe?`z*T87rFMFb|QWM z*VE`gIE`V?!zC}GkLv1)^MJDs3Tp*qs);|v?3a}X0yi}Wb*aklvZDS2ZNEm*m#ms; zJ?f(+-hf)wCdRZThV+=dYA((Q`?48fUp6D`%Vvaq*^J=JXM~Y~U}UY+1VtO73Cc;C zCTLH4kCK4NyP5#ju!aD;_;mza^QqYQzgO;{drvH~BdEr{CXb*B`znv1xP7fTf}-|S z9YHa^Sn8fytmhi#nM`u(Ft<gA_?J>xBSscyv&%)ESu%jyUU_NG7;T*o&y?)k2TL4S z+3|w3NG4FlNSx{(GssOiW^!+YX2r|2?vlYaRI?Jt(hnsxjNWEy5b6ScRDhWX`M9BE zEBIia`SiY~PUs`V*$Gf#aUAQm0X-w(N|Q&k*yn}jMhgI|78@UW#L?mmRHuE8nwyc+ z79vuWMW9M1-f>%IWa~+D&E7PBjLth^XRRZYNsxrB|J;#bG<zKIQ=fT=k%fEp586;P z*|Lh-dvN)|)mopx1n%?XJ_J6*<$C{SEj)KMY}Zc(=_jK2oR}E{q*B@gxl6u=k5F@_ zm?6z`i$>>uwkG%4by@a)_-3Ys9$o+=-$w<~#A%FCmocqB$7*Bqajq}aYUCC2)ena* z%(mNE!5L+<#A~+IC1hKq!;IR6sX1M1)PC)`bzXL`)F{okaN5Z8FU|S@d@xx9Ai;N3 z`w(3imsZ$jPbwS!aMVM4h<JIfYC>C{PBqB}oKH3rwuOdW@Sd2zT0DDHfe`k{|76Xq zMGn3kf}RQJ4LA{a+)e^ywh}r8vyVwHJb7XEhsSDb*1WH8S`01xc(=7JAIA*sVY}QK zu&+a5fVQBC-<Q8Qje$hDY1N@@!i*3t0ClIE8}JeDkST5+h1=2~ZS4!9eZ@<zMT^0d z15%D8dphP{f*(2XpGFqU?Gn2U(F{XXF6o(MJVz(+;=^163ZG<bCv8uxW;Ep+^z_xb zzhh|lr<J2`dr86$^+gWpU;)!~rN?FThSq4py!*UV0GWbln=8H9qaO8mj<5&5>cMN- zrMhi0cHSlpR3pJ#Vr9pTNS2Qm8UyjX8btMpaR$o>n4k(C!^qDPh>WmBjt!xMg$m-l z@D@0Br!bsZ45iWkvqlJ`favgcx9A<AsF_9lzfpQbj6f`C@@jINI&AL5fiMnrP2Hd) zJTk7afipnq1cW`AFy`F^pN;0PfBj8~+f~w}3H-y&bQma>ax&C;qdtu|S;rbU9LlgS zCY!M%*vt~z^`1bhtXDD1zIZZ75>2x}Y4`=zlcg3n#ilse6y0LZnyE+=ss{Jg_`*A@ z-b!qL$f-ijlBh`!3rxkiZ(LQFn*dJc+Oy4%zA;$i1XiIx9XXoA;yA25%n>%!GirIl z$a5+_2rmwoXOHqvJHyb!7?|UW&WIJQ2te!+0N|gOwSfM>9b$2o)+UzzeY6TSqZ_m+ zl&EY(iDL_NjM}%CI~z=FgaFzaA%I!bZ=&GQc{1vDGnmcPOp(~)6wc&~SKHW%@h5yN zg=aVmMB;=(h@3La4z$pY;b9*vu)#2eKwBMPg`x!{v9Vb&qBn^jG!t>eG`3M%2GvZ> zV#G$IqA?*%utwI|pFRCi6UvCL{s%>^l03`da*cW3;9WMcwPWOreV$o`@|Pctyl0%B zmICmsO$XSA$)ZF?o5oL8I7BOy)qJD>w{JTjl!gkWvFELDus4&>N&!EebZpb?-3EvY z@JOq#Y6n~m!!RYPnM*&&)xX)Yw}M?<<e;DJy6fq22E)+U0R(&WB^)+!eRW4(V>Be_ z_mPt)k)7#8d1DW~w{9p5K#q3pI-~4|Zy2X{141`}w8J{&&A$f~<t6)DN6k#ao`F>= zDj}57$i4K~<kPjf<Iyj_GYwy3w+TlsubQF1)4GSFyU)YSGzF-x78eV<bt<;0s>223 z4n;VG6Rgi7?3CBxI?qlEEcJ6r?JP-E*<<`367E54YtatZ0<Ll*jgRV?me~ngGiigl zRy)YRpd{%*?$Wgx&No;9crUgvLbqp|bbTsE^(IWV!r5{<!av}b`Ggi?py$sBK(KJy zX>D{-OOfLC?BnHoM5kqVcjPXZ%=5G_(g_K>Fn}!YHn~~19R}i(+Gr12d{CKR<eL&8 zNL5@OIZ>0C<DDu8!@TRIAB^i%`005mQ|fpT_bduK?mIzDVJ^G_yi~I~ySGT4N1zzT zm;*9ElH(uv4;S3&g<9jnvhL)G>9nRZgbmX@nu4G*KPV&Etp<ag7ySU+LEj4SIh73! zcp<S-xHXWIo_P2n*xkF57Dz#?I}0pJ`m82S)C+4|AlXb!9@Sb<6rG-DROs5jscR)& zqdV3u&xcRdR7dD-rtX_x`PMIGCrAgGV9_Pc7KKbN;6tJ54QjYP!Ju;`CJm>DiCi`; z%s!=PEp>LY#MjO8pSpJhEzA$l?udA2bR=dGxz!vFKNiVa<R+9`$}nFt#kCeN_~Zfc zD!W3CNV77MTT0r_pEXQKzwki~QAg^gY+!bZf{tCaqW#!nOfrB3ZBFPsG}k6fYF}M! zr9udXD&nXc@i%4^%>oqe+(h@}C4YyLK@LDwp%S>8G?oPDmUyheBd~JEin`8hY;Clk z-UY@C3os@c+G6SSWFjR{G^a>N^Na{Pm^I*$$e7Z!*$$uoH<-pG?B&0Vd*Ij9IS@(r zDW*-*h%afz!}D~<uu=3=Ux!8UOjjyeHwv&YND3^-Uus_S1EC%{S$GjYW`l2nVIVSm zTdg9smOFLuF=~YlIBQg-7;Kn;)%D8Pq*gQ4<ji~;-H<c^3~k`vp-3e$bKPyT<o>_N zX#sVfGo$e<Uq7QUNHu5W9da;X9G#`1=IAZw=&~f@3|giI4UVoMNDdS@AQ~7QNA8ZO zYw*)ZYh{j~g~;m1vaZPfv&8GGSgUEIS}FDr1I&#P7tb_jQCI@imJm`K7v;yM`;BEH zON6kb#zY=gBOVmu7>p2=@*4qiCRX0Vgs`(#TWV1Fl9v<8k$L39K*XA00|vQd9N67s z&o$;w_*#eRp>L0dUiZ~ZQuh&9)a75z>+lJ?(P1Z6%xqn;fXC?Uu2udkhtW1(+YCW= zjh6_$5CKx{?ZqK1GJO7mT_Wx)4{)uY<`EQy-7#NVPo6J7q&rihgV7rAT4hycDYP;l zPw(5yI2!bz_QvU6^CqhbO$taeTrBrAVrcRnqU_~|<U>ej3v^O#n<Wls0x#<o`)|!p zL+a`xb>Ul(iO@CQf~yJTTTns~DrU3*UGptCLnz;ZGI5Y^K_ny;rbrB3Hw>qFI_B>a z28M3&g>2##h@jLqrZo&Wd>Ji=mMsZzEi|^_L0_95ScMq0Gm~A-T=)mhva~2)Mp(_+ z;W%fU5(4w4efLTZji4mQA{50DmRW>!LJ!9s`&jKOEoGe!CIAKI30&7O3gMeWZHR*p ze8hMk<Sd;nHhR2D$2ar}0U^UYsOmhawdPqnzw?<>|K+#OIpO!<2s@2o_=}CYR!2@q zFV;plkkLH+D=Xi!KixXx{F|c)S%i<D7r#li__yqj85S#oRG$1Bc7633`a2p>nSBC) z96%mp1}W3k0eYL-@O#Duto_qv1Hb)o{L1(MGY{NJwgx@cn;9?M3087O9?f*HN7v<X zQVa`c9p3)1WvhjL(U{RQ<R|d}A_Q!ltl2#ZP7x&A$mceOd}tl`?R=e+bS+iTFN4J< z1F1>_O}+7AqF;=gtaa@yf#%tY5^=g9xN}%x13l>jZKjV{CD0;(t1^+5OgEyr7Np_k zS{i%w$*z_ai=J>zL1GEE;Sp8a60T{wni86_4yV~9jr^(&R=B{Y4qy))iBjjP2CEEf zklJ(wLMxRB)P$-w(0~r3I-`?L(6$V(f0&5yl<e5`NIzC&WZZiTV>Au1!4q1>nY3WV zkwdHk4cJzJ*iPfdCwiP@I#VMSfRSn=z!SookgKz7aasd-!VxX>P58BBAg(#2%EyNN zG|>QSJ79Kw9yAzIfr`FrW{V&26{ok4`qXmZI7o|QJv9Phs?Q=zr^^rYh7!*uCUxW5 z-VOJ28rX8*Y&0g*km+!)CPhmEvE}Q3Jv!)@<*^xo0Wr>W8>{p%M<QTNnACotH2_dk zRZUCrwo|oX&xj3AEg4j4$rTATbBH93ewM_uQ6tIC6#B=?qgbO_2@<rq!rC8Z!Y94? zYgTGLHYSH2p_aesi5XlY`m|X&Aqq3$Un#w|i{&&NZY83vmucZhOr8zjq6rQ}@PElT zyWlX)78n)^9H%!3!ybq8%Sb%Pt+`hJ+~i?QwOA$7>Tg(RR_hp}+QO?9sc_(=+PdOS zT52J62-{XdiQN)hJEG$x;f4Pud(gDN*_FliKk$F~m@gxxIF=H2V4^l;?vgLQG7$UP z(pFxk%qDxXX4IH{*a6cheWx)>EV|86l0^6@N9oL$E*m8?dXD=G=t*{&X`IkKVpr(K z9dYPd8yV}nwENKLGkCr;m07h9<I8k?^9hYBBkJY<MN@ZWky%@Up^t|@+Dm8bUW&FO z2+)lw%Bu|8#uRM7G?dr%C5@E-+)G)QZso4}SHHj5&8LKr`Yz;hgcOw3G=rDf(;tbK znJ^qB=W4{jBnCy|Gd~J8L#3$in@3PdGDtxtIh$dh`Gzz3ITO=TL##h-0lb81#w#pI zTCdxbt+Dez&!N>qOml_!#4*PU6v!8%R`aUWtjYIiYzk9bUNaNM^>NEnCg3v6IH?B3 zE05!x0fDiaT#N06y#E9`*<!(IOb#E|hv1ALYvNJm$5WlS9Lr4AJ1(&L;Aq_atmyNE zwal5JDG&fg>`$U%Cdgp1Qa=e~_b|q_R5^e(Yg72J)L=x(+JR1BDO}HREp}t<T{LU# zJ?;zXL?)nshQ{Ia9n&zfP?|`mhFH;0b}()6A8(8;|No#dS7$D3EZ@@aU)|5AH3KGO zCu5r%;5@b}w5Zx8hR>S*c!F-*1u_wv#UH4pB}GrzMn`t%I8m4MbGYkS_U`@7Ekov` zR(@e1E5E)P6LIn5x@`MstY73Aym)%9MN>Bi!WoN;_fM4XJwT0+f)QEBl+5ynkI)Mb zaF)K6G21#|e}MwKe8rN;QG;ZXiZ$gfkQIZyk%(<Q64HaKQ#v(i@`h6Iu}0F=J)=a~ zp4SB>TJ6P&U0u{t>%v{T!$K9Qew{tnsqH7zl@9-?9lIdIUZJfYQ!xb@0ZyMJF@^x# zI^{{xgb;!z#K+;w8XraaZ`y#?V)J3ER(ZR)C~?bv+3lKm>Chy}(HPzafle}bm5-tP z<m+_jR%FhuBWz-rF<PyxvH;sb{laii!J1-Y!6@rLjk4~hL|PF{(79>4WGXo2Lv3b+ zGxbmpdm3zRJ7c3|gRS~BW7B|R?OfNcHQhL{5e+)E`QdC8E086DQ%jrboLWrU!L+Pv zqs=d>HX}j}HQ$(5rorY|lX5ZVCVtiV07ms0Nid!mi!fSHrGYs~x37a(WD8Ri8H|Lz zR-MkV&a(8*(K@+U{P<@Lqq(L*R#||JoqlnfP{A4xDi79saJUCY!s|9JG>RVQ@jvas z^E~)15B|u5=X>x%rc&orw5k|iGUIZ79=zq0A#gKZcAQd-(x*r-ES;xRV|pAPW<u3I z0VnQK-!R45_uT4u=;XOfJdD8m(oC8q=$yW^<Al~aOl@5lq@*+&OqXuCc)$=h(>_E9 zImbr)o8KQWjfchzAcb13sG3Dp7Jpbvx(~gn;&_xuJ&FPYSyDZ$Oyi2p$*6L&S<Sf( zYP052Kdfe*z2JVUQL`ETvQ+zCNmMS|d3m4WZ#^eNnxi&jsbm05Vi1xB#7r#;=3;T^ z*;Bk<MAcl^>_>g_zBYznQC=}4dlj{PoGtf|txahyQnyQ6>yM!kuqA?ZvMph5Ykgd& z3r8!c<QW<egIV!ax~C!?I0qcMH3H{V)!~gUq-y`B(Ues_gCYk{L$ma+irLvbOMm#v z0e;!B!Q#lC1bpgLGQ3z7+r|+71|wlTZc+8V{;OK>r1xUta@b_A*DZRzUe@bP^m;j8 zE&h)FOvTT(g&hEAp+AYG-@XccVVeK}>I+-=JWS{dgCbt;(icbVc_{V8Wf>mz(ic`S zIRvXuRt3<iFXlWZ!&akNeR0ADH^__|2npJ|3sEhUVtxY*OC@$+%f=z0M~gtrh!Eut zVhvA|rs2@|auriNdhs+~Rv<SO3z;8H$do8y-Zv#-OyI2{>%T7dYb_ZozFq&zY{Oih zX%F%Eyt4_(T}{7r$+Q-0cJgFGOSqA0$JRKhA2KR$LHSx_vhq}%YOtJz)@IXeaJS?c zo9DUn7+#9`H;WT6lJ9|=^3C(L_u5bIZ0p2P&8V`x|KV;ixivo>S|8nS=W4~b=@=_W zW(P8vOH>#avNDW}3!B)>UBC*j-)-9hYPYRDN6>3^hf4<>tW<}a=2ZumkRVa$LC~&2 zftCRr@>Os@-6Zl+OWHZ<0orH{(hl1%z8M9IWVJP?gf%Y+?NcbT-IUv`TwCPsTdmSW zzPvI9k>}aqHOw^N;3<H42DaF;mUjzIvSN~h1m5zp28hIXQ~g2}T&5L0iXbI*+Q?`Z zG7fxgJ|<&H<=l7mqpUipqh|eM5Cf@dHXUU+|3YSQr+fp-QD$(~+8FNtBG+5>&l6kO z(f@h#Tkrc!cKXr%(~g#Ad+*+7o;92_dBSm5P5xu}>GEy+KP$68&);~(8*P{b8c2l` zBj$YJE7Z96iog5%Uy9W2mk=*1m^=lK<sbMc8pQYHC)rJBO9#Y@JjcAU{Bt&*c5zIj ziAkQe!&lIF`XwnHhQMm6bhW&jzDm_2?#PxDc5A99#y8QJCS>@!vYE+49=_4|zOV89 zVB>r7Whp;3shtanVBh)%=9pUPM`9LYni2WZ2)l?$4qYccJ?zmq=%0O!gUfY}|NcuR z{f@BCJUH86N+JR3CS`XxVf-32EuI0>X|YV`e%j(u#|aIJT;KztKyw*wzeHEvX<X!u zUZni;)vF*KFY&M$jniP;&bmdt+N8=SxgB!W4S*swpoF>s@gYsj@NGz?ym{6_gGed% zK;oEBZ|XnIu12U9m|JqDZS9lD{fh<sjEi^KbYh32T&?*428<i}9@VdUG}7E%EL%nH z!>9or6|n-N@<o=i8*Pouk}<$A_R5|a>1YCWJOV~=D36`i2)%4n)%#ZX*h_9!@539n zLn<xPuC^@_ueE!yw)yVr5V9tD!5w$Bc5_MkUu}o|n2Ytuc6~Sx)$taj;hVp%Hh)<Y zLlP7?CDQ{yhJ^$TzF7^oN}ecSqgo?%{2(mTS!^<t#G0Zb1=~KjTNjK<=qOzepHzpl zat8u``A!_9Q<wo{FRphBHd;2yiV-qqLRlxg<0>7P#iE^5lvb4BnUTM$S~E_MvF%4% zTwJWmkKi}hAl2!%n6+yj%R9NHtF1h+e6Z&i;`pXD9V~K$d(#*KJLQM%CbxqG<^<23 z>Povr<(pSs`q2eh_T=yorY@}L7$hFbAj|ooOs1Mxnn_0K;xxg`)6t1dhdf+#k&y(t z->m#!5U?G1=D56*L_r?0t5++}r1Zl}@<?8IPnRq2;q3I53aTXrW$13N>7E{DVP~tz z0k4bc%}$mmT#t-i?`)Sh&W6js=2OdNA3Z_istxhbR*zvTbdHCPbD!JzXTruy$r61f zEi4XgN21d^F~w5EpoynC4rgT0=dgm6H|s(s&uByq8>DbJRWEWrS!H$)8MeV5B`-fG zBU&2Vc}BdCtGbx2B?^8Zn+W$@gT0x!wnkf&X<cMvrriJ;*C25F7sRHAgX1qW=2S&y zCt-G0{8SoY>6_M8V0QSO)|RF)Cw*+MwuFj!ogS9gqd|++F|=y1Ffqo&siD!gR$QDO z=86LK2ABP?UhoE@%zA*i2F`w^!}A(AHK&|}1{|`uaKJzA@R_cH4k&L4nChdzv}OR0 zp8$hAY9I<b3{GrY0|Stem)A|J4Cnvy_spkcPxC~iLDkTpKG2Ole(LFz3h+VRT2t0Z zwCI;#krCkgJ~dKyg9-jGg`YN42v7t%NMU~)F+7WSzzM$GmUD6_aPxA<3?%5U)fo5C ztaI3W)`{oGSw~Ga>r^s!&-94x^51!Y*L=DlVH@4Y3qLH${W+L~)X;#3-lpIG#c}Vi z^+aHeTeLG(CgCS#j6eYylM(L^h=9alJ^%>XRzfDcnCvwPW>(Qmm0xpodG65{eknT} zp{jpvE+Z_V!FnWPf)~oe23^v;cZ9WV=LlD)>K0rC?73M6&5NsSK+zQE2vq@M6s$mk z28S#*Kbe9qG+FfYD7qb^nQheQE+(xWF=(2NrQ4d{{hgh>+*;l?3;TF=au6sj(yhKO zi>i$KNViSjo%_Vd0UI&sRoU74@=bHr8S*Ly=+QY~oS|D#;DqZA+QsCkAuu)MFE$2) zqSzRvd1^I7??Mgr=ZACJ7k~)swKP<yh?$v@8ETG7uJ3WVYtyjYf~e4{N@F?F8sMdK zYh_P9nV7+4Y#joG?QM)GKPfwr%e{j-eKnrkvb{IxKKnx%ua==k4?8@IGk5k8TyODA zd-pzY{Z>6~2K+7h#M6s{oh@nx`Qu9ypZaHZ=l5&N+o2;x*WqG^K;)=-kxH%}!j(lV z8WYXN>9G5skFwpUZTF{yQjlerLk0z8!@gEsM_kcoO)<j1NJM;l2Kz^bo3CMk9B<`y zexK_$v7*Zhr38;l5`MA3G5UC|y>LtZPHn<ph72xs37QYh@y^Ly=Vn8a2Ah1^%S|wt znbg7wuj<&OX>sa~G2$qo21o|d{9}2@kzL$0jhFM8GAd^WD-e{eAd$GZ9$DTBLG|CP zlhV{|rQM)9tkn_<v{lchf$y2RTGoY|#B>b1kN}OLIJa3!c^+aSAEa7!G)t^q%X9k+ z(XJB{v1*%QFgfy-K(RPy!B%5ns7u9imRHRSX0@~ywkCN?Db*9D8d0LA^;pq*G(Dfc znj-kA(Py-jV6sTW*n;5@u!)d|>~w)u^EHkV;~*lZIQ|OjtWa?#VKA347`mq}PzQ8m z7}aboK%wv_5*QY<MK0ZI+r%7}SCtVmDP#kH5fM5%>Wnv)vDcNarH7!w{<jJQATgzO z&6K2`ubC1^FfQQkg_ej!;?tE|cpFm^q?%v$&=+HZm>`@qI6@oWJn#hGX-qsJk8&D# zfQ+q6BgWu3qed|XDimX=`~ASXjWN{IBR3ME{kAwCg=|X$cjFy}45>$cn>E+M1L-<J z0zxfgU+d_MoI$uBLkWJ5^!`LI?ELUib`t`xHi#F95AixDu(RHXDghO>*N8JgB@$u_ z)M#dr(Dmu`QsF)-JY88O+*vhbkF45AzDsG%6^S8{EKLKVffGe0ymus3AecAt&Ktr= z%)&a(30B6s?bG&&^^UNPdAXw}vSR~>i36=cV57bcSf%KljuK^33$Zc^P;cXO_8k() z3){!h*GWoP=Kd#gBqk%pMvwGl+{%>ny`v*vU`BMr>|>6J<JnngBBeCE0L=mP!;f>U zqyJ;fajNuX8YHTo6v67kj)I-178jf3nLWT`tgFB2Axjn;!Hi1V+NILwb8~q$XXUT~ z(X*0lAlUZzBzmjG4cUh9-+p7d+|8gFgg9$qT<E!FH@X#P&h5RJaS>!mS2zz?u`h3p z+Wn?wRi+KZAw#<k<Vq%fw})o7=fBN{Mb1zWX`tdH!sxn752)3W=#nBcvaR=JONu1x z?t~8Hq~{;P8?->Krw5t+hY>2w3@P6kn+Y4@Rg0f~dZbNto>WT6P3R`gb!c6+HS=k& zM#U8vHJ59!DJ5U~?@wp=&6yLen*P9(g;A{^+S0YlPs`xa5I%`ROT)dGR@Id^wL&Wj zZ`j+eud=%rI_!}XLx&n~DOR>hEt*GGV|_f+#o^+L>4qat1ZtM&#=zWhfty=>>xaf~ zYOVqwH^oI-R**fw(OYC<tOC;0thX-#jEy~Uwy2xsrE-8As{x8i+YRIquYp+x_;6(y zH3TU^^hLToCiP$cLt+ULDuk^#i&~H}Xy+}fe!yr3ItGXQ&*{5<@DmhDM&;yuOZeQx z{C>Roicb-H4vA7d7K3qpao8^7HU2pkK>kgG4ZTofNsYwZ!dV*;sA6VVzc8w1CV+zp z)Ll^-PIYP#w+F_3!KH1Z5RPP^)ak#!kmQskeQF*_`t7)=#z;x}EFa8it>iWyaaGYA zka3Bo0(?X31Y#X~nAD$oVZxHiFl751*SoX0ts71XJyeboZp5+8?Jtq^)?`sWc##PR zdFn|fsYalFPH9gdZn4db2_LrMVI&Qt*kM2K(UlM27wZH}uqpY3hWTamKe5GkPEpjc zg*KRy*9A7AJGY&uCrRDgzp=<WP7NYW@C9MnKsgDS03nRIG&{(l1e=TvHV$Qo!`NzU z8*>dSDB%!qY`G>Er~Cp!=xsSugXUWD1FJf?y1<@ZSKbOld-29jINcbr%`Cyza-wI5 z648r7G;Jg{QZWa>*3SfpS?Eg&d8neGg{_3TDOW6v4j`Zs5c9KG;lkAe!xeGSKeH__ zkCp}&8EA=X8zCqO7LuGmMi1t|OjLhbY$U7=*Nod@PGNInV^Ekz&dN@jaDs?OF{BkH z4<9V`%)@c)l6$q;r`yqLr^ar_uuH05-gN9vMC^7QyGU_y*MX2DrX&xNQG>xos>ZHu z2MoK^R$5z+sHlymW0$L{U{^*{TI&m6enx1PCwwpt=^G_RniKCaer9+TbtVzQC$XZ1 z6s-ZdoG2O@xC$a_{ZWT$DC52bk^$KiX{350`xZ;ozNL}qlMen5-?2)fDnc|-Z(Lqp z(|~3}EjUAX>_CwX=#v;RoRG?Gt<V66>p%4jMM%nos>QaMV<a@mff;9$OlRvV)KMvv zX_T{}(8oS!oCroOqZKwWf*HrXvNYq0NE6*i6NS@+>5|n{(j{ZEk!T|6l2@2<YU>dd zZOk~7&}_@mPdQQOUT7-`^+pP#Jp?l;;wWMWeWJ0!)*$oAHl~WQ!GR(;d3F_p);&32 zHZ*hdG7TqtS=-%+CQ@ph2u)bx^k{_eo{2g}n@V9w%84<uAaz6*Zz)jUg<E`+;4-T0 z;^@G-(Jz=^Nh|8rz=q#N``#wT*mRnD6`2-cdruOzknwP@<ftKLT1Yl-YD$v$==$PW zg93!$O>HwyxTrOna;4vlr3sYaS?{iqEUSPFT2Kwr9n;=`Xp*x&IHT6@ZI!xUnhW-M z8K)tLRU+UPj(pbkzi114LYX)P^L3qZKJ`w(z<#(Z1V=Rq(Y66_M<EYEDoWVAb%!o# zgg$U4*G}V6&w|%YZx)J%EGa_DKGIp>qLGorfC3pgJW2ji7+#iPn!%dIkdJ7oFVuCi z?`YOW3~QQ*Ox-Y5Ej@v61GX#+!2qXx;UCNS{rZdr0}OqwgOuVC$XH*VW7B_0Wxr-3 z8XRza@w|okawjLS(wIRv<=tq<*gI;{%2QOxa9dhlB@NVH<)&ap@N%v1;^N_U88#;y zFqm{--p;Kz$t36-#c#!$_r6F<5}O0S=yu7X%njl8FW;1L3qC7vV>#yeYE^O(>e(RU zR?N&bZ76~i<r0mT`qa`=@0%<-m~>Q<SMyH!4g9t;N6L4tvWWw+fFuJ9QxeHRa)t$P z(?dzTaR(Icy^GWFvr(m@X^-AN*;*juimX%)ShOqAK(!eI+`zIGKoJ+u?dWvH91jzy z*A~DeojCO*{w+>DDYQ<Zp84ZvGROgj&%c<eK4+$|sb>}lx&%pOV*FdVHm-Z@G6mL| z`f%dt#WT)4d)xLMI~TW}b#(SK03?0~F<>;v8H()>n2SJ_6BJAt4dukq`L?5XrlQ$d zL(~XIZ$0gtqw~{_p4fKu4R^o$onQa_2VOjJ`q4*jQ(SA?-!aQLVYN*PLc8uj({q7g za6Ly527z03=nE(TEv$ZYJLknbu~<WkmTiU`N!jRMdn)!IAcIj&$N*WGLkU&$Gy_6> z9ZU^r!HjsJp+|~|cESXF_j`f~JKxRhshb8Cbg*Dpu;)7>w)7kh-9Q>_5%OiU1uKwo zdafDWQ7`dSU%AoR&VPHlUJW`9hY22Wzpi;y8UM8**Bdx6luZ+t-r4Yp(=yA$k2m%_ z;qfwzpc(AN*g(levJ8a4d(8Y>wgM=9H|aY(eM44^vWFIcAxU9?*{pbOrHc1a@cDHk zd$ML7hyRqI87rip9E>Jd1M;0WuKnPi{5fD^tT*;^1g-rXm1l!Xd8UalW8|jQm9Y}R z*q4|zB--cD_sy$BoHmWcn?SO27OAJjn_B%nYuv5l$j_;>X<3zH=;Wk~*itaY%m$zI z&f)(j|N5Q!d|~$Vtjdd4yVIShIEE;vdR5h*p23M>`ZKJm$33R19=itL-v{oOVl909 z0SB)dix~fL(7I~>@t7sQ)>f;lez^WW?HoNGu$q|z_!KAprk+HG$uG^bsJq+X6$h@i z3i0p(r?4j{r-b&Vb4tr#!nJ$Cx`Y{kX5nw)`OJm#GqC(vS3CSKRF!Vtl;U{Q{c8qe zGb0z1{Lz`P_x8PPb((1%fWs@n@`~gFG1fZ$c!(ujYgc)jW!vGa%gfcTOk(b~{T_2D zEMj6UusiAzc1|K3Bo@=u3~lU+z_a?K9wA^aZ6sWk#^D%{@9HnQVO|?kv0B_kxwE+a z?3;5fQfQ*fcltG96B*3BrWJ~3583?V*+u(hi2+9X)4uy;EkpM6U7hG%;wTHW9wIQ0 zL$0im3XOGh!dJdl_{;hAXapAgzALO&i~OJ38V}=b_0t}iiuE%p2sGi?olRn-1^cwe zZCve7ANHQ{?Y$kVAVHuG-vz<d$k5(1iWIIhgEZw0H69%-mNt($x7DrtI1WDi4=%&- zBBMk7U*S~Hatfj^#1Xr5x+Y(6m1@e$t8o+R)tV3=jZT^b<E@=}@p7uo8+0&w?T_l& zfWDeDU=y)TW&%kA>4;W9NpqqJHwm2jSwYjYYQo-^HztAl)|^;CA1B={%jZ%%T(|=G z$;T+KaUhso6OYf|oQ~1AoFqzHtCQy@I@;k9uS<Yu;l|}Nq8<Land6Gc1R8Uu9bUHr zJb#DDEiAa%SnSfs<$W`;9j;kgi?i%-l>;@*XQv)(Zy}mRHPAkY?R;1@KBv$A=!cia zf$TPxAdFfgYrTiVmBj%{TqmQO15AL_;7W*ezcU;jG<O|Gp=6yoV0wREFpaxFYQWET zticq6Mjrd90b@BJQ6;OVS2d<ilX9rcw~X?RF99!6I0+bmEXm3)xfug-(EwYKCU&#% z@nwV*u1!2lwbJ9!VZD6m8y7+YKVpPhuMIU7B6XhL6<|szPZr+E_;HWJ_XIu*HG*|B zCd{Lg6ui>18kC3I58FxE8G)u%e6YZzXKS+oLtWcgpT8#vs~QOV-`LC{|7V(6*JuVd z`li*eH{EZ@%GcVbyyB1Xod0cIJ~Rt#DL80oKos^wgF;Aw9T`(p0!*TFZVR|vSDKuI z)=I+Xl<nsq@}8wX>K<o{NQXB!A9kq#C07U~sdau|Gxj^yhirryw%!YL#ft5kTkK}+ zB_L)5W(wu`y<uCKr2E#1rgj>(RA9njPlid5&BA+_D*zX-<TIT*X57wnyO4V+COMFe z84{xDV}c>w7h;c+?haj7?wL;CG#PWyi#stRQyp*<XYY*-|9z)xCAVc>-9jM{F9qs6 zzyZ)+TB1vG>N1UlVIWbB>EO}R78@}!(>_q%-nCN#2eq5$#dOVQ2IPo|YR{t;NZK|+ z{*|7@8m!%Zs8ysDQ;$*a;*Ie#nlqG6&2{0{#*5a;;~4cz2ZQF()b){pbH-%bj)ok` zPyj7jA`#RQ&Mw`}NMqyF&_9BMVO7qsgF_dfg%|Ck(=QS5*zpKm+%ElbyuPx#kOh4! ze4Gm$U4wLJmvUrwqRpd}v}OiLwc`AXwR@1Qh;&k~5GyS4DQ`;XCFB}JcQ8nk<&qJM z9rqLx4qehTGeSk0hCVE^=aeNCIkaui>FMID&;5utdXp~OWDvr8b)qHF?|wuy6;^$+ zua%1I{ZK7%gbm@g`=H;6@{O1=c&=K5L}>?@p7AxUaW3o`4Q|ksZ>gQ3iy}F|bR6nv zlZvFkINgpmrT*h>FCg)I>2=nQy(WbaExYzQwg{P&fvLV$IGfIb7U?%Q0uUARB~K6A z7=sC9-od2SrWSuIsq4te*~n$R0jx++9LA$e)_HuJ`jOxSZypI|j<O+g?$;Qav`hW} z$a@oL&9bV_^A6wi-uH(4V#tihNX+|vrmNF#EU8*9yPA^KajREkGKjTS*Q({}t}45` zx`ytEs;<s~Ty&LYL?I|DXfle*REmHT0s<nSB#>ZAGKt`T3<)HNf(RliAY}jk|9#H= z?)Tn{h)kfCy;etL#=Gwh=j^lRz0W!OR2(anL);8O8cgY(JH9!;L0S%i^8>U5&4sEZ z|E$y8Xw%R$ne`eTy0BNwpQRaJI4j4%c?phyOIo7&ZUkTFWvUS!ySZj8Nob;z5FQTQ zlt`1ke>26z1~3?Px{DwoQ!D=`g9Idf)5<ZqU!@?w`zj!OUd=4zaMg~N8_9K^{GF1C zZ}Gf<U67Z?+=GoMYGd@2@TKK}`>3BaxB$fO3uEaMO9W#vszUDJH}nTOL|9`e6J^u8 z+dujb+#uA{wQwNX6BM>u&V^vmGhBr-A!p`5#_y*!ft*+J(SM*_AX0EI{g{Kw$o6>2 z=^j%2R{1}5G=Vlf58Bxs?3AlB)xqrDEB@TkvCV}u)iK{wrB%q<ys2by*}RG}zRufp z?@-GVyjNIS5k9yl(4xR55R&(hNUpV-bgD3pF4s$G4P5Ki=l_o;F%m-PJ+PB7QVAo` zFEUXc#7K1sjA%JiNh%+F76W{sD)*G)IX^!JL(=G9$TCUNHk-$7&%dw{x>7|5yvj=g z`d>&>PUTgy%Y9Kv{^0;ku&QjN(2#Cf`ApC4RE1^(#@%~`e(j`T;nC}Gqge^4AK;ae zTz=yNdSj+Hitdhhw5+=epJTTYI}cc+s+%mV3);rvE1Ko3NQ1+9?ojg1-{$ii4pMX< zr$rvC-dNuG-)a@{$bmXYB+PaP*E^<z^Jx!NTZ4E;sGJ)dEe=q%fu+h%SqZ2s<YV-= zCKI(~qUI1#F^QB`8Xr4QE{2S&y1x=SW~xG!-rj#cZW5{*@r;R&zzEntQj(2|lmuo; zw$vswiBOV`?$yIqK$J16GGmEGsvb02f6J%UtlyHn3Gdl_KAw%jA}M?WRo35Kii=|E zSAdE-d5%`KF4DX`^kUwA{mX^t4}u%A@O$*WMMwN+2A7gpV(Zfxa*|DcW5)_V<OLC9 zmZ~L;GWPwvR+IPY?wgxeZeFGH1&znG)DD(|QGp!k|Fq)@dEzpA73vDpO8>pS=87#; zvdkP5j<X^4%yT@HBzx7)tR~1O#1Gj^st;>_zMEh!lxT-}3>L>OdJb;fJ^5)#LK#Mf zY)fh%iugQ1=TCC|U-j3Jfxq|sloTouxFo9QB-2nwml&#MPq7WL)2l{Q!43Lu$irR< zV8^-8>I>N``Nm>6Gp?+R)*#1k^ZE12D9MzKIYzNI)xh_;omp8F{Kx<E?)jls2&3q) zdw)_g*|1|U3RqvY97-F$WEL*ybXol)CSZQYkd%~%)zom!MrSeRGr%6+fOHLpT+@oc z_*`4{`M;2<a4UYbToiTRyStPL1E4-G$)LqUGoxGc8(wXc9jETiD&a7ne>0^z$>gA> zVga(uLifkg$TEcZJs6C?-jrkUo=VWXI)>9t(i_rzbnz#$J(^24w~?Du$ap<E(Ee+j zLn$;MXBve0Qge%&YzP({x)C4uiP>)Mo#A|B24)LVz@%5TPp@)A@-zG&`>ucldGi7; zPoeS)aiyR3Tc5-p!am)_9Cg+Fl4f#cI)M!afn(6odWjzJGQa_Bnfl19Np&N2B#w~J zAh6PVeQ$y;KNorigP>cGI)6#&8DlqpU78?-xe1)rW@SGz56UaVHJ->9d72blnq=?t zVpH|E<UXr1tsCgVF|e2qBUITT)$sF*ET|h@rFh1RhMa)YKc0(kUhhp`=ltUQVG7BF z4S9zFa6p<c@;Krj{QZ=+Th-WW?$U67Z4y&RI>lDbMy^4ym^QD}0&v1zVvgmUu>KEs znmaeTdl9wf9XtMMcAj^iip(F__Pli0cHh|i$_{f->A{j{jqN7d*om`-p3&i7OeX6@ zFsVEKQ%ke%6S*POL*5oECsWU!&a?FPmKvnS>*|guEqR~W`P07T+_0F!50=^w>K^<^ zzX-f2BXI{;-UBUAFg)@(+8GhjMt3KVxC^T{uijZ~WUv-Ga-yBGjb;)MGK(jYZdhGm zsveH-BMAAno#~Z!^qrw9nbM}D$jf(hN{?7D!V#|(^?p=#*V40BpCRjlWON2GfEH#q z={U)&;KX-lsj**C%E4<#H#A<(6jnAPd>q%j;1l6`xJ?^lV;R%;(VXA3q21rs+>8;v z0^vXe%s<dJFPfo=WGWx0YpjxxpP2~wyp!DQnKB)jDWpOKUh@o!!mbFPKh1bvBfo@6 zTm}Or^2eP_{%S@3{(;FK57djTfj&3!jorDRcohYcVg~{}yF%`>{DV+s@T_^=PXF8d zUpp5fjrkd|2dE@$Pi6i`igf4Q?N51|7$DLk`lWj_#-(}owugX*!v3KGn4u_|FK@1L zD%_9wM-o~__&5j$lFuHz#z>j(RsTXwRF;FV{SNJk7KCpSL~h#$9>B}{ROpTc%D6|) z4ymE2t-=rQr#FlkZi+TFUs6T@%N;v4HiBLH7hpjcd-cxzE~(NyHATa=Os1h%)GFby zwpY%mvaW3LfkI!(T%f&UvXGsrZ)NY)ph;n`pQ451<vXqa=$@5`AiqYi!oD430^zVO z3upAayF1avtLF~9HUI9O)}PImxci$SarI00D{p+D#C@hPl=5O$zfT`Fs$aU_z7)qe zV#rw*SPcs}(D&j!6pVa0*JEEWcnGL9^-2oF^0GgayQ5->xRX$pQs*$;nE)&MVci9a zeuz5W?WbS5`vwRLMiyQR@cJcf*HvgY|M@a<GkrnHTzUyVH%zEgZ`~bf&~9D7bWeDC zU{d5zxFLy8#6w!hO?_!|+`Vr2nSSY>y!Kg;u>hzE?~`vs&?DrRAqOe3(K(U;4~N3t z^HYlzZ~B++7auT5Kb(BnzETfz$%bzAZ5{6->-fzJRw2RKCQ;FS@j0w2E1KV*(ea%_ zDD;b;9@H8b2F8Vwl@VwQojf24Cf8@>bwRn6A4EXNuK**ixxj}?Qh+I<&1Km<PD!%n zt<<vNiBAERTA?Wj)we%?YQ3IwYrQCtW(n4AQ}R?g2^ym`M7P?Cq<bdBv0oi#&o7xT z8F${Hk}`IBW`BmBy^t;#3bN^e@F`a5Z=zQ!u&Xdr&*kE-a=whtqdC`&s6nKYJ>z$_ z=#Tj-dh!6Z4>%J1ykh`#G!!pjsR&<`R@V)oQ(2OST)(Xn<od)3VSNH<yprw?HmVzk zTI!gR^YN}p1gK8370nm7fB<ULs`>{()yakP&Y32>tUqJni1xjNto?mxD8$(0$0A6% zzy@CkvB@sIfk;CJAkBOuq~EhH>Y0|&5*4psA7mrf&=cpNXPL&{YntX$j+bbD4hZt@ z)YU&Px@X1=eDcr@aqo{uBdfh`a;0iWA(Qou&dG}?lxR?xD{B>AzFKE@*8JlVJiA}f z&~-~!GIrLU=!c-+8{ZUf<SlFjq}sx!TlSq7m}8NO*Wq4V@`{++R}80{JSrTxz@JSR z;IaIAGZvrgTiJRu03S#o(6xfxYqZl!S6&i9%rxt(HpSC0T(@lQ)C$@pn0aw4g6XBL zKb#Kp9q0VuI97VW%z5CIL?QNHGH@!d$v+WvtATUQEEG)xXQ&P_V&G(=HE_}#T#4l- zk5(2q4_njKjN3s@?A_B77%%98c+t5~nrBu@O*JU}rfux)IA#5`10~+o=lR{L`2m*H z<#%whW2@<43dm}cfv!yfjldaGKuYVmu}d34?*P065xm~q&wa`iSAF!lRL_tvXc_oU zx1@9|zg6=i+Zr6|4`4XSgSE<7A4m{MA`w<k78oW8he~@OC35ErFv2-X$Ptc8*>cG- z=Q>Jbwb|`A&Rgn@qWL?=QL=f(3!2QCnh_!%v<$d7A*rYyjieb9*Bgyci|Ils?5Pon zZPL)-3Rf#~0tuqB{*_e;Qt95Q=gGTk^((yaEtF8Chu~}1G0`th&%l^GF$&dDn#D*c z6utakR)(Phg+l2<DnRj+=}_U2<S)M<k}X>*Xp_i_-<Q=ntU0p-j#N25z0!I<a65Qb z4WG%uZ7%G{#-Hl$c>`9dR4Uc0)e`5qVfr!RoHGd>KQn9ihFOEF2R1GsoitA}d&D~1 zR!I`Cz!k;6r63NCMYc+PXj{IwV6f{GQS`s{>H4%}30o%vafhP&lJc+8Q1DQt98!$E z_CnrPelLr8`3kRhtpnx))eb2<n&y@G*BwO9`#PxAf!?MA8Y@+N0H{aj*sjB+%niBO zv+iAsi-f(z5>jm$w^k5vdjHhR;DVt)F^&q%Gn8AadE%LhI?ArVe{z-vOsq{sYQ)pT z0)=0;&^5{q!J$4cA`-4p61K5&zYZNS(>C9!w4a%Iruh}>uKL_?h9G8^+M~x!Hy@nL z2-p>mbE}(5s?OxX1p~lHzamB&iIMu}n&0#*!xS(J8~Hx;mt7>>AEuf6uX-Vpx?oZ= z!rj>R>t2Ct!NNW`+<MI1PXUo3hx5#wJ32=jbLMB2!x^1YisEJ@e<N|fd4JoxjxFcT zI=fy<rrLI~ZlShOXGB~@^KKwUg@kl&z|qdH=!ScSKRjVvkW#kD#P-!dq#Fsj5yfOH zRw^}+Bm5YKq*9BdQYWcltAj<+rlK!aJK`d#U13F!_>qPI<pe880Z=iDVB-~lZ0>Ai zozghCJ%k)l{ZWNQd?}9aN0h#odJ<ntg()*~Eh4DjXJO&O6tVH7OmDRFb51z>IeYc< zRJG?d?aR=TVqK_}(cWp@r|YjfR^3-l39simBvAY-AQ%!hgL<y~bK8x%`k0T<DCXa$ z5Ei^5E-*M?ij3h~Fg}?7Itzrwp!wpiAI&!ySo5V_`gx0Hu_K{W=wll4+BLb}s+TD* zh^hc`lGO*>3HeAmtHX?>e^C(bA3+nI)Tdl}Nu!muG?f9V#bf!eOKV{wD;S^FcIA>) zez7IqI8TPgxU*kC{!?Nbixra7TiNNQT{@r5y$p$7SFa>cw$hkd@@JYcgp<%3{;G`# z#ZjT+C7yU3&<Us%eVIavozoZio{WWvIIRsr@U+hZDMsPKffjskKBWO(TANBzr;2#5 zb7OLEuMLH6#Orl=4@<PM+SEen)F#3iZANVwFuQUaVvl?^KMF<pTQ*Of_bH}-!X32; z<*ud0BA0cL_s6~KR*5OGS47Q$nd_GPw50lMS`(tsHf)HGm{VW2U`kuR?YLJWl;(*X zs25>Dlr_4@q9XijDB~7^;jl$TY|>{SFrH@3A1wBE<r)vA|5m%L#p)9K@IdMPN#n?R zuiPeC2#<uBKze-{>t@?1IieDH*}<-0_O|@ilA4sacJ+;vGcMWxV4|a@^}VK9Hcgi9 z<G&fpgFekq41?#B$mVPQl&%KvGpzzU%ikV#@817WoDRD7{?_3A_Z@t{+~5B8;Qf0J zydO&6LTIjLDQ=;0daN*7jL9W@cQ{lt{V8fjF87SsJ*ITB8plymAYF?KaN)#2?2I>V zd#@ZGlb@Pbb2SRGD(3=32dT4KS{a@MVIf9q5`wIUlktgpR3lKnLEg-MQIhqA`24j; zOAv}SxyrHQ?U9^c$_1xGiIgN?eWsR3)az!<5~k<v<ZRm4E}C6J7KH(C-4}-vscL?I z<p90kVi7myFT0L9Z)pkBL*(;R@_Ban!4}7cA28q^3?dKjT6y;st`P_6RVrM*6+9^< zbHHRK+}HB6-Im+8+TPQSCoO-bvkm@bIp&sr^PdxK`wd6h_SDt<wzqxknsl2@Kkdop zDmMOH^v@N?2fKt0d+R7WhWf2L5ssi{VuKH)gjck|$0fvIFxaFef*tJ1sAc-?nvb+6 zqi-rq1KOaG1)xdqmE;mP#5O^UK)xrI$5Cg8NptIR6^~DrJaL4*VfMb`8I<Sr8q<6= zL>ABR?i#~tx{qAI;9YsqfR*+s*ajuHVQ5~tUgbcdqMX%RPJ&pIM0On0xXOg*T#ani zc(4z|yOxrs>!mT=0#viyY$u8_Y<*^le6Thv-H(stg+123e9jc<h<Ar6Fn@X2o+gvP zRPF9no+*wLOrMWql05YCC7_jRPoHc(Xs&Hhmj`z6P2TvVf@{Np{-;Auq6`eZe~WNF z3<^V58AN-UBROuv&1L<*nK0axEBQR?EP>i@t@_bTUnZEH5l5>&j|6u?@ZS%uU+PPu z<&?Clm-?PEzb#0Ki*2c!A^S7jqLDUOuu|kyTXWh0$)dJo$=8Ha<xkEf>&h7RTZsTh zyNbeI2Ihfiz@C|7WtzJuK7%y<#~L;t8*u<V0Jz=menQV(?K^WsA@|G^k?Y9_akT|c z4RDo~#Z2MH*J)Xdoq8-ANU=;VY7;Bd4rzagIj@EU-tH{vL?>`MFYeLJ5tF8HKy{1J z7Gp2NrM&<LN>(@e5qMv)gfP~W01CRbOZ&I4g^hhmFhF466o9tla}hldU+rsYe<Nw@ z__eT0G-6k&X9(@jx;*DbEx;$nh5?q0xui^}j^-7!zA^2Tx_o2n<f6{>fxSzeb}l8o zFwhAQH;J~mC+%TE!%Z|%*Av^~-AnFi!NY&eLJ@kHdnOqoBaE-<OA!1OY9oQ68-|&0 zZXehXl|S9rsW>c71D19dc-k@*9GxK}Z`0?(D3F-|L+=YAs?s4A6mh4KM&MKlSsAh< zl-;t$)xq9fu_$YK;H;U}YX2oCWZ;gIUwChEvny*DNonVKI99MDQNy@9@(9(8Qd9ko zu3~4SEQ%uj$BAn`s2x#)UDGHYZ9n9hkfRtyBOMIpH0C+5oCc$T7~hmFbw;F!f~cU| zO{eW-47F@t%4Cw|@4*F?(4gcYeLC@eKfzXRvDbIulH`~-ttJIJAN+=n0WE`_lk199 z>h7!G0){Ve86HeKHZAK)w5dOsUS2}h)_R3?FZuWUGj9`$PtD%fIpRPUVo=havi_;o za}d@s;lJD5GegT9c!5qIe2K;%a+$^-a=FI8EjKPU!T;$obI=R82zc!SXrae|T<qXW zInqJ{TF~gSV|{Hr^~v6==GSHRtA+RK++ap_%#rn~-~qChw{7N+FAr0sjh1!y2Fl+m zW4mPTyu1-T;VOn?Pjh+E+$Qx~hf0(v=vZVEnvd^caX^~eLic!zaDj+%#fd#b^&Egn zhOMpm6$clq^O~(l8^4Xig0!Aee@bO;yBEOVYCFRFru!(i+ZIv*jJmvDiKLcexTtB= zeT=7V<J4iK?*@DnDLlN%I=o5Eo_cxnzCQN4pHUyrRa2$2RIk$Io?4yfcfIk_C2b{> zjKN6{Ir}N;p(LpSEq{R0{K%HT%wn52){QVr_otO472%TV<9#iTy;X0GF@?R$i4v;x zDbHkVJCOzmbIqAc-iLbm&y!mAV#R)F+QJIm?z^v!QZ>=&%4Y`cnzR_mH8+xbX~N)3 z&DT84yX?iKv0U2ym7&b*R5i8bYoIA_(!qp*eXM17zIoZPeseo<@Y}xjE~;S{-Mi?+ z{ruEgKkxe5`)P*#xQjOpyGT?UxDmU$B~}mv^3x8)uC4AIU0OHKD3>!b0j|afs=T-r zw}G_7flY!+*_3IuYs-Wc6}~Cdj&YxI7@34RtT<aYBo)P(mP5cFuB{aXR8_t2MHvQH z|JHiHSZv~}FipnNz;;uLDE5(Fq;p=!y-<dGTgL(Nm41AMjcxU#XuxO5YIOus#Xip` zlP0GSZT#{hn+%uKd;qH@6JC>8oHfisj)C4hgXgsKT{kh`J0dUvYX0Yx(ik<nNU6`I ze+ik=_nJVKOJ*lUwJbSVga5tjWW)V%Pjyk*-yz><@QM}@O`0DlucEjE2A+Vzt#EWC z6tTs}uy*ee*NA+Fv35J;hwk0tyBYkw&Uer6gU{8R&v|kghjNCN{0{{XCR5@-6eW@f zhsWD|Cu{*`wMG_w-qQ|2sb!LF7!sEsb!|HJBYmqBBw95qNl+4*;j|O4vazVu?1$I% z<?n+5HBqM~tPEB|IlbRk7Mq8AsZfm_4AeV`CP>Mopsjmx4y6j1C{*{d)=C^QIRM5P z@q<_V)!EMHH3f4I9-f5}yEb=$z9F>J!Sb*WP5HQa{Mx>|{32+G7P}Y3v#yL1M@5bM z9k*zV^k49ngmZ~Wj3+GRb<RKKXOd|-Z11gi;bNz@;OCmLij>6KvXF~SXC2c)4vanN zNXnE+%2az7;q1eACbm%@GrW8D;hs3K5BEap!z|dGhLicXvUTkxJLR^LmO2xw9WERv zwZJ6I3HUQ4?5<ClqgXoqq{z5()Wq9jXAycTo#U`z%XZprWHOiq6}oA;xmg;F^+CXf zwIdixGf;Nd<tCAV)1-|QDo9Z-R|<n#Q?k8P^OHxky6s;o@zy-;2)gEeygS%wf+^kV zc8QT=926#$wsn#It#0hK$4_C<)EPf8m<96WMf+rLeRdeyNNHUHM@<rMhpslG3|ACr zZ9qS*u&oumT2-=*nk}23VG*$~M7o;)r2}JH3U=Xc-n+HJCQUg%UK(34IH*B`4sZqN zKd~JN_j&W~oz+Thd`9(@*7cY9!IH2P%Or=8b^Ywt(7Jw9j>0B6Yy2k`SX<X03;B6+ z=)!Ktxn9?wzK6yD$eIG_WUuS*A9!Im`F^YG!<Tli9c!jsz4w_D;1PeXuj?P@_2x1K zIt!`{_^<~04xP0EKv#dA*plGIGuvKuC)(=(sB|-|%1692rrYvL`LrPdbzs^(khSlc zo1rt|Jgt3?JG!|KMg4<>B7I>5>4ARn+IKIa-#-p<6x_8w4kmFbB~=`$ktXxn%1TQi z^gt^`S8FTdcgv>^*g}zNTNppRbq*Q)S-wJB0|^Qu68e?8j6}R3j0y(MXQrCH<;9y) ztvTcvB*+@FBop?&#M|_fi~NE()@ok%^$4NdgQo__A!->XXu4!SrWRdzZd41yP(v4o z3p}#=^U`g~1hHNBCR{5mQ;jf93eTJDY$>ZS+Eb{Kf+J94yALAm65$m|)g=6*(1KT6 zW-G8(sx*TKqBjZNXxik!dZk0fq(PW+s^yY#ml{F5<9QB*KyB2nf)h=+Hs?UQ;1kLx z8!8-zA`9te%Gg_CNgH)nb)S>U*19Yyw|2_MQgA3NG4NI0Gk%=M<H6%FC9R#ALRH>T zSTZ<12fLFIYQ2+Krl+;j#Q}cI*IOrgobal=CNZtCclpn~Gz9!!{>}OPI0-z!$p(*l zWDI2f&+@D_bB<^>6z!_|1yiCR2l7%(l)N-<>;9DYOeyc~7xB0JkKb0>P{Sj(J4@pi z|Ae=}e=52$=-W-<jHq)IL27I~yv<iU;^7BUPxF&K1kH!$0g(w+%s*Xfh_On7@2C{b zBGmZ$ja!kxU>jWGHQ955Ng@`aRwni-V1tArMua%qd;|}9DM|hpQfbdkIKs3cnGUA3 zw%2zTUwHv93g^eZo$~ek%uA<b&Pe-d85q1OKe^K}kCw8vIX%8U_+~6-2*F<uzJ;%M zLPZFz1q8S#&mz5W)>|8J4z4N$&hQD)#|rI#EDQ<>;QR$|@#dr#zvW@yS{B{U$B&i= zzvu_~fQnd%p^1y<zr`iEJyb}-Vg<%p%>T5ECH(yg2%SHV$Et3u+^iy`$KeDQvG(4O zadjF~_GPcx0xw#diVVYU`cQ|bq2~&JiZlKqX4;WiqCy&7HH8!-(J`JttENr3l8Iqd ziAyv-rtd8l3=2q@K4*yyo)fPxU<=-WgV9`E2n3>0K}y?lI$kFY;nP3io4+ejxU=^# z3lLUxt^QrZm{8;Yn)#FDVdLMf4u+Qez2#xeJ=%bjnxcV22?E?Jf(VD#YBO>3E3@?a zB9l(s&;>Cy0tTfKptUuEFKYyG2>5ph{<6ES`7yG}!X0=wptAkUbA{(+dJz2C0qdUs z2M;rA&p)$K?r10*dBOOG2(65)*2wh@`ION(q7m<8IYEKG=2<`x$C7NwU4{G=>)R}4 z9h;_8nI4BdEMKYPm_js%S%D=GzNh2mQQnKG^uHHm+A6ZrhPkU@A8HtESsPm=ET-eZ zb5O{hNr~dUg)}umycFGs1?1SNNE$d6r+y?{jl2x7AEIz&FBPpI-t~`$AAu_+8d#RH z872~eh*-SRj7_C?e5!}ih*}>OUJNYoDgfweE_#L%@Um?FhHLnN-ykiu12CS1lR`y5 z&J8m*Da^S<O9zH5So2M)=kBfLcJt{l*+uuk-*P|E%dcublcbG?`>Pqnd@iKQ20E@M zjxBN7ym%Em?c*>*y~_`ss;IMMjtq~^-edf`o#YDWwidJcG>IJ0T40&H&8R#TUNmW@ z=7XBM@$O*l?B8jAfpx(83jXB_IX~rD_8uZQOq*d>MO&|tpg&#!WBS{ltmDH*J#$BS z87-<4jo~FFb$la)e5}(hSsesoLM^L5Om-}NhDBTL=nOSg_~f&q`@pmB<_PibS~mma zzsf!*IFUFYVBoZJZFrJ4phNIZ<04TlDN)MZ<Ya6TH{sBmRuYrZ%)U1y#wQRlGns!h z{Fa#v%$#U`i(^d<9E+fudt=46#U2!qFrq<*T`dZqS;>Aqkw|<8$O>d)9XfAm(Oz~k z#Sfvvw&H55d+b>TqmgjRYvh`A{AQ)y=E$bDO8Te(7Bj1L(up7vd`>|<=RoqIvldqQ zm%yb=>GnZX%I|mdWNODcDtt4=Q@(TGeSi4+^DJM#@c5_+f}9v}k;yV^N1W<lc^S-3 z!h8Q$!fZ=~1yLnRlll9m<)$>=YR{}Jj(V2HqeGSkiASv8;)H1HL#=`yDhp9s^F3Mh zj$?82Q1ud0o`5E%w12R$sHe2c>(typm1x9{`nsq5M7B(p6N3hW4bD8_mJ!6bBm^s< z`DG2pq_Z7P5erCh!T<cKBV^A@1;n+;N&iuYV1xp){*elg2T`iQ`+nd$sd3-;9w&24 z4X3z8dEsg*qFWS{W>zF7aE(-+xY30n&c`xcy~}^-SXN?g%e6>v#S&Z3$ygDhB*Ohp zNlTT6#}wjT`<w=anq&gh+>+vDv(T040B3cOJ1298LqY_PhCr^oxX%uTB4_*wG5RAc z1DyB7hl>gk)5o%SFd7UyERYis0tVBI{aAJwN@%7gDC8wELP)$Y0CAGPGgk6TDwF24 zSDFgmRz}D(-FWE<55W_O>ib7oyTn7vnr=X@-V?PXY22t1nK=2vB-XgXltut0b^tDs z1YdgHnN~7NC|2rDI695;&q^owv9OE}lqKgTxYB%Rlo&k{grunpN}Hk>R0wf{y}>pg z>KG-<Jm#S~*(M-FaG(~v6CG<NWX|u}EB7SZTiKh@VVdgEdU_?>KPxGVCA<e^JIRgc zAGxi;+uS6GkZdrq#0!vZ|MAP*(DBP`c}g$C@k$0-E9XyB7@fWqc}UWkTSOUg9H)_; zowJu?Un3G>HG=fI=R^f<nA4ZN^nu_xHd{i~t;3(nGxiSSn$D0Dgt}6y&RWYq$k=7A zWkw4*gHz1*##0>visjAOg|x<%Pf^<tI#^H=!IfNr2<;tW+pbfVUNVlgizZY`2`Q9} zue>5RCc#CFWCvAzgoS~eqSo&EnP<540+S_pmb?;HqI-WTg`-S5{IJIl;2?pH3?TWN z`Q+=i;|=c0_m{N|NYyN8pD$vQ*N%=9mstznA*z{`3!OyzFcT1{>deG52?kz;OhtOd ziW0p@7XuhYJ(7PyZ1Xmh#g=fUI+SuD#JrsHBwX&N7z=-MJ8?3Jael3{G&MD8=-5Wu zr_E_3Y@K8<u69UgDCt^rH)V4tbAxi+l>UpjTP}_ah@l*~IL`U@EVTcP2g*Vk-yy+x z)bbKBFUmsw)V***C0Vl&3mI1|L{Y}WS!f;Ckt36V>T`Hz9`&rigpw=WwZV76{-Ls} zQzosBh>15dUbSuR|BqM|!(57|{|n$5Ntsy#q;$OK6GGqGYP%{EyIvB%LlwyxR+}Gi z?rb@0esL}rYztx2$9jq{5X|6(;wW8y-Ey!aDM%*5d}~oC<TOVt#?53R=xCtl`Aza{ zJ&%^WL8p9MSBP_+EVYY;k3a+2TgQ`<z@piu7L*3TQ*b*J7*ZL^tk)1|)R_#2&G0I6 z(f~pFtos{Q|IRr{5mw&vX$8!3qgyOEjGMAR55^Sp(zQ<88xyw1I1$j)J3GTr%k8ul z7cp^1y+=~G=<$;RA?Z(+(k4AYc(U&u#WW|dA~rStp&bno3VEuRyny^XhK(se9<fVm zVg+pT5~!bP8_VWNat1j?M`aB44W88iR|Z}!9fB)*8Q`i)xT?U_UVG45BwQtfp_m3- zk&Xl^1)A-a^T^n@t-)_h((O2kiv+}`+fCSKK>BF@)2S%3_PV;zC!=v2Y!K8=GMHK| zrr(0Oy=W}%%s`yWU`$-WmL$0<*iL$GL7_4H<p#srI2XKQMu34xk|kKqoa$O(2-_tF zmFJ<4YCbA4naq>%kQ9(yHlDa}h+Y62GYw4z$?8;)jEWlb{k^N9`do0}{*Kjjs8&#^ zD@yZfcX5ok1{5bj{$S4LTn~l0fOhj-_~;^sR!OjqZZ(u_hUF0@XFyfD{3_p0&Y2nq zK5H`u&?R8N-VO|R5Cc3B2K)j9pOL0fz5pCd5)Rs}H7wkZ&WBj&(J)D9n7?PLZI?AN zD^{?hf<8Op`X`#b5GUtwHh%XpVdA8r2IFI%O6xc{<C<0)nSCD#%UHFQ233J6%{l_C zICCp6NqiQ~<0haR*aT@e(Ex!C00PN<r)CwaD*BL~(^Hs=z2T&5Spszml``tCp(xtT zvgmAIU**1t4MyivB@cfmD7%q^S%B>R=tHEzRPma2)jtE#3l!<)z})xotfVk$Ufj>+ z95bM<rKjZ-=?ad%TLseBzsFBXEfB1}!~2Wg_y;sd<jJovX?k7CcC;kBB`ryX0-<i! z-F6lSYnHLMa|?7S&+0q4ctk$Q9?NnJ)Dz-Gs&xt;V==JPk5W6&*G36~_YaZAH7S&b znSPBn5lG^4WtYDC5i(NFzlag4Od%trwhyxv%*7`gG8kb5xJ#Ed3O{sYYt7rO#Hemw z3i6_KV#vAjXK_p$9l^xnpTx=FRQZJPNrjr8ts;rSbM$&D7RlBAV29>{;q=|*f*lMG zVTO#BVpWE@q`RoxsD5N{E$yH}k;|Y8ErBmiCrp9yc05f3%+--bjD@l&H2alxl(Phf zR&X{PcedqG#jr=S=0B>QSzIos{HQwJjaikWOBPs!r|vK%qsYI+zRLl245{jqi(%Ld zl%rBBwax)0H@y>4QlR6lB@!CF4)a#<?L{h#h$!I({a9QHJS2Az9OI)P1{<L+Z^s#C zK(AH^n<71X%hy9Y<3QU|c8vmj8<gpy=6`TNxm#3h<(I<0u3cv;kmh)gLn|esBE4Zt zbd;9yikIHk*#E|*d<~^21^Tu04aJX%;;JAWK9xH|VG7lHG&Xz+mB<tiG@V#L<WbK# z6saxPe2Gvy5K*ei(Trl}oTT9+X^&Ns>Ch$=5Jw{i17hQbHZIKrZq`njctD8?WhRCc z7-lJ)1&$0w0#*s6RqjaH35ll{rg@(-ziB^~giQBI7HuHPtfTB{yfuc2N>;$lU@E#c z;oC9Z%En?+<C_W%=(E|90%U{bvvd1M+!qmej{a>({6}G*BgFEGj;k9N$GdmMlCtF{ z<k)PFcn=JX**Q3lM>8;~;e*91?eXS!WdOpK8l7@u)Gn($s9B>H=+{nym@b6?b~WU# zyGTc)o|HEQM6YO|<f1D0NJC2%G(hU?ki@6mmWeR4Ip(KTey<YD5~22Z_n=$l;!?r` zRAsLv4GKnTt8=Xebq6n-A1MN&l_0Q|){^0i%2^Nrn7tx>H?|C~$N>~Uvi7@An-?As z^2M=M)!TL$3<=x8izoy@Rz?eXJ%k6)?JFLbQcMkcSBycE2GS}O08JMPkgb-4>E-r- z;HO&(okj~$Z&j#YFi*Ofh)#A*Nu$MvynjYJF_1joASn~P(7bnLRfQ9VPi|P7&cWNx zK}BUfKM4gzqtBPJmZI7TMRnfVFjSMC@rsg`p_;Blj?Rw_1CwTGC~A=ap4nN<lH#HD z>4N=ls1n}Arwan+YtbiYsPI~)%%yOmv!tQ)XiY;|O)fVW35nKZv8LH#X-dc131?Im zi{`DJ{DXQF+N2-#oM@It&POB0Rcb`brS~<0xYH;Y;TQulp%fz@3-OjJqRtzZfhw-N zIQghT8ne<d)I}WUwqh!T1kT$|9Hc2y|H=zW?ymR@lSLm4pQYshE3_vWMK3l>+<ytC z^enuLOJ-ZAU&TKX8(k|mKY~?P*}@q{451_+kbRpL{!t2FzHbs-6d4U*1>td0w!QVN znKffU1AMNU1y#(E^BcSIg%aM>+Dxd(#2NvOmeUK{D*#M9$#(v$PQA-0H3(NiA<557 zi(nQrvFXg-6eCvDG<JHAm-_UcX2v~>7l%hMlpbSW7e<}ils;faH3yip9x$_lG8`7z zOdNhcnvf|Cj$fJ5;C!%|@rLF^N3*VWt6)+rxOWEOM0>lWatsvT%~E`Ky*U+b7o+nZ zWL)K4vHSR~$Mr1<6|tfVo@#*s`r=ARw*h0smsH0Jl>tARdSb#9MWvPh^o8o3k^3gD zcciIywQ`-U6&wq57H%!NhZ1o5ch<P)-!%!u(Yf5uci>zD%mRR86qAs;higK)OCBPm zskQpd7MgoDj2K+0c9IK8G~zr2#G^VVc^|v$Hkl^ytBHP%u-!wb!*lX5EP2#M<U=*B zh3?L;^P6BwlT_Q#3X1G$Vdh=}fvMW~ZA-WI2|a5dO0^i_fV2j}!G9o5_Ib^3k;4LX zS8{(*N4z<XFvUT!q*apYnebz2Qjl5m#TBv1)~CQ+u^u2^(G3E`_6m?8lLcuoQ24kP z%CP-MjNw??$MpcYXx8>fLhbyNqs0`Vj@v5~G%7QPp_fO;Ne&hO)GgX=1Za-9lAVmx zaW;qWX*8Q_5NcD-ehBxGpMLg1xFUW)C|9~9!9`6H;yQ)5QRB-ENnYSm^AXpBp+YJ6 za+P^fwx}>P=cLdC*1U^koBbRw9^-oi1Tk$TR^mAFmr|tEYf~UYNdrFS53Hv-4>PvU zceBO0q#(EPia(KbNO;9G65j8m?RY#nLkwg&J{EF}`?uIbj`;+RJVc14oEUlV_}5p6 zuf%v-sP+-<0m&@%f~|6{Or<>oV$0!?GdQP0$@Q^6-3)w~7|D0LtQc*7y~Jo+bb$p> zR3S!O4|q#rbo^@+qm7UZi}}WWG1^!Yqm8eh7#)!+l^Dq?X^>`iv7wk95fhh-9`O90 zSbtCaF5aBKaJH(I82MwF5Yc57(zNDkyP+~y1CL3$@hGD#BbJ<@1v3v4MkQDz27_ts zO3oGWat>%6^jKGU)d6~2A4<)~w6^D2zJ^Ai^_)#Z1Hc5+C|o>1wm~DoWq5Vq0>Gu) zBi+{SKwx&lk$6nEv`%AvuouV9e1Vc<Fbm2fV@$wY%=j=H&9VTkWnZlekUPin3UC)l z5T;RQBaF5c2Q?V=kq}Ojz;pWkmBr4eEp(~Ebd}fUdp>K6#L0`ovOdRX`lHjtHFULq zA%NN#!I4FW9d<YJAhpg*fY>H0IKu-}r2ZkTi%`9H6gQ7eF|kE*3)dI6?SJDk3)?g! zpH^=~E@l7s%He!%JrH$VYpiU9|1cfS&x-@`h4B&7g1?oL!#CCmfM7!oGgC%2MD5*W z&&^5yi%8j3IvgeY-?$t~)ToJq@X9HNCY0s?$kGb{3dK>^0(JrnQ-^pD>RQHnfc=Qn zdVqxKSP$SiA+1f&{|qAa#_jp<mCPZKZR{)3Bg1(Gvm#~xZSBIrH!f+(vSdYf&;Chx zCDzbH5N0um3J3?@&<gUDEN#bfBdIXYoPlDmNPTJ0;z+o#6~~sbLR<+iA*PD3)FOEh zWBw|&2;$WE{QF{wcA2xNh^1y0_b<`z*XL>xmqI$E;1!Ild+MmWTR;Emd3Uqae##7g zUZ)Mzv8vsRd$lGTEcI)$Ej{y}En^9NMr%I01mq6SlVRa(9D?Gd>~bzx`mfV$zyx*1 z*gB;YQPKS_kTjoa7#WgUK|bDN?UdgFYL;wxAw=`CIEp1V!K+BF@CQavZ$XxOM7RL+ z%eSo`F+uwy3DBkf!WGniYl^a}N8<^V-`Kpmy}PsP2tGb+3xyVcN*Rgm(b1zvi=!p~ z9<A!5CQbJf+A{$}-AnVu<8MoMzLM{Jr5HB24o@_HFU=nj6emX~PYRHe8z)b0&Z%2P z?`8LAoK$tfy*yZqrdyxo)|I~X@O<l|+`6Jw6fbx>R^#0p*w>yVo636#Mo1{#QE2L1 zF98@7(XI5vGd<~ZKY3z&!w*p}ebaRa(fi(XcfowoXJ-9*3H12t^WC$QUKEV<`4{Ar zXy#-5fY^K;hc;*c9|u}aO$UfS>CqEI`>2pnT~S=I_NTle@cg9n3BBK+FMd=PM#>jx z^N8Dg0=VzKcw6^GCCCyme|B+T{+tgRfA~45mnjsDepVGk>Oxd6t3>sm%A|cxzIblF z_(@$D8a2w%QjG9p{XNlW+xLEA&{6L2@Skd};MBBpJKt7ZbMZgrHDcmxCev%KF&|&E zy|dfwU327`1kO9?`Ww_1I?<PcY#yTxfImVP+ruu(__pdk*MD$RjILs9!VTLG@<{%D z##prS3E|7F08ws0xcCOY{lDi1KGQewzvNr$=4!w7&oUDKm|L)rp#GRI1@%7}Lj7m- zw^>}B{*+gHxRv>fN^rdWh}^t-WOkoh|1dW%$vPR$3&fLt`X-Bom{eV|zFoclwJ-JY zkN5ocY3^MakEvOh<nihKV>Nz7Jm&lWF7@>j`o|yU-tl-W$d3E*eSP2h`q--Rkd?pc zxkgVYHOSzP9*~qPDul&Q3#@4PFQt}zPn3(+{=C1Z!5=jMKi2cA065b9>22N9lMq!% z^yfl|I0@>2L<?Da(S?M2&&~b8K7c<Az{f32k|zmO`XkXYcp=1DjlB$T4%1_@twQI; zHJHA<gbI6^9D*NvEjo;|dxttKpb%+e1i#uN=_A|=E%CcOlEj}>y~zB@bS6MOFMU#4 zaHwaJABQ^lZ2z@TwjGaGn&C<P*P;OKuD%w5Sn)vP-``{OaCH%P^;N+Uhv#;_wU>=7 zBl%}oy{oUr?p=-HyBdXY_0>%XP}xaeB+2`&e92+vz7!l=S%!oHRtpJAVa=Dd^+O2T zzsoOvf~QH?G%{b-94eOO?qB5>KhLcsc7K{L<HfLo|2S)$3Wq{sAg(%5oa+CS{Z)0U zK9v|t7*4<mk^t_1j6OrfC5S|o&;;L_pGsB@QQdvYm%_k*w^BpWPUm*U#mSQ=%dpxt zvYD;+nP{fQ9%e1^Kjg6r6G=&k#=fk(Px?}wycT_t2_1t~Pdn<#ot>;so~)zG%IzmG zSH1sg(m0j<2<xl56EBDVaBtE$@pbAypi=)I?;i^-)>lD_P%D3Qn7$H6SasFrh)_09 zO#@jCVq6?Qe!M(Bko)wJ>_B|<lpc1W{iwbT3WTz{y+_W94|dh6{*?Z=%I!y^Za`#+ z_CMQ?POO{S7xJV1AMU#sI*&y6dK_NH52VLoD3b1zq3~spJCw)|_98EKXOmRc2)+z7 zg=+bHFW##m9WRc=pECW_kLt*PuTzHtEjs*6QX-Y*EA=7@MlYZ49}6v3V09;{2nF_u z1jGu2anUqQiPvt(g{<_EtVw+I;WfxB3+1TTE2}+!6)GXRzbAEHb0ls4{15wkV!qIn zF9dA|nZGIa@}F|A+S{x5{8C1$+<}azGLRGk6_|N@-;Y2Kcz!e83q6}gCN7DQy**Jc z9$TLWaRbU<?!T6rus)B+;pzPnk2Q!uX6T8Xot<(gAyb^4K8j0;-G3f@6v}0z;3NG> z9|k_7i{~Z?YI`hUC!RBCAvENy*!G`tyN9RZ#9iSlS{}5m!AILa(zh+DN83+K_rfVl z<ke#mW63ao0i1nxhFf1=!f<~<hWjsx`?|@x;m(Y5@t>kV(Y=uoe|xbq5xuP#T;NKd zA`Uw>J9TPf^VF&NsV$7-sU}QG=_8Dj$@@)4ovez?q%TJ{o?&2SS<&Cc(`5bLoG<I{ zP5F`#-IpT%_K;yd1-Ki<Rq>~!6p1BJoR-X0IIi3s5vFF#^?ygVlEU6{i9ogvqweoz z)AWDs?`j&BC0Vf`a55=U73ur96s+fRM^Y}yxTsHGj%>)T?3v>1SIZN8cnOv`dr6K6 zxl>p&5Bn^`S)ELZCD5q=e5-dL%2QQPx<)*DnhMWB)BhvJT-%_U3M2bF;WYf46-sL- z4(6G9S6!9pHyU_7|2i5Q*;Iyq^Di?_r3n*Gh4F;bz_gJ6zvUO@G$+$71LMn)-GPWY z{%O2ONh6-7phGPtd#+LXa^$!vO#4Gt<A^|Gvkx>BjQ55hwIPj>+K5gB;OPvYMv|<% zOsOw}JHinEMsG?5iw$vQ<B)8!#_Y?$)6t%#K8gkZ>hz4hyaZEyluXz~^-S>8r{S8a zD32v%$etVoSN=eF6VEuzn-JRUSd2`Ya4eq2n=6x{2zRWQsmw9bz#EaQ9r*sQd$&f- zC+9$K`Z5?Jtl{H(yvuh;j!76s2ps(HyCa7nVJ<K9A4w)s_#?U{%h|gJ(Nh@FXQ0+s zW0D!%kWZmMy<Z`gOl^qZz8tpkyS?2Jh{+JEV_yb{VUvG5S-)%yf?(>k0h0<mEB>#K zj*gBqQl&hTizjYPNR>DRQSRzHSC0v)5$Rg_2CBvNzuv#8QLH&%elvVPz4@yCP036e zdXLHB(BEmRD7R5`OhXr<)6fGUYV##&=pmsFxXayxe-ev?8<8538VUTpH+7dC8N;p7 zZ1<A)9$xwCBu`&nLh{}t3;$(V`0=`h4<ZUZDJmApe3=~|gDEZwKjqm871{Yx8h2Kd z_I9f5e+i$-|I(Mf4Am44(2uX-Q<h?{_m`62)VpMXAwwa~hz9<o$E88<o^o6FnUqpt zW(={vNRm{}nOrKGlOai$)Fk$$Nd2P&&`SJwnYgX|r(_8npRTncF7w@CD_>0T#haVa zpSanV@g_Tx>F)_WKC@g6f9k`+Za>LeCl{2#olLK|Vs^#G<`wg;uo^NZy%Fj!gM!I` zNI-l!whaq=bmLHeh^=SI9`)9!H*OIlrpAP>)R@#&H1>aH!=ziuF!eTSWW(;e0YKQO ze-YnAw3kejx;&`!g*@LKn^>X#|LY<A^6IvWW2-;C6%h{}Y*Cz$S`=d)?XK>=|EHMy z7&Sk?xs^4TUP>BFtt1U5V0<}tIx3XecMO413^0wPTyJ7Du+)|inA(!UNo|FW6j!{y zw`)RXQjFr)WNmuG6UYq1^OmH4N^^EHJOVYTON}KN9yR65z-HK>pIS4K5mgZtmJw`5 zDk?Rl<ZEiG?_lg`H=6p99)4jhDPg^t?2pFp%dvg5FlRs1+dzF}{aNXF-0ht#5+O&* z(C#T79mMWc9bsuU#K_Iq);~~lA5x}|L-Nwd19GAJEB#{$PXcTeM}N70+*^mSz0*+a zf0G`Uw&zxMA@@lI>Z7Cr)uk`T_6kFpJriZ25eh&_0<MYlX_2*Q|9y^6`+=mU<PSwt z?*^3Iln5p!v_kFGX|I|iv`H<99?`<@r@_>nQiiq!;RN_H$Q7307ZTW+IC%gf&y|IU zQ$^089_i<p|0g-Y((`Yqm4jRzY%kipe1M$_lG;DaIS9d>J{IMCITVSz2l!C>P+lK! zq#VXYnB}br1s7qK-%5`wi`i~QcW!<qG0}WtHVJ>o#_QIaPs|pwq4B=9Z(bv^6hy8i zITRYQFJqj+g0Jj9Qa>hYIGVm3**qK|^~?K@l)6ktU!s?&E|?P4MUJ5Q&-EYa&16aS z=0LuDIZpOfWBQr&QE6%4%qR<Tj!VpI5tg;KE0&tl_)}Bzq+_!3X*89;mw^*S`94|Z zk@a!<C;(LdpG@XBA|2b{vE%5l!B6kO6JJtJSteeH^kqnbFM}g|8JeG3%{2ey1k*|q z_Ft*Vf=NP6I9_?tKjoEIk|nuvJkcA|E3cewT&dafD|fE+h$2biK(y+92k=sO`ks8r z8G!k6+`ThjPB=+X?+Q|{s*slX5VwwJJXW3x-Cc*Qj81DOUQ+aXXKr)s27GstF4g=v zv~0~GHpxL4ksIoL1$Qb`#5c!#zxO{J?)Ki_nRPzDgzx(waD89=A!enf7ju2>mV|vv zev9m*FW3AQ1q8l3u@4e1%)iYpjI6i)iD)S~98%uC4Bkl&hgjQ}6MJLf&3w;_vrA?Z z&T&TMv17dxBal*?eNU0}NNq|nq&A~dQRIIL=wkBrNG7<%j9{@$zETn4cFqGppzLIs zRvLCd_|4JU$hILlExlJ0LpjnDl>=J8x>$w}FG0@hE|NnC>nYUO3PfVrm*EE|Gtpa~ zv6Z6lPVBjar*LQQL<yf(-Z72i%b2HWG9E{`Cx_(5$94o#({j9{>0e0x&DcSR+nd;p z2)pp}z565Xuw4kU`7+eGFT)-u!yzT-%Rqm4Qcv!iQt!4Fk#<bxMEsG=Nd&njx%@-l zof!VGEPt`48*M|Xl{pE^l#ER8T8!<r`EE!`xE4=IS~$G@t<aI7Y{iaO6#F7-huA(C z_rXMKJ)n^oG@yaW12BIm!5o@9L8sCAGN^L^x}QtXt;M}z_lzAO+SV|J6xQ%P1I-@{ zD2sHQk>vb9l?O#Fugo?v`_SZEO=N6x$|g{n2(3XULJR&xXh9W(ep^4%p3vgS-b2uv z2|e+Gbi$j`N8!L25%tP-4Ly}G)sr+BHR$-7{`($1!JWx(5O*cNp?4uB_ICqmFHJ}b z(kp>5jcF8SQFJeS!qk|Cof_-go!E9qV=qpPW!#1vwm0M@NKt`(H9cCTdLleX$dM8Y zet%IKT&UKB2C0I?Fajdb@WTF0Jx(wRVZIE61&lwt_ND;|1?$TgO?WpiNN<LS*ii{j z#Fv2>UxpC)GK9dFA-LhxJfEgAQX<*RMy39b7J`G1P%!>BNa)K@Fun{o$CsgCqVZ=X zIAfAOxk;MrOm32>mfR%8*1nAI!()1CKTaWx6Pj~U#g~yG^JS31moZLX268za18)A| zG|o^btAEvI(Y*og`nJ{NW}f66{w(>$ixpQlS-ufLZ)r~^SpoT3$qLB1^5v*|TfPjJ zE2;H2<hxTZ4GRrF4JHilYd1iRq02MeaLhz>lBS_`?pGh(sBasT@#=1PQNBC16BcG> z6us0eRXGgEH|M+Yx#5k^1IT1L;`5}2-oZCX4e9fwhUCuqGCmKDw8nLc)<&qgJ{v9b z>`!Vt>b?wx<I9MueL1m_^ySpbDVqOZV{qYOS$Olbv87vl=erT8Ch1lr>&vPAwh;7x zo{6F0$HKj)4`qXWHzpB$Id&4umlMP9%V;!o!vCBb?R8Zw>)XnbSSODmWjXWAb4Xn3 z<bbweXjA)%(aArGPDb5d0b|lTy$YH*#PZ$vCREU)GGL-W5`AfJU#_J>r3!sF<jt4S zs4ru*p{;(ccQe$zl|=YTn=9VV1J*Qo$^TU}o^lGS_oNWzN@c^D?0)o|h$m|j#Cuih zIk+T|LB=vL^veEmuaBn=M*|tJNRPw0PlJ`!OoJ5{rNN4hG1!;(9|`S)5eDRYX(d36 zay8J4(Bo&<AWWUf#ZPvie=Jyx*{MCCP`^Ku9*3E*c8y64Uxu%=ky%a*tSA}XpS1p( z#n1>hyAR&hec-lO*gGYG{>h6a(Bspj&*f71GMFM%`}=!+EY%kItmAY}-|K(0shT$i z9HU<|zwAr72fz4(HPadN=>;UP_m*T`LPC-q>sd4?l5i@P3Y^|C&|K04QpgG5gtpoO z=MUE`WKW`OAq`ISCkyp!37pVWMp&3{Uxrdi7!_+JjA~?o(O0MM!`RvY1}MG^P<**& zAvH4J4dR5c{OQzGq$)YQR`{2C^kpoX@@1rqd^xty<jWYKFQZk;h%vyQOsETK&i|_M z0{eMx=NpIKnEc^#*KTpmr8WuhqhHhU4uG+^SGHfij5U(J9C>+%FDYP@-<^2*i0@8U zFU-9DBNWEQ&>2!*bR)x*-2TwhsXO65btf{W?n3=As)ztmcm2CFtLW(N(V=cbD6O8t zck|`QO9g#7?leE>%fPKK1Gm1MB|DSX09}80P<?+hC47E~(E55p>z`x_q}w<wQzA^* zu7t$;GC0PUVa9zKnMq&fV96pORQYb8DwOdr^}1|en)=k=T0(GOnnVk0gRlU;3>ELo znGJntgCFcWkioO~#=1>khEOJ<76iVG5%_Xq68UoKH734{4nlMMcpukFk}ST_fiKsj zUO4pK$d39lP~^+7*uI=u>OukB+e@v!w@_EsMZOHj-ItNU@nyJDzRcdTX&`0gyEA)L zp%#8;tpm$<5ZRY&YC#bAZlK7QF#=ys?SA+&h#VT?&b|W~WXk7D?}#0I87T5)1ZcjD zINg^K*Z6X3y!div%1~4o74$>B3JSF&XJWUQm9y2KYG&4m9JC<}nV)7uspXnlv$WCw zDJdWWsNp9hv?>pf(0V|{^6t#T@(UYQ2!Y}6%0Alwe`3dkKg~5I{PizHOTHT|1u7qz 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�add*$~~^n^;)k4>EJs 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"Nf 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 cMqv@RK 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%0DmSmMSpus_ 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%0D6Mq;y$$n+v@7 z{JJe$G_=95^PtR6=9MkBbEWdnj1F@&-Ls|k{(6B|4<EZXuaT~>S896`F|_7vMqDv3 zu7KBzbOpR#&g{5i+?ERat>{8mc4B9`(}P~@$$=ciF&xWr9M8pE!ZlpW_1wTM4Cgj( z=YAd_t>B7*_C|`5P?mm1}nJ*u8uu(X)AwN%8d*UfiI91yQ&A9qu6GtWMK5*RUOR zdMpZF#!(Q{Hq$iA+$_3v3KpDJvY*@i=+95e^vKZ_7p#e4@ieTNaw4S=NBKnUewq2l zMRxQh4e~pV^r>l2SGut~z35H(W3>Er#^Sm`#kczKmsW6CrJY4~e!bFnmRjTnwHx|N z8lm#bG^Hi2*o(dCO*E~CGlKL@-f4RjX{q<Uw(pPoyneLE(vt1CB<6{f&xV>(_QWMH zcV}?}+p|43T>>+H$!NJnCoC-yYi~PCbRMH@pWl_5+kz{<{5#6{^vlohRsAZXbhN<I z3dp#mW~_oNpUUTtr0_YyA#fyvIF;02n`HY@Qn%%8+wW4D%E#HI3o(&m;?j*%_`9>U zcGBHjRF>BAmpWWn9i753|CAIz-`7!plUnwFHr3BG5!dNC0~L`DAudh0C0p^IO8s+- zcFu7ADOp&L)7CnL)Dv3VY^>{Rh8)as9M4sxOCm<w>-VOZ$S;^TVRB{vuSz}Y(~w3q zp((w|t?`a<J0?{Qq>!OpLkY7uX?>rMG{6&=AnZ>HbEKYDQx#4#B27be(lWo4$+VUG zS`!hV>-e6ZSfNN6%r`e`d$QEc7K~9o)zLurMQVksDWZ(rETsK!F^ETGBRz+2n8V+l z5^4T&n7LU<XO0j7R=qDy7SjG6cLcvT8|mww^9Cs^=@+)YB!!dq&~)g{!m^a60k1I{ zTMrSF3?u!-ax7082rHjUKeddO)GCT4Ns&{38CGRAV%cds+LNU}M{q4gyu-VsmR0#a zL+VNY-mC$Oo2n_b<Wi6Pe>J=5KP_cb8gTr(vYWP-;dHC{Sx$>&IZc;h`@Pvte~!$& z^6yFM^xYStN3*3ObA^y96i`UUs*|`RRJQ1LaaRrTpZgtdSL+(L4Iq`<H#PQcVqbIp zP20b^rq2AtGugsB7JShQ-LCenC%Vj2QMrAi-LCG!SOs&cc*k-(r^XYTYua`3j^*}! z9{Z|fN?mv>TX<)=H*~wYt8vAZxUxlV{Ho&|d*b?B+2V@!#-6xpSGKgGy|Jh4qj=j< z6?_SWsxN(}Y*9r!Bg?kS*=CFF%>CM@x*c_%4BgpM+s`*zR*xpPNA~Yr!kDQpF#xfI zF_tbyZz$r<f92A}$|Z}!BenFN8OdnIa5wkx05Lk3uA%XS?I(GL5~fnhyUgHoz9oXP zc~qquOS24hS&qgup>oNhaU?y(u2e2rtX#4<xsJ#IkMT6mP{KBrBW_Dqy3w5;^kjGb zzb{#g-g@PdMZf=Aet&w<lim3{mMo@Tb@Zkymndqy&TCF(UJ`~b<NF9lH=Em1%4Ge2 z84(T0Xj!GCKO5P;fT2Y4pJ;Wxi<Vbrt&R0g`H76i?AR`Io0pl7u5-Icf)de#bnTM= z*(Hk8|Jh3vQxxHkE>(=^LFH0KJwwYBt5+^n%oHy5`<E(KE>U#+m>9M@d(ewL*^A00 zivN2{6yxf!6)jP$T$)(9G_i7NqKUJX9k!<n-8h6oE~l7D{L!U}3ybcG{AlMaqhVXe z|8;~NUlw*0$V<`Qscx@W>UIQY%Rjg*cK#9?jz?&DYeH*QXNSJhAb(obi`|nOq-^iu z9oUkX)D+V_29PrJpJDq<{@wGEa@XYL&QD5f@_z3;r6Y9yj^rqgW&p=<EXQ#?CvYMs zaWaw1=0V0Wfw*Ai<2=EWJjL@wZktzmjdysLkNB8RiHm7|%N)Mrdw$?Y#P>5*NEgCv zvbIT=q}-BeepUS5wdXi2sLQe}#|o@P0c*1k>r$VFG$A*4$zMHBD`OyF%@_zMdt<@) z_@Fn%$Ls0!)pO|C?riSM0!QB4j;b;W4Kk<fIvE4ZrIyluk6jBqKJL#f5fkUU+OI|j zddoInNVc%l-?7}!&&^)wcBecq$C5N>bK3KJTGQ>dy0fM6;=lZ1*;#H^)Ah=fdgHei z+;^ed)$94I$QHTrt248xVD4~xw%E>@_3y2^;OEVH**!?t-zc^{jd^cp!`~mDVgA>W zscO3#)majMZ>A>ZUuN>rV$Lj0ZI;2(f*2FcSV9n2WQ>+!#&Us-B?1|X1v4wN3Kj=u zR>R`Jj0J(2HCc-S)@B{n#mCIlrvVLVL}Qw;9_zCK8`6|!Y{bTFLUT4{Gd5=nTGEQv zw4p8SXit_7Y{^!1q!XRlnr+yQ?dd{ScAy(OvJ*SA3%jx#-RVJ3c4rTIu_t@6H@)dY zU-n^N_M;#Ba{vc&5C?MzhjJLkAv66sf+IPKqZz<49LsT>z=@p1$(+JK3K_&{3}y(Y zb0%kTF6VO*7jr59;tH<jTCQUl*K-3mauYW*oDq!VHg4w*MlqVZxredb%l(XFJdZG$ zDLl>-JjK&I!?TnymFIY#7kH7En8tKo<`rJ$HQwM&N_mU7d53p-j~UG5eLmnrKH_6O z;Zr_i7GE%%FZqgZnZtK{&ky{_Ph=vOHC0%Gsu;b@RA)(QP?K8ZvlL5Hn`Nj&U6y4z zmS+W4WF=N+6;@?6R%Z>?WGxC<n{`;1deo-@4QWJUny?=0vjH2@lxA$i#%w}MTGNJh zWa+?`bY^R|VOzFid%Dn-9Z1W0Vp8Z49LZ4}!?6sckkd)6hI4G6%Xys7P%h+pZs0Z^ z;$fcUIbLKM(|MU!c$L?9oi})sQr;r!k#~5P_n5&<-sb~8<Rd=j6F%iLqVD;e*?h&< ze8abV#}719CikWfec6Y7*^hqg&jB3BK^)8>9LixFPJfQzNRHxY25=0=avaBV0w;13 zCvyq|DP$05a}MWn9_MobL%EQPxR^`0lz(v<mvaSIauru|4cBrVMGWJ5Zs104;%07P zI3pOzt=z`#+`*lUVl-p8i@Ujpu|%DAANTVB4>FGNOkg6#JjBC1!lO)P3XkzPPw*s9 z@ifm+!c?B)d0yZ}USb;4d6`#umDhNkH+Yj$-r{ZE;a%Qi1~Yk|5BQLe_?S=ll+P$* z7N7G4v-y&*_?mC{mN|UK_x!+*{6xldfmkYAg(av;HL9~DHK<7~@>z<dsm(Ifp)N7) zU^$j&1y*DwRwgnnugYqy&Kj)AS`@H0>##2Ms80hL(um0O+=TU5pAFcMrffua&frXn z>iFF#KP2~!#@LS(nk;!1G08EHDl9=&s!^RKsX<L@k<U^rO>LH;4s}_U<yf8-Sdo=j znN?Vo)mWW1Sd+CVU~Sf6UFuPv1~jA*jcLMqtj`8)NK=}z5gW4!&DoUA*qjz@K}%ZE znl`kh9qq}|fi2mJj&!0kTeA(@vK`ygg|6&CH+Ezvc4ilLWjDIhgP!cp9`s^Q_F`{( z(}%w7!@lfCKlbMU4&)#X<`53$Fb=0bM{p!ZaWn%shGRL7<2iv7If;`wg@F_@h*LR@ z!3^Pa&frYW;%v_0T+ZWsE?_7ZauFAE372vuS92}bQN%E==LT-%CT`{yhBJbZ+{$g- z&K=yzC`L1eySSTs7|Xrf$NfCOgN$Q56PQRblX!@Sd4xxq%oHBuah~8wp5keq;aN(U z%5yx=3%tlnOk+AP^9rx>8n5#PZ&J!zyv;kj%X`dVChzkBAMz0&^9i5w8D-4kbG~3U zU-A`S^9|oJhwu2FANY}<sG)aThm~2AMl_=Z?b(_bqFvO`Y;XGypg)mSb`)cX?6UU~ zlcgUbvdm85X{HlB@%Q<J&-s$CiC%YuwVmfQVSP4c6MEC1(-_RydVT{^HrU7l+lRjF z$Nn6^fgHra9KxX-!I2!r0FEIhQxD=)PGc}bIGr;%le0LRb2yjtIG+m`%7t9S#azOr z{EN%DoGZAJtGJqLxR&cEVi?zR12=LLH**Wa8No<y<u-2T4(?<WqZz|p+|50V<zDXN zejeaK#xb4=Or)4eJjBC1!lO)P3XkzPPw*s9@ifoyEG10kIiBYQUgRaFF`burg;#lv z*Lj0CDdjER<{dubV?N<iKIaP}yKR;ZY{^!1q!XRlnr+yY?bx0!bY%y+u_HUNGrO=W zyV0E<^kjGTpci|x7kks2KJ;ZD_GLf%u|EfJAO~?Uhj1t{Nq!KgavFmf!s(pBnViMh zoWr@C$N5~qP%h*mF6I(0<zHOJ<y^s)T*W%Ks6VMkeHze^Ml_}g>#;r?upv#^m`!NT zrfkOMv|tNb(u&r!p)KubPnHgB$yRiv6P?+bZP=FW*q$zQWe2*kBRjD(yRa*}(VZUj zWOw$U7kjc7d()df^kpCRWk33{KL>Ci2XQcma43gyILC7WCvp-eGmt_CaVn=Vm?50b z8JxqpoX7bL<w7pvV*bTtT+S6-$yHp<HC)Se6funJxq%zGiJQ5F;f!D;cQT557|XrP zUw){t*G^+OR%Y#={9a_L=4Bc&iWf*jv_%3*#YE?P9kQd&XqbO*%MUywHxQk5dk^|> zA{B+bzIOjNwD4+Ma2^rvxQYmGq_D*Uwj(Stfr%9J2&p^WTz59Q!@IH@J?P2q?7^P& zrZ4-jFZ;1S2XH8d)1M<aiUAzM$(%wVgE)=BoWXfq#Km00b>w!d(^|`zIUH*(QxLw; z_M*DgsXLvzɲ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 literal 0 HcmV?d00001 diff --git a/lib/webperl/webperl.js b/lib/webperl/webperl.js new file mode 100644 index 0000000..c427043 --- /dev/null +++ b/lib/webperl/webperl.js @@ -0,0 +1,388 @@ +"use strict"; + +/** ***** WebPerl - http://webperl.zero-g.net ***** + * + * Copyright (c) 2018 Hauke Daempfling (haukex@zero-g.net) + * at the Leibniz Institute of Freshwater Ecology and Inland Fisheries (IGB), + * Berlin, Germany, http://www.igb-berlin.de + * + * This program is free software; you can redistribute it and/or modify + * it under the same terms as Perl 5 itself: either the GNU General Public + * License as published by the Free Software Foundation (either version 1, + * or, at your option, any later version), or the "Artistic License" which + * comes with Perl 5. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the licenses for details. + * + * You should have received a copy of the licenses along with this program. + * If not, see http://perldoc.perl.org/index-licence.html +**/ + +/* -- Please see the documentation at http://webperl.zero-g.net/using.html -- */ + +var Module; +var Perl = { + trace: false, // user may enable this + endAfterMain: false, // user may enable this (before Perl.init) + noMountIdbfs: false, // user may enable this (before Perl.start) + WebPerlVersion: 'v0.09-beta', // user may read (only!) this + state: "Uninitialized", // user may read (only!) this + exitStatus: undefined, // user may read (only!) this + Util: {}, + // internal variables: + initStepsLeft: 2, // Must match number of Perl.initStepFinished() calls! + readyCallback: null, + stdout_buf: "", stderr_buf: "", // for our default Perl.output implementation + dispatch: function (perl) { + Perl._call_code_args = Array.prototype.slice.call(arguments, 1); + Perl.eval(perl); + if (Perl._call_code_error) { + var err = Perl._call_code_error; + delete Perl._call_code_error; + throw err; + } + else { + var rv = Perl._call_code_rv; + delete Perl._call_code_rv; + return rv; + } + }, +}; + +/* TODO: Embedded script should be able to influence the running of Perl, + * the cleanest would probably be to set properties on the Perl object, + * such as Perl.autorun = false or Perl.argv = [...]. It should be possible + * for the user to do this for embedded scripts also! Will probably need + * to change the initialization of Perl so that the user can set its properties + * *before* loading webperl.js. */ + +window.addEventListener("load", function () { + // Note: to get the content of script tags with jQuery: $('script[type="text/perl"]').html() + var scripts = []; + var script_src; + document.querySelectorAll("script[type='text/perl']") + .forEach(function (el) { + if (el.src) { + if (script_src || scripts.length) + console.error('Only a single Perl script may be loaded via "script src=", ignoring others'); + else + script_src = el.src; + } + else { + if (script_src) + console.error('Only a single Perl script may be loaded via "script src=", ignoring others'); + else + scripts.push(el.innerHTML); + } + }); + if (script_src) { + console.debug("Perl: Found a script with src, fetching and running...", script_src); + var xhr = new XMLHttpRequest(); + xhr.addEventListener("load", function () { + //TODO Later: Might be nice to name the script in the virtual FS after the URL instead of a generic name + Perl._saveAndRun( this.responseText ); + }); + xhr.open("GET", script_src); + xhr.send(); + } + else if (scripts.length) { + console.debug("Perl: Found",scripts.length,"embedded script(s), autorunning..."); + var code = scripts.join(";\n"); + + // get the first five lines of code + var n = 5 + 1; // the contents of the <script> tag will usually begin with a newline + var i = -1; + while (n-- && i++ < code.length) { + i = code.indexOf("\n", i); + if (i < 0) break; + } + var head = i<0 ? code : code.substring(0,i); + // look for a "use WebPerl" + const regex = /^\s*use\s+WebPerl(\s|;)/m; + if (!regex.exec(head)) { // load WebPerl unless the user loaded it + console.debug("Perl: Autoloading WebPerl"); + code = "use WebPerl 'js';\n" + code; + } + + Perl._saveAndRun(code); + } + else console.debug("Perl: No embedded scripts"); +}); +Perl._saveAndRun = function (script) { + Perl.init(function () { + var file = "/tmp/scripts.pl"; + try { + FS.writeFile( file, script ); + console.debug("Perl: Saved script(s) to ",file,", now running"); + window.addEventListener("beforeunload", function () { + // not really needed because we're unloading anyway, but for good measure, end Perl... + console.debug("Perl: beforeunload, ending..."); + Perl.end(); + }); + // run Perl async so that the window has a chance to refresh + window.setTimeout(function () { Perl.start( [ file ] ); }, 1); + } + catch (err) { console.error("Perl:",err); alert("Save to "+file+" failed: "+err); } + }); +}; + +Perl.changeState = function (newState) { + if (Perl.state==newState) return; + var oldState = Perl.state; + Perl.state = newState; + if (Perl.stateChanged) { + console.info("Perl.stateChanged is deprecated, please use Perl.addStateChangeListener instead"); + Perl.stateChanged(oldState,newState); + } + for( var i=0 ; i<Perl.stateChangeListeners.length ; i++ ) + Perl.stateChangeListeners[i](oldState,newState); +}; +Perl.stateChangeListeners = [ function (from,to) { + console.debug("Perl: state changed from "+from+" to "+to); +} ]; +Perl.addStateChangeListener = function (handler) { + Perl.stateChangeListeners.push(handler); +}; + +// chan: 1=STDOUT, 2=STDERR +// implementations are free to ignore the "chan" argument if they want to merge the two streams +Perl.output = function (str,chan) { // can be overridden by the user + var buf = chan==2 ? 'stderr_buf' : 'stdout_buf'; + Perl[buf] += str; + var pos = Perl[buf].indexOf("\n"); + while (pos>-1) { + console.log( chan==2?"STDERR":"STDOUT", Perl[buf].slice(0,pos) ); + Perl[buf] = Perl[buf].slice(pos+1); + pos = Perl[buf].indexOf("\n"); + } +}; +Perl.outputLine = function (chan,text) { // internal function + if (arguments.length > 2) text = Array.prototype.slice.call(arguments,1).join(' '); + Perl.output(text,chan); + Perl.output("\n",chan); +}; +Perl.outputChar = function (chan,c) { // internal function + Perl.output(String.fromCharCode(c),chan); +}; + +Perl.makeOutputTextarea = function (id) { + var ta = document.createElement('textarea'); + if (id) ta.id = id; + ta.rows = 24; ta.cols = 80; + ta.setAttribute("readonly",true); + Perl.output = function (str) { + ta.value = ta.value + str; + ta.scrollTop = ta.scrollHeight; + }; + return ta; +}; + +var getScriptURL = (function() { // with thanks to https://stackoverflow.com/a/2976714 + var scripts = document.getElementsByTagName('script'); + var index = scripts.length - 1; + var myScript = scripts[index]; + return function() { return myScript.src; }; +})(); + +Perl.Util.baseurl = function (urlstr) { + var url = new URL(urlstr); + if (url.protocol=='file:') + return url.href.substring(0, url.href.lastIndexOf('/')); + else + return url.origin + url.pathname.substring(0, url.pathname.lastIndexOf('/')); +}; + +Perl.init = function (readyCallback) { + if (Perl.state != "Uninitialized") + throw "Perl: can't call init in state "+Perl.state; + Perl.changeState("Initializing"); + // Note that a lot of things still won't work for file:// URLs because of the Same-Origin Policy. + // see e.g. https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSRequestNotHttp + var baseurl = Perl.Util.baseurl(getScriptURL()); + Perl.readyCallback = readyCallback; + Module = { + noInitialRun: true, + noExitRuntime: true, + print: Perl.outputLine.bind(null,1), printErr: Perl.outputLine.bind(null,2), + stdout: Perl.outputChar.bind(null,1), stderr: Perl.outputChar.bind(null,2), + stdin: function () { return null }, + arguments: ['--version'], + onAbort: function () { + console.error("Perl: Aborted (state",Perl.state,")"); + alert("Perl aborted in state "+Perl.state); + Perl.exitStatus = -1; + Perl.changeState("Ended"); + }, + onExit: function (status) { // note this may be called multiple times + if (status==0) + console.debug( "Perl: Exit status",status,"(state",Perl.state,")"); + else { + console.error("Perl: Exit status",status,"(state",Perl.state,")"); + alert("Perl exited with exit status "+status+" in state "+Perl.state); + } + Perl.exitStatus = status; + Perl.changeState("Ended"); + }, + onRuntimeInitialized: function () { + console.debug("Perl: Module.onRuntimeInitialized"); + Perl.initStepFinished(); + }, + preRun: [ + function () { + if (Perl.noMountIdbfs) { + console.debug("Perl: doing preRun, skipping IndexDB filesystem"); + Perl.initStepFinished(); + return; + } + console.debug("Perl: doing preRun, fetching IndexDB filesystem..."); + try { FS.mkdir('/mnt'); } catch(e) {} + try { FS.mkdir('/mnt/idb'); } catch(e) {} + FS.mount(IDBFS, {} ,'/mnt/idb'); + FS.syncfs(true, function (err) { + if (err) { console.error("Perl:",err); alert("Perl: Loading IDBFS failed: "+err); return; } + console.debug("Perl: IndexDB filesystem ready"); + Perl.initStepFinished(); + }); + } + ], + locateFile: function (file) { + var wasmRe = /\.(wast|wasm|asm\.js|data)$/; + if (wasmRe.exec(file)) + return baseurl+"/"+file; + return file; + }, + }; + if (Perl.endAfterMain) { + Module.preRun.push(function () { + // patch _main so that afterwards we call emperl_end_perl + var origMain = Module._main; + Module._main = function() { + origMain.apply(this, arguments); + console.debug("Perl: main() has ended, ending perl..."); + return Perl.end(); + }; + }); + } + console.debug("Perl: Fetching Emscripten/Perl..."); + var script = document.createElement('script'); + script.async = true; script.defer = true; + script.src = baseurl+"/emperl.js"; + document.getElementsByTagName('head')[0].appendChild(script); +}; + +Perl.initStepFinished = function () { + if (Perl.state!="Initializing" || Perl.initStepsLeft<1) + throw "Perl: internal error: can't call initStepFinished in state "+Perl.state+" ("+Perl.initStepsLeft+")"; + if (--Perl.initStepsLeft) { + console.debug("Perl: One init step done, but "+Perl.initStepsLeft+" steps left, waiting..."); + return; + } else console.debug("Perl: All init steps done, doing final initialization..."); + + /* NOTE: Apparently, when NO_EXIT_RUNTIME is set, and exit() is called from the main program + * (from Module.callMain), Emscripten doesn't report this back to us via an ExitStatus exception + * like it does from ccall - it doesn't even call the addOnExit/ATEXIT or addOnPostRun/ATPOSTRUN + * handlers! So at the moment, the only reliable way I've found to catch the program exit()ing + * is to patch into Emscripten's (undocumented!) Module.quit... */ + var origQuit = Module.quit; + Module.quit = function (status, exception) { + console.debug("Perl: quit with",exception); + Module.onExit(status); + origQuit(status,exception); + } + + Perl.changeState("Ready"); + if (Perl.readyCallback) Perl.readyCallback(); + Perl.readyCallback = null; +}; + +Perl.start = function (argv) { + if (Perl.state!="Ready") + throw "Perl: can't call start in state "+Perl.state; + Perl.changeState("Running"); + try { + // Note: currently callMain doesn't seem to throw ExitStatus exceptions, see discussion in Perl.initStepFinished + Module.callMain(argv ? argv : Module.arguments); + } + catch (e) { + if (e instanceof ExitStatus) { + console.debug("Perl: start:",e); + Module.onExit(e.status); + } else throw e; + } +}; + +Perl.eval = function (code) { + if (Perl.state!="Running") + throw "Perl: can't call eval in state "+Perl.state; + if (Perl.trace) console.debug('Perl: ccall webperl_eval_perl',code); + try { + return ccall("webperl_eval_perl","string",["string"],[code]); + } + catch (e) { + if (e instanceof ExitStatus) { + // the code caused perl to (try to) exit - now we need to call + // Perl's global destruction via our emperl_end_perl() function + Perl.end(); //TODO: Perl.end has already been called at this point (how?) + } else throw e; + } +}; + +/* Note that Emscripten apparently doesn't support re-running the program once it exits (?). + * So at the moment, once we end Perl, that's it. The only useful effect of ending Perl is + * that global destruction is executed and END blocks are called. But since a user may leave + * a webpage at any moment without warning, WebPerl scripts should not rely on normal termination! */ +Perl.end = function () { + if (Perl.state!="Running") { + if (Perl.state=="Ended") { + console.debug("Perl: end called when already Ended"); + return; + } + else throw "Perl: can't call end in state "+Perl.state; + } + var status; + try { + status = ccall("emperl_end_perl","number",[],[]); + // we know that emperl_end_perl only calls exit() on a nonzero exit code, + // which means no ExitStatus exception gets thrown on a zero exit code, + // so we *should* reach this point only with status==0 + if (status!=0) console.warn("emperl_end_perl returned with status",status); + Module.onExit(status); // does Perl.changeState() for us + } + catch (e) { + if (e instanceof ExitStatus) { + console.debug("Perl: end: ",e); + status = e.status; + Module.onExit(e.status); // does Perl.changeState() for us + } else throw e; + } + return status; +}; + +Perl.next_glue_id = 0; +Perl.GlueTable = {}; +Perl._glue_free_ids = {}; +Perl.glue = function (ref) { + var id; + var free_ids = Object.keys(Perl._glue_free_ids); + if (free_ids.length>0) { + id = free_ids[0]; + delete Perl._glue_free_ids[id]; + if (Perl.trace) console.debug('Perl: Glue reused id',id,'to',ref); + } + else { + if (Perl.next_glue_id>=Number.MAX_SAFE_INTEGER) + throw "Perl.GlueTable is overflowing!" + id = ''+(Perl.next_glue_id++); + if (Perl.trace) console.debug('Perl: Glue id',id,'to',ref); + } + Perl.GlueTable[id] = ref; + return id; +} +Perl.unglue = function (id) { + if (Perl.trace) console.debug('Perl: Unglue id',id,'from',Perl.GlueTable[id]); + delete Perl.GlueTable[id]; + Perl._glue_free_ids[id]=1; +} diff --git a/sloccount.html b/sloccount.html new file mode 100644 index 0000000..7bf314e --- /dev/null +++ b/sloccount.html @@ -0,0 +1,821 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>SLOCCount - Count Lines of Code + + + +

    SLOCCount - Count Lines of Code

    +

    Analyze source code to count physical Source Lines of Code (SLOC) using the Perl sloccount tool

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

    Analysis Results

    +
    +
    +
    +
    Total Lines
    +
    0
    +
    +
    +
    Languages
    +
    0
    +
    +
    +
    Files
    +
    0
    +
    +
    +
    Est. Cost (USD)
    +
    $0
    +
    +
    +
    Est. Person-Years
    +
    0
    +
    +
    +
    +

    Language Breakdown

    + + + + + + + + + + + +
    LanguageLinesPercentageFiles
    +
    +
    + + + + + +
    + + + + + +